From 4ba064d8b3e4ed1cc7b15fdda50ca4880bf1cbcc Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Wed, 26 Jan 2022 15:57:38 +0800 Subject: [PATCH 01/47] =?UTF-8?q?=E6=8A=BD=E5=8F=96=20activiti=20=E5=88=B0?= =?UTF-8?q?module-bpm-activiti,=20=E4=B8=BA=E6=8E=A5=E5=85=A5flowable=20?= =?UTF-8?q?=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + yudao-admin-server/pom.xml | 3 +- .../config/vo/InfConfigExcelVO.java | 2 +- .../apiaccesslog/InfApiAccessLogExcelVO.java | 2 +- .../vo/apierrorlog/InfApiErrorLogExcelVO.java | 2 +- .../order/vo/order/PayOrderExcelVO.java | 2 +- .../order/vo/refund/vo/PayRefundExcelVO.java | 2 +- .../pay/convert/app/PayAppConvert.java | 2 - .../controller/auth/SysAuthController.java | 2 +- .../auth/SysUserSessionController.java | 13 +- .../controller/dept/SysDeptController.java | 8 +- .../controller/dept/SysPostController.java | 2 +- .../dept/vo/post/SysPostExcelVO.java | 2 +- .../dict/vo/data/SysDictDataExcelVO.java | 2 +- .../dict/vo/type/SysDictTypeExcelVO.java | 2 +- .../logger/SysOperateLogController.java | 7 +- .../vo/loginlog/SysLoginLogExcelVO.java | 2 +- .../vo/operatelog/SysOperateLogExcelVO.java | 2 +- .../permission/SysRoleController.java | 2 +- .../permission/vo/role/SysRoleExcelVO.java | 2 +- .../sms/vo/log/SysSmsLogExcelVO.java | 2 +- .../vo/template/SysSmsTemplateExcelVO.java | 2 +- .../controller/user/SysUserController.java | 16 +- .../user/SysUserProfileController.java | 13 +- .../user/vo/user/SysUserExcelVO.java | 2 +- .../user/vo/user/SysUserImportExcelVO.java | 2 +- .../system/convert/auth/SysAuthConvert.java | 2 +- .../system/convert/dept/SysDeptConvert.java | 2 +- .../system/convert/dept/SysPostConvert.java | 2 +- .../convert/permission/SysRoleConvert.java | 2 +- .../system/convert/user/SysUserConvert.java | 6 +- .../system/dal/mysql/dept/SysDeptMapper.java | 4 +- .../system/dal/mysql/dept/SysPostMapper.java | 2 +- .../dal/mysql/permission/SysRoleMapper.java | 2 +- .../mysql/permission/SysUserRoleMapper.java | 5 +- .../SysDataPermissionConfiguration.java | 2 +- .../service/auth/impl/SysAuthServiceImpl.java | 2 +- .../system/service/dept/SysDeptService.java | 48 +----- .../system/service/dept/SysPostService.java | 11 +- .../service/dept/impl/SysDeptServiceImpl.java | 37 +---- .../service/dept/impl/SysPostServiceImpl.java | 27 +--- .../service/dict/SysDictDataService.java | 10 -- .../dict/impl/SysDictDataServiceImpl.java | 19 --- .../permission/SysPermissionService.java | 8 - .../service/permission/SysRoleService.java | 11 +- .../impl/SysPermissionServiceImpl.java | 12 +- .../permission/impl/SysRoleServiceImpl.java | 25 +-- .../system/service/user/SysUserService.java | 44 ----- .../service/user/impl/SysUserServiceImpl.java | 62 +------ .../test/vo/ToolTestDemoExcelVO.java | 2 +- .../definition/BpmFormServiceTest.java | 152 ------------------ .../definition/BpmUserGroupServiceTest.java | 134 --------------- .../service/dept/SysDeptServiceTest.java | 2 +- .../service/dept/SysPostServiceTest.java | 2 +- .../permission/SysPermissionServiceTest.java | 6 +- .../permission/SysRoleServiceTest.java | 2 +- .../service/user/SysUserServiceImplTest.java | 54 ++++--- .../system/dal/dataobject/dept/SysDeptDO.java | 2 +- .../system/dal/dataobject/dept/SysPostDO.java | 2 +- .../dal/dataobject/permission/SysRoleDO.java | 8 +- .../dataobject/permission/SysUserRoleDO.java | 2 +- .../dal/mysql/dept/SysDeptCoreMapper.java | 9 ++ .../dal/mysql/dept/SysPostCoreMapper.java | 9 ++ .../mysql/permission/SysRoleCoreMapper.java | 9 ++ .../permission/SysUserRoleCoreMapper.java | 17 ++ .../dal/mysql/user/SysUserCoreMapper.java | 6 + .../system/enums/SysDictTypeConstants.java | 2 +- .../system/enums/SysErrorCodeConstants.java | 20 +++ .../service/dept/SysDeptCoreService.java | 59 +++++++ .../service/dept/SysPostCoreService.java | 19 +++ .../dept/impl/SysDeptCoreServiceImpl.java | 69 ++++++++ .../dept/impl/SysPostCoreServiceImpl.java | 50 ++++++ .../service/dict/SysDictDataCoreService.java | 12 ++ .../dict/impl/SysDictDataCoreServiceImpl.java | 29 +++- .../permission/SysPermissionCoreService.java | 20 +++ .../permission/SysRoleCoreService.java | 19 +++ .../impl/SysPermissionCoreServiceImpl.java | 28 ++++ .../impl/SysRoleCoreServiceImpl.java | 50 ++++++ .../service/user/SysUserCoreService.java | 50 ++++++ .../user/impl/SysUserCoreServiceImpl.java | 56 +++++++ yudao-dependencies/pom.xml | 28 ++++ yudao-module-bpm/pom.xml | 18 +++ .../yudao-module-bpm-activiti/pom.xml | 30 ++++ .../definition/BpmFormController.java | 0 .../definition/BpmModelController.java | 0 .../BpmProcessDefinitionController.http | 0 .../BpmProcessDefinitionController.java | 0 .../BpmTaskAssignRuleController.http | 0 .../BpmTaskAssignRuleController.java | 0 .../definition/BpmUserGroupController.java | 4 - .../definition/vo/form/BpmFormBaseVO.java | 0 .../vo/form/BpmFormCreateReqVO.java | 0 .../definition/vo/form/BpmFormPageReqVO.java | 0 .../definition/vo/form/BpmFormRespVO.java | 0 .../vo/form/BpmFormSimpleRespVO.java | 0 .../vo/form/BpmFormUpdateReqVO.java | 0 .../vo/group/BpmUserGroupBaseVO.java | 0 .../vo/group/BpmUserGroupCreateReqVO.java | 0 .../vo/group/BpmUserGroupPageReqVO.java | 0 .../vo/group/BpmUserGroupRespVO.java | 0 .../vo/group/BpmUserGroupSimpleRespVO.java | 0 .../vo/group/BpmUserGroupUpdateReqVO.java | 0 .../vo/model/BpmModeImportReqVO.java | 0 .../definition/vo/model/BpmModelBaseVO.java | 0 .../vo/model/BpmModelCreateReqVO.java | 0 .../vo/model/BpmModelPageItemRespVO.java | 0 .../definition/vo/model/BpmModelRespVO.java | 0 .../vo/model/BpmModelUpdateReqVO.java | 0 .../vo/model/BpmModelUpdateStateReqVO.java | 0 .../definition/vo/model/ModelPageReqVO.java | 0 .../BpmProcessDefinitionListReqVO.java | 0 .../BpmProcessDefinitionPageItemRespVO.java | 0 .../BpmProcessDefinitionPageReqVO.java | 0 .../process/BpmProcessDefinitionRespVO.java | 0 .../vo/rule/BpmTaskAssignRuleBaseVO.java | 0 .../vo/rule/BpmTaskAssignRuleCreateReqVO.java | 0 .../vo/rule/BpmTaskAssignRuleRespVO.java | 0 .../vo/rule/BpmTaskAssignRuleUpdateReqVO.java | 0 .../controller/oa/BpmOALeaveController.http | 0 .../controller/oa/BpmOALeaveController.java | 0 .../controller/oa/vo/BpmOALeaveBaseVO.java | 0 .../oa/vo/BpmOALeaveCreateReqVO.java | 0 .../controller/oa/vo/BpmOALeavePageReqVO.java | 0 .../controller/oa/vo/BpmOALeaveRespVO.java | 0 .../task/BpmActivityController.java | 0 .../task/BpmProcessInstanceController.http | 0 .../task/BpmProcessInstanceController.java | 0 .../controller/task/BpmTaskController.http | 0 .../controller/task/BpmTaskController.java | 0 .../task/vo/activity/BpmActivityRespVO.java | 0 .../BpmProcessInstanceCancelReqVO.java | 0 .../BpmProcessInstanceCreateReqVO.java | 0 .../BpmProcessInstanceMyPageReqVO.java | 0 .../BpmProcessInstancePageItemRespVO.java | 0 .../vo/instance/BpmProcessInstanceRespVO.java | 0 .../task/vo/task/BpmTaskApproveReqVO.java | 0 .../vo/task/BpmTaskDonePageItemRespVO.java | 0 .../task/vo/task/BpmTaskDonePageReqVO.java | 0 .../task/vo/task/BpmTaskRejectReqVO.java | 0 .../task/vo/task/BpmTaskRespVO.java | 0 .../vo/task/BpmTaskTodoPageItemRespVO.java | 0 .../task/vo/task/BpmTaskTodoPageReqVO.java | 0 .../vo/task/BpmTaskUpdateAssigneeReqVO.java | 0 .../convert/definition/BpmFormConvert.java | 0 .../convert/definition/BpmModelConvert.java | 0 .../BpmProcessDefinitionConvert.java | 0 .../definition/BpmTaskAssignRuleConvert.java | 0 .../definition/BpmUserGroupConvert.java | 0 .../convert/message/BpmMessageConvert.java | 0 .../bpm/convert/oa/BpmOALeaveConvert.java | 0 .../modules/bpm/convert/package-info.java | 0 .../bpm/convert/task/BpmActivityConvert.java | 0 .../task/BpmProcessInstanceConvert.java | 5 +- .../bpm/convert/task/BpmTaskConvert.java | 2 +- ...g Boot 对象转换 MapStruct 入门》.md | 0 .../dal/dataobject/definition/BpmFormDO.java | 0 .../definition/BpmProcessDefinitionExtDO.java | 0 .../definition/BpmTaskAssignRuleDO.java | 0 .../definition/BpmTaskMessageRuleDO.java | 0 .../dataobject/definition/BpmUserGroupDO.java | 0 .../dal/dataobject/leave/BpmOALeaveDO.java | 0 .../task/BpmProcessInstanceExtDO.java | 0 .../bpm/dal/dataobject/task/BpmTaskExtDO.java | 0 .../dal/mysql/definition/BpmFormMapper.java | 0 .../BpmProcessDefinitionExtMapper.java | 0 .../definition/BpmTaskAssignRuleMapper.java | 0 .../mysql/definition/BpmUserGroupMapper.java | 0 .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 0 .../task/BpmProcessInstanceExtMapper.java | 0 .../bpm/dal/mysql/task/BpmTaskExtMapper.java | 0 .../bpm/enums/BpmErrorCodeConstants.java | 0 .../definition/BpmModelFormTypeEnum.java | 0 .../definition/BpmTaskAssignRuleTypeEnum.java | 0 .../definition/BpmTaskRuleScriptEnum.java | 0 .../bpm/enums/message/BpmMessageEnum.java | 0 .../BpmProcessInstanceDeleteReasonEnum.java | 0 .../task/BpmProcessInstanceResultEnum.java | 0 .../task/BpmProcessInstanceStatusEnum.java | 0 .../config/BpmActivitiConfiguration.java | 18 +-- .../behavior/BpmActivityBehaviorFactory.java | 19 ++- .../behavior/BpmUserTaskActivitiBehavior.java | 24 +-- .../activiti/core/behavior/package-info.java | 0 .../behavior/script/BpmTaskAssignScript.java | 0 .../BpmTaskAssignLeaderAbstractScript.java | 17 +- .../impl/BpmTaskAssignLeaderX1Script.java | 0 .../impl/BpmTaskAssignLeaderX2Script.java | 0 .../impl/BpmTaskAssignStartUserScript.java | 0 .../event/BpmProcessInstanceResultEvent.java | 0 ...BpmProcessInstanceResultEventListener.java | 0 ...pmProcessInstanceResultEventPublisher.java | 0 .../activiti/core/event/package-info.java | 0 .../core/identity/EmptyUserGroupManager.java | 0 .../BpmProcessInstanceEventListener.java | 0 .../BpmTackActivitiEventListener.java | 0 .../core/listener/BpmTaskEventListener.java | 0 .../activiti/core/listener/package-info.java | 0 .../modules/bpm/framework/package-info.java | 0 .../adminserver/modules/bpm/package-info.java | 0 .../service/definition/BpmFormService.java | 0 .../service/definition/BpmModelService.java | 0 .../BpmProcessDefinitionService.java | 0 .../definition/BpmTaskAssignRuleService.java | 0 .../definition/BpmUserGroupService.java | 0 .../definition/dto/BpmFormFieldRespDTO.java | 0 .../dto/BpmModelMetaInfoRespDTO.java | 0 .../dto/BpmProcessDefinitionCreateReqDTO.java | 0 .../definition/impl/BpmFormServiceImpl.java | 0 .../definition/impl/BpmModelServiceImpl.java | 0 .../impl/BpmProcessDefinitionServiceImpl.java | 0 .../impl/BpmTaskAssignRuleServiceImpl.java | 32 ++-- .../impl/BpmUserGroupServiceImpl.java | 3 - .../service/message/BpmMessageService.java | 0 ...eSendWhenProcessInstanceApproveReqDTO.java | 0 ...geSendWhenProcessInstanceRejectReqDTO.java | 0 .../BpmMessageSendWhenTaskCreatedReqDTO.java | 0 .../message/impl/BpmMessageServiceImpl.java | 0 .../bpm/service/oa/BpmOALeaveService.java | 0 .../oa/impl/BpmOALeaveServiceImpl.java | 0 .../oa/listener/BpmOALeaveResultListener.java | 0 .../bpm/service/task/BpmActivityService.java | 0 .../task/BpmProcessInstanceService.java | 0 .../bpm/service/task/BpmTaskService.java | 0 .../dto/BpmProcessInstanceCreateReqDTO.java | 0 .../task/impl/BpmActivityServiceImpl.java | 0 .../impl/BpmProcessInstanceServiceImpl.java | 16 +- .../service/task/impl/BpmTaskServiceImpl.java | 21 +-- .../bpm/service/task/package-info.java | 0 .../BpmUserTaskActivitiBehaviorTest.java | 37 ++--- .../impl/BpmTaskAssignLeaderX2ScriptTest.java | 27 ++-- .../modules/bpm/service/package-info.java | 0 .../yudao-module-bpm-core-service/pom.xml | 15 ++ .../yudao-module-bpm-flowable/pom.xml | 23 +++ 232 files changed, 873 insertions(+), 811 deletions(-) delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver => yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice}/modules/system/dal/dataobject/dept/SysDeptDO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver => yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice}/modules/system/dal/dataobject/dept/SysPostDO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver => yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice}/modules/system/dal/dataobject/permission/SysRoleDO.java (83%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver => yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice}/modules/system/dal/dataobject/permission/SysUserRoleDO.java (90%) create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysDeptCoreMapper.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysPostCoreMapper.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysRoleCoreMapper.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysUserRoleCoreMapper.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver => yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice}/modules/system/enums/SysDictTypeConstants.java (96%) create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysDeptCoreService.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysPostCoreService.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysDeptCoreServiceImpl.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysPostCoreServiceImpl.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysPermissionCoreService.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysRoleCoreService.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysPermissionCoreServiceImpl.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysRoleCoreServiceImpl.java create mode 100644 yudao-module-bpm/pom.xml create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/pom.xml rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java (94%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java (96%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java (98%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java (86%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java (74%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java (90%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java (79%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java (89%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java (93%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java (95%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java (94%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java (100%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java (86%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java (78%) rename {yudao-admin-server => yudao-module-bpm/yudao-module-bpm-activiti}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java (100%) create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/pom.xml create mode 100644 yudao-module-bpm/yudao-module-bpm-flowable/pom.xml diff --git a/pom.xml b/pom.xml index 0f791a822f..4b7c953e40 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,7 @@ yudao-admin-server yudao-user-server yudao-core-service + yudao-module-bpm ${artifactId} diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 847e626a03..3553b38b2e 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -44,9 +44,10 @@ yudao-spring-boot-starter-biz-data-permission + cn.iocoder.boot - yudao-spring-boot-starter-activiti + yudao-module-bpm-activiti diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java index 2a5c044988..28c10b2dce 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java index d0265351f9..d48dc44b0c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiacces import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java index 3224a3017e..c33e73dced 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierror import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java index 48d69c4903..28e5e7c613 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import com.alibaba.excel.annotation.ExcelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java index be90f1a612..b0b2c18e17 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import com.alibaba.excel.annotation.ExcelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/app/PayAppConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/app/PayAppConvert.java index 15da37cbf0..c7e17467d8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/app/PayAppConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/app/PayAppConvert.java @@ -2,8 +2,6 @@ package cn.iocoder.yudao.adminserver.modules.pay.convert.app; import java.util.*; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java index aef8cc40ac..fc104fdbc0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.auth; import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.*; import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert; import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService; import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java index 25279ef802..116d38531c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java @@ -3,13 +3,15 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.auth; import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysUserSessionConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; @@ -38,9 +40,10 @@ public class SysUserSessionController { @Resource private SysUserSessionCoreService userSessionCoreService; @Resource - private SysUserService userService; + private SysUserCoreService userCoreService; + @Resource - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @GetMapping("/page") @ApiOperation("获得 Session 分页列表") @@ -50,9 +53,9 @@ public class SysUserSessionController { PageResult pageResult = userSessionService.getUserSessionPage(reqVO); // 获得拼接需要的数据 - Map userMap = userService.getUserMap( + Map userMap = userCoreService.getUserMap( convertList(pageResult.getList(), SysUserSessionDO::getUserId)); - Map deptMap = deptService.getDeptMap( + Map deptMap = deptCoreService.getDeptMap( convertList(userMap.values(), SysUserDO::getDeptId)); // 拼接结果返回 List sessionList = new ArrayList<>(pageResult.getList().size()); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java index 1bae57f324..2c384623ec 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java @@ -1,10 +1,11 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.dept; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.*; import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysDeptConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -29,6 +30,9 @@ public class SysDeptController { @Resource private SysDeptService deptService; + @Resource + private SysDeptCoreService deptCoreService; + @PostMapping("create") @ApiOperation("创建部门") @PreAuthorize("@ss.hasPermission('system:dept:create')") @@ -80,7 +84,7 @@ public class SysDeptController { @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:dept:query')") public CommonResult getDept(@RequestParam("id") Long id) { - return success(SysDeptConvert.INSTANCE.convert(deptService.getDept(id))); + return success(SysDeptConvert.INSTANCE.convert(deptCoreService.getDept(id))); } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java index c27dc1c95e..fec11cb018 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.*; import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysPostConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java index acc23c3f8c..3286bd63a0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java index 23174a087f..589735a24c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java index fbb4da3670..1fac9c0617 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java index e44a4dd4d7..968ab49542 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOper import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService; import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -44,7 +45,7 @@ public class SysOperateLogController { @Resource private SysOperateLogService operateLogService; @Resource - private SysUserService userService; + private SysUserCoreService userCoreService; @GetMapping("/page") @ApiOperation("查看操作日志分页列表") @@ -54,7 +55,7 @@ public class SysOperateLogController { // 获得拼接需要的数据 Collection userIds = CollectionUtils.convertList(pageResult.getList(), SysOperateLogDO::getUserId); - Map userMap = userService.getUserMap(userIds); + Map userMap = userCoreService.getUserMap(userIds); // 拼接数据 List list = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(operateLog -> { @@ -75,7 +76,7 @@ public class SysOperateLogController { // 获得拼接需要的数据 Collection userIds = CollectionUtils.convertList(list, SysOperateLogDO::getUserId); - Map userMap = userService.getUserMap(userIds); + Map userMap = userCoreService.getUserMap(userIds); // 拼接数据 List excelDataList = SysOperateLogConvert.INSTANCE.convertList(list, userMap); // 输出 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java index 852e9146a7..8c2693beb1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlo import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java index 71959d8838..5233ef90c9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operate import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java index 15d7fa3f83..2dc6f347b3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.*; import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysRoleConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java index c8c130537e..01b758347b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.rol import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java index 8376939805..69cb3963f0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.framework.excel.core.convert.JsonConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java index a3215414c9..d227caba3b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java index ae7628e49e..ad0f328976 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java @@ -1,21 +1,17 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.user; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptSimpleRespVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysDeptConvert; import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; @@ -50,7 +46,7 @@ public class SysUserController { @Resource private SysUserCoreService userCoreService; @Resource - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @PostMapping("/create") @ApiOperation("新增用户") @@ -105,7 +101,7 @@ public class SysUserController { // 获得拼接需要的数据 Collection deptIds = convertList(pageResult.getList(), SysUserDO::getDeptId); - Map deptMap = deptService.getDeptMap(deptIds); + Map deptMap = deptCoreService.getDeptMap(deptIds); // 拼接结果返回 List userList = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(user -> { @@ -144,8 +140,8 @@ public class SysUserController { // 获得拼接需要的数据 Collection deptIds = convertList(users, SysUserDO::getDeptId); - Map deptMap = deptService.getDeptMap(deptIds); - Map deptLeaderUserMap = userService.getUserMap(convertSet(deptMap.values(), SysDeptDO::getLeaderUserId)); + Map deptMap = deptCoreService.getDeptMap(deptIds); + Map deptLeaderUserMap = userCoreService.getUserMap(convertSet(deptMap.values(), SysDeptDO::getLeaderUserId)); // 拼接数据 List excelUsers = new ArrayList<>(users.size()); users.forEach(user -> { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java index 4b47d3c55a..2dea78cd8a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java @@ -5,16 +5,16 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.Sy import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; @@ -48,7 +48,8 @@ public class SysUserProfileController { @Resource private SysUserCoreService userCoreService; @Resource - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; + @Resource private SysPostService postService; @Resource @@ -69,7 +70,7 @@ public class SysUserProfileController { resp.setRoles(SysUserConvert.INSTANCE.convertList(userRoles)); // 获得部门信息 if (user.getDeptId() != null) { - SysDeptDO dept = deptService.getDept(user.getDeptId()); + SysDeptDO dept = deptCoreService.getDept(user.getDeptId()); resp.setDept(SysUserConvert.INSTANCE.convert02(dept)); } // 获得岗位信息 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java index 02712ba868..a4c978c025 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java index b641f6412e..f33acdd2f3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java index dfe3ac3eab..cb92db12c9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.system.convert.auth; import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java index 364b034afe..693baffe6d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDe import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptRespVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptSimpleRespVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java index 934a31dba1..d466a0af97 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.system.convert.dept; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.*; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java index 59e4d59b40..b1cd0dc007 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.system.convert.permission; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.*; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java index 7567bba080..ff2938d36b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java @@ -4,9 +4,9 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.Sy import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import org.mapstruct.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java index 831e25ef93..84ab4c85de 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java @@ -3,11 +3,9 @@ package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept; import cn.iocoder.yudao.adminserver.modules.tool.enums.SqlConstants; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.Date; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java index 457b4a990d..85d9915b23 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java index 7d3ab59dec..670d5047c5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import org.springframework.lang.Nullable; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java index 9a2c990c67..4704bb5710 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -20,9 +20,6 @@ public interface SysUserRoleMapper extends BaseMapperX { return selectList(new QueryWrapper().eq("role_id", roleId)); } - default List selectListByRoleIds(Collection roleIds) { - return selectList("role_id", roleIds); - } default void insertList(Long userId, Collection roleIds) { List list = roleIds.stream().map(roleId -> { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/config/SysDataPermissionConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/config/SysDataPermissionConfiguration.java index 20f2e16028..984d854403 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/config/SysDataPermissionConfiguration.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/config/SysDataPermissionConfiguration.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.system.framework.datapermission.config; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.datapermission.core.dept.rule.DeptDataPermissionRuleCustomizer; import org.springframework.context.annotation.Bean; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java index 438bd1e75a..5b67c99d62 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAu import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO; import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java index bf3ce317f3..a7f9208e16 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import java.util.Collection; @@ -46,27 +46,6 @@ public interface SysDeptService { */ void deleteDept(Long id); - /** - * 获得指定编号的部门列表 - * - * @param ids 部门编号数组 - * @return 部门列表 - */ - List getSimpleDepts(Collection ids); - - /** - * 获得指定编号的部门 Map - * - * @param ids 部门编号数组 - * @return 部门 Map - */ - default Map getDeptMap(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyMap(); - } - List list = getSimpleDepts(ids); - return CollectionUtils.convertMap(list, SysDeptDO::getId); - } /** * 筛选部门列表 @@ -76,22 +55,6 @@ public interface SysDeptService { */ List getSimpleDepts(SysDeptListReqVO reqVO); - /** - * 获得部门信息 - * - * @param id 部门编号 - * @return 部门信息 - */ - SysDeptDO getDept(Long id); - - /** - * 获得部门信息数组 - * - * @param ids 部门编号数组 - * @return 部门信息数组 - */ - List getDepts(Collection ids); - /** * 获得所有子部门,从缓存中 * @@ -101,13 +64,4 @@ public interface SysDeptService { */ List getDeptsByParentIdFromCache(Long parentId, boolean recursive); - /** - * 校验部门们是否有效。如下情况,视为无效: - * 1. 部门编号不存在 - * 2. 部门被禁用 - * - * @param ids 角色编号数组 - */ - void validDepts(Collection ids); - } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java index 608e360b2f..4a1e7a7fd6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPo import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import org.springframework.lang.Nullable; import java.util.Collection; @@ -86,13 +86,4 @@ public interface SysPostService { */ SysPostDO getPost(Long id); - /** - * 校验岗位们是否有效。如下情况,视为无效: - * 1. 岗位编号不存在 - * 2. 岗位被禁用 - * - * @param ids 岗位编号数组 - */ - void validPosts(Collection ids); - } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java index 60b33431bd..8770fbb2a4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java @@ -10,7 +10,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDe import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysDeptConvert; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysDeptMapper; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.adminserver.modules.system.enums.dept.DeptIdEnum; import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept.SysDeptProducer; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; @@ -159,11 +159,6 @@ public class SysDeptServiceImpl implements SysDeptService { deptProducer.sendDeptRefreshMessage(); } - @Override - public List getSimpleDepts(Collection ids) { - return deptMapper.selectBatchIds(ids); - } - @Override public List getSimpleDepts(SysDeptListReqVO reqVO) { return deptMapper.selectList(reqVO); @@ -182,26 +177,6 @@ public class SysDeptServiceImpl implements SysDeptService { return result; } - @Override - public void validDepts(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得科室信息 - List depts = deptMapper.selectBatchIds(ids); - Map deptMap = CollectionUtils.convertMap(depts, SysDeptDO::getId); - // 校验 - ids.forEach(id -> { - SysDeptDO dept = deptMap.get(id); - if (dept == null) { - throw exception(DEPT_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { - throw exception(DEPT_NOT_ENABLE, dept.getName()); - } - }); - } - /** * 递归获取所有的子部门,添加到 result 结果 * @@ -227,16 +202,6 @@ public class SysDeptServiceImpl implements SysDeptService { recursiveCount - 1, parentDeptMap)); } - @Override - public SysDeptDO getDept(Long id) { - return deptMapper.selectById(id); - } - - @Override - public List getDepts(Collection ids) { - return deptMapper.selectBatchIds(ids); - } - private void checkCreateOrUpdate(Long id, Long parentId, String name) { // 校验自己存在 checkDeptExists(id); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java index 220724e332..8531fb16ed 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java @@ -1,8 +1,5 @@ package cn.iocoder.yudao.adminserver.modules.system.service.dept.impl; -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostCreateReqVO; @@ -11,16 +8,14 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPo import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysPostConvert; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Collection; import java.util.List; -import java.util.Map; import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -84,26 +79,6 @@ public class SysPostServiceImpl implements SysPostService { return postMapper.selectById(id); } - @Override - public void validPosts(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得岗位信息 - List posts = postMapper.selectBatchIds(ids); - Map postMap = CollectionUtils.convertMap(posts, SysPostDO::getId); - // 校验 - ids.forEach(id -> { - SysPostDO post = postMap.get(id); - if (post == null) { - throw exception(POST_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { - throw exception(POST_NOT_ENABLE, post.getName()); - } - }); - } - private void checkCreateOrUpdate(Long id, String name, String code) { // 校验自己存在 checkPostExists(id); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java index 7fd19f4e93..974b02f688 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java @@ -79,14 +79,4 @@ public interface SysDictDataService { */ int countByDictType(String dictType); - /** - * 校验字典数据们是否有效。如下情况,视为无效: - * 1. 字典数据不存在 - * 2. 字典数据被禁用 - * - * @param dictType 字典类型 - * @param values 字典数据值的数组 - */ - void validDictDatas(String dictType, Collection values); - } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java index 60fb103328..9130ebe101 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java @@ -134,25 +134,6 @@ public class SysDictDataServiceImpl implements SysDictDataService { return dictDataMapper.selectCountByDictType(dictType); } - @Override - public void validDictDatas(String dictType, Collection values) { - if (CollUtil.isEmpty(values)) { - return; - } - // 获得字典数据信息 - List dictDatas = dictDataMapper.selectByDictTypeAndValues(dictType, values); - Map dictDataMap = CollectionUtils.convertMap(dictDatas, SysDictDataDO::getValue); - // 校验 - values.forEach(value -> { - SysDictDataDO dictData = dictDataMap.get(value); - if (dictData == null) { - throw exception(DICT_DATA_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(dictData.getStatus())) { - throw exception(DICT_DATA_NOT_ENABLE, dictData.getLabel()); - } - }); - } private void checkCreateOrUpdate(Long id, String value, String dictType) { // 校验自己存在 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java index 78eeb9ad05..627e61b8a9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java @@ -77,14 +77,6 @@ public interface SysPermissionService extends SecurityPermissionFrameworkService */ Set getUserRoleIdListByRoleId(Long roleId); - /** - * 获得拥有多个角色的用户编号集合 - * - * @param roleIds 角色编号集合 - * @return 用户编号集合 - */ - Set getUserRoleIdListByRoleIds(Collection roleIds); - /** * 设置用户角色 * diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java index 4272bab787..74125662d5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import org.springframework.lang.Nullable; import java.util.Collection; @@ -129,13 +129,6 @@ public interface SysRoleService { */ List getRoleList(SysRoleExportReqVO reqVO); - /** - * 校验角色们是否有效。如下情况,视为无效: - * 1. 角色编号不存在 - * 2. 角色被禁用 - * - * @param ids 角色编号数组 - */ - void validRoles(Collection ids); + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java index 32f61c1d88..7e90b568f6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java @@ -3,11 +3,11 @@ package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; @@ -227,11 +227,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { SysUserRoleDO::getRoleId); } - @Override - public Set getUserRoleIdListByRoleIds(Collection roleIds) { - return CollectionUtils.convertSet(userRoleMapper.selectListByRoleIds(roleIds), - SysUserRoleDO::getRoleId); - } + @Override public void assignUserRole(Long userId, Set roleIds) { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java index 0c271c3a2d..8b29e19dff 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java @@ -3,9 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; @@ -13,7 +11,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysRoleConvert; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMapper; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.adminserver.modules.system.enums.permission.RoleCodeEnum; import cn.iocoder.yudao.adminserver.modules.system.enums.permission.SysRoleTypeEnum; import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysRoleProducer; @@ -34,7 +32,6 @@ import org.springframework.util.StringUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; -import java.util.function.Consumer; import java.util.stream.Collectors; import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; @@ -241,26 +238,6 @@ public class SysRoleServiceImpl implements SysRoleService { return roleMapper.listRoles(reqVO); } - @Override - public void validRoles(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得角色信息 - List roles = roleMapper.selectBatchIds(ids); - Map roleMap = CollectionUtils.convertMap(roles, SysRoleDO::getId); - // 校验 - ids.forEach(id -> { - SysRoleDO role = roleMap.get(id); - if (role == null) { - throw exception(ROLE_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())) { - throw exception(ROLE_IS_DISABLE, role.getName()); - } - }); - } - /** * 校验角色的唯一字段是否重复 * diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java index fe35cfe6ba..da4695e35a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java @@ -120,26 +120,7 @@ public interface SysUserService { */ List getUsers(SysUserExportReqVO reqVO); - /** - * 获得用户列表 - * - * @param ids 用户编号数组 - * @return 用户列表 - */ - List getUsers(Collection ids); - /** - * 获得用户 Map - * - * @param ids 用户编号数组 - * @return 用户 Map - */ - default Map getUserMap(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return new HashMap<>(); - } - return CollectionUtils.convertMap(getUsers(ids), SysUserDO::getId); - } /** * 获得用户列表,基于昵称模糊匹配 @@ -174,29 +155,4 @@ public interface SysUserService { */ List getUsersByStatus(Integer status); - /** - * 获得指定岗位的用户数组 - * - * @param postIds 岗位数组 - * @return 用户数组 - */ - List getUsersByPostIds(Collection postIds); - - /** - * 获得指定部门的用户数组 - * - * @param deptIds 部门数组 - * @return 用户数组 - */ - List getUsersByDeptIds(Collection deptIds); - - /** - * 校验用户们是否有效。如下情况,视为无效: - * 1. 用户编号不存在 - * 2. 用户被禁用 - * - * @param ids 用户编号数组 - */ - void validUsers(Set ids); - } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java index d5b2ad18ba..119b78e1ef 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java @@ -8,8 +8,8 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.Sy import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; @@ -17,6 +17,7 @@ import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermiss import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -52,6 +53,9 @@ public class SysUserServiceImpl implements SysUserService { @Resource private SysDeptService deptService; + + @Resource + private SysDeptCoreService deptCoreService; @Resource private SysPostService postService; @Resource @@ -174,18 +178,6 @@ public class SysUserServiceImpl implements SysUserService { return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); } - @Override - public List getUsers(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return userMapper.selectBatchIds(ids); - } - - @Override - public Map getUserMap(Collection ids) { - return SysUserService.super.getUserMap(ids); - } @Override public List getUsersByNickname(String nickname) { @@ -299,7 +291,7 @@ public class SysUserServiceImpl implements SysUserService { if (deptId == null) { // 允许不选择 return; } - SysDeptDO dept = deptService.getDept(deptId); + SysDeptDO dept = deptCoreService.getDept(deptId); if (dept == null) { throw exception(DEPT_NOT_FOUND); } @@ -389,44 +381,4 @@ public class SysUserServiceImpl implements SysUserService { return userMapper.selectListByStatus(status); } - @Override - public List getUsersByPostIds(Collection postIds) { - if (CollUtil.isEmpty(postIds)) { - return Collections.emptyList(); - } - // 过滤不符合条件的 - // TODO 芋艿:暂时只能内存过滤。解决方案:1、新建一个关联表;2、基于 where + 函数;3、json 字段,适合 mysql 8+ 版本 - List users = userMapper.selectList(); - users.removeIf(user -> !CollUtil.containsAny(user.getPostIds(), postIds)); - return users; - } - - @Override - public List getUsersByDeptIds(Collection deptIds) { - if (CollUtil.isEmpty(deptIds)) { - return Collections.emptyList(); - } - return userMapper.selectListByDeptIds(deptIds); - } - - @Override - public void validUsers(Set ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得岗位信息 - List users = userMapper.selectBatchIds(ids); - Map userMap = CollectionUtils.convertMap(users, SysUserDO::getId); - // 校验 - ids.forEach(id -> { - SysUserDO user = userMap.get(id); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus())) { - throw exception(USER_IS_DISABLE, user.getNickname()); - } - }); - } - } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java index bfb9170200..87e827440c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java deleted file mode 100644 index c04d41d444..0000000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; - -import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmFormFieldRespDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmFormServiceImpl; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link BpmFormServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(BpmFormServiceImpl.class) -public class BpmFormServiceTest extends BaseDbUnitTest { - - @Resource - private BpmFormServiceImpl formService; - - @Resource - private BpmFormMapper formMapper; - - @Test - public void testCreateForm_success() { - // 准备参数 - BpmFormCreateReqVO reqVO = randomPojo(BpmFormCreateReqVO.class, o -> { - o.setConf("{}"); - o.setFields(randomFields()); - }); - - // 调用 - Long formId = formService.createForm(reqVO); - // 断言 - assertNotNull(formId); - // 校验记录的属性是否正确 - BpmFormDO form = formMapper.selectById(formId); - assertPojoEquals(reqVO, form); - } - - @Test - public void testUpdateForm_success() { - // mock 数据 - BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> { - o.setConf("{}"); - o.setFields(randomFields()); - }); - formMapper.insert(dbForm);// @Sql: 先插入出一条存在的数据 - // 准备参数 - BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> { - o.setId(dbForm.getId()); // 设置更新的 ID - o.setConf("{'yudao': 'yuanma'}"); - o.setFields(randomFields()); - }); - - // 调用 - formService.updateForm(reqVO); - // 校验是否更新正确 - BpmFormDO form = formMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, form); - } - - @Test - public void testUpdateForm_notExists() { - // 准备参数 - BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> { - o.setConf("{'yudao': 'yuanma'}"); - o.setFields(randomFields()); - }); - - // 调用, 并断言异常 - assertServiceException(() -> formService.updateForm(reqVO), FORM_NOT_EXISTS); - } - - @Test - public void testDeleteForm_success() { - // mock 数据 - BpmFormDO dbForm = randomPojo(BpmFormDO.class); - formMapper.insert(dbForm);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbForm.getId(); - - // 调用 - formService.deleteForm(id); - // 校验数据不存在了 - assertNull(formMapper.selectById(id)); - } - - @Test - public void testDeleteForm_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> formService.deleteForm(id), FORM_NOT_EXISTS); - } - - @Test - public void testGetFormPage() { - // mock 数据 - BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> { // 等会查询到 - o.setName("芋道源码"); - }); - formMapper.insert(dbForm); - // 测试 name 不匹配 - formMapper.insert(cloneIgnoreId(dbForm, o -> o.setName("源码"))); - // 准备参数 - BpmFormPageReqVO reqVO = new BpmFormPageReqVO(); - reqVO.setName("芋道"); - - // 调用 - PageResult pageResult = formService.getFormPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbForm, pageResult.getList().get(0)); - } - - private List randomFields() { - int size = RandomUtil.randomInt(1, 3); - return Stream.iterate(0, i -> i).limit(size) - .map(i -> JsonUtils.toJsonString(randomPojo(BpmFormFieldRespDTO.class))) - .collect(Collectors.toList()); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java deleted file mode 100644 index a8704dd611..0000000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; - -import cn.hutool.core.date.DateUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmUserGroupServiceImpl; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.date.DateUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.*; - -/** -* {@link BpmUserGroupServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(BpmUserGroupServiceImpl.class) -public class BpmUserGroupServiceTest extends BaseDbUnitTest { - - @Resource - private BpmUserGroupServiceImpl userGroupService; - - @Resource - private BpmUserGroupMapper userGroupMapper; - - @Test - public void testCreateUserGroup_success() { - // 准备参数 - BpmUserGroupCreateReqVO reqVO = randomPojo(BpmUserGroupCreateReqVO.class); - - // 调用 - Long userGroupId = userGroupService.createUserGroup(reqVO); - // 断言 - assertNotNull(userGroupId); - // 校验记录的属性是否正确 - BpmUserGroupDO userGroup = userGroupMapper.selectById(userGroupId); - assertPojoEquals(reqVO, userGroup); - } - - @Test - public void testUpdateUserGroup_success() { - // mock 数据 - BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class); - userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据 - // 准备参数 - BpmUserGroupUpdateReqVO reqVO = randomPojo(BpmUserGroupUpdateReqVO.class, o -> { - o.setId(dbUserGroup.getId()); // 设置更新的 ID - }); - - // 调用 - userGroupService.updateUserGroup(reqVO); - // 校验是否更新正确 - BpmUserGroupDO userGroup = userGroupMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, userGroup); - } - - @Test - public void testUpdateUserGroup_notExists() { - // 准备参数 - BpmUserGroupUpdateReqVO reqVO = randomPojo(BpmUserGroupUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> userGroupService.updateUserGroup(reqVO), USER_GROUP_NOT_EXISTS); - } - - @Test - public void testDeleteUserGroup_success() { - // mock 数据 - BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class); - userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbUserGroup.getId(); - - // 调用 - userGroupService.deleteUserGroup(id); - // 校验数据不存在了 - assertNull(userGroupMapper.selectById(id)); - } - - @Test - public void testDeleteUserGroup_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> userGroupService.deleteUserGroup(id), USER_GROUP_NOT_EXISTS); - } - - @Test - public void testGetUserGroupPage() { - // mock 数据 - BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class, o -> { // 等会查询到 - o.setName("芋道源码"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCreateTime(DateUtils.buildTime(2021, 11, 11)); - }); - userGroupMapper.insert(dbUserGroup); - // 测试 name 不匹配 - userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setName("芋道"))); - // 测试 status 不匹配 - userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime 不匹配 - userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setCreateTime(DateUtils.buildTime(2021, 12, 12)))); - // 准备参数 - BpmUserGroupPageReqVO reqVO = new BpmUserGroupPageReqVO(); - reqVO.setName("源码"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setBeginCreateTime(DateUtils.buildTime(2021, 11, 10)); - reqVO.setEndCreateTime(DateUtils.buildTime(2021, 11, 12)); - - // 调用 - PageResult pageResult = userGroupService.getUserGroupPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbUserGroup, pageResult.getList().get(0)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java index 1e276e3eac..78f8cb707e 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysDeptMapper; import cn.iocoder.yudao.adminserver.modules.system.enums.dept.DeptIdEnum; import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept.SysDeptProducer; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java index c2a811f0b3..e3efb412fe 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPo import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper; import cn.iocoder.yudao.adminserver.modules.system.service.dept.impl.SysPostServiceImpl; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java index 3dd74408d5..6de00282f5 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java @@ -2,10 +2,10 @@ package cn.iocoder.yudao.adminserver.modules.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java index 08bd6521b1..87261a45e9 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMapper; import cn.iocoder.yudao.adminserver.modules.system.enums.permission.SysRoleTypeEnum; import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysRoleProducer; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java index d1d01c9542..dc90a436ad 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java @@ -6,8 +6,8 @@ import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; @@ -16,11 +16,11 @@ import cn.iocoder.yudao.adminserver.modules.system.service.user.impl.SysUserServ import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.collection.SetUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; @@ -42,7 +42,6 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static java.util.Collections.singleton; -import static java.util.Collections.singletonList; import static org.assertj.core.util.Lists.newArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; @@ -65,6 +64,9 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { @MockBean private SysDeptService deptService; + + @MockBean + private SysDeptCoreService deptCoreService; @MockBean private SysPostService postService; @MockBean @@ -86,7 +88,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { o.setId(reqVO.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); // mock postService 的方法 List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> randomPojo(SysPostDO.class, o -> { @@ -122,7 +124,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { o.setId(reqVO.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); // mock postService 的方法 List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> randomPojo(SysPostDO.class, o -> { @@ -357,7 +359,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); // mock passwordEncoder 的方法 when(passwordEncoder.encode(eq("yudaoyuanma"))).thenReturn("java"); @@ -391,7 +393,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); // 调用 SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), false); @@ -421,7 +423,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); // 调用 SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); @@ -528,7 +530,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { o.setId(deptId); o.setStatus(CommonStatusEnum.DISABLE.getStatus()); }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); // 调用,校验异常 assertServiceException(() -> userService.checkDeptEnable(deptId), @@ -580,22 +582,22 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { verify(passwordEncoder, times(1)).matches(eq(oldPassword), eq(user.getPassword())); } - @Test - public void testUsersByPostIds() { - // 准备参数 - Collection postIds = asSet(10L, 20L); - // mock 方法 - SysUserDO user1 = randomSysUserDO(o -> o.setPostIds(asSet(10L, 30L))); - userMapper.insert(user1); - SysUserDO user2 = randomSysUserDO(o -> o.setPostIds(singleton(100L))); - userMapper.insert(user2); - - // 调用 - List result = userService.getUsersByPostIds(postIds); - // 断言 - assertEquals(1, result.size()); - assertEquals(user1, result.get(0)); - } +// @Test //TODO jason 已经移到userCoreService.getUsersByPostIds +// public void testUsersByPostIds() { +// // 准备参数 +// Collection postIds = asSet(10L, 20L); +// // mock 方法 +// SysUserDO user1 = randomSysUserDO(o -> o.setPostIds(asSet(10L, 30L))); +// userMapper.insert(user1); +// SysUserDO user2 = randomSysUserDO(o -> o.setPostIds(singleton(100L))); +// userMapper.insert(user2); +// +// // 调用 +// List result = userService.getUsersByPostIds(postIds); +// // 断言 +// assertEquals(1, result.size()); +// assertEquals(user1, result.get(0)); +// } // ========== 随机对象 ========== diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysDeptDO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysDeptDO.java index ad0be694ab..ced8296dac 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysDeptDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept; +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysPostDO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysPostDO.java index 29652a0d81..6e47b1da42 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysPostDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept; +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleDO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysRoleDO.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleDO.java rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysRoleDO.java index 72ebedbfd1..c27f588abe 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleDO.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysRoleDO.java @@ -1,11 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission; +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.RoleCodeEnum; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.SysRoleTypeEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -36,7 +34,7 @@ public class SysRoleDO extends BaseDO { /** * 角色标识 * - * 枚举 {@link RoleCodeEnum} + * 枚举 */ private String code; /** @@ -52,7 +50,7 @@ public class SysRoleDO extends BaseDO { /** * 角色类型 * - * 枚举 {@link SysRoleTypeEnum} + * 枚举 */ private Integer type; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysUserRoleDO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysUserRoleDO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysUserRoleDO.java rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysUserRoleDO.java index 6792f56087..ac18d8c9c2 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysUserRoleDO.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysUserRoleDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission; +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysDeptCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysDeptCoreMapper.java new file mode 100644 index 0000000000..ab98c65128 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysDeptCoreMapper.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dept; + +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SysDeptCoreMapper extends BaseMapperX { +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysPostCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysPostCoreMapper.java new file mode 100644 index 0000000000..94a4747e92 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysPostCoreMapper.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dept; + +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SysPostCoreMapper extends BaseMapperX { +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysRoleCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysRoleCoreMapper.java new file mode 100644 index 0000000000..69196d8f74 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysRoleCoreMapper.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.permission; + +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SysRoleCoreMapper extends BaseMapperX { +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysUserRoleCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysUserRoleCoreMapper.java new file mode 100644 index 0000000000..1327efde96 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysUserRoleCoreMapper.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.permission; + +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface SysUserRoleCoreMapper extends BaseMapperX { + + default List selectListByRoleIds(Collection roleIds) { + return selectList(SysUserRoleDO::getRoleId, roleIds); + } + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java index a59275b39e..e4afd992a8 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java @@ -5,7 +5,13 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; +import java.util.List; + @Mapper public interface SysUserCoreMapper extends BaseMapperX { + default List selectListByDeptIds(Collection deptIds) { + return selectList(SysUserDO::getDeptId, deptIds); + } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysDictTypeConstants.java similarity index 96% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysDictTypeConstants.java index cc7ae83f8a..766e0fe5c7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysDictTypeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums; +package cn.iocoder.yudao.coreservice.modules.system.enums; /** * System 字典类型的枚举类 diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java index 173287e522..e2dbf3417f 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java @@ -22,4 +22,24 @@ public interface SysErrorCodeConstants { ErrorCode SOCIAL_AUTH_FAILURE = new ErrorCode(1006002000, "社交授权失败,原因是:{}"); ErrorCode SOCIAL_UNBIND_NOT_SELF = new ErrorCode(1006002001, "社交解绑失败,非当前用户绑定"); + // ========== 用户模块 1006003000 ========== + ErrorCode USER_NOT_EXISTS = new ErrorCode(1006003000, "用户不存在"); + ErrorCode USER_IS_DISABLE = new ErrorCode(1006003001, "名字为【{}】的用户已被禁用"); + + // ========== 部门模块 1006004000 ========== + ErrorCode DEPT_NOT_FOUND = new ErrorCode(1006004000, "当前部门不存在"); + ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1006004001, "部门不处于开启状态,不允许选择"); + + // ========== 角色模块 1006005000 ========== + ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1006005000, "角色不存在"); + ErrorCode ROLE_IS_DISABLE = new ErrorCode(1006005001, "名字为【{}】的角色已被禁用"); + + // ========== 字典类型 1006006000 ========== + ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1006006000, "当前字典数据不存在"); + ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1006006001, "字典数据({})不处于开启状态,不允许选择"); + + // ========== 岗位模块 1006007000 ========== + ErrorCode POST_NOT_FOUND = new ErrorCode(1006007000, "当前岗位不存在"); + ErrorCode POST_NOT_ENABLE = new ErrorCode(1006007001, "岗位({}) 不处于开启状态,不允许选择"); + } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysDeptCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysDeptCoreService.java new file mode 100644 index 0000000000..e963e51e0d --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysDeptCoreService.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.coreservice.modules.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public interface SysDeptCoreService { + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDepts(Collection ids); + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + SysDeptDO getDept(Long id); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validDepts(Collection ids); + + /** + * 获得指定编号的部门列表 + * + * @param ids 部门编号数组 + * @return 部门列表 + */ + List getSimpleDepts(Collection ids); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = getSimpleDepts(ids); + return CollectionUtils.convertMap(list, SysDeptDO::getId); + } +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysPostCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysPostCoreService.java new file mode 100644 index 0000000000..14a0653adb --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysPostCoreService.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.coreservice.modules.system.service.dept; + +import java.util.Collection; + +/** + * 岗位 Core Service 接口 + * + * @author 芋道源码 + */ +public interface SysPostCoreService { + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validPosts(Collection ids); +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysDeptCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysDeptCoreServiceImpl.java new file mode 100644 index 0000000000..4cfa49ed22 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysDeptCoreServiceImpl.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.coreservice.modules.system.service.dept.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dept.SysDeptCoreMapper; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.DEPT_NOT_ENABLE; +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.DEPT_NOT_FOUND; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 部门 Core Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class SysDeptCoreServiceImpl implements SysDeptCoreService { + + @Resource + private SysDeptCoreMapper deptCoreMapper; + + @Override + public List getDepts(Collection ids) { + return deptCoreMapper.selectBatchIds(ids); + } + + @Override + public SysDeptDO getDept(Long id) { + return deptCoreMapper.selectById(id); + } + + @Override + public void validDepts(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得科室信息 + List depts = deptCoreMapper.selectBatchIds(ids); + Map deptMap = CollectionUtils.convertMap(depts, SysDeptDO::getId); + // 校验 + ids.forEach(id -> { + SysDeptDO dept = deptMap.get(id); + if (dept == null) { + throw exception(DEPT_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw exception(DEPT_NOT_ENABLE, dept.getName()); + } + }); + } + + @Override + public List getSimpleDepts(Collection ids) { + return deptCoreMapper.selectBatchIds(ids); + } + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysPostCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysPostCoreServiceImpl.java new file mode 100644 index 0000000000..0e2b2b928f --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysPostCoreServiceImpl.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.coreservice.modules.system.service.dept.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dept.SysPostCoreMapper; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysPostCoreService; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.POST_NOT_ENABLE; +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.POST_NOT_FOUND; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 岗位 Core Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class SysPostCoreServiceImpl implements SysPostCoreService { + + @Resource + private SysPostCoreMapper sysPostCoreMapper; + + @Override + public void validPosts(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List posts = sysPostCoreMapper.selectBatchIds(ids); + Map postMap = CollectionUtils.convertMap(posts, SysPostDO::getId); + // 校验 + ids.forEach(id -> { + SysPostDO post = postMap.get(id); + if (post == null) { + throw exception(POST_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { + throw exception(POST_NOT_ENABLE, post.getName()); + } + }); + } +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java index d886956219..bcac11c59e 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.coreservice.modules.system.service.dict; import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; +import java.util.Collection; + /** * 字典数据 Service 接口 * @@ -14,4 +16,14 @@ public interface SysDictDataCoreService extends DictDataFrameworkService { */ void initLocalCache(); + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validDictDatas(String dictType, Collection values); + } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java index 98607163d2..328cac56b7 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java @@ -5,8 +5,11 @@ import cn.iocoder.yudao.coreservice.modules.system.convert.dict.SysDictDataCoreC import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dict.SysDictDataCoreMapper; import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableTable; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -14,9 +17,11 @@ import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.Resource; -import java.util.Comparator; -import java.util.Date; -import java.util.List; +import java.util.*; + +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.DICT_DATA_NOT_ENABLE; +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.DICT_DATA_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** * 字典数据 Service 实现类 @@ -119,4 +124,22 @@ public class SysDictDataCoreServiceImpl implements SysDictDataCoreService { return SysDictDataCoreConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values()); } + @Override + public void validDictDatas(String dictType, Collection values) { + if (CollUtil.isEmpty(values)) { + return; + } + ImmutableMap dictDataMap = valueDictDataCache.row(dictType); + // 校验 + values.forEach(value -> { + SysDictDataDO dictData = dictDataMap.get(value); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictData.getStatus())) { + throw exception(DICT_DATA_NOT_ENABLE, dictData.getLabel()); + } + }); + } + } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysPermissionCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysPermissionCoreService.java new file mode 100644 index 0000000000..9f3032965e --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysPermissionCoreService.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.coreservice.modules.system.service.permission; + +import java.util.Collection; +import java.util.Set; +/** + * 权限 Core Service 接口 + * + * 提供用户-角色、角色-菜单、角色-部门的关联权限处理 + * + * @author 芋道源码 + */ +public interface SysPermissionCoreService { + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleIds(Collection roleIds); +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysRoleCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysRoleCoreService.java new file mode 100644 index 0000000000..1b43e42f71 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysRoleCoreService.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.coreservice.modules.system.service.permission; + +import java.util.Collection; + +/** + * 角色 Core Service 接口 + * + * @author 芋道源码 + */ +public interface SysRoleCoreService { + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validRoles(Collection ids); +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysPermissionCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysPermissionCoreServiceImpl.java new file mode 100644 index 0000000000..b9618a93d2 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysPermissionCoreServiceImpl.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.coreservice.modules.system.service.permission.impl; + +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.permission.SysUserRoleCoreMapper; +import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Set; +/** + * 权限 Core Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class SysPermissionCoreServiceImpl implements SysPermissionCoreService { + + @Resource + private SysUserRoleCoreMapper userRoleCoreMapper; + + @Override + public Set getUserRoleIdListByRoleIds(Collection roleIds) { + return CollectionUtils.convertSet(userRoleCoreMapper.selectListByRoleIds(roleIds), + SysUserRoleDO::getRoleId); + } +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysRoleCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysRoleCoreServiceImpl.java new file mode 100644 index 0000000000..ebeb7ea207 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysRoleCoreServiceImpl.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.coreservice.modules.system.service.permission.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.permission.SysRoleCoreMapper; +import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysRoleCoreService; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.ROLE_IS_DISABLE; +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.ROLE_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 角色 Core Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class SysRoleCoreServiceImpl implements SysRoleCoreService { + + @Resource + private SysRoleCoreMapper sysRoleCoreMapper; + + @Override + public void validRoles(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得角色信息 + List roles = sysRoleCoreMapper.selectBatchIds(ids); + Map roleMap = CollectionUtils.convertMap(roles, SysRoleDO::getId); + // 校验 + ids.forEach(id -> { + SysRoleDO role = roleMap.get(id); + if (role == null) { + throw exception(ROLE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())) { + throw exception(ROLE_IS_DISABLE, role.getName()); + } + }); + } +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java index bc95e343e3..c86e7a84ba 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java @@ -1,6 +1,10 @@ package cn.iocoder.yudao.coreservice.modules.system.service.user; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; + +import java.util.*; /** * 后台用户 Service Core 接口 @@ -17,4 +21,50 @@ public interface SysUserCoreService { */ SysUserDO getUser(Long id); + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUsersByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUsersByPostIds(Collection postIds); + + /** + * 获得用户列表 + * + * @param ids 用户编号数组 + * @return 用户列表 + */ + List getUsers(Collection ids); + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validUsers(Set ids); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return new HashMap<>(); + } + return CollectionUtils.convertMap(getUsers(ids), SysUserDO::getId); + } + } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java index ff203bdc44..c2b5b054d3 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java @@ -1,11 +1,19 @@ package cn.iocoder.yudao.coreservice.modules.system.service.user.impl; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.user.SysUserCoreMapper; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.*; + +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.USER_IS_DISABLE; +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.USER_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** * 后台用户 Service Core 实现 @@ -23,4 +31,52 @@ public class SysUserCoreServiceImpl implements SysUserCoreService { return userCoreMapper.selectById(id); } + @Override + public List getUsersByDeptIds(Collection deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return Collections.emptyList(); + } + return userCoreMapper.selectListByDeptIds(deptIds); + } + + @Override + public List getUsersByPostIds(Collection postIds) { + if (CollUtil.isEmpty(postIds)) { + return Collections.emptyList(); + } + // 过滤不符合条件的 + // TODO 芋艿:暂时只能内存过滤。解决方案:1、新建一个关联表;2、基于 where + 函数;3、json 字段,适合 mysql 8+ 版本 + List users = userCoreMapper.selectList(); + users.removeIf(user -> !CollUtil.containsAny(user.getPostIds(), postIds)); + return users; + } + + @Override + public List getUsers(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return userCoreMapper.selectBatchIds(ids); + } + + @Override + public void validUsers(Set ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List users = userCoreMapper.selectBatchIds(ids); + Map userMap = CollectionUtils.convertMap(users, SysUserDO::getId); + // 校验 + ids.forEach(id -> { + SysUserDO user = userMap.get(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus())) { + throw exception(USER_IS_DISABLE, user.getNickname()); + } + }); + } + } diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index 5e057116e8..7aa40966b8 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -43,6 +43,7 @@ 3.6.28 7.1.0.M6 + 6.7.0 1.18.20 1.4.1.Final @@ -396,6 +397,33 @@ activiti-image-generator ${activiti.version} + + + org.flowable + flowable-spring-boot-starter-basic + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-actuator + ${flowable.version} + + + cn.iocoder.boot + yudao-module-bpm-core-service + ${revision} + + + cn.iocoder.boot + yudao-module-bpm-activiti + ${revision} + + + cn.iocoder.boot + yudao-module-bpm-flowable + ${revision} + + diff --git a/yudao-module-bpm/pom.xml b/yudao-module-bpm/pom.xml new file mode 100644 index 0000000000..4924978759 --- /dev/null +++ b/yudao-module-bpm/pom.xml @@ -0,0 +1,18 @@ + + + + yudao + cn.iocoder.boot + ${revision} + + pom + + yudao-module-bpm-flowable + yudao-module-bpm-activiti + yudao-module-bpm-core-service + + 4.0.0 + yudao-module-bpm + \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml b/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml new file mode 100644 index 0000000000..775bdf6c04 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml @@ -0,0 +1,30 @@ + + + + yudao-module-bpm + cn.iocoder.boot + ${revision} + + 4.0.0 + + yudao-module-bpm-activiti + + + cn.iocoder.boot + yudao-spring-boot-starter-activiti + + + cn.iocoder.boot + yudao-core-service + + + + cn.iocoder.boot + yudao-spring-boot-starter-test + test + + + + \ No newline at end of file diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java index 00a31e8b88..ea5fafd8e0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java @@ -7,9 +7,6 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.B import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmUserGroupConvert; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserSimpleRespVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -22,7 +19,6 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; - import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java similarity index 96% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java index 88405027f5..e54e850b22 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java @@ -2,11 +2,10 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.activiti.engine.history.HistoricProcessInstance; @@ -19,10 +18,8 @@ import org.mapstruct.MappingTarget; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; -import java.sql.SQLXML; import java.util.List; import java.util.Map; -import java.util.function.Consumer; /** * 流程实例 Convert diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java similarity index 98% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java index 303a3d00ec..424ae25178 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskD import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskTodoPageItemRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index ccb7cad788..4e0938d462 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -7,9 +7,9 @@ import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import org.activiti.api.runtime.shared.identity.UserGroupManager; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.ApplicationEventPublisher; @@ -58,17 +58,17 @@ public class BpmActivitiConfiguration { @Bean public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskAssignRuleService taskRuleService, - SysPermissionService permissionService, - SysDeptService deptService, + SysPermissionCoreService permissionCoreService, + SysDeptCoreService deptCoreService, BpmUserGroupService userGroupService, - SysUserService userService, + SysUserCoreService userCoreService, List scripts) { BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService); - bpmActivityBehaviorFactory.setPermissionService(permissionService); - bpmActivityBehaviorFactory.setDeptService(deptService); + bpmActivityBehaviorFactory.setPermissionCoreService(permissionCoreService); + bpmActivityBehaviorFactory.setDeptCoreService(deptCoreService); bpmActivityBehaviorFactory.setUserGroupService(userGroupService); - bpmActivityBehaviorFactory.setUserService(userService); + bpmActivityBehaviorFactory.setUserCoreService(userCoreService); bpmActivityBehaviorFactory.setScripts(scripts); return bpmActivityBehaviorFactory; } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java similarity index 74% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java index 1e3f542fae..2107fb72b4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Setter; @@ -14,7 +14,6 @@ import org.activiti.bpmn.model.UserTask; import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior; import org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory; -import javax.annotation.Resource; import java.util.List; /** @@ -31,13 +30,13 @@ public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { @Setter private BpmTaskAssignRuleService bpmTaskRuleService; @Setter - private SysPermissionService permissionService; + private SysPermissionCoreService permissionCoreService; @Setter - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @Setter private BpmUserGroupService userGroupService; @Setter - private SysUserService userService; + private SysUserCoreService userCoreService; @Setter private List scripts; @@ -45,10 +44,10 @@ public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) { BpmUserTaskActivitiBehavior userTaskActivityBehavior = new BpmUserTaskActivitiBehavior(userTask); userTaskActivityBehavior.setBpmTaskRuleService(bpmTaskRuleService); - userTaskActivityBehavior.setPermissionService(permissionService); - userTaskActivityBehavior.setDeptService(deptService); + userTaskActivityBehavior.setPermissionCoreService(permissionCoreService); + userTaskActivityBehavior.setDeptCoreService(deptCoreService); userTaskActivityBehavior.setUserGroupService(userGroupService); - userTaskActivityBehavior.setUserService(userService); + userTaskActivityBehavior.setSysUserCoreService(userCoreService); userTaskActivityBehavior.setScripts(scripts); return userTaskActivityBehavior; } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java index 55c426db03..69624d793d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java @@ -9,11 +9,11 @@ import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRu import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import com.google.common.annotations.VisibleForTesting; import lombok.Setter; @@ -49,13 +49,13 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { @Setter private BpmTaskAssignRuleService bpmTaskRuleService; @Setter - private SysPermissionService permissionService; + private SysPermissionCoreService permissionCoreService; @Setter - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @Setter private BpmUserGroupService userGroupService; @Setter - private SysUserService userService; + private SysUserCoreService sysUserCoreService; /** * 任务分配脚本 */ @@ -133,21 +133,21 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { } private Set calculateTaskCandidateUsersByRole(TaskEntity task, BpmTaskAssignRuleDO rule) { - return permissionService.getUserRoleIdListByRoleIds(rule.getOptions()); + return permissionCoreService.getUserRoleIdListByRoleIds(rule.getOptions()); } private Set calculateTaskCandidateUsersByDeptMember(TaskEntity task, BpmTaskAssignRuleDO rule) { - List users = userService.getUsersByDeptIds(rule.getOptions()); + List users = sysUserCoreService.getUsersByDeptIds(rule.getOptions()); return convertSet(users, SysUserDO::getId); } private Set calculateTaskCandidateUsersByDeptLeader(TaskEntity task, BpmTaskAssignRuleDO rule) { - List depts = deptService.getDepts(rule.getOptions()); + List depts = deptCoreService.getDepts(rule.getOptions()); return convertSet(depts, SysDeptDO::getLeaderUserId); } private Set calculateTaskCandidateUsersByPost(TaskEntity task, BpmTaskAssignRuleDO rule) { - List users = userService.getUsersByPostIds(rule.getOptions()); + List users = sysUserCoreService.getUsersByPostIds(rule.getOptions()); return convertSet(users, SysUserDO::getId); } @@ -183,7 +183,7 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { if (CollUtil.isEmpty(assigneeUserIds)) { return; } - Map userMap = userService.getUserMap(assigneeUserIds); + Map userMap = sysUserCoreService.getUserMap(assigneeUserIds); assigneeUserIds.removeIf(id -> { SysUserDO user = userMap.get(id); return user == null || !CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus()); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java index cfb3b2a22c..eeb8b40bd1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java @@ -1,10 +1,11 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; + +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.springframework.util.Assert; @@ -23,9 +24,9 @@ import static java.util.Collections.emptySet; public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssignScript { @Resource - private SysUserService userService; + private SysUserCoreService userCoreService; @Resource - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; protected Set calculateTaskCandidateUsers(TaskEntity task, int level) { Assert.isTrue(level > 0, "level 必须大于 0"); @@ -41,7 +42,7 @@ public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssign return emptySet(); } } else { - SysDeptDO parentDept = deptService.getDept(dept.getParentId()); + SysDeptDO parentDept = deptCoreService.getDept(dept.getParentId()); if (parentDept == null) { // 找不到父级部门,所以只好结束寻找。原因是:例如说,级别比较高的人,所在部门层级比较少 break; } @@ -52,11 +53,11 @@ public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssign } private SysDeptDO getStartUserDept(Long startUserId) { - SysUserDO startUser = userService.getUser(startUserId); + SysUserDO startUser = userCoreService.getUser(startUserId); if (startUser.getDeptId() == null) { // 找不到部门,所以无法使用该规则 return null; } - return deptService.getDept(startUser.getDeptId()); + return deptCoreService.getDept(startUser.getDeptId()); } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java index 16ae1859a9..82afa944c0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java @@ -16,12 +16,13 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelServi import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; + +import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysPostCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysRoleCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; @@ -36,7 +37,6 @@ import javax.annotation.Resource; import java.util.*; import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants.BPM_TASK_ASSIGN_RULE_TYPE; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -57,17 +57,17 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { @Lazy // 解决循环依赖 private BpmProcessDefinitionService processDefinitionService; @Resource - private SysRoleService roleService; + private SysRoleCoreService roleCoreService; @Resource - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @Resource - private SysPostService postService; + private SysPostCoreService postService; @Resource - private SysUserService userService; + private SysUserCoreService userCoreService; @Resource private BpmUserGroupService userGroupService; @Resource - private SysDictDataService dictDataService; + private SysDictDataCoreService dictDataCoreService; @Override public List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, @@ -182,18 +182,18 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { private void validTaskAssignRuleOptions(Integer type, Set options) { if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.ROLE.getType())) { - roleService.validRoles(options); + roleCoreService.validRoles(options); } else if (ObjectUtils.equalsAny(type, BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType())) { - deptService.validDepts(options); + deptCoreService.validDepts(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.POST.getType())) { postService.validPosts(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER.getType())) { - userService.validUsers(options); + userCoreService.validUsers(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER_GROUP.getType())) { userGroupService.validUserGroups(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.SCRIPT.getType())) { - dictDataService.validDictDatas(SysDictTypeConstants.BPM_TASK_ASSIGN_SCRIPT, + dictDataCoreService.validDictDatas(SysDictTypeConstants.BPM_TASK_ASSIGN_SCRIPT, CollectionUtils.convertSet(options, String::valueOf)); } else { throw new IllegalArgumentException(StrUtil.format("未知的规则类型({})", type)); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java index 3e68290817..8a342b0a24 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java @@ -8,7 +8,6 @@ import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmUserGroupC import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -23,8 +22,6 @@ import java.util.Set; import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_IS_DISABLE; import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.USER_IS_DISABLE; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.USER_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java index 7c87142d0e..08d115b09b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java @@ -12,18 +12,16 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanc import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventListener; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import lombok.extern.slf4j.Slf4j; @@ -68,9 +66,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService private HistoryService historyService; @Resource - private SysUserService userService; + private SysUserCoreService userCoreService; @Resource - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @Resource @Lazy // 解决循环依赖 private BpmTaskService taskService; @@ -192,10 +190,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); // 获得 User - SysUserDO startUser = userService.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); + SysUserDO startUser = userCoreService.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); SysDeptDO dept = null; if (startUser != null) { - dept = deptService.getDept(startUser.getDeptId()); + dept = deptCoreService.getDept(startUser.getDeptId()); } // 拼接结果 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java index b9a0ec3448..dfac6455e8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java @@ -11,10 +11,11 @@ import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceRes import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; + +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; @@ -59,9 +60,9 @@ public class BpmTaskServiceImpl implements BpmTaskService { private HistoryService historyService; @Resource - private SysUserService userService; + private SysUserCoreService userCoreService; @Resource - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @Resource @Lazy // 解决循环依赖 private BpmProcessInstanceService processInstanceService; @@ -95,9 +96,9 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 获得 User Map Set userIds = convertSet(tasks, task -> NumberUtils.parseLong(task.getAssignee())); userIds.add(NumberUtils.parseLong(processInstance.getStartUserId())); - Map userMap = userService.getUserMap(userIds); + Map userMap = userCoreService.getUserMap(userIds); // 获得 Dept Map - Map deptMap = deptService.getDeptMap(convertSet(userMap.values(), SysUserDO::getDeptId)); + Map deptMap = deptCoreService.getDeptMap(convertSet(userMap.values(), SysUserDO::getDeptId)); // 拼接数据 return BpmTaskConvert.INSTANCE.convertList3(tasks, bpmTaskExtDOMap, processInstance, userMap, deptMap); @@ -144,7 +145,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { Map processInstanceMap = processInstanceService.getProcessInstanceMap( convertSet(tasks, Task::getProcessInstanceId)); // 获得 User Map - Map userMap = userService.getUserMap( + Map userMap = userCoreService.getUserMap( convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); // 拼接结果 return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap), @@ -180,7 +181,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { Map historicProcessInstanceMap = processInstanceService.getHistoricProcessInstanceMap( convertSet(tasks, HistoricTaskInstance::getProcessInstanceId)); // 获得 User Map - Map userMap = userService.getUserMap( + Map userMap = userCoreService.getUserMap( convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); // 拼接结果 return new PageResult<>(BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap), @@ -291,7 +292,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Override public void afterCommit() { ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - SysUserDO startUser = userService.getUser(Long.valueOf(processInstance.getStartUserId())); + SysUserDO startUser = userCoreService.getUser(Long.valueOf(processInstance.getStartUserId())); messageService.sendMessageWhenTaskAssigned(BpmMessageConvert.INSTANCE.convert(processInstance, startUser, task)); } }); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java similarity index 86% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java index 8111823a88..8212b28c08 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java @@ -8,27 +8,28 @@ import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScri import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.activiti.engine.impl.persistence.entity.TaskEntityImpl; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import java.util.*; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.*; +import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static java.util.Collections.singleton; -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; @@ -39,13 +40,13 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { @Mock private BpmTaskAssignRuleService bpmTaskRuleService; @Mock - private SysPermissionService permissionService; + private SysPermissionCoreService permissionCoreService; @Mock - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @Mock private BpmUserGroupService userGroupService; @Mock - private SysUserService userService; + private SysUserCoreService userCoreService; @Test public void testCalculateTaskCandidateUsers_Role() { @@ -53,7 +54,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) .setType(BpmTaskAssignRuleTypeEnum.ROLE.getType()); // mock 方法 - when(permissionService.getUserRoleIdListByRoleIds(eq(rule.getOptions()))) + when(permissionCoreService.getUserRoleIdListByRoleIds(eq(rule.getOptions()))) .thenReturn(asSet(11L, 22L)); mockGetUserMap(asSet(11L, 22L)); @@ -71,7 +72,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { // mock 方法 List users = CollectionUtils.convertList(asSet(11L, 22L), id -> new SysUserDO().setId(id)); - when(userService.getUsersByDeptIds(eq(rule.getOptions()))).thenReturn(users); + when(userCoreService.getUsersByDeptIds(eq(rule.getOptions()))).thenReturn(users); mockGetUserMap(asSet(11L, 22L)); // 调用 @@ -88,7 +89,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { // mock 方法 SysDeptDO dept1 = randomPojo(SysDeptDO.class, o -> o.setLeaderUserId(11L)); SysDeptDO dept2 = randomPojo(SysDeptDO.class, o -> o.setLeaderUserId(22L)); - when(deptService.getDepts(eq(rule.getOptions()))).thenReturn(Arrays.asList(dept1, dept2)); + when(deptCoreService.getDepts(eq(rule.getOptions()))).thenReturn(Arrays.asList(dept1, dept2)); mockGetUserMap(asSet(11L, 22L)); // 调用 @@ -105,7 +106,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { // mock 方法 List users = CollectionUtils.convertList(asSet(11L, 22L), id -> new SysUserDO().setId(id)); - when(userService.getUsersByPostIds(eq(rule.getOptions()))).thenReturn(users); + when(userCoreService.getUsersByPostIds(eq(rule.getOptions()))).thenReturn(users); mockGetUserMap(asSet(11L, 22L)); // 调用 @@ -195,7 +196,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { .setStatus(CommonStatusEnum.DISABLE.getStatus())); Map userMap = MapUtil.builder(user1.getId(), user1) .put(user2.getId(), user2).build(); - when(userService.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); + when(userCoreService.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); // 调用 behavior.removeDisableUsers(assigneeUserIds); @@ -206,7 +207,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { private void mockGetUserMap(Set assigneeUserIds) { Map userMap = CollectionUtils.convertMap(assigneeUserIds, id -> id, id -> new SysUserDO().setId(id).setStatus(CommonStatusEnum.ENABLE.getStatus())); - when(userService.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); + when(userCoreService.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); } } diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java similarity index 78% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java index ec12b5467a..2652524c0d 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; import org.activiti.engine.impl.persistence.entity.ExecutionEntityImpl; import org.activiti.engine.impl.persistence.entity.TaskEntity; @@ -12,15 +12,12 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import javax.annotation.Resource; - import java.util.Set; import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { @@ -29,9 +26,9 @@ class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { private BpmTaskAssignLeaderX2Script script; @Mock - private SysUserService userService; + private SysUserCoreService userCoreService; @Mock - private SysDeptService deptService; + private SysDeptCoreService deptCoreService; @Test public void testCalculateTaskCandidateUsers_noDept() { @@ -39,7 +36,7 @@ class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { TaskEntity task = buildTaskEntity(1L); // mock 方法(startUser) SysUserDO startUser = randomPojo(SysUserDO.class, o -> o.setDeptId(10L)); - when(userService.getUser(eq(1L))).thenReturn(startUser); + when(userCoreService.getUser(eq(1L))).thenReturn(startUser); // 调用 Set result = script.calculateTaskCandidateUsers(task); @@ -53,10 +50,10 @@ class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { TaskEntity task = buildTaskEntity(1L); // mock 方法(startUser) SysUserDO startUser = randomPojo(SysUserDO.class, o -> o.setDeptId(10L)); - when(userService.getUser(eq(1L))).thenReturn(startUser); + when(userCoreService.getUser(eq(1L))).thenReturn(startUser); SysDeptDO startUserDept = randomPojo(SysDeptDO.class, o -> o.setId(10L).setParentId(100L) .setLeaderUserId(20L)); - when(deptService.getDept(eq(10L))).thenReturn(startUserDept); + when(deptCoreService.getDept(eq(10L))).thenReturn(startUserDept); // 调用 Set result = script.calculateTaskCandidateUsers(task); @@ -70,14 +67,14 @@ class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { TaskEntity task = buildTaskEntity(1L); // mock 方法(startUser) SysUserDO startUser = randomPojo(SysUserDO.class, o -> o.setDeptId(10L)); - when(userService.getUser(eq(1L))).thenReturn(startUser); + when(userCoreService.getUser(eq(1L))).thenReturn(startUser); SysDeptDO startUserDept = randomPojo(SysDeptDO.class, o -> o.setId(10L).setParentId(100L) .setLeaderUserId(20L)); - when(deptService.getDept(eq(10L))).thenReturn(startUserDept); + when(deptCoreService.getDept(eq(10L))).thenReturn(startUserDept); // mock 方法(父 dept) SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setId(100L).setParentId(1000L) .setLeaderUserId(200L)); - when(deptService.getDept(eq(100L))).thenReturn(parentDept); + when(deptCoreService.getDept(eq(100L))).thenReturn(parentDept); // 调用 Set result = script.calculateTaskCandidateUsers(task); diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java similarity index 100% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java rename to yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml b/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml new file mode 100644 index 0000000000..b61a9db277 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml @@ -0,0 +1,15 @@ + + + + yudao-module-bpm + cn.iocoder.boot + ${revision} + + 4.0.0 + + yudao-module-bpm-core-service + + + \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-flowable/pom.xml b/yudao-module-bpm/yudao-module-bpm-flowable/pom.xml new file mode 100644 index 0000000000..e56fc0ffe5 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-flowable/pom.xml @@ -0,0 +1,23 @@ + + + + yudao-module-bpm + cn.iocoder.boot + ${revision} + + 4.0.0 + yudao-module-bpm-flowable + + + org.flowable + flowable-spring-boot-starter-basic + + + org.flowable + flowable-spring-boot-starter-actuator + + + + \ No newline at end of file From 06fa85a35356dd3bf8155e599022de9fa219867a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 27 Jan 2022 13:34:25 +0800 Subject: [PATCH 02/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=201=EF=BC=9A=E5=B0=86=20yudao-user-server=20=E6=B6=89?= =?UTF-8?q?=E5=8F=8A=E5=88=B0=20member=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E9=83=BD=E8=BF=81=E7=A7=BB=E5=88=B0?= =?UTF-8?q?=20yudao-module-member=20=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- .../modules/member/convert/package-info.java | 6 - .../dal/mysql/user/MbrUserCoreMapper.java | 10 -- .../modules/member/package-info.java | 7 - .../service/user/MbrUserCoreService.java | 19 --- .../user/impl/MbrUserCoreServiceImpl.java | 28 ---- .../modules/tool/package-info.java | 7 - yudao-dependencies/pom.xml | 2 +- ...SignUpUrlAuthenticationSuccessHandler.java | 53 -------- yudao-module-member/pom.xml | 24 ++++ .../yudao-module-member-api/pom.xml | 26 ++++ .../yudao/module/member/api/package-info.java | 4 + .../module/member/api/user/MemberUserApi.java | 20 +++ .../api/user/dto/MemberUserRespDTO.java | 32 +++++ .../yudao-module-member-impl/pom.xml | 120 ++++++++++++++++++ .../app/auth/AppAuthController.http | 0 .../app/auth/AppAuthController.java | 35 +++-- .../app/auth/vo/AppAuthCheckCodeReqVO.java | 6 +- .../app/auth/vo/AppAuthLoginReqVO.java | 6 +- .../app/auth/vo/AppAuthLoginRespVO.java | 6 +- .../auth/vo/AppAuthResetPasswordReqVO.java | 7 +- .../app/auth/vo/AppAuthSmsLoginReqVO.java | 6 +- .../app/auth/vo/AppAuthSocialBindReqVO.java | 6 +- .../app/auth/vo/AppAuthSocialLogin2ReqVO.java | 6 +- .../app/auth/vo/AppAuthSocialLoginReqVO.java | 6 +- .../app/auth/vo/AppAuthSocialUnbindReqVO.java | 6 +- .../auth/vo/AppAuthUpdatePasswordReqVO.java | 6 +- .../app/auth/vo/AppSendSmsReqVO.java | 6 +- .../member/controller/app/package-info.java | 1 + .../app/user/AppUserController.http | 0 .../app/user/AppUserController.java | 10 +- .../app/user/vo/AppUserInfoRespVO.java | 6 +- .../app/user/vo/AppUserUpdateMobileReqVO.java | 7 +- .../member/controller/package-info.java | 6 + .../member}/convert/auth/SysAuthConvert.java | 2 +- .../module}/member/convert/package-info.java | 2 +- .../member/convert/user/UserConvert.java | 14 ++ ...g Boot 对象转换 MapStruct 入门》.md | 0 .../dal/dataobject/sms/SysSmsCodeDO.java | 3 +- .../dal/dataobject/user/MemberUserDO.java | 6 +- .../dal/mysql/sms/SysSmsCodeMapper.java | 5 +- .../member/dal/mysql/user/MbrUserMapper.java | 2 +- .../yudao/module/member/dal/package-info.java | 7 + .../module/member/dal/redis/package-info.java | 1 + .../enums/MemberErrorCodeConstants.java | 5 +- .../member}/enums/SysErrorCodeConstants.java | 2 +- .../member}/enums/sms/SysSmsSceneEnum.java | 2 +- .../sms/SysSmsTemplateCodeConstants.java | 2 +- .../module/member/framework/package-info.java | 6 + .../security/SecurityConfiguration.java | 2 +- .../framework/sms/SmsCodeConfiguration.java | 2 +- .../framework/sms/SmsCodeProperties.java | 2 +- .../yudao/module/member/package-info.java | 1 + .../member}/service/auth/SysAuthService.java | 4 +- .../service/auth}/SysAuthServiceImpl.java | 23 ++-- .../module/member/service/package-info.java | 1 + .../service/sms/SysSmsCodeService.java | 2 +- .../service/sms}/SysSmsCodeServiceImpl.java | 17 +-- .../member/service/user/MbrUserService.java | 2 +- .../service/user}/MbrUserServiceImpl.java | 5 +- .../service/auth}/SysAuthServiceTest.java | 6 +- .../module/member/service/package-info.java | 1 + .../service/user}/MbrUserServiceImplTest.java | 4 +- .../member/test}/BaseDbAndRedisUnitTest.java | 2 +- .../module/member/test}/BaseDbUnitTest.java | 2 +- .../member/test}/RedisTestConfiguration.java | 2 +- .../test/resources/application-unit-test.yaml | 0 .../src/test/resources/file/erweima.jpg | Bin .../src/test/resources/logback-spring.xml | 0 .../src/test/resources/sql/clean.sql | 0 .../src/test/resources/sql/create_tables.sql | 0 yudao-server/pom.xml | 22 ++++ .../userserver/framework/package-info.java | 6 - .../member/controller/package-info.java | 1 - .../convert/user/UserProfileConvert.java | 15 --- ...g Boot 对象转换 MapStruct 入门》.md | 1 - .../modules/member/package-info.java | 8 -- .../modules/member/service/package-info.java | 1 - .../system/controller/package-info.java | 4 - .../modules/system/convert/package-info.java | 6 - ...g Boot 对象转换 MapStruct 入门》.md | 1 - .../system/dal/dataobject/package-info.java | 1 - .../system/dal/mysql/package-info.java | 1 - .../system/dal/redis/package-info.java | 1 - .../system/framework/package-info.java | 6 - .../modules/system/package-info.java | 7 - .../modules/system/service/package-info.java | 1 - 87 files changed, 406 insertions(+), 307 deletions(-) delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/convert/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/mysql/user/MbrUserCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/MbrUserCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/impl/MbrUserCoreServiceImpl.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/tool/package-info.java delete mode 100644 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AbstractSignUpUrlAuthenticationSuccessHandler.java create mode 100644 yudao-module-member/pom.xml create mode 100644 yudao-module-member/yudao-module-member-api/pom.xml create mode 100644 yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/package-info.java create mode 100644 yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java create mode 100644 yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java create mode 100644 yudao-module-member/yudao-module-member-impl/pom.xml rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.http => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http (100%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java (81%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthCheckCodeReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java (89%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java (84%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginRespVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java (70%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthResetPasswordReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java (88%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSmsLoginReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java (85%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java (86%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java (90%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java (86%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java (84%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthUpdatePasswordReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java (85%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSendSmsReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppSendSmsReqVO.java (83%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/package-info.java rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.http (100%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java (91%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/vo/MbrUserInfoRespVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserInfoRespVO.java (76%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/vo/MbrUserUpdateMobileReqVO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java (91%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/package-info.java rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/convert/auth/SysAuthConvert.java (91%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module}/member/convert/package-info.java (56%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module}/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md (100%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/dal/dataobject/sms/SysSmsCodeDO.java (90%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/dataobject/user/MbrUserDO.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java (88%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/dal/mysql/sms/SysSmsCodeMapper.java (86%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module}/member/dal/mysql/user/MbrUserMapper.java (86%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/redis/package-info.java rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCodeConstants.java (80%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/enums/SysErrorCodeConstants.java (96%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/enums/sms/SysSmsSceneEnum.java (95%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/enums/sms/SysSmsTemplateCodeConstants.java (88%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/package-info.java rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/framework/security/SecurityConfiguration.java (94%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/framework/sms/SmsCodeConfiguration.java (79%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/framework/sms/SmsCodeProperties.java (94%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/package-info.java rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/service/auth/SysAuthService.java (93%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth}/SysAuthServiceImpl.java (92%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/package-info.java rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member}/service/sms/SysSmsCodeService.java (95%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/impl => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms}/SysSmsCodeServiceImpl.java (86%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module}/member/service/user/MbrUserService.java (96%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user}/MbrUserServiceImpl.java (96%) rename {yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/modules/system/service => yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth}/SysAuthServiceTest.java (95%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/package-info.java rename {yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/modules/member/service => yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user}/MbrUserServiceImplTest.java (97%) rename {yudao-user-server/src/test/java/cn/iocoder/yudao/userserver => yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test}/BaseDbAndRedisUnitTest.java (98%) rename {yudao-user-server/src/test/java/cn/iocoder/yudao/userserver => yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test}/BaseDbUnitTest.java (97%) rename {yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/config => yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test}/RedisTestConfiguration.java (96%) rename {yudao-user-server => yudao-module-member/yudao-module-member-impl}/src/test/resources/application-unit-test.yaml (100%) rename {yudao-user-server => yudao-module-member/yudao-module-member-impl}/src/test/resources/file/erweima.jpg (100%) rename {yudao-user-server => yudao-module-member/yudao-module-member-impl}/src/test/resources/logback-spring.xml (100%) rename {yudao-user-server => yudao-module-member/yudao-module-member-impl}/src/test/resources/sql/clean.sql (100%) rename {yudao-user-server => yudao-module-member/yudao-module-member-impl}/src/test/resources/sql/create_tables.sql (100%) create mode 100644 yudao-server/pom.xml delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/framework/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/user/UserProfileConvert.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/redis/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/package-info.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/package-info.java diff --git a/pom.xml b/pom.xml index 0f791a822f..c76c9a22d1 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,8 @@ yudao-admin-server yudao-user-server yudao-core-service + yudao-module-member + yudao-server ${artifactId} @@ -20,7 +22,7 @@ https://github.com/YunaiV/ruoyi-vue-pro - 1.3.0-snapshot + 1.4.0-snapshot 1.8 ${java.version} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/convert/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/convert/package-info.java deleted file mode 100644 index 230bbc0922..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package cn.iocoder.yudao.coreservice.modules.member.convert; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/mysql/user/MbrUserCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/mysql/user/MbrUserCoreMapper.java deleted file mode 100644 index 27c0c95097..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/mysql/user/MbrUserCoreMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.member.dal.mysql.user; - -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface MbrUserCoreMapper extends BaseMapperX { - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/package-info.java deleted file mode 100644 index 17abe90bd5..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * member 包下,我们放会员业务. - * 例如说:会员中心等等 - * - * 缩写:mbr - */ -package cn.iocoder.yudao.coreservice.modules.member; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/MbrUserCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/MbrUserCoreService.java deleted file mode 100644 index 934413956b..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/MbrUserCoreService.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.member.service.user; - -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; - -/** - * 前台用户 Core Service 接口 - * - * @author 芋道源码 - */ -public interface MbrUserCoreService { - /** - * 通过用户 ID 查询用户 - * - * @param id 用户ID - * @return 用户对象信息 - */ - MbrUserDO getUser(Long id); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/impl/MbrUserCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/impl/MbrUserCoreServiceImpl.java deleted file mode 100644 index 08ee22c76c..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/impl/MbrUserCoreServiceImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.member.service.user.impl; - -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; -import cn.iocoder.yudao.coreservice.modules.member.dal.mysql.user.MbrUserCoreMapper; -import cn.iocoder.yudao.coreservice.modules.member.service.user.MbrUserCoreService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * User Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class MbrUserCoreServiceImpl implements MbrUserCoreService { - - @Resource - private MbrUserCoreMapper userCoreMapper; - - @Override - public MbrUserDO getUser(Long id) { - return userCoreMapper.selectById(id); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/tool/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/tool/package-info.java deleted file mode 100644 index dd3c3e9138..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/tool/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * tool 包下,我们放研发工具,提升研发效率与质量。 - * 例如说:代码生成器、接口文档等等 - * - * 缩写:tool - */ -package cn.iocoder.yudao.coreservice.modules.tool; diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index 5e057116e8..3973ed2566 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -14,7 +14,7 @@ https://github.com/YunaiV/ruoyi-vue-pro - 1.3.0-snapshot + 1.4.0-snapshot 2.4.12 diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AbstractSignUpUrlAuthenticationSuccessHandler.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AbstractSignUpUrlAuthenticationSuccessHandler.java deleted file mode 100644 index 01fdf08887..0000000000 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AbstractSignUpUrlAuthenticationSuccessHandler.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * MIT License - * Copyright (c) 2020-2029 YongWu zheng (dcenter.top and gitee.com/pcore and github.com/ZeroOrInfinity) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cn.iocoder.yudao.framework.security.core.handler; - -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; -import org.springframework.security.web.savedrequest.HttpSessionRequestCache; -import org.springframework.security.web.savedrequest.RequestCache; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * @author weir - */ -public class AbstractSignUpUrlAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { - private RequestCache requestCache = new HttpSessionRequestCache(); - - @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { - if (requestCache.getRequest(request, response) != null) { - requestCache.getRequest(request, response); - } - super.onAuthenticationSuccess(request,response,authentication); - } - - @Override - public void setRequestCache(RequestCache requestCache) { - this.requestCache = requestCache; - } -} diff --git a/yudao-module-member/pom.xml b/yudao-module-member/pom.xml new file mode 100644 index 0000000000..cf150725a2 --- /dev/null +++ b/yudao-module-member/pom.xml @@ -0,0 +1,24 @@ + + + + cn.iocoder.boot + yudao + ${revision} + + 4.0.0 + + yudao-module-member-api + yudao-module-member-impl + + yudao-module-member + pom + + ${artifactId} + + member 模块,我们放会员业务。 + 例如说:会员中心等等 + + + diff --git a/yudao-module-member/yudao-module-member-api/pom.xml b/yudao-module-member/yudao-module-member-api/pom.xml new file mode 100644 index 0000000000..914d910825 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/pom.xml @@ -0,0 +1,26 @@ + + + + cn.iocoder.boot + yudao-module-member + ${revision} + + 4.0.0 + yudao-module-member-api + jar + + ${artifactId} + + member 模块 API,暴露给其它模块调用 + + + + + cn.iocoder.boot + yudao-common + + + + diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/package-info.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/package-info.java new file mode 100644 index 0000000000..56cd9857f8 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/package-info.java @@ -0,0 +1,4 @@ +/** + * member API 包,定义暴露给其它模块的 API + */ +package cn.iocoder.yudao.module.member.api; diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java new file mode 100644 index 0000000000..3ac616af89 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.member.api.user; + +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; + +/** + * 会员用户的 API 接口 + * + * @author 芋道源码 + */ +public interface MemberUserApi { + + /** + * 获得会员用户信息 + * + * @param id 用户编号 + * @return 用户信息 + */ + MemberUserRespDTO getMemberUser(Long id); + +} diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java new file mode 100644 index 0000000000..82eec958a3 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.member.api.user.dto; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; + +/** + * 用户信息 Response DTO + * + * @author 芋道源码 + */ +public class MemberUserRespDTO { + + /** + * 用户ID + */ + private Long id; + /** + * 用户昵称 + */ + private String nickname; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + + /** + * 手机 + */ + private String mobile; + +} diff --git a/yudao-module-member/yudao-module-member-impl/pom.xml b/yudao-module-member/yudao-module-member-impl/pom.xml new file mode 100644 index 0000000000..d4b064f6af --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/pom.xml @@ -0,0 +1,120 @@ + + + + cn.iocoder.boot + yudao-module-member + ${revision} + + 4.0.0 + yudao-module-member-impl + jar + + ${artifactId} + + member 模块,我们放会员业务。 + 例如说:会员中心等等 + + + + + + cn.iocoder.boot + yudao-core-service + + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-dict + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-sms + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-weixin + + + + + cn.iocoder.boot + yudao-spring-boot-starter-web + + + + cn.iocoder.boot + yudao-spring-boot-starter-security + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mybatis + + + + cn.iocoder.boot + yudao-spring-boot-starter-redis + + + + + cn.iocoder.boot + yudao-spring-boot-starter-config + + + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mq + + + + + cn.iocoder.boot + yudao-spring-boot-starter-protection + + + + + cn.iocoder.boot + yudao-spring-boot-starter-monitor + + + + + cn.iocoder.boot + yudao-spring-boot-starter-test + test + + + + + + + + ${artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + repackage + + + + + + + + diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.http b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http similarity index 100% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.http rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java similarity index 81% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java index 2c0d49307d..76437eb9d8 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth; +package cn.iocoder.yudao.module.member.controller.app.auth; import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; -import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService; import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; import io.swagger.annotations.Api; @@ -23,12 +23,12 @@ import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getCli import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -@Api(tags = "认证") +@Api(tags = "APP 端 - 认证") @RestController @RequestMapping("/") @Validated @Slf4j -public class SysAuthController { +public class AppAuthController { @Resource private SysAuthService authService; @@ -39,18 +39,18 @@ public class SysAuthController { @PostMapping("/login") @ApiOperation("使用手机 + 密码登录") - public CommonResult login(@RequestBody @Valid SysAuthLoginReqVO reqVO) { + public CommonResult login(@RequestBody @Valid AppAuthLoginReqVO reqVO) { String token = authService.login(reqVO, getClientIP(), getUserAgent()); // 返回结果 - return success(SysAuthLoginRespVO.builder().token(token).build()); + return success(AppAuthLoginRespVO.builder().token(token).build()); } @PostMapping("/sms-login") @ApiOperation("使用手机 + 验证码登录") - public CommonResult smsLogin(@RequestBody @Valid SysAuthSmsLoginReqVO reqVO) { + public CommonResult smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) { String token = authService.smsLogin(reqVO, getClientIP(), getUserAgent()); // 返回结果 - return success(SysAuthLoginRespVO.builder().token(token).build()); + return success(AppAuthLoginRespVO.builder().token(token).build()); } @PostMapping("/send-sms-code") @@ -70,7 +70,7 @@ public class SysAuthController { @PostMapping("/reset-password") @ApiOperation(value = "重置密码", notes = "用户忘记密码时使用") @PreAuthenticated - public CommonResult resetPassword(@RequestBody @Valid MbrAuthResetPasswordReqVO reqVO) { + public CommonResult resetPassword(@RequestBody @Valid AppAuthResetPasswordReqVO reqVO) { authService.resetPassword(reqVO); return success(true); } @@ -78,12 +78,11 @@ public class SysAuthController { @PostMapping("/update-password") @ApiOperation(value = "修改用户密码",notes = "用户修改密码时使用") @PreAuthenticated - public CommonResult updatePassword(@RequestBody @Valid MbrAuthUpdatePasswordReqVO reqVO) { + public CommonResult updatePassword(@RequestBody @Valid AppAuthUpdatePasswordReqVO reqVO) { authService.updatePassword(getLoginUserId(), reqVO); return success(true); } - // ========== 社交登录相关 ========== @GetMapping("/social-auth-redirect") @@ -97,32 +96,30 @@ public class SysAuthController { return CommonResult.success(socialService.getAuthorizeUrl(type, redirectUri)); } - @PostMapping("/social-login") @ApiOperation("社交登录,使用 code 授权码") - public CommonResult socialLogin(@RequestBody @Valid MbrAuthSocialLoginReqVO reqVO) { + public CommonResult socialLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) { String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent()); - return success(SysAuthLoginRespVO.builder().token(token).build()); + return success(AppAuthLoginRespVO.builder().token(token).build()); } - @PostMapping("/social-login2") @ApiOperation("社交登录,使用 手机号 + 手机验证码") - public CommonResult socialLogin2(@RequestBody @Valid MbrAuthSocialLogin2ReqVO reqVO) { + public CommonResult socialLogin2(@RequestBody @Valid AppAuthSocialLogin2ReqVO reqVO) { String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent()); - return success(SysAuthLoginRespVO.builder().token(token).build()); + return success(AppAuthLoginRespVO.builder().token(token).build()); } @PostMapping("/social-bind") @ApiOperation("社交绑定,使用 code 授权码") - public CommonResult socialBind(@RequestBody @Valid MbrAuthSocialBindReqVO reqVO) { + public CommonResult socialBind(@RequestBody @Valid AppAuthSocialBindReqVO reqVO) { authService.socialBind(getLoginUserId(), reqVO); return CommonResult.success(true); } @DeleteMapping("/social-unbind") @ApiOperation("取消社交绑定") - public CommonResult socialUnbind(@RequestBody MbrAuthSocialUnbindReqVO reqVO) { + public CommonResult socialUnbind(@RequestBody AppAuthSocialUnbindReqVO reqVO) { socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.MEMBER); return CommonResult.success(true); } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthCheckCodeReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java similarity index 89% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthCheckCodeReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java index 89f1f501e5..64cc22a3cf 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthCheckCodeReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; @@ -15,12 +15,12 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -@ApiModel("校验验证码 Request VO") +@ApiModel("APP 端 - 校验验证码 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthCheckCodeReqVO { +public class AppAuthCheckCodeReqVO { @ApiModelProperty(value = "手机号", example = "15601691234") @NotBlank(message = "手机号不能为空") diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java similarity index 84% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java index 1d51f80012..25875fd66e 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.Mobile; import io.swagger.annotations.ApiModel; @@ -11,12 +11,12 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; -@ApiModel("手机 + 密码登录 Request VO") +@ApiModel("APP 端 - 手机 + 密码登录 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthLoginReqVO { +public class AppAuthLoginReqVO { @ApiModelProperty(value = "手机号", required = true, example = "15601691300") @NotEmpty(message = "手机号不能为空") diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginRespVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java similarity index 70% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginRespVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java index 95c69c754e..935b3ec52b 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginRespVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,12 +7,12 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("手机密码登录 Response VO") +@ApiModel("APP 端 - 手机密码登录 Response VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthLoginRespVO { +public class AppAuthLoginRespVO { @ApiModelProperty(value = "token", required = true, example = "yudaoyuanma") private String token; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthResetPasswordReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java similarity index 88% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthResetPasswordReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java index 8160174559..5ae291fdb5 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthResetPasswordReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.Mobile; import io.swagger.annotations.ApiModel; @@ -13,12 +13,12 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; -@ApiModel("重置密码 Request VO") +@ApiModel("APP 端 - 重置密码 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class MbrAuthResetPasswordReqVO { +public class AppAuthResetPasswordReqVO { @ApiModelProperty(value = "新密码", required = true, example = "buzhidao") @NotEmpty(message = "新密码不能为空") @@ -35,4 +35,5 @@ public class MbrAuthResetPasswordReqVO { @NotBlank(message = "手机号不能为空") @Mobile private String mobile; + } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSmsLoginReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java similarity index 85% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSmsLoginReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java index a7b36bb546..452e7e825e 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSmsLoginReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.Mobile; import io.swagger.annotations.ApiModel; @@ -12,12 +12,12 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; -@ApiModel("手机 + 验证码登录 Request VO") +@ApiModel("APP 端 - 手机 + 验证码登录 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthSmsLoginReqVO { +public class AppAuthSmsLoginReqVO { @ApiModelProperty(value = "手机号", required = true, example = "15601691300") @NotEmpty(message = "手机号不能为空") diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java similarity index 86% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java index 767446b5f0..d595e74283 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; @@ -12,12 +12,12 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("社交绑定 Request VO,使用 code 授权码") +@ApiModel("APP 端 - 社交绑定 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class MbrAuthSocialBindReqVO { +public class AppAuthSocialBindReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") @InEnum(SysSocialTypeEnum.class) diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java similarity index 90% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java index 1da763ed36..cc832e3716 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; @@ -14,12 +14,12 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -@ApiModel("社交登录 Request VO,使用 code 授权码 + 账号密码") +@ApiModel("APP 端 - 社交登录 Request VO,使用 code 授权码 + 账号密码") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class MbrAuthSocialLogin2ReqVO { +public class AppAuthSocialLogin2ReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") @InEnum(SysSocialTypeEnum.class) diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java similarity index 86% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java index cb430231a0..3d1562522d 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; @@ -12,12 +12,12 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("社交登录 Request VO,使用 code 授权码") +@ApiModel("APP 端 - 社交登录 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class MbrAuthSocialLoginReqVO { +public class AppAuthSocialLoginReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") @InEnum(SysSocialTypeEnum.class) diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java similarity index 84% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java index 75e31701d1..9225080f76 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; @@ -12,12 +12,12 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("取消社交绑定 Request VO,使用 code 授权码") +@ApiModel("APP 端 - 取消社交绑定 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class MbrAuthSocialUnbindReqVO { +public class AppAuthSocialUnbindReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") @InEnum(SysSocialTypeEnum.class) diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthUpdatePasswordReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java similarity index 85% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthUpdatePasswordReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java index b5cc0c7850..cbbd17fec5 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthUpdatePasswordReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -11,12 +11,12 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; -@ApiModel("修改密码 Request VO") +@ApiModel("APP 端 - 修改密码 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class MbrAuthUpdatePasswordReqVO { +public class AppAuthUpdatePasswordReqVO { @ApiModelProperty(value = "用户旧密码", required = true, example = "123456") @NotBlank(message = "旧密码不能为空") diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSendSmsReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppSendSmsReqVO.java similarity index 83% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSendSmsReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppSendSmsReqVO.java index d8c6c983f5..7a7620d630 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSendSmsReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppSendSmsReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo; +package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; @@ -10,10 +10,10 @@ import lombok.experimental.Accessors; import javax.validation.constraints.NotNull; -@ApiModel("发送手机验证码 Response VO") +@ApiModel("APP 端 - 发送手机验证码 Response VO") @Data @Accessors(chain = true) -public class SysAuthSendSmsReqVO { +public class AppSendSmsReqVO { @ApiModelProperty(value = "手机号", example = "15601691234") @Mobile diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/package-info.java new file mode 100644 index 0000000000..7f013eaa96 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.controller.app; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.http similarity index 100% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.http diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java similarity index 91% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java index 8fd75788a1..758eb7b00a 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.member.controller.user; +package cn.iocoder.yudao.module.member.controller.app.user; import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; @@ -25,12 +25,12 @@ import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getCli import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants.FILE_IS_EMPTY; -@Api(tags = "用户个人中心") +@Api(tags = "APP 端 - 用户个人中心") @RestController -@RequestMapping("/member/user/profile") +@RequestMapping("/member/user") @Validated @Slf4j -public class SysUserProfileController { +public class AppUserController { @Resource private MbrUserService userService; @@ -48,7 +48,7 @@ public class SysUserProfileController { @PreAuthenticated public CommonResult updateAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException { if (file.isEmpty()) { - throw ServiceExceptionUtil.exception(FILE_IS_EMPTY); + throw ServiceExceptionUtil.exception(MbrErrorCodeConstants.FILE_IS_EMPTY); } String avatar = userService.updateAvatar(getLoginUserId(), file.getInputStream()); return success(avatar); diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/vo/MbrUserInfoRespVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserInfoRespVO.java similarity index 76% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/vo/MbrUserInfoRespVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserInfoRespVO.java index 697c4085d3..f8d9d20d1c 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/vo/MbrUserInfoRespVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserInfoRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.member.controller.user.vo; +package cn.iocoder.yudao.module.member.controller.app.user.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,11 +6,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("用户个人信息 Response VO") +@ApiModel("APP 端 - 用户个人信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor -public class MbrUserInfoRespVO { +public class AppUserInfoRespVO { @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") private String nickname; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/vo/MbrUserUpdateMobileReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java similarity index 91% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/vo/MbrUserUpdateMobileReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java index 8593302d79..fe91566c96 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/vo/MbrUserUpdateMobileReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.member.controller.user.vo; +package cn.iocoder.yudao.module.member.controller.app.user.vo; import cn.iocoder.yudao.framework.common.validation.Mobile; import io.swagger.annotations.ApiModel; @@ -13,12 +13,12 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; -@ApiModel("修改手机 Request VO") +@ApiModel("APP 端 - 修改手机 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class MbrUserUpdateMobileReqVO { +public class AppUserUpdateMobileReqVO { @ApiModelProperty(value = "手机验证码", required = true, example = "1024") @NotEmpty(message = "手机验证码不能为空") @@ -44,5 +44,4 @@ public class MbrUserUpdateMobileReqVO { @Mobile private String oldMobile; - } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/package-info.java new file mode 100644 index 0000000000..ea9687d819 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目 + */ +package cn.iocoder.yudao.module.member.controller; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/auth/SysAuthConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/SysAuthConvert.java similarity index 91% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/auth/SysAuthConvert.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/SysAuthConvert.java index f2af812570..df9a353a04 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/auth/SysAuthConvert.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/SysAuthConvert.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.convert.auth; +package cn.iocoder.yudao.module.member.convert.auth; import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/package-info.java similarity index 56% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/package-info.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/package-info.java index 5877b74c18..6523a66567 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/package-info.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/package-info.java @@ -3,4 +3,4 @@ * * 目前使用 MapStruct 框架 */ -package cn.iocoder.yudao.userserver.modules.member.convert; +package cn.iocoder.yudao.module.member.convert; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java new file mode 100644 index 0000000000..139b6ef330 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.member.convert.user; + +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface UserConvert { + + UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); + + AppUserInfoRespVO convert(MemberUserDO bean); + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md similarity index 100% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/sms/SysSmsCodeDO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/sms/SysSmsCodeDO.java similarity index 90% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/sms/SysSmsCodeDO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/sms/SysSmsCodeDO.java index 8cce25f42a..eb51770ea8 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/sms/SysSmsCodeDO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/sms/SysSmsCodeDO.java @@ -1,9 +1,8 @@ -package cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms; +package cn.iocoder.yudao.module.member.dal.dataobject.sms; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; -import lombok.experimental.Accessors; import java.util.Date; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/dataobject/user/MbrUserDO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java similarity index 88% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/dataobject/user/MbrUserDO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java index 02efd598b0..0b77f4e1e9 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/dataobject/user/MbrUserDO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user; +package cn.iocoder.yudao.module.member.dal.dataobject.user; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; @@ -16,13 +16,13 @@ import java.util.Date; * * @author 芋道源码 */ -@TableName(value = "mbr_user", autoResultMap = true) +@TableName(value = "member_user", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class MbrUserDO extends TenantBaseDO { +public class MemberUserDO extends TenantBaseDO { /** * 用户ID diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/sms/SysSmsCodeMapper.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java similarity index 86% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/sms/SysSmsCodeMapper.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java index 88e10363f5..80079117f2 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/sms/SysSmsCodeMapper.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java @@ -1,11 +1,12 @@ -package cn.iocoder.yudao.userserver.modules.system.dal.mysql.sms; +package cn.iocoder.yudao.module.member.dal.mysql.sms; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO; import org.apache.ibatis.annotations.Mapper; - +// TODO @芋艿: @Mapper public interface SysSmsCodeMapper extends BaseMapperX { diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/dal/mysql/user/MbrUserMapper.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MbrUserMapper.java similarity index 86% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/dal/mysql/user/MbrUserMapper.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MbrUserMapper.java index 6abb5ddf32..49b6a9f8e9 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/dal/mysql/user/MbrUserMapper.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MbrUserMapper.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.member.dal.mysql.user; +package cn.iocoder.yudao.module.member.dal.mysql.user; import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java new file mode 100644 index 0000000000..06c6545caf --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java @@ -0,0 +1,7 @@ +/** + * DAL = Data Access Layer 数据访问层 + * 1. data object:数据对象 + * 2. redis:Redis 的 CRUD 操作 + * 3. mysql:MySQL 的 CRUD 操作 + */ +package cn.iocoder.yudao.module.member.dal; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/redis/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/redis/package-info.java new file mode 100644 index 0000000000..f5d6e64d24 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/redis/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.dal.redis; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCodeConstants.java similarity index 80% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCodeConstants.java index 3794eb09d4..4ee545b1bf 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.member.enums; +package cn.iocoder.yudao.module.member.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; @@ -7,11 +7,12 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; * * member 系统,使用 1-004-000-000 段 */ -public interface MbrErrorCodeConstants { +public interface MemberErrorCodeConstants { // ==========用户相关 1004001000============ ErrorCode USER_NOT_EXISTS = new ErrorCode(1004001000, "用户不存在"); // ==========文件相关 1004002000 =========== ErrorCode FILE_IS_EMPTY = new ErrorCode(1004002000, "文件为空"); + } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/SysErrorCodeConstants.java similarity index 96% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/SysErrorCodeConstants.java index 05ae0ed3b8..b1b23a3526 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/SysErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.enums; +package cn.iocoder.yudao.module.member.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/sms/SysSmsSceneEnum.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsSceneEnum.java similarity index 95% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/sms/SysSmsSceneEnum.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsSceneEnum.java index 9cea092301..a471901176 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/sms/SysSmsSceneEnum.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsSceneEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.enums.sms; +package cn.iocoder.yudao.module.member.enums.sms; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import lombok.AllArgsConstructor; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/sms/SysSmsTemplateCodeConstants.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsTemplateCodeConstants.java similarity index 88% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/sms/SysSmsTemplateCodeConstants.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsTemplateCodeConstants.java index 8a83f75f20..3ad8439cd6 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/sms/SysSmsTemplateCodeConstants.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsTemplateCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.enums.sms; +package cn.iocoder.yudao.module.member.enums.sms; /** * yudao-user-server 使用到的短信模板的 Code 编码的枚举 diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/package-info.java new file mode 100644 index 0000000000..7342570b1b --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 yudao-module-member-impl 的封装 + * + * @author 芋道源码 + */ +package cn.iocoder.yudao.module.member.framework; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/framework/security/SecurityConfiguration.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/security/SecurityConfiguration.java similarity index 94% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/framework/security/SecurityConfiguration.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/security/SecurityConfiguration.java index 66a0ae7187..32368f8d10 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/framework/security/SecurityConfiguration.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/security/SecurityConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.framework.security; +package cn.iocoder.yudao.module.member.framework.security; import cn.iocoder.yudao.framework.web.config.WebProperties; import org.springframework.context.annotation.Bean; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/sms/SmsCodeConfiguration.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeConfiguration.java similarity index 79% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/sms/SmsCodeConfiguration.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeConfiguration.java index a4510ea476..fa741880b3 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/sms/SmsCodeConfiguration.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.framework.sms; +package cn.iocoder.yudao.module.member.framework.sms; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/sms/SmsCodeProperties.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeProperties.java similarity index 94% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/sms/SmsCodeProperties.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeProperties.java index b600c28dc9..542fe2d9e7 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/sms/SmsCodeProperties.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeProperties.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.framework.sms; +package cn.iocoder.yudao.module.member.framework.sms; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/package-info.java new file mode 100644 index 0000000000..dabac6ac39 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthService.java similarity index 93% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthService.java index 0145821d55..a864e1ed9d 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.userserver.modules.system.service.auth; +package cn.iocoder.yudao.module.member.service.auth; import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; -import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import javax.validation.Valid; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceImpl.java similarity index 92% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceImpl.java index 037db64b81..fd68cff5e5 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceImpl.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.service.auth.impl; +package cn.iocoder.yudao.module.member.service.auth; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; @@ -12,12 +12,13 @@ import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLo import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper; import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; -import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.userserver.modules.system.convert.auth.SysAuthConvert; import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum; import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService; @@ -131,13 +132,13 @@ public class SysAuthServiceImpl implements SysAuthService { String unionId = socialService.getAuthUserUnionId(authUser); List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, USER_TYPE_ENUM); if (CollUtil.isEmpty(socialUsers)) { - throw exception(AUTH_THIRD_LOGIN_NOT_BIND); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_THIRD_LOGIN_NOT_BIND); } // 自动登录 MbrUserDO user = userService.getUser(socialUsers.get(0).getUserId()); if (user == null) { - throw exception(USER_NOT_EXISTS); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_NOT_EXISTS); } this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_SOCIAL, SysLoginResultEnum.SUCCESS); @@ -190,14 +191,14 @@ public class SysAuthServiceImpl implements SysAuthService { authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); } catch (BadCredentialsException badCredentialsException) { this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.BAD_CREDENTIALS); - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_LOGIN_BAD_CREDENTIALS); } catch (DisabledException disabledException) { this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.USER_DISABLED); - throw exception(AUTH_LOGIN_USER_DISABLED); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_LOGIN_USER_DISABLED); } catch (AuthenticationException authenticationException) { log.error("[login0][username({}) 发生未知异常]", username, authenticationException); this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.UNKNOWN_ERROR); - throw exception(AUTH_LOGIN_FAIL_UNKNOWN); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_LOGIN_FAIL_UNKNOWN); } // 登录成功的日志 Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); @@ -248,7 +249,7 @@ public class SysAuthServiceImpl implements SysAuthService { // 重新加载 MbrUserDO 信息 MbrUserDO user = userService.getUser(loginUser.getId()); if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) { - throw exception(AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面 + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面 } // 刷新 LoginUser 缓存 @@ -321,11 +322,11 @@ public class SysAuthServiceImpl implements SysAuthService { public MbrUserDO checkOldPassword(Long id, String oldPassword) { MbrUserDO user = userMapper.selectById(id); if (user == null) { - throw exception(USER_NOT_EXISTS); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_NOT_EXISTS); } // 参数:未加密密码,编码后的密码 if (!passwordEncoder.matches(oldPassword,user.getPassword())) { - throw exception(USER_PASSWORD_FAILED); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_PASSWORD_FAILED); } return user; } @@ -333,7 +334,7 @@ public class SysAuthServiceImpl implements SysAuthService { public MbrUserDO checkUserIfExists(String mobile) { MbrUserDO user = userMapper.selectByMobile(mobile); if (user == null) { - throw exception(USER_NOT_EXISTS); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_NOT_EXISTS); } return user; } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/package-info.java new file mode 100644 index 0000000000..6223e6e6ca --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.service; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/SysSmsCodeService.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java similarity index 95% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/SysSmsCodeService.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java index 281f18ce62..8f0eaf6f33 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/SysSmsCodeService.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.service.sms; +package cn.iocoder.yudao.module.member.service.sms; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.validation.Mobile; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/impl/SysSmsCodeServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java similarity index 86% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/impl/SysSmsCodeServiceImpl.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java index 80fc15a8a3..43b7a1753c 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/impl/SysSmsCodeServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java @@ -1,8 +1,9 @@ -package cn.iocoder.yudao.userserver.modules.system.service.sms.impl; +package cn.iocoder.yudao.module.member.service.sms; import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO; import cn.iocoder.yudao.userserver.modules.system.dal.mysql.sms.SysSmsCodeMapper; @@ -63,7 +64,7 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { // 检测手机号是否已被使用 MbrUserDO userByMobile = mbrUserService.getUserByMobile(mobile); if (userByMobile != null){ - throw exception(USER_SMS_CODE_IS_EXISTS); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_IS_EXISTS); } // 发送短信 @@ -75,11 +76,11 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { SysSmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null,null); if (lastSmsCode != null) { if (lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 - throw exception(USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); } if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 - throw exception(USER_SMS_CODE_SEND_TOO_FAST); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_SEND_TOO_FAST); } // TODO 芋艿:提升,每个 IP 每天可发送数量 // TODO 芋艿:提升,每个 IP 每小时可发送数量 @@ -102,7 +103,7 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { // 判断验证码是否已被使用 if (Boolean.TRUE.equals(lastSmsCode.getUsed())) { - throw exception(USER_SMS_CODE_USED); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_USED); } // 使用验证码 @@ -114,7 +115,7 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { public void sendSmsCodeLogin(Long userId) { MbrUserDO user = mbrUserService.getUser(userId); if (user == null){ - throw exception(USER_NOT_EXISTS); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_NOT_EXISTS); } // 发送验证码 this.sendSmsCode(user.getMobile(),SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), getClientIP()); @@ -127,11 +128,11 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { // 若验证码不存在,抛出异常 if (lastSmsCode == null) { - throw exception(USER_SMS_CODE_NOT_FOUND); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_NOT_FOUND); } if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期 - throw exception(USER_SMS_CODE_EXPIRED); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_EXPIRED); } return lastSmsCode; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserService.java similarity index 96% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserService.java index e33978bfe2..be02945c97 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.member.service.user; +package cn.iocoder.yudao.module.member.service.user; import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImpl.java similarity index 96% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImpl.java index ee76906994..de53135986 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImpl.java @@ -1,10 +1,11 @@ -package cn.iocoder.yudao.userserver.modules.member.service.user.impl; +package cn.iocoder.yudao.module.member.service.user; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO; import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserUpdateMobileReqVO; import cn.iocoder.yudao.userserver.modules.member.convert.user.UserProfileConvert; @@ -135,7 +136,7 @@ public class MbrUserServiceImpl implements MbrUserService { SysSmsCodeDO sysSmsCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene()); // 判断旧code是否未被使用,如果是,抛出异常 if (Boolean.FALSE.equals(sysSmsCodeDO.getUsed())){ - throw exception(USER_SMS_CODE_IS_UNUSED); + throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_IS_UNUSED); } // 使用新验证码 diff --git a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/modules/system/service/SysAuthServiceTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java similarity index 95% rename from yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/modules/system/service/SysAuthServiceTest.java rename to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java index 4c8b953c6b..ff1c8a7c65 100644 --- a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/modules/system/service/SysAuthServiceTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.system.service; +package cn.iocoder.yudao.module.member.service.auth; import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; @@ -10,8 +10,8 @@ import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import cn.iocoder.yudao.userserver.BaseDbAndRedisUnitTest; import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper; import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; -import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.MbrAuthResetPasswordReqVO; -import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.MbrAuthUpdatePasswordReqVO; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.MbrAuthResetPasswordReqVO; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.MbrAuthUpdatePasswordReqVO; import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService; import cn.iocoder.yudao.userserver.modules.system.service.auth.impl.SysAuthServiceImpl; import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/package-info.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/package-info.java new file mode 100644 index 0000000000..6223e6e6ca --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.service; diff --git a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/modules/member/service/MbrUserServiceImplTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java similarity index 97% rename from yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/modules/member/service/MbrUserServiceImplTest.java rename to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java index 68f41643b3..ecd728ef08 100644 --- a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/modules/member/service/MbrUserServiceImplTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.member.service; +package cn.iocoder.yudao.module.member.service.user; import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; @@ -122,7 +122,7 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { String oldCode = RandomUtil.randomString(4); codeDO.setMobile(userDO.getMobile()); codeDO.setCode(oldCode); - codeDO.setScene(CHANGE_MOBILE_BY_SMS.getScene()); + codeDO.setScene(SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene()); codeDO.setUsed(Boolean.FALSE); when(sysSmsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO); diff --git a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/BaseDbAndRedisUnitTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbAndRedisUnitTest.java similarity index 98% rename from yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/BaseDbAndRedisUnitTest.java rename to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbAndRedisUnitTest.java index 2669ef49c9..50d19ad4ea 100644 --- a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/BaseDbAndRedisUnitTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbAndRedisUnitTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver; +package cn.iocoder.yudao.module.member.test; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; diff --git a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/BaseDbUnitTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbUnitTest.java similarity index 97% rename from yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/BaseDbUnitTest.java rename to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbUnitTest.java index af8d71a0cb..901d896bf6 100644 --- a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/BaseDbUnitTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbUnitTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver; +package cn.iocoder.yudao.module.member.test; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; diff --git a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/config/RedisTestConfiguration.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/RedisTestConfiguration.java similarity index 96% rename from yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/config/RedisTestConfiguration.java rename to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/RedisTestConfiguration.java index 7164efd874..99838337bb 100644 --- a/yudao-user-server/src/test/java/cn/iocoder/yudao/userserver/config/RedisTestConfiguration.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/RedisTestConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.config; +package cn.iocoder.yudao.module.member.test; import com.github.fppt.jedismock.RedisServer; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; diff --git a/yudao-user-server/src/test/resources/application-unit-test.yaml b/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml similarity index 100% rename from yudao-user-server/src/test/resources/application-unit-test.yaml rename to yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml diff --git a/yudao-user-server/src/test/resources/file/erweima.jpg b/yudao-module-member/yudao-module-member-impl/src/test/resources/file/erweima.jpg similarity index 100% rename from yudao-user-server/src/test/resources/file/erweima.jpg rename to yudao-module-member/yudao-module-member-impl/src/test/resources/file/erweima.jpg diff --git a/yudao-user-server/src/test/resources/logback-spring.xml b/yudao-module-member/yudao-module-member-impl/src/test/resources/logback-spring.xml similarity index 100% rename from yudao-user-server/src/test/resources/logback-spring.xml rename to yudao-module-member/yudao-module-member-impl/src/test/resources/logback-spring.xml diff --git a/yudao-user-server/src/test/resources/sql/clean.sql b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql similarity index 100% rename from yudao-user-server/src/test/resources/sql/clean.sql rename to yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql diff --git a/yudao-user-server/src/test/resources/sql/create_tables.sql b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql similarity index 100% rename from yudao-user-server/src/test/resources/sql/create_tables.sql rename to yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql diff --git a/yudao-server/pom.xml b/yudao-server/pom.xml new file mode 100644 index 0000000000..0040513149 --- /dev/null +++ b/yudao-server/pom.xml @@ -0,0 +1,22 @@ + + + + yudao + cn.iocoder.boot + ${revision} + + 4.0.0 + + yudao-server + jar + + ${artifactId} + + 后端 Server 的主项目,通过引入需要 yudao-module-xxx 的依赖, + 从而实现提供 RESTful API 给 yudao-ui-admin、yudao-ui-user 等前端项目。 + 本质上来说,它就是个空壳(容器)! + + + diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/framework/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/framework/package-info.java deleted file mode 100644 index db25ed2a46..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于整个 yudao-user-server 的 framework 封装 - * - * @author 芋道源码 - */ -package cn.iocoder.yudao.userserver.framework; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/package-info.java deleted file mode 100644 index 148c73cf31..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.userserver.modules.member.controller; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/user/UserProfileConvert.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/user/UserProfileConvert.java deleted file mode 100644 index 6f9d16691a..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/user/UserProfileConvert.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.userserver.modules.member.convert.user; - -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface UserProfileConvert { - - UserProfileConvert INSTANCE = Mappers.getMapper(UserProfileConvert.class); - - MbrUserInfoRespVO convert(MbrUserDO bean); - -} diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 8153487b72..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/package-info.java deleted file mode 100644 index 2334d44bfa..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * weixin 包下,我们放微信相关业务. - * 例如说:微信公众号、等等 - * ps:微信支付,还是放在 pay 包下 - * - * 缩写:wx - */ -package cn.iocoder.yudao.userserver.modules.member; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/package-info.java deleted file mode 100644 index b12c6427a7..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.userserver.modules.member.service; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/package-info.java deleted file mode 100644 index aa4f746ad7..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package cn.iocoder.yudao.userserver.modules.system.controller; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/package-info.java deleted file mode 100644 index d7da621f01..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package cn.iocoder.yudao.userserver.modules.system.convert; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 8153487b72..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/package-info.java deleted file mode 100644 index 0c99dcc95f..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.userserver.modules.system.dal.dataobject; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/package-info.java deleted file mode 100644 index a1bdeadcd9..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.userserver.modules.system.dal.mysql; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/redis/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/redis/package-info.java deleted file mode 100644 index bb50835188..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/redis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.userserver.modules.system.dal.redis; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/package-info.java deleted file mode 100644 index cb0def51fa..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 system 模块的 framework 封装 - * - * @author 芋道源码 - */ -package cn.iocoder.yudao.userserver.modules.system.framework; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/package-info.java deleted file mode 100644 index 89fa9c162e..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * system 包下,我们放通用业务,支撑上层的核心业务。 - * 例如说:用户、部门、权限、数据字典等等 - * - * 缩写:sys - */ -package cn.iocoder.yudao.userserver.modules.system; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/package-info.java deleted file mode 100644 index d1896cb92e..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.userserver.modules.system.service; From 1c266988c5f925472396c2f57f8fb341ed407f50 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Thu, 27 Jan 2022 15:14:00 +0800 Subject: [PATCH 03/47] =?UTF-8?q?=E9=81=97=E6=BC=8F=E4=BA=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/adminserver/BaseDbUnitTest.java | 39 ++ .../definition/BpmFormServiceTest.java | 146 ++++ .../definition/BpmUserGroupServiceTest.java | 134 ++++ .../test/resources/application-unit-test.yaml | 38 ++ .../src/test/resources/application.yaml | 35 + .../src/test/resources/logback-spring.xml | 4 + .../src/test/resources/sql/clean.sql | 38 ++ .../src/test/resources/sql/create_tables.sql | 624 ++++++++++++++++++ 8 files changed, 1058 insertions(+) create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application-unit-test.yaml create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application.yaml create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/logback-spring.xml create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql create mode 100644 yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java new file mode 100644 index 0000000000..5f7daeded1 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver; + +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB 的单元测试 + * + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbUnitTest { + + @Import({ + // DB 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + }) + public static class Application { + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java new file mode 100644 index 0000000000..91a88c2b5c --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java @@ -0,0 +1,146 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper; +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmFormFieldRespDTO; +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmFormServiceImpl; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link BpmFormServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +@Import(BpmFormServiceImpl.class) +public class BpmFormServiceTest extends BaseDbUnitTest { + + @Resource + private BpmFormServiceImpl formService; + + @Resource + private BpmFormMapper formMapper; + + @Test + public void testCreateForm_success() { + // 准备参数 + BpmFormCreateReqVO reqVO = randomPojo(BpmFormCreateReqVO.class, o -> { + o.setConf("{}"); + o.setFields(randomFields()); + }); + + // 调用 + Long formId = formService.createForm(reqVO); + // 断言 + assertNotNull(formId); + // 校验记录的属性是否正确 + BpmFormDO form = formMapper.selectById(formId); + assertPojoEquals(reqVO, form); + } + + @Test + public void testUpdateForm_success() { + // mock 数据 + BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> { + o.setConf("{}"); + o.setFields(randomFields()); + }); + formMapper.insert(dbForm);// @Sql: 先插入出一条存在的数据 + // 准备参数 + BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> { + o.setId(dbForm.getId()); // 设置更新的 ID + o.setConf("{'yudao': 'yuanma'}"); + o.setFields(randomFields()); + }); + + // 调用 + formService.updateForm(reqVO); + // 校验是否更新正确 + BpmFormDO form = formMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, form); + } + + @Test + public void testUpdateForm_notExists() { + // 准备参数 + BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> { + o.setConf("{'yudao': 'yuanma'}"); + o.setFields(randomFields()); + }); + + // 调用, 并断言异常 + assertServiceException(() -> formService.updateForm(reqVO), FORM_NOT_EXISTS); + } + + @Test + public void testDeleteForm_success() { + // mock 数据 + BpmFormDO dbForm = randomPojo(BpmFormDO.class); + formMapper.insert(dbForm);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbForm.getId(); + + // 调用 + formService.deleteForm(id); + // 校验数据不存在了 + assertNull(formMapper.selectById(id)); + } + + @Test + public void testDeleteForm_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> formService.deleteForm(id), FORM_NOT_EXISTS); + } + + @Test + public void testGetFormPage() { + // mock 数据 + BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> { // 等会查询到 + o.setName("芋道源码"); + }); + formMapper.insert(dbForm); + // 测试 name 不匹配 + formMapper.insert(cloneIgnoreId(dbForm, o -> o.setName("源码"))); + // 准备参数 + BpmFormPageReqVO reqVO = new BpmFormPageReqVO(); + reqVO.setName("芋道"); + + // 调用 + PageResult pageResult = formService.getFormPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbForm, pageResult.getList().get(0)); + } + + private List randomFields() { + int size = RandomUtil.randomInt(1, 3); + return Stream.iterate(0, i -> i).limit(size) + .map(i -> JsonUtils.toJsonString(randomPojo(BpmFormFieldRespDTO.class))) + .collect(Collectors.toList()); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java new file mode 100644 index 0000000000..a8704dd611 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java @@ -0,0 +1,134 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; + +import cn.hutool.core.date.DateUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmUserGroupServiceImpl; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; + +/** +* {@link BpmUserGroupServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(BpmUserGroupServiceImpl.class) +public class BpmUserGroupServiceTest extends BaseDbUnitTest { + + @Resource + private BpmUserGroupServiceImpl userGroupService; + + @Resource + private BpmUserGroupMapper userGroupMapper; + + @Test + public void testCreateUserGroup_success() { + // 准备参数 + BpmUserGroupCreateReqVO reqVO = randomPojo(BpmUserGroupCreateReqVO.class); + + // 调用 + Long userGroupId = userGroupService.createUserGroup(reqVO); + // 断言 + assertNotNull(userGroupId); + // 校验记录的属性是否正确 + BpmUserGroupDO userGroup = userGroupMapper.selectById(userGroupId); + assertPojoEquals(reqVO, userGroup); + } + + @Test + public void testUpdateUserGroup_success() { + // mock 数据 + BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class); + userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据 + // 准备参数 + BpmUserGroupUpdateReqVO reqVO = randomPojo(BpmUserGroupUpdateReqVO.class, o -> { + o.setId(dbUserGroup.getId()); // 设置更新的 ID + }); + + // 调用 + userGroupService.updateUserGroup(reqVO); + // 校验是否更新正确 + BpmUserGroupDO userGroup = userGroupMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userGroup); + } + + @Test + public void testUpdateUserGroup_notExists() { + // 准备参数 + BpmUserGroupUpdateReqVO reqVO = randomPojo(BpmUserGroupUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userGroupService.updateUserGroup(reqVO), USER_GROUP_NOT_EXISTS); + } + + @Test + public void testDeleteUserGroup_success() { + // mock 数据 + BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class); + userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserGroup.getId(); + + // 调用 + userGroupService.deleteUserGroup(id); + // 校验数据不存在了 + assertNull(userGroupMapper.selectById(id)); + } + + @Test + public void testDeleteUserGroup_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userGroupService.deleteUserGroup(id), USER_GROUP_NOT_EXISTS); + } + + @Test + public void testGetUserGroupPage() { + // mock 数据 + BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class, o -> { // 等会查询到 + o.setName("芋道源码"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(DateUtils.buildTime(2021, 11, 11)); + }); + userGroupMapper.insert(dbUserGroup); + // 测试 name 不匹配 + userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setName("芋道"))); + // 测试 status 不匹配 + userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setCreateTime(DateUtils.buildTime(2021, 12, 12)))); + // 准备参数 + BpmUserGroupPageReqVO reqVO = new BpmUserGroupPageReqVO(); + reqVO.setName("源码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setBeginCreateTime(DateUtils.buildTime(2021, 11, 10)); + reqVO.setEndCreateTime(DateUtils.buildTime(2021, 11, 12)); + + // 调用 + PageResult pageResult = userGroupService.getUserGroupPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserGroup, pageResult.getList().get(0)); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application-unit-test.yaml b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000000..ddad7ace21 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application-unit-test.yaml @@ -0,0 +1,38 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具 + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application.yaml b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application.yaml new file mode 100644 index 0000000000..2cfbb1abe4 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application.yaml @@ -0,0 +1,35 @@ +spring: + application: + name: yudao-module-bpm-service + + # Jackson 配置项 + jackson: + serialization: + write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 + write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 + write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 + fail-on-empty-beans: false # 允许序列化无属性的 Bean + +# MyBatis Plus 的配置项 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 + global-config: + db-config: + id-type: AUTO # 自增 ID + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + mapper-locations: classpath*:mapper/*.xml + type-aliases-package: ${yudao.core-service.base-package}.modules.*.dal.dataobject + +--- #################### 芋道相关配置 #################### + +yudao: + info: + version: 1.0.0 + base-package: cn.iocoder.yudao.adminserver + core-service: + base-package: cn.iocoder.yudao.coreservice + +debug: false diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/logback-spring.xml b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/logback-spring.xml new file mode 100644 index 0000000000..daf756bff0 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/logback-spring.xml @@ -0,0 +1,4 @@ + + + + diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql new file mode 100644 index 0000000000..b565553f24 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql @@ -0,0 +1,38 @@ +-- inf 开头的 DB +DELETE FROM "inf_config"; +DELETE FROM "inf_file"; +DELETE FROM "inf_job"; +DELETE FROM "inf_job_log"; +DELETE FROM "inf_api_access_log"; +DELETE FROM "inf_api_error_log"; + +-- sys 开头的 DB +DELETE FROM "sys_dept"; +DELETE FROM "sys_dict_data"; +DELETE FROM "sys_role"; +DELETE FROM "sys_role_menu"; +DELETE FROM "sys_menu"; +DELETE FROM "sys_user_role"; +DELETE FROM "sys_dict_type"; +DELETE FROM "sys_user_session"; +DELETE FROM "sys_post"; +DELETE FROM "sys_login_log"; +DELETE FROM "sys_operate_log"; +DELETE FROM "sys_user"; +DELETE FROM "sys_sms_channel"; +DELETE FROM "sys_sms_template"; +DELETE FROM "sys_sms_log"; +DELETE FROM "sys_error_code"; +DELETE FROM "sys_social_user"; +DELETE FROM "sys_tenant"; + +-- pay 开头的 DB +DELETE FROM pay_merchant; +DELETE FROM pay_app; +DELETE FROM pay_channel; +DELETE FROM pay_order; +DELETE FROM pay_refund; + +-- bpm 开头的 DB +DELETE FROM "bpm_form"; +DELETE FROM "bpm_user_group"; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000000..9b2f0d69f1 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql @@ -0,0 +1,624 @@ +-- inf 开头的 DB + +CREATE TABLE IF NOT EXISTS "inf_config" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "group" varchar(50) NOT NULL, + "type" tinyint NOT NULL, + "name" varchar(100) NOT NULL DEFAULT '', + "key" varchar(100) NOT NULL DEFAULT '', + "value" varchar(500) NOT NULL DEFAULT '', + "sensitive" bit NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '参数配置表'; + +CREATE TABLE IF NOT EXISTS "inf_file" ( + "id" varchar(188) NOT NULL, + "type" varchar(63) DEFAULT NULL, + "content" blob NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '文件表'; + +CREATE TABLE IF NOT EXISTS "inf_job" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', + "name" varchar(32) NOT NULL COMMENT '任务名称', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', + "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', + "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") +) COMMENT='定时任务表'; + +CREATE TABLE IF NOT EXISTS "inf_job_log" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', + "job_id" bigint(20) NOT NULL COMMENT '任务编号', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行', + "begin_time" datetime NOT NULL COMMENT '开始执行时间', + "end_time" datetime DEFAULT NULL COMMENT '结束执行时间', + "duration" int(11) DEFAULT NULL COMMENT '执行时长', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "result" varchar(4000) DEFAULT '' COMMENT '结果数据', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") +)COMMENT='定时任务日志表'; + +-- sys 开头的 DB + +CREATE TABLE IF NOT EXISTS "sys_dept" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL DEFAULT '', + "parent_id" bigint NOT NULL DEFAULT '0', + "sort" int NOT NULL DEFAULT '0', + "leader_user_id" bigint DEFAULT NULL, + "phone" varchar(11) DEFAULT NULL, + "email" varchar(50) DEFAULT NULL, + "status" tinyint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '部门表'; + +CREATE TABLE IF NOT EXISTS "sys_dict_data" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "sort" int NOT NULL DEFAULT '0', + "label" varchar(100) NOT NULL DEFAULT '', + "value" varchar(100) NOT NULL DEFAULT '', + "dict_type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典数据表'; + +CREATE TABLE IF NOT EXISTS "sys_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL, + "code" varchar(100) NOT NULL, + "sort" int NOT NULL, + "data_scope" tinyint NOT NULL DEFAULT '1', + "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '', + "status" tinyint NOT NULL, + "type" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '角色信息表'; + +CREATE TABLE IF NOT EXISTS "sys_role_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "role_id" bigint NOT NULL, + "menu_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '角色和菜单关联表'; + +CREATE TABLE IF NOT EXISTS "sys_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(50) NOT NULL, + "permission" varchar(100) NOT NULL DEFAULT '', + "menu_type" tinyint NOT NULL, + "sort" int NOT NULL DEFAULT '0', + "parent_id" bigint NOT NULL DEFAULT '0', + "path" varchar(200) DEFAULT '', + "icon" varchar(100) DEFAULT '#', + "component" varchar(255) DEFAULT NULL, + "status" tinyint NOT NULL DEFAULT '0', + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '菜单权限表'; + +CREATE TABLE IF NOT EXISTS "sys_user_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "role_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp DEFAULT NULL, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp DEFAULT NULL, + "deleted" bit DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '用户和角色关联表'; + +CREATE TABLE IF NOT EXISTS "sys_dict_type" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL DEFAULT '', + "type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + +CREATE TABLE IF NOT EXISTS `sys_user_session` ( + `id` varchar(32) NOT NULL, + `user_id` bigint DEFAULT NULL, + "user_type" tinyint NOT NULL, + `username` varchar(50) NOT NULL DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(512) DEFAULT NULL, + `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '' , + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT '用户在线 Session'; + +CREATE TABLE IF NOT EXISTS "sys_post" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) NOT NULL, + "name" varchar(50) NOT NULL, + "sort" integer NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '岗位信息表'; + +CREATE TABLE IF NOT EXISTS "sys_notice" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "title" varchar(50) NOT NULL COMMENT '公告标题', + "content" text NOT NULL COMMENT '公告内容', + "notice_type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', + "status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除', + "tenant_id" bigint not null default '0', + PRIMARY KEY("id") +) COMMENT '通知公告表'; + +CREATE TABLE IF NOT EXISTS `sys_login_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `log_type` bigint(4) NOT NULL, + "user_id" bigint not null default '0', + "user_type" tinyint NOT NULL, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `username` varchar(50) NOT NULL DEFAULT '', + `result` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `user_agent` varchar(512) NOT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) COMMENT ='系统访问记录'; + +CREATE TABLE IF NOT EXISTS `sys_operate_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `user_id` bigint(20) NOT NULL, + `module` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `operate_type` bigint(4) NOT NULL DEFAULT '0', + `content` varchar(2000) NOT NULL DEFAULT '', + `exts` varchar(512) NOT NULL DEFAULT '', + `request_method` varchar(16) DEFAULT '', + `request_url` varchar(255) DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(200) DEFAULT NULL, + `java_method` varchar(512) NOT NULL DEFAULT '', + `java_method_args` varchar(8000) DEFAULT '', + `start_time` datetime NOT NULL, + `duration` int(11) NOT NULL, + `result_code` int(11) NOT NULL DEFAULT '0', + `result_msg` varchar(512) DEFAULT '', + `result_data` varchar(4000) DEFAULT '', + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT ='操作日志记录'; + +CREATE TABLE IF NOT EXISTS "sys_user" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "username" varchar(30) not null, + "password" varchar(100) not null default '', + "nickname" varchar(30) not null, + "remark" varchar(500) default null, + "dept_id" bigint default null, + "post_ids" varchar(255) default null, + "email" varchar(50) default '', + "mobile" varchar(11) default '', + "sex" tinyint default '0', + "avatar" varchar(100) default '', + "status" tinyint not null default '0', + "login_ip" varchar(50) default '', + "login_date" timestamp default null, + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) comment '用户信息表'; + +CREATE TABLE IF NOT EXISTS "inf_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT 'API 访问日志表'; + +CREATE TABLE IF NOT EXISTS "inf_api_error_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT '系统异常日志'; + +CREATE TABLE IF NOT EXISTS "sys_sms_channel" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "signature" varchar(10) NOT NULL, + "code" varchar(63) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_key" varchar(63) NOT NULL, + "api_secret" varchar(63) DEFAULT NULL, + "callback_url" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信渠道'; + +CREATE TABLE IF NOT EXISTS "sys_sms_template" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL, + "status" tinyint NOT NULL, + "code" varchar(63) NOT NULL, + "name" varchar(63) NOT NULL, + "content" varchar(255) NOT NULL, + "params" varchar(255) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_template_id" varchar(63) NOT NULL, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信模板'; + +CREATE TABLE IF NOT EXISTS "sys_sms_log" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "template_id" bigint NOT NULL, + "template_code" varchar(63) NOT NULL, + "template_type" tinyint NOT NULL, + "template_content" varchar(255) NOT NULL, + "template_params" varchar(255) NOT NULL, + "api_template_id" varchar(63) NOT NULL, + "mobile" varchar(11) NOT NULL, + "user_id" bigint DEFAULT '0', + "user_type" tinyint DEFAULT '0', + "send_status" tinyint NOT NULL DEFAULT '0', + "send_time" timestamp DEFAULT NULL, + "send_code" int DEFAULT NULL, + "send_msg" varchar(255) DEFAULT NULL, + "api_send_code" varchar(63) DEFAULT NULL, + "api_send_msg" varchar(255) DEFAULT NULL, + "api_request_id" varchar(255) DEFAULT NULL, + "api_serial_no" varchar(255) DEFAULT NULL, + "receive_status" tinyint NOT NULL DEFAULT '0', + "receive_time" timestamp DEFAULT NULL, + "api_receive_code" varchar(63) DEFAULT NULL, + "api_receive_msg" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信日志'; + +CREATE TABLE IF NOT EXISTS "sys_error_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL DEFAULT '0', + "application_name" varchar(50) NOT NULL, + "code" int NOT NULL DEFAULT '0', + "message" varchar(512) NOT NULL DEFAULT '', + "memo" varchar(512) DEFAULT '', + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '错误码表'; + +CREATE TABLE IF NOT EXISTS "sys_social_user" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL DEFAULT '0', + "type" tinyint NOT NULL, + "openid" varchar(32) NOT NULL, + "token" varchar(256) DEFAULT NULL, + "union_id" varchar(32) NOT NULL, + "raw_token_info" varchar(1024) NOT NULL, + "nickname" varchar(32) NOT NULL, + "avatar" varchar(255) DEFAULT NULL, + "raw_user_info" varchar(1024) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '社交用户'; + +CREATE TABLE IF NOT EXISTS "sys_tenant" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "contact_name" varchar(255) NOT NULL, + "contact_mobile" varchar(255), + "status" tinyint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '租户'; + + +CREATE TABLE IF NOT EXISTS "pay_merchant" +( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "no" varchar(32) NOT NULL, + "name" varchar(64) NOT NULL, + "short_name" varchar(64) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '支付商户信息'; + +-- bpm 开头的 DB + +CREATE TABLE IF NOT EXISTS "pay_app" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(64) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + `pay_notify_url` varchar(1024) NOT NULL, + `refund_notify_url` varchar(1024) NOT NULL, + `merchant_id` bigint(20) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付应用信息'; + +CREATE TABLE IF NOT EXISTS "pay_channel" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(32) NOT NULL, + "status" tinyint(4) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "fee_rate" double NOT NULL DEFAULT 0, + "merchant_id" bigint(20) NOT NULL, + "app_id" bigint(20) NOT NULL, + "config" varchar(10240) NOT NULL, + "creator" varchar(64) NULL DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) NULL DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付渠道'; + +CREATE TABLE IF NOT EXISTS `pay_order` ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `merchant_id` bigint(20) NOT NULL, + `app_id` bigint(20) NOT NULL, + `channel_id` bigint(20) DEFAULT NULL, + `channel_code` varchar(32) DEFAULT NULL, + `merchant_order_id` varchar(64) NOT NULL, + `subject` varchar(32) NOT NULL, + `body` varchar(128) NOT NULL, + `notify_url` varchar(1024) NOT NULL, + `notify_status` tinyint(4) NOT NULL, + `amount` bigint(20) NOT NULL, + `channel_fee_rate` double DEFAULT 0, + `channel_fee_amount` bigint(20) DEFAULT 0, + `status` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `expire_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `success_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, + `notify_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, + `success_extension_id` bigint(20) DEFAULT NULL COMMENT '支付成功的订单拓展单编号', + `refund_status` tinyint(4) NOT NULL, + `refund_times` tinyint(4) NOT NULL, + `refund_amount` bigint(20) NOT NULL, + `channel_user_id` varchar(255) DEFAULT NULL, + `channel_order_no` varchar(64) DEFAULT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付订单'; + +CREATE TABLE IF NOT EXISTS `pay_refund` ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `merchant_id` bigint(20) NOT NULL, + `app_id` bigint(20) NOT NULL, + `channel_id` bigint(20) NOT NULL, + `channel_code` varchar(32) NOT NULL, + `order_id` bigint(20) NOT NULL, + `trade_no` varchar(64) NOT NULL, + `merchant_order_id` varchar(64) NOT NULL, + `merchant_refund_no` varchar(64) NOT NULL, + `notify_url` varchar(1024) NOT NULL, + `notify_status` tinyint(4) NOT NULL, + `status` tinyint(4) NOT NULL, + `type` tinyint(4) NOT NULL, + `pay_amount` bigint(20) NOT NULL, + `refund_amount` bigint(20) NOT NULL, + `reason` varchar(256) NOT NULL, + `user_ip` varchar(50) NULL DEFAULT NULL, + `channel_order_no` varchar(64) NOT NULL, + `channel_refund_no` varchar(64) NULL DEFAULT NULL, + `channel_error_code` varchar(128) NULL DEFAULT NULL, + `channel_error_msg` varchar(256) NULL DEFAULT NULL, + `channel_extras` varchar(1024) NULL DEFAULT NULL, + `expire_time` datetime(0) NULL DEFAULT NULL, + `success_time` datetime(0) NULL DEFAULT NULL, + `notify_time` datetime(0) NULL DEFAULT NULL, + `creator` varchar(64) NULL DEFAULT '', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) NULL DEFAULT '', + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '退款订单'; + +-- bpm 开头的 DB + +CREATE TABLE IF NOT EXISTS "bpm_form" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "status" tinyint NOT NULL, + "fields" varchar(255) NOT NULL, + "conf" varchar(255) NOT NULL, + "remark" varchar(255), + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '动态表单'; + +CREATE TABLE IF NOT EXISTS "bpm_user_group" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "description" varchar(255) NOT NULL, + "status" tinyint NOT NULL, + "member_user_ids" varchar(255) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") + ) COMMENT '用户组'; From afa0d623dba39989d66e03dbc1e7359076583fd5 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Thu, 27 Jan 2022 22:08:34 +0800 Subject: [PATCH 04/47] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20bpm-core-service=20?= =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 22 + yudao-admin-server/pom.xml | 5 +- yudao-dependencies/pom.xml | 7 +- .../yudao-module-bpm-activiti/pom.xml | 5 +- .../bpm/enums/BpmErrorCodeConstants.java | 4 - .../config/BpmActivitiConfiguration.java | 7 +- .../behavior/BpmActivityBehaviorFactory.java | 6 +- .../behavior/BpmUserTaskActivitiBehavior.java | 10 +- .../impl/BpmTaskAssignRuleServiceImpl.java | 9 +- .../BpmUserTaskActivitiBehaviorTest.java | 12 +- .../src/test/resources/sql/clean.sql | 36 -- .../src/test/resources/sql/create_tables.sql | 608 ------------------ .../yudao-module-bpm-core-service/pom.xml | 6 +- .../yudao-module-bpm-core-service-api/pom.xml | 20 + .../bpm/api/group/BpmUserGroupServiceApi.java | 32 + .../bpm/api/group/dto/BpmUserGroupDTO.java | 17 + .../pom.xml | 35 + .../bpm/api/BpmUserGroupServiceApiImpl.java | 61 ++ .../definition/BpmUserGroupController.java | 0 .../vo/group/BpmUserGroupBaseVO.java | 0 .../vo/group/BpmUserGroupCreateReqVO.java | 0 .../vo/group/BpmUserGroupPageReqVO.java | 15 +- .../vo/group/BpmUserGroupRespVO.java | 0 .../vo/group/BpmUserGroupSimpleRespVO.java | 0 .../vo/group/BpmUserGroupUpdateReqVO.java | 0 .../definition/BpmUserGroupConvert.java | 3 + .../dataobject/definition/BpmUserGroupDO.java | 0 .../mysql/definition/BpmUserGroupMapper.java | 0 .../bpm/enums/BpmErrorCodeConstants.java | 10 + .../definition/BpmUserGroupService.java | 18 - .../impl/BpmUserGroupServiceImpl.java | 27 +- .../yudao/adminserver/BaseDbUnitTest.java | 39 ++ .../definition/BpmUserGroupServiceTest.java | 41 +- .../test/resources/application-unit-test.yaml | 38 ++ .../src/test/resources/application.yaml | 35 + .../src/test/resources/logback-spring.xml | 4 + .../src/test/resources/sql/clean.sql | 2 + .../src/test/resources/sql/create_tables.sql | 14 + 38 files changed, 401 insertions(+), 747 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/pom.xml create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java (63%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java (89%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java (100%) create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java (79%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java (76%) create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java (73%) create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application-unit-test.yaml create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application.yaml create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/logback-spring.xml create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql diff --git a/pom.xml b/pom.xml index 4b7c953e40..61e1b33791 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,9 @@ ${java.version} ${java.version} 3.0.0-M5 + 3.8.0 + 1.18.20 + 1.4.1.Final UTF-8 @@ -52,6 +55,25 @@ maven-surefire-plugin ${maven-surefire-plugin.version} + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + + org.projectlombok + lombok + ${lombok.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 3553b38b2e..be72f792f9 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -49,7 +49,10 @@ cn.iocoder.boot yudao-module-bpm-activiti - + + cn.iocoder.boot + yudao-module-bpm-core-service-impl + cn.iocoder.boot diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index 7aa40966b8..512fefdc3f 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -410,7 +410,12 @@ cn.iocoder.boot - yudao-module-bpm-core-service + yudao-module-bpm-core-service-impl + ${revision} + + + cn.iocoder.boot + yudao-module-bpm-core-service-api ${revision} diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml b/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml index 775bdf6c04..a131ab0890 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml @@ -19,6 +19,10 @@ cn.iocoder.boot yudao-core-service + + cn.iocoder.boot + yudao-module-bpm-core-service-api + cn.iocoder.boot @@ -26,5 +30,4 @@ test - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java index e2a0ff3d7a..771a04f5e7 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java @@ -57,8 +57,4 @@ public interface BpmErrorCodeConstants { ErrorCode FORM_NOT_EXISTS = new ErrorCode(1009010000, "动态表单不存在"); ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1009010000, "表单项({}) 和 ({}) 使用了相同的字段名({})"); - // ========== 用户组模块 1-009-011-000 ========== - ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1009011000, "用户组不存在"); - ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1009011001, "名字为【{}】的用户组已被禁用"); - } diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index 4e0938d462..72210a3af2 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -6,11 +6,10 @@ import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.Bp import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; -import org.activiti.api.runtime.shared.identity.UserGroupManager; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; @@ -60,14 +59,14 @@ public class BpmActivitiConfiguration { public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskAssignRuleService taskRuleService, SysPermissionCoreService permissionCoreService, SysDeptCoreService deptCoreService, - BpmUserGroupService userGroupService, + BpmUserGroupServiceApi userGroupServiceApi, SysUserCoreService userCoreService, List scripts) { BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService); bpmActivityBehaviorFactory.setPermissionCoreService(permissionCoreService); bpmActivityBehaviorFactory.setDeptCoreService(deptCoreService); - bpmActivityBehaviorFactory.setUserGroupService(userGroupService); + bpmActivityBehaviorFactory.setUserGroupServiceApi(userGroupServiceApi); bpmActivityBehaviorFactory.setUserCoreService(userCoreService); bpmActivityBehaviorFactory.setScripts(scripts); return bpmActivityBehaviorFactory; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java index 2107fb72b4..c426a23ee7 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; @@ -34,7 +34,7 @@ public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { @Setter private SysDeptCoreService deptCoreService; @Setter - private BpmUserGroupService userGroupService; + private BpmUserGroupServiceApi userGroupServiceApi; @Setter private SysUserCoreService userCoreService; @Setter @@ -46,7 +46,7 @@ public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { userTaskActivityBehavior.setBpmTaskRuleService(bpmTaskRuleService); userTaskActivityBehavior.setPermissionCoreService(permissionCoreService); userTaskActivityBehavior.setDeptCoreService(deptCoreService); - userTaskActivityBehavior.setUserGroupService(userGroupService); + userTaskActivityBehavior.setUserGroupServiceApi(userGroupServiceApi); userTaskActivityBehavior.setSysUserCoreService(userCoreService); userTaskActivityBehavior.setScripts(scripts); return userTaskActivityBehavior; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java index 69624d793d..e2beba8e03 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java @@ -4,11 +4,11 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; @@ -30,7 +30,7 @@ import java.util.*; import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.TASK_ASSIGN_SCRIPT_NOT_EXISTS; import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.TASK_CREATE_FAIL_NO_CANDIDATE_USER; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.*; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; @@ -53,7 +53,7 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { @Setter private SysDeptCoreService deptCoreService; @Setter - private BpmUserGroupService userGroupService; + private BpmUserGroupServiceApi userGroupServiceApi; @Setter private SysUserCoreService sysUserCoreService; /** @@ -156,7 +156,7 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { } private Set calculateTaskCandidateUsersByUserGroup(TaskEntity task, BpmTaskAssignRuleDO rule) { - List userGroups = userGroupService.getUserGroupList(rule.getOptions()); + List userGroups = userGroupServiceApi.getUserGroupList(rule.getOptions()); Set userIds = new HashSet<>(); userGroups.forEach(bpmUserGroupDO -> userIds.addAll(bpmUserGroupDO.getMemberUserIds())); return userIds; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java index 82afa944c0..dac572f1a1 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java @@ -1,8 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; @@ -15,8 +13,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRu import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; - +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysPostCoreService; @@ -65,7 +62,7 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { @Resource private SysUserCoreService userCoreService; @Resource - private BpmUserGroupService userGroupService; + private BpmUserGroupServiceApi userGroupServiceApi; @Resource private SysDictDataCoreService dictDataCoreService; @@ -191,7 +188,7 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER.getType())) { userCoreService.validUsers(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER_GROUP.getType())) { - userGroupService.validUserGroups(options); + userGroupServiceApi.validUserGroups(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.SCRIPT.getType())) { dictDataCoreService.validDictDatas(SysDictTypeConstants.BPM_TASK_ASSIGN_SCRIPT, CollectionUtils.convertSet(options, String::valueOf)); diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java index 8212b28c08..b9b9a1475b 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java @@ -2,12 +2,12 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; @@ -44,7 +44,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { @Mock private SysDeptCoreService deptCoreService; @Mock - private BpmUserGroupService userGroupService; + private BpmUserGroupServiceApi userGroupServiceApi; @Mock private SysUserCoreService userCoreService; @@ -135,9 +135,9 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) .setType(BpmTaskAssignRuleTypeEnum.USER_GROUP.getType()); // mock 方法 - BpmUserGroupDO userGroup1 = randomPojo(BpmUserGroupDO.class, o -> o.setMemberUserIds(asSet(11L, 12L))); - BpmUserGroupDO userGroup2 = randomPojo(BpmUserGroupDO.class, o -> o.setMemberUserIds(asSet(21L, 22L))); - when(userGroupService.getUserGroupList(eq(rule.getOptions()))).thenReturn(Arrays.asList(userGroup1, userGroup2)); + BpmUserGroupDTO userGroup1 = randomPojo(BpmUserGroupDTO.class, o -> o.setMemberUserIds(asSet(11L, 12L))); + BpmUserGroupDTO userGroup2 = randomPojo(BpmUserGroupDTO.class, o -> o.setMemberUserIds(asSet(21L, 22L))); + when(userGroupServiceApi.getUserGroupList(eq(rule.getOptions()))).thenReturn(Arrays.asList(userGroup1, userGroup2)); mockGetUserMap(asSet(11L, 12L, 21L, 22L)); // 调用 diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql index b565553f24..c14acfe995 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql @@ -1,38 +1,2 @@ --- inf 开头的 DB -DELETE FROM "inf_config"; -DELETE FROM "inf_file"; -DELETE FROM "inf_job"; -DELETE FROM "inf_job_log"; -DELETE FROM "inf_api_access_log"; -DELETE FROM "inf_api_error_log"; - --- sys 开头的 DB -DELETE FROM "sys_dept"; -DELETE FROM "sys_dict_data"; -DELETE FROM "sys_role"; -DELETE FROM "sys_role_menu"; -DELETE FROM "sys_menu"; -DELETE FROM "sys_user_role"; -DELETE FROM "sys_dict_type"; -DELETE FROM "sys_user_session"; -DELETE FROM "sys_post"; -DELETE FROM "sys_login_log"; -DELETE FROM "sys_operate_log"; -DELETE FROM "sys_user"; -DELETE FROM "sys_sms_channel"; -DELETE FROM "sys_sms_template"; -DELETE FROM "sys_sms_log"; -DELETE FROM "sys_error_code"; -DELETE FROM "sys_social_user"; -DELETE FROM "sys_tenant"; - --- pay 开头的 DB -DELETE FROM pay_merchant; -DELETE FROM pay_app; -DELETE FROM pay_channel; -DELETE FROM pay_order; -DELETE FROM pay_refund; - -- bpm 开头的 DB DELETE FROM "bpm_form"; -DELETE FROM "bpm_user_group"; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql index 9b2f0d69f1..8b6433e698 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql @@ -1,597 +1,3 @@ --- inf 开头的 DB - -CREATE TABLE IF NOT EXISTS "inf_config" ( - "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "group" varchar(50) NOT NULL, - "type" tinyint NOT NULL, - "name" varchar(100) NOT NULL DEFAULT '', - "key" varchar(100) NOT NULL DEFAULT '', - "value" varchar(500) NOT NULL DEFAULT '', - "sensitive" bit NOT NULL, - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '参数配置表'; - -CREATE TABLE IF NOT EXISTS "inf_file" ( - "id" varchar(188) NOT NULL, - "type" varchar(63) DEFAULT NULL, - "content" blob NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '文件表'; - -CREATE TABLE IF NOT EXISTS "inf_job" ( - "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', - "name" varchar(32) NOT NULL COMMENT '任务名称', - "status" tinyint(4) NOT NULL COMMENT '任务状态', - "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', - "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', - "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', - "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', - "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', - "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', - "creator" varchar(64) DEFAULT '' COMMENT '创建者', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - "updater" varchar(64) DEFAULT '' COMMENT '更新者', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', - PRIMARY KEY ("id") -) COMMENT='定时任务表'; - -CREATE TABLE IF NOT EXISTS "inf_job_log" ( - "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', - "job_id" bigint(20) NOT NULL COMMENT '任务编号', - "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', - "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', - "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行', - "begin_time" datetime NOT NULL COMMENT '开始执行时间', - "end_time" datetime DEFAULT NULL COMMENT '结束执行时间', - "duration" int(11) DEFAULT NULL COMMENT '执行时长', - "status" tinyint(4) NOT NULL COMMENT '任务状态', - "result" varchar(4000) DEFAULT '' COMMENT '结果数据', - "creator" varchar(64) DEFAULT '' COMMENT '创建者', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - "updater" varchar(64) DEFAULT '' COMMENT '更新者', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', - PRIMARY KEY ("id") -)COMMENT='定时任务日志表'; - --- sys 开头的 DB - -CREATE TABLE IF NOT EXISTS "sys_dept" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(30) NOT NULL DEFAULT '', - "parent_id" bigint NOT NULL DEFAULT '0', - "sort" int NOT NULL DEFAULT '0', - "leader_user_id" bigint DEFAULT NULL, - "phone" varchar(11) DEFAULT NULL, - "email" varchar(50) DEFAULT NULL, - "status" tinyint NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '部门表'; - -CREATE TABLE IF NOT EXISTS "sys_dict_data" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "sort" int NOT NULL DEFAULT '0', - "label" varchar(100) NOT NULL DEFAULT '', - "value" varchar(100) NOT NULL DEFAULT '', - "dict_type" varchar(100) NOT NULL DEFAULT '', - "status" tinyint NOT NULL DEFAULT '0', - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '字典数据表'; - -CREATE TABLE IF NOT EXISTS "sys_role" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(30) NOT NULL, - "code" varchar(100) NOT NULL, - "sort" int NOT NULL, - "data_scope" tinyint NOT NULL DEFAULT '1', - "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '', - "status" tinyint NOT NULL, - "type" tinyint NOT NULL, - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '角色信息表'; - -CREATE TABLE IF NOT EXISTS "sys_role_menu" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "role_id" bigint NOT NULL, - "menu_id" bigint NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '角色和菜单关联表'; - -CREATE TABLE IF NOT EXISTS "sys_menu" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(50) NOT NULL, - "permission" varchar(100) NOT NULL DEFAULT '', - "menu_type" tinyint NOT NULL, - "sort" int NOT NULL DEFAULT '0', - "parent_id" bigint NOT NULL DEFAULT '0', - "path" varchar(200) DEFAULT '', - "icon" varchar(100) DEFAULT '#', - "component" varchar(255) DEFAULT NULL, - "status" tinyint NOT NULL DEFAULT '0', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '菜单权限表'; - -CREATE TABLE IF NOT EXISTS "sys_user_role" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "role_id" bigint NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp DEFAULT NULL, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp DEFAULT NULL, - "deleted" bit DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '用户和角色关联表'; - -CREATE TABLE IF NOT EXISTS "sys_dict_type" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(100) NOT NULL DEFAULT '', - "type" varchar(100) NOT NULL DEFAULT '', - "status" tinyint NOT NULL DEFAULT '0', - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '字典类型表'; - -CREATE TABLE IF NOT EXISTS `sys_user_session` ( - `id` varchar(32) NOT NULL, - `user_id` bigint DEFAULT NULL, - "user_type" tinyint NOT NULL, - `username` varchar(50) NOT NULL DEFAULT '', - `user_ip` varchar(50) DEFAULT NULL, - `user_agent` varchar(512) DEFAULT NULL, - `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '' , - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY (`id`) -) COMMENT '用户在线 Session'; - -CREATE TABLE IF NOT EXISTS "sys_post" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "code" varchar(64) NOT NULL, - "name" varchar(50) NOT NULL, - "sort" integer NOT NULL, - "status" tinyint NOT NULL, - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '岗位信息表'; - -CREATE TABLE IF NOT EXISTS "sys_notice" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "title" varchar(50) NOT NULL COMMENT '公告标题', - "content" text NOT NULL COMMENT '公告内容', - "notice_type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', - "status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', - "creator" varchar(64) DEFAULT '' COMMENT '创建者', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - "updater" varchar(64) DEFAULT '' COMMENT '更新者', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - "deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除', - "tenant_id" bigint not null default '0', - PRIMARY KEY("id") -) COMMENT '通知公告表'; - -CREATE TABLE IF NOT EXISTS `sys_login_log` ( - `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `log_type` bigint(4) NOT NULL, - "user_id" bigint not null default '0', - "user_type" tinyint NOT NULL, - `trace_id` varchar(64) NOT NULL DEFAULT '', - `username` varchar(50) NOT NULL DEFAULT '', - `result` tinyint(4) NOT NULL, - `user_ip` varchar(50) NOT NULL, - `user_agent` varchar(512) NOT NULL, - `creator` varchar(64) DEFAULT '', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`) -) COMMENT ='系统访问记录'; - -CREATE TABLE IF NOT EXISTS `sys_operate_log` ( - `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `trace_id` varchar(64) NOT NULL DEFAULT '', - `user_id` bigint(20) NOT NULL, - `module` varchar(50) NOT NULL, - `name` varchar(50) NOT NULL, - `operate_type` bigint(4) NOT NULL DEFAULT '0', - `content` varchar(2000) NOT NULL DEFAULT '', - `exts` varchar(512) NOT NULL DEFAULT '', - `request_method` varchar(16) DEFAULT '', - `request_url` varchar(255) DEFAULT '', - `user_ip` varchar(50) DEFAULT NULL, - `user_agent` varchar(200) DEFAULT NULL, - `java_method` varchar(512) NOT NULL DEFAULT '', - `java_method_args` varchar(8000) DEFAULT '', - `start_time` datetime NOT NULL, - `duration` int(11) NOT NULL, - `result_code` int(11) NOT NULL DEFAULT '0', - `result_msg` varchar(512) DEFAULT '', - `result_data` varchar(4000) DEFAULT '', - `creator` varchar(64) DEFAULT '', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT '0', - "tenant_id" bigint not null default '0', - PRIMARY KEY (`id`) -) COMMENT ='操作日志记录'; - -CREATE TABLE IF NOT EXISTS "sys_user" ( - "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, - "username" varchar(30) not null, - "password" varchar(100) not null default '', - "nickname" varchar(30) not null, - "remark" varchar(500) default null, - "dept_id" bigint default null, - "post_ids" varchar(255) default null, - "email" varchar(50) default '', - "mobile" varchar(11) default '', - "sex" tinyint default '0', - "avatar" varchar(100) default '', - "status" tinyint not null default '0', - "login_ip" varchar(50) default '', - "login_date" timestamp default null, - "creator" varchar(64) default '', - "create_time" timestamp not null default current_timestamp, - "updater" varchar(64) default '', - "update_time" timestamp not null default current_timestamp, - "deleted" bit not null default false, - "tenant_id" bigint not null default '0', - primary key ("id") -) comment '用户信息表'; - -CREATE TABLE IF NOT EXISTS "inf_api_access_log" ( - "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, - "trace_id" varchar(64) not null default '', - "user_id" bigint not null default '0', - "user_type" tinyint not null default '0', - "application_name" varchar(50) not null, - "request_method" varchar(16) not null default '', - "request_url" varchar(255) not null default '', - "request_params" varchar(8000) not null default '', - "user_ip" varchar(50) not null, - "user_agent" varchar(512) not null, - "begin_time" timestamp not null, - "end_time" timestamp not null, - "duration" integer not null, - "result_code" integer not null default '0', - "result_msg" varchar(512) default '', - "creator" varchar(64) default '', - "create_time" timestamp not null default current_timestamp, - "updater" varchar(64) default '', - "update_time" timestamp not null default current_timestamp, - "deleted" bit not null default false, - "tenant_id" bigint not null default '0', - primary key ("id") -) COMMENT 'API 访问日志表'; - -CREATE TABLE IF NOT EXISTS "inf_api_error_log" ( - "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, - "trace_id" varchar(64) not null, - "user_id" bigint not null default '0', - "user_type" tinyint not null default '0', - "application_name" varchar(50) not null, - "request_method" varchar(16) not null, - "request_url" varchar(255) not null, - "request_params" varchar(8000) not null, - "user_ip" varchar(50) not null, - "user_agent" varchar(512) not null, - "exception_time" timestamp not null, - "exception_name" varchar(128) not null default '', - "exception_message" clob not null, - "exception_root_cause_message" clob not null, - "exception_stack_trace" clob not null, - "exception_class_name" varchar(512) not null, - "exception_file_name" varchar(512) not null, - "exception_method_name" varchar(512) not null, - "exception_line_number" integer not null, - "process_status" tinyint not null, - "process_time" timestamp default null, - "process_user_id" bigint default '0', - "creator" varchar(64) default '', - "create_time" timestamp not null default current_timestamp, - "updater" varchar(64) default '', - "update_time" timestamp not null default current_timestamp, - "deleted" bit not null default false, - "tenant_id" bigint not null default '0', - primary key ("id") -) COMMENT '系统异常日志'; - -CREATE TABLE IF NOT EXISTS "sys_sms_channel" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "signature" varchar(10) NOT NULL, - "code" varchar(63) NOT NULL, - "status" tinyint NOT NULL, - "remark" varchar(255) DEFAULT NULL, - "api_key" varchar(63) NOT NULL, - "api_secret" varchar(63) DEFAULT NULL, - "callback_url" varchar(255) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '短信渠道'; - -CREATE TABLE IF NOT EXISTS "sys_sms_template" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "type" tinyint NOT NULL, - "status" tinyint NOT NULL, - "code" varchar(63) NOT NULL, - "name" varchar(63) NOT NULL, - "content" varchar(255) NOT NULL, - "params" varchar(255) NOT NULL, - "remark" varchar(255) DEFAULT NULL, - "api_template_id" varchar(63) NOT NULL, - "channel_id" bigint NOT NULL, - "channel_code" varchar(63) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '短信模板'; - -CREATE TABLE IF NOT EXISTS "sys_sms_log" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "channel_id" bigint NOT NULL, - "channel_code" varchar(63) NOT NULL, - "template_id" bigint NOT NULL, - "template_code" varchar(63) NOT NULL, - "template_type" tinyint NOT NULL, - "template_content" varchar(255) NOT NULL, - "template_params" varchar(255) NOT NULL, - "api_template_id" varchar(63) NOT NULL, - "mobile" varchar(11) NOT NULL, - "user_id" bigint DEFAULT '0', - "user_type" tinyint DEFAULT '0', - "send_status" tinyint NOT NULL DEFAULT '0', - "send_time" timestamp DEFAULT NULL, - "send_code" int DEFAULT NULL, - "send_msg" varchar(255) DEFAULT NULL, - "api_send_code" varchar(63) DEFAULT NULL, - "api_send_msg" varchar(255) DEFAULT NULL, - "api_request_id" varchar(255) DEFAULT NULL, - "api_serial_no" varchar(255) DEFAULT NULL, - "receive_status" tinyint NOT NULL DEFAULT '0', - "receive_time" timestamp DEFAULT NULL, - "api_receive_code" varchar(63) DEFAULT NULL, - "api_receive_msg" varchar(255) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '短信日志'; - -CREATE TABLE IF NOT EXISTS "sys_error_code" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "type" tinyint NOT NULL DEFAULT '0', - "application_name" varchar(50) NOT NULL, - "code" int NOT NULL DEFAULT '0', - "message" varchar(512) NOT NULL DEFAULT '', - "memo" varchar(512) DEFAULT '', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '错误码表'; - -CREATE TABLE IF NOT EXISTS "sys_social_user" ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "user_type" tinyint NOT NULL DEFAULT '0', - "type" tinyint NOT NULL, - "openid" varchar(32) NOT NULL, - "token" varchar(256) DEFAULT NULL, - "union_id" varchar(32) NOT NULL, - "raw_token_info" varchar(1024) NOT NULL, - "nickname" varchar(32) NOT NULL, - "avatar" varchar(255) DEFAULT NULL, - "raw_user_info" varchar(1024) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '社交用户'; - -CREATE TABLE IF NOT EXISTS "sys_tenant" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(63) NOT NULL, - "contact_name" varchar(255) NOT NULL, - "contact_mobile" varchar(255), - "status" tinyint NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '租户'; - - -CREATE TABLE IF NOT EXISTS "pay_merchant" -( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "no" varchar(32) NOT NULL, - "name" varchar(64) NOT NULL, - "short_name" varchar(64) NOT NULL, - "status" tinyint NOT NULL, - "remark" varchar(255) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '支付商户信息'; - --- bpm 开头的 DB - -CREATE TABLE IF NOT EXISTS "pay_app" ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(64) NOT NULL, - "status" tinyint NOT NULL, - "remark" varchar(255) DEFAULT NULL, - `pay_notify_url` varchar(1024) NOT NULL, - `refund_notify_url` varchar(1024) NOT NULL, - `merchant_id` bigint(20) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '支付应用信息'; - -CREATE TABLE IF NOT EXISTS "pay_channel" ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "code" varchar(32) NOT NULL, - "status" tinyint(4) NOT NULL, - "remark" varchar(255) DEFAULT NULL, - "fee_rate" double NOT NULL DEFAULT 0, - "merchant_id" bigint(20) NOT NULL, - "app_id" bigint(20) NOT NULL, - "config" varchar(10240) NOT NULL, - "creator" varchar(64) NULL DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) NULL DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '支付渠道'; - -CREATE TABLE IF NOT EXISTS `pay_order` ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `merchant_id` bigint(20) NOT NULL, - `app_id` bigint(20) NOT NULL, - `channel_id` bigint(20) DEFAULT NULL, - `channel_code` varchar(32) DEFAULT NULL, - `merchant_order_id` varchar(64) NOT NULL, - `subject` varchar(32) NOT NULL, - `body` varchar(128) NOT NULL, - `notify_url` varchar(1024) NOT NULL, - `notify_status` tinyint(4) NOT NULL, - `amount` bigint(20) NOT NULL, - `channel_fee_rate` double DEFAULT 0, - `channel_fee_amount` bigint(20) DEFAULT 0, - `status` tinyint(4) NOT NULL, - `user_ip` varchar(50) NOT NULL, - `expire_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `success_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, - `notify_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, - `success_extension_id` bigint(20) DEFAULT NULL COMMENT '支付成功的订单拓展单编号', - `refund_status` tinyint(4) NOT NULL, - `refund_times` tinyint(4) NOT NULL, - `refund_amount` bigint(20) NOT NULL, - `channel_user_id` varchar(255) DEFAULT NULL, - `channel_order_no` varchar(64) DEFAULT NULL, - `creator` varchar(64) DEFAULT '', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '', - `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '支付订单'; - -CREATE TABLE IF NOT EXISTS `pay_refund` ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `merchant_id` bigint(20) NOT NULL, - `app_id` bigint(20) NOT NULL, - `channel_id` bigint(20) NOT NULL, - `channel_code` varchar(32) NOT NULL, - `order_id` bigint(20) NOT NULL, - `trade_no` varchar(64) NOT NULL, - `merchant_order_id` varchar(64) NOT NULL, - `merchant_refund_no` varchar(64) NOT NULL, - `notify_url` varchar(1024) NOT NULL, - `notify_status` tinyint(4) NOT NULL, - `status` tinyint(4) NOT NULL, - `type` tinyint(4) NOT NULL, - `pay_amount` bigint(20) NOT NULL, - `refund_amount` bigint(20) NOT NULL, - `reason` varchar(256) NOT NULL, - `user_ip` varchar(50) NULL DEFAULT NULL, - `channel_order_no` varchar(64) NOT NULL, - `channel_refund_no` varchar(64) NULL DEFAULT NULL, - `channel_error_code` varchar(128) NULL DEFAULT NULL, - `channel_error_msg` varchar(256) NULL DEFAULT NULL, - `channel_extras` varchar(1024) NULL DEFAULT NULL, - `expire_time` datetime(0) NULL DEFAULT NULL, - `success_time` datetime(0) NULL DEFAULT NULL, - `notify_time` datetime(0) NULL DEFAULT NULL, - `creator` varchar(64) NULL DEFAULT '', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) NULL DEFAULT '', - `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '退款订单'; - -- bpm 开头的 DB CREATE TABLE IF NOT EXISTS "bpm_form" ( @@ -608,17 +14,3 @@ CREATE TABLE IF NOT EXISTS "bpm_form" ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY ("id") ) COMMENT '动态表单'; - -CREATE TABLE IF NOT EXISTS "bpm_user_group" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(63) NOT NULL, - "description" varchar(255) NOT NULL, - "status" tinyint NOT NULL, - "member_user_ids" varchar(255) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") - ) COMMENT '用户组'; diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml b/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml index b61a9db277..aa81886dbc 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml @@ -8,7 +8,11 @@ ${revision} 4.0.0 - + pom + + yudao-module-bpm-core-service-api + yudao-module-bpm-core-service-impl + yudao-module-bpm-core-service diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml new file mode 100644 index 0000000000..fb5a4f08e8 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml @@ -0,0 +1,20 @@ + + + + yudao-module-bpm-core-service + cn.iocoder.boot + ${revision} + + 4.0.0 + + yudao-module-bpm-core-service-api + + + + org.projectlombok + lombok + + + \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java new file mode 100644 index 0000000000..c83486970d --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.coreservice.modules.bpm.api.group; + +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * Bpm 用户组 API 接口 + * + * @author jason + */ +public interface BpmUserGroupServiceApi { + + /** + * 获得用户组列表 + * + * @param ids 编号 + * @return 用户组列表 + */ + List getUserGroupList(Collection ids); + + /** + * 校验用户组们是否有效。如下情况,视为无效: + * 1. 用户组编号不存在 + * 2. 用户组被禁用 + * + * @param ids 用户组编号数组 + */ + void validUserGroups(Set ids); +} diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java new file mode 100644 index 0000000000..b85042527a --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto; + +import lombok.Data; + +import java.util.Set; +/** + * Bpm 用户组 DTO + * + * @author jason + */ +@Data +public class BpmUserGroupDTO { + /** + * 成员用户编号数组 + */ + private Set memberUserIds; +} diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/pom.xml b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/pom.xml new file mode 100644 index 0000000000..1712458f63 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/pom.xml @@ -0,0 +1,35 @@ + + + + yudao-module-bpm-core-service + cn.iocoder.boot + ${revision} + + 4.0.0 + + yudao-module-bpm-core-service-impl + + + cn.iocoder.boot + yudao-spring-boot-starter-web + + + cn.iocoder.boot + yudao-spring-boot-starter-security + + + cn.iocoder.boot + yudao-spring-boot-starter-mybatis + + + cn.iocoder.boot + yudao-module-bpm-core-service-api + + + cn.iocoder.boot + yudao-spring-boot-starter-test + + + \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java new file mode 100644 index 0000000000..b789ba9e1b --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.api; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmUserGroupConvert; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_IS_DISABLE; +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * Bpm 用户组 API 接口 实现类 + * + * @author jason + */ +@Service +public class BpmUserGroupServiceApiImpl implements BpmUserGroupServiceApi { + + @Resource + private BpmUserGroupMapper userGroupMapper; + + @Override + public List getUserGroupList(Collection ids) { + return BpmUserGroupConvert.INSTANCE.convertList3(userGroupMapper.selectBatchIds(ids)); + } + + + @Override + public void validUserGroups(Set ids) { + + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得用户组信息 + List userGroups = userGroupMapper.selectBatchIds(ids); + Map userGroupMap = CollectionUtils.convertMap(userGroups, BpmUserGroupDO::getId); + // 校验 + ids.forEach(id -> { + BpmUserGroupDO userGroup = userGroupMap.get(id); + if (userGroup == null) { + throw ServiceExceptionUtil.exception(USER_GROUP_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { + throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); + } + }); + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java similarity index 63% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java index 6a4497afc5..303a3491ea 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java @@ -1,12 +1,15 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group; -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import java.util.Date; @ApiModel("用户组分页 Request VO") @Data @@ -20,11 +23,11 @@ public class BpmUserGroupPageReqVO extends PageParam { @ApiModelProperty(value = "状态", example = "1") private Integer status; - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @ApiModelProperty(value = "开始创建时间") private Date beginCreateTime; - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @ApiModelProperty(value = "结束创建时间") private Date endCreateTime; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java index 4e7cd997f2..7f7e9afc8d 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.B import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; @@ -34,4 +35,6 @@ public interface BpmUserGroupConvert { @Named("convertList2") List convertList2(List list); + + List convertList3(List list); } diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java new file mode 100644 index 0000000000..5fd230cefd --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java @@ -0,0 +1,10 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +public interface BpmErrorCodeConstants { + // ========== 用户组模块 1-009-011-000 ========== + ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1009011000, "用户组不存在"); + ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1009011001, "名字为【{}】的用户组已被禁用"); + +} diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java similarity index 79% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java index f1fd4debe1..5d848656b5 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java @@ -46,14 +46,6 @@ public interface BpmUserGroupService { */ BpmUserGroupDO getUserGroup(Long id); - /** - * 获得用户组列表 - * - * @param ids 编号 - * @return 用户组列表 - */ - List getUserGroupList(Collection ids); - /** * 获得指定状态的用户组列表 * @@ -69,14 +61,4 @@ public interface BpmUserGroupService { * @return 用户组分页 */ PageResult getUserGroupPage(BpmUserGroupPageReqVO pageReqVO); - - /** - * 校验用户组们是否有效。如下情况,视为无效: - * 1. 用户组编号不存在 - * 2. 用户组被禁用 - * - * @param ids 用户组编号数组 - */ - void validUserGroups(Set ids); - } diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java similarity index 76% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java index 8a342b0a24..7de593cdfe 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUse import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.springframework.stereotype.Service; @@ -64,7 +65,7 @@ public class BpmUserGroupServiceImpl implements BpmUserGroupService { private void validateUserGroupExists(Long id) { if (userGroupMapper.selectById(id) == null) { - throw exception(USER_GROUP_NOT_EXISTS); + throw ServiceExceptionUtil.exception(USER_GROUP_NOT_EXISTS); } } @@ -73,10 +74,6 @@ public class BpmUserGroupServiceImpl implements BpmUserGroupService { return userGroupMapper.selectById(id); } - @Override - public List getUserGroupList(Collection ids) { - return userGroupMapper.selectBatchIds(ids); - } @Override public List getUserGroupListByStatus(Integer status) { @@ -88,24 +85,4 @@ public class BpmUserGroupServiceImpl implements BpmUserGroupService { return userGroupMapper.selectPage(pageReqVO); } - @Override - public void validUserGroups(Set ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得用户组信息 - List userGroups = userGroupMapper.selectBatchIds(ids); - Map userGroupMap = CollectionUtils.convertMap(userGroups, BpmUserGroupDO::getId); - // 校验 - ids.forEach(id -> { - BpmUserGroupDO userGroup = userGroupMap.get(id); - if (userGroup == null) { - throw exception(USER_GROUP_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { - throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); - } - }); - } - } diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java new file mode 100644 index 0000000000..5f7daeded1 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver; + +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB 的单元测试 + * + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbUnitTest { + + @Import({ + // DB 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + }) + public static class Application { + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java similarity index 73% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java index a8704dd611..ff16838167 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; -import cn.hutool.core.date.DateUtil; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; @@ -11,6 +10,9 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmUserG import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import cn.iocoder.yudao.framework.test.core.util.AssertUtils; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -18,11 +20,6 @@ import javax.annotation.Resource; import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.*; /** * {@link BpmUserGroupServiceImpl} 的单元测试类 @@ -41,24 +38,24 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest { @Test public void testCreateUserGroup_success() { // 准备参数 - BpmUserGroupCreateReqVO reqVO = randomPojo(BpmUserGroupCreateReqVO.class); + BpmUserGroupCreateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupCreateReqVO.class); // 调用 Long userGroupId = userGroupService.createUserGroup(reqVO); // 断言 - assertNotNull(userGroupId); + Assertions.assertNotNull(userGroupId); // 校验记录的属性是否正确 BpmUserGroupDO userGroup = userGroupMapper.selectById(userGroupId); - assertPojoEquals(reqVO, userGroup); + AssertUtils.assertPojoEquals(reqVO, userGroup); } @Test public void testUpdateUserGroup_success() { // mock 数据 - BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class); + BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class); userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据 // 准备参数 - BpmUserGroupUpdateReqVO reqVO = randomPojo(BpmUserGroupUpdateReqVO.class, o -> { + BpmUserGroupUpdateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupUpdateReqVO.class, o -> { o.setId(dbUserGroup.getId()); // 设置更新的 ID }); @@ -66,22 +63,22 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest { userGroupService.updateUserGroup(reqVO); // 校验是否更新正确 BpmUserGroupDO userGroup = userGroupMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, userGroup); + AssertUtils.assertPojoEquals(reqVO, userGroup); } @Test public void testUpdateUserGroup_notExists() { // 准备参数 - BpmUserGroupUpdateReqVO reqVO = randomPojo(BpmUserGroupUpdateReqVO.class); + BpmUserGroupUpdateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupUpdateReqVO.class); // 调用, 并断言异常 - assertServiceException(() -> userGroupService.updateUserGroup(reqVO), USER_GROUP_NOT_EXISTS); + AssertUtils.assertServiceException(() -> userGroupService.updateUserGroup(reqVO), USER_GROUP_NOT_EXISTS); } @Test public void testDeleteUserGroup_success() { // mock 数据 - BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class); + BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class); userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbUserGroup.getId(); @@ -89,22 +86,22 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest { // 调用 userGroupService.deleteUserGroup(id); // 校验数据不存在了 - assertNull(userGroupMapper.selectById(id)); + Assertions.assertNull(userGroupMapper.selectById(id)); } @Test public void testDeleteUserGroup_notExists() { // 准备参数 - Long id = randomLongId(); + Long id = RandomUtils.randomLongId(); // 调用, 并断言异常 - assertServiceException(() -> userGroupService.deleteUserGroup(id), USER_GROUP_NOT_EXISTS); + AssertUtils.assertServiceException(() -> userGroupService.deleteUserGroup(id), USER_GROUP_NOT_EXISTS); } @Test public void testGetUserGroupPage() { // mock 数据 - BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class, o -> { // 等会查询到 + BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class, o -> { // 等会查询到 o.setName("芋道源码"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setCreateTime(DateUtils.buildTime(2021, 11, 11)); @@ -126,9 +123,9 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest { // 调用 PageResult pageResult = userGroupService.getUserGroupPage(reqVO); // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbUserGroup, pageResult.getList().get(0)); + Assertions.assertEquals(1, pageResult.getTotal()); + Assertions.assertEquals(1, pageResult.getList().size()); + AssertUtils.assertPojoEquals(dbUserGroup, pageResult.getList().get(0)); } } diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application-unit-test.yaml b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000000..ddad7ace21 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application-unit-test.yaml @@ -0,0 +1,38 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具 + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application.yaml b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application.yaml new file mode 100644 index 0000000000..2cfbb1abe4 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application.yaml @@ -0,0 +1,35 @@ +spring: + application: + name: yudao-module-bpm-service + + # Jackson 配置项 + jackson: + serialization: + write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 + write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 + write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 + fail-on-empty-beans: false # 允许序列化无属性的 Bean + +# MyBatis Plus 的配置项 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 + global-config: + db-config: + id-type: AUTO # 自增 ID + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + mapper-locations: classpath*:mapper/*.xml + type-aliases-package: ${yudao.core-service.base-package}.modules.*.dal.dataobject + +--- #################### 芋道相关配置 #################### + +yudao: + info: + version: 1.0.0 + base-package: cn.iocoder.yudao.adminserver + core-service: + base-package: cn.iocoder.yudao.coreservice + +debug: false diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/logback-spring.xml b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/logback-spring.xml new file mode 100644 index 0000000000..daf756bff0 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/logback-spring.xml @@ -0,0 +1,4 @@ + + + + diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql new file mode 100644 index 0000000000..45b43e0e8f --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql @@ -0,0 +1,2 @@ +-- bpm 开头的 DB +DELETE FROM "bpm_user_group"; diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000000..da5b9a6130 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql @@ -0,0 +1,14 @@ +-- bpm 开头的 DB +CREATE TABLE IF NOT EXISTS "bpm_user_group" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "description" varchar(255) NOT NULL, + "status" tinyint NOT NULL, + "member_user_ids" varchar(255) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") + ) COMMENT '用户组'; From 928b7dbe23338127834ae6023d2a5ae32a16308e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 28 Jan 2022 20:21:01 +0800 Subject: [PATCH 05/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=202=EF=BC=9A=E5=9C=A8=20yudao-admin-server=20?= =?UTF-8?q?=E4=B8=AD=EF=BC=8C=E5=BC=95=E5=85=A5=20yudao-module-member=20?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-admin-server/pom.xml | 7 + .../adminserver/AdminServerApplication.java | 3 +- .../security/SecurityConfiguration.java | 19 ++- .../config/BpmActivitiConfiguration.java | 14 +- .../service/auth/impl/SysAuthServiceImpl.java | 18 +-- .../service/user/impl/SysUserServiceImpl.java | 3 +- .../src/main/resources/application-local.yaml | 12 ++ .../src/main/resources/application.yaml | 18 ++- .../service/file/InfFileCoreService.java | 1 - .../sms/impl/SysSmsCoreServiceImpl.java | 13 +- .../config/YudaoMybatisAutoConfiguration.java | 3 +- .../YudaoSecurityAutoConfiguration.java | 23 ++- .../YudaoWebSecurityConfigurerAdapter.java | 32 +++-- .../filter/JWTAuthenticationTokenFilter.java | 17 ++- .../handler/LogoutSuccessHandlerImpl.java | 12 +- .../service/SecurityAuthFrameworkService.java | 10 +- .../core/service/SecurityAuthService.java | 43 ++++++ .../core/service/SecurityAuthServiceImpl.java | 64 +++++++++ .../core/filter/ApiAccessLogFilter.java | 10 +- .../framework/web/config/WebProperties.java | 53 ++++--- .../web/config/YudaoWebAutoConfiguration.java | 17 ++- .../user/{MemberUserApi.java => UserApi.java} | 6 +- ...emberUserRespDTO.java => UserRespDTO.java} | 2 +- .../yudao-module-member-impl/pom.xml | 35 +---- .../yudao/module/member/api/package-info.java | 1 + .../module/member/api/user/UserApiImpl.java | 30 ++++ .../admin/address/package-info.java | 1 + .../controller/admin/user/package-info.java | 1 + .../controller/app/address/package-info.java | 1 + .../app/auth/AppAuthController.java | 9 +- .../app/auth/vo/AppAuthCheckCodeReqVO.java | 4 +- .../auth/vo/AppAuthResetPasswordReqVO.java | 1 + ...SmsReqVO.java => AppAuthSendSmsReqVO.java} | 4 +- .../auth/vo/AppAuthUpdatePasswordReqVO.java | 1 + .../app/user/AppUserController.java | 37 +++-- .../app/user/vo/AppUserUpdateMobileReqVO.java | 2 + .../{SysAuthConvert.java => AuthConvert.java} | 10 +- .../member/convert/user/UserConvert.java | 7 +- .../user/{MemberUserDO.java => UserDO.java} | 6 +- .../dal/mysql/sms/SysSmsCodeMapper.java | 3 +- .../member/dal/mysql/user/MbrUserMapper.java | 19 --- .../member/dal/mysql/user/UserMapper.java | 19 +++ .../yudao/module/member/dal/package-info.java | 2 + .../module/member/dal/redis/package-info.java | 3 + .../security/SecurityConfiguration.java | 29 ---- .../{SysAuthService.java => AuthService.java} | 19 +-- ...hServiceImpl.java => AuthServiceImpl.java} | 135 +++++++++--------- .../module/member/service/package-info.java | 1 - .../member/service/sms/SysSmsCodeService.java | 5 +- .../service/sms/SysSmsCodeServiceImpl.java | 41 +++--- .../{MbrUserService.java => UserService.java} | 30 ++-- ...rServiceImpl.java => UserServiceImpl.java} | 97 ++++++------- .../service/auth/SysAuthServiceTest.java | 42 +++--- .../module/member/service/package-info.java | 1 - .../service/user/MbrUserServiceImplTest.java | 60 +++----- .../member/test/BaseDbAndRedisUnitTest.java | 1 - .../test/resources/application-unit-test.yaml | 5 + .../src/main/resources/application-dev.yaml | 13 ++ .../src/main/resources/application.yaml | 7 +- 59 files changed, 622 insertions(+), 460 deletions(-) create mode 100644 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthService.java create mode 100644 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthServiceImpl.java rename yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/{MemberUserApi.java => UserApi.java} (60%) rename yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/{MemberUserRespDTO.java => UserRespDTO.java} (93%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/package-info.java create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApiImpl.java create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/package-info.java create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/package-info.java create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/package-info.java rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/{AppSendSmsReqVO.java => AppAuthSendSmsReqVO.java} (88%) rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/{SysAuthConvert.java => AuthConvert.java} (63%) rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/{MemberUserDO.java => UserDO.java} (90%) delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MbrUserMapper.java create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/UserMapper.java delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/security/SecurityConfiguration.java rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/{SysAuthService.java => AuthService.java} (74%) rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/{SysAuthServiceImpl.java => AuthServiceImpl.java} (72%) delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/package-info.java rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/{MbrUserService.java => UserService.java} (57%) rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/{MbrUserServiceImpl.java => UserServiceImpl.java} (51%) delete mode 100644 yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/package-info.java diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 847e626a03..40943697fe 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -17,6 +17,13 @@ https://github.com/YunaiV/ruoyi-vue-pro + + + cn.iocoder.boot + yudao-module-member-impl + ${revision} + + cn.iocoder.boot diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java index 810869768e..35f6a1d8db 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java @@ -4,7 +4,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} 和 ${yudao.core-service.base-package} -@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}", "${yudao.core-service.base-package}"}) +@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}", "${yudao.core-service.base-package}", + "${yudao.info.member-package}"}) // TODO 芋艿:重构 public class AdminServerApplication { public static void main(String[] args) { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/security/SecurityConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/security/SecurityConfiguration.java index e99c106b45..a5086b92e3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/security/SecurityConfiguration.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/security/SecurityConfiguration.java @@ -23,19 +23,28 @@ public class SecurityConfiguration { public Customizer.ExpressionInterceptUrlRegistry> authorizeRequestsCustomizer() { return registry -> { // 验证码的接口 - registry.antMatchers(api("/system/captcha/**")).anonymous(); + registry.antMatchers(buildAdminApi("/system/captcha/**")).anonymous(); // 获得租户编号的接口 - registry.antMatchers(api("/system/tenant/get-id-by-name")).anonymous(); + registry.antMatchers(buildAdminApi("/system/tenant/get-id-by-name")).anonymous(); // Spring Boot Admin Server 的安全配置 registry.antMatchers(adminSeverContextPath).anonymous() .antMatchers(adminSeverContextPath + "/**").anonymous(); // 短信回调 API - registry.antMatchers(api("/system/sms/callback/**")).anonymous(); + registry.antMatchers(buildAdminApi("/system/sms/callback/**")).anonymous(); + + // 设置 App API 无需认证 + registry.antMatchers(buildAppApi("/**")); }; } - private String api(String url) { - return webProperties.getApiPrefix() + url; + private String buildAdminApi(String url) { + // TODO 芋艿:多模块 + return webProperties.getAdminApi().getPrefix() + url; + } + + private String buildAppApi(String url) { + // TODO 芋艿:多模块 + return webProperties.getAppApi().getPrefix() + url; } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index ccb7cad788..c18893f169 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -11,10 +11,12 @@ import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; import org.activiti.api.runtime.shared.identity.UserGroupManager; +import org.activiti.core.common.spring.identity.ActivitiUserGroupManagerImpl; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.userdetails.UserDetailsService; import java.util.Collections; import java.util.List; @@ -28,7 +30,15 @@ import static org.activiti.spring.boot.ProcessEngineAutoConfiguration.BEHAVIOR_F public class BpmActivitiConfiguration { /** - * BPM 模块的 ProcessEngineConfigurationConfigurer 实现类,主要设置各种监听器、用户组管理 + * 空用户组的 Bean + */ + @Bean + public UserGroupManager userGroupManager() { + return new EmptyUserGroupManager(); + } + + /** + * BPM 模块的 ProcessEngineConfigurationConfigurer 实现类,主要设置各种监听器 */ @Bean public ProcessEngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( @@ -36,8 +46,6 @@ public class BpmActivitiConfiguration { return configuration -> { // 注册监听器,例如说 BpmActivitiEventListener configuration.setEventListeners(Collections.singletonList(taskActivitiEventListener)); - // 用户组 - configuration.setUserGroupManager(new EmptyUserGroupManager()); }; } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java index 438bd1e75a..3f795f83da 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java @@ -60,8 +60,6 @@ import static java.util.Collections.singleton; @Slf4j public class SysAuthServiceImpl implements SysAuthService { - private static final UserTypeEnum USER_TYPE_ENUM = UserTypeEnum.ADMIN; - @Resource @Lazy // 延迟加载,因为存在相互依赖的问题 private AuthenticationManager authenticationManager; @@ -83,7 +81,6 @@ public class SysAuthServiceImpl implements SysAuthService { @Resource private SysSocialCoreService socialService; - @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 获取 username 对应的 SysUserDO @@ -216,7 +213,7 @@ public class SysAuthServiceImpl implements SysAuthService { // 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错 String unionId = socialService.getAuthUserUnionId(authUser); - List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, USER_TYPE_ENUM); + List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, getUserType()); if (CollUtil.isEmpty(socialUsers)) { throw exception(AUTH_THIRD_LOGIN_NOT_BIND); } @@ -232,7 +229,7 @@ public class SysAuthServiceImpl implements SysAuthService { LoginUser loginUser = this.buildLoginUser(user); // 绑定社交用户(更新) - socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, USER_TYPE_ENUM); + socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); // 缓存登录用户到 Redis 中,返回 sessionId 编号 return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); @@ -248,7 +245,7 @@ public class SysAuthServiceImpl implements SysAuthService { LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); // 绑定社交用户(新增) - socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, USER_TYPE_ENUM); + socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); // 缓存登录用户到 Redis 中,返回 sessionId 编号 return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); @@ -261,7 +258,7 @@ public class SysAuthServiceImpl implements SysAuthService { Assert.notNull(authUser, "授权用户不为空"); // 绑定社交用户(新增) - socialService.bindSocialUser(userId, reqVO.getType(), authUser, USER_TYPE_ENUM); + socialService.bindSocialUser(userId, reqVO.getType(), authUser, getUserType()); } @Override @@ -277,12 +274,17 @@ public class SysAuthServiceImpl implements SysAuthService { this.createLogoutLog(loginUser.getId(), loginUser.getUsername()); } + @Override + public UserTypeEnum getUserType() { + return UserTypeEnum.ADMIN; + } + private void createLogoutLog(Long userId, String username) { SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); reqDTO.setUserId(userId); - reqDTO.setUserType(USER_TYPE_ENUM.getValue()); + reqDTO.setUserType(getUserType().getValue()); reqDTO.setUsername(username); reqDTO.setUserAgent(ServletUtils.getUserAgent()); reqDTO.setUserIp(ServletUtils.getClientIP()); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java index d5b2ad18ba..98ca0160eb 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java @@ -23,6 +23,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -47,7 +48,7 @@ public class SysUserServiceImpl implements SysUserService { @Value("${sys.user.init-password:yudaoyuanma}") private String userInitPassword; - @Resource + @Resource(name = "sysUserMapper") // userMapper 存在重名 private SysUserMapper userMapper; @Resource diff --git a/yudao-admin-server/src/main/resources/application-local.yaml b/yudao-admin-server/src/main/resources/application-local.yaml index 9932671dcb..411f2a6a33 100644 --- a/yudao-admin-server/src/main/resources/application-local.yaml +++ b/yudao-admin-server/src/main/resources/application-local.yaml @@ -174,6 +174,18 @@ logging: cn.iocoder.yudao.coreservice.modules.system.dal.mysql: debug cn.iocoder.yudao.coreservice.modules.tool.dal.mysql: debug +--- #################### 微信公众号相关配置 #################### +wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 + mp: + # 公众号配置(必填) + app-id: wx041349c6f39b268b + secret: 5abee519483bc9f8cb37ce280e814bd0 + # 存储配置,解决 AccessToken 的跨节点的共享 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wx # Redis Key 的前缀 TODO 芋艿:解决下 Redis key 管理的配置 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + --- #################### 芋道相关配置 #################### # 芋道配置项,设置当前项目所有自定义的配置 diff --git a/yudao-admin-server/src/main/resources/application.yaml b/yudao-admin-server/src/main/resources/application.yaml index 7652dd5be3..09bbc33ada 100644 --- a/yudao-admin-server/src/main/resources/application.yaml +++ b/yudao-admin-server/src/main/resources/application.yaml @@ -48,11 +48,17 @@ yudao: info: version: 1.0.0 base-package: cn.iocoder.yudao.adminserver + member-package: cn.iocoder.yudao.module.member core-service: base-package: cn.iocoder.yudao.coreservice web: - api-prefix: /api - controller-package: ${yudao.info.base-package} + admin-api: + prefix: /api + controller: ${yudao.info.base-package} + app-api: + prefix: /app-api + controller: cn.iocoder.yudao.module.member.controller.app + swagger: title: 管理后台 description: 提供管理员管理的所有功能 @@ -72,7 +78,13 @@ yudao: - cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants tenant: # 多租户相关配置项 tables: # 配置需要开启多租户的表;如果实体已经继承 TenantBaseDO 类,则无需重复配置 - url: + url: ## TODO 芋艿:迁移到 web 配置项下, admin-ui: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址 + sms-code: # 短信验证码相关的配置项 + expire-times: 10m + send-frequency: 1m + send-maximum-quantity-per-day: 10 + begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 + end-code: 9999 # 这里配置 9999 的原因是,测试方便。 debug: false diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java index a594bcef4a..8ba8b57fe7 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java @@ -9,7 +9,6 @@ import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; */ public interface InfFileCoreService { - /** * 保存文件,并返回文件的访问路径 * diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java index 3893ba3403..787d2a1d92 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java @@ -2,8 +2,6 @@ package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; -import cn.iocoder.yudao.coreservice.modules.member.service.user.MbrUserCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; @@ -43,8 +41,6 @@ public class SysSmsCoreServiceImpl implements SysSmsCoreService { @Resource private SysUserCoreService sysUserCoreService; @Resource - private MbrUserCoreService mbrUserCoreService; - @Resource private SysSmsTemplateCoreService smsTemplateCoreService; @Resource private SysSmsLogCoreService smsLogCoreService; @@ -72,10 +68,11 @@ public class SysSmsCoreServiceImpl implements SysSmsCoreService { public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams) { // 如果 mobile 为空,则加载用户编号对应的手机号 if (StrUtil.isEmpty(mobile)) { - MbrUserDO user = mbrUserCoreService.getUser(userId); - if (user != null) { - mobile = user.getMobile(); - } +// MbrUserDO user = mbrUserCoreService.getUser(userId); +// if (user != null) { +// mobile = user.getMobile(); +// } + // TODO 芋艿:重构 } // 执行发送 return this.sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java index b03fc58e4c..d589ac7688 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java @@ -15,7 +15,8 @@ import org.springframework.context.annotation.Configuration; * @author 芋道源码 */ @Configuration -@MapperScan(value = {"${yudao.info.base-package}", "${yudao.core-service.base-package}"}, annotationClass = Mapper.class, +@MapperScan(value = {"${yudao.info.base-package}", "${yudao.core-service.base-package}", "${yudao.info.member-package}"}, + annotationClass = Mapper.class, lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 public class YudaoMybatisAutoConfiguration { diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java index 684cfed9a4..ae8b12422e 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java @@ -7,6 +7,9 @@ import cn.iocoder.yudao.framework.security.core.handler.AccessDeniedHandlerImpl; import cn.iocoder.yudao.framework.security.core.handler.AuthenticationEntryPointImpl; import cn.iocoder.yudao.framework.security.core.handler.LogoutSuccessHandlerImpl; import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; +import cn.iocoder.yudao.framework.security.core.service.SecurityAuthService; +import cn.iocoder.yudao.framework.security.core.service.SecurityAuthServiceImpl; +import cn.iocoder.yudao.framework.web.config.WebProperties; import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; import org.springframework.beans.factory.config.MethodInvokingFactoryBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -20,6 +23,7 @@ import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import javax.annotation.Resource; +import java.util.List; /** * Spring Security 自动配置类,主要用于相关组件的配置 @@ -29,7 +33,7 @@ import javax.annotation.Resource; * * @author 芋道源码 */ -@Configuration +@Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(SecurityProperties.class) public class YudaoSecurityAutoConfiguration { @@ -64,8 +68,8 @@ public class YudaoSecurityAutoConfiguration { * 退出处理类 Bean */ @Bean - public LogoutSuccessHandler logoutSuccessHandler(SecurityAuthFrameworkService securityFrameworkService) { - return new LogoutSuccessHandlerImpl(securityProperties, securityFrameworkService); + public LogoutSuccessHandler logoutSuccessHandler(SecurityAuthService securityAuthService) { + return new LogoutSuccessHandlerImpl(securityProperties, securityAuthService); } /** @@ -83,9 +87,18 @@ public class YudaoSecurityAutoConfiguration { * Token 认证过滤器 Bean */ @Bean - public JWTAuthenticationTokenFilter authenticationTokenFilter(SecurityAuthFrameworkService securityFrameworkService, + public JWTAuthenticationTokenFilter authenticationTokenFilter(SecurityAuthService securityAuthService, GlobalExceptionHandler globalExceptionHandler) { - return new JWTAuthenticationTokenFilter(securityProperties, securityFrameworkService, globalExceptionHandler); + return new JWTAuthenticationTokenFilter(securityProperties, securityAuthService, globalExceptionHandler); + } + + /** + * 安全认证的 Service Bean + */ + @Bean + public SecurityAuthService securityAuthService(List securityFrameworkServices, + WebProperties webProperties) { + return new SecurityAuthServiceImpl(securityFrameworkServices, webProperties); } /** diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java index a0f1c87cc9..a00b2c2a66 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java @@ -65,13 +65,15 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap */ @Resource private JWTAuthenticationTokenFilter authenticationTokenFilter; + /** * 自定义的权限映射 Bean * * @see #configure(HttpSecurity) */ @Resource - private Customizer.ExpressionInterceptUrlRegistry> authorizeRequestsCustomizer; + private Customizer.ExpressionInterceptUrlRegistry> + authorizeRequestsCustomizer; /** * 由于 Spring Security 创建 AuthenticationManager 对象时,没声明 @Bean 注解,导致无法被注入 @@ -89,8 +91,8 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService) - .passwordEncoder(passwordEncoder); + auth + .userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); } /** @@ -123,16 +125,16 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap // 一堆自定义的 Spring Security 处理器 .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint) .accessDeniedHandler(accessDeniedHandler).and() - .logout().logoutUrl(api("/logout")).logoutSuccessHandler(logoutSuccessHandler); // 登出 + .logout().logoutUrl(buildAdminApi("/logout")).logoutSuccessHandler(logoutSuccessHandler); // 登出 // 设置每个请求的权限 ①:全局共享规则 httpSecurity.authorizeRequests() // 登录的接口,可匿名访问 - .antMatchers(api("/login")).anonymous() + .antMatchers(buildAdminApi("/login")).anonymous() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // 文件的获取接口,可匿名访问 - .antMatchers(api("/infra/file/get/**")).anonymous() + .antMatchers(buildAdminApi("/infra/file/get/**")).anonymous() // Swagger 接口文档 .antMatchers("/swagger-ui.html").anonymous() .antMatchers("/swagger-resources/**").anonymous() @@ -143,11 +145,11 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap .antMatchers("/actuator/**").anonymous() // Druid 监控 TODO 芋艿:等对接了 druid admin 后,在调整下。 .antMatchers("/druid/**").anonymous() - // oAuth2 auth2/login/gitee - .antMatchers(api("/auth2/login/**")).anonymous() - .antMatchers(api("/auth2/authorization/**")).anonymous() + // oAuth2 auth2/login/gitee TODO 芋艿:貌似可以删除 + .antMatchers(buildAdminApi("/auth2/login/**")).anonymous() + .antMatchers(buildAdminApi("/auth2/authorization/**")).anonymous() .antMatchers("/api/callback/**").anonymous() - // 设置每个请求的权限 ②:每个项目的自定义规则 + // 设置每个请求的权限 ②:每个项目的自定义规则 TODO 芋艿:改造成多个,方便每个模块自定义规则 .and().authorizeRequests(authorizeRequestsCustomizer) // 设置每个请求的权限 ③:兜底规则,必须认证 .authorizeRequests().anyRequest().authenticated() @@ -156,8 +158,14 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); } - private String api(String url) { - return webProperties.getApiPrefix() + url; + private String buildAdminApi(String url) { + // TODO 芋艿:多模块 + return webProperties.getAdminApi().getPrefix() + url; + } + + private String buildAppApi(String url) { + // TODO 芋艿:多模块 + return webProperties.getAppApi().getPrefix() + url; } } diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/JWTAuthenticationTokenFilter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/JWTAuthenticationTokenFilter.java index c83318b0d7..61685e9029 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/JWTAuthenticationTokenFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/JWTAuthenticationTokenFilter.java @@ -2,17 +2,15 @@ package cn.iocoder.yudao.framework.security.core.filter; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; +import cn.iocoder.yudao.framework.security.core.service.SecurityAuthService; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; -import javax.annotation.Resource; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -30,7 +28,7 @@ public class JWTAuthenticationTokenFilter extends OncePerRequestFilter { private final SecurityProperties securityProperties; - private final SecurityAuthFrameworkService authService; + private final SecurityAuthService authService; private final GlobalExceptionHandler globalExceptionHandler; @@ -42,10 +40,10 @@ public class JWTAuthenticationTokenFilter extends OncePerRequestFilter { if (StrUtil.isNotEmpty(token)) { try { // 验证 token 有效性 - LoginUser loginUser = authService.verifyTokenAndRefresh(token); + LoginUser loginUser = authService.verifyTokenAndRefresh(request, token); // 模拟 Login 功能,方便日常开发调试 if (loginUser == null) { - loginUser = this.mockLoginUser(token); + loginUser = this.mockLoginUser(request, token); } // 设置当前用户 if (loginUser != null) { @@ -67,10 +65,11 @@ public class JWTAuthenticationTokenFilter extends OncePerRequestFilter { * * 注意,在线上环境下,一定要关闭该功能!!! * + * @param request 请求 * @param token 模拟的 token,格式为 {@link SecurityProperties#getTokenSecret()} + 用户编号 * @return 模拟的 LoginUser */ - private LoginUser mockLoginUser(String token) { + private LoginUser mockLoginUser(HttpServletRequest request, String token) { if (!securityProperties.getMockEnable()) { return null; } @@ -79,7 +78,7 @@ public class JWTAuthenticationTokenFilter extends OncePerRequestFilter { return null; } Long userId = Long.valueOf(token.substring(securityProperties.getMockSecret().length())); - return authService.mockLogin(userId); + return authService.mockLogin(request, userId); } } diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/LogoutSuccessHandlerImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/LogoutSuccessHandlerImpl.java index 1bf8091be6..e61b351c21 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/LogoutSuccessHandlerImpl.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/LogoutSuccessHandlerImpl.java @@ -2,16 +2,14 @@ package cn.iocoder.yudao.framework.security.core.handler; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.security.config.SecurityProperties; -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; +import cn.iocoder.yudao.framework.security.config.SecurityProperties; +import cn.iocoder.yudao.framework.security.core.service.SecurityAuthService; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import lombok.AllArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; -import org.springframework.stereotype.Component; -import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -26,14 +24,14 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { private final SecurityProperties securityProperties; - private final SecurityAuthFrameworkService securityFrameworkService; + private final SecurityAuthService authService; @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { // 执行退出 String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader()); if (StrUtil.isNotBlank(token)) { - securityFrameworkService.logout(token); + authService.logout(request, token); } // 返回成功 ServletUtils.writeJSON(response, CommonResult.success(null)); diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthFrameworkService.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthFrameworkService.java index 28c8f6dc0c..1f76e161f8 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthFrameworkService.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthFrameworkService.java @@ -1,10 +1,11 @@ package cn.iocoder.yudao.framework.security.core.service; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; import org.springframework.security.core.userdetails.UserDetailsService; /** - * Security 框架 Auth Service 接口,定义 security 组件需要的功能 + * Security 框架 Auth Service 接口,定义不同用户类型的 {@link UserTypeEnum} 需要实现的方法 * * @author 芋道源码 */ @@ -34,4 +35,11 @@ public interface SecurityAuthFrameworkService extends UserDetailsService { */ void logout(String token); + /** + * 获得用户类型。每个用户类型,对应一个 SecurityAuthFrameworkService 实现类。 + * + * @return 用户类型 + */ + UserTypeEnum getUserType(); + } diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthService.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthService.java new file mode 100644 index 0000000000..4fee9cd0d0 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthService.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.framework.security.core.service; + +import cn.iocoder.yudao.framework.security.core.LoginUser; + +import javax.servlet.http.HttpServletRequest; + +/** + * 安全认证的 Service 接口,对 security 组件提供统一的 Auth 相关的方法。 + * 主要是会基于 {@link HttpServletRequest} 参数,匹配对应的 {@link SecurityAuthFrameworkService} 实现,然后调用其方法。 + * 因此,在方法的定义上,和 {@link SecurityAuthFrameworkService} 差不多。 + * + * @author 芋道源码 + */ +public interface SecurityAuthService { + + /** + * 校验 token 的有效性,并获取用户信息 + * 通过后,刷新 token 的过期时间 + * + * @param request 请求 + * @param token token + * @return 用户信息 + */ + LoginUser verifyTokenAndRefresh(HttpServletRequest request, String token); + + /** + * 模拟指定用户编号的 LoginUser + * + * @param request 请求 + * @param userId 用户编号 + * @return 登录用户 + */ + LoginUser mockLogin(HttpServletRequest request, Long userId); + + /** + * 基于 token 退出登录 + * + * @param request 请求 + * @param token token + */ + void logout(HttpServletRequest request, String token); + +} diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthServiceImpl.java new file mode 100644 index 0000000000..d9ab8eb0e1 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthServiceImpl.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.framework.security.core.service; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.web.config.WebProperties; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 安全认证的 Service 实现类,基于请求地址,计算到对应的 {@link UserTypeEnum} 枚举,从而拿到对应的 {@link SecurityAuthFrameworkService} 实现 + * + * @author 芋道源码 + */ +public class SecurityAuthServiceImpl implements SecurityAuthService { + + private final Map services = new HashMap<>(); + private final WebProperties properties; + + public SecurityAuthServiceImpl(List serviceList, WebProperties properties) { + serviceList.forEach(service -> services.put(service.getUserType(), service)); + this.properties = properties; + } + + @Override + public LoginUser verifyTokenAndRefresh(HttpServletRequest request, String token) { + return selectService(request).verifyTokenAndRefresh(token); + } + + @Override + public LoginUser mockLogin(HttpServletRequest request, Long userId) { + return selectService(request).mockLogin(userId); + } + + @Override + public void logout(HttpServletRequest request, String token) { + selectService(request).logout(token); + } + + private SecurityAuthFrameworkService selectService(HttpServletRequest request) { + // 第一步,获得用户类型 + UserTypeEnum userType = getUserType(request); + // 第二步,获得 SecurityAuthFrameworkService + SecurityAuthFrameworkService service = services.get(userType); + Assert.notNull(service, "URI({}) 用户类型({}) 找不到 SecurityAuthFrameworkService 实现类", + request.getRequestURI(), userType); + return service; + } + + private UserTypeEnum getUserType(HttpServletRequest request) { + if (request.getRequestURI().startsWith(properties.getAdminApi().getPrefix())) { + return UserTypeEnum.ADMIN; + } + if (request.getRequestURI().startsWith(properties.getAppApi().getPrefix())) { + return UserTypeEnum.MEMBER; + } + throw new IllegalArgumentException(StrUtil.format("URI({}) 找不到匹配的用户类型", request.getRequestURI())); + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java index 57133c8409..3295e34c15 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.apilog.core.filter; import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.CommonResult; @@ -25,6 +26,8 @@ import java.io.IOException; import java.util.Date; import java.util.Map; +import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.*; + /** * API 访问日志 Filter * @@ -42,7 +45,8 @@ public class ApiAccessLogFilter extends OncePerRequestFilter { @Override protected boolean shouldNotFilter(HttpServletRequest request) { // 只过滤 API 请求的地址 - return !request.getRequestURI().startsWith(webProperties.getApiPrefix()); + return !StrUtil.startWithAny(request.getRequestURI(), webProperties.getAppApi().getPrefix(), + webProperties.getAppApi().getPrefix()); } @Override @@ -73,7 +77,7 @@ public class ApiAccessLogFilter extends OncePerRequestFilter { this.buildApiAccessLogDTO(accessLog, request, beginTime, queryString, requestBody, ex); apiAccessLogFrameworkService.createApiAccessLogAsync(accessLog); } catch (Throwable th) { - log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), JsonUtils.toJsonString(accessLog), th); + log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th); } } @@ -99,7 +103,7 @@ public class ApiAccessLogFilter extends OncePerRequestFilter { accessLog.setApplicationName(applicationName); accessLog.setRequestUrl(request.getRequestURI()); Map requestParams = MapUtil.builder().put("query", queryString).put("body", requestBody).build(); - accessLog.setRequestParams(JsonUtils.toJsonString(requestParams)); + accessLog.setRequestParams(toJsonString(requestParams)); accessLog.setRequestMethod(request.getMethod()); accessLog.setUserAgent(ServletUtils.getUserAgent(request)); accessLog.setUserIp(ServletUtil.getClientIP(request)); diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java index 2edc3e883c..23a4aff4a5 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java @@ -5,6 +5,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @ConfigurationProperties(prefix = "yudao.web") @@ -12,26 +14,37 @@ import javax.validation.constraints.NotNull; @Data public class WebProperties { - /** - * API 前缀,实现所有 Controller 提供的 RESTFul API 的统一前缀 - * - * - * 意义:通过该前缀,避免 Swagger、Actuator 意外通过 Nginx 暴露出来给外部,带来安全性问题 - * 这样,Nginx 只需要配置转发到 /api/* 的所有接口即可。 - * - * @see YudaoWebAutoConfiguration#configurePathMatch(PathMatchConfigurer) - */ - @NotNull(message = "API 前缀不能为空") - private String apiPrefix; + @NotNull(message = "APP API 不能为空") + private Api appApi; + @NotNull(message = "Admin API 不能为空") + private Api adminApi; - /** - * Controller 所在包 - * - * 主要目的是,给该 Controller 设置指定的 {@link #apiPrefix} - * - * 因为我们有多个 modules 包里会包含 Controller,所以只需要写到 cn.iocoder.yudao 这样的层级 - */ - @NotNull(message = "Controller 所在包不能为空") - private String controllerPackage; + @Data + @Valid + public static class Api { + + /** + * API 前缀,实现所有 Controller 提供的 RESTFul API 的统一前缀 + * + * + * 意义:通过该前缀,避免 Swagger、Actuator 意外通过 Nginx 暴露出来给外部,带来安全性问题 + * 这样,Nginx 只需要配置转发到 /api/* 的所有接口即可。 + * + * @see YudaoWebAutoConfiguration#configurePathMatch(PathMatchConfigurer) + */ + @NotEmpty(message = "API 前缀不能为空") + private String prefix; + + /** + * Controller 所在包 + * + * 主要目的是,给该 Controller 设置指定的 {@link #prefix} + * + * 因为我们有多个 modules 包里会包含 Controller,所以只需要写到 cn.iocoder.yudao 这样的层级 + */ + @NotEmpty(message = "Controller 所在包不能为空") + private String controller; + + } } diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java index 5d390cdb17..c3bcb2009c 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java @@ -38,10 +38,19 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { - // 设置 API 前缀,仅仅匹配 controller 包下的 - configurer.addPathPrefix(webProperties.getApiPrefix(), clazz -> - clazz.isAnnotationPresent(RestController.class) - && clazz.getPackage().getName().startsWith(webProperties.getControllerPackage())); // 仅仅匹配 controller 包 + configurePathMatch(configurer, webProperties.getAdminApi()); + configurePathMatch(configurer, webProperties.getAppApi()); + } + + /** + * 设置 API 前缀,仅仅匹配 controller 包下的 + * + * @param configurer 配置 + * @param api API 配置 + */ + private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) { + configurer.addPathPrefix(api.getPrefix(), clazz -> clazz.isAnnotationPresent(RestController.class) + && clazz.getPackage().getName().startsWith(api.getController())); // 仅仅匹配 controller 包 } @Bean diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApi.java similarity index 60% rename from yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java rename to yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApi.java index 3ac616af89..ba742a2599 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApi.java @@ -1,13 +1,13 @@ package cn.iocoder.yudao.module.member.api.user; -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; +import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; /** * 会员用户的 API 接口 * * @author 芋道源码 */ -public interface MemberUserApi { +public interface UserApi { /** * 获得会员用户信息 @@ -15,6 +15,6 @@ public interface MemberUserApi { * @param id 用户编号 * @return 用户信息 */ - MemberUserRespDTO getMemberUser(Long id); + UserRespDTO getUser(Long id); } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/UserRespDTO.java similarity index 93% rename from yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java rename to yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/UserRespDTO.java index 82eec958a3..ef2ecde492 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/UserRespDTO.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; * * @author 芋道源码 */ -public class MemberUserRespDTO { +public class UserRespDTO { /** * 用户ID diff --git a/yudao-module-member/yudao-module-member-impl/pom.xml b/yudao-module-member/yudao-module-member-impl/pom.xml index d4b064f6af..de46508069 100644 --- a/yudao-module-member/yudao-module-member-impl/pom.xml +++ b/yudao-module-member/yudao-module-member-impl/pom.xml @@ -18,16 +18,18 @@ + + cn.iocoder.boot + yudao-module-member-api + ${revision} + + cn.iocoder.boot yudao-core-service - - cn.iocoder.boot - yudao-spring-boot-starter-biz-dict - cn.iocoder.boot yudao-spring-boot-starter-biz-sms @@ -38,11 +40,6 @@ - - cn.iocoder.boot - yudao-spring-boot-starter-web - - cn.iocoder.boot yudao-spring-boot-starter-security @@ -59,32 +56,12 @@ yudao-spring-boot-starter-redis - - - cn.iocoder.boot - yudao-spring-boot-starter-config - - - - cn.iocoder.boot yudao-spring-boot-starter-mq - - - cn.iocoder.boot - yudao-spring-boot-starter-protection - - - - - cn.iocoder.boot - yudao-spring-boot-starter-monitor - - cn.iocoder.boot diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/package-info.java new file mode 100644 index 0000000000..5f97979b88 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.api; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApiImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApiImpl.java new file mode 100644 index 0000000000..656642e511 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApiImpl.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.member.api.user; + +import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; +import cn.iocoder.yudao.module.member.convert.user.UserConvert; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.service.user.UserService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 会员用户的 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class UserApiImpl implements UserApi { + + @Resource + private UserService userService; + + @Override + public UserRespDTO getUser(Long id) { + UserDO user = userService.getUser(id); + return UserConvert.INSTANCE.convert2(user); + } + +} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/package-info.java new file mode 100644 index 0000000000..652bbb6f19 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.controller.admin.address; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/package-info.java new file mode 100644 index 0000000000..23b3c23c4f --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.controller.admin.user; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/package-info.java new file mode 100644 index 0000000000..c8c1021861 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.controller.app.address; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java index 76437eb9d8..3876e708bd 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java @@ -5,8 +5,8 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; -import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService; -import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.service.auth.AuthService; +import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -31,7 +31,8 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti public class AppAuthController { @Resource - private SysAuthService authService; + private AuthService authService; + @Resource private SysSmsCodeService smsCodeService; @Resource @@ -55,7 +56,7 @@ public class AppAuthController { @PostMapping("/send-sms-code") @ApiOperation(value = "发送手机验证码") - public CommonResult sendSmsCode(@RequestBody @Valid SysAuthSendSmsReqVO reqVO) { + public CommonResult sendSmsCode(@RequestBody @Valid AppAuthSendSmsReqVO reqVO) { smsCodeService.sendSmsCode(reqVO.getMobile(), reqVO.getScene(), getClientIP()); return success(true); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java index 64cc22a3cf..6d33b18edd 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -15,6 +15,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; +// TODO 芋艿:code review 相关逻辑 @ApiModel("APP 端 - 校验验证码 Request VO") @Data @NoArgsConstructor @@ -37,4 +38,5 @@ public class AppAuthCheckCodeReqVO { @NotNull(message = "发送场景不能为空") @InEnum(SysSmsSceneEnum.class) private Integer scene; + } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java index 5ae291fdb5..9f48ee6248 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java @@ -13,6 +13,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; +// TODO 芋艿:code review 相关逻辑 @ApiModel("APP 端 - 重置密码 Request VO") @Data @NoArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppSendSmsReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java similarity index 88% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppSendSmsReqVO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java index 7a7620d630..9e53351fea 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppSendSmsReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull; @ApiModel("APP 端 - 发送手机验证码 Response VO") @Data @Accessors(chain = true) -public class AppSendSmsReqVO { +public class AppAuthSendSmsReqVO { @ApiModelProperty(value = "手机号", example = "15601691234") @Mobile diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java index cbbd17fec5..4bbecbc311 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java @@ -11,6 +11,7 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; +// TODO 芋艿:code review 相关逻辑 @ApiModel("APP 端 - 修改密码 Request VO") @Data @NoArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java index 758eb7b00a..cf5b5348c1 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java @@ -1,13 +1,12 @@ package cn.iocoder.yudao.module.member.controller.app.user; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; -import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserUpdateMobileReqVO; -import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum; -import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserInfoRespVO; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; +import cn.iocoder.yudao.module.member.convert.user.UserConvert; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.service.user.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -17,13 +16,12 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.validation.Valid; - import java.io.IOException; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.*; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants.FILE_IS_EMPTY; +import static cn.iocoder.yudao.module.member.enums.MemberErrorCodeConstants.FILE_IS_EMPTY; @Api(tags = "APP 端 - 用户个人中心") @RestController @@ -33,39 +31,40 @@ import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConst public class AppUserController { @Resource - private MbrUserService userService; + private UserService userService; @PutMapping("/update-nickname") @ApiOperation("修改用户昵称") @PreAuthenticated - public CommonResult updateNickname(@RequestParam("nickname") String nickname) { - userService.updateNickname(getLoginUserId(), nickname); + public CommonResult updateUserNickname(@RequestParam("nickname") String nickname) { + userService.updateUserNickname(getLoginUserId(), nickname); return success(true); } @PutMapping("/update-avatar") @ApiOperation("修改用户头像") @PreAuthenticated - public CommonResult updateAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException { + public CommonResult updateUserAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException { if (file.isEmpty()) { - throw ServiceExceptionUtil.exception(MbrErrorCodeConstants.FILE_IS_EMPTY); + throw exception(FILE_IS_EMPTY); } - String avatar = userService.updateAvatar(getLoginUserId(), file.getInputStream()); + String avatar = userService.updateUserAvatar(getLoginUserId(), file.getInputStream()); return success(avatar); } @GetMapping("/get") @ApiOperation("获得基本信息") @PreAuthenticated - public CommonResult getUserInfo() { - return success(userService.getUserInfo(getLoginUserId())); + public CommonResult getUserInfo() { + UserDO user = userService.getUser(getLoginUserId()); + return success(UserConvert.INSTANCE.convert(user)); } @PostMapping("/update-mobile") @ApiOperation(value = "修改用户手机") @PreAuthenticated - public CommonResult updateMobile(@RequestBody @Valid MbrUserUpdateMobileReqVO reqVO) { - userService.updateMobile(getLoginUserId(), reqVO); + public CommonResult updateMobile(@RequestBody @Valid AppUserUpdateMobileReqVO reqVO) { + userService.updateUserMobile(getLoginUserId(), reqVO); return success(true); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java index fe91566c96..ded94ef1a9 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java @@ -38,6 +38,8 @@ public class AppUserUpdateMobileReqVO { @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") private String oldCode; + // TODO @芋艿:oldMobile 应该不用传递 + @ApiModelProperty(value = "原手机号",required = true,example = "15823654487") @NotBlank(message = "手机号不能为空") @Length(min = 8, max = 11, message = "手机号码长度为 8-11 位") diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/SysAuthConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java similarity index 63% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/SysAuthConvert.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java index df9a353a04..419a70e0ba 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/SysAuthConvert.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java @@ -1,21 +1,21 @@ package cn.iocoder.yudao.module.member.convert.auth; -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper -public interface SysAuthConvert { +public interface AuthConvert { - SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); + AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); @Mapping(source = "mobile", target = "username") - LoginUser convert0(MbrUserDO bean); + LoginUser convert0(UserDO bean); - default LoginUser convert(MbrUserDO bean) { + default LoginUser convert(UserDO bean) { // 目的,为了设置 UserTypeEnum.MEMBER.getValue() return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue()); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java index 139b6ef330..a490edfafc 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.member.convert.user; -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserInfoRespVO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -9,6 +11,7 @@ public interface UserConvert { UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); - AppUserInfoRespVO convert(MemberUserDO bean); + AppUserInfoRespVO convert(UserDO bean); + UserRespDTO convert2(UserDO bean); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java similarity index 90% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java index 0b77f4e1e9..f451680442 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java @@ -10,19 +10,19 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import java.util.Date; /** - * 会员中心的用户 DO + * 会员用户 DO * * uk_mobile 索引:基于 {@link #mobile} 字段 * * @author 芋道源码 */ -@TableName(value = "member_user", autoResultMap = true) +@TableName(value = "mbr_user", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class MemberUserDO extends TenantBaseDO { +public class UserDO extends TenantBaseDO { /** * 用户ID diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java index 80079117f2..ccdbcf6cec 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java @@ -3,10 +3,9 @@ package cn.iocoder.yudao.module.member.dal.mysql.sms; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO; import org.apache.ibatis.annotations.Mapper; -// TODO @芋艿: +// TODO @芋艿:拿到 system 模块下 @Mapper public interface SysSmsCodeMapper extends BaseMapperX { diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MbrUserMapper.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MbrUserMapper.java deleted file mode 100644 index 49b6a9f8e9..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MbrUserMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.member.dal.mysql.user; - -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -/** - * MbrUserDO Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface MbrUserMapper extends BaseMapperX { - - default MbrUserDO selectByMobile(String mobile) { - return selectOne(MbrUserDO::getMobile, mobile); - } - -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/UserMapper.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/UserMapper.java new file mode 100644 index 0000000000..d962811e67 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/UserMapper.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.member.dal.mysql.user; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 会员 User Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface UserMapper extends BaseMapperX { + + default UserDO selectByMobile(String mobile) { + return selectOne(UserDO::getMobile, mobile); + } + +} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java index 06c6545caf..5b05c46f14 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java @@ -3,5 +3,7 @@ * 1. data object:数据对象 * 2. redis:Redis 的 CRUD 操作 * 3. mysql:MySQL 的 CRUD 操作 + * + * 其中,MySQL 的表以 mbr_ 作为前缀 */ package cn.iocoder.yudao.module.member.dal; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/redis/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/redis/package-info.java index f5d6e64d24..8dfa9fb20d 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/redis/package-info.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/redis/package-info.java @@ -1 +1,4 @@ +/** + * 占位,后续有类后,可以删除,避免 package 无法提交到 Git 上 + */ package cn.iocoder.yudao.module.member.dal.redis; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/security/SecurityConfiguration.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/security/SecurityConfiguration.java deleted file mode 100644 index 32368f8d10..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/security/SecurityConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.member.framework.security; - -import cn.iocoder.yudao.framework.web.config.WebProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; - -import javax.annotation.Resource; - -@Configuration -public class SecurityConfiguration { - - @Resource - private WebProperties webProperties; - - @Bean - public Customizer.ExpressionInterceptUrlRegistry> authorizeRequestsCustomizer() { - return registry -> { - registry.antMatchers(api("/**")).permitAll(); // 默认 API 都是用户可访问 - }; - } - - private String api(String url) { - return webProperties.getApiPrefix() + url; - } - -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthService.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthService.java similarity index 74% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthService.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthService.java index a864e1ed9d..98b87c505d 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthService.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthService.java @@ -6,13 +6,13 @@ import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import javax.validation.Valid; /** - * 用户前台的认证 Service 接口 + * 会员的认证 Service 接口 * * 提供用户的账号密码登录、token 的校验等认证相关的功能 * * @author 芋道源码 */ -public interface SysAuthService extends SecurityAuthFrameworkService { +public interface AuthService extends SecurityAuthFrameworkService { /** * 手机 + 密码登录 @@ -22,7 +22,7 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userAgent 用户 UA * @return 身份令牌,使用 JWT 方式 */ - String login(@Valid SysAuthLoginReqVO reqVO, String userIp, String userAgent); + String login(@Valid AppAuthLoginReqVO reqVO, String userIp, String userAgent); /** * 手机 + 验证码登陆 @@ -32,7 +32,7 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userAgent 用户 UA * @return 身份令牌,使用 JWT 方式 */ - String smsLogin(@Valid SysAuthSmsLoginReqVO reqVO, String userIp, String userAgent); + String smsLogin(@Valid AppAuthSmsLoginReqVO reqVO, String userIp, String userAgent); /** @@ -43,7 +43,7 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userAgent 用户 UA * @return 身份令牌,使用 JWT 方式 */ - String socialLogin(@Valid MbrAuthSocialLoginReqVO reqVO, String userIp, String userAgent); + String socialLogin(@Valid AppAuthSocialLoginReqVO reqVO, String userIp, String userAgent); /** * 社交登录,使用 手机号 + 手机验证码 @@ -53,7 +53,7 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userAgent 用户 UA * @return 身份令牌,使用 JWT 方式 */ - String socialLogin2(@Valid MbrAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent); + String socialLogin2(@Valid AppAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent); /** * 社交绑定,使用 code 授权码 @@ -61,18 +61,19 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userId 用户编号 * @param reqVO 绑定信息 */ - void socialBind(Long userId, @Valid MbrAuthSocialBindReqVO reqVO); + void socialBind(Long userId, @Valid AppAuthSocialBindReqVO reqVO); /** * 修改用户密码 * @param userId 用户id * @param userReqVO 用户请求实体类 */ - void updatePassword(Long userId,MbrAuthUpdatePasswordReqVO userReqVO); + void updatePassword(Long userId, AppAuthUpdatePasswordReqVO userReqVO); /** * 忘记密码 * @param userReqVO 用户请求实体类 */ - void resetPassword(MbrAuthResetPasswordReqVO userReqVO); + void resetPassword(AppAuthResetPasswordReqVO userReqVO); + } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java similarity index 72% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceImpl.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java index fd68cff5e5..a28b6572db 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.member.service.auth; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum; import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum; @@ -12,22 +11,20 @@ import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLo import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper; -import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; -import cn.iocoder.yudao.userserver.modules.system.convert.auth.SysAuthConvert; -import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum; -import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService; -import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.UserMapper; +import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.service.user.UserService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthUser; import org.springframework.context.annotation.Lazy; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.DisabledException; @@ -46,25 +43,23 @@ import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants.*; /** - * Auth Service 实现类 + * 会员的认证 Service 接口 * * @author 芋道源码 */ @Service @Slf4j -public class SysAuthServiceImpl implements SysAuthService { - - private static final UserTypeEnum USER_TYPE_ENUM = UserTypeEnum.MEMBER; +public class AuthServiceImpl implements AuthService { @Resource @Lazy // 延迟加载,因为存在相互依赖的问题 private AuthenticationManager authenticationManager; @Resource - private MbrUserService userService; + private UserService userService; @Resource private SysSmsCodeService smsCodeService; @Resource @@ -74,28 +69,24 @@ public class SysAuthServiceImpl implements SysAuthService { @Resource private SysSocialCoreService socialService; - @Resource - private StringRedisTemplate stringRedisTemplate; @Resource private PasswordEncoder passwordEncoder; @Resource - private MbrUserMapper userMapper; - - private static final UserTypeEnum userTypeEnum = UserTypeEnum.MEMBER; + private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String mobile) throws UsernameNotFoundException { // 获取 username 对应的 SysUserDO - MbrUserDO user = userService.getUserByMobile(mobile); + UserDO user = userService.getUserByMobile(mobile); if (user == null) { throw new UsernameNotFoundException(mobile); } // 创建 LoginUser 对象 - return SysAuthConvert.INSTANCE.convert(user); + return AuthConvert.INSTANCE.convert(user); } @Override - public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) { + public String login(AppAuthLoginReqVO reqVO, String userIp, String userAgent) { // 使用手机 + 密码,进行登录。 LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword()); @@ -105,80 +96,77 @@ public class SysAuthServiceImpl implements SysAuthService { @Override @Transactional - public String smsLogin(SysAuthSmsLoginReqVO reqVO, String userIp, String userAgent) { + public String smsLogin(AppAuthSmsLoginReqVO reqVO, String userIp, String userAgent) { // 校验验证码 smsCodeService.useSmsCode(reqVO.getMobile(), SysSmsSceneEnum.LOGIN_BY_SMS.getScene(), reqVO.getCode(), userIp); // 获得获得注册用户 - MbrUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp); + UserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp); Assert.notNull(user, "获取用户失败,结果为空"); // 执行登陆 this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_SMS, SysLoginResultEnum.SUCCESS); - LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user); + LoginUser loginUser = AuthConvert.INSTANCE.convert(user); // 缓存登录用户到 Redis 中,返回 sessionId 编号 return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); } @Override - public String socialLogin(MbrAuthSocialLoginReqVO reqVO, String userIp, String userAgent) { + public String socialLogin(AppAuthSocialLoginReqVO reqVO, String userIp, String userAgent) { // 使用 code 授权码,进行登录 AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); org.springframework.util.Assert.notNull(authUser, "授权用户不为空"); // 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错 String unionId = socialService.getAuthUserUnionId(authUser); - List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, USER_TYPE_ENUM); + List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, getUserType()); if (CollUtil.isEmpty(socialUsers)) { - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_THIRD_LOGIN_NOT_BIND); + throw exception(AUTH_THIRD_LOGIN_NOT_BIND); } // 自动登录 - MbrUserDO user = userService.getUser(socialUsers.get(0).getUserId()); + UserDO user = userService.getUser(socialUsers.get(0).getUserId()); if (user == null) { - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_NOT_EXISTS); + throw exception(USER_NOT_EXISTS); } this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_SOCIAL, SysLoginResultEnum.SUCCESS); // 创建 LoginUser 对象 - LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user); + LoginUser loginUser = AuthConvert.INSTANCE.convert(user); // 绑定社交用户(更新) - socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, USER_TYPE_ENUM); + socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); // 缓存登录用户到 Redis 中,返回 sessionId 编号 return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); } @Override - public String socialLogin2(MbrAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) { + public String socialLogin2(AppAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) { AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); org.springframework.util.Assert.notNull(authUser, "授权用户不为空"); // 使用手机号、手机验证码登录 - SysAuthSmsLoginReqVO loginReqVO = SysAuthSmsLoginReqVO - .builder() - .mobile(reqVO.getMobile()) - .code(reqVO.getSmsCode()) - .build(); + AppAuthSmsLoginReqVO loginReqVO = AppAuthSmsLoginReqVO.builder() + .mobile(reqVO.getMobile()).code(reqVO.getSmsCode()).build(); String sessionId = this.smsLogin(loginReqVO, userIp, userAgent); LoginUser loginUser = userSessionCoreService.getLoginUser(sessionId); // 绑定社交用户(新增) - socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, USER_TYPE_ENUM); + socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); return sessionId; } @Override - public void socialBind(Long userId, MbrAuthSocialBindReqVO reqVO) { + public void socialBind(Long userId, AppAuthSocialBindReqVO reqVO) { // 使用 code 授权码,进行登录 AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); org.springframework.util.Assert.notNull(authUser, "授权用户不为空"); // 绑定社交用户(新增) - socialService.bindSocialUser(userId, reqVO.getType(), authUser, USER_TYPE_ENUM); + socialService.bindSocialUser(userId, reqVO.getType(), authUser, getUserType()); } private LoginUser login0(String username, String password) { @@ -191,14 +179,14 @@ public class SysAuthServiceImpl implements SysAuthService { authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); } catch (BadCredentialsException badCredentialsException) { this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.BAD_CREDENTIALS); - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_LOGIN_BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); } catch (DisabledException disabledException) { this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.USER_DISABLED); - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_LOGIN_USER_DISABLED); + throw exception(AUTH_LOGIN_USER_DISABLED); } catch (AuthenticationException authenticationException) { log.error("[login0][username({}) 发生未知异常]", username, authenticationException); this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.UNKNOWN_ERROR); - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_LOGIN_FAIL_UNKNOWN); + throw exception(AUTH_LOGIN_FAIL_UNKNOWN); } // 登录成功的日志 Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); @@ -208,7 +196,7 @@ public class SysAuthServiceImpl implements SysAuthService { private void createLoginLog(String mobile, SysLoginLogTypeEnum logTypeEnum, SysLoginResultEnum loginResult) { // 获得用户 - MbrUserDO user = userService.getUserByMobile(mobile); + UserDO user = userService.getUserByMobile(mobile); // 插入登录日志 SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); reqDTO.setLogType(logTypeEnum.getType()); @@ -246,10 +234,11 @@ public class SysAuthServiceImpl implements SysAuthService { return; } - // 重新加载 MbrUserDO 信息 - MbrUserDO user = userService.getUser(loginUser.getId()); + // 重新加载 UserDO 信息 + UserDO user = userService.getUser(loginUser.getId()); if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) { - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面 + // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面 + throw exception(AUTH_TOKEN_EXPIRED); } // 刷新 LoginUser 缓存 @@ -258,8 +247,8 @@ public class SysAuthServiceImpl implements SysAuthService { @Override public LoginUser mockLogin(Long userId) { - // 获取用户编号对应的 MbrUserDO - MbrUserDO user = userService.getUser(userId); + // 获取用户编号对应的 UserDO + UserDO user = userService.getUser(userId); if (user == null) { throw new UsernameNotFoundException(String.valueOf(userId)); } @@ -268,7 +257,7 @@ public class SysAuthServiceImpl implements SysAuthService { this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_MOCK, SysLoginResultEnum.SUCCESS); // 创建 LoginUser 对象 - return SysAuthConvert.INSTANCE.convert(user); + return AuthConvert.INSTANCE.convert(user); } @Override @@ -285,27 +274,32 @@ public class SysAuthServiceImpl implements SysAuthService { } @Override - public void updatePassword(Long userId,MbrAuthUpdatePasswordReqVO reqVO) { + public UserTypeEnum getUserType() { + return UserTypeEnum.MEMBER; + } + + @Override + public void updatePassword(Long userId, AppAuthUpdatePasswordReqVO reqVO) { // 检验旧密码 - MbrUserDO userDO = checkOldPassword(userId, reqVO.getOldPassword()); + UserDO userDO = checkOldPassword(userId, reqVO.getOldPassword()); // 更新用户密码 - MbrUserDO mbrUserDO = MbrUserDO.builder().build(); - mbrUserDO.setId(userDO.getId()); - mbrUserDO.setPassword(passwordEncoder.encode(reqVO.getPassword())); + UserDO mbrUserDO = UserDO.builder().id(userDO.getId()) + .password(passwordEncoder.encode(reqVO.getPassword())).build(); userMapper.updateById(mbrUserDO); } @Override - public void resetPassword(MbrAuthResetPasswordReqVO reqVO) { + public void resetPassword(AppAuthResetPasswordReqVO reqVO) { // 检验用户是否存在 - MbrUserDO userDO = checkUserIfExists(reqVO.getMobile()); + UserDO userDO = checkUserIfExists(reqVO.getMobile()); // 使用验证码 - smsCodeService.useSmsCode(reqVO.getMobile(),SysSmsSceneEnum.FORGET_MOBILE_BY_SMS.getScene(),reqVO.getCode(),getClientIP()); + smsCodeService.useSmsCode(reqVO.getMobile(),SysSmsSceneEnum.FORGET_MOBILE_BY_SMS.getScene(), reqVO.getCode(), + getClientIP()); // 更新密码 - MbrUserDO mbrUserDO = MbrUserDO.builder().build(); + UserDO mbrUserDO = UserDO.builder().build(); mbrUserDO.setId(userDO.getId()); mbrUserDO.setPassword(passwordEncoder.encode(reqVO.getPassword())); userMapper.updateById(mbrUserDO); @@ -316,36 +310,35 @@ public class SysAuthServiceImpl implements SysAuthService { * * @param id 用户 id * @param oldPassword 旧密码 - * @return MbrUserDO 用户实体 + * @return MemberUserDO 用户实体 */ @VisibleForTesting - public MbrUserDO checkOldPassword(Long id, String oldPassword) { - MbrUserDO user = userMapper.selectById(id); + public UserDO checkOldPassword(Long id, String oldPassword) { + UserDO user = userMapper.selectById(id); if (user == null) { - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_NOT_EXISTS); + throw exception(USER_NOT_EXISTS); } // 参数:未加密密码,编码后的密码 if (!passwordEncoder.matches(oldPassword,user.getPassword())) { - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_PASSWORD_FAILED); + throw exception(USER_PASSWORD_FAILED); } return user; } - public MbrUserDO checkUserIfExists(String mobile) { - MbrUserDO user = userMapper.selectByMobile(mobile); + public UserDO checkUserIfExists(String mobile) { + UserDO user = userMapper.selectByMobile(mobile); if (user == null) { - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_NOT_EXISTS); + throw exception(USER_NOT_EXISTS); } return user; } - private void createLogoutLog(Long userId, String username) { SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); reqDTO.setUserId(userId); - reqDTO.setUserType(USER_TYPE_ENUM.getValue()); + reqDTO.setUserType(getUserType().getValue()); reqDTO.setUsername(username); reqDTO.setUserAgent(ServletUtils.getUserAgent()); reqDTO.setUserIp(getClientIP()); diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/package-info.java deleted file mode 100644 index 6223e6e6ca..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.member.service; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java index 8f0eaf6f33..e06e9a246f 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.member.service.sms; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; +import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; /** * 短信验证码 Service 接口 @@ -40,7 +40,6 @@ public interface SysSmsCodeService { */ void sendSmsCodeLogin(Long userId); - /** * 检查验证码是否有效 * @param mobile 手机 diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java index 43b7a1753c..41049656d0 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java @@ -1,15 +1,14 @@ package cn.iocoder.yudao.module.member.service.sms; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.userserver.modules.system.dal.mysql.sms.SysSmsCodeMapper; -import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum; -import cn.iocoder.yudao.userserver.modules.system.framework.sms.SmsCodeProperties; -import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.dal.mysql.sms.SysSmsCodeMapper; +import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.member.framework.sms.SmsCodeProperties; +import cn.iocoder.yudao.module.member.service.user.UserService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -17,9 +16,8 @@ import javax.annotation.Resource; import java.util.Date; import static cn.hutool.core.util.RandomUtil.randomInt; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants.*; /** * 短信验证码 Service 实现类 @@ -37,7 +35,7 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { private SysSmsCodeMapper smsCodeMapper; @Resource - private MbrUserService mbrUserService; + private UserService userService; @Resource private SysSmsCoreService smsCoreService; @@ -62,9 +60,9 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { public void checkMobileIsRegister(String mobile, Integer scene) { // 检测手机号是否已被使用 - MbrUserDO userByMobile = mbrUserService.getUserByMobile(mobile); - if (userByMobile != null){ - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_IS_EXISTS); + UserDO user = userService.getUserByMobile(mobile); + if (user != null) { + throw ServiceExceptionUtil.exception(USER_SMS_CODE_IS_EXISTS); } // 发送短信 @@ -76,11 +74,11 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { SysSmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null,null); if (lastSmsCode != null) { if (lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); + throw ServiceExceptionUtil.exception(USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); } if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_SEND_TOO_FAST); + throw ServiceExceptionUtil.exception(USER_SMS_CODE_SEND_TOO_FAST); } // TODO 芋艿:提升,每个 IP 每天可发送数量 // TODO 芋艿:提升,每个 IP 每小时可发送数量 @@ -97,13 +95,12 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { @Override public void useSmsCode(String mobile, Integer scene, String code, String usedIp) { - // 检测验证码是否有效 SysSmsCodeDO lastSmsCode = this.checkCodeIsExpired(mobile, code, scene); // 判断验证码是否已被使用 if (Boolean.TRUE.equals(lastSmsCode.getUsed())) { - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_USED); + throw ServiceExceptionUtil.exception(USER_SMS_CODE_USED); } // 使用验证码 @@ -113,9 +110,9 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { @Override public void sendSmsCodeLogin(Long userId) { - MbrUserDO user = mbrUserService.getUser(userId); + UserDO user = userService.getUser(userId); if (user == null){ - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_NOT_EXISTS); + throw ServiceExceptionUtil.exception(USER_NOT_EXISTS); } // 发送验证码 this.sendSmsCode(user.getMobile(),SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), getClientIP()); @@ -128,15 +125,13 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService { // 若验证码不存在,抛出异常 if (lastSmsCode == null) { - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_NOT_FOUND); + throw ServiceExceptionUtil.exception(USER_SMS_CODE_NOT_FOUND); } if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期 - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_EXPIRED); + throw ServiceExceptionUtil.exception(USER_SMS_CODE_EXPIRED); } - return lastSmsCode; - } } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserService.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserService.java similarity index 57% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserService.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserService.java index be02945c97..454e19dc63 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserService.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserService.java @@ -1,18 +1,18 @@ package cn.iocoder.yudao.module.member.service.user; -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO; import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserUpdateMobileReqVO; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserInfoRespVO; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; import java.io.InputStream; /** - * 前台用户 Service 接口 + * 会员用户 Service 接口 * * @author 芋道源码 */ -public interface MbrUserService { +public interface UserService { /** * 通过手机查询用户 @@ -20,7 +20,7 @@ public interface MbrUserService { * @param mobile 手机 * @return 用户对象 */ - MbrUserDO getUserByMobile(String mobile); + UserDO getUserByMobile(String mobile); /** * 基于手机号创建用户。 @@ -30,7 +30,7 @@ public interface MbrUserService { * @param registerIp 注册 IP * @return 用户对象 */ - MbrUserDO createUserIfAbsent(@Mobile String mobile, String registerIp); + UserDO createUserIfAbsent(@Mobile String mobile, String registerIp); /** * 更新用户的最后登陆信息 @@ -46,14 +46,14 @@ public interface MbrUserService { * @param id 用户ID * @return 用户对象信息 */ - MbrUserDO getUser(Long id); + UserDO getUser(Long id); /** * 修改用户昵称 * @param userId 用户id * @param nickname 用户新昵称 */ - void updateNickname(Long userId, String nickname); + void updateUserNickname(Long userId, String nickname); /** * 修改用户头像 @@ -61,21 +61,13 @@ public interface MbrUserService { * @param inputStream 头像文件 * @return 头像url */ - String updateAvatar(Long userId, InputStream inputStream); - - /** - * 根据用户id,获取用户头像与昵称 - * - * @param userId 用户id - * @return 用户响应实体类 - */ - MbrUserInfoRespVO getUserInfo(Long userId); + String updateUserAvatar(Long userId, InputStream inputStream); /** * 修改手机 * @param userId 用户id * @param reqVO 请求实体 */ - void updateMobile(Long userId, MbrUserUpdateMobileReqVO reqVO); + void updateUserMobile(Long userId, AppUserUpdateMobileReqVO reqVO); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java similarity index 51% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImpl.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java index de53135986..a899b79e66 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java @@ -3,17 +3,15 @@ package cn.iocoder.yudao.module.member.service.user; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserUpdateMobileReqVO; -import cn.iocoder.yudao.userserver.modules.member.convert.user.UserProfileConvert; -import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper; -import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum; -import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.UserMapper; +import cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants; +import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; @@ -27,41 +25,38 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants.USER_NOT_EXISTS; -import static cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants.USER_SMS_CODE_IS_UNUSED; +import static cn.iocoder.yudao.module.member.enums.MemberErrorCodeConstants.USER_NOT_EXISTS; /** - * User Service 实现类 + * 会员 User Service 实现类 * * @author 芋道源码 */ @Service @Valid @Slf4j -public class MbrUserServiceImpl implements MbrUserService { +public class UserServiceImpl implements UserService { @Resource - private MbrUserMapper userMapper; + private UserMapper memberUserMapper; @Resource private InfFileCoreService fileCoreService; + @Resource + private SysSmsCodeService smsCodeService; @Resource private PasswordEncoder passwordEncoder; - @Resource - private SysSmsCodeService smsCodeService; - - @Override - public MbrUserDO getUserByMobile(String mobile) { - return userMapper.selectByMobile(mobile); + public UserDO getUserByMobile(String mobile) { + return memberUserMapper.selectByMobile(mobile); } @Override - public MbrUserDO createUserIfAbsent(String mobile, String registerIp) { + public UserDO createUserIfAbsent(String mobile, String registerIp) { // 用户已经存在 - MbrUserDO user = userMapper.selectByMobile(mobile); + UserDO user = memberUserMapper.selectByMobile(mobile); if (user != null) { return user; } @@ -69,94 +64,84 @@ public class MbrUserServiceImpl implements MbrUserService { return this.createUser(mobile, registerIp); } - private MbrUserDO createUser(String mobile, String registerIp) { + private UserDO createUser(String mobile, String registerIp) { // 生成密码 String password = IdUtil.fastSimpleUUID(); // 插入用户 - MbrUserDO user = new MbrUserDO(); + UserDO user = new UserDO(); user.setMobile(mobile); user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 user.setPassword(passwordEncoder.encode(password)); // 加密密码 user.setRegisterIp(registerIp); - userMapper.insert(user); + memberUserMapper.insert(user); return user; } @Override public void updateUserLogin(Long id, String loginIp) { - userMapper.updateById(new MbrUserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date())); + memberUserMapper.updateById(new UserDO().setId(id) + .setLoginIp(loginIp).setLoginDate(new Date())); } @Override - public MbrUserDO getUser(Long id) { - return userMapper.selectById(id); + public UserDO getUser(Long id) { + return memberUserMapper.selectById(id); } @Override - public void updateNickname(Long userId, String nickname) { - MbrUserDO user = this.checkUserExists(userId); + public void updateUserNickname(Long userId, String nickname) { + UserDO user = this.checkUserExists(userId); // 仅当新昵称不等于旧昵称时进行修改 if (nickname.equals(user.getNickname())){ return; } - MbrUserDO userDO = new MbrUserDO(); + UserDO userDO = new UserDO(); userDO.setId(user.getId()); userDO.setNickname(nickname); - userMapper.updateById(userDO); + memberUserMapper.updateById(userDO); } @Override - public String updateAvatar(Long userId, InputStream avatarFile) { + public String updateUserAvatar(Long userId, InputStream avatarFile) { this.checkUserExists(userId); // 创建文件 String avatar = fileCoreService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); // 更新头像路径 - MbrUserDO userDO = MbrUserDO.builder() - .id(userId) - .avatar(avatar) - .build(); - userMapper.updateById(userDO); + memberUserMapper.updateById(UserDO.builder().id(userId).avatar(avatar).build()); return avatar; } - @Override - public MbrUserInfoRespVO getUserInfo(Long userId) { - MbrUserDO user = this.checkUserExists(userId); - // 拼接返回结果 - return UserProfileConvert.INSTANCE.convert(user); - } - - @Override @Transactional(rollbackFor = Exception.class) - public void updateMobile(Long userId, MbrUserUpdateMobileReqVO reqVO) { + public void updateUserMobile(Long userId, AppUserUpdateMobileReqVO reqVO) { // 检测用户是否存在 checkUserExists(userId); // 校验旧手机和旧验证码 - SysSmsCodeDO sysSmsCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene()); - // 判断旧code是否未被使用,如果是,抛出异常 + SysSmsCodeDO sysSmsCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(), + SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene()); + // 判断旧 code 是否未被使用,如果是,抛出异常 if (Boolean.FALSE.equals(sysSmsCodeDO.getUsed())){ throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_IS_UNUSED); } // 使用新验证码 - smsCodeService.useSmsCode(reqVO.getMobile(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), reqVO.getCode(),getClientIP()); + smsCodeService.useSmsCode(reqVO.getMobile(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), + reqVO.getCode(),getClientIP()); // 更新用户手机 - MbrUserDO userDO = MbrUserDO.builder().id(userId).mobile(reqVO.getMobile()).build(); - userMapper.updateById(userDO); + memberUserMapper.updateById(UserDO.builder().id(userId).mobile(reqVO.getMobile()).build()); } @VisibleForTesting - public MbrUserDO checkUserExists(Long id) { + public UserDO checkUserExists(Long id) { if (id == null) { return null; } - MbrUserDO user = userMapper.selectById(id); + UserDO user = memberUserMapper.selectById(id); if (user == null) { throw exception(USER_NOT_EXISTS); - }else{ - return user; } + return user; } + } diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java index ff1c8a7c65..aa38ab936c 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java @@ -1,20 +1,18 @@ package cn.iocoder.yudao.module.member.service.auth; -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import cn.iocoder.yudao.userserver.BaseDbAndRedisUnitTest; -import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper; -import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; -import cn.iocoder.yudao.module.member.controller.app.auth.vo.MbrAuthResetPasswordReqVO; -import cn.iocoder.yudao.module.member.controller.app.auth.vo.MbrAuthUpdatePasswordReqVO; -import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService; -import cn.iocoder.yudao.userserver.modules.system.service.auth.impl.SysAuthServiceImpl; -import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthResetPasswordReqVO; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthUpdatePasswordReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.UserMapper; +import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.service.user.UserService; +import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -34,17 +32,17 @@ import static org.mockito.Mockito.when; // TODO @芋艿:单测的 review,等逻辑都达成一致后 /** - * {@link SysAuthService} 的单元测试类 + * {@link AuthService} 的单元测试类 * * @author 宋天 */ -@Import({SysAuthServiceImpl.class, YudaoRedisAutoConfiguration.class}) +@Import({AuthServiceImpl.class, YudaoRedisAutoConfiguration.class}) public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { @MockBean private AuthenticationManager authenticationManager; @MockBean - private MbrUserService userService; + private UserService userService; @MockBean private SysSmsCodeService smsCodeService; @MockBean @@ -58,21 +56,21 @@ public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { @MockBean private PasswordEncoder passwordEncoder; @Resource - private MbrUserMapper mbrUserMapper; + private UserMapper mbrUserMapper; @Resource - private SysAuthServiceImpl authService; + private AuthServiceImpl authService; @Test public void testUpdatePassword_success(){ // 准备参数 - MbrUserDO userDO = randomMbrUserDO(); + UserDO userDO = randomUserDO(); mbrUserMapper.insert(userDO); // 新密码 String newPassword = randomString(); // 请求实体 - MbrAuthUpdatePasswordReqVO reqVO = MbrAuthUpdatePasswordReqVO.builder() + AppAuthUpdatePasswordReqVO reqVO = AppAuthUpdatePasswordReqVO.builder() .oldPassword(userDO.getPassword()) .password(newPassword) .build(); @@ -83,14 +81,14 @@ public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { when(passwordEncoder.encode(newPassword)).thenReturn(newPassword); // 更新用户密码 - authService.updatePassword(userDO.getId(),reqVO); + authService.updatePassword(userDO.getId(), reqVO); assertEquals(mbrUserMapper.selectById(userDO.getId()).getPassword(),newPassword); } @Test public void testResetPassword_success(){ // 准备参数 - MbrUserDO userDO = randomMbrUserDO(); + UserDO userDO = randomUserDO(); mbrUserMapper.insert(userDO); // 随机密码 @@ -102,7 +100,7 @@ public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { when(passwordEncoder.encode(password)).thenReturn(password); // 更新用户密码 - MbrAuthResetPasswordReqVO reqVO = new MbrAuthResetPasswordReqVO(); + AppAuthResetPasswordReqVO reqVO = new AppAuthResetPasswordReqVO(); reqVO.setMobile(userDO.getMobile()); reqVO.setPassword(password); reqVO.setCode(code); @@ -115,12 +113,12 @@ public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static MbrUserDO randomMbrUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static UserDO randomUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setPassword(randomString()); }; - return randomPojo(MbrUserDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(UserDO.class, ArrayUtils.append(consumer, consumers)); } diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/package-info.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/package-info.java deleted file mode 100644 index 6223e6e6ca..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.member.service; diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java index ecd728ef08..96c562fa93 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java @@ -2,18 +2,17 @@ package cn.iocoder.yudao.module.member.service.user; import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; -import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import cn.iocoder.yudao.userserver.BaseDbAndRedisUnitTest; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO; -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserUpdateMobileReqVO; -import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper; -import cn.iocoder.yudao.userserver.modules.member.service.user.impl.MbrUserServiceImpl; -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.userserver.modules.system.service.auth.impl.SysAuthServiceImpl; -import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.UserMapper; +import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl; +import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -27,30 +26,29 @@ import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.*; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; -import static cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; // TODO @芋艿:单测的 review,等逻辑都达成一致后 /** - * {@link MbrUserServiceImpl} 的单元测试类 + * {@link UserServiceImpl} 的单元测试类 * * @author 宋天 */ -@Import({MbrUserServiceImpl.class, YudaoRedisAutoConfiguration.class}) +@Import({UserServiceImpl.class, YudaoRedisAutoConfiguration.class}) public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { @Resource - private MbrUserServiceImpl mbrUserService; + private UserServiceImpl mbrUserService; @Resource private StringRedisTemplate stringRedisTemplate; @Resource - private MbrUserMapper userMapper; + private UserMapper userMapper; @MockBean - private SysAuthServiceImpl authService; + private AuthServiceImpl authService; @MockBean private InfFileCoreService fileCoreService; @@ -64,35 +62,24 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { @Test public void testUpdateNickName_success(){ // mock 数据 - MbrUserDO userDO = randomMbrUserDO(); + UserDO userDO = randomUserDO(); userMapper.insert(userDO); // 随机昵称 String newNickName = randomString(); // 调用接口修改昵称 - mbrUserService.updateNickname(userDO.getId(),newNickName); + mbrUserService.updateUserNickname(userDO.getId(),newNickName); // 查询新修改后的昵称 String nickname = mbrUserService.getUser(userDO.getId()).getNickname(); // 断言 assertEquals(newNickName,nickname); } - @Test - public void testGetUserInfo_success(){ - // mock 数据 - MbrUserDO userDO = randomMbrUserDO(); - userMapper.insert(userDO); - - // 查询用户昵称与头像 - MbrUserInfoRespVO userInfo = mbrUserService.getUserInfo(userDO.getId()); - System.out.println(userInfo); - } - @Test public void testUpdateAvatar_success(){ // mock 数据 - MbrUserDO dbUser = randomMbrUserDO(); + UserDO dbUser = randomUserDO(); userMapper.insert(dbUser); // 准备参数 @@ -103,7 +90,7 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { String avatar = randomString(); when(fileCoreService.createFile(anyString(), eq(avatarFileBytes))).thenReturn(avatar); // 调用 - String str = mbrUserService.updateAvatar(userId, avatarFile); + String str = mbrUserService.updateUserAvatar(userId, avatarFile); // 断言 assertEquals(avatar, str); } @@ -112,11 +99,10 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { public void updateMobile_success(){ // mock数据 String oldMobile = randomNumbers(11); - MbrUserDO userDO = randomMbrUserDO(); + UserDO userDO = randomUserDO(); userDO.setMobile(oldMobile); userMapper.insert(userDO); - // 旧手机和旧验证码 SysSmsCodeDO codeDO = new SysSmsCodeDO(); String oldCode = RandomUtil.randomString(4); @@ -129,12 +115,12 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { // 更新手机号 String newMobile = randomNumbers(11); String newCode = randomNumbers(4); - MbrUserUpdateMobileReqVO reqVO = new MbrUserUpdateMobileReqVO(); + AppUserUpdateMobileReqVO reqVO = new AppUserUpdateMobileReqVO(); reqVO.setMobile(newMobile); reqVO.setCode(newCode); reqVO.setOldMobile(oldMobile); reqVO.setOldCode(oldCode); - mbrUserService.updateMobile(userDO.getId(),reqVO); + mbrUserService.updateUserMobile(userDO.getId(),reqVO); assertEquals(mbrUserService.getUser(userDO.getId()).getMobile(),newMobile); } @@ -142,11 +128,11 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static MbrUserDO randomMbrUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static UserDO randomUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 }; - return randomPojo(MbrUserDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(UserDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbAndRedisUnitTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbAndRedisUnitTest.java index 50d19ad4ea..a9278498db 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbAndRedisUnitTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbAndRedisUnitTest.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.member.test; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import cn.iocoder.yudao.userserver.config.RedisTestConfiguration; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import org.redisson.spring.starter.RedissonAutoConfiguration; diff --git a/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml b/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml index d306a7af43..237068e6e5 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml +++ b/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml @@ -42,3 +42,8 @@ mybatis: --- #################### 芋道相关配置 #################### # 芋道配置项,设置当前项目所有自定义的配置 +yudao: + info: + base-package: cn.iocoder.yudao.module.member.dal.mysql + core-service: + base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 diff --git a/yudao-user-server/src/main/resources/application-dev.yaml b/yudao-user-server/src/main/resources/application-dev.yaml index 7e6aa355e1..f44bc4935d 100644 --- a/yudao-user-server/src/main/resources/application-dev.yaml +++ b/yudao-user-server/src/main/resources/application-dev.yaml @@ -124,6 +124,19 @@ logging: file: name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 + +--- #################### 微信公众号相关配置 #################### +wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 + mp: + # 公众号配置(必填) + app-id: wx041349c6f39b268b + secret: 5abee519483bc9f8cb37ce280e814bd0 + # 存储配置,解决 AccessToken 的跨节点的共享 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wx # Redis Key 的前缀 TODO 芋艿:解决下 Redis key 管理的配置 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + --- #################### 芋道相关配置 #################### # 芋道配置项,设置当前项目所有自定义的配置 diff --git a/yudao-user-server/src/main/resources/application.yaml b/yudao-user-server/src/main/resources/application.yaml index 209543380c..1d789232d9 100644 --- a/yudao-user-server/src/main/resources/application.yaml +++ b/yudao-user-server/src/main/resources/application.yaml @@ -66,11 +66,6 @@ yudao: constants-class-list: - cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants - cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants - sms-code: # 短信验证码相关的配置项 - expire-times: 10m - send-frequency: 1m - send-maximum-quantity-per-day: 10 - begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 - end-code: 9999 # 这里配置 9999 的原因是,测试方便。 + debug: false From e9efff7076f66305b5bc80ee416a32ee7487b6dc Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 29 Jan 2022 00:44:03 +0800 Subject: [PATCH 06/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=203=EF=BC=9Asecurity=20=E5=AE=9E=E7=8E=B0=E5=A4=9A?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9A=84=E8=AE=A4=E8=AF=81=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http-client.env.json | 6 +- pom.xml | 1 - yudao-admin-server/pom.xml | 6 +- .../security/SecurityConfiguration.java | 2 +- .../service/auth/impl/SysAuthServiceImpl.java | 4 +- .../framework/common/enums/UserTypeEnum.java | 6 + .../operatelog/core/aop/OperateLogAspect.java | 1 + .../core/dto/OperateLogCreateReqDTO.java | 3 + .../YudaoSecurityAutoConfiguration.java | 20 +-- .../YudaoWebSecurityConfigurerAdapter.java | 14 +- ...ultiUserDetailsAuthenticationProvider.java | 149 ++++++++++++++++++ ...tiUsernamePasswordAuthenticationToken.java | 43 +++++ .../filter/JWTAuthenticationTokenFilter.java | 12 +- .../handler/LogoutSuccessHandlerImpl.java | 6 +- .../core/service/SecurityAuthService.java | 43 ----- .../core/service/SecurityAuthServiceImpl.java | 64 -------- .../web/core/util/WebFrameworkUtils.java | 5 + .../yudao-module-member-impl/pom.xml | 4 + .../app/auth/AppAuthController.http | 3 +- .../app/auth/AppAuthController.java | 10 +- .../member/service/auth/AuthServiceImpl.java | 4 +- yudao-server/pom.xml | 22 --- 更新日志.md | 35 ++-- 23 files changed, 279 insertions(+), 184 deletions(-) create mode 100644 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/authentication/MultiUserDetailsAuthenticationProvider.java create mode 100644 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/authentication/MultiUsernamePasswordAuthenticationToken.java delete mode 100644 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthService.java delete mode 100644 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthServiceImpl.java delete mode 100644 yudao-server/pom.xml diff --git a/http-client.env.json b/http-client.env.json index c4686b274f..c18fbb054e 100644 --- a/http-client.env.json +++ b/http-client.env.json @@ -2,6 +2,10 @@ "local": { "baseUrl": "http://127.0.0.1:48080/api", "userServerUrl": "http://127.0.0.1:28080/api", - "token": "test1" + "token": "test1", + + "userApi": "http://127.0.0.1:48080/app-api", + "userToken": "test1", + "userTenentId": "1" } } diff --git a/pom.xml b/pom.xml index c76c9a22d1..36015806e2 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,6 @@ yudao-user-server yudao-core-service yudao-module-member - yudao-server ${artifactId} diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 40943697fe..bd32454b97 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -13,7 +13,11 @@ jar yudao-admin-server - 管理后台 Server,提供其 API 接口 + + 后端 Server 的主项目,通过引入需要 yudao-module-xxx 的依赖, + 从而实现提供 RESTful API 给 yudao-ui-admin、yudao-ui-user 等前端项目。 + 本质上来说,它就是个空壳(容器)! + https://github.com/YunaiV/ruoyi-vue-pro diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/security/SecurityConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/security/SecurityConfiguration.java index a5086b92e3..2d911a6753 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/security/SecurityConfiguration.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/security/SecurityConfiguration.java @@ -33,7 +33,7 @@ public class SecurityConfiguration { registry.antMatchers(buildAdminApi("/system/sms/callback/**")).anonymous(); // 设置 App API 无需认证 - registry.antMatchers(buildAppApi("/**")); + registry.antMatchers(buildAppApi("/**")).permitAll(); }; } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java index 3f795f83da..c9e5373501 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java @@ -26,6 +26,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthUser; import org.springframework.context.annotation.Lazy; @@ -154,7 +155,8 @@ public class SysAuthServiceImpl implements SysAuthService { try { // 调用 Spring Security 的 AuthenticationManager#authenticate(...) 方法,使用账号密码进行认证 // 在其内部,会调用到 loadUserByUsername 方法,获取 User 信息 - authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); + authentication = authenticationManager.authenticate(new MultiUsernamePasswordAuthenticationToken( + username, password, getUserType())); // org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username); } catch (BadCredentialsException badCredentialsException) { this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.BAD_CREDENTIALS); diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java index 7318fb045b..edaba1dd96 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.framework.common.enums; +import cn.hutool.core.lang.Matcher; +import cn.hutool.core.util.ArrayUtil; import lombok.AllArgsConstructor; import lombok.Getter; @@ -22,4 +24,8 @@ public enum UserTypeEnum { */ private final String name; + public static UserTypeEnum valueOf(Integer value) { + return ArrayUtil.firstMatch(userType -> userType.getValue().equals(value), UserTypeEnum.values()); + } + } diff --git a/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java b/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java index a7f23a3912..6cda19f82c 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java @@ -149,6 +149,7 @@ public class OperateLogAspect { private static void fillUserFields(OperateLogCreateReqDTO operateLogDTO) { operateLogDTO.setUserId(WebFrameworkUtils.getLoginUserId()); + operateLogDTO.setUserType(WebFrameworkUtils.getLoginUserType()); } private static void fillModuleFields(OperateLogCreateReqDTO operateLogDTO, diff --git a/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/dto/OperateLogCreateReqDTO.java b/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/dto/OperateLogCreateReqDTO.java index 1c8f49a264..d676001f28 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/dto/OperateLogCreateReqDTO.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/dto/OperateLogCreateReqDTO.java @@ -21,6 +21,9 @@ public class OperateLogCreateReqDTO { @ApiModelProperty(value = "用户编号", required = true, example = "1024") @NotNull(message = "用户编号不能为空") private Long userId; + @ApiModelProperty(value = "用户类型", required = true, example = "1") + @NotNull(message = "用户类型不能为空") + private Integer userType; @ApiModelProperty(value = "操作模块", required = true, example = "订单") @NotEmpty(message = "操作模块不能为空") diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java index ae8b12422e..d5953823a2 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java @@ -1,14 +1,13 @@ package cn.iocoder.yudao.framework.security.config; import cn.iocoder.yudao.framework.security.core.aop.PreAuthenticatedAspect; +import cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider; import cn.iocoder.yudao.framework.security.core.context.TransmittableThreadLocalSecurityContextHolderStrategy; import cn.iocoder.yudao.framework.security.core.filter.JWTAuthenticationTokenFilter; import cn.iocoder.yudao.framework.security.core.handler.AccessDeniedHandlerImpl; import cn.iocoder.yudao.framework.security.core.handler.AuthenticationEntryPointImpl; import cn.iocoder.yudao.framework.security.core.handler.LogoutSuccessHandlerImpl; import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthService; -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthServiceImpl; import cn.iocoder.yudao.framework.web.config.WebProperties; import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; import org.springframework.beans.factory.config.MethodInvokingFactoryBean; @@ -68,8 +67,8 @@ public class YudaoSecurityAutoConfiguration { * 退出处理类 Bean */ @Bean - public LogoutSuccessHandler logoutSuccessHandler(SecurityAuthService securityAuthService) { - return new LogoutSuccessHandlerImpl(securityProperties, securityAuthService); + public LogoutSuccessHandler logoutSuccessHandler(MultiUserDetailsAuthenticationProvider authenticationProvider) { + return new LogoutSuccessHandlerImpl(securityProperties, authenticationProvider); } /** @@ -87,18 +86,19 @@ public class YudaoSecurityAutoConfiguration { * Token 认证过滤器 Bean */ @Bean - public JWTAuthenticationTokenFilter authenticationTokenFilter(SecurityAuthService securityAuthService, + public JWTAuthenticationTokenFilter authenticationTokenFilter(MultiUserDetailsAuthenticationProvider authenticationProvider, GlobalExceptionHandler globalExceptionHandler) { - return new JWTAuthenticationTokenFilter(securityProperties, securityAuthService, globalExceptionHandler); + return new JWTAuthenticationTokenFilter(securityProperties, authenticationProvider, globalExceptionHandler); } /** - * 安全认证的 Service Bean + * 身份验证的 Provider Bean,通过它实现账号 + 密码的认证 */ @Bean - public SecurityAuthService securityAuthService(List securityFrameworkServices, - WebProperties webProperties) { - return new SecurityAuthServiceImpl(securityFrameworkServices, webProperties); + public MultiUserDetailsAuthenticationProvider authenticationProvider( + List securityFrameworkServices, + WebProperties webProperties, PasswordEncoder passwordEncoder) { + return new MultiUserDetailsAuthenticationProvider(securityFrameworkServices, webProperties, passwordEncoder); } /** diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java index a00b2c2a66..276ce1ed57 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.framework.security.config; +import cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider; import cn.iocoder.yudao.framework.security.core.filter.JWTAuthenticationTokenFilter; import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; import cn.iocoder.yudao.framework.web.config.WebProperties; @@ -35,16 +36,8 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap @Resource private WebProperties webProperties; - /** - * 自定义用户【认证】逻辑 - */ @Resource - private SecurityAuthFrameworkService userDetailsService; - /** - * Spring Security 加密器 - */ - @Resource - private PasswordEncoder passwordEncoder; + private MultiUserDetailsAuthenticationProvider authenticationProvider; /** * 认证失败处理类 Bean */ @@ -91,8 +84,7 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); + auth.authenticationProvider(authenticationProvider); } /** diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/authentication/MultiUserDetailsAuthenticationProvider.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/authentication/MultiUserDetailsAuthenticationProvider.java new file mode 100644 index 0000000000..dc8533f964 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/authentication/MultiUserDetailsAuthenticationProvider.java @@ -0,0 +1,149 @@ +package cn.iocoder.yudao.framework.security.core.authentication; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; +import cn.iocoder.yudao.framework.web.config.WebProperties; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.password.PasswordEncoder; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 支持多用户类型的 AuthenticationProvider 实现类 + * + * 为什么不用 {@link org.springframework.security.authentication.ProviderManager} 呢? + * 原因是,需要每个用户类型实现对应的 {@link AuthenticationProvider} + authentication,略显麻烦。实际,也是可以实现的。 + * + * 另外,额外支持 verifyTokenAndRefresh 校验令牌、logout 登出、mockLogin 模拟登陆等操作。 + * 实际上,它就是 {@link SecurityAuthFrameworkService} 定义的三个接口。 + * 因为需要支持多种类型,所以需要根据请求的 URL,判断出对应的用户类型,从而使用对应的 SecurityAuthFrameworkService 是吸纳 + * + * @see cn.iocoder.yudao.framework.common.enums.UserTypeEnum + * @author 芋道源码 + */ +public class MultiUserDetailsAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { + + private final Map services = new HashMap<>(); + + private final WebProperties properties; + + private final PasswordEncoder passwordEncoder; + + public MultiUserDetailsAuthenticationProvider(List serviceList, + WebProperties properties, PasswordEncoder passwordEncoder) { + serviceList.forEach(service -> services.put(service.getUserType(), service)); + this.properties = properties; + this.passwordEncoder = passwordEncoder; + } + + // ========== AuthenticationProvider 相关 ========== + + @Override + protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + // 执行用户的加载 + return selectService(authentication).loadUserByUsername(username); + } + + private SecurityAuthFrameworkService selectService(UsernamePasswordAuthenticationToken authentication) { + // 第一步,获得用户类型 + UserTypeEnum userType = getUserType(authentication); + // 第二步,获得 SecurityAuthFrameworkService + SecurityAuthFrameworkService service = services.get(userType); + Assert.notNull(service, "用户类型({}) 找不到 SecurityAuthFrameworkService 实现类", userType); + return service; + } + + private UserTypeEnum getUserType(UsernamePasswordAuthenticationToken authentication) { + Assert.isInstanceOf(MultiUsernamePasswordAuthenticationToken.class, authentication); + MultiUsernamePasswordAuthenticationToken multiAuthentication = (MultiUsernamePasswordAuthenticationToken) authentication; + UserTypeEnum userType = multiAuthentication.getUserType(); + Assert.notNull(userType, "用户类型不能为空"); + return userType; + } + + @Override // copy 自 DaoAuthenticationProvider 的 additionalAuthenticationChecks 方法 + protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + // 校验 credentials + if (authentication.getCredentials() == null) { + this.logger.debug("Failed to authenticate since no credentials provided"); + throw new BadCredentialsException(this.messages.getMessage( + "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + // 校验 password + String presentedPassword = authentication.getCredentials().toString(); + if (!this.passwordEncoder.matches(presentedPassword, userDetails.getPassword())) { + this.logger.debug("Failed to authenticate since password does not match stored value"); + throw new BadCredentialsException(this.messages.getMessage( + "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + } + + // ========== SecurityAuthFrameworkService 相关 ========== + + /** + * 校验 token 的有效性,并获取用户信息 + * 通过后,刷新 token 的过期时间 + * + * @param request 请求 + * @param token token + * @return 用户信息 + */ + public LoginUser verifyTokenAndRefresh(HttpServletRequest request, String token) { + return selectService(request).verifyTokenAndRefresh(token); + } + + /** + * 模拟指定用户编号的 LoginUser + * + * @param request 请求 + * @param userId 用户编号 + * @return 登录用户 + */ + public LoginUser mockLogin(HttpServletRequest request, Long userId) { + return selectService(request).mockLogin(userId); + } + + /** + * 基于 token 退出登录 + * + * @param request 请求 + * @param token token + */ + public void logout(HttpServletRequest request, String token) { + selectService(request).logout(token); + } + + private SecurityAuthFrameworkService selectService(HttpServletRequest request) { + // 第一步,获得用户类型 + UserTypeEnum userType = getUserType(request); + // 第二步,获得 SecurityAuthFrameworkService + SecurityAuthFrameworkService service = services.get(userType); + Assert.notNull(service, "URI({}) 用户类型({}) 找不到 SecurityAuthFrameworkService 实现类", + request.getRequestURI(), userType); + return service; + } + + private UserTypeEnum getUserType(HttpServletRequest request) { + if (request.getRequestURI().startsWith(properties.getAdminApi().getPrefix())) { + return UserTypeEnum.ADMIN; + } + if (request.getRequestURI().startsWith(properties.getAppApi().getPrefix())) { + return UserTypeEnum.MEMBER; + } + throw new IllegalArgumentException(StrUtil.format("URI({}) 找不到匹配的用户类型", request.getRequestURI())); + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/authentication/MultiUsernamePasswordAuthenticationToken.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/authentication/MultiUsernamePasswordAuthenticationToken.java new file mode 100644 index 0000000000..f0bc8dfac4 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/authentication/MultiUsernamePasswordAuthenticationToken.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.framework.security.core.authentication; + +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import lombok.Getter; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; + +/** + * 支持多用户的 UsernamePasswordAuthenticationToken 实现类 + * + * @author 芋道源码 + */ +@Getter +public class MultiUsernamePasswordAuthenticationToken extends UsernamePasswordAuthenticationToken { + + /** + * 用户类型 + */ + private UserTypeEnum userType; + + public MultiUsernamePasswordAuthenticationToken(Object principal, Object credentials) { + super(principal, credentials); + } + + public MultiUsernamePasswordAuthenticationToken(Object principal, Object credentials, + Collection authorities) { + super(principal, credentials, authorities); + } + + public MultiUsernamePasswordAuthenticationToken(Object principal, Object credentials, UserTypeEnum userType) { + super(principal, credentials); + this.userType = userType; + } + + public MultiUsernamePasswordAuthenticationToken(Object principal, Object credentials, + Collection authorities, UserTypeEnum userType) { + super(principal, credentials, authorities); + this.userType = userType; + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/JWTAuthenticationTokenFilter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/JWTAuthenticationTokenFilter.java index 61685e9029..804c88d35f 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/JWTAuthenticationTokenFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/JWTAuthenticationTokenFilter.java @@ -5,10 +5,10 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthService; +import cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; @@ -23,12 +23,12 @@ import java.io.IOException; * * @author 芋道源码 */ -@AllArgsConstructor +@RequiredArgsConstructor public class JWTAuthenticationTokenFilter extends OncePerRequestFilter { private final SecurityProperties securityProperties; - private final SecurityAuthService authService; + private final MultiUserDetailsAuthenticationProvider authenticationProvider; private final GlobalExceptionHandler globalExceptionHandler; @@ -40,7 +40,7 @@ public class JWTAuthenticationTokenFilter extends OncePerRequestFilter { if (StrUtil.isNotEmpty(token)) { try { // 验证 token 有效性 - LoginUser loginUser = authService.verifyTokenAndRefresh(request, token); + LoginUser loginUser = authenticationProvider.verifyTokenAndRefresh(request, token); // 模拟 Login 功能,方便日常开发调试 if (loginUser == null) { loginUser = this.mockLoginUser(request, token); @@ -78,7 +78,7 @@ public class JWTAuthenticationTokenFilter extends OncePerRequestFilter { return null; } Long userId = Long.valueOf(token.substring(securityProperties.getMockSecret().length())); - return authService.mockLogin(request, userId); + return authenticationProvider.mockLogin(request, userId); } } diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/LogoutSuccessHandlerImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/LogoutSuccessHandlerImpl.java index e61b351c21..1a642304ca 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/LogoutSuccessHandlerImpl.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/LogoutSuccessHandlerImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.config.SecurityProperties; -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthService; +import cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import lombok.AllArgsConstructor; import org.springframework.security.core.Authentication; @@ -24,14 +24,14 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { private final SecurityProperties securityProperties; - private final SecurityAuthService authService; + private final MultiUserDetailsAuthenticationProvider authenticationProvider; @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { // 执行退出 String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader()); if (StrUtil.isNotBlank(token)) { - authService.logout(request, token); + authenticationProvider.logout(request, token); } // 返回成功 ServletUtils.writeJSON(response, CommonResult.success(null)); diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthService.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthService.java deleted file mode 100644 index 4fee9cd0d0..0000000000 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthService.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.yudao.framework.security.core.service; - -import cn.iocoder.yudao.framework.security.core.LoginUser; - -import javax.servlet.http.HttpServletRequest; - -/** - * 安全认证的 Service 接口,对 security 组件提供统一的 Auth 相关的方法。 - * 主要是会基于 {@link HttpServletRequest} 参数,匹配对应的 {@link SecurityAuthFrameworkService} 实现,然后调用其方法。 - * 因此,在方法的定义上,和 {@link SecurityAuthFrameworkService} 差不多。 - * - * @author 芋道源码 - */ -public interface SecurityAuthService { - - /** - * 校验 token 的有效性,并获取用户信息 - * 通过后,刷新 token 的过期时间 - * - * @param request 请求 - * @param token token - * @return 用户信息 - */ - LoginUser verifyTokenAndRefresh(HttpServletRequest request, String token); - - /** - * 模拟指定用户编号的 LoginUser - * - * @param request 请求 - * @param userId 用户编号 - * @return 登录用户 - */ - LoginUser mockLogin(HttpServletRequest request, Long userId); - - /** - * 基于 token 退出登录 - * - * @param request 请求 - * @param token token - */ - void logout(HttpServletRequest request, String token); - -} diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthServiceImpl.java deleted file mode 100644 index d9ab8eb0e1..0000000000 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityAuthServiceImpl.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.iocoder.yudao.framework.security.core.service; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.framework.web.config.WebProperties; - -import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 安全认证的 Service 实现类,基于请求地址,计算到对应的 {@link UserTypeEnum} 枚举,从而拿到对应的 {@link SecurityAuthFrameworkService} 实现 - * - * @author 芋道源码 - */ -public class SecurityAuthServiceImpl implements SecurityAuthService { - - private final Map services = new HashMap<>(); - private final WebProperties properties; - - public SecurityAuthServiceImpl(List serviceList, WebProperties properties) { - serviceList.forEach(service -> services.put(service.getUserType(), service)); - this.properties = properties; - } - - @Override - public LoginUser verifyTokenAndRefresh(HttpServletRequest request, String token) { - return selectService(request).verifyTokenAndRefresh(token); - } - - @Override - public LoginUser mockLogin(HttpServletRequest request, Long userId) { - return selectService(request).mockLogin(userId); - } - - @Override - public void logout(HttpServletRequest request, String token) { - selectService(request).logout(token); - } - - private SecurityAuthFrameworkService selectService(HttpServletRequest request) { - // 第一步,获得用户类型 - UserTypeEnum userType = getUserType(request); - // 第二步,获得 SecurityAuthFrameworkService - SecurityAuthFrameworkService service = services.get(userType); - Assert.notNull(service, "URI({}) 用户类型({}) 找不到 SecurityAuthFrameworkService 实现类", - request.getRequestURI(), userType); - return service; - } - - private UserTypeEnum getUserType(HttpServletRequest request) { - if (request.getRequestURI().startsWith(properties.getAdminApi().getPrefix())) { - return UserTypeEnum.ADMIN; - } - if (request.getRequestURI().startsWith(properties.getAppApi().getPrefix())) { - return UserTypeEnum.MEMBER; - } - throw new IllegalArgumentException(StrUtil.format("URI({}) 找不到匹配的用户类型", request.getRequestURI())); - } - -} diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java index acbfb9c2ba..273f34072d 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java @@ -55,6 +55,11 @@ public class WebFrameworkUtils { return (Integer) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE); } + public static Integer getLoginUserType() { + HttpServletRequest request = getRequest(); + return getLoginUserType(request); + } + public static Long getLoginUserId() { HttpServletRequest request = getRequest(); return getLoginUserId(request); diff --git a/yudao-module-member/yudao-module-member-impl/pom.xml b/yudao-module-member/yudao-module-member-impl/pom.xml index de46508069..ce7ff84a0b 100644 --- a/yudao-module-member/yudao-module-member-impl/pom.xml +++ b/yudao-module-member/yudao-module-member-impl/pom.xml @@ -30,6 +30,10 @@ yudao-core-service + + cn.iocoder.boot + yudao-spring-boot-starter-biz-operatelog + cn.iocoder.boot yudao-spring-boot-starter-biz-sms diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http index c9cadedccd..dbe82122ac 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http @@ -1,6 +1,7 @@ ### 请求 /login 接口 => 成功 -POST {{userServerUrl}}/login +POST {{userApi}}/login Content-Type: application/json +tenant-id: {{userTenentId}} { "mobile": "15601691300", diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java index 3876e708bd..f52e96d1a8 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth; import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.service.auth.AuthService; @@ -40,6 +41,7 @@ public class AppAuthController { @PostMapping("/login") @ApiOperation("使用手机 + 密码登录") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 public CommonResult login(@RequestBody @Valid AppAuthLoginReqVO reqVO) { String token = authService.login(reqVO, getClientIP(), getUserAgent()); // 返回结果 @@ -48,6 +50,7 @@ public class AppAuthController { @PostMapping("/sms-login") @ApiOperation("使用手机 + 验证码登录") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 public CommonResult smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) { String token = authService.smsLogin(reqVO, getClientIP(), getUserAgent()); // 返回结果 @@ -56,12 +59,13 @@ public class AppAuthController { @PostMapping("/send-sms-code") @ApiOperation(value = "发送手机验证码") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 public CommonResult sendSmsCode(@RequestBody @Valid AppAuthSendSmsReqVO reqVO) { smsCodeService.sendSmsCode(reqVO.getMobile(), reqVO.getScene(), getClientIP()); return success(true); } - @GetMapping("/send-sms-code-login") + @GetMapping("/send-sms-code-login") // TODO 芋艿:post 比较合理 @ApiOperation(value = "向已登录用户发送验证码",notes = "修改手机时验证原手机号使用") public CommonResult sendSmsCodeLogin() { smsCodeService.sendSmsCodeLogin(getLoginUserId()); @@ -71,6 +75,7 @@ public class AppAuthController { @PostMapping("/reset-password") @ApiOperation(value = "重置密码", notes = "用户忘记密码时使用") @PreAuthenticated + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 public CommonResult resetPassword(@RequestBody @Valid AppAuthResetPasswordReqVO reqVO) { authService.resetPassword(reqVO); return success(true); @@ -106,6 +111,7 @@ public class AppAuthController { @PostMapping("/social-login2") @ApiOperation("社交登录,使用 手机号 + 手机验证码") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 public CommonResult socialLogin2(@RequestBody @Valid AppAuthSocialLogin2ReqVO reqVO) { String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent()); return success(AppAuthLoginRespVO.builder().token(token).build()); @@ -113,6 +119,7 @@ public class AppAuthController { @PostMapping("/social-bind") @ApiOperation("社交绑定,使用 code 授权码") + @PreAuthenticated public CommonResult socialBind(@RequestBody @Valid AppAuthSocialBindReqVO reqVO) { authService.socialBind(getLoginUserId(), reqVO); return CommonResult.success(true); @@ -120,6 +127,7 @@ public class AppAuthController { @DeleteMapping("/social-unbind") @ApiOperation("取消社交绑定") + @PreAuthenticated public CommonResult socialUnbind(@RequestBody AppAuthSocialUnbindReqVO reqVO) { socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.MEMBER); return CommonResult.success(true); diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java index a28b6572db..6deabba120 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java @@ -14,6 +14,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; @@ -176,7 +177,8 @@ public class AuthServiceImpl implements AuthService { try { // 调用 Spring Security 的 AuthenticationManager#authenticate(...) 方法,使用账号密码进行认证 // 在其内部,会调用到 loadUserByUsername 方法,获取 User 信息 - authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); + authentication = authenticationManager.authenticate(new MultiUsernamePasswordAuthenticationToken( + username, password, getUserType())); } catch (BadCredentialsException badCredentialsException) { this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.BAD_CREDENTIALS); throw exception(AUTH_LOGIN_BAD_CREDENTIALS); diff --git a/yudao-server/pom.xml b/yudao-server/pom.xml deleted file mode 100644 index 0040513149..0000000000 --- a/yudao-server/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - yudao - cn.iocoder.boot - ${revision} - - 4.0.0 - - yudao-server - jar - - ${artifactId} - - 后端 Server 的主项目,通过引入需要 yudao-module-xxx 的依赖, - 从而实现提供 RESTful API 给 yudao-ui-admin、yudao-ui-user 等前端项目。 - 本质上来说,它就是个空壳(容器)! - - - diff --git a/更新日志.md b/更新日志.md index 5ce39fb849..9ac18dd8e2 100644 --- a/更新日志.md +++ b/更新日志.md @@ -4,29 +4,30 @@ * 钉钉、飞书等通知 * Vue3 支持 -## [v1.4.0] 计划 - -* 工作流 - * 修改表单为外置表单 - * 修改请假流程 - * 暂时以用户的岗位作为activiti 的用户组 - * 请假需要请假人部门下具有项目经理岗位, 部门经理, 和人事 岗位的用户 - * 新增 芋道源码部门下 用户 normal(岗位 普通用户) projectmgr(岗位 项目经理) depmgr(岗位 部门经理) hradmin (岗位 人事) - * 请假流程如下 - 1. 请假人 normal (密码 123456) 登录在我的请假表单,点击新增,填写请假表单 - 2. 如果请假天数<=3, 项目经理 进行审批. 项目经理 projectmgr(密码:123456) 登录 待办请假,中进行审批,可以查看历史跟踪,和流程图 - 3. 如果请假天数>3 需部门经理 进行审批,部门经理depmgr(密码:123456) 登录 待办请假,中进行审批,可以查看历史跟踪,和流程图 - 4. 人事登陆(用户名:hradmin 密码:123456) 登录 待办请假, 中进行审批,可以查看历史跟踪,和流程图 - 5. 流程结束 - * 我的请假中,可以查询本人的请假申请, 和进度 - ### 📝 TODO * 支付 * 用户前台的社交登陆 * 用户前台的修改手机、修改密码、忘记密码 -## [v1.3.0] 进行中 +## [v1.4.0] 计划,预计 2022.02.28 发布 + +### ⚠️ Warning + +### 📈 Statistic + +### ⭐ New Features + +*【优化】操作日志新增用户类型,实现 APP 端的 API 的操作日志的记录 + +### 🐞 Bug Fixes + +*【修复】用户无权限访问 指定 API 时,未返回 FORBIDDEN 结果码 + +### 🔨 Dependency Upgrades + + +## [v1.3.0] 2022.01.24 ### ⚠️ Warning From 36d01371bb1562443e67d70d7fc9e2c3a912a30b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 29 Jan 2022 10:01:35 +0800 Subject: [PATCH 07/47] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20bpm=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=9A=84=E4=BF=AE=E6=94=B9=E5=BB=BA=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-module-bpm/TODO.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 yudao-module-bpm/TODO.md diff --git a/yudao-module-bpm/TODO.md b/yudao-module-bpm/TODO.md new file mode 100644 index 0000000000..35a2e25b1f --- /dev/null +++ b/yudao-module-bpm/TODO.md @@ -0,0 +1,6 @@ +1. 类名可以去掉 Bpm 前缀哈 +2. 后续接口我们分成 admin 管理后天,app 用户前端;所以 controller 包下,需要有 admin 和 app 两个子包。可见 https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/feature/multi-module/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller +3. yudao-module-xxx-api 是暴露接口给外部模块,所以可以把 yudao-module-bpm-core-service-api 改成 yudao-module-bpm-api。大概率用不了暴露 BpmUserGroupServiceApi 哈。 +4. yudao-module-bpm-core-service-impl 模块,要不改成 yudao-module-bpm-base,本质上是提供给 yudao-module-bpm-flowable-impl 和 yudao-module-bpm-activiti-impl 继承的。这样的话,我们在 yudao-module-bpm-base: + * 定义一些可被继承的类,例如说 ModelAbstractService; + * 定义一些无需被继承的类,例如说 UserGroupService、UserGroupController 等等; From cee7e5072034dba7597b2d03eff448e79a530172 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 29 Jan 2022 14:05:06 +0800 Subject: [PATCH 08/47] =?UTF-8?q?1.=E3=80=90=E4=BF=AE=E5=A4=8D=E3=80=91?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=88=B7=E6=96=B0=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E7=BC=93=E5=AD=98=E6=97=B6=EF=BC=8C=E6=97=A0=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E4=B8=8A=E7=BA=BF=E6=96=87=EF=BC=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8A=A5=E9=94=99=202.=20member=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=8C=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8=20member?= =?UTF-8?q?=20=E5=89=8D=E7=BC=80=203.=20=E4=BF=AE=E6=94=B9=20Spring=20Secu?= =?UTF-8?q?rity=20logout=20=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E7=94=A8=E6=88=B7=E7=B1=BB=E5=9E=8B=E7=9A=84=E9=80=80?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http-client.env.json | 1 - .../system/dal/mysql/dept/SysDeptMapper.java | 2 + .../YudaoWebSecurityConfigurerAdapter.java | 8 +++- .../core/util/SecurityFrameworkUtils.java | 37 +++++++++++++------ .../config/BpmActivitiConfiguration.java | 6 --- .../app/auth/AppAuthController.http | 11 ++++-- .../app/auth/AppAuthController.java | 7 +++- .../app/weixin/AppWxMpController.http | 0 .../app/weixin/AppWxMpController.java | 6 +-- .../member/dal/dataobject/user/UserDO.java | 2 +- .../yudao/module/member/dal/package-info.java | 2 +- .../yudao/module/member/package-info.java | 7 ++++ .../src/test/resources/sql/clean.sql | 2 +- .../src/test/resources/sql/create_tables.sql | 2 +- .../userserver/UserServerApplication.java | 14 ------- .../modules/weixin/package-info.java | 7 ---- .../src/main/resources/application.yaml | 3 -- 更新日志.md | 1 + 18 files changed, 63 insertions(+), 55 deletions(-) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/controller/mp/WxMpController.http => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/weixin/AppWxMpController.http (100%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/controller/mp/WxMpController.java => yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/weixin/AppWxMpController.java (90%) delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/UserServerApplication.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/package-info.java diff --git a/http-client.env.json b/http-client.env.json index c18fbb054e..10c1fdd4f8 100644 --- a/http-client.env.json +++ b/http-client.env.json @@ -1,7 +1,6 @@ { "local": { "baseUrl": "http://127.0.0.1:48080/api", - "userServerUrl": "http://127.0.0.1:28080/api", "token": "test1", "userApi": "http://127.0.0.1:48080/app-api", diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java index 84ab4c85de..be3bedeafb 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -28,6 +29,7 @@ public interface SysDeptMapper extends BaseMapperX { return selectCount(SysDeptDO::getParentId, parentId); } + @InterceptorIgnore(tenantLine = "on") // 该方法忽略多租户。原因:该方法被异步 task 调用,此时获取不到租户编号 default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { return selectOne(new LambdaQueryWrapper().select(SysDeptDO::getId) .gt(SysDeptDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null; diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java index 276ce1ed57..312f51e046 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.framework.security.config; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider; import cn.iocoder.yudao.framework.security.core.filter.JWTAuthenticationTokenFilter; import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; @@ -21,8 +22,10 @@ import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; +import org.springframework.security.web.util.matcher.RequestMatcher; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * 自定义的 Spring Security 配置适配器实现 @@ -106,6 +109,7 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap */ @Override protected void configure(HttpSecurity httpSecurity) throws Exception { + // 登出 httpSecurity // 开启跨域 .cors().and() @@ -117,7 +121,9 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap // 一堆自定义的 Spring Security 处理器 .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint) .accessDeniedHandler(accessDeniedHandler).and() - .logout().logoutUrl(buildAdminApi("/logout")).logoutSuccessHandler(logoutSuccessHandler); // 登出 + // 登出地址的配置 + .logout().logoutSuccessHandler(logoutSuccessHandler).logoutRequestMatcher(request -> // 匹配多种用户类型的登出 + StrUtil.equalsAny(request.getRequestURI(), buildAdminApi("/logout"), buildAppApi("/member/logout"))); // 设置每个请求的权限 ①:全局共享规则 httpSecurity.authorizeRequests() diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java index 93f163086b..562c6ed9f6 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java @@ -41,6 +41,19 @@ public class SecurityFrameworkUtils { return authorization.substring(index + 7).trim(); } + /** + * 获得当前认证信息 + * + * @return 认证信息 + */ + public static Authentication getAuthentication() { + SecurityContext context = SecurityContextHolder.getContext(); + if (context == null) { + return null; + } + return context.getAuthentication(); + } + /** * 获取当前用户 * @@ -48,11 +61,7 @@ public class SecurityFrameworkUtils { */ @Nullable public static LoginUser getLoginUser() { - SecurityContext context = SecurityContextHolder.getContext(); - if (context == null) { - return null; - } - Authentication authentication = context.getAuthentication(); + Authentication authentication = getAuthentication(); if (authentication == null) { return null; } @@ -88,16 +97,22 @@ public class SecurityFrameworkUtils { * @param request 请求 */ public static void setLoginUser(LoginUser loginUser, HttpServletRequest request) { - // 创建 UsernamePasswordAuthenticationToken 对象 - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( - loginUser, null, loginUser.getAuthorities()); - authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - // 设置到上下文 - SecurityContextHolder.getContext().setAuthentication(authenticationToken); + // 创建 Authentication,并设置到上下文 + Authentication authentication = buildAuthentication(loginUser, request); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 额外设置到 request 中,用于 ApiAccessLogFilter 可以获取到用户编号; // 原因是,Spring Security 的 Filter 在 ApiAccessLogFilter 后面,在它记录访问日志时,线上上下文已经没有用户编号等信息 WebFrameworkUtils.setLoginUserId(request, loginUser.getId()); WebFrameworkUtils.setLoginUserType(request, loginUser.getUserType()); } + private static Authentication buildAuthentication(LoginUser loginUser, HttpServletRequest request) { + // 创建 UsernamePasswordAuthenticationToken 对象 + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginUser, null, loginUser.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + return authenticationToken; + } + } diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index 8e30c22db6..2e1da6f4ab 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -10,17 +10,11 @@ import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; import org.activiti.api.runtime.shared.identity.UserGroupManager; -import org.activiti.core.common.spring.identity.ActivitiUserGroupManagerImpl; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.userdetails.UserDetailsService; import java.util.Collections; import java.util.List; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http index dbe82122ac..81f250bd31 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http @@ -1,5 +1,5 @@ ### 请求 /login 接口 => 成功 -POST {{userApi}}/login +POST {{userApi}}/member/login Content-Type: application/json tenant-id: {{userTenentId}} @@ -9,8 +9,9 @@ tenant-id: {{userTenentId}} } ### 请求 /send-sms-code 接口 => 成功 -POST {{userServerUrl}}/send-sms-code +POST {{userApi}}/member/send-sms-code Content-Type: application/json +tenant-id: {{userTenentId}} { "mobile": "15601691399", @@ -18,8 +19,9 @@ Content-Type: application/json } ### 请求 /sms-login 接口 => 成功 -POST {{userServerUrl}}/sms-login +POST {{userApi}}/member/sms-login Content-Type: application/json +tenant-id: {{userTenentId}} { "mobile": "15601691301", @@ -27,6 +29,7 @@ Content-Type: application/json } ### 请求 /logout 接口 => 成功 -POST {{userServerUrl}}/logout +POST {{userApi}}/member/logout Content-Type: application/json Authorization: Bearer c1b76bdaf2c146c581caa4d7fd81ee66 +tenant-id: {{userTenentId}} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java index f52e96d1a8..a7c541e1fa 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.service.auth.AuthService; import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; @@ -13,6 +14,7 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -26,7 +28,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @Api(tags = "APP 端 - 认证") @RestController -@RequestMapping("/") +@RequestMapping("/member/") @Validated @Slf4j public class AppAuthController { @@ -39,6 +41,9 @@ public class AppAuthController { @Resource private SysSocialCoreService socialService; + @Resource + private LogoutSuccessHandler logoutSuccessHandler; + @PostMapping("/login") @ApiOperation("使用手机 + 密码登录") @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/controller/mp/WxMpController.http b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/weixin/AppWxMpController.http similarity index 100% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/controller/mp/WxMpController.http rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/weixin/AppWxMpController.http diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/controller/mp/WxMpController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/weixin/AppWxMpController.java similarity index 90% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/controller/mp/WxMpController.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/weixin/AppWxMpController.java index decd907a0d..5b33d44e6d 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/controller/mp/WxMpController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/weixin/AppWxMpController.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.weixin.controller.mp; +package cn.iocoder.yudao.module.member.controller.app.weixin; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import io.swagger.annotations.Api; @@ -19,10 +19,10 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Api(tags = "微信公众号") @RestController -@RequestMapping("/wx/mp") +@RequestMapping("/member/wx-mp") @Validated @Slf4j -public class WxMpController { +public class AppWxMpController { @Resource private WxMpService mpService; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java index f451680442..adefe1429d 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java @@ -16,7 +16,7 @@ import java.util.Date; * * @author 芋道源码 */ -@TableName(value = "mbr_user", autoResultMap = true) +@TableName(value = "member_user", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @Builder diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java index 5b05c46f14..a45c2a1613 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/package-info.java @@ -4,6 +4,6 @@ * 2. redis:Redis 的 CRUD 操作 * 3. mysql:MySQL 的 CRUD 操作 * - * 其中,MySQL 的表以 mbr_ 作为前缀 + * 其中,MySQL 的表以 member_ 作为前缀 */ package cn.iocoder.yudao.module.member.dal; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/package-info.java index dabac6ac39..405aa4cbf6 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/package-info.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/package-info.java @@ -1 +1,8 @@ +/** + * member 模块,我们放会员业务。 + * 例如说:会员中心等等 + * + * 1. Controller URL:以 /member/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 member_ 开头,方便在数据库中区分 + */ package cn.iocoder.yudao.module.member; diff --git a/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql index bedf8d0085..9775e24542 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql +++ b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql @@ -1,2 +1,2 @@ -- mbr 开头的 DB -DELETE FROM "mbr_user"; \ No newline at end of file +DELETE FROM "member_user"; diff --git a/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql index c9dfd8c318..98d3d2bc18 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql +++ b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql @@ -1,5 +1,5 @@ -- mbr 开头的 DB -CREATE TABLE IF NOT EXISTS "mbr_user" ( +CREATE TABLE IF NOT EXISTS "member_user" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '编号', "nickname" varchar(30) NOT NULL DEFAULT '' COMMENT '用户昵称', "avatar" varchar(255) NOT NULL DEFAULT '' COMMENT '头像', diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/UserServerApplication.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/UserServerApplication.java deleted file mode 100644 index b0ba53e9b2..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/UserServerApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.yudao.userserver; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} 和 ${yudao.core-service.base-package} -@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}", "${yudao.core-service.base-package}"}) -public class UserServerApplication { - - public static void main(String[] args) { - SpringApplication.run(UserServerApplication.class, args); - } - -} diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/package-info.java deleted file mode 100644 index 69d3e22212..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/weixin/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * weixin 包下,我们放通用业务,支撑上层的核心业务。 - * 例如说:用户、部门、权限、数据字典等等 - * - * 缩写:wx - */ -package cn.iocoder.yudao.userserver.modules.weixin; diff --git a/yudao-user-server/src/main/resources/application.yaml b/yudao-user-server/src/main/resources/application.yaml index 1d789232d9..7f11275267 100644 --- a/yudao-user-server/src/main/resources/application.yaml +++ b/yudao-user-server/src/main/resources/application.yaml @@ -37,8 +37,6 @@ mybatis-plus: mapper-locations: classpath*:mapper/*.xml type-aliases-package: ${yudao.info.base-package}.modules.*.dal.dataobject, ${yudao.core-service.base-package}.modules.*.dal.dataobject - - --- #################### 芋道相关配置 #################### yudao: @@ -67,5 +65,4 @@ yudao: - cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants - cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants - debug: false diff --git a/更新日志.md b/更新日志.md index 9ac18dd8e2..b1f34099e4 100644 --- a/更新日志.md +++ b/更新日志.md @@ -23,6 +23,7 @@ ### 🐞 Bug Fixes *【修复】用户无权限访问 指定 API 时,未返回 FORBIDDEN 结果码 +*【修复】定时任务刷新本地缓存时,无租户上线文,导致查询报错 ### 🔨 Dependency Upgrades From 06887bff1630e13874e1b4f488ac6be5fc653baa Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 29 Jan 2022 16:05:32 +0800 Subject: [PATCH 09/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=204=EF=BC=9Asystem=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=B0=86=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E4=BB=A3=E7=A0=81=E5=85=88=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 + yudao-admin-server/pom.xml | 9 +- .../adminserver/AdminServerApplication.java | 2 +- .../convert/permission/SysMenuConvert.java | 28 ----- .../framework/captcha/package-info.java | 4 - .../framework/codegen/package-info.java | 4 - .../datapermission/package-info.java | 4 - .../modules/system/job/package-info.java | 1 - .../modules/system/package-info.java | 7 -- .../codegen/ToolCodegenColumnDO.java | 3 +- .../codegen/ToolCodegenTableDO.java | 3 +- .../codegen/config/CodegenConfiguration.java | 2 +- .../codegen/config/CodegenProperties.java | 2 +- .../tool/framework/codegen/package-info.java | 4 + .../codegen/impl/ToolCodegenEngine.java | 2 +- .../codegen/impl/ToolCodegenServiceImpl.java | 2 +- .../src/main/resources/application.yaml | 3 +- .../quartz/core/SchedulerManagerTest.java | 2 +- .../redis/core/stream/RedisStreamTest.java | 6 +- .../modules/system/service/package-info.java | 2 +- .../sms/SysSmsServiceIntegrationTest.java | 14 +-- .../config/YudaoMybatisAutoConfiguration.java | 3 +- .../mybatis/core}/enums/SqlConstants.java | 2 +- .../yudao-module-member-impl/pom.xml | 5 +- yudao-module-system/pom.xml | 24 ++++ .../yudao-module-system-api/pom.xml | 26 +++++ .../yudao-module-system-impl/pom.xml | 106 ++++++++++++++++++ .../controller/auth/SysAuthController.http | 0 .../controller/auth/SysAuthController.java | 16 +-- .../auth/SysUserSessionController.java | 12 +- .../auth/vo/auth/SysAuthLoginReqVO.java | 2 +- .../auth/vo/auth/SysAuthLoginRespVO.java | 2 +- .../auth/vo/auth/SysAuthMenuRespVO.java | 2 +- .../vo/auth/SysAuthPermissionInfoRespVO.java | 2 +- .../auth/vo/auth/SysAuthSocialBindReqVO.java | 2 +- .../vo/auth/SysAuthSocialLogin2ReqVO.java | 2 +- .../auth/vo/auth/SysAuthSocialLoginReqVO.java | 2 +- .../vo/auth/SysAuthSocialUnbindReqVO.java | 2 +- .../session/SysUserSessionPageItemRespVO.java | 2 +- .../vo/session/SysUserSessionPageReqVO.java | 2 +- .../common/SysCaptchaController.http | 0 .../common/SysCaptchaController.java | 6 +- .../common/vo/SysCaptchaImageRespVO.java | 2 +- .../controller/dept/SysDeptController.java | 8 +- .../controller/dept/SysPostController.java | 8 +- .../dept/vo/dept/SysDeptBaseVO.java | 4 +- .../dept/vo/dept/SysDeptCreateReqVO.java | 2 +- .../dept/vo/dept/SysDeptListReqVO.java | 2 +- .../dept/vo/dept/SysDeptRespVO.java | 2 +- .../dept/vo/dept/SysDeptSimpleRespVO.java | 2 +- .../dept/vo/dept/SysDeptUpdateReqVO.java | 2 +- .../dept/vo/post/SysPostBaseVO.java | 2 +- .../dept/vo/post/SysPostCreateReqVO.java | 2 +- .../dept/vo/post/SysPostExcelVO.java | 2 +- .../dept/vo/post/SysPostExportReqVO.java | 2 +- .../dept/vo/post/SysPostListReqVO.java | 2 +- .../dept/vo/post/SysPostPageReqVO.java | 2 +- .../dept/vo/post/SysPostRespVO.java | 2 +- .../dept/vo/post/SysPostSimpleRespVO.java | 2 +- .../dept/vo/post/SysPostUpdateReqVO.java | 2 +- .../dict/SysDictDataController.http | 0 .../dict/SysDictDataController.java | 8 +- .../dict/SysDictTypeController.java | 10 +- .../dict/vo/data/SysDictDataBaseVO.java | 2 +- .../dict/vo/data/SysDictDataCreateReqVO.java | 2 +- .../dict/vo/data/SysDictDataExcelVO.java | 2 +- .../dict/vo/data/SysDictDataExportReqVO.java | 2 +- .../dict/vo/data/SysDictDataPageReqVO.java | 2 +- .../dict/vo/data/SysDictDataRespVO.java | 2 +- .../dict/vo/data/SysDictDataSimpleRespVO.java | 2 +- .../dict/vo/data/SysDictDataUpdateReqVO.java | 2 +- .../dict/vo/type/SysDictTypeBaseVO.java | 2 +- .../dict/vo/type/SysDictTypeCreateReqVO.java | 2 +- .../dict/vo/type/SysDictTypeExcelVO.java | 2 +- .../dict/vo/type/SysDictTypeExportReqVO.java | 2 +- .../dict/vo/type/SysDictTypePageReqVO.java | 2 +- .../dict/vo/type/SysDictTypeRespVO.java | 2 +- .../dict/vo/type/SysDictTypeSimpleRespVO.java | 2 +- .../dict/vo/type/SysDictTypeUpdateReqVO.java | 2 +- .../errorcode/SysErrorCodeController.http | 0 .../errorcode/SysErrorCodeController.java | 10 +- .../errorcode/vo/SysErrorCodeBaseVO.java | 2 +- .../errorcode/vo/SysErrorCodeCreateReqVO.java | 2 +- .../errorcode/vo/SysErrorCodeExcelVO.java | 6 +- .../errorcode/vo/SysErrorCodeExportReqVO.java | 2 +- .../errorcode/vo/SysErrorCodePageReqVO.java | 2 +- .../errorcode/vo/SysErrorCodeRespVO.java | 2 +- .../errorcode/vo/SysErrorCodeUpdateReqVO.java | 2 +- .../logger/SysLoginLogController.java | 14 +-- .../logger/SysOperateLogController.http | 0 .../logger/SysOperateLogController.java | 17 ++- .../logger/vo/loginlog/SysLoginLogBaseVO.java | 2 +- .../vo/loginlog/SysLoginLogExcelVO.java | 2 +- .../vo/loginlog/SysLoginLogExportReqVO.java | 2 +- .../vo/loginlog/SysLoginLogPageReqVO.java | 2 +- .../logger/vo/loginlog/SysLoginLogRespVO.java | 2 +- .../vo/operatelog/SysOperateLogBaseVO.java | 2 +- .../vo/operatelog/SysOperateLogExcelVO.java | 2 +- .../operatelog/SysOperateLogExportReqVO.java | 2 +- .../vo/operatelog/SysOperateLogPageReqVO.java | 2 +- .../vo/operatelog/SysOperateLogRespVO.java | 2 +- .../notice/SysNoticeController.java | 14 +-- .../controller/notice/vo/SysNoticeBaseVO.java | 2 +- .../notice/vo/SysNoticeCreateReqVO.java | 2 +- .../notice/vo/SysNoticePageReqVO.java | 2 +- .../controller/notice/vo/SysNoticeRespVO.java | 2 +- .../notice/vo/SysNoticeUpdateReqVO.java | 2 +- .../permission/SysMenuController.http | 0 .../permission/SysMenuController.java | 10 +- .../permission/SysPermissionController.java | 10 +- .../permission/SysRoleController.http | 0 .../permission/SysRoleController.java | 8 +- .../permission/vo/menu/SysMenuBaseVO.java | 2 +- .../vo/menu/SysMenuCreateReqVO.java | 2 +- .../permission/vo/menu/SysMenuListReqVO.java | 2 +- .../permission/vo/menu/SysMenuRespVO.java | 2 +- .../vo/menu/SysMenuSimpleRespVO.java | 2 +- .../vo/menu/SysMenuUpdateReqVO.java | 2 +- ...SysPermissionAssignRoleDataScopeReqVO.java | 2 +- .../SysPermissionAssignRoleMenuReqVO.java | 2 +- .../SysPermissionAssignUserRoleReqVO.java | 2 +- .../permission/vo/role/SysRoleBaseVO.java | 2 +- .../vo/role/SysRoleCreateReqVO.java | 2 +- .../permission/vo/role/SysRoleExcelVO.java | 2 +- .../vo/role/SysRoleExportReqVO.java | 2 +- .../permission/vo/role/SysRolePageReqVO.java | 2 +- .../permission/vo/role/SysRoleRespVO.java | 2 +- .../vo/role/SysRoleSimpleRespVO.java | 2 +- .../vo/role/SysRoleUpdateReqVO.java | 2 +- .../vo/role/SysRoleUpdateStatusReqVO.java | 2 +- .../controller/sms/SmsCallbackController.java | 2 +- .../sms/SysSmsChannelController.java | 8 +- .../controller/sms/SysSmsLogController.java | 14 +-- .../sms/SysSmsTemplateController.http | 0 .../sms/SysSmsTemplateController.java | 8 +- .../sms/vo/channel/SysSmsChannelBaseVO.java | 2 +- .../vo/channel/SysSmsChannelCreateReqVO.java | 2 +- .../vo/channel/SysSmsChannelPageReqVO.java | 2 +- .../sms/vo/channel/SysSmsChannelRespVO.java | 2 +- .../vo/channel/SysSmsChannelSimpleRespVO.java | 2 +- .../vo/channel/SysSmsChannelUpdateReqVO.java | 2 +- .../sms/vo/log/SysSmsLogExcelVO.java | 2 +- .../sms/vo/log/SysSmsLogExportReqVO.java | 2 +- .../sms/vo/log/SysSmsLogPageReqVO.java | 2 +- .../sms/vo/log/SysSmsLogRespVO.java | 2 +- .../sms/vo/template/SysSmsTemplateBaseVO.java | 2 +- .../template/SysSmsTemplateCreateReqVO.java | 2 +- .../vo/template/SysSmsTemplateExcelVO.java | 2 +- .../template/SysSmsTemplateExportReqVO.java | 2 +- .../vo/template/SysSmsTemplatePageReqVO.java | 2 +- .../sms/vo/template/SysSmsTemplateRespVO.java | 2 +- .../vo/template/SysSmsTemplateSendReqVO.java | 2 +- .../template/SysSmsTemplateUpdateReqVO.java | 2 +- .../tenant/SysTenantController.java | 8 +- .../controller/tenant/vo/SysTenantBaseVO.java | 3 +- .../tenant/vo/SysTenantCreateReqVO.java | 4 +- .../tenant/vo/SysTenantExcelVO.java | 3 +- .../tenant/vo/SysTenantExportReqVO.java | 2 +- .../tenant/vo/SysTenantPageReqVO.java | 2 +- .../controller/tenant/vo/SysTenantRespVO.java | 2 +- .../tenant/vo/SysTenantUpdateReqVO.java | 3 +- .../controller/user/SysUserController.http | 0 .../controller/user/SysUserController.java | 8 +- .../user/SysUserProfileController.http | 0 .../user/SysUserProfileController.java | 20 ++-- .../user/vo/profile/SysUserProfileRespVO.java | 4 +- .../SysUserProfileUpdatePasswordReqVO.java | 2 +- .../vo/profile/SysUserProfileUpdateReqVO.java | 2 +- .../user/vo/user/SysUserBaseVO.java | 2 +- .../user/vo/user/SysUserCreateReqVO.java | 2 +- .../user/vo/user/SysUserExcelVO.java | 2 +- .../user/vo/user/SysUserExportReqVO.java | 2 +- .../user/vo/user/SysUserImportExcelVO.java | 2 +- .../user/vo/user/SysUserImportRespVO.java | 2 +- .../user/vo/user/SysUserPageItemRespVO.java | 2 +- .../user/vo/user/SysUserPageReqVO.java | 2 +- .../user/vo/user/SysUserRespVO.java | 2 +- .../user/vo/user/SysUserSimpleRespVO.java | 2 +- .../vo/user/SysUserUpdatePasswordReqVO.java | 3 +- .../user/vo/user/SysUserUpdateReqVO.java | 2 +- .../vo/user/SysUserUpdateStatusReqVO.java | 2 +- .../system/convert/auth/SysAuthConvert.java | 10 +- .../convert/auth/SysUserSessionConvert.java | 4 +- .../convert/common/SysCaptchaConvert.java | 5 +- .../system/convert/dept/SysDeptConvert.java | 10 +- .../system/convert/dept/SysPostConvert.java | 4 +- .../convert/dict/SysDictDataConvert.java | 4 +- .../convert/dict/SysDictTypeConvert.java | 6 +- .../errorcode/SysErrorCodeConvert.java | 16 +-- .../convert/logger/SysLoginLogConvert.java | 6 +- .../convert/logger/SysOperateLogConvert.java | 8 +- .../convert/notice/SysNoticeConvert.java | 10 +- .../module}/system/convert/package-info.java | 2 +- .../convert/permission/SysMenuConvert.java | 28 +++++ .../convert/permission/SysRoleConvert.java | 4 +- .../convert/sms/SysSmsChannelConvert.java | 10 +- .../system/convert/sms/SysSmsLogConvert.java | 6 +- .../convert/sms/SysSmsTemplateConvert.java | 10 +- .../convert/tenant/SysTenantConvert.java | 10 +- .../system/convert/user/SysUserConvert.java | 10 +- ...g Boot 对象转换 MapStruct 入门》.md | 0 .../dal/dataobject/dict/SysDictTypeDO.java | 2 +- .../dataobject/errorcode/SysErrorCodeDO.java | 4 +- .../dataobject/logger/SysOperateLogDO.java | 2 +- .../dal/dataobject/notice/SysNoticeDO.java | 4 +- .../dal/dataobject/permission/SysMenuDO.java | 4 +- .../dataobject/permission/SysRoleMenuDO.java | 2 +- .../dal/mysql/auth/SysUserSessionMapper.java | 4 +- .../system/dal/mysql/dept/SysDeptMapper.java | 6 +- .../system/dal/mysql/dept/SysPostMapper.java | 6 +- .../dal/mysql/dict/SysDictDataMapper.java | 8 +- .../dal/mysql/dict/SysDictTypeMapper.java | 8 +- .../mysql/errorcode/SysErrorCodeMapper.java | 8 +- .../dal/mysql/logger/SysLoginLogMapper.java | 8 +- .../dal/mysql/logger/SysOperateLogMapper.java | 8 +- .../dal/mysql/notice/SysNoticeMapper.java | 6 +- .../dal/mysql/permission/SysMenuMapper.java | 8 +- .../dal/mysql/permission/SysRoleMapper.java | 6 +- .../mysql/permission/SysRoleMenuMapper.java | 4 +- .../mysql/permission/SysUserRoleMapper.java | 2 +- .../dal/mysql/sms/SysSmsChannelMapper.java | 4 +- .../system/dal/mysql/sms/SysSmsLogMapper.java | 6 +- .../dal/mysql/sms/SysSmsTemplateMapper.java | 6 +- .../dal/mysql/tenant/SysTenantMapper.java | 6 +- .../system/dal/mysql/user/SysUserMapper.java | 6 +- .../dal/redis/SysRedisKeyConstants.java | 6 +- .../dal/redis/common/SysCaptchaRedisDAO.java | 4 +- .../system/enums/SysErrorCodeConstants.java | 2 +- .../module}/system/enums/dept/DeptIdEnum.java | 2 +- .../enums/errorcode/SysErrorCodeTypeEnum.java | 2 +- .../enums/logger/SysLoginLogTypeEnum.java | 2 +- .../enums/logger/SysLoginResultEnum.java | 2 +- .../enums/notice/SysNoticeTypeEnum.java | 2 +- .../system/enums/permission/MenuIdEnum.java | 2 +- .../system/enums/permission/MenuTypeEnum.java | 2 +- .../system/enums/permission/RoleCodeEnum.java | 2 +- .../enums/permission/SysRoleTypeEnum.java | 2 +- .../captcha/config/CaptchaConfig.java | 2 +- .../captcha/config/CaptchaProperties.java | 2 +- .../framework/captcha/package-info.java | 4 + .../SysDataPermissionConfiguration.java | 2 +- .../datapermission/package-info.java | 4 + .../config/ErrorCodeConfiguration.java | 12 +- .../errorcode/config/ErrorCodeProperties.java | 2 +- .../core/dto/ErrorCodeAutoGenerateReqDTO.java | 2 +- .../errorcode/core/dto/ErrorCodeRespDTO.java | 2 +- .../generator/ErrorCodeAutoGenerator.java | 2 +- .../generator/ErrorCodeAutoGeneratorImpl.java | 6 +- .../core/loader/ErrorCodeLoader.java | 2 +- .../core/loader/ErrorCodeLoaderImpl.java | 6 +- .../service/ErrorCodeFrameworkService.java | 6 +- .../framework/errorcode/package-info.java | 2 +- .../system/framework/package-info.java | 2 +- .../job/auth/SysUserSessionTimeoutJob.java | 4 +- .../yudao/module/system/job/package-info.java | 1 + .../consumer/dept/SysDeptRefreshConsumer.java | 6 +- .../dict/SysDictDataRefreshConsumer.java | 5 +- .../mq/consumer/mail/SysMailSendConsumer.java | 4 +- .../permission/SysMenuRefreshConsumer.java | 6 +- .../SysRoleMenuRefreshConsumer.java | 6 +- .../permission/SysRoleRefreshConsumer.java | 6 +- .../sms/SysSmsChannelRefreshConsumer.java | 6 +- .../mq/consumer/sms/SysSmsSendConsumer.java | 2 +- .../sms/SysSmsTemplateRefreshConsumer.java | 4 +- .../message/dept/SysDeptRefreshMessage.java | 2 +- .../dict/SysDictDataRefreshMessage.java | 2 +- .../mq/message/mail/SysMailSendMessage.java | 2 +- .../permission/SysMenuRefreshMessage.java | 2 +- .../permission/SysRoleMenuRefreshMessage.java | 2 +- .../permission/SysRoleRefreshMessage.java | 2 +- .../sms/SysSmsChannelRefreshMessage.java | 2 +- .../sms/SysSmsTemplateRefreshMessage.java | 2 +- .../mq/producer/dept/SysDeptProducer.java | 4 +- .../mq/producer/dict/SysDictDataProducer.java | 4 +- .../producer/permission/SysMenuProducer.java | 4 +- .../permission/SysPermissionProducer.java | 4 +- .../producer/permission/SysRoleProducer.java | 4 +- .../mq/producer/sms/SysSmsProducer.java | 6 +- .../yudao/module/system/package-info.java | 8 ++ .../system/service/auth/SysAuthService.java | 4 +- .../service/auth}/SysAuthServiceImpl.java | 29 +++-- .../service/auth/SysUserSessionService.java | 4 +- .../auth}/SysUserSessionServiceImpl.java | 14 +-- .../service/common/SysCaptchaService.java | 4 +- .../common}/SysCaptchaServiceImpl.java | 12 +- .../system/service/dept/SysDeptService.java | 13 +-- .../service/dept}/SysDeptServiceImpl.java | 21 ++-- .../system/service/dept/SysPostService.java | 10 +- .../service/dept}/SysPostServiceImpl.java | 18 +-- .../service/dict/SysDictDataService.java | 12 +- .../service/dict}/SysDictDataServiceImpl.java | 27 ++--- .../service/dict/SysDictTypeService.java | 12 +- .../service/dict}/SysDictTypeServiceImpl.java | 20 ++-- .../errorcode/SysErrorCodeService.java | 14 +-- .../errorcode}/SysErrorCodeServiceImpl.java | 26 ++--- .../service/logger/SysLoginLogService.java | 6 +- .../logger}/SysLoginLogServiceImpl.java | 10 +- .../service/logger/SysOperateLogService.java | 8 +- .../logger}/SysOperateLogServiceImpl.java | 20 ++-- .../service/notice/SysNoticeService.java | 10 +- .../service/notice}/SysNoticeServiceImpl.java | 18 +-- .../service/permission/SysMenuService.java | 10 +- .../permission}/SysMenuServiceImpl.java | 26 ++--- .../permission/SysPermissionService.java | 4 +- .../permission}/SysPermissionServiceImpl.java | 17 ++- .../service/permission/SysRoleService.java | 10 +- .../permission}/SysRoleServiceImpl.java | 26 ++--- .../service/sms/SysSmsChannelService.java | 8 +- .../sms}/SysSmsChannelServiceImpl.java | 22 ++-- .../system/service/sms/SysSmsLogService.java | 6 +- .../service/sms}/SysSmsLogServiceImpl.java | 10 +- .../service/sms/SysSmsTemplateService.java | 10 +- .../sms}/SysSmsTemplateServiceImpl.java | 22 ++-- .../service/tenant/SysTenantService.java | 10 +- .../service/tenant}/SysTenantServiceImpl.java | 18 +-- .../system/service/user/SysUserService.java | 10 +- .../service/user}/SysUserServiceImpl.java | 23 ++-- .../service/auth/SysAuthServiceImplTest.java | 26 ++--- .../auth/SysUserSessionServiceImplTest.java | 14 +-- .../service/common/SysCaptchaServiceTest.java | 11 +- .../service/dept/SysDeptServiceTest.java | 19 ++-- .../service/dept/SysPostServiceTest.java | 19 ++-- .../service/dict/SysDictDataServiceTest.java | 21 ++-- .../service/dict/SysDictTypeServiceTest.java | 24 ++-- .../errorcode/SysErrorCodeServiceTest.java | 36 +++--- .../logger/SysLoginLogServiceImplTest.java | 15 ++- .../logger/SysOperateLogServiceImplTest.java | 15 ++- .../notice/SysNoticeServiceImplTest.java | 19 ++-- .../permission/SysMenuServiceTest.java | 31 +++-- .../permission/SysPermissionServiceTest.java | 15 ++- .../permission/SysRoleServiceTest.java | 19 ++-- .../service/sms/SysSmsChannelServiceTest.java | 24 ++-- .../service/sms/SysSmsLogServiceTest.java | 16 +-- .../sms/SysSmsTemplateServiceTest.java | 24 ++-- .../service/tenant/SysTenantServiceTest.java | 17 ++- .../service/user/SysUserServiceImplTest.java | 23 ++-- .../system/test/BaseDbAndRedisUnitTest.java | 47 ++++++++ .../module/system/test/BaseDbUnitTest.java | 39 +++++++ .../module/system/test/BaseRedisUnitTest.java | 31 +++++ .../system/test/RedisTestConfiguration.java | 30 +++++ 340 files changed, 1260 insertions(+), 1049 deletions(-) delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/{system => tool}/framework/codegen/config/CodegenConfiguration.java (76%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/{system => tool}/framework/codegen/config/CodegenProperties.java (89%) create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core}/enums/SqlConstants.java (63%) create mode 100644 yudao-module-system/pom.xml create mode 100644 yudao-module-system/yudao-module-system-api/pom.xml create mode 100644 yudao-module-system/yudao-module-system-impl/pom.xml rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/SysAuthController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/SysAuthController.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/SysUserSessionController.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/auth/SysAuthLoginReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/auth/SysAuthLoginRespVO.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/auth/SysAuthMenuRespVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/auth/vo/session/SysUserSessionPageReqVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/common/SysCaptchaController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/common/SysCaptchaController.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/common/vo/SysCaptchaImageRespVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/SysDeptController.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/SysPostController.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/dept/SysDeptBaseVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/dept/SysDeptCreateReqVO.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/dept/SysDeptListReqVO.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/dept/SysDeptRespVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostBaseVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostCreateReqVO.java (75%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostExcelVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostExportReqVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostListReqVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostPageReqVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostRespVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostSimpleRespVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dept/vo/post/SysPostUpdateReqVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/SysDictDataController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/SysDictDataController.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/SysDictTypeController.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/data/SysDictDataBaseVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/data/SysDictDataCreateReqVO.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/data/SysDictDataExcelVO.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/data/SysDictDataExportReqVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/data/SysDictDataPageReqVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/data/SysDictDataRespVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/type/SysDictTypeBaseVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/type/SysDictTypeExcelVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/type/SysDictTypeExportReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/type/SysDictTypePageReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/type/SysDictTypeRespVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/SysErrorCodeController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/SysErrorCodeController.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/vo/SysErrorCodeBaseVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java (79%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/vo/SysErrorCodeExcelVO.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/vo/SysErrorCodePageReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/vo/SysErrorCodeRespVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/SysLoginLogController.java (77%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/SysOperateLogController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/SysOperateLogController.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java (97%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/notice/SysNoticeController.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/notice/vo/SysNoticeBaseVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/notice/vo/SysNoticeCreateReqVO.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/notice/vo/SysNoticePageReqVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/notice/vo/SysNoticeRespVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/notice/vo/SysNoticeUpdateReqVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/SysMenuController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/SysMenuController.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/SysPermissionController.java (83%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/SysRoleController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/SysRoleController.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/menu/SysMenuBaseVO.java (96%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/menu/SysMenuCreateReqVO.java (70%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/menu/SysMenuListReqVO.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/menu/SysMenuRespVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRoleBaseVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRoleCreateReqVO.java (73%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRoleExcelVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRoleExportReqVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRolePageReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRoleRespVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRoleSimpleRespVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRoleUpdateReqVO.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/SmsCallbackController.java (97%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/SysSmsChannelController.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/SysSmsLogController.java (79%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/SysSmsTemplateController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/SysSmsTemplateController.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/channel/SysSmsChannelRespVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/log/SysSmsLogExcelVO.java (97%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/log/SysSmsLogExportReqVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/log/SysSmsLogPageReqVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/log/SysSmsLogRespVO.java (97%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java (79%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/template/SysSmsTemplateRespVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/tenant/SysTenantController.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/tenant/vo/SysTenantBaseVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/tenant/vo/SysTenantCreateReqVO.java (62%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/tenant/vo/SysTenantExcelVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/tenant/vo/SysTenantExportReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/tenant/vo/SysTenantPageReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/tenant/vo/SysTenantRespVO.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/tenant/vo/SysTenantUpdateReqVO.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/SysUserController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/SysUserController.java (96%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/SysUserProfileController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/SysUserProfileController.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/profile/SysUserProfileRespVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserBaseVO.java (96%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserCreateReqVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserExcelVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserExportReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserImportExcelVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserImportRespVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserPageItemRespVO.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserPageReqVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserRespVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserSimpleRespVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserUpdateReqVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/auth/SysAuthConvert.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/auth/SysUserSessionConvert.java (67%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/common/SysCaptchaConvert.java (68%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/dept/SysDeptConvert.java (55%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/dept/SysPostConvert.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/dict/SysDictDataConvert.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/dict/SysDictTypeConvert.java (74%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/errorcode/SysErrorCodeConvert.java (53%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/logger/SysLoginLogConvert.java (65%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/logger/SysOperateLogConvert.java (79%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/notice/SysNoticeConvert.java (52%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/package-info.java (56%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysMenuConvert.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/permission/SysRoleConvert.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/sms/SysSmsChannelConvert.java (67%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/sms/SysSmsLogConvert.java (73%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/sms/SysSmsTemplateConvert.java (62%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/tenant/SysTenantConvert.java (64%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/user/SysUserConvert.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/dict/SysDictTypeDO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/errorcode/SysErrorCodeDO.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/logger/SysOperateLogDO.java (97%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/notice/SysNoticeDO.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/permission/SysMenuDO.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/permission/SysRoleMenuDO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/auth/SysUserSessionMapper.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/dept/SysDeptMapper.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/dept/SysPostMapper.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/dict/SysDictDataMapper.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/dict/SysDictTypeMapper.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/errorcode/SysErrorCodeMapper.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/logger/SysLoginLogMapper.java (83%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/logger/SysOperateLogMapper.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/notice/SysNoticeMapper.java (70%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/permission/SysMenuMapper.java (79%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/permission/SysRoleMapper.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/permission/SysRoleMenuMapper.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/permission/SysUserRoleMapper.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/sms/SysSmsChannelMapper.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/sms/SysSmsLogMapper.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/sms/SysSmsTemplateMapper.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/tenant/SysTenantMapper.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/user/SysUserMapper.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/redis/SysRedisKeyConstants.java (71%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/redis/common/SysCaptchaRedisDAO.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/SysErrorCodeConstants.java (99%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/dept/DeptIdEnum.java (77%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/errorcode/SysErrorCodeTypeEnum.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/logger/SysLoginLogTypeEnum.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/logger/SysLoginResultEnum.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/notice/SysNoticeTypeEnum.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/permission/MenuIdEnum.java (75%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/permission/MenuTypeEnum.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/permission/RoleCodeEnum.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/permission/SysRoleTypeEnum.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/framework/captcha/config/CaptchaConfig.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/framework/captcha/config/CaptchaProperties.java (92%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/framework/datapermission/config/SysDataPermissionConfiguration.java (89%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/config/ErrorCodeConfiguration.java (69%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/config/ErrorCodeProperties.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/core/dto/ErrorCodeRespDTO.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java (68%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/core/loader/ErrorCodeLoader.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/core/service/ErrorCodeFrameworkService.java (71%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/errorcode/package-info.java (59%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/framework/package-info.java (55%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/job/auth/SysUserSessionTimeoutJob.java (83%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/dept/SysDeptRefreshConsumer.java (72%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/dict/SysDictDataRefreshConsumer.java (75%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/mail/SysMailSendConsumer.java (72%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/permission/SysMenuRefreshConsumer.java (71%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java (72%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/permission/SysRoleRefreshConsumer.java (71%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java (73%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/sms/SysSmsSendConsumer.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/message/dept/SysDeptRefreshMessage.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/message/dict/SysDictDataRefreshMessage.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/message/mail/SysMailSendMessage.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/message/permission/SysMenuRefreshMessage.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/message/permission/SysRoleMenuRefreshMessage.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/message/permission/SysRoleRefreshMessage.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/message/sms/SysSmsChannelRefreshMessage.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/message/sms/SysSmsTemplateRefreshMessage.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/producer/dept/SysDeptProducer.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/producer/dict/SysDictDataProducer.java (77%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/producer/permission/SysMenuProducer.java (75%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/producer/permission/SysPermissionProducer.java (75%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/producer/permission/SysRoleProducer.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/mq/producer/sms/SysSmsProducer.java (77%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/auth/SysAuthService.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth}/SysAuthServiceImpl.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/auth/SysUserSessionService.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth}/SysUserSessionServiceImpl.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/common/SysCaptchaService.java (79%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common}/SysCaptchaServiceImpl.java (70%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/dept/SysDeptService.java (67%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept}/SysDeptServiceImpl.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/dept/SysPostService.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept}/SysPostServiceImpl.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/dict/SysDictDataService.java (73%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict}/SysDictDataServiceImpl.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/dict/SysDictTypeService.java (73%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict}/SysDictTypeServiceImpl.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/errorcode/SysErrorCodeService.java (65%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode}/SysErrorCodeServiceImpl.java (83%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/logger/SysLoginLogService.java (70%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger}/SysLoginLogServiceImpl.java (61%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/logger/SysOperateLogService.java (64%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger}/SysOperateLogServiceImpl.java (75%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/notice/SysNoticeService.java (69%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice}/SysNoticeServiceImpl.java (68%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/permission/SysMenuService.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission}/SysMenuServiceImpl.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/permission/SysPermissionService.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission}/SysPermissionServiceImpl.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/permission/SysRoleService.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission}/SysRoleServiceImpl.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/sms/SysSmsChannelService.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms}/SysSmsChannelServiceImpl.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/sms/SysSmsLogService.java (73%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms}/SysSmsLogServiceImpl.java (65%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/sms/SysSmsTemplateService.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms}/SysSmsTemplateServiceImpl.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/tenant/SysTenantService.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant}/SysTenantServiceImpl.java (73%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/user/SysUserService.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user}/SysUserServiceImpl.java (92%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/auth/SysAuthServiceImplTest.java (92%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/auth/SysUserSessionServiceImplTest.java (88%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/common/SysCaptchaServiceTest.java (77%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/dept/SysDeptServiceTest.java (92%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/dept/SysPostServiceTest.java (90%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/dict/SysDictDataServiceTest.java (91%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/dict/SysDictTypeServiceTest.java (91%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/errorcode/SysErrorCodeServiceTest.java (88%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/logger/SysLoginLogServiceImplTest.java (88%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/logger/SysOperateLogServiceImplTest.java (91%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/notice/SysNoticeServiceImplTest.java (86%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/permission/SysMenuServiceTest.java (91%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/permission/SysPermissionServiceTest.java (93%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/permission/SysRoleServiceTest.java (92%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/sms/SysSmsChannelServiceTest.java (88%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/sms/SysSmsLogServiceTest.java (92%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/sms/SysSmsTemplateServiceTest.java (94%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/tenant/SysTenantServiceTest.java (89%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module}/system/service/user/SysUserServiceImplTest.java (95%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbAndRedisUnitTest.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbUnitTest.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseRedisUnitTest.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/RedisTestConfiguration.java diff --git a/pom.xml b/pom.xml index 5ca94ea062..2512fcdc28 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,8 @@ yudao-core-service yudao-module-member yudao-module-bpm + yudao-module-system + yudao-module-system-api ${artifactId} diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 4cb8d93e23..09a39f280e 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -27,6 +27,11 @@ yudao-module-member-impl ${revision} + + cn.iocoder.boot + yudao-module-system-impl + ${revision} + @@ -50,10 +55,6 @@ cn.iocoder.boot yudao-spring-boot-starter-biz-tenant - - cn.iocoder.boot - yudao-spring-boot-starter-biz-data-permission - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java index 35f6a1d8db..a37d220b4c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java @@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} 和 ${yudao.core-service.base-package} @SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}", "${yudao.core-service.base-package}", - "${yudao.info.member-package}"}) // TODO 芋艿:重构 + "${yudao.info.member-package}", "${yudao.info.system-package}"}) // TODO 芋艿:重构 public class AdminServerApplication { public static void main(String[] args) { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java deleted file mode 100644 index c8ef1496be..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.permission; - -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuSimpleRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysMenuConvert { - - SysMenuConvert INSTANCE = Mappers.getMapper(SysMenuConvert.class); - - List convertList(List list); - - SysMenuDO convert(SysMenuCreateReqVO bean); - - SysMenuDO convert(SysMenuUpdateReqVO bean); - - SysMenuRespVO convert(SysMenuDO bean); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java deleted file mode 100644 index 039431db36..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 基于 Hutool captcha 库,实现验证码功能 - */ -package cn.iocoder.yudao.adminserver.modules.system.framework.captcha; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java deleted file mode 100644 index e700260a86..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 代码生成器 - */ -package cn.iocoder.yudao.adminserver.modules.system.framework.codegen; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/package-info.java deleted file mode 100644 index cdd6173e2f..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * system 模块的数据权限配置 - */ -package cn.iocoder.yudao.adminserver.modules.system.framework.datapermission; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java deleted file mode 100644 index b5c66a51bd..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.system.job; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java deleted file mode 100644 index f043c0f2af..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * system 包下,我们放通用业务,支撑上层的核心业务。 - * 例如说:用户、部门、权限、数据字典等等 - * - * 缩写:sys - */ -package cn.iocoder.yudao.adminserver.modules.system; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java index 7d0d950c03..73f9d5dd20 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; import com.baomidou.mybatisplus.annotation.TableId; @@ -80,7 +79,7 @@ public class ToolCodegenColumnDO extends BaseDO { /** * 字典类型 * - * 关联 {@link SysDictTypeDO#getType()} + * 关联 DictTypeDO 的 type 属性 */ private String dictType; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java index 4ed11b2be7..33546b6637 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -89,7 +88,7 @@ public class ToolCodegenTableDO extends BaseDO { /** * 父菜单编号 * - * 关联 {@link SysMenuDO#getId()} + * 关联 MenuDO 的 id 属性 */ private Long parentMenuId; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenConfiguration.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenConfiguration.java rename to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenConfiguration.java index 9f514eed5a..943638c1ba 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenConfiguration.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.framework.codegen.config; +package cn.iocoder.yudao.adminserver.modules.tool.framework.codegen.config; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenProperties.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenProperties.java rename to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenProperties.java index b0f08460e9..c383fc55d4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenProperties.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenProperties.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.framework.codegen.config; +package cn.iocoder.yudao.adminserver.modules.tool.framework.codegen.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/package-info.java new file mode 100644 index 0000000000..bb13d52514 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/package-info.java @@ -0,0 +1,4 @@ +/** + * 代码生成器 + */ +package cn.iocoder.yudao.adminserver.modules.tool.framework.codegen; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java index f7a1e4c9be..ce8f3ac116 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.framework.codegen.config.CodegenProperties; +import cn.iocoder.yudao.adminserver.modules.tool.framework.codegen.config.CodegenProperties; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java index ff9cdeafaf..f3b69fba25 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.framework.codegen.config.CodegenProperties; +import cn.iocoder.yudao.adminserver.modules.tool.framework.codegen.config.CodegenProperties; import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; import cn.iocoder.yudao.adminserver.modules.tool.convert.codegen.ToolCodegenConvert; diff --git a/yudao-admin-server/src/main/resources/application.yaml b/yudao-admin-server/src/main/resources/application.yaml index 09bbc33ada..15af12d60b 100644 --- a/yudao-admin-server/src/main/resources/application.yaml +++ b/yudao-admin-server/src/main/resources/application.yaml @@ -49,6 +49,7 @@ yudao: version: 1.0.0 base-package: cn.iocoder.yudao.adminserver member-package: cn.iocoder.yudao.module.member + system-package: cn.iocoder.yudao.module.system core-service: base-package: cn.iocoder.yudao.coreservice web: @@ -74,7 +75,7 @@ yudao: error-code: # 错误码相关配置项 constants-class-list: - cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants - - cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants + - cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants - cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants tenant: # 多租户相关配置项 tables: # 配置需要开启多租户的表;如果实体已经继承 TenantBaseDO 类,则无需重复配置 diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java index efa95928b4..72ce3cd771 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.framework.quartz.core; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.job.auth.SysUserSessionTimeoutJob; +import cn.iocoder.yudao.module.system.job.auth.SysUserSessionTimeoutJob; import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; import org.junit.jupiter.api.Test; import org.quartz.SchedulerException; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java index 90e25aeebf..3f1bb7fb90 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.adminserver.framework.redis.core.stream; import cn.hutool.core.thread.ThreadUtil; import cn.iocoder.yudao.adminserver.BaseRedisIntegrationTest; -import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail.SysMailSendConsumer; -import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendConsumer; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage; +import cn.iocoder.yudao.module.system.mq.consumer.mail.SysMailSendConsumer; +import cn.iocoder.yudao.module.system.mq.consumer.sms.SysSmsSendConsumer; +import cn.iocoder.yudao.module.system.mq.message.mail.SysMailSendMessage; import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils; import org.junit.jupiter.api.Disabled; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java index b6bd21477b..372dcacfee 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java @@ -1 +1 @@ -package cn.iocoder.yudao.adminserver.modules.system.service; +package cn.iocoder.yudao.module.system.service; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java index dc4301952e..a6b4c47a28 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.map.MapUtil; import cn.hutool.core.thread.ThreadUtil; import cn.iocoder.yudao.adminserver.BaseDbAndRedisIntegrationTest; -import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendConsumer; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsChannelServiceImpl; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsLogServiceImpl; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsTemplateServiceImpl; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.mq.consumer.sms.SysSmsSendConsumer; +import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.module.system.service.sms.impl.SysSmsChannelServiceImpl; +import cn.iocoder.yudao.module.system.service.sms.impl.SysSmsLogServiceImpl; +import cn.iocoder.yudao.module.system.service.sms.impl.SysSmsTemplateServiceImpl; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsCoreServiceImpl; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.sms.config.YudaoSmsAutoConfiguration; diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java index d589ac7688..9bd5202e48 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java @@ -15,7 +15,8 @@ import org.springframework.context.annotation.Configuration; * @author 芋道源码 */ @Configuration -@MapperScan(value = {"${yudao.info.base-package}", "${yudao.core-service.base-package}", "${yudao.info.member-package}"}, +@MapperScan(value = {"${yudao.info.base-package}", "${yudao.core-service.base-package}", + "${yudao.info.member-package}", "${yudao.info.system-package}"}, annotationClass = Mapper.class, lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 public class YudaoMybatisAutoConfiguration { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/SqlConstants.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/SqlConstants.java similarity index 63% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/SqlConstants.java rename to yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/SqlConstants.java index a33b1b854c..cad1d6c966 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/SqlConstants.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/SqlConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.enums; +package cn.iocoder.yudao.framework.mybatis.core.enums; /** * SQL相关常量类 diff --git a/yudao-module-member/yudao-module-member-impl/pom.xml b/yudao-module-member/yudao-module-member-impl/pom.xml index ce7ff84a0b..37a4e72864 100644 --- a/yudao-module-member/yudao-module-member-impl/pom.xml +++ b/yudao-module-member/yudao-module-member-impl/pom.xml @@ -34,10 +34,7 @@ cn.iocoder.boot yudao-spring-boot-starter-biz-operatelog - - cn.iocoder.boot - yudao-spring-boot-starter-biz-sms - + cn.iocoder.boot yudao-spring-boot-starter-biz-weixin diff --git a/yudao-module-system/pom.xml b/yudao-module-system/pom.xml new file mode 100644 index 0000000000..470f1cc2bc --- /dev/null +++ b/yudao-module-system/pom.xml @@ -0,0 +1,24 @@ + + + + cn.iocoder.boot + yudao + ${revision} + + 4.0.0 + + yudao-module-system-api + yudao-module-system-impl + + yudao-module-system + pom + + ${artifactId} + + system 模块下,我们放通用业务,支撑上层的核心业务。 + 例如说:用户、部门、权限、数据字典等等 + + + diff --git a/yudao-module-system/yudao-module-system-api/pom.xml b/yudao-module-system/yudao-module-system-api/pom.xml new file mode 100644 index 0000000000..39a402efc6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/pom.xml @@ -0,0 +1,26 @@ + + + + cn.iocoder.boot + yudao-module-system + ${revision} + + 4.0.0 + yudao-module-system-api + jar + + ${artifactId} + + system 模块 API,暴露给其它模块调用 + + + + + cn.iocoder.boot + yudao-common + + + + diff --git a/yudao-module-system/yudao-module-system-impl/pom.xml b/yudao-module-system/yudao-module-system-impl/pom.xml new file mode 100644 index 0000000000..6fc4fcf96b --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/pom.xml @@ -0,0 +1,106 @@ + + + + cn.iocoder.boot + yudao-module-system + ${revision} + + 4.0.0 + yudao-module-system-impl + jar + + ${artifactId} + + system 模块下,我们放通用业务,支撑上层的核心业务。 + 例如说:用户、部门、权限、数据字典等等 + + + + + cn.iocoder.boot + yudao-module-system-api + ${revision} + + + + + cn.iocoder.boot + yudao-core-service + + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-operatelog + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-sms + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-data-permission + + + + + cn.iocoder.boot + yudao-spring-boot-starter-security + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mybatis + + + + cn.iocoder.boot + yudao-spring-boot-starter-redis + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mq + + + + + cn.iocoder.boot + yudao-spring-boot-starter-test + test + + + + + cn.iocoder.boot + yudao-spring-boot-starter-excel + + + + + + + ${artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + repackage + + + + + + + + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.java index fc104fdbc0..52ca73cf70 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth; +package cn.iocoder.yudao.module.system.controller.auth; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.*; +import cn.iocoder.yudao.module.system.convert.auth.SysAuthConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; +import cn.iocoder.yudao.module.system.service.auth.SysAuthService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.service.permission.SysRoleService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysUserSessionController.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysUserSessionController.java index 116d38531c..f5a68686c6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysUserSessionController.java @@ -1,12 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth; +package cn.iocoder.yudao.module.system.controller.auth; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysUserSessionConvert; +import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; +import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.convert.auth.SysUserSessionConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.service.auth.SysUserSessionService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginReqVO.java index 366144ea24..2eac3fb4a8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginRespVO.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginRespVO.java index 381c3223e3..7e1bea57ea 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthMenuRespVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthMenuRespVO.java index c39354b109..762644e20b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthMenuRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java index c3bd0923b4..e50bb84ccc 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java index e92d3fc504..d1a48ee779 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.auth.vo.auth; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java index 13aaa71cc7..25e0d65514 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.auth.vo.auth; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java index 71d19685d0..930fea227c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.auth.vo.auth; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java index 096164ed70..7bf6c8ef91 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.auth.vo.auth; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java index c67fa99aeb..debdf59989 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session; +package cn.iocoder.yudao.module.system.controller.auth.vo.session; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageReqVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageReqVO.java index fb8f4f2b6d..c834f5d8c8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session; +package cn.iocoder.yudao.module.system.controller.auth.vo.session; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.java index 94e3c9d0da..317895005a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.common; +package cn.iocoder.yudao.module.system.controller.common; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; +import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.module.system.service.common.SysCaptchaService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/vo/SysCaptchaImageRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/vo/SysCaptchaImageRespVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/vo/SysCaptchaImageRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/vo/SysCaptchaImageRespVO.java index b3e9f2c247..5c55b16ffd 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/vo/SysCaptchaImageRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/vo/SysCaptchaImageRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.common.vo; +package cn.iocoder.yudao.module.system.controller.common.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysDeptController.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysDeptController.java index 2c384623ec..70c365560c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysDeptController.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept; +package cn.iocoder.yudao.module.system.controller.dept; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysDeptConvert; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.*; +import cn.iocoder.yudao.module.system.convert.dept.SysDeptConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.service.dept.SysDeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysPostController.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysPostController.java index fec11cb018..762044dadc 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysPostController.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept; +package cn.iocoder.yudao.module.system.controller.dept; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysPostConvert; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.*; +import cn.iocoder.yudao.module.system.convert.dept.SysPostConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; +import cn.iocoder.yudao.module.system.service.dept.SysPostService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptBaseVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptBaseVO.java index 8296a89bed..5e0bc14779 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptBaseVO.java @@ -1,7 +1,5 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.dept.vo.dept; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.validation.InEnum; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptCreateReqVO.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptCreateReqVO.java index c5c5aac56d..4909ef8bcb 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.dept.vo.dept; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptListReqVO.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptListReqVO.java index b47bc53be4..840fb0480b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptListReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.dept.vo.dept; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptRespVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptRespVO.java index 325cce6b1e..edcc455aa0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.dept.vo.dept; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java index bf9c8bdc5c..b9500ea81c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.dept.vo.dept; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java index 5838d1dd1a..c4cd016e37 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.dept.vo.dept; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostBaseVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostBaseVO.java index c6ed5c82a1..e30eedeacd 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostCreateReqVO.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostCreateReqVO.java index 72be88dd55..9570ad07a3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExcelVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExcelVO.java index 3286bd63a0..32042a41fc 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExportReqVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExportReqVO.java index 465639236a..9b8cd5e89b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostListReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostListReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostListReqVO.java index 0e700a9c56..a05bed03f5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostListReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostPageReqVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostPageReqVO.java index 432e16039b..49b05c2a9e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostRespVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostRespVO.java index cfd42a204d..fd95be4616 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostSimpleRespVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostSimpleRespVO.java index 244667f068..fdc6636d40 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostUpdateReqVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostUpdateReqVO.java index cc95c9cd31..0868c6a455 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.java index 5db6ccf6dc..d82f5cfec7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict; +package cn.iocoder.yudao.module.system.controller.dict; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.*; +import cn.iocoder.yudao.module.system.convert.dict.SysDictDataConvert; +import cn.iocoder.yudao.module.system.service.dict.SysDictDataService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictTypeController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictTypeController.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictTypeController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictTypeController.java index 4057f8a3f7..63a4b08987 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictTypeController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictTypeController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict; +package cn.iocoder.yudao.module.system.controller.dict; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictTypeConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.*; +import cn.iocoder.yudao.module.system.convert.dict.SysDictTypeConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.service.dict.SysDictTypeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataBaseVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataBaseVO.java index adb4bb2f18..c67ceb0d20 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.dict.vo.data; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataCreateReqVO.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataCreateReqVO.java index 5c964991ca..c2688b3e30 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.dict.vo.data; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExcelVO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExcelVO.java index 589735a24c..19cd76b785 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.dict.vo.data; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExportReqVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExportReqVO.java index 43e8884f26..074e02c804 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.dict.vo.data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataPageReqVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataPageReqVO.java index 0cd2a488de..97d6d8f260 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.dict.vo.data; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataRespVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataRespVO.java index fa6f77fcad..e4281ca150 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.dict.vo.data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java index e4a09e6954..2da4779bac 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.dict.vo.data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java index ccbd455840..428aa654aa 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.dict.vo.data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeBaseVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeBaseVO.java index c4458cd26b..d9e2dfe478 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.dict.vo.type; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java index 6f84ecfd70..ea5b0465ab 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExcelVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExcelVO.java index 1fac9c0617..25c07e6ab7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.dict.vo.type; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExportReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExportReqVO.java index cfe54e563d..440cef8bcf 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypePageReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypePageReqVO.java index 434ca272d0..8cd2c9b824 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.dict.vo.type; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeRespVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeRespVO.java index fd216bc8fe..b82e16e16d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java index 7d0ef04dce..c53154f8c8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java index 9b887bd5d7..ed812dadc2 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.java index f7dd4a4111..220789d565 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode; +package cn.iocoder.yudao.module.system.controller.errorcode; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.system.convert.errorcode.SysErrorCodeConvert; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.*; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; -import cn.iocoder.yudao.adminserver.modules.system.service.errorcode.SysErrorCodeService; +import cn.iocoder.yudao.module.system.convert.errorcode.SysErrorCodeConvert; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.service.errorcode.SysErrorCodeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeBaseVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeBaseVO.java index 118c38b251..f5d1e8d7aa 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.errorcode.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java index 15190abfe1..3eb9b14a45 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.errorcode.vo; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExcelVO.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExcelVO.java index 8e20b6e4aa..5efbf36dc8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExcelVO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.errorcode.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +//import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -20,7 +20,7 @@ public class SysErrorCodeExcelVO { private Long id; @ExcelProperty(value = "错误码类型", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.ERROR_CODE_TYPE) + @DictFormat("inf_error_code_type") // TODO 芋艿:得思考下杂解决枚举值 private Integer type; @ExcelProperty("应用名") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java index 6047679942..8a46b99dc0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.errorcode.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodePageReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodePageReqVO.java index baf781a595..6273ea192d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.errorcode.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeRespVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeRespVO.java index 69798f3f4b..35e4f93d64 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.errorcode.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java index 11f124a9b1..0d6b9508e1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.errorcode.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysLoginLogController.java similarity index 77% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysLoginLogController.java index 24260c4a2f..29addebc6d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysLoginLogController.java @@ -1,16 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger; +package cn.iocoder.yudao.module.system.controller.logger; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysLoginLogConvert; -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogRespVO; +import cn.iocoder.yudao.module.system.convert.logger.SysLoginLogConvert; +import cn.iocoder.yudao.module.system.service.logger.SysLoginLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.java index 968ab49542..f572ed5c29 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.java @@ -1,13 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger; +package cn.iocoder.yudao.module.system.controller.logger; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysOperateLogConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogRespVO; +import cn.iocoder.yudao.module.system.convert.logger.SysOperateLogConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.service.logger.SysOperateLogService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java index a346d946f9..6b26057962 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java index 8c2693beb1..bda160a3fa 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java index a85f926857..8f936268bc 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java index 52079094c2..7c71730c90 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java index 65aa6494d8..3f588304b9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java similarity index 97% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java index d29a96ce39..735e0b198e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java index 5233ef90c9..e5fc3e9410 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java index 2c500e12b1..1c501acd6e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java index 2a0378a59e..92efe97388 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java index 1ac82a91ef..fc825d62a5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/SysNoticeController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/SysNoticeController.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/SysNoticeController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/SysNoticeController.java index 5ab1944ab5..7cb255ee5b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/SysNoticeController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/SysNoticeController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.notice; +package cn.iocoder.yudao.module.system.controller.notice; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.notice.SysNoticeConvert; -import cn.iocoder.yudao.adminserver.modules.system.service.notice.SysNoticeService; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeRespVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.notice.SysNoticeConvert; +import cn.iocoder.yudao.module.system.service.notice.SysNoticeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeBaseVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeBaseVO.java index 9bd228ed58..ddbb141cce 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.notice.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeCreateReqVO.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeCreateReqVO.java index cf86f2164a..1669618ab8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.notice.vo; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticePageReqVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticePageReqVO.java index b347ab9362..6e1932a155 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.notice.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeRespVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeRespVO.java index 8145e85b26..0cfb78bbb0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.notice.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeUpdateReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeUpdateReqVO.java index 2c02d5aaef..3d6fdd586b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.notice.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.java index ddf388dd4b..340b3bff78 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission; +package cn.iocoder.yudao.module.system.controller.permission; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysMenuConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.*; +import cn.iocoder.yudao.module.system.convert.permission.SysMenuConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.service.permission.SysMenuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysPermissionController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysPermissionController.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysPermissionController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysPermissionController.java index cbd1197aeb..500f4ac4b5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysPermissionController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysPermissionController.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission; +package cn.iocoder.yudao.module.system.controller.permission; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleDataScopeReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleMenuReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission.SysPermissionAssignUserRoleReqVO; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.controller.permission.vo.permission.SysPermissionAssignRoleDataScopeReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.permission.SysPermissionAssignRoleMenuReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.permission.SysPermissionAssignUserRoleReqVO; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.java index 2dc6f347b3..7ec11bd563 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission; +package cn.iocoder.yudao.module.system.controller.permission; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysRoleConvert; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.*; +import cn.iocoder.yudao.module.system.convert.permission.SysRoleConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.service.permission.SysRoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuBaseVO.java similarity index 96% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuBaseVO.java index 66b62d03b9..87f2eb7fe5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.permission.vo.menu; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuCreateReqVO.java similarity index 70% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuCreateReqVO.java index e50c73f2f4..2c0357f864 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.permission.vo.menu; import io.swagger.annotations.ApiModel; import lombok.*; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuListReqVO.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuListReqVO.java index 5600a132c8..e0b8a2d026 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuListReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.permission.vo.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuRespVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuRespVO.java index 6175a8ca3a..ed8512ae58 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.permission.vo.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java index 689d705d49..dc160cb966 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.permission.vo.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java index 736d580733..bf44bf94a8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.permission.vo.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java index 8050e81436..08feaae0d5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission; +package cn.iocoder.yudao.module.system.controller.permission.vo.permission; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java index 47ffae9288..664d6d8e80 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission; +package cn.iocoder.yudao.module.system.controller.permission.vo.permission; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java index 1a3e034154..fdbbedcbd7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission; +package cn.iocoder.yudao.module.system.controller.permission.vo.permission; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleBaseVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleBaseVO.java index a07e20c4a6..a2553fc238 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleCreateReqVO.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleCreateReqVO.java index f16c3adf97..a182b26c9c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExcelVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExcelVO.java index 01b758347b..08a37816f3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExportReqVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExportReqVO.java index 656f136d04..bc0970878a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRolePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRolePageReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRolePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRolePageReqVO.java index 6983176fad..c6e7665e43 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRolePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRolePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleRespVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleRespVO.java index f3a565d716..ef11d82a30 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleSimpleRespVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleSimpleRespVO.java index c1b973ff79..a2706f4f4a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateReqVO.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateReqVO.java index dcf994f8d2..c6f56f63a3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java index 1741881dd1..ba861539de 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SmsCallbackController.java similarity index 97% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SmsCallbackController.java index 322b99d00f..0968a1d2fa 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SmsCallbackController.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms; +package cn.iocoder.yudao.module.system.controller.sms; import cn.hutool.core.util.URLUtil; import cn.hutool.extra.servlet.ServletUtil; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsChannelController.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsChannelController.java index 3fbb47e6ec..70c7d7059b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsChannelController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms; +package cn.iocoder.yudao.module.system.controller.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsChannelConvert; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.*; +import cn.iocoder.yudao.module.system.convert.sms.SysSmsChannelConvert; +import cn.iocoder.yudao.module.system.service.sms.SysSmsChannelService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsLogController.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsLogController.java index aa1eec9b2a..ee69dee3d1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsLogController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms; +package cn.iocoder.yudao.module.system.controller.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogRespVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsLogConvert; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExcelVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogRespVO; +import cn.iocoder.yudao.module.system.convert.sms.SysSmsLogConvert; +import cn.iocoder.yudao.module.system.service.sms.SysSmsLogService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.java index 5b9d8bc6e1..9328680e30 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms; +package cn.iocoder.yudao.module.system.controller.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.*; +import cn.iocoder.yudao.module.system.convert.sms.SysSmsTemplateConvert; +import cn.iocoder.yudao.module.system.service.sms.SysSmsTemplateService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java index fd475bdcf9..04b1f6926a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.sms.vo.channel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java index e9466a7b6b..fdf3e98743 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.sms.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java index e30bc3d48a..d7d90ec79c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.sms.vo.channel; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelRespVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelRespVO.java index 8e7d111a3d..02654a0170 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.sms.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java index 451a943eba..1cf341f986 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.sms.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java index 816e5c2197..72ffb28a26 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.sms.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExcelVO.java similarity index 97% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExcelVO.java index 69cb3963f0..1bdc830477 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; +package cn.iocoder.yudao.module.system.controller.sms.vo.log; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExportReqVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExportReqVO.java index 94be2d84e9..3cfd6ca644 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; +package cn.iocoder.yudao.module.system.controller.sms.vo.log; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogPageReqVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogPageReqVO.java index 1ea8a1fa75..94bcc9a705 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; +package cn.iocoder.yudao.module.system.controller.sms.vo.log; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogRespVO.java similarity index 97% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogRespVO.java index 10ff01a3d5..f2a07a0ad7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; +package cn.iocoder.yudao.module.system.controller.sms.vo.log; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java index cc587872e4..622316cdc8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.sms.vo.template; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java index 6d5931565e..f0481861a9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.sms.vo.template; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java index d227caba3b..d3151e621a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.sms.vo.template; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java index 66efb4df65..930fff5580 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.sms.vo.template; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java index fc8bd80b13..e0d711ad23 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.sms.vo.template; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateRespVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateRespVO.java index c26d3804d8..24fae0ca1f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.sms.vo.template; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java index 34a773e036..0b420c1230 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.sms.vo.template; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java index 223aa0caed..c12a826cc6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.sms.vo.template; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/SysTenantController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/SysTenantController.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/SysTenantController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/SysTenantController.java index 54db21e9b3..c4a8ca1400 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/SysTenantController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/SysTenantController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.tenant; +package cn.iocoder.yudao.module.system.controller.tenant; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.tenant.SysTenantConvert; -import cn.iocoder.yudao.adminserver.modules.system.service.tenant.SysTenantService; +import cn.iocoder.yudao.module.system.controller.tenant.vo.*; +import cn.iocoder.yudao.module.system.convert.tenant.SysTenantConvert; +import cn.iocoder.yudao.module.system.service.tenant.SysTenantService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantBaseVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantBaseVO.java index 12511123fd..593b9aca48 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantBaseVO.java @@ -1,7 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.tenant.vo; import lombok.*; -import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantCreateReqVO.java similarity index 62% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantCreateReqVO.java index 4b90bc5c35..4d41fdfe0d 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantCreateReqVO.java @@ -1,9 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.tenant.vo; import lombok.*; -import java.util.*; import io.swagger.annotations.*; -import javax.validation.constraints.*; @ApiModel("租户创建 Request VO") @Data diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExcelVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExcelVO.java index e98c8e66e2..8244486279 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExcelVO.java @@ -1,8 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.tenant.vo; import lombok.*; import java.util.*; -import io.swagger.annotations.*; import com.alibaba.excel.annotation.ExcelProperty; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExportReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExportReqVO.java index e71e21db41..e70de00131 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.tenant.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantPageReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantPageReqVO.java index b2f5227a61..b665ea3f65 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.tenant.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantRespVO.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantRespVO.java index ab12ae53ce..563b5095c4 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.tenant.vo; import lombok.*; import java.util.*; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantUpdateReqVO.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantUpdateReqVO.java index 0ae05af383..c24edc5ea7 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/tenant/vo/SysTenantUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantUpdateReqVO.java @@ -1,7 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.tenant.vo; import lombok.*; -import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.java similarity index 96% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.java index ad0f328976..9e03727d46 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user; +package cn.iocoder.yudao.module.system.controller.user; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; +import cn.iocoder.yudao.module.system.controller.user.vo.user.*; +import cn.iocoder.yudao.module.system.convert.user.SysUserConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.java index 2dea78cd8a..8a38f8724c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user; +package cn.iocoder.yudao.module.system.controller.user; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileRespVO; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.user.SysUserConvert; +import cn.iocoder.yudao.module.system.service.dept.SysPostService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; @@ -32,7 +32,7 @@ import javax.validation.Valid; import java.io.IOException; import java.util.List; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileRespVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileRespVO.java index 4269aaec08..0abd7037a3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileRespVO.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile; +package cn.iocoder.yudao.module.system.controller.user.vo.profile; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserBaseVO; +import cn.iocoder.yudao.module.system.controller.user.vo.user.SysUserBaseVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java index 340d2e4078..0578f3ceda 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile; +package cn.iocoder.yudao.module.system.controller.user.vo.profile; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java index e77bcd7f64..bcc7a20489 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile; +package cn.iocoder.yudao.module.system.controller.user.vo.profile; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserBaseVO.java similarity index 96% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserBaseVO.java index 1f41be3dba..5fc0b42b92 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserCreateReqVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserCreateReqVO.java index 89f2e17987..9b6676c97a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExcelVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExcelVO.java index a4c978c025..04c818ee51 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExportReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExportReqVO.java index 24d8d00c34..e5f33deb3b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportExcelVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportExcelVO.java index f33acdd2f3..43e6c9d26e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportRespVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportRespVO.java index bb4359eed6..533ec2af8d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageItemRespVO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageItemRespVO.java index 58959a5331..6178d6b809 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageReqVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageReqVO.java index ca1e597f95..a677d208c2 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserRespVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserRespVO.java index 79abf64e59..66d8f6981b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserSimpleRespVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserSimpleRespVO.java index cd2b65c88d..d9ba0eb055 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java index 9364c57aa7..71e458654d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java @@ -1,9 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateReqVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateReqVO.java index 7fc8ffbb92..6513490d1f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java index dd1baa4fa7..ac20eb7454 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysAuthConvert.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysAuthConvert.java index cb92db12c9..c1f6f265db 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysAuthConvert.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.auth; +package cn.iocoder.yudao.module.system.convert.auth; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthMenuRespVO; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum; +import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysUserSessionConvert.java similarity index 67% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysUserSessionConvert.java index 0defeed97a..629f030074 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysUserSessionConvert.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.auth; +package cn.iocoder.yudao.module.system.convert.auth; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; +import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/common/SysCaptchaConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/SysCaptchaConvert.java similarity index 68% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/common/SysCaptchaConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/SysCaptchaConvert.java index 0931a54dee..8e5fc34a6b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/common/SysCaptchaConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/SysCaptchaConvert.java @@ -1,8 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.common; +package cn.iocoder.yudao.module.system.convert.common; import cn.hutool.captcha.AbstractCaptcha; -import cn.hutool.captcha.ICaptcha; -import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysDeptConvert.java similarity index 55% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysDeptConvert.java index 693baffe6d..40d667641d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysDeptConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.dept; +package cn.iocoder.yudao.module.system.convert.dept; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptSimpleRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptRespVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptSimpleRespVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysPostConvert.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysPostConvert.java index d466a0af97..023bcfae13 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysPostConvert.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.dept; +package cn.iocoder.yudao.module.system.convert.dept; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.*; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.*; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataConvert.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataConvert.java index e916def4f3..fc38f41626 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataConvert.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.dict; +package cn.iocoder.yudao.module.system.convert.dict; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.*; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictTypeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictTypeConvert.java similarity index 74% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictTypeConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictTypeConvert.java index e20451c25b..ce4bae4066 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictTypeConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictTypeConvert.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.dict; +package cn.iocoder.yudao.module.system.convert.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.*; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.*; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/errorcode/SysErrorCodeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/SysErrorCodeConvert.java similarity index 53% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/errorcode/SysErrorCodeConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/SysErrorCodeConvert.java index a7b8eade2b..7a571dc45e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/errorcode/SysErrorCodeConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/SysErrorCodeConvert.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.errorcode; +package cn.iocoder.yudao.module.system.convert.errorcode; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeRespDTO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExcelVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeRespVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogConvert.java similarity index 65% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogConvert.java index d6226491c9..01b9adabba 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogConvert.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.logger; +package cn.iocoder.yudao.module.system.convert.logger; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogRespVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysOperateLogConvert.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysOperateLogConvert.java index 51e08f1dc5..901e321a0a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysOperateLogConvert.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.logger; +package cn.iocoder.yudao.module.system.convert.logger; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/notice/SysNoticeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/SysNoticeConvert.java similarity index 52% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/notice/SysNoticeConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/SysNoticeConvert.java index ccba20e77c..bf46d698b0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/notice/SysNoticeConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/SysNoticeConvert.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.notice; +package cn.iocoder.yudao.module.system.convert.notice; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeRespVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/package-info.java similarity index 56% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/package-info.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/package-info.java index d4052eb095..b1ce8e379d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/package-info.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/package-info.java @@ -3,4 +3,4 @@ * * 目前使用 MapStruct 框架 */ -package cn.iocoder.yudao.adminserver.modules.system.convert; +package cn.iocoder.yudao.module.system.convert; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysMenuConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysMenuConvert.java new file mode 100644 index 0000000000..109a53f568 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysMenuConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.convert.permission; + +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuCreateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuRespVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuSimpleRespVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysMenuConvert { + + SysMenuConvert INSTANCE = Mappers.getMapper(SysMenuConvert.class); + + List convertList(List list); + + SysMenuDO convert(SysMenuCreateReqVO bean); + + SysMenuDO convert(SysMenuUpdateReqVO bean); + + SysMenuRespVO convert(SysMenuDO bean); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysRoleConvert.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysRoleConvert.java index b1cd0dc007..bc048a774b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysRoleConvert.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.permission; +package cn.iocoder.yudao.module.system.convert.permission; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.*; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.*; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsChannelConvert.java similarity index 67% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsChannelConvert.java index cc3b27b640..af0652eea1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsChannelConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.sms; +package cn.iocoder.yudao.module.system.convert.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelSimpleRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelRespVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelSimpleRespVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsLogConvert.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsLogConvert.java index afcd9443d6..d91f7b3269 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsLogConvert.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.sms; +package cn.iocoder.yudao.module.system.convert.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogRespVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExcelVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogRespVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsTemplateConvert.java similarity index 62% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsTemplateConvert.java index 4d1e0dc40d..b3a423e32f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsTemplateConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.sms; +package cn.iocoder.yudao.module.system.convert.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExcelVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateRespVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/tenant/SysTenantConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/SysTenantConvert.java similarity index 64% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/tenant/SysTenantConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/SysTenantConvert.java index 3df63f30b5..6d9d1f77b4 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/tenant/SysTenantConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/SysTenantConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.tenant; +package cn.iocoder.yudao.module.system.convert.tenant; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantExcelVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantCreateReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExcelVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantRespVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/SysUserConvert.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/SysUserConvert.java index ff2938d36b..b1436155b9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/SysUserConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.convert.user; +package cn.iocoder.yudao.module.system.convert.user; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileRespVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileRespVO; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.user.*; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictTypeDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictTypeDO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictTypeDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictTypeDO.java index 548ee6fe9a..de7a67b859 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictTypeDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictTypeDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict; +package cn.iocoder.yudao.module.system.dal.dataobject.dict; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/SysErrorCodeDO.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/SysErrorCodeDO.java index d2fdb182e7..b8cae75dfe 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/SysErrorCodeDO.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode; +package cn.iocoder.yudao.module.system.dal.dataobject.errorcode; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.system.enums.errorcode.SysErrorCodeTypeEnum; +import cn.iocoder.yudao.module.system.enums.errorcode.SysErrorCodeTypeEnum; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysOperateLogDO.java similarity index 97% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysOperateLogDO.java index 417c6f45fa..ca9483e02d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysOperateLogDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger; +package cn.iocoder.yudao.module.system.dal.dataobject.logger; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/SysNoticeDO.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/SysNoticeDO.java index c61398fe63..571b011575 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/SysNoticeDO.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice; +package cn.iocoder.yudao.module.system.dal.dataobject.notice; -import cn.iocoder.yudao.adminserver.modules.system.enums.notice.SysNoticeTypeEnum; +import cn.iocoder.yudao.module.system.enums.notice.SysNoticeTypeEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysMenuDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysMenuDO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysMenuDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysMenuDO.java index 043f2e93db..39c0b82ba5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysMenuDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysMenuDO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission; +package cn.iocoder.yudao.module.system.dal.dataobject.permission; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; +import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleMenuDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleMenuDO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleMenuDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleMenuDO.java index 5cb6c1a170..bfe0c3f868 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleMenuDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleMenuDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission; +package cn.iocoder.yudao.module.system.dal.dataobject.permission; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java index f5ae670b06..34e3ffc387 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth; +package cn.iocoder.yudao.module.system.dal.mysql.auth; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java index be3bedeafb..995ee1e5cf 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept; +package cn.iocoder.yudao.module.system.dal.mysql.dept; -import cn.iocoder.yudao.adminserver.modules.tool.enums.SqlConstants; +import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptListReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java index 85d9915b23..bf154992a1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept; +package cn.iocoder.yudao.module.system.dal.mysql.dept; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java index 5cf5a732fb..9fc681a024 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict; +package cn.iocoder.yudao.module.system.dal.mysql.dict; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.enums.SqlConstants; +import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictTypeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictTypeMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java index 90b125690f..ae213915f4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictTypeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict; +package cn.iocoder.yudao.module.system.dal.mysql.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java index 7760f80586..b7cac6ca95 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.errorcode; +package cn.iocoder.yudao.module.system.dal.mysql.errorcode; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExportReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogMapper.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogMapper.java index eea1812e83..b211210890 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogMapper.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger; +package cn.iocoder.yudao.module.system.dal.mysql.logger; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysOperateLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysOperateLogMapper.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysOperateLogMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysOperateLogMapper.java index c588867cd0..14d866a0b3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysOperateLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysOperateLogMapper.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger; +package cn.iocoder.yudao.module.system.dal.mysql.logger; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/notice/SysNoticeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java similarity index 70% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/notice/SysNoticeMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java index 52a484a1e3..74aee3f5d3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/notice/SysNoticeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.notice; +package cn.iocoder.yudao.module.system.dal.mysql.notice; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; import org.apache.ibatis.annotations.Mapper; @Mapper diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysMenuMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysMenuMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java index ea55e2165d..605937fa46 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysMenuMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; +package cn.iocoder.yudao.module.system.dal.mysql.permission; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.yudao.adminserver.modules.tool.enums.SqlConstants; +import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuListReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java index 670d5047c5..16641f8c38 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; +package cn.iocoder.yudao.module.system.dal.mysql.permission; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleExportReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRolePageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMenuMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMenuMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java index 698ca73194..ac806927d2 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMenuMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; +package cn.iocoder.yudao.module.system.dal.mysql.permission; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleMenuDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java index 4704bb5710..71b25f2d17 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; +package cn.iocoder.yudao.module.system.dal.mysql.permission; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java index bd69d4f736..5f6b0bb3e9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms; +package cn.iocoder.yudao.module.system.dal.mysql.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java index 0269e75e6f..e0a1039aa6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms; +package cn.iocoder.yudao.module.system.dal.mysql.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java index 60d99a0a3f..f1deda053b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms; +package cn.iocoder.yudao.module.system.dal.mysql.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/tenant/SysTenantMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/tenant/SysTenantMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java index 999d5c59b5..dc7d27d21a 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/tenant/SysTenantMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.tenant; +package cn.iocoder.yudao.module.system.dal.mysql.tenant; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantPageReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java index 8739301afe..f954cd3cf6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user; +package cn.iocoder.yudao.module.system.dal.mysql.user; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.user.SysUserExportReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.user.SysUserPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java similarity index 71% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java index e9d3373b25..33fa08e7e4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java @@ -1,10 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.redis; +package cn.iocoder.yudao.module.system.dal.redis; import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import me.zhyd.oauth.model.AuthUser; - -import java.time.Duration; import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/common/SysCaptchaRedisDAO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/SysCaptchaRedisDAO.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/common/SysCaptchaRedisDAO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/SysCaptchaRedisDAO.java index 701501c908..9a26095616 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/common/SysCaptchaRedisDAO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/SysCaptchaRedisDAO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.dal.redis.common; +package cn.iocoder.yudao.module.system.dal.redis.common; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Repository; @@ -6,7 +6,7 @@ import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.time.Duration; -import static cn.iocoder.yudao.adminserver.modules.system.dal.redis.SysRedisKeyConstants.CAPTCHA_CODE; +import static cn.iocoder.yudao.module.system.dal.redis.SysRedisKeyConstants.CAPTCHA_CODE; /** * 验证码的 Redis DAO diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java similarity index 99% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java index 867f8e3594..566f835d58 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums; +package cn.iocoder.yudao.module.system.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/dept/DeptIdEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/dept/DeptIdEnum.java similarity index 77% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/dept/DeptIdEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/dept/DeptIdEnum.java index d228a9bbd5..2a7effec27 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/dept/DeptIdEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/dept/DeptIdEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.dept; +package cn.iocoder.yudao.module.system.enums.dept; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/SysErrorCodeTypeEnum.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/SysErrorCodeTypeEnum.java index 8c0b4c7e02..beb2e2b3ef 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/SysErrorCodeTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.errorcode; +package cn.iocoder.yudao.module.system.enums.errorcode; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import lombok.AllArgsConstructor; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java index 40f18e8674..ff29ab558f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.logger; +package cn.iocoder.yudao.module.system.enums.logger; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java index 218b2d97f6..f1c8356ff4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.logger; +package cn.iocoder.yudao.module.system.enums.logger; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/notice/SysNoticeTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/SysNoticeTypeEnum.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/notice/SysNoticeTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/SysNoticeTypeEnum.java index 0c8bff35a9..c543f1cb5d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/notice/SysNoticeTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/SysNoticeTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.notice; +package cn.iocoder.yudao.module.system.enums.notice; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuIdEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/MenuIdEnum.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuIdEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/MenuIdEnum.java index a82ab25139..fc2b72ac42 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuIdEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/MenuIdEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.permission; +package cn.iocoder.yudao.module.system.enums.permission; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/MenuTypeEnum.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/MenuTypeEnum.java index 213f7992fd..575a33c447 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/MenuTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.permission; +package cn.iocoder.yudao.module.system.enums.permission; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/RoleCodeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/RoleCodeEnum.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/RoleCodeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/RoleCodeEnum.java index ddfdd05340..44487a4d63 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/RoleCodeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/RoleCodeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.permission; +package cn.iocoder.yudao.module.system.enums.permission; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/SysRoleTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/SysRoleTypeEnum.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/SysRoleTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/SysRoleTypeEnum.java index 61b15b0be2..426c5cdb5f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/SysRoleTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/SysRoleTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.enums.permission; +package cn.iocoder.yudao.module.system.enums.permission; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaConfig.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/config/CaptchaConfig.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaConfig.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/config/CaptchaConfig.java index 174efe4acb..4028f6cefb 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaConfig.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/config/CaptchaConfig.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.framework.captcha.config; +package cn.iocoder.yudao.module.system.framework.captcha.config; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaProperties.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/config/CaptchaProperties.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaProperties.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/config/CaptchaProperties.java index 73939df754..0d7cd0d208 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaProperties.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/config/CaptchaProperties.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.framework.captcha.config; +package cn.iocoder.yudao.module.system.framework.captcha.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/package-info.java new file mode 100644 index 0000000000..ee406c0794 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 Hutool captcha 库,实现验证码功能 + */ +package cn.iocoder.yudao.module.system.framework.captcha; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/config/SysDataPermissionConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/SysDataPermissionConfiguration.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/config/SysDataPermissionConfiguration.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/SysDataPermissionConfiguration.java index 984d854403..0b0402956f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/config/SysDataPermissionConfiguration.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/SysDataPermissionConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.framework.datapermission.config; +package cn.iocoder.yudao.module.system.framework.datapermission.config; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/package-info.java new file mode 100644 index 0000000000..a666845510 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/package-info.java @@ -0,0 +1,4 @@ +/** + * system 模块的数据权限配置 + */ +package cn.iocoder.yudao.module.system.framework.datapermission; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeConfiguration.java similarity index 69% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeConfiguration.java index 9a2789ec3d..e86d40b4e6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeConfiguration.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.config; +package cn.iocoder.yudao.module.system.framework.errorcode.config; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.generator.ErrorCodeAutoGenerator; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.loader.ErrorCodeLoader; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.loader.ErrorCodeLoaderImpl; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl; +import cn.iocoder.yudao.module.system.framework.errorcode.core.generator.ErrorCodeAutoGenerator; +import cn.iocoder.yudao.module.system.framework.errorcode.core.loader.ErrorCodeLoader; +import cn.iocoder.yudao.module.system.framework.errorcode.core.service.ErrorCodeFrameworkService; +import cn.iocoder.yudao.module.system.framework.errorcode.core.loader.ErrorCodeLoaderImpl; +import cn.iocoder.yudao.module.system.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeProperties.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeProperties.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeProperties.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeProperties.java index f652a6a899..686f03e2c8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeProperties.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeProperties.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.config; +package cn.iocoder.yudao.module.system.framework.errorcode.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java index 098f0438cf..6f54258697 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto; +package cn.iocoder.yudao.module.system.framework.errorcode.core.dto; import lombok.Data; import lombok.experimental.Accessors; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/dto/ErrorCodeRespDTO.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/dto/ErrorCodeRespDTO.java index 7e2bb2a397..c0b0cbaa3d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/dto/ErrorCodeRespDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto; +package cn.iocoder.yudao.module.system.framework.errorcode.core.dto; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java similarity index 68% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java index 60689af962..6fb2abc020 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.generator; +package cn.iocoder.yudao.module.system.framework.errorcode.core.generator; /** * 错误码的自动生成器 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java index bedbcdc199..0551e4732b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.generator; +package cn.iocoder.yudao.module.system.framework.errorcode.core.generator; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ReflectUtil; import cn.iocoder.yudao.framework.common.exception.ErrorCode; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.service.ErrorCodeFrameworkService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.event.ApplicationReadyEvent; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/loader/ErrorCodeLoader.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/loader/ErrorCodeLoader.java index d35767fd31..6712c33e9b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/loader/ErrorCodeLoader.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.loader; +package cn.iocoder.yudao.module.system.framework.errorcode.core.loader; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java index 234d30dcc6..1641f520fa 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.loader; +package cn.iocoder.yudao.module.system.framework.errorcode.core.loader; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeRespDTO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.service.ErrorCodeFrameworkService; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/service/ErrorCodeFrameworkService.java similarity index 71% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/service/ErrorCodeFrameworkService.java index e3f5e91cc3..2d93f75f1f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/core/service/ErrorCodeFrameworkService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service; +package cn.iocoder.yudao.module.system.framework.errorcode.core.service; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeRespDTO; import javax.validation.Valid; import java.util.Date; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/package-info.java similarity index 59% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/package-info.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/package-info.java index 343ccaeb3e..012bcb33ce 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/package-info.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/package-info.java @@ -3,4 +3,4 @@ * * 将错误码缓存在内存中,同时通过定时器每 n 分钟更新 */ -package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode; +package cn.iocoder.yudao.module.system.framework.errorcode; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/package-info.java similarity index 55% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/package-info.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/package-info.java index b745ae838a..4b8440611a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/package-info.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/package-info.java @@ -3,4 +3,4 @@ * * @author 芋道源码 */ -package cn.iocoder.yudao.adminserver.modules.system.framework; +package cn.iocoder.yudao.module.system.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/auth/SysUserSessionTimeoutJob.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/SysUserSessionTimeoutJob.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/auth/SysUserSessionTimeoutJob.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/SysUserSessionTimeoutJob.java index 57588fa801..c8c719f188 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/auth/SysUserSessionTimeoutJob.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/SysUserSessionTimeoutJob.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.job.auth; +package cn.iocoder.yudao.module.system.job.auth; import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; -import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; +import cn.iocoder.yudao.module.system.service.auth.SysUserSessionService; import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/package-info.java new file mode 100644 index 0000000000..a7f5954178 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.system.job; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/SysDeptRefreshConsumer.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/SysDeptRefreshConsumer.java index 81bed50839..dd9bd64200 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/SysDeptRefreshConsumer.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dept; +package cn.iocoder.yudao.module.system.mq.consumer.dept; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.mq.message.dept.SysDeptRefreshMessage; +import cn.iocoder.yudao.module.system.service.dept.SysDeptService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/SysDictDataRefreshConsumer.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/SysDictDataRefreshConsumer.java index 33f00e077e..ad14b7bfd8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/SysDictDataRefreshConsumer.java @@ -1,9 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dict; +package cn.iocoder.yudao.module.system.mq.consumer.dict; import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; +import cn.iocoder.yudao.module.system.mq.message.dict.SysDictDataRefreshMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/SysMailSendConsumer.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/SysMailSendConsumer.java index ff3b017a98..10b12ce0df 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/SysMailSendConsumer.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail; +package cn.iocoder.yudao.module.system.mq.consumer.mail; import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage; +import cn.iocoder.yudao.module.system.mq.message.mail.SysMailSendMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysMenuRefreshConsumer.java similarity index 71% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysMenuRefreshConsumer.java index 9048e3ccb2..4630fef841 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysMenuRefreshConsumer.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; +package cn.iocoder.yudao.module.system.mq.consumer.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; +import cn.iocoder.yudao.module.system.mq.message.permission.SysMenuRefreshMessage; +import cn.iocoder.yudao.module.system.service.permission.SysMenuService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java index 5cdaeef00e..961ee83ee0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; +package cn.iocoder.yudao.module.system.mq.consumer.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.mq.message.permission.SysRoleMenuRefreshMessage; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleRefreshConsumer.java similarity index 71% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleRefreshConsumer.java index a2f4cc5284..2ed56fe1d8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleRefreshConsumer.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; +package cn.iocoder.yudao.module.system.mq.consumer.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.mq.message.permission.SysRoleRefreshMessage; +import cn.iocoder.yudao.module.system.service.permission.SysRoleService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java index 540ff17e7a..11cbed107e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; +package cn.iocoder.yudao.module.system.mq.consumer.sms; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; +import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsChannelRefreshMessage; +import cn.iocoder.yudao.module.system.service.sms.SysSmsChannelService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsSendConsumer.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsSendConsumer.java index b8ad6ad309..feeeeefea4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsSendConsumer.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; +package cn.iocoder.yudao.module.system.mq.consumer.sms; import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java index 305672bc7e..36e2b4db44 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; +package cn.iocoder.yudao.module.system.mq.consumer.sms; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsTemplateRefreshMessage; import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; import lombok.extern.slf4j.Slf4j; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/SysDeptRefreshMessage.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/SysDeptRefreshMessage.java index 96362a8fe3..4403a28dc5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/SysDeptRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.message.dept; +package cn.iocoder.yudao.module.system.mq.message.dept; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/SysDictDataRefreshMessage.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/SysDictDataRefreshMessage.java index 4415d60bca..7d919dd1fe 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/SysDictDataRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.message.dict; +package cn.iocoder.yudao.module.system.mq.message.dict; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/SysMailSendMessage.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/SysMailSendMessage.java index a0e258796f..e511b32ad9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/SysMailSendMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.message.mail; +package cn.iocoder.yudao.module.system.mq.message.mail; import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysMenuRefreshMessage.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysMenuRefreshMessage.java index 3f0ef3da97..d829f706a1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysMenuRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; +package cn.iocoder.yudao.module.system.mq.message.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleMenuRefreshMessage.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleMenuRefreshMessage.java index 8ddcb17d40..1cfd0e814b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleMenuRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; +package cn.iocoder.yudao.module.system.mq.message.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleRefreshMessage.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleRefreshMessage.java index 9e89fa1863..9ad25c627a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; +package cn.iocoder.yudao.module.system.mq.message.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsChannelRefreshMessage.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsChannelRefreshMessage.java index 22c9341d52..296df410b8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsChannelRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; +package cn.iocoder.yudao.module.system.mq.message.sms; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsTemplateRefreshMessage.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsTemplateRefreshMessage.java index 8401829cb8..955af3ed87 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsTemplateRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; +package cn.iocoder.yudao.module.system.mq.message.sms; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/SysDeptProducer.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/SysDeptProducer.java index c4bbb74192..b4f9dace2f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/SysDeptProducer.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept; +package cn.iocoder.yudao.module.system.mq.producer.dept; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.dept.SysDeptRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/SysDictDataProducer.java similarity index 77% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/SysDictDataProducer.java index 4bce9db1c2..165de3372b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/SysDictDataProducer.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict; +package cn.iocoder.yudao.module.system.mq.producer.dict; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.dict.SysDictDataRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysMenuProducer.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysMenuProducer.java index 1f42965300..d035824f25 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysMenuProducer.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; +package cn.iocoder.yudao.module.system.mq.producer.permission; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.permission.SysMenuRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysPermissionProducer.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysPermissionProducer.java index def201962c..ca5141d846 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysPermissionProducer.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; +package cn.iocoder.yudao.module.system.mq.producer.permission; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.permission.SysRoleMenuRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysRoleProducer.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysRoleProducer.java index c3ab839a17..1fb1be9f6f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysRoleProducer.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; +package cn.iocoder.yudao.module.system.mq.producer.permission; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.permission.SysRoleRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SysSmsProducer.java similarity index 77% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SysSmsProducer.java index acc4fee7a9..abd343a483 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SysSmsProducer.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms; +package cn.iocoder.yudao.module.system.mq.producer.sms; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsChannelRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsTemplateRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/package-info.java new file mode 100644 index 0000000000..df82ac7134 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/package-info.java @@ -0,0 +1,8 @@ +/** + * system 模块下,我们放通用业务,支撑上层的核心业务。 + * 例如说:用户、部门、权限、数据字典等等 + * + * 1. Controller URL:以 /system/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 system_ 开头,方便在数据库中区分 + */ +package cn.iocoder.yudao.module.system; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthService.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthService.java index 2d5fe8c47c..b111147d91 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthService.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.auth; +package cn.iocoder.yudao.module.system.service.auth; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.*; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.*; import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; import javax.validation.Valid; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImpl.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImpl.java index cf0592eff0..bd7fdf2d9d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImpl.java @@ -1,19 +1,19 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.auth.impl; +package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialBindReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthLoginReqVO; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthSocialBindReqVO; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO; +import cn.iocoder.yudao.module.system.convert.auth.SysAuthConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService; -import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.service.auth.SysAuthService; +import cn.iocoder.yudao.module.system.service.common.SysCaptchaService; +import cn.iocoder.yudao.module.system.service.dept.SysPostService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; @@ -33,7 +33,6 @@ import org.springframework.context.annotation.Lazy; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.DisabledException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; @@ -47,7 +46,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static java.util.Collections.singleton; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionService.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionService.java index ebfa6606d2..f47c04b8bf 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionService.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.auth; +package cn.iocoder.yudao.module.system.service.auth; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImpl.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImpl.java index 6e2623b286..83bc371cb3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImpl.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.auth.impl; +package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.service.auth.SysUserSessionService; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaService.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaService.java index 32aff5b06a..c6a20b909d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaService.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.common; +package cn.iocoder.yudao.module.system.service.common; -import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; /** * 验证码 Service 接口 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl/SysCaptchaServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceImpl.java similarity index 70% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl/SysCaptchaServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceImpl.java index daefc007f4..c97ca037c6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl/SysCaptchaServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceImpl.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.common.impl; +package cn.iocoder.yudao.module.system.service.common; import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.CircleCaptcha; import cn.hutool.core.util.IdUtil; -import cn.iocoder.yudao.adminserver.modules.system.framework.captcha.config.CaptchaProperties; -import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.common.SysCaptchaConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.redis.common.SysCaptchaRedisDAO; -import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; +import cn.iocoder.yudao.module.system.framework.captcha.config.CaptchaProperties; +import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.module.system.convert.common.SysCaptchaConvert; +import cn.iocoder.yudao.module.system.dal.redis.common.SysCaptchaRedisDAO; +import cn.iocoder.yudao.module.system.service.common.SysCaptchaService; import org.springframework.stereotype.Service; import javax.annotation.Resource; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptService.java similarity index 67% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptService.java index a7f9208e16..79913ed536 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptService.java @@ -1,16 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dept; +package cn.iocoder.yudao.module.system.service.dept; -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import java.util.Collection; -import java.util.Collections; import java.util.List; -import java.util.Map; /** * 部门 Service 接口 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceImpl.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceImpl.java index 8770fbb2a4..f4f2773e87 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceImpl.java @@ -1,19 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dept.impl; +package cn.iocoder.yudao.module.system.service.dept; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysDeptConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.dept.SysDeptConvert; +import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.enums.dept.DeptIdEnum; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept.SysDeptProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; +import cn.iocoder.yudao.module.system.mq.producer.dept.SysDeptProducer; +import cn.iocoder.yudao.module.system.service.dept.SysDeptService; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; @@ -26,7 +25,7 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostService.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostService.java index 4a1e7a7fd6..def06e25a1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostService.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dept; +package cn.iocoder.yudao.module.system.service.dept; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import org.springframework.lang.Nullable; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceImpl.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceImpl.java index 8531fb16ed..178daeeae7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceImpl.java @@ -1,15 +1,15 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dept.impl; +package cn.iocoder.yudao.module.system.service.dept; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysPostConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.dept.SysPostConvert; +import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; +import cn.iocoder.yudao.module.system.service.dept.SysPostService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -17,7 +17,7 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.List; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataService.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataService.java index 974b02f688..30d4690982 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataService.java @@ -1,14 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dict; +package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataUpdateReqVO; -import java.util.Collection; import java.util.List; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceImpl.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceImpl.java index 9130ebe101..1037779f08 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceImpl.java @@ -1,21 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dict.impl; +package cn.iocoder.yudao.module.system.service.dict; -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.dict.SysDictDataConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictDataMapper; +import cn.iocoder.yudao.module.system.mq.producer.dict.SysDictDataProducer; +import cn.iocoder.yudao.module.system.service.dict.SysDictDataService; +import cn.iocoder.yudao.module.system.service.dict.SysDictTypeService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -23,7 +20,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeService.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeService.java index 6c3324fb56..a115269a63 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeService.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dict; +package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictTypeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceImpl.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictTypeServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceImpl.java index b054764532..7cfb1a9660 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictTypeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceImpl.java @@ -1,15 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dict.impl; +package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictTypeConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictTypeMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.dict.SysDictTypeConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictTypeMapper; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; @@ -17,7 +15,7 @@ import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; /** * 字典类型 Service 实现类 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeService.java similarity index 65% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeService.java index 4bcfb97762..0eff899066 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeService.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.errorcode; +package cn.iocoder.yudao.module.system.service.errorcode; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.service.ErrorCodeFrameworkService; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExportReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodePageReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; import javax.validation.Valid; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceImpl.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceImpl.java index 178e071dd0..af4e9f352a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceImpl.java @@ -1,18 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.errorcode.impl; +package cn.iocoder.yudao.module.system.service.errorcode; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; -import cn.iocoder.yudao.adminserver.modules.system.convert.errorcode.SysErrorCodeConvert; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.errorcode.SysErrorCodeMapper; -import cn.iocoder.yudao.adminserver.modules.system.enums.errorcode.SysErrorCodeTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.service.errorcode.SysErrorCodeService; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeRespDTO; +import cn.iocoder.yudao.module.system.convert.errorcode.SysErrorCodeConvert; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExportReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodePageReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.dal.mysql.errorcode.SysErrorCodeMapper; +import cn.iocoder.yudao.module.system.enums.errorcode.SysErrorCodeTypeEnum; +import cn.iocoder.yudao.module.system.service.errorcode.SysErrorCodeService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -25,7 +25,7 @@ import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogService.java similarity index 70% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogService.java index b7b30e1984..8dbff7d4d8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.logger; +package cn.iocoder.yudao.module.system.service.logger; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImpl.java similarity index 61% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImpl.java index fc651469d4..5d708773a7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImpl.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl; +package cn.iocoder.yudao.module.system.service.logger; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.SysLoginLogMapper; +import cn.iocoder.yudao.module.system.service.logger.SysLoginLogService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.springframework.stereotype.Service; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogService.java similarity index 64% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogService.java index cf3379b398..4bab97586f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogService.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.logger; +package cn.iocoder.yudao.module.system.service.logger; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkService; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImpl.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImpl.java index 811710e24c..c89c37b3e3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImpl.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl; +package cn.iocoder.yudao.module.system.service.logger; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysOperateLogConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysOperateLogMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.module.system.convert.logger.SysOperateLogConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.SysOperateLogMapper; +import cn.iocoder.yudao.module.system.service.logger.SysOperateLogService; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.string.StrUtils; @@ -24,8 +24,8 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.Future; -import static cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; -import static cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; +import static cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; +import static cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Service diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeService.java similarity index 69% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeService.java index ee4ecddb7b..c832beff30 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeService.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.notice; +package cn.iocoder.yudao.module.system.service.notice; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; /** * 通知公告 Service 接口 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl/SysNoticeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImpl.java similarity index 68% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl/SysNoticeServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImpl.java index 2cb770b06c..aa9f4a694d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl/SysNoticeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImpl.java @@ -1,20 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.notice.impl; +package cn.iocoder.yudao.module.system.service.notice; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.notice.SysNoticeConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.notice.SysNoticeMapper; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; -import cn.iocoder.yudao.adminserver.modules.system.service.notice.SysNoticeService; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.notice.SysNoticeConvert; +import cn.iocoder.yudao.module.system.dal.mysql.notice.SysNoticeMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.module.system.service.notice.SysNoticeService; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; /** * 通知公告 Service 实现类 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuService.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuService.java index 5979f16d14..155769a52f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuService.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission; +package cn.iocoder.yudao.module.system.service.permission; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuCreateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuListReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; import java.util.Collection; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysMenuServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceImpl.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysMenuServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceImpl.java index 39200225ef..855d8c9e13 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysMenuServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceImpl.java @@ -1,19 +1,19 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; +package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysMenuConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysMenuMapper; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysMenuProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuCreateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuListReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.permission.SysMenuConvert; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysMenuMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum; +import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; +import cn.iocoder.yudao.module.system.mq.producer.permission.SysMenuProducer; +import cn.iocoder.yudao.module.system.service.permission.SysMenuService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; @@ -31,7 +31,7 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; /** * 菜单 Service 实现 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionService.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionService.java index 627e61b8a9..aad7a419c1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionService.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission; +package cn.iocoder.yudao.module.system.service.permission; import cn.iocoder.yudao.framework.datapermission.core.dept.service.DeptDataPermissionFrameworkService; import cn.iocoder.yudao.framework.security.core.service.SecurityPermissionFrameworkService; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; import org.springframework.lang.Nullable; import java.util.Collection; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceImpl.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceImpl.java index 7e90b568f6..83ca671dbf 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceImpl.java @@ -1,20 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; +package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleMenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMenuMapper; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleMapper; +import cn.iocoder.yudao.module.system.mq.producer.permission.SysPermissionProducer; +import cn.iocoder.yudao.module.system.service.dept.SysDeptService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleService.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleService.java index 74125662d5..47de67f8a6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleService.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission; +package cn.iocoder.yudao.module.system.service.permission; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleCreateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleExportReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import org.springframework.lang.Nullable; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceImpl.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceImpl.java index 8b29e19dff..f0c8b167c4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceImpl.java @@ -1,22 +1,22 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; +package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysRoleConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMapper; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleCreateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleExportReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.permission.SysRoleConvert; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.RoleCodeEnum; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.SysRoleTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysRoleProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum; +import cn.iocoder.yudao.module.system.enums.permission.SysRoleTypeEnum; +import cn.iocoder.yudao.module.system.mq.producer.permission.SysRoleProducer; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.service.permission.SysRoleService; import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; @@ -34,7 +34,7 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelService.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelService.java index 0a7220a791..d7fa604e29 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelService.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; import javax.validation.Valid; import java.util.Collection; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceImpl.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceImpl.java index 59f2a9a307..b36016a6bd 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceImpl.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl; +package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsChannelConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsChannelMapper; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.sms.SysSmsChannelConvert; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsChannelMapper; +import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.module.system.service.sms.SysSmsChannelService; +import cn.iocoder.yudao.module.system.service.sms.SysSmsTemplateService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -25,8 +25,8 @@ import java.util.Comparator; import java.util.Date; import java.util.List; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogService.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogService.java index 75bc3a6cc3..547bc6b0de 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceImpl.java similarity index 65% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceImpl.java index 866e607290..f390c98c5c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceImpl.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl; +package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsLogMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsLogMapper; +import cn.iocoder.yudao.module.system.service.sms.SysSmsLogService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import lombok.extern.slf4j.Slf4j; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateService.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateService.java index 723eef1ffc..96873a0c14 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateService.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceImpl.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceImpl.java index d8c5b99130..3b6e463285 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceImpl.java @@ -1,15 +1,15 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl; +package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.util.ReUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsTemplateMapper; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.sms.SysSmsTemplateConvert; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsTemplateMapper; +import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.module.system.service.sms.SysSmsChannelService; +import cn.iocoder.yudao.module.system.service.sms.SysSmsTemplateService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -29,7 +29,7 @@ import java.util.List; import java.util.Objects; import java.util.regex.Pattern; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/SysTenantService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantService.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/SysTenantService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantService.java index b32e81f122..357e23ad74 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/SysTenantService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantService.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.tenant; +package cn.iocoder.yudao.module.system.service.tenant; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantCreateReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantPageReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/impl/SysTenantServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceImpl.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/impl/SysTenantServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceImpl.java index 80701affb3..bc76d2badd 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/impl/SysTenantServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceImpl.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.tenant.impl; +package cn.iocoder.yudao.module.system.service.tenant; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.convert.tenant.SysTenantConvert; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.tenant.SysTenantMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.tenant.SysTenantService; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantCreateReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantPageReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.tenant.SysTenantConvert; +import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantMapper; +import cn.iocoder.yudao.module.system.service.tenant.SysTenantService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.springframework.stereotype.Service; @@ -16,7 +16,7 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.List; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.TENANT_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.TENANT_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserService.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserService.java index da4695e35a..a1f428b7e1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserService.java @@ -1,12 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.user; +package cn.iocoder.yudao.module.system.service.user; -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.user.*; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import java.io.InputStream; import java.util.*; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImpl.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImpl.java index 1b6c4e4739..5eab9a83cd 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImpl.java @@ -1,20 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.user.impl; +package cn.iocoder.yudao.module.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; -import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.user.*; +import cn.iocoder.yudao.module.system.convert.user.SysUserConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.dal.mysql.user.SysUserMapper; +import cn.iocoder.yudao.module.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.service.dept.SysPostService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; @@ -24,7 +24,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -34,7 +33,7 @@ import javax.annotation.Resource; import java.io.InputStream; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImplTest.java similarity index 92% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImplTest.java index 6e213a57d2..75ab194bce 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImplTest.java @@ -1,14 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.auth; +package cn.iocoder.yudao.module.system.service.auth; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl; -import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthLoginReqVO; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.service.common.SysCaptchaService; +import cn.iocoder.yudao.module.system.service.dept.SysPostService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; @@ -17,6 +15,7 @@ import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreServi import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.test.core.util.AssertUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -32,7 +31,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import javax.annotation.Resource; import java.util.Set; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static java.util.Collections.singleton; @@ -40,11 +39,6 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -/** - * {@link SysAuthServiceImpl} 的单元测试 - * - * @author 芋道源码 - */ @Import(SysAuthServiceImpl.class) public class SysAuthServiceImplTest extends BaseDbUnitTest { diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImplTest.java similarity index 88% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImplTest.java index 164cd90d7d..3454572354 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImplTest.java @@ -1,11 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.auth; +package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.date.DateUtil; -import cn.iocoder.yudao.adminserver.BaseDbAndRedisUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysUserSessionServiceImpl; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; @@ -15,7 +13,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import cn.iocoder.yudao.framework.test.core.util.AssertUtils; +import cn.iocoder.yudao.module.system.test.BaseDbAndRedisUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -123,7 +121,7 @@ public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest { assertEquals(expectedTimeoutCount, actualTimeoutCount); List userSessionDOS = userSessionMapper.selectList(); assertEquals(expectedTotal, userSessionDOS.size()); - AssertUtils.assertPojoEquals(sessionDO, userSessionDOS.get(0), "updateTime"); + assertPojoEquals(sessionDO, userSessionDOS.get(0), "updateTime"); } } diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceTest.java similarity index 77% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceTest.java index c45ed4cbf6..2248744227 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceTest.java @@ -1,10 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.common; +package cn.iocoder.yudao.module.system.service.common; -import cn.iocoder.yudao.adminserver.BaseRedisUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.framework.captcha.config.CaptchaProperties; -import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.redis.common.SysCaptchaRedisDAO; -import cn.iocoder.yudao.adminserver.modules.system.service.common.impl.SysCaptchaServiceImpl; +import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.module.system.dal.redis.common.SysCaptchaRedisDAO; +import cn.iocoder.yudao.module.system.framework.captcha.config.CaptchaProperties; +import cn.iocoder.yudao.module.system.test.BaseRedisUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceTest.java similarity index 92% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceTest.java index 78f8cb707e..b041e2d4cb 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceTest.java @@ -1,17 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dept; +package cn.iocoder.yudao.module.system.service.dept; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysDeptMapper; -import cn.iocoder.yudao.adminserver.modules.system.enums.dept.DeptIdEnum; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept.SysDeptProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.impl.SysDeptServiceImpl; +import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; +import cn.iocoder.yudao.module.system.mq.producer.dept.SysDeptProducer; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import com.google.common.collect.Multimap; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -25,7 +24,7 @@ import java.util.function.Consumer; import static cn.hutool.core.bean.BeanUtil.getFieldValue; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceTest.java similarity index 90% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceTest.java index e3efb412fe..fa0da32577 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceTest.java @@ -1,17 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dept; +package cn.iocoder.yudao.module.system.service.dept; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.impl.SysPostServiceImpl; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -20,11 +19,11 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.*; /** diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceTest.java similarity index 91% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceTest.java index e69b6297e0..bc5f83db8c 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceTest.java @@ -1,19 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dict; +package cn.iocoder.yudao.module.system.service.dict; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.impl.SysDictDataServiceImpl; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictDataMapper; +import cn.iocoder.yudao.module.system.mq.producer.dict.SysDictDataProducer; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -22,7 +21,7 @@ import javax.annotation.Resource; import java.util.List; import java.util.function.Consumer; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceTest.java similarity index 91% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceTest.java index 8ca3638d21..916acbf26f 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceTest.java @@ -1,17 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.dict; +package cn.iocoder.yudao.module.system.service.dict; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictTypeMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.dict.impl.SysDictTypeServiceImpl; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictTypeMapper; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -21,7 +20,7 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; @@ -30,11 +29,6 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; -/** -* {@link SysDictTypeServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ @Import(SysDictTypeServiceImpl.class) public class SysDictTypeServiceTest extends BaseDbUnitTest { diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceTest.java similarity index 88% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceTest.java index 56c0b34949..517006d64c 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceTest.java @@ -1,19 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.errorcode; +package cn.iocoder.yudao.module.system.service.errorcode; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.errorcode.SysErrorCodeMapper; -import cn.iocoder.yudao.adminserver.modules.system.enums.errorcode.SysErrorCodeTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.service.errorcode.impl.SysErrorCodeServiceImpl; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExportReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodePageReqVO; +import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.dal.mysql.errorcode.SysErrorCodeMapper; +import cn.iocoder.yudao.module.system.enums.errorcode.SysErrorCodeTypeEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.assertj.core.util.Lists; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -25,19 +23,14 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.ERROR_CODE_NOT_EXISTS; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static org.junit.jupiter.api.Assertions.*; -/** -* {@link SysErrorCodeServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ @Import(SysErrorCodeServiceImpl.class) public class SysErrorCodeServiceTest extends BaseDbUnitTest { @@ -47,9 +40,6 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @Resource private SysErrorCodeMapper errorCodeMapper; - @Mock - private Logger log; - @Test public void testCreateErrorCode_success() { // 准备参数 @@ -297,7 +287,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @SafeVarargs private static SysErrorCodeDO randomInfErrorCodeDO(Consumer... consumers) { Consumer consumer = (o) -> { - o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 + o.setType(randomEle(SysErrorCodeTypeEnum.values()).getType()); // 保证 key 的范围 }; return randomPojo(SysErrorCodeDO.class, ArrayUtils.append(consumer, consumers)); } diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImplTest.java similarity index 88% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImplTest.java index 820ee51677..bac9b5a6e5 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImplTest.java @@ -1,19 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.logger; +package cn.iocoder.yudao.module.system.service.logger; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.adminserver.modules.system.service.logger.impl.SysLoginLogServiceImpl; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.SysLoginLogMapper; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImplTest.java similarity index 91% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImplTest.java index f375be35b1..7838defb92 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImplTest.java @@ -1,13 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.logger; +package cn.iocoder.yudao.module.system.service.logger; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysOperateLogMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.logger.impl.SysOperateLogServiceImpl; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.SysOperateLogMapper; +import cn.iocoder.yudao.module.system.service.user.SysUserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -18,6 +16,7 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImplTest.java similarity index 86% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImplTest.java index 8d1325544b..0d9144f752 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImplTest.java @@ -1,16 +1,15 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.notice; +package cn.iocoder.yudao.module.system.service.notice; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.notice.SysNoticeMapper; -import cn.iocoder.yudao.adminserver.modules.system.enums.notice.SysNoticeTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.service.notice.impl.SysNoticeServiceImpl; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.module.system.dal.mysql.notice.SysNoticeMapper; +import cn.iocoder.yudao.module.system.enums.notice.SysNoticeTypeEnum; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -19,7 +18,7 @@ import javax.annotation.Resource; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceTest.java similarity index 91% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceTest.java index e9dab50a42..06209bb6da 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceTest.java @@ -1,20 +1,19 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission; +package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysMenuMapper; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysMenuProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysMenuServiceImpl; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuCreateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuListReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysMenuMapper; +import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; +import cn.iocoder.yudao.module.system.mq.producer.permission.SysMenuProducer; import cn.iocoder.yudao.framework.common.util.spring.SpringAopUtils; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import com.google.common.collect.Multimap; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -24,7 +23,7 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; @@ -87,12 +86,12 @@ public class SysMenuServiceTest extends BaseDbUnitTest { o.setParentId(parentId); o.setName("testSonName"); o.setType(MenuTypeEnum.MENU.getType()); - o.setStatus(RandomUtils.randomCommonStatus()); + o.setStatus(randomCommonStatus()); }); Long menuId = sysMenuService.createMenu(vo); //断言 - Assertions.assertNotNull(menuId); + assertNotNull(menuId); // 校验记录的属性是否正确 SysMenuDO ret = menuMapper.selectById(menuId); assertPojoEquals(vo, ret); @@ -112,7 +111,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { o.setId(sonId); o.setParentId(parentId); o.setType(MenuTypeEnum.MENU.getType()); - o.setStatus(RandomUtils.randomCommonStatus()); + o.setStatus(randomCommonStatus()); o.setName("pppppp"); //修改名字 }); sysMenuService.updateMenu(vo); @@ -135,7 +134,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { o.setId(sonId); o.setParentId(parentId); o.setType(MenuTypeEnum.MENU.getType()); - o.setStatus(RandomUtils.randomCommonStatus()); + o.setStatus(randomCommonStatus()); }); //断言 assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_NOT_EXISTS); @@ -346,7 +345,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { } private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) { - return createMenuDO(typeEnum, menuName, parentId, RandomUtils.randomCommonStatus()); + return createMenuDO(typeEnum, menuName, parentId, randomCommonStatus()); } private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceTest.java similarity index 93% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceTest.java index 6de00282f5..dde1a7bb76 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceTest.java @@ -1,19 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission; +package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleMenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysPermissionServiceImpl; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMenuMapper; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleMapper; +import cn.iocoder.yudao.module.system.mq.producer.permission.SysPermissionProducer; +import cn.iocoder.yudao.module.system.service.dept.SysDeptService; import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceTest.java similarity index 92% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceTest.java index 87261a45e9..d58e68ad2a 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceTest.java @@ -1,19 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.permission; +package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.bean.BeanUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleCreateReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMapper; -import cn.iocoder.yudao.adminserver.modules.system.enums.permission.SysRoleTypeEnum; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysRoleProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysRoleServiceImpl; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMapper; +import cn.iocoder.yudao.module.system.enums.permission.SysRoleTypeEnum; +import cn.iocoder.yudao.module.system.mq.producer.permission.SysRoleProducer; import cn.iocoder.yudao.framework.common.util.spring.SpringAopUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -22,7 +21,7 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceTest.java similarity index 88% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceTest.java index 4442751206..d3509f9e42 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceTest.java @@ -1,19 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.bean.BeanUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsChannelMapper; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsChannelServiceImpl; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsChannelMapper; +import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -23,8 +22,8 @@ import java.util.Date; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; @@ -33,11 +32,6 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -/** -* {@link SysSmsChannelServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ @Import(SysSmsChannelServiceImpl.class) public class SysSmsChannelServiceTest extends BaseDbUnitTest { diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceTest.java similarity index 92% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceTest.java index fdeed2aa87..ae8e734e99 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceTest.java @@ -1,11 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsLogMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsLogServiceImpl; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsLogMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum; import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum; @@ -14,6 +12,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -29,11 +28,6 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; import static org.junit.jupiter.api.Assertions.assertEquals; -/** -* {@link SysSmsLogServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ @Import(SysSmsLogServiceImpl.class) public class SysSmsLogServiceTest extends BaseDbUnitTest { diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceTest.java similarity index 94% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceTest.java index a893ee2966..1ee2c90fbe 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceTest.java @@ -1,13 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsTemplateMapper; -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsTemplateServiceImpl; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsTemplateMapper; +import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum; @@ -20,6 +18,7 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClient; import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import com.google.common.collect.Lists; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -30,7 +29,7 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; @@ -39,11 +38,6 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -/** -* {@link SysSmsTemplateServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ @Import(SysSmsTemplateServiceImpl.class) public class SysSmsTemplateServiceTest extends BaseDbUnitTest { diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/SysTenantServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceTest.java similarity index 89% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/SysTenantServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceTest.java index abb16e80e1..a6199f7060 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/tenant/SysTenantServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceTest.java @@ -1,22 +1,21 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.tenant; +package cn.iocoder.yudao.module.system.service.tenant; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantExportReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantPageReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.tenant.vo.SysTenantUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.tenant.SysTenantMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.tenant.impl.SysTenantServiceImpl; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantCreateReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantPageReqVO; +import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.util.List; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.TENANT_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.TENANT_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImplTest.java similarity index 95% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImplTest.java index dc90a436ad..fc53a658be 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImplTest.java @@ -1,18 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.system.service.user; +package cn.iocoder.yudao.module.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.user.vo.user.*; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.impl.SysUserServiceImpl; +import cn.iocoder.yudao.module.system.dal.mysql.user.SysUserMapper; +import cn.iocoder.yudao.module.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.service.dept.SysPostService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; @@ -22,6 +20,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; import org.springframework.boot.test.mock.mockito.MockBean; @@ -35,13 +34,11 @@ import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomBytes; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static java.util.Collections.singleton; import static org.assertj.core.util.Lists.newArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbAndRedisUnitTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbAndRedisUnitTest.java new file mode 100644 index 0000000000..e5b5cdb548 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbAndRedisUnitTest.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.system.test; + +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB + Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbAndRedisUnitTest { + + @Import({ + // DB 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbUnitTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbUnitTest.java new file mode 100644 index 0000000000..053da2c7b5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbUnitTest.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.system.test; + +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB 的单元测试 + * + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbUnitTest { + + @Import({ + // DB 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + }) + public static class Application { + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseRedisUnitTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseRedisUnitTest.java new file mode 100644 index 0000000000..0e3472f4fc --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseRedisUnitTest.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.test; + +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +/** + * 依赖内存 Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +public class BaseRedisUnitTest { + + @Import({ + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/RedisTestConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/RedisTestConfiguration.java new file mode 100644 index 0000000000..71c912d45e --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/RedisTestConfiguration.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.system.test; + +import com.github.fppt.jedismock.RedisServer; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import java.io.IOException; + +@Configuration(proxyBeanMethods = false) +@Lazy(false) // 禁止延迟加载 +@EnableConfigurationProperties(RedisProperties.class) +public class RedisTestConfiguration { + + /** + * 创建模拟的 Redis Server 服务器 + */ + @Bean + public RedisServer redisServer(RedisProperties properties) throws IOException { + RedisServer redisServer = new RedisServer(properties.getPort()); + // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 + try { + redisServer.start(); + } catch (Exception ignore) {} + return redisServer; + } + +} From 117914d92b7398b6508d67c1b6f3db898765d7b8 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 29 Jan 2022 21:29:54 +0800 Subject: [PATCH 10/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=204=EF=BC=9Asystem=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=EF=BC=8C=E5=8E=BB=E9=99=A4=20Sys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http-client.env.json | 7 +- .../src/main/resources/application.yaml | 6 +- .../YudaoWebSecurityConfigurerAdapter.java | 5 +- .../app/auth/AppAuthController.http | 16 +-- .../app/auth/AppAuthController.java | 9 +- .../app/auth/vo/AppAuthCheckCodeReqVO.java | 2 +- .../app/auth/vo/AppAuthLoginReqVO.java | 2 +- .../app/auth/vo/AppAuthLoginRespVO.java | 2 +- .../auth/vo/AppAuthResetPasswordReqVO.java | 2 +- .../app/auth/vo/AppAuthSendSmsReqVO.java | 2 +- .../app/auth/vo/AppAuthSmsLoginReqVO.java | 2 +- .../app/auth/vo/AppAuthSocialBindReqVO.java | 2 +- .../app/auth/vo/AppAuthSocialLogin2ReqVO.java | 2 +- .../app/auth/vo/AppAuthSocialLoginReqVO.java | 2 +- .../app/auth/vo/AppAuthSocialUnbindReqVO.java | 2 +- .../auth/vo/AppAuthUpdatePasswordReqVO.java | 2 +- .../member/controller/app/package-info.java | 1 - .../app/user/AppUserController.java | 2 +- .../app/user/vo/AppUserInfoRespVO.java | 2 +- .../app/user/vo/AppUserUpdateMobileReqVO.java | 2 +- .../member/controller/package-info.java | 2 +- .../member/service/auth/AuthServiceImpl.java | 2 +- .../member/service/user/UserServiceImpl.java | 2 +- .../auth/AuthController.http} | 16 +-- .../auth/AuthController.java} | 58 ++++----- .../auth/UserSessionController.java} | 22 ++-- .../auth/vo/auth/AuthLoginReqVO.java} | 6 +- .../auth/vo/auth/AuthLoginRespVO.java} | 6 +- .../auth/vo/auth/AuthMenuRespVO.java} | 8 +- .../vo/auth/AuthPermissionInfoRespVO.java} | 6 +- .../auth/vo/auth/AuthSocialBindReqVO.java} | 6 +- .../auth/vo/auth/AuthSocialLogin2ReqVO.java} | 6 +- .../auth/vo/auth/AuthSocialLoginReqVO.java} | 6 +- .../auth/vo/auth/AuthSocialUnbindReqVO.java} | 6 +- .../session/UserSessionPageItemRespVO.java} | 6 +- .../vo/session/UserSessionPageReqVO.java} | 6 +- .../common/CaptchaController.http} | 0 .../common/CaptchaController.java} | 14 +-- .../common/vo/CaptchaImageRespVO.java} | 9 +- .../dept/DeptController.java} | 32 ++--- .../dept/PostController.java} | 38 +++--- .../dept/vo/dept/DeptBaseVO.java} | 4 +- .../dept/vo/dept/DeptCreateReqVO.java} | 6 +- .../dept/vo/dept/DeptListReqVO.java} | 6 +- .../dept/vo/dept/DeptRespVO.java} | 6 +- .../dept/vo/dept/DeptSimpleRespVO.java} | 6 +- .../dept/vo/dept/DeptUpdateReqVO.java} | 6 +- .../dept/vo/post/PostBaseVO.java} | 4 +- .../admin/dept/vo/post/PostCreateReqVO.java | 11 ++ .../dept/vo/post/PostExcelVO.java} | 4 +- .../dept/vo/post/PostExportReqVO.java} | 6 +- .../dept/vo/post/PostListReqVO.java} | 6 +- .../dept/vo/post/PostPageReqVO.java} | 6 +- .../dept/vo/post/PostRespVO.java} | 6 +- .../dept/vo/post/PostSimpleRespVO.java} | 6 +- .../dept/vo/post/PostUpdateReqVO.java} | 6 +- .../dict/DictDataController.http} | 1 + .../dict/DictDataController.java} | 36 +++--- .../dict/DictTypeController.java} | 42 +++---- .../dict/vo/data/DictDataBaseVO.java} | 4 +- .../dict/vo/data/DictDataCreateReqVO.java | 12 ++ .../dict/vo/data/DictDataExcelVO.java} | 4 +- .../dict/vo/data/DictDataExportReqVO.java} | 6 +- .../dict/vo/data/DictDataPageReqVO.java} | 6 +- .../dict/vo/data/DictDataRespVO.java} | 6 +- .../dict/vo/data/DictDataSimpleRespVO.java} | 6 +- .../dict/vo/data/DictDataUpdateReqVO.java} | 6 +- .../dict/vo/type/DictTypeBaseVO.java} | 4 +- .../dict/vo/type/DictTypeCreateReqVO.java} | 6 +- .../dict/vo/type/DictTypeExcelVO.java} | 4 +- .../dict/vo/type/DictTypeExportReqVO.java} | 6 +- .../dict/vo/type/DictTypePageReqVO.java} | 6 +- .../dict/vo/type/DictTypeRespVO.java} | 6 +- .../dict/vo/type/DictTypeSimpleRespVO.java} | 6 +- .../dict/vo/type/DictTypeUpdateReqVO.java} | 6 +- .../errorcode/ErrorCodeController.http} | 5 +- .../errorcode/ErrorCodeController.java} | 40 +++--- .../errorcode/vo/ErrorCodeBaseVO.java} | 4 +- .../errorcode/vo/ErrorCodeCreateReqVO.java} | 6 +- .../errorcode/vo/ErrorCodeExcelVO.java} | 4 +- .../errorcode/vo/ErrorCodeExportReqVO.java} | 6 +- .../errorcode/vo/ErrorCodePageReqVO.java} | 6 +- .../errorcode/vo/ErrorCodeRespVO.java} | 6 +- .../errorcode/vo/ErrorCodeUpdateReqVO.java} | 6 +- .../logger/LoginLogController.java} | 30 ++--- .../logger/OperateLogController.http} | 1 + .../logger/OperateLogController.java} | 42 +++---- .../logger/vo/loginlog/LoginLogBaseVO.java} | 4 +- .../logger/vo/loginlog/LoginLogExcelVO.java} | 4 +- .../vo/loginlog/LoginLogExportReqVO.java} | 6 +- .../vo/loginlog/LoginLogPageReqVO.java} | 6 +- .../logger/vo/loginlog/LoginLogRespVO.java} | 6 +- .../vo/operatelog/OperateLogBaseVO.java} | 4 +- .../vo/operatelog/OperateLogExcelVO.java} | 4 +- .../vo/operatelog/OperateLogExportReqVO.java} | 6 +- .../vo/operatelog/OperateLogPageReqVO.java} | 6 +- .../vo/operatelog/OperateLogRespVO.java} | 6 +- .../notice/NoticeController.java} | 32 ++--- .../notice/vo/NoticeBaseVO.java} | 4 +- .../admin/notice/vo/NoticeCreateReqVO.java | 11 ++ .../notice/vo/NoticePageReqVO.java} | 6 +- .../notice/vo/NoticeRespVO.java} | 6 +- .../notice/vo/NoticeUpdateReqVO.java} | 6 +- .../permission/MenuController.http} | 1 + .../permission/MenuController.java} | 44 +++---- .../permission/PermissionController.java} | 26 ++-- .../permission/RoleController.http} | 6 +- .../permission/RoleController.java} | 36 +++--- .../permission/vo/menu/MenuBaseVO.java} | 4 +- .../permission/vo/menu/MenuCreateReqVO.java | 10 ++ .../permission/vo/menu/MenuListReqVO.java} | 6 +- .../permission/vo/menu/MenuRespVO.java} | 6 +- .../permission/vo/menu/MenuSimpleRespVO.java} | 6 +- .../permission/vo/menu/MenuUpdateReqVO.java} | 6 +- .../PermissionAssignRoleDataScopeReqVO.java} | 6 +- .../PermissionAssignRoleMenuReqVO.java} | 6 +- .../PermissionAssignUserRoleReqVO.java} | 6 +- .../permission/vo/role/RoleBaseVO.java} | 4 +- .../permission/vo/role/RoleCreateReqVO.java | 12 ++ .../permission/vo/role/RoleExcelVO.java} | 4 +- .../permission/vo/role/RoleExportReqVO.java} | 6 +- .../permission/vo/role/RolePageReqVO.java} | 6 +- .../permission/vo/role/RoleRespVO.java} | 6 +- .../permission/vo/role/RoleSimpleRespVO.java} | 6 +- .../permission/vo/role/RoleUpdateReqVO.java} | 6 +- .../vo/role/RoleUpdateStatusReqVO.java} | 10 +- .../sms/SmsCallbackController.java | 4 +- .../sms/SmsChannelController.java} | 30 ++--- .../sms/SmsLogController.java} | 30 ++--- .../sms/SmsTemplateController.http} | 3 +- .../sms/SmsTemplateController.java} | 34 ++--- .../sms/vo/channel/SmsChannelBaseVO.java} | 4 +- .../vo/channel/SmsChannelCreateReqVO.java} | 6 +- .../sms/vo/channel/SmsChannelPageReqVO.java} | 6 +- .../sms/vo/channel/SmsChannelRespVO.java} | 6 +- .../vo/channel/SmsChannelSimpleRespVO.java} | 6 +- .../vo/channel/SmsChannelUpdateReqVO.java} | 6 +- .../sms/vo/log/SmsLogExcelVO.java} | 4 +- .../sms/vo/log/SmsLogExportReqVO.java} | 6 +- .../sms/vo/log/SmsLogPageReqVO.java} | 6 +- .../sms/vo/log/SysSmsLogRespVO.java | 4 +- .../sms/vo/template/SmsTemplateBaseVO.java} | 4 +- .../vo/template/SmsTemplateCreateReqVO.java | 14 +++ .../sms/vo/template/SmsTemplateExcelVO.java} | 4 +- .../vo/template/SmsTemplateExportReqVO.java} | 6 +- .../vo/template/SmsTemplatePageReqVO.java} | 6 +- .../sms/vo/template/SmsTemplateRespVO.java} | 6 +- .../vo/template/SmsTemplateSendReqVO.java} | 6 +- .../vo/template/SmsTemplateUpdateReqVO.java} | 6 +- .../tenant/TenantController.java} | 36 +++--- .../tenant/vo/TenantBaseVO.java} | 4 +- .../admin/tenant/vo/TenantCreateReqVO.java | 12 ++ .../tenant/vo/TenantExcelVO.java} | 4 +- .../tenant/vo/TenantExportReqVO.java} | 6 +- .../tenant/vo/TenantPageReqVO.java} | 6 +- .../tenant/vo/TenantRespVO.java} | 6 +- .../tenant/vo/TenantUpdateReqVO.java} | 6 +- .../user/UserController.http} | 4 +- .../user/UserController.java} | 60 ++++----- .../user/UserProfileController.http} | 3 +- .../user/UserProfileController.java} | 48 ++++---- .../user/vo/profile/UserProfileRespVO.java} | 8 +- .../UserProfileUpdatePasswordReqVO.java} | 6 +- .../vo/profile/UserProfileUpdateReqVO.java} | 6 +- .../user/vo/user/UserBaseVO.java} | 4 +- .../user/vo/user/UserCreateReqVO.java} | 6 +- .../user/vo/user/UserExcelVO.java} | 4 +- .../user/vo/user/UserExportReqVO.java} | 6 +- .../user/vo/user/UserImportExcelVO.java} | 4 +- .../user/vo/user/UserImportRespVO.java} | 6 +- .../user/vo/user/UserPageItemRespVO.java} | 6 +- .../user/vo/user/UserPageReqVO.java} | 6 +- .../user/vo/user/UserRespVO.java} | 6 +- .../user/vo/user/UserSimpleRespVO.java} | 4 +- .../vo/user/UserUpdatePasswordReqVO.java} | 6 +- .../user/vo/user/UserUpdateReqVO.java} | 6 +- .../user/vo/user/UserUpdateStatusReqVO.java} | 6 +- .../system/controller/app/package-info.java | 4 + .../dept/vo/post/SysPostCreateReqVO.java | 11 -- .../dict/vo/data/SysDictDataCreateReqVO.java | 12 -- .../errorcode/vo/SysErrorCodeCreateReqVO.java | 14 --- .../notice/vo/SysNoticeCreateReqVO.java | 11 -- .../system/controller/package-info.java | 6 + .../vo/menu/SysMenuCreateReqVO.java | 10 -- .../vo/role/SysRoleCreateReqVO.java | 12 -- .../tenant/vo/SysTenantCreateReqVO.java | 12 -- .../{SysAuthConvert.java => AuthConvert.java} | 30 ++--- .../convert/auth/SysUserSessionConvert.java | 15 --- .../convert/auth/UserSessionConvert.java | 15 +++ .../system/convert/common/CaptchaConvert.java | 17 +++ .../convert/common/SysCaptchaConvert.java | 17 --- .../system/convert/dept/DeptConvert.java | 28 +++++ .../system/convert/dept/PostConvert.java | 28 +++++ .../system/convert/dept/SysDeptConvert.java | 28 ----- .../system/convert/dept/SysPostConvert.java | 28 ----- .../system/convert/dict/DictDataConvert.java | 34 +++++ .../system/convert/dict/DictTypeConvert.java | 28 +++++ .../convert/dict/SysDictDataConvert.java | 34 ----- .../convert/dict/SysDictTypeConvert.java | 28 ----- .../convert/errorcode/ErrorCodeConvert.java | 42 +++++++ .../errorcode/SysErrorCodeConvert.java | 42 ------- .../convert/logger/LoginLogConvert.java | 21 ++++ ...LogConvert.java => OperateLogConvert.java} | 22 ++-- .../convert/logger/SysLoginLogConvert.java | 21 ---- .../system/convert/notice/NoticeConvert.java | 24 ++++ .../convert/notice/SysNoticeConvert.java | 24 ---- .../convert/permission/MenuConvert.java | 28 +++++ .../convert/permission/RoleConvert.java | 25 ++++ .../convert/permission/SysMenuConvert.java | 28 ----- .../convert/permission/SysRoleConvert.java | 25 ---- .../system/convert/sms/SmsChannelConvert.java | 39 ++++++ ...sSmsLogConvert.java => SmsLogConvert.java} | 10 +- .../convert/sms/SmsTemplateConvert.java | 31 +++++ .../convert/sms/SysSmsChannelConvert.java | 39 ------ .../convert/sms/SysSmsTemplateConvert.java | 31 ----- .../convert/tenant/SysTenantConvert.java | 36 ------ .../system/convert/tenant/TenantConvert.java | 36 ++++++ .../system/convert/user/SysUserConvert.java | 49 -------- .../system/convert/user/UserConvert.java | 49 ++++++++ .../{SysDictTypeDO.java => DictTypeDO.java} | 4 +- .../{SysErrorCodeDO.java => ErrorCodeDO.java} | 8 +- ...SysOperateLogDO.java => OperateLogDO.java} | 4 +- .../{SysNoticeDO.java => NoticeDO.java} | 8 +- .../{SysMenuDO.java => MenuDO.java} | 4 +- .../{SysRoleMenuDO.java => RoleMenuDO.java} | 4 +- .../dal/mysql/auth/SysUserSessionMapper.java | 4 +- .../system/dal/mysql/dept/SysDeptMapper.java | 4 +- .../system/dal/mysql/dept/SysPostMapper.java | 8 +- .../dal/mysql/dict/SysDictDataMapper.java | 8 +- .../dal/mysql/dict/SysDictTypeMapper.java | 24 ++-- .../mysql/errorcode/SysErrorCodeMapper.java | 28 ++--- ...oginLogMapper.java => LoginLogMapper.java} | 20 +-- ...teLogMapper.java => OperateLogMapper.java} | 16 +-- .../dal/mysql/notice/SysNoticeMapper.java | 10 +- .../dal/mysql/permission/SysMenuMapper.java | 24 ++-- .../dal/mysql/permission/SysRoleMapper.java | 8 +- .../mysql/permission/SysRoleMenuMapper.java | 18 +-- .../dal/mysql/sms/SysSmsChannelMapper.java | 4 +- .../system/dal/mysql/sms/SysSmsLogMapper.java | 8 +- .../dal/mysql/sms/SysSmsTemplateMapper.java | 8 +- .../dal/mysql/tenant/SysTenantMapper.java | 8 +- .../system/dal/mysql/user/SysUserMapper.java | 8 +- .../dal/redis/SysRedisKeyConstants.java | 3 +- ...tchaRedisDAO.java => CaptchaRedisDAO.java} | 2 +- ...Constants.java => ErrorCodeConstants.java} | 2 +- ...deTypeEnum.java => ErrorCodeTypeEnum.java} | 4 +- ...LogTypeEnum.java => LoginLogTypeEnum.java} | 2 +- ...inResultEnum.java => LoginResultEnum.java} | 2 +- ...oticeTypeEnum.java => NoticeTypeEnum.java} | 2 +- ...SysRoleTypeEnum.java => RoleTypeEnum.java} | 2 +- ....java => DataPermissionConfiguration.java} | 4 +- .../config/ErrorCodeConfiguration.java | 1 + ...outJob.java => UserSessionTimeoutJob.java} | 6 +- ...Consumer.java => DeptRefreshConsumer.java} | 12 +- ...umer.java => DictDataRefreshConsumer.java} | 8 +- ...endConsumer.java => MailSendConsumer.java} | 7 +- ...Consumer.java => MenuRefreshConsumer.java} | 12 +- ...umer.java => RoleMenuRefreshConsumer.java} | 12 +- ...Consumer.java => RoleRefreshConsumer.java} | 12 +- ...er.java => SmsChannelRefreshConsumer.java} | 12 +- ...SendConsumer.java => SmsSendConsumer.java} | 2 +- ...r.java => SmsTemplateRefreshConsumer.java} | 8 +- ...shMessage.java => DeptRefreshMessage.java} | 2 +- ...ssage.java => DictDataRefreshMessage.java} | 2 +- ...lSendMessage.java => MailSendMessage.java} | 2 +- ...shMessage.java => MenuRefreshMessage.java} | 2 +- ...ssage.java => RoleMenuRefreshMessage.java} | 2 +- ...shMessage.java => RoleRefreshMessage.java} | 2 +- ...age.java => SmsChannelRefreshMessage.java} | 2 +- ...ge.java => SmsTemplateRefreshMessage.java} | 2 +- ...SysDeptProducer.java => DeptProducer.java} | 8 +- ...ataProducer.java => DictDataProducer.java} | 8 +- ...SysMenuProducer.java => MenuProducer.java} | 8 +- ...nProducer.java => PermissionProducer.java} | 8 +- ...SysRoleProducer.java => RoleProducer.java} | 8 +- .../{SysSmsProducer.java => SmsProducer.java} | 14 +-- .../{SysAuthService.java => AuthService.java} | 12 +- ...hServiceImpl.java => AuthServiceImpl.java} | 75 ++++++----- ...onService.java => UserSessionService.java} | 6 +- ...eImpl.java => UserSessionServiceImpl.java} | 19 ++- ...aptchaService.java => CaptchaService.java} | 6 +- ...rviceImpl.java => CaptchaServiceImpl.java} | 15 ++- .../{SysDeptService.java => DeptService.java} | 14 +-- ...tServiceImpl.java => DeptServiceImpl.java} | 27 ++-- .../{SysPostService.java => PostService.java} | 18 +-- ...tServiceImpl.java => PostServiceImpl.java} | 27 ++-- ...tDataService.java => DictDataService.java} | 18 +-- ...viceImpl.java => DictDataServiceImpl.java} | 40 +++--- ...tTypeService.java => DictTypeService.java} | 26 ++-- ...viceImpl.java => DictTypeServiceImpl.java} | 46 +++---- ...CodeService.java => ErrorCodeService.java} | 22 ++-- ...iceImpl.java => ErrorCodeServiceImpl.java} | 57 +++++---- ...inLogService.java => LoginLogService.java} | 10 +- .../service/logger/LoginLogServiceImpl.java | 32 +++++ ...LogService.java => OperateLogService.java} | 12 +- ...ceImpl.java => OperateLogServiceImpl.java} | 29 +++-- .../logger/SysLoginLogServiceImpl.java | 33 ----- ...sNoticeService.java => NoticeService.java} | 18 +-- ...erviceImpl.java => NoticeServiceImpl.java} | 29 +++-- .../{SysMenuService.java => MenuService.java} | 28 ++--- ...uServiceImpl.java => MenuServiceImpl.java} | 64 +++++----- ...ionService.java => PermissionService.java} | 8 +- ...ceImpl.java => PermissionServiceImpl.java} | 36 +++--- .../{SysRoleService.java => RoleService.java} | 18 +-- ...eServiceImpl.java => RoleServiceImpl.java} | 40 +++--- ...nelService.java => SmsChannelService.java} | 14 +-- ...ceImpl.java => SmsChannelServiceImpl.java} | 34 +++-- ...sSmsLogService.java => SmsLogService.java} | 10 +- ...erviceImpl.java => SmsLogServiceImpl.java} | 11 +- ...teService.java => SmsTemplateService.java} | 18 +-- ...eImpl.java => SmsTemplateServiceImpl.java} | 34 +++-- ...sTenantService.java => TenantService.java} | 18 +-- ...erviceImpl.java => TenantServiceImpl.java} | 27 ++-- .../{SysUserService.java => UserService.java} | 22 ++-- ...rServiceImpl.java => UserServiceImpl.java} | 55 ++++----- ...ImplTest.java => AuthServiceImplTest.java} | 70 +++++------ ...t.java => UserSessionServiceImplTest.java} | 16 +-- ...rviceTest.java => CaptchaServiceTest.java} | 14 +-- ...tServiceTest.java => DeptServiceTest.java} | 36 +++--- ...tServiceTest.java => PostServiceTest.java} | 33 +++-- ...viceTest.java => DictDataServiceTest.java} | 43 +++---- ...viceTest.java => DictTypeServiceTest.java} | 58 ++++----- ...iceTest.java => ErrorCodeServiceTest.java} | 92 +++++++------- ...Test.java => LoginLogServiceImplTest.java} | 34 ++--- ...st.java => OperateLogServiceImplTest.java} | 34 ++--- ...plTest.java => NoticeServiceImplTest.java} | 62 +++++----- ...uServiceTest.java => MenuServiceTest.java} | 116 +++++++++--------- ...ceTest.java => PermissionServiceTest.java} | 44 +++---- ...eServiceTest.java => RoleServiceTest.java} | 76 ++++++------ ...ceTest.java => SmsChannelServiceTest.java} | 30 ++--- ...erviceTest.java => SmsLogServiceTest.java} | 14 +-- ...eTest.java => SmsTemplateServiceTest.java} | 32 ++--- ...erviceTest.java => TenantServiceTest.java} | 31 ++--- ...ImplTest.java => UserServiceImplTest.java} | 59 ++++----- 更新日志.md | 3 + 335 files changed, 2481 insertions(+), 2498 deletions(-) delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/package-info.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/SysAuthController.http => admin/auth/AuthController.http} (61%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/SysAuthController.java => admin/auth/AuthController.java} (73%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/SysUserSessionController.java => admin/auth/UserSessionController.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/auth/SysAuthLoginReqVO.java => admin/auth/vo/auth/AuthLoginReqVO.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/auth/SysAuthLoginRespVO.java => admin/auth/vo/auth/AuthLoginRespVO.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/auth/SysAuthMenuRespVO.java => admin/auth/vo/auth/AuthMenuRespVO.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/auth/SysAuthPermissionInfoRespVO.java => admin/auth/vo/auth/AuthPermissionInfoRespVO.java} (81%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/auth/SysAuthSocialBindReqVO.java => admin/auth/vo/auth/AuthSocialBindReqVO.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/auth/SysAuthSocialLogin2ReqVO.java => admin/auth/vo/auth/AuthSocialLogin2ReqVO.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/auth/SysAuthSocialLoginReqVO.java => admin/auth/vo/auth/AuthSocialLoginReqVO.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/auth/SysAuthSocialUnbindReqVO.java => admin/auth/vo/auth/AuthSocialUnbindReqVO.java} (83%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/session/SysUserSessionPageItemRespVO.java => admin/auth/vo/session/UserSessionPageItemRespVO.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{auth/vo/session/SysUserSessionPageReqVO.java => admin/auth/vo/session/UserSessionPageReqVO.java} (71%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{common/SysCaptchaController.http => admin/common/CaptchaController.http} (100%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{common/SysCaptchaController.java => admin/common/CaptchaController.java} (61%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{common/vo/SysCaptchaImageRespVO.java => admin/common/vo/CaptchaImageRespVO.java} (64%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/SysDeptController.java => admin/dept/DeptController.java} (73%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/SysPostController.java => admin/dept/PostController.java} (73%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/dept/SysDeptBaseVO.java => admin/dept/vo/dept/DeptBaseVO.java} (94%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/dept/SysDeptCreateReqVO.java => admin/dept/vo/dept/DeptCreateReqVO.java} (52%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/dept/SysDeptListReqVO.java => admin/dept/vo/dept/DeptListReqVO.java} (71%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/dept/SysDeptRespVO.java => admin/dept/vo/dept/DeptRespVO.java} (77%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/dept/SysDeptSimpleRespVO.java => admin/dept/vo/dept/DeptSimpleRespVO.java} (77%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/dept/SysDeptUpdateReqVO.java => admin/dept/vo/dept/DeptUpdateReqVO.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/post/SysPostBaseVO.java => admin/dept/vo/post/PostBaseVO.java} (93%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostCreateReqVO.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/post/SysPostExcelVO.java => admin/dept/vo/post/PostExcelVO.java} (88%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/post/SysPostExportReqVO.java => admin/dept/vo/post/PostExportReqVO.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/post/SysPostListReqVO.java => admin/dept/vo/post/PostListReqVO.java} (72%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/post/SysPostPageReqVO.java => admin/dept/vo/post/PostPageReqVO.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/post/SysPostRespVO.java => admin/dept/vo/post/PostRespVO.java} (72%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/post/SysPostSimpleRespVO.java => admin/dept/vo/post/PostSimpleRespVO.java} (73%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dept/vo/post/SysPostUpdateReqVO.java => admin/dept/vo/post/PostUpdateReqVO.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/SysDictDataController.http => admin/dict/DictDataController.http} (80%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/SysDictDataController.java => admin/dict/DictDataController.java} (71%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/SysDictTypeController.java => admin/dict/DictTypeController.java} (66%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/data/SysDictDataBaseVO.java => admin/dict/vo/data/DictDataBaseVO.java} (94%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/data/SysDictDataExcelVO.java => admin/dict/vo/data/DictDataExcelVO.java} (88%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/data/SysDictDataExportReqVO.java => admin/dict/vo/data/DictDataExportReqVO.java} (80%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/data/SysDictDataPageReqVO.java => admin/dict/vo/data/DictDataPageReqVO.java} (81%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/data/SysDictDataRespVO.java => admin/dict/vo/data/DictDataRespVO.java} (75%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/data/SysDictDataSimpleRespVO.java => admin/dict/vo/data/DictDataSimpleRespVO.java} (72%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/data/SysDictDataUpdateReqVO.java => admin/dict/vo/data/DictDataUpdateReqVO.java} (68%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/type/SysDictTypeBaseVO.java => admin/dict/vo/type/DictTypeBaseVO.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/type/SysDictTypeCreateReqVO.java => admin/dict/vo/type/DictTypeCreateReqVO.java} (73%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/type/SysDictTypeExcelVO.java => admin/dict/vo/type/DictTypeExcelVO.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/type/SysDictTypeExportReqVO.java => admin/dict/vo/type/DictTypeExportReqVO.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/type/SysDictTypePageReqVO.java => admin/dict/vo/type/DictTypePageReqVO.java} (87%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/type/SysDictTypeRespVO.java => admin/dict/vo/type/DictTypeRespVO.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/type/SysDictTypeSimpleRespVO.java => admin/dict/vo/type/DictTypeSimpleRespVO.java} (76%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{dict/vo/type/SysDictTypeUpdateReqVO.java => admin/dict/vo/type/DictTypeUpdateReqVO.java} (68%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{errorcode/SysErrorCodeController.http => admin/errorcode/ErrorCodeController.http} (64%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{errorcode/SysErrorCodeController.java => admin/errorcode/ErrorCodeController.java} (64%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{errorcode/vo/SysErrorCodeBaseVO.java => admin/errorcode/vo/ErrorCodeBaseVO.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/template/SysSmsTemplateCreateReqVO.java => admin/errorcode/vo/ErrorCodeCreateReqVO.java} (51%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{errorcode/vo/SysErrorCodeExcelVO.java => admin/errorcode/vo/ErrorCodeExcelVO.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{errorcode/vo/SysErrorCodeExportReqVO.java => admin/errorcode/vo/ErrorCodeExportReqVO.java} (81%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{errorcode/vo/SysErrorCodePageReqVO.java => admin/errorcode/vo/ErrorCodePageReqVO.java} (87%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{errorcode/vo/SysErrorCodeRespVO.java => admin/errorcode/vo/ErrorCodeRespVO.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{errorcode/vo/SysErrorCodeUpdateReqVO.java => admin/errorcode/vo/ErrorCodeUpdateReqVO.java} (70%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/SysLoginLogController.java => admin/logger/LoginLogController.java} (62%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/SysOperateLogController.http => admin/logger/OperateLogController.http} (81%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/SysOperateLogController.java => admin/logger/OperateLogController.java} (63%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/loginlog/SysLoginLogBaseVO.java => admin/logger/vo/loginlog/LoginLogBaseVO.java} (93%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/loginlog/SysLoginLogExcelVO.java => admin/logger/vo/loginlog/LoginLogExcelVO.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/loginlog/SysLoginLogExportReqVO.java => admin/logger/vo/loginlog/LoginLogExportReqVO.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/loginlog/SysLoginLogPageReqVO.java => admin/logger/vo/loginlog/LoginLogPageReqVO.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/loginlog/SysLoginLogRespVO.java => admin/logger/vo/loginlog/LoginLogRespVO.java} (82%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/operatelog/SysOperateLogBaseVO.java => admin/logger/vo/operatelog/OperateLogBaseVO.java} (96%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/operatelog/SysOperateLogExcelVO.java => admin/logger/vo/operatelog/OperateLogExcelVO.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/operatelog/SysOperateLogExportReqVO.java => admin/logger/vo/operatelog/OperateLogExportReqVO.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/operatelog/SysOperateLogPageReqVO.java => admin/logger/vo/operatelog/OperateLogPageReqVO.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{logger/vo/operatelog/SysOperateLogRespVO.java => admin/logger/vo/operatelog/OperateLogRespVO.java} (71%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{notice/SysNoticeController.java => admin/notice/NoticeController.java} (63%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{notice/vo/SysNoticeBaseVO.java => admin/notice/vo/NoticeBaseVO.java} (91%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeCreateReqVO.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{notice/vo/SysNoticePageReqVO.java => admin/notice/vo/NoticePageReqVO.java} (74%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{notice/vo/SysNoticeRespVO.java => admin/notice/vo/NoticeRespVO.java} (71%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{notice/vo/SysNoticeUpdateReqVO.java => admin/notice/vo/NoticeUpdateReqVO.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/SysMenuController.http => admin/permission/MenuController.http} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/SysMenuController.java => admin/permission/MenuController.java} (63%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/SysPermissionController.java => admin/permission/PermissionController.java} (73%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/SysRoleController.http => admin/permission/RoleController.http} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/SysRoleController.java => admin/permission/RoleController.java} (76%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/menu/SysMenuBaseVO.java => admin/permission/vo/menu/MenuBaseVO.java} (95%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/menu/SysMenuListReqVO.java => admin/permission/vo/menu/MenuListReqVO.java} (70%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/menu/SysMenuRespVO.java => admin/permission/vo/menu/MenuRespVO.java} (79%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/menu/SysMenuSimpleRespVO.java => admin/permission/vo/menu/MenuSimpleRespVO.java} (76%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/menu/SysMenuUpdateReqVO.java => admin/permission/vo/menu/MenuUpdateReqVO.java} (66%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java => admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java} (81%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java => admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java} (73%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/permission/SysPermissionAssignUserRoleReqVO.java => admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java} (73%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/role/SysRoleBaseVO.java => admin/permission/vo/role/RoleBaseVO.java} (92%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/role/SysRoleExcelVO.java => admin/permission/vo/role/RoleExcelVO.java} (88%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/role/SysRoleExportReqVO.java => admin/permission/vo/role/RoleExportReqVO.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/role/SysRolePageReqVO.java => admin/permission/vo/role/RolePageReqVO.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/role/SysRoleRespVO.java => admin/permission/vo/role/RoleRespVO.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/role/SysRoleSimpleRespVO.java => admin/permission/vo/role/RoleSimpleRespVO.java} (72%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/role/SysRoleUpdateReqVO.java => admin/permission/vo/role/RoleUpdateReqVO.java} (68%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{permission/vo/role/SysRoleUpdateStatusReqVO.java => admin/permission/vo/role/RoleUpdateStatusReqVO.java} (56%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{ => admin}/sms/SmsCallbackController.java (95%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/SysSmsChannelController.java => admin/sms/SmsChannelController.java} (72%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/SysSmsLogController.java => admin/sms/SmsLogController.java} (66%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/SysSmsTemplateController.http => admin/sms/SmsTemplateController.http} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/SysSmsTemplateController.java => admin/sms/SmsTemplateController.java} (74%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/channel/SysSmsChannelBaseVO.java => admin/sms/vo/channel/SmsChannelBaseVO.java} (92%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/channel/SysSmsChannelCreateReqVO.java => admin/sms/vo/channel/SmsChannelCreateReqVO.java} (71%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/channel/SysSmsChannelPageReqVO.java => admin/sms/vo/channel/SmsChannelPageReqVO.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/channel/SysSmsChannelRespVO.java => admin/sms/vo/channel/SmsChannelRespVO.java} (76%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/channel/SysSmsChannelSimpleRespVO.java => admin/sms/vo/channel/SmsChannelSimpleRespVO.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/channel/SysSmsChannelUpdateReqVO.java => admin/sms/vo/channel/SmsChannelUpdateReqVO.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/log/SysSmsLogExcelVO.java => admin/sms/vo/log/SmsLogExcelVO.java} (96%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/log/SysSmsLogExportReqVO.java => admin/sms/vo/log/SmsLogExportReqVO.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/log/SysSmsLogPageReqVO.java => admin/sms/vo/log/SmsLogPageReqVO.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{ => admin}/sms/vo/log/SysSmsLogRespVO.java (96%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/template/SysSmsTemplateBaseVO.java => admin/sms/vo/template/SmsTemplateBaseVO.java} (94%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/template/SysSmsTemplateExcelVO.java => admin/sms/vo/template/SmsTemplateExcelVO.java} (92%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/template/SysSmsTemplateExportReqVO.java => admin/sms/vo/template/SmsTemplateExportReqVO.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/template/SysSmsTemplatePageReqVO.java => admin/sms/vo/template/SmsTemplatePageReqVO.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/template/SysSmsTemplateRespVO.java => admin/sms/vo/template/SmsTemplateRespVO.java} (79%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/template/SysSmsTemplateSendReqVO.java => admin/sms/vo/template/SmsTemplateSendReqVO.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{sms/vo/template/SysSmsTemplateUpdateReqVO.java => admin/sms/vo/template/SmsTemplateUpdateReqVO.java} (68%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{tenant/SysTenantController.java => admin/tenant/TenantController.java} (74%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{tenant/vo/SysTenantBaseVO.java => admin/tenant/vo/TenantBaseVO.java} (90%) create mode 100755 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantCreateReqVO.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{tenant/vo/SysTenantExcelVO.java => admin/tenant/vo/TenantExcelVO.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{tenant/vo/SysTenantExportReqVO.java => admin/tenant/vo/TenantExportReqVO.java} (82%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{tenant/vo/SysTenantPageReqVO.java => admin/tenant/vo/TenantPageReqVO.java} (87%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{tenant/vo/SysTenantRespVO.java => admin/tenant/vo/TenantRespVO.java} (67%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{tenant/vo/SysTenantUpdateReqVO.java => admin/tenant/vo/TenantUpdateReqVO.java} (64%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/SysUserController.http => admin/user/UserController.http} (63%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/SysUserController.java => admin/user/UserController.java} (76%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/SysUserProfileController.http => admin/user/UserProfileController.http} (61%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/SysUserProfileController.java => admin/user/UserProfileController.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/profile/SysUserProfileRespVO.java => admin/user/vo/profile/UserProfileRespVO.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/profile/SysUserProfileUpdatePasswordReqVO.java => admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/profile/SysUserProfileUpdateReqVO.java => admin/user/vo/profile/UserProfileUpdateReqVO.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserBaseVO.java => admin/user/vo/user/UserBaseVO.java} (94%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserCreateReqVO.java => admin/user/vo/user/UserCreateReqVO.java} (74%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserExcelVO.java => admin/user/vo/user/UserExcelVO.java} (92%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserExportReqVO.java => admin/user/vo/user/UserExportReqVO.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserImportExcelVO.java => admin/user/vo/user/UserImportExcelVO.java} (92%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserImportRespVO.java => admin/user/vo/user/UserImportRespVO.java} (80%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserPageItemRespVO.java => admin/user/vo/user/UserPageItemRespVO.java} (71%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserPageReqVO.java => admin/user/vo/user/UserPageReqVO.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserRespVO.java => admin/user/vo/user/UserRespVO.java} (83%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserSimpleRespVO.java => admin/user/vo/user/UserSimpleRespVO.java} (82%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserUpdatePasswordReqVO.java => admin/user/vo/user/UserUpdatePasswordReqVO.java} (79%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserUpdateReqVO.java => admin/user/vo/user/UserUpdateReqVO.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/{user/vo/user/SysUserUpdateStatusReqVO.java => admin/user/vo/user/UserUpdateStatusReqVO.java} (78%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/app/package-info.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostCreateReqVO.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataCreateReqVO.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeCreateReqVO.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/package-info.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuCreateReqVO.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleCreateReqVO.java delete mode 100755 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantCreateReqVO.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/{SysAuthConvert.java => AuthConvert.java} (66%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysUserSessionConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/CaptchaConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/SysCaptchaConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysDeptConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysPostConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictTypeConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictTypeConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/ErrorCodeConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/SysErrorCodeConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/{SysOperateLogConvert.java => OperateLogConvert.java} (54%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/SysNoticeConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/MenuConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysMenuConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysRoleConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/{SysSmsLogConvert.java => SmsLogConvert.java} (62%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsChannelConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsTemplateConvert.java delete mode 100755 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/SysTenantConvert.java create mode 100755 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/SysUserConvert.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/{SysDictTypeDO.java => DictTypeDO.java} (92%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/{SysErrorCodeDO.java => ErrorCodeDO.java} (81%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/{SysOperateLogDO.java => OperateLogDO.java} (96%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/{SysNoticeDO.java => NoticeDO.java} (82%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/{SysMenuDO.java => MenuDO.java} (96%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/{SysRoleMenuDO.java => RoleMenuDO.java} (88%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/{SysLoginLogMapper.java => LoginLogMapper.java} (65%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/{SysOperateLogMapper.java => OperateLogMapper.java} (70%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/{SysCaptchaRedisDAO.java => CaptchaRedisDAO.java} (96%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/{SysErrorCodeConstants.java => ErrorCodeConstants.java} (99%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/{SysErrorCodeTypeEnum.java => ErrorCodeTypeEnum.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/{SysLoginLogTypeEnum.java => LoginLogTypeEnum.java} (94%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/{SysLoginResultEnum.java => LoginResultEnum.java} (94%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/{SysNoticeTypeEnum.java => NoticeTypeEnum.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/{SysRoleTypeEnum.java => RoleTypeEnum.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/{SysDataPermissionConfiguration.java => DataPermissionConfiguration.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/{SysUserSessionTimeoutJob.java => UserSessionTimeoutJob.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/{SysDeptRefreshConsumer.java => DeptRefreshConsumer.java} (53%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/{SysDictDataRefreshConsumer.java => DictDataRefreshConsumer.java} (66%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/{SysMailSendConsumer.java => MailSendConsumer.java} (56%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/{SysMenuRefreshConsumer.java => MenuRefreshConsumer.java} (52%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/{SysRoleMenuRefreshConsumer.java => RoleMenuRefreshConsumer.java} (51%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/{SysRoleRefreshConsumer.java => RoleRefreshConsumer.java} (52%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/{SysSmsChannelRefreshConsumer.java => SmsChannelRefreshConsumer.java} (50%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/{SysSmsSendConsumer.java => SmsSendConsumer.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/{SysSmsTemplateRefreshConsumer.java => SmsTemplateRefreshConsumer.java} (65%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/{SysDeptRefreshMessage.java => DeptRefreshMessage.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/{SysDictDataRefreshMessage.java => DictDataRefreshMessage.java} (83%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/{SysMailSendMessage.java => MailSendMessage.java} (93%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/{SysMenuRefreshMessage.java => MenuRefreshMessage.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/{SysRoleMenuRefreshMessage.java => RoleMenuRefreshMessage.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/{SysRoleRefreshMessage.java => RoleRefreshMessage.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/{SysSmsChannelRefreshMessage.java => SmsChannelRefreshMessage.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/{SysSmsTemplateRefreshMessage.java => SmsTemplateRefreshMessage.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/{SysDeptProducer.java => DeptProducer.java} (65%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/{SysDictDataProducer.java => DictDataProducer.java} (64%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/{SysMenuProducer.java => MenuProducer.java} (64%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/{SysPermissionProducer.java => PermissionProducer.java} (63%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/{SysRoleProducer.java => RoleProducer.java} (66%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/{SysSmsProducer.java => SmsProducer.java} (56%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/{SysAuthService.java => AuthService.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/{SysAuthServiceImpl.java => AuthServiceImpl.java} (80%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/{SysUserSessionService.java => UserSessionService.java} (72%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/{SysUserSessionServiceImpl.java => UserSessionServiceImpl.java} (83%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/{SysCaptchaService.java => CaptchaService.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/{SysCaptchaServiceImpl.java => CaptchaServiceImpl.java} (68%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/{SysDeptService.java => DeptService.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/{SysDeptServiceImpl.java => DeptServiceImpl.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/{SysPostService.java => PostService.java} (76%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/{SysPostServiceImpl.java => PostServiceImpl.java} (77%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/{SysDictDataService.java => DictDataService.java} (67%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/{SysDictDataServiceImpl.java => DictDataServiceImpl.java} (77%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/{SysDictTypeService.java => DictTypeService.java} (57%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/{SysDictTypeServiceImpl.java => DictTypeServiceImpl.java} (66%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/{SysErrorCodeService.java => ErrorCodeService.java} (54%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/{SysErrorCodeServiceImpl.java => ErrorCodeServiceImpl.java} (66%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/{SysLoginLogService.java => LoginLogService.java} (58%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/{SysOperateLogService.java => OperateLogService.java} (51%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/{SysOperateLogServiceImpl.java => OperateLogServiceImpl.java} (71%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImpl.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/{SysNoticeService.java => NoticeService.java} (59%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/{SysNoticeServiceImpl.java => NoticeServiceImpl.java} (56%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/{SysMenuService.java => MenuService.java} (64%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/{SysMenuServiceImpl.java => MenuServiceImpl.java} (80%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/{SysPermissionService.java => PermissionService.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/{SysPermissionServiceImpl.java => PermissionServiceImpl.java} (93%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/{SysRoleService.java => RoleService.java} (81%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/{SysRoleServiceImpl.java => RoleServiceImpl.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsChannelService.java => SmsChannelService.java} (71%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsChannelServiceImpl.java => SmsChannelServiceImpl.java} (77%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsLogService.java => SmsLogService.java} (62%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsLogServiceImpl.java => SmsLogServiceImpl.java} (60%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsTemplateService.java => SmsTemplateService.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsTemplateServiceImpl.java => SmsTemplateServiceImpl.java} (80%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/{SysTenantService.java => TenantService.java} (67%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/{SysTenantServiceImpl.java => TenantServiceImpl.java} (63%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/{SysUserService.java => UserService.java} (78%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/{SysUserServiceImpl.java => UserServiceImpl.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/{SysAuthServiceImplTest.java => AuthServiceImplTest.java} (79%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/{SysUserSessionServiceImplTest.java => UserSessionServiceImplTest.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/{SysCaptchaServiceTest.java => CaptchaServiceTest.java} (77%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/{SysDeptServiceTest.java => DeptServiceTest.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/{SysPostServiceTest.java => PostServiceTest.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/{SysDictDataServiceTest.java => DictDataServiceTest.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/{SysDictTypeServiceTest.java => DictTypeServiceTest.java} (80%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/{SysErrorCodeServiceTest.java => ErrorCodeServiceTest.java} (69%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/{SysLoginLogServiceImplTest.java => LoginLogServiceImplTest.java} (77%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/{SysOperateLogServiceImplTest.java => OperateLogServiceImplTest.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/{SysNoticeServiceImplTest.java => NoticeServiceImplTest.java} (63%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/{SysMenuServiceTest.java => MenuServiceTest.java} (70%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/{SysPermissionServiceTest.java => PermissionServiceTest.java} (83%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/{SysRoleServiceTest.java => RoleServiceTest.java} (72%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsChannelServiceTest.java => SmsChannelServiceTest.java} (86%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsLogServiceTest.java => SmsLogServiceTest.java} (94%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsTemplateServiceTest.java => SmsTemplateServiceTest.java} (92%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/{SysTenantServiceTest.java => TenantServiceTest.java} (85%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/{SysUserServiceImplTest.java => UserServiceImplTest.java} (91%) diff --git a/http-client.env.json b/http-client.env.json index 10c1fdd4f8..a73a267eff 100644 --- a/http-client.env.json +++ b/http-client.env.json @@ -1,10 +1,11 @@ { "local": { - "baseUrl": "http://127.0.0.1:48080/api", + "baseUrl": "http://127.0.0.1:48080/admin-api", "token": "test1", + "adminTenentId": "1", "userApi": "http://127.0.0.1:48080/app-api", - "userToken": "test1", - "userTenentId": "1" + "appToken": "test1", + "appTenentId": "1" } } diff --git a/yudao-admin-server/src/main/resources/application.yaml b/yudao-admin-server/src/main/resources/application.yaml index 15af12d60b..97eb6ac492 100644 --- a/yudao-admin-server/src/main/resources/application.yaml +++ b/yudao-admin-server/src/main/resources/application.yaml @@ -54,11 +54,11 @@ yudao: base-package: cn.iocoder.yudao.coreservice web: admin-api: - prefix: /api - controller: ${yudao.info.base-package} + prefix: /admin-api + controller: cn.iocoder.yudao.module.system.controller.admin # TODO 芋艿:需要改造 app-api: prefix: /app-api - controller: cn.iocoder.yudao.module.member.controller.app + controller: cn.iocoder.yudao.module.member.controller.app # TODO 芋艿:需要改造 swagger: title: 管理后台 diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java index 312f51e046..ba19b8bd2e 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java @@ -123,12 +123,13 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap .accessDeniedHandler(accessDeniedHandler).and() // 登出地址的配置 .logout().logoutSuccessHandler(logoutSuccessHandler).logoutRequestMatcher(request -> // 匹配多种用户类型的登出 - StrUtil.equalsAny(request.getRequestURI(), buildAdminApi("/logout"), buildAppApi("/member/logout"))); + StrUtil.equalsAny(request.getRequestURI(), buildAdminApi("/system/logout"), + buildAppApi("/member/logout"))); // 设置每个请求的权限 ①:全局共享规则 httpSecurity.authorizeRequests() // 登录的接口,可匿名访问 - .antMatchers(buildAdminApi("/login")).anonymous() + .antMatchers(buildAdminApi("/system/login"), buildAdminApi("/member/login")).anonymous() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // 文件的获取接口,可匿名访问 diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http index 81f250bd31..d609e8f0c2 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http @@ -1,7 +1,7 @@ ### 请求 /login 接口 => 成功 -POST {{userApi}}/member/login +POST {{appApi}}/member/login Content-Type: application/json -tenant-id: {{userTenentId}} +tenant-id: {{appTenentId}} { "mobile": "15601691300", @@ -9,9 +9,9 @@ tenant-id: {{userTenentId}} } ### 请求 /send-sms-code 接口 => 成功 -POST {{userApi}}/member/send-sms-code +POST {{appApi}}/member/send-sms-code Content-Type: application/json -tenant-id: {{userTenentId}} +tenant-id: {{appTenentId}} { "mobile": "15601691399", @@ -19,9 +19,9 @@ tenant-id: {{userTenentId}} } ### 请求 /sms-login 接口 => 成功 -POST {{userApi}}/member/sms-login +POST {{appApi}}/member/sms-login Content-Type: application/json -tenant-id: {{userTenentId}} +tenant-id: {{appTenentId}} { "mobile": "15601691301", @@ -29,7 +29,7 @@ tenant-id: {{userTenentId}} } ### 请求 /logout 接口 => 成功 -POST {{userApi}}/member/logout +POST {{appApi}}/member/logout Content-Type: application/json Authorization: Bearer c1b76bdaf2c146c581caa4d7fd81ee66 -tenant-id: {{userTenentId}} +tenant-id: {{appTenentId}} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java index a7c541e1fa..fd698e2022 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java @@ -14,6 +14,7 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -26,14 +27,15 @@ import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getCli import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -@Api(tags = "APP 端 - 认证") +@Api(tags = "用户 APP - 认证") @RestController @RequestMapping("/member/") @Validated @Slf4j public class AppAuthController { - @Resource + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // AuthService 存在重名 private AuthService authService; @Resource @@ -41,9 +43,6 @@ public class AppAuthController { @Resource private SysSocialCoreService socialService; - @Resource - private LogoutSuccessHandler logoutSuccessHandler; - @PostMapping("/login") @ApiOperation("使用手机 + 密码登录") @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java index 6d33b18edd..95fca74afa 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java @@ -16,7 +16,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; // TODO 芋艿:code review 相关逻辑 -@ApiModel("APP 端 - 校验验证码 Request VO") +@ApiModel("用户 APP - 校验验证码 Request VO") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java index 25875fd66e..1055e979b4 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java @@ -11,7 +11,7 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; -@ApiModel("APP 端 - 手机 + 密码登录 Request VO") +@ApiModel("用户 APP - 手机 + 密码登录 Request VO") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java index 935b3ec52b..07ad43118e 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java @@ -7,7 +7,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("APP 端 - 手机密码登录 Response VO") +@ApiModel("用户 APP - 手机密码登录 Response VO") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java index 9f48ee6248..a6d6ebea4f 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; // TODO 芋艿:code review 相关逻辑 -@ApiModel("APP 端 - 重置密码 Request VO") +@ApiModel("用户 APP - 重置密码 Request VO") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java index 9e53351fea..41aa36936b 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java @@ -10,7 +10,7 @@ import lombok.experimental.Accessors; import javax.validation.constraints.NotNull; -@ApiModel("APP 端 - 发送手机验证码 Response VO") +@ApiModel("用户 APP - 发送手机验证码 Response VO") @Data @Accessors(chain = true) public class AppAuthSendSmsReqVO { diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java index 452e7e825e..063caf80dc 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java @@ -12,7 +12,7 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; -@ApiModel("APP 端 - 手机 + 验证码登录 Request VO") +@ApiModel("用户 APP - 手机 + 验证码登录 Request VO") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java index d595e74283..55e23ac4c7 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java @@ -12,7 +12,7 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("APP 端 - 社交绑定 Request VO,使用 code 授权码") +@ApiModel("用户 APP - 社交绑定 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java index cc832e3716..d6bdaf009f 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -@ApiModel("APP 端 - 社交登录 Request VO,使用 code 授权码 + 账号密码") +@ApiModel("用户 APP - 社交登录 Request VO,使用 code 授权码 + 账号密码") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java index 3d1562522d..b919bf275d 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java @@ -12,7 +12,7 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("APP 端 - 社交登录 Request VO,使用 code 授权码") +@ApiModel("用户 APP - 社交登录 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java index 9225080f76..ac4308e6a5 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java @@ -12,7 +12,7 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("APP 端 - 取消社交绑定 Request VO,使用 code 授权码") +@ApiModel("用户 APP - 取消社交绑定 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java index 4bbecbc311..9addb10460 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java @@ -12,7 +12,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; // TODO 芋艿:code review 相关逻辑 -@ApiModel("APP 端 - 修改密码 Request VO") +@ApiModel("用户 APP - 修改密码 Request VO") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/package-info.java deleted file mode 100644 index 7f013eaa96..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.member.controller.app; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java index cf5b5348c1..9f1d25d786 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.member.enums.MemberErrorCodeConstants.FILE_IS_EMPTY; -@Api(tags = "APP 端 - 用户个人中心") +@Api(tags = "用户 APP - 用户个人中心") @RestController @RequestMapping("/member/user") @Validated diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserInfoRespVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserInfoRespVO.java index f8d9d20d1c..32e684c849 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserInfoRespVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserInfoRespVO.java @@ -6,7 +6,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("APP 端 - 用户个人信息 Response VO") +@ApiModel("用户 APP - 用户个人信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java index ded94ef1a9..1ab6e7c843 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java @@ -13,7 +13,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; -@ApiModel("APP 端 - 修改手机 Request VO") +@ApiModel("用户 APP - 修改手机 Request VO") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/package-info.java index ea9687d819..9e2888c69c 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/package-info.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/package-info.java @@ -1,6 +1,6 @@ /** * 提供 RESTful API 给前端: * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 - * 2. app 包:提供给用户 APP yudao-ui-app 前端项目 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 */ package cn.iocoder.yudao.module.member.controller; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java index 6deabba120..dfeb7f040a 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java @@ -51,7 +51,7 @@ import static cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants.*; * * @author 芋道源码 */ -@Service +@Service("memberAuthService") @Slf4j public class AuthServiceImpl implements AuthService { diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java index a899b79e66..fd0dd05827 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java @@ -32,7 +32,7 @@ import static cn.iocoder.yudao.module.member.enums.MemberErrorCodeConstants.USER * * @author 芋道源码 */ -@Service +@Service("memberUserService") @Valid @Slf4j public class UserServiceImpl implements UserService { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.http similarity index 61% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.http index f8e32a5b8d..25124ca336 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.http @@ -1,7 +1,7 @@ ### 请求 /login 接口 => 成功 -POST {{baseUrl}}/login +POST {{baseUrl}}/system/login Content-Type: application/json -tenant-id: 1 +tenant-id: {{adminTenentId}} { "username": "admin", @@ -11,16 +11,12 @@ tenant-id: 1 } ### 请求 /get-permission-info 接口 => 成功 -GET {{baseUrl}}/get-permission-info +GET {{baseUrl}}/system/get-permission-info Authorization: Bearer {{token}} -tenant-id: 1 +tenant-id: {{adminTenentId}} ### 请求 /list-menus 接口 => 成功 -GET {{baseUrl}}/list-menus +GET {{baseUrl}}/system/list-menus Authorization: Bearer {{token}} #Authorization: Bearer a6aa7714a2e44c95aaa8a2c5adc2a67a -tenant-id: 1 - -### 请求 /druid/xxx 接口 => 失败 TODO 临时测试 -GET http://127.0.0.1:8080/druid/123 -Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java similarity index 73% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 52ca73cf70..6829c6ce95 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysAuthController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.module.system.controller.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.*; -import cn.iocoder.yudao.module.system.convert.auth.SysAuthConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*; +import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; -import cn.iocoder.yudao.module.system.service.auth.SysAuthService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.module.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.service.auth.AuthService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; +import cn.iocoder.yudao.module.system.service.permission.RoleService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -34,36 +35,37 @@ import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUse import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserRoleIds; -@Api(tags = "认证") +@Api(tags = "管理后台 - 认证") @RestController -@RequestMapping("/") +@RequestMapping("/system") // 暂时不跟 /auth 结尾 @Validated @Slf4j -public class SysAuthController { +public class AuthController { - @Resource - private SysAuthService authService; + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // AuthService 存在重名 + private AuthService authService; @Resource private SysUserCoreService userCoreService; @Resource - private SysRoleService roleService; + private RoleService roleService; @Resource - private SysPermissionService permissionService; + private PermissionService permissionService; @Resource private SysSocialCoreService socialCoreService; @PostMapping("/login") @ApiOperation("使用账号密码登录") @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 - public CommonResult login(@RequestBody @Valid SysAuthLoginReqVO reqVO) { + public CommonResult login(@RequestBody @Valid AuthLoginReqVO reqVO) { String token = authService.login(reqVO, getClientIP(), getUserAgent()); // 返回结果 - return success(SysAuthLoginRespVO.builder().token(token).build()); + return success(AuthLoginRespVO.builder().token(token).build()); } @GetMapping("/get-permission-info") @ApiOperation("获取登录用户的权限信息") - public CommonResult getPermissionInfo() { + public CommonResult getPermissionInfo() { // 获得用户信息 SysUserDO user = userCoreService.getUser(getLoginUserId()); if (user == null) { @@ -72,24 +74,24 @@ public class SysAuthController { // 获得角色列表 List roleList = roleService.getRolesFromCache(getLoginUserRoleIds()); // 获得菜单列表 - List menuList = permissionService.getRoleMenusFromCache( + List menuList = permissionService.getRoleMenusFromCache( getLoginUserRoleIds(), // 注意,基于登录的角色,因为后续的权限判断也是基于它 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()), SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 拼接结果返回 - return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList)); + return success(AuthConvert.INSTANCE.convert(user, roleList, menuList)); } @GetMapping("list-menus") @ApiOperation("获得登录用户的菜单列表") - public CommonResult> getMenus() { + public CommonResult> getMenus() { // 获得用户拥有的菜单列表 - List menuList = permissionService.getRoleMenusFromCache( + List menuList = permissionService.getRoleMenusFromCache( getLoginUserRoleIds(), // 注意,基于登录的角色,因为后续的权限判断也是基于它 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型 SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 // 转换成 Tree 结构返回 - return success(SysAuthConvert.INSTANCE.buildMenuTree(menuList)); + return success(AuthConvert.INSTANCE.buildMenuTree(menuList)); } // ========== 社交登录相关 ========== @@ -108,31 +110,31 @@ public class SysAuthController { @PostMapping("/social-login") @ApiOperation("社交登录,使用 code 授权码") @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 - public CommonResult socialLogin(@RequestBody @Valid SysAuthSocialLoginReqVO reqVO) { + public CommonResult socialLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) { String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent()); // 返回结果 - return success(SysAuthLoginRespVO.builder().token(token).build()); + return success(AuthLoginRespVO.builder().token(token).build()); } @PostMapping("/social-login2") @ApiOperation("社交登录,使用 code 授权码 + 账号密码") @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 - public CommonResult socialLogin2(@RequestBody @Valid SysAuthSocialLogin2ReqVO reqVO) { + public CommonResult socialLogin2(@RequestBody @Valid AuthSocialLogin2ReqVO reqVO) { String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent()); // 返回结果 - return success(SysAuthLoginRespVO.builder().token(token).build()); + return success(AuthLoginRespVO.builder().token(token).build()); } @PostMapping("/social-bind") @ApiOperation("社交绑定,使用 code 授权码") - public CommonResult socialBind(@RequestBody @Valid SysAuthSocialBindReqVO reqVO) { + public CommonResult socialBind(@RequestBody @Valid AuthSocialBindReqVO reqVO) { authService.socialBind(getLoginUserId(), reqVO); return CommonResult.success(true); } @DeleteMapping("/social-unbind") @ApiOperation("取消社交绑定") - public CommonResult socialUnbind(@RequestBody SysAuthSocialUnbindReqVO reqVO) { + public CommonResult socialUnbind(@RequestBody AuthSocialUnbindReqVO reqVO) { socialCoreService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.ADMIN); return CommonResult.success(true); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysUserSessionController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysUserSessionController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java index f5a68686c6..415e5b285e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/SysUserSessionController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.module.system.controller.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth; -import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; -import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.yudao.module.system.convert.auth.SysUserSessionConvert; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageItemRespVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; +import cn.iocoder.yudao.module.system.convert.auth.UserSessionConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.service.auth.SysUserSessionService; +import cn.iocoder.yudao.module.system.service.auth.UserSessionService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; @@ -28,13 +28,13 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -@Api(tags = "用户 Session") +@Api(tags = "管理后台 - 用户 Session") @RestController @RequestMapping("/system/user-session") -public class SysUserSessionController { +public class UserSessionController { @Resource - private SysUserSessionService userSessionService; + private UserSessionService userSessionService; @Resource private SysUserSessionCoreService userSessionCoreService; @Resource @@ -46,7 +46,7 @@ public class SysUserSessionController { @GetMapping("/page") @ApiOperation("获得 Session 分页列表") @PreAuthorize("@ss.hasPermission('system:user-session:page')") - public CommonResult> getUserSessionPage(@Validated SysUserSessionPageReqVO reqVO) { + public CommonResult> getUserSessionPage(@Validated UserSessionPageReqVO reqVO) { // 获得 Session 分页 PageResult pageResult = userSessionService.getUserSessionPage(reqVO); @@ -56,9 +56,9 @@ public class SysUserSessionController { Map deptMap = deptCoreService.getDeptMap( convertList(userMap.values(), SysUserDO::getDeptId)); // 拼接结果返回 - List sessionList = new ArrayList<>(pageResult.getList().size()); + List sessionList = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(session -> { - SysUserSessionPageItemRespVO respVO = SysUserSessionConvert.INSTANCE.convert(session); + UserSessionPageItemRespVO respVO = UserSessionConvert.INSTANCE.convert(session); sessionList.add(respVO); // 设置用户账号 MapUtils.findAndThen(userMap, session.getUserId(), user -> { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthLoginReqVO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthLoginReqVO.java index 2eac3fb4a8..8e9eb4ed20 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthLoginReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -11,12 +11,12 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; -@ApiModel("账号密码登录 Request VO") +@ApiModel("管理后台 - 账号密码登录 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthLoginReqVO { +public class AuthLoginReqVO { @ApiModelProperty(value = "账号", required = true, example = "yudaoyuanma") @NotEmpty(message = "登录账号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthLoginRespVO.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthLoginRespVO.java index 7e1bea57ea..bd13ba3770 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthLoginRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthLoginRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,12 +7,12 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("账号密码登录 Response VO") +@ApiModel("管理后台 - 账号密码登录 Response VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthLoginRespVO { +public class AuthLoginRespVO { @ApiModelProperty(value = "token", required = true, example = "yudaoyuanma") private String token; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthMenuRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthMenuRespVO.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthMenuRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthMenuRespVO.java index 762644e20b..1c46ec291b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthMenuRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthMenuRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,12 +9,12 @@ import lombok.NoArgsConstructor; import java.util.List; -@ApiModel("登录用户的菜单信息 Response VO") +@ApiModel("管理后台 - 登录用户的菜单信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthMenuRespVO { +public class AuthMenuRespVO { @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") private Long id; @@ -37,6 +37,6 @@ public class SysAuthMenuRespVO { /** * 子路由 */ - private List children; + private List children; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthPermissionInfoRespVO.java similarity index 81% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthPermissionInfoRespVO.java index e50bb84ccc..bada252057 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthPermissionInfoRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,12 +9,12 @@ import lombok.NoArgsConstructor; import java.util.Set; -@ApiModel(value = "登录用户的权限信息 Response VO", description = "额外包括用户信息和角色列表") +@ApiModel(value = "管理后台 - 登录用户的权限信息 Response VO", description = "额外包括用户信息和角色列表") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthPermissionInfoRespVO { +public class AuthPermissionInfoRespVO { @ApiModelProperty(value = "用户信息", required = true) private UserVO user; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java index d1a48ee779..3bb408c0b4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; @@ -12,12 +12,12 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("社交绑定 Request VO,使用 code 授权码") +@ApiModel("管理后台 - 社交绑定 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthSocialBindReqVO { +public class AuthSocialBindReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") @InEnum(SysSocialTypeEnum.class) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java index 25e0d65514..74955a6c59 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; @@ -14,12 +14,12 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -@ApiModel("社交登录 Request VO,使用 code 授权码 + 账号密码") +@ApiModel("管理后台 - 社交登录 Request VO,使用 code 授权码 + 账号密码") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthSocialLogin2ReqVO { +public class AuthSocialLogin2ReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") @InEnum(SysSocialTypeEnum.class) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java index 930fea227c..4f7b8d76d6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; @@ -12,12 +12,12 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("社交登录 Request VO,使用 code 授权码") +@ApiModel("管理后台 - 社交登录 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthSocialLoginReqVO { +public class AuthSocialLoginReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") @InEnum(SysSocialTypeEnum.class) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java similarity index 83% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java index 7bf6c8ef91..b16f1ef772 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.auth; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; @@ -12,12 +12,12 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("取消社交绑定 Request VO,使用 code 授权码") +@ApiModel("管理后台 - 取消社交绑定 Request VO,使用 code 授权码") @Data @NoArgsConstructor @AllArgsConstructor @Builder -public class SysAuthSocialUnbindReqVO { +public class AuthSocialUnbindReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") @InEnum(SysSocialTypeEnum.class) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/session/UserSessionPageItemRespVO.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/session/UserSessionPageItemRespVO.java index debdf59989..ad12877efc 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/session/UserSessionPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.session; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.session; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -10,12 +10,12 @@ import lombok.NoArgsConstructor; import java.util.Date; -@ApiModel(value = "用户在线 Session Response VO", description = "相比用户基本信息来说,会多部门、用户账号等信息") +@ApiModel(value = "管理后台 - 用户在线 Session Response VO", description = "相比用户基本信息来说,会多部门、用户账号等信息") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class SysUserSessionPageItemRespVO extends PageParam { +public class UserSessionPageItemRespVO extends PageParam { @ApiModelProperty(value = "Session 编号", required = true, example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") private String id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/session/UserSessionPageReqVO.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/session/UserSessionPageReqVO.java index c834f5d8c8..7e85c87baf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/auth/vo/session/SysUserSessionPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/session/UserSessionPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.auth.vo.session; +package cn.iocoder.yudao.module.system.controller.admin.auth.vo.session; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -6,10 +6,10 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -@ApiModel("在线用户 Session 分页 Request VO") +@ApiModel("管理后台 - 在线用户 Session 分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysUserSessionPageReqVO extends PageParam { +public class UserSessionPageReqVO extends PageParam { @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模糊匹配") private String userIp; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.http similarity index 100% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.http diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.java similarity index 61% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.java index 317895005a..5fc0b0a6bb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/SysCaptchaController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.module.system.controller.common; +package cn.iocoder.yudao.module.system.controller.admin.common; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.yudao.module.system.service.common.SysCaptchaService; +import cn.iocoder.yudao.module.system.controller.admin.common.vo.CaptchaImageRespVO; +import cn.iocoder.yudao.module.system.service.common.CaptchaService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; @@ -13,17 +13,17 @@ import javax.annotation.Resource; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "验证码") +@Api(tags = "管理后台 - 验证码") @RestController @RequestMapping("/system/captcha") -public class SysCaptchaController { +public class CaptchaController { @Resource - private SysCaptchaService captchaService; + private CaptchaService captchaService; @GetMapping("/get-image") @ApiOperation("生成图片验证码") - public CommonResult getCaptchaImage() { + public CommonResult getCaptchaImage() { return success(captchaService.getCaptchaImage()); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/vo/SysCaptchaImageRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/vo/CaptchaImageRespVO.java similarity index 64% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/vo/SysCaptchaImageRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/vo/CaptchaImageRespVO.java index 5c55b16ffd..cef5d0845d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/common/vo/SysCaptchaImageRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/vo/CaptchaImageRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.common.vo; +package cn.iocoder.yudao.module.system.controller.admin.common.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,14 +7,15 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("验证码图片 Response VO") +@ApiModel("管理后台 - 验证码图片 Response VO") @Data @Builder @NoArgsConstructor @AllArgsConstructor -public class SysCaptchaImageRespVO { +public class CaptchaImageRespVO { - @ApiModelProperty(value = "uuid", required = true, example = "1b3b7d00-83a8-4638-9e37-d67011855968", notes = "通过该 uuid 作为该验证码的标识") + @ApiModelProperty(value = "uuid", required = true, example = "1b3b7d00-83a8-4638-9e37-d67011855968", + notes = "通过该 uuid 作为该验证码的标识") private String uuid; @ApiModelProperty(value = "图片", required = true, notes = "验证码的图片内容,使用 Base64 编码") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysDeptController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java similarity index 73% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysDeptController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java index 70c365560c..2459736a5c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysDeptController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.module.system.controller.dept; +package cn.iocoder.yudao.module.system.controller.admin.dept; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.*; -import cn.iocoder.yudao.module.system.convert.dept.SysDeptConvert; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.*; +import cn.iocoder.yudao.module.system.convert.dept.DeptConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.service.dept.DeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -21,14 +21,14 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "部门") +@Api(tags = "管理后台 - 部门") @RestController @RequestMapping("/system/dept") @Validated -public class SysDeptController { +public class DeptController { @Resource - private SysDeptService deptService; + private DeptService deptService; @Resource private SysDeptCoreService deptCoreService; @@ -36,7 +36,7 @@ public class SysDeptController { @PostMapping("create") @ApiOperation("创建部门") @PreAuthorize("@ss.hasPermission('system:dept:create')") - public CommonResult createDept(@Valid @RequestBody SysDeptCreateReqVO reqVO) { + public CommonResult createDept(@Valid @RequestBody DeptCreateReqVO reqVO) { Long deptId = deptService.createDept(reqVO); return success(deptId); } @@ -44,7 +44,7 @@ public class SysDeptController { @PutMapping("update") @ApiOperation("更新部门") @PreAuthorize("@ss.hasPermission('system:dept:update')") - public CommonResult updateDept(@Valid @RequestBody SysDeptUpdateReqVO reqVO) { + public CommonResult updateDept(@Valid @RequestBody DeptUpdateReqVO reqVO) { deptService.updateDept(reqVO); return success(true); } @@ -61,30 +61,30 @@ public class SysDeptController { @GetMapping("/list") @ApiOperation("获取部门列表") @PreAuthorize("@ss.hasPermission('system:dept:query')") - public CommonResult> listDepts(SysDeptListReqVO reqVO) { + public CommonResult> listDepts(DeptListReqVO reqVO) { List list = deptService.getSimpleDepts(reqVO); list.sort(Comparator.comparing(SysDeptDO::getSort)); - return success(SysDeptConvert.INSTANCE.convertList(list)); + return success(DeptConvert.INSTANCE.convertList(list)); } @GetMapping("/list-all-simple") @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项") - public CommonResult> getSimpleDepts() { + public CommonResult> getSimpleDepts() { // 获得部门列表,只要开启状态的 - SysDeptListReqVO reqVO = new SysDeptListReqVO(); + DeptListReqVO reqVO = new DeptListReqVO(); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); List list = deptService.getSimpleDepts(reqVO); // 排序后,返回给前端 list.sort(Comparator.comparing(SysDeptDO::getSort)); - return success(SysDeptConvert.INSTANCE.convertList02(list)); + return success(DeptConvert.INSTANCE.convertList02(list)); } @GetMapping("/get") @ApiOperation("获得部门信息") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:dept:query')") - public CommonResult getDept(@RequestParam("id") Long id) { - return success(SysDeptConvert.INSTANCE.convert(deptCoreService.getDept(id))); + public CommonResult getDept(@RequestParam("id") Long id) { + return success(DeptConvert.INSTANCE.convert(deptCoreService.getDept(id))); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysPostController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java similarity index 73% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysPostController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java index 762044dadc..9191ce25fe 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/SysPostController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.module.system.controller.dept; +package cn.iocoder.yudao.module.system.controller.admin.dept; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.*; -import cn.iocoder.yudao.module.system.convert.dept.SysPostConvert; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.*; +import cn.iocoder.yudao.module.system.convert.dept.PostConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.service.dept.SysPostService; +import cn.iocoder.yudao.module.system.service.dept.PostService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -27,19 +27,19 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "岗位") +@Api(tags = "管理后台 - 岗位") @RestController @RequestMapping("/system/post") -@Valid -public class SysPostController { +@Validated +public class PostController { @Resource - private SysPostService postService; + private PostService postService; @PostMapping("/create") @ApiOperation("创建岗位") @PreAuthorize("@ss.hasPermission('system:post:create')") - public CommonResult createPost(@Valid @RequestBody SysPostCreateReqVO reqVO) { + public CommonResult createPost(@Valid @RequestBody PostCreateReqVO reqVO) { Long postId = postService.createPost(reqVO); return success(postId); } @@ -47,7 +47,7 @@ public class SysPostController { @PutMapping("/update") @ApiOperation("修改岗位") @PreAuthorize("@ss.hasPermission('system:post:update')") - public CommonResult updatePost(@Valid @RequestBody SysPostUpdateReqVO reqVO) { + public CommonResult updatePost(@Valid @RequestBody PostUpdateReqVO reqVO) { postService.updatePost(reqVO); return success(true); } @@ -64,36 +64,36 @@ public class SysPostController { @ApiOperation("获得岗位信息") @ApiImplicitParam(name = "id", value = "岗位编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:post:query')") - public CommonResult getPost(@RequestParam("id") Long id) { - return success(SysPostConvert.INSTANCE.convert(postService.getPost(id))); + public CommonResult getPost(@RequestParam("id") Long id) { + return success(PostConvert.INSTANCE.convert(postService.getPost(id))); } @GetMapping("/list-all-simple") @ApiOperation(value = "获取岗位精简信息列表", notes = "只包含被开启的岗位,主要用于前端的下拉选项") - public CommonResult> getSimplePosts() { + public CommonResult> getSimplePosts() { // 获得岗位列表,只要开启状态的 List list = postService.getPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); // 排序后,返回给前端 list.sort(Comparator.comparing(SysPostDO::getSort)); - return success(SysPostConvert.INSTANCE.convertList02(list)); + return success(PostConvert.INSTANCE.convertList02(list)); } @GetMapping("/page") @ApiOperation("获得岗位分页列表") @PreAuthorize("@ss.hasPermission('system:post:query')") - public CommonResult> getPostPage(@Validated SysPostPageReqVO reqVO) { - return success(SysPostConvert.INSTANCE.convertPage(postService.getPostPage(reqVO))); + public CommonResult> getPostPage(@Validated PostPageReqVO reqVO) { + return success(PostConvert.INSTANCE.convertPage(postService.getPostPage(reqVO))); } @GetMapping("/export") @ApiOperation("岗位管理") @PreAuthorize("@ss.hasPermission('system:post:export')") @OperateLog(type = EXPORT) - public void export(HttpServletResponse response, @Validated SysPostExportReqVO reqVO) throws IOException { + public void export(HttpServletResponse response, @Validated PostExportReqVO reqVO) throws IOException { List posts = postService.getPosts(reqVO); - List data = SysPostConvert.INSTANCE.convertList03(posts); + List data = PostConvert.INSTANCE.convertList03(posts); // 输出 - ExcelUtils.write(response, "岗位数据.xls", "岗位列表", SysPostExcelVO.class, data); + ExcelUtils.write(response, "岗位数据.xls", "岗位列表", PostExcelVO.class, data); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java index 5e0bc14779..0661a54f91 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,7 +13,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysDeptBaseVO { +public class DeptBaseVO { @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") @NotBlank(message = "部门名称不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.java similarity index 52% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.java index 4909ef8bcb..efd6c39a3e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -@ApiModel("部门创建 Request VO") +@ApiModel("管理后台 - 部门创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysDeptCreateReqVO extends SysDeptBaseVO { +public class DeptCreateReqVO extends DeptBaseVO { } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptListReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java index 840fb0480b..171788b59e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel("部门列表 Request VO") +@ApiModel("管理后台 - 部门列表 Request VO") @Data -public class SysDeptListReqVO { +public class DeptListReqVO { @ApiModelProperty(value = "部门名称", example = "芋道", notes = "模糊匹配") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java similarity index 77% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java index edcc455aa0..db60a3107c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import java.util.Date; -@ApiModel("部门信息 Response VO") +@ApiModel("管理后台 - 部门信息 Response VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysDeptRespVO extends SysDeptBaseVO { +public class DeptRespVO extends DeptBaseVO { @ApiModelProperty(value = "部门编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java similarity index 77% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java index b9500ea81c..1a3d64f6e5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,11 +6,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("部门精简信息 Response VO") +@ApiModel("管理后台 - 部门精简信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor -public class SysDeptSimpleRespVO { +public class DeptSimpleRespVO { @ApiModelProperty(value = "部门编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.java index c4cd016e37..3e2f13a849 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.dept; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; -@ApiModel("部门更新 Request VO") +@ApiModel("管理后台 - 部门更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysDeptUpdateReqVO extends SysDeptBaseVO { +public class DeptUpdateReqVO extends DeptBaseVO { @ApiModelProperty(value = "部门编号", required = true, example = "1024") @NotNull(message = "部门编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostBaseVO.java similarity index 93% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostBaseVO.java index e30eedeacd..7000396466 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,7 +12,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysPostBaseVO { +public class PostBaseVO { @ApiModelProperty(value = "岗位名称", required = true, example = "小博主") @NotBlank(message = "岗位名称不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostCreateReqVO.java new file mode 100644 index 0000000000..547739c0d0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostCreateReqVO.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 岗位创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostCreateReqVO extends PostBaseVO { +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExcelVO.java similarity index 88% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExcelVO.java index 32042a41fc..b9c2696dfb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -10,7 +10,7 @@ import lombok.Data; * 岗位 Excel 导出响应 VO */ @Data -public class SysPostExcelVO { +public class PostExcelVO { @ExcelProperty("岗位序号") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExportReqVO.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExportReqVO.java index 9b8cd5e89b..182449d952 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExportReqVO.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel(value = "岗位导出 Request VO", description = "参数和 SysPostExcelVO 是一致的") +@ApiModel(value = "管理后台 - 岗位导出 Request VO", description = "参数和 SysPostExcelVO 是一致的") @Data -public class SysPostExportReqVO { +public class PostExportReqVO { @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配") private String code; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostListReqVO.java similarity index 72% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostListReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostListReqVO.java index a05bed03f5..a1369f20f7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostListReqVO.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -@ApiModel("岗位列表 Request VO") +@ApiModel("管理后台 - 岗位列表 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysPostListReqVO extends SysPostBaseVO { +public class PostListReqVO extends PostBaseVO { @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostPageReqVO.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostPageReqVO.java index 49b05c2a9e..94c6b9eaab 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -6,10 +6,10 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -@ApiModel("岗位分页 Request VO") +@ApiModel("管理后台 - 岗位分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysPostPageReqVO extends PageParam { +public class PostPageReqVO extends PageParam { @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配") private String code; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostRespVO.java similarity index 72% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostRespVO.java index fd95be4616..834e686179 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import java.util.Date; -@ApiModel("岗位信息 Response VO") +@ApiModel("管理后台 - 岗位信息 Response VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysPostRespVO extends SysPostBaseVO { +public class PostRespVO extends PostBaseVO { @ApiModelProperty(value = "岗位序号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java similarity index 73% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java index fdc6636d40..0334a7652a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,11 +6,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("岗位精简信息 Response VO") +@ApiModel("管理后台 - 岗位精简信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor -public class SysPostSimpleRespVO { +public class PostSimpleRespVO { @ApiModelProperty(value = "岗位编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.java index 0868c6a455..aeb91998b2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; +package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; -@ApiModel("岗位更新 Request VO") +@ApiModel("管理后台 - 岗位更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysPostUpdateReqVO extends SysPostBaseVO { +public class PostUpdateReqVO extends PostBaseVO { @ApiModelProperty(value = "岗位编号", required = true, example = "1024") @NotNull(message = "岗位编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.http similarity index 80% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.http index f7890dc67c..f524315026 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.http @@ -1,3 +1,4 @@ ### 请求 /menu/list 接口 => 成功 GET {{baseUrl}}/system/dict-data/list-all-simple Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java index d82f5cfec7..81d7cc247c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictDataController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.module.system.controller.dict; +package cn.iocoder.yudao.module.system.controller.admin.dict; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.*; -import cn.iocoder.yudao.module.system.convert.dict.SysDictDataConvert; -import cn.iocoder.yudao.module.system.service.dict.SysDictDataService; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.*; +import cn.iocoder.yudao.module.system.convert.dict.DictDataConvert; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -24,19 +24,19 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "字典数据") +@Api(tags = "管理后台 - 字典数据") @RestController @RequestMapping("/system/dict-data") @Validated -public class SysDictDataController { +public class DictDataController { @Resource - private SysDictDataService dictDataService; + private DictDataService dictDataService; @PostMapping("/create") @ApiOperation("新增字典数据") @PreAuthorize("@ss.hasPermission('system:dict:create')") - public CommonResult createDictData(@Valid @RequestBody SysDictDataCreateReqVO reqVO) { + public CommonResult createDictData(@Valid @RequestBody DictDataCreateReqVO reqVO) { Long dictDataId = dictDataService.createDictData(reqVO); return success(dictDataId); } @@ -44,7 +44,7 @@ public class SysDictDataController { @PutMapping("update") @ApiOperation("修改字典数据") @PreAuthorize("@ss.hasPermission('system:dict:update')") - public CommonResult updateDictData(@Valid @RequestBody SysDictDataUpdateReqVO reqVO) { + public CommonResult updateDictData(@Valid @RequestBody DictDataUpdateReqVO reqVO) { dictDataService.updateDictData(reqVO); return success(true); } @@ -61,35 +61,35 @@ public class SysDictDataController { @GetMapping("/list-all-simple") @ApiOperation(value = "获得全部字典数据列表", notes = "一般用于管理后台缓存字典数据在本地") // 无需添加权限认证,因为前端全局都需要 - public CommonResult> getSimpleDictDatas() { + public CommonResult> getSimpleDictDatas() { List list = dictDataService.getDictDatas(); - return success(SysDictDataConvert.INSTANCE.convertList(list)); + return success(DictDataConvert.INSTANCE.convertList(list)); } @GetMapping("/page") @ApiOperation("/获得字典类型的分页列表") @PreAuthorize("@ss.hasPermission('system:dict:query')") - public CommonResult> getDictTypePage(@Valid SysDictDataPageReqVO reqVO) { - return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO))); + public CommonResult> getDictTypePage(@Valid DictDataPageReqVO reqVO) { + return success(DictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO))); } @GetMapping(value = "/get") @ApiOperation("/查询字典数据详细") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:dict:query')") - public CommonResult getDictData(@RequestParam("id") Long id) { - return success(SysDictDataConvert.INSTANCE.convert(dictDataService.getDictData(id))); + public CommonResult getDictData(@RequestParam("id") Long id) { + return success(DictDataConvert.INSTANCE.convert(dictDataService.getDictData(id))); } @GetMapping("/export") @ApiOperation("导出字典数据") @PreAuthorize("@ss.hasPermission('system:dict:export')") @OperateLog(type = EXPORT) - public void export(HttpServletResponse response, @Valid SysDictDataExportReqVO reqVO) throws IOException { + public void export(HttpServletResponse response, @Valid DictDataExportReqVO reqVO) throws IOException { List list = dictDataService.getDictDatas(reqVO); - List data = SysDictDataConvert.INSTANCE.convertList02(list); + List data = DictDataConvert.INSTANCE.convertList02(list); // 输出 - ExcelUtils.write(response, "字典数据.xls", "数据列表", SysDictDataExcelVO.class, data); + ExcelUtils.write(response, "字典数据.xls", "数据列表", DictDataExcelVO.class, data); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictTypeController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java similarity index 66% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictTypeController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java index 63a4b08987..e7c9b88948 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/SysDictTypeController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.module.system.controller.dict; +package cn.iocoder.yudao.module.system.controller.admin.dict; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.*; -import cn.iocoder.yudao.module.system.convert.dict.SysDictTypeConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.yudao.module.system.service.dict.SysDictTypeService; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.*; +import cn.iocoder.yudao.module.system.convert.dict.DictTypeConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; +import cn.iocoder.yudao.module.system.service.dict.DictTypeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -24,19 +24,19 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "字典类型") +@Api(tags = "管理后台 - 字典类型") @RestController @RequestMapping("/system/dict-type") @Validated -public class SysDictTypeController { +public class DictTypeController { @Resource - private SysDictTypeService dictTypeService; + private DictTypeService dictTypeService; @PostMapping("/create") @ApiOperation("创建字典类型") @PreAuthorize("@ss.hasPermission('system:dict:create')") - public CommonResult createDictType(@Valid @RequestBody SysDictTypeCreateReqVO reqVO) { + public CommonResult createDictType(@Valid @RequestBody DictTypeCreateReqVO reqVO) { Long dictTypeId = dictTypeService.createDictType(reqVO); return success(dictTypeId); } @@ -44,7 +44,7 @@ public class SysDictTypeController { @PutMapping("/update") @ApiOperation("修改字典类型") @PreAuthorize("@ss.hasPermission('system:dict:update')") - public CommonResult updateDictType(@Valid @RequestBody SysDictTypeUpdateReqVO reqVO) { + public CommonResult updateDictType(@Valid @RequestBody DictTypeUpdateReqVO reqVO) { dictTypeService.updateDictType(reqVO); return success(true); } @@ -61,35 +61,35 @@ public class SysDictTypeController { @ApiOperation("/获得字典类型的分页列表") @GetMapping("/page") @PreAuthorize("@ss.hasPermission('system:dict:query')") - public CommonResult> pageDictTypes(@Valid SysDictTypePageReqVO reqVO) { - return success(SysDictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO))); + public CommonResult> pageDictTypes(@Valid DictTypePageReqVO reqVO) { + return success(DictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO))); } @ApiOperation("/查询字典类型详细") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @GetMapping(value = "/get") @PreAuthorize("@ss.hasPermission('system:dict:query')") - public CommonResult getDictType(@RequestParam("id") Long id) { - return success(SysDictTypeConvert.INSTANCE.convert(dictTypeService.getDictType(id))); + public CommonResult getDictType(@RequestParam("id") Long id) { + return success(DictTypeConvert.INSTANCE.convert(dictTypeService.getDictType(id))); } @GetMapping("/list-all-simple") @ApiOperation(value = "获得全部字典类型列表", notes = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项") // 无需添加权限认证,因为前端全局都需要 - public CommonResult> listSimpleDictTypes() { - List list = dictTypeService.getDictTypeList(); - return success(SysDictTypeConvert.INSTANCE.convertList(list)); + public CommonResult> listSimpleDictTypes() { + List list = dictTypeService.getDictTypeList(); + return success(DictTypeConvert.INSTANCE.convertList(list)); } @ApiOperation("导出数据类型") @GetMapping("/export") @PreAuthorize("@ss.hasPermission('system:dict:query')") @OperateLog(type = EXPORT) - public void export(HttpServletResponse response, @Valid SysDictTypeExportReqVO reqVO) throws IOException { - List list = dictTypeService.getDictTypeList(reqVO); - List data = SysDictTypeConvert.INSTANCE.convertList02(list); + public void export(HttpServletResponse response, @Valid DictTypeExportReqVO reqVO) throws IOException { + List list = dictTypeService.getDictTypeList(reqVO); + List data = DictTypeConvert.INSTANCE.convertList02(list); // 输出 - ExcelUtils.write(response, "字典类型.xls", "类型列表", SysDictTypeExcelVO.class, data); + ExcelUtils.write(response, "字典类型.xls", "类型列表", DictTypeExcelVO.class, data); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java index c67ceb0d20..0292f84372 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,7 +12,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysDictDataBaseVO { +public class DictDataBaseVO { @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") @NotNull(message = "显示顺序不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.java new file mode 100644 index 0000000000..57dc770d09 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 字典数据创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataCreateReqVO extends DictDataBaseVO { + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java similarity index 88% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java index 19cd76b785..ee907eaa76 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -10,7 +10,7 @@ import lombok.Data; * 字典数据 Excel 导出响应 VO */ @Data -public class SysDictDataExcelVO { +public class DictDataExcelVO { @ExcelProperty("字典编码") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java similarity index 80% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java index 074e02c804..142d45017a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,9 +6,9 @@ import lombok.Data; import javax.validation.constraints.Size; -@ApiModel("字典类型导出 Request VO") +@ApiModel("管理后台 - 字典类型导出 Request VO") @Data -public class SysDictDataExportReqVO { +public class DictDataExportReqVO { @ApiModelProperty(value = "字典标签", example = "芋道") @Size(max = 100, message = "字典标签长度不能超过100个字符") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java similarity index 81% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java index 97d6d8f260..a095aac087 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -8,10 +8,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.Size; -@ApiModel("字典类型分页列表 Request VO") +@ApiModel("管理后台 - 字典类型分页列表 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysDictDataPageReqVO extends PageParam { +public class DictDataPageReqVO extends PageParam { @ApiModelProperty(value = "字典标签", example = "芋道") @Size(max = 100, message = "字典标签长度不能超过100个字符") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataRespVO.java similarity index 75% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataRespVO.java index e4281ca150..697097008e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,12 +9,12 @@ import lombok.NoArgsConstructor; import java.util.Date; -@ApiModel("字典数据信息 Response VO") +@ApiModel("管理后台 - 字典数据信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class SysDictDataRespVO extends SysDictDataBaseVO { +public class DictDataRespVO extends DictDataBaseVO { @ApiModelProperty(value = "字典数据编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java similarity index 72% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java index 2da4779bac..c3dd560529 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel("数据字典精简 Response VO") +@ApiModel("管理后台 - 数据字典精简 Response VO") @Data -public class SysDictDataSimpleRespVO { +public class DictDataSimpleRespVO { @ApiModelProperty(value = "字典类型", required = true, example = "gender") private String dictType; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.java similarity index 68% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.java index 428aa654aa..f6f9b81a23 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.data; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; -@ApiModel("字典数据更新 Request VO") +@ApiModel("管理后台 - 字典数据更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysDictDataUpdateReqVO extends SysDictDataBaseVO { +public class DictDataUpdateReqVO extends DictDataBaseVO { @ApiModelProperty(value = "字典数据编号", required = true, example = "1024") @NotNull(message = "字典数据编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.java index d9e2dfe478..4da6da0b31 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,7 +12,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysDictTypeBaseVO { +public class DictTypeBaseVO { @ApiModelProperty(value = "字典名称", required = true, example = "性别") @NotBlank(message = "字典名称不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.java similarity index 73% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.java index ea5b0465ab..ee2f45ae19 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,10 +8,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -@ApiModel("字典类型创建 Request VO") +@ApiModel("管理后台 - 字典类型创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysDictTypeCreateReqVO extends SysDictTypeBaseVO { +public class DictTypeCreateReqVO extends DictTypeBaseVO { @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") @NotNull(message = "字典类型不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java index 25c07e6ab7..fbda72b2e3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -10,7 +10,7 @@ import lombok.Data; * 字典类型 Excel 导出响应 VO */ @Data -public class SysDictTypeExcelVO { +public class DictTypeExcelVO { @ExcelProperty("字典主键") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java index 440cef8bcf..b2f3331b8d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("字典类型分页列表 Request VO") +@ApiModel("管理后台 - 字典类型分页列表 Request VO") @Data -public class SysDictTypeExportReqVO { +public class DictTypeExportReqVO { @ApiModelProperty(value = "字典类型名称", example = "芋道", notes = "模糊匹配") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java similarity index 87% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java index 8cd2c9b824..1c231b0d24 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,10 +12,10 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("字典类型分页列表 Request VO") +@ApiModel("管理后台 - 字典类型分页列表 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysDictTypePageReqVO extends PageParam { +public class DictTypePageReqVO extends PageParam { @ApiModelProperty(value = "字典类型名称", example = "芋道", notes = "模糊匹配") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java index b82e16e16d..9cfafdfa40 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,12 +9,12 @@ import lombok.NoArgsConstructor; import java.util.Date; -@ApiModel("字典类型信息 Response VO") +@ApiModel("管理后台 - 字典类型信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class SysDictTypeRespVO extends SysDictTypeBaseVO { +public class DictTypeRespVO extends DictTypeBaseVO { @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java similarity index 76% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java index c53154f8c8..8cca026a9f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,11 +6,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("字典类型精简信息 Response VO") +@ApiModel("管理后台 - 字典类型精简信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor -public class SysDictTypeSimpleRespVO { +public class DictTypeSimpleRespVO { @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.java similarity index 68% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.java index ed812dadc2..00955f4fe3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.type; +package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; -@ApiModel("字典类型更新 Request VO") +@ApiModel("管理后台 - 字典类型更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysDictTypeUpdateReqVO extends SysDictTypeBaseVO { +public class DictTypeUpdateReqVO extends DictTypeBaseVO { @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") @NotNull(message = "字典类型编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/ErrorCodeController.http similarity index 64% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/ErrorCodeController.http index 76226d18e3..06b8723185 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/ErrorCodeController.http @@ -1,7 +1,8 @@ -### +### 创建错误码 POST {{baseUrl}}/inra/error-code/create Authorization: Bearer {{token}} -Content-Type:application/json +Content-Type: application/json +tenant-id: {{adminTenentId}} { "code": 200, diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/ErrorCodeController.java similarity index 64% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/ErrorCodeController.java index 220789d565..e3161b8aa1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/SysErrorCodeController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/ErrorCodeController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.module.system.controller.errorcode; +package cn.iocoder.yudao.module.system.controller.admin.errorcode; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.convert.errorcode.SysErrorCodeConvert; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.*; -import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; -import cn.iocoder.yudao.module.system.service.errorcode.SysErrorCodeService; +import cn.iocoder.yudao.module.system.convert.errorcode.ErrorCodeConvert; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import cn.iocoder.yudao.module.system.service.errorcode.ErrorCodeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -24,26 +24,26 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "错误码") +@Api(tags = "管理后台 - 错误码") @RestController @RequestMapping("/system/error-code") @Validated -public class SysErrorCodeController { +public class ErrorCodeController { @Resource - private SysErrorCodeService errorCodeService; + private ErrorCodeService errorCodeService; @PostMapping("/create") @ApiOperation("创建错误码") @PreAuthorize("@ss.hasPermission('system:error-code:create')") - public CommonResult createErrorCode(@Valid @RequestBody SysErrorCodeCreateReqVO createReqVO) { + public CommonResult createErrorCode(@Valid @RequestBody ErrorCodeCreateReqVO createReqVO) { return success(errorCodeService.createErrorCode(createReqVO)); } @PutMapping("/update") @ApiOperation("更新错误码") @PreAuthorize("@ss.hasPermission('system:error-code:update')") - public CommonResult updateErrorCode(@Valid @RequestBody SysErrorCodeUpdateReqVO updateReqVO) { + public CommonResult updateErrorCode(@Valid @RequestBody ErrorCodeUpdateReqVO updateReqVO) { errorCodeService.updateErrorCode(updateReqVO); return success(true); } @@ -61,29 +61,29 @@ public class SysErrorCodeController { @ApiOperation("获得错误码") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:error-code:query')") - public CommonResult getErrorCode(@RequestParam("id") Long id) { - SysErrorCodeDO errorCode = errorCodeService.getErrorCode(id); - return success(SysErrorCodeConvert.INSTANCE.convert(errorCode)); + public CommonResult getErrorCode(@RequestParam("id") Long id) { + ErrorCodeDO errorCode = errorCodeService.getErrorCode(id); + return success(ErrorCodeConvert.INSTANCE.convert(errorCode)); } @GetMapping("/page") @ApiOperation("获得错误码分页") @PreAuthorize("@ss.hasPermission('system:error-code:query')") - public CommonResult> getErrorCodePage(@Valid SysErrorCodePageReqVO pageVO) { - PageResult pageResult = errorCodeService.getErrorCodePage(pageVO); - return success(SysErrorCodeConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getErrorCodePage(@Valid ErrorCodePageReqVO pageVO) { + PageResult pageResult = errorCodeService.getErrorCodePage(pageVO); + return success(ErrorCodeConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出错误码 Excel") @PreAuthorize("@ss.hasPermission('system:error-code:export')") @OperateLog(type = EXPORT) - public void exportErrorCodeExcel(@Valid SysErrorCodeExportReqVO exportReqVO, + public void exportErrorCodeExcel(@Valid ErrorCodeExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = errorCodeService.getErrorCodeList(exportReqVO); + List list = errorCodeService.getErrorCodeList(exportReqVO); // 导出 Excel - List datas = SysErrorCodeConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "错误码.xls", "数据", SysErrorCodeExcelVO.class, datas); + List datas = ErrorCodeConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "错误码.xls", "数据", ErrorCodeExcelVO.class, datas); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.java index f5d1e8d7aa..150401aa32 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.admin.errorcode.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysErrorCodeBaseVO { +public class ErrorCodeBaseVO { @ApiModelProperty(value = "应用名", required = true, example = "dashboard") @NotNull(message = "应用名不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.java similarity index 51% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.java index f0481861a9..a0f36af1a9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.admin.errorcode.vo; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -@ApiModel("短信模板创建 Request VO") +@ApiModel("管理后台 - 错误码创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsTemplateCreateReqVO extends SysSmsTemplateBaseVO { +public class ErrorCodeCreateReqVO extends ErrorCodeBaseVO { } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.java index 5efbf36dc8..a9c317bfba 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.admin.errorcode.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -14,7 +14,7 @@ import java.util.Date; * @author 芋道源码 */ @Data -public class SysErrorCodeExcelVO { +public class ErrorCodeExcelVO { @ExcelProperty("错误码编号") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.java similarity index 81% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.java index 8a46b99dc0..9f716152c8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.admin.errorcode.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "错误码 Excel 导出 Request VO", description = "参数和 InfErrorCodePageReqVO 是一致的") +@ApiModel(value = "管理后台 - 错误码 Excel 导出 Request VO", description = "参数和 InfErrorCodePageReqVO 是一致的") @Data -public class SysErrorCodeExportReqVO { +public class ErrorCodeExportReqVO { @ApiModelProperty(value = "错误码类型", example = "1") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java similarity index 87% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java index 6273ea192d..70eeda41ac 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.admin.errorcode.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("错误码分页 Request VO") +@ApiModel("管理后台 - 错误码分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysErrorCodePageReqVO extends PageParam { +public class ErrorCodePageReqVO extends PageParam { @ApiModelProperty(value = "错误码类型", example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java index 35e4f93d64..c79b6bf8c2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.admin.errorcode.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import java.util.Date; -@ApiModel("错误码 Response VO") +@ApiModel("管理后台 - 错误码 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysErrorCodeRespVO extends SysErrorCodeBaseVO { +public class ErrorCodeRespVO extends ErrorCodeBaseVO { @ApiModelProperty(value = "错误码编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.java similarity index 70% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.java index 0d6b9508e1..ff16c02834 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.errorcode.vo; +package cn.iocoder.yudao.module.system.controller.admin.errorcode.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("错误码更新 Request VO") +@ApiModel("管理后台 - 错误码更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysErrorCodeUpdateReqVO extends SysErrorCodeBaseVO { +public class ErrorCodeUpdateReqVO extends ErrorCodeBaseVO { @ApiModelProperty(value = "错误码编号", required = true, example = "1024") @NotNull(message = "错误码编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysLoginLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java similarity index 62% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysLoginLogController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java index 29addebc6d..ad78168355 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysLoginLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java @@ -1,16 +1,16 @@ -package cn.iocoder.yudao.module.system.controller.logger; +package cn.iocoder.yudao.module.system.controller.admin.logger; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogRespVO; -import cn.iocoder.yudao.module.system.convert.logger.SysLoginLogConvert; -import cn.iocoder.yudao.module.system.service.logger.SysLoginLogService; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO; +import cn.iocoder.yudao.module.system.convert.logger.LoginLogConvert; +import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; @@ -27,33 +27,33 @@ import java.util.List; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "登录日志") +@Api(tags = "管理后台 - 登录日志") @RestController @RequestMapping("/system/login-log") @Validated -public class SysLoginLogController { +public class LoginLogController { @Resource - private SysLoginLogService loginLogService; + private LoginLogService loginLogService; @GetMapping("/page") @ApiOperation("获得登录日志分页列表") @PreAuthorize("@ss.hasPermission('system:login-log:query')") - public CommonResult> getLoginLogPage(@Valid SysLoginLogPageReqVO reqVO) { + public CommonResult> getLoginLogPage(@Valid LoginLogPageReqVO reqVO) { PageResult page = loginLogService.getLoginLogPage(reqVO); - return CommonResult.success(SysLoginLogConvert.INSTANCE.convertPage(page)); + return CommonResult.success(LoginLogConvert.INSTANCE.convertPage(page)); } @GetMapping("/export") @ApiOperation("导出登录日志 Excel") @PreAuthorize("@ss.hasPermission('system:login-log:export')") @OperateLog(type = EXPORT) - public void exportLoginLog(HttpServletResponse response, @Valid SysLoginLogExportReqVO reqVO) throws IOException { + public void exportLoginLog(HttpServletResponse response, @Valid LoginLogExportReqVO reqVO) throws IOException { List list = loginLogService.getLoginLogList(reqVO); // 拼接数据 - List data = SysLoginLogConvert.INSTANCE.convertList(list); + List data = LoginLogConvert.INSTANCE.convertList(list); // 输出 - ExcelUtils.write(response, "登录日志.xls", "数据列表", SysLoginLogExcelVO.class, data); + ExcelUtils.write(response, "登录日志.xls", "数据列表", LoginLogExcelVO.class, data); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.http similarity index 81% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.http index 3b88719963..f667482da4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.http @@ -1,3 +1,4 @@ ### 请求 /system/operate-log/demo 接口 => 成功 GET {{baseUrl}}/system/operate-log/demo Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java similarity index 63% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java index f572ed5c29..2eca78fc15 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/SysOperateLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.module.system.controller.logger; +package cn.iocoder.yudao.module.system.controller.admin.logger; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogRespVO; -import cn.iocoder.yudao.module.system.convert.logger.SysOperateLogConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.yudao.module.system.service.logger.SysOperateLogService; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; +import cn.iocoder.yudao.module.system.convert.logger.OperateLogConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; +import cn.iocoder.yudao.module.system.service.logger.OperateLogService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; @@ -35,30 +35,30 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "操作日志") +@Api(tags = "管理后台 - 操作日志") @RestController @RequestMapping("/system/operate-log") @Validated -public class SysOperateLogController { +public class OperateLogController { @Resource - private SysOperateLogService operateLogService; + private OperateLogService operateLogService; @Resource private SysUserCoreService userCoreService; @GetMapping("/page") @ApiOperation("查看操作日志分页列表") @PreAuthorize("@ss.hasPermission('system:operate-log:query')") - public CommonResult> pageOperateLog(@Valid SysOperateLogPageReqVO reqVO) { - PageResult pageResult = operateLogService.getOperateLogPage(reqVO); + public CommonResult> pageOperateLog(@Valid OperateLogPageReqVO reqVO) { + PageResult pageResult = operateLogService.getOperateLogPage(reqVO); // 获得拼接需要的数据 - Collection userIds = CollectionUtils.convertList(pageResult.getList(), SysOperateLogDO::getUserId); + Collection userIds = CollectionUtils.convertList(pageResult.getList(), OperateLogDO::getUserId); Map userMap = userCoreService.getUserMap(userIds); // 拼接数据 - List list = new ArrayList<>(pageResult.getList().size()); + List list = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(operateLog -> { - SysOperateLogRespVO respVO = SysOperateLogConvert.INSTANCE.convert(operateLog); + OperateLogRespVO respVO = OperateLogConvert.INSTANCE.convert(operateLog); list.add(respVO); // 拼接用户信息 MapUtils.findAndThen(userMap, operateLog.getUserId(), user -> respVO.setUserNickname(user.getNickname())); @@ -70,16 +70,16 @@ public class SysOperateLogController { @GetMapping("/export") @PreAuthorize("@ss.hasPermission('system:operate-log:export')") @OperateLog(type = EXPORT) - public void exportOperateLog(HttpServletResponse response, @Valid SysOperateLogExportReqVO reqVO) throws IOException { - List list = operateLogService.getOperateLogs(reqVO); + public void exportOperateLog(HttpServletResponse response, @Valid OperateLogExportReqVO reqVO) throws IOException { + List list = operateLogService.getOperateLogs(reqVO); // 获得拼接需要的数据 - Collection userIds = CollectionUtils.convertList(list, SysOperateLogDO::getUserId); + Collection userIds = CollectionUtils.convertList(list, OperateLogDO::getUserId); Map userMap = userCoreService.getUserMap(userIds); // 拼接数据 - List excelDataList = SysOperateLogConvert.INSTANCE.convertList(list, userMap); + List excelDataList = OperateLogConvert.INSTANCE.convertList(list, userMap); // 输出 - ExcelUtils.write(response, "操作日志.xls", "数据列表", SysOperateLogExcelVO.class, excelDataList); + ExcelUtils.write(response, "操作日志.xls", "数据列表", OperateLogExcelVO.class, excelDataList); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java similarity index 93% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java index 6b26057962..e996570845 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,7 +13,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysLoginLogBaseVO { +public class LoginLogBaseVO { @ApiModelProperty(value = "日志类型", required = true, example = "1", notes = "参见 SysLoginLogTypeEnum 枚举类") @NotNull(message = "日志类型不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java index bda160a3fa..2a16454fca 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -12,7 +12,7 @@ import java.util.Date; * 登录日志 Excel 导出响应 VO */ @Data -public class SysLoginLogExcelVO { +public class LoginLogExcelVO { @ExcelProperty("日志主键") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.java index 8f936268bc..df1a57ea52 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("登录日志分页列表 Request VO") +@ApiModel("管理后台 - 登录日志分页列表 Request VO") @Data -public class SysLoginLogExportReqVO { +public class LoginLogExportReqVO { @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模拟匹配") private String userIp; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java index 7c71730c90..ebefb728e2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -11,10 +11,10 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("登录日志分页列表 Request VO") +@ApiModel("管理后台 - 登录日志分页列表 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysLoginLogPageReqVO extends PageParam { +public class LoginLogPageReqVO extends PageParam { @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模拟匹配") private String userIp; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java similarity index 82% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java index 3f588304b9..17177dadf2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.loginlog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,11 +9,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; import java.util.Date; -@ApiModel("登录日志 Response VO") +@ApiModel("管理后台 - 登录日志 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysLoginLogRespVO extends SysLoginLogBaseVO { +public class LoginLogRespVO extends LoginLogBaseVO { @ApiModelProperty(value = "日志编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java index 735e0b198e..e66a20e3f2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,7 +13,7 @@ import java.util.Map; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysOperateLogBaseVO { +public class OperateLogBaseVO { @ApiModelProperty(value = "链路追踪编号", required = true, example = "89aca178-a370-411c-ae02-3f0d672be4ab") @NotEmpty(message = "链路追踪编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java index e5fc3e9410..40546b2d9c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -12,7 +12,7 @@ import java.util.Date; * 操作日志 Excel 导出响应 VO */ @Data -public class SysOperateLogExcelVO { +public class OperateLogExcelVO { @ExcelProperty("日志编号") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java index 1c501acd6e..52dc5d99b5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("操作日志分页列表 Request VO") +@ApiModel("管理后台 - 操作日志分页列表 Request VO") @Data -public class SysOperateLogExportReqVO { +public class OperateLogExportReqVO { @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") private String module; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java index 92efe97388..f94d979f4a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -10,9 +10,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("操作日志分页列表 Request VO") +@ApiModel("管理后台 - 操作日志分页列表 Request VO") @Data -public class SysOperateLogPageReqVO extends PageParam { +public class OperateLogPageReqVO extends PageParam { @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") private String module; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java index fc825d62a5..445b400603 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.logger.vo.operatelog; +package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,11 +6,11 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -@ApiModel("操作日志 Response VO") +@ApiModel("管理后台 - 操作日志 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysOperateLogRespVO extends SysOperateLogBaseVO { +public class OperateLogRespVO extends OperateLogBaseVO { @ApiModelProperty(value = "日志编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/SysNoticeController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeController.java similarity index 63% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/SysNoticeController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeController.java index 7cb255ee5b..d14cfb7333 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/SysNoticeController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.module.system.controller.notice; +package cn.iocoder.yudao.module.system.controller.admin.notice; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeRespVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.notice.SysNoticeConvert; -import cn.iocoder.yudao.module.system.service.notice.SysNoticeService; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeRespVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.notice.NoticeConvert; +import cn.iocoder.yudao.module.system.service.notice.NoticeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -20,19 +20,19 @@ import javax.validation.Valid; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "通知公告") +@Api(tags = "管理后台 - 通知公告") @RestController @RequestMapping("/system/notice") @Validated -public class SysNoticeController { +public class NoticeController { @Resource - private SysNoticeService noticeService; + private NoticeService noticeService; @PostMapping("/create") @ApiOperation("创建通知公告") @PreAuthorize("@ss.hasPermission('system:notice:create')") - public CommonResult createNotice(@Valid @RequestBody SysNoticeCreateReqVO reqVO) { + public CommonResult createNotice(@Valid @RequestBody NoticeCreateReqVO reqVO) { Long noticeId = noticeService.createNotice(reqVO); return success(noticeId); } @@ -40,7 +40,7 @@ public class SysNoticeController { @PutMapping("/update") @ApiOperation("修改通知公告") @PreAuthorize("@ss.hasPermission('system:notice:update')") - public CommonResult updateNotice(@Valid @RequestBody SysNoticeUpdateReqVO reqVO) { + public CommonResult updateNotice(@Valid @RequestBody NoticeUpdateReqVO reqVO) { noticeService.updateNotice(reqVO); return success(true); } @@ -57,16 +57,16 @@ public class SysNoticeController { @GetMapping("/page") @ApiOperation("获取通知公告列表") @PreAuthorize("@ss.hasPermission('system:notice:query')") - public CommonResult> pageNotices(@Validated SysNoticePageReqVO reqVO) { - return success(SysNoticeConvert.INSTANCE.convertPage(noticeService.pageNotices(reqVO))); + public CommonResult> pageNotices(@Validated NoticePageReqVO reqVO) { + return success(NoticeConvert.INSTANCE.convertPage(noticeService.pageNotices(reqVO))); } @GetMapping("/get") @ApiOperation("获得通知公告") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:notice:query')") - public CommonResult getNotice(@RequestParam("id") Long id) { - return success(SysNoticeConvert.INSTANCE.convert(noticeService.getNotice(id))); + public CommonResult getNotice(@RequestParam("id") Long id) { + return success(NoticeConvert.INSTANCE.convert(noticeService.getNotice(id))); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeBaseVO.java similarity index 91% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeBaseVO.java index ddbb141cce..48d74dd2bd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.admin.notice.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,7 +12,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysNoticeBaseVO { +public class NoticeBaseVO { @ApiModelProperty(value = "公告标题", required = true, example = "小博主") @NotBlank(message = "公告标题不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeCreateReqVO.java new file mode 100644 index 0000000000..49e671ce14 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeCreateReqVO.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.module.system.controller.admin.notice.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 通知公告创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeCreateReqVO extends NoticeBaseVO { +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePageReqVO.java similarity index 74% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePageReqVO.java index 6e1932a155..570d530053 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.admin.notice.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -6,10 +6,10 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -@ApiModel("通知公告分页 Request VO") +@ApiModel("管理后台 - 通知公告分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysNoticePageReqVO extends PageParam { +public class NoticePageReqVO extends PageParam { @ApiModelProperty(value = "通知公告名称", example = "芋道", notes = "模糊匹配") private String title; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeRespVO.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeRespVO.java index 0cfb78bbb0..1f18df030e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.admin.notice.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import java.util.Date; -@ApiModel("通知公告信息 Response VO") +@ApiModel("管理后台 - 通知公告信息 Response VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysNoticeRespVO extends SysNoticeBaseVO { +public class NoticeRespVO extends NoticeBaseVO { @ApiModelProperty(value = "通知公告序号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.java index 3d6fdd586b..30f4a3720b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.notice.vo; +package cn.iocoder.yudao.module.system.controller.admin.notice.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; -@ApiModel("岗位公告更新 Request VO") +@ApiModel("管理后台 - 岗位公告更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysNoticeUpdateReqVO extends SysNoticeBaseVO { +public class NoticeUpdateReqVO extends NoticeBaseVO { @ApiModelProperty(value = "岗位公告编号", required = true, example = "1024") @NotNull(message = "岗位公告编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.http similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.http index c073f7bdc6..a90d8b8ab3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.http @@ -1,3 +1,4 @@ ### 请求 /menu/list 接口 => 成功 GET {{baseUrl}}/system/menu/list Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java similarity index 63% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java index 340b3bff78..8678da529c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysMenuController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.module.system.controller.permission; +package cn.iocoder.yudao.module.system.controller.admin.permission; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.*; -import cn.iocoder.yudao.module.system.convert.permission.SysMenuConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.yudao.module.system.service.permission.SysMenuService; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.*; +import cn.iocoder.yudao.module.system.convert.permission.MenuConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; +import cn.iocoder.yudao.module.system.service.permission.MenuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -20,19 +20,19 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "菜单") +@Api(tags = "管理后台 - 菜单") @RestController @RequestMapping("/system/menu") @Validated -public class SysMenuController { +public class MenuController { @Resource - private SysMenuService menuService; + private MenuService menuService; @PostMapping("/create") @ApiOperation("创建菜单") @PreAuthorize("@ss.hasPermission('system:menu:create')") - public CommonResult createMenu(@Valid @RequestBody SysMenuCreateReqVO reqVO) { + public CommonResult createMenu(@Valid @RequestBody MenuCreateReqVO reqVO) { Long menuId = menuService.createMenu(reqVO); return success(menuId); } @@ -40,7 +40,7 @@ public class SysMenuController { @PutMapping("/update") @ApiOperation("修改菜单") @PreAuthorize("@ss.hasPermission('system:menu:update')") - public CommonResult updateMenu(@Valid @RequestBody SysMenuUpdateReqVO reqVO) { + public CommonResult updateMenu(@Valid @RequestBody MenuUpdateReqVO reqVO) { menuService.updateMenu(reqVO); return success(true); } @@ -57,30 +57,30 @@ public class SysMenuController { @GetMapping("/list") @ApiOperation("获取菜单列表") @PreAuthorize("@ss.hasPermission('system:menu:query')") - public CommonResult> getMenus(SysMenuListReqVO reqVO) { - List list = menuService.getMenus(reqVO); - list.sort(Comparator.comparing(SysMenuDO::getSort)); - return success(SysMenuConvert.INSTANCE.convertList(list)); + public CommonResult> getMenus(MenuListReqVO reqVO) { + List list = menuService.getMenus(reqVO); + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(MenuConvert.INSTANCE.convertList(list)); } @GetMapping("/list-all-simple") @ApiOperation(value = "获取菜单精简信息列表", notes = "只包含被开启的菜单,主要用于前端的下拉选项") - public CommonResult> getSimpleMenus() { + public CommonResult> getSimpleMenus() { // 获得菜单列表,只要开启状态的 - SysMenuListReqVO reqVO = new SysMenuListReqVO(); + MenuListReqVO reqVO = new MenuListReqVO(); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - List list = menuService.getMenus(reqVO); + List list = menuService.getMenus(reqVO); // 排序后,返回个诶前端 - list.sort(Comparator.comparing(SysMenuDO::getSort)); - return success(SysMenuConvert.INSTANCE.convertList02(list)); + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(MenuConvert.INSTANCE.convertList02(list)); } @GetMapping("/get") @ApiOperation("获取菜单信息") @PreAuthorize("@ss.hasPermission('system:menu:query')") - public CommonResult getMenu(Long id) { - SysMenuDO menu = menuService.getMenu(id); - return success(SysMenuConvert.INSTANCE.convert(menu)); + public CommonResult getMenu(Long id) { + MenuDO menu = menuService.getMenu(id); + return success(MenuConvert.INSTANCE.convert(menu)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysPermissionController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/PermissionController.java similarity index 73% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysPermissionController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/PermissionController.java index 500f4ac4b5..de26fbf086 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysPermissionController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/PermissionController.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.module.system.controller.permission; +package cn.iocoder.yudao.module.system.controller.admin.permission; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.system.controller.permission.vo.permission.SysPermissionAssignRoleDataScopeReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.permission.SysPermissionAssignRoleMenuReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.permission.SysPermissionAssignUserRoleReqVO; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleDataScopeReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleMenuReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -12,6 +12,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; import java.util.Set; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -21,13 +22,15 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; * * @author 芋道源码 */ -@Api(tags = "权限") +@Api(tags = "管理后台 - 权限") @RestController @RequestMapping("/system/permission") -public class SysPermissionController { +public class PermissionController { @Resource - private SysPermissionService permissionService; + private PermissionService permissionService; + + // TODO @芋艿:处理下全新啊标识 @ApiOperation("获得角色拥有的菜单编号") @ApiImplicitParam(name = "roleId", value = "角色编号", required = true, dataTypeClass = Long.class) @@ -40,7 +43,7 @@ public class SysPermissionController { @PostMapping("/assign-role-menu") @ApiOperation("赋予角色菜单") // @RequiresPermissions("system:permission:assign-role-resource") - public CommonResult assignRoleMenu(@Validated @RequestBody SysPermissionAssignRoleMenuReqVO reqVO) { + public CommonResult assignRoleMenu(@Validated @RequestBody PermissionAssignRoleMenuReqVO reqVO) { permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds()); return success(true); } @@ -48,8 +51,7 @@ public class SysPermissionController { @PostMapping("/assign-role-data-scope") @ApiOperation("赋予角色数据权限") // @RequiresPermissions("system:permission:assign-role-data-scope") - public CommonResult assignRoleDataScope( - @Validated @RequestBody SysPermissionAssignRoleDataScopeReqVO reqVO) { + public CommonResult assignRoleDataScope(@Valid @RequestBody PermissionAssignRoleDataScopeReqVO reqVO) { permissionService.assignRoleDataScope(reqVO.getRoleId(), reqVO.getDataScope(), reqVO.getDataScopeDeptIds()); return success(true); } @@ -65,7 +67,7 @@ public class SysPermissionController { @ApiOperation("赋予用户角色") @PostMapping("/assign-user-role") // @RequiresPermissions("system:permission:assign-user-role") - public CommonResult assignUserRole(@Validated @RequestBody SysPermissionAssignUserRoleReqVO reqVO) { + public CommonResult assignUserRole(@Validated @RequestBody PermissionAssignUserRoleReqVO reqVO) { permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds()); return success(true); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http index 4e150ac303..c28725d860 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http @@ -2,6 +2,7 @@ POST {{baseUrl}}/system/role/create Authorization: Bearer {{token}} Content-Type: application/json +tenant-id: {{adminTenentId}} { "name": "测试角色", @@ -13,7 +14,7 @@ Content-Type: application/json POST {{baseUrl}}/system/role/update Authorization: Bearer {{token}} Content-Type: application/json - +tenant-id: {{adminTenentId}} { "id": 100, @@ -25,6 +26,7 @@ Content-Type: application/json POST {{baseUrl}}/system/role/delete Content-Type: application/x-www-form-urlencoded Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} roleId=14 @@ -32,10 +34,12 @@ roleId=14 GET {{baseUrl}}/system/role/get?id=100 Content-Type: application/x-www-form-urlencoded Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} ### /role/page 成功 GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10 Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} ### diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java similarity index 76% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java index 7ec11bd563..ac7dce6358 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/SysRoleController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.module.system.controller.permission; +package cn.iocoder.yudao.module.system.controller.admin.permission; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.*; -import cn.iocoder.yudao.module.system.convert.permission.SysRoleConvert; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*; +import cn.iocoder.yudao.module.system.convert.permission.RoleConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.module.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.service.permission.RoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -27,26 +27,26 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "角色") +@Api(tags = "管理后台 - 角色") @RestController @RequestMapping("/system/role") @Validated -public class SysRoleController { +public class RoleController { @Resource - private SysRoleService roleService; + private RoleService roleService; @PostMapping("/create") @ApiOperation("创建角色") @PreAuthorize("@ss.hasPermission('system:role:create')") - public CommonResult createRole(@Valid @RequestBody SysRoleCreateReqVO reqVO) { + public CommonResult createRole(@Valid @RequestBody RoleCreateReqVO reqVO) { return success(roleService.createRole(reqVO)); } @PutMapping("/update") @ApiOperation("修改角色") @PreAuthorize("@ss.hasPermission('system:role:update')") - public CommonResult updateRole(@Valid @RequestBody SysRoleUpdateReqVO reqVO) { + public CommonResult updateRole(@Valid @RequestBody RoleUpdateReqVO reqVO) { roleService.updateRole(reqVO); return success(true); } @@ -54,7 +54,7 @@ public class SysRoleController { @PutMapping("/update-status") @ApiOperation("修改角色状态") @PreAuthorize("@ss.hasPermission('system:role:update')") - public CommonResult updateRoleStatus(@Valid @RequestBody SysRoleUpdateStatusReqVO reqVO) { + public CommonResult updateRoleStatus(@Valid @RequestBody RoleUpdateStatusReqVO reqVO) { roleService.updateRoleStatus(reqVO.getId(), reqVO.getStatus()); return success(true); } @@ -71,36 +71,36 @@ public class SysRoleController { @GetMapping("/get") @ApiOperation("获得角色信息") @PreAuthorize("@ss.hasPermission('system:role:query')") - public CommonResult getRole(@RequestParam("id") Long id) { + public CommonResult getRole(@RequestParam("id") Long id) { SysRoleDO role = roleService.getRole(id); - return success(SysRoleConvert.INSTANCE.convert(role)); + return success(RoleConvert.INSTANCE.convert(role)); } @GetMapping("/page") @ApiOperation("获得角色分页") @PreAuthorize("@ss.hasPermission('system:role:query')") - public CommonResult> getRolePage(SysRolePageReqVO reqVO) { + public CommonResult> getRolePage(RolePageReqVO reqVO) { return success(roleService.getRolePage(reqVO)); } @GetMapping("/list-all-simple") @ApiOperation(value = "获取角色精简信息列表", notes = "只包含被开启的角色,主要用于前端的下拉选项") - public CommonResult> getSimpleRoles() { + public CommonResult> getSimpleRoles() { // 获得角色列表,只要开启状态的 List list = roleService.getRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); // 排序后,返回个诶前端 list.sort(Comparator.comparing(SysRoleDO::getSort)); - return success(SysRoleConvert.INSTANCE.convertList02(list)); + return success(RoleConvert.INSTANCE.convertList02(list)); } @GetMapping("/export") @OperateLog(type = EXPORT) @PreAuthorize("@ss.hasPermission('system:role:export')") - public void export(HttpServletResponse response, @Validated SysRoleExportReqVO reqVO) throws IOException { + public void export(HttpServletResponse response, @Validated RoleExportReqVO reqVO) throws IOException { List list = roleService.getRoleList(reqVO); - List data = SysRoleConvert.INSTANCE.convertList03(list); + List data = RoleConvert.INSTANCE.convertList03(list); // 输出 - ExcelUtils.write(response, "角色数据.xls", "角色列表", SysRoleExcelVO.class, data); + ExcelUtils.write(response, "角色数据.xls", "角色列表", RoleExcelVO.class, data); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java similarity index 95% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java index 87f2eb7fe5..8769f3a1ba 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,7 +12,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysMenuBaseVO { +public class MenuBaseVO { @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") @NotBlank(message = "菜单名称不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.java new file mode 100644 index 0000000000..a793997ff0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.java @@ -0,0 +1,10 @@ +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import lombok.*; + +@ApiModel("管理后台 - 菜单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MenuCreateReqVO extends MenuBaseVO { +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java similarity index 70% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuListReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java index e0b8a2d026..53b0b46a92 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel("菜单列表 Request VO") +@ApiModel("管理后台 - 菜单列表 Request VO") @Data -public class SysMenuListReqVO { +public class MenuListReqVO { @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuRespVO.java similarity index 79% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuRespVO.java index ed8512ae58..9fe9e12f5c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,12 +9,12 @@ import lombok.NoArgsConstructor; import java.util.Date; -@ApiModel("菜单信息 Response VO") +@ApiModel("管理后台 - 菜单信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class SysMenuRespVO extends SysMenuBaseVO { +public class MenuRespVO extends MenuBaseVO { @ApiModelProperty(value = "菜单编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java similarity index 76% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java index dc160cb966..9274185186 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,11 +6,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("菜单精简信息 Response VO") +@ApiModel("管理后台 - 菜单精简信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor -public class SysMenuSimpleRespVO { +public class MenuSimpleRespVO { @ApiModelProperty(value = "菜单编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.java similarity index 66% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.java index bf44bf94a8..7a17843631 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.menu; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,10 +6,10 @@ import lombok.*; import javax.validation.constraints.NotNull; -@ApiModel("菜单更新 Request VO") +@ApiModel("管理后台 - 菜单更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysMenuUpdateReqVO extends SysMenuBaseVO { +public class MenuUpdateReqVO extends MenuBaseVO { @ApiModelProperty(value = "菜单编号", required = true, example = "1024") @NotNull(message = "菜单编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java similarity index 81% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java index 08feaae0d5..0683ba9b81 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.permission; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.permission; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,9 +8,9 @@ import javax.validation.constraints.NotNull; import java.util.Collections; import java.util.Set; -@ApiModel("赋予角色数据权限 Request VO") +@ApiModel("管理后台 - 赋予角色数据权限 Request VO") @Data -public class SysPermissionAssignRoleDataScopeReqVO { +public class PermissionAssignRoleDataScopeReqVO { @ApiModelProperty(value = "角色编号", required = true, example = "1") @NotNull(message = "角色编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java similarity index 73% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java index 664d6d8e80..3fc4dcb2c0 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.permission; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.permission; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,9 +8,9 @@ import javax.validation.constraints.NotNull; import java.util.Collections; import java.util.Set; -@ApiModel("赋予角色菜单 Request VO") +@ApiModel("管理后台 - 赋予角色菜单 Request VO") @Data -public class SysPermissionAssignRoleMenuReqVO { +public class PermissionAssignRoleMenuReqVO { @ApiModelProperty(value = "角色编号", required = true, example = "1") @NotNull(message = "角色编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java similarity index 73% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java index fdbbedcbd7..75671bcd2c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.permission; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.permission; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,9 +8,9 @@ import javax.validation.constraints.NotNull; import java.util.Collections; import java.util.Set; -@ApiModel("赋予用户角色 Request VO") +@ApiModel("管理后台 - 赋予用户角色 Request VO") @Data -public class SysPermissionAssignUserRoleReqVO { +public class PermissionAssignUserRoleReqVO { @ApiModelProperty(value = "角色编号", required = true, example = "1") @NotNull(message = "角色编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleBaseVO.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleBaseVO.java index a2553fc238..3f027f8dc0 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,7 +12,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysRoleBaseVO { +public class RoleBaseVO { @ApiModelProperty(value = "角色名称", required = true, example = "管理员") @NotBlank(message = "角色名称不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.java new file mode 100644 index 0000000000..785f658158 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 角色创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleCreateReqVO extends RoleBaseVO { + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExcelVO.java similarity index 88% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExcelVO.java index 08a37816f3..bb82f4ab1f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -10,7 +10,7 @@ import lombok.Data; * 角色 Excel 导出响应 VO */ @Data -public class SysRoleExcelVO { +public class RoleExcelVO { @ExcelProperty("角色序号") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java index bc0970878a..339a22ba82 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("角色分页 Request VO") +@ApiModel("管理后台 - 角色分页 Request VO") @Data -public class SysRoleExportReqVO { +public class RoleExportReqVO { @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRolePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RolePageReqVO.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRolePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RolePageReqVO.java index c6e7665e43..d2fed80e5e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRolePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RolePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -11,10 +11,10 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("角色分页 Request VO") +@ApiModel("管理后台 - 角色分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysRolePageReqVO extends PageParam { +public class RolePageReqVO extends PageParam { @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java index ef11d82a30..e7c0e2c3c7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -10,12 +10,12 @@ import lombok.NoArgsConstructor; import java.util.Date; import java.util.Set; -@ApiModel("角色信息 Response VO") +@ApiModel("管理后台 - 角色信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class SysRoleRespVO extends SysRoleBaseVO { +public class RoleRespVO extends RoleBaseVO { @ApiModelProperty(value = "角色编号", required = true, example = "1") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java similarity index 72% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java index a2706f4f4a..c0a4c30838 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,11 +6,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -@ApiModel("角色精简信息 Response VO") +@ApiModel("管理后台 - 角色精简信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor -public class SysRoleSimpleRespVO { +public class RoleSimpleRespVO { @ApiModelProperty(value = "角色编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.java similarity index 68% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.java index c6f56f63a3..362cbb2904 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; -@ApiModel("角色更新 Request VO") +@ApiModel("管理后台 - 角色更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysRoleUpdateReqVO extends SysRoleBaseVO { +public class RoleUpdateReqVO extends RoleBaseVO { @ApiModelProperty(value = "角色编号", required = true, example = "1024") @NotNull(message = "角色编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java similarity index 56% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java index ba861539de..75a658c7ab 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java @@ -1,14 +1,16 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; +package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.validation.InEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; -@ApiModel("角色更新状态 Request VO") +@ApiModel("管理后台 - 角色更新状态 Request VO") @Data -public class SysRoleUpdateStatusReqVO { +public class RoleUpdateStatusReqVO { @ApiModelProperty(value = "角色编号", required = true, example = "1024") @NotNull(message = "角色编号不能为空") @@ -16,7 +18,7 @@ public class SysRoleUpdateStatusReqVO { @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") @NotNull(message = "状态不能为空") -// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SmsCallbackController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java similarity index 95% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SmsCallbackController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java index 0968a1d2fa..f13f188c44 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SmsCallbackController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms; +package cn.iocoder.yudao.module.system.controller.admin.sms; import cn.hutool.core.util.URLUtil; import cn.hutool.extra.servlet.ServletUtil; @@ -19,7 +19,7 @@ import javax.servlet.http.HttpServletRequest; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "短信回调") +@Api(tags = "管理后台 - 短信回调") @RestController @RequestMapping("/system/sms/callback") public class SmsCallbackController { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsChannelController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java similarity index 72% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsChannelController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java index 70c7d7059b..86c9eee6ed 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsChannelController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.module.system.controller.sms; +package cn.iocoder.yudao.module.system.controller.admin.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.*; -import cn.iocoder.yudao.module.system.convert.sms.SysSmsChannelConvert; -import cn.iocoder.yudao.module.system.service.sms.SysSmsChannelService; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.*; +import cn.iocoder.yudao.module.system.convert.sms.SmsChannelConvert; +import cn.iocoder.yudao.module.system.service.sms.SmsChannelService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -19,25 +19,25 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "短信渠道") +@Api(tags = "管理后台 - 短信渠道") @RestController @RequestMapping("system/sms-channel") -public class SysSmsChannelController { +public class SmsChannelController { @Resource - private SysSmsChannelService smsChannelService; + private SmsChannelService smsChannelService; @PostMapping("/create") @ApiOperation("创建短信渠道") @PreAuthorize("@ss.hasPermission('system:sms-channel:create')") - public CommonResult createSmsChannel(@Valid @RequestBody SysSmsChannelCreateReqVO createReqVO) { + public CommonResult createSmsChannel(@Valid @RequestBody SmsChannelCreateReqVO createReqVO) { return success(smsChannelService.createSmsChannel(createReqVO)); } @PutMapping("/update") @ApiOperation("更新短信渠道") @PreAuthorize("@ss.hasPermission('system:sms-channel:update')") - public CommonResult updateSmsChannel(@Valid @RequestBody SysSmsChannelUpdateReqVO updateReqVO) { + public CommonResult updateSmsChannel(@Valid @RequestBody SmsChannelUpdateReqVO updateReqVO) { smsChannelService.updateSmsChannel(updateReqVO); return success(true); } @@ -55,26 +55,26 @@ public class SysSmsChannelController { @ApiOperation("获得短信渠道") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") - public CommonResult getSmsChannel(@RequestParam("id") Long id) { + public CommonResult getSmsChannel(@RequestParam("id") Long id) { SysSmsChannelDO smsChannel = smsChannelService.getSmsChannel(id); - return success(SysSmsChannelConvert.INSTANCE.convert(smsChannel)); + return success(SmsChannelConvert.INSTANCE.convert(smsChannel)); } @GetMapping("/page") @ApiOperation("获得短信渠道分页") @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") - public CommonResult> getSmsChannelPage(@Valid SysSmsChannelPageReqVO pageVO) { + public CommonResult> getSmsChannelPage(@Valid SmsChannelPageReqVO pageVO) { PageResult pageResult = smsChannelService.getSmsChannelPage(pageVO); - return success(SysSmsChannelConvert.INSTANCE.convertPage(pageResult)); + return success(SmsChannelConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/list-all-simple") @ApiOperation(value = "获得短信渠道精简列表", notes = "包含被禁用的短信渠道") - public CommonResult> getSimpleSmsChannels() { + public CommonResult> getSimpleSmsChannels() { List list = smsChannelService.getSmsChannelList(); // 排序后,返回给前端 list.sort(Comparator.comparing(SysSmsChannelDO::getId)); - return success(SysSmsChannelConvert.INSTANCE.convertList03(list)); + return success(SmsChannelConvert.INSTANCE.convertList03(list)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java similarity index 66% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsLogController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java index ee69dee3d1..557e6d31e3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.module.system.controller.sms; +package cn.iocoder.yudao.module.system.controller.admin.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExcelVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogRespVO; -import cn.iocoder.yudao.module.system.convert.sms.SysSmsLogConvert; -import cn.iocoder.yudao.module.system.service.sms.SysSmsLogService; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SysSmsLogRespVO; +import cn.iocoder.yudao.module.system.convert.sms.SmsLogConvert; +import cn.iocoder.yudao.module.system.service.sms.SmsLogService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -28,33 +28,33 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "短信日志") +@Api(tags = "管理后台 - 短信日志") @RestController @RequestMapping("/system/sms-log") @Validated -public class SysSmsLogController { +public class SmsLogController { @Resource - private SysSmsLogService smsLogService; + private SmsLogService smsLogService; @GetMapping("/page") @ApiOperation("获得短信日志分页") @PreAuthorize("@ss.hasPermission('system:sms-log:query')") - public CommonResult> getSmsLogPage(@Valid SysSmsLogPageReqVO pageVO) { + public CommonResult> getSmsLogPage(@Valid SmsLogPageReqVO pageVO) { PageResult pageResult = smsLogService.getSmsLogPage(pageVO); - return success(SysSmsLogConvert.INSTANCE.convertPage(pageResult)); + return success(SmsLogConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出短信日志 Excel") @PreAuthorize("@ss.hasPermission('system:sms-log:export')") @OperateLog(type = EXPORT) - public void exportSmsLogExcel(@Valid SysSmsLogExportReqVO exportReqVO, + public void exportSmsLogExcel(@Valid SmsLogExportReqVO exportReqVO, HttpServletResponse response) throws IOException { List list = smsLogService.getSmsLogList(exportReqVO); // 导出 Excel - List datas = SysSmsLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "短信日志.xls", "数据", SysSmsLogExcelVO.class, datas); + List datas = SmsLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "短信日志.xls", "数据", SmsLogExcelVO.class, datas); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.http similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.http index d5441d057c..3bf59d965f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.http @@ -1,7 +1,8 @@ -### 请求 /menu/list 接口 => 成功 +### 请求 /system/sms-template/send-sms 接口 => 成功 POST {{baseUrl}}/system/sms-template/send-sms Authorization: Bearer {{token}} Content-Type: application/json +tenant-id: {{adminTenentId}} { "code": "test_01", diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java similarity index 74% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java index 9328680e30..2d0adc427b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/SysSmsTemplateController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.module.system.controller.sms; +package cn.iocoder.yudao.module.system.controller.admin.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.*; -import cn.iocoder.yudao.module.system.convert.sms.SysSmsTemplateConvert; -import cn.iocoder.yudao.module.system.service.sms.SysSmsTemplateService; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.*; +import cn.iocoder.yudao.module.system.convert.sms.SmsTemplateConvert; +import cn.iocoder.yudao.module.system.service.sms.SmsTemplateService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; @@ -24,27 +24,27 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "短信模板") +@Api(tags = "管理后台 - 短信模板") @RestController @RequestMapping("/system/sms-template") -public class SysSmsTemplateController { +public class SmsTemplateController { @Resource - private SysSmsTemplateService smsTemplateService; + private SmsTemplateService smsTemplateService; @Resource private SysSmsCoreService smsCoreService; @PostMapping("/create") @ApiOperation("创建短信模板") @PreAuthorize("@ss.hasPermission('system:sms-template:create')") - public CommonResult createSmsTemplate(@Valid @RequestBody SysSmsTemplateCreateReqVO createReqVO) { + public CommonResult createSmsTemplate(@Valid @RequestBody SmsTemplateCreateReqVO createReqVO) { return success(smsTemplateService.createSmsTemplate(createReqVO)); } @PutMapping("/update") @ApiOperation("更新短信模板") @PreAuthorize("@ss.hasPermission('system:sms-template:update')") - public CommonResult updateSmsTemplate(@Valid @RequestBody SysSmsTemplateUpdateReqVO updateReqVO) { + public CommonResult updateSmsTemplate(@Valid @RequestBody SmsTemplateUpdateReqVO updateReqVO) { smsTemplateService.updateSmsTemplate(updateReqVO); return success(true); } @@ -62,35 +62,35 @@ public class SysSmsTemplateController { @ApiOperation("获得短信模板") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:sms-template:query')") - public CommonResult getSmsTemplate(@RequestParam("id") Long id) { + public CommonResult getSmsTemplate(@RequestParam("id") Long id) { SysSmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplate(id); - return success(SysSmsTemplateConvert.INSTANCE.convert(smsTemplate)); + return success(SmsTemplateConvert.INSTANCE.convert(smsTemplate)); } @GetMapping("/page") @ApiOperation("获得短信模板分页") @PreAuthorize("@ss.hasPermission('system:sms-template:query')") - public CommonResult> getSmsTemplatePage(@Valid SysSmsTemplatePageReqVO pageVO) { + public CommonResult> getSmsTemplatePage(@Valid SmsTemplatePageReqVO pageVO) { PageResult pageResult = smsTemplateService.getSmsTemplatePage(pageVO); - return success(SysSmsTemplateConvert.INSTANCE.convertPage(pageResult)); + return success(SmsTemplateConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出短信模板 Excel") @PreAuthorize("@ss.hasPermission('system:sms-template:export')") @OperateLog(type = EXPORT) - public void exportSmsTemplateExcel(@Valid SysSmsTemplateExportReqVO exportReqVO, + public void exportSmsTemplateExcel(@Valid SmsTemplateExportReqVO exportReqVO, HttpServletResponse response) throws IOException { List list = smsTemplateService.getSmsTemplateList(exportReqVO); // 导出 Excel - List datas = SysSmsTemplateConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "短信模板.xls", "数据", SysSmsTemplateExcelVO.class, datas); + List datas = SmsTemplateConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "短信模板.xls", "数据", SmsTemplateExcelVO.class, datas); } @PostMapping("/send-sms") @ApiOperation("发送短信") @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')") - public CommonResult sendSms(@Valid @RequestBody SysSmsTemplateSendReqVO sendReqVO) { + public CommonResult sendSms(@Valid @RequestBody SmsTemplateSendReqVO sendReqVO) { return success(smsCoreService.sendSingleSms(sendReqVO.getMobile(), null, null, sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.java index 04b1f6926a..ab5595fc0a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysSmsChannelBaseVO { +public class SmsChannelBaseVO { @ApiModelProperty(value = "短信签名", required = true, example = "芋道源码") @NotNull(message = "短信签名不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.java index fdf3e98743..edc162f474 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("短信渠道创建 Request VO") +@ApiModel("管理后台 - 短信渠道创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsChannelCreateReqVO extends SysSmsChannelBaseVO { +public class SmsChannelCreateReqVO extends SmsChannelBaseVO { @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") @NotNull(message = "渠道编码不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java index d7d90ec79c..306c7d06f4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("短信渠道分页 Request VO") +@ApiModel("管理后台 - 短信渠道分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsChannelPageReqVO extends PageParam { +public class SmsChannelPageReqVO extends PageParam { @ApiModelProperty(value = "任务状态", example = "1") private Integer status; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java similarity index 76% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java index 02654a0170..b39e35edfd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import java.util.Date; -@ApiModel("短信渠道 Response VO") +@ApiModel("管理后台 - 短信渠道 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsChannelRespVO extends SysSmsChannelBaseVO { +public class SmsChannelRespVO extends SmsChannelBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java index 1cf341f986..22b5bc1d48 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,9 +6,9 @@ import lombok.Data; import javax.validation.constraints.NotNull; -@ApiModel("短信渠道精简 Response VO") +@ApiModel("管理后台 - 短信渠道精简 Response VO") @Data -public class SysSmsChannelSimpleRespVO { +public class SmsChannelSimpleRespVO { @ApiModelProperty(value = "编号", required = true, example = "1024") @NotNull(message = "编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.java index 72ffb28a26..6833287459 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.channel; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("短信渠道更新 Request VO") +@ApiModel("管理后台 - 短信渠道更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsChannelUpdateReqVO extends SysSmsChannelBaseVO { +public class SmsChannelUpdateReqVO extends SmsChannelBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1024") @NotNull(message = "编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java index 1bdc830477..9fb8515df9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.log; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.log; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -16,7 +16,7 @@ import java.util.Map; * @author 芋道源码 */ @Data -public class SysSmsLogExcelVO { +public class SmsLogExcelVO { @ExcelProperty("编号") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java index 3cfd6ca644..7a57aa2ed8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.log; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.log; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "短信日志 Excel 导出 Request VO", description = "参数和 SysSmsLogPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 短信日志 Excel 导出 Request VO", description = "参数和 SysSmsLogPageReqVO 是一致的") @Data -public class SysSmsLogExportReqVO { +public class SmsLogExportReqVO { @ApiModelProperty(value = "短信渠道编号", example = "10") private Long channelId; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java index 94bcc9a705..358427e82d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.log; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.log; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("短信日志分页 Request VO") +@ApiModel("管理后台 - 短信日志分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsLogPageReqVO extends PageParam { +public class SmsLogPageReqVO extends PageParam { @ApiModelProperty(value = "短信渠道编号", example = "10") private Long channelId; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SysSmsLogRespVO.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SysSmsLogRespVO.java index f2a07a0ad7..7377fc1e50 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/log/SysSmsLogRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SysSmsLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.log; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.log; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,7 +7,7 @@ import lombok.Data; import java.util.Date; import java.util.Map; -@ApiModel("短信日志 Response VO") +@ApiModel("管理后台 - 短信日志 Response VO") @Data public class SysSmsLogRespVO { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java index 622316cdc8..9b16fa851e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysSmsTemplateBaseVO { +public class SmsTemplateBaseVO { @ApiModelProperty(value = "短信类型", required = true, example = "1", notes = "参见 SysSmsTemplateTypeEnum 枚举类") @NotNull(message = "短信类型不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.java new file mode 100644 index 0000000000..ab8b89ebd9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("管理后台 - 短信模板创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateCreateReqVO extends SmsTemplateBaseVO { + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java index d3151e621a..eb28c63cb1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -14,7 +14,7 @@ import java.util.Date; * @author 芋道源码 */ @Data -public class SysSmsTemplateExcelVO { +public class SmsTemplateExcelVO { @ExcelProperty("编号") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java index 930fff5580..099be029f4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "短信模板 Excel 导出 Request VO", description = "参数和 SysSmsTemplatePageReqVO 是一致的") +@ApiModel(value = "管理后台 - 短信模板 Excel 导出 Request VO", description = "参数和 SysSmsTemplatePageReqVO 是一致的") @Data -public class SysSmsTemplateExportReqVO { +public class SmsTemplateExportReqVO { @ApiModelProperty(value = "短信签名", example = "1") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java index e0d711ad23..6932d2946b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("短信模板分页 Request VO") +@ApiModel("管理后台 - 短信模板分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsTemplatePageReqVO extends PageParam { +public class SmsTemplatePageReqVO extends PageParam { @ApiModelProperty(value = "短信签名", example = "1") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java similarity index 79% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java index 24fae0ca1f..6633c383b3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,11 +9,11 @@ import lombok.ToString; import java.util.Date; import java.util.List; -@ApiModel("短信模板 Response VO") +@ApiModel("管理后台 - 短信模板 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsTemplateRespVO extends SysSmsTemplateBaseVO { +public class SmsTemplateRespVO extends SmsTemplateBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java index 0b420c1230..956b4839eb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,9 +7,9 @@ import lombok.Data; import javax.validation.constraints.NotNull; import java.util.Map; -@ApiModel("短信模板的发送 Request VO") +@ApiModel("管理后台 - 短信模板的发送 Request VO") @Data -public class SysSmsTemplateSendReqVO { +public class SmsTemplateSendReqVO { @ApiModelProperty(value = "手机号", required = true, example = "15601691300") @NotNull(message = "手机号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.java similarity index 68% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.java index c12a826cc6..86bdbba9a3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.sms.vo.template; +package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("短信模板更新 Request VO") +@ApiModel("管理后台 - 短信模板更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsTemplateUpdateReqVO extends SysSmsTemplateBaseVO { +public class SmsTemplateUpdateReqVO extends SmsTemplateBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1024") @NotNull(message = "编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/SysTenantController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java similarity index 74% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/SysTenantController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java index c4a8ca1400..2b5fc204cd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/SysTenantController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.module.system.controller.tenant; +package cn.iocoder.yudao.module.system.controller.admin.tenant; -import cn.iocoder.yudao.module.system.controller.tenant.vo.*; -import cn.iocoder.yudao.module.system.convert.tenant.SysTenantConvert; -import cn.iocoder.yudao.module.system.service.tenant.SysTenantService; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.*; +import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert; +import cn.iocoder.yudao.module.system.service.tenant.TenantService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -24,13 +24,13 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "租户") +@Api(tags = "管理后台 - 租户") @RestController @RequestMapping("/system/tenant") -public class SysTenantController { +public class TenantController { @Resource - private SysTenantService tenantService; + private TenantService tenantService; @GetMapping("/get-id-by-name") @ApiOperation(value = "使用租户名,获得租户编号", notes = "登录界面,根据用户的租户名,获得租户编号") @@ -43,14 +43,14 @@ public class SysTenantController { @PostMapping("/create") @ApiOperation("创建租户") @PreAuthorize("@ss.hasPermission('system:tenant:create')") - public CommonResult createTenant(@Valid @RequestBody SysTenantCreateReqVO createReqVO) { + public CommonResult createTenant(@Valid @RequestBody TenantCreateReqVO createReqVO) { return success(tenantService.createTenant(createReqVO)); } @PutMapping("/update") @ApiOperation("更新租户") @PreAuthorize("@ss.hasPermission('system:tenant:update')") - public CommonResult updateTenant(@Valid @RequestBody SysTenantUpdateReqVO updateReqVO) { + public CommonResult updateTenant(@Valid @RequestBody TenantUpdateReqVO updateReqVO) { tenantService.updateTenant(updateReqVO); return success(true); } @@ -68,38 +68,38 @@ public class SysTenantController { @ApiOperation("获得租户") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:tenant:query')") - public CommonResult getTenant(@RequestParam("id") Long id) { + public CommonResult getTenant(@RequestParam("id") Long id) { SysTenantDO tenant = tenantService.getTenant(id); - return success(SysTenantConvert.INSTANCE.convert(tenant)); + return success(TenantConvert.INSTANCE.convert(tenant)); } @GetMapping("/list") @ApiOperation("获得租户列表") @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) @PreAuthorize("@ss.hasPermission('system:tenant:query')") - public CommonResult> getTenantList(@RequestParam("ids") Collection ids) { + public CommonResult> getTenantList(@RequestParam("ids") Collection ids) { List list = tenantService.getTenantList(ids); - return success(SysTenantConvert.INSTANCE.convertList(list)); + return success(TenantConvert.INSTANCE.convertList(list)); } @GetMapping("/page") @ApiOperation("获得租户分页") @PreAuthorize("@ss.hasPermission('system:tenant:query')") - public CommonResult> getTenantPage(@Valid SysTenantPageReqVO pageVO) { + public CommonResult> getTenantPage(@Valid TenantPageReqVO pageVO) { PageResult pageResult = tenantService.getTenantPage(pageVO); - return success(SysTenantConvert.INSTANCE.convertPage(pageResult)); + return success(TenantConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出租户 Excel") @PreAuthorize("@ss.hasPermission('system:tenant:export')") @OperateLog(type = EXPORT) - public void exportTenantExcel(@Valid SysTenantExportReqVO exportReqVO, + public void exportTenantExcel(@Valid TenantExportReqVO exportReqVO, HttpServletResponse response) throws IOException { List list = tenantService.getTenantList(exportReqVO); // 导出 Excel - List datas = SysTenantConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "租户.xls", "数据", SysTenantExcelVO.class, datas); + List datas = TenantConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "租户.xls", "数据", TenantExcelVO.class, datas); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantBaseVO.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantBaseVO.java index 593b9aca48..72ee63b9e2 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.admin.tenant.vo; import lombok.*; import io.swagger.annotations.*; @@ -9,7 +9,7 @@ import javax.validation.constraints.*; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysTenantBaseVO { +public class TenantBaseVO { @ApiModelProperty(value = "租户名", required = true, example = "芋道") @NotNull(message = "租户名不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantCreateReqVO.java new file mode 100755 index 0000000000..a7e75cb77f --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantCreateReqVO.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.system.controller.admin.tenant.vo; + +import lombok.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 租户创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantCreateReqVO extends TenantBaseVO { + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExcelVO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExcelVO.java index 8244486279..9b317cb159 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.admin.tenant.vo; import lombok.*; import java.util.*; @@ -14,7 +14,7 @@ import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; * @author 芋道源码 */ @Data -public class SysTenantExcelVO { +public class TenantExcelVO { @ExcelProperty("租户编号") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExportReqVO.java similarity index 82% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExportReqVO.java index e70de00131..afe5e67000 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.admin.tenant.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "租户 Excel 导出 Request VO", description = "参数和 SysTenantPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 租户 Excel 导出 Request VO", description = "参数和 SysTenantPageReqVO 是一致的") @Data -public class SysTenantExportReqVO { +public class TenantExportReqVO { @ApiModelProperty(value = "租户名", example = "芋道") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantPageReqVO.java similarity index 87% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantPageReqVO.java index b665ea3f65..4a11a9cd62 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.admin.tenant.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("租户分页 Request VO") +@ApiModel("管理后台 - 租户分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysTenantPageReqVO extends PageParam { +public class TenantPageReqVO extends PageParam { @ApiModelProperty(value = "租户名", example = "芋道") private String name; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantRespVO.java similarity index 67% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantRespVO.java index 563b5095c4..5b6940a55b 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantRespVO.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.module.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.admin.tenant.vo; import lombok.*; import java.util.*; import io.swagger.annotations.*; -@ApiModel("租户 Response VO") +@ApiModel("管理后台 - 租户 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysTenantRespVO extends SysTenantBaseVO { +public class TenantRespVO extends TenantBaseVO { @ApiModelProperty(value = "租户编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantUpdateReqVO.java similarity index 64% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantUpdateReqVO.java index c24edc5ea7..0e10dabedc 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantUpdateReqVO.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.module.system.controller.tenant.vo; +package cn.iocoder.yudao.module.system.controller.admin.tenant.vo; import lombok.*; import io.swagger.annotations.*; import javax.validation.constraints.*; -@ApiModel("租户更新 Request VO") +@ApiModel("管理后台 - 租户更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysTenantUpdateReqVO extends SysTenantBaseVO { +public class TenantUpdateReqVO extends TenantBaseVO { @ApiModelProperty(value = "租户编号", required = true, example = "1024") @NotNull(message = "租户编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.http similarity index 63% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.http index ce138afcdb..6d9cea8010 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.http @@ -1,4 +1,4 @@ ### 请求 /system/user/page 接口 => 没有权限 GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10 -Authorization: Bearer test1 # 使用测试账号 -tenant-id: 1 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java similarity index 76% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 9e03727d46..ddf19aec84 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.module.system.controller.user; +package cn.iocoder.yudao.module.system.controller.admin.user; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.controller.user.vo.user.*; -import cn.iocoder.yudao.module.system.convert.user.SysUserConvert; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; +import cn.iocoder.yudao.module.system.convert.user.UserConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.service.user.UserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; @@ -35,14 +35,14 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "用户") +@Api(tags = "管理后台 - 用户") @RestController @RequestMapping("/system/user") @Validated -public class SysUserController { +public class UserController { @Resource - private SysUserService userService; + private UserService userService; @Resource private SysUserCoreService userCoreService; @Resource @@ -51,7 +51,7 @@ public class SysUserController { @PostMapping("/create") @ApiOperation("新增用户") @PreAuthorize("@ss.hasPermission('system:user:create')") - public CommonResult createUser(@Valid @RequestBody SysUserCreateReqVO reqVO) { + public CommonResult createUser(@Valid @RequestBody UserCreateReqVO reqVO) { Long id = userService.createUser(reqVO); return success(id); } @@ -59,7 +59,7 @@ public class SysUserController { @PutMapping("update") @ApiOperation("修改用户") @PreAuthorize("@ss.hasPermission('system:user:update')") - public CommonResult updateUser(@Valid @RequestBody SysUserUpdateReqVO reqVO) { + public CommonResult updateUser(@Valid @RequestBody UserUpdateReqVO reqVO) { userService.updateUser(reqVO); return success(true); } @@ -76,7 +76,7 @@ public class SysUserController { @PutMapping("/update-password") @ApiOperation("重置用户密码") @PreAuthorize("@ss.hasPermission('system:user:update-password')") - public CommonResult updateUserPassword(@Valid @RequestBody SysUserUpdatePasswordReqVO reqVO) { + public CommonResult updateUserPassword(@Valid @RequestBody UserUpdatePasswordReqVO reqVO) { userService.updateUserPassword(reqVO.getId(), reqVO.getPassword()); return success(true); } @@ -84,7 +84,7 @@ public class SysUserController { @PutMapping("/update-status") @ApiOperation("修改用户状态") @PreAuthorize("@ss.hasPermission('system:user:update')") - public CommonResult updateUserStatus(@Valid @RequestBody SysUserUpdateStatusReqVO reqVO) { + public CommonResult updateUserStatus(@Valid @RequestBody UserUpdateStatusReqVO reqVO) { userService.updateUserStatus(reqVO.getId(), reqVO.getStatus()); return success(true); } @@ -92,7 +92,7 @@ public class SysUserController { @GetMapping("/page") @ApiOperation("获得用户分页列表") @PreAuthorize("@ss.hasPermission('system:user:list')") - public CommonResult> getUserPage(@Valid SysUserPageReqVO reqVO) { + public CommonResult> getUserPage(@Valid UserPageReqVO reqVO) { // 获得用户分页列表 PageResult pageResult = userService.getUserPage(reqVO); if (CollUtil.isEmpty(pageResult.getList())) { @@ -103,10 +103,10 @@ public class SysUserController { Collection deptIds = convertList(pageResult.getList(), SysUserDO::getDeptId); Map deptMap = deptCoreService.getDeptMap(deptIds); // 拼接结果返回 - List userList = new ArrayList<>(pageResult.getList().size()); + List userList = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(user -> { - SysUserPageItemRespVO respVO = SysUserConvert.INSTANCE.convert(user); - respVO.setDept(SysUserConvert.INSTANCE.convert(deptMap.get(user.getDeptId()))); + UserPageItemRespVO respVO = UserConvert.INSTANCE.convert(user); + respVO.setDept(UserConvert.INSTANCE.convert(deptMap.get(user.getDeptId()))); userList.add(respVO); }); return success(new PageResult<>(userList, pageResult.getTotal())); @@ -114,26 +114,26 @@ public class SysUserController { @GetMapping("/list-all-simple") @ApiOperation(value = "获取用户精简信息列表", notes = "只包含被开启的用户,主要用于前端的下拉选项") - public CommonResult> getSimpleUsers() { + public CommonResult> getSimpleUsers() { // 获用户门列表,只要开启状态的 List list = userService.getUsersByStatus(CommonStatusEnum.ENABLE.getStatus()); // 排序后,返回给前端 - return success(SysUserConvert.INSTANCE.convertList04(list)); + return success(UserConvert.INSTANCE.convertList04(list)); } @GetMapping("/get") @ApiOperation("获得用户详情") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:user:query')") - public CommonResult getInfo(@RequestParam("id") Long id) { - return success(SysUserConvert.INSTANCE.convert(userCoreService.getUser(id))); + public CommonResult getInfo(@RequestParam("id") Long id) { + return success(UserConvert.INSTANCE.convert(userCoreService.getUser(id))); } @GetMapping("/export") @ApiOperation("导出用户") @PreAuthorize("@ss.hasPermission('system:user:export')") @OperateLog(type = EXPORT) - public void exportUsers(@Validated SysUserExportReqVO reqVO, + public void exportUsers(@Validated UserExportReqVO reqVO, HttpServletResponse response) throws IOException { // 获得用户列表 List users = userService.getUsers(reqVO); @@ -143,9 +143,9 @@ public class SysUserController { Map deptMap = deptCoreService.getDeptMap(deptIds); Map deptLeaderUserMap = userCoreService.getUserMap(convertSet(deptMap.values(), SysDeptDO::getLeaderUserId)); // 拼接数据 - List excelUsers = new ArrayList<>(users.size()); + List excelUsers = new ArrayList<>(users.size()); users.forEach(user -> { - SysUserExcelVO excelVO = SysUserConvert.INSTANCE.convert02(user); + UserExcelVO excelVO = UserConvert.INSTANCE.convert02(user); // 设置部门 MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> { excelVO.setDeptName(dept.getName()); @@ -157,22 +157,22 @@ public class SysUserController { }); // 输出 - ExcelUtils.write(response, "用户数据.xls", "用户列表", SysUserExcelVO.class, excelUsers); + ExcelUtils.write(response, "用户数据.xls", "用户列表", UserExcelVO.class, excelUsers); } @GetMapping("/get-import-template") @ApiOperation("获得导入用户模板") public void importTemplate(HttpServletResponse response) throws IOException { // 手动创建导出 demo - List list = Arrays.asList( - SysUserImportExcelVO.builder().username("yudao").deptId(1L).email("yudao@iocoder.cn").mobile("15601691300") + List list = Arrays.asList( + UserImportExcelVO.builder().username("yudao").deptId(1L).email("yudao@iocoder.cn").mobile("15601691300") .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SysSexEnum.MALE.getSex()).build(), - SysUserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") + UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SysSexEnum.FEMALE.getSex()).build() ); // 输出 - ExcelUtils.write(response, "用户导入模板.xls", "用户列表", SysUserImportExcelVO.class, list); + ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); } @PostMapping("/import") @@ -182,9 +182,9 @@ public class SysUserController { @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Boolean.class) }) @PreAuthorize("@ss.hasPermission('system:user:import')") - public CommonResult importExcel(@RequestParam("file") MultipartFile file, - @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { - List list = ExcelUtils.read(file, SysUserImportExcelVO.class); + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, UserImportExcelVO.class); return success(userService.importUsers(list, updateSupport)); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.http similarity index 61% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.http rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.http index c0a817727c..f06037b37b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.http @@ -1,3 +1,4 @@ ### 请求 /system/user/profile/get 接口 => 没有权限 GET {{baseUrl}}/system/user/profile/get -Authorization: Bearer test1 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java index 8a38f8724c..4745b2f5bd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/SysUserProfileController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.module.system.controller.user; +package cn.iocoder.yudao.module.system.controller.admin.user; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileRespVO; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.user.SysUserConvert; -import cn.iocoder.yudao.module.system.service.dept.SysPostService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.module.system.service.permission.SysRoleService; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.user.UserConvert; +import cn.iocoder.yudao.module.system.service.dept.PostService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; +import cn.iocoder.yudao.module.system.service.permission.RoleService; +import cn.iocoder.yudao.module.system.service.user.UserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; @@ -32,68 +32,68 @@ import javax.validation.Valid; import java.io.IOException; import java.util.List; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.FILE_IS_EMPTY; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -@Api(tags = "用户个人中心") +@Api(tags = "管理后台 - 用户个人中心") @RestController @RequestMapping("/system/user/profile") @Validated @Slf4j -public class SysUserProfileController { +public class UserProfileController { @Resource - private SysUserService userService; + private UserService userService; @Resource private SysUserCoreService userCoreService; @Resource private SysDeptCoreService deptCoreService; @Resource - private SysPostService postService; + private PostService postService; @Resource - private SysPermissionService permissionService; + private PermissionService permissionService; @Resource - private SysRoleService roleService; + private RoleService roleService; @Resource private SysSocialCoreService socialService; @GetMapping("/get") @ApiOperation("获得登录用户信息") - public CommonResult profile() { + public CommonResult profile() { // 获得用户基本信息 SysUserDO user = userCoreService.getUser(getLoginUserId()); - SysUserProfileRespVO resp = SysUserConvert.INSTANCE.convert03(user); + UserProfileRespVO resp = UserConvert.INSTANCE.convert03(user); // 获得用户角色 List userRoles = roleService.getRolesFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); - resp.setRoles(SysUserConvert.INSTANCE.convertList(userRoles)); + resp.setRoles(UserConvert.INSTANCE.convertList(userRoles)); // 获得部门信息 if (user.getDeptId() != null) { SysDeptDO dept = deptCoreService.getDept(user.getDeptId()); - resp.setDept(SysUserConvert.INSTANCE.convert02(dept)); + resp.setDept(UserConvert.INSTANCE.convert02(dept)); } // 获得岗位信息 if (CollUtil.isNotEmpty(user.getPostIds())) { List posts = postService.getPosts(user.getPostIds()); - resp.setPosts(SysUserConvert.INSTANCE.convertList02(posts)); + resp.setPosts(UserConvert.INSTANCE.convertList02(posts)); } // 获得社交用户信息 List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN); - resp.setSocialUsers(SysUserConvert.INSTANCE.convertList03(socialUsers)); + resp.setSocialUsers(UserConvert.INSTANCE.convertList03(socialUsers)); return success(resp); } @PutMapping("/update") @ApiOperation("修改用户个人信息") - public CommonResult updateUserProfile(@Valid @RequestBody SysUserProfileUpdateReqVO reqVO) { + public CommonResult updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) { userService.updateUserProfile(getLoginUserId(), reqVO); return success(true); } @PutMapping("/update-password") @ApiOperation("修改用户个人密码") - public CommonResult updateUserProfilePassword(@Valid @RequestBody SysUserProfileUpdatePasswordReqVO reqVO) { + public CommonResult updateUserProfilePassword(@Valid @RequestBody UserProfileUpdatePasswordReqVO reqVO) { userService.updateUserPassword(getLoginUserId(), reqVO); return success(true); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java index 0abd7037a3..788c91feb2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.profile; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.profile; -import cn.iocoder.yudao.module.system.controller.user.vo.user.SysUserBaseVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserBaseVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -16,8 +16,8 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) @NoArgsConstructor @AllArgsConstructor -@ApiModel("用户个人中心信息 Response VO") -public class SysUserProfileRespVO extends SysUserBaseVO { +@ApiModel("管理后台 - 用户个人中心信息 Response VO") +public class UserProfileRespVO extends UserBaseVO { @ApiModelProperty(value = "用户编号", required = true, example = "1") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java index 0578f3ceda..2269b37df5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.profile; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.profile; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,9 +7,9 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; -@ApiModel("用户个人中心更新密码 Request VO") +@ApiModel("管理后台 - 用户个人中心更新密码 Request VO") @Data -public class SysUserProfileUpdatePasswordReqVO { +public class UserProfileUpdatePasswordReqVO { @ApiModelProperty(value = "旧密码", required = true, example = "123456") @NotEmpty(message = "旧密码不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java index bcc7a20489..4f0f8f9531 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.profile; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.profile; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,9 +8,9 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Email; import javax.validation.constraints.Size; -@ApiModel("用户个人信息更新 Request VO") +@ApiModel("管理后台 - 用户个人信息更新 Request VO") @Data -public class SysUserProfileUpdateReqVO { +public class UserProfileUpdateReqVO { @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") @Size(max = 30, message = "用户昵称长度不能超过30个字符") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserBaseVO.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserBaseVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserBaseVO.java index 5fc0b42b92..a4be1fd8dd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -14,7 +14,7 @@ import java.util.Set; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class SysUserBaseVO { +public class UserBaseVO { @ApiModelProperty(value = "用户账号", required = true, example = "yudao") @NotBlank(message = "用户账号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserCreateReqVO.java similarity index 74% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserCreateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserCreateReqVO.java index 9b6676c97a..9d0ff1988d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; @@ -9,10 +9,10 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; -@ApiModel("用户创建 Request VO") +@ApiModel("管理后台 - 用户创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysUserCreateReqVO extends SysUserBaseVO { +public class UserCreateReqVO extends UserBaseVO { @ApiModelProperty(value = "密码", required = true, example = "123456") @NotEmpty(message = "密码不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExcelVO.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExcelVO.java index 04c818ee51..b67010ca69 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -12,7 +12,7 @@ import java.util.Date; * 用户 Excel 导出 VO */ @Data -public class SysUserExcelVO { +public class UserExcelVO { @ExcelProperty("用户编号") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExportReqVO.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExportReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExportReqVO.java index e5f33deb3b..1c1044a5cd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -11,11 +11,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "用户导出 Request VO", description = "参数和 SysUserPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 用户导出 Request VO", description = "参数和 SysUserPageReqVO 是一致的") @Data @NoArgsConstructor @AllArgsConstructor -public class SysUserExportReqVO { +public class UserExportReqVO { @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") private String username; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportExcelVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java index 43e6c9d26e..b2e084af03 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -18,7 +18,7 @@ import lombok.experimental.Accessors; @AllArgsConstructor @NoArgsConstructor @Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 -public class SysUserImportExcelVO { +public class UserImportExcelVO { @ExcelProperty("登录名称") private String username; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportRespVO.java similarity index 80% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportRespVO.java index 533ec2af8d..49f9b98d1e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserImportRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,10 +8,10 @@ import lombok.Data; import java.util.List; import java.util.Map; -@ApiModel("用户导入 Response VO") +@ApiModel("管理后台 - 用户导入 Response VO") @Data @Builder -public class SysUserImportRespVO { +public class UserImportRespVO { @ApiModelProperty(value = "创建成功的用户名数组", required = true) private List createUsernames; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageItemRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageItemRespVO.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageItemRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageItemRespVO.java index 6178d6b809..bcfe9ea23b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageItemRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,12 +7,12 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -@ApiModel(value = "用户分页时的信息 Response VO", description = "相比用户基本信息来说,会多部门信息") +@ApiModel(value = "管理后台 - 用户分页时的信息 Response VO", description = "相比用户基本信息来说,会多部门信息") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class SysUserPageItemRespVO extends SysUserRespVO { +public class UserPageItemRespVO extends UserRespVO { /** * 所在部门 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java index a677d208c2..1c6073d168 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -13,12 +13,12 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("用户分页 Request VO") +@ApiModel("管理后台 - 用户分页 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class SysUserPageReqVO extends PageParam { +public class UserPageReqVO extends PageParam { @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") private String username; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java similarity index 83% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java index 66d8f6981b..fb50609b02 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,12 +6,12 @@ import lombok.*; import java.util.Date; -@ApiModel("用户信息 Response VO") +@ApiModel("管理后台 - 用户信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class SysUserRespVO extends SysUserBaseVO { +public class UserRespVO extends UserBaseVO { @ApiModelProperty(value = "用户编号", required = true, example = "1") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserSimpleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java similarity index 82% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserSimpleRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java index d9ba0eb055..a815253e94 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -10,7 +10,7 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor -public class SysUserSimpleRespVO { +public class UserSimpleRespVO { @ApiModelProperty(value = "用户编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java similarity index 79% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java index 71e458654d..542fc2b0f2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,9 +8,9 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("用户更新密码 Request VO") +@ApiModel("管理后台 - 用户更新密码 Request VO") @Data -public class SysUserUpdatePasswordReqVO { +public class UserUpdatePasswordReqVO { @ApiModelProperty(value = "用户编号", required = true, example = "1024") @NotNull(message = "用户编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateReqVO.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateReqVO.java index 6513490d1f..84a3de60fe 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,10 +7,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; -@ApiModel("用户更新 Request VO") +@ApiModel("管理后台 - 用户更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class SysUserUpdateReqVO extends SysUserBaseVO { +public class UserUpdateReqVO extends UserBaseVO { @ApiModelProperty(value = "用户编号", required = true, example = "1024") @NotNull(message = "用户编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java index ac20eb7454..f72897527e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.controller.user.vo.user; +package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,9 +6,9 @@ import lombok.Data; import javax.validation.constraints.NotNull; -@ApiModel("用户更新状态 Request VO") +@ApiModel("管理后台 - 用户更新状态 Request VO") @Data -public class SysUserUpdateStatusReqVO { +public class UserUpdateStatusReqVO { @ApiModelProperty(value = "用户编号", required = true, example = "1024") @NotNull(message = "角色编号不能为空") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/app/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/app/package-info.java new file mode 100644 index 0000000000..9e4739f4c4 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位,避免 package 无法提交到 Git 仓库 + */ +package cn.iocoder.yudao.module.system.controller.app; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostCreateReqVO.java deleted file mode 100644 index 9570ad07a3..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dept/vo/post/SysPostCreateReqVO.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.iocoder.yudao.module.system.controller.dept.vo.post; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("岗位创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysPostCreateReqVO extends SysPostBaseVO { -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataCreateReqVO.java deleted file mode 100644 index c2688b3e30..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/dict/vo/data/SysDictDataCreateReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.yudao.module.system.controller.dict.vo.data; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("字典数据创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDictDataCreateReqVO extends SysDictDataBaseVO { - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java deleted file mode 100644 index 3eb9b14a45..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.yudao.module.system.controller.errorcode.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("错误码创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysErrorCodeCreateReqVO extends SysErrorCodeBaseVO { - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeCreateReqVO.java deleted file mode 100644 index 1669618ab8..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/notice/vo/SysNoticeCreateReqVO.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.iocoder.yudao.module.system.controller.notice.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("通知公告创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysNoticeCreateReqVO extends SysNoticeBaseVO { -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/package-info.java new file mode 100644 index 0000000000..659a909478 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package cn.iocoder.yudao.module.system.controller; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuCreateReqVO.java deleted file mode 100644 index 2c0357f864..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/menu/SysMenuCreateReqVO.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.menu; - -import io.swagger.annotations.ApiModel; -import lombok.*; - -@ApiModel("菜单创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysMenuCreateReqVO extends SysMenuBaseVO { -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleCreateReqVO.java deleted file mode 100644 index a182b26c9c..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/permission/vo/role/SysRoleCreateReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.yudao.module.system.controller.permission.vo.role; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("角色创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysRoleCreateReqVO extends SysRoleBaseVO { - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantCreateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantCreateReqVO.java deleted file mode 100755 index 4d41fdfe0d..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/tenant/vo/SysTenantCreateReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.yudao.module.system.controller.tenant.vo; - -import lombok.*; -import io.swagger.annotations.*; - -@ApiModel("租户创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysTenantCreateReqVO extends SysTenantBaseVO { - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysAuthConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java similarity index 66% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysAuthConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java index c1f6f265db..be76b5fdd2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysAuthConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.convert.auth; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthMenuRespVO; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthMenuRespVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthPermissionInfoRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; @@ -17,9 +17,9 @@ import org.slf4j.LoggerFactory; import java.util.*; @Mapper -public interface SysAuthConvert { +public interface AuthConvert { - SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); + AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略 LoginUser convert0(SysUserDO bean); @@ -29,15 +29,15 @@ public interface SysAuthConvert { return convert0(bean).setUserType(UserTypeEnum.ADMIN.getValue()); } - default SysAuthPermissionInfoRespVO convert(SysUserDO user, List roleList, List menuList) { - return SysAuthPermissionInfoRespVO.builder() - .user(SysAuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build()) + default AuthPermissionInfoRespVO convert(SysUserDO user, List roleList, List menuList) { + return AuthPermissionInfoRespVO.builder() + .user(AuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build()) .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode)) - .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission)) + .permissions(CollectionUtils.convertSet(menuList, MenuDO::getPermission)) .build(); } - SysAuthMenuRespVO convertTreeNode(SysMenuDO menu); + AuthMenuRespVO convertTreeNode(MenuDO menu); /** * 将菜单列表,构建成菜单树 @@ -45,17 +45,17 @@ public interface SysAuthConvert { * @param menuList 菜单列表 * @return 菜单树 */ - default List buildMenuTree(List menuList) { + default List buildMenuTree(List menuList) { // 排序,保证菜单的有序性 - menuList.sort(Comparator.comparing(SysMenuDO::getSort)); + menuList.sort(Comparator.comparing(MenuDO::getSort)); // 构建菜单树 // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。 - Map treeNodeMap = new LinkedHashMap<>(); - menuList.forEach(menu -> treeNodeMap.put(menu.getId(), SysAuthConvert.INSTANCE.convertTreeNode(menu))); + Map treeNodeMap = new LinkedHashMap<>(); + menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu))); // 处理父子关系 treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach(childNode -> { // 获得父节点 - SysAuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId()); + AuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId()); if (parentNode == null) { LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", childNode.getId(), childNode.getParentId()); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysUserSessionConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysUserSessionConvert.java deleted file mode 100644 index 629f030074..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/SysUserSessionConvert.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.auth; - -import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SysUserSessionConvert { - - SysUserSessionConvert INSTANCE = Mappers.getMapper(SysUserSessionConvert.class); - - SysUserSessionPageItemRespVO convert(SysUserSessionDO session); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java new file mode 100644 index 0000000000..37cec9ee46 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.system.convert.auth; + +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageItemRespVO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface UserSessionConvert { + + UserSessionConvert INSTANCE = Mappers.getMapper(UserSessionConvert.class); + + UserSessionPageItemRespVO convert(SysUserSessionDO session); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/CaptchaConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/CaptchaConvert.java new file mode 100644 index 0000000000..54d36bee9a --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/CaptchaConvert.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.module.system.convert.common; + +import cn.hutool.captcha.AbstractCaptcha; +import cn.iocoder.yudao.module.system.controller.admin.common.vo.CaptchaImageRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface CaptchaConvert { + + CaptchaConvert INSTANCE = Mappers.getMapper(CaptchaConvert.class); + + default CaptchaImageRespVO convert(String uuid, AbstractCaptcha captcha) { + return CaptchaImageRespVO.builder().uuid(uuid).img(captcha.getImageBase64()).build(); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/SysCaptchaConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/SysCaptchaConvert.java deleted file mode 100644 index 8e5fc34a6b..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/common/SysCaptchaConvert.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.common; - -import cn.hutool.captcha.AbstractCaptcha; -import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SysCaptchaConvert { - - SysCaptchaConvert INSTANCE = Mappers.getMapper(SysCaptchaConvert.class); - - default SysCaptchaImageRespVO convert(String uuid, AbstractCaptcha captcha) { - return SysCaptchaImageRespVO.builder().uuid(uuid).img(captcha.getImageBase64()).build(); - } - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java new file mode 100644 index 0000000000..2d1c4d6c1d --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.convert.dept; + +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DeptConvert { + + DeptConvert INSTANCE = Mappers.getMapper(DeptConvert.class); + + List convertList(List list); + + List convertList02(List list); + + DeptRespVO convert(SysDeptDO bean); + + SysDeptDO convert(DeptCreateReqVO bean); + + SysDeptDO convert(DeptUpdateReqVO bean); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java new file mode 100644 index 0000000000..99af8b91ac --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.convert.dept; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.*; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface PostConvert { + + PostConvert INSTANCE = Mappers.getMapper(PostConvert.class); + + List convertList02(List list); + + PageResult convertPage(PageResult page); + + PostRespVO convert(SysPostDO id); + + SysPostDO convert(PostCreateReqVO bean); + + SysPostDO convert(PostUpdateReqVO reqVO); + + List convertList03(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysDeptConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysDeptConvert.java deleted file mode 100644 index 40d667641d..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysDeptConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.dept; - -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptRespVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptSimpleRespVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysDeptConvert { - - SysDeptConvert INSTANCE = Mappers.getMapper(SysDeptConvert.class); - - List convertList(List list); - - List convertList02(List list); - - SysDeptRespVO convert(SysDeptDO bean); - - SysDeptDO convert(SysDeptCreateReqVO bean); - - SysDeptDO convert(SysDeptUpdateReqVO bean); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysPostConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysPostConvert.java deleted file mode 100644 index 023bcfae13..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/SysPostConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.dept; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysPostConvert { - - SysPostConvert INSTANCE = Mappers.getMapper(SysPostConvert.class); - - List convertList02(List list); - - PageResult convertPage(PageResult page); - - SysPostRespVO convert(SysPostDO id); - - SysPostDO convert(SysPostCreateReqVO bean); - - SysPostDO convert(SysPostUpdateReqVO reqVO); - - List convertList03(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java new file mode 100644 index 0000000000..33958c325b --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.convert.dict; + +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.*; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface DictDataConvert { + + DictDataConvert INSTANCE = Mappers.getMapper(DictDataConvert.class); + + List convertList(List list); + + DictDataRespVO convert(SysDictDataDO bean); + + PageResult convertPage(PageResult page); + + SysDictDataDO convert(DictDataUpdateReqVO bean); + + SysDictDataDO convert(DictDataCreateReqVO bean); + + List convertList02(List bean); + + DictDataRespDTO convert02(SysDictDataDO bean); + + List convertList03(Collection list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictTypeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictTypeConvert.java new file mode 100644 index 0000000000..392e3082e7 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictTypeConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.convert.dict; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.*; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DictTypeConvert { + + DictTypeConvert INSTANCE = Mappers.getMapper(DictTypeConvert.class); + + PageResult convertPage(PageResult bean); + + DictTypeRespVO convert(DictTypeDO bean); + + DictTypeDO convert(DictTypeCreateReqVO bean); + + DictTypeDO convert(DictTypeUpdateReqVO bean); + + List convertList(List list); + + List convertList02(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataConvert.java deleted file mode 100644 index fc38f41626..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataConvert.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.dict; - -import cn.iocoder.yudao.module.system.controller.dict.vo.data.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysDictDataConvert { - - SysDictDataConvert INSTANCE = Mappers.getMapper(SysDictDataConvert.class); - - List convertList(List list); - - SysDictDataRespVO convert(SysDictDataDO bean); - - PageResult convertPage(PageResult page); - - SysDictDataDO convert(SysDictDataUpdateReqVO bean); - - SysDictDataDO convert(SysDictDataCreateReqVO bean); - - List convertList02(List bean); - - DictDataRespDTO convert02(SysDictDataDO bean); - - List convertList03(Collection list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictTypeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictTypeConvert.java deleted file mode 100644 index ce4bae4066..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictTypeConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.dict; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.*; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysDictTypeConvert { - - SysDictTypeConvert INSTANCE = Mappers.getMapper(SysDictTypeConvert.class); - - PageResult convertPage(PageResult bean); - - SysDictTypeRespVO convert(SysDictTypeDO bean); - - SysDictTypeDO convert(SysDictTypeCreateReqVO bean); - - SysDictTypeDO convert(SysDictTypeUpdateReqVO bean); - - List convertList(List list); - - List convertList02(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/ErrorCodeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/ErrorCodeConvert.java new file mode 100644 index 0000000000..0402aca8b4 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/ErrorCodeConvert.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.system.convert.errorcode; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeRespDTO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 错误码 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface ErrorCodeConvert { + + ErrorCodeConvert INSTANCE = Mappers.getMapper(ErrorCodeConvert.class); + + ErrorCodeDO convert(ErrorCodeCreateReqVO bean); + + ErrorCodeDO convert(ErrorCodeUpdateReqVO bean); + + ErrorCodeRespVO convert(ErrorCodeDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean); + + List convertList03(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/SysErrorCodeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/SysErrorCodeConvert.java deleted file mode 100644 index 7a571dc45e..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/errorcode/SysErrorCodeConvert.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.errorcode; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeRespDTO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExcelVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeRespVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 错误码 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface SysErrorCodeConvert { - - SysErrorCodeConvert INSTANCE = Mappers.getMapper(SysErrorCodeConvert.class); - - SysErrorCodeDO convert(SysErrorCodeCreateReqVO bean); - - SysErrorCodeDO convert(SysErrorCodeUpdateReqVO bean); - - SysErrorCodeRespVO convert(SysErrorCodeDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - - SysErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean); - - List convertList03(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java new file mode 100644 index 0000000000..3d375b0046 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.system.convert.logger; + +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface LoginLogConvert { + + LoginLogConvert INSTANCE = Mappers.getMapper(LoginLogConvert.class); + + PageResult convertPage(PageResult page); + + List convertList(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysOperateLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java similarity index 54% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysOperateLogConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java index 901e321a0a..bc5cd690ec 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysOperateLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.convert.logger; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogRespVO; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; @@ -17,25 +17,25 @@ import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; @Mapper -public interface SysOperateLogConvert { +public interface OperateLogConvert { - SysOperateLogConvert INSTANCE = Mappers.getMapper(SysOperateLogConvert.class); + OperateLogConvert INSTANCE = Mappers.getMapper(OperateLogConvert.class); - SysOperateLogDO convert(OperateLogCreateReqDTO bean); + OperateLogDO convert(OperateLogCreateReqDTO bean); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - SysOperateLogRespVO convert(SysOperateLogDO bean); + OperateLogRespVO convert(OperateLogDO bean); - default List convertList(List list, Map userMap) { + default List convertList(List list, Map userMap) { return list.stream().map(operateLog -> { - SysOperateLogExcelVO excelVO = convert02(operateLog); + OperateLogExcelVO excelVO = convert02(operateLog); MapUtils.findAndThen(userMap, operateLog.getId(), user -> excelVO.setUserNickname(user.getNickname())); excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); return excelVO; }).collect(Collectors.toList()); } - SysOperateLogExcelVO convert02(SysOperateLogDO bean); + OperateLogExcelVO convert02(OperateLogDO bean); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogConvert.java deleted file mode 100644 index 01b9adabba..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.logger; - -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogRespVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysLoginLogConvert { - - SysLoginLogConvert INSTANCE = Mappers.getMapper(SysLoginLogConvert.class); - - PageResult convertPage(PageResult page); - - List convertList(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java new file mode 100644 index 0000000000..ad2bedec76 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.system.convert.notice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeRespVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface NoticeConvert { + + NoticeConvert INSTANCE = Mappers.getMapper(NoticeConvert.class); + + PageResult convertPage(PageResult page); + + NoticeRespVO convert(NoticeDO bean); + + NoticeDO convert(NoticeUpdateReqVO bean); + + NoticeDO convert(NoticeCreateReqVO bean); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/SysNoticeConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/SysNoticeConvert.java deleted file mode 100644 index bf46d698b0..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/notice/SysNoticeConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.notice; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeRespVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SysNoticeConvert { - - SysNoticeConvert INSTANCE = Mappers.getMapper(SysNoticeConvert.class); - - PageResult convertPage(PageResult page); - - SysNoticeRespVO convert(SysNoticeDO bean); - - SysNoticeDO convert(SysNoticeUpdateReqVO bean); - - SysNoticeDO convert(SysNoticeCreateReqVO bean); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/MenuConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/MenuConvert.java new file mode 100644 index 0000000000..0fb3505cce --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/MenuConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.convert.permission; + +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuRespVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSimpleRespVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface MenuConvert { + + MenuConvert INSTANCE = Mappers.getMapper(MenuConvert.class); + + List convertList(List list); + + MenuDO convert(MenuCreateReqVO bean); + + MenuDO convert(MenuUpdateReqVO bean); + + MenuRespVO convert(MenuDO bean); + + List convertList02(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java new file mode 100644 index 0000000000..c9e1098ae4 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.system.convert.permission; + +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface RoleConvert { + + RoleConvert INSTANCE = Mappers.getMapper(RoleConvert.class); + + SysRoleDO convert(RoleUpdateReqVO bean); + + RoleRespVO convert(SysRoleDO bean); + + SysRoleDO convert(RoleCreateReqVO bean); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysMenuConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysMenuConvert.java deleted file mode 100644 index 109a53f568..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysMenuConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.permission; - -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuRespVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuSimpleRespVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysMenuConvert { - - SysMenuConvert INSTANCE = Mappers.getMapper(SysMenuConvert.class); - - List convertList(List list); - - SysMenuDO convert(SysMenuCreateReqVO bean); - - SysMenuDO convert(SysMenuUpdateReqVO bean); - - SysMenuRespVO convert(SysMenuDO bean); - - List convertList02(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysRoleConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysRoleConvert.java deleted file mode 100644 index bc048a774b..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/SysRoleConvert.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.permission; - -import cn.iocoder.yudao.module.system.controller.permission.vo.role.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysRoleConvert { - - SysRoleConvert INSTANCE = Mappers.getMapper(SysRoleConvert.class); - - SysRoleDO convert(SysRoleUpdateReqVO bean); - - SysRoleRespVO convert(SysRoleDO bean); - - SysRoleDO convert(SysRoleCreateReqVO bean); - - List convertList02(List list); - - List convertList03(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java new file mode 100644 index 0000000000..3885b7a1cd --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.system.convert.sms; + +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelRespVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelSimpleRespVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 短信渠道 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface SmsChannelConvert { + + SmsChannelConvert INSTANCE = Mappers.getMapper(SmsChannelConvert.class); + + SysSmsChannelDO convert(SmsChannelCreateReqVO bean); + + SysSmsChannelDO convert(SmsChannelUpdateReqVO bean); + + SmsChannelRespVO convert(SysSmsChannelDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java similarity index 62% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsLogConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java index d91f7b3269..f5110b3716 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.convert.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExcelVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogRespVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SysSmsLogRespVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; @@ -15,9 +15,9 @@ import java.util.List; * @author 芋道源码 */ @Mapper -public interface SysSmsLogConvert { +public interface SmsLogConvert { - SysSmsLogConvert INSTANCE = Mappers.getMapper(SysSmsLogConvert.class); + SmsLogConvert INSTANCE = Mappers.getMapper(SmsLogConvert.class); SysSmsLogRespVO convert(SysSmsLogDO bean); @@ -25,6 +25,6 @@ public interface SysSmsLogConvert { PageResult convertPage(PageResult page); - List convertList02(List list); + List convertList02(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java new file mode 100644 index 0000000000..bc83e1e85f --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.convert.sms; + +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateRespVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SmsTemplateConvert { + + SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class); + + SysSmsTemplateDO convert(SmsTemplateCreateReqVO bean); + + SysSmsTemplateDO convert(SmsTemplateUpdateReqVO bean); + + SmsTemplateRespVO convert(SysSmsTemplateDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsChannelConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsChannelConvert.java deleted file mode 100644 index af0652eea1..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsChannelConvert.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.sms; - -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelRespVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelSimpleRespVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 短信渠道 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface SysSmsChannelConvert { - - SysSmsChannelConvert INSTANCE = Mappers.getMapper(SysSmsChannelConvert.class); - - SysSmsChannelDO convert(SysSmsChannelCreateReqVO bean); - - SysSmsChannelDO convert(SysSmsChannelUpdateReqVO bean); - - SysSmsChannelRespVO convert(SysSmsChannelDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - - List convertList03(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsTemplateConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsTemplateConvert.java deleted file mode 100644 index b3a423e32f..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SysSmsTemplateConvert.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.sms; - -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExcelVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateRespVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysSmsTemplateConvert { - - SysSmsTemplateConvert INSTANCE = Mappers.getMapper(SysSmsTemplateConvert.class); - - SysSmsTemplateDO convert(SysSmsTemplateCreateReqVO bean); - - SysSmsTemplateDO convert(SysSmsTemplateUpdateReqVO bean); - - SysSmsTemplateRespVO convert(SysSmsTemplateDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/SysTenantConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/SysTenantConvert.java deleted file mode 100755 index 6d9d1f77b4..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/SysTenantConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.tenant; - -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantCreateReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExcelVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantRespVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 租户 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface SysTenantConvert { - - SysTenantConvert INSTANCE = Mappers.getMapper(SysTenantConvert.class); - - SysTenantDO convert(SysTenantCreateReqVO bean); - - SysTenantDO convert(SysTenantUpdateReqVO bean); - - SysTenantRespVO convert(SysTenantDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java new file mode 100755 index 0000000000..62e28b4690 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.system.convert.tenant; + +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExcelVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantRespVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 租户 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface TenantConvert { + + TenantConvert INSTANCE = Mappers.getMapper(TenantConvert.class); + + SysTenantDO convert(TenantCreateReqVO bean); + + SysTenantDO convert(TenantUpdateReqVO bean); + + TenantRespVO convert(SysTenantDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/SysUserConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/SysUserConvert.java deleted file mode 100644 index b1436155b9..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/SysUserConvert.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.user; - -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileRespVO; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.user.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysUserConvert { - - SysUserConvert INSTANCE = Mappers.getMapper(SysUserConvert.class); - - SysUserPageItemRespVO convert(SysUserDO bean); - - SysUserPageItemRespVO.Dept convert(SysDeptDO bean); - - SysUserDO convert(SysUserCreateReqVO bean); - - SysUserDO convert(SysUserUpdateReqVO bean); - - SysUserExcelVO convert02(SysUserDO bean); - - SysUserDO convert(SysUserImportExcelVO bean); - - SysUserProfileRespVO convert03(SysUserDO bean); - - List convertList(List list); - - SysUserProfileRespVO.Dept convert02(SysDeptDO bean); - - SysUserDO convert(SysUserProfileUpdateReqVO bean); - - SysUserDO convert(SysUserProfileUpdatePasswordReqVO bean); - - List convertList02(List list); - - List convertList03(List list); - - List convertList04(List list); -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java new file mode 100644 index 0000000000..e57cb86483 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.system.convert.user; + +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface UserConvert { + + UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); + + UserPageItemRespVO convert(SysUserDO bean); + + UserPageItemRespVO.Dept convert(SysDeptDO bean); + + SysUserDO convert(UserCreateReqVO bean); + + SysUserDO convert(UserUpdateReqVO bean); + + UserExcelVO convert02(SysUserDO bean); + + SysUserDO convert(UserImportExcelVO bean); + + UserProfileRespVO convert03(SysUserDO bean); + + List convertList(List list); + + UserProfileRespVO.Dept convert02(SysDeptDO bean); + + SysUserDO convert(UserProfileUpdateReqVO bean); + + SysUserDO convert(UserProfileUpdatePasswordReqVO bean); + + List convertList02(List list); + + List convertList03(List list); + + List convertList04(List list); +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictTypeDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/DictTypeDO.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictTypeDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/DictTypeDO.java index de7a67b859..01455f4383 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictTypeDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/DictTypeDO.java @@ -12,14 +12,14 @@ import lombok.*; * * @author ruoyi */ -@TableName("sys_dict_type") +@TableName("system_dict_type") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class SysDictTypeDO extends BaseDO { +public class DictTypeDO extends BaseDO { /** * 字典主键 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/SysErrorCodeDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/ErrorCodeDO.java similarity index 81% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/SysErrorCodeDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/ErrorCodeDO.java index b8cae75dfe..b279492873 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/SysErrorCodeDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/errorcode/ErrorCodeDO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.errorcode; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.system.enums.errorcode.SysErrorCodeTypeEnum; +import cn.iocoder.yudao.module.system.enums.errorcode.ErrorCodeTypeEnum; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -13,11 +13,11 @@ import lombok.ToString; * * @author 芋道源码 */ -@TableName(value = "sys_error_code") +@TableName(value = "system_error_code") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysErrorCodeDO extends BaseDO { +public class ErrorCodeDO extends BaseDO { /** * 错误码编号,自增 @@ -27,7 +27,7 @@ public class SysErrorCodeDO extends BaseDO { /** * 错误码类型 * - * 枚举 {@link SysErrorCodeTypeEnum} + * 枚举 {@link ErrorCodeTypeEnum} */ private Integer type; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysOperateLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysOperateLogDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java index ca9483e02d..ec799ec464 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysOperateLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java @@ -19,10 +19,10 @@ import java.util.Map; * * @author 芋道源码 */ -@TableName(value = "sys_operate_log", autoResultMap = true) +@TableName(value = "system_operate_log", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) -public class SysOperateLogDO extends TenantBaseDO { +public class OperateLogDO extends TenantBaseDO { /** * {@link #javaMethodArgs} 的最大长度 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/SysNoticeDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/NoticeDO.java similarity index 82% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/SysNoticeDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/NoticeDO.java index 571b011575..20860b835a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/SysNoticeDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/NoticeDO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.dataobject.notice; -import cn.iocoder.yudao.module.system.enums.notice.SysNoticeTypeEnum; +import cn.iocoder.yudao.module.system.enums.notice.NoticeTypeEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; import com.baomidou.mybatisplus.annotation.TableField; @@ -13,10 +13,10 @@ import lombok.EqualsAndHashCode; * * @author ruoyi */ -@TableName("sys_notice") +@TableName("system_notice") @Data @EqualsAndHashCode(callSuper = true) -public class SysNoticeDO extends TenantBaseDO { +public class NoticeDO extends TenantBaseDO { /** * 公告ID @@ -29,7 +29,7 @@ public class SysNoticeDO extends TenantBaseDO { /** * 公告类型 * - * 枚举 {@link SysNoticeTypeEnum} + * 枚举 {@link NoticeTypeEnum} */ @TableField("notice_type") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysMenuDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysMenuDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java index 39c0b82ba5..1920a68e24 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysMenuDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java @@ -14,10 +14,10 @@ import lombok.EqualsAndHashCode; * * @author ruoyi */ -@TableName("sys_menu") +@TableName("system_menu") @Data @EqualsAndHashCode(callSuper = true) -public class SysMenuDO extends BaseDO { +public class MenuDO extends BaseDO { /** * 菜单ID diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleMenuDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/RoleMenuDO.java similarity index 88% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleMenuDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/RoleMenuDO.java index bfe0c3f868..6b7778bf07 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleMenuDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/RoleMenuDO.java @@ -11,10 +11,10 @@ import lombok.EqualsAndHashCode; * * @author ruoyi */ -@TableName("sys_role_menu") +@TableName("system_role_menu") @Data @EqualsAndHashCode(callSuper = true) -public class SysRoleMenuDO extends BaseDO { +public class RoleMenuDO extends BaseDO { /** * 自增主键 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java index 34e3ffc387..7d231be885 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.mysql.auth; -import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -14,7 +14,7 @@ import java.util.List; @Mapper public interface SysUserSessionMapper extends BaseMapperX { - default PageResult selectPage(SysUserSessionPageReqVO reqVO, Collection userIds) { + default PageResult selectPage(UserSessionPageReqVO reqVO, Collection userIds) { return selectPage(reqVO, new QueryWrapperX() .inIfPresent("user_id", userIds) .likeIfPresent("user_ip", reqVO.getUserIp())); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java index 995ee1e5cf..0bd2d024c0 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.dept; import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -15,7 +15,7 @@ import java.util.List; @Mapper public interface SysDeptMapper extends BaseMapperX { - default List selectList(SysDeptListReqVO reqVO) { + default List selectList(DeptListReqVO reqVO) { return selectList(new LambdaQueryWrapperX().likeIfPresent(SysDeptDO::getName, reqVO.getName()) .eqIfPresent(SysDeptDO::getStatus, reqVO.getStatus())); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java index bf154992a1..b3657d1f40 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.dal.mysql.dept; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -20,14 +20,14 @@ public interface SysPostMapper extends BaseMapperX { .inIfPresent("status", statuses)); } - default PageResult selectPage(SysPostPageReqVO reqVO) { + default PageResult selectPage(PostPageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("code", reqVO.getCode()) .likeIfPresent("name", reqVO.getName()) .eqIfPresent("status", reqVO.getStatus())); } - default List selectList(SysPostExportReqVO reqVO) { + default List selectList(PostExportReqVO reqVO) { return selectList(new QueryWrapperX() .likeIfPresent("code", reqVO.getCode()) .likeIfPresent("name", reqVO.getName()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java index 9fc681a024..c8abca94b6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.dal.mysql.dict; import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -32,7 +32,7 @@ public interface SysDictDataMapper extends BaseMapperX { return selectCount(SysDictDataDO::getDictType, dictType); } - default PageResult selectPage(SysDictDataPageReqVO reqVO) { + default PageResult selectPage(DictDataPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(SysDictDataDO::getLabel, reqVO.getLabel()) .likeIfPresent(SysDictDataDO::getDictType, reqVO.getDictType()) @@ -40,7 +40,7 @@ public interface SysDictDataMapper extends BaseMapperX { .orderByAsc(Arrays.asList(SysDictDataDO::getDictType, SysDictDataDO::getSort))); } - default List selectList(SysDictDataExportReqVO reqVO) { + default List selectList(DictDataExportReqVO reqVO) { return selectList(new LambdaQueryWrapperX().likeIfPresent(SysDictDataDO::getLabel, reqVO.getLabel()) .likeIfPresent(SysDictDataDO::getDictType, reqVO.getDictType()) .eqIfPresent(SysDictDataDO::getStatus, reqVO.getStatus())); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java index ae213915f4..de3d700af8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java @@ -3,38 +3,38 @@ package cn.iocoder.yudao.module.system.dal.mysql.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface SysDictTypeMapper extends BaseMapperX { +public interface SysDictTypeMapper extends BaseMapperX { - default PageResult selectPage(SysDictTypePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(DictTypePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) .likeIfPresent("`type`", reqVO.getType()) .eqIfPresent("status", reqVO.getStatus()) .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); } - default List selectList(SysDictTypeExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(DictTypeExportReqVO reqVO) { + return selectList(new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) .likeIfPresent("`type`", reqVO.getType()) .eqIfPresent("status", reqVO.getStatus()) .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); } - default SysDictTypeDO selectByType(String type) { - return selectOne(new QueryWrapperX().eq("`type`", type)); + default DictTypeDO selectByType(String type) { + return selectOne(new QueryWrapperX().eq("`type`", type)); } - default SysDictTypeDO selectByName(String name) { - return selectOne(new QueryWrapperX().eq("name", name)); + default DictTypeDO selectByName(String name) { + return selectOne(new QueryWrapperX().eq("name", name)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java index b7cac6ca95..4924c6e872 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.system.dal.mysql.errorcode; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.ErrorCodeDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -14,10 +14,10 @@ import java.util.Date; import java.util.List; @Mapper -public interface SysErrorCodeMapper extends BaseMapperX { +public interface SysErrorCodeMapper extends BaseMapperX { - default PageResult selectPage(SysErrorCodePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(ErrorCodePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .eqIfPresent("type", reqVO.getType()) .likeIfPresent("application_name", reqVO.getApplicationName()) .eqIfPresent("code", reqVO.getCode()) @@ -26,8 +26,8 @@ public interface SysErrorCodeMapper extends BaseMapperX { .orderByAsc("application_name", "code")); } - default List selectList(SysErrorCodeExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(ErrorCodeExportReqVO reqVO) { + return selectList(new QueryWrapperX() .eqIfPresent("type", reqVO.getType()) .likeIfPresent("application_name", reqVO.getApplicationName()) .eqIfPresent("code", reqVO.getCode()) @@ -36,16 +36,16 @@ public interface SysErrorCodeMapper extends BaseMapperX { .orderByAsc("application_name", "code")); } - default List selectListByCodes(Collection codes) { - return selectList(new QueryWrapper().in("code", codes)); + default List selectListByCodes(Collection codes) { + return selectList(new QueryWrapper().in("code", codes)); } - default SysErrorCodeDO selectByCode(Integer code) { - return selectOne(new QueryWrapper().eq("code", code)); + default ErrorCodeDO selectByCode(Integer code) { + return selectOne(new QueryWrapper().eq("code", code)); } - default List selectListByApplicationNameAndUpdateTimeGt(String applicationName, Date minUpdateTime) { - return selectList(new QueryWrapperX().eq("application_name", applicationName) + default List selectListByApplicationNameAndUpdateTimeGt(String applicationName, Date minUpdateTime) { + return selectList(new QueryWrapperX().eq("application_name", applicationName) .gtIfPresent("update_time", minUpdateTime)); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java similarity index 65% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java index b211210890..f26023388c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java @@ -4,39 +4,39 @@ import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLogi import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface SysLoginLogMapper extends BaseMapperX { +public interface LoginLogMapper extends BaseMapperX { - default PageResult selectPage(SysLoginLogPageReqVO reqVO) { + default PageResult selectPage(LoginLogPageReqVO reqVO) { QueryWrapperX query = new QueryWrapperX() .likeIfPresent("user_ip", reqVO.getUserIp()) .likeIfPresent("username", reqVO.getUsername()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()); if (Boolean.TRUE.equals(reqVO.getStatus())) { - query.eq("result", SysLoginResultEnum.SUCCESS.getResult()); + query.eq("result", LoginResultEnum.SUCCESS.getResult()); } else if (Boolean.FALSE.equals(reqVO.getStatus())) { - query.gt("result", SysLoginResultEnum.SUCCESS.getResult()); + query.gt("result", LoginResultEnum.SUCCESS.getResult()); } query.orderByDesc("id"); // 降序 return selectPage(reqVO, query); } - default List selectList(SysLoginLogExportReqVO reqVO) { + default List selectList(LoginLogExportReqVO reqVO) { QueryWrapperX query = new QueryWrapperX() .likeIfPresent("user_ip", reqVO.getUserIp()) .likeIfPresent("username", reqVO.getUsername()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()); if (Boolean.TRUE.equals(reqVO.getStatus())) { - query.eq("result", SysLoginResultEnum.SUCCESS.getResult()); + query.eq("result", LoginResultEnum.SUCCESS.getResult()); } else if (Boolean.FALSE.equals(reqVO.getStatus())) { - query.gt("result", SysLoginResultEnum.SUCCESS.getResult()); + query.gt("result", LoginResultEnum.SUCCESS.getResult()); } query.orderByDesc("id"); // 降序 return selectList(query); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysOperateLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogMapper.java similarity index 70% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysOperateLogMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogMapper.java index 14d866a0b3..94367c55ff 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysOperateLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogMapper.java @@ -4,19 +4,19 @@ import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstant import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; @Mapper -public interface SysOperateLogMapper extends BaseMapperX { +public interface OperateLogMapper extends BaseMapperX { - default PageResult selectPage(SysOperateLogPageReqVO reqVO, Collection userIds) { - QueryWrapperX query = new QueryWrapperX() + default PageResult selectPage(OperateLogPageReqVO reqVO, Collection userIds) { + QueryWrapperX query = new QueryWrapperX() .likeIfPresent("module", reqVO.getModule()) .inIfPresent("user_id", userIds) .eqIfPresent("operate_type", reqVO.getType()) @@ -30,8 +30,8 @@ public interface SysOperateLogMapper extends BaseMapperX { return selectPage(reqVO, query); } - default List selectList(SysOperateLogExportReqVO reqVO, Collection userIds) { - QueryWrapperX query = new QueryWrapperX() + default List selectList(OperateLogExportReqVO reqVO, Collection userIds) { + QueryWrapperX query = new QueryWrapperX() .likeIfPresent("module", reqVO.getModule()) .inIfPresent("user_id", userIds) .eqIfPresent("operate_type", reqVO.getType()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java index 74aee3f5d3..6c6a305189 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java @@ -3,15 +3,15 @@ package cn.iocoder.yudao.module.system.dal.mysql.notice; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SysNoticeMapper extends BaseMapperX { +public interface SysNoticeMapper extends BaseMapperX { - default PageResult selectPage(SysNoticePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(NoticePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("title", reqVO.getTitle()) .eqIfPresent("status", reqVO.getStatus())); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java index 605937fa46..1cce445b26 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission; import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -12,25 +12,25 @@ import java.util.Date; import java.util.List; @Mapper -public interface SysMenuMapper extends BaseMapperX { +public interface SysMenuMapper extends BaseMapperX { - default SysMenuDO selectByParentIdAndName(Long parentId, String name) { - return selectOne(new LambdaQueryWrapper().eq(SysMenuDO::getParentId, parentId) - .eq(SysMenuDO::getName, name)); + default MenuDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(new LambdaQueryWrapper().eq(MenuDO::getParentId, parentId) + .eq(MenuDO::getName, name)); } default Integer selectCountByParentId(Long parentId) { - return selectCount(SysMenuDO::getParentId, parentId); + return selectCount(MenuDO::getParentId, parentId); } - default List selectList(SysMenuListReqVO reqVO) { - return selectList(new LambdaQueryWrapperX().likeIfPresent(SysMenuDO::getName, reqVO.getName()) - .eqIfPresent(SysMenuDO::getStatus, reqVO.getStatus())); + default List selectList(MenuListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX().likeIfPresent(MenuDO::getName, reqVO.getName()) + .eqIfPresent(MenuDO::getStatus, reqVO.getStatus())); } default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new LambdaQueryWrapper().select(SysMenuDO::getId) - .gt(SysMenuDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null; + return selectOne(new LambdaQueryWrapper().select(MenuDO::getId) + .gt(MenuDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null; } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java index 16641f8c38..45af3afad6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -17,14 +17,14 @@ import java.util.List; @Mapper public interface SysRoleMapper extends BaseMapperX { - default PageResult selectPage(SysRolePageReqVO reqVO) { + default PageResult selectPage(RolePageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX().likeIfPresent("name", reqVO.getName()) .likeIfPresent("code", reqVO.getCode()) .eqIfPresent("status", reqVO.getStatus()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); } - default List listRoles(SysRoleExportReqVO reqVO) { + default List listRoles(RoleExportReqVO reqVO) { return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) .likeIfPresent("code", reqVO.getCode()) .eqIfPresent("status", reqVO.getStatus()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java index ac806927d2..478729438b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @@ -12,15 +12,15 @@ import java.util.List; import java.util.stream.Collectors; @Mapper -public interface SysRoleMenuMapper extends BaseMapperX { +public interface SysRoleMenuMapper extends BaseMapperX { - default List selectListByRoleId(Long roleId) { - return selectList(new QueryWrapper().eq("role_id", roleId)); + default List selectListByRoleId(Long roleId) { + return selectList(new QueryWrapper().eq("role_id", roleId)); } default void insertList(Long roleId, Collection menuIds) { - List list = menuIds.stream().map(menuId -> { - SysRoleMenuDO entity = new SysRoleMenuDO(); + List list = menuIds.stream().map(menuId -> { + RoleMenuDO entity = new RoleMenuDO(); entity.setRoleId(roleId); entity.setMenuId(menuId); return entity; @@ -30,16 +30,16 @@ public interface SysRoleMenuMapper extends BaseMapperX { } default void deleteListByRoleIdAndMenuIds(Long roleId, Collection menuIds) { - delete(new QueryWrapper().eq("role_id", roleId) + delete(new QueryWrapper().eq("role_id", roleId) .in("menu_id", menuIds)); } default void deleteListByMenuId(Long menuId) { - delete(new QueryWrapper().eq("menu_id", menuId)); + delete(new QueryWrapper().eq("menu_id", menuId)); } default void deleteListByRoleId(Long roleId) { - delete(new QueryWrapper().eq("role_id", roleId)); + delete(new QueryWrapper().eq("role_id", roleId)); } @Select("SELECT id FROM sys_role_menu WHERE update_time > #{maxUpdateTime} LIMIT 1") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java index 5f6b0bb3e9..8d183fcb90 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.mysql.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -13,7 +13,7 @@ import java.util.Date; @Mapper public interface SysSmsChannelMapper extends BaseMapperX { - default PageResult selectPage(SysSmsChannelPageReqVO reqVO) { + default PageResult selectPage(SmsChannelPageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("signature", reqVO.getSignature()) .eqIfPresent("status", reqVO.getStatus()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java index e0a1039aa6..ffed029128 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -13,7 +13,7 @@ import java.util.List; @Mapper public interface SysSmsLogMapper extends BaseMapperX { - default PageResult selectPage(SysSmsLogPageReqVO reqVO) { + default PageResult selectPage(SmsLogPageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() .eqIfPresent("channel_id", reqVO.getChannelId()) .eqIfPresent("template_id", reqVO.getTemplateId()) @@ -25,7 +25,7 @@ public interface SysSmsLogMapper extends BaseMapperX { .orderByDesc("id")); } - default List selectList(SysSmsLogExportReqVO reqVO) { + default List selectList(SmsLogExportReqVO reqVO) { return selectList(new QueryWrapperX() .eqIfPresent("channel_id", reqVO.getChannelId()) .eqIfPresent("template_id", reqVO.getTemplateId()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java index f1deda053b..a2559bd476 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -18,7 +18,7 @@ public interface SysSmsTemplateMapper extends BaseMapperX { } // TODO 这种参数都一样的得想办法封装一下 - default PageResult selectPage(SysSmsTemplatePageReqVO reqVO) { + default PageResult selectPage(SmsTemplatePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(SysSmsTemplateDO::getType, reqVO.getType()) .eqIfPresent(SysSmsTemplateDO::getStatus, reqVO.getStatus()) @@ -30,7 +30,7 @@ public interface SysSmsTemplateMapper extends BaseMapperX { .orderByDesc(SysSmsTemplateDO::getId)); } - default List selectList(SysSmsTemplateExportReqVO reqVO) { + default List selectList(SmsTemplateExportReqVO reqVO) { return selectList(new LambdaQueryWrapperX() .eqIfPresent(SysSmsTemplateDO::getType, reqVO.getType()) .eqIfPresent(SysSmsTemplateDO::getStatus, reqVO.getStatus()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java index dc7d27d21a..d92f660f94 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.tenant; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExportReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -18,7 +18,7 @@ import java.util.List; @Mapper public interface SysTenantMapper extends BaseMapperX { - default PageResult selectPage(SysTenantPageReqVO reqVO) { + default PageResult selectPage(TenantPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(SysTenantDO::getName, reqVO.getName()) .likeIfPresent(SysTenantDO::getContactName, reqVO.getContactName()) @@ -28,7 +28,7 @@ public interface SysTenantMapper extends BaseMapperX { .orderByDesc(SysTenantDO::getId)); } - default List selectList(SysTenantExportReqVO reqVO) { + default List selectList(TenantExportReqVO reqVO) { return selectList(new LambdaQueryWrapperX() .likeIfPresent(SysTenantDO::getName, reqVO.getName()) .likeIfPresent(SysTenantDO::getContactName, reqVO.getContactName()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java index f954cd3cf6..1d7eb74bf2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.user; -import cn.iocoder.yudao.module.system.controller.user.vo.user.SysUserExportReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.user.SysUserPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -30,7 +30,7 @@ public interface SysUserMapper extends BaseMapperX { return selectOne(new LambdaQueryWrapper().eq(SysUserDO::getMobile, mobile)); } - default PageResult selectPage(SysUserPageReqVO reqVO, Collection deptIds) { + default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(SysUserDO::getUsername, reqVO.getUsername()) .likeIfPresent(SysUserDO::getMobile, reqVO.getMobile()) @@ -39,7 +39,7 @@ public interface SysUserMapper extends BaseMapperX { .inIfPresent(SysUserDO::getDeptId, deptIds)); } - default List selectList(SysUserExportReqVO reqVO, Collection deptIds) { + default List selectList(UserExportReqVO reqVO, Collection deptIds) { return selectList(new LambdaQueryWrapperX() .likeIfPresent(SysUserDO::getUsername, reqVO.getUsername()) .likeIfPresent(SysUserDO::getMobile, reqVO.getMobile()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java index 33fa08e7e4..16baa4638f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java @@ -14,6 +14,5 @@ public interface SysRedisKeyConstants { RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存", "captcha_code:%s", // 参数为 uuid STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); - - + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/SysCaptchaRedisDAO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/CaptchaRedisDAO.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/SysCaptchaRedisDAO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/CaptchaRedisDAO.java index 9a26095616..1c83a7c5c5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/SysCaptchaRedisDAO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/CaptchaRedisDAO.java @@ -14,7 +14,7 @@ import static cn.iocoder.yudao.module.system.dal.redis.SysRedisKeyConstants.CAPT * @author 芋道源码 */ @Repository -public class SysCaptchaRedisDAO { +public class CaptchaRedisDAO { @Resource private StringRedisTemplate stringRedisTemplate; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java similarity index 99% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 566f835d58..15b6803a21 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; * * system 系统,使用 1-002-000-000 段 */ -public interface SysErrorCodeConstants { +public interface ErrorCodeConstants { // ========== AUTH 模块 1002000000 ========== ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1002000000, "登录失败,账号密码不正确"); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/SysErrorCodeTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/ErrorCodeTypeEnum.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/SysErrorCodeTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/ErrorCodeTypeEnum.java index beb2e2b3ef..97349e763c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/SysErrorCodeTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/errorcode/ErrorCodeTypeEnum.java @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum SysErrorCodeTypeEnum implements IntArrayValuable { +public enum ErrorCodeTypeEnum implements IntArrayValuable { /** * 自动生成 @@ -24,7 +24,7 @@ public enum SysErrorCodeTypeEnum implements IntArrayValuable { */ MANUAL_OPERATION(2); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysErrorCodeTypeEnum::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErrorCodeTypeEnum::getType).toArray(); /** * 类型 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginLogTypeEnum.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginLogTypeEnum.java index ff29ab558f..2f845fd105 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginLogTypeEnum.java @@ -8,7 +8,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysLoginLogTypeEnum { +public enum LoginLogTypeEnum { LOGIN_USERNAME(100), // 使用账号登录 LOGIN_SOCIAL(101), // 使用社交登录 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginResultEnum.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginResultEnum.java index f1c8356ff4..7084e13da1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginResultEnum.java @@ -8,7 +8,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysLoginResultEnum { +public enum LoginResultEnum { SUCCESS(0), // 成功 BAD_CREDENTIALS(10), // 账号或密码不正确 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/SysNoticeTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/NoticeTypeEnum.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/SysNoticeTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/NoticeTypeEnum.java index c543f1cb5d..9a2a3c4626 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/SysNoticeTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/notice/NoticeTypeEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysNoticeTypeEnum { +public enum NoticeTypeEnum { NOTICE(1), ANNOUNCEMENT(2); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/SysRoleTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/RoleTypeEnum.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/SysRoleTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/RoleTypeEnum.java index 426c5cdb5f..1607b20b34 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/SysRoleTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/permission/RoleTypeEnum.java @@ -5,7 +5,7 @@ import lombok.Getter; @Getter @AllArgsConstructor -public enum SysRoleTypeEnum { +public enum RoleTypeEnum { /** * 内置角色 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/SysDataPermissionConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/SysDataPermissionConfiguration.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java index 0b0402956f..cd67fdc828 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/SysDataPermissionConfiguration.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -11,8 +11,8 @@ import org.springframework.context.annotation.Configuration; * * @author 芋道源码 */ -@Configuration -public class SysDataPermissionConfiguration { +@Configuration(proxyBeanMethods = false) +public class DataPermissionConfiguration { @Bean public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeConfiguration.java index e86d40b4e6..4c72ccec73 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeConfiguration.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/errorcode/config/ErrorCodeConfiguration.java @@ -11,6 +11,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; +// TODO 芋艿:貌似放的位置有问题 /** * 错误码配置类 */ diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/SysUserSessionTimeoutJob.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/UserSessionTimeoutJob.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/SysUserSessionTimeoutJob.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/UserSessionTimeoutJob.java index c8c719f188..d1a061d3e4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/SysUserSessionTimeoutJob.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/job/auth/UserSessionTimeoutJob.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.job.auth; import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; -import cn.iocoder.yudao.module.system.service.auth.SysUserSessionService; +import cn.iocoder.yudao.module.system.service.auth.UserSessionService; import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -16,10 +16,10 @@ import javax.annotation.Resource; @Component @TenantJob @Slf4j -public class SysUserSessionTimeoutJob implements JobHandler { +public class UserSessionTimeoutJob implements JobHandler { @Resource - private SysUserSessionService sysUserSessionService; + private UserSessionService sysUserSessionService; @Override public String execute(String param) throws Exception { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/SysDeptRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/DeptRefreshConsumer.java similarity index 53% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/SysDeptRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/DeptRefreshConsumer.java index dd9bd64200..981244d909 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/SysDeptRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dept/DeptRefreshConsumer.java @@ -1,27 +1,27 @@ package cn.iocoder.yudao.module.system.mq.consumer.dept; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.module.system.mq.message.dept.SysDeptRefreshMessage; -import cn.iocoder.yudao.module.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.mq.message.dept.DeptRefreshMessage; +import cn.iocoder.yudao.module.system.service.dept.DeptService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SysDeptRefreshMessage} 的消费者 + * 针对 {@link DeptRefreshMessage} 的消费者 * * @author 芋道源码 */ @Component @Slf4j -public class SysDeptRefreshConsumer extends AbstractChannelMessageListener { +public class DeptRefreshConsumer extends AbstractChannelMessageListener { @Resource - private SysDeptService deptService; + private DeptService deptService; @Override - public void onMessage(SysDeptRefreshMessage message) { + public void onMessage(DeptRefreshMessage message) { log.info("[onMessage][收到 Dept 刷新消息]"); deptService.initLocalCache(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/SysDictDataRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/DictDataRefreshConsumer.java similarity index 66% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/SysDictDataRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/DictDataRefreshConsumer.java index ad14b7bfd8..6fe1c7c6a7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/SysDictDataRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/DictDataRefreshConsumer.java @@ -2,26 +2,26 @@ package cn.iocoder.yudao.module.system.mq.consumer.dict; import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.module.system.mq.message.dict.SysDictDataRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.dict.DictDataRefreshMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SysDictDataRefreshMessage} 的消费者 + * 针对 {@link DictDataRefreshMessage} 的消费者 * * @author 芋道源码 */ @Component @Slf4j -public class SysDictDataRefreshConsumer extends AbstractChannelMessageListener { +public class DictDataRefreshConsumer extends AbstractChannelMessageListener { @Resource private SysDictDataCoreService dictDataCoreService; @Override - public void onMessage(SysDictDataRefreshMessage message) { + public void onMessage(DictDataRefreshMessage message) { log.info("[onMessage][收到 DictData 刷新消息]"); dictDataCoreService.initLocalCache(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/SysMailSendConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/MailSendConsumer.java similarity index 56% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/SysMailSendConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/MailSendConsumer.java index 10b12ce0df..4b02f760ea 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/SysMailSendConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/MailSendConsumer.java @@ -1,16 +1,17 @@ package cn.iocoder.yudao.module.system.mq.consumer.mail; import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener; -import cn.iocoder.yudao.module.system.mq.message.mail.SysMailSendMessage; +import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +// TODO 芋艿:这个暂未实现 @Component @Slf4j -public class SysMailSendConsumer extends AbstractStreamMessageListener { +public class MailSendConsumer extends AbstractStreamMessageListener { @Override - public void onMessage(SysMailSendMessage message) { + public void onMessage(MailSendMessage message) { log.info("[onMessage][消息内容({})]", message); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysMenuRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/MenuRefreshConsumer.java similarity index 52% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysMenuRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/MenuRefreshConsumer.java index 4630fef841..a4b6335124 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysMenuRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/MenuRefreshConsumer.java @@ -1,27 +1,27 @@ package cn.iocoder.yudao.module.system.mq.consumer.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.module.system.mq.message.permission.SysMenuRefreshMessage; -import cn.iocoder.yudao.module.system.service.permission.SysMenuService; +import cn.iocoder.yudao.module.system.mq.message.permission.MenuRefreshMessage; +import cn.iocoder.yudao.module.system.service.permission.MenuService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SysMenuRefreshMessage} 的消费者 + * 针对 {@link MenuRefreshMessage} 的消费者 * * @author 芋道源码 */ @Component @Slf4j -public class SysMenuRefreshConsumer extends AbstractChannelMessageListener { +public class MenuRefreshConsumer extends AbstractChannelMessageListener { @Resource - private SysMenuService menuService; + private MenuService menuService; @Override - public void onMessage(SysMenuRefreshMessage message) { + public void onMessage(MenuRefreshMessage message) { log.info("[onMessage][收到 Menu 刷新消息]"); menuService.initLocalCache(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.java similarity index 51% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.java index 961ee83ee0..d9f0e92208 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.java @@ -1,27 +1,27 @@ package cn.iocoder.yudao.module.system.mq.consumer.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.module.system.mq.message.permission.SysRoleMenuRefreshMessage; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.mq.message.permission.RoleMenuRefreshMessage; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SysRoleMenuRefreshMessage} 的消费者 + * 针对 {@link RoleMenuRefreshMessage} 的消费者 * * @author 芋道源码 */ @Component @Slf4j -public class SysRoleMenuRefreshConsumer extends AbstractChannelMessageListener { +public class RoleMenuRefreshConsumer extends AbstractChannelMessageListener { @Resource - private SysPermissionService permissionService; + private PermissionService permissionService; @Override - public void onMessage(SysRoleMenuRefreshMessage message) { + public void onMessage(RoleMenuRefreshMessage message) { log.info("[onMessage][收到 Role 与 Menu 的关联刷新消息]"); permissionService.initLocalCache(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/RoleRefreshConsumer.java similarity index 52% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/RoleRefreshConsumer.java index 2ed56fe1d8..bb53b7499a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/SysRoleRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/permission/RoleRefreshConsumer.java @@ -1,27 +1,27 @@ package cn.iocoder.yudao.module.system.mq.consumer.permission; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.module.system.mq.message.permission.SysRoleRefreshMessage; -import cn.iocoder.yudao.module.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.mq.message.permission.RoleRefreshMessage; +import cn.iocoder.yudao.module.system.service.permission.RoleService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SysRoleRefreshMessage} 的消费者 + * 针对 {@link RoleRefreshMessage} 的消费者 * * @author 芋道源码 */ @Component @Slf4j -public class SysRoleRefreshConsumer extends AbstractChannelMessageListener { +public class RoleRefreshConsumer extends AbstractChannelMessageListener { @Resource - private SysRoleService roleService; + private RoleService roleService; @Override - public void onMessage(SysRoleRefreshMessage message) { + public void onMessage(RoleRefreshMessage message) { log.info("[onMessage][收到 Role 刷新消息]"); roleService.initLocalCache(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.java similarity index 50% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.java index 11cbed107e..cc5d83d1eb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.java @@ -1,27 +1,27 @@ package cn.iocoder.yudao.module.system.mq.consumer.sms; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsChannelRefreshMessage; -import cn.iocoder.yudao.module.system.service.sms.SysSmsChannelService; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsChannelRefreshMessage; +import cn.iocoder.yudao.module.system.service.sms.SmsChannelService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SysSmsChannelRefreshMessage} 的消费者 + * 针对 {@link SmsChannelRefreshMessage} 的消费者 * * @author 芋道源码 */ @Component @Slf4j -public class SysSmsChannelRefreshConsumer extends AbstractChannelMessageListener { +public class SmsChannelRefreshConsumer extends AbstractChannelMessageListener { @Resource - private SysSmsChannelService smsChannelService; + private SmsChannelService smsChannelService; @Override - public void onMessage(SysSmsChannelRefreshMessage message) { + public void onMessage(SmsChannelRefreshMessage message) { log.info("[onMessage][收到 SmsChannel 刷新消息]"); smsChannelService.initSmsClients(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsSendConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsSendConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java index feeeeefea4..2239eecc18 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsSendConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java @@ -16,7 +16,7 @@ import javax.annotation.Resource; */ @Component @Slf4j -public class SysSmsSendConsumer extends AbstractStreamMessageListener { +public class SmsSendConsumer extends AbstractStreamMessageListener { @Resource private SysSmsCoreService smsCoreService; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java similarity index 65% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java index 36e2b4db44..52840189a8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.mq.consumer.sms; -import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsTemplateRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsTemplateRefreshMessage; import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; import lombok.extern.slf4j.Slf4j; @@ -9,19 +9,19 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SysSmsTemplateRefreshMessage} 的消费者 + * 针对 {@link SmsTemplateRefreshMessage} 的消费者 * * @author 芋道源码 */ @Component @Slf4j -public class SysSmsTemplateRefreshConsumer extends AbstractChannelMessageListener { +public class SmsTemplateRefreshConsumer extends AbstractChannelMessageListener { @Resource private SysSmsTemplateCoreService smsTemplateCoreService; @Override - public void onMessage(SysSmsTemplateRefreshMessage message) { + public void onMessage(SmsTemplateRefreshMessage message) { log.info("[onMessage][收到 SmsTemplate 刷新消息]"); smsTemplateCoreService.initLocalCache(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/SysDeptRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/DeptRefreshMessage.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/SysDeptRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/DeptRefreshMessage.java index 4403a28dc5..80d3c8c39f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/SysDeptRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dept/DeptRefreshMessage.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysDeptRefreshMessage extends AbstractChannelMessage { +public class DeptRefreshMessage extends AbstractChannelMessage { @Override public String getChannel() { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/SysDictDataRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/DictDataRefreshMessage.java similarity index 83% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/SysDictDataRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/DictDataRefreshMessage.java index 7d919dd1fe..01e5b86056 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/SysDictDataRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/dict/DictDataRefreshMessage.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysDictDataRefreshMessage extends AbstractChannelMessage { +public class DictDataRefreshMessage extends AbstractChannelMessage { @Override public String getChannel() { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/SysMailSendMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/MailSendMessage.java similarity index 93% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/SysMailSendMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/MailSendMessage.java index e511b32ad9..aee02c76e9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/SysMailSendMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/MailSendMessage.java @@ -14,7 +14,7 @@ import java.util.Map; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysMailSendMessage extends AbstractStreamMessage { +public class MailSendMessage extends AbstractStreamMessage { /** * 邮箱地址 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysMenuRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/MenuRefreshMessage.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysMenuRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/MenuRefreshMessage.java index d829f706a1..abd75dbaaf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysMenuRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/MenuRefreshMessage.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysMenuRefreshMessage extends AbstractChannelMessage { +public class MenuRefreshMessage extends AbstractChannelMessage { @Override public String getChannel() { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleMenuRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/RoleMenuRefreshMessage.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleMenuRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/RoleMenuRefreshMessage.java index 1cfd0e814b..0982775bc6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleMenuRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/RoleMenuRefreshMessage.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysRoleMenuRefreshMessage extends AbstractChannelMessage { +public class RoleMenuRefreshMessage extends AbstractChannelMessage { @Override public String getChannel() { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/RoleRefreshMessage.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/RoleRefreshMessage.java index 9ad25c627a..e80d8f30c3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/SysRoleRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/permission/RoleRefreshMessage.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysRoleRefreshMessage extends AbstractChannelMessage { +public class RoleRefreshMessage extends AbstractChannelMessage { @Override public String getChannel() { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsChannelRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsChannelRefreshMessage.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsChannelRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsChannelRefreshMessage.java index 296df410b8..0841cdee0d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsChannelRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsChannelRefreshMessage.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysSmsChannelRefreshMessage extends AbstractChannelMessage { +public class SmsChannelRefreshMessage extends AbstractChannelMessage { @Override public String getChannel() { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsTemplateRefreshMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsTemplateRefreshMessage.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsTemplateRefreshMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsTemplateRefreshMessage.java index 955af3ed87..4873c06c4a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SysSmsTemplateRefreshMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsTemplateRefreshMessage.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysSmsTemplateRefreshMessage extends AbstractChannelMessage { +public class SmsTemplateRefreshMessage extends AbstractChannelMessage { @Override public String getChannel() { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/SysDeptProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/DeptProducer.java similarity index 65% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/SysDeptProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/DeptProducer.java index b4f9dace2f..9a2ca1b9c5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/SysDeptProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dept/DeptProducer.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.mq.producer.dept; -import cn.iocoder.yudao.module.system.mq.message.dept.SysDeptRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.dept.DeptRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; @@ -10,16 +10,16 @@ import javax.annotation.Resource; * Dept 部门相关消息的 Producer */ @Component -public class SysDeptProducer { +public class DeptProducer { @Resource private RedisMQTemplate redisMQTemplate; /** - * 发送 {@link SysDeptRefreshMessage} 消息 + * 发送 {@link DeptRefreshMessage} 消息 */ public void sendDeptRefreshMessage() { - SysDeptRefreshMessage message = new SysDeptRefreshMessage(); + DeptRefreshMessage message = new DeptRefreshMessage(); redisMQTemplate.send(message); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/SysDictDataProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/DictDataProducer.java similarity index 64% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/SysDictDataProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/DictDataProducer.java index 165de3372b..fa90c8c424 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/SysDictDataProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/dict/DictDataProducer.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.mq.producer.dict; -import cn.iocoder.yudao.module.system.mq.message.dict.SysDictDataRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.dict.DictDataRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; @@ -10,16 +10,16 @@ import javax.annotation.Resource; * DictData 字典数据相关消息的 Producer */ @Component -public class SysDictDataProducer { +public class DictDataProducer { @Resource private RedisMQTemplate redisMQTemplate; /** - * 发送 {@link SysDictDataRefreshMessage} 消息 + * 发送 {@link DictDataRefreshMessage} 消息 */ public void sendDictDataRefreshMessage() { - SysDictDataRefreshMessage message = new SysDictDataRefreshMessage(); + DictDataRefreshMessage message = new DictDataRefreshMessage(); redisMQTemplate.send(message); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysMenuProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/MenuProducer.java similarity index 64% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysMenuProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/MenuProducer.java index d035824f25..5764c872af 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysMenuProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/MenuProducer.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.mq.producer.permission; -import cn.iocoder.yudao.module.system.mq.message.permission.SysMenuRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.permission.MenuRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; @@ -10,16 +10,16 @@ import javax.annotation.Resource; * Menu 菜单相关消息的 Producer */ @Component -public class SysMenuProducer { +public class MenuProducer { @Resource private RedisMQTemplate redisMQTemplate; /** - * 发送 {@link SysMenuRefreshMessage} 消息 + * 发送 {@link MenuRefreshMessage} 消息 */ public void sendMenuRefreshMessage() { - SysMenuRefreshMessage message = new SysMenuRefreshMessage(); + MenuRefreshMessage message = new MenuRefreshMessage(); redisMQTemplate.send(message); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysPermissionProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/PermissionProducer.java similarity index 63% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysPermissionProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/PermissionProducer.java index ca5141d846..56c8e31790 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysPermissionProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/PermissionProducer.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.mq.producer.permission; -import cn.iocoder.yudao.module.system.mq.message.permission.SysRoleMenuRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.permission.RoleMenuRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; @@ -10,16 +10,16 @@ import javax.annotation.Resource; * Permission 权限相关消息的 Producer */ @Component -public class SysPermissionProducer { +public class PermissionProducer { @Resource private RedisMQTemplate redisMQTemplate; /** - * 发送 {@link SysRoleMenuRefreshMessage} 消息 + * 发送 {@link RoleMenuRefreshMessage} 消息 */ public void sendRoleMenuRefreshMessage() { - SysRoleMenuRefreshMessage message = new SysRoleMenuRefreshMessage(); + RoleMenuRefreshMessage message = new RoleMenuRefreshMessage(); redisMQTemplate.send(message); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysRoleProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/RoleProducer.java similarity index 66% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysRoleProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/RoleProducer.java index 1fb1be9f6f..c249d964e8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/SysRoleProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/permission/RoleProducer.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.mq.producer.permission; -import cn.iocoder.yudao.module.system.mq.message.permission.SysRoleRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.permission.RoleRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; @@ -12,16 +12,16 @@ import javax.annotation.Resource; * @author 芋道源码 */ @Component -public class SysRoleProducer { +public class RoleProducer { @Resource private RedisMQTemplate redisMQTemplate; /** - * 发送 {@link SysRoleRefreshMessage} 消息 + * 发送 {@link RoleRefreshMessage} 消息 */ public void sendRoleRefreshMessage() { - SysRoleRefreshMessage message = new SysRoleRefreshMessage(); + RoleRefreshMessage message = new RoleRefreshMessage(); redisMQTemplate.send(message); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SysSmsProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SmsProducer.java similarity index 56% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SysSmsProducer.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SmsProducer.java index abd343a483..117e666b9e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SysSmsProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SmsProducer.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.mq.producer.sms; -import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsChannelRefreshMessage; -import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsTemplateRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsChannelRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsTemplateRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -16,24 +16,24 @@ import javax.annotation.Resource; */ @Slf4j @Component -public class SysSmsProducer { +public class SmsProducer { @Resource private RedisMQTemplate redisMQTemplate; /** - * 发送 {@link SysSmsChannelRefreshMessage} 消息 + * 发送 {@link SmsChannelRefreshMessage} 消息 */ public void sendSmsChannelRefreshMessage() { - SysSmsChannelRefreshMessage message = new SysSmsChannelRefreshMessage(); + SmsChannelRefreshMessage message = new SmsChannelRefreshMessage(); redisMQTemplate.send(message); } /** - * 发送 {@link SysSmsTemplateRefreshMessage} 消息 + * 发送 {@link SmsTemplateRefreshMessage} 消息 */ public void sendSmsTemplateRefreshMessage() { - SysSmsTemplateRefreshMessage message = new SysSmsTemplateRefreshMessage(); + SmsTemplateRefreshMessage message = new SmsTemplateRefreshMessage(); redisMQTemplate.send(message); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthService.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthService.java index b111147d91..1a2a8240cf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.service.auth; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.*; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*; import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; import javax.validation.Valid; @@ -12,7 +12,7 @@ import javax.validation.Valid; * * @author 芋道源码 */ -public interface SysAuthService extends SecurityAuthFrameworkService { +public interface AuthService extends SecurityAuthFrameworkService { /** * 账号登录 @@ -22,7 +22,7 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userAgent 用户 UA * @return 身份令牌,使用 JWT 方式 */ - String login(@Valid SysAuthLoginReqVO reqVO, String userIp, String userAgent); + String login(@Valid AuthLoginReqVO reqVO, String userIp, String userAgent); /** * 社交登录,使用 code 授权码 @@ -32,7 +32,7 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userAgent 用户 UA * @return 身份令牌,使用 JWT 方式 */ - String socialLogin(@Valid SysAuthSocialLoginReqVO reqVO, String userIp, String userAgent); + String socialLogin(@Valid AuthSocialLoginReqVO reqVO, String userIp, String userAgent); /** * 社交登录,使用 code 授权码 + 账号密码 @@ -42,7 +42,7 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userAgent 用户 UA * @return 身份令牌,使用 JWT 方式 */ - String socialLogin2(@Valid SysAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent); + String socialLogin2(@Valid AuthSocialLogin2ReqVO reqVO, String userIp, String userAgent); /** * 社交绑定,使用 code 授权码 @@ -50,6 +50,6 @@ public interface SysAuthService extends SecurityAuthFrameworkService { * @param userId 用户编号 * @param reqVO 绑定信息 */ - void socialBind(Long userId, @Valid SysAuthSocialBindReqVO reqVO); + void socialBind(Long userId, @Valid AuthSocialBindReqVO reqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java similarity index 80% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java index bd7fdf2d9d..a0a45e7d71 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java @@ -1,19 +1,18 @@ package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthLoginReqVO; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthSocialBindReqVO; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO; -import cn.iocoder.yudao.module.system.convert.auth.SysAuthConvert; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthLoginReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLogin2ReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLoginReqVO; +import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.module.system.service.auth.SysAuthService; -import cn.iocoder.yudao.module.system.service.common.SysCaptchaService; -import cn.iocoder.yudao.module.system.service.dept.SysPostService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; +import cn.iocoder.yudao.module.system.service.common.CaptchaService; +import cn.iocoder.yudao.module.system.service.dept.PostService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; +import cn.iocoder.yudao.module.system.service.user.UserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; @@ -46,7 +45,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static java.util.Collections.singleton; @@ -56,28 +55,28 @@ import static java.util.Collections.singleton; * * @author 芋道源码 */ -@Service +@Service("adminAuthService") @Slf4j -public class SysAuthServiceImpl implements SysAuthService { +public class AuthServiceImpl implements AuthService { @Resource @Lazy // 延迟加载,因为存在相互依赖的问题 private AuthenticationManager authenticationManager; @Resource - private SysUserService userService; + private UserService userService; @Resource private SysUserCoreService userCoreService; @Resource - private SysPermissionService permissionService; + private PermissionService permissionService; @Resource - private SysCaptchaService captchaService; + private CaptchaService captchaService; @Resource private SysLoginLogCoreService loginLogCoreService; @Resource private SysUserSessionCoreService userSessionCoreService; @Resource - private SysPostService postService; + private PostService postService; @Resource private SysSocialCoreService socialService; @@ -99,14 +98,14 @@ public class SysAuthServiceImpl implements SysAuthService { if (user == null) { throw new UsernameNotFoundException(String.valueOf(userId)); } - this.createLoginLog(user.getUsername(), SysLoginLogTypeEnum.LOGIN_MOCK, SysLoginResultEnum.SUCCESS); + this.createLoginLog(user.getUsername(), LoginLogTypeEnum.LOGIN_MOCK, LoginResultEnum.SUCCESS); // 创建 LoginUser 对象 return this.buildLoginUser(user); } @Override - public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) { + public String login(AuthLoginReqVO reqVO, String userIp, String userAgent) { // 判断验证码是否正确 this.verifyCaptcha(reqVO.getUsername(), reqVO.getUuid(), reqVO.getCode()); @@ -130,17 +129,17 @@ public class SysAuthServiceImpl implements SysAuthService { return; } // 验证码不存在 - final SysLoginLogTypeEnum logTypeEnum = SysLoginLogTypeEnum.LOGIN_USERNAME; + final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; String code = captchaService.getCaptchaCode(captchaUUID); if (code == null) { // 创建登录失败日志(验证码不存在) - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.CAPTCHA_NOT_FOUND); + this.createLoginLog(username, logTypeEnum, LoginResultEnum.CAPTCHA_NOT_FOUND); throw exception(AUTH_LOGIN_CAPTCHA_NOT_FOUND); } // 验证码不正确 if (!code.equals(captchaCode)) { // 创建登录失败日志(验证码不正确) - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.CAPTCHA_CODE_ERROR); + this.createLoginLog(username, logTypeEnum, LoginResultEnum.CAPTCHA_CODE_ERROR); throw exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR); } // 正确,所以要删除下验证码 @@ -148,7 +147,7 @@ public class SysAuthServiceImpl implements SysAuthService { } private LoginUser login0(String username, String password) { - final SysLoginLogTypeEnum logTypeEnum = SysLoginLogTypeEnum.LOGIN_USERNAME; + final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; // 用户验证 Authentication authentication; try { @@ -158,23 +157,23 @@ public class SysAuthServiceImpl implements SysAuthService { username, password, getUserType())); // org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username); } catch (BadCredentialsException badCredentialsException) { - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.BAD_CREDENTIALS); + this.createLoginLog(username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); throw exception(AUTH_LOGIN_BAD_CREDENTIALS); } catch (DisabledException disabledException) { - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.USER_DISABLED); + this.createLoginLog(username, logTypeEnum, LoginResultEnum.USER_DISABLED); throw exception(AUTH_LOGIN_USER_DISABLED); } catch (AuthenticationException authenticationException) { log.error("[login0][username({}) 发生未知异常]", username, authenticationException); - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.UNKNOWN_ERROR); + this.createLoginLog(username, logTypeEnum, LoginResultEnum.UNKNOWN_ERROR); throw exception(AUTH_LOGIN_FAIL_UNKNOWN); } // 登录成功的日志 Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.SUCCESS); + this.createLoginLog(username, logTypeEnum, LoginResultEnum.SUCCESS); return (LoginUser) authentication.getPrincipal(); } - private void createLoginLog(String username, SysLoginLogTypeEnum logTypeEnum, SysLoginResultEnum loginResult) { + private void createLoginLog(String username, LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { // 获得用户 SysUserDO user = userService.getUserByUsername(username); // 插入登录日志 @@ -191,7 +190,7 @@ public class SysAuthServiceImpl implements SysAuthService { reqDTO.setResult(loginResult.getResult()); loginLogCoreService.createLoginLog(reqDTO); // 更新最后登录时间 - if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { + if (user != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { userService.updateUserLogin(user.getId(), ServletUtils.getClientIP()); } } @@ -207,7 +206,7 @@ public class SysAuthServiceImpl implements SysAuthService { } @Override - public String socialLogin(SysAuthSocialLoginReqVO reqVO, String userIp, String userAgent) { + public String socialLogin(AuthSocialLoginReqVO reqVO, String userIp, String userAgent) { // 使用 code 授权码,进行登录 AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); Assert.notNull(authUser, "授权用户不为空"); @@ -224,7 +223,7 @@ public class SysAuthServiceImpl implements SysAuthService { if (user == null) { throw exception(USER_NOT_EXISTS); } - this.createLoginLog(user.getUsername(), SysLoginLogTypeEnum.LOGIN_SOCIAL, SysLoginResultEnum.SUCCESS); + this.createLoginLog(user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL, LoginResultEnum.SUCCESS); // 创建 LoginUser 对象 LoginUser loginUser = this.buildLoginUser(user); @@ -237,7 +236,7 @@ public class SysAuthServiceImpl implements SysAuthService { } @Override - public String socialLogin2(SysAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) { + public String socialLogin2(AuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) { // 使用 code 授权码,进行登录 AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); Assert.notNull(authUser, "授权用户不为空"); @@ -253,7 +252,7 @@ public class SysAuthServiceImpl implements SysAuthService { } @Override - public void socialBind(Long userId, SysAuthSocialBindReqVO reqVO) { + public void socialBind(Long userId, AuthSocialBindReqVO reqVO) { // 使用 code 授权码,进行登录 AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); Assert.notNull(authUser, "授权用户不为空"); @@ -282,14 +281,14 @@ public class SysAuthServiceImpl implements SysAuthService { private void createLogoutLog(Long userId, String username) { SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); - reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType()); + reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); reqDTO.setUserId(userId); reqDTO.setUserType(getUserType().getValue()); reqDTO.setUsername(username); reqDTO.setUserAgent(ServletUtils.getUserAgent()); reqDTO.setUserIp(ServletUtils.getClientIP()); - reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); loginLogCoreService.createLoginLog(reqDTO); } @@ -324,7 +323,7 @@ public class SysAuthServiceImpl implements SysAuthService { } private LoginUser buildLoginUser(SysUserDO user) { - LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user); + LoginUser loginUser = AuthConvert.INSTANCE.convert(user); // 补全字段 loginUser.setDeptId(user.getDeptId()); loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java similarity index 72% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java index f47c04b8bf..af318fec4f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.service.auth; -import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; * * @author 芋道源码 */ -public interface SysUserSessionService { +public interface UserSessionService { /** * 获得在线用户分页列表 @@ -17,7 +17,7 @@ public interface SysUserSessionService { * @param reqVO 分页条件 * @return 份额与列表 */ - PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO); + PageResult getUserSessionPage(UserSessionPageReqVO reqVO); /** * 移除超时的在线用户 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java similarity index 83% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java index 83bc371cb3..23d68cd6e3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java @@ -2,12 +2,11 @@ package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.module.system.service.auth.SysUserSessionService; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; +import cn.iocoder.yudao.module.system.service.user.UserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; @@ -35,12 +34,12 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. */ @Slf4j @Service -public class SysUserSessionServiceImpl implements SysUserSessionService { +public class UserSessionServiceImpl implements UserSessionService { @Resource private SysUserSessionMapper userSessionMapper; @Resource - private SysUserService userService; + private UserService userService; @Resource private SysLoginLogCoreService loginLogCoreService; @@ -48,7 +47,7 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO; @Override - public PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO) { + public PageResult getUserSessionPage(UserSessionPageReqVO reqVO) { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUsername())) { @@ -82,14 +81,14 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { private void createTimeoutLogoutLog(Collection timeoutSessionDOS) { for (SysUserSessionDO timeoutSessionDO : timeoutSessionDOS) { SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); - reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_TIMEOUT.getType()); + reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_TIMEOUT.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); reqDTO.setUserId(timeoutSessionDO.getUserId()); reqDTO.setUserType(timeoutSessionDO.getUserType()); reqDTO.setUsername(timeoutSessionDO.getUsername()); reqDTO.setUserAgent(timeoutSessionDO.getUserAgent()); reqDTO.setUserIp(timeoutSessionDO.getUserIp()); - reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); loginLogCoreService.createLoginLog(reqDTO); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/CaptchaService.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/CaptchaService.java index c6a20b909d..ecb05d88a2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/CaptchaService.java @@ -1,18 +1,18 @@ package cn.iocoder.yudao.module.system.service.common; -import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.module.system.controller.admin.common.vo.CaptchaImageRespVO; /** * 验证码 Service 接口 */ -public interface SysCaptchaService { +public interface CaptchaService { /** * 获得验证码图片 * * @return 验证码图片 */ - SysCaptchaImageRespVO getCaptchaImage(); + CaptchaImageRespVO getCaptchaImage(); /** * 是否开启图片验证码 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/CaptchaServiceImpl.java similarity index 68% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/CaptchaServiceImpl.java index c97ca037c6..1c1a388757 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/common/CaptchaServiceImpl.java @@ -3,11 +3,10 @@ package cn.iocoder.yudao.module.system.service.common; import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.CircleCaptcha; import cn.hutool.core.util.IdUtil; +import cn.iocoder.yudao.module.system.convert.common.CaptchaConvert; import cn.iocoder.yudao.module.system.framework.captcha.config.CaptchaProperties; -import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.yudao.module.system.convert.common.SysCaptchaConvert; -import cn.iocoder.yudao.module.system.dal.redis.common.SysCaptchaRedisDAO; -import cn.iocoder.yudao.module.system.service.common.SysCaptchaService; +import cn.iocoder.yudao.module.system.controller.admin.common.vo.CaptchaImageRespVO; +import cn.iocoder.yudao.module.system.dal.redis.common.CaptchaRedisDAO; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -16,23 +15,23 @@ import javax.annotation.Resource; * 验证码 Service 实现类 */ @Service -public class SysCaptchaServiceImpl implements SysCaptchaService { +public class CaptchaServiceImpl implements CaptchaService { @Resource private CaptchaProperties captchaProperties; @Resource - private SysCaptchaRedisDAO captchaRedisDAO; + private CaptchaRedisDAO captchaRedisDAO; @Override - public SysCaptchaImageRespVO getCaptchaImage() { + public CaptchaImageRespVO getCaptchaImage() { // 生成验证码 CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight()); // 缓存到 Redis 中 String uuid = IdUtil.fastSimpleUUID(); captchaRedisDAO.set(uuid, captcha.getCode(), captchaProperties.getTimeout()); // 返回 - return SysCaptchaConvert.INSTANCE.convert(uuid, captcha); + return CaptchaConvert.INSTANCE.convert(uuid, captcha); } @Override diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java index 79913ed536..e8397b542a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.service.dept; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import java.util.List; @@ -12,7 +12,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface SysDeptService { +public interface DeptService { /** * 初始化部门的本地缓存 @@ -25,14 +25,14 @@ public interface SysDeptService { * @param reqVO 部门信息 * @return 部门编号 */ - Long createDept(SysDeptCreateReqVO reqVO); + Long createDept(DeptCreateReqVO reqVO); /** * 更新部门 * * @param reqVO 部门信息 */ - void updateDept(SysDeptUpdateReqVO reqVO); + void updateDept(DeptUpdateReqVO reqVO); /** * 删除部门 @@ -48,7 +48,7 @@ public interface SysDeptService { * @param reqVO 筛选条件请求 VO * @return 部门列表 */ - List getSimpleDepts(SysDeptListReqVO reqVO); + List getSimpleDepts(DeptListReqVO reqVO); /** * 获得所有子部门,从缓存中 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java index f4f2773e87..2f9c1a7139 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java @@ -4,15 +4,14 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.dept.SysDeptConvert; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.dept.DeptConvert; import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; -import cn.iocoder.yudao.module.system.mq.producer.dept.SysDeptProducer; -import cn.iocoder.yudao.module.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; @@ -25,7 +24,7 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -36,7 +35,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @Service @Validated @Slf4j -public class SysDeptServiceImpl implements SysDeptService { +public class DeptServiceImpl implements DeptService { /** * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 @@ -69,7 +68,7 @@ public class SysDeptServiceImpl implements SysDeptService { private SysDeptMapper deptMapper; @Resource - private SysDeptProducer deptProducer; + private DeptProducer deptProducer; @Override @PostConstruct @@ -122,11 +121,11 @@ public class SysDeptServiceImpl implements SysDeptService { } @Override - public Long createDept(SysDeptCreateReqVO reqVO) { + public Long createDept(DeptCreateReqVO reqVO) { // 校验正确性 checkCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName()); // 插入部门 - SysDeptDO dept = SysDeptConvert.INSTANCE.convert(reqVO); + SysDeptDO dept = DeptConvert.INSTANCE.convert(reqVO); deptMapper.insert(dept); // 发送刷新消息 deptProducer.sendDeptRefreshMessage(); @@ -134,11 +133,11 @@ public class SysDeptServiceImpl implements SysDeptService { } @Override - public void updateDept(SysDeptUpdateReqVO reqVO) { + public void updateDept(DeptUpdateReqVO reqVO) { // 校验正确性 checkCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName()); // 更新部门 - SysDeptDO updateObj = SysDeptConvert.INSTANCE.convert(reqVO); + SysDeptDO updateObj = DeptConvert.INSTANCE.convert(reqVO); deptMapper.updateById(updateObj); // 发送刷新消息 deptProducer.sendDeptRefreshMessage(); @@ -159,7 +158,7 @@ public class SysDeptServiceImpl implements SysDeptService { } @Override - public List getSimpleDepts(SysDeptListReqVO reqVO) { + public List getSimpleDepts(DeptListReqVO reqVO) { return deptMapper.selectList(reqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java similarity index 76% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java index def06e25a1..73e9759b72 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java @@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.system.service.dept; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import org.springframework.lang.Nullable; @@ -19,7 +19,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; * * @author 芋道源码 */ -public interface SysPostService { +public interface PostService { /** * 创建岗位 @@ -27,14 +27,14 @@ public interface SysPostService { * @param reqVO 岗位信息 * @return 岗位编号 */ - Long createPost(SysPostCreateReqVO reqVO); + Long createPost(PostCreateReqVO reqVO); /** * 更新岗位 * * @param reqVO 岗位信息 */ - void updatePost(SysPostUpdateReqVO reqVO); + void updatePost(PostUpdateReqVO reqVO); /** * 删除岗位信息 @@ -68,7 +68,7 @@ public interface SysPostService { * @param reqVO 分页条件 * @return 部门分页列表 */ - PageResult getPostPage(SysPostPageReqVO reqVO); + PageResult getPostPage(PostPageReqVO reqVO); /** * 获得岗位列表 @@ -76,7 +76,7 @@ public interface SysPostService { * @param reqVO 查询条件 * @return 部门列表 */ - List getPosts(SysPostExportReqVO reqVO); + List getPosts(PostExportReqVO reqVO); /** * 获得岗位信息 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java similarity index 77% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java index 178daeeae7..971743a29d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java @@ -2,14 +2,13 @@ package cn.iocoder.yudao.module.system.service.dept; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.dept.SysPostConvert; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.dept.PostConvert; import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.service.dept.SysPostService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -17,7 +16,7 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.List; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -27,27 +26,27 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU */ @Service @Validated -public class SysPostServiceImpl implements SysPostService { +public class PostServiceImpl implements PostService { @Resource private SysPostMapper postMapper; @Override - public Long createPost(SysPostCreateReqVO reqVO) { + public Long createPost(PostCreateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getCode()); // 插入岗位 - SysPostDO post = SysPostConvert.INSTANCE.convert(reqVO); + SysPostDO post = PostConvert.INSTANCE.convert(reqVO); postMapper.insert(post); return post.getId(); } @Override - public void updatePost(SysPostUpdateReqVO reqVO) { + public void updatePost(PostUpdateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), reqVO.getCode()); // 更新岗位 - SysPostDO updateObj = SysPostConvert.INSTANCE.convert(reqVO); + SysPostDO updateObj = PostConvert.INSTANCE.convert(reqVO); postMapper.updateById(updateObj); } @@ -65,12 +64,12 @@ public class SysPostServiceImpl implements SysPostService { } @Override - public PageResult getPostPage(SysPostPageReqVO reqVO) { + public PageResult getPostPage(PostPageReqVO reqVO) { return postMapper.selectPage(reqVO); } @Override - public List getPosts(SysPostExportReqVO reqVO) { + public List getPosts(PostExportReqVO reqVO) { return postMapper.selectList(reqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java similarity index 67% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java index 30d4690982..c7b60e0ad0 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java @@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; import java.util.List; @@ -14,7 +14,7 @@ import java.util.List; * * @author ruoyi */ -public interface SysDictDataService { +public interface DictDataService { /** * 创建字典数据 @@ -22,14 +22,14 @@ public interface SysDictDataService { * @param reqVO 字典数据信息 * @return 字典数据编号 */ - Long createDictData(SysDictDataCreateReqVO reqVO); + Long createDictData(DictDataCreateReqVO reqVO); /** * 更新字典数据 * * @param reqVO 字典数据信息 */ - void updateDictData(SysDictDataUpdateReqVO reqVO); + void updateDictData(DictDataUpdateReqVO reqVO); /** * 删除字典数据 @@ -51,7 +51,7 @@ public interface SysDictDataService { * @param reqVO 分页请求 * @return 字典数据分页列表 */ - PageResult getDictDataPage(SysDictDataPageReqVO reqVO); + PageResult getDictDataPage(DictDataPageReqVO reqVO); /** * 获得字典数据列表 @@ -59,7 +59,7 @@ public interface SysDictDataService { * @param reqVO 列表请求 * @return 字典数据列表 */ - List getDictDatas(SysDictDataExportReqVO reqVO); + List getDictDatas(DictDataExportReqVO reqVO); /** * 获得字典数据详情 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java similarity index 77% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java index 1037779f08..0d25f87ca5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java @@ -1,15 +1,15 @@ package cn.iocoder.yudao.module.system.service.dict; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.dict.SysDictDataConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.dict.DictDataConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictDataMapper; -import cn.iocoder.yudao.module.system.mq.producer.dict.SysDictDataProducer; -import cn.iocoder.yudao.module.system.service.dict.SysDictDataService; -import cn.iocoder.yudao.module.system.service.dict.SysDictTypeService; +import cn.iocoder.yudao.module.system.mq.producer.dict.DictDataProducer; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; +import cn.iocoder.yudao.module.system.service.dict.DictTypeService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -20,7 +20,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -30,7 +30,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU */ @Service @Slf4j -public class SysDictDataServiceImpl implements SysDictDataService { +public class DictDataServiceImpl implements DictDataService { /** * 排序 dictType > sort @@ -40,13 +40,13 @@ public class SysDictDataServiceImpl implements SysDictDataService { .thenComparingInt(SysDictDataDO::getSort); @Resource - private SysDictTypeService dictTypeService; + private DictTypeService dictTypeService; @Resource private SysDictDataMapper dictDataMapper; @Resource - private SysDictDataProducer dictDataProducer; + private DictDataProducer dictDataProducer; /** * 如果字典数据发生变化,从数据库中获取最新的全量字典数据。 @@ -77,12 +77,12 @@ public class SysDictDataServiceImpl implements SysDictDataService { } @Override - public PageResult getDictDataPage(SysDictDataPageReqVO reqVO) { + public PageResult getDictDataPage(DictDataPageReqVO reqVO) { return dictDataMapper.selectPage(reqVO); } @Override - public List getDictDatas(SysDictDataExportReqVO reqVO) { + public List getDictDatas(DictDataExportReqVO reqVO) { List list = dictDataMapper.selectList(reqVO); list.sort(COMPARATOR_TYPE_AND_SORT); return list; @@ -94,11 +94,11 @@ public class SysDictDataServiceImpl implements SysDictDataService { } @Override - public Long createDictData(SysDictDataCreateReqVO reqVO) { + public Long createDictData(DictDataCreateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(null, reqVO.getValue(), reqVO.getDictType()); // 插入字典类型 - SysDictDataDO dictData = SysDictDataConvert.INSTANCE.convert(reqVO); + SysDictDataDO dictData = DictDataConvert.INSTANCE.convert(reqVO); dictDataMapper.insert(dictData); // 发送刷新消息 dictDataProducer.sendDictDataRefreshMessage(); @@ -106,11 +106,11 @@ public class SysDictDataServiceImpl implements SysDictDataService { } @Override - public void updateDictData(SysDictDataUpdateReqVO reqVO) { + public void updateDictData(DictDataUpdateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(reqVO.getId(), reqVO.getValue(), reqVO.getDictType()); // 更新字典类型 - SysDictDataDO updateObj = SysDictDataConvert.INSTANCE.convert(reqVO); + SysDictDataDO updateObj = DictDataConvert.INSTANCE.convert(reqVO); dictDataMapper.updateById(updateObj); // 发送刷新消息 dictDataProducer.sendDictDataRefreshMessage(); @@ -169,7 +169,7 @@ public class SysDictDataServiceImpl implements SysDictDataService { @VisibleForTesting public void checkDictTypeValid(String type) { - SysDictTypeDO dictType = dictTypeService.getDictType(type); + DictTypeDO dictType = dictTypeService.getDictType(type); if (dictType == null) { throw exception(DICT_TYPE_NOT_EXISTS); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java similarity index 57% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java index a115269a63..4b334b08be 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import java.util.List; @@ -14,7 +14,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface SysDictTypeService { +public interface DictTypeService { /** * 创建字典类型 @@ -22,14 +22,14 @@ public interface SysDictTypeService { * @param reqVO 字典类型信息 * @return 字典类型编号 */ - Long createDictType(SysDictTypeCreateReqVO reqVO); + Long createDictType(DictTypeCreateReqVO reqVO); /** * 更新字典类型 * * @param reqVO 字典类型信息 */ - void updateDictType(SysDictTypeUpdateReqVO reqVO); + void updateDictType(DictTypeUpdateReqVO reqVO); /** * 删除字典类型 @@ -44,7 +44,7 @@ public interface SysDictTypeService { * @param reqVO 分页请求 * @return 字典类型分页列表 */ - PageResult getDictTypePage(SysDictTypePageReqVO reqVO); + PageResult getDictTypePage(DictTypePageReqVO reqVO); /** * 获得字典类型列表 @@ -52,7 +52,7 @@ public interface SysDictTypeService { * @param reqVO 列表请求 * @return 字典类型列表 */ - List getDictTypeList(SysDictTypeExportReqVO reqVO); + List getDictTypeList(DictTypeExportReqVO reqVO); /** * 获得字典类型详情 @@ -60,7 +60,7 @@ public interface SysDictTypeService { * @param id 字典类型编号 * @return 字典类型 */ - SysDictTypeDO getDictType(Long id); + DictTypeDO getDictType(Long id); /** * 获得字典类型详情 @@ -68,13 +68,13 @@ public interface SysDictTypeService { * @param type 字典类型 * @return 字典类型详情 */ - SysDictTypeDO getDictType(String type); + DictTypeDO getDictType(String type); /** * 获得全部字典类型列表 * * @return 字典类型列表 */ - List getDictTypeList(); + List getDictTypeList(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java similarity index 66% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java index 7cfb1a9660..222269b511 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.dict.SysDictTypeConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.dict.DictTypeConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictTypeMapper; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 字典类型 Service 实现类 @@ -23,57 +23,57 @@ import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; * @author 芋道源码 */ @Service -public class SysDictTypeServiceImpl implements SysDictTypeService { +public class DictTypeServiceImpl implements DictTypeService { @Resource - private SysDictDataService dictDataService; + private DictDataService dictDataService; @Resource private SysDictTypeMapper dictTypeMapper; @Override - public PageResult getDictTypePage(SysDictTypePageReqVO reqVO) { + public PageResult getDictTypePage(DictTypePageReqVO reqVO) { return dictTypeMapper.selectPage(reqVO); } @Override - public List getDictTypeList(SysDictTypeExportReqVO reqVO) { + public List getDictTypeList(DictTypeExportReqVO reqVO) { return dictTypeMapper.selectList(reqVO); } @Override - public SysDictTypeDO getDictType(Long id) { + public DictTypeDO getDictType(Long id) { return dictTypeMapper.selectById(id); } @Override - public SysDictTypeDO getDictType(String type) { + public DictTypeDO getDictType(String type) { return dictTypeMapper.selectByType(type); } @Override - public Long createDictType(SysDictTypeCreateReqVO reqVO) { + public Long createDictType(DictTypeCreateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getType()); // 插入字典类型 - SysDictTypeDO dictType = SysDictTypeConvert.INSTANCE.convert(reqVO); + DictTypeDO dictType = DictTypeConvert.INSTANCE.convert(reqVO); dictTypeMapper.insert(dictType); return dictType.getId(); } @Override - public void updateDictType(SysDictTypeUpdateReqVO reqVO) { + public void updateDictType(DictTypeUpdateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), null); // 更新字典类型 - SysDictTypeDO updateObj = SysDictTypeConvert.INSTANCE.convert(reqVO); + DictTypeDO updateObj = DictTypeConvert.INSTANCE.convert(reqVO); dictTypeMapper.updateById(updateObj); } @Override public void deleteDictType(Long id) { // 校验是否存在 - SysDictTypeDO dictType = this.checkDictTypeExists(id); + DictTypeDO dictType = this.checkDictTypeExists(id); // 校验是否有字典数据 if (dictDataService.countByDictType(dictType.getType()) > 0) { throw exception(DICT_TYPE_HAS_CHILDREN); @@ -83,7 +83,7 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { } @Override - public List getDictTypeList() { + public List getDictTypeList() { return dictTypeMapper.selectList(); } @@ -98,7 +98,7 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { @VisibleForTesting public void checkDictTypeNameUnique(Long id, String name) { - SysDictTypeDO dictType = dictTypeMapper.selectByName(name); + DictTypeDO dictType = dictTypeMapper.selectByName(name); if (dictType == null) { return; } @@ -113,7 +113,7 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { @VisibleForTesting public void checkDictTypeUnique(Long id, String type) { - SysDictTypeDO dictType = dictTypeMapper.selectByType(type); + DictTypeDO dictType = dictTypeMapper.selectByType(type); if (dictType == null) { return; } @@ -127,11 +127,11 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { } @VisibleForTesting - public SysDictTypeDO checkDictTypeExists(Long id) { + public DictTypeDO checkDictTypeExists(Long id) { if (id == null) { return null; } - SysDictTypeDO dictType = dictTypeMapper.selectById(id); + DictTypeDO dictType = dictTypeMapper.selectById(id); if (dictType == null) { throw exception(DICT_TYPE_NOT_EXISTS); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeService.java similarity index 54% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeService.java index 0eff899066..18875f628d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeService.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.module.system.service.errorcode; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.ErrorCodeDO; import cn.iocoder.yudao.module.system.framework.errorcode.core.service.ErrorCodeFrameworkService; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; import javax.validation.Valid; import java.util.List; @@ -16,7 +16,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface SysErrorCodeService extends ErrorCodeFrameworkService { +public interface ErrorCodeService extends ErrorCodeFrameworkService { /** * 创建错误码 @@ -24,14 +24,14 @@ public interface SysErrorCodeService extends ErrorCodeFrameworkService { * @param createReqVO 创建信息 * @return 编号 */ - Long createErrorCode(@Valid SysErrorCodeCreateReqVO createReqVO); + Long createErrorCode(@Valid ErrorCodeCreateReqVO createReqVO); /** * 更新错误码 * * @param updateReqVO 更新信息 */ - void updateErrorCode(@Valid SysErrorCodeUpdateReqVO updateReqVO); + void updateErrorCode(@Valid ErrorCodeUpdateReqVO updateReqVO); /** * 删除错误码 @@ -46,7 +46,7 @@ public interface SysErrorCodeService extends ErrorCodeFrameworkService { * @param id 编号 * @return 错误码 */ - SysErrorCodeDO getErrorCode(Long id); + ErrorCodeDO getErrorCode(Long id); /** * 获得错误码分页 @@ -54,7 +54,7 @@ public interface SysErrorCodeService extends ErrorCodeFrameworkService { * @param pageReqVO 分页查询 * @return 错误码分页 */ - PageResult getErrorCodePage(SysErrorCodePageReqVO pageReqVO); + PageResult getErrorCodePage(ErrorCodePageReqVO pageReqVO); /** * 获得错误码列表, 用于 Excel 导出 @@ -62,6 +62,6 @@ public interface SysErrorCodeService extends ErrorCodeFrameworkService { * @param exportReqVO 查询条件 * @return 错误码列表 */ - List getErrorCodeList(SysErrorCodeExportReqVO exportReqVO); + List getErrorCodeList(ErrorCodeExportReqVO exportReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceImpl.java similarity index 66% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceImpl.java index af4e9f352a..d347d79810 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceImpl.java @@ -2,17 +2,16 @@ package cn.iocoder.yudao.module.system.service.errorcode; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.ErrorCodeDO; import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeRespDTO; -import cn.iocoder.yudao.module.system.convert.errorcode.SysErrorCodeConvert; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.convert.errorcode.ErrorCodeConvert; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; import cn.iocoder.yudao.module.system.dal.mysql.errorcode.SysErrorCodeMapper; -import cn.iocoder.yudao.module.system.enums.errorcode.SysErrorCodeTypeEnum; -import cn.iocoder.yudao.module.system.service.errorcode.SysErrorCodeService; +import cn.iocoder.yudao.module.system.enums.errorcode.ErrorCodeTypeEnum; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -25,7 +24,7 @@ import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -37,34 +36,34 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. @Service @Validated @Slf4j -public class SysErrorCodeServiceImpl implements SysErrorCodeService { +public class ErrorCodeServiceImpl implements ErrorCodeService { @Resource private SysErrorCodeMapper errorCodeMapper; @Override - public Long createErrorCode(SysErrorCodeCreateReqVO createReqVO) { + public Long createErrorCode(ErrorCodeCreateReqVO createReqVO) { // 校验 code 重复 validateCodeDuplicate(createReqVO.getCode(), null); // 插入 - SysErrorCodeDO errorCode = SysErrorCodeConvert.INSTANCE.convert(createReqVO) - .setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()); + ErrorCodeDO errorCode = ErrorCodeConvert.INSTANCE.convert(createReqVO) + .setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()); errorCodeMapper.insert(errorCode); // 返回 return errorCode.getId(); } @Override - public void updateErrorCode(SysErrorCodeUpdateReqVO updateReqVO) { + public void updateErrorCode(ErrorCodeUpdateReqVO updateReqVO) { // 校验存在 this.validateErrorCodeExists(updateReqVO.getId()); // 校验 code 重复 validateCodeDuplicate(updateReqVO.getCode(), updateReqVO.getId()); // 更新 - SysErrorCodeDO updateObj = SysErrorCodeConvert.INSTANCE.convert(updateReqVO) - .setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()); + ErrorCodeDO updateObj = ErrorCodeConvert.INSTANCE.convert(updateReqVO) + .setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()); errorCodeMapper.updateById(updateObj); } @@ -86,7 +85,7 @@ public class SysErrorCodeServiceImpl implements SysErrorCodeService { */ @VisibleForTesting public void validateCodeDuplicate(Integer code, Long id) { - SysErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(code); + ErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(code); if (errorCodeDO == null) { return; } @@ -107,17 +106,17 @@ public class SysErrorCodeServiceImpl implements SysErrorCodeService { } @Override - public SysErrorCodeDO getErrorCode(Long id) { + public ErrorCodeDO getErrorCode(Long id) { return errorCodeMapper.selectById(id); } @Override - public PageResult getErrorCodePage(SysErrorCodePageReqVO pageReqVO) { + public PageResult getErrorCodePage(ErrorCodePageReqVO pageReqVO) { return errorCodeMapper.selectPage(pageReqVO); } @Override - public List getErrorCodeList(SysErrorCodeExportReqVO exportReqVO) { + public List getErrorCodeList(ErrorCodeExportReqVO exportReqVO) { return errorCodeMapper.selectList(exportReqVO); } @@ -128,23 +127,23 @@ public class SysErrorCodeServiceImpl implements SysErrorCodeService { return; } // 获得错误码 - List errorCodeDOs = errorCodeMapper.selectListByCodes( + List errorCodeDOs = errorCodeMapper.selectListByCodes( convertSet(autoGenerateDTOs, ErrorCodeAutoGenerateReqDTO::getCode)); - Map errorCodeDOMap = convertMap(errorCodeDOs, SysErrorCodeDO::getCode); + Map errorCodeDOMap = convertMap(errorCodeDOs, ErrorCodeDO::getCode); // 遍历 autoGenerateBOs 数组,逐个插入或更新。考虑到每次量级不大,就不走批量了 autoGenerateDTOs.forEach(autoGenerateDTO -> { - SysErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode()); + ErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode()); // 不存在,则进行新增 if (errorCodeDO == null) { - errorCodeDO = SysErrorCodeConvert.INSTANCE.convert(autoGenerateDTO) - .setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); + errorCodeDO = ErrorCodeConvert.INSTANCE.convert(autoGenerateDTO) + .setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); errorCodeMapper.insert(errorCodeDO); return; } // 存在,则进行更新。更新有三个前置条件: // 条件 1. 只更新自动生成的错误码,即 Type 为 ErrorCodeTypeEnum.AUTO_GENERATION - if (!SysErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) { + if (!ErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) { return; } // 条件 2. 分组 applicationName 必须匹配,避免存在错误码冲突的情况 @@ -159,15 +158,15 @@ public class SysErrorCodeServiceImpl implements SysErrorCodeService { return; } // 最终匹配,进行更新 - errorCodeMapper.updateById(new SysErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage())); + errorCodeMapper.updateById(new ErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage())); }); } @Override public List getErrorCodeList(String applicationName, Date minUpdateTime) { - List errorCodeDOs = errorCodeMapper.selectListByApplicationNameAndUpdateTimeGt( + List errorCodeDOs = errorCodeMapper.selectListByApplicationNameAndUpdateTimeGt( applicationName, minUpdateTime); - return SysErrorCodeConvert.INSTANCE.convertList03(errorCodeDOs); + return ErrorCodeConvert.INSTANCE.convertList03(errorCodeDOs); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java similarity index 58% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java index 8dbff7d4d8..7643fe1151 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.logger; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -10,7 +10,7 @@ import java.util.List; /** * 登录日志 Service 接口 */ -public interface SysLoginLogService { +public interface LoginLogService { /** * 获得登录日志分页 @@ -18,7 +18,7 @@ public interface SysLoginLogService { * @param reqVO 分页条件 * @return 登录日志分页 */ - PageResult getLoginLogPage(SysLoginLogPageReqVO reqVO); + PageResult getLoginLogPage(LoginLogPageReqVO reqVO); /** * 获得登录日志列表 @@ -26,6 +26,6 @@ public interface SysLoginLogService { * @param reqVO 列表条件 * @return 登录日志列表 */ - List getLoginLogList(SysLoginLogExportReqVO reqVO); + List getLoginLogList(LoginLogExportReqVO reqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java new file mode 100644 index 0000000000..d2f35aee8b --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.service.logger; + +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.LoginLogMapper; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 登录日志 Service 实现 + */ +@Service +public class LoginLogServiceImpl implements LoginLogService { + + @Resource + private LoginLogMapper loginLogMapper; + + @Override + public PageResult getLoginLogPage(LoginLogPageReqVO reqVO) { + return loginLogMapper.selectPage(reqVO); + } + + @Override + public List getLoginLogList(LoginLogExportReqVO reqVO) { + return loginLogMapper.selectList(reqVO); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java similarity index 51% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java index 4bab97586f..4ec2d8f011 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java @@ -2,16 +2,16 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkService; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import java.util.List; /** * 操作日志 Service 接口 */ -public interface SysOperateLogService extends OperateLogFrameworkService { +public interface OperateLogService extends OperateLogFrameworkService { /** * 获得操作日志分页列表 @@ -19,7 +19,7 @@ public interface SysOperateLogService extends OperateLogFrameworkService { * @param reqVO 分页条件 * @return 操作日志分页列表 */ - PageResult getOperateLogPage(SysOperateLogPageReqVO reqVO); + PageResult getOperateLogPage(OperateLogPageReqVO reqVO); /** * 获得操作日志列表 @@ -27,6 +27,6 @@ public interface SysOperateLogService extends OperateLogFrameworkService { * @param reqVO 列表条件 * @return 日志列表 */ - List getOperateLogs(SysOperateLogExportReqVO reqVO); + List getOperateLogs(OperateLogExportReqVO reqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java index c89c37b3e3..fab8ddfaa9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java @@ -2,13 +2,12 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.module.system.convert.logger.SysOperateLogConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.yudao.module.system.dal.mysql.logger.SysOperateLogMapper; -import cn.iocoder.yudao.module.system.service.logger.SysOperateLogService; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import cn.iocoder.yudao.module.system.convert.logger.OperateLogConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; +import cn.iocoder.yudao.module.system.service.user.UserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.string.StrUtils; @@ -24,26 +23,26 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.Future; -import static cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; -import static cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; +import static cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; +import static cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO.RESULT_MAX_LENGTH; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Service @Slf4j -public class SysOperateLogServiceImpl implements SysOperateLogService { +public class OperateLogServiceImpl implements OperateLogService { @Resource - private SysOperateLogMapper operateLogMapper; + private OperateLogMapper operateLogMapper; @Resource - private SysUserService userService; + private UserService userService; @Override @Async public Future createOperateLogAsync(OperateLogCreateReqDTO reqVO) { boolean success = false; try { - SysOperateLogDO logDO = SysOperateLogConvert.INSTANCE.convert(reqVO); + OperateLogDO logDO = OperateLogConvert.INSTANCE.convert(reqVO); logDO.setJavaMethodArgs(StrUtils.maxLength(logDO.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); logDO.setResultData(StrUtils.maxLength(logDO.getResultData(), RESULT_MAX_LENGTH)); success = operateLogMapper.insert(logDO) == 1; @@ -55,7 +54,7 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { } @Override - public PageResult getOperateLogPage(SysOperateLogPageReqVO reqVO) { + public PageResult getOperateLogPage(OperateLogPageReqVO reqVO) { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { @@ -69,7 +68,7 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { } @Override - public List getOperateLogs(SysOperateLogExportReqVO reqVO) { + public List getOperateLogs(OperateLogExportReqVO reqVO) { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImpl.java deleted file mode 100644 index 5d708773a7..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.system.service.logger; - -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.mysql.logger.SysLoginLogMapper; -import cn.iocoder.yudao.module.system.service.logger.SysLoginLogService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 登录日志 Service 实现 - */ -@Service -public class SysLoginLogServiceImpl implements SysLoginLogService { - - @Resource - private SysLoginLogMapper loginLogMapper; - - @Override - public PageResult getLoginLogPage(SysLoginLogPageReqVO reqVO) { - return loginLogMapper.selectPage(reqVO); - } - - @Override - public List getLoginLogList(SysLoginLogExportReqVO reqVO) { - return loginLogMapper.selectList(reqVO); - } - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeService.java similarity index 59% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeService.java index c832beff30..264fc3048f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeService.java @@ -1,15 +1,15 @@ package cn.iocoder.yudao.module.system.service.notice; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; /** * 通知公告 Service 接口 */ -public interface SysNoticeService { +public interface NoticeService { /** * 创建岗位公告公告 @@ -17,14 +17,14 @@ public interface SysNoticeService { * @param reqVO 岗位公告公告信息 * @return 岗位公告公告编号 */ - Long createNotice(SysNoticeCreateReqVO reqVO); + Long createNotice(NoticeCreateReqVO reqVO); /** * 更新岗位公告公告 * * @param reqVO 岗位公告公告信息 */ - void updateNotice(SysNoticeUpdateReqVO reqVO); + void updateNotice(NoticeUpdateReqVO reqVO); /** * 删除岗位公告公告信息 @@ -39,7 +39,7 @@ public interface SysNoticeService { * @param reqVO 分页条件 * @return 部门分页列表 */ - PageResult pageNotices(SysNoticePageReqVO reqVO); + PageResult pageNotices(NoticePageReqVO reqVO); /** * 获得岗位公告公告信息 @@ -47,6 +47,6 @@ public interface SysNoticeService { * @param id 岗位公告公告编号 * @return 岗位公告公告信息 */ - SysNoticeDO getNotice(Long id); + NoticeDO getNotice(Long id); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java similarity index 56% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java index aa9f4a694d..2ca561ac43 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java @@ -2,19 +2,18 @@ package cn.iocoder.yudao.module.system.service.notice; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.notice.SysNoticeConvert; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.notice.NoticeConvert; import cn.iocoder.yudao.module.system.dal.mysql.notice.SysNoticeMapper; -import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; -import cn.iocoder.yudao.module.system.service.notice.SysNoticeService; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.NOTICE_NOT_FOUND; /** * 通知公告 Service 实现类 @@ -22,24 +21,24 @@ import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.NOTICE_ * @author 芋道源码 */ @Service -public class SysNoticeServiceImpl implements SysNoticeService { +public class NoticeServiceImpl implements NoticeService { @Resource private SysNoticeMapper noticeMapper; @Override - public Long createNotice(SysNoticeCreateReqVO reqVO) { - SysNoticeDO notice = SysNoticeConvert.INSTANCE.convert(reqVO); + public Long createNotice(NoticeCreateReqVO reqVO) { + NoticeDO notice = NoticeConvert.INSTANCE.convert(reqVO); noticeMapper.insert(notice); return notice.getId(); } @Override - public void updateNotice(SysNoticeUpdateReqVO reqVO) { + public void updateNotice(NoticeUpdateReqVO reqVO) { // 校验是否存在 this.checkNoticeExists(reqVO.getId()); // 更新通知公告 - SysNoticeDO updateObj = SysNoticeConvert.INSTANCE.convert(reqVO); + NoticeDO updateObj = NoticeConvert.INSTANCE.convert(reqVO); noticeMapper.updateById(updateObj); } @@ -52,12 +51,12 @@ public class SysNoticeServiceImpl implements SysNoticeService { } @Override - public PageResult pageNotices(SysNoticePageReqVO reqVO) { + public PageResult pageNotices(NoticePageReqVO reqVO) { return noticeMapper.selectPage(reqVO); } @Override - public SysNoticeDO getNotice(Long id) { + public NoticeDO getNotice(Long id) { return noticeMapper.selectById(id); } @@ -66,7 +65,7 @@ public class SysNoticeServiceImpl implements SysNoticeService { if (id == null) { return; } - SysNoticeDO notice = noticeMapper.selectById(id); + NoticeDO notice = noticeMapper.selectById(id); if (notice == null) { throw ServiceExceptionUtil.exception(NOTICE_NOT_FOUND); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java similarity index 64% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java index 155769a52f..405f390e4b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.system.service.permission; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import java.util.Collection; import java.util.List; @@ -13,7 +13,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface SysMenuService { +public interface MenuService { /** * 初始化菜单的本地缓存 @@ -26,14 +26,14 @@ public interface SysMenuService { * @param reqVO 菜单信息 * @return 创建出来的菜单编号 */ - Long createMenu(SysMenuCreateReqVO reqVO); + Long createMenu(MenuCreateReqVO reqVO); /** * 更新菜单 * * @param reqVO 菜单信息 */ - void updateMenu(SysMenuUpdateReqVO reqVO); + void updateMenu(MenuUpdateReqVO reqVO); /** * 删除菜单 @@ -47,7 +47,7 @@ public interface SysMenuService { * * @return 菜单列表 */ - List getMenus(); + List getMenus(); /** * 筛选菜单列表 @@ -55,7 +55,7 @@ public interface SysMenuService { * @param reqVO 筛选条件请求 VO * @return 菜单列表 */ - List getMenus(SysMenuListReqVO reqVO); + List getMenus(MenuListReqVO reqVO); /** * 获得所有菜单,从缓存中 @@ -66,7 +66,7 @@ public interface SysMenuService { * @param menusStatuses 菜单状态数组 * @return 菜单列表 */ - List listMenusFromCache(Collection menuTypes, Collection menusStatuses); + List listMenusFromCache(Collection menuTypes, Collection menusStatuses); /** * 获得指定编号的菜单数组,从缓存中 @@ -78,8 +78,8 @@ public interface SysMenuService { * @param menusStatuses 菜单状态数组 * @return 菜单数组 */ - List listMenusFromCache(Collection menuIds, Collection menuTypes, - Collection menusStatuses); + List listMenusFromCache(Collection menuIds, Collection menuTypes, + Collection menusStatuses); /** * 获得权限对应的菜单数组 @@ -87,7 +87,7 @@ public interface SysMenuService { * @param permission 权限标识 * @return 数组 */ - List getMenuListByPermissionFromCache(String permission); + List getMenuListByPermissionFromCache(String permission); /** * 获得菜单 @@ -95,6 +95,6 @@ public interface SysMenuService { * @param id 菜单编号 * @return 菜单 */ - SysMenuDO getMenu(Long id); + MenuDO getMenu(Long id); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java similarity index 80% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java index 855d8c9e13..0bae64b787 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java @@ -3,17 +3,15 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.permission.SysMenuConvert; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.permission.MenuConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysMenuMapper; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum; import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; -import cn.iocoder.yudao.module.system.mq.producer.permission.SysMenuProducer; -import cn.iocoder.yudao.module.system.service.permission.SysMenuService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.mq.producer.permission.MenuProducer; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; @@ -31,7 +29,7 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 菜单 Service 实现 @@ -40,7 +38,7 @@ import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; */ @Service @Slf4j -public class SysMenuServiceImpl implements SysMenuService { +public class MenuServiceImpl implements MenuService { /** * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 @@ -54,15 +52,15 @@ public class SysMenuServiceImpl implements SysMenuService { * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ - private volatile Map menuCache; + private volatile Map menuCache; /** * 权限与菜单缓存 - * key:权限 {@link SysMenuDO#getPermission()} + * key:权限 {@link MenuDO#getPermission()} * value:SysMenuDO 数组,因为一个权限可能对应多个 SysMenuDO 对象 * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ - private volatile Multimap permissionMenuCache; + private volatile Multimap permissionMenuCache; /** * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 */ @@ -71,10 +69,10 @@ public class SysMenuServiceImpl implements SysMenuService { @Resource private SysMenuMapper menuMapper; @Resource - private SysPermissionService permissionService; + private PermissionService permissionService; @Resource - private SysMenuProducer menuProducer; + private MenuProducer menuProducer; /** * 初始化 {@link #menuCache} 和 {@link #permissionMenuCache} 缓存 @@ -83,14 +81,14 @@ public class SysMenuServiceImpl implements SysMenuService { @PostConstruct public synchronized void initLocalCache() { // 获取菜单列表,如果有更新 - List menuList = this.loadMenuIfUpdate(maxUpdateTime); + List menuList = this.loadMenuIfUpdate(maxUpdateTime); if (CollUtil.isEmpty(menuList)) { return; } // 构建缓存 - ImmutableMap.Builder menuCacheBuilder = ImmutableMap.builder(); - ImmutableMultimap.Builder permMenuCacheBuilder = ImmutableMultimap.builder(); + ImmutableMap.Builder menuCacheBuilder = ImmutableMap.builder(); + ImmutableMultimap.Builder permMenuCacheBuilder = ImmutableMultimap.builder(); menuList.forEach(menuDO -> { menuCacheBuilder.put(menuDO.getId(), menuDO); permMenuCacheBuilder.put(menuDO.getPermission(), menuDO); @@ -114,7 +112,7 @@ public class SysMenuServiceImpl implements SysMenuService { * @param maxUpdateTime 当前菜单的最大更新时间 * @return 菜单列表 */ - private List loadMenuIfUpdate(Date maxUpdateTime) { + private List loadMenuIfUpdate(Date maxUpdateTime) { // 第一步,判断是否要更新。 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadMenuIfUpdate][首次加载全量菜单]"); @@ -129,13 +127,13 @@ public class SysMenuServiceImpl implements SysMenuService { } @Override - public Long createMenu(SysMenuCreateReqVO reqVO) { + public Long createMenu(MenuCreateReqVO reqVO) { // 校验父菜单存在 checkParentResource(reqVO.getParentId(), null); // 校验菜单(自己) checkResource(reqVO.getParentId(), reqVO.getName(), null); // 插入数据库 - SysMenuDO menu = SysMenuConvert.INSTANCE.convert(reqVO); + MenuDO menu = MenuConvert.INSTANCE.convert(reqVO); initMenuProperty(menu); menuMapper.insert(menu); // 发送刷新消息 @@ -145,7 +143,7 @@ public class SysMenuServiceImpl implements SysMenuService { } @Override - public void updateMenu(SysMenuUpdateReqVO reqVO) { + public void updateMenu(MenuUpdateReqVO reqVO) { // 校验更新的菜单是否存在 if (menuMapper.selectById(reqVO.getId()) == null) { throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS); @@ -155,7 +153,7 @@ public class SysMenuServiceImpl implements SysMenuService { // 校验菜单(自己) checkResource(reqVO.getParentId(), reqVO.getName(), reqVO.getId()); // 更新到数据库 - SysMenuDO updateObject = SysMenuConvert.INSTANCE.convert(reqVO); + MenuDO updateObject = MenuConvert.INSTANCE.convert(reqVO); initMenuProperty(updateObject); menuMapper.updateById(updateObject); // 发送刷新消息 @@ -193,17 +191,17 @@ public class SysMenuServiceImpl implements SysMenuService { } @Override - public List getMenus() { + public List getMenus() { return menuMapper.selectList(); } @Override - public List getMenus(SysMenuListReqVO reqVO) { + public List getMenus(MenuListReqVO reqVO) { return menuMapper.selectList(reqVO); } @Override - public List listMenusFromCache(Collection menuTypes, Collection menusStatuses) { + public List listMenusFromCache(Collection menuTypes, Collection menusStatuses) { // 任一一个参数为空,则返回空 if (CollectionUtils.isAnyEmpty(menuTypes, menusStatuses)) { return Collections.emptyList(); @@ -215,8 +213,8 @@ public class SysMenuServiceImpl implements SysMenuService { } @Override - public List listMenusFromCache(Collection menuIds, Collection menuTypes, - Collection menusStatuses) { + public List listMenusFromCache(Collection menuIds, Collection menuTypes, + Collection menusStatuses) { // 任一一个参数为空,则返回空 if (CollectionUtils.isAnyEmpty(menuIds, menuTypes, menusStatuses)) { return Collections.emptyList(); @@ -228,12 +226,12 @@ public class SysMenuServiceImpl implements SysMenuService { } @Override - public List getMenuListByPermissionFromCache(String permission) { + public List getMenuListByPermissionFromCache(String permission) { return new ArrayList<>(permissionMenuCache.get(permission)); } @Override - public SysMenuDO getMenu(Long id) { + public MenuDO getMenu(Long id) { return menuMapper.selectById(id); } @@ -256,7 +254,7 @@ public class SysMenuServiceImpl implements SysMenuService { if (parentId.equals(childId)) { throw ServiceExceptionUtil.exception(MENU_PARENT_ERROR); } - SysMenuDO menu = menuMapper.selectById(parentId); + MenuDO menu = menuMapper.selectById(parentId); // 父菜单不存在 if (menu == null) { throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_EXISTS); @@ -279,7 +277,7 @@ public class SysMenuServiceImpl implements SysMenuService { */ @VisibleForTesting public void checkResource(Long parentId, String name, Long id) { - SysMenuDO menu = menuMapper.selectByParentIdAndName(parentId, name); + MenuDO menu = menuMapper.selectByParentIdAndName(parentId, name); if (menu == null) { return; } @@ -299,7 +297,7 @@ public class SysMenuServiceImpl implements SysMenuService { * * @param menu 菜单 */ - private void initMenuProperty(SysMenuDO menu) { + private void initMenuProperty(MenuDO menu) { // 菜单为按钮类型时,无需 component、icon、path 属性,进行置空 if (MenuTypeEnum.BUTTON.getType().equals(menu.getType())) { menu.setComponent(""); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionService.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionService.java index aad7a419c1..9983bcbb91 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionService.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.iocoder.yudao.framework.datapermission.core.dept.service.DeptDataPermissionFrameworkService; import cn.iocoder.yudao.framework.security.core.service.SecurityPermissionFrameworkService; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import org.springframework.lang.Nullable; import java.util.Collection; @@ -16,7 +16,7 @@ import java.util.Set; * * @author 芋道源码 */ -public interface SysPermissionService extends SecurityPermissionFrameworkService, DeptDataPermissionFrameworkService { +public interface PermissionService extends SecurityPermissionFrameworkService, DeptDataPermissionFrameworkService { /** * 初始化权限的本地缓存 @@ -33,8 +33,8 @@ public interface SysPermissionService extends SecurityPermissionFrameworkService * @param menusStatuses 菜单状态数组 * @return 菜单列表 */ - List getRoleMenusFromCache(Collection roleIds, Collection menuTypes, - Collection menusStatuses); + List getRoleMenusFromCache(Collection roleIds, Collection menuTypes, + Collection menusStatuses); /** * 获得用户拥有的角色编号集合 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java similarity index 93% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java index 83ca671dbf..b8da087304 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java @@ -4,14 +4,14 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMenuMapper; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleMapper; -import cn.iocoder.yudao.module.system.mq.producer.permission.SysPermissionProducer; -import cn.iocoder.yudao.module.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; +import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -40,12 +40,12 @@ import java.util.*; */ @Service("ss") // 使用 Spring Security 的缩写,方便食用 @Slf4j -public class SysPermissionServiceImpl implements SysPermissionService { +public class PermissionServiceImpl implements PermissionService { /** * LoginUser 的 Context 缓存 Key */ - public static final String CONTEXT_KEY = SysPermissionServiceImpl.class.getSimpleName(); + public static final String CONTEXT_KEY = PermissionServiceImpl.class.getSimpleName(); /** * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 @@ -80,14 +80,14 @@ public class SysPermissionServiceImpl implements SysPermissionService { private SysUserRoleMapper userRoleMapper; @Resource - private SysRoleService roleService; + private RoleService roleService; @Resource - private SysMenuService menuService; + private MenuService menuService; @Resource - private SysDeptService deptService; + private DeptService deptService; @Resource - private SysPermissionProducer permissionProducer; + private PermissionProducer permissionProducer; /** * 初始化 {@link #roleMenuCache} 和 {@link #menuRoleCache} 缓存 @@ -97,7 +97,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { public void initLocalCache() { Date now = new Date(); // 获取角色与菜单的关联列表,如果有更新 - List roleMenuList = this.loadRoleMenuIfUpdate(maxUpdateTime); + List roleMenuList = this.loadRoleMenuIfUpdate(maxUpdateTime); if (CollUtil.isEmpty(roleMenuList)) { return; } @@ -128,7 +128,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { * @param maxUpdateTime 当前角色与菜单的关联的最大更新时间 * @return 角色与菜单的关联列表 */ - private List loadRoleMenuIfUpdate(Date maxUpdateTime) { + private List loadRoleMenuIfUpdate(Date maxUpdateTime) { // 第一步,判断是否要更新。 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadRoleMenuIfUpdate][首次加载全量角色与菜单的关联]"); @@ -143,8 +143,8 @@ public class SysPermissionServiceImpl implements SysPermissionService { } @Override - public List getRoleMenusFromCache(Collection roleIds, Collection menuTypes, - Collection menusStatuses) { + public List getRoleMenusFromCache(Collection roleIds, Collection menuTypes, + Collection menusStatuses) { // 任一一个参数为空时,不返回任何菜单 if (CollectionUtils.isAnyEmpty(roleIds, menusStatuses, menusStatuses)) { return Collections.emptyList(); @@ -178,11 +178,11 @@ public class SysPermissionServiceImpl implements SysPermissionService { // 如果是管理员的情况下,获取全部菜单编号 SysRoleDO role = roleService.getRole(roleId); if (roleService.hasAnyAdmin(Collections.singletonList(role))) { - return CollectionUtils.convertSet(menuService.getMenus(), SysMenuDO::getId); + return CollectionUtils.convertSet(menuService.getMenus(), MenuDO::getId); } // 如果是非管理员的情况下,获得拥有的菜单编号 return CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), - SysRoleMenuDO::getMenuId); + RoleMenuDO::getMenuId); } @Override @@ -190,7 +190,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { public void assignRoleMenu(Long roleId, Set menuIds) { // 获得角色拥有菜单编号 Set dbMenuIds = CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), - SysRoleMenuDO::getMenuId); + RoleMenuDO::getMenuId); // 计算新增和删除的菜单编号 Collection createMenuIds = CollUtil.subtract(menuIds, dbMenuIds); Collection deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds); @@ -310,7 +310,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { // 遍历权限,判断是否有一个满足 return Arrays.stream(permissions).anyMatch(permission -> { - List menuList = menuService.getMenuListByPermissionFromCache(permission); + List menuList = menuService.getMenuListByPermissionFromCache(permission); // 采用严格模式,如果权限找不到对应的 Menu 的话,认为 if (CollUtil.isEmpty(menuList)) { return false; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java similarity index 81% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java index 47de67f8a6..0bf13785dd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import org.springframework.lang.Nullable; @@ -17,7 +17,7 @@ import java.util.Set; * * @author 芋道源码 */ -public interface SysRoleService { +public interface RoleService { /** * 初始化角色的本地缓存 @@ -30,14 +30,14 @@ public interface SysRoleService { * @param reqVO 创建角色信息 * @return 角色编号 */ - Long createRole(SysRoleCreateReqVO reqVO); + Long createRole(RoleCreateReqVO reqVO); /** * 更新角色 * * @param reqVO 更新角色信息 */ - void updateRole(SysRoleUpdateReqVO reqVO); + void updateRole(RoleUpdateReqVO reqVO); /** * 删除角色 @@ -119,7 +119,7 @@ public interface SysRoleService { * @param reqVO 角色分页查询 * @return 角色分页结果 */ - PageResult getRolePage(SysRolePageReqVO reqVO); + PageResult getRolePage(RolePageReqVO reqVO); /** * 获得角色列表 @@ -127,7 +127,7 @@ public interface SysRoleService { * @param reqVO 列表查询 * @return 角色列表 */ - List getRoleList(SysRoleExportReqVO reqVO); + List getRoleList(RoleExportReqVO reqVO); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index f0c8b167c4..cd8cbe8197 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -5,18 +5,16 @@ import cn.hutool.core.collection.CollectionUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.permission.SysRoleConvert; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.permission.RoleConvert; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum; -import cn.iocoder.yudao.module.system.enums.permission.SysRoleTypeEnum; -import cn.iocoder.yudao.module.system.mq.producer.permission.SysRoleProducer; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.module.system.service.permission.SysRoleService; +import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; +import cn.iocoder.yudao.module.system.mq.producer.permission.RoleProducer; import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; @@ -34,7 +32,7 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -44,7 +42,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU */ @Service @Slf4j -public class SysRoleServiceImpl implements SysRoleService { +public class RoleServiceImpl implements RoleService { /** * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 @@ -65,13 +63,13 @@ public class SysRoleServiceImpl implements SysRoleService { private volatile Date maxUpdateTime; @Resource - private SysPermissionService permissionService; + private PermissionService permissionService; @Resource private SysRoleMapper roleMapper; @Resource - private SysRoleProducer roleProducer; + private RoleProducer roleProducer; /** * 初始化 {@link #roleCache} 缓存 @@ -121,12 +119,12 @@ public class SysRoleServiceImpl implements SysRoleService { } @Override - public Long createRole(SysRoleCreateReqVO reqVO) { + public Long createRole(RoleCreateReqVO reqVO) { // 校验角色 checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null); // 插入到数据库 - SysRoleDO role = SysRoleConvert.INSTANCE.convert(reqVO); - role.setType(SysRoleTypeEnum.CUSTOM.getType()); + SysRoleDO role = RoleConvert.INSTANCE.convert(reqVO); + role.setType(RoleTypeEnum.CUSTOM.getType()); role.setStatus(CommonStatusEnum.ENABLE.getStatus()); role.setDataScope(DataScopeEnum.ALL.getScope()); // 默认可查看所有数据。原因是,可能一些项目不需要项目权限 roleMapper.insert(role); @@ -137,13 +135,13 @@ public class SysRoleServiceImpl implements SysRoleService { } @Override - public void updateRole(SysRoleUpdateReqVO reqVO) { + public void updateRole(RoleUpdateReqVO reqVO) { // 校验是否可以更新 this.checkUpdateRole(reqVO.getId()); // 校验角色的唯一字段是否重复 checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId()); // 更新到数据库 - SysRoleDO updateObject = SysRoleConvert.INSTANCE.convert(reqVO); + SysRoleDO updateObject = RoleConvert.INSTANCE.convert(reqVO); roleMapper.updateById(updateObject); // 发送刷新消息 roleProducer.sendRoleRefreshMessage(); @@ -229,12 +227,12 @@ public class SysRoleServiceImpl implements SysRoleService { } @Override - public PageResult getRolePage(SysRolePageReqVO reqVO) { + public PageResult getRolePage(RolePageReqVO reqVO) { return roleMapper.selectPage(reqVO); } @Override - public List getRoleList(SysRoleExportReqVO reqVO) { + public List getRoleList(RoleExportReqVO reqVO) { return roleMapper.listRoles(reqVO); } @@ -278,7 +276,7 @@ public class SysRoleServiceImpl implements SysRoleService { throw exception(ROLE_NOT_EXISTS); } // 内置角色,不允许删除 - if (SysRoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) { + if (RoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) { throw exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java similarity index 71% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java index d7fa604e29..d57a990c8e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; import javax.validation.Valid; import java.util.Collection; @@ -16,7 +16,7 @@ import java.util.List; * @author zzf * @date 2021/1/25 9:24 */ -public interface SysSmsChannelService { +public interface SmsChannelService { /** * 初始化短信客户端 @@ -29,14 +29,14 @@ public interface SysSmsChannelService { * @param createReqVO 创建信息 * @return 编号 */ - Long createSmsChannel(@Valid SysSmsChannelCreateReqVO createReqVO); + Long createSmsChannel(@Valid SmsChannelCreateReqVO createReqVO); /** * 更新短信渠道 * * @param updateReqVO 更新信息 */ - void updateSmsChannel(@Valid SysSmsChannelUpdateReqVO updateReqVO); + void updateSmsChannel(@Valid SmsChannelUpdateReqVO updateReqVO); /** * 删除短信渠道 @@ -74,6 +74,6 @@ public interface SysSmsChannelService { * @param pageReqVO 分页查询 * @return 短信渠道分页 */ - PageResult getSmsChannelPage(SysSmsChannelPageReqVO pageReqVO); + PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java similarity index 77% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java index b36016a6bd..6c26e82035 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java @@ -1,14 +1,12 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.sms.SysSmsChannelConvert; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.sms.SmsChannelConvert; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsChannelMapper; -import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.yudao.module.system.service.sms.SysSmsChannelService; -import cn.iocoder.yudao.module.system.service.sms.SysSmsTemplateService; +import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -25,8 +23,8 @@ import java.util.Comparator; import java.util.Date; import java.util.List; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -37,7 +35,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU */ @Service @Slf4j -public class SysSmsChannelServiceImpl implements SysSmsChannelService { +public class SmsChannelServiceImpl implements SmsChannelService { /** * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 @@ -57,10 +55,10 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { private SysSmsChannelMapper smsChannelMapper; @Resource - private SysSmsTemplateService smsTemplateService; + private SmsTemplateService smsTemplateService; @Resource - private SysSmsProducer smsProducer; + private SmsProducer smsProducer; @Override @PostConstruct @@ -72,7 +70,7 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { } // 创建或更新短信 Client - List propertiesList = SysSmsChannelConvert.INSTANCE.convertList02(smsChannels); + List propertiesList = SmsChannelConvert.INSTANCE.convertList02(smsChannels); propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties)); // 写入缓存 @@ -108,9 +106,9 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { } @Override - public Long createSmsChannel(SysSmsChannelCreateReqVO createReqVO) { + public Long createSmsChannel(SmsChannelCreateReqVO createReqVO) { // 插入 - SysSmsChannelDO smsChannel = SysSmsChannelConvert.INSTANCE.convert(createReqVO); + SysSmsChannelDO smsChannel = SmsChannelConvert.INSTANCE.convert(createReqVO); smsChannelMapper.insert(smsChannel); // 发送刷新消息 smsProducer.sendSmsChannelRefreshMessage(); @@ -119,11 +117,11 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { } @Override - public void updateSmsChannel(SysSmsChannelUpdateReqVO updateReqVO) { + public void updateSmsChannel(SmsChannelUpdateReqVO updateReqVO) { // 校验存在 this.validateSmsChannelExists(updateReqVO.getId()); // 更新 - SysSmsChannelDO updateObj = SysSmsChannelConvert.INSTANCE.convert(updateReqVO); + SysSmsChannelDO updateObj = SmsChannelConvert.INSTANCE.convert(updateReqVO); smsChannelMapper.updateById(updateObj); // 发送刷新消息 smsProducer.sendSmsChannelRefreshMessage(); @@ -165,7 +163,7 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { } @Override - public PageResult getSmsChannelPage(SysSmsChannelPageReqVO pageReqVO) { + public PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO) { return smsChannelMapper.selectPage(pageReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java similarity index 62% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java index 547bc6b0de..fcd66e7a1a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -13,7 +13,7 @@ import java.util.List; * @author zzf * @date 13:48 2021/3/2 */ -public interface SysSmsLogService { +public interface SmsLogService { /** * 获得短信日志分页 @@ -21,7 +21,7 @@ public interface SysSmsLogService { * @param pageReqVO 分页查询 * @return 短信日志分页 */ - PageResult getSmsLogPage(SysSmsLogPageReqVO pageReqVO); + PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO); /** * 获得短信日志列表, 用于 Excel 导出 @@ -29,6 +29,6 @@ public interface SysSmsLogService { * @param exportReqVO 查询条件 * @return 短信日志列表 */ - List getSmsLogList(SysSmsLogExportReqVO exportReqVO); + List getSmsLogList(SmsLogExportReqVO exportReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java similarity index 60% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java index f390c98c5c..d09b77e1da 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java @@ -1,9 +1,8 @@ package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsLogMapper; -import cn.iocoder.yudao.module.system.service.sms.SysSmsLogService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import lombok.extern.slf4j.Slf4j; @@ -20,18 +19,18 @@ import java.util.List; */ @Slf4j @Service -public class SysSmsLogServiceImpl implements SysSmsLogService { +public class SmsLogServiceImpl implements SmsLogService { @Resource private SysSmsLogMapper smsLogMapper; @Override - public PageResult getSmsLogPage(SysSmsLogPageReqVO pageReqVO) { + public PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO) { return smsLogMapper.selectPage(pageReqVO); } @Override - public List getSmsLogList(SysSmsLogExportReqVO exportReqVO) { + public List getSmsLogList(SmsLogExportReqVO exportReqVO) { return smsLogMapper.selectList(exportReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java index 96873a0c14..397ff9faa8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -17,7 +17,7 @@ import java.util.List; * @author zzf * @date 2021/1/25 9:24 */ -public interface SysSmsTemplateService { +public interface SmsTemplateService { /** * 获得短信模板 @@ -33,14 +33,14 @@ public interface SysSmsTemplateService { * @param createReqVO 创建信息 * @return 编号 */ - Long createSmsTemplate(@Valid SysSmsTemplateCreateReqVO createReqVO); + Long createSmsTemplate(@Valid SmsTemplateCreateReqVO createReqVO); /** * 更新短信模板 * * @param updateReqVO 更新信息 */ - void updateSmsTemplate(@Valid SysSmsTemplateUpdateReqVO updateReqVO); + void updateSmsTemplate(@Valid SmsTemplateUpdateReqVO updateReqVO); /** * 删除短信模板 @@ -71,7 +71,7 @@ public interface SysSmsTemplateService { * @param pageReqVO 分页查询 * @return 短信模板分页 */ - PageResult getSmsTemplatePage(SysSmsTemplatePageReqVO pageReqVO); + PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO); /** * 获得短信模板列表, 用于 Excel 导出 @@ -79,7 +79,7 @@ public interface SysSmsTemplateService { * @param exportReqVO 查询条件 * @return 短信模板分页 */ - List getSmsTemplateList(SysSmsTemplateExportReqVO exportReqVO); + List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO); /** * 获得指定短信渠道下的短信模板数量 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java similarity index 80% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java index 3b6e463285..cc145d97e6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java @@ -1,15 +1,13 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.util.ReUtil; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.sms.SysSmsTemplateConvert; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.sms.SmsTemplateConvert; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsTemplateMapper; -import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.yudao.module.system.service.sms.SysSmsChannelService; -import cn.iocoder.yudao.module.system.service.sms.SysSmsTemplateService; +import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -29,7 +27,7 @@ import java.util.List; import java.util.Objects; import java.util.regex.Pattern; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -40,7 +38,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU */ @Service @Slf4j -public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { +public class SmsTemplateServiceImpl implements SmsTemplateService { /** * 正则表达式,匹配 {} 中的变量 @@ -51,13 +49,13 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { private SysSmsTemplateMapper smsTemplateMapper; @Resource - private SysSmsChannelService smsChannelService; + private SmsChannelService smsChannelService; @Resource private SmsClientFactory smsClientFactory; @Resource - private SysSmsProducer smsProducer; + private SmsProducer smsProducer; @Override public SysSmsTemplateDO getSmsTemplateByCode(String code) { @@ -70,7 +68,7 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { } @Override - public Long createSmsTemplate(SysSmsTemplateCreateReqVO createReqVO) { + public Long createSmsTemplate(SmsTemplateCreateReqVO createReqVO) { // 校验短信渠道 SysSmsChannelDO channelDO = checkSmsChannel(createReqVO.getChannelId()); // 校验短信编码是否重复 @@ -79,7 +77,7 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { checkApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId()); // 插入 - SysSmsTemplateDO template = SysSmsTemplateConvert.INSTANCE.convert(createReqVO); + SysSmsTemplateDO template = SmsTemplateConvert.INSTANCE.convert(createReqVO); template.setParams(parseTemplateContentParams(template.getContent())); template.setChannelCode(channelDO.getCode()); smsTemplateMapper.insert(template); @@ -90,7 +88,7 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { } @Override - public void updateSmsTemplate(SysSmsTemplateUpdateReqVO updateReqVO) { + public void updateSmsTemplate(SmsTemplateUpdateReqVO updateReqVO) { // 校验存在 this.validateSmsTemplateExists(updateReqVO.getId()); // 校验短信渠道 @@ -101,7 +99,7 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { checkApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId()); // 更新 - SysSmsTemplateDO updateObj = SysSmsTemplateConvert.INSTANCE.convert(updateReqVO); + SysSmsTemplateDO updateObj = SmsTemplateConvert.INSTANCE.convert(updateReqVO); updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); updateObj.setChannelCode(channelDO.getCode()); smsTemplateMapper.updateById(updateObj); @@ -136,12 +134,12 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { } @Override - public PageResult getSmsTemplatePage(SysSmsTemplatePageReqVO pageReqVO) { + public PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO) { return smsTemplateMapper.selectPage(pageReqVO); } @Override - public List getSmsTemplateList(SysSmsTemplateExportReqVO exportReqVO) { + public List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO) { return smsTemplateMapper.selectList(exportReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java similarity index 67% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java index 357e23ad74..63ebfd5f3b 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.system.service.tenant; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantCreateReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExportReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantPageReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -16,7 +16,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface SysTenantService { +public interface TenantService { /** * 创建租户 @@ -24,14 +24,14 @@ public interface SysTenantService { * @param createReqVO 创建信息 * @return 编号 */ - Long createTenant(@Valid SysTenantCreateReqVO createReqVO); + Long createTenant(@Valid TenantCreateReqVO createReqVO); /** * 更新租户 * * @param updateReqVO 更新信息 */ - void updateTenant(@Valid SysTenantUpdateReqVO updateReqVO); + void updateTenant(@Valid TenantUpdateReqVO updateReqVO); /** * 删除租户 @@ -62,7 +62,7 @@ public interface SysTenantService { * @param pageReqVO 分页查询 * @return 租户分页 */ - PageResult getTenantPage(SysTenantPageReqVO pageReqVO); + PageResult getTenantPage(TenantPageReqVO pageReqVO); /** * 获得租户列表, 用于 Excel 导出 @@ -70,7 +70,7 @@ public interface SysTenantService { * @param exportReqVO 查询条件 * @return 租户列表 */ - List getTenantList(SysTenantExportReqVO exportReqVO); + List getTenantList(TenantExportReqVO exportReqVO); /** * 获得名字对应的租户 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java similarity index 63% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java index bc76d2badd..297dbbbcc5 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java @@ -1,12 +1,11 @@ package cn.iocoder.yudao.module.system.service.tenant; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantCreateReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExportReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantPageReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantUpdateReqVO; -import cn.iocoder.yudao.module.system.convert.tenant.SysTenantConvert; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert; import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantMapper; -import cn.iocoder.yudao.module.system.service.tenant.SysTenantService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.springframework.stereotype.Service; @@ -16,7 +15,7 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.List; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.TENANT_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TENANT_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -26,26 +25,26 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU */ @Service @Validated -public class SysTenantServiceImpl implements SysTenantService { +public class TenantServiceImpl implements TenantService { @Resource private SysTenantMapper tenantMapper; @Override - public Long createTenant(SysTenantCreateReqVO createReqVO) { + public Long createTenant(TenantCreateReqVO createReqVO) { // 插入 - SysTenantDO tenant = SysTenantConvert.INSTANCE.convert(createReqVO); + SysTenantDO tenant = TenantConvert.INSTANCE.convert(createReqVO); tenantMapper.insert(tenant); // 返回 return tenant.getId(); } @Override - public void updateTenant(SysTenantUpdateReqVO updateReqVO) { + public void updateTenant(TenantUpdateReqVO updateReqVO) { // 校验存在 this.validateTenantExists(updateReqVO.getId()); // 更新 - SysTenantDO updateObj = SysTenantConvert.INSTANCE.convert(updateReqVO); + SysTenantDO updateObj = TenantConvert.INSTANCE.convert(updateReqVO); tenantMapper.updateById(updateObj); } @@ -74,12 +73,12 @@ public class SysTenantServiceImpl implements SysTenantService { } @Override - public PageResult getTenantPage(SysTenantPageReqVO pageReqVO) { + public PageResult getTenantPage(TenantPageReqVO pageReqVO) { return tenantMapper.selectPage(pageReqVO); } @Override - public List getTenantList(SysTenantExportReqVO exportReqVO) { + public List getTenantList(TenantExportReqVO exportReqVO) { return tenantMapper.selectList(exportReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java similarity index 78% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java index a1f428b7e1..15d62caf28 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.service.user; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.user.*; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -14,7 +14,7 @@ import java.util.*; * * @author 芋道源码 */ -public interface SysUserService { +public interface UserService { /** * 创建用户 @@ -22,14 +22,14 @@ public interface SysUserService { * @param reqVO 用户信息 * @return 用户编号 */ - Long createUser(SysUserCreateReqVO reqVO); + Long createUser(UserCreateReqVO reqVO); /** * 修改用户 * * @param reqVO 用户信息 */ - void updateUser(SysUserUpdateReqVO reqVO); + void updateUser(UserUpdateReqVO reqVO); /** * 更新用户的最后登陆信息 @@ -45,7 +45,7 @@ public interface SysUserService { * @param id 用户编号 * @param reqVO 用户个人信息 */ - void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO); + void updateUserProfile(Long id, UserProfileUpdateReqVO reqVO); /** * 修改用户个人密码 @@ -53,7 +53,7 @@ public interface SysUserService { * @param id 用户编号 * @param reqVO 更新用户个人密码 */ - void updateUserPassword(Long id, SysUserProfileUpdatePasswordReqVO reqVO); + void updateUserPassword(Long id, UserProfileUpdatePasswordReqVO reqVO); /** * 更新用户头像 @@ -100,7 +100,7 @@ public interface SysUserService { * @param reqVO 分页条件 * @return 分页列表 */ - PageResult getUserPage(SysUserPageReqVO reqVO); + PageResult getUserPage(UserPageReqVO reqVO); /** * 获得用户 @@ -116,7 +116,7 @@ public interface SysUserService { * @param reqVO 列表请求 * @return 用户列表 */ - List getUsers(SysUserExportReqVO reqVO); + List getUsers(UserExportReqVO reqVO); @@ -143,7 +143,7 @@ public interface SysUserService { * @param isUpdateSupport 是否支持更新 * @return 导入结果 */ - SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport); + UserImportRespVO importUsers(List importUsers, boolean isUpdateSupport); /** * 获得指定状态的用户们 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java index 5eab9a83cd..d5d7faefcc 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java @@ -4,17 +4,16 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.user.*; -import cn.iocoder.yudao.module.system.convert.user.SysUserConvert; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; +import cn.iocoder.yudao.module.system.convert.user.UserConvert; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.module.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.yudao.module.system.service.dept.SysDeptService; -import cn.iocoder.yudao.module.system.service.dept.SysPostService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.dept.PostService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; @@ -33,17 +32,17 @@ import javax.annotation.Resource; import java.io.InputStream; import java.util.*; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** - * 用户 Service 实现类 + * 管理员用户 Service 实现类 * * @author 芋道源码 */ -@Service +@Service("adminUserService") @Slf4j -public class SysUserServiceImpl implements SysUserService { +public class UserServiceImpl implements UserService { @Value("${sys.user.init-password:yudaoyuanma}") private String userInitPassword; @@ -52,26 +51,26 @@ public class SysUserServiceImpl implements SysUserService { private SysUserMapper userMapper; @Resource - private SysDeptService deptService; + private DeptService deptService; @Resource private SysDeptCoreService deptCoreService; @Resource - private SysPostService postService; + private PostService postService; @Resource - private SysPermissionService permissionService; + private PermissionService permissionService; @Resource private PasswordEncoder passwordEncoder; @Resource private InfFileCoreService fileService; @Override - public Long createUser(SysUserCreateReqVO reqVO) { + public Long createUser(UserCreateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), reqVO.getDeptId(), reqVO.getPostIds()); // 插入用户 - SysUserDO user = SysUserConvert.INSTANCE.convert(reqVO); + SysUserDO user = UserConvert.INSTANCE.convert(reqVO); user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 user.setPassword(passwordEncoder.encode(reqVO.getPassword())); // 加密密码 userMapper.insert(user); @@ -79,12 +78,12 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public void updateUser(SysUserUpdateReqVO reqVO) { + public void updateUser(UserUpdateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), reqVO.getDeptId(), reqVO.getPostIds()); // 更新用户 - SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); + SysUserDO updateObj = UserConvert.INSTANCE.convert(reqVO); userMapper.updateById(updateObj); } @@ -94,17 +93,17 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO) { + public void updateUserProfile(Long id, UserProfileUpdateReqVO reqVO) { // 校验正确性 this.checkUserExists(id); this.checkEmailUnique(id, reqVO.getEmail()); this.checkMobileUnique(id, reqVO.getMobile()); // 执行更新 - userMapper.updateById(SysUserConvert.INSTANCE.convert(reqVO).setId(id)); + userMapper.updateById(UserConvert.INSTANCE.convert(reqVO).setId(id)); } @Override - public void updateUserPassword(Long id, SysUserProfileUpdatePasswordReqVO reqVO) { + public void updateUserPassword(Long id, UserProfileUpdatePasswordReqVO reqVO) { // 校验旧密码密码 this.checkOldPassword(id, reqVO.getOldPassword()); // 执行更新 @@ -164,7 +163,7 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public PageResult getUserPage(SysUserPageReqVO reqVO) { + public PageResult getUserPage(UserPageReqVO reqVO) { return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId())); } @@ -174,7 +173,7 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public List getUsers(SysUserExportReqVO reqVO) { + public List getUsers(UserExportReqVO reqVO) { return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); } @@ -340,11 +339,11 @@ public class SysUserServiceImpl implements SysUserService { @Override @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 - public SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport) { + public UserImportRespVO importUsers(List importUsers, boolean isUpdateSupport) { if (CollUtil.isEmpty(importUsers)) { throw exception(USER_IMPORT_LIST_IS_EMPTY); } - SysUserImportRespVO respVO = SysUserImportRespVO.builder().createUsernames(new ArrayList<>()) + UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>()) .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); importUsers.forEach(importUser -> { // 校验,判断是否有不符合的原因 @@ -358,7 +357,7 @@ public class SysUserServiceImpl implements SysUserService { // 判断如果不存在,在进行插入 SysUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); if (existUser == null) { - userMapper.insert(SysUserConvert.INSTANCE.convert(importUser) + userMapper.insert(UserConvert.INSTANCE.convert(importUser) .setPassword(passwordEncoder.encode(userInitPassword))); // 设置默认密码 respVO.getCreateUsernames().add(importUser.getUsername()); return; @@ -368,7 +367,7 @@ public class SysUserServiceImpl implements SysUserService { respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg()); return; } - SysUserDO updateUser = SysUserConvert.INSTANCE.convert(importUser); + SysUserDO updateUser = UserConvert.INSTANCE.convert(importUser); updateUser.setId(existUser.getId()); userMapper.updateById(updateUser); respVO.getUpdateUsernames().add(importUser.getUsername()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java similarity index 79% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java index 75ab194bce..a306eea49c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysAuthServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.module.system.service.auth; -import cn.iocoder.yudao.module.system.controller.auth.vo.auth.SysAuthLoginReqVO; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.module.system.service.common.SysCaptchaService; -import cn.iocoder.yudao.module.system.service.dept.SysPostService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthLoginReqVO; +import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; +import cn.iocoder.yudao.module.system.service.common.CaptchaService; +import cn.iocoder.yudao.module.system.service.dept.PostService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; +import cn.iocoder.yudao.module.system.service.user.UserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; @@ -31,7 +31,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import javax.annotation.Resource; import java.util.Set; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static java.util.Collections.singleton; @@ -39,24 +39,24 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -@Import(SysAuthServiceImpl.class) -public class SysAuthServiceImplTest extends BaseDbUnitTest { +@Import(AuthServiceImpl.class) +public class AuthServiceImplTest extends BaseDbUnitTest { @Resource - private SysAuthServiceImpl authService; + private AuthServiceImpl authService; @MockBean - private SysUserService userService; + private UserService userService; @MockBean private SysUserCoreService userCoreService; @MockBean - private SysPermissionService permissionService; + private PermissionService permissionService; @MockBean private AuthenticationManager authenticationManager; @MockBean private Authentication authentication; @MockBean - private SysCaptchaService captchaService; + private CaptchaService captchaService; @MockBean private SysLoginLogCoreService loginLogCoreService; @MockBean @@ -64,7 +64,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @MockBean private SysSocialCoreService socialService; @MockBean - private SysPostService postService; + private PostService postService; @BeforeEach public void setUp() { @@ -131,15 +131,15 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @Test public void testLogin_captchaNotFound() { // 准备参数 - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); String userIp = randomString(); String userAgent = randomString(); // 调用, 并断言异常 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_NOT_FOUND); // 校验调用参数 verify(loginLogCoreService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.CAPTCHA_NOT_FOUND.getResult())) + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.CAPTCHA_NOT_FOUND.getResult())) ); } @@ -149,15 +149,15 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { String userIp = randomString(); String userAgent = randomString(); String code = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); // mock 验证码不正确 when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(code); // 调用, 并断言异常 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_CODE_ERROR); // 校验调用参数 verify(loginLogCoreService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult())) + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.CAPTCHA_CODE_ERROR.getResult())) ); } @@ -166,7 +166,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { // 准备参数 String userIp = randomString(); String userAgent = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); // mock 验证码正确 when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); // mock 抛出异常 @@ -177,8 +177,8 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { // 校验调用参数 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); verify(loginLogCoreService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.BAD_CREDENTIALS.getResult())) + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.BAD_CREDENTIALS.getResult())) ); } @@ -187,7 +187,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { // 准备参数 String userIp = randomString(); String userAgent = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); // mock 验证码正确 when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); // mock 抛出异常 @@ -198,8 +198,8 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { // 校验调用参数 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); verify(loginLogCoreService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.USER_DISABLED.getResult())) + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.USER_DISABLED.getResult())) ); } @@ -208,7 +208,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { // 准备参数 String userIp = randomString(); String userAgent = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); // mock 验证码正确 when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); // mock 抛出异常 @@ -219,8 +219,8 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { // 校验调用参数 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); verify(loginLogCoreService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.UNKNOWN_ERROR.getResult())) + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.UNKNOWN_ERROR.getResult())) ); } @@ -232,7 +232,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { Long userId = randomLongId(); Set userRoleIds = randomSet(Long.class); String sessionId = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); LoginUser loginUser = randomPojo(LoginUser.class, o -> { o.setId(userId); o.setRoleIds(userRoleIds); @@ -253,8 +253,8 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { // 校验调用参数 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); verify(loginLogCoreService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult())) + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.SUCCESS.getResult())) ); } @@ -270,8 +270,8 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { // 校验调用参数 verify(userSessionCoreService, times(1)).deleteUserSession(token); verify(loginLogCoreService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGOUT_SELF.getType()) - && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult())) + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGOUT_SELF.getType()) + && o.getResult().equals(LoginResultEnum.SUCCESS.getResult())) ); } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java index 3454572354..eea61a408b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/SysUserSessionServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.date.DateUtil; -import cn.iocoder.yudao.module.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.service.user.UserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; @@ -34,21 +34,21 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; /** - * {@link SysUserSessionServiceImpl} 的单元测试 + * {@link UserSessionServiceImpl} 的单元测试 * * @author Lyon */ -@Import({SysUserSessionServiceImpl.class}) -public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest { +@Import({UserSessionServiceImpl.class}) +public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { @Resource - private SysUserSessionServiceImpl userSessionService; + private UserSessionServiceImpl userSessionService; @Resource private SysUserSessionMapper userSessionMapper; @MockBean - private SysUserService userService; + private UserService userService; @MockBean private SysLoginLogCoreService loginLogCoreService; @MockBean @@ -81,7 +81,7 @@ public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest { o.setUserIp("testUserIp"); })); // 准备参数 - SysUserSessionPageReqVO reqVO = new SysUserSessionPageReqVO(); + UserSessionPageReqVO reqVO = new UserSessionPageReqVO(); reqVO.setUsername(dbUser.getUsername()); reqVO.setUserIp(userIp); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/CaptchaServiceTest.java similarity index 77% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/CaptchaServiceTest.java index 2248744227..79fb65f43d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/SysCaptchaServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/CaptchaServiceTest.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.common; -import cn.iocoder.yudao.module.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.yudao.module.system.dal.redis.common.SysCaptchaRedisDAO; +import cn.iocoder.yudao.module.system.controller.admin.common.vo.CaptchaImageRespVO; +import cn.iocoder.yudao.module.system.dal.redis.common.CaptchaRedisDAO; import cn.iocoder.yudao.module.system.framework.captcha.config.CaptchaProperties; import cn.iocoder.yudao.module.system.test.BaseRedisUnitTest; import org.junit.jupiter.api.Test; @@ -12,21 +12,21 @@ import javax.annotation.Resource; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; import static org.junit.jupiter.api.Assertions.*; -@Import({SysCaptchaServiceImpl.class, CaptchaProperties.class, SysCaptchaRedisDAO.class}) -public class SysCaptchaServiceTest extends BaseRedisUnitTest { +@Import({CaptchaServiceImpl.class, CaptchaProperties.class, CaptchaRedisDAO.class}) +public class CaptchaServiceTest extends BaseRedisUnitTest { @Resource - private SysCaptchaServiceImpl captchaService; + private CaptchaServiceImpl captchaService; @Resource - private SysCaptchaRedisDAO captchaRedisDAO; + private CaptchaRedisDAO captchaRedisDAO; @Resource private CaptchaProperties captchaProperties; @Test public void testGetCaptchaImage() { // 调用 - SysCaptchaImageRespVO respVO = captchaService.getCaptchaImage(); + CaptchaImageRespVO respVO = captchaService.getCaptchaImage(); // 断言 assertNotNull(respVO.getUuid()); assertNotNull(respVO.getImg()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java index b041e2d4cb..fe49ea2b3b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysDeptServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java @@ -1,13 +1,13 @@ package cn.iocoder.yudao.module.system.service.dept; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; -import cn.iocoder.yudao.module.system.mq.producer.dept.SysDeptProducer; +import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; @@ -24,7 +24,7 @@ import java.util.function.Consumer; import static cn.hutool.core.bean.BeanUtil.getFieldValue; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; @@ -33,19 +33,19 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; /** - * {@link SysDeptServiceImpl} 的单元测试类 + * {@link DeptServiceImpl} 的单元测试类 * * @author niudehua */ -@Import(SysDeptServiceImpl.class) -class SysDeptServiceTest extends BaseDbUnitTest { +@Import(DeptServiceImpl.class) +public class DeptServiceTest extends BaseDbUnitTest { @Resource - private SysDeptServiceImpl deptService; + private DeptServiceImpl deptService; @Resource private SysDeptMapper deptMapper; @MockBean - private SysDeptProducer deptProducer; + private DeptProducer deptProducer; @Test @SuppressWarnings("unchecked") @@ -86,7 +86,7 @@ class SysDeptServiceTest extends BaseDbUnitTest { // 测试 status 不匹配 deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); // 准备参数 - SysDeptListReqVO reqVO = new SysDeptListReqVO(); + DeptListReqVO reqVO = new DeptListReqVO(); reqVO.setName("开"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 调用 @@ -99,7 +99,7 @@ class SysDeptServiceTest extends BaseDbUnitTest { @Test void testCreateDept_success() { // 准备参数 - SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + DeptCreateReqVO reqVO = randomPojo(DeptCreateReqVO.class, o -> { o.setParentId(DeptIdEnum.ROOT.getId()); o.setStatus(randomCommonStatus()); @@ -121,7 +121,7 @@ class SysDeptServiceTest extends BaseDbUnitTest { SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, o -> { + DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, o -> { // 设置更新的 ID o.setParentId(DeptIdEnum.ROOT.getId()); o.setId(dbDeptDO.getId()); @@ -160,7 +160,7 @@ class SysDeptServiceTest extends BaseDbUnitTest { nameDeptDO.setParentId(DeptIdEnum.ROOT.getId()); deptMapper.insert(nameDeptDO); // 准备参数 - SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, o -> { // 设置根节点部门 o.setParentId(DeptIdEnum.ROOT.getId()); @@ -175,7 +175,7 @@ class SysDeptServiceTest extends BaseDbUnitTest { @Test void testCheckDept_parentNotExitsForCreate() { - SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + DeptCreateReqVO reqVO = randomPojo(DeptCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); // 调用,并断言异常 assertServiceException(() -> deptService.createDept(reqVO), DEPT_PARENT_NOT_EXITS); @@ -211,7 +211,7 @@ class SysDeptServiceTest extends BaseDbUnitTest { SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); deptMapper.insert(dbDeptDO); // 准备参数 - SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, o -> { // 设置自己为父部门 o.setParentId(dbDeptDO.getId()); @@ -228,7 +228,7 @@ class SysDeptServiceTest extends BaseDbUnitTest { SysDeptDO deptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); deptMapper.insert(deptDO); // 准备参数 - SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + DeptCreateReqVO reqVO = randomPojo(DeptCreateReqVO.class, o -> { // 设置未启用的部门为副部门 o.setParentId(deptDO.getId()); @@ -250,7 +250,7 @@ class SysDeptServiceTest extends BaseDbUnitTest { // 初始化本地缓存 deptService.initLocalCache(); // 准备参数 - SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, o -> { // 设置自己的子部门为父部门 o.setParentId(childDept.getId()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java index fa0da32577..df64ed2b11 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/SysPostServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java @@ -5,10 +5,10 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.yudao.module.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; @@ -23,19 +23,14 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.*; -/** - * {@link SysPostServiceImpl} 的单元测试类 - * - * @author niudehua - */ -@Import(SysPostServiceImpl.class) -class SysPostServiceTest extends BaseDbUnitTest { +@Import(PostServiceImpl.class) +public class PostServiceTest extends BaseDbUnitTest { @Resource - private SysPostServiceImpl postService; + private PostServiceImpl postService; @Resource private SysPostMapper postMapper; @@ -53,7 +48,7 @@ class SysPostServiceTest extends BaseDbUnitTest { postMapper.insert(ObjectUtils.cloneIgnoreId(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); // 准备参数 - SysPostPageReqVO reqVO = new SysPostPageReqVO(); + PostPageReqVO reqVO = new PostPageReqVO(); reqVO.setName("码"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -79,7 +74,7 @@ class SysPostServiceTest extends BaseDbUnitTest { // 测试 status 不匹配 postMapper.insert(ObjectUtils.cloneIgnoreId(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); // 准备参数 - SysPostExportReqVO reqVO = new SysPostExportReqVO(); + PostExportReqVO reqVO = new PostExportReqVO(); reqVO.setName("码"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -107,7 +102,7 @@ class SysPostServiceTest extends BaseDbUnitTest { @Test void testCreatePost_success() { // 准备参数 - SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, + PostCreateReqVO reqVO = randomPojo(PostCreateReqVO.class, o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); // 调用 Long postId = postService.createPost(reqVO); @@ -124,7 +119,7 @@ class SysPostServiceTest extends BaseDbUnitTest { SysPostDO postDO = randomPostDO(); postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, + PostUpdateReqVO reqVO = randomPojo(PostUpdateReqVO.class, o -> { // 设置更新的 ID o.setId(postDO.getId()); @@ -163,7 +158,7 @@ class SysPostServiceTest extends BaseDbUnitTest { SysPostDO postDO = randomPostDO(); postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, + PostCreateReqVO reqVO = randomPojo(PostCreateReqVO.class, // 模拟 name 重复 o -> o.setName(postDO.getName())); assertServiceException(() -> postService.createPost(reqVO), POST_NAME_DUPLICATE); @@ -178,7 +173,7 @@ class SysPostServiceTest extends BaseDbUnitTest { SysPostDO codePostDO = randomPostDO(); postMapper.insert(codePostDO); // 准备参数 - SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, + PostUpdateReqVO reqVO = randomPojo(PostUpdateReqVO.class, o -> { // 设置更新的 ID o.setId(postDO.getId()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java index bc5f83db8c..42217d3b75 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictDataServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java @@ -3,13 +3,13 @@ package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.data.SysDictDataUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictDataMapper; -import cn.iocoder.yudao.module.system.mq.producer.dict.SysDictDataProducer; +import cn.iocoder.yudao.module.system.mq.producer.dict.DictDataProducer; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; @@ -21,7 +21,7 @@ import javax.annotation.Resource; import java.util.List; import java.util.function.Consumer; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; @@ -29,23 +29,18 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -/** -* {@link SysDictDataServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysDictDataServiceImpl.class) -public class SysDictDataServiceTest extends BaseDbUnitTest { +@Import(DictDataServiceImpl.class) +public class DictDataServiceTest extends BaseDbUnitTest { @Resource - private SysDictDataServiceImpl dictDataService; + private DictDataServiceImpl dictDataService; @Resource private SysDictDataMapper dictDataMapper; @MockBean - private SysDictTypeService dictTypeService; + private DictTypeService dictTypeService; @MockBean - private SysDictDataProducer dictDataProducer; + private DictDataProducer dictDataProducer; @Test public void testGetDictDataPage() { @@ -63,7 +58,7 @@ public class SysDictDataServiceTest extends BaseDbUnitTest { // 测试 status 不匹配 dictDataMapper.insert(ObjectUtils.cloneIgnoreId(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); // 准备参数 - SysDictDataPageReqVO reqVO = new SysDictDataPageReqVO(); + DictDataPageReqVO reqVO = new DictDataPageReqVO(); reqVO.setLabel("芋"); reqVO.setDictType("yu"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -92,7 +87,7 @@ public class SysDictDataServiceTest extends BaseDbUnitTest { // 测试 status 不匹配 dictDataMapper.insert(ObjectUtils.cloneIgnoreId(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); // 准备参数 - SysDictDataExportReqVO reqVO = new SysDictDataExportReqVO(); + DictDataExportReqVO reqVO = new DictDataExportReqVO(); reqVO.setLabel("芋"); reqVO.setDictType("yu"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -107,7 +102,7 @@ public class SysDictDataServiceTest extends BaseDbUnitTest { @Test public void testCreateDictData_success() { // 准备参数 - SysDictDataCreateReqVO reqVO = randomPojo(SysDictDataCreateReqVO.class, + DictDataCreateReqVO reqVO = randomPojo(DictDataCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); // mock 方法 when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType())); @@ -129,7 +124,7 @@ public class SysDictDataServiceTest extends BaseDbUnitTest { SysDictDataDO dbDictData = randomDictDataDO(); dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysDictDataUpdateReqVO reqVO = randomPojo(SysDictDataUpdateReqVO.class, o -> { + DictDataUpdateReqVO reqVO = randomPojo(DictDataUpdateReqVO.class, o -> { o.setId(dbDictData.getId()); // 设置更新的 ID o.setStatus(randomCommonStatus()); }); @@ -196,7 +191,7 @@ public class SysDictDataServiceTest extends BaseDbUnitTest { // mock 方法,数据类型被禁用 String dictType = randomString(); when(dictTypeService.getDictType(eq(dictType))).thenReturn( - randomPojo(SysDictTypeDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + randomPojo(DictTypeDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); // 调用, 并断言异常 assertServiceException(() -> dictDataService.checkDictTypeValid(dictType), DICT_TYPE_NOT_ENABLE); @@ -257,8 +252,8 @@ public class SysDictDataServiceTest extends BaseDbUnitTest { * @param type 字典类型 * @return SysDictTypeDO 对象 */ - private static SysDictTypeDO randomDictTypeDO(String type) { - return randomPojo(SysDictTypeDO.class, o -> { + private static DictTypeDO randomDictTypeDO(String type) { + return randomPojo(DictTypeDO.class, o -> { o.setType(type); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 是开启 }); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceTest.java similarity index 80% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceTest.java index 916acbf26f..3b2d763be4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/SysDictTypeServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceTest.java @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.yudao.module.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictTypeMapper; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; @@ -20,7 +20,7 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; @@ -29,21 +29,21 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; -@Import(SysDictTypeServiceImpl.class) -public class SysDictTypeServiceTest extends BaseDbUnitTest { +@Import(DictTypeServiceImpl.class) +public class DictTypeServiceTest extends BaseDbUnitTest { @Resource - private SysDictTypeServiceImpl dictTypeService; + private DictTypeServiceImpl dictTypeService; @Resource private SysDictTypeMapper dictTypeMapper; @MockBean - private SysDictDataService dictDataService; + private DictDataService dictDataService; @Test public void testGetDictTypePage() { // mock 数据 - SysDictTypeDO dbDictType = randomPojo(SysDictTypeDO.class, o -> { // 等会查询到 + DictTypeDO dbDictType = randomPojo(DictTypeDO.class, o -> { // 等会查询到 o.setName("yunai"); o.setType("芋艿"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -59,7 +59,7 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); // 准备参数 - SysDictTypePageReqVO reqVO = new SysDictTypePageReqVO(); + DictTypePageReqVO reqVO = new DictTypePageReqVO(); reqVO.setName("nai"); reqVO.setType("艿"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -67,7 +67,7 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2021, 1, 20)); // 调用 - PageResult pageResult = dictTypeService.getDictTypePage(reqVO); + PageResult pageResult = dictTypeService.getDictTypePage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -77,7 +77,7 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { @Test public void testGetDictTypeList() { // mock 数据 - SysDictTypeDO dbDictType = randomPojo(SysDictTypeDO.class, o -> { // 等会查询到 + DictTypeDO dbDictType = randomPojo(DictTypeDO.class, o -> { // 等会查询到 o.setName("yunai"); o.setType("芋艿"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -93,7 +93,7 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); // 准备参数 - SysDictTypeExportReqVO reqVO = new SysDictTypeExportReqVO(); + DictTypeExportReqVO reqVO = new DictTypeExportReqVO(); reqVO.setName("nai"); reqVO.setType("艿"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -101,7 +101,7 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2021, 1, 20)); // 调用 - List list = dictTypeService.getDictTypeList(reqVO); + List list = dictTypeService.getDictTypeList(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbDictType, list.get(0)); @@ -110,13 +110,13 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { @Test public void testGetDictType() { // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); + DictTypeDO dbDictType = randomDictTypeDO(); dictTypeMapper.insert(dbDictType); // 准备参数 String type = dbDictType.getType(); // 调用 - SysDictTypeDO dictType = dictTypeService.getDictType(type); + DictTypeDO dictType = dictTypeService.getDictType(type); // 断言 assertNotNull(dictType); assertPojoEquals(dbDictType, dictType); @@ -125,7 +125,7 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { @Test public void testCreateDictType_success() { // 准备参数 - SysDictTypeCreateReqVO reqVO = randomPojo(SysDictTypeCreateReqVO.class, + DictTypeCreateReqVO reqVO = randomPojo(DictTypeCreateReqVO.class, o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); // 调用 @@ -133,17 +133,17 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(dictTypeId); // 校验记录的属性是否正确 - SysDictTypeDO dictType = dictTypeMapper.selectById(dictTypeId); + DictTypeDO dictType = dictTypeMapper.selectById(dictTypeId); assertPojoEquals(reqVO, dictType); } @Test public void testUpdateDictType_success() { // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); + DictTypeDO dbDictType = randomDictTypeDO(); dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysDictTypeUpdateReqVO reqVO = randomPojo(SysDictTypeUpdateReqVO.class, o -> { + DictTypeUpdateReqVO reqVO = randomPojo(DictTypeUpdateReqVO.class, o -> { o.setId(dbDictType.getId()); // 设置更新的 ID o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); }); @@ -151,14 +151,14 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { // 调用 dictTypeService.updateDictType(reqVO); // 校验是否更新正确 - SysDictTypeDO dictType = dictTypeMapper.selectById(reqVO.getId()); // 获取最新的 + DictTypeDO dictType = dictTypeMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, dictType); } @Test public void testDeleteDictType_success() { // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); + DictTypeDO dbDictType = randomDictTypeDO(); dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbDictType.getId(); @@ -172,7 +172,7 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { @Test public void testDeleteDictType_hasChildren() { // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); + DictTypeDO dbDictType = randomDictTypeDO(); dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbDictType.getId(); @@ -186,7 +186,7 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { @Test public void testCheckDictDataExists_success() { // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); + DictTypeDO dbDictType = randomDictTypeDO(); dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 // 调用成功 @@ -263,11 +263,11 @@ public class SysDictTypeServiceTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static SysDictTypeDO randomDictTypeDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static DictTypeDO randomDictTypeDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 }; - return randomPojo(SysDictTypeDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(DictTypeDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceTest.java similarity index 69% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceTest.java index 517006d64c..045b10f39e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/SysErrorCodeServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceTest.java @@ -1,21 +1,19 @@ package cn.iocoder.yudao.module.system.service.errorcode; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.ErrorCodeDO; import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.yudao.module.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.errorcode.SysErrorCodeMapper; -import cn.iocoder.yudao.module.system.enums.errorcode.SysErrorCodeTypeEnum; +import cn.iocoder.yudao.module.system.enums.errorcode.ErrorCodeTypeEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.assertj.core.util.Lists; import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.slf4j.Logger; import org.springframework.context.annotation.Import; import javax.annotation.Resource; @@ -23,19 +21,19 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.ERROR_CODE_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.ERROR_CODE_DUPLICATE; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.ERROR_CODE_NOT_EXISTS; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static org.junit.jupiter.api.Assertions.*; -@Import(SysErrorCodeServiceImpl.class) -public class SysErrorCodeServiceTest extends BaseDbUnitTest { +@Import(ErrorCodeServiceImpl.class) +public class ErrorCodeServiceTest extends BaseDbUnitTest { @Resource - private SysErrorCodeServiceImpl errorCodeService; + private ErrorCodeServiceImpl errorCodeService; @Resource private SysErrorCodeMapper errorCodeMapper; @@ -43,40 +41,40 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @Test public void testCreateErrorCode_success() { // 准备参数 - SysErrorCodeCreateReqVO reqVO = randomPojo(SysErrorCodeCreateReqVO.class); + ErrorCodeCreateReqVO reqVO = randomPojo(ErrorCodeCreateReqVO.class); // 调用 Long errorCodeId = errorCodeService.createErrorCode(reqVO); // 断言 assertNotNull(errorCodeId); // 校验记录的属性是否正确 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(errorCodeId); + ErrorCodeDO errorCode = errorCodeMapper.selectById(errorCodeId); assertPojoEquals(reqVO, errorCode); - assertEquals(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); + assertEquals(ErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); } @Test public void testUpdateErrorCode_success() { // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysErrorCodeUpdateReqVO reqVO = randomPojo(SysErrorCodeUpdateReqVO.class, o -> { + ErrorCodeUpdateReqVO reqVO = randomPojo(ErrorCodeUpdateReqVO.class, o -> { o.setId(dbErrorCode.getId()); // 设置更新的 ID }); // 调用 errorCodeService.updateErrorCode(reqVO); // 校验是否更新正确 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(reqVO.getId()); // 获取最新的 + ErrorCodeDO errorCode = errorCodeMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, errorCode); - assertEquals(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); + assertEquals(ErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); } @Test public void testDeleteErrorCode_success() { // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbErrorCode.getId(); @@ -90,10 +88,10 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @Test public void testGetErrorCodePage() { // mock 数据 - SysErrorCodeDO dbErrorCode = initGetErrorCodePage(); + ErrorCodeDO dbErrorCode = initGetErrorCodePage(); // 准备参数 - SysErrorCodePageReqVO reqVO = new SysErrorCodePageReqVO(); - reqVO.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); + ErrorCodePageReqVO reqVO = new ErrorCodePageReqVO(); + reqVO.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); reqVO.setApplicationName("yudao"); reqVO.setCode(1); reqVO.setMessage("yu"); @@ -101,7 +99,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2020, 11, 30)); // 调用 - PageResult pageResult = errorCodeService.getErrorCodePage(reqVO); + PageResult pageResult = errorCodeService.getErrorCodePage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -111,9 +109,9 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { /** * 初始化 getErrorCodePage 方法的测试数据 */ - private SysErrorCodeDO initGetErrorCodePage() { - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> { // 等会查询到 - o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); + private ErrorCodeDO initGetErrorCodePage() { + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> { // 等会查询到 + o.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); o.setApplicationName("yudaoyuanma"); o.setCode(1); o.setMessage("yudao"); @@ -121,7 +119,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { }); errorCodeMapper.insert(dbErrorCode); // 测试 type 不匹配 - errorCodeMapper.insert(ObjectUtils.cloneIgnoreId(dbErrorCode, o -> o.setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()))); + errorCodeMapper.insert(ObjectUtils.cloneIgnoreId(dbErrorCode, o -> o.setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()))); // 测试 applicationName 不匹配 errorCodeMapper.insert(ObjectUtils.cloneIgnoreId(dbErrorCode, o -> o.setApplicationName("yunai"))); // 测试 code 不匹配 @@ -136,10 +134,10 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @Test public void testGetErrorCodeList() { // mock 数据 - SysErrorCodeDO dbErrorCode = initGetErrorCodePage(); + ErrorCodeDO dbErrorCode = initGetErrorCodePage(); // 准备参数 - SysErrorCodeExportReqVO reqVO = new SysErrorCodeExportReqVO(); - reqVO.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); + ErrorCodeExportReqVO reqVO = new ErrorCodeExportReqVO(); + reqVO.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); reqVO.setApplicationName("yudao"); reqVO.setCode(1); reqVO.setMessage("yu"); @@ -147,7 +145,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2020, 11, 30)); // 调用 - List list = errorCodeService.getErrorCodeList(reqVO); + List list = errorCodeService.getErrorCodeList(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbErrorCode, list.get(0)); @@ -196,9 +194,9 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { // 调用 errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); // 断言 - SysErrorCodeDO errorCode = errorCodeMapper.selectOne(null); + ErrorCodeDO errorCode = errorCodeMapper.selectOne(null); assertPojoEquals(generateReqDTO, errorCode); - assertEquals(SysErrorCodeTypeEnum.AUTO_GENERATION.getType(), errorCode.getType()); + assertEquals(ErrorCodeTypeEnum.AUTO_GENERATION.getType(), errorCode.getType()); } /** @@ -207,7 +205,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @Test public void testAutoGenerateErrorCodes_021() { // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType())); + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType())); errorCodeMapper.insert(dbErrorCode); // 准备参数 ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, @@ -217,7 +215,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { // 调用 errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); // 断言,相等,说明不会更新 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + ErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); assertPojoEquals(dbErrorCode, errorCode); } @@ -227,7 +225,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @Test public void testAutoGenerateErrorCodes_022() { // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType())); errorCodeMapper.insert(dbErrorCode); // 准备参数 ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, @@ -237,7 +235,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { // 调用 errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); // 断言,相等,说明不会更新 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + ErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); assertPojoEquals(dbErrorCode, errorCode); } @@ -247,7 +245,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @Test public void testAutoGenerateErrorCodes_023() { // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType())); errorCodeMapper.insert(dbErrorCode); // 准备参数 ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, @@ -258,7 +256,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { // 调用 errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); // 断言,相等,说明不会更新 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + ErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); assertPojoEquals(dbErrorCode, errorCode); } @@ -268,7 +266,7 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { @Test public void testAutoGenerateErrorCodes_024() { // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType())); errorCodeMapper.insert(dbErrorCode); // 准备参数 ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, @@ -278,18 +276,18 @@ public class SysErrorCodeServiceTest extends BaseDbUnitTest { // 调用 errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); // 断言,匹配 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + ErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); assertPojoEquals(generateReqDTO, errorCode); } // ========== 随机对象 ========== @SafeVarargs - private static SysErrorCodeDO randomInfErrorCodeDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setType(randomEle(SysErrorCodeTypeEnum.values()).getType()); // 保证 key 的范围 + private static ErrorCodeDO randomInfErrorCodeDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setType(randomEle(ErrorCodeTypeEnum.values()).getType()); // 保证 key 的范围 }; - return randomPojo(SysErrorCodeDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(ErrorCodeDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java similarity index 77% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java index bac9b5a6e5..94778ef49d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysLoginLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java @@ -5,11 +5,11 @@ import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLogi import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.mysql.logger.SysLoginLogMapper; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.LoginLogMapper; +import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; @@ -23,34 +23,34 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static org.junit.jupiter.api.Assertions.assertEquals; -@Import(SysLoginLogServiceImpl.class) -public class SysLoginLogServiceImplTest extends BaseDbUnitTest { +@Import(LoginLogServiceImpl.class) +public class LoginLogServiceImplTest extends BaseDbUnitTest { @Resource - private SysLoginLogServiceImpl sysLoginLogService; + private LoginLogServiceImpl sysLoginLogService; @Resource - private SysLoginLogMapper loginLogMapper; + private LoginLogMapper loginLogMapper; @Test public void testGetLoginLogPage() { // 构造测试数据 // 登录成功的 SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { - logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); + logDO.setLogType(RandomUtil.randomEle(LoginLogTypeEnum.values()).getType()); logDO.setTraceId(TracerUtils.getTraceId()); logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()); logDO.setUserIp("192.168.199.16"); logDO.setUsername("wangkai"); logDO.setCreateTime(buildTime(2021, 3, 6)); - logDO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + logDO.setResult(LoginResultEnum.SUCCESS.getResult()); }); loginLogMapper.insert(loginLogDO); // 下面几个都是不匹配的数据 // 登录失败的 - loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(LoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); // 不同ip段的 loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); // 不同username @@ -60,7 +60,7 @@ public class SysLoginLogServiceImplTest extends BaseDbUnitTest { // 构造调用参数 - SysLoginLogPageReqVO reqVO = new SysLoginLogPageReqVO(); + LoginLogPageReqVO reqVO = new LoginLogPageReqVO(); reqVO.setUsername("wangkai"); reqVO.setUserIp("192.168.199"); reqVO.setStatus(true); @@ -82,20 +82,20 @@ public class SysLoginLogServiceImplTest extends BaseDbUnitTest { // 登录成功的 SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { - logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); + logDO.setLogType(RandomUtil.randomEle(LoginLogTypeEnum.values()).getType()); logDO.setTraceId(TracerUtils.getTraceId()); logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()); logDO.setUserIp("192.168.111.16"); logDO.setUsername("wangxiaokai"); logDO.setCreateTime(buildTime(2021, 3, 6)); - logDO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + logDO.setResult(LoginResultEnum.SUCCESS.getResult()); }); loginLogMapper.insert(loginLogDO); // 下面几个都是不匹配的数据 // 登录失败的 - loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(LoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); // 不同ip段的 loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); // 不同username @@ -105,7 +105,7 @@ public class SysLoginLogServiceImplTest extends BaseDbUnitTest { // 构造调用参数 - SysLoginLogExportReqVO reqVO = new SysLoginLogExportReqVO(); + LoginLogExportReqVO reqVO = new LoginLogExportReqVO(); reqVO.setUsername("wangxiaokai"); reqVO.setUserIp("192.168.111"); reqVO.setStatus(true); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java index 7838defb92..6f6edf4cf0 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/SysOperateLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.yudao.module.system.dal.mysql.logger.SysOperateLogMapper; -import cn.iocoder.yudao.module.system.service.user.SysUserService; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; +import cn.iocoder.yudao.module.system.service.user.UserService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -33,17 +33,17 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; -@Import({SysOperateLogServiceImpl.class}) -public class SysOperateLogServiceImplTest extends BaseDbUnitTest { +@Import({OperateLogServiceImpl.class}) +public class OperateLogServiceImplTest extends BaseDbUnitTest { @Resource - private SysOperateLogService operateLogServiceImpl; + private OperateLogService operateLogServiceImpl; @Resource - private SysOperateLogMapper operateLogMapper; + private OperateLogMapper operateLogMapper; @MockBean - private SysUserService userService; + private UserService userService; @Test public void testCreateOperateLogAsync() throws InterruptedException, ExecutionException { @@ -58,7 +58,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest { Future future = operateLogServiceImpl.createOperateLogAsync(reqVO); future.get(); // 断言插入是否正确 - SysOperateLogDO sysOperateLogDO = operateLogMapper.selectOne("trace_id", traceId); + OperateLogDO sysOperateLogDO = operateLogMapper.selectOne("trace_id", traceId); assertPojoEquals(reqVO, sysOperateLogDO); } @@ -74,7 +74,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest { when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); Long userId = user.getId(); // 构造操作日志 - SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, o -> { + OperateLogDO sysOperateLogDO = RandomUtils.randomPojo(OperateLogDO.class, o -> { o.setUserId(userId); o.setModule("order"); o.setType(OperateTypeEnum.CREATE.getType()); @@ -97,7 +97,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest { operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode()))); // 构造调用参数 - SysOperateLogPageReqVO reqVO = new SysOperateLogPageReqVO(); + OperateLogPageReqVO reqVO = new OperateLogPageReqVO(); reqVO.setUserNickname("wangkai"); reqVO.setModule("order"); reqVO.setType(OperateTypeEnum.CREATE.getType()); @@ -106,7 +106,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest { reqVO.setSuccess(true); // 调用service方法 - PageResult pageResult = operateLogServiceImpl.getOperateLogPage(reqVO); + PageResult pageResult = operateLogServiceImpl.getOperateLogPage(reqVO); // 断言,只查到了一条符合条件的 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -125,7 +125,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest { when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); Long userId = user.getId(); // 构造操作日志 - SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, o -> { + OperateLogDO sysOperateLogDO = RandomUtils.randomPojo(OperateLogDO.class, o -> { o.setUserId(userId); o.setModule("order"); o.setType(OperateTypeEnum.CREATE.getType()); @@ -148,7 +148,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest { operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode()))); // 构造调用参数 - SysOperateLogExportReqVO reqVO = new SysOperateLogExportReqVO(); + OperateLogExportReqVO reqVO = new OperateLogExportReqVO(); reqVO.setUserNickname("wangkai"); reqVO.setModule("order"); reqVO.setType(OperateTypeEnum.CREATE.getType()); @@ -157,7 +157,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest { reqVO.setSuccess(true); // 调用 service 方法 - List list = operateLogServiceImpl.getOperateLogs(reqVO); + List list = operateLogServiceImpl.getOperateLogs(reqVO); // 断言,只查到了一条符合条件的 assertEquals(1, list.size()); assertPojoEquals(sysOperateLogDO, list.get(0)); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImplTest.java similarity index 63% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImplTest.java index 0d9144f752..0d5babc505 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/SysNoticeServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImplTest.java @@ -2,12 +2,12 @@ package cn.iocoder.yudao.module.system.service.notice; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.yudao.module.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; import cn.iocoder.yudao.module.system.dal.mysql.notice.SysNoticeMapper; -import cn.iocoder.yudao.module.system.enums.notice.SysNoticeTypeEnum; +import cn.iocoder.yudao.module.system.enums.notice.NoticeTypeEnum; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; @@ -18,18 +18,18 @@ import javax.annotation.Resource; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.NOTICE_NOT_FOUND; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.*; -@Import(SysNoticeServiceImpl.class) -class SysNoticeServiceImplTest extends BaseDbUnitTest { +@Import(NoticeServiceImpl.class) +class NoticeServiceImplTest extends BaseDbUnitTest { @Resource - private SysNoticeServiceImpl sysNoticeService; + private NoticeServiceImpl sysNoticeService; @Resource private SysNoticeMapper sysNoticeMapper; @@ -37,10 +37,10 @@ class SysNoticeServiceImplTest extends BaseDbUnitTest { @Test public void testPageNotices_success() { // 插入前置数据 - SysNoticeDO dbNotice = randomPojo(SysNoticeDO.class, o -> { + NoticeDO dbNotice = randomPojo(NoticeDO.class, o -> { o.setTitle("尼古拉斯赵四来啦!"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + o.setType(randomEle(NoticeTypeEnum.values()).getType()); }); sysNoticeMapper.insert(dbNotice); @@ -51,10 +51,10 @@ class SysNoticeServiceImplTest extends BaseDbUnitTest { // 查询 - SysNoticePageReqVO reqVO = new SysNoticePageReqVO(); + NoticePageReqVO reqVO = new NoticePageReqVO(); reqVO.setTitle("尼古拉斯赵四来啦!"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - PageResult pageResult = sysNoticeService.pageNotices(reqVO); + PageResult pageResult = sysNoticeService.pageNotices(reqVO); // 验证查询结果经过筛选 assertEquals(1, pageResult.getTotal()); @@ -66,11 +66,11 @@ class SysNoticeServiceImplTest extends BaseDbUnitTest { @Test public void testGetNotice_success() { // 插入前置数据 - SysNoticeDO dbNotice = randomSysNoticeDO(); + NoticeDO dbNotice = randomSysNoticeDO(); sysNoticeMapper.insert(dbNotice); // 查询 - SysNoticeDO notice = sysNoticeService.getNotice(dbNotice.getId()); + NoticeDO notice = sysNoticeService.getNotice(dbNotice.getId()); // 验证插入与读取对象是否一致 assertNotNull(notice); @@ -80,38 +80,38 @@ class SysNoticeServiceImplTest extends BaseDbUnitTest { @Test public void testCreateNotice_success() { // 准备参数 - SysNoticeCreateReqVO reqVO = randomSysNoticeCreateReqVO(); + NoticeCreateReqVO reqVO = randomSysNoticeCreateReqVO(); // 校验插入是否成功 Long noticeId = sysNoticeService.createNotice(reqVO); assertNotNull(noticeId); // 校验插入属性是否正确 - SysNoticeDO notice = sysNoticeMapper.selectById(noticeId); + NoticeDO notice = sysNoticeMapper.selectById(noticeId); assertPojoEquals(reqVO, notice); } @Test public void testUpdateNotice_success() { // 插入前置数据 - SysNoticeDO dbNoticeDO = randomSysNoticeDO(); + NoticeDO dbNoticeDO = randomSysNoticeDO(); sysNoticeMapper.insert(dbNoticeDO); // 准备更新参数 - SysNoticeUpdateReqVO reqVO = randomSysNoticeUpdateReqVO(o -> o.setId(dbNoticeDO.getId())); + NoticeUpdateReqVO reqVO = randomSysNoticeUpdateReqVO(o -> o.setId(dbNoticeDO.getId())); // 更新 sysNoticeService.updateNotice(reqVO); // 检验是否更新成功 - SysNoticeDO notice = sysNoticeMapper.selectById(reqVO.getId()); + NoticeDO notice = sysNoticeMapper.selectById(reqVO.getId()); assertPojoEquals(reqVO, notice); } @Test public void testDeleteNotice_success() { // 插入前置数据 - SysNoticeDO dbNotice = randomSysNoticeDO(); + NoticeDO dbNotice = randomSysNoticeDO(); sysNoticeMapper.insert(dbNotice); // 删除 @@ -124,7 +124,7 @@ class SysNoticeServiceImplTest extends BaseDbUnitTest { @Test public void checkNoticeExists_success() { // 插入前置数据 - SysNoticeDO dbNotice = randomSysNoticeDO(); + NoticeDO dbNotice = randomSysNoticeDO(); sysNoticeMapper.insert(dbNotice); // 成功调用 @@ -137,24 +137,24 @@ class SysNoticeServiceImplTest extends BaseDbUnitTest { } @SafeVarargs - private static SysNoticeDO randomSysNoticeDO(Consumer... consumers) { - SysNoticeDO notice = randomPojo(SysNoticeDO.class, consumers); - notice.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + private static NoticeDO randomSysNoticeDO(Consumer... consumers) { + NoticeDO notice = randomPojo(NoticeDO.class, consumers); + notice.setType(randomEle(NoticeTypeEnum.values()).getType()); notice.setStatus(CommonStatusEnum.ENABLE.getStatus()); return notice; } @SafeVarargs - private static SysNoticeUpdateReqVO randomSysNoticeUpdateReqVO(Consumer... consumers) { - SysNoticeUpdateReqVO reqVO = randomPojo(SysNoticeUpdateReqVO.class, consumers); - reqVO.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + private static NoticeUpdateReqVO randomSysNoticeUpdateReqVO(Consumer... consumers) { + NoticeUpdateReqVO reqVO = randomPojo(NoticeUpdateReqVO.class, consumers); + reqVO.setType(randomEle(NoticeTypeEnum.values()).getType()); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); return reqVO; } - private static SysNoticeCreateReqVO randomSysNoticeCreateReqVO() { - SysNoticeCreateReqVO reqVO = randomPojo(SysNoticeCreateReqVO.class); - reqVO.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + private static NoticeCreateReqVO randomSysNoticeCreateReqVO() { + NoticeCreateReqVO reqVO = randomPojo(NoticeCreateReqVO.class); + reqVO.setType(randomEle(NoticeTypeEnum.values()).getType()); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); return reqVO; } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java similarity index 70% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java index 06209bb6da..5b2b343830 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysMenuServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java @@ -3,19 +3,17 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysMenuMapper; import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; -import cn.iocoder.yudao.module.system.mq.producer.permission.SysMenuProducer; +import cn.iocoder.yudao.module.system.mq.producer.permission.MenuProducer; import cn.iocoder.yudao.framework.common.util.spring.SpringAopUtils; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import com.google.common.collect.Multimap; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -23,49 +21,49 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.verify; -@Import(SysMenuServiceImpl.class) -public class SysMenuServiceTest extends BaseDbUnitTest { +@Import(MenuServiceImpl.class) +public class MenuServiceTest extends BaseDbUnitTest { @Resource - private SysMenuServiceImpl sysMenuService; + private MenuServiceImpl sysMenuService; @MockBean - private SysPermissionService sysPermissionService; + private PermissionService sysPermissionService; @MockBean - private SysMenuProducer sysMenuProducer; + private MenuProducer sysMenuProducer; @Resource private SysMenuMapper menuMapper; @Test public void testInitLocalCache_success() throws Exception { - SysMenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); + MenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); menuMapper.insert(menuDO1); - SysMenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); + MenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); menuMapper.insert(menuDO2); // 调用 sysMenuService.initLocalCache(); // 获取代理对象 - SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); - Map menuCache = - (Map) BeanUtil.getFieldValue(target, "menuCache"); + Map menuCache = + (Map) BeanUtil.getFieldValue(target, "menuCache"); Assert.isTrue(menuCache.size() == 2); assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId())); assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId())); - Multimap permissionMenuCache = - (Multimap) BeanUtil.getFieldValue(target, "permissionMenuCache"); + Multimap permissionMenuCache = + (Multimap) BeanUtil.getFieldValue(target, "permissionMenuCache"); Assert.isTrue(permissionMenuCache.size() == 2); assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission())); assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission())); @@ -77,12 +75,12 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testCreateMenu_success() { //构造父目录 - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); menuMapper.insert(menuDO); Long parentId = menuDO.getId(); //调用 - SysMenuCreateReqVO vo = randomPojo(SysMenuCreateReqVO.class, o -> { + MenuCreateReqVO vo = randomPojo(MenuCreateReqVO.class, o -> { o.setParentId(parentId); o.setName("testSonName"); o.setType(MenuTypeEnum.MENU.getType()); @@ -93,7 +91,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { //断言 assertNotNull(menuId); // 校验记录的属性是否正确 - SysMenuDO ret = menuMapper.selectById(menuId); + MenuDO ret = menuMapper.selectById(menuId); assertPojoEquals(vo, ret); // 校验调用 verify(sysMenuProducer).sendMenuRefreshMessage(); @@ -102,12 +100,12 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testUpdateMenu_success() { //构造父子目录 - SysMenuDO sonMenuDO = initParentAndSonMenuDO(); + MenuDO sonMenuDO = initParentAndSonMenuDO(); Long sonId = sonMenuDO.getId(); Long parentId = sonMenuDO.getParentId(); //调用 - SysMenuUpdateReqVO vo = randomPojo(SysMenuUpdateReqVO.class, o -> { + MenuUpdateReqVO vo = randomPojo(MenuUpdateReqVO.class, o -> { o.setId(sonId); o.setParentId(parentId); o.setType(MenuTypeEnum.MENU.getType()); @@ -118,7 +116,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { //断言 // 校验记录的属性是否正确 - SysMenuDO ret = menuMapper.selectById(sonId); + MenuDO ret = menuMapper.selectById(sonId); assertPojoEquals(vo, ret); // 校验调用 verify(sysMenuProducer).sendMenuRefreshMessage(); @@ -130,7 +128,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { Long parentId = 10000L; //调用 - SysMenuUpdateReqVO vo = randomPojo(SysMenuUpdateReqVO.class, o -> { + MenuUpdateReqVO vo = randomPojo(MenuUpdateReqVO.class, o -> { o.setId(sonId); o.setParentId(parentId); o.setType(MenuTypeEnum.MENU.getType()); @@ -142,14 +140,14 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testDeleteMenu_success() { - SysMenuDO sonMenuDO = initParentAndSonMenuDO(); + MenuDO sonMenuDO = initParentAndSonMenuDO(); Long sonId = sonMenuDO.getId(); // 调用 sysMenuService.deleteMenu(sonId); // 断言 - SysMenuDO menuDO = menuMapper.selectById(sonId); + MenuDO menuDO = menuMapper.selectById(sonId); assertNull(menuDO); verify(sysPermissionService).processMenuDeleted(sonId); verify(sysMenuProducer).sendMenuRefreshMessage(); @@ -164,7 +162,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testDeleteMenu_existChildren() { - SysMenuDO sonMenu = initParentAndSonMenuDO(); + MenuDO sonMenu = initParentAndSonMenuDO(); Long parentId = sonMenu.getParentId(); assertServiceException(() -> sysMenuService.deleteMenu(parentId), MENU_EXISTS_CHILDREN); @@ -172,17 +170,17 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testGetMenus_success() { - Map idMenuMap = new HashMap<>(); - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + Map idMenuMap = new HashMap<>(); + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); menuMapper.insert(menuDO); idMenuMap.put(menuDO.getId(), menuDO); - SysMenuDO sonMenu = createMenuDO(MenuTypeEnum.MENU, "son", menuDO.getId()); + MenuDO sonMenu = createMenuDO(MenuTypeEnum.MENU, "son", menuDO.getId()); menuMapper.insert(sonMenu); idMenuMap.put(sonMenu.getId(), sonMenu); // 调用 - List menuDOS = sysMenuService.getMenus(); + List menuDOS = sysMenuService.getMenus(); // 断言 assertEquals(menuDOS.size(), idMenuMap.size()); @@ -191,9 +189,9 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testGetMenusReqVo_success() { - Map idMenuMap = new HashMap<>(); + Map idMenuMap = new HashMap<>(); // 用于验证可以模糊搜索名称包含"name",状态为1的menu - SysMenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1); + MenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1); menuMapper.insert(menu); idMenuMap.put(menu.getId(), menu); @@ -212,10 +210,10 @@ public class SysMenuServiceTest extends BaseDbUnitTest { menuMapper.insert(menu); // 调用 - SysMenuListReqVO reqVO = new SysMenuListReqVO(); + MenuListReqVO reqVO = new MenuListReqVO(); reqVO.setStatus(1); reqVO.setName("name"); - List menuDOS = sysMenuService.getMenus(reqVO); + List menuDOS = sysMenuService.getMenus(reqVO); // 断言 assertEquals(menuDOS.size(), idMenuMap.size()); @@ -224,14 +222,14 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testListMenusFromCache_success() throws Exception { - Map mockCacheMap = new HashMap<>(); + Map mockCacheMap = new HashMap<>(); // 获取代理对象 - SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); BeanUtil.setFieldValue(target, "menuCache", mockCacheMap); - Map idMenuMap = new HashMap<>(); + Map idMenuMap = new HashMap<>(); // 用于验证搜索类型为MENU,状态为1的menu - SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); + MenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); mockCacheMap.put(menuDO.getId(), menuDO); idMenuMap.put(menuDO.getId(), menuDO); @@ -245,7 +243,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); mockCacheMap.put(menuDO.getId(), menuDO); - List menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()), + List menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(CommonStatusEnum.DISABLE.getStatus())); assertEquals(menuDOS.size(), idMenuMap.size()); menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); @@ -253,14 +251,14 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testListMenusFromCache2_success() throws Exception { - Map mockCacheMap = new HashMap<>(); + Map mockCacheMap = new HashMap<>(); // 获取代理对象 - SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); BeanUtil.setFieldValue(target, "menuCache", mockCacheMap); - Map idMenuMap = new HashMap<>(); + Map idMenuMap = new HashMap<>(); // 验证搜索id为1, 类型为MENU, 状态为1 的menu - SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); + MenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); mockCacheMap.put(menuDO.getId(), menuDO); idMenuMap.put(menuDO.getId(), menuDO); @@ -272,7 +270,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); mockCacheMap.put(menuDO.getId(), menuDO); - List menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(1L), + List menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(1L), Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(1)); assertEquals(menuDOS.size(), idMenuMap.size()); menuDOS.forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu)); @@ -280,7 +278,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testCheckParentResource_success() { - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); menuMapper.insert(menuDO); Long parentId = menuDO.getId(); @@ -299,7 +297,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testCheckParentResource_parentTypeError() { - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L); + MenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L); menuMapper.insert(menuDO); Long parentId = menuDO.getId(); @@ -308,7 +306,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testCheckResource_success() { - SysMenuDO sonMenu = initParentAndSonMenuDO(); + MenuDO sonMenu = initParentAndSonMenuDO(); Long parentId = sonMenu.getParentId(); Long otherSonMenuId = randomLongId(); @@ -319,7 +317,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { @Test public void testCheckResource_sonMenuNameDuplicate(){ - SysMenuDO sonMenu=initParentAndSonMenuDO(); + MenuDO sonMenu=initParentAndSonMenuDO(); Long parentId=sonMenu.getParentId(); Long otherSonMenuId=randomLongId(); @@ -333,27 +331,27 @@ public class SysMenuServiceTest extends BaseDbUnitTest { * * @return */ - private SysMenuDO initParentAndSonMenuDO() { + private MenuDO initParentAndSonMenuDO() { //构造父子目录 - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); menuMapper.insert(menuDO); Long parentId = menuDO.getId(); - SysMenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId); + MenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId); menuMapper.insert(sonMenuDO); return sonMenuDO; } - private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) { + private MenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) { return createMenuDO(typeEnum, menuName, parentId, randomCommonStatus()); } - private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { + private MenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { return createMenuDO(null, typeEnum, menuName, parentId, status); } - private SysMenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { - return randomPojo(SysMenuDO.class, o -> { + private MenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { + return randomPojo(MenuDO.class, o -> { o.setId(id); o.setParentId(parentId); o.setType(typeEnum.getType()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java similarity index 83% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java index dde1a7bb76..3652c2ba30 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java @@ -3,12 +3,12 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleMenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMenuMapper; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleMapper; -import cn.iocoder.yudao.module.system.mq.producer.permission.SysPermissionProducer; -import cn.iocoder.yudao.module.system.service.dept.SysDeptService; +import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; +import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; @@ -30,11 +30,11 @@ import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@Import(SysPermissionServiceImpl.class) -public class SysPermissionServiceTest extends BaseDbUnitTest { +@Import(PermissionServiceImpl.class) +public class PermissionServiceTest extends BaseDbUnitTest { @Resource - private SysPermissionServiceImpl permissionService; + private PermissionServiceImpl permissionService; @Resource private SysRoleMenuMapper roleMenuMapper; @@ -42,14 +42,14 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { private SysUserRoleMapper userRoleMapper; @MockBean - private SysRoleService roleService; + private RoleService roleService; @MockBean - private SysMenuService menuService; + private MenuService menuService; @MockBean - private SysDeptService deptService; + private DeptService deptService; @MockBean - private SysPermissionProducer permissionProducer; + private PermissionProducer permissionProducer; @Test public void testProcessRoleDeleted() { @@ -61,15 +61,15 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除 userRoleMapper.insert(userRoleDO02); // mock 数据 RoleMenu - SysRoleMenuDO roleMenuDO01 = randomPojo(SysRoleMenuDO.class, o -> o.setRoleId(roleId)); // 被删除 + RoleMenuDO roleMenuDO01 = randomPojo(RoleMenuDO.class, o -> o.setRoleId(roleId)); // 被删除 roleMenuMapper.insert(roleMenuDO01); - SysRoleMenuDO roleMenuDO02 = randomPojo(SysRoleMenuDO.class); // 不被删除 + RoleMenuDO roleMenuDO02 = randomPojo(RoleMenuDO.class); // 不被删除 roleMenuMapper.insert(roleMenuDO02); // 调用 permissionService.processRoleDeleted(roleId); // 断言数据 RoleMenuDO - List dbRoleMenus = roleMenuMapper.selectList(); + List dbRoleMenus = roleMenuMapper.selectList(); assertEquals(1, dbRoleMenus.size()); assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); // 断言数据 UserRoleDO @@ -85,15 +85,15 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { // 准备参数 Long menuId = randomLongId(); // mock 数据 - SysRoleMenuDO roleMenuDO01 = randomPojo(SysRoleMenuDO.class, o -> o.setMenuId(menuId)); // 被删除 + RoleMenuDO roleMenuDO01 = randomPojo(RoleMenuDO.class, o -> o.setMenuId(menuId)); // 被删除 roleMenuMapper.insert(roleMenuDO01); - SysRoleMenuDO roleMenuDO02 = randomPojo(SysRoleMenuDO.class); // 不被删除 + RoleMenuDO roleMenuDO02 = randomPojo(RoleMenuDO.class); // 不被删除 roleMenuMapper.insert(roleMenuDO02); // 调用 permissionService.processMenuDeleted(menuId); // 断言数据 - List dbRoleMenus = roleMenuMapper.selectList(); + List dbRoleMenus = roleMenuMapper.selectList(); assertEquals(1, dbRoleMenus.size()); assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); // 断言调用 @@ -124,7 +124,7 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { LoginUser loginUser = randomPojo(LoginUser.class); // mock 方法 DeptDataPermissionRespDTO respDTO = new DeptDataPermissionRespDTO(); - loginUser.setContext(SysPermissionServiceImpl.CONTEXT_KEY, respDTO); + loginUser.setContext(PermissionServiceImpl.CONTEXT_KEY, respDTO); // 调用 DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser); @@ -146,7 +146,7 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { assertTrue(result.getAll()); assertFalse(result.getSelf()); assertTrue(CollUtil.isEmpty(result.getDeptIds())); - assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + assertSame(result, loginUser.getContext(PermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); } @Test @@ -165,7 +165,7 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { assertEquals(roleDO.getDataScopeDeptIds().size() + 1, result.getDeptIds().size()); assertTrue(CollUtil.containsAll(result.getDeptIds(), roleDO.getDataScopeDeptIds())); assertTrue(CollUtil.contains(result.getDeptIds(), loginUser.getDeptId())); - assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + assertSame(result, loginUser.getContext(PermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); } @Test @@ -183,7 +183,7 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { assertFalse(result.getSelf()); assertEquals(1, result.getDeptIds().size()); assertTrue(CollUtil.contains(result.getDeptIds(), loginUser.getDeptId())); - assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + assertSame(result, loginUser.getContext(PermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); } @Test @@ -205,7 +205,7 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { assertFalse(result.getSelf()); assertEquals(1, result.getDeptIds().size()); assertTrue(CollUtil.contains(result.getDeptIds(), deptDO.getId())); - assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + assertSame(result, loginUser.getContext(PermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); } @Test @@ -222,7 +222,7 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { assertFalse(result.getAll()); assertTrue(result.getSelf()); assertTrue(CollUtil.isEmpty(result.getDeptIds())); - assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + assertSame(result, loginUser.getContext(PermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java similarity index 72% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java index d58e68ad2a..68e55926ad 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/SysRoleServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java @@ -4,13 +4,13 @@ import cn.hutool.core.bean.BeanUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.yudao.module.system.controller.permission.vo.role.SysRoleUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMapper; -import cn.iocoder.yudao.module.system.enums.permission.SysRoleTypeEnum; -import cn.iocoder.yudao.module.system.mq.producer.permission.SysRoleProducer; +import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; +import cn.iocoder.yudao.module.system.mq.producer.permission.RoleProducer; import cn.iocoder.yudao.framework.common.util.spring.SpringAopUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; @@ -21,7 +21,7 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; @@ -29,26 +29,26 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.verify; -@Import(SysRoleServiceImpl.class) -public class SysRoleServiceTest extends BaseDbUnitTest { +@Import(RoleServiceImpl.class) +public class RoleServiceTest extends BaseDbUnitTest { @Resource - private SysRoleServiceImpl sysRoleService; + private RoleServiceImpl sysRoleService; @Resource private SysRoleMapper roleMapper; @MockBean - private SysPermissionService sysPermissionService; + private PermissionService sysPermissionService; @MockBean - private SysRoleProducer sysRoleProducer; + private RoleProducer sysRoleProducer; @Test public void testInitLocalCache_success() throws Exception { - SysRoleDO roleDO1 = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + SysRoleDO roleDO1 = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO1); - SysRoleDO roleDO2 = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + SysRoleDO roleDO2 = createRoleDO("role2", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO2); //调用 @@ -56,7 +56,7 @@ public class SysRoleServiceTest extends BaseDbUnitTest { //断言 //获取代理对象 - SysRoleServiceImpl target = (SysRoleServiceImpl) SpringAopUtils.getTarget(sysRoleService); + RoleServiceImpl target = (RoleServiceImpl) SpringAopUtils.getTarget(sysRoleService); Map roleCache = (Map) BeanUtil.getFieldValue(target, "roleCache"); assertPojoEquals(roleDO1, roleCache.get(roleDO1.getId())); @@ -68,11 +68,11 @@ public class SysRoleServiceTest extends BaseDbUnitTest { @Test public void testCreateRole_success() { - SysRoleCreateReqVO reqVO = randomPojo(SysRoleCreateReqVO.class, o -> { + RoleCreateReqVO reqVO = randomPojo(RoleCreateReqVO.class, o -> { o.setCode("role_code"); o.setName("role_name"); o.setRemark("remark"); - o.setType(SysRoleTypeEnum.CUSTOM.getType()); + o.setType(RoleTypeEnum.CUSTOM.getType()); o.setSort(1); }); Long roleId = sysRoleService.createRole(reqVO); @@ -87,16 +87,16 @@ public class SysRoleServiceTest extends BaseDbUnitTest { @Test public void testUpdateRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); //调用 - SysRoleUpdateReqVO reqVO = randomPojo(SysRoleUpdateReqVO.class, o -> { + RoleUpdateReqVO reqVO = randomPojo(RoleUpdateReqVO.class, o -> { o.setId(roleId); o.setCode("role_code"); o.setName("update_name"); - o.setType(SysRoleTypeEnum.SYSTEM.getType()); + o.setType(RoleTypeEnum.SYSTEM.getType()); o.setSort(999); }); sysRoleService.updateRole(reqVO); @@ -110,7 +110,7 @@ public class SysRoleServiceTest extends BaseDbUnitTest { @Test public void testUpdateRoleStatus_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, CommonStatusEnum.ENABLE.getStatus()); + SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, CommonStatusEnum.ENABLE.getStatus()); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -126,7 +126,7 @@ public class SysRoleServiceTest extends BaseDbUnitTest { @Test public void testUpdateRoleDataScope_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -147,7 +147,7 @@ public class SysRoleServiceTest extends BaseDbUnitTest { @Test public void testDeleteRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -165,16 +165,16 @@ public class SysRoleServiceTest extends BaseDbUnitTest { public void testGetRoles_success() { Map idRoleMap = new HashMap<>(); // 验证查询状态为1的角色 - SysRoleDO roleDO1 = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); + SysRoleDO roleDO1 = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); roleMapper.insert(roleDO1); idRoleMap.put(roleDO1.getId(), roleDO1); - SysRoleDO roleDO2 = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); + SysRoleDO roleDO2 = createRoleDO("role2", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); roleMapper.insert(roleDO2); idRoleMap.put(roleDO2.getId(), roleDO2); // 以下是排除的角色 - SysRoleDO roleDO3 = createRoleDO("role3", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2); + SysRoleDO roleDO3 = createRoleDO("role3", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2); roleMapper.insert(roleDO3); //调用 @@ -191,21 +191,21 @@ public class SysRoleServiceTest extends BaseDbUnitTest { Map idRoleMap = new HashMap<>(); // 验证名称包含"role", 状态为1,code为"code"的角色 // 第一页 - SysRoleDO roleDO = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); + SysRoleDO roleDO = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); roleMapper.insert(roleDO); idRoleMap.put(roleDO.getId(), roleDO); // 第二页 - roleDO = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); + roleDO = createRoleDO("role2", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); roleMapper.insert(roleDO); // 以下是排除的角色 - roleDO = createRoleDO("role3", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2, "code"); + roleDO = createRoleDO("role3", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2, "code"); roleMapper.insert(roleDO); - roleDO = createRoleDO("role4", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "xxxxx"); + roleDO = createRoleDO("role4", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "xxxxx"); roleMapper.insert(roleDO); //调用 - SysRolePageReqVO reqVO = randomPojo(SysRolePageReqVO.class, o -> { + RolePageReqVO reqVO = randomPojo(RolePageReqVO.class, o -> { o.setName("role"); o.setCode("code"); o.setStatus(1); @@ -226,7 +226,7 @@ public class SysRoleServiceTest extends BaseDbUnitTest { @Test public void testCheckDuplicateRole_nameDuplicate() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); String duplicateName = "role_name"; @@ -239,7 +239,7 @@ public class SysRoleServiceTest extends BaseDbUnitTest { SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> { o.setName("role_999"); o.setCode("code"); - o.setType(SysRoleTypeEnum.CUSTOM.getType()); + o.setType(RoleTypeEnum.CUSTOM.getType()); o.setStatus(1); o.setDataScope(DataScopeEnum.ALL.getScope()); }); @@ -253,7 +253,7 @@ public class SysRoleServiceTest extends BaseDbUnitTest { @Test public void testCheckUpdateRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -267,26 +267,26 @@ public class SysRoleServiceTest extends BaseDbUnitTest { @Test public void testCheckUpdateRole_systemRoleCanNotBeUpdate() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.SYSTEM, DataScopeEnum.ALL); + SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.SYSTEM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); assertServiceException(() -> sysRoleService.checkUpdateRole(roleId), ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); } - private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status) { + private SysRoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status) { return createRoleDO( name, typeEnum, scopeEnum, status, randomString()); } - private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { + private SysRoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { return createRoleDO(null, name, typeEnum, scopeEnum, status, code); } - private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum) { + private SysRoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum) { return createRoleDO(null, name, typeEnum, scopeEnum, randomCommonStatus(), randomString()); } - private SysRoleDO createRoleDO(Long id, String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { + private SysRoleDO createRoleDO(Long id, String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> { o.setId(id); o.setName(name); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java similarity index 86% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java index d3509f9e42..28d6b2703d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsChannelServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.bean.BeanUtil; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsChannelMapper; -import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -22,8 +22,8 @@ import java.util.Date; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; @@ -32,11 +32,11 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -@Import(SysSmsChannelServiceImpl.class) -public class SysSmsChannelServiceTest extends BaseDbUnitTest { +@Import(SmsChannelServiceImpl.class) +public class SmsChannelServiceTest extends BaseDbUnitTest { @Resource - private SysSmsChannelServiceImpl smsChannelService; + private SmsChannelServiceImpl smsChannelService; @Resource private SysSmsChannelMapper smsChannelMapper; @@ -44,9 +44,9 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { @MockBean private SmsClientFactory smsClientFactory; @MockBean - private SysSmsTemplateService smsTemplateService; + private SmsTemplateService smsTemplateService; @MockBean - private SysSmsProducer smsProducer; + private SmsProducer smsProducer; @Test public void testInitLocalCache_success() { @@ -71,7 +71,7 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { @Test public void testCreateSmsChannel_success() { // 准备参数 - SysSmsChannelCreateReqVO reqVO = randomPojo(SysSmsChannelCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); + SmsChannelCreateReqVO reqVO = randomPojo(SmsChannelCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); // 调用 Long smsChannelId = smsChannelService.createSmsChannel(reqVO); @@ -90,7 +90,7 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysSmsChannelUpdateReqVO reqVO = randomPojo(SysSmsChannelUpdateReqVO.class, o -> { + SmsChannelUpdateReqVO reqVO = randomPojo(SmsChannelUpdateReqVO.class, o -> { o.setId(dbSmsChannel.getId()); // 设置更新的 ID o.setStatus(randomCommonStatus()); o.setCallbackUrl(randomString()); @@ -108,7 +108,7 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { @Test public void testUpdateSmsChannel_notExists() { // 准备参数 - SysSmsChannelUpdateReqVO reqVO = randomPojo(SysSmsChannelUpdateReqVO.class); + SmsChannelUpdateReqVO reqVO = randomPojo(SmsChannelUpdateReqVO.class); // 调用, 并断言异常 assertServiceException(() -> smsChannelService.updateSmsChannel(reqVO), SMS_CHANNEL_NOT_EXISTS); @@ -169,7 +169,7 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 smsChannelMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsChannel, o -> o.setCreateTime(buildTime(2020, 11, 11)))); // 准备参数 - SysSmsChannelPageReqVO reqVO = new SysSmsChannelPageReqVO(); + SmsChannelPageReqVO reqVO = new SmsChannelPageReqVO(); reqVO.setSignature("芋道"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); reqVO.setBeginCreateTime(buildTime(2020, 12, 1)); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java index ae8e734e99..e743897310 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsLogServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsLogMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum; @@ -28,11 +28,11 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; import static org.junit.jupiter.api.Assertions.assertEquals; -@Import(SysSmsLogServiceImpl.class) -public class SysSmsLogServiceTest extends BaseDbUnitTest { +@Import(SmsLogServiceImpl.class) +public class SmsLogServiceTest extends BaseDbUnitTest { @Resource - private SysSmsLogServiceImpl smsLogService; + private SmsLogServiceImpl smsLogService; @Resource private SysSmsLogMapper smsLogMapper; @@ -65,7 +65,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest { // 测试 receiveTime 不匹配 smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); // 准备参数 - SysSmsLogPageReqVO reqVO = new SysSmsLogPageReqVO(); + SmsLogPageReqVO reqVO = new SmsLogPageReqVO(); reqVO.setChannelId(1L); reqVO.setTemplateId(10L); reqVO.setMobile("156"); @@ -112,7 +112,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest { // 测试 receiveTime 不匹配 smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); // 准备参数 - SysSmsLogExportReqVO reqVO = new SysSmsLogExportReqVO(); + SmsLogExportReqVO reqVO = new SmsLogExportReqVO(); reqVO.setChannelId(1L); reqVO.setTemplateId(10L); reqVO.setMobile("156"); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java index 1ee2c90fbe..540c9a3726 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsTemplateServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.yudao.module.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsTemplateMapper; -import cn.iocoder.yudao.module.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum; @@ -29,7 +29,7 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; @@ -38,23 +38,23 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -@Import(SysSmsTemplateServiceImpl.class) -public class SysSmsTemplateServiceTest extends BaseDbUnitTest { +@Import(SmsTemplateServiceImpl.class) +public class SmsTemplateServiceTest extends BaseDbUnitTest { @Resource - private SysSmsTemplateServiceImpl smsTemplateService; + private SmsTemplateServiceImpl smsTemplateService; @Resource private SysSmsTemplateMapper smsTemplateMapper; @MockBean - private SysSmsChannelService smsChannelService; + private SmsChannelService smsChannelService; @MockBean private SmsClientFactory smsClientFactory; @MockBean private SmsClient smsClient; @MockBean - private SysSmsProducer smsProducer; + private SmsProducer smsProducer; @Test public void testParseTemplateContentParams() { @@ -72,7 +72,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { @SuppressWarnings("unchecked") public void testCreateSmsTemplate_success() { // 准备参数 - SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class, o -> { + SmsTemplateCreateReqVO reqVO = randomPojo(SmsTemplateCreateReqVO.class, o -> { o.setContent("正在进行登录操作{operation},您的验证码是{code}"); o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 @@ -108,7 +108,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class, o -> { + SmsTemplateUpdateReqVO reqVO = randomPojo(SmsTemplateUpdateReqVO.class, o -> { o.setId(dbSmsTemplate.getId()); // 设置更新的 ID o.setContent("正在进行登录操作{operation},您的验证码是{code}"); o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 @@ -139,7 +139,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { @Test public void testUpdateSmsTemplate_notExists() { // 准备参数 - SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class); + SmsTemplateUpdateReqVO reqVO = randomPojo(SmsTemplateUpdateReqVO.class); // 调用, 并断言异常 assertServiceException(() -> smsTemplateService.updateSmsTemplate(reqVO), SMS_TEMPLATE_NOT_EXISTS); @@ -198,7 +198,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); // 准备参数 - SysSmsTemplatePageReqVO reqVO = new SysSmsTemplatePageReqVO(); + SmsTemplatePageReqVO reqVO = new SmsTemplatePageReqVO(); reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); reqVO.setCode("yudao"); @@ -244,7 +244,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); // 准备参数 - SysSmsTemplateExportReqVO reqVO = new SysSmsTemplateExportReqVO(); + SmsTemplateExportReqVO reqVO = new SmsTemplateExportReqVO(); reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); reqVO.setCode("yudao"); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java similarity index 85% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java index a6199f7060..93b31c0746 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.system.service.tenant; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantCreateReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantExportReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantPageReqVO; -import cn.iocoder.yudao.module.system.controller.tenant.vo.SysTenantUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantMapper; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -15,7 +15,7 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.util.List; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.TENANT_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TENANT_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; @@ -23,16 +23,11 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static org.junit.jupiter.api.Assertions.*; -/** - * {@link SysTenantServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(SysTenantServiceImpl.class) -public class SysTenantServiceTest extends BaseDbUnitTest { +@Import(TenantServiceImpl.class) +public class TenantServiceTest extends BaseDbUnitTest { @Resource - private SysTenantServiceImpl tenantService; + private TenantServiceImpl tenantService; @Resource private SysTenantMapper tenantMapper; @@ -40,7 +35,7 @@ public class SysTenantServiceTest extends BaseDbUnitTest { @Test public void testCreateTenant_success() { // 准备参数 - SysTenantCreateReqVO reqVO = randomPojo(SysTenantCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); + TenantCreateReqVO reqVO = randomPojo(TenantCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); // 调用 Long tenantId = tenantService.createTenant(reqVO); @@ -57,7 +52,7 @@ public class SysTenantServiceTest extends BaseDbUnitTest { SysTenantDO dbTenant = randomPojo(SysTenantDO.class, o -> o.setStatus(randomCommonStatus())); tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysTenantUpdateReqVO reqVO = randomPojo(SysTenantUpdateReqVO.class, o -> { + TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class, o -> { o.setId(dbTenant.getId()); // 设置更新的 ID o.setStatus(randomCommonStatus()); }); @@ -72,7 +67,7 @@ public class SysTenantServiceTest extends BaseDbUnitTest { @Test public void testUpdateTenant_notExists() { // 准备参数 - SysTenantUpdateReqVO reqVO = randomPojo(SysTenantUpdateReqVO.class); + TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class); // 调用, 并断言异常 assertServiceException(() -> tenantService.updateTenant(reqVO), TENANT_NOT_EXISTS); @@ -124,7 +119,7 @@ public class SysTenantServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setCreateTime(buildTime(2021, 12, 12)))); // 准备参数 - SysTenantPageReqVO reqVO = new SysTenantPageReqVO(); + TenantPageReqVO reqVO = new TenantPageReqVO(); reqVO.setName("芋道"); reqVO.setContactName("艿"); reqVO.setContactMobile("1560"); @@ -162,7 +157,7 @@ public class SysTenantServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setCreateTime(buildTime(2021, 12, 12)))); // 准备参数 - SysTenantExportReqVO reqVO = new SysTenantExportReqVO(); + TenantExportReqVO reqVO = new TenantExportReqVO(); reqVO.setName("芋道"); reqVO.setContactName("艿"); reqVO.setContactMobile("1560"); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java similarity index 91% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImplTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java index fc53a658be..8256f1de5c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/SysUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java @@ -2,15 +2,15 @@ package cn.iocoder.yudao.module.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.controller.user.vo.user.*; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.module.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.yudao.module.system.service.dept.SysDeptService; -import cn.iocoder.yudao.module.system.service.dept.SysPostService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.dept.PostService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; @@ -34,7 +34,7 @@ import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomBytes; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; @@ -45,29 +45,24 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -/** - * {@link SysUserService} 的单元测试类 - * - * @author zxl - */ -@Import(SysUserServiceImpl.class) -public class SysUserServiceImplTest extends BaseDbUnitTest { +@Import(UserServiceImpl.class) +public class UserServiceImplTest extends BaseDbUnitTest { @Resource - private SysUserServiceImpl userService; + private UserServiceImpl userService; @Resource private SysUserMapper userMapper; @MockBean - private SysDeptService deptService; + private DeptService deptService; @MockBean private SysDeptCoreService deptCoreService; @MockBean - private SysPostService postService; + private PostService postService; @MockBean - private SysPermissionService permissionService; + private PermissionService permissionService; @MockBean private PasswordEncoder passwordEncoder; @MockBean @@ -76,7 +71,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { @Test public void testCreatUser_success() { // 准备参数 - SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class, o -> { + UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class, o -> { o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); o.setMobile(randomString()); }); @@ -111,7 +106,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { SysUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 - SysUserUpdateReqVO reqVO = randomPojo(SysUserUpdateReqVO.class, o -> { + UserUpdateReqVO reqVO = randomPojo(UserUpdateReqVO.class, o -> { o.setId(dbUser.getId()); o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); o.setMobile(randomString()); @@ -144,7 +139,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); - SysUserProfileUpdateReqVO reqVO = randomPojo(SysUserProfileUpdateReqVO.class, o -> { + UserProfileUpdateReqVO reqVO = randomPojo(UserProfileUpdateReqVO.class, o -> { o.setMobile(randomString()); o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); }); @@ -163,7 +158,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); - SysUserProfileUpdatePasswordReqVO reqVO = randomPojo(SysUserProfileUpdatePasswordReqVO.class, o -> { + UserProfileUpdatePasswordReqVO reqVO = randomPojo(UserProfileUpdatePasswordReqVO.class, o -> { o.setOldPassword("yudao"); o.setNewPassword("yuanma"); }); @@ -255,7 +250,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { // mock 数据 SysUserDO dbUser = initGetUserPageData(); // 准备参数 - SysUserPageReqVO reqVO = new SysUserPageReqVO(); + UserPageReqVO reqVO = new UserPageReqVO(); reqVO.setUsername("yudao"); reqVO.setMobile("1560"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -279,7 +274,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { // mock 数据 SysUserDO dbUser = initGetUserPageData(); // 准备参数 - SysUserExportReqVO reqVO = new SysUserExportReqVO(); + UserExportReqVO reqVO = new UserExportReqVO(); reqVO.setUsername("yudao"); reqVO.setMobile("1560"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -329,11 +324,11 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_01() { // 准备参数 - SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class); + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class); // mock 方法 // 调用 - SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); // 断言 assertEquals(0, respVO.getCreateUsernames().size()); assertEquals(0, respVO.getUpdateUsernames().size()); @@ -347,7 +342,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_02() { // 准备参数 - SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 }); @@ -361,7 +356,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { when(passwordEncoder.encode(eq("yudaoyuanma"))).thenReturn("java"); // 调用 - SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); // 断言 assertEquals(1, respVO.getCreateUsernames().size()); SysUserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0)); @@ -380,7 +375,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { SysUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 - SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 o.setUsername(dbUser.getUsername()); @@ -393,7 +388,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); // 调用 - SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), false); + UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), false); // 断言 assertEquals(0, respVO.getCreateUsernames().size()); assertEquals(0, respVO.getUpdateUsernames().size()); @@ -410,7 +405,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { SysUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 - SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 o.setUsername(dbUser.getUsername()); @@ -423,7 +418,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); // 调用 - SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); // 断言 assertEquals(0, respVO.getCreateUsernames().size()); assertEquals(1, respVO.getUpdateUsernames().size()); diff --git a/更新日志.md b/更新日志.md index b1f34099e4..13fc8320bf 100644 --- a/更新日志.md +++ b/更新日志.md @@ -19,6 +19,9 @@ ### ⭐ New Features *【优化】操作日志新增用户类型,实现 APP 端的 API 的操作日志的记录 +*【重构】大模块按照多 Maven Module 的方式拆分,提升可维护性,为后续重构 onemall 提供基础 +*【重构】Spring Security 支持读取多种用户类型,从不同的数据库表,从而实现单项目提供管理后台、用户 APP 的不同 RESTful API 接口 + ### 🐞 Bug Fixes From c5e2df943cbd2fe30ecebdd83f82515da96fa26c Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 29 Jan 2022 22:40:50 +0800 Subject: [PATCH 11/47] =?UTF-8?q?Bpm=20=E5=8A=A8=E6=80=81=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E3=80=82=E7=A7=BB=E5=88=B0bpm-core-service=20?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../convert/definition/BpmModelConvert.java | 12 ++--- .../BpmProcessDefinitionConvert.java | 8 ++-- .../bpm/enums/BpmErrorCodeConstants.java | 2 - .../definition/impl/BpmModelServiceImpl.java | 19 ++++---- .../impl/BpmProcessDefinitionServiceImpl.java | 11 +++-- .../yudao-module-bpm-core-service-api/pom.xml | 4 ++ .../bpm/api/form/BpmFormServiceApi.java | 46 +++++++++++++++++++ .../modules/bpm/api/form/dto/BpmFormDTO.java | 39 ++++++++++++++++ .../bpm/api/group/BpmUserGroupServiceApi.java | 1 + .../bpm/api/BpmFormServiceApiImpl.java | 33 +++++++++++++ .../bpm/api/BpmUserGroupServiceApiImpl.java | 1 + .../definition/BpmFormController.java | 0 .../definition/vo/form/BpmFormBaseVO.java | 0 .../vo/form/BpmFormCreateReqVO.java | 0 .../definition/vo/form/BpmFormPageReqVO.java | 0 .../definition/vo/form/BpmFormRespVO.java | 0 .../vo/form/BpmFormSimpleRespVO.java | 0 .../vo/form/BpmFormUpdateReqVO.java | 0 .../convert/definition/BpmFormConvert.java | 5 ++ .../dal/dataobject/definition/BpmFormDO.java | 0 .../dal/mysql/definition/BpmFormMapper.java | 0 .../bpm/enums/BpmErrorCodeConstants.java | 3 ++ .../service/definition/BpmFormService.java | 0 .../definition/dto/BpmFormFieldRespDTO.java | 0 .../definition/impl/BpmFormServiceImpl.java | 10 ++-- .../definition/BpmFormServiceTest.java | 0 .../src/test/resources/sql/clean.sql | 1 + .../src/test/resources/sql/create_tables.sql | 15 ++++++ 28 files changed, 177 insertions(+), 33 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java (86%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java (88%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java (100%) diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java index eb3362ac62..c2b2877207 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import org.activiti.engine.impl.persistence.entity.SuspensionState; @@ -30,19 +30,19 @@ public interface BpmModelConvert { BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class); - default List convertList(List list, Map formMap, + default List convertList(List list, Map formMap, Map deploymentMap, Map processDefinitionMap) { return CollectionUtils.convertList(list, model -> { BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; + BpmFormDTO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null; ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null; return convert(model, form, deployment, processDefinition); }); } - default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, Deployment deployment, ProcessDefinition processDefinition) { + default BpmModelPageItemRespVO convert(Model model, BpmFormDTO form, Deployment deployment, ProcessDefinition processDefinition) { BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO(); modelRespVO.setId(model.getId()); modelRespVO.setCreateTime(model.getCreateTime()); @@ -83,7 +83,7 @@ public interface BpmModelConvert { void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to); - default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDO form) { + default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDTO form) { BpmProcessDefinitionCreateReqDTO createReqDTO = new BpmProcessDefinitionCreateReqDTO(); createReqDTO.setModelId(model.getId()); createReqDTO.setName(model.getName()); diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java index fb11704e67..ed85492f29 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.engine.impl.persistence.entity.SuspensionState; import org.activiti.engine.repository.Deployment; @@ -29,17 +29,17 @@ public interface BpmProcessDefinitionConvert { BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class); default List convertList(List list, Map deploymentMap, - Map processDefinitionDOMap, Map formMap) { + Map processDefinitionDOMap, Map formMap) { return CollectionUtils.convertList(list, definition -> { Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null; BpmProcessDefinitionExtDO definitionDO = processDefinitionDOMap.get(definition.getId()); - BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null; + BpmFormDTO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null; return convert(definition, deployment, definitionDO, form); }); } default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment, - BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDO form) { + BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDTO form) { BpmProcessDefinitionPageItemRespVO respVO = convert(bean); respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); if (deployment != null) { diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java index 771a04f5e7..66fc20b8f9 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java @@ -55,6 +55,4 @@ public interface BpmErrorCodeConstants { // ========== 动态表单模块 1-009-010-000 ========== ErrorCode FORM_NOT_EXISTS = new ErrorCode(1009010000, "动态表单不存在"); - ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1009010000, "表单项({}) 和 ({}) 使用了相同的字段名({})"); - } diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java index 60a3138639..1f5882a4bb 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java @@ -6,14 +6,14 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmFormService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.BpmFormServiceApi; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -39,7 +39,6 @@ import java.util.*; import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** @@ -57,7 +56,7 @@ public class BpmModelServiceImpl implements BpmModelService { @Resource private RepositoryService repositoryService; @Resource - private BpmFormService formService; + private BpmFormServiceApi formServiceApi; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource @@ -85,7 +84,7 @@ public class BpmModelServiceImpl implements BpmModelService { BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); return metaInfo != null ? metaInfo.getFormId() : null; }); - Map formMap = formService.getFormMap(formIds); + Map formMap = formServiceApi.getFormMap(formIds); // 获得 Deployment Map Set deploymentIds = new HashSet<>(); @@ -172,7 +171,7 @@ public class BpmModelServiceImpl implements BpmModelService { } // TODO 芋艿:校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素; // 校验表单已配 - BpmFormDO form = checkFormConfig(model); + BpmFormDTO form = checkFormConfig(model); // 校验任务分配规则已配置 checkTaskAssignRuleAllConfig(id); @@ -225,14 +224,14 @@ public class BpmModelServiceImpl implements BpmModelService { * @param model 流程模型 * @return 流程表单 */ - private BpmFormDO checkFormConfig(Model model) { + private BpmFormDTO checkFormConfig(Model model) { BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); if (metaInfo == null || metaInfo.getFormType() == null) { throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); } // 校验表单存在 if (Objects.equals(metaInfo.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) { - BpmFormDO form = formService.getForm(metaInfo.getFormId()); + BpmFormDTO form = formServiceApi.getForm(metaInfo.getFormId()); if (form == null) { throw exception(FORM_NOT_EXISTS); } diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java index 289cd4d639..9d906d5eb6 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java @@ -8,12 +8,12 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmProcessDefinitionConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmFormService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.BpmFormServiceApi; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.PageUtils; @@ -31,7 +31,8 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static java.util.Collections.emptyList; @@ -54,7 +55,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @Resource private RepositoryService repositoryService; @Resource - private BpmFormService bpmFormService; + private BpmFormServiceApi bpmFormServiceApi; @Resource private BpmProcessDefinitionExtMapper processDefinitionMapper; @@ -85,7 +86,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ // 获得 Form Map Set formIds = convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId); - Map formMap = bpmFormService.getFormMap(formIds); + Map formMap = bpmFormServiceApi.getFormMap(formIds); // 拼接结果 long definitionCount = definitionQuery.count(); diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml index fb5a4f08e8..c488c22966 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml @@ -16,5 +16,9 @@ org.projectlombok lombok + + cn.iocoder.boot + yudao-common + \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java new file mode 100644 index 0000000000..f8f66a7d92 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.coreservice.modules.bpm.api.form; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Bpm 动态表单 Service API 接口 + * + * @author @风里雾里 + */ +public interface BpmFormServiceApi { + /** + * 获得动态表单 + * + * @param id 编号 + * @return 动态表单 + */ + BpmFormDTO getForm(Long id); + + /** + * 获得动态表单列表 + * + * @param ids 编号 + * @return 动态表单列表 + */ + List getFormList(Collection ids); + + /** + * 获得动态表单 Map + * + * @param ids 编号 + * @return 动态表单 Map + */ + default Map getFormMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDTO::getId); + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java new file mode 100644 index 0000000000..0a5c0f94a5 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 工作流的表单定义 DTO + * 用于工作流的申请表单,需要动态配置的场景 + * TODO 暂时拷贝 BpmFormDO 字段, 不知道那些字段是必须的, 后续删掉不需要的字段 + * @author jason + */ +@Data +public class BpmFormDTO { + + /** + * 编号 + */ + private Long id; + /** + * 表单名 + */ + private String name; + /** + * 表单的配置 + */ + private String conf; + /** + * 表单项的数组 + * + * 目前直接将 https://github.com/JakHuang/form-generator 生成的 JSON 串,直接保存 + * 定义:https://github.com/JakHuang/form-generator/issues/46 + */ + private List fields; + /** + * 备注 + */ + private String remark; +} diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java index c83486970d..796dbd4dfd 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java @@ -9,6 +9,7 @@ import java.util.Set; /** * Bpm 用户组 API 接口 * + * @author 芋道源码 * @author jason */ public interface BpmUserGroupServiceApi { diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java new file mode 100644 index 0000000000..104445275d --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.api; + +import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmFormConvert; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.BpmFormServiceApi; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +/** + * 动态表单 Api Service 实现类 + * + * @author 风里雾里 + * @author jason + */ +@Service +public class BpmFormServiceApiImpl implements BpmFormServiceApi { + + @Resource + private BpmFormMapper formMapper; + + @Override + public BpmFormDTO getForm(Long id) { + return BpmFormConvert.INSTANCE.convert1(formMapper.selectById(id)); + } + + @Override + public List getFormList(Collection ids) { + return BpmFormConvert.INSTANCE.convertList(formMapper.selectBatchIds(ids)); + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java index b789ba9e1b..2b9ad5a6da 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java @@ -24,6 +24,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU /** * Bpm 用户组 API 接口 实现类 * + * @author 芋道源码 * @author jason */ @Service diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java index 10e77f1e82..7dc2dfabf7 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.Bp import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormSimpleRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -27,6 +28,10 @@ public interface BpmFormConvert { BpmFormRespVO convert(BpmFormDO bean); + BpmFormDTO convert1(BpmFormDO bean); + + List convertList(List list); + List convertList2(List list); PageResult convertPage(PageResult page); diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java index 5fd230cefd..531f7fac4c 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java @@ -7,4 +7,7 @@ public interface BpmErrorCodeConstants { ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1009011000, "用户组不存在"); ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1009011001, "名字为【{}】的用户组已被禁用"); + // ========== 动态表单模块 1-009-010-000 ========== + ErrorCode FORM_NOT_EXISTS = new ErrorCode(1009010000, "动态表单不存在"); + ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1009010000, "表单项({}) 和 ({}) 使用了相同的字段名({})"); } diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java index e7ba8dfa98..8bebc39ca9 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java @@ -7,8 +7,10 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.Bp import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmFormConvert; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper; +import cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmFormService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmFormFieldRespDTO; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import org.springframework.stereotype.Service; @@ -20,10 +22,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_FIELD_REPEAT; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - /** * 动态表单 Service 实现类 * @@ -66,7 +64,7 @@ public class BpmFormServiceImpl implements BpmFormService { private void validateFormExists(Long id) { if (formMapper.selectById(id) == null) { - throw exception(FORM_NOT_EXISTS); + throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.FORM_NOT_EXISTS); } } @@ -106,7 +104,7 @@ public class BpmFormServiceImpl implements BpmFormService { continue; } // 如果存在,则报错 - throw exception(FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel()); + throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel()); } } diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java rename to yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql index 45b43e0e8f..43c1cc535b 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql @@ -1,2 +1,3 @@ -- bpm 开头的 DB +DELETE FROM "bpm_form"; DELETE FROM "bpm_user_group"; diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql index da5b9a6130..92d2500645 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql +++ b/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql @@ -12,3 +12,18 @@ CREATE TABLE IF NOT EXISTS "bpm_user_group" ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY ("id") ) COMMENT '用户组'; + +CREATE TABLE IF NOT EXISTS "bpm_form" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "status" tinyint NOT NULL, + "fields" varchar(255) NOT NULL, + "conf" varchar(255) NOT NULL, + "remark" varchar(255), + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '动态表单'; From 933bb7c6a643fd1c1065ba5ef6c3262c5c9af6c8 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 29 Jan 2022 23:15:57 +0800 Subject: [PATCH 12/47] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E7=BC=96=E8=AF=91=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/activiti/config/BpmActivitiConfiguration.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index 8e30c22db6..2e1da6f4ab 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -10,17 +10,11 @@ import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; import org.activiti.api.runtime.shared.identity.UserGroupManager; -import org.activiti.core.common.spring.identity.ActivitiUserGroupManagerImpl; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.userdetails.UserDetailsService; import java.util.Collections; import java.util.List; From ab6ec2f0edaf13c1338ec3235b26ad4516db8508 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 30 Jan 2022 00:49:31 +0800 Subject: [PATCH 13/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=204=EF=BC=9Asystem=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=EF=BC=8C=E5=8E=BB=E9=99=A4=20Sys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/vo/InfConfigExcelVO.java | 6 +- .../apiaccesslog/InfApiAccessLogExcelVO.java | 4 +- .../vo/apierrorlog/InfApiErrorLogExcelVO.java | 4 +- .../order/vo/order/PayOrderExcelVO.java | 8 +- .../order/vo/refund/vo/PayRefundExcelVO.java | 8 +- .../test/vo/ToolTestDemoExcelVO.java | 6 +- .../redis/core/stream/RedisStreamTest.java | 2 +- .../sms/SysSmsServiceIntegrationTest.java | 2 +- .../infra/enums/SysErrorCodeConstants.java | 16 ++ .../modules/infra/enums/package-info.java | 4 - .../file/impl/InfFileCoreServiceImpl.java | 2 +- .../logger/SysLoginLogCoreConvert.java | 15 -- .../modules/system/convert/package-info.java | 6 - ...g Boot 对象转换 MapStruct 入门》.md | 1 - .../system/dal/dataobject/package-info.java | 1 - .../dal/mysql/dict/SysDictDataCoreMapper.java | 19 --- .../system/dal/mysql/package-info.java | 1 - .../dal/mysql/sms/SysSmsLogCoreMapper.java | 13 -- .../mysql/sms/SysSmsTemplateCoreMapper.java | 16 -- .../dal/mysql/user/SysUserCoreMapper.java | 17 -- .../dal/redis/SysRedisKeyCoreConstants.java | 29 ---- .../system/mq/message/package-info.java | 4 - .../system/mq/producer/package-info.java | 4 - .../mq/producer/sms/SysSmsCoreProducer.java | 41 ----- .../modules/system/package-info.java | 7 - .../auth/SysUserSessionCoreService.java | 52 ------ .../impl/SysUserSessionCoreServiceImpl.java | 93 ----------- .../service/dict/SysDictDataCoreService.java | 29 ---- .../dict/impl/SysDictDataCoreServiceImpl.java | 145 ----------------- .../logger/SysLoginLogCoreService.java | 17 -- .../impl/SysLoginLogCoreServiceImpl.java | 30 ---- .../service/sms/SysSmsLogCoreService.java | 56 ------- .../sms/SysSmsTemplateCoreService.java | 36 ----- .../sms/impl/SysSmsLogCoreServiceImpl.java | 72 --------- .../impl/SysSmsTemplateCoreServiceImpl.java | 105 ------------ .../service/user/SysUserCoreService.java | 70 -------- .../user/impl/SysUserCoreServiceImpl.java | 82 ---------- .../service/file/InfFileCoreServiceTest.java | 3 +- .../auth/SysUserSessionCoreServiceTest.java | 125 --------------- .../dict/SysDictDataCoreServiceTest.java | 78 --------- .../logger/SysLoginLogServiceImplTest.java | 47 ------ .../modules/system/service/package-info.java | 1 - .../service/sms/SysSmsLogCoreServiceTest.java | 149 ------------------ .../sms/SysSmsTemplateServiceTest.java | 71 --------- .../convert/message/BpmMessageConvert.java | 2 +- .../task/BpmProcessInstanceConvert.java | 4 +- .../bpm/convert/task/BpmTaskConvert.java | 4 +- .../dal/dataobject/leave/BpmOALeaveDO.java | 2 +- .../bpm/enums/message/BpmMessageEnum.java | 2 +- .../config/BpmActivitiConfiguration.java | 6 +- .../behavior/BpmActivityBehaviorFactory.java | 6 +- .../behavior/BpmUserTaskActivitiBehavior.java | 10 +- .../BpmTaskAssignLeaderAbstractScript.java | 9 +- .../impl/BpmTaskAssignRuleServiceImpl.java | 14 +- .../message/impl/BpmMessageServiceImpl.java | 2 +- .../impl/BpmProcessInstanceServiceImpl.java | 8 +- .../service/task/impl/BpmTaskServiceImpl.java | 8 +- .../BpmUserTaskActivitiBehaviorTest.java | 10 +- .../impl/BpmTaskAssignLeaderX2ScriptTest.java | 8 +- .../yudao-module-member-impl/pom.xml | 6 + .../app/auth/AppAuthController.java | 3 - .../app/auth/vo/AppAuthSocialBindReqVO.java | 1 - .../app/auth/vo/AppAuthSocialLogin2ReqVO.java | 4 +- .../app/auth/vo/AppAuthSocialLoginReqVO.java | 4 +- .../app/auth/vo/AppAuthSocialUnbindReqVO.java | 4 +- .../member/service/auth/AuthServiceImpl.java | 15 +- .../service/sms/SysSmsCodeServiceImpl.java | 2 +- .../service/auth/SysAuthServiceTest.java | 6 +- .../system/enums/ErrorCodeConstants.java | 0 .../system/enums/SysErrorCodeConstants.java | 10 +- .../system/enums/social/SocialTypeEnum.java | 8 +- .../controller/admin/auth/AuthController.java | 17 +- .../admin/auth/UserSessionController.java | 25 ++- .../auth/vo/auth/AuthSocialBindReqVO.java | 4 +- .../auth/vo/auth/AuthSocialLogin2ReqVO.java | 4 +- .../auth/vo/auth/AuthSocialLoginReqVO.java | 4 +- .../auth/vo/auth/AuthSocialUnbindReqVO.java | 4 +- .../controller/admin/dept/DeptController.java | 4 +- .../controller/admin/dept/PostController.java | 2 +- .../admin/dept/vo/post/PostExcelVO.java | 4 +- .../admin/dict/DictDataController.java | 2 +- .../admin/dict/vo/data/DictDataExcelVO.java | 4 +- .../admin/dict/vo/type/DictTypeExcelVO.java | 4 +- .../admin/logger/LoginLogController.java | 2 +- .../admin/logger/OperateLogController.java | 14 +- .../logger/vo/loginlog/LoginLogExcelVO.java | 6 +- .../vo/operatelog/OperateLogExcelVO.java | 4 +- .../admin/permission/RoleController.java | 2 +- .../admin/permission/vo/role/RoleExcelVO.java | 4 +- .../admin/sms/SmsCallbackController.java | 4 +- .../admin/sms/SmsChannelController.java | 2 +- .../admin/sms/SmsLogController.java | 2 +- .../admin/sms/SmsTemplateController.java | 6 +- .../admin/sms/vo/log/SmsLogExcelVO.java | 10 +- .../sms/vo/template/SmsTemplateExcelVO.java | 8 +- .../admin/tenant/TenantController.java | 2 +- .../controller/admin/user/UserController.java | 30 ++-- .../admin/user/UserProfileController.java | 25 ++- .../admin/user/vo/user/UserExcelVO.java | 6 +- .../admin/user/vo/user/UserImportExcelVO.java | 6 +- .../system/convert/auth/AuthConvert.java | 10 +- .../convert/auth/UserSessionConvert.java | 2 +- .../system/convert/dept/DeptConvert.java | 2 +- .../system/convert/dept/PostConvert.java | 2 +- .../system/convert/dict/DictDataConvert.java | 2 +- .../convert/dict/SysDictDataCoreConvert.java | 4 +- .../convert/logger/LoginLogConvert.java | 2 +- .../convert/logger/OperateLogConvert.java | 4 +- .../logger/SysLoginLogCoreConvert.java | 15 ++ .../convert/permission/RoleConvert.java | 2 +- .../system/convert/sms/SmsChannelConvert.java | 2 +- .../system/convert/sms/SmsLogConvert.java | 2 +- .../convert/sms/SmsTemplateConvert.java | 2 +- .../system/convert/tenant/TenantConvert.java | 2 +- .../system/convert/user/UserConvert.java | 28 ++-- .../dal/dataobject/auth/SysUserSessionDO.java | 2 +- .../system/dal/dataobject/dept/SysDeptDO.java | 6 +- .../system/dal/dataobject/dept/SysPostDO.java | 2 +- .../dal/dataobject/dict/SysDictDataDO.java | 2 +- .../dal/dataobject/logger/OperateLogDO.java | 4 +- .../dal/dataobject/logger/SysLoginLogDO.java | 6 +- .../system/dal/dataobject/package-info.java | 1 + .../dal/dataobject/permission/SysRoleDO.java | 2 +- .../dataobject/permission/SysUserRoleDO.java | 2 +- .../dal/dataobject/sms/SysSmsChannelDO.java | 2 +- .../dal/dataobject/sms/SysSmsLogDO.java | 6 +- .../dal/dataobject/sms/SysSmsTemplateDO.java | 4 +- .../dataobject/social/SysSocialUserDO.java | 6 +- .../dal/dataobject/tenant/SysTenantDO.java | 2 +- .../system/dal/dataobject/user/UserDO.java | 6 +- .../mysql/auth/SysUserSessionCoreMapper.java | 4 +- .../dal/mysql/auth/SysUserSessionMapper.java | 2 +- .../dal/mysql/dept/SysDeptCoreMapper.java | 4 +- .../system/dal/mysql/dept/SysDeptMapper.java | 2 +- .../dal/mysql/dept/SysPostCoreMapper.java | 4 +- .../system/dal/mysql/dept/SysPostMapper.java | 2 +- .../dal/mysql/dict/SysDictDataMapper.java | 3 +- .../dal/mysql/logger/LoginLogMapper.java | 2 +- .../mysql/logger/SysLoginLogCoreMapper.java | 4 +- .../module/system/dal/mysql/package-info.java | 1 + .../mysql/permission/SysRoleCoreMapper.java | 4 +- .../dal/mysql/permission/SysRoleMapper.java | 2 +- .../permission/SysUserRoleCoreMapper.java | 4 +- .../mysql/permission/SysUserRoleMapper.java | 2 +- .../dal/mysql/sms/SysSmsChannelMapper.java | 2 +- .../system/dal/mysql/sms/SysSmsLogMapper.java | 2 +- .../dal/mysql/sms/SysSmsTemplateMapper.java | 12 +- .../dal/mysql/social/SysSocialUserMapper.java | 6 +- .../dal/mysql/tenant/SysTenantCoreMapper.java | 4 +- .../dal/mysql/tenant/SysTenantMapper.java | 2 +- .../system/dal/mysql/user/SysUserMapper.java | 77 --------- .../system/dal/mysql/user/UserMapper.java | 68 ++++++++ .../dal/redis/SysRedisKeyConstants.java | 16 ++ .../dal/redis/SysRedisKeyCoreConstants.java | 18 +++ .../dal/redis/auth/LoginUserRedisDAO.java | 6 +- .../redis/social/SocialAuthUserRedisDAO.java | 7 +- .../system/enums/DictTypeConstants.java | 4 +- .../system/enums/common/SysSexEnum.java | 2 +- .../enums/logger/SysLoginLogTypeEnum.java | 2 +- .../enums/logger/SysLoginResultEnum.java | 2 +- .../enums/sms/SysSmsReceiveStatusEnum.java | 2 +- .../enums/sms/SysSmsSendStatusEnum.java | 2 +- .../enums/sms/SysSmsTemplateTypeEnum.java | 2 +- .../config/DataPermissionConfiguration.java | 6 +- .../dict/DictDataRefreshConsumer.java | 6 +- .../mq/consumer/sms/SmsSendConsumer.java | 12 +- .../sms/SmsTemplateRefreshConsumer.java | 6 +- .../system/mq/message/sms/SmsSendMessage.java | 4 +- .../system/mq/producer/package-info.java | 4 + .../system/mq/producer/sms/SmsProducer.java | 19 +++ .../system/service/auth/AuthServiceImpl.java | 95 +++++------ .../service/auth/UserSessionService.java | 43 ++++- .../service/auth/UserSessionServiceImpl.java | 92 +++++++++-- .../system/service/dept/DeptService.java | 2 +- .../system/service/dept/DeptServiceImpl.java | 2 +- .../system/service/dept/PostService.java | 2 +- .../system/service/dept/PostServiceImpl.java | 2 +- .../service/dept/SysDeptCoreService.java | 4 +- .../service/dept/SysPostCoreService.java | 2 +- .../dept/impl/SysDeptCoreServiceImpl.java | 13 +- .../dept/impl/SysPostCoreServiceImpl.java | 12 +- .../system/service/dict/DictDataService.java | 21 ++- .../service/dict/DictDataServiceImpl.java | 121 ++++++++++++-- .../service/dict/DictTypeServiceImpl.java | 6 +- .../service/logger/LoginLogService.java | 10 +- .../service/logger/LoginLogServiceImpl.java | 12 +- .../service/logger/OperateLogServiceImpl.java | 6 +- .../logger/dto/LoginLogCreateReqDTO.java | 4 +- .../permission/PermissionServiceImpl.java | 6 +- .../service/permission/RoleService.java | 2 +- .../service/permission/RoleServiceImpl.java | 2 +- .../permission/SysPermissionCoreService.java | 2 +- .../permission/SysRoleCoreService.java | 2 +- .../impl/SysPermissionCoreServiceImpl.java | 8 +- .../impl/SysRoleCoreServiceImpl.java | 12 +- .../system/service/sms/SmsChannelService.java | 2 +- .../service/sms/SmsChannelServiceImpl.java | 2 +- .../system/service/sms/SmsLogService.java | 45 +++++- .../system/service/sms/SmsLogServiceImpl.java | 54 ++++++- .../service/sms/SmsTemplateService.java | 25 ++- .../service/sms/SmsTemplateServiceImpl.java | 86 +++++++++- .../system/service/sms/SysSmsSendService.java | 13 +- .../service/sms/SysSmsSendServiceImpl.java | 50 +++--- .../service/social/SocialUserService.java | 20 +-- .../service/social/SocialUserServiceImpl.java | 31 ++-- .../service/tenant/SysTenantCoreService.java | 2 +- .../system/service/tenant/TenantService.java | 2 +- .../service/tenant/TenantServiceImpl.java | 2 +- .../tenant/impl/SysTenantCoreServiceImpl.java | 8 +- .../system/service/user/UserService.java | 72 +++++++-- .../system/service/user/UserServiceImpl.java | 121 +++++++++----- .../service/auth/AuthServiceImplTest.java | 42 +++-- .../auth/UserSessionServiceImplTest.java | 116 ++++++++++++-- .../system/service/dept/DeptServiceTest.java | 2 +- .../system/service/dept/PostServiceTest.java | 2 +- .../service/dict/DictDataServiceTest.java | 36 ++++- .../logger/LoginLogServiceImplTest.java | 30 +++- .../logger/OperateLogServiceImplTest.java | 8 +- .../permission/PermissionServiceTest.java | 6 +- .../service/permission/RoleServiceTest.java | 2 +- .../service/sms/SmsChannelServiceTest.java | 2 +- .../system/service/sms/SmsLogServiceTest.java | 103 +++++++++++- .../service/sms/SmsTemplateServiceTest.java | 31 +++- .../service/sms/SysSmsSendServiceTest.java | 62 ++++---- .../service/social/SocialUsererviceTest.java | 36 ++--- .../service/tenant/TenantServiceTest.java | 2 +- .../service/user/UserServiceImplTest.java | 70 ++++---- 227 files changed, 1649 insertions(+), 2252 deletions(-) create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/SysErrorCodeConstants.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/logger/SysLoginLogCoreConvert.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dict/SysDictDataCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsLogCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsTemplateCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/sms/SysSmsCoreProducer.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/impl/SysUserSessionCoreServiceImpl.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/impl/SysLoginLogCoreServiceImpl.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsLogCoreServiceImpl.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsTemplateCoreServiceImpl.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreServiceTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreServiceTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogServiceImplTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/package-info.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreServiceTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateServiceTest.java rename yudao-module-system/{yudao-module-system-impl => yudao-module-system-api}/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java (100%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module}/system/enums/SysErrorCodeConstants.java (76%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java => yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/social/SocialTypeEnum.java (89%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/convert/dict/SysDictDataCoreConvert.java (74%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/auth/SysUserSessionDO.java (95%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/dept/SysDeptDO.java (84%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/dept/SysPostDO.java (92%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/dict/SysDictDataDO.java (93%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/logger/SysLoginLogDO.java (83%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/package-info.java rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/permission/SysRoleDO.java (95%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/permission/SysUserRoleDO.java (88%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/sms/SysSmsChannelDO.java (94%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/sms/SysSmsLogDO.java (94%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/sms/SysSmsTemplateDO.java (92%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/social/SysSocialUserDO.java (90%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/dataobject/tenant/SysTenantDO.java (91%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/user/SysUserDO.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/UserDO.java (90%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/auth/SysUserSessionCoreMapper.java (56%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/dept/SysDeptCoreMapper.java (56%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/dept/SysPostCoreMapper.java (56%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/logger/SysLoginLogCoreMapper.java (55%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/package-info.java rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/permission/SysRoleCoreMapper.java (54%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/permission/SysUserRoleCoreMapper.java (70%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserCoreMapper.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SysSocialUserMapper.java (80%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/dal/mysql/tenant/SysTenantCoreMapper.java (55%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/UserMapper.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyCoreConstants.java rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/auth/SysLoginUserCoreRedisDAO.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java (85%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/social/SocialAuthUserRedisDAO.java (83%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysDictTypeConstants.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java (94%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/common/SysSexEnum.java (83%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/logger/SysLoginLogTypeEnum.java (89%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/logger/SysLoginResultEnum.java (88%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/sms/SysSmsReceiveStatusEnum.java (84%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/sms/SysSmsSendStatusEnum.java (85%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/enums/sms/SysSmsTemplateTypeEnum.java (84%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/sms/SysSmsSendMessage.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsSendMessage.java (88%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/package-info.java rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/dept/SysDeptCoreService.java (90%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/dept/SysPostCoreService.java (84%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/dept/impl/SysDeptCoreServiceImpl.java (74%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/dept/impl/SysPostCoreServiceImpl.java (71%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/dto/SysLoginLogCreateReqDTO.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/dto/LoginLogCreateReqDTO.java (91%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/permission/SysPermissionCoreService.java (86%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/permission/SysRoleCoreService.java (83%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/permission/impl/SysPermissionCoreServiceImpl.java (64%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/permission/impl/SysRoleCoreServiceImpl.java (70%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreService.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendService.java (79%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceImpl.java (76%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialCoreService.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java (76%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialCoreServiceImpl.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java (84%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/tenant/SysTenantCoreService.java (75%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module}/system/service/tenant/impl/SysTenantCoreServiceImpl.java (63%) rename yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreServiceTest.java => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java (70%) rename yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialCoreServiceTest.java => yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUsererviceTest.java (80%) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java index 28c10b2dce..63b8087446 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -30,11 +30,11 @@ public class InfConfigExcelVO { private String value; @ExcelProperty(value = "参数类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.CONFIG_TYPE) + @DictFormat(DictTypeConstants.CONFIG_TYPE) private Integer type; @ExcelProperty(value = "是否敏感", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.BOOLEAN_STRING) + @DictFormat(DictTypeConstants.BOOLEAN_STRING) private Boolean sensitive; @ExcelProperty("备注") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java index d48dc44b0c..c69969b4b0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiacces import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -26,7 +26,7 @@ public class InfApiAccessLogExcelVO { private Long userId; @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_TYPE) + @DictFormat(DictTypeConstants.USER_TYPE) private Integer userType; @ExcelProperty("应用名") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java index c33e73dced..dfae3311ac 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierror import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -27,7 +27,7 @@ public class InfApiErrorLogExcelVO { private Integer userId; @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_TYPE) + @DictFormat(DictTypeConstants.USER_TYPE) private Integer userType; @ExcelProperty("应用名") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java index 28e5e7c613..f6836bc8c1 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import com.alibaba.excel.annotation.ExcelProperty; @@ -46,11 +46,11 @@ public class PayOrderExcelVO { @ExcelProperty("渠道手续费,单位:百分比") private String channelFeeRate; - @DictFormat(SysDictTypeConstants.PAY_ORDER_STATUS) + @DictFormat(DictTypeConstants.PAY_ORDER_STATUS) @ExcelProperty(value = "支付状态", converter = DictConvert.class) private Integer status; - @DictFormat(SysDictTypeConstants.PAY_ORDER_NOTIFY_STATUS) + @DictFormat(DictTypeConstants.PAY_ORDER_NOTIFY_STATUS) @ExcelProperty(value = "通知商户支付结果的回调状态", converter = DictConvert.class) private Integer notifyStatus; @@ -75,7 +75,7 @@ public class PayOrderExcelVO { @ExcelProperty("用户 IP") private String userIp; - @DictFormat(SysDictTypeConstants.PAY_ORDER_REFUND_STATUS) + @DictFormat(DictTypeConstants.PAY_ORDER_REFUND_STATUS) @ExcelProperty(value = "退款状态", converter = DictConvert.class) private Integer refundStatus; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java index b0b2c18e17..793493eaa9 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import com.alibaba.excel.annotation.ExcelProperty; @@ -43,15 +43,15 @@ public class PayRefundExcelVO { @ExcelProperty("异步通知商户地址") private String notifyUrl; - @DictFormat(SysDictTypeConstants.PAY_ORDER_NOTIFY_STATUS) + @DictFormat(DictTypeConstants.PAY_ORDER_NOTIFY_STATUS) @ExcelProperty(value = "商户退款结果回调状态", converter = DictConvert.class) private Integer notifyStatus; - @DictFormat(SysDictTypeConstants.PAY_REFUND_ORDER_STATUS) + @DictFormat(DictTypeConstants.PAY_REFUND_ORDER_STATUS) @ExcelProperty(value = "退款状态", converter = DictConvert.class) private Integer status; - @DictFormat(SysDictTypeConstants.PAY_REFUND_ORDER_TYPE) + @DictFormat(DictTypeConstants.PAY_REFUND_ORDER_TYPE) @ExcelProperty(value = "退款类型", converter = DictConvert.class) private Integer type; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java index 87e827440c..e7a98b6f19 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -24,11 +24,11 @@ public class ToolTestDemoExcelVO { private String name; @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) + @DictFormat(DictTypeConstants.COMMON_STATUS) private Integer status; @ExcelProperty(value = "类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.OPERATE_TYPE) + @DictFormat(DictTypeConstants.OPERATE_TYPE) private Integer type; @ExcelProperty(value = "分类", converter = DictConvert.class) diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java index 3f1bb7fb90..a99c65e47b 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.adminserver.BaseRedisIntegrationTest; import cn.iocoder.yudao.module.system.mq.consumer.mail.SysMailSendConsumer; import cn.iocoder.yudao.module.system.mq.consumer.sms.SysSmsSendConsumer; import cn.iocoder.yudao.module.system.mq.message.mail.SysMailSendMessage; -import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SysSmsSendMessage; import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java index a6b4c47a28..ad63132b9a 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.system.service.sms.impl.SysSmsChannelServiceImpl; import cn.iocoder.yudao.module.system.service.sms.impl.SysSmsLogServiceImpl; import cn.iocoder.yudao.module.system.service.sms.impl.SysSmsTemplateServiceImpl; import cn.iocoder.yudao.module.system.service.user.SysUserService; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsCoreServiceImpl; +import cn.iocoder.yudao.module.system.service.sms.impl.SysSmsCoreServiceImpl; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.sms.config.YudaoSmsAutoConfiguration; import org.junit.jupiter.api.Test; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/SysErrorCodeConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/SysErrorCodeConstants.java new file mode 100644 index 0000000000..4cafc58e40 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/SysErrorCodeConstants.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.coreservice.modules.infra.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +/** + * System 错误码枚举类 + * + * system 系统,使用 1-006-000-000 段 + */ +public interface SysErrorCodeConstants { + + // ========= 文件相关 1006001000================= + ErrorCode FILE_PATH_EXISTS = new ErrorCode(1006001000, "文件路径已存在"); + ErrorCode FILE_NOT_EXISTS = new ErrorCode(1006001002, "文件不存在"); + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/package-info.java deleted file mode 100644 index 6231dae910..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位类,可以无视 - */ -package cn.iocoder.yudao.coreservice.modules.infra.enums; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java index 3e2c7ead44..f586853463 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.ByteArrayInputStream; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.coreservice.modules.infra.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/logger/SysLoginLogCoreConvert.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/logger/SysLoginLogCoreConvert.java deleted file mode 100644 index 9c19927385..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/logger/SysLoginLogCoreConvert.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.convert.logger; - -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SysLoginLogCoreConvert { - - SysLoginLogCoreConvert INSTANCE = Mappers.getMapper(SysLoginLogCoreConvert.class); - - SysLoginLogDO convert(SysLoginLogCreateReqDTO bean); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/package-info.java deleted file mode 100644 index 87914750ae..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package cn.iocoder.yudao.coreservice.modules.system.convert; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 8153487b72..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/package-info.java deleted file mode 100644 index f2ed88035c..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dict/SysDictDataCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dict/SysDictDataCoreMapper.java deleted file mode 100644 index bda1a9142c..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dict/SysDictDataCoreMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dict; - - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Date; - -@Mapper -public interface SysDictDataCoreMapper extends BaseMapperX { - - default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new QueryWrapper().select("id") - .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/package-info.java deleted file mode 100644 index 144a054070..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsLogCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsLogCoreMapper.java deleted file mode 100644 index d09554575e..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsLogCoreMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms; - -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface SysSmsLogCoreMapper extends BaseMapperX { -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsTemplateCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsTemplateCoreMapper.java deleted file mode 100644 index 4e064b40db..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsTemplateCoreMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms; - -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.util.Date; - -@Mapper -public interface SysSmsTemplateCoreMapper extends BaseMapperX { - - @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1") - Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java deleted file mode 100644 index e4afd992a8..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.user; - -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysUserCoreMapper extends BaseMapperX { - - default List selectListByDeptIds(Collection deptIds) { - return selectList(SysUserDO::getDeptId, deptIds); - } -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java deleted file mode 100644 index 5db3e9fd48..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.redis; - -import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import me.zhyd.oauth.model.AuthUser; - -import java.time.Duration; - -import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; - -/** - * System Redis Key 枚举类 - * - * @author 芋道源码 - */ -public interface SysRedisKeyCoreConstants { - - RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登录用户的缓存", - "login_user:%s", // 参数为 sessionId - STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); - - RedisKeyDefine SOCIAL_AUTH_USER = new RedisKeyDefine("社交登陆的授权用户", - "social_auth_user:%d:%s", // 参数为 type,code - STRING, AuthUser.class, Duration.ofDays(1)); - - RedisKeyDefine SOCIAL_AUTH_STATE = new RedisKeyDefine("社交登陆的 state", - "social_auth_state:%s", // 参数为 state - STRING, String.class, Duration.ofHours(24)); // 值为 state -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/package-info.java deleted file mode 100644 index 2e18f1adf6..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package cn.iocoder.yudao.coreservice.modules.system.mq.message; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/package-info.java deleted file mode 100644 index 2fe4aa305d..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package cn.iocoder.yudao.coreservice.modules.system.mq.producer; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/sms/SysSmsCoreProducer.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/sms/SysSmsCoreProducer.java deleted file mode 100644 index 9ecf647062..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/sms/SysSmsCoreProducer.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms; - -import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; -import cn.iocoder.yudao.framework.common.core.KeyValue; -import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -/** - * Sms 短信相关消息的 Core Producer - * - * @author zzf - * @date 2021/3/9 16:35 - */ -@Slf4j -@Component -public class SysSmsCoreProducer { - - @Resource - private RedisMQTemplate redisMQTemplate; - - /** - * 发送 {@link SysSmsSendMessage} 消息 - * - * @param logId 短信日志编号 - * @param mobile 手机号 - * @param channelId 渠道编号 - * @param apiTemplateId 短信模板编号 - * @param templateParams 短信模板参数 - */ - public void sendSmsSendMessage(Long logId, String mobile, - Long channelId, String apiTemplateId, List> templateParams) { - SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile); - message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams); - redisMQTemplate.send(message); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/package-info.java deleted file mode 100644 index 3b87779357..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * system 包下,我们放通用业务,支撑上层的核心业务。 - * 例如说:用户、部门、权限、数据字典等等 - * - * 缩写:sys - */ -package cn.iocoder.yudao.coreservice.modules.system; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreService.java deleted file mode 100644 index 5106af7a32..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreService.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.auth; - -import cn.iocoder.yudao.framework.security.core.LoginUser; - -/** - * 在线用户 Session Core Service 接口 - * - * @author 芋道源码 - */ -public interface SysUserSessionCoreService { - - /** - * 创建在线用户 Session - * - * @param loginUser 登录用户 - * @param userIp 用户 IP - * @param userAgent 用户 UA - * @return Session 编号 - */ - String createUserSession(LoginUser loginUser, String userIp, String userAgent); - - /** - * 刷新在线用户 Session 的更新时间 - * - * @param sessionId Session 编号 - * @param loginUser 登录用户 - */ - void refreshUserSession(String sessionId, LoginUser loginUser); - - /** - * 删除在线用户 Session - * - * @param sessionId Session 编号 - */ - void deleteUserSession(String sessionId); - - /** - * 获得 Session 编号对应的在线用户 - * - * @param sessionId Session 编号 - * @return 在线用户 - */ - LoginUser getLoginUser(String sessionId); - - /** - * 获得 Session 超时时间,单位:毫秒 - * - * @return 超时时间 - */ - Long getSessionTimeoutMillis(); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/impl/SysUserSessionCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/impl/SysUserSessionCoreServiceImpl.java deleted file mode 100644 index f26c6afc39..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/impl/SysUserSessionCoreServiceImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.auth.impl; - -import cn.hutool.core.util.IdUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.auth.SysUserSessionCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; -import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; -import cn.iocoder.yudao.framework.security.config.SecurityProperties; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.time.Duration; -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; - -/** - * 在线用户 Session Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysUserSessionCoreServiceImpl implements SysUserSessionCoreService { - - @Resource - private SysUserSessionCoreMapper userSessionCoreMapper; - - @Resource - private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO; - - @Resource - private SecurityProperties securityProperties; - - @Override - public String createUserSession(LoginUser loginUser, String userIp, String userAgent) { - // 生成 Session 编号 - String sessionId = generateSessionId(); - // 写入 Redis 缓存 - loginUser.setUpdateTime(new Date()); - loginUserCoreRedisDAO.set(sessionId, loginUser); - // 写入 DB 中 - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) - .userId(loginUser.getId()).userType(loginUser.getUserType()) - .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) - .sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))) - .build(); - userSessionCoreMapper.insert(userSession); - // 返回 Session 编号 - return sessionId; - } - - @Override - public void refreshUserSession(String sessionId, LoginUser loginUser) { - // 写入 Redis 缓存 - loginUser.setUpdateTime(new Date()); - loginUserCoreRedisDAO.set(sessionId, loginUser); - // 更新 DB 中 - SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build(); - updateObj.setUsername(loginUser.getUsername()); - updateObj.setUpdateTime(new Date()); - updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))); - userSessionCoreMapper.updateById(updateObj); - } - - @Override - public void deleteUserSession(String sessionId) { - // 删除 Redis 缓存 - loginUserCoreRedisDAO.delete(sessionId); - // 删除 DB 记录 - userSessionCoreMapper.deleteById(sessionId); - } - - @Override - public LoginUser getLoginUser(String sessionId) { - return loginUserCoreRedisDAO.get(sessionId); - } - - @Override - public Long getSessionTimeoutMillis() { - return securityProperties.getSessionTimeout().toMillis(); - } - - /** - * 生成 Session 编号,目前采用 UUID 算法 - * - * @return Session 编号 - */ - private static String generateSessionId() { - return IdUtil.fastSimpleUUID(); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java deleted file mode 100644 index bcac11c59e..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.dict; - -import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; - -import java.util.Collection; - -/** - * 字典数据 Service 接口 - * - * @author 芋道源码 - */ -public interface SysDictDataCoreService extends DictDataFrameworkService { - - /** - * 初始化字典数据的本地缓存 - */ - void initLocalCache(); - - /** - * 校验字典数据们是否有效。如下情况,视为无效: - * 1. 字典数据不存在 - * 2. 字典数据被禁用 - * - * @param dictType 字典类型 - * @param values 字典数据值的数组 - */ - void validDictDatas(String dictType, Collection values); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java deleted file mode 100644 index 328cac56b7..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java +++ /dev/null @@ -1,145 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.dict.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.convert.dict.SysDictDataCoreConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dict.SysDictDataCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableTable; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.DICT_DATA_NOT_ENABLE; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.DICT_DATA_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 字典数据 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class SysDictDataCoreServiceImpl implements SysDictDataCoreService { - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 字典数据缓存,第二个 key 使用 label - * - * key1:字典类型 dictType - * key2:字典标签 label - */ - private ImmutableTable labelDictDataCache; - /** - * 字典数据缓存,第二个 key 使用 value - * - * key1:字典类型 dictType - * key2:字典值 value - */ - private ImmutableTable valueDictDataCache; - /** - * 缓存字典数据的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SysDictDataCoreMapper dictDataCoreMapper; - - @Override - @PostConstruct - public synchronized void initLocalCache() { - // 获取字典数据列表,如果有更新 - List dataList = this.loadDictDataIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(dataList)) { - return; - } - - // 构建缓存 - ImmutableTable.Builder labelDictDataBuilder = ImmutableTable.builder(); - ImmutableTable.Builder valueDictDataBuilder = ImmutableTable.builder(); - dataList.forEach(dictData -> { - labelDictDataBuilder.put(dictData.getDictType(), dictData.getLabel(), dictData); - valueDictDataBuilder.put(dictData.getDictType(), dictData.getValue(), dictData); - }); - labelDictDataCache = labelDictDataBuilder.build(); - valueDictDataCache = valueDictDataBuilder.build(); - assert dataList.size() > 0; // 断言,避免告警 - maxUpdateTime = dataList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initLocalCache][缓存字典数据,数量为:{}]", dataList.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initLocalCache(); - } - - /** - * 如果字典数据发生变化,从数据库中获取最新的全量字典数据。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前字典数据的最大更新时间 - * @return 字典数据列表 - */ - private List loadDictDataIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadDictDataIfUpdate][首次加载全量字典数据]"); - } else { // 判断数据库中是否有更新的字典数据 - if (!dictDataCoreMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { - return null; - } - log.info("[loadDictDataIfUpdate][增量加载全量字典数据]"); - } - // 第二步,如果有更新,则从数据库加载所有字典数据 - return dictDataCoreMapper.selectList(); - } - - @Override - public DictDataRespDTO getDictDataFromCache(String type, String value) { - return SysDictDataCoreConvert.INSTANCE.convert02(valueDictDataCache.get(type, value)); - } - - @Override - public DictDataRespDTO parseDictDataFromCache(String type, String label) { - return SysDictDataCoreConvert.INSTANCE.convert02(labelDictDataCache.get(type, label)); - } - - @Override - public List listDictDatasFromCache(String type) { - return SysDictDataCoreConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values()); - } - - @Override - public void validDictDatas(String dictType, Collection values) { - if (CollUtil.isEmpty(values)) { - return; - } - ImmutableMap dictDataMap = valueDictDataCache.row(dictType); - // 校验 - values.forEach(value -> { - SysDictDataDO dictData = dictDataMap.get(value); - if (dictData == null) { - throw exception(DICT_DATA_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(dictData.getStatus())) { - throw exception(DICT_DATA_NOT_ENABLE, dictData.getLabel()); - } - }); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogCoreService.java deleted file mode 100644 index decc2739e8..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogCoreService.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.logger; - -import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; - -/** - * 登录日志 Core Service 接口 - */ -public interface SysLoginLogCoreService { - - /** - * 创建登录日志 - * - * @param reqDTO 日志信息 - */ - void createLoginLog(SysLoginLogCreateReqDTO reqDTO); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/impl/SysLoginLogCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/impl/SysLoginLogCoreServiceImpl.java deleted file mode 100644 index 7c866e8d66..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/impl/SysLoginLogCoreServiceImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.logger.impl; - -import cn.iocoder.yudao.coreservice.modules.system.convert.logger.SysLoginLogCoreConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.logger.SysLoginLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * 登录日志 Service Core 实现 - * - * @author 芋道源码 - */ -@Service -public class SysLoginLogCoreServiceImpl implements SysLoginLogCoreService { - - @Resource - private SysLoginLogCoreMapper loginLogMapper; - - @Override - public void createLoginLog(SysLoginLogCreateReqDTO reqDTO) { - SysLoginLogDO loginLog = SysLoginLogCoreConvert.INSTANCE.convert(reqDTO); - // 插入 - loginLogMapper.insert(loginLog); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreService.java deleted file mode 100644 index 02a8c26960..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreService.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms; - -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; - -import java.util.Date; -import java.util.Map; - -/** - * 短信日志 Core Service 接口 - * - * @author zzf - * @date 13:48 2021/3/2 - */ -public interface SysSmsLogCoreService { - - /** - * 创建短信日志 - * - * @param mobile 手机号 - * @param userId 用户编号 - * @param userType 用户类型 - * @param isSend 是否发送 - * @param template 短信模板 - * @param templateContent 短信内容 - * @param templateParams 短信参数 - * @return 发送日志编号 - */ - Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, - SysSmsTemplateDO template, String templateContent, Map templateParams); - - /** - * 更新日志的发送结果 - * - * @param id 日志编号 - * @param sendCode 发送结果的编码 - * @param sendMsg 发送结果的提示 - * @param apiSendCode 短信 API 发送结果的编码 - * @param apiSendMsg 短信 API 发送失败的提示 - * @param apiRequestId 短信 API 发送返回的唯一请求 ID - * @param apiSerialNo 短信 API 发送返回的序号 - */ - void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, - String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo); - - /** - * 更新日志的接收结果 - * - * @param id 日志编号 - * @param success 是否接收成功 - * @param receiveTime 用户接收时间 - * @param apiReceiveCode API 接收结果的编码 - * @param apiReceiveMsg API 接收结果的说明 - */ - void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateCoreService.java deleted file mode 100644 index 9a3a16099f..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateCoreService.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms; - -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; - -import java.util.Map; - -/** - * 短信模板 Core Service 接口 - * - * @author 芋道源码 - */ -public interface SysSmsTemplateCoreService { - - /** - * 初始化短信模板的本地缓存 - */ - void initLocalCache(); - - /** - * 获得短信模板,从缓存中 - * - * @param code 模板编码 - * @return 短信模板 - */ - SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code); - - /** - * 格式化短信内容 - * - * @param content 短信模板的内容 - * @param params 内容的参数 - * @return 格式化后的内容 - */ - String formatSmsTemplateContent(String content, Map params); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsLogCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsLogCoreServiceImpl.java deleted file mode 100644 index de318ed62a..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsLogCoreServiceImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl; - -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsLogCoreService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.Map; -import java.util.Objects; - -/** - * 短信日志 Core Service 实现类 - * - * @author zzf - * @date 2021/1/25 9:25 - */ -@Slf4j -@Service -public class SysSmsLogCoreServiceImpl implements SysSmsLogCoreService { - - @Resource - private SysSmsLogCoreMapper smsLogCoreMapper; - - @Override - public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, - SysSmsTemplateDO template, String templateContent, Map templateParams) { - SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder(); - // 根据是否要发送,设置状态 - logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus() - : SysSmsSendStatusEnum.IGNORE.getStatus()); - // 设置手机相关字段 - logBuilder.mobile(mobile).userId(userId).userType(userType); - // 设置模板相关字段 - logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); - logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId()); - // 设置渠道相关字段 - logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); - // 设置接收相关字段 - logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); - - // 插入数据库 - SysSmsLogDO logDO = logBuilder.build(); - smsLogCoreMapper.insert(logDO); - return logDO.getId(); - } - - @Override - public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, - String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) { - SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS - : SysSmsSendStatusEnum.FAILURE; - smsLogCoreMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()).sendTime(new Date()) - .sendCode(sendCode).sendMsg(sendMsg).apiSendCode(apiSendCode).apiSendMsg(apiSendMsg) - .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build()); - } - - @Override - public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg) { - SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? SysSmsReceiveStatusEnum.SUCCESS - : SysSmsReceiveStatusEnum.FAILURE; - smsLogCoreMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()).receiveTime(receiveTime) - .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsTemplateCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsTemplateCoreServiceImpl.java deleted file mode 100644 index aa1a28b388..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsTemplateCoreServiceImpl.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsTemplateCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.google.common.collect.ImmutableMap; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 短信模板 Core Service 接口 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class SysSmsTemplateCoreServiceImpl implements SysSmsTemplateCoreService { - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 短信模板缓存 - * key:短信模板编码 {@link SysSmsTemplateDO#getCode()} - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - private volatile Map smsTemplateCache; - /** - * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SysSmsTemplateCoreMapper smsTemplateCoreMapper; - - @Override - @PostConstruct - public void initLocalCache() { - // 获取短信模板列表,如果有更新 - List smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(smsTemplateList)) { - return; - } - - // 写入缓存 - ImmutableMap.Builder builder = ImmutableMap.builder(); - smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO)); - smsTemplateCache = builder.build(); - assert smsTemplateList.size() > 0; // 断言,避免告警 - maxUpdateTime = smsTemplateList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size()); - } - - /** - * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前短信模板的最大更新时间 - * @return 短信模板列表 - */ - private List loadSmsTemplateIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]"); - } else { // 判断数据库中是否有更新的短信模板 - if (smsTemplateCoreMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { - return null; - } - log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]"); - } - // 第二步,如果有更新,则从数据库加载所有短信模板 - return smsTemplateCoreMapper.selectList(); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initLocalCache(); - } - - @Override - public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) { - return smsTemplateCache.get(code); - } - - @Override - public String formatSmsTemplateContent(String content, Map params) { - return StrUtil.format(content, params); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java deleted file mode 100644 index c86e7a84ba..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.user; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; - -import java.util.*; - -/** - * 后台用户 Service Core 接口 - * - * @author 芋道源码 - */ -public interface SysUserCoreService { - - /** - * 通过用户 ID 查询用户 - * - * @param id 用户ID - * @return 用户对象信息 - */ - SysUserDO getUser(Long id); - - /** - * 获得指定部门的用户数组 - * - * @param deptIds 部门数组 - * @return 用户数组 - */ - List getUsersByDeptIds(Collection deptIds); - - /** - * 获得指定岗位的用户数组 - * - * @param postIds 岗位数组 - * @return 用户数组 - */ - List getUsersByPostIds(Collection postIds); - - /** - * 获得用户列表 - * - * @param ids 用户编号数组 - * @return 用户列表 - */ - List getUsers(Collection ids); - - /** - * 校验用户们是否有效。如下情况,视为无效: - * 1. 用户编号不存在 - * 2. 用户被禁用 - * - * @param ids 用户编号数组 - */ - void validUsers(Set ids); - - /** - * 获得用户 Map - * - * @param ids 用户编号数组 - * @return 用户 Map - */ - default Map getUserMap(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return new HashMap<>(); - } - return CollectionUtils.convertMap(getUsers(ids), SysUserDO::getId); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java deleted file mode 100644 index c2b5b054d3..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.user.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.user.SysUserCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.USER_IS_DISABLE; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.USER_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 后台用户 Service Core 实现 - * - * @author 芋道源码 - */ -@Service -public class SysUserCoreServiceImpl implements SysUserCoreService { - - @Resource - private SysUserCoreMapper userCoreMapper; - - @Override - public SysUserDO getUser(Long id) { - return userCoreMapper.selectById(id); - } - - @Override - public List getUsersByDeptIds(Collection deptIds) { - if (CollUtil.isEmpty(deptIds)) { - return Collections.emptyList(); - } - return userCoreMapper.selectListByDeptIds(deptIds); - } - - @Override - public List getUsersByPostIds(Collection postIds) { - if (CollUtil.isEmpty(postIds)) { - return Collections.emptyList(); - } - // 过滤不符合条件的 - // TODO 芋艿:暂时只能内存过滤。解决方案:1、新建一个关联表;2、基于 where + 函数;3、json 字段,适合 mysql 8+ 版本 - List users = userCoreMapper.selectList(); - users.removeIf(user -> !CollUtil.containsAny(user.getPostIds(), postIds)); - return users; - } - - @Override - public List getUsers(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return userCoreMapper.selectBatchIds(ids); - } - - @Override - public void validUsers(Set ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得岗位信息 - List users = userCoreMapper.selectBatchIds(ids); - Map userMap = CollectionUtils.convertMap(users, SysUserDO::getId); - // 校验 - ids.forEach(id -> { - SysUserDO user = userMap.get(id); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus())) { - throw exception(USER_IS_DISABLE, user.getNickname()); - } - }); - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreServiceTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreServiceTest.java index ce3d693959..232ccf5f44 100644 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreServiceTest.java +++ b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreServiceTest.java @@ -12,8 +12,7 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.FILE_NOT_EXISTS; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; +import static cn.iocoder.yudao.coreservice.modules.infra.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreServiceTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreServiceTest.java deleted file mode 100644 index d8aada3588..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreServiceTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.auth; - -import cn.iocoder.yudao.coreservice.BaseDbAndRedisUnitTest; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.auth.SysUserSessionCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; -import cn.iocoder.yudao.coreservice.modules.system.service.auth.impl.SysUserSessionCoreServiceImpl; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.security.config.SecurityProperties; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.Duration; -import java.util.Date; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.when; - -@Import({SysUserSessionCoreServiceImpl.class, SysLoginUserCoreRedisDAO.class}) -public class SysUserSessionCoreServiceTest extends BaseDbAndRedisUnitTest { - - @Resource - private SysUserSessionCoreServiceImpl userSessionCoreService; - - @Resource - private SysUserSessionCoreMapper userSessionCoreMapper; - @Resource - private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO; - - @MockBean - private SecurityProperties securityProperties; - - @Test - public void testCreateUserSession_success() { - // 准备参数 - String userIp = randomString(); - String userAgent = randomString(); - LoginUser loginUser = randomPojo(LoginUser.class, o -> { - o.setUserType(randomEle(UserTypeEnum.values()).getValue()); - o.setTenantId(0L); // 租户设置为 0,因为暂未启用多租户组件 - }); - // mock 方法 - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); - - // 调用 - String sessionId = userSessionCoreService.createUserSession(loginUser, userIp, userAgent); - // 校验 SysUserSessionDO 记录 - SysUserSessionDO userSessionDO = userSessionCoreMapper.selectById(sessionId); - assertPojoEquals(loginUser, userSessionDO, "id", "updateTime"); - assertEquals(sessionId, userSessionDO.getId()); - assertEquals(userIp, userSessionDO.getUserIp()); - assertEquals(userAgent, userSessionDO.getUserAgent()); - // 校验 LoginUser 缓存 - LoginUser redisLoginUser = loginUserCoreRedisDAO.get(sessionId); - assertPojoEquals(loginUser, redisLoginUser, "username", "password"); - } - - @Test - public void testCreateRefreshUserSession_success() { - // 准备参数 - String sessionId = randomString(); - String userIp = randomString(); - String userAgent = randomString(); - long timeLong = randomLongId(); - String userName = randomString(); - Date date = randomDate(); - LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setUserType(randomEle(UserTypeEnum.values()).getValue())); - // mock 方法 - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); - // mock 数据 - loginUser.setUpdateTime(date); - loginUserCoreRedisDAO.set(sessionId, loginUser); - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) - .userId(loginUser.getId()).userType(loginUser.getUserType()) - .userIp(userIp).userAgent(userAgent).username(userName) - .sessionTimeout(addTime(Duration.ofMillis(timeLong))) - .build(); - userSessionCoreMapper.insert(userSession); - - // 调用 - userSessionCoreService.refreshUserSession(sessionId, loginUser); - // 校验 LoginUser 缓存 - LoginUser redisLoginUser = loginUserCoreRedisDAO.get(sessionId); - assertNotEquals(redisLoginUser.getUpdateTime(), date); - // 校验 SysUserSessionDO 记录 - SysUserSessionDO updateDO = userSessionCoreMapper.selectById(sessionId); - assertEquals(updateDO.getUsername(), loginUser.getUsername()); - assertNotEquals(updateDO.getUpdateTime(), userSession.getUpdateTime()); - assertNotEquals(updateDO.getSessionTimeout(), addTime(Duration.ofMillis(timeLong))); - } - - @Test - public void testDeleteUserSession_success() { - // 准备参数 - String sessionId = randomString(); - String userIp = randomString(); - String userAgent = randomString(); - Long timeLong = randomLongId(); - LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setUserType(randomEle(UserTypeEnum.values()).getValue())); - // mock 存入 Redis - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); - // mock 数据 - loginUserCoreRedisDAO.set(sessionId, loginUser); - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) - .userId(loginUser.getId()).userType(loginUser.getUserType()) - .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) - .sessionTimeout(addTime(Duration.ofMillis(timeLong))) - .build(); - userSessionCoreMapper.insert(userSession); - - // 调用 - userSessionCoreService.deleteUserSession(sessionId); - // 校验数据不存在了 - assertNull(loginUserCoreRedisDAO.get(sessionId)); - assertNull(userSessionCoreMapper.selectById(sessionId)); - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreServiceTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreServiceTest.java deleted file mode 100644 index 410c592f59..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreServiceTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.dict; - -import cn.iocoder.yudao.coreservice.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dict.SysDictDataCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.dict.impl.SysDictDataCoreServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import com.google.common.collect.ImmutableTable; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.function.Consumer; - -import static cn.hutool.core.bean.BeanUtil.getFieldValue; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomCommonStatus; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** -* {@link SysDictDataCoreServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysDictDataCoreServiceImpl.class) -public class SysDictDataCoreServiceTest extends BaseDbUnitTest { - - @Resource - private SysDictDataCoreServiceImpl dictDataCoreService; - - @Resource - private SysDictDataCoreMapper dictDataMapper; - - /** - * 测试加载到新的字典数据的情况 - */ - @Test - @SuppressWarnings("unchecked") - public void testInitLocalCache() { - // mock 数据 - SysDictDataDO dictData01 = randomDictDataDO(); - dictDataMapper.insert(dictData01); - SysDictDataDO dictData02 = randomDictDataDO(); - dictDataMapper.insert(dictData02); - - // 调用 - dictDataCoreService.initLocalCache(); - // 断言 labelDictDataCache 缓存 - ImmutableTable labelDictDataCache = - (ImmutableTable) getFieldValue(dictDataCoreService, "labelDictDataCache"); - assertEquals(2, labelDictDataCache.size()); - assertPojoEquals(dictData01, labelDictDataCache.get(dictData01.getDictType(), dictData01.getLabel())); - assertPojoEquals(dictData02, labelDictDataCache.get(dictData02.getDictType(), dictData02.getLabel())); - // 断言 valueDictDataCache 缓存 - ImmutableTable valueDictDataCache = - (ImmutableTable) getFieldValue(dictDataCoreService, "valueDictDataCache"); - assertEquals(2, valueDictDataCache.size()); - assertPojoEquals(dictData01, valueDictDataCache.get(dictData01.getDictType(), dictData01.getValue())); - assertPojoEquals(dictData02, valueDictDataCache.get(dictData02.getDictType(), dictData02.getValue())); - // 断言 maxUpdateTime 缓存 - Date maxUpdateTime = (Date) getFieldValue(dictDataCoreService, "maxUpdateTime"); - assertEquals(ObjectUtils.max(dictData01.getUpdateTime(), dictData02.getUpdateTime()), maxUpdateTime); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysDictDataDO randomDictDataDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomCommonStatus()); // 保证 status 的范围 - }; - return randomPojo(SysDictDataDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogServiceImplTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogServiceImplTest.java deleted file mode 100644 index 1da56c2644..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogServiceImplTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.logger; - -import cn.iocoder.yudao.coreservice.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.logger.SysLoginLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.impl.SysLoginLogCoreServiceImpl; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; - -@Import(SysLoginLogCoreServiceImpl.class) -public class SysLoginLogServiceImplTest extends BaseDbUnitTest { - - @Resource - private SysLoginLogCoreServiceImpl loginLogCoreService; - - @Resource - private SysLoginLogCoreMapper loginLogCoreMapper; - - @Test - public void testCreateLoginLog() { - SysLoginLogCreateReqDTO reqDTO = RandomUtils.randomPojo(SysLoginLogCreateReqDTO.class, vo -> { - // 指定随机的范围,避免超出范围入库失败 - vo.setUserType(randomEle(UserTypeEnum.values()).getValue()); - vo.setLogType(randomEle(SysLoginLogTypeEnum.values()).getType()); - vo.setResult(randomEle(SysLoginResultEnum.values()).getResult()); - vo.setTraceId(TracerUtils.getTraceId()); - }); - - // 调用 - loginLogCoreService.createLoginLog(reqDTO); - // 断言,忽略基本字段 - SysLoginLogDO sysLoginLogDO = loginLogCoreMapper.selectOne(null); - assertPojoEquals(reqDTO, sysLoginLogDO); - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/package-info.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/package-info.java deleted file mode 100644 index 8b5f8b0109..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service; diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreServiceTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreServiceTest.java deleted file mode 100644 index 896f0c6d3e..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreServiceTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms; - -import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.coreservice.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsLogCoreServiceImpl; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.Map; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomBoolean; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** -* {@link SysSmsLogCoreServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysSmsLogCoreServiceImpl.class) -public class SysSmsLogCoreServiceTest extends BaseDbUnitTest { - - @Resource - private SysSmsLogCoreServiceImpl smsLogCoreService; - - @Resource - private SysSmsLogCoreMapper smsLogCoreMapper; - - @Test - public void testCreateSmsLog() { - // 准备参数 - String mobile = randomString(); - Long userId = randomLongId(); - Integer userType = randomEle(UserTypeEnum.values()).getValue(); - Boolean isSend = randomBoolean(); - SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class, - o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType())); - String templateContent = randomString(); - Map templateParams = randomTemplateParams(); - // mock 方法 - - // 调用 - Long logId = smsLogCoreService.createSmsLog(mobile, userId, userType, isSend, - templateDO, templateContent, templateParams); - // 断言 - SysSmsLogDO logDO = smsLogCoreMapper.selectById(logId); - assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(), - logDO.getSendStatus()); - assertEquals(mobile, logDO.getMobile()); - assertEquals(userType, logDO.getUserType()); - assertEquals(userId, logDO.getUserId()); - assertEquals(templateDO.getId(), logDO.getTemplateId()); - assertEquals(templateDO.getCode(), logDO.getTemplateCode()); - assertEquals(templateDO.getType(), logDO.getTemplateType()); - assertEquals(templateDO.getChannelId(), logDO.getChannelId()); - assertEquals(templateDO.getChannelCode(), logDO.getChannelCode()); - assertEquals(templateContent, logDO.getTemplateContent()); - assertEquals(templateParams, logDO.getTemplateParams()); - assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus()); - } - - @Test - public void testUpdateSmsSendResult() { - // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO( - o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus())); - smsLogCoreMapper.insert(dbSmsLog); - // 准备参数 - Long id = dbSmsLog.getId(); - Integer sendCode = randomInteger(); - String sendMsg = randomString(); - String apiSendCode = randomString(); - String apiSendMsg = randomString(); - String apiRequestId = randomString(); - String apiSerialNo = randomString(); - - // 调用 - smsLogCoreService.updateSmsSendResult(id, sendCode, sendMsg, - apiSendCode, apiSendMsg, apiRequestId, apiSerialNo); - // 断言 - dbSmsLog = smsLogCoreMapper.selectById(id); - assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus() - : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus()); - assertNotNull(dbSmsLog.getSendTime()); - assertEquals(sendMsg, dbSmsLog.getSendMsg()); - assertEquals(apiSendCode, dbSmsLog.getApiSendCode()); - assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg()); - assertEquals(apiRequestId, dbSmsLog.getApiRequestId()); - assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo()); - } - - @Test - public void testUpdateSmsReceiveResult() { - // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO( - o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus())); - smsLogCoreMapper.insert(dbSmsLog); - // 准备参数 - Long id = dbSmsLog.getId(); - Boolean success = randomBoolean(); - Date receiveTime = randomDate(); - String apiReceiveCode = randomString(); - String apiReceiveMsg = randomString(); - - // 调用 - smsLogCoreService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg); - // 断言 - dbSmsLog = smsLogCoreMapper.selectById(id); - assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus() - : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); - assertEquals(receiveTime, dbSmsLog.getReceiveTime()); - assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode()); - assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg()); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysSmsLogDO randomSmsLogDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setTemplateParams(randomTemplateParams()); - o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 - o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围 - o.setSendStatus(randomEle(SysSmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围 - o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围 - }; - return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers)); - } - - - private static Map randomTemplateParams() { - return MapUtil.builder().put(randomString(), randomString()) - .put(randomString(), randomString()).build(); - } -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateServiceTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateServiceTest.java deleted file mode 100644 index 1bcdb442de..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateServiceTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms; - -import cn.iocoder.yudao.coreservice.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsTemplateCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsTemplateCoreServiceImpl; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.Map; -import java.util.function.Consumer; - -import static cn.hutool.core.bean.BeanUtil.getFieldValue; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** -* {@link SysSmsTemplateCoreServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysSmsTemplateCoreServiceImpl.class) -public class SysSmsTemplateServiceTest extends BaseDbUnitTest { - - @Resource - private SysSmsTemplateCoreServiceImpl smsTemplateCoreService; - - @Resource - private SysSmsTemplateCoreMapper smsTemplateCoreMapper; - - @Test - @SuppressWarnings("unchecked") - void testInitLocalCache() { - // mock 数据 - SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO(); - smsTemplateCoreMapper.insert(smsTemplate01); - SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO(); - smsTemplateCoreMapper.insert(smsTemplate02); - - // 调用 - smsTemplateCoreService.initLocalCache(); - // 断言 deptCache 缓存 - Map smsTemplateCache = (Map) getFieldValue(smsTemplateCoreService, "smsTemplateCache"); - assertEquals(2, smsTemplateCache.size()); - assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode())); - assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode())); - // 断言 maxUpdateTime 缓存 - Date maxUpdateTime = (Date) getFieldValue(smsTemplateCoreService, "maxUpdateTime"); - assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysSmsTemplateDO randomSmsTemplateDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 - }; - return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java index 7d7f1518fd..469424e67e 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.message; import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import org.activiti.api.task.model.Task; import org.activiti.engine.runtime.ProcessInstance; import org.mapstruct.Mapper; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java index e54e850b22..cd0839fe00 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java @@ -5,8 +5,8 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmP import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.repository.ProcessDefinition; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java index 424ae25178..117d2c1cf8 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java @@ -4,8 +4,8 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskD import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskTodoPageItemRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import org.activiti.engine.history.HistoricProcessInstance; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java index 53f8b7d753..f5ce1a91e7 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import lombok.*; import java.util.*; import com.baomidou.mybatisplus.annotation.*; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java index 79afd41cb7..e95764a795 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.enums.message; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index 2e1da6f4ab..e7da584058 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -7,9 +7,9 @@ import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import org.activiti.api.runtime.shared.identity.UserGroupManager; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.ApplicationEventPublisher; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java index c426a23ee7..bc3d956912 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Setter; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java index e2beba8e03..aa6cb1f131 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java @@ -9,11 +9,11 @@ import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import com.google.common.annotations.VisibleForTesting; import lombok.Setter; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java index eeb8b40bd1..465be3b4a6 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java @@ -2,17 +2,16 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.springframework.util.Assert; import javax.annotation.Resource; import java.util.Set; -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; import static java.util.Collections.emptySet; /** diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java index dac572f1a1..2364339ed0 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java @@ -14,12 +14,12 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelServi import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysPostCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysRoleCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.dept.SysPostCoreService; +import cn.iocoder.yudao.module.system.service.dict.DictDataCoreService; +import cn.iocoder.yudao.module.system.service.permission.SysRoleCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; @@ -64,7 +64,7 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { @Resource private BpmUserGroupServiceApi userGroupServiceApi; @Resource - private SysDictDataCoreService dictDataCoreService; + private DictDataCoreService dictDataCoreService; @Override public List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java index c16fd476fb..1c8829876c 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageServic import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; +import cn.iocoder.yudao.module.system.service.sms.SysSmsCoreService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java index 08d115b09b..df44537833 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java @@ -18,10 +18,10 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageServic import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import lombok.extern.slf4j.Slf4j; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java index dfac6455e8..5f97a2561a 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java @@ -12,10 +12,10 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageServic import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java index b9b9a1475b..082d9c9486 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java @@ -8,11 +8,11 @@ import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java index 2652524c0d..bc0ab21e6d 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; import org.activiti.engine.impl.persistence.entity.ExecutionEntityImpl; import org.activiti.engine.impl.persistence.entity.TaskEntity; diff --git a/yudao-module-member/yudao-module-member-impl/pom.xml b/yudao-module-member/yudao-module-member-impl/pom.xml index 37a4e72864..d3b6bd7eed 100644 --- a/yudao-module-member/yudao-module-member-impl/pom.xml +++ b/yudao-module-member/yudao-module-member-impl/pom.xml @@ -24,6 +24,12 @@ ${revision} + + cn.iocoder.boot + yudao-module-system-api + ${revision} + + cn.iocoder.boot diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java index fd698e2022..e2924b82a6 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java @@ -1,11 +1,9 @@ package cn.iocoder.yudao.module.member.controller.app.auth; -import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.service.auth.AuthService; import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; @@ -15,7 +13,6 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java index 55e23ac4c7..46ad9b6270 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java index d6bdaf009f..b9a854ec1d 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -22,7 +22,7 @@ import javax.validation.constraints.Pattern; public class AppAuthSocialLogin2ReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") - @InEnum(SysSocialTypeEnum.class) + @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java index b919bf275d..e262765a94 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -20,7 +20,7 @@ import javax.validation.constraints.NotNull; public class AppAuthSocialLoginReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") - @InEnum(SysSocialTypeEnum.class) + @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java index ac4308e6a5..245417820b 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -20,7 +20,7 @@ import javax.validation.constraints.NotNull; public class AppAuthSocialUnbindReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") - @InEnum(SysSocialTypeEnum.class) + @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java index dfeb7f040a..0cf21d1a9f 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java @@ -2,13 +2,13 @@ package cn.iocoder.yudao.module.member.service.auth; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.service.auth.SysUserSessionCoreService; +import cn.iocoder.yudao.module.system.service.logger.SysLoginLogCoreService; +import cn.iocoder.yudao.module.system.service.logger.dto.SysLoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; @@ -29,7 +29,6 @@ import org.springframework.context.annotation.Lazy; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.DisabledException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java index 41049656d0..b15f485686 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.member.service.sms; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; +import cn.iocoder.yudao.module.system.service.sms.SysSmsCoreService; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java index aa38ab936c..93eb2878ea 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.member.service.auth; -import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; +import cn.iocoder.yudao.module.system.service.auth.SysUserSessionCoreService; +import cn.iocoder.yudao.module.system.service.logger.SysLoginLogCoreService; +import cn.iocoder.yudao.module.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java similarity index 100% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java similarity index 76% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java index e2dbf3417f..218ef6d312 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums; +package cn.iocoder.yudao.module.system.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; @@ -14,10 +14,6 @@ public interface SysErrorCodeConstants { ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1006000001, "模板参数({})缺失"); ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1006000000, "短信模板不存在"); - // ========= 文件相关 1006001000================= - ErrorCode FILE_PATH_EXISTS = new ErrorCode(1006001000, "文件路径已存在"); - ErrorCode FILE_NOT_EXISTS = new ErrorCode(1006001002, "文件不存在"); - // ========== 社交模块 1006002000 ========== ErrorCode SOCIAL_AUTH_FAILURE = new ErrorCode(1006002000, "社交授权失败,原因是:{}"); ErrorCode SOCIAL_UNBIND_NOT_SELF = new ErrorCode(1006002001, "社交解绑失败,非当前用户绑定"); @@ -34,10 +30,6 @@ public interface SysErrorCodeConstants { ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1006005000, "角色不存在"); ErrorCode ROLE_IS_DISABLE = new ErrorCode(1006005001, "名字为【{}】的角色已被禁用"); - // ========== 字典类型 1006006000 ========== - ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1006006000, "当前字典数据不存在"); - ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1006006001, "字典数据({})不处于开启状态,不允许选择"); - // ========== 岗位模块 1006007000 ========== ErrorCode POST_NOT_FOUND = new ErrorCode(1006007000, "当前岗位不存在"); ErrorCode POST_NOT_ENABLE = new ErrorCode(1006007001, "岗位({}) 不处于开启状态,不允许选择"); diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/social/SocialTypeEnum.java similarity index 89% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/social/SocialTypeEnum.java index 3dba5bda03..8744c3509b 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/social/SocialTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums.social; +package cn.iocoder.yudao.module.system.enums.social; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ArrayUtil; @@ -16,7 +16,7 @@ import java.util.List; */ @Getter @AllArgsConstructor -public enum SysSocialTypeEnum implements IntArrayValuable { +public enum SocialTypeEnum implements IntArrayValuable { /** * Gitee @@ -51,7 +51,7 @@ public enum SysSocialTypeEnum implements IntArrayValuable { WECHAT_MINI_PROGRAM(33, "WECHAT_MINI_PROGRAM"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSocialTypeEnum::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SocialTypeEnum::getType).toArray(); public static final List WECHAT_ALL = ListUtil.toList(WECHAT_ENTERPRISE.type, WECHAT_MP.type, WECHAT_OPEN.type, WECHAT_MINI_PROGRAM.type); @@ -70,7 +70,7 @@ public enum SysSocialTypeEnum implements IntArrayValuable { return ARRAYS; } - public static SysSocialTypeEnum valueOfType(Integer type) { + public static SocialTypeEnum valueOfType(Integer type) { return ArrayUtil.firstMatch(o -> o.getType().equals(type), values()); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 6829c6ce95..6f72c3eb63 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -3,19 +3,19 @@ package cn.iocoder.yudao.module.system.controller.admin.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*; import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; import cn.iocoder.yudao.module.system.service.auth.AuthService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.permission.RoleService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.service.social.SocialUserService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.service.user.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -45,14 +45,15 @@ public class AuthController { @Autowired @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // AuthService 存在重名 private AuthService authService; - @Resource - private SysUserCoreService userCoreService; + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 + private UserService userService; @Resource private RoleService roleService; @Resource private PermissionService permissionService; @Resource - private SysSocialCoreService socialCoreService; + private SocialUserService socialCoreService; @PostMapping("/login") @ApiOperation("使用账号密码登录") @@ -67,7 +68,7 @@ public class AuthController { @ApiOperation("获取登录用户的权限信息") public CommonResult getPermissionInfo() { // 获得用户信息 - SysUserDO user = userCoreService.getUser(getLoginUserId()); + UserDO user = userService.getUser(getLoginUserId()); if (user == null) { return null; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java index 415e5b285e..eeca9ac8e7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java @@ -3,19 +3,19 @@ package cn.iocoder.yudao.module.system.controller.admin.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageItemRespVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.module.system.convert.auth.UserSessionConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.service.auth.UserSessionService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.module.system.service.user.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,10 +35,9 @@ public class UserSessionController { @Resource private UserSessionService userSessionService; - @Resource - private SysUserSessionCoreService userSessionCoreService; - @Resource - private SysUserCoreService userCoreService; + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 + private UserService userService; @Resource private SysDeptCoreService deptCoreService; @@ -51,10 +50,10 @@ public class UserSessionController { PageResult pageResult = userSessionService.getUserSessionPage(reqVO); // 获得拼接需要的数据 - Map userMap = userCoreService.getUserMap( + Map userMap = userService.getUserMap( convertList(pageResult.getList(), SysUserSessionDO::getUserId)); Map deptMap = deptCoreService.getDeptMap( - convertList(userMap.values(), SysUserDO::getDeptId)); + convertList(userMap.values(), UserDO::getDeptId)); // 拼接结果返回 List sessionList = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(session -> { @@ -76,7 +75,7 @@ public class UserSessionController { example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") @PreAuthorize("@ss.hasPermission('system:user-session:delete')") public CommonResult deleteUserSession(@RequestParam("id") String id) { - userSessionCoreService.deleteUserSession(id); + userSessionService.deleteUserSession(id); return success(true); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java index 3bb408c0b4..5debf6b205 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -20,7 +20,7 @@ import javax.validation.constraints.NotNull; public class AuthSocialBindReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") - @InEnum(SysSocialTypeEnum.class) + @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java index 74955a6c59..90ce2cf88a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -22,7 +22,7 @@ import javax.validation.constraints.Pattern; public class AuthSocialLogin2ReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") - @InEnum(SysSocialTypeEnum.class) + @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java index 4f7b8d76d6..bc1247d678 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -20,7 +20,7 @@ import javax.validation.constraints.NotNull; public class AuthSocialLoginReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") - @InEnum(SysSocialTypeEnum.class) + @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java index b16f1ef772..eb43a2d27d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -20,7 +20,7 @@ import javax.validation.constraints.NotNull; public class AuthSocialUnbindReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") - @InEnum(SysSocialTypeEnum.class) + @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java index 2459736a5c..837a825ee2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.system.controller.admin.dept; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.*; import cn.iocoder.yudao.module.system.convert.dept.DeptConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.service.dept.DeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java index 9191ce25fe..e5b179e323 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.*; import cn.iocoder.yudao.module.system.convert.dept.PostConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.module.system.service.dept.PostService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExcelVO.java index b9c2696dfb..0053a78951 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -25,7 +25,7 @@ public class PostExcelVO { private Integer sort; @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) + @DictFormat(DictTypeConstants.COMMON_STATUS) private String status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java index 81d7cc247c..08fca2c476 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.dict; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java index ee907eaa76..6dcb9bb505 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -28,7 +28,7 @@ public class DictDataExcelVO { private String dictType; @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) + @DictFormat(DictTypeConstants.COMMON_STATUS) private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java index fbda72b2e3..b7db46d0eb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -22,7 +22,7 @@ public class DictTypeExcelVO { private String type; @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) + @DictFormat(DictTypeConstants.COMMON_STATUS) private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java index ad78168355..9890247c8b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.logger; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java index 2eca78fc15..935b48bafa 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java @@ -7,16 +7,17 @@ import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.Oper import cn.iocoder.yudao.module.system.convert.logger.OperateLogConvert; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import cn.iocoder.yudao.module.system.service.logger.OperateLogService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.service.user.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -43,8 +44,9 @@ public class OperateLogController { @Resource private OperateLogService operateLogService; - @Resource - private SysUserCoreService userCoreService; + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 + private UserService userService; @GetMapping("/page") @ApiOperation("查看操作日志分页列表") @@ -54,7 +56,7 @@ public class OperateLogController { // 获得拼接需要的数据 Collection userIds = CollectionUtils.convertList(pageResult.getList(), OperateLogDO::getUserId); - Map userMap = userCoreService.getUserMap(userIds); + Map userMap = userService.getUserMap(userIds); // 拼接数据 List list = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(operateLog -> { @@ -75,7 +77,7 @@ public class OperateLogController { // 获得拼接需要的数据 Collection userIds = CollectionUtils.convertList(list, OperateLogDO::getUserId); - Map userMap = userCoreService.getUserMap(userIds); + Map userMap = userService.getUserMap(userIds); // 拼接数据 List excelDataList = OperateLogConvert.INSTANCE.convertList(list, userMap); // 输出 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java index 2a16454fca..300cd088d8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -21,11 +21,11 @@ public class LoginLogExcelVO { private String username; @ExcelProperty(value = "日志类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.LOGIN_TYPE) + @DictFormat(DictTypeConstants.LOGIN_TYPE) private Integer logType; @ExcelProperty(value = "登录结果", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.LOGIN_RESULT) + @DictFormat(DictTypeConstants.LOGIN_RESULT) private Integer result; @ExcelProperty("登录 IP") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java index 40546b2d9c..7f38cfc797 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -24,7 +24,7 @@ public class OperateLogExcelVO { private String name; @ExcelProperty(value = "操作类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.OPERATE_TYPE) + @DictFormat(DictTypeConstants.OPERATE_TYPE) private String type; @ExcelProperty("操作人") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java index ac7dce6358..54cdb6b536 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*; import cn.iocoder.yudao.module.system.convert.permission.RoleConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.service.permission.RoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExcelVO.java index bb82f4ab1f..d22cf9bf24 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -28,7 +28,7 @@ public class RoleExcelVO { private Integer dataScope; @ExcelProperty(value = "角色状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) + @DictFormat(DictTypeConstants.COMMON_STATUS) private String status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java index f13f188c44..6e2602cf0c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.sms; import cn.hutool.core.util.URLUtil; import cn.hutool.extra.servlet.ServletUtil; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; +import cn.iocoder.yudao.module.system.service.sms.SysSmsSendService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; @@ -25,7 +25,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; public class SmsCallbackController { @Resource - private SysSmsCoreService smsCoreService; + private SysSmsSendService smsCoreService; @PostMapping("/sms/yunpian") @ApiOperation(value = "云片短信的回调", notes = "参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java index 86c9eee6ed..4774fcf59b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.*; import cn.iocoder.yudao.module.system.convert.sms.SmsChannelConvert; import cn.iocoder.yudao.module.system.service.sms.SmsChannelService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import io.swagger.annotations.Api; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java index 557e6d31e3..ef93cfc3de 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqV import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SysSmsLogRespVO; import cn.iocoder.yudao.module.system.convert.sms.SmsLogConvert; import cn.iocoder.yudao.module.system.service.sms.SmsLogService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java index 2d0adc427b..f16bfb2c97 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.*; import cn.iocoder.yudao.module.system.convert.sms.SmsTemplateConvert; import cn.iocoder.yudao.module.system.service.sms.SmsTemplateService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.service.sms.SysSmsSendService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -32,7 +32,7 @@ public class SmsTemplateController { @Resource private SmsTemplateService smsTemplateService; @Resource - private SysSmsCoreService smsCoreService; + private SysSmsSendService smsCoreService; @PostMapping("/create") @ApiOperation("创建短信模板") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java index 9fb8515df9..f638f58fc2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.sms.vo.log; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.framework.excel.core.convert.JsonConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -34,7 +34,7 @@ public class SmsLogExcelVO { private String templateCode; @ExcelProperty(value = "短信类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_TEMPLATE_TYPE) + @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) private Integer templateType; @ExcelProperty("短信内容") @@ -53,11 +53,11 @@ public class SmsLogExcelVO { private Long userId; @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_TYPE) + @DictFormat(DictTypeConstants.USER_TYPE) private Integer userType; @ExcelProperty(value = "发送状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_SEND_STATUS) + @DictFormat(DictTypeConstants.SMS_SEND_STATUS) private Integer sendStatus; @ExcelProperty("发送时间") @@ -82,7 +82,7 @@ public class SmsLogExcelVO { private String apiSerialNo; @ExcelProperty(value = "接收状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_RECEIVE_STATUS) + @DictFormat(DictTypeConstants.SMS_RECEIVE_STATUS) private Integer receiveStatus; @ExcelProperty("接收时间") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java index eb28c63cb1..a640a93c1b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -20,11 +20,11 @@ public class SmsTemplateExcelVO { private Long id; @ExcelProperty(value = "短信签名", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_TEMPLATE_TYPE) + @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) private Integer type; @ExcelProperty(value = "开启状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) + @DictFormat(DictTypeConstants.COMMON_STATUS) private Integer status; @ExcelProperty("模板编码") @@ -46,7 +46,7 @@ public class SmsTemplateExcelVO { private Long channelId; @ExcelProperty(value = "短信渠道编码", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_CHANNEL_CODE) + @DictFormat(DictTypeConstants.SMS_CHANNEL_CODE) private String channelCode; @ExcelProperty("创建时间") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java index 2b5fc204cd..bd2fcb430b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.tenant; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.*; import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert; import cn.iocoder.yudao.module.system.service.tenant.TenantService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index ddf19aec84..61c54e2932 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -3,12 +3,11 @@ package cn.iocoder.yudao.module.system.controller.admin.user; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.module.system.convert.user.UserConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -19,6 +18,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -41,11 +41,10 @@ import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.E @Validated public class UserController { - @Resource + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 private UserService userService; @Resource - private SysUserCoreService userCoreService; - @Resource private SysDeptCoreService deptCoreService; @PostMapping("/create") @@ -94,13 +93,13 @@ public class UserController { @PreAuthorize("@ss.hasPermission('system:user:list')") public CommonResult> getUserPage(@Valid UserPageReqVO reqVO) { // 获得用户分页列表 - PageResult pageResult = userService.getUserPage(reqVO); + PageResult pageResult = userService.getUserPage(reqVO); if (CollUtil.isEmpty(pageResult.getList())) { return success(new PageResult<>(pageResult.getTotal())); // 返回空 } // 获得拼接需要的数据 - Collection deptIds = convertList(pageResult.getList(), SysUserDO::getDeptId); + Collection deptIds = convertList(pageResult.getList(), UserDO::getDeptId); Map deptMap = deptCoreService.getDeptMap(deptIds); // 拼接结果返回 List userList = new ArrayList<>(pageResult.getList().size()); @@ -116,7 +115,7 @@ public class UserController { @ApiOperation(value = "获取用户精简信息列表", notes = "只包含被开启的用户,主要用于前端的下拉选项") public CommonResult> getSimpleUsers() { // 获用户门列表,只要开启状态的 - List list = userService.getUsersByStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = userService.getUsersByStatus(CommonStatusEnum.ENABLE.getStatus()); // 排序后,返回给前端 return success(UserConvert.INSTANCE.convertList04(list)); } @@ -126,7 +125,7 @@ public class UserController { @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:user:query')") public CommonResult getInfo(@RequestParam("id") Long id) { - return success(UserConvert.INSTANCE.convert(userCoreService.getUser(id))); + return success(UserConvert.INSTANCE.convert(userService.getUser(id))); } @GetMapping("/export") @@ -136,12 +135,13 @@ public class UserController { public void exportUsers(@Validated UserExportReqVO reqVO, HttpServletResponse response) throws IOException { // 获得用户列表 - List users = userService.getUsers(reqVO); + List users = userService.getUsers(reqVO); // 获得拼接需要的数据 - Collection deptIds = convertList(users, SysUserDO::getDeptId); + Collection deptIds = convertList(users, UserDO::getDeptId); Map deptMap = deptCoreService.getDeptMap(deptIds); - Map deptLeaderUserMap = userCoreService.getUserMap(convertSet(deptMap.values(), SysDeptDO::getLeaderUserId)); + Map deptLeaderUserMap = userService.getUserMap( + convertSet(deptMap.values(), SysDeptDO::getLeaderUserId)); // 拼接数据 List excelUsers = new ArrayList<>(users.size()); users.forEach(user -> { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java index 4745b2f5bd..ffb6b0d1c2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java @@ -9,20 +9,20 @@ import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.permission.RoleService; import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.social.SocialUserService; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -43,11 +43,10 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @Slf4j public class UserProfileController { - @Resource + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 private UserService userService; @Resource - private SysUserCoreService userCoreService; - @Resource private SysDeptCoreService deptCoreService; @Resource @@ -57,13 +56,13 @@ public class UserProfileController { @Resource private RoleService roleService; @Resource - private SysSocialCoreService socialService; + private SocialUserService socialService; @GetMapping("/get") @ApiOperation("获得登录用户信息") public CommonResult profile() { // 获得用户基本信息 - SysUserDO user = userCoreService.getUser(getLoginUserId()); + UserDO user = userService.getUser(getLoginUserId()); UserProfileRespVO resp = UserConvert.INSTANCE.convert03(user); // 获得用户角色 List userRoles = roleService.getRolesFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExcelVO.java index b67010ca69..a9163cb6cf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -30,11 +30,11 @@ public class UserExcelVO { private String mobile; @ExcelProperty(value = "用户性别", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_SEX) + @DictFormat(DictTypeConstants.USER_SEX) private Integer sex; @ExcelProperty(value = "帐号状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) + @DictFormat(DictTypeConstants.COMMON_STATUS) private Integer status; @ExcelProperty("最后登录IP") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java index b2e084af03..a360f1af2c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.user.vo.user; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.coreservice.modules.system.enums.SysDictTypeConstants; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; @@ -36,11 +36,11 @@ public class UserImportExcelVO { private String mobile; @ExcelProperty(value = "用户性别", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_SEX) + @DictFormat(DictTypeConstants.USER_SEX) private Integer sex; @ExcelProperty(value = "账号状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) + @DictFormat(DictTypeConstants.COMMON_STATUS) private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java index be76b5fdd2..14310514d9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.system.convert.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthMenuRespVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthPermissionInfoRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; @@ -22,14 +22,14 @@ public interface AuthConvert { AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略 - LoginUser convert0(SysUserDO bean); + LoginUser convert0(UserDO bean); - default LoginUser convert(SysUserDO bean) { + default LoginUser convert(UserDO bean) { // 目的,为了设置 UserTypeEnum.ADMIN.getValue() return convert0(bean).setUserType(UserTypeEnum.ADMIN.getValue()); } - default AuthPermissionInfoRespVO convert(SysUserDO user, List roleList, List menuList) { + default AuthPermissionInfoRespVO convert(UserDO user, List roleList, List menuList) { return AuthPermissionInfoRespVO.builder() .user(AuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build()) .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode)) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java index 37cec9ee46..b287d8adc4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.convert.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageItemRespVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java index 2d1c4d6c1d..cd66acd9fa 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateRe import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java index 99af8b91ac..d3680dae51 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.convert.dept; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java index 33958c325b..94f67657fe 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.convert.dict; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; import org.mapstruct.Mapper; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/dict/SysDictDataCoreConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataCoreConvert.java similarity index 74% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/dict/SysDictDataCoreConvert.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataCoreConvert.java index e68e165d37..c61d654cff 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/dict/SysDictDataCoreConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataCoreConvert.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.convert.dict; +package cn.iocoder.yudao.module.system.convert.dict; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java index 3d375b0046..3208276ccb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.convert.logger; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExcelVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java index bc5cd690ec..1c2261afd3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.convert.logger; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExcelVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; @@ -27,7 +27,7 @@ public interface OperateLogConvert { OperateLogRespVO convert(OperateLogDO bean); - default List convertList(List list, Map userMap) { + default List convertList(List list, Map userMap) { return list.stream().map(operateLog -> { OperateLogExcelVO excelVO = convert02(operateLog); MapUtils.findAndThen(userMap, operateLog.getId(), user -> excelVO.setUserNickname(user.getNickname())); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java new file mode 100644 index 0000000000..bfdeea7e8c --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.system.convert.logger; + +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface SysLoginLogCoreConvert { + + SysLoginLogCoreConvert INSTANCE = Mappers.getMapper(SysLoginLogCoreConvert.class); + + SysLoginLogDO convert(LoginLogCreateReqDTO bean); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java index c9e1098ae4..5dcbf12fc6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.convert.permission; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java index 3885b7a1cd..6979ed0027 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannel import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelRespVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelSimpleRespVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; import org.mapstruct.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java index f5110b3716..425ac31977 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.convert.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExcelVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SysSmsLogRespVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java index bc83e1e85f..8cca0f01fa 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExcelVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateRespVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java index 62e28b4690..53de4517ad 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReq import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExcelVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantRespVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java index e57cb86483..10d4b16d68 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java @@ -4,11 +4,11 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfi import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -19,31 +19,31 @@ public interface UserConvert { UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); - UserPageItemRespVO convert(SysUserDO bean); + UserPageItemRespVO convert(UserDO bean); UserPageItemRespVO.Dept convert(SysDeptDO bean); - SysUserDO convert(UserCreateReqVO bean); + UserDO convert(UserCreateReqVO bean); - SysUserDO convert(UserUpdateReqVO bean); + UserDO convert(UserUpdateReqVO bean); - UserExcelVO convert02(SysUserDO bean); + UserExcelVO convert02(UserDO bean); - SysUserDO convert(UserImportExcelVO bean); + UserDO convert(UserImportExcelVO bean); - UserProfileRespVO convert03(SysUserDO bean); + UserProfileRespVO convert03(UserDO bean); List convertList(List list); UserProfileRespVO.Dept convert02(SysDeptDO bean); - SysUserDO convert(UserProfileUpdateReqVO bean); + UserDO convert(UserProfileUpdateReqVO bean); - SysUserDO convert(UserProfileUpdatePasswordReqVO bean); + UserDO convert(UserProfileUpdatePasswordReqVO bean); List convertList02(List list); List convertList03(List list); - List convertList04(List list); + List convertList04(List list); } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/auth/SysUserSessionDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/SysUserSessionDO.java similarity index 95% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/auth/SysUserSessionDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/SysUserSessionDO.java index d30d38491d..9de10295ba 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/auth/SysUserSessionDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/SysUserSessionDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth; +package cn.iocoder.yudao.module.system.dal.dataobject.auth; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysDeptDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java similarity index 84% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysDeptDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java index ced8296dac..797dfa2062 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysDeptDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept; +package cn.iocoder.yudao.module.system.dal.dataobject.dept; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; import com.baomidou.mybatisplus.annotation.TableId; @@ -41,7 +41,7 @@ public class SysDeptDO extends TenantBaseDO { /** * 负责人 * - * 关联 {@link SysUserDO#getId()} + * 关联 {@link UserDO#getId()} */ private Long leaderUserId; /** diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysPostDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysPostDO.java similarity index 92% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysPostDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysPostDO.java index 6e47b1da42..233ba361be 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dept/SysPostDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysPostDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept; +package cn.iocoder.yudao.module.system.dal.dataobject.dept; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dict/SysDictDataDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictDataDO.java similarity index 93% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dict/SysDictDataDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictDataDO.java index d398d5ef34..fe12ce472b 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dict/SysDictDataDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictDataDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict; +package cn.iocoder.yudao.module.system.dal.dataobject.dict; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java index ec799ec464..5c12f825c6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.dataobject.logger; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; @@ -48,7 +48,7 @@ public class OperateLogDO extends TenantBaseDO { /** * 用户编号 * - * {@link SysUserDO#getId()} + * {@link UserDO#getId()} */ private Long userId; /** diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/logger/SysLoginLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java similarity index 83% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/logger/SysLoginLogDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java index e7e7a4144b..0a15186469 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/logger/SysLoginLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger; +package cn.iocoder.yudao.module.system.dal.dataobject.logger; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/package-info.java new file mode 100644 index 0000000000..000c252fcb --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.system.dal.dataobject; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysRoleDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleDO.java similarity index 95% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysRoleDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleDO.java index c27f588abe..6b2d3eb9a3 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysRoleDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission; +package cn.iocoder.yudao.module.system.dal.dataobject.permission; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysUserRoleDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysUserRoleDO.java similarity index 88% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysUserRoleDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysUserRoleDO.java index ac18d8c9c2..9c298ad9d7 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/permission/SysUserRoleDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysUserRoleDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission; +package cn.iocoder.yudao.module.system.dal.dataobject.permission; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsChannelDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsChannelDO.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsChannelDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsChannelDO.java index 87b67cd7fe..57fe9789e2 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsChannelDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsChannelDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms; +package cn.iocoder.yudao.module.system.dal.dataobject.sms; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsLogDO.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsLogDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsLogDO.java index 6567ee215f..a6daa0c742 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsLogDO.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms; +package cn.iocoder.yudao.module.system.dal.dataobject.sms; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsReceiveStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsSendStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsTemplateDO.java similarity index 92% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsTemplateDO.java index 9e1dd35c71..72fcafcd97 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsTemplateDO.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms; +package cn.iocoder.yudao.module.system.dal.dataobject.sms; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsTemplateTypeEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java similarity index 90% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java index d1772a1324..336211ed1b 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social; +package cn.iocoder.yudao.module.system.dal.dataobject.social; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableId; @@ -9,7 +9,7 @@ import lombok.*; /** * 社交用户 - * 通过 {@link SysSocialUserDO#getUserId()} 关联到对应的 {@link SysUserDO} + * 通过 {@link SysSocialUserDO#getUserId()} 关联到对应的 {@link UserDO} * * @author weir */ diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/tenant/SysTenantDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/SysTenantDO.java similarity index 91% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/tenant/SysTenantDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/SysTenantDO.java index c0b5298c88..ebff2004ce 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/tenant/SysTenantDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/SysTenantDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant; +package cn.iocoder.yudao.module.system.dal.dataobject.tenant; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/user/SysUserDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/UserDO.java similarity index 90% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/user/SysUserDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/UserDO.java index bb5e6854ce..0f9d6e3f3f 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/user/SysUserDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/UserDO.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user; +package cn.iocoder.yudao.module.system.dal.dataobject.user; -import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; @@ -24,7 +24,7 @@ import java.util.Set; @Builder @NoArgsConstructor @AllArgsConstructor -public class SysUserDO extends TenantBaseDO { +public class UserDO extends TenantBaseDO { /** * 用户ID diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/auth/SysUserSessionCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionCoreMapper.java similarity index 56% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/auth/SysUserSessionCoreMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionCoreMapper.java index 69b5c5acbb..a589d1e9e2 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/auth/SysUserSessionCoreMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionCoreMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.auth; +package cn.iocoder.yudao.module.system.dal.mysql.auth; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java index 7d231be885..23e0ba1e5d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysDeptCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptCoreMapper.java similarity index 56% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysDeptCoreMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptCoreMapper.java index ab98c65128..489733bbf5 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysDeptCoreMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptCoreMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dept; +package cn.iocoder.yudao.module.system.dal.mysql.dept; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java index 0bd2d024c0..e2d0678e7d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysPostCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostCoreMapper.java similarity index 56% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysPostCoreMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostCoreMapper.java index 94a4747e92..5ce2d21523 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dept/SysPostCoreMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostCoreMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dept; +package cn.iocoder.yudao.module.system.dal.mysql.dept; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java index b3657d1f40..1a5665863e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java index c8abca94b6..602a77342a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java @@ -3,11 +3,12 @@ package cn.iocoder.yudao.module.system.dal.mysql.dict; import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.Arrays; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java index f26023388c..8473caccf9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.mysql.logger; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/logger/SysLoginLogCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogCoreMapper.java similarity index 55% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/logger/SysLoginLogCoreMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogCoreMapper.java index e6dd1ff51c..6ef40e8346 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/logger/SysLoginLogCoreMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogCoreMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.logger; +package cn.iocoder.yudao.module.system.dal.mysql.logger; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/package-info.java new file mode 100644 index 0000000000..b47bbaac1f --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.system.dal.mysql; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysRoleCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleCoreMapper.java similarity index 54% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysRoleCoreMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleCoreMapper.java index 69196d8f74..51c3cb2eeb 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysRoleCoreMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleCoreMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.permission; +package cn.iocoder.yudao.module.system.dal.mysql.permission; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java index 45af3afad6..659f115884 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import org.springframework.lang.Nullable; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysUserRoleCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleCoreMapper.java similarity index 70% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysUserRoleCoreMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleCoreMapper.java index 1327efde96..6139498e62 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/permission/SysUserRoleCoreMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleCoreMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.permission; +package cn.iocoder.yudao.module.system.dal.mysql.permission; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java index 71b25f2d17..6578515bdf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java index 8d183fcb90..49a7d9f40c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java index ffed029128..86f54dc244 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java index a2559bd476..c4ba4071a9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java @@ -1,23 +1,27 @@ package cn.iocoder.yudao.module.system.dal.mysql.sms; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import java.util.Date; import java.util.List; @Mapper public interface SysSmsTemplateMapper extends BaseMapperX { + @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1") + Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); + default SysSmsTemplateDO selectByCode(String code) { return selectOne(SysSmsTemplateDO::getCode, code); } - // TODO 这种参数都一样的得想办法封装一下 default PageResult selectPage(SmsTemplatePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(SysSmsTemplateDO::getType, reqVO.getType()) diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SysSocialUserMapper.java similarity index 80% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserCoreMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SysSocialUserMapper.java index 727c38e678..dc92ddb304 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserCoreMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SysSocialUserMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social; +package cn.iocoder.yudao.module.system.dal.mysql.social; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -9,7 +9,7 @@ import java.util.Collection; import java.util.List; @Mapper -public interface SysSocialUserCoreMapper extends BaseMapperX { +public interface SysSocialUserMapper extends BaseMapperX { default List selectListByTypeAndUnionId(Integer userType, Collection types, String unionId) { return selectList(new QueryWrapper().eq("user_type", userType) diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/tenant/SysTenantCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantCoreMapper.java similarity index 55% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/tenant/SysTenantCoreMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantCoreMapper.java index 197f893fac..de7656f400 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/tenant/SysTenantCoreMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantCoreMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.tenant; +package cn.iocoder.yudao.module.system.dal.mysql.tenant; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java index d92f660f94..f913d625df 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.tenant; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java deleted file mode 100644 index 1d7eb74bf2..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/SysUserMapper.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.user; - -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserExportReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import jodd.util.StringPool; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; - -@Mapper -public interface SysUserMapper extends BaseMapperX { - - default SysUserDO selectByUsername(String username) { - return selectOne(new LambdaQueryWrapper().eq(SysUserDO::getUsername, username)); - } - - default SysUserDO selectByEmail(String email) { - return selectOne(new LambdaQueryWrapper().eq(SysUserDO::getEmail, email)); - } - - default SysUserDO selectByMobile(String mobile) { - return selectOne(new LambdaQueryWrapper().eq(SysUserDO::getMobile, mobile)); - } - - default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(SysUserDO::getUsername, reqVO.getUsername()) - .likeIfPresent(SysUserDO::getMobile, reqVO.getMobile()) - .eqIfPresent(SysUserDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(SysUserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) - .inIfPresent(SysUserDO::getDeptId, deptIds)); - } - - default List selectList(UserExportReqVO reqVO, Collection deptIds) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(SysUserDO::getUsername, reqVO.getUsername()) - .likeIfPresent(SysUserDO::getMobile, reqVO.getMobile()) - .eqIfPresent(SysUserDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(SysUserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) - .inIfPresent(SysUserDO::getDeptId, deptIds)); - } - - default List selectListByNickname(String nickname) { - return selectList(new LambdaQueryWrapperX().like(SysUserDO::getNickname, nickname)); - } - - default List selectListByUsername(String username) { - return selectList(new LambdaQueryWrapperX().like(SysUserDO::getUsername, username)); - } - - // TODO 芋艿:可废弃该方法 - default List selectListByDepartIdAndPostId(Long departId, Long postId) { - return selectList(new LambdaQueryWrapperX() - .eq(SysUserDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) - .eq(SysUserDO::getDeptId, departId) - // TODO @jason: 封装一个 StringUtils .toString 。如果空的时候,设置为 null。会更简洁 - .likeIfPresent(SysUserDO::getPostIds, Optional.ofNullable(postId).map(t -> String.valueOf(postId)).orElse(StringPool.EMPTY))); - } - - default List selectListByStatus(Integer status) { - return selectList(SysUserDO::getStatus, status); - } - - default List selectListByDeptIds(Collection deptIds) { - return selectList(SysUserDO::getDeptId, deptIds); - } - -} - diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/UserMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/UserMapper.java new file mode 100644 index 0000000000..7cd0fe426a --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/UserMapper.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.system.dal.mysql.user; + +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import jodd.util.StringPool; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +@Mapper +public interface UserMapper extends BaseMapperX { + + default UserDO selectByUsername(String username) { + return selectOne(new LambdaQueryWrapper().eq(UserDO::getUsername, username)); + } + + default UserDO selectByEmail(String email) { + return selectOne(new LambdaQueryWrapper().eq(UserDO::getEmail, email)); + } + + default UserDO selectByMobile(String mobile) { + return selectOne(new LambdaQueryWrapper().eq(UserDO::getMobile, mobile)); + } + + default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(UserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(UserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(UserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(UserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) + .inIfPresent(UserDO::getDeptId, deptIds)); + } + + default List selectList(UserExportReqVO reqVO, Collection deptIds) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(UserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(UserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(UserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(UserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) + .inIfPresent(UserDO::getDeptId, deptIds)); + } + + default List selectListByNickname(String nickname) { + return selectList(new LambdaQueryWrapperX().like(UserDO::getNickname, nickname)); + } + + default List selectListByUsername(String username) { + return selectList(new LambdaQueryWrapperX().like(UserDO::getUsername, username)); + } + + default List selectListByStatus(Integer status) { + return selectList(UserDO::getStatus, status); + } + + default List selectListByDeptIds(Collection deptIds) { + return selectList(UserDO::getDeptId, deptIds); + } + +} + diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java index 16baa4638f..78b1ca24f8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java @@ -1,6 +1,10 @@ package cn.iocoder.yudao.module.system.dal.redis; import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import me.zhyd.oauth.model.AuthUser; + +import java.time.Duration; import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; @@ -14,5 +18,17 @@ public interface SysRedisKeyConstants { RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存", "captcha_code:%s", // 参数为 uuid STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + + RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登录用户的缓存", + "login_user:%s", // 参数为 sessionId + STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + + RedisKeyDefine SOCIAL_AUTH_USER = new RedisKeyDefine("社交登陆的授权用户", + "social_auth_user:%d:%s", // 参数为 type,code + STRING, AuthUser.class, Duration.ofDays(1)); + + RedisKeyDefine SOCIAL_AUTH_STATE = new RedisKeyDefine("社交登陆的 state", + "social_auth_state:%s", // 参数为 state + STRING, String.class, Duration.ofHours(24)); // 值为 state } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyCoreConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyCoreConstants.java new file mode 100644 index 0000000000..735adcc917 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyCoreConstants.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.system.dal.redis; + +import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import me.zhyd.oauth.model.AuthUser; + +import java.time.Duration; + +import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; + +/** + * System Redis Key 枚举类 + * + * @author 芋道源码 + */ +public interface SysRedisKeyCoreConstants { + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/auth/SysLoginUserCoreRedisDAO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java similarity index 85% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/auth/SysLoginUserCoreRedisDAO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java index 921492c9d6..ead1d0287e 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/auth/SysLoginUserCoreRedisDAO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth; +package cn.iocoder.yudao.module.system.dal.redis.auth; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.security.config.SecurityProperties; @@ -8,7 +8,7 @@ import org.springframework.stereotype.Repository; import javax.annotation.Resource; -import static cn.iocoder.yudao.coreservice.modules.system.dal.redis.SysRedisKeyCoreConstants.LOGIN_USER; +import static cn.iocoder.yudao.module.system.dal.redis.SysRedisKeyConstants.LOGIN_USER; /** * {@link LoginUser} 的 RedisDAO @@ -16,7 +16,7 @@ import static cn.iocoder.yudao.coreservice.modules.system.dal.redis.SysRedisKeyC * @author 芋道源码 */ @Repository -public class SysLoginUserCoreRedisDAO { +public class LoginUserRedisDAO { @Resource private StringRedisTemplate stringRedisTemplate; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/social/SocialAuthUserRedisDAO.java similarity index 83% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/social/SocialAuthUserRedisDAO.java index 0c033f89e2..12cdc94869 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/social/SocialAuthUserRedisDAO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.dal.redis.social; +package cn.iocoder.yudao.module.system.dal.redis.social; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import me.zhyd.oauth.model.AuthCallback; @@ -8,7 +8,8 @@ import org.springframework.stereotype.Repository; import javax.annotation.Resource; -import static cn.iocoder.yudao.coreservice.modules.system.dal.redis.SysRedisKeyCoreConstants.SOCIAL_AUTH_USER; +import static cn.iocoder.yudao.module.system.dal.redis.SysRedisKeyConstants.SOCIAL_AUTH_USER; + /** * 社交 {@link me.zhyd.oauth.model.AuthUser} 的 RedisDAO @@ -16,7 +17,7 @@ import static cn.iocoder.yudao.coreservice.modules.system.dal.redis.SysRedisKeyC * @author 芋道源码 */ @Repository -public class SysSocialAuthUserRedisDAO { +public class SocialAuthUserRedisDAO { @Resource private StringRedisTemplate stringRedisTemplate; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysDictTypeConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysDictTypeConstants.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index 766e0fe5c7..fc9cb3385c 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysDictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums; +package cn.iocoder.yudao.module.system.enums; /** * System 字典类型的枚举类 * * @author 芋道源码 */ -public interface SysDictTypeConstants { +public interface DictTypeConstants { String USER_TYPE = "user_type"; // 用户类型 String COMMON_STATUS = "sys_common_status"; // 系统状态 diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/common/SysSexEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SysSexEnum.java similarity index 83% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/common/SysSexEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SysSexEnum.java index a7b0a9c29e..7fd76247a4 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/common/SysSexEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SysSexEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums.common; +package cn.iocoder.yudao.module.system.enums.common; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginLogTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java similarity index 89% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginLogTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java index 5a844f1818..ff29ab558f 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginLogTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums.logger; +package cn.iocoder.yudao.module.system.enums.logger; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginResultEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java similarity index 88% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginResultEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java index 290931038c..f1c8356ff4 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginResultEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums.logger; +package cn.iocoder.yudao.module.system.enums.logger; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsReceiveStatusEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsReceiveStatusEnum.java similarity index 84% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsReceiveStatusEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsReceiveStatusEnum.java index 48fd0c84c4..2b75a45e76 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsReceiveStatusEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsReceiveStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums.sms; +package cn.iocoder.yudao.module.system.enums.sms; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsSendStatusEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsSendStatusEnum.java similarity index 85% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsSendStatusEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsSendStatusEnum.java index f30e613018..ea57fa8cc3 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsSendStatusEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsSendStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums.sms; +package cn.iocoder.yudao.module.system.enums.sms; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsTemplateTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsTemplateTypeEnum.java similarity index 84% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsTemplateTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsTemplateTypeEnum.java index b3811e5ecd..5f853e2d75 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsTemplateTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsTemplateTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.enums.sms; +package cn.iocoder.yudao.module.system.enums.sms; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java index cd67fdc828..81bd82068b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.framework.datapermission.config; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.datapermission.core.dept.rule.DeptDataPermissionRuleCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,7 +17,7 @@ public class DataPermissionConfiguration { @Bean public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { return rule -> { - rule.addDeptColumn(SysUserDO.class); + rule.addDeptColumn(UserDO.class); rule.addDeptColumn(SysDeptDO.class, "id"); }; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/DictDataRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/DictDataRefreshConsumer.java index 6fe1c7c6a7..e466f96b22 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/DictDataRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/dict/DictDataRefreshConsumer.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.mq.consumer.dict; -import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; import cn.iocoder.yudao.module.system.mq.message.dict.DictDataRefreshMessage; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -18,12 +18,12 @@ import javax.annotation.Resource; public class DictDataRefreshConsumer extends AbstractChannelMessageListener { @Resource - private SysDictDataCoreService dictDataCoreService; + private DictDataService dictDataService; @Override public void onMessage(DictDataRefreshMessage message) { log.info("[onMessage][收到 DictData 刷新消息]"); - dictDataCoreService.initLocalCache(); + dictDataService.initLocalCache(); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java index 2239eecc18..6779549dbd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.mq.consumer.sms; -import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; +import cn.iocoder.yudao.module.system.service.sms.SysSmsSendService; import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -9,20 +9,20 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SysSmsSendMessage} 的消费者 + * 针对 {@link SmsSendMessage} 的消费者 * * @author zzf * @date 2021/3/9 16:35 */ @Component @Slf4j -public class SmsSendConsumer extends AbstractStreamMessageListener { +public class SmsSendConsumer extends AbstractStreamMessageListener { @Resource - private SysSmsCoreService smsCoreService; + private SysSmsSendService smsCoreService; @Override - public void onMessage(SysSmsSendMessage message) { + public void onMessage(SmsSendMessage message) { log.info("[onMessage][消息内容({})]", message); smsCoreService.doSendSms(message); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java index 52840189a8..02bc599842 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.mq.consumer.sms; import cn.iocoder.yudao.module.system.mq.message.sms.SmsTemplateRefreshMessage; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.module.system.service.sms.SmsTemplateService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -18,12 +18,12 @@ import javax.annotation.Resource; public class SmsTemplateRefreshConsumer extends AbstractChannelMessageListener { @Resource - private SysSmsTemplateCoreService smsTemplateCoreService; + private SmsTemplateService smsTemplateService; @Override public void onMessage(SmsTemplateRefreshMessage message) { log.info("[onMessage][收到 SmsTemplate 刷新消息]"); - smsTemplateCoreService.initLocalCache(); + smsTemplateService.initLocalCache(); } } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/sms/SysSmsSendMessage.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsSendMessage.java similarity index 88% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/sms/SysSmsSendMessage.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsSendMessage.java index 19c7d044cd..42a32623a9 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/sms/SysSmsSendMessage.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sms/SmsSendMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.mq.message.sms; +package cn.iocoder.yudao.module.system.mq.message.sms; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage; @@ -15,7 +15,7 @@ import java.util.List; */ @Data @EqualsAndHashCode(callSuper = true) -public class SysSmsSendMessage extends AbstractStreamMessage { +public class SmsSendMessage extends AbstractStreamMessage { /** * 短信日志编号 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/package-info.java new file mode 100644 index 0000000000..255ab310c9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package cn.iocoder.yudao.module.system.mq.producer; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SmsProducer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SmsProducer.java index 117e666b9e..e14fb953bf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SmsProducer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sms/SmsProducer.java @@ -1,12 +1,15 @@ package cn.iocoder.yudao.module.system.mq.producer.sms; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.module.system.mq.message.sms.SmsChannelRefreshMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; import cn.iocoder.yudao.module.system.mq.message.sms.SmsTemplateRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.List; /** * Sms 短信相关消息的 Producer @@ -37,4 +40,20 @@ public class SmsProducer { redisMQTemplate.send(message); } + /** + * 发送 {@link SmsSendMessage} 消息 + * + * @param logId 短信日志编号 + * @param mobile 手机号 + * @param channelId 渠道编号 + * @param apiTemplateId 短信模板编号 + * @param templateParams 短信模板参数 + */ + public void sendSmsSendMessage(Long logId, String mobile, + Long channelId, String apiTemplateId, List> templateParams) { + SmsSendMessage message = new SmsSendMessage().setLogId(logId).setMobile(mobile); + message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams); + redisMQTemplate.send(message); + } + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java index a0a45e7d71..1d1df61392 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java @@ -1,33 +1,30 @@ package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthLoginReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLogin2ReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLoginReqVO; -import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; -import cn.iocoder.yudao.module.system.service.common.CaptchaService; -import cn.iocoder.yudao.module.system.service.dept.PostService; -import cn.iocoder.yudao.module.system.service.permission.PermissionService; -import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthLoginReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLogin2ReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLoginReqVO; +import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; +import cn.iocoder.yudao.module.system.service.common.CaptchaService; +import cn.iocoder.yudao.module.system.service.logger.LoginLogService; +import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; +import cn.iocoder.yudao.module.system.service.social.SocialUserService; +import cn.iocoder.yudao.module.system.service.user.UserService; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthUser; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; @@ -40,14 +37,12 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; import javax.annotation.Resource; -import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static java.util.Collections.singleton; /** @@ -63,27 +58,24 @@ public class AuthServiceImpl implements AuthService { @Lazy // 延迟加载,因为存在相互依赖的问题 private AuthenticationManager authenticationManager; - @Resource + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 private UserService userService; @Resource - private SysUserCoreService userCoreService; - @Resource private PermissionService permissionService; @Resource private CaptchaService captchaService; @Resource - private SysLoginLogCoreService loginLogCoreService; + private LoginLogService loginLogService; @Resource - private SysUserSessionCoreService userSessionCoreService; + private UserSessionService userSessionService; @Resource - private PostService postService; - @Resource - private SysSocialCoreService socialService; + private SocialUserService socialService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 获取 username 对应的 SysUserDO - SysUserDO user = userService.getUserByUsername(username); + UserDO user = userService.getUserByUsername(username); if (user == null) { throw new UsernameNotFoundException(username); } @@ -94,7 +86,7 @@ public class AuthServiceImpl implements AuthService { @Override public LoginUser mockLogin(Long userId) { // 获取用户编号对应的 SysUserDO - SysUserDO user = userCoreService.getUser(userId); + UserDO user = userService.getUser(userId); if (user == null) { throw new UsernameNotFoundException(String.valueOf(userId)); } @@ -113,14 +105,7 @@ public class AuthServiceImpl implements AuthService { LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); // 缓存登陆用户到 Redis 中,返回 sessionId 编号 - return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); - } - - private List getUserPosts(Set postIds) { - if (CollUtil.isEmpty(postIds)) { - return Collections.emptyList(); - } - return convertList(postService.getPosts(postIds), SysPostDO::getCode); + return userSessionService.createUserSession(loginUser, userIp, userAgent); } private void verifyCaptcha(String username, String captchaUUID, String captchaCode) { @@ -175,9 +160,9 @@ public class AuthServiceImpl implements AuthService { private void createLoginLog(String username, LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { // 获得用户 - SysUserDO user = userService.getUserByUsername(username); + UserDO user = userService.getUserByUsername(username); // 插入登录日志 - SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); reqDTO.setLogType(logTypeEnum.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); if (user != null) { @@ -188,7 +173,7 @@ public class AuthServiceImpl implements AuthService { reqDTO.setUserAgent(ServletUtils.getUserAgent()); reqDTO.setUserIp(ServletUtils.getClientIP()); reqDTO.setResult(loginResult.getResult()); - loginLogCoreService.createLoginLog(reqDTO); + loginLogService.createLoginLog(reqDTO); // 更新最后登录时间 if (user != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { userService.updateUserLogin(user.getId(), ServletUtils.getClientIP()); @@ -219,7 +204,7 @@ public class AuthServiceImpl implements AuthService { } // 自动登录 - SysUserDO user = userCoreService.getUser(socialUsers.get(0).getUserId()); + UserDO user = userService.getUser(socialUsers.get(0).getUserId()); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -232,7 +217,7 @@ public class AuthServiceImpl implements AuthService { socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); // 缓存登录用户到 Redis 中,返回 sessionId 编号 - return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); + return userSessionService.createUserSession(loginUser, userIp, userAgent); } @Override @@ -248,7 +233,7 @@ public class AuthServiceImpl implements AuthService { socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); // 缓存登录用户到 Redis 中,返回 sessionId 编号 - return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); + return userSessionService.createUserSession(loginUser, userIp, userAgent); } @Override @@ -264,12 +249,12 @@ public class AuthServiceImpl implements AuthService { @Override public void logout(String token) { // 查询用户信息 - LoginUser loginUser = userSessionCoreService.getLoginUser(token); + LoginUser loginUser = userSessionService.getLoginUser(token); if (loginUser == null) { return; } // 删除 session - userSessionCoreService.deleteUserSession(token); + userSessionService.deleteUserSession(token); // 记录登出日志 this.createLogoutLog(loginUser.getId(), loginUser.getUsername()); } @@ -280,7 +265,7 @@ public class AuthServiceImpl implements AuthService { } private void createLogoutLog(Long userId, String username) { - SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); reqDTO.setUserId(userId); @@ -289,13 +274,13 @@ public class AuthServiceImpl implements AuthService { reqDTO.setUserAgent(ServletUtils.getUserAgent()); reqDTO.setUserIp(ServletUtils.getClientIP()); reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); - loginLogCoreService.createLoginLog(reqDTO); + loginLogService.createLoginLog(reqDTO); } @Override public LoginUser verifyTokenAndRefresh(String token) { // 获得 LoginUser - LoginUser loginUser = userSessionCoreService.getLoginUser(token); + LoginUser loginUser = userSessionService.getLoginUser(token); if (loginUser == null) { return null; } @@ -306,23 +291,23 @@ public class AuthServiceImpl implements AuthService { private LoginUser refreshLoginUserCache(String token, LoginUser loginUser) { // 每 1/3 的 Session 超时时间,刷新 LoginUser 缓存 if (System.currentTimeMillis() - loginUser.getUpdateTime().getTime() < - userSessionCoreService.getSessionTimeoutMillis() / 3) { + userSessionService.getSessionTimeoutMillis() / 3) { return loginUser; } // 重新加载 SysUserDO 信息 - SysUserDO user = userCoreService.getUser(loginUser.getId()); + UserDO user = userService.getUser(loginUser.getId()); if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) { throw exception(AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面 } // 刷新 LoginUser 缓存 LoginUser newLoginUser= this.buildLoginUser(user); - userSessionCoreService.refreshUserSession(token, newLoginUser); + userSessionService.refreshUserSession(token, newLoginUser); return newLoginUser; } - private LoginUser buildLoginUser(SysUserDO user) { + private LoginUser buildLoginUser(UserDO user) { LoginUser loginUser = AuthConvert.INSTANCE.convert(user); // 补全字段 loginUser.setDeptId(user.getDeptId()); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java index af318fec4f..ef9e92caab 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java @@ -1,7 +1,8 @@ package cn.iocoder.yudao.module.system.service.auth; +import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; /** @@ -26,4 +27,44 @@ public interface UserSessionService { **/ long clearSessionTimeout(); + /** + * 创建在线用户 Session + * + * @param loginUser 登录用户 + * @param userIp 用户 IP + * @param userAgent 用户 UA + * @return Session 编号 + */ + String createUserSession(LoginUser loginUser, String userIp, String userAgent); + + /** + * 刷新在线用户 Session 的更新时间 + * + * @param sessionId Session 编号 + * @param loginUser 登录用户 + */ + void refreshUserSession(String sessionId, LoginUser loginUser); + + /** + * 删除在线用户 Session + * + * @param sessionId Session 编号 + */ + void deleteUserSession(String sessionId); + + /** + * 获得 Session 编号对应的在线用户 + * + * @param sessionId Session 编号 + * @return 在线用户 + */ + LoginUser getLoginUser(String sessionId); + + /** + * 获得 Session 超时时间,单位:毫秒 + * + * @return 超时时间 + */ + Long getSessionTimeoutMillis(); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java index 23d68cd6e3..cadc899d5d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java @@ -1,17 +1,20 @@ package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.security.config.SecurityProperties; +import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; +import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.redis.auth.LoginUserRedisDAO; +import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import com.google.common.collect.Lists; @@ -19,13 +22,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.time.Duration; +import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; /** * 在线用户 Session Service 实现类 @@ -38,20 +40,24 @@ public class UserSessionServiceImpl implements UserSessionService { @Resource private SysUserSessionMapper userSessionMapper; + @Resource private UserService userService; @Resource - private SysLoginLogCoreService loginLogCoreService; + private LoginLogService loginLogService; @Resource - private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO; + private LoginUserRedisDAO loginUserCoreRedisDAO; + + @Resource + private SecurityProperties securityProperties; @Override public PageResult getUserSessionPage(UserSessionPageReqVO reqVO) { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUsername())) { - userIds = convertSet(userService.getUsersByUsername(reqVO.getUsername()), SysUserDO::getId); + userIds = convertSet(userService.getUsersByUsername(reqVO.getUsername()), UserDO::getId); if (CollUtil.isEmpty(userIds)) { return PageResult.empty(); } @@ -80,7 +86,7 @@ public class UserSessionServiceImpl implements UserSessionService { private void createTimeoutLogoutLog(Collection timeoutSessionDOS) { for (SysUserSessionDO timeoutSessionDO : timeoutSessionDOS) { - SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_TIMEOUT.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); reqDTO.setUserId(timeoutSessionDO.getUserId()); @@ -89,8 +95,66 @@ public class UserSessionServiceImpl implements UserSessionService { reqDTO.setUserAgent(timeoutSessionDO.getUserAgent()); reqDTO.setUserIp(timeoutSessionDO.getUserIp()); reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); - loginLogCoreService.createLoginLog(reqDTO); + loginLogService.createLoginLog(reqDTO); } } + @Override + public String createUserSession(LoginUser loginUser, String userIp, String userAgent) { + // 生成 Session 编号 + String sessionId = generateSessionId(); + // 写入 Redis 缓存 + loginUser.setUpdateTime(new Date()); + loginUserCoreRedisDAO.set(sessionId, loginUser); + // 写入 DB 中 + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + .userId(loginUser.getId()).userType(loginUser.getUserType()) + .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) + .sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))) + .build(); + userSessionMapper.insert(userSession); + // 返回 Session 编号 + return sessionId; + } + + @Override + public void refreshUserSession(String sessionId, LoginUser loginUser) { + // 写入 Redis 缓存 + loginUser.setUpdateTime(new Date()); + loginUserCoreRedisDAO.set(sessionId, loginUser); + // 更新 DB 中 + SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build(); + updateObj.setUsername(loginUser.getUsername()); + updateObj.setUpdateTime(new Date()); + updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))); + userSessionMapper.updateById(updateObj); + } + + @Override + public void deleteUserSession(String sessionId) { + // 删除 Redis 缓存 + loginUserCoreRedisDAO.delete(sessionId); + // 删除 DB 记录 + userSessionMapper.deleteById(sessionId); + } + + @Override + public LoginUser getLoginUser(String sessionId) { + return loginUserCoreRedisDAO.get(sessionId); + } + + @Override + public Long getSessionTimeoutMillis() { + return securityProperties.getSessionTimeout().toMillis(); + } + + /** + * 生成 Session 编号,目前采用 UUID 算法 + * + * @return Session 编号 + */ + private static String generateSessionId() { + return IdUtil.fastSimpleUUID(); + } + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java index e8397b542a..33ef52f8e5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.service.dept; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import java.util.List; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java index 2f9c1a7139..bd269d9cc2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqV import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dept.DeptConvert; import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; import com.google.common.collect.ImmutableMap; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java index 73e9759b72..5e2dc33e7c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostCreateRe import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; import org.springframework.lang.Nullable; import java.util.Collection; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java index 971743a29d..a498ce3dcb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqV import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dept.PostConvert; import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysDeptCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptCoreService.java similarity index 90% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysDeptCoreService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptCoreService.java index e963e51e0d..92c0fdbc0c 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysDeptCoreService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptCoreService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.dept; +package cn.iocoder.yudao.module.system.service.dept; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import java.util.Collection; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysPostCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostCoreService.java similarity index 84% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysPostCoreService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostCoreService.java index 14a0653adb..5ce996ed50 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/SysPostCoreService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostCoreService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.dept; +package cn.iocoder.yudao.module.system.service.dept; import java.util.Collection; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysDeptCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysDeptCoreServiceImpl.java similarity index 74% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysDeptCoreServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysDeptCoreServiceImpl.java index 4cfa49ed22..032e5e3789 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysDeptCoreServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysDeptCoreServiceImpl.java @@ -1,22 +1,21 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.dept.impl; +package cn.iocoder.yudao.module.system.service.dept.impl; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dept.SysDeptCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptCoreMapper; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Collection; import java.util.List; import java.util.Map; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.DEPT_NOT_ENABLE; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.DEPT_NOT_FOUND; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.DEPT_NOT_ENABLE; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.DEPT_NOT_FOUND; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysPostCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysPostCoreServiceImpl.java similarity index 71% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysPostCoreServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysPostCoreServiceImpl.java index 0e2b2b928f..d0bc198743 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dept/impl/SysPostCoreServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysPostCoreServiceImpl.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.dept.impl; +package cn.iocoder.yudao.module.system.service.dept.impl; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dept.SysPostCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysPostCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostCoreMapper; +import cn.iocoder.yudao.module.system.service.dept.SysPostCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.springframework.stereotype.Service; @@ -13,8 +13,8 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.POST_NOT_ENABLE; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.POST_NOT_FOUND; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.POST_NOT_ENABLE; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.POST_NOT_FOUND; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java index c7b60e0ad0..8d20c5aab1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java @@ -1,12 +1,14 @@ package cn.iocoder.yudao.module.system.service.dict; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import java.util.Collection; import java.util.List; /** @@ -14,7 +16,12 @@ import java.util.List; * * @author ruoyi */ -public interface DictDataService { +public interface DictDataService extends DictDataFrameworkService { + + /** + * 初始化字典数据的本地缓存 + */ + void initLocalCache(); /** * 创建字典数据 @@ -77,4 +84,14 @@ public interface DictDataService { */ int countByDictType(String dictType); + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validDictDatas(String dictType, Collection values); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java index 0d25f87ca5..b483f41675 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java @@ -1,27 +1,36 @@ package cn.iocoder.yudao.module.system.service.dict; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dict.DictDataConvert; +import cn.iocoder.yudao.module.system.convert.dict.SysDictDataCoreConvert; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictDataMapper; import cn.iocoder.yudao.module.system.mq.producer.dict.DictDataProducer; -import cn.iocoder.yudao.module.system.service.dict.DictDataService; -import cn.iocoder.yudao.module.system.service.dict.DictTypeService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableTable; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import javax.annotation.PostConstruct; import javax.annotation.Resource; -import java.util.*; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.List; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 字典数据 Service 实现类 @@ -39,6 +48,12 @@ public class DictDataServiceImpl implements DictDataService { .comparing(SysDictDataDO::getDictType) .thenComparingInt(SysDictDataDO::getSort); + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + @Resource private DictTypeService dictTypeService; @@ -48,6 +63,48 @@ public class DictDataServiceImpl implements DictDataService { @Resource private DictDataProducer dictDataProducer; + /** + * 字典数据缓存,第二个 key 使用 label + * + * key1:字典类型 dictType + * key2:字典标签 label + */ + private ImmutableTable labelDictDataCache; + /** + * 字典数据缓存,第二个 key 使用 value + * + * key1:字典类型 dictType + * key2:字典值 value + */ + private ImmutableTable valueDictDataCache; + /** + * 缓存字典数据的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Override + @PostConstruct + public synchronized void initLocalCache() { + // 获取字典数据列表,如果有更新 + List dataList = loadDictDataIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(dataList)) { + return; + } + + // 构建缓存 + ImmutableTable.Builder labelDictDataBuilder = ImmutableTable.builder(); + ImmutableTable.Builder valueDictDataBuilder = ImmutableTable.builder(); + dataList.forEach(dictData -> { + labelDictDataBuilder.put(dictData.getDictType(), dictData.getLabel(), dictData); + valueDictDataBuilder.put(dictData.getDictType(), dictData.getValue(), dictData); + }); + labelDictDataCache = labelDictDataBuilder.build(); + valueDictDataCache = valueDictDataBuilder.build(); + assert dataList.size() > 0; // 断言,避免告警 + maxUpdateTime = dataList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initLocalCache][缓存字典数据,数量为:{}]", dataList.size()); + } + /** * 如果字典数据发生变化,从数据库中获取最新的全量字典数据。 * 如果未发生变化,则返回空 @@ -69,6 +126,11 @@ public class DictDataServiceImpl implements DictDataService { return dictDataMapper.selectList(); } + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + @Override public List getDictDatas() { List list = dictDataMapper.selectList(); @@ -93,13 +155,30 @@ public class DictDataServiceImpl implements DictDataService { return dictDataMapper.selectById(id); } + @Override + public DictDataRespDTO getDictDataFromCache(String type, String value) { + return SysDictDataCoreConvert.INSTANCE.convert02(valueDictDataCache.get(type, value)); + } + + @Override + public DictDataRespDTO parseDictDataFromCache(String type, String label) { + return SysDictDataCoreConvert.INSTANCE.convert02(labelDictDataCache.get(type, label)); + } + + @Override + public List listDictDatasFromCache(String type) { + return SysDictDataCoreConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values()); + } + @Override public Long createDictData(DictDataCreateReqVO reqVO) { // 校验正确性 - this.checkCreateOrUpdate(null, reqVO.getValue(), reqVO.getDictType()); + checkCreateOrUpdate(null, reqVO.getValue(), reqVO.getDictType()); + // 插入字典类型 SysDictDataDO dictData = DictDataConvert.INSTANCE.convert(reqVO); dictDataMapper.insert(dictData); + // 发送刷新消息 dictDataProducer.sendDictDataRefreshMessage(); return dictData.getId(); @@ -108,10 +187,12 @@ public class DictDataServiceImpl implements DictDataService { @Override public void updateDictData(DictDataUpdateReqVO reqVO) { // 校验正确性 - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getValue(), reqVO.getDictType()); + checkCreateOrUpdate(reqVO.getId(), reqVO.getValue(), reqVO.getDictType()); + // 更新字典类型 SysDictDataDO updateObj = DictDataConvert.INSTANCE.convert(reqVO); dictDataMapper.updateById(updateObj); + // 发送刷新消息 dictDataProducer.sendDictDataRefreshMessage(); } @@ -119,9 +200,11 @@ public class DictDataServiceImpl implements DictDataService { @Override public void deleteDictData(Long id) { // 校验是否存在 - this.checkDictDataExists(id); + checkDictDataExists(id); + // 删除字典数据 dictDataMapper.deleteById(id); + // 发送刷新消息 dictDataProducer.sendDictDataRefreshMessage(); } @@ -178,4 +261,22 @@ public class DictDataServiceImpl implements DictDataService { } } + @Override + public void validDictDatas(String dictType, Collection values) { + if (CollUtil.isEmpty(values)) { + return; + } + ImmutableMap dictDataMap = valueDictDataCache.row(dictType); + // 校验 + values.forEach(value -> { + SysDictDataDO dictData = dictDataMap.get(value); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictData.getStatus())) { + throw exception(DICT_DATA_NOT_ENABLE, dictData.getLabel()); + } + }); + } + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java index 222269b511..b9bcaf61e8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java @@ -54,7 +54,7 @@ public class DictTypeServiceImpl implements DictTypeService { @Override public Long createDictType(DictTypeCreateReqVO reqVO) { // 校验正确性 - this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getType()); + checkCreateOrUpdate(null, reqVO.getName(), reqVO.getType()); // 插入字典类型 DictTypeDO dictType = DictTypeConvert.INSTANCE.convert(reqVO); dictTypeMapper.insert(dictType); @@ -64,7 +64,7 @@ public class DictTypeServiceImpl implements DictTypeService { @Override public void updateDictType(DictTypeUpdateReqVO reqVO) { // 校验正确性 - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), null); + checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), null); // 更新字典类型 DictTypeDO updateObj = DictTypeConvert.INSTANCE.convert(reqVO); dictTypeMapper.updateById(updateObj); @@ -73,7 +73,7 @@ public class DictTypeServiceImpl implements DictTypeService { @Override public void deleteDictType(Long id) { // 校验是否存在 - DictTypeDO dictType = this.checkDictTypeExists(id); + DictTypeDO dictType = checkDictTypeExists(id); // 校验是否有字典数据 if (dictDataService.countByDictType(dictType.getType()) > 0) { throw exception(DICT_TYPE_HAS_CHILDREN); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java index 7643fe1151..f900f0baec 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java @@ -2,8 +2,9 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; import java.util.List; @@ -28,4 +29,11 @@ public interface LoginLogService { */ List getLoginLogList(LoginLogExportReqVO reqVO); + /** + * 创建登录日志 + * + * @param reqDTO 日志信息 + */ + void createLoginLog(LoginLogCreateReqDTO reqDTO); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java index d2f35aee8b..c352748724 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java @@ -2,9 +2,12 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import cn.iocoder.yudao.module.system.convert.logger.SysLoginLogCoreConvert; import cn.iocoder.yudao.module.system.dal.mysql.logger.LoginLogMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.mysql.logger.SysLoginLogCoreMapper; +import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -29,4 +32,11 @@ public class LoginLogServiceImpl implements LoginLogService { return loginLogMapper.selectList(reqVO); } + @Override + public void createLoginLog(LoginLogCreateReqDTO reqDTO) { + SysLoginLogDO loginLog = SysLoginLogCoreConvert.INSTANCE.convert(reqDTO); + // 插入 + loginLogMapper.insert(loginLog); + } + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java index fab8ddfaa9..d32b0e505b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.system.convert.logger.OperateLogConvert; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; @@ -58,7 +58,7 @@ public class OperateLogServiceImpl implements OperateLogService { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { - userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), UserDO::getId); if (CollUtil.isEmpty(userIds)) { return PageResult.empty(); } @@ -72,7 +72,7 @@ public class OperateLogServiceImpl implements OperateLogService { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { - userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), UserDO::getId); if (CollUtil.isEmpty(userIds)) { return Collections.emptyList(); } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/dto/SysLoginLogCreateReqDTO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/dto/LoginLogCreateReqDTO.java similarity index 91% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/dto/SysLoginLogCreateReqDTO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/dto/LoginLogCreateReqDTO.java index 4dddf9df81..5072053c95 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/dto/SysLoginLogCreateReqDTO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/dto/LoginLogCreateReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.logger.dto; +package cn.iocoder.yudao.module.system.service.logger.dto; import lombok.Data; @@ -13,7 +13,7 @@ import javax.validation.constraints.Size; * @author 芋道源码 */ @Data -public class SysLoginLogCreateReqDTO { +public class LoginLogCreateReqDTO { /** * 日志类型 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java index b8da087304..d68e849930 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java @@ -3,11 +3,11 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMenuMapper; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleMapper; import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java index 0bf13785dd..def01146aa 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleCr import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import org.springframework.lang.Nullable; import java.util.Collection; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index cd8cbe8197..095e87ddba 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePa import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; import cn.iocoder.yudao.module.system.convert.permission.RoleConvert; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum; import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; import cn.iocoder.yudao.module.system.mq.producer.permission.RoleProducer; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysPermissionCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionCoreService.java similarity index 86% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysPermissionCoreService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionCoreService.java index 9f3032965e..5898038c49 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysPermissionCoreService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionCoreService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.permission; +package cn.iocoder.yudao.module.system.service.permission; import java.util.Collection; import java.util.Set; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysRoleCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleCoreService.java similarity index 83% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysRoleCoreService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleCoreService.java index 1b43e42f71..17e8adb871 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/SysRoleCoreService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleCoreService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.permission; +package cn.iocoder.yudao.module.system.service.permission; import java.util.Collection; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysPermissionCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysPermissionCoreServiceImpl.java similarity index 64% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysPermissionCoreServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysPermissionCoreServiceImpl.java index b9618a93d2..100e076af6 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysPermissionCoreServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysPermissionCoreServiceImpl.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.permission.impl; +package cn.iocoder.yudao.module.system.service.permission.impl; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.permission.SysUserRoleCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleCoreMapper; +import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.springframework.stereotype.Service; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysRoleCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysRoleCoreServiceImpl.java similarity index 70% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysRoleCoreServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysRoleCoreServiceImpl.java index ebeb7ea207..865eeb81ea 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/permission/impl/SysRoleCoreServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysRoleCoreServiceImpl.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.permission.impl; +package cn.iocoder.yudao.module.system.service.permission.impl; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.permission.SysRoleCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysRoleCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleCoreMapper; +import cn.iocoder.yudao.module.system.service.permission.SysRoleCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.springframework.stereotype.Service; @@ -13,8 +13,8 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.ROLE_IS_DISABLE; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.ROLE_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.ROLE_IS_DISABLE; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.ROLE_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java index d57a990c8e..f5950a23db 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java index 6c26e82035..ef95af5f26 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannel import cn.iocoder.yudao.module.system.convert.sms.SmsChannelConvert; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsChannelMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java index fcd66e7a1a..42c3457b64 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java @@ -2,10 +2,13 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import java.util.Date; import java.util.List; +import java.util.Map; /** * 短信日志 Service 接口 @@ -15,6 +18,46 @@ import java.util.List; */ public interface SmsLogService { + /** + * 创建短信日志 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param isSend 是否发送 + * @param template 短信模板 + * @param templateContent 短信内容 + * @param templateParams 短信参数 + * @return 发送日志编号 + */ + Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SysSmsTemplateDO template, String templateContent, Map templateParams); + + /** + * 更新日志的发送结果 + * + * @param id 日志编号 + * @param sendCode 发送结果的编码 + * @param sendMsg 发送结果的提示 + * @param apiSendCode 短信 API 发送结果的编码 + * @param apiSendMsg 短信 API 发送失败的提示 + * @param apiRequestId 短信 API 发送返回的唯一请求 ID + * @param apiSerialNo 短信 API 发送返回的序号 + */ + void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo); + + /** + * 更新日志的接收结果 + * + * @param id 日志编号 + * @param success 是否接收成功 + * @param receiveTime 用户接收时间 + * @param apiReceiveCode API 接收结果的编码 + * @param apiReceiveMsg API 接收结果的说明 + */ + void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg); + /** * 获得短信日志分页 * diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java index d09b77e1da..a90f69f09a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java @@ -1,21 +1,27 @@ package cn.iocoder.yudao.module.system.service.sms; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsLogMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsReceiveStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsSendStatusEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Objects; /** * 短信日志 Service 实现类 * * @author zzf - * @date 2021/1/25 9:25 */ @Slf4j @Service @@ -24,6 +30,50 @@ public class SmsLogServiceImpl implements SmsLogService { @Resource private SysSmsLogMapper smsLogMapper; + @Override + public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SysSmsTemplateDO template, String templateContent, Map templateParams) { + SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder(); + // 根据是否要发送,设置状态 + logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus() + : SysSmsSendStatusEnum.IGNORE.getStatus()); + // 设置手机相关字段 + logBuilder.mobile(mobile).userId(userId).userType(userType); + // 设置模板相关字段 + logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); + logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId()); + // 设置渠道相关字段 + logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); + // 设置接收相关字段 + logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + + // 插入数据库 + SysSmsLogDO logDO = logBuilder.build(); + smsLogMapper.insert(logDO); + return logDO.getId(); + } + + @Override + public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, + String apiSendCode, String apiSendMsg, + String apiRequestId, String apiSerialNo) { + SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? + SysSmsSendStatusEnum.SUCCESS : SysSmsSendStatusEnum.FAILURE; + smsLogMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()) + .sendTime(new Date()).sendCode(sendCode).sendMsg(sendMsg) + .apiSendCode(apiSendCode).apiSendMsg(apiSendMsg) + .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build()); + } + + @Override + public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, + String apiReceiveCode, String apiReceiveMsg) { + SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? + SysSmsReceiveStatusEnum.SUCCESS : SysSmsReceiveStatusEnum.FAILURE; + smsLogMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) + .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); + } + @Override public PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO) { return smsLogMapper.selectPage(pageReqVO); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java index 397ff9faa8..bf00dabffe 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java @@ -4,12 +4,13 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import javax.validation.Valid; import java.util.Collection; import java.util.List; +import java.util.Map; /** * 短信模板 Service 接口 @@ -19,6 +20,28 @@ import java.util.List; */ public interface SmsTemplateService { + /** + * 初始化短信模板的本地缓存 + */ + void initLocalCache(); + + /** + * 获得短信模板,从缓存中 + * + * @param code 模板编码 + * @return 短信模板 + */ + SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code); + + /** + * 格式化短信内容 + * + * @param content 短信模板的内容 + * @param params 内容的参数 + * @return 格式化后的内容 + */ + String formatSmsTemplateContent(String content, Map params); + /** * 获得短信模板 * diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java index cc145d97e6..24589abe48 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java @@ -1,6 +1,9 @@ package cn.iocoder.yudao.module.system.service.sms; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; @@ -8,8 +11,8 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.convert.sms.SmsTemplateConvert; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsTemplateMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.sms.core.client.SmsClient; @@ -17,14 +20,15 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.util.Assert; +import javax.annotation.PostConstruct; import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.regex.Pattern; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; @@ -40,6 +44,12 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @Slf4j public class SmsTemplateServiceImpl implements SmsTemplateService { + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + /** * 正则表达式,匹配 {} 中的变量 */ @@ -57,6 +67,72 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { @Resource private SmsProducer smsProducer; + /** + * 短信模板缓存 + * key:短信模板编码 {@link SysSmsTemplateDO#getCode()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Map smsTemplateCache; + /** + * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Override + @PostConstruct + public void initLocalCache() { + // 获取短信模板列表,如果有更新 + List smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(smsTemplateList)) { + return; + } + + // 写入缓存 + ImmutableMap.Builder builder = ImmutableMap.builder(); + smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO)); + smsTemplateCache = builder.build(); + assert smsTemplateList.size() > 0; // 断言,避免告警 + maxUpdateTime = smsTemplateList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size()); + } + + /** + * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前短信模板的最大更新时间 + * @return 短信模板列表 + */ + private List loadSmsTemplateIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]"); + } else { // 判断数据库中是否有更新的短信模板 + if (smsTemplateMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { + return null; + } + log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]"); + } + // 第二步,如果有更新,则从数据库加载所有短信模板 + return smsTemplateMapper.selectList(); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + @Override + public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) { + return smsTemplateCache.get(code); + } + + @Override + public String formatSmsTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } + @Override public SysSmsTemplateDO getSmsTemplateByCode(String code) { return smsTemplateMapper.selectByCode(code); diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendService.java similarity index 79% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendService.java index 55f4d41e00..4c673935a6 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendService.java @@ -1,19 +1,16 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; import java.util.List; import java.util.Map; /** - * 短信 Service Core 接口 - * - * 接入方,通过调用 send 开头的方法,创建发送短信的任务到 MQ 中 - * 后续,yudao-admin-server 监听 MQ,执行真正的短信发送逻辑 + * 短信 Service 发送接口 * * @author 芋道源码 */ -public interface SysSmsCoreService { +public interface SysSmsSendService { /** * 发送单条短信给后台用户 @@ -49,7 +46,7 @@ public interface SysSmsCoreService { void sendBatchSms(List mobiles, List userIds, Integer userType, String templateCode, Map templateParams); - void doSendSms(SysSmsSendMessage message); + void doSendSms(SmsSendMessage message); /** * 接收短信的接收结果 diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceImpl.java similarity index 76% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceImpl.java index 787d2a1d92..b6737fbdff 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceImpl.java @@ -1,15 +1,10 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl; +package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; -import cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms.SysSmsCoreProducer; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsLogCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; @@ -18,7 +13,10 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; +import cn.iocoder.yudao.module.system.service.user.UserService; import com.google.common.annotations.VisibleForTesting; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -27,35 +25,36 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** - * 短信 Service Core 实现 + * 短信 Service 发送的实现 * * @author 芋道源码 */ @Service -public class SysSmsCoreServiceImpl implements SysSmsCoreService { +public class SysSmsSendServiceImpl implements SysSmsSendService { + @Autowired + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 + private UserService userService; @Resource - private SysUserCoreService sysUserCoreService; + private SmsTemplateService smsTemplateService; @Resource - private SysSmsTemplateCoreService smsTemplateCoreService; - @Resource - private SysSmsLogCoreService smsLogCoreService; + private SmsLogService smsLogService; @Resource private SmsClientFactory smsClientFactory; @Resource - private SysSmsCoreProducer smsCoreProducer; + private SmsProducer smsProducer; @Override public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map templateParams) { // 如果 mobile 为空,则加载用户编号对应的手机号 if (StrUtil.isEmpty(mobile)) { - SysUserDO user = sysUserCoreService.getUser(userId); + UserDO user = userService.getUser(userId); if (user != null) { mobile = user.getMobile(); } @@ -90,12 +89,12 @@ public class SysSmsCoreServiceImpl implements SysSmsCoreService { // 创建发送日志 Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志 - String content = smsTemplateCoreService.formatSmsTemplateContent(template.getContent(), templateParams); - Long sendLogId = smsLogCoreService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams); + String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); + Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams); // 发送 MQ 消息,异步执行发送短信 if (isSend) { - smsCoreProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), + smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), template.getApiTemplateId(), newTemplateParams); } return sendLogId; @@ -110,7 +109,7 @@ public class SysSmsCoreServiceImpl implements SysSmsCoreService { @VisibleForTesting public SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { // 获得短信模板。考虑到效率,从缓存中获取 - SysSmsTemplateDO template = smsTemplateCoreService.getSmsTemplateByCodeFromCache(templateCode); + SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); // 短信模板不存在 if (template == null) { throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS); @@ -146,16 +145,15 @@ public class SysSmsCoreServiceImpl implements SysSmsCoreService { return mobile; } - @Override - public void doSendSms(SysSmsSendMessage message) { + public void doSendSms(SmsSendMessage message) { // 获得渠道对应的 SmsClient 客户端 SmsClient smsClient = smsClientFactory.getSmsClient(message.getChannelId()); Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", message.getChannelId())); // 发送短信 SmsCommonResult sendResult = smsClient.sendSms(message.getLogId(), message.getMobile(), message.getApiTemplateId(), message.getTemplateParams()); - smsLogCoreService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(), + smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(), sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(), sendResult.getData() != null ? sendResult.getData().getSerialNo() : null); } @@ -171,7 +169,7 @@ public class SysSmsCoreServiceImpl implements SysSmsCoreService { return; } // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新 - receiveResults.forEach(result -> smsLogCoreService.updateSmsReceiveResult(result.getLogId(), + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorCode())); } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java similarity index 76% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialCoreService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java index 17634b320a..a6010503c8 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialCoreService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.social; +package cn.iocoder.yudao.module.system.service.social; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import me.zhyd.oauth.model.AuthUser; @@ -11,16 +11,16 @@ import javax.validation.constraints.NotNull; import java.util.List; /** - * 社交 Service 接口,例如说社交平台的授权登录 + * 社交用户 Service 接口,例如说社交平台的授权登录 * * @author 芋道源码 */ -public interface SysSocialCoreService { +public interface SocialUserService { /** * 获得社交平台的授权 URL * - * @param type 社交平台的类型 {@link SysSocialTypeEnum} + * @param type 社交平台的类型 {@link SocialTypeEnum} * @param redirectUri 重定向 URL * @return 社交平台的授权 URL */ @@ -30,7 +30,7 @@ public interface SysSocialCoreService { * 获得授权的用户 * 如果授权失败,则会抛出 {@link ServiceException} 异常 * - * @param type 社交平台的类型 {@link SysSocialTypeEnum} + * @param type 社交平台的类型 {@link SocialTypeEnum} * @param code 授权码 * @param state state * @return 授权用户 @@ -46,7 +46,7 @@ public interface SysSocialCoreService { * 获得 unionId 对应的某个社交平台的“所有”社交用户 * 注意,这里的“所有”,指的是类似【微信】平台,包括了小程序、公众号、PC 网站,他们的 unionId 是一致的 * - * @param type 社交平台的类型 {@link SysSocialTypeEnum} + * @param type 社交平台的类型 {@link SocialTypeEnum} * @param unionId 社交平台的 unionId * @return 社交用户列表 * @param userTypeEnum 全局用户类型 @@ -66,7 +66,7 @@ public interface SysSocialCoreService { * 绑定社交用户 * * @param userId 用户编号 - * @param type 社交平台的类型 {@link SysSocialTypeEnum} + * @param type 社交平台的类型 {@link SocialTypeEnum} * @param authUser 授权用户 * @param userTypeEnum 全局用户类型 */ @@ -76,7 +76,7 @@ public interface SysSocialCoreService { * 取消绑定社交用户 * * @param userId 用户编号 - * @param type 社交平台的类型 {@link SysSocialTypeEnum} + * @param type 社交平台的类型 {@link SocialTypeEnum} * @param unionId 社交平台的 unionId * @param userTypeEnum 全局用户类型 */ diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java similarity index 84% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialCoreServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java index 2d0979912c..c5ccf20d01 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialCoreServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java @@ -1,11 +1,10 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.social.impl; +package cn.iocoder.yudao.module.system.service.social; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social.SysSocialUserCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.social.SysSocialUserMapper; +import cn.iocoder.yudao.module.system.dal.redis.social.SocialAuthUserRedisDAO; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.http.HttpUtils; @@ -25,34 +24,34 @@ import javax.annotation.Resource; import java.util.List; import java.util.Objects; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.SOCIAL_AUTH_FAILURE; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.SOCIAL_UNBIND_NOT_SELF; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SOCIAL_AUTH_FAILURE; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SOCIAL_UNBIND_NOT_SELF; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; /** - * 社交 Service 实现类 + * 社交用户 Service 实现类 * * @author 芋道源码 */ @Service @Validated @Slf4j -public class SysSocialCoreServiceImpl implements SysSocialCoreService { +public class SocialUserServiceImpl implements SocialUserService { @Resource private AuthRequestFactory authRequestFactory; @Resource - private SysSocialAuthUserRedisDAO authSocialUserRedisDAO; + private SocialAuthUserRedisDAO authSocialUserRedisDAO; @Resource - private SysSocialUserCoreMapper socialUserMapper; + private SysSocialUserMapper socialUserMapper; @Override public String getAuthorizeUrl(Integer type, String redirectUri) { // 获得对应的 AuthRequest 实现 - AuthRequest authRequest = authRequestFactory.get(SysSocialTypeEnum.valueOfType(type).getSource()); + AuthRequest authRequest = authRequestFactory.get(SocialTypeEnum.valueOfType(type).getSource()); // 生成跳转地址 String authorizeUri = authRequest.authorize(AuthStateUtils.createState()); return HttpUtils.replaceUrlQuery(authorizeUri, "redirect_uri", redirectUri); @@ -76,7 +75,7 @@ public class SysSocialCoreServiceImpl implements SysSocialCoreService { @Override public List getAllSocialUserList(Integer type, String unionId,UserTypeEnum userTypeEnum) { - List types = SysSocialTypeEnum.getRelationTypes(type); + List types = SocialTypeEnum.getRelationTypes(type); return socialUserMapper.selectListByTypeAndUnionId(userTypeEnum.getValue(), types, unionId); } @@ -141,7 +140,7 @@ public class SysSocialCoreServiceImpl implements SysSocialCoreService { @VisibleForTesting public void unbindOldSocialUser(Long userId, Integer type, String newUnionId, UserTypeEnum userTypeEnum) { - List types = SysSocialTypeEnum.getRelationTypes(type); + List types = SocialTypeEnum.getRelationTypes(type); List oldSocialUsers = socialUserMapper.selectListByTypeAndUserId( userTypeEnum.getValue(), types, userId); // 如果新老的 unionId 是一致的,说明无需解绑 @@ -161,7 +160,7 @@ public class SysSocialCoreServiceImpl implements SysSocialCoreService { * @return 授权的用户 */ private AuthUser getAuthUser0(Integer type, AuthCallback authCallback) { - AuthRequest authRequest = authRequestFactory.get(SysSocialTypeEnum.valueOfType(type).getSource()); + AuthRequest authRequest = authRequestFactory.get(SocialTypeEnum.valueOfType(type).getSource()); AuthResponse authResponse = authRequest.login(authCallback); log.info("[getAuthUser0][请求社交平台 type({}) request({}) response({})]", type, toJsonString(authCallback), toJsonString(authResponse)); diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/tenant/SysTenantCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantCoreService.java similarity index 75% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/tenant/SysTenantCoreService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantCoreService.java index f7bbab6ef8..030531d85f 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/tenant/SysTenantCoreService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantCoreService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.tenant; +package cn.iocoder.yudao.module.system.service.tenant; import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java index 63ebfd5f3b..8d2005ba64 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReq import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import javax.validation.Valid; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java index 297dbbbcc5..4b40236a11 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert; import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/tenant/impl/SysTenantCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/impl/SysTenantCoreServiceImpl.java similarity index 63% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/tenant/impl/SysTenantCoreServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/impl/SysTenantCoreServiceImpl.java index 046e4187cb..67b5acfe4e 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/tenant/impl/SysTenantCoreServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/impl/SysTenantCoreServiceImpl.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.tenant.impl; +package cn.iocoder.yudao.module.system.service.tenant.impl; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.tenant.SysTenantCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.service.tenant.SysTenantCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantCoreMapper; +import cn.iocoder.yudao.module.system.service.tenant.SysTenantCoreService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.springframework.stereotype.Service; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java index 15d62caf28..f4e9c63dfd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java @@ -1,10 +1,12 @@ package cn.iocoder.yudao.module.system.service.user; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import java.io.InputStream; import java.util.*; @@ -92,7 +94,7 @@ public interface UserService { * @param username 用户名 * @return 用户对象信息 */ - SysUserDO getUserByUsername(String username); + UserDO getUserByUsername(String username); /** * 获得用户分页列表 @@ -100,15 +102,61 @@ public interface UserService { * @param reqVO 分页条件 * @return 分页列表 */ - PageResult getUserPage(UserPageReqVO reqVO); + PageResult getUserPage(UserPageReqVO reqVO); /** - * 获得用户 + * 通过用户 ID 查询用户 * - * @param id 用户编号 - * @return 用户 + * @param id 用户ID + * @return 用户对象信息 */ - SysUserDO getUser(Long id); + UserDO getUser(Long id); + + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUsersByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUsersByPostIds(Collection postIds); + + /** + * 获得用户列表 + * + * @param ids 用户编号数组 + * @return 用户列表 + */ + List getUsers(Collection ids); + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validUsers(Set ids); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return new HashMap<>(); + } + return CollectionUtils.convertMap(getUsers(ids), UserDO::getId); + } /** * 获得用户列表 @@ -116,9 +164,7 @@ public interface UserService { * @param reqVO 列表请求 * @return 用户列表 */ - List getUsers(UserExportReqVO reqVO); - - + List getUsers(UserExportReqVO reqVO); /** * 获得用户列表,基于昵称模糊匹配 @@ -126,7 +172,7 @@ public interface UserService { * @param nickname 昵称 * @return 用户列表 */ - List getUsersByNickname(String nickname); + List getUsersByNickname(String nickname); /** * 获得用户列表,基于用户账号模糊匹配 @@ -134,7 +180,7 @@ public interface UserService { * @param username 用户账号 * @return 用户列表 */ - List getUsersByUsername(String username); + List getUsersByUsername(String username); /** * 批量导入用户 @@ -151,6 +197,6 @@ public interface UserService { * @param status 状态 * @return 用户们 */ - List getUsersByStatus(Integer status); + List getUsersByStatus(Integer status); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java index d5d7faefcc..1530d3bca4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java @@ -4,23 +4,23 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; -import cn.iocoder.yudao.module.system.convert.user.UserConvert; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.yudao.module.system.service.dept.DeptService; -import cn.iocoder.yudao.module.system.service.dept.PostService; -import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; +import cn.iocoder.yudao.module.system.convert.user.UserConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.mysql.user.UserMapper; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.dept.PostService; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -32,8 +32,10 @@ import javax.annotation.Resource; import java.io.InputStream; import java.util.*; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.USER_IS_DISABLE; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.USER_NOT_EXISTS; /** * 管理员用户 Service 实现类 @@ -48,7 +50,7 @@ public class UserServiceImpl implements UserService { private String userInitPassword; @Resource(name = "sysUserMapper") // userMapper 存在重名 - private SysUserMapper userMapper; + private UserMapper userMapper; @Resource private DeptService deptService; @@ -70,7 +72,7 @@ public class UserServiceImpl implements UserService { this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), reqVO.getDeptId(), reqVO.getPostIds()); // 插入用户 - SysUserDO user = UserConvert.INSTANCE.convert(reqVO); + UserDO user = UserConvert.INSTANCE.convert(reqVO); user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 user.setPassword(passwordEncoder.encode(reqVO.getPassword())); // 加密密码 userMapper.insert(user); @@ -83,13 +85,13 @@ public class UserServiceImpl implements UserService { this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), reqVO.getDeptId(), reqVO.getPostIds()); // 更新用户 - SysUserDO updateObj = UserConvert.INSTANCE.convert(reqVO); + UserDO updateObj = UserConvert.INSTANCE.convert(reqVO); userMapper.updateById(updateObj); } @Override public void updateUserLogin(Long id, String loginIp) { - userMapper.updateById(new SysUserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date())); + userMapper.updateById(new UserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date())); } @Override @@ -107,7 +109,7 @@ public class UserServiceImpl implements UserService { // 校验旧密码密码 this.checkOldPassword(id, reqVO.getOldPassword()); // 执行更新 - SysUserDO updateObj = new SysUserDO().setId(id); + UserDO updateObj = new UserDO().setId(id); updateObj.setPassword(passwordEncoder.encode(reqVO.getNewPassword())); // 加密密码 userMapper.updateById(updateObj); } @@ -118,7 +120,7 @@ public class UserServiceImpl implements UserService { // 存储文件 String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); // 更新路径 - SysUserDO sysUserDO = new SysUserDO(); + UserDO sysUserDO = new UserDO(); sysUserDO.setId(id); sysUserDO.setAvatar(avatar); userMapper.updateById(sysUserDO); @@ -130,7 +132,7 @@ public class UserServiceImpl implements UserService { // 校验用户存在 this.checkUserExists(id); // 更新密码 - SysUserDO updateObj = new SysUserDO(); + UserDO updateObj = new UserDO(); updateObj.setId(id); updateObj.setPassword(passwordEncoder.encode(password)); // 加密密码 userMapper.updateById(updateObj); @@ -141,7 +143,7 @@ public class UserServiceImpl implements UserService { // 校验用户存在 this.checkUserExists(id); // 更新状态 - SysUserDO updateObj = new SysUserDO(); + UserDO updateObj = new UserDO(); updateObj.setId(id); updateObj.setStatus(status); userMapper.updateById(updateObj); @@ -158,33 +160,80 @@ public class UserServiceImpl implements UserService { } @Override - public SysUserDO getUserByUsername(String username) { + public UserDO getUserByUsername(String username) { return userMapper.selectByUsername(username); } @Override - public PageResult getUserPage(UserPageReqVO reqVO) { + public PageResult getUserPage(UserPageReqVO reqVO) { return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId())); } @Override - public SysUserDO getUser(Long id) { + public UserDO getUser(Long id) { return userMapper.selectById(id); } @Override - public List getUsers(UserExportReqVO reqVO) { + public List getUsersByDeptIds(Collection deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return Collections.emptyList(); + } + return userMapper.selectListByDeptIds(deptIds); + } + + @Override + public List getUsersByPostIds(Collection postIds) { + if (CollUtil.isEmpty(postIds)) { + return Collections.emptyList(); + } + // 过滤不符合条件的 + // TODO 芋艿:暂时只能内存过滤。解决方案:1、新建一个关联表;2、基于 where + 函数;3、json 字段,适合 mysql 8+ 版本 + List users = userMapper.selectList(); + users.removeIf(user -> !CollUtil.containsAny(user.getPostIds(), postIds)); + return users; + } + + @Override + public List getUsers(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return userMapper.selectBatchIds(ids); + } + + @Override + public void validUsers(Set ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List users = userMapper.selectBatchIds(ids); + Map userMap = CollectionUtils.convertMap(users, UserDO::getId); + // 校验 + ids.forEach(id -> { + UserDO user = userMap.get(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus())) { + throw exception(USER_IS_DISABLE, user.getNickname()); + } + }); + } + + @Override + public List getUsers(UserExportReqVO reqVO) { return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); } - @Override - public List getUsersByNickname(String nickname) { + public List getUsersByNickname(String nickname) { return userMapper.selectListByNickname(nickname); } @Override - public List getUsersByUsername(String username) { + public List getUsersByUsername(String username) { return userMapper.selectListByUsername(username); } @@ -225,7 +274,7 @@ public class UserServiceImpl implements UserService { if (id == null) { return; } - SysUserDO user = userMapper.selectById(id); + UserDO user = userMapper.selectById(id); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -236,7 +285,7 @@ public class UserServiceImpl implements UserService { if (StrUtil.isBlank(username)) { return; } - SysUserDO user = userMapper.selectByUsername(username); + UserDO user = userMapper.selectByUsername(username); if (user == null) { return; } @@ -254,7 +303,7 @@ public class UserServiceImpl implements UserService { if (StrUtil.isBlank(email)) { return; } - SysUserDO user = userMapper.selectByEmail(email); + UserDO user = userMapper.selectByEmail(email); if (user == null) { return; } @@ -272,7 +321,7 @@ public class UserServiceImpl implements UserService { if (StrUtil.isBlank(mobile)) { return; } - SysUserDO user = userMapper.selectByMobile(mobile); + UserDO user = userMapper.selectByMobile(mobile); if (user == null) { return; } @@ -328,7 +377,7 @@ public class UserServiceImpl implements UserService { */ @VisibleForTesting public void checkOldPassword(Long id, String oldPassword) { - SysUserDO user = userMapper.selectById(id); + UserDO user = userMapper.selectById(id); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -355,7 +404,7 @@ public class UserServiceImpl implements UserService { return; } // 判断如果不存在,在进行插入 - SysUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); + UserDO existUser = userMapper.selectByUsername(importUser.getUsername()); if (existUser == null) { userMapper.insert(UserConvert.INSTANCE.convert(importUser) .setPassword(passwordEncoder.encode(userInitPassword))); // 设置默认密码 @@ -367,7 +416,7 @@ public class UserServiceImpl implements UserService { respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg()); return; } - SysUserDO updateUser = UserConvert.INSTANCE.convert(importUser); + UserDO updateUser = UserConvert.INSTANCE.convert(importUser); updateUser.setId(existUser.getId()); userMapper.updateById(updateUser); respVO.getUpdateUsernames().add(importUser.getUsername()); @@ -376,7 +425,7 @@ public class UserServiceImpl implements UserService { } @Override - public List getUsersByStatus(Integer status) { + public List getUsersByStatus(Integer status) { return userMapper.selectListByStatus(status); } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java index a306eea49c..1ad03c06ef 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java @@ -5,13 +5,11 @@ import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import cn.iocoder.yudao.module.system.service.common.CaptchaService; import cn.iocoder.yudao.module.system.service.dept.PostService; +import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.service.social.SocialUserService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.test.core.util.AssertUtils; @@ -48,8 +46,6 @@ public class AuthServiceImplTest extends BaseDbUnitTest { @MockBean private UserService userService; @MockBean - private SysUserCoreService userCoreService; - @MockBean private PermissionService permissionService; @MockBean private AuthenticationManager authenticationManager; @@ -58,11 +54,11 @@ public class AuthServiceImplTest extends BaseDbUnitTest { @MockBean private CaptchaService captchaService; @MockBean - private SysLoginLogCoreService loginLogCoreService; + private LoginLogService loginLogService; @MockBean - private SysUserSessionCoreService userSessionCoreService; + private UserSessionService userSessionService; @MockBean - private SysSocialCoreService socialService; + private SocialUserService socialService; @MockBean private PostService postService; @@ -76,7 +72,7 @@ public class AuthServiceImplTest extends BaseDbUnitTest { // 准备参数 String username = randomString(); // mock 方法 - SysUserDO user = randomPojo(SysUserDO.class, o -> o.setUsername(username)); + UserDO user = randomPojo(UserDO.class, o -> o.setUsername(username)); when(userService.getUserByUsername(eq(username))).thenReturn(user); // 调用 @@ -102,8 +98,8 @@ public class AuthServiceImplTest extends BaseDbUnitTest { // 准备参数 Long userId = randomLongId(); // mock 方法 01 - SysUserDO user = randomPojo(SysUserDO.class, o -> o.setId(userId)); - when(userCoreService.getUser(eq(userId))).thenReturn(user); + UserDO user = randomPojo(UserDO.class, o -> o.setId(userId)); + when(userService.getUser(eq(userId))).thenReturn(user); // mock 方法 02 Set roleIds = randomSet(Long.class); when(permissionService.getUserRoleIds(eq(userId), eq(singleton(CommonStatusEnum.ENABLE.getStatus())))) @@ -137,7 +133,7 @@ public class AuthServiceImplTest extends BaseDbUnitTest { // 调用, 并断言异常 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_NOT_FOUND); // 校验调用参数 - verify(loginLogCoreService, times(1)).createLoginLog( + verify(loginLogService, times(1)).createLoginLog( argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) && o.getResult().equals(LoginResultEnum.CAPTCHA_NOT_FOUND.getResult())) ); @@ -155,7 +151,7 @@ public class AuthServiceImplTest extends BaseDbUnitTest { // 调用, 并断言异常 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_CODE_ERROR); // 校验调用参数 - verify(loginLogCoreService, times(1)).createLoginLog( + verify(loginLogService, times(1)).createLoginLog( argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) && o.getResult().equals(LoginResultEnum.CAPTCHA_CODE_ERROR.getResult())) ); @@ -176,7 +172,7 @@ public class AuthServiceImplTest extends BaseDbUnitTest { assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_BAD_CREDENTIALS); // 校验调用参数 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); - verify(loginLogCoreService, times(1)).createLoginLog( + verify(loginLogService, times(1)).createLoginLog( argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) && o.getResult().equals(LoginResultEnum.BAD_CREDENTIALS.getResult())) ); @@ -197,7 +193,7 @@ public class AuthServiceImplTest extends BaseDbUnitTest { assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_USER_DISABLED); // 校验调用参数 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); - verify(loginLogCoreService, times(1)).createLoginLog( + verify(loginLogService, times(1)).createLoginLog( argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) && o.getResult().equals(LoginResultEnum.USER_DISABLED.getResult())) ); @@ -218,7 +214,7 @@ public class AuthServiceImplTest extends BaseDbUnitTest { assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_FAIL_UNKNOWN); // 校验调用参数 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); - verify(loginLogCoreService, times(1)).createLoginLog( + verify(loginLogService, times(1)).createLoginLog( argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) && o.getResult().equals(LoginResultEnum.UNKNOWN_ERROR.getResult())) ); @@ -246,13 +242,13 @@ public class AuthServiceImplTest extends BaseDbUnitTest { // mock 获得 User 拥有的角色编号数组 when(permissionService.getUserRoleIds(userId, singleton(CommonStatusEnum.ENABLE.getStatus()))).thenReturn(userRoleIds); // mock 缓存登录用户到 Redis - when(userSessionCoreService.createUserSession(loginUser, userIp, userAgent)).thenReturn(sessionId); + when(userSessionService.createUserSession(loginUser, userIp, userAgent)).thenReturn(sessionId); // 调用, 并断言异常 String login = authService.login(reqVO, userIp, userAgent); assertEquals(sessionId, login); // 校验调用参数 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); - verify(loginLogCoreService, times(1)).createLoginLog( + verify(loginLogService, times(1)).createLoginLog( argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) && o.getResult().equals(LoginResultEnum.SUCCESS.getResult())) ); @@ -264,12 +260,12 @@ public class AuthServiceImplTest extends BaseDbUnitTest { String token = randomString(); LoginUser loginUser = randomPojo(LoginUser.class); // mock - when(userSessionCoreService.getLoginUser(token)).thenReturn(loginUser); + when(userSessionService.getLoginUser(token)).thenReturn(loginUser); // 调用 authService.logout(token); // 校验调用参数 - verify(userSessionCoreService, times(1)).deleteUserSession(token); - verify(loginLogCoreService, times(1)).createLoginLog( + verify(userSessionService, times(1)).deleteUserSession(token); + verify(loginLogService, times(1)).createLoginLog( argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGOUT_SELF.getType()) && o.getResult().equals(LoginResultEnum.SUCCESS.getResult())) ); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java index eea61a408b..4ca9127212 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java @@ -1,14 +1,16 @@ package cn.iocoder.yudao.module.system.service.auth; import cn.hutool.core.date.DateUtil; +import cn.iocoder.yudao.framework.security.config.SecurityProperties; +import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; +import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; -import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.redis.auth.LoginUserRedisDAO; +import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -19,17 +21,19 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; +import java.time.Duration; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; @@ -38,7 +42,7 @@ import static org.mockito.Mockito.when; * * @author Lyon */ -@Import({UserSessionServiceImpl.class}) +@Import({UserSessionServiceImpl.class, LoginUserRedisDAO.class}) public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { @Resource @@ -50,14 +54,17 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { @MockBean private UserService userService; @MockBean - private SysLoginLogCoreService loginLogCoreService; + private LoginLogService loginLogService; @MockBean - private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO; + private LoginUserRedisDAO loginUserRedisDAO; + + @MockBean + private SecurityProperties securityProperties; @Test public void testGetUserSessionPage_success() { // mock 数据 - SysUserDO dbUser = randomPojo(SysUserDO.class, o -> { + UserDO dbUser = randomPojo(UserDO.class, o -> { o.setSex(randomEle(SysSexEnum.values()).getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); @@ -124,4 +131,89 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { assertPojoEquals(sessionDO, userSessionDOS.get(0), "updateTime"); } + @Test + public void testCreateUserSession_success() { + // 准备参数 + String userIp = randomString(); + String userAgent = randomString(); + LoginUser loginUser = randomPojo(LoginUser.class, o -> { + o.setUserType(randomEle(UserTypeEnum.values()).getValue()); + o.setTenantId(0L); // 租户设置为 0,因为暂未启用多租户组件 + }); + // mock 方法 + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); + + // 调用 + String sessionId = userSessionService.createUserSession(loginUser, userIp, userAgent); + // 校验 SysUserSessionDO 记录 + SysUserSessionDO userSessionDO = userSessionMapper.selectById(sessionId); + assertPojoEquals(loginUser, userSessionDO, "id", "updateTime"); + assertEquals(sessionId, userSessionDO.getId()); + assertEquals(userIp, userSessionDO.getUserIp()); + assertEquals(userAgent, userSessionDO.getUserAgent()); + // 校验 LoginUser 缓存 + LoginUser redisLoginUser = loginUserRedisDAO.get(sessionId); + assertPojoEquals(loginUser, redisLoginUser, "username", "password"); + } + + @Test + public void testCreateRefreshUserSession_success() { + // 准备参数 + String sessionId = randomString(); + String userIp = randomString(); + String userAgent = randomString(); + long timeLong = randomLongId(); + String userName = randomString(); + Date date = randomDate(); + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setUserType(randomEle(UserTypeEnum.values()).getValue())); + // mock 方法 + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); + // mock 数据 + loginUser.setUpdateTime(date); + loginUserRedisDAO.set(sessionId, loginUser); + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + .userId(loginUser.getId()).userType(loginUser.getUserType()) + .userIp(userIp).userAgent(userAgent).username(userName) + .sessionTimeout(addTime(Duration.ofMillis(timeLong))) + .build(); + userSessionMapper.insert(userSession); + + // 调用 + userSessionService.refreshUserSession(sessionId, loginUser); + // 校验 LoginUser 缓存 + LoginUser redisLoginUser = loginUserRedisDAO.get(sessionId); + assertNotEquals(redisLoginUser.getUpdateTime(), date); + // 校验 SysUserSessionDO 记录 + SysUserSessionDO updateDO = userSessionMapper.selectById(sessionId); + assertEquals(updateDO.getUsername(), loginUser.getUsername()); + assertNotEquals(updateDO.getUpdateTime(), userSession.getUpdateTime()); + assertNotEquals(updateDO.getSessionTimeout(), addTime(Duration.ofMillis(timeLong))); + } + + @Test + public void testDeleteUserSession_success() { + // 准备参数 + String sessionId = randomString(); + String userIp = randomString(); + String userAgent = randomString(); + Long timeLong = randomLongId(); + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setUserType(randomEle(UserTypeEnum.values()).getValue())); + // mock 存入 Redis + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); + // mock 数据 + loginUserRedisDAO.set(sessionId, loginUser); + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + .userId(loginUser.getId()).userType(loginUser.getUserType()) + .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) + .sessionTimeout(addTime(Duration.ofMillis(timeLong))) + .build(); + userSessionMapper.insert(userSession); + + // 调用 + userSessionService.deleteUserSession(sessionId); + // 校验数据不存在了 + assertNull(loginUserRedisDAO.get(sessionId)); + assertNull(userSessionMapper.selectById(sessionId)); + } + } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java index fe49ea2b3b..bfda1290e6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java index df64ed2b11..d6bbab6f7a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.service.dept; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java index 42217d3b75..e0f3d0e2b6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.service.dict; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; @@ -13,14 +13,17 @@ import cn.iocoder.yudao.module.system.mq.producer.dict.DictDataProducer; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; +import com.google.common.collect.ImmutableTable; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; +import java.util.Date; import java.util.List; import java.util.function.Consumer; +import static cn.hutool.core.bean.BeanUtil.getFieldValue; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; @@ -42,6 +45,37 @@ public class DictDataServiceTest extends BaseDbUnitTest { @MockBean private DictDataProducer dictDataProducer; + /** + * 测试加载到新的字典数据的情况 + */ + @Test + @SuppressWarnings("unchecked") + public void testInitLocalCache() { + // mock 数据 + SysDictDataDO dictData01 = randomDictDataDO(); + dictDataMapper.insert(dictData01); + SysDictDataDO dictData02 = randomDictDataDO(); + dictDataMapper.insert(dictData02); + + // 调用 + dictDataService.initLocalCache(); + // 断言 labelDictDataCache 缓存 + ImmutableTable labelDictDataCache = + (ImmutableTable) getFieldValue(dictDataService, "labelDictDataCache"); + assertEquals(2, labelDictDataCache.size()); + assertPojoEquals(dictData01, labelDictDataCache.get(dictData01.getDictType(), dictData01.getLabel())); + assertPojoEquals(dictData02, labelDictDataCache.get(dictData02.getDictType(), dictData02.getLabel())); + // 断言 valueDictDataCache 缓存 + ImmutableTable valueDictDataCache = + (ImmutableTable) getFieldValue(dictDataService, "valueDictDataCache"); + assertEquals(2, valueDictDataCache.size()); + assertPojoEquals(dictData01, valueDictDataCache.get(dictData01.getDictType(), dictData01.getValue())); + assertPojoEquals(dictData02, valueDictDataCache.get(dictData02.getDictType(), dictData02.getValue())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(dictDataService, "maxUpdateTime"); + assertEquals(ObjectUtils.max(dictData01.getUpdateTime(), dictData02.getUpdateTime()), maxUpdateTime); + } + @Test public void testGetDictDataPage() { // mock 数据 diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java index 94778ef49d..fdaf676da2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; @@ -12,6 +12,9 @@ import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -19,6 +22,7 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.util.List; +import static cn.hutool.core.util.RandomUtil.randomEle; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -27,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class LoginLogServiceImplTest extends BaseDbUnitTest { @Resource - private LoginLogServiceImpl sysLoginLogService; + private LoginLogServiceImpl loginLogService; @Resource private LoginLogMapper loginLogMapper; @@ -68,7 +72,7 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { reqVO.setEndTime(buildTime(2021, 3, 7)); // 调用service方法 - PageResult pageResult = sysLoginLogService.getLoginLogPage(reqVO); + PageResult pageResult = loginLogService.getLoginLogPage(reqVO); // 断言,只查到了一条符合条件的 assertEquals(1, pageResult.getTotal()); @@ -114,10 +118,28 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { // 调用service方法 - List loginLogList = sysLoginLogService.getLoginLogList(reqVO); + List loginLogList = loginLogService.getLoginLogList(reqVO); // 断言 assertEquals(1, loginLogList.size()); assertPojoEquals(loginLogDO, loginLogList.get(0)); } + + @Test + public void testCreateLoginLog() { + LoginLogCreateReqDTO reqDTO = RandomUtils.randomPojo(LoginLogCreateReqDTO.class, vo -> { + // 指定随机的范围,避免超出范围入库失败 + vo.setUserType(randomEle(UserTypeEnum.values()).getValue()); + vo.setLogType(randomEle(SysLoginLogTypeEnum.values()).getType()); + vo.setResult(randomEle(SysLoginResultEnum.values()).getResult()); + vo.setTraceId(TracerUtils.getTraceId()); + }); + + // 调用 + loginLogService.createLoginLog(reqDTO); + // 断言,忽略基本字段 + SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null); + assertPojoEquals(reqDTO, sysLoginLogDO); + } + } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java index 6f6edf4cf0..2c9c2369ad 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java @@ -6,8 +6,8 @@ import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.Oper import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -66,7 +66,7 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { public void testGetOperateLogPage() { // 构造测试数据 // 先构造用户 - SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> { + UserDO user = RandomUtils.randomPojo(UserDO.class, o -> { o.setNickname("wangkai"); o.setSex(SysSexEnum.MALE.getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -117,7 +117,7 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { public void testGetOperateLogs() { // 构造测试数据 // 先构造用户 - SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> { + UserDO user = RandomUtils.randomPojo(UserDO.class, o -> { o.setNickname("wangkai"); o.setSex(SysSexEnum.MALE.getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java index 3652c2ba30..9ff7d5d4cd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMenuMapper; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleMapper; import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java index 68e55926ad..5c8475dfd6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMapper; import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; import cn.iocoder.yudao.module.system.mq.producer.permission.RoleProducer; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java index 28d6b2703d..1233b2a76d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannel import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsChannelMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java index e743897310..e06b9b0f4f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java @@ -1,13 +1,15 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsLogMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsReceiveStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsSendStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsTemplateTypeEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; @@ -17,16 +19,18 @@ import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import javax.annotation.Resource; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.function.Consumer; +import static cn.hutool.core.util.RandomUtil.randomBoolean; import static cn.hutool.core.util.RandomUtil.randomEle; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; @Import(SmsLogServiceImpl.class) public class SmsLogServiceTest extends BaseDbUnitTest { @@ -130,6 +134,93 @@ public class SmsLogServiceTest extends BaseDbUnitTest { assertPojoEquals(dbSmsLog, list.get(0)); } + @Test + public void testCreateSmsLog() { + // 准备参数 + String mobile = randomString(); + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + Boolean isSend = randomBoolean(); + SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class, + o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType())); + String templateContent = randomString(); + Map templateParams = randomTemplateParams(); + // mock 方法 + + // 调用 + Long logId = smsLogService.createSmsLog(mobile, userId, userType, isSend, + templateDO, templateContent, templateParams); + // 断言 + SysSmsLogDO logDO = smsLogMapper.selectById(logId); + assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(), + logDO.getSendStatus()); + assertEquals(mobile, logDO.getMobile()); + assertEquals(userType, logDO.getUserType()); + assertEquals(userId, logDO.getUserId()); + assertEquals(templateDO.getId(), logDO.getTemplateId()); + assertEquals(templateDO.getCode(), logDO.getTemplateCode()); + assertEquals(templateDO.getType(), logDO.getTemplateType()); + assertEquals(templateDO.getChannelId(), logDO.getChannelId()); + assertEquals(templateDO.getChannelCode(), logDO.getChannelCode()); + assertEquals(templateContent, logDO.getTemplateContent()); + assertEquals(templateParams, logDO.getTemplateParams()); + assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus()); + } + + @Test + public void testUpdateSmsSendResult() { + // mock 数据 + SysSmsLogDO dbSmsLog = randomSmsLogDO( + o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus())); + smsLogMapper.insert(dbSmsLog); + // 准备参数 + Long id = dbSmsLog.getId(); + Integer sendCode = randomInteger(); + String sendMsg = randomString(); + String apiSendCode = randomString(); + String apiSendMsg = randomString(); + String apiRequestId = randomString(); + String apiSerialNo = randomString(); + + // 调用 + smsLogService.updateSmsSendResult(id, sendCode, sendMsg, + apiSendCode, apiSendMsg, apiRequestId, apiSerialNo); + // 断言 + dbSmsLog = smsLogMapper.selectById(id); + assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus() + : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus()); + assertNotNull(dbSmsLog.getSendTime()); + assertEquals(sendMsg, dbSmsLog.getSendMsg()); + assertEquals(apiSendCode, dbSmsLog.getApiSendCode()); + assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg()); + assertEquals(apiRequestId, dbSmsLog.getApiRequestId()); + assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo()); + } + + @Test + public void testUpdateSmsReceiveResult() { + // mock 数据 + SysSmsLogDO dbSmsLog = randomSmsLogDO( + o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus())); + smsLogMapper.insert(dbSmsLog); + // 准备参数 + Long id = dbSmsLog.getId(); + Boolean success = randomBoolean(); + Date receiveTime = randomDate(); + String apiReceiveCode = randomString(); + String apiReceiveMsg = randomString(); + + // 调用 + smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg); + // 断言 + dbSmsLog = smsLogMapper.selectById(id); + assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus() + : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); + assertEquals(receiveTime, dbSmsLog.getReceiveTime()); + assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode()); + assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg()); + } + // ========== 随机对象 ========== @SafeVarargs diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java index 540c9a3726..bd1ca2c58d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java @@ -6,9 +6,9 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsTemplateMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.enums.sms.SysSmsTemplateTypeEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -25,10 +25,14 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; +import java.util.Date; import java.util.List; +import java.util.Map; import java.util.function.Consumer; +import static cn.hutool.core.bean.BeanUtil.getFieldValue; import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; @@ -56,6 +60,27 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { @MockBean private SmsProducer smsProducer; + @Test + @SuppressWarnings("unchecked") + void testInitLocalCache() { + // mock 数据 + SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO(); + smsTemplateMapper.insert(smsTemplate01); + SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO(); + smsTemplateMapper.insert(smsTemplate02); + + // 调用 + smsTemplateService.initLocalCache(); + // 断言 deptCache 缓存 + Map smsTemplateCache = (Map) getFieldValue(smsTemplateService, "smsTemplateCache"); + assertEquals(2, smsTemplateCache.size()); + assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode())); + assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(smsTemplateService, "maxUpdateTime"); + assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime); + } + @Test public void testParseTemplateContentParams() { // 准备参数 diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java similarity index 70% rename from yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java index 97e1e37031..8cbe9b34ec 100644 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java @@ -1,10 +1,9 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.sms; +package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage; -import cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms.SysSmsCoreProducer; -import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsCoreServiceImpl; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; +import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; @@ -24,29 +23,24 @@ import java.util.List; import java.util.Map; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -/** - * {@link SysSmsCoreService} 的单元测试类 - * - * @author 芋道源码 - */ -public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { +public class SysSmsSendServiceTest extends BaseMockitoUnitTest { @InjectMocks - private SysSmsCoreServiceImpl smsCoreService; + private SysSmsSendServiceImpl smsService; @Mock - private SysSmsTemplateCoreService smsTemplateCoreService; + private SmsTemplateService smsTemplateService; @Mock - private SysSmsLogCoreService smsLogCoreService; + private SmsLogService smsLogService; @Mock - private SysSmsCoreProducer smsCoreProducer; + private SmsProducer smsProducer; @Mock private SmsClientFactory smsClientFactory; @@ -68,21 +62,21 @@ public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { o.setContent("验证码为{code}, 操作为{op}"); o.setParams(Lists.newArrayList("code", "op")); }); - when(smsTemplateCoreService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); + when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); String content = randomString(); - when(smsTemplateCoreService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) + when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) .thenReturn(content); // mock SmsLogService 的方法 Long smsLogId = randomLongId(); - when(smsLogCoreService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template), + when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template), eq(content), eq(templateParams))).thenReturn(smsLogId); // 调用 - Long resultSmsLogId = smsCoreService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); // 断言 assertEquals(smsLogId, resultSmsLogId); // 断言调用 - verify(smsCoreProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile), + verify(smsProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile), eq(template.getChannelId()), eq(template.getApiTemplateId()), eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); } @@ -105,21 +99,21 @@ public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { o.setContent("验证码为{code}, 操作为{op}"); o.setParams(Lists.newArrayList("code", "op")); }); - when(smsTemplateCoreService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); + when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); String content = randomString(); - when(smsTemplateCoreService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) + when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) .thenReturn(content); // mock SmsLogService 的方法 Long smsLogId = randomLongId(); - when(smsLogCoreService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template), + when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template), eq(content), eq(templateParams))).thenReturn(smsLogId); // 调用 - Long resultSmsLogId = smsCoreService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); // 断言 assertEquals(smsLogId, resultSmsLogId); // 断言调用 - verify(smsCoreProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(), + verify(smsProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(), anyLong(), any(), anyList()); } @@ -130,7 +124,7 @@ public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { // mock 方法 // 调用,并断言异常 - assertServiceException(() -> smsCoreService.checkSmsTemplateValid(templateCode), + assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode), SMS_SEND_TEMPLATE_NOT_EXISTS); } @@ -143,7 +137,7 @@ public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { // mock 方法 // 调用,并断言异常 - assertServiceException(() -> smsCoreService.buildTemplateParams(template, templateParams), + assertServiceException(() -> smsService.buildTemplateParams(template, templateParams), SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, "code"); } @@ -153,7 +147,7 @@ public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { // mock 方法 // 调用,并断言异常 - assertServiceException(() -> smsCoreService.checkMobile(null), + assertServiceException(() -> smsService.checkMobile(null), SMS_SEND_MOBILE_NOT_EXISTS); } @@ -161,7 +155,7 @@ public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { @SuppressWarnings("unchecked") public void testDoSendSms() { // 准备参数 - SysSmsSendMessage message = randomPojo(SysSmsSendMessage.class); + SmsSendMessage message = randomPojo(SmsSendMessage.class); // mock SmsClientFactory 的方法 SmsClient smsClient = spy(SmsClient.class); when(smsClientFactory.getSmsClient(eq(message.getChannelId()))).thenReturn(smsClient); @@ -171,9 +165,9 @@ public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { eq(message.getTemplateParams()))).thenReturn(sendResult); // 调用 - smsCoreService.doSendSms(message); + smsService.doSendSms(message); // 断言 - verify(smsLogCoreService, times(1)).updateSmsSendResult(eq(message.getLogId()), + verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()), eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()), eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo())); } @@ -190,9 +184,9 @@ public class SysSmsCoreServiceTest extends BaseMockitoUnitTest { List receiveResults = randomPojoList(SmsReceiveRespDTO.class); // 调用 - smsCoreService.receiveSmsStatus(channelCode, text); + smsService.receiveSmsStatus(channelCode, text); // 断言 - receiveResults.forEach(result -> smsLogCoreService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()), + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()), eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode()))); } diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialCoreServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUsererviceTest.java similarity index 80% rename from yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialCoreServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUsererviceTest.java index 2a33dd869e..dc6d3a2d04 100644 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialCoreServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUsererviceTest.java @@ -1,12 +1,11 @@ -package cn.iocoder.yudao.coreservice.modules.system.service.social; +package cn.iocoder.yudao.module.system.service.social; -import cn.iocoder.yudao.coreservice.BaseDbAndRedisUnitTest; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social.SysSocialUserCoreMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO; -import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.social.impl.SysSocialCoreServiceImpl; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.social.SysSocialUserMapper; +import cn.iocoder.yudao.module.system.dal.redis.social.SocialAuthUserRedisDAO; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.module.system.test.BaseDbAndRedisUnitTest; import com.xkcoding.justauth.AuthRequestFactory; import me.zhyd.oauth.model.AuthUser; import org.junit.jupiter.api.Test; @@ -23,19 +22,14 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.assertEquals; -/** - * {@link SysSocialCoreServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import({SysSocialCoreServiceImpl.class, SysSocialAuthUserRedisDAO.class}) -public class SysSocialCoreServiceTest extends BaseDbAndRedisUnitTest { +@Import({SocialUserServiceImpl.class, SocialAuthUserRedisDAO.class}) +public class SocialUsererviceTest extends BaseDbAndRedisUnitTest { @Resource - private SysSocialCoreServiceImpl socialService; + private SocialUserServiceImpl socialService; @Resource - private SysSocialUserCoreMapper socialUserMapper; + private SysSocialUserMapper socialUserMapper; @MockBean private AuthRequestFactory authRequestFactory; @@ -48,7 +42,7 @@ public class SysSocialCoreServiceTest extends BaseDbAndRedisUnitTest { // mock 数据 // 准备参数 Long userId = randomLongId(); - Integer type = randomEle(SysSocialTypeEnum.values()).getType(); + Integer type = randomEle(SocialTypeEnum.values()).getType(); AuthUser authUser = randomPojo(AuthUser.class); // mock 方法 @@ -68,7 +62,7 @@ public class SysSocialCoreServiceTest extends BaseDbAndRedisUnitTest { // mock 数据 SysSocialUserDO dbSocialUser = randomPojo(SysSocialUserDO.class, socialUserDO -> { socialUserDO.setUserType(UserTypeEnum.ADMIN.getValue()); - socialUserDO.setType(randomEle(SysSocialTypeEnum.values()).getType()); + socialUserDO.setType(randomEle(SocialTypeEnum.values()).getType()); }); socialUserMapper.insert(dbSocialUser); // 准备参数 @@ -93,7 +87,7 @@ public class SysSocialCoreServiceTest extends BaseDbAndRedisUnitTest { // mock 数据 SysSocialUserDO dbSocialUser = randomPojo(SysSocialUserDO.class, socialUserDO -> { socialUserDO.setUserType(UserTypeEnum.ADMIN.getValue()); - socialUserDO.setType(randomEle(SysSocialTypeEnum.values()).getType()); + socialUserDO.setType(randomEle(SocialTypeEnum.values()).getType()); }); socialUserMapper.insert(dbSocialUser); // 准备参数 @@ -131,7 +125,7 @@ public class SysSocialCoreServiceTest extends BaseDbAndRedisUnitTest { // mock 数据 SysSocialUserDO oldSocialUser = randomPojo(SysSocialUserDO.class, socialUserDO -> { socialUserDO.setUserType(UserTypeEnum.ADMIN.getValue()); - socialUserDO.setType(randomEle(SysSocialTypeEnum.values()).getType()); + socialUserDO.setType(randomEle(SocialTypeEnum.values()).getType()); }); socialUserMapper.insert(oldSocialUser); // 准备参数 @@ -154,7 +148,7 @@ public class SysSocialCoreServiceTest extends BaseDbAndRedisUnitTest { // mock 数据 SysSocialUserDO oldSocialUser = randomPojo(SysSocialUserDO.class, socialUserDO -> { socialUserDO.setUserType(UserTypeEnum.ADMIN.getValue()); - socialUserDO.setType(randomEle(SysSocialTypeEnum.values()).getType()); + socialUserDO.setType(randomEle(SocialTypeEnum.values()).getType()); }); socialUserMapper.insert(oldSocialUser); // 准备参数 diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java index 93b31c0746..49c96cc5ae 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReq import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantMapper; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java index 8256f1de5c..0667193f99 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java @@ -5,16 +5,16 @@ import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.dal.mysql.user.SysUserMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.mysql.user.UserMapper; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; @@ -52,7 +52,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { private UserServiceImpl userService; @Resource - private SysUserMapper userMapper; + private UserMapper userMapper; @MockBean private DeptService deptService; @@ -94,7 +94,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 Long userId = userService.createUser(reqVO); // 断言 - SysUserDO user = userMapper.selectById(userId); + UserDO user = userMapper.selectById(userId); assertPojoEquals(reqVO, user, "password"); assertEquals("yudaoyuanma", user.getPassword()); assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus()); @@ -103,7 +103,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateUser_success() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(); + UserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 UserUpdateReqVO reqVO = randomPojo(UserUpdateReqVO.class, o -> { @@ -128,14 +128,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUser(reqVO); // 断言 - SysUserDO user = userMapper.selectById(reqVO.getId()); + UserDO user = userMapper.selectById(reqVO.getId()); assertPojoEquals(reqVO, user); } @Test public void testUpdateUserProfile_success() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(); + UserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -147,14 +147,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserProfile(userId, reqVO); // 断言 - SysUserDO user = userMapper.selectById(userId); + UserDO user = userMapper.selectById(userId); assertPojoEquals(reqVO, user); } @Test public void testUpdateUserPassword_success() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(o -> o.setPassword("encode:yudao")); + UserDO dbUser = randomSysUserDO(o -> o.setPassword("encode:yudao")); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -170,14 +170,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserPassword(userId, reqVO); // 断言 - SysUserDO user = userMapper.selectById(userId); + UserDO user = userMapper.selectById(userId); assertEquals("encode:yuanma", user.getPassword()); } @Test public void testUpdateUserAvatar_success() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(); + UserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -190,14 +190,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserAvatar(userId, avatarFile); // 断言 - SysUserDO user = userMapper.selectById(userId); + UserDO user = userMapper.selectById(userId); assertEquals(avatar, user.getAvatar()); } @Test public void testUpdateUserPassword02_success() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(); + UserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -209,14 +209,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserPassword(userId, password); // 断言 - SysUserDO user = userMapper.selectById(userId); + UserDO user = userMapper.selectById(userId); assertEquals("encode:" + password, user.getPassword()); } @Test public void testUpdateUserStatus() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(); + UserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -225,14 +225,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserStatus(userId, status); // 断言 - SysUserDO user = userMapper.selectById(userId); + UserDO user = userMapper.selectById(userId); assertEquals(status, user.getStatus()); } @Test public void testDeleteUser_success(){ // mock 数据 - SysUserDO dbUser = randomSysUserDO(); + UserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -248,7 +248,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testGetUserPage() { // mock 数据 - SysUserDO dbUser = initGetUserPageData(); + UserDO dbUser = initGetUserPageData(); // 准备参数 UserPageReqVO reqVO = new UserPageReqVO(); reqVO.setUsername("yudao"); @@ -262,7 +262,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); // 调用 - PageResult pageResult = userService.getUserPage(reqVO); + PageResult pageResult = userService.getUserPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -272,7 +272,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testGetUsers() { // mock 数据 - SysUserDO dbUser = initGetUserPageData(); + UserDO dbUser = initGetUserPageData(); // 准备参数 UserExportReqVO reqVO = new UserExportReqVO(); reqVO.setUsername("yudao"); @@ -286,7 +286,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); // 调用 - List list = userService.getUsers(reqVO); + List list = userService.getUsers(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbUser, list.get(0)); @@ -295,9 +295,9 @@ public class UserServiceImplTest extends BaseDbUnitTest { /** * 初始化 getUserPage 方法的测试数据 */ - private SysUserDO initGetUserPageData() { + private UserDO initGetUserPageData() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(o -> { // 等会查询到 + UserDO dbUser = randomSysUserDO(o -> { // 等会查询到 o.setUsername("yudaoyuanma"); o.setMobile("15601691300"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -359,7 +359,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); // 断言 assertEquals(1, respVO.getCreateUsernames().size()); - SysUserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0)); + UserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0)); assertPojoEquals(importUser, user); assertEquals("java", user.getPassword()); assertEquals(0, respVO.getUpdateUsernames().size()); @@ -372,7 +372,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_03() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(); + UserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { @@ -402,7 +402,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_04() { // mock 数据 - SysUserDO dbUser = randomSysUserDO(); + UserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { @@ -422,7 +422,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 断言 assertEquals(0, respVO.getCreateUsernames().size()); assertEquals(1, respVO.getUpdateUsernames().size()); - SysUserDO user = userMapper.selectByUsername(respVO.getUpdateUsernames().get(0)); + UserDO user = userMapper.selectByUsername(respVO.getUpdateUsernames().get(0)); assertPojoEquals(importUser, user); assertEquals(0, respVO.getFailureUsernames().size()); } @@ -561,7 +561,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testCheckOldPassword_passwordFailed() { // mock 数据 - SysUserDO user = randomSysUserDO(); + UserDO user = randomSysUserDO(); userMapper.insert(user); // 准备参数 Long id = user.getId(); @@ -594,12 +594,12 @@ public class UserServiceImplTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static SysUserDO randomSysUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static UserDO randomSysUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 }; - return randomPojo(SysUserDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(UserDO.class, ArrayUtils.append(consumer, consumers)); } } From add08b1ecd6e0e516318ff7265e3e6ab509e38fd Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 30 Jan 2022 21:23:45 +0800 Subject: [PATCH 14/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=204=EF=BC=9Asystem=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E5=AE=9E=E7=8E=B0=20social=20API~~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/enums/UserTypeEnum.java | 12 +- .../user/{UserApi.java => MemberUserApi.java} | 2 +- .../member/api/user/dto/UserRespDTO.java | 2 + .../member/enums/ErrorCodeConstants.java | 27 +++ ...serApiImpl.java => MemberUserApiImpl.java} | 10 +- .../app/auth/AppAuthController.java | 32 +--- .../app/auth/vo/AppAuthCheckCodeReqVO.java | 4 +- .../app/auth/vo/AppAuthSendSmsReqVO.java | 4 +- .../app/auth/vo/AppAuthSocialBindReqVO.java | 3 +- .../app/user/AppUserController.java | 10 +- .../member/convert/auth/AuthConvert.java | 17 +- .../member/convert/user/UserConvert.java | 6 +- .../dal/dataobject/address/package-info.java | 1 + .../user/{UserDO.java => MemberUserDO.java} | 2 +- .../dal/mysql/sms/SysSmsCodeMapper.java | 28 --- .../dal/mysql/user/MemberUserMapper.java | 19 ++ .../member/dal/mysql/user/UserMapper.java | 19 -- .../enums/MemberErrorCodeConstants.java | 18 -- .../member/enums/SysErrorCodeConstants.java | 32 ---- .../module/member/enums/package-info.java | 4 + .../member/enums/sms/SysSmsSceneEnum.java | 54 ------ .../sms/SysSmsTemplateCodeConstants.java | 25 --- ...uthService.java => MemberAuthService.java} | 27 ++- ...ceImpl.java => MemberAuthServiceImpl.java} | 165 +++++++++--------- .../service/sms/SysSmsCodeServiceImpl.java | 137 --------------- ...serService.java => MemberUserService.java} | 11 +- ...ceImpl.java => MemberUserServiceImpl.java} | 48 ++--- .../service/auth/SysAuthServiceTest.java | 26 +-- ...ImplTest.java => UserServiceImplTest.java} | 42 ++--- .../yudao-module-system-api/pom.xml | 14 ++ .../system/api/auth/UserSessionApi.java | 56 ++++++ .../module/system/api/logger/LoginLogApi.java | 21 +++ .../api}/logger/dto/LoginLogCreateReqDTO.java | 2 +- .../yudao/module/system/api/package-info.java | 4 + .../system/api/social/SocialUserApi.java | 64 +++++++ .../api/social/dto/SocialUserBindReqDTO.java | 48 +++++ .../social/dto/SocialUserUnbindReqDTO.java | 44 +++++ .../system/enums/ErrorCodeConstants.java | 29 ++- .../system/enums/SysErrorCodeConstants.java | 37 ---- .../enums/logger/LoginLogTypeEnum.java} | 2 +- .../system/enums/logger/LoginResultEnum.java} | 2 +- .../module/system/enums/sms/SmsSceneEnum.java | 49 ++++++ .../yudao-module-system-impl/pom.xml | 5 + .../system/api/auth/UserSessionApiImpl.java | 47 +++++ .../system/api/logger/LoginLogApiImpl.java | 27 +++ .../yudao/module/system/api/package-info.java | 1 + .../system/api/social/SocialUserApiImpl.java | 71 ++++++++ .../controller/admin/auth/AuthController.java | 39 ++--- .../admin/auth/UserSessionController.java | 20 +-- .../controller/admin/dept/DeptController.java | 6 +- .../admin/logger/OperateLogController.java | 14 +- .../admin/permission/RoleController.java | 12 +- .../admin/sms/SmsCallbackController.java | 4 +- .../admin/sms/SmsTemplateController.java | 6 +- .../controller/admin/user/UserController.java | 30 ++-- .../admin/user/UserProfileController.java | 24 ++- .../system/convert/auth/AuthConvert.java | 12 +- .../convert/logger/OperateLogConvert.java | 4 +- .../logger/SysLoginLogCoreConvert.java | 2 +- .../convert/permission/RoleConvert.java | 12 +- .../system/convert/user/UserConvert.java | 24 +-- .../system/dal/dataobject/dept/SysDeptDO.java | 4 +- .../dal/dataobject/logger/OperateLogDO.java | 4 +- .../dal/dataobject/logger/SysLoginLogDO.java | 8 +- .../{SysRoleDO.java => RoleDO.java} | 4 +- .../{SysUserRoleDO.java => UserRoleDO.java} | 4 +- .../system/dal/dataobject/sms/SmsCodeDO.java | 8 +- .../dataobject/social/SysSocialUserDO.java | 4 +- .../user/{UserDO.java => AdminUserDO.java} | 2 +- .../{SysMenuMapper.java => MenuMapper.java} | 2 +- .../{SysRoleMapper.java => RoleMapper.java} | 26 +-- ...oleMenuMapper.java => RoleMenuMapper.java} | 2 +- .../mysql/permission/SysRoleCoreMapper.java | 9 - .../permission/SysUserRoleCoreMapper.java | 17 -- ...serRoleMapper.java => UserRoleMapper.java} | 26 +-- ...annelMapper.java => SmsChannelMapper.java} | 2 +- .../system/dal/mysql/sms/SmsCodeMapper.java | 26 +++ ...SysSmsLogMapper.java => SmsLogMapper.java} | 2 +- ...lateMapper.java => SmsTemplateMapper.java} | 2 +- .../dal/mysql/user/AdminUserMapper.java | 65 +++++++ .../system/dal/mysql/user/UserMapper.java | 68 -------- .../config/DataPermissionConfiguration.java | 4 +- .../framework/sms/SmsCodeConfiguration.java | 2 +- .../framework/sms/SmsCodeProperties.java | 4 +- .../mq/consumer/sms/SmsSendConsumer.java | 4 +- ...AuthService.java => AdminAuthService.java} | 2 +- ...iceImpl.java => AdminAuthServiceImpl.java} | 32 ++-- .../service/auth/UserSessionServiceImpl.java | 10 +- .../system/service/dept/DeptService.java | 51 ++++++ .../system/service/dept/DeptServiceImpl.java | 40 ++++- .../system/service/dept/PostService.java | 9 + .../system/service/dept/PostServiceImpl.java | 27 ++- .../service/dept/SysDeptCoreService.java | 59 ------- .../service/dept/SysPostCoreService.java | 19 -- .../dept/impl/SysDeptCoreServiceImpl.java | 68 -------- .../dept/impl/SysPostCoreServiceImpl.java | 50 ------ .../service/logger/LoginLogService.java | 5 +- .../service/logger/LoginLogServiceImpl.java | 8 +- .../service/logger/OperateLogServiceImpl.java | 10 +- .../service/permission/MenuServiceImpl.java | 4 +- .../service/permission/PermissionService.java | 8 + .../permission/PermissionServiceImpl.java | 40 +++-- .../service/permission/RoleService.java | 25 ++- .../service/permission/RoleServiceImpl.java | 66 ++++--- .../permission/SysPermissionCoreService.java | 20 --- .../permission/SysRoleCoreService.java | 19 -- .../impl/SysPermissionCoreServiceImpl.java | 28 --- .../impl/SysRoleCoreServiceImpl.java | 50 ------ .../service/sms/SmsChannelServiceImpl.java | 4 +- .../system/service/sms/SmsCodeService.java | 23 +-- .../service/sms/SmsCodeServiceImpl.java | 112 ++++++++++++ .../system/service/sms/SmsLogServiceImpl.java | 7 +- ...msSendService.java => SmsSendService.java} | 30 +++- ...rviceImpl.java => SmsSendServiceImpl.java} | 45 +++-- .../service/sms/SmsTemplateServiceImpl.java | 4 +- .../service/social/SocialUserService.java | 28 +-- .../service/social/SocialUserServiceImpl.java | 40 ++--- ...UserService.java => AdminUserService.java} | 28 +-- ...iceImpl.java => AdminUserServiceImpl.java} | 114 ++++-------- .../service/auth/AuthServiceImplTest.java | 14 +- .../auth/UserSessionServiceImplTest.java | 8 +- .../logger/LoginLogServiceImplTest.java | 24 ++- .../logger/OperateLogServiceImplTest.java | 10 +- .../service/permission/MenuServiceTest.java | 4 +- .../permission/PermissionServiceTest.java | 34 ++-- .../service/permission/RoleServiceTest.java | 64 +++---- .../service/sms/SmsChannelServiceTest.java | 4 +- .../system/service/sms/SmsLogServiceTest.java | 4 +- .../service/sms/SmsTemplateServiceTest.java | 4 +- .../service/sms/SysSmsSendServiceTest.java | 4 +- ...ceTest.java => SocialUserServiceTest.java} | 12 +- .../service/user/UserServiceImplTest.java | 147 ++++++---------- 132 files changed, 1649 insertions(+), 1587 deletions(-) rename yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/{UserApi.java => MemberUserApi.java} (90%) create mode 100644 yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/{UserApiImpl.java => MemberUserApiImpl.java} (64%) create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/address/package-info.java rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/{UserDO.java => MemberUserDO.java} (96%) delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/UserMapper.java delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCodeConstants.java delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/SysErrorCodeConstants.java create mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/package-info.java delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsSceneEnum.java delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsTemplateCodeConstants.java rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/{AuthService.java => MemberAuthService.java} (75%) rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/{AuthServiceImpl.java => MemberAuthServiceImpl.java} (61%) delete mode 100644 yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/{UserService.java => MemberUserService.java} (82%) rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/{UserServiceImpl.java => MemberUserServiceImpl.java} (70%) rename yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/{MbrUserServiceImplTest.java => UserServiceImplTest.java} (74%) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/UserSessionApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/LoginLogApi.java rename yudao-module-system/{yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service => yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api}/logger/dto/LoginLogCreateReqDTO.java (95%) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserBindReqDTO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserUnbindReqDTO.java delete mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java rename yudao-module-system/{yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java => yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginLogTypeEnum.java} (94%) rename yudao-module-system/{yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java => yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginResultEnum.java} (94%) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/auth/UserSessionApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/logger/LoginLogApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/{SysRoleDO.java => RoleDO.java} (94%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/{SysUserRoleDO.java => UserRoleDO.java} (88%) rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/sms/SysSmsCodeDO.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsCodeDO.java (85%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/{UserDO.java => AdminUserDO.java} (97%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/{SysMenuMapper.java => MenuMapper.java} (95%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/{SysRoleMapper.java => RoleMapper.java} (60%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/{SysRoleMenuMapper.java => RoleMenuMapper.java} (96%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleCoreMapper.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleCoreMapper.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/{SysUserRoleMapper.java => UserRoleMapper.java} (52%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/{SysSmsChannelMapper.java => SmsChannelMapper.java} (93%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsCodeMapper.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/{SysSmsLogMapper.java => SmsLogMapper.java} (96%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/{SysSmsTemplateMapper.java => SmsTemplateMapper.java} (97%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/UserMapper.java rename {yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/sms/SmsCodeConfiguration.java (82%) rename {yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system}/framework/sms/SmsCodeProperties.java (88%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/{AuthService.java => AdminAuthService.java} (95%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/{AuthServiceImpl.java => AdminAuthServiceImpl.java} (92%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptCoreService.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostCoreService.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysDeptCoreServiceImpl.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysPostCoreServiceImpl.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionCoreService.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleCoreService.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysPermissionCoreServiceImpl.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysRoleCoreServiceImpl.java rename yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java => yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java (62%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsSendService.java => SmsSendService.java} (63%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsSendServiceImpl.java => SmsSendServiceImpl.java} (84%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/{UserService.java => AdminUserService.java} (83%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/{UserServiceImpl.java => AdminUserServiceImpl.java} (76%) rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/{SocialUsererviceTest.java => SocialUserServiceTest.java} (91%) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java index edaba1dd96..c950c529db 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java @@ -1,20 +1,24 @@ package cn.iocoder.yudao.framework.common.enums; -import cn.hutool.core.lang.Matcher; import cn.hutool.core.util.ArrayUtil; +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; + /** * 全局用户类型枚举 */ @AllArgsConstructor @Getter -public enum UserTypeEnum { +public enum UserTypeEnum implements IntArrayValuable { MEMBER(1, "会员"), // 面向 c 端,普通用户 ADMIN(2, "管理员"); // 面向 b 端,管理后台 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(UserTypeEnum::getValue).toArray(); + /** * 类型 */ @@ -28,4 +32,8 @@ public enum UserTypeEnum { return ArrayUtil.firstMatch(userType -> userType.getValue().equals(value), UserTypeEnum.values()); } + @Override + public int[] array() { + return ARRAYS; + } } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java similarity index 90% rename from yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApi.java rename to yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java index ba742a2599..c6c37f9352 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApi.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; * * @author 芋道源码 */ -public interface UserApi { +public interface MemberUserApi { /** * 获得会员用户信息 diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/UserRespDTO.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/UserRespDTO.java index ef2ecde492..e7a5aba9a0 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/UserRespDTO.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/UserRespDTO.java @@ -1,12 +1,14 @@ package cn.iocoder.yudao.module.member.api.user.dto; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import lombok.Data; /** * 用户信息 Response DTO * * @author 芋道源码 */ +@Data public class UserRespDTO { /** diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java new file mode 100644 index 0000000000..260a0d12f7 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.member.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +/** + * Member 错误码枚举类 + * + * member 系统,使用 1-004-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== 用户相关 1004001000============ + ErrorCode USER_NOT_EXISTS = new ErrorCode(1004001000, "用户不存在"); + ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1004001001, "密码校验失败"); + + // ========== 文件相关 1004002000 =========== + // TODO 芋艿:可以删除 + ErrorCode FILE_IS_EMPTY = new ErrorCode(1004002000, "文件为空"); + + // ========== AUTH 模块 1004003000 ========== + ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1004003000, "登录失败,账号密码不正确"); + ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1004003001, "登录失败,账号被禁用"); + ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1004003002, "登录失败"); // 登录失败的兜底,未知原因 + ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1004003004, "Token 已经过期"); + ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1004003005, "未绑定账号,需要进行绑定"); + +} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApiImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java similarity index 64% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApiImpl.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java index 656642e511..35e7b51cec 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/UserApiImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.member.api.user; import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; import cn.iocoder.yudao.module.member.convert.user.UserConvert; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.member.service.user.UserService; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -16,14 +16,14 @@ import javax.annotation.Resource; */ @Service @Validated -public class UserApiImpl implements UserApi { +public class MemberUserApiImpl implements MemberUserApi { @Resource - private UserService userService; + private MemberUserService userService; @Override public UserRespDTO getUser(Long id) { - UserDO user = userService.getUser(id); + MemberUserDO user = userService.getUser(id); return UserConvert.INSTANCE.convert2(user); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java index e2924b82a6..d55d44dd79 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java @@ -1,18 +1,15 @@ package cn.iocoder.yudao.module.member.controller.app.auth; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; -import cn.iocoder.yudao.module.member.service.auth.AuthService; -import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; +import cn.iocoder.yudao.module.member.service.auth.MemberAuthService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,14 +28,8 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @Slf4j public class AppAuthController { - @Autowired - @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // AuthService 存在重名 - private AuthService authService; - @Resource - private SysSmsCodeService smsCodeService; - @Resource - private SysSocialCoreService socialService; + private MemberAuthService authService; @PostMapping("/login") @ApiOperation("使用手机 + 密码登录") @@ -62,14 +53,7 @@ public class AppAuthController { @ApiOperation(value = "发送手机验证码") @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 public CommonResult sendSmsCode(@RequestBody @Valid AppAuthSendSmsReqVO reqVO) { - smsCodeService.sendSmsCode(reqVO.getMobile(), reqVO.getScene(), getClientIP()); - return success(true); - } - - @GetMapping("/send-sms-code-login") // TODO 芋艿:post 比较合理 - @ApiOperation(value = "向已登录用户发送验证码",notes = "修改手机时验证原手机号使用") - public CommonResult sendSmsCodeLogin() { - smsCodeService.sendSmsCodeLogin(getLoginUserId()); + authService.sendSmsCode(getLoginUserId(), reqVO); return success(true); } @@ -100,18 +84,18 @@ public class AppAuthController { }) public CommonResult socialAuthRedirect(@RequestParam("type") Integer type, @RequestParam("redirectUri") String redirectUri) { - return CommonResult.success(socialService.getAuthorizeUrl(type, redirectUri)); + return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri)); } @PostMapping("/social-login") - @ApiOperation("社交登录,使用 code 授权码") + @ApiOperation(value = "社交登录,使用 code 授权码", notes = "适合未登录的用户,但是社交账号已绑定用户") public CommonResult socialLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) { String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent()); return success(AppAuthLoginRespVO.builder().token(token).build()); } @PostMapping("/social-login2") - @ApiOperation("社交登录,使用 手机号 + 手机验证码") + @ApiOperation(value = "社交登录,使用 手机号 + 手机验证码", notes = "适合未登录的用户,进行登录 + 绑定") @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 public CommonResult socialLogin2(@RequestBody @Valid AppAuthSocialLogin2ReqVO reqVO) { String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent()); @@ -119,7 +103,7 @@ public class AppAuthController { } @PostMapping("/social-bind") - @ApiOperation("社交绑定,使用 code 授权码") + @ApiOperation(value = "社交绑定,使用 code 授权码", notes = "使用在用户已经登录的情况下") @PreAuthenticated public CommonResult socialBind(@RequestBody @Valid AppAuthSocialBindReqVO reqVO) { authService.socialBind(getLoginUserId(), reqVO); @@ -130,7 +114,7 @@ public class AppAuthController { @ApiOperation("取消社交绑定") @PreAuthenticated public CommonResult socialUnbind(@RequestBody AppAuthSocialUnbindReqVO reqVO) { - socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.MEMBER); + authService.unbindSocialUser(getLoginUserId(), reqVO); return CommonResult.success(true); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java index 95fca74afa..63b113e0af 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -36,7 +36,7 @@ public class AppAuthCheckCodeReqVO { @ApiModelProperty(value = "发送场景", example = "1", notes = "对应 MbrSmsSceneEnum 枚举") @NotNull(message = "发送场景不能为空") - @InEnum(SysSmsSceneEnum.class) + @InEnum(SmsSceneEnum.class) private Integer scene; } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java index 41aa36936b..91656b1d49 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -21,7 +21,7 @@ public class AppAuthSendSmsReqVO { @ApiModelProperty(value = "发送场景", example = "1", notes = "对应 MbrSmsSceneEnum 枚举") @NotNull(message = "发送场景不能为空") - @InEnum(SysSmsSceneEnum.class) + @InEnum(SmsSceneEnum.class) private Integer scene; } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java index 46ad9b6270..3ca4083185 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.member.controller.app.auth.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -19,7 +20,7 @@ import javax.validation.constraints.NotNull; public class AppAuthSocialBindReqVO { @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") - @InEnum(SysSocialTypeEnum.class) + @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java index 9f1d25d786..94d67d4cfc 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppUserController.java @@ -5,8 +5,8 @@ import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserInfoRespVO; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; import cn.iocoder.yudao.module.member.convert.user.UserConvert; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.member.service.user.UserService; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -21,7 +21,7 @@ import java.io.IOException; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.*; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static cn.iocoder.yudao.module.member.enums.MemberErrorCodeConstants.FILE_IS_EMPTY; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.FILE_IS_EMPTY; @Api(tags = "用户 APP - 用户个人中心") @RestController @@ -31,7 +31,7 @@ import static cn.iocoder.yudao.module.member.enums.MemberErrorCodeConstants.FILE public class AppUserController { @Resource - private UserService userService; + private MemberUserService userService; @PutMapping("/update-nickname") @ApiOperation("修改用户昵称") @@ -56,7 +56,7 @@ public class AppUserController { @ApiOperation("获得基本信息") @PreAuthenticated public CommonResult getUserInfo() { - UserDO user = userService.getUser(getLoginUserId()); + MemberUserDO user = userService.getUser(getLoginUserId()); return success(UserConvert.INSTANCE.convert(user)); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java index 419a70e0ba..ddb545aa5f 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java @@ -2,7 +2,13 @@ package cn.iocoder.yudao.module.member.convert.auth; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialBindReqVO; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialLogin2ReqVO; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialLoginReqVO; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialUnbindReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @@ -13,11 +19,16 @@ public interface AuthConvert { AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); @Mapping(source = "mobile", target = "username") - LoginUser convert0(UserDO bean); + LoginUser convert0(MemberUserDO bean); - default LoginUser convert(UserDO bean) { + default LoginUser convert(MemberUserDO bean) { // 目的,为了设置 UserTypeEnum.MEMBER.getValue() return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue()); } + SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialBindReqVO reqVO); + SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialLogin2ReqVO reqVO); + SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialLoginReqVO reqVO); + SocialUserUnbindReqDTO convert(Long userId, Integer value, AppAuthSocialUnbindReqVO reqVO); + } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java index a490edfafc..b72051d63a 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/user/UserConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.member.convert.user; import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserInfoRespVO; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -11,7 +11,7 @@ public interface UserConvert { UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); - AppUserInfoRespVO convert(UserDO bean); + AppUserInfoRespVO convert(MemberUserDO bean); - UserRespDTO convert2(UserDO bean); + UserRespDTO convert2(MemberUserDO bean); } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/address/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/address/package-info.java new file mode 100644 index 0000000000..c318d2c941 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/address/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.member.dal.dataobject.address; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java similarity index 96% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java index adefe1429d..155505292d 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/UserDO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java @@ -22,7 +22,7 @@ import java.util.Date; @Builder @NoArgsConstructor @AllArgsConstructor -public class UserDO extends TenantBaseDO { +public class MemberUserDO extends TenantBaseDO { /** * 用户ID diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java deleted file mode 100644 index ccdbcf6cec..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/sms/SysSmsCodeMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.member.dal.mysql.sms; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; -import org.apache.ibatis.annotations.Mapper; - -// TODO @芋艿:拿到 system 模块下 -@Mapper -public interface SysSmsCodeMapper extends BaseMapperX { - - /** - * 获得手机号的最后一个手机验证码 - * - * @param mobile 手机号 - * @param scene 发送场景,选填 - * @param code 验证码 选填 - * @return 手机验证码 - */ - default SysSmsCodeDO selectLastByMobile(String mobile,String code,Integer scene) { - return selectOne(new QueryWrapperX() - .eq("mobile", mobile) - .eqIfPresent("scene", scene) - .eqIfPresent("code", code) - .orderByDesc("id") - .last("LIMIT 1")); - } -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java new file mode 100644 index 0000000000..9ba09a111c --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.member.dal.mysql.user; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 会员 User Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MemberUserMapper extends BaseMapperX { + + default MemberUserDO selectByMobile(String mobile) { + return selectOne(MemberUserDO::getMobile, mobile); + } + +} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/UserMapper.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/UserMapper.java deleted file mode 100644 index d962811e67..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/UserMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.member.dal.mysql.user; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 会员 User Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface UserMapper extends BaseMapperX { - - default UserDO selectByMobile(String mobile) { - return selectOne(UserDO::getMobile, mobile); - } - -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCodeConstants.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCodeConstants.java deleted file mode 100644 index 4ee545b1bf..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCodeConstants.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.yudao.module.member.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; - -/** - * Member 错误码枚举类 - * - * member 系统,使用 1-004-000-000 段 - */ -public interface MemberErrorCodeConstants { - - // ==========用户相关 1004001000============ - ErrorCode USER_NOT_EXISTS = new ErrorCode(1004001000, "用户不存在"); - - // ==========文件相关 1004002000 =========== - ErrorCode FILE_IS_EMPTY = new ErrorCode(1004002000, "文件为空"); - -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/SysErrorCodeConstants.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/SysErrorCodeConstants.java deleted file mode 100644 index b1b23a3526..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/SysErrorCodeConstants.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.member.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; - -/** - * System 错误码枚举类 - * - * system 系统,使用 1-005-000-000 段 - */ -public interface SysErrorCodeConstants { - - // ========== AUTH 模块 1005000000 ========== - ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1005000000, "登录失败,账号密码不正确"); - ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1005000001, "登录失败,账号被禁用"); - ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1005000002, "登录失败"); // 登录失败的兜底,未知原因 - ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1005000003, "Token 已经过期"); - ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1005000004, "未绑定账号,需要进行绑定"); - - // ========== SMS CODE 模块 1005001000 ========== - ErrorCode USER_SMS_CODE_NOT_FOUND = new ErrorCode(1005001000, "验证码不存在"); - ErrorCode USER_SMS_CODE_EXPIRED = new ErrorCode(1005001001, "验证码已过期"); - ErrorCode USER_SMS_CODE_USED = new ErrorCode(1005001002, "验证码已使用"); - ErrorCode USER_SMS_CODE_NOT_CORRECT = new ErrorCode(1005001003, "验证码不正确"); - ErrorCode USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY = new ErrorCode(1005001004, "超过每日短信发送数量"); - ErrorCode USER_SMS_CODE_SEND_TOO_FAST = new ErrorCode(1005001005, "短信发送过于频率"); - ErrorCode USER_SMS_CODE_IS_EXISTS = new ErrorCode(1005001006, "手机号已被使用"); - ErrorCode USER_SMS_CODE_IS_UNUSED = new ErrorCode(1005001006, "验证码未被使用"); - - // ========== 用户模块 1005002000 ========== - ErrorCode USER_NOT_EXISTS = new ErrorCode(1005002001, "用户不存在"); - ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1005002003, "密码校验失败"); -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/package-info.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/package-info.java new file mode 100644 index 0000000000..9e136937a0 --- /dev/null +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package cn.iocoder.yudao.module.member.enums; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsSceneEnum.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsSceneEnum.java deleted file mode 100644 index a471901176..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsSceneEnum.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.module.member.enums.sms; - -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 用户短信验证码发送场景的枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum SysSmsSceneEnum implements IntArrayValuable { - - LOGIN_BY_SMS(1,SysSmsTemplateCodeConstants.USER_SMS_LOGIN, "手机号登陆"), - CHANGE_MOBILE_BY_SMS(2,SysSmsTemplateCodeConstants.USER_SMS_UPDATE_MOBILE, "更换手机号"), - FORGET_MOBILE_BY_SMS(3,SysSmsTemplateCodeConstants.USER_SMS_RESET_PASSWORD, "忘记密码"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSmsSceneEnum::getScene).toArray(); - - /** - * 验证那场景编号 - */ - private final Integer scene; - - /** - * 模版编码 - */ - private final String code; - - /** - * 描述 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - - public static String getCodeByScene(Integer scene){ - for (SysSmsSceneEnum value : values()) { - if (value.getScene().equals(scene)){ - return value.getCode(); - } - } - return null; - } - -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsTemplateCodeConstants.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsTemplateCodeConstants.java deleted file mode 100644 index 3ad8439cd6..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/enums/sms/SysSmsTemplateCodeConstants.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.module.member.enums.sms; - -/** - * yudao-user-server 使用到的短信模板的 Code 编码的枚举 - * - * @author 芋道源码 - */ -public interface SysSmsTemplateCodeConstants { - - /** - * 前台用户短信登录 - */ - String USER_SMS_LOGIN = "user-sms-login"; - - /** - * 用户忘记密码 - */ - String USER_SMS_RESET_PASSWORD = "user-sms-reset-password"; - - /** - * 用户更新手机号 - */ - String USER_SMS_UPDATE_MOBILE = "user-sms-update-mobile"; - -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthService.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java similarity index 75% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthService.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java index 98b87c505d..b72ac5ee77 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthService.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java @@ -12,7 +12,7 @@ import javax.validation.Valid; * * @author 芋道源码 */ -public interface AuthService extends SecurityAuthFrameworkService { +public interface MemberAuthService extends SecurityAuthFrameworkService { /** * 手机 + 密码登录 @@ -63,6 +63,23 @@ public interface AuthService extends SecurityAuthFrameworkService { */ void socialBind(Long userId, @Valid AppAuthSocialBindReqVO reqVO); + /** + * 取消社交绑定 + * + * @param userId 用户编号 + * @param reqVO 解绑信息 + */ + void unbindSocialUser(Long userId, @Valid AppAuthSocialUnbindReqVO reqVO); + + /** + * 获得社交认证 URL + * + * @param type 社交平台类型 + * @param redirectUri 跳转地址 + * @return 认证 URL + */ + String getSocialAuthorizeUrl(Integer type, String redirectUri); + /** * 修改用户密码 * @param userId 用户id @@ -76,4 +93,12 @@ public interface AuthService extends SecurityAuthFrameworkService { */ void resetPassword(AppAuthResetPasswordReqVO userReqVO); + /** + * 给用户发送短信验证码 + * + * @param userId 用户编号 + * @param reqVO 发送信息 + */ + void sendSmsCode(Long userId, AppAuthSendSmsReqVO reqVO); + } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java similarity index 61% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java index 0cf21d1a9f..6158326c5b 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/AuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java @@ -1,14 +1,6 @@ package cn.iocoder.yudao.module.member.service.auth; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; -import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.module.system.service.auth.SysUserSessionCoreService; -import cn.iocoder.yudao.module.system.service.logger.SysLoginLogCoreService; -import cn.iocoder.yudao.module.system.service.logger.dto.SysLoginLogCreateReqDTO; -import cn.iocoder.yudao.module.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; @@ -17,14 +9,18 @@ import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.member.dal.mysql.user.UserMapper; -import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; -import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; -import cn.iocoder.yudao.module.member.service.user.UserService; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; +import cn.iocoder.yudao.module.system.api.auth.UserSessionApi; +import cn.iocoder.yudao.module.system.api.logger.LoginLogApi; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.api.social.SocialUserApi; +import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthUser; import org.springframework.context.annotation.Lazy; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; @@ -38,46 +34,45 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.List; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*; /** * 会员的认证 Service 接口 * * @author 芋道源码 */ -@Service("memberAuthService") +@Service @Slf4j -public class AuthServiceImpl implements AuthService { +public class MemberAuthServiceImpl implements MemberAuthService { @Resource @Lazy // 延迟加载,因为存在相互依赖的问题 private AuthenticationManager authenticationManager; @Resource - private UserService userService; + private MemberUserService userService; @Resource private SysSmsCodeService smsCodeService; @Resource - private SysLoginLogCoreService loginLogCoreService; + private LoginLogApi loginLogApi; @Resource - private SysUserSessionCoreService userSessionCoreService; + private UserSessionApi userSessionApi; @Resource - private SysSocialCoreService socialService; + private SocialUserApi socialUserApi; @Resource private PasswordEncoder passwordEncoder; @Resource - private UserMapper userMapper; + private MemberUserMapper userMapper; @Override public UserDetails loadUserByUsername(String mobile) throws UsernameNotFoundException { // 获取 username 对应的 SysUserDO - UserDO user = userService.getUserByMobile(mobile); + MemberUserDO user = userService.getUserByMobile(mobile); if (user == null) { throw new UsernameNotFoundException(mobile); } @@ -91,86 +86,87 @@ public class AuthServiceImpl implements AuthService { LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword()); // 缓存登录用户到 Redis 中,返回 sessionId 编号 - return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); + return userSessionApi.createUserSession(loginUser, userIp, userAgent); } @Override @Transactional public String smsLogin(AppAuthSmsLoginReqVO reqVO, String userIp, String userAgent) { // 校验验证码 - smsCodeService.useSmsCode(reqVO.getMobile(), SysSmsSceneEnum.LOGIN_BY_SMS.getScene(), + smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_LOGIN.getScene(), reqVO.getCode(), userIp); // 获得获得注册用户 - UserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp); + MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp); Assert.notNull(user, "获取用户失败,结果为空"); // 执行登陆 - this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_SMS, SysLoginResultEnum.SUCCESS); + this.createLoginLog(user.getMobile(), LoginLogTypeEnum.LOGIN_SMS, LoginResultEnum.SUCCESS); LoginUser loginUser = AuthConvert.INSTANCE.convert(user); // 缓存登录用户到 Redis 中,返回 sessionId 编号 - return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); + return userSessionApi.createUserSession(loginUser, userIp, userAgent); } @Override public String socialLogin(AppAuthSocialLoginReqVO reqVO, String userIp, String userAgent) { - // 使用 code 授权码,进行登录 - AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); - org.springframework.util.Assert.notNull(authUser, "授权用户不为空"); - - // 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错 - String unionId = socialService.getAuthUserUnionId(authUser); - List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, getUserType()); - if (CollUtil.isEmpty(socialUsers)) { + // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 + Long userId = socialUserApi.getBindUserId(UserTypeEnum.MEMBER.getValue(), reqVO.getType(), + reqVO.getCode(), reqVO.getState()); + if (userId == null) { throw exception(AUTH_THIRD_LOGIN_NOT_BIND); } // 自动登录 - UserDO user = userService.getUser(socialUsers.get(0).getUserId()); + MemberUserDO user = userService.getUser(userId); if (user == null) { throw exception(USER_NOT_EXISTS); } - this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_SOCIAL, SysLoginResultEnum.SUCCESS); + this.createLoginLog(user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, LoginResultEnum.SUCCESS); // 创建 LoginUser 对象 LoginUser loginUser = AuthConvert.INSTANCE.convert(user); // 绑定社交用户(更新) - socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); + socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); // 缓存登录用户到 Redis 中,返回 sessionId 编号 - return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); + return userSessionApi.createUserSession(loginUser, userIp, userAgent); } @Override public String socialLogin2(AppAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) { - AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); - org.springframework.util.Assert.notNull(authUser, "授权用户不为空"); + // 校验社交平台的认证信息是否正确 + socialUserApi.checkSocialUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); // 使用手机号、手机验证码登录 AppAuthSmsLoginReqVO loginReqVO = AppAuthSmsLoginReqVO.builder() .mobile(reqVO.getMobile()).code(reqVO.getSmsCode()).build(); String sessionId = this.smsLogin(loginReqVO, userIp, userAgent); - LoginUser loginUser = userSessionCoreService.getLoginUser(sessionId); + LoginUser loginUser = userSessionApi.getLoginUser(sessionId); // 绑定社交用户(新增) - socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); + socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); return sessionId; } @Override public void socialBind(Long userId, AppAuthSocialBindReqVO reqVO) { - // 使用 code 授权码,进行登录 - AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); - org.springframework.util.Assert.notNull(authUser, "授权用户不为空"); + socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(userId, getUserType().getValue(), reqVO)); + } - // 绑定社交用户(新增) - socialService.bindSocialUser(userId, reqVO.getType(), authUser, getUserType()); + @Override + public void unbindSocialUser(Long userId, AppAuthSocialUnbindReqVO reqVO) { + socialUserApi.unbindSocialUser(AuthConvert.INSTANCE.convert(userId, getUserType().getValue(), reqVO)); + } + + @Override + public String getSocialAuthorizeUrl(Integer type, String redirectUri) { + return socialUserApi.getAuthorizeUrl(type, redirectUri); } private LoginUser login0(String username, String password) { - final SysLoginLogTypeEnum logTypeEnum = SysLoginLogTypeEnum.LOGIN_USERNAME; + final LoginLogTypeEnum logType = LoginLogTypeEnum.LOGIN_USERNAME; // 用户验证 Authentication authentication; try { @@ -179,28 +175,28 @@ public class AuthServiceImpl implements AuthService { authentication = authenticationManager.authenticate(new MultiUsernamePasswordAuthenticationToken( username, password, getUserType())); } catch (BadCredentialsException badCredentialsException) { - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.BAD_CREDENTIALS); + this.createLoginLog(username, logType, LoginResultEnum.BAD_CREDENTIALS); throw exception(AUTH_LOGIN_BAD_CREDENTIALS); } catch (DisabledException disabledException) { - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.USER_DISABLED); + this.createLoginLog(username, logType, LoginResultEnum.USER_DISABLED); throw exception(AUTH_LOGIN_USER_DISABLED); } catch (AuthenticationException authenticationException) { log.error("[login0][username({}) 发生未知异常]", username, authenticationException); - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.UNKNOWN_ERROR); + this.createLoginLog(username, logType, LoginResultEnum.UNKNOWN_ERROR); throw exception(AUTH_LOGIN_FAIL_UNKNOWN); } // 登录成功的日志 Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); - this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.SUCCESS); + this.createLoginLog(username, logType, LoginResultEnum.SUCCESS); return (LoginUser) authentication.getPrincipal(); } - private void createLoginLog(String mobile, SysLoginLogTypeEnum logTypeEnum, SysLoginResultEnum loginResult) { + private void createLoginLog(String mobile, LoginLogTypeEnum logType, LoginResultEnum loginResult) { // 获得用户 - UserDO user = userService.getUserByMobile(mobile); + MemberUserDO user = userService.getUserByMobile(mobile); // 插入登录日志 - SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); - reqDTO.setLogType(logTypeEnum.getType()); + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); + reqDTO.setLogType(logType.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); if (user != null) { reqDTO.setUserId(user.getId()); @@ -209,9 +205,9 @@ public class AuthServiceImpl implements AuthService { reqDTO.setUserAgent(ServletUtils.getUserAgent()); reqDTO.setUserIp(getClientIP()); reqDTO.setResult(loginResult.getResult()); - loginLogCoreService.createLoginLog(reqDTO); + loginLogApi.createLoginLog(reqDTO); // 更新最后登录时间 - if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { + if (user != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { userService.updateUserLogin(user.getId(), getClientIP()); } } @@ -219,7 +215,7 @@ public class AuthServiceImpl implements AuthService { @Override public LoginUser verifyTokenAndRefresh(String token) { // 获得 LoginUser - LoginUser loginUser = userSessionCoreService.getLoginUser(token); + LoginUser loginUser = userSessionApi.getLoginUser(token); if (loginUser == null) { return null; } @@ -231,31 +227,31 @@ public class AuthServiceImpl implements AuthService { private void refreshLoginUserCache(String token, LoginUser loginUser) { // 每 1/3 的 Session 超时时间,刷新 LoginUser 缓存 if (System.currentTimeMillis() - loginUser.getUpdateTime().getTime() < - userSessionCoreService.getSessionTimeoutMillis() / 3) { + userSessionApi.getSessionTimeoutMillis() / 3) { return; } // 重新加载 UserDO 信息 - UserDO user = userService.getUser(loginUser.getId()); + MemberUserDO user = userService.getUser(loginUser.getId()); if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) { // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面 throw exception(AUTH_TOKEN_EXPIRED); } // 刷新 LoginUser 缓存 - userSessionCoreService.refreshUserSession(token, loginUser); + userSessionApi.refreshUserSession(token, loginUser); } @Override public LoginUser mockLogin(Long userId) { // 获取用户编号对应的 UserDO - UserDO user = userService.getUser(userId); + MemberUserDO user = userService.getUser(userId); if (user == null) { throw new UsernameNotFoundException(String.valueOf(userId)); } // 执行登陆 - this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_MOCK, SysLoginResultEnum.SUCCESS); + this.createLoginLog(user.getMobile(), LoginLogTypeEnum.LOGIN_MOCK, LoginResultEnum.SUCCESS); // 创建 LoginUser 对象 return AuthConvert.INSTANCE.convert(user); @@ -264,12 +260,12 @@ public class AuthServiceImpl implements AuthService { @Override public void logout(String token) { // 查询用户信息 - LoginUser loginUser = userSessionCoreService.getLoginUser(token); + LoginUser loginUser = userSessionApi.getLoginUser(token); if (loginUser == null) { return; } // 删除 session - userSessionCoreService.deleteUserSession(token); + userSessionApi.deleteUserSession(token); // 记录登出日志 this.createLogoutLog(loginUser.getId(), loginUser.getUsername()); } @@ -282,10 +278,10 @@ public class AuthServiceImpl implements AuthService { @Override public void updatePassword(Long userId, AppAuthUpdatePasswordReqVO reqVO) { // 检验旧密码 - UserDO userDO = checkOldPassword(userId, reqVO.getOldPassword()); + MemberUserDO userDO = checkOldPassword(userId, reqVO.getOldPassword()); // 更新用户密码 - UserDO mbrUserDO = UserDO.builder().id(userDO.getId()) + MemberUserDO mbrUserDO = MemberUserDO.builder().id(userDO.getId()) .password(passwordEncoder.encode(reqVO.getPassword())).build(); userMapper.updateById(mbrUserDO); } @@ -293,19 +289,24 @@ public class AuthServiceImpl implements AuthService { @Override public void resetPassword(AppAuthResetPasswordReqVO reqVO) { // 检验用户是否存在 - UserDO userDO = checkUserIfExists(reqVO.getMobile()); + MemberUserDO userDO = checkUserIfExists(reqVO.getMobile()); // 使用验证码 - smsCodeService.useSmsCode(reqVO.getMobile(),SysSmsSceneEnum.FORGET_MOBILE_BY_SMS.getScene(), reqVO.getCode(), + smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_FORGET_PASSWORD.getScene(), reqVO.getCode(), getClientIP()); // 更新密码 - UserDO mbrUserDO = UserDO.builder().build(); + MemberUserDO mbrUserDO = MemberUserDO.builder().build(); mbrUserDO.setId(userDO.getId()); mbrUserDO.setPassword(passwordEncoder.encode(reqVO.getPassword())); userMapper.updateById(mbrUserDO); } + @Override + public void sendSmsCode(Long userId, AppAuthSendSmsReqVO reqVO) { + // TODO 芋艿:修改 + } + /** * 校验旧密码 * @@ -314,8 +315,8 @@ public class AuthServiceImpl implements AuthService { * @return MemberUserDO 用户实体 */ @VisibleForTesting - public UserDO checkOldPassword(Long id, String oldPassword) { - UserDO user = userMapper.selectById(id); + public MemberUserDO checkOldPassword(Long id, String oldPassword) { + MemberUserDO user = userMapper.selectById(id); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -326,8 +327,8 @@ public class AuthServiceImpl implements AuthService { return user; } - public UserDO checkUserIfExists(String mobile) { - UserDO user = userMapper.selectByMobile(mobile); + public MemberUserDO checkUserIfExists(String mobile) { + MemberUserDO user = userMapper.selectByMobile(mobile); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -335,16 +336,16 @@ public class AuthServiceImpl implements AuthService { } private void createLogoutLog(Long userId, String username) { - SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); - reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType()); + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); + reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); reqDTO.setUserId(userId); reqDTO.setUserType(getUserType().getValue()); reqDTO.setUsername(username); reqDTO.setUserAgent(ServletUtils.getUserAgent()); reqDTO.setUserIp(getClientIP()); - reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult()); - loginLogCoreService.createLoginLog(reqDTO); + reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); + loginLogApi.createLoginLog(reqDTO); } } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java deleted file mode 100644 index b15f485686..0000000000 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeServiceImpl.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.iocoder.yudao.module.member.service.sms; - -import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.module.system.service.sms.SysSmsCoreService; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.member.dal.mysql.sms.SysSmsCodeMapper; -import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; -import cn.iocoder.yudao.module.member.framework.sms.SmsCodeProperties; -import cn.iocoder.yudao.module.member.service.user.UserService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Date; - -import static cn.hutool.core.util.RandomUtil.randomInt; -import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants.*; - -/** - * 短信验证码 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class SysSmsCodeServiceImpl implements SysSmsCodeService { - - @Resource - private SmsCodeProperties smsCodeProperties; - - @Resource - private SysSmsCodeMapper smsCodeMapper; - - @Resource - private UserService userService; - - @Resource - private SysSmsCoreService smsCoreService; - - @Override - public void sendSmsCode(String mobile, Integer scene, String createIp) { - // 创建验证码 - String code = this.createSmsCode(mobile, scene, createIp); - - // 获取发送模板 - String codeTemplate = SysSmsSceneEnum.getCodeByScene(scene); - - // 如果是更换手机号发送验证码,则需要检测手机号是否被注册 - if (SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene().equals(scene)){ - this.checkMobileIsRegister(mobile,scene); - } - - // 发送验证码 - smsCoreService.sendSingleSmsToMember(mobile, null, codeTemplate, - MapUtil.of("code", code)); - } - - public void checkMobileIsRegister(String mobile, Integer scene) { - // 检测手机号是否已被使用 - UserDO user = userService.getUserByMobile(mobile); - if (user != null) { - throw ServiceExceptionUtil.exception(USER_SMS_CODE_IS_EXISTS); - } - - // 发送短信 - this.sendSmsCode(mobile,scene,getClientIP()); - } - - private String createSmsCode(String mobile, Integer scene, String ip) { - // 校验是否可以发送验证码,不用筛选场景 - SysSmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null,null); - if (lastSmsCode != null) { - if (lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 - throw ServiceExceptionUtil.exception(USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); - } - if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() - < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 - throw ServiceExceptionUtil.exception(USER_SMS_CODE_SEND_TOO_FAST); - } - // TODO 芋艿:提升,每个 IP 每天可发送数量 - // TODO 芋艿:提升,每个 IP 每小时可发送数量 - } - - // 创建验证码记录 - String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1)); - SysSmsCodeDO newSmsCode = SysSmsCodeDO.builder().mobile(mobile).code(code) - .scene(scene).todayIndex(lastSmsCode != null ? lastSmsCode.getTodayIndex() + 1 : 1) - .createIp(ip).used(false).build(); - smsCodeMapper.insert(newSmsCode); - return code; - } - - @Override - public void useSmsCode(String mobile, Integer scene, String code, String usedIp) { - // 检测验证码是否有效 - SysSmsCodeDO lastSmsCode = this.checkCodeIsExpired(mobile, code, scene); - - // 判断验证码是否已被使用 - if (Boolean.TRUE.equals(lastSmsCode.getUsed())) { - throw ServiceExceptionUtil.exception(USER_SMS_CODE_USED); - } - - // 使用验证码 - smsCodeMapper.updateById(SysSmsCodeDO.builder().id(lastSmsCode.getId()) - .used(true).usedTime(new Date()).usedIp(usedIp).build()); - } - - @Override - public void sendSmsCodeLogin(Long userId) { - UserDO user = userService.getUser(userId); - if (user == null){ - throw ServiceExceptionUtil.exception(USER_NOT_EXISTS); - } - // 发送验证码 - this.sendSmsCode(user.getMobile(),SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), getClientIP()); - } - - @Override - public SysSmsCodeDO checkCodeIsExpired(String mobile, String code, Integer scene) { - // 校验验证码 - SysSmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile,code,scene); - - // 若验证码不存在,抛出异常 - if (lastSmsCode == null) { - throw ServiceExceptionUtil.exception(USER_SMS_CODE_NOT_FOUND); - } - if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() - >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期 - throw ServiceExceptionUtil.exception(USER_SMS_CODE_EXPIRED); - } - return lastSmsCode; - } - -} diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserService.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java similarity index 82% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserService.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java index 454e19dc63..1a38e61af1 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserService.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java @@ -1,9 +1,8 @@ package cn.iocoder.yudao.module.member.service.user; import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserInfoRespVO; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import java.io.InputStream; @@ -12,7 +11,7 @@ import java.io.InputStream; * * @author 芋道源码 */ -public interface UserService { +public interface MemberUserService { /** * 通过手机查询用户 @@ -20,7 +19,7 @@ public interface UserService { * @param mobile 手机 * @return 用户对象 */ - UserDO getUserByMobile(String mobile); + MemberUserDO getUserByMobile(String mobile); /** * 基于手机号创建用户。 @@ -30,7 +29,7 @@ public interface UserService { * @param registerIp 注册 IP * @return 用户对象 */ - UserDO createUserIfAbsent(@Mobile String mobile, String registerIp); + MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp); /** * 更新用户的最后登陆信息 @@ -46,7 +45,7 @@ public interface UserService { * @param id 用户ID * @return 用户对象信息 */ - UserDO getUser(Long id); + MemberUserDO getUser(Long id); /** * 修改用户昵称 diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java similarity index 70% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java rename to yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index fd0dd05827..f3348e2347 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/UserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -6,11 +6,11 @@ import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreServic import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.member.dal.mysql.user.UserMapper; +import cn.iocoder.yudao.module.member.dal.dataobject.sms.SmsCodeDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; import cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants; -import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; @@ -25,20 +25,20 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.module.member.enums.MemberErrorCodeConstants.USER_NOT_EXISTS; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.USER_NOT_EXISTS; /** * 会员 User Service 实现类 * * @author 芋道源码 */ -@Service("memberUserService") +@Service @Valid @Slf4j -public class UserServiceImpl implements UserService { +public class MemberUserServiceImpl implements MemberUserService { @Resource - private UserMapper memberUserMapper; + private MemberUserMapper memberUserMapper; @Resource private InfFileCoreService fileCoreService; @@ -49,14 +49,14 @@ public class UserServiceImpl implements UserService { private PasswordEncoder passwordEncoder; @Override - public UserDO getUserByMobile(String mobile) { + public MemberUserDO getUserByMobile(String mobile) { return memberUserMapper.selectByMobile(mobile); } @Override - public UserDO createUserIfAbsent(String mobile, String registerIp) { + public MemberUserDO createUserIfAbsent(String mobile, String registerIp) { // 用户已经存在 - UserDO user = memberUserMapper.selectByMobile(mobile); + MemberUserDO user = memberUserMapper.selectByMobile(mobile); if (user != null) { return user; } @@ -64,11 +64,11 @@ public class UserServiceImpl implements UserService { return this.createUser(mobile, registerIp); } - private UserDO createUser(String mobile, String registerIp) { + private MemberUserDO createUser(String mobile, String registerIp) { // 生成密码 String password = IdUtil.fastSimpleUUID(); // 插入用户 - UserDO user = new UserDO(); + MemberUserDO user = new MemberUserDO(); user.setMobile(mobile); user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 user.setPassword(passwordEncoder.encode(password)); // 加密密码 @@ -79,23 +79,23 @@ public class UserServiceImpl implements UserService { @Override public void updateUserLogin(Long id, String loginIp) { - memberUserMapper.updateById(new UserDO().setId(id) + memberUserMapper.updateById(new MemberUserDO().setId(id) .setLoginIp(loginIp).setLoginDate(new Date())); } @Override - public UserDO getUser(Long id) { + public MemberUserDO getUser(Long id) { return memberUserMapper.selectById(id); } @Override public void updateUserNickname(Long userId, String nickname) { - UserDO user = this.checkUserExists(userId); + MemberUserDO user = this.checkUserExists(userId); // 仅当新昵称不等于旧昵称时进行修改 if (nickname.equals(user.getNickname())){ return; } - UserDO userDO = new UserDO(); + MemberUserDO userDO = new MemberUserDO(); userDO.setId(user.getId()); userDO.setNickname(nickname); memberUserMapper.updateById(userDO); @@ -107,7 +107,7 @@ public class UserServiceImpl implements UserService { // 创建文件 String avatar = fileCoreService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); // 更新头像路径 - memberUserMapper.updateById(UserDO.builder().id(userId).avatar(avatar).build()); + memberUserMapper.updateById(MemberUserDO.builder().id(userId).avatar(avatar).build()); return avatar; } @@ -117,27 +117,27 @@ public class UserServiceImpl implements UserService { checkUserExists(userId); // 校验旧手机和旧验证码 - SysSmsCodeDO sysSmsCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(), - SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene()); + SmsCodeDO sysSmsCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(), + SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()); // 判断旧 code 是否未被使用,如果是,抛出异常 if (Boolean.FALSE.equals(sysSmsCodeDO.getUsed())){ throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_IS_UNUSED); } // 使用新验证码 - smsCodeService.useSmsCode(reqVO.getMobile(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), + smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene(), reqVO.getCode(),getClientIP()); // 更新用户手机 - memberUserMapper.updateById(UserDO.builder().id(userId).mobile(reqVO.getMobile()).build()); + memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(reqVO.getMobile()).build()); } @VisibleForTesting - public UserDO checkUserExists(Long id) { + public MemberUserDO checkUserExists(Long id) { if (id == null) { return null; } - UserDO user = memberUserMapper.selectById(id); + MemberUserDO user = memberUserMapper.selectById(id); if (user == null) { throw exception(USER_NOT_EXISTS); } diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java index 93eb2878ea..06f782ffbe 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.member.service.auth; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.system.service.auth.SysUserSessionCoreService; import cn.iocoder.yudao.module.system.service.logger.SysLoginLogCoreService; import cn.iocoder.yudao.module.system.service.social.SysSocialCoreService; @@ -8,10 +9,9 @@ import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthResetPasswordReqVO; import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthUpdatePasswordReqVO; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.member.dal.mysql.user.UserMapper; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; -import cn.iocoder.yudao.module.member.service.user.UserService; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -32,17 +32,17 @@ import static org.mockito.Mockito.when; // TODO @芋艿:单测的 review,等逻辑都达成一致后 /** - * {@link AuthService} 的单元测试类 + * {@link MemberAuthService} 的单元测试类 * * @author 宋天 */ -@Import({AuthServiceImpl.class, YudaoRedisAutoConfiguration.class}) +@Import({MemberAuthServiceImpl.class, YudaoRedisAutoConfiguration.class}) public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { @MockBean private AuthenticationManager authenticationManager; @MockBean - private UserService userService; + private MemberUserService userService; @MockBean private SysSmsCodeService smsCodeService; @MockBean @@ -56,14 +56,14 @@ public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { @MockBean private PasswordEncoder passwordEncoder; @Resource - private UserMapper mbrUserMapper; + private MemberUserMapper mbrUserMapper; @Resource - private AuthServiceImpl authService; + private MemberAuthServiceImpl authService; @Test public void testUpdatePassword_success(){ // 准备参数 - UserDO userDO = randomUserDO(); + MemberUserDO userDO = randomUserDO(); mbrUserMapper.insert(userDO); // 新密码 @@ -88,7 +88,7 @@ public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { @Test public void testResetPassword_success(){ // 准备参数 - UserDO userDO = randomUserDO(); + MemberUserDO userDO = randomUserDO(); mbrUserMapper.insert(userDO); // 随机密码 @@ -113,12 +113,12 @@ public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static UserDO randomUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static MemberUserDO randomUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setPassword(randomString()); }; - return randomPojo(UserDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(MemberUserDO.class, ArrayUtils.append(consumer, consumers)); } diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/UserServiceImplTest.java similarity index 74% rename from yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java rename to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/UserServiceImplTest.java index 96c562fa93..e68fd03103 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MbrUserServiceImplTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/UserServiceImplTest.java @@ -6,11 +6,11 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.module.member.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.member.dal.mysql.user.UserMapper; -import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; -import cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl; +import cn.iocoder.yudao.module.member.dal.dataobject.sms.SmsCodeDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; +import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl; import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; import org.junit.jupiter.api.Test; @@ -31,24 +31,24 @@ import static org.mockito.Mockito.*; // TODO @芋艿:单测的 review,等逻辑都达成一致后 /** - * {@link UserServiceImpl} 的单元测试类 + * {@link MemberUserServiceImpl} 的单元测试类 * * @author 宋天 */ -@Import({UserServiceImpl.class, YudaoRedisAutoConfiguration.class}) -public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { +@Import({MemberUserServiceImpl.class, YudaoRedisAutoConfiguration.class}) +public class UserServiceImplTest extends BaseDbAndRedisUnitTest { @Resource - private UserServiceImpl mbrUserService; + private MemberUserServiceImpl mbrUserService; @Resource private StringRedisTemplate stringRedisTemplate; @Resource - private UserMapper userMapper; + private MemberUserMapper userMapper; @MockBean - private AuthServiceImpl authService; + private MemberAuthServiceImpl authService; @MockBean private InfFileCoreService fileCoreService; @@ -57,12 +57,12 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { private PasswordEncoder passwordEncoder; @MockBean - private SysSmsCodeService sysSmsCodeService; + private SmsCodeService smsCodeService; @Test public void testUpdateNickName_success(){ // mock 数据 - UserDO userDO = randomUserDO(); + MemberUserDO userDO = randomUserDO(); userMapper.insert(userDO); // 随机昵称 @@ -79,7 +79,7 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { @Test public void testUpdateAvatar_success(){ // mock 数据 - UserDO dbUser = randomUserDO(); + MemberUserDO dbUser = randomUserDO(); userMapper.insert(dbUser); // 准备参数 @@ -99,18 +99,18 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { public void updateMobile_success(){ // mock数据 String oldMobile = randomNumbers(11); - UserDO userDO = randomUserDO(); + MemberUserDO userDO = randomUserDO(); userDO.setMobile(oldMobile); userMapper.insert(userDO); // 旧手机和旧验证码 - SysSmsCodeDO codeDO = new SysSmsCodeDO(); + SmsCodeDO codeDO = new SmsCodeDO(); String oldCode = RandomUtil.randomString(4); codeDO.setMobile(userDO.getMobile()); codeDO.setCode(oldCode); - codeDO.setScene(SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene()); + codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()); codeDO.setUsed(Boolean.FALSE); - when(sysSmsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO); + when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO); // 更新手机号 String newMobile = randomNumbers(11); @@ -128,11 +128,11 @@ public class MbrUserServiceImplTest extends BaseDbAndRedisUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static UserDO randomUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static MemberUserDO randomUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 }; - return randomPojo(UserDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(MemberUserDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-system/yudao-module-system-api/pom.xml b/yudao-module-system/yudao-module-system-api/pom.xml index 39a402efc6..807eee44f3 100644 --- a/yudao-module-system/yudao-module-system-api/pom.xml +++ b/yudao-module-system/yudao-module-system-api/pom.xml @@ -21,6 +21,20 @@ cn.iocoder.boot yudao-common + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + cn.iocoder.boot + yudao-spring-boot-starter-security + true + + diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/UserSessionApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/UserSessionApi.java new file mode 100644 index 0000000000..a35dfae382 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/UserSessionApi.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.system.api.auth; + +import cn.iocoder.yudao.framework.security.core.LoginUser; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 在线用户 Session API 接口 + * + * @author 芋道源码 + */ +public interface UserSessionApi { + + /** + * 创建在线用户 Session + * + * @param loginUser 登录用户 + * @param userIp 用户 IP + * @param userAgent 用户 UA + * @return Session 编号 + */ + String createUserSession(@NotNull(message = "登录用户不能为空") LoginUser loginUser, String userIp, String userAgent); + + /** + * 刷新在线用户 Session 的更新时间 + * + * @param sessionId Session 编号 + * @param loginUser 登录用户 + */ + void refreshUserSession(@NotEmpty(message = "Session编号不能为空") String sessionId, + @NotNull(message = "登录用户不能为空") LoginUser loginUser); + + /** + * 删除在线用户 Session + * + * @param sessionId Session 编号 + */ + void deleteUserSession(String sessionId); + + /** + * 获得 Session 编号对应的在线用户 + * + * @param sessionId Session 编号 + * @return 在线用户 + */ + LoginUser getLoginUser(String sessionId); + + /** + * 获得 Session 超时时间,单位:毫秒 + * + * @return 超时时间 + */ + Long getSessionTimeoutMillis(); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/LoginLogApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/LoginLogApi.java new file mode 100644 index 0000000000..4ff596c68a --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/LoginLogApi.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.system.api.logger; + +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * 登录日志的 API 接口 + * + * @author 芋道源码 + */ +public interface LoginLogApi { + + /** + * 创建登录日志 + * + * @param reqDTO 日志信息 + */ + void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/dto/LoginLogCreateReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/LoginLogCreateReqDTO.java similarity index 95% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/dto/LoginLogCreateReqDTO.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/LoginLogCreateReqDTO.java index 5072053c95..514ac2d98c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/dto/LoginLogCreateReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/LoginLogCreateReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.service.logger.dto; +package cn.iocoder.yudao.module.system.api.logger.dto; import lombok.Data; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java new file mode 100644 index 0000000000..25bfc44416 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package cn.iocoder.yudao.module.system.api; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApi.java new file mode 100644 index 0000000000..720712108c --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApi.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.system.api.social; + +import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; + +import javax.validation.Valid; + +/** + * 社交用户的 API 接口 + * + * @author 芋道源码 + */ +public interface SocialUserApi { + + /** + * 获得社交平台的授权 URL + * + * @param type 社交平台的类型 {@link SocialTypeEnum} + * @param redirectUri 重定向 URL + * @return 社交平台的授权 URL + */ + String getAuthorizeUrl(Integer type, String redirectUri); + + /** + * 绑定社交用户 + * + * @param reqDTO 绑定信息 + */ + void bindSocialUser(@Valid SocialUserBindReqDTO reqDTO); + + /** + * 取消绑定社交用户 + * + * @param reqDTO 解绑 + */ + void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO); + + /** + * 校验社交用户的认证信息是否正确 + * 如果校验不通过,则抛出 {@link ServiceException} 业务异常 + * + * @param type 社交平台的类型 + * @param code 授权码 + * @param state state + */ + void checkSocialUser(Integer type, String code, String state); + + /** + * 获得社交用户的绑定用户编号 + * 注意,返回的是 MemberUser 或者 AdminUser 的 id 编号! + * 该方法会执行和 {@link #checkSocialUser(Integer, String, String)} 一样的逻辑。 + * 所以在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常 + * + * @param userType 用户类型 + * @param type 社交平台的类型 + * @param code 授权码 + * @param state state + * @return 绑定用户编号 + */ + Long getBindUserId(Integer userType, Integer type, String code, String state); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserBindReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserBindReqDTO.java new file mode 100644 index 0000000000..ccc1c62ae5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserBindReqDTO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.system.api.social.dto; + +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 取消绑定社交用户 Request DTO + * + * @author 芋道源码 + */ +@Data +public class SocialUserBindReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @InEnum(UserTypeEnum.class) + @NotNull(message = "用户类型不能为空") + private Integer userType; + + /** + * 社交平台的类型 + */ + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + /** + * 授权码 + */ + @NotEmpty(message = "授权码不能为空") + private String code; + /** + * state + */ + @NotEmpty(message = "state 不能为空") + private String state; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserUnbindReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserUnbindReqDTO.java new file mode 100644 index 0000000000..56398a8aef --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserUnbindReqDTO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.system.api.social.dto; + +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 社交绑定 Request DTO,使用 code 授权码 + * + * @author 芋道源码 + */ +@Data +public class SocialUserUnbindReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @InEnum(UserTypeEnum.class) + @NotNull(message = "用户类型不能为空") + private Integer userType; + + /** + * 社交平台的类型 + */ + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + + /** + * 社交平台的 unionId + */ + @NotEmpty(message = "社交平台的 unionId 不能为空") + private String unionId; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 15b6803a21..4529c5145a 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -87,12 +87,31 @@ public interface ErrorCodeConstants { ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1002011000, "短信模板不存在"); ErrorCode SMS_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1002011001, "已经存在编码为【{}】的短信模板"); - // ========== 租户模块 1002012000 ========== - ErrorCode TENANT_NOT_EXISTS = new ErrorCode(1002012000, "租户不存在"); + // ========== 短信发送 1002012000 ========== + ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在"); + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002012001, "模板参数({})缺失"); + ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1002012002, "短信模板不存在"); - // ========== 错误码模块 1002013000 ========== - ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002013000, "错误码不存在"); - ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002013001, "已经存在编码为【{}】的错误码"); + // ========== 短信验证码 1002013000 ========== + ErrorCode SMS_CODE_NOT_FOUND = new ErrorCode(1002013000, "验证码不存在"); + ErrorCode SMS_CODE_EXPIRED = new ErrorCode(1002013001, "验证码已过期"); + ErrorCode SMS_CODE_USED = new ErrorCode(1002013002, "验证码已使用"); + ErrorCode SMS_CODE_NOT_CORRECT = new ErrorCode(1002013004, "验证码不正确"); + ErrorCode SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY = new ErrorCode(1002013005, "超过每日短信发送数量"); + ErrorCode SMS_CODE_SEND_TOO_FAST = new ErrorCode(1002013006, "短信发送过于频率"); + ErrorCode SMS_CODE_IS_EXISTS = new ErrorCode(1002013007, "手机号已被使用"); + ErrorCode SMS_CODE_IS_UNUSED = new ErrorCode(1002013008, "验证码未被使用"); + // ========== 租户模块 1002014000 ========== + ErrorCode TENANT_NOT_EXISTS = new ErrorCode(1002014000, "租户不存在"); + + // ========== 错误码模块 1002015000 ========== + ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002015000, "错误码不存在"); + ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002015001, "已经存在编码为【{}】的错误码"); + + // ========== 社交用户 1002015000 ========== + ErrorCode SOCIAL_USER_AUTH_FAILURE = new ErrorCode(1002015000, "社交授权失败,原因是:{}"); + ErrorCode SOCIAL_USER_UNBIND_NOT_SELF = new ErrorCode(1002015001, "社交解绑失败,非当前用户绑定"); + ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1002015001, "社交授权失败,找不到对应的用户"); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java deleted file mode 100644 index 218ef6d312..0000000000 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/SysErrorCodeConstants.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.system.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; - -/** - * System 错误码枚举类 - * - * system 系统,使用 1-006-000-000 段 - */ -public interface SysErrorCodeConstants { - - // ========== 短信发送 1006000000 ========== - ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1006000000, "手机号不存在"); - ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1006000001, "模板参数({})缺失"); - ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1006000000, "短信模板不存在"); - - // ========== 社交模块 1006002000 ========== - ErrorCode SOCIAL_AUTH_FAILURE = new ErrorCode(1006002000, "社交授权失败,原因是:{}"); - ErrorCode SOCIAL_UNBIND_NOT_SELF = new ErrorCode(1006002001, "社交解绑失败,非当前用户绑定"); - - // ========== 用户模块 1006003000 ========== - ErrorCode USER_NOT_EXISTS = new ErrorCode(1006003000, "用户不存在"); - ErrorCode USER_IS_DISABLE = new ErrorCode(1006003001, "名字为【{}】的用户已被禁用"); - - // ========== 部门模块 1006004000 ========== - ErrorCode DEPT_NOT_FOUND = new ErrorCode(1006004000, "当前部门不存在"); - ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1006004001, "部门不处于开启状态,不允许选择"); - - // ========== 角色模块 1006005000 ========== - ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1006005000, "角色不存在"); - ErrorCode ROLE_IS_DISABLE = new ErrorCode(1006005001, "名字为【{}】的角色已被禁用"); - - // ========== 岗位模块 1006007000 ========== - ErrorCode POST_NOT_FOUND = new ErrorCode(1006007000, "当前岗位不存在"); - ErrorCode POST_NOT_ENABLE = new ErrorCode(1006007001, "岗位({}) 不处于开启状态,不允许选择"); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginLogTypeEnum.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginLogTypeEnum.java index ff29ab558f..2f845fd105 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginLogTypeEnum.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginLogTypeEnum.java @@ -8,7 +8,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysLoginLogTypeEnum { +public enum LoginLogTypeEnum { LOGIN_USERNAME(100), // 使用账号登录 LOGIN_SOCIAL(101), // 使用社交登录 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginResultEnum.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginResultEnum.java index f1c8356ff4..7084e13da1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/logger/SysLoginResultEnum.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/logger/LoginResultEnum.java @@ -8,7 +8,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysLoginResultEnum { +public enum LoginResultEnum { SUCCESS(0), // 成功 BAD_CREDENTIALS(10), // 账号或密码不正确 diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java new file mode 100644 index 0000000000..2edcf0a2d1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.system.enums.sms; + +import cn.hutool.core.util.ArrayUtil; +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户短信验证码发送场景的枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum SmsSceneEnum implements IntArrayValuable { + + MEMBER_LOGIN(1, "user-sms-login", "会员用户 - 手机号登陆"), + MEMBER_UPDATE_MOBILE(2, "user-sms-reset-password", "会员用户 - 修改手机"), + MEMBER_FORGET_PASSWORD(3, "user-sms-update-mobile", "会员用户 - 忘记密码"); + + // 如果未来希望管理后台支持手机验证码登陆,可以通过添加 ADMIN_MEMBER_LOGIN 枚举 + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsSceneEnum::getScene).toArray(); + + /** + * 验证场景的编号 + */ + private final Integer scene; + /** + * 模版编码 + */ + private final String templateCode; + /** + * 描述 + */ + private final String description; + + @Override + public int[] array() { + return ARRAYS; + } + + public static SmsSceneEnum getCodeByScene(Integer scene) { + return ArrayUtil.firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene)); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/pom.xml b/yudao-module-system/yudao-module-system-impl/pom.xml index 6fc4fcf96b..40f9d8aaa5 100644 --- a/yudao-module-system/yudao-module-system-impl/pom.xml +++ b/yudao-module-system/yudao-module-system-impl/pom.xml @@ -23,6 +23,11 @@ yudao-module-system-api ${revision} + + cn.iocoder.boot + yudao-module-member-api + ${revision} + diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/auth/UserSessionApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/auth/UserSessionApiImpl.java new file mode 100644 index 0000000000..f8ab2a1695 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/auth/UserSessionApiImpl.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.system.api.auth; + +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.module.system.service.auth.UserSessionService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 在线用户 Session API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class UserSessionApiImpl implements UserSessionApi { + + @Resource + private UserSessionService userSessionService; + + @Override + public String createUserSession(LoginUser loginUser, String userIp, String userAgent) { + return userSessionService.createUserSession(loginUser, userIp, userAgent); + } + + @Override + public void refreshUserSession(String sessionId, LoginUser loginUser) { + userSessionService.refreshUserSession(sessionId, loginUser); + } + + @Override + public void deleteUserSession(String sessionId) { + userSessionService.deleteUserSession(sessionId); + } + + @Override + public LoginUser getLoginUser(String sessionId) { + return userSessionService.getLoginUser(sessionId); + } + + @Override + public Long getSessionTimeoutMillis() { + return userSessionService.getSessionTimeoutMillis(); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/logger/LoginLogApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/logger/LoginLogApiImpl.java new file mode 100644 index 0000000000..b5f40e01a9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/logger/LoginLogApiImpl.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.system.api.logger; + +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.service.logger.LoginLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 登录日志的 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class LoginLogApiImpl implements LoginLogApi { + + @Resource + private LoginLogService loginLogService; + + @Override + public void createLoginLog(LoginLogCreateReqDTO reqDTO) { + loginLogService.createLoginLog(reqDTO); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java new file mode 100644 index 0000000000..0354f00bce --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.system.api; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java new file mode 100644 index 0000000000..94e4cfabab --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.system.api.social; + +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; +import cn.iocoder.yudao.module.system.service.social.SocialUserService; +import me.zhyd.oauth.model.AuthUser; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND; + +/** + * 社交用户的 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SocialUserApiImpl implements SocialUserApi { + + @Resource + private SocialUserService socialUserService; + + @Override + public String getAuthorizeUrl(Integer type, String redirectUri) { + return socialUserService.getAuthorizeUrl(type, redirectUri); + } + + @Override + public void bindSocialUser(SocialUserBindReqDTO reqDTO) { + // 使用 code 授权 + AuthUser authUser = socialUserService.getAuthUser(reqDTO.getType(), reqDTO.getCode(), + reqDTO.getState()); + if (authUser == null) { + throw exception(SOCIAL_USER_NOT_FOUND); + } + + // 绑定社交用户(新增) + socialUserService.bindSocialUser(reqDTO.getUserId(), reqDTO.getUserType(), + reqDTO.getType(), authUser); + } + + @Override + public void unbindSocialUser(SocialUserUnbindReqDTO reqDTO) { + socialUserService.unbindSocialUser(reqDTO.getUserId(), reqDTO.getUserType(), + reqDTO.getType(), reqDTO.getUnionId()); + } + + @Override + public void checkSocialUser(Integer type, String code, String state) { + AuthUser authUser = socialUserService.getAuthUser(type, code, state); + if (authUser == null) { + throw exception(SOCIAL_USER_NOT_FOUND); + } + } + + @Override + public Long getBindUserId(Integer userType, Integer type, String code, String state) { + AuthUser authUser = socialUserService.getAuthUser(type, code, state); + if (authUser == null) { + throw exception(SOCIAL_USER_NOT_FOUND); + } + + // + return null; + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 6f72c3eb63..2acc39fcc1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -1,27 +1,26 @@ package cn.iocoder.yudao.module.system.controller.admin.auth; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*; -import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; -import cn.iocoder.yudao.module.system.service.auth.AuthService; -import cn.iocoder.yudao.module.system.service.permission.PermissionService; -import cn.iocoder.yudao.module.system.service.permission.RoleService; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.system.service.social.SocialUserService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.service.user.UserService; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*; +import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; +import cn.iocoder.yudao.module.system.service.auth.AdminAuthService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; +import cn.iocoder.yudao.module.system.service.permission.RoleService; +import cn.iocoder.yudao.module.system.service.social.SocialUserService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -42,12 +41,10 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @Slf4j public class AuthController { - @Autowired - @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // AuthService 存在重名 - private AuthService authService; - @Autowired - @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 - private UserService userService; + @Resource + private AdminAuthService authService; + @Resource + private AdminUserService userService; @Resource private RoleService roleService; @Resource @@ -68,12 +65,12 @@ public class AuthController { @ApiOperation("获取登录用户的权限信息") public CommonResult getPermissionInfo() { // 获得用户信息 - UserDO user = userService.getUser(getLoginUserId()); + AdminUserDO user = userService.getUser(getLoginUserId()); if (user == null) { return null; } // 获得角色列表 - List roleList = roleService.getRolesFromCache(getLoginUserRoleIds()); + List roleList = roleService.getRolesFromCache(getLoginUserRoleIds()); // 获得菜单列表 List menuList = permissionService.getRoleMenusFromCache( getLoginUserRoleIds(), // 注意,基于登录的角色,因为后续的权限判断也是基于它 @@ -136,7 +133,7 @@ public class AuthController { @DeleteMapping("/social-unbind") @ApiOperation("取消社交绑定") public CommonResult socialUnbind(@RequestBody AuthSocialUnbindReqVO reqVO) { - socialCoreService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.ADMIN); + socialCoreService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getUnionId()); return CommonResult.success(true); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java index eeca9ac8e7..0b0f5096e9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java @@ -6,16 +6,15 @@ import cn.iocoder.yudao.module.system.convert.auth.UserSessionConvert; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.service.auth.UserSessionService; import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import cn.iocoder.yudao.module.system.service.user.UserService; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,12 +34,11 @@ public class UserSessionController { @Resource private UserSessionService userSessionService; - @Autowired - @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 - private UserService userService; + @Resource + private AdminUserService userService; @Resource - private SysDeptCoreService deptCoreService; + private DeptService deptService; @GetMapping("/page") @ApiOperation("获得 Session 分页列表") @@ -50,10 +48,10 @@ public class UserSessionController { PageResult pageResult = userSessionService.getUserSessionPage(reqVO); // 获得拼接需要的数据 - Map userMap = userService.getUserMap( + Map userMap = userService.getUserMap( convertList(pageResult.getList(), SysUserSessionDO::getUserId)); - Map deptMap = deptCoreService.getDeptMap( - convertList(userMap.values(), UserDO::getDeptId)); + Map deptMap = deptService.getDeptMap( + convertList(userMap.values(), AdminUserDO::getDeptId)); // 拼接结果返回 List sessionList = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(session -> { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java index 837a825ee2..1a4da72be8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.system.controller.admin.dept; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.*; @@ -30,9 +29,6 @@ public class DeptController { @Resource private DeptService deptService; - @Resource - private SysDeptCoreService deptCoreService; - @PostMapping("create") @ApiOperation("创建部门") @PreAuthorize("@ss.hasPermission('system:dept:create')") @@ -84,7 +80,7 @@ public class DeptController { @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:dept:query')") public CommonResult getDept(@RequestParam("id") Long id) { - return success(DeptConvert.INSTANCE.convert(deptCoreService.getDept(id))); + return success(DeptConvert.INSTANCE.convert(deptService.getDept(id))); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java index 935b48bafa..d23477eb82 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java @@ -6,18 +6,17 @@ import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.Oper import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; import cn.iocoder.yudao.module.system.convert.logger.OperateLogConvert; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.service.logger.OperateLogService; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.service.user.UserService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -44,9 +43,8 @@ public class OperateLogController { @Resource private OperateLogService operateLogService; - @Autowired - @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 - private UserService userService; + @Resource + private AdminUserService userService; @GetMapping("/page") @ApiOperation("查看操作日志分页列表") @@ -56,7 +54,7 @@ public class OperateLogController { // 获得拼接需要的数据 Collection userIds = CollectionUtils.convertList(pageResult.getList(), OperateLogDO::getUserId); - Map userMap = userService.getUserMap(userIds); + Map userMap = userService.getUserMap(userIds); // 拼接数据 List list = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(operateLog -> { @@ -77,7 +75,7 @@ public class OperateLogController { // 获得拼接需要的数据 Collection userIds = CollectionUtils.convertList(list, OperateLogDO::getUserId); - Map userMap = userService.getUserMap(userIds); + Map userMap = userService.getUserMap(userIds); // 拼接数据 List excelDataList = OperateLogConvert.INSTANCE.convertList(list, userMap); // 输出 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java index 54cdb6b536..b200aba866 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*; import cn.iocoder.yudao.module.system.convert.permission.RoleConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.service.permission.RoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -72,14 +72,14 @@ public class RoleController { @ApiOperation("获得角色信息") @PreAuthorize("@ss.hasPermission('system:role:query')") public CommonResult getRole(@RequestParam("id") Long id) { - SysRoleDO role = roleService.getRole(id); + RoleDO role = roleService.getRole(id); return success(RoleConvert.INSTANCE.convert(role)); } @GetMapping("/page") @ApiOperation("获得角色分页") @PreAuthorize("@ss.hasPermission('system:role:query')") - public CommonResult> getRolePage(RolePageReqVO reqVO) { + public CommonResult> getRolePage(RolePageReqVO reqVO) { return success(roleService.getRolePage(reqVO)); } @@ -87,9 +87,9 @@ public class RoleController { @ApiOperation(value = "获取角色精简信息列表", notes = "只包含被开启的角色,主要用于前端的下拉选项") public CommonResult> getSimpleRoles() { // 获得角色列表,只要开启状态的 - List list = roleService.getRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); + List list = roleService.getRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); // 排序后,返回个诶前端 - list.sort(Comparator.comparing(SysRoleDO::getSort)); + list.sort(Comparator.comparing(RoleDO::getSort)); return success(RoleConvert.INSTANCE.convertList02(list)); } @@ -97,7 +97,7 @@ public class RoleController { @OperateLog(type = EXPORT) @PreAuthorize("@ss.hasPermission('system:role:export')") public void export(HttpServletResponse response, @Validated RoleExportReqVO reqVO) throws IOException { - List list = roleService.getRoleList(reqVO); + List list = roleService.getRoleList(reqVO); List data = RoleConvert.INSTANCE.convertList03(list); // 输出 ExcelUtils.write(response, "角色数据.xls", "角色列表", RoleExcelVO.class, data); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java index 6e2602cf0c..8125f0728a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.sms; import cn.hutool.core.util.URLUtil; import cn.hutool.extra.servlet.ServletUtil; -import cn.iocoder.yudao.module.system.service.sms.SysSmsSendService; +import cn.iocoder.yudao.module.system.service.sms.SmsSendService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; @@ -25,7 +25,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; public class SmsCallbackController { @Resource - private SysSmsSendService smsCoreService; + private SmsSendService smsCoreService; @PostMapping("/sms/yunpian") @ApiOperation(value = "云片短信的回调", notes = "参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java index f16bfb2c97..d565143142 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.*; import cn.iocoder.yudao.module.system.convert.sms.SmsTemplateConvert; import cn.iocoder.yudao.module.system.service.sms.SmsTemplateService; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.module.system.service.sms.SysSmsSendService; +import cn.iocoder.yudao.module.system.service.sms.SmsSendService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -32,7 +32,7 @@ public class SmsTemplateController { @Resource private SmsTemplateService smsTemplateService; @Resource - private SysSmsSendService smsCoreService; + private SmsSendService smsCoreService; @PostMapping("/create") @ApiOperation("创建短信模板") @@ -91,7 +91,7 @@ public class SmsTemplateController { @ApiOperation("发送短信") @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')") public CommonResult sendSms(@Valid @RequestBody SmsTemplateSendReqVO sendReqVO) { - return success(smsCoreService.sendSingleSms(sendReqVO.getMobile(), null, null, + return success(smsCoreService.sendSingleSmsToAdmin(sendReqVO.getMobile(), null, sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 61c54e2932..7afe691a28 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -4,10 +4,10 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.module.system.convert.user.UserConvert; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -18,7 +18,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -41,11 +40,10 @@ import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.E @Validated public class UserController { - @Autowired - @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 - private UserService userService; @Resource - private SysDeptCoreService deptCoreService; + private AdminUserService userService; + @Resource + private DeptService deptService; @PostMapping("/create") @ApiOperation("新增用户") @@ -93,14 +91,14 @@ public class UserController { @PreAuthorize("@ss.hasPermission('system:user:list')") public CommonResult> getUserPage(@Valid UserPageReqVO reqVO) { // 获得用户分页列表 - PageResult pageResult = userService.getUserPage(reqVO); + PageResult pageResult = userService.getUserPage(reqVO); if (CollUtil.isEmpty(pageResult.getList())) { return success(new PageResult<>(pageResult.getTotal())); // 返回空 } // 获得拼接需要的数据 - Collection deptIds = convertList(pageResult.getList(), UserDO::getDeptId); - Map deptMap = deptCoreService.getDeptMap(deptIds); + Collection deptIds = convertList(pageResult.getList(), AdminUserDO::getDeptId); + Map deptMap = deptService.getDeptMap(deptIds); // 拼接结果返回 List userList = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(user -> { @@ -115,7 +113,7 @@ public class UserController { @ApiOperation(value = "获取用户精简信息列表", notes = "只包含被开启的用户,主要用于前端的下拉选项") public CommonResult> getSimpleUsers() { // 获用户门列表,只要开启状态的 - List list = userService.getUsersByStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = userService.getUsersByStatus(CommonStatusEnum.ENABLE.getStatus()); // 排序后,返回给前端 return success(UserConvert.INSTANCE.convertList04(list)); } @@ -135,12 +133,12 @@ public class UserController { public void exportUsers(@Validated UserExportReqVO reqVO, HttpServletResponse response) throws IOException { // 获得用户列表 - List users = userService.getUsers(reqVO); + List users = userService.getUsers(reqVO); // 获得拼接需要的数据 - Collection deptIds = convertList(users, UserDO::getDeptId); - Map deptMap = deptCoreService.getDeptMap(deptIds); - Map deptLeaderUserMap = userService.getUserMap( + Collection deptIds = convertList(users, AdminUserDO::getDeptId); + Map deptMap = deptService.getDeptMap(deptIds); + Map deptLeaderUserMap = userService.getUserMap( convertSet(deptMap.values(), SysDeptDO::getLeaderUserId)); // 拼接数据 List excelUsers = new ArrayList<>(users.size()); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java index ffb6b0d1c2..11d419feaf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java @@ -5,16 +5,16 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfi import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.convert.user.UserConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.permission.RoleService; -import cn.iocoder.yudao.module.system.service.user.UserService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.module.system.service.social.SocialUserService; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; @@ -22,7 +22,6 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -43,11 +42,10 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @Slf4j public class UserProfileController { - @Autowired - @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 - private UserService userService; @Resource - private SysDeptCoreService deptCoreService; + private AdminUserService userService; + @Resource + private DeptService deptService; @Resource private PostService postService; @@ -62,14 +60,14 @@ public class UserProfileController { @ApiOperation("获得登录用户信息") public CommonResult profile() { // 获得用户基本信息 - UserDO user = userService.getUser(getLoginUserId()); + AdminUserDO user = userService.getUser(getLoginUserId()); UserProfileRespVO resp = UserConvert.INSTANCE.convert03(user); // 获得用户角色 - List userRoles = roleService.getRolesFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); + List userRoles = roleService.getRolesFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); resp.setRoles(UserConvert.INSTANCE.convertList(userRoles)); // 获得部门信息 if (user.getDeptId() != null) { - SysDeptDO dept = deptCoreService.getDept(user.getDeptId()); + SysDeptDO dept = deptService.getDept(user.getDeptId()); resp.setDept(UserConvert.INSTANCE.convert02(dept)); } // 获得岗位信息 @@ -78,7 +76,7 @@ public class UserProfileController { resp.setPosts(UserConvert.INSTANCE.convertList02(posts)); } // 获得社交用户信息 - List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN); + List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN.getValue()); resp.setSocialUsers(UserConvert.INSTANCE.convertList03(socialUsers)); return success(resp); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java index 14310514d9..e4cce51003 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.system.convert.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthMenuRespVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthPermissionInfoRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; @@ -22,17 +22,17 @@ public interface AuthConvert { AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略 - LoginUser convert0(UserDO bean); + LoginUser convert0(AdminUserDO bean); - default LoginUser convert(UserDO bean) { + default LoginUser convert(AdminUserDO bean) { // 目的,为了设置 UserTypeEnum.ADMIN.getValue() return convert0(bean).setUserType(UserTypeEnum.ADMIN.getValue()); } - default AuthPermissionInfoRespVO convert(UserDO user, List roleList, List menuList) { + default AuthPermissionInfoRespVO convert(AdminUserDO user, List roleList, List menuList) { return AuthPermissionInfoRespVO.builder() .user(AuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build()) - .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode)) + .roles(CollectionUtils.convertSet(roleList, RoleDO::getCode)) .permissions(CollectionUtils.convertSet(menuList, MenuDO::getPermission)) .build(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java index 1c2261afd3..21584c9fcf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.convert.logger; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExcelVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; @@ -27,7 +27,7 @@ public interface OperateLogConvert { OperateLogRespVO convert(OperateLogDO bean); - default List convertList(List list, Map userMap) { + default List convertList(List list, Map userMap) { return list.stream().map(operateLog -> { OperateLogExcelVO excelVO = convert02(operateLog); MapUtils.findAndThen(userMap, operateLog.getId(), user -> excelVO.setUserNickname(user.getNickname())); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java index bfdeea7e8c..70b5dfff02 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.convert.logger; import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java index 5dcbf12fc6..646d7061de 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/permission/RoleConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.convert.permission; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -12,14 +12,14 @@ public interface RoleConvert { RoleConvert INSTANCE = Mappers.getMapper(RoleConvert.class); - SysRoleDO convert(RoleUpdateReqVO bean); + RoleDO convert(RoleUpdateReqVO bean); - RoleRespVO convert(SysRoleDO bean); + RoleRespVO convert(RoleDO bean); - SysRoleDO convert(RoleCreateReqVO bean); + RoleDO convert(RoleCreateReqVO bean); - List convertList02(List list); + List convertList02(List list); - List convertList03(List list); + List convertList03(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java index 10d4b16d68..9e4aaddbfd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java @@ -6,9 +6,9 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfi import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -19,31 +19,31 @@ public interface UserConvert { UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); - UserPageItemRespVO convert(UserDO bean); + UserPageItemRespVO convert(AdminUserDO bean); UserPageItemRespVO.Dept convert(SysDeptDO bean); - UserDO convert(UserCreateReqVO bean); + AdminUserDO convert(UserCreateReqVO bean); - UserDO convert(UserUpdateReqVO bean); + AdminUserDO convert(UserUpdateReqVO bean); - UserExcelVO convert02(UserDO bean); + UserExcelVO convert02(AdminUserDO bean); - UserDO convert(UserImportExcelVO bean); + AdminUserDO convert(UserImportExcelVO bean); - UserProfileRespVO convert03(UserDO bean); + UserProfileRespVO convert03(AdminUserDO bean); - List convertList(List list); + List convertList(List list); UserProfileRespVO.Dept convert02(SysDeptDO bean); - UserDO convert(UserProfileUpdateReqVO bean); + AdminUserDO convert(UserProfileUpdateReqVO bean); - UserDO convert(UserProfileUpdatePasswordReqVO bean); + AdminUserDO convert(UserProfileUpdatePasswordReqVO bean); List convertList02(List list); List convertList03(List list); - List convertList04(List list); + List convertList04(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java index 797dfa2062..9840a2c30e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.dataobject.dept; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; import com.baomidou.mybatisplus.annotation.TableId; @@ -41,7 +41,7 @@ public class SysDeptDO extends TenantBaseDO { /** * 负责人 * - * 关联 {@link UserDO#getId()} + * 关联 {@link AdminUserDO#getId()} */ private Long leaderUserId; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java index 5c12f825c6..c365a33471 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.dataobject.logger; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; @@ -48,7 +48,7 @@ public class OperateLogDO extends TenantBaseDO { /** * 用户编号 * - * {@link UserDO#getId()} + * {@link AdminUserDO#getId()} */ private Long userId; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java index 0a15186469..3037d094bd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.dal.dataobject.logger; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -29,7 +29,7 @@ public class SysLoginLogDO extends BaseDO { /** * 日志类型 * - * 枚举 {@link SysLoginLogTypeEnum} + * 枚举 {@link LoginLogTypeEnum} */ private Integer logType; /** @@ -55,7 +55,7 @@ public class SysLoginLogDO extends BaseDO { /** * 登录结果 * - * 枚举 {@link SysLoginResultEnum} + * 枚举 {@link LoginResultEnum} */ private Integer result; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/RoleDO.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/RoleDO.java index 6b2d3eb9a3..cd3151f457 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysRoleDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/RoleDO.java @@ -17,10 +17,10 @@ import java.util.Set; * * @author ruoyi */ -@TableName(value = "sys_role", autoResultMap = true) +@TableName(value = "system_role", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) -public class SysRoleDO extends BaseDO { +public class RoleDO extends BaseDO { /** * 角色ID diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysUserRoleDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/UserRoleDO.java similarity index 88% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysUserRoleDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/UserRoleDO.java index 9c298ad9d7..d54b0f8250 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/SysUserRoleDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/UserRoleDO.java @@ -11,10 +11,10 @@ import lombok.EqualsAndHashCode; * * @author ruoyi */ -@TableName("sys_user_role") +@TableName("system_user_role") @Data @EqualsAndHashCode(callSuper = true) -public class SysUserRoleDO extends BaseDO { +public class UserRoleDO extends BaseDO { /** * 自增主键 diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/sms/SysSmsCodeDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsCodeDO.java similarity index 85% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/sms/SysSmsCodeDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsCodeDO.java index eb51770ea8..b67a7326f4 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/sms/SysSmsCodeDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsCodeDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.member.dal.dataobject.sms; +package cn.iocoder.yudao.module.system.dal.dataobject.sms; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableName; @@ -13,13 +13,13 @@ import java.util.Date; * * @author 芋道源码 */ -@TableName("sys_sms_code") +@TableName("system_sms_code") @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class SysSmsCodeDO extends BaseDO { +public class SmsCodeDO extends BaseDO { /** * 编号 @@ -36,7 +36,7 @@ public class SysSmsCodeDO extends BaseDO { /** * 发送场景 * - * 枚举 {@link SysSmsCodeDO} + * 枚举 {@link SmsCodeDO} */ private Integer scene; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java index 336211ed1b..bca1964fe3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.dataobject.social; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableId; @@ -9,7 +9,7 @@ import lombok.*; /** * 社交用户 - * 通过 {@link SysSocialUserDO#getUserId()} 关联到对应的 {@link UserDO} + * 通过 {@link SysSocialUserDO#getUserId()} 关联到对应的 {@link AdminUserDO} * * @author weir */ diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/UserDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java similarity index 97% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/UserDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java index 0f9d6e3f3f..85e2dfb905 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/UserDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java @@ -24,7 +24,7 @@ import java.util.Set; @Builder @NoArgsConstructor @AllArgsConstructor -public class UserDO extends TenantBaseDO { +public class AdminUserDO extends TenantBaseDO { /** * 用户ID diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/MenuMapper.java similarity index 95% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/MenuMapper.java index 1cce445b26..1eaa072993 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysMenuMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/MenuMapper.java @@ -12,7 +12,7 @@ import java.util.Date; import java.util.List; @Mapper -public interface SysMenuMapper extends BaseMapperX { +public interface MenuMapper extends BaseMapperX { default MenuDO selectByParentIdAndName(Long parentId, String name) { return selectOne(new LambdaQueryWrapper().eq(MenuDO::getParentId, parentId) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java similarity index 60% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java index 659f115884..0bf94990a4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import org.springframework.lang.Nullable; @@ -15,36 +15,36 @@ import java.util.Date; import java.util.List; @Mapper -public interface SysRoleMapper extends BaseMapperX { +public interface RoleMapper extends BaseMapperX { - default PageResult selectPage(RolePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX().likeIfPresent("name", reqVO.getName()) + default PageResult selectPage(RolePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX().likeIfPresent("name", reqVO.getName()) .likeIfPresent("code", reqVO.getCode()) .eqIfPresent("status", reqVO.getStatus()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); } - default List listRoles(RoleExportReqVO reqVO) { - return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) + default List listRoles(RoleExportReqVO reqVO) { + return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) .likeIfPresent("code", reqVO.getCode()) .eqIfPresent("status", reqVO.getStatus()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); } - default SysRoleDO selectByName(String name) { - return selectOne(new QueryWrapperX().eq("name", name)); + default RoleDO selectByName(String name) { + return selectOne(new QueryWrapperX().eq("name", name)); } - default SysRoleDO selectByCode(String code) { - return selectOne(new QueryWrapperX().eq("code", code)); + default RoleDO selectByCode(String code) { + return selectOne(new QueryWrapperX().eq("code", code)); } - default List selectListByStatus(@Nullable Collection statuses) { - return selectList(new QueryWrapperX().in("status", statuses)); + default List selectListByStatus(@Nullable Collection statuses) { + return selectList(new QueryWrapperX().in("status", statuses)); } default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new QueryWrapper().select("id") + return selectOne(new QueryWrapper().select("id") .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java index 478729438b..f77294f35f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleMenuMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.stream.Collectors; @Mapper -public interface SysRoleMenuMapper extends BaseMapperX { +public interface RoleMenuMapper extends BaseMapperX { default List selectListByRoleId(Long roleId) { return selectList(new QueryWrapper().eq("role_id", roleId)); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleCoreMapper.java deleted file mode 100644 index 51c3cb2eeb..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysRoleCoreMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.permission; - -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SysRoleCoreMapper extends BaseMapperX { -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleCoreMapper.java deleted file mode 100644 index 6139498e62..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleCoreMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.permission; - -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysUserRoleCoreMapper extends BaseMapperX { - - default List selectListByRoleIds(Collection roleIds) { - return selectList(SysUserRoleDO::getRoleId, roleIds); - } - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/UserRoleMapper.java similarity index 52% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/UserRoleMapper.java index 6578515bdf..bc1d36cf2c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/SysUserRoleMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/UserRoleMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -10,20 +10,20 @@ import java.util.List; import java.util.stream.Collectors; @Mapper -public interface SysUserRoleMapper extends BaseMapperX { +public interface UserRoleMapper extends BaseMapperX { - default List selectListByUserId(Long userId) { - return selectList(new QueryWrapper().eq("user_id", userId)); + default List selectListByUserId(Long userId) { + return selectList(new QueryWrapper().eq("user_id", userId)); } - default List selectListByRoleId(Long roleId) { - return selectList(new QueryWrapper().eq("role_id", roleId)); + default List selectListByRoleId(Long roleId) { + return selectList(new QueryWrapper().eq("role_id", roleId)); } default void insertList(Long userId, Collection roleIds) { - List list = roleIds.stream().map(roleId -> { - SysUserRoleDO entity = new SysUserRoleDO(); + List list = roleIds.stream().map(roleId -> { + UserRoleDO entity = new UserRoleDO(); entity.setUserId(userId); entity.setRoleId(roleId); return entity; @@ -32,16 +32,20 @@ public interface SysUserRoleMapper extends BaseMapperX { } default void deleteListByUserIdAndRoleIdIds(Long userId, Collection roleIds) { - delete(new QueryWrapper().eq("user_id", userId) + delete(new QueryWrapper().eq("user_id", userId) .in("role_id", roleIds)); } default void deleteListByUserId(Long userId) { - delete(new QueryWrapper().eq("user_id", userId)); + delete(new QueryWrapper().eq("user_id", userId)); } default void deleteListByRoleId(Long roleId) { - delete(new QueryWrapper().eq("role_id", roleId)); + delete(new QueryWrapper().eq("role_id", roleId)); } + + default List selectListByRoleIds(Collection roleIds) { + return selectList(UserRoleDO::getRoleId, roleIds); + } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsChannelMapper.java similarity index 93% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsChannelMapper.java index 49a7d9f40c..9f2f023565 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsChannelMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsChannelMapper.java @@ -11,7 +11,7 @@ import org.apache.ibatis.annotations.Select; import java.util.Date; @Mapper -public interface SysSmsChannelMapper extends BaseMapperX { +public interface SmsChannelMapper extends BaseMapperX { default PageResult selectPage(SmsChannelPageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsCodeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsCodeMapper.java new file mode 100644 index 0000000000..06d7431ce5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsCodeMapper.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.system.dal.mysql.sms; + +import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsCodeMapper extends BaseMapperX { + + /** + * 获得手机号的最后一个手机验证码 + * + * @param mobile 手机号 + * @param scene 发送场景,选填 + * @param code 验证码 选填 + * @return 手机验证码 + */ + default SmsCodeDO selectLastByMobile(String mobile, String code, Integer scene) { + return selectOne(new QueryWrapperX() + .eq("mobile", mobile).eqIfPresent("scene", scene).eqIfPresent("code", code) + .orderByDesc("id").last(SqlConstants.LIMIT1)); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java index 86f54dc244..f941a0f855 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java @@ -11,7 +11,7 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface SysSmsLogMapper extends BaseMapperX { +public interface SmsLogMapper extends BaseMapperX { default PageResult selectPage(SmsLogPageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsTemplateMapper.java similarity index 97% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsTemplateMapper.java index c4ba4071a9..d98e6fc5f8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SysSmsTemplateMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsTemplateMapper.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.List; @Mapper -public interface SysSmsTemplateMapper extends BaseMapperX { +public interface SmsTemplateMapper extends BaseMapperX { @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1") Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java new file mode 100644 index 0000000000..be4b5ea218 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.system.dal.mysql.user; + +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface AdminUserMapper extends BaseMapperX { + + default AdminUserDO selectByUsername(String username) { + return selectOne(new LambdaQueryWrapper().eq(AdminUserDO::getUsername, username)); + } + + default AdminUserDO selectByEmail(String email) { + return selectOne(new LambdaQueryWrapper().eq(AdminUserDO::getEmail, email)); + } + + default AdminUserDO selectByMobile(String mobile) { + return selectOne(new LambdaQueryWrapper().eq(AdminUserDO::getMobile, mobile)); + } + + default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) + .inIfPresent(AdminUserDO::getDeptId, deptIds)); + } + + default List selectList(UserExportReqVO reqVO, Collection deptIds) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) + .inIfPresent(AdminUserDO::getDeptId, deptIds)); + } + + default List selectListByNickname(String nickname) { + return selectList(new LambdaQueryWrapperX().like(AdminUserDO::getNickname, nickname)); + } + + default List selectListByUsername(String username) { + return selectList(new LambdaQueryWrapperX().like(AdminUserDO::getUsername, username)); + } + + default List selectListByStatus(Integer status) { + return selectList(AdminUserDO::getStatus, status); + } + + default List selectListByDeptIds(Collection deptIds) { + return selectList(AdminUserDO::getDeptId, deptIds); + } + +} + diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/UserMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/UserMapper.java deleted file mode 100644 index 7cd0fe426a..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/UserMapper.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.user; - -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserExportReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import jodd.util.StringPool; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; - -@Mapper -public interface UserMapper extends BaseMapperX { - - default UserDO selectByUsername(String username) { - return selectOne(new LambdaQueryWrapper().eq(UserDO::getUsername, username)); - } - - default UserDO selectByEmail(String email) { - return selectOne(new LambdaQueryWrapper().eq(UserDO::getEmail, email)); - } - - default UserDO selectByMobile(String mobile) { - return selectOne(new LambdaQueryWrapper().eq(UserDO::getMobile, mobile)); - } - - default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(UserDO::getUsername, reqVO.getUsername()) - .likeIfPresent(UserDO::getMobile, reqVO.getMobile()) - .eqIfPresent(UserDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(UserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) - .inIfPresent(UserDO::getDeptId, deptIds)); - } - - default List selectList(UserExportReqVO reqVO, Collection deptIds) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(UserDO::getUsername, reqVO.getUsername()) - .likeIfPresent(UserDO::getMobile, reqVO.getMobile()) - .eqIfPresent(UserDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(UserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) - .inIfPresent(UserDO::getDeptId, deptIds)); - } - - default List selectListByNickname(String nickname) { - return selectList(new LambdaQueryWrapperX().like(UserDO::getNickname, nickname)); - } - - default List selectListByUsername(String username) { - return selectList(new LambdaQueryWrapperX().like(UserDO::getUsername, username)); - } - - default List selectListByStatus(Integer status) { - return selectList(UserDO::getStatus, status); - } - - default List selectListByDeptIds(Collection deptIds) { - return selectList(UserDO::getDeptId, deptIds); - } - -} - diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java index 81bd82068b..c65c866b51 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.framework.datapermission.config; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.framework.datapermission.core.dept.rule.DeptDataPermissionRuleCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,7 +17,7 @@ public class DataPermissionConfiguration { @Bean public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { return rule -> { - rule.addDeptColumn(UserDO.class); + rule.addDeptColumn(AdminUserDO.class); rule.addDeptColumn(SysDeptDO.class, "id"); }; } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/sms/SmsCodeConfiguration.java similarity index 82% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeConfiguration.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/sms/SmsCodeConfiguration.java index fa741880b3..eb8620c61f 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeConfiguration.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/sms/SmsCodeConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.member.framework.sms; +package cn.iocoder.yudao.module.system.framework.sms; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeProperties.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/sms/SmsCodeProperties.java similarity index 88% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeProperties.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/sms/SmsCodeProperties.java index 542fe2d9e7..5d246bad7f 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/framework/sms/SmsCodeProperties.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/sms/SmsCodeProperties.java @@ -1,13 +1,11 @@ -package cn.iocoder.yudao.module.member.framework.sms; +package cn.iocoder.yudao.module.system.framework.sms; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; -import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.time.Duration; -import java.util.Collection; @ConfigurationProperties(prefix = "yudao.sms-code") @Validated diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java index 6779549dbd..6fe1db5a55 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.mq.consumer.sms; import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; -import cn.iocoder.yudao.module.system.service.sms.SysSmsSendService; +import cn.iocoder.yudao.module.system.service.sms.SmsSendService; import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -19,7 +19,7 @@ import javax.annotation.Resource; public class SmsSendConsumer extends AbstractStreamMessageListener { @Resource - private SysSmsSendService smsCoreService; + private SmsSendService smsCoreService; @Override public void onMessage(SmsSendMessage message) { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java similarity index 95% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java index 1a2a8240cf..36ef97972d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java @@ -12,7 +12,7 @@ import javax.validation.Valid; * * @author 芋道源码 */ -public interface AuthService extends SecurityAuthFrameworkService { +public interface AdminAuthService extends SecurityAuthFrameworkService { /** * 账号登录 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index 1d1df61392..fe4e502f0a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -13,15 +13,15 @@ import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLo import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLoginReqVO; import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import cn.iocoder.yudao.module.system.service.common.CaptchaService; import cn.iocoder.yudao.module.system.service.logger.LoginLogService; -import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.social.SocialUserService; -import cn.iocoder.yudao.module.system.service.user.UserService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthUser; import org.springframework.beans.factory.annotation.Autowired; @@ -50,9 +50,9 @@ import static java.util.Collections.singleton; * * @author 芋道源码 */ -@Service("adminAuthService") +@Service @Slf4j -public class AuthServiceImpl implements AuthService { +public class AdminAuthServiceImpl implements AdminAuthService { @Resource @Lazy // 延迟加载,因为存在相互依赖的问题 @@ -60,7 +60,7 @@ public class AuthServiceImpl implements AuthService { @Autowired @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 - private UserService userService; + private AdminUserService userService; @Resource private PermissionService permissionService; @Resource @@ -75,7 +75,7 @@ public class AuthServiceImpl implements AuthService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 获取 username 对应的 SysUserDO - UserDO user = userService.getUserByUsername(username); + AdminUserDO user = userService.getUserByUsername(username); if (user == null) { throw new UsernameNotFoundException(username); } @@ -86,7 +86,7 @@ public class AuthServiceImpl implements AuthService { @Override public LoginUser mockLogin(Long userId) { // 获取用户编号对应的 SysUserDO - UserDO user = userService.getUser(userId); + AdminUserDO user = userService.getUser(userId); if (user == null) { throw new UsernameNotFoundException(String.valueOf(userId)); } @@ -160,7 +160,7 @@ public class AuthServiceImpl implements AuthService { private void createLoginLog(String username, LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { // 获得用户 - UserDO user = userService.getUserByUsername(username); + AdminUserDO user = userService.getUserByUsername(username); // 插入登录日志 LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); reqDTO.setLogType(logTypeEnum.getType()); @@ -198,13 +198,13 @@ public class AuthServiceImpl implements AuthService { // 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错 String unionId = socialService.getAuthUserUnionId(authUser); - List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, getUserType()); + List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, getUserType().getValue()); if (CollUtil.isEmpty(socialUsers)) { throw exception(AUTH_THIRD_LOGIN_NOT_BIND); } // 自动登录 - UserDO user = userService.getUser(socialUsers.get(0).getUserId()); + AdminUserDO user = userService.getUser(socialUsers.get(0).getUserId()); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -214,7 +214,7 @@ public class AuthServiceImpl implements AuthService { LoginUser loginUser = this.buildLoginUser(user); // 绑定社交用户(更新) - socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); + socialService.bindSocialUser(loginUser.getId(), getUserType().getValue(), reqVO.getType(), authUser); // 缓存登录用户到 Redis 中,返回 sessionId 编号 return userSessionService.createUserSession(loginUser, userIp, userAgent); @@ -230,7 +230,7 @@ public class AuthServiceImpl implements AuthService { LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); // 绑定社交用户(新增) - socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, getUserType()); + socialService.bindSocialUser(loginUser.getId(), getUserType().getValue(), reqVO.getType(), authUser); // 缓存登录用户到 Redis 中,返回 sessionId 编号 return userSessionService.createUserSession(loginUser, userIp, userAgent); @@ -243,7 +243,7 @@ public class AuthServiceImpl implements AuthService { Assert.notNull(authUser, "授权用户不为空"); // 绑定社交用户(新增) - socialService.bindSocialUser(userId, reqVO.getType(), authUser, getUserType()); + socialService.bindSocialUser(userId, getUserType().getValue(), reqVO.getType(), authUser); } @Override @@ -296,7 +296,7 @@ public class AuthServiceImpl implements AuthService { } // 重新加载 SysUserDO 信息 - UserDO user = userService.getUser(loginUser.getId()); + AdminUserDO user = userService.getUser(loginUser.getId()); if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) { throw exception(AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面 } @@ -307,7 +307,7 @@ public class AuthServiceImpl implements AuthService { return newLoginUser; } - private LoginUser buildLoginUser(UserDO user) { + private LoginUser buildLoginUser(AdminUserDO user) { LoginUser loginUser = AuthConvert.INSTANCE.convert(user); // 补全字段 loginUser.setDeptId(user.getDeptId()); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java index cadc899d5d..beced6bd13 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java @@ -6,15 +6,15 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import cn.iocoder.yudao.module.system.service.logger.LoginLogService; -import cn.iocoder.yudao.module.system.service.user.UserService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.module.system.dal.redis.auth.LoginUserRedisDAO; -import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import com.google.common.collect.Lists; @@ -42,7 +42,7 @@ public class UserSessionServiceImpl implements UserSessionService { private SysUserSessionMapper userSessionMapper; @Resource - private UserService userService; + private AdminUserService userService; @Resource private LoginLogService loginLogService; @@ -57,7 +57,7 @@ public class UserSessionServiceImpl implements UserSessionService { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUsername())) { - userIds = convertSet(userService.getUsersByUsername(reqVO.getUsername()), UserDO::getId); + userIds = convertSet(userService.getUsersByUsername(reqVO.getUsername()), AdminUserDO::getId); if (CollUtil.isEmpty(userIds)) { return PageResult.empty(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java index 33ef52f8e5..c9aa07c567 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java @@ -1,11 +1,16 @@ package cn.iocoder.yudao.module.system.service.dept; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Map; /** * 部门 Service 接口 @@ -59,4 +64,50 @@ public interface DeptService { */ List getDeptsByParentIdFromCache(Long parentId, boolean recursive); + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDepts(Collection ids); + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + SysDeptDO getDept(Long id); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validDepts(Collection ids); + + /** + * 获得指定编号的部门列表 + * + * @param ids 部门编号数组 + * @return 部门列表 + */ + List getSimpleDepts(Collection ids); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = getSimpleDepts(ids); + return CollectionUtils.convertMap(list, SysDeptDO::getId); + } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java index bd269d9cc2..a21ccfb7bf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java @@ -3,13 +3,14 @@ package cn.iocoder.yudao.module.system.service.dept; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dept.DeptConvert; -import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; import com.google.common.collect.ImmutableMap; @@ -24,8 +25,8 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 部门 Service 实现类 @@ -257,4 +258,39 @@ public class DeptServiceImpl implements DeptService { } } + @Override + public List getDepts(Collection ids) { + return deptMapper.selectBatchIds(ids); + } + + @Override + public SysDeptDO getDept(Long id) { + return deptMapper.selectById(id); + } + + @Override + public void validDepts(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得科室信息 + List depts = deptMapper.selectBatchIds(ids); + Map deptMap = CollectionUtils.convertMap(depts, SysDeptDO::getId); + // 校验 + ids.forEach(id -> { + SysDeptDO dept = deptMap.get(id); + if (dept == null) { + throw exception(DEPT_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw exception(DEPT_NOT_ENABLE, dept.getName()); + } + }); + } + + @Override + public List getSimpleDepts(Collection ids) { + return deptMapper.selectBatchIds(ids); + } + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java index 5e2dc33e7c..30b8fcc9ad 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java @@ -86,4 +86,13 @@ public interface PostService { */ SysPostDO getPost(Long id); + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validPosts(Collection ids); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java index a498ce3dcb..f6bb471f61 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.system.service.dept; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostCreateReqVO; @@ -7,17 +9,19 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportRe import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dept.PostConvert; -import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Collection; import java.util.List; +import java.util.Map; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 岗位 Service 实现类 @@ -125,4 +129,23 @@ public class PostServiceImpl implements PostService { } } + @Override + public void validPosts(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List posts = postMapper.selectBatchIds(ids); + Map postMap = convertMap(posts, SysPostDO::getId); + // 校验 + ids.forEach(id -> { + SysPostDO post = postMap.get(id); + if (post == null) { + throw exception(POST_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { + throw exception(POST_NOT_ENABLE, post.getName()); + } + }); + } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptCoreService.java deleted file mode 100644 index 92c0fdbc0c..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysDeptCoreService.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.iocoder.yudao.module.system.service.dept; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -public interface SysDeptCoreService { - /** - * 获得部门信息数组 - * - * @param ids 部门编号数组 - * @return 部门信息数组 - */ - List getDepts(Collection ids); - - /** - * 获得部门信息 - * - * @param id 部门编号 - * @return 部门信息 - */ - SysDeptDO getDept(Long id); - - /** - * 校验部门们是否有效。如下情况,视为无效: - * 1. 部门编号不存在 - * 2. 部门被禁用 - * - * @param ids 角色编号数组 - */ - void validDepts(Collection ids); - - /** - * 获得指定编号的部门列表 - * - * @param ids 部门编号数组 - * @return 部门列表 - */ - List getSimpleDepts(Collection ids); - - /** - * 获得指定编号的部门 Map - * - * @param ids 部门编号数组 - * @return 部门 Map - */ - default Map getDeptMap(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyMap(); - } - List list = getSimpleDepts(ids); - return CollectionUtils.convertMap(list, SysDeptDO::getId); - } -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostCoreService.java deleted file mode 100644 index 5ce996ed50..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/SysPostCoreService.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.system.service.dept; - -import java.util.Collection; - -/** - * 岗位 Core Service 接口 - * - * @author 芋道源码 - */ -public interface SysPostCoreService { - /** - * 校验岗位们是否有效。如下情况,视为无效: - * 1. 岗位编号不存在 - * 2. 岗位被禁用 - * - * @param ids 岗位编号数组 - */ - void validPosts(Collection ids); -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysDeptCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysDeptCoreServiceImpl.java deleted file mode 100644 index 032e5e3789..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysDeptCoreServiceImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.iocoder.yudao.module.system.service.dept.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptCoreMapper; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.DEPT_NOT_ENABLE; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.DEPT_NOT_FOUND; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 部门 Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class SysDeptCoreServiceImpl implements SysDeptCoreService { - - @Resource - private SysDeptCoreMapper deptCoreMapper; - - @Override - public List getDepts(Collection ids) { - return deptCoreMapper.selectBatchIds(ids); - } - - @Override - public SysDeptDO getDept(Long id) { - return deptCoreMapper.selectById(id); - } - - @Override - public void validDepts(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得科室信息 - List depts = deptCoreMapper.selectBatchIds(ids); - Map deptMap = CollectionUtils.convertMap(depts, SysDeptDO::getId); - // 校验 - ids.forEach(id -> { - SysDeptDO dept = deptMap.get(id); - if (dept == null) { - throw exception(DEPT_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { - throw exception(DEPT_NOT_ENABLE, dept.getName()); - } - }); - } - - @Override - public List getSimpleDepts(Collection ids) { - return deptCoreMapper.selectBatchIds(ids); - } - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysPostCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysPostCoreServiceImpl.java deleted file mode 100644 index d0bc198743..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/impl/SysPostCoreServiceImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.iocoder.yudao.module.system.service.dept.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostCoreMapper; -import cn.iocoder.yudao.module.system.service.dept.SysPostCoreService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.POST_NOT_ENABLE; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.POST_NOT_FOUND; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 岗位 Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysPostCoreServiceImpl implements SysPostCoreService { - - @Resource - private SysPostCoreMapper sysPostCoreMapper; - - @Override - public void validPosts(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得岗位信息 - List posts = sysPostCoreMapper.selectBatchIds(ids); - Map postMap = CollectionUtils.convertMap(posts, SysPostDO::getId); - // 校验 - ids.forEach(id -> { - SysPostDO post = postMap.get(id); - if (post == null) { - throw exception(POST_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { - throw exception(POST_NOT_ENABLE, post.getName()); - } - }); - } -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java index f900f0baec..152236adfb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java @@ -4,8 +4,9 @@ import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginL import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; +import javax.validation.Valid; import java.util.List; /** @@ -34,6 +35,6 @@ public interface LoginLogService { * * @param reqDTO 日志信息 */ - void createLoginLog(LoginLogCreateReqDTO reqDTO); + void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java index c352748724..0233b7c103 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java @@ -1,13 +1,12 @@ package cn.iocoder.yudao.module.system.service.logger; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; import cn.iocoder.yudao.module.system.convert.logger.SysLoginLogCoreConvert; -import cn.iocoder.yudao.module.system.dal.mysql.logger.LoginLogMapper; import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.dal.mysql.logger.SysLoginLogCoreMapper; -import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.dal.mysql.logger.LoginLogMapper; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -35,7 +34,6 @@ public class LoginLogServiceImpl implements LoginLogService { @Override public void createLoginLog(LoginLogCreateReqDTO reqDTO) { SysLoginLogDO loginLog = SysLoginLogCoreConvert.INSTANCE.convert(reqDTO); - // 插入 loginLogMapper.insert(loginLog); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java index d32b0e505b..dc1175f602 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java @@ -6,9 +6,9 @@ import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.Oper import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; import cn.iocoder.yudao.module.system.convert.logger.OperateLogConvert; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; -import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; @@ -35,7 +35,7 @@ public class OperateLogServiceImpl implements OperateLogService { private OperateLogMapper operateLogMapper; @Resource - private UserService userService; + private AdminUserService userService; @Override @Async @@ -58,7 +58,7 @@ public class OperateLogServiceImpl implements OperateLogService { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { - userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), UserDO::getId); + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), AdminUserDO::getId); if (CollUtil.isEmpty(userIds)) { return PageResult.empty(); } @@ -72,7 +72,7 @@ public class OperateLogServiceImpl implements OperateLogService { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { - userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), UserDO::getId); + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), AdminUserDO::getId); if (CollUtil.isEmpty(userIds)) { return Collections.emptyList(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java index 0bae64b787..fe2b573c07 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuLi import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; import cn.iocoder.yudao.module.system.convert.permission.MenuConvert; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysMenuMapper; +import cn.iocoder.yudao.module.system.dal.mysql.permission.MenuMapper; import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum; import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; import cn.iocoder.yudao.module.system.mq.producer.permission.MenuProducer; @@ -67,7 +67,7 @@ public class MenuServiceImpl implements MenuService { private volatile Date maxUpdateTime; @Resource - private SysMenuMapper menuMapper; + private MenuMapper menuMapper; @Resource private PermissionService permissionService; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionService.java index 9983bcbb91..153eb71ac7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionService.java @@ -115,4 +115,12 @@ public interface PermissionService extends SecurityPermissionFrameworkService, D */ void processUserDeleted(Long userId); + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleIds(Collection roleIds); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java index d68e849930..05f15ec9ef 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java @@ -5,11 +5,11 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMenuMapper; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper; +import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper; import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -75,9 +75,9 @@ public class PermissionServiceImpl implements PermissionService { private volatile Date maxUpdateTime; @Resource - private SysRoleMenuMapper roleMenuMapper; + private RoleMenuMapper roleMenuMapper; @Resource - private SysUserRoleMapper userRoleMapper; + private UserRoleMapper userRoleMapper; @Resource private RoleService roleService; @@ -150,7 +150,7 @@ public class PermissionServiceImpl implements PermissionService { return Collections.emptyList(); } // 判断角色是否包含管理员 - List roleList = roleService.getRolesFromCache(roleIds); + List roleList = roleService.getRolesFromCache(roleIds); boolean hasAdmin = roleService.hasAnyAdmin(roleList); // 获得角色拥有的菜单关联 if (hasAdmin) { // 管理员,获取到全部 @@ -162,21 +162,21 @@ public class PermissionServiceImpl implements PermissionService { @Override public Set getUserRoleIds(Long userId, Collection roleStatuses) { - List userRoleList = userRoleMapper.selectListByUserId(userId); + List userRoleList = userRoleMapper.selectListByUserId(userId); // 过滤角色状态 if (CollectionUtil.isNotEmpty(roleStatuses)) { userRoleList.removeIf(userRoleDO -> { - SysRoleDO role = roleService.getRoleFromCache(userRoleDO.getRoleId()); + RoleDO role = roleService.getRoleFromCache(userRoleDO.getRoleId()); return role == null || !roleStatuses.contains(role.getStatus()); }); } - return CollectionUtils.convertSet(userRoleList, SysUserRoleDO::getRoleId); + return CollectionUtils.convertSet(userRoleList, UserRoleDO::getRoleId); } @Override public Set listRoleMenuIds(Long roleId) { // 如果是管理员的情况下,获取全部菜单编号 - SysRoleDO role = roleService.getRole(roleId); + RoleDO role = roleService.getRole(roleId); if (roleService.hasAnyAdmin(Collections.singletonList(role))) { return CollectionUtils.convertSet(menuService.getMenus(), MenuDO::getId); } @@ -215,13 +215,13 @@ public class PermissionServiceImpl implements PermissionService { @Override public Set getUserRoleIdListByUserId(Long userId) { return CollectionUtils.convertSet(userRoleMapper.selectListByUserId(userId), - SysUserRoleDO::getRoleId); + UserRoleDO::getRoleId); } @Override public Set getUserRoleIdListByRoleId(Long roleId) { return CollectionUtils.convertSet(userRoleMapper.selectListByRoleId(roleId), - SysUserRoleDO::getRoleId); + UserRoleDO::getRoleId); } @@ -230,7 +230,7 @@ public class PermissionServiceImpl implements PermissionService { public void assignUserRole(Long userId, Set roleIds) { // 获得角色拥有角色编号 Set dbRoleIds = CollectionUtils.convertSet(userRoleMapper.selectListByUserId(userId), - SysUserRoleDO::getRoleId); + UserRoleDO::getRoleId); // 计算新增和删除的角色编号 Collection createRoleIds = CollUtil.subtract(roleIds, dbRoleIds); Collection deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds); @@ -343,7 +343,7 @@ public class PermissionServiceImpl implements PermissionService { return true; } Set userRoles = CollectionUtils.convertSet(roleService.getRolesFromCache(roleIds), - SysRoleDO::getCode); + RoleDO::getCode); return CollUtil.containsAny(userRoles, Sets.newHashSet(roles)); } @@ -357,8 +357,8 @@ public class PermissionServiceImpl implements PermissionService { // 创建 DeptDataPermissionRespDTO 对象 result = new DeptDataPermissionRespDTO(); - List roles = roleService.getRolesFromCache(loginUser.getRoleIds()); - for (SysRoleDO role : roles) { + List roles = roleService.getRolesFromCache(loginUser.getRoleIds()); + for (RoleDO role : roles) { // 为空时,跳过 if (role.getDataScope() == null) { continue; @@ -401,4 +401,10 @@ public class PermissionServiceImpl implements PermissionService { return result; } + @Override + public Set getUserRoleIdListByRoleIds(Collection roleIds) { + return CollectionUtils.convertSet(userRoleMapper.selectListByRoleIds(roleIds), + UserRoleDO::getRoleId); + } + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java index def01146aa..003ea62cc9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleCr import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import org.springframework.lang.Nullable; import java.util.Collection; @@ -69,7 +69,7 @@ public interface RoleService { * @param id 角色编号 * @return 角色 */ - SysRoleDO getRoleFromCache(Long id); + RoleDO getRoleFromCache(Long id); /** * 获得角色列表 @@ -77,7 +77,7 @@ public interface RoleService { * @param statuses 筛选的状态。允许空,空时不筛选 * @return 角色列表 */ - List getRoles(@Nullable Collection statuses); + List getRoles(@Nullable Collection statuses); /** * 获得角色数组,从缓存中 @@ -85,7 +85,7 @@ public interface RoleService { * @param ids 角色编号数组 * @return 角色数组 */ - List getRolesFromCache(Collection ids); + List getRolesFromCache(Collection ids); /** * 判断角色数组中,是否有管理员 @@ -93,7 +93,7 @@ public interface RoleService { * @param roleList 角色数组 * @return 是否有管理员 */ - boolean hasAnyAdmin(Collection roleList); + boolean hasAnyAdmin(Collection roleList); /** * 判断角色编号数组中,是否有管理员 @@ -111,7 +111,7 @@ public interface RoleService { * @param id 角色编号 * @return 角色 */ - SysRoleDO getRole(Long id); + RoleDO getRole(Long id); /** * 获得角色分页 @@ -119,7 +119,7 @@ public interface RoleService { * @param reqVO 角色分页查询 * @return 角色分页结果 */ - PageResult getRolePage(RolePageReqVO reqVO); + PageResult getRolePage(RolePageReqVO reqVO); /** * 获得角色列表 @@ -127,8 +127,15 @@ public interface RoleService { * @param reqVO 列表查询 * @return 角色列表 */ - List getRoleList(RoleExportReqVO reqVO); - + List getRoleList(RoleExportReqVO reqVO); + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validRoles(Collection ids); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index 095e87ddba..48182a3f68 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -4,18 +4,19 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; import cn.iocoder.yudao.module.system.convert.permission.RoleConvert; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMapper; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMapper; import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum; import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; import cn.iocoder.yudao.module.system.mq.producer.permission.RoleProducer; -import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; import lombok.extern.slf4j.Slf4j; @@ -32,8 +33,8 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 角色 Service 实现类 @@ -52,11 +53,11 @@ public class RoleServiceImpl implements RoleService { /** * 角色缓存 - * key:角色编号 {@link SysRoleDO#getId()} + * key:角色编号 {@link RoleDO#getId()} * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ - private volatile Map roleCache; + private volatile Map roleCache; /** * 缓存角色的最大更新时间,用于后续的增量轮询,判断是否有更新 */ @@ -66,7 +67,7 @@ public class RoleServiceImpl implements RoleService { private PermissionService permissionService; @Resource - private SysRoleMapper roleMapper; + private RoleMapper roleMapper; @Resource private RoleProducer roleProducer; @@ -78,13 +79,13 @@ public class RoleServiceImpl implements RoleService { @PostConstruct public void initLocalCache() { // 获取角色列表,如果有更新 - List roleList = this.loadRoleIfUpdate(maxUpdateTime); + List roleList = this.loadRoleIfUpdate(maxUpdateTime); if (CollUtil.isEmpty(roleList)) { return; } // 写入缓存 - ImmutableMap.Builder builder = ImmutableMap.builder(); + ImmutableMap.Builder builder = ImmutableMap.builder(); roleList.forEach(sysRoleDO -> builder.put(sysRoleDO.getId(), sysRoleDO)); roleCache = builder.build(); assert roleList.size() > 0; // 断言,避免告警 @@ -104,7 +105,7 @@ public class RoleServiceImpl implements RoleService { * @param maxUpdateTime 当前角色的最大更新时间 * @return 角色列表 */ - private List loadRoleIfUpdate(Date maxUpdateTime) { + private List loadRoleIfUpdate(Date maxUpdateTime) { // 第一步,判断是否要更新。 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadRoleIfUpdate][首次加载全量角色]"); @@ -123,7 +124,7 @@ public class RoleServiceImpl implements RoleService { // 校验角色 checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null); // 插入到数据库 - SysRoleDO role = RoleConvert.INSTANCE.convert(reqVO); + RoleDO role = RoleConvert.INSTANCE.convert(reqVO); role.setType(RoleTypeEnum.CUSTOM.getType()); role.setStatus(CommonStatusEnum.ENABLE.getStatus()); role.setDataScope(DataScopeEnum.ALL.getScope()); // 默认可查看所有数据。原因是,可能一些项目不需要项目权限 @@ -141,7 +142,7 @@ public class RoleServiceImpl implements RoleService { // 校验角色的唯一字段是否重复 checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId()); // 更新到数据库 - SysRoleDO updateObject = RoleConvert.INSTANCE.convert(reqVO); + RoleDO updateObject = RoleConvert.INSTANCE.convert(reqVO); roleMapper.updateById(updateObject); // 发送刷新消息 roleProducer.sendRoleRefreshMessage(); @@ -152,7 +153,7 @@ public class RoleServiceImpl implements RoleService { // 校验是否可以更新 this.checkUpdateRole(id); // 更新状态 - SysRoleDO updateObject = new SysRoleDO(); + RoleDO updateObject = new RoleDO(); updateObject.setId(id); updateObject.setStatus(status); roleMapper.updateById(updateObject); @@ -165,7 +166,7 @@ public class RoleServiceImpl implements RoleService { // 校验是否可以更新 checkUpdateRole(id); // 更新数据范围 - SysRoleDO updateObject = new SysRoleDO(); + RoleDO updateObject = new RoleDO(); updateObject.setId(id); updateObject.setDataScope(dataScope); updateObject.setDataScopeDeptIds(dataScopeDeptIds); @@ -195,17 +196,17 @@ public class RoleServiceImpl implements RoleService { } @Override - public SysRoleDO getRoleFromCache(Long id) { + public RoleDO getRoleFromCache(Long id) { return roleCache.get(id); } @Override - public List getRoles(@Nullable Collection statuses) { + public List getRoles(@Nullable Collection statuses) { return roleMapper.selectListByStatus(statuses); } @Override - public List getRolesFromCache(Collection ids) { + public List getRolesFromCache(Collection ids) { if (CollectionUtil.isEmpty(ids)) { return Collections.emptyList(); } @@ -214,7 +215,7 @@ public class RoleServiceImpl implements RoleService { } @Override - public boolean hasAnyAdmin(Collection roleList) { + public boolean hasAnyAdmin(Collection roleList) { if (CollectionUtil.isEmpty(roleList)) { return false; } @@ -222,17 +223,17 @@ public class RoleServiceImpl implements RoleService { } @Override - public SysRoleDO getRole(Long id) { + public RoleDO getRole(Long id) { return roleMapper.selectById(id); } @Override - public PageResult getRolePage(RolePageReqVO reqVO) { + public PageResult getRolePage(RolePageReqVO reqVO) { return roleMapper.selectPage(reqVO); } @Override - public List getRoleList(RoleExportReqVO reqVO) { + public List getRoleList(RoleExportReqVO reqVO) { return roleMapper.listRoles(reqVO); } @@ -249,7 +250,7 @@ public class RoleServiceImpl implements RoleService { @VisibleForTesting public void checkDuplicateRole(String name, String code, Long id) { // 1. 该 name 名字被其它角色所使用 - SysRoleDO role = roleMapper.selectByName(name); + RoleDO role = roleMapper.selectByName(name); if (role != null && !role.getId().equals(id)) { throw exception(ROLE_NAME_DUPLICATE, name); } @@ -271,7 +272,7 @@ public class RoleServiceImpl implements RoleService { */ @VisibleForTesting public void checkUpdateRole(Long id) { - SysRoleDO roleDO = roleMapper.selectById(id); + RoleDO roleDO = roleMapper.selectById(id); if (roleDO == null) { throw exception(ROLE_NOT_EXISTS); } @@ -281,4 +282,23 @@ public class RoleServiceImpl implements RoleService { } } + @Override + public void validRoles(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得角色信息 + List roles = roleMapper.selectBatchIds(ids); + Map roleMap = CollectionUtils.convertMap(roles, RoleDO::getId); + // 校验 + ids.forEach(id -> { + RoleDO role = roleMap.get(id); + if (role == null) { + throw exception(ROLE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())) { + throw exception(ROLE_IS_DISABLE, role.getName()); + } + }); + } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionCoreService.java deleted file mode 100644 index 5898038c49..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysPermissionCoreService.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.yudao.module.system.service.permission; - -import java.util.Collection; -import java.util.Set; -/** - * 权限 Core Service 接口 - * - * 提供用户-角色、角色-菜单、角色-部门的关联权限处理 - * - * @author 芋道源码 - */ -public interface SysPermissionCoreService { - /** - * 获得拥有多个角色的用户编号集合 - * - * @param roleIds 角色编号集合 - * @return 用户编号集合 - */ - Set getUserRoleIdListByRoleIds(Collection roleIds); -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleCoreService.java deleted file mode 100644 index 17e8adb871..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/SysRoleCoreService.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.system.service.permission; - -import java.util.Collection; - -/** - * 角色 Core Service 接口 - * - * @author 芋道源码 - */ -public interface SysRoleCoreService { - /** - * 校验角色们是否有效。如下情况,视为无效: - * 1. 角色编号不存在 - * 2. 角色被禁用 - * - * @param ids 角色编号数组 - */ - void validRoles(Collection ids); -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysPermissionCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysPermissionCoreServiceImpl.java deleted file mode 100644 index 100e076af6..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysPermissionCoreServiceImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.system.service.permission.impl; - -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleCoreMapper; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.Set; -/** - * 权限 Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysPermissionCoreServiceImpl implements SysPermissionCoreService { - - @Resource - private SysUserRoleCoreMapper userRoleCoreMapper; - - @Override - public Set getUserRoleIdListByRoleIds(Collection roleIds) { - return CollectionUtils.convertSet(userRoleCoreMapper.selectListByRoleIds(roleIds), - SysUserRoleDO::getRoleId); - } -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysRoleCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysRoleCoreServiceImpl.java deleted file mode 100644 index 865eeb81ea..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/impl/SysRoleCoreServiceImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.iocoder.yudao.module.system.service.permission.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleCoreMapper; -import cn.iocoder.yudao.module.system.service.permission.SysRoleCoreService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.ROLE_IS_DISABLE; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.ROLE_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 角色 Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysRoleCoreServiceImpl implements SysRoleCoreService { - - @Resource - private SysRoleCoreMapper sysRoleCoreMapper; - - @Override - public void validRoles(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得角色信息 - List roles = sysRoleCoreMapper.selectBatchIds(ids); - Map roleMap = CollectionUtils.convertMap(roles, SysRoleDO::getId); - // 校验 - ids.forEach(id -> { - SysRoleDO role = roleMap.get(id); - if (role == null) { - throw exception(ROLE_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())) { - throw exception(ROLE_IS_DISABLE, role.getName()); - } - }); - } -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java index ef95af5f26..0a58798802 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannel import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; import cn.iocoder.yudao.module.system.convert.sms.SmsChannelConvert; -import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsChannelMapper; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -52,7 +52,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { private SmsClientFactory smsClientFactory; @Resource - private SysSmsChannelMapper smsChannelMapper; + private SmsChannelMapper smsChannelMapper; @Resource private SmsTemplateService smsTemplateService; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java similarity index 62% rename from yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java index e06e9a246f..f62b7576da 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/sms/SysSmsCodeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java @@ -1,22 +1,21 @@ -package cn.iocoder.yudao.module.member.service.sms; +package cn.iocoder.yudao.module.system.service.sms; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SysSmsCodeDO; -import cn.iocoder.yudao.module.member.enums.sms.SysSmsSceneEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; /** * 短信验证码 Service 接口 * * @author 芋道源码 */ -public interface SysSmsCodeService { +public interface SmsCodeService { /** * 创建短信验证码,并进行发送 * * @param mobile 手机号 - * @param scene 发送场景 {@link SysSmsSceneEnum} + * @param scene 发送场景 {@link SmsSceneEnum} * @param createIp 发送 IP */ void sendSmsCode(@Mobile String mobile, Integer scene, String createIp); @@ -27,25 +26,19 @@ public interface SysSmsCodeService { * 如果错误,则抛出 {@link ServiceException} 异常 * * @param mobile 手机号 - * @param scene 发送场景 + * @param scene 发送场景 {@link SmsSceneEnum} * @param code 验证码 * @param usedIp 使用 IP */ void useSmsCode(@Mobile String mobile, Integer scene, String code, String usedIp); - /** - * 根据用户id发送验证码 - * - * @param userId 用户id - */ - void sendSmsCodeLogin(Long userId); - /** * 检查验证码是否有效 + * * @param mobile 手机 * @param code 验证码 * @param scene 使用场景 - * @return 验证码记录 */ - SysSmsCodeDO checkCodeIsExpired(String mobile, String code, Integer scene); + void checkSmsCode(String mobile, String code, Integer scene); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java new file mode 100644 index 0000000000..db4bfa8fae --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java @@ -0,0 +1,112 @@ +package cn.iocoder.yudao.module.system.service.sms; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.module.member.api.user.MemberUserApi; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; +import cn.iocoder.yudao.module.system.framework.sms.SmsCodeProperties; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Date; + +import static cn.hutool.core.util.RandomUtil.randomInt; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信验证码 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SmsCodeServiceImpl implements SmsCodeService { + + @Resource + private SmsCodeProperties smsCodeProperties; + + @Resource + private SmsCodeMapper smsCodeMapper; + + @Resource + private AdminUserService adminUserService; + @Resource + private MemberUserApi memberUserApi; + + @Resource + private SmsSendService smsSendService; + + @Override + public void sendSmsCode(String mobile, Integer scene, String createIp) { + SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(scene); + Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", scene); + // 创建验证码 + String code = createSmsCode(mobile, scene, createIp); + // 发送验证码 + smsSendService.sendSingleSms(mobile, null, null, + sceneEnum.getTemplateCode(), MapUtil.of("code", code)); + } + + private String createSmsCode(String mobile, Integer scene, String ip) { + // 校验是否可以发送验证码,不用筛选场景 + SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null,null); + if (lastSmsCode != null) { + if (lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 + throw ServiceExceptionUtil.exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); + } + if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() + < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 + throw ServiceExceptionUtil.exception(SMS_CODE_SEND_TOO_FAST); + } + // TODO 芋艿:提升,每个 IP 每天可发送数量 + // TODO 芋艿:提升,每个 IP 每小时可发送数量 + } + + // 创建验证码记录 + String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1)); + SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code) + .scene(scene).todayIndex(lastSmsCode != null ? lastSmsCode.getTodayIndex() + 1 : 1) + .createIp(ip).used(false).build(); + smsCodeMapper.insert(newSmsCode); + return code; + } + + @Override + public void useSmsCode(String mobile, Integer scene, String code, String usedIp) { + // 检测验证码是否有效 + SmsCodeDO lastSmsCode = this.checkSmsCode0(mobile, code, scene); + // 使用验证码 + smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId()) + .used(true).usedTime(new Date()).usedIp(usedIp).build()); + } + + @Override + public void checkSmsCode(String mobile, String code, Integer scene) { + checkSmsCode0(mobile, code, scene); + } + + public SmsCodeDO checkSmsCode0(String mobile, String code, Integer scene) { + // 校验验证码 + SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile,code,scene); + // 若验证码不存在,抛出异常 + if (lastSmsCode == null) { + throw ServiceExceptionUtil.exception(SMS_CODE_NOT_FOUND); + } + // 超过时间 + if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() + >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期 + throw ServiceExceptionUtil.exception(SMS_CODE_EXPIRED); + } + // 判断验证码是否已被使用 + if (Boolean.TRUE.equals(lastSmsCode.getUsed())) { + throw ServiceExceptionUtil.exception(SMS_CODE_USED); + } + return lastSmsCode; + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java index a90f69f09a..75fa8848c1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsLogMapper; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsLogMapper; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.enums.sms.SysSmsReceiveStatusEnum; @@ -28,7 +28,7 @@ import java.util.Objects; public class SmsLogServiceImpl implements SmsLogService { @Resource - private SysSmsLogMapper smsLogMapper; + private SmsLogMapper smsLogMapper; @Override public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, @@ -41,7 +41,8 @@ public class SmsLogServiceImpl implements SmsLogService { logBuilder.mobile(mobile).userId(userId).userType(userType); // 设置模板相关字段 logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); - logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId()); + logBuilder.templateContent(templateContent).templateParams(templateParams) + .apiTemplateId(template.getApiTemplateId()); // 设置渠道相关字段 logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); // 设置接收相关字段 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendService.java similarity index 63% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendService.java index 4c673935a6..3c42cf58ea 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendService.java @@ -6,14 +6,14 @@ import java.util.List; import java.util.Map; /** - * 短信 Service 发送接口 + * 短信发送 Service 接口 * * @author 芋道源码 */ -public interface SysSmsSendService { +public interface SmsSendService { /** - * 发送单条短信给后台用户 + * 发送单条短信给管理后台的用户 * * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 * @@ -27,7 +27,7 @@ public interface SysSmsSendService { String templateCode, Map templateParams); /** - * 发送单条短信给前台用户 + * 发送单条短信给用户 APP 的用户 * * 在 mobile 为空时,使用 userId 加载对应会员的手机号 * @@ -40,12 +40,30 @@ public interface SysSmsSendService { Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams); + /** + * 发送单条短信给用户 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ Long sendSingleSms(String mobile, Long userId, Integer userType, String templateCode, Map templateParams); - void sendBatchSms(List mobiles, List userIds, Integer userType, - String templateCode, Map templateParams); + default void sendBatchSms(List mobiles, List userIds, Integer userType, + String templateCode, Map templateParams) { + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); + } + /** + * 执行真正的短信发送 + * 注意,该方法仅仅提供给 MQ Consumer 使用 + * + * @param message 短信 + */ void doSendSms(SmsSendMessage message); /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java similarity index 84% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java index b6737fbdff..8819a27107 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java @@ -2,9 +2,6 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; @@ -13,10 +10,14 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.yudao.module.member.api.user.MemberUserApi; +import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.module.system.service.user.UserService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.google.common.annotations.VisibleForTesting; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -25,20 +26,22 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** - * 短信 Service 发送的实现 + * 短信发送 Service 发送的实现 * * @author 芋道源码 */ @Service -public class SysSmsSendServiceImpl implements SysSmsSendService { +public class SmsSendServiceImpl implements SmsSendService { + + @Resource + private AdminUserService adminUserService; + @Resource + private MemberUserApi memberUserApi; - @Autowired - @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") // UserService 存在重名 - private UserService userService; @Resource private SmsTemplateService smsTemplateService; @Resource @@ -54,7 +57,7 @@ public class SysSmsSendServiceImpl implements SysSmsSendService { public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map templateParams) { // 如果 mobile 为空,则加载用户编号对应的手机号 if (StrUtil.isEmpty(mobile)) { - UserDO user = userService.getUser(userId); + AdminUserDO user = adminUserService.getUser(userId); if (user != null) { mobile = user.getMobile(); } @@ -67,11 +70,10 @@ public class SysSmsSendServiceImpl implements SysSmsSendService { public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams) { // 如果 mobile 为空,则加载用户编号对应的手机号 if (StrUtil.isEmpty(mobile)) { -// MbrUserDO user = mbrUserCoreService.getUser(userId); -// if (user != null) { -// mobile = user.getMobile(); -// } - // TODO 芋艿:重构 + UserRespDTO user = memberUserApi.getUser(userId); + if (user != null) { + mobile = user.getMobile(); + } } // 执行发送 return this.sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); @@ -87,8 +89,8 @@ public class SysSmsSendServiceImpl implements SysSmsSendService { // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 List> newTemplateParams = this.buildTemplateParams(template, templateParams); - // 创建发送日志 - Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志 + // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams); @@ -100,11 +102,6 @@ public class SysSmsSendServiceImpl implements SysSmsSendService { return sendLogId; } - @Override - public void sendBatchSms(List mobiles, List userIds, Integer userType, - String templateCode, Map templateParams) { - throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); - } @VisibleForTesting public SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java index 24589abe48..5199dd2220 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; import cn.iocoder.yudao.module.system.convert.sms.SmsTemplateConvert; -import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsTemplateMapper; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsTemplateMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; @@ -56,7 +56,7 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); @Resource - private SysSmsTemplateMapper smsTemplateMapper; + private SmsTemplateMapper smsTemplateMapper; @Resource private SmsChannelService smsChannelService; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java index a6010503c8..e5ca68040e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java @@ -1,10 +1,9 @@ package cn.iocoder.yudao.module.system.service.social; import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.exception.ServiceException; import me.zhyd.oauth.model.AuthUser; import javax.validation.constraints.NotNull; @@ -38,6 +37,12 @@ public interface SocialUserService { @NotNull AuthUser getAuthUser(Integer type, String code, String state); + /** + * 获得社交用户的 unionId 编号 + * + * @param authUser 社交用户 + * @return unionId 编号 + */ default String getAuthUserUnionId(AuthUser authUser) { return StrUtil.blankToDefault(authUser.getToken().getUnionId(), authUser.getUuid()); } @@ -48,38 +53,37 @@ public interface SocialUserService { * * @param type 社交平台的类型 {@link SocialTypeEnum} * @param unionId 社交平台的 unionId + * @param userType 全局用户类型 * @return 社交用户列表 - * @param userTypeEnum 全局用户类型 */ - List getAllSocialUserList(Integer type, String unionId, UserTypeEnum userTypeEnum); + List getAllSocialUserList(Integer type, String unionId, Integer userType); /** * 获得指定用户的社交用户列表 * * @param userId 用户编号 + * @param userType 用户类型 * @return 社交用户列表 - * @param userTypeEnum 全局用户类型 */ - List getSocialUserList(Long userId, UserTypeEnum userTypeEnum); + List getSocialUserList(Long userId, Integer userType); /** * 绑定社交用户 - * - * @param userId 用户编号 + * @param userId 用户编号 + * @param userType 用户类型 * @param type 社交平台的类型 {@link SocialTypeEnum} * @param authUser 授权用户 - * @param userTypeEnum 全局用户类型 */ - void bindSocialUser(Long userId, Integer type, AuthUser authUser, UserTypeEnum userTypeEnum); + void bindSocialUser(Long userId, Integer userType, Integer type, AuthUser authUser); /** * 取消绑定社交用户 * * @param userId 用户编号 + * @param userType 全局用户类型 * @param type 社交平台的类型 {@link SocialTypeEnum} * @param unionId 社交平台的 unionId - * @param userTypeEnum 全局用户类型 */ - void unbindSocialUser(Long userId, Integer type, String unionId, UserTypeEnum userTypeEnum); + void unbindSocialUser(Long userId, Integer userType, Integer type, String unionId); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java index c5ccf20d01..ecb81d96a9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java @@ -1,13 +1,12 @@ package cn.iocoder.yudao.module.system.service.social; import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.module.system.dal.mysql.social.SysSocialUserMapper; import cn.iocoder.yudao.module.system.dal.redis.social.SocialAuthUserRedisDAO; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import com.google.common.annotations.VisibleForTesting; import com.xkcoding.justauth.AuthRequestFactory; import lombok.extern.slf4j.Slf4j; @@ -24,10 +23,10 @@ import javax.annotation.Resource; import java.util.List; import java.util.Objects; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SOCIAL_AUTH_FAILURE; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.SOCIAL_UNBIND_NOT_SELF; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_AUTH_FAILURE; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_UNBIND_NOT_SELF; /** * 社交用户 Service 实现类 @@ -74,25 +73,25 @@ public class SocialUserServiceImpl implements SocialUserService { } @Override - public List getAllSocialUserList(Integer type, String unionId,UserTypeEnum userTypeEnum) { + public List getAllSocialUserList(Integer type, String unionId, Integer userType) { List types = SocialTypeEnum.getRelationTypes(type); - return socialUserMapper.selectListByTypeAndUnionId(userTypeEnum.getValue(), types, unionId); + return socialUserMapper.selectListByTypeAndUnionId(userType, types, unionId); } @Override - public List getSocialUserList(Long userId,UserTypeEnum userTypeEnum) { - return socialUserMapper.selectListByUserId(userTypeEnum.getValue(), userId); + public List getSocialUserList(Long userId, Integer userType) { + return socialUserMapper.selectListByUserId(userType, userId); } @Override - @Transactional - public void bindSocialUser(Long userId, Integer type, AuthUser authUser, UserTypeEnum userTypeEnum) { + @Transactional(rollbackFor = Exception.class) + public void bindSocialUser(Long userId, Integer userType, Integer type, AuthUser authUser) { // 获得 unionId 对应的 SysSocialUserDO 列表 String unionId = getAuthUserUnionId(authUser); - List socialUsers = this.getAllSocialUserList(type, unionId, userTypeEnum); + List socialUsers = this.getAllSocialUserList(type, unionId, userType); // 逻辑一:如果 userId 之前绑定过该 type 的其它账号,需要进行解绑 - this.unbindOldSocialUser(userId, type, unionId, userTypeEnum); + this.unbindOldSocialUser(userId, userType, type, unionId); // 逻辑二:如果 socialUsers 指定的 userId 改变,需要进行更新 // 例如说,一个微信 unionId 对应了多个社交账号,结果其中有个关联了新的 userId,则其它也要跟着修改 @@ -111,7 +110,7 @@ public class SocialUserServiceImpl implements SocialUserService { .nickname(authUser.getNickname()).avatar(authUser.getAvatar()).rawUserInfo(toJsonString(authUser.getRawUserInfo())) .build(); if (socialUser == null) { - saveSocialUser.setUserId(userId).setUserType(userTypeEnum.getValue()) + saveSocialUser.setUserId(userId).setUserType(userType) .setType(type).setOpenid(authUser.getUuid()).setUnionId(unionId); socialUserMapper.insert(saveSocialUser); } else { @@ -121,16 +120,16 @@ public class SocialUserServiceImpl implements SocialUserService { } @Override - public void unbindSocialUser(Long userId, Integer type, String unionId, UserTypeEnum userTypeEnum) { + public void unbindSocialUser(Long userId, Integer userType, Integer type, String unionId) { // 获得 unionId 对应的所有 SysSocialUserDO 社交用户 - List socialUsers = this.getAllSocialUserList(type, unionId, userTypeEnum); + List socialUsers = this.getAllSocialUserList(type, unionId, userType); if (CollUtil.isEmpty(socialUsers)) { return; } // 校验,是否解绑的是非自己的 socialUsers.forEach(socialUser -> { if (!Objects.equals(socialUser.getUserId(), userId)) { - throw exception(SOCIAL_UNBIND_NOT_SELF); + throw exception(SOCIAL_USER_UNBIND_NOT_SELF); } }); @@ -139,10 +138,9 @@ public class SocialUserServiceImpl implements SocialUserService { } @VisibleForTesting - public void unbindOldSocialUser(Long userId, Integer type, String newUnionId, UserTypeEnum userTypeEnum) { + public void unbindOldSocialUser(Long userId, Integer userType, Integer type, String newUnionId) { List types = SocialTypeEnum.getRelationTypes(type); - List oldSocialUsers = socialUserMapper.selectListByTypeAndUserId( - userTypeEnum.getValue(), types, userId); + List oldSocialUsers = socialUserMapper.selectListByTypeAndUserId(userType, types, userId); // 如果新老的 unionId 是一致的,说明无需解绑 if (CollUtil.isEmpty(oldSocialUsers) || Objects.equals(newUnionId, oldSocialUsers.get(0).getUnionId())) { return; @@ -165,7 +163,7 @@ public class SocialUserServiceImpl implements SocialUserService { log.info("[getAuthUser0][请求社交平台 type({}) request({}) response({})]", type, toJsonString(authCallback), toJsonString(authResponse)); if (!authResponse.ok()) { - throw exception(SOCIAL_AUTH_FAILURE, authResponse.getMsg()); + throw exception(SOCIAL_USER_AUTH_FAILURE, authResponse.getMsg()); } return (AuthUser) authResponse.getData(); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java similarity index 83% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java index f4e9c63dfd..68dd3bb572 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfi import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import java.io.InputStream; import java.util.*; @@ -16,7 +16,7 @@ import java.util.*; * * @author 芋道源码 */ -public interface UserService { +public interface AdminUserService { /** * 创建用户 @@ -94,7 +94,7 @@ public interface UserService { * @param username 用户名 * @return 用户对象信息 */ - UserDO getUserByUsername(String username); + AdminUserDO getUserByUsername(String username); /** * 获得用户分页列表 @@ -102,7 +102,7 @@ public interface UserService { * @param reqVO 分页条件 * @return 分页列表 */ - PageResult getUserPage(UserPageReqVO reqVO); + PageResult getUserPage(UserPageReqVO reqVO); /** * 通过用户 ID 查询用户 @@ -110,7 +110,7 @@ public interface UserService { * @param id 用户ID * @return 用户对象信息 */ - UserDO getUser(Long id); + AdminUserDO getUser(Long id); /** * 获得指定部门的用户数组 @@ -118,7 +118,7 @@ public interface UserService { * @param deptIds 部门数组 * @return 用户数组 */ - List getUsersByDeptIds(Collection deptIds); + List getUsersByDeptIds(Collection deptIds); /** * 获得指定岗位的用户数组 @@ -126,7 +126,7 @@ public interface UserService { * @param postIds 岗位数组 * @return 用户数组 */ - List getUsersByPostIds(Collection postIds); + List getUsersByPostIds(Collection postIds); /** * 获得用户列表 @@ -134,7 +134,7 @@ public interface UserService { * @param ids 用户编号数组 * @return 用户列表 */ - List getUsers(Collection ids); + List getUsers(Collection ids); /** * 校验用户们是否有效。如下情况,视为无效: @@ -151,11 +151,11 @@ public interface UserService { * @param ids 用户编号数组 * @return 用户 Map */ - default Map getUserMap(Collection ids) { + default Map getUserMap(Collection ids) { if (CollUtil.isEmpty(ids)) { return new HashMap<>(); } - return CollectionUtils.convertMap(getUsers(ids), UserDO::getId); + return CollectionUtils.convertMap(getUsers(ids), AdminUserDO::getId); } /** @@ -164,7 +164,7 @@ public interface UserService { * @param reqVO 列表请求 * @return 用户列表 */ - List getUsers(UserExportReqVO reqVO); + List getUsers(UserExportReqVO reqVO); /** * 获得用户列表,基于昵称模糊匹配 @@ -172,7 +172,7 @@ public interface UserService { * @param nickname 昵称 * @return 用户列表 */ - List getUsersByNickname(String nickname); + List getUsersByNickname(String nickname); /** * 获得用户列表,基于用户账号模糊匹配 @@ -180,7 +180,7 @@ public interface UserService { * @param username 用户账号 * @return 用户列表 */ - List getUsersByUsername(String username); + List getUsersByUsername(String username); /** * 批量导入用户 @@ -197,6 +197,6 @@ public interface UserService { * @param status 状态 * @return 用户们 */ - List getUsersByStatus(Integer status); + List getUsersByStatus(Integer status); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java similarity index 76% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 1530d3bca4..25c413e126 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/UserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -14,12 +14,10 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfi import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.module.system.convert.user.UserConvert; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.system.dal.mysql.user.UserMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; @@ -34,29 +32,24 @@ import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.USER_IS_DISABLE; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.USER_NOT_EXISTS; /** - * 管理员用户 Service 实现类 + * 后台用户 Service 实现类 * * @author 芋道源码 */ @Service("adminUserService") @Slf4j -public class UserServiceImpl implements UserService { +public class AdminUserServiceImpl implements AdminUserService { @Value("${sys.user.init-password:yudaoyuanma}") private String userInitPassword; - @Resource(name = "sysUserMapper") // userMapper 存在重名 - private UserMapper userMapper; + @Resource + private AdminUserMapper userMapper; @Resource private DeptService deptService; - - @Resource - private SysDeptCoreService deptCoreService; @Resource private PostService postService; @Resource @@ -72,7 +65,7 @@ public class UserServiceImpl implements UserService { this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), reqVO.getDeptId(), reqVO.getPostIds()); // 插入用户 - UserDO user = UserConvert.INSTANCE.convert(reqVO); + AdminUserDO user = UserConvert.INSTANCE.convert(reqVO); user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 user.setPassword(passwordEncoder.encode(reqVO.getPassword())); // 加密密码 userMapper.insert(user); @@ -85,13 +78,13 @@ public class UserServiceImpl implements UserService { this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), reqVO.getDeptId(), reqVO.getPostIds()); // 更新用户 - UserDO updateObj = UserConvert.INSTANCE.convert(reqVO); + AdminUserDO updateObj = UserConvert.INSTANCE.convert(reqVO); userMapper.updateById(updateObj); } @Override public void updateUserLogin(Long id, String loginIp) { - userMapper.updateById(new UserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date())); + userMapper.updateById(new AdminUserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date())); } @Override @@ -109,7 +102,7 @@ public class UserServiceImpl implements UserService { // 校验旧密码密码 this.checkOldPassword(id, reqVO.getOldPassword()); // 执行更新 - UserDO updateObj = new UserDO().setId(id); + AdminUserDO updateObj = new AdminUserDO().setId(id); updateObj.setPassword(passwordEncoder.encode(reqVO.getNewPassword())); // 加密密码 userMapper.updateById(updateObj); } @@ -120,7 +113,7 @@ public class UserServiceImpl implements UserService { // 存储文件 String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); // 更新路径 - UserDO sysUserDO = new UserDO(); + AdminUserDO sysUserDO = new AdminUserDO(); sysUserDO.setId(id); sysUserDO.setAvatar(avatar); userMapper.updateById(sysUserDO); @@ -132,7 +125,7 @@ public class UserServiceImpl implements UserService { // 校验用户存在 this.checkUserExists(id); // 更新密码 - UserDO updateObj = new UserDO(); + AdminUserDO updateObj = new AdminUserDO(); updateObj.setId(id); updateObj.setPassword(passwordEncoder.encode(password)); // 加密密码 userMapper.updateById(updateObj); @@ -143,7 +136,7 @@ public class UserServiceImpl implements UserService { // 校验用户存在 this.checkUserExists(id); // 更新状态 - UserDO updateObj = new UserDO(); + AdminUserDO updateObj = new AdminUserDO(); updateObj.setId(id); updateObj.setStatus(status); userMapper.updateById(updateObj); @@ -160,22 +153,22 @@ public class UserServiceImpl implements UserService { } @Override - public UserDO getUserByUsername(String username) { + public AdminUserDO getUserByUsername(String username) { return userMapper.selectByUsername(username); } @Override - public PageResult getUserPage(UserPageReqVO reqVO) { + public PageResult getUserPage(UserPageReqVO reqVO) { return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId())); } @Override - public UserDO getUser(Long id) { + public AdminUserDO getUser(Long id) { return userMapper.selectById(id); } @Override - public List getUsersByDeptIds(Collection deptIds) { + public List getUsersByDeptIds(Collection deptIds) { if (CollUtil.isEmpty(deptIds)) { return Collections.emptyList(); } @@ -183,19 +176,19 @@ public class UserServiceImpl implements UserService { } @Override - public List getUsersByPostIds(Collection postIds) { + public List getUsersByPostIds(Collection postIds) { if (CollUtil.isEmpty(postIds)) { return Collections.emptyList(); } // 过滤不符合条件的 // TODO 芋艿:暂时只能内存过滤。解决方案:1、新建一个关联表;2、基于 where + 函数;3、json 字段,适合 mysql 8+ 版本 - List users = userMapper.selectList(); + List users = userMapper.selectList(); users.removeIf(user -> !CollUtil.containsAny(user.getPostIds(), postIds)); return users; } @Override - public List getUsers(Collection ids) { + public List getUsers(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } @@ -208,11 +201,11 @@ public class UserServiceImpl implements UserService { return; } // 获得岗位信息 - List users = userMapper.selectBatchIds(ids); - Map userMap = CollectionUtils.convertMap(users, UserDO::getId); + List users = userMapper.selectBatchIds(ids); + Map userMap = CollectionUtils.convertMap(users, AdminUserDO::getId); // 校验 ids.forEach(id -> { - UserDO user = userMap.get(id); + AdminUserDO user = userMap.get(id); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -223,17 +216,17 @@ public class UserServiceImpl implements UserService { } @Override - public List getUsers(UserExportReqVO reqVO) { + public List getUsers(UserExportReqVO reqVO) { return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); } @Override - public List getUsersByNickname(String nickname) { + public List getUsersByNickname(String nickname) { return userMapper.selectListByNickname(nickname); } @Override - public List getUsersByUsername(String username) { + public List getUsersByUsername(String username) { return userMapper.selectListByUsername(username); } @@ -264,9 +257,9 @@ public class UserServiceImpl implements UserService { // 校验邮箱唯一 this.checkEmailUnique(id, email); // 校验部门处于开启状态 - this.checkDeptEnable(deptId); + deptService.validDepts(Collections.singleton(deptId)); // 校验岗位处于开启状态 - this.checkPostEnable(postIds); + postService.validPosts(postIds); } @VisibleForTesting @@ -274,7 +267,7 @@ public class UserServiceImpl implements UserService { if (id == null) { return; } - UserDO user = userMapper.selectById(id); + AdminUserDO user = userMapper.selectById(id); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -285,7 +278,7 @@ public class UserServiceImpl implements UserService { if (StrUtil.isBlank(username)) { return; } - UserDO user = userMapper.selectByUsername(username); + AdminUserDO user = userMapper.selectByUsername(username); if (user == null) { return; } @@ -303,7 +296,7 @@ public class UserServiceImpl implements UserService { if (StrUtil.isBlank(email)) { return; } - UserDO user = userMapper.selectByEmail(email); + AdminUserDO user = userMapper.selectByEmail(email); if (user == null) { return; } @@ -321,7 +314,7 @@ public class UserServiceImpl implements UserService { if (StrUtil.isBlank(mobile)) { return; } - UserDO user = userMapper.selectByMobile(mobile); + AdminUserDO user = userMapper.selectByMobile(mobile); if (user == null) { return; } @@ -334,41 +327,6 @@ public class UserServiceImpl implements UserService { } } - @VisibleForTesting - public void checkDeptEnable(Long deptId) { - if (deptId == null) { // 允许不选择 - return; - } - SysDeptDO dept = deptCoreService.getDept(deptId); - if (dept == null) { - throw exception(DEPT_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { - throw exception(DEPT_NOT_ENABLE); - } - } - - @VisibleForTesting - public void checkPostEnable(Set postIds) { - if (CollUtil.isEmpty(postIds)) { // 允许不选择 - return; - } - List posts = postService.getPosts(postIds, null); - if (CollUtil.isEmpty(posts)) { - throw exception(POST_NOT_FOUND); - } - Map postMap = CollectionUtils.convertMap(posts, SysPostDO::getId); - postIds.forEach(postId -> { - SysPostDO post = postMap.get(postId); - if (post == null) { - throw exception(POST_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { - throw exception(POST_NOT_ENABLE, post.getName()); - } - }); - } - /** * 校验旧密码 * @@ -377,7 +335,7 @@ public class UserServiceImpl implements UserService { */ @VisibleForTesting public void checkOldPassword(Long id, String oldPassword) { - UserDO user = userMapper.selectById(id); + AdminUserDO user = userMapper.selectById(id); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -404,7 +362,7 @@ public class UserServiceImpl implements UserService { return; } // 判断如果不存在,在进行插入 - UserDO existUser = userMapper.selectByUsername(importUser.getUsername()); + AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); if (existUser == null) { userMapper.insert(UserConvert.INSTANCE.convert(importUser) .setPassword(passwordEncoder.encode(userInitPassword))); // 设置默认密码 @@ -416,7 +374,7 @@ public class UserServiceImpl implements UserService { respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg()); return; } - UserDO updateUser = UserConvert.INSTANCE.convert(importUser); + AdminUserDO updateUser = UserConvert.INSTANCE.convert(importUser); updateUser.setId(existUser.getId()); userMapper.updateById(updateUser); respVO.getUpdateUsernames().add(importUser.getUsername()); @@ -425,7 +383,7 @@ public class UserServiceImpl implements UserService { } @Override - public List getUsersByStatus(Integer status) { + public List getUsersByStatus(Integer status) { return userMapper.selectListByStatus(status); } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java index 1ad03c06ef..9869cee2c6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java @@ -1,14 +1,14 @@ package cn.iocoder.yudao.module.system.service.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthLoginReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import cn.iocoder.yudao.module.system.service.common.CaptchaService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; -import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.service.social.SocialUserService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; @@ -37,14 +37,14 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -@Import(AuthServiceImpl.class) +@Import(AdminAuthServiceImpl.class) public class AuthServiceImplTest extends BaseDbUnitTest { @Resource - private AuthServiceImpl authService; + private AdminAuthServiceImpl authService; @MockBean - private UserService userService; + private AdminUserService userService; @MockBean private PermissionService permissionService; @MockBean @@ -72,7 +72,7 @@ public class AuthServiceImplTest extends BaseDbUnitTest { // 准备参数 String username = randomString(); // mock 方法 - UserDO user = randomPojo(UserDO.class, o -> o.setUsername(username)); + AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setUsername(username)); when(userService.getUserByUsername(eq(username))).thenReturn(user); // 调用 @@ -98,7 +98,7 @@ public class AuthServiceImplTest extends BaseDbUnitTest { // 准备参数 Long userId = randomLongId(); // mock 方法 01 - UserDO user = randomPojo(UserDO.class, o -> o.setId(userId)); + AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setId(userId)); when(userService.getUser(eq(userId))).thenReturn(user); // mock 方法 02 Set roleIds = randomSet(Long.class); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java index 4ca9127212..33b2a3b788 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java @@ -4,11 +4,11 @@ import cn.hutool.core.date.DateUtil; import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; import cn.iocoder.yudao.module.system.service.logger.LoginLogService; -import cn.iocoder.yudao.module.system.service.user.UserService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; import cn.iocoder.yudao.module.system.dal.redis.auth.LoginUserRedisDAO; import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -52,7 +52,7 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { private SysUserSessionMapper userSessionMapper; @MockBean - private UserService userService; + private AdminUserService userService; @MockBean private LoginLogService loginLogService; @MockBean @@ -64,7 +64,7 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { @Test public void testGetUserSessionPage_success() { // mock 数据 - UserDO dbUser = randomPojo(UserDO.class, o -> { + AdminUserDO dbUser = randomPojo(AdminUserDO.class, o -> { o.setSex(randomEle(SysSexEnum.values()).getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java index fdaf676da2..b17ad14047 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java @@ -8,13 +8,11 @@ import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; import cn.iocoder.yudao.module.system.dal.mysql.logger.LoginLogMapper; -import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.yudao.module.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.yudao.module.system.service.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; +import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -41,20 +39,20 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { // 构造测试数据 // 登录成功的 SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { - logDO.setLogType(RandomUtil.randomEle(LoginLogTypeEnum.values()).getType()); + logDO.setLogType(RandomUtil.randomEle(cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum.values()).getType()); logDO.setTraceId(TracerUtils.getTraceId()); logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()); logDO.setUserIp("192.168.199.16"); logDO.setUsername("wangkai"); logDO.setCreateTime(buildTime(2021, 3, 6)); - logDO.setResult(LoginResultEnum.SUCCESS.getResult()); + logDO.setResult(cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum.SUCCESS.getResult()); }); loginLogMapper.insert(loginLogDO); // 下面几个都是不匹配的数据 // 登录失败的 - loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(LoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); // 不同ip段的 loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); // 不同username @@ -86,20 +84,20 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { // 登录成功的 SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { - logDO.setLogType(RandomUtil.randomEle(LoginLogTypeEnum.values()).getType()); + logDO.setLogType(RandomUtil.randomEle(cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum.values()).getType()); logDO.setTraceId(TracerUtils.getTraceId()); logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()); logDO.setUserIp("192.168.111.16"); logDO.setUsername("wangxiaokai"); logDO.setCreateTime(buildTime(2021, 3, 6)); - logDO.setResult(LoginResultEnum.SUCCESS.getResult()); + logDO.setResult(cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum.SUCCESS.getResult()); }); loginLogMapper.insert(loginLogDO); // 下面几个都是不匹配的数据 // 登录失败的 - loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(LoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); // 不同ip段的 loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); // 不同username @@ -130,8 +128,8 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { LoginLogCreateReqDTO reqDTO = RandomUtils.randomPojo(LoginLogCreateReqDTO.class, vo -> { // 指定随机的范围,避免超出范围入库失败 vo.setUserType(randomEle(UserTypeEnum.values()).getValue()); - vo.setLogType(randomEle(SysLoginLogTypeEnum.values()).getType()); - vo.setResult(randomEle(SysLoginResultEnum.values()).getResult()); + vo.setLogType(randomEle(LoginLogTypeEnum.values()).getType()); + vo.setResult(randomEle(LoginResultEnum.values()).getResult()); vo.setTraceId(TracerUtils.getTraceId()); }); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java index 2c9c2369ad..feebc7145b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java @@ -4,9 +4,9 @@ import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; -import cn.iocoder.yudao.module.system.service.user.UserService; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; @@ -43,7 +43,7 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { private OperateLogMapper operateLogMapper; @MockBean - private UserService userService; + private AdminUserService userService; @Test public void testCreateOperateLogAsync() throws InterruptedException, ExecutionException { @@ -66,7 +66,7 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { public void testGetOperateLogPage() { // 构造测试数据 // 先构造用户 - UserDO user = RandomUtils.randomPojo(UserDO.class, o -> { + AdminUserDO user = RandomUtils.randomPojo(AdminUserDO.class, o -> { o.setNickname("wangkai"); o.setSex(SysSexEnum.MALE.getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -117,7 +117,7 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { public void testGetOperateLogs() { // 构造测试数据 // 先构造用户 - UserDO user = RandomUtils.randomPojo(UserDO.class, o -> { + AdminUserDO user = RandomUtils.randomPojo(AdminUserDO.class, o -> { o.setNickname("wangkai"); o.setSex(SysSexEnum.MALE.getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java index 5b2b343830..5c777eda7d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuCr import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysMenuMapper; +import cn.iocoder.yudao.module.system.dal.mysql.permission.MenuMapper; import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum; import cn.iocoder.yudao.module.system.mq.producer.permission.MenuProducer; import cn.iocoder.yudao.framework.common.util.spring.SpringAopUtils; @@ -41,7 +41,7 @@ public class MenuServiceTest extends BaseDbUnitTest { private MenuProducer sysMenuProducer; @Resource - private SysMenuMapper menuMapper; + private MenuMapper menuMapper; @Test public void testInitLocalCache_success() throws Exception { diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java index 9ff7d5d4cd..dc915e3079 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMenuMapper; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysUserRoleMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper; +import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper; import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; @@ -37,9 +37,9 @@ public class PermissionServiceTest extends BaseDbUnitTest { private PermissionServiceImpl permissionService; @Resource - private SysRoleMenuMapper roleMenuMapper; + private RoleMenuMapper roleMenuMapper; @Resource - private SysUserRoleMapper userRoleMapper; + private UserRoleMapper userRoleMapper; @MockBean private RoleService roleService; @@ -56,9 +56,9 @@ public class PermissionServiceTest extends BaseDbUnitTest { // 准备参数 Long roleId = randomLongId(); // mock 数据 UserRole - SysUserRoleDO userRoleDO01 = randomPojo(SysUserRoleDO.class, o -> o.setRoleId(roleId)); // 被删除 + UserRoleDO userRoleDO01 = randomPojo(UserRoleDO.class, o -> o.setRoleId(roleId)); // 被删除 userRoleMapper.insert(userRoleDO01); - SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除 + UserRoleDO userRoleDO02 = randomPojo(UserRoleDO.class); // 不被删除 userRoleMapper.insert(userRoleDO02); // mock 数据 RoleMenu RoleMenuDO roleMenuDO01 = randomPojo(RoleMenuDO.class, o -> o.setRoleId(roleId)); // 被删除 @@ -73,7 +73,7 @@ public class PermissionServiceTest extends BaseDbUnitTest { assertEquals(1, dbRoleMenus.size()); assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); // 断言数据 UserRoleDO - List dbUserRoles = userRoleMapper.selectList(); + List dbUserRoles = userRoleMapper.selectList(); assertEquals(1, dbUserRoles.size()); assertPojoEquals(dbUserRoles.get(0), userRoleDO02); // 断言调用 @@ -105,15 +105,15 @@ public class PermissionServiceTest extends BaseDbUnitTest { // 准备参数 Long userId = randomLongId(); // mock 数据 - SysUserRoleDO userRoleDO01 = randomPojo(SysUserRoleDO.class, o -> o.setUserId(userId)); // 被删除 + UserRoleDO userRoleDO01 = randomPojo(UserRoleDO.class, o -> o.setUserId(userId)); // 被删除 userRoleMapper.insert(userRoleDO01); - SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除 + UserRoleDO userRoleDO02 = randomPojo(UserRoleDO.class); // 不被删除 userRoleMapper.insert(userRoleDO02); // 调用 permissionService.processUserDeleted(userId); // 断言数据 - List dbUserRoles = userRoleMapper.selectList(); + List dbUserRoles = userRoleMapper.selectList(); assertEquals(1, dbUserRoles.size()); assertPojoEquals(dbUserRoles.get(0), userRoleDO02); } @@ -137,7 +137,7 @@ public class PermissionServiceTest extends BaseDbUnitTest { // 准备参数 LoginUser loginUser = randomPojo(LoginUser.class); // mock 方法 - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.ALL.getScope())); + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.ALL.getScope())); when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO)); // 调用 @@ -154,7 +154,7 @@ public class PermissionServiceTest extends BaseDbUnitTest { // 准备参数 LoginUser loginUser = randomPojo(LoginUser.class); // mock 方法 - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_CUSTOM.getScope())); + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_CUSTOM.getScope())); when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO)); // 调用 @@ -173,7 +173,7 @@ public class PermissionServiceTest extends BaseDbUnitTest { // 准备参数 LoginUser loginUser = randomPojo(LoginUser.class); // mock 方法 - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_ONLY.getScope())); + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_ONLY.getScope())); when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO)); // 调用 @@ -191,7 +191,7 @@ public class PermissionServiceTest extends BaseDbUnitTest { // 准备参数 LoginUser loginUser = randomPojo(LoginUser.class); // mock 方法(角色) - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_AND_CHILD.getScope())); + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_AND_CHILD.getScope())); when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO)); // mock 方法(部门) SysDeptDO deptDO = randomPojo(SysDeptDO.class); @@ -213,7 +213,7 @@ public class PermissionServiceTest extends BaseDbUnitTest { // 准备参数 LoginUser loginUser = randomPojo(LoginUser.class); // mock 方法 - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.SELF.getScope())); + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.SELF.getScope())); when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO)); // 调用 diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java index 5c8475dfd6..e607cd7251 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceTest.java @@ -7,8 +7,8 @@ import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.yudao.module.system.dal.mysql.permission.SysRoleMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMapper; import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; import cn.iocoder.yudao.module.system.mq.producer.permission.RoleProducer; import cn.iocoder.yudao.framework.common.util.spring.SpringAopUtils; @@ -36,7 +36,7 @@ public class RoleServiceTest extends BaseDbUnitTest { private RoleServiceImpl sysRoleService; @Resource - private SysRoleMapper roleMapper; + private RoleMapper roleMapper; @MockBean private PermissionService sysPermissionService; @@ -46,9 +46,9 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testInitLocalCache_success() throws Exception { - SysRoleDO roleDO1 = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + RoleDO roleDO1 = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO1); - SysRoleDO roleDO2 = createRoleDO("role2", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + RoleDO roleDO2 = createRoleDO("role2", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO2); //调用 @@ -58,7 +58,7 @@ public class RoleServiceTest extends BaseDbUnitTest { //获取代理对象 RoleServiceImpl target = (RoleServiceImpl) SpringAopUtils.getTarget(sysRoleService); - Map roleCache = (Map) BeanUtil.getFieldValue(target, "roleCache"); + Map roleCache = (Map) BeanUtil.getFieldValue(target, "roleCache"); assertPojoEquals(roleDO1, roleCache.get(roleDO1.getId())); assertPojoEquals(roleDO2, roleCache.get(roleDO2.getId())); @@ -79,7 +79,7 @@ public class RoleServiceTest extends BaseDbUnitTest { //断言 assertNotNull(roleId); - SysRoleDO roleDO = roleMapper.selectById(roleId); + RoleDO roleDO = roleMapper.selectById(roleId); assertPojoEquals(reqVO, roleDO); verify(sysRoleProducer).sendRoleRefreshMessage(); @@ -87,7 +87,7 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testUpdateRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -102,7 +102,7 @@ public class RoleServiceTest extends BaseDbUnitTest { sysRoleService.updateRole(reqVO); //断言 - SysRoleDO newRoleDO = roleMapper.selectById(roleId); + RoleDO newRoleDO = roleMapper.selectById(roleId); assertPojoEquals(reqVO, newRoleDO); verify(sysRoleProducer).sendRoleRefreshMessage(); @@ -110,7 +110,7 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testUpdateRoleStatus_success() { - SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, CommonStatusEnum.ENABLE.getStatus()); + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, CommonStatusEnum.ENABLE.getStatus()); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -118,7 +118,7 @@ public class RoleServiceTest extends BaseDbUnitTest { sysRoleService.updateRoleStatus(roleId, CommonStatusEnum.DISABLE.getStatus()); //断言 - SysRoleDO newRoleDO = roleMapper.selectById(roleId); + RoleDO newRoleDO = roleMapper.selectById(roleId); assertEquals(CommonStatusEnum.DISABLE.getStatus(), newRoleDO.getStatus()); verify(sysRoleProducer).sendRoleRefreshMessage(); @@ -126,7 +126,7 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testUpdateRoleDataScope_success() { - SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -135,7 +135,7 @@ public class RoleServiceTest extends BaseDbUnitTest { sysRoleService.updateRoleDataScope(roleId, DataScopeEnum.DEPT_CUSTOM.getScope(), deptIdSet); //断言 - SysRoleDO newRoleDO = roleMapper.selectById(roleId); + RoleDO newRoleDO = roleMapper.selectById(roleId); assertEquals(DataScopeEnum.DEPT_CUSTOM.getScope(), newRoleDO.getDataScope()); Set newDeptIdSet = newRoleDO.getDataScopeDeptIds(); @@ -147,7 +147,7 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testDeleteRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -155,7 +155,7 @@ public class RoleServiceTest extends BaseDbUnitTest { sysRoleService.deleteRole(roleId); //断言 - SysRoleDO newRoleDO = roleMapper.selectById(roleId); + RoleDO newRoleDO = roleMapper.selectById(roleId); assertNull(newRoleDO); verify(sysRoleProducer).sendRoleRefreshMessage(); @@ -163,22 +163,22 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testGetRoles_success() { - Map idRoleMap = new HashMap<>(); + Map idRoleMap = new HashMap<>(); // 验证查询状态为1的角色 - SysRoleDO roleDO1 = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); + RoleDO roleDO1 = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); roleMapper.insert(roleDO1); idRoleMap.put(roleDO1.getId(), roleDO1); - SysRoleDO roleDO2 = createRoleDO("role2", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); + RoleDO roleDO2 = createRoleDO("role2", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); roleMapper.insert(roleDO2); idRoleMap.put(roleDO2.getId(), roleDO2); // 以下是排除的角色 - SysRoleDO roleDO3 = createRoleDO("role3", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2); + RoleDO roleDO3 = createRoleDO("role3", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2); roleMapper.insert(roleDO3); //调用 - List roles = sysRoleService.getRoles(Arrays.asList(1)); + List roles = sysRoleService.getRoles(Arrays.asList(1)); //断言 assertEquals(2, roles.size()); @@ -188,10 +188,10 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testGetRolePage_success() { - Map idRoleMap = new HashMap<>(); + Map idRoleMap = new HashMap<>(); // 验证名称包含"role", 状态为1,code为"code"的角色 // 第一页 - SysRoleDO roleDO = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); + RoleDO roleDO = createRoleDO("role1", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); roleMapper.insert(roleDO); idRoleMap.put(roleDO.getId(), roleDO); // 第二页 @@ -214,7 +214,7 @@ public class RoleServiceTest extends BaseDbUnitTest { o.setBeginTime(null); o.setEndTime(null); }); - PageResult result = sysRoleService.getRolePage(reqVO); + PageResult result = sysRoleService.getRolePage(reqVO); assertEquals(2, result.getTotal()); result.getList().stream().forEach(r -> assertPojoEquals(idRoleMap.get(r.getId()), r)); } @@ -226,7 +226,7 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testCheckDuplicateRole_nameDuplicate() { - SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); String duplicateName = "role_name"; @@ -236,7 +236,7 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testCheckDuplicateRole_codeDuplicate() { - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> { + RoleDO roleDO = randomPojo(RoleDO.class, o -> { o.setName("role_999"); o.setCode("code"); o.setType(RoleTypeEnum.CUSTOM.getType()); @@ -253,7 +253,7 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testCheckUpdateRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); @@ -267,27 +267,27 @@ public class RoleServiceTest extends BaseDbUnitTest { @Test public void testCheckUpdateRole_systemRoleCanNotBeUpdate() { - SysRoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.SYSTEM, DataScopeEnum.ALL); + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.SYSTEM, DataScopeEnum.ALL); roleMapper.insert(roleDO); Long roleId = roleDO.getId(); assertServiceException(() -> sysRoleService.checkUpdateRole(roleId), ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); } - private SysRoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status) { + private RoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status) { return createRoleDO( name, typeEnum, scopeEnum, status, randomString()); } - private SysRoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { + private RoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { return createRoleDO(null, name, typeEnum, scopeEnum, status, code); } - private SysRoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum) { + private RoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum) { return createRoleDO(null, name, typeEnum, scopeEnum, randomCommonStatus(), randomString()); } - private SysRoleDO createRoleDO(Long id, String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> { + private RoleDO createRoleDO(Long id, String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { + RoleDO roleDO = randomPojo(RoleDO.class, o -> { o.setId(id); o.setName(name); o.setType(typeEnum.getType()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java index 1233b2a76d..d255cbf742 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java @@ -4,7 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsChannelMapper; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -39,7 +39,7 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { private SmsChannelServiceImpl smsChannelService; @Resource - private SysSmsChannelMapper smsChannelMapper; + private SmsChannelMapper smsChannelMapper; @MockBean private SmsClientFactory smsClientFactory; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java index e06b9b0f4f..7b0b0918f5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsLogMapper; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsLogMapper; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.module.system.enums.sms.SysSmsReceiveStatusEnum; import cn.iocoder.yudao.module.system.enums.sms.SysSmsSendStatusEnum; @@ -39,7 +39,7 @@ public class SmsLogServiceTest extends BaseDbUnitTest { private SmsLogServiceImpl smsLogService; @Resource - private SysSmsLogMapper smsLogMapper; + private SmsLogMapper smsLogMapper; @Test public void testGetSmsLogPage() { diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java index bd1ca2c58d..3025b8d642 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.mysql.sms.SysSmsTemplateMapper; +import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsTemplateMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; @@ -49,7 +49,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { private SmsTemplateServiceImpl smsTemplateService; @Resource - private SysSmsTemplateMapper smsTemplateMapper; + private SmsTemplateMapper smsTemplateMapper; @MockBean private SmsChannelService smsChannelService; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java index 8cbe9b34ec..0bd82475ff 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java @@ -23,9 +23,9 @@ import java.util.List; import java.util.Map; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; @@ -33,7 +33,7 @@ import static org.mockito.Mockito.*; public class SysSmsSendServiceTest extends BaseMockitoUnitTest { @InjectMocks - private SysSmsSendServiceImpl smsService; + private SmsSendServiceImpl smsService; @Mock private SmsTemplateService smsTemplateService; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUsererviceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceTest.java similarity index 91% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUsererviceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceTest.java index dc6d3a2d04..a67da17f2f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUsererviceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceTest.java @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.assertEquals; @Import({SocialUserServiceImpl.class, SocialAuthUserRedisDAO.class}) -public class SocialUsererviceTest extends BaseDbAndRedisUnitTest { +public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { @Resource private SocialUserServiceImpl socialService; @@ -47,7 +47,7 @@ public class SocialUsererviceTest extends BaseDbAndRedisUnitTest { // mock 方法 // 调用 - socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN); + socialService.bindSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, authUser); // 断言 List socialUsers = socialUserMapper.selectList("user_id", userId); assertEquals(1, socialUsers.size()); @@ -72,7 +72,7 @@ public class SocialUsererviceTest extends BaseDbAndRedisUnitTest { // mock 方法 // 调用 - socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN); + socialService.bindSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, authUser); // 断言 List socialUsers = socialUserMapper.selectList("user_id", userId); assertEquals(1, socialUsers.size()); @@ -97,7 +97,7 @@ public class SocialUsererviceTest extends BaseDbAndRedisUnitTest { // mock 方法 // 调用 - socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN); + socialService.bindSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, authUser); // 断言 List socialUsers = socialUserMapper.selectList("user_id", userId); assertEquals(1, socialUsers.size()); @@ -134,7 +134,7 @@ public class SocialUsererviceTest extends BaseDbAndRedisUnitTest { String newUnionId = oldSocialUser.getUnionId(); // 调用 - socialService.unbindOldSocialUser(userId, type, newUnionId, UserTypeEnum.ADMIN); + socialService.unbindOldSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, newUnionId); // 断言 assertEquals(1L, socialUserMapper.selectCount(null).longValue()); } @@ -157,7 +157,7 @@ public class SocialUsererviceTest extends BaseDbAndRedisUnitTest { String newUnionId = randomString(10); // 调用 - socialService.unbindOldSocialUser(userId, type, newUnionId, UserTypeEnum.ADMIN); + socialService.unbindOldSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, newUnionId); // 断言 assertEquals(0L, socialUserMapper.selectCount(null).longValue()); } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java index 0667193f99..c96f9c44c8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java @@ -1,25 +1,23 @@ package cn.iocoder.yudao.module.system.service.user; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.dal.mysql.user.UserMapper; -import cn.iocoder.yudao.module.system.service.dept.DeptService; -import cn.iocoder.yudao.module.system.service.dept.PostService; -import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; -import cn.iocoder.yudao.module.system.dal.dataobject.user.UserDO; -import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; +import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.dept.PostService; +import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; @@ -29,36 +27,34 @@ import org.springframework.security.crypto.password.PasswordEncoder; import javax.annotation.Resource; import java.io.ByteArrayInputStream; -import java.util.*; +import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomBytes; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static org.assertj.core.util.Lists.newArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -@Import(UserServiceImpl.class) +@Import(AdminUserServiceImpl.class) public class UserServiceImplTest extends BaseDbUnitTest { @Resource - private UserServiceImpl userService; + private AdminUserServiceImpl userService; @Resource - private UserMapper userMapper; + private AdminUserMapper userMapper; @MockBean private DeptService deptService; - @MockBean - private SysDeptCoreService deptCoreService; @MockBean private PostService postService; @MockBean @@ -80,7 +76,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { o.setId(reqVO.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); // mock postService 的方法 List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> randomPojo(SysPostDO.class, o -> { @@ -94,7 +90,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 Long userId = userService.createUser(reqVO); // 断言 - UserDO user = userMapper.selectById(userId); + AdminUserDO user = userMapper.selectById(userId); assertPojoEquals(reqVO, user, "password"); assertEquals("yudaoyuanma", user.getPassword()); assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus()); @@ -103,7 +99,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateUser_success() { // mock 数据 - UserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 UserUpdateReqVO reqVO = randomPojo(UserUpdateReqVO.class, o -> { @@ -116,7 +112,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { o.setId(reqVO.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); // mock postService 的方法 List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> randomPojo(SysPostDO.class, o -> { @@ -128,14 +124,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUser(reqVO); // 断言 - UserDO user = userMapper.selectById(reqVO.getId()); + AdminUserDO user = userMapper.selectById(reqVO.getId()); assertPojoEquals(reqVO, user); } @Test public void testUpdateUserProfile_success() { // mock 数据 - UserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -147,14 +143,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserProfile(userId, reqVO); // 断言 - UserDO user = userMapper.selectById(userId); + AdminUserDO user = userMapper.selectById(userId); assertPojoEquals(reqVO, user); } @Test public void testUpdateUserPassword_success() { // mock 数据 - UserDO dbUser = randomSysUserDO(o -> o.setPassword("encode:yudao")); + AdminUserDO dbUser = randomSysUserDO(o -> o.setPassword("encode:yudao")); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -170,14 +166,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserPassword(userId, reqVO); // 断言 - UserDO user = userMapper.selectById(userId); + AdminUserDO user = userMapper.selectById(userId); assertEquals("encode:yuanma", user.getPassword()); } @Test public void testUpdateUserAvatar_success() { // mock 数据 - UserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -190,14 +186,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserAvatar(userId, avatarFile); // 断言 - UserDO user = userMapper.selectById(userId); + AdminUserDO user = userMapper.selectById(userId); assertEquals(avatar, user.getAvatar()); } @Test public void testUpdateUserPassword02_success() { // mock 数据 - UserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -209,14 +205,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserPassword(userId, password); // 断言 - UserDO user = userMapper.selectById(userId); + AdminUserDO user = userMapper.selectById(userId); assertEquals("encode:" + password, user.getPassword()); } @Test public void testUpdateUserStatus() { // mock 数据 - UserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -225,14 +221,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 调用 userService.updateUserStatus(userId, status); // 断言 - UserDO user = userMapper.selectById(userId); + AdminUserDO user = userMapper.selectById(userId); assertEquals(status, user.getStatus()); } @Test public void testDeleteUser_success(){ // mock 数据 - UserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -248,7 +244,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testGetUserPage() { // mock 数据 - UserDO dbUser = initGetUserPageData(); + AdminUserDO dbUser = initGetUserPageData(); // 准备参数 UserPageReqVO reqVO = new UserPageReqVO(); reqVO.setUsername("yudao"); @@ -262,7 +258,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); // 调用 - PageResult pageResult = userService.getUserPage(reqVO); + PageResult pageResult = userService.getUserPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -272,7 +268,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testGetUsers() { // mock 数据 - UserDO dbUser = initGetUserPageData(); + AdminUserDO dbUser = initGetUserPageData(); // 准备参数 UserExportReqVO reqVO = new UserExportReqVO(); reqVO.setUsername("yudao"); @@ -286,7 +282,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); // 调用 - List list = userService.getUsers(reqVO); + List list = userService.getUsers(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbUser, list.get(0)); @@ -295,9 +291,9 @@ public class UserServiceImplTest extends BaseDbUnitTest { /** * 初始化 getUserPage 方法的测试数据 */ - private UserDO initGetUserPageData() { + private AdminUserDO initGetUserPageData() { // mock 数据 - UserDO dbUser = randomSysUserDO(o -> { // 等会查询到 + AdminUserDO dbUser = randomSysUserDO(o -> { // 等会查询到 o.setUsername("yudaoyuanma"); o.setMobile("15601691300"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -351,7 +347,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); // mock passwordEncoder 的方法 when(passwordEncoder.encode(eq("yudaoyuanma"))).thenReturn("java"); @@ -359,7 +355,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); // 断言 assertEquals(1, respVO.getCreateUsernames().size()); - UserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0)); + AdminUserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0)); assertPojoEquals(importUser, user); assertEquals("java", user.getPassword()); assertEquals(0, respVO.getUpdateUsernames().size()); @@ -372,7 +368,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_03() { // mock 数据 - UserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { @@ -385,7 +381,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); // 调用 UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), false); @@ -402,7 +398,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_04() { // mock 数据 - UserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomSysUserDO(); userMapper.insert(dbUser); // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { @@ -415,14 +411,14 @@ public class UserServiceImplTest extends BaseDbUnitTest { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); - when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); // 调用 UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); // 断言 assertEquals(0, respVO.getCreateUsernames().size()); assertEquals(1, respVO.getUpdateUsernames().size()); - UserDO user = userMapper.selectByUsername(respVO.getUpdateUsernames().get(0)); + AdminUserDO user = userMapper.selectByUsername(respVO.getUpdateUsernames().get(0)); assertPojoEquals(importUser, user); assertEquals(0, respVO.getFailureUsernames().size()); } @@ -507,51 +503,6 @@ public class UserServiceImplTest extends BaseDbUnitTest { USER_MOBILE_EXISTS); } - @Test - public void testCheckDeptEnable_notFound() { - assertServiceException(() -> userService.checkDeptEnable(randomLongId()), - DEPT_NOT_FOUND); - } - - @Test - public void testCheckDeptEnable_notEnable() { - // 准备参数 - Long deptId = randomLongId(); - // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { - o.setId(deptId); - o.setStatus(CommonStatusEnum.DISABLE.getStatus()); - }); - when(deptCoreService.getDept(eq(dept.getId()))).thenReturn(dept); - - // 调用,校验异常 - assertServiceException(() -> userService.checkDeptEnable(deptId), - DEPT_NOT_ENABLE); - } - - @Test - public void testCheckPostEnable_notFound() { - assertServiceException(() -> userService.checkPostEnable(randomSet(Long.class)), - POST_NOT_FOUND); - } - - @Test - public void testCheckPostEnable_notEnable() { - // 准备参数 - Set postIds = randomSet(Long.class); - // mock postService 的方法 - List posts = CollectionUtils.convertList(postIds, postId -> - randomPojo(SysPostDO.class, o -> { - o.setId(postId); - o.setStatus(CommonStatusEnum.DISABLE.getStatus()); - })); - when(postService.getPosts(eq(postIds), isNull())).thenReturn(posts); - - // 调用,校验异常 - assertServiceException(() -> userService.checkPostEnable(postIds), - POST_NOT_ENABLE, CollUtil.getFirst(posts).getName()); - } - @Test public void testCheckOldPassword_notExists() { assertServiceException(() -> userService.checkOldPassword(randomLongId(), randomString()), @@ -561,7 +512,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testCheckOldPassword_passwordFailed() { // mock 数据 - UserDO user = randomSysUserDO(); + AdminUserDO user = randomSysUserDO(); userMapper.insert(user); // 准备参数 Long id = user.getId(); @@ -594,12 +545,12 @@ public class UserServiceImplTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static UserDO randomSysUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static AdminUserDO randomSysUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 }; - return randomPojo(UserDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(AdminUserDO.class, ArrayUtils.append(consumer, consumers)); } } From 16c2590483b07ee3c102716d285cef020da2ab1c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 30 Jan 2022 22:27:54 +0800 Subject: [PATCH 15/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=204=EF=BC=9Asystem=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E5=AE=9E=E7=8E=B0=20sms=20API~~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 3 +- yudao-admin-server/pom.xml | 17 ++++---- .../member/convert/auth/AuthConvert.java | 12 ++++-- .../service/auth/MemberAuthServiceImpl.java | 13 +++--- .../service/user/MemberUserServiceImpl.java | 23 ++++------- ...ceTest.java => MemberAuthServiceTest.java} | 23 +++++------ ...st.java => MemberUserServiceImplTest.java} | 21 +++++----- .../module/system/api/sms/SmsCodeApi.java | 40 ++++++++++++++++++ .../api/sms/dto/SmsCodeCheckReqDTO.java | 36 ++++++++++++++++ .../system/api/sms/dto/SmsCodeSendReqDTO.java | 36 ++++++++++++++++ .../system/api/sms/dto/SmsCodeUseReqDTO.java | 41 +++++++++++++++++++ .../module/system/api/sms/SmsCodeApiImpl.java | 39 ++++++++++++++++++ .../system/service/sms/SmsCodeService.java | 26 +++++------- .../service/sms/SmsCodeServiceImpl.java | 23 ++++++----- 14 files changed, 270 insertions(+), 83 deletions(-) rename yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/{SysAuthServiceTest.java => MemberAuthServiceTest.java} (85%) rename yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/{UserServiceImplTest.java => MemberUserServiceImplTest.java} (87%) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeCheckReqDTO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeSendReqDTO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeUseReqDTO.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java diff --git a/pom.xml b/pom.xml index 2512fcdc28..565028205a 100644 --- a/pom.xml +++ b/pom.xml @@ -14,9 +14,8 @@ yudao-user-server yudao-core-service yudao-module-member - yudao-module-bpm + yudao-module-system - yudao-module-system-api ${artifactId} diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 09a39f280e..5fe645e877 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -57,14 +57,15 @@ - - cn.iocoder.boot - yudao-module-bpm-activiti - - - cn.iocoder.boot - yudao-module-bpm-core-service-impl - + + + + + + + + + cn.iocoder.boot diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java index ddb545aa5f..bca6b170b5 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java @@ -2,13 +2,13 @@ package cn.iocoder.yudao.module.member.convert.auth; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialBindReqVO; -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialLogin2ReqVO; -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialLoginReqVO; -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialUnbindReqVO; +import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @@ -31,4 +31,8 @@ public interface AuthConvert { SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialLoginReqVO reqVO); SocialUserUnbindReqDTO convert(Long userId, Integer value, AppAuthSocialUnbindReqVO reqVO); + SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO); + SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp); + SmsCodeUseReqDTO convert(AppAuthSmsLoginReqVO reqVO, Integer scene, String userIp); + } diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java index 6158326c5b..89a24de60f 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java @@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.system.api.auth.UserSessionApi; import cn.iocoder.yudao.module.system.api.logger.LoginLogApi; import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; import cn.iocoder.yudao.module.system.api.social.SocialUserApi; import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; @@ -56,7 +57,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { @Resource private MemberUserService userService; @Resource - private SysSmsCodeService smsCodeService; + private SmsCodeApi smsCodeApi; @Resource private LoginLogApi loginLogApi; @Resource @@ -93,8 +94,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { @Transactional public String smsLogin(AppAuthSmsLoginReqVO reqVO, String userIp, String userAgent) { // 校验验证码 - smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_LOGIN.getScene(), - reqVO.getCode(), userIp); + smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp)); // 获得获得注册用户 MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp); @@ -292,8 +292,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { MemberUserDO userDO = checkUserIfExists(reqVO.getMobile()); // 使用验证码 - smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_FORGET_PASSWORD.getScene(), reqVO.getCode(), - getClientIP()); + smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_FORGET_PASSWORD, + getClientIP())); // 更新密码 MemberUserDO mbrUserDO = MemberUserDO.builder().build(); @@ -304,7 +304,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { @Override public void sendSmsCode(Long userId, AppAuthSendSmsReqVO reqVO) { - // TODO 芋艿:修改 + // TODO 要根据不同的场景,校验是否有用户 + smsCodeApi.sendSmsCode(AuthConvert.INSTANCE.convert(reqVO)); } /** diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index f3348e2347..625daf8786 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -4,14 +4,12 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SmsCodeDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; -import cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants; +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; -import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; @@ -43,7 +41,7 @@ public class MemberUserServiceImpl implements MemberUserService { @Resource private InfFileCoreService fileCoreService; @Resource - private SysSmsCodeService smsCodeService; + private SmsCodeApi smsCodeApi; @Resource private PasswordEncoder passwordEncoder; @@ -111,22 +109,19 @@ public class MemberUserServiceImpl implements MemberUserService { return avatar; } + @Override @Transactional(rollbackFor = Exception.class) public void updateUserMobile(Long userId, AppUserUpdateMobileReqVO reqVO) { // 检测用户是否存在 checkUserExists(userId); + // TODO 芋艿:oldMobile 应该不用传递 // 校验旧手机和旧验证码 - SmsCodeDO sysSmsCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(), - SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()); - // 判断旧 code 是否未被使用,如果是,抛出异常 - if (Boolean.FALSE.equals(sysSmsCodeDO.getUsed())){ - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_IS_UNUSED); - } - + smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getOldMobile()).setCode(reqVO.getOldCode()) + .setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP())); // 使用新验证码 - smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene(), - reqVO.getCode(),getClientIP()); + smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getMobile()).setCode(reqVO.getCode()) + .setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP())); // 更新用户手机 memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(reqVO.getMobile()).build()); diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java similarity index 85% rename from yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java rename to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java index 06f782ffbe..7e9b4648f1 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java @@ -1,22 +1,21 @@ package cn.iocoder.yudao.module.member.service.auth; -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; -import cn.iocoder.yudao.module.system.service.auth.SysUserSessionCoreService; -import cn.iocoder.yudao.module.system.service.logger.SysLoginLogCoreService; -import cn.iocoder.yudao.module.system.service.social.SysSocialCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthResetPasswordReqVO; import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthUpdatePasswordReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; -import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; +import cn.iocoder.yudao.module.system.api.auth.UserSessionApi; +import cn.iocoder.yudao.module.system.api.logger.LoginLogApi; +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; +import cn.iocoder.yudao.module.system.api.social.SocialUserApi; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.crypto.password.PasswordEncoder; @@ -37,22 +36,20 @@ import static org.mockito.Mockito.when; * @author 宋天 */ @Import({MemberAuthServiceImpl.class, YudaoRedisAutoConfiguration.class}) -public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { +public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest { @MockBean private AuthenticationManager authenticationManager; @MockBean private MemberUserService userService; @MockBean - private SysSmsCodeService smsCodeService; + private SmsCodeApi smsCodeApi; @MockBean - private SysLoginLogCoreService loginLogCoreService; + private LoginLogApi loginLogApi; @MockBean - private SysUserSessionCoreService userSessionCoreService; + private UserSessionApi userSessionApi; @MockBean - private SysSocialCoreService socialService; - @Resource - private StringRedisTemplate stringRedisTemplate; + private SocialUserApi socialUserApi; @MockBean private PasswordEncoder passwordEncoder; @Resource diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/UserServiceImplTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java similarity index 87% rename from yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/UserServiceImplTest.java rename to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java index e68fd03103..59a771047c 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/UserServiceImplTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java @@ -6,13 +6,11 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SmsCodeDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; -import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl; -import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService; import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -36,7 +34,7 @@ import static org.mockito.Mockito.*; * @author 宋天 */ @Import({MemberUserServiceImpl.class, YudaoRedisAutoConfiguration.class}) -public class UserServiceImplTest extends BaseDbAndRedisUnitTest { +public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { @Resource private MemberUserServiceImpl mbrUserService; @@ -57,7 +55,7 @@ public class UserServiceImplTest extends BaseDbAndRedisUnitTest { private PasswordEncoder passwordEncoder; @MockBean - private SmsCodeService smsCodeService; + private SmsCodeApi smsCodeApi; @Test public void testUpdateNickName_success(){ @@ -103,14 +101,15 @@ public class UserServiceImplTest extends BaseDbAndRedisUnitTest { userDO.setMobile(oldMobile); userMapper.insert(userDO); + // TODO 芋艿:需要修复该单元测试,重构多模块带来的 // 旧手机和旧验证码 - SmsCodeDO codeDO = new SmsCodeDO(); +// SmsCodeDO codeDO = new SmsCodeDO(); String oldCode = RandomUtil.randomString(4); - codeDO.setMobile(userDO.getMobile()); - codeDO.setCode(oldCode); - codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()); - codeDO.setUsed(Boolean.FALSE); - when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO); +// codeDO.setMobile(userDO.getMobile()); +// codeDO.setCode(oldCode); +// codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()); +// codeDO.setUsed(Boolean.FALSE); +// when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO); // 更新手机号 String newMobile = randomNumbers(11); diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java new file mode 100644 index 0000000000..1a3aea7eee --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.system.api.sms; + +import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; + +import javax.validation.Valid; + +/** + * 短信验证码 API 接口 + * + * @author 芋道源码 + */ +public interface SmsCodeApi { + + /** + * 创建短信验证码,并进行发送 + * + * @param reqDTO 发送请求 + */ + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); + + /** + * 验证短信验证码,并进行使用 + * 如果正确,则将验证码标记成已使用 + * 如果错误,则抛出 {@link ServiceException} 异常 + * + * @param reqDTO 使用请求 + */ + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO); + + /** + * 检查验证码是否有效 + * + * @param reqDTO 校验请求 + */ + void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeCheckReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeCheckReqDTO.java new file mode 100644 index 0000000000..2fd1ed6687 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeCheckReqDTO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.system.api.sms.dto; + +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * 短信验证码的校验 Request DTO + * + * @author 芋道源码 + */ +@Data +public class SmsCodeCheckReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotEmpty(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 验证码 + */ + @NotEmpty(message = "验证码") + private String code; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeSendReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeSendReqDTO.java new file mode 100644 index 0000000000..088899aac4 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeSendReqDTO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.system.api.sms.dto; + +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * 短信验证码的发送 Request DTO + * + * @author 芋道源码 + */ +@Data +public class SmsCodeSendReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotEmpty(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 发送 IP + */ + @NotEmpty(message = "发送 IP 不能为空") + private String createIp; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeUseReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeUseReqDTO.java new file mode 100644 index 0000000000..eedc2a90a2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeUseReqDTO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.system.api.sms.dto; + +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * 短信验证码的使用 Request DTO + * + * @author 芋道源码 + */ +@Data +public class SmsCodeUseReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotEmpty(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 验证码 + */ + @NotEmpty(message = "验证码") + private String code; + /** + * 使用 IP + */ + @NotEmpty(message = "使用 IP 不能为空") + private String usedIp; + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java new file mode 100644 index 0000000000..73d73b42f2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.system.api.sms; + +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; +import cn.iocoder.yudao.module.system.service.sms.SmsCodeService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 短信验证码 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SmsCodeApiImpl implements SmsCodeApi { + + @Resource + private SmsCodeService smsCodeService; + + @Override + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) { + smsCodeService.sendSmsCode(reqDTO); + } + + @Override + public void useSmsCode(SmsCodeUseReqDTO reqDTO) { + smsCodeService.useSmsCode(reqDTO); + } + + @Override + public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) { + smsCodeService.checkSmsCode(reqDTO); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java index f62b7576da..f427b6a2f5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java @@ -1,8 +1,11 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.iocoder.yudao.framework.common.exception.ServiceException; -import cn.iocoder.yudao.framework.common.validation.Mobile; -import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; + +import javax.validation.Valid; /** * 短信验证码 Service 接口 @@ -14,31 +17,24 @@ public interface SmsCodeService { /** * 创建短信验证码,并进行发送 * - * @param mobile 手机号 - * @param scene 发送场景 {@link SmsSceneEnum} - * @param createIp 发送 IP + * @param reqDTO 发送请求 */ - void sendSmsCode(@Mobile String mobile, Integer scene, String createIp); + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); /** * 验证短信验证码,并进行使用 * 如果正确,则将验证码标记成已使用 * 如果错误,则抛出 {@link ServiceException} 异常 * - * @param mobile 手机号 - * @param scene 发送场景 {@link SmsSceneEnum} - * @param code 验证码 - * @param usedIp 使用 IP + * @param reqDTO 使用请求 */ - void useSmsCode(@Mobile String mobile, Integer scene, String code, String usedIp); + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO); /** * 检查验证码是否有效 * - * @param mobile 手机 - * @param code 验证码 - * @param scene 使用场景 + * @param reqDTO 校验请求 */ - void checkSmsCode(String mobile, String code, Integer scene); + void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java index db4bfa8fae..b30f31dd07 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java @@ -4,6 +4,9 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper; import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; @@ -42,13 +45,13 @@ public class SmsCodeServiceImpl implements SmsCodeService { private SmsSendService smsSendService; @Override - public void sendSmsCode(String mobile, Integer scene, String createIp) { - SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(scene); - Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", scene); + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) { + SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(reqDTO.getScene()); + Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", reqDTO.getScene()); // 创建验证码 - String code = createSmsCode(mobile, scene, createIp); + String code = createSmsCode(reqDTO.getMobile(), reqDTO.getScene(), reqDTO.getCreateIp()); // 发送验证码 - smsSendService.sendSingleSms(mobile, null, null, + smsSendService.sendSingleSms(reqDTO.getMobile(), null, null, sceneEnum.getTemplateCode(), MapUtil.of("code", code)); } @@ -77,17 +80,17 @@ public class SmsCodeServiceImpl implements SmsCodeService { } @Override - public void useSmsCode(String mobile, Integer scene, String code, String usedIp) { + public void useSmsCode(SmsCodeUseReqDTO reqDTO) { // 检测验证码是否有效 - SmsCodeDO lastSmsCode = this.checkSmsCode0(mobile, code, scene); + SmsCodeDO lastSmsCode = this.checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); // 使用验证码 smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId()) - .used(true).usedTime(new Date()).usedIp(usedIp).build()); + .used(true).usedTime(new Date()).usedIp(reqDTO.getUsedIp()).build()); } @Override - public void checkSmsCode(String mobile, String code, Integer scene) { - checkSmsCode0(mobile, code, scene); + public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) { + checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); } public SmsCodeDO checkSmsCode0(String mobile, String code, Integer scene) { From fd53bf329642a4322400ad48f07ccc3651545532 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 00:33:55 +0800 Subject: [PATCH 16/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=204=EF=BC=9Asystem=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yaml | 2 +- .../src/test/resources/sql/clean.sql | 20 - .../src/test/resources/sql/create_tables.sql | 407 ------------------ .../app/auth/vo/AppAuthCheckCodeReqVO.java | 2 +- .../app/auth/vo/AppAuthSendSmsReqVO.java | 2 +- .../service/auth/MemberAuthServiceImpl.java | 11 +- .../service/auth/MemberAuthServiceTest.java | 10 +- .../user/MemberUserServiceImplTest.java | 12 +- .../test/resources/application-unit-test.yaml | 2 + .../src/test/resources/sql/clean.sql | 1 - .../src/test/resources/sql/create_tables.sql | 1 - .../controller/admin/auth/AuthController.java | 6 +- .../admin/auth/UserSessionController.java | 10 +- .../auth/vo/auth/AuthSocialBindReqVO.java | 2 +- .../auth/vo/auth/AuthSocialLogin2ReqVO.java | 2 +- .../auth/vo/auth/AuthSocialLoginReqVO.java | 2 +- .../auth/vo/auth/AuthSocialUnbindReqVO.java | 2 +- .../controller/admin/dept/DeptController.java | 10 +- .../controller/admin/dept/PostController.java | 8 +- .../admin/dept/vo/dept/DeptBaseVO.java | 2 +- .../admin/dept/vo/dept/DeptListReqVO.java | 2 +- .../admin/dept/vo/dept/DeptRespVO.java | 2 +- .../admin/dept/vo/post/PostBaseVO.java | 2 +- .../admin/dept/vo/post/PostExportReqVO.java | 4 +- .../admin/dept/vo/post/PostListReqVO.java | 2 +- .../admin/dept/vo/post/PostPageReqVO.java | 2 +- .../admin/dict/DictDataController.java | 6 +- .../admin/dict/vo/data/DictDataBaseVO.java | 4 +- .../dict/vo/data/DictDataExportReqVO.java | 2 +- .../admin/dict/vo/data/DictDataPageReqVO.java | 2 +- .../dict/vo/type/DictTypeExportReqVO.java | 2 +- .../admin/dict/vo/type/DictTypePageReqVO.java | 2 +- .../errorcode/vo/ErrorCodePageReqVO.java | 2 +- .../admin/errorcode/vo/ErrorCodeRespVO.java | 2 +- .../admin/logger/LoginLogController.java | 6 +- .../logger/vo/loginlog/LoginLogBaseVO.java | 4 +- .../vo/operatelog/OperateLogBaseVO.java | 2 +- .../vo/operatelog/OperateLogExportReqVO.java | 2 +- .../vo/operatelog/OperateLogPageReqVO.java | 2 +- .../admin/notice/vo/NoticeBaseVO.java | 2 +- .../admin/notice/vo/NoticePageReqVO.java | 2 +- .../admin/permission/vo/menu/MenuBaseVO.java | 4 +- .../permission/vo/menu/MenuListReqVO.java | 2 +- .../admin/permission/vo/menu/MenuRespVO.java | 2 +- .../PermissionAssignRoleDataScopeReqVO.java | 2 +- .../admin/permission/vo/role/RoleBaseVO.java | 2 +- .../permission/vo/role/RoleExportReqVO.java | 2 +- .../permission/vo/role/RolePageReqVO.java | 2 +- .../admin/permission/vo/role/RoleRespVO.java | 4 +- .../vo/role/RoleUpdateStatusReqVO.java | 4 +- .../admin/sms/SmsCallbackController.java | 6 +- .../admin/sms/SmsChannelController.java | 10 +- .../admin/sms/SmsLogController.java | 10 +- .../admin/sms/SmsTemplateController.java | 12 +- .../admin/sms/vo/log/SmsLogExportReqVO.java | 2 +- .../admin/sms/vo/log/SmsLogPageReqVO.java | 4 +- ...SysSmsLogRespVO.java => SmsLogRespVO.java} | 2 +- .../sms/vo/template/SmsTemplateBaseVO.java | 2 +- .../vo/template/SmsTemplateExportReqVO.java | 2 +- .../admin/tenant/TenantController.java | 12 +- .../admin/tenant/vo/TenantExportReqVO.java | 2 +- .../controller/admin/user/UserController.java | 14 +- .../admin/user/UserProfileController.java | 12 +- .../user/vo/profile/UserProfileRespVO.java | 4 +- .../vo/profile/UserProfileUpdateReqVO.java | 2 +- .../admin/user/vo/user/UserBaseVO.java | 4 +- .../admin/user/vo/user/UserExportReqVO.java | 4 +- .../admin/user/vo/user/UserPageReqVO.java | 2 +- .../admin/user/vo/user/UserRespVO.java | 2 +- .../user/vo/user/UserUpdateStatusReqVO.java | 4 +- .../convert/auth/UserSessionConvert.java | 4 +- .../system/convert/dept/DeptConvert.java | 12 +- .../system/convert/dept/PostConvert.java | 14 +- .../system/convert/dict/DictDataConvert.java | 18 +- .../convert/dict/SysDictDataCoreConvert.java | 20 - .../convert/logger/LoginLogConvert.java | 11 +- .../logger/SysLoginLogCoreConvert.java | 15 - .../system/convert/sms/SmsChannelConvert.java | 16 +- .../system/convert/sms/SmsLogConvert.java | 12 +- .../convert/sms/SmsTemplateConvert.java | 14 +- .../system/convert/tenant/TenantConvert.java | 14 +- .../system/convert/user/UserConvert.java | 14 +- ...sUserSessionDO.java => UserSessionDO.java} | 8 +- .../dept/{SysDeptDO.java => DeptDO.java} | 4 +- .../dept/{SysPostDO.java => PostDO.java} | 4 +- .../{SysDictDataDO.java => DictDataDO.java} | 6 +- .../{SysLoginLogDO.java => LoginLogDO.java} | 4 +- .../dal/dataobject/permission/MenuDO.java | 2 +- ...SysSmsChannelDO.java => SmsChannelDO.java} | 4 +- .../sms/{SysSmsLogDO.java => SmsLogDO.java} | 28 +- ...sSmsTemplateDO.java => SmsTemplateDO.java} | 12 +- ...SysSocialUserDO.java => SocialUserDO.java} | 6 +- .../{SysTenantDO.java => TenantDO.java} | 4 +- .../dal/dataobject/user/AdminUserDO.java | 6 +- .../mysql/auth/SysUserSessionCoreMapper.java | 10 - ...sionMapper.java => UserSessionMapper.java} | 12 +- .../{SysDeptMapper.java => DeptMapper.java} | 22 +- .../{SysPostMapper.java => PostMapper.java} | 24 +- .../dal/mysql/dept/SysDeptCoreMapper.java | 9 - .../dal/mysql/dept/SysPostCoreMapper.java | 9 - .../system/dal/mysql/dict/DictDataMapper.java | 54 +++ ...ictTypeMapper.java => DictTypeMapper.java} | 2 +- .../dal/mysql/dict/SysDictDataMapper.java | 55 --- ...orCodeMapper.java => ErrorCodeMapper.java} | 2 +- .../dal/mysql/logger/LoginLogMapper.java | 12 +- .../mysql/logger/SysLoginLogCoreMapper.java | 10 - ...SysNoticeMapper.java => NoticeMapper.java} | 2 +- .../dal/mysql/permission/RoleMenuMapper.java | 2 +- .../dal/mysql/sms/SmsChannelMapper.java | 10 +- .../system/dal/mysql/sms/SmsLogMapper.java | 12 +- .../dal/mysql/sms/SmsTemplateMapper.java | 52 +-- .../dal/mysql/social/SocialUserMapper.java | 28 ++ .../dal/mysql/social/SysSocialUserMapper.java | 28 -- .../dal/mysql/tenant/SysTenantCoreMapper.java | 9 - .../dal/mysql/tenant/SysTenantMapper.java | 44 -- .../system/dal/mysql/tenant/TenantMapper.java | 44 ++ ...yConstants.java => RedisKeyConstants.java} | 4 +- .../dal/redis/SysRedisKeyCoreConstants.java | 18 - .../dal/redis/auth/LoginUserRedisDAO.java | 2 +- .../dal/redis/common/CaptchaRedisDAO.java | 2 +- .../redis/social/SocialAuthUserRedisDAO.java | 2 +- .../common/{SysSexEnum.java => SexEnum.java} | 2 +- ...tusEnum.java => SmsReceiveStatusEnum.java} | 2 +- ...StatusEnum.java => SmsSendStatusEnum.java} | 2 +- ...TypeEnum.java => SmsTemplateTypeEnum.java} | 2 +- .../config/DataPermissionConfiguration.java | 4 +- .../mq/consumer/sms/SmsSendConsumer.java | 4 +- .../service/auth/AdminAuthServiceImpl.java | 12 +- .../service/auth/UserSessionService.java | 4 +- .../service/auth/UserSessionServiceImpl.java | 34 +- .../system/service/dept/DeptService.java | 18 +- .../system/service/dept/DeptServiceImpl.java | 58 +-- .../system/service/dept/PostService.java | 12 +- .../system/service/dept/PostServiceImpl.java | 30 +- .../system/service/dict/DictDataService.java | 10 +- .../service/dict/DictDataServiceImpl.java | 55 ++- .../service/dict/DictTypeServiceImpl.java | 4 +- .../errorcode/ErrorCodeServiceImpl.java | 4 +- .../service/logger/LoginLogService.java | 6 +- .../service/logger/LoginLogServiceImpl.java | 12 +- .../service/notice/NoticeServiceImpl.java | 4 +- .../service/permission/MenuServiceImpl.java | 2 +- .../permission/PermissionServiceImpl.java | 6 +- .../system/service/sms/SmsChannelService.java | 10 +- .../service/sms/SmsChannelServiceImpl.java | 18 +- .../system/service/sms/SmsLogService.java | 10 +- .../system/service/sms/SmsLogServiceImpl.java | 36 +- .../service/sms/SmsSendServiceImpl.java | 10 +- .../service/sms/SmsTemplateService.java | 14 +- .../service/sms/SmsTemplateServiceImpl.java | 40 +- .../service/social/SocialUserService.java | 6 +- .../service/social/SocialUserServiceImpl.java | 30 +- .../service/tenant/SysTenantCoreService.java | 11 - .../system/service/tenant/TenantService.java | 17 +- .../service/tenant/TenantServiceImpl.java | 31 +- .../tenant/impl/SysTenantCoreServiceImpl.java | 29 -- .../service/user/AdminUserServiceImpl.java | 4 +- .../auth/UserSessionServiceImplTest.java | 36 +- .../system/service/dept/DeptServiceTest.java | 48 +-- .../system/service/dept/PostServiceTest.java | 38 +- .../service/dict/DictDataServiceTest.java | 44 +- .../service/dict/DictTypeServiceTest.java | 4 +- .../errorcode/ErrorCodeServiceTest.java | 6 +- .../logger/LoginLogServiceImplTest.java | 12 +- .../logger/OperateLogServiceImplTest.java | 6 +- .../service/notice/NoticeServiceImplTest.java | 22 +- .../permission/PermissionServiceTest.java | 4 +- .../service/sms/SmsChannelServiceTest.java | 26 +- .../system/service/sms/SmsLogServiceTest.java | 80 ++-- ...rviceTest.java => SmsSendServiceTest.java} | 10 +- .../service/sms/SmsTemplateServiceTest.java | 62 +-- .../service/social/SocialUserServiceTest.java | 28 +- .../service/tenant/TenantServiceTest.java | 22 +- .../service/user/UserServiceImplTest.java | 91 ++-- .../test/resources/application-unit-test.yaml | 55 +++ .../src/test/resources/logback-spring.xml | 4 + .../src/test/resources/sql/clean.sql | 18 + .../src/test/resources/sql/create_tables.sql | 405 +++++++++++++++++ 178 files changed, 1467 insertions(+), 1545 deletions(-) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/{SysSmsLogRespVO.java => SmsLogRespVO.java} (99%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataCoreConvert.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/{SysUserSessionDO.java => UserSessionDO.java} (82%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/{SysDeptDO.java => DeptDO.java} (94%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/{SysPostDO.java => PostDO.java} (92%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/{SysDictDataDO.java => DictDataDO.java} (88%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/{SysLoginLogDO.java => LoginLogDO.java} (95%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/{SysSmsChannelDO.java => SmsChannelDO.java} (91%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/{SysSmsLogDO.java => SmsLogDO.java} (81%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/{SysSmsTemplateDO.java => SmsTemplateDO.java} (83%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/{SysSocialUserDO.java => SocialUserDO.java} (89%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/{SysTenantDO.java => TenantDO.java} (89%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionCoreMapper.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/{SysUserSessionMapper.java => UserSessionMapper.java} (54%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/{SysDeptMapper.java => DeptMapper.java} (51%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/{SysPostMapper.java => PostMapper.java} (55%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptCoreMapper.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostCoreMapper.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictDataMapper.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/{SysDictTypeMapper.java => DictTypeMapper.java} (96%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/{SysErrorCodeMapper.java => ErrorCodeMapper.java} (97%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogCoreMapper.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/{SysNoticeMapper.java => NoticeMapper.java} (91%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialUserMapper.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SysSocialUserMapper.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantCoreMapper.java delete mode 100755 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java create mode 100755 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/{SysRedisKeyConstants.java => RedisKeyConstants.java} (96%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyCoreConstants.java rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/{SysSexEnum.java => SexEnum.java} (93%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/{SysSmsReceiveStatusEnum.java => SmsReceiveStatusEnum.java} (90%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/{SysSmsSendStatusEnum.java => SmsSendStatusEnum.java} (91%) rename yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/{SysSmsTemplateTypeEnum.java => SmsTemplateTypeEnum.java} (90%) delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantCoreService.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/impl/SysTenantCoreServiceImpl.java rename yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/{SysSmsSendServiceTest.java => SmsSendServiceTest.java} (95%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml create mode 100644 yudao-module-system/yudao-module-system-impl/src/test/resources/logback-spring.xml create mode 100644 yudao-module-system/yudao-module-system-impl/src/test/resources/sql/clean.sql create mode 100644 yudao-module-system/yudao-module-system-impl/src/test/resources/sql/create_tables.sql diff --git a/yudao-admin-server/src/main/resources/application.yaml b/yudao-admin-server/src/main/resources/application.yaml index 97eb6ac492..81ec74b2cf 100644 --- a/yudao-admin-server/src/main/resources/application.yaml +++ b/yudao-admin-server/src/main/resources/application.yaml @@ -75,7 +75,7 @@ yudao: error-code: # 错误码相关配置项 constants-class-list: - cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants - - cn.iocoder.yudao.module.system.enums.SysErrorCodeConstants + - cn.iocoder.yudao.module.system.enums.ErrorCodeConstants - cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants tenant: # 多租户相关配置项 tables: # 配置需要开启多租户的表;如果实体已经继承 TenantBaseDO 类,则无需重复配置 diff --git a/yudao-admin-server/src/test/resources/sql/clean.sql b/yudao-admin-server/src/test/resources/sql/clean.sql index b565553f24..c0149d424c 100644 --- a/yudao-admin-server/src/test/resources/sql/clean.sql +++ b/yudao-admin-server/src/test/resources/sql/clean.sql @@ -6,26 +6,6 @@ DELETE FROM "inf_job_log"; DELETE FROM "inf_api_access_log"; DELETE FROM "inf_api_error_log"; --- sys 开头的 DB -DELETE FROM "sys_dept"; -DELETE FROM "sys_dict_data"; -DELETE FROM "sys_role"; -DELETE FROM "sys_role_menu"; -DELETE FROM "sys_menu"; -DELETE FROM "sys_user_role"; -DELETE FROM "sys_dict_type"; -DELETE FROM "sys_user_session"; -DELETE FROM "sys_post"; -DELETE FROM "sys_login_log"; -DELETE FROM "sys_operate_log"; -DELETE FROM "sys_user"; -DELETE FROM "sys_sms_channel"; -DELETE FROM "sys_sms_template"; -DELETE FROM "sys_sms_log"; -DELETE FROM "sys_error_code"; -DELETE FROM "sys_social_user"; -DELETE FROM "sys_tenant"; - -- pay 开头的 DB DELETE FROM pay_merchant; DELETE FROM pay_app; diff --git a/yudao-admin-server/src/test/resources/sql/create_tables.sql b/yudao-admin-server/src/test/resources/sql/create_tables.sql index 9b2f0d69f1..b8b92e3b1f 100644 --- a/yudao-admin-server/src/test/resources/sql/create_tables.sql +++ b/yudao-admin-server/src/test/resources/sql/create_tables.sql @@ -67,413 +67,6 @@ CREATE TABLE IF NOT EXISTS "inf_job_log" ( PRIMARY KEY ("id") )COMMENT='定时任务日志表'; --- sys 开头的 DB - -CREATE TABLE IF NOT EXISTS "sys_dept" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(30) NOT NULL DEFAULT '', - "parent_id" bigint NOT NULL DEFAULT '0', - "sort" int NOT NULL DEFAULT '0', - "leader_user_id" bigint DEFAULT NULL, - "phone" varchar(11) DEFAULT NULL, - "email" varchar(50) DEFAULT NULL, - "status" tinyint NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '部门表'; - -CREATE TABLE IF NOT EXISTS "sys_dict_data" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "sort" int NOT NULL DEFAULT '0', - "label" varchar(100) NOT NULL DEFAULT '', - "value" varchar(100) NOT NULL DEFAULT '', - "dict_type" varchar(100) NOT NULL DEFAULT '', - "status" tinyint NOT NULL DEFAULT '0', - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '字典数据表'; - -CREATE TABLE IF NOT EXISTS "sys_role" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(30) NOT NULL, - "code" varchar(100) NOT NULL, - "sort" int NOT NULL, - "data_scope" tinyint NOT NULL DEFAULT '1', - "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '', - "status" tinyint NOT NULL, - "type" tinyint NOT NULL, - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '角色信息表'; - -CREATE TABLE IF NOT EXISTS "sys_role_menu" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "role_id" bigint NOT NULL, - "menu_id" bigint NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '角色和菜单关联表'; - -CREATE TABLE IF NOT EXISTS "sys_menu" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(50) NOT NULL, - "permission" varchar(100) NOT NULL DEFAULT '', - "menu_type" tinyint NOT NULL, - "sort" int NOT NULL DEFAULT '0', - "parent_id" bigint NOT NULL DEFAULT '0', - "path" varchar(200) DEFAULT '', - "icon" varchar(100) DEFAULT '#', - "component" varchar(255) DEFAULT NULL, - "status" tinyint NOT NULL DEFAULT '0', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '菜单权限表'; - -CREATE TABLE IF NOT EXISTS "sys_user_role" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "role_id" bigint NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp DEFAULT NULL, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp DEFAULT NULL, - "deleted" bit DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '用户和角色关联表'; - -CREATE TABLE IF NOT EXISTS "sys_dict_type" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(100) NOT NULL DEFAULT '', - "type" varchar(100) NOT NULL DEFAULT '', - "status" tinyint NOT NULL DEFAULT '0', - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '字典类型表'; - -CREATE TABLE IF NOT EXISTS `sys_user_session` ( - `id` varchar(32) NOT NULL, - `user_id` bigint DEFAULT NULL, - "user_type" tinyint NOT NULL, - `username` varchar(50) NOT NULL DEFAULT '', - `user_ip` varchar(50) DEFAULT NULL, - `user_agent` varchar(512) DEFAULT NULL, - `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '' , - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY (`id`) -) COMMENT '用户在线 Session'; - -CREATE TABLE IF NOT EXISTS "sys_post" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "code" varchar(64) NOT NULL, - "name" varchar(50) NOT NULL, - "sort" integer NOT NULL, - "status" tinyint NOT NULL, - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '岗位信息表'; - -CREATE TABLE IF NOT EXISTS "sys_notice" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "title" varchar(50) NOT NULL COMMENT '公告标题', - "content" text NOT NULL COMMENT '公告内容', - "notice_type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', - "status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', - "creator" varchar(64) DEFAULT '' COMMENT '创建者', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - "updater" varchar(64) DEFAULT '' COMMENT '更新者', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - "deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除', - "tenant_id" bigint not null default '0', - PRIMARY KEY("id") -) COMMENT '通知公告表'; - -CREATE TABLE IF NOT EXISTS `sys_login_log` ( - `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `log_type` bigint(4) NOT NULL, - "user_id" bigint not null default '0', - "user_type" tinyint NOT NULL, - `trace_id` varchar(64) NOT NULL DEFAULT '', - `username` varchar(50) NOT NULL DEFAULT '', - `result` tinyint(4) NOT NULL, - `user_ip` varchar(50) NOT NULL, - `user_agent` varchar(512) NOT NULL, - `creator` varchar(64) DEFAULT '', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`) -) COMMENT ='系统访问记录'; - -CREATE TABLE IF NOT EXISTS `sys_operate_log` ( - `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `trace_id` varchar(64) NOT NULL DEFAULT '', - `user_id` bigint(20) NOT NULL, - `module` varchar(50) NOT NULL, - `name` varchar(50) NOT NULL, - `operate_type` bigint(4) NOT NULL DEFAULT '0', - `content` varchar(2000) NOT NULL DEFAULT '', - `exts` varchar(512) NOT NULL DEFAULT '', - `request_method` varchar(16) DEFAULT '', - `request_url` varchar(255) DEFAULT '', - `user_ip` varchar(50) DEFAULT NULL, - `user_agent` varchar(200) DEFAULT NULL, - `java_method` varchar(512) NOT NULL DEFAULT '', - `java_method_args` varchar(8000) DEFAULT '', - `start_time` datetime NOT NULL, - `duration` int(11) NOT NULL, - `result_code` int(11) NOT NULL DEFAULT '0', - `result_msg` varchar(512) DEFAULT '', - `result_data` varchar(4000) DEFAULT '', - `creator` varchar(64) DEFAULT '', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT '0', - "tenant_id" bigint not null default '0', - PRIMARY KEY (`id`) -) COMMENT ='操作日志记录'; - -CREATE TABLE IF NOT EXISTS "sys_user" ( - "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, - "username" varchar(30) not null, - "password" varchar(100) not null default '', - "nickname" varchar(30) not null, - "remark" varchar(500) default null, - "dept_id" bigint default null, - "post_ids" varchar(255) default null, - "email" varchar(50) default '', - "mobile" varchar(11) default '', - "sex" tinyint default '0', - "avatar" varchar(100) default '', - "status" tinyint not null default '0', - "login_ip" varchar(50) default '', - "login_date" timestamp default null, - "creator" varchar(64) default '', - "create_time" timestamp not null default current_timestamp, - "updater" varchar(64) default '', - "update_time" timestamp not null default current_timestamp, - "deleted" bit not null default false, - "tenant_id" bigint not null default '0', - primary key ("id") -) comment '用户信息表'; - -CREATE TABLE IF NOT EXISTS "inf_api_access_log" ( - "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, - "trace_id" varchar(64) not null default '', - "user_id" bigint not null default '0', - "user_type" tinyint not null default '0', - "application_name" varchar(50) not null, - "request_method" varchar(16) not null default '', - "request_url" varchar(255) not null default '', - "request_params" varchar(8000) not null default '', - "user_ip" varchar(50) not null, - "user_agent" varchar(512) not null, - "begin_time" timestamp not null, - "end_time" timestamp not null, - "duration" integer not null, - "result_code" integer not null default '0', - "result_msg" varchar(512) default '', - "creator" varchar(64) default '', - "create_time" timestamp not null default current_timestamp, - "updater" varchar(64) default '', - "update_time" timestamp not null default current_timestamp, - "deleted" bit not null default false, - "tenant_id" bigint not null default '0', - primary key ("id") -) COMMENT 'API 访问日志表'; - -CREATE TABLE IF NOT EXISTS "inf_api_error_log" ( - "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, - "trace_id" varchar(64) not null, - "user_id" bigint not null default '0', - "user_type" tinyint not null default '0', - "application_name" varchar(50) not null, - "request_method" varchar(16) not null, - "request_url" varchar(255) not null, - "request_params" varchar(8000) not null, - "user_ip" varchar(50) not null, - "user_agent" varchar(512) not null, - "exception_time" timestamp not null, - "exception_name" varchar(128) not null default '', - "exception_message" clob not null, - "exception_root_cause_message" clob not null, - "exception_stack_trace" clob not null, - "exception_class_name" varchar(512) not null, - "exception_file_name" varchar(512) not null, - "exception_method_name" varchar(512) not null, - "exception_line_number" integer not null, - "process_status" tinyint not null, - "process_time" timestamp default null, - "process_user_id" bigint default '0', - "creator" varchar(64) default '', - "create_time" timestamp not null default current_timestamp, - "updater" varchar(64) default '', - "update_time" timestamp not null default current_timestamp, - "deleted" bit not null default false, - "tenant_id" bigint not null default '0', - primary key ("id") -) COMMENT '系统异常日志'; - -CREATE TABLE IF NOT EXISTS "sys_sms_channel" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "signature" varchar(10) NOT NULL, - "code" varchar(63) NOT NULL, - "status" tinyint NOT NULL, - "remark" varchar(255) DEFAULT NULL, - "api_key" varchar(63) NOT NULL, - "api_secret" varchar(63) DEFAULT NULL, - "callback_url" varchar(255) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '短信渠道'; - -CREATE TABLE IF NOT EXISTS "sys_sms_template" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "type" tinyint NOT NULL, - "status" tinyint NOT NULL, - "code" varchar(63) NOT NULL, - "name" varchar(63) NOT NULL, - "content" varchar(255) NOT NULL, - "params" varchar(255) NOT NULL, - "remark" varchar(255) DEFAULT NULL, - "api_template_id" varchar(63) NOT NULL, - "channel_id" bigint NOT NULL, - "channel_code" varchar(63) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '短信模板'; - -CREATE TABLE IF NOT EXISTS "sys_sms_log" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "channel_id" bigint NOT NULL, - "channel_code" varchar(63) NOT NULL, - "template_id" bigint NOT NULL, - "template_code" varchar(63) NOT NULL, - "template_type" tinyint NOT NULL, - "template_content" varchar(255) NOT NULL, - "template_params" varchar(255) NOT NULL, - "api_template_id" varchar(63) NOT NULL, - "mobile" varchar(11) NOT NULL, - "user_id" bigint DEFAULT '0', - "user_type" tinyint DEFAULT '0', - "send_status" tinyint NOT NULL DEFAULT '0', - "send_time" timestamp DEFAULT NULL, - "send_code" int DEFAULT NULL, - "send_msg" varchar(255) DEFAULT NULL, - "api_send_code" varchar(63) DEFAULT NULL, - "api_send_msg" varchar(255) DEFAULT NULL, - "api_request_id" varchar(255) DEFAULT NULL, - "api_serial_no" varchar(255) DEFAULT NULL, - "receive_status" tinyint NOT NULL DEFAULT '0', - "receive_time" timestamp DEFAULT NULL, - "api_receive_code" varchar(63) DEFAULT NULL, - "api_receive_msg" varchar(255) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '短信日志'; - -CREATE TABLE IF NOT EXISTS "sys_error_code" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "type" tinyint NOT NULL DEFAULT '0', - "application_name" varchar(50) NOT NULL, - "code" int NOT NULL DEFAULT '0', - "message" varchar(512) NOT NULL DEFAULT '', - "memo" varchar(512) DEFAULT '', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '错误码表'; - -CREATE TABLE IF NOT EXISTS "sys_social_user" ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "user_type" tinyint NOT NULL DEFAULT '0', - "type" tinyint NOT NULL, - "openid" varchar(32) NOT NULL, - "token" varchar(256) DEFAULT NULL, - "union_id" varchar(32) NOT NULL, - "raw_token_info" varchar(1024) NOT NULL, - "nickname" varchar(32) NOT NULL, - "avatar" varchar(255) DEFAULT NULL, - "raw_user_info" varchar(1024) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '社交用户'; - -CREATE TABLE IF NOT EXISTS "sys_tenant" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(63) NOT NULL, - "contact_name" varchar(255) NOT NULL, - "contact_mobile" varchar(255), - "status" tinyint NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '租户'; - - CREATE TABLE IF NOT EXISTS "pay_merchant" ( "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java index 63b113e0af..dd050147e4 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java @@ -34,7 +34,7 @@ public class AppAuthCheckCodeReqVO { @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") private String code; - @ApiModelProperty(value = "发送场景", example = "1", notes = "对应 MbrSmsSceneEnum 枚举") + @ApiModelProperty(value = "发送场景", example = "1", notes = "对应 SmsSceneEnum 枚举") @NotNull(message = "发送场景不能为空") @InEnum(SmsSceneEnum.class) private Integer scene; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java index 91656b1d49..b8c4824d19 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSendSmsReqVO.java @@ -19,7 +19,7 @@ public class AppAuthSendSmsReqVO { @Mobile private String mobile; - @ApiModelProperty(value = "发送场景", example = "1", notes = "对应 MbrSmsSceneEnum 枚举") + @ApiModelProperty(value = "发送场景", example = "1", notes = "对应 SmsSceneEnum 枚举") @NotNull(message = "发送场景不能为空") @InEnum(SmsSceneEnum.class) private Integer scene; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java index 89a24de60f..5fd8db9b9a 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java @@ -281,9 +281,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { MemberUserDO userDO = checkOldPassword(userId, reqVO.getOldPassword()); // 更新用户密码 - MemberUserDO mbrUserDO = MemberUserDO.builder().id(userDO.getId()) - .password(passwordEncoder.encode(reqVO.getPassword())).build(); - userMapper.updateById(mbrUserDO); + userMapper.updateById(MemberUserDO.builder().id(userDO.getId()) + .password(passwordEncoder.encode(reqVO.getPassword())).build()); } @Override @@ -296,10 +295,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { getClientIP())); // 更新密码 - MemberUserDO mbrUserDO = MemberUserDO.builder().build(); - mbrUserDO.setId(userDO.getId()); - mbrUserDO.setPassword(passwordEncoder.encode(reqVO.getPassword())); - userMapper.updateById(mbrUserDO); + userMapper.updateById(MemberUserDO.builder().id(userDO.getId()) + .password(passwordEncoder.encode(reqVO.getPassword())).build()); } @Override diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java index 7e9b4648f1..3b17af712b 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java @@ -53,7 +53,7 @@ public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest { @MockBean private PasswordEncoder passwordEncoder; @Resource - private MemberUserMapper mbrUserMapper; + private MemberUserMapper memberUserMapper; @Resource private MemberAuthServiceImpl authService; @@ -61,7 +61,7 @@ public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest { public void testUpdatePassword_success(){ // 准备参数 MemberUserDO userDO = randomUserDO(); - mbrUserMapper.insert(userDO); + memberUserMapper.insert(userDO); // 新密码 String newPassword = randomString(); @@ -79,14 +79,14 @@ public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest { // 更新用户密码 authService.updatePassword(userDO.getId(), reqVO); - assertEquals(mbrUserMapper.selectById(userDO.getId()).getPassword(),newPassword); + assertEquals(memberUserMapper.selectById(userDO.getId()).getPassword(),newPassword); } @Test public void testResetPassword_success(){ // 准备参数 MemberUserDO userDO = randomUserDO(); - mbrUserMapper.insert(userDO); + memberUserMapper.insert(userDO); // 随机密码 String password = randomNumbers(11); @@ -103,7 +103,7 @@ public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest { reqVO.setCode(code); authService.resetPassword(reqVO); - assertEquals(mbrUserMapper.selectById(userDO.getId()).getPassword(),password); + assertEquals(memberUserMapper.selectById(userDO.getId()).getPassword(),password); } diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java index 59a771047c..f470e95ae8 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java @@ -37,7 +37,7 @@ import static org.mockito.Mockito.*; public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { @Resource - private MemberUserServiceImpl mbrUserService; + private MemberUserServiceImpl memberUserService; @Resource private StringRedisTemplate stringRedisTemplate; @@ -67,9 +67,9 @@ public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { String newNickName = randomString(); // 调用接口修改昵称 - mbrUserService.updateUserNickname(userDO.getId(),newNickName); + memberUserService.updateUserNickname(userDO.getId(),newNickName); // 查询新修改后的昵称 - String nickname = mbrUserService.getUser(userDO.getId()).getNickname(); + String nickname = memberUserService.getUser(userDO.getId()).getNickname(); // 断言 assertEquals(newNickName,nickname); } @@ -88,7 +88,7 @@ public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { String avatar = randomString(); when(fileCoreService.createFile(anyString(), eq(avatarFileBytes))).thenReturn(avatar); // 调用 - String str = mbrUserService.updateUserAvatar(userId, avatarFile); + String str = memberUserService.updateUserAvatar(userId, avatarFile); // 断言 assertEquals(avatar, str); } @@ -119,9 +119,9 @@ public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { reqVO.setCode(newCode); reqVO.setOldMobile(oldMobile); reqVO.setOldCode(oldCode); - mbrUserService.updateUserMobile(userDO.getId(),reqVO); + memberUserService.updateUserMobile(userDO.getId(),reqVO); - assertEquals(mbrUserService.getUser(userDO.getId()).getMobile(),newMobile); + assertEquals(memberUserService.getUser(userDO.getId()).getMobile(),newMobile); } // ========== 随机对象 ========== diff --git a/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml b/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml index 237068e6e5..212a9312be 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml +++ b/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml @@ -45,5 +45,7 @@ mybatis: yudao: info: base-package: cn.iocoder.yudao.module.member.dal.mysql + member-package: cn.iocoder.yudao.module.member # TODO 芋艿:要清理掉 + system-package: cn.iocoder.yudao.module.system # TODO 芋艿:要清理掉 core-service: base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 diff --git a/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql index 9775e24542..92f559dc1d 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql +++ b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/clean.sql @@ -1,2 +1 @@ --- mbr 开头的 DB DELETE FROM "member_user"; diff --git a/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql index 98d3d2bc18..85925f30b2 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql +++ b/yudao-module-member/yudao-module-member-impl/src/test/resources/sql/create_tables.sql @@ -1,4 +1,3 @@ --- mbr 开头的 DB CREATE TABLE IF NOT EXISTS "member_user" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '编号', "nickname" varchar(30) NOT NULL DEFAULT '' COMMENT '用户昵称', diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 2acc39fcc1..8c45215a4e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -50,7 +50,7 @@ public class AuthController { @Resource private PermissionService permissionService; @Resource - private SocialUserService socialCoreService; + private SocialUserService socialUserService; @PostMapping("/login") @ApiOperation("使用账号密码登录") @@ -102,7 +102,7 @@ public class AuthController { }) public CommonResult socialAuthRedirect(@RequestParam("type") Integer type, @RequestParam("redirectUri") String redirectUri) { - return CommonResult.success(socialCoreService.getAuthorizeUrl(type, redirectUri)); + return CommonResult.success(socialUserService.getAuthorizeUrl(type, redirectUri)); } @PostMapping("/social-login") @@ -133,7 +133,7 @@ public class AuthController { @DeleteMapping("/social-unbind") @ApiOperation("取消社交绑定") public CommonResult socialUnbind(@RequestBody AuthSocialUnbindReqVO reqVO) { - socialCoreService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getUnionId()); + socialUserService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getUnionId()); return CommonResult.success(true); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java index 0b0f5096e9..00150fd8b5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/UserSessionController.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.system.controller.admin.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageItemRespVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.module.system.convert.auth.UserSessionConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.UserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.service.auth.UserSessionService; -import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -45,12 +45,12 @@ public class UserSessionController { @PreAuthorize("@ss.hasPermission('system:user-session:page')") public CommonResult> getUserSessionPage(@Validated UserSessionPageReqVO reqVO) { // 获得 Session 分页 - PageResult pageResult = userSessionService.getUserSessionPage(reqVO); + PageResult pageResult = userSessionService.getUserSessionPage(reqVO); // 获得拼接需要的数据 Map userMap = userService.getUserMap( - convertList(pageResult.getList(), SysUserSessionDO::getUserId)); - Map deptMap = deptService.getDeptMap( + convertList(pageResult.getList(), UserSessionDO::getUserId)); + Map deptMap = deptService.getDeptMap( convertList(userMap.values(), AdminUserDO::getDeptId)); // 拼接结果返回 List sessionList = new ArrayList<>(pageResult.getList().size()); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java index 5debf6b205..2a83329d81 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java @@ -19,7 +19,7 @@ import javax.validation.constraints.NotNull; @Builder public class AuthSocialBindReqVO { - @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java index 90ce2cf88a..725a52d8cb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLogin2ReqVO.java @@ -21,7 +21,7 @@ import javax.validation.constraints.Pattern; @Builder public class AuthSocialLogin2ReqVO { - @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java index bc1247d678..4f51bcb989 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialLoginReqVO.java @@ -19,7 +19,7 @@ import javax.validation.constraints.NotNull; @Builder public class AuthSocialLoginReqVO { - @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java index eb43a2d27d..774602681b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java @@ -19,7 +19,7 @@ import javax.validation.constraints.NotNull; @Builder public class AuthSocialUnbindReqVO { - @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java index 1a4da72be8..0a292e243c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.*; import cn.iocoder.yudao.module.system.convert.dept.DeptConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.service.dept.DeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -58,8 +58,8 @@ public class DeptController { @ApiOperation("获取部门列表") @PreAuthorize("@ss.hasPermission('system:dept:query')") public CommonResult> listDepts(DeptListReqVO reqVO) { - List list = deptService.getSimpleDepts(reqVO); - list.sort(Comparator.comparing(SysDeptDO::getSort)); + List list = deptService.getSimpleDepts(reqVO); + list.sort(Comparator.comparing(DeptDO::getSort)); return success(DeptConvert.INSTANCE.convertList(list)); } @@ -69,9 +69,9 @@ public class DeptController { // 获得部门列表,只要开启状态的 DeptListReqVO reqVO = new DeptListReqVO(); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - List list = deptService.getSimpleDepts(reqVO); + List list = deptService.getSimpleDepts(reqVO); // 排序后,返回给前端 - list.sort(Comparator.comparing(SysDeptDO::getSort)); + list.sort(Comparator.comparing(DeptDO::getSort)); return success(DeptConvert.INSTANCE.convertList02(list)); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java index e5b179e323..5275dc0c43 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.*; import cn.iocoder.yudao.module.system.convert.dept.PostConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.service.dept.PostService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -72,9 +72,9 @@ public class PostController { @ApiOperation(value = "获取岗位精简信息列表", notes = "只包含被开启的岗位,主要用于前端的下拉选项") public CommonResult> getSimplePosts() { // 获得岗位列表,只要开启状态的 - List list = postService.getPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); + List list = postService.getPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); // 排序后,返回给前端 - list.sort(Comparator.comparing(SysPostDO::getSort)); + list.sort(Comparator.comparing(PostDO::getSort)); return success(PostConvert.INSTANCE.convertList02(list)); } @@ -90,7 +90,7 @@ public class PostController { @PreAuthorize("@ss.hasPermission('system:post:export')") @OperateLog(type = EXPORT) public void export(HttpServletResponse response, @Validated PostExportReqVO reqVO) throws IOException { - List posts = postService.getPosts(reqVO); + List posts = postService.getPosts(reqVO); List data = PostConvert.INSTANCE.convertList03(posts); // 输出 ExcelUtils.write(response, "岗位数据.xls", "岗位列表", PostExcelVO.class, data); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java index 0661a54f91..2609f90678 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java @@ -40,7 +40,7 @@ public class DeptBaseVO { @Size(max = 50, message = "邮箱长度不能超过50个字符") private String email; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") @NotNull(message = "状态不能为空") // @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") private Integer status; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java index 171788b59e..c4ff552438 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java @@ -11,7 +11,7 @@ public class DeptListReqVO { @ApiModelProperty(value = "部门名称", example = "芋道", notes = "模糊匹配") private String name; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java index db60a3107c..072df230a7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java @@ -15,7 +15,7 @@ public class DeptRespVO extends DeptBaseVO { @ApiModelProperty(value = "部门编号", required = true, example = "1024") private Long id; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostBaseVO.java index 7000396466..98c1bf212e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostBaseVO.java @@ -28,7 +28,7 @@ public class PostBaseVO { @NotNull(message = "显示顺序不能为空") private Integer sort; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "备注", example = "快乐的备注") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExportReqVO.java index 182449d952..735bfcce19 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostExportReqVO.java @@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel(value = "管理后台 - 岗位导出 Request VO", description = "参数和 SysPostExcelVO 是一致的") +@ApiModel(value = "管理后台 - 岗位导出 Request VO", description = "参数和 PostExcelVO 是一致的") @Data public class PostExportReqVO { @@ -14,7 +14,7 @@ public class PostExportReqVO { @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") private String name; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostListReqVO.java index a1369f20f7..58ba469e12 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostListReqVO.java @@ -13,7 +13,7 @@ public class PostListReqVO extends PostBaseVO { @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") private String name; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostPageReqVO.java index 94c6b9eaab..be9ebeab49 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostPageReqVO.java @@ -17,7 +17,7 @@ public class PostPageReqVO extends PageParam { @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") private String name; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java index 08fca2c476..124e5fd054 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.dict; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -62,7 +62,7 @@ public class DictDataController { @ApiOperation(value = "获得全部字典数据列表", notes = "一般用于管理后台缓存字典数据在本地") // 无需添加权限认证,因为前端全局都需要 public CommonResult> getSimpleDictDatas() { - List list = dictDataService.getDictDatas(); + List list = dictDataService.getDictDatas(); return success(DictDataConvert.INSTANCE.convertList(list)); } @@ -86,7 +86,7 @@ public class DictDataController { @PreAuthorize("@ss.hasPermission('system:dict:export')") @OperateLog(type = EXPORT) public void export(HttpServletResponse response, @Valid DictDataExportReqVO reqVO) throws IOException { - List list = dictDataService.getDictDatas(reqVO); + List list = dictDataService.getDictDatas(reqVO); List data = DictDataConvert.INSTANCE.convertList02(list); // 输出 ExcelUtils.write(response, "字典数据.xls", "数据列表", DictDataExcelVO.class, data); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java index 0292f84372..2cefd83cb8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java @@ -33,9 +33,9 @@ public class DictDataBaseVO { @Size(max = 100, message = "字典类型长度不能超过100个字符") private String dictType; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") @NotNull(message = "状态不能为空") -// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") private Integer status; @ApiModelProperty(value = "备注", example = "我是一个角色") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java index 142d45017a..90290cbdbc 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java @@ -18,7 +18,7 @@ public class DictDataExportReqVO { @Size(max = 100, message = "字典类型类型长度不能超过100个字符") private String dictType; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java index a095aac087..9df4605df6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java @@ -21,7 +21,7 @@ public class DictDataPageReqVO extends PageParam { @Size(max = 100, message = "字典类型类型长度不能超过100个字符") private String dictType; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java index b2f3331b8d..1043a1e72a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java @@ -19,7 +19,7 @@ public class DictTypeExportReqVO { @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") private String type; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java index 1c231b0d24..84635621c4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java @@ -24,7 +24,7 @@ public class DictTypePageReqVO extends PageParam { @Size(max = 100, message = "字典类型类型长度不能超过100个字符") private String type; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java index 70eeda41ac..ff3d09833c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java @@ -18,7 +18,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ToString(callSuper = true) public class ErrorCodePageReqVO extends PageParam { - @ApiModelProperty(value = "错误码类型", example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类") + @ApiModelProperty(value = "错误码类型", example = "1", notes = "参见 ErrorCodeTypeEnum 枚举类") private Integer type; @ApiModelProperty(value = "应用名", example = "dashboard") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java index c79b6bf8c2..8b5cd3e725 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java @@ -17,7 +17,7 @@ public class ErrorCodeRespVO extends ErrorCodeBaseVO { @ApiModelProperty(value = "错误码编号", required = true, example = "1024") private Long id; - @ApiModelProperty(value = "错误码类型", required = true, example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类") + @ApiModelProperty(value = "错误码类型", required = true, example = "1", notes = "参见 ErrorCodeTypeEnum 枚举类") private Integer type; @ApiModelProperty(value = "创建时间", required = true) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java index 9890247c8b..7cb3ac4b7a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.logger; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.LoginLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -40,7 +40,7 @@ public class LoginLogController { @ApiOperation("获得登录日志分页列表") @PreAuthorize("@ss.hasPermission('system:login-log:query')") public CommonResult> getLoginLogPage(@Valid LoginLogPageReqVO reqVO) { - PageResult page = loginLogService.getLoginLogPage(reqVO); + PageResult page = loginLogService.getLoginLogPage(reqVO); return CommonResult.success(LoginLogConvert.INSTANCE.convertPage(page)); } @@ -49,7 +49,7 @@ public class LoginLogController { @PreAuthorize("@ss.hasPermission('system:login-log:export')") @OperateLog(type = EXPORT) public void exportLoginLog(HttpServletResponse response, @Valid LoginLogExportReqVO reqVO) throws IOException { - List list = loginLogService.getLoginLogList(reqVO); + List list = loginLogService.getLoginLogList(reqVO); // 拼接数据 List data = LoginLogConvert.INSTANCE.convertList(list); // 输出 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java index e996570845..e8101f6e97 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java @@ -15,7 +15,7 @@ import javax.validation.constraints.Size; @Data public class LoginLogBaseVO { - @ApiModelProperty(value = "日志类型", required = true, example = "1", notes = "参见 SysLoginLogTypeEnum 枚举类") + @ApiModelProperty(value = "日志类型", required = true, example = "1", notes = "参见 LoginLogTypeEnum 枚举类") @NotNull(message = "日志类型不能为空") private Integer logType; @@ -28,7 +28,7 @@ public class LoginLogBaseVO { @Size(max = 30, message = "用户账号长度不能超过30个字符") private String username; - @ApiModelProperty(value = "登录结果", required = true, example = "1", notes = "参见 SysLoginResultEnum 枚举类") + @ApiModelProperty(value = "登录结果", required = true, example = "1", notes = "参见 LoginResultEnum 枚举类") @NotNull(message = "登录结果不能为空") private Integer result; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java index e66a20e3f2..33b3670392 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java @@ -31,7 +31,7 @@ public class OperateLogBaseVO { @NotEmpty(message = "操作名") private String name; - @ApiModelProperty(value = "操作分类", required = true, example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") + @ApiModelProperty(value = "操作分类", required = true, example = "1", notes = "参见 OperateLogTypeEnum 枚举类") @NotNull(message = "操作分类不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java index 52dc5d99b5..90adb822e5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java @@ -19,7 +19,7 @@ public class OperateLogExportReqVO { @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") private String userNickname; - @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") + @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 OperateLogTypeEnum 枚举类") private Integer type; @ApiModelProperty(value = "操作状态", example = "true") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java index f94d979f4a..0741abd881 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java @@ -20,7 +20,7 @@ public class OperateLogPageReqVO extends PageParam { @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") private String userNickname; - @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") + @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 OperateLogTypeEnum 枚举类") private Integer type; @ApiModelProperty(value = "操作状态", example = "true") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeBaseVO.java index 48d74dd2bd..a8ecb7758b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticeBaseVO.java @@ -26,7 +26,7 @@ public class NoticeBaseVO { @ApiModelProperty(value = "公告内容", required = true, example = "半生编码") private String content; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePageReqVO.java index 570d530053..ba1287c47d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePageReqVO.java @@ -14,7 +14,7 @@ public class NoticePageReqVO extends PageParam { @ApiModelProperty(value = "通知公告名称", example = "芋道", notes = "模糊匹配") private String title; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java index 8769f3a1ba..bbed03caa6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java @@ -23,7 +23,7 @@ public class MenuBaseVO { @Size(max = 100) private String permission; - @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 SysMenuTypeEnum 枚举类") + @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 MenuTypeEnum 枚举类") @NotNull(message = "菜单类型不能为空") private Integer type; @@ -46,7 +46,7 @@ public class MenuBaseVO { @Size(max = 200, message = "组件路径不能超过255个字符") private String component; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") @NotNull(message = "状态不能为空") private Integer status; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java index 53b0b46a92..2600fb92b9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java @@ -11,7 +11,7 @@ public class MenuListReqVO { @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配") private String name; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuRespVO.java index 9fe9e12f5c..34d70f4f53 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuRespVO.java @@ -19,7 +19,7 @@ public class MenuRespVO extends MenuBaseVO { @ApiModelProperty(value = "菜单编号", required = true, example = "1024") private Long id; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java index 0683ba9b81..6adb8c8548 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java @@ -16,7 +16,7 @@ public class PermissionAssignRoleDataScopeReqVO { @NotNull(message = "角色编号不能为空") private Long roleId; - @ApiModelProperty(value = "数据范围", required = true, example = "1", notes = "参见 SysDataScopeEnum 枚举类") + @ApiModelProperty(value = "数据范围", required = true, example = "1", notes = "参见 DataScopeEnum 枚举类") @NotNull(message = "数据范围不能为空") // TODO 这里要多一个枚举校验 private Integer dataScope; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleBaseVO.java index 3f027f8dc0..66b4d2053f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleBaseVO.java @@ -28,7 +28,7 @@ public class RoleBaseVO { @NotNull(message = "显示顺序不能为空") private Integer sort; - @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 SysRoleTypeEnum 枚举") + @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 RoleTypeEnum 枚举") private Integer type; @ApiModelProperty(value = "备注", example = "我是一个角色") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java index 339a22ba82..02e47ac6f5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java @@ -19,7 +19,7 @@ public class RoleExportReqVO { @ApiModelProperty(value = "角色标识", example = "yudao", notes = "模糊匹配") private String code; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "开始时间", example = "2020-10-24") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RolePageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RolePageReqVO.java index d2fed80e5e..2f4cc18586 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RolePageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RolePageReqVO.java @@ -22,7 +22,7 @@ public class RolePageReqVO extends PageParam { @ApiModelProperty(value = "角色标识", example = "yudao", notes = "模糊匹配") private String code; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "开始时间", example = "2020-10-24") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java index e7c0e2c3c7..31acbedcdc 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java @@ -26,10 +26,10 @@ public class RoleRespVO extends RoleBaseVO { @ApiModelProperty(value = "数据范围(指定部门数组)", example = "1") private Set dataScopeDeptIds; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; - @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "参见 SysRoleTypeEnum 枚举类") + @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "参见 RoleTypeEnum 枚举类") private Integer type; @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java index 75a658c7ab..708586b823 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java @@ -1,7 +1,5 @@ package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.validation.InEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -16,7 +14,7 @@ public class RoleUpdateStatusReqVO { @NotNull(message = "角色编号不能为空") private Long id; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") @NotNull(message = "状态不能为空") // @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") private Integer status; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java index 8125f0728a..a8b4ee8d14 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java @@ -25,7 +25,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; public class SmsCallbackController { @Resource - private SmsSendService smsCoreService; + private SmsSendService smsSendService; @PostMapping("/sms/yunpian") @ApiOperation(value = "云片短信的回调", notes = "参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档") @@ -33,7 +33,7 @@ public class SmsCallbackController { @OperateLog(enable = false) public String receiveYunpianSmsStatus(@RequestParam("sms_status") String smsStatus) throws Throwable { String text = URLUtil.decode(smsStatus); // decode 解码参数,因为它被 encode - smsCoreService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text); + smsSendService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text); return "SUCCESS"; // 约定返回 SUCCESS 为成功 } @@ -42,7 +42,7 @@ public class SmsCallbackController { @OperateLog(enable = false) public CommonResult receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable { String text = ServletUtil.getBody(request); - smsCoreService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text); + smsSendService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text); return success(true); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java index 4774fcf59b..638140d210 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsChannelController.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.*; import cn.iocoder.yudao.module.system.convert.sms.SmsChannelConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; import cn.iocoder.yudao.module.system.service.sms.SmsChannelService; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import io.swagger.annotations.Api; @@ -56,7 +56,7 @@ public class SmsChannelController { @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") public CommonResult getSmsChannel(@RequestParam("id") Long id) { - SysSmsChannelDO smsChannel = smsChannelService.getSmsChannel(id); + SmsChannelDO smsChannel = smsChannelService.getSmsChannel(id); return success(SmsChannelConvert.INSTANCE.convert(smsChannel)); } @@ -64,16 +64,16 @@ public class SmsChannelController { @ApiOperation("获得短信渠道分页") @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") public CommonResult> getSmsChannelPage(@Valid SmsChannelPageReqVO pageVO) { - PageResult pageResult = smsChannelService.getSmsChannelPage(pageVO); + PageResult pageResult = smsChannelService.getSmsChannelPage(pageVO); return success(SmsChannelConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/list-all-simple") @ApiOperation(value = "获得短信渠道精简列表", notes = "包含被禁用的短信渠道") public CommonResult> getSimpleSmsChannels() { - List list = smsChannelService.getSmsChannelList(); + List list = smsChannelService.getSmsChannelList(); // 排序后,返回给前端 - list.sort(Comparator.comparing(SysSmsChannelDO::getId)); + list.sort(Comparator.comparing(SmsChannelDO::getId)); return success(SmsChannelConvert.INSTANCE.convertList03(list)); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java index ef93cfc3de..5fbf10e741 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsLogController.java @@ -3,10 +3,10 @@ package cn.iocoder.yudao.module.system.controller.admin.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExcelVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; -import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SysSmsLogRespVO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogRespVO; import cn.iocoder.yudao.module.system.convert.sms.SmsLogConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO; import cn.iocoder.yudao.module.system.service.sms.SmsLogService; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -40,8 +40,8 @@ public class SmsLogController { @GetMapping("/page") @ApiOperation("获得短信日志分页") @PreAuthorize("@ss.hasPermission('system:sms-log:query')") - public CommonResult> getSmsLogPage(@Valid SmsLogPageReqVO pageVO) { - PageResult pageResult = smsLogService.getSmsLogPage(pageVO); + public CommonResult> getSmsLogPage(@Valid SmsLogPageReqVO pageVO) { + PageResult pageResult = smsLogService.getSmsLogPage(pageVO); return success(SmsLogConvert.INSTANCE.convertPage(pageResult)); } @@ -51,7 +51,7 @@ public class SmsLogController { @OperateLog(type = EXPORT) public void exportSmsLogExcel(@Valid SmsLogExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = smsLogService.getSmsLogList(exportReqVO); + List list = smsLogService.getSmsLogList(exportReqVO); // 导出 Excel List datas = SmsLogConvert.INSTANCE.convertList02(list); ExcelUtils.write(response, "短信日志.xls", "数据", SmsLogExcelVO.class, datas); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java index d565143142..3eef58652f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.*; import cn.iocoder.yudao.module.system.convert.sms.SmsTemplateConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.module.system.service.sms.SmsTemplateService; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.yudao.module.system.service.sms.SmsSendService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -32,7 +32,7 @@ public class SmsTemplateController { @Resource private SmsTemplateService smsTemplateService; @Resource - private SmsSendService smsCoreService; + private SmsSendService smsSendService; @PostMapping("/create") @ApiOperation("创建短信模板") @@ -63,7 +63,7 @@ public class SmsTemplateController { @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:sms-template:query')") public CommonResult getSmsTemplate(@RequestParam("id") Long id) { - SysSmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplate(id); + SmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplate(id); return success(SmsTemplateConvert.INSTANCE.convert(smsTemplate)); } @@ -71,7 +71,7 @@ public class SmsTemplateController { @ApiOperation("获得短信模板分页") @PreAuthorize("@ss.hasPermission('system:sms-template:query')") public CommonResult> getSmsTemplatePage(@Valid SmsTemplatePageReqVO pageVO) { - PageResult pageResult = smsTemplateService.getSmsTemplatePage(pageVO); + PageResult pageResult = smsTemplateService.getSmsTemplatePage(pageVO); return success(SmsTemplateConvert.INSTANCE.convertPage(pageResult)); } @@ -81,7 +81,7 @@ public class SmsTemplateController { @OperateLog(type = EXPORT) public void exportSmsTemplateExcel(@Valid SmsTemplateExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = smsTemplateService.getSmsTemplateList(exportReqVO); + List list = smsTemplateService.getSmsTemplateList(exportReqVO); // 导出 Excel List datas = SmsTemplateConvert.INSTANCE.convertList02(list); ExcelUtils.write(response, "短信模板.xls", "数据", SmsTemplateExcelVO.class, datas); @@ -91,7 +91,7 @@ public class SmsTemplateController { @ApiOperation("发送短信") @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')") public CommonResult sendSms(@Valid @RequestBody SmsTemplateSendReqVO sendReqVO) { - return success(smsCoreService.sendSingleSmsToAdmin(sendReqVO.getMobile(), null, + return success(smsSendService.sendSingleSmsToAdmin(sendReqVO.getMobile(), null, sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java index 7a57aa2ed8..6754b43b2a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java @@ -9,7 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "管理后台 - 短信日志 Excel 导出 Request VO", description = "参数和 SysSmsLogPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 短信日志 Excel 导出 Request VO", description = "参数和 SmsLogPageReqVO 是一致的") @Data public class SmsLogExportReqVO { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java index 358427e82d..767201f81c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java @@ -27,7 +27,7 @@ public class SmsLogPageReqVO extends PageParam { @ApiModelProperty(value = "手机号", example = "15601691300") private String mobile; - @ApiModelProperty(value = "发送状态", example = "1", notes = "参见 SysSmsSendStatusEnum 枚举类") + @ApiModelProperty(value = "发送状态", example = "1", notes = "参见 SmsSendStatusEnum 枚举类") private Integer sendStatus; @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @@ -38,7 +38,7 @@ public class SmsLogPageReqVO extends PageParam { @ApiModelProperty(value = "结束发送时间") private Date endSendTime; - @ApiModelProperty(value = "接收状态", example = "0", notes = "参见 SysSmsReceiveStatusEnum 枚举类") + @ApiModelProperty(value = "接收状态", example = "0", notes = "参见 SmsReceiveStatusEnum 枚举类") private Integer receiveStatus; @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SysSmsLogRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java similarity index 99% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SysSmsLogRespVO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java index 7377fc1e50..e179f4a5e6 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SysSmsLogRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java @@ -9,7 +9,7 @@ import java.util.Map; @ApiModel("管理后台 - 短信日志 Response VO") @Data -public class SysSmsLogRespVO { +public class SmsLogRespVO { @ApiModelProperty(value = "编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java index 9b16fa851e..ca9220f8a0 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java @@ -12,7 +12,7 @@ import javax.validation.constraints.NotNull; @Data public class SmsTemplateBaseVO { - @ApiModelProperty(value = "短信类型", required = true, example = "1", notes = "参见 SysSmsTemplateTypeEnum 枚举类") + @ApiModelProperty(value = "短信类型", required = true, example = "1", notes = "参见 SmsTemplateTypeEnum 枚举类") @NotNull(message = "短信类型不能为空") private Integer type; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java index 099be029f4..e775e4c70a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java @@ -9,7 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "管理后台 - 短信模板 Excel 导出 Request VO", description = "参数和 SysSmsTemplatePageReqVO 是一致的") +@ApiModel(value = "管理后台 - 短信模板 Excel 导出 Request VO", description = "参数和 SmsTemplatePageReqVO 是一致的") @Data public class SmsTemplateExportReqVO { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java index bd2fcb430b..50d893f6bd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.tenant; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.*; import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.service.tenant.TenantService; -import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -36,7 +36,7 @@ public class TenantController { @ApiOperation(value = "使用租户名,获得租户编号", notes = "登录界面,根据用户的租户名,获得租户编号") @ApiImplicitParam(name = "name", value = "租户名", required = true, example = "芋道源码", dataTypeClass = Long.class) public CommonResult getTenantIdByName(@RequestParam("name") String name) { - SysTenantDO tenantDO = tenantService.getTenantByName(name); + TenantDO tenantDO = tenantService.getTenantByName(name); return success(tenantDO != null ? tenantDO.getId() : null); } @@ -69,7 +69,7 @@ public class TenantController { @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:tenant:query')") public CommonResult getTenant(@RequestParam("id") Long id) { - SysTenantDO tenant = tenantService.getTenant(id); + TenantDO tenant = tenantService.getTenant(id); return success(TenantConvert.INSTANCE.convert(tenant)); } @@ -78,7 +78,7 @@ public class TenantController { @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) @PreAuthorize("@ss.hasPermission('system:tenant:query')") public CommonResult> getTenantList(@RequestParam("ids") Collection ids) { - List list = tenantService.getTenantList(ids); + List list = tenantService.getTenantList(ids); return success(TenantConvert.INSTANCE.convertList(list)); } @@ -86,7 +86,7 @@ public class TenantController { @ApiOperation("获得租户分页") @PreAuthorize("@ss.hasPermission('system:tenant:query')") public CommonResult> getTenantPage(@Valid TenantPageReqVO pageVO) { - PageResult pageResult = tenantService.getTenantPage(pageVO); + PageResult pageResult = tenantService.getTenantPage(pageVO); return success(TenantConvert.INSTANCE.convertPage(pageResult)); } @@ -96,7 +96,7 @@ public class TenantController { @OperateLog(type = EXPORT) public void exportTenantExcel(@Valid TenantExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = tenantService.getTenantList(exportReqVO); + List list = tenantService.getTenantList(exportReqVO); // 导出 Excel List datas = TenantConvert.INSTANCE.convertList02(list); ExcelUtils.write(response, "租户.xls", "数据", TenantExcelVO.class, datas); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExportReqVO.java index afe5e67000..839239406b 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/TenantExportReqVO.java @@ -9,7 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "管理后台 - 租户 Excel 导出 Request VO", description = "参数和 SysTenantPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 租户 Excel 导出 Request VO", description = "参数和 TenantPageReqVO 是一致的") @Data public class TenantExportReqVO { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 7afe691a28..fbba577306 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -3,11 +3,11 @@ package cn.iocoder.yudao.module.system.controller.admin.user; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.module.system.convert.user.UserConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; -import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.enums.common.SexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -98,7 +98,7 @@ public class UserController { // 获得拼接需要的数据 Collection deptIds = convertList(pageResult.getList(), AdminUserDO::getDeptId); - Map deptMap = deptService.getDeptMap(deptIds); + Map deptMap = deptService.getDeptMap(deptIds); // 拼接结果返回 List userList = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(user -> { @@ -137,9 +137,9 @@ public class UserController { // 获得拼接需要的数据 Collection deptIds = convertList(users, AdminUserDO::getDeptId); - Map deptMap = deptService.getDeptMap(deptIds); + Map deptMap = deptService.getDeptMap(deptIds); Map deptLeaderUserMap = userService.getUserMap( - convertSet(deptMap.values(), SysDeptDO::getLeaderUserId)); + convertSet(deptMap.values(), DeptDO::getLeaderUserId)); // 拼接数据 List excelUsers = new ArrayList<>(users.size()); users.forEach(user -> { @@ -164,9 +164,9 @@ public class UserController { // 手动创建导出 demo List list = Arrays.asList( UserImportExcelVO.builder().username("yudao").deptId(1L).email("yudao@iocoder.cn").mobile("15601691300") - .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SysSexEnum.MALE.getSex()).build(), + .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") - .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SysSexEnum.FEMALE.getSex()).build() + .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() ); // 输出 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java index 11d419feaf..b46254713c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java @@ -5,16 +5,16 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfi import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.convert.user.UserConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.permission.RoleService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; -import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; import cn.iocoder.yudao.module.system.service.social.SocialUserService; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; @@ -67,16 +67,16 @@ public class UserProfileController { resp.setRoles(UserConvert.INSTANCE.convertList(userRoles)); // 获得部门信息 if (user.getDeptId() != null) { - SysDeptDO dept = deptService.getDept(user.getDeptId()); + DeptDO dept = deptService.getDept(user.getDeptId()); resp.setDept(UserConvert.INSTANCE.convert02(dept)); } // 获得岗位信息 if (CollUtil.isNotEmpty(user.getPostIds())) { - List posts = postService.getPosts(user.getPostIds()); + List posts = postService.getPosts(user.getPostIds()); resp.setPosts(UserConvert.INSTANCE.convertList02(posts)); } // 获得社交用户信息 - List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN.getValue()); + List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN.getValue()); resp.setSocialUsers(UserConvert.INSTANCE.convertList03(socialUsers)); return success(resp); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java index 788c91feb2..c0b77f0f2d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java @@ -22,7 +22,7 @@ public class UserProfileRespVO extends UserBaseVO { @ApiModelProperty(value = "用户编号", required = true, example = "1") private Long id; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "最后登录 IP", required = true, example = "192.168.1.1") @@ -93,7 +93,7 @@ public class UserProfileRespVO extends UserBaseVO { @Data public static class SocialUser { - @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysSocialTypeEnum 枚举类") + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SocialTypeEnum 枚举类") private Integer type; @ApiModelProperty(value = "社交的全局编号", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java index 4f0f8f9531..3716f4727a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java @@ -25,7 +25,7 @@ public class UserProfileUpdateReqVO { @Length(min = 11, max = 11, message = "手机号长度必须 11 位") private String mobile; - @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SexEnum 枚举类") private Integer sex; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserBaseVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserBaseVO.java index a4be1fd8dd..985783f0b9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserBaseVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserBaseVO.java @@ -43,10 +43,10 @@ public class UserBaseVO { @Length(min = 11, max = 11, message = "手机号长度必须 11 位") private String mobile; - @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SexEnum 枚举类") private Integer sex; - @ApiModelProperty(value = "用户头像", example = "http://www.iocoder.cn/xxx.png") + @ApiModelProperty(value = "用户头像", example = "https://www.iocoder.cn/xxx.png") private String avatar; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExportReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExportReqVO.java index 1c1044a5cd..a25ba0b0f4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExportReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserExportReqVO.java @@ -11,7 +11,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "管理后台 - 用户导出 Request VO", description = "参数和 SysUserPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 用户导出 Request VO", description = "参数和 UserPageReqVO 是一致的") @Data @NoArgsConstructor @AllArgsConstructor @@ -23,7 +23,7 @@ public class UserExportReqVO { @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配") private String mobile; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "开始时间", example = "2020-10-24") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java index 1c6073d168..00f20eb4d8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java @@ -26,7 +26,7 @@ public class UserPageReqVO extends PageParam { @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配") private String mobile; - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "开始时间", example = "2020-10-24") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java index fb50609b02..b4525a5553 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java @@ -16,7 +16,7 @@ public class UserRespVO extends UserBaseVO { @ApiModelProperty(value = "用户编号", required = true, example = "1") private Long id; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") private Integer status; @ApiModelProperty(value = "最后登录 IP", required = true, example = "192.168.1.1") diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java index f72897527e..2c7a83f22d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java @@ -14,9 +14,9 @@ public class UserUpdateStatusReqVO { @NotNull(message = "角色编号不能为空") private Long id; - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") @NotNull(message = "状态不能为空") -// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") private Integer status; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java index b287d8adc4..d30dfdcbb4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/UserSessionConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.convert.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageItemRespVO; -import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.UserSessionDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -10,6 +10,6 @@ public interface UserSessionConvert { UserSessionConvert INSTANCE = Mappers.getMapper(UserSessionConvert.class); - UserSessionPageItemRespVO convert(SysUserSessionDO session); + UserSessionPageItemRespVO convert(UserSessionDO session); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java index cd66acd9fa..8d921131c7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateRe import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -15,14 +15,14 @@ public interface DeptConvert { DeptConvert INSTANCE = Mappers.getMapper(DeptConvert.class); - List convertList(List list); + List convertList(List list); - List convertList02(List list); + List convertList02(List list); - DeptRespVO convert(SysDeptDO bean); + DeptRespVO convert(DeptDO bean); - SysDeptDO convert(DeptCreateReqVO bean); + DeptDO convert(DeptCreateReqVO bean); - SysDeptDO convert(DeptUpdateReqVO bean); + DeptDO convert(DeptUpdateReqVO bean); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java index d3680dae51..86a548edbe 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/PostConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.convert.dept; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.*; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -13,16 +13,16 @@ public interface PostConvert { PostConvert INSTANCE = Mappers.getMapper(PostConvert.class); - List convertList02(List list); + List convertList02(List list); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - PostRespVO convert(SysPostDO id); + PostRespVO convert(PostDO id); - SysPostDO convert(PostCreateReqVO bean); + PostDO convert(PostCreateReqVO bean); - SysPostDO convert(PostUpdateReqVO reqVO); + PostDO convert(PostUpdateReqVO reqVO); - List convertList03(List list); + List convertList03(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java index 94f67657fe..215f252e79 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/DictDataConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.convert.dict; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.*; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; import org.mapstruct.Mapper; @@ -15,20 +15,20 @@ public interface DictDataConvert { DictDataConvert INSTANCE = Mappers.getMapper(DictDataConvert.class); - List convertList(List list); + List convertList(List list); - DictDataRespVO convert(SysDictDataDO bean); + DictDataRespVO convert(DictDataDO bean); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - SysDictDataDO convert(DictDataUpdateReqVO bean); + DictDataDO convert(DictDataUpdateReqVO bean); - SysDictDataDO convert(DictDataCreateReqVO bean); + DictDataDO convert(DictDataCreateReqVO bean); - List convertList02(List bean); + List convertList02(List bean); - DictDataRespDTO convert02(SysDictDataDO bean); + DictDataRespDTO convert02(DictDataDO bean); - List convertList03(Collection list); + List convertList03(Collection list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataCoreConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataCoreConvert.java deleted file mode 100644 index c61d654cff..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dict/SysDictDataCoreConvert.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.dict; - -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysDictDataCoreConvert { - - SysDictDataCoreConvert INSTANCE = Mappers.getMapper(SysDictDataCoreConvert.class); - - DictDataRespDTO convert02(SysDictDataDO bean); - - List convertList03(Collection list); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java index 3208276ccb..ea50d4b095 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/LoginLogConvert.java @@ -1,9 +1,10 @@ package cn.iocoder.yudao.module.system.convert.logger; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExcelVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.LoginLogDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -14,8 +15,10 @@ public interface LoginLogConvert { LoginLogConvert INSTANCE = Mappers.getMapper(LoginLogConvert.class); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - List convertList(List list); + List convertList(List list); + + LoginLogDO convert(LoginLogCreateReqDTO bean); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java deleted file mode 100644 index 70b5dfff02..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/SysLoginLogCoreConvert.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.module.system.convert.logger; - -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SysLoginLogCoreConvert { - - SysLoginLogCoreConvert INSTANCE = Mappers.getMapper(SysLoginLogCoreConvert.class); - - SysLoginLogDO convert(LoginLogCreateReqDTO bean); - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java index 6979ed0027..0776c58f60 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsChannelConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannel import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelRespVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelSimpleRespVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; import org.mapstruct.Mapper; @@ -22,18 +22,18 @@ public interface SmsChannelConvert { SmsChannelConvert INSTANCE = Mappers.getMapper(SmsChannelConvert.class); - SysSmsChannelDO convert(SmsChannelCreateReqVO bean); + SmsChannelDO convert(SmsChannelCreateReqVO bean); - SysSmsChannelDO convert(SmsChannelUpdateReqVO bean); + SmsChannelDO convert(SmsChannelUpdateReqVO bean); - SmsChannelRespVO convert(SysSmsChannelDO bean); + SmsChannelRespVO convert(SmsChannelDO bean); - List convertList(List list); + List convertList(List list); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - List convertList02(List list); + List convertList02(List list); - List convertList03(List list); + List convertList03(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java index 425ac31977..40efe60a1e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsLogConvert.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.convert.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExcelVO; -import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SysSmsLogRespVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -19,12 +19,12 @@ public interface SmsLogConvert { SmsLogConvert INSTANCE = Mappers.getMapper(SmsLogConvert.class); - SysSmsLogRespVO convert(SysSmsLogDO bean); + SmsLogRespVO convert(SmsLogDO bean); - List convertList(List list); + List convertList(List list); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - List convertList02(List list); + List convertList02(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java index 8cca0f01fa..b0fb02b8f9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sms/SmsTemplateConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExcelVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateRespVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -16,16 +16,16 @@ public interface SmsTemplateConvert { SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class); - SysSmsTemplateDO convert(SmsTemplateCreateReqVO bean); + SmsTemplateDO convert(SmsTemplateCreateReqVO bean); - SysSmsTemplateDO convert(SmsTemplateUpdateReqVO bean); + SmsTemplateDO convert(SmsTemplateUpdateReqVO bean); - SmsTemplateRespVO convert(SysSmsTemplateDO bean); + SmsTemplateRespVO convert(SmsTemplateDO bean); - List convertList(List list); + List convertList(List list); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - List convertList02(List list); + List convertList02(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java index 53de4517ad..afc05a92f8 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReq import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExcelVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantRespVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -21,16 +21,16 @@ public interface TenantConvert { TenantConvert INSTANCE = Mappers.getMapper(TenantConvert.class); - SysTenantDO convert(TenantCreateReqVO bean); + TenantDO convert(TenantCreateReqVO bean); - SysTenantDO convert(TenantUpdateReqVO bean); + TenantDO convert(TenantUpdateReqVO bean); - TenantRespVO convert(SysTenantDO bean); + TenantRespVO convert(TenantDO bean); - List convertList(List list); + List convertList(List list); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - List convertList02(List list); + List convertList02(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java index 9e4aaddbfd..cf2b1692b7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java @@ -4,10 +4,10 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfi import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; -import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -21,7 +21,7 @@ public interface UserConvert { UserPageItemRespVO convert(AdminUserDO bean); - UserPageItemRespVO.Dept convert(SysDeptDO bean); + UserPageItemRespVO.Dept convert(DeptDO bean); AdminUserDO convert(UserCreateReqVO bean); @@ -35,15 +35,15 @@ public interface UserConvert { List convertList(List list); - UserProfileRespVO.Dept convert02(SysDeptDO bean); + UserProfileRespVO.Dept convert02(DeptDO bean); AdminUserDO convert(UserProfileUpdateReqVO bean); AdminUserDO convert(UserProfileUpdatePasswordReqVO bean); - List convertList02(List list); + List convertList02(List list); - List convertList03(List list); + List convertList03(List list); List convertList04(List list); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/SysUserSessionDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/UserSessionDO.java similarity index 82% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/SysUserSessionDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/UserSessionDO.java index 9de10295ba..01885004ee 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/SysUserSessionDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/UserSessionDO.java @@ -17,15 +17,15 @@ import java.util.Date; * * 我们已经将 {@link LoginUser} 缓存在 Redis 当中。 * 这里额外存储在线用户到 MySQL 中,目的是为了方便管理界面可以灵活查询。 - * 同时,通过定时轮询 SysUserSessionDO 表,可以主动删除 Redis 的缓存,因为 Redis 的过期删除是延迟的。 + * 同时,通过定时轮询 UserSessionDO 表,可以主动删除 Redis 的缓存,因为 Redis 的过期删除是延迟的。 * * @author 芋道源码 */ -@TableName(value = "sys_user_session", autoResultMap = true) +@TableName(value = "system_user_session", autoResultMap = true) @Data @Builder @EqualsAndHashCode(callSuper = true) -public class SysUserSessionDO extends TenantBaseDO { +public class UserSessionDO extends TenantBaseDO { /** * 会话编号, 即 sessionId @@ -35,7 +35,7 @@ public class SysUserSessionDO extends TenantBaseDO { /** * 用户编号 * - * 关联 SysUserDO.id 或者 MbrUserDO.id + * 关联 AdminUserDO.id 或者 MemberUserDO.id */ private Long userId; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java similarity index 94% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java index 9840a2c30e..557a1f36f8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysDeptDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java @@ -14,10 +14,10 @@ import lombok.EqualsAndHashCode; * @author ruoyi * @author 芋道源码 */ -@TableName("sys_dept") +@TableName("system_dept") @Data @EqualsAndHashCode(callSuper = true) -public class SysDeptDO extends TenantBaseDO { +public class DeptDO extends TenantBaseDO { /** * 部门ID diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysPostDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/PostDO.java similarity index 92% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysPostDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/PostDO.java index 233ba361be..ba9074d034 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/SysPostDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/PostDO.java @@ -12,10 +12,10 @@ import lombok.EqualsAndHashCode; * * @author ruoyi */ -@TableName("sys_post") +@TableName("system_post") @Data @EqualsAndHashCode(callSuper = true) -public class SysPostDO extends TenantBaseDO { +public class PostDO extends TenantBaseDO { /** * 岗位序号 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictDataDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/DictDataDO.java similarity index 88% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictDataDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/DictDataDO.java index fe12ce472b..1b5cee4e4e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/SysDictDataDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/DictDataDO.java @@ -12,10 +12,10 @@ import lombok.EqualsAndHashCode; * * @author ruoyi */ -@TableName("sys_dict_data") +@TableName("system_dict_data") @Data @EqualsAndHashCode(callSuper = true) -public class SysDictDataDO extends BaseDO { +public class DictDataDO extends BaseDO { /** * 字典数据编号 @@ -37,7 +37,7 @@ public class SysDictDataDO extends BaseDO { /** * 字典类型 * - * 冗余 {@link SysDictDataDO#getDictType()} + * 冗余 {@link DictDataDO#getDictType()} */ private String dictType; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/LoginLogDO.java similarity index 95% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/LoginLogDO.java index 3037d094bd..66a81443bf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/SysLoginLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/LoginLogDO.java @@ -16,11 +16,11 @@ import lombok.ToString; * * @author 芋道源码 */ -@TableName("sys_login_log") +@TableName("system_login_log") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysLoginLogDO extends BaseDO { +public class LoginLogDO extends BaseDO { /** * 日志主键 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java index 1920a68e24..2915efa4cb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java @@ -34,7 +34,7 @@ public class MenuDO extends BaseDO { * 一般格式为:${系统}:${模块}:${操作} * 例如说:system:admin:add,即 system 服务的添加管理员。 * - * 当我们把该 SysMenuDO 赋予给角色后,意味着该角色有该资源: + * 当我们把该 MenuDO 赋予给角色后,意味着该角色有该资源: * - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 */ diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsChannelDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsChannelDO.java similarity index 91% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsChannelDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsChannelDO.java index 57fe9789e2..5e6b8c4191 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsChannelDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsChannelDO.java @@ -14,11 +14,11 @@ import lombok.ToString; * @author zzf * @since 2021-01-25 */ -@TableName(value = "sys_sms_channel", autoResultMap = true) +@TableName(value = "system_sms_channel", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsChannelDO extends BaseDO { +public class SmsChannelDO extends BaseDO { /** * 渠道编号 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsLogDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsLogDO.java similarity index 81% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsLogDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsLogDO.java index a6daa0c742..441f6ad178 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsLogDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsLogDO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.sms; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsSendStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsReceiveStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsSendStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; @@ -19,14 +19,14 @@ import java.util.Map; * @author zzf * @since 2021-01-25 */ -@TableName(value = "sys_sms_log", autoResultMap = true) +@TableName(value = "system_sms_log", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @AllArgsConstructor @NoArgsConstructor -public class SysSmsLogDO extends BaseDO { +public class SmsLogDO extends BaseDO { /** * 自增编号 @@ -38,13 +38,13 @@ public class SysSmsLogDO extends BaseDO { /** * 短信渠道编号 * - * 关联 {@link SysSmsChannelDO#getId()} + * 关联 {@link SmsChannelDO#getId()} */ private Long channelId; /** * 短信渠道编码 * - * 冗余 {@link SysSmsChannelDO#getCode()} + * 冗余 {@link SmsChannelDO#getCode()} */ private String channelCode; @@ -53,34 +53,34 @@ public class SysSmsLogDO extends BaseDO { /** * 模板编号 * - * 关联 {@link SysSmsTemplateDO#getId()} + * 关联 {@link SmsTemplateDO#getId()} */ private Long templateId; /** * 模板编码 * - * 冗余 {@link SysSmsTemplateDO#getCode()} + * 冗余 {@link SmsTemplateDO#getCode()} */ private String templateCode; /** * 短信类型 * - * 冗余 {@link SysSmsTemplateDO#getType()} + * 冗余 {@link SmsTemplateDO#getType()} */ private Integer templateType; /** - * 基于 {@link SysSmsTemplateDO#getContent()} 格式化后的内容 + * 基于 {@link SmsTemplateDO#getContent()} 格式化后的内容 */ private String templateContent; /** - * 基于 {@link SysSmsTemplateDO#getParams()} 输入后的参数 + * 基于 {@link SmsTemplateDO#getParams()} 输入后的参数 */ @TableField(typeHandler = JacksonTypeHandler.class) private Map templateParams; /** * 短信 API 的模板编号 * - * 冗余 {@link SysSmsTemplateDO#getApiTemplateId()} + * 冗余 {@link SmsTemplateDO#getApiTemplateId()} */ private String apiTemplateId; @@ -106,7 +106,7 @@ public class SysSmsLogDO extends BaseDO { /** * 发送状态 * - * 枚举 {@link SysSmsSendStatusEnum} + * 枚举 {@link SmsSendStatusEnum} */ private Integer sendStatus; /** @@ -154,7 +154,7 @@ public class SysSmsLogDO extends BaseDO { /** * 接收状态 * - * 枚举 {@link SysSmsReceiveStatusEnum} + * 枚举 {@link SmsReceiveStatusEnum} */ private Integer receiveStatus; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsTemplateDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsTemplateDO.java similarity index 83% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsTemplateDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsTemplateDO.java index 72fcafcd97..54c2098681 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SysSmsTemplateDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsTemplateDO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.dataobject.sms; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsTemplateTypeEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsTemplateTypeEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; @@ -18,11 +18,11 @@ import java.util.List; * @author zzf * @since 2021-01-25 */ -@TableName(value = "sys_sms_template", autoResultMap = true) +@TableName(value = "system_sms_template", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class SysSmsTemplateDO extends BaseDO { +public class SmsTemplateDO extends BaseDO { /** * 自增编号 @@ -34,7 +34,7 @@ public class SysSmsTemplateDO extends BaseDO { /** * 短信类型 * - * 枚举 {@link SysSmsTemplateTypeEnum} + * 枚举 {@link SmsTemplateTypeEnum} */ private Integer type; /** @@ -76,13 +76,13 @@ public class SysSmsTemplateDO extends BaseDO { /** * 短信渠道编号 * - * 关联 {@link SysSmsChannelDO#getId()} + * 关联 {@link SmsChannelDO#getId()} */ private Long channelId; /** * 短信渠道编码 * - * 冗余 {@link SysSmsChannelDO#getCode()} + * 冗余 {@link SmsChannelDO#getCode()} */ private String channelCode; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SocialUserDO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SocialUserDO.java index bca1964fe3..9572f1e939 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SysSocialUserDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SocialUserDO.java @@ -9,17 +9,17 @@ import lombok.*; /** * 社交用户 - * 通过 {@link SysSocialUserDO#getUserId()} 关联到对应的 {@link AdminUserDO} + * 通过 {@link SocialUserDO#getUserId()} 关联到对应的 {@link AdminUserDO} * * @author weir */ -@TableName(value = "sys_social_user", autoResultMap = true) +@TableName(value = "system_social_user", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class SysSocialUserDO extends BaseDO { +public class SocialUserDO extends BaseDO { /** * 自增主键 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/SysTenantDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantDO.java similarity index 89% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/SysTenantDO.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantDO.java index ebff2004ce..99a658e094 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/SysTenantDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantDO.java @@ -10,14 +10,14 @@ import lombok.*; * * @author 芋道源码 */ -@TableName(value = "sys_tenant", autoResultMap = true) +@TableName(value = "system_tenant", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @AllArgsConstructor @NoArgsConstructor -public class SysTenantDO extends BaseDO { +public class TenantDO extends BaseDO { /** * 租户编号,自增 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java index 85e2dfb905..870ad30fce 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.dataobject.user; -import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.enums.common.SexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; @@ -18,7 +18,7 @@ import java.util.Set; * * @author 芋道源码 */ -@TableName(value = "sys_user", autoResultMap = true) +@TableName(value = "system_user", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @Builder @@ -69,7 +69,7 @@ public class AdminUserDO extends TenantBaseDO { /** * 用户性别 * - * 枚举类 {@link SysSexEnum} + * 枚举类 {@link SexEnum} */ private Integer sex; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionCoreMapper.java deleted file mode 100644 index a589d1e9e2..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionCoreMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.auth; - -import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SysUserSessionCoreMapper extends BaseMapperX { - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/UserSessionMapper.java similarity index 54% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/UserSessionMapper.java index 23e0ba1e5d..1b7f31be33 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/SysUserSessionMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/auth/UserSessionMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.auth; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.UserSessionDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; @@ -12,16 +12,16 @@ import java.util.Date; import java.util.List; @Mapper -public interface SysUserSessionMapper extends BaseMapperX { +public interface UserSessionMapper extends BaseMapperX { - default PageResult selectPage(UserSessionPageReqVO reqVO, Collection userIds) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(UserSessionPageReqVO reqVO, Collection userIds) { + return selectPage(reqVO, new QueryWrapperX() .inIfPresent("user_id", userIds) .likeIfPresent("user_ip", reqVO.getUserIp())); } - default List selectListBySessionTimoutLt() { - return selectList(new QueryWrapperX().lt("session_timeout",new Date())); + default List selectListBySessionTimoutLt() { + return selectList(new QueryWrapperX().lt("session_timeout",new Date())); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java similarity index 51% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java index e2d0678e7d..3f76709c82 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -13,26 +13,26 @@ import java.util.Date; import java.util.List; @Mapper -public interface SysDeptMapper extends BaseMapperX { +public interface DeptMapper extends BaseMapperX { - default List selectList(DeptListReqVO reqVO) { - return selectList(new LambdaQueryWrapperX().likeIfPresent(SysDeptDO::getName, reqVO.getName()) - .eqIfPresent(SysDeptDO::getStatus, reqVO.getStatus())); + default List selectList(DeptListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX().likeIfPresent(DeptDO::getName, reqVO.getName()) + .eqIfPresent(DeptDO::getStatus, reqVO.getStatus())); } - default SysDeptDO selectByParentIdAndName(Long parentId, String name) { - return selectOne(new LambdaQueryWrapper().eq(SysDeptDO::getParentId, parentId) - .eq(SysDeptDO::getName, name)); + default DeptDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(new LambdaQueryWrapper().eq(DeptDO::getParentId, parentId) + .eq(DeptDO::getName, name)); } default Integer selectCountByParentId(Long parentId) { - return selectCount(SysDeptDO::getParentId, parentId); + return selectCount(DeptDO::getParentId, parentId); } @InterceptorIgnore(tenantLine = "on") // 该方法忽略多租户。原因:该方法被异步 task 调用,此时获取不到租户编号 default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new LambdaQueryWrapper().select(SysDeptDO::getId) - .gt(SysDeptDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null; + return selectOne(new LambdaQueryWrapper().select(DeptDO::getId) + .gt(DeptDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null; } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/PostMapper.java similarity index 55% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/PostMapper.java index 1a5665863e..ecbd75949b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/PostMapper.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -13,33 +13,33 @@ import java.util.Collection; import java.util.List; @Mapper -public interface SysPostMapper extends BaseMapperX { +public interface PostMapper extends BaseMapperX { - default List selectList(Collection ids, Collection statuses) { - return selectList(new QueryWrapperX().inIfPresent("id", ids) + default List selectList(Collection ids, Collection statuses) { + return selectList(new QueryWrapperX().inIfPresent("id", ids) .inIfPresent("status", statuses)); } - default PageResult selectPage(PostPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(PostPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("code", reqVO.getCode()) .likeIfPresent("name", reqVO.getName()) .eqIfPresent("status", reqVO.getStatus())); } - default List selectList(PostExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(PostExportReqVO reqVO) { + return selectList(new QueryWrapperX() .likeIfPresent("code", reqVO.getCode()) .likeIfPresent("name", reqVO.getName()) .eqIfPresent("status", reqVO.getStatus())); } - default SysPostDO selectByName(String name) { - return selectOne(new QueryWrapper().eq("name", name)); + default PostDO selectByName(String name) { + return selectOne(new QueryWrapper().eq("name", name)); } - default SysPostDO selectByCode(String code) { - return selectOne(new QueryWrapper().eq("code", code)); + default PostDO selectByCode(String code) { + return selectOne(new QueryWrapper().eq("code", code)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptCoreMapper.java deleted file mode 100644 index 489733bbf5..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysDeptCoreMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.dept; - -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SysDeptCoreMapper extends BaseMapperX { -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostCoreMapper.java deleted file mode 100644 index 5ce2d21523..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/SysPostCoreMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.dept; - -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SysPostCoreMapper extends BaseMapperX { -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictDataMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictDataMapper.java new file mode 100644 index 0000000000..07462fc44a --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictDataMapper.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.system.dal.mysql.dict; + +import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface DictDataMapper extends BaseMapperX { + + default DictDataDO selectByDictTypeAndValue(String dictType, String value) { + return selectOne(new LambdaQueryWrapper().eq(DictDataDO::getDictType, dictType) + .eq(DictDataDO::getValue, value)); + } + + default List selectByDictTypeAndValues(String dictType, Collection values) { + return selectList(new LambdaQueryWrapper().eq(DictDataDO::getDictType, dictType) + .in(DictDataDO::getValue, values)); + } + + default int selectCountByDictType(String dictType) { + return selectCount(DictDataDO::getDictType, dictType); + } + + default PageResult selectPage(DictDataPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DictDataDO::getLabel, reqVO.getLabel()) + .likeIfPresent(DictDataDO::getDictType, reqVO.getDictType()) + .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus()) + .orderByAsc(Arrays.asList(DictDataDO::getDictType, DictDataDO::getSort))); + } + + default List selectList(DictDataExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX().likeIfPresent(DictDataDO::getLabel, reqVO.getLabel()) + .likeIfPresent(DictDataDO::getDictType, reqVO.getDictType()) + .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus())); + } + + default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { + return selectOne(new LambdaQueryWrapper().select(DictDataDO::getId) + .gt(DictDataDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null; + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictTypeMapper.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictTypeMapper.java index de3d700af8..11b9d5f3e9 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictTypeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictTypeMapper.java @@ -11,7 +11,7 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface SysDictTypeMapper extends BaseMapperX { +public interface DictTypeMapper extends BaseMapperX { default PageResult selectPage(DictTypePageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java deleted file mode 100644 index 602a77342a..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/SysDictDataMapper.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.dict; - -import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; -import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; -import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.List; - -@Mapper -public interface SysDictDataMapper extends BaseMapperX { - - default SysDictDataDO selectByDictTypeAndValue(String dictType, String value) { - return selectOne(new LambdaQueryWrapper().eq(SysDictDataDO::getDictType, dictType) - .eq(SysDictDataDO::getValue, value)); - } - - default List selectByDictTypeAndValues(String dictType, Collection values) { - return selectList(new LambdaQueryWrapper().eq(SysDictDataDO::getDictType, dictType) - .in(SysDictDataDO::getValue, values)); - } - - default int selectCountByDictType(String dictType) { - return selectCount(SysDictDataDO::getDictType, dictType); - } - - default PageResult selectPage(DictDataPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(SysDictDataDO::getLabel, reqVO.getLabel()) - .likeIfPresent(SysDictDataDO::getDictType, reqVO.getDictType()) - .eqIfPresent(SysDictDataDO::getStatus, reqVO.getStatus()) - .orderByAsc(Arrays.asList(SysDictDataDO::getDictType, SysDictDataDO::getSort))); - } - - default List selectList(DictDataExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX().likeIfPresent(SysDictDataDO::getLabel, reqVO.getLabel()) - .likeIfPresent(SysDictDataDO::getDictType, reqVO.getDictType()) - .eqIfPresent(SysDictDataDO::getStatus, reqVO.getStatus())); - } - - default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new LambdaQueryWrapper().select(SysDictDataDO::getId) - .gt(SysDictDataDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null; - } - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/ErrorCodeMapper.java similarity index 97% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/ErrorCodeMapper.java index 4924c6e872..ab514bd225 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/SysErrorCodeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/errorcode/ErrorCodeMapper.java @@ -14,7 +14,7 @@ import java.util.Date; import java.util.List; @Mapper -public interface SysErrorCodeMapper extends BaseMapperX { +public interface ErrorCodeMapper extends BaseMapperX { default PageResult selectPage(ErrorCodePageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java index 8473caccf9..a2731a5f6f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.dal.mysql.logger; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.LoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; @@ -12,10 +12,10 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface LoginLogMapper extends BaseMapperX { +public interface LoginLogMapper extends BaseMapperX { - default PageResult selectPage(LoginLogPageReqVO reqVO) { - QueryWrapperX query = new QueryWrapperX() + default PageResult selectPage(LoginLogPageReqVO reqVO) { + QueryWrapperX query = new QueryWrapperX() .likeIfPresent("user_ip", reqVO.getUserIp()) .likeIfPresent("username", reqVO.getUsername()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()); @@ -28,8 +28,8 @@ public interface LoginLogMapper extends BaseMapperX { return selectPage(reqVO, query); } - default List selectList(LoginLogExportReqVO reqVO) { - QueryWrapperX query = new QueryWrapperX() + default List selectList(LoginLogExportReqVO reqVO) { + QueryWrapperX query = new QueryWrapperX() .likeIfPresent("user_ip", reqVO.getUserIp()) .likeIfPresent("username", reqVO.getUsername()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()); diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogCoreMapper.java deleted file mode 100644 index 6ef40e8346..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/SysLoginLogCoreMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.logger; - -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SysLoginLogCoreMapper extends BaseMapperX { - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/NoticeMapper.java similarity index 91% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/NoticeMapper.java index 6c6a305189..9f077918b2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/SysNoticeMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/NoticeMapper.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SysNoticeMapper extends BaseMapperX { +public interface NoticeMapper extends BaseMapperX { default PageResult selectPage(NoticePageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java index f77294f35f..02008bce82 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java @@ -42,7 +42,7 @@ public interface RoleMenuMapper extends BaseMapperX { delete(new QueryWrapper().eq("role_id", roleId)); } - @Select("SELECT id FROM sys_role_menu WHERE update_time > #{maxUpdateTime} LIMIT 1") + @Select("SELECT id FROM system_role_menu WHERE update_time > #{maxUpdateTime} LIMIT 1") Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsChannelMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsChannelMapper.java index 9f2f023565..7b0c9f6f9b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsChannelMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsChannelMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; @@ -11,17 +11,17 @@ import org.apache.ibatis.annotations.Select; import java.util.Date; @Mapper -public interface SmsChannelMapper extends BaseMapperX { +public interface SmsChannelMapper extends BaseMapperX { - default PageResult selectPage(SmsChannelPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(SmsChannelPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("signature", reqVO.getSignature()) .eqIfPresent("status", reqVO.getStatus()) .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) .orderByDesc("id")); } - @Select("SELECT id FROM sys_sms_channel WHERE update_time > #{maxUpdateTime} LIMIT 1") + @Select("SELECT id FROM system_sms_channel WHERE update_time > #{maxUpdateTime} LIMIT 1") Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java index f941a0f855..01ea77a46b 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; @@ -11,10 +11,10 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface SmsLogMapper extends BaseMapperX { +public interface SmsLogMapper extends BaseMapperX { - default PageResult selectPage(SmsLogPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(SmsLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .eqIfPresent("channel_id", reqVO.getChannelId()) .eqIfPresent("template_id", reqVO.getTemplateId()) .likeIfPresent("mobile", reqVO.getMobile()) @@ -25,8 +25,8 @@ public interface SmsLogMapper extends BaseMapperX { .orderByDesc("id")); } - default List selectList(SmsLogExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(SmsLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() .eqIfPresent("channel_id", reqVO.getChannelId()) .eqIfPresent("template_id", reqVO.getTemplateId()) .likeIfPresent("mobile", reqVO.getMobile()) diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsTemplateMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsTemplateMapper.java index d98e6fc5f8..daf9882f0e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsTemplateMapper.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsTemplateMapper.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @@ -13,41 +13,41 @@ import java.util.Date; import java.util.List; @Mapper -public interface SmsTemplateMapper extends BaseMapperX { +public interface SmsTemplateMapper extends BaseMapperX { - @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1") + @Select("SELECT id FROM system_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1") Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); - default SysSmsTemplateDO selectByCode(String code) { - return selectOne(SysSmsTemplateDO::getCode, code); + default SmsTemplateDO selectByCode(String code) { + return selectOne(SmsTemplateDO::getCode, code); } - default PageResult selectPage(SmsTemplatePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(SysSmsTemplateDO::getType, reqVO.getType()) - .eqIfPresent(SysSmsTemplateDO::getStatus, reqVO.getStatus()) - .likeIfPresent(SysSmsTemplateDO::getCode, reqVO.getCode()) - .likeIfPresent(SysSmsTemplateDO::getContent, reqVO.getContent()) - .likeIfPresent(SysSmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) - .eqIfPresent(SysSmsTemplateDO::getChannelId, reqVO.getChannelId()) - .betweenIfPresent(SysSmsTemplateDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc(SysSmsTemplateDO::getId)); + default PageResult selectPage(SmsTemplatePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SmsTemplateDO::getType, reqVO.getType()) + .eqIfPresent(SmsTemplateDO::getStatus, reqVO.getStatus()) + .likeIfPresent(SmsTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(SmsTemplateDO::getContent, reqVO.getContent()) + .likeIfPresent(SmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) + .eqIfPresent(SmsTemplateDO::getChannelId, reqVO.getChannelId()) + .betweenIfPresent(SmsTemplateDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc(SmsTemplateDO::getId)); } - default List selectList(SmsTemplateExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .eqIfPresent(SysSmsTemplateDO::getType, reqVO.getType()) - .eqIfPresent(SysSmsTemplateDO::getStatus, reqVO.getStatus()) - .likeIfPresent(SysSmsTemplateDO::getCode, reqVO.getCode()) - .likeIfPresent(SysSmsTemplateDO::getContent, reqVO.getContent()) - .likeIfPresent(SysSmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) - .eqIfPresent(SysSmsTemplateDO::getChannelId, reqVO.getChannelId()) - .betweenIfPresent(SysSmsTemplateDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc(SysSmsTemplateDO::getId)); + default List selectList(SmsTemplateExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SmsTemplateDO::getType, reqVO.getType()) + .eqIfPresent(SmsTemplateDO::getStatus, reqVO.getStatus()) + .likeIfPresent(SmsTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(SmsTemplateDO::getContent, reqVO.getContent()) + .likeIfPresent(SmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) + .eqIfPresent(SmsTemplateDO::getChannelId, reqVO.getChannelId()) + .betweenIfPresent(SmsTemplateDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc(SmsTemplateDO::getId)); } default Integer selectCountByChannelId(Long channelId) { - return selectCount(SysSmsTemplateDO::getChannelId, channelId); + return selectCount(SmsTemplateDO::getChannelId, channelId); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialUserMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialUserMapper.java new file mode 100644 index 0000000000..3322ab8403 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialUserMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.dal.mysql.social; + +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface SocialUserMapper extends BaseMapperX { + + default List selectListByTypeAndUnionId(Integer userType, Collection types, String unionId) { + return selectList(new QueryWrapper().eq("user_type", userType) + .in("type", types).eq("union_id", unionId)); + } + + default List selectListByTypeAndUserId(Integer userType, Collection types, Long userId) { + return selectList(new QueryWrapper().eq("user_type", userType) + .in("type", types).eq("user_id", userId)); + } + + default List selectListByUserId(Integer userType, Long userId) { + return selectList(new QueryWrapper().eq("user_type", userType).eq("user_id", userId)); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SysSocialUserMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SysSocialUserMapper.java deleted file mode 100644 index dc92ddb304..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SysSocialUserMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.social; - -import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysSocialUserMapper extends BaseMapperX { - - default List selectListByTypeAndUnionId(Integer userType, Collection types, String unionId) { - return selectList(new QueryWrapper().eq("user_type", userType) - .in("type", types).eq("union_id", unionId)); - } - - default List selectListByTypeAndUserId(Integer userType, Collection types, Long userId) { - return selectList(new QueryWrapper().eq("user_type", userType) - .in("type", types).eq("user_id", userId)); - } - - default List selectListByUserId(Integer userType, Long userId) { - return selectList(new QueryWrapper().eq("user_type", userType).eq("user_id", userId)); - } - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantCoreMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantCoreMapper.java deleted file mode 100644 index de7656f400..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantCoreMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.tenant; - -import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SysTenantCoreMapper extends BaseMapperX { -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java deleted file mode 100755 index f913d625df..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/SysTenantMapper.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.mysql.tenant; - -import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; -import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 租户 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface SysTenantMapper extends BaseMapperX { - - default PageResult selectPage(TenantPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(SysTenantDO::getName, reqVO.getName()) - .likeIfPresent(SysTenantDO::getContactName, reqVO.getContactName()) - .likeIfPresent(SysTenantDO::getContactMobile, reqVO.getContactMobile()) - .eqIfPresent(SysTenantDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(SysTenantDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc(SysTenantDO::getId)); - } - - default List selectList(TenantExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(SysTenantDO::getName, reqVO.getName()) - .likeIfPresent(SysTenantDO::getContactName, reqVO.getContactName()) - .likeIfPresent(SysTenantDO::getContactMobile, reqVO.getContactMobile()) - .eqIfPresent(SysTenantDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(SysTenantDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc(SysTenantDO::getId)); - } - - default SysTenantDO selectByName(String name) { - return selectOne(SysTenantDO::getName, name); - } -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java new file mode 100755 index 0000000000..9fe0dbec8b --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.system.dal.mysql.tenant; + +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; +import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 租户 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface TenantMapper extends BaseMapperX { + + default PageResult selectPage(TenantPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TenantDO::getName, reqVO.getName()) + .likeIfPresent(TenantDO::getContactName, reqVO.getContactName()) + .likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile()) + .eqIfPresent(TenantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(TenantDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc(TenantDO::getId)); + } + + default List selectList(TenantExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(TenantDO::getName, reqVO.getName()) + .likeIfPresent(TenantDO::getContactName, reqVO.getContactName()) + .likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile()) + .eqIfPresent(TenantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(TenantDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc(TenantDO::getId)); + } + + default TenantDO selectByName(String name) { + return selectOne(TenantDO::getName, name); + } +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java similarity index 96% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java index 78b1ca24f8..d2d28219bb 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyConstants.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java @@ -13,7 +13,7 @@ import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.S * * @author 芋道源码 */ -public interface SysRedisKeyConstants { +public interface RedisKeyConstants { RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存", "captcha_code:%s", // 参数为 uuid @@ -30,5 +30,5 @@ public interface SysRedisKeyConstants { RedisKeyDefine SOCIAL_AUTH_STATE = new RedisKeyDefine("社交登陆的 state", "social_auth_state:%s", // 参数为 state STRING, String.class, Duration.ofHours(24)); // 值为 state - + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyCoreConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyCoreConstants.java deleted file mode 100644 index 735adcc917..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/SysRedisKeyCoreConstants.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.yudao.module.system.dal.redis; - -import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import me.zhyd.oauth.model.AuthUser; - -import java.time.Duration; - -import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; - -/** - * System Redis Key 枚举类 - * - * @author 芋道源码 - */ -public interface SysRedisKeyCoreConstants { - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java index ead1d0287e..8132a882ef 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Repository; import javax.annotation.Resource; -import static cn.iocoder.yudao.module.system.dal.redis.SysRedisKeyConstants.LOGIN_USER; +import static cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants.LOGIN_USER; /** * {@link LoginUser} 的 RedisDAO diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/CaptchaRedisDAO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/CaptchaRedisDAO.java index 1c83a7c5c5..bfcb7878b1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/CaptchaRedisDAO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/common/CaptchaRedisDAO.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.time.Duration; -import static cn.iocoder.yudao.module.system.dal.redis.SysRedisKeyConstants.CAPTCHA_CODE; +import static cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants.CAPTCHA_CODE; /** * 验证码的 Redis DAO diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/social/SocialAuthUserRedisDAO.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/social/SocialAuthUserRedisDAO.java index 12cdc94869..ac71f1b5d7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/social/SocialAuthUserRedisDAO.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/social/SocialAuthUserRedisDAO.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Repository; import javax.annotation.Resource; -import static cn.iocoder.yudao.module.system.dal.redis.SysRedisKeyConstants.SOCIAL_AUTH_USER; +import static cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants.SOCIAL_AUTH_USER; /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SysSexEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SexEnum.java similarity index 93% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SysSexEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SexEnum.java index 7fd76247a4..f6120c4187 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SysSexEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/common/SexEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysSexEnum { +public enum SexEnum { /** 男 */ MALE(1), diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsReceiveStatusEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsReceiveStatusEnum.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsReceiveStatusEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsReceiveStatusEnum.java index 2b75a45e76..581ee6f9a4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsReceiveStatusEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsReceiveStatusEnum.java @@ -11,7 +11,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysSmsReceiveStatusEnum { +public enum SmsReceiveStatusEnum { INIT(0), // 初始化 SUCCESS(10), // 接收成功 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsSendStatusEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSendStatusEnum.java similarity index 91% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsSendStatusEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSendStatusEnum.java index ea57fa8cc3..307c9f6b75 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsSendStatusEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSendStatusEnum.java @@ -11,7 +11,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysSmsSendStatusEnum { +public enum SmsSendStatusEnum { INIT(0), // 初始化 SUCCESS(10), // 发送成功 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsTemplateTypeEnum.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsTemplateTypeEnum.java similarity index 90% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsTemplateTypeEnum.java rename to yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsTemplateTypeEnum.java index 5f853e2d75..d24b07a9ed 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SysSmsTemplateTypeEnum.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsTemplateTypeEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum SysSmsTemplateTypeEnum { +public enum SmsTemplateTypeEnum { VERIFICATION_CODE(1), // 验证码 NOTICE(2), // 通知 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java index c65c866b51..0be6684c89 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.framework.datapermission.config; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.framework.datapermission.core.dept.rule.DeptDataPermissionRuleCustomizer; import org.springframework.context.annotation.Bean; @@ -18,7 +18,7 @@ public class DataPermissionConfiguration { public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { return rule -> { rule.addDeptColumn(AdminUserDO.class); - rule.addDeptColumn(SysDeptDO.class, "id"); + rule.addDeptColumn(DeptDO.class, "id"); }; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java index 6fe1db5a55..495c06a9be 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sms/SmsSendConsumer.java @@ -19,12 +19,12 @@ import javax.annotation.Resource; public class SmsSendConsumer extends AbstractStreamMessageListener { @Resource - private SmsSendService smsCoreService; + private SmsSendService smsSendService; @Override public void onMessage(SmsSendMessage message) { log.info("[onMessage][消息内容({})]", message); - smsCoreService.doSendSms(message); + smsSendService.doSendSms(message); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index fe4e502f0a..d2fe1ba1ab 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBi import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLogin2ReqVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLoginReqVO; import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; @@ -74,7 +74,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // 获取 username 对应的 SysUserDO + // 获取 username 对应的 AdminUserDO AdminUserDO user = userService.getUserByUsername(username); if (user == null) { throw new UsernameNotFoundException(username); @@ -85,7 +85,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public LoginUser mockLogin(Long userId) { - // 获取用户编号对应的 SysUserDO + // 获取用户编号对应的 AdminUserDO AdminUserDO user = userService.getUser(userId); if (user == null) { throw new UsernameNotFoundException(String.valueOf(userId)); @@ -196,9 +196,9 @@ public class AdminAuthServiceImpl implements AdminAuthService { AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); Assert.notNull(authUser, "授权用户不为空"); - // 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错 + // 如果未绑定 SocialUserDO 用户,则无法自动登录,进行报错 String unionId = socialService.getAuthUserUnionId(authUser); - List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, getUserType().getValue()); + List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, getUserType().getValue()); if (CollUtil.isEmpty(socialUsers)) { throw exception(AUTH_THIRD_LOGIN_NOT_BIND); } @@ -295,7 +295,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { return loginUser; } - // 重新加载 SysUserDO 信息 + // 重新加载 AdminUserDO 信息 AdminUserDO user = userService.getUser(loginUser.getId()); if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) { throw exception(AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java index ef9e92caab..779f33a476 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionService.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.service.auth; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.UserSessionDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; /** @@ -18,7 +18,7 @@ public interface UserSessionService { * @param reqVO 分页条件 * @return 份额与列表 */ - PageResult getUserSessionPage(UserSessionPageReqVO reqVO); + PageResult getUserSessionPage(UserSessionPageReqVO reqVO); /** * 移除超时的在线用户 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java index beced6bd13..a1118958ac 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImpl.java @@ -6,13 +6,13 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.UserSessionDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; -import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; +import cn.iocoder.yudao.module.system.dal.mysql.auth.UserSessionMapper; import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; -import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.yudao.module.system.dal.redis.auth.LoginUserRedisDAO; import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -39,7 +39,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; public class UserSessionServiceImpl implements UserSessionService { @Resource - private SysUserSessionMapper userSessionMapper; + private UserSessionMapper userSessionMapper; @Resource private AdminUserService userService; @@ -47,13 +47,13 @@ public class UserSessionServiceImpl implements UserSessionService { private LoginLogService loginLogService; @Resource - private LoginUserRedisDAO loginUserCoreRedisDAO; + private LoginUserRedisDAO loginUserRedisDAO; @Resource private SecurityProperties securityProperties; @Override - public PageResult getUserSessionPage(UserSessionPageReqVO reqVO) { + public PageResult getUserSessionPage(UserSessionPageReqVO reqVO) { // 处理基于用户昵称的查询 Collection userIds = null; if (StrUtil.isNotEmpty(reqVO.getUsername())) { @@ -69,11 +69,11 @@ public class UserSessionServiceImpl implements UserSessionService { @Override public long clearSessionTimeout() { // 获取db里已经超时的用户列表 - List sessionTimeoutDOS = userSessionMapper.selectListBySessionTimoutLt(); - Map timeoutSessionDOMap = sessionTimeoutDOS + List sessionTimeoutDOS = userSessionMapper.selectListBySessionTimoutLt(); + Map timeoutSessionDOMap = sessionTimeoutDOS .stream() - .filter(sessionDO -> loginUserCoreRedisDAO.get(sessionDO.getId()) == null) - .collect(Collectors.toMap(SysUserSessionDO::getId, o -> o)); + .filter(sessionDO -> loginUserRedisDAO.get(sessionDO.getId()) == null) + .collect(Collectors.toMap(UserSessionDO::getId, o -> o)); // 确认已经超时,按批次移出在线用户列表 if (CollUtil.isNotEmpty(timeoutSessionDOMap)) { Lists.partition(new ArrayList<>(timeoutSessionDOMap.keySet()), 100) @@ -84,8 +84,8 @@ public class UserSessionServiceImpl implements UserSessionService { return timeoutSessionDOMap.size(); } - private void createTimeoutLogoutLog(Collection timeoutSessionDOS) { - for (SysUserSessionDO timeoutSessionDO : timeoutSessionDOS) { + private void createTimeoutLogoutLog(Collection timeoutSessionDOS) { + for (UserSessionDO timeoutSessionDO : timeoutSessionDOS) { LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_TIMEOUT.getType()); reqDTO.setTraceId(TracerUtils.getTraceId()); @@ -105,9 +105,9 @@ public class UserSessionServiceImpl implements UserSessionService { String sessionId = generateSessionId(); // 写入 Redis 缓存 loginUser.setUpdateTime(new Date()); - loginUserCoreRedisDAO.set(sessionId, loginUser); + loginUserRedisDAO.set(sessionId, loginUser); // 写入 DB 中 - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + UserSessionDO userSession = UserSessionDO.builder().id(sessionId) .userId(loginUser.getId()).userType(loginUser.getUserType()) .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) .sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))) @@ -121,9 +121,9 @@ public class UserSessionServiceImpl implements UserSessionService { public void refreshUserSession(String sessionId, LoginUser loginUser) { // 写入 Redis 缓存 loginUser.setUpdateTime(new Date()); - loginUserCoreRedisDAO.set(sessionId, loginUser); + loginUserRedisDAO.set(sessionId, loginUser); // 更新 DB 中 - SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build(); + UserSessionDO updateObj = UserSessionDO.builder().id(sessionId).build(); updateObj.setUsername(loginUser.getUsername()); updateObj.setUpdateTime(new Date()); updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))); @@ -133,14 +133,14 @@ public class UserSessionServiceImpl implements UserSessionService { @Override public void deleteUserSession(String sessionId) { // 删除 Redis 缓存 - loginUserCoreRedisDAO.delete(sessionId); + loginUserRedisDAO.delete(sessionId); // 删除 DB 记录 userSessionMapper.deleteById(sessionId); } @Override public LoginUser getLoginUser(String sessionId) { - return loginUserCoreRedisDAO.get(sessionId); + return loginUserRedisDAO.get(sessionId); } @Override diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java index c9aa07c567..3716c906f2 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import java.util.Collection; import java.util.Collections; @@ -53,7 +53,7 @@ public interface DeptService { * @param reqVO 筛选条件请求 VO * @return 部门列表 */ - List getSimpleDepts(DeptListReqVO reqVO); + List getSimpleDepts(DeptListReqVO reqVO); /** * 获得所有子部门,从缓存中 @@ -62,7 +62,7 @@ public interface DeptService { * @param recursive 是否递归获取所有 * @return 子部门列表 */ - List getDeptsByParentIdFromCache(Long parentId, boolean recursive); + List getDeptsByParentIdFromCache(Long parentId, boolean recursive); /** * 获得部门信息数组 @@ -70,7 +70,7 @@ public interface DeptService { * @param ids 部门编号数组 * @return 部门信息数组 */ - List getDepts(Collection ids); + List getDepts(Collection ids); /** * 获得部门信息 @@ -78,7 +78,7 @@ public interface DeptService { * @param id 部门编号 * @return 部门信息 */ - SysDeptDO getDept(Long id); + DeptDO getDept(Long id); /** * 校验部门们是否有效。如下情况,视为无效: @@ -95,7 +95,7 @@ public interface DeptService { * @param ids 部门编号数组 * @return 部门列表 */ - List getSimpleDepts(Collection ids); + List getSimpleDepts(Collection ids); /** * 获得指定编号的部门 Map @@ -103,11 +103,11 @@ public interface DeptService { * @param ids 部门编号数组 * @return 部门 Map */ - default Map getDeptMap(Collection ids) { + default Map getDeptMap(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyMap(); } - List list = getSimpleDepts(ids); - return CollectionUtils.convertMap(list, SysDeptDO::getId); + List list = getSimpleDepts(ids); + return CollectionUtils.convertMap(list, DeptDO::getId); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java index a21ccfb7bf..955ce890ac 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java @@ -9,8 +9,8 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateRe import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dept.DeptConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper; import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; import com.google.common.collect.ImmutableMap; @@ -46,27 +46,27 @@ public class DeptServiceImpl implements DeptService { /** * 部门缓存 - * key:部门编号 {@link SysDeptDO#getId()} + * key:部门编号 {@link DeptDO#getId()} * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ @SuppressWarnings("FieldCanBeLocal") - private volatile Map deptCache; + private volatile Map deptCache; /** * 父部门缓存 - * key:部门编号 {@link SysDeptDO#getParentId()} + * key:部门编号 {@link DeptDO#getParentId()} * value: 直接子部门列表 * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ - private volatile Multimap parentDeptCache; + private volatile Multimap parentDeptCache; /** * 缓存部门的最大更新时间,用于后续的增量轮询,判断是否有更新 */ private volatile Date maxUpdateTime; @Resource - private SysDeptMapper deptMapper; + private DeptMapper deptMapper; @Resource private DeptProducer deptProducer; @@ -75,14 +75,14 @@ public class DeptServiceImpl implements DeptService { @PostConstruct public synchronized void initLocalCache() { // 获取部门列表,如果有更新 - List deptList = this.loadDeptIfUpdate(maxUpdateTime); + List deptList = this.loadDeptIfUpdate(maxUpdateTime); if (CollUtil.isEmpty(deptList)) { return; } // 构建缓存 - ImmutableMap.Builder builder = ImmutableMap.builder(); - ImmutableMultimap.Builder parentBuilder = ImmutableMultimap.builder(); + ImmutableMap.Builder builder = ImmutableMap.builder(); + ImmutableMultimap.Builder parentBuilder = ImmutableMultimap.builder(); deptList.forEach(sysRoleDO -> { builder.put(sysRoleDO.getId(), sysRoleDO); parentBuilder.put(sysRoleDO.getParentId(), sysRoleDO); @@ -107,7 +107,7 @@ public class DeptServiceImpl implements DeptService { * @param maxUpdateTime 当前部门的最大更新时间 * @return 部门列表 */ - private List loadDeptIfUpdate(Date maxUpdateTime) { + private List loadDeptIfUpdate(Date maxUpdateTime) { // 第一步,判断是否要更新。 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadMenuIfUpdate][首次加载全量部门]"); @@ -126,7 +126,7 @@ public class DeptServiceImpl implements DeptService { // 校验正确性 checkCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName()); // 插入部门 - SysDeptDO dept = DeptConvert.INSTANCE.convert(reqVO); + DeptDO dept = DeptConvert.INSTANCE.convert(reqVO); deptMapper.insert(dept); // 发送刷新消息 deptProducer.sendDeptRefreshMessage(); @@ -138,7 +138,7 @@ public class DeptServiceImpl implements DeptService { // 校验正确性 checkCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName()); // 更新部门 - SysDeptDO updateObj = DeptConvert.INSTANCE.convert(reqVO); + DeptDO updateObj = DeptConvert.INSTANCE.convert(reqVO); deptMapper.updateById(updateObj); // 发送刷新消息 deptProducer.sendDeptRefreshMessage(); @@ -159,16 +159,16 @@ public class DeptServiceImpl implements DeptService { } @Override - public List getSimpleDepts(DeptListReqVO reqVO) { + public List getSimpleDepts(DeptListReqVO reqVO) { return deptMapper.selectList(reqVO); } @Override - public List getDeptsByParentIdFromCache(Long parentId, boolean recursive) { + public List getDeptsByParentIdFromCache(Long parentId, boolean recursive) { if (parentId == null) { return Collections.emptyList(); } - List result = new ArrayList<>(); // TODO 芋艿:待优化,新增缓存,避免每次遍历的计算 + List result = new ArrayList<>(); // TODO 芋艿:待优化,新增缓存,避免每次遍历的计算 // 递归,简单粗暴 this.getDeptsByParentIdFromCache(result, parentId, recursive ? Integer.MAX_VALUE : 1, // 如果递归获取,则无限;否则,只递归 1 次 @@ -184,14 +184,14 @@ public class DeptServiceImpl implements DeptService { * @param recursiveCount 递归次数 * @param parentDeptMap 父部门 Map,使用缓存,避免变化 */ - private void getDeptsByParentIdFromCache(List result, Long parentId, int recursiveCount, - Multimap parentDeptMap) { + private void getDeptsByParentIdFromCache(List result, Long parentId, int recursiveCount, + Multimap parentDeptMap) { // 递归次数为 0,结束! if (recursiveCount == 0) { return; } // 获得子部门 - Collection depts = parentDeptMap.get(parentId); + Collection depts = parentDeptMap.get(parentId); if (CollUtil.isEmpty(depts)) { return; } @@ -219,7 +219,7 @@ public class DeptServiceImpl implements DeptService { throw ServiceExceptionUtil.exception(DEPT_PARENT_ERROR); } // 父岗位不存在 - SysDeptDO dept = deptMapper.selectById(parentId); + DeptDO dept = deptMapper.selectById(parentId); if (dept == null) { throw ServiceExceptionUtil.exception(DEPT_PARENT_NOT_EXITS); } @@ -228,7 +228,7 @@ public class DeptServiceImpl implements DeptService { throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE); } // 父部门不能是原来的子部门 - List children = this.getDeptsByParentIdFromCache(id, true); + List children = this.getDeptsByParentIdFromCache(id, true); if (children.stream().anyMatch(dept1 -> dept1.getId().equals(parentId))) { throw ServiceExceptionUtil.exception(DEPT_PARENT_IS_CHILD); } @@ -238,14 +238,14 @@ public class DeptServiceImpl implements DeptService { if (id == null) { return; } - SysDeptDO dept = deptMapper.selectById(id); + DeptDO dept = deptMapper.selectById(id); if (dept == null) { throw ServiceExceptionUtil.exception(DEPT_NOT_FOUND); } } private void checkDeptNameUnique(Long id, Long parentId, String name) { - SysDeptDO menu = deptMapper.selectByParentIdAndName(parentId, name); + DeptDO menu = deptMapper.selectByParentIdAndName(parentId, name); if (menu == null) { return; } @@ -259,12 +259,12 @@ public class DeptServiceImpl implements DeptService { } @Override - public List getDepts(Collection ids) { + public List getDepts(Collection ids) { return deptMapper.selectBatchIds(ids); } @Override - public SysDeptDO getDept(Long id) { + public DeptDO getDept(Long id) { return deptMapper.selectById(id); } @@ -274,11 +274,11 @@ public class DeptServiceImpl implements DeptService { return; } // 获得科室信息 - List depts = deptMapper.selectBatchIds(ids); - Map deptMap = CollectionUtils.convertMap(depts, SysDeptDO::getId); + List depts = deptMapper.selectBatchIds(ids); + Map deptMap = CollectionUtils.convertMap(depts, DeptDO::getId); // 校验 ids.forEach(id -> { - SysDeptDO dept = deptMap.get(id); + DeptDO dept = deptMap.get(id); if (dept == null) { throw exception(DEPT_NOT_FOUND); } @@ -289,7 +289,7 @@ public class DeptServiceImpl implements DeptService { } @Override - public List getSimpleDepts(Collection ids) { + public List getSimpleDepts(Collection ids) { return deptMapper.selectBatchIds(ids); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java index 30b8fcc9ad..fc74c944a7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostCreateRe import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import org.springframework.lang.Nullable; import java.util.Collection; @@ -49,7 +49,7 @@ public interface PostService { * @param ids 岗位编号数组。如果为空,不进行筛选 * @return 部门列表 */ - default List getPosts(@Nullable Collection ids) { + default List getPosts(@Nullable Collection ids) { return getPosts(ids, asSet(CommonStatusEnum.ENABLE.getStatus(), CommonStatusEnum.DISABLE.getStatus())); } @@ -60,7 +60,7 @@ public interface PostService { * @param statuses 状态数组。如果为空,不进行筛选 * @return 部门列表 */ - List getPosts(@Nullable Collection ids, @Nullable Collection statuses); + List getPosts(@Nullable Collection ids, @Nullable Collection statuses); /** * 获得岗位分页列表 @@ -68,7 +68,7 @@ public interface PostService { * @param reqVO 分页条件 * @return 部门分页列表 */ - PageResult getPostPage(PostPageReqVO reqVO); + PageResult getPostPage(PostPageReqVO reqVO); /** * 获得岗位列表 @@ -76,7 +76,7 @@ public interface PostService { * @param reqVO 查询条件 * @return 部门列表 */ - List getPosts(PostExportReqVO reqVO); + List getPosts(PostExportReqVO reqVO); /** * 获得岗位信息 @@ -84,7 +84,7 @@ public interface PostService { * @param id 岗位编号 * @return 岗位信息 */ - SysPostDO getPost(Long id); + PostDO getPost(Long id); /** * 校验岗位们是否有效。如下情况,视为无效: diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java index f6bb471f61..81e003152e 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java @@ -9,8 +9,8 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportRe import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dept.PostConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.PostMapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -33,14 +33,14 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; public class PostServiceImpl implements PostService { @Resource - private SysPostMapper postMapper; + private PostMapper postMapper; @Override public Long createPost(PostCreateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getCode()); // 插入岗位 - SysPostDO post = PostConvert.INSTANCE.convert(reqVO); + PostDO post = PostConvert.INSTANCE.convert(reqVO); postMapper.insert(post); return post.getId(); } @@ -50,7 +50,7 @@ public class PostServiceImpl implements PostService { // 校验正确性 this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), reqVO.getCode()); // 更新岗位 - SysPostDO updateObj = PostConvert.INSTANCE.convert(reqVO); + PostDO updateObj = PostConvert.INSTANCE.convert(reqVO); postMapper.updateById(updateObj); } @@ -63,22 +63,22 @@ public class PostServiceImpl implements PostService { } @Override - public List getPosts(Collection ids, Collection statuses) { + public List getPosts(Collection ids, Collection statuses) { return postMapper.selectList(ids, statuses); } @Override - public PageResult getPostPage(PostPageReqVO reqVO) { + public PageResult getPostPage(PostPageReqVO reqVO) { return postMapper.selectPage(reqVO); } @Override - public List getPosts(PostExportReqVO reqVO) { + public List getPosts(PostExportReqVO reqVO) { return postMapper.selectList(reqVO); } @Override - public SysPostDO getPost(Long id) { + public PostDO getPost(Long id) { return postMapper.selectById(id); } @@ -92,7 +92,7 @@ public class PostServiceImpl implements PostService { } private void checkPostNameUnique(Long id, String name) { - SysPostDO post = postMapper.selectByName(name); + PostDO post = postMapper.selectByName(name); if (post == null) { return; } @@ -106,7 +106,7 @@ public class PostServiceImpl implements PostService { } private void checkPostCodeUnique(Long id, String code) { - SysPostDO post = postMapper.selectByCode(code); + PostDO post = postMapper.selectByCode(code); if (post == null) { return; } @@ -123,7 +123,7 @@ public class PostServiceImpl implements PostService { if (id == null) { return; } - SysPostDO post = postMapper.selectById(id); + PostDO post = postMapper.selectById(id); if (post == null) { throw ServiceExceptionUtil.exception(POST_NOT_FOUND); } @@ -135,11 +135,11 @@ public class PostServiceImpl implements PostService { return; } // 获得岗位信息 - List posts = postMapper.selectBatchIds(ids); - Map postMap = convertMap(posts, SysPostDO::getId); + List posts = postMapper.selectBatchIds(ids); + Map postMap = convertMap(posts, PostDO::getId); // 校验 ids.forEach(id -> { - SysPostDO post = postMap.get(id); + PostDO post = postMap.get(id); if (post == null) { throw exception(POST_NOT_FOUND); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java index 8d20c5aab1..0742f82931 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; @@ -50,7 +50,7 @@ public interface DictDataService extends DictDataFrameworkService { * * @return 字典数据全列表 */ - List getDictDatas(); + List getDictDatas(); /** * 获得字典数据分页列表 @@ -58,7 +58,7 @@ public interface DictDataService extends DictDataFrameworkService { * @param reqVO 分页请求 * @return 字典数据分页列表 */ - PageResult getDictDataPage(DictDataPageReqVO reqVO); + PageResult getDictDataPage(DictDataPageReqVO reqVO); /** * 获得字典数据列表 @@ -66,7 +66,7 @@ public interface DictDataService extends DictDataFrameworkService { * @param reqVO 列表请求 * @return 字典数据列表 */ - List getDictDatas(DictDataExportReqVO reqVO); + List getDictDatas(DictDataExportReqVO reqVO); /** * 获得字典数据详情 @@ -74,7 +74,7 @@ public interface DictDataService extends DictDataFrameworkService { * @param id 字典数据编号 * @return 字典数据 */ - SysDictDataDO getDictData(Long id); + DictDataDO getDictData(Long id); /** * 获得指定字典类型的数据数量 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java index b483f41675..1ecbdd41cd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java @@ -10,10 +10,9 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExpo import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dict.DictDataConvert; -import cn.iocoder.yudao.module.system.convert.dict.SysDictDataCoreConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictDataMapper; +import cn.iocoder.yudao.module.system.dal.mysql.dict.DictDataMapper; import cn.iocoder.yudao.module.system.mq.producer.dict.DictDataProducer; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; @@ -44,9 +43,9 @@ public class DictDataServiceImpl implements DictDataService { /** * 排序 dictType > sort */ - private static final Comparator COMPARATOR_TYPE_AND_SORT = Comparator - .comparing(SysDictDataDO::getDictType) - .thenComparingInt(SysDictDataDO::getSort); + private static final Comparator COMPARATOR_TYPE_AND_SORT = Comparator + .comparing(DictDataDO::getDictType) + .thenComparingInt(DictDataDO::getSort); /** * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 @@ -58,7 +57,7 @@ public class DictDataServiceImpl implements DictDataService { private DictTypeService dictTypeService; @Resource - private SysDictDataMapper dictDataMapper; + private DictDataMapper dictDataMapper; @Resource private DictDataProducer dictDataProducer; @@ -69,14 +68,14 @@ public class DictDataServiceImpl implements DictDataService { * key1:字典类型 dictType * key2:字典标签 label */ - private ImmutableTable labelDictDataCache; + private ImmutableTable labelDictDataCache; /** * 字典数据缓存,第二个 key 使用 value * * key1:字典类型 dictType * key2:字典值 value */ - private ImmutableTable valueDictDataCache; + private ImmutableTable valueDictDataCache; /** * 缓存字典数据的最大更新时间,用于后续的增量轮询,判断是否有更新 */ @@ -86,14 +85,14 @@ public class DictDataServiceImpl implements DictDataService { @PostConstruct public synchronized void initLocalCache() { // 获取字典数据列表,如果有更新 - List dataList = loadDictDataIfUpdate(maxUpdateTime); + List dataList = loadDictDataIfUpdate(maxUpdateTime); if (CollUtil.isEmpty(dataList)) { return; } // 构建缓存 - ImmutableTable.Builder labelDictDataBuilder = ImmutableTable.builder(); - ImmutableTable.Builder valueDictDataBuilder = ImmutableTable.builder(); + ImmutableTable.Builder labelDictDataBuilder = ImmutableTable.builder(); + ImmutableTable.Builder valueDictDataBuilder = ImmutableTable.builder(); dataList.forEach(dictData -> { labelDictDataBuilder.put(dictData.getDictType(), dictData.getLabel(), dictData); valueDictDataBuilder.put(dictData.getDictType(), dictData.getValue(), dictData); @@ -112,7 +111,7 @@ public class DictDataServiceImpl implements DictDataService { * @param maxUpdateTime 当前字典数据的最大更新时间 * @return 字典数据列表 */ - private List loadDictDataIfUpdate(Date maxUpdateTime) { + private List loadDictDataIfUpdate(Date maxUpdateTime) { // 第一步,判断是否要更新。 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadDictDataIfUpdate][首次加载全量字典数据]"); @@ -132,42 +131,42 @@ public class DictDataServiceImpl implements DictDataService { } @Override - public List getDictDatas() { - List list = dictDataMapper.selectList(); + public List getDictDatas() { + List list = dictDataMapper.selectList(); list.sort(COMPARATOR_TYPE_AND_SORT); return list; } @Override - public PageResult getDictDataPage(DictDataPageReqVO reqVO) { + public PageResult getDictDataPage(DictDataPageReqVO reqVO) { return dictDataMapper.selectPage(reqVO); } @Override - public List getDictDatas(DictDataExportReqVO reqVO) { - List list = dictDataMapper.selectList(reqVO); + public List getDictDatas(DictDataExportReqVO reqVO) { + List list = dictDataMapper.selectList(reqVO); list.sort(COMPARATOR_TYPE_AND_SORT); return list; } @Override - public SysDictDataDO getDictData(Long id) { + public DictDataDO getDictData(Long id) { return dictDataMapper.selectById(id); } @Override public DictDataRespDTO getDictDataFromCache(String type, String value) { - return SysDictDataCoreConvert.INSTANCE.convert02(valueDictDataCache.get(type, value)); + return DictDataConvert.INSTANCE.convert02(valueDictDataCache.get(type, value)); } @Override public DictDataRespDTO parseDictDataFromCache(String type, String label) { - return SysDictDataCoreConvert.INSTANCE.convert02(labelDictDataCache.get(type, label)); + return DictDataConvert.INSTANCE.convert02(labelDictDataCache.get(type, label)); } @Override public List listDictDatasFromCache(String type) { - return SysDictDataCoreConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values()); + return DictDataConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values()); } @Override @@ -176,7 +175,7 @@ public class DictDataServiceImpl implements DictDataService { checkCreateOrUpdate(null, reqVO.getValue(), reqVO.getDictType()); // 插入字典类型 - SysDictDataDO dictData = DictDataConvert.INSTANCE.convert(reqVO); + DictDataDO dictData = DictDataConvert.INSTANCE.convert(reqVO); dictDataMapper.insert(dictData); // 发送刷新消息 @@ -190,7 +189,7 @@ public class DictDataServiceImpl implements DictDataService { checkCreateOrUpdate(reqVO.getId(), reqVO.getValue(), reqVO.getDictType()); // 更新字典类型 - SysDictDataDO updateObj = DictDataConvert.INSTANCE.convert(reqVO); + DictDataDO updateObj = DictDataConvert.INSTANCE.convert(reqVO); dictDataMapper.updateById(updateObj); // 发送刷新消息 @@ -226,7 +225,7 @@ public class DictDataServiceImpl implements DictDataService { @VisibleForTesting public void checkDictDataValueUnique(Long id, String dictType, String value) { - SysDictDataDO dictData = dictDataMapper.selectByDictTypeAndValue(dictType, value); + DictDataDO dictData = dictDataMapper.selectByDictTypeAndValue(dictType, value); if (dictData == null) { return; } @@ -244,7 +243,7 @@ public class DictDataServiceImpl implements DictDataService { if (id == null) { return; } - SysDictDataDO dictData = dictDataMapper.selectById(id); + DictDataDO dictData = dictDataMapper.selectById(id); if (dictData == null) { throw exception(DICT_DATA_NOT_EXISTS); } @@ -266,10 +265,10 @@ public class DictDataServiceImpl implements DictDataService { if (CollUtil.isEmpty(values)) { return; } - ImmutableMap dictDataMap = valueDictDataCache.row(dictType); + ImmutableMap dictDataMap = valueDictDataCache.row(dictType); // 校验 values.forEach(value -> { - SysDictDataDO dictData = dictDataMap.get(value); + DictDataDO dictData = dictDataMap.get(value); if (dictData == null) { throw exception(DICT_DATA_NOT_EXISTS); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java index b9bcaf61e8..c0677aff16 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePage import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeUpdateReqVO; import cn.iocoder.yudao.module.system.convert.dict.DictTypeConvert; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; -import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictTypeMapper; +import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; @@ -29,7 +29,7 @@ public class DictTypeServiceImpl implements DictTypeService { private DictDataService dictDataService; @Resource - private SysDictTypeMapper dictTypeMapper; + private DictTypeMapper dictTypeMapper; @Override public PageResult getDictTypePage(DictTypePageReqVO reqVO) { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceImpl.java index d347d79810..a34f098cd5 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceImpl.java @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeResp import cn.iocoder.yudao.module.system.convert.errorcode.ErrorCodeConvert; import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; -import cn.iocoder.yudao.module.system.dal.mysql.errorcode.SysErrorCodeMapper; +import cn.iocoder.yudao.module.system.dal.mysql.errorcode.ErrorCodeMapper; import cn.iocoder.yudao.module.system.enums.errorcode.ErrorCodeTypeEnum; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; @@ -39,7 +39,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. public class ErrorCodeServiceImpl implements ErrorCodeService { @Resource - private SysErrorCodeMapper errorCodeMapper; + private ErrorCodeMapper errorCodeMapper; @Override public Long createErrorCode(ErrorCodeCreateReqVO createReqVO) { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java index 152236adfb..38b4fe78ef 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogService.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.LoginLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; @@ -20,7 +20,7 @@ public interface LoginLogService { * @param reqVO 分页条件 * @return 登录日志分页 */ - PageResult getLoginLogPage(LoginLogPageReqVO reqVO); + PageResult getLoginLogPage(LoginLogPageReqVO reqVO); /** * 获得登录日志列表 @@ -28,7 +28,7 @@ public interface LoginLogService { * @param reqVO 列表条件 * @return 登录日志列表 */ - List getLoginLogList(LoginLogExportReqVO reqVO); + List getLoginLogList(LoginLogExportReqVO reqVO); /** * 创建登录日志 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java index 0233b7c103..78ad540ba4 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImpl.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; -import cn.iocoder.yudao.module.system.convert.logger.SysLoginLogCoreConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.convert.logger.LoginLogConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.LoginLogDO; import cn.iocoder.yudao.module.system.dal.mysql.logger.LoginLogMapper; -import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -22,18 +22,18 @@ public class LoginLogServiceImpl implements LoginLogService { private LoginLogMapper loginLogMapper; @Override - public PageResult getLoginLogPage(LoginLogPageReqVO reqVO) { + public PageResult getLoginLogPage(LoginLogPageReqVO reqVO) { return loginLogMapper.selectPage(reqVO); } @Override - public List getLoginLogList(LoginLogExportReqVO reqVO) { + public List getLoginLogList(LoginLogExportReqVO reqVO) { return loginLogMapper.selectList(reqVO); } @Override public void createLoginLog(LoginLogCreateReqDTO reqDTO) { - SysLoginLogDO loginLog = SysLoginLogCoreConvert.INSTANCE.convert(reqDTO); + LoginLogDO loginLog = LoginLogConvert.INSTANCE.convert(reqDTO); loginLogMapper.insert(loginLog); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java index 2ca561ac43..2b796e28c8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeCreateReq import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; import cn.iocoder.yudao.module.system.convert.notice.NoticeConvert; -import cn.iocoder.yudao.module.system.dal.mysql.notice.SysNoticeMapper; +import cn.iocoder.yudao.module.system.dal.mysql.notice.NoticeMapper; import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; @@ -24,7 +24,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.NOTICE_NOT public class NoticeServiceImpl implements NoticeService { @Resource - private SysNoticeMapper noticeMapper; + private NoticeMapper noticeMapper; @Override public Long createNotice(NoticeCreateReqVO reqVO) { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java index fe2b573c07..40d8c13c58 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java @@ -56,7 +56,7 @@ public class MenuServiceImpl implements MenuService { /** * 权限与菜单缓存 * key:权限 {@link MenuDO#getPermission()} - * value:SysMenuDO 数组,因为一个权限可能对应多个 SysMenuDO 对象 + * value:MenuDO 数组,因为一个权限可能对应多个 MenuDO 对象 * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java index 05f15ec9ef..cb86bc7ada 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; @@ -383,8 +383,8 @@ public class PermissionServiceImpl implements PermissionService { } // 情况四,DEPT_DEPT_AND_CHILD if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { - List depts = deptService.getDeptsByParentIdFromCache(loginUser.getDeptId(), true); - CollUtil.addAll(result.getDeptIds(), CollectionUtils.convertList(depts, SysDeptDO::getId)); + List depts = deptService.getDeptsByParentIdFromCache(loginUser.getDeptId(), true); + CollUtil.addAll(result.getDeptIds(), CollectionUtils.convertList(depts, DeptDO::getId)); continue; } // 情况五,SELF diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java index f5950a23db..50e13a6025 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.service.sms; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; @@ -51,7 +51,7 @@ public interface SmsChannelService { * @param id 编号 * @return 短信渠道 */ - SysSmsChannelDO getSmsChannel(Long id); + SmsChannelDO getSmsChannel(Long id); /** * 获得短信渠道列表 @@ -59,14 +59,14 @@ public interface SmsChannelService { * @param ids 编号 * @return 短信渠道列表 */ - List getSmsChannelList(Collection ids); + List getSmsChannelList(Collection ids); /** * 获得所有短信渠道列表 * * @return 短信渠道列表 */ - List getSmsChannelList(); + List getSmsChannelList(); /** * 获得短信渠道分页 @@ -74,6 +74,6 @@ public interface SmsChannelService { * @param pageReqVO 分页查询 * @return 短信渠道分页 */ - PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO); + PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java index 0a58798802..f1fd44a901 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java @@ -5,9 +5,9 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannel import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; import cn.iocoder.yudao.module.system.convert.sms.SmsChannelConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; @@ -64,7 +64,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { @PostConstruct public void initSmsClients() { // 获取短信渠道,如果有更新 - List smsChannels = this.loadSmsChannelIfUpdate(maxUpdateTime); + List smsChannels = this.loadSmsChannelIfUpdate(maxUpdateTime); if (CollUtil.isEmpty(smsChannels)) { return; } @@ -91,7 +91,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { * @param maxUpdateTime 当前短信渠道的最大更新时间 * @return 短信渠道列表 */ - private List loadSmsChannelIfUpdate(Date maxUpdateTime) { + private List loadSmsChannelIfUpdate(Date maxUpdateTime) { // 第一步,判断是否要更新。 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadSmsChannelIfUpdate][首次加载全量短信渠道]"); @@ -108,7 +108,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { @Override public Long createSmsChannel(SmsChannelCreateReqVO createReqVO) { // 插入 - SysSmsChannelDO smsChannel = SmsChannelConvert.INSTANCE.convert(createReqVO); + SmsChannelDO smsChannel = SmsChannelConvert.INSTANCE.convert(createReqVO); smsChannelMapper.insert(smsChannel); // 发送刷新消息 smsProducer.sendSmsChannelRefreshMessage(); @@ -121,7 +121,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { // 校验存在 this.validateSmsChannelExists(updateReqVO.getId()); // 更新 - SysSmsChannelDO updateObj = SmsChannelConvert.INSTANCE.convert(updateReqVO); + SmsChannelDO updateObj = SmsChannelConvert.INSTANCE.convert(updateReqVO); smsChannelMapper.updateById(updateObj); // 发送刷新消息 smsProducer.sendSmsChannelRefreshMessage(); @@ -148,22 +148,22 @@ public class SmsChannelServiceImpl implements SmsChannelService { } @Override - public SysSmsChannelDO getSmsChannel(Long id) { + public SmsChannelDO getSmsChannel(Long id) { return smsChannelMapper.selectById(id); } @Override - public List getSmsChannelList(Collection ids) { + public List getSmsChannelList(Collection ids) { return smsChannelMapper.selectBatchIds(ids); } @Override - public List getSmsChannelList() { + public List getSmsChannelList() { return smsChannelMapper.selectList(); } @Override - public PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO) { + public PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO) { return smsChannelMapper.selectPage(pageReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java index 42c3457b64..2932949ee8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import java.util.Date; import java.util.List; @@ -31,7 +31,7 @@ public interface SmsLogService { * @return 发送日志编号 */ Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, - SysSmsTemplateDO template, String templateContent, Map templateParams); + SmsTemplateDO template, String templateContent, Map templateParams); /** * 更新日志的发送结果 @@ -64,7 +64,7 @@ public interface SmsLogService { * @param pageReqVO 分页查询 * @return 短信日志分页 */ - PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO); + PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO); /** * 获得短信日志列表, 用于 Excel 导出 @@ -72,6 +72,6 @@ public interface SmsLogService { * @param exportReqVO 查询条件 * @return 短信日志列表 */ - List getSmsLogList(SmsLogExportReqVO exportReqVO); + List getSmsLogList(SmsLogExportReqVO exportReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java index 75fa8848c1..a5abf4003a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java @@ -3,12 +3,12 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsLogMapper; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsSendStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsReceiveStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsSendStatusEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -32,11 +32,11 @@ public class SmsLogServiceImpl implements SmsLogService { @Override public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, - SysSmsTemplateDO template, String templateContent, Map templateParams) { - SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder(); + SmsTemplateDO template, String templateContent, Map templateParams) { + SmsLogDO.SmsLogDOBuilder logBuilder = SmsLogDO.builder(); // 根据是否要发送,设置状态 - logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus() - : SysSmsSendStatusEnum.IGNORE.getStatus()); + logBuilder.sendStatus(Objects.equals(isSend, true) ? SmsSendStatusEnum.INIT.getStatus() + : SmsSendStatusEnum.IGNORE.getStatus()); // 设置手机相关字段 logBuilder.mobile(mobile).userId(userId).userType(userType); // 设置模板相关字段 @@ -46,10 +46,10 @@ public class SmsLogServiceImpl implements SmsLogService { // 设置渠道相关字段 logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); // 设置接收相关字段 - logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + logBuilder.receiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); // 插入数据库 - SysSmsLogDO logDO = logBuilder.build(); + SmsLogDO logDO = logBuilder.build(); smsLogMapper.insert(logDO); return logDO.getId(); } @@ -58,9 +58,9 @@ public class SmsLogServiceImpl implements SmsLogService { public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) { - SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? - SysSmsSendStatusEnum.SUCCESS : SysSmsSendStatusEnum.FAILURE; - smsLogMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()) + SmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? + SmsSendStatusEnum.SUCCESS : SmsSendStatusEnum.FAILURE; + smsLogMapper.updateById(SmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()) .sendTime(new Date()).sendCode(sendCode).sendMsg(sendMsg) .apiSendCode(apiSendCode).apiSendMsg(apiSendMsg) .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build()); @@ -69,19 +69,19 @@ public class SmsLogServiceImpl implements SmsLogService { @Override public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg) { - SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? - SysSmsReceiveStatusEnum.SUCCESS : SysSmsReceiveStatusEnum.FAILURE; - smsLogMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) + SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? + SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE; + smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); } @Override - public PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO) { + public PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO) { return smsLogMapper.selectPage(pageReqVO); } @Override - public List getSmsLogList(SmsLogExportReqVO exportReqVO) { + public List getSmsLogList(SmsLogExportReqVO exportReqVO) { return smsLogMapper.selectList(exportReqVO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java index 8819a27107..538e0f925f 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java @@ -12,7 +12,7 @@ import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; @@ -83,7 +83,7 @@ public class SmsSendServiceImpl implements SmsSendService { public Long sendSingleSms(String mobile, Long userId, Integer userType, String templateCode, Map templateParams) { // 校验短信模板是否合法 - SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode); + SmsTemplateDO template = this.checkSmsTemplateValid(templateCode); // 校验手机号码是否存在 mobile = this.checkMobile(mobile); // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 @@ -104,9 +104,9 @@ public class SmsSendServiceImpl implements SmsSendService { @VisibleForTesting - public SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { + public SmsTemplateDO checkSmsTemplateValid(String templateCode) { // 获得短信模板。考虑到效率,从缓存中获取 - SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); + SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); // 短信模板不存在 if (template == null) { throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS); @@ -124,7 +124,7 @@ public class SmsSendServiceImpl implements SmsSendService { * @return 处理后的参数 */ @VisibleForTesting - public List> buildTemplateParams(SysSmsTemplateDO template, Map templateParams) { + public List> buildTemplateParams(SmsTemplateDO template, Map templateParams) { return template.getParams().stream().map(key -> { Object value = templateParams.get(key); if (value == null) { diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java index bf00dabffe..eaa6550665 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import javax.validation.Valid; @@ -31,7 +31,7 @@ public interface SmsTemplateService { * @param code 模板编码 * @return 短信模板 */ - SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code); + SmsTemplateDO getSmsTemplateByCodeFromCache(String code); /** * 格式化短信内容 @@ -48,7 +48,7 @@ public interface SmsTemplateService { * @param code 模板编码 * @return 短信模板 */ - SysSmsTemplateDO getSmsTemplateByCode(String code); + SmsTemplateDO getSmsTemplateByCode(String code); /** * 创建短信模板 @@ -78,7 +78,7 @@ public interface SmsTemplateService { * @param id 编号 * @return 短信模板 */ - SysSmsTemplateDO getSmsTemplate(Long id); + SmsTemplateDO getSmsTemplate(Long id); /** * 获得短信模板列表 @@ -86,7 +86,7 @@ public interface SmsTemplateService { * @param ids 编号 * @return 短信模板列表 */ - List getSmsTemplateList(Collection ids); + List getSmsTemplateList(Collection ids); /** * 获得短信模板分页 @@ -94,7 +94,7 @@ public interface SmsTemplateService { * @param pageReqVO 分页查询 * @return 短信模板分页 */ - PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO); + PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO); /** * 获得短信模板列表, 用于 Excel 导出 @@ -102,7 +102,7 @@ public interface SmsTemplateService { * @param exportReqVO 查询条件 * @return 短信模板分页 */ - List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO); + List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO); /** * 获得指定短信渠道下的短信模板数量 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java index 5199dd2220..ce8e71435d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java @@ -9,10 +9,10 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; import cn.iocoder.yudao.module.system.convert.sms.SmsTemplateConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsTemplateMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.sms.core.client.SmsClient; @@ -69,11 +69,11 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { /** * 短信模板缓存 - * key:短信模板编码 {@link SysSmsTemplateDO#getCode()} + * key:短信模板编码 {@link SmsTemplateDO#getCode()} * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ - private volatile Map smsTemplateCache; + private volatile Map smsTemplateCache; /** * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新 */ @@ -83,13 +83,13 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { @PostConstruct public void initLocalCache() { // 获取短信模板列表,如果有更新 - List smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime); + List smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime); if (CollUtil.isEmpty(smsTemplateList)) { return; } // 写入缓存 - ImmutableMap.Builder builder = ImmutableMap.builder(); + ImmutableMap.Builder builder = ImmutableMap.builder(); smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO)); smsTemplateCache = builder.build(); assert smsTemplateList.size() > 0; // 断言,避免告警 @@ -104,7 +104,7 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { * @param maxUpdateTime 当前短信模板的最大更新时间 * @return 短信模板列表 */ - private List loadSmsTemplateIfUpdate(Date maxUpdateTime) { + private List loadSmsTemplateIfUpdate(Date maxUpdateTime) { // 第一步,判断是否要更新。 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]"); @@ -124,7 +124,7 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { } @Override - public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) { + public SmsTemplateDO getSmsTemplateByCodeFromCache(String code) { return smsTemplateCache.get(code); } @@ -134,7 +134,7 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { } @Override - public SysSmsTemplateDO getSmsTemplateByCode(String code) { + public SmsTemplateDO getSmsTemplateByCode(String code) { return smsTemplateMapper.selectByCode(code); } @@ -146,14 +146,14 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { @Override public Long createSmsTemplate(SmsTemplateCreateReqVO createReqVO) { // 校验短信渠道 - SysSmsChannelDO channelDO = checkSmsChannel(createReqVO.getChannelId()); + SmsChannelDO channelDO = checkSmsChannel(createReqVO.getChannelId()); // 校验短信编码是否重复 checkSmsTemplateCodeDuplicate(null, createReqVO.getCode()); // 校验短信模板 checkApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId()); // 插入 - SysSmsTemplateDO template = SmsTemplateConvert.INSTANCE.convert(createReqVO); + SmsTemplateDO template = SmsTemplateConvert.INSTANCE.convert(createReqVO); template.setParams(parseTemplateContentParams(template.getContent())); template.setChannelCode(channelDO.getCode()); smsTemplateMapper.insert(template); @@ -168,14 +168,14 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { // 校验存在 this.validateSmsTemplateExists(updateReqVO.getId()); // 校验短信渠道 - SysSmsChannelDO channelDO = checkSmsChannel(updateReqVO.getChannelId()); + SmsChannelDO channelDO = checkSmsChannel(updateReqVO.getChannelId()); // 校验短信编码是否重复 checkSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); // 校验短信模板 checkApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId()); // 更新 - SysSmsTemplateDO updateObj = SmsTemplateConvert.INSTANCE.convert(updateReqVO); + SmsTemplateDO updateObj = SmsTemplateConvert.INSTANCE.convert(updateReqVO); updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); updateObj.setChannelCode(channelDO.getCode()); smsTemplateMapper.updateById(updateObj); @@ -200,22 +200,22 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { } @Override - public SysSmsTemplateDO getSmsTemplate(Long id) { + public SmsTemplateDO getSmsTemplate(Long id) { return smsTemplateMapper.selectById(id); } @Override - public List getSmsTemplateList(Collection ids) { + public List getSmsTemplateList(Collection ids) { return smsTemplateMapper.selectBatchIds(ids); } @Override - public PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO) { + public PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO) { return smsTemplateMapper.selectPage(pageReqVO); } @Override - public List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO) { + public List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO) { return smsTemplateMapper.selectList(exportReqVO); } @@ -225,8 +225,8 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { } @VisibleForTesting - public SysSmsChannelDO checkSmsChannel(Long channelId) { - SysSmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); + public SmsChannelDO checkSmsChannel(Long channelId) { + SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); if (channelDO == null) { throw exception(SMS_CHANNEL_NOT_EXISTS); } @@ -238,7 +238,7 @@ public class SmsTemplateServiceImpl implements SmsTemplateService { @VisibleForTesting public void checkSmsTemplateCodeDuplicate(Long id, String code) { - SysSmsTemplateDO template = smsTemplateMapper.selectByCode(code); + SmsTemplateDO template = smsTemplateMapper.selectByCode(code); if (template == null) { return; } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java index e5ca68040e..b7a7d00d7d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.service.social; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.exception.ServiceException; -import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import me.zhyd.oauth.model.AuthUser; @@ -56,7 +56,7 @@ public interface SocialUserService { * @param userType 全局用户类型 * @return 社交用户列表 */ - List getAllSocialUserList(Integer type, String unionId, Integer userType); + List getAllSocialUserList(Integer type, String unionId, Integer userType); /** * 获得指定用户的社交用户列表 @@ -65,7 +65,7 @@ public interface SocialUserService { * @param userType 用户类型 * @return 社交用户列表 */ - List getSocialUserList(Long userId, Integer userType); + List getSocialUserList(Long userId, Integer userType); /** * 绑定社交用户 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java index ecb81d96a9..533f7fdf9c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.service.social; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.http.HttpUtils; -import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.module.system.dal.mysql.social.SysSocialUserMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.social.SocialUserMapper; import cn.iocoder.yudao.module.system.dal.redis.social.SocialAuthUserRedisDAO; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import com.google.common.annotations.VisibleForTesting; @@ -45,7 +45,7 @@ public class SocialUserServiceImpl implements SocialUserService { private SocialAuthUserRedisDAO authSocialUserRedisDAO; @Resource - private SysSocialUserMapper socialUserMapper; + private SocialUserMapper socialUserMapper; @Override public String getAuthorizeUrl(Integer type, String redirectUri) { @@ -73,22 +73,22 @@ public class SocialUserServiceImpl implements SocialUserService { } @Override - public List getAllSocialUserList(Integer type, String unionId, Integer userType) { + public List getAllSocialUserList(Integer type, String unionId, Integer userType) { List types = SocialTypeEnum.getRelationTypes(type); return socialUserMapper.selectListByTypeAndUnionId(userType, types, unionId); } @Override - public List getSocialUserList(Long userId, Integer userType) { + public List getSocialUserList(Long userId, Integer userType) { return socialUserMapper.selectListByUserId(userType, userId); } @Override @Transactional(rollbackFor = Exception.class) public void bindSocialUser(Long userId, Integer userType, Integer type, AuthUser authUser) { - // 获得 unionId 对应的 SysSocialUserDO 列表 + // 获得 unionId 对应的 SocialUserDO 列表 String unionId = getAuthUserUnionId(authUser); - List socialUsers = this.getAllSocialUserList(type, unionId, userType); + List socialUsers = this.getAllSocialUserList(type, unionId, userType); // 逻辑一:如果 userId 之前绑定过该 type 的其它账号,需要进行解绑 this.unbindOldSocialUser(userId, userType, type, unionId); @@ -100,12 +100,12 @@ public class SocialUserServiceImpl implements SocialUserService { if (Objects.equals(socialUser.getUserId(), userId)) { return; } - socialUserMapper.updateById(new SysSocialUserDO().setId(socialUser.getId()).setUserId(userId)); + socialUserMapper.updateById(new SocialUserDO().setId(socialUser.getId()).setUserId(userId)); }); // 逻辑三:如果 authUser 不存在于 socialUsers 中,则进行新增;否则,进行更新 - SysSocialUserDO socialUser = CollUtil.findOneByField(socialUsers, "openid", authUser.getUuid()); - SysSocialUserDO saveSocialUser = SysSocialUserDO.builder() // 新增和更新的通用属性 + SocialUserDO socialUser = CollUtil.findOneByField(socialUsers, "openid", authUser.getUuid()); + SocialUserDO saveSocialUser = SocialUserDO.builder() // 新增和更新的通用属性 .token(authUser.getToken().getAccessToken()).rawTokenInfo(toJsonString(authUser.getToken())) .nickname(authUser.getNickname()).avatar(authUser.getAvatar()).rawUserInfo(toJsonString(authUser.getRawUserInfo())) .build(); @@ -121,8 +121,8 @@ public class SocialUserServiceImpl implements SocialUserService { @Override public void unbindSocialUser(Long userId, Integer userType, Integer type, String unionId) { - // 获得 unionId 对应的所有 SysSocialUserDO 社交用户 - List socialUsers = this.getAllSocialUserList(type, unionId, userType); + // 获得 unionId 对应的所有 SocialUserDO 社交用户 + List socialUsers = this.getAllSocialUserList(type, unionId, userType); if (CollUtil.isEmpty(socialUsers)) { return; } @@ -134,20 +134,20 @@ public class SocialUserServiceImpl implements SocialUserService { }); // 解绑 - socialUserMapper.deleteBatchIds(CollectionUtils.convertSet(socialUsers, SysSocialUserDO::getId)); + socialUserMapper.deleteBatchIds(CollectionUtils.convertSet(socialUsers, SocialUserDO::getId)); } @VisibleForTesting public void unbindOldSocialUser(Long userId, Integer userType, Integer type, String newUnionId) { List types = SocialTypeEnum.getRelationTypes(type); - List oldSocialUsers = socialUserMapper.selectListByTypeAndUserId(userType, types, userId); + List oldSocialUsers = socialUserMapper.selectListByTypeAndUserId(userType, types, userId); // 如果新老的 unionId 是一致的,说明无需解绑 if (CollUtil.isEmpty(oldSocialUsers) || Objects.equals(newUnionId, oldSocialUsers.get(0).getUnionId())) { return; } // 解绑 - socialUserMapper.deleteBatchIds(CollectionUtils.convertSet(oldSocialUsers, SysSocialUserDO::getId)); + socialUserMapper.deleteBatchIds(CollectionUtils.convertSet(oldSocialUsers, SocialUserDO::getId)); } /** diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantCoreService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantCoreService.java deleted file mode 100644 index 030531d85f..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/SysTenantCoreService.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.iocoder.yudao.module.system.service.tenant; - -import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService; - -/** - * 租户 Service 接口 - * - * @author 芋道源码 - */ -public interface SysTenantCoreService extends TenantFrameworkService { -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java index 8d2005ba64..5742a7a102 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.system.service.tenant; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import javax.validation.Valid; import java.util.Collection; @@ -16,7 +17,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface TenantService { +public interface TenantService extends TenantFrameworkService { /** * 创建租户 @@ -46,7 +47,7 @@ public interface TenantService { * @param id 编号 * @return 租户 */ - SysTenantDO getTenant(Long id); + TenantDO getTenant(Long id); /** * 获得租户列表 @@ -54,7 +55,7 @@ public interface TenantService { * @param ids 编号 * @return 租户列表 */ - List getTenantList(Collection ids); + List getTenantList(Collection ids); /** * 获得租户分页 @@ -62,7 +63,7 @@ public interface TenantService { * @param pageReqVO 分页查询 * @return 租户分页 */ - PageResult getTenantPage(TenantPageReqVO pageReqVO); + PageResult getTenantPage(TenantPageReqVO pageReqVO); /** * 获得租户列表, 用于 Excel 导出 @@ -70,7 +71,7 @@ public interface TenantService { * @param exportReqVO 查询条件 * @return 租户列表 */ - List getTenantList(TenantExportReqVO exportReqVO); + List getTenantList(TenantExportReqVO exportReqVO); /** * 获得名字对应的租户 @@ -78,6 +79,6 @@ public interface TenantService { * @param name 组户名 * @return 租户 */ - SysTenantDO getTenantByName(String name); + TenantDO getTenantByName(String name); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java index 4b40236a11..6a584d29dc 100755 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java @@ -1,13 +1,14 @@ package cn.iocoder.yudao.module.system.service.tenant; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert; -import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantMapper; -import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; +import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -15,8 +16,8 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.List; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TENANT_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TENANT_NOT_EXISTS; /** * 租户 Service 实现类 @@ -28,12 +29,18 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU public class TenantServiceImpl implements TenantService { @Resource - private SysTenantMapper tenantMapper; + private TenantMapper tenantMapper; + + @Override + public List getTenantIds() { + List tenants = tenantMapper.selectList(); + return CollectionUtils.convertList(tenants, TenantDO::getId); + } @Override public Long createTenant(TenantCreateReqVO createReqVO) { // 插入 - SysTenantDO tenant = TenantConvert.INSTANCE.convert(createReqVO); + TenantDO tenant = TenantConvert.INSTANCE.convert(createReqVO); tenantMapper.insert(tenant); // 返回 return tenant.getId(); @@ -44,7 +51,7 @@ public class TenantServiceImpl implements TenantService { // 校验存在 this.validateTenantExists(updateReqVO.getId()); // 更新 - SysTenantDO updateObj = TenantConvert.INSTANCE.convert(updateReqVO); + TenantDO updateObj = TenantConvert.INSTANCE.convert(updateReqVO); tenantMapper.updateById(updateObj); } @@ -63,27 +70,27 @@ public class TenantServiceImpl implements TenantService { } @Override - public SysTenantDO getTenant(Long id) { + public TenantDO getTenant(Long id) { return tenantMapper.selectById(id); } @Override - public List getTenantList(Collection ids) { + public List getTenantList(Collection ids) { return tenantMapper.selectBatchIds(ids); } @Override - public PageResult getTenantPage(TenantPageReqVO pageReqVO) { + public PageResult getTenantPage(TenantPageReqVO pageReqVO) { return tenantMapper.selectPage(pageReqVO); } @Override - public List getTenantList(TenantExportReqVO exportReqVO) { + public List getTenantList(TenantExportReqVO exportReqVO) { return tenantMapper.selectList(exportReqVO); } @Override - public SysTenantDO getTenantByName(String name) { + public TenantDO getTenantByName(String name) { return tenantMapper.selectByName(name); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/impl/SysTenantCoreServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/impl/SysTenantCoreServiceImpl.java deleted file mode 100644 index 67b5acfe4e..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/tenant/impl/SysTenantCoreServiceImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.system.service.tenant.impl; - -import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; -import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantCoreMapper; -import cn.iocoder.yudao.module.system.service.tenant.SysTenantCoreService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 租户 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysTenantCoreServiceImpl implements SysTenantCoreService { - - @Resource - private SysTenantCoreMapper tenantCoreMapper; - - @Override - public List getTenantIds() { - List tenants = tenantCoreMapper.selectList(); - return CollectionUtils.convertList(tenants, SysTenantDO::getId); - } - -} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 25c413e126..e150d598d7 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfi import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.module.system.convert.user.UserConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; import cn.iocoder.yudao.module.system.service.dept.DeptService; @@ -241,7 +241,7 @@ public class AdminUserServiceImpl implements AdminUserService { return Collections.emptySet(); } Set deptIds = CollectionUtils.convertSet(deptService.getDeptsByParentIdFromCache( - deptId, true), SysDeptDO::getId); + deptId, true), DeptDO::getId); deptIds.add(deptId); // 包括自身 return deptIds; } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java index 33b2a3b788..1862c68c88 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java @@ -5,12 +5,12 @@ import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.session.UserSessionPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; -import cn.iocoder.yudao.module.system.dal.mysql.auth.SysUserSessionMapper; +import cn.iocoder.yudao.module.system.dal.mysql.auth.UserSessionMapper; import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; -import cn.iocoder.yudao.module.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.module.system.dal.dataobject.auth.UserSessionDO; import cn.iocoder.yudao.module.system.dal.redis.auth.LoginUserRedisDAO; -import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.enums.common.SexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -49,13 +49,13 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { private UserSessionServiceImpl userSessionService; @Resource - private SysUserSessionMapper userSessionMapper; + private UserSessionMapper userSessionMapper; @MockBean private AdminUserService userService; @MockBean private LoginLogService loginLogService; - @MockBean + @Resource private LoginUserRedisDAO loginUserRedisDAO; @MockBean @@ -65,13 +65,13 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { public void testGetUserSessionPage_success() { // mock 数据 AdminUserDO dbUser = randomPojo(AdminUserDO.class, o -> { - o.setSex(randomEle(SysSexEnum.values()).getSex()); + o.setSex(randomEle(SexEnum.values()).getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); when(userService.getUsersByUsername(eq(dbUser.getUsername()))).thenReturn(singletonList(dbUser)); // 插入可被查询到的数据 String userIp = randomString(); - SysUserSessionDO dbSession = randomPojo(SysUserSessionDO.class, o -> { + UserSessionDO dbSession = randomPojo(UserSessionDO.class, o -> { o.setUserId(dbUser.getId()); o.setUserType(randomEle(UserTypeEnum.values()).getValue()); o.setUserIp(userIp); @@ -93,7 +93,7 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { reqVO.setUserIp(userIp); // 调用 - PageResult pageResult = userSessionService.getUserSessionPage(reqVO); + PageResult pageResult = userSessionService.getUserSessionPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -107,15 +107,15 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { int expectedTimeoutCount = 120, expectedTotal = 1; // 准备数据 - List prepareData = Stream + List prepareData = Stream .iterate(0, i -> i) .limit(expectedTimeoutCount) - .map(i -> randomPojo(SysUserSessionDO.class, o -> { + .map(i -> randomPojo(UserSessionDO.class, o -> { o.setUserType(randomEle(UserTypeEnum.values()).getValue()); o.setSessionTimeout(DateUtil.offsetSecond(new Date(), -1)); })) .collect(Collectors.toList()); - SysUserSessionDO sessionDO = randomPojo(SysUserSessionDO.class, o -> { + UserSessionDO sessionDO = randomPojo(UserSessionDO.class, o -> { o.setUserType(randomEle(UserTypeEnum.values()).getValue()); o.setSessionTimeout(DateUtil.offsetMinute(new Date(), 30)); }); @@ -126,7 +126,7 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { long actualTimeoutCount = userSessionService.clearSessionTimeout(); // 校验 assertEquals(expectedTimeoutCount, actualTimeoutCount); - List userSessionDOS = userSessionMapper.selectList(); + List userSessionDOS = userSessionMapper.selectList(); assertEquals(expectedTotal, userSessionDOS.size()); assertPojoEquals(sessionDO, userSessionDOS.get(0), "updateTime"); } @@ -145,8 +145,8 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { // 调用 String sessionId = userSessionService.createUserSession(loginUser, userIp, userAgent); - // 校验 SysUserSessionDO 记录 - SysUserSessionDO userSessionDO = userSessionMapper.selectById(sessionId); + // 校验 UserSessionDO 记录 + UserSessionDO userSessionDO = userSessionMapper.selectById(sessionId); assertPojoEquals(loginUser, userSessionDO, "id", "updateTime"); assertEquals(sessionId, userSessionDO.getId()); assertEquals(userIp, userSessionDO.getUserIp()); @@ -171,7 +171,7 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { // mock 数据 loginUser.setUpdateTime(date); loginUserRedisDAO.set(sessionId, loginUser); - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + UserSessionDO userSession = UserSessionDO.builder().id(sessionId) .userId(loginUser.getId()).userType(loginUser.getUserType()) .userIp(userIp).userAgent(userAgent).username(userName) .sessionTimeout(addTime(Duration.ofMillis(timeLong))) @@ -183,8 +183,8 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { // 校验 LoginUser 缓存 LoginUser redisLoginUser = loginUserRedisDAO.get(sessionId); assertNotEquals(redisLoginUser.getUpdateTime(), date); - // 校验 SysUserSessionDO 记录 - SysUserSessionDO updateDO = userSessionMapper.selectById(sessionId); + // 校验 UserSessionDO 记录 + UserSessionDO updateDO = userSessionMapper.selectById(sessionId); assertEquals(updateDO.getUsername(), loginUser.getUsername()); assertNotEquals(updateDO.getUpdateTime(), userSession.getUpdateTime()); assertNotEquals(updateDO.getSessionTimeout(), addTime(Duration.ofMillis(timeLong))); @@ -202,7 +202,7 @@ public class UserSessionServiceImplTest extends BaseDbAndRedisUnitTest { when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); // mock 数据 loginUserRedisDAO.set(sessionId, loginUser); - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + UserSessionDO userSession = UserSessionDO.builder().id(sessionId) .userId(loginUser.getId()).userType(loginUser.getUserType()) .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) .sessionTimeout(addTime(Duration.ofMillis(timeLong))) diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java index bfda1290e6..3f78cec2f3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper; import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; @@ -43,7 +43,7 @@ public class DeptServiceTest extends BaseDbUnitTest { @Resource private DeptServiceImpl deptService; @Resource - private SysDeptMapper deptMapper; + private DeptMapper deptMapper; @MockBean private DeptProducer deptProducer; @@ -51,20 +51,20 @@ public class DeptServiceTest extends BaseDbUnitTest { @SuppressWarnings("unchecked") void testInitLocalCache() { // mock 数据 - SysDeptDO deptDO1 = randomDeptDO(); + DeptDO deptDO1 = randomDeptDO(); deptMapper.insert(deptDO1); - SysDeptDO deptDO2 = randomDeptDO(); + DeptDO deptDO2 = randomDeptDO(); deptMapper.insert(deptDO2); // 调用 deptService.initLocalCache(); // 断言 deptCache 缓存 - Map deptCache = (Map) getFieldValue(deptService, "deptCache"); + Map deptCache = (Map) getFieldValue(deptService, "deptCache"); assertEquals(2, deptCache.size()); assertPojoEquals(deptDO1, deptCache.get(deptDO1.getId())); assertPojoEquals(deptDO2, deptCache.get(deptDO2.getId())); // 断言 parentDeptCache 缓存 - Multimap parentDeptCache = (Multimap) getFieldValue(deptService, "parentDeptCache"); + Multimap parentDeptCache = (Multimap) getFieldValue(deptService, "parentDeptCache"); assertEquals(2, parentDeptCache.size()); assertPojoEquals(deptDO1, parentDeptCache.get(deptDO1.getParentId())); assertPojoEquals(deptDO2, parentDeptCache.get(deptDO2.getParentId())); @@ -76,7 +76,7 @@ public class DeptServiceTest extends BaseDbUnitTest { @Test void testListDepts() { // mock 数据 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { // 等会查询到 + DeptDO dept = randomPojo(DeptDO.class, o -> { // 等会查询到 o.setName("开发部"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); @@ -90,7 +90,7 @@ public class DeptServiceTest extends BaseDbUnitTest { reqVO.setName("开"); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 调用 - List sysDeptDOS = deptService.getSimpleDepts(reqVO); + List sysDeptDOS = deptService.getSimpleDepts(reqVO); // 断言 assertEquals(1, sysDeptDOS.size()); assertPojoEquals(dept, sysDeptDOS.get(0)); @@ -109,7 +109,7 @@ public class DeptServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(deptId); // 校验记录的属性是否正确 - SysDeptDO deptDO = deptMapper.selectById(deptId); + DeptDO deptDO = deptMapper.selectById(deptId); assertPojoEquals(reqVO, deptDO); // 校验调用 verify(deptProducer, times(1)).sendDeptRefreshMessage(); @@ -118,7 +118,7 @@ public class DeptServiceTest extends BaseDbUnitTest { @Test void testUpdateDept_success() { // mock 数据 - SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 // 准备参数 DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, o -> { @@ -130,14 +130,14 @@ public class DeptServiceTest extends BaseDbUnitTest { // 调用 deptService.updateDept(reqVO); // 校验是否更新正确 - SysDeptDO deptDO = deptMapper.selectById(reqVO.getId()); // 获取最新的 + DeptDO deptDO = deptMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, deptDO); } @Test void testDeleteDept_success() { // mock 数据 - SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbDeptDO.getId(); @@ -150,12 +150,12 @@ public class DeptServiceTest extends BaseDbUnitTest { @Test void testCheckDept_nameDuplicateForUpdate() { // mock 数据 - SysDeptDO deptDO = randomDeptDO(); + DeptDO deptDO = randomDeptDO(); // 设置根节点部门 deptDO.setParentId(DeptIdEnum.ROOT.getId()); deptMapper.insert(deptDO); // mock 数据 稍后模拟重复它的 name - SysDeptDO nameDeptDO = randomDeptDO(); + DeptDO nameDeptDO = randomDeptDO(); // 设置根节点部门 nameDeptDO.setParentId(DeptIdEnum.ROOT.getId()); deptMapper.insert(nameDeptDO); @@ -192,10 +192,10 @@ public class DeptServiceTest extends BaseDbUnitTest { @Test void testCheckDept_exitsChildrenForDelete() { // mock 数据 - SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + DeptDO parentDept = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); deptMapper.insert(parentDept);// @Sql: 先插入出一条存在的数据 // 准备参数 - SysDeptDO childrenDeptDO = randomPojo(SysDeptDO.class, o -> { + DeptDO childrenDeptDO = randomPojo(DeptDO.class, o -> { o.setParentId(parentDept.getId()); o.setStatus(randomCommonStatus()); }); @@ -208,7 +208,7 @@ public class DeptServiceTest extends BaseDbUnitTest { @Test void testCheckDept_parentErrorForUpdate() { // mock 数据 - SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); deptMapper.insert(dbDeptDO); // 准备参数 DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, @@ -225,7 +225,7 @@ public class DeptServiceTest extends BaseDbUnitTest { @Test void testCheckDept_notEnableForCreate() { // mock 数据 - SysDeptDO deptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + DeptDO deptDO = randomPojo(DeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); deptMapper.insert(deptDO); // 准备参数 DeptCreateReqVO reqVO = randomPojo(DeptCreateReqVO.class, @@ -240,9 +240,9 @@ public class DeptServiceTest extends BaseDbUnitTest { @Test void testCheckDept_parentIsChildForUpdate() { // mock 数据 - SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + DeptDO parentDept = randomPojo(DeptDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); deptMapper.insert(parentDept); - SysDeptDO childDept = randomPojo(SysDeptDO.class, o -> { + DeptDO childDept = randomPojo(DeptDO.class, o -> { o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setParentId(parentDept.getId()); }); @@ -262,11 +262,11 @@ public class DeptServiceTest extends BaseDbUnitTest { } @SafeVarargs - private static SysDeptDO randomDeptDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static DeptDO randomDeptDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 }; - return randomPojo(SysDeptDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(DeptDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java index d6bbab6f7a..19850d0c79 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.service.dept; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostCreateRe import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.mysql.dept.SysPostMapper; +import cn.iocoder.yudao.module.system.dal.mysql.dept.PostMapper; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -32,12 +32,12 @@ public class PostServiceTest extends BaseDbUnitTest { @Resource private PostServiceImpl postService; @Resource - private SysPostMapper postMapper; + private PostMapper postMapper; @Test void testPagePosts() { // mock 数据 - SysPostDO postDO = randomPojo(SysPostDO.class, o -> { + PostDO postDO = randomPojo(PostDO.class, o -> { o.setName("码仔"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); @@ -53,7 +53,7 @@ public class PostServiceTest extends BaseDbUnitTest { reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 调用 - PageResult pageResult = postService.getPostPage(reqVO); + PageResult pageResult = postService.getPostPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); @@ -64,7 +64,7 @@ public class PostServiceTest extends BaseDbUnitTest { @Test void testListPosts() { // mock 数据 - SysPostDO postDO = randomPojo(SysPostDO.class, o -> { + PostDO postDO = randomPojo(PostDO.class, o -> { o.setName("码仔"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); @@ -79,7 +79,7 @@ public class PostServiceTest extends BaseDbUnitTest { reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 调用 - List list = postService.getPosts(reqVO); + List list = postService.getPosts(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(postDO, list.get(0)); @@ -88,12 +88,12 @@ public class PostServiceTest extends BaseDbUnitTest { @Test void testGetPost() { // mock 数据 - SysPostDO dbPostDO = randomPostDO(); + PostDO dbPostDO = randomPostDO(); postMapper.insert(dbPostDO); // 准备参数 Long id = dbPostDO.getId(); // 调用 - SysPostDO post = postService.getPost(id); + PostDO post = postService.getPost(id); // 断言 assertNotNull(post); assertPojoEquals(dbPostDO, post); @@ -109,14 +109,14 @@ public class PostServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(postId); // 校验记录的属性是否正确 - SysPostDO post = postMapper.selectById(postId); + PostDO post = postMapper.selectById(postId); assertPojoEquals(reqVO, post); } @Test void testUpdatePost_success() { // mock 数据 - SysPostDO postDO = randomPostDO(); + PostDO postDO = randomPostDO(); postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 // 准备参数 PostUpdateReqVO reqVO = randomPojo(PostUpdateReqVO.class, @@ -128,14 +128,14 @@ public class PostServiceTest extends BaseDbUnitTest { // 调用 postService.updatePost(reqVO); // 校验是否更新正确 - SysPostDO post = postMapper.selectById(reqVO.getId());// 获取最新的 + PostDO post = postMapper.selectById(reqVO.getId());// 获取最新的 assertPojoEquals(reqVO, post); } @Test void testDeletePost_success() { // mock 数据 - SysPostDO postDO = randomPostDO(); + PostDO postDO = randomPostDO(); postMapper.insert(postDO); // 准备参数 Long id = postDO.getId(); @@ -155,7 +155,7 @@ public class PostServiceTest extends BaseDbUnitTest { @Test void testCheckPost_nameDuplicateForCreate() { // mock 数据 - SysPostDO postDO = randomPostDO(); + PostDO postDO = randomPostDO(); postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 // 准备参数 PostCreateReqVO reqVO = randomPojo(PostCreateReqVO.class, @@ -167,10 +167,10 @@ public class PostServiceTest extends BaseDbUnitTest { @Test void testCheckPost_codeDuplicateForUpdate() { // mock 数据 - SysPostDO postDO = randomPostDO(); + PostDO postDO = randomPostDO(); postMapper.insert(postDO); // mock 数据 稍后模拟重复它的 code - SysPostDO codePostDO = randomPostDO(); + PostDO codePostDO = randomPostDO(); postMapper.insert(codePostDO); // 准备参数 PostUpdateReqVO reqVO = randomPojo(PostUpdateReqVO.class, @@ -185,10 +185,10 @@ public class PostServiceTest extends BaseDbUnitTest { } @SafeVarargs - private static SysPostDO randomPostDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static PostDO randomPostDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 }; - return randomPojo(SysPostDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(PostDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java index e0f3d0e2b6..94691d4840 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.service.dict; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExpo import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; -import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictDataMapper; +import cn.iocoder.yudao.module.system.dal.mysql.dict.DictDataMapper; import cn.iocoder.yudao.module.system.mq.producer.dict.DictDataProducer; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; @@ -39,7 +39,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { private DictDataServiceImpl dictDataService; @Resource - private SysDictDataMapper dictDataMapper; + private DictDataMapper dictDataMapper; @MockBean private DictTypeService dictTypeService; @MockBean @@ -52,22 +52,22 @@ public class DictDataServiceTest extends BaseDbUnitTest { @SuppressWarnings("unchecked") public void testInitLocalCache() { // mock 数据 - SysDictDataDO dictData01 = randomDictDataDO(); + DictDataDO dictData01 = randomDictDataDO(); dictDataMapper.insert(dictData01); - SysDictDataDO dictData02 = randomDictDataDO(); + DictDataDO dictData02 = randomDictDataDO(); dictDataMapper.insert(dictData02); // 调用 dictDataService.initLocalCache(); // 断言 labelDictDataCache 缓存 - ImmutableTable labelDictDataCache = - (ImmutableTable) getFieldValue(dictDataService, "labelDictDataCache"); + ImmutableTable labelDictDataCache = + (ImmutableTable) getFieldValue(dictDataService, "labelDictDataCache"); assertEquals(2, labelDictDataCache.size()); assertPojoEquals(dictData01, labelDictDataCache.get(dictData01.getDictType(), dictData01.getLabel())); assertPojoEquals(dictData02, labelDictDataCache.get(dictData02.getDictType(), dictData02.getLabel())); // 断言 valueDictDataCache 缓存 - ImmutableTable valueDictDataCache = - (ImmutableTable) getFieldValue(dictDataService, "valueDictDataCache"); + ImmutableTable valueDictDataCache = + (ImmutableTable) getFieldValue(dictDataService, "valueDictDataCache"); assertEquals(2, valueDictDataCache.size()); assertPojoEquals(dictData01, valueDictDataCache.get(dictData01.getDictType(), dictData01.getValue())); assertPojoEquals(dictData02, valueDictDataCache.get(dictData02.getDictType(), dictData02.getValue())); @@ -79,7 +79,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { @Test public void testGetDictDataPage() { // mock 数据 - SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到 + DictDataDO dbDictData = randomPojo(DictDataDO.class, o -> { // 等会查询到 o.setLabel("芋艿"); o.setDictType("yunai"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -98,7 +98,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 调用 - PageResult pageResult = dictDataService.getDictDataPage(reqVO); + PageResult pageResult = dictDataService.getDictDataPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -108,7 +108,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { @Test public void testGetDictDataList() { // mock 数据 - SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到 + DictDataDO dbDictData = randomPojo(DictDataDO.class, o -> { // 等会查询到 o.setLabel("芋艿"); o.setDictType("yunai"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -127,7 +127,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 调用 - List list = dictDataService.getDictDatas(reqVO); + List list = dictDataService.getDictDatas(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbDictData, list.get(0)); @@ -146,7 +146,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(dictDataId); // 校验记录的属性是否正确 - SysDictDataDO dictData = dictDataMapper.selectById(dictDataId); + DictDataDO dictData = dictDataMapper.selectById(dictDataId); assertPojoEquals(reqVO, dictData); // 校验调用 verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); @@ -155,7 +155,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { @Test public void testUpdateDictData_success() { // mock 数据 - SysDictDataDO dbDictData = randomDictDataDO(); + DictDataDO dbDictData = randomDictDataDO(); dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 // 准备参数 DictDataUpdateReqVO reqVO = randomPojo(DictDataUpdateReqVO.class, o -> { @@ -168,7 +168,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { // 调用 dictDataService.updateDictData(reqVO); // 校验是否更新正确 - SysDictDataDO dictData = dictDataMapper.selectById(reqVO.getId()); // 获取最新的 + DictDataDO dictData = dictDataMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, dictData); // 校验调用 verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); @@ -177,7 +177,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { @Test public void testDeleteDictData_success() { // mock 数据 - SysDictDataDO dbDictData = randomDictDataDO(); + DictDataDO dbDictData = randomDictDataDO(); dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbDictData.getId(); @@ -193,7 +193,7 @@ public class DictDataServiceTest extends BaseDbUnitTest { @Test public void testCheckDictDataExists_success() { // mock 数据 - SysDictDataDO dbDictData = randomDictDataDO(); + DictDataDO dbDictData = randomDictDataDO(); dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 // 调用成功 @@ -273,18 +273,18 @@ public class DictDataServiceTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static SysDictDataDO randomDictDataDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static DictDataDO randomDictDataDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomCommonStatus()); // 保证 status 的范围 }; - return randomPojo(SysDictDataDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(DictDataDO.class, ArrayUtils.append(consumer, consumers)); } /** * 生成一个有效的字典类型 * * @param type 字典类型 - * @return SysDictTypeDO 对象 + * @return DictTypeDO 对象 */ private static DictTypeDO randomDictTypeDO(String type) { return randomPojo(DictTypeDO.class, o -> { diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceTest.java index 3b2d763be4..406f1e8a44 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceTest.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeUpda import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; -import cn.iocoder.yudao.module.system.dal.mysql.dict.SysDictTypeMapper; +import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; @@ -36,7 +36,7 @@ public class DictTypeServiceTest extends BaseDbUnitTest { private DictTypeServiceImpl dictTypeService; @Resource - private SysDictTypeMapper dictTypeMapper; + private DictTypeMapper dictTypeMapper; @MockBean private DictDataService dictDataService; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceTest.java index 045b10f39e..e16cbf1f29 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceTest.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeCre import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.mysql.errorcode.SysErrorCodeMapper; +import cn.iocoder.yudao.module.system.dal.mysql.errorcode.ErrorCodeMapper; import cn.iocoder.yudao.module.system.enums.errorcode.ErrorCodeTypeEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; @@ -36,7 +36,7 @@ public class ErrorCodeServiceTest extends BaseDbUnitTest { private ErrorCodeServiceImpl errorCodeService; @Resource - private SysErrorCodeMapper errorCodeMapper; + private ErrorCodeMapper errorCodeMapper; @Test public void testCreateErrorCode_success() { @@ -200,7 +200,7 @@ public class ErrorCodeServiceTest extends BaseDbUnitTest { } /** - * 情况 2.1,错误码存在,但是是 SysErrorCodeTypeEnum.MANUAL_OPERATION 类型 + * 情况 2.1,错误码存在,但是是 ErrorCodeTypeEnum.MANUAL_OPERATION 类型 */ @Test public void testAutoGenerateErrorCodes_021() { diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java index b17ad14047..1d59a64d07 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.logger; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.logger.LoginLogDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; @@ -38,7 +38,7 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { public void testGetLoginLogPage() { // 构造测试数据 // 登录成功的 - SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { + LoginLogDO loginLogDO = RandomUtils.randomPojo(LoginLogDO.class, logDO -> { logDO.setLogType(RandomUtil.randomEle(cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum.values()).getType()); logDO.setTraceId(TracerUtils.getTraceId()); logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()); @@ -70,7 +70,7 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { reqVO.setEndTime(buildTime(2021, 3, 7)); // 调用service方法 - PageResult pageResult = loginLogService.getLoginLogPage(reqVO); + PageResult pageResult = loginLogService.getLoginLogPage(reqVO); // 断言,只查到了一条符合条件的 assertEquals(1, pageResult.getTotal()); @@ -83,7 +83,7 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { // 构造测试数据 // 登录成功的 - SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { + LoginLogDO loginLogDO = RandomUtils.randomPojo(LoginLogDO.class, logDO -> { logDO.setLogType(RandomUtil.randomEle(cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum.values()).getType()); logDO.setTraceId(TracerUtils.getTraceId()); logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()); @@ -116,7 +116,7 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { // 调用service方法 - List loginLogList = loginLogService.getLoginLogList(reqVO); + List loginLogList = loginLogService.getLoginLogList(reqVO); // 断言 assertEquals(1, loginLogList.size()); @@ -136,7 +136,7 @@ public class LoginLogServiceImplTest extends BaseDbUnitTest { // 调用 loginLogService.createLoginLog(reqDTO); // 断言,忽略基本字段 - SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null); + LoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null); assertPojoEquals(reqDTO, sysLoginLogDO); } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java index feebc7145b..b7bbcbed10 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; import cn.iocoder.yudao.module.system.service.user.AdminUserService; -import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.enums.common.SexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -68,7 +68,7 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { // 先构造用户 AdminUserDO user = RandomUtils.randomPojo(AdminUserDO.class, o -> { o.setNickname("wangkai"); - o.setSex(SysSexEnum.MALE.getSex()); + o.setSex(SexEnum.MALE.getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); @@ -119,7 +119,7 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { // 先构造用户 AdminUserDO user = RandomUtils.randomPojo(AdminUserDO.class, o -> { o.setNickname("wangkai"); - o.setSex(SysSexEnum.MALE.getSex()); + o.setSex(SexEnum.MALE.getSex()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImplTest.java index 0d5babc505..ed0a707b5a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImplTest.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeCreateReq import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; -import cn.iocoder.yudao.module.system.dal.mysql.notice.SysNoticeMapper; +import cn.iocoder.yudao.module.system.dal.mysql.notice.NoticeMapper; import cn.iocoder.yudao.module.system.enums.notice.NoticeTypeEnum; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; @@ -32,7 +32,7 @@ class NoticeServiceImplTest extends BaseDbUnitTest { private NoticeServiceImpl sysNoticeService; @Resource - private SysNoticeMapper sysNoticeMapper; + private NoticeMapper sysNoticeMapper; @Test public void testPageNotices_success() { @@ -66,7 +66,7 @@ class NoticeServiceImplTest extends BaseDbUnitTest { @Test public void testGetNotice_success() { // 插入前置数据 - NoticeDO dbNotice = randomSysNoticeDO(); + NoticeDO dbNotice = randomNoticeDO(); sysNoticeMapper.insert(dbNotice); // 查询 @@ -80,7 +80,7 @@ class NoticeServiceImplTest extends BaseDbUnitTest { @Test public void testCreateNotice_success() { // 准备参数 - NoticeCreateReqVO reqVO = randomSysNoticeCreateReqVO(); + NoticeCreateReqVO reqVO = randomNoticeCreateReqVO(); // 校验插入是否成功 Long noticeId = sysNoticeService.createNotice(reqVO); @@ -94,11 +94,11 @@ class NoticeServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateNotice_success() { // 插入前置数据 - NoticeDO dbNoticeDO = randomSysNoticeDO(); + NoticeDO dbNoticeDO = randomNoticeDO(); sysNoticeMapper.insert(dbNoticeDO); // 准备更新参数 - NoticeUpdateReqVO reqVO = randomSysNoticeUpdateReqVO(o -> o.setId(dbNoticeDO.getId())); + NoticeUpdateReqVO reqVO = randomNoticeUpdateReqVO(o -> o.setId(dbNoticeDO.getId())); // 更新 sysNoticeService.updateNotice(reqVO); @@ -111,7 +111,7 @@ class NoticeServiceImplTest extends BaseDbUnitTest { @Test public void testDeleteNotice_success() { // 插入前置数据 - NoticeDO dbNotice = randomSysNoticeDO(); + NoticeDO dbNotice = randomNoticeDO(); sysNoticeMapper.insert(dbNotice); // 删除 @@ -124,7 +124,7 @@ class NoticeServiceImplTest extends BaseDbUnitTest { @Test public void checkNoticeExists_success() { // 插入前置数据 - NoticeDO dbNotice = randomSysNoticeDO(); + NoticeDO dbNotice = randomNoticeDO(); sysNoticeMapper.insert(dbNotice); // 成功调用 @@ -137,7 +137,7 @@ class NoticeServiceImplTest extends BaseDbUnitTest { } @SafeVarargs - private static NoticeDO randomSysNoticeDO(Consumer... consumers) { + private static NoticeDO randomNoticeDO(Consumer... consumers) { NoticeDO notice = randomPojo(NoticeDO.class, consumers); notice.setType(randomEle(NoticeTypeEnum.values()).getType()); notice.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -145,14 +145,14 @@ class NoticeServiceImplTest extends BaseDbUnitTest { } @SafeVarargs - private static NoticeUpdateReqVO randomSysNoticeUpdateReqVO(Consumer... consumers) { + private static NoticeUpdateReqVO randomNoticeUpdateReqVO(Consumer... consumers) { NoticeUpdateReqVO reqVO = randomPojo(NoticeUpdateReqVO.class, consumers); reqVO.setType(randomEle(NoticeTypeEnum.values()).getType()); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); return reqVO; } - private static NoticeCreateReqVO randomSysNoticeCreateReqVO() { + private static NoticeCreateReqVO randomNoticeCreateReqVO() { NoticeCreateReqVO reqVO = randomPojo(NoticeCreateReqVO.class); reqVO.setType(randomEle(NoticeTypeEnum.values()).getType()); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java index dc915e3079..dc6a99ed97 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.permission; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; @@ -194,7 +194,7 @@ public class PermissionServiceTest extends BaseDbUnitTest { RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_AND_CHILD.getScope())); when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO)); // mock 方法(部门) - SysDeptDO deptDO = randomPojo(SysDeptDO.class); + DeptDO deptDO = randomPojo(DeptDO.class); when(deptService.getDeptsByParentIdFromCache(eq(loginUser.getDeptId()), eq(true))) .thenReturn(singletonList(deptDO)); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java index d255cbf742..7e8b8445ed 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannel import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; @@ -51,9 +51,9 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { @Test public void testInitLocalCache_success() { // mock 数据 - SysSmsChannelDO smsChannelDO01 = randomSmsChannelDO(); + SmsChannelDO smsChannelDO01 = randomSmsChannelDO(); smsChannelMapper.insert(smsChannelDO01); - SysSmsChannelDO smsChannelDO02 = randomSmsChannelDO(); + SmsChannelDO smsChannelDO02 = randomSmsChannelDO(); smsChannelMapper.insert(smsChannelDO02); // 调用 @@ -78,7 +78,7 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(smsChannelId); // 校验记录的属性是否正确 - SysSmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId); + SmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId); assertPojoEquals(reqVO, smsChannel); // 校验调用 verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); @@ -87,7 +87,7 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { @Test public void testUpdateSmsChannel_success() { // mock 数据 - SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); + SmsChannelDO dbSmsChannel = randomSmsChannelDO(); smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 // 准备参数 SmsChannelUpdateReqVO reqVO = randomPojo(SmsChannelUpdateReqVO.class, o -> { @@ -99,7 +99,7 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { // 调用 smsChannelService.updateSmsChannel(reqVO); // 校验是否更新正确 - SysSmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的 + SmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, smsChannel); // 校验调用 verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); @@ -117,7 +117,7 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { @Test public void testDeleteSmsChannel_success() { // mock 数据 - SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); + SmsChannelDO dbSmsChannel = randomSmsChannelDO(); smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbSmsChannel.getId(); @@ -142,7 +142,7 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { @Test public void testDeleteSmsChannel_hasChildren() { // mock 数据 - SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); + SmsChannelDO dbSmsChannel = randomSmsChannelDO(); smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbSmsChannel.getId(); @@ -156,7 +156,7 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { @Test public void testGetSmsChannelPage() { // mock 数据 - SysSmsChannelDO dbSmsChannel = randomPojo(SysSmsChannelDO.class, o -> { // 等会查询到 + SmsChannelDO dbSmsChannel = randomPojo(SmsChannelDO.class, o -> { // 等会查询到 o.setSignature("芋道源码"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setCreateTime(buildTime(2020, 12, 12)); @@ -176,7 +176,7 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2020, 12, 24)); // 调用 - PageResult pageResult = smsChannelService.getSmsChannelPage(reqVO); + PageResult pageResult = smsChannelService.getSmsChannelPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -186,11 +186,11 @@ public class SmsChannelServiceTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static SysSmsChannelDO randomSmsChannelDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static SmsChannelDO randomSmsChannelDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 }; - return randomPojo(SysSmsChannelDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(SmsChannelDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java index 7b0b0918f5..de6a6bd0ca 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java @@ -4,12 +4,12 @@ import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsLogMapper; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsSendStatusEnum; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsTemplateTypeEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsReceiveStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsSendStatusEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsTemplateTypeEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; @@ -44,13 +44,13 @@ public class SmsLogServiceTest extends BaseDbUnitTest { @Test public void testGetSmsLogPage() { // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 + SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 o.setChannelId(1L); o.setTemplateId(10L); o.setMobile("15601691300"); - o.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); + o.setSendStatus(SmsSendStatusEnum.INIT.getStatus()); o.setSendTime(buildTime(2020, 11, 11)); - o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); o.setReceiveTime(buildTime(2021, 11, 11)); }); smsLogMapper.insert(dbSmsLog); @@ -61,11 +61,11 @@ public class SmsLogServiceTest extends BaseDbUnitTest { // 测试 mobile 不匹配 smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999"))); // 测试 sendStatus 不匹配 - smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()))); + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus()))); // 测试 sendTime 不匹配 smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); // 测试 receiveStatus 不匹配 - smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.SUCCESS.getStatus()))); + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus()))); // 测试 receiveTime 不匹配 smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); // 准备参数 @@ -73,15 +73,15 @@ public class SmsLogServiceTest extends BaseDbUnitTest { reqVO.setChannelId(1L); reqVO.setTemplateId(10L); reqVO.setMobile("156"); - reqVO.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); + reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus()); reqVO.setBeginSendTime(buildTime(2020, 11, 1)); reqVO.setEndSendTime(buildTime(2020, 11, 30)); - reqVO.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); reqVO.setBeginReceiveTime(buildTime(2021, 11, 1)); reqVO.setEndReceiveTime(buildTime(2021, 11, 30)); // 调用 - PageResult pageResult = smsLogService.getSmsLogPage(reqVO); + PageResult pageResult = smsLogService.getSmsLogPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -91,13 +91,13 @@ public class SmsLogServiceTest extends BaseDbUnitTest { @Test public void testGetSmsLogList() { // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 + SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 o.setChannelId(1L); o.setTemplateId(10L); o.setMobile("15601691300"); - o.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); + o.setSendStatus(SmsSendStatusEnum.INIT.getStatus()); o.setSendTime(buildTime(2020, 11, 11)); - o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); o.setReceiveTime(buildTime(2021, 11, 11)); }); smsLogMapper.insert(dbSmsLog); @@ -108,11 +108,11 @@ public class SmsLogServiceTest extends BaseDbUnitTest { // 测试 mobile 不匹配 smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999"))); // 测试 sendStatus 不匹配 - smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()))); + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus()))); // 测试 sendTime 不匹配 smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); // 测试 receiveStatus 不匹配 - smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.SUCCESS.getStatus()))); + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus()))); // 测试 receiveTime 不匹配 smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); // 准备参数 @@ -120,15 +120,15 @@ public class SmsLogServiceTest extends BaseDbUnitTest { reqVO.setChannelId(1L); reqVO.setTemplateId(10L); reqVO.setMobile("156"); - reqVO.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); + reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus()); reqVO.setBeginSendTime(buildTime(2020, 11, 1)); reqVO.setEndSendTime(buildTime(2020, 11, 30)); - reqVO.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); reqVO.setBeginReceiveTime(buildTime(2021, 11, 1)); reqVO.setEndReceiveTime(buildTime(2021, 11, 30)); // 调用 - List list = smsLogService.getSmsLogList(reqVO); + List list = smsLogService.getSmsLogList(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbSmsLog, list.get(0)); @@ -141,8 +141,8 @@ public class SmsLogServiceTest extends BaseDbUnitTest { Long userId = randomLongId(); Integer userType = randomEle(UserTypeEnum.values()).getValue(); Boolean isSend = randomBoolean(); - SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class, - o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType())); + SmsTemplateDO templateDO = randomPojo(SmsTemplateDO.class, + o -> o.setType(randomEle(SmsTemplateTypeEnum.values()).getType())); String templateContent = randomString(); Map templateParams = randomTemplateParams(); // mock 方法 @@ -151,8 +151,8 @@ public class SmsLogServiceTest extends BaseDbUnitTest { Long logId = smsLogService.createSmsLog(mobile, userId, userType, isSend, templateDO, templateContent, templateParams); // 断言 - SysSmsLogDO logDO = smsLogMapper.selectById(logId); - assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(), + SmsLogDO logDO = smsLogMapper.selectById(logId); + assertEquals(isSend ? SmsSendStatusEnum.INIT.getStatus() : SmsSendStatusEnum.IGNORE.getStatus(), logDO.getSendStatus()); assertEquals(mobile, logDO.getMobile()); assertEquals(userType, logDO.getUserType()); @@ -164,14 +164,14 @@ public class SmsLogServiceTest extends BaseDbUnitTest { assertEquals(templateDO.getChannelCode(), logDO.getChannelCode()); assertEquals(templateContent, logDO.getTemplateContent()); assertEquals(templateParams, logDO.getTemplateParams()); - assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus()); + assertEquals(SmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus()); } @Test public void testUpdateSmsSendResult() { // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO( - o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus())); + SmsLogDO dbSmsLog = randomSmsLogDO( + o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())); smsLogMapper.insert(dbSmsLog); // 准备参数 Long id = dbSmsLog.getId(); @@ -187,8 +187,8 @@ public class SmsLogServiceTest extends BaseDbUnitTest { apiSendCode, apiSendMsg, apiRequestId, apiSerialNo); // 断言 dbSmsLog = smsLogMapper.selectById(id); - assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus() - : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus()); + assertEquals(CommonResult.isSuccess(sendCode) ? SmsSendStatusEnum.SUCCESS.getStatus() + : SmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus()); assertNotNull(dbSmsLog.getSendTime()); assertEquals(sendMsg, dbSmsLog.getSendMsg()); assertEquals(apiSendCode, dbSmsLog.getApiSendCode()); @@ -200,8 +200,8 @@ public class SmsLogServiceTest extends BaseDbUnitTest { @Test public void testUpdateSmsReceiveResult() { // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO( - o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus())); + SmsLogDO dbSmsLog = randomSmsLogDO( + o -> o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus())); smsLogMapper.insert(dbSmsLog); // 准备参数 Long id = dbSmsLog.getId(); @@ -214,8 +214,8 @@ public class SmsLogServiceTest extends BaseDbUnitTest { smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg); // 断言 dbSmsLog = smsLogMapper.selectById(id); - assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus() - : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); + assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus() + : SmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); assertEquals(receiveTime, dbSmsLog.getReceiveTime()); assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode()); assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg()); @@ -224,15 +224,15 @@ public class SmsLogServiceTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static SysSmsLogDO randomSmsLogDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static SmsLogDO randomSmsLogDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setTemplateParams(randomTemplateParams()); - o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 + o.setTemplateType(randomEle(SmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围 - o.setSendStatus(randomEle(SysSmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围 - o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围 + o.setSendStatus(randomEle(SmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围 + o.setReceiveStatus(randomEle(SmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围 }; - return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(SmsLogDO.class, ArrayUtils.append(consumer, consumers)); } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java similarity index 95% rename from yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java rename to yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java index 0bd82475ff..7f9309499c 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SysSmsSendServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; import cn.iocoder.yudao.framework.common.core.KeyValue; @@ -30,7 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -public class SysSmsSendServiceTest extends BaseMockitoUnitTest { +public class SmsSendServiceTest extends BaseMockitoUnitTest { @InjectMocks private SmsSendServiceImpl smsService; @@ -57,7 +57,7 @@ public class SysSmsSendServiceTest extends BaseMockitoUnitTest { Map templateParams = MapUtil.builder().put("code", "1234") .put("op", "login").build(); // mock SmsTemplateService 的方法 - SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, o -> { + SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> { o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setContent("验证码为{code}, 操作为{op}"); o.setParams(Lists.newArrayList("code", "op")); @@ -94,7 +94,7 @@ public class SysSmsSendServiceTest extends BaseMockitoUnitTest { Map templateParams = MapUtil.builder().put("code", "1234") .put("op", "login").build(); // mock SmsTemplateService 的方法 - SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, o -> { + SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> { o.setStatus(CommonStatusEnum.DISABLE.getStatus()); o.setContent("验证码为{code}, 操作为{op}"); o.setParams(Lists.newArrayList("code", "op")); @@ -131,7 +131,7 @@ public class SysSmsSendServiceTest extends BaseMockitoUnitTest { @Test public void testBuildTemplateParams_paramMiss() { // 准备参数 - SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, + SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> o.setParams(Lists.newArrayList("code"))); Map templateParams = new HashMap<>(); // mock 方法 diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java index 3025b8d642..034310fa26 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java @@ -4,11 +4,11 @@ import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTempla import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsTemplateMapper; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.yudao.module.system.enums.sms.SysSmsTemplateTypeEnum; +import cn.iocoder.yudao.module.system.enums.sms.SmsTemplateTypeEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -64,15 +64,15 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { @SuppressWarnings("unchecked") void testInitLocalCache() { // mock 数据 - SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO(); + SmsTemplateDO smsTemplate01 = randomSmsTemplateDO(); smsTemplateMapper.insert(smsTemplate01); - SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO(); + SmsTemplateDO smsTemplate02 = randomSmsTemplateDO(); smsTemplateMapper.insert(smsTemplate02); // 调用 smsTemplateService.initLocalCache(); // 断言 deptCache 缓存 - Map smsTemplateCache = (Map) getFieldValue(smsTemplateService, "smsTemplateCache"); + Map smsTemplateCache = (Map) getFieldValue(smsTemplateService, "smsTemplateCache"); assertEquals(2, smsTemplateCache.size()); assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode())); assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode())); @@ -100,10 +100,10 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { SmsTemplateCreateReqVO reqVO = randomPojo(SmsTemplateCreateReqVO.class, o -> { o.setContent("正在进行登录操作{operation},您的验证码是{code}"); o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + o.setType(randomEle(SmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 }); // mock Channel 的方法 - SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { + SmsChannelDO channelDO = randomPojo(SmsChannelDO.class, o -> { o.setId(reqVO.getChannelId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 }); @@ -118,7 +118,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(smsTemplateId); // 校验记录的属性是否正确 - SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(smsTemplateId); + SmsTemplateDO smsTemplate = smsTemplateMapper.selectById(smsTemplateId); assertPojoEquals(reqVO, smsTemplate); assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); @@ -130,17 +130,17 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { @SuppressWarnings("unchecked") public void testUpdateSmsTemplate_success() { // mock 数据 - SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); + SmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 // 准备参数 SmsTemplateUpdateReqVO reqVO = randomPojo(SmsTemplateUpdateReqVO.class, o -> { o.setId(dbSmsTemplate.getId()); // 设置更新的 ID o.setContent("正在进行登录操作{operation},您的验证码是{code}"); o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + o.setType(randomEle(SmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 }); // mock 方法 - SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { + SmsChannelDO channelDO = randomPojo(SmsChannelDO.class, o -> { o.setId(reqVO.getChannelId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 }); @@ -153,7 +153,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { // 调用 smsTemplateService.updateSmsTemplate(reqVO); // 校验是否更新正确 - SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(reqVO.getId()); // 获取最新的 + SmsTemplateDO smsTemplate = smsTemplateMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, smsTemplate); assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); @@ -173,7 +173,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { @Test public void testDeleteSmsTemplate_success() { // mock 数据 - SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); + SmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbSmsTemplate.getId(); @@ -198,8 +198,8 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { @Test public void testGetSmsTemplatePage() { // mock 数据 - SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到 - o.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); + SmsTemplateDO dbSmsTemplate = randomPojo(SmsTemplateDO.class, o -> { // 等会查询到 + o.setType(SmsTemplateTypeEnum.PROMOTION.getType()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setCode("yudaoyuanma"); o.setContent("芋道源码"); @@ -209,7 +209,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { }); smsTemplateMapper.insert(dbSmsTemplate); // 测试 type 不匹配 - smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setType(SysSmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setType(SmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); // 测试 status 不匹配 smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); // 测试 code 不匹配 @@ -224,7 +224,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); // 准备参数 SmsTemplatePageReqVO reqVO = new SmsTemplatePageReqVO(); - reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); + reqVO.setType(SmsTemplateTypeEnum.PROMOTION.getType()); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); reqVO.setCode("yudao"); reqVO.setContent("芋道"); @@ -234,7 +234,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2021, 12, 1)); // 调用 - PageResult pageResult = smsTemplateService.getSmsTemplatePage(reqVO); + PageResult pageResult = smsTemplateService.getSmsTemplatePage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -244,8 +244,8 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { @Test public void testGetSmsTemplateList() { // mock 数据 - SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到 - o.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); + SmsTemplateDO dbSmsTemplate = randomPojo(SmsTemplateDO.class, o -> { // 等会查询到 + o.setType(SmsTemplateTypeEnum.PROMOTION.getType()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setCode("yudaoyuanma"); o.setContent("芋道源码"); @@ -255,7 +255,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { }); smsTemplateMapper.insert(dbSmsTemplate); // 测试 type 不匹配 - smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setType(SysSmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setType(SmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); // 测试 status 不匹配 smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); // 测试 code 不匹配 @@ -270,7 +270,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); // 准备参数 SmsTemplateExportReqVO reqVO = new SmsTemplateExportReqVO(); - reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); + reqVO.setType(SmsTemplateTypeEnum.PROMOTION.getType()); reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); reqVO.setCode("yudao"); reqVO.setContent("芋道"); @@ -280,7 +280,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2021, 12, 1)); // 调用 - List list = smsTemplateService.getSmsTemplateList(reqVO); + List list = smsTemplateService.getSmsTemplateList(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbSmsTemplate, list.get(0)); @@ -291,14 +291,14 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { // 准备参数 Long channelId = randomLongId(); // mock 方法 - SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { + SmsChannelDO channelDO = randomPojo(SmsChannelDO.class, o -> { o.setId(channelId); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 }); when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO); // 调用 - SysSmsChannelDO returnChannelDO = smsTemplateService.checkSmsChannel(channelId); + SmsChannelDO returnChannelDO = smsTemplateService.checkSmsChannel(channelId); // 断言 assertPojoEquals(returnChannelDO, channelDO); } @@ -318,7 +318,7 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { // 准备参数 Long channelId = randomLongId(); // mock 方法 - SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { + SmsChannelDO channelDO = randomPojo(SmsChannelDO.class, o -> { o.setId(channelId); o.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 保证 status 禁用,触发失败 }); @@ -363,12 +363,12 @@ public class SmsTemplateServiceTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static SysSmsTemplateDO randomSmsTemplateDO(Consumer... consumers) { - Consumer consumer = (o) -> { + private static SmsTemplateDO randomSmsTemplateDO(Consumer... consumers) { + Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + o.setType(randomEle(SmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 }; - return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); + return randomPojo(SmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceTest.java index a67da17f2f..8fb527baa8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceTest.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.social; -import cn.iocoder.yudao.module.system.dal.dataobject.social.SysSocialUserDO; -import cn.iocoder.yudao.module.system.dal.mysql.social.SysSocialUserMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.social.SocialUserMapper; import cn.iocoder.yudao.module.system.dal.redis.social.SocialAuthUserRedisDAO; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; @@ -29,13 +29,13 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { private SocialUserServiceImpl socialService; @Resource - private SysSocialUserMapper socialUserMapper; + private SocialUserMapper socialUserMapper; @MockBean private AuthRequestFactory authRequestFactory; /** - * 情况一,创建 SysSocialUserDO 的情况 + * 情况一,创建 SocialUserDO 的情况 */ @Test public void testBindSocialUser_create() { @@ -49,18 +49,18 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { // 调用 socialService.bindSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, authUser); // 断言 - List socialUsers = socialUserMapper.selectList("user_id", userId); + List socialUsers = socialUserMapper.selectList("user_id", userId); assertEquals(1, socialUsers.size()); assertBindSocialUser(socialUsers.get(0), authUser, userId, type); } /** - * 情况二,更新 SysSocialUserDO 的情况 + * 情况二,更新 SocialUserDO 的情况 */ @Test public void testBindSocialUser_update() { // mock 数据 - SysSocialUserDO dbSocialUser = randomPojo(SysSocialUserDO.class, socialUserDO -> { + SocialUserDO dbSocialUser = randomPojo(SocialUserDO.class, socialUserDO -> { socialUserDO.setUserType(UserTypeEnum.ADMIN.getValue()); socialUserDO.setType(randomEle(SocialTypeEnum.values()).getType()); }); @@ -74,7 +74,7 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { // 调用 socialService.bindSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, authUser); // 断言 - List socialUsers = socialUserMapper.selectList("user_id", userId); + List socialUsers = socialUserMapper.selectList("user_id", userId); assertEquals(1, socialUsers.size()); assertBindSocialUser(socialUsers.get(0), authUser, userId, type); } @@ -85,7 +85,7 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { @Test public void testBindSocialUser_userId() { // mock 数据 - SysSocialUserDO dbSocialUser = randomPojo(SysSocialUserDO.class, socialUserDO -> { + SocialUserDO dbSocialUser = randomPojo(SocialUserDO.class, socialUserDO -> { socialUserDO.setUserType(UserTypeEnum.ADMIN.getValue()); socialUserDO.setType(randomEle(SocialTypeEnum.values()).getType()); }); @@ -99,12 +99,12 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { // 调用 socialService.bindSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, authUser); // 断言 - List socialUsers = socialUserMapper.selectList("user_id", userId); + List socialUsers = socialUserMapper.selectList("user_id", userId); assertEquals(1, socialUsers.size()); } - private void assertBindSocialUser(SysSocialUserDO socialUser, AuthUser authUser, Long userId, - Integer type) { + private void assertBindSocialUser(SocialUserDO socialUser, AuthUser authUser, Long userId, + Integer type) { assertEquals(authUser.getToken().getAccessToken(), socialUser.getToken()); assertEquals(toJsonString(authUser.getToken()), socialUser.getRawTokenInfo()); assertEquals(authUser.getNickname(), socialUser.getNickname()); @@ -123,7 +123,7 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { @Test public void testUnbindOldSocialUser_no() { // mock 数据 - SysSocialUserDO oldSocialUser = randomPojo(SysSocialUserDO.class, socialUserDO -> { + SocialUserDO oldSocialUser = randomPojo(SocialUserDO.class, socialUserDO -> { socialUserDO.setUserType(UserTypeEnum.ADMIN.getValue()); socialUserDO.setType(randomEle(SocialTypeEnum.values()).getType()); }); @@ -146,7 +146,7 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { @Test public void testUnbindOldSocialUser_yes() { // mock 数据 - SysSocialUserDO oldSocialUser = randomPojo(SysSocialUserDO.class, socialUserDO -> { + SocialUserDO oldSocialUser = randomPojo(SocialUserDO.class, socialUserDO -> { socialUserDO.setUserType(UserTypeEnum.ADMIN.getValue()); socialUserDO.setType(randomEle(SocialTypeEnum.values()).getType()); }); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java index 49c96cc5ae..ade6613a0d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceTest.java @@ -4,8 +4,8 @@ import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantCreateReq import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.TenantUpdateReqVO; -import cn.iocoder.yudao.module.system.dal.mysql.tenant.SysTenantMapper; -import cn.iocoder.yudao.module.system.dal.dataobject.tenant.SysTenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; +import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; @@ -30,7 +30,7 @@ public class TenantServiceTest extends BaseDbUnitTest { private TenantServiceImpl tenantService; @Resource - private SysTenantMapper tenantMapper; + private TenantMapper tenantMapper; @Test public void testCreateTenant_success() { @@ -42,14 +42,14 @@ public class TenantServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(tenantId); // 校验记录的属性是否正确 - SysTenantDO tenant = tenantMapper.selectById(tenantId); + TenantDO tenant = tenantMapper.selectById(tenantId); assertPojoEquals(reqVO, tenant); } @Test public void testUpdateTenant_success() { // mock 数据 - SysTenantDO dbTenant = randomPojo(SysTenantDO.class, o -> o.setStatus(randomCommonStatus())); + TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setStatus(randomCommonStatus())); tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 // 准备参数 TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class, o -> { @@ -60,7 +60,7 @@ public class TenantServiceTest extends BaseDbUnitTest { // 调用 tenantService.updateTenant(reqVO); // 校验是否更新正确 - SysTenantDO tenant = tenantMapper.selectById(reqVO.getId()); // 获取最新的 + TenantDO tenant = tenantMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, tenant); } @@ -76,7 +76,7 @@ public class TenantServiceTest extends BaseDbUnitTest { @Test public void testDeleteTenant_success() { // mock 数据 - SysTenantDO dbTenant = randomPojo(SysTenantDO.class, + TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setStatus(randomCommonStatus())); tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 // 准备参数 @@ -100,7 +100,7 @@ public class TenantServiceTest extends BaseDbUnitTest { @Test public void testGetTenantPage() { // mock 数据 - SysTenantDO dbTenant = randomPojo(SysTenantDO.class, o -> { // 等会查询到 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> { // 等会查询到 o.setName("芋道源码"); o.setContactName("芋艿"); o.setContactMobile("15601691300"); @@ -128,7 +128,7 @@ public class TenantServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2020, 12, 24)); // 调用 - PageResult pageResult = tenantService.getTenantPage(reqVO); + PageResult pageResult = tenantService.getTenantPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -138,7 +138,7 @@ public class TenantServiceTest extends BaseDbUnitTest { @Test public void testGetTenantList() { // mock 数据 - SysTenantDO dbTenant = randomPojo(SysTenantDO.class, o -> { // 等会查询到 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> { // 等会查询到 o.setName("芋道源码"); o.setContactName("芋艿"); o.setContactMobile("15601691300"); @@ -166,7 +166,7 @@ public class TenantServiceTest extends BaseDbUnitTest { reqVO.setEndCreateTime(buildTime(2020, 12, 24)); // 调用 - List list = tenantService.getTenantList(reqVO); + List list = tenantService.getTenantList(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbTenant, list.get(0)); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java index c96f9c44c8..ffff7e2bdd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.user; import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -10,11 +11,11 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; -import cn.iocoder.yudao.module.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.module.system.enums.common.SexEnum; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; @@ -68,18 +69,18 @@ public class UserServiceImplTest extends BaseDbUnitTest { public void testCreatUser_success() { // 准备参数 UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class, o -> { - o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); + o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); o.setMobile(randomString()); }); // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + DeptDO dept = randomPojo(DeptDO.class, o -> { o.setId(reqVO.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); // mock postService 的方法 - List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> - randomPojo(SysPostDO.class, o -> { + List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> + randomPojo(PostDO.class, o -> { o.setId(postId); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); })); @@ -99,23 +100,23 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateUser_success() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomAdminUserDO(); userMapper.insert(dbUser); // 准备参数 UserUpdateReqVO reqVO = randomPojo(UserUpdateReqVO.class, o -> { o.setId(dbUser.getId()); - o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); + o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); o.setMobile(randomString()); }); // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + DeptDO dept = randomPojo(DeptDO.class, o -> { o.setId(reqVO.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); // mock postService 的方法 - List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> - randomPojo(SysPostDO.class, o -> { + List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> + randomPojo(PostDO.class, o -> { o.setId(postId); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); })); @@ -131,13 +132,13 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateUserProfile_success() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomAdminUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); UserProfileUpdateReqVO reqVO = randomPojo(UserProfileUpdateReqVO.class, o -> { o.setMobile(randomString()); - o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); + o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); }); // 调用 @@ -150,7 +151,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateUserPassword_success() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(o -> o.setPassword("encode:yudao")); + AdminUserDO dbUser = randomAdminUserDO(o -> o.setPassword("encode:yudao")); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -173,7 +174,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateUserAvatar_success() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomAdminUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -193,7 +194,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateUserPassword02_success() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomAdminUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -212,7 +213,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateUserStatus() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomAdminUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -228,7 +229,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testDeleteUser_success(){ // mock 数据 - AdminUserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomAdminUserDO(); userMapper.insert(dbUser); // 准备参数 Long userId = dbUser.getId(); @@ -254,7 +255,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { reqVO.setEndTime(buildTime(2020, 12, 24)); reqVO.setDeptId(1L); // 其中,1L 是 2L 的父部门 // mock 方法 - List deptList = newArrayList(randomPojo(SysDeptDO.class, o -> o.setId(2L))); + List deptList = newArrayList(randomPojo(DeptDO.class, o -> o.setId(2L))); when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); // 调用 @@ -278,7 +279,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { reqVO.setEndTime(buildTime(2020, 12, 24)); reqVO.setDeptId(1L); // 其中,1L 是 2L 的父部门 // mock 方法 - List deptList = newArrayList(randomPojo(SysDeptDO.class, o -> o.setId(2L))); + List deptList = newArrayList(randomPojo(DeptDO.class, o -> o.setId(2L))); when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); // 调用 @@ -293,7 +294,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { */ private AdminUserDO initGetUserPageData() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(o -> { // 等会查询到 + AdminUserDO dbUser = randomAdminUserDO(o -> { // 等会查询到 o.setUsername("yudaoyuanma"); o.setMobile("15601691300"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); @@ -320,8 +321,10 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_01() { // 准备参数 - UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class); - // mock 方法 + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { + }); + // mock 方法,模拟失败 + doThrow(new ServiceException(DEPT_NOT_FOUND)).when(deptService).validDepts(any()); // 调用 UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); @@ -340,10 +343,10 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 + o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 }); // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + DeptDO dept = randomPojo(DeptDO.class, o -> { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); @@ -368,16 +371,16 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_03() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomAdminUserDO(); userMapper.insert(dbUser); // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 + o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 o.setUsername(dbUser.getUsername()); }); // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + DeptDO dept = randomPojo(DeptDO.class, o -> { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); @@ -398,16 +401,16 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testImportUsers_04() { // mock 数据 - AdminUserDO dbUser = randomSysUserDO(); + AdminUserDO dbUser = randomAdminUserDO(); userMapper.insert(dbUser); // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 + o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 o.setUsername(dbUser.getUsername()); }); // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + DeptDO dept = randomPojo(DeptDO.class, o -> { o.setId(importUser.getDeptId()); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); @@ -433,7 +436,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 准备参数 String username = randomString(); // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setUsername(username))); + userMapper.insert(randomAdminUserDO(o -> o.setUsername(username))); // 调用,校验异常 assertServiceException(() -> userService.checkUsernameUnique(null, username), @@ -446,7 +449,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { Long id = randomLongId(); String username = randomString(); // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setUsername(username))); + userMapper.insert(randomAdminUserDO(o -> o.setUsername(username))); // 调用,校验异常 assertServiceException(() -> userService.checkUsernameUnique(id, username), @@ -458,7 +461,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 准备参数 String email = randomString(); // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setEmail(email))); + userMapper.insert(randomAdminUserDO(o -> o.setEmail(email))); // 调用,校验异常 assertServiceException(() -> userService.checkEmailUnique(null, email), @@ -471,7 +474,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { Long id = randomLongId(); String email = randomString(); // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setEmail(email))); + userMapper.insert(randomAdminUserDO(o -> o.setEmail(email))); // 调用,校验异常 assertServiceException(() -> userService.checkEmailUnique(id, email), @@ -483,7 +486,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { // 准备参数 String mobile = randomString(); // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setMobile(mobile))); + userMapper.insert(randomAdminUserDO(o -> o.setMobile(mobile))); // 调用,校验异常 assertServiceException(() -> userService.checkMobileUnique(null, mobile), @@ -496,7 +499,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { Long id = randomLongId(); String mobile = randomString(); // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setMobile(mobile))); + userMapper.insert(randomAdminUserDO(o -> o.setMobile(mobile))); // 调用,校验异常 assertServiceException(() -> userService.checkMobileUnique(id, mobile), @@ -512,7 +515,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @Test public void testCheckOldPassword_passwordFailed() { // mock 数据 - AdminUserDO user = randomSysUserDO(); + AdminUserDO user = randomAdminUserDO(); userMapper.insert(user); // 准备参数 Long id = user.getId(); @@ -530,13 +533,13 @@ public class UserServiceImplTest extends BaseDbUnitTest { // // 准备参数 // Collection postIds = asSet(10L, 20L); // // mock 方法 -// SysUserDO user1 = randomSysUserDO(o -> o.setPostIds(asSet(10L, 30L))); +// AdminUserDO user1 = randomAdminUserDO(o -> o.setPostIds(asSet(10L, 30L))); // userMapper.insert(user1); -// SysUserDO user2 = randomSysUserDO(o -> o.setPostIds(singleton(100L))); +// AdminUserDO user2 = randomAdminUserDO(o -> o.setPostIds(singleton(100L))); // userMapper.insert(user2); // // // 调用 -// List result = userService.getUsersByPostIds(postIds); +// List result = userService.getUsersByPostIds(postIds); // // 断言 // assertEquals(1, result.size()); // assertEquals(user1, result.get(0)); @@ -545,10 +548,10 @@ public class UserServiceImplTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static AdminUserDO randomSysUserDO(Consumer... consumers) { + private static AdminUserDO randomAdminUserDO(Consumer... consumers) { Consumer consumer = (o) -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 + o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 }; return randomPojo(AdminUserDO.class, ArrayUtils.append(consumer, consumers)); } diff --git a/yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml b/yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000000..9164b07e60 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml @@ -0,0 +1,55 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具 + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +yudao: + info: + base-package: cn.iocoder.yudao.module.member.dal.mysql + member-package: cn.iocoder.yudao.module.member # TODO 芋艿:要清理掉 + system-package: cn.iocoder.yudao.module.system # TODO 芋艿:要清理掉 + core-service: + base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 + captcha: + timeout: 5m + width: 160 + height: 60 diff --git a/yudao-module-system/yudao-module-system-impl/src/test/resources/logback-spring.xml b/yudao-module-system/yudao-module-system-impl/src/test/resources/logback-spring.xml new file mode 100644 index 0000000000..daf756bff0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/test/resources/logback-spring.xml @@ -0,0 +1,4 @@ + + + + diff --git a/yudao-module-system/yudao-module-system-impl/src/test/resources/sql/clean.sql b/yudao-module-system/yudao-module-system-impl/src/test/resources/sql/clean.sql new file mode 100644 index 0000000000..88c7c845bd --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/test/resources/sql/clean.sql @@ -0,0 +1,18 @@ +DELETE FROM "system_dept"; +DELETE FROM "system_dict_data"; +DELETE FROM "system_role"; +DELETE FROM "system_role_menu"; +DELETE FROM "system_menu"; +DELETE FROM "system_user_role"; +DELETE FROM "system_dict_type"; +DELETE FROM "system_user_session"; +DELETE FROM "system_post"; +DELETE FROM "system_login_log"; +DELETE FROM "system_operate_log"; +DELETE FROM "system_user"; +DELETE FROM "system_sms_channel"; +DELETE FROM "system_sms_template"; +DELETE FROM "system_sms_log"; +DELETE FROM "system_error_code"; +DELETE FROM "system_social_user"; +DELETE FROM "system_tenant"; diff --git a/yudao-module-system/yudao-module-system-impl/src/test/resources/sql/create_tables.sql b/yudao-module-system/yudao-module-system-impl/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000000..914352e8f1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/test/resources/sql/create_tables.sql @@ -0,0 +1,405 @@ +-- sys 开头的 DB + +CREATE TABLE IF NOT EXISTS "system_dept" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL DEFAULT '', + "parent_id" bigint NOT NULL DEFAULT '0', + "sort" int NOT NULL DEFAULT '0', + "leader_user_id" bigint DEFAULT NULL, + "phone" varchar(11) DEFAULT NULL, + "email" varchar(50) DEFAULT NULL, + "status" tinyint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '部门表'; + +CREATE TABLE IF NOT EXISTS "system_dict_data" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "sort" int NOT NULL DEFAULT '0', + "label" varchar(100) NOT NULL DEFAULT '', + "value" varchar(100) NOT NULL DEFAULT '', + "dict_type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典数据表'; + +CREATE TABLE IF NOT EXISTS "system_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL, + "code" varchar(100) NOT NULL, + "sort" int NOT NULL, + "data_scope" tinyint NOT NULL DEFAULT '1', + "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '', + "status" tinyint NOT NULL, + "type" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '角色信息表'; + +CREATE TABLE IF NOT EXISTS "system_role_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "role_id" bigint NOT NULL, + "menu_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '角色和菜单关联表'; + +CREATE TABLE IF NOT EXISTS "system_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(50) NOT NULL, + "permission" varchar(100) NOT NULL DEFAULT '', + "menu_type" tinyint NOT NULL, + "sort" int NOT NULL DEFAULT '0', + "parent_id" bigint NOT NULL DEFAULT '0', + "path" varchar(200) DEFAULT '', + "icon" varchar(100) DEFAULT '#', + "component" varchar(255) DEFAULT NULL, + "status" tinyint NOT NULL DEFAULT '0', + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '菜单权限表'; + +CREATE TABLE IF NOT EXISTS "system_user_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "role_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp DEFAULT NULL, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp DEFAULT NULL, + "deleted" bit DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '用户和角色关联表'; + +CREATE TABLE IF NOT EXISTS "system_dict_type" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL DEFAULT '', + "type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + +CREATE TABLE IF NOT EXISTS `system_user_session` ( + `id` varchar(32) NOT NULL, + `user_id` bigint DEFAULT NULL, + "user_type" tinyint NOT NULL, + `username` varchar(50) NOT NULL DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(512) DEFAULT NULL, + `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '' , + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT '用户在线 Session'; + +CREATE TABLE IF NOT EXISTS "system_post" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) NOT NULL, + "name" varchar(50) NOT NULL, + "sort" integer NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '岗位信息表'; + +CREATE TABLE IF NOT EXISTS "system_notice" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "title" varchar(50) NOT NULL COMMENT '公告标题', + "content" text NOT NULL COMMENT '公告内容', + "notice_type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', + "status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除', + "tenant_id" bigint not null default '0', + PRIMARY KEY("id") +) COMMENT '通知公告表'; + +CREATE TABLE IF NOT EXISTS `system_login_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `log_type` bigint(4) NOT NULL, + "user_id" bigint not null default '0', + "user_type" tinyint NOT NULL, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `username` varchar(50) NOT NULL DEFAULT '', + `result` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `user_agent` varchar(512) NOT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) COMMENT ='系统访问记录'; + +CREATE TABLE IF NOT EXISTS `system_operate_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `user_id` bigint(20) NOT NULL, + `module` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `operate_type` bigint(4) NOT NULL DEFAULT '0', + `content` varchar(2000) NOT NULL DEFAULT '', + `exts` varchar(512) NOT NULL DEFAULT '', + `request_method` varchar(16) DEFAULT '', + `request_url` varchar(255) DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(200) DEFAULT NULL, + `java_method` varchar(512) NOT NULL DEFAULT '', + `java_method_args` varchar(8000) DEFAULT '', + `start_time` datetime NOT NULL, + `duration` int(11) NOT NULL, + `result_code` int(11) NOT NULL DEFAULT '0', + `result_msg` varchar(512) DEFAULT '', + `result_data` varchar(4000) DEFAULT '', + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT ='操作日志记录'; + +CREATE TABLE IF NOT EXISTS "system_user" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "username" varchar(30) not null, + "password" varchar(100) not null default '', + "nickname" varchar(30) not null, + "remark" varchar(500) default null, + "dept_id" bigint default null, + "post_ids" varchar(255) default null, + "email" varchar(50) default '', + "mobile" varchar(11) default '', + "sex" tinyint default '0', + "avatar" varchar(100) default '', + "status" tinyint not null default '0', + "login_ip" varchar(50) default '', + "login_date" timestamp default null, + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) comment '用户信息表'; + +CREATE TABLE IF NOT EXISTS "inf_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT 'API 访问日志表'; + +CREATE TABLE IF NOT EXISTS "inf_api_error_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT '系统异常日志'; + +CREATE TABLE IF NOT EXISTS "system_sms_channel" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "signature" varchar(10) NOT NULL, + "code" varchar(63) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_key" varchar(63) NOT NULL, + "api_secret" varchar(63) DEFAULT NULL, + "callback_url" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信渠道'; + +CREATE TABLE IF NOT EXISTS "system_sms_template" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL, + "status" tinyint NOT NULL, + "code" varchar(63) NOT NULL, + "name" varchar(63) NOT NULL, + "content" varchar(255) NOT NULL, + "params" varchar(255) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_template_id" varchar(63) NOT NULL, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信模板'; + +CREATE TABLE IF NOT EXISTS "system_sms_log" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "template_id" bigint NOT NULL, + "template_code" varchar(63) NOT NULL, + "template_type" tinyint NOT NULL, + "template_content" varchar(255) NOT NULL, + "template_params" varchar(255) NOT NULL, + "api_template_id" varchar(63) NOT NULL, + "mobile" varchar(11) NOT NULL, + "user_id" bigint DEFAULT '0', + "user_type" tinyint DEFAULT '0', + "send_status" tinyint NOT NULL DEFAULT '0', + "send_time" timestamp DEFAULT NULL, + "send_code" int DEFAULT NULL, + "send_msg" varchar(255) DEFAULT NULL, + "api_send_code" varchar(63) DEFAULT NULL, + "api_send_msg" varchar(255) DEFAULT NULL, + "api_request_id" varchar(255) DEFAULT NULL, + "api_serial_no" varchar(255) DEFAULT NULL, + "receive_status" tinyint NOT NULL DEFAULT '0', + "receive_time" timestamp DEFAULT NULL, + "api_receive_code" varchar(63) DEFAULT NULL, + "api_receive_msg" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信日志'; + +CREATE TABLE IF NOT EXISTS "system_error_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL DEFAULT '0', + "application_name" varchar(50) NOT NULL, + "code" int NOT NULL DEFAULT '0', + "message" varchar(512) NOT NULL DEFAULT '', + "memo" varchar(512) DEFAULT '', + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '错误码表'; + +CREATE TABLE IF NOT EXISTS "system_social_user" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL DEFAULT '0', + "type" tinyint NOT NULL, + "openid" varchar(32) NOT NULL, + "token" varchar(256) DEFAULT NULL, + "union_id" varchar(32) NOT NULL, + "raw_token_info" varchar(1024) NOT NULL, + "nickname" varchar(32) NOT NULL, + "avatar" varchar(255) DEFAULT NULL, + "raw_user_info" varchar(1024) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '社交用户'; + +CREATE TABLE IF NOT EXISTS "system_tenant" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "contact_name" varchar(255) NOT NULL, + "contact_mobile" varchar(255), + "status" tinyint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '租户'; From 638b8b1dd4691ad20cfe1fa7f57baaad718ab8e4 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 10:07:27 +0800 Subject: [PATCH 17/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=204=EF=BC=9Asystem=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E5=AE=8C=E6=88=90=20social=20?= =?UTF-8?q?=E7=9A=84=E5=A4=8D=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/convert/auth/AuthConvert.java | 8 +-- .../service/auth/MemberAuthServiceImpl.java | 1 + .../system/api/social/SocialUserApiImpl.java | 28 +-------- .../system/convert/auth/AuthConvert.java | 16 +++-- .../service/auth/AdminAuthServiceImpl.java | 31 +++------- .../service/social/SocialUserService.java | 44 ++++++++----- .../service/social/SocialUserServiceImpl.java | 62 +++++++++++++++++-- 7 files changed, 114 insertions(+), 76 deletions(-) diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java index bca6b170b5..323827d4f1 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java @@ -26,10 +26,10 @@ public interface AuthConvert { return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue()); } - SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialBindReqVO reqVO); - SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialLogin2ReqVO reqVO); - SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialLoginReqVO reqVO); - SocialUserUnbindReqDTO convert(Long userId, Integer value, AppAuthSocialUnbindReqVO reqVO); + SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialBindReqVO reqVO); + SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialLogin2ReqVO reqVO); + SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialLoginReqVO reqVO); + SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppAuthSocialUnbindReqVO reqVO); SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO); SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp); diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java index 5fd8db9b9a..fcb68b2715 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java @@ -152,6 +152,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { @Override public void socialBind(Long userId, AppAuthSocialBindReqVO reqVO) { + // 绑定社交用户(新增) socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(userId, getUserType().getValue(), reqVO)); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java index 94e4cfabab..02a7942bbc 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java @@ -3,15 +3,11 @@ package cn.iocoder.yudao.module.system.api.social; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; import cn.iocoder.yudao.module.system.service.social.SocialUserService; -import me.zhyd.oauth.model.AuthUser; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND; - /** * 社交用户的 API 实现类 * @@ -31,16 +27,7 @@ public class SocialUserApiImpl implements SocialUserApi { @Override public void bindSocialUser(SocialUserBindReqDTO reqDTO) { - // 使用 code 授权 - AuthUser authUser = socialUserService.getAuthUser(reqDTO.getType(), reqDTO.getCode(), - reqDTO.getState()); - if (authUser == null) { - throw exception(SOCIAL_USER_NOT_FOUND); - } - - // 绑定社交用户(新增) - socialUserService.bindSocialUser(reqDTO.getUserId(), reqDTO.getUserType(), - reqDTO.getType(), authUser); + socialUserService.bindSocialUser(reqDTO); } @Override @@ -51,21 +38,12 @@ public class SocialUserApiImpl implements SocialUserApi { @Override public void checkSocialUser(Integer type, String code, String state) { - AuthUser authUser = socialUserService.getAuthUser(type, code, state); - if (authUser == null) { - throw exception(SOCIAL_USER_NOT_FOUND); - } + socialUserService.checkSocialUser(type, code, state); } @Override public Long getBindUserId(Integer userType, Integer type, String code, String state) { - AuthUser authUser = socialUserService.getAuthUser(type, code, state); - if (authUser == null) { - throw exception(SOCIAL_USER_NOT_FOUND); - } - - // - return null; + return socialUserService.getBindUserId(userType, type, code, state); } } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java index e4cce51003..c52328cc0d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java @@ -1,14 +1,15 @@ package cn.iocoder.yudao.module.system.convert.auth; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthMenuRespVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthPermissionInfoRespVO; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.security.core.LoginUser; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @@ -71,4 +72,9 @@ public interface AuthConvert { return CollectionUtils.filterList(treeNodeMap.values(), node -> MenuIdEnum.ROOT.getId().equals(node.getParentId())); } + SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialBindReqVO reqVO); + SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLogin2ReqVO reqVO); + SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLoginReqVO reqVO); + SocialUserUnbindReqDTO convert(Long userId, Integer userType, AuthSocialUnbindReqVO reqVO); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index d2fe1ba1ab..f237049bdd 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.system.service.auth; -import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; @@ -12,7 +11,6 @@ import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBi import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLogin2ReqVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialLoginReqVO; import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; @@ -37,7 +35,6 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; import javax.annotation.Resource; -import java.util.List; import java.util.Objects; import java.util.Set; @@ -70,7 +67,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Resource private UserSessionService userSessionService; @Resource - private SocialUserService socialService; + private SocialUserService socialUserService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { @@ -192,19 +189,15 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public String socialLogin(AuthSocialLoginReqVO reqVO, String userIp, String userAgent) { - // 使用 code 授权码,进行登录 - AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); - Assert.notNull(authUser, "授权用户不为空"); - - // 如果未绑定 SocialUserDO 用户,则无法自动登录,进行报错 - String unionId = socialService.getAuthUserUnionId(authUser); - List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, getUserType().getValue()); - if (CollUtil.isEmpty(socialUsers)) { + // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 + Long userId = socialUserService.getBindUserId(UserTypeEnum.MEMBER.getValue(), reqVO.getType(), + reqVO.getCode(), reqVO.getState()); + if (userId == null) { throw exception(AUTH_THIRD_LOGIN_NOT_BIND); } // 自动登录 - AdminUserDO user = userService.getUser(socialUsers.get(0).getUserId()); + AdminUserDO user = userService.getUser(userId); if (user == null) { throw exception(USER_NOT_EXISTS); } @@ -214,7 +207,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { LoginUser loginUser = this.buildLoginUser(user); // 绑定社交用户(更新) - socialService.bindSocialUser(loginUser.getId(), getUserType().getValue(), reqVO.getType(), authUser); + socialUserService.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); // 缓存登录用户到 Redis 中,返回 sessionId 编号 return userSessionService.createUserSession(loginUser, userIp, userAgent); @@ -223,14 +216,14 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public String socialLogin2(AuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) { // 使用 code 授权码,进行登录 - AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); + AuthUser authUser = socialUserService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); Assert.notNull(authUser, "授权用户不为空"); // 使用账号密码,进行登录。 LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); // 绑定社交用户(新增) - socialService.bindSocialUser(loginUser.getId(), getUserType().getValue(), reqVO.getType(), authUser); + socialUserService.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); // 缓存登录用户到 Redis 中,返回 sessionId 编号 return userSessionService.createUserSession(loginUser, userIp, userAgent); @@ -238,12 +231,8 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public void socialBind(Long userId, AuthSocialBindReqVO reqVO) { - // 使用 code 授权码,进行登录 - AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState()); - Assert.notNull(authUser, "授权用户不为空"); - // 绑定社交用户(新增) - socialService.bindSocialUser(userId, getUserType().getValue(), reqVO.getType(), authUser); + socialUserService.bindSocialUser(AuthConvert.INSTANCE.convert(userId, getUserType().getValue(), reqVO)); } @Override diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java index b7a7d00d7d..f57baff0d3 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java @@ -2,10 +2,12 @@ package cn.iocoder.yudao.module.system.service.social; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import me.zhyd.oauth.model.AuthUser; +import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.util.List; @@ -47,17 +49,6 @@ public interface SocialUserService { return StrUtil.blankToDefault(authUser.getToken().getUnionId(), authUser.getUuid()); } - /** - * 获得 unionId 对应的某个社交平台的“所有”社交用户 - * 注意,这里的“所有”,指的是类似【微信】平台,包括了小程序、公众号、PC 网站,他们的 unionId 是一致的 - * - * @param type 社交平台的类型 {@link SocialTypeEnum} - * @param unionId 社交平台的 unionId - * @param userType 全局用户类型 - * @return 社交用户列表 - */ - List getAllSocialUserList(Integer type, String unionId, Integer userType); - /** * 获得指定用户的社交用户列表 * @@ -69,12 +60,10 @@ public interface SocialUserService { /** * 绑定社交用户 - * @param userId 用户编号 - * @param userType 用户类型 - * @param type 社交平台的类型 {@link SocialTypeEnum} - * @param authUser 授权用户 + * + * @param reqDTO 绑定信息 */ - void bindSocialUser(Long userId, Integer userType, Integer type, AuthUser authUser); + void bindSocialUser(@Valid SocialUserBindReqDTO reqDTO); /** * 取消绑定社交用户 @@ -86,4 +75,27 @@ public interface SocialUserService { */ void unbindSocialUser(Long userId, Integer userType, Integer type, String unionId); + /** + * 校验社交用户的认证信息是否正确 + * 如果校验不通过,则抛出 {@link ServiceException} 业务异常 + * + * @param type 社交平台的类型 + * @param code 授权码 + * @param state state + */ + void checkSocialUser(Integer type, String code, String state); + + /** + * 获得社交用户的绑定用户编号 + * 注意,返回的是 MemberUser 或者 AdminUser 的 id 编号! + * 该方法会执行和 {@link #checkSocialUser(Integer, String, String)} 一样的逻辑。 + * 所以在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常 + * + * @param userType 用户类型 + * @param type 社交平台的类型 + * @param code 授权码 + * @param state state + * @return 绑定用户编号 + */ + Long getBindUserId(Integer userType, Integer type, String code, String state); } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java index 533f7fdf9c..b408a1fd49 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.social; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.http.HttpUtils; +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; import cn.iocoder.yudao.module.system.dal.mysql.social.SocialUserMapper; import cn.iocoder.yudao.module.system.dal.redis.social.SocialAuthUserRedisDAO; @@ -25,8 +26,7 @@ import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_AUTH_FAILURE; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_UNBIND_NOT_SELF; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 社交用户 Service 实现类 @@ -72,8 +72,16 @@ public class SocialUserServiceImpl implements SocialUserService { return authUser; } - @Override - public List getAllSocialUserList(Integer type, String unionId, Integer userType) { + /** + * 获得 unionId 对应的某个社交平台的“所有”社交用户 + * 注意,这里的“所有”,指的是类似【微信】平台,包括了小程序、公众号、PC 网站,他们的 unionId 是一致的 + * + * @param type 社交平台的类型 {@link SocialTypeEnum} + * @param unionId 社交平台的 unionId + * @param userType 全局用户类型 + * @return 社交用户列表 + */ + private List getAllSocialUserList(Integer type, String unionId, Integer userType) { List types = SocialTypeEnum.getRelationTypes(type); return socialUserMapper.selectListByTypeAndUnionId(userType, types, unionId); } @@ -84,8 +92,28 @@ public class SocialUserServiceImpl implements SocialUserService { } @Override + public void bindSocialUser(SocialUserBindReqDTO reqDTO) { + // 使用 code 授权 + AuthUser authUser = getAuthUser(reqDTO.getType(), reqDTO.getCode(), + reqDTO.getState()); + if (authUser == null) { + throw exception(SOCIAL_USER_NOT_FOUND); + } + + // 绑定社交用户(新增) + bindSocialUser(reqDTO.getUserId(), reqDTO.getUserType(), + reqDTO.getType(), authUser); + } + + /** + * 绑定社交用户 + * @param userId 用户编号 + * @param userType 用户类型 + * @param type 社交平台的类型 {@link SocialTypeEnum} + * @param authUser 授权用户 + */ @Transactional(rollbackFor = Exception.class) - public void bindSocialUser(Long userId, Integer userType, Integer type, AuthUser authUser) { + protected void bindSocialUser(Long userId, Integer userType, Integer type, AuthUser authUser) { // 获得 unionId 对应的 SocialUserDO 列表 String unionId = getAuthUserUnionId(authUser); List socialUsers = this.getAllSocialUserList(type, unionId, userType); @@ -137,6 +165,30 @@ public class SocialUserServiceImpl implements SocialUserService { socialUserMapper.deleteBatchIds(CollectionUtils.convertSet(socialUsers, SocialUserDO::getId)); } + @Override + public void checkSocialUser(Integer type, String code, String state) { + AuthUser authUser = getAuthUser(type, code, state); + if (authUser == null) { + throw exception(SOCIAL_USER_NOT_FOUND); + } + } + + @Override + public Long getBindUserId(Integer userType, Integer type, String code, String state) { + AuthUser authUser = getAuthUser(type, code, state); + if (authUser == null) { + throw exception(SOCIAL_USER_NOT_FOUND); + } + + // 如果未绑定 SocialUserDO 用户,则无法自动登录,进行报错 + String unionId = getAuthUserUnionId(authUser); + List socialUsers = getAllSocialUserList(type, unionId, userType); + if (CollUtil.isEmpty(socialUsers)) { + throw exception(AUTH_THIRD_LOGIN_NOT_BIND); + } + return socialUsers.get(0).getUserId(); + } + @VisibleForTesting public void unbindOldSocialUser(Long userId, Integer userType, Integer type, String newUnionId) { List types = SocialTypeEnum.getRelationTypes(type); From 4bc8dc65b4f23ff0380f4ecd33de53d32f247cb8 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 10:27:35 +0800 Subject: [PATCH 18/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=204=EF=BC=9Ainfra=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + yudao-admin-server/pom.xml | 5 + yudao-module-infra/pom.xml | 26 +++++ .../yudao-module-infra-api/pom.xml | 26 +++++ .../yudao-module-infra-impl/pom.xml | 95 +++++++++++++++++++ 5 files changed, 153 insertions(+) create mode 100644 yudao-module-infra/pom.xml create mode 100644 yudao-module-infra/yudao-module-infra-api/pom.xml create mode 100644 yudao-module-infra/yudao-module-infra-impl/pom.xml diff --git a/pom.xml b/pom.xml index 565028205a..1b4e139ee1 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ yudao-module-member yudao-module-system + yudao-module-infra ${artifactId} diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 5fe645e877..00e1edeb0b 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -32,6 +32,11 @@ yudao-module-system-impl ${revision} + + cn.iocoder.boot + yudao-module-infra-impl + ${revision} + diff --git a/yudao-module-infra/pom.xml b/yudao-module-infra/pom.xml new file mode 100644 index 0000000000..4b524edcc4 --- /dev/null +++ b/yudao-module-infra/pom.xml @@ -0,0 +1,26 @@ + + + + cn.iocoder.boot + yudao + ${revision} + + 4.0.0 + + yudao-module-infra + pom + + ${artifactId} + + infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 + 例如说:定时任务的管理、服务器的信息等等 + + + yudao-module-infra-api + yudao-module-infra-impl + + + + diff --git a/yudao-module-infra/yudao-module-infra-api/pom.xml b/yudao-module-infra/yudao-module-infra-api/pom.xml new file mode 100644 index 0000000000..b1c79c2d24 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-api/pom.xml @@ -0,0 +1,26 @@ + + + + cn.iocoder.boot + yudao-module-infra + ${revision} + + 4.0.0 + yudao-module-infra-api + jar + + ${artifactId} + + infra 模块 API,暴露给其它模块调用 + + + + + cn.iocoder.boot + yudao-common + + + + diff --git a/yudao-module-infra/yudao-module-infra-impl/pom.xml b/yudao-module-infra/yudao-module-infra-impl/pom.xml new file mode 100644 index 0000000000..3b56c67cca --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/pom.xml @@ -0,0 +1,95 @@ + + + + cn.iocoder.boot + yudao-module-infra + ${revision} + + 4.0.0 + yudao-module-infra-impl + jar + + ${artifactId} + + infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 + 例如说:定时任务的管理、服务器的信息等等 + + + + + cn.iocoder.boot + yudao-module-member-api + ${revision} + + + + cn.iocoder.boot + yudao-module-system-api + ${revision} + + + + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-operatelog + + + + + cn.iocoder.boot + yudao-spring-boot-starter-security + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mybatis + + + + cn.iocoder.boot + yudao-spring-boot-starter-redis + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mq + + + + + cn.iocoder.boot + yudao-spring-boot-starter-test + test + + + + + + + + ${artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + repackage + + + + + + + + From dc11dfc21502a67bf60f661e8b97995e3f044d71 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 13:51:40 +0800 Subject: [PATCH 19/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=205=EF=BC=9Ainfra=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../convert/config/InfConfigConvert.java | 29 ------------ .../infra/mq/consumer/package-info.java | 1 - .../infra/mq/message/package-info.java | 1 - .../infra/mq/producer/package-info.java | 1 - .../modules/infra/package-info.java | 7 --- .../test/vo/ToolTestDemoExcelVO.java | 9 ++-- .../modules/infra/convert/package-info.java | 6 --- ...g Boot 对象转换 MapStruct 入门》.md | 1 - .../InfApiErrorLogProcessStatusEnum.java | 28 ----------- .../modules/infra/package-info.java | 7 --- .../yudao-module-infra-impl/pom.xml | 5 ++ .../admin/config/ConfigController.java | 29 +++++++----- .../admin/config/vo/ConfigBaseVO.java | 4 +- .../admin/config/vo/ConfigCreateReqVO.java | 6 +-- .../admin/config/vo/ConfigExcelVO.java | 6 +-- .../admin/config/vo/ConfigExportReqVO.java | 4 +- .../admin/config/vo/ConfigPageReqVO.java | 4 +- .../admin/config/vo/ConfigRespVO.java | 4 +- .../admin/config/vo/ConfigUpdateReqVO.java | 4 +- .../admin}/doc/InfDbDocController.java | 2 +- .../admin}/file/InfFileController.java | 8 ++-- .../admin}/file/vo/InfFilePageReqVO.java | 2 +- .../admin}/job/InfJobController.java | 10 ++-- .../admin}/job/InfJobLogController.java | 16 +++---- .../admin}/job/vo/job/InfJobBaseVO.java | 2 +- .../admin}/job/vo/job/InfJobCreateReqVO.java | 2 +- .../admin}/job/vo/job/InfJobExcelVO.java | 6 +-- .../admin}/job/vo/job/InfJobExportReqVO.java | 2 +- .../admin}/job/vo/job/InfJobPageReqVO.java | 2 +- .../admin}/job/vo/job/InfJobRespVO.java | 2 +- .../admin}/job/vo/job/InfJobUpdateReqVO.java | 2 +- .../admin}/job/vo/log/InfJobLogBaseVO.java | 2 +- .../admin}/job/vo/log/InfJobLogExcelVO.java | 6 +-- .../job/vo/log/InfJobLogExportReqVO.java | 2 +- .../admin}/job/vo/log/InfJobLogPageReqVO.java | 2 +- .../admin}/job/vo/log/InfJobLogRespVO.java | 2 +- .../logger/InfApiAccessLogController.java | 14 +++--- .../logger/InfApiErrorLogController.java | 14 +++--- .../apiaccesslog/InfApiAccessLogBaseVO.java | 2 +- .../apiaccesslog/InfApiAccessLogExcelVO.java | 2 +- .../InfApiAccessLogExportReqVO.java | 2 +- .../InfApiAccessLogPageReqVO.java | 2 +- .../apiaccesslog/InfApiAccessLogRespVO.java | 2 +- .../vo/apierrorlog/InfApiErrorLogBaseVO.java | 2 +- .../vo/apierrorlog/InfApiErrorLogExcelVO.java | 6 +-- .../InfApiErrorLogExportReqVO.java | 2 +- .../apierrorlog/InfApiErrorLogPageReqVO.java | 2 +- .../vo/apierrorlog/InfApiErrorLogRespVO.java | 2 +- .../admin}/redis/RedisController.http | 0 .../admin}/redis/RedisController.java | 8 ++-- .../admin}/redis/vo/InfRedisKeyRespVO.java | 2 +- .../redis/vo/InfRedisMonitorRespVO.java | 2 +- .../infra/controller/app/package-info.java | 4 ++ .../module/infra/controller/package-info.java | 6 +++ .../convert/config/InfConfigConvert.java | 29 ++++++++++++ .../infra/convert/file/InfFileConvert.java | 2 +- .../infra/convert/job/InfJobConvert.java | 12 ++--- .../infra/convert/job/InfJobLogConvert.java | 8 ++-- .../logger/InfApiAccessLogConvert.java | 6 +-- .../logger/InfApiAccessLogCoreConvert.java | 2 +- .../convert/logger/InfApiErrorLogConvert.java | 6 +-- .../logger/InfApiErrorLogCoreConvert.java | 2 +- .../module}/infra/convert/package-info.java | 2 +- .../infra/convert/redis/RedisConvert.java | 6 +-- ...g Boot 对象转换 MapStruct 入门》.md | 0 .../dal/dataobject/config/InfConfigDO.java | 2 +- .../infra/dal/dataobject/file/InfFileDO.java | 2 +- .../infra/dal/dataobject/job/InfJobDO.java | 4 +- .../infra/dal/dataobject/job/InfJobLogDO.java | 4 +- .../dataobject/logger/InfApiAccessLogDO.java | 2 +- .../dataobject/logger/InfApiErrorLogDO.java | 2 +- .../mysql/config/InfConfigCoreDAOImpl.java | 2 +- .../dal/mysql/config/InfConfigMapper.java | 10 ++-- .../dal/mysql/file/InfFileCoreMapper.java | 2 +- .../infra/dal/mysql/file/InfFileMapper.java | 4 +- .../infra/dal/mysql/job/InfJobLogMapper.java | 8 ++-- .../infra/dal/mysql/job/InfJobMapper.java | 8 ++-- .../logger/InfApiAccessLogCoreMapper.java | 2 +- .../mysql/logger/InfApiAccessLogMapper.java | 6 +-- .../logger/InfApiErrorLogCoreMapper.java | 2 +- .../mysql/logger/InfApiErrorLogMapper.java | 6 +-- .../module/infra/enums/DictTypeConstants.java | 7 ++- .../infra/enums/InfErrorCodeConstants.java | 2 +- .../infra/enums/SysErrorCodeConstants.java | 2 +- .../infra/enums/config/InfConfigTypeEnum.java | 2 +- .../infra/enums/job/InfJobLogStatusEnum.java | 2 +- .../infra/enums/job/InfJobStatusEnum.java | 6 +-- .../InfApiErrorLogProcessStatusEnum.java | 2 +- .../infra}/file/config/FileConfiguration.java | 2 +- .../infra}/file/config/FileProperties.java | 2 +- .../module/infra}/file/package-info.java | 0 .../module}/infra/framework/package-info.java | 2 +- .../config/InfConfigRefreshConsumer.java | 4 +- .../infra/mq/consumer/package-info.java | 1 + .../config/InfConfigRefreshMessage.java | 2 +- .../module/infra/mq/message/package-info.java | 1 + .../mq/producer/config/InfConfigProducer.java | 4 +- .../infra/mq/producer/package-info.java | 1 + .../yudao/module/infra/package-info.java | 8 ++++ .../service/config/InfConfigService.java | 18 +++---- .../config/impl/InfConfigServiceImpl.java | 39 ++++++++------- .../service/file/InfFileCoreService.java | 2 +- .../infra/service/file/InfFileService.java | 4 +- .../file/impl/InfFileCoreServiceImpl.java | 2 +- .../service/file/impl/InfFileServiceImpl.java | 8 ++-- .../infra/service/job/InfJobLogService.java | 8 ++-- .../infra/service/job/InfJobService.java | 12 ++--- .../job/impl/InfJobLogServiceImpl.java | 14 +++--- .../service/job/impl/InfJobServiceImpl.java | 22 ++++----- .../logger/InfApiAccessLogCoreService.java | 2 +- .../logger/InfApiAccessLogService.java | 6 +-- .../logger/InfApiErrorLogCoreService.java | 2 +- .../service/logger/InfApiErrorLogService.java | 6 +-- .../impl/InfApiAccessLogCoreServiceImpl.java | 2 +- .../impl/InfApiAccessLogServiceImpl.java | 10 ++-- .../impl/InfApiErrorLogCoreServiceImpl.java | 2 +- .../impl/InfApiErrorLogServiceImpl.java | 20 ++++---- .../yudao/module/infra}/vo/InfFileRespVO.java | 2 +- .../yudao/module/infra/package-info.java | 1 + .../service/config/InfConfigServiceTest.java | 34 +++++++------- .../service/file/InfFileServiceTest.java | 10 ++-- .../service/job/InfJobLogServiceTest.java | 14 +++--- .../infra/service/job/InfJobServiceTest.java | 32 ++++++------- .../InfApiAccessLogServiceImplTest.java | 10 ++-- .../logger/InfApiErrorLogServiceImplTest.java | 21 +++++---- .../infra/test/BaseDbAndRedisUnitTest.java | 47 +++++++++++++++++++ .../module/infra/test/BaseDbUnitTest.java | 39 +++++++++++++++ .../infra/test}/QuartzTestConfiguration.java | 2 +- .../infra/test/RedisTestConfiguration.java | 30 ++++++++++++ .../system/enums/DictTypeConstants.java | 3 +- 130 files changed, 507 insertions(+), 408 deletions(-) delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/package-info.java rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java (77%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigBaseVO.java (93%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigCreateReqVO.java (74%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExcelVO.java (85%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java (90%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java (90%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java (88%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/doc/InfDbDocController.java (99%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/file/InfFileController.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/file/vo/InfFilePageReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/InfJobController.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/InfJobLogController.java (83%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/job/InfJobBaseVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/job/InfJobCreateReqVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/job/InfJobExcelVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/job/InfJobExportReqVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/job/InfJobPageReqVO.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/job/InfJobRespVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/job/InfJobUpdateReqVO.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/log/InfJobLogBaseVO.java (96%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/log/InfJobLogExcelVO.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/log/InfJobLogExportReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/log/InfJobLogPageReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/job/vo/log/InfJobLogRespVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/InfApiAccessLogController.java (77%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/InfApiErrorLogController.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java (97%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java (97%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/logger/vo/apierrorlog/InfApiErrorLogRespVO.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/redis/RedisController.http (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/redis/RedisController.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/redis/vo/InfRedisKeyRespVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin}/redis/vo/InfRedisMonitorRespVO.java (94%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/app/package-info.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/package-info.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/InfConfigConvert.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/file/InfFileConvert.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/job/InfJobConvert.java (56%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/job/InfJobLogConvert.java (64%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/logger/InfApiAccessLogConvert.java (72%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/logger/InfApiAccessLogCoreConvert.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/logger/InfApiErrorLogConvert.java (70%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/logger/InfApiErrorLogCoreConvert.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/package-info.java (56%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/redis/RedisConvert.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md (100%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/dataobject/config/InfConfigDO.java (94%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/dataobject/file/InfFileDO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/dataobject/job/InfJobDO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/dataobject/job/InfJobLogDO.java (91%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/dataobject/logger/InfApiAccessLogDO.java (96%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/dataobject/logger/InfApiErrorLogDO.java (97%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/config/InfConfigCoreDAOImpl.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/config/InfConfigMapper.java (76%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/file/InfFileCoreMapper.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/file/InfFileMapper.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/job/InfJobLogMapper.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/job/InfJobMapper.java (79%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java (83%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/logger/InfApiAccessLogMapper.java (86%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/dal/mysql/logger/InfApiErrorLogMapper.java (86%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java (69%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/enums/InfErrorCodeConstants.java (96%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/enums/SysErrorCodeConstants.java (87%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/enums/config/InfConfigTypeEnum.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/enums/job/InfJobLogStatusEnum.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/enums/job/InfJobStatusEnum.java (72%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java (86%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra}/file/config/FileConfiguration.java (78%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra}/file/config/FileProperties.java (86%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra}/file/package-info.java (100%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/framework/package-info.java (55%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/mq/consumer/config/InfConfigRefreshConsumer.java (79%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/mq/message/config/InfConfigRefreshMessage.java (81%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/mq/producer/config/InfConfigProducer.java (76%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/package-info.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/config/InfConfigService.java (62%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/config/impl/InfConfigServiceImpl.java (67%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/file/InfFileCoreService.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/file/InfFileService.java (73%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/file/impl/InfFileCoreServiceImpl.java (96%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/file/impl/InfFileServiceImpl.java (66%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/job/InfJobLogService.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/job/InfJobService.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/job/impl/InfJobLogServiceImpl.java (79%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/job/impl/InfJobServiceImpl.java (86%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/logger/InfApiAccessLogCoreService.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/logger/InfApiAccessLogService.java (72%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/logger/InfApiErrorLogCoreService.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/logger/InfApiErrorLogService.java (78%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/logger/impl/InfApiAccessLogServiceImpl.java (65%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module}/infra/service/logger/impl/InfApiErrorLogServiceImpl.java (63%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/controller/file => yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra}/vo/InfFileRespVO.java (88%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/package-info.java rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module}/infra/service/config/InfConfigServiceTest.java (86%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module}/infra/service/file/InfFileServiceTest.java (85%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module}/infra/service/job/InfJobLogServiceTest.java (92%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module}/infra/service/job/InfJobServiceTest.java (89%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module}/infra/service/logger/InfApiAccessLogServiceImplTest.java (93%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module}/infra/service/logger/InfApiErrorLogServiceImplTest.java (89%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbAndRedisUnitTest.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbUnitTest.java rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config => yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test}/QuartzTestConfiguration.java (87%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/RedisTestConfiguration.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java deleted file mode 100644 index 4a5eaf2f73..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.convert.config; - -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExcelVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface InfConfigConvert { - - InfConfigConvert INSTANCE = Mappers.getMapper(InfConfigConvert.class); - - PageResult convertPage(PageResult page); - - InfConfigRespVO convert(InfConfigDO bean); - - InfConfigDO convert(InfConfigCreateReqVO bean); - - InfConfigDO convert(InfConfigUpdateReqVO bean); - - List convertList(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java deleted file mode 100644 index f73455a304..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java deleted file mode 100644 index 9db3856431..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.mq.message; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java deleted file mode 100644 index 0112c34857..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.mq.producer; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java deleted file mode 100644 index b97607f354..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 - * 例如说:定时任务的管理、服务器的信息等等 - * - * 缩写:inf - */ -package cn.iocoder.yudao.adminserver.modules.infra; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java index e7a98b6f19..384c08bc52 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java @@ -2,8 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; -import cn.iocoder.yudao.module.system.enums.DictTypeConstants; +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -24,15 +23,15 @@ public class ToolTestDemoExcelVO { private String name; @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.COMMON_STATUS) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.COMMON_STATUS) private Integer status; @ExcelProperty(value = "类型", converter = DictConvert.class) - @DictFormat(DictTypeConstants.OPERATE_TYPE) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.OPERATE_TYPE) private Integer type; @ExcelProperty(value = "分类", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.REDIS_TIMEOUT_TYPE) + @DictFormat(DictTypeConstants.REDIS_TIMEOUT_TYPE) private Integer category; @ExcelProperty("备注") diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/package-info.java deleted file mode 100644 index bdb8ce7a3a..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package cn.iocoder.yudao.coreservice.modules.infra.convert; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 8153487b72..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java deleted file mode 100644 index cba1d02dd8..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.infra.enums.logger; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * API 异常数据的处理状态 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum InfApiErrorLogProcessStatusEnum { - - INIT(0, "未处理"), - DONE(1, "已处理"), - IGNORE(2, "已忽略"); - - /** - * 状态 - */ - private final Integer status; - /** - * 资源类型名 - */ - private final String name; - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/package-info.java deleted file mode 100644 index 1f011d6a1e..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 - * 例如说:定时任务的管理、服务器的信息等等 - * - * 缩写:inf - */ -package cn.iocoder.yudao.coreservice.modules.infra; diff --git a/yudao-module-infra/yudao-module-infra-impl/pom.xml b/yudao-module-infra/yudao-module-infra-impl/pom.xml index 3b56c67cca..9c98f6d622 100644 --- a/yudao-module-infra/yudao-module-infra-impl/pom.xml +++ b/yudao-module-infra/yudao-module-infra-impl/pom.xml @@ -66,7 +66,12 @@ yudao-spring-boot-starter-test test + + + cn.iocoder.boot + yudao-spring-boot-starter-excel + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java similarity index 77% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java index 3167a09d17..5bad8d83c9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java @@ -1,13 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.config; +package cn.iocoder.yudao.module.infra.controller.admin.config; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.*; -import cn.iocoder.yudao.adminserver.modules.infra.convert.config.InfConfigConvert; -import cn.iocoder.yudao.adminserver.modules.infra.service.config.InfConfigService; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.*; +import cn.iocoder.yudao.module.infra.convert.config.InfConfigConvert; +import cn.iocoder.yudao.module.infra.service.config.InfConfigService; +import cn.iocoder.yudao.module.infra.controller.config.vo.*; +import cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -24,13 +28,12 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE; @Api(tags = "参数配置") @RestController @RequestMapping("/infra/config") @Validated -public class InfConfigController { +public class ConfigController { @Resource private InfConfigService configService; @@ -38,14 +41,14 @@ public class InfConfigController { @PostMapping("/create") @ApiOperation("创建参数配置") @PreAuthorize("@ss.hasPermission('infra:config:create')") - public CommonResult createConfig(@Valid @RequestBody InfConfigCreateReqVO reqVO) { + public CommonResult createConfig(@Valid @RequestBody ConfigCreateReqVO reqVO) { return success(configService.createConfig(reqVO)); } @PutMapping("/update") @ApiOperation("修改参数配置") @PreAuthorize("@ss.hasPermission('infra:config:update')") - public CommonResult updateConfig(@Valid @RequestBody InfConfigUpdateReqVO reqVO) { + public CommonResult updateConfig(@Valid @RequestBody ConfigUpdateReqVO reqVO) { configService.updateConfig(reqVO); return success(true); } @@ -63,7 +66,7 @@ public class InfConfigController { @ApiOperation("获得参数配置") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('infra:config:query')") - public CommonResult getConfig(@RequestParam("id") Long id) { + public CommonResult getConfig(@RequestParam("id") Long id) { return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id))); } @@ -76,7 +79,7 @@ public class InfConfigController { return null; } if (config.getSensitive()) { - throw exception(CONFIG_GET_VALUE_ERROR_IF_SENSITIVE); + throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE); } return success(config.getValue()); } @@ -84,7 +87,7 @@ public class InfConfigController { @GetMapping("/page") @ApiOperation("获取参数配置分页") @PreAuthorize("@ss.hasPermission('infra:config:query')") - public CommonResult> getConfigPage(@Valid InfConfigPageReqVO reqVO) { + public CommonResult> getConfigPage(@Valid ConfigPageReqVO reqVO) { PageResult page = configService.getConfigPage(reqVO); return success(InfConfigConvert.INSTANCE.convertPage(page)); } @@ -93,13 +96,13 @@ public class InfConfigController { @ApiOperation("导出参数配置") @PreAuthorize("@ss.hasPermission('infra:config:export')") @OperateLog(type = EXPORT) - public void exportSysConfig(@Valid InfConfigExportReqVO reqVO, + public void exportSysConfig(@Valid ConfigExportReqVO reqVO, HttpServletResponse response) throws IOException { List list = configService.getConfigList(reqVO); // 拼接数据 - List datas = InfConfigConvert.INSTANCE.convertList(list); + List datas = InfConfigConvert.INSTANCE.convertList(list); // 输出 - ExcelUtils.write(response, "参数配置.xls", "数据", InfConfigExcelVO.class, datas); + ExcelUtils.write(response, "参数配置.xls", "数据", ConfigExcelVO.class, datas); } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigBaseVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigBaseVO.java index 82b0f48edb..bf1c26d73d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; +package cn.iocoder.yudao.module.infra.controller.admin.config.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,7 +13,7 @@ import javax.validation.constraints.Size; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class InfConfigBaseVO { +public class ConfigBaseVO { @ApiModelProperty(value = "参数分组", required = true, example = "biz") @NotEmpty(message = "参数分组不能为空") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigCreateReqVO.java similarity index 74% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigCreateReqVO.java index ee2b90abc6..7a2118ae1c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; +package cn.iocoder.yudao.module.infra.controller.admin.config.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,10 +8,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; -@ApiModel("参数配置创建 Request VO") +@ApiModel("管理后台 - 参数配置创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) -public class InfConfigCreateReqVO extends InfConfigBaseVO { +public class ConfigCreateReqVO extends ConfigBaseVO { @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username") @NotBlank(message = "参数键名长度不能为空") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExcelVO.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExcelVO.java index 63b8087446..908981e0ae 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExcelVO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; +package cn.iocoder.yudao.module.infra.controller.admin.config.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.module.system.enums.DictTypeConstants; +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -12,7 +12,7 @@ import java.util.Date; * 参数配置 Excel 导出响应 VO */ @Data -public class InfConfigExcelVO { +public class ConfigExcelVO { @ExcelProperty("参数配置序号") private Long id; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java index 550a5dfc4c..73ee016cdc 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; +package cn.iocoder.yudao.module.infra.controller.admin.config.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -11,7 +11,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ApiModel("参数配置导出 Request VO") @Data -public class InfConfigExportReqVO { +public class ConfigExportReqVO { @ApiModelProperty(value = "参数名称", example = "模糊匹配") private String name; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java index 3f031fa2cb..e97585f746 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; +package cn.iocoder.yudao.module.infra.controller.admin.config.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -16,7 +16,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfConfigPageReqVO extends PageParam { +public class ConfigPageReqVO extends PageParam { @ApiModelProperty(value = "参数名称", example = "模糊匹配") private String name; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java index 84689b70b7..464eb030db 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; +package cn.iocoder.yudao.module.infra.controller.admin.config.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -12,7 +12,7 @@ import java.util.Date; @ApiModel("参数配置信息 Response VO") @Data @EqualsAndHashCode(callSuper = true) -public class InfConfigRespVO extends InfConfigBaseVO { +public class ConfigRespVO extends ConfigBaseVO { @ApiModelProperty(value = "参数配置序号", required = true, example = "1024") private Long id; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java index 7e9d49ca79..5de7ea3b73 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; +package cn.iocoder.yudao.module.infra.controller.admin.config.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -12,7 +12,7 @@ import javax.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfConfigUpdateReqVO extends InfConfigBaseVO { +public class ConfigUpdateReqVO extends ConfigBaseVO { @ApiModelProperty(value = "参数配置序号", required = true, example = "1024") @NotNull(message = "参数配置编号不能为空") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/doc/InfDbDocController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/InfDbDocController.java similarity index 99% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/doc/InfDbDocController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/InfDbDocController.java index 48b52f88ab..e8533e5cc2 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/doc/InfDbDocController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/InfDbDocController.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.doc; +package cn.iocoder.yudao.module.infra.controller.admin.doc; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/InfFileController.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/InfFileController.java index f0c85ddce3..7d7d46b83c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/InfFileController.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.file; +package cn.iocoder.yudao.module.infra.controller.admin.file; import cn.hutool.core.io.IoUtil; -import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.module.infra.service.file.InfFileService; import cn.iocoder.yudao.coreservice.modules.infra.controller.file.vo.InfFileRespVO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.convert.file.InfFileConvert; +import cn.iocoder.yudao.module.infra.convert.file.InfFileConvert; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import io.swagger.annotations.Api; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/InfFilePageReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/InfFilePageReqVO.java index 152466a19c..5b639cc391 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/InfFilePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo; +package cn.iocoder.yudao.module.infra.controller.admin.file.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobController.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobController.java index 1cd3c8dc7c..f153f3f6ee 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobController.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job; +package cn.iocoder.yudao.module.infra.controller.admin.job; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -6,9 +6,11 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.quartz.core.util.CronUtils; import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.*; -import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobConvert; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobService; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.*; +import cn.iocoder.yudao.module.infra.convert.job.InfJobConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.module.infra.service.job.InfJobService; +import cn.iocoder.yudao.module.infra.controller.job.vo.job.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobLogController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobLogController.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobLogController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobLogController.java index d6e263980c..eb1211f324 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobLogController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobLogController.java @@ -1,16 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job; +package cn.iocoder.yudao.module.infra.controller.admin.job; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobLogConvert; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobLogService; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogRespVO; +import cn.iocoder.yudao.module.infra.convert.job.InfJobLogConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.module.infra.service.job.InfJobLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobBaseVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobBaseVO.java index 2d7b51f24c..b0e0ead2bd 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.job; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobCreateReqVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobCreateReqVO.java index b2325d7414..5548c257c9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.job; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExcelVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExcelVO.java index 0d9daf8ebe..bffaaba232 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExcelVO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.job; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -23,7 +23,7 @@ public class InfJobExcelVO { private String name; @ExcelProperty(value = "任务状态", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.JOB_STATUS) + @DictFormat(DictTypeConstants.JOB_STATUS) private Integer status; @ExcelProperty("处理器的名字") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExportReqVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExportReqVO.java index 9c578e96c6..f30839f856 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.job; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobPageReqVO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobPageReqVO.java index eec31e9b3b..edfc425a51 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.job; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobRespVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobRespVO.java index ffe3a69145..0b59518f3c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.job; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobUpdateReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobUpdateReqVO.java index d741a98e4e..1722bbf316 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.job; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogBaseVO.java similarity index 96% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogBaseVO.java index 0dbd67e9c0..78a33107ee 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.log; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExcelVO.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExcelVO.java index fd7078b70e..7c10bdc98c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExcelVO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.log; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -41,7 +41,7 @@ public class InfJobLogExcelVO { private Integer duration; @ExcelProperty(value = "任务状态", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.JOB_STATUS) + @DictFormat(DictTypeConstants.JOB_STATUS) private Integer status; @ExcelProperty("结果数据") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExportReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExportReqVO.java index 3e3e85b58d..432b2d6da3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.log; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogPageReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogPageReqVO.java index 0c5b558671..da3d5e3a61 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.log; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogRespVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogRespVO.java index 497e6913d9..fa0e959d8b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; +package cn.iocoder.yudao.module.infra.controller.admin.job.vo.log; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiAccessLogController.java similarity index 77% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiAccessLogController.java index 3aec60d4fe..1c3ef1a069 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiAccessLogController.java @@ -1,16 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger; +package cn.iocoder.yudao.module.infra.controller.admin.logger; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiAccessLogConvert; -import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiAccessLogService; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogRespVO; +import cn.iocoder.yudao.module.infra.convert.logger.InfApiAccessLogConvert; +import cn.iocoder.yudao.module.infra.service.logger.InfApiAccessLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiErrorLogController.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiErrorLogController.java index 7b83022ca1..db46bb2538 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiErrorLogController.java @@ -1,16 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger; +package cn.iocoder.yudao.module.infra.controller.admin.logger; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiErrorLogConvert; -import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiErrorLogService; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogRespVO; +import cn.iocoder.yudao.module.infra.convert.logger.InfApiErrorLogConvert; +import cn.iocoder.yudao.module.infra.service.logger.InfApiErrorLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java similarity index 97% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java index d5e300f629..6e44f4eb09 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java index c69969b4b0..1d4e8b5306 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java index 8e9dc409de..37ddddc010 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java index c04520528b..385dab1f0a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java index 15dbed3e14..c6b74d48d9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java similarity index 97% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java index 87eb2ddd66..d5d6d3ce1d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java index dfae3311ac..06b1da33b4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -79,7 +79,7 @@ public class InfApiErrorLogExcelVO { private Date createTime; @ExcelProperty(value = "处理状态", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.API_ERROR_LOG_PROCESS_STATUS) + @DictFormat(DictTypeConstants.API_ERROR_LOG_PROCESS_STATUS) private Integer processStatus; @ExcelProperty("处理时间") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java index a86288e1cd..dcb00a69f6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java index cc47dd8d3a..964fee2c81 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogRespVO.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogRespVO.java index 9e4521c119..ad70bb7726 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; +package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.http b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.http rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.java index f39a38b2e1..b7e499bd60 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.redis; +package cn.iocoder.yudao.module.infra.controller.admin.redis; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; import cn.iocoder.yudao.framework.redis.core.RedisKeyRegistry; -import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisKeyRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.convert.redis.RedisConvert; +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.InfRedisKeyRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.InfRedisMonitorRespVO; +import cn.iocoder.yudao.module.infra.convert.redis.RedisConvert; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.data.redis.connection.RedisServerCommands; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisKeyRespVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisKeyRespVO.java index 60a14cf409..4f35768a43 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisKeyRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo; +package cn.iocoder.yudao.module.infra.controller.admin.redis.vo; import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; import io.swagger.annotations.ApiModel; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisMonitorRespVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisMonitorRespVO.java index 16a7c6c9d4..bee54013c2 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisMonitorRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo; +package cn.iocoder.yudao.module.infra.controller.admin.redis.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/app/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/app/package-info.java new file mode 100644 index 0000000000..d0f921f5c0 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package cn.iocoder.yudao.module.infra.controller.app; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/package-info.java new file mode 100644 index 0000000000..04fde2f433 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package cn.iocoder.yudao.module.infra.controller; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/InfConfigConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/InfConfigConvert.java new file mode 100644 index 0000000000..4dbd0dc534 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/InfConfigConvert.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.infra.convert.config; + +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface InfConfigConvert { + + InfConfigConvert INSTANCE = Mappers.getMapper(InfConfigConvert.class); + + PageResult convertPage(PageResult page); + + ConfigRespVO convert(InfConfigDO bean); + + InfConfigDO convert(ConfigCreateReqVO bean); + + InfConfigDO convert(ConfigUpdateReqVO bean); + + List convertList(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/InfFileConvert.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/InfFileConvert.java index aedad94d92..cbc2298b36 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/InfFileConvert.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.convert.file; +package cn.iocoder.yudao.module.infra.convert.file; import cn.iocoder.yudao.coreservice.modules.infra.controller.file.vo.InfFileRespVO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobConvert.java similarity index 56% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobConvert.java index 2b6fbc1d95..5ad7680c2a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobConvert.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.infra.convert.job; +package cn.iocoder.yudao.module.infra.convert.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExcelVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobUpdateReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobLogConvert.java similarity index 64% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobLogConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobLogConvert.java index 146c7fb34a..5134e6cd48 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobLogConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobLogConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.infra.convert.job; +package cn.iocoder.yudao.module.infra.convert.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogRespVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogConvert.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogConvert.java index 1b4faa0be3..a1ca188ae2 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.infra.convert.logger; +package cn.iocoder.yudao.module.infra.convert.logger; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogRespVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/logger/InfApiAccessLogCoreConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogCoreConvert.java similarity index 87% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/logger/InfApiAccessLogCoreConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogCoreConvert.java index f5152f7109..f8a331a335 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/logger/InfApiAccessLogCoreConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogCoreConvert.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.convert.logger; +package cn.iocoder.yudao.module.infra.convert.logger; import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogConvert.java similarity index 70% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogConvert.java index de10d48fc8..1b8d33b6db 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.infra.convert.logger; +package cn.iocoder.yudao.module.infra.convert.logger; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogRespVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/logger/InfApiErrorLogCoreConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogCoreConvert.java similarity index 87% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/logger/InfApiErrorLogCoreConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogCoreConvert.java index 0c130a28b9..cf8225f0a3 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/logger/InfApiErrorLogCoreConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogCoreConvert.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.convert.logger; +package cn.iocoder.yudao.module.infra.convert.logger; import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDTO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/package-info.java similarity index 56% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/package-info.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/package-info.java index 3c74fe7ad2..8e27593088 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/package-info.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/package-info.java @@ -3,4 +3,4 @@ * * 目前使用 MapStruct 框架 */ -package cn.iocoder.yudao.adminserver.modules.infra.convert; +package cn.iocoder.yudao.module.infra.convert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/redis/RedisConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/redis/RedisConvert.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/redis/RedisConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/redis/RedisConvert.java index df76fce242..f5030a0596 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/redis/RedisConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/redis/RedisConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.infra.convert.redis; +package cn.iocoder.yudao.module.infra.convert.redis; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisKeyRespVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.InfRedisKeyRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.InfRedisMonitorRespVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/config/InfConfigDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/InfConfigDO.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/config/InfConfigDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/InfConfigDO.java index c8d58196ee..4f5107e61e 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/config/InfConfigDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/InfConfigDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config; +package cn.iocoder.yudao.module.infra.dal.dataobject.config; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/file/InfFileDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/InfFileDO.java similarity index 93% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/file/InfFileDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/InfFileDO.java index 83a03b3caa..98aab4252a 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/file/InfFileDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/InfFileDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file; +package cn.iocoder.yudao.module.infra.dal.dataobject.file; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobDO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobDO.java index 4eb95ca201..43bc2a0b7b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobDO.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job; +package cn.iocoder.yudao.module.infra.dal.dataobject.job; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobStatusEnum; +import cn.iocoder.yudao.module.infra.enums.job.InfJobStatusEnum; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobLogDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobLogDO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobLogDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobLogDO.java index 49916802c6..ecbe209dd0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobLogDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobLogDO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job; +package cn.iocoder.yudao.module.infra.dal.dataobject.job; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; -import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobLogStatusEnum; +import cn.iocoder.yudao.module.infra.enums.job.InfJobLogStatusEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiAccessLogDO.java similarity index 96% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiAccessLogDO.java index 32e28c4727..eea09b6bd8 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiAccessLogDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger; +package cn.iocoder.yudao.module.infra.dal.dataobject.logger; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiErrorLogDO.java similarity index 97% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiErrorLogDO.java index 7f8094caf6..bcf394cd64 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiErrorLogDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger; +package cn.iocoder.yudao.module.infra.dal.dataobject.logger; import cn.iocoder.yudao.coreservice.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/config/InfConfigCoreDAOImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigCoreDAOImpl.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/config/InfConfigCoreDAOImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigCoreDAOImpl.java index f3d32513be..a4c0377e43 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/config/InfConfigCoreDAOImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigCoreDAOImpl.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.config; +package cn.iocoder.yudao.module.infra.dal.mysql.config; import cn.iocoder.yudao.framework.apollo.internals.ConfigFrameworkDAO; import cn.iocoder.yudao.framework.apollo.internals.dto.ConfigRespDTO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigMapper.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigMapper.java index e7960eaefd..f3d2e29703 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigMapper.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config; +package cn.iocoder.yudao.module.infra.dal.mysql.config; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -18,7 +18,7 @@ public interface InfConfigMapper extends BaseMapperX { return selectOne(new QueryWrapper().eq("`key`", key)); } - default PageResult selectPage(InfConfigPageReqVO reqVO) { + default PageResult selectPage(ConfigPageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) .likeIfPresent("`key`", reqVO.getKey()) @@ -26,7 +26,7 @@ public interface InfConfigMapper extends BaseMapperX { .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); } - default List selectList(InfConfigExportReqVO reqVO) { + default List selectList(ConfigExportReqVO reqVO) { return selectList(new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) .likeIfPresent("`key`", reqVO.getKey()) diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileCoreMapper.java similarity index 92% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileCoreMapper.java index 8075608af0..065ec0d4f1 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileCoreMapper.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file; +package cn.iocoder.yudao.module.infra.dal.mysql.file; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileMapper.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileMapper.java index d3dfcccbbe..c987a8e309 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file; +package cn.iocoder.yudao.module.infra.dal.mysql.file; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobLogMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobLogMapper.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobLogMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobLogMapper.java index 4b1b920bea..8d607c79f0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobLogMapper.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job; +package cn.iocoder.yudao.module.infra.dal.mysql.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobMapper.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobMapper.java index 1f4a83792d..2f2ac91c11 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobMapper.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job; +package cn.iocoder.yudao.module.infra.dal.mysql.job; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java similarity index 83% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java index a189254899..52945f26b1 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger; +package cn.iocoder.yudao.module.infra.dal.mysql.logger; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogMapper.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogMapper.java index 4552762fc0..60e080bea2 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger; +package cn.iocoder.yudao.module.infra.dal.mysql.logger; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java similarity index 81% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java index 1776c78873..f7124e9b80 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger; +package cn.iocoder.yudao.module.infra.dal.mysql.logger; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogMapper.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogMapper.java index d96e5fc3b6..a9f80b1294 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogMapper.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger; +package cn.iocoder.yudao.module.infra.dal.mysql.logger; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java similarity index 69% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java index aabbae4f12..6990bf5a9b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.infra.enums; +package cn.iocoder.yudao.module.infra.enums; /** * Infra 字典类型的枚举类 * * @author 芋道源码 */ -public interface InfDictTypeConstants { +public interface DictTypeConstants { String REDIS_TIMEOUT_TYPE = "inf_redis_timeout_type"; // Redis 超时类型 @@ -16,4 +16,7 @@ public interface InfDictTypeConstants { String ERROR_CODE_TYPE = "inf_error_code_type"; // 错误码的类型枚举 + String CONFIG_TYPE = "sys_config_type"; // 参数配置类型 + String BOOLEAN_STRING = "sys_boolean_string"; // Boolean 是否类型 + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/InfErrorCodeConstants.java similarity index 96% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/InfErrorCodeConstants.java index 98155e7236..0eeaa74088 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/InfErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.enums; +package cn.iocoder.yudao.module.infra.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/SysErrorCodeConstants.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/SysErrorCodeConstants.java similarity index 87% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/SysErrorCodeConstants.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/SysErrorCodeConstants.java index 4cafc58e40..d9a41b38f5 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/SysErrorCodeConstants.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/SysErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.enums; +package cn.iocoder.yudao.module.infra.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/config/InfConfigTypeEnum.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/InfConfigTypeEnum.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/config/InfConfigTypeEnum.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/InfConfigTypeEnum.java index 6e9fd4d35d..242fd7b1c3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/config/InfConfigTypeEnum.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/InfConfigTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.enums.config; +package cn.iocoder.yudao.module.infra.enums.config; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobLogStatusEnum.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobLogStatusEnum.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobLogStatusEnum.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobLogStatusEnum.java index e904e674fb..8dee1d3558 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobLogStatusEnum.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobLogStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.enums.job; +package cn.iocoder.yudao.module.infra.enums.job; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobStatusEnum.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobStatusEnum.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobStatusEnum.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobStatusEnum.java index 1a7c984bbb..870bde22a6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobStatusEnum.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.enums.job; +package cn.iocoder.yudao.module.infra.enums.job; import com.google.common.collect.Sets; import lombok.AllArgsConstructor; @@ -25,11 +25,11 @@ public enum InfJobStatusEnum { /** * 开启 */ - NORMAL(1, Sets.newHashSet(STATE_WAITING, STATE_ACQUIRED, STATE_BLOCKED)), + NORMAL(1, Sets.newHashSet(Constants.STATE_WAITING, Constants.STATE_ACQUIRED, Constants.STATE_BLOCKED)), /** * 暂停 */ - STOP(2, Sets.newHashSet(STATE_PAUSED, STATE_PAUSED_BLOCKED)); + STOP(2, Sets.newHashSet(Constants.STATE_PAUSED, Constants.STATE_PAUSED_BLOCKED)); /** * 状态 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java index 106e16218b..b047ae1055 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.enums.logger; +package cn.iocoder.yudao.module.infra.enums.logger; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileConfiguration.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileConfiguration.java similarity index 78% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileConfiguration.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileConfiguration.java index a10c7a7aff..f2bc7c2ebc 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileConfiguration.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.framework.file.config; +package cn.iocoder.yudao.module.infra.file.config; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileProperties.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileProperties.java similarity index 86% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileProperties.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileProperties.java index 0d8ed7cda5..10640751a7 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileProperties.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileProperties.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.framework.file.config; +package cn.iocoder.yudao.module.infra.file.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/package-info.java similarity index 100% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/package-info.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/package-info.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/package-info.java similarity index 55% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/package-info.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/package-info.java index c04bc96df0..77a646af83 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/package-info.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/package-info.java @@ -3,4 +3,4 @@ * * @author 芋道源码 */ -package cn.iocoder.yudao.adminserver.modules.infra.framework; +package cn.iocoder.yudao.module.infra.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/InfConfigRefreshConsumer.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/InfConfigRefreshConsumer.java index 35d3f791b8..f68cdb4d70 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/InfConfigRefreshConsumer.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer.config; +package cn.iocoder.yudao.module.infra.mq.consumer.config; import cn.iocoder.yudao.framework.apollo.internals.DBConfigRepository; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage; +import cn.iocoder.yudao.module.infra.mq.message.config.InfConfigRefreshMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/package-info.java new file mode 100644 index 0000000000..aa5028bec1 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.infra.mq.consumer; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/InfConfigRefreshMessage.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/InfConfigRefreshMessage.java index 4846d9b900..36b51db1aa 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/InfConfigRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.mq.message.config; +package cn.iocoder.yudao.module.infra.mq.message.config; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; import lombok.Data; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/package-info.java new file mode 100644 index 0000000000..997752c34b --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.infra.mq.message; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/InfConfigProducer.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/InfConfigProducer.java index 2a0dc66fde..e77557111c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/InfConfigProducer.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config; +package cn.iocoder.yudao.module.infra.mq.producer.config; -import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage; +import cn.iocoder.yudao.module.infra.mq.message.config.InfConfigRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/package-info.java new file mode 100644 index 0000000000..5bd8d7cc53 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.infra.mq.producer; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/package-info.java new file mode 100644 index 0000000000..da6d4aae8a --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/package-info.java @@ -0,0 +1,8 @@ +/** + * infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 + * 例如说:定时任务的管理、服务器的信息等等 + * + * 1. Controller URL:以 /infra/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 infra_ 开头,方便在数据库中区分 + */ +package cn.iocoder.yudao.module.infra; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/InfConfigService.java similarity index 62% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/InfConfigService.java index 166ebdbd14..8d3995e1c5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/InfConfigService.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.config; +package cn.iocoder.yudao.module.infra.service.config; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; import javax.validation.Valid; import java.util.List; @@ -23,14 +23,14 @@ public interface InfConfigService { * @param reqVO 创建信息 * @return 配置编号 */ - Long createConfig(@Valid InfConfigCreateReqVO reqVO); + Long createConfig(@Valid ConfigCreateReqVO reqVO); /** * 更新参数配置 * * @param reqVO 更新信息 */ - void updateConfig(@Valid InfConfigUpdateReqVO reqVO); + void updateConfig(@Valid ConfigUpdateReqVO reqVO); /** * 删除参数配置 @@ -61,7 +61,7 @@ public interface InfConfigService { * @param reqVO 分页条件 * @return 分页列表 */ - PageResult getConfigPage(@Valid InfConfigPageReqVO reqVO); + PageResult getConfigPage(@Valid ConfigPageReqVO reqVO); /** * 获得参数配置列表 @@ -69,7 +69,7 @@ public interface InfConfigService { * @param reqVO 列表 * @return 列表 */ - List getConfigList(@Valid InfConfigExportReqVO reqVO); + List getConfigList(@Valid ConfigExportReqVO reqVO); } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/impl/InfConfigServiceImpl.java similarity index 67% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/impl/InfConfigServiceImpl.java index 65839e20e9..1911357604 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/impl/InfConfigServiceImpl.java @@ -1,17 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.config.impl; +package cn.iocoder.yudao.module.infra.service.config.impl; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.convert.config.InfConfigConvert; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigMapper; -import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config.InfConfigProducer; -import cn.iocoder.yudao.adminserver.modules.infra.service.config.InfConfigService; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import cn.iocoder.yudao.module.infra.convert.config.InfConfigConvert; +import cn.iocoder.yudao.module.infra.dal.mysql.config.InfConfigMapper; +import cn.iocoder.yudao.module.infra.enums.config.InfConfigTypeEnum; +import cn.iocoder.yudao.module.infra.mq.producer.config.InfConfigProducer; +import cn.iocoder.yudao.module.infra.service.config.InfConfigService; +import cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -21,8 +22,6 @@ import javax.annotation.Resource; import java.util.List; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.*; - /** * 参数配置 Service 实现类 */ @@ -38,7 +37,7 @@ public class InfConfigServiceImpl implements InfConfigService { private InfConfigProducer configProducer; @Override - public Long createConfig(InfConfigCreateReqVO reqVO) { + public Long createConfig(ConfigCreateReqVO reqVO) { // 校验正确性 checkCreateOrUpdate(null, reqVO.getKey()); // 插入参数配置 @@ -51,7 +50,7 @@ public class InfConfigServiceImpl implements InfConfigService { } @Override - public void updateConfig(InfConfigUpdateReqVO reqVO) { + public void updateConfig(ConfigUpdateReqVO reqVO) { // 校验正确性 checkCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key // 更新参数配置 @@ -67,7 +66,7 @@ public class InfConfigServiceImpl implements InfConfigService { InfConfigDO config = checkConfigExists(id); // 内置配置,不允许删除 if (InfConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { - throw ServiceExceptionUtil.exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); } // 删除 configMapper.deleteById(id); @@ -86,12 +85,12 @@ public class InfConfigServiceImpl implements InfConfigService { } @Override - public PageResult getConfigPage(InfConfigPageReqVO reqVO) { + public PageResult getConfigPage(ConfigPageReqVO reqVO) { return configMapper.selectPage(reqVO); } @Override - public List getConfigList(InfConfigExportReqVO reqVO) { + public List getConfigList(ConfigExportReqVO reqVO) { return configMapper.selectList(reqVO); } @@ -109,7 +108,7 @@ public class InfConfigServiceImpl implements InfConfigService { } InfConfigDO config = configMapper.selectById(id); if (config == null) { - throw ServiceExceptionUtil.exception(CONFIG_NOT_EXISTS); + throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_NOT_EXISTS); } return config; } @@ -122,10 +121,10 @@ public class InfConfigServiceImpl implements InfConfigService { } // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 if (id == null) { - throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE); + throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_KEY_DUPLICATE); } if (!config.getId().equals(id)) { - throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE); + throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_KEY_DUPLICATE); } } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileCoreService.java similarity index 90% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileCoreService.java index 8ba8b57fe7..95f2998c19 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileCoreService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.file; +package cn.iocoder.yudao.module.infra.service.file; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileService.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileService.java index 1c8311b29c..f37a422ce7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileService.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.file; +package cn.iocoder.yudao.module.infra.service.file; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileCoreServiceImpl.java similarity index 96% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileCoreServiceImpl.java index f586853463..251563fd4e 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileCoreServiceImpl.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.file.impl; +package cn.iocoder.yudao.module.infra.service.file.impl; import cn.hutool.core.io.FileTypeUtil; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileServiceImpl.java similarity index 66% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileServiceImpl.java index b8967c638e..acd6dfb88a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileServiceImpl.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.file.impl; +package cn.iocoder.yudao.module.infra.service.file.impl; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file.InfFileMapper; -import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.module.infra.dal.mysql.file.InfFileMapper; +import cn.iocoder.yudao.module.infra.service.file.InfFileService; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogService.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogService.java index e4b93d2610..b75897d108 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogService.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.job; +package cn.iocoder.yudao.module.infra.service.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.quartz.core.service.JobLogFrameworkService; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; import java.util.Collection; import java.util.List; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobService.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobService.java index ba90a3b6a9..bfacab3be6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobService.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.job; +package cn.iocoder.yudao.module.infra.service.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobUpdateReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; import org.quartz.SchedulerException; import javax.validation.Valid; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobLogServiceImpl.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobLogServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobLogServiceImpl.java index e055c61589..cbc6a38a31 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobLogServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobLogServiceImpl.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.job.impl; +package cn.iocoder.yudao.module.infra.service.job.impl; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobLogMapper; -import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobLogStatusEnum; -import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobLogService; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.module.infra.dal.mysql.job.InfJobLogMapper; +import cn.iocoder.yudao.module.infra.enums.job.InfJobLogStatusEnum; +import cn.iocoder.yudao.module.infra.service.job.InfJobLogService; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobServiceImpl.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobServiceImpl.java index 3597727579..39e77f1ea0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobServiceImpl.java @@ -1,17 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.job.impl; +package cn.iocoder.yudao.module.infra.service.job.impl; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; import cn.iocoder.yudao.framework.quartz.core.util.CronUtils; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobConvert; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobMapper; -import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobStatusEnum; -import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobService; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobUpdateReqVO; +import cn.iocoder.yudao.module.infra.convert.job.InfJobConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.module.infra.dal.mysql.job.InfJobMapper; +import cn.iocoder.yudao.module.infra.enums.job.InfJobStatusEnum; +import cn.iocoder.yudao.module.infra.service.job.InfJobService; import org.quartz.SchedulerException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,7 +22,7 @@ import java.util.Collection; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.*; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.containsAny; /** diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogCoreService.java similarity index 78% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogCoreService.java index f5480572d5..c38963e4e8 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogCoreService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.logger; +package cn.iocoder.yudao.module.infra.service.logger; import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogService.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogService.java index 347372bb4b..91229efea9 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.logger; +package cn.iocoder.yudao.module.infra.service.logger; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogCoreService.java similarity index 78% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogCoreService.java index 6c8d692018..3ba698e7de 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogCoreService.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.logger; +package cn.iocoder.yudao.module.infra.service.logger; import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogService.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogService.java index c778eee310..2920f3fc74 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.logger; +package cn.iocoder.yudao.module.infra.service.logger; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java index 6327b8b967..6779de2e34 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.logger.impl; +package cn.iocoder.yudao.module.infra.service.logger.impl; import cn.iocoder.yudao.coreservice.modules.infra.convert.logger.InfApiAccessLogCoreConvert; import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogServiceImpl.java similarity index 65% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogServiceImpl.java index 207b3d1527..87856f35b6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogServiceImpl.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl; +package cn.iocoder.yudao.module.infra.service.logger.impl; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiAccessLogMapper; -import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiAccessLogService; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.mysql.logger.InfApiAccessLogMapper; +import cn.iocoder.yudao.module.infra.service.logger.InfApiAccessLogService; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.springframework.stereotype.Service; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java similarity index 95% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java index 4004ea7f66..ddb8b0cf1b 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.logger.impl; +package cn.iocoder.yudao.module.infra.service.logger.impl; import cn.iocoder.yudao.coreservice.modules.infra.convert.logger.InfApiErrorLogCoreConvert; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogServiceImpl.java similarity index 63% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogServiceImpl.java index 6918aec067..85e21cc99c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogServiceImpl.java @@ -1,12 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl; +package cn.iocoder.yudao.module.infra.service.logger.impl; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiErrorLogMapper; -import cn.iocoder.yudao.adminserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; -import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiErrorLogService; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.mysql.logger.InfApiErrorLogMapper; +import cn.iocoder.yudao.module.infra.enums.logger.InfApiErrorLogProcessStatusEnum; +import cn.iocoder.yudao.module.infra.service.logger.InfApiErrorLogService; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -14,8 +16,6 @@ import javax.annotation.Resource; import java.util.Date; import java.util.List; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -44,10 +44,10 @@ public class InfApiErrorLogServiceImpl implements InfApiErrorLogService { public void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId) { InfApiErrorLogDO errorLog = apiErrorLogMapper.selectById(id); if (errorLog == null) { - throw exception(API_ERROR_LOG_NOT_FOUND); + throw ServiceExceptionUtil.exception(InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND); } if (!InfApiErrorLogProcessStatusEnum.INIT.getStatus().equals(errorLog.getProcessStatus())) { - throw exception(API_ERROR_LOG_PROCESSED); + throw ServiceExceptionUtil.exception(InfErrorCodeConstants.API_ERROR_LOG_PROCESSED); } // 标记处理 apiErrorLogMapper.updateById(InfApiErrorLogDO.builder().id(id).processStatus(processStatus) diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/controller/file/vo/InfFileRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/vo/InfFileRespVO.java similarity index 88% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/controller/file/vo/InfFileRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/vo/InfFileRespVO.java index e264a3fd27..dfd914791a 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/controller/file/vo/InfFileRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/vo/InfFileRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.infra.controller.file.vo; +package cn.iocoder.yudao.module.infra.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/package-info.java new file mode 100644 index 0000000000..9ce8230c43 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.infra; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/InfConfigServiceTest.java similarity index 86% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/InfConfigServiceTest.java index ac37cf20cc..d50f5b15af 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/InfConfigServiceTest.java @@ -1,18 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.config; +package cn.iocoder.yudao.module.infra.service.config; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigMapper; -import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config.InfConfigProducer; -import cn.iocoder.yudao.adminserver.modules.infra.service.config.impl.InfConfigServiceImpl; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import cn.iocoder.yudao.module.infra.dal.mysql.config.InfConfigMapper; +import cn.iocoder.yudao.module.infra.enums.config.InfConfigTypeEnum; +import cn.iocoder.yudao.module.infra.mq.producer.config.InfConfigProducer; +import cn.iocoder.yudao.module.infra.service.config.impl.InfConfigServiceImpl; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -22,7 +24,7 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.*; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; @@ -50,7 +52,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @Test public void testCreateConfig_success() { // 准备参数 - InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); + ConfigCreateReqVO reqVO = randomPojo(ConfigCreateReqVO.class); // 调用 Long configId = configService.createConfig(reqVO); @@ -59,7 +61,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // 校验记录的属性是否正确 InfConfigDO config = configMapper.selectById(configId); assertPojoEquals(reqVO, config); - assertEquals(InfConfigTypeEnum.CUSTOM.getType(), config.getType()); + Assertions.assertEquals(InfConfigTypeEnum.CUSTOM.getType(), config.getType()); // 校验调用 verify(configProducer, times(1)).sendConfigRefreshMessage(); } @@ -70,7 +72,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { InfConfigDO dbConfig = randomInfConfigDO(); configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 // 准备参数 - InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class, o -> { + ConfigUpdateReqVO reqVO = randomPojo(ConfigUpdateReqVO.class, o -> { o.setId(dbConfig.getId()); // 设置更新的 ID }); @@ -180,7 +182,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); // 准备参数 - InfConfigPageReqVO reqVO = new InfConfigPageReqVO(); + ConfigPageReqVO reqVO = new ConfigPageReqVO(); reqVO.setName("艿"); reqVO.setKey("nai"); reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); @@ -214,7 +216,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // 测试 createTime 不匹配 configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); // 准备参数 - InfConfigExportReqVO reqVO = new InfConfigExportReqVO(); + ConfigExportReqVO reqVO = new ConfigExportReqVO(); reqVO.setName("艿"); reqVO.setKey("nai"); reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); @@ -250,7 +252,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { Consumer consumer = (o) -> { o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 }; - return randomPojo(InfConfigDO.class, ArrayUtils.append(consumer, consumers)); + return RandomUtils.randomPojo(InfConfigDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/InfFileServiceTest.java similarity index 85% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/InfFileServiceTest.java index a5d4d8e955..314193f668 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/InfFileServiceTest.java @@ -1,8 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.file; +package cn.iocoder.yudao.module.infra.service.file; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.service.file.impl.InfFileServiceImpl; +import cn.iocoder.yudao.framework.test.core.util.AssertUtils; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.module.infra.service.file.impl.InfFileServiceImpl; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file.InfFileCoreMapper; import cn.iocoder.yudao.coreservice.modules.infra.framework.file.config.FileProperties; @@ -15,7 +16,6 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -64,7 +64,7 @@ public class InfFileServiceTest extends BaseDbUnitTest { // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbFile, pageResult.getList().get(0), "content"); + AssertUtils.assertPojoEquals(dbFile, pageResult.getList().get(0), "content"); } } diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogServiceTest.java similarity index 92% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogServiceTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogServiceTest.java index 3946953fa5..60edcef090 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogServiceTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogServiceTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.job; +package cn.iocoder.yudao.module.infra.service.job; import static cn.hutool.core.util.RandomUtil.randomEle; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; @@ -19,12 +19,12 @@ import org.springframework.context.annotation.Import; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobLogMapper; -import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobLogStatusEnum; -import cn.iocoder.yudao.adminserver.modules.infra.service.job.impl.InfJobLogServiceImpl; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.module.infra.dal.mysql.job.InfJobLogMapper; +import cn.iocoder.yudao.module.infra.enums.job.InfJobLogStatusEnum; +import cn.iocoder.yudao.module.infra.service.job.impl.InfJobLogServiceImpl; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; /** diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobServiceTest.java similarity index 89% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobServiceTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobServiceTest.java index 538d4340cc..6fd5acaea2 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobServiceTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobServiceTest.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.job; +package cn.iocoder.yudao.module.infra.service.job; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_EQUALS; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_INVALID; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_CRON_EXPRESSION_VALID; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_HANDLER_EXISTS; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_NOT_EXISTS; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_UPDATE_ONLY_NORMAL_STATUS; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_EQUALS; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_INVALID; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_CRON_EXPRESSION_VALID; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_HANDLER_EXISTS; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_NOT_EXISTS; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_UPDATE_ONLY_NORMAL_STATUS; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; @@ -31,15 +31,15 @@ import org.springframework.context.annotation.Import; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobConvert; -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobMapper; -import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobStatusEnum; -import cn.iocoder.yudao.adminserver.modules.infra.service.job.impl.InfJobServiceImpl; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobUpdateReqVO; +import cn.iocoder.yudao.module.infra.convert.job.InfJobConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.module.infra.dal.mysql.job.InfJobMapper; +import cn.iocoder.yudao.module.infra.enums.job.InfJobStatusEnum; +import cn.iocoder.yudao.module.infra.service.job.impl.InfJobServiceImpl; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; /** diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogServiceImplTest.java similarity index 93% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogServiceImplTest.java index 0c401dd2f0..86e2fa9ddf 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogServiceImplTest.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.logger; +package cn.iocoder.yudao.module.infra.service.logger; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiAccessLogMapper; -import cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl.InfApiAccessLogServiceImpl; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.mysql.logger.InfApiAccessLogMapper; +import cn.iocoder.yudao.module.infra.service.logger.impl.InfApiAccessLogServiceImpl; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import org.junit.jupiter.api.Test; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogServiceImplTest.java similarity index 89% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogServiceImplTest.java index f7c9eb3367..89081277ad 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogServiceImplTest.java @@ -1,16 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.logger; +package cn.iocoder.yudao.module.infra.service.logger; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiErrorLogMapper; -import cn.iocoder.yudao.adminserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; -import cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl.InfApiErrorLogServiceImpl; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.mysql.logger.InfApiErrorLogMapper; +import cn.iocoder.yudao.module.infra.enums.logger.InfApiErrorLogProcessStatusEnum; +import cn.iocoder.yudao.module.infra.service.logger.impl.InfApiErrorLogServiceImpl; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -18,8 +19,8 @@ import javax.annotation.Resource; import java.util.Date; import java.util.List; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; +import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; @@ -174,9 +175,9 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { // id 为 first 的 progressStatus 为 DONE ,应该抛出 API_ERROR_LOG_PROCESSED assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(firstId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_PROCESSED); // 验证 progressStatus 是否修改成功 - assertEquals(InfApiErrorLogProcessStatusEnum.DONE.getStatus(), secondSelect.getProcessStatus()); + Assertions.assertEquals(InfApiErrorLogProcessStatusEnum.DONE.getStatus(), secondSelect.getProcessStatus()); // 验证 progressUserId 是否修改成功 - assertEquals(processUserId, secondSelect.getProcessUserId()); + Assertions.assertEquals(processUserId, secondSelect.getProcessUserId()); } } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbAndRedisUnitTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbAndRedisUnitTest.java new file mode 100644 index 0000000000..64c2964e86 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbAndRedisUnitTest.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.infra.test; + +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB + Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbAndRedisUnitTest { + + @Import({ + // DB 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbUnitTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbUnitTest.java new file mode 100644 index 0000000000..ba7eb10cd4 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbUnitTest.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.infra.test; + +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB 的单元测试 + * + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbUnitTest { + + @Import({ + // DB 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + }) + public static class Application { + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/QuartzTestConfiguration.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/QuartzTestConfiguration.java similarity index 87% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/QuartzTestConfiguration.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/QuartzTestConfiguration.java index 0bbce19085..2dd12f1a60 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/QuartzTestConfiguration.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/QuartzTestConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.config; +package cn.iocoder.yudao.module.infra.test; import org.mockito.Mockito; import org.quartz.Scheduler; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/RedisTestConfiguration.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/RedisTestConfiguration.java new file mode 100644 index 0000000000..aa2ea6f101 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/RedisTestConfiguration.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.infra.test; + +import com.github.fppt.jedismock.RedisServer; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import java.io.IOException; + +@Configuration(proxyBeanMethods = false) +@Lazy(false) // 禁止延迟加载 +@EnableConfigurationProperties(RedisProperties.class) +public class RedisTestConfiguration { + + /** + * 创建模拟的 Redis Server 服务器 + */ + @Bean + public RedisServer redisServer(RedisProperties properties) throws IOException { + RedisServer redisServer = new RedisServer(properties.getPort()); + // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 + try { + redisServer.start(); + } catch (Exception ignore) {} + return redisServer; + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index fc9cb3385c..7ae00aa2a1 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -14,8 +14,7 @@ public interface DictTypeConstants { String OPERATE_TYPE = "sys_operate_type"; // 操作类型 String LOGIN_TYPE = "sys_login_type"; // 登录日志的类型 String LOGIN_RESULT = "sys_login_result"; // 登录结果 - String CONFIG_TYPE = "sys_config_type"; // 参数配置类型 - String BOOLEAN_STRING = "sys_boolean_string"; // Boolean 是否类型 + String SMS_CHANNEL_CODE = "sys_sms_channel_code"; // 短信渠道编码 String SMS_TEMPLATE_TYPE = "sys_sms_template_type"; // 短信模板类型 From 9bc9b2ac6bb717a4205bdf8ae0917cd48e5bab5b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 17:57:45 +0800 Subject: [PATCH 20/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=205=EF=BC=9Ainfra=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E4=BF=AE=E6=94=B9~~~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-admin-server/pom.xml | 11 -- .../adminserver/AdminServerApplication.java | 2 +- .../src/main/resources/application-dev.yaml | 2 +- .../src/main/resources/application-local.yaml | 2 +- .../src/main/resources/application.yaml | 7 +- .../src/test/resources/sql/clean.sql | 7 +- .../src/test/resources/sql/create_tables.sql | 66 -------- yudao-core-service/pom.xml | 4 - .../coreservice/BaseDbAndRedisUnitTest.java | 48 ------ .../yudao/coreservice/BaseDbUnitTest.java | 39 ----- .../yudao/coreservice/BaseRedisUnitTest.java | 32 ---- .../config/RedisTestConfiguration.java | 30 ---- .../service/file/InfFileCoreServiceTest.java | 86 ---------- .../InfApiAccessLogCoreServiceTest.java | 45 ------ .../logger/InfApiErrorLogCoreServiceTest.java | 45 ------ .../modules/infra/service/package-info.java | 1 - .../apollo/internals/DBConfigRepository.java | 3 +- .../config/YudaoMybatisAutoConfiguration.java | 2 +- .../framework/web/config/WebProperties.java | 4 +- .../web/config/YudaoWebAutoConfiguration.java | 4 +- .../yudao/module/infra/api/file/FileApi.java | 31 ++++ .../yudao/module/infra/api/package-info.java | 4 + .../module/infra/enums/DictTypeConstants.java | 0 .../infra/enums/ErrorCodeConstants.java} | 6 +- .../yudao-module-infra-impl/pom.xml | 21 ++- .../module/infra/api/file/FileApiImpl.java | 27 ++++ .../yudao/module/infra/api/package-info.java | 1 + .../admin/config/ConfigController.java | 29 ++-- .../admin/config/vo/ConfigExportReqVO.java | 2 +- .../admin/config/vo/ConfigPageReqVO.java | 2 +- .../admin/config/vo/ConfigRespVO.java | 2 +- .../admin/config/vo/ConfigUpdateReqVO.java | 2 +- ...ocController.java => DbDocController.java} | 5 +- ...ileController.java => FileController.java} | 31 ++-- ...fFilePageReqVO.java => FilePageReqVO.java} | 4 +- .../admin/file/vo/FileRespVO.java} | 6 +- ...fJobController.java => JobController.java} | 46 +++--- ...gController.java => JobLogController.java} | 46 +++--- .../job/{InfJobBaseVO.java => JobBaseVO.java} | 2 +- ...obCreateReqVO.java => JobCreateReqVO.java} | 4 +- .../{InfJobExcelVO.java => JobExcelVO.java} | 2 +- ...obExportReqVO.java => JobExportReqVO.java} | 8 +- ...InfJobPageReqVO.java => JobPageReqVO.java} | 4 +- .../job/{InfJobRespVO.java => JobRespVO.java} | 4 +- ...obUpdateReqVO.java => JobUpdateReqVO.java} | 4 +- ...InfJobLogBaseVO.java => JobLogBaseVO.java} | 2 +- ...fJobLogExcelVO.java => JobLogExcelVO.java} | 2 +- ...xportReqVO.java => JobLogExportReqVO.java} | 4 +- ...LogPageReqVO.java => JobLogPageReqVO.java} | 4 +- ...InfJobLogRespVO.java => JobLogRespVO.java} | 4 +- ...oller.java => ApiAccessLogController.java} | 34 ++-- ...roller.java => ApiErrorLogController.java} | 34 ++-- ...LogBaseVO.java => ApiAccessLogBaseVO.java} | 2 +- ...gExcelVO.java => ApiAccessLogExcelVO.java} | 2 +- ...eqVO.java => ApiAccessLogExportReqVO.java} | 4 +- ...eReqVO.java => ApiAccessLogPageReqVO.java} | 4 +- ...LogRespVO.java => ApiAccessLogRespVO.java} | 4 +- ...rLogBaseVO.java => ApiErrorLogBaseVO.java} | 2 +- ...ogExcelVO.java => ApiErrorLogExcelVO.java} | 5 +- ...ReqVO.java => ApiErrorLogExportReqVO.java} | 4 +- ...geReqVO.java => ApiErrorLogPageReqVO.java} | 4 +- ...rLogRespVO.java => ApiErrorLogRespVO.java} | 4 +- .../admin/redis/RedisController.http | 2 + .../admin/redis/RedisController.java | 10 +- ...edisKeyRespVO.java => RedisKeyRespVO.java} | 6 +- ...torRespVO.java => RedisMonitorRespVO.java} | 4 +- ...fConfigConvert.java => ConfigConvert.java} | 16 +- .../infra/convert/file/FileConvert.java | 18 +++ .../infra/convert/file/InfFileConvert.java | 18 --- .../infra/convert/job/InfJobConvert.java | 36 ----- .../infra/convert/job/InfJobLogConvert.java | 30 ---- .../module/infra/convert/job/JobConvert.java | 36 +++++ .../infra/convert/job/JobLogConvert.java | 30 ++++ .../convert/logger/ApiAccessLogConvert.java | 33 ++++ .../convert/logger/ApiErrorLogConvert.java | 31 ++++ .../logger/InfApiAccessLogConvert.java | 30 ---- .../logger/InfApiAccessLogCoreConvert.java | 15 -- .../convert/logger/InfApiErrorLogConvert.java | 28 ---- .../logger/InfApiErrorLogCoreConvert.java | 15 -- .../infra/convert/redis/RedisConvert.java | 12 +- .../{InfConfigDO.java => ConfigDO.java} | 4 +- .../file/{InfFileDO.java => FileDO.java} | 5 +- .../job/{InfJobDO.java => JobDO.java} | 8 +- .../job/{InfJobLogDO.java => JobLogDO.java} | 14 +- ...piAccessLogDO.java => ApiAccessLogDO.java} | 4 +- ...fApiErrorLogDO.java => ApiErrorLogDO.java} | 5 +- ...oreDAOImpl.java => ConfigCoreDAOImpl.java} | 4 +- ...InfConfigMapper.java => ConfigMapper.java} | 16 +- .../infra/dal/mysql/file/FileMapper.java | 44 ++++++ .../dal/mysql/file/InfFileCoreMapper.java | 28 ---- .../infra/dal/mysql/file/InfFileMapper.java | 24 --- .../infra/dal/mysql/job/InfJobMapper.java | 41 ----- ...InfJobLogMapper.java => JobLogMapper.java} | 16 +- .../module/infra/dal/mysql/job/JobMapper.java | 41 +++++ ...LogMapper.java => ApiAccessLogMapper.java} | 16 +- ...rLogMapper.java => ApiErrorLogMapper.java} | 16 +- .../logger/InfApiAccessLogCoreMapper.java | 14 -- .../logger/InfApiErrorLogCoreMapper.java | 9 -- .../infra/enums/SysErrorCodeConstants.java | 16 -- ...onfigTypeEnum.java => ConfigTypeEnum.java} | 2 +- ...gStatusEnum.java => JobLogStatusEnum.java} | 2 +- ...fJobStatusEnum.java => JobStatusEnum.java} | 5 +- ...java => ApiErrorLogProcessStatusEnum.java} | 2 +- .../file/config/FileConfiguration.java | 2 +- .../file/config/FileProperties.java | 2 +- .../{ => framework}/file/package-info.java | 2 +- ...nsumer.java => ConfigRefreshConsumer.java} | 8 +- ...Message.java => ConfigRefreshMessage.java} | 2 +- ...onfigProducer.java => ConfigProducer.java} | 8 +- ...fConfigService.java => ConfigService.java} | 12 +- ...erviceImpl.java => ConfigServiceImpl.java} | 54 +++---- .../infra/service/file/FileService.java | 46 ++++++ ...eServiceImpl.java => FileServiceImpl.java} | 30 ++-- .../service/file/InfFileCoreService.java | 35 ---- .../infra/service/file/InfFileService.java | 22 --- .../service/file/impl/InfFileServiceImpl.java | 29 ---- ...fJobLogService.java => JobLogService.java} | 16 +- ...erviceImpl.java => JobLogServiceImpl.java} | 33 ++-- .../{InfJobService.java => JobService.java} | 24 +-- ...obServiceImpl.java => JobServiceImpl.java} | 67 ++++---- ...gService.java => ApiAccessLogService.java} | 13 +- .../logger/ApiAccessLogServiceImpl.java | 46 ++++++ ...ogService.java => ApiErrorLogService.java} | 13 +- .../logger/ApiErrorLogServiceImpl.java | 65 ++++++++ .../logger/InfApiAccessLogCoreService.java | 12 -- .../logger/InfApiErrorLogCoreService.java | 12 -- .../impl/InfApiAccessLogCoreServiceImpl.java | 35 ---- .../impl/InfApiAccessLogServiceImpl.java | 37 ----- .../impl/InfApiErrorLogCoreServiceImpl.java | 37 ----- .../impl/InfApiErrorLogServiceImpl.java | 57 ------- .../yudao/module/infra/package-info.java | 1 - ...erviceTest.java => ConfigServiceTest.java} | 88 +++++------ .../infra/service/file/FileServiceTest.java | 126 +++++++++++++++ .../service/file/InfFileServiceTest.java | 70 -------- ...erviceTest.java => JobLogServiceTest.java} | 78 +++++---- ...obServiceTest.java => JobServiceTest.java} | 149 ++++++++---------- ....java => ApiAccessLogServiceImplTest.java} | 87 +++++----- ...t.java => ApiErrorLogServiceImplTest.java} | 84 ++++++---- .../test/resources/application-unit-test.yaml | 54 +++++++ .../src/test/resources/logback-spring.xml | 4 + .../src/test/resources/sql/clean.sql | 6 + .../src/test/resources/sql/create_tables.sql | 67 ++++++++ .../yudao-module-member-impl/pom.xml | 16 +- .../service/user/MemberUserServiceImpl.java | 6 +- .../user/MemberUserServiceImplTest.java | 9 +- .../test/resources/application-unit-test.yaml | 3 +- .../system/enums/DictTypeConstants.java | 1 - .../yudao-module-system-impl/pom.xml | 18 ++- .../admin/common/CaptchaController.http | 1 + .../service/user/AdminUserServiceImpl.java | 7 +- .../service/user/UserServiceImplTest.java | 6 +- .../test/resources/application-unit-test.yaml | 3 +- 更新日志.md | 1 + 153 files changed, 1420 insertions(+), 1742 deletions(-) delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbAndRedisUnitTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbUnitTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseRedisUnitTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/config/RedisTestConfiguration.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreServiceTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreServiceTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreServiceTest.java delete mode 100644 yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/package-info.java create mode 100644 yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/file/FileApi.java create mode 100644 yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/package-info.java rename yudao-module-infra/{yudao-module-infra-impl => yudao-module-infra-api}/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java (100%) rename yudao-module-infra/{yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/InfErrorCodeConstants.java => yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java} (86%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/api/file/FileApiImpl.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/api/package-info.java rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/{InfDbDocController.java => DbDocController.java} (98%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/{InfFileController.java => FileController.java} (72%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/{InfFilePageReqVO.java => FilePageReqVO.java} (91%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/{vo/InfFileRespVO.java => controller/admin/file/vo/FileRespVO.java} (69%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/{InfJobController.java => JobController.java} (76%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/{InfJobLogController.java => JobLogController.java} (64%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/{InfJobBaseVO.java => JobBaseVO.java} (97%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/{InfJobCreateReqVO.java => JobCreateReqVO.java} (83%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/{InfJobExcelVO.java => JobExcelVO.java} (97%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/{InfJobExportReqVO.java => JobExportReqVO.java} (58%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/{InfJobPageReqVO.java => JobPageReqVO.java} (88%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/{InfJobRespVO.java => JobRespVO.java} (90%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/{InfJobUpdateReqVO.java => JobUpdateReqVO.java} (82%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/{InfJobLogBaseVO.java => JobLogBaseVO.java} (98%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/{InfJobLogExcelVO.java => JobLogExcelVO.java} (97%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/{InfJobLogExportReqVO.java => JobLogExportReqVO.java} (85%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/{InfJobLogPageReqVO.java => JobLogPageReqVO.java} (91%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/{InfJobLogRespVO.java => JobLogRespVO.java} (83%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/{InfApiAccessLogController.java => ApiAccessLogController.java} (62%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/{InfApiErrorLogController.java => ApiErrorLogController.java} (70%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/{InfApiAccessLogBaseVO.java => ApiAccessLogBaseVO.java} (98%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/{InfApiAccessLogExcelVO.java => ApiAccessLogExcelVO.java} (97%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/{InfApiAccessLogExportReqVO.java => ApiAccessLogExportReqVO.java} (88%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/{InfApiAccessLogPageReqVO.java => ApiAccessLogPageReqVO.java} (92%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/{InfApiAccessLogRespVO.java => ApiAccessLogRespVO.java} (82%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/{InfApiErrorLogBaseVO.java => ApiErrorLogBaseVO.java} (99%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/{InfApiErrorLogExcelVO.java => ApiErrorLogExcelVO.java} (94%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/{InfApiErrorLogExportReqVO.java => ApiErrorLogExportReqVO.java} (87%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/{InfApiErrorLogPageReqVO.java => ApiErrorLogPageReqVO.java} (92%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/{InfApiErrorLogRespVO.java => ApiErrorLogRespVO.java} (86%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/{InfRedisKeyRespVO.java => RedisKeyRespVO.java} (90%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/{InfRedisMonitorRespVO.java => RedisMonitorRespVO.java} (92%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/{InfConfigConvert.java => ConfigConvert.java} (53%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/FileConvert.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/InfFileConvert.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobConvert.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobLogConvert.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/JobConvert.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/JobLogConvert.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/ApiAccessLogConvert.java create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/ApiErrorLogConvert.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogConvert.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogCoreConvert.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogConvert.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogCoreConvert.java rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/{InfConfigDO.java => ConfigDO.java} (94%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/{InfFileDO.java => FileDO.java} (86%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/{InfJobDO.java => JobDO.java} (89%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/{InfJobLogDO.java => JobLogDO.java} (81%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/{InfApiAccessLogDO.java => ApiAccessLogDO.java} (96%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/{InfApiErrorLogDO.java => ApiErrorLogDO.java} (94%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/{InfConfigCoreDAOImpl.java => ConfigCoreDAOImpl.java} (88%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/{InfConfigMapper.java => ConfigMapper.java} (67%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileMapper.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileCoreMapper.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileMapper.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobMapper.java rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/{InfJobLogMapper.java => JobLogMapper.java} (73%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobMapper.java rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/{InfApiAccessLogMapper.java => ApiAccessLogMapper.java} (74%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/{InfApiErrorLogMapper.java => ApiErrorLogMapper.java} (73%) delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/SysErrorCodeConstants.java rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/{InfConfigTypeEnum.java => ConfigTypeEnum.java} (89%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/{InfJobLogStatusEnum.java => JobLogStatusEnum.java} (91%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/{InfJobStatusEnum.java => JobStatusEnum.java} (90%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/{InfApiErrorLogProcessStatusEnum.java => ApiErrorLogProcessStatusEnum.java} (90%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/{ => framework}/file/config/FileConfiguration.java (81%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/{ => framework}/file/config/FileProperties.java (88%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/{ => framework}/file/package-info.java (92%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/{InfConfigRefreshConsumer.java => ConfigRefreshConsumer.java} (61%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/{InfConfigRefreshMessage.java => ConfigRefreshMessage.java} (80%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/{InfConfigProducer.java => ConfigProducer.java} (64%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/{InfConfigService.java => ConfigService.java} (80%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/{impl/InfConfigServiceImpl.java => ConfigServiceImpl.java} (59%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/{impl/InfFileCoreServiceImpl.java => FileServiceImpl.java} (59%) delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileCoreService.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileService.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileServiceImpl.java rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/{InfJobLogService.java => JobLogService.java} (68%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/{impl/InfJobLogServiceImpl.java => JobLogServiceImpl.java} (55%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/{InfJobService.java => JobService.java} (75%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/{impl/InfJobServiceImpl.java => JobServiceImpl.java} (68%) rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/{InfApiAccessLogService.java => ApiAccessLogService.java} (57%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/{InfApiErrorLogService.java => ApiErrorLogService.java} (65%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogCoreService.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogCoreService.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogServiceImpl.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogServiceImpl.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/package-info.java rename yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/{InfConfigServiceTest.java => ConfigServiceTest.java} (73%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceTest.java delete mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/InfFileServiceTest.java rename yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/{InfJobLogServiceTest.java => JobLogServiceTest.java} (67%) rename yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/{InfJobServiceTest.java => JobServiceTest.java} (62%) rename yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/{InfApiAccessLogServiceImplTest.java => ApiAccessLogServiceImplTest.java} (54%) rename yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/{InfApiErrorLogServiceImplTest.java => ApiErrorLogServiceImplTest.java} (65%) create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/resources/logback-spring.xml create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/clean.sql create mode 100644 yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/create_tables.sql rename yudao-module-system/{yudao-module-system-impl => yudao-module-system-api}/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java (99%) diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 00e1edeb0b..dd73b51788 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -99,12 +99,6 @@ yudao-spring-boot-starter-redis - - - cn.iocoder.boot - yudao-spring-boot-starter-config - - cn.iocoder.boot @@ -152,11 +146,6 @@ velocity-engine-core - - cn.smallbun.screw - screw-core - - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java index a37d220b4c..2adf77b803 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java @@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} 和 ${yudao.core-service.base-package} @SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}", "${yudao.core-service.base-package}", - "${yudao.info.member-package}", "${yudao.info.system-package}"}) // TODO 芋艿:重构 + "${yudao.info.base-package2}"}) // TODO 芋艿:重构 public class AdminServerApplication { public static void main(String[] args) { diff --git a/yudao-admin-server/src/main/resources/application-dev.yaml b/yudao-admin-server/src/main/resources/application-dev.yaml index a498079041..246d5e8830 100644 --- a/yudao-admin-server/src/main/resources/application-dev.yaml +++ b/yudao-admin-server/src/main/resources/application-dev.yaml @@ -100,7 +100,7 @@ apollo: eagerLoad: enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址 - dao: cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.config.InfConfigCoreDAOImpl + dao: cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigCoreDAOImpl url: ${spring.datasource.dynamic.datasource.master.url} username: ${spring.datasource.dynamic.datasource.master.username} password: ${spring.datasource.dynamic.datasource.master.password} diff --git a/yudao-admin-server/src/main/resources/application-local.yaml b/yudao-admin-server/src/main/resources/application-local.yaml index 411f2a6a33..9bdeb775bb 100644 --- a/yudao-admin-server/src/main/resources/application-local.yaml +++ b/yudao-admin-server/src/main/resources/application-local.yaml @@ -113,7 +113,7 @@ apollo: eagerLoad: enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址 - dao: cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.config.InfConfigCoreDAOImpl + dao: cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigCoreDAOImpl url: ${spring.datasource.dynamic.datasource.master.url} username: ${spring.datasource.dynamic.datasource.master.username} password: ${spring.datasource.dynamic.datasource.master.password} diff --git a/yudao-admin-server/src/main/resources/application.yaml b/yudao-admin-server/src/main/resources/application.yaml index 81ec74b2cf..b352943a88 100644 --- a/yudao-admin-server/src/main/resources/application.yaml +++ b/yudao-admin-server/src/main/resources/application.yaml @@ -48,17 +48,16 @@ yudao: info: version: 1.0.0 base-package: cn.iocoder.yudao.adminserver - member-package: cn.iocoder.yudao.module.member - system-package: cn.iocoder.yudao.module.system + base-package2: cn.iocoder.yudao.module core-service: base-package: cn.iocoder.yudao.coreservice web: admin-api: prefix: /admin-api - controller: cn.iocoder.yudao.module.system.controller.admin # TODO 芋艿:需要改造 + controller: '**.controller.admin.**' app-api: prefix: /app-api - controller: cn.iocoder.yudao.module.member.controller.app # TODO 芋艿:需要改造 + controller: '**.controller.app.**' swagger: title: 管理后台 diff --git a/yudao-admin-server/src/test/resources/sql/clean.sql b/yudao-admin-server/src/test/resources/sql/clean.sql index c0149d424c..9e0718a866 100644 --- a/yudao-admin-server/src/test/resources/sql/clean.sql +++ b/yudao-admin-server/src/test/resources/sql/clean.sql @@ -1,10 +1,5 @@ -- inf 开头的 DB -DELETE FROM "inf_config"; -DELETE FROM "inf_file"; -DELETE FROM "inf_job"; -DELETE FROM "inf_job_log"; -DELETE FROM "inf_api_access_log"; -DELETE FROM "inf_api_error_log"; + -- pay 开头的 DB DELETE FROM pay_merchant; diff --git a/yudao-admin-server/src/test/resources/sql/create_tables.sql b/yudao-admin-server/src/test/resources/sql/create_tables.sql index b8b92e3b1f..850146fecc 100644 --- a/yudao-admin-server/src/test/resources/sql/create_tables.sql +++ b/yudao-admin-server/src/test/resources/sql/create_tables.sql @@ -1,71 +1,5 @@ -- inf 开头的 DB -CREATE TABLE IF NOT EXISTS "inf_config" ( - "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "group" varchar(50) NOT NULL, - "type" tinyint NOT NULL, - "name" varchar(100) NOT NULL DEFAULT '', - "key" varchar(100) NOT NULL DEFAULT '', - "value" varchar(500) NOT NULL DEFAULT '', - "sensitive" bit NOT NULL, - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '参数配置表'; - -CREATE TABLE IF NOT EXISTS "inf_file" ( - "id" varchar(188) NOT NULL, - "type" varchar(63) DEFAULT NULL, - "content" blob NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '文件表'; - -CREATE TABLE IF NOT EXISTS "inf_job" ( - "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', - "name" varchar(32) NOT NULL COMMENT '任务名称', - "status" tinyint(4) NOT NULL COMMENT '任务状态', - "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', - "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', - "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', - "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', - "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', - "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', - "creator" varchar(64) DEFAULT '' COMMENT '创建者', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - "updater" varchar(64) DEFAULT '' COMMENT '更新者', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', - PRIMARY KEY ("id") -) COMMENT='定时任务表'; - -CREATE TABLE IF NOT EXISTS "inf_job_log" ( - "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', - "job_id" bigint(20) NOT NULL COMMENT '任务编号', - "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', - "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', - "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行', - "begin_time" datetime NOT NULL COMMENT '开始执行时间', - "end_time" datetime DEFAULT NULL COMMENT '结束执行时间', - "duration" int(11) DEFAULT NULL COMMENT '执行时长', - "status" tinyint(4) NOT NULL COMMENT '任务状态', - "result" varchar(4000) DEFAULT '' COMMENT '结果数据', - "creator" varchar(64) DEFAULT '' COMMENT '创建者', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - "updater" varchar(64) DEFAULT '' COMMENT '更新者', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', - PRIMARY KEY ("id") -)COMMENT='定时任务日志表'; CREATE TABLE IF NOT EXISTS "pay_merchant" ( diff --git a/yudao-core-service/pom.xml b/yudao-core-service/pom.xml index aaec8d2a65..ccb1e1600b 100644 --- a/yudao-core-service/pom.xml +++ b/yudao-core-service/pom.xml @@ -40,10 +40,6 @@ cn.iocoder.boot yudao-spring-boot-starter-biz-tenant - - cn.iocoder.boot - yudao-spring-boot-starter-biz-social - diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbAndRedisUnitTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbAndRedisUnitTest.java deleted file mode 100644 index 8b9177cf51..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbAndRedisUnitTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.yudao.coreservice; - -import cn.iocoder.yudao.coreservice.config.RedisTestConfiguration; -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.jdbc.Sql; - -/** - * 依赖内存 DB + Redis 的单元测试 - * - * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis - * - * @author 芋道源码 - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB -public class BaseDbAndRedisUnitTest { - - @Import({ - // DB 配置类 - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 - // MyBatis 配置类 - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - // Redis 配置类 - RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer - RedisAutoConfiguration.class, // Spring Redis 自动配置类 - YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动高配置类 - }) - public static class Application { - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbUnitTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbUnitTest.java deleted file mode 100644 index 94d6d3107c..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbUnitTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.coreservice; - -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.jdbc.Sql; - -/** - * 依赖内存 DB 的单元测试 - * - * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 - * - * @author 芋道源码 - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB -public class BaseDbUnitTest { - - @Import({ - // DB 配置类 - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 - // MyBatis 配置类 - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - }) - public static class Application { - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseRedisUnitTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseRedisUnitTest.java deleted file mode 100644 index e95e6d787d..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseRedisUnitTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.coreservice; - -import cn.iocoder.yudao.coreservice.config.RedisTestConfiguration; -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; - -/** - * 依赖内存 Redis 的单元测试 - * - * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis - * - * @author 芋道源码 - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class) -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 -public class BaseRedisUnitTest { - - @Import({ - // Redis 配置类 - RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer - RedisAutoConfiguration.class, // Spring Redis 自动配置类 - YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动高配置类 - }) - public static class Application { - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/config/RedisTestConfiguration.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/config/RedisTestConfiguration.java deleted file mode 100644 index eb0791974c..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/config/RedisTestConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.coreservice.config; - -import com.github.fppt.jedismock.RedisServer; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; - -import java.io.IOException; - -@Configuration(proxyBeanMethods = false) -@Lazy(false) // 禁止延迟加载 -@EnableConfigurationProperties(RedisProperties.class) -public class RedisTestConfiguration { - - /** - * 创建模拟的 Redis Server 服务器 - */ - @Bean - public RedisServer redisServer(RedisProperties properties) throws IOException { - RedisServer redisServer = new RedisServer(properties.getPort()); - // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 - try { - redisServer.start(); - } catch (Exception ignore) {} - return redisServer; - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreServiceTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreServiceTest.java deleted file mode 100644 index 232ccf5f44..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreServiceTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.file; - -import cn.hutool.core.io.resource.ResourceUtil; -import cn.iocoder.yudao.coreservice.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file.InfFileCoreMapper; -import cn.iocoder.yudao.coreservice.modules.infra.framework.file.config.FileProperties; -import cn.iocoder.yudao.coreservice.modules.infra.service.file.impl.InfFileCoreServiceImpl; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.coreservice.modules.infra.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; -import static org.junit.jupiter.api.Assertions.*; - -@Import({InfFileCoreServiceImpl.class, FileProperties.class}) -public class InfFileCoreServiceTest extends BaseDbUnitTest { - - @Resource - private InfFileCoreService fileCoreService; - - @MockBean - private FileProperties fileProperties; - - @Resource - private InfFileCoreMapper fileMapper; - - @Test - public void testCreateFile_success() { - // 准备参数 - String path = randomString(); - byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); - - // 调用 - String url = fileCoreService.createFile(path, content); - // 断言 - assertEquals(fileProperties.getBasePath() + path, url); - // 校验数据 - InfFileDO file = fileMapper.selectById(path); - assertEquals(path, file.getId()); - assertEquals("jpg", file.getType()); - assertArrayEquals(content, file.getContent()); - } - - @Test - public void testCreateFile_exists() { - // mock 数据 - InfFileDO dbFile = randomPojo(InfFileDO.class); - fileMapper.insert(dbFile); - // 准备参数 - String path = dbFile.getId(); // 模拟已存在 - byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); - - // 调用,并断言异常 - assertServiceException(() -> fileCoreService.createFile(path, content), FILE_PATH_EXISTS); - } - - @Test - public void testDeleteFile_success() { - // mock 数据 - InfFileDO dbFile = randomPojo(InfFileDO.class); - fileMapper.insert(dbFile);// @Sql: 先插入出一条存在的数据 - // 准备参数 - String id = dbFile.getId(); - - // 调用 - fileCoreService.deleteFile(id); - // 校验数据不存在了 - assertNull(fileMapper.selectById(id)); - } - - @Test - public void testDeleteFile_notExists() { - // 准备参数 - String id = randomString(); - - // 调用, 并断言异常 - assertServiceException(() -> fileCoreService.deleteFile(id), FILE_NOT_EXISTS); - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreServiceTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreServiceTest.java deleted file mode 100644 index c7b2620eb0..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreServiceTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.logger; - -import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.coreservice.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger.InfApiAccessLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.infra.service.logger.impl.InfApiAccessLogCoreServiceImpl; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * {@link InfApiAccessLogCoreServiceImpl} 单元测试 - */ -@Import(InfApiAccessLogCoreServiceImpl.class) -public class InfApiAccessLogCoreServiceTest extends BaseDbUnitTest { - - @Resource - private InfApiAccessLogCoreService apiAccessLogCoreService; - - @Resource - private InfApiAccessLogCoreMapper apiAccessLogCoreMapper; - - @Test - public void testCreateApiAccessLogAsync() { - // 准备参数 - ApiAccessLogCreateReqDTO createDTO = RandomUtils.randomPojo(ApiAccessLogCreateReqDTO.class, - dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue())); - - // 调用 - apiAccessLogCoreService.createApiAccessLogAsync(createDTO); - // 断言 - InfApiAccessLogDO infApiAccessLogDO = apiAccessLogCoreMapper.selectOne(null); - assertNotNull(infApiAccessLogDO); - assertPojoEquals(createDTO, infApiAccessLogDO); - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreServiceTest.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreServiceTest.java deleted file mode 100644 index 6379ab32a1..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreServiceTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service.logger; - -import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.coreservice.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger.InfApiErrorLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.infra.service.logger.impl.InfApiErrorLogCoreServiceImpl; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDTO; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * {@link InfApiErrorLogCoreServiceImpl} 单元测试 - */ -@Import(InfApiErrorLogCoreServiceImpl.class) -public class InfApiErrorLogCoreServiceTest extends BaseDbUnitTest { - - @Resource - private InfApiErrorLogCoreService apiErrorLogCoreService; - - @Resource - private InfApiErrorLogCoreMapper infApiErrorLogCoreMapper; - - @Test - public void testCreateApiErrorLogAsync() { - // 准备参数 - ApiErrorLogCreateReqDTO createDTO = RandomUtils.randomPojo(ApiErrorLogCreateReqDTO.class, - dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue())); - - // 调用 - apiErrorLogCoreService.createApiErrorLogAsync(createDTO); - // 断言 - InfApiErrorLogDO infApiErrorLogDO = infApiErrorLogCoreMapper.selectOne(null); - assertNotNull(infApiErrorLogDO); - assertPojoEquals(createDTO, infApiErrorLogDO); - } - -} diff --git a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/package-info.java b/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/package-info.java deleted file mode 100644 index c3da3526cf..0000000000 --- a/yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.infra.service; diff --git a/yudao-framework/yudao-spring-boot-starter-config/src/main/java/cn/iocoder/yudao/framework/apollo/internals/DBConfigRepository.java b/yudao-framework/yudao-spring-boot-starter-config/src/main/java/cn/iocoder/yudao/framework/apollo/internals/DBConfigRepository.java index c88038da97..08573d33d6 100644 --- a/yudao-framework/yudao-spring-boot-starter-config/src/main/java/cn/iocoder/yudao/framework/apollo/internals/DBConfigRepository.java +++ b/yudao-framework/yudao-spring-boot-starter-config/src/main/java/cn/iocoder/yudao/framework/apollo/internals/DBConfigRepository.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Properties; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.function.Predicate; @Slf4j public class DBConfigRepository extends AbstractConfigRepository { @@ -135,7 +136,7 @@ public class DBConfigRepository extends AbstractConfigRepository { private Properties buildProperties(List configs) { Properties properties = propertiesFactory.getPropertiesInstance(); - configs.stream().filter(ConfigRespDTO::getDeleted) // 过滤掉被删除的配置 + configs.stream().filter(config -> !config.getDeleted()) // 过滤掉被删除的配置 .forEach(config -> properties.put(config.getKey(), config.getValue())); return properties; } diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java index 9bd5202e48..7e25761376 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java @@ -16,7 +16,7 @@ import org.springframework.context.annotation.Configuration; */ @Configuration @MapperScan(value = {"${yudao.info.base-package}", "${yudao.core-service.base-package}", - "${yudao.info.member-package}", "${yudao.info.system-package}"}, + "${yudao.info.base-package2}"}, annotationClass = Mapper.class, lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 public class YudaoMybatisAutoConfiguration { diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java index 23a4aff4a5..a7058871e8 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java @@ -36,11 +36,9 @@ public class WebProperties { private String prefix; /** - * Controller 所在包 + * Controller 所在包的 Ant 路径规则 * * 主要目的是,给该 Controller 设置指定的 {@link #prefix} - * - * 因为我们有多个 modules 包里会包含 Controller,所以只需要写到 cn.iocoder.yudao 这样的层级 */ @NotEmpty(message = "Controller 所在包不能为空") private String controller; diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java index c3bcb2009c..a6f932dd07 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java @@ -13,6 +13,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.util.AntPathMatcher; import org.springframework.util.PathMatcher; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.cors.CorsConfiguration; @@ -49,8 +50,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { * @param api API 配置 */ private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) { + AntPathMatcher antPathMatcher = new AntPathMatcher("."); configurer.addPathPrefix(api.getPrefix(), clazz -> clazz.isAnnotationPresent(RestController.class) - && clazz.getPackage().getName().startsWith(api.getController())); // 仅仅匹配 controller 包 + && antPathMatcher.match(api.getController(), clazz.getPackage().getName())); // 仅仅匹配 controller 包 } @Bean diff --git a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/file/FileApi.java b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/file/FileApi.java new file mode 100644 index 0000000000..5d55c57316 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/file/FileApi.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.infra.api.file; + +import cn.hutool.core.util.IdUtil; + +/** + * 文件 API 接口 + * + * @author 芋道源码 + */ +public interface FileApi { + + /** + * 保存文件,并返回文件的访问路径 + * + * @param content 文件内容 + * @return 文件路径 + */ + default String createFile(byte[] content) { + return createFile(IdUtil.fastUUID(), content); + } + + /** + * 保存文件,并返回文件的访问路径 + * + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String path, byte[] content); + +} diff --git a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/package-info.java b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/package-info.java new file mode 100644 index 0000000000..9ed9a778e9 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/package-info.java @@ -0,0 +1,4 @@ +/** + * infra API 包,定义暴露给其它模块的 API + */ +package cn.iocoder.yudao.module.infra.api; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java similarity index 100% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java rename to yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/DictTypeConstants.java diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/InfErrorCodeConstants.java b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java similarity index 86% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/InfErrorCodeConstants.java rename to yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java index 0eeaa74088..03eefe17f1 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/InfErrorCodeConstants.java +++ b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; * * infra 系统,使用 1-001-000-000 段 */ -public interface InfErrorCodeConstants { +public interface ErrorCodeConstants { // ========== 参数配置 1001000000 ========== ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1001000001, "参数配置不存在"); @@ -27,4 +27,8 @@ public interface InfErrorCodeConstants { ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1001002000, "API 错误日志不存在"); ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1001002001, "API 错误日志已处理"); + // ========= 文件相关 1001003000================= + ErrorCode FILE_PATH_EXISTS = new ErrorCode(1001003000, "文件路径已存在"); + ErrorCode FILE_NOT_EXISTS = new ErrorCode(1001003001, "文件不存在"); + } diff --git a/yudao-module-infra/yudao-module-infra-impl/pom.xml b/yudao-module-infra/yudao-module-infra-impl/pom.xml index 9c98f6d622..69dbc4ec4b 100644 --- a/yudao-module-infra/yudao-module-infra-impl/pom.xml +++ b/yudao-module-infra/yudao-module-infra-impl/pom.xml @@ -23,19 +23,26 @@ yudao-module-member-api ${revision} - cn.iocoder.boot yudao-module-system-api ${revision} + + cn.iocoder.boot + yudao-module-infra-api + ${revision} + - cn.iocoder.boot yudao-spring-boot-starter-biz-operatelog + + cn.iocoder.boot + yudao-spring-boot-starter-biz-tenant + @@ -54,6 +61,12 @@ yudao-spring-boot-starter-redis + + + cn.iocoder.boot + yudao-spring-boot-starter-config + + cn.iocoder.boot @@ -73,6 +86,10 @@ yudao-spring-boot-starter-excel + + cn.smallbun.screw + screw-core + diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/api/file/FileApiImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/api/file/FileApiImpl.java new file mode 100644 index 0000000000..c5ce8db198 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/api/file/FileApiImpl.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.infra.api.file; + +import cn.iocoder.yudao.module.infra.api.file.FileApi; +import cn.iocoder.yudao.module.infra.service.file.FileService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 文件 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class FileApiImpl implements FileApi { + + @Resource + private FileService fileService; + + @Override + public String createFile(String path, byte[] content) { + return fileService.createFile(path, content); + } + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/api/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/api/package-info.java new file mode 100644 index 0000000000..af01680f6a --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/api/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.infra.api; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java index 5bad8d83c9..73c3a2e528 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java @@ -1,17 +1,15 @@ package cn.iocoder.yudao.module.infra.controller.admin.config; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.*; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.*; -import cn.iocoder.yudao.module.infra.convert.config.InfConfigConvert; -import cn.iocoder.yudao.module.infra.service.config.InfConfigService; -import cn.iocoder.yudao.module.infra.controller.config.vo.*; -import cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants; +import cn.iocoder.yudao.module.infra.convert.config.ConfigConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; +import cn.iocoder.yudao.module.infra.service.config.ConfigService; +import cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -25,18 +23,17 @@ import javax.validation.Valid; import java.io.IOException; import java.util.List; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "参数配置") +@Api(tags = "管理后台 - 参数配置") @RestController @RequestMapping("/infra/config") @Validated public class ConfigController { @Resource - private InfConfigService configService; + private ConfigService configService; @PostMapping("/create") @ApiOperation("创建参数配置") @@ -67,19 +64,19 @@ public class ConfigController { @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('infra:config:query')") public CommonResult getConfig(@RequestParam("id") Long id) { - return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id))); + return success(ConfigConvert.INSTANCE.convert(configService.getConfig(id))); } @GetMapping(value = "/get-value-by-key") @ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端") @ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class) public CommonResult getConfigKey(@RequestParam("key") String key) { - InfConfigDO config = configService.getConfigByKey(key); + ConfigDO config = configService.getConfigByKey(key); if (config == null) { return null; } if (config.getSensitive()) { - throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE); } return success(config.getValue()); } @@ -88,8 +85,8 @@ public class ConfigController { @ApiOperation("获取参数配置分页") @PreAuthorize("@ss.hasPermission('infra:config:query')") public CommonResult> getConfigPage(@Valid ConfigPageReqVO reqVO) { - PageResult page = configService.getConfigPage(reqVO); - return success(InfConfigConvert.INSTANCE.convertPage(page)); + PageResult page = configService.getConfigPage(reqVO); + return success(ConfigConvert.INSTANCE.convertPage(page)); } @GetMapping("/export") @@ -98,9 +95,9 @@ public class ConfigController { @OperateLog(type = EXPORT) public void exportSysConfig(@Valid ConfigExportReqVO reqVO, HttpServletResponse response) throws IOException { - List list = configService.getConfigList(reqVO); + List list = configService.getConfigList(reqVO); // 拼接数据 - List datas = InfConfigConvert.INSTANCE.convertList(list); + List datas = ConfigConvert.INSTANCE.convertList(list); // 输出 ExcelUtils.write(response, "参数配置.xls", "数据", ConfigExcelVO.class, datas); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java index 73ee016cdc..2e328e6d97 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java @@ -9,7 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("参数配置导出 Request VO") +@ApiModel("管理后台 - 参数配置导出 Request VO") @Data public class ConfigExportReqVO { diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java index e97585f746..87d4ce9282 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java @@ -12,7 +12,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("参数配置分页 Request VO") +@ApiModel("管理后台 - 参数配置分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java index 464eb030db..03196e0609 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java @@ -9,7 +9,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.util.Date; -@ApiModel("参数配置信息 Response VO") +@ApiModel("管理后台 - 参数配置信息 Response VO") @Data @EqualsAndHashCode(callSuper = true) public class ConfigRespVO extends ConfigBaseVO { diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java index 5de7ea3b73..2335d61699 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java @@ -8,7 +8,7 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("参数配置创建 Request VO") +@ApiModel("管理后台 - 参数配置创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/InfDbDocController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/DbDocController.java similarity index 98% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/InfDbDocController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/DbDocController.java index e8533e5cc2..57cad489f1 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/InfDbDocController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/doc/DbDocController.java @@ -16,7 +16,6 @@ import com.zaxxer.hikari.HikariDataSource; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -28,10 +27,10 @@ import java.io.File; import java.io.IOException; import java.util.Collections; -@Api(tags = "数据库文档") +@Api(tags = "管理后台 - 数据库文档") @RestController @RequestMapping("/infra/db-doc") -public class InfDbDocController { +public class DbDocController { @Resource private DynamicDataSourceProperties dynamicDataSourceProperties; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/InfFileController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java similarity index 72% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/InfFileController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java index 7d7d46b83c..32789f1aff 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/InfFileController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java @@ -1,16 +1,15 @@ package cn.iocoder.yudao.module.infra.controller.admin.file; import cn.hutool.core.io.IoUtil; -import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.module.infra.service.file.InfFileService; -import cn.iocoder.yudao.coreservice.modules.infra.controller.file.vo.InfFileRespVO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.convert.file.InfFileConvert; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FilePageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FileRespVO; +import cn.iocoder.yudao.module.infra.convert.file.FileConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; +import cn.iocoder.yudao.module.infra.service.file.FileService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -29,17 +28,15 @@ import java.io.IOException; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "文件存储") +@Api(tags = "管理后台 - 文件存储") @RestController @RequestMapping("/infra/file") @Validated @Slf4j -public class InfFileController { +public class FileController { @Resource - private InfFileService fileService; - @Resource - private InfFileCoreService fileCoreService; + private FileService fileService; @PostMapping("/upload") @ApiOperation("上传文件") @@ -49,7 +46,7 @@ public class InfFileController { }) public CommonResult uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("path") String path) throws IOException { - return success(fileCoreService.createFile(path, IoUtil.readBytes(file.getInputStream()))); + return success(fileService.createFile(path, IoUtil.readBytes(file.getInputStream()))); } @DeleteMapping("/delete") @@ -57,7 +54,7 @@ public class InfFileController { @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = String.class) @PreAuthorize("@ss.hasPermission('infra:file:delete')") public CommonResult deleteFile(@RequestParam("id") String id) { - fileCoreService.deleteFile(id); + fileService.deleteFile(id); return success(true); } @@ -66,7 +63,7 @@ public class InfFileController { @ApiImplicitParam(name = "path", value = "文件附件", required = true, dataTypeClass = MultipartFile.class) public void getFile(HttpServletResponse response, @PathVariable("path") String path) throws IOException { TenantContextHolder.setNullTenantId(); - InfFileDO file = fileCoreService.getFile(path); + FileDO file = fileService.getFile(path); if (file == null) { log.warn("[getFile][path({}) 文件不存在]", path); response.setStatus(HttpStatus.NOT_FOUND.value()); @@ -78,9 +75,9 @@ public class InfFileController { @GetMapping("/page") @ApiOperation("获得文件分页") @PreAuthorize("@ss.hasPermission('infra:file:query')") - public CommonResult> getFilePage(@Valid InfFilePageReqVO pageVO) { - PageResult pageResult = fileService.getFilePage(pageVO); - return success(InfFileConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getFilePage(@Valid FilePageReqVO pageVO) { + PageResult pageResult = fileService.getFilePage(pageVO); + return success(FileConvert.INSTANCE.convertPage(pageResult)); } } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/InfFilePageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/FilePageReqVO.java similarity index 91% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/InfFilePageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/FilePageReqVO.java index 5b639cc391..bf67300ab2 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/InfFilePageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/FilePageReqVO.java @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("文件分页 Request VO") +@ApiModel("管理后台 - 文件分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfFilePageReqVO extends PageParam { +public class FilePageReqVO extends PageParam { @ApiModelProperty(value = "文件路径", example = "yudao", notes = "模糊匹配") private String id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/vo/InfFileRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/FileRespVO.java similarity index 69% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/vo/InfFileRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/FileRespVO.java index dfd914791a..838f3272b3 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/vo/InfFileRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/FileRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.infra.vo; +package cn.iocoder.yudao.module.infra.controller.admin.file.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,9 +6,9 @@ import lombok.Data; import java.util.Date; -@ApiModel(value = "文件 Response VO", description = "不返回 content 字段,太大") +@ApiModel(value = "管理后台 - 文件 Response VO", description = "不返回 content 字段,太大") @Data -public class InfFileRespVO { +public class FileRespVO { @ApiModelProperty(value = "文件路径", required = true, example = "yudao.jpg") private String id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java similarity index 76% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java index f153f3f6ee..47ef687dde 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java @@ -5,12 +5,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.quartz.core.util.CronUtils; -import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.*; import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.*; -import cn.iocoder.yudao.module.infra.convert.job.InfJobConvert; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.yudao.module.infra.service.job.InfJobService; -import cn.iocoder.yudao.module.infra.controller.job.vo.job.*; +import cn.iocoder.yudao.module.infra.convert.job.JobConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; +import cn.iocoder.yudao.module.infra.service.job.JobService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -32,19 +30,19 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "定时任务") +@Api(tags = "管理后台 - 定时任务") @RestController @RequestMapping("/infra/job") @Validated -public class InfJobController { +public class JobController { @Resource - private InfJobService jobService; + private JobService jobService; @PostMapping("/create") @ApiOperation("创建定时任务") @PreAuthorize("@ss.hasPermission('infra:job:create')") - public CommonResult createJob(@Valid @RequestBody InfJobCreateReqVO createReqVO) + public CommonResult createJob(@Valid @RequestBody JobCreateReqVO createReqVO) throws SchedulerException { return success(jobService.createJob(createReqVO)); } @@ -52,7 +50,7 @@ public class InfJobController { @PutMapping("/update") @ApiOperation("更新定时任务") @PreAuthorize("@ss.hasPermission('infra:job:update')") - public CommonResult updateJob(@Valid @RequestBody InfJobUpdateReqVO updateReqVO) + public CommonResult updateJob(@Valid @RequestBody JobUpdateReqVO updateReqVO) throws SchedulerException { jobService.updateJob(updateReqVO); return success(true); @@ -94,38 +92,38 @@ public class InfJobController { @ApiOperation("获得定时任务") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult getJob(@RequestParam("id") Long id) { - InfJobDO job = jobService.getJob(id); - return success(InfJobConvert.INSTANCE.convert(job)); + public CommonResult getJob(@RequestParam("id") Long id) { + JobDO job = jobService.getJob(id); + return success(JobConvert.INSTANCE.convert(job)); } @GetMapping("/list") @ApiOperation("获得定时任务列表") @ApiImplicitParam(name = "ids", value = "编号列表", required = true, dataTypeClass = List.class) @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobList(@RequestParam("ids") Collection ids) { - List list = jobService.getJobList(ids); - return success(InfJobConvert.INSTANCE.convertList(list)); + public CommonResult> getJobList(@RequestParam("ids") Collection ids) { + List list = jobService.getJobList(ids); + return success(JobConvert.INSTANCE.convertList(list)); } @GetMapping("/page") @ApiOperation("获得定时任务分页") @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobPage(@Valid InfJobPageReqVO pageVO) { - PageResult pageResult = jobService.getJobPage(pageVO); - return success(InfJobConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getJobPage(@Valid JobPageReqVO pageVO) { + PageResult pageResult = jobService.getJobPage(pageVO); + return success(JobConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出定时任务 Excel") @PreAuthorize("@ss.hasPermission('infra:job:export')") @OperateLog(type = EXPORT) - public void exportJobExcel(@Valid InfJobExportReqVO exportReqVO, + public void exportJobExcel(@Valid JobExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = jobService.getJobList(exportReqVO); + List list = jobService.getJobList(exportReqVO); // 导出 Excel - List datas = InfJobConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "定时任务.xls", "数据", InfJobExcelVO.class, datas); + List datas = JobConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "定时任务.xls", "数据", JobExcelVO.class, datas); } @GetMapping("/get_next_times") @@ -137,7 +135,7 @@ public class InfJobController { @PreAuthorize("@ss.hasPermission('infra:job:query')") public CommonResult> getJobNextTimes(@RequestParam("id") Long id, @RequestParam(value = "count", required = false, defaultValue = "5") Integer count) { - InfJobDO job = jobService.getJob(id); + JobDO job = jobService.getJob(id); if (job == null) { return success(Collections.emptyList()); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobLogController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobLogController.java similarity index 64% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobLogController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobLogController.java index eb1211f324..40de986cf9 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/InfJobLogController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobLogController.java @@ -4,13 +4,13 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExcelVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogRespVO; -import cn.iocoder.yudao.module.infra.convert.job.InfJobLogConvert; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.yudao.module.infra.service.job.InfJobLogService; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogRespVO; +import cn.iocoder.yudao.module.infra.convert.job.JobLogConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; +import cn.iocoder.yudao.module.infra.service.job.JobLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -31,51 +31,51 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "定时任务日志") +@Api(tags = "管理后台 - 定时任务日志") @RestController @RequestMapping("/infra/job-log") @Validated -public class InfJobLogController { +public class JobLogController { @Resource - private InfJobLogService jobLogService; + private JobLogService jobLogService; @GetMapping("/get") @ApiOperation("获得定时任务日志") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult getJobLog(@RequestParam("id") Long id) { - InfJobLogDO jobLog = jobLogService.getJobLog(id); - return success(InfJobLogConvert.INSTANCE.convert(jobLog)); + public CommonResult getJobLog(@RequestParam("id") Long id) { + JobLogDO jobLog = jobLogService.getJobLog(id); + return success(JobLogConvert.INSTANCE.convert(jobLog)); } @GetMapping("/list") @ApiOperation("获得定时任务日志列表") @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobLogList(@RequestParam("ids") Collection ids) { - List list = jobLogService.getJobLogList(ids); - return success(InfJobLogConvert.INSTANCE.convertList(list)); + public CommonResult> getJobLogList(@RequestParam("ids") Collection ids) { + List list = jobLogService.getJobLogList(ids); + return success(JobLogConvert.INSTANCE.convertList(list)); } @GetMapping("/page") @ApiOperation("获得定时任务日志分页") @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobLogPage(@Valid InfJobLogPageReqVO pageVO) { - PageResult pageResult = jobLogService.getJobLogPage(pageVO); - return success(InfJobLogConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getJobLogPage(@Valid JobLogPageReqVO pageVO) { + PageResult pageResult = jobLogService.getJobLogPage(pageVO); + return success(JobLogConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出定时任务日志 Excel") @PreAuthorize("@ss.hasPermission('infra:job:export')") @OperateLog(type = EXPORT) - public void exportJobLogExcel(@Valid InfJobLogExportReqVO exportReqVO, + public void exportJobLogExcel(@Valid JobLogExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = jobLogService.getJobLogList(exportReqVO); + List list = jobLogService.getJobLogList(exportReqVO); // 导出 Excel - List datas = InfJobLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "任务日志.xls", "数据", InfJobLogExcelVO.class, datas); + List datas = JobLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "任务日志.xls", "数据", JobLogExcelVO.class, datas); } } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobBaseVO.java similarity index 97% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobBaseVO.java index b0e0ead2bd..db3fcac1d9 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobBaseVO.java @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class InfJobBaseVO { +public class JobBaseVO { @ApiModelProperty(value = "任务名称", required = true, example = "测试任务") @NotNull(message = "任务名称不能为空") diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobCreateReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobCreateReqVO.java similarity index 83% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobCreateReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobCreateReqVO.java index 5548c257c9..0e9f457410 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobCreateReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobCreateReqVO.java @@ -8,11 +8,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("定时任务创建 Request VO") +@ApiModel("管理后台 - 定时任务创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfJobCreateReqVO extends InfJobBaseVO { +public class JobCreateReqVO extends JobBaseVO { @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") @NotNull(message = "处理器的名字不能为空") diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExcelVO.java similarity index 97% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExcelVO.java index bffaaba232..6b5a6a0b17 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExcelVO.java @@ -14,7 +14,7 @@ import java.util.Date; * @author 芋道源码 */ @Data -public class InfJobExcelVO { +public class JobExcelVO { @ExcelProperty("任务编号") private Long id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExportReqVO.java similarity index 58% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExportReqVO.java index f30839f856..1155311d13 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExportReqVO.java @@ -4,17 +4,17 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel(value = "定时任务 Excel 导出 Request VO", description = "参数和 InfJobPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 定时任务 Excel 导出 Request VO", description = "参数和 InfJobPageReqVO 是一致的") @Data -public class InfJobExportReqVO { +public class JobExportReqVO { @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") private String name; - @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 InfJobStatusEnum 枚举") + @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 JobStatusEnum 枚举") private Integer status; - @ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配") + @ApiModelProperty(value = "处理器的名字", example = "UserSessionTimeoutJob", notes = "模糊匹配") private String handlerName; } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobPageReqVO.java similarity index 88% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobPageReqVO.java index edfc425a51..0d8dd53e3e 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobPageReqVO.java @@ -7,11 +7,11 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -@ApiModel("定时任务分页 Request VO") +@ApiModel("管理后台 - 定时任务分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfJobPageReqVO extends PageParam { +public class JobPageReqVO extends PageParam { @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") private String name; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobRespVO.java similarity index 90% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobRespVO.java index 0b59518f3c..5861342783 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobRespVO.java @@ -9,11 +9,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; import java.util.Date; -@ApiModel("定时任务 Response VO") +@ApiModel("管理后台 - 定时任务 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfJobRespVO extends InfJobBaseVO { +public class JobRespVO extends JobBaseVO { @ApiModelProperty(value = "任务编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobUpdateReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.java similarity index 82% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobUpdateReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.java index 1722bbf316..f26cd226ca 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/InfJobUpdateReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.java @@ -8,11 +8,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("定时任务更新 Request VO") +@ApiModel("管理后台 - 定时任务更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfJobUpdateReqVO extends InfJobBaseVO { +public class JobUpdateReqVO extends JobBaseVO { @ApiModelProperty(value = "任务编号", required = true, example = "1024") @NotNull(message = "任务编号不能为空") diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java similarity index 98% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java index 78a33107ee..496969d73e 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java @@ -14,7 +14,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class InfJobLogBaseVO { +public class JobLogBaseVO { @ApiModelProperty(value = "任务编号", required = true, example = "1024") @NotNull(message = "任务编号不能为空") diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExcelVO.java similarity index 97% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExcelVO.java index 7c10bdc98c..25eed2a3f2 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExcelVO.java @@ -14,7 +14,7 @@ import java.util.Date; * @author 芋艿 */ @Data -public class InfJobLogExcelVO { +public class JobLogExcelVO { @ExcelProperty("日志编号") private Long id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java similarity index 85% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java index 432b2d6da3..32aa9619bc 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "定时任务 Excel 导出 Request VO", description = "参数和 InfJobLogPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 定时任务 Excel 导出 Request VO", description = "参数和 InfJobLogPageReqVO 是一致的") @Data -public class InfJobLogExportReqVO { +public class JobLogExportReqVO { @ApiModelProperty(value = "任务编号", example = "10") private Long jobId; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java similarity index 91% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java index da3d5e3a61..f17f358868 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("定时任务日志分页 Request VO") +@ApiModel("管理后台 - 定时任务日志分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfJobLogPageReqVO extends PageParam { +public class JobLogPageReqVO extends PageParam { @ApiModelProperty(value = "任务编号", example = "10") private Long jobId; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogRespVO.java similarity index 83% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogRespVO.java index fa0e959d8b..c806a209af 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/InfJobLogRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogRespVO.java @@ -8,11 +8,11 @@ import lombok.ToString; import java.util.Date; -@ApiModel("定时任务日志 Response VO") +@ApiModel("管理后台 - 定时任务日志 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfJobLogRespVO extends InfJobLogBaseVO { +public class JobLogRespVO extends JobLogBaseVO { @ApiModelProperty(value = "日志编号", required = true, example = "1024") private Long id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiAccessLogController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/ApiAccessLogController.java similarity index 62% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiAccessLogController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/ApiAccessLogController.java index 1c3ef1a069..5046ea5af6 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiAccessLogController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/ApiAccessLogController.java @@ -1,16 +1,16 @@ package cn.iocoder.yudao.module.infra.controller.admin.logger; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogRespVO; -import cn.iocoder.yudao.module.infra.convert.logger.InfApiAccessLogConvert; -import cn.iocoder.yudao.module.infra.service.logger.InfApiAccessLogService; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogRespVO; +import cn.iocoder.yudao.module.infra.convert.logger.ApiAccessLogConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import cn.iocoder.yudao.module.infra.service.logger.ApiAccessLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; @@ -28,33 +28,33 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "API 访问日志") +@Api(tags = "管理后台 - API 访问日志") @RestController @RequestMapping("/infra/api-access-log") @Validated -public class InfApiAccessLogController { +public class ApiAccessLogController { @Resource - private InfApiAccessLogService apiAccessLogService; + private ApiAccessLogService apiAccessLogService; @GetMapping("/page") @ApiOperation("获得API 访问日志分页") @PreAuthorize("@ss.hasPermission('infra:api-access-log:query')") - public CommonResult> getApiAccessLogPage(@Valid InfApiAccessLogPageReqVO pageVO) { - PageResult pageResult = apiAccessLogService.getApiAccessLogPage(pageVO); - return success(InfApiAccessLogConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getApiAccessLogPage(@Valid ApiAccessLogPageReqVO pageVO) { + PageResult pageResult = apiAccessLogService.getApiAccessLogPage(pageVO); + return success(ApiAccessLogConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出API 访问日志 Excel") @PreAuthorize("@ss.hasPermission('infra:api-access-log:export')") @OperateLog(type = EXPORT) - public void exportApiAccessLogExcel(@Valid InfApiAccessLogExportReqVO exportReqVO, + public void exportApiAccessLogExcel(@Valid ApiAccessLogExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = apiAccessLogService.getApiAccessLogList(exportReqVO); + List list = apiAccessLogService.getApiAccessLogList(exportReqVO); // 导出 Excel - List datas = InfApiAccessLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "API 访问日志.xls", "数据", InfApiAccessLogExcelVO.class, datas); + List datas = ApiAccessLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "API 访问日志.xls", "数据", ApiAccessLogExcelVO.class, datas); } } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiErrorLogController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/ApiErrorLogController.java similarity index 70% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiErrorLogController.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/ApiErrorLogController.java index db46bb2538..d592836b2e 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/InfApiErrorLogController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/ApiErrorLogController.java @@ -1,16 +1,16 @@ package cn.iocoder.yudao.module.infra.controller.admin.logger; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExcelVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogRespVO; -import cn.iocoder.yudao.module.infra.convert.logger.InfApiErrorLogConvert; -import cn.iocoder.yudao.module.infra.service.logger.InfApiErrorLogService; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogRespVO; +import cn.iocoder.yudao.module.infra.convert.logger.ApiErrorLogConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import cn.iocoder.yudao.module.infra.service.logger.ApiErrorLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -29,14 +29,14 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -@Api(tags = "API 错误日志") +@Api(tags = "管理后台 - API 错误日志") @RestController @RequestMapping("/infra/api-error-log") @Validated -public class InfApiErrorLogController { +public class ApiErrorLogController { @Resource - private InfApiErrorLogService apiErrorLogService; + private ApiErrorLogService apiErrorLogService; @PutMapping("/update-status") @ApiOperation("更新 API 错误日志的状态") @@ -54,21 +54,21 @@ public class InfApiErrorLogController { @GetMapping("/page") @ApiOperation("获得 API 错误日志分页") @PreAuthorize("@ss.hasPermission('infra:api-error-log:query')") - public CommonResult> getApiErrorLogPage(@Valid InfApiErrorLogPageReqVO pageVO) { - PageResult pageResult = apiErrorLogService.getApiErrorLogPage(pageVO); - return success(InfApiErrorLogConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getApiErrorLogPage(@Valid ApiErrorLogPageReqVO pageVO) { + PageResult pageResult = apiErrorLogService.getApiErrorLogPage(pageVO); + return success(ApiErrorLogConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出 API 错误日志 Excel") @PreAuthorize("@ss.hasPermission('infra:api-error-log:export')") @OperateLog(type = EXPORT) - public void exportApiErrorLogExcel(@Valid InfApiErrorLogExportReqVO exportReqVO, + public void exportApiErrorLogExcel(@Valid ApiErrorLogExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = apiErrorLogService.getApiErrorLogList(exportReqVO); + List list = apiErrorLogService.getApiErrorLogList(exportReqVO); // 导出 Excel - List datas = InfApiErrorLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "API 错误日志.xls", "数据", InfApiErrorLogExcelVO.class, datas); + List datas = ApiErrorLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "API 错误日志.xls", "数据", ApiErrorLogExcelVO.class, datas); } } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java similarity index 98% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java index 6e44f4eb09..619dea65a5 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java @@ -14,7 +14,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class InfApiAccessLogBaseVO { +public class ApiAccessLogBaseVO { @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002") @NotNull(message = "链路追踪编号不能为空") diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java similarity index 97% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java index 1d4e8b5306..5c1995c6a1 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java @@ -14,7 +14,7 @@ import java.util.Date; * @author 芋道源码 */ @Data -public class InfApiAccessLogExcelVO { +public class ApiAccessLogExcelVO { @ExcelProperty("日志主键") private Long id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java similarity index 88% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java index 37ddddc010..8c6ac4879c 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "API 访问日志 Excel 导出 Request VO", description = "参数和 InfApiAccessLogPageReqVO 是一致的") +@ApiModel(value = "管理后台 - API 访问日志 Excel 导出 Request VO", description = "参数和 InfApiAccessLogPageReqVO 是一致的") @Data -public class InfApiAccessLogExportReqVO { +public class ApiAccessLogExportReqVO { @ApiModelProperty(value = "用户编号", example = "666") private Long userId; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java similarity index 92% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java index 385dab1f0a..d318bfa920 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("API 访问日志分页 Request VO") +@ApiModel("管理后台 - API 访问日志分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfApiAccessLogPageReqVO extends PageParam { +public class ApiAccessLogPageReqVO extends PageParam { @ApiModelProperty(value = "用户编号", example = "666") private Long userId; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java similarity index 82% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java index c6b74d48d9..0458affb03 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java @@ -8,11 +8,11 @@ import lombok.ToString; import java.util.Date; -@ApiModel("API 访问日志 Response VO") +@ApiModel("管理后台 - API 访问日志 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfApiAccessLogRespVO extends InfApiAccessLogBaseVO { +public class ApiAccessLogRespVO extends ApiAccessLogBaseVO { @ApiModelProperty(value = "日志主键", required = true, example = "1024") private Long id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.java similarity index 99% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.java index d5d6d3ce1d..08fbdace87 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.java @@ -14,7 +14,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class InfApiErrorLogBaseVO { +public class ApiErrorLogBaseVO { @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002") @NotNull(message = "链路追踪编号不能为空") diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.java similarity index 94% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.java index 06b1da33b4..7e1e2ef0c4 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; -import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -15,7 +14,7 @@ import java.util.Date; * @author 芋道源码 */ @Data -public class InfApiErrorLogExcelVO { +public class ApiErrorLogExcelVO { @ExcelProperty("编号") private Integer id; @@ -27,7 +26,7 @@ public class InfApiErrorLogExcelVO { private Integer userId; @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(DictTypeConstants.USER_TYPE) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.USER_TYPE) private Integer userType; @ExcelProperty("应用名") diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java similarity index 87% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java index dcb00a69f6..dd66ff6f31 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "API 错误日志 Excel 导出 Request VO", description = "参数和 InfApiErrorLogPageReqVO 是一致的") +@ApiModel(value = "管理后台 - API 错误日志 Excel 导出 Request VO", description = "参数和 InfApiErrorLogPageReqVO 是一致的") @Data -public class InfApiErrorLogExportReqVO { +public class ApiErrorLogExportReqVO { @ApiModelProperty(value = "用户编号", example = "666") private Long userId; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java similarity index 92% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java index 964fee2c81..e9a36af965 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("API 错误日志分页 Request VO") +@ApiModel("管理后台 - API 错误日志分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfApiErrorLogPageReqVO extends PageParam { +public class ApiErrorLogPageReqVO extends PageParam { @ApiModelProperty(value = "用户编号", example = "666") private Long userId; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java similarity index 86% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java index ad70bb7726..0f0c2724dd 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/InfApiErrorLogRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java @@ -8,11 +8,11 @@ import lombok.ToString; import java.util.Date; -@ApiModel("API 错误日志 Response VO") +@ApiModel("管理后台 - API 错误日志 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfApiErrorLogRespVO extends InfApiErrorLogBaseVO { +public class ApiErrorLogRespVO extends ApiErrorLogBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1024") private Integer id; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http index 1c474e93f3..0310dea58f 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http @@ -1,7 +1,9 @@ ### 请求 /infra/redis/get-monitor-info 接口 => 成功 GET {{baseUrl}}/infra/redis/get-monitor-info Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} ### 请求 /infra/redis/get-key-list 接口 => 成功 GET {{baseUrl}}/infra/redis/get-key-list Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.java index b7e499bd60..303e671848 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.redis; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; import cn.iocoder.yudao.framework.redis.core.RedisKeyRegistry; -import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.InfRedisKeyRespVO; -import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.InfRedisMonitorRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisKeyRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; import cn.iocoder.yudao.module.infra.convert.redis.RedisConvert; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -22,7 +22,7 @@ import java.util.Properties; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "Redis 监控") +@Api(tags = "管理后台 - Redis 监控") @RestController @RequestMapping("/infra/redis") public class RedisController { @@ -33,7 +33,7 @@ public class RedisController { @GetMapping("/get-monitor-info") @ApiOperation("获得 Redis 监控信息") @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") - public CommonResult getRedisMonitorInfo() { + public CommonResult getRedisMonitorInfo() { // 获得 Redis 统计信息 Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); @@ -47,7 +47,7 @@ public class RedisController { @GetMapping("/get-key-list") @ApiOperation("获得 Redis Key 列表") @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") - public CommonResult> getKeyList() { + public CommonResult> getKeyList() { List keyDefines = RedisKeyRegistry.list(); return success(RedisConvert.INSTANCE.convertList(keyDefines)); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisKeyRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisKeyRespVO.java similarity index 90% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisKeyRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisKeyRespVO.java index 4f35768a43..6fb71fe9a4 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisKeyRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisKeyRespVO.java @@ -9,11 +9,11 @@ import lombok.Data; import java.time.Duration; -@ApiModel("Redis Key 信息 Response VO") +@ApiModel("管理后台 - Redis Key 信息 Response VO") @Data @Builder @AllArgsConstructor -public class InfRedisKeyRespVO { +public class RedisKeyRespVO { @ApiModelProperty(value = "login_user:%s", required = true, example = "String") private String keyTemplate; @@ -22,7 +22,7 @@ public class InfRedisKeyRespVO { private RedisKeyDefine.KeyTypeEnum keyType; @ApiModelProperty(value = "Value 类型", required = true, example = "java.lang.String") - private Class valueType; + private Class valueType; @ApiModelProperty(value = "超时类型", required = true, example = "1") private RedisKeyDefine.TimeoutTypeEnum timeoutType; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisMonitorRespVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java similarity index 92% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisMonitorRespVO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java index bee54013c2..703a697dc3 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/InfRedisMonitorRespVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java @@ -9,11 +9,11 @@ import lombok.Data; import java.util.List; import java.util.Properties; -@ApiModel("Redis 监控信息 Response VO") +@ApiModel("管理后台 - Redis 监控信息 Response VO") @Data @Builder @AllArgsConstructor -public class InfRedisMonitorRespVO { +public class RedisMonitorRespVO { @ApiModelProperty(value = "Redis info 指令结果", required = true, notes = "具体字段,查看 Redis 文档") private Properties info; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/InfConfigConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/ConfigConvert.java similarity index 53% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/InfConfigConvert.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/ConfigConvert.java index 4dbd0dc534..8e16af1a34 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/InfConfigConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/config/ConfigConvert.java @@ -1,29 +1,29 @@ package cn.iocoder.yudao.module.infra.convert.config; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExcelVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigRespVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.List; @Mapper -public interface InfConfigConvert { +public interface ConfigConvert { - InfConfigConvert INSTANCE = Mappers.getMapper(InfConfigConvert.class); + ConfigConvert INSTANCE = Mappers.getMapper(ConfigConvert.class); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - ConfigRespVO convert(InfConfigDO bean); + ConfigRespVO convert(ConfigDO bean); - InfConfigDO convert(ConfigCreateReqVO bean); + ConfigDO convert(ConfigCreateReqVO bean); - InfConfigDO convert(ConfigUpdateReqVO bean); + ConfigDO convert(ConfigUpdateReqVO bean); - List convertList(List list); + List convertList(List list); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/FileConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/FileConvert.java new file mode 100644 index 0000000000..affeddba4b --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/FileConvert.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.infra.convert.file; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FileRespVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface FileConvert { + + FileConvert INSTANCE = Mappers.getMapper(FileConvert.class); + + FileRespVO convert(FileDO bean); + + PageResult convertPage(PageResult page); + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/InfFileConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/InfFileConvert.java deleted file mode 100644 index cbc2298b36..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/file/InfFileConvert.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.yudao.module.infra.convert.file; - -import cn.iocoder.yudao.coreservice.modules.infra.controller.file.vo.InfFileRespVO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface InfFileConvert { - - InfFileConvert INSTANCE = Mappers.getMapper(InfFileConvert.class); - - InfFileRespVO convert(InfFileDO bean); - - PageResult convertPage(PageResult page); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobConvert.java deleted file mode 100644 index 5ad7680c2a..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.infra.convert.job; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExcelVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobRespVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 定时任务 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface InfJobConvert { - - InfJobConvert INSTANCE = Mappers.getMapper(InfJobConvert.class); - - InfJobDO convert(InfJobCreateReqVO bean); - - InfJobDO convert(InfJobUpdateReqVO bean); - - InfJobRespVO convert(InfJobDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobLogConvert.java deleted file mode 100644 index 5134e6cd48..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/InfJobLogConvert.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.infra.convert.job; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExcelVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogRespVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 定时任务日志 Convert - * - * @author 芋艿 - */ -@Mapper -public interface InfJobLogConvert { - - InfJobLogConvert INSTANCE = Mappers.getMapper(InfJobLogConvert.class); - - InfJobLogRespVO convert(InfJobLogDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/JobConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/JobConvert.java new file mode 100644 index 0000000000..2c7aa02973 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/JobConvert.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.infra.convert.job; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 定时任务 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface JobConvert { + + JobConvert INSTANCE = Mappers.getMapper(JobConvert.class); + + JobDO convert(JobCreateReqVO bean); + + JobDO convert(JobUpdateReqVO bean); + + JobRespVO convert(JobDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/JobLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/JobLogConvert.java new file mode 100644 index 0000000000..3f32c526d6 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/job/JobLogConvert.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.infra.convert.job; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogRespVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 定时任务日志 Convert + * + * @author 芋艿 + */ +@Mapper +public interface JobLogConvert { + + JobLogConvert INSTANCE = Mappers.getMapper(JobLogConvert.class); + + JobLogRespVO convert(JobLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/ApiAccessLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/ApiAccessLogConvert.java new file mode 100644 index 0000000000..7162d4d9ac --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/ApiAccessLogConvert.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.infra.convert.logger; + +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogRespVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * API 访问日志 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface ApiAccessLogConvert { + + ApiAccessLogConvert INSTANCE = Mappers.getMapper(ApiAccessLogConvert.class); + + ApiAccessLogRespVO convert(ApiAccessLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ApiAccessLogDO convert(ApiAccessLogCreateReqDTO bean); + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/ApiErrorLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/ApiErrorLogConvert.java new file mode 100644 index 0000000000..8eef7463ab --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/ApiErrorLogConvert.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.infra.convert.logger; + +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDTO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExcelVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogRespVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * API 错误日志 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface ApiErrorLogConvert { + + ApiErrorLogConvert INSTANCE = Mappers.getMapper(ApiErrorLogConvert.class); + + ApiErrorLogRespVO convert(ApiErrorLogDO bean); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ApiErrorLogDO convert(ApiErrorLogCreateReqDTO bean); + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogConvert.java deleted file mode 100644 index a1ca188ae2..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogConvert.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.infra.convert.logger; - -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogRespVO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * API 访问日志 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface InfApiAccessLogConvert { - - InfApiAccessLogConvert INSTANCE = Mappers.getMapper(InfApiAccessLogConvert.class); - - InfApiAccessLogRespVO convert(InfApiAccessLogDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogCoreConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogCoreConvert.java deleted file mode 100644 index f8a331a335..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiAccessLogCoreConvert.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.module.infra.convert.logger; - -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface InfApiAccessLogCoreConvert { - - InfApiAccessLogCoreConvert INSTANCE = Mappers.getMapper(InfApiAccessLogCoreConvert.class); - - InfApiAccessLogDO convert(ApiAccessLogCreateReqDTO bean); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogConvert.java deleted file mode 100644 index 1b8d33b6db..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.infra.convert.logger; - -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExcelVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogRespVO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * API 错误日志 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface InfApiErrorLogConvert { - - InfApiErrorLogConvert INSTANCE = Mappers.getMapper(InfApiErrorLogConvert.class); - - InfApiErrorLogRespVO convert(InfApiErrorLogDO bean); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogCoreConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogCoreConvert.java deleted file mode 100644 index cf8225f0a3..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/logger/InfApiErrorLogCoreConvert.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.module.infra.convert.logger; - -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface InfApiErrorLogCoreConvert { - - InfApiErrorLogCoreConvert INSTANCE = Mappers.getMapper(InfApiErrorLogCoreConvert.class); - - InfApiErrorLogDO convert(ApiErrorLogCreateReqDTO bean); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/redis/RedisConvert.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/redis/RedisConvert.java index f5030a0596..e1c9311849 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/redis/RedisConvert.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/convert/redis/RedisConvert.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.infra.convert.redis; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.InfRedisKeyRespVO; -import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.InfRedisMonitorRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisKeyRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -16,11 +16,11 @@ public interface RedisConvert { RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class); - default InfRedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { - InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize) + default RedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { + RedisMonitorRespVO respVO = RedisMonitorRespVO.builder().info(info).dbSize(dbSize) .commandStats(new ArrayList<>(commandStats.size())).build(); commandStats.forEach((key, value) -> { - respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder() + respVO.getCommandStats().add(RedisMonitorRespVO.CommandStat.builder() .command(StrUtil.subAfter((String) key, "cmdstat_", false)) .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) .usec(Long.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) @@ -29,6 +29,6 @@ public interface RedisConvert { return respVO; } - List convertList(List list); + List convertList(List list); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/InfConfigDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/ConfigDO.java similarity index 94% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/InfConfigDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/ConfigDO.java index 4f5107e61e..dbcdfed56d 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/InfConfigDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/ConfigDO.java @@ -13,11 +13,11 @@ import lombok.ToString; * * @author 芋道源码 */ -@TableName("inf_config") +@TableName("infra_config") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InfConfigDO extends BaseDO { +public class ConfigDO extends BaseDO { /** * 参数主键 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/InfFileDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDO.java similarity index 86% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/InfFileDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDO.java index 98aab4252a..47eb2403e6 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/InfFileDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDO.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.infra.dal.dataobject.file; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; @@ -16,13 +15,13 @@ import java.io.InputStream; * @author 芋道源码 */ @Data -@TableName("inf_file") +@TableName("infra_file") @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class InfFileDO extends TenantBaseDO { +public class FileDO extends TenantBaseDO { /** * 文件路径 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/JobDO.java similarity index 89% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/JobDO.java index 43bc2a0b7b..c419b1fdbb 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/JobDO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.infra.dal.dataobject.job; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.infra.enums.job.InfJobStatusEnum; +import cn.iocoder.yudao.module.infra.enums.job.JobStatusEnum; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; @@ -11,14 +11,14 @@ import lombok.*; * * @author 芋道源码 */ -@TableName("inf_job") +@TableName("infra_job") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class InfJobDO extends BaseDO { +public class JobDO extends BaseDO { /** * 任务编号 @@ -32,7 +32,7 @@ public class InfJobDO extends BaseDO { /** * 任务状态 * - * 枚举 {@link InfJobStatusEnum} + * 枚举 {@link JobStatusEnum} */ private Integer status; /** diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobLogDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/JobLogDO.java similarity index 81% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobLogDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/JobLogDO.java index ecbe209dd0..fa79b9b64d 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/InfJobLogDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/job/JobLogDO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.dal.dataobject.job; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; -import cn.iocoder.yudao.module.infra.enums.job.InfJobLogStatusEnum; +import cn.iocoder.yudao.module.infra.enums.job.JobLogStatusEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; @@ -13,14 +13,14 @@ import java.util.Date; * * @author 芋道源码 */ -@TableName("inf_job_log") +@TableName("infra_job_log") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class InfJobLogDO extends BaseDO { +public class JobLogDO extends BaseDO { /** * 日志编号 @@ -29,19 +29,19 @@ public class InfJobLogDO extends BaseDO { /** * 任务编号 * - * 关联 {@link InfJobDO#getId()} + * 关联 {@link JobDO#getId()} */ private Long jobId; /** * 处理器的名字 * - * 冗余字段 {@link InfJobDO#getHandlerName()} + * 冗余字段 {@link JobDO#getHandlerName()} */ private String handlerName; /** * 处理器的参数 * - * 冗余字段 {@link InfJobDO#getHandlerParam()} + * 冗余字段 {@link JobDO#getHandlerParam()} */ private String handlerParam; /** @@ -66,7 +66,7 @@ public class InfJobLogDO extends BaseDO { /** * 状态 * - * 枚举 {@link InfJobLogStatusEnum} + * 枚举 {@link JobLogStatusEnum} */ private Integer status; /** diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiAccessLogDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiAccessLogDO.java similarity index 96% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiAccessLogDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiAccessLogDO.java index eea09b6bd8..2ad8a326da 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiAccessLogDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiAccessLogDO.java @@ -14,14 +14,14 @@ import java.util.Date; * * @author 芋道源码 */ -@TableName("inf_api_access_log") +@TableName("infra_api_access_log") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class InfApiAccessLogDO extends TenantBaseDO { +public class ApiAccessLogDO extends TenantBaseDO { /** * 编号 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiErrorLogDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiErrorLogDO.java similarity index 94% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiErrorLogDO.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiErrorLogDO.java index bcf394cd64..fa5b162a59 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/InfApiErrorLogDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiErrorLogDO.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.infra.dal.dataobject.logger; -import cn.iocoder.yudao.coreservice.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; import com.baomidou.mybatisplus.annotation.TableId; @@ -14,14 +13,14 @@ import java.util.Date; * * @author 芋道源码 */ -@TableName("inf_api_error_log") +@TableName("infra_api_error_log") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class InfApiErrorLogDO extends TenantBaseDO { +public class ApiErrorLogDO extends TenantBaseDO { /** * 编号 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigCoreDAOImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigCoreDAOImpl.java similarity index 88% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigCoreDAOImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigCoreDAOImpl.java index a4c0377e43..fe531b4023 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigCoreDAOImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigCoreDAOImpl.java @@ -16,11 +16,11 @@ import java.util.List; * * @author 芋道源码 */ -public class InfConfigCoreDAOImpl implements ConfigFrameworkDAO { +public class ConfigCoreDAOImpl implements ConfigFrameworkDAO { private final JdbcTemplate jdbcTemplate; - public InfConfigCoreDAOImpl(String jdbcUrl, String username, String password) { + public ConfigCoreDAOImpl(String jdbcUrl, String username, String password) { DataSource dataSource = new DriverManagerDataSource(jdbcUrl, username, password); this.jdbcTemplate = new JdbcTemplate(dataSource); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigMapper.java similarity index 67% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigMapper.java index f3d2e29703..aad99ccba6 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/InfConfigMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigMapper.java @@ -1,33 +1,33 @@ package cn.iocoder.yudao.module.infra.dal.mysql.config; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface InfConfigMapper extends BaseMapperX { +public interface ConfigMapper extends BaseMapperX { - default InfConfigDO selectByKey(String key) { - return selectOne(new QueryWrapper().eq("`key`", key)); + default ConfigDO selectByKey(String key) { + return selectOne(new QueryWrapper().eq("`key`", key)); } - default PageResult selectPage(ConfigPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(ConfigPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) .likeIfPresent("`key`", reqVO.getKey()) .eqIfPresent("`type`", reqVO.getType()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); } - default List selectList(ConfigExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(ConfigExportReqVO reqVO) { + return selectList(new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) .likeIfPresent("`key`", reqVO.getKey()) .eqIfPresent("`type`", reqVO.getType()) diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileMapper.java new file mode 100644 index 0000000000..06e887dde5 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileMapper.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.infra.dal.mysql.file; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FilePageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文件操作 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface FileMapper extends BaseMapperX { + + default PageResult selectPage(FilePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("id", reqVO.getId()) + .likeIfPresent("type", reqVO.getType()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc("create_time")); + } + + default Integer selectCountById(String id) { + return selectCount(FileDO::getId, id); + } + + /** + * 基于 Path 获取文件 + * 实际上,是基于 ID 查询 + * 由于前端使用 的方式获取图片,所以需要忽略租户的查询 + * + * @param path 路径 + * @return 文件 + */ + @InterceptorIgnore(tenantLine = "true") + default FileDO selectByPath(String path) { + return selectById(path); + } + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileCoreMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileCoreMapper.java deleted file mode 100644 index 065ec0d4f1..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileCoreMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.infra.dal.mysql.file; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface InfFileCoreMapper extends BaseMapperX { - - default Integer selectCountById(String id) { - return selectCount(InfFileDO::getId, id); - } - - /** - * 基于 Path 获取文件 - * 实际上,是基于 ID 查询 - * 由于前端使用 的方式获取图片,所以需要忽略租户的查询 - * - * @param path 路径 - * @return 文件 - */ - @InterceptorIgnore(tenantLine = "true") - default InfFileDO selectByPath(String path) { - return selectById(path); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileMapper.java deleted file mode 100644 index c987a8e309..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/InfFileMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.yudao.module.infra.dal.mysql.file; - -import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import org.apache.ibatis.annotations.Mapper; - -/** - * admin 文件操作 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface InfFileMapper extends BaseMapperX { - default PageResult selectPage(InfFilePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("id", reqVO.getId()) - .likeIfPresent("type", reqVO.getType()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc("create_time")); - } -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobMapper.java deleted file mode 100644 index 2f2ac91c11..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.module.infra.dal.mysql.job; - -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobPageReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 定时任务 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface InfJobMapper extends BaseMapperX { - - default InfJobDO selectByHandlerName(String handlerName) { - return selectOne(InfJobDO::getHandlerName, handlerName); - } - - default PageResult selectPage(InfJobPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(InfJobDO::getName, reqVO.getName()) - .eqIfPresent(InfJobDO::getStatus, reqVO.getStatus()) - .likeIfPresent(InfJobDO::getHandlerName, reqVO.getHandlerName()) - ); - } - - default List selectList(InfJobExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(InfJobDO::getName, reqVO.getName()) - .eqIfPresent(InfJobDO::getStatus, reqVO.getStatus()) - .likeIfPresent(InfJobDO::getHandlerName, reqVO.getHandlerName()) - ); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobLogMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java similarity index 73% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobLogMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java index 8d607c79f0..fe196df359 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/InfJobLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.infra.dal.mysql.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -16,10 +16,10 @@ import java.util.List; * @author 芋道源码 */ @Mapper -public interface InfJobLogMapper extends BaseMapperX { +public interface JobLogMapper extends BaseMapperX { - default PageResult selectPage(InfJobLogPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(JobLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .eqIfPresent("job_id", reqVO.getJobId()) .likeIfPresent("handler_name", reqVO.getHandlerName()) .geIfPresent("begin_time", reqVO.getBeginTime()) @@ -29,8 +29,8 @@ public interface InfJobLogMapper extends BaseMapperX { ); } - default List selectList(InfJobLogExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(JobLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() .eqIfPresent("job_id", reqVO.getJobId()) .likeIfPresent("handler_name", reqVO.getHandlerName()) .geIfPresent("begin_time", reqVO.getBeginTime()) diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobMapper.java new file mode 100644 index 0000000000..883906a013 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobMapper.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.infra.dal.mysql.job; + +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 定时任务 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface JobMapper extends BaseMapperX { + + default JobDO selectByHandlerName(String handlerName) { + return selectOne(JobDO::getHandlerName, handlerName); + } + + default PageResult selectPage(JobPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(JobDO::getName, reqVO.getName()) + .eqIfPresent(JobDO::getStatus, reqVO.getStatus()) + .likeIfPresent(JobDO::getHandlerName, reqVO.getHandlerName()) + ); + } + + default List selectList(JobExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(JobDO::getName, reqVO.getName()) + .eqIfPresent(JobDO::getStatus, reqVO.getStatus()) + .likeIfPresent(JobDO::getHandlerName, reqVO.getHandlerName()) + ); + } + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java similarity index 74% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java index 60e080bea2..8f00fbebc9 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.infra.dal.mysql.logger; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -16,10 +16,10 @@ import java.util.List; * @author 芋道源码 */ @Mapper -public interface InfApiAccessLogMapper extends BaseMapperX { +public interface ApiAccessLogMapper extends BaseMapperX { - default PageResult selectPage(InfApiAccessLogPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(ApiAccessLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .eqIfPresent("user_id", reqVO.getUserId()) .eqIfPresent("user_type", reqVO.getUserType()) .eqIfPresent("application_name", reqVO.getApplicationName()) @@ -31,8 +31,8 @@ public interface InfApiAccessLogMapper extends BaseMapperX { ); } - default List selectList(InfApiAccessLogExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(ApiAccessLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() .eqIfPresent("user_id", reqVO.getUserId()) .eqIfPresent("user_type", reqVO.getUserType()) .eqIfPresent("application_name", reqVO.getApplicationName()) diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java similarity index 73% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogMapper.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java index a9f80b1294..7e4ab62c39 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.infra.dal.mysql.logger; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -16,10 +16,10 @@ import java.util.List; * @author 芋道源码 */ @Mapper -public interface InfApiErrorLogMapper extends BaseMapperX { +public interface ApiErrorLogMapper extends BaseMapperX { - default PageResult selectPage(InfApiErrorLogPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(ApiErrorLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .eqIfPresent("user_id", reqVO.getUserId()) .eqIfPresent("user_type", reqVO.getUserType()) .eqIfPresent("application_name", reqVO.getApplicationName()) @@ -30,8 +30,8 @@ public interface InfApiErrorLogMapper extends BaseMapperX { ); } - default List selectList(InfApiErrorLogExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(ApiErrorLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() .eqIfPresent("user_id", reqVO.getUserId()) .eqIfPresent("user_type", reqVO.getUserType()) .eqIfPresent("application_name", reqVO.getApplicationName()) diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java deleted file mode 100644 index 52945f26b1..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.yudao.module.infra.dal.mysql.logger; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * API 访问日志 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface InfApiAccessLogCoreMapper extends BaseMapperX { -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java deleted file mode 100644 index f7124e9b80..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.yudao.module.infra.dal.mysql.logger; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface InfApiErrorLogCoreMapper extends BaseMapperX { -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/SysErrorCodeConstants.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/SysErrorCodeConstants.java deleted file mode 100644 index d9a41b38f5..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/SysErrorCodeConstants.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.iocoder.yudao.module.infra.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; - -/** - * System 错误码枚举类 - * - * system 系统,使用 1-006-000-000 段 - */ -public interface SysErrorCodeConstants { - - // ========= 文件相关 1006001000================= - ErrorCode FILE_PATH_EXISTS = new ErrorCode(1006001000, "文件路径已存在"); - ErrorCode FILE_NOT_EXISTS = new ErrorCode(1006001002, "文件不存在"); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/InfConfigTypeEnum.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/ConfigTypeEnum.java similarity index 89% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/InfConfigTypeEnum.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/ConfigTypeEnum.java index 242fd7b1c3..15c20152f0 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/InfConfigTypeEnum.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/config/ConfigTypeEnum.java @@ -5,7 +5,7 @@ import lombok.Getter; @Getter @AllArgsConstructor -public enum InfConfigTypeEnum { +public enum ConfigTypeEnum { /** * 系统配置 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobLogStatusEnum.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/JobLogStatusEnum.java similarity index 91% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobLogStatusEnum.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/JobLogStatusEnum.java index 8dee1d3558..95670539e9 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobLogStatusEnum.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/JobLogStatusEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum InfJobLogStatusEnum { +public enum JobLogStatusEnum { RUNNING(0), // 运行中 SUCCESS(1), // 成功 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobStatusEnum.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/JobStatusEnum.java similarity index 90% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobStatusEnum.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/JobStatusEnum.java index 870bde22a6..3d9ec3f755 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/InfJobStatusEnum.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/job/JobStatusEnum.java @@ -3,12 +3,11 @@ package cn.iocoder.yudao.module.infra.enums.job; import com.google.common.collect.Sets; import lombok.AllArgsConstructor; import lombok.Getter; +import org.quartz.impl.jdbcjobstore.Constants; import java.util.Collections; import java.util.Set; -import static org.quartz.impl.jdbcjobstore.Constants.*; - /** * 任务状态的枚举 * @@ -16,7 +15,7 @@ import static org.quartz.impl.jdbcjobstore.Constants.*; */ @Getter @AllArgsConstructor -public enum InfJobStatusEnum { +public enum JobStatusEnum { /** * 初始化中 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java similarity index 90% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java index b047ae1055..b3097534ce 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @AllArgsConstructor @Getter -public enum InfApiErrorLogProcessStatusEnum { +public enum ApiErrorLogProcessStatusEnum { INIT(0, "未处理"), DONE(1, "已处理"), diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileConfiguration.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileConfiguration.java similarity index 81% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileConfiguration.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileConfiguration.java index f2bc7c2ebc..f944daa231 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileConfiguration.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.infra.file.config; +package cn.iocoder.yudao.module.infra.framework.file.config; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileProperties.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileProperties.java similarity index 88% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileProperties.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileProperties.java index 10640751a7..7d76a3baf4 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/config/FileProperties.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileProperties.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.infra.file.config; +package cn.iocoder.yudao.module.infra.framework.file.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/package-info.java similarity index 92% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/package-info.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/package-info.java index 2c2798ee62..ee21b922eb 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/file/package-info.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/package-info.java @@ -13,4 +13,4 @@ * 综合考虑,暂时使用方案 3 的方式,比较适合这样一个 all in one 的项目。 * 随着文件的量级大了之后,还是推荐采用云服务。 */ -package cn.iocoder.yudao.coreservice.modules.infra.framework.file; +package cn.iocoder.yudao.module.infra.framework.file; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/InfConfigRefreshConsumer.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/ConfigRefreshConsumer.java similarity index 61% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/InfConfigRefreshConsumer.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/ConfigRefreshConsumer.java index f68cdb4d70..d13003afbb 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/InfConfigRefreshConsumer.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/consumer/config/ConfigRefreshConsumer.java @@ -2,21 +2,21 @@ package cn.iocoder.yudao.module.infra.mq.consumer.config; import cn.iocoder.yudao.framework.apollo.internals.DBConfigRepository; import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.yudao.module.infra.mq.message.config.InfConfigRefreshMessage; +import cn.iocoder.yudao.module.infra.mq.message.config.ConfigRefreshMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** - * 针对 {@link InfConfigRefreshMessage} 的消费者 + * 针对 {@link ConfigRefreshMessage} 的消费者 * * @author 芋道源码 */ @Component @Slf4j -public class InfConfigRefreshConsumer extends AbstractChannelMessageListener { +public class ConfigRefreshConsumer extends AbstractChannelMessageListener { @Override - public void onMessage(InfConfigRefreshMessage message) { + public void onMessage(ConfigRefreshMessage message) { log.info("[onMessage][收到 Config 刷新消息]"); DBConfigRepository.noticeSync(); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/InfConfigRefreshMessage.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/ConfigRefreshMessage.java similarity index 80% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/InfConfigRefreshMessage.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/ConfigRefreshMessage.java index 36b51db1aa..380a1736b9 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/InfConfigRefreshMessage.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/message/config/ConfigRefreshMessage.java @@ -7,7 +7,7 @@ import lombok.Data; * 配置数据刷新 Message */ @Data -public class InfConfigRefreshMessage extends AbstractChannelMessage { +public class ConfigRefreshMessage extends AbstractChannelMessage { @Override public String getChannel() { diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/InfConfigProducer.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/ConfigProducer.java similarity index 64% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/InfConfigProducer.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/ConfigProducer.java index e77557111c..92d0e34b6e 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/InfConfigProducer.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/mq/producer/config/ConfigProducer.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.infra.mq.producer.config; -import cn.iocoder.yudao.module.infra.mq.message.config.InfConfigRefreshMessage; +import cn.iocoder.yudao.module.infra.mq.message.config.ConfigRefreshMessage; import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; import org.springframework.stereotype.Component; @@ -10,16 +10,16 @@ import javax.annotation.Resource; * Config 配置相关消息的 Producer */ @Component -public class InfConfigProducer { +public class ConfigProducer { @Resource private RedisMQTemplate redisMQTemplate; /** - * 发送 {@link InfConfigRefreshMessage} 消息 + * 发送 {@link ConfigRefreshMessage} 消息 */ public void sendConfigRefreshMessage() { - InfConfigRefreshMessage message = new InfConfigRefreshMessage(); + ConfigRefreshMessage message = new ConfigRefreshMessage(); redisMQTemplate.send(message); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/InfConfigService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java similarity index 80% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/InfConfigService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java index 8d3995e1c5..abd82e54ac 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/InfConfigService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.infra.service.config; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; import javax.validation.Valid; import java.util.List; @@ -15,7 +15,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface InfConfigService { +public interface ConfigService { /** * 创建参数配置 @@ -45,7 +45,7 @@ public interface InfConfigService { * @param id 配置编号 * @return 参数配置 */ - InfConfigDO getConfig(Long id); + ConfigDO getConfig(Long id); /** * 根据参数键,获得参数配置 @@ -53,7 +53,7 @@ public interface InfConfigService { * @param key 配置键 * @return 参数配置 */ - InfConfigDO getConfigByKey(String key); + ConfigDO getConfigByKey(String key); /** * 获得参数配置分页列表 @@ -61,7 +61,7 @@ public interface InfConfigService { * @param reqVO 分页条件 * @return 分页列表 */ - PageResult getConfigPage(@Valid ConfigPageReqVO reqVO); + PageResult getConfigPage(@Valid ConfigPageReqVO reqVO); /** * 获得参数配置列表 @@ -69,7 +69,7 @@ public interface InfConfigService { * @param reqVO 列表 * @return 列表 */ - List getConfigList(@Valid ConfigExportReqVO reqVO); + List getConfigList(@Valid ConfigExportReqVO reqVO); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/impl/InfConfigServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java similarity index 59% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/impl/InfConfigServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java index 1911357604..f6eb43cd5a 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/impl/InfConfigServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java @@ -1,25 +1,23 @@ -package cn.iocoder.yudao.module.infra.service.config.impl; +package cn.iocoder.yudao.module.infra.service.config; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; -import cn.iocoder.yudao.module.infra.convert.config.InfConfigConvert; -import cn.iocoder.yudao.module.infra.dal.mysql.config.InfConfigMapper; -import cn.iocoder.yudao.module.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.yudao.module.infra.mq.producer.config.InfConfigProducer; -import cn.iocoder.yudao.module.infra.service.config.InfConfigService; -import cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants; +import cn.iocoder.yudao.module.infra.convert.config.ConfigConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; +import cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigMapper; +import cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants; +import cn.iocoder.yudao.module.infra.enums.config.ConfigTypeEnum; +import cn.iocoder.yudao.module.infra.mq.producer.config.ConfigProducer; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; - import java.util.List; /** @@ -28,21 +26,21 @@ import java.util.List; @Service @Slf4j @Validated -public class InfConfigServiceImpl implements InfConfigService { +public class ConfigServiceImpl implements ConfigService { @Resource - private InfConfigMapper configMapper; + private ConfigMapper configMapper; @Resource - private InfConfigProducer configProducer; + private ConfigProducer configProducer; @Override public Long createConfig(ConfigCreateReqVO reqVO) { // 校验正确性 checkCreateOrUpdate(null, reqVO.getKey()); // 插入参数配置 - InfConfigDO config = InfConfigConvert.INSTANCE.convert(reqVO); - config.setType(InfConfigTypeEnum.CUSTOM.getType()); + ConfigDO config = ConfigConvert.INSTANCE.convert(reqVO); + config.setType(ConfigTypeEnum.CUSTOM.getType()); configMapper.insert(config); // 发送刷新消息 configProducer.sendConfigRefreshMessage(); @@ -54,7 +52,7 @@ public class InfConfigServiceImpl implements InfConfigService { // 校验正确性 checkCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key // 更新参数配置 - InfConfigDO updateObj = InfConfigConvert.INSTANCE.convert(reqVO); + ConfigDO updateObj = ConfigConvert.INSTANCE.convert(reqVO); configMapper.updateById(updateObj); // 发送刷新消息 configProducer.sendConfigRefreshMessage(); @@ -63,10 +61,10 @@ public class InfConfigServiceImpl implements InfConfigService { @Override public void deleteConfig(Long id) { // 校验配置存在 - InfConfigDO config = checkConfigExists(id); + ConfigDO config = checkConfigExists(id); // 内置配置,不允许删除 - if (InfConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { - throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); } // 删除 configMapper.deleteById(id); @@ -75,22 +73,22 @@ public class InfConfigServiceImpl implements InfConfigService { } @Override - public InfConfigDO getConfig(Long id) { + public ConfigDO getConfig(Long id) { return configMapper.selectById(id); } @Override - public InfConfigDO getConfigByKey(String key) { + public ConfigDO getConfigByKey(String key) { return configMapper.selectByKey(key); } @Override - public PageResult getConfigPage(ConfigPageReqVO reqVO) { + public PageResult getConfigPage(ConfigPageReqVO reqVO) { return configMapper.selectPage(reqVO); } @Override - public List getConfigList(ConfigExportReqVO reqVO) { + public List getConfigList(ConfigExportReqVO reqVO) { return configMapper.selectList(reqVO); } @@ -102,29 +100,29 @@ public class InfConfigServiceImpl implements InfConfigService { } @VisibleForTesting - public InfConfigDO checkConfigExists(Long id) { + public ConfigDO checkConfigExists(Long id) { if (id == null) { return null; } - InfConfigDO config = configMapper.selectById(id); + ConfigDO config = configMapper.selectById(id); if (config == null) { - throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_NOT_EXISTS); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_NOT_EXISTS); } return config; } @VisibleForTesting public void checkConfigKeyUnique(Long id, String key) { - InfConfigDO config = configMapper.selectByKey(key); + ConfigDO config = configMapper.selectByKey(key); if (config == null) { return; } // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 if (id == null) { - throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_KEY_DUPLICATE); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_KEY_DUPLICATE); } if (!config.getId().equals(id)) { - throw ServiceExceptionUtil.exception(InfErrorCodeConstants.CONFIG_KEY_DUPLICATE); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_KEY_DUPLICATE); } } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java new file mode 100644 index 0000000000..4fb658aa5a --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.infra.service.file; + +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FilePageReqVO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; + +/** + * 文件 Service 接口 + * + * @author 芋道源码 + */ +public interface FileService { + + /** + * 获得文件分页 + * + * @param pageReqVO 分页查询 + * @return 文件分页 + */ + PageResult getFilePage(FilePageReqVO pageReqVO); + + /** + * 保存文件,并返回文件的访问路径 + * + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String path, byte[] content); + + /** + * 删除文件 + * + * @param id 编号 + */ + void deleteFile(String id); + + /** + * 获得文件 + * + * @param path 文件路径 + * @return 文件 + */ + FileDO getFile(String path); + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileCoreServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java similarity index 59% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileCoreServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java index 251563fd4e..1f1724ecd1 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileCoreServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java @@ -1,39 +1,45 @@ -package cn.iocoder.yudao.module.infra.service.file.impl; +package cn.iocoder.yudao.module.infra.service.file; import cn.hutool.core.io.FileTypeUtil; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file.InfFileCoreMapper; -import cn.iocoder.yudao.coreservice.modules.infra.framework.file.config.FileProperties; -import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FilePageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; +import cn.iocoder.yudao.module.infra.dal.mysql.file.FileMapper; +import cn.iocoder.yudao.module.infra.framework.file.config.FileProperties; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.ByteArrayInputStream; -import static cn.iocoder.yudao.coreservice.modules.infra.enums.SysErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; /** - * core service 文件实现类 + * 文件 Service 实现类 * - * @author 宋天 + * @author 芋道源码 */ @Service -public class InfFileCoreServiceImpl implements InfFileCoreService { +public class FileServiceImpl implements FileService { @Resource - private InfFileCoreMapper fileMapper; + private FileMapper fileMapper; @Resource private FileProperties fileProperties; + @Override + public PageResult getFilePage(FilePageReqVO pageReqVO) { + return fileMapper.selectPage(pageReqVO); + } + @Override public String createFile(String path, byte[] content) { if (fileMapper.selectCountById(path) > 0) { throw exception(FILE_PATH_EXISTS); } // 保存到数据库 - InfFileDO file = new InfFileDO(); + FileDO file = new FileDO(); file.setId(path); file.setType(FileTypeUtil.getType(new ByteArrayInputStream(content))); file.setContent(content); @@ -57,7 +63,7 @@ public class InfFileCoreServiceImpl implements InfFileCoreService { } @Override - public InfFileDO getFile(String path) { + public FileDO getFile(String path) { return fileMapper.selectByPath(path); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileCoreService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileCoreService.java deleted file mode 100644 index 95f2998c19..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileCoreService.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.file; - -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; - -/** - * core service 文件接口 - * - * @author 宋天 - */ -public interface InfFileCoreService { - - /** - * 保存文件,并返回文件的访问路径 - * - * @param path 文件路径 - * @param content 文件内容 - * @return 文件路径 - */ - String createFile(String path, byte[] content); - - /** - * 删除文件 - * - * @param id 编号 - */ - void deleteFile(String id); - - /** - * 获得文件 - * - * @param path 文件路径 - * @return 文件 - */ - InfFileDO getFile(String path); -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileService.java deleted file mode 100644 index f37a422ce7..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/InfFileService.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.file; - -import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -/** - * 文件 Service 接口 - * - * @author 芋道源码 - */ -public interface InfFileService { - - /** - * 获得文件分页 - * - * @param pageReqVO 分页查询 - * @return 文件分页 - */ - PageResult getFilePage(InfFilePageReqVO pageReqVO); - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileServiceImpl.java deleted file mode 100644 index acd6dfb88a..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/file/impl/InfFileServiceImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.file.impl; - -import cn.iocoder.yudao.module.infra.dal.mysql.file.InfFileMapper; -import cn.iocoder.yudao.module.infra.service.file.InfFileService; -import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * 文件 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class InfFileServiceImpl implements InfFileService { - - @Resource - private InfFileMapper fileMapper; - - @Override - public PageResult getFilePage(InfFilePageReqVO pageReqVO) { - return fileMapper.selectPage(pageReqVO); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogService.java similarity index 68% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogService.java index b75897d108..e2e9e73e4e 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogService.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.infra.service.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.quartz.core.service.JobLogFrameworkService; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; import java.util.Collection; import java.util.List; @@ -14,7 +14,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface InfJobLogService extends JobLogFrameworkService { +public interface JobLogService extends JobLogFrameworkService { /** * 获得定时任务 @@ -22,7 +22,7 @@ public interface InfJobLogService extends JobLogFrameworkService { * @param id 编号 * @return 定时任务 */ - InfJobLogDO getJobLog(Long id); + JobLogDO getJobLog(Long id); /** * 获得定时任务列表 @@ -30,7 +30,7 @@ public interface InfJobLogService extends JobLogFrameworkService { * @param ids 编号 * @return 定时任务列表 */ - List getJobLogList(Collection ids); + List getJobLogList(Collection ids); /** * 获得定时任务分页 @@ -38,7 +38,7 @@ public interface InfJobLogService extends JobLogFrameworkService { * @param pageReqVO 分页查询 * @return 定时任务分页 */ - PageResult getJobLogPage(InfJobLogPageReqVO pageReqVO); + PageResult getJobLogPage(JobLogPageReqVO pageReqVO); /** * 获得定时任务列表, 用于 Excel 导出 @@ -46,6 +46,6 @@ public interface InfJobLogService extends JobLogFrameworkService { * @param exportReqVO 查询条件 * @return 定时任务分页 */ - List getJobLogList(InfJobLogExportReqVO exportReqVO); + List getJobLogList(JobLogExportReqVO exportReqVO); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java similarity index 55% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobLogServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java index cbc6a38a31..8b3c2ef884 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobLogServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java @@ -1,12 +1,11 @@ -package cn.iocoder.yudao.module.infra.service.job.impl; +package cn.iocoder.yudao.module.infra.service.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.yudao.module.infra.dal.mysql.job.InfJobLogMapper; -import cn.iocoder.yudao.module.infra.enums.job.InfJobLogStatusEnum; -import cn.iocoder.yudao.module.infra.service.job.InfJobLogService; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; +import cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper; +import cn.iocoder.yudao.module.infra.enums.job.JobLogStatusEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -25,15 +24,15 @@ import java.util.List; @Service @Validated @Slf4j -public class InfJobLogServiceImpl implements InfJobLogService { +public class JobLogServiceImpl implements JobLogService { @Resource - private InfJobLogMapper jobLogMapper; + private JobLogMapper jobLogMapper; @Override public Long createJobLog(Long jobId, Date beginTime, String jobHandlerName, String jobHandlerParam, Integer executeIndex) { - InfJobLogDO log = InfJobLogDO.builder().jobId(jobId).handlerName(jobHandlerName).handlerParam(jobHandlerParam).executeIndex(executeIndex) - .beginTime(beginTime).status(InfJobLogStatusEnum.RUNNING.getStatus()).build(); + JobLogDO log = JobLogDO.builder().jobId(jobId).handlerName(jobHandlerName).handlerParam(jobHandlerParam).executeIndex(executeIndex) + .beginTime(beginTime).status(JobLogStatusEnum.RUNNING.getStatus()).build(); jobLogMapper.insert(log); return log.getId(); } @@ -42,8 +41,8 @@ public class InfJobLogServiceImpl implements InfJobLogService { @Async public void updateJobLogResultAsync(Long logId, Date endTime, Integer duration, boolean success, String result) { try { - InfJobLogDO updateObj = InfJobLogDO.builder().id(logId).endTime(endTime).duration(duration) - .status(success ? InfJobLogStatusEnum.SUCCESS.getStatus() : InfJobLogStatusEnum.FAILURE.getStatus()).result(result).build(); + JobLogDO updateObj = JobLogDO.builder().id(logId).endTime(endTime).duration(duration) + .status(success ? JobLogStatusEnum.SUCCESS.getStatus() : JobLogStatusEnum.FAILURE.getStatus()).result(result).build(); jobLogMapper.updateById(updateObj); } catch (Exception ex) { log.error("[updateJobLogResultAsync][logId({}) endTime({}) duration({}) success({}) result({})]", @@ -52,22 +51,22 @@ public class InfJobLogServiceImpl implements InfJobLogService { } @Override - public InfJobLogDO getJobLog(Long id) { + public JobLogDO getJobLog(Long id) { return jobLogMapper.selectById(id); } @Override - public List getJobLogList(Collection ids) { + public List getJobLogList(Collection ids) { return jobLogMapper.selectBatchIds(ids); } @Override - public PageResult getJobLogPage(InfJobLogPageReqVO pageReqVO) { + public PageResult getJobLogPage(JobLogPageReqVO pageReqVO) { return jobLogMapper.selectPage(pageReqVO); } @Override - public List getJobLogList(InfJobLogExportReqVO exportReqVO) { + public List getJobLogList(JobLogExportReqVO exportReqVO) { return jobLogMapper.selectList(exportReqVO); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java similarity index 75% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java index bfacab3be6..bd5dd646d6 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/InfJobService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.infra.service.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; import org.quartz.SchedulerException; import javax.validation.Valid; @@ -17,7 +17,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface InfJobService { +public interface JobService { /** * 创建定时任务 @@ -25,14 +25,14 @@ public interface InfJobService { * @param createReqVO 创建信息 * @return 编号 */ - Long createJob(@Valid InfJobCreateReqVO createReqVO) throws SchedulerException; + Long createJob(@Valid JobCreateReqVO createReqVO) throws SchedulerException; /** * 更新定时任务 * * @param updateReqVO 更新信息 */ - void updateJob(@Valid InfJobUpdateReqVO updateReqVO) throws SchedulerException; + void updateJob(@Valid JobUpdateReqVO updateReqVO) throws SchedulerException; /** * 更新定时任务的状态 @@ -62,7 +62,7 @@ public interface InfJobService { * @param id 编号 * @return 定时任务 */ - InfJobDO getJob(Long id); + JobDO getJob(Long id); /** * 获得定时任务列表 @@ -70,7 +70,7 @@ public interface InfJobService { * @param ids 编号 * @return 定时任务列表 */ - List getJobList(Collection ids); + List getJobList(Collection ids); /** * 获得定时任务分页 @@ -78,7 +78,7 @@ public interface InfJobService { * @param pageReqVO 分页查询 * @return 定时任务分页 */ - PageResult getJobPage(InfJobPageReqVO pageReqVO); + PageResult getJobPage(JobPageReqVO pageReqVO); /** * 获得定时任务列表, 用于 Excel 导出 @@ -86,6 +86,6 @@ public interface InfJobService { * @param exportReqVO 查询条件 * @return 定时任务分页 */ - List getJobList(InfJobExportReqVO exportReqVO); + List getJobList(JobExportReqVO exportReqVO); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java similarity index 68% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobServiceImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java index 39e77f1ea0..e0a245750c 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/impl/InfJobServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java @@ -1,17 +1,16 @@ -package cn.iocoder.yudao.module.infra.service.job.impl; +package cn.iocoder.yudao.module.infra.service.job; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; import cn.iocoder.yudao.framework.quartz.core.util.CronUtils; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.yudao.module.infra.convert.job.InfJobConvert; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.yudao.module.infra.dal.mysql.job.InfJobMapper; -import cn.iocoder.yudao.module.infra.enums.job.InfJobStatusEnum; -import cn.iocoder.yudao.module.infra.service.job.InfJobService; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import cn.iocoder.yudao.module.infra.convert.job.JobConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; +import cn.iocoder.yudao.module.infra.dal.mysql.job.JobMapper; +import cn.iocoder.yudao.module.infra.enums.job.JobStatusEnum; import org.quartz.SchedulerException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,7 +21,7 @@ import java.util.Collection; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.*; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.containsAny; /** @@ -32,25 +31,25 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. */ @Service @Validated -public class InfJobServiceImpl implements InfJobService { +public class JobServiceImpl implements JobService { @Resource - private InfJobMapper jobMapper; + private JobMapper jobMapper; @Resource private SchedulerManager schedulerManager; @Override @Transactional(rollbackFor = Exception.class) - public Long createJob(InfJobCreateReqVO createReqVO) throws SchedulerException { + public Long createJob(JobCreateReqVO createReqVO) throws SchedulerException { validateCronExpression(createReqVO.getCronExpression()); // 校验唯一性 if (jobMapper.selectByHandlerName(createReqVO.getHandlerName()) != null) { throw exception(JOB_HANDLER_EXISTS); } // 插入 - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.INIT.getStatus()); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.INIT.getStatus()); fillJobMonitorTimeoutEmpty(job); jobMapper.insert(job); @@ -58,7 +57,7 @@ public class InfJobServiceImpl implements InfJobService { schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), createReqVO.getRetryCount(), createReqVO.getRetryInterval()); // 更新 - InfJobDO updateObj = InfJobDO.builder().id(job.getId()).status(InfJobStatusEnum.NORMAL.getStatus()).build(); + JobDO updateObj = JobDO.builder().id(job.getId()).status(JobStatusEnum.NORMAL.getStatus()).build(); jobMapper.updateById(updateObj); // 返回 @@ -67,16 +66,16 @@ public class InfJobServiceImpl implements InfJobService { @Override @Transactional(rollbackFor = Exception.class) - public void updateJob(InfJobUpdateReqVO updateReqVO) throws SchedulerException { + public void updateJob(JobUpdateReqVO updateReqVO) throws SchedulerException { validateCronExpression(updateReqVO.getCronExpression()); // 校验存在 - InfJobDO job = this.validateJobExists(updateReqVO.getId()); + JobDO job = this.validateJobExists(updateReqVO.getId()); // 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行 - if (!job.getStatus().equals(InfJobStatusEnum.NORMAL.getStatus())) { + if (!job.getStatus().equals(JobStatusEnum.NORMAL.getStatus())) { throw exception(JOB_UPDATE_ONLY_NORMAL_STATUS); } // 更新 - InfJobDO updateObj = InfJobConvert.INSTANCE.convert(updateReqVO); + JobDO updateObj = JobConvert.INSTANCE.convert(updateReqVO); fillJobMonitorTimeoutEmpty(updateObj); jobMapper.updateById(updateObj); @@ -89,21 +88,21 @@ public class InfJobServiceImpl implements InfJobService { @Transactional(rollbackFor = Exception.class) public void updateJobStatus(Long id, Integer status) throws SchedulerException { // 校验 status - if (!containsAny(status, InfJobStatusEnum.NORMAL.getStatus(), InfJobStatusEnum.STOP.getStatus())) { + if (!containsAny(status, JobStatusEnum.NORMAL.getStatus(), JobStatusEnum.STOP.getStatus())) { throw exception(JOB_CHANGE_STATUS_INVALID); } // 校验存在 - InfJobDO job = this.validateJobExists(id); + JobDO job = this.validateJobExists(id); // 校验是否已经为当前状态 if (job.getStatus().equals(status)) { throw exception(JOB_CHANGE_STATUS_EQUALS); } // 更新 Job 状态 - InfJobDO updateObj = InfJobDO.builder().id(id).status(status).build(); + JobDO updateObj = JobDO.builder().id(id).status(status).build(); jobMapper.updateById(updateObj); // 更新状态 Job 到 Quartz 中 - if (InfJobStatusEnum.NORMAL.getStatus().equals(status)) { // 开启 + if (JobStatusEnum.NORMAL.getStatus().equals(status)) { // 开启 schedulerManager.resumeJob(job.getHandlerName()); } else { // 暂停 schedulerManager.pauseJob(job.getHandlerName()); @@ -113,7 +112,7 @@ public class InfJobServiceImpl implements InfJobService { @Override public void triggerJob(Long id) throws SchedulerException { // 校验存在 - InfJobDO job = this.validateJobExists(id); + JobDO job = this.validateJobExists(id); // 触发 Quartz 中的 Job schedulerManager.triggerJob(job.getId(), job.getHandlerName(), job.getHandlerParam()); @@ -123,7 +122,7 @@ public class InfJobServiceImpl implements InfJobService { @Transactional(rollbackFor = Exception.class) public void deleteJob(Long id) throws SchedulerException { // 校验存在 - InfJobDO job = this.validateJobExists(id); + JobDO job = this.validateJobExists(id); // 更新 jobMapper.deleteById(id); @@ -131,8 +130,8 @@ public class InfJobServiceImpl implements InfJobService { schedulerManager.deleteJob(job.getHandlerName()); } - private InfJobDO validateJobExists(Long id) { - InfJobDO job = jobMapper.selectById(id); + private JobDO validateJobExists(Long id) { + JobDO job = jobMapper.selectById(id); if (job == null) { throw exception(JOB_NOT_EXISTS); } @@ -146,26 +145,26 @@ public class InfJobServiceImpl implements InfJobService { } @Override - public InfJobDO getJob(Long id) { + public JobDO getJob(Long id) { return jobMapper.selectById(id); } @Override - public List getJobList(Collection ids) { + public List getJobList(Collection ids) { return jobMapper.selectBatchIds(ids); } @Override - public PageResult getJobPage(InfJobPageReqVO pageReqVO) { + public PageResult getJobPage(JobPageReqVO pageReqVO) { return jobMapper.selectPage(pageReqVO); } @Override - public List getJobList(InfJobExportReqVO exportReqVO) { + public List getJobList(JobExportReqVO exportReqVO) { return jobMapper.selectList(exportReqVO); } - private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { + private static void fillJobMonitorTimeoutEmpty(JobDO job) { if (job.getMonitorTimeout() == null) { job.setMonitorTimeout(0); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogService.java similarity index 57% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogService.java index 91229efea9..22aea79b41 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogService.java @@ -1,9 +1,10 @@ package cn.iocoder.yudao.module.infra.service.logger; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; import java.util.List; @@ -12,7 +13,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface InfApiAccessLogService { +public interface ApiAccessLogService extends ApiAccessLogFrameworkService { /** * 获得 API 访问日志分页 @@ -20,7 +21,7 @@ public interface InfApiAccessLogService { * @param pageReqVO 分页查询 * @return API 访问日志分页 */ - PageResult getApiAccessLogPage(InfApiAccessLogPageReqVO pageReqVO); + PageResult getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO); /** * 获得 API 访问日志列表, 用于 Excel 导出 @@ -28,6 +29,6 @@ public interface InfApiAccessLogService { * @param exportReqVO 查询条件 * @return API 访问日志分页 */ - List getApiAccessLogList(InfApiAccessLogExportReqVO exportReqVO); + List getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java new file mode 100644 index 0000000000..64df85ac04 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.infra.service.logger; + +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import cn.iocoder.yudao.module.infra.convert.logger.ApiAccessLogConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * API 访问日志 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class ApiAccessLogServiceImpl implements ApiAccessLogService { + + @Resource + private ApiAccessLogMapper apiAccessLogMapper; + + @Override + public PageResult getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO) { + return apiAccessLogMapper.selectPage(pageReqVO); + } + + @Override + public List getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO) { + return apiAccessLogMapper.selectList(exportReqVO); + } + + @Override + @Async + public void createApiAccessLogAsync(ApiAccessLogCreateReqDTO createDTO) { + ApiAccessLogDO apiAccessLog = ApiAccessLogConvert.INSTANCE.convert(createDTO); + apiAccessLogMapper.insert(apiAccessLog); + } + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogService.java similarity index 65% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogService.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogService.java index 2920f3fc74..2ad0479fe4 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogService.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogService.java @@ -1,9 +1,10 @@ package cn.iocoder.yudao.module.infra.service.logger; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; import java.util.List; @@ -12,7 +13,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface InfApiErrorLogService { +public interface ApiErrorLogService extends ApiErrorLogFrameworkService { /** * 获得 API 错误日志分页 @@ -20,7 +21,7 @@ public interface InfApiErrorLogService { * @param pageReqVO 分页查询 * @return API 错误日志分页 */ - PageResult getApiErrorLogPage(InfApiErrorLogPageReqVO pageReqVO); + PageResult getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO); /** * 获得 API 错误日志列表, 用于 Excel 导出 @@ -28,7 +29,7 @@ public interface InfApiErrorLogService { * @param exportReqVO 查询条件 * @return API 错误日志分页 */ - List getApiErrorLogList(InfApiErrorLogExportReqVO exportReqVO); + List getApiErrorLogList(ApiErrorLogExportReqVO exportReqVO); /** * 更新 API 错误日志已处理 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java new file mode 100644 index 0000000000..038f47a381 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.infra.service.logger; + +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDTO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.convert.logger.ApiErrorLogConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants; +import cn.iocoder.yudao.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + * API 错误日志 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class ApiErrorLogServiceImpl implements ApiErrorLogService { + + @Resource + private ApiErrorLogMapper apiErrorLogMapper; + + @Override + public PageResult getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO) { + return apiErrorLogMapper.selectPage(pageReqVO); + } + + @Override + public List getApiErrorLogList(ApiErrorLogExportReqVO exportReqVO) { + return apiErrorLogMapper.selectList(exportReqVO); + } + + @Override + public void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId) { + ApiErrorLogDO errorLog = apiErrorLogMapper.selectById(id); + if (errorLog == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.API_ERROR_LOG_NOT_FOUND); + } + if (!ApiErrorLogProcessStatusEnum.INIT.getStatus().equals(errorLog.getProcessStatus())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.API_ERROR_LOG_PROCESSED); + } + // 标记处理 + apiErrorLogMapper.updateById(ApiErrorLogDO.builder().id(id).processStatus(processStatus) + .processUserId(processUserId).processTime(new Date()).build()); + } + + @Override + @Async + public void createApiErrorLogAsync(ApiErrorLogCreateReqDTO createDTO) { + ApiErrorLogDO apiErrorLog = ApiErrorLogConvert.INSTANCE.convert(createDTO); + apiErrorLog.setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); + apiErrorLogMapper.insert(apiErrorLog); + } + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogCoreService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogCoreService.java deleted file mode 100644 index c38963e4e8..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogCoreService.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.logger; - -import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; - -/** - * API 访问日志 Service 接口 - * - * @author 芋道源码 - */ -public interface InfApiAccessLogCoreService extends ApiAccessLogFrameworkService { - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogCoreService.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogCoreService.java deleted file mode 100644 index 3ba698e7de..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogCoreService.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.logger; - -import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; - -/** - * API 错误日志 Service 接口 - * - * @author 芋道源码 - */ -public interface InfApiErrorLogCoreService extends ApiErrorLogFrameworkService { - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java deleted file mode 100644 index 6779de2e34..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.logger.impl; - -import cn.iocoder.yudao.coreservice.modules.infra.convert.logger.InfApiAccessLogCoreConvert; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger.InfApiAccessLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.infra.service.logger.InfApiAccessLogCoreService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -/** - * API 访问日志 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class InfApiAccessLogCoreServiceImpl implements InfApiAccessLogCoreService { - - @Resource - private InfApiAccessLogCoreMapper apiAccessLogMapper; - - @Override - @Async - public void createApiAccessLogAsync(ApiAccessLogCreateReqDTO createDTO) { - InfApiAccessLogDO apiAccessLog = InfApiAccessLogCoreConvert.INSTANCE.convert(createDTO); - apiAccessLogMapper.insert(apiAccessLog); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogServiceImpl.java deleted file mode 100644 index 87856f35b6..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiAccessLogServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.logger.impl; - -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.yudao.module.infra.dal.mysql.logger.InfApiAccessLogMapper; -import cn.iocoder.yudao.module.infra.service.logger.InfApiAccessLogService; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -/** - * API 访问日志 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class InfApiAccessLogServiceImpl implements InfApiAccessLogService { - - @Resource - private InfApiAccessLogMapper apiAccessLogMapper; - - @Override - public PageResult getApiAccessLogPage(InfApiAccessLogPageReqVO pageReqVO) { - return apiAccessLogMapper.selectPage(pageReqVO); - } - - @Override - public List getApiAccessLogList(InfApiAccessLogExportReqVO exportReqVO) { - return apiAccessLogMapper.selectList(exportReqVO); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java deleted file mode 100644 index ddb8b0cf1b..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.logger.impl; - -import cn.iocoder.yudao.coreservice.modules.infra.convert.logger.InfApiErrorLogCoreConvert; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger.InfApiErrorLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; -import cn.iocoder.yudao.coreservice.modules.infra.service.logger.InfApiErrorLogCoreService; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDTO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -/** - * API 错误日志 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class InfApiErrorLogCoreServiceImpl implements InfApiErrorLogCoreService { - - @Resource - private InfApiErrorLogCoreMapper apiErrorLogMapper; - - @Override - @Async - public void createApiErrorLogAsync(ApiErrorLogCreateReqDTO createDTO) { - InfApiErrorLogDO apiErrorLog = InfApiErrorLogCoreConvert.INSTANCE.convert(createDTO); - apiErrorLog.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus()); - apiErrorLogMapper.insert(apiErrorLog); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogServiceImpl.java deleted file mode 100644 index 85e21cc99c..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/logger/impl/InfApiErrorLogServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.logger.impl; - -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.yudao.module.infra.dal.mysql.logger.InfApiErrorLogMapper; -import cn.iocoder.yudao.module.infra.enums.logger.InfApiErrorLogProcessStatusEnum; -import cn.iocoder.yudao.module.infra.service.logger.InfApiErrorLogService; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * API 错误日志 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class InfApiErrorLogServiceImpl implements InfApiErrorLogService { - - @Resource - private InfApiErrorLogMapper apiErrorLogMapper; - - @Override - public PageResult getApiErrorLogPage(InfApiErrorLogPageReqVO pageReqVO) { - return apiErrorLogMapper.selectPage(pageReqVO); - } - - @Override - public List getApiErrorLogList(InfApiErrorLogExportReqVO exportReqVO) { - return apiErrorLogMapper.selectList(exportReqVO); - } - - @Override - public void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId) { - InfApiErrorLogDO errorLog = apiErrorLogMapper.selectById(id); - if (errorLog == null) { - throw ServiceExceptionUtil.exception(InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND); - } - if (!InfApiErrorLogProcessStatusEnum.INIT.getStatus().equals(errorLog.getProcessStatus())) { - throw ServiceExceptionUtil.exception(InfErrorCodeConstants.API_ERROR_LOG_PROCESSED); - } - // 标记处理 - apiErrorLogMapper.updateById(InfApiErrorLogDO.builder().id(id).processStatus(processStatus) - .processUserId(processUserId).processTime(new Date()).build()); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/package-info.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/package-info.java deleted file mode 100644 index 9ce8230c43..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.infra; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/InfConfigServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceTest.java similarity index 73% rename from yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/InfConfigServiceTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceTest.java index d50f5b15af..1eeae4199a 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/InfConfigServiceTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceTest.java @@ -1,19 +1,18 @@ package cn.iocoder.yudao.module.infra.service.config; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; -import cn.iocoder.yudao.module.infra.dal.mysql.config.InfConfigMapper; -import cn.iocoder.yudao.module.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.yudao.module.infra.mq.producer.config.InfConfigProducer; -import cn.iocoder.yudao.module.infra.service.config.impl.InfConfigServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; +import cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigMapper; +import cn.iocoder.yudao.module.infra.enums.config.ConfigTypeEnum; +import cn.iocoder.yudao.module.infra.mq.producer.config.ConfigProducer; +import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -24,30 +23,25 @@ import java.util.List; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -/** - * {@link InfConfigServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(InfConfigServiceImpl.class) -public class InfConfigServiceTest extends BaseDbUnitTest { +@Import(ConfigServiceImpl.class) +public class ConfigServiceTest extends BaseDbUnitTest { @Resource - private InfConfigServiceImpl configService; + private ConfigServiceImpl configService; @Resource - private InfConfigMapper configMapper; + private ConfigMapper configMapper; @MockBean - private InfConfigProducer configProducer; + private ConfigProducer configProducer; @Test public void testCreateConfig_success() { @@ -59,9 +53,9 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(configId); // 校验记录的属性是否正确 - InfConfigDO config = configMapper.selectById(configId); + ConfigDO config = configMapper.selectById(configId); assertPojoEquals(reqVO, config); - Assertions.assertEquals(InfConfigTypeEnum.CUSTOM.getType(), config.getType()); + Assertions.assertEquals(ConfigTypeEnum.CUSTOM.getType(), config.getType()); // 校验调用 verify(configProducer, times(1)).sendConfigRefreshMessage(); } @@ -69,7 +63,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @Test public void testUpdateConfig_success() { // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(); + ConfigDO dbConfig = randomConfigDO(); configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 // 准备参数 ConfigUpdateReqVO reqVO = randomPojo(ConfigUpdateReqVO.class, o -> { @@ -79,7 +73,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // 调用 configService.updateConfig(reqVO); // 校验是否更新正确 - InfConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 + ConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, config); // 校验调用 verify(configProducer, times(1)).sendConfigRefreshMessage(); @@ -88,8 +82,8 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @Test public void testDeleteConfig_success() { // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { - o.setType(InfConfigTypeEnum.CUSTOM.getType()); // 只能删除 CUSTOM 类型 + ConfigDO dbConfig = randomConfigDO(o -> { + o.setType(ConfigTypeEnum.CUSTOM.getType()); // 只能删除 CUSTOM 类型 }); configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 // 准备参数 @@ -106,8 +100,8 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @Test public void testDeleteConfig_canNotDeleteSystemType() { // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { - o.setType(InfConfigTypeEnum.SYSTEM.getType()); // SYSTEM 不允许删除 + ConfigDO dbConfig = randomConfigDO(o -> { + o.setType(ConfigTypeEnum.SYSTEM.getType()); // SYSTEM 不允许删除 }); configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 // 准备参数 @@ -120,7 +114,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @Test public void testCheckConfigExists_success() { // mock 数据 - InfConfigDO dbConfigDO = randomInfConfigDO(); + ConfigDO dbConfigDO = randomConfigDO(); configMapper.insert(dbConfigDO);// @Sql: 先插入出一条存在的数据 // 调用成功 @@ -143,7 +137,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // 准备参数 String key = randomString(); // mock 数据 - configMapper.insert(randomInfConfigDO(o -> o.setKey(key))); + configMapper.insert(randomConfigDO(o -> o.setKey(key))); // 调用,校验异常 assertServiceException(() -> configService.checkConfigKeyUnique(null, key), @@ -156,7 +150,7 @@ public class InfConfigServiceTest extends BaseDbUnitTest { Long id = randomLongId(); String key = randomString(); // mock 数据 - configMapper.insert(randomInfConfigDO(o -> o.setKey(key))); + configMapper.insert(randomConfigDO(o -> o.setKey(key))); // 调用,校验异常 assertServiceException(() -> configService.checkConfigKeyUnique(id, key), @@ -166,10 +160,10 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @Test public void testGetConfigPage() { // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 + ConfigDO dbConfig = randomConfigDO(o -> { // 等会查询到 o.setName("芋艿"); o.setKey("yunai"); - o.setType(InfConfigTypeEnum.SYSTEM.getType()); + o.setType(ConfigTypeEnum.SYSTEM.getType()); o.setCreateTime(buildTime(2021, 2, 1)); }); configMapper.insert(dbConfig); @@ -178,19 +172,19 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // 测试 key 不匹配 configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setKey("tudou"))); // 测试 type 不匹配 - configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setType(ConfigTypeEnum.CUSTOM.getType()))); // 测试 createTime 不匹配 configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); // 准备参数 ConfigPageReqVO reqVO = new ConfigPageReqVO(); reqVO.setName("艿"); reqVO.setKey("nai"); - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); + reqVO.setType(ConfigTypeEnum.SYSTEM.getType()); reqVO.setBeginTime(buildTime(2021, 1, 15)); reqVO.setEndTime(buildTime(2021, 2, 15)); // 调用 - PageResult pageResult = configService.getConfigPage(reqVO); + PageResult pageResult = configService.getConfigPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -200,10 +194,10 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @Test public void testGetConfigList() { // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 + ConfigDO dbConfig = randomConfigDO(o -> { // 等会查询到 o.setName("芋艿"); o.setKey("yunai"); - o.setType(InfConfigTypeEnum.SYSTEM.getType()); + o.setType(ConfigTypeEnum.SYSTEM.getType()); o.setCreateTime(buildTime(2021, 2, 1)); }); configMapper.insert(dbConfig); @@ -212,19 +206,19 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // 测试 key 不匹配 configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setKey("tudou"))); // 测试 type 不匹配 - configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setType(ConfigTypeEnum.CUSTOM.getType()))); // 测试 createTime 不匹配 configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); // 准备参数 ConfigExportReqVO reqVO = new ConfigExportReqVO(); reqVO.setName("艿"); reqVO.setKey("nai"); - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); + reqVO.setType(ConfigTypeEnum.SYSTEM.getType()); reqVO.setBeginTime(buildTime(2021, 1, 15)); reqVO.setEndTime(buildTime(2021, 2, 15)); // 调用 - List list = configService.getConfigList(reqVO); + List list = configService.getConfigList(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbConfig, list.get(0)); @@ -233,13 +227,13 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @Test public void testGetConfigByKey() { // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(); + ConfigDO dbConfig = randomConfigDO(); configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 // 准备参数 String key = dbConfig.getKey(); // 调用 - InfConfigDO config = configService.getConfigByKey(key); + ConfigDO config = configService.getConfigByKey(key); // 断言 assertNotNull(config); assertPojoEquals(dbConfig, config); @@ -248,11 +242,11 @@ public class InfConfigServiceTest extends BaseDbUnitTest { // ========== 随机对象 ========== @SafeVarargs - private static InfConfigDO randomInfConfigDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 + private static ConfigDO randomConfigDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setType(randomEle(ConfigTypeEnum.values()).getType()); // 保证 key 的范围 }; - return RandomUtils.randomPojo(InfConfigDO.class, ArrayUtils.append(consumer, consumers)); + return RandomUtils.randomPojo(ConfigDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceTest.java new file mode 100644 index 0000000000..8356957e46 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceTest.java @@ -0,0 +1,126 @@ +package cn.iocoder.yudao.module.infra.service.file; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.framework.test.core.util.AssertUtils; +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FilePageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; +import cn.iocoder.yudao.module.infra.dal.mysql.file.FileMapper; +import cn.iocoder.yudao.module.infra.framework.file.config.FileProperties; +import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; + +@Import({FileServiceImpl.class, FileProperties.class}) +public class FileServiceTest extends BaseDbUnitTest { + + @Resource + private FileService fileService; + + @MockBean + private FileProperties fileProperties; + + @Resource + private FileMapper fileMapper; + + @Test + public void testGetFilePage() { + // mock 数据 + FileDO dbFile = randomPojo(FileDO.class, o -> { // 等会查询到 + o.setId("yudao"); + o.setType("jpg"); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + fileMapper.insert(dbFile); + // 测试 id 不匹配 + fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> o.setId("tudou"))); + // 测试 type 不匹配 + fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> { + o.setId("yudao02"); + o.setType("png"); + })); + // 测试 createTime 不匹配 + fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> { + o.setId("yudao03"); + o.setCreateTime(buildTime(2020, 1, 15)); + })); + // 准备参数 + FilePageReqVO reqVO = new FilePageReqVO(); + reqVO.setId("yudao"); + reqVO.setType("jp"); + reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); + reqVO.setEndCreateTime(buildTime(2021, 1, 20)); + + // 调用 + PageResult pageResult = fileService.getFilePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + AssertUtils.assertPojoEquals(dbFile, pageResult.getList().get(0), "content"); + } + + @Test + public void testCreateFile_success() { + // 准备参数 + String path = randomString(); + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + + // 调用 + String url = fileService.createFile(path, content); + // 断言 + assertEquals(fileProperties.getBasePath() + path, url); + // 校验数据 + FileDO file = fileMapper.selectById(path); + assertEquals(path, file.getId()); + assertEquals("jpg", file.getType()); + assertArrayEquals(content, file.getContent()); + } + + @Test + public void testCreateFile_exists() { + // mock 数据 + FileDO dbFile = randomPojo(FileDO.class); + fileMapper.insert(dbFile); + // 准备参数 + String path = dbFile.getId(); // 模拟已存在 + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + + // 调用,并断言异常 + assertServiceException(() -> fileService.createFile(path, content), FILE_PATH_EXISTS); + } + + @Test + public void testDeleteFile_success() { + // mock 数据 + FileDO dbFile = randomPojo(FileDO.class); + fileMapper.insert(dbFile);// @Sql: 先插入出一条存在的数据 + // 准备参数 + String id = dbFile.getId(); + + // 调用 + fileService.deleteFile(id); + // 校验数据不存在了 + assertNull(fileMapper.selectById(id)); + } + + @Test + public void testDeleteFile_notExists() { + // 准备参数 + String id = randomString(); + + // 调用, 并断言异常 + assertServiceException(() -> fileService.deleteFile(id), FILE_NOT_EXISTS); + } + +} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/InfFileServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/InfFileServiceTest.java deleted file mode 100644 index 314193f668..0000000000 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/InfFileServiceTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.iocoder.yudao.module.infra.service.file; - -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.framework.test.core.util.AssertUtils; -import cn.iocoder.yudao.module.infra.controller.admin.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.module.infra.service.file.impl.InfFileServiceImpl; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file.InfFileCoreMapper; -import cn.iocoder.yudao.coreservice.modules.infra.framework.file.config.FileProperties; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; - -@Import({InfFileServiceImpl.class, FileProperties.class}) -public class InfFileServiceTest extends BaseDbUnitTest { - - @Resource - private InfFileService fileService; - - @MockBean - private FileProperties fileProperties; - - @Resource - private InfFileCoreMapper fileMapper; - - @Test - public void testGetFilePage() { - // mock 数据 - InfFileDO dbFile = randomPojo(InfFileDO.class, o -> { // 等会查询到 - o.setId("yudao"); - o.setType("jpg"); - o.setCreateTime(buildTime(2021, 1, 15)); - }); - fileMapper.insert(dbFile); - // 测试 id 不匹配 - fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> o.setId("tudou"))); - // 测试 type 不匹配 - fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> { - o.setId("yudao02"); - o.setType("png"); - })); - // 测试 createTime 不匹配 - fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> { - o.setId("yudao03"); - o.setCreateTime(buildTime(2020, 1, 15)); - })); - // 准备参数 - InfFilePageReqVO reqVO = new InfFilePageReqVO(); - reqVO.setId("yudao"); - reqVO.setType("jp"); - reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); - reqVO.setEndCreateTime(buildTime(2021, 1, 20)); - - // 调用 - PageResult pageResult = fileService.getFilePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - AssertUtils.assertPojoEquals(dbFile, pageResult.getList().get(0), "content"); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceTest.java similarity index 67% rename from yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogServiceTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceTest.java index 60edcef090..27bda4965d 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobLogServiceTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceTest.java @@ -14,36 +14,30 @@ import java.util.List; import javax.annotation.Resource; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; +import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.yudao.module.infra.dal.mysql.job.InfJobLogMapper; -import cn.iocoder.yudao.module.infra.enums.job.InfJobLogStatusEnum; -import cn.iocoder.yudao.module.infra.service.job.impl.InfJobLogServiceImpl; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper; +import cn.iocoder.yudao.module.infra.enums.job.JobLogStatusEnum; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -/** - * {@link InfJobLogServiceImpl} 的单元测试 - * - * @author neilz - */ -@Import(InfJobLogServiceImpl.class) -public class InfJobLogServiceTest extends BaseDbUnitTest { +@Import(JobLogServiceImpl.class) +public class JobLogServiceTest extends BaseDbUnitTest { @Resource - private InfJobLogServiceImpl jobLogService; + private JobLogServiceImpl jobLogService; @Resource - private InfJobLogMapper jobLogMapper; + private JobLogMapper jobLogMapper; @Test public void testCreateJobLog_success() { // 准备参数 - InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> { + JobLogDO reqVO = randomPojo(JobLogDO.class, o -> { o.setExecuteIndex(1); }); // 调用 @@ -51,40 +45,40 @@ public class InfJobLogServiceTest extends BaseDbUnitTest { // 断言 assertNotNull(jobLogId); // 校验记录的属性是否正确 - InfJobLogDO job = jobLogMapper.selectById(jobLogId); - assertEquals(InfJobLogStatusEnum.RUNNING.getStatus(), job.getStatus()); + JobLogDO job = jobLogMapper.selectById(jobLogId); + assertEquals(JobLogStatusEnum.RUNNING.getStatus(), job.getStatus()); } @Test public void testUpdateJobLogResultAsync_success() { // 准备参数 - InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> { + JobLogDO reqVO = randomPojo(JobLogDO.class, o -> { o.setExecuteIndex(1); }); - InfJobLogDO log = InfJobLogDO.builder().jobId(reqVO.getJobId()).handlerName(reqVO.getHandlerName()).handlerParam(reqVO.getHandlerParam()).executeIndex(reqVO.getExecuteIndex()) - .beginTime(reqVO.getBeginTime()).status(InfJobLogStatusEnum.RUNNING.getStatus()).build(); + JobLogDO log = JobLogDO.builder().jobId(reqVO.getJobId()).handlerName(reqVO.getHandlerName()).handlerParam(reqVO.getHandlerParam()).executeIndex(reqVO.getExecuteIndex()) + .beginTime(reqVO.getBeginTime()).status(JobLogStatusEnum.RUNNING.getStatus()).build(); jobLogMapper.insert(log); // 调用 jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), true,reqVO.getResult()); // 校验记录的属性是否正确 - InfJobLogDO job = jobLogMapper.selectById(log.getId()); - assertEquals(InfJobLogStatusEnum.SUCCESS.getStatus(), job.getStatus()); + JobLogDO job = jobLogMapper.selectById(log.getId()); + assertEquals(JobLogStatusEnum.SUCCESS.getStatus(), job.getStatus()); // 调用 jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), false,reqVO.getResult()); // 校验记录的属性是否正确 - InfJobLogDO job2 = jobLogMapper.selectById(log.getId()); - assertEquals(InfJobLogStatusEnum.FAILURE.getStatus(), job2.getStatus()); + JobLogDO job2 = jobLogMapper.selectById(log.getId()); + assertEquals(JobLogStatusEnum.FAILURE.getStatus(), job2.getStatus()); } @Test public void testGetJobLogListByIds_success() { // mock 数据 - InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { + JobLogDO dbJobLog = randomPojo(JobLogDO.class, o -> { o.setExecuteIndex(1); - o.setStatus(randomEle(InfJobLogStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setStatus(randomEle(JobLogStatusEnum.values()).getStatus()); // 保证 status 的范围 }); - InfJobLogDO cloneJobLog = ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setHandlerName(randomString())); + JobLogDO cloneJobLog = ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setHandlerName(randomString())); jobLogMapper.insert(dbJobLog); // 测试 handlerName 不匹配 jobLogMapper.insert(cloneJobLog); @@ -93,7 +87,7 @@ public class InfJobLogServiceTest extends BaseDbUnitTest { ids.add(dbJobLog.getId()); ids.add(cloneJobLog.getId()); // 调用 - List list = jobLogService.getJobLogList(ids); + List list = jobLogService.getJobLogList(ids); // 断言 assertEquals(2, list.size()); assertPojoEquals(dbJobLog, list.get(0)); @@ -102,10 +96,10 @@ public class InfJobLogServiceTest extends BaseDbUnitTest { @Test public void testGetJobPage_success() { // mock 数据 - InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { + JobLogDO dbJobLog = randomPojo(JobLogDO.class, o -> { o.setExecuteIndex(1); o.setHandlerName("handlerName 单元测试"); - o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); + o.setStatus(JobLogStatusEnum.SUCCESS.getStatus()); o.setBeginTime(buildTime(2021, 1, 8)); o.setEndTime(buildTime(2021, 1, 8)); }); @@ -119,16 +113,16 @@ public class InfJobLogServiceTest extends BaseDbUnitTest { // 测试 endTime 不匹配 jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); // 测试 status 不匹配 - jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus()))); + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setStatus(JobLogStatusEnum.FAILURE.getStatus()))); // 准备参数 - InfJobLogPageReqVO reqVo = new InfJobLogPageReqVO(); + JobLogPageReqVO reqVo = new JobLogPageReqVO(); reqVo.setJobId(dbJobLog.getJobId()); reqVo.setHandlerName("单元"); reqVo.setBeginTime(dbJobLog.getBeginTime()); reqVo.setEndTime(dbJobLog.getEndTime()); - reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); + reqVo.setStatus(JobLogStatusEnum.SUCCESS.getStatus()); // 调用 - PageResult pageResult = jobLogService.getJobLogPage(reqVo); + PageResult pageResult = jobLogService.getJobLogPage(reqVo); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -138,10 +132,10 @@ public class InfJobLogServiceTest extends BaseDbUnitTest { @Test public void testGetJobListForExport_success() { // mock 数据 - InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { + JobLogDO dbJobLog = randomPojo(JobLogDO.class, o -> { o.setExecuteIndex(1); o.setHandlerName("handlerName 单元测试"); - o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); + o.setStatus(JobLogStatusEnum.SUCCESS.getStatus()); o.setBeginTime(buildTime(2021, 1, 8)); o.setEndTime(buildTime(2021, 1, 8)); }); @@ -155,16 +149,16 @@ public class InfJobLogServiceTest extends BaseDbUnitTest { // 测试 endTime 不匹配 jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); // 测试 status 不匹配 - jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus()))); + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setStatus(JobLogStatusEnum.FAILURE.getStatus()))); // 准备参数 - InfJobLogExportReqVO reqVo = new InfJobLogExportReqVO(); + JobLogExportReqVO reqVo = new JobLogExportReqVO(); reqVo.setJobId(dbJobLog.getJobId()); reqVo.setHandlerName("单元"); reqVo.setBeginTime(dbJobLog.getBeginTime()); reqVo.setEndTime(dbJobLog.getEndTime()); - reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); + reqVo.setStatus(JobLogStatusEnum.SUCCESS.getStatus()); // 调用 - List list = jobLogService.getJobLogList(reqVo); + List list = jobLogService.getJobLogList(reqVo); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbJobLog, list.get(0)); diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobServiceTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceTest.java similarity index 62% rename from yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobServiceTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceTest.java index 6fd5acaea2..cfbeb307bf 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/InfJobServiceTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceTest.java @@ -1,12 +1,7 @@ package cn.iocoder.yudao.module.infra.service.job; import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_EQUALS; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_INVALID; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_CRON_EXPRESSION_VALID; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_HANDLER_EXISTS; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_NOT_EXISTS; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.JOB_UPDATE_ONLY_NORMAL_STATUS; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; @@ -23,44 +18,38 @@ import java.util.List; import javax.annotation.Resource; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import cn.iocoder.yudao.module.infra.convert.job.JobConvert; +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; +import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.quartz.SchedulerException; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.yudao.module.infra.convert.job.InfJobConvert; -import cn.iocoder.yudao.module.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.yudao.module.infra.dal.mysql.job.InfJobMapper; -import cn.iocoder.yudao.module.infra.enums.job.InfJobStatusEnum; -import cn.iocoder.yudao.module.infra.service.job.impl.InfJobServiceImpl; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import cn.iocoder.yudao.module.infra.dal.mysql.job.JobMapper; +import cn.iocoder.yudao.module.infra.enums.job.JobStatusEnum; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -/** - * {@link InfJobServiceImpl} 的单元测试 - * - * @author neilz - */ -@Import(InfJobServiceImpl.class) -public class InfJobServiceTest extends BaseDbUnitTest { +@Import(JobServiceImpl.class) +public class JobServiceTest extends BaseDbUnitTest { @Resource - private InfJobServiceImpl jobService; + private JobServiceImpl jobService; @Resource - private InfJobMapper jobMapper; + private JobMapper jobMapper; @MockBean private SchedulerManager schedulerManager; @Test public void testCreateJob_cronExpressionValid() { // 准备参数。Cron 表达式为 String 类型,默认随机字符串。 - InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class); + JobCreateReqVO reqVO = randomPojo(JobCreateReqVO.class); // 调用,并断言异常 assertServiceException(() -> jobService.createJob(reqVO), JOB_CRON_EXPRESSION_VALID); } @@ -68,7 +57,7 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testCreateJob_jobHandlerExists() throws SchedulerException { // 准备参数 指定 Cron 表达式 - InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobCreateReqVO reqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); // 调用 jobService.createJob(reqVO); // 调用,并断言异常 @@ -78,15 +67,15 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testCreateJob_success() throws SchedulerException { // 准备参数 指定 Cron 表达式 - InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobCreateReqVO reqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); // 调用 Long jobId = jobService.createJob(reqVO); // 断言 assertNotNull(jobId); // 校验记录的属性是否正确 - InfJobDO job = jobMapper.selectById(jobId); + JobDO job = jobMapper.selectById(jobId); assertPojoEquals(reqVO, job); - assertEquals(InfJobStatusEnum.NORMAL.getStatus(), job.getStatus()); + assertEquals(JobStatusEnum.NORMAL.getStatus(), job.getStatus()); // 校验调用 verify(schedulerManager, times(1)).addJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam()), eq(job.getCronExpression()), eq(reqVO.getRetryCount()), eq(reqVO.getRetryInterval())); @@ -95,7 +84,7 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testUpdateJob_jobNotExists(){ // 准备参数 - InfJobUpdateReqVO reqVO = randomPojo(InfJobUpdateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobUpdateReqVO reqVO = randomPojo(JobUpdateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); // 调用,并断言异常 assertServiceException(() -> jobService.updateJob(reqVO), JOB_NOT_EXISTS); } @@ -103,13 +92,13 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testUpdateJob_onlyNormalStatus(){ // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.INIT.getStatus()); + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.INIT.getStatus()); fillJobMonitorTimeoutEmpty(job); jobMapper.insert(job); // 准备参数 - InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> { + JobUpdateReqVO updateReqVO = randomPojo(JobUpdateReqVO.class, o -> { o.setId(job.getId()); o.setName(createReqVO.getName()); o.setCronExpression(createReqVO.getCronExpression()); @@ -121,13 +110,13 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testUpdateJob_success() throws SchedulerException { // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); fillJobMonitorTimeoutEmpty(job); jobMapper.insert(job); // 准备参数 - InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> { + JobUpdateReqVO updateReqVO = randomPojo(JobUpdateReqVO.class, o -> { o.setId(job.getId()); o.setName(createReqVO.getName()); o.setCronExpression(createReqVO.getCronExpression()); @@ -135,7 +124,7 @@ public class InfJobServiceTest extends BaseDbUnitTest { // 调用 jobService.updateJob(updateReqVO); // 校验记录的属性是否正确 - InfJobDO updateJob = jobMapper.selectById(updateReqVO.getId()); + JobDO updateJob = jobMapper.selectById(updateReqVO.getId()); assertPojoEquals(updateReqVO, updateJob); // 校验调用 verify(schedulerManager, times(1)).updateJob(eq(job.getHandlerName()), eq(updateReqVO.getHandlerParam()), eq(updateReqVO.getCronExpression()), @@ -145,15 +134,15 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testUpdateJobStatus_changeStatusInvalid() { // 调用,并断言异常 - assertServiceException(() -> jobService.updateJobStatus(1l, InfJobStatusEnum.INIT.getStatus()), JOB_CHANGE_STATUS_INVALID); + assertServiceException(() -> jobService.updateJobStatus(1L, JobStatusEnum.INIT.getStatus()), JOB_CHANGE_STATUS_INVALID); } @Test public void testUpdateJobStatus_changeStatusEquals() { // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); fillJobMonitorTimeoutEmpty(job); jobMapper.insert(job); // 调用,并断言异常 @@ -163,16 +152,16 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testUpdateJobStatus_NormalToStop_success() throws SchedulerException { // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); fillJobMonitorTimeoutEmpty(job); jobMapper.insert(job); // 调用 - jobService.updateJobStatus(job.getId(), InfJobStatusEnum.STOP.getStatus()); + jobService.updateJobStatus(job.getId(), JobStatusEnum.STOP.getStatus()); // 校验记录的属性是否正确 - InfJobDO updateJob = jobMapper.selectById(job.getId()); - assertEquals(InfJobStatusEnum.STOP.getStatus(), updateJob.getStatus()); + JobDO updateJob = jobMapper.selectById(job.getId()); + assertEquals(JobStatusEnum.STOP.getStatus(), updateJob.getStatus()); // 校验调用 verify(schedulerManager, times(1)).pauseJob(eq(job.getHandlerName())); } @@ -180,16 +169,16 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testUpdateJobStatus_StopToNormal_success() throws SchedulerException { // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.STOP.getStatus()); + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.STOP.getStatus()); fillJobMonitorTimeoutEmpty(job); jobMapper.insert(job); // 调用 - jobService.updateJobStatus(job.getId(), InfJobStatusEnum.NORMAL.getStatus()); + jobService.updateJobStatus(job.getId(), JobStatusEnum.NORMAL.getStatus()); // 校验记录的属性是否正确 - InfJobDO updateJob = jobMapper.selectById(job.getId()); - assertEquals(InfJobStatusEnum.NORMAL.getStatus(), updateJob.getStatus()); + JobDO updateJob = jobMapper.selectById(job.getId()); + assertEquals(JobStatusEnum.NORMAL.getStatus(), updateJob.getStatus()); // 校验调用 verify(schedulerManager, times(1)).resumeJob(eq(job.getHandlerName())); } @@ -197,9 +186,9 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testTriggerJob_success() throws SchedulerException { // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); fillJobMonitorTimeoutEmpty(job); jobMapper.insert(job); // 调用 @@ -211,9 +200,9 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testDeleteJob_success() throws SchedulerException { // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); fillJobMonitorTimeoutEmpty(job); jobMapper.insert(job); // 调用 UPDATE inf_job SET deleted=1 WHERE id=? AND deleted=0 @@ -227,19 +216,19 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testGetJobListByIds_success() { // mock 数据 - InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { - o.setStatus(randomEle(InfJobStatusEnum.values()).getStatus()); // 保证 status 的范围 + JobDO dbJob = randomPojo(JobDO.class, o -> { + o.setStatus(randomEle(JobStatusEnum.values()).getStatus()); // 保证 status 的范围 }); - InfJobDO cloneJob = ObjectUtils.cloneIgnoreId(dbJob, o -> o.setHandlerName(randomString())); + JobDO cloneJob = ObjectUtils.cloneIgnoreId(dbJob, o -> o.setHandlerName(randomString())); jobMapper.insert(dbJob); // 测试 handlerName 不匹配 jobMapper.insert(cloneJob); // 准备参数 - ArrayList ids = new ArrayList<>(); + ArrayList ids = new ArrayList<>(); ids.add(dbJob.getId()); ids.add(cloneJob.getId()); // 调用 - List list = jobService.getJobList(ids); + List list = jobService.getJobList(ids); // 断言 assertEquals(2, list.size()); assertPojoEquals(dbJob, list.get(0)); @@ -248,25 +237,25 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testGetJobPage_success() { // mock 数据 - InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { + JobDO dbJob = randomPojo(JobDO.class, o -> { o.setName("定时任务测试"); o.setHandlerName("handlerName 单元测试"); - o.setStatus(InfJobStatusEnum.INIT.getStatus()); + o.setStatus(JobStatusEnum.INIT.getStatus()); }); jobMapper.insert(dbJob); // 测试 name 不匹配 jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setName("土豆"))); // 测试 status 不匹配 - jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus()))); + jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setStatus(JobStatusEnum.NORMAL.getStatus()))); // 测试 handlerName 不匹配 jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setHandlerName(randomString()))); // 准备参数 - InfJobPageReqVO reqVo = new InfJobPageReqVO(); + JobPageReqVO reqVo = new JobPageReqVO(); reqVo.setName("定时"); - reqVo.setStatus(InfJobStatusEnum.INIT.getStatus()); + reqVo.setStatus(JobStatusEnum.INIT.getStatus()); reqVo.setHandlerName("单元"); // 调用 - PageResult pageResult = jobService.getJobPage(reqVo); + PageResult pageResult = jobService.getJobPage(reqVo); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -276,31 +265,31 @@ public class InfJobServiceTest extends BaseDbUnitTest { @Test public void testGetJobListForExport_success() { // mock 数据 - InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { + JobDO dbJob = randomPojo(JobDO.class, o -> { o.setName("定时任务测试"); o.setHandlerName("handlerName 单元测试"); - o.setStatus(InfJobStatusEnum.INIT.getStatus()); + o.setStatus(JobStatusEnum.INIT.getStatus()); }); jobMapper.insert(dbJob); // 测试 name 不匹配 jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setName("土豆"))); // 测试 status 不匹配 - jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus()))); + jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setStatus(JobStatusEnum.NORMAL.getStatus()))); // 测试 handlerName 不匹配 jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setHandlerName(randomString()))); // 准备参数 - InfJobExportReqVO reqVo = new InfJobExportReqVO(); + JobExportReqVO reqVo = new JobExportReqVO(); reqVo.setName("定时"); - reqVo.setStatus(InfJobStatusEnum.INIT.getStatus()); + reqVo.setStatus(JobStatusEnum.INIT.getStatus()); reqVo.setHandlerName("单元"); // 调用 - List list = jobService.getJobList(reqVo); + List list = jobService.getJobList(reqVo); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbJob, list.get(0)); } - private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { + private static void fillJobMonitorTimeoutEmpty(JobDO job) { if (job.getMonitorTimeout() == null) { job.setMonitorTimeout(0); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogServiceImplTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImplTest.java similarity index 54% rename from yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogServiceImplTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImplTest.java index 86e2fa9ddf..0b1b3d9327 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiAccessLogServiceImplTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImplTest.java @@ -1,16 +1,17 @@ package cn.iocoder.yudao.module.infra.service.logger; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.yudao.module.infra.dal.mysql.logger.InfApiAccessLogMapper; -import cn.iocoder.yudao.module.infra.service.logger.impl.InfApiAccessLogServiceImpl; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper; +import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -18,22 +19,19 @@ import javax.annotation.Resource; import java.util.Date; import java.util.List; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -/** - * {@link InfApiAccessLogServiceImpl} 单元测试 - */ -@Import(InfApiAccessLogServiceImpl.class) -public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { +@Import(ApiAccessLogServiceImpl.class) +public class ApiAccessLogServiceImplTest extends BaseDbUnitTest { @Resource - private InfApiAccessLogService infApiAccessLogServiceImpl; + private ApiAccessLogService apiAccessLogService; @Resource - private InfApiAccessLogMapper infApiAccessLogMapper; + private ApiAccessLogMapper apiAccessLogMapper; @Test public void testGetApiAccessLogPage() { @@ -46,7 +44,7 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { int duration = 1000; int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); - InfApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(InfApiAccessLogDO.class, dto -> { + ApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(ApiAccessLogDO.class, dto -> { dto.setUserId(userId); dto.setUserType(userType); dto.setApplicationName(applicationName); @@ -55,26 +53,26 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { dto.setDuration(duration); dto.setResultCode(resultCode); }); - infApiAccessLogMapper.insert(infApiAccessLogDO); + apiAccessLogMapper.insert(infApiAccessLogDO); // 下面几个都是不匹配的数据 // userId 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); // userType - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); // applicationName 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); // requestUrl 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); // 构造一个早期时间 2021-02-06 00:00:00 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); // duration 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setDuration(100))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setDuration(100))); // resultCode 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); // 构造调用参数 - InfApiAccessLogPageReqVO reqVO = new InfApiAccessLogPageReqVO(); + ApiAccessLogPageReqVO reqVO = new ApiAccessLogPageReqVO(); reqVO.setUserId(userId); reqVO.setUserType(userType); reqVO.setApplicationName(applicationName); @@ -85,7 +83,7 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { reqVO.setResultCode(resultCode); // 调用service方法 - PageResult pageResult = infApiAccessLogServiceImpl.getApiAccessLogPage(reqVO); + PageResult pageResult = apiAccessLogService.getApiAccessLogPage(reqVO); // 断言,只查到了一条符合条件的 assertEquals(1, pageResult.getTotal()); @@ -104,7 +102,7 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { int duration = 1000; int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); - InfApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(InfApiAccessLogDO.class, dto -> { + ApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(ApiAccessLogDO.class, dto -> { dto.setUserId(userId); dto.setUserType(userType); dto.setApplicationName(applicationName); @@ -113,26 +111,26 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { dto.setDuration(duration); dto.setResultCode(resultCode); }); - infApiAccessLogMapper.insert(infApiAccessLogDO); + apiAccessLogMapper.insert(infApiAccessLogDO); // 下面几个都是不匹配的数据 // userId 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); // userType - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); // applicationName 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); // requestUrl 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); // 构造一个早期时间 2021-02-06 00:00:00 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); // duration 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setDuration(100))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setDuration(100))); // resultCode 不同的 - infApiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); // 构造调用参数 - InfApiAccessLogExportReqVO reqVO = new InfApiAccessLogExportReqVO(); + ApiAccessLogExportReqVO reqVO = new ApiAccessLogExportReqVO(); reqVO.setUserId(userId); reqVO.setUserType(userType); reqVO.setApplicationName(applicationName); @@ -143,11 +141,26 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { reqVO.setResultCode(resultCode); // 调用service方法 - List list = infApiAccessLogServiceImpl.getApiAccessLogList(reqVO); + List list = apiAccessLogService.getApiAccessLogList(reqVO); // 断言,只查到了一条符合条件的 assertEquals(1, list.size()); assertPojoEquals(infApiAccessLogDO, list.get(0)); } + @Test + public void testCreateApiAccessLogAsync() { + // 准备参数 + ApiAccessLogCreateReqDTO createDTO = RandomUtils.randomPojo(ApiAccessLogCreateReqDTO.class, + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue())); + + // 调用 + apiAccessLogService.createApiAccessLogAsync(createDTO); + // 断言 + ApiAccessLogDO infApiAccessLogDO = apiAccessLogMapper.selectOne(null); + assertNotNull(infApiAccessLogDO); + assertPojoEquals(createDTO, infApiAccessLogDO); + } + + } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogServiceImplTest.java b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImplTest.java similarity index 65% rename from yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogServiceImplTest.java rename to yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImplTest.java index 89081277ad..9b24d59875 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/InfApiErrorLogServiceImplTest.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImplTest.java @@ -1,16 +1,17 @@ package cn.iocoder.yudao.module.infra.service.logger; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.yudao.module.infra.dal.mysql.logger.InfApiErrorLogMapper; -import cn.iocoder.yudao.module.infra.enums.logger.InfApiErrorLogProcessStatusEnum; -import cn.iocoder.yudao.module.infra.service.logger.impl.InfApiErrorLogServiceImpl; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDTO; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper; +import cn.iocoder.yudao.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -19,24 +20,22 @@ import javax.annotation.Resource; import java.util.Date; import java.util.List; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; -import static cn.iocoder.yudao.module.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_PROCESSED; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; -/** - * {@link InfApiErrorLogServiceImpl} 单元测试 - */ -@Import(InfApiErrorLogServiceImpl.class) -public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { +@Import(ApiErrorLogServiceImpl.class) +public class ApiErrorLogServiceImplTest extends BaseDbUnitTest { @Resource - private InfApiErrorLogService infApiErrorLogServiceImpl; + private ApiErrorLogServiceImpl apiErrorLogService; @Resource - private InfApiErrorLogMapper infApiErrorLogMapper; + private ApiErrorLogMapper infApiErrorLogMapper; @Test public void testGetApiErrorLogPage() { @@ -46,9 +45,9 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { String applicationName = "yudao-test"; String requestUrl = "foo"; Date beginTime = buildTime(2021, 3, 13); - int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); + int progressStatus = ApiErrorLogProcessStatusEnum.INIT.getStatus(); - InfApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + ApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(ApiErrorLogDO.class, logDO -> { logDO.setUserId(userId); logDO.setUserType(userType); logDO.setApplicationName(applicationName); @@ -70,10 +69,10 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { // 构造一个早期时间 2021-02-06 00:00:00 infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); // progressStatus 不同的 - infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()))); + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.DONE.getStatus()))); // 构造调用参数 - InfApiErrorLogPageReqVO reqVO = new InfApiErrorLogPageReqVO(); + ApiErrorLogPageReqVO reqVO = new ApiErrorLogPageReqVO(); reqVO.setUserId(userId); reqVO.setUserType(userType); reqVO.setApplicationName(applicationName); @@ -83,7 +82,7 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { reqVO.setProcessStatus(progressStatus); // 调用service方法 - PageResult pageResult = infApiErrorLogServiceImpl.getApiErrorLogPage(reqVO); + PageResult pageResult = apiErrorLogService.getApiErrorLogPage(reqVO); // 断言,只查到了一条符合条件的 assertEquals(1, pageResult.getTotal()); @@ -99,9 +98,9 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { String applicationName = "yudao-test"; String requestUrl = "foo"; Date beginTime = buildTime(2021, 3, 13); - int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); + int progressStatus = ApiErrorLogProcessStatusEnum.INIT.getStatus(); - InfApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + ApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(ApiErrorLogDO.class, logDO -> { logDO.setUserId(userId); logDO.setUserType(userType); logDO.setApplicationName(applicationName); @@ -123,10 +122,10 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { // 构造一个早期时间 2021-02-06 00:00:00 infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); // progressStatus 不同的 - infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()))); + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.DONE.getStatus()))); // 构造调用参数 - InfApiErrorLogExportReqVO reqVO = new InfApiErrorLogExportReqVO(); + ApiErrorLogExportReqVO reqVO = new ApiErrorLogExportReqVO(); reqVO.setUserId(userId); reqVO.setUserType(userType); reqVO.setApplicationName(applicationName); @@ -136,7 +135,7 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { reqVO.setProcessStatus(progressStatus); // 调用service方法 - List list = infApiErrorLogServiceImpl.getApiErrorLogList(reqVO); + List list = apiErrorLogService.getApiErrorLogList(reqVO); // 断言,只查到了一条符合条件的 assertEquals(1, list.size()); @@ -144,22 +143,23 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { } + // TODO 芋艿:单元测试,可以拆小一点 @Test public void testUpdateApiErrorLogProcess() { // 先构造两条数据,第一条用于抛出异常,第二条用于正常的执行update操作 Long processUserId = 2233L; - InfApiErrorLogDO first = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + ApiErrorLogDO first = RandomUtils.randomPojo(ApiErrorLogDO.class, logDO -> { logDO.setProcessUserId(processUserId); logDO.setUserType(UserTypeEnum.ADMIN.getValue()); - logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()); + logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.DONE.getStatus()); }); infApiErrorLogMapper.insert(first); - InfApiErrorLogDO second = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + ApiErrorLogDO second = RandomUtils.randomPojo(ApiErrorLogDO.class, logDO -> { logDO.setProcessUserId(1122L); logDO.setUserType(UserTypeEnum.ADMIN.getValue()); - logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus()); + logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); }); infApiErrorLogMapper.insert(second); @@ -167,17 +167,31 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { Long secondId = second.getId(); // 执行正常的 update 操作 - infApiErrorLogServiceImpl.updateApiErrorLogProcess(secondId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId); - InfApiErrorLogDO secondSelect = infApiErrorLogMapper.selectOne("id", secondId); + apiErrorLogService.updateApiErrorLogProcess(secondId, ApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId); + ApiErrorLogDO secondSelect = infApiErrorLogMapper.selectOne("id", secondId); // id 为 0 查询不到,应该抛出异常 API_ERROR_LOG_NOT_FOUND - assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(0L, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_NOT_FOUND); + assertServiceException(() -> apiErrorLogService.updateApiErrorLogProcess(0L, ApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_NOT_FOUND); // id 为 first 的 progressStatus 为 DONE ,应该抛出 API_ERROR_LOG_PROCESSED - assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(firstId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_PROCESSED); + assertServiceException(() -> apiErrorLogService.updateApiErrorLogProcess(firstId, ApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_PROCESSED); // 验证 progressStatus 是否修改成功 - Assertions.assertEquals(InfApiErrorLogProcessStatusEnum.DONE.getStatus(), secondSelect.getProcessStatus()); + Assertions.assertEquals(ApiErrorLogProcessStatusEnum.DONE.getStatus(), secondSelect.getProcessStatus()); // 验证 progressUserId 是否修改成功 Assertions.assertEquals(processUserId, secondSelect.getProcessUserId()); } + @Test + public void testCreateApiErrorLogAsync() { + // 准备参数 + ApiErrorLogCreateReqDTO createDTO = RandomUtils.randomPojo(ApiErrorLogCreateReqDTO.class, + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue())); + + // 调用 + apiErrorLogService.createApiErrorLogAsync(createDTO); + // 断言 + ApiErrorLogDO infApiErrorLogDO = infApiErrorLogMapper.selectOne(null); + assertNotNull(infApiErrorLogDO); + assertPojoEquals(createDTO, infApiErrorLogDO); + } + } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000000..6f83b473aa --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml @@ -0,0 +1,54 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具 + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +yudao: + info: + base-package: cn.iocoder.yudao.module.member.dal.mysql + base-package2: cn.iocoder.yudao.module + core-service: + base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 + captcha: + timeout: 5m + width: 160 + height: 60 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/logback-spring.xml b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/logback-spring.xml new file mode 100644 index 0000000000..daf756bff0 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/logback-spring.xml @@ -0,0 +1,4 @@ + + + + diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/clean.sql b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/clean.sql new file mode 100644 index 0000000000..edf0e8ddf8 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/clean.sql @@ -0,0 +1,6 @@ +DELETE FROM "infra_config"; +DELETE FROM "infra_file"; +DELETE FROM "infra_job"; +DELETE FROM "infra_job_log"; +DELETE FROM "infra_api_access_log"; +DELETE FROM "infra_api_error_log"; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/create_tables.sql b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000000..2ec26d220e --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/create_tables.sql @@ -0,0 +1,67 @@ + +CREATE TABLE IF NOT EXISTS "infra_config" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "group" varchar(50) NOT NULL, + "type" tinyint NOT NULL, + "name" varchar(100) NOT NULL DEFAULT '', + "key" varchar(100) NOT NULL DEFAULT '', + "value" varchar(500) NOT NULL DEFAULT '', + "sensitive" bit NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") + ) COMMENT '参数配置表'; + +CREATE TABLE IF NOT EXISTS "infra_file" ( + "id" varchar(188) NOT NULL, + "type" varchar(63) DEFAULT NULL, + "content" blob NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") + ) COMMENT '文件表'; + +CREATE TABLE IF NOT EXISTS "infra_job" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', + "name" varchar(32) NOT NULL COMMENT '任务名称', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', + "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', + "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") + ) COMMENT='定时任务表'; + +CREATE TABLE IF NOT EXISTS "infra_job_log" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', + "job_id" bigint(20) NOT NULL COMMENT '任务编号', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行', + "begin_time" datetime NOT NULL COMMENT '开始执行时间', + "end_time" datetime DEFAULT NULL COMMENT '结束执行时间', + "duration" int(11) DEFAULT NULL COMMENT '执行时长', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "result" varchar(4000) DEFAULT '' COMMENT '结果数据', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") + )COMMENT='定时任务日志表'; diff --git a/yudao-module-member/yudao-module-member-impl/pom.xml b/yudao-module-member/yudao-module-member-impl/pom.xml index d3b6bd7eed..9307d30d47 100644 --- a/yudao-module-member/yudao-module-member-impl/pom.xml +++ b/yudao-module-member/yudao-module-member-impl/pom.xml @@ -23,28 +23,30 @@ yudao-module-member-api ${revision} - cn.iocoder.boot yudao-module-system-api ${revision} + + cn.iocoder.boot + yudao-module-infra-api + ${revision} + - - cn.iocoder.boot - yudao-core-service - - cn.iocoder.boot yudao-spring-boot-starter-biz-operatelog - cn.iocoder.boot yudao-spring-boot-starter-biz-weixin + + cn.iocoder.boot + yudao-spring-boot-starter-biz-tenant + diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index 625daf8786..ad12b40a69 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.member.service.user; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; -import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; @@ -39,7 +39,7 @@ public class MemberUserServiceImpl implements MemberUserService { private MemberUserMapper memberUserMapper; @Resource - private InfFileCoreService fileCoreService; + private FileApi fileApi; @Resource private SmsCodeApi smsCodeApi; @@ -103,7 +103,7 @@ public class MemberUserServiceImpl implements MemberUserService { public String updateUserAvatar(Long userId, InputStream avatarFile) { this.checkUserExists(userId); // 创建文件 - String avatar = fileCoreService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); + String avatar = fileApi.createFile(IoUtil.readBytes(avatarFile)); // 更新头像路径 memberUserMapper.updateById(MemberUserDO.builder().id(userId).avatar(avatar).build()); return avatar; diff --git a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java index f470e95ae8..46d72091ce 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java +++ b/yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.module.member.service.user; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; @@ -48,14 +48,13 @@ public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { @MockBean private MemberAuthServiceImpl authService; - @MockBean - private InfFileCoreService fileCoreService; - @MockBean private PasswordEncoder passwordEncoder; @MockBean private SmsCodeApi smsCodeApi; + @MockBean + private FileApi fileApi; @Test public void testUpdateNickName_success(){ @@ -86,7 +85,7 @@ public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes); // mock 方法 String avatar = randomString(); - when(fileCoreService.createFile(anyString(), eq(avatarFileBytes))).thenReturn(avatar); + when(fileApi.createFile(eq(avatarFileBytes))).thenReturn(avatar); // 调用 String str = memberUserService.updateUserAvatar(userId, avatarFile); // 断言 diff --git a/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml b/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml index 212a9312be..42e5e356dd 100644 --- a/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml +++ b/yudao-module-member/yudao-module-member-impl/src/test/resources/application-unit-test.yaml @@ -45,7 +45,6 @@ mybatis: yudao: info: base-package: cn.iocoder.yudao.module.member.dal.mysql - member-package: cn.iocoder.yudao.module.member # TODO 芋艿:要清理掉 - system-package: cn.iocoder.yudao.module.system # TODO 芋艿:要清理掉 + base-package2: cn.iocoder.yudao.module core-service: base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java similarity index 99% rename from yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index 7ae00aa2a1..9b73264e14 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -15,7 +15,6 @@ public interface DictTypeConstants { String LOGIN_TYPE = "sys_login_type"; // 登录日志的类型 String LOGIN_RESULT = "sys_login_result"; // 登录结果 - String SMS_CHANNEL_CODE = "sys_sms_channel_code"; // 短信渠道编码 String SMS_TEMPLATE_TYPE = "sys_sms_template_type"; // 短信模板类型 String SMS_SEND_STATUS = "sys_sms_send_status"; // 短信发送状态 diff --git a/yudao-module-system/yudao-module-system-impl/pom.xml b/yudao-module-system/yudao-module-system-impl/pom.xml index 40f9d8aaa5..ecf9d967f8 100644 --- a/yudao-module-system/yudao-module-system-impl/pom.xml +++ b/yudao-module-system/yudao-module-system-impl/pom.xml @@ -28,13 +28,13 @@ yudao-module-member-api ${revision} - - cn.iocoder.boot - yudao-core-service + yudao-module-infra-api + ${revision} + cn.iocoder.boot yudao-spring-boot-starter-biz-operatelog @@ -43,10 +43,22 @@ cn.iocoder.boot yudao-spring-boot-starter-biz-sms + + cn.iocoder.boot + yudao-spring-boot-starter-biz-dict + cn.iocoder.boot yudao-spring-boot-starter-biz-data-permission + + cn.iocoder.boot + yudao-spring-boot-starter-biz-tenant + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-social + diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.http b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.http index 0b1cf854bf..2033fac315 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.http +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/common/CaptchaController.http @@ -1,2 +1,3 @@ ### 请求 /captcha/get-image 接口 => 成功 GET {{baseUrl}}/system/captcha/get-image +tenant-id: {{adminTenentId}} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index e150d598d7..8f308a0c76 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -4,11 +4,11 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; @@ -56,8 +56,9 @@ public class AdminUserServiceImpl implements AdminUserService { private PermissionService permissionService; @Resource private PasswordEncoder passwordEncoder; + @Resource - private InfFileCoreService fileService; + private FileApi fileApi; @Override public Long createUser(UserCreateReqVO reqVO) { @@ -111,7 +112,7 @@ public class AdminUserServiceImpl implements AdminUserService { public String updateUserAvatar(Long id, InputStream avatarFile) { this.checkUserExists(id); // 存储文件 - String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); + String avatar = fileApi.createFile(IoUtil.readBytes(avatarFile)); // 更新路径 AdminUserDO sysUserDO = new AdminUserDO(); sysUserDO.setId(id); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java index ffff7e2bdd..0beb281c52 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java @@ -1,13 +1,13 @@ package cn.iocoder.yudao.module.system.service.user; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; @@ -63,7 +63,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { @MockBean private PasswordEncoder passwordEncoder; @MockBean - private InfFileCoreService fileService; + private FileApi fileApi; @Test public void testCreatUser_success() { @@ -182,7 +182,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes); // mock 方法 String avatar = randomString(); - when(fileService.createFile(anyString(), eq(avatarFileBytes))).thenReturn(avatar); + when(fileApi.createFile(eq(avatarFileBytes))).thenReturn(avatar); // 调用 userService.updateUserAvatar(userId, avatarFile); diff --git a/yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml b/yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml index 9164b07e60..6f83b473aa 100644 --- a/yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml +++ b/yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml @@ -45,8 +45,7 @@ mybatis: yudao: info: base-package: cn.iocoder.yudao.module.member.dal.mysql - member-package: cn.iocoder.yudao.module.member # TODO 芋艿:要清理掉 - system-package: cn.iocoder.yudao.module.system # TODO 芋艿:要清理掉 + base-package2: cn.iocoder.yudao.module core-service: base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 captcha: diff --git a/更新日志.md b/更新日志.md index 13fc8320bf..cf15885154 100644 --- a/更新日志.md +++ b/更新日志.md @@ -27,6 +27,7 @@ *【修复】用户无权限访问 指定 API 时,未返回 FORBIDDEN 结果码 *【修复】定时任务刷新本地缓存时,无租户上线文,导致查询报错 +*【修复】配置中心只加载了删除的配置 ### 🔨 Dependency Upgrades From fffd023d31cffecade150c78aa1932ca245ae34a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 18:05:19 +0800 Subject: [PATCH 21/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=205=EF=BC=9Ainfra=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/resources/application-unit-test.yaml | 53 ----- .../src/test/resources/application.yaml | 35 --- .../src/test/resources/file/erweima.jpg | Bin 18385 -> 0 bytes .../src/test/resources/logback-spring.xml | 4 - .../src/test/resources/sql/clean.sql | 11 - .../src/test/resources/sql/create_tables.sql | 199 ------------------ .../admin/job/vo/job/JobExportReqVO.java | 2 +- .../admin/job/vo/job/JobPageReqVO.java | 2 +- .../admin/job/vo/log/JobLogBaseVO.java | 2 +- .../admin/job/vo/log/JobLogExportReqVO.java | 4 +- .../admin/job/vo/log/JobLogPageReqVO.java | 2 +- .../apiaccesslog/ApiAccessLogExportReqVO.java | 2 +- .../apierrorlog/ApiErrorLogExportReqVO.java | 2 +- .../infra/dal/dataobject/config/ConfigDO.java | 3 +- .../dal/dataobject/logger/ApiErrorLogDO.java | 3 +- ...figCoreDAOImpl.java => ConfigDAOImpl.java} | 6 +- .../framework/file/config/FileProperties.java | 2 +- .../test/resources/application-unit-test.yaml | 4 - .../src/test/resources/sql/clean.sql | 3 + .../src/test/resources/sql/create_tables.sql | 78 ++++++- 20 files changed, 93 insertions(+), 324 deletions(-) delete mode 100644 yudao-core-service/src/test/resources/application-unit-test.yaml delete mode 100644 yudao-core-service/src/test/resources/application.yaml delete mode 100644 yudao-core-service/src/test/resources/file/erweima.jpg delete mode 100644 yudao-core-service/src/test/resources/logback-spring.xml delete mode 100644 yudao-core-service/src/test/resources/sql/clean.sql delete mode 100644 yudao-core-service/src/test/resources/sql/create_tables.sql rename yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/{ConfigCoreDAOImpl.java => ConfigDAOImpl.java} (86%) diff --git a/yudao-core-service/src/test/resources/application-unit-test.yaml b/yudao-core-service/src/test/resources/application-unit-test.yaml deleted file mode 100644 index d360045b9c..0000000000 --- a/yudao-core-service/src/test/resources/application-unit-test.yaml +++ /dev/null @@ -1,53 +0,0 @@ -spring: - main: - lazy-initialization: true # 开启懒加载,加快速度 - banner-mode: off # 单元测试,禁用 Banner - ---- #################### 数据库相关配置 #################### - -spring: -# sql: -# init: -# schema-locations: classpath:sql/create_tables.sql -# username: sa -# password: -# enabled: true - # 数据源配置项 - datasource: - name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 - driver-class-name: org.h2.Driver - username: sa - password: - schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具 - druid: - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 - initial-size: 1 # 单元测试,配置为 1,提升启动速度 - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - redis: - host: 127.0.0.1 # 地址 - port: 16379 # 端口(单元测试,使用 16379 端口) - database: 0 # 数据库索引 - integration: - jdbc: - initialize-schema: - -mybatis: - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 - ---- #################### 定时任务相关配置 #################### - ---- #################### 配置中心相关配置 #################### - ---- #################### 服务保障相关配置 #################### - -# Lock4j 配置项(单元测试,禁用 Lock4j) - -# Resilience4j 配置项 - ---- #################### 监控相关配置 #################### - ---- #################### 芋道相关配置 #################### - -# 芋道配置项,设置当前项目所有自定义的配置 diff --git a/yudao-core-service/src/test/resources/application.yaml b/yudao-core-service/src/test/resources/application.yaml deleted file mode 100644 index 4db8b273cd..0000000000 --- a/yudao-core-service/src/test/resources/application.yaml +++ /dev/null @@ -1,35 +0,0 @@ -spring: - application: - name: yudao-core-service - - # Jackson 配置项 - jackson: - serialization: - write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 - write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 - write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 - fail-on-empty-beans: false # 允许序列化无属性的 Bean - -# MyBatis Plus 的配置项 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 - global-config: - db-config: - id-type: AUTO # 自增 ID - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - mapper-locations: classpath*:mapper/*.xml - type-aliases-package: ${yudao.core-service.base-package}.modules.*.dal.dataobject - ---- #################### 芋道相关配置 #################### - -yudao: - info: - version: 1.0.0 - base-package: cn.iocoder.yudao.coreservice - core-service: - base-package: cn.iocoder.yudao.coreservice - -debug: false diff --git a/yudao-core-service/src/test/resources/file/erweima.jpg b/yudao-core-service/src/test/resources/file/erweima.jpg deleted file mode 100644 index 1447283cdf1b49b51c1204a160e01cb789e957a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18385 zcmb7s2Rzm9+yCL%A+xNq$sv0yBYV$7${yL72_=by>^(#Fv7$0Ev!kp?5wb^FWrg_P zpQHMH%lG#@|3|%E9nLwQao^YbdXMYm@crQ@7>SC4vH}bP0|vtYe_)5BFj*KJ6BGIi zzOcYwY&>jiEG%pSTwEMHLIOg<69gwt5D}A+5D}9SpEyBsiiDJ$f|8Pw@Z@Q#QxsHW z6qFRuK``LpJy_WI*x2|KL??(S{?A{B%`j3t3``76I0h*UlN19^igDNqI}3xsF@Ao* zj=u2laWQZRFtM=V;CVW5C*U2>{rvjEz{bSF!G+@;j=%`v;8_wl33v)+_Urjy|Kg$_ zEYOL&EWqgCnJzFG_?HFa?p@d+?8NuGcTew3GT`ns5n#fwFfbc17@A-w_F=eqSjKR; zC??8VnnQ-OJ&kBTmB9>~jf6qSOyt`gO6|87%2A|djZH9@yYjjWB&Ro!>ROqY1@<|Y zc|P4G(mthFSx+S#-!Mn8dyS3^ETUjdRAj&UIql~S&E5+R@66)&C29)F?Sy-m-fmrFjj`}75A z#U0`pyj^w}Jn#_4-||4(p0Hr(zTObg<@h{(A+|jGdrzzt^sksBg=A19CU2m;|q@V?(-Q-TUlUHCcE>k7!N!Q88=Kd@gvmHAV_*V?R zN)s3OQ!d<})?>Y&3!RfW5R+#OM#n&EN(jqjk3PEK0z7ZcUYu)B7S=2Vo-*QoNoCHn zw@GBdFntXheD%!tA`GJ$<5XH#(337KtVKju9-?hsD(4U;Fr8o=__^`&>jU+xHuPUx z)gHq2tu1#E?ICdG819;K7EXX(_bCpU`;0zj6^>9*kVL8@Z05s-n{0 z5%j%t)VuM_a-GwVRAceS^+OoF%pr_@=(cg-7kl#MVz(AuXj4h}TM+zD7v*5YWUw1@ zcugl%%y3{*?J(R2vfk|@2Y%eU_?uy-#btxv!)J9j8cAhuA=GGOPN}P*tT5q=3#n{* zS|l)0X{JLMwak(dp}5=#{o}@TlJ)l74~H__P1{z|61w{qU&{J% z?lfX7g*|Cfh8cW~y9<{3s{WQ)XGGX-5ek{~>uZz2sO?l>3nSq-^WKlL{%$~b=IpI+b3}vH?rA4U|84`l&A1d141Arr=m8v&nim7z^G_L#>Re*LqX;SlZY5E-z6<=Gjq!T(CYC3 z1z?bY*4?>XxivmIddt~qxxT9M5EgL=3knw(+^-$owB0!^5zRp&v3 zOMEV?+A*vsQ4cBh@!e8rzC_BHw%)w^RTLs^#lc*oKy8*iMJ$Z1y5Lz2j>(DE4c2(C z1sY;HZCRHO)CSxIDEFF@Axe##LN6W{_RQ@Y+*`khZ*3xu6YzjS>!Yv&@|8FBl$$ks zgo5-=I+Y?}bewNN$A);cz*AH4G+8(m0(6x}deZ z44=nrlCxEMavdMr+i2e>r%uztdFmgLCf*~yNE~k>P7S}infXyg0lA6GFx{7c{A3>0 zdQzUK#U?L9lTzVw-V(PZe#yx2S($hOV*!2F1vb%FO>aIK;j`Ll=Uys!$eJdPAJXii z?nRBMd`0gxL13K?+w1<CvsnKCQ)ZGB}`NLRl94D ztUvT$l%qFotTR|7%YHf-nc+8dHO2NjC|5E6a z6*#SyNur8-rPIKohUc4@C1U~YkOgYd9^N;PjBw^q<;BP$e2bi~jofm>l&1g)8U0|mE{Q4mqt~RertE&QOi!2o9(B~{F!a02`znU zM%Fhv-El$K6zpC`4-~CE;!Bdm``@Id1dtX&9(qL@UcYI$Ko-wcMMZ&+Z+3_5|!PQ8QI%Oh7#>n;oaizjrJ(G_ET9ua(s8Z2v-oc z{pewsq1IpP?n|vrTK9_7!eZ|E^>?|x>TX#LYFz2l4(+q)I~L(z)ZVOz`)7>z;=O;o zwUMIF+8E>oejL7iPS46{={XApISL{t%+GSzV#Zxh7) ztoBDKKfm5!gGKeZ2)Zf|%X(Fms&@90$8ub7l;#{++ zGl5-augrriUaXKX1!*5%H`?YDUuK;TX*mwwZq(HUb@*GVsNf0(7A@N}(bjj~Q8X#2 zmueeSKIAZ^q*g23Y+S}Vj{E^JZtAW}Rf&wLK@VSMSW1_Ylf$c%M6C(4@g~93TVUnuX#LAFYJR~59Ig~d7oXzcM6{x~h^X#KbW;?Gz#rnRFGqAO3g^ie6_UIzJ zDV!}p^*V9@RHO~eDK2@ z`>Qy08dCeZzgc<+?7tr)Y!nue<#`hpq&3WTx@z@m`)rK0%zZ_Eo6My4H?(fgITx!R z-=a8zMiqcYb4D_ApPJ>h@R}bMQr^b`~M6~TKSj}8@@ zs_BUqyR*rMJWMNv&YJI^KR$ui6+jSS)hojno+3PJfAuXA2eJPu+QMRu9sm&WfRh4^$3@mkm*J=oraIo z=Kt2&;nF39X`ht9ex4}CWisN(XYJ0<8;bAFUmu&lXnY-_j$&KNtk^Vs&>*vJ+?`Rq zFE~4}%(vD5!Z=Uz!#>`S+_k)saib8>eldNc%pb9f#dy(K@rJyUa}`^xde@xHa|)p; z=uRa75eZ>k=-NyEq7H_>+x%g4K}ua>pu25|HAVBfbh;W6%T?=Y$k}HL#NKe`mV3AC z5FmMsZ9ZE(DF~bS5dYnct;zwZy!Br&82TbhAoiNUY-h??36gyj;z{T3M$d3@k3(4Y zv5u;yko#6h>D|{EaFJf*Uu-FxEzE90_Zx>MgxMidzHPqXA*IWOG~iB45j>c_VViUE zvG9T=-o4}*tS{|Sovp2PXX6yuplTWD;KQ@~To(f|I zoR^kL>G8sbgR87N>P?$GO0&XPPde>Zr5eA^=yr2=0yk3)CI;$=1_yDq6T@MIcgZ_cvl=!*%6# z>7qWOEmQ7u4ZC3zRIgmZ=ae>xP74)zJ{MXtRil#PyQYd@?nXmU+i7I5EN=r8`oxCm zep@nEK_s_TB*2w?l>>i6QewHmoEmtqnDKS}JYP-E$N@C)pcfngkCJq@+wK$_UqKb+ zDTBA-vv~Q^h!{# zjb)X~Z@;tg`o(n?)%{R&HEX4%fQrh{;BA|BGD_iLQZwl89Z^lJD=`3av^M3bM=F@mdIJbt*}Jv?UJBIl_rUjQhAM22Gr zyKHppGf)baiCda)%1!EeFPY&J;ldRu%w|L$B4+Bs*2VZ^JD3@6Yk*5v>XMw)C?FjA zEp3T#d=*kZFh5eL)cC@ z`W$8Sps7z#mZgb|jgMOX++-)<$8CstucDcEhcv{aM+aF~P54pI1Z$6VNY0R%?3|zm zorS}NP9k-r*^}E`6h-^$AKqTa^1SaTJOVn2@g^bDw%qk8uE9E?w#X@Jj&|+$W;hhy zJ5EO z)FssO1~au>nB$aq0$!$@R?Mj=GCW*ta~Q2Pg7ac>mdMXw>!tiVz_dd!e;m z*mg7?5d3ZhjZs?C_~=W6@NSl_;IE)vky8y`^#Qse9dr=>8PGvKnASVfCftbGqS${$ zYMzbmAj5eGCXr+&E;XZfB};(z4`KZezMZnFVm4OxD;OQ+Ue#PLi}n0L<6&oc5r@=9 zbcv0R${(1hL;}0b<7hN$9JTM7?cG`0cvQwuD9}33uL%zeA{Fn9V81B5`)^QDn`KQA zi})`tkcG+sl25oeVT|!nGe8=2hO6erI6y*^7`k&f%V@cx_t%S^NJW6^pN-L&K`KS+`uiaTN|OhWd-%y!Gx_jp6_Jc(OG;( z`a#NfSp?~b?)SGujdK+xzWT3huf*F+NRFt39PGl&POFX4MH*lcnXh(73$@9A(yTlZ z=C6){VHmQfm7L)uuX?b8!eq)-n%r31;(eEbllGFjQ#Ex|ITNL3RJna#9HYL=9KHnK zBz`Qu%v20sV6k&#P@s64T|54EWAOuaAT7CGhqs^4U8!($(g*XW=kqNOXy)YQ9&tH6 z$`R0EpbKtvV)Sp$p{4hwl=f`8SjS_1^1XyZZTO_6Xq{*SQ3`P+?Q~Rl!h@t#!nn)l zu+}j>L+cwI>e|!hKUPYYZ{WQlw#Spz96Bd4p11t4Ygr~gYoO=>Gh|(9LzKE2D*s_h z!qI;9Nj~VAj=)i&du9L+79C`gJos@jJ_C~!R`l6itw5FH0~9z^Ip~4FLBY#x4mlki zCCLsXT#hyU9V8^SA;AoZ?emKn`m(Btu_q?B)TiBEi2yW6{X|19Xb((4N&jjOjj4v* zq;-|i=8xx|yJ}ynR|em`I_nREh-7{&Stf3o27^WpamZSZvicH{C3m;3HwBn1*)+QWUg;QnFR(^aWhTodzth2yBp6z6AGVw zwm}Xw6L`atAL5vkMdQa2Ik0Y#%HPN>E4*x9DB0%o?IJ!J6Li`E5GG=dB{lcOvjpN2 zfc66^!oUo*7Y{iISEe&tXSmbcld{}udQzmVYghYRTdj)9BDOurAD2C=DMGwC&FZ zJ!V2(O8pSFk8x6D3?p2zKZj%0ysV^hcyQ47L?~l66trQamw5|94wo_Y;$dicnvtY=Z7!!XT**3G)920ZUw%&)#9;0thF<^ z&SeLG$)mLF$Y$=OVB1>FW6Hg3IcIDpMmDJ~#%+92_)96sek011m%gzMzA)sPIw$Cw zW}e#ANv4jp1j-fi>eOo&kfc_r1vO!;RSrhpILA7HOpupZGV+saR5Lrs4cPN040yJg zD{9;ixz%3D?!thh0)k}^{&i8D>Bi=ex zjx0F|ufBNkVnpcKlKq#>8>tjhzBr~~KyyZ3GBogqG$(}!5zw3y*&D0JbA~eD{CmWM z0{mM-J0n0_bi06Lw1CzM^a!w4M@{mjSG0|a))}}=OK4vND>GuYCdzG{>6KL`4o;XN zg*KhAk6rg{+vy4I)M;uSi?Y|r3pCvPFFuy2`y2%`tY7p2v|8kQ42(Ps%XC!(ok5qe z1^W7VVVUl(SGr$REkav9yR}rc4S5Y!2j}!Bv{yAsU-lZ< z6)*2rr`qI7LESJZ4(f(aITs6WQQooYmF{x)0z--sur?Y3KB<909r#%6Gr`i|rEpo~=7ti-wA#DA9*+b1G@ ztutaR+qh35R30Wxra~41O|gyzI*V3eN?CmE8aR&M7=$=g!p|b2dUOPhpb*XELcp;A zOdZO!ggeD>Nx}ZX34<7X!2Vqn+^r*V1ridYuagcJNXQEQvc@7+hK*ASXO!iL1*q;h zU@C!7ZAxFO9kWfc1skK5{zZ2=-H^`7P?RxOtO>B^_WoB;nw3;hxTj~tuR2wZp4r{q zWE&)ueJ;4#x0-#+;&C2fPIvt732oLY@WP`wxp{iR&}L?o@`fBpamxT}*Mg@ijDecz zVG2;BZl|sz^k*5;7y2U}>>xMt0P!I80`Ehy4sE{R)|0>>RO@OM{T=PCP%H)Z=on@v zO##oP8U^w=O;G<4P#y>BALMc0MOOOrH8M7iVc?eqB5c_5()7=?g#?M31%IeE5F`|D zmuCA1V}PFfeySVjx#M2{eKG5_n6h<{QP6e7c^%(lVmtL8*=V~SBDlh^RVyit9c$P> ziX}c*Mr(L$q`oHXK)i0o_B=YTIGz>ecK>+g2=%#Wu9~H9G}talNoQI?8?>fUBm!-a z1}E4m2~)0}`CKlY82Eu?G%C1UN2ngV6UvxverC+p$Mf{uuC(RU<9?};5FPdl%t65x z%dePjJgI;WnD~d}r>TL7&-GO%;?_`I_4@#{Hq)59AAZ$^bY-c0PIm4x&9A0;gi=XQ zS%JSm$Iu0poAw58MXLIbTywh~mG0N~@*yDpt6r#RND4}1XWef2g#0Noeo5|}`ukGn z^D}J${30F-EGEtR#(r~5d{O|efe2772omb~KuX;S;<~x#&ftpBI>XrsN~vQUfx`jw zig+AOx_{((pKP|PntukkuUr6^ZxErmTxc;J;&NtRpm4g;dcS13QDOOfC{IJSNc-*X zmtKzoE6ULQ@7#4-X2eVY!P?8$MNOaj1Np%qp;x`eqBOCaVicrX)aZ0erc)GhZB$mk z@B-Jim_KwWQI*9)9zTNLMZhK*qwtEJ9g&~g)zPHhnXCK?_r|#2(mQ^@1vI{h{A6a^ z>UxE!H9s${+yG?cj$QlJwIn+`f*>JM~z1rnx$ zQ1_ZJFi)|18l2e=<|)o_24yf$LCX~jA?{Ngl~sutsh-c9GL8~%fyr#m#oYyqdhbVp zO=L90I1%Swb~>LzcB3aN!Qilr(d1WUGlxrEpiZX@G#YBxU;Nx3epo62T!^2M<`kD zIgQt~9m39xy9u%#6Az0X`4ZRO>*h|2315q_#BmxK;+8o+{_>`ra!+QDkjdP!wo)XI zj&ob|%$Kk|W;hi5AA=AlnlHGE0}63;HFNAAbLoXU%b@R>daI3g!Z3B3>R1{=dH>So zLarxhCxp`6-$9RM{+T<2P`!Y+;2$bg1U;v#0;*m_q@a74&#`g6w8k%RwA6W$P4&H= z+j}1zG(Ml2r2bqT^r*;}+KsW){Yy!UgXG8~t7?U>Bl1DO2DHhiY;xB$g14Ja3V%-B zQU14Rq2KDm)?lo~!`0%R^{_uu@|>WkVK$Mf)!)b+=PQ@nItM0VvbGLsd!t?>J(W4B zfHNn44wt}8A>>uuBWR}JVNS;nW(p{#G%$&Q>I@Vl7(5*fHYD+HXj2!7ZV<*kph{We zhJ-FRV$rKyy~Y&GMWEz;=l^$>Wc;7OE&4P^rgvbO-?Kk4+JuS?=`}-hG6)EE03VhY z1z|&JJ~+xPVd`F|p;D&^Q_T(i+q9!o`V#ci6%1C@+#{x-!D6O2O8P;~S{F|~aK$k7?tj~-yGhM`tvrA zMzH@F^@AY?n2a--O-4-tLUYMWL(c^z#RU&CN`pATljt1Bb_z@qK#mhSEe8_C$p8{Z zoujDQ=P^gm9RD#XCwPn}0fD4HI})>hPp4)SS)1EL^ub16e^*WZrS5bHa9Qhpf^?$5 zWmWK({*0i{a(Gne=oz&`Y43#q(5-pZQ0Q(Ark*kU5l1j3xN*sb<3j&ybC3+>cJd#y z-IPF1vf*m=2aBGBh8z`T)kP?BF=6XFM))ONLpr|bl{tj1_<;|QNRq%XFtIUk;J9!s z7#8%wK1?_{3 zxfJ;DNVH%I_Nbdbwr08>-cEA6f5i_$TUwsC3cnve5R=W1O z7DM4Tls`SWs5$GXTRm1}v^GO}Q;(4XFNdAst@Az2GPjE${;B;^FXF4{j|M6gaJAObxyr^<2Gs=yH#l0p;^=?mp zrjsUk)!;_|TwL__dXW~xv zQfpor6aOP2dsDV#LM<&*{1v@BLC}vDld}2AxYR>6eMVfj{V&TG^qsySH z4l_e)%}fum>Q%L)lvyryW)^-+bJ*hq=uT^u%_&;b2~!Hf{4>(o0;nNH1P~Q74%8B`iqt#nsee1vbuJB%;yb z_Oi`QpZv3i29ufA{BICSH{I@S+yCGTiR%_p<{6ndF;+5OFyP`^{(iS>bye!DjR6e~ zXRi+G!Oe5aHqLLS|I6zp(fctQ*Ff)g)>^YLW;z2ETUXNq z!Cf*dXBtlkGWi3h`PO$sVI@0 zwiEYXi$@)kSVa0oR!=_g{n6<*Lt3I6$L8dtydGOw7nChUq~OW5>t@gZ_GR+I<#=wsZEAq zM%hj5<7?I?iyIryitDC*H!p45X{5F+a*u`(Wc5UoXnZo4#FkKm)~-F;r1m-+!2@xn zqo1C&QzkF_eHImuae8IXk4i{lk6?6daEyR^=0%_$*_gE01T{+p}GF9B*-aFaMH1*HMv?N~1w6DXBPY;OD*5$De#H zo<*WY=GOB&N#DdT@BRG~r6Eu)UnTF=?)A2t939ey$Fu5%HO+x8*APpi0|k#~$q>CC z%|Flg$8$85#KMw_ebCvuyR1|6qE=S0SKe)_WxrmuT%DFa`q3=*%FwPQIY)whjOp`+ z)3y3basRmBpV!~`or(gWIC#RB`FXmiISbwOhAf5|B{^0zSRzIc8NgPb(sxQS0P5LR zOU#7$#EOq!SWef#eGZYrH-@5e~QBwe3XW z(&~Zj57y8Z1lw;A?q~0lG`y8xxYm@5@=l~(&GCGi|CW#?Abfa`g)Rgyuoy=6Ns@X~ zued&8-dwAG1kV?F)P8lC(_i=8RuK%vqI1%Mpsk_L3!wc!9p>o1hSB%cCv2J*&gPFx zn`sPM6ow=YslTe;H_`Cz0SUvm(4{)xQUZO199uS>1&`f@Hv@C+kJ|KQ9d%^{r)5Gn zw|q1v{>MtESH`6+lhK{m3uHBeXOID)Eo@B4+e~@$S7sgnT`PF z8Ggmz^JAtl1Q|&-SAV45xATCVmThEFea!`;W0?5#Opih52Q3%fUwzN(zMidpueWS- z>F=)j7xq9|{o4wCQP^9$ztaCV7H^Fks!}DZJyk*dC|Ro?snW~dx+tN!muS>`2vZfJ z_6E@eC^WoKMr!Grl)&ZfAtU zITGx2WNYJ2*BUH_)fqfOfwN4md>C6vZZAoXjq2!Eb-xh|p|?=)Cwhm!0w^Q*E@$0( ze!XDmiR=3NT>{YKY4i&pg#5sL-S9AVr_^)SX-|Re2)MT);DS~Fz=>`JU%O1{xzJ=o z1@)Z)NqITYcf?$&M}&^WyPr_{hcPpokf@my)&UN7b{R|P&jV|(NCi)vPg+Up4W4DlRAiIn@2 ztP%>b(x9DjgTlL;0Y6E^1{DgZP$VWO6u?D@UBHmt?oSF#ma+bRt7806$9sinpcbG5 z7LfML*+{YyveaHT$OPSyg}j=&JGdP!g=*1KNXTb{&WRW5^Oy8t_%8JHM}+&Ypm2vk z@gV5G$(C^l9(B{kpy%7}I#W?1-+!P~8Dd^9)IpNJ;LN%Gfby27f1K3Ek;^>;hcLLP zihtl@MEU_)dHTw}u44x|j$N!Q%CmkXoQ_!$uOK(Y{@kWYQO`8T75$XTdrGq$s{1|t z87cwJ7D6`hC&sb?r~#wp+DGpU79v8%C2qVb1B+Z}yRU zH=mgy4J@sYoO+S%xypJP3#HLt>Fk6SM8|vxz(V19VC>ileXgAKS%MhJgG#~oyr-}{ z;#t8y4H9{IrD746L2=p3+tKp&XKv@IveEh~#*IX$*85uXO2OzhlwQBemHWF^M|xI0 zdW0OmgoQ+P3p!pco{H-5f4NiE;b zZ$OJYS&5YcKVPCZY=zyf_x?O*m;QZrbBwq$u^#sW)^o+meIC4j4w6-*guf#?9p{GZvQ=yMF28O5M%(C z4IzGV=RdA{Y$?8szI<`S@8gTPo4bYu1JBhiXf8-v&lpX#xmOBLRMi&^XHMJQlj)3^ zB6|W;y$kB>?{e>0Nlps0y#4LXignrO^Xv*wNtiD&YJagofWTv*ihaFPw|;)NJFrCJ%UH$ZG6vQUaOJ5m*0cJ^0lEk7~JG5Th`P? zKY%no{qxD$#@Mf1VvV5>+_pZ3-8XP*QwP)%JnycR-wKhDX&yui6R*CXqMK-wt+{nw z;Sz8GdBAVTxz`lvPU%+F=NOcZhTH>E4~x8-O4DDKpma2j67m;7A_i6yLW=quphEzG z#X6ux|3!4$((1ld5HAoN$vaX+c{)@4XkB;&h)3pVKvd31#w=Gyq39M#(e$QUbVJy_jF32h^zgECx7T?77EvL$0 zOo6)CM}<|2P@T9Oed->>9UEINl$8RCQXn zLH8zK29N_{*F7mE4Eq3u0-XTr1?ehwxupdYRXFDcG!L*v|Dzt9EHZ;|KnW2Ir(R3z zLBO1e{F{9P3Cq9e0TNyo7Im9CMO#(9o;{-|SKtr?QDsL?qEI0=ATly~b7*4x&V`D^ zCaKUIf=A`_2LYild{P#>d|_oFtk#wU-EtN8xScMS>bqQevDA5SEy;ou_1iP}gt?5| z4)H7L7HXLSOk+w3BtGU&A6}oSqK;I<@*9IJhow_!MAgj5+yIoh2 zAhZu;B=XL?b0*7IQIgF<`#|r3Z#hN);`ktkhTOY43CX%2ks5CgW`_kD2i_>eqs*uL zWWMn*%^h&2*Id0b4jC;8dKu#%^V1`Z&7r3IvWR%vLl}PiIi>jnky%=Wm@FZkL)cX{ z92ye@sjlnAX%gBIzgHw()K@tAbj$X^a zv+0OwYooG?PF(IEj0!ou0n|?yI5`^^oe8=HqTr@m#5>O)d^z)0R(yXWsdh+oOZS`Q zPX#bO^tsRV*-J=H;$McbHd%HpO-q9CCG{qx?r@PmaaL4bfr!by`e_J(V)ro66KnpD zChfanA{Yw1x-OJB0NEq9&U5m~pDJ~z2rT#p)JYi@1b{*XoVz(dESCT{ml-qV{=N?q z1w_=VyaGcjGHzV*vO<)1nnG>Ync~Hcz{I1=ITF}ZO~CYjLF?;2 zAbkImzDfOU^dbdwA{*B_0ATcfYdq=^DTkJBOWOHlcR$KIW6L%FqB|!uK=*kczC8pe z^KTcnwzmWHLK7C?&^cT$M(KVu(AuIu-U^WJXGD9~zs`|JXxK+n>i=01W}iVG zr6@<>wy{meMso6qPWXalkxYfsBWxs)NIFQ>+x9sza$KPV8Dj1APcNz+*Q)f9@dLL; z{+F1cABq{a%GR=xL%i!!rQfesmDQWcjCv^S@GNyl4tqusw&{caR5|5LkTjh^z zX+R%Ht(Dm`;4>VSUznlvA{TsnEWHS4$EBxd{#?{px9@GucSuuBjIMY2M^rLXeQaKYy$kR|hq3IuZRO7x-jYE?3+5MwjMUAz| z+UsAFkxr-xha_((Mcfo3xUJ&3){Dxuo*Vmu0C~%hS5q#?26B(esp!l*V^B_iCCP$B ziHq5is0Zw4!LS+xuZ2vffCIpak${NF z2qZd@oJEmOA_a>c49K*9?gPDt5%jP5*6eMy*NR{7$Zu`)N3C4hTaN(I6BHf?gXk%) zIxO4t!<{^VMbJG!iVkE0=^r7t>>^0g7ZA6XqCmO?ZnW%6qwdL^+UqQc2jX%v68<2& zTBcem9SsFdCMvpT&YT-AA-8}iH1uxYTf|=J-x$A88pAhaTt$fm90iD>nvHNgL;C)c zK>q-ri_8VaOBgadP#1>k8OWiddS2ZZEa4I0*`-hRzP8Puwj2iq6+h+CAS&xf9(BA| zOdi^?6Z=3-=<87>ayd-xh^)S^d>Fl<0m&~2et>}fa)L%*(vF-UDZtyWoSEqJ^Xr8Q z@d4q#RU}Bd69kK)*A@fUND30my>SEOzy15K(E~b1-7(YYo0%RcLi<|Qd)*)frL!4A zLOpvEY}>wI3KrdU{~I7K!`h)zJeCdoF_!56L&;M+Q=JE)k8p!lp0#AlI2aLRd940xO8)2c;q%_wa_-fq4KiT0YSH z;4?Y@h~dHwAgk0kn+&Xy{$5Pwk7?zX9UYzMNy;Ch2pW+5E(Y|2Xb@+iprjwas~tlU zo8E85?$4g4)vQ`MrSLnT0;4d;UUd*IgE5xMK=zs)5*lN%(D|Q4fm}@QD9Sb?|D^q^ zT>1W1=HzAnOaumOPdjyCLE{kSDVwtf22gBWH=2GQ1Xbc?Cs98o2Qc8kx%|)b9Q#d> z2wwviTJy`-K-u)o-`Vu{3^3C~kisy)e}~7$!i4|)Pxa7mI>Evw#bG2P=abeZpBmvzi;Fz^^9|;={p08WvC3Y?8h*Mmb)Au)n#!f~?Z7 zm^h8Nwu#)$eeMx4t02Rv=Km$2x?*~9XIs%GUoWBOQuaOZk;mUfItJ>m6ii5*owGdg zUWZ1T9tJ1)p#K@!zXnertNBD2*YO}?A*|@jJy^$%qAs$3n53oR(HiID*A<@%g>Lsn zNQ<4-tFkqrW%lFY{3ux-7U-9&cH%OVl<_;4Q~5R<#EvS*7~D|DNuH%==|zgTdiZ2veKD@y07V|$L+%OoSyy2p^|K;kOJ?HXLNf&l|! zXF9be{VTevm)=RB+Fi#^MzooQH-G1%=X~%b(95*qLnG|Pov}k0SWs55pjgnKU+W2e z{|#7BQZONw<|kp2xl3`$9KDv{*U3o1_B`L^i{NL8Rj+(SNq;wC+0n6^h`M1pMLiUxm6zVxu^+(Dx0;X-q zTq>8_S*A7W8(3U)c~eXqzGG$a`R-OiC#P=WSEfxkG&=-_PhOeqmGvKK*CVHjxOBZ@ pEwzL`>i*8R__Kv1*C}gmHZq>QI%40h(qzO - - - diff --git a/yudao-core-service/src/test/resources/sql/clean.sql b/yudao-core-service/src/test/resources/sql/clean.sql deleted file mode 100644 index b11f374ef9..0000000000 --- a/yudao-core-service/src/test/resources/sql/clean.sql +++ /dev/null @@ -1,11 +0,0 @@ --- inf 开头的 DB -DELETE FROM "inf_api_access_log"; -DELETE FROM "inf_file"; -DELETE FROM "inf_api_error_log"; - --- sys 开头的 DB -DELETE FROM "sys_user_session"; -DELETE FROM "sys_dict_data"; -DELETE FROM "sys_sms_template"; -DELETE FROM "sys_sms_log"; -DELETE FROM "sys_social_user"; diff --git a/yudao-core-service/src/test/resources/sql/create_tables.sql b/yudao-core-service/src/test/resources/sql/create_tables.sql deleted file mode 100644 index 633c0d9368..0000000000 --- a/yudao-core-service/src/test/resources/sql/create_tables.sql +++ /dev/null @@ -1,199 +0,0 @@ --- inf 开头的 DB - -CREATE TABLE IF NOT EXISTS "inf_file" ( - "id" varchar(188) NOT NULL, - "type" varchar(63) DEFAULT NULL, - "content" blob NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '文件表'; - --- sys 开头的 DB - -CREATE TABLE IF NOT EXISTS `sys_user_session` ( - `id` varchar(32) NOT NULL, - `user_id` bigint DEFAULT NULL, - "user_type" tinyint NOT NULL, - `username` varchar(50) NOT NULL DEFAULT '', - `user_ip` varchar(50) DEFAULT NULL, - `user_agent` varchar(512) DEFAULT NULL, - `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '' , - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY (`id`) -) COMMENT '用户在线 Session'; - -CREATE TABLE IF NOT EXISTS "sys_dict_data" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "sort" int NOT NULL DEFAULT '0', - "label" varchar(100) NOT NULL DEFAULT '', - "value" varchar(100) NOT NULL DEFAULT '', - "dict_type" varchar(100) NOT NULL DEFAULT '', - "status" tinyint NOT NULL DEFAULT '0', - "remark" varchar(500) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '字典数据表'; - -CREATE TABLE IF NOT EXISTS "inf_api_access_log" ( - "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, - "trace_id" varchar(64) not null default '', - "user_id" bigint not null default '0', - "user_type" tinyint not null default '0', - "application_name" varchar(50) not null, - "request_method" varchar(16) not null default '', - "request_url" varchar(255) not null default '', - "request_params" varchar(8000) not null default '', - "user_ip" varchar(50) not null, - "user_agent" varchar(512) not null, - "begin_time" timestamp not null, - "end_time" timestamp not null, - "duration" integer not null, - "result_code" integer not null default '0', - "result_msg" varchar(512) default '', - "creator" varchar(64) default '', - "create_time" timestamp not null default current_timestamp, - "updater" varchar(64) default '', - "update_time" timestamp not null default current_timestamp, - "deleted" bit not null default false, - "tenant_id" bigint not null default '0', - primary key ("id") -) COMMENT 'API 访问日志表'; - -CREATE TABLE IF NOT EXISTS "inf_api_error_log" ( - "id" integer not null GENERATED BY DEFAULT AS IDENTITY, - "trace_id" varchar(64) not null, - "user_id" bigint not null default '0', - "user_type" tinyint not null default '0', - "application_name" varchar(50) not null, - "request_method" varchar(16) not null, - "request_url" varchar(255) not null, - "request_params" varchar(8000) not null, - "user_ip" varchar(50) not null, - "user_agent" varchar(512) not null, - "exception_time" timestamp not null, - "exception_name" varchar(128) not null default '', - "exception_message" clob not null, - "exception_root_cause_message" clob not null, - "exception_stack_trace" clob not null, - "exception_class_name" varchar(512) not null, - "exception_file_name" varchar(512) not null, - "exception_method_name" varchar(512) not null, - "exception_line_number" integer not null, - "process_status" tinyint not null, - "process_time" timestamp default null, - "process_user_id" bigint default '0', - "creator" varchar(64) default '', - "create_time" timestamp not null default current_timestamp, - "updater" varchar(64) default '', - "update_time" timestamp not null default current_timestamp, - "deleted" bit not null default false, - "tenant_id" bigint not null default '0', - primary key ("id") -) COMMENT '系统异常日志'; - -CREATE TABLE IF NOT EXISTS "sys_sms_template" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "type" tinyint NOT NULL, - "status" tinyint NOT NULL, - "code" varchar(63) NOT NULL, - "name" varchar(63) NOT NULL, - "content" varchar(255) NOT NULL, - "params" varchar(255) NOT NULL, - "remark" varchar(255) DEFAULT NULL, - "api_template_id" varchar(63) NOT NULL, - "channel_id" bigint NOT NULL, - "channel_code" varchar(63) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '短信模板'; - -CREATE TABLE IF NOT EXISTS "sys_sms_log" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "channel_id" bigint NOT NULL, - "channel_code" varchar(63) NOT NULL, - "template_id" bigint NOT NULL, - "template_code" varchar(63) NOT NULL, - "template_type" tinyint NOT NULL, - "template_content" varchar(255) NOT NULL, - "template_params" varchar(255) NOT NULL, - "api_template_id" varchar(63) NOT NULL, - "mobile" varchar(11) NOT NULL, - "user_id" bigint DEFAULT '0', - "user_type" tinyint DEFAULT '0', - "send_status" tinyint NOT NULL DEFAULT '0', - "send_time" timestamp DEFAULT NULL, - "send_code" int DEFAULT NULL, - "send_msg" varchar(255) DEFAULT NULL, - "api_send_code" varchar(63) DEFAULT NULL, - "api_send_msg" varchar(255) DEFAULT NULL, - "api_request_id" varchar(255) DEFAULT NULL, - "api_serial_no" varchar(255) DEFAULT NULL, - "receive_status" tinyint NOT NULL DEFAULT '0', - "receive_time" timestamp DEFAULT NULL, - "api_receive_code" varchar(63) DEFAULT NULL, - "api_receive_msg" varchar(255) DEFAULT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '短信日志'; - -CREATE TABLE IF NOT EXISTS `sys_login_log` ( - `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `log_type` bigint(4) NOT NULL, - "user_id" bigint not null default '0', - "user_type" tinyint NOT NULL, - `trace_id` varchar(64) NOT NULL DEFAULT '', - `username` varchar(50) NOT NULL DEFAULT '', - `result` tinyint(4) NOT NULL, - `user_ip` varchar(50) NOT NULL, - `user_agent` varchar(512) NOT NULL, - `creator` varchar(64) DEFAULT '', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT '0', - "tenant_id" bigint not null default '0', - PRIMARY KEY (`id`) -) COMMENT ='系统访问记录'; - -CREATE TABLE IF NOT EXISTS "sys_social_user" ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "user_type" tinyint NOT NULL DEFAULT '0', - "type" tinyint NOT NULL, - "openid" varchar(32) NOT NULL, - "token" varchar(256) DEFAULT NULL, - "union_id" varchar(32) NOT NULL, - "raw_token_info" varchar(1024) NOT NULL, - "nickname" varchar(32) NOT NULL, - "avatar" varchar(255) DEFAULT NULL, - "raw_user_info" varchar(1024) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '社交用户'; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExportReqVO.java index 1155311d13..ec393a6045 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobExportReqVO.java @@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel(value = "管理后台 - 定时任务 Excel 导出 Request VO", description = "参数和 InfJobPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 定时任务 Excel 导出 Request VO", description = "参数和 JobPageReqVO 是一致的") @Data public class JobExportReqVO { diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobPageReqVO.java index 0d8dd53e3e..02d3a7e2bb 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobPageReqVO.java @@ -16,7 +16,7 @@ public class JobPageReqVO extends PageParam { @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") private String name; - @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 InfJobStatusEnum 枚举") + @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 JobStatusEnum 枚举") private Integer status; @ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配") diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java index 496969d73e..761921349f 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java @@ -43,7 +43,7 @@ public class JobLogBaseVO { @ApiModelProperty(value = "执行时长", example = "123") private Integer duration; - @ApiModelProperty(value = "任务状态", required = true, example = "1", notes = "参见 InfJobLogStatusEnum 枚举") + @ApiModelProperty(value = "任务状态", required = true, example = "1", notes = "参见 JobLogStatusEnum 枚举") @NotNull(message = "任务状态不能为空") private Integer status; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java index 32aa9619bc..df482c9d22 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java @@ -9,7 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "管理后台 - 定时任务 Excel 导出 Request VO", description = "参数和 InfJobLogPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 定时任务 Excel 导出 Request VO", description = "参数和 JobLogPageReqVO 是一致的") @Data public class JobLogExportReqVO { @@ -27,7 +27,7 @@ public class JobLogExportReqVO { @ApiModelProperty(value = "结束执行时间") private Date endTime; - @ApiModelProperty(value = "任务状态", notes = "参见 InfJobLogStatusEnum 枚举") + @ApiModelProperty(value = "任务状态", notes = "参见 JobLogStatusEnum 枚举") private Integer status; } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java index f17f358868..055cfc56c1 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java @@ -32,7 +32,7 @@ public class JobLogPageReqVO extends PageParam { @ApiModelProperty(value = "结束执行时间") private Date endTime; - @ApiModelProperty(value = "任务状态", notes = "参见 InfJobLogStatusEnum 枚举") + @ApiModelProperty(value = "任务状态", notes = "参见 JobLogStatusEnum 枚举") private Integer status; } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java index 8c6ac4879c..83eefabd60 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java @@ -9,7 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "管理后台 - API 访问日志 Excel 导出 Request VO", description = "参数和 InfApiAccessLogPageReqVO 是一致的") +@ApiModel(value = "管理后台 - API 访问日志 Excel 导出 Request VO", description = "参数和 ApiAccessLogPageReqVO 是一致的") @Data public class ApiAccessLogExportReqVO { diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java index dd66ff6f31..b799a3238a 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java @@ -9,7 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "管理后台 - API 错误日志 Excel 导出 Request VO", description = "参数和 InfApiErrorLogPageReqVO 是一致的") +@ApiModel(value = "管理后台 - API 错误日志 Excel 导出 Request VO", description = "参数和 ApiErrorLogPageReqVO 是一致的") @Data public class ApiErrorLogExportReqVO { diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/ConfigDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/ConfigDO.java index dbcdfed56d..4542c2a3ac 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/ConfigDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/config/ConfigDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.infra.dal.dataobject.config; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.infra.enums.config.ConfigTypeEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -45,7 +46,7 @@ public class ConfigDO extends BaseDO { /** * 参数类型 * - * 枚举 {@link InfConfigTypeEnum} + * 枚举 {@link ConfigTypeEnum} */ @TableField("`type`") private Integer type; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiErrorLogDO.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiErrorLogDO.java index fa5b162a59..1ed7df4120 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiErrorLogDO.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiErrorLogDO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.infra.dal.dataobject.logger; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; +import cn.iocoder.yudao.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; @@ -136,7 +137,7 @@ public class ApiErrorLogDO extends TenantBaseDO { /** * 处理状态 * - * 枚举 {@link InfApiErrorLogProcessStatusEnum} + * 枚举 {@link ApiErrorLogProcessStatusEnum} */ private Integer processStatus; /** diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigCoreDAOImpl.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigDAOImpl.java similarity index 86% rename from yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigCoreDAOImpl.java rename to yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigDAOImpl.java index fe531b4023..e16b59e955 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigCoreDAOImpl.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigDAOImpl.java @@ -12,15 +12,15 @@ import java.util.Date; import java.util.List; /** - * ConfigFrameworkDAO Core 实现类 + * ConfigDAOImpl 实现类 * * @author 芋道源码 */ -public class ConfigCoreDAOImpl implements ConfigFrameworkDAO { +public class ConfigDAOImpl implements ConfigFrameworkDAO { private final JdbcTemplate jdbcTemplate; - public ConfigCoreDAOImpl(String jdbcUrl, String username, String password) { + public ConfigDAOImpl(String jdbcUrl, String username, String password) { DataSource dataSource = new DriverManagerDataSource(jdbcUrl, username, password); this.jdbcTemplate = new JdbcTemplate(dataSource); } diff --git a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileProperties.java b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileProperties.java index 7d76a3baf4..c112802b07 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileProperties.java +++ b/yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/framework/file/config/FileProperties.java @@ -12,7 +12,7 @@ import javax.validation.constraints.NotNull; public class FileProperties { /** - * 对应 InfFileController 的 getFile 方法 + * 对应 FileController 的 getFile 方法 */ @NotNull(message = "基础文件路径不能为空") private String basePath; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml index 6f83b473aa..42e5e356dd 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml @@ -48,7 +48,3 @@ yudao: base-package2: cn.iocoder.yudao.module core-service: base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 - captcha: - timeout: 5m - width: 160 - height: 60 diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/clean.sql b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/clean.sql index edf0e8ddf8..b416d4d81a 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/clean.sql +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/clean.sql @@ -4,3 +4,6 @@ DELETE FROM "infra_job"; DELETE FROM "infra_job_log"; DELETE FROM "infra_api_access_log"; DELETE FROM "infra_api_error_log"; +DELETE FROM "infra_api_access_log"; +DELETE FROM "infra_file"; +DELETE FROM "infra_api_error_log"; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/create_tables.sql b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/create_tables.sql index 2ec26d220e..a47cc30b3f 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/create_tables.sql +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/sql/create_tables.sql @@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS "infra_config" ( "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY ("id") - ) COMMENT '参数配置表'; +) COMMENT '参数配置表'; CREATE TABLE IF NOT EXISTS "infra_file" ( "id" varchar(188) NOT NULL, @@ -27,7 +27,7 @@ CREATE TABLE IF NOT EXISTS "infra_file" ( "deleted" bit NOT NULL DEFAULT FALSE, "tenant_id" bigint not null default '0', PRIMARY KEY ("id") - ) COMMENT '文件表'; +) COMMENT '文件表'; CREATE TABLE IF NOT EXISTS "infra_job" ( "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', @@ -45,7 +45,7 @@ CREATE TABLE IF NOT EXISTS "infra_job" ( "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', PRIMARY KEY ("id") - ) COMMENT='定时任务表'; +) COMMENT='定时任务表'; CREATE TABLE IF NOT EXISTS "infra_job_log" ( "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', @@ -64,4 +64,74 @@ CREATE TABLE IF NOT EXISTS "infra_job_log" ( "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', PRIMARY KEY ("id") - )COMMENT='定时任务日志表'; +)COMMENT='定时任务日志表'; + +CREATE TABLE IF NOT EXISTS "inf_file" ( + "id" varchar(188) NOT NULL, + "type" varchar(63) DEFAULT NULL, + "content" blob NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") + ) COMMENT '文件表'; + +CREATE TABLE IF NOT EXISTS "infra_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") + ) COMMENT 'API 访问日志表'; + +CREATE TABLE IF NOT EXISTS "infra_api_error_log" ( + "id" integer not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT '系统异常日志'; From e7e3b187040d6b75703e2cda89fdc2c50b103c67 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 19:26:39 +0800 Subject: [PATCH 22/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=206=EF=BC=9Atool=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + .../codegen/vo/ToolCodegenDetailRespVO.java | 21 --- .../convert/codegen/ToolCodegenConvert.java | 70 ---------- .../convert/test/ToolTestDemoConvert.java | 34 ----- .../codegen/ToolCodegenColumnMapper.java | 22 ---- .../mysql/codegen/ToolCodegenTableMapper.java | 25 ---- .../mysql/codegen/ToolSchemaColumnMapper.java | 19 --- .../mysql/codegen/ToolSchemaTableMapper.java | 26 ---- .../tool/framework/codegen/package-info.java | 4 - .../modules/tool/package-info.java | 7 - .../test/impl/ToolTestDemoServiceImpl.java | 83 ------------ .../src/main/resources/application-dev.yaml | 2 +- .../src/main/resources/application-local.yaml | 2 +- ...ToolInformationSchemaColumnMapperTest.java | 4 +- .../ToolInformationSchemaTableMapperTest.java | 2 +- .../codegen/ToolCodegenEngineTest.java | 12 +- .../codegen/ToolCodegenSQLParserTest.java | 4 +- .../codegen/ToolCodegenServiceImplTest.java | 4 +- .../yudao/module/system/api/package-info.java | 1 - .../service/auth/AdminAuthServiceImpl.java | 1 - yudao-module-tool/pom.xml | 24 ++++ .../yudao-module-tool-api/pom.xml | 26 ++++ .../yudao/module/tool/api/package-info.java | 4 + .../module/tool/enums/DictTypeConstants.java | 4 +- .../module/tool/enums/ErrorCodeConstants.java | 4 +- .../yudao/module/tool/package-info.java | 1 + .../yudao-module-tool-impl/pom.xml | 85 +++++++++++++ .../admin/codegen/CodegenController.java | 58 ++++----- .../admin/codegen/vo/CodegenDetailRespVO.java | 21 +++ .../codegen/vo/CodegenPreviewRespVO.java | 6 +- .../admin/codegen/vo/CodegenUpdateReqVO.java | 14 +- .../vo/column/CodegenColumnBaseVO.java | 6 +- .../vo/column/CodegenColumnRespVO.java | 6 +- .../codegen/vo/table/CodegenTableBaseVO.java | 10 +- .../vo/table/CodegenTablePageReqVO.java | 6 +- .../codegen/vo/table/CodegenTableRespVO.java | 6 +- .../codegen/vo/table/SchemaTableRespVO.java | 6 +- .../admin/test/TestDemoController.http | 2 + .../admin/test/TestDemoController.java | 53 ++++---- .../admin/test/vo/TestDemoBaseVO.java | 4 +- .../admin/test/vo/TestDemoCreateReqVO.java | 6 +- .../admin/test/vo/TestDemoExcelVO.java | 11 +- .../admin/test/vo/TestDemoExportReqVO.java | 6 +- .../admin/test/vo/TestDemoPageReqVO.java | 6 +- .../admin/test/vo/TestDemoRespVO.java | 6 +- .../admin/test/vo/TestDemoUpdateReqVO.java | 6 +- .../tool/controller/app/package-info.java | 4 + .../module/tool/controller/package-info.java | 6 + .../tool/convert/codegen/CodegenConvert.java | 70 ++++++++++ .../tool/convert/test/TestDemoConvert.java | 32 +++++ .../dataobject/codegen/CodegenColumnDO.java | 14 +- .../dataobject/codegen/CodegenTableDO.java | 10 +- .../dataobject/codegen/SchemaColumnDO.java | 4 +- .../dal/dataobject/codegen/SchemaTableDO.java | 4 +- .../tool/dal/dataobject/test/TestDemoDO.java | 7 +- .../mysql/codegen/CodegenColumnMapper.java | 22 ++++ .../dal/mysql/codegen/CodegenTableMapper.java | 25 ++++ .../dal/mysql/codegen/SchemaColumnMapper.java | 19 +++ .../dal/mysql/codegen/SchemaTableMapper.java | 26 ++++ .../tool/dal/mysql/test/TestDemoMapper.java | 22 ++-- .../codegen/CodegenColumnHtmlTypeEnum.java | 4 +- .../CodegenColumnListConditionEnum.java | 4 +- .../enums/codegen/CodegenImportTypeEnum.java | 4 +- .../codegen/CodegenTemplateTypeEnum.java | 4 +- .../yudao/module/tool/enums/package-info.java | 4 + .../codegen/config/CodegenConfiguration.java | 2 +- .../codegen/config/CodegenProperties.java | 2 +- .../tool/framework/codegen/package-info.java | 4 + .../module}/tool/framework/package-info.java | 2 +- .../yudao/module/tool/package-info.java | 8 ++ .../tool/service/codegen/CodegenService.java | 26 ++-- .../service/codegen/CodegenServiceImpl.java | 120 +++++++++--------- .../service/codegen/inner/CodegenBuilder.java | 84 ++++++------ .../service/codegen/inner/CodegenEngine.java | 22 ++-- .../codegen/inner/CodegenSQLParser.java | 34 ++--- .../tool/service/test/TestDemoService.java | 26 ++-- .../service/test/TestDemoServiceImpl.java | 86 +++++++++++++ 77 files changed, 791 insertions(+), 641 deletions(-) delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java delete mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java create mode 100644 yudao-module-tool/pom.xml create mode 100644 yudao-module-tool/yudao-module-tool-api/pom.xml create mode 100644 yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/api/package-info.java rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolDictTypeConstants.java => yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/enums/DictTypeConstants.java (55%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java => yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/enums/ErrorCodeConstants.java (91%) create mode 100644 yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/package-info.java create mode 100644 yudao-module-tool/yudao-module-tool-impl/pom.xml rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/CodegenController.java (73%) create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenDetailRespVO.java rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenPreviewRespVO.java (65%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenUpdateReqVO.java (65%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java (94%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/column/CodegenColumnRespVO.java (69%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTableBaseVO.java (87%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java (85%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTableRespVO.java (73%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/SchemaTableRespVO.java (77%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/TestDemoController.http (80%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/TestDemoController.java (60%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoBaseVO.java (90%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoCreateReqVO.java (51%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoExcelVO.java (67%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoExportReqVO.java (82%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoPageReqVO.java (87%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoRespVO.java (72%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoUpdateReqVO.java (70%) create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/app/package-info.java create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/package-info.java create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/convert/codegen/CodegenConvert.java create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/convert/test/TestDemoConvert.java rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/CodegenColumnDO.java (83%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/CodegenTableDO.java (84%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/SchemaColumnDO.java (90%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/SchemaTableDO.java (83%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/test/TestDemoDO.java (81%) create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/CodegenColumnMapper.java create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/CodegenTableMapper.java create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/SchemaColumnMapper.java create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/SchemaTableMapper.java rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/test/TestDemoMapper.java (64%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenColumnHtmlTypeEnum.java (83%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenColumnListConditionEnum.java (74%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenImportTypeEnum.java (76%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenTemplateTypeEnum.java (73%) create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module}/tool/framework/codegen/config/CodegenConfiguration.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module}/tool/framework/codegen/config/CodegenProperties.java (89%) create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module}/tool/framework/package-info.java (55%) create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/package-info.java rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/CodegenService.java (69%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/CodegenServiceImpl.java (60%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenBuilder.java (70%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenEngine.java (92%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenSQLParser.java (72%) rename yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/test/TestDemoService.java (51%) create mode 100644 yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/test/TestDemoServiceImpl.java diff --git a/pom.xml b/pom.xml index 1b4e139ee1..f56f07ddb7 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ yudao-module-system yudao-module-infra + yudao-module-tool ${artifactId} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java deleted file mode 100644 index 4a1b10c517..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo; - -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column.ToolCodegenColumnRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@ApiModel("代码生成表和字段的明细 Response VO") -@Data -public class ToolCodegenDetailRespVO { - - @ApiModelProperty("表定义") - private ToolCodegenTableRespVO table; - - @ApiModelProperty("字段定义") - private List columns; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java deleted file mode 100644 index 65bf461000..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.tool.convert.codegen; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenDetailRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenPreviewRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column.ToolCodegenColumnRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolSchemaTableRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Mapper -public interface ToolCodegenConvert { - - ToolCodegenConvert INSTANCE = Mappers.getMapper(ToolCodegenConvert.class); - - // ========== ToolInformationSchemaTableDO 和 ToolInformationSchemaColumnDO 相关 ========== - - ToolCodegenTableDO convert(ToolSchemaTableDO bean); - - List convertList(List list); - - ToolCodegenTableRespVO convert(ToolSchemaColumnDO bean); - - // ========== ToolCodegenTableDO 相关 ========== - -// List convertList02(List list); - - ToolCodegenTableRespVO convert(ToolCodegenTableDO bean); - - PageResult convertPage(PageResult page); - - // ========== ToolCodegenTableDO 相关 ========== - - List convertList02(List list); - - ToolCodegenTableDO convert(ToolCodegenUpdateReqVO.Table bean); - - List convertList03(List columns); - - List convertList04(List list); - - // ========== 其它 ========== - - default ToolCodegenDetailRespVO convert(ToolCodegenTableDO table, List columns) { - ToolCodegenDetailRespVO respVO = new ToolCodegenDetailRespVO(); - respVO.setTable(convert(table)); - respVO.setColumns(convertList02(columns)); - return respVO; - } - - default List convert(Map codes) { - return codes.entrySet().stream().map(entry -> { - ToolCodegenPreviewRespVO respVO = new ToolCodegenPreviewRespVO(); - respVO.setFilePath(entry.getKey()); - respVO.setCode(entry.getValue()); - return respVO; - }).collect(Collectors.toList()); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java deleted file mode 100644 index 8e88c59f4f..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.tool.convert.test; - -import java.util.*; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; -import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.*; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; - -/** - * 字典类型 Convert - * - * @author 芋艿 - */ -@Mapper -public interface ToolTestDemoConvert { - - ToolTestDemoConvert INSTANCE = Mappers.getMapper(ToolTestDemoConvert.class); - - ToolTestDemoDO convert(ToolTestDemoCreateReqVO bean); - - ToolTestDemoDO convert(ToolTestDemoUpdateReqVO bean); - - ToolTestDemoRespVO convert(ToolTestDemoDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java deleted file mode 100644 index 2fae426917..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface ToolCodegenColumnMapper extends BaseMapperX { - - default List selectListByTableId(Long tableId) { - return selectList(new QueryWrapper().eq("table_id", tableId) - .orderByAsc("ordinal_position")); - } - - default void deleteListByTableId(Long tableId) { - delete(new QueryWrapper().eq("table_id", tableId)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java deleted file mode 100644 index 31ce16f7b0..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ToolCodegenTableMapper extends BaseMapperX { - - default ToolCodegenTableDO selectByTableName(String tableName) { - return selectOne(new QueryWrapper().eq("table_name", tableName)); - } - - default PageResult selectPage(ToolCodegenTablePageReqVO pageReqVO) { - return selectPage(pageReqVO, new QueryWrapperX() - .likeIfPresent("table_name", pageReqVO.getTableName()) - .likeIfPresent("table_comment", pageReqVO.getTableComment()) - .betweenIfPresent("create_time", pageReqVO.getBeginCreateTime(), pageReqVO.getEndCreateTime())); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java deleted file mode 100644 index 4778da065f..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface ToolSchemaColumnMapper extends BaseMapperX { - - default List selectListByTableName(String tableSchema, String tableName) { - return selectList(new QueryWrapper().eq("table_name", tableName) - .eq("table_schema", tableSchema) - .orderByAsc("ordinal_position")); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java deleted file mode 100644 index 7430ef69e3..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface ToolSchemaTableMapper extends BaseMapperX { - - default List selectList(Collection tableSchemas, String tableName, String tableComment) { - return selectList(new QueryWrapperX().in("table_schema", tableSchemas) - .likeIfPresent("table_name", tableName) - .likeIfPresent("table_comment", tableComment)); - } - - default ToolSchemaTableDO selectByTableSchemaAndTableName(String tableSchema, String tableName) { - return selectOne(new QueryWrapper().eq("table_schema",tableSchema) - .eq("table_name", tableName)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/package-info.java deleted file mode 100644 index bb13d52514..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 代码生成器 - */ -package cn.iocoder.yudao.adminserver.modules.tool.framework.codegen; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java deleted file mode 100644 index f1e361d134..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * tool 包下,我们放研发工具,提升研发效率与质量。 - * 例如说:代码生成器、接口文档等等 - * - * 缩写:tool - */ -package cn.iocoder.yudao.adminserver.modules.tool; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java deleted file mode 100644 index ad8fd1e81e..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.test.impl; - -import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; - -import java.util.*; -import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.*; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import cn.iocoder.yudao.adminserver.modules.tool.convert.test.ToolTestDemoConvert; -import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.test.ToolTestDemoMapper; -import cn.iocoder.yudao.adminserver.modules.tool.service.test.ToolTestDemoService; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.adminserver.modules.tool.enums.ToolErrorCodeConstants.*; - -/** - * 字典类型 Service 实现类 - * - * @author 芋艿 - */ -@Service -@Validated -public class ToolTestDemoServiceImpl implements ToolTestDemoService { - - @Resource - private ToolTestDemoMapper testDemoMapper; - - @Override - public Long createTestDemo(ToolTestDemoCreateReqVO createReqVO) { - // 插入 - ToolTestDemoDO testDemo = ToolTestDemoConvert.INSTANCE.convert(createReqVO); - testDemoMapper.insert(testDemo); - // 返回 - return testDemo.getId(); - } - - @Override - public void updateTestDemo(ToolTestDemoUpdateReqVO updateReqVO) { - // 校验存在 - this.validateTestDemoExists(updateReqVO.getId()); - // 更新 - ToolTestDemoDO updateObj = ToolTestDemoConvert.INSTANCE.convert(updateReqVO); - testDemoMapper.updateById(updateObj); - } - - @Override - public void deleteTestDemo(Long id) { - // 校验存在 - this.validateTestDemoExists(id); - // 删除 - testDemoMapper.deleteById(id); - } - - private void validateTestDemoExists(Long id) { - if (testDemoMapper.selectById(id) == null) { - throw exception(TEST_DEMO_NOT_EXISTS); - } - } - - @Override - public ToolTestDemoDO getTestDemo(Long id) { - return testDemoMapper.selectById(id); - } - - @Override - public List getTestDemoList(Collection ids) { - return testDemoMapper.selectBatchIds(ids); - } - - @Override - public PageResult getTestDemoPage(ToolTestDemoPageReqVO pageReqVO) { - return testDemoMapper.selectPage(pageReqVO); - } - - @Override - public List getTestDemoList(ToolTestDemoExportReqVO exportReqVO) { - return testDemoMapper.selectList(exportReqVO); - } - -} diff --git a/yudao-admin-server/src/main/resources/application-dev.yaml b/yudao-admin-server/src/main/resources/application-dev.yaml index 246d5e8830..d240bf0c65 100644 --- a/yudao-admin-server/src/main/resources/application-dev.yaml +++ b/yudao-admin-server/src/main/resources/application-dev.yaml @@ -100,7 +100,7 @@ apollo: eagerLoad: enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址 - dao: cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigCoreDAOImpl + dao: cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigDAOImpl url: ${spring.datasource.dynamic.datasource.master.url} username: ${spring.datasource.dynamic.datasource.master.username} password: ${spring.datasource.dynamic.datasource.master.password} diff --git a/yudao-admin-server/src/main/resources/application-local.yaml b/yudao-admin-server/src/main/resources/application-local.yaml index 9bdeb775bb..addd7fbfa0 100644 --- a/yudao-admin-server/src/main/resources/application-local.yaml +++ b/yudao-admin-server/src/main/resources/application-local.yaml @@ -113,7 +113,7 @@ apollo: eagerLoad: enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址 - dao: cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigCoreDAOImpl + dao: cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigDAOImpl url: ${spring.datasource.dynamic.datasource.master.url} username: ${spring.datasource.dynamic.datasource.master.username} password: ${spring.datasource.dynamic.datasource.master.password} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java index 1e86eb5d82..f945ddbe2d 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; +package cn.iocoder.yudao.module.tool.dal.mysql.codegen; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.ToolSchemaColumnDO; import org.junit.jupiter.api.Test; import javax.annotation.Resource; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java index 35d91b8c45..88b4c58b2c 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; +package cn.iocoder.yudao.module.tool.dal.mysql.codegen; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java index a8a7857e97..6a461f0c06 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.codegen; +package cn.iocoder.yudao.module.tool.service.codegen; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper; -import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper; -import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl.ToolCodegenEngine; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.module.tool.dal.mysql.codegen.ToolCodegenColumnMapper; +import cn.iocoder.yudao.module.tool.dal.mysql.codegen.ToolCodegenTableMapper; +import cn.iocoder.yudao.module.tool.service.codegen.impl.ToolCodegenEngine; import org.junit.jupiter.api.Test; import javax.annotation.Resource; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java index 44c909118a..e498dc02ee 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.codegen; +package cn.iocoder.yudao.module.tool.service.codegen; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl.ToolCodegenSQLParser; +import cn.iocoder.yudao.module.tool.service.codegen.impl.ToolCodegenSQLParser; import org.junit.jupiter.api.Test; public class ToolCodegenSQLParserTest extends BaseDbUnitTest { diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java index 87661a3cd8..cedd3870aa 100644 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.codegen; +package cn.iocoder.yudao.module.tool.service.codegen; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl.ToolCodegenServiceImpl; +import cn.iocoder.yudao.module.tool.service.codegen.impl.ToolCodegenServiceImpl; import org.junit.jupiter.api.Test; import javax.annotation.Resource; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java deleted file mode 100644 index 0354f00bce..0000000000 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.system.api; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index f237049bdd..afc66ebd2a 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -137,7 +137,6 @@ public class AdminAuthServiceImpl implements AdminAuthService { // 在其内部,会调用到 loadUserByUsername 方法,获取 User 信息 authentication = authenticationManager.authenticate(new MultiUsernamePasswordAuthenticationToken( username, password, getUserType())); - // org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username); } catch (BadCredentialsException badCredentialsException) { this.createLoginLog(username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); throw exception(AUTH_LOGIN_BAD_CREDENTIALS); diff --git a/yudao-module-tool/pom.xml b/yudao-module-tool/pom.xml new file mode 100644 index 0000000000..094286fa6e --- /dev/null +++ b/yudao-module-tool/pom.xml @@ -0,0 +1,24 @@ + + + + cn.iocoder.boot + yudao + ${revision} + + 4.0.0 + + yudao-module-tool-api + yudao-module-tool-impl + + yudao-module-tool + pom + + ${artifactId} + + tool 模块,我们放研发工具,提升研发效率与质量。 + 例如说:代码生成器、接口文档等等 + + + diff --git a/yudao-module-tool/yudao-module-tool-api/pom.xml b/yudao-module-tool/yudao-module-tool-api/pom.xml new file mode 100644 index 0000000000..ea237be1fc --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-api/pom.xml @@ -0,0 +1,26 @@ + + + + cn.iocoder.boot + yudao-module-tool + ${revision} + + 4.0.0 + yudao-module-tool-api + jar + + ${artifactId} + + tool 模块 API,暴露给其它模块调用 + + + + + cn.iocoder.boot + yudao-common + + + + diff --git a/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/api/package-info.java b/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/api/package-info.java new file mode 100644 index 0000000000..77a92cf560 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/api/package-info.java @@ -0,0 +1,4 @@ +/** + * Tool API 包,定义暴露给其它模块的 API + */ +package cn.iocoder.yudao.module.tool.api; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolDictTypeConstants.java b/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/enums/DictTypeConstants.java similarity index 55% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolDictTypeConstants.java rename to yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/enums/DictTypeConstants.java index 1bf2b7a1d0..f22e39f1ed 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolDictTypeConstants.java +++ b/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/enums/DictTypeConstants.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.tool.enums; +package cn.iocoder.yudao.module.tool.enums; /** * Tool 字典类型的枚举类 * * @author 芋道源码 */ -public interface ToolDictTypeConstants { +public interface DictTypeConstants { String TEST_DEMO_TYPE = "tool_test_demo_type"; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java b/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/enums/ErrorCodeConstants.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java rename to yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/enums/ErrorCodeConstants.java index cdf341d749..2d62edc1be 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java +++ b/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/enums/ErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.enums; +package cn.iocoder.yudao.module.tool.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; * * tool 系统,使用 1-003-000-000 段 */ -public interface ToolErrorCodeConstants { +public interface ErrorCodeConstants { // ========== 字典类型(测试) 1003000000 ========== ErrorCode TEST_DEMO_NOT_EXISTS = new ErrorCode(1003000000, "测试示例不存在"); diff --git a/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/package-info.java b/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/package-info.java new file mode 100644 index 0000000000..1b5a668009 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-api/src/main/java/cn/iocoder/yudao/module/tool/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.tool; diff --git a/yudao-module-tool/yudao-module-tool-impl/pom.xml b/yudao-module-tool/yudao-module-tool-impl/pom.xml new file mode 100644 index 0000000000..8c8737a4f3 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/pom.xml @@ -0,0 +1,85 @@ + + + + yudao-module-tool + cn.iocoder.boot + ${revision} + + 4.0.0 + yudao-module-tool-impl + jar + + ${artifactId} + + tool 模块,我们放研发工具,提升研发效率与质量。 + 例如说:代码生成器、接口文档等等 + + + + + cn.iocoder.boot + yudao-module-tool-api + ${revision} + + + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-operatelog + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-dict + + + + + cn.iocoder.boot + yudao-spring-boot-starter-security + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mybatis + + + + + cn.iocoder.boot + yudao-spring-boot-starter-test + test + + + + + cn.iocoder.boot + yudao-spring-boot-starter-excel + + + + + + ${artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + repackage + + + + + + + + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/CodegenController.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/CodegenController.java index a6bd6a64b9..4523b1ab40 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/CodegenController.java @@ -1,20 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen; +package cn.iocoder.yudao.module.tool.controller.admin.codegen; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ZipUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenDetailRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenPreviewRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolSchemaTableRespVO; -import cn.iocoder.yudao.adminserver.modules.tool.convert.codegen.ToolCodegenConvert; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.ToolCodegenService; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.CodegenDetailRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.CodegenPreviewRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.CodegenUpdateReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.CodegenTableRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.SchemaTableRespVO; +import cn.iocoder.yudao.module.tool.convert.codegen.CodegenConvert; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenTableDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaTableDO; +import cn.iocoder.yudao.module.tool.service.codegen.CodegenService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import io.swagger.annotations.Api; @@ -37,14 +37,14 @@ import java.util.Set; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Api(tags = "代码生成器") +@Api(tags = "管理后台 - 代码生成器") @RestController @RequestMapping("/tool/codegen") @Validated -public class ToolCodegenController { +public class CodegenController { @Resource - private ToolCodegenService codegenService; + private CodegenService codegenService; @GetMapping("/db/table/list") @ApiOperation(value = "获得数据库自带的表定义列表", notes = "会过滤掉已经导入 Codegen 的表") @@ -53,34 +53,34 @@ public class ToolCodegenController { @ApiImplicitParam(name = "tableComment", value = "描述,模糊匹配", required = true, example = "芋道", dataTypeClass = String.class) }) @PreAuthorize("@ss.hasPermission('tool:codegen:query')") - public CommonResult> getSchemaTableList( + public CommonResult> getSchemaTableList( @RequestParam(value = "tableName", required = false) String tableName, @RequestParam(value = "tableComment", required = false) String tableComment) { // 获得数据库自带的表定义列表 - List schemaTables = codegenService.getSchemaTableList(tableName, tableComment); + List schemaTables = codegenService.getSchemaTableList(tableName, tableComment); // 移除在 Codegen 中,已经存在的 - Set existsTables = CollectionUtils.convertSet(codegenService.getCodeGenTableList(), ToolCodegenTableDO::getTableName); + Set existsTables = CollectionUtils.convertSet(codegenService.getCodeGenTableList(), CodegenTableDO::getTableName); schemaTables.removeIf(table -> existsTables.contains(table.getTableName())); - return success(ToolCodegenConvert.INSTANCE.convertList04(schemaTables)); + return success(CodegenConvert.INSTANCE.convertList04(schemaTables)); } @GetMapping("/table/page") @ApiOperation("获得表定义分页") @PreAuthorize("@ss.hasPermission('tool:codegen:query')") - public CommonResult> getCodeGenTablePage(@Valid ToolCodegenTablePageReqVO pageReqVO) { - PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); - return success(ToolCodegenConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getCodeGenTablePage(@Valid CodegenTablePageReqVO pageReqVO) { + PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); + return success(CodegenConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/detail") @ApiOperation("获得表和字段的明细") @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('tool:codegen:query')") - public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { - ToolCodegenTableDO table = codegenService.getCodegenTablePage(tableId); - List columns = codegenService.getCodegenColumnListByTableId(tableId); + public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { + CodegenTableDO table = codegenService.getCodegenTablePage(tableId); + List columns = codegenService.getCodegenColumnListByTableId(tableId); // 拼装返回 - return success(ToolCodegenConvert.INSTANCE.convert(table, columns)); + return success(CodegenConvert.INSTANCE.convert(table, columns)); } @ApiOperation("基于数据库的表结构,创建代码生成器的表和字段定义") @@ -102,7 +102,7 @@ public class ToolCodegenController { @ApiOperation("更新数据库的表和字段定义") @PutMapping("/update") @PreAuthorize("@ss.hasPermission('tool:codegen:update')") - public CommonResult updateCodegen(@Valid @RequestBody ToolCodegenUpdateReqVO updateReqVO) { + public CommonResult updateCodegen(@Valid @RequestBody CodegenUpdateReqVO updateReqVO) { codegenService.updateCodegen(updateReqVO); return success(true); } @@ -142,9 +142,9 @@ public class ToolCodegenController { @GetMapping("/preview") @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('tool:codegen:preview')") - public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { + public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { Map codes = codegenService.generationCodes(tableId); - return success(ToolCodegenConvert.INSTANCE.convert(codes)); + return success(CodegenConvert.INSTANCE.convert(codes)); } @ApiOperation("下载生成代码") diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenDetailRespVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenDetailRespVO.java new file mode 100644 index 0000000000..c4e6ce068d --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenDetailRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo; + +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.column.CodegenColumnRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.CodegenTableRespVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel("管理后台 - 代码生成表和字段的明细 Response VO") +@Data +public class CodegenDetailRespVO { + + @ApiModelProperty("表定义") + private CodegenTableRespVO table; + + @ApiModelProperty("字段定义") + private List columns; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenPreviewRespVO.java similarity index 65% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenPreviewRespVO.java index 3a532708ad..5c2ec6858f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenPreviewRespVO.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo; +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel(value = "代码生成预览 Response VO", description ="注意,每个文件都是一个该对象") +@ApiModel(value = "管理后台 - 代码生成预览 Response VO", description ="注意,每个文件都是一个该对象") @Data -public class ToolCodegenPreviewRespVO { +public class CodegenPreviewRespVO { @ApiModelProperty(value = "文件路径", required = true, example = "java/cn/iocoder/yudao/adminserver/modules/system/controller/test/SysTestDemoController.java") private String filePath; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenUpdateReqVO.java similarity index 65% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenUpdateReqVO.java index b82064ecc9..eb20c60218 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/CodegenUpdateReqVO.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo; +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column.ToolCodegenColumnBaseVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTableBaseVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.CodegenTableBaseVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.column.CodegenColumnBaseVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,9 +12,9 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.util.List; -@ApiModel("代码生成表和字段的修改 Request VO") +@ApiModel("管理后台 - 代码生成表和字段的修改 Request VO") @Data -public class ToolCodegenUpdateReqVO { +public class CodegenUpdateReqVO { @Valid // 校验内嵌的字段 @NotNull(message = "表定义不能为空") @@ -28,7 +28,7 @@ public class ToolCodegenUpdateReqVO { @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) - public static class Table extends ToolCodegenTableBaseVO { + public static class Table extends CodegenTableBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1") private Long id; @@ -39,7 +39,7 @@ public class ToolCodegenUpdateReqVO { @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) - public static class Column extends ToolCodegenColumnBaseVO { + public static class Column extends CodegenColumnBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1") private Long id; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java index bd899712f0..5a9b693370 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column; +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.column; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class ToolCodegenColumnBaseVO { +public class CodegenColumnBaseVO { @ApiModelProperty(value = "表编号", required = true, example = "1") @NotNull(message = "表编号不能为空") @@ -70,7 +70,7 @@ public class ToolCodegenColumnBaseVO { @NotNull(message = "是否为 List 查询操作的字段不能为空") private Boolean listOperation; - @ApiModelProperty(value = "List 查询操作的条件类型", required = true, example = "LIKE", notes = "参见 ToolCodegenColumnListConditionEnum 枚举") + @ApiModelProperty(value = "List 查询操作的条件类型", required = true, example = "LIKE", notes = "参见 CodegenColumnListConditionEnum 枚举") @NotNull(message = "List 查询操作的条件类型不能为空") private String listOperationCondition; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/column/CodegenColumnRespVO.java similarity index 69% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/column/CodegenColumnRespVO.java index c7d556427d..358f1f506f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/column/CodegenColumnRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column; +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.column; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import java.util.Date; -@ApiModel("代码生成字段定义 Response VO") +@ApiModel("管理后台 - 代码生成字段定义 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ToolCodegenColumnRespVO extends ToolCodegenColumnBaseVO { +public class CodegenColumnRespVO extends CodegenColumnBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1") private Long id; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTableBaseVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTableBaseVO.java index e4fa2ab749..1b57219fa4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTableBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table; +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,9 +10,9 @@ import javax.validation.constraints.NotNull; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class ToolCodegenTableBaseVO { +public class CodegenTableBaseVO { - @ApiModelProperty(value = "导入类型", required = true, example = "1", notes = "参见 ToolCodegenImportTypeEnum 枚举") + @ApiModelProperty(value = "导入类型", required = true, example = "1", notes = "参见 CodegenImportTypeEnum 枚举") @NotNull(message = "导入类型不能为空") private Integer importType; @@ -35,7 +35,7 @@ public class ToolCodegenTableBaseVO { @NotNull(message = "业务名不能为空") private String businessName; - @ApiModelProperty(value = "类名称", required = true, example = "ToolCodegenTable") + @ApiModelProperty(value = "类名称", required = true, example = "CodegenTable") @NotNull(message = "类名称不能为空") private String className; @@ -47,7 +47,7 @@ public class ToolCodegenTableBaseVO { @NotNull(message = "作者不能为空") private String author; - @ApiModelProperty(value = "模板类型", required = true, example = "1", notes = "参见 ToolCodegenTemplateTypeEnum 枚举") + @ApiModelProperty(value = "模板类型", required = true, example = "1", notes = "参见 CodegenTemplateTypeEnum 枚举") @NotNull(message = "模板类型不能为空") private Integer templateType; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java index b09238b062..69095e277b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table; +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("表定义分页 Request VO") +@ApiModel("管理后台 - 表定义分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ToolCodegenTablePageReqVO extends PageParam { +public class CodegenTablePageReqVO extends PageParam { @ApiModelProperty(value = "表名称", example = "yudao", notes = "模糊匹配") private String tableName; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTableRespVO.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTableRespVO.java index 73ec3f880b..06d7c0d459 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/CodegenTableRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table; +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import java.util.Date; -@ApiModel("代码生成表定义 Response VO") +@ApiModel("管理后台 - 代码生成表定义 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ToolCodegenTableRespVO extends ToolCodegenTableBaseVO { +public class CodegenTableRespVO extends CodegenTableBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1") private Long id; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/SchemaTableRespVO.java similarity index 77% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/SchemaTableRespVO.java index 284856f291..8b54b64f27 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/codegen/vo/table/SchemaTableRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table; +package cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,9 +6,9 @@ import lombok.Data; import java.util.Date; -@ApiModel("数据字典的表定义 Response VO") +@ApiModel("管理后台 - 数据字典的表定义 Response VO") @Data -public class ToolSchemaTableRespVO { +public class SchemaTableRespVO { @ApiModelProperty(value = "数据库", required = true, example = "yudao") private String tableSchema; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/TestDemoController.http similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/TestDemoController.http index b10a3d293b..25b1682dbf 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/TestDemoController.http @@ -1,7 +1,9 @@ ### 请求 /tool/test-demo/get 接口 => 成功 GET {{baseUrl}}/tool/test-demo/get?id=1 Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} ### 请求 /tool/test-demo/list 接口 => 成功 GET {{baseUrl}}/tool/test-demo/list?ids=1 Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/TestDemoController.java similarity index 60% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/TestDemoController.java index 2249af538c..dcf2602078 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/TestDemoController.java @@ -1,15 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.test; +package cn.iocoder.yudao.module.tool.controller.admin.test; -import cn.hutool.core.thread.ThreadUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.framework.tracer.core.annotation.BizTrace; -import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.*; -import cn.iocoder.yudao.adminserver.modules.tool.convert.test.ToolTestDemoConvert; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; -import cn.iocoder.yudao.adminserver.modules.tool.service.test.ToolTestDemoService; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.*; +import cn.iocoder.yudao.module.tool.convert.test.TestDemoConvert; +import cn.iocoder.yudao.module.tool.dal.dataobject.test.TestDemoDO; +import cn.iocoder.yudao.module.tool.service.test.TestDemoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -23,31 +21,30 @@ import javax.validation.Valid; import java.io.IOException; import java.util.Collection; import java.util.List; -import java.util.concurrent.TimeUnit; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "测试示例") +@Api(tags = "管理后台 - 测试示例") @RestController @RequestMapping("/tool/test-demo") @Validated -public class ToolTestDemoController { +public class TestDemoController { @Resource - private ToolTestDemoService testDemoService; + private TestDemoService testDemoService; @PostMapping("/create") @ApiOperation("创建测试示例") @PreAuthorize("@ss.hasPermission('tool:test-demo:create')") - public CommonResult createTestDemo(@Valid @RequestBody ToolTestDemoCreateReqVO createReqVO) { + public CommonResult createTestDemo(@Valid @RequestBody TestDemoCreateReqVO createReqVO) { return success(testDemoService.createTestDemo(createReqVO)); } @PutMapping("/update") @ApiOperation("更新测试示例") @PreAuthorize("@ss.hasPermission('tool:test-demo:update')") - public CommonResult updateTestDemo(@Valid @RequestBody ToolTestDemoUpdateReqVO updateReqVO) { + public CommonResult updateTestDemo(@Valid @RequestBody TestDemoUpdateReqVO updateReqVO) { testDemoService.updateTestDemo(updateReqVO); return success(true); } @@ -66,12 +63,9 @@ public class ToolTestDemoController { @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") // @Lock4j // 分布式锁 - public CommonResult getTestDemo(@RequestParam("id") Long id) { - if (true) { // 测试分布式锁 - ThreadUtil.sleep(5, TimeUnit.SECONDS); - } - ToolTestDemoDO testDemo = testDemoService.getTestDemo(id); - return success(ToolTestDemoConvert.INSTANCE.convert(testDemo)); + public CommonResult getTestDemo(@RequestParam("id") Long id) { + TestDemoDO testDemo = testDemoService.getTestDemo(id); + return success(TestDemoConvert.INSTANCE.convert(testDemo)); } @GetMapping("/list") @@ -79,30 +73,29 @@ public class ToolTestDemoController { @ApiImplicitParam(name = "ids", value = "编号列表", required = true, dataTypeClass = List.class) @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") // @RateLimiter(name = "backendA") - @BizTrace(id = "#ids", type = "'user'") - public CommonResult> getTestDemoList(@RequestParam("ids") Collection ids) { - List list = testDemoService.getTestDemoList(ids); - return success(ToolTestDemoConvert.INSTANCE.convertList(list)); + public CommonResult> getTestDemoList(@RequestParam("ids") Collection ids) { + List list = testDemoService.getTestDemoList(ids); + return success(TestDemoConvert.INSTANCE.convertList(list)); } @GetMapping("/page") @ApiOperation("获得测试示例分页") @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") - public CommonResult> getTestDemoPage(@Valid ToolTestDemoPageReqVO pageVO) { - PageResult pageResult = testDemoService.getTestDemoPage(pageVO); - return success(ToolTestDemoConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getTestDemoPage(@Valid TestDemoPageReqVO pageVO) { + PageResult pageResult = testDemoService.getTestDemoPage(pageVO); + return success(TestDemoConvert.INSTANCE.convertPage(pageResult)); } @GetMapping("/export-excel") @ApiOperation("导出测试示例 Excel") @PreAuthorize("@ss.hasPermission('tool:test-demo:export')") @OperateLog(type = EXPORT) - public void exportTestDemoExcel(@Valid ToolTestDemoExportReqVO exportReqVO, + public void exportTestDemoExcel(@Valid TestDemoExportReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = testDemoService.getTestDemoList(exportReqVO); + List list = testDemoService.getTestDemoList(exportReqVO); // 导出 Excel - List datas = ToolTestDemoConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "测试示例.xls", "数据", ToolTestDemoExcelVO.class, datas); + List datas = TestDemoConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "测试示例.xls", "数据", TestDemoExcelVO.class, datas); } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoBaseVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoBaseVO.java index 0e1af3c281..4defee52db 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; +package cn.iocoder.yudao.module.tool.controller.admin.test.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull; * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class ToolTestDemoBaseVO { +public class TestDemoBaseVO { @ApiModelProperty(value = "名字", required = true, example = "芋道") @NotNull(message = "名字不能为空") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoCreateReqVO.java similarity index 51% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoCreateReqVO.java index b1866f780e..7c6f6d19f3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoCreateReqVO.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; +package cn.iocoder.yudao.module.tool.controller.admin.test.vo; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -@ApiModel("字典类型创建 Request VO") +@ApiModel("管理后台 - 字典类型创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ToolTestDemoCreateReqVO extends ToolTestDemoBaseVO { +public class TestDemoCreateReqVO extends TestDemoBaseVO { } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoExcelVO.java similarity index 67% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoExcelVO.java index 384c08bc52..c947d30326 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoExcelVO.java @@ -1,8 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; +package cn.iocoder.yudao.module.tool.controller.admin.test.vo; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @@ -14,7 +13,7 @@ import java.util.Date; * @author 芋艿 */ @Data -public class ToolTestDemoExcelVO { +public class TestDemoExcelVO { @ExcelProperty("编号") private Long id; @@ -23,15 +22,15 @@ public class ToolTestDemoExcelVO { private String name; @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.COMMON_STATUS) + @DictFormat("") private Integer status; @ExcelProperty(value = "类型", converter = DictConvert.class) - @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.OPERATE_TYPE) + @DictFormat("sys_common_status") private Integer type; @ExcelProperty(value = "分类", converter = DictConvert.class) - @DictFormat(DictTypeConstants.REDIS_TIMEOUT_TYPE) + @DictFormat("inf_redis_timeout_type") private Integer category; @ExcelProperty("备注") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoExportReqVO.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoExportReqVO.java index 84bce9e946..78924ec770 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; +package cn.iocoder.yudao.module.tool.controller.admin.test.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,9 +9,9 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "字典类型 Excel 导出 Request VO", description = "参数和 ToolTestDemoPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 字典类型 Excel 导出 Request VO", description = "参数和 TestDemoPageReqVO 是一致的") @Data -public class ToolTestDemoExportReqVO { +public class TestDemoExportReqVO { @ApiModelProperty(value = "名字", example = "芋道") private String name; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoPageReqVO.java similarity index 87% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoPageReqVO.java index 05fa1573e4..39180a784f 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; +package cn.iocoder.yudao.module.tool.controller.admin.test.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,11 +12,11 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("字典类型分页 Request VO") +@ApiModel("管理后台 - 字典类型分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ToolTestDemoPageReqVO extends PageParam { +public class TestDemoPageReqVO extends PageParam { @ApiModelProperty(value = "名字", example = "芋道") private String name; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoRespVO.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoRespVO.java index e679fd4b0f..61d2b60389 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; +package cn.iocoder.yudao.module.tool.controller.admin.test.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import java.util.Date; -@ApiModel("字典类型 Response VO") +@ApiModel("管理后台 - 字典类型 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ToolTestDemoRespVO extends ToolTestDemoBaseVO { +public class TestDemoRespVO extends TestDemoBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1") private Long id; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoUpdateReqVO.java similarity index 70% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoUpdateReqVO.java index ef05d44c65..eceb3a0d3c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/admin/test/vo/TestDemoUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; +package cn.iocoder.yudao.module.tool.controller.admin.test.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("字典类型更新 Request VO") +@ApiModel("管理后台 - 字典类型更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ToolTestDemoUpdateReqVO extends ToolTestDemoBaseVO { +public class TestDemoUpdateReqVO extends TestDemoBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1") @NotNull(message = "编号不能为空") diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/app/package-info.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/app/package-info.java new file mode 100644 index 0000000000..3489a716e7 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位,避免 package 无法提交到 Git 仓库 + */ +package cn.iocoder.yudao.module.tool.controller.app; diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/package-info.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/package-info.java new file mode 100644 index 0000000000..f06bab1671 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package cn.iocoder.yudao.module.tool.controller; diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/convert/codegen/CodegenConvert.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/convert/codegen/CodegenConvert.java new file mode 100644 index 0000000000..08ab991bfb --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/convert/codegen/CodegenConvert.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.tool.convert.codegen; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.CodegenDetailRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.CodegenPreviewRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.CodegenUpdateReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.column.CodegenColumnRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.CodegenTableRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.SchemaTableRespVO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenTableDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaTableDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Mapper +public interface CodegenConvert { + + CodegenConvert INSTANCE = Mappers.getMapper(CodegenConvert.class); + + // ========== InformationSchemaTableDO 和 InformationSchemaColumnDO 相关 ========== + + CodegenTableDO convert(SchemaTableDO bean); + + List convertList(List list); + + CodegenTableRespVO convert(SchemaColumnDO bean); + + // ========== CodegenTableDO 相关 ========== + +// List convertList02(List list); + + CodegenTableRespVO convert(CodegenTableDO bean); + + PageResult convertPage(PageResult page); + + // ========== CodegenTableDO 相关 ========== + + List convertList02(List list); + + CodegenTableDO convert(CodegenUpdateReqVO.Table bean); + + List convertList03(List columns); + + List convertList04(List list); + + // ========== 其它 ========== + + default CodegenDetailRespVO convert(CodegenTableDO table, List columns) { + CodegenDetailRespVO respVO = new CodegenDetailRespVO(); + respVO.setTable(convert(table)); + respVO.setColumns(convertList02(columns)); + return respVO; + } + + default List convert(Map codes) { + return codes.entrySet().stream().map(entry -> { + CodegenPreviewRespVO respVO = new CodegenPreviewRespVO(); + respVO.setFilePath(entry.getKey()); + respVO.setCode(entry.getValue()); + return respVO; + }).collect(Collectors.toList()); + } + +} diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/convert/test/TestDemoConvert.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/convert/test/TestDemoConvert.java new file mode 100644 index 0000000000..5f2a9e5250 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/convert/test/TestDemoConvert.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.tool.convert.test; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoCreateReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoExcelVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoRespVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import cn.iocoder.yudao.module.tool.dal.dataobject.test.TestDemoDO; + +@Mapper +public interface TestDemoConvert { + + TestDemoConvert INSTANCE = Mappers.getMapper(TestDemoConvert.class); + + TestDemoDO convert(TestDemoCreateReqVO bean); + + TestDemoDO convert(TestDemoUpdateReqVO bean); + + TestDemoRespVO convert(TestDemoDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/CodegenColumnDO.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/CodegenColumnDO.java index 73f9d5dd20..65f1206400 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/CodegenColumnDO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; +package cn.iocoder.yudao.module.tool.dal.dataobject.codegen; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; -import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; +import cn.iocoder.yudao.module.tool.enums.codegen.CodegenColumnHtmlTypeEnum; +import cn.iocoder.yudao.module.tool.enums.codegen.CodegenColumnListConditionEnum; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -18,7 +18,7 @@ import lombok.experimental.Accessors; @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = true) -public class ToolCodegenColumnDO extends BaseDO { +public class CodegenColumnDO extends BaseDO { /** * ID 编号 @@ -28,7 +28,7 @@ public class ToolCodegenColumnDO extends BaseDO { /** * 表编号 * - * 关联 {@link ToolCodegenTableDO#getId()} + * 关联 {@link CodegenTableDO#getId()} */ private Long tableId; @@ -104,7 +104,7 @@ public class ToolCodegenColumnDO extends BaseDO { /** * List 查询操作的条件类型 * - * 枚举 {@link ToolCodegenColumnListConditionEnum} + * 枚举 {@link CodegenColumnListConditionEnum} */ private String listOperationCondition; /** @@ -117,7 +117,7 @@ public class ToolCodegenColumnDO extends BaseDO { /** * 显示类型 * - * 枚举 {@link ToolCodegenColumnHtmlTypeEnum} + * 枚举 {@link CodegenColumnHtmlTypeEnum} */ private String htmlType; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/CodegenTableDO.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/CodegenTableDO.java index 33546b6637..c299e013bb 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/CodegenTableDO.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; +package cn.iocoder.yudao.module.tool.dal.dataobject.codegen; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; +import cn.iocoder.yudao.module.tool.enums.codegen.CodegenTemplateTypeEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -16,7 +16,7 @@ import lombok.experimental.Accessors; @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = true) -public class ToolCodegenTableDO extends BaseDO { +public class CodegenTableDO extends BaseDO { /** * ID 编号 @@ -26,7 +26,7 @@ public class ToolCodegenTableDO extends BaseDO { /** * 导入类型 * - * 枚举 {@link ToolCodegenTemplateTypeEnum} + * 枚举 {@link CodegenTemplateTypeEnum} */ private Integer importType; @@ -79,7 +79,7 @@ public class ToolCodegenTableDO extends BaseDO { /** * 模板类型 * - * 枚举 {@link ToolCodegenTemplateTypeEnum} + * 枚举 {@link CodegenTemplateTypeEnum} */ private Integer templateType; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/SchemaColumnDO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/SchemaColumnDO.java index e78e16f533..d7c2b0d22d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/SchemaColumnDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; +package cn.iocoder.yudao.module.tool.dal.dataobject.codegen; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -13,7 +13,7 @@ import lombok.Data; @TableName(value = "information_schema.columns", autoResultMap = true) @Data @Builder -public class ToolSchemaColumnDO { +public class SchemaColumnDO { /** * 表名称 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/SchemaTableDO.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/SchemaTableDO.java index e3e70352d8..eaec25fae7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/codegen/SchemaTableDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; +package cn.iocoder.yudao.module.tool.dal.dataobject.codegen; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; @@ -14,7 +14,7 @@ import java.util.Date; @TableName(value = "information_schema.tables", autoResultMap = true) @Data @Builder -public class ToolSchemaTableDO { +public class SchemaTableDO { /** * 数据库 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/test/TestDemoDO.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/test/TestDemoDO.java index 0af46d798d..fcb197307e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/dataobject/test/TestDemoDO.java @@ -1,12 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test; +package cn.iocoder.yudao.module.tool.dal.dataobject.test; import lombok.*; -import java.util.*; import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; /** - * 字典类型 DO + * 测试示例 DO * * @author 芋艿 */ @@ -17,7 +16,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @Builder @NoArgsConstructor @AllArgsConstructor -public class ToolTestDemoDO extends BaseDO { +public class TestDemoDO extends BaseDO { /** * 编号 diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/CodegenColumnMapper.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/CodegenColumnMapper.java new file mode 100644 index 0000000000..8c1e47ea9a --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/CodegenColumnMapper.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenColumnDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CodegenColumnMapper extends BaseMapperX { + + default List selectListByTableId(Long tableId) { + return selectList(new QueryWrapper().eq("table_id", tableId) + .orderByAsc("ordinal_position")); + } + + default void deleteListByTableId(Long tableId) { + delete(new QueryWrapper().eq("table_id", tableId)); + } + +} diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/CodegenTableMapper.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/CodegenTableMapper.java new file mode 100644 index 0000000000..292941b1d8 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/CodegenTableMapper.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenTableDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CodegenTableMapper extends BaseMapperX { + + default CodegenTableDO selectByTableName(String tableName) { + return selectOne(new QueryWrapper().eq("table_name", tableName)); + } + + default PageResult selectPage(CodegenTablePageReqVO pageReqVO) { + return selectPage(pageReqVO, new QueryWrapperX() + .likeIfPresent("table_name", pageReqVO.getTableName()) + .likeIfPresent("table_comment", pageReqVO.getTableComment()) + .betweenIfPresent("create_time", pageReqVO.getBeginCreateTime(), pageReqVO.getEndCreateTime())); + } + +} diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/SchemaColumnMapper.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/SchemaColumnMapper.java new file mode 100644 index 0000000000..52bb6ba2c7 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/SchemaColumnMapper.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaColumnDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SchemaColumnMapper extends BaseMapperX { + + default List selectListByTableName(String tableSchema, String tableName) { + return selectList(new QueryWrapper().eq("table_name", tableName) + .eq("table_schema", tableSchema) + .orderByAsc("ordinal_position")); + } + +} diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/SchemaTableMapper.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/SchemaTableMapper.java new file mode 100644 index 0000000000..51d00c2240 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/codegen/SchemaTableMapper.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaTableDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface SchemaTableMapper extends BaseMapperX { + + default List selectList(Collection tableSchemas, String tableName, String tableComment) { + return selectList(new QueryWrapperX().in("table_schema", tableSchemas) + .likeIfPresent("table_name", tableName) + .likeIfPresent("table_comment", tableComment)); + } + + default SchemaTableDO selectByTableSchemaAndTableName(String tableSchema, String tableName) { + return selectOne(new QueryWrapper().eq("table_schema",tableSchema) + .eq("table_name", tableName)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/test/TestDemoMapper.java similarity index 64% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/test/TestDemoMapper.java index 4bee17eb19..59c249b025 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/dal/mysql/test/TestDemoMapper.java @@ -1,24 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.test; +package cn.iocoder.yudao.module.tool.dal.mysql.test; import java.util.*; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoExportReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoPageReqVO; +import cn.iocoder.yudao.module.tool.dal.dataobject.test.TestDemoDO; import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.*; -/** - * 字典类型 Mapper - * - * @author 芋艿 - */ @Mapper -public interface ToolTestDemoMapper extends BaseMapperX { +public interface TestDemoMapper extends BaseMapperX { - default PageResult selectPage(ToolTestDemoPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() + default PageResult selectPage(TestDemoPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) .eqIfPresent("status", reqVO.getStatus()) .eqIfPresent("type", reqVO.getType()) @@ -28,8 +24,8 @@ public interface ToolTestDemoMapper extends BaseMapperX { .orderByDesc("id")); } - default List selectList(ToolTestDemoExportReqVO reqVO) { - return selectList(new QueryWrapperX() + default List selectList(TestDemoExportReqVO reqVO) { + return selectList(new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) .eqIfPresent("status", reqVO.getStatus()) .eqIfPresent("type", reqVO.getType()) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenColumnHtmlTypeEnum.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenColumnHtmlTypeEnum.java index 22dbdd2b76..c7d968410e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenColumnHtmlTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.enums.codegen; +package cn.iocoder.yudao.module.tool.enums.codegen; import lombok.AllArgsConstructor; import lombok.Getter; @@ -8,7 +8,7 @@ import lombok.Getter; */ @AllArgsConstructor @Getter -public enum ToolCodegenColumnHtmlTypeEnum { +public enum CodegenColumnHtmlTypeEnum { INPUT("input"), // 文本框 TEXTAREA("textarea"), // 文本域 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenColumnListConditionEnum.java similarity index 74% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenColumnListConditionEnum.java index 0783c9869f..4264b9aa59 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenColumnListConditionEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.enums.codegen; +package cn.iocoder.yudao.module.tool.enums.codegen; import lombok.AllArgsConstructor; import lombok.Getter; @@ -8,7 +8,7 @@ import lombok.Getter; */ @AllArgsConstructor @Getter -public enum ToolCodegenColumnListConditionEnum { +public enum CodegenColumnListConditionEnum { EQ("="), NE("!="), diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenImportTypeEnum.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenImportTypeEnum.java index 746cb7181d..62c7e99526 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenImportTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.enums.codegen; +package cn.iocoder.yudao.module.tool.enums.codegen; import lombok.AllArgsConstructor; import lombok.Getter; @@ -10,7 +10,7 @@ import lombok.Getter; */ @AllArgsConstructor @Getter -public enum ToolCodegenImportTypeEnum { +public enum CodegenImportTypeEnum { DB(1), // 从 information_schema 的 table 和 columns 表导入 SQL(2); // 基于建表 SQL 语句导入 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenTemplateTypeEnum.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenTemplateTypeEnum.java index b192c31734..9f96aaf971 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/codegen/CodegenTemplateTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.enums.codegen; +package cn.iocoder.yudao.module.tool.enums.codegen; import lombok.AllArgsConstructor; import lombok.Getter; @@ -10,7 +10,7 @@ import lombok.Getter; */ @AllArgsConstructor @Getter -public enum ToolCodegenTemplateTypeEnum { +public enum CodegenTemplateTypeEnum { CRUD(1), // 单表(增删改查) TREE(2), // 树表(增删改查) diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/package-info.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/package-info.java new file mode 100644 index 0000000000..c2b493d907 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/enums/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package cn.iocoder.yudao.module.tool.enums; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenConfiguration.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/config/CodegenConfiguration.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenConfiguration.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/config/CodegenConfiguration.java index 943638c1ba..b19add66cd 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenConfiguration.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/config/CodegenConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.codegen.config; +package cn.iocoder.yudao.module.tool.framework.codegen.config; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenProperties.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/config/CodegenProperties.java similarity index 89% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenProperties.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/config/CodegenProperties.java index c383fc55d4..ba113cf5b6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/codegen/config/CodegenProperties.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/config/CodegenProperties.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.framework.codegen.config; +package cn.iocoder.yudao.module.tool.framework.codegen.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/package-info.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/package-info.java new file mode 100644 index 0000000000..3348d54d51 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/codegen/package-info.java @@ -0,0 +1,4 @@ +/** + * 代码生成器 + */ +package cn.iocoder.yudao.module.tool.framework.codegen; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/package-info.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/package-info.java similarity index 55% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/package-info.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/package-info.java index f9a66d3640..76dbd50012 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/package-info.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/framework/package-info.java @@ -3,4 +3,4 @@ * * @author 芋道源码 */ -package cn.iocoder.yudao.adminserver.modules.tool.framework; +package cn.iocoder.yudao.module.tool.framework; diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/package-info.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/package-info.java new file mode 100644 index 0000000000..4568d4c3d6 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/package-info.java @@ -0,0 +1,8 @@ +/** + * tool 模块下,我们放研发工具,提升研发效率与质量。 + * 例如说:代码生成器、接口文档等等 + * + * 1. Controller URL:以 /tool/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 tool_ 开头,方便在数据库中区分 + */ +package cn.iocoder.yudao.module.tool; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/CodegenService.java similarity index 69% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/CodegenService.java index fbe61c4b16..7b8f84b2c8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/CodegenService.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.codegen; +package cn.iocoder.yudao.module.tool.service.codegen; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.CodegenUpdateReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenTableDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaTableDO; import java.util.List; import java.util.Map; @@ -15,7 +15,7 @@ import java.util.Map; * * @author 芋道源码 */ -public interface ToolCodegenService { +public interface CodegenService { /** * 基于 SQL 建表语句,创建代码生成器的表定义 @@ -46,7 +46,7 @@ public interface ToolCodegenService { * * @param updateReqVO 更新信息 */ - void updateCodegen(ToolCodegenUpdateReqVO updateReqVO); + void updateCodegen(CodegenUpdateReqVO updateReqVO); /** * 基于数据库的表结构,同步数据库的表和字段定义 @@ -76,7 +76,7 @@ public interface ToolCodegenService { * @param pageReqVO 分页条件 * @return 表定义分页 */ - PageResult getCodegenTablePage(ToolCodegenTablePageReqVO pageReqVO); + PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO); /** * 获得表定义 @@ -84,14 +84,14 @@ public interface ToolCodegenService { * @param id 表编号 * @return 表定义 */ - ToolCodegenTableDO getCodegenTablePage(Long id); + CodegenTableDO getCodegenTablePage(Long id); /** * 获得全部表定义 * * @return 表定义数组 */ - List getCodeGenTableList(); + List getCodeGenTableList(); /** * 获得指定表的字段定义数组 @@ -99,7 +99,7 @@ public interface ToolCodegenService { * @param tableId 表编号 * @return 字段定义数组 */ - List getCodegenColumnListByTableId(Long tableId); + List getCodegenColumnListByTableId(Long tableId); /** * 执行指定表的代码生成 @@ -116,6 +116,6 @@ public interface ToolCodegenService { * @param tableComment 表描述 * @return 表定义列表 */ - List getSchemaTableList(String tableName, String tableComment); + List getSchemaTableList(String tableName, String tableComment); } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/CodegenServiceImpl.java similarity index 60% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/CodegenServiceImpl.java index f3b69fba25..f478244d00 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/CodegenServiceImpl.java @@ -1,22 +1,24 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; +package cn.iocoder.yudao.module.tool.service.codegen; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.framework.codegen.config.CodegenProperties; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; -import cn.iocoder.yudao.adminserver.modules.tool.convert.codegen.ToolCodegenConvert; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper; -import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper; -import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolSchemaColumnMapper; -import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolSchemaTableMapper; -import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenImportTypeEnum; -import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.ToolCodegenService; +import cn.iocoder.yudao.module.tool.framework.codegen.config.CodegenProperties; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.CodegenUpdateReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import cn.iocoder.yudao.module.tool.convert.codegen.CodegenConvert; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenTableDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaTableDO; +import cn.iocoder.yudao.module.tool.dal.mysql.codegen.CodegenColumnMapper; +import cn.iocoder.yudao.module.tool.dal.mysql.codegen.CodegenTableMapper; +import cn.iocoder.yudao.module.tool.dal.mysql.codegen.SchemaColumnMapper; +import cn.iocoder.yudao.module.tool.dal.mysql.codegen.SchemaTableMapper; +import cn.iocoder.yudao.module.tool.enums.codegen.CodegenImportTypeEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.tool.service.codegen.inner.CodegenBuilder; +import cn.iocoder.yudao.module.tool.service.codegen.inner.CodegenEngine; +import cn.iocoder.yudao.module.tool.service.codegen.inner.CodegenSQLParser; import org.apache.commons.collections4.KeyValue; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,7 +31,7 @@ import java.util.Set; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.adminserver.modules.tool.enums.ToolErrorCodeConstants.*; +import static cn.iocoder.yudao.module.tool.enums.ErrorCodeConstants.*; /** * 代码生成 Service 实现类 @@ -37,27 +39,27 @@ import static cn.iocoder.yudao.adminserver.modules.tool.enums.ToolErrorCodeConst * @author 芋道源码 */ @Service -public class ToolCodegenServiceImpl implements ToolCodegenService { +public class CodegenServiceImpl implements CodegenService { @Resource - private ToolSchemaTableMapper schemaTableMapper; + private SchemaTableMapper schemaTableMapper; @Resource - private ToolSchemaColumnMapper schemaColumnMapper; + private SchemaColumnMapper schemaColumnMapper; @Resource - private ToolCodegenTableMapper codegenTableMapper; + private CodegenTableMapper codegenTableMapper; @Resource - private ToolCodegenColumnMapper codegenColumnMapper; + private CodegenColumnMapper codegenColumnMapper; @Resource - private ToolCodegenBuilder codegenBuilder; + private CodegenBuilder codegenBuilder; @Resource - private ToolCodegenEngine codegenEngine; + private CodegenEngine codegenEngine; @Resource private CodegenProperties codegenProperties; - private Long createCodegen0(ToolCodegenImportTypeEnum importType, - ToolSchemaTableDO schemaTable, List schemaColumns) { + private Long createCodegen0(CodegenImportTypeEnum importType, + SchemaTableDO schemaTable, List schemaColumns) { // 校验导入的表和字段非空 if (schemaTable == null) { throw exception(CODEGEN_IMPORT_TABLE_NULL); @@ -70,12 +72,12 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { throw exception(CODEGEN_TABLE_EXISTS); } - // 构建 ToolCodegenTableDO 对象,插入到 DB 中 - ToolCodegenTableDO table = codegenBuilder.buildTable(schemaTable); + // 构建 CodegenTableDO 对象,插入到 DB 中 + CodegenTableDO table = codegenBuilder.buildTable(schemaTable); table.setImportType(importType.getType()); codegenTableMapper.insert(table); - // 构建 ToolCodegenColumnDO 数组,插入到 DB 中 - List columns = codegenBuilder.buildColumns(schemaColumns); + // 构建 CodegenColumnDO 数组,插入到 DB 中 + List columns = codegenBuilder.buildColumns(schemaColumns); columns.forEach(column -> { column.setTableId(table.getId()); codegenColumnMapper.insert(column); // TODO 批量插入 @@ -86,17 +88,17 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { @Override public Long createCodegenListFromSQL(String sql) { // 从 SQL 中,获得数据库表结构 - ToolSchemaTableDO schemaTable; - List schemaColumns; + SchemaTableDO schemaTable; + List schemaColumns; try { - KeyValue> result = ToolCodegenSQLParser.parse(sql); + KeyValue> result = CodegenSQLParser.parse(sql); schemaTable = result.getKey(); schemaColumns = result.getValue(); } catch (Exception ex) { throw exception(CODEGEN_PARSE_SQL_ERROR); } // 导入 - return this.createCodegen0(ToolCodegenImportTypeEnum.SQL, schemaTable, schemaColumns); + return this.createCodegen0(CodegenImportTypeEnum.SQL, schemaTable, schemaColumns); } @Override @@ -104,10 +106,10 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { // 获取当前schema String tableSchema = codegenProperties.getDbSchemas().iterator().next(); // 从数据库中,获得数据库表结构 - ToolSchemaTableDO schemaTable = schemaTableMapper.selectByTableSchemaAndTableName(tableSchema, tableName); - List schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, tableName); + SchemaTableDO schemaTable = schemaTableMapper.selectByTableSchemaAndTableName(tableSchema, tableName); + List schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, tableName); // 导入 - return this.createCodegen0(ToolCodegenImportTypeEnum.DB, schemaTable, schemaColumns); + return this.createCodegen0(CodegenImportTypeEnum.DB, schemaTable, schemaColumns); } @Override @@ -121,17 +123,17 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { @Override @Transactional(rollbackFor = Exception.class) - public void updateCodegen(ToolCodegenUpdateReqVO updateReqVO) { + public void updateCodegen(CodegenUpdateReqVO updateReqVO) { // 校验是否已经存在 if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { throw exception(CODEGEN_TABLE_NOT_EXISTS); } // 更新 table 表定义 - ToolCodegenTableDO updateTableObj = ToolCodegenConvert.INSTANCE.convert(updateReqVO.getTable()); + CodegenTableDO updateTableObj = CodegenConvert.INSTANCE.convert(updateReqVO.getTable()); codegenTableMapper.updateById(updateTableObj); // 更新 column 字段定义 - List updateColumnObjs = ToolCodegenConvert.INSTANCE.convertList03(updateReqVO.getColumns()); + List updateColumnObjs = CodegenConvert.INSTANCE.convertList03(updateReqVO.getColumns()); updateColumnObjs.forEach(updateColumnObj -> codegenColumnMapper.updateById(updateColumnObj)); } @@ -139,13 +141,13 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { @Transactional(rollbackFor = Exception.class) public void syncCodegenFromDB(Long tableId) { // 校验是否已经存在 - ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); + CodegenTableDO table = codegenTableMapper.selectById(tableId); if (table == null) { throw exception(CODEGEN_TABLE_NOT_EXISTS); } String tableSchema = codegenProperties.getDbSchemas().iterator().next(); // 从数据库中,获得数据库表结构 - List schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, table.getTableName()); + List schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, table.getTableName()); // 执行同步 this.syncCodegen0(tableId, schemaColumns); @@ -155,14 +157,14 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { @Transactional(rollbackFor = Exception.class) public void syncCodegenFromSQL(Long tableId, String sql) { // 校验是否已经存在 - ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); + CodegenTableDO table = codegenTableMapper.selectById(tableId); if (table == null) { throw exception(CODEGEN_TABLE_NOT_EXISTS); } // 从 SQL 中,获得数据库表结构 - List schemaColumns; + List schemaColumns; try { - KeyValue> result = ToolCodegenSQLParser.parse(sql); + KeyValue> result = CodegenSQLParser.parse(sql); schemaColumns = result.getValue(); } catch (Exception ex) { throw exception(CODEGEN_PARSE_SQL_ERROR); @@ -172,27 +174,27 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { this.syncCodegen0(tableId, schemaColumns); } - private void syncCodegen0(Long tableId, List schemaColumns) { + private void syncCodegen0(Long tableId, List schemaColumns) { // 校验导入的字段不为空 if (CollUtil.isEmpty(schemaColumns)) { throw exception(CODEGEN_SYNC_COLUMNS_NULL); } - Set schemaColumnNames = CollectionUtils.convertSet(schemaColumns, ToolSchemaColumnDO::getColumnName); + Set schemaColumnNames = CollectionUtils.convertSet(schemaColumns, SchemaColumnDO::getColumnName); - // 构建 ToolCodegenColumnDO 数组,只同步新增的字段 - List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); - Set codegenColumnNames = CollectionUtils.convertSet(codegenColumns, ToolCodegenColumnDO::getColumnName); + // 构建 CodegenColumnDO 数组,只同步新增的字段 + List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); + Set codegenColumnNames = CollectionUtils.convertSet(codegenColumns, CodegenColumnDO::getColumnName); // 移除已经存在的字段 schemaColumns.removeIf(column -> codegenColumnNames.contains(column.getColumnName())); // 计算需要删除的字段 Set deleteColumnIds = codegenColumns.stream().filter(column -> !schemaColumnNames.contains(column.getColumnName())) - .map(ToolCodegenColumnDO::getId).collect(Collectors.toSet()); + .map(CodegenColumnDO::getId).collect(Collectors.toSet()); if (CollUtil.isEmpty(schemaColumns) && CollUtil.isEmpty(deleteColumnIds)) { throw exception(CODEGEN_SYNC_NONE_CHANGE); } // 插入新增的字段 - List columns = codegenBuilder.buildColumns(schemaColumns); + List columns = codegenBuilder.buildColumns(schemaColumns); columns.forEach(column -> { column.setTableId(tableId); codegenColumnMapper.insert(column); // TODO 批量插入 @@ -218,33 +220,33 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - public PageResult getCodegenTablePage(ToolCodegenTablePageReqVO pageReqVO) { + public PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO) { return codegenTableMapper.selectPage(pageReqVO); } @Override - public ToolCodegenTableDO getCodegenTablePage(Long id) { + public CodegenTableDO getCodegenTablePage(Long id) { return codegenTableMapper.selectById(id); } @Override - public List getCodeGenTableList() { + public List getCodeGenTableList() { return codegenTableMapper.selectList(); } @Override - public List getCodegenColumnListByTableId(Long tableId) { + public List getCodegenColumnListByTableId(Long tableId) { return codegenColumnMapper.selectListByTableId(tableId); } @Override public Map generationCodes(Long tableId) { // 校验是否已经存在 - ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); + CodegenTableDO table = codegenTableMapper.selectById(tableId); if (codegenTableMapper.selectById(tableId) == null) { throw exception(CODEGEN_TABLE_NOT_EXISTS); } - List columns = codegenColumnMapper.selectListByTableId(tableId); + List columns = codegenColumnMapper.selectListByTableId(tableId); if (CollUtil.isEmpty(columns)) { throw exception(CODEGEN_COLUMN_NOT_EXISTS); } @@ -254,8 +256,8 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - public List getSchemaTableList(String tableName, String tableComment) { - List tables = schemaTableMapper.selectList(codegenProperties.getDbSchemas(), tableName, tableComment); + public List getSchemaTableList(String tableName, String tableComment) { + List tables = schemaTableMapper.selectList(codegenProperties.getDbSchemas(), tableName, tableComment); // TODO 强制移除 Quartz 的表,未来做成可配置 tables.removeIf(table -> table.getTableName().startsWith("QRTZ_")); tables.removeIf(table -> table.getTableName().startsWith("ACT_")); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenBuilder.java similarity index 70% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenBuilder.java index 87e6ab6bd0..cf9b6c35d1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenBuilder.java @@ -1,16 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; +package cn.iocoder.yudao.module.tool.service.codegen.inner; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.adminserver.modules.tool.convert.codegen.ToolCodegenConvert; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; -import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; -import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; +import cn.iocoder.yudao.module.tool.convert.codegen.CodegenConvert; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenTableDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaTableDO; +import cn.iocoder.yudao.module.tool.enums.codegen.CodegenColumnHtmlTypeEnum; +import cn.iocoder.yudao.module.tool.enums.codegen.CodegenColumnListConditionEnum; +import cn.iocoder.yudao.module.tool.enums.codegen.CodegenTemplateTypeEnum; import com.google.common.collect.Sets; import org.springframework.stereotype.Component; @@ -21,11 +21,11 @@ import static cn.hutool.core.text.CharSequenceUtil.*; /** * 代码生成器的 Builder,负责: - * 1. 将数据库的表 {@link ToolSchemaTableDO} 定义,构建成 {@link ToolCodegenTableDO} - * 2. 将数据库的列 {@link ToolSchemaColumnDO} 构定义,建成 {@link ToolCodegenColumnDO} + * 1. 将数据库的表 {@link SchemaTableDO} 定义,构建成 {@link CodegenTableDO} + * 2. 将数据库的列 {@link SchemaColumnDO} 构定义,建成 {@link CodegenColumnDO} */ @Component -public class ToolCodegenBuilder { +public class CodegenBuilder { /** * Module 名字的映射 TODO 后续梳理到配置类 @@ -40,30 +40,30 @@ public class ToolCodegenBuilder { .build(); /** - * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 + * 字段名与 {@link CodegenColumnListConditionEnum} 的默认映射 * 注意,字段的匹配以后缀的方式 */ - private static final Map columnListOperationConditionMappings = - MapUtil.builder() - .put("name", ToolCodegenColumnListConditionEnum.LIKE) - .put("time", ToolCodegenColumnListConditionEnum.BETWEEN) - .put("date", ToolCodegenColumnListConditionEnum.BETWEEN) + private static final Map columnListOperationConditionMappings = + MapUtil.builder() + .put("name", CodegenColumnListConditionEnum.LIKE) + .put("time", CodegenColumnListConditionEnum.BETWEEN) + .put("date", CodegenColumnListConditionEnum.BETWEEN) .build(); /** - * 字段名与 {@link ToolCodegenColumnHtmlTypeEnum} 的默认映射 + * 字段名与 {@link CodegenColumnHtmlTypeEnum} 的默认映射 * 注意,字段的匹配以后缀的方式 */ - private static final Map columnHtmlTypeMappings = - MapUtil.builder() - .put("status", ToolCodegenColumnHtmlTypeEnum.RADIO) - .put("sex", ToolCodegenColumnHtmlTypeEnum.RADIO) - .put("type", ToolCodegenColumnHtmlTypeEnum.SELECT) - .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) - .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) - .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) - .put("time", ToolCodegenColumnHtmlTypeEnum.DATETIME) - .put("date", ToolCodegenColumnHtmlTypeEnum.DATETIME) + private static final Map columnHtmlTypeMappings = + MapUtil.builder() + .put("status", CodegenColumnHtmlTypeEnum.RADIO) + .put("sex", CodegenColumnHtmlTypeEnum.RADIO) + .put("type", CodegenColumnHtmlTypeEnum.SELECT) + .put("image", CodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) + .put("file", CodegenColumnHtmlTypeEnum.UPLOAD_FILE) + .put("content", CodegenColumnHtmlTypeEnum.EDITOR) + .put("time", CodegenColumnHtmlTypeEnum.DATETIME) + .put("date", CodegenColumnHtmlTypeEnum.DATETIME) .build(); /** @@ -113,8 +113,8 @@ public class ToolCodegenBuilder { LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 } - public ToolCodegenTableDO buildTable(ToolSchemaTableDO schemaTable) { - ToolCodegenTableDO table = ToolCodegenConvert.INSTANCE.convert(schemaTable); + public CodegenTableDO buildTable(SchemaTableDO schemaTable) { + CodegenTableDO table = CodegenConvert.INSTANCE.convert(schemaTable); initTableDefault(table); return table; } @@ -124,7 +124,7 @@ public class ToolCodegenBuilder { * * @param table 表定义 */ - private void initTableDefault(ToolCodegenTableDO table) { + private void initTableDefault(CodegenTableDO table) { table.setModuleName(getFullModuleName(StrUtil.subBefore(table.getTableName(), '_', false))); // 第一个 _ 前缀的前面,作为 module 名字 table.setBusinessName(toCamelCase(subAfter(table.getTableName(), @@ -133,11 +133,11 @@ public class ToolCodegenBuilder { table.setClassComment(subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 '表', true)); table.setAuthor("芋艿"); // TODO 稍后改成创建人 - table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); + table.setTemplateType(CodegenTemplateTypeEnum.CRUD.getType()); } - public List buildColumns(List schemaColumns) { - List columns = ToolCodegenConvert.INSTANCE.convertList(schemaColumns); + public List buildColumns(List schemaColumns) { + List columns = CodegenConvert.INSTANCE.convertList(schemaColumns); columns.forEach(this::initColumnDefault); return columns; } @@ -147,7 +147,7 @@ public class ToolCodegenBuilder { * * @param column 列定义 */ - private void initColumnDefault(ToolCodegenColumnDO column) { + private void initColumnDefault(CodegenColumnDO column) { // 处理 Java 相关的字段的默认值 processColumnJava(column); // 处理 CRUD 相关的字段的默认值 @@ -156,7 +156,7 @@ public class ToolCodegenBuilder { processColumnUI(column); } - private void processColumnJava(ToolCodegenColumnDO column) { + private void processColumnJava(CodegenColumnDO column) { // 处理 javaField 字段 column.setJavaField(toCamelCase(column.getColumnName())); // 处理 dictType 字段,暂无 @@ -171,7 +171,7 @@ public class ToolCodegenBuilder { } } - private void processColumnOperation(ToolCodegenColumnDO column) { + private void processColumnOperation(CodegenColumnDO column) { // 处理 createOperation 字段 column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) && !column.getPrimaryKey()); // 对于主键,创建时无需传递 @@ -186,13 +186,13 @@ public class ToolCodegenBuilder { .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); if (column.getListOperationCondition() == null) { - column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); + column.setListOperationCondition(CodegenColumnListConditionEnum.EQ.getCondition()); } // 处理 listOperationResult 字段 column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); } - private void processColumnUI(ToolCodegenColumnDO column) { + private void processColumnUI(CodegenColumnDO column) { // 基于后缀进行匹配 columnHtmlTypeMappings.entrySet().stream() .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) @@ -200,11 +200,11 @@ public class ToolCodegenBuilder { // 如果是 Boolean 类型时,设置为 radio 类型. // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. if (Boolean.class.getSimpleName().equals(column.getJavaType())) { - column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.RADIO.getType()); + column.setHtmlType(CodegenColumnHtmlTypeEnum.RADIO.getType()); } // 兜底,设置默认为 input 类型 if (column.getHtmlType() == null) { - column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.INPUT.getType()); + column.setHtmlType(CodegenColumnHtmlTypeEnum.INPUT.getType()); } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenEngine.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenEngine.java index ce8f3ac116..89a3af161b 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenEngine.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; +package cn.iocoder.yudao.module.tool.service.codegen.inner; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; @@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.tool.framework.codegen.config.CodegenProperties; +import cn.iocoder.yudao.module.tool.framework.codegen.config.CodegenProperties; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @@ -19,8 +19,8 @@ import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.CodegenTableDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import com.google.common.collect.Maps; @@ -45,7 +45,7 @@ import static cn.hutool.core.text.CharSequenceUtil.*; * @author 芋道源码 */ @Component -public class ToolCodegenEngine { +public class CodegenEngine { /** * 模板配置 @@ -95,7 +95,7 @@ public class ToolCodegenEngine { .build(); @Resource - private ToolCodegenBuilder codegenBuilder; + private CodegenBuilder codegenBuilder; @Resource private CodegenProperties codegenProperties; @@ -109,7 +109,7 @@ public class ToolCodegenEngine { */ private final Map globalBindingMap = new HashMap<>(); - public ToolCodegenEngine() { + public CodegenEngine() { // 初始化 TemplateEngine 属性 TemplateConfig config = new TemplateConfig(); config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); @@ -129,7 +129,7 @@ public class ToolCodegenEngine { globalBindingMap.put("PageParamClassName", PageParam.class.getName()); globalBindingMap.put("DictFormatClassName", DictFormat.class.getName()); // DO 类,独有字段 - globalBindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); + globalBindingMap.put("baseDOFields", CodegenBuilder.BASE_DO_FIELDS); globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); globalBindingMap.put("QueryWrapperClassName", QueryWrapperX.class.getName()); globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); @@ -143,12 +143,12 @@ public class ToolCodegenEngine { globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); } - public Map execute(ToolCodegenTableDO table, List columns) { + public Map execute(CodegenTableDO table, List columns) { // 创建 bindingMap Map bindingMap = new HashMap<>(globalBindingMap); bindingMap.put("table", table); bindingMap.put("columns", columns); - bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey)); // 主键字段 + bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段 // moduleName 相关 String simpleModuleName = codegenBuilder.getSimpleModuleName(table.getModuleName()); bindingMap.put("simpleModuleName", simpleModuleName); // 将 system 转成 sys @@ -183,7 +183,7 @@ public class ToolCodegenEngine { getStr(bindingMap, "classNameVar")); // table 包含的字段 - ToolCodegenTableDO table = (ToolCodegenTableDO) bindingMap.get("table"); + CodegenTableDO table = (CodegenTableDO) bindingMap.get("table"); filePath = StrUtil.replace(filePath, "${table.moduleName}", table.getModuleName()); filePath = StrUtil.replace(filePath, "${table.businessName}", table.getBusinessName()); filePath = StrUtil.replace(filePath, "${table.className}", table.getClassName()); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenSQLParser.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenSQLParser.java index d9f2538812..d58ac04c47 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/codegen/inner/CodegenSQLParser.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; +package cn.iocoder.yudao.module.tool.service.codegen.inner; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaColumnDO; +import cn.iocoder.yudao.module.tool.dal.dataobject.codegen.SchemaTableDO; import com.alibaba.druid.DbType; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; @@ -21,26 +21,26 @@ import java.util.Objects; import static com.alibaba.druid.sql.SQLUtils.normalize; /** - * SQL 解析器,将创建表的 SQL,解析成 {@link ToolSchemaTableDO} 和 {@link ToolSchemaColumnDO} 对象, + * SQL 解析器,将创建表的 SQL,解析成 {@link SchemaTableDO} 和 {@link SchemaColumnDO} 对象, * 后续可以基于它们,生成代码~ * * @author 芋道源码 */ -public class ToolCodegenSQLParser { +public class CodegenSQLParser { /** - * 解析建表 SQL 语句,返回 {@link ToolSchemaTableDO} 和 {@link ToolSchemaColumnDO} 对象 + * 解析建表 SQL 语句,返回 {@link SchemaTableDO} 和 {@link SchemaColumnDO} 对象 * * @param sql 建表 SQL 语句 * @return 解析结果 */ - public static KeyValue> parse(String sql) { + public static KeyValue> parse(String sql) { // 解析 SQL 成 Statement SQLCreateTableStatement statement = parseCreateSQL(sql); // 解析 Table 表 - ToolSchemaTableDO table = parseTable(statement); + SchemaTableDO table = parseTable(statement); // 解析 Column 字段 - List columns = parseColumns(statement); + List columns = parseColumns(statement); columns.forEach(column -> column.setTableName(table.getTableName())); // 返回 return new DefaultKeyValue<>(table, columns); @@ -61,8 +61,8 @@ public class ToolCodegenSQLParser { return (MySqlCreateTableStatement) repository.findTable(tableName).getStatement(); } - private static ToolSchemaTableDO parseTable(SQLCreateTableStatement statement) { - return ToolSchemaTableDO.builder() + private static SchemaTableDO parseTable(SQLCreateTableStatement statement) { + return SchemaTableDO.builder() .tableName(statement.getTableSource().getTableName(true)) .tableComment(getCommentText(statement)) .build(); @@ -75,13 +75,13 @@ public class ToolCodegenSQLParser { return ((SQLCharExpr) statement.getComment()).getText(); } - private static List parseColumns(SQLCreateTableStatement statement) { - List columns = new ArrayList<>(); + private static List parseColumns(SQLCreateTableStatement statement) { + List columns = new ArrayList<>(); statement.getTableElementList().forEach(element -> parseColumn(columns, element)); return columns; } - private static void parseColumn(List columns, SQLTableElement element) { + private static void parseColumn(List columns, SQLTableElement element) { // 处理主键 if (element instanceof SQLPrimaryKey) { parsePrimaryKey(columns, (SQLPrimaryKey) element); @@ -93,16 +93,16 @@ public class ToolCodegenSQLParser { } } - private static void parsePrimaryKey(List columns, SQLPrimaryKey primaryKey) { + private static void parsePrimaryKey(List columns, SQLPrimaryKey primaryKey) { String columnName = normalize(primaryKey.getColumns().get(0).toString()); // 暂时不考虑联合主键 // 匹配 columns 主键字段,设置为 primary columns.stream().filter(column -> column.getColumnName().equals(columnName)) .forEach(column -> column.setPrimaryKey(true)); } - private static void parseColumnDefinition(List columns, SQLColumnDefinition definition) { + private static void parseColumnDefinition(List columns, SQLColumnDefinition definition) { String text = definition.toString().toUpperCase(); - columns.add(ToolSchemaColumnDO.builder() + columns.add(SchemaColumnDO.builder() .columnName(normalize(definition.getColumnName())) .columnType(definition.getDataType().toString()) .columnComment(Objects.isNull(definition.getComment()) ? "" diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/test/TestDemoService.java similarity index 51% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java rename to yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/test/TestDemoService.java index 7fff9185d4..5695961d75 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/test/TestDemoService.java @@ -1,17 +1,21 @@ -package cn.iocoder.yudao.adminserver.modules.tool.service.test; +package cn.iocoder.yudao.module.tool.service.test; import java.util.*; import javax.validation.*; -import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.*; -import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; + +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoCreateReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoExportReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoPageReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoUpdateReqVO; +import cn.iocoder.yudao.module.tool.dal.dataobject.test.TestDemoDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; /** - * 字典类型 Service 接口 + * 测试示例 Service 接口 * * @author 芋艿 */ -public interface ToolTestDemoService { +public interface TestDemoService { /** * 创建字典类型 @@ -19,14 +23,14 @@ public interface ToolTestDemoService { * @param createReqVO 创建信息 * @return 编号 */ - Long createTestDemo(@Valid ToolTestDemoCreateReqVO createReqVO); + Long createTestDemo(@Valid TestDemoCreateReqVO createReqVO); /** * 更新字典类型 * * @param updateReqVO 更新信息 */ - void updateTestDemo(@Valid ToolTestDemoUpdateReqVO updateReqVO); + void updateTestDemo(@Valid TestDemoUpdateReqVO updateReqVO); /** * 删除字典类型 @@ -41,7 +45,7 @@ public interface ToolTestDemoService { * @param id 编号 * @return 字典类型 */ - ToolTestDemoDO getTestDemo(Long id); + TestDemoDO getTestDemo(Long id); /** * 获得字典类型列表 @@ -49,7 +53,7 @@ public interface ToolTestDemoService { * @param ids 编号 * @return 字典类型列表 */ - List getTestDemoList(Collection ids); + List getTestDemoList(Collection ids); /** * 获得字典类型分页 @@ -57,7 +61,7 @@ public interface ToolTestDemoService { * @param pageReqVO 分页查询 * @return 字典类型分页 */ - PageResult getTestDemoPage(ToolTestDemoPageReqVO pageReqVO); + PageResult getTestDemoPage(TestDemoPageReqVO pageReqVO); /** * 获得字典类型列表, 用于 Excel 导出 @@ -65,6 +69,6 @@ public interface ToolTestDemoService { * @param exportReqVO 查询条件 * @return 字典类型列表 */ - List getTestDemoList(ToolTestDemoExportReqVO exportReqVO); + List getTestDemoList(TestDemoExportReqVO exportReqVO); } diff --git a/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/test/TestDemoServiceImpl.java b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/test/TestDemoServiceImpl.java new file mode 100644 index 0000000000..3181db91c6 --- /dev/null +++ b/yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool/service/test/TestDemoServiceImpl.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.tool.service.test; + +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoCreateReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoExportReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoPageReqVO; +import cn.iocoder.yudao.module.tool.controller.admin.test.vo.TestDemoUpdateReqVO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import cn.iocoder.yudao.module.tool.dal.dataobject.test.TestDemoDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import cn.iocoder.yudao.module.tool.convert.test.TestDemoConvert; +import cn.iocoder.yudao.module.tool.dal.mysql.test.TestDemoMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.tool.enums.ErrorCodeConstants.*; + +/** + * 测试示例 Service 实现类 + * + * @author 芋艿 + */ +@Service +@Validated +public class TestDemoServiceImpl implements TestDemoService { + + @Resource + private TestDemoMapper testDemoMapper; + + @Override + public Long createTestDemo(TestDemoCreateReqVO createReqVO) { + // 插入 + TestDemoDO testDemo = TestDemoConvert.INSTANCE.convert(createReqVO); + testDemoMapper.insert(testDemo); + // 返回 + return testDemo.getId(); + } + + @Override + public void updateTestDemo(TestDemoUpdateReqVO updateReqVO) { + // 校验存在 + this.validateTestDemoExists(updateReqVO.getId()); + // 更新 + TestDemoDO updateObj = TestDemoConvert.INSTANCE.convert(updateReqVO); + testDemoMapper.updateById(updateObj); + } + + @Override + public void deleteTestDemo(Long id) { + // 校验存在 + this.validateTestDemoExists(id); + // 删除 + testDemoMapper.deleteById(id); + } + + private void validateTestDemoExists(Long id) { + if (testDemoMapper.selectById(id) == null) { + throw exception(TEST_DEMO_NOT_EXISTS); + } + } + + @Override + public TestDemoDO getTestDemo(Long id) { + return testDemoMapper.selectById(id); + } + + @Override + public List getTestDemoList(Collection ids) { + return testDemoMapper.selectBatchIds(ids); + } + + @Override + public PageResult getTestDemoPage(TestDemoPageReqVO pageReqVO) { + return testDemoMapper.selectPage(pageReqVO); + } + + @Override + public List getTestDemoList(TestDemoExportReqVO exportReqVO) { + return testDemoMapper.selectList(exportReqVO); + } + +} From b757e1fccb31add36ca4718c8f9f332e6cd0a822 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 21:51:23 +0800 Subject: [PATCH 23/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=207=EF=BC=9Apay=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + yudao-admin-server/pom.xml | 57 +--- .../modules/pay/convert/package-info.java | 6 - .../mysql/order/PayOrderExtensionMapper.java | 16 -- .../pay/enums/PayErrorCodeConstants.java | 1 - .../modules/pay/job/package-info.java | 1 - .../adminserver/modules/pay/package-info.java | 7 - .../channel/impl/PayChannelServiceImpl.java | 161 ----------- .../pay/service/order/PayRefundService.java | 41 --- .../order/impl/PayOrderServiceImpl.java | 54 ---- .../order/impl/PayRefundServiceImpl.java | 42 --- .../pay/service/channel/PayChannelConfig.java | 20 -- .../convert/order/PayOrderCoreConvert.java | 22 -- .../convert/order/PayRefundCoreConvert.java | 23 -- .../modules/pay/convert/package-info.java | 6 - ...g Boot 对象转换 MapStruct 入门》.md | 1 - .../dal/mysql/merchant/PayAppCoreMapper.java | 9 - .../mysql/merchant/PayChannelCoreMapper.java | 20 -- .../dal/mysql/order/PayOrderCoreMapper.java | 22 -- .../dal/mysql/order/PayRefundCoreMapper.java | 23 -- .../coreservice/modules/pay/package-info.java | 7 - .../service/merchant/PayAppCoreService.java | 23 -- .../merchant/PayChannelCoreService.java | 39 --- .../merchant/impl/PayAppCoreServiceImpl.java | 43 --- .../impl/PayChannelCoreServiceImpl.java | 121 --------- .../pay/service/notify/vo/package-info.java | 6 - .../service/order/PayOrderCoreService.java | 50 ---- .../service/order/PayRefundCoreService.java | 31 --- .../modules/pay/service/package-info.java | 1 - .../pay/core/enums/PayChannelEnum.java | 13 +- yudao-module-pay/pom.xml | 25 ++ yudao-module-pay/yudao-module-pay-api/pom.xml | 26 ++ .../module/pay/enums/DictTypeConstants.java | 35 +++ .../module/pay/enums/ErrorCodeConstants.java | 4 +- .../yudao/module/pay/package-info.java | 1 + .../yudao-module-pay-impl/pom.xml | 103 ++++++++ .../admin/merchant}/PayAppController.java | 24 +- .../admin/merchant}/PayChannelController.java | 19 +- .../merchant/PayMerchantController.java | 10 +- .../admin/merchant/vo/app}/PayAppBaseVO.java | 2 +- .../merchant/vo/app}/PayAppCreateReqVO.java | 6 +- .../admin/merchant/vo/app}/PayAppExcelVO.java | 9 +- .../merchant/vo/app}/PayAppExportReqVO.java | 4 +- .../vo/app}/PayAppPageItemRespVO.java | 9 +- .../merchant/vo/app}/PayAppPageReqVO.java | 4 +- .../admin/merchant/vo/app}/PayAppRespVO.java | 4 +- .../merchant/vo/app}/PayAppUpdateReqVO.java | 5 +- .../vo/app}/PayAppUpdateStatusReqVO.java | 4 +- .../vo/channel}/PayChannelBaseVO.java | 6 +- .../vo/channel}/PayChannelCreateReqVO.java | 8 +- .../vo/channel}/PayChannelExcelVO.java | 5 +- .../vo/channel}/PayChannelExportReqVO.java | 4 +- .../vo/channel}/PayChannelPageReqVO.java | 4 +- .../vo/channel}/PayChannelRespVO.java | 4 +- .../vo/channel}/PayChannelUpdateReqVO.java | 9 +- .../vo/merchant}/PayMerchantBaseVO.java | 2 +- .../vo/merchant}/PayMerchantCreateReqVO.java | 6 +- .../vo/merchant}/PayMerchantExcelVO.java | 2 +- .../vo/merchant}/PayMerchantExportReqVO.java | 4 +- .../vo/merchant}/PayMerchantPageReqVO.java | 4 +- .../vo/merchant}/PayMerchantRespVO.java | 10 +- .../vo/merchant}/PayMerchantUpdateReqVO.java | 5 +- .../PayMerchantUpdateStatusReqVO.java | 4 +- .../admin}/order/PayOrderController.java | 45 +--- .../admin/order/vo}/PayOrderBaseVO.java | 5 +- .../order/vo}/PayOrderDetailsRespVO.java | 9 +- .../admin/order/vo}/PayOrderExcelVO.java | 4 +- .../admin/order/vo}/PayOrderExportReqVO.java | 8 +- .../order/vo}/PayOrderPageItemRespVO.java | 9 +- .../admin/order/vo}/PayOrderPageReqVO.java | 9 +- .../admin/order/vo}/PayOrderRespVO.java | 9 +- .../admin/refund}/PayRefundController.java | 42 +-- .../admin}/refund/vo/PayRefundBaseVO.java | 2 +- .../refund/vo/PayRefundCreateReqVO.java | 4 +- .../refund/vo/PayRefundDetailsRespVO.java | 9 +- .../admin}/refund/vo/PayRefundExcelVO.java | 4 +- .../refund/vo/PayRefundExportReqVO.java | 4 +- .../refund/vo/PayRefundPageItemRespVO.java | 8 +- .../admin}/refund/vo/PayRefundPageReqVO.java | 4 +- .../admin}/refund/vo/PayRefundRespVO.java | 4 +- .../refund/vo/PayRefundUpdateReqVO.java | 4 +- .../app/order/AppPayOrderController.java | 42 +-- .../app/order/vo/AppPayOrderSubmitReqVO.java | 6 +- .../app/order/vo/AppPayOrderSubmitRespVO.java | 6 +- .../pay/controller/app/package-info.java | 1 + .../app/refund/AppPayRefundController.java | 29 +- .../app/refund/vo/AppPayRefundReqVO.java | 6 +- .../app/refund/vo/AppPayRefundRespVO.java | 12 +- .../module/pay/controller/package-info.java | 6 + .../pay/convert/app/PayAppConvert.java | 8 +- .../convert/channel/PayChannelConvert.java | 16 +- .../convert/merchant/PayMerchantConvert.java | 14 +- .../pay/convert/order/PayOrderConvert.java | 45 ++-- .../module}/pay/convert/package-info.java | 2 +- .../pay/convert/refund/PayRefundConvert.java | 25 +- ...g Boot 对象转换 MapStruct 入门》.md | 0 .../pay/dal/dataobject/merchant/PayAppDO.java | 2 +- .../dal/dataobject/merchant/PayChannelDO.java | 2 +- .../dataobject/merchant/PayMerchantDO.java | 2 +- .../dal/dataobject/notify/PayNotifyLogDO.java | 4 +- .../dataobject/notify/PayNotifyTaskDO.java | 14 +- .../pay/dal/dataobject/order/PayOrderDO.java | 14 +- .../dataobject/order/PayOrderExtensionDO.java | 6 +- .../dal/dataobject/refund}/PayRefundDO.java | 13 +- .../pay/dal/mysql/merchant}/PayAppMapper.java | 40 +-- .../dal/mysql/merchant}/PayChannelMapper.java | 37 +-- .../dal/mysql/merchant/PayMerchantMapper.java | 13 +- .../mysql/notify/PayNotifyLogCoreMapper.java | 4 +- .../mysql/notify/PayNotifyTaskCoreMapper.java | 6 +- .../mysql/order/PayOrderExtensionMapper.java | 6 +- .../pay/dal/mysql/order/PayOrderMapper.java | 31 ++- .../dal/mysql/refund}/PayRefundMapper.java | 28 +- .../dal/redis/PayRedisKeyCoreConstants.java | 6 +- .../redis/notify/PayNotifyLockRedisDAO.java | 6 +- .../pay/enums/notify/PayNotifyStatusEnum.java | 2 +- .../pay/enums/notify/PayNotifyTypeEnum.java | 2 +- .../enums/order/PayOrderNotifyStatusEnum.java | 2 +- .../pay/enums/order/PayOrderStatusEnum.java | 2 +- .../enums/refund}/PayRefundStatusEnum.java | 2 +- .../pay/enums/refund}/PayRefundTypeEnum.java | 2 +- .../module}/pay/job/notify/PayNotifyJob.java | 6 +- .../yudao/module/pay/job/package-info.java | 1 + .../yudao/module/pay/package-info.java | 10 + .../pay/service/merchant}/PayAppService.java | 25 +- .../service/merchant}/PayAppServiceImpl.java | 64 ++--- .../service/merchant}/PayChannelService.java | 50 +++- .../merchant/PayChannelServiceImpl.java | 250 ++++++++++++++++++ .../service/merchant/PayMerchantService.java | 12 +- .../merchant}/PayMerchantServiceImpl.java | 22 +- .../pay/service/notify/PayNotifyService.java | 8 +- .../service/notify/PayNotifyServiceImpl.java | 65 +++-- .../notify/dto/PayNotifyTaskCreateReqDTO.java | 2 +- .../notify/vo/PayNotifyOrderReqVO.java | 2 +- .../notify/vo/PayRefundOrderReqVO.java | 2 +- .../pay/service/notify/vo/package-info.java | 6 + .../order/PayOrderExtensionService.java | 8 +- .../order}/PayOrderExtensionServiceImpl.java | 7 +- .../pay/service/order/PayOrderService.java | 38 ++- .../service/order/PayOrderServiceImpl.java | 144 +++++----- .../order/dto/PayOrderCreateReqDTO.java | 2 +- .../order/dto/PayOrderSubmitReqDTO.java | 2 +- .../order/dto/PayOrderSubmitRespDTO.java | 2 +- .../service/order/dto/PayRefundReqDTO.java | 2 +- .../service/order/dto/PayRefundRespDTO.java | 2 +- .../module/pay/service/package-info.java | 1 + .../pay/service/refund/PayRefundService.java | 61 +++++ .../service/refund/PayRefundServiceImpl.java | 152 ++++++----- .../yudao/module}/pay/util/PaySeqUtils.java | 4 +- .../service/merchant}/PayAppServiceTest.java | 23 +- .../merchant}/PayChannelServiceTest.java | 32 +-- .../merchant/PayMerchantServiceTest.java | 19 +- .../service/order/PayOrderServiceTest.java | 19 +- .../module/pay/service/package-info.java | 1 + .../service/refund/PayRefundServiceTest.java | 19 +- .../pay/test}/BaseDbAndRedisUnitTest.java | 5 +- .../module/pay/test}/BaseDbUnitTest.java | 2 +- .../module/pay/test}/BaseRedisUnitTest.java | 4 +- .../pay/test}/RedisTestConfiguration.java | 2 +- .../system/enums/DictTypeConstants.java | 25 -- .../pay/convert/order/PayRefundConvert.java | 23 -- ...g Boot 对象转换 MapStruct 入门》.md | 1 - .../userserver/modules/pay/package-info.java | 7 - 162 files changed, 1303 insertions(+), 1714 deletions(-) delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/package-info.java delete mode 100755 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayOrderExtensionMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/enums/PayErrorCodeConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/job/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/impl/PayChannelServiceImpl.java delete mode 100755 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayRefundService.java delete mode 100755 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayOrderServiceImpl.java delete mode 100755 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayRefundServiceImpl.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelConfig.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayOrderCoreConvert.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayRefundCoreConvert.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayAppCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayRefundCoreMapper.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayAppCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayChannelCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayAppCoreServiceImpl.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayChannelCoreServiceImpl.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/package-info.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayRefundCoreService.java delete mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java create mode 100644 yudao-module-pay/pom.xml create mode 100644 yudao-module-pay/yudao-module-pay-api/pom.xml create mode 100644 yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/DictTypeConstants.java rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/PayErrorCodeCoreConstants.java => yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java (97%) create mode 100644 yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/package-info.java create mode 100644 yudao-module-pay/yudao-module-pay-impl/pom.xml rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant}/PayAppController.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant}/PayChannelController.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/merchant/PayMerchantController.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppBaseVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppCreateReqVO.java (50%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppExcelVO.java (83%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppExportReqVO.java (84%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppPageItemRespVO.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppPageReqVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppRespVO.java (74%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppUpdateReqVO.java (72%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app}/PayAppUpdateStatusReqVO.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel}/PayChannelBaseVO.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel}/PayChannelCreateReqVO.java (60%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel}/PayChannelExcelVO.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel}/PayChannelExportReqVO.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel}/PayChannelPageReqVO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel}/PayChannelRespVO.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel}/PayChannelUpdateReqVO.java (60%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant}/PayMerchantBaseVO.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant}/PayMerchantCreateReqVO.java (51%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant}/PayMerchantExcelVO.java (91%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant}/PayMerchantExportReqVO.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant}/PayMerchantPageReqVO.java (88%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant}/PayMerchantRespVO.java (69%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant}/PayMerchantUpdateReqVO.java (71%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant}/PayMerchantUpdateStatusReqVO.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/order/PayOrderController.java (85%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo}/PayOrderBaseVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo}/PayOrderDetailsRespVO.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo}/PayOrderExcelVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo}/PayOrderExportReqVO.java (92%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo}/PayOrderPageItemRespVO.java (82%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo}/PayOrderPageReqVO.java (95%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo}/PayOrderRespVO.java (74%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund}/PayRefundController.java (86%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundBaseVO.java (98%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundCreateReqVO.java (60%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundDetailsRespVO.java (83%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundExcelVO.java (93%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundExportReqVO.java (94%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundPageItemRespVO.java (79%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundPageReqVO.java (96%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundRespVO.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin}/refund/vo/PayRefundUpdateReqVO.java (75%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayOrderController.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java (69%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayOrderSubmitReqVO.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java (83%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayOrderSubmitRespVO.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java (69%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/package-info.java rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayRefundController.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/AppPayRefundController.java (51%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayRefundReqVO.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/vo/AppPayRefundReqVO.java (87%) rename yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayRefundRespVO.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/vo/AppPayRefundRespVO.java (51%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/convert/app/PayAppConvert.java (71%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/convert/channel/PayChannelConvert.java (64%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/convert/merchant/PayMerchantConvert.java (56%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/convert/order/PayOrderConvert.java (72%) rename {yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/convert/package-info.java (57%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/convert/refund/PayRefundConvert.java (73%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md (100%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/dataobject/merchant/PayAppDO.java (94%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/dataobject/merchant/PayChannelDO.java (95%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/dataobject/merchant/PayMerchantDO.java (94%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/dataobject/notify/PayNotifyLogDO.java (86%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/dataobject/notify/PayNotifyTaskDO.java (78%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/dataobject/order/PayOrderDO.java (84%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/dataobject/order/PayOrderExtensionDO.java (89%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/refund}/PayRefundDO.java (90%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/app => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant}/PayAppMapper.java (68%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/channel => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant}/PayChannelMapper.java (76%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/mysql/merchant/PayMerchantMapper.java (82%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java (56%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java (79%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderExtensionCoreMapper.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderExtensionMapper.java (70%) mode change 100644 => 100755 rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/mysql/order/PayOrderMapper.java (78%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/refund}/PayRefundMapper.java (78%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/dal/redis/PayRedisKeyCoreConstants.java (65%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/redis/notify/PayNotifyLockCoreRedisDAO.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java (79%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/enums/notify/PayNotifyStatusEnum.java (89%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/enums/notify/PayNotifyTypeEnum.java (85%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/enums/order/PayOrderNotifyStatusEnum.java (89%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/enums/order/PayOrderStatusEnum.java (90%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/refund}/PayRefundStatusEnum.java (83%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/refund}/PayRefundTypeEnum.java (89%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/job/notify/PayNotifyJob.java (75%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/job/package-info.java create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/app => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant}/PayAppService.java (75%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/impl => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant}/PayAppServiceImpl.java (72%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant}/PayChannelService.java (59%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceImpl.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/merchant/PayMerchantService.java (81%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/impl => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant}/PayMerchantServiceImpl.java (77%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/PayNotifyCoreService.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyService.java (66%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/impl/PayNotifyCoreServiceImpl.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyServiceImpl.java (77%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java (88%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/notify/vo/PayNotifyOrderReqVO.java (92%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/notify/vo/PayRefundOrderReqVO.java (93%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/package-info.java rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/order/PayOrderExtensionService.java (80%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order}/PayOrderExtensionServiceImpl.java (68%) rename {yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/order/PayOrderService.java (55%) rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java (63%) mode change 100644 => 100755 rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/order/dto/PayOrderCreateReqDTO.java (95%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/order/dto/PayOrderSubmitReqDTO.java (92%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/order/dto/PayOrderSubmitRespDTO.java (83%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/order/dto/PayRefundReqDTO.java (93%) rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/service/order/dto/PayRefundRespDTO.java (85%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/package-info.java create mode 100755 yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundService.java rename yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayRefundCoreServiceImpl.java => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceImpl.java (62%) mode change 100644 => 100755 rename {yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module}/pay/util/PaySeqUtils.java (94%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/app => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant}/PayAppServiceTest.java (90%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant}/PayChannelServiceTest.java (93%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module}/pay/service/merchant/PayMerchantServiceTest.java (89%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module}/pay/service/order/PayOrderServiceTest.java (91%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/package-info.java rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module}/pay/service/refund/PayRefundServiceTest.java (90%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test}/BaseDbAndRedisUnitTest.java (95%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test}/BaseDbUnitTest.java (97%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test}/BaseRedisUnitTest.java (86%) rename {yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config => yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test}/RedisTestConfiguration.java (96%) delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/order/PayRefundConvert.java delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/package-info.java diff --git a/pom.xml b/pom.xml index f56f07ddb7..e5294f7d8e 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ yudao-module-system yudao-module-infra yudao-module-tool + yudao-module-pay ${artifactId} diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index dd73b51788..4eaef38c2a 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -37,6 +37,11 @@ yudao-module-infra-impl ${revision} + + cn.iocoder.boot + yudao-module-pay-impl + ${revision} + @@ -71,11 +76,7 @@ - - - cn.iocoder.boot - yudao-spring-boot-starter-web - + org.springframework.boot @@ -83,34 +84,6 @@ true - - cn.iocoder.boot - yudao-spring-boot-starter-security - - - - - cn.iocoder.boot - yudao-spring-boot-starter-mybatis - - - - cn.iocoder.boot - yudao-spring-boot-starter-redis - - - - - cn.iocoder.boot - yudao-spring-boot-starter-job - - - - - cn.iocoder.boot - yudao-spring-boot-starter-mq - - cn.iocoder.boot @@ -128,24 +101,6 @@ spring-boot-admin-starter-server - - - cn.iocoder.boot - yudao-spring-boot-starter-test - test - - - - - cn.iocoder.boot - yudao-spring-boot-starter-excel - - - - org.apache.velocity - velocity-engine-core - - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/package-info.java deleted file mode 100644 index da39733908..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package cn.iocoder.yudao.adminserver.modules.pay.convert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayOrderExtensionMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayOrderExtensionMapper.java deleted file mode 100755 index 47baabb317..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayOrderExtensionMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -/** - * 支付订单 Mapper - * - * @author aquan - */ -@Mapper -public interface PayOrderExtensionMapper extends BaseMapperX { - - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/enums/PayErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/enums/PayErrorCodeConstants.java deleted file mode 100644 index df39d9efc2..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/enums/PayErrorCodeConstants.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.pay.enums; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/job/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/job/package-info.java deleted file mode 100644 index 3db5697897..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/job/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.pay.job; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/package-info.java deleted file mode 100644 index a113b9beb6..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * pay 包下,我们放支付业务,提供业务的支付能力。 - * 例如说:商户、应用、支付、退款等等 - * - * 缩写:pay - */ -package cn.iocoder.yudao.adminserver.modules.pay; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/impl/PayChannelServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/impl/PayChannelServiceImpl.java deleted file mode 100644 index 6ba21f8c3c..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/impl/PayChannelServiceImpl.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.channel.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSONUtil; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.convert.channel.PayChannelConvert; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.channel.PayChannelMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.channel.PayChannelService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig; -import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Validator; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.CHANNEL_EXIST_SAME_CHANNEL_ERROR; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.CHANNEL_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 支付渠道 Service 实现类 - * - * @author aquan - */ -@Service -@Slf4j -@Validated -public class PayChannelServiceImpl implements PayChannelService { - - @Resource - private PayChannelMapper channelMapper; - - @Resource - private Validator validator; - - @Override - public Long createChannel(PayChannelCreateReqVO reqVO) { - // 断言是否有重复的 - PayChannelDO channelDO = this.getChannelByConditions(reqVO.getMerchantId(), reqVO.getAppId(), reqVO.getCode()); - if (ObjectUtil.isNotNull(channelDO)) { - throw exception(CHANNEL_EXIST_SAME_CHANNEL_ERROR); - } - - // 新增渠道 - PayChannelDO channel = PayChannelConvert.INSTANCE.convert(reqVO); - settingConfigAndCheckParam(channel, reqVO.getConfig()); - channelMapper.insert(channel); - return channel.getId(); - } - - @Override - public void updateChannel(PayChannelUpdateReqVO updateReqVO) { - // 校验存在 - this.validateChannelExists(updateReqVO.getId()); - // 更新 - PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO); - settingConfigAndCheckParam(channel, updateReqVO.getConfig()); - channelMapper.updateById(channel); - } - - @Override - public void deleteChannel(Long id) { - // 校验存在 - this.validateChannelExists(id); - // 删除 - channelMapper.deleteById(id); - } - - private void validateChannelExists(Long id) { - if (channelMapper.selectById(id) == null) { - throw exception(CHANNEL_NOT_EXISTS); - } - } - - @Override - public PayChannelDO getChannel(Long id) { - return channelMapper.selectById(id); - } - - @Override - public List getChannelList(Collection ids) { - return channelMapper.selectBatchIds(ids); - } - - @Override - public PageResult getChannelPage(PayChannelPageReqVO pageReqVO) { - return channelMapper.selectPage(pageReqVO); - } - - @Override - public List getChannelList(PayChannelExportReqVO exportReqVO) { - return channelMapper.selectList(exportReqVO); - } - - /** - * 根据支付应用ID集合获得支付渠道列表 - * - * @param appIds 应用编号集合 - * @return 支付渠道列表 - */ - @Override - public List getChannelListByAppIds(Collection appIds) { - return channelMapper.getChannelListByAppIds(appIds); - } - - - /** - * 根据条件获取通道数量 - * - * @param merchantId 商户编号 - * @param appid 应用编号 - * @param code 通道编码 - * @return 数量 - */ - @Override - public Integer getChannelCountByConditions(Long merchantId, Long appid, String code) { - return this.channelMapper.selectCount(merchantId, appid, code); - } - - /** - * 根据条件获取通道 - * - * @param merchantId 商户编号 - * @param appid 应用编号 - * @param code 通道编码 - * @return 数量 - */ - @Override - public PayChannelDO getChannelByConditions(Long merchantId, Long appid, String code) { - return this.channelMapper.selectOne(merchantId, appid, code); - } - - /** - * 设置渠道配置以及参数校验 - * - * @param channel 渠道 - * @param configStr 配置 - */ - private void settingConfigAndCheckParam(PayChannelDO channel, String configStr) { - // 得到这个渠道是微信的还是支付宝的 - Class payClass = PayChannelEnum.getByCode(channel.getCode()).getConfigClass(); - if (ObjectUtil.isNull(payClass)) { - throw exception(CHANNEL_NOT_EXISTS); - } - PayClientConfig config = JSONUtil.toBean(configStr, payClass); - - // 验证参数 - config.validate(validator); - channel.setConfig(config); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayRefundService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayRefundService.java deleted file mode 100755 index 1412bdefea..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayRefundService.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.order; - -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.PayRefundExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.PayRefundPageReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import java.util.List; - -/** - * 退款订单 Service 接口 - * - * @author aquan - */ -public interface PayRefundService { - - /** - * 获得退款订单 - * - * @param id 编号 - * @return 退款订单 - */ - PayRefundDO getRefund(Long id); - - /** - * 获得退款订单分页 - * - * @param pageReqVO 分页查询 - * @return 退款订单分页 - */ - PageResult getRefundPage(PayRefundPageReqVO pageReqVO); - - /** - * 获得退款订单列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 退款订单列表 - */ - List getRefundList(PayRefundExportReqVO exportReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayOrderServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayOrderServiceImpl.java deleted file mode 100755 index dd6d0a8bd2..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayOrderServiceImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.order.impl; - -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order.PayOrderMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.PayOrderService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -/** - * 支付订单 Service 实现类 - * - * @author aquan - */ -@Service -@Validated -public class PayOrderServiceImpl implements PayOrderService { - - @Resource - private PayOrderMapper orderMapper; - - @Override - public PayOrderDO getOrder(Long id) { - return orderMapper.selectById(id); - } - - @Override - public PageResult getOrderPage(PayOrderPageReqVO pageReqVO) { - return orderMapper.selectPage(pageReqVO); - } - - @Override - public List getOrderList(PayOrderExportReqVO exportReqVO) { - return orderMapper.selectList(exportReqVO); - } - - /** - * 根据 ID 集合获取只包含商品名称的订单集合 - * - * @param idList 订单 ID 集合 - * @return 只包含商品名称的订单集合 - */ - @Override - public List getOrderSubjectList(Collection idList) { - return orderMapper.findByIdListQueryOrderSubject(idList); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayRefundServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayRefundServiceImpl.java deleted file mode 100755 index 00f42ebcde..0000000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayRefundServiceImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.order.impl; - -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.PayRefundExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.PayRefundPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order.PayRefundMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.PayRefundService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 退款订单 Service 实现类 - * - * @author aquan - */ -@Service -@Validated -public class PayRefundServiceImpl implements PayRefundService { - - @Resource - private PayRefundMapper refundMapper; - - @Override - public PayRefundDO getRefund(Long id) { - return refundMapper.selectById(id); - } - - @Override - public PageResult getRefundPage(PayRefundPageReqVO pageReqVO) { - return refundMapper.selectPage(pageReqVO); - } - - @Override - public List getRefundList(PayRefundExportReqVO exportReqVO) { - return refundMapper.selectList(exportReqVO); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelConfig.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelConfig.java deleted file mode 100644 index bff90e6e08..0000000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.channel; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.validation.Validation; -import javax.validation.Validator; - -/** - * 用于初始化 validator Bean 对象 - * @author aquan - */ -@Configuration -public class PayChannelConfig { - - @Bean - public Validator validator(){ - return Validation.buildDefaultValidatorFactory().getValidator(); - } -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayOrderCoreConvert.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayOrderCoreConvert.java deleted file mode 100644 index 3e5215cd87..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayOrderCoreConvert.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.convert.order; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; -import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface PayOrderCoreConvert { - - PayOrderCoreConvert INSTANCE = Mappers.getMapper(PayOrderCoreConvert.class); - - PayOrderDO convert(PayOrderCreateReqDTO bean); - - PayOrderExtensionDO convert(PayOrderSubmitReqDTO bean); - - PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqDTO bean); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayRefundCoreConvert.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayRefundCoreConvert.java deleted file mode 100644 index 4a4ada555f..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayRefundCoreConvert.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.convert.order; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface PayRefundCoreConvert { - - PayRefundCoreConvert INSTANCE = Mappers.getMapper(PayRefundCoreConvert.class); - - //TODO 太多需要处理了, 暂时不用 - @Mappings(value = { - @Mapping(source = "amount", target = "payAmount"), - @Mapping(source = "id", target = "orderId"), - @Mapping(target = "status",ignore = true) - }) - PayRefundDO convert(PayOrderDO orderDO); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/package-info.java deleted file mode 100644 index b10c090290..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package cn.iocoder.yudao.coreservice.modules.pay.convert; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 8153487b72..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayAppCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayAppCoreMapper.java deleted file mode 100644 index 603ff4609c..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayAppCoreMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.merchant; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PayAppCoreMapper extends BaseMapperX { -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapper.java deleted file mode 100644 index 767a16b24e..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.merchant; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.util.Date; - -@Mapper -public interface PayChannelCoreMapper extends BaseMapperX { - - default PayChannelDO selectByAppIdAndCode(Long appId, String code) { - return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code); - } - - @Select("SELECT id FROM pay_channel WHERE update_time > #{maxUpdateTime} LIMIT 1") - Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderCoreMapper.java deleted file mode 100644 index 1ed34d549b..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderCoreMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PayOrderCoreMapper extends BaseMapperX { - - default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) { - return selectOne(new QueryWrapper().eq("app_id", appId) - .eq("merchant_order_id", merchantOrderId)); - } - - default int updateByIdAndStatus(Long id, Integer status, PayOrderDO update) { - return update(update, new QueryWrapper() - .eq("id", id).eq("status", status)); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayRefundCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayRefundCoreMapper.java deleted file mode 100644 index 8de1396dde..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayRefundCoreMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - - -/** - * 退款订单 Mapper - * - */ -@Mapper -public interface PayRefundCoreMapper extends BaseMapperX { - - default PayRefundDO selectByReqNo(String reqNo) { - return selectOne("req_no", reqNo); - } - - default PayRefundDO selectByTradeNoAndMerchantRefundNo(String tradeNo, String merchantRefundNo){ - return selectOne("trade_no", tradeNo, "merchant_refund_no", merchantRefundNo); - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/package-info.java deleted file mode 100644 index 8f5ba6ac30..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * pay 包下,我们放支付业务,提供业务的支付能力。 - * 例如说:商户、应用、支付、退款等等 - * - * 缩写:pay - */ -package cn.iocoder.yudao.coreservice.modules.pay; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayAppCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayAppCoreService.java deleted file mode 100644 index ab6f3f27f0..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayAppCoreService.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.merchant; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.framework.common.exception.ServiceException; - -/** - * 支付应用 Core Service 接口 - * - * @author 芋道源码 - */ -public interface PayAppCoreService { - - /** - * 支付应用的合法性 - * - * 如果不合法,抛出 {@link ServiceException} 业务异常 - * - * @param id 应用编号 - * @return 应用信息 - */ - PayAppDO validPayApp(Long id); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayChannelCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayChannelCoreService.java deleted file mode 100644 index 76d4678759..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayChannelCoreService.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.merchant; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.framework.common.exception.ServiceException; - -/** - * 支付渠道 Core Service 接口 - * - * @author 芋道源码 - */ -public interface PayChannelCoreService { - - /** - * 初始化支付客户端 - */ - void initPayClients(); - - /** - * 支付渠道的合法性 - * - * 如果不合法,抛出 {@link ServiceException} 业务异常 - * - * @param id 渠道编号 - * @return 渠道信息 - */ - PayChannelDO validPayChannel(Long id); - - /** - * 支付渠道的合法性 - * - * 如果不合法,抛出 {@link ServiceException} 业务异常 - * - * @param appId 应用编号 - * @param code 支付渠道 - * @return 渠道信息 - */ - PayChannelDO validPayChannel(Long appId, String code); - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayAppCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayAppCoreServiceImpl.java deleted file mode 100644 index 916b501377..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayAppCoreServiceImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.merchant.impl; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.merchant.PayAppCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayAppCoreService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.*; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 支付应用 Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Valid -@Slf4j -public class PayAppCoreServiceImpl implements PayAppCoreService { - - @Resource - private PayAppCoreMapper payAppCoreMapper; - - @Override - public PayAppDO validPayApp(Long id) { - PayAppDO app = payAppCoreMapper.selectById(id); - // 校验是否存在 - if (app == null) { - throw exception(PAY_APP_NOT_FOUND); - } - // 校验是否禁用 - if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) { - throw exception(PAY_APP_IS_DISABLE); - } - return app; - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayChannelCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayChannelCoreServiceImpl.java deleted file mode 100644 index 5029b6ebd7..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayChannelCoreServiceImpl.java +++ /dev/null @@ -1,121 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.merchant.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.merchant.PayChannelCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants; -import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayChannelCoreService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import javax.validation.Valid; - -import java.util.Comparator; -import java.util.Date; -import java.util.List; - -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.*; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 支付渠道 Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Valid -@Slf4j -public class PayChannelCoreServiceImpl implements PayChannelCoreService { - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private PayChannelCoreMapper payChannelCoreMapper; - - @Resource - private PayClientFactory payClientFactory; - - @Override - @PostConstruct - public void initPayClients() { - // 获取支付渠道,如果有更新 - List payChannels = this.loadPayChannelIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(payChannels)) { - return; - } - - // 创建或更新支付 Client - payChannels.forEach(payChannel -> payClientFactory.createOrUpdatePayClient(payChannel.getId(), - payChannel.getCode(), payChannel.getConfig())); - - // 写入缓存 - assert payChannels.size() > 0; // 断言,避免告警 - maxUpdateTime = payChannels.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initPayClients][初始化 PayChannel 数量为 {}]", payChannels.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initPayClients(); - } - - /** - * 如果支付渠道发生变化,从数据库中获取最新的全量支付渠道。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前支付渠道的最大更新时间 - * @return 支付渠道列表 - */ - private List loadPayChannelIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadPayChannelIfUpdate][首次加载全量支付渠道]"); - } else { // 判断数据库中是否有更新的支付渠道 - if (payChannelCoreMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { - return null; - } - log.info("[loadPayChannelIfUpdate][增量加载全量支付渠道]"); - } - // 第二步,如果有更新,则从数据库加载所有支付渠道 - return payChannelCoreMapper.selectList(); - } - - @Override - public PayChannelDO validPayChannel(Long id) { - PayChannelDO channel = payChannelCoreMapper.selectById(id); - this.validPayChannel(channel); - return channel; - } - - @Override - public PayChannelDO validPayChannel(Long appId, String code) { - PayChannelDO channel = payChannelCoreMapper.selectByAppIdAndCode(appId, code); - this.validPayChannel(channel); - return channel; - } - - private void validPayChannel(PayChannelDO channel) { - if (channel == null) { - throw exception(PAY_CHANNEL_NOT_FOUND); - } - if (CommonStatusEnum.DISABLE.getStatus().equals(channel.getStatus())) { - throw exception(PayErrorCodeCoreConstants.PAY_CHANNEL_IS_DISABLE); - } - } - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/package-info.java deleted file mode 100644 index 78667d3ce9..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 这里的 VO 包有点特殊,是提供给接入支付模块的业务,提供回调接口时,可以直接使用 VO - * - * 例如说,支付单的回调,使用 - */ -package cn.iocoder.yudao.coreservice.modules.pay.service.notify.vo; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java deleted file mode 100644 index 07e659229b..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order; - -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; - -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.*; -import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO; - -import javax.validation.Valid; - -/** - * 支付订单 Core Service - * - * @author 芋道源码 - */ -public interface PayOrderCoreService { - - /** - * 获得支付单 - * - * @param id 支付单编号 - * @return 支付单 - */ - PayOrderDO getPayOrder(Long id); - - /** - * 创建支付单 - * - * @param reqDTO 创建请求 - * @return 支付单编号 - */ - Long createPayOrder(@Valid PayOrderCreateReqDTO reqDTO); - - /** - * 提交支付 - * 此时,会发起支付渠道的调用 - * - * @param reqDTO 提交请求 - * @return 提交结果 - */ - PayOrderSubmitRespDTO submitPayOrder(@Valid PayOrderSubmitReqDTO reqDTO); - - /** - * 通知支付单成功 - * - * @param channelId 渠道编号 - * @param notifyData 通知数据 - */ - void notifyPayOrder(Long channelId, PayNotifyDataDTO notifyData) throws Exception; - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayRefundCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayRefundCoreService.java deleted file mode 100644 index b56384ed67..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayRefundCoreService.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order; - -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayRefundReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayRefundRespDTO; -import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO; - -/** - * 退款单 Core Service - * - * @author jason - */ -public interface PayRefundCoreService { - - /** - * 提交退款申请 - * - * @param reqDTO 退款申请信息 - * @return 退款申请返回信息 - */ - PayRefundRespDTO submitRefundOrder(PayRefundReqDTO reqDTO); - - /** - * 渠道的退款通知 - * - * @param channelId 渠道编号 - * @param notifyData 通知数据 - * @throws Exception 退款通知异常 - */ - void notifyPayRefund(Long channelId, PayNotifyDataDTO notifyData) throws Exception; - -} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java deleted file mode 100644 index 13b4863a5b..0000000000 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service; diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/PayChannelEnum.java b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/PayChannelEnum.java index 418676fca2..f8a4971a14 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/PayChannelEnum.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/PayChannelEnum.java @@ -17,10 +17,7 @@ import lombok.Getter; @AllArgsConstructor public enum PayChannelEnum { - /** - * 公众号网页 - */ - WX_PUB("wx_pub", "微信 JSAPI 支付", WXPayClientConfig.class), + WX_PUB("wx_pub", "微信 JSAPI 支付", WXPayClientConfig.class), // 公众号网页 WX_LITE("wx_lite", "微信小程序支付", WXPayClientConfig.class), WX_APP("wx_app", "微信 App 支付", WXPayClientConfig.class), @@ -34,16 +31,16 @@ public enum PayChannelEnum { *

* 参考 https://www.pingxx.com/api/支付渠道属性值.html */ - private String code; + private final String code; /** * 名字 */ - private String name; + private final String name; /** * 配置类 */ - private Class configClass; + private final Class configClass; /** * 微信支付 @@ -58,6 +55,6 @@ public enum PayChannelEnum { public static PayChannelEnum getByCode(String code) { return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values()); } - + } diff --git a/yudao-module-pay/pom.xml b/yudao-module-pay/pom.xml new file mode 100644 index 0000000000..36fd9edb30 --- /dev/null +++ b/yudao-module-pay/pom.xml @@ -0,0 +1,25 @@ + + + + cn.iocoder.boot + yudao + ${revision} + + 4.0.0 + yudao-module-pay + pom + + yudao-module-pay-api + yudao-module-pay-impl + + + ${artifactId} + + pay 模块,我们放支付业务,提供业务的支付能力。 + 例如说:商户、应用、支付、退款等等 + + + + diff --git a/yudao-module-pay/yudao-module-pay-api/pom.xml b/yudao-module-pay/yudao-module-pay-api/pom.xml new file mode 100644 index 0000000000..d5ec95176c --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-api/pom.xml @@ -0,0 +1,26 @@ + + + + yudao-module-pay + cn.iocoder.boot + 1.4.0-snapshot + + 4.0.0 + yudao-module-pay-api + jar + + ${artifactId} + + pay 模块 API,暴露给其它模块调用 + + + + + cn.iocoder.boot + yudao-common + + + + diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/DictTypeConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/DictTypeConstants.java new file mode 100644 index 0000000000..2f40f2df47 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/DictTypeConstants.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.pay.enums; + +/** + * Pay 字典类型的枚举类 + * + * @author 芋道源码 + */ +public interface DictTypeConstants { + + /** + * 支付-订单-订单状态 + */ + String PAY_ORDER_STATUS = "pay_order_status"; + + /** + * 支付-订单-订单回调商户状态 + */ + String PAY_ORDER_NOTIFY_STATUS = "pay_order_notify_status"; + + /** + * 支付-订单-订单退款状态 + */ + String PAY_ORDER_REFUND_STATUS = "pay_order_refund_status"; + + /** + * 支付-退款订单-退款状态 + */ + String PAY_REFUND_ORDER_STATUS = "pay_refund_order_status"; + + /** + * 支付-退款订单-退款类别 + */ + String PAY_REFUND_ORDER_TYPE = "pay_refund_order_type"; + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/PayErrorCodeCoreConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java similarity index 97% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/PayErrorCodeCoreConstants.java rename to yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java index f5133ad05c..203cb07038 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/PayErrorCodeCoreConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.enums; +package cn.iocoder.yudao.module.pay.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; * * pay 系统,使用 1-007-000-000 段 */ -public interface PayErrorCodeCoreConstants { +public interface ErrorCodeConstants { /** * ========== APP 模块 1-007-000-000 ========== diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/package-info.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/package-info.java new file mode 100644 index 0000000000..756410aa84 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.pay; diff --git a/yudao-module-pay/yudao-module-pay-impl/pom.xml b/yudao-module-pay/yudao-module-pay-impl/pom.xml new file mode 100644 index 0000000000..f8e6da5dc7 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/pom.xml @@ -0,0 +1,103 @@ + + + + yudao-module-pay + cn.iocoder.boot + 1.4.0-snapshot + + 4.0.0 + yudao-module-pay-impl + jar + + ${artifactId} + + pay 模块,我们放支付业务,提供业务的支付能力。 + 例如说:商户、应用、支付、退款等等 + + + + + cn.iocoder.boot + yudao-module-pay-api + ${revision} + + + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-operatelog + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-pay + + + + + cn.iocoder.boot + yudao-spring-boot-starter-security + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mybatis + + + + cn.iocoder.boot + yudao-spring-boot-starter-redis + + + + + cn.iocoder.boot + yudao-spring-boot-starter-job + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mq + + + + + cn.iocoder.boot + yudao-spring-boot-starter-test + test + + + + + cn.iocoder.boot + yudao-spring-boot-starter-excel + + + + + + + ${artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + repackage + + + + + + + + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/PayAppController.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayAppController.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/PayAppController.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayAppController.java index 3446243929..0d06c9e253 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/PayAppController.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayAppController.java @@ -1,20 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app; +package cn.iocoder.yudao.module.pay.controller.admin.merchant; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.*; -import cn.iocoder.yudao.adminserver.modules.pay.convert.app.PayAppConvert; -import cn.iocoder.yudao.adminserver.modules.pay.service.app.PayAppService; -import cn.iocoder.yudao.adminserver.modules.pay.service.channel.PayChannelService; -import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.PayMerchantService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.*; +import cn.iocoder.yudao.module.pay.convert.app.PayAppConvert; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; +import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; +import cn.iocoder.yudao.module.pay.service.merchant.PayMerchantService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -33,7 +33,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @Slf4j -@Api(tags = "支付应用信息") +@Api(tags = "管理后台 - 支付应用信息") @RestController @RequestMapping("/pay/app") @Validated @@ -106,7 +106,7 @@ public class PayAppController { return success(new PageResult<>(pageResult.getTotal())); } - // 得到所有的应用编号,查出所有的通道 + // 得到所有的应用编号,查出所有的渠道 Collection payAppIds = CollectionUtils.convertList(pageResult.getList(), PayAppDO::getId); List channels = channelService.getChannelListByAppIds(payAppIds); // TODO @aquan:可以基于 appId 简历一个 multiMap。这样下面,直接 get 到之后,CollUtil buildSet 即可 @@ -116,7 +116,7 @@ public class PayAppController { Collection merchantIds = CollectionUtils.convertList(pageResult.getList(), PayAppDO::getMerchantId); Map deptMap = merchantService.getMerchantMap(merchantIds); - // 利用反射将通道数据复制到返回的数据结构中去 + // 利用反射将渠道数据复制到返回的数据结构中去 List appList = new ArrayList<>(pageResult.getList().size()); pageResult.getList().forEach(app -> { // 写入应用信息的数据 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/PayChannelController.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayChannelController.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/PayChannelController.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayChannelController.java index ae83ef9cc2..82d3a354e3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/PayChannelController.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayChannelController.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.channel; +package cn.iocoder.yudao.module.pay.controller.admin.merchant; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.*; -import cn.iocoder.yudao.adminserver.modules.pay.convert.channel.PayChannelConvert; -import cn.iocoder.yudao.adminserver.modules.pay.service.channel.PayChannelService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.*; +import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -26,11 +26,7 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -/** - * 支付渠道 controller 组件 - * @author aquan - */ -@Api(tags = "支付渠道") +@Api(tags = "管理后台 - 支付渠道") @RestController @RequestMapping("/pay/channel") @Validated @@ -39,7 +35,6 @@ public class PayChannelController { @Resource private PayChannelService channelService; - @PostMapping("/create") @ApiOperation("创建支付渠道 ") @PreAuthorize("@ss.hasPermission('pay:channel:create')") @@ -116,7 +111,6 @@ public class PayChannelController { @PreAuthorize("@ss.hasPermission('pay:channel:query')") public CommonResult getChannel( @RequestParam Long merchantId, @RequestParam Long appId, @RequestParam String code) { - // 獲取渠道 PayChannelDO channel = channelService.getChannelByConditions(merchantId, appId, code); if (channel == null) { @@ -126,4 +120,5 @@ public class PayChannelController { PayChannelRespVO respVo = PayChannelConvert.INSTANCE.convert(channel); return success(respVo); } + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/PayMerchantController.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayMerchantController.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/PayMerchantController.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayMerchantController.java index ae0235efc1..0882502aac 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/PayMerchantController.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/PayMerchantController.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant; +package cn.iocoder.yudao.module.pay.controller.admin.merchant; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.*; -import cn.iocoder.yudao.adminserver.modules.pay.convert.merchant.PayMerchantConvert; -import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.PayMerchantService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.*; +import cn.iocoder.yudao.module.pay.convert.merchant.PayMerchantConvert; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.service.merchant.PayMerchantService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppBaseVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppBaseVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.java index 6ffe565ec4..795b3c6438 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppBaseVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppCreateReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.java similarity index 50% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppCreateReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.java index 3b0e69b99c..a66a719632 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppCreateReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.java @@ -1,11 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import lombok.*; -import java.util.*; import io.swagger.annotations.*; -import javax.validation.constraints.*; -@ApiModel("支付应用信息创建 Request VO") +@ApiModel("管理后台 - 支付应用信息创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppExcelVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppExcelVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.java index f81b53bd08..3fc274a03a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppExcelVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.java @@ -1,10 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; /** * 支付应用信息 Excel VO diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppExportReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.java similarity index 84% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppExportReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.java index b5d284447f..d8b4642503 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppExportReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import lombok.*; import java.util.*; @@ -8,7 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "支付应用信息 Excel 导出 Request VO", description = "参数和 PayAppPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 支付应用信息 Excel 导出 Request VO", description = "参数和 PayAppPageReqVO 是一致的") @Data public class PayAppExportReqVO { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppPageItemRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppPageItemRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.java index 6d8144afe2..e5ad0825f3 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppPageItemRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,12 +9,7 @@ import lombok.ToString; import java.util.Date; import java.util.Set; -/** - * 支付应用信息分页查询 Response VO - * - * @author aquan - */ -@ApiModel(value = "支付应用信息分页查询 Response VO", description = "相比于支付信息,还会多出应用渠道的开关信息") +@ApiModel(value = "管理后台 - 支付应用信息分页查询 Response VO", description = "相比于支付信息,还会多出应用渠道的开关信息") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppPageReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppPageReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.java index 62156e9934..62af7e19f5 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppPageReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import lombok.*; import java.util.*; @@ -8,7 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("支付应用信息分页 Request VO") +@ApiModel("管理后台 - 支付应用信息分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.java similarity index 74% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.java index 565491f926..e0ac450a2d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import lombok.*; import java.util.*; import io.swagger.annotations.*; -@ApiModel("支付应用信息 Response VO") +@ApiModel("管理后台 - 支付应用信息 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppUpdateReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppUpdateReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.java index 426366fc15..9bdd042543 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppUpdateReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.java @@ -1,11 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import lombok.*; -import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; -@ApiModel("支付应用信息更新 Request VO") +@ApiModel("管理后台 - 支付应用信息更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppUpdateStatusReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppUpdateStatusReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.java index 28a3218ae4..2ccce684cb 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/app/vo/PayAppUpdateStatusReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,7 +6,7 @@ import lombok.Data; import javax.validation.constraints.NotNull; -@ApiModel("应用更新状态 Request VO") +@ApiModel("管理后台 - 应用更新状态 Request VO") @Data public class PayAppUpdateStatusReqVO { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelBaseVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelBaseVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.java index 42a98b972f..8b9f534904 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelBaseVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.java @@ -1,13 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel; import lombok.*; -import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; /** -* 支付渠道 - Base VO,提供给添加、修改、详细的子 VO 使用 +* 支付渠道 Base VO,提供给添加、修改、详细的子 VO 使用 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelCreateReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.java similarity index 60% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelCreateReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.java index a814b7b863..5852f9bb17 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelCreateReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,14 +8,14 @@ import lombok.ToString; import javax.validation.constraints.NotBlank; -@ApiModel("支付渠道 创建 Request VO") +@ApiModel("管理后台 - 支付渠道 创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class PayChannelCreateReqVO extends PayChannelBaseVO { - @ApiModelProperty(value = "通道配置的 json 字符串") - @NotBlank(message = "通道配置不能为空") + @ApiModelProperty(value = "渠道配置的 json 字符串") + @NotBlank(message = "渠道配置不能为空") private String config; } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelExcelVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelExcelVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.java index a4618780ab..780abb18f0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelExcelVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel; import lombok.*; import java.util.*; @@ -7,8 +7,7 @@ import io.swagger.annotations.*; import com.alibaba.excel.annotation.ExcelProperty; /** - * 支付渠道 - Excel VO + * 支付渠道 Excel VO * * @author 芋艿 */ diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelExportReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelExportReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.java index 29e3acdaf4..d4d6e66532 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelExportReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel; import lombok.*; import java.util.*; @@ -8,7 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "支付渠道 Excel 导出 Request VO", description = "参数和 PayChannelPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 支付渠道 Excel 导出 Request VO", description = "参数和 PayChannelPageReqVO 是一致的") @Data public class PayChannelExportReqVO { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelPageReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.java similarity index 90% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelPageReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.java index 83851f944c..29995d07ab 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelPageReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel; import lombok.*; import java.util.*; @@ -8,7 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("支付渠道 分页 Request VO") +@ApiModel("管理后台 - 支付渠道 分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.java index 02873b9f52..b2644f4d0e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel; import lombok.*; import java.util.*; import io.swagger.annotations.*; -@ApiModel("支付渠道 Response VO") +@ApiModel("管理后台 - 支付渠道 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelUpdateReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.java similarity index 60% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelUpdateReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.java index fdefc7badc..c216de9aea 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/channel/vo/PayChannelUpdateReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.java @@ -1,11 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel; import lombok.*; -import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; -@ApiModel("支付渠道 更新 Request VO") +@ApiModel("管理后台 - 支付渠道 更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @@ -15,7 +14,7 @@ public class PayChannelUpdateReqVO extends PayChannelBaseVO { @NotNull(message = "商户编号不能为空") private Long id; - @ApiModelProperty(value = "通道配置的json字符串") - @NotBlank(message = "通道配置不能为空") + @ApiModelProperty(value = "渠道配置的json字符串") + @NotBlank(message = "渠道配置不能为空") private String config; } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantBaseVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantBaseVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.java index ed7b69a3f8..1052fdd03e 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantBaseVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantCreateReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.java similarity index 51% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantCreateReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.java index 2128de88bf..018db180be 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantCreateReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.java @@ -1,11 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant; import lombok.*; -import java.util.*; import io.swagger.annotations.*; -import javax.validation.constraints.*; -@ApiModel("支付商户信息创建 Request VO") +@ApiModel("管理后台 - 支付商户信息创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantExcelVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.java similarity index 91% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantExcelVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.java index cb229fb115..b399a111d7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantExcelVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantExportReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantExportReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.java index c6c3222828..680b04b353 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantExportReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant; import lombok.*; import java.util.*; @@ -8,7 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "支付商户信息 Excel 导出 Request VO", description = "参数和 PayMerchantPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 支付商户信息 Excel 导出 Request VO", description = "参数和 PayMerchantPageReqVO 是一致的") @Data public class PayMerchantExportReqVO { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantPageReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.java similarity index 88% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantPageReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.java index 8a66ac9531..241287c986 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantPageReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant; import lombok.*; import java.util.*; @@ -8,7 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("支付商户信息分页 Request VO") +@ApiModel("管理后台 - 支付商户信息分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.java similarity index 69% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.java index d5b194359c..a27c591a14 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,7 +8,7 @@ import lombok.ToString; import java.util.Date; -@ApiModel("支付商户信息 Response VO") +@ApiModel("管理后台 - 支付商户信息 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @@ -20,11 +20,7 @@ public class PayMerchantRespVO extends PayMerchantBaseVO { @ApiModelProperty(value = "创建时间", required = true) private Date createTime; - /** - * 商户号 - * 例如说,M233666999 - * 只有新增时插入,不允许修改 - */ + @ApiModelProperty(value = "商户号", required = true, example = "M233666999") private String no; } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantUpdateReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.java similarity index 71% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantUpdateReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.java index 031d34fd5d..d270a3d845 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantUpdateReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.java @@ -1,11 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant; import lombok.*; -import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; -@ApiModel("支付商户信息更新 Request VO") +@ApiModel("管理后台 - 支付商户信息更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantUpdateStatusReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantUpdateStatusReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.java index 635876954e..39e26b8b74 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantUpdateStatusReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo; +package cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,7 +6,7 @@ import lombok.Data; import javax.validation.constraints.NotNull; -@ApiModel("商户更新状态 Request VO") +@ApiModel("管理后台 - 商户更新状态 Request VO") @Data public class PayMerchantUpdateStatusReqVO { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/PayOrderController.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/PayOrderController.java similarity index 85% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/PayOrderController.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/PayOrderController.java index 2ac44c66e1..2219204c43 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/PayOrderController.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/PayOrderController.java @@ -1,17 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order; +package cn.iocoder.yudao.module.pay.controller.admin.order; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.*; -import cn.iocoder.yudao.adminserver.modules.pay.convert.order.PayOrderConvert; -import cn.iocoder.yudao.adminserver.modules.pay.service.app.PayAppService; -import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.PayMerchantService; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.PayOrderExtensionService; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.PayOrderService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.*; +import cn.iocoder.yudao.module.pay.convert.order.PayOrderConvert; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; +import cn.iocoder.yudao.module.pay.service.merchant.PayMerchantService; +import cn.iocoder.yudao.module.pay.service.order.PayOrderExtensionService; +import cn.iocoder.yudao.module.pay.service.order.PayOrderService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -39,38 +39,18 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -/** - * 支付订单 controller 组件 - * - * @author aquan - */ -@Api(tags = "支付订单") +@Api(tags = "管理后台 - 支付订单") @RestController @RequestMapping("/pay/order") @Validated public class PayOrderController { - /** - * 订单 service 组件 - */ @Resource private PayOrderService orderService; - - /** - * 订单扩展 service 组件 - */ @Resource private PayOrderExtensionService orderExtensionService; - - /** - * 商户 service 组件 - */ @Resource private PayMerchantService merchantService; - - /** - * 应用 service 组件 - */ @Resource private PayAppService appService; @@ -88,6 +68,7 @@ public class PayOrderController { PayAppDO appDO = appService.getApp(order.getAppId()); PayChannelEnum channelEnum = PayChannelEnum.getByCode(order.getChannelCode()); + // TODO @aquan:文案,都是前端 format; PayOrderDetailsRespVO respVO = PayOrderConvert.INSTANCE.orderDetailConvert(order); respVO.setMerchantName(ObjectUtil.isNotNull(merchantDO) ? merchantDO.getName() : "未知商户"); respVO.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderBaseVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderBaseVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderBaseVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderBaseVO.java index 320125a403..1064720fba 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderBaseVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; +package cn.iocoder.yudao.module.pay.controller.admin.order.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,8 +10,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; /** - * 支付订单 - * Base VO,提供给添加、修改、详细的子 VO 使用 + * 支付订单 Base VO,提供给添加、修改、详细的子 VO 使用 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 * * @author aquan diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderDetailsRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderDetailsRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java index d85a9bcb1c..6bf7152b54 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderDetailsRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; +package cn.iocoder.yudao.module.pay.controller.admin.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,12 +8,7 @@ import lombok.ToString; import java.util.Date; -/** - * 支付订单详细信息,由支付订单和支付订单扩展信息组成 - * - * @author aquan - */ -@ApiModel("支付订单详细信息 Response VO") +@ApiModel("管理后台 - 支付订单详细信息 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExcelVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExcelVO.java index f6836bc8c1..c620e2d1b2 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExcelVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExcelVO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; +package cn.iocoder.yudao.module.pay.controller.admin.order.vo; -import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.pay.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExportReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java similarity index 92% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExportReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java index 3445c86b99..c079ea144a 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderExportReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; +package cn.iocoder.yudao.module.pay.controller.admin.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,11 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -/** - * 支付订单 Excel 导出 Request VO - * @author aquan - */ -@ApiModel(value = "支付订单 Excel 导出 Request VO", description = "参数和 PayOrderPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 支付订单 Excel 导出 Request VO", description = "参数和 PayOrderPageReqVO 是一致的") @Data public class PayOrderExportReqVO { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderPageItemRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderPageItemRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java index b24b27a470..3c0b4e6351 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderPageItemRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; +package cn.iocoder.yudao.module.pay.controller.admin.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,12 +8,7 @@ import lombok.ToString; import java.util.Date; -/** - * 支付订单分页 Request VO - * - * @author aquan - */ -@ApiModel("支付订单分页 Request VO") +@ApiModel("管理后台 - 支付订单分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderPageReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java similarity index 95% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderPageReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java index 07fa6a8204..5787ba285a 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderPageReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; +package cn.iocoder.yudao.module.pay.controller.admin.order.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,12 +12,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -/** - * 支付订单分页 Request VO - * - * @author aquan - */ -@ApiModel("支付订单分页 Request VO") +@ApiModel("管理后台 - 支付订单分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderRespVO.java similarity index 74% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderRespVO.java index c466936350..29d0cb611d 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/order/PayOrderRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order; +package cn.iocoder.yudao.module.pay.controller.admin.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,12 +8,7 @@ import lombok.ToString; import java.util.Date; -/** - * 支付订单 Response VO - * - * @author aquan - */ -@ApiModel("支付订单 Response VO") +@ApiModel("管理后台 - 支付订单 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/PayRefundController.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/PayRefundController.java similarity index 86% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/PayRefundController.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/PayRefundController.java index 912d352543..58cb24fa3a 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/PayRefundController.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/PayRefundController.java @@ -1,17 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order; +package cn.iocoder.yudao.module.pay.controller.admin.refund; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.*; -import cn.iocoder.yudao.adminserver.modules.pay.convert.refund.PayRefundConvert; -import cn.iocoder.yudao.adminserver.modules.pay.service.app.PayAppService; -import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.PayMerchantService; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.PayOrderService; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.PayRefundService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.*; +import cn.iocoder.yudao.module.pay.convert.refund.PayRefundConvert; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; +import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; +import cn.iocoder.yudao.module.pay.service.merchant.PayMerchantService; +import cn.iocoder.yudao.module.pay.service.order.PayOrderService; +import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -39,12 +39,7 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -/** - * 退款订单 Controller 组件 - * - * @author aquan - */ -@Api(tags = "退款订单") +@Api(tags = "管理后台 - 退款订单") @RestController @RequestMapping("/pay/refund") @Validated @@ -52,26 +47,13 @@ public class PayRefundController { @Resource private PayRefundService refundService; - - /** - * 商户 service 组件 - */ @Resource private PayMerchantService merchantService; - - /** - * 应用 service 组件 - */ @Resource private PayAppService appService; - - /** - * 订单 service 组件 - */ @Resource private PayOrderService orderService; - @GetMapping("/get") @ApiOperation("获得退款订单") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundBaseVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java similarity index 98% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundBaseVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java index c8421b0359..594496c773 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundBaseVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundCreateReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.java similarity index 60% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundCreateReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.java index 79b05c6253..cc09111ef0 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundCreateReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; import lombok.*; import io.swagger.annotations.*; -@ApiModel("退款订单创建 Request VO") +@ApiModel("管理后台 - 退款订单创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundDetailsRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java similarity index 83% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundDetailsRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java index d1d6739eea..e8a70ecd85 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundDetailsRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,12 +9,7 @@ import lombok.ToString; import javax.validation.constraints.NotNull; import java.util.Date; -/** - * 退款订单详情 Response VO - * - * @author aquan - */ -@ApiModel("退款订单详情 Response VO") +@ApiModel("管理后台 - 退款订单详情 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java similarity index 93% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java index 793493eaa9..75e72c8be1 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExcelVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; -import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.pay.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExportReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java similarity index 94% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExportReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java index 5a0e9c4e01..c0498239ff 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundExportReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,7 +9,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel(value = "退款订单 Excel 导出 Request VO", description = "参数和 PayRefundPageReqVO 是一致的") +@ApiModel(value = "管理后台 - 退款订单 Excel 导出 Request VO", description = "参数和 PayRefundPageReqVO 是一致的") @Data public class PayRefundExportReqVO { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundPageItemRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java similarity index 79% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundPageItemRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java index 69e881bced..03fe650eed 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundPageItemRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,7 @@ import lombok.ToString; import java.util.Date; -/** - * 退款订单分页查询 Response VO - * @author aquan - */ -@ApiModel("退款订单分页查询 Response VO") +@ApiModel("管理后台 - 退款订单分页查询 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundPageReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java similarity index 96% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundPageReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java index 103a7a27c6..78272009f8 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundPageReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -12,7 +12,7 @@ import java.util.Date; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@ApiModel("退款订单分页 Request VO") +@ApiModel("管理后台 - 退款订单分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundRespVO.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundRespVO.java index 901a0fe85e..97445d77fb 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,7 +8,7 @@ import lombok.ToString; import java.util.Date; -@ApiModel("退款订单 Response VO") +@ApiModel("管理后台 - 退款订单 Response VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundUpdateReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundUpdateReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.java index 8cb2dcf67e..b7d5555637 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/order/vo/refund/vo/PayRefundUpdateReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo; +package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; import lombok.*; import io.swagger.annotations.*; import javax.validation.constraints.*; -@ApiModel("退款订单更新 Request VO") +@ApiModel("管理后台 - 退款订单更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayOrderController.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java similarity index 69% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayOrderController.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java index fb022b106a..e01f7f4f48 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayOrderController.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java @@ -1,17 +1,17 @@ -package cn.iocoder.yudao.userserver.modules.pay.controller.order; +package cn.iocoder.yudao.module.pay.controller.app.order; import cn.hutool.core.bean.BeanUtil; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayRefundCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.pay.core.client.PayClient; import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO; -import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitReqVO; -import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitRespVO; +import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO; +import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.service.order.PayOrderService; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderSubmitRespDTO; +import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -21,52 +21,52 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Map; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.PAY_CHANNEL_CLIENT_NOT_FOUND; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; -@Api(tags = "支付订单") +@Api(tags = "用户 APP - 支付订单") @RestController @RequestMapping("/pay/order") @Validated @Slf4j -public class PayOrderController { +public class AppPayOrderController { @Resource - private PayOrderCoreService payOrderCoreService; + private PayOrderService orderService; @Resource - private PayRefundCoreService payRefundCoreService; + private PayRefundService refundService; @Resource private PayClientFactory payClientFactory; - @PostMapping("/submit") @ApiOperation("提交支付订单") // @PreAuthenticated // TODO 暂时不加登陆验证,前端暂时没做好 - public CommonResult submitPayOrder(@RequestBody PayOrderSubmitReqVO reqVO) { + public CommonResult submitPayOrder(@RequestBody AppPayOrderSubmitReqVO reqVO) { // 获得订单 - PayOrderDO payOrder = payOrderCoreService.getPayOrder(reqVO.getId()); + PayOrderDO payOrder = orderService.getOrder(reqVO.getId()); // 提交支付 PayOrderSubmitReqDTO reqDTO = new PayOrderSubmitReqDTO(); BeanUtil.copyProperties(reqVO, reqDTO, false); reqDTO.setUserIp(getClientIP()); reqDTO.setAppId(payOrder.getAppId()); - PayOrderSubmitRespDTO respDTO = payOrderCoreService.submitPayOrder(reqDTO); + PayOrderSubmitRespDTO respDTO = orderService.submitPayOrder(reqDTO); // 拼接返回 - return success(PayOrderSubmitRespVO.builder().invokeResponse(respDTO.getInvokeResponse()).build()); + return success(AppPayOrderSubmitRespVO.builder().invokeResponse(respDTO.getInvokeResponse()).build()); } // ========== 支付渠道的回调 ========== + // TODO @芋艿:是不是放到 notify 模块更合适 //TODO 芋道源码 换成了统一的地址了 /notify/{channelId},测试通过可以删除 @PostMapping("/notify/wx-pub/{channelId}") @ApiOperation("通知微信公众号支付的结果") public String notifyWxPayOrder(@PathVariable("channelId") Long channelId, @RequestBody String xmlData) throws Exception { - payOrderCoreService.notifyPayOrder(channelId, PayNotifyDataDTO.builder().body(xmlData).build()); + orderService.notifyPayOrder(channelId, PayNotifyDataDTO.builder().body(xmlData).build()); return "success"; } @@ -110,12 +110,12 @@ public class PayOrderController { // 如果是退款,则发起退款通知 if (payClient.isRefundNotify(notifyData)) { - payRefundCoreService.notifyPayRefund(channelId, PayNotifyDataDTO.builder().params(params).body(originData).build()); + refundService.notifyPayRefund(channelId, PayNotifyDataDTO.builder().params(params).body(originData).build()); return "success"; } // 如果非退款,则发起支付通知 - payOrderCoreService.notifyPayOrder(channelId, PayNotifyDataDTO.builder().params(params).body(originData).build()); + orderService.notifyPayOrder(channelId, PayNotifyDataDTO.builder().params(params).body(originData).build()); return "success"; } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayOrderSubmitReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java similarity index 83% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayOrderSubmitReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java index 407edb1717..6834c3838e 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayOrderSubmitReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.pay.controller.order.vo; +package cn.iocoder.yudao.module.pay.controller.app.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,10 +9,10 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Map; -@ApiModel("支付订单提交 Request VO") +@ApiModel("用户 APP - 支付订单提交 Request VO") @Data @Accessors(chain = true) -public class PayOrderSubmitReqVO { +public class AppPayOrderSubmitReqVO { @ApiModelProperty(value = "支付单编号", required = true, example = "1024") @NotNull(message = "支付单编号不能为空") diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayOrderSubmitRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java similarity index 69% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayOrderSubmitRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java index 907a979467..7fcffd0975 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayOrderSubmitRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.pay.controller.order.vo; +package cn.iocoder.yudao.module.pay.controller.app.order.vo; import io.swagger.annotations.ApiModel; import lombok.AllArgsConstructor; @@ -7,13 +7,13 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -@ApiModel("支付订单提交 Response VO") +@ApiModel("用户 APP - 支付订单提交 Response VO") @Data @Accessors(chain = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class PayOrderSubmitRespVO { +public class AppPayOrderSubmitRespVO { /** * 调用支付渠道的响应结果 diff --git a/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/package-info.java new file mode 100644 index 0000000000..333cbe6594 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.pay.controller.app; diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayRefundController.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/AppPayRefundController.java similarity index 51% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayRefundController.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/AppPayRefundController.java index ba62bdd8ab..42fdc5dcb9 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayRefundController.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/AppPayRefundController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.userserver.modules.pay.controller.order; +package cn.iocoder.yudao.module.pay.controller.app.refund; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayRefundCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayRefundReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.util.PaySeqUtils; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayRefundReqVO; -import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayRefundRespVO; -import cn.iocoder.yudao.userserver.modules.pay.convert.order.PayRefundConvert; +import cn.iocoder.yudao.module.pay.controller.app.refund.vo.AppPayRefundReqVO; +import cn.iocoder.yudao.module.pay.controller.app.refund.vo.AppPayRefundRespVO; +import cn.iocoder.yudao.module.pay.convert.refund.PayRefundConvert; +import cn.iocoder.yudao.module.pay.service.order.dto.PayRefundReqDTO; +import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; +import cn.iocoder.yudao.module.pay.util.PaySeqUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -19,28 +19,29 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -@Api(tags = "退款订单") +@Api(tags = "用户 APP - 退款订单") @RestController -@RequestMapping("/pay/order") +@RequestMapping("/pay/refund") @Validated @Slf4j -public class PayRefundController { +public class AppPayRefundController { @Resource - private PayRefundCoreService payRefundCoreService; + private PayRefundService refundService; @PostMapping("/refund") @ApiOperation("提交退款订单") - public CommonResult submitRefundOrder(@RequestBody PayRefundReqVO reqVO){ + public CommonResult submitRefundOrder(@RequestBody AppPayRefundReqVO reqVO){ PayRefundReqDTO req = PayRefundConvert.INSTANCE.convert(reqVO); req.setUserIp(getClientIP()); - //TODO 测试暂时模拟生成商户退款订单 + // TODO 测试暂时模拟生成商户退款订单 if(StrUtil.isEmpty(reqVO.getMerchantRefundId())) { req.setMerchantRefundId(PaySeqUtils.genMerchantRefundNo()); } - return CommonResult.success( PayRefundConvert.INSTANCE.convert(payRefundCoreService.submitRefundOrder(req))); + return success(PayRefundConvert.INSTANCE.convert(refundService.submitRefundOrder(req))); } } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayRefundReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/vo/AppPayRefundReqVO.java similarity index 87% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayRefundReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/vo/AppPayRefundReqVO.java index 8287ba0360..c810f3829c 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayRefundReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/vo/AppPayRefundReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.userserver.modules.pay.controller.order.vo; +package cn.iocoder.yudao.module.pay.controller.app.refund.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,11 +8,11 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; -@ApiModel("退款订单 Req VO") +@ApiModel("用户 APP - 退款订单 Req VO") @Data @NoArgsConstructor @AllArgsConstructor -public class PayRefundReqVO { +public class AppPayRefundReqVO { @ApiModelProperty(value = "支付订单编号自增", required = true, example = "10") @NotEmpty(message = "支付订单编号自增") diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayRefundRespVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/vo/AppPayRefundRespVO.java similarity index 51% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayRefundRespVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/vo/AppPayRefundRespVO.java index 29059ab285..5342432812 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/vo/PayRefundRespVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/app/refund/vo/AppPayRefundRespVO.java @@ -1,22 +1,22 @@ -package cn.iocoder.yudao.userserver.modules.pay.controller.order.vo; +package cn.iocoder.yudao.module.pay.controller.app.refund.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -@ApiModel("提交退款订单 Response VO") +@ApiModel("用户 APP - 提交退款订单 Response VO") @Data @Accessors(chain = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class PayRefundRespVO { +public class AppPayRefundRespVO { - /** - * 支付退款单编号, 自增 - */ + @ApiModelProperty(value = "退款订单编号", required = true, example = "10") private Long refundId; + } diff --git a/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/package-info.java new file mode 100644 index 0000000000..652122752d --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package cn.iocoder.yudao.module.pay.controller; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/app/PayAppConvert.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/app/PayAppConvert.java similarity index 71% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/app/PayAppConvert.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/app/PayAppConvert.java index c7e17467d8..432699bc2d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/app/PayAppConvert.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/app/PayAppConvert.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.pay.convert.app; +package cn.iocoder.yudao.module.pay.convert.app; import java.util.*; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.*; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.*; /** * 支付应用信息 Convert diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/channel/PayChannelConvert.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/channel/PayChannelConvert.java similarity index 64% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/channel/PayChannelConvert.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/channel/PayChannelConvert.java index ee0473c237..2535008ea8 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/channel/PayChannelConvert.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/channel/PayChannelConvert.java @@ -1,22 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.pay.convert.channel; +package cn.iocoder.yudao.module.pay.convert.channel; import java.util.*; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExcelVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelRespVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.*; -/** - * 支付渠道 - Convert - * - * @author 芋艿 - */ @Mapper public interface PayChannelConvert { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/merchant/PayMerchantConvert.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/merchant/PayMerchantConvert.java similarity index 56% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/merchant/PayMerchantConvert.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/merchant/PayMerchantConvert.java index 9483ff120d..1cb51a2bbf 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/merchant/PayMerchantConvert.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/merchant/PayMerchantConvert.java @@ -1,19 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.pay.convert.merchant; +package cn.iocoder.yudao.module.pay.convert.merchant; import java.util.*; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExcelVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantRespVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.*; -/** - * 支付商户信息 Convert - * - * @author 芋艿 - */ @Mapper public interface PayMerchantConvert { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/order/PayOrderConvert.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/order/PayOrderConvert.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java index 308298ac68..49df1ea644 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/order/PayOrderConvert.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java @@ -1,12 +1,15 @@ -package cn.iocoder.yudao.adminserver.modules.pay.convert.order; +package cn.iocoder.yudao.module.pay.convert.order; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderDetailsRespVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderExcelVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderPageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderRespVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; +import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderDetailsRespVO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExcelVO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageItemRespVO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderRespVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderCreateReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderSubmitReqDTO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -24,24 +27,10 @@ public interface PayOrderConvert { PayOrderConvert INSTANCE = Mappers.getMapper(PayOrderConvert.class); - - PayOrderRespVO convert(PayOrderDO bean); - /** - * 订单DO 转换为 详细订单 RespVO - * - * @param bean 订单DO - * @return 详细订单 RespVO - */ PayOrderDetailsRespVO orderDetailConvert(PayOrderDO bean); - /** - * 订单扩展DO 转换为 详细订单扩展 RespVO - * - * @param bean 订单扩展DO - * @return 详细订单扩展 RespVO - */ PayOrderDetailsRespVO.PayOrderExtension orderDetailExtensionConvert(PayOrderExtensionDO bean); List convertList(List list); @@ -58,12 +47,6 @@ public interface PayOrderConvert { */ PayOrderPageItemRespVO pageConvertItemPage(PayOrderDO bean); - /** - * 订单DO 转 订单导出excel VO - * - * @param bean 订单 DO - * @return 订单导出excel VO - */ default PayOrderExcelVO excelConvert(PayOrderDO bean) { if (bean == null) { return null; @@ -101,4 +84,12 @@ public interface PayOrderConvert { return payOrderExcelVO; } + + + PayOrderDO convert(PayOrderCreateReqDTO bean); + + PayOrderExtensionDO convert(PayOrderSubmitReqDTO bean); + + PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqDTO bean); + } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/package-info.java similarity index 57% rename from yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/package-info.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/package-info.java index 3f27f0b4b9..df43d5ac3e 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/package-info.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/package-info.java @@ -3,4 +3,4 @@ * * 目前使用 MapStruct 框架 */ -package cn.iocoder.yudao.userserver.modules.pay.convert; +package cn.iocoder.yudao.module.pay.convert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/refund/PayRefundConvert.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/refund/PayRefundConvert.java similarity index 73% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/refund/PayRefundConvert.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/refund/PayRefundConvert.java index 8f5ee66d31..2e034c63e8 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/refund/PayRefundConvert.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/refund/PayRefundConvert.java @@ -1,9 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.pay.convert.refund; +package cn.iocoder.yudao.module.pay.convert.refund; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.*; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.*; +import cn.iocoder.yudao.module.pay.controller.app.refund.vo.AppPayRefundReqVO; +import cn.iocoder.yudao.module.pay.controller.app.refund.vo.AppPayRefundRespVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayRefundReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayRefundRespDTO; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; import java.math.BigDecimal; @@ -87,4 +94,16 @@ public interface PayRefundConvert { return payRefundExcelVO; } + //TODO 太多需要处理了, 暂时不用 + @Mappings(value = { + @Mapping(source = "amount", target = "payAmount"), + @Mapping(source = "id", target = "orderId"), + @Mapping(target = "status",ignore = true) + }) + PayRefundDO convert(PayOrderDO orderDO); + + PayRefundReqDTO convert(AppPayRefundReqVO bean); + + AppPayRefundRespVO convert(PayRefundRespDTO bean); + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md similarity index 100% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayAppDO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayAppDO.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayAppDO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayAppDO.java index acc849cbc6..371a92b399 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayAppDO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayAppDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant; +package cn.iocoder.yudao.module.pay.dal.dataobject.merchant; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayChannelDO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayChannelDO.java similarity index 95% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayChannelDO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayChannelDO.java index 5275dd4288..a670db4634 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayChannelDO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayChannelDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant; +package cn.iocoder.yudao.module.pay.dal.dataobject.merchant; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayMerchantDO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayMerchantDO.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayMerchantDO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayMerchantDO.java index a0c72b9ec0..ebd735b039 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayMerchantDO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayMerchantDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant; +package cn.iocoder.yudao.module.pay.dal.dataobject.merchant; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/notify/PayNotifyLogDO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/notify/PayNotifyLogDO.java similarity index 86% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/notify/PayNotifyLogDO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/notify/PayNotifyLogDO.java index 85626006cf..92ecc39e63 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/notify/PayNotifyLogDO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/notify/PayNotifyLogDO.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.notify; +package cn.iocoder.yudao.module.pay.dal.dataobject.notify; -import cn.iocoder.yudao.coreservice.modules.pay.enums.notify.PayNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/notify/PayNotifyTaskDO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java similarity index 78% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/notify/PayNotifyTaskDO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java index 3d10ac83a4..3884f152fc 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/notify/PayNotifyTaskDO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.notify; +package cn.iocoder.yudao.module.pay.dal.dataobject.notify; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.notify.PayNotifyStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.notify.PayNotifyTypeEnum; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; +import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderDO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/order/PayOrderDO.java similarity index 84% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderDO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/order/PayOrderDO.java index 65cf94bf24..931b856519 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderDO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/order/PayOrderDO.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order; +package cn.iocoder.yudao.module.pay.dal.dataobject.order; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderNotifyStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundTypeEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderExtensionDO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/order/PayOrderExtensionDO.java similarity index 89% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderExtensionDO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/order/PayOrderExtensionDO.java index 5a6b8431a4..8606e082bb 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderExtensionDO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/order/PayOrderExtensionDO.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order; +package cn.iocoder.yudao.module.pay.dal.dataobject.order; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayRefundDO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/refund/PayRefundDO.java similarity index 90% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayRefundDO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/refund/PayRefundDO.java index fc897a5e08..f5e3a1f7ca 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayRefundDO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/refund/PayRefundDO.java @@ -1,10 +1,11 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order; +package cn.iocoder.yudao.module.pay.dal.dataobject.refund; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundTypeEnum; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/app/PayAppMapper.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayAppMapper.java similarity index 68% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/app/PayAppMapper.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayAppMapper.java index c6e3b38e93..03cb0439d1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/app/PayAppMapper.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayAppMapper.java @@ -1,32 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.app; +package cn.iocoder.yudao.module.pay.dal.mysql.merchant; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppPageReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; -/** - * 支付应用信息 Mapper - * - * @author aquan - */ @Mapper public interface PayAppMapper extends BaseMapperX { - /** - * 分页查询 - * - * @param reqVO 支付应用信息分页查询条件 - * @param merchantIds 商户 ID 集合 - * @return 支付应用信息 - */ default PageResult selectPage(PayAppPageReqVO reqVO, Collection merchantIds) { return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) @@ -39,13 +27,6 @@ public interface PayAppMapper extends BaseMapperX { .orderByDesc("id")); } - /** - * 列表查询 - * - * @param reqVO 支付应用信息 Excel 导出查询条件 - * @param merchantIds 商户 ID 集合 - * @return 支付应用信息 - */ default List selectList(PayAppExportReqVO reqVO, Collection merchantIds) { return selectList(new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) @@ -58,24 +39,13 @@ public interface PayAppMapper extends BaseMapperX { .orderByDesc("id")); } - /** - * 根据 商户 ID 查询支付应用信息 - * - * @param merchantId 商户 ID - * @return 支付应用信息列表 - */ default List getListByMerchantId(String merchantId) { return selectList(new LambdaQueryWrapper() .select(PayAppDO::getId, PayAppDO::getName) .eq(PayAppDO::getMerchantId, merchantId)); } - /** - * 根据商户号统计存在的支付应用数量 - * - * @param merchantId 商户 ID - * @return 支付应用数量 - */ + // TODO @aquan:方法名补充 ByMerchantId default Long selectCount(Long merchantId) { return selectCount(new LambdaQueryWrapper().eq(PayAppDO::getMerchantId, merchantId)); } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/channel/PayChannelMapper.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayChannelMapper.java similarity index 76% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/channel/PayChannelMapper.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayChannelMapper.java index 54a4829a99..c1871531e4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/channel/PayChannelMapper.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayChannelMapper.java @@ -1,26 +1,29 @@ -package cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.channel; +package cn.iocoder.yudao.module.pay.dal.mysql.merchant; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelPageReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; import java.util.Collection; +import java.util.Date; import java.util.List; -/** - * 支付渠道 - Mapper - * - * @author 芋艿 - */ @Mapper public interface PayChannelMapper extends BaseMapperX { + default PayChannelDO selectByAppIdAndCode(Long appId, String code) { + return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code); + } + + @Select("SELECT id FROM pay_channel WHERE update_time > #{maxUpdateTime} LIMIT 1") + Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); + default PageResult selectPage(PayChannelPageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() .eqIfPresent("code", reqVO.getCode()) @@ -48,11 +51,11 @@ public interface PayChannelMapper extends BaseMapperX { } /** - * 根据条件获取通道数量 + * 根据条件获取渠道数量 * * @param merchantId 商户编号 * @param appid 应用编号 - * @param code 通道编码 + * @param code 渠道编码 * @return 数量 */ default Integer selectCount(Long merchantId, Long appid, String code) { @@ -63,11 +66,11 @@ public interface PayChannelMapper extends BaseMapperX { } /** - * 根据条件获取通道 + * 根据条件获取渠道 * * @param merchantId 商户编号 - * @param appid 应用编号 - * @param code 通道编码 + * @param appid 应用编号 // TODO @aquan:appid =》appId + * @param code 渠道编码 * @return 数量 */ default PayChannelDO selectOne(Long merchantId, Long appid, String code) { @@ -78,6 +81,7 @@ public interface PayChannelMapper extends BaseMapperX { )); } + // TODO @aquan:select 命名 /** * 根据支付应用ID集合获得支付渠道列表 * @@ -88,4 +92,5 @@ public interface PayChannelMapper extends BaseMapperX { return this.selectList(new QueryWrapper().lambda() .in(PayChannelDO::getAppId, appIds)); } + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/merchant/PayMerchantMapper.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayMerchantMapper.java similarity index 82% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/merchant/PayMerchantMapper.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayMerchantMapper.java index f143b18578..050302b4c4 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/merchant/PayMerchantMapper.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayMerchantMapper.java @@ -1,20 +1,15 @@ -package cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.merchant; +package cn.iocoder.yudao.module.pay.dal.mysql.merchant; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantPageReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; -/** - * 支付商户信息 Mapper - * - * @author 芋艿 - */ @Mapper public interface PayMerchantMapper extends BaseMapperX { diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java similarity index 56% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java index e3f90d614f..c956219339 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.notify; +package cn.iocoder.yudao.module.pay.dal.mysql.notify; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.notify.PayNotifyLogDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.notify.PayNotifyLogDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java similarity index 79% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java index 276c6710b6..1107a19f46 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.notify; +package cn.iocoder.yudao.module.pay.dal.mysql.notify; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.notify.PayNotifyTaskDO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.notify.PayNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.dal.dataobject.notify.PayNotifyTaskDO; +import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderExtensionCoreMapper.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderExtensionMapper.java old mode 100644 new mode 100755 similarity index 70% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderExtensionCoreMapper.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderExtensionMapper.java index 08c95cea67..a8918f441c --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderExtensionCoreMapper.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderExtensionMapper.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order; +package cn.iocoder.yudao.module.pay.dal.mysql.order; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface PayOrderExtensionCoreMapper extends BaseMapperX { +public interface PayOrderExtensionMapper extends BaseMapperX { default PayOrderExtensionDO selectByNo(String no) { return selectOne(PayOrderExtensionDO::getNo, no); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayOrderMapper.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderMapper.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayOrderMapper.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderMapper.java index 1fb9e870af..4ff345dae5 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayOrderMapper.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderMapper.java @@ -1,22 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order; +package cn.iocoder.yudao.module.pay.dal.mysql.order; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderPageReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; -/** - * 支付订单 Mapper 组件 - * - * @author aquan - */ @Mapper public interface PayOrderMapper extends BaseMapperX { @@ -50,12 +46,6 @@ public interface PayOrderMapper extends BaseMapperX { .orderByDesc("id")); } - /** - * 根据订单 ID 集合查询订单商品名称 - * - * @param idList 订单 ID 集合 - * @return 只包含商品名称和标题的订单集合对象 - */ default List findByIdListQueryOrderSubject(Collection idList) { return selectList(new LambdaQueryWrapper() .select(PayOrderDO::getId, PayOrderDO::getSubject) @@ -70,10 +60,19 @@ public interface PayOrderMapper extends BaseMapperX { * @return 条数 */ default Long selectCount(Long appId, Integer status) { - return selectCount(new LambdaQueryWrapper() .eq(PayOrderDO::getAppId, appId) .in(PayOrderDO::getStatus, status)); } + default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) { + return selectOne(new QueryWrapper().eq("app_id", appId) + .eq("merchant_order_id", merchantOrderId)); + } + + default int updateByIdAndStatus(Long id, Integer status, PayOrderDO update) { + return update(update, new QueryWrapper() + .eq("id", id).eq("status", status)); + } + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayRefundMapper.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/refund/PayRefundMapper.java similarity index 78% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayRefundMapper.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/refund/PayRefundMapper.java index 2fd3f22996..ba8f521e9d 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/order/PayRefundMapper.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/refund/PayRefundMapper.java @@ -1,21 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order; +package cn.iocoder.yudao.module.pay.dal.mysql.refund; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.PayRefundExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.PayRefundPageReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; -/** - * 退款订单 Mapper - * - * @author aquan - */ @Mapper public interface PayRefundMapper extends BaseMapperX { @@ -45,17 +40,18 @@ public interface PayRefundMapper extends BaseMapperX { .orderByDesc("id")); } - /** - * 查询符合的订单数量 - * - * @param appId 应用编号 - * @param status 订单状态 - * @return 条数 - */ default Long selectCount(Long appId, Integer status) { return selectCount(new LambdaQueryWrapper() .eq(PayRefundDO::getAppId, appId) .eq(PayRefundDO::getStatus, status)); } + + default PayRefundDO selectByReqNo(String reqNo) { + return selectOne("req_no", reqNo); + } + + default PayRefundDO selectByTradeNoAndMerchantRefundNo(String tradeNo, String merchantRefundNo){ + return selectOne("trade_no", tradeNo, "merchant_refund_no", merchantRefundNo); + } } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/redis/PayRedisKeyCoreConstants.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/PayRedisKeyCoreConstants.java similarity index 65% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/redis/PayRedisKeyCoreConstants.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/PayRedisKeyCoreConstants.java index 99384ec126..acba20be9b 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/redis/PayRedisKeyCoreConstants.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/PayRedisKeyCoreConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.redis; +package cn.iocoder.yudao.module.pay.dal.redis; import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; import org.redisson.api.RLock; @@ -6,7 +6,7 @@ import org.redisson.api.RLock; import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.HASH; /** - * Lock4j Redis Key 枚举类 + * 支付 Redis Key 枚举类 * * @author 芋道源码 */ @@ -14,6 +14,6 @@ public interface PayRedisKeyCoreConstants { RedisKeyDefine PAY_NOTIFY_LOCK = new RedisKeyDefine("通知任务的分布式锁", "pay_notify:lock:", // 参数来自 DefaultLockKeyBuilder 类 - HASH, RLock.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); // Redisson 的 Lock 锁,使用 Hash 数据结构 + RedisKeyDefine.KeyTypeEnum.HASH, RLock.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); // Redisson 的 Lock 锁,使用 Hash 数据结构 } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/redis/notify/PayNotifyLockCoreRedisDAO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java similarity index 79% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/redis/notify/PayNotifyLockCoreRedisDAO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java index 5ce6b44b32..227eda28ad 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/redis/notify/PayNotifyLockCoreRedisDAO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.redis.notify; +package cn.iocoder.yudao.module.pay.dal.redis.notify; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; @@ -7,7 +7,7 @@ import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.util.concurrent.TimeUnit; -import static cn.iocoder.yudao.coreservice.modules.pay.dal.redis.PayRedisKeyCoreConstants.PAY_NOTIFY_LOCK; +import static cn.iocoder.yudao.module.pay.dal.redis.PayRedisKeyCoreConstants.PAY_NOTIFY_LOCK; /** * 支付通知的锁 Redis DAO @@ -15,7 +15,7 @@ import static cn.iocoder.yudao.coreservice.modules.pay.dal.redis.PayRedisKeyCore * @author 芋道源码 */ @Repository -public class PayNotifyLockCoreRedisDAO { +public class PayNotifyLockRedisDAO { @Resource private RedissonClient redissonClient; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/notify/PayNotifyStatusEnum.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/notify/PayNotifyStatusEnum.java similarity index 89% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/notify/PayNotifyStatusEnum.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/notify/PayNotifyStatusEnum.java index 2c3c6b5921..d1b7c1015b 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/notify/PayNotifyStatusEnum.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/notify/PayNotifyStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.enums.notify; +package cn.iocoder.yudao.module.pay.enums.notify; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/notify/PayNotifyTypeEnum.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/notify/PayNotifyTypeEnum.java similarity index 85% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/notify/PayNotifyTypeEnum.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/notify/PayNotifyTypeEnum.java index a501bc55f9..8c259d93c1 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/notify/PayNotifyTypeEnum.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/notify/PayNotifyTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.enums.notify; +package cn.iocoder.yudao.module.pay.enums.notify; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayOrderNotifyStatusEnum.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderNotifyStatusEnum.java similarity index 89% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayOrderNotifyStatusEnum.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderNotifyStatusEnum.java index 4bda485d2a..b7161a9f4e 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayOrderNotifyStatusEnum.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderNotifyStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.enums.order; +package cn.iocoder.yudao.module.pay.enums.order; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import lombok.AllArgsConstructor; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayOrderStatusEnum.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderStatusEnum.java similarity index 90% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayOrderStatusEnum.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderStatusEnum.java index b61c0400ce..ab542a97c3 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayOrderStatusEnum.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.enums.order; +package cn.iocoder.yudao.module.pay.enums.order; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import lombok.AllArgsConstructor; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayRefundStatusEnum.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/refund/PayRefundStatusEnum.java similarity index 83% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayRefundStatusEnum.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/refund/PayRefundStatusEnum.java index 2a28ae9fc5..390804dd3a 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayRefundStatusEnum.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/refund/PayRefundStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.enums.order; +package cn.iocoder.yudao.module.pay.enums.refund; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayRefundTypeEnum.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/refund/PayRefundTypeEnum.java similarity index 89% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayRefundTypeEnum.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/refund/PayRefundTypeEnum.java index ba7ee2fcc8..5fb10a399d 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayRefundTypeEnum.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/enums/refund/PayRefundTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.enums.order; +package cn.iocoder.yudao.module.pay.enums.refund; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import lombok.AllArgsConstructor; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/job/notify/PayNotifyJob.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/job/notify/PayNotifyJob.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/job/notify/PayNotifyJob.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/job/notify/PayNotifyJob.java index 58685f1b56..820bca4718 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/job/notify/PayNotifyJob.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/job/notify/PayNotifyJob.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.pay.job.notify; +package cn.iocoder.yudao.module.pay.job.notify; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService; import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -18,7 +18,7 @@ import javax.annotation.Resource; public class PayNotifyJob implements JobHandler { @Resource - private PayNotifyCoreService payNotifyCoreService; + private PayNotifyService payNotifyCoreService; @Override public String execute(String param) throws Exception { diff --git a/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/job/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/job/package-info.java new file mode 100644 index 0000000000..c45bf497fb --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/job/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.pay.job; diff --git a/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/package-info.java new file mode 100644 index 0000000000..1421e4e654 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/package-info.java @@ -0,0 +1,10 @@ +/** + * pay 模块,我们放支付业务,提供业务的支付能力。 + * 例如说:商户、应用、支付、退款等等 + * + * 1. Controller URL:以 /member/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 member_ 开头,方便在数据库中区分 + * + * 注意,由于 Pay 模块和 Trade 模块,容易重名,所以类名都加载 Pay 的前缀~ + */ +package cn.iocoder.yudao.module.pay; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/PayAppService.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppService.java similarity index 75% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/PayAppService.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppService.java index da83ca825f..62935e4dda 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/PayAppService.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppService.java @@ -1,12 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.app; +package cn.iocoder.yudao.module.pay.service.merchant; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppUpdateReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; import javax.validation.Valid; import java.util.Collection; @@ -100,4 +101,16 @@ public interface PayAppService { List list = this.getAppList(appIdList); return CollectionUtils.convertMap(list, PayAppDO::getId); } + + + /** + * 支付应用的合法性 + * + * 如果不合法,抛出 {@link ServiceException} 业务异常 + * + * @param id 应用编号 + * @return 应用信息 + */ + PayAppDO validPayApp(Long id); + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/impl/PayAppServiceImpl.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceImpl.java similarity index 72% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/impl/PayAppServiceImpl.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceImpl.java index bb6e765b3b..f7d1a4e28a 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/impl/PayAppServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceImpl.java @@ -1,23 +1,24 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.app.impl; +package cn.iocoder.yudao.module.pay.service.merchant; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.convert.app.PayAppConvert; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.app.PayAppMapper; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.merchant.PayMerchantMapper; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order.PayOrderMapper; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order.PayRefundMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.app.PayAppService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundStatusEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppUpdateReqVO; +import cn.iocoder.yudao.module.pay.convert.app.PayAppConvert; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayAppMapper; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayMerchantMapper; +import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderMapper; +import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -25,9 +26,9 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; /** * 支付应用信息 Service 实现类 @@ -40,17 +41,14 @@ public class PayAppServiceImpl implements PayAppService { @Resource private PayAppMapper appMapper; - + // TODO @aquan:使用对方的 Service。模块与模块之间,避免直接调用对方的 mapper @Resource private PayMerchantMapper merchantMapper; - @Resource private PayOrderMapper orderMapper; - @Resource private PayRefundMapper refundMapper; - @Override public Long createApp(PayAppCreateReqVO createReqVO) { // 插入 @@ -126,12 +124,6 @@ public class PayAppServiceImpl implements PayAppService { return convertSet(merchantMapper.getMerchantListByName(merchantName), PayMerchantDO::getId); } - /** - * 修改应用信息状态 - * - * @param id 应用编号 - * @param status 状态{@link CommonStatusEnum} - */ @Override public void updateAppStatus(Long id, Integer status) { // 校验商户存在 @@ -143,12 +135,6 @@ public class PayAppServiceImpl implements PayAppService { appMapper.updateById(app); } - /** - * 根据商户 ID 获得支付应用信息列表, - * - * @param merchantId 商户 ID - * @return 支付应用信息列表 - */ @Override public List getListByMerchantId(String merchantId) { return appMapper.getListByMerchantId(merchantId); @@ -186,4 +172,18 @@ public class PayAppServiceImpl implements PayAppService { } } + @Override + public PayAppDO validPayApp(Long id) { + PayAppDO app = appMapper.selectById(id); + // 校验是否存在 + if (app == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_APP_NOT_FOUND); + } + // 校验是否禁用 + if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_APP_IS_DISABLE); + } + return app; + } + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelService.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelService.java similarity index 59% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelService.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelService.java index 1eeb567dd4..3907b0eca6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelService.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelService.java @@ -1,9 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.channel; +package cn.iocoder.yudao.module.pay.service.merchant; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.*; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.springframework.web.multipart.MultipartFile; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; import javax.validation.Valid; import java.util.Collection; @@ -16,6 +19,11 @@ import java.util.List; */ public interface PayChannelService { + /** + * 初始化支付客户端 + */ + void initPayClients(); + /** * 创建支付渠道 * @@ -47,8 +55,7 @@ public interface PayChannelService { PayChannelDO getChannel(Long id); /** - * 获得支付渠道 - * 列表 + * 获得支付渠道列表 * * @param ids 编号 * @return 支付渠道 @@ -57,8 +64,7 @@ public interface PayChannelService { List getChannelList(Collection ids); /** - * 获得支付渠道 - * 分页 + * 获得支付渠道分页 * * @param pageReqVO 分页查询 * @return 支付渠道 @@ -84,24 +90,44 @@ public interface PayChannelService { List getChannelListByAppIds(Collection appIds); /** - * 根据条件获取通道数量 + * 根据条件获取渠道数量 * * @param merchantId 商户编号 * @param appid 应用编号 - * @param code 通道编码 + * @param code 渠道编码 * @return 数量 */ Integer getChannelCountByConditions(Long merchantId, Long appid, String code); /** - * 根据条件获取通道 + * 根据条件获取渠道 * * @param merchantId 商户编号 * @param appid 应用编号 - * @param code 通道编码 + * @param code 渠道编码 * @return 数量 */ PayChannelDO getChannelByConditions(Long merchantId, Long appid, String code); + /** + * 支付渠道的合法性 + * + * 如果不合法,抛出 {@link ServiceException} 业务异常 + * + * @param id 渠道编号 + * @return 渠道信息 + */ + PayChannelDO validPayChannel(Long id); + + /** + * 支付渠道的合法性 + * + * 如果不合法,抛出 {@link ServiceException} 业务异常 + * + * @param appId 应用编号 + * @param code 支付渠道 + * @return 渠道信息 + */ + PayChannelDO validPayChannel(Long appId, String code); } diff --git a/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceImpl.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceImpl.java new file mode 100644 index 0000000000..68b6ff10db --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceImpl.java @@ -0,0 +1,250 @@ +package cn.iocoder.yudao.module.pay.service.merchant; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; +import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert; +import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig; +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayChannelMapper; +import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; + +/** + * 支付渠道 Service 实现类 + * + * @author aquan + */ +@Service +@Slf4j +@Validated +public class PayChannelServiceImpl implements PayChannelService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private PayClientFactory payClientFactory; + + @Resource + private PayChannelMapper channelMapper; + + @Resource + private Validator validator; + + @Override + @PostConstruct + public void initPayClients() { + // 获取支付渠道,如果有更新 + List payChannels = this.loadPayChannelIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(payChannels)) { + return; + } + + // 创建或更新支付 Client + payChannels.forEach(payChannel -> payClientFactory.createOrUpdatePayClient(payChannel.getId(), + payChannel.getCode(), payChannel.getConfig())); + + // 写入缓存 + assert payChannels.size() > 0; // 断言,避免告警 + maxUpdateTime = payChannels.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initPayClients][初始化 PayChannel 数量为 {}]", payChannels.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initPayClients(); + } + + /** + * 如果支付渠道发生变化,从数据库中获取最新的全量支付渠道。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前支付渠道的最大更新时间 + * @return 支付渠道列表 + */ + private List loadPayChannelIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadPayChannelIfUpdate][首次加载全量支付渠道]"); + } else { // 判断数据库中是否有更新的支付渠道 + if (channelMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { + return null; + } + log.info("[loadPayChannelIfUpdate][增量加载全量支付渠道]"); + } + // 第二步,如果有更新,则从数据库加载所有支付渠道 + return channelMapper.selectList(); + } + + @Override + public Long createChannel(PayChannelCreateReqVO reqVO) { + // 断言是否有重复的 + PayChannelDO channelDO = this.getChannelByConditions(reqVO.getMerchantId(), reqVO.getAppId(), reqVO.getCode()); + if (ObjectUtil.isNotNull(channelDO)) { + throw exception(CHANNEL_EXIST_SAME_CHANNEL_ERROR); + } + + // 新增渠道 + PayChannelDO channel = PayChannelConvert.INSTANCE.convert(reqVO); + settingConfigAndCheckParam(channel, reqVO.getConfig()); + channelMapper.insert(channel); + return channel.getId(); + } + + @Override + public void updateChannel(PayChannelUpdateReqVO updateReqVO) { + // 校验存在 + this.validateChannelExists(updateReqVO.getId()); + // 更新 + PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO); + settingConfigAndCheckParam(channel, updateReqVO.getConfig()); + channelMapper.updateById(channel); + } + + @Override + public void deleteChannel(Long id) { + // 校验存在 + this.validateChannelExists(id); + // 删除 + channelMapper.deleteById(id); + } + + private void validateChannelExists(Long id) { + if (channelMapper.selectById(id) == null) { + throw exception(CHANNEL_NOT_EXISTS); + } + } + + @Override + public PayChannelDO getChannel(Long id) { + return channelMapper.selectById(id); + } + + @Override + public List getChannelList(Collection ids) { + return channelMapper.selectBatchIds(ids); + } + + @Override + public PageResult getChannelPage(PayChannelPageReqVO pageReqVO) { + return channelMapper.selectPage(pageReqVO); + } + + @Override + public List getChannelList(PayChannelExportReqVO exportReqVO) { + return channelMapper.selectList(exportReqVO); + } + + /** + * 根据支付应用ID集合获得支付渠道列表 + * + * @param appIds 应用编号集合 + * @return 支付渠道列表 + */ + @Override + public List getChannelListByAppIds(Collection appIds) { + return channelMapper.getChannelListByAppIds(appIds); + } + + + /** + * 根据条件获取渠道数量 + * + * @param merchantId 商户编号 + * @param appid 应用编号 + * @param code 渠道编码 + * @return 数量 + */ + @Override + public Integer getChannelCountByConditions(Long merchantId, Long appid, String code) { + return this.channelMapper.selectCount(merchantId, appid, code); + } + + /** + * 根据条件获取渠道 + * + * @param merchantId 商户编号 + * @param appid 应用编号 + * @param code 渠道编码 + * @return 数量 + */ + @Override + public PayChannelDO getChannelByConditions(Long merchantId, Long appid, String code) { + return this.channelMapper.selectOne(merchantId, appid, code); + } + + /** + * 设置渠道配置以及参数校验 + * + * @param channel 渠道 + * @param configStr 配置 + */ + private void settingConfigAndCheckParam(PayChannelDO channel, String configStr) { + // 得到这个渠道是微信的还是支付宝的 + Class payClass = PayChannelEnum.getByCode(channel.getCode()).getConfigClass(); + if (ObjectUtil.isNull(payClass)) { + throw exception(CHANNEL_NOT_EXISTS); + } + PayClientConfig config = JSONUtil.toBean(configStr, payClass); + + // 验证参数 + config.validate(validator); + channel.setConfig(config); + } + + @Override + public PayChannelDO validPayChannel(Long id) { + PayChannelDO channel = channelMapper.selectById(id); + this.validPayChannel(channel); + return channel; + } + + @Override + public PayChannelDO validPayChannel(Long appId, String code) { + PayChannelDO channel = channelMapper.selectByAppIdAndCode(appId, code); + this.validPayChannel(channel); + return channel; + } + + private void validPayChannel(PayChannelDO channel) { + if (channel == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_NOT_FOUND); + } + if (CommonStatusEnum.DISABLE.getStatus().equals(channel.getStatus())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_IS_DISABLE); + } + } +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/PayMerchantService.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantService.java similarity index 81% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/PayMerchantService.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantService.java index b8e74dd757..40f02b99cb 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/PayMerchantService.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantService.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.merchant; +package cn.iocoder.yudao.module.pay.service.merchant; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantUpdateReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; import javax.validation.Valid; import java.util.Collection; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/impl/PayMerchantServiceImpl.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantServiceImpl.java similarity index 77% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/impl/PayMerchantServiceImpl.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantServiceImpl.java index b80132a1f1..c14a87d7d7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/impl/PayMerchantServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantServiceImpl.java @@ -1,16 +1,15 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.merchant.impl; +package cn.iocoder.yudao.module.pay.service.merchant; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.convert.merchant.PayMerchantConvert; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.app.PayAppMapper; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.merchant.PayMerchantMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.PayMerchantService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; +import cn.iocoder.yudao.module.pay.convert.merchant.PayMerchantConvert; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayAppMapper; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayMerchantMapper; import cn.iocoder.yudao.framework.common.pojo.PageResult; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; @@ -21,9 +20,8 @@ import java.time.LocalDateTime; import java.util.Collection; import java.util.List; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.PAY_MERCHANT_EXIST_APP_CANT_DELETE; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.PAY_MERCHANT_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; /** * 支付商户信息 Service 实现类 diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/PayNotifyCoreService.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyService.java similarity index 66% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/PayNotifyCoreService.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyService.java index 4683757099..92358e4713 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/PayNotifyCoreService.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyService.java @@ -1,15 +1,15 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.notify; +package cn.iocoder.yudao.module.pay.service.notify; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; +import cn.iocoder.yudao.module.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; import javax.validation.Valid; /** - * 支付通知 Core Service 接口 + * 支付通知 Service 接口 * * @author 芋道源码 */ -public interface PayNotifyCoreService { +public interface PayNotifyService { /** * 创建支付通知任务 diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/impl/PayNotifyCoreServiceImpl.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyServiceImpl.java similarity index 77% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/impl/PayNotifyCoreServiceImpl.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyServiceImpl.java index dff6de7fc6..1d5091a5bc 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/impl/PayNotifyCoreServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyServiceImpl.java @@ -1,25 +1,25 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.notify.impl; +package cn.iocoder.yudao.module.pay.service.notify; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.http.HttpUtil; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.notify.PayNotifyLogDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.notify.PayNotifyTaskDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.notify.PayNotifyLogCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.notify.PayNotifyTaskCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order.PayRefundCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.dal.redis.notify.PayNotifyLockCoreRedisDAO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.notify.PayNotifyStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.notify.PayNotifyTypeEnum; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.vo.PayNotifyOrderReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.vo.PayRefundOrderReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService; +import cn.iocoder.yudao.module.pay.dal.dataobject.notify.PayNotifyLogDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.notify.PayNotifyTaskDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; +import cn.iocoder.yudao.module.pay.dal.mysql.notify.PayNotifyLogCoreMapper; +import cn.iocoder.yudao.module.pay.dal.mysql.notify.PayNotifyTaskCoreMapper; +import cn.iocoder.yudao.module.pay.dal.redis.notify.PayNotifyLockRedisDAO; +import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum; +import cn.iocoder.yudao.module.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; +import cn.iocoder.yudao.module.pay.service.notify.vo.PayNotifyOrderReqVO; +import cn.iocoder.yudao.module.pay.service.notify.vo.PayRefundOrderReqVO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import cn.iocoder.yudao.module.pay.service.order.PayOrderService; +import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Async; @@ -36,10 +36,6 @@ import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import static cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.SECOND_MILLIS; -import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; - /** * 支付通知 Core Service 实现类 * @@ -48,7 +44,7 @@ import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString @Service @Valid @Slf4j -public class PayNotifyCoreServiceImpl implements PayNotifyCoreService { +public class PayNotifyServiceImpl implements PayNotifyService { /** * 通知超时时间,单位:秒 @@ -57,11 +53,14 @@ public class PayNotifyCoreServiceImpl implements PayNotifyCoreService { /** * {@link #NOTIFY_TIMEOUT} 的毫秒 */ - public static final long NOTIFY_TIMEOUT_MILLIS = 120 * SECOND_MILLIS; + public static final long NOTIFY_TIMEOUT_MILLIS = 120 * DateUtils.SECOND_MILLIS; @Resource @Lazy // 循环依赖,避免报错 - private PayOrderCoreService payOrderCoreService; + private PayOrderService orderService; + @Resource + @Lazy // 循环依赖,避免报错 + private PayRefundService refundService; @Resource private PayNotifyTaskCoreMapper payNotifyTaskCoreMapper; @@ -72,14 +71,11 @@ public class PayNotifyCoreServiceImpl implements PayNotifyCoreService { private ThreadPoolTaskExecutor threadPoolTaskExecutor; // TODO 芋艿:未来提供独立的线程池 @Resource - private PayNotifyLockCoreRedisDAO payNotifyLockCoreRedisDAO; - - @Resource - private PayRefundCoreMapper payRefundCoreMapper; + private PayNotifyLockRedisDAO payNotifyLockCoreRedisDAO; @Resource @Lazy // 循环依赖(自己依赖自己),避免报错 - private PayNotifyCoreServiceImpl self; + private PayNotifyServiceImpl self; @Override public void createPayNotifyTask(PayNotifyTaskCreateReqDTO reqDTO) { @@ -89,12 +85,11 @@ public class PayNotifyCoreServiceImpl implements PayNotifyCoreService { .setNotifyTimes(0).setMaxNotifyTimes(PayNotifyTaskDO.NOTIFY_FREQUENCY.length + 1); // 补充 merchantId + appId + notifyUrl 字段 if (Objects.equals(task.getType(), PayNotifyTypeEnum.ORDER.getType())) { - PayOrderDO order = payOrderCoreService.getPayOrder(task.getDataId()); // 不进行非空判断,有问题直接异常 + PayOrderDO order = orderService.getOrder(task.getDataId()); // 不进行非空判断,有问题直接异常 task.setMerchantId(order.getMerchantId()).setAppId(order.getAppId()). setMerchantOrderId(order.getMerchantOrderId()).setNotifyUrl(order.getNotifyUrl()); } else if (Objects.equals(task.getType(), PayNotifyTypeEnum.REFUND.getType())) { - // TODO 芋艿,需要实现下哈 - PayRefundDO refundDO = payRefundCoreMapper.selectById(task.getDataId()); + PayRefundDO refundDO = refundService.getRefund(task.getDataId()); task.setMerchantId(refundDO.getMerchantId()).setAppId(refundDO.getAppId()) .setMerchantOrderId(refundDO.getMerchantOrderId()).setNotifyUrl(refundDO.getNotifyUrl()); } @@ -169,7 +164,7 @@ public class PayNotifyCoreServiceImpl implements PayNotifyCoreService { // 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。 PayNotifyTaskDO dbTask = payNotifyTaskCoreMapper.selectById(task.getId()); if (DateUtils.afterNow(dbTask.getNextNotifyTime())) { - log.info("[executeNotify][dbTask({}) 任务被忽略,原因是未到达下次通知时间,可能是因为并发执行了]", toJsonString(dbTask)); + log.info("[executeNotify][dbTask({}) 任务被忽略,原因是未到达下次通知时间,可能是因为并发执行了]", JsonUtils.toJsonString(dbTask)); return; } @@ -193,7 +188,7 @@ public class PayNotifyCoreServiceImpl implements PayNotifyCoreService { Integer newStatus = this.processNotifyResult(task, invokeResult, invokeException); // 记录 PayNotifyLog 日志 - String response = invokeException != null ? getRootCauseMessage(invokeException) : toJsonString(invokeResult); + String response = invokeException != null ? ExceptionUtil.getRootCauseMessage(invokeException) : JsonUtils.toJsonString(invokeResult); payNotifyLogCoreMapper.insert(PayNotifyLogDO.builder().taskId(task.getId()) .notifyTimes(task.getNotifyTimes() + 1).status(newStatus).response(response).build()); } @@ -214,10 +209,10 @@ public class PayNotifyCoreServiceImpl implements PayNotifyCoreService { request = PayRefundOrderReqVO.builder().merchantOrderId(task.getMerchantOrderId()) .payRefundId(task.getDataId()).build(); } else { - throw new RuntimeException("未知的通知任务类型:" + toJsonString(task)); + throw new RuntimeException("未知的通知任务类型:" + JsonUtils.toJsonString(task)); } // 请求地址 - String response = HttpUtil.post(task.getNotifyUrl(), toJsonString(request), + String response = HttpUtil.post(task.getNotifyUrl(), JsonUtils.toJsonString(request), (int) NOTIFY_TIMEOUT_MILLIS); // 解析结果 return JsonUtils.parseObject(response, CommonResult.class); diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java similarity index 88% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java index 8d40ffb91e..49d570d4e6 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto; +package cn.iocoder.yudao.module.pay.service.notify.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/PayNotifyOrderReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/PayNotifyOrderReqVO.java similarity index 92% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/PayNotifyOrderReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/PayNotifyOrderReqVO.java index 94b1fec563..d4f6c1eaec 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/PayNotifyOrderReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/PayNotifyOrderReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.notify.vo; +package cn.iocoder.yudao.module.pay.service.notify.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/PayRefundOrderReqVO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/PayRefundOrderReqVO.java similarity index 93% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/PayRefundOrderReqVO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/PayRefundOrderReqVO.java index d436d759b7..978283d1b4 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/notify/vo/PayRefundOrderReqVO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/PayRefundOrderReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.notify.vo; +package cn.iocoder.yudao.module.pay.service.notify.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/package-info.java new file mode 100644 index 0000000000..fb006dd689 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/notify/vo/package-info.java @@ -0,0 +1,6 @@ +/** + * 这里的 VO 包有点特殊,是提供给接入支付模块的业务,提供回调接口时,可以直接使用 VO + * + * 例如说,支付单的回调,使用 TODO 芋艿:想下怎么优化下 + */ +package cn.iocoder.yudao.module.pay.service.notify.vo; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderExtensionService.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderExtensionService.java similarity index 80% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderExtensionService.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderExtensionService.java index a139956b4e..f707bc0dfc 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderExtensionService.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderExtensionService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.order; +package cn.iocoder.yudao.module.pay.service.order; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO; import java.util.Collection; import java.util.List; @@ -32,7 +32,6 @@ public interface PayOrderExtensionService { */ List getOrderExtensionList(Collection ids); - /** * 根据订单成功的 扩展订单ID 查询所有的扩展订单转 成 map 返回 * @@ -40,9 +39,8 @@ public interface PayOrderExtensionService { * @return 订单扩展 map 集合 */ default Map getOrderExtensionMap(Collection successExtensionIdList) { - List list = this.getOrderExtensionList(successExtensionIdList); + List list = getOrderExtensionList(successExtensionIdList); return CollectionUtils.convertMap(list, PayOrderExtensionDO::getId); } - } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayOrderExtensionServiceImpl.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderExtensionServiceImpl.java similarity index 68% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayOrderExtensionServiceImpl.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderExtensionServiceImpl.java index 1972756571..a97e3beff9 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/impl/PayOrderExtensionServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderExtensionServiceImpl.java @@ -1,8 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.order.impl; +package cn.iocoder.yudao.module.pay.service.order; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order.PayOrderExtensionMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.PayOrderExtensionService; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderExtensionMapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderService.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java similarity index 55% rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderService.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java index ebdf7e3401..40ed287fcc 100755 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderService.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java @@ -1,11 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.order; +package cn.iocoder.yudao.module.pay.service.order; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderPageReqVO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageReqVO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderCreateReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderSubmitRespDTO; +import javax.validation.Valid; import java.util.Collection; import java.util.List; import java.util.Map; @@ -64,4 +69,29 @@ public interface PayOrderService { return CollectionUtils.convertMap(list, PayOrderDO::getId); } + /** + * 创建支付单 + * + * @param reqDTO 创建请求 + * @return 支付单编号 + */ + Long createPayOrder(@Valid PayOrderCreateReqDTO reqDTO); + + /** + * 提交支付 + * 此时,会发起支付渠道的调用 + * + * @param reqDTO 提交请求 + * @return 提交结果 + */ + PayOrderSubmitRespDTO submitPayOrder(@Valid PayOrderSubmitReqDTO reqDTO); + + /** + * 通知支付单成功 + * + * @param channelId 渠道编号 + * @param notifyData 通知数据 + */ + void notifyPayOrder(Long channelId, PayNotifyDataDTO notifyData) throws Exception; + } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java old mode 100644 new mode 100755 similarity index 63% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java index 50229b140d..72bfac0234 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java @@ -1,25 +1,8 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order.impl; +package cn.iocoder.yudao.module.pay.service.order; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.coreservice.modules.pay.convert.order.PayOrderCoreConvert; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order.PayOrderCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order.PayOrderExtensionCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.enums.notify.PayNotifyTypeEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderNotifyStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayAppCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayChannelCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.pay.config.PayProperties; @@ -28,58 +11,94 @@ import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO; import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageReqVO; +import cn.iocoder.yudao.module.pay.convert.order.PayOrderConvert; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderExtensionMapper; +import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderMapper; +import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants; +import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; +import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; +import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; +import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; +import cn.iocoder.yudao.module.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderCreateReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderSubmitRespDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.Collection; import java.util.Date; +import java.util.List; import java.util.Objects; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.*; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - /** - * 支付订单 Core Service 实现类 + * 支付订单 Service 实现类 * - * @author 芋道源码 + * @author aquan */ @Service @Validated @Slf4j -public class PayOrderCoreServiceImpl implements PayOrderCoreService { +public class PayOrderServiceImpl implements PayOrderService { @Resource private PayProperties payProperties; - @Resource - private PayAppCoreService payAppCoreService; - @Resource - private PayChannelCoreService payChannelCoreService; - @Resource - private PayNotifyCoreService payNotifyCoreService; - @Resource private PayClientFactory payClientFactory; @Resource - private PayOrderCoreMapper payOrderCoreMapper; + private PayOrderMapper orderMapper; @Resource - private PayOrderExtensionCoreMapper payOrderExtensionCoreMapper; + private PayOrderExtensionMapper orderExtensionMapper; + + @Resource + private PayAppService appService; + @Resource + private PayChannelService channelService; + @Resource + private PayNotifyService notifyService; @Override - public PayOrderDO getPayOrder(Long id) { - return payOrderCoreMapper.selectById(id); + public PayOrderDO getOrder(Long id) { + return orderMapper.selectById(id); + } + + @Override + public PageResult getOrderPage(PayOrderPageReqVO pageReqVO) { + return orderMapper.selectPage(pageReqVO); + } + + @Override + public List getOrderList(PayOrderExportReqVO exportReqVO) { + return orderMapper.selectList(exportReqVO); + } + + // TODO @艿艿:需要优化。不确定这个方法的作用 + @Override + public List getOrderSubjectList(Collection idList) { + return orderMapper.findByIdListQueryOrderSubject(idList); } @Override public Long createPayOrder(PayOrderCreateReqDTO reqDTO) { // 校验 App - PayAppDO app = payAppCoreService.validPayApp(reqDTO.getAppId()); + PayAppDO app = appService.validPayApp(reqDTO.getAppId()); // 查询对应的支付交易单是否已经存在。如果是,则直接返回 - PayOrderDO order = payOrderCoreMapper.selectByAppIdAndMerchantOrderId( + PayOrderDO order = orderMapper.selectByAppIdAndMerchantOrderId( reqDTO.getAppId(), reqDTO.getMerchantOrderId()); if (order != null) { log.warn("[createPayOrder][appId({}) merchantOrderId({}) 已经存在对应的支付单({})]", order.getAppId(), @@ -88,7 +107,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { } // 创建支付交易单 - order = PayOrderCoreConvert.INSTANCE.convert(reqDTO) + order = PayOrderConvert.INSTANCE.convert(reqDTO) .setMerchantId(app.getMerchantId()).setAppId(app.getId()); // 商户相关字段 order.setNotifyUrl(app.getPayNotifyUrl()) @@ -99,7 +118,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { // todo @芋艿 创建支付的订单的退款状态枚举是不是有问题,应该是 PayRefundTypeEnum 吧 您这填写的是 PayOrderNotifyStatusEnum 回调状态枚举 order.setRefundStatus(PayOrderNotifyStatusEnum.NO.getStatus()) .setRefundTimes(0).setRefundAmount(0L); - payOrderCoreMapper.insert(order); + orderMapper.insert(order); // 最终返回 return order.getId(); } @@ -107,34 +126,34 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { @Override public PayOrderSubmitRespDTO submitPayOrder(PayOrderSubmitReqDTO reqDTO) { // 校验 App - payAppCoreService.validPayApp(reqDTO.getAppId()); + appService.validPayApp(reqDTO.getAppId()); // 校验支付渠道是否有效 - PayChannelDO channel = payChannelCoreService.validPayChannel(reqDTO.getAppId(), reqDTO.getChannelCode()); + PayChannelDO channel = channelService.validPayChannel(reqDTO.getAppId(), reqDTO.getChannelCode()); // 校验支付客户端是否正确初始化 PayClient client = payClientFactory.getPayClient(channel.getId()); if (client == null) { log.error("[submitPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); - throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_CLIENT_NOT_FOUND); } // 获得 PayOrderDO ,并校验其是否存在 - PayOrderDO order = payOrderCoreMapper.selectById(reqDTO.getId()); + PayOrderDO order = orderMapper.selectById(reqDTO.getId()); if (order == null || !Objects.equals(order.getAppId(), reqDTO.getAppId())) { // 是否存在 - throw exception(PAY_ORDER_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND); } if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付 - throw exception(PAY_ORDER_STATUS_IS_NOT_WAITING); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); } // 插入 PayOrderExtensionDO - PayOrderExtensionDO orderExtension = PayOrderCoreConvert.INSTANCE.convert(reqDTO) + PayOrderExtensionDO orderExtension = PayOrderConvert.INSTANCE.convert(reqDTO) .setOrderId(order.getId()).setNo(generateOrderExtensionNo()) .setChannelId(channel.getId()).setChannelCode(channel.getCode()) .setStatus(PayOrderStatusEnum.WAITING.getStatus()); - payOrderExtensionCoreMapper.insert(orderExtension); + orderExtensionMapper.insert(orderExtension); // 调用三方接口 - PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderCoreConvert.INSTANCE.convert2(reqDTO); + PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderConvert.INSTANCE.convert2(reqDTO); // 商户相关字段 //TODO jason @芋艿 是否加一个属性 如tradeNo 支付订单号, 用这个merchantOrderId让人迷糊 unifiedOrderReqDTO.setMerchantOrderId(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性! @@ -197,12 +216,12 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData.getBody()); // 校验支付渠道是否有效 - PayChannelDO channel = payChannelCoreService.validPayChannel(channelId); + PayChannelDO channel = channelService.validPayChannel(channelId); // 校验支付客户端是否正确初始化 PayClient client = payClientFactory.getPayClient(channel.getId()); if (client == null) { log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); - throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_CLIENT_NOT_FOUND); } // 解析支付结果 @@ -210,45 +229,44 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { // TODO 芋艿,先最严格的校验。即使调用方重复调用,实际哪个订单已经被重复回调的支付,也返回 false 。也没问题,因为实际已经回调成功了。 // 1.1 查询 PayOrderExtensionDO - PayOrderExtensionDO orderExtension = payOrderExtensionCoreMapper.selectByNo( - notifyRespDTO.getOrderExtensionNo()); + PayOrderExtensionDO orderExtension = orderExtensionMapper.selectByNo(notifyRespDTO.getOrderExtensionNo()); if (orderExtension == null) { - throw exception(PAY_ORDER_EXTENSION_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_NOT_FOUND); } if (!PayOrderStatusEnum.WAITING.getStatus().equals(orderExtension.getStatus())) { // 校验状态,必须是待支付 - throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); } // 1.2 更新 PayOrderExtensionDO //TODO 支付宝交易超时 TRADE_FINISHED 需要更新交易关闭 - int updateCounts = payOrderExtensionCoreMapper.updateByIdAndStatus(orderExtension.getId(), + int updateCounts = orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(), PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId()) .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData.getBody()).build()); if (updateCounts == 0) { // 校验状态,必须是待支付 - throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); } log.info("[notifyPayOrder][支付拓展单({}) 更新为已支付]", orderExtension.getId()); // 2.1 判断 PayOrderDO 是否处于待支付 - PayOrderDO order = payOrderCoreMapper.selectById(orderExtension.getOrderId()); + PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId()); if (order == null) { - throw exception(PAY_ORDER_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND); } if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付 - throw exception(PAY_ORDER_STATUS_IS_NOT_WAITING); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); } // 2.2 更新 PayOrderDO - updateCounts = payOrderCoreMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(), + updateCounts = orderMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(), PayOrderDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus()).channelId(channelId).channelCode(channel.getCode()) .successTime(notifyRespDTO.getSuccessTime()).successExtensionId(orderExtension.getId()) .channelOrderNo(notifyRespDTO.getChannelOrderNo()).channelUserId(notifyRespDTO.getChannelUserId()) .notifyTime(new Date()).build()); if (updateCounts == 0) { // 校验状态,必须是待支付 - throw exception(PAY_ORDER_STATUS_IS_NOT_WAITING); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); } log.info("[notifyPayOrder][支付订单({}) 更新为已支付]", order.getId()); // 3. 插入支付通知记录 - payNotifyCoreService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder() + notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder() .type(PayNotifyTypeEnum.ORDER.getType()).dataId(order.getId()).build()); } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderCreateReqDTO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderCreateReqDTO.java similarity index 95% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderCreateReqDTO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderCreateReqDTO.java index a5d2b0f4e2..62bf511de4 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderCreateReqDTO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderCreateReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order.dto; +package cn.iocoder.yudao.module.pay.service.order.dto; import lombok.Data; import org.hibernate.validator.constraints.Length; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderSubmitReqDTO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderSubmitReqDTO.java similarity index 92% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderSubmitReqDTO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderSubmitReqDTO.java index eb08fbb3e1..20f6ab2643 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderSubmitReqDTO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderSubmitReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order.dto; +package cn.iocoder.yudao.module.pay.service.order.dto; import lombok.Data; import lombok.experimental.Accessors; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderSubmitRespDTO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderSubmitRespDTO.java similarity index 83% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderSubmitRespDTO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderSubmitRespDTO.java index 2bcb504e85..a594253f55 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderSubmitRespDTO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayOrderSubmitRespDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order.dto; +package cn.iocoder.yudao.module.pay.service.order.dto; import lombok.Data; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayRefundReqDTO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayRefundReqDTO.java similarity index 93% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayRefundReqDTO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayRefundReqDTO.java index 6ec3fb13d1..0eb24dbe25 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayRefundReqDTO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayRefundReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order.dto; +package cn.iocoder.yudao.module.pay.service.order.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayRefundRespDTO.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayRefundRespDTO.java similarity index 85% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayRefundRespDTO.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayRefundRespDTO.java index d065f3852f..2e1a6fcd46 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayRefundRespDTO.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/order/dto/PayRefundRespDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order.dto; +package cn.iocoder.yudao.module.pay.service.order.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/package-info.java new file mode 100644 index 0000000000..2cad91ebaa --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.pay.service; diff --git a/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundService.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundService.java new file mode 100755 index 0000000000..7ffd52b10f --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundService.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.pay.service.refund; + +import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayRefundReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayRefundRespDTO; + +import java.util.List; + +/** + * 退款订单 Service 接口 + * + * @author aquan + */ +public interface PayRefundService { + + /** + * 获得退款订单 + * + * @param id 编号 + * @return 退款订单 + */ + PayRefundDO getRefund(Long id); + + /** + * 获得退款订单分页 + * + * @param pageReqVO 分页查询 + * @return 退款订单分页 + */ + PageResult getRefundPage(PayRefundPageReqVO pageReqVO); + + /** + * 获得退款订单列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 退款订单列表 + */ + List getRefundList(PayRefundExportReqVO exportReqVO); + + /** + * 提交退款申请 + * + * @param reqDTO 退款申请信息 + * @return 退款申请返回信息 + */ + PayRefundRespDTO submitRefundOrder(PayRefundReqDTO reqDTO); + + /** + * 渠道的退款通知 + * + * @param channelId 渠道编号 + * @param notifyData 通知数据 + * @throws Exception 退款通知异常 + */ + void notifyPayRefund(Long channelId, PayNotifyDataDTO notifyData) throws Exception; + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayRefundCoreServiceImpl.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceImpl.java old mode 100644 new mode 100755 similarity index 62% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayRefundCoreServiceImpl.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceImpl.java index 944c62aa6e..4e3a151fbe --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayRefundCoreServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceImpl.java @@ -1,26 +1,7 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order.impl; +package cn.iocoder.yudao.module.pay.service.refund; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order.PayOrderCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order.PayOrderExtensionCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order.PayRefundCoreMapper; -import cn.iocoder.yudao.coreservice.modules.pay.enums.notify.PayNotifyTypeEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderNotifyStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundTypeEnum; -import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayAppCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayChannelCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayRefundCoreService; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayRefundReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayRefundRespDTO; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.pay.core.client.PayClient; import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; @@ -29,56 +10,102 @@ import cn.iocoder.yudao.framework.pay.core.client.dto.PayRefundNotifyDTO; import cn.iocoder.yudao.framework.pay.core.client.dto.PayRefundUnifiedReqDTO; import cn.iocoder.yudao.framework.pay.core.client.dto.PayRefundUnifiedRespDTO; import cn.iocoder.yudao.framework.pay.core.enums.PayNotifyRefundStatusEnum; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; +import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderMapper; +import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants; +import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; +import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; +import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; +import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; +import cn.iocoder.yudao.module.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; +import cn.iocoder.yudao.module.pay.service.order.PayOrderExtensionService; +import cn.iocoder.yudao.module.pay.service.order.PayOrderService; +import cn.iocoder.yudao.module.pay.service.order.dto.PayRefundReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayRefundRespDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Date; +import java.util.List; import java.util.Objects; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.*; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - +/** + * 退款订单 Service 实现类 + * + * @author aquan + */ @Service @Slf4j -public class PayRefundCoreServiceImpl implements PayRefundCoreService { - - @Resource - private PayOrderCoreMapper payOrderCoreMapper; - @Resource - private PayRefundCoreMapper payRefundCoreMapper; - @Resource - private PayOrderExtensionCoreMapper payOrderExtensionCoreMapper; - - @Resource - private PayAppCoreService payAppCoreService; - @Resource - private PayChannelCoreService payChannelCoreService; - @Resource - private PayNotifyCoreService payNotifyCoreService; +@Validated +public class PayRefundServiceImpl implements PayRefundService { @Resource private PayClientFactory payClientFactory; + @Resource + private PayRefundMapper refundMapper; + @Resource + private PayOrderMapper orderMapper; // TODO @jason:需要改成不直接操作 db; + + @Resource + private PayOrderService orderService; + @Resource + private PayOrderExtensionService orderExtensionService; + @Resource + private PayAppService appService; + @Resource + private PayChannelService channelService; + @Resource + private PayNotifyService notifyService; + + @Override + public PayRefundDO getRefund(Long id) { + return refundMapper.selectById(id); + } + + @Override + public PageResult getRefundPage(PayRefundPageReqVO pageReqVO) { + return refundMapper.selectPage(pageReqVO); + } + + @Override + public List getRefundList(PayRefundExportReqVO exportReqVO) { + return refundMapper.selectList(exportReqVO); + } + @Override @Transactional(rollbackFor = Exception.class) public PayRefundRespDTO submitRefundOrder(PayRefundReqDTO req) { // 获得 PayOrderDO - PayOrderDO order = payOrderCoreMapper.selectById(req.getPayOrderId()); + PayOrderDO order = orderService.getOrder(req.getPayOrderId()); // 校验订单是否存在 if (Objects.isNull(order) ) { - throw exception(PAY_ORDER_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND); } // 校验 App - PayAppDO app = payAppCoreService.validPayApp(order.getAppId()); + PayAppDO app = appService.validPayApp(order.getAppId()); // 校验支付渠道是否有效 - PayChannelDO channel = payChannelCoreService.validPayChannel(order.getChannelId()); + PayChannelDO channel = channelService.validPayChannel(order.getChannelId()); // 校验支付客户端是否正确初始化 PayClient client = payClientFactory.getPayClient(channel.getId()); if (client == null) { log.error("[refund][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); - throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_CLIENT_NOT_FOUND); } // 校验退款的条件 @@ -88,19 +115,19 @@ public class PayRefundCoreServiceImpl implements PayRefundCoreService { if (Objects.equals(req.getAmount(), order.getAmount())) { refundType = PayRefundTypeEnum.ALL; } - PayOrderExtensionDO orderExtensionDO = payOrderExtensionCoreMapper.selectById(order.getSuccessExtensionId()); - PayRefundDO payRefundDO = payRefundCoreMapper.selectByTradeNoAndMerchantRefundNo(orderExtensionDO.getNo(), req.getMerchantRefundId()); + PayOrderExtensionDO orderExtensionDO = orderExtensionService.getOrderExtension(order.getSuccessExtensionId()); + PayRefundDO payRefundDO = refundMapper.selectByTradeNoAndMerchantRefundNo(orderExtensionDO.getNo(), req.getMerchantRefundId()); if(Objects.nonNull(payRefundDO)){ // 退款订单已经提交过。 //TODO 校验相同退款单的金额 // TODO @jason:咱要不封装一个 ObjectUtils.equalsAny if (Objects.equals(PayRefundStatusEnum.SUCCESS.getStatus(), payRefundDO.getStatus()) - || Objects.equals(PayRefundStatusEnum.CLOSE.getStatus(), payRefundDO.getStatus())) { + || Objects.equals(PayRefundStatusEnum.CLOSE.getStatus(), payRefundDO.getStatus())) { //已成功退款 - throw exception(PAY_REFUND_SUCCEED); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_SUCCEED); } //可以重复提交,保证 退款请求号 一致,由渠道保证幂等 - }else { + } else { // 成功,插入退款单 状态为生成.没有和渠道交互 // TODO @jason:搞到 convert 里。一些额外的自动,手动 set 下; payRefundDO = PayRefundDO.builder().channelOrderNo(order.getChannelOrderNo()) @@ -122,7 +149,7 @@ public class PayRefundCoreServiceImpl implements PayRefundCoreService { .notifyStatus(PayOrderNotifyStatusEnum.NO.getStatus()) .type(refundType.getStatus()) .build(); - payRefundCoreMapper.insert(payRefundDO); + refundMapper.insert(payRefundDO); } // TODO @jason:搞到 convert 里。一些额外的自动,手动 set 下; PayRefundUnifiedReqDTO unifiedReqDTO = new PayRefundUnifiedReqDTO(); @@ -142,18 +169,17 @@ public class PayRefundCoreServiceImpl implements PayRefundCoreService { return PayRefundRespDTO.builder().refundId(payRefundDO.getId()).build(); } - @Override @Transactional(rollbackFor = Exception.class) public void notifyPayRefund(Long channelId, PayNotifyDataDTO notifyData) { log.info("[notifyPayRefund][channelId({}) 回调数据({})]", channelId, notifyData.getBody()); // 校验支付渠道是否有效 - PayChannelDO channel = payChannelCoreService.validPayChannel(channelId); + PayChannelDO channel = channelService.validPayChannel(channelId); // 校验支付客户端是否正确初始化 PayClient client = payClientFactory.getPayClient(channel.getId()); if (client == null) { log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); - throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_CLIENT_NOT_FOUND); } // 解析渠道退款通知数据, 统一处理 PayRefundNotifyDTO refundNotify = client.parseRefundNotify(notifyData); @@ -167,14 +193,14 @@ public class PayRefundCoreServiceImpl implements PayRefundCoreService { private void payRefundSuccess(PayRefundNotifyDTO refundNotify) { // 校验退款单存在 - PayRefundDO refundDO = payRefundCoreMapper.selectByTradeNoAndMerchantRefundNo(refundNotify.getTradeNo(), refundNotify.getReqNo()); + PayRefundDO refundDO = refundMapper.selectByTradeNoAndMerchantRefundNo(refundNotify.getTradeNo(), refundNotify.getReqNo()); if (refundDO == null) { log.error("[payRefundSuccess][不存在 seqNo 为{} 的支付退款单]", refundNotify.getReqNo()); - throw exception(PAY_REFUND_NOT_FOUND); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_NOT_FOUND); } // 得到已退金额 - PayOrderDO payOrderDO = payOrderCoreMapper.selectById(refundDO.getOrderId()); + PayOrderDO payOrderDO = orderService.getOrder(refundDO.getOrderId()); Long refundedAmount = payOrderDO.getRefundAmount(); PayOrderStatusEnum orderStatus = PayOrderStatusEnum.SUCCESS; @@ -189,7 +215,7 @@ public class PayRefundCoreServiceImpl implements PayRefundCoreService { .setStatus(orderStatus.getStatus()) .setRefundTimes(payOrderDO.getRefundTimes() + 1) .setRefundStatus(refundDO.getType()); - payOrderCoreMapper.updateById(updateOrderDO); + orderMapper.updateById(updateOrderDO); // 更新退款订单 PayRefundDO updateRefundDO = new PayRefundDO(); @@ -199,11 +225,11 @@ public class PayRefundCoreServiceImpl implements PayRefundCoreService { .setTradeNo(refundNotify.getTradeNo()) .setNotifyTime(new Date()) .setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); - payRefundCoreMapper.updateById(updateRefundDO); + refundMapper.updateById(updateRefundDO); // 插入退款通知记录 // TODO 通知商户成功或者失败. 现在通知似乎没有实现, 只是回调 - payNotifyCoreService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder() + notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder() .type(PayNotifyTypeEnum.REFUND.getType()).dataId(refundDO.getId()).build()); } @@ -215,19 +241,19 @@ public class PayRefundCoreServiceImpl implements PayRefundCoreService { private void validatePayRefund(PayRefundReqDTO req, PayOrderDO order) { // 校验状态,必须是支付状态 if (!PayOrderStatusEnum.SUCCESS.getStatus().equals(order.getStatus())) { - throw exception(PAY_ORDER_STATUS_IS_NOT_SUCCESS); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_SUCCESS); } // 是否已经全额退款 if (PayRefundTypeEnum.ALL.getStatus().equals(order.getRefundStatus())) { - throw exception(PAY_REFUND_ALL_REFUNDED); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_ALL_REFUNDED); } // 校验金额 退款金额不能大于 原定的金额 if (req.getAmount() + order.getRefundAmount() > order.getAmount()){ - throw exception(PAY_REFUND_AMOUNT_EXCEED); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_AMOUNT_EXCEED); } // 校验渠道订单号 if (StrUtil.isEmpty(order.getChannelOrderNo())) { - throw exception(PAY_REFUND_CHN_ORDER_NO_IS_NULL); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_CHN_ORDER_NO_IS_NULL); } //TODO 退款的期限 退款次数的控制 } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/util/PaySeqUtils.java b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/util/PaySeqUtils.java similarity index 94% rename from yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/util/PaySeqUtils.java rename to yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/util/PaySeqUtils.java index 959cef7460..e6409e9603 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/util/PaySeqUtils.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/util/PaySeqUtils.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.util; +package cn.iocoder.yudao.module.pay.util; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; @@ -10,6 +10,7 @@ import java.util.concurrent.atomic.AtomicLong; /** * 支付相关编号的生产 */ +// TODO @jason:需要改造,基于 db; public class PaySeqUtils { private static final AtomicLong REFUND_REQ_NO_SEQ = new AtomicLong(0L); @@ -47,4 +48,5 @@ public class PaySeqUtils { DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN), (int) MER_ORDER_NO_SEQ.getAndIncrement() % 10000); } + } diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/PayAppServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceTest.java similarity index 90% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/PayAppServiceTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceTest.java index 7dee064027..0939ade8b1 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/app/PayAppServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceTest.java @@ -1,18 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.app; +package cn.iocoder.yudao.module.pay.service.merchant; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo.PayAppUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.app.PayAppMapper; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.merchant.PayMerchantMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.app.impl.PayAppServiceImpl; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppUpdateReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayAppMapper; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayMerchantMapper; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.boot.test.mock.mockito.MockBean; @@ -22,13 +21,13 @@ import javax.annotation.Resource; import java.util.Collections; import java.util.List; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.PAY_APP_NOT_FOUND; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.*; /** diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceTest.java similarity index 93% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelServiceTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceTest.java index b8d2bc917f..6397bb4139 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/channel/PayChannelServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceTest.java @@ -1,18 +1,17 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.channel; +package cn.iocoder.yudao.module.pay.service.merchant; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.channel.vo.PayChannelUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.channel.PayChannelMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.channel.impl.PayChannelServiceImpl; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayChannelMapper; +import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; import com.alibaba.fastjson.JSON; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -20,24 +19,16 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.util.List; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.CHANNEL_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; -/** - * {@link PayChannelServiceImpl} 的单元测试类 - * - * @author 芋艿 - */ -@Import({ - PayChannelServiceImpl.class, - PayChannelConfig.class -}) +@Import({PayChannelServiceImpl.class}) public class PayChannelServiceTest extends BaseDbUnitTest { @Resource @@ -66,7 +57,6 @@ public class PayChannelServiceTest extends BaseDbUnitTest { assertPojoEquals(reqVO, channel, "config"); // 关于config 对象应该拿出来重新对比 assertPojoEquals(v2Config, channel.getConfig()); - } @Test @@ -350,7 +340,6 @@ public class PayChannelServiceTest extends BaseDbUnitTest { assertPojoEquals(payClientConfig, list.get(0).getConfig()); } - public WXPayClientConfig getV2Config() { return new WXPayClientConfig() .setAppId("APP00001") @@ -400,5 +389,4 @@ public class PayChannelServiceTest extends BaseDbUnitTest { .setRootCertContent("13321321321dsad"); } - } diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/PayMerchantServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantServiceTest.java similarity index 89% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/PayMerchantServiceTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantServiceTest.java index 0e7cf135dc..08d097083c 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/PayMerchantServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantServiceTest.java @@ -1,29 +1,28 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.merchant; +package cn.iocoder.yudao.module.pay.service.merchant; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.merchant.PayMerchantMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.impl.PayMerchantServiceImpl; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayMerchantMapper; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.util.List; -import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.PAY_MERCHANT_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.*; /** diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java similarity index 91% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderServiceTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java index 85b00a2d0e..e3ac7394ce 100755 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/order/PayOrderServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java @@ -1,19 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.order; +package cn.iocoder.yudao.module.pay.service.order; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.order.PayOrderPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order.PayOrderMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.impl.PayOrderServiceImpl; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderNotifyStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; +import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderMapper; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; +import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/package-info.java new file mode 100644 index 0000000000..2cad91ebaa --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.pay.service; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/refund/PayRefundServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java similarity index 90% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/refund/PayRefundServiceTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java index ee19dba14e..1d91732177 100755 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/service/refund/PayRefundServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java @@ -1,17 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.pay.service.refund; +package cn.iocoder.yudao.module.pay.service.refund; -import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.PayRefundExportReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.controller.order.vo.refund.vo.PayRefundPageReqVO; -import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.order.PayRefundMapper; -import cn.iocoder.yudao.adminserver.modules.pay.service.order.impl.PayRefundServiceImpl; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayRefundDO; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderNotifyStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundStatusEnum; -import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayRefundTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; +import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; +import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper; +import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum; +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; +import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisUnitTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseDbAndRedisUnitTest.java similarity index 95% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisUnitTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseDbAndRedisUnitTest.java index 2cc60cc30c..1c6d3278d7 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisUnitTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseDbAndRedisUnitTest.java @@ -1,9 +1,8 @@ -package cn.iocoder.yudao.adminserver; +package cn.iocoder.yudao.module.pay.test; -import cn.iocoder.yudao.adminserver.config.RedisTestConfiguration; -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import org.redisson.spring.starter.RedissonAutoConfiguration; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseDbUnitTest.java similarity index 97% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseDbUnitTest.java index 5f7daeded1..27affbfc6b 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseDbUnitTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver; +package cn.iocoder.yudao.module.pay.test; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseRedisUnitTest.java similarity index 86% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseRedisUnitTest.java index 7e650bc3e2..11933c9fdd 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseRedisUnitTest.java @@ -1,8 +1,6 @@ -package cn.iocoder.yudao.adminserver; +package cn.iocoder.yudao.module.pay.test; -import cn.iocoder.yudao.adminserver.config.RedisTestConfiguration; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import cn.iocoder.yudao.framework.tracer.config.YudaoTracerAutoConfiguration; import org.redisson.spring.starter.RedissonAutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/RedisTestConfiguration.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/RedisTestConfiguration.java similarity index 96% rename from yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/RedisTestConfiguration.java rename to yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/RedisTestConfiguration.java index 15a39f7570..c8742129a0 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/RedisTestConfiguration.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/RedisTestConfiguration.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.config; +package cn.iocoder.yudao.module.pay.test; import com.github.fppt.jedismock.RedisServer; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index 9b73264e14..ab6d1b3a21 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -20,31 +20,6 @@ public interface DictTypeConstants { String SMS_SEND_STATUS = "sys_sms_send_status"; // 短信发送状态 String SMS_RECEIVE_STATUS = "sys_sms_receive_status"; // 短信接收状态 - /** - * 支付-订单-订单状态 - */ - String PAY_ORDER_STATUS = "pay_order_status"; - - /** - * 支付-订单-订单回调商户状态 - */ - String PAY_ORDER_NOTIFY_STATUS = "pay_order_notify_status"; - - /** - * 支付-订单-订单退款状态 - */ - String PAY_ORDER_REFUND_STATUS = "pay_order_refund_status"; - - /** - * 支付-退款订单-退款状态 - */ - String PAY_REFUND_ORDER_STATUS = "pay_refund_order_status"; - - /** - * 支付-退款订单-退款类别 - */ - String PAY_REFUND_ORDER_TYPE = "pay_refund_order_type"; - String BPM_TASK_ASSIGN_RULE_TYPE = "bpm_task_assign_rule_type"; // 任务分配规则类型 String BPM_TASK_ASSIGN_SCRIPT = "bpm_task_assign_script"; // 任务分配自定义脚本 diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/order/PayRefundConvert.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/order/PayRefundConvert.java deleted file mode 100644 index 999a3ba560..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/order/PayRefundConvert.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.userserver.modules.pay.convert.order; - -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayRefundReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayRefundRespDTO; -import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayRefundReqVO; -import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayRefundRespVO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 支付退款 Convert - * - * @author jason - */ -@Mapper -public interface PayRefundConvert { - - PayRefundConvert INSTANCE = Mappers.getMapper(PayRefundConvert.class); - - PayRefundReqDTO convert(PayRefundReqVO reqVO); - - PayRefundRespVO convert(PayRefundRespDTO req); -} diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 8153487b72..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/package-info.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/package-info.java deleted file mode 100644 index 1aa11cdd26..0000000000 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * pay 包下,我们放支付业务,提供业务的支付能力。 - * 例如说:商户、应用、支付、退款等等 - * - * 缩写:pay - */ -package cn.iocoder.yudao.userserver.modules.pay; From d45213fe2a4ba290be3c27c9d4bf55cc3e3d2740 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 22:14:35 +0800 Subject: [PATCH 24/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=207=EF=BC=9Apay=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 3 +- yudao-core-service/pom.xml | 106 ---------------- .../modules/pay/service/package-info.java | 1 - .../src/test/resources/sql/create_tables.sql | 18 ++- .../test/resources/application-unit-test.yaml | 4 + .../dataobject/merchant/PayChannelDOTest.java | 2 +- .../PayChannelMapperIntegrationTest.java | 16 +-- .../order/PayOrderServiceIntegrationTest.java | 25 ++-- .../module/pay/service/package-info.java | 1 + .../test}/BaseDbAndRedisIntegrationTest.java | 2 +- .../pay/test}/BaseDbIntegrationTest.java | 2 +- .../pay/test}/BaseRedisIntegrationTest.java | 2 +- .../application-integration-test.yaml | 1 + .../service/merchant/PayAppServiceTest.java | 6 +- .../merchant/PayChannelServiceTest.java | 8 ++ .../service/order/PayOrderServiceTest.java | 19 ++- .../service/refund/PayRefundServiceTest.java | 25 +++- .../test/resources/application-unit-test.yaml | 54 ++++++++ .../src/test/resources/logback-spring.xml | 4 + .../src/test/resources/sql/clean.sql | 5 + .../src/test/resources/sql/create_tables.sql | 115 ++++++++++++++++++ 21 files changed, 271 insertions(+), 148 deletions(-) delete mode 100644 yudao-core-service/pom.xml delete mode 100644 yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java rename {yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules => yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module}/pay/dal/dataobject/merchant/PayChannelDOTest.java (92%) rename yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapperTest.java => yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java (89%) rename yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreServiceTest.java => yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceIntegrationTest.java (55%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/service/package-info.java rename {yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice => yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test}/BaseDbAndRedisIntegrationTest.java (98%) rename {yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice => yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test}/BaseDbIntegrationTest.java (97%) rename {yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice => yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test}/BaseRedisIntegrationTest.java (95%) rename {yudao-core-service => yudao-module-pay/yudao-module-pay-impl}/src/test-integration/resources/application-integration-test.yaml (98%) create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/test/resources/application-unit-test.yaml create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/test/resources/logback-spring.xml create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/test/resources/sql/clean.sql create mode 100644 yudao-module-pay/yudao-module-pay-impl/src/test/resources/sql/create_tables.sql diff --git a/pom.xml b/pom.xml index e5294f7d8e..dac70439b1 100644 --- a/pom.xml +++ b/pom.xml @@ -10,9 +10,10 @@ yudao-dependencies yudao-framework + yudao-admin-server yudao-user-server - yudao-core-service + yudao-module-member yudao-module-system diff --git a/yudao-core-service/pom.xml b/yudao-core-service/pom.xml deleted file mode 100644 index ccb1e1600b..0000000000 --- a/yudao-core-service/pom.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - cn.iocoder.boot - yudao - ${revision} - - 4.0.0 - - yudao-core-service - jar - - yudao-core-service - - 公共服务,通过 jar 包的方式,被 yudao-admin-server、yudao-user-service 使用。例如说: - 1. 日志相关:访问日志、登录日志、异常日志等等 - 2. 认证相关:在线 Session - 3. 短信相关:短信模板、短信日志 - 等等 - - https://github.com/YunaiV/ruoyi-vue-pro - - - - - cn.iocoder.boot - yudao-spring-boot-starter-biz-dict - - - cn.iocoder.boot - yudao-spring-boot-starter-biz-sms - - - cn.iocoder.boot - yudao-spring-boot-starter-biz-pay - - - cn.iocoder.boot - yudao-spring-boot-starter-biz-tenant - - - - - cn.iocoder.boot - yudao-spring-boot-starter-web - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - cn.iocoder.boot - yudao-spring-boot-starter-security - - - - - cn.iocoder.boot - yudao-spring-boot-starter-mybatis - - - - cn.iocoder.boot - yudao-spring-boot-starter-redis - - - - - cn.iocoder.boot - yudao-spring-boot-starter-config - - - - - cn.iocoder.boot - yudao-spring-boot-starter-mq - - - - - cn.iocoder.boot - yudao-spring-boot-starter-protection - - - - - cn.iocoder.boot - yudao-spring-boot-starter-test - test - - - - - - com.google.guava - guava - - - - - diff --git a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java b/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java deleted file mode 100644 index 13b4863a5b..0000000000 --- a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service; diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql index 8b6433e698..54e6ab622a 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql +++ b/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql @@ -1,5 +1,3 @@ --- bpm 开头的 DB - CREATE TABLE IF NOT EXISTS "bpm_form" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, "name" varchar(63) NOT NULL, @@ -13,4 +11,18 @@ CREATE TABLE IF NOT EXISTS "bpm_form" ( "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY ("id") -) COMMENT '动态表单'; + ) COMMENT '动态表单'; + +CREATE TABLE IF NOT EXISTS "bpm_user_group" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "description" varchar(255) NOT NULL, + "status" tinyint NOT NULL, + "member_user_ids" varchar(255) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") + ) COMMENT '用户组'; diff --git a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml index 42e5e356dd..e8e47b4456 100644 --- a/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml +++ b/yudao-module-infra/yudao-module-infra-impl/src/test/resources/application-unit-test.yaml @@ -48,3 +48,7 @@ yudao: base-package2: cn.iocoder.yudao.module core-service: base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 + pay: + pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify + pay-return-url: http://niubi.natapp1.cc/api/pay/order/return + refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify diff --git a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayChannelDOTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayChannelDOTest.java similarity index 92% rename from yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayChannelDOTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayChannelDOTest.java index c0fb7d5bd6..2818cb12d0 100644 --- a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayChannelDOTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/dal/dataobject/merchant/PayChannelDOTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant; +package cn.iocoder.yudao.module.pay.dal.dataobject.merchant; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig; diff --git a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapperTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java similarity index 89% rename from yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapperTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java index 18445a4ec9..b869163a2f 100644 --- a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapperTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.merchant; +package cn.iocoder.yudao.module.pay.dal.mysql.merchant; import cn.hutool.core.io.IoUtil; -import cn.iocoder.yudao.coreservice.BaseDbAndRedisIntegrationTest; -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; +import cn.iocoder.yudao.module.pay.test.BaseDbIntegrationTest; import org.junit.jupiter.api.Test; import javax.annotation.Resource; @@ -15,10 +15,10 @@ import java.io.FileNotFoundException; import java.util.List; @Resource -public class PayChannelCoreMapperTest extends BaseDbAndRedisIntegrationTest { +public class PayChannelMapperIntegrationTest extends BaseDbIntegrationTest { @Resource - private PayChannelCoreMapper payChannelCoreMapper; + private PayChannelMapper payChannelMapper; /** * 插入 {@link PayChannelEnum#WX_PUB} 初始配置 @@ -42,7 +42,7 @@ public class PayChannelCoreMapperTest extends BaseDbAndRedisIntegrationTest { config.setApiV3Key("joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"); payChannelDO.setConfig(config); // 执行插入 - payChannelCoreMapper.insert(payChannelDO); + payChannelMapper.insert(payChannelDO); } // TODO @ouyang:Zfb 改成 AlipayQr @@ -67,7 +67,7 @@ public class PayChannelCoreMapperTest extends BaseDbAndRedisIntegrationTest { // 创建客户端 payChannelDO.setConfig(config); // 执行插入 - payChannelCoreMapper.insert(payChannelDO); + payChannelMapper.insert(payChannelDO); } /** @@ -75,7 +75,7 @@ public class PayChannelCoreMapperTest extends BaseDbAndRedisIntegrationTest { */ @Test public void testSelectList() { - List payChannels = payChannelCoreMapper.selectList(); + List payChannels = payChannelMapper.selectList(); System.out.println(payChannels.size()); } diff --git a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceIntegrationTest.java similarity index 55% rename from yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreServiceTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceIntegrationTest.java index 2a5e137412..f6f953635a 100644 --- a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceIntegrationTest.java @@ -1,11 +1,10 @@ -package cn.iocoder.yudao.coreservice.modules.pay.service.order; +package cn.iocoder.yudao.module.pay.service.order; -import cn.iocoder.yudao.coreservice.BaseDbIntegrationTest; -import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.impl.PayAppCoreServiceImpl; -import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.impl.PayChannelCoreServiceImpl; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; -import cn.iocoder.yudao.coreservice.modules.pay.service.order.impl.PayOrderCoreServiceImpl; +import cn.iocoder.yudao.module.pay.service.merchant.PayAppServiceImpl; +import cn.iocoder.yudao.module.pay.service.merchant.PayChannelServiceImpl; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderCreateReqDTO; +import cn.iocoder.yudao.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import cn.iocoder.yudao.module.pay.test.BaseDbIntegrationTest; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.pay.config.YudaoPayAutoConfiguration; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; @@ -15,12 +14,12 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.time.Duration; -@Import({PayOrderCoreServiceImpl.class, PayAppCoreServiceImpl.class, - PayChannelCoreServiceImpl.class, YudaoPayAutoConfiguration.class}) -public class PayOrderCoreServiceTest extends BaseDbIntegrationTest { +@Import({PayOrderServiceImpl.class, PayAppServiceImpl.class, + PayChannelServiceImpl.class, YudaoPayAutoConfiguration.class}) +public class PayOrderServiceIntegrationTest extends BaseDbIntegrationTest { @Resource - private PayOrderCoreService payOrderCoreService; + private PayOrderService payOrderService; @Test public void testCreatePayOrder() { @@ -34,7 +33,7 @@ public class PayOrderCoreServiceTest extends BaseDbIntegrationTest { reqDTO.setAmount(100); reqDTO.setExpireTime(DateUtils.addTime(Duration.ofDays(1))); // 发起请求 - payOrderCoreService.createPayOrder(reqDTO); + payOrderService.createPayOrder(reqDTO); } @Test @@ -46,7 +45,7 @@ public class PayOrderCoreServiceTest extends BaseDbIntegrationTest { reqDTO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); reqDTO.setUserIp("127.0.0.1"); // 发起请求 - payOrderCoreService.submitPayOrder(reqDTO); + payOrderService.submitPayOrder(reqDTO); } } diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/service/package-info.java b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/service/package-info.java new file mode 100644 index 0000000000..2cad91ebaa --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/service/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.pay.service; diff --git a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseDbAndRedisIntegrationTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseDbAndRedisIntegrationTest.java similarity index 98% rename from yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseDbAndRedisIntegrationTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseDbAndRedisIntegrationTest.java index dc15808943..2ee19ebf91 100644 --- a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseDbAndRedisIntegrationTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseDbAndRedisIntegrationTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice; +package cn.iocoder.yudao.module.pay.test; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; diff --git a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseDbIntegrationTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseDbIntegrationTest.java similarity index 97% rename from yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseDbIntegrationTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseDbIntegrationTest.java index c0ebe98738..380efa3f40 100644 --- a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseDbIntegrationTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseDbIntegrationTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice; +package cn.iocoder.yudao.module.pay.test; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; diff --git a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseRedisIntegrationTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseRedisIntegrationTest.java similarity index 95% rename from yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseRedisIntegrationTest.java rename to yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseRedisIntegrationTest.java index 16b5e98f14..d01353d725 100644 --- a/yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/BaseRedisIntegrationTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/java/cn/iocoder/yudao/module/pay/test/BaseRedisIntegrationTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.coreservice; +package cn.iocoder.yudao.module.pay.test; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import org.redisson.spring.starter.RedissonAutoConfiguration; diff --git a/yudao-core-service/src/test-integration/resources/application-integration-test.yaml b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/resources/application-integration-test.yaml similarity index 98% rename from yudao-core-service/src/test-integration/resources/application-integration-test.yaml rename to yudao-module-pay/yudao-module-pay-impl/src/test-integration/resources/application-integration-test.yaml index 9f87b5ca7c..658ebd932f 100644 --- a/yudao-core-service/src/test-integration/resources/application-integration-test.yaml +++ b/yudao-module-pay/yudao-module-pay-impl/src/test-integration/resources/application-integration-test.yaml @@ -88,6 +88,7 @@ yudao: info: version: 1.0.0 base-package: cn.iocoder.yudao.adminserver + base-package2: cn.iocoder.yudao.module core-service: base-package: cn.iocoder.yudao.coreservice pay: diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceTest.java index 0939ade8b1..a0da136bc1 100644 --- a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceTest.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.pay.service.merchant; import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; @@ -30,11 +31,6 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.*; -/** - * {@link PayAppServiceImpl} 的单元测试类 - * - * @author 芋艿 - */ @Import(PayAppServiceImpl.class) public class PayAppServiceTest extends BaseDbUnitTest { diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceTest.java index 6397bb4139..f6335d0913 100644 --- a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceTest.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.merchant; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; @@ -14,9 +15,11 @@ import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayChannelMapper; import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; import com.alibaba.fastjson.JSON; import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; +import javax.validation.Validator; import java.util.List; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; @@ -37,6 +40,11 @@ public class PayChannelServiceTest extends BaseDbUnitTest { @Resource private PayChannelMapper channelMapper; + @MockBean + private PayClientFactory payClientFactory; + @MockBean + private Validator validator; + @Test public void testCreateWechatVersion2Channel_success() { // 准备参数 diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java index e3ac7394ce..cacee1681d 100755 --- a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java @@ -4,6 +4,8 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import cn.iocoder.yudao.framework.pay.config.PayProperties; +import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO; import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageReqVO; @@ -12,8 +14,12 @@ import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderMapper; import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum; import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; +import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; +import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; +import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; @@ -30,7 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; * * @author 芋艿 */ -@Import(PayOrderServiceImpl.class) +@Import({PayOrderServiceImpl.class}) public class PayOrderServiceTest extends BaseDbUnitTest { @Resource @@ -39,6 +45,17 @@ public class PayOrderServiceTest extends BaseDbUnitTest { @Resource private PayOrderMapper orderMapper; + @MockBean + private PayClientFactory payClientFactory; + @MockBean + private PayProperties properties; + @MockBean + private PayAppService appService; + @MockBean + private PayChannelService channelService; + @MockBean + private PayNotifyService notifyService; + public String generateNo() { return DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomInt(100000, 999999); } diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java index 1d91732177..844c0ca009 100755 --- a/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.refund; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; @@ -10,8 +11,14 @@ import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper; import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum; import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum; import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; +import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; +import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; +import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; +import cn.iocoder.yudao.module.pay.service.order.PayOrderExtensionService; +import cn.iocoder.yudao.module.pay.service.order.PayOrderService; import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; @@ -22,12 +29,6 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * {@link PayRefundServiceImpl} 的单元测试类 - * - * @author aquan - */ @Import(PayRefundServiceImpl.class) public class PayRefundServiceTest extends BaseDbUnitTest { @@ -37,6 +38,18 @@ public class PayRefundServiceTest extends BaseDbUnitTest { @Resource private PayRefundMapper refundMapper; + @MockBean + private PayClientFactory payClientFactory; + @MockBean + private PayOrderService orderService; + @MockBean + private PayOrderExtensionService orderExtensionService; + @MockBean + private PayAppService appService; + @MockBean + private PayChannelService channelService; + @MockBean + private PayNotifyService notifyService; @Test public void testGetRefundPage() { diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/resources/application-unit-test.yaml b/yudao-module-pay/yudao-module-pay-impl/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000000..6f83b473aa --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/resources/application-unit-test.yaml @@ -0,0 +1,54 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具 + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +yudao: + info: + base-package: cn.iocoder.yudao.module.member.dal.mysql + base-package2: cn.iocoder.yudao.module + core-service: + base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 + captcha: + timeout: 5m + width: 160 + height: 60 diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/resources/logback-spring.xml b/yudao-module-pay/yudao-module-pay-impl/src/test/resources/logback-spring.xml new file mode 100644 index 0000000000..daf756bff0 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/resources/logback-spring.xml @@ -0,0 +1,4 @@ + + + + diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/resources/sql/clean.sql b/yudao-module-pay/yudao-module-pay-impl/src/test/resources/sql/clean.sql new file mode 100644 index 0000000000..7430b6bfe3 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/resources/sql/clean.sql @@ -0,0 +1,5 @@ +DELETE FROM pay_merchant; +DELETE FROM pay_app; +DELETE FROM pay_channel; +DELETE FROM pay_order; +DELETE FROM pay_refund; diff --git a/yudao-module-pay/yudao-module-pay-impl/src/test/resources/sql/create_tables.sql b/yudao-module-pay/yudao-module-pay-impl/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000000..e4a141e9f6 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-impl/src/test/resources/sql/create_tables.sql @@ -0,0 +1,115 @@ +CREATE TABLE IF NOT EXISTS "pay_merchant" +( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "no" varchar(32) NOT NULL, + "name" varchar(64) NOT NULL, + "short_name" varchar(64) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '支付商户信息'; + +CREATE TABLE IF NOT EXISTS "pay_app" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(64) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + `pay_notify_url` varchar(1024) NOT NULL, + `refund_notify_url` varchar(1024) NOT NULL, + `merchant_id` bigint(20) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付应用信息'; + +CREATE TABLE IF NOT EXISTS "pay_channel" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(32) NOT NULL, + "status" tinyint(4) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "fee_rate" double NOT NULL DEFAULT 0, + "merchant_id" bigint(20) NOT NULL, + "app_id" bigint(20) NOT NULL, + "config" varchar(10240) NOT NULL, + "creator" varchar(64) NULL DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) NULL DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付渠道'; + +CREATE TABLE IF NOT EXISTS `pay_order` ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `merchant_id` bigint(20) NOT NULL, + `app_id` bigint(20) NOT NULL, + `channel_id` bigint(20) DEFAULT NULL, + `channel_code` varchar(32) DEFAULT NULL, + `merchant_order_id` varchar(64) NOT NULL, + `subject` varchar(32) NOT NULL, + `body` varchar(128) NOT NULL, + `notify_url` varchar(1024) NOT NULL, + `notify_status` tinyint(4) NOT NULL, + `amount` bigint(20) NOT NULL, + `channel_fee_rate` double DEFAULT 0, + `channel_fee_amount` bigint(20) DEFAULT 0, + `status` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `expire_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `success_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, + `notify_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, + `success_extension_id` bigint(20) DEFAULT NULL COMMENT '支付成功的订单拓展单编号', + `refund_status` tinyint(4) NOT NULL, + `refund_times` tinyint(4) NOT NULL, + `refund_amount` bigint(20) NOT NULL, + `channel_user_id` varchar(255) DEFAULT NULL, + `channel_order_no` varchar(64) DEFAULT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付订单'; + +CREATE TABLE IF NOT EXISTS `pay_refund` ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `merchant_id` bigint(20) NOT NULL, + `app_id` bigint(20) NOT NULL, + `channel_id` bigint(20) NOT NULL, + `channel_code` varchar(32) NOT NULL, + `order_id` bigint(20) NOT NULL, + `trade_no` varchar(64) NOT NULL, + `merchant_order_id` varchar(64) NOT NULL, + `merchant_refund_no` varchar(64) NOT NULL, + `notify_url` varchar(1024) NOT NULL, + `notify_status` tinyint(4) NOT NULL, + `status` tinyint(4) NOT NULL, + `type` tinyint(4) NOT NULL, + `pay_amount` bigint(20) NOT NULL, + `refund_amount` bigint(20) NOT NULL, + `reason` varchar(256) NOT NULL, + `user_ip` varchar(50) NULL DEFAULT NULL, + `channel_order_no` varchar(64) NOT NULL, + `channel_refund_no` varchar(64) NULL DEFAULT NULL, + `channel_error_code` varchar(128) NULL DEFAULT NULL, + `channel_error_msg` varchar(256) NULL DEFAULT NULL, + `channel_extras` varchar(1024) NULL DEFAULT NULL, + `expire_time` datetime(0) NULL DEFAULT NULL, + `success_time` datetime(0) NULL DEFAULT NULL, + `notify_time` datetime(0) NULL DEFAULT NULL, + `creator` varchar(64) NULL DEFAULT '', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) NULL DEFAULT '', + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '退款订单'; From 510917c5ed0b2fad885802a468730d637140737a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 22:55:48 +0800 Subject: [PATCH 25/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=208=EF=BC=9Abom=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +-- yudao-admin-server/pom.xml | 27 +++++------------- yudao-dependencies/pom.xml | 20 ------------- yudao-module-bpm/pom.xml | 28 ++++++++++++++----- .../pom.xml | 16 ++++++----- .../bpm/api/form/BpmFormServiceApi.java | 0 .../modules/bpm/api/form/dto/BpmFormDTO.java | 0 .../bpm/api/group/BpmUserGroupServiceApi.java | 0 .../bpm/api/group/dto/BpmUserGroupDTO.java | 0 .../pom.xml | 27 +++++++++++++----- .../bpm/api/BpmFormServiceApiImpl.java | 0 .../bpm/api/BpmUserGroupServiceApiImpl.java | 0 .../definition/BpmFormController.java | 0 .../definition/BpmUserGroupController.java | 0 .../definition/vo/form/BpmFormBaseVO.java | 1 + .../vo/form/BpmFormCreateReqVO.java | 0 .../definition/vo/form/BpmFormPageReqVO.java | 0 .../definition/vo/form/BpmFormRespVO.java | 0 .../vo/form/BpmFormSimpleRespVO.java | 0 .../vo/form/BpmFormUpdateReqVO.java | 0 .../vo/group/BpmUserGroupBaseVO.java | 0 .../vo/group/BpmUserGroupCreateReqVO.java | 0 .../vo/group/BpmUserGroupPageReqVO.java | 0 .../vo/group/BpmUserGroupRespVO.java | 0 .../vo/group/BpmUserGroupSimpleRespVO.java | 0 .../vo/group/BpmUserGroupUpdateReqVO.java | 0 .../convert/definition/BpmFormConvert.java | 0 .../definition/BpmUserGroupConvert.java | 0 .../dal/dataobject/definition/BpmFormDO.java | 0 .../dataobject/definition/BpmUserGroupDO.java | 0 .../dal/mysql/definition/BpmFormMapper.java | 0 .../mysql/definition/BpmUserGroupMapper.java | 0 .../bpm/enums/BpmErrorCodeConstants.java | 0 .../service/definition/BpmFormService.java | 0 .../definition/BpmUserGroupService.java | 0 .../definition/dto/BpmFormFieldRespDTO.java | 0 .../definition/impl/BpmFormServiceImpl.java | 0 .../impl/BpmUserGroupServiceImpl.java | 0 .../yudao/adminserver/BaseDbUnitTest.java | 0 .../definition/BpmFormServiceTest.java | 0 .../definition/BpmUserGroupServiceTest.java | 0 .../test/resources/application-unit-test.yaml | 0 .../src/test/resources/application.yaml | 0 .../src/test/resources/logback-spring.xml | 0 .../src/test/resources/sql/clean.sql | 0 .../src/test/resources/sql/create_tables.sql | 0 .../yudao-module-bpm-core-service/pom.xml | 19 ------------- .../pom.xml | 27 ++++++++++-------- .../definition/BpmModelController.java | 0 .../BpmProcessDefinitionController.http | 0 .../BpmProcessDefinitionController.java | 0 .../BpmTaskAssignRuleController.http | 0 .../BpmTaskAssignRuleController.java | 0 .../vo/model/BpmModeImportReqVO.java | 0 .../definition/vo/model/BpmModelBaseVO.java | 0 .../vo/model/BpmModelCreateReqVO.java | 0 .../vo/model/BpmModelPageItemRespVO.java | 0 .../definition/vo/model/BpmModelRespVO.java | 0 .../vo/model/BpmModelUpdateReqVO.java | 0 .../vo/model/BpmModelUpdateStateReqVO.java | 0 .../definition/vo/model/ModelPageReqVO.java | 0 .../BpmProcessDefinitionListReqVO.java | 0 .../BpmProcessDefinitionPageItemRespVO.java | 0 .../BpmProcessDefinitionPageReqVO.java | 0 .../process/BpmProcessDefinitionRespVO.java | 0 .../vo/rule/BpmTaskAssignRuleBaseVO.java | 0 .../vo/rule/BpmTaskAssignRuleCreateReqVO.java | 0 .../vo/rule/BpmTaskAssignRuleRespVO.java | 0 .../vo/rule/BpmTaskAssignRuleUpdateReqVO.java | 0 .../controller/oa/BpmOALeaveController.http | 0 .../controller/oa/BpmOALeaveController.java | 0 .../controller/oa/vo/BpmOALeaveBaseVO.java | 0 .../oa/vo/BpmOALeaveCreateReqVO.java | 0 .../controller/oa/vo/BpmOALeavePageReqVO.java | 0 .../controller/oa/vo/BpmOALeaveRespVO.java | 0 .../task/BpmActivityController.java | 0 .../task/BpmProcessInstanceController.http | 0 .../task/BpmProcessInstanceController.java | 0 .../controller/task/BpmTaskController.http | 0 .../controller/task/BpmTaskController.java | 0 .../task/vo/activity/BpmActivityRespVO.java | 0 .../BpmProcessInstanceCancelReqVO.java | 0 .../BpmProcessInstanceCreateReqVO.java | 0 .../BpmProcessInstanceMyPageReqVO.java | 0 .../BpmProcessInstancePageItemRespVO.java | 0 .../vo/instance/BpmProcessInstanceRespVO.java | 0 .../task/vo/task/BpmTaskApproveReqVO.java | 0 .../vo/task/BpmTaskDonePageItemRespVO.java | 0 .../task/vo/task/BpmTaskDonePageReqVO.java | 0 .../task/vo/task/BpmTaskRejectReqVO.java | 0 .../task/vo/task/BpmTaskRespVO.java | 0 .../vo/task/BpmTaskTodoPageItemRespVO.java | 0 .../task/vo/task/BpmTaskTodoPageReqVO.java | 0 .../vo/task/BpmTaskUpdateAssigneeReqVO.java | 0 .../convert/definition/BpmModelConvert.java | 0 .../BpmProcessDefinitionConvert.java | 0 .../definition/BpmTaskAssignRuleConvert.java | 0 .../convert/message/BpmMessageConvert.java | 0 .../bpm/convert/oa/BpmOALeaveConvert.java | 0 .../modules/bpm/convert/package-info.java | 0 .../bpm/convert/task/BpmActivityConvert.java | 0 .../task/BpmProcessInstanceConvert.java | 0 .../bpm/convert/task/BpmTaskConvert.java | 0 ...g Boot 对象转换 MapStruct 入门》.md | 0 .../definition/BpmProcessDefinitionExtDO.java | 0 .../definition/BpmTaskAssignRuleDO.java | 0 .../definition/BpmTaskMessageRuleDO.java | 0 .../dal/dataobject/leave/BpmOALeaveDO.java | 0 .../task/BpmProcessInstanceExtDO.java | 0 .../bpm/dal/dataobject/task/BpmTaskExtDO.java | 0 .../BpmProcessDefinitionExtMapper.java | 0 .../definition/BpmTaskAssignRuleMapper.java | 0 .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 0 .../task/BpmProcessInstanceExtMapper.java | 0 .../bpm/dal/mysql/task/BpmTaskExtMapper.java | 0 .../bpm/enums/BpmErrorCodeConstants.java | 0 .../definition/BpmModelFormTypeEnum.java | 0 .../definition/BpmTaskAssignRuleTypeEnum.java | 0 .../definition/BpmTaskRuleScriptEnum.java | 0 .../bpm/enums/message/BpmMessageEnum.java | 0 .../BpmProcessInstanceDeleteReasonEnum.java | 0 .../task/BpmProcessInstanceResultEnum.java | 0 .../task/BpmProcessInstanceStatusEnum.java | 0 .../config/BpmActivitiConfiguration.java | 0 .../behavior/BpmActivityBehaviorFactory.java | 0 .../behavior/BpmUserTaskActivitiBehavior.java | 0 .../activiti/core/behavior/package-info.java | 0 .../behavior/script/BpmTaskAssignScript.java | 0 .../BpmTaskAssignLeaderAbstractScript.java | 0 .../impl/BpmTaskAssignLeaderX1Script.java | 0 .../impl/BpmTaskAssignLeaderX2Script.java | 0 .../impl/BpmTaskAssignStartUserScript.java | 0 .../event/BpmProcessInstanceResultEvent.java | 0 ...BpmProcessInstanceResultEventListener.java | 0 ...pmProcessInstanceResultEventPublisher.java | 0 .../activiti/core/event/package-info.java | 0 .../core/identity/EmptyUserGroupManager.java | 0 .../BpmProcessInstanceEventListener.java | 0 .../BpmTackActivitiEventListener.java | 0 .../core/listener/BpmTaskEventListener.java | 0 .../activiti/core/listener/package-info.java | 0 .../modules/bpm/framework/package-info.java | 0 .../adminserver/modules/bpm/package-info.java | 0 .../service/definition/BpmModelService.java | 0 .../BpmProcessDefinitionService.java | 0 .../definition/BpmTaskAssignRuleService.java | 0 .../dto/BpmModelMetaInfoRespDTO.java | 0 .../dto/BpmProcessDefinitionCreateReqDTO.java | 0 .../definition/impl/BpmModelServiceImpl.java | 0 .../impl/BpmProcessDefinitionServiceImpl.java | 0 .../impl/BpmTaskAssignRuleServiceImpl.java | 0 .../service/message/BpmMessageService.java | 0 ...eSendWhenProcessInstanceApproveReqDTO.java | 0 ...geSendWhenProcessInstanceRejectReqDTO.java | 0 .../BpmMessageSendWhenTaskCreatedReqDTO.java | 0 .../message/impl/BpmMessageServiceImpl.java | 0 .../bpm/service/oa/BpmOALeaveService.java | 0 .../oa/impl/BpmOALeaveServiceImpl.java | 0 .../oa/listener/BpmOALeaveResultListener.java | 0 .../bpm/service/task/BpmActivityService.java | 0 .../task/BpmProcessInstanceService.java | 0 .../bpm/service/task/BpmTaskService.java | 0 .../dto/BpmProcessInstanceCreateReqDTO.java | 0 .../task/impl/BpmActivityServiceImpl.java | 0 .../impl/BpmProcessInstanceServiceImpl.java | 0 .../service/task/impl/BpmTaskServiceImpl.java | 0 .../bpm/service/task/package-info.java | 0 .../yudao/adminserver/BaseDbUnitTest.java | 0 .../BpmUserTaskActivitiBehaviorTest.java | 0 .../impl/BpmTaskAssignLeaderX2ScriptTest.java | 0 .../modules/bpm/service/package-info.java | 0 .../test/resources/application-unit-test.yaml | 0 .../src/test/resources/application.yaml | 0 .../src/test/resources/logback-spring.xml | 0 .../src/test/resources/sql/clean.sql | 0 .../src/test/resources/sql/create_tables.sql | 0 .../pom.xml | 13 +++++++-- yudao-module-infra/pom.xml | 10 +++---- .../yudao-module-infra-impl/pom.xml | 2 +- 179 files changed, 91 insertions(+), 103 deletions(-) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-api => yudao-module-bpm-api}/pom.xml (68%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-api => yudao-module-bpm-api}/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-api => yudao-module-bpm-api}/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-api => yudao-module-bpm-api}/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-api => yudao-module-bpm-api}/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/pom.xml (70%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java (95%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-base}/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-base}/src/test/resources/application-unit-test.yaml (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-base}/src/test/resources/application.yaml (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-base}/src/test/resources/logback-spring.xml (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/test/resources/sql/clean.sql (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-base}/src/test/resources/sql/create_tables.sql (100%) delete mode 100644 yudao-module-bpm/yudao-module-bpm-core-service/pom.xml rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/pom.xml (74%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-impl-activiti}/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-impl-activiti}/src/test/resources/application-unit-test.yaml (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-impl-activiti}/src/test/resources/application.yaml (100%) rename yudao-module-bpm/{yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl => yudao-module-bpm-impl-activiti}/src/test/resources/logback-spring.xml (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/test/resources/sql/clean.sql (100%) rename yudao-module-bpm/{yudao-module-bpm-activiti => yudao-module-bpm-impl-activiti}/src/test/resources/sql/create_tables.sql (100%) rename yudao-module-bpm/{yudao-module-bpm-flowable => yudao-module-bpm-impl-flowable}/pom.xml (77%) diff --git a/pom.xml b/pom.xml index dac70439b1..7d3924183c 100644 --- a/pom.xml +++ b/pom.xml @@ -12,10 +12,10 @@ yudao-framework yudao-admin-server - yudao-user-server + yudao-module-member - + yudao-module-bpm yudao-module-system yudao-module-infra yudao-module-tool diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 4eaef38c2a..eb52218684 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -43,39 +43,26 @@ ${revision} - + cn.iocoder.boot - yudao-core-service + yudao-module-bpm-activiti + ${revision} - - cn.iocoder.boot - yudao-spring-boot-starter-biz-operatelog - + + cn.iocoder.boot yudao-spring-boot-starter-biz-dict - - cn.iocoder.boot - yudao-spring-boot-starter-biz-sms - + cn.iocoder.boot yudao-spring-boot-starter-biz-tenant - - - - - - - - - - + diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index e241cb87a7..6d5348553a 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -408,26 +408,6 @@ flowable-spring-boot-starter-actuator ${flowable.version} - - cn.iocoder.boot - yudao-module-bpm-core-service-impl - ${revision} - - - cn.iocoder.boot - yudao-module-bpm-core-service-api - ${revision} - - - cn.iocoder.boot - yudao-module-bpm-activiti - ${revision} - - - cn.iocoder.boot - yudao-module-bpm-flowable - ${revision} - diff --git a/yudao-module-bpm/pom.xml b/yudao-module-bpm/pom.xml index 4924978759..4dee14b6f7 100644 --- a/yudao-module-bpm/pom.xml +++ b/yudao-module-bpm/pom.xml @@ -7,12 +7,26 @@ cn.iocoder.boot ${revision} - pom - - yudao-module-bpm-flowable - yudao-module-bpm-activiti - yudao-module-bpm-core-service - 4.0.0 + + yudao-module-bpm-api + yudao-module-bpm-base + yudao-module-bpm-impl-flowable + yudao-module-bpm-impl-activiti + yudao-module-bpm - \ No newline at end of file + pom + + ${artifactId} + + bpm 包下,业务流程管理(Business Process Management),我们放工作流的功能。 + 例如说:流程定义、表单配置、审核中心(我的申请、我的待办、我的已办)等等 + bpm 解释:https://baike.baidu.com/item/BPM/1933 + + 目前提供两套实现方案: + 1. 基于 Activiti 7 实现的 yudao-module-bpm-impl-activiti + 2. 基于 Flowable 6 实现的 yudao-module-bpm-impl-flowable + 两套实现会存在共享的逻辑,所以会继承 yudao-module-impl-base + + + diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml b/yudao-module-bpm/yudao-module-bpm-api/pom.xml similarity index 68% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml rename to yudao-module-bpm/yudao-module-bpm-api/pom.xml index c488c22966..60ebd556c3 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-api/pom.xml @@ -3,22 +3,24 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - yudao-module-bpm-core-service cn.iocoder.boot + yudao-module-bpm ${revision} 4.0.0 + yudao-module-bpm-api + jar - yudao-module-bpm-core-service-api + ${artifactId} + + bpm 模块 API,暴露给其它模块调用 + - - org.projectlombok - lombok - cn.iocoder.boot yudao-common - \ No newline at end of file + + diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/pom.xml b/yudao-module-bpm/yudao-module-bpm-base/pom.xml similarity index 70% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/pom.xml rename to yudao-module-bpm/yudao-module-bpm-base/pom.xml index 1712458f63..5b839de9e0 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-base/pom.xml @@ -3,33 +3,46 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - yudao-module-bpm-core-service cn.iocoder.boot + yudao-module-bpm ${revision} 4.0.0 + yudao-module-bpm-base + + ${artifactId} + + bpm-base 模块,实现公用的工作流的逻辑,提供给 bpm-activiti 和 bpm-flowable 复用 + - yudao-module-bpm-core-service-impl + + cn.iocoder.boot + yudao-module-bpm-api + ${revision} + + + cn.iocoder.boot yudao-spring-boot-starter-web + cn.iocoder.boot yudao-spring-boot-starter-security + + cn.iocoder.boot yudao-spring-boot-starter-mybatis - - cn.iocoder.boot - yudao-module-bpm-core-service-api - + + cn.iocoder.boot yudao-spring-boot-starter-test - \ No newline at end of file + diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java index f57c80c94e..799817ad8c 100644 --- a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form; +import com.sun.istack.internal.NotNull; import lombok.*; import io.swagger.annotations.*; import javax.validation.constraints.*; diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java rename to yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java rename to yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java rename to yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application-unit-test.yaml b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/application-unit-test.yaml similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application-unit-test.yaml rename to yudao-module-bpm/yudao-module-bpm-base/src/test/resources/application-unit-test.yaml diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application.yaml b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/application.yaml similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application.yaml rename to yudao-module-bpm/yudao-module-bpm-base/src/test/resources/application.yaml diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/logback-spring.xml b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/logback-spring.xml similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/logback-spring.xml rename to yudao-module-bpm/yudao-module-bpm-base/src/test/resources/logback-spring.xml diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/clean.sql similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/clean.sql rename to yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/clean.sql diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/create_tables.sql similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/sql/create_tables.sql rename to yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/create_tables.sql diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml b/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml deleted file mode 100644 index aa81886dbc..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-core-service/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - yudao-module-bpm - cn.iocoder.boot - ${revision} - - 4.0.0 - pom - - yudao-module-bpm-core-service-api - yudao-module-bpm-core-service-impl - - yudao-module-bpm-core-service - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml b/yudao-module-bpm/yudao-module-bpm-impl-activiti/pom.xml similarity index 74% rename from yudao-module-bpm/yudao-module-bpm-activiti/pom.xml rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/pom.xml index a131ab0890..d130d12f7e 100644 --- a/yudao-module-bpm/yudao-module-bpm-activiti/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/pom.xml @@ -3,26 +3,31 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - yudao-module-bpm cn.iocoder.boot + yudao-module-bpm ${revision} 4.0.0 + yudao-module-bpm-impl-activiti + + ${artifactId} + + bpm-activiti 模块,基于 Activiti 7 实现工作流 + - yudao-module-bpm-activiti + + cn.iocoder.boot + yudao-module-bpm-base + ${revision} + + + cn.iocoder.boot yudao-spring-boot-starter-activiti - - cn.iocoder.boot - yudao-core-service - - - cn.iocoder.boot - yudao-module-bpm-core-service-api - + cn.iocoder.boot @@ -30,4 +35,4 @@ test - \ No newline at end of file + diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application-unit-test.yaml b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application-unit-test.yaml similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application-unit-test.yaml rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application-unit-test.yaml diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application.yaml b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application.yaml similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/application.yaml rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application.yaml diff --git a/yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/logback-spring.xml b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/logback-spring.xml similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-core-service/yudao-module-bpm-core-service-impl/src/test/resources/logback-spring.xml rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/logback-spring.xml diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/sql/clean.sql similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/sql/clean.sql diff --git a/yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/sql/create_tables.sql similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/sql/create_tables.sql diff --git a/yudao-module-bpm/yudao-module-bpm-flowable/pom.xml b/yudao-module-bpm/yudao-module-bpm-impl-flowable/pom.xml similarity index 77% rename from yudao-module-bpm/yudao-module-bpm-flowable/pom.xml rename to yudao-module-bpm/yudao-module-bpm-impl-flowable/pom.xml index e56fc0ffe5..6c83994edc 100644 --- a/yudao-module-bpm/yudao-module-bpm-flowable/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-impl-flowable/pom.xml @@ -3,13 +3,20 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - yudao-module-bpm cn.iocoder.boot + yudao-module-bpm ${revision} 4.0.0 - yudao-module-bpm-flowable + yudao-module-bpm-impl-flowable + + ${artifactId} + + bpm-flowable 模块,基于 Flowable 6 实现工作流 + + + org.flowable flowable-spring-boot-starter-basic @@ -20,4 +27,4 @@ - \ No newline at end of file + diff --git a/yudao-module-infra/pom.xml b/yudao-module-infra/pom.xml index 4b524edcc4..49376974e2 100644 --- a/yudao-module-infra/pom.xml +++ b/yudao-module-infra/pom.xml @@ -8,7 +8,10 @@ ${revision} 4.0.0 - + + yudao-module-infra-api + yudao-module-infra-impl + yudao-module-infra pom @@ -17,10 +20,5 @@ infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 - - yudao-module-infra-api - yudao-module-infra-impl - - diff --git a/yudao-module-infra/yudao-module-infra-impl/pom.xml b/yudao-module-infra/yudao-module-infra-impl/pom.xml index 69dbc4ec4b..a26b274f3c 100644 --- a/yudao-module-infra/yudao-module-infra-impl/pom.xml +++ b/yudao-module-infra/yudao-module-infra-impl/pom.xml @@ -13,7 +13,7 @@ ${artifactId} - infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 + infra 模块,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 From fe1271a6f7eaeb37fb36c6153af33add81e092e0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 31 Jan 2022 23:29:25 +0800 Subject: [PATCH 26/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=208=EF=BC=9Abom=20=E6=A8=A1=E5=9D=97=EF=BC=8C?= =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=85=AC=E7=94=A8=E9=83=A8=E5=88=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/api/form/BpmFormServiceApi.java | 46 -------------- .../modules/bpm/api/form/dto/BpmFormDTO.java | 39 ------------ .../bpm/api/group/BpmUserGroupServiceApi.java | 33 ---------- .../bpm/api/group/dto/BpmUserGroupDTO.java | 17 ----- .../yudao/module/bpm/api/package-info.java | 4 ++ .../module/bpm/enums/ErrorCodeConstants.java} | 5 +- .../bpm/api/BpmFormServiceApiImpl.java | 33 ---------- .../bpm/api/BpmUserGroupServiceApiImpl.java | 62 ------------------- .../bpm/enums/BpmErrorCodeConstants.java | 13 ---- .../definition/BpmUserGroupController.java | 16 ++--- .../definition/FormController.java} | 12 ++-- .../definition/vo/form/BpmFormBaseVO.java | 2 +- .../vo/form/BpmFormCreateReqVO.java | 2 +- .../definition/vo/form/BpmFormPageReqVO.java | 2 +- .../definition/vo/form/BpmFormRespVO.java | 2 +- .../vo/form/BpmFormSimpleRespVO.java | 2 +- .../vo/form/BpmFormUpdateReqVO.java | 2 +- .../vo/group/BpmUserGroupBaseVO.java | 2 +- .../vo/group/BpmUserGroupCreateReqVO.java | 4 +- .../vo/group/BpmUserGroupPageReqVO.java | 2 +- .../vo/group/BpmUserGroupRespVO.java | 2 +- .../vo/group/BpmUserGroupSimpleRespVO.java | 2 +- .../vo/group/BpmUserGroupUpdateReqVO.java | 3 +- .../vo/model/BpmModeImportReqVO.java | 2 +- .../definition/vo/model/BpmModelBaseVO.java | 2 +- .../vo/model/BpmModelCreateReqVO.java | 2 +- .../vo/model/BpmModelPageItemRespVO.java | 2 +- .../definition/vo/model/BpmModelRespVO.java | 2 +- .../vo/model/BpmModelUpdateReqVO.java | 2 +- .../vo/model/BpmModelUpdateStateReqVO.java | 2 +- .../definition/vo/model/ModelPageReqVO.java | 2 +- .../BpmProcessDefinitionListReqVO.java | 2 +- .../BpmProcessDefinitionPageItemRespVO.java | 2 +- .../BpmProcessDefinitionPageReqVO.java | 2 +- .../process/BpmProcessDefinitionRespVO.java | 2 +- .../vo/rule/BpmTaskAssignRuleBaseVO.java | 2 +- .../vo/rule/BpmTaskAssignRuleCreateReqVO.java | 2 +- .../vo/rule/BpmTaskAssignRuleRespVO.java | 2 +- .../vo/rule/BpmTaskAssignRuleUpdateReqVO.java | 3 +- .../bpm/controller/oa/package-info.java | 1 + .../bpm/controller/task/package-info.java | 1 + .../convert/definition/BpmFormConvert.java | 14 ++--- .../definition/BpmUserGroupConvert.java | 12 ++-- .../dal/dataobject/definition/BpmFormDO.java | 2 +- .../definition/BpmProcessDefinitionExtDO.java | 3 +- .../definition/BpmTaskAssignRuleDO.java | 2 +- .../definition/BpmTaskMessageRuleDO.java | 2 +- .../dataobject/definition/BpmUserGroupDO.java | 2 +- .../bpm/dal/dataobject/oa}/BpmOALeaveDO.java | 2 +- .../task/BpmProcessInstanceExtDO.java | 2 +- .../bpm/dal/dataobject/task/BpmTaskExtDO.java | 2 +- .../dal/mysql/definition/BpmFormMapper.java | 6 +- .../mysql/definition/BpmUserGroupMapper.java | 6 +- .../definition/BpmModelFormTypeEnum.java | 2 +- .../definition/BpmTaskAssignRuleTypeEnum.java | 2 +- .../definition/BpmTaskRuleScriptEnum.java | 2 +- .../bpm/enums/message/BpmMessageEnum.java | 2 +- .../BpmProcessInstanceDeleteReasonEnum.java | 2 +- .../task/BpmProcessInstanceResultEnum.java | 2 +- .../task/BpmProcessInstanceStatusEnum.java | 2 +- .../yudao/module/bpm/package-info.java | 1 + .../service/definition/BpmFormService.java | 10 +-- .../definition}/BpmFormServiceImpl.java | 23 ++++--- .../definition/BpmUserGroupService.java | 19 ++++-- .../definition}/BpmUserGroupServiceImpl.java | 39 ++++++++---- .../definition/dto/BpmFormFieldRespDTO.java | 2 +- .../service/message/BpmMessageService.java | 8 +-- .../message}/BpmMessageServiceImpl.java | 10 +-- ...eSendWhenProcessInstanceApproveReqDTO.java | 2 +- ...geSendWhenProcessInstanceRejectReqDTO.java | 2 +- .../BpmMessageSendWhenTaskCreatedReqDTO.java | 2 +- .../definition/BpmFormServiceTest.java | 16 ++--- .../definition/BpmUserGroupServiceTest.java | 14 ++--- .../definition/BpmModelController.java | 1 + .../BpmProcessDefinitionController.java | 8 +-- .../BpmTaskAssignRuleController.java | 6 +- .../controller/oa/BpmOALeaveController.java | 2 +- .../convert/definition/BpmModelConvert.java | 3 +- .../BpmProcessDefinitionConvert.java | 8 +-- .../definition/BpmTaskAssignRuleConvert.java | 10 ++- .../convert/message/BpmMessageConvert.java | 6 +- .../bpm/convert/oa/BpmOALeaveConvert.java | 2 +- .../bpm/convert/task/BpmActivityConvert.java | 3 - .../task/BpmProcessInstanceConvert.java | 4 +- .../bpm/convert/task/BpmTaskConvert.java | 2 +- .../BpmProcessDefinitionExtMapper.java | 4 +- .../definition/BpmTaskAssignRuleMapper.java | 2 +- .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 2 +- .../task/BpmProcessInstanceExtMapper.java | 2 +- .../bpm/dal/mysql/task/BpmTaskExtMapper.java | 2 +- .../config/BpmActivitiConfiguration.java | 2 +- .../behavior/BpmActivityBehaviorFactory.java | 2 +- .../behavior/BpmUserTaskActivitiBehavior.java | 12 ++-- .../activiti/core/behavior/package-info.java | 2 +- .../behavior/script/BpmTaskAssignScript.java | 3 +- .../impl/BpmTaskAssignLeaderX1Script.java | 2 +- .../impl/BpmTaskAssignLeaderX2Script.java | 2 +- .../impl/BpmTaskAssignStartUserScript.java | 2 +- .../event/BpmProcessInstanceResultEvent.java | 2 +- .../BpmProcessInstanceEventListener.java | 4 +- .../core/listener/BpmTaskEventListener.java | 5 +- .../activiti/core/listener/package-info.java | 2 +- .../service/definition/BpmModelService.java | 2 +- .../BpmProcessDefinitionService.java | 10 +-- .../definition/BpmTaskAssignRuleService.java | 9 ++- .../dto/BpmModelMetaInfoRespDTO.java | 2 +- .../dto/BpmProcessDefinitionCreateReqDTO.java | 2 +- .../definition/impl/BpmModelServiceImpl.java | 11 ++-- .../impl/BpmProcessDefinitionServiceImpl.java | 18 +++--- .../impl/BpmTaskAssignRuleServiceImpl.java | 13 ++-- .../bpm/service/oa/BpmOALeaveService.java | 2 +- .../oa/impl/BpmOALeaveServiceImpl.java | 5 +- .../task/BpmProcessInstanceService.java | 3 +- .../bpm/service/task/BpmTaskService.java | 2 +- .../task/impl/BpmActivityServiceImpl.java | 6 -- .../impl/BpmProcessInstanceServiceImpl.java | 13 ++-- .../service/task/impl/BpmTaskServiceImpl.java | 7 +-- .../BpmUserTaskActivitiBehaviorTest.java | 10 +-- 118 files changed, 273 insertions(+), 508 deletions(-) delete mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java => yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java} (97%) delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/BpmUserGroupController.java (81%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller/definition/BpmFormController.java => module/bpm/controller/definition/FormController.java} (86%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/form/BpmFormBaseVO.java (90%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java (89%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/form/BpmFormPageReqVO.java (85%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/form/BpmFormRespVO.java (92%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java (83%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java (90%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java (92%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java (62%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java (92%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java (84%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java (86%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java (80%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/model/BpmModeImportReqVO.java (89%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/model/BpmModelBaseVO.java (95%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java (90%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java (94%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/model/BpmModelRespVO.java (88%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java (95%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java (87%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/model/ModelPageReqVO.java (90%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java (86%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java (87%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java (86%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java (96%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java (90%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java (90%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java (92%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java (85%) create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/package-info.java create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/package-info.java rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/definition/BpmFormConvert.java (53%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/definition/BpmUserGroupConvert.java (61%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/dal/dataobject/definition/BpmFormDO.java (94%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java (94%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java (97%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java (62%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/dal/dataobject/definition/BpmUserGroupDO.java (93%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa}/BpmOALeaveDO.java (95%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java (97%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/dataobject/task/BpmTaskExtDO.java (96%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/dal/mysql/definition/BpmFormMapper.java (70%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/dal/mysql/definition/BpmUserGroupMapper.java (79%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/enums/definition/BpmModelFormTypeEnum.java (85%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java (90%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/enums/definition/BpmTaskRuleScriptEnum.java (89%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/enums/message/BpmMessageEnum.java (91%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java (92%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/enums/task/BpmProcessInstanceResultEnum.java (87%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/enums/task/BpmProcessInstanceStatusEnum.java (86%) create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmFormService.java (80%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/service/definition/impl => module/bpm/service/definition}/BpmFormServiceImpl.java (71%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmUserGroupService.java (64%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/service/definition/impl => module/bpm/service/definition}/BpmUserGroupServiceImpl.java (61%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/dto/BpmFormFieldRespDTO.java (86%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/service/message/BpmMessageService.java (69%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message}/BpmMessageServiceImpl.java (84%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java (89%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java (91%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java (93%) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java deleted file mode 100644 index f8f66a7d92..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/BpmFormServiceApi.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.bpm.api.form; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -/** - * Bpm 动态表单 Service API 接口 - * - * @author @风里雾里 - */ -public interface BpmFormServiceApi { - /** - * 获得动态表单 - * - * @param id 编号 - * @return 动态表单 - */ - BpmFormDTO getForm(Long id); - - /** - * 获得动态表单列表 - * - * @param ids 编号 - * @return 动态表单列表 - */ - List getFormList(Collection ids); - - /** - * 获得动态表单 Map - * - * @param ids 编号 - * @return 动态表单 Map - */ - default Map getFormMap(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyMap(); - } - return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDTO::getId); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java deleted file mode 100644 index 0a5c0f94a5..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/form/dto/BpmFormDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto; - -import lombok.Data; - -import java.util.List; - -/** - * 工作流的表单定义 DTO - * 用于工作流的申请表单,需要动态配置的场景 - * TODO 暂时拷贝 BpmFormDO 字段, 不知道那些字段是必须的, 后续删掉不需要的字段 - * @author jason - */ -@Data -public class BpmFormDTO { - - /** - * 编号 - */ - private Long id; - /** - * 表单名 - */ - private String name; - /** - * 表单的配置 - */ - private String conf; - /** - * 表单项的数组 - * - * 目前直接将 https://github.com/JakHuang/form-generator 生成的 JSON 串,直接保存 - * 定义:https://github.com/JakHuang/form-generator/issues/46 - */ - private List fields; - /** - * 备注 - */ - private String remark; -} diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java deleted file mode 100644 index 796dbd4dfd..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/BpmUserGroupServiceApi.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.bpm.api.group; - -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -/** - * Bpm 用户组 API 接口 - * - * @author 芋道源码 - * @author jason - */ -public interface BpmUserGroupServiceApi { - - /** - * 获得用户组列表 - * - * @param ids 编号 - * @return 用户组列表 - */ - List getUserGroupList(Collection ids); - - /** - * 校验用户组们是否有效。如下情况,视为无效: - * 1. 用户组编号不存在 - * 2. 用户组被禁用 - * - * @param ids 用户组编号数组 - */ - void validUserGroups(Set ids); -} diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java deleted file mode 100644 index b85042527a..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/coreservice/modules/bpm/api/group/dto/BpmUserGroupDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto; - -import lombok.Data; - -import java.util.Set; -/** - * Bpm 用户组 DTO - * - * @author jason - */ -@Data -public class BpmUserGroupDTO { - /** - * 成员用户编号数组 - */ - private Set memberUserIds; -} diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java new file mode 100644 index 0000000000..37a92219f9 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java @@ -0,0 +1,4 @@ +/** + * bpm API 包,定义暴露给其它模块的 API + */ +package cn.iocoder.yudao.module.bpm.api; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java index 66fc20b8f9..74281aaac2 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums; +package cn.iocoder.yudao.module.bpm.enums; import cn.iocoder.yudao.framework.common.exception.ErrorCode; @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; * * 工作流系统,使用 1-009-000-000 段 */ -public interface BpmErrorCodeConstants { +public interface ErrorCodeConstants { // ========== 通用流程处理 模块 1-009-000-000 ========== ErrorCode HIGHLIGHT_IMG_ERROR = new ErrorCode(1009000002, "获取高亮流程图异常"); @@ -55,4 +55,5 @@ public interface BpmErrorCodeConstants { // ========== 动态表单模块 1-009-010-000 ========== ErrorCode FORM_NOT_EXISTS = new ErrorCode(1009010000, "动态表单不存在"); + } diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java deleted file mode 100644 index 104445275d..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmFormServiceApiImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.api; - -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmFormConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.BpmFormServiceApi; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; -/** - * 动态表单 Api Service 实现类 - * - * @author 风里雾里 - * @author jason - */ -@Service -public class BpmFormServiceApiImpl implements BpmFormServiceApi { - - @Resource - private BpmFormMapper formMapper; - - @Override - public BpmFormDTO getForm(Long id) { - return BpmFormConvert.INSTANCE.convert1(formMapper.selectById(id)); - } - - @Override - public List getFormList(Collection ids) { - return BpmFormConvert.INSTANCE.convertList(formMapper.selectBatchIds(ids)); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java deleted file mode 100644 index 2b9ad5a6da..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/api/BpmUserGroupServiceApiImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.api; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmUserGroupConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_IS_DISABLE; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * Bpm 用户组 API 接口 实现类 - * - * @author 芋道源码 - * @author jason - */ -@Service -public class BpmUserGroupServiceApiImpl implements BpmUserGroupServiceApi { - - @Resource - private BpmUserGroupMapper userGroupMapper; - - @Override - public List getUserGroupList(Collection ids) { - return BpmUserGroupConvert.INSTANCE.convertList3(userGroupMapper.selectBatchIds(ids)); - } - - - @Override - public void validUserGroups(Set ids) { - - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得用户组信息 - List userGroups = userGroupMapper.selectBatchIds(ids); - Map userGroupMap = CollectionUtils.convertMap(userGroups, BpmUserGroupDO::getId); - // 校验 - ids.forEach(id -> { - BpmUserGroupDO userGroup = userGroupMap.get(id); - if (userGroup == null) { - throw ServiceExceptionUtil.exception(USER_GROUP_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { - throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); - } - }); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java deleted file mode 100644 index 531f7fac4c..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; - -public interface BpmErrorCodeConstants { - // ========== 用户组模块 1-009-011-000 ========== - ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1009011000, "用户组不存在"); - ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1009011001, "名字为【{}】的用户组已被禁用"); - - // ========== 动态表单模块 1-009-010-000 ========== - ErrorCode FORM_NOT_EXISTS = new ErrorCode(1009010000, "动态表单不存在"); - ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1009010000, "表单项({}) 和 ({}) 使用了相同的字段名({})"); -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/BpmUserGroupController.java similarity index 81% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/BpmUserGroupController.java index ea5fafd8e0..1051a78f54 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmUserGroupController.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/BpmUserGroupController.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition; +package cn.iocoder.yudao.module.bpm.controller.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmUserGroupConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.convert.definition.BpmUserGroupConvert; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/FormController.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/FormController.java index cb22db3427..34b712ff25 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmFormController.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/FormController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition; +package cn.iocoder.yudao.module.bpm.controller.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.*; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmFormConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmFormService; +import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @RestController @RequestMapping("/bpm/form") @Validated -public class BpmFormController { +public class FormController { @Resource private BpmFormService formService; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java index 799817ad8c..6a518b86ac 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; import com.sun.istack.internal.NotNull; import lombok.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java index 70da000627..7068015830 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java similarity index 85% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java index 6001b59ff1..5576f80d6e 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormRespVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormRespVO.java index 89c2eb9303..6aef371f5e 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java similarity index 83% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java index 4459bf6abb..8c622d68f2 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java index 1ca527ac10..c81df497e2 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java index 9914260d37..f18b8520d1 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; import lombok.*; import java.util.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java similarity index 62% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java index 44114ac144..deb647da6a 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java @@ -1,9 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; import lombok.*; -import java.util.*; import io.swagger.annotations.*; -import javax.validation.constraints.*; @ApiModel("用户组创建 Request VO") @Data diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java index 303a3491ea..e8f0766699 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.date.DateUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java similarity index 84% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java index 523bb60a3b..72f83b97cc 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; import lombok.*; import java.util.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java index fb427d0f68..09d760addf 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java similarity index 80% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java index 00a32bdac6..f9760d550c 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java @@ -1,7 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; import lombok.*; -import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java index 18b9b5b6fb..bd04d71272 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModeImportReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java index 7246a272d1..04bf6c7101 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java index 4a3c19e4fe..62923dca7c 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java index af498d8270..4ad529eadb 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelRespVO.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelRespVO.java index a448e620be..438ae3af11 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java index 8cac65ae95..2159d66c0f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java index 1536e9042b..7604c98ab7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/ModelPageReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/ModelPageReqVO.java index 70b2b2ff33..5511b3726d 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/model/ModelPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/ModelPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java index dae4a9b503..f19d75c474 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.process; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java index 967aac8d40..414377af54 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.process; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java index 70fa41d8f0..93bf0b738e 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.process; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java similarity index 96% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java index 4e0f518645..450c67d751 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.process; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java index 935c9b4108..9db2c9bca7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.rule; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java index b29bc0b2f8..6d4937f9c8 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.rule; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java index d9c36aad96..d718cb6f50 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.rule; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java similarity index 85% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java index 48388a9447..cedceb2a36 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule; +package cn.iocoder.yudao.module.bpm.controller.definition.vo.rule; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,7 +7,6 @@ import lombok.EqualsAndHashCode; import lombok.ToString; import javax.validation.constraints.NotNull; -import java.util.Set; @ApiModel("流程任务分配规则的更新 Request VO") @Data diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/package-info.java new file mode 100644 index 0000000000..2fe59f5721 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.bpm.controller.oa; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/package-info.java new file mode 100644 index 0000000000..8be8f21c57 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.bpm.controller.task; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java similarity index 53% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java index 7dc2dfabf7..9281cc4ab1 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmFormConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; +package cn.iocoder.yudao.module.bpm.convert.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormSimpleRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormSimpleRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java similarity index 61% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java index 7f7e9afc8d..d30860ef19 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmUserGroupConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; +package cn.iocoder.yudao.module.bpm.convert.definition; import java.util.*; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.module.bpm.api.group.dto.BpmUserGroupDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmFormDO.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmFormDO.java index 2c23b8dcc8..76bf777e5d 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmFormDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmFormDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition; +package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java index 007ad43f34..e9f8997f87 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java @@ -1,7 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition; +package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java index 08b80c4a94..44950c8175 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition; +package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java similarity index 62% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java index 04f357931f..db204c0273 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition; +package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; // TODO 芋艿:先埋个坑。任务消息的配置规则。说白了,就是不同的 public class BpmTaskMessageRuleDO { diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java index d433c65f6d..ec11681805 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmUserGroupDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition; +package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java index f5ce1a91e7..6cad3fcae2 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/BpmOALeaveDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave; +package cn.iocoder.yudao.module.bpm.dal.dataobject.oa; import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import lombok.*; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java index 8618387497..ddeed4e970 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task; +package cn.iocoder.yudao.module.bpm.dal.dataobject.task; import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java similarity index 96% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java index e3b31ec33a..3fb4f5aa8d 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmTaskExtDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task; +package cn.iocoder.yudao.module.bpm.dal.dataobject.task; import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java similarity index 70% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java index f4b052877c..34c554d414 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmFormMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition; +package cn.iocoder.yudao.module.bpm.dal.mysql.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java similarity index 79% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java index f524fef69c..681e7b92e9 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmUserGroupMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition; +package cn.iocoder.yudao.module.bpm.dal.mysql.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java similarity index 85% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java index 917ec0f29c..c21d6f9991 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums.definition; +package cn.iocoder.yudao.module.bpm.enums.definition; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java index 8b3d8e48fa..de3c351620 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums.definition; +package cn.iocoder.yudao.module.bpm.enums.definition; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java index 571d37f871..7fc0e3b8bc 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleScriptEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums.definition; +package cn.iocoder.yudao.module.bpm.enums.definition; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java index e95764a795..7462570c21 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums.message; +package cn.iocoder.yudao.module.bpm.enums.message; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import lombok.AllArgsConstructor; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java index 65b2e953bb..e41930bb8f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums.task; +package cn.iocoder.yudao.module.bpm.enums.task; import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java index 01916f51a9..39bf22ada7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums.task; +package cn.iocoder.yudao.module.bpm.enums.task; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java index f7a1b110b4..70a31dd342 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.enums.task; +package cn.iocoder.yudao.module.bpm.enums.task; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java new file mode 100644 index 0000000000..6dab1bf15d --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.bpm; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java similarity index 80% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java index 6b872d4d75..9fb2e80728 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormService.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java similarity index 71% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java index 8bebc39ca9..f2bb6ad7eb 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmFormServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java @@ -1,15 +1,14 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.lang.Assert; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmFormConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmFormService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmFormFieldRespDTO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; +import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -64,7 +63,7 @@ public class BpmFormServiceImpl implements BpmFormService { private void validateFormExists(Long id) { if (formMapper.selectById(id) == null) { - throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.FORM_NOT_EXISTS); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.FORM_NOT_EXISTS); } } @@ -104,7 +103,7 @@ public class BpmFormServiceImpl implements BpmFormService { continue; } // 如果存在,则报错 - throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel()); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel()); } } diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java similarity index 64% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java index 5d848656b5..2280d4a468 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupService.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; import java.util.*; import javax.validation.*; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; /** @@ -61,4 +61,13 @@ public interface BpmUserGroupService { * @return 用户组分页 */ PageResult getUserGroupPage(BpmUserGroupPageReqVO pageReqVO); + + /** + * 校验用户组们是否有效。如下情况,视为无效: + * 1. 用户组编号不存在 + * 2. 用户组被禁用 + * + * @param ids 用户组编号数组 + */ + void validUserGroups(Set ids); } diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java similarity index 61% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java index 7de593cdfe..79c5aeab26 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmUserGroupServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java @@ -1,13 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmUserGroupConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.convert.definition.BpmUserGroupConvert; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -16,13 +15,11 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_IS_DISABLE; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -85,4 +82,24 @@ public class BpmUserGroupServiceImpl implements BpmUserGroupService { return userGroupMapper.selectPage(pageReqVO); } + @Override + public void validUserGroups(Set ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得用户组信息 + List userGroups = userGroupMapper.selectBatchIds(ids); + Map userGroupMap = CollectionUtils.convertMap(userGroups, BpmUserGroupDO::getId); + // 校验 + ids.forEach(id -> { + BpmUserGroupDO userGroup = userGroupMap.get(id); + if (userGroup == null) { + throw ServiceExceptionUtil.exception(USER_GROUP_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { + throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); + } + }); + } + } diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java index 2001974a5d..1606192ce7 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmFormFieldRespDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; +package cn.iocoder.yudao.module.bpm.service.definition.dto; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageService.java similarity index 69% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageService.java index 20a25abe0d..8905893b47 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageService.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.message; +package cn.iocoder.yudao.module.bpm.service.message; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; import javax.validation.Valid; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java similarity index 84% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java index 1c8829876c..c308620f8c 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.message.impl; +package cn.iocoder.yudao.module.bpm.service.message; import cn.iocoder.yudao.adminserver.modules.bpm.enums.message.BpmMessageEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; import cn.iocoder.yudao.module.system.service.sms.SysSmsCoreService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java index ca46631f83..7c37734f97 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto; +package cn.iocoder.yudao.module.bpm.service.message.dto; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java index ae444ad34e..0194d03a5d 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto; +package cn.iocoder.yudao.module.bpm.service.message.dto; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java index 51d3dc8307..7f696d1d3b 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto; +package cn.iocoder.yudao.module.bpm.service.message.dto; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java index 91a88c2b5c..86eac7c4ab 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java @@ -2,13 +2,13 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmFormFieldRespDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmFormServiceImpl; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; +import cn.iocoder.yudao.module.bpm.service.definition.BpmFormServiceImpl; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import org.junit.jupiter.api.Test; @@ -19,7 +19,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_NOT_EXISTS; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.FORM_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java index ff16838167..efd671c065 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java @@ -1,24 +1,24 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmUserGroupServiceImpl; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.test.core.util.AssertUtils; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupServiceImpl; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import javax.annotation.Resource; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; /** diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java index c432f6804b..973c9bdd87 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelServi import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.io.IoUtils; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java index 4e38294c39..cb74221b21 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java index b1f3186fd1..1fbaf3b771 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import io.swagger.annotations.Api; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java index 4f8a394c81..ebf252c1d9 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeaveCreat import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeavePageReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeaveRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.BpmOALeaveConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.BpmOALeaveDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java index c2b2877207..b6327057e8 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java @@ -4,9 +4,10 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; +import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; import org.activiti.engine.impl.persistence.entity.SuspensionState; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.Model; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java index ed85492f29..eba3273f18 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; +import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.engine.impl.persistence.entity.SuspensionState; import org.activiti.engine.repository.Deployment; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java index a0f9528932..2701a1f197 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java @@ -1,10 +1,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.bpmn.model.UserTask; import org.mapstruct.Mapper; @@ -12,7 +11,6 @@ import org.mapstruct.factory.Mappers; import java.util.List; import java.util.Map; -import java.util.function.Function; @Mapper public interface BpmTaskAssignRuleConvert { diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java index 469424e67e..ca84b72a9e 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.message; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import org.activiti.api.task.model.Task; import org.activiti.engine.runtime.ProcessInstance; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java index 8c7c1d8bfc..49c5d8bd12 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.oa; import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeaveRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.BpmOALeaveDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java index b72e28ac64..a9882f9606 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java @@ -1,8 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.activity.BpmActivityRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.engine.history.HistoricActivityInstance; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -10,7 +8,6 @@ import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; import java.util.List; -import java.util.Map; /** * BPM 活动 Convert diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java index cd0839fe00..304894e599 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java index 117d2c1cf8..4e092f8502 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskDonePageItemRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskTodoPageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java index 2a347eee43..eeed00bb60 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java @@ -1,9 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java index 14459c80cf..3879a0f071 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java index 1941744e60..4c47ea8bc9 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa; import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeavePageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.BpmOALeaveDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java index 0fbb455a64..8fdc031dd4 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java index 2ac2995dfb..b89f1a2450 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index 307dd300e2..2802211533 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.Bp import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; +import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java index bc3d956912..d401cfacc7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; +import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java index aa6cb1f131..70d1305029 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java @@ -3,12 +3,12 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; +import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; +import cn.iocoder.yudao.module.bpm.api.group.dto.BpmUserGroupDTO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; @@ -28,8 +28,8 @@ import org.activiti.engine.impl.persistence.entity.TaskEntityManager; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.TASK_ASSIGN_SCRIPT_NOT_EXISTS; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.TASK_CREATE_FAIL_NO_CANDIDATE_USER; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_ASSIGN_SCRIPT_NOT_EXISTS; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_CREATE_FAIL_NO_CANDIDATE_USER; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java index eaf54d5ddb..a67b29bf09 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java @@ -1,5 +1,5 @@ /** - * 拓展 {@link org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior} 实现,基于 {@link cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO} 实现自定义的任务分配规则。 + * 拓展 {@link org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior} 实现,基于 {@link cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO} 实现自定义的任务分配规则。 * 原因:BPMN 默认的 assign、candidateUsers、candidateGroups 拓展起来有一定的难度,所以选择放弃它们,使用自己定义的规则。 * * @author 芋道源码 diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java index b70b1ce722..5e6f43a9a1 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java @@ -1,9 +1,8 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import org.activiti.engine.impl.persistence.entity.TaskEntity; -import java.util.List; import java.util.Set; /** diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java index d29029bb3d..39451903a3 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.springframework.stereotype.Component; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java index 35d7f73568..9fc9c806b7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.springframework.stereotype.Component; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java index 3f7617fdb2..3cf33be59f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; import org.activiti.engine.impl.persistence.entity.TaskEntity; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java index d9f9524a3a..08c43413e0 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import lombok.Data; import org.springframework.context.ApplicationEvent; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java index 90c1f3ef1a..14ba6cf6e7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java @@ -1,14 +1,12 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import org.activiti.api.model.shared.event.RuntimeEvent; import org.activiti.api.process.model.ProcessInstance; import org.activiti.api.process.model.events.ProcessRuntimeEvent; import org.activiti.api.process.runtime.events.ProcessCancelledEvent; -import org.activiti.api.process.runtime.events.listener.ProcessEventListener; import org.activiti.api.process.runtime.events.listener.ProcessRuntimeEventListener; -import org.activiti.api.task.model.events.TaskRuntimeEvent; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java index b03f6b8021..15809c5aea 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java @@ -1,13 +1,10 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; import org.activiti.api.model.shared.event.RuntimeEvent; -import org.activiti.api.process.model.ProcessInstance; -import org.activiti.api.process.model.events.ProcessRuntimeEvent; import org.activiti.api.task.model.Task; import org.activiti.api.task.model.events.TaskRuntimeEvent; -import org.activiti.api.task.runtime.events.listener.TaskEventListener; import org.activiti.api.task.runtime.events.listener.TaskRuntimeEventListener; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java index 1b704ce3f7..1badfe46c3 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java @@ -1,6 +1,6 @@ /** * 自定义各种 Activiti 的监听器,实现流程示例、流程任务的拓展表信息的同步 - * 例如说,{@link org.activiti.api.task.model.Task} 新建时,我们也要新建对应的 {@link cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO} 记录 + * 例如说,{@link org.activiti.api.task.model.Task} 新建时,我们也要新建对应的 {@link cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO} 记录 * * @author 芋道源码 */ diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java index 496f9a45f9..be7cdadb68 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; import org.activiti.bpmn.model.BpmnModel; import javax.validation.Valid; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java index b4a04a101d..688098b017 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java index 1105ddaa7e..40594c44a4 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java @@ -1,10 +1,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import org.activiti.engine.repository.ProcessDefinition; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import org.springframework.lang.Nullable; import javax.validation.Valid; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java index 5ff8f18151..ab141a69af 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import lombok.Data; /** diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java index 11a8245d5a..0f275eb6d5 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import lombok.Data; import javax.validation.constraints.AssertTrue; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java index 1f5882a4bb..e70fae67c3 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java @@ -4,16 +4,17 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.BpmFormServiceApi; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; +import cn.iocoder.yudao.module.bpm.api.form.BpmFormServiceApi; +import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -37,7 +38,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java index 9d906d5eb6..67dc6e1683 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java @@ -3,17 +3,17 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmProcessDefinitionConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.BpmFormServiceApi; -import cn.iocoder.yudao.coreservice.modules.bpm.api.form.dto.BpmFormDTO; +import cn.iocoder.yudao.module.bpm.api.form.BpmFormServiceApi; +import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.PageUtils; @@ -31,8 +31,8 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static java.util.Collections.emptyList; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java index 2364339ed0..b58ab0cb94 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java @@ -3,17 +3,17 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmTaskAssignRuleConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; +import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; import cn.iocoder.yudao.module.system.enums.SysDictTypeConstants; import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; import cn.iocoder.yudao.module.system.service.dept.SysPostCoreService; @@ -33,7 +33,6 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java index 62d991d84f..bb4e0de8b6 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.oa; import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.BpmOALeaveDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import javax.validation.Valid; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java index f55836d6e3..31e881242d 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.impl; import cn.hutool.core.date.DateUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*; import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.BpmOALeaveConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.BpmOALeaveDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.BpmOALeaveMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; @@ -17,7 +17,6 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java index 8defdd23de..1fc2bffc15 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java @@ -1,8 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.*; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java index cad468a2e3..b6162dbd8e 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.engine.task.Task; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java index 7c4253ec6e..34f7604c08 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java @@ -3,8 +3,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl; import cn.hutool.core.io.IoUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.activity.BpmActivityRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmActivityConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmTaskConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmActivityService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; @@ -13,8 +11,6 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.HistoryService; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.RuntimeService; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.task.Task; @@ -26,9 +22,7 @@ import javax.annotation.Resource; import java.io.InputStream; import java.util.Collections; import java.util.List; -import java.util.Map; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java index df44537833..8aa06f3504 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java @@ -6,15 +6,15 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.*; import cn.iocoder.yudao.adminserver.modules.bpm.convert.message.BpmMessageConvert; import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmProcessInstanceConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService; +import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; @@ -39,7 +39,6 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java index 5f97a2561a..b694b25aa8 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java @@ -5,10 +5,10 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*; import cn.iocoder.yudao.adminserver.modules.bpm.convert.message.BpmMessageConvert; import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmTaskConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmTaskExtMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; +import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; @@ -39,7 +39,6 @@ import javax.annotation.Resource; import javax.validation.Valid; import java.util.*; -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java index 082d9c9486..c10a614ae4 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java @@ -1,13 +1,13 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.coreservice.modules.bpm.api.group.dto.BpmUserGroupDTO; +import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; +import cn.iocoder.yudao.module.bpm.api.group.dto.BpmUserGroupDTO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; From f39bfdab896f1ce0803c8ddc9e6782a9e843c183 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 1 Feb 2022 20:33:03 +0800 Subject: [PATCH 27/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=208=EF=BC=9Abom=20=E6=A8=A1=E5=9D=97=EF=BC=8C?= =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=85=AC=E7=94=A8=E9=83=A8=E5=88=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-admin-server/pom.xml | 25 +------ .../src/main/resources/application.yaml | 5 +- .../framework/web/config/WebProperties.java | 14 ++++ yudao-module-bpm/TODO.md | 5 +- .../module/bpm/enums/ErrorCodeConstants.java | 5 ++ .../yudao-module-bpm-base/pom.xml | 11 +++ .../definition/vo/form/BpmFormBaseVO.java | 1 - .../controller/oa/vo/BpmOALeaveBaseVO.java | 2 +- .../oa/vo/BpmOALeaveCreateReqVO.java | 2 +- .../controller/oa/vo/BpmOALeavePageReqVO.java | 2 +- .../controller/oa/vo/BpmOALeaveRespVO.java | 2 +- .../task/vo/activity/BpmActivityRespVO.java | 2 +- .../BpmProcessInstanceCancelReqVO.java | 2 +- .../BpmProcessInstanceCreateReqVO.java | 2 +- .../BpmProcessInstanceMyPageReqVO.java | 2 +- .../BpmProcessInstancePageItemRespVO.java | 2 +- .../vo/instance/BpmProcessInstanceRespVO.java | 2 +- .../task/vo/task/BpmTaskApproveReqVO.java | 2 +- .../vo/task/BpmTaskDonePageItemRespVO.java | 2 +- .../task/vo/task/BpmTaskDonePageReqVO.java | 2 +- .../task/vo/task/BpmTaskRejectReqVO.java | 2 +- .../task/vo/task/BpmTaskRespVO.java | 4 +- .../vo/task/BpmTaskTodoPageItemRespVO.java | 2 +- .../task/vo/task/BpmTaskTodoPageReqVO.java | 2 +- .../vo/task/BpmTaskUpdateAssigneeReqVO.java | 2 +- .../convert/definition/BpmFormConvert.java | 5 -- .../definition/BpmUserGroupConvert.java | 2 - .../convert/message/BpmMessageConvert.java | 16 +++++ .../module/bpm/convert/oa/package-info.java | 1 + .../module/bpm/convert/task/package-info.java | 1 + .../definition/BpmProcessDefinitionExtDO.java | 9 +-- .../definition/BpmTaskAssignRuleDO.java | 13 ++-- .../bpm/dal/dataobject/oa/BpmOALeaveDO.java | 9 ++- .../task/BpmProcessInstanceExtDO.java | 24 +++---- .../bpm/dal/dataobject/task/BpmTaskExtDO.java | 23 +++---- .../BpmProcessDefinitionExtMapper.java | 2 +- .../definition/BpmTaskAssignRuleMapper.java | 2 +- .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 4 +- .../task/BpmProcessInstanceExtMapper.java | 4 +- .../bpm/dal/mysql/task/BpmTaskExtMapper.java | 2 +- .../bpm/enums/message/BpmMessageEnum.java | 6 +- .../definition/BpmUserGroupService.java | 9 +++ .../definition/BpmUserGroupServiceImpl.java | 8 ++- .../message/BpmMessageServiceImpl.java | 28 ++++---- .../BpmMessageSendWhenTaskCreatedReqDTO.java | 2 +- .../module/bpm/service/task/package-info.java | 1 + .../definition/BpmModelController.java | 1 - .../controller/oa/BpmOALeaveController.java | 6 +- .../task/BpmActivityController.java | 2 +- .../task/BpmProcessInstanceController.java | 4 +- .../controller/task/BpmTaskController.java | 5 +- .../convert/definition/BpmModelConvert.java | 11 ++- .../BpmProcessDefinitionConvert.java | 8 +-- .../convert/message/BpmMessageConvert.java | 6 +- .../bpm/convert/oa/BpmOALeaveConvert.java | 4 +- .../bpm/convert/task/BpmActivityConvert.java | 2 +- .../task/BpmProcessInstanceConvert.java | 12 ++-- .../bpm/convert/task/BpmTaskConvert.java | 34 ++++----- .../config/BpmActivitiConfiguration.java | 27 ++++---- .../behavior/BpmActivityBehaviorFactory.java | 26 +++---- .../behavior/BpmUserTaskActivitiBehavior.java | 55 ++++++++------- .../BpmTaskAssignLeaderAbstractScript.java | 23 ++++--- .../{impl => }/BpmModelServiceImpl.java | 28 ++++---- .../BpmProcessDefinitionServiceImpl.java | 27 ++++---- .../BpmTaskAssignRuleServiceImpl.java | 46 ++++++------- .../bpm/service/oa/BpmOALeaveService.java | 3 +- .../oa/{impl => }/BpmOALeaveServiceImpl.java | 9 +-- .../oa/listener/BpmOALeaveResultListener.java | 2 +- .../bpm/service/task/BpmActivityService.java | 2 +- .../{impl => }/BpmActivityServiceImpl.java | 9 +-- .../task/BpmProcessInstanceService.java | 2 +- .../BpmProcessInstanceServiceImpl.java | 27 ++++---- .../bpm/service/task/BpmTaskService.java | 2 +- .../task/{impl => }/BpmTaskServiceImpl.java | 31 ++++----- .../BpmUserTaskActivitiBehaviorTest.java | 69 ++++++++++--------- .../impl/BpmTaskAssignLeaderX2ScriptTest.java | 42 +++++------ .../member/convert/auth/AuthConvert.java | 4 +- .../service/user/MemberUserServiceImpl.java | 2 +- .../yudao/module/system/api/dept/DeptApi.java | 50 ++++++++++++++ .../yudao/module/system/api/dept/PostApi.java | 21 ++++++ .../system/api/dept/dto/DeptRespDTO.java | 37 ++++++++++ .../module/system/api/dict/DictDataApi.java | 22 ++++++ .../system/api/permission/PermissionApi.java | 21 ++++++ .../module/system/api/permission/RoleApi.java | 21 ++++++ .../module/system/api/sms/SmsCodeApi.java | 6 +- .../module/system/api/sms/SmsSendApi.java | 34 +++++++++ .../dto/{ => code}/SmsCodeCheckReqDTO.java | 2 +- .../sms/dto/{ => code}/SmsCodeSendReqDTO.java | 2 +- .../sms/dto/{ => code}/SmsCodeUseReqDTO.java | 2 +- .../dto/send/SmsSendSingleToUserReqDTO.java | 38 ++++++++++ .../module/system/api/user/AdminUserApi.java | 58 ++++++++++++++++ .../system/api/user/dto/AdminUserRespDTO.java | 44 ++++++++++++ .../module/system/api/dept/DeptApiImpl.java | 49 +++++++++++++ .../api/permission/PermissionApiImpl.java | 26 +++++++ .../module/system/api/sms/SmsCodeApiImpl.java | 6 +- .../module/system/api/sms/SmsSendApiImpl.java | 34 +++++++++ .../system/api/user/AdminUserApiImpl.java | 55 +++++++++++++++ .../system/convert/dept/DeptConvert.java | 8 +++ .../system/convert/user/UserConvert.java | 9 +++ .../system/service/dept/DeptService.java | 1 - .../system/service/sms/SmsCodeService.java | 6 +- .../service/sms/SmsCodeServiceImpl.java | 11 +-- 102 files changed, 945 insertions(+), 424 deletions(-) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/oa/vo/BpmOALeaveBaseVO.java (94%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java (88%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/oa/vo/BpmOALeavePageReqVO.java (94%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/oa/vo/BpmOALeaveRespVO.java (93%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/activity/BpmActivityRespVO.java (91%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java (89%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java (87%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java (95%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java (95%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java (97%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java (90%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java (92%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java (93%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java (88%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/task/BpmTaskRespVO.java (91%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java (95%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java (93%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java (91%) create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/package-info.java create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/package-info.java rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java (91%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java (95%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/mysql/oa/BpmOALeaveMapper.java (87%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java (90%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/dal/mysql/task/BpmTaskExtMapper.java (93%) create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/{impl => }/BpmModelServiceImpl.java (93%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/{impl => }/BpmProcessDefinitionServiceImpl.java (96%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/{impl => }/BpmTaskAssignRuleServiceImpl.java (83%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/{impl => }/BpmOALeaveServiceImpl.java (89%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/{impl => }/BpmActivityServiceImpl.java (86%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/{impl => }/BpmProcessInstanceServiceImpl.java (93%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/{impl => }/BpmTaskServiceImpl.java (91%) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/dto/DeptRespDTO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/permission/PermissionApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/permission/RoleApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApi.java rename yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/{ => code}/SmsCodeCheckReqDTO.java (92%) rename yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/{ => code}/SmsCodeSendReqDTO.java (92%) rename yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/{ => code}/SmsCodeUseReqDTO.java (93%) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/permission/PermissionApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index eb52218684..e27f025d70 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -42,28 +42,13 @@ yudao-module-pay-impl ${revision} - - + cn.iocoder.boot - yudao-module-bpm-activiti + yudao-module-bpm-impl-activiti ${revision} - - - - cn.iocoder.boot - yudao-spring-boot-starter-biz-dict - - - - cn.iocoder.boot - yudao-spring-boot-starter-biz-tenant - - - - org.springframework.boot @@ -88,12 +73,6 @@ spring-boot-admin-starter-server - - - - com.xkcoding.justauth - justauth-spring-boot-starter - diff --git a/yudao-admin-server/src/main/resources/application.yaml b/yudao-admin-server/src/main/resources/application.yaml index b352943a88..e5761d5d09 100644 --- a/yudao-admin-server/src/main/resources/application.yaml +++ b/yudao-admin-server/src/main/resources/application.yaml @@ -58,7 +58,8 @@ yudao: app-api: prefix: /app-api controller: '**.controller.app.**' - + admin-ui: + url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址 swagger: title: 管理后台 description: 提供管理员管理的所有功能 @@ -78,8 +79,6 @@ yudao: - cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants tenant: # 多租户相关配置项 tables: # 配置需要开启多租户的表;如果实体已经继承 TenantBaseDO 类,则无需重复配置 - url: ## TODO 芋艿:迁移到 web 配置项下, - admin-ui: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址 sms-code: # 短信验证码相关的配置项 expire-times: 10m send-frequency: 1m diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java index a7058871e8..173a67042e 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java @@ -19,6 +19,9 @@ public class WebProperties { @NotNull(message = "Admin API 不能为空") private Api adminApi; + @NotNull(message = "Admin UI 不能为空") + private Ui adminUi; + @Data @Valid public static class Api { @@ -45,4 +48,15 @@ public class WebProperties { } + @Data + @Valid + public static class Ui { + + /** + * 访问地址 + */ + private String url; + + } + } diff --git a/yudao-module-bpm/TODO.md b/yudao-module-bpm/TODO.md index 35a2e25b1f..d155eaa5f9 100644 --- a/yudao-module-bpm/TODO.md +++ b/yudao-module-bpm/TODO.md @@ -1,6 +1,7 @@ 1. 类名可以去掉 Bpm 前缀哈 + 2. 后续接口我们分成 admin 管理后天,app 用户前端;所以 controller 包下,需要有 admin 和 app 两个子包。可见 https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/feature/multi-module/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller -3. yudao-module-xxx-api 是暴露接口给外部模块,所以可以把 yudao-module-bpm-core-service-api 改成 yudao-module-bpm-api。大概率用不了暴露 BpmUserGroupServiceApi 哈。 -4. yudao-module-bpm-core-service-impl 模块,要不改成 yudao-module-bpm-base,本质上是提供给 yudao-module-bpm-flowable-impl 和 yudao-module-bpm-activiti-impl 继承的。这样的话,我们在 yudao-module-bpm-base: + +3. yudao-module-bpm-core-service-impl 模块,要不改成 yudao-module-bpm-base,本质上是提供给 yudao-module-bpm-flowable-impl 和 yudao-module-bpm-activiti-impl 继承的。这样的话,我们在 yudao-module-bpm-base: * 定义一些可被继承的类,例如说 ModelAbstractService; * 定义一些无需被继承的类,例如说 UserGroupService、UserGroupController 等等; diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java index 74281aaac2..45fa3fa877 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java @@ -55,5 +55,10 @@ public interface ErrorCodeConstants { // ========== 动态表单模块 1-009-010-000 ========== ErrorCode FORM_NOT_EXISTS = new ErrorCode(1009010000, "动态表单不存在"); + ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1009010000, "表单项({}) 和 ({}) 使用了相同的字段名({})"); + + // ========== 用户组模块 1-009-011-000 ========== + ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1009011000, "用户组不存在"); + ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1009011001, "名字为【{}】的用户组已被禁用"); } diff --git a/yudao-module-bpm/yudao-module-bpm-base/pom.xml b/yudao-module-bpm/yudao-module-bpm-base/pom.xml index 5b839de9e0..8889428445 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-base/pom.xml @@ -21,6 +21,17 @@ yudao-module-bpm-api ${revision} + + cn.iocoder.boot + yudao-module-system-api + ${revision} + + + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-operatelog + diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java index 6a518b86ac..1eb2ccd822 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; -import com.sun.istack.internal.NotNull; import lombok.*; import io.swagger.annotations.*; import javax.validation.constraints.*; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java index e7128b50d3..6790cf28f1 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; +package cn.iocoder.yudao.module.bpm.controller.oa.vo; import lombok.*; import java.util.*; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java index f36e924b17..2e4ec99d07 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; +package cn.iocoder.yudao.module.bpm.controller.oa.vo; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java index 7b81455a25..2c7cbb8f04 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeavePageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; +package cn.iocoder.yudao.module.bpm.controller.oa.vo; import lombok.*; import java.util.*; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java index 2b386d8ced..6627c74739 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; +package cn.iocoder.yudao.module.bpm.controller.oa.vo; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java index 447c590006..3e6ca5423d 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/activity/BpmActivityRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.activity; +package cn.iocoder.yudao.module.bpm.controller.task.vo.activity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java index 74f0a86b4a..a9e7d0680c 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java index e4fbc95bba..301c7f176e 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java index 38965dd88e..61ad3a8a2a 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java index 14a2625701..3ca93ecbd5 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java index de6999c65a..75d05e2a71 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java index 356581a96d..a4af326de1 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java index b932c4e073..1ba195ab0c 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java index c3d3c6ead5..681e5c6e53 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.task.vo.task; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java index 4ad4983577..19e40b317a 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRespVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRespVO.java index a66c9f2afc..97dbc826ef 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -6,8 +6,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import java.util.List; - @ApiModel("流程任务的 Response VO") @Data @EqualsAndHashCode(callSuper = true) diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java index 2703b96902..5d1dc6296f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java index d89e582f1a..64153b7360 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.task.vo.task; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java index 0ad6fbedcf..400a24577d 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java index 9281cc4ab1..3baca0916b 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java @@ -5,7 +5,6 @@ import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormRespVO; import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormSimpleRespVO; import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -28,10 +27,6 @@ public interface BpmFormConvert { BpmFormRespVO convert(BpmFormDO bean); - BpmFormDTO convert1(BpmFormDO bean); - - List convertList(List list); - List convertList2(List list); PageResult convertPage(PageResult page); diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java index d30860ef19..02a7845517 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java @@ -6,7 +6,6 @@ import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCr import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupRespVO; import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.module.bpm.api.group.dto.BpmUserGroupDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; @@ -36,5 +35,4 @@ public interface BpmUserGroupConvert { @Named("convertList2") List convertList2(List list); - List convertList3(List list); } diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java new file mode 100644 index 0000000000..92683f4c94 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.bpm.convert.message; + +import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.Map; + +@Mapper +public interface BpmMessageConvert { + + BpmMessageConvert INSTANCE = Mappers.getMapper(BpmMessageConvert.class); + + SmsSendSingleToUserReqDTO convert(Long userId, String templateCode, Map templateParams); + +} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/package-info.java new file mode 100644 index 0000000000..be8623fb1a --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.bpm.convert.oa; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/package-info.java new file mode 100644 index 0000000000..6a53114a8c --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.bpm.convert.task; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java index e9f8997f87..57abc0b99b 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java @@ -1,15 +1,12 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.*; -import org.activiti.engine.repository.Model; -import org.activiti.engine.repository.ProcessDefinition; import java.util.List; @@ -36,13 +33,13 @@ public class BpmProcessDefinitionExtDO extends BaseDO { /** * 流程定义的编号 * - * 关联 {@link ProcessDefinition#getId()} + * 关联 ProcessDefinition 的 id 属性 */ private String processDefinitionId; /** * 流程模型的编号 * - * 关联 {@link Model#getId()} + * 关联 Model 的 id 属性 */ private String modelId; /** diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java index 44950c8175..e65764f1a8 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java @@ -1,16 +1,13 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; -import org.activiti.engine.repository.Model; -import org.activiti.engine.repository.ProcessDefinition; -import org.activiti.engine.task.Task; import java.util.Set; @@ -46,19 +43,19 @@ public class BpmTaskAssignRuleDO extends BaseDO { /** * 流程模型编号 * - * 关联 {@link Model#getId()} + * 关联 Model 的 id 属性 */ private String modelId; /** * 流程定义编号 * - * 关联 {@link ProcessDefinition#getId()} + * 关联 ProcessDefinition 的 id 属性 */ private String processDefinitionId; /** * 流程任务的定义 Key * - * 关联 {@link Task#getTaskDefinitionKey()} + * 关联 Task 的 taskDefinitionKey 属性 */ private String taskDefinitionKey; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java index 6cad3fcae2..31381a5568 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java @@ -1,11 +1,10 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.oa; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import lombok.*; import java.util.*; import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import org.activiti.engine.runtime.ProcessInstance; /** * OA 请假申请 DO @@ -32,7 +31,7 @@ public class BpmOALeaveDO extends BaseDO { /** * 申请人的用户编号 * - * 关联 {@link SysUserDO#getId()} + * 关联 AdminUserDO 的 id 属性 */ private Long userId; /** @@ -59,7 +58,7 @@ public class BpmOALeaveDO extends BaseDO { /** * 请假的结果 * - * 枚举 {@link cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum} + * 枚举 {@link BpmProcessInstanceResultEnum} * 考虑到简单,所以直接复用了 BpmProcessInstanceResultEnum 枚举,也可以自己定义一个枚举哈 */ private Integer result; @@ -67,7 +66,7 @@ public class BpmOALeaveDO extends BaseDO { /** * 对应的流程编号 * - * 关联 {@link ProcessInstance#getId()} + * 关联 ProcessInstance 的 id 属性 */ private String processInstanceId; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java index ddeed4e970..b37709962d 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.task; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -10,16 +10,13 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import org.activiti.engine.history.HistoricProcessInstance; -import org.activiti.engine.repository.ProcessDefinition; -import org.activiti.engine.runtime.ProcessInstance; import java.util.Date; import java.util.Map; /** * Bpm 流程实例的拓展表 - * 主要解决 Activiti {@link ProcessInstance} 和 {@link HistoricProcessInstance} 不支持拓展字段,所以新建拓展表 + * 主要解决 Activiti ProcessInstance 和 HistoricProcessInstance 不支持拓展字段,所以新建拓展表 * * @author 芋道源码 */ @@ -27,9 +24,6 @@ import java.util.Map; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -//@Builder -//@NoArgsConstructor -//@AllArgsConstructor public class BpmProcessInstanceExtDO extends BaseDO { /** @@ -40,31 +34,31 @@ public class BpmProcessInstanceExtDO extends BaseDO { /** * 发起流程的用户编号 * - * 冗余 {@link HistoricProcessInstance#getStartUserId()} + * 冗余 HistoricProcessInstance 的 startUserId 属性 */ private Long startUserId; /** * 流程实例的名字 * - * 冗余 {@link ProcessInstance#getName()} 为了筛选 + * 冗余 ProcessInstance 的 name 属性,用于筛选 */ private String name; /** * 流程实例的编号 * - * 关联 {@link ProcessInstance#getId()} + * 关联 ProcessInstance 的 id 属性 */ private String processInstanceId; /** * 流程定义的编号 * - * 关联 {@link ProcessDefinition#getId()} + * 关联 ProcessDefinition 的 id 属性 */ private String processDefinitionId; /** * 流程分类 * - * 冗余 {@link ProcessDefinition#getCategory()} + * 冗余 ProcessDefinition 的 category 属性 * 数据字典 bpm_model_category */ private String category; @@ -83,7 +77,7 @@ public class BpmProcessInstanceExtDO extends BaseDO { /** * 结束时间 * - * 冗余 {@link HistoricProcessInstance#getEndTime()} + * 冗余 HistoricProcessInstance 的 endTime 属性 */ private Date endTime; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java index 3fb4f5aa8d..9cd12ee3c7 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java @@ -1,21 +1,17 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.task; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import org.activiti.engine.history.HistoricTaskInstance; -import org.activiti.engine.repository.ProcessDefinition; -import org.activiti.engine.runtime.ProcessInstance; -import org.activiti.engine.task.Task; import java.util.Date; /** * Bpm 流程任务的拓展表 - * 主要解决 Activiti {@link Task} 和 {@link HistoricTaskInstance} 不支持拓展字段,所以新建拓展表 + * 主要解决 Activiti Task 和 HistoricTaskInstance 不支持拓展字段,所以新建拓展表 * * @author 芋道源码 */ @@ -23,27 +19,24 @@ import java.util.Date; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -//@Builder -//@NoArgsConstructor -//@AllArgsConstructor public class BpmTaskExtDO extends BaseDO { /** * 任务的审批人 * - * 冗余 {@link Task#getAssignee()} + * 冗余 Task 的 assignee 属性 */ private Long assigneeUserId; /** * 任务的名字 * - * 冗余 {@link Task#getName()} 为了筛选 + * 冗余 Task 的 name 属性,为了筛选 */ private String name; /** * 任务的编号 * - * 关联 {@link Task#getId()} + * 关联 Task 的 id 属性 */ private String taskId; // /** @@ -65,20 +58,20 @@ public class BpmTaskExtDO extends BaseDO { /** * 任务的结束时间 * - * 冗余 {@link HistoricTaskInstance#getEndTime()} + * 冗余 HistoricTaskInstance 的 endTime 属性 */ private Date endTime; /** * 流程实例的编号 * - * 关联 {@link ProcessInstance#getId()} + * 关联 ProcessInstance 的 id 属性 */ private String processInstanceId; /** * 流程定义的编号 * - * 关联 {@link ProcessDefinition#getId()} + * 关联 ProcessDefinition 的 id 属性 */ private String processDefinitionId; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java index eeed00bb60..d857e145c3 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition; +package cn.iocoder.yudao.module.bpm.dal.mysql.definition; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java index 3879a0f071..1205d30e1f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition; +package cn.iocoder.yudao.module.bpm.dal.mysql.definition; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java index 4c47ea8bc9..a5ae1dec7e 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/BpmOALeaveMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa; +package cn.iocoder.yudao.module.bpm.dal.mysql.oa; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeavePageReqVO; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java index 8fdc031dd4..075cbae9e2 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task; +package cn.iocoder.yudao.module.bpm.dal.mysql.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java index b89f1a2450..b2927a65e0 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmTaskExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task; +package cn.iocoder.yudao.module.bpm.dal.mysql.task; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java index 7462570c21..79001fccd3 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.bpm.enums.message; -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SysSmsTemplateDO; import lombok.AllArgsConstructor; import lombok.Getter; @@ -20,9 +19,8 @@ public enum BpmMessageEnum { /** * 短信模板的标识 * - * 关联 {@link SysSmsTemplateDO#getCode()} + * 关联 SmsTemplateDO 的 code 属性 */ - private final String smsCode; - + private final String smsTemplateCode; } diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java index 2280d4a468..f61e8f9d5b 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java @@ -46,6 +46,14 @@ public interface BpmUserGroupService { */ BpmUserGroupDO getUserGroup(Long id); + /** + * 获得用户组列表 + * + * @param ids 编号 + * @return 用户组列表 + */ + List getUserGroupList(Collection ids); + /** * 获得指定状态的用户组列表 * @@ -70,4 +78,5 @@ public interface BpmUserGroupService { * @param ids 用户组编号数组 */ void validUserGroups(Set ids); + } diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java index 79c5aeab26..6116e8ccea 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java @@ -15,12 +15,13 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 用户组 Service 实现类 @@ -71,6 +72,11 @@ public class BpmUserGroupServiceImpl implements BpmUserGroupService { return userGroupMapper.selectById(id); } + @Override + public List getUserGroupList(Collection ids) { + return userGroupMapper.selectBatchIds(ids); + } + @Override public List getUserGroupListByStatus(Integer status) { diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java index c308620f8c..61b3c57d42 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java @@ -1,13 +1,13 @@ package cn.iocoder.yudao.module.bpm.service.message; -import cn.iocoder.yudao.adminserver.modules.bpm.enums.message.BpmMessageEnum; -import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; +import cn.iocoder.yudao.framework.web.config.WebProperties; +import cn.iocoder.yudao.module.bpm.convert.message.BpmMessageConvert; +import cn.iocoder.yudao.module.bpm.enums.message.BpmMessageEnum; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import cn.iocoder.yudao.module.system.service.sms.SysSmsCoreService; +import cn.iocoder.yudao.module.system.api.sms.SmsSendApi; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -26,18 +26,18 @@ import java.util.Map; public class BpmMessageServiceImpl implements BpmMessageService { @Resource - private SysSmsCoreService smsCoreService; + private SmsSendApi smsSendApi; - @Value("${yudao.url.admin-ui}") - private String adminUiUrl; + @Resource + private WebProperties webProperties; @Override public void sendMessageWhenProcessInstanceApprove(BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO) { Map templateParams = new HashMap<>(); templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); - smsCoreService.sendSingleSmsToAdmin(null, reqDTO.getStartUserId(), - BpmMessageEnum.PROCESS_INSTANCE_APPROVE.getSmsCode(), templateParams); + smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(), + BpmMessageEnum.PROCESS_INSTANCE_APPROVE.getSmsTemplateCode(), templateParams)); } @Override @@ -46,8 +46,8 @@ public class BpmMessageServiceImpl implements BpmMessageService { templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); templateParams.put("comment", reqDTO.getComment()); templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); - smsCoreService.sendSingleSmsToAdmin(null, reqDTO.getStartUserId(), - BpmMessageEnum.PROCESS_INSTANCE_REJECT.getSmsCode(), templateParams); + smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(), + BpmMessageEnum.PROCESS_INSTANCE_REJECT.getSmsTemplateCode(), templateParams)); } @Override @@ -57,12 +57,12 @@ public class BpmMessageServiceImpl implements BpmMessageService { templateParams.put("taskName", reqDTO.getTaskName()); templateParams.put("startUserNickname", reqDTO.getStartUserNickname()); templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); - smsCoreService.sendSingleSmsToAdmin(null, reqDTO.getAssigneeUserId(), - BpmMessageEnum.TASK_ASSIGNED.getSmsCode(), templateParams); + smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(), + BpmMessageEnum.TASK_ASSIGNED.getSmsTemplateCode(), templateParams)); } private String getProcessInstanceDetailUrl(String taskId) { - return adminUiUrl + "bpm/process-instance/detail?id=" + taskId; + return webProperties.getAdminUi().getUrl() + "/bpm/process-instance/detail?id=" + taskId; } } diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java index 7f696d1d3b..bf9528f664 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java @@ -22,7 +22,7 @@ public class BpmMessageSendWhenTaskCreatedReqDTO { @NotEmpty(message = "流程实例的名字不能为空") private String processInstanceName; @NotEmpty(message = "发起人的用户编号") - private String startUserId; + private Long startUserId; @NotEmpty(message = "发起人的昵称") private String startUserNickname; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java new file mode 100644 index 0000000000..eaa615302a --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.bpm.service.task; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java index 973c9bdd87..449363d897 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmModelConvert; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java index ebf252c1d9..47ac08735f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeavePageReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeaveRespVO; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.BpmOALeaveConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java index b5b7f59d98..be4bc75c3e 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.task; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.activity.BpmActivityRespVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.activity.BpmActivityRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmActivityService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java index 4240e39af2..f32e3242fa 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.*; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -25,7 +25,7 @@ public class BpmProcessInstanceController { @Resource private BpmProcessInstanceService processInstanceService; - + @PostMapping("/create") @ApiOperation("新建流程实例") @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java index 3ad59a7aa1..665b735aea 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java @@ -1,10 +1,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; +import cn.iocoder.yudao.module.bpm.controller.task.vo.task.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -13,9 +12,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.io.IOException; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java index b6327057e8..64c57c00ba 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java @@ -1,13 +1,12 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import org.activiti.engine.impl.persistence.entity.SuspensionState; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.Model; @@ -31,19 +30,19 @@ public interface BpmModelConvert { BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class); - default List convertList(List list, Map formMap, + default List convertList(List list, Map formMap, Map deploymentMap, Map processDefinitionMap) { return CollectionUtils.convertList(list, model -> { BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - BpmFormDTO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; + BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null; ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null; return convert(model, form, deployment, processDefinition); }); } - default BpmModelPageItemRespVO convert(Model model, BpmFormDTO form, Deployment deployment, ProcessDefinition processDefinition) { + default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, Deployment deployment, ProcessDefinition processDefinition) { BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO(); modelRespVO.setId(model.getId()); modelRespVO.setCreateTime(model.getCreateTime()); @@ -84,7 +83,7 @@ public interface BpmModelConvert { void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to); - default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDTO form) { + default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDO form) { BpmProcessDefinitionCreateReqDTO createReqDTO = new BpmProcessDefinitionCreateReqDTO(); createReqDTO.setModelId(model.getId()); createReqDTO.setName(model.getName()); diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java index eba3273f18..97354a951b 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.engine.impl.persistence.entity.SuspensionState; import org.activiti.engine.repository.Deployment; @@ -29,17 +29,17 @@ public interface BpmProcessDefinitionConvert { BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class); default List convertList(List list, Map deploymentMap, - Map processDefinitionDOMap, Map formMap) { + Map processDefinitionDOMap, Map formMap) { return CollectionUtils.convertList(list, definition -> { Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null; BpmProcessDefinitionExtDO definitionDO = processDefinitionDOMap.get(definition.getId()); - BpmFormDTO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null; + BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null; return convert(definition, deployment, definitionDO, form); }); } default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment, - BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDTO form) { + BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDO form) { BpmProcessDefinitionPageItemRespVO respVO = convert(bean); respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); if (deployment != null) { diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java index ca84b72a9e..4ea82abe30 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.message; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.activiti.api.task.model.Task; import org.activiti.engine.runtime.ProcessInstance; import org.mapstruct.Mapper; @@ -17,7 +17,7 @@ public interface BpmMessageConvert { BpmMessageConvert INSTANCE = Mappers.getMapper(BpmMessageConvert.class); - default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, SysUserDO startUser, Task task) { + default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, Task task) { BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); copyTo(processInstance, reqDTO); copyTo(startUser, reqDTO); @@ -30,7 +30,7 @@ public interface BpmMessageConvert { @Mapping(source = "id", target = "startUserId"), @Mapping(source = "nickname", target = "startUserNickname") }) - void copyTo(SysUserDO from, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); + void copyTo(AdminUserRespDTO from, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); @Mappings({ @Mapping(source = "id", target = "taskId"), @Mapping(source = "name", target = "taskName"), diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java index 49c5d8bd12..c8af88fc16 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.oa; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.BpmOALeaveRespVO; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java index a9882f9606..8635b330a7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.activity.BpmActivityRespVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.activity.BpmActivityRespVO; import org.activiti.engine.history.HistoricActivityInstance; import org.mapstruct.Mapper; import org.mapstruct.Mapping; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java index 304894e599..459362ce77 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceRespVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.BpmProcessInstanceRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.repository.ProcessDefinition; @@ -71,7 +71,7 @@ public interface BpmProcessInstanceConvert { default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance, BpmProcessInstanceExtDO processInstanceExt, ProcessDefinition processDefinition, BpmProcessDefinitionExtDO processDefinitionExt, - String bpmnXml, SysUserDO startUser, SysDeptDO dept) { + String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) { BpmProcessInstanceRespVO respVO = convert2(processInstance); copyTo(processInstanceExt, respVO); // definition @@ -94,7 +94,7 @@ public interface BpmProcessInstanceConvert { BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean); @Mapping(source = "from.id", target = "to.id", ignore = true) void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to); - BpmProcessInstanceRespVO.User convert2(SysUserDO bean); + BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean); default BpmProcessInstanceResultEvent convert(Object source, ProcessInstance instance, Integer result) { BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java index 4e092f8502..e9689d6fd5 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskDonePageItemRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskTodoPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.task.BpmTaskDonePageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.task.BpmTaskRespVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.task.BpmTaskTodoPageItemRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import org.activiti.engine.history.HistoricProcessInstance; @@ -30,12 +30,12 @@ public interface BpmTaskConvert { BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); default List convertList1(List tasks, Map processInstanceMap, - Map userMap) { + Map userMap) { return CollectionUtils.convertList(tasks, task -> { BpmTaskTodoPageItemRespVO respVO = convert1(task); ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId()); if (processInstance != null) { - SysUserDO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); respVO.setProcessInstance(convert(processInstance, startUser)); } return respVO; @@ -53,14 +53,14 @@ public interface BpmTaskConvert { default List convertList2(List tasks, Map bpmTaskExtDOMap, Map historicProcessInstanceMap, - Map userMap) { + Map userMap) { return CollectionUtils.convertList(tasks, task -> { BpmTaskDonePageItemRespVO respVO = convert2(task); BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); copyTo(taskExtDO, respVO); HistoricProcessInstance processInstance = historicProcessInstanceMap.get(task.getProcessInstanceId()); if (processInstance != null) { - SysUserDO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); respVO.setProcessInstance(convert(processInstance, startUser)); } return respVO; @@ -77,20 +77,20 @@ public interface BpmTaskConvert { BpmTaskExtDO convert(org.activiti.api.task.model.Task bean); default List convertList3(List tasks, Map bpmTaskExtDOMap, - HistoricProcessInstance processInstance, Map userMap, - Map deptMap) { + HistoricProcessInstance processInstance, Map userMap, + Map deptMap) { return CollectionUtils.convertList(tasks, task -> { BpmTaskRespVO respVO = convert3(task); BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); copyTo(taskExtDO, respVO); if (processInstance != null) { - SysUserDO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); respVO.setProcessInstance(convert(processInstance, startUser)); } - SysUserDO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); + AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); if (assignUser != null) { respVO.setAssigneeUser(convert3(assignUser)); - SysDeptDO dept = deptMap.get(assignUser.getDeptId()); + DeptRespDTO dept = deptMap.get(assignUser.getDeptId()); if (dept != null) { respVO.getAssigneeUser().setDeptName(dept.getName()); } @@ -101,7 +101,7 @@ public interface BpmTaskConvert { @Mapping(source = "taskDefinitionKey", target = "definitionKey") BpmTaskRespVO convert3(HistoricTaskInstance bean); - BpmTaskRespVO.User convert3(SysUserDO bean); + BpmTaskRespVO.User convert3(AdminUserRespDTO bean); void copyTo(BpmTaskExtDO from, @MappingTarget BpmTaskDonePageItemRespVO to); @@ -112,7 +112,7 @@ public interface BpmTaskConvert { @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"), @Mapping(source = "startUser.nickname", target = "startUserNickname") }) - BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, SysUserDO startUser); + BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser); @Mappings({ @Mapping(source = "processInstance.id", target = "id"), @@ -121,6 +121,6 @@ public interface BpmTaskConvert { @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"), @Mapping(source = "startUser.nickname", target = "startUserNickname") }) - BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, SysUserDO startUser); + BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser); } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index 2802211533..18f867ffae 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -6,13 +6,10 @@ import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.Bp import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.permission.PermissionApi; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import org.activiti.api.runtime.shared.identity.UserGroupManager; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.ApplicationEventPublisher; @@ -67,17 +64,17 @@ public class BpmActivitiConfiguration { @Bean public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskAssignRuleService taskRuleService, - SysPermissionCoreService permissionCoreService, - SysDeptCoreService deptCoreService, - BpmUserGroupServiceApi userGroupServiceApi, - SysUserCoreService userCoreService, + BpmUserGroupService userGroupService, + PermissionApi permissionApi, + DeptApi deptApi, + AdminUserApi adminUserApi, List scripts) { BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService); - bpmActivityBehaviorFactory.setPermissionCoreService(permissionCoreService); - bpmActivityBehaviorFactory.setDeptCoreService(deptCoreService); - bpmActivityBehaviorFactory.setUserGroupServiceApi(userGroupServiceApi); - bpmActivityBehaviorFactory.setUserCoreService(userCoreService); + bpmActivityBehaviorFactory.setUserGroupService(userGroupService); + bpmActivityBehaviorFactory.setAdminUserApi(adminUserApi); + bpmActivityBehaviorFactory.setPermissionApi(permissionApi); + bpmActivityBehaviorFactory.setDeptApi(deptApi); bpmActivityBehaviorFactory.setScripts(scripts); return bpmActivityBehaviorFactory; } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java index d401cfacc7..aa38a24c0f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java @@ -2,10 +2,10 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.permission.PermissionApi; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Setter; @@ -30,13 +30,15 @@ public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { @Setter private BpmTaskAssignRuleService bpmTaskRuleService; @Setter - private SysPermissionCoreService permissionCoreService; + private BpmUserGroupService userGroupService; + @Setter - private SysDeptCoreService deptCoreService; + private PermissionApi permissionApi; @Setter - private BpmUserGroupServiceApi userGroupServiceApi; + private DeptApi deptApi; @Setter - private SysUserCoreService userCoreService; + private AdminUserApi adminUserApi; + @Setter private List scripts; @@ -44,10 +46,10 @@ public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) { BpmUserTaskActivitiBehavior userTaskActivityBehavior = new BpmUserTaskActivitiBehavior(userTask); userTaskActivityBehavior.setBpmTaskRuleService(bpmTaskRuleService); - userTaskActivityBehavior.setPermissionCoreService(permissionCoreService); - userTaskActivityBehavior.setDeptCoreService(deptCoreService); - userTaskActivityBehavior.setUserGroupServiceApi(userGroupServiceApi); - userTaskActivityBehavior.setSysUserCoreService(userCoreService); + userTaskActivityBehavior.setPermissionApi(permissionApi); + userTaskActivityBehavior.setDeptApi(deptApi); + userTaskActivityBehavior.setUserGroupService(userGroupService); + userTaskActivityBehavior.setAdminUserApi(adminUserApi); userTaskActivityBehavior.setScripts(scripts); return userTaskActivityBehavior; } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java index 70d1305029..a540d1ffa5 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java @@ -3,18 +3,18 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.module.bpm.api.group.dto.BpmUserGroupDTO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; +import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.permission.PermissionApi; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import com.google.common.annotations.VisibleForTesting; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -28,12 +28,12 @@ import org.activiti.engine.impl.persistence.entity.TaskEntityManager; import java.util.*; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_ASSIGN_SCRIPT_NOT_EXISTS; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_CREATE_FAIL_NO_CANDIDATE_USER; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_ASSIGN_SCRIPT_NOT_EXISTS; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_CREATE_FAIL_NO_CANDIDATE_USER; /** * 自定义的流程任务的 assignee 负责人的分配 @@ -48,14 +48,17 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { @Setter private BpmTaskAssignRuleService bpmTaskRuleService; + @Setter - private SysPermissionCoreService permissionCoreService; + private BpmUserGroupService userGroupService; + @Setter - private SysDeptCoreService deptCoreService; + private DeptApi deptApi; @Setter - private BpmUserGroupServiceApi userGroupServiceApi; + private AdminUserApi adminUserApi; @Setter - private SysUserCoreService sysUserCoreService; + private PermissionApi permissionApi; + /** * 任务分配脚本 */ @@ -133,22 +136,22 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { } private Set calculateTaskCandidateUsersByRole(TaskEntity task, BpmTaskAssignRuleDO rule) { - return permissionCoreService.getUserRoleIdListByRoleIds(rule.getOptions()); + return permissionApi.getUserRoleIdListByRoleIds(rule.getOptions()); } private Set calculateTaskCandidateUsersByDeptMember(TaskEntity task, BpmTaskAssignRuleDO rule) { - List users = sysUserCoreService.getUsersByDeptIds(rule.getOptions()); - return convertSet(users, SysUserDO::getId); + List users = adminUserApi.getUsersByDeptIds(rule.getOptions()); + return convertSet(users, AdminUserRespDTO::getId); } private Set calculateTaskCandidateUsersByDeptLeader(TaskEntity task, BpmTaskAssignRuleDO rule) { - List depts = deptCoreService.getDepts(rule.getOptions()); - return convertSet(depts, SysDeptDO::getLeaderUserId); + List depts = deptApi.getDepts(rule.getOptions()); + return convertSet(depts, DeptRespDTO::getLeaderUserId); } private Set calculateTaskCandidateUsersByPost(TaskEntity task, BpmTaskAssignRuleDO rule) { - List users = sysUserCoreService.getUsersByPostIds(rule.getOptions()); - return convertSet(users, SysUserDO::getId); + List users = adminUserApi.getUsersByPostIds(rule.getOptions()); + return convertSet(users, AdminUserRespDTO::getId); } private Set calculateTaskCandidateUsersByUser(TaskEntity task, BpmTaskAssignRuleDO rule) { @@ -156,9 +159,9 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { } private Set calculateTaskCandidateUsersByUserGroup(TaskEntity task, BpmTaskAssignRuleDO rule) { - List userGroups = userGroupServiceApi.getUserGroupList(rule.getOptions()); + List userGroups = userGroupService.getUserGroupList(rule.getOptions()); Set userIds = new HashSet<>(); - userGroups.forEach(bpmUserGroupDO -> userIds.addAll(bpmUserGroupDO.getMemberUserIds())); + userGroups.forEach(group -> userIds.addAll(group.getMemberUserIds())); return userIds; } @@ -183,9 +186,9 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { if (CollUtil.isEmpty(assigneeUserIds)) { return; } - Map userMap = sysUserCoreService.getUserMap(assigneeUserIds); + Map userMap = adminUserApi.getUserMap(assigneeUserIds); assigneeUserIds.removeIf(id -> { - SysUserDO user = userMap.get(id); + AdminUserRespDTO user = userMap.get(id); return user == null || !CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus()); }); } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java index 465be3b4a6..e84c5df17b 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java @@ -2,16 +2,17 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.springframework.util.Assert; import javax.annotation.Resource; import java.util.Set; +import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; import static java.util.Collections.emptySet; /** @@ -23,16 +24,16 @@ import static java.util.Collections.emptySet; public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssignScript { @Resource - private SysUserCoreService userCoreService; + private AdminUserApi adminUserApi; @Resource - private SysDeptCoreService deptCoreService; + private DeptApi deptApi; protected Set calculateTaskCandidateUsers(TaskEntity task, int level) { Assert.isTrue(level > 0, "level 必须大于 0"); // 获得发起人 Long startUserId = Long.parseLong(task.getProcessInstance().getStartUserId()); // 获得对应 leve 的部门 - SysDeptDO dept = null; + DeptRespDTO dept = null; for (int i = 0; i < level; i++) { // 获得 level 对应的部门 if (dept == null) { @@ -41,7 +42,7 @@ public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssign return emptySet(); } } else { - SysDeptDO parentDept = deptCoreService.getDept(dept.getParentId()); + DeptRespDTO parentDept = deptApi.getDept(dept.getParentId()); if (parentDept == null) { // 找不到父级部门,所以只好结束寻找。原因是:例如说,级别比较高的人,所在部门层级比较少 break; } @@ -51,12 +52,12 @@ public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssign return dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet(); } - private SysDeptDO getStartUserDept(Long startUserId) { - SysUserDO startUser = userCoreService.getUser(startUserId); + private DeptRespDTO getStartUserDept(Long startUserId) { + AdminUserRespDTO startUser = adminUserApi.getUser(startUserId); if (startUser.getDeptId() == null) { // 找不到部门,所以无法使用该规则 return null; } - return deptCoreService.getDept(startUser.getDeptId()); + return deptApi.getDept(startUser.getDeptId()); } } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelServiceImpl.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelServiceImpl.java index e70fae67c3..0f37fb5826 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelServiceImpl.java @@ -1,26 +1,22 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.module.bpm.api.form.BpmFormServiceApi; -import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; +import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; +import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.RepositoryService; @@ -38,9 +34,9 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程定义实现 @@ -57,7 +53,7 @@ public class BpmModelServiceImpl implements BpmModelService { @Resource private RepositoryService repositoryService; @Resource - private BpmFormServiceApi formServiceApi; + private BpmFormService bpmFormService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource @@ -85,7 +81,7 @@ public class BpmModelServiceImpl implements BpmModelService { BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); return metaInfo != null ? metaInfo.getFormId() : null; }); - Map formMap = formServiceApi.getFormMap(formIds); + Map formMap = bpmFormService.getFormMap(formIds); // 获得 Deployment Map Set deploymentIds = new HashSet<>(); @@ -172,7 +168,7 @@ public class BpmModelServiceImpl implements BpmModelService { } // TODO 芋艿:校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素; // 校验表单已配 - BpmFormDTO form = checkFormConfig(model); + BpmFormDO form = checkFormConfig(model); // 校验任务分配规则已配置 checkTaskAssignRuleAllConfig(id); @@ -225,14 +221,14 @@ public class BpmModelServiceImpl implements BpmModelService { * @param model 流程模型 * @return 流程表单 */ - private BpmFormDTO checkFormConfig(Model model) { + private BpmFormDO checkFormConfig(Model model) { BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); if (metaInfo == null || metaInfo.getFormType() == null) { throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); } // 校验表单存在 if (Objects.equals(metaInfo.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) { - BpmFormDTO form = formServiceApi.getForm(metaInfo.getFormId()); + BpmFormDO form = bpmFormService.getForm(metaInfo.getFormId()); if (form == null) { throw exception(FORM_NOT_EXISTS); } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionServiceImpl.java similarity index 96% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionServiceImpl.java index 67dc6e1683..16a9689782 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionServiceImpl.java @@ -1,22 +1,21 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmProcessDefinitionConvert; +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmProcessDefinitionConvert; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import cn.iocoder.yudao.module.bpm.api.form.BpmFormServiceApi; -import cn.iocoder.yudao.module.bpm.api.form.dto.BpmFormDTO; -import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.PageUtils; +import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; +import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.RepositoryService; @@ -31,10 +30,10 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; import static java.util.Collections.emptyList; /** @@ -55,7 +54,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @Resource private RepositoryService repositoryService; @Resource - private BpmFormServiceApi bpmFormServiceApi; + private BpmFormService formService; @Resource private BpmProcessDefinitionExtMapper processDefinitionMapper; @@ -86,7 +85,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ // 获得 Form Map Set formIds = convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId); - Map formMap = bpmFormServiceApi.getFormMap(formIds); + Map formMap = formService.getFormMap(formIds); // 拼接结果 long definitionCount = definitionQuery.count(); diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java similarity index 83% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java index b58ab0cb94..1e80f854ed 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; @@ -8,21 +8,18 @@ import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRu import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmTaskAssignRuleConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; +import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.module.system.enums.SysDictTypeConstants; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.dept.SysPostCoreService; -import cn.iocoder.yudao.module.system.service.dict.DictDataCoreService; -import cn.iocoder.yudao.module.system.service.permission.SysRoleCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.PostApi; +import cn.iocoder.yudao.module.system.api.dict.DictDataApi; +import cn.iocoder.yudao.module.system.api.permission.RoleApi; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.UserTask; @@ -34,6 +31,7 @@ import javax.annotation.Resource; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * BPM 任务分配规则 Service 实现类 @@ -53,17 +51,17 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { @Lazy // 解决循环依赖 private BpmProcessDefinitionService processDefinitionService; @Resource - private SysRoleCoreService roleCoreService; + private BpmUserGroupService userGroupService; @Resource - private SysDeptCoreService deptCoreService; + private RoleApi roleApi; @Resource - private SysPostCoreService postService; + private DeptApi deptApi; @Resource - private SysUserCoreService userCoreService; + private PostApi postApi; @Resource - private BpmUserGroupServiceApi userGroupServiceApi; + private AdminUserApi adminUserApi; @Resource - private DictDataCoreService dictDataCoreService; + private DictDataApi dictDataApi; @Override public List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, @@ -178,18 +176,18 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { private void validTaskAssignRuleOptions(Integer type, Set options) { if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.ROLE.getType())) { - roleCoreService.validRoles(options); + roleApi.validRoles(options); } else if (ObjectUtils.equalsAny(type, BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType())) { - deptCoreService.validDepts(options); + deptApi.validDepts(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.POST.getType())) { - postService.validPosts(options); + postApi.validPosts(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER.getType())) { - userCoreService.validUsers(options); + adminUserApi.validUsers(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER_GROUP.getType())) { - userGroupServiceApi.validUserGroups(options); + userGroupService.validUserGroups(options); } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.SCRIPT.getType())) { - dictDataCoreService.validDictDatas(SysDictTypeConstants.BPM_TASK_ASSIGN_SCRIPT, + dictDataApi.validDictDatas(DictTypeConstants.BPM_TASK_ASSIGN_SCRIPT, CollectionUtils.convertSet(options, String::valueOf)); } else { throw new IllegalArgumentException(StrUtil.format("未知的规则类型({})", type)); diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java index bb4e0de8b6..c612b8193f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java @@ -1,7 +1,8 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.oa; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveServiceImpl.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveServiceImpl.java index 31e881242d..ab9dcec42b 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/BpmOALeaveServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveServiceImpl.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.impl; +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa; import cn.hutool.core.date.DateUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*; import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.BpmOALeaveConvert; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.BpmOALeaveMapper; +import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -18,6 +18,7 @@ import javax.annotation.Resource; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * OA 请假申请 Service 实现类 diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java index fcc716db94..bd80d51dd3 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.listener; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventListener; import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.impl.BpmOALeaveServiceImpl; +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveServiceImpl; import org.springframework.stereotype.Component; import javax.annotation.Resource; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java index 8fb15f5ba2..badba2b9c7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.activity.BpmActivityRespVO; +import cn.iocoder.yudao.module.bpm.controller.task.vo.activity.BpmActivityRespVO; import java.util.List; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityServiceImpl.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityServiceImpl.java index 34f7604c08..f60351bd2b 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmActivityServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityServiceImpl.java @@ -1,13 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl; +package cn.iocoder.yudao.adminserver.modules.bpm.service.task; import cn.hutool.core.io.IoUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.activity.BpmActivityRespVO; import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmActivityConvert; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmActivityService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.bpm.controller.task.vo.activity.BpmActivityRespVO; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.HistoryService; @@ -24,7 +21,7 @@ import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * BPM 活动实例 Service 实现类 diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java index 1fc2bffc15..1942b13a07 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.*; +import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.*; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceServiceImpl.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceServiceImpl.java index 8aa06f3504..caf7fe14e1 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -1,29 +1,27 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl; +package cn.iocoder.yudao.adminserver.modules.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.*; import cn.iocoder.yudao.adminserver.modules.bpm.convert.message.BpmMessageConvert; import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmProcessInstanceConvert; +import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.*; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; +import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import lombok.extern.slf4j.Slf4j; import org.activiti.engine.HistoryService; import org.activiti.engine.RuntimeService; @@ -41,6 +39,7 @@ import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程实例 Service 实现类 @@ -65,9 +64,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService private HistoryService historyService; @Resource - private SysUserCoreService userCoreService; + private AdminUserApi adminUserApi; @Resource - private SysDeptCoreService deptCoreService; + private DeptApi deptApi; @Resource @Lazy // 解决循环依赖 private BpmTaskService taskService; @@ -189,10 +188,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); // 获得 User - SysUserDO startUser = userCoreService.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); - SysDeptDO dept = null; + AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); + DeptRespDTO dept = null; if (startUser != null) { - dept = deptCoreService.getDept(startUser.getDeptId()); + dept = deptApi.getDept(startUser.getDeptId()); } // 拼接结果 diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java index b6162dbd8e..796106a581 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*; +import cn.iocoder.yudao.module.bpm.controller.task.vo.task.*; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskServiceImpl.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskServiceImpl.java index b694b25aa8..0fc5385a0f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskServiceImpl.java @@ -1,25 +1,23 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl; +package cn.iocoder.yudao.adminserver.modules.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*; import cn.iocoder.yudao.adminserver.modules.bpm.convert.message.BpmMessageConvert; import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmTaskConvert; +import cn.iocoder.yudao.module.bpm.controller.task.vo.task.*; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmTaskExtMapper; +import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import lombok.extern.slf4j.Slf4j; import org.activiti.engine.HistoryService; import org.activiti.engine.TaskService; @@ -42,6 +40,7 @@ import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程任务实例 Service 实现类 @@ -59,9 +58,9 @@ public class BpmTaskServiceImpl implements BpmTaskService { private HistoryService historyService; @Resource - private SysUserCoreService userCoreService; + private AdminUserApi adminUserApi; @Resource - private SysDeptCoreService deptCoreService; + private DeptApi deptApi; @Resource @Lazy // 解决循环依赖 private BpmProcessInstanceService processInstanceService; @@ -95,9 +94,9 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 获得 User Map Set userIds = convertSet(tasks, task -> NumberUtils.parseLong(task.getAssignee())); userIds.add(NumberUtils.parseLong(processInstance.getStartUserId())); - Map userMap = userCoreService.getUserMap(userIds); + Map userMap = adminUserApi.getUserMap(userIds); // 获得 Dept Map - Map deptMap = deptCoreService.getDeptMap(convertSet(userMap.values(), SysUserDO::getDeptId)); + Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); // 拼接数据 return BpmTaskConvert.INSTANCE.convertList3(tasks, bpmTaskExtDOMap, processInstance, userMap, deptMap); @@ -144,7 +143,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { Map processInstanceMap = processInstanceService.getProcessInstanceMap( convertSet(tasks, Task::getProcessInstanceId)); // 获得 User Map - Map userMap = userCoreService.getUserMap( + Map userMap = adminUserApi.getUserMap( convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); // 拼接结果 return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap), @@ -180,7 +179,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { Map historicProcessInstanceMap = processInstanceService.getHistoricProcessInstanceMap( convertSet(tasks, HistoricTaskInstance::getProcessInstanceId)); // 获得 User Map - Map userMap = userCoreService.getUserMap( + Map userMap = adminUserApi.getUserMap( convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); // 拼接结果 return new PageResult<>(BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap), @@ -291,7 +290,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Override public void afterCommit() { ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - SysUserDO startUser = userCoreService.getUser(Long.valueOf(processInstance.getStartUserId())); + AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); messageService.sendMessageWhenTaskAssigned(BpmMessageConvert.INSTANCE.convert(processInstance, startUser, task)); } }); diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java index c10a614ae4..8d2e1b6723 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java @@ -1,21 +1,21 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.api.group.BpmUserGroupServiceApi; -import cn.iocoder.yudao.module.bpm.api.group.dto.BpmUserGroupDTO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.permission.SysPermissionCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; +import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.permission.PermissionApi; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -40,13 +40,14 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { @Mock private BpmTaskAssignRuleService bpmTaskRuleService; @Mock - private SysPermissionCoreService permissionCoreService; + private BpmUserGroupService userGroupService; + @Mock - private SysDeptCoreService deptCoreService; + private DeptApi deptApi; @Mock - private BpmUserGroupServiceApi userGroupServiceApi; + private AdminUserApi adminUserApi; @Mock - private SysUserCoreService userCoreService; + private PermissionApi permissionApi; @Test public void testCalculateTaskCandidateUsers_Role() { @@ -54,7 +55,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) .setType(BpmTaskAssignRuleTypeEnum.ROLE.getType()); // mock 方法 - when(permissionCoreService.getUserRoleIdListByRoleIds(eq(rule.getOptions()))) + when(permissionApi.getUserRoleIdListByRoleIds(eq(rule.getOptions()))) .thenReturn(asSet(11L, 22L)); mockGetUserMap(asSet(11L, 22L)); @@ -70,9 +71,9 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) .setType(BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType()); // mock 方法 - List users = CollectionUtils.convertList(asSet(11L, 22L), - id -> new SysUserDO().setId(id)); - when(userCoreService.getUsersByDeptIds(eq(rule.getOptions()))).thenReturn(users); + List users = CollectionUtils.convertList(asSet(11L, 22L), + id -> new AdminUserRespDTO().setId(id)); + when(adminUserApi.getUsersByDeptIds(eq(rule.getOptions()))).thenReturn(users); mockGetUserMap(asSet(11L, 22L)); // 调用 @@ -87,9 +88,9 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) .setType(BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType()); // mock 方法 - SysDeptDO dept1 = randomPojo(SysDeptDO.class, o -> o.setLeaderUserId(11L)); - SysDeptDO dept2 = randomPojo(SysDeptDO.class, o -> o.setLeaderUserId(22L)); - when(deptCoreService.getDepts(eq(rule.getOptions()))).thenReturn(Arrays.asList(dept1, dept2)); + DeptRespDTO dept1 = randomPojo(DeptRespDTO.class, o -> o.setLeaderUserId(11L)); + DeptRespDTO dept2 = randomPojo(DeptRespDTO.class, o -> o.setLeaderUserId(22L)); + when(deptApi.getDepts(eq(rule.getOptions()))).thenReturn(Arrays.asList(dept1, dept2)); mockGetUserMap(asSet(11L, 22L)); // 调用 @@ -104,9 +105,9 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) .setType(BpmTaskAssignRuleTypeEnum.POST.getType()); // mock 方法 - List users = CollectionUtils.convertList(asSet(11L, 22L), - id -> new SysUserDO().setId(id)); - when(userCoreService.getUsersByPostIds(eq(rule.getOptions()))).thenReturn(users); + List users = CollectionUtils.convertList(asSet(11L, 22L), + id -> new AdminUserRespDTO().setId(id)); + when(adminUserApi.getUsersByPostIds(eq(rule.getOptions()))).thenReturn(users); mockGetUserMap(asSet(11L, 22L)); // 调用 @@ -135,9 +136,9 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) .setType(BpmTaskAssignRuleTypeEnum.USER_GROUP.getType()); // mock 方法 - BpmUserGroupDTO userGroup1 = randomPojo(BpmUserGroupDTO.class, o -> o.setMemberUserIds(asSet(11L, 12L))); - BpmUserGroupDTO userGroup2 = randomPojo(BpmUserGroupDTO.class, o -> o.setMemberUserIds(asSet(21L, 22L))); - when(userGroupServiceApi.getUserGroupList(eq(rule.getOptions()))).thenReturn(Arrays.asList(userGroup1, userGroup2)); + BpmUserGroupDO userGroup1 = randomPojo(BpmUserGroupDO.class, o -> o.setMemberUserIds(asSet(11L, 12L))); + BpmUserGroupDO userGroup2 = randomPojo(BpmUserGroupDO.class, o -> o.setMemberUserIds(asSet(21L, 22L))); + when(userGroupService.getUserGroupList(eq(rule.getOptions()))).thenReturn(Arrays.asList(userGroup1, userGroup2)); mockGetUserMap(asSet(11L, 12L, 21L, 22L)); // 调用 @@ -190,13 +191,13 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { // 准备参数. 1L 可以找到;2L 是禁用的;3L 找不到 Set assigneeUserIds = asSet(1L, 2L, 3L); // mock 方法 - SysUserDO user1 = randomPojo(SysUserDO.class, o -> o.setId(1L) + AdminUserRespDTO user1 = randomPojo(AdminUserRespDTO.class, o -> o.setId(1L) .setStatus(CommonStatusEnum.ENABLE.getStatus())); - SysUserDO user2 = randomPojo(SysUserDO.class, o -> o.setId(2L) + AdminUserRespDTO user2 = randomPojo(AdminUserRespDTO.class, o -> o.setId(2L) .setStatus(CommonStatusEnum.DISABLE.getStatus())); - Map userMap = MapUtil.builder(user1.getId(), user1) + Map userMap = MapUtil.builder(user1.getId(), user1) .put(user2.getId(), user2).build(); - when(userCoreService.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); + when(adminUserApi.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); // 调用 behavior.removeDisableUsers(assigneeUserIds); @@ -205,9 +206,9 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest { } private void mockGetUserMap(Set assigneeUserIds) { - Map userMap = CollectionUtils.convertMap(assigneeUserIds, id -> id, - id -> new SysUserDO().setId(id).setStatus(CommonStatusEnum.ENABLE.getStatus())); - when(userCoreService.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); + Map userMap = CollectionUtils.convertMap(assigneeUserIds, id -> id, + id -> new AdminUserRespDTO().setId(id).setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(adminUserApi.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); } } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java index bc0ab21e6d..8be8fc4d17 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java @@ -1,16 +1,16 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.module.system.service.dept.SysDeptCoreService; -import cn.iocoder.yudao.module.system.service.user.SysUserCoreService; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.activiti.engine.impl.persistence.entity.ExecutionEntityImpl; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.impl.persistence.entity.TaskEntityImpl; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; -import org.mockito.Mock; +import org.springframework.boot.test.mock.mockito.MockBean; import java.util.Set; @@ -25,18 +25,18 @@ class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { @InjectMocks private BpmTaskAssignLeaderX2Script script; - @Mock - private SysUserCoreService userCoreService; - @Mock - private SysDeptCoreService deptCoreService; + @MockBean + private AdminUserApi adminUserApi; + @MockBean + private DeptApi deptApi; @Test public void testCalculateTaskCandidateUsers_noDept() { // 准备参数 TaskEntity task = buildTaskEntity(1L); // mock 方法(startUser) - SysUserDO startUser = randomPojo(SysUserDO.class, o -> o.setDeptId(10L)); - when(userCoreService.getUser(eq(1L))).thenReturn(startUser); + AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); + when(adminUserApi.getUser(eq(1L))).thenReturn(startUser); // 调用 Set result = script.calculateTaskCandidateUsers(task); @@ -49,11 +49,11 @@ class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { // 准备参数 TaskEntity task = buildTaskEntity(1L); // mock 方法(startUser) - SysUserDO startUser = randomPojo(SysUserDO.class, o -> o.setDeptId(10L)); - when(userCoreService.getUser(eq(1L))).thenReturn(startUser); - SysDeptDO startUserDept = randomPojo(SysDeptDO.class, o -> o.setId(10L).setParentId(100L) + AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); + when(adminUserApi.getUser(eq(1L))).thenReturn(startUser); + DeptRespDTO startUserDept = randomPojo(DeptRespDTO.class, o -> o.setId(10L).setParentId(100L) .setLeaderUserId(20L)); - when(deptCoreService.getDept(eq(10L))).thenReturn(startUserDept); + when(deptApi.getDept(eq(10L))).thenReturn(startUserDept); // 调用 Set result = script.calculateTaskCandidateUsers(task); @@ -66,15 +66,15 @@ class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { // 准备参数 TaskEntity task = buildTaskEntity(1L); // mock 方法(startUser) - SysUserDO startUser = randomPojo(SysUserDO.class, o -> o.setDeptId(10L)); - when(userCoreService.getUser(eq(1L))).thenReturn(startUser); - SysDeptDO startUserDept = randomPojo(SysDeptDO.class, o -> o.setId(10L).setParentId(100L) + AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); + when(adminUserApi.getUser(eq(1L))).thenReturn(startUser); + DeptRespDTO startUserDept = randomPojo(DeptRespDTO.class, o -> o.setId(10L).setParentId(100L) .setLeaderUserId(20L)); - when(deptCoreService.getDept(eq(10L))).thenReturn(startUserDept); + when(deptApi.getDept(eq(10L))).thenReturn(startUserDept); // mock 方法(父 dept) - SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setId(100L).setParentId(1000L) + DeptRespDTO parentDept = randomPojo(DeptRespDTO.class, o -> o.setId(100L).setParentId(1000L) .setLeaderUserId(200L)); - when(deptCoreService.getDept(eq(100L))).thenReturn(parentDept); + when(deptApi.getDept(eq(100L))).thenReturn(parentDept); // 调用 Set result = script.calculateTaskCandidateUsers(task); diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java index 323827d4f1..f443765cd5 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; diff --git a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index ad12b40a69..fcfe3ae511 100644 --- a/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobile import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApi.java new file mode 100644 index 0000000000..d228fc3b71 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApi.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.system.api.dept; + +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 部门 API 接口 + * + * @author 芋道源码 + */ +public interface DeptApi { + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + DeptRespDTO getDept(Long id); + + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDepts(Collection ids); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validDepts(Collection ids); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + Map getDeptMap(Set ids); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApi.java new file mode 100644 index 0000000000..d1e3d47a1d --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApi.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.system.api.dept; + +import java.util.Collection; + +/** + * 岗位 API 接口 + * + * @author 芋道源码 + */ +public interface PostApi { + + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validPosts(Collection ids); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/dto/DeptRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/dto/DeptRespDTO.java new file mode 100644 index 0000000000..d3e66fdd83 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/dto/DeptRespDTO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.system.api.dept.dto; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 部门 Response DTO + * + * @author 芋道源码 + */ +@Data +public class DeptRespDTO { + + /** + * 部门编号 + */ + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门编号 + */ + private Long parentId; + /** + * 负责人的用户编号 + */ + private Long leaderUserId; + /** + * 部门状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApi.java new file mode 100644 index 0000000000..35393a04a2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApi.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.system.api.dict; + +import java.util.Collection; + +/** + * 字典数据 API 接口 + * + * @author 芋道源码 + */ +public interface DictDataApi { + + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validDictDatas(String dictType, Collection values); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/permission/PermissionApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/permission/PermissionApi.java new file mode 100644 index 0000000000..04e9638696 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/permission/PermissionApi.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.system.api.permission; + +import java.util.Collection; +import java.util.Set; + +/** + * 权限 API 接口 + * + * @author 芋道源码 + */ +public interface PermissionApi { + + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleIds(Collection roleIds); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/permission/RoleApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/permission/RoleApi.java new file mode 100644 index 0000000000..14133e9d90 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/permission/RoleApi.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.system.api.permission; + +import java.util.Collection; + +/** + * 角色 API 接口 + * + * @author 芋道源码 + */ +public interface RoleApi { + + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validRoles(Collection ids); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java index 1a3aea7eee..ffcf46dc08 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.system.api.sms; import cn.iocoder.yudao.framework.common.exception.ServiceException; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import javax.validation.Valid; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApi.java new file mode 100644 index 0000000000..c86bbf503f --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApi.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.api.sms; + +import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; + +import javax.validation.Valid; + +/** + * 短信发送 API 接口 + * + * @author 芋道源码 + */ +public interface SmsSendApi { + + /** + * 发送单条短信给 Admin 用户 + * + * 在 mobile 为空时,使用 userId 加载对应 Admin 的手机号 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleSmsToAdmin(@Valid SmsSendSingleToUserReqDTO reqDTO); + + /** + * 发送单条短信给 Member 用户 + * + * 在 mobile 为空时,使用 userId 加载对应 Member 的手机号 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleSmsToMember(@Valid SmsSendSingleToUserReqDTO reqDTO); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeCheckReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java similarity index 92% rename from yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeCheckReqDTO.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java index 2fd1ed6687..d6ca3c6983 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeCheckReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.api.sms.dto; +package cn.iocoder.yudao.module.system.api.sms.dto.code; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeSendReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java similarity index 92% rename from yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeSendReqDTO.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java index 088899aac4..2d2a4c7e39 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeSendReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.api.sms.dto; +package cn.iocoder.yudao.module.system.api.sms.dto.code; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeUseReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java similarity index 93% rename from yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeUseReqDTO.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java index eedc2a90a2..3a639f46e1 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeUseReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.system.api.sms.dto; +package cn.iocoder.yudao.module.system.api.sms.dto.code; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.Mobile; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java new file mode 100644 index 0000000000..7701f714e3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.system.api.sms.dto.send; + +import cn.iocoder.yudao.framework.common.validation.Mobile; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * 短信发送给 Admin 或者 Member 用户 + * + * @author 芋道源码 + */ +@Data +public class SmsSendSingleToUserReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 手机号 + */ + @Mobile + private String mobile; + /** + * 短信模板编号 + */ + @NotEmpty(message = "短信模板编号不能为空") + private String templateCode; + /** + * 短信模板参数 + */ + private Map templateParams; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java new file mode 100644 index 0000000000..d994b0cb33 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.system.api.user; + +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Admin 用户 API 接口 + * + * @author 芋道源码 + */ +public interface AdminUserApi { + + /** + * 通过用户 ID 查询用户 + * + * @param id 用户ID + * @return 用户对象信息 + */ + AdminUserRespDTO getUser(Long id); + + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUsersByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUsersByPostIds(Collection postIds); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + Map getUserMap(Collection ids); + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validUsers(Set ids); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java new file mode 100644 index 0000000000..ac13c3a8b0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.system.api.user.dto; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +import java.util.Set; + +/** + * Admin 用户 Response DTO + * + * @author 芋道源码 + */ +@Data +public class AdminUserRespDTO { + + /** + * 用户ID + */ + private Long id; + /** + * 用户昵称 + */ + private String nickname; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + + /** + * 部门ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + private Set postIds; + /** + * 手机号码 + */ + private String mobile; + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApiImpl.java new file mode 100644 index 0000000000..27fbc2f13c --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApiImpl.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.system.api.dept; + +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.convert.dept.DeptConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 部门 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class DeptApiImpl implements DeptApi { + + @Resource + private DeptService deptService; + + @Override + public DeptRespDTO getDept(Long id) { + DeptDO dept = deptService.getDept(id); + return DeptConvert.INSTANCE.convert03(dept); + } + + @Override + public List getDepts(Collection ids) { + List depts = deptService.getDepts(ids); + return DeptConvert.INSTANCE.convertList03(depts); + } + + @Override + public void validDepts(Collection ids) { + deptService.validDepts(ids); + } + + @Override + public Map getDeptMap(Set ids) { + Map depts = deptService.getDeptMap(ids); + return DeptConvert.INSTANCE.convertMap(depts); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/permission/PermissionApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/permission/PermissionApiImpl.java new file mode 100644 index 0000000000..5d2b550781 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/permission/PermissionApiImpl.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.system.api.permission; + +import cn.iocoder.yudao.module.system.service.permission.PermissionService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Set; + +/** + * 权限 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class PermissionApiImpl implements PermissionApi { + + @Resource + private PermissionService permissionService; + + @Override + public Set getUserRoleIdListByRoleIds(Collection roleIds) { + return permissionService.getUserRoleIdListByRoleIds(roleIds); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java index 73d73b42f2..81957e0828 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.api.sms; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.service.sms.SmsCodeService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApiImpl.java new file mode 100644 index 0000000000..ee5812d3c3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApiImpl.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.api.sms; + +import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; +import cn.iocoder.yudao.module.system.service.sms.SmsSendService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 短信发送 API 接口 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SmsSendApiImpl implements SmsSendApi { + + @Resource + private SmsSendService smsSendService; + + @Override + public Long sendSingleSmsToAdmin(SmsSendSingleToUserReqDTO reqDTO) { + return smsSendService.sendSingleSmsToAdmin(reqDTO.getMobile(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + + @Override + public Long sendSingleSmsToMember(SmsSendSingleToUserReqDTO reqDTO) { + return smsSendService.sendSingleSmsToMember(reqDTO.getMobile(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java new file mode 100644 index 0000000000..372e6f5e6e --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.api.user; + +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import cn.iocoder.yudao.module.system.convert.user.UserConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Admin 用户 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class AdminUserApiImpl implements AdminUserApi { + + @Resource + private AdminUserService userService; + + @Override + public AdminUserRespDTO getUser(Long id) { + AdminUserDO user = userService.getUser(id); + return UserConvert.INSTANCE.convert4(user); + } + + @Override + public List getUsersByDeptIds(Collection deptIds) { + List users = userService.getUsersByDeptIds(deptIds); + return UserConvert.INSTANCE.convertList4(users); + } + + @Override + public List getUsersByPostIds(Collection postIds) { + List users = userService.getUsersByPostIds(postIds); + return UserConvert.INSTANCE.convertList4(users); + } + + @Override + public Map getUserMap(Collection ids) { + Map userMap = userService.getUserMap(ids); + return UserConvert.INSTANCE.convertMap4(userMap); + } + + @Override + public void validUsers(Set ids) { + userService.validUsers(ids); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java index 8d921131c7..2a514743b8 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/dept/DeptConvert.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.convert.dept; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; @@ -9,6 +10,7 @@ import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.List; +import java.util.Map; @Mapper public interface DeptConvert { @@ -25,4 +27,10 @@ public interface DeptConvert { DeptDO convert(DeptUpdateReqVO bean); + List convertList03(List list); + + DeptRespDTO convert03(DeptDO bean); + + Map convertMap(Map map); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java index cf2b1692b7..2e8a473366 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/user/UserConvert.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.convert.user; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; @@ -13,6 +14,7 @@ import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.List; +import java.util.Map; @Mapper public interface UserConvert { @@ -46,4 +48,11 @@ public interface UserConvert { List convertList03(List list); List convertList04(List list); + + AdminUserRespDTO convert4(AdminUserDO bean); + + List convertList4(List users); + + Map convertMap4(Map map); + } diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java index 3716c906f2..a6c30bc10d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java @@ -46,7 +46,6 @@ public interface DeptService { */ void deleteDept(Long id); - /** * 筛选部门列表 * diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java index f427b6a2f5..f71b8a6bdf 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.iocoder.yudao.framework.common.exception.ServiceException; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import javax.validation.Valid; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java index b30f31dd07..c1d366584d 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java @@ -4,9 +4,9 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO; -import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO; import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper; import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; @@ -36,11 +36,6 @@ public class SmsCodeServiceImpl implements SmsCodeService { @Resource private SmsCodeMapper smsCodeMapper; - @Resource - private AdminUserService adminUserService; - @Resource - private MemberUserApi memberUserApi; - @Resource private SmsSendService smsSendService; From bdcf00d8a0dbcb4e30473166fa5f4db938e59fb5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 1 Feb 2022 21:58:36 +0800 Subject: [PATCH 28/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=208=EF=BC=9Abom=20=E6=A8=A1=E5=9D=97=EF=BC=8C?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-module-bpm/TODO.md | 7 --- yudao-module-bpm/yudao-module-bpm-api/pom.xml | 7 +++ .../bpm/api/task/BpmProcessInstanceApi.java | 23 ++++++++ .../dto/BpmProcessInstanceCreateReqDTO.java | 2 +- .../definition/BpmFormController.java} | 6 +- .../definition/BpmUserGroupController.java | 10 ++-- .../definition/vo/form/BpmFormBaseVO.java | 2 +- .../vo/form/BpmFormCreateReqVO.java | 2 +- .../definition/vo/form/BpmFormPageReqVO.java | 2 +- .../definition/vo/form/BpmFormRespVO.java | 2 +- .../vo/form/BpmFormSimpleRespVO.java | 2 +- .../vo/form/BpmFormUpdateReqVO.java | 2 +- .../vo/group/BpmUserGroupBaseVO.java | 2 +- .../vo/group/BpmUserGroupCreateReqVO.java | 2 +- .../vo/group/BpmUserGroupPageReqVO.java | 2 +- .../vo/group/BpmUserGroupRespVO.java | 2 +- .../vo/group/BpmUserGroupSimpleRespVO.java | 2 +- .../vo/group/BpmUserGroupUpdateReqVO.java | 2 +- .../vo/model/BpmModeImportReqVO.java | 2 +- .../definition/vo/model/BpmModelBaseVO.java | 2 +- .../vo/model/BpmModelCreateReqVO.java | 2 +- .../vo/model/BpmModelPageItemRespVO.java | 2 +- .../definition/vo/model/BpmModelRespVO.java | 2 +- .../vo/model/BpmModelUpdateReqVO.java | 2 +- .../vo/model/BpmModelUpdateStateReqVO.java | 2 +- .../definition/vo/model/ModelPageReqVO.java | 2 +- .../BpmProcessDefinitionListReqVO.java | 2 +- .../BpmProcessDefinitionPageItemRespVO.java | 2 +- .../BpmProcessDefinitionPageReqVO.java | 2 +- .../process/BpmProcessDefinitionRespVO.java | 2 +- .../vo/rule/BpmTaskAssignRuleBaseVO.java | 2 +- .../vo/rule/BpmTaskAssignRuleCreateReqVO.java | 2 +- .../vo/rule/BpmTaskAssignRuleRespVO.java | 2 +- .../vo/rule/BpmTaskAssignRuleUpdateReqVO.java | 2 +- .../admin}/oa/BpmOALeaveController.http | 0 .../admin}/oa/BpmOALeaveController.java | 12 ++-- .../bpm/controller/admin/oa/package-info.java | 5 ++ .../{ => admin}/oa/vo/BpmOALeaveBaseVO.java | 2 +- .../oa/vo/BpmOALeaveCreateReqVO.java | 2 +- .../oa/vo/BpmOALeavePageReqVO.java | 2 +- .../{ => admin}/oa/vo/BpmOALeaveRespVO.java | 2 +- .../controller/admin/task/package-info.java | 1 + .../task/vo/activity/BpmActivityRespVO.java | 2 +- .../BpmProcessInstanceCancelReqVO.java | 2 +- .../BpmProcessInstanceCreateReqVO.java | 2 +- .../BpmProcessInstanceMyPageReqVO.java | 2 +- .../BpmProcessInstancePageItemRespVO.java | 2 +- .../vo/instance/BpmProcessInstanceRespVO.java | 2 +- .../task/vo/task/BpmTaskApproveReqVO.java | 2 +- .../vo/task/BpmTaskDonePageItemRespVO.java | 2 +- .../task/vo/task/BpmTaskDonePageReqVO.java | 2 +- .../task/vo/task/BpmTaskRejectReqVO.java | 2 +- .../task/vo/task/BpmTaskRespVO.java | 2 +- .../vo/task/BpmTaskTodoPageItemRespVO.java | 2 +- .../task/vo/task/BpmTaskTodoPageReqVO.java | 2 +- .../vo/task/BpmTaskUpdateAssigneeReqVO.java | 2 +- .../bpm/controller/app/package-info.java | 4 ++ .../bpm/controller/oa/package-info.java | 1 - .../module/bpm/controller/package-info.java | 6 ++ .../bpm/controller/task/package-info.java | 1 - .../convert/definition/BpmFormConvert.java | 8 +-- .../definition/BpmUserGroupConvert.java | 6 +- .../bpm/convert/oa/BpmOALeaveConvert.java | 6 +- .../module/bpm/convert/oa/package-info.java | 1 - .../dal/mysql/definition/BpmFormMapper.java | 2 +- .../mysql/definition/BpmUserGroupMapper.java | 2 +- .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 2 +- .../task/BpmProcessInstanceExtMapper.java | 2 +- .../bpm/config/BpmCommonConfiguration.java | 19 +++++++ .../event/BpmProcessInstanceResultEvent.java | 2 +- ...BpmProcessInstanceResultEventListener.java | 2 +- ...pmProcessInstanceResultEventPublisher.java | 2 +- .../bpm}/core/event/package-info.java | 2 +- .../bpm/framework/bpm/core/package-info.java | 4 ++ .../bpm/framework/bpm/package-info.java | 6 ++ .../module}/bpm/framework/package-info.java | 2 +- .../yudao/module/bpm/package-info.java | 9 +++ .../service/definition/BpmFormService.java | 6 +- .../definition/BpmFormServiceImpl.java | 6 +- .../definition/BpmUserGroupService.java | 6 +- .../definition/BpmUserGroupServiceImpl.java | 6 +- .../bpm/service/oa/BpmOALeaveService.java | 8 +-- .../bpm/service/oa/BpmOALeaveServiceImpl.java | 24 ++++---- .../oa/listener/BpmOALeaveResultListener.java | 10 ++-- .../definition/BpmFormServiceTest.java | 9 ++- .../definition/BpmUserGroupServiceTest.java | 9 ++- .../convert/message/BpmMessageConvert.java | 57 ------------------- .../yudao/module/bpm/api/package-info.java | 4 ++ .../api/task/BpmProcessInstanceApiImpl.java | 27 +++++++++ .../admin}/definition/BpmModelController.java | 8 +-- .../BpmProcessDefinitionController.http | 0 .../BpmProcessDefinitionController.java | 12 ++-- .../BpmTaskAssignRuleController.http | 0 .../BpmTaskAssignRuleController.java | 10 ++-- .../admin}/task/BpmActivityController.java | 6 +- .../task/BpmProcessInstanceController.http | 0 .../task/BpmProcessInstanceController.java | 6 +- .../admin}/task/BpmTaskController.http | 0 .../admin}/task/BpmTaskController.java | 6 +- .../bpm/controller/app/package-info.java | 4 ++ .../module/bpm/controller/package-info.java | 6 ++ .../convert/definition/BpmModelConvert.java | 8 +-- .../BpmProcessDefinitionConvert.java | 8 +-- .../definition/BpmTaskAssignRuleConvert.java | 8 +-- .../bpm/convert/package-info.java | 2 +- .../bpm/convert/task/BpmActivityConvert.java | 4 +- .../task/BpmProcessInstanceConvert.java | 26 +++++++-- .../bpm/convert/task/BpmTaskConvert.java | 29 ++++++++-- ...g Boot 对象转换 MapStruct 入门》.md | 0 .../config/BpmActivitiConfiguration.java | 19 ++----- .../behavior/BpmActivityBehaviorFactory.java | 6 +- .../behavior/BpmUserTaskActivitiBehavior.java | 6 +- .../activiti/core/behavior/package-info.java | 2 +- .../behavior/script/BpmTaskAssignScript.java | 2 +- .../BpmTaskAssignLeaderAbstractScript.java | 4 +- .../impl/BpmTaskAssignLeaderX1Script.java | 2 +- .../impl/BpmTaskAssignLeaderX2Script.java | 2 +- .../impl/BpmTaskAssignStartUserScript.java | 4 +- .../core/identity/EmptyUserGroupManager.java | 2 +- .../BpmProcessInstanceEventListener.java | 4 +- .../BpmTackActivitiEventListener.java | 5 +- .../core/listener/BpmTaskEventListener.java | 4 +- .../activiti/core/listener/package-info.java | 2 +- .../module/bpm/framework/package-info.java | 6 ++ .../modules => module}/bpm/package-info.java | 7 ++- .../service/definition/BpmModelService.java | 4 +- .../definition/BpmModelServiceImpl.java | 13 ++--- .../BpmProcessDefinitionService.java | 12 ++-- .../BpmProcessDefinitionServiceImpl.java | 15 +++-- .../definition/BpmTaskAssignRuleService.java | 8 +-- .../BpmTaskAssignRuleServiceImpl.java | 11 ++-- .../dto/BpmModelMetaInfoRespDTO.java | 2 +- .../dto/BpmProcessDefinitionCreateReqDTO.java | 2 +- .../bpm/service/task/BpmActivityService.java | 4 +- .../service/task/BpmActivityServiceImpl.java | 8 +-- .../task/BpmProcessInstanceService.java | 6 +- .../task/BpmProcessInstanceServiceImpl.java | 17 +++--- .../bpm/service/task/BpmTaskService.java | 4 +- .../bpm/service/task/BpmTaskServiceImpl.java | 9 ++- .../bpm/service/task/package-info.java | 2 +- .../modules/bpm/service/package-info.java | 1 - .../BpmUserTaskActivitiBehaviorTest.java | 6 +- .../impl/BpmTaskAssignLeaderX2ScriptTest.java | 7 ++- .../module/bpm/service/package-info.java | 1 + .../bpm/test}/BaseDbUnitTest.java | 2 +- .../test/resources/application-unit-test.yaml | 12 ++++ .../src/test/resources/application.yaml | 35 ------------ .../{logback-spring.xml => logback.xml} | 0 .../yudao-module-system-api/pom.xml | 1 + .../module/system/api/dept/PostApiImpl.java | 24 ++++++++ .../system/api/dict/DictDataApiImpl.java | 25 ++++++++ .../system/api/permission/RoleApiImpl.java | 24 ++++++++ 152 files changed, 523 insertions(+), 378 deletions(-) delete mode 100644 yudao-module-bpm/TODO.md create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service => yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api}/task/dto/BpmProcessInstanceCreateReqDTO.java (90%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{definition/FormController.java => admin/definition/BpmFormController.java} (94%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/BpmUserGroupController.java (88%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/form/BpmFormBaseVO.java (91%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/form/BpmFormCreateReqVO.java (90%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/form/BpmFormPageReqVO.java (86%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/form/BpmFormRespVO.java (93%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/form/BpmFormSimpleRespVO.java (84%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/form/BpmFormUpdateReqVO.java (91%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/group/BpmUserGroupBaseVO.java (92%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/group/BpmUserGroupCreateReqVO.java (75%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/group/BpmUserGroupPageReqVO.java (93%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/group/BpmUserGroupRespVO.java (85%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/group/BpmUserGroupSimpleRespVO.java (87%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/group/BpmUserGroupUpdateReqVO.java (84%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/model/BpmModeImportReqVO.java (90%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/model/BpmModelBaseVO.java (96%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/model/BpmModelCreateReqVO.java (90%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/model/BpmModelPageItemRespVO.java (94%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/model/BpmModelRespVO.java (89%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/model/BpmModelUpdateReqVO.java (95%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/model/BpmModelUpdateStateReqVO.java (88%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/model/ModelPageReqVO.java (91%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/process/BpmProcessDefinitionListReqVO.java (87%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java (88%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/process/BpmProcessDefinitionPageReqVO.java (87%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/process/BpmProcessDefinitionRespVO.java (96%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/rule/BpmTaskAssignRuleBaseVO.java (91%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java (91%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/rule/BpmTaskAssignRuleRespVO.java (93%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java (89%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin}/oa/BpmOALeaveController.http (100%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin}/oa/BpmOALeaveController.java (83%) create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/package-info.java rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/oa/vo/BpmOALeaveBaseVO.java (95%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/oa/vo/BpmOALeaveCreateReqVO.java (89%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/oa/vo/BpmOALeavePageReqVO.java (95%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/oa/vo/BpmOALeaveRespVO.java (94%) create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/package-info.java rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/activity/BpmActivityRespVO.java (92%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/instance/BpmProcessInstanceCancelReqVO.java (90%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/instance/BpmProcessInstanceCreateReqVO.java (88%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/instance/BpmProcessInstanceMyPageReqVO.java (95%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/instance/BpmProcessInstancePageItemRespVO.java (95%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/instance/BpmProcessInstanceRespVO.java (98%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/task/BpmTaskApproveReqVO.java (91%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/task/BpmTaskDonePageItemRespVO.java (92%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/task/BpmTaskDonePageReqVO.java (93%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/task/BpmTaskRejectReqVO.java (89%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/task/BpmTaskRespVO.java (94%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/task/BpmTaskTodoPageItemRespVO.java (96%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/task/BpmTaskTodoPageReqVO.java (93%) rename yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/{ => admin}/task/vo/task/BpmTaskUpdateAssigneeReqVO.java (92%) create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/package-info.java create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/package-info.java rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/convert/oa/BpmOALeaveConvert.java (75%) delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/package-info.java create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCommonConfiguration.java rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm}/core/event/BpmProcessInstanceResultEvent.java (93%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm}/core/event/BpmProcessInstanceResultEventListener.java (91%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm}/core/event/BpmProcessInstanceResultEventPublisher.java (87%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm}/core/event/package-info.java (56%) create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/package-info.java create mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/package-info.java rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/framework/package-info.java (55%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/service/oa/BpmOALeaveService.java (83%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/service/oa/BpmOALeaveServiceImpl.java (80%) rename yudao-module-bpm/{yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules => yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module}/bpm/service/oa/listener/BpmOALeaveResultListener.java (58%) rename yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmFormServiceTest.java (92%) rename yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmUserGroupServiceTest.java (92%) delete mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java create mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java create mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/definition/BpmModelController.java (92%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/definition/BpmProcessDefinitionController.http (100%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/definition/BpmProcessDefinitionController.java (79%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/definition/BpmTaskAssignRuleController.http (100%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/definition/BpmTaskAssignRuleController.java (83%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/task/BpmActivityController.java (91%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/task/BpmProcessInstanceController.http (100%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/task/BpmProcessInstanceController.java (92%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/task/BpmTaskController.http (100%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules/bpm/controller => module/bpm/controller/admin}/task/BpmTaskController.java (93%) create mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java create mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/definition/BpmModelConvert.java (94%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/definition/BpmProcessDefinitionConvert.java (90%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/definition/BpmTaskAssignRuleConvert.java (80%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/package-info.java (57%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/task/BpmActivityConvert.java (82%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/task/BpmProcessInstanceConvert.java (78%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/task/BpmTaskConvert.java (79%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md (100%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/config/BpmActivitiConfiguration.java (76%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java (87%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java (97%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/package-info.java (83%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java (89%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java (91%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java (87%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java (87%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java (79%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java (91%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java (93%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java (87%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/listener/BpmTaskEventListener.java (93%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/listener/package-info.java (78%) create mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/package-info.java (52%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmModelService.java (92%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmModelServiceImpl.java (95%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmProcessDefinitionService.java (88%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmProcessDefinitionServiceImpl.java (94%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmTaskAssignRuleService.java (87%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java (94%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java (92%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java (97%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/task/BpmActivityService.java (90%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/task/BpmActivityServiceImpl.java (90%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/task/BpmProcessInstanceService.java (95%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/task/BpmProcessInstanceServiceImpl.java (95%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/task/BpmTaskService.java (97%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/task/BpmTaskServiceImpl.java (97%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/service/task/package-info.java (89%) delete mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java (96%) rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/{adminserver/modules => module}/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java (96%) create mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/service/package-info.java rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/{adminserver => module/bpm/test}/BaseDbUnitTest.java (97%) delete mode 100644 yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application.yaml rename yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/{logback-spring.xml => logback.xml} (100%) create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/permission/RoleApiImpl.java diff --git a/yudao-module-bpm/TODO.md b/yudao-module-bpm/TODO.md deleted file mode 100644 index d155eaa5f9..0000000000 --- a/yudao-module-bpm/TODO.md +++ /dev/null @@ -1,7 +0,0 @@ -1. 类名可以去掉 Bpm 前缀哈 - -2. 后续接口我们分成 admin 管理后天,app 用户前端;所以 controller 包下,需要有 admin 和 app 两个子包。可见 https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/feature/multi-module/yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller - -3. yudao-module-bpm-core-service-impl 模块,要不改成 yudao-module-bpm-base,本质上是提供给 yudao-module-bpm-flowable-impl 和 yudao-module-bpm-activiti-impl 继承的。这样的话,我们在 yudao-module-bpm-base: - * 定义一些可被继承的类,例如说 ModelAbstractService; - * 定义一些无需被继承的类,例如说 UserGroupService、UserGroupController 等等; diff --git a/yudao-module-bpm/yudao-module-bpm-api/pom.xml b/yudao-module-bpm/yudao-module-bpm-api/pom.xml index 60ebd556c3..91cd35be85 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/pom.xml +++ b/yudao-module-bpm/yudao-module-bpm-api/pom.xml @@ -21,6 +21,13 @@ cn.iocoder.boot yudao-common + + + + org.springframework.boot + spring-boot-starter-validation + true + diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java new file mode 100644 index 0000000000..e94a2c84fe --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.bpm.api.task; + +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; + +import javax.validation.Valid; + +/** + * 流程实例 Api 接口 + * + * @author 芋道源码 + */ +public interface BpmProcessInstanceApi { + + /** + * 创建流程实例(提供给内部) + * + * @param userId 用户编号 + * @param reqDTO 创建信息 + * @return 实例的编号 + */ + String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO); + +} diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java index 9729721078..5d7edbe804 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/dto/BpmProcessInstanceCreateReqDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto; +package cn.iocoder.yudao.module.bpm.api.task.dto; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/FormController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmFormController.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/FormController.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmFormController.java index 34b712ff25..f6b4e2a696 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/FormController.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmFormController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.module.bpm.controller.definition; +package cn.iocoder.yudao.module.bpm.controller.admin.definition; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.*; import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @RestController @RequestMapping("/bpm/form") @Validated -public class FormController { +public class BpmFormController { @Resource private BpmFormService formService; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/BpmUserGroupController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmUserGroupController.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/BpmUserGroupController.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmUserGroupController.java index 1051a78f54..09cccc4d6a 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/BpmUserGroupController.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmUserGroupController.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.module.bpm.controller.definition; +package cn.iocoder.yudao.module.bpm.controller.admin.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; import cn.iocoder.yudao.module.bpm.convert.definition.BpmUserGroupConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormBaseVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormBaseVO.java index 1eb2ccd822..11fee5c00f 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormCreateReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormCreateReqVO.java index 7068015830..b43ca78741 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java similarity index 86% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java index 5576f80d6e..3b2d8645cb 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java index 6aef371f5e..c34a77d52c 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSimpleRespVO.java similarity index 84% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSimpleRespVO.java index 8c622d68f2..f07314ffe5 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormUpdateReqVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormUpdateReqVO.java index c81df497e2..b9886cc65c 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.form; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupBaseVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupBaseVO.java index f18b8520d1..e0dfe568e4 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; import lombok.*; import java.util.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupCreateReqVO.java similarity index 75% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupCreateReqVO.java index deb647da6a..657a104787 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java index e8f0766699..3ec250413b 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.date.DateUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java similarity index 85% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java index 72f83b97cc..dc18aee583 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; import lombok.*; import java.util.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSimpleRespVO.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSimpleRespVO.java index 09d760addf..422213ded8 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupUpdateReqVO.java similarity index 84% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupUpdateReqVO.java index f9760d550c..72a1496a38 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.group; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModeImportReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModeImportReqVO.java index bd04d71272..8218271faf 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModeImportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java similarity index 96% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java index 04bf6c7101..542a177e48 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelCreateReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelCreateReqVO.java index 62923dca7c..7583d8a035 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java index 4ad529eadb..d0f1e5634f 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java index 438ae3af11..e039829a32 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java index 2159d66c0f..60eb975087 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java index 7604c98ab7..34d97a8c70 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/ModelPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/ModelPageReqVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/ModelPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/ModelPageReqVO.java index 5511b3726d..6b36e39b4d 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/model/ModelPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/ModelPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java index f19d75c474..a14bb15f49 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.process; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java index 414377af54..1f3c1faa4f 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.process; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java index 93bf0b738e..c9ad096bf5 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.process; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java similarity index 96% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java index 450c67d751..228a5afa18 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.process; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleBaseVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleBaseVO.java index 9db2c9bca7..bcb9fc0f03 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.rule; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java index 6d4937f9c8..2296a5cc27 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.rule; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleRespVO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleRespVO.java index d718cb6f50..d1f6a06966 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.rule; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java index cedceb2a36..8555610ee8 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.definition.vo.rule; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.http rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.http diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java similarity index 83% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java index 47ac08735f..17549e1cfd 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/BpmOALeaveController.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java @@ -1,13 +1,13 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa; +package cn.iocoder.yudao.module.bpm.controller.admin.oa; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.BpmOALeaveConvert; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO; +import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/package-info.java new file mode 100644 index 0000000000..7028708b1e --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/package-info.java @@ -0,0 +1,5 @@ +/** + * OA 示例,用于演示外部业务接入 BPM 工作流的示例 + * 一般的接入方式,只需要调用 接口,后续 Admin 用户在管理后台的【待办事务】进行审批 + */ +package cn.iocoder.yudao.module.bpm.controller.admin.oa; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java index 6790cf28f1..cbc568a11c 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.oa.vo; +package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; import lombok.*; import java.util.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java index 2e4ec99d07..17326a914a 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.oa.vo; +package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java index 2c7cbb8f04..e19c058897 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.oa.vo; +package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; import lombok.*; import java.util.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java index 6627c74739..b8ac072fc4 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.oa.vo; +package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; import lombok.*; import io.swagger.annotations.*; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/package-info.java new file mode 100644 index 0000000000..6cf7f955b5 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.bpm.controller.admin.task; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java index 3e6ca5423d..e7d8eb4914 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.activity; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java index a9e7d0680c..2bedab8d30 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java index 301c7f176e..72600abd76 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java index 61ad3a8a2a..2f5e0ae513 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java index 3ca93ecbd5..74b9bcad24 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java similarity index 98% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java index 75d05e2a71..cb04393f99 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.instance; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java index a4af326de1..a4e10aeefa 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java index 1ba195ab0c..c9ab5f92c0 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageReqVO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageReqVO.java index 681e5c6e53..2a39a4af47 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java index 19e40b317a..d431bb2406 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java index 97dbc826ef..ad01ed2f3d 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageItemRespVO.java similarity index 96% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageItemRespVO.java index 5d1dc6296f..90a3b110a2 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageItemRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java index 64153b7360..5d6a2b1962 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUpdateAssigneeReqVO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUpdateAssigneeReqVO.java index 400a24577d..a7f96b1373 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUpdateAssigneeReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.bpm.controller.task.vo.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java new file mode 100644 index 0000000000..e8d285e359 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package cn.iocoder.yudao.module.bpm.controller.app; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/package-info.java deleted file mode 100644 index 2fe59f5721..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/oa/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.oa; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java new file mode 100644 index 0000000000..d1930bd6ac --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package cn.iocoder.yudao.module.bpm.controller; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/package-info.java deleted file mode 100644 index 8be8f21c57..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/task/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.task; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java index 3baca0916b..6ba7574170 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.bpm.convert.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormSimpleRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormSimpleRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java index 02a7845517..bbf00ba524 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.bpm.convert.definition; import java.util.*; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java similarity index 75% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java index c8af88fc16..f87531bfc5 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/BpmOALeaveConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.oa; +package cn.iocoder.yudao.module.bpm.convert.oa; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.mapstruct.Mapper; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/package-info.java deleted file mode 100644 index be8623fb1a..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.oa; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java index 34c554d414..53c01d92e5 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java index 681e7b92e9..982e678bfe 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java index a5ae1dec7e..ba781e3501 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.oa; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java index 075cbae9e2..ee31b08ca3 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.task; -import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCommonConfiguration.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCommonConfiguration.java new file mode 100644 index 0000000000..8915fc6b5a --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCommonConfiguration.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.bpm.framework.bpm.config; + +import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * BPM 通用的 Configuration 配置类,提供给 Activiti 和 Flowable + */ +@Configuration +public class BpmCommonConfiguration { + + @Bean + public BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher(ApplicationEventPublisher publisher) { + return new BpmProcessInstanceResultEventPublisher(publisher); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java index 08c43413e0..9fccbab8e6 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event; +package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java index 6134a14cbc..c2b2153942 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event; +package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; import cn.hutool.core.util.StrUtil; import org.springframework.context.ApplicationListener; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java index dba448a9c4..dc5c21b755 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event; +package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; import lombok.AllArgsConstructor; import org.springframework.context.ApplicationEventPublisher; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/package-info.java similarity index 56% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/package-info.java index 5a05170f95..c4a1311289 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/package-info.java @@ -3,4 +3,4 @@ * * @author 芋道源码 */ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event; +package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/package-info.java new file mode 100644 index 0000000000..b97cb4c8ae --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package cn.iocoder.yudao.module.bpm.framework.bpm.core; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/package-info.java new file mode 100644 index 0000000000..9a5e3ea962 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供给 Activiti 和 Flowable 的通用封装 + * + * @author 芋道源码 + */ +package cn.iocoder.yudao.module.bpm.framework.bpm; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java similarity index 55% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java index cec0edd207..52fdb7f935 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java @@ -3,4 +3,4 @@ * * @author 芋道源码 */ -package cn.iocoder.yudao.adminserver.modules.bpm.framework; +package cn.iocoder.yudao.module.bpm.framework; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java index 6dab1bf15d..6d399cf2a9 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java @@ -1 +1,10 @@ +/** + * bpm 包下,业务流程管理(Business Process Management),我们放工作流的功能。 + * 例如说:流程定义、表单配置、审核中心(我的申请、我的待办、我的已办)等等 + * + * bpm 解释:https://baike.baidu.com/item/BPM/1933 + * + * 1. Controller URL:以 /bpm/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 bpm_ 开头,方便在数据库中区分 + */ package cn.iocoder.yudao.module.bpm; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java index 9fb2e80728..a90fc9760b 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java index f2bb6ad7eb..42f1b145c3 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.lang.Assert; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java index f61e8f9d5b..da185105e2 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.bpm.service.definition; import java.util.*; import javax.validation.*; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java index 6116e8ccea..e6a93b45d6 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; import cn.iocoder.yudao.module.bpm.convert.definition.BpmUserGroupConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java similarity index 83% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java index c612b8193f..a851f403cb 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.oa; +package cn.iocoder.yudao.module.bpm.service.oa; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import javax.validation.Valid; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java similarity index 80% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java index ab9dcec42b..d0aadd95e6 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java @@ -1,24 +1,25 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.oa; +package cn.iocoder.yudao.module.bpm.service.oa; import cn.hutool.core.date.DateUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.BpmOALeaveConvert; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; +import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_LEAVE_NOT_EXISTS; /** * OA 请假申请 Service 实现类 @@ -39,7 +40,7 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService { private BpmOALeaveMapper leaveMapper; @Resource - private BpmProcessInstanceService processInstanceService; + private BpmProcessInstanceApi processInstanceApi; @Override @Transactional(rollbackFor = Exception.class) @@ -53,7 +54,7 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService { // 发起 BPM 流程 Map processInstanceVariables = new HashMap<>(); processInstanceVariables.put("day", day); - String processInstanceId = processInstanceService.createProcessInstance(userId, + String processInstanceId = processInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY) .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(leave.getId()))); @@ -64,6 +65,7 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService { @Override public void updateLeaveResult(Long id, Integer result) { + validateLeaveExists(id); leaveMapper.updateById(new BpmOALeaveDO().setId(id).setResult(result)); } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveResultListener.java similarity index 58% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java rename to yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveResultListener.java index bd80d51dd3..2354070f09 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveResultListener.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.listener; +package cn.iocoder.yudao.module.bpm.service.oa.listener; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventListener; -import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveServiceImpl; +import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent; +import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener; +import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService; +import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveServiceImpl; import org.springframework.stereotype.Component; import javax.annotation.Resource; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java rename to yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java index 86eac7c4ab..ca9d675fee 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java @@ -1,13 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; -import cn.iocoder.yudao.module.bpm.service.definition.BpmFormServiceImpl; import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java rename to yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java index efd671c065..9c04d644de 100644 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java +++ b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -11,7 +11,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.test.core.util.AssertUtils; import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupServiceImpl; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java deleted file mode 100644 index 4ea82abe30..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.message; - -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import org.activiti.api.task.model.Task; -import org.activiti.engine.runtime.ProcessInstance; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface BpmMessageConvert { - - BpmMessageConvert INSTANCE = Mappers.getMapper(BpmMessageConvert.class); - - default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, Task task) { - BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); - copyTo(processInstance, reqDTO); - copyTo(startUser, reqDTO); - copyTo(task, reqDTO); - return reqDTO; - } - @Mapping(source = "name", target = "processInstanceName") - void copyTo(ProcessInstance from, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); - @Mappings({ - @Mapping(source = "id", target = "startUserId"), - @Mapping(source = "nickname", target = "startUserNickname") - }) - void copyTo(AdminUserRespDTO from, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); - @Mappings({ - @Mapping(source = "id", target = "taskId"), - @Mapping(source = "name", target = "taskName"), - @Mapping(source = "assignee", target = "assigneeUserId") - }) - void copyTo(Task task, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); - - default BpmMessageSendWhenProcessInstanceRejectReqDTO convert(ProcessInstance processInstance, String comment) { - BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO = new BpmMessageSendWhenProcessInstanceRejectReqDTO(); - copyTo(processInstance, reqDTO); - reqDTO.setComment(comment); - return reqDTO; - } - @Mapping(source = "name", target = "processInstanceName") - void copyTo(ProcessInstance from, @MappingTarget BpmMessageSendWhenProcessInstanceRejectReqDTO to); - - @Mappings({ - @Mapping(source = "id", target = "processInstanceId"), - @Mapping(source = "name", target = "processInstanceName"), - @Mapping(source = "initiator", target = "startUserId") - }) - BpmMessageSendWhenProcessInstanceApproveReqDTO convert(org.activiti.api.process.model.ProcessInstance processInstance); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java new file mode 100644 index 0000000000..2137e22031 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java @@ -0,0 +1,4 @@ +/** + * bpm API 实现类,定义暴露给其它模块的 API + */ +package cn.iocoder.yudao.module.bpm.api; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java new file mode 100644 index 0000000000..a1d05e4fc2 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.bpm.api.task; + +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 流程实例 Api 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi { + + @Resource + private BpmProcessInstanceService processInstanceService; + + @Override + public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqDTO reqDTO) { + return processInstanceService.createProcessInstance(userId, reqDTO); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java index 449363d897..cbdbdaef82 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmModelController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition; +package cn.iocoder.yudao.module.bpm.controller.admin.definition; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; +import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; +import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.io.IoUtils; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.http diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java similarity index 79% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java index cb74221b21..22e5c81b4f 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition; +package cn.iocoder.yudao.module.bpm.controller.admin.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import io.swagger.annotations.Api; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.http diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java similarity index 83% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java index 1fbaf3b771..45ab2d4f4c 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition; +package cn.iocoder.yudao.module.bpm.controller.admin.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java index be4bc75c3e..fa2cf35464 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmActivityController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.controller.task.vo.activity.BpmActivityRespVO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmActivityService; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; +import cn.iocoder.yudao.module.bpm.service.task.BpmActivityService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import io.swagger.annotations.Api; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.http diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java index f32e3242fa..ed4bdf07da 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.http similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.http diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java index 665b735aea..35c80f7cf6 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task; +package cn.iocoder.yudao.module.bpm.controller.admin.task; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; +import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.task.vo.task.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java new file mode 100644 index 0000000000..e8d285e359 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package cn.iocoder.yudao.module.bpm.controller.app; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java new file mode 100644 index 0000000000..d1930bd6ac --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package cn.iocoder.yudao.module.bpm.controller; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java index 64c57c00ba..445911c8ca 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmModelConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; +package cn.iocoder.yudao.module.bpm.convert.definition; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import org.activiti.engine.impl.persistence.entity.SuspensionState; import org.activiti.engine.repository.Deployment; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java index 97354a951b..17a4fb1446 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; +package cn.iocoder.yudao.module.bpm.convert.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.engine.impl.persistence.entity.SuspensionState; import org.activiti.engine.repository.Deployment; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java similarity index 80% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java index 2701a1f197..4be54fe7ac 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; +package cn.iocoder.yudao.module.bpm.convert.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.bpmn.model.UserTask; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java similarity index 57% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java index 497d7afa00..6db6ebc461 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java @@ -3,4 +3,4 @@ * * 目前使用 MapStruct 框架 */ -package cn.iocoder.yudao.adminserver.modules.bpm.convert; +package cn.iocoder.yudao.module.bpm.convert; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java similarity index 82% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java index 8635b330a7..02bfaa24e8 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmActivityConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; +package cn.iocoder.yudao.module.bpm.convert.task; -import cn.iocoder.yudao.module.bpm.controller.task.vo.activity.BpmActivityRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; import org.activiti.engine.history.HistoricActivityInstance; import org.mapstruct.Mapper; import org.mapstruct.Mapping; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java similarity index 78% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java index 459362ce77..abc94d89a0 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -1,10 +1,12 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; +package cn.iocoder.yudao.module.bpm.convert.task; -import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.BpmProcessInstanceRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; +import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -114,4 +116,20 @@ public interface BpmProcessInstanceConvert { return event; } + default BpmMessageSendWhenProcessInstanceRejectReqDTO convert(ProcessInstance processInstance, String comment) { + BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO = new BpmMessageSendWhenProcessInstanceRejectReqDTO(); + copyTo(processInstance, reqDTO); + reqDTO.setComment(comment); + return reqDTO; + } + @Mapping(source = "name", target = "processInstanceName") + void copyTo(ProcessInstance from, @MappingTarget BpmMessageSendWhenProcessInstanceRejectReqDTO to); + + @Mappings({ + @Mapping(source = "id", target = "processInstanceId"), + @Mapping(source = "name", target = "processInstanceName"), + @Mapping(source = "initiator", target = "startUserId") + }) + BpmMessageSendWhenProcessInstanceApproveReqDTO convert2(org.activiti.api.process.model.ProcessInstance processInstance); + } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java similarity index 79% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java index e9689d6fd5..a8f499e1be 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java @@ -1,9 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; +package cn.iocoder.yudao.module.bpm.convert.task; -import cn.iocoder.yudao.module.bpm.controller.task.vo.task.BpmTaskDonePageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.task.vo.task.BpmTaskRespVO; -import cn.iocoder.yudao.module.bpm.controller.task.vo.task.BpmTaskTodoPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskDonePageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -123,4 +124,24 @@ public interface BpmTaskConvert { }) BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser); + default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, org.activiti.api.task.model.Task task) { + BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); + copyTo(processInstance, reqDTO); + copyTo(startUser, reqDTO); + copyTo(task, reqDTO); + return reqDTO; + } + @Mapping(source = "name", target = "processInstanceName") + void copyTo(ProcessInstance from, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); + @Mappings({ + @Mapping(source = "id", target = "startUserId"), + @Mapping(source = "nickname", target = "startUserNickname") + }) + void copyTo(AdminUserRespDTO from, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); + @Mappings({ + @Mapping(source = "id", target = "taskId"), + @Mapping(source = "name", target = "taskName"), + @Mapping(source = "assignee", target = "assigneeUserId") + }) + void copyTo(org.activiti.api.task.model.Task task, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/config/BpmActivitiConfiguration.java similarity index 76% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/config/BpmActivitiConfiguration.java index 18f867ffae..181cc2d573 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/config/BpmActivitiConfiguration.java @@ -1,18 +1,16 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config; +package cn.iocoder.yudao.module.bpm.framework.activiti.config; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.identity.EmptyUserGroupManager; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; +import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.permission.PermissionApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import org.activiti.api.runtime.shared.identity.UserGroupManager; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -79,9 +77,4 @@ public class BpmActivitiConfiguration { return bpmActivityBehaviorFactory; } - @Bean - public BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher(ApplicationEventPublisher publisher) { - return new BpmProcessInstanceResultEventPublisher(publisher); - } - } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java index aa38a24c0f..d394f8631e 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; +import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.permission.PermissionApi; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java index a540d1ffa5..9fb1f5abb4 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; +import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/package-info.java similarity index 83% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/package-info.java index a67b29bf09..e627479a5b 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/package-info.java @@ -4,4 +4,4 @@ * * @author 芋道源码 */ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java index 5e6f43a9a1..eee0d3f408 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import org.activiti.engine.impl.persistence.entity.TaskEntity; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java index e84c5df17b..c27567018a 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java index 39451903a3..e0714731a5 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import org.activiti.engine.impl.persistence.entity.TaskEntity; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java index 9fc9c806b7..7ad928c8d3 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; import org.activiti.engine.impl.persistence.entity.TaskEntity; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java similarity index 79% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java index 3cf33be59f..af8846cbe6 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.springframework.stereotype.Component; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java index b4b86b228a..22786da10c 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.identity; import org.activiti.api.runtime.shared.identity.UserGroupManager; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java index 14ba6cf6e7..6ed7297d72 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.listener; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import org.activiti.api.model.shared.event.RuntimeEvent; import org.activiti.api.process.model.ProcessInstance; import org.activiti.api.process.model.events.ProcessRuntimeEvent; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java index 307263e0c5..4b6c21cfde 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java @@ -1,8 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.listener; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; -import org.activiti.api.process.runtime.events.listener.ProcessRuntimeEventListener; +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import org.activiti.api.task.runtime.events.listener.TaskEventListener; import org.activiti.engine.delegate.event.ActivitiEvent; import org.activiti.engine.delegate.event.ActivitiEventListener; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTaskEventListener.java similarity index 93% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTaskEventListener.java index 15809c5aea..da8c6238df 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTaskEventListener.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.listener; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; +import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; import org.activiti.api.model.shared.event.RuntimeEvent; import org.activiti.api.task.model.Task; import org.activiti.api.task.model.events.TaskRuntimeEvent; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/package-info.java similarity index 78% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/package-info.java index 1badfe46c3..eca41904cc 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/package-info.java @@ -4,4 +4,4 @@ * * @author 芋道源码 */ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.listener; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java new file mode 100644 index 0000000000..52fdb7f935 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 bpm 模块的 framework 封装 + * + * @author 芋道源码 + */ +package cn.iocoder.yudao.module.bpm.framework; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java similarity index 52% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java index 2757e578b7..5713e495c7 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java @@ -4,6 +4,9 @@ * * bpm 解释:https://baike.baidu.com/item/BPM/1933 * - * 缩写:bpm + * 1. Controller URL:以 /bpm/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 bpm_ 开头,方便在数据库中区分 + * + * 注意,由于 Bpm 模块下,容易和其它模块重名,所以类名都加载 Pay 的前缀~ */ -package cn.iocoder.yudao.adminserver.modules.bpm; +package cn.iocoder.yudao.module.bpm; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java index be7cdadb68..23ad07011c 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; import org.activiti.bpmn.model.BpmnModel; import javax.validation.Valid; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java index 0f37fb5826..a4b6bf3012 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java @@ -1,22 +1,21 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; +import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.model.*; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; -import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.RepositoryService; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java similarity index 88% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java index 688098b017..7fe2a28de5 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.bpmn.model.BpmnModel; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java index 16a9689782..538e2a05cf 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java @@ -1,21 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmProcessDefinitionConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; +import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.PageUtils; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; -import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.RepositoryService; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java similarity index 87% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java index 40594c44a4..19e7f9684a 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import org.springframework.lang.Nullable; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java similarity index 94% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java index 1e80f854ed..87ec0a57a3 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java @@ -1,19 +1,18 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; +package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmTaskAssignRuleConvert; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import cn.iocoder.yudao.module.bpm.convert.definition.BpmTaskAssignRuleConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.PostApi; import cn.iocoder.yudao.module.system.api.dict.DictDataApi; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java similarity index 92% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java index ab141a69af..e50dae3c36 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; +package cn.iocoder.yudao.module.bpm.service.definition.dto; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import lombok.Data; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java index 0f275eb6d5..8b2d22ad58 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; +package cn.iocoder.yudao.module.bpm.service.definition.dto; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java index badba2b9c7..e7c28648a4 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task; +package cn.iocoder.yudao.module.bpm.service.task; -import cn.iocoder.yudao.module.bpm.controller.task.vo.activity.BpmActivityRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; import java.util.List; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java index f60351bd2b..2db1dc3e5c 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmActivityServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task; +package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.io.IoUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmActivityConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; +import cn.iocoder.yudao.module.bpm.convert.task.BpmActivityConvert; +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.controller.task.vo.activity.BpmActivityRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.HistoryService; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java index 1942b13a07..6dcacac1f8 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task; +package cn.iocoder.yudao.module.bpm.service.task; -import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.*; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import org.activiti.engine.history.HistoricProcessInstance; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java similarity index 95% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index caf7fe14e1..190170b387 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -1,21 +1,20 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task; +package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.message.BpmMessageConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmProcessInstanceConvert; -import cn.iocoder.yudao.module.bpm.controller.task.vo.instance.*; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; +import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; +import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.dto.BpmProcessInstanceCreateReqDTO; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.module.system.api.dept.DeptApi; @@ -278,7 +277,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被通过的消息 - messageService.sendMessageWhenProcessInstanceApprove(BpmMessageConvert.INSTANCE.convert(instance)); + messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2(instance)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( @@ -301,7 +300,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被不通过的消息 - messageService.sendMessageWhenProcessInstanceReject(BpmMessageConvert.INSTANCE.convert(processInstance, comment)); + messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert(processInstance, comment)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java index 796106a581..025ee461fc 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java @@ -1,6 +1,6 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task; +package cn.iocoder.yudao.module.bpm.service.task; -import cn.iocoder.yudao.module.bpm.controller.task.vo.task.*; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskServiceImpl.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 0fc5385a0f..b4cb99fb1a 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -1,10 +1,9 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task; +package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.message.BpmMessageConvert; -import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmTaskConvert; -import cn.iocoder.yudao.module.bpm.controller.task.vo.task.*; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; +import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; @@ -291,7 +290,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { public void afterCommit() { ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); - messageService.sendMessageWhenTaskAssigned(BpmMessageConvert.INSTANCE.convert(processInstance, startUser, task)); + messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); } }); } diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java index 01ecbf3a26..0ffb3a8949 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/package-info.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java @@ -9,4 +9,4 @@ * * @author 芋道源码 */ -package cn.iocoder.yudao.adminserver.modules.bpm.service.task; +package cn.iocoder.yudao.module.bpm.service.task; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java deleted file mode 100644 index cdde7ccc4a..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.service; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java similarity index 96% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java index 8d2e1b6723..b05b712a30 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehaviorTest.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior; import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; +import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; +import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java similarity index 96% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java index 8be8fc4d17..d44c5c8067 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.impl; +package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; import cn.iocoder.yudao.module.system.api.dept.DeptApi; @@ -10,6 +10,7 @@ import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.impl.persistence.entity.TaskEntityImpl; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; +import org.mockito.Mock; import org.springframework.boot.test.mock.mockito.MockBean; import java.util.Set; @@ -25,9 +26,9 @@ class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { @InjectMocks private BpmTaskAssignLeaderX2Script script; - @MockBean + @Mock private AdminUserApi adminUserApi; - @MockBean + @Mock private DeptApi deptApi; @Test diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/service/package-info.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/service/package-info.java new file mode 100644 index 0000000000..bda0cb8cae --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/service/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.bpm.service; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/test/BaseDbUnitTest.java similarity index 97% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/test/BaseDbUnitTest.java index 5f7daeded1..a25958bfd9 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/test/BaseDbUnitTest.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.adminserver; +package cn.iocoder.yudao.module.bpm.test; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application-unit-test.yaml b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application-unit-test.yaml index ddad7ace21..42e5e356dd 100644 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application-unit-test.yaml +++ b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application-unit-test.yaml @@ -18,6 +18,12 @@ spring: async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 initial-size: 1 # 单元测试,配置为 1,提升启动速度 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + mybatis: lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 @@ -36,3 +42,9 @@ mybatis: --- #################### 芋道相关配置 #################### # 芋道配置项,设置当前项目所有自定义的配置 +yudao: + info: + base-package: cn.iocoder.yudao.module.member.dal.mysql + base-package2: cn.iocoder.yudao.module + core-service: + base-package: cn.iocoder.yudao.module.member.dal.mysql # TODO 芋艿:要清理掉 diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application.yaml b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application.yaml deleted file mode 100644 index 2cfbb1abe4..0000000000 --- a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/application.yaml +++ /dev/null @@ -1,35 +0,0 @@ -spring: - application: - name: yudao-module-bpm-service - - # Jackson 配置项 - jackson: - serialization: - write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 - write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 - write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 - fail-on-empty-beans: false # 允许序列化无属性的 Bean - -# MyBatis Plus 的配置项 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 - global-config: - db-config: - id-type: AUTO # 自增 ID - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - mapper-locations: classpath*:mapper/*.xml - type-aliases-package: ${yudao.core-service.base-package}.modules.*.dal.dataobject - ---- #################### 芋道相关配置 #################### - -yudao: - info: - version: 1.0.0 - base-package: cn.iocoder.yudao.adminserver - core-service: - base-package: cn.iocoder.yudao.coreservice - -debug: false diff --git a/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/logback-spring.xml b/yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/logback.xml similarity index 100% rename from yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/logback-spring.xml rename to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/resources/logback.xml diff --git a/yudao-module-system/yudao-module-system-api/pom.xml b/yudao-module-system/yudao-module-system-api/pom.xml index 807eee44f3..40e97dc4bf 100644 --- a/yudao-module-system/yudao-module-system-api/pom.xml +++ b/yudao-module-system/yudao-module-system-api/pom.xml @@ -28,6 +28,7 @@ spring-boot-starter-validation true + cn.iocoder.boot diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApiImpl.java new file mode 100644 index 0000000000..9454193e70 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApiImpl.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.system.api.dept; + +import cn.iocoder.yudao.module.system.service.dept.PostService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; + +/** + * 岗位 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class PostApiImpl implements PostApi { + + @Resource + private PostService postService; + + @Override + public void validPosts(Collection ids) { + postService.validPosts(ids); + } +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApiImpl.java new file mode 100644 index 0000000000..6db4fb8e04 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApiImpl.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.system.api.dict; + +import cn.iocoder.yudao.module.system.service.dict.DictDataService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; + +/** + * 字典数据 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class DictDataApiImpl implements DictDataApi { + + @Resource + private DictDataService dictDataService; + + @Override + public void validDictDatas(String dictType, Collection values) { + dictDataService.validDictDatas(dictType, values); + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/permission/RoleApiImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/permission/RoleApiImpl.java new file mode 100644 index 0000000000..2c4f94737d --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/permission/RoleApiImpl.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.system.api.permission; + +import cn.iocoder.yudao.module.system.service.permission.RoleService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; + +/** + * 角色 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class RoleApiImpl implements RoleApi { + + @Resource + private RoleService roleService; + + @Override + public void validRoles(Collection ids) { + roleService.validRoles(ids); + } +} From 2b630ef3f2e3e0c2e42ced07847e070f32b24d12 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 1 Feb 2022 22:59:43 +0800 Subject: [PATCH 29/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=209=EF=BC=9A=E8=B0=83=E6=95=B4=E7=9A=84=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-admin-ui/src/api/login.js | 16 ++++++++-------- yudao-admin-ui/src/api/menu.js | 2 +- yudao-admin-ui/src/store/modules/dict.js | 4 ++++ yudao-admin-ui/src/utils/request.js | 2 +- 更新日志.md | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/yudao-admin-ui/src/api/login.js b/yudao-admin-ui/src/api/login.js index 348aef0639..24a9df4758 100644 --- a/yudao-admin-ui/src/api/login.js +++ b/yudao-admin-ui/src/api/login.js @@ -9,7 +9,7 @@ export function login(username, password, code, uuid) { uuid } return request({ - url: '/login', + url: '/system/login', method: 'post', data: data }) @@ -18,7 +18,7 @@ export function login(username, password, code, uuid) { // 获取用户详细信息 export function getInfo() { return request({ - url: '/get-permission-info', + url: '/system/get-permission-info', method: 'get' }) } @@ -26,7 +26,7 @@ export function getInfo() { // 退出方法 export function logout() { return request({ - url: '/logout', + url: '/system/logout', method: 'post' }) } @@ -42,7 +42,7 @@ export function getCodeImg() { // 社交授权的跳转 export function socialAuthRedirect(type, redirectUri) { return request({ - url: '/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri, + url: '/system/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri, method: 'get' }) } @@ -50,7 +50,7 @@ export function socialAuthRedirect(type, redirectUri) { // 社交登录,使用 code 授权码 export function socialLogin(type, code, state) { return request({ - url: '/social-login', + url: '/system/social-login', method: 'post', data: { type, @@ -63,7 +63,7 @@ export function socialLogin(type, code, state) { // 社交登录,使用 code 授权码 + + 账号密码 export function socialLogin2(type, code, state, username, password) { return request({ - url: '/social-login2', + url: '/system/social-login2', method: 'post', data: { type, @@ -78,7 +78,7 @@ export function socialLogin2(type, code, state, username, password) { // 社交绑定,使用 code 授权码 export function socialBind(type, code, state) { return request({ - url: '/social-bind', + url: '/system/social-bind', method: 'post', data: { type, @@ -91,7 +91,7 @@ export function socialBind(type, code, state) { // 取消社交绑定 export function socialUnbind(type, unionId) { return request({ - url: '/social-unbind', + url: '/system/social-unbind', method: 'delete', data: { type, diff --git a/yudao-admin-ui/src/api/menu.js b/yudao-admin-ui/src/api/menu.js index 01fbbc9f41..48df3dd554 100644 --- a/yudao-admin-ui/src/api/menu.js +++ b/yudao-admin-ui/src/api/menu.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 获取路由 export const getRouters = () => { return request({ - url: '/list-menus', + url: '/system/list-menus', method: 'get' }) } diff --git a/yudao-admin-ui/src/store/modules/dict.js b/yudao-admin-ui/src/store/modules/dict.js index 64c05a1941..6d3984d677 100644 --- a/yudao-admin-ui/src/store/modules/dict.js +++ b/yudao-admin-ui/src/store/modules/dict.js @@ -18,6 +18,10 @@ const mutations = { const actions = { loadDictDatas({ commit }) { listSimpleDictDatas().then(response => { + // 如果未加载到数据,则直接返回 + if (!response.data) { + return; + } // 设置数据 const dictDataMap = {} response.data.forEach(dictData => { diff --git a/yudao-admin-ui/src/utils/request.js b/yudao-admin-ui/src/utils/request.js index 7b8c2901f6..ee2fee18a0 100644 --- a/yudao-admin-ui/src/utils/request.js +++ b/yudao-admin-ui/src/utils/request.js @@ -9,7 +9,7 @@ axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' // 创建axios实例 const service = axios.create({ // axios中请求配置有baseURL选项,表示请求URL公共部分 - baseURL: process.env.VUE_APP_BASE_API + '/api/', // 此处的 /api/ 地址,原因是后端的基础路径为 /api/ + baseURL: process.env.VUE_APP_BASE_API + '/admin-api/', // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/ // 超时 timeout: 10000 }) diff --git a/更新日志.md b/更新日志.md index cf15885154..1810a2bd61 100644 --- a/更新日志.md +++ b/更新日志.md @@ -22,12 +22,12 @@ *【重构】大模块按照多 Maven Module 的方式拆分,提升可维护性,为后续重构 onemall 提供基础 *【重构】Spring Security 支持读取多种用户类型,从不同的数据库表,从而实现单项目提供管理后台、用户 APP 的不同 RESTful API 接口 - ### 🐞 Bug Fixes *【修复】用户无权限访问 指定 API 时,未返回 FORBIDDEN 结果码 *【修复】定时任务刷新本地缓存时,无租户上线文,导致查询报错 *【修复】配置中心只加载了删除的配置 +*【修复】管理后台 UI 超时登录后,返回登陆界面时,由于未登陆加载不到字典数据,导致报错的问题 ### 🔨 Dependency Upgrades From 8d593849048caf6bbb2b602667f36f6ec684e466 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 2 Feb 2022 01:27:04 +0800 Subject: [PATCH 30/47] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9D=97=E9=87=8D?= =?UTF-8?q?=E6=9E=84=2010=EF=BC=9A=E5=8E=BB=E9=99=A4=20Freemarker=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E7=9A=84=E5=89=8D=E7=BC=80=EF=BC=8C=E4=BB=8E=20sys=3D=E3=80=8B?= =?UTF-8?q?system=E3=80=81inf=3D=E3=80=8Binfra=20=E8=A7=81=E5=90=8D?= =?UTF-8?q?=E7=9F=A5=E6=84=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/ruoyi-vue-pro.sql | 2971 ++++++++++------- yudao-admin-server/pom.xml | 5 + .../src/main/resources/application.yaml | 7 +- .../src/api/{infra => tool}/dbDoc.js | 6 +- yudao-admin-ui/src/store/modules/dict.js | 2 +- yudao-admin-ui/src/utils/constants.js | 22 +- yudao-admin-ui/src/utils/dict.js | 78 +- .../src/views/bpm/form/formEditor.vue | 6 +- yudao-admin-ui/src/views/bpm/form/index.vue | 2 +- yudao-admin-ui/src/views/bpm/group/index.vue | 10 +- .../src/views/infra/apiErrorLog/index.vue | 12 +- .../src/views/infra/config/index.vue | 4 +- yudao-admin-ui/src/views/infra/job/index.vue | 12 +- yudao-admin-ui/src/views/infra/job/log.vue | 6 +- .../src/views/infra/redis/index.vue | 2 +- yudao-admin-ui/src/views/login.vue | 4 +- .../pay/app/components/aliPayChannelForm.vue | 2 +- .../pay/app/components/wechatChannelForm.vue | 2 +- yudao-admin-ui/src/views/pay/app/index.vue | 12 +- .../src/views/pay/merchant/index.vue | 10 +- yudao-admin-ui/src/views/pay/order/index.vue | 20 +- yudao-admin-ui/src/views/pay/refund/index.vue | 26 +- .../src/views/system/dept/index.vue | 10 +- yudao-admin-ui/src/views/system/dict/data.vue | 10 +- .../src/views/system/dict/index.vue | 10 +- .../src/views/system/errorCode/index.vue | 4 +- .../src/views/system/loginlog/index.vue | 4 +- .../src/views/system/menu/index.vue | 22 +- .../src/views/system/notice/index.vue | 14 +- .../src/views/system/operatelog/index.vue | 6 +- .../src/views/system/post/index.vue | 10 +- .../src/views/system/role/index.vue | 22 +- .../src/views/system/sms/smsChannel.vue | 18 +- .../src/views/system/sms/smsLog.vue | 25 +- .../src/views/system/sms/smsTemplate.vue | 18 +- .../src/views/system/tenant/index.vue | 10 +- .../src/views/system/user/index.vue | 14 +- .../views/system/user/profile/userSocial.vue | 6 +- yudao-admin-ui/src/views/tool/dbDoc/index.vue | 2 +- .../src/views/tool/testDemo/index.vue | 18 +- yudao-dependencies/pom.xml | 6 + .../module/bpm/enums/DictTypeConstants.java | 13 + .../BpmTaskAssignRuleServiceImpl.java | 4 +- .../module/infra/enums/DictTypeConstants.java | 14 +- .../module/pay/enums/DictTypeConstants.java | 28 +- .../admin/order/vo/PayOrderExcelVO.java | 6 +- .../admin/refund/vo/PayRefundExcelVO.java | 6 +- .../system/enums/DictTypeConstants.java | 13 +- .../yudao-module-tool-impl/pom.xml | 10 + .../controller/admin/doc/DbDocController.java | 18 +- 更新日志.md | 2 + 51 files changed, 2080 insertions(+), 1484 deletions(-) rename yudao-admin-ui/src/api/{infra => tool}/dbDoc.js (75%) create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/DictTypeConstants.java rename {yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra => yudao-module-tool/yudao-module-tool-impl/src/main/java/cn/iocoder/yudao/module/tool}/controller/admin/doc/DbDocController.java (91%) diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index c74a93c009..d3d5d2a078 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -11,7 +11,7 @@ Target Server Version : 80026 File Encoding : 65001 - Date: 23/01/2022 01:39:15 + Date: 02/02/2022 01:23:59 */ SET NAMES utf8mb4; @@ -61,9 +61,9 @@ CREATE TABLE `bpm_oa_leave` ( `day` tinyint NOT NULL COMMENT '请假天数', `result` tinyint NOT NULL COMMENT '请假结果', `process_instance_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '流程实例的编号', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) @@ -222,14 +222,14 @@ CREATE TABLE `bpm_process_instance_ext` ( `status` tinyint NOT NULL COMMENT '流程实例的状态', `result` tinyint NOT NULL COMMENT '流程实例的结果', `end_time` datetime DEFAULT NULL COMMENT '结束时间', - `form_variables` varchar(5000) DEFAULT NULL COMMENT '表单值', + `form_variables` varchar(5000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '表单值', `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=194 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流的流程实例的拓展'; +) ENGINE=InnoDB AUTO_INCREMENT=198 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流的流程实例的拓展'; -- ---------------------------- -- Records of bpm_process_instance_ext @@ -348,6 +348,9 @@ INSERT INTO `bpm_process_instance_ext` VALUES (190, 1, 'OA 请假', '2152467e-7b INSERT INTO `bpm_process_instance_ext` VALUES (191, 1, 'OA 请假', '7317cec6-7b9b-11ec-b5b7-acde48001122', 'oa_leave:5:004b710b-7b8a-11ec-8ef0-acde48001122', '2', 1, 1, NULL, '{\"day\":23}', '1', '2022-01-22 23:53:32', '1', '2022-01-22 23:53:33', b'0'); INSERT INTO `bpm_process_instance_ext` VALUES (192, 1, 'OA 请假', '7470a810-7b9b-11ec-b5b7-acde48001122', 'oa_leave:5:004b710b-7b8a-11ec-8ef0-acde48001122', '2', 2, 4, '2022-01-23 00:08:41', '{\"day\":23}', '1', '2022-01-22 23:53:35', '1', '2022-01-23 00:08:41', b'0'); INSERT INTO `bpm_process_instance_ext` VALUES (193, 1, 'OA 请假', '3ad174fb-7b9d-11ec-8404-acde48001122', 'oa_leave:5:004b710b-7b8a-11ec-8ef0-acde48001122', '2', 2, 4, '2022-01-23 00:07:03', '{\"day\":23}', '1', '2022-01-23 00:06:17', '1', '2022-01-23 00:07:03', b'0'); +INSERT INTO `bpm_process_instance_ext` VALUES (194, 1, 'eeee', 'b243fa82-7c06-11ec-9110-acde48001122', 'eee:17:f3aad03b-7ae5-11ec-a69c-a2380e71991a', '1', 1, 1, NULL, '{\"field121\":\"AAA\",\"field122\":[1]}', '1', '2022-01-23 12:41:14', '1', '2022-01-23 12:41:19', b'0'); +INSERT INTO `bpm_process_instance_ext` VALUES (195, 1, '测试多审批人', 'ecddb286-7c07-11ec-a41d-acde48001122', 'test_001:4:3dbe6714-76b1-11ec-9c66-a2380e71991a', '1', 2, 4, '2022-01-23 12:59:40', '{\"field121\":\"AAA\",\"field122\":[1]}', '1', '2022-01-23 12:50:02', '1', '2022-01-23 12:59:40', b'0'); +INSERT INTO `bpm_process_instance_ext` VALUES (197, 1, '滔博', '4f676a08-7c09-11ec-b8a1-acde48001122', 'test:21:c2cd44b0-79b0-11ec-b2b8-a2380e71991a', '1', 1, 1, NULL, '{\"field121\":\"aaa\",\"field122\":[1]}', '1', '2022-01-23 12:59:57', '1', '2022-01-23 12:59:57', b'0'); COMMIT; -- ---------------------------- @@ -526,9 +529,9 @@ CREATE TABLE `bpm_task_ext` ( `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务的名字', `task_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务的编号', `result` tinyint NOT NULL COMMENT '任务的结果', - `comment` varchar(255) DEFAULT NULL COMMENT '审批建议', + `comment` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审批建议', `end_time` datetime DEFAULT NULL COMMENT '任务的结束时间', - `process_instance_id` varchar(64) NOT NULL COMMENT '流程实例的编号', + `process_instance_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '流程实例的编号', `process_definition_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '流程定义的编号', `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -536,7 +539,7 @@ CREATE TABLE `bpm_task_ext` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=205 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流的流程任务的拓展表'; +) ENGINE=InnoDB AUTO_INCREMENT=210 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流的流程任务的拓展表'; -- ---------------------------- -- Records of bpm_task_ext @@ -667,6 +670,10 @@ INSERT INTO `bpm_task_ext` VALUES (201, 1, '一级审批', '215cf4e5-7b9b-11ec-9 INSERT INTO `bpm_task_ext` VALUES (202, 1, '一级审批', '73211d9d-7b9b-11ec-b5b7-acde48001122', 1, NULL, NULL, '7317cec6-7b9b-11ec-b5b7-acde48001122', 'oa_leave:5:004b710b-7b8a-11ec-8ef0-acde48001122', '1', '2022-01-22 23:53:32', '1', '2022-01-22 23:53:32', b'0'); INSERT INTO `bpm_task_ext` VALUES (203, 1, '一级审批', '74736737-7b9b-11ec-b5b7-acde48001122', 4, NULL, '2022-01-23 00:08:41', '7470a810-7b9b-11ec-b5b7-acde48001122', 'oa_leave:5:004b710b-7b8a-11ec-8ef0-acde48001122', '1', '2022-01-22 23:53:35', '1', '2022-01-23 00:08:41', b'0'); INSERT INTO `bpm_task_ext` VALUES (204, 1, '一级审批', '3adac3d2-7b9d-11ec-8404-acde48001122', 4, NULL, '2022-01-23 00:07:03', '3ad174fb-7b9d-11ec-8404-acde48001122', 'oa_leave:5:004b710b-7b8a-11ec-8ef0-acde48001122', '1', '2022-01-23 00:06:17', '1', '2022-01-23 00:07:03', b'0'); +INSERT INTO `bpm_task_ext` VALUES (205, 1, '申请', 'b25363db-7c06-11ec-9110-acde48001122', 1, NULL, NULL, 'b243fa82-7c06-11ec-9110-acde48001122', 'eee:17:f3aad03b-7ae5-11ec-a69c-a2380e71991a', '1', '2022-01-23 12:41:14', '1', '2022-01-23 12:41:19', b'0'); +INSERT INTO `bpm_task_ext` VALUES (206, 1, '1.2', 'ee7cbc97-7c07-11ec-a41d-acde48001122', 4, NULL, '2022-01-23 12:59:40', 'ecddb286-7c07-11ec-a41d-acde48001122', 'test_001:4:3dbe6714-76b1-11ec-9c66-a2380e71991a', '1', '2022-01-23 12:50:05', '1', '2022-01-23 12:59:40', b'0'); +INSERT INTO `bpm_task_ext` VALUES (207, 1, '1.1', 'ee67adf1-7c07-11ec-a41d-acde48001122', 4, NULL, '2022-01-23 12:59:40', 'ecddb286-7c07-11ec-a41d-acde48001122', 'test_001:4:3dbe6714-76b1-11ec-9c66-a2380e71991a', '1', '2022-01-23 12:50:05', '1', '2022-01-23 12:59:40', b'0'); +INSERT INTO `bpm_task_ext` VALUES (209, 1, '任务一', '4f6fce81-7c09-11ec-b8a1-acde48001122', 1, NULL, NULL, '4f676a08-7c09-11ec-b8a1-acde48001122', 'test:21:c2cd44b0-79b0-11ec-b2b8-a2380e71991a', '1', '2022-01-23 12:59:57', '1', '2022-01-23 12:59:57', b'0'); COMMIT; -- ---------------------------- @@ -696,125 +703,541 @@ INSERT INTO `bpm_user_group` VALUES (110, '测试组', '哈哈哈哈', '[1]', 0, COMMIT; -- ---------------------------- --- Table structure for inf_api_access_log +-- Table structure for infra_api_access_log -- ---------------------------- -DROP TABLE IF EXISTS `inf_api_access_log`; -CREATE TABLE `inf_api_access_log` ( +DROP TABLE IF EXISTS `infra_api_access_log`; +CREATE TABLE `infra_api_access_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', - `trace_id` varchar(64) NOT NULL DEFAULT '' COMMENT '链路追踪编号', + `trace_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', `user_id` bigint NOT NULL DEFAULT '0' COMMENT '用户编号', `user_type` tinyint NOT NULL DEFAULT '0' COMMENT '用户类型', - `application_name` varchar(50) NOT NULL COMMENT '应用名', - `request_method` varchar(16) NOT NULL DEFAULT '' COMMENT '请求方法名', - `request_url` varchar(255) NOT NULL DEFAULT '' COMMENT '请求地址', - `request_params` varchar(8000) NOT NULL DEFAULT '' COMMENT '请求参数', - `user_ip` varchar(50) NOT NULL COMMENT '用户 IP', - `user_agent` varchar(512) NOT NULL COMMENT '浏览器 UA', + `application_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', + `request_method` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方法名', + `request_url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求地址', + `request_params` varchar(8000) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求参数', + `user_ip` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP', + `user_agent` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA', `begin_time` datetime NOT NULL COMMENT '开始请求时间', `end_time` datetime NOT NULL COMMENT '结束请求时间', `duration` int NOT NULL COMMENT '执行时长', `result_code` int NOT NULL DEFAULT '0' COMMENT '结果码', - `result_msg` varchar(512) DEFAULT '' COMMENT '结果提示', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `result_msg` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '结果提示', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=22788 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='API 访问日志表'; +) ENGINE=InnoDB AUTO_INCREMENT=23199 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='API 访问日志表'; -- ---------------------------- --- Records of inf_api_access_log +-- Records of infra_api_access_log -- ---------------------------- BEGIN; +INSERT INTO `infra_api_access_log` VALUES (22788, '', 0, 0, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:34', '2022-01-23 01:42:35', 47, 0, '', NULL, '2022-01-23 01:42:35', NULL, '2022-01-23 01:42:35', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22789, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:34', '2022-01-23 01:42:35', 47, 0, '', NULL, '2022-01-23 01:42:35', NULL, '2022-01-23 01:42:35', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22790, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:35', '2022-01-23 01:42:35', 9, 0, '', NULL, '2022-01-23 01:42:35', NULL, '2022-01-23 01:42:35', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22791, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:36', '2022-01-23 01:42:36', 2, 0, '', NULL, '2022-01-23 01:42:36', NULL, '2022-01-23 01:42:36', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22792, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:35', '2022-01-23 01:42:37', 2051, 0, '', NULL, '2022-01-23 01:42:37', NULL, '2022-01-23 01:42:37', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22793, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:36', '2022-01-23 01:42:37', 718, 0, '', NULL, '2022-01-23 01:42:37', NULL, '2022-01-23 01:42:37', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22794, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/tenant/get-id-by-name', '{\"query\":{\"name\":\"芋道源码\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:39', '2022-01-23 01:42:39', 45, 0, '', NULL, '2022-01-23 01:42:39', NULL, '2022-01-23 01:42:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22795, '', 0, 0, 'yudao-admin-server', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"dc6xv\\\",\\\"uuid\\\":\\\"4078d0241f0343faaea0d8393dbe639d\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:39', '2022-01-23 01:42:39', 399, 0, '', NULL, '2022-01-23 01:42:39', NULL, '2022-01-23 01:42:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22796, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:39', '2022-01-23 01:42:39', 47, 0, '', NULL, '2022-01-23 01:42:39', NULL, '2022-01-23 01:42:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22797, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:39', '2022-01-23 01:42:39', 50, 0, '', NULL, '2022-01-23 01:42:39', NULL, '2022-01-23 01:42:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22798, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:39', '2022-01-23 01:42:39', 12, 0, '', NULL, '2022-01-23 01:42:39', NULL, '2022-01-23 01:42:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22799, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:40', '2022-01-23 01:42:40', 28, 0, '', NULL, '2022-01-23 01:42:40', NULL, '2022-01-23 01:42:40', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22800, '', 1, 2, 'yudao-admin-server', 'GET', '/api/tool/codegen/table/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:42', '2022-01-23 01:42:42', 89, 0, '', NULL, '2022-01-23 01:42:42', NULL, '2022-01-23 01:42:42', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22801, '', 1, 2, 'yudao-admin-server', 'GET', '/api/tool/test-demo/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:43', '2022-01-23 01:42:43', 59, 0, '', NULL, '2022-01-23 01:42:43', NULL, '2022-01-23 01:42:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22802, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:46', '2022-01-23 01:42:46', 49, 0, '', NULL, '2022-01-23 01:42:46', NULL, '2022-01-23 01:42:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22803, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/oa/leave/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:47', '2022-01-23 01:42:47', 54, 0, '', NULL, '2022-01-23 01:42:47', NULL, '2022-01-23 01:42:47', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22804, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/user/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:48', '2022-01-23 01:42:48', 50, 0, '', NULL, '2022-01-23 01:42:48', NULL, '2022-01-23 01:42:48', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22805, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/user-group/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:48', '2022-01-23 01:42:48', 59, 0, '', NULL, '2022-01-23 01:42:48', NULL, '2022-01-23 01:42:48', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22806, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:48', '2022-01-23 01:42:48', 23, 0, '', NULL, '2022-01-23 01:42:48', NULL, '2022-01-23 01:42:48', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22807, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/oa/leave/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:49', '2022-01-23 01:42:49', 31, 0, '', NULL, '2022-01-23 01:42:49', NULL, '2022-01-23 01:42:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22808, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/user/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:51', '2022-01-23 01:42:51', 57, 0, '', NULL, '2022-01-23 01:42:51', NULL, '2022-01-23 01:42:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22809, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/task/list-by-process-instance-id', '{\"query\":{\"processInstanceId\":\"3ad174fb-7b9d-11ec-8404-acde48001122\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:51', '2022-01-23 01:42:51', 188, 0, '', NULL, '2022-01-23 01:42:51', NULL, '2022-01-23 01:42:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22810, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/get', '{\"query\":{\"id\":\"3ad174fb-7b9d-11ec-8404-acde48001122\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:51', '2022-01-23 01:42:51', 215, 0, '', NULL, '2022-01-23 01:42:51', NULL, '2022-01-23 01:42:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22811, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/get-bpmn-xml', '{\"query\":{\"id\":\"oa_leave:5:004b710b-7b8a-11ec-8ef0-acde48001122\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:51', '2022-01-23 01:42:51', 20, 0, '', NULL, '2022-01-23 01:42:51', NULL, '2022-01-23 01:42:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22812, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/activity/list', '{\"query\":{\"processInstanceId\":\"3ad174fb-7b9d-11ec-8404-acde48001122\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:51', '2022-01-23 01:42:51', 40, 0, '', NULL, '2022-01-23 01:42:51', NULL, '2022-01-23 01:42:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22813, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/user-group/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:57', '2022-01-23 01:42:57', 26, 0, '', NULL, '2022-01-23 01:42:57', NULL, '2022-01-23 01:42:57', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22814, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/user/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 01:42:57', '2022-01-23 01:42:57', 32, 0, '', NULL, '2022-01-23 01:42:57', NULL, '2022-01-23 01:42:57', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22815, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:27', '2022-01-23 03:21:27', 135, 0, '', NULL, '2022-01-23 03:21:27', NULL, '2022-01-23 03:21:27', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22816, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:27', '2022-01-23 03:21:27', 12, 0, '', NULL, '2022-01-23 03:21:27', NULL, '2022-01-23 03:21:27', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22817, '', 0, 0, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:27', '2022-01-23 03:21:27', 135, 0, '', NULL, '2022-01-23 03:21:27', NULL, '2022-01-23 03:21:27', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22818, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:28', '2022-01-23 03:21:28', 3, 0, '', NULL, '2022-01-23 03:21:28', NULL, '2022-01-23 03:21:28', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22819, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/tenant/get-id-by-name', '{\"query\":{\"name\":\"芋道源码\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:30', '2022-01-23 03:21:30', 177, 0, '', NULL, '2022-01-23 03:21:30', NULL, '2022-01-23 03:21:30', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22820, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:28', '2022-01-23 03:21:30', 1565, 0, '', NULL, '2022-01-23 03:21:30', NULL, '2022-01-23 03:21:30', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22821, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:27', '2022-01-23 03:21:30', 2946, 0, '', NULL, '2022-01-23 03:21:30', NULL, '2022-01-23 03:21:30', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22822, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/tenant/get-id-by-name', '{\"query\":{\"name\":\"芋道源码\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:32', '2022-01-23 03:21:32', 24, 0, '', NULL, '2022-01-23 03:21:32', NULL, '2022-01-23 03:21:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22823, '', 0, 0, 'yudao-admin-server', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"1\\\",\\\"uuid\\\":\\\"29afe343dd6e4c45bad958997ccb8027\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:32', '2022-01-23 03:21:32', 412, 0, '', NULL, '2022-01-23 03:21:32', NULL, '2022-01-23 03:21:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22824, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:32', '2022-01-23 03:21:32', 52, 0, '', NULL, '2022-01-23 03:21:32', NULL, '2022-01-23 03:21:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22825, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:32', '2022-01-23 03:21:32', 60, 0, '', NULL, '2022-01-23 03:21:32', NULL, '2022-01-23 03:21:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22826, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:32', '2022-01-23 03:21:32', 12, 0, '', NULL, '2022-01-23 03:21:32', NULL, '2022-01-23 03:21:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22827, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:33', '2022-01-23 03:21:33', 30, 0, '', NULL, '2022-01-23 03:21:33', NULL, '2022-01-23 03:21:33', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22828, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:43', '2022-01-23 03:21:43', 89, 0, '', NULL, '2022-01-23 03:21:43', NULL, '2022-01-23 03:21:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22829, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:44', '2022-01-23 03:21:44', 27, 0, '', NULL, '2022-01-23 03:21:44', NULL, '2022-01-23 03:21:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22830, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:44', '2022-01-23 03:21:44', 148, 0, '', NULL, '2022-01-23 03:21:44', NULL, '2022-01-23 03:21:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22831, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:21:46', '2022-01-23 03:21:46', 45, 0, '', NULL, '2022-01-23 03:21:46', NULL, '2022-01-23 03:21:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22832, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:23:49', '2022-01-23 03:23:49', 30, 0, '', NULL, '2022-01-23 03:23:49', NULL, '2022-01-23 03:23:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22833, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:23:49', '2022-01-23 03:23:49', 55, 0, '', NULL, '2022-01-23 03:23:49', NULL, '2022-01-23 03:23:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22834, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:23:49', '2022-01-23 03:23:49', 9, 0, '', NULL, '2022-01-23 03:23:49', NULL, '2022-01-23 03:23:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22835, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:23:49', '2022-01-23 03:23:49', 19, 0, '', NULL, '2022-01-23 03:23:49', NULL, '2022-01-23 03:23:49', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22836, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:23:49', '2022-01-23 03:23:49', 61, 0, '', NULL, '2022-01-23 03:23:49', NULL, '2022-01-23 03:23:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22837, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:24:07', '2022-01-23 03:24:07', 44, 0, '', NULL, '2022-01-23 03:24:07', NULL, '2022-01-23 03:24:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22838, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:24:07', '2022-01-23 03:24:07', 59, 0, '', NULL, '2022-01-23 03:24:07', NULL, '2022-01-23 03:24:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22839, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:24:07', '2022-01-23 03:24:07', 9, 0, '', NULL, '2022-01-23 03:24:07', NULL, '2022-01-23 03:24:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22840, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:24:07', '2022-01-23 03:24:07', 16, 0, '', NULL, '2022-01-23 03:24:07', NULL, '2022-01-23 03:24:07', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22841, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:24:07', '2022-01-23 03:24:07', 88, 0, '', NULL, '2022-01-23 03:24:07', NULL, '2022-01-23 03:24:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22842, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:24', '2022-01-23 03:26:24', 38, 0, '', NULL, '2022-01-23 03:26:24', NULL, '2022-01-23 03:26:24', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22843, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:24', '2022-01-23 03:26:24', 65, 0, '', NULL, '2022-01-23 03:26:24', NULL, '2022-01-23 03:26:24', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22844, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:24', '2022-01-23 03:26:24', 11, 0, '', NULL, '2022-01-23 03:26:24', NULL, '2022-01-23 03:26:24', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22845, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:26', '2022-01-23 03:26:26', 18, 0, '', NULL, '2022-01-23 03:26:26', NULL, '2022-01-23 03:26:26', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22846, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:26', '2022-01-23 03:26:26', 43, 0, '', NULL, '2022-01-23 03:26:26', NULL, '2022-01-23 03:26:26', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22847, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:53', '2022-01-23 03:26:53', 27, 0, '', NULL, '2022-01-23 03:26:53', NULL, '2022-01-23 03:26:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22848, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:53', '2022-01-23 03:26:53', 44, 0, '', NULL, '2022-01-23 03:26:53', NULL, '2022-01-23 03:26:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22849, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:53', '2022-01-23 03:26:53', 8, 0, '', NULL, '2022-01-23 03:26:53', NULL, '2022-01-23 03:26:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22850, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:53', '2022-01-23 03:26:53', 15, 0, '', NULL, '2022-01-23 03:26:53', NULL, '2022-01-23 03:26:53', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22851, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:53', '2022-01-23 03:26:53', 62, 0, '', NULL, '2022-01-23 03:26:53', NULL, '2022-01-23 03:26:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22852, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:59', '2022-01-23 03:26:59', 18, 0, '', NULL, '2022-01-23 03:26:59', NULL, '2022-01-23 03:26:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22853, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:59', '2022-01-23 03:26:59', 28, 0, '', NULL, '2022-01-23 03:26:59', NULL, '2022-01-23 03:26:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22854, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:26:59', '2022-01-23 03:26:59', 5, 0, '', NULL, '2022-01-23 03:26:59', NULL, '2022-01-23 03:26:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22855, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:00', '2022-01-23 03:27:00', 17, 0, '', NULL, '2022-01-23 03:27:00', NULL, '2022-01-23 03:27:00', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22856, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:00', '2022-01-23 03:27:00', 27, 0, '', NULL, '2022-01-23 03:27:00', NULL, '2022-01-23 03:27:00', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22857, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:03', '2022-01-23 03:27:03', 30, 0, '', NULL, '2022-01-23 03:27:03', NULL, '2022-01-23 03:27:03', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22858, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:03', '2022-01-23 03:27:03', 44, 0, '', NULL, '2022-01-23 03:27:03', NULL, '2022-01-23 03:27:03', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22859, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:03', '2022-01-23 03:27:03', 8, 0, '', NULL, '2022-01-23 03:27:03', NULL, '2022-01-23 03:27:03', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22860, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:03', '2022-01-23 03:27:03', 16, 0, '', NULL, '2022-01-23 03:27:03', NULL, '2022-01-23 03:27:03', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22861, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:03', '2022-01-23 03:27:04', 58, 0, '', NULL, '2022-01-23 03:27:04', NULL, '2022-01-23 03:27:04', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22862, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:42', '2022-01-23 03:27:42', 28, 0, '', NULL, '2022-01-23 03:27:42', NULL, '2022-01-23 03:27:42', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22863, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:42', '2022-01-23 03:27:42', 44, 0, '', NULL, '2022-01-23 03:27:42', NULL, '2022-01-23 03:27:42', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22864, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:42', '2022-01-23 03:27:42', 6, 0, '', NULL, '2022-01-23 03:27:42', NULL, '2022-01-23 03:27:42', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22865, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:43', '2022-01-23 03:27:43', 12, 0, '', NULL, '2022-01-23 03:27:43', NULL, '2022-01-23 03:27:43', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22866, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:43', '2022-01-23 03:27:43', 30, 0, '', NULL, '2022-01-23 03:27:43', NULL, '2022-01-23 03:27:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22867, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:49', '2022-01-23 03:27:49', 16, 0, '', NULL, '2022-01-23 03:27:49', NULL, '2022-01-23 03:27:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22868, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:49', '2022-01-23 03:27:49', 25, 0, '', NULL, '2022-01-23 03:27:49', NULL, '2022-01-23 03:27:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22869, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:49', '2022-01-23 03:27:49', 5, 0, '', NULL, '2022-01-23 03:27:49', NULL, '2022-01-23 03:27:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22870, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:50', '2022-01-23 03:27:50', 15, 0, '', NULL, '2022-01-23 03:27:50', NULL, '2022-01-23 03:27:50', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22871, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:27:50', '2022-01-23 03:27:50', 29, 0, '', NULL, '2022-01-23 03:27:50', NULL, '2022-01-23 03:27:50', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22872, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:29:58', '2022-01-23 03:29:58', 28, 0, '', NULL, '2022-01-23 03:29:58', NULL, '2022-01-23 03:29:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22873, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:29:58', '2022-01-23 03:29:58', 43, 0, '', NULL, '2022-01-23 03:29:58', NULL, '2022-01-23 03:29:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22874, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:29:58', '2022-01-23 03:29:58', 6, 0, '', NULL, '2022-01-23 03:29:58', NULL, '2022-01-23 03:29:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22875, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:29:58', '2022-01-23 03:29:58', 15, 0, '', NULL, '2022-01-23 03:29:58', NULL, '2022-01-23 03:29:58', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22876, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:29:58', '2022-01-23 03:29:58', 45, 0, '', NULL, '2022-01-23 03:29:58', NULL, '2022-01-23 03:29:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22877, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:02', '2022-01-23 03:30:02', 21, 0, '', NULL, '2022-01-23 03:30:02', NULL, '2022-01-23 03:30:02', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22878, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:02', '2022-01-23 03:30:02', 32, 0, '', NULL, '2022-01-23 03:30:02', NULL, '2022-01-23 03:30:02', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22879, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:02', '2022-01-23 03:30:02', 5, 0, '', NULL, '2022-01-23 03:30:02', NULL, '2022-01-23 03:30:02', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22880, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:02', '2022-01-23 03:30:02', 14, 0, '', NULL, '2022-01-23 03:30:02', NULL, '2022-01-23 03:30:02', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22881, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:02', '2022-01-23 03:30:03', 31, 0, '', NULL, '2022-01-23 03:30:03', NULL, '2022-01-23 03:30:03', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22882, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:25', '2022-01-23 03:30:25', 32, 0, '', NULL, '2022-01-23 03:30:25', NULL, '2022-01-23 03:30:25', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22883, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:25', '2022-01-23 03:30:25', 46, 0, '', NULL, '2022-01-23 03:30:25', NULL, '2022-01-23 03:30:25', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22884, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:25', '2022-01-23 03:30:25', 10, 0, '', NULL, '2022-01-23 03:30:25', NULL, '2022-01-23 03:30:25', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22885, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:25', '2022-01-23 03:30:25', 19, 0, '', NULL, '2022-01-23 03:30:25', NULL, '2022-01-23 03:30:25', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22886, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:30:25', '2022-01-23 03:30:25', 62, 0, '', NULL, '2022-01-23 03:30:25', NULL, '2022-01-23 03:30:25', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22887, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:18', '2022-01-23 03:32:18', 64, 0, '', NULL, '2022-01-23 03:32:18', NULL, '2022-01-23 03:32:18', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22888, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:18', '2022-01-23 03:32:19', 155, 0, '', NULL, '2022-01-23 03:32:19', NULL, '2022-01-23 03:32:19', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22889, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\",\"key\":\"eee\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:49', '2022-01-23 03:32:49', 148, 0, '', NULL, '2022-01-23 03:32:49', NULL, '2022-01-23 03:32:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22890, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/role/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:50', '2022-01-23 03:32:51', 36, 0, '', NULL, '2022-01-23 03:32:51', NULL, '2022-01-23 03:32:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22891, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/task-assign-rule/list', '{\"query\":{\"processDefinitionId\":\"eee:17:f3aad03b-7ae5-11ec-a69c-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:50', '2022-01-23 03:32:51', 63, 0, '', NULL, '2022-01-23 03:32:51', NULL, '2022-01-23 03:32:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22892, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dept/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:50', '2022-01-23 03:32:51', 58, 0, '', NULL, '2022-01-23 03:32:51', NULL, '2022-01-23 03:32:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22893, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/post/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:50', '2022-01-23 03:32:51', 60, 0, '', NULL, '2022-01-23 03:32:51', NULL, '2022-01-23 03:32:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22894, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/user-group/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:51', '2022-01-23 03:32:51', 65, 0, '', NULL, '2022-01-23 03:32:51', NULL, '2022-01-23 03:32:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22895, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/user/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:50', '2022-01-23 03:32:51', 82, 0, '', NULL, '2022-01-23 03:32:51', NULL, '2022-01-23 03:32:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22896, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:54', '2022-01-23 03:32:54', 13, 0, '', NULL, '2022-01-23 03:32:54', NULL, '2022-01-23 03:32:54', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22897, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:54', '2022-01-23 03:32:54', 98, 0, '', NULL, '2022-01-23 03:32:54', NULL, '2022-01-23 03:32:54', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22898, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/role/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:56', '2022-01-23 03:32:56', 27, 0, '', NULL, '2022-01-23 03:32:56', NULL, '2022-01-23 03:32:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22899, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/post/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:56', '2022-01-23 03:32:56', 28, 0, '', NULL, '2022-01-23 03:32:56', NULL, '2022-01-23 03:32:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22900, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dept/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:56', '2022-01-23 03:32:56', 47, 0, '', NULL, '2022-01-23 03:32:56', NULL, '2022-01-23 03:32:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22901, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/user-group/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:56', '2022-01-23 03:32:56', 23, 0, '', NULL, '2022-01-23 03:32:56', NULL, '2022-01-23 03:32:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22902, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/user/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:56', '2022-01-23 03:32:56', 48, 0, '', NULL, '2022-01-23 03:32:56', NULL, '2022-01-23 03:32:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22903, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/task-assign-rule/list', '{\"query\":{\"modelId\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:32:56', '2022-01-23 03:32:56', 217, 0, '', NULL, '2022-01-23 03:32:56', NULL, '2022-01-23 03:32:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22904, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:33:55', '2022-01-23 03:33:55', 21, 0, '', NULL, '2022-01-23 03:33:55', NULL, '2022-01-23 03:33:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22905, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:33:55', '2022-01-23 03:33:55', 40, 0, '', NULL, '2022-01-23 03:33:55', NULL, '2022-01-23 03:33:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22906, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:33:55', '2022-01-23 03:33:55', 5, 0, '', NULL, '2022-01-23 03:33:55', NULL, '2022-01-23 03:33:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22907, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:33:55', '2022-01-23 03:33:55', 14, 0, '', NULL, '2022-01-23 03:33:55', NULL, '2022-01-23 03:33:55', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22908, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:33:56', '2022-01-23 03:33:56', 43, 0, '', NULL, '2022-01-23 03:33:56', NULL, '2022-01-23 03:33:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22909, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:23', '2022-01-23 03:34:23', 19, 0, '', NULL, '2022-01-23 03:34:23', NULL, '2022-01-23 03:34:23', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22910, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:23', '2022-01-23 03:34:23', 30, 0, '', NULL, '2022-01-23 03:34:23', NULL, '2022-01-23 03:34:23', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22911, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:23', '2022-01-23 03:34:23', 7, 0, '', NULL, '2022-01-23 03:34:23', NULL, '2022-01-23 03:34:23', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22912, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:23', '2022-01-23 03:34:23', 18, 0, '', NULL, '2022-01-23 03:34:23', NULL, '2022-01-23 03:34:23', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22913, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:23', '2022-01-23 03:34:23', 18, 0, '', NULL, '2022-01-23 03:34:23', NULL, '2022-01-23 03:34:23', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22914, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:23', '2022-01-23 03:34:23', 101, 0, '', NULL, '2022-01-23 03:34:23', NULL, '2022-01-23 03:34:23', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22915, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:38', '2022-01-23 03:34:38', 24, 0, '', NULL, '2022-01-23 03:34:38', NULL, '2022-01-23 03:34:38', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22916, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:38', '2022-01-23 03:34:38', 39, 0, '', NULL, '2022-01-23 03:34:38', NULL, '2022-01-23 03:34:38', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22917, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:38', '2022-01-23 03:34:38', 6, 0, '', NULL, '2022-01-23 03:34:38', NULL, '2022-01-23 03:34:38', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22918, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:39', '2022-01-23 03:34:39', 19, 0, '', NULL, '2022-01-23 03:34:39', NULL, '2022-01-23 03:34:39', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22919, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/get', '{\"query\":{\"id\":\"02b756a8-79af-11ec-abb0-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:34:39', '2022-01-23 03:34:39', 48, 0, '', NULL, '2022-01-23 03:34:39', NULL, '2022-01-23 03:34:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22920, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:44', '2022-01-23 03:37:44', 28, 0, '', NULL, '2022-01-23 03:37:44', NULL, '2022-01-23 03:37:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22921, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:44', '2022-01-23 03:37:44', 46, 0, '', NULL, '2022-01-23 03:37:44', NULL, '2022-01-23 03:37:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22922, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:44', '2022-01-23 03:37:44', 22, 0, '', NULL, '2022-01-23 03:37:44', NULL, '2022-01-23 03:37:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22923, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:44', '2022-01-23 03:37:44', 5, 0, '', NULL, '2022-01-23 03:37:44', NULL, '2022-01-23 03:37:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22924, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:44', '2022-01-23 03:37:44', 31, 0, '', NULL, '2022-01-23 03:37:44', NULL, '2022-01-23 03:37:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22925, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:44', '2022-01-23 03:37:44', 6, 0, '', NULL, '2022-01-23 03:37:44', NULL, '2022-01-23 03:37:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22926, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:44', '2022-01-23 03:37:44', 26, 0, '', NULL, '2022-01-23 03:37:44', NULL, '2022-01-23 03:37:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22927, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:44', '2022-01-23 03:37:44', 36, 0, '', NULL, '2022-01-23 03:37:44', NULL, '2022-01-23 03:37:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22928, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:45', '2022-01-23 03:37:45', 17, 0, '', NULL, '2022-01-23 03:37:45', NULL, '2022-01-23 03:37:45', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22929, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:45', '2022-01-23 03:37:45', 16, 0, '', NULL, '2022-01-23 03:37:45', NULL, '2022-01-23 03:37:45', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22930, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:45', '2022-01-23 03:37:45', 14, 0, '', NULL, '2022-01-23 03:37:45', NULL, '2022-01-23 03:37:45', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22931, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:45', '2022-01-23 03:37:45', 125, 0, '', NULL, '2022-01-23 03:37:45', NULL, '2022-01-23 03:37:45', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22932, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:45', '2022-01-23 03:37:45', 20, 0, '', NULL, '2022-01-23 03:37:45', NULL, '2022-01-23 03:37:45', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22933, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:45', '2022-01-23 03:37:45', 141, 0, '', NULL, '2022-01-23 03:37:45', NULL, '2022-01-23 03:37:45', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22934, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:46', '2022-01-23 03:37:46', 18, 0, '', NULL, '2022-01-23 03:37:46', NULL, '2022-01-23 03:37:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22935, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:46', '2022-01-23 03:37:46', 35, 0, '', NULL, '2022-01-23 03:37:46', NULL, '2022-01-23 03:37:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22936, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:46', '2022-01-23 03:37:46', 5, 0, '', NULL, '2022-01-23 03:37:46', NULL, '2022-01-23 03:37:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22937, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:46', '2022-01-23 03:37:46', 4, 0, '', NULL, '2022-01-23 03:37:46', NULL, '2022-01-23 03:37:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22938, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:47', '2022-01-23 03:37:47', 11, 0, '', NULL, '2022-01-23 03:37:47', NULL, '2022-01-23 03:37:47', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22939, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/task/todo-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:47', '2022-01-23 03:37:47', 121, 0, '', NULL, '2022-01-23 03:37:47', NULL, '2022-01-23 03:37:47', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22940, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:47', '2022-01-23 03:37:47', 19, 0, '', NULL, '2022-01-23 03:37:47', NULL, '2022-01-23 03:37:47', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22941, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/task/todo-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:47', '2022-01-23 03:37:47', 64, 0, '', NULL, '2022-01-23 03:37:47', NULL, '2022-01-23 03:37:47', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22942, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:52', '2022-01-23 03:37:52', 23, 0, '', NULL, '2022-01-23 03:37:52', NULL, '2022-01-23 03:37:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22943, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:52', '2022-01-23 03:37:52', 34, 0, '', NULL, '2022-01-23 03:37:52', NULL, '2022-01-23 03:37:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22944, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:52', '2022-01-23 03:37:52', 5, 0, '', NULL, '2022-01-23 03:37:52', NULL, '2022-01-23 03:37:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22945, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:52', '2022-01-23 03:37:52', 26, 0, '', NULL, '2022-01-23 03:37:52', NULL, '2022-01-23 03:37:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22946, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:52', '2022-01-23 03:37:52', 39, 0, '', NULL, '2022-01-23 03:37:52', NULL, '2022-01-23 03:37:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22947, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:52', '2022-01-23 03:37:52', 30, 0, '', NULL, '2022-01-23 03:37:52', NULL, '2022-01-23 03:37:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22948, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:52', '2022-01-23 03:37:52', 74, 0, '', NULL, '2022-01-23 03:37:52', NULL, '2022-01-23 03:37:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22949, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:53', '2022-01-23 03:37:53', 5, 0, '', NULL, '2022-01-23 03:37:53', NULL, '2022-01-23 03:37:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22950, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:54', '2022-01-23 03:37:54', 25, 0, '', NULL, '2022-01-23 03:37:54', NULL, '2022-01-23 03:37:54', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22951, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:54', '2022-01-23 03:37:54', 41, 0, '', NULL, '2022-01-23 03:37:54', NULL, '2022-01-23 03:37:54', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22952, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:54', '2022-01-23 03:37:54', 6, 0, '', NULL, '2022-01-23 03:37:54', NULL, '2022-01-23 03:37:54', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22953, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:54', '2022-01-23 03:37:54', 5, 0, '', NULL, '2022-01-23 03:37:54', NULL, '2022-01-23 03:37:54', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22954, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:54', '2022-01-23 03:37:54', 22, 0, '', NULL, '2022-01-23 03:37:54', NULL, '2022-01-23 03:37:54', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22955, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:54', '2022-01-23 03:37:54', 19, 0, '', NULL, '2022-01-23 03:37:54', NULL, '2022-01-23 03:37:54', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22956, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:54', '2022-01-23 03:37:55', 120, 0, '', NULL, '2022-01-23 03:37:55', NULL, '2022-01-23 03:37:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22957, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:55', '2022-01-23 03:37:55', 16, 0, '', NULL, '2022-01-23 03:37:55', NULL, '2022-01-23 03:37:55', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22958, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:55', '2022-01-23 03:37:55', 17, 0, '', NULL, '2022-01-23 03:37:55', NULL, '2022-01-23 03:37:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22959, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:55', '2022-01-23 03:37:55', 144, 0, '', NULL, '2022-01-23 03:37:55', NULL, '2022-01-23 03:37:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22960, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:56', '2022-01-23 03:37:56', 17, 0, '', NULL, '2022-01-23 03:37:56', NULL, '2022-01-23 03:37:56', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22961, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/task/todo-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:56', '2022-01-23 03:37:56', 68, 0, '', NULL, '2022-01-23 03:37:56', NULL, '2022-01-23 03:37:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22962, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:56', '2022-01-23 03:37:56', 18, 0, '', NULL, '2022-01-23 03:37:56', NULL, '2022-01-23 03:37:56', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22963, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/task/todo-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:37:56', '2022-01-23 03:37:56', 61, 0, '', NULL, '2022-01-23 03:37:56', NULL, '2022-01-23 03:37:56', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22964, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:44:45', '2022-01-23 03:44:45', 146, 0, '', NULL, '2022-01-23 03:44:45', NULL, '2022-01-23 03:44:45', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22965, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:44:45', '2022-01-23 03:44:45', 156, 0, '', NULL, '2022-01-23 03:44:45', NULL, '2022-01-23 03:44:45', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22966, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:44:45', '2022-01-23 03:44:45', 4, 0, '', NULL, '2022-01-23 03:44:45', NULL, '2022-01-23 03:44:45', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22967, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:44:45', '2022-01-23 03:44:45', 12, 0, '', NULL, '2022-01-23 03:44:45', NULL, '2022-01-23 03:44:45', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22968, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:44:45', '2022-01-23 03:44:46', 16, 0, '', NULL, '2022-01-23 03:44:46', NULL, '2022-01-23 03:44:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22969, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/model/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 03:44:45', '2022-01-23 03:44:46', 120, 0, '', NULL, '2022-01-23 03:44:46', NULL, '2022-01-23 03:44:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22970, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:38', '2022-01-23 04:10:38', 47, 0, '', NULL, '2022-01-23 04:10:38', NULL, '2022-01-23 04:10:38', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22971, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:38', '2022-01-23 04:10:38', 50, 0, '', NULL, '2022-01-23 04:10:38', NULL, '2022-01-23 04:10:38', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22972, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:39', '2022-01-23 04:10:39', 1, 0, '', NULL, '2022-01-23 04:10:39', NULL, '2022-01-23 04:10:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22973, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', 'undefined', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:39', '2022-01-23 04:10:39', 10, 0, '', NULL, '2022-01-23 04:10:39', NULL, '2022-01-23 04:10:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22974, '', 0, 0, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', 'undefined', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:39', '2022-01-23 04:10:39', 11, 0, '', NULL, '2022-01-23 04:10:39', NULL, '2022-01-23 04:10:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22975, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', 'undefined', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:39', '2022-01-23 04:10:39', 10, 0, '', NULL, '2022-01-23 04:10:39', NULL, '2022-01-23 04:10:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22976, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', 'undefined', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:39', '2022-01-23 04:10:39', 10, 0, '', NULL, '2022-01-23 04:10:39', NULL, '2022-01-23 04:10:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22977, '', 0, 0, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', 'undefined', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:39', '2022-01-23 04:10:39', 10, 0, '', NULL, '2022-01-23 04:10:39', NULL, '2022-01-23 04:10:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22978, '', 0, 0, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', 'undefined', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:10:39', '2022-01-23 04:10:39', 9, 0, '', NULL, '2022-01-23 04:10:39', NULL, '2022-01-23 04:10:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22979, '', 0, 0, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:46', '2022-01-23 04:19:46', 51, 0, '', NULL, '2022-01-23 04:19:47', NULL, '2022-01-23 04:19:47', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22980, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:46', '2022-01-23 04:19:46', 51, 0, '', NULL, '2022-01-23 04:19:47', NULL, '2022-01-23 04:19:47', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22981, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:47', '2022-01-23 04:19:47', 12, 0, '', NULL, '2022-01-23 04:19:47', NULL, '2022-01-23 04:19:47', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22982, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:48', '2022-01-23 04:19:48', 2, 0, '', NULL, '2022-01-23 04:19:48', NULL, '2022-01-23 04:19:48', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22983, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:48', '2022-01-23 04:19:49', 1172, 0, '', NULL, '2022-01-23 04:19:49', NULL, '2022-01-23 04:19:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22984, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:47', '2022-01-23 04:19:49', 2370, 0, '', NULL, '2022-01-23 04:19:49', NULL, '2022-01-23 04:19:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22985, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/tenant/get-id-by-name', '{\"query\":{\"name\":\"芋道源码\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:52', '2022-01-23 04:19:52', 45, 0, '', NULL, '2022-01-23 04:19:52', NULL, '2022-01-23 04:19:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22986, '', 0, 0, 'yudao-admin-server', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"nzgnu\\\",\\\"uuid\\\":\\\"256030e97aa64c5a84e0614f5b065a66\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:52', '2022-01-23 04:19:53', 366, 0, '', NULL, '2022-01-23 04:19:53', NULL, '2022-01-23 04:19:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22987, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:53', '2022-01-23 04:19:53', 54, 0, '', NULL, '2022-01-23 04:19:53', NULL, '2022-01-23 04:19:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22988, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:53', '2022-01-23 04:19:53', 60, 0, '', NULL, '2022-01-23 04:19:53', NULL, '2022-01-23 04:19:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22989, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:53', '2022-01-23 04:19:53', 12, 0, '', NULL, '2022-01-23 04:19:53', NULL, '2022-01-23 04:19:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22990, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:53', '2022-01-23 04:19:53', 40, 0, '', NULL, '2022-01-23 04:19:53', NULL, '2022-01-23 04:19:53', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (22991, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:58', '2022-01-23 04:19:58', 106, 0, '', NULL, '2022-01-23 04:19:58', NULL, '2022-01-23 04:19:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22992, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:59', '2022-01-23 04:19:59', 29, 0, '', NULL, '2022-01-23 04:19:59', NULL, '2022-01-23 04:19:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22993, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/app/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:19:59', '2022-01-23 04:19:59', 117, 0, '', NULL, '2022-01-23 04:19:59', NULL, '2022-01-23 04:19:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22994, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:00', '2022-01-23 04:20:00', 19, 0, '', NULL, '2022-01-23 04:20:00', NULL, '2022-01-23 04:20:00', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22995, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:00', '2022-01-23 04:20:00', 138, 0, '', NULL, '2022-01-23 04:20:00', NULL, '2022-01-23 04:20:00', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22996, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:00', '2022-01-23 04:20:00', 16, 0, '', NULL, '2022-01-23 04:20:00', NULL, '2022-01-23 04:20:00', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22997, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:00', '2022-01-23 04:20:00', 87, 0, '', NULL, '2022-01-23 04:20:00', NULL, '2022-01-23 04:20:00', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22998, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:01', '2022-01-23 04:20:01', 26, 0, '', NULL, '2022-01-23 04:20:01', NULL, '2022-01-23 04:20:01', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (22999, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:07', '2022-01-23 04:20:07', 17, 0, '', NULL, '2022-01-23 04:20:07', NULL, '2022-01-23 04:20:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23000, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/app/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:07', '2022-01-23 04:20:07', 67, 0, '', NULL, '2022-01-23 04:20:07', NULL, '2022-01-23 04:20:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23001, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:10', '2022-01-23 04:20:10', 20, 0, '', NULL, '2022-01-23 04:20:10', NULL, '2022-01-23 04:20:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23002, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:10', '2022-01-23 04:20:10', 53, 0, '', NULL, '2022-01-23 04:20:10', NULL, '2022-01-23 04:20:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23003, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:11', '2022-01-23 04:20:11', 22, 0, '', NULL, '2022-01-23 04:20:11', NULL, '2022-01-23 04:20:11', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23004, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:11', '2022-01-23 04:20:11', 54, 0, '', NULL, '2022-01-23 04:20:11', NULL, '2022-01-23 04:20:11', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23005, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:13', '2022-01-23 04:20:13', 27, 0, '', NULL, '2022-01-23 04:20:13', NULL, '2022-01-23 04:20:13', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23006, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:14', '2022-01-23 04:20:15', 15, 0, '', NULL, '2022-01-23 04:20:15', NULL, '2022-01-23 04:20:15', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23007, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:14', '2022-01-23 04:20:15', 41, 0, '', NULL, '2022-01-23 04:20:15', NULL, '2022-01-23 04:20:15', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23008, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:25', '2022-01-23 04:20:25', 24, 0, '', NULL, '2022-01-23 04:20:25', NULL, '2022-01-23 04:20:25', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23009, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/get', '{\"query\":{\"id\":\"1\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:27', '2022-01-23 04:20:27', 17, 0, '', NULL, '2022-01-23 04:20:27', NULL, '2022-01-23 04:20:27', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23010, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:30', '2022-01-23 04:20:30', 22, 0, '', NULL, '2022-01-23 04:20:30', NULL, '2022-01-23 04:20:30', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23011, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/app/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 04:20:30', '2022-01-23 04:20:30', 68, 0, '', NULL, '2022-01-23 04:20:30', NULL, '2022-01-23 04:20:30', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23012, '', 0, 0, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:11', '2022-01-23 12:40:11', 46, 0, '', NULL, '2022-01-23 12:40:12', NULL, '2022-01-23 12:40:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23013, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:11', '2022-01-23 12:40:11', 46, 0, '', NULL, '2022-01-23 12:40:12', NULL, '2022-01-23 12:40:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23014, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:12', '2022-01-23 12:40:12', 22, 0, '', NULL, '2022-01-23 12:40:12', NULL, '2022-01-23 12:40:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23015, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:12', '2022-01-23 12:40:17', 4835, 0, '', NULL, '2022-01-23 12:40:17', NULL, '2022-01-23 12:40:17', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23016, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:12', '2022-01-23 12:40:17', 4887, 0, '', NULL, '2022-01-23 12:40:17', NULL, '2022-01-23 12:40:17', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23017, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/tenant/get-id-by-name', '{\"query\":{\"name\":\"芋道源码\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:58', '2022-01-23 12:40:58', 164, 0, '', NULL, '2022-01-23 12:40:58', NULL, '2022-01-23 12:40:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23018, '', 0, 0, 'yudao-admin-server', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"493kz\\\",\\\"uuid\\\":\\\"7e3a66a57c4d491cba7ca3425029d780\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:58', '2022-01-23 12:40:59', 359, 0, '', NULL, '2022-01-23 12:40:59', NULL, '2022-01-23 12:40:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23019, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:59', '2022-01-23 12:40:59', 67, 0, '', NULL, '2022-01-23 12:40:59', NULL, '2022-01-23 12:40:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23020, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:59', '2022-01-23 12:40:59', 62, 0, '', NULL, '2022-01-23 12:40:59', NULL, '2022-01-23 12:40:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23021, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:40:59', '2022-01-23 12:40:59', 17, 0, '', NULL, '2022-01-23 12:40:59', NULL, '2022-01-23 12:40:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23022, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:41:00', '2022-01-23 12:41:00', 53, 0, '', NULL, '2022-01-23 12:41:00', NULL, '2022-01-23 12:41:00', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23023, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/oa/leave/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:41:07', '2022-01-23 12:41:07', 119, 0, '', NULL, '2022-01-23 12:41:07', NULL, '2022-01-23 12:41:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23024, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:41:07', '2022-01-23 12:41:08', 104, 0, '', NULL, '2022-01-23 12:41:08', NULL, '2022-01-23 12:41:08', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23025, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/list', '{\"query\":{\"suspensionState\":\"1\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:41:10', '2022-01-23 12:41:10', 71, 0, '', NULL, '2022-01-23 12:41:10', NULL, '2022-01-23 12:41:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23026, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/get-bpmn-xml', '{\"query\":{\"id\":\"eee:17:f3aad03b-7ae5-11ec-a69c-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:41:12', '2022-01-23 12:41:12', 33, 0, '', NULL, '2022-01-23 12:41:12', NULL, '2022-01-23 12:41:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23027, '', 1, 2, 'yudao-admin-server', 'POST', '/api/bpm/process-instance/create', '{\"query\":{},\"body\":\"{\\\"processDefinitionId\\\":\\\"eee:17:f3aad03b-7ae5-11ec-a69c-a2380e71991a\\\",\\\"variables\\\":{\\\"field121\\\":\\\"AAA\\\",\\\"field122\\\":[1]}}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:41:14', '2022-01-23 12:41:19', 4971, 0, '', NULL, '2022-01-23 12:41:19', NULL, '2022-01-23 12:41:19', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23028, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:41:21', '2022-01-23 12:41:21', 71, 0, '', NULL, '2022-01-23 12:41:21', NULL, '2022-01-23 12:41:21', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23029, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:49', '2022-01-23 12:49:49', 251, 0, '', NULL, '2022-01-23 12:49:49', NULL, '2022-01-23 12:49:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23030, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:49', '2022-01-23 12:49:49', 251, 0, '', NULL, '2022-01-23 12:49:49', NULL, '2022-01-23 12:49:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23031, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:49', '2022-01-23 12:49:49', 24, 0, '', NULL, '2022-01-23 12:49:49', NULL, '2022-01-23 12:49:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23032, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:49', '2022-01-23 12:49:50', 70, 0, '', NULL, '2022-01-23 12:49:50', NULL, '2022-01-23 12:49:50', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23033, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/list', '{\"query\":{\"suspensionState\":\"1\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:49', '2022-01-23 12:49:50', 158, 0, '', NULL, '2022-01-23 12:49:50', NULL, '2022-01-23 12:49:50', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23034, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/oa/leave/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:53', '2022-01-23 12:49:53', 153, 0, '', NULL, '2022-01-23 12:49:53', NULL, '2022-01-23 12:49:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23035, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:55', '2022-01-23 12:49:55', 140, 0, '', NULL, '2022-01-23 12:49:55', NULL, '2022-01-23 12:49:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23036, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/list', '{\"query\":{\"suspensionState\":\"1\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:57', '2022-01-23 12:49:57', 42, 0, '', NULL, '2022-01-23 12:49:57', NULL, '2022-01-23 12:49:57', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23037, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/get-bpmn-xml', '{\"query\":{\"id\":\"test_001:4:3dbe6714-76b1-11ec-9c66-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:49:59', '2022-01-23 12:49:59', 34, 0, '', NULL, '2022-01-23 12:49:59', NULL, '2022-01-23 12:49:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23038, '', 1, 2, 'yudao-admin-server', 'POST', '/api/bpm/process-instance/create', '{\"query\":{},\"body\":\"{\\\"processDefinitionId\\\":\\\"test_001:4:3dbe6714-76b1-11ec-9c66-a2380e71991a\\\",\\\"variables\\\":{\\\"field121\\\":\\\"AAA\\\",\\\"field122\\\":[1]}}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:02', '2022-01-23 12:50:06', 4140, 0, '', NULL, '2022-01-23 12:50:06', NULL, '2022-01-23 12:50:06', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23039, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:07', '2022-01-23 12:50:07', 162, 0, '', NULL, '2022-01-23 12:50:07', NULL, '2022-01-23 12:50:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23040, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/list', '{\"query\":{\"suspensionState\":\"1\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:38', '2022-01-23 12:50:38', 41, 0, '', NULL, '2022-01-23 12:50:38', NULL, '2022-01-23 12:50:38', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23041, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/list', '{\"query\":{\"suspensionState\":\"1\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:42', '2022-01-23 12:50:42', 28, 0, '', NULL, '2022-01-23 12:50:42', NULL, '2022-01-23 12:50:42', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23042, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/get-bpmn-xml', '{\"query\":{\"id\":\"self:2:3a5a065e-76b1-11ec-9c66-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:44', '2022-01-23 12:50:44', 16, 0, '', NULL, '2022-01-23 12:50:44', NULL, '2022-01-23 12:50:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23043, '', 1, 2, 'yudao-admin-server', 'POST', '/api/bpm/process-instance/create', '{\"query\":{},\"body\":\"{\\\"processDefinitionId\\\":\\\"self:2:3a5a065e-76b1-11ec-9c66-a2380e71991a\\\",\\\"variables\\\":{\\\"field121\\\":\\\"aaa\\\",\\\"field122\\\":[1]}}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:46', '2022-01-23 12:50:46', 217, 500, '系统异常', NULL, '2022-01-23 12:50:46', NULL, '2022-01-23 12:50:46', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23044, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:51', '2022-01-23 12:50:51', 53, 0, '', NULL, '2022-01-23 12:50:51', NULL, '2022-01-23 12:50:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23045, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/list', '{\"query\":{\"suspensionState\":\"1\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:55', '2022-01-23 12:50:55', 29, 0, '', NULL, '2022-01-23 12:50:55', NULL, '2022-01-23 12:50:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23046, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:58:51', '2022-01-23 12:58:52', 585, 0, '', NULL, '2022-01-23 12:58:52', NULL, '2022-01-23 12:58:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23047, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:58:53', '2022-01-23 12:58:53', 48, 0, '', NULL, '2022-01-23 12:58:53', NULL, '2022-01-23 12:58:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23048, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:58:53', '2022-01-23 12:58:53', 57, 0, '', NULL, '2022-01-23 12:58:53', NULL, '2022-01-23 12:58:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23049, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:58:53', '2022-01-23 12:58:53', 16, 0, '', NULL, '2022-01-23 12:58:53', NULL, '2022-01-23 12:58:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23050, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:58:53', '2022-01-23 12:58:53', 41, 0, '', NULL, '2022-01-23 12:58:53', NULL, '2022-01-23 12:58:53', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23051, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:58:53', '2022-01-23 12:58:53', 57, 0, '', NULL, '2022-01-23 12:58:53', NULL, '2022-01-23 12:58:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23052, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:07', '2022-01-23 12:59:07', 23, 0, '', NULL, '2022-01-23 12:59:07', NULL, '2022-01-23 12:59:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23053, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:07', '2022-01-23 12:59:07', 32, 0, '', NULL, '2022-01-23 12:59:07', NULL, '2022-01-23 12:59:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23054, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:07', '2022-01-23 12:59:07', 8, 0, '', NULL, '2022-01-23 12:59:07', NULL, '2022-01-23 12:59:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23055, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:07', '2022-01-23 12:59:07', 18, 0, '', NULL, '2022-01-23 12:59:07', NULL, '2022-01-23 12:59:07', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23056, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:07', '2022-01-23 12:59:07', 46, 0, '', NULL, '2022-01-23 12:59:07', NULL, '2022-01-23 12:59:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23057, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:10', '2022-01-23 12:59:10', 40, 0, '', NULL, '2022-01-23 12:59:10', NULL, '2022-01-23 12:59:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23058, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:36', '2022-01-23 12:59:36', 25, 0, '', NULL, '2022-01-23 12:59:36', NULL, '2022-01-23 12:59:36', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23059, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:36', '2022-01-23 12:59:36', 40, 0, '', NULL, '2022-01-23 12:59:36', NULL, '2022-01-23 12:59:36', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23060, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:36', '2022-01-23 12:59:36', 6, 0, '', NULL, '2022-01-23 12:59:36', NULL, '2022-01-23 12:59:36', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23061, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:37', '2022-01-23 12:59:37', 15, 0, '', NULL, '2022-01-23 12:59:37', NULL, '2022-01-23 12:59:37', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23062, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:37', '2022-01-23 12:59:37', 50, 0, '', NULL, '2022-01-23 12:59:37', NULL, '2022-01-23 12:59:37', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23063, '', 1, 2, 'yudao-admin-server', 'DELETE', '/api/bpm/process-instance/cancel', '{\"query\":{},\"body\":\"{\\\"id\\\":\\\"ecddb286-7c07-11ec-a41d-acde48001122\\\",\\\"reason\\\":\\\"aaa\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:40', '2022-01-23 12:59:41', 403, 0, '', NULL, '2022-01-23 12:59:41', NULL, '2022-01-23 12:59:41', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23064, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:41', '2022-01-23 12:59:41', 41, 0, '', NULL, '2022-01-23 12:59:41', NULL, '2022-01-23 12:59:41', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23065, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/task/todo-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:43', '2022-01-23 12:59:43', 92, 0, '', NULL, '2022-01-23 12:59:43', NULL, '2022-01-23 12:59:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23066, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:44', '2022-01-23 12:59:44', 49, 0, '', NULL, '2022-01-23 12:59:44', NULL, '2022-01-23 12:59:44', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23067, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/user/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:48', '2022-01-23 12:59:48', 40, 0, '', NULL, '2022-01-23 12:59:48', NULL, '2022-01-23 12:59:48', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23068, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/user-group/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:48', '2022-01-23 12:59:48', 58, 0, '', NULL, '2022-01-23 12:59:48', NULL, '2022-01-23 12:59:48', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23069, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:51', '2022-01-23 12:59:51', 44, 0, '', NULL, '2022-01-23 12:59:51', NULL, '2022-01-23 12:59:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23070, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/list', '{\"query\":{\"suspensionState\":\"1\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:52', '2022-01-23 12:59:53', 49, 0, '', NULL, '2022-01-23 12:59:53', NULL, '2022-01-23 12:59:53', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23071, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-definition/get-bpmn-xml', '{\"query\":{\"id\":\"test:21:c2cd44b0-79b0-11ec-b2b8-a2380e71991a\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:55', '2022-01-23 12:59:55', 25, 0, '', NULL, '2022-01-23 12:59:55', NULL, '2022-01-23 12:59:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23072, '', 1, 2, 'yudao-admin-server', 'POST', '/api/bpm/process-instance/create', '{\"query\":{},\"body\":\"{\\\"processDefinitionId\\\":\\\"test:21:c2cd44b0-79b0-11ec-b2b8-a2380e71991a\\\",\\\"variables\\\":{\\\"field121\\\":\\\"aaa\\\",\\\"field122\\\":[1]}}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:57', '2022-01-23 12:59:57', 392, 0, '', NULL, '2022-01-23 12:59:57', NULL, '2022-01-23 12:59:57', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23073, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/process-instance/my-page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:59:58', '2022-01-23 12:59:58', 35, 0, '', NULL, '2022-01-23 12:59:58', NULL, '2022-01-23 12:59:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23074, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:12:55', '2022-01-23 13:12:55', 182, 0, '', NULL, '2022-01-23 13:12:55', NULL, '2022-01-23 13:12:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23075, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:12:55', '2022-01-23 13:12:55', 171, 0, '', NULL, '2022-01-23 13:12:55', NULL, '2022-01-23 13:12:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23076, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:12:55', '2022-01-23 13:12:55', 15, 0, '', NULL, '2022-01-23 13:12:55', NULL, '2022-01-23 13:12:55', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23077, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:12:55', '2022-01-23 13:12:55', 34, 0, '', NULL, '2022-01-23 13:12:55', NULL, '2022-01-23 13:12:55', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23078, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:13:00', '2022-01-23 13:13:00', 121, 0, '', NULL, '2022-01-23 13:13:00', NULL, '2022-01-23 13:13:00', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23079, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:18:59', '2022-01-23 13:18:59', 29, 0, '', NULL, '2022-01-23 13:18:59', NULL, '2022-01-23 13:18:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23080, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:18:59', '2022-01-23 13:18:59', 57, 0, '', NULL, '2022-01-23 13:18:59', NULL, '2022-01-23 13:18:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23081, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:18:59', '2022-01-23 13:18:59', 5, 0, '', NULL, '2022-01-23 13:18:59', NULL, '2022-01-23 13:18:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23082, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:18:59', '2022-01-23 13:18:59', 12, 0, '', NULL, '2022-01-23 13:18:59', NULL, '2022-01-23 13:18:59', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23083, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:18:59', '2022-01-23 13:18:59', 25, 0, '', NULL, '2022-01-23 13:18:59', NULL, '2022-01-23 13:18:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23084, '', 0, 0, 'yudao-admin-server', 'POST', '/api/logout', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:39', '2022-01-23 13:24:39', 6, 0, '', NULL, '2022-01-23 13:24:39', NULL, '2022-01-23 13:24:39', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23085, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/captcha/get-image', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:40', '2022-01-23 13:24:42', 1905, 0, '', NULL, '2022-01-23 13:24:42', NULL, '2022-01-23 13:24:42', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23086, '', 0, 0, 'yudao-admin-server', 'GET', '/api/system/tenant/get-id-by-name', '{\"query\":{\"name\":\"芋道源码\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:43', '2022-01-23 13:24:43', 25, 0, '', NULL, '2022-01-23 13:24:43', NULL, '2022-01-23 13:24:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23087, '', 0, 0, 'yudao-admin-server', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"111\\\",\\\"uuid\\\":\\\"7f690d86eaac44f18c0aeabfa8c4e365\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:43', '2022-01-23 13:24:43', 307, 0, '', NULL, '2022-01-23 13:24:43', NULL, '2022-01-23 13:24:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23088, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:43', '2022-01-23 13:24:43', 18, 0, '', NULL, '2022-01-23 13:24:43', NULL, '2022-01-23 13:24:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23089, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:43', '2022-01-23 13:24:43', 29, 0, '', NULL, '2022-01-23 13:24:43', NULL, '2022-01-23 13:24:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23090, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:43', '2022-01-23 13:24:43', 5, 0, '', NULL, '2022-01-23 13:24:43', NULL, '2022-01-23 13:24:43', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23091, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:44', '2022-01-23 13:24:44', 13, 0, '', NULL, '2022-01-23 13:24:44', NULL, '2022-01-23 13:24:44', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23092, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:48', '2022-01-23 13:24:48', 47, 0, '', NULL, '2022-01-23 13:24:48', NULL, '2022-01-23 13:24:48', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23093, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/user/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:49', '2022-01-23 13:24:49', 38, 0, '', NULL, '2022-01-23 13:24:49', NULL, '2022-01-23 13:24:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23094, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/user-group/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:49', '2022-01-23 13:24:49', 50, 0, '', NULL, '2022-01-23 13:24:49', NULL, '2022-01-23 13:24:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23095, '', 1, 2, 'yudao-admin-server', 'GET', '/api/bpm/form/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:50', '2022-01-23 13:24:50', 24, 0, '', NULL, '2022-01-23 13:24:50', NULL, '2022-01-23 13:24:50', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23096, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:52', '2022-01-23 13:24:52', 24, 0, '', NULL, '2022-01-23 13:24:52', NULL, '2022-01-23 13:24:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23097, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:24:52', '2022-01-23 13:24:52', 134, 0, '', NULL, '2022-01-23 13:24:52', NULL, '2022-01-23 13:24:52', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23098, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:05', '2022-01-23 13:25:05', 31, 0, '', NULL, '2022-01-23 13:25:05', NULL, '2022-01-23 13:25:05', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23099, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:06', '2022-01-23 13:25:06', 30, 0, '', NULL, '2022-01-23 13:25:06', NULL, '2022-01-23 13:25:06', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23100, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:12', '2022-01-23 13:25:12', 29, 0, '', NULL, '2022-01-23 13:25:12', NULL, '2022-01-23 13:25:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23101, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:12', '2022-01-23 13:25:12', 31, 0, '', NULL, '2022-01-23 13:25:12', NULL, '2022-01-23 13:25:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23102, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:12', '2022-01-23 13:25:12', 29, 0, '', NULL, '2022-01-23 13:25:12', NULL, '2022-01-23 13:25:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23103, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:12', '2022-01-23 13:25:13', 30, 0, '', NULL, '2022-01-23 13:25:13', NULL, '2022-01-23 13:25:13', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23104, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:32', '2022-01-23 13:25:32', 33, 0, '', NULL, '2022-01-23 13:25:32', NULL, '2022-01-23 13:25:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23105, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-31 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:42', '2022-01-23 13:25:42', 30, 0, '', NULL, '2022-01-23 13:25:42', NULL, '2022-01-23 13:25:42', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23106, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-12-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-12-31 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:48', '2022-01-23 13:25:48', 31, 0, '', NULL, '2022-01-23 13:25:48', NULL, '2022-01-23 13:25:48', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23107, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-12-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-12-31 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:49', '2022-01-23 13:25:49', 32, 0, '', NULL, '2022-01-23 13:25:49', NULL, '2022-01-23 13:25:49', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23108, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-12-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-12-31 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:50', '2022-01-23 13:25:50', 31, 0, '', NULL, '2022-01-23 13:25:50', NULL, '2022-01-23 13:25:50', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23109, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-11-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-11-30 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:25:58', '2022-01-23 13:25:58', 31, 0, '', NULL, '2022-01-23 13:25:58', NULL, '2022-01-23 13:25:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23110, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-10-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-10-31 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:26:19', '2022-01-23 13:26:19', 83, 0, '', NULL, '2022-01-23 13:26:19', NULL, '2022-01-23 13:26:19', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23111, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/get', '{\"query\":{\"id\":\"121\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:26:57', '2022-01-23 13:26:58', 77, 0, '', NULL, '2022-01-23 13:26:58', NULL, '2022-01-23 13:26:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23112, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/get', '{\"query\":{\"id\":\"120\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:27:06', '2022-01-23 13:27:06', 41, 0, '', NULL, '2022-01-23 13:27:06', NULL, '2022-01-23 13:27:06', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23113, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/get', '{\"query\":{\"id\":\"119\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:27:13', '2022-01-23 13:27:14', 40, 0, '', NULL, '2022-01-23 13:27:14', NULL, '2022-01-23 13:27:14', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23114, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:28:09', '2022-01-23 13:28:09', 13, 0, '', NULL, '2022-01-23 13:28:09', NULL, '2022-01-23 13:28:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23115, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:28:09', '2022-01-23 13:28:09', 63, 0, '', NULL, '2022-01-23 13:28:09', NULL, '2022-01-23 13:28:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23116, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2021-11-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-11-30 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:28:15', '2022-01-23 13:28:15', 31, 0, '', NULL, '2022-01-23 13:28:15', NULL, '2022-01-23 13:28:15', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23117, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:30:06', '2022-01-23 13:30:06', 27, 0, '', NULL, '2022-01-23 13:30:06', NULL, '2022-01-23 13:30:06', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23118, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:30:40', '2022-01-23 13:30:40', 12, 0, '', NULL, '2022-01-23 13:30:40', NULL, '2022-01-23 13:30:40', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23119, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/app/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:30:40', '2022-01-23 13:30:40', 79, 0, '', NULL, '2022-01-23 13:30:40', NULL, '2022-01-23 13:30:40', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23120, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/channel/get-channel', '{\"query\":{\"code\":\"alipay_app\",\"merchantId\":\"1\",\"appId\":\"6\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:30:57', '2022-01-23 13:30:57', 25, 0, '', NULL, '2022-01-23 13:30:57', NULL, '2022-01-23 13:30:57', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23121, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/channel/get-channel', '{\"query\":{\"code\":\"alipay_app\",\"merchantId\":\"1\",\"appId\":\"6\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:30:59', '2022-01-23 13:30:59', 19, 0, '', NULL, '2022-01-23 13:30:59', NULL, '2022-01-23 13:30:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23122, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/channel/get-channel', '{\"query\":{\"code\":\"alipay_app\",\"merchantId\":\"1\",\"appId\":\"6\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:02', '2022-01-23 13:31:02', 14, 0, '', NULL, '2022-01-23 13:31:02', NULL, '2022-01-23 13:31:02', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23123, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:09', '2022-01-23 13:31:09', 32, 0, '', NULL, '2022-01-23 13:31:09', NULL, '2022-01-23 13:31:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23124, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:09', '2022-01-23 13:31:09', 45, 0, '', NULL, '2022-01-23 13:31:09', NULL, '2022-01-23 13:31:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23125, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:10', '2022-01-23 13:31:10', 7, 0, '', NULL, '2022-01-23 13:31:10', NULL, '2022-01-23 13:31:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23126, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:10', '2022-01-23 13:31:10', 13, 0, '', NULL, '2022-01-23 13:31:10', NULL, '2022-01-23 13:31:10', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23127, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:11', '2022-01-23 13:31:11', 16, 0, '', NULL, '2022-01-23 13:31:11', NULL, '2022-01-23 13:31:11', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23128, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/app/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:11', '2022-01-23 13:31:11', 57, 0, '', NULL, '2022-01-23 13:31:11', NULL, '2022-01-23 13:31:11', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23129, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/channel/get-channel', '{\"query\":{\"code\":\"alipay_app\",\"merchantId\":\"1\",\"appId\":\"6\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:16', '2022-01-23 13:31:16', 16, 0, '', NULL, '2022-01-23 13:31:16', NULL, '2022-01-23 13:31:16', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23130, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:50', '2022-01-23 13:31:50', 14, 0, '', NULL, '2022-01-23 13:31:50', NULL, '2022-01-23 13:31:50', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23131, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:50', '2022-01-23 13:31:50', 39, 0, '', NULL, '2022-01-23 13:31:50', NULL, '2022-01-23 13:31:50', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23132, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:58', '2022-01-23 13:31:58', 32, 0, '', NULL, '2022-01-23 13:31:58', NULL, '2022-01-23 13:31:58', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23133, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:31:59', '2022-01-23 13:31:59', 31, 0, '', NULL, '2022-01-23 13:31:59', NULL, '2022-01-23 13:31:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23134, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-09-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-09-30 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:32:07', '2022-01-23 13:32:07', 30, 0, '', NULL, '2022-01-23 13:32:07', NULL, '2022-01-23 13:32:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23135, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-10-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-10-31 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:32:15', '2022-01-23 13:32:15', 60, 0, '', NULL, '2022-01-23 13:32:15', NULL, '2022-01-23 13:32:15', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23136, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:33:10', '2022-01-23 13:33:10', 24, 0, '', NULL, '2022-01-23 13:33:10', NULL, '2022-01-23 13:33:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23137, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:33:10', '2022-01-23 13:33:10', 42, 0, '', NULL, '2022-01-23 13:33:10', NULL, '2022-01-23 13:33:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23138, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:33:10', '2022-01-23 13:33:10', 5, 0, '', NULL, '2022-01-23 13:33:10', NULL, '2022-01-23 13:33:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23139, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:33:10', '2022-01-23 13:33:10', 15, 0, '', NULL, '2022-01-23 13:33:10', NULL, '2022-01-23 13:33:10', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23140, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:33:10', '2022-01-23 13:33:10', 20, 0, '', NULL, '2022-01-23 13:33:10', NULL, '2022-01-23 13:33:10', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23141, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:33:10', '2022-01-23 13:33:11', 46, 0, '', NULL, '2022-01-23 13:33:11', NULL, '2022-01-23 13:33:11', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23142, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-11-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-11-30 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:33:18', '2022-01-23 13:33:18', 29, 0, '', NULL, '2022-01-23 13:33:18', NULL, '2022-01-23 13:33:18', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23143, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/order/page', '{\"query\":{\"beginCreateTime\":\"2021-10-01 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2021-10-31 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:33:26', '2022-01-23 13:33:26', 54, 0, '', NULL, '2022-01-23 13:33:26', NULL, '2022-01-23 13:33:26', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23144, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:08', '2022-01-23 13:34:08', 14, 0, '', NULL, '2022-01-23 13:34:08', NULL, '2022-01-23 13:34:08', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23145, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:08', '2022-01-23 13:34:08', 38, 0, '', NULL, '2022-01-23 13:34:08', NULL, '2022-01-23 13:34:08', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23146, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:18', '2022-01-23 13:34:18', 33, 0, '', NULL, '2022-01-23 13:34:18', NULL, '2022-01-23 13:34:18', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23147, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:18', '2022-01-23 13:34:18', 35, 0, '', NULL, '2022-01-23 13:34:18', NULL, '2022-01-23 13:34:18', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23148, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:18', '2022-01-23 13:34:18', 32, 0, '', NULL, '2022-01-23 13:34:18', NULL, '2022-01-23 13:34:18', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23149, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:19', '2022-01-23 13:34:19', 33, 0, '', NULL, '2022-01-23 13:34:19', NULL, '2022-01-23 13:34:19', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23150, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:19', '2022-01-23 13:34:19', 24, 0, '', NULL, '2022-01-23 13:34:19', NULL, '2022-01-23 13:34:19', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23151, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:19', '2022-01-23 13:34:20', 47, 0, '', NULL, '2022-01-23 13:34:20', NULL, '2022-01-23 13:34:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23152, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:20', '2022-01-23 13:34:20', 6, 0, '', NULL, '2022-01-23 13:34:20', NULL, '2022-01-23 13:34:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23153, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:20', '2022-01-23 13:34:20', 14, 0, '', NULL, '2022-01-23 13:34:20', NULL, '2022-01-23 13:34:20', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23154, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:20', '2022-01-23 13:34:20', 15, 0, '', NULL, '2022-01-23 13:34:20', NULL, '2022-01-23 13:34:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23155, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-23 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-23 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 13:34:20', '2022-01-23 13:34:20', 42, 0, '', NULL, '2022-01-23 13:34:20', NULL, '2022-01-23 13:34:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23156, '', 0, 0, 'yudao-admin-server', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"1\\\",\\\"uuid\\\":\\\"44f9703e0c7049fbbc1cab18a32ea742\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:50:08', '2022-01-24 07:50:09', 359, 0, '', NULL, '2022-01-24 07:50:09', NULL, '2022-01-24 07:50:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23157, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:50:09', '2022-01-24 07:50:09', 41, 0, '', NULL, '2022-01-24 07:50:09', NULL, '2022-01-24 07:50:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23158, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:50:09', '2022-01-24 07:50:09', 50, 0, '', NULL, '2022-01-24 07:50:09', NULL, '2022-01-24 07:50:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23159, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:50:09', '2022-01-24 07:50:09', 11, 0, '', NULL, '2022-01-24 07:50:09', NULL, '2022-01-24 07:50:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23160, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:50:09', '2022-01-24 07:50:10', 39, 0, '', NULL, '2022-01-24 07:50:10', NULL, '2022-01-24 07:50:10', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23161, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/redis/get-key-list', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:50:13', '2022-01-24 07:50:13', 16, 0, '', NULL, '2022-01-24 07:50:13', NULL, '2022-01-24 07:50:13', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23162, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/redis/get-monitor-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:50:13', '2022-01-24 07:50:13', 79, 0, '', NULL, '2022-01-24 07:50:13', NULL, '2022-01-24 07:50:13', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23163, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/job/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:51:09', '2022-01-24 07:51:09', 139, 0, '', NULL, '2022-01-24 07:51:09', NULL, '2022-01-24 07:51:09', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23164, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/redis/get-key-list', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:51:12', '2022-01-24 07:51:12', 9, 0, '', NULL, '2022-01-24 07:51:12', NULL, '2022-01-24 07:51:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23165, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/redis/get-monitor-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:51:12', '2022-01-24 07:51:12', 39, 0, '', NULL, '2022-01-24 07:51:12', NULL, '2022-01-24 07:51:12', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23166, '', 1, 2, 'yudao-admin-server', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:20', '2022-01-24 07:52:20', 127, 0, '', NULL, '2022-01-24 07:52:20', NULL, '2022-01-24 07:52:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23167, '', 1, 2, 'yudao-admin-server', 'GET', '/api/get-permission-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:20', '2022-01-24 07:52:20', 161, 0, '', NULL, '2022-01-24 07:52:20', NULL, '2022-01-24 07:52:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23168, '', 1, 2, 'yudao-admin-server', 'GET', '/api/list-menus', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:20', '2022-01-24 07:52:20', 11, 0, '', NULL, '2022-01-24 07:52:20', NULL, '2022-01-24 07:52:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23169, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/redis/get-key-list', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:21', '2022-01-24 07:52:21', 23, 0, '', NULL, '2022-01-24 07:52:21', NULL, '2022-01-24 07:52:21', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23170, '', 0, 0, 'yudao-admin-server', 'GET', '/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:21', '2022-01-24 07:52:21', 51, 0, '', NULL, '2022-01-24 07:52:21', NULL, '2022-01-24 07:52:21', b'0', 0); +INSERT INTO `infra_api_access_log` VALUES (23171, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/redis/get-monitor-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:21', '2022-01-24 07:52:21', 73, 0, '', NULL, '2022-01-24 07:52:21', NULL, '2022-01-24 07:52:21', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23172, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/api-access-log/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:25', '2022-01-24 07:52:25', 145, 0, '', NULL, '2022-01-24 07:52:25', NULL, '2022-01-24 07:52:25', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23173, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/api-error-log/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:26', '2022-01-24 07:52:26', 71, 0, '', NULL, '2022-01-24 07:52:26', NULL, '2022-01-24 07:52:26', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23174, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/config/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:27', '2022-01-24 07:52:27', 49, 0, '', NULL, '2022-01-24 07:52:27', NULL, '2022-01-24 07:52:27', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23175, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/file/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:28', '2022-01-24 07:52:28', 29, 0, '', NULL, '2022-01-24 07:52:28', NULL, '2022-01-24 07:52:28', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23176, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/redis/get-key-list', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:30', '2022-01-24 07:52:30', 14, 0, '', NULL, '2022-01-24 07:52:30', NULL, '2022-01-24 07:52:30', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23177, '', 1, 2, 'yudao-admin-server', 'GET', '/api/infra/redis/get-monitor-info', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:30', '2022-01-24 07:52:30', 31, 0, '', NULL, '2022-01-24 07:52:30', NULL, '2022-01-24 07:52:30', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23178, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:31', '2022-01-24 07:52:32', 73, 0, '', NULL, '2022-01-24 07:52:32', NULL, '2022-01-24 07:52:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23179, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:32', '2022-01-24 07:52:32', 29, 0, '', NULL, '2022-01-24 07:52:32', NULL, '2022-01-24 07:52:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23180, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/app/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:32', '2022-01-24 07:52:32', 138, 0, '', NULL, '2022-01-24 07:52:32', NULL, '2022-01-24 07:52:32', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23181, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/merchant/list-by-name', '{\"query\":{}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:33', '2022-01-24 07:52:33', 20, 0, '', NULL, '2022-01-24 07:52:33', NULL, '2022-01-24 07:52:33', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23182, '', 1, 2, 'yudao-admin-server', 'GET', '/api/pay/refund/page', '{\"query\":{\"beginCreateTime\":\"2022-01-24 00:00:00\",\"pageNo\":\"1\",\"pageSize\":\"10\",\"endCreateTime\":\"2022-01-24 23:59:59\"}}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-24 07:52:33', '2022-01-24 07:52:33', 181, 0, '', NULL, '2022-01-24 07:52:33', NULL, '2022-01-24 07:52:33', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23183, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-28 23:40:57', '2022-01-28 23:40:57', 20, 0, '', NULL, '2022-01-28 23:40:57', NULL, '2022-01-28 23:40:57', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23184, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-28 23:46:37', '2022-01-28 23:46:38', 236, 500, '系统异常', NULL, '2022-01-28 23:46:38', NULL, '2022-01-28 23:46:38', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23185, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 00:35:08', '2022-01-29 00:35:08', 241, 500, '系统异常', NULL, '2022-01-29 00:35:08', NULL, '2022-01-29 00:35:08', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23186, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 00:37:24', '2022-01-29 00:37:24', 153, 1005000000, '登录失败,账号密码不正确', NULL, '2022-01-29 00:37:24', NULL, '2022-01-29 00:37:24', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23187, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 00:37:51', '2022-01-29 00:37:51', 171, 0, '', NULL, '2022-01-29 00:37:51', NULL, '2022-01-29 00:37:51', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23188, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin1234\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 00:37:59', '2022-01-29 00:37:59', 177, 1005000000, '登录失败,账号密码不正确', NULL, '2022-01-29 00:37:59', NULL, '2022-01-29 00:37:59', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23189, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/mbr/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 11:50:08', '2022-01-29 11:50:08', 297, 0, '', NULL, '2022-01-29 11:50:08', NULL, '2022-01-29 11:50:08', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23190, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/mbr/send-sms-code', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691399\\\",\\n \\\"scene\\\": 1\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 11:50:26', '2022-01-29 11:50:26', 131, 0, '', NULL, '2022-01-29 11:50:26', NULL, '2022-01-29 11:50:26', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23191, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/mbr/logout', '{\"query\":{},\"body\":\"\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 11:50:45', '2022-01-29 11:50:45', 14, 0, '', NULL, '2022-01-29 11:50:45', NULL, '2022-01-29 11:50:45', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23192, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/logout', '{\"query\":{},\"body\":\"\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 11:53:20', '2022-01-29 11:53:20', 9, 0, '', NULL, '2022-01-29 11:53:20', NULL, '2022-01-29 11:53:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23193, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/mbr/logout', '{\"query\":{},\"body\":\"\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 13:06:11', '2022-01-29 13:06:11', 30, 0, '', NULL, '2022-01-29 13:06:11', NULL, '2022-01-29 13:06:11', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23194, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/mbr/logout', '{\"query\":{},\"body\":\"\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 13:06:19', '2022-01-29 13:06:20', 13, 0, '', NULL, '2022-01-29 13:06:20', NULL, '2022-01-29 13:06:20', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23195, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/mbr/logout', '{\"query\":{},\"body\":\"\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 13:10:27', '2022-01-29 13:10:27', 21, 0, '', NULL, '2022-01-29 13:10:27', NULL, '2022-01-29 13:10:27', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23196, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/member/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 13:58:03', '2022-01-29 13:58:04', 443, 0, '', NULL, '2022-01-29 13:58:04', NULL, '2022-01-29 13:58:04', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23197, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/member/send-sms-code', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691399\\\",\\n \\\"scene\\\": 1\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 13:58:06', '2022-01-29 13:58:07', 105, 0, '', NULL, '2022-01-29 13:58:07', NULL, '2022-01-29 13:58:07', b'0', 1); +INSERT INTO `infra_api_access_log` VALUES (23198, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/member/sms-login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691301\\\",\\n \\\"code\\\": 9999\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 13:58:09', '2022-01-29 13:58:09', 38, 1005001001, '验证码已过期', NULL, '2022-01-29 13:58:09', NULL, '2022-01-29 13:58:09', b'0', 1); COMMIT; -- ---------------------------- --- Table structure for inf_api_error_log +-- Table structure for infra_api_error_log -- ---------------------------- -DROP TABLE IF EXISTS `inf_api_error_log`; -CREATE TABLE `inf_api_error_log` ( +DROP TABLE IF EXISTS `infra_api_error_log`; +CREATE TABLE `infra_api_error_log` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '编号', - `trace_id` varchar(64) NOT NULL COMMENT '链路追踪编号\n *\n * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。', + `trace_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '链路追踪编号\n *\n * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。', `user_id` int NOT NULL DEFAULT '0' COMMENT '用户编号', `user_type` tinyint NOT NULL DEFAULT '0' COMMENT '用户类型', - `application_name` varchar(50) NOT NULL COMMENT '应用名\n *\n * 目前读取 spring.application.name', - `request_method` varchar(16) NOT NULL COMMENT '请求方法名', - `request_url` varchar(255) NOT NULL COMMENT '请求地址', - `request_params` varchar(8000) NOT NULL COMMENT '请求参数', - `user_ip` varchar(50) NOT NULL COMMENT '用户 IP', - `user_agent` varchar(512) NOT NULL COMMENT '浏览器 UA', + `application_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名\n *\n * 目前读取 spring.application.name', + `request_method` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求方法名', + `request_url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求地址', + `request_params` varchar(8000) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求参数', + `user_ip` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP', + `user_agent` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA', `exception_time` datetime NOT NULL COMMENT '异常发生时间', - `exception_name` varchar(128) NOT NULL DEFAULT '' COMMENT '异常名\n *\n * {@link Throwable#getClass()} 的类全名', - `exception_message` text NOT NULL COMMENT '异常导致的消息\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}', - `exception_root_cause_message` text NOT NULL COMMENT '异常导致的根消息\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}', - `exception_stack_trace` text NOT NULL COMMENT '异常的栈轨迹\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}', - `exception_class_name` varchar(512) NOT NULL COMMENT '异常发生的类全名\n *\n * {@link StackTraceElement#getClassName()}', - `exception_file_name` varchar(512) NOT NULL COMMENT '异常发生的类文件\n *\n * {@link StackTraceElement#getFileName()}', - `exception_method_name` varchar(512) NOT NULL COMMENT '异常发生的方法名\n *\n * {@link StackTraceElement#getMethodName()}', + `exception_name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '异常名\n *\n * {@link Throwable#getClass()} 的类全名', + `exception_message` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常导致的消息\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}', + `exception_root_cause_message` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常导致的根消息\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}', + `exception_stack_trace` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常的栈轨迹\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}', + `exception_class_name` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的类全名\n *\n * {@link StackTraceElement#getClassName()}', + `exception_file_name` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的类文件\n *\n * {@link StackTraceElement#getFileName()}', + `exception_method_name` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的方法名\n *\n * {@link StackTraceElement#getMethodName()}', `exception_line_number` int NOT NULL COMMENT '异常发生的方法所在行\n *\n * {@link StackTraceElement#getLineNumber()}', `process_status` tinyint NOT NULL COMMENT '处理状态', `process_time` datetime DEFAULT NULL COMMENT '处理时间', `process_user_id` int DEFAULT '0' COMMENT '处理用户编号', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=230 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统异常日志'; +) ENGINE=InnoDB AUTO_INCREMENT=235 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统异常日志'; -- ---------------------------- --- Records of inf_api_error_log +-- Records of infra_api_error_log -- ---------------------------- BEGIN; +INSERT INTO `infra_api_error_log` VALUES (230, '', 1, 2, 'yudao-admin-server', 'POST', '/api/bpm/process-instance/create', '{\"query\":{},\"body\":\"{\\\"processDefinitionId\\\":\\\"self:2:3a5a065e-76b1-11ec-9c66-a2380e71991a\\\",\\\"variables\\\":{\\\"field121\\\":\\\"aaa\\\",\\\"field122\\\":[1]}}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', '2022-01-23 12:50:46', 'java.lang.RuntimeException', 'RuntimeException: 123', 'RuntimeException: 123', 'java.lang.RuntimeException: 123\n at cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl.BpmProcessInstanceServiceImpl.createProcessInstance0(BpmProcessInstanceServiceImpl.java:134)\n at cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl.BpmProcessInstanceServiceImpl.createProcessInstance(BpmProcessInstanceServiceImpl.java:94)\n at cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl.BpmProcessInstanceServiceImpl$$FastClassBySpringCGLIB$$1ea09b96.invoke()\n at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)\n at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)\n at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)\n at cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl.BpmProcessInstanceServiceImpl$$EnhancerBySpringCGLIB$$f97788b6.createProcessInstance()\n at cn.iocoder.yudao.adminserver.modules.bpm.controller.task.BpmProcessInstanceController.createProcessInstance(BpmProcessInstanceController.java:33)\n at cn.iocoder.yudao.adminserver.modules.bpm.controller.task.BpmProcessInstanceController$$FastClassBySpringCGLIB$$ad8c2f14.invoke()\n at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around0(OperateLogAspect.java:88)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around(OperateLogAspect.java:75)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\n at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:61)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)\n at cn.iocoder.yudao.adminserver.modules.bpm.controller.task.BpmProcessInstanceController$$EnhancerBySpringCGLIB$$7a6fceef.createProcessInstance()\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at de.codecentric.boot.admin.server.ui.web.servlet.HomepageForwardingFilter.doFilter(HomepageForwardingFilter.java:73)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.activiti.core.web.ActivitiWebFilter.doFilterInternal(ActivitiWebFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tenant.core.security.TenantSecurityWebFilter.doFilterInternal(TenantSecurityWebFilter.java:43)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at cn.iocoder.yudao.framework.security.core.filter.JWTAuthenticationTokenFilter.doFilterInternal(JWTAuthenticationTokenFilter.java:62)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)\n at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)\n at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter.doFilterInternal(ApiAccessLogFilter.java:59)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tenant.core.web.TenantContextWebFilter.doFilterInternal(TenantContextWebFilter.java:32)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter.doFilterInternal(CacheRequestBodyFilter.java:22)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:97)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tracer.core.filter.TraceFilter.doFilterInternal(TraceFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n at java.lang.Thread.run(Thread.java:748)\n', 'cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl.BpmProcessInstanceServiceImpl', 'BpmProcessInstanceServiceImpl.java', 'createProcessInstance0', 134, 0, NULL, 0, NULL, '2022-01-23 12:50:46', NULL, '2022-01-23 12:50:46', b'0', 1); +INSERT INTO `infra_api_error_log` VALUES (231, '', 0, 0, 'yudao-admin-server', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\n \\\"username\\\": \\\"admin\\\",\\n \\\"password\\\": \\\"admin123\\\",\\n \\\"uuid\\\": \\\"3acd87a09a4f48fb9118333780e94883\\\",\\n \\\"code\\\": \\\"1024\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-28 21:03:26', 'java.lang.IllegalArgumentException', 'IllegalArgumentException: retrieveUser returned null - a violation of the interface contract', 'IllegalArgumentException: retrieveUser returned null - a violation of the interface contract', 'java.lang.IllegalArgumentException: retrieveUser returned null - a violation of the interface contract\n at org.springframework.util.Assert.notNull(Assert.java:201)\n at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:143)\n at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)\n at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:201)\n at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:518)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)\n at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)\n at com.sun.proxy.$Proxy156.authenticate(Unknown Source)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)\n at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)\n at com.sun.proxy.$Proxy156.authenticate(Unknown Source)\n at cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl.login0(SysAuthServiceImpl.java:157)\n at cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl.login(SysAuthServiceImpl.java:114)\n at cn.iocoder.yudao.adminserver.modules.system.controller.auth.SysAuthController.login(SysAuthController.java:59)\n at cn.iocoder.yudao.adminserver.modules.system.controller.auth.SysAuthController$$FastClassBySpringCGLIB$$9b8cbcb.invoke()\n at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around0(OperateLogAspect.java:88)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around(OperateLogAspect.java:75)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\n at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)\n at cn.iocoder.yudao.adminserver.modules.system.controller.auth.SysAuthController$$EnhancerBySpringCGLIB$$ed8ab69e.login()\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at de.codecentric.boot.admin.server.ui.web.servlet.HomepageForwardingFilter.doFilter(HomepageForwardingFilter.java:73)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.activiti.core.web.ActivitiWebFilter.doFilterInternal(ActivitiWebFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at cn.iocoder.yudao.framework.security.core.filter.JWTAuthenticationTokenFilter.doFilterInternal(JWTAuthenticationTokenFilter.java:60)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)\n at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)\n at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tenant.core.web.TenantContextWebFilter.doFilterInternal(TenantContextWebFilter.java:32)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter.doFilterInternal(CacheRequestBodyFilter.java:22)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:97)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tracer.core.filter.TraceFilter.doFilterInternal(TraceFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n at java.lang.Thread.run(Thread.java:748)\n', 'org.springframework.util.Assert', 'Assert.java', 'notNull', 201, 0, NULL, 0, NULL, '2022-01-28 21:03:26', NULL, '2022-01-28 21:03:26', b'0', 1); +INSERT INTO `infra_api_error_log` VALUES (232, '', 0, 0, 'yudao-admin-server', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\n \\\"username\\\": \\\"admin\\\",\\n \\\"password\\\": \\\"admin123\\\",\\n \\\"uuid\\\": \\\"3acd87a09a4f48fb9118333780e94883\\\",\\n \\\"code\\\": \\\"1024\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-28 21:11:21', 'java.lang.IllegalArgumentException', 'IllegalArgumentException: retrieveUser returned null - a violation of the interface contract', 'IllegalArgumentException: retrieveUser returned null - a violation of the interface contract', 'java.lang.IllegalArgumentException: retrieveUser returned null - a violation of the interface contract\n at org.springframework.util.Assert.notNull(Assert.java:201)\n at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:143)\n at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)\n at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:201)\n at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:518)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)\n at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)\n at com.sun.proxy.$Proxy156.authenticate(Unknown Source)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)\n at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)\n at com.sun.proxy.$Proxy156.authenticate(Unknown Source)\n at cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl.login0(SysAuthServiceImpl.java:158)\n at cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl.login(SysAuthServiceImpl.java:115)\n at cn.iocoder.yudao.adminserver.modules.system.controller.auth.SysAuthController.login(SysAuthController.java:59)\n at cn.iocoder.yudao.adminserver.modules.system.controller.auth.SysAuthController$$FastClassBySpringCGLIB$$9b8cbcb.invoke()\n at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around0(OperateLogAspect.java:88)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around(OperateLogAspect.java:75)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\n at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)\n at cn.iocoder.yudao.adminserver.modules.system.controller.auth.SysAuthController$$EnhancerBySpringCGLIB$$11506edf.login()\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at de.codecentric.boot.admin.server.ui.web.servlet.HomepageForwardingFilter.doFilter(HomepageForwardingFilter.java:73)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.activiti.core.web.ActivitiWebFilter.doFilterInternal(ActivitiWebFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at cn.iocoder.yudao.framework.security.core.filter.JWTAuthenticationTokenFilter.doFilterInternal(JWTAuthenticationTokenFilter.java:60)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)\n at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)\n at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tenant.core.web.TenantContextWebFilter.doFilterInternal(TenantContextWebFilter.java:32)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter.doFilterInternal(CacheRequestBodyFilter.java:22)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:97)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tracer.core.filter.TraceFilter.doFilterInternal(TraceFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n at java.lang.Thread.run(Thread.java:748)\n', 'org.springframework.util.Assert', 'Assert.java', 'notNull', 201, 0, NULL, 0, NULL, '2022-01-28 21:11:21', NULL, '2022-01-28 21:11:21', b'0', 1); +INSERT INTO `infra_api_error_log` VALUES (233, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-28 23:46:38', 'java.lang.IllegalArgumentException', 'IllegalArgumentException: Object [UsernamePasswordAuthenticationToken [Principal=15601691300, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]]] is not instanceof [class cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken]', 'IllegalArgumentException: Object [UsernamePasswordAuthenticationToken [Principal=15601691300, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]]] is not instanceof [class cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken]', 'java.lang.IllegalArgumentException: Object [UsernamePasswordAuthenticationToken [Principal=15601691300, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]]] is not instanceof [class cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken]\n at cn.hutool.core.lang.Assert.isInstanceOf(Assert.java:704)\n at cn.hutool.core.lang.Assert.isInstanceOf(Assert.java:682)\n at cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider.getUserType(MultiUserDetailsAuthenticationProvider.java:69)\n at cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider.selectService(MultiUserDetailsAuthenticationProvider.java:61)\n at cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider.retrieveUser(MultiUserDetailsAuthenticationProvider.java:56)\n at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:133)\n at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)\n at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:201)\n at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:518)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)\n at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)\n at com.sun.proxy.$Proxy156.authenticate(Unknown Source)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)\n at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)\n at com.sun.proxy.$Proxy156.authenticate(Unknown Source)\n at cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl.login0(AuthServiceImpl.java:179)\n at cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl.login(AuthServiceImpl.java:91)\n at cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl$$FastClassBySpringCGLIB$$eedc869c.invoke()\n at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)\n at cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl$$EnhancerBySpringCGLIB$$c685808a.login()\n at cn.iocoder.yudao.module.member.controller.app.auth.AppAuthController.login(AppAuthController.java:44)\n at cn.iocoder.yudao.module.member.controller.app.auth.AppAuthController$$FastClassBySpringCGLIB$$107086c2.invoke()\n at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around0(OperateLogAspect.java:88)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around(OperateLogAspect.java:75)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\n at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)\n at cn.iocoder.yudao.module.member.controller.app.auth.AppAuthController$$EnhancerBySpringCGLIB$$485c7e33.login()\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at de.codecentric.boot.admin.server.ui.web.servlet.HomepageForwardingFilter.doFilter(HomepageForwardingFilter.java:73)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.activiti.core.web.ActivitiWebFilter.doFilterInternal(ActivitiWebFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at cn.iocoder.yudao.framework.security.core.filter.JWTAuthenticationTokenFilter.doFilterInternal(JWTAuthenticationTokenFilter.java:60)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)\n at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)\n at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter.doFilterInternal(ApiAccessLogFilter.java:63)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tenant.core.web.TenantContextWebFilter.doFilterInternal(TenantContextWebFilter.java:32)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter.doFilterInternal(CacheRequestBodyFilter.java:22)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:97)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tracer.core.filter.TraceFilter.doFilterInternal(TraceFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n at java.lang.Thread.run(Thread.java:748)\n', 'cn.hutool.core.lang.Assert', 'Assert.java', 'isInstanceOf', 704, 0, NULL, 0, NULL, '2022-01-28 23:46:38', NULL, '2022-01-28 23:46:38', b'0', 1); +INSERT INTO `infra_api_error_log` VALUES (234, '', 0, 0, 'yudao-admin-server', 'POST', '/app-api/login', '{\"query\":{},\"body\":\"{\\n \\\"mobile\\\": \\\"15601691300\\\",\\n \\\"password\\\": \\\"admin123\\\"\\n}\"}', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', '2022-01-29 00:35:08', 'java.lang.IllegalArgumentException', 'IllegalArgumentException: Object [UsernamePasswordAuthenticationToken [Principal=15601691300, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]]] is not instanceof [class cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken]', 'IllegalArgumentException: Object [UsernamePasswordAuthenticationToken [Principal=15601691300, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]]] is not instanceof [class cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken]', 'java.lang.IllegalArgumentException: Object [UsernamePasswordAuthenticationToken [Principal=15601691300, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]]] is not instanceof [class cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken]\n at cn.hutool.core.lang.Assert.isInstanceOf(Assert.java:704)\n at cn.hutool.core.lang.Assert.isInstanceOf(Assert.java:682)\n at cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider.getUserType(MultiUserDetailsAuthenticationProvider.java:69)\n at cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider.selectService(MultiUserDetailsAuthenticationProvider.java:61)\n at cn.iocoder.yudao.framework.security.core.authentication.MultiUserDetailsAuthenticationProvider.retrieveUser(MultiUserDetailsAuthenticationProvider.java:56)\n at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:133)\n at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)\n at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:201)\n at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:518)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)\n at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)\n at com.sun.proxy.$Proxy156.authenticate(Unknown Source)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)\n at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)\n at com.sun.proxy.$Proxy156.authenticate(Unknown Source)\n at cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl.login0(AuthServiceImpl.java:179)\n at cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl.login(AuthServiceImpl.java:91)\n at cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl$$FastClassBySpringCGLIB$$eedc869c.invoke()\n at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)\n at cn.iocoder.yudao.module.member.service.auth.AuthServiceImpl$$EnhancerBySpringCGLIB$$6ee399ec.login()\n at cn.iocoder.yudao.module.member.controller.app.auth.AppAuthController.login(AppAuthController.java:46)\n at cn.iocoder.yudao.module.member.controller.app.auth.AppAuthController$$FastClassBySpringCGLIB$$107086c2.invoke()\n at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around0(OperateLogAspect.java:88)\n at cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect.around(OperateLogAspect.java:75)\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\n at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)\n at cn.iocoder.yudao.module.member.controller.app.auth.AppAuthController$$EnhancerBySpringCGLIB$$bd77834f.login()\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at de.codecentric.boot.admin.server.ui.web.servlet.HomepageForwardingFilter.doFilter(HomepageForwardingFilter.java:73)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.activiti.core.web.ActivitiWebFilter.doFilterInternal(ActivitiWebFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)\n at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)\n at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)\n at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at cn.iocoder.yudao.framework.security.core.filter.JWTAuthenticationTokenFilter.doFilterInternal(JWTAuthenticationTokenFilter.java:60)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)\n at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)\n at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)\n at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)\n at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)\n at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter.doFilterInternal(ApiAccessLogFilter.java:63)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tenant.core.web.TenantContextWebFilter.doFilterInternal(TenantContextWebFilter.java:32)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter.doFilterInternal(CacheRequestBodyFilter.java:22)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:97)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at cn.iocoder.yudao.framework.tracer.core.filter.TraceFilter.doFilterInternal(TraceFilter.java:30)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n at java.lang.Thread.run(Thread.java:748)\n', 'cn.hutool.core.lang.Assert', 'Assert.java', 'isInstanceOf', 704, 0, NULL, 0, NULL, '2022-01-29 00:35:08', NULL, '2022-01-29 00:35:08', b'0', 1); COMMIT; -- ---------------------------- --- Table structure for inf_config +-- Table structure for infra_config -- ---------------------------- -DROP TABLE IF EXISTS `inf_config`; -CREATE TABLE `inf_config` ( +DROP TABLE IF EXISTS `infra_config`; +CREATE TABLE `infra_config` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '参数主键', - `group` varchar(50) NOT NULL COMMENT '参数分组', + `group` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数分组', `type` tinyint NOT NULL COMMENT '参数类型', - `name` varchar(100) NOT NULL DEFAULT '' COMMENT '参数名称', - `key` varchar(100) NOT NULL DEFAULT '' COMMENT '参数键名', - `value` varchar(500) NOT NULL DEFAULT '' COMMENT '参数键值', + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数名称', + `key` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数键名', + `value` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数键值', `sensitive` bit(1) NOT NULL COMMENT '是否敏感', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='参数配置表'; -- ---------------------------- --- Records of inf_config +-- Records of infra_config -- ---------------------------- BEGIN; -INSERT INTO `inf_config` VALUES (1, 'ui', 1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', b'0', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 'admin', '2021-01-05 17:03:48', '1', '2021-12-16 07:42:36', b'0'); -INSERT INTO `inf_config` VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '', '2021-04-13 03:48:02', b'0'); -INSERT INTO `inf_config` VALUES (3, 'ui', 1, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', b'0', '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', b'0'); -INSERT INTO `inf_config` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0'); -INSERT INTO `inf_config` VALUES (5, 'xxx', 2, 'xxx', 'xxx', 'xxx', b'1', 'xxx', '', '2021-02-09 20:06:47', '', '2021-02-09 20:06:47', b'0'); +INSERT INTO `infra_config` VALUES (1, 'ui', 1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', b'0', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 'admin', '2021-01-05 17:03:48', '1', '2021-12-16 07:42:36', b'0'); +INSERT INTO `infra_config` VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '', '2021-04-13 03:48:02', b'0'); +INSERT INTO `infra_config` VALUES (3, 'ui', 1, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', b'0', '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', b'0'); +INSERT INTO `infra_config` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0'); +INSERT INTO `infra_config` VALUES (5, 'xxx', 2, 'xxx', 'xxx', 'xxx', b'1', 'xxx', '', '2021-02-09 20:06:47', '', '2021-02-09 20:06:47', b'0'); COMMIT; -- ---------------------------- --- Table structure for inf_file +-- Table structure for infra_file -- ---------------------------- -DROP TABLE IF EXISTS `inf_file`; -CREATE TABLE `inf_file` ( - `id` varchar(188) NOT NULL COMMENT '文件路径', - `type` varchar(63) DEFAULT NULL COMMENT '文件类型', +DROP TABLE IF EXISTS `infra_file`; +CREATE TABLE `infra_file` ( + `id` varchar(188) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件路径', + `type` varchar(63) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件类型', `content` mediumblob NOT NULL COMMENT '文件内容', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', @@ -822,57 +1245,57 @@ CREATE TABLE `inf_file` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文件表'; -- ---------------------------- --- Records of inf_file +-- Records of infra_file -- ---------------------------- BEGIN; -INSERT INTO `inf_file` VALUES ('1c164a1d-5f2d-460b-a0bf-dfc33deeaab1', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F0000010402030101000000000000000000000405060702030108090A0BFFC400511000010302040305040804040404040309010203110421000506311241510713226171088191A1091432B1C1D1E1F015234252162462F1335392D20A4372A2253482E218356317192655648393A3B2FFC4001E0100010403010101000000000000000000000304050601020708090AFFC4004A1100010204040306050303030302030607010211000321310405415112617106138191A1F00722B1C1D11432E10842F115235233629272A20924E21617344382C2D225354463B2F2FFDA000C03010002110311003F00FCFF00F041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C10418208FD87B813D3E67F3C7788F3FC6E69363C22D6FDDF0411BB815D3E63F3C104286410153D460823760820C10418208E4027618208E7815D3E63F3C1041C0AE9F31F9E0820E0574F98FCF04119A10A936E5D479608525EBE1F78DBC0AE9F31F9E08520E0574F98FCF0410702BA7CC7E78208DADA0999B6DE7F8E08236F77E7F2FD70410777E7F2FD70410777E7F2FD704118A93C317999C10CF13AFBFF008C638219C72013B608232E03D47CFF002C1046694F0CCF38FDFCF094D4158006875877214CC4D4FD59E32C6132985EBAD1DBC7E9189A1DBE576B559DD9FA7DE0C2D0D1724AAA4545ABF8AC18553348A7AD1FC695F7ADF44E1946C9F53F76F5BC6C473F76174E33BB4F03024EB57AF9368DA3830E51803308511C2536ABBB6EC6FE9D1A366135E0FBF1DE92CDF335347DDEE075873FAB3873DD005AC29CB7F4D6B780E5F4D5A851A8FB2D5C6FCFDE363F973C309B988C092848E23661A353F0E1FEF1B1CBBF5AEA52806AD7954F9B1B391E70DFF567A9D7C397282190654A510010227ED1F523D3E3A0CBA7F68FE44CB50E2F95D8D8BEBB6EFE908AB3AC2766471AE623E4A8721E9CB4B73D7AC467586B5D2BA4A851555F54D2B3108594242AE1691B7849036DA2498EB6BC763FE0E62FBF335285B02145D07567AB3373E839C707F8B3F13F099FCB1290B41E0052E143F8D47E2EF1E7E769BDBC67DABAADECBA8415508529008E12384980678418B58EC46F7DFD51D8BEC1E2B2C54A331040053420A6D4D5DB4616EB78F1AF6AB1E8C5266709A17DA8E49ADFDF98A15D4F1A96E288FAC39726D6264FDE7974E5B63D138341C3C89686F942403B1259FA01BF3146BF11C561D4AC41535D46ACE2E3416D980B78C33F7B56CB87BCF13677208B0B58013EFE77E5BE1D4FC4E164A0103E602A5EA0F46E9EB5B45932826536F4DD9C352D4F3D2FB3D52AD755FC9CB69D6AA85405AE080831637111067A72BE2B38BCC82D570DD5DBF34FB545E26B329A26A101DC0DBCB6D7DF296D2692FAB2135D9FD5200FB41B252088822E08322C6FCFA5F112BC5898E259248B9B01B6DC8F3B5AF09DD10CA04B0BDBDDFCB5768E2B75F6579237F56CBC0EEC82952B8ACBE1B022790F58E57DB0B48C089EB97C60A9BF6D051CF2BDFD0738CF0B7ED2DBEBF58A8B526BFF00AE05C41924CCDE6E6F620C5C7A82011CBA064F952259494A49B3DC57AFD1875DE32C5EF4D9B4FE7E914E669A892E9971405D51B73DE4FF00B8169E78BD48CAC2C070C031353E0C4FBBD214960D6BEFA7D2AFD5CC57B9BE76C282A48264F31F388F2C5830A8561C0094150029CEB5B3D2FEE90B02458C5659CE748414107884AB8960CF0743CC103623167CBE79596EE94016DFA3DBC474D602A56FABFBB539443ABB50B652A4B55A16A0090D94F09932624F43E9E98B127284E3903893DDCB7625C9A1A3B5F7FB466F57751D1B9EF688457E7D9A212B536D0A74916295A5C2F728099244741BF4387185ECAE5929655FAC4F10A974B355CDDB63E2E7687F845F7038881A74156ADBD80C46AD1966479EEB3AE4D1D165F58FBCEAB852A34AFA112AB495A91C113E7F3C67138DCAB26429B1929D22A0A92096E4FAB69CD8690FD58B29038998F420ED607C5F4D23B15A53D8935667C935FA8EB5191D227816D347B97D758857DB061C0A68A45A08BCD8CC6397E79F18303226AB0982FF00E6785D2B354849D2A4172F5A13B46E9C6CB482490966E120BB1B9B1EB77F28EC2699F669EC9F45774E57D00ACCC1AB9A90F3A8950DD5C21445FEE0440C72CCEFE2063F16B2A9092949774049513D0B75BF4143185E669593C441239EA1F73A0A103520EF16DB35D9169D60B392A825A5A424B72A3C2102D75493EF323D310723033BB529EF714852384BB11551275D400DA3B93D22B79BC93982870034D75F00FD4921BF2C198EB9692092B4DE67C43A5C6D6B5B162C2F651583471CA4958005003E16BD3F310F2B2598925C103426F5F2B5B5BED15FE6DDA286F83B92823C5C478922236DCFC45EF893C360F1085702B09316C59FE617A060C77E40F51599C365533880AB01424569E5D6C4E8763F43BDDF9FCBF5C7C6A8FB131B1B6F7BF4E5EBE78208D9DD93B19F77EB8208CC20A6666FD44608239C1041820830410A1948215239E082377027A7CCFE782083813D3E67F3C1041C00EC27E38208D884004CA62DE7E5CFF0C10A4BD7C3EF1B3813D3E67F3C10A41C09E9F33F9E0820E04F4F99FCF0411B5B481303A608236E0820C10418208D0FEC98DA4CFEFD7E6704369C2A7937D0084D82108DEC6EAF4C10429C1046B7397BFF007FBEB85E454A81B375D768D54A2080CEFEDBE91AF1B2C0248D296E821DCA415F086277E956F0E9061B2BE57D5B6F7E71209C10500785CF3A0F37F1A6FAC7307A1F81C3757CA1EE7503D2B6E7CA36FD3357840DEBA79FE233458906C4EC0D89DF61CF1B494158E32A219CF0B78EFF0096D371A99A9927846B43A93CB95EBEAD1B0DAE6C3CEDF7E135E3E725624CB4A94FF28A3EDCB9F3DA31330B24CA33662920B7155B7D4927E9CB584B599BD1E4CC2EAAB9C42184A655C6A090A001DA489F389DBD316AC87B198ACF6721465AFE6503504B545C0B373357E4D1CCFB55DBEC2767E4CD4A26A78D20FF00700C40237D3EA6E0D23AA9DA97B41D332DBD41A6DC42570A471A162EA883736EBCFDF8F507633E14272F952E66270E1870A99419EAFAD5DC0D2F78F2376E3E2FCCCC8CD932672812541252A3F2935B0BEFA0E978E906A3D759BE6D50BFE3B50F2FBF512C00A5917BAAE9240B0E6664917DF1E89C8F23C248C3818591292500098FC2CA61435D983B0A9BED1E7CC7F6971666A973E72D426124024D35B39BBBD3C621A3307585FF002524A567ED106D3E666F7B01F118B1AE461928799C0929B0000E7561E7A97DAB0C5199FEACB1750258B9F017E6684EBCA14AA96B1F5B45995B951FDBE2E020C0E289E1BF5237EA31058BCD254B79682DC2E2EEEDD2B5D4EFE0DAAF0495BA8861A335EA46F41A915AE8226D94E87AE6529ABCCD680C7DA2952900F08BFD9E2927CCFEB8AD4FC7AB1130CBF9893D75ADFDB1A690DB80E1EA0B373BD036B4035BD3C21C333D4F91E46D0672361B554905350E18F09488175023D23F2930B96E2312B515F114D38433B5DDB5E437F28CCBC419CE92F6605DDC543DAFEDDA29BD41AE1350B50CCAA949249E16D1C5C23A094102DCF7F28C5830B904E5280E025C8AB352FCDFC7CEA215E015F6C3DEBE91546799EADC2D990191C45B5055C8E7304116DAF8BBE53D9A595259160E5C10CFEBE9E2D521962CF5DC5BDFD3C04573996A24B4140AED3D63EF31D07E62D8E9596E401013F2ECC1897A56BE356BFA1D420EA5BDF5F7F4AEF3AD4C1DE0E05C70F14DEDBF95BE1E78B561B23E2203300D417AB7974ABD342F0A2106AD5F2F7B8BC5719A67CE9E2217293B4131CF97E38B0E1F26C34A40330A53C357207DCEDE20C6C4117D62249CE6BAAD6696929AA2B5D7D5C284B2D2DD0924C429494A8226D1C513CAD384B1D8DCAB2F149D2828034701D86B5F76BC64214A4A940512CE5F7B7BE9168692F674ED1B5938DD5D4E5AACBB2E708597D6EB654942B9941215B6FCE76C737CE7E25CBCB5E5E194E5CB70D8B01A5B52CDE71AB6BB74BF4BEFEDE3B33A5FD98B4069B525ED515BFC7AB7C0A61A525D61348A4C158F0A8A1C0B3D640E9D39DE3FE2666999CD2995355864A5DC825D6F4AD886FB36D19FF74A552D2EA0BB8D49EB4AEBA336BADF946F643A6A8D34993D150D22109E14A8D3B0A58E1020F196F8A6013BDF7E78A86638BC7E6734CD54E9F3261FEE0A98906C2C0B1D80A51AE6012E7B01F3569BB72BD76AF4110FCDF581A4595F12AA03F370EF7496639A532019E805ADD4E12C0E439962A60E34288243B80E4022E59EC7DDA35EE26B5016AB0DF7E5EEB158675AE6951C6B7B312DEE4B6A4A9503A711BDFF00327963A7E4DD90594A0CCC389967240A1D74AD58C024CCAB8507D2B5E75F75EA22A8CF3B4FA36520533E85405719EF00EBB898103974B7AF47CAFB21C20BCB4CB048E1000DE9B5D80B1F4895C0C86204CBBD5F9BB0A8A50783F952FA8BB5C5242F81EE217809503693D2763EF1B5B95D309D9BC0E1C0FD44C9680003F3149D8D8989944992194DC99AF5D79BDF9161B0A9332ED3B38CC1C4B7468AC599321961D7449DB88A52A03CA6FE7189299FFD9DCBC12B992262AFFDA1DBA56A75F5893952E4FEEE14B269A0BF2A75D8C7D9F702BA7CC7E78FCE947D488CD00899E7820856D7F4FBFF001C1046C7397BFF000C1046BC10472013B0C10473C0AE9F31F9E0820E0574F98FCF0410702BA7CC7E78208CD00899C1042D47DA1EFF00B8E082327397BFF0C10A4BD7C3EF1AF04291B1BE7EEFC70411B304118A93C51788C10463DDF9FCBF5C1041DDF9FCBF5C1041DDF9FCBF5C1046C4366F0472DEDD7D7046AA4F13559A33E03D47CFF2C11AF77CFD3F98E0A4A6262F820EEF9FA7F318E083BBE7E9FCC6494F14DE2309AE7095AD4DC0F4D21ACC404AB702C767F7AFD9E32EEFCFE5F1E78C27121542AB50F46E9E17AD59E25B0880407143F624F87500F231AD41485A63633263D63979F581BDF0A0636ABFE7F36F48972BEED2598003A7ADE9785E97611E000AA2C009933E847E5EA6CA0C3950709AF536F63DB457B1D980960B1B3EBBF386F5A1F2E7795280D2904965C2425206EB27607C89983B637460B12B9A897250541440A026B4B5FCCE962D103333EC1C94AE64F9A947007F995AEFE837E758ACFB40ED7B49691A171BCCEA9BA8AF4A141A085414AD22D3DD9BEC3A73DAF8ECBD90F86188CD97266AE5514439526D57B37516FE787F6DFE2F4ACB53364C99C0B710042BCA8EFE1D0DA3A0BAE3B6DD45ABAB3EACEBAE3792A4B818E05F0C2153CD30A3CAEA9F863D51D9AEC160B2097C62524CC64F1929D980615D49D2BE71E43ED576FB17DA099302672D94A2ECA25DDF9DEF67D0E800A32B5C72AAB0A299C5960A8A9C5A964913E2B9513CE79F2F71E852E6CA54B1282412DC219852C2D7A6F60E3568E61370B880B3396A528383577AF89E7C8E9631ADEAC697C34AC8EF9C62CB4F0F1294544110482607979F3C44E331ABCA5887F9AE1D83D7F353E71159809B882020171471F6E648FE1A90F794E98CD7365871491474A2EB2E04DD063FBA08B4D801E5D442CFCF7138C3F2950068384925CEED785B01297214935040AB8B9D6F5D2BCF689839FC0F48B45197AD0F5554A4FD6D44F180A6C0E1E10A2A09BCDD3E569384F0F87C4E26612B4A88A312E5FD0BF8FF009B14BC406093C9CB83D2BD7A00FE759EA5D6AEB895A50E2D2992084A8C46DB0F4E9EEE58B9E5D9271315203D2AD5FE437D5C447E2809BC4003A7B715A5EBE42F151D76A72E71F78A22E4824C13D46F3E71B62FF95648944B0A080E68430E6DCCFADDB946B8190CA20861A1AD7C3EFD4968AF739D40D10A2B50B4F43BDA79F5F527618B8607260E9FF6C1377200BF20DB7F889054A0EA6340CDEF5D76F48ACB3ACF95C214D3A4F0C9E0130A9DAFB88FBF6C5AF078144A07BC481D40A6CDE9FCD635EEF9F5F7D22AFCC750D45495A16CFD58DE17DE7113CAC89E76DA7D4C624E4E270F852429495736614E47CF7D768C940A72F50F5AF9FF0010DF94E5B9FEA5A85D0657435598D4A9494B290D3ADA254620BBC3C2396E4623F31EDC65D93389810A55C7CC01A07D3ABB3788A4615F29A51DDC69E1E71D89D1BEC9FA82B8B199EBDCF13A5E8950BFA806915E5D418F09534AE24CED3CA76C732CF7E2B4EC68523289267AD2E95242FBB67E65810078F2302502BC5F28350757A93E7B1FB476974DF673A0BB3EA7713A6B25A6E3AA091579A3C43EAAE5343C2A4B2F051A7E13C93C24C99C73AC463738CD27CC9B889D312EDC3872A5349767F9C11C4F7A337AC60D0326BC5767AB1D9E9515A316F25D5DA83EAC9296F81A481012D8091FF4881B4DA3D061C48C9674FF009A6ACAAF42E6B5D5C9B5691A457D9CEADA068076B1CE052788A1C924A6638A403723A6E3EE7533B2B389419128A8387603FCF9D0E97896CB90851F98F2B0D3EB5DAA75BC5459FF0069542942D34E7EBCB4880B528D3F099B58C4FCE0FCAF5D9EEC84C982599C8E12083548275F3A00C452912E2549092431B0E74DDDEC35B750D14966FDA5D6BAB5F7CA53886C92D36DAA4B53361C175CEC378F22631D7705D95C24940527BB42884F12C81F330E76620B9153EB194CA9003900DEBBD1CD6ED53B3B18AF2A738D47AB5E34795B55656E12800D33C94C9B7FC45242779B93077E589350CAB2F9759D282807532D0F4D83DED6DF9C60C99360D7200602E4120BD9A950D123C9FD9B35B66E876AF50E6E720A65F0AD912DD49A94AAEA94A17C4D948EA39FC6859BF6DE5CB5AA5E58B338CB2CBE1052CF600B17F0AE81AD08CFE0C30534BE252838214CDD40FC01436689851760DD9DE429073DCCD39B3C800AC28AD90A2093221640B08F39BDB1589B9B67999A80968C4278AAE0A983F26B7DBC223CE2A7AA8A24241B52A0D59FEBE1A38896D1661A0345B6B190645423BD003CE3AE36F13C164901E4A888E7004DE7961493D96CEF1E52A9B889E90AB92165B4AFF86E4E408C9C54D724120D2C6FE1FCEF4DFEA0B813D3E67F3C7C448FAE1182C01103AFE18208DAD7F4FBFF001C1046C7397BFF000C1046BC10428640215239E082377027A7CCFE782083813D3E67F3C1041C09E9F33F9E082315262201E73B9E98208DC8FB43DFF71C10464E72F7FE1821497AF87DE35E08523637CFDDF8E08236608236B6099813B7E38208DBC0AE9F31F9E0820E0574F98FCF0410702BA7CC7E78208D8DA0C99B5BC8FE3851129730128492DB03F88D4A929604B3C6EEEFCFE5FAE345A552DF8C14B5DC41C69DFC9CC25A84414C49B1E584BBD976E34BECF1B42683D0FC0E144FCEDC3F33D9A08554E82AE29062D68F774F31EBB74223333973D2C532D5CA86EDEBC879C68B0E40F60381E3F6850503991EFF00F7BF2E9D79623E4CD5A3F7862DF6D6EFAFD62530A81F2922ADA1DDCE87DDB48E52D852D28304AE403C86D79B6D7FCB161C02D33F85D8BB3695ABEBE239F284F30C64B9328954C4861A9D9E8CFA74DF94346A0AFA5D334CBADA8A86509402AE15BCDA4D8490125533F38B5B173C164F8AC424193214BD5922AE76A55EC06DE11C833FED56030CA5F162D0821E8A50B8EA59AECE63A7DDAA7B49A94CA32BCA4A53671B79D6D4991FDA640133E47CFCB1DFFE1A7C3A39924E231D87E0EED890A4DDFA8ADBC9AFA793FE2AFC5299972C4ACBA7F7DC45415DDAF98A509A57968DCBA35A8B3BABCEEB5CACABAB72A8B8A2AE052D5099E504991E57E533338EFF0085CBE4F673865CA94084B00C1B7B9FCB6E1A91C067E718CED0054CC44C5A42854124924EDB30ADC784343D5A5B6437629779003C3C3BDC093BFEF9CBC9C7FEB4F0A93C06C4BF938A0B50EA79561A0C18C19EF0AF8F5F5DB7F0B7431BB2E4399B1197E5ADBA9754614E702F8403170A2909023CFD30E4C993844F7EB9A193F31147DC51DCD7D0E85842C31699E44BE10D40FE62A49A0DEDE57B0E934E64BA5984D4E62B43998B838D282AE2248BC5A529B5A481327AE2BF982E6672BE1C3C95144B35531170C0B1E96D7A42F2B2EC3A4778B5A49502458B36F5EB7FA9AC3B52768350EB6AA44C5234994A3BB29320587D88378EBE7732712195F67A6383310470B1729DCFD69F5EB0C7152E4CBE208502DA8F1D411BFDC08A6B36D4F5544438FB8A750F71142F8A763264090396F13B73C745CB324C31212402B4B3B80F514A11B8DF588552D6E785CBEDD357BF4D6A6915F663AC12EF1092679C9F988B753691E918B2272A5CB712A5B8A51987D4FAC48E152B985969246BD01A7566AF9440338D4895C70AC08E2913173F03CCED2475C59F27C2290969D2CA53A72BBF27F06A5A251587080080D6E54B5BA69BB12358AD735CFD6A514A572A13B193F0DC9BEE2E4CF2C584CE918541AA52DA9A9D3D2FD5BC635280D40C7993E30DF9465DAC351542A9F22CA6A2A9C5A9295BEA429286428D882B4049045EC63E2315ECC33F91282809E974BEA97D4DABA680758D084E8AB339DC9D3A5347BF28ECD683F65862AFBACEFB42CDC30530E0A20DF15EC4A4A9A544C45C8B1BF2C72CCEFB6B880A29C0A3F505D414CAE1E1AD0824D79B7F319FF6FF00B884DD892F6D4B6FE3CA3B2D97A748E8DA6396699CA695A0A486DCAA5212A5BBC0212415A0A916BDBE3CB154387C7E7E1588C56257420A52C7E4D48A5FD9B184D402E882585E80BEDD05B6E7AC36D7E7294A56BA806F24153A4848BFF4931EE03D7AE24F07947E9871A0998A0C48E121D9AA6E796E1ACE29A2A5AD3423F1AD36DCD7EF15E57EA96E902FFCC15A144C24130D81E7263E3CB98179895350A5241C39045096626C0559A8DF4D69191C61C90EF67A5BD9D2FE71516A3ED0D0C970072499E704C728EBCADBC8907170CB24C89A9038784B8D59AAD5F3EA06D4318214A366F114F7E315557EA3CE73E525ACB32FAAADAA04F70C06DC4B6E1302EE9414245C1249B832671699589C065724F7A25ACAAA1D497A6C2F60458D61591395248649A967AEFB1A59FEF1BF2FEC875667EE7D735BAD3A532F242843ADD515A39C869414391B89BDFCD15F6F24C99331380C195CC450000A5EAD761CDFCE1CCCC54C0A294925243B87E47E94E74BC4E99D15D94E97434B08467EF23ED54ADD718EED49DFF96A242A6368F80C404EED57687325A532C4DC1A4B8E04A78DC1D8B53AD2E23518D50354F15033ED7F1DEB47109732ED674CE4CC9A4CADBA3A100708E1A7694A03942CA267DF208DE775A56498FCCD5DE4D9D384C2039254012756240E54E8F185636610DC2A67E9A860ECFEF9C53D9FF6C152D9E2A3CD9FFE7717136D32B7A609800241088BDA00DAD8B764DD98C065EF33319885BD7E7604355DC972FF0047E6CFB0AB188A4C3C2D4F9B5AF33EC88AFDACDF5CEB3ABFABE51936659938B5405A9A7E992A2A3FDCB404C5F798138B0CCCFF00B3D948225A641290593C4870DD1CE9A3DC0D61E1C3C915E201BC6E2EFA0E55040701E27B45ECDDDB3E7C84395D90AB2AA65805152ACCD9594A5512A2D1701300EC47E00D6F17F19329C29549C3E152560904014D6AECCDE7472212386921CF186D6D576BD5CEE2DA120C7D69E3E0F47D6C80807700FAE0820C10460B49511161CCFE9EE8C1046D423E1F7FEFF41E4410A020FF00E91E9F8608232EEFCFE5FAE08237349E124CCED8D16680737F2FF3030370F1BB0946186C3C840403B807D719722C488180B0020C62061B0F28C929E29BC4608CC65DDF9FCBF5C1041DDF9FCBF5C1041DDF9FCBF5C1042AA64F09573C1042AC104182304034306081850B5ADEFDB4189CCAB32C3E102C4E0090000E1FC8B7D9B9C6ABC14CC5074288E1B73D3EC7C6FCCC218F9F2F18E25D097B36B61B59F5E95B335C89987352FC2EE0DDAA0F27B6F4F28E201DC03EEC5715964FE22A0A535C162037E0FD358C271A38B8483521EAEFE0C2DF6D9A081D07C06257053460C8EF403C2A04BD2BA8AFDEFEB137879667B0142C2C3A8B5396DADB44EFBD50C42984CA3FF32C3DDC89B1BDBD0DB12788CD70F8C09969949530201A6F714F0BEBB46D8CC30C2A4AD6A6D6BAF83F3AFB7E02D971B554D43818424712CA884EDB8F1116B1BFAF2C2723B353735534A96A1C4400C1E87A0ABEBB522A599F6B30B964A513312E906EA03C6FE26FA333C541DA0F6D7A674BD306289E6DECC21C4852553C2A168316E9626FD48231D2FB31F09B3099325CD54B99C2483549EA2FE3F5611C1FB61F14E4290B44A9E051428B048F5F31E0F531E78F68FDAB679ACEB5E1555CEA69829412843A4002F000491E86DF3C7A7FB21D809597A658C4C80B147E2480777A820E94FE44791FB63DA2CCB369B37F4F8B98905DB8546E6A2C5BFC6E0353ED39F5BEF50E71252DC0EF56A51E2264CDC99F75F1D824A30B95202644B4CB7150960ED7B0D3CF9C735C160B1656A56653173C9248E304D39151D5C3728D0D507D62A52CD3B6BA92A500549E2013B740A1B99E7CFAE23F1D8F95381709D6A6A75A134AD1AF577D8C4BA42650F91013C3FDB667D1FF001A88B432BD0D49414EACC3397D219090B0C2889E662C67CCD8F96F8AE9C61133BB9293C4AA822C9BD7C5DE9D21B6214A52439A0D1C543F3F4FE6AC79CEB3628D2BA4D28869829052A584A7888F252D3C5C8DEF688C4AE1302AC510AC5A9534E8092914E42F4A795223A62969712FE471A6A75D68DECC55199EA1A9796A5D538B150A278C95920ABFD227840B1FB3BF9E2F794E12522584942526C01001A35CEB4A353684D336711C2165B9DA8F4A07D5EF468AFB36CE5B85294E78AFCCC73EA6D6DCF962DD84C12569E14A472200A5431D3CFC7946122613572FA93720DEFA3914E422B1CEF3F70777DDD484B7E20E34471F780EC02BFA63A889D8733896C3E4F3259E304EE4B353C1CEBCE8FA448C8420BF100C3EC06FF715D62B1CD756B6959629E9781D5482B0E05993009E1F9E2C3231185C394F7E525290DC2435854BDB6F06A8B44B495CB9690C90EEEFA6BC8F2F58D794E88D73AE1E0C64740FBA0901EA93FCB45325C363E20028104CC6F1104E18675DB3C0602504E1D32C5083F30736F122D63CB91DE74F49D406B6B4F2DFD3A34766344FB30E4FA74379BEBFCED35B54385C145DD9042B7E096D445AD7237B75C726CDFB7B89C428A70B2C94A9C779C4C13CC03CFA7943454C4B925437602FE1717BEADCC98BF69DEA1A1A3728B4BE594F454CD25282F169A2B7922C93C4B4858889306E0ED338A82B133F19342E74F54C5BBA6A5210ECEE01634D08A784325CC592529A03D2B7F2D7EDCD9BF88D6D1F7AE57B854923ECF140883CA63FF6FC394E60F2B13C0E22492000C08776D75A7F8864B953947F716B9DDD8B337ABC40F35D4F4AA538A6DA085A64874AF842226E12A0019F5F518B5E132B97804242A604A1603A08A9AD43E9734F2890CBD1C0FC4E4D402742F5DF76F74A8339D7CC07974AE55BB5EE9202596DB5C09361C4806D31CEF1BE2CB839397280485A11C41CBA85FA13E5B3BECF28426EA0EDCDBD61137936AFD4AA6DBCBDB5E5197BD77EADCE17613C8842E15617107CB6C2B8B19561105969993B4484D49D03D58D817D34A46532788B80C3572C3D6BEBA7521DA97B3AD1F912BBED539BA351D427C61B334812B17E1250A20DEC6D163EB8ADCEC563D5296AC3619724A8FF00B6A0EA7008AF0B6BEBBC6552D095014551EFF7F5D59E8766FCE3B60A3D2FFE4720A0A4CB29D00A1A6B818A85D504F475482B411D4193898ECEF67CE7EBEF33698A42E5D415CC32C3171FB78922C36D9EA63454C42414801376D58F53CCF872678A633BED3B51EAAA834D4B479834F38A29406987DD696546DE24365B4836332201F762D98BCAF26C9C30C44998A483AA43EE1DEBB35FA930DCCC4A9D400246BB8B73B7873BC3B651D8F76C1A8D21CA8C8D54744F416EB975CD71F02B752A9F8829300FD95004F316B56E776E72FC14E54A46150B5208621373D598BB7A8DA324CB090428125C10D6F4B45A593FB2665A809ACD59AB0D42800A732F148B49EA51DF2147E37E4646D86B33E2662F8BBBC2E583855699C403529429B83A75148C254805D469A5363416B1D06FE962651D96F64BA5160D268D6EB2AA53354ED738A0B52765774E7104ED31104F2DB15BCCB36ED0668A4CC9B982D085391282384240AB3A59F6DEDE08E2B1219A586291A7D37A6F5F48B21AD48E65F4FF0057CBF2ACBF2BA303847053D22D684C58F106F8C9F7C8F9E20D7964CC44DEF67CD9AB59673C6A00B07FDBC5F4E9710C3F578866EF0B1DEBF588F3B9BAEBD6E29AAF5BCB0417525469D289D8004A527A1816F7E2464E5F2C30984166009009EA4FE5F78D3F513BFE6AF323E847E23DECC7C878FB35060820C104668483337DA3DF82085A845801CB73CBF7C86082378481B608239C104184E669E3F6820C27041820830410A69D20F1126361820855C23FBC7CBF3C10473C00ECA9F77EB82083BBF3F97EB8208C8009993BFBBAF9E0823991D47C46082091D47C46082091D47C46082091D47C4621F3113411DD922EED57D4F93B1D59E257018A972814AD9C8A39A16E5E2FB738CA0F43F0C38CBB106510269AD1C973776A73FC6B1A62A4271615DD01E06FE3CBDE91C7BBDFD316B463642D2CC38D8598EDA7DBFCC404DCA57294555046B5372FBF5B0E8638E24FF70F88C4762B013B141465A4925D9ABE81B4E9CA91B0CE64659F2CC58043072469BDDEDF7860CF3525269EA735D52F30186D2A53895BADA490279150240E606DCE3161EC8762B1D986251C52E61054E070A886B9FED6E9BD6AF143EDAFC44C24890C99C80A092C428072CE351D2BA79C7457B62F68A73375BF95E9474B4471216A6CDBA13361E97F4C7ABFB11F0F4618CA3889628C4BA7EFE75B08F2176EBE22CD9C26093394CCA145EEED626FBEBAD1E3A69996779ED6BEAFAC3EED43EF9256788A8B7B9BDCC4836F98C7A432BCAB2EC248484CB40EEC072120396AE9A757D3568F32667DA6C762B107FDC591C45AA58392E0BEACDD3D21BDA7F2FA154E64EA9550B8E1404A892A2622124F5DA06E3918C298DC44B961E5A512D20162C34B52F5229C9DF789EC8B13DF9499EA249209E2BF874ADABA6C048B2DD2F9FEA073EB4D27EAB9332429D5B812DF78DAAE3842A167C3BC4C03E726978FCC53326A65713A96EC12EAAA7FE4D673BB06B4587384C94CB49941367A36DECF5058D584E4E69A774A52F7394B68AAAD4A48754A9B2E3C5754F3FED36E62C30D6565F89C428F1A1610A6F95DDC3BBD2941E9D62AEB584D8F12AA09EBE60536FBC5699F6B673325254E3CA6FBAE2E2A70484906C048201B7FB5F169C0F67E61E17430A3121CDDB930AEA5C4205D4E4D46BC87BFCC54B9BE785D5A8B07EAEA932A9DFCC93113D245A7173C0F67C84A68C056C1D8F205B91F1A3C375CB7341A50FD8F5FBF5884E699FD5AD0DA1C8847142D2A04AA44CF86E23CF9F5C4A4DCA972787802985E9D35FF00378564C906F53A8A55AA3969BEFAD4D659C678E1529216A2ABF824924DF95C99F4F332379DCBA6A70AC66D367274B97366AF9738597213AB31140DB7F25FF10D195E9FD4BABDF5D365740FBAB94A0BAA4A9086B8F9A4A841041E46DE5CA4719DA5C1E1E51056805B7AF956A29467A79EAC6C68123414E5B54DBC394762344FB346459625BCDF5D66A0D4D9C6E93BA2AF172492DA88DE05E773D231CA33DED5E23133169C04854E9609E29817C3C2E59D8D09D4FD890C999852FC4A22EC2A6DF96FA0D62F7A3CCDBD2ED2F2DC9B2F62832F74043354036B5D4A50224829E3470EC66F27E15F91819B9B28CEC4297C52AA904A83137700D40E6E28C1A1133D75483C40B798DBCFEAD0C55F56D289A9A86D554E93214A754900998F0CC45EDC8C46155640FF003214E454802C006BD3ED194951503A9B87DBA52C1E83A8311C5EA4038C38FF007684CF7680809088E448DFCC9E7F0C208CB664999549D1F7A727F7D21E4A4BA8248626C5BCDBD9FCD51A8F54E7755589A5CB10E3E952A09424A80E57201DBA74F2C59F018D561E850CCC03FAD4DDFAB3D2241186E3B5199EFF009630A5DD179B6694F49519C560A1A532A711092A701024182088DB6C6732C562B31E197870A2514570DAAC45474EB5368274AEE1228C2C74D9B5356731B54AECFF0046B25CA6A0A7CCAB523894F2AA01525606E1B5151372791B817DC8C60B2AC62B87BD9CB96C352479D5F416DF9C240BFA1FC7F9EB102CFBB58CD7345A32AD314350F553C4A1BA56A95C4366E213DFF77C207424C74C58F0F829186509B3B16898A4B9659156DAA4D033DFC2360A2011E5CAAFEB1865BD8BF6A5AD9095EA0617A5D959E21506A5BA92A49933C09585260728BF2DCE1EA7B6B96E01250252710B45199813B71330E77E718D9CD0D5EFE3EEBCA27D967601D9E64C108D639B1D4158C90695052ED3C2EC5CBA150676932003D23142ED776CF34CD8A1394E19783624284924B8A307481CCD183F388FC6CC52280EC47E3C770FE348B8B2BA8D3DA5E9114BA7A86872EA74240495D3B358E2D226DC6E214B13EB23AD862B3864E6D8F081994C9F420875AC1AB12E1D8EF0C0629490C1C13D48600D395EFE50D953AA1AA8716AA665D65D905D79BE3E07093E129680E04C5AC1201993CA2E385461658509D350B0C004A800400198A8B957992D7D635FD612096AEAE5FD1B5ADBC5F44C9ACCEF30584B4A79D4AA3C3DCA933B40E22981EFDFE58D978FCB70C4944B4A9B6200240F07AF2FA467F52B7DFADB56E5D474D6B0A7FC2B9FD514ACE524857DA75750968A3A10851133CEDEFDCE23E767F2E6B2508091A1150DE1D18EEDABC67BC330D284D087BDBD34BF2EAE6D7672E389E3ACCDD3978DD48E10F01CB70A8F94EF86ABCDE6A52552D0A98480750F566D9C0DBC63520BDED42297F7EF7D4F68BD23430735CF3F882893DDA50CAE9F808FB576D438F8AD726D1206114E79892549549286622AFE83C7762488D8D855C540B0FBBFE0347B95C0AE9F31F9E3E55C7D9E8DADA0999B7CFF007FA608236F77E7F2FD70411B5A401337DB718208DF8208304106082324A78A6F1184E669E3F68232EEFCFE5FAE138236B68179BFCBF7FBE98208DBC09E9F33F9E0820E04F4F99FCF04107027A7CCFE78208514E002A8168C1042AC10425A80094C8B4608213F027A7CCFE782083813D3E67F3C1041C09E9F33F9E082324D10A93C72AFE544004DE76B741F8E1DC8C3A2783C407537A3B01BF37F37B44E3953D2B4997C4CE6D6DF4FA6BAEF0E0DB8FA07748488800C807CBA44F337DCF28388DC6E0D6853490E09A84835666A8EB7F1312F97E3C480F38B505C80E3CED4FBED1A5F7174692BA9521B61CE2EF14A2910123DDB091B73C3DCA329C5E226A3E4590486A12CE45A9CC72DF410CB3EED66070D87983BC9614124FEE48D0D3AF2AEB1D79ED47B63D37A5E9DE672DA943B570A078566CAE7CC8933CB6F863D15D8EEC1CCC70477D289A24D52FB568C18EBE2D5AC794BB6FF00113B954D32A707054C12A1CE9473F8B3D5CF40F5FF006A59CEAD71A43952F21849761A4BAA48712ADA4248DB9C83E5CC63D43D90EC4607289056A909E32126A914A54543F3B9A3758F2DF6A3B7D8CC7CD5253354415100859347B383E914C54BB534C4AD973BA0ABAB888515493375C1BDFCFDF8B96225C8C24AE3949482DA5096D8E8CDF6778A32F173F1A499855F31AB9A52BEFABD617646D56E64EB8D6574CB0FACA454542C1291FDAA01620082660F493D2A58CCFE6A55C090404D1C3D2E6A35FCDE3072897FBEE4B3E9FE2BD356DA2C8634C69DC890330D50E22A6B40E36C724AA398448F2BF2DCE231798633174758E226B52C05F4DB4FA464BE098A0971564914277F53E8F0C59FEB9398A1BA7A750632FA4E24D321B86CA81B10AE182AE51C409BF217C5A3B3B94A5466CF5CA2A9931B88A9D56B33D07A56F183984DC480164B25E8F67ABEF563D68DB1AA735CE91255C769EBF39264FDE791B63A160F2C007EC0E7968CE0FD3A728DD0AA9737667F7FE62BACE738010568584AC025299BABCA79C5FF002B62D183C081F2292C926AA6019B5E74F585C70A5882F77BD7F0DCEF155E67AA9F5AD6DBAB0CA45B912AE5B8BCDF95F9C6D13D25183C3B1510784B5D859DDBFC7842C9009259C8BDDCD051FCA18E91CD439E3E32FC832EA875D78F0AEA8A565082A220C389200BC83378DF0962F1F824216A98B425206A5209A56848B51D88D2F028F7601259DC74D7D6DEDE2FCD11ECFAE53A919CEBCA80F03C2EA59B022D37EECFA4D8F4C730CDFB49266AD72F2F52A628062405009BDBADBD7A616B143B8717AFA534A55BCE2FC6ABB4F644C228B4FD3329425212B525B485022C2545215E867EEC50B158DC5CF980ACA96A7F94D58576B12DCAF7686EFCEFE2FEF7861CCF3543AA2E3CBB7424C08E8240B7E96B9C4E65B2573B87BC04715E8C0ED41BF87E74324AEA5C9DDAF6D010F119AACEA9DE6D4A4284B1C50A5287849E8933EB6D8E2C404BC0002628049BA451C6CF7FE29BC09C3D406A93434661CF42DE3D4DE0EFE7199660FA9965E5D409212DA5B2916FF58106C2E6479CD8617958EC19708940391FDCEFCFD61C264A87EEAFDEFAE9E75BF5C93A7731AE5A6A334CC5BCAE8A98F12E957C0A35C954784AF88291C3039DE71B4E5CB5292997244C2B70482DC1B1E6CEFCEE6B0FA4C804B936A8D3952BEE94DDBF34ED0720D3ABFE17A572952F3357F2CBCDA1CAB0B7088064B6B489DCF8A3AC61EE1BB3FDE052F198A4774AAA65964B001C7CC0825835361489044C9690C181F37E5B5ED6DEC68DAAD2DDB06B30CD4552065F973D252FA9DA76E1B277EE8A924100DEC3D37C6ABCE72AC8A62E4E19231539D94C951029AA8022AFCAC39435C62CA920B7D093BFA379D21FF2DEC4BB3EC9168ADD539DBD9A6683C4AA64A2A0202FA12DA94D913D3CC6D1883C7F693178D98512B07DCA1569BC605D8FED6069615F2AC4705A48E251A8FEDF6DBBFA74B0A92BF2CC98219C972E672E60C065D1469AB71F8B4951694B6A37B91336E711189C0AE7A92A56348A12471D89157655486FBF4D04D2096B1B0A7E35F4E70F02B7516663FCBA1755C768314DE83C5C200E5B5B0D8C99787078E626601A8AD87224B7BE507784D002454F3DFF003BF28C17A1AB73458733C6DBCAD283FC950A843EA7A7ED4F0A8F0F0C73DEFE987D82ED0C8C220A25484CD5D944A4023A15276FA0A6B0CB1838882B0C3A8377D06FEE90E4D68BD2796A439559877CA489293C66E04DA146DE5E76F2D3119C62B1CAE14E15287A382353CBEBA4302DA17FF34F4BC64ACCB4750A0F754A97DC16061420898DD379E968DEDB61AFFA4637145C2D487B3F3BD29D5C884F84EA3886E28DB0D2FA0B08677B5CE60CA94DE5342DA132027F968317371C49E912461D48ECC82927118863A82E3D5F71EED19083606BA52D4EA012DBFDE1BEB351EA0CC0215983A5A0890D25B084833733C040F59F779CBE0F24C14A1FEDAC4C7A17D1BA9B97BBC38972D44BD9B9FE3DB8863A8CCEBCC8352E0106D0AE9E768BCFBFCB121FE8D216DF28045ED47FF1FC428401AB9E43DFB6D21ADD715557AA754BE01E13711CCEC47C67AE355E4320B1041BD185BEF6B51E8CD180CC5CF41CE3E827813D3E67F3C7C7F8FB3F1B5B481303A608236E0820C104182083041060821553278B88CC6C36C27334F18215777E7F2FD709C119A1004CA80F5FF7FDDB0411B3847F78F97E782083847F78F97E782083847F78F97E78208CD20098333FBEBE78208CB04118A93C51788C64249720381730463DDF9FCBF5C6AE096D76F7D63608529983BDBFC5E0EEFCFE5FAE1512A61B24F913F40605A4CBAAC30DFF003B41DDF9FCBF5C2334F73599F28DCD3C77AFE37AA299A859E14972341527C89B7B78534C9525445E1504988100733FBB4DF082317316B12F0A0CD0A2C420D9DB40E75AE96A562630F2F2E97256BC7CF97228E9EF080E79390FE1C9B788CEB0D5F41A5A8DCA875E6429092A20BA806403C8999DB91E5B418E89D9DECF63332988E3C32CB91562589E4CD476BB53998E3BDB7ED465D97226FE93192D7C214DC2A1663B135DEC6F56AC744BB53F698A9CC94D65794ACA427BE6DD5A0C8BC817FBAF8F48F64FE1AF109532661D8FCAAA81D59CED4D0D5F58F1AF6D3E27634CD992E54E5A9CA83824867A7D7C868D1D42CEF3E5D73CED4D7D4ADE75C5710495120711FF00EA039FE938F42E47D9A9397CB4012C7CA120BA59B9D458372B470CCC3B498DCCE61E352C827576AEEEDEDF788655B952E3EC968294F2CFF9742415711D8F144C0DBED45FE387B9D66E9CA6584259D42A686DE9BDB9C37C265E9C5152E62C39AD7C4EA77BE8D13BC974066F99A5198EA17052D23403810A521329F301493CB68B4CC75AB4CCE958B484A428A967E54D58BDDEE282F5E5D1E9C2A247ED62CDE8DCFF0005DF61128CC7566579553232BD38C349718053595090388923C264893CEE955BEF7182C82762662A6E25C216C509290C96B8A0A9DDC437562D95C201A5E8E7E87E8DA3EF54671A8D0B5A8D73E5F52893E2511C27DE6F1D7A7CEE380ECC4B29042028581671CF47D0F23D2009FD439340AB3F8374A6BB5B940B31CD5A4C2997070AE7C01511E9E5EE1B7A62DB97E59FA67404301C3A0F32E1FC7A50886B3F08B92C5150A3A07F56B6CCFAC40335CD9C4F100BF326401E46F1E9EA316294844A0EA4B3022A2D6FB7D6D1ACB1301AA4802D47AEBA6AE7ECD15DE69995556D4D35252A1E7AB5F2A4B01A6DC713C52012B294A929DC594403060E1862F389387491DE253BD406141B8A8D39DA1E4B06A542B4BFE2C0DADE9170E89EC0F36CD4359BEB157D5E96CE21B252494EF10D906E2D713F7628D8EED580B992A44C2B58B241372E3F75A8EFE778792F800F98F08AB9D69EFDBC76068FF80E9160506459730E180976A6101482810140AD24C9BCC751B462A1986698EC54D96662662D21D9292A003E8598173BDBCE23F30C414B7764177AD2FBD34FAC26A9CF5B7C2D352F29D4A859B014902DD45AC23F1B4E2532F94BC40654AEEF89AF5D28E5A97FB8BBC45A264D591C454403CF9EFCFEED588CB953474A8A87DA4C950920927840BFA83B7BB6DE313B23279666A42D21DEAED762E5C359ADF4899C3A09038B6A6FB721AEDE01A206E664FE6D59F56678F854A8309200927E7D24DBC8624274AC3E15C24A681C00DD69B695F21BCACA93C4C4DB6D9BA69FE3687E7B45505232D57E6F9A8A765292B5309256B77994F0A145423CC7A6F3881C662138C981082FC27E773C2C0D475B579B43A4E1A5862A2036FA9F37A368DBEF0C6BCCF35AD7865BD9FE9E5BC80425CAF765B027FAC77E913CF63CBD063051230C92A54E48091F33548A5A85FF008B18D4A253965060ECCE4539BFD4D1D8C3E9ECB9FAE432FEB5D48595BD25596328E22B3B9471D3AFC3130277D84E1A2FB45DD14FE9C7788018AE8967A588721F97F0D2694A49F99B60E45AF725DABB7D227FA6B4BE41A711DCE95C9425FB7F99A86CD471AAFE206A10AE199EB691888C6F69A64D2518A52E6CA49F965A54A9652F70E92FCC68F4869FA9E0A8FDC054DC17BDDFD37D61FABB4AE7B5EB69DCFB8282957C45A79B7D0070FF0051EE5A5262DFD247BA766927B6B2706152E4600AC1038B89D45BFF005281347F5EB0DE6624CD62A2F7602D7E839B7918E5BCB343E46DC9CE0668F0FB4C2E9D6140F3016AE2927A8E7EB25A623B513F18B213853281B10FAEE3847913A7584DD2F715E7AD21BC6ADC9E914E0C972B69852A05429C21D0E47D8E10EA484D85F86DBF4C2F84918AC6AC199314800B8BD1FA5E9BB585E91B8243B6B786AACD4EF541934AA120CF7083EEFF00869171CE2F8BA60B2247085CC9E8593A294000D615569FE37813C27FBB6D3DF99D8B88630F66398929A3A6AC2763C61F0049B01C6047BA67D7066392E1528044D948D7852A492B6E8AD07F26129F2EC01E2B3062C0BDEC3C284F58DECE8AD61527BD6E914B46F0E3C94C4DAFC4479741F2C44CACC70B97100AB8DA8C0120FE29CC4371289B1DBDFE37E50E88ECD757558E34D332D773757154D39E29E775CD874E91B61E1ED8E1A538EE540A87CB425F42580A78D77D633DD172C41B569FC736BD4B73854741EA36C774A0CB6A00ECE30AEBD0C0F7DFDE30D2767A8C602CA992C1D4254E1EAD40F5DFA467B956FE405FCFDEF18D3F673AA9EE33C54EFF0040AA8A747044EC14ABCF2E9F2C311DA03972BE554C98146DC0A16EA0EA5DDAD6DE3432D40396E61C13CADE31ADEECC756C1229E98EE20D5D34DBCB8E3A6DD646D7792FB6CE2A8586A97496AEE18743E71A80F6FA81F5863ACECF33DA28557B494850F0065C43C6DBCF764C6DCC5F962630DDB01378B8525811C44B8EB7B5EDE87508502035DF51A728F7531F24E3ECFC6C6F9FBBF1C1046CC1046494F14DE2304119777E7F2FD70411B5B40BCDFE5FBFDF4C1046DE04F4F99FCF0410A69C01C51E5F39FCB04288D7C214E085235B9CBDFF008608C100DC03D635E08186C3C8472013B0C1030D87908E7815D3E63F3C1030D87908D8DA157B74E63CF040C058011B3815D3E63F3C10307076B78C668044C8FDFEFF0076C6C2614B2407E2A01D2BEEDB3C359FC5C40006A6F4D05DBC2F5BB346785D385A778A21EF7E9A13A7D99A24E44B44897DE2CF152C6F4366A90DE16AC1C2AE12A4C42374F320D847A794EC6D8D6667327040A182D5616D5DC59CE9EA219CD98BC61328A4A454055A9AF8FA3D1AE212BAB65B6D550B712D21B054A2B206DBEF122DB7218CA32FC57699918696A495020F00DDDADF8262B79AAF0DD9D44CC5CDC5051038F8491FDB56A9B5361E4E2284ED37B7CCA34C5322872F79B72B569752A29503E24881C88E7D7A5F1DAFE1A7C1CC561CF7F8C42A677842871A0B5CEF414F3178F297C56F8BB88CD8FE972F9C70DDC128265AC8E236FED22ED53D4F21E74EBFED6732D575AEA33079F4B4E2D413C2EAC24024C084900F291BEF8F567677B1785C0703E193403FB6D4D4355F937DE3CEF8CED26678B2A13B17326715C9528D198EBEF6D62A879229525C2BE2454DD3C4789422E7724CDFD79C6F8EA38746130E84A1084CB54B152183BDBEBAF9B522BB89526629D63BC7724AAAE75F07EB42F7B99664398E67529552214585195A9426C62FE2DA2F61CBCED8431D9BA2524A1243B338D7C00BD9CD8BF488C561D0E78500381E0C5E963EA4DA2DCA4CA74F69BA32FD429B5E6CE241610BBF8C0B813206FEE33EFE7B99CCC466B8860925292DC4347EBD3F11A80A940949290A34BD750EEDE8FB8AB18AFF0039D4F9AD71719CD5459A3121AE05048206D6410761F9626F26CB1485238D1C5C2DA37D07DD8B6D7D54B529DCBBFF0098AD6A3306D0A78D2BDC2DA2EA59333EB26E3DF7E5E7D37098796108050EEC0066AF27B0FBEF184A52028ECCE2BE15F637DC57F9967F975538B69F05D7A4C2C15244DEE427A799F5107162C2C9320278260969B94B03CDF88DB9D7F11BF100CC1D85DDBAE95DE20D9AE6C9A3E04345556F5448A6691C454D907621326E0F38F888C482F1B85920AA64C4A5491F35871B3B16D0D05BEF0EA414AA93038A54BB0A6C74F3076898689EC7F5BEB379198662E9CBF29242D69742012DF41C5C2A88E979337E543CEBB628904C994388A9C24A6AFB59FD5857A8859425004200E26673D76FA3116F18EC9E53A6744E8869C672A6587B30E148AE79C4F7AA2B47D828EF02B809BC94113EB8A5946619C4C98B98552D0B6E1AD3CC1F4FE59152411F2B12474AECE35E7EC21CCB54B8E9534D921A1221321201E8040F2DAFD2F187527B30A92F38CD2B53394B17D2BBBC47AA5CD24A9C9074B54F4A5BA6E6230E6614892A52DE879C32DB241FE6904C82B261113CFCF98C4B610253FECAA504B515314038E6C4574FE630241511C639EF7DEBE875E5766AACD2ABBC08711F524A8C02DA7EB5C5B6E5B0787DE47BB94903849201252B53514070D7C286B6E8FCCA889291FDAC5C31A13AF5F752F1B5BA3754D97EADF729694C71250C29F5D6CEC0A100AD920F2816E5D62F1799F00A2824070EFE55EB4AD4F8C3A4100304D5B7BFB7261D6974C67999B61DC932D4E9BCBC5D79DAD48A979C4F350A273F9A9BC8E1099FC2B589CD0AE67019C78D40F0B3905AB734AB0D6B7D62465CE64BB0005FC6CFA9DE9D00892E4FA1320749152E556A7CDC91DD553A8A8A1692B06F2D2C06A395C006E7D21A662679F9C4C082788F0F10268FA82F56AB55F90A35C5CD247CA4B52A2D714B7B689F2321ACC9A9C9CE730A6CA68801C148C32C3EE2D16F0778C8E3498804933798C3246266E20A97294B98A059414E90347A96363E50C8CC58001554BF51E2E6EDD3C6191FCC743658A2FAF2071E7D5766B5558F2FBE527ED1EE1455C107900266061412316B981427F0CBB997C03415F17A6BE75867366926A493B1A37D6BE5D06ADAE76859DD52CD2E474EE32C1F0A51F538001DA5C53408B79F9CE1C7E8A42D7C5318AE80FCC2E07FC41EB7DED0D56B58D68795AD478C469BD61A865EA97954284DCB86A12B94A8CCF76560A607288EBC861F4A380C229A64A0A245B878812D6259BEFB5A149014A075B6B56D287EBF57785AD681A3A24F7B996A843AB172C7D5D33E63882C9E5D27A635FD58529A5E5E9087A2DC55F56E17047DC690B306BD7663F58D4F37A3E9212FE567315A6036EA5F71A8237242779E876BF5BE674DC4BBC8986504B12909041A6ED46B0F3E990A2976D7F98DADEA6CA6800FE1F9421881E12A577845EFF6C198C20BC562D48E05AE62C30B122BEAD56661F88C0252EC5ADB69E11B5DED033152404229DB4806006184904ED278413EFDADCF19C26055885BB4D26E5E62C8A6C0F8EF734A46C662CB39B72F7688C663ABF50D5CF7550100FF006F0276EB045C0E87160C3652400E8A0DEA7CEFCADAD76844A1C92F53CBD2F11A39FE76C294AABA97561CFB1C2E28011B93C26FE73EEC4B48CA9142A969F14026FD2C7E96178C701B7153DB307AC267351D6F279E33BAB8D667DE5437F8FBB133232E9691492936B20680727209F08CF07FDC7FC5B5EBE7E6DD51A96BC1003EFA45FECBAE0DEF78541D8753E98CE232993359E4A054D4A053500B03BD396D0DE70502DC47A837B6A0BFAEDA426FF1357EDF58A983FF00EB391FFF00DE18AB2295A4A4D1EC903EC5E1100837BB6F7D353E821C6875A673421C55357A9A0A8E34BC03DC7D000E93C31B1E1DFDD76537B3C95824CBE1356091C3BECC096F5F187D2DC3B726A3FBFAD63DF2C7C938FB371B1B04CC09DBF1C1046D83D0FC0E08214D3A24AA645872C1042AEEFCFE5FAE08233420099501EBFEFF00BB608236708FEF1F2FCF04119A4013041DBF1F3C10A4BD7C3EF19608523058262013BFE18208D707A1F81C1046E6904CCDB6DC608236F77E7F2FD70411B9A6F7B13B6C0FE1FBBE0823670A7A7CCFE782063B462B4C0040317F4E5CF12783C3226254A590E03B1D99CF4FBEF1B15A1287203D6A5B7E77E5E20F2D720EC715ACD7309D2667732C1370C1EA3766353CADBECC82D7C454B244B7724D9AE69AB72F1A3430E7B9CB792532B3075F69BA7610A53C95BA8471003601441277DA7A461FF66BB298EED06253C4898CA5025D24DC87D85B67B58C577B53DB7CAB20C24C509F2FBCE134E201884F22EDCEEDE31D13ED87DA357982DFCA74D3DC05054DAD4DAE4133133B6F3CCF3DB6C7B47E1C7C2C465E9933A7CB0AA24974D281ECDD5B6F28F10F6FBE2F62F37C54CC34998A12F8949052A2C41A587837956E7A559EEA3ACAF792F56BCE3B56A52D49F1120124F99178DBEF818F5065B94C8C3CB0992896942000484A68E3C398AFD8C70DCD312A528CF99338D4BA91B390F7353CB7F186A6AAA9EA15C35C897366C4493681B0FD70AE33BBC2A7E42900BD38478DF9FBDA253882A62E41A3EADCDC8736DFF1129C934557672B5D5BEB0CE5F49C2A6C3D08E34AA09E1E382A8E71276C52F1D9BA04D1292BF9A61200487A8A55AC5FA5BA43D94492EC40D79FDA9A743D224798EA7CB74ED31A1CB5082F2014A9420C9D89BFCAF78E57C272F018AC5BAC9514962915A0EAEEC40D7587899695330E44F9F9D5F97845319CEA4556540AA75D5F7CC9596D209892798109DA3E4479DBF22ECED38E6A6FA9FE7CBAF9C32C64A0804B8A55F7045075DFAF3222199A6A4AECCC776FA825B48804285E0C72BFEFAE2DB2B289723F6A40DEC29EC57C623A2135D9A06F853DF453890F80A92676100C9B9E585D4A124306A74FBF88A6D56104194E99CE75555213A6A996BA752A1E75C050009BDD71B78B9D8FA623F179BCBC3A0AA6CC609D4338D2C1DFEF4BC0C5DB972F4F0EAFA6AFD83D3DD96699D28DA731CE386B33480B534A0A506D62E76E24804FEED8E6FDA1CEF1989983F4A261924B05071C41C034D81E84D2052CCAB1A9049E5F987FCE353D45731F51CBD69CBD840E1086C253316004705F6DFAF5DE4B26C14B992C623128E298402AE22FA9D0F3E8EC291A4B9CB5900A80E47ADDEFABBF5D6B1057DAAD4142DD54C932E158973E26F1D3D39E2E127F4E10AEE40240B04D88FCF94498410905B47B83F48E5450F2785082A7369402A9923A0373F0BFBF090C5094B69DF225E8E740357341BDBA438952C077B6A3917B03F7685997E83CCB3B2B742D6865882E305B23BD0AD8070C14111CB103DA1CDB0D2912CC85A4294E15C2DE16D0DFA878526619203A6E0BD7C373FCDA2C3C9B485365E90DA1B144BB0571A7EB7C645CDD5C404F381CF7B038A87FACAA624852DC0DEFE8DCF4A8686531205856E096F13A0B023A72894B191A288AAA29D4CE5F605ECC9D4B6E848022452AFC37E612075386989C699E82953AC2AC904A49634750723EF6A3420B5F097E26167BB72A36BB7ABBC20ADCF322A074394F5DFC57334EF56DB2A65A4A87FF00D327F967680784C917C212D6A5A12E8EED350A415711FF00C9891E6618AF1252A3F3120D8F3E81F5BBD8D7AB4BFA8B5B67A453E4C94D2251E1A851A569B35A954F004A948496F807349133279E159587C3021641F92A3E6248772410E7D6DE91B4AC42E6FCA4BBD09B7986B071E7CE1C29346D406CD5EA6CC4E5CB2389414B35416664C2428813BC45B688C2E7109207E8E477CB7A86EED88717342D537F285CA080E4814EACE396AE6A368E10CE8FA55ADC34E3367198EEEA0A96D06CC5CF74652A98DA396FB61E0C3E2A709678BF4C43F12182C2B6E41BD2EE690CA6AAB51C6FB16B015BFBD21054F6888649A4A26996DAFB01B14CDF108E5DE16C1B0E7EFC38465120A84C582B9A2A5414A0FCDB88016FCDC43798B2C00A0AD3F9F1FBDDC98FD7E7AEB890B4B8AA253A09E14ACB9F58E920186E04F4EBCED33232E4CCE10A008A5581296A8EA793F28CC87AB12051F9EE39535F2D621B54F55AD7DE2E8DC75333DF7D6942DC8844CFBA3711CF1228CAF0FC410141E8FF002B5090FE7CE1CC694661510A4D354164A7EDA548E38E6002ADBA6F187A32492082A4A549558BD4EFF7ABDC068C804D8437D4E635C8E22B7839E7C294CFC36FDF538712F21C22D8AC01BFCA0D43B506DEAD625A33C2ADBD47E79C34AEB1FA8214E2CB6048179E299F75FA1F5DF1212B27C361FF00E90E27B800A6A7ADEA6FE42321075207AC6835A968FF00F33B5A26D7F203F7BE1F232F4B8694F4FE6FAE8EF4D2F19EEF9FA7F31A9CCE5B48852FBCE9CF879EF73FB89C3B46014689484B3D680927AB7BDF4C141D0BF266FBC373B9E20589BF9188F4117F3C3A4E015A3807C7E8FF00568D82030715D6BF83086A73C64F0F2DF73F98E71F2F3C64E14CA7E21C43A1F03A73F386F3D0281BA1FA7DE879C26FE36D7EFF00DB1B230E85D801BD0D3D457942299628D53F4E7B7D7CE1155E6297D4DAC37C696E4ABC653131161138728C14BAA480E450B061A6E77DF485D2909622E35FE0BED1F4AFDDF9FCBF5C7C3D8FB350A69D20154C1B6E47CB0410AA0741F018208E426761EB10304119702BA7CC7E78208D2EA488991EFF00C8FAE0823540F3F89FCF0411B5A493C51276DCFAF53821497AF87DE37702BA7CC7E78214850C8202A45E7F7F760823760823058262394E08230E0574F98FCF0410AE99E2C25C4981C7B6C76F7E08238642DC778B913E7F18FDDB98112100D0C10E75CE328A64B40A42DC163D001279FE9F3185A54C9C169972D2A5719E12DA3F423476F6D198E988920CE5CC094A0124380030D5EFB6B5DAD14F6ADED0324D134350BCC6A9B2FF000ACA47109E20091201F302637F763A9F657E1A4ECFE6CB9864F105104BA4D053537AF90DA388F6EFE2F60F29C34DC348988E209525D2AA82DF5372C36778F37FB52EDA730D5D990CBDB7DD4654A5BA16A43CA40E124DCF0907D24DBEFF0052765BE1AE1F2244B5AA4A1C00E38439FABD5BF378F11F69FB779B67D8A9AD3A6196A52BFB8904134A3B3331D5ECEF1D73AD71BA7AC2CD02D4B43A654A528A8C912492A9BDF69F21D71D6B0988952909932E58433024306601BAD3EFB456D05253C53140CCE65C83A53EF5EAD182692AEA1F6E9D8A75ADF74F85E825283CC9E569E640B61DE2330FD22490BBD4D852BA02C75F7687C526629557297B6EE6FF005DE2CBC9B4AE5F92B69AFD46B4BEEA405A1361C24DC02127D224408E4315AC5E613F1A0A6529552012D41E7B8EBADE13485020B11EF5DBDEB0DFAC7560AF6A8E9A99D0D52520743286886C90409E32D9055B082A07CBCF6CB3294AA719AA492B9853DE12E6DCAAD7D186FBC3C97354E012C2BA7E3715F6D14B66B9A13C5078B7B9373E649FDF3C752CB72D421090120160E48B5B97D34D9A1F4BC400003403526AF567FB115F5881E659C2DB5A5B0986AA09E35822101331F7CF9F438B1A244A928E3550A050333E9CBDF3108E366A6600010790343671A9FB38A188DF05754D4A58CB1876B3BD304A38A1324749EBD45BCEF88FC663A5A41248480EE5DBF0FF009ABBD21845CBA5BB17A6AA6C66BA81EE1202568A55133782A100824F3BA76F953331CE809C9952419855C4E412C9E6EF5EAFF48D92970E4B6DEF6FE768B6E9DDA5C9694D164686E97812132128055C22665404FC639ED0045AF0E714A0BC4BAB54A41347E94DB9BC0542A1346A3EBA1FC73F1778A5566B98A56EA89E22A27BC2A215DE003FA649023CA36DCE25F0D82C2A929EF509734402053E971CC5793426651984FAF878F2FCC46DF759AA5296E2BB87A6787C44ABDC0817BC5AE2679E159981E075CA514A459AA29BD75236D2309C32829CDC10C351E2FCF67B33C6DCBB21D4BA96A053E5D42EAE92988151532521295DD2785513D6C77107081CEF0D97527A93C6A1F28A39005B97E4F9484B2A0068C0737A1B036BEDD18068BDF4FF0066F4D94B287AB2A43EF708516D4DFD9205E4FBBE1EFC513B41DAC18A131121010CE1252A724D6CD6D2947E7787489812CF524073B7DBF1CA251515D4B9636942DF699660CD3252826A026D0A5A6EDC4089B99E56C51309371B8A5CC54D52C8D0173AD3F716F768C4EC40018AC33073E0EEC1EA3F976888661ACBBC7052E4B953944FA8F087D3C5549715D7EC94A77F75F78C49CB90B47EF5D4E85874B9F2A93EB0C66E252A040A91A35B7FA56BE4EF0997A775167686DDCFF34148C0054C84F04BC93B8521B50298062E01331C8E1DC941E258BA92DC418B07B56C4977FE61929455521817A7B25D8C6E4651A5F20477C809ABAB45C28A8F89436B1240F4B6DEEC3B4380AE24B59CDC1F2BEAEFB97B3C335CB2493663CCDECCFB7DEB0CB5FDA03ABE063BB4502192A0D77684A8B808DC94266D1B9263961C61A5212A2AE1AAD892A2FC4CE6C6829D1FC61690952487B569E0FF007F3A4476AB3CCC3300422A1E7A6E3C0A2083E57B795A399E92885A1218048E6004BFA0F6E6B0E88704421629B397B8BB969E215B80D2A075984FC663A6D8593894A58A949049A02A0391D9EF5DA1A2C5880799F76A7BD96A348EA7ADF137401C0AFEF521A37BFF005011F1E9B6379998C8921D4B0280923E61E2078D89F48414973415EB7E5D7C9F4736507B35D66E82AFA8B4C81713594EAE29F22AF0FA19F99C309BDA495288EE54B26AEE950D6A2A069EE90ACA414F13EE05F6FC74DE13AFB32D6A1265A6B9C4D5306DCFFACFC3D631B48ED6A9FE67045CF09FB06DFF008061686DA9ECCB5E0134CC30491E33F58A69B6DBA89E5BCF5E789893DB293F2F7814787604B1A5E9F53CDE320136D39C42B37D05DA432543F8621F1D5350C73DAC93CFD7A62730BDADC3AFF6A08D6C4539B80EFAF93504655C563FE6F5880E69956B1C9C4E71953F4C854F741A9A82E017325A49E083D627979CF60FB4322791C4532CBDCA833317E47CB58524A544579B167EBB72FAF38ADB33D5154DB8A61541534E663BD5B6EA408E67893005A7A40C4F49CC654C03854950701C11A16D0DE90B777CFD3DFDE3450EA4ABA54BCAE36EB52EC120B886D54D133209255363FBB4ACA5A2714926DA3DFAF21A8F1A46021E8EC45FECDD6BE4CD0DF53AA5A2E052B304A164925908E28B1B4881899932524710A00185CBEFFCEAF19EEF9FA7BF6758E06A34BD1C46020595F678A7CA6DF87C2313F00A981D20A8867715F0D3A8FC468A92E0907E63EFDB8F0DF7379EB53056224733CEDCE2DB73C248CB6705070BA5C70B7DEDD5B4F04BBB0356D5ED5DFF00970DCE36399D34AE14858F71BF5BDFA75DFD2D87C9C14C4B7C849E63D2DFC7D6125A824B5CF2000F478FAA9EEFCFE5FAE3E0C89885332856DA7D63ECDF02B6F51F98C80099922FD6DB7BFCF1BC60822E232C6C124D40F51188DCD0078A481B6FBF3C1C0A360FE519009B08DBC03FB87EFDF80A14039040E719E056DEA3F3182DB248893EEFD7CB1AC60822E230EE8F9FFD27F3C1188CD08899313D446DEA7CF046E8203BEB1B3801D953EEFD704280836AC66941131267CB1A95A45D43CE36E151D0FD3EB19411B823DD8C7788FF00908D84B59B249E958CDB4154F84988D813F763066CB01CAC010195305D0A1D4465C09E9F7FE784FF005521DBBC0EEDEF9467B998CFC26CF63F86F568DCCD1FD60D85926E7D6379F38C2C852564041E27DBDFBB5DA135BA012A0C05CB8A7BA7B11CD77065ECA96A504800995111600EE4C7EA4FBE42565B8C9DFF004E4A95AD219AF1F8496FC7392967B91A7F98EB476B7DB153E92A0094D436AAA7D2E86381D4A8A0A78B7292637B131F9F67F873F0FE766EAEF71521480820FCC9A1AF303AEBBD75F377C6BF8943B392D387C24CE3EFB8904A14CD60F404DD8F851A3CD6D53DA1675ADEBEA55985538A602D5C03BCB419E40C72B4F9EF79F54F66F274E46512D12010800060D6D682BEF48F1AE6ABC4F6856AC54CC4948592B292490C4BB5FD05EF15AF7DC4AA8654B01282384A884CC9E52798F2F8F3EA32387152871A780B3049D5FE9A73BC56A64D97820650471173F37A3D8D76D1C561E726D3AFE78529A00A2A4AA54E14F840DCF88C8137BCED26D338AF669265E05E677A01A9617BD07F97F1686D2A5CC9F30289294B82CFA03BD2EFA8AD4B88B5159964FA6281140F34DBB5E5252B7400A2D91CC403FBB7962030866E6B88A4D644BB23877B5F7D5BCE2566995C094801C0152CFF004D856DB6F150EA1CF2BDE5AD4DBCA758519093E1E117D81DBE5CEC062E383C9815255C3517A7959BF3EB0C968490F46FAECDFC6915D3F52B6CAD6A7788AFFA788908F7DFCFA4F4C5AF0F9726500B4A78599C357D456BD4D4EB0C660208AD9EBE5B7BBC44731AE5A8A9216093602428C911D66E64587CF12273097857723E5624BB6B66D7EFD61A4C9F32A00B8A372BD6FE2F4872D2DA2B36D60BA8525B5B34148506A9C790503856411C05613C5707EC123699C43E65DA790E995DE00A502129152E342D41E3D442B875A9555BB356BEDF4E757768BD727674AE85A72CE5F4E8AEADE185A8A54A8541132A0A1FBE5B629F9862B158E70A52A54B770805F883BBD08EAD57B43C0A480183B863EEB42FEDA1AAB353FD72A3BFEF14C3927829E0A5279401013B6E7CF09CA4CC4942425C02439AFAD75FC35DF5AA8EE4FAFE3DF266CADAC76B104BCA2CA87D9E19326D13C302F6F8F4BE2C384402DC4013D767DE9716AF8B46C25AD4EC934FE3F30C14ECE735CFA29DB438E2CAA28CB692BE393E2E220787CB8FA88E785F1624A071F7C9414876240A6947AB723E0454BCC2CB493FEE029E166D8F503F3CF78BD7487640F5425ACCF57114ED8E15A10A2078409B8491D472F238A4E69DB43210BC3E0BFDD98974958B0D19CB8F5B3F8AF31284915001A33EBB7E75AD79DB5519CE41A529914997A986587070385084AD4F706D300A9245BF7BF3DC5CFC4E6B34CD993162612E0D404BF205B5FA88426AD09E24A0B00C431BB53C3A52FD1ABCAECF755672EA98D33951553384872AD4EA510956EA09700279EC76E6409C187CA4E1D499D3E695A49FDBD2DA9F01CAA223D731492CEFCA94FA78B8077D192A34C657918359AA33A554D4D6F89597776B2029024A038824279C9116E9B62C38752E6BCB918701219A7050A3EA451F66B5219E226A8872A2FF00F115FCEFF4D2353DABFEA08EE34BE5CD503401497DC08A852845C80EA54A13C883387C32844DFF00F1534CF208524A7E4E12EE47CACFB3F2A43718850601241D5C3BF990D406B4B7288EAEBAB6B5C52FBAA87AB1E3FCC7077894715F8785221099F281D79E1DAA4CA4242414A5800EE1CB6875A59FAD21DCB3C572DD747DFC79D39011CB1A3B51D72C3B54E7D5E9946656E249E1DF6E20498FF6DF0D57325214521D6694009F221F7143B3C394CA04124D34A375D625D43A6345E5A92739A94D7D42C0E0400A4F7253F6AE92649FF6C349C9C62D40CB965080CCA05DC11701891EEF48DD4254A624B93BFDAB6DDC79C66EE6DA53290A19765887B876F11B40B5940FC79EC71B0958C23F7AAB764F9DBEDAD79424A992C9141C989FC81A359B4DA1B9CED26B18F065CC3396255FF10961A7FBE036FB48053C3E5136C61596F7E52A9C998BE1FDACA2867DD8B79DA1B4C9C12A74A80045880D66D8F95A962D467A9D6F9B56821CAA0B077E06D2D5FA0E100EFD0751B0C4861F06245449240B12EAA6E5DDFC4FAD61B4C9BC4CE5B71CB414AB36F0C1539C562883F597999076716BE23D202A047291D6713123264E3D24AD212CDFD8C6B6FF0088F7717856428105B96B777A8F7F58685E6F5C3C23317C0BF35106E660150F2DBCB0F13D96929D52C030A0D7D9EB587108DDCE733490A4662FA60D812BF17FEE3F327F2772BB3126951FF88DA87E95A1DE08554FAB7356665E5BC446E77BDE64FEBBF2C3E4767F0C3FB80074E11E9E3AD057782143BDA066EC94F030CF0ABFE221D69977BC03A7789570C738009E588DCCB23932F80A10B9A03F094A9496A87B1A8F7BC3DC37100588ADC10EC2A3DB11AF8A0ABD47A5F3F6CB1A934D53BC14005B88525926F04CB4DC8F71F7E12C261B31944A70F3978643060A495DABA97676FA43A4A52E4A92EE46BC87DC37214A88AC353F62DD9DEAC4A5CD1B50AD3158D859AA696E3D509AD5ACF8002E2C25AE0DA475BF95832FCCF35CB26138E7C64B531130327BA019CF0A7F7120BB35348DF825ABFED3B56BF41AF5D39C75EB56F60BDA26960E5751D02B35A16E562A1A79B512912A2AE04952AE22DBFDE7A0655DA9CAB14B4484E27866D1D2B4292DCB89403973F50EC29A2A42C00A6A6A5C1E761AB5F4B5A28B7F5156B6EB94954C3F49514AAE1710F36B6C12491652C242A083B480778C752C85781C4820CE96554003A6A497FC579EB68C77547D2BA8F02D7B5E95B8B18D88D44A3E12E0E5042C48DAD63F95F9C62D072C94A0E809376602BE156EA2908AE592E521DAE68F6F03B721E50E14F9EB8BE2FE6131037FBE26E6F724EDE78417964A480C815059CBB74DFF00311D365AAEC4B3BEF5ADAA63EC831F9C095839AE5C94B333823C0398FB38AC4CB510CCF5F1F21D6343DBA6F11CEFCE7CFCBD7CF1212A470DDCEC1F53D2E3EFA4604CE21FB5C0BBF875DE3142547727DE6607E7FBEB87F2C0003D8D4B6DA0FE3AB460254A2A60FC8066E9F9FBDD634024102794F9FEFA7973BE10C4E255254E84710E9CABE95D3988DD0A4CB07BC152D5351E819AF5F02446DC3318C5AE851D5F6D49A563071491F2A405528C697DDCB78C641D71BFB09E2264F5836827FD8FA1C2A898482E1F4D00FA7A69082E7CCAB21C1079D79DB71B5F48DC871F7265C089882426D7F4F891F3C2A99214FC47A06D2EE7DFDA1A2B158B144C9596772029F968C0F58CDC436803EB2A352493C3C1E1088899E106645EE46C71198FC4CDC2377492B7BB75E9CFA74710BE19626907123B903FE619EFAD350DE3AC6D645393C2867879F89447DF1B7C4619CA9D8CC45449587E4EF7BBB7430F26627052407C42001B2853F9FCC294B9C0084A1A8E654E206DCE144193CEE3E7897C2E498FC5B34B5D6C58B87FAB577E750D0CE676932CC3FEEC44B2D562A039EFECD0D210D566F9753A66AEA2999817979B047FEEE53EEF38C5870DD89C74D01C2C9BBF09200AF27B74F5864AEDE64F2B8BFF009892C3750BD3737F43B558B4AB5C69ACB829F39E5236C27FE38E26D731F641F11208EA089838964FC32CC316C89689C566C02155BBD746DABAF48AF66BF15F2BC17FD39929628E42D34F00F7E5CB9C305476AFD9F38E2AA17A96910DA264909827CC71016B8B7E786B3FE10E6F2CA4AA5CE06A482953EFD6A3C7AC42FF00F7D39714F0F1A050D5C1D1FD3760ED788F7FF882D0D48E3C8A0AD6F306CD9C711C490D948812448215D2D389AC97E1C63A4CD48992D65881F32496B55989EBBF368AA673F19B0BC0AE05205C82140BE87974AF2DA3ADFDB07B4AB6F52BD4990BA12A712A49295410152362266F8F41F63FE1FC996B44CC4CAEF08E160A4B01CACCC3C79C70BED1FC68524CC12A6F0B3D44C2D63A3F414DABCBCFFCEF3FCD7397AA2B739AE71D6DC512DB4A595589364C28913E5BF28BE3D1990F67F098342448C3A50081600585EC037D9F78E19DA2ED8AFB5530AA6CCEF382D5048E757A121FA446DB63EAE3EB617DCB0B3E14195151260EE64413CA712F88561B08E1494B8B9A0B7E39379C57933A620325440E4FF9891E53A1EB33CA962B2B12B6B2C2AE25386521494FFD244907E26F8879D9F4A48299412E91400F09D79FF24E8F08A997FBAAFAFBF38B0F31CF69B49D28CB321E05B65252E2C70C8B4925464CFBE397AC28C2E23362672F8B8DFE506A05480D56B35852F405A3604A1D293F2D35F3A0714B6A08D6292CD754B85F7B825750EAAE5478BAF5902DD395C8E96DECEF6695862A993430353A3E9FE29C8B184A612E9726A4DC935BF9DEB110ADCEDD434B35EB0804184FAFA5CFBEDE5B1C5C026560EB4E11577DBEDE0D5D85352A2431F7AFB6886D353E77A82BBEAFA769DDA94A963BF6FC412B04D8F78A10809DCF5DB0D713DA0C3006A904023D8170DAE8046840343EFF00117C699ECC74FE4C84669AC1D0FD7405A3282A50E1501201750608363703F3A263B158BCCE7AA5E1507BA3FF00F7014CDD13AB9A5EAE0BDE0EE65A43962A06DBBEAED421B6D5EF589466BAAA99A63EA8CA114F428494D3D13294A14DA62FC4EA1216E4DC8E2923118325C661A72A6F0AE6AA690EAA96B58924797D291A9412C123A803D77373BF9C578BCD09A82AA263BB0A2495384A84F33E3F3F772EA7167CBF07C491DFB020390696DF61B579428896430218DCBFA0FE34FAF0FB88AE537F5B6D55552927B84B28E1851201E22D0215CB7B731E52AB460E4310B42529152549714AD1DEEE000C6E3943A97C23E635E16A351F4DFC9A2CCD23D946A4D45C35956A19665A98510E841251B11E320FC2F7C52B38ED4E1702BEEE5AF8D6E78528048A740CFCDC561F4B5A58D0067AD3DD7DEA62D166AB44F674DBC8A453559982C27EB0BE12EA82D03C3C09855CFF00A76E722D8A74FCD7139CCD69AB5CA969B24122EEE0B16AEBE70D3173C24012C877AB6E0D3968FCFE91F7B38ED0FB415919165AA4652930BA871C45284B60DC8438104C01CBE7CD354CCBB0491DE7F796763314EF42400E2FAEDD623BBC98B3FBAB7BB7ADF7B56B4B8829F24C8F272EA733AE39AE6C882BA5571A514CB1BA439250B0A33245875BC61696EB5132E5F04A1C244CA7CCFCB46D7534B426EE4B9BD4B9277AB79C32661AD2B985FD4A887F0A4A894A03480F95721240913205E636C3E3292A6E3F99BCBA37DC3460DCEBCF78D74BA7758E7A7BF790A7583E245538529E049BCF02BE7F773C615899520F095849D921CF90B426B524508735A5A9AD6D1236B22D3F91242F3CCCD1595200229D0D91067ECCB648DCC5F975C2B2E6E266B8949212A3498E4335D81A9A381BDE13EF24A48AFCF5F958DC73B56953C9A0A8D5F4F449EEF2ECB9B6985C84AC84ACAC0D89E24120C7291CF0F519799BF3622615ABFB5BE5D2AE030F5AE86D185620243A52CF76D2AE3D75E8394305767B51988216A5B73C924A449F48E47A5CFC04DE1B052E526890ECD50EFE27C06BE702B16433DCF36BFBEA74148634D3A5B2A529C528B907C4A2A889E64902797AF4BE1EA6420B02905BC00F0B7A13F66988C4296C1D9AD57EB7D3ABFD63538844C48EB78FD9F761512258B2436C403FE39D3486DDEAFF00E47D863E7FE1A113E1B000253CE0C739F3FF006E5CB0E65C941A8961B9900D76A59C6BD631DE2DCB93B54BBEFD3FC6D0DEB2DC1F10E8449FDFAE1C8C3A4DE5B1AE83F0DA535AB41C6ADFD0437D43EDB407881E2917E51B6FC8003CFD30F644874B24330D8B1A9D87D07D1A1F609D8EDA7ADF43BEF414840AAE6047119236836FC7CA77FC30E53875357C6A47A53D6EC224211BD5CD9E102204FEC4CFCFCF0B4B9452E2DB6BEF5D6086F5D6A0837F75BF7E779F4C29C0DFDCD6B0FE75B4109975295F0C19DC99B812622DD630EA54A4A920A98DC5439F571D4DE1594A29762D6FBC2571D4926C24F97972E60FAC5F0B1932DAA81AD424026BEA7CCC2BC6ADFD07E211FF0011629DE6E9DC42BFCC980B42949E0E1BC9281CC91F9E18CC934B50BB16707CE81AB4EA233C6AA9E2AF415F187D4EAED47A78368CBD62AB2E77FE221D0878047310EF11DA7CFF00185C56592F10A4AA623E641252504A087D8A4A49F41F58D84D98971C47C61AB54E97ECC7B4EA7A56338A5628338752E019836853629DD588054868210BE251FEA369EB87582999D65E5588C32A64D91218A6471F0950D7E62788F09FC757D84026FEE5313AFAB01D7F160F1D27ED53D9D759766CF2F36A243B9CE975A8B89CD18BF76DEE3F92D95AAD2522676338EB1D8EF8872B19325E127AB827A084AE52D4C52FCD4CEE7F1AC3A9984E1142E0DB571A9FB5E28C7739532D06E83892572971C7014294A4DA0A1705252AF8F3E98EF3844E17152FF51316821829297147B9A1ABF36AF230DD58628F95497357D497059BD2AC07578FB7CC7E6CC4E4005806DE9E2D43E61ED1F5CE5E196E2E583391BB3D89F01EB189415DC49E1DE01547AC6D84578800B685FC391A3FA6FA343D44934228055B7F13B356362131629B799223F3FC30DCE2175E10E2A3416F0AF41E70F654B48AA9403914E7A3FADF468DE4445EE7974FDDFE18DE562012CB6E840F1041FAFF00889191946171B59D8844A61476AED7352DE4238F3E5D712386C32710C10872A346035F27EBEA4D21A63301966041271B2CF0D7F7245B9397B338D8E91C8AC66990B5B8F32DA40995B8DA66378E2509F77CF6C58A47661738A7E457CC47ED4151F161E1E02D57A8637B5B93E59C5C58892AE1B82A4876D9EDE1BE9101CFFB54D1790717F13AFA747083C5C2F24ED7BF02AF37FC2716AC17C33C7E2D295CB9334BEBC2A1434F6C7CB4A9E33E3664181E249321D3AF120BB5F715B6AF14EE7FED67A03254A5392BADD638B2A0F82B578236FB522FD131B62F9D9DF8178CCC4A8E264A900311C697E2D2C5A9CEE5EBA472FED77C6FC1E62C9CB9694B38265A83DF97DFD228FD4FED9B50AE2FE18C84CCC70A84011623C3CB6BF3E78E9584FE9F644A62A4A69FF60150068FCBED531C8B31F8AF8E524A53316EA06CA3A740E39741B98A473AF6B2D7B9BAD28A2A97691B4157111C278E6C394DADB7588316B4E0BE0C61B0801EED0786E784333BB1D0F98BF8473ACD7E25E6CBE2E19B32AECCA50B31F37AEE29D22BECD3B5DD679E89ABD4552C71CCF0855A6DFD2A1E405B6F3C4E23E1FE1B0A18C943501748E5C9E8056FF68E73987C45CFB895C3327D4B8F995D75A0FA72885D6EA6D4C1B729D8CFAA6BDBACBBFC4B71B0D04191BAAFC57DA448B8C5D7B3BD9BCAF0C952E7C89448A25D209D41D1DBD3D1F4CABB519CE68A3DFCD9A18B3A8ABA01567FAB6950CD543459FEA47539551D6562005CBAE77CEF0113C46545511CB78E90621E67392647264AA74C44A4B876E104D4D0301ABD9BF02D12F178E58613D6FBB9A9A69E7ADFC1EE845651E87C9D1943657519854208AA70BAA708524784924A80927918B6E314BC176770D8C9CB9F2E4A65C804143A402A72C6E90430A9603D6AD71A718A4979AA73D69ADDD9BADBA45479857ADFAA5AEA1D212B55815710B93CE6DBFB8822778B8E03249320829480C050003425A8C683D691CFF34CB71B3CA8A96A2E6A2A5A9422F46DC68613AB2B26A29AAD4FA9E4492DB224F1156D10542248E5CB61CE4A7636560E5AA5B04101B4D68EE7F36342C28865597CEC1A9466125CB80797234F5BF568B0B29D2CAA85B59AEA43F56CA5B1C4DB3CCC0B4A130BFB4049239913BCD1F34C67EA94A9723894B07F68762F5FDD7B7E0C5859EB615E6DEC96F3DA156A2D76A4538C9F2C4258CB784A68DD109242478CDC0572DC993CAF7C43E1B27C54D9FC650A01452E6AC7566B060F517D235AB004BB453798E7EF309729D0B53AF2EE5464D899373236B833E57DF1D4320CB5324244C484877A803C6BEDBC6088356E6FFCD652DB6B5D4051EF42413727C26D3F7C7AED8B6AE7C8C2A56164310024380CC2BE06CF616A54C68BE11C240735706DEF5D45625394F66D9D6B071AAFA9596689052B50721129064C85149881EFF7E2979E66B2427BB0B20A8909094953D6CE079D830D2130926C29BFDA2EAA2CC720D194472AC9E95B4D6B8808ADCC4242CD3140012784A55C7C664784CFBC629333078A9F3828A95C176F9AA0D6F46D3D01B4093C229E66FAD7AD621398E64E54BAA71D756F8513FF00C4AF6E63F9009B0FB3616126D8B5E592C4800ADA8C48A0714F76829B7F17E7F7D21A1B0D3ABEF944BE1933DE10525EE2D806CC404999B79DF13B331B879728A54B44B49FECA2B81BAD5CD2DD3ABFC3A41A90E5C317E97A9BFE0BDA24F9668DD41ABDF6D748C8A4A0491DEAD4128F04DFED7018201BEE663151CE339C2489265CB98CA51674B9E2B5481CC55FAC6F31254556029B507A036BF48B9F2F6BB3AD0AC34CB884E639FAC40470B8B097936B1852609B4EC27CCC731C6CFCC674C5913D6845D2789F8C747A30E571E30CE62F841653BDE8CDE1EDF9B346BAEA9D79AB941B654727C98447086D00B676B0E056D1D7CC1DB0D30B2972D45531E6951ABFCD5D4B976B9A5295864BC5292E09DD80F0B73AFDE358C8B4D643DC3950D7F15CD5525352B795C34EB024A968E25257C53B1B401D7124A0B2B4909EE9201E2481FBDEDA79F2686C310A5062E0AAF514AFD4F23A8F04399EB6CF549FE1EAAB0BA758E0698A669B67844C0054CA4131379DE2F33824616521456996EA56AA3C43C8B815D79C1C44EA7E9F48479668CCFF0032EF6ADE7BEAB42F14A9DA975490A693CC84AD416E7A2648F961E2E722594CBBAD60F0A52924121CB5289A8D5AFD6000973E25CFE624ADD1E90D38D9552AD3A9F3148BA57C54FDDAC5F759E130768B58FBB32A5E618A0AE296707C27E5B2FBC1F6A3539E91BFCA9B1E23E829A6FB7DE19EBF5A675512CB6AFE174A652AA642438427902B48936E7CF7BC62530F952070CC5278A6007E725C3B5684B0D98FA5223F15356976376DBEC75D2911879D0BE2719A4358F2AEA79C78A003BF17028FA98FD99697842861C2C1EA001F8B1F1B56EF0C7BE531AD740DEFEDE3686D7F316E80CD5BA1D53A3C2CC4060A6C405010AF5F899DA4A4E116A50253A9AEFB528370D077C40A54EC5BEBAEDE7686D7B3C61CE20D909E704C586C2E39FC4FBB12F270A6CC6D5A1EBF5DB954C6BDF2D550695029D43F5E74FB43554E7BDDF04B89E1331E20408FDC733EB787F2B02A2E58B8B8009A7D453E958511C531C9E55347F01FE3A4352F5118BAC4F5E2E43CFE64488C394E5EA70E9BDEC006F1A783F9D6151289B1F4FE61B2B752287042C73BF103F8E1DCBC0106897A75DB73F43E1780CA22E6F6B7E7F10D4BD48A9238C473F1263F48C38460554F9091B55ABD1FEFBF28C777CFD3F9844E678AA823F98070CFF5723D0DBA4F2B03D061E49C1949FDA45C9A337AEEDF6A54BEC2A7868EEF5DB7FC5FC2C61BDCCD557858B03FD42DBDB7F4BFCF0E061AA686843DD9BC7DF287D1C3599A94092B163FDC3F138C9C2BD8795BA51ABEDE08D6BCC094AAE08DB7079DBF0E5F0C63F4AE1A85C8D09E7BF9B7DA08C98AC0BE2E2500444091B5FF00630A264A903840A5F60078D61497AF87DE335D40EA09E5E216C1DC294A26E1FA7ABF41F4DE148D6DD5B6D05171016372AB029DE62449DBF59C0708667CACCFA5EA2D572DEF9C118A3306AA41432E48120A4836B9B5E0FBC6D37B63656042032920061517661CE96621B4EB1935EA6FEFDECC183E28140AE345424C120F024A9256A1B10A0653C27CF63B6C70C3172A648E032C128550B6828366D75894C0021DC6FD36B8E7F5893E59ACEBF2D6159457329CE74FBE3BB5E5AF849EED06D679C0A54DF885E6D88DC6E5183987F592268C2E392CA44F413FB83DD23E52F6A8DDE25E5CC09F9549E24D68CD53CFFCC513DAFF00B39E47AAE81CD53D9D14525536DBAFE679536254CA9409406F8882E711927BB4AA22F02D8B0F67FB7799E0F112B2ECC662D9C264E28D133C0607880608614009ADEB1B89095974D7705CB0A6FF006E76158FAAB14EF3A0A90E82D93F6004F101D36FC7CEDBE3E20C8913A610385441A00EC29F4E56ADDE91F59F118E9125DD490DAE86FF006B73715684CA72BE9969450321B4B9FF00CC2D7C30A236238C5A04ED3B1C4F617259D3880124BB12361D5B5F3615E55BC6769B0F21C7789003B90459BF3D5A346659A64F9630AAACD6B594388054A05C48D874040B11FBDCD8B0FD92C4CF1F24B596607E53AD99C0A3B781F2AC623E206130E5415350E9E62AECDA86BEC6295D51ED01A1F23B1A969E750141084AD5E28DC120981B419117DEF8B7E49F08F1B9C1E24CB5A58D5924BBDB9BD29CDFC389FC45F8DF8BC9001815A960BBF02C96B33B37AD772CC23AC3ACFDB12B96B769321A314A83294540712E0F230527D63CCDB6C746CAFE0AE2706B42D6851622852696E83DF28E1F8CF8F19E63C1733920B82CB51E5EFF002F1D76D4BDB8EBCCE8A5751A89F7D2A2BE065A6FBBEE42B70A53647174BDF9F3BF55C93B11272F20CD9292433F12013460E1EDE94D22A38FEDD6719985033E7278BFEE56BF9E81CD2B68A8EB739CEF3A714AAE456D5F19932F3C99044EC09DE76F49BE3AA65D272EC2CB4A3B99492033F08A11C9BDD6F150C4A332C7289563660E225DD458EDFDD61D7C43426469E72A882C650FB6AFFCC52AA1C571CF4E2F2E60F98F27389ED0C8CB292C2268D025012C756615E60B786ADA42E764C5466CF334A8BBA95FC91AB6AD48548D25999108A4EEFF00F538099F45183CE07C0DF0F307DAB4628006530AD1CFE3ADC3BD0087E8CFE5CD0C58BD49241F520B06FAF36852D692CC385C76A0329EEF8424171A4C9263FB8191F1BFAE24BFD6F0CA21012A49554B851E66C3D39439978BC34EFDC94101E85BA7D768CB30D179DB9429AAA32CC0FB49EFD904806F04A81EB6DF7EB8653F38C1AD6649242CEA50A6259EE4352D4859385C0CD1C4532EA4172C585AAFADEBE2690F5A734057E64D30AA94A5AA51C4730702D2AB054A6E93E1E60F0D8F989C406639D7E854132144A9764F86DAD6CF5D21B626661301592122CECD4622F46AD6BF7A43FE7799651A5DB396641C2B70A7856EA0788280BF8A09DC9D8EF6B622E463E76366056252A59249E024B002C0D9CF514AF323546768482134E747A57933D7C1DB56A8EAF37CC8D438AA90A71970F8D2A32A50E5C24CA844990244018B1C89F44B27800601A8D6F036D6B67DE1519DCB200501E2CC5EB6228CDEE91B586691C5216F952D959114E38B8812481712AFB5F95B7C490CC0CB04710068C68767D41B6946B0BB46A71F254A07840511BBD2F5F0D398B345A5A7B4E52E5684E6D99AE19580ACB185927BB800B9379B9FEEDE3D6299DA2CC2662E60952145453FBF841ABDABAFF815863889A998414A425EB4F1DB9FDD9A10E7DA95556FA90B3FC9448480610001174A77B81FB3891C872F993129529152410E2A3CC5295637F366CE6A37BF845339AD7F7F52F9AE7434DB5FFCA5E37FB51C246F6FC76C74C9197C844B96A44B4A94C4AC1A11B5E97F2DDED9E1E1153C3B58BEA7F930C748F56E6358DD1D1503952952827BF01400E222E4C5F97CFD31179A6351824B23852402D50FF8B35AD188BCF23D03956414DFC5B3BA865C7DF095B2C2928968A4788113CED756C67C8E2818BCE711899BC082A213422B6D6D4A0D7784E669E3F68E730D45F5D49A4CB406DA48290A6BC00804DE131BC7E00E25F299299A7BC9E1C83FDD5D3636E7AF22E634249A3D36FA7979727AC4442D4C970BAE2540901C4900A957EBBF53FB8C59952E4147CA8482D7A5B96963B0D2EF1903E663CDFC9E1C28281FCCD696F2CA25F093E271415C3732480A1C36DFA1E98A8E6D8C1872A12D40B39A1ADB6A9A07BFE4C6B164657A4725CA50BCC73A790EBE8095374A91F6940494F0A099320EE3CB738A54DCD264D532D642483F315370D767AD74ADDC42D2A6A50E09620382F5A93E57EA2F0B135FAA3533E9A1D3944ACAF2E42B816F1010148062656944D81BCF48C5731B8E9C14AE07984E9FBADEFD758DD7890A003EE6ECFB83A6AD489454645A5F4C334F5598BC8CC739502A5124ABBA7073201503276DAF7C34C3E231B3A6F0AA42F84D2C751CC396D6CD7B4305A8A892FD36F2F65A19731D675B99B2BA64B6453A13C2DA5A1C32361050013E7E7D77C742C9F2CC3293C4B484294CE144DAE4B28D2BA72B690D264B54C2017A390296E6435BC341B430E41936699EBF56A710ED253D2A9257DE9528B895CDD25571B5E397BB0E33DC26070E990254D4AA64C7F9501C820589492CD5A529CC424652921418B26E5C83E1FC52FE32DFABE9BC97C41BEF2BC5C2D456A057B4C1246F7F5F8E2224E0A628B5810E4004D08A3D6E45BD2350417176BD4B8E5B7A1F4864CDF3FCCF38EE997DC2CD352F10A7436AEEC10AB10AEEF878B6047145E4811898C26532A592B4CBAADB894AF9AD66E276F2B3D636330292E406D0DB7D2E756F015A4459C71B6892577EA5444D8F9DF6E7D7DC276560410DC3660EDBB696D81D4D810635AEA7AFBAC37B99BB4CFDA583C5CCF4079DEFEEB6E67A49C9CB8948012FB966D0335FD6F0DE7A0A8063E1D2D5FB75AC30D6EA1607142C2605A1511F0FF7B79E2464654A2DC487AB501A574BB8EB4AC35EE14C75B785DEC69A5493C8443731D44D150E250E70499F7DB90F3307CB13527292C192D4AD3EA7C3F98C890A1FB8172FEC445EAF50B4A9870081D773BF336D8DFAFA5E425654A7608A167A6C18354BEE3703CF412964870D5DF476D1FDBE95860A8D42D7FCDD89FEAFBA76E7B6C6D896C3E50A2E782BD356E5CB95BA3079213C3C4E18500ABEEF4AFBEB0D2FEA36D323BDEB7E2549BED161D7E76B6245193F100F2F95A8FADC1FCF5870DCBDFB3EB0D2EEA141301C9FFEA3637E5C5F2E5EFC381939000EEC9ADDB4DED7FC6B04225E7EDC1FE61F39511CFC893F324F3C3A464FC207FB6FE14B73A7BA410DEFE7CD9E11DE1E67ED91F71FDF9F25464C546881E1414B682B530E246B4A7E34F7E9AA6FE3ADFF00CC57FF00E457E78DBFD157FF001FFDC7F30E23919E36777543FF00EE1FFB8631FE8CA76E1ADEE6DD5E08528CF51B1709B5A547EEE21F2F7E30AC98D886B356C2D4A182370CE9300A5C2379851EB6B138426654514E177F06F16F75F1511AF87BF585EC6728FF009849E9C5D49F3B587BAF384C601418701A9156B3D39EEEC7561A39521C539B2146EAB73BF96DBFDF8D7F46520B259AD6F6FC818215B15EDF1020A44F21CED3D7F51842661D4456D63F6D7D5F94652A29FBC2DFADA5704116BC0249F4F2B0E76F761BAF0E0A5495241705BAB52A5F958DDFC5E49C404A48258BD0687C7F8FABC6F6EA87507FBAF7B100585EC3CBDC714BC664D8CEFB8DD5DD951219E82FE03DD2A21F4BC4A0D8B6FB1B31AF8D8DADAC3FE539A54D02955B40E115D4E4162482D142A03A1683FCB5CA0C0E206390E78595270F3A48C34F40285065814571519943E60C58B067E7123271001704380C09E6075AFF0036BC7BF3AC7B66D1FA494E135ACADD6F8BF969741937E84CF29B1906048C7CAECA7B258D5A920E196F7FDAA0FE83C4F531EF1CEBB7580085706312431FEE1F9DABB1B4757B5DFB5DBF5C86A9F4FA02035DE25C5226564D9264A790E9D37B63B1767BB0AEA4AE7492C4070DFB480696FB0D2C63887693B7EC17DDCF0407019635E43AEC7C2D1D5FD45DAAEBDD64FA9A554D4B2D3AA2375253076E968F3DC6E37C763CA3B1D9722524CC4A12C3E674876E76B695BB33C70ACF3E206378C844D5A81268146A1C9F7F48853F9054370F6719829D2FC90AEFB8CB7175484ACDC83CC7E38B7E06760B23491839299A411C4C86236D3D436BCA2A0BED5CCC7A9B1897FF00885973A58973F52E29C92BB4FA36851C7519B87D699259EE9627AA78879DA6D6E9CA6E5E6F89C6D25E0B80287EF6700F88DCDFC2AF1B8CCF0F313F2E1D24E8CC2B6D35B68D76D21A1CD6BA4E81696D8CAD2667C6A755FCC0911212A16117813F09C292F2CC66255FEECDE02BA049400D5A07363E760FCD2999868892C75BEDD2BBBB6F4168459876AF96D1B455474CC36A1BC14AF6B8DC6F613313E71189C93D869F8801E729955A24B7938ABE9ECB338CC52D8CB4A9AE4077DB4AFB1CE2BDAEEDFABDB52D287596D2926490D2605A2640F88EA22F3890C37C2C389502A9856D5FDA4B750E6BE7D1E1D61B28C5672E161496620170FCEF5B6ADAF843731F685A900977326DA039A4208DB62523CBDDD799B5603E142920140528D4905045056CDE3604D77874AEC74E92FF00EE1009A51886EB42E7AB8A369100CDBB7EFACB8C0FAFAAA5B1C657C2E16529B5AE08076DC0B0F22709E61D959395A4A66A9285D8829009E8EF4E5CEF1A8ECE62921452A5280AB0734EBCFEE41BC4F3B2DD59A9FB4BCE11419526A0E56D2D3DE3A9714A6B845CCAC9E1DC1FEADE6D7C736CF0230A0A829013BB25CB1664B3B9B7DC434998799875042A694AB4049A1A316704EDFC476FABB3CFF0F50AB4FE584A2A8B694D7B9DE71C92014F0A892266C4249DEF7DAB581C1CBCCF10578850013FF4C287EDA005EEEE2DA588A40AC14C989056A25DEF527CF5A1ABECD1515467148DBCAA62A2ED72D478944AB72646E623DF318B6C8C830F2C02569E1BBF981AFD2DD2B0DCE5938170694AB1A8D2A2DA3741D23706DCAF7A8A9A991DED792AEEDB4DC2A6E66011617B8D88F3C63112F05212409C800025DC1B03ABBE9AD74E9AFE82671001449E8C697D7AD0B7A87B7F28D3993E4544732CDD4DAF36E12A452954C2AF7B4A4181B102F8A5E3F138898B230C82A92927E70E3A535EAFD378789C1AD20294B246DA8A01A5EEDE0CE22BACEB573CF1ACFADA9490084D1308F106D3B1FB13B8BDF7F8C4CF65F2D56625467A3F6915533EBA9BB336EDAB340A32A4D0CC0496A3B9BF3AFA1881566A25B74A43A92A75C308812A99816BFAC799C5C96309971212B438FED76F20CF72DCBC28A04952428541D7E9E75FADAB0F9A7BB38ADD4494E699C2D4CE5E921684AFC1C693720494A8F2E477F3931B89ED194132A5B296A042529A8B6A459F991EA2123365A4B15007626F7FC74E7168A6A72ED374668F4CD232FBA94F0B8EA8A0293D482EDCDE763E5CE0577103118F5257892A72E529721AA2EC454EA2BF58732D132601DD825F502876D0B5EFAF237AD734A8ADABA89A9AA5ADC7092E3409086AE6C9E1F09B1B91E5BE25B2AC9A432A6CD02805E8ECEE0EE079BC253A52D052160A5ECE3F9DC74BD617656DA8A85252216A71C84850429504DA660F53CFE42C9E2F1185C1F1095312549B80A17D0BBD6D6D3EA8CC065D5747ABEF6E9E9F58B032DECDFEA4A39AEA1A8029DD85B2D12018173C412411331045E0E2A38BED5AA52952788D1C392D7722E2A0FE63596D33F655B6D3C36D983562734F9837DC8A1D3F40142380BE940213CA78949BEFD794623518A4E378A6AE6710350E77E4E6DB39A6B1998B4A4F091C2545AAD5A3B6C2A3434A3DE36D1E9AA3CBCBB9B67B541E7D10B6698A8DCF310959102C208BFC31178BCB06371084E1A61E00FC6A14096A8D6AF57A7833B33C515A0029716A8D7E9F5B0A8611AEBB58E6D9B32AA1CAE91BCB291A051DF24B60A9239FD94933C3313BEF899C064986C214CC9FFEE2B73AEF434AFDED0D133575150CCE29E429D2B70FE706A4C9B32CD2B1D6689D5D63C149FAD2DC909493241415CA4DB7E13EB737B14CC56598792FDC21C0D05475000724599FD21CA160B82A1BDFEA7CAFD22CBA0A1A0D254E1DCE50876A0890810BBDCC4A245AC36E700E2AD9863664E495E102920B874B87D03A41715FC720E5065A4FCC43806C41D8F4D79BD9CDA23F9CEB87AA5484D2D3A68E9FC4105011FCD02D0A80088E5C5EE1318C64985C5E2262953C2D4090DC4E48E94A5F47F178618C9B2C2992B751A000B123A7B6F07887D5E7A5C3C6F360CDCA94B13BEF1CF6E5F8DAE585C192689D589FA0B1BD6B5F0061B9933420AB84807521FF0087F17FA447EB73E652905A792557949504F0CF2127C899B49C5870997AD4C384814D2A4935FE6EEFA330D5089C43B384D8B1A3BBD1ABA9B52B101CDF5496F8A1C0627FA80B6FC8FA6E7EEB58246553385F80B51BE5D29E36BD34A42467252A62B0145831F16E5BFB3104A9D56A755FF140E136F10BEF1B917E53EEDEC6C183CB0949796F673F6A73D1FCAF0F25CB2B62490E1DD9DC54F833D2CEFB445EBB51B92A3DF0B72E31CFD081F9E2625654A2CD2AA6D4361BBDACCCEDCAD0B19029F35AEFA74888665A91C2A402EDAE6CB11F7824F3E7EFC4BE1F2B98C0196CC2B4D99F7F4F38D44820B3B0F7CDC9F088BD5EA35AB77A081FDE09336D81FDF5BDA465656A0C44B735D1A966B72F7AE5586AF102CF62DC98DCB69AE85E23D53A85DE4E026E7ED475E84CFEEF7C4DE172DBBCAA1D83FF00FB7F9AEB511B09640147275D76D74A35294B986A7F50BC2DDE4DCCF8891CED73E6791E5D70FD3966BC1E9BEEC0F3E7B178CF028E9EC7A7B1B874275039C4AF1CEDCC7CEFCF0E519726A0A1DB71F753728381434FA7E634AF3E7099EF08DCEF73E5BF2DB0E13972187C9C8D016F27F483815B7A884AACF56A375931CC2B693CFDFD3DF8C2F02948FDBC2D761A0A0A836F621442141C949D3EF1C7F1B56DC67AEF68EB311843F4D2FF00E5EBFCC1C497670FB4033C5F270DED3C604FE3F2F96373824B71105AF51F9A42810A21C0710A919DAEC7BC2473F10178E7CB9FE58D5385973094A594D46BB574D746A0FAC618BB6BE10A5ACED6A27F983FEA120499BCFEE309CECBF87E6200480C5C33BEEE2CEFB3C6E3E43F3538980F53EFAC3AB19D2A44B824EDE2DFE7E7F7CC6E19AF06548744BE2A35001EEE1F91703585C4B5A83A524F4F7EDE1F28F3852F8897072E7F2DCCDFDDF2C436324F700712784A8D396F435F2DEB1AA814FEE0DD61F98CCD500F18F5E21E5E639EC797CB117FA79AB2549415234228FD2952F52CF0977892581726C07376D46DBC3E51E653214A06C902E0FDA1E5BC193C845BD1A9C2198A0B52486771B1D76F7CE349A569524B108A574E7EC08764D428414AC137240222E041B7974EB718D664A49490A48200356B68FBBFF9E70B49C428D2DA6EED52DFCF833B43AD354ADCE249516E9AC5F7044A4FF48091E2326D6DB9CEE2B98ACA2522677A164A892A096D056F6A1E8FD686564CC55DE8343B86B54FB6DEBDD07F2A7EB966BB51E68B78995AD25D5113B9B0599BCEDB472E7E6F464597E1788CAC3A54117FF6DADD534E7FC3C6ABCDF3458FF7315354FA712ABB0725F4EB5DA1A2B750E92CA94D37474C2B1E1C414AE35A4A08D8DECA2623A8B47338778693C7300972C4B492001C352D46259EFB986ABC5E22692264C511FF00A8D5C5E95A7AC46F39ED12A92C292D25AA66384880947104C750028DFCFD2716FC176566E2D940A9054DA16ADF61B16FBC32323BD72A0E75700FD4D77B52298CD7B44A36D6A51CE9548A24F1A1495381DF20552940126E3FDAC69EC4E270252BEED5890B63FB2CC694A8FCF3786D332B54F520CB1C201B8DBA1E6CD5D62AFD41DAD65B468529354DBAB0492B2E804F9F093607CF963A3767BB2A7112D972532980705007D40AD35A08B5E579384201980A8D3A790D9DFC2B14E673DB930E3ECADB5B95350CA5D4B0594AD5DD29C0526528078A7948E56C48E65D93C1226C84F7D2E59E2A80D70A17636A72AEE6A5DE27052D2582343A01663EB5ABFDA2AD7BB48D5CB52BEAABAEA976A164A58348F2001C5207196E0083126398E78E9995765B2E19795AA6C952932C70A8CC4248201AF0F103FE1ECD19C1CB44B5FCD2D240342C0F3367B3E9D4421AB63B57CF9756E8C8D4D53381B97175CCB5208B1E12A4949EA2079F5C46644BC164B8D9DFAB216852FE43C25693C2589F95D88BF9178BB607F4C8427BB090A57EE0CCDA8AB7956ECEFAB4BBA27B48AAA734EE5336D33B92ACC1827726092E037B8DFD31D025768FB349E29AA2A134821291216C4B14D592C295F3F04F345A5212124352CA0DB55893ED891689B766DECFDDA4F6919DD26554CD2A8A868D73985621E6DF4069638941442884CA0280BE3CC1F17338929C4F7B257C1296A2C0382A721B84382CFB0B448E5C70EAC24E2A092A09BD284397D6C6F67A8AC7A7DA732DC97B11D3597E8CD2450BA9792539954777C4E3AA0429D8717C4A4DCB9B28C0F28C732C0652ACDD2AC5E632CF73874954849510FC42A48043EF5D758E17DA5CC38735484CD1598CA00528A037E571EAD0B17574798B952FF7AA6DA2106882B88A90E11FE638D47C4A0573F6CDA60784E18E132F3FA99812582154140E03D035D9BC46A6F12D9866024E1B0E65A5C902DD2A7AF3A6A6F11F6B2319957A5145C55554A5C2D494A884A64026448FB26E7CB7C587198708C1A953A67720268A26F7602BBE839C62566A66CB09EE6AD550D49AEDEB6D748BBE82874FE81A46B32013559F54B6A4788A8FD50A93DDDC2894F882B9C4103D31CA55226E231AB95326A9520AC10AE2FDCC5EC0D3437ADAD48C2E7CDE207BB2923400D1FC3A78F898ACB39CD5D6C56875E50AE9E342F8E5203B2B03864A620C6DD77C752C065B2A64AC3B04AA5AD2C4F0B31096AEB53F4BEE86231844B50E0341CEFB6D5FAC4332646679EACD1D0D2386A9A59FACD4AC12921C24A080B1C161CD24FADF1B2BB9CA933921494853948000239DDC97F6CD151527158AC424A4AC242EBE63A73FC345B796690D3D90B09AFD50A45555C05B68BC0526F109907E1D3DFCFB1737118BC4998952D48E3372AA5580772FBBBF95A2F5875265E184B27E7296A80F47D34EA35F44B9F6B2A8AE0C50D2B41BA06F8D14CB6CF006D077E2E10999B7DAB75DB13D95CBC261B8A7CC03BC980099C5524A4101817029A8BE9568AD4FC1E2A6CFE21C5C014E1BC4D34F77A9784B8E3C1F0DB6B72A9D70C70B7C52924F3299D846F3D622E5FCEC5485281484B519A81AD7F3A5045EB275CAC34B4A2704B902EC7424FE3E9BC58F90E81AF75BFE259BBA9A3CB602DE715C2A7109DE128FF88B9D8C030664E21339ED0A30F2D586904F785268976700EA0303AFF22233B438B44C9F27B9E1090A62D5A53C6F5DAEF6898399DE9FCA194D1E94A0EFDE309566DC2A52F8A409FABAD2A32488B72BE39F65AB9B8C9F34CE9C4A492482AB55C7CC4D3D3C19A1C66186C24EC24A2A9C996AE0A92D570FBD74AB0E5A339655A673BCD07D6F52D7C65EF0E26B8949417920DC774950537C361B49911B1C37CEF0CBC54F1230C851EEC8E352412002037CC28AB5DCF50042DD9CCAB2CE19AB9B8D965C5124A5F5A371120F2EA7585359A8E9B4F28E55903086A980E15D42871957532E5F73C8EDE78B4E51D9996AC27793D4AE34A5D280EEE41D9B9162348AF768A4C9938B47E9A7A540289201150FB8366A5F95223158F1CD1C52A9C3B53528238D0952F856A5ED00022D3CB7F29C3695227E0674C13414A41F9490051B525B98D2369C50B912C149058B3D74E61AA36B73A3C8B25D159916C667AA6A92C65691C69A2942145226CA285070C98DC6C79E1BCFCC4AE67712945531F404A438FF0090A1A6C74DE23BBA0012452C2F5AB3D6DEED78DF5FA8F26A40963226C36CB414145208593112A52BC44C89B9C38C3C99EB09131454A2CEE1C1F3F00F71F56137E42A2091B1777636F7D6D4101CDF55B8B90B5156FF0068CFDFB79EC36C5AF2FCB52B002E502555228CE395BF35B4305AA6EB3157BF9B0BD2FE3E1100AED4C9511C64240E28D87C36F9F4E98B7E0F2B4253C294840236AE8C6C37D0FDA23D52B1137198758528252A0540BB2AA3C3ABC42B35D4CD99977C239050006FB41FC39EE312B96646A52D4E93C2F4241E7607E9B3523A6E3F1386958194C8485F08726EEC1EFA9F0E9726BACD751B6784A5D2278A7C647A7300EC63D2D7C5CB099294948E0F9410E0A76B7BDCEF11996CF958B97380482A4A5836E41F33D0D6E62BECC73D016497491267C66E26799803A7511EFB449C0012EA803421BD34BEAF6715B452733C24E46352A4F184859A6843F56DDFAD2B10CAFCFD2A20A5E3CC471458ED3CCEF6368E932313380CB93F334B00534A8F4B8BEB16F12C0C34B2470AB87CFF00C9D1FCCB3C72AB3C041FE7122F038CFE727F1BD8DCE2764E5E0542075007833D3A8D28CD68D00510351B5BDBE86AD11DADCE92A2901C2626E556B8DB97DF389291800E494826971D3D4E9A52D0B212096D05C75B577E4F0C2FE6E9B8EF0C8907C47EFB8BD80FC30F9182096F901A12C45697723A3FD68C21CA659507B253B877360DD3D986E566817B393BF3B01BDED249F2E7F3752F08003F280C6D46E9BD3FCEA61544B4921C13BDF6E51A1CCC904005C1CC8827F318553866D007E87DFA9BC2DDD207F68FC7B6D6B081DCC900CF1C5C8E511F1BFEFDCB0C3A3500F4FF00023532050D4036603DFD3531ABF89A3FE67DDFF763612258B068D7B81FF23E5182F366D304AF6E7E667CE22206FBE37FD089E93F2920820330E7B6FAFDC08732D80EEF878B8A8E0506CFB0D2E3D04708CDDB5184ACDFA9B0F53F95C93388F3D9E0999DEA945DDD9B47D6A7C2EECD08E2BB3C427BF132AAF9C241AB01D76E6232733147085779F3B9F77CA6FCB71872BCB4CE0100708662406BD09D0FD39B5619E1A64C4FFB2A964B1E106951636DC55F42F66781ACDD04C0548039288BC5BF1EB6EB8424640308B334AD4A51735A00FA5F6B7D7589BFF4542657EA0CC0EDC412CE6AE483D3F9856C57000A8BA46DB133D7D48F5B8C6715844E29065A2E2F4B3353404BFAEB48ABE3A64D9B31294A58254D66074D28FE62B5B557B79924812B320F3511F1826E2C6E6FEF386D86C0F7482820716A2AE0396D2A3F1168C9CA12825601F946BAEE5FED7E6D0F9439A24260ACC7FEA3D6D6F758CDFD6062A1DADC02D430E65820F128A881CF561D7EAC62333A50AF754D4B56AD43F4F6D0FECE6D0532E1B40B289036FC87CC72C39C0604A7088F943B397DF4B83E15D75884CB92A5CC2555622E79EA2E7F160CCD25A4CD53F694E9D8589DBCEC418DE399EBBE19CDC2B4D989090D4F3AFABF96D58B062A48084828D9F57736FA1A75DE25F9766A92412EC8B58C1F84FE5F9E22F158321D9246DE7BEFEC0AB06A895F351343CF93EEFEEA369652D7B6A0003CC4DF7B8F744131BC7CB1018AC3109502284353DD8EC2BA8A43F961980B0B8B6EDCBA6DEA7B219EEAB6E95A5FD62B0F0806C571EBCEDF87AC1C72BC364431A383B8097A12C1ABB9603936E213329C38A0BFF817E7B34509AABB4FC8B2921C6EB5282AE3E200970A88D801E254CF48FBB13384EC54B94A0B52425AA03020D5CFA7D1ED1852284804DADA55AAFBFBD5A98CCBB5ACFF00523A6834D52D5D53CB3C083DCBA841262095291C31026E408DF7BDA70E8C0E5AC26A524A06AC2DB780E605232A94A007C8DC562EED67A7F35D233A0EC93B5CD48976AF515635A7A8442D9529DA6796F21775F842C2D25201DFDD87A3B7B9660D6654AC08C42D343721F467497A11AD76891C3144A523BC20F17200FA8FB574A3337E61D99766590A8AF54EAA566D5693E3A5E07D94A9437485A16537DA45B99B4E2532FED1E6F9DA972B2FCACC94AE9DEA48F945DD8A6BB7D22E9829B2152E8D50DC3EEE3E9F46AFF13F649A51B7579369168D414CA2A9CAE5BC5C52365869DE28F3040BE37C4762F3DC462A54EC4E2662F88BB04B04837143CEEE6C4C31CC70A99C7FDB04390CCF770EE6FD0559F68ADB3CF683CC909AC5E5E28E99B69486E998FA95328A78CF008516E7722E76BF58C5F51D91CB30180188C7198E99654B3DFCC40E24A5C538DAFCBAB5838CAB26C4CF530043B3029A9028EF5EB6FE7BE5D867B04FB587B54F665936BFD1144AABCBF35EFD65D69DA461BE14BA529E1515A4288023C33067AC63C6FF0012FF00A98EC8FC38CDE7652BC5A0622528A4CB215319AB555454784770EC87C1FCC7B4B2FBC9485814F980671E8D51FC459751F429FB6CD45452B4F65D54D31DEA4BE456529051C60AB67B98B48EBEFC5070BFD73F64BB95A573D05C3026517773AF07BA458B35FE9CF374AD053C6F6142D701D9F5ABFADE3D1DECBFE8BAEDDBB30D1D4995E4795AC6639B3406A2AB5BCC2DC694CDDA8EF16A32A25425044F4338E2BDB5FEAC7B399EE6527101626092B265B9525290A6770C0286DB1DAD133967F4E59AA3018842B8D948621AA684DDDE8F60F6D68F49EBBF649ED5F48769DA6742E7D95139CEB535634C294E324BAAA26B8EAE405148DEDC660D809938B8647FD47E418ACB674EE20512509EF439B90426C059BABBC79E7B4FFD3AE689CE25A5D65E691FB08FEE6707E9A3D445AB4BF46CFB42D49425ECA96D0A920BA0394E4348DD3052ABCA6F6F43B628B3BFA9BC9938B5CC1352895C44035B24B7ED6E46F78E8723FA6ACCD78592172D7314100D53472295FA9BB7888B7B25FA3E7B5BD1D4119564FF005DCD5D480B2B5B03855104F8C916079100C5F0AE69FD4A767333C2A513310489696484F125C9A87600383BD2D4D636C2FF004F58FC3CE32D724872CDC20B8D03D7DF9C573AB7E8FAF68259733472856DD3298A9AACDA5C615DCA699B53AD0482A9B84C7839D8CF3A8E5DF1E32C9D984A0AC50095CC4A5142CE4802CF476BB5EBAB4BE3BE044FC2E11734C83F2A492E8B53EBAF2B39B4744F2EECD7501A8CCAAB523BDDD0D3551A7714A292AFF2EF29920A428AF7411CFD71EBBECEF6E138BC04AE01C4B9B2819600DD2FC4ED4F2D3908F3F768BB1C8C04F54B5B009514970D50762E7CC7D627398E63419027EA790D334964A10972A470852884813E283636DF9623B1B8FC5E2672153D478CACFCA280026D60F436BE94D6B53728918596B52784FCAEEC36BBDCEFE1B56203579AA5F59FAD2D55255B24491799802474D8751B5B173C065F2D7850B253C5C37200D9CBF56DCEFAC51B138952311C01C241621C806A1ABF7AB6BBC2FC9B4A6739FA9C396B4A6B2F4149AD5BA9EEC2127EC96FBD00AC58CF0131BF4C54B37C48C24E1282C3AC901296502C6AE4394D09201009D00B45C30064AE4B9090403767B0E5F48B532B4767BA3592D102BB3822E9521D514B906627893BF4076F53886188C66266097DEF75243712A84A86A286E6A09B51E915DCE731FD33940248240009607951BA73E6D1853516A1D615AA7D2E2B2FCBA9552DAD5C21086D7BFF002CF0F78142C2C626D18639B63158541938792672A6063303922E2AC091D7AEF15CC3663331934959258B81A07D68D600D0FA3B89AF0698D2D4E56C5334FE6FC278F3499471C183F5720A01E5B743BC1C4365D819C95F7D3B8932D45D726A14AD5B881A35ED53A6CEF33C262B3195DDE1E72D2A01833967ADC569ADEFB88ACF33CE2B3317D6E5456283DC47EA8A49E04BE09F100DA4A528E110088E5318B4CACFE46101C3CACBC84964925D4A0DAB94B91AD7C394060FB2F9CC8529671B3B84D59D41C07A5FC8D3D5A0A5C83526A501971AEE196E097C70994820CC88B408DE60C1F39FC267B83C220CE501C4A0590FA9B86D0BEE2FA343B3956324CD42E6CE5AD94092A2FAD6E59B975E5135A77B2BD254EDB3488455E6CD24F79C5B2957224AA5361F740E78AFE27319B9CCE99C492251344F0B1AE8EDCAE0DFAD2CE71495C9972825949001377207F1B7E62079FEADACCD5E2ED5552997D3B5189088B08E2042222E3A89C39C1654785294228F43725DCDEEE1FEB5308124B925CF3E7B69CE20799EA4A5612820043EA90FA7886FC8CDC13CB9F9EF8B7E03252A524A935A55BC0D5C3FF30D4827881AD68F773FCF8DEF15FE6DAB1A1C44293BC0F101B9F2B8FC63D062F797E48470B259AF4FAD74F65A1232DC07152FD1BAB50DFCAF48AD33DD521CEEC36EA418513E21279D8137B6F63E6631273302A9588C3A384B2D55A74BB35C1D3A8112D9765C898854D203A6ACDB68F6F0B6A62B2CD753B8B2A0974285C1215BC7483CBE5E7B63A461B2F9186972D53120384DC35C36ACF43CBAD0C46666B9B3C2D087570529CAD61BF3FBC40EB351BA54415CC722BDA3AF3FDFA9167C365F2972C2D0010402384392FD1F573F8A46BD9533533D52D692C540317B3DAB7BB50DF42C222798EA074951EF02A761C516DF91DF636E9B6109582519CB41140450587B6FF348B567995210A93338402AAD03EDA003DDD8C44DFCF5D244AF7079DA7EE9371FB8C5AB0780EE9344B95004783BBD0BEF7109AE4714B4252C03063C837D3D5A186B33C74AACA2520112153EE1D27D2F7E5B4ACBC1AADC229C8F4D05858EF51D124E1406E2A91AF95181E5E3CA19979BB8A90A5445C5FC8F9C74E62DD36C3C460CA4B101EF4FAB51A95DFAD4C3A97877341437A7F3EB0DF519BAA6CB85007FAB7B7AC7422FD075C3B4614901869F96D7DEFAC3A12000346BDF573BF88AFD2A959CD5C5154ACC0E40FE33E44EE4018752F0459CD01F60D6BE1D616461F4097D6B46E752F4FBD0462E664AFEE5DA62F1F8DFDDBE161826B26D46625C697FA53D046E70E59CA03757F1BD3C5A123B9829444A95F133CF19FD116A20F93FD49BFA368F5C770FFD8EDE2DEB1A85728FF52EDB9981F3FCF18FD1285D247FFA47DC08C19005E581D7FCC62AAA539CC9888337F7F23B7C2FCE709CCC44BC1944A586E270E457F1AB75A68D0BCB4265A492900914047A83A50EE2F7BC02ACA08014491B9076E77106F1D63EFC48A1099C90A0C41A8E6799A6E2FAE9681299D354000A52491462CDD756F61E35BB982D447888BC448BF49DB9F90DF0D1139026141961206B7048FA0D776F387F3B2E912A57794E221D98120F9BD6DB73856C3EA4A544ABC46F79F8F9EF617116E9853152D465ABBB62520B10D40472F7AC442FBC532524948705B67EB407939FB70ACD5482471F0DC820AA0D89E46E3DFF007401179361A64C9738CD4170A277B13E54FCB40BCB810998104F139701F913B52CE2D0EACE66B21104C9DA3981B91E97F3B79E1A6608561710084FEE34DCB03777D3C29A3C3544B5E1C28005B7D00DBC2961E20830EAD666E20825563E640B4F537F873BCE1BE232F4E3D09F95DAACCF5FAE9CFD68C710833ECE6C4DCBF81A79EDD19EA97355909E254CF98DE663CFD26DF18D3F41DC4B292914140DBD35D687CFC94C1604A5567259CF2AB1A8B575A8DDA2434D9A2B652FED6C26F6EB11163B5BE2710EBC110B52B86A76A86B0B1B736DC6B594C4C970070B90CD5FBB816160695A0897E599A2E5202FA589DFE307F1C4662B04A20921CB5473D77E85F9814868249492FF002BB102FEB6F7B3458393E64A58582AB2787FAC1FBFDF7E5CE3158C661BFEC2F5F99ADE15D7A575AC2A896439BD9852AC4BEB1AA95BED3BB4FABEEA8D87E8E8DC5417950070C6F0A026C3CEF3BE2898C9F86CAD049280946819C54B52EFF61E6A892AA0B3EDA791A7E62C7A0EC034D64094661DA0E6C9AD7C80E53305C20A08BAC10DAC83E844748B6206676B26E2499584415D6ABAA7836A1BBDAFD79EE24F0A5492C4534AD399AD1ADFE21C337D75A5B4C512E8B48B5474CA690529714CB6A5981B853A8E29F7CDC1C3CC364F8DCDC714E0B592494B3A58DAC3E9D7A46BC0EE52E0747B5ABA30D472B475AF51F6C59AA96F2330A9714B54FD58A1E5251CC2A1283C207AF96F8BFE43D84537793A4F11A28F121CD37D69D4EDD59CFC3CF5AD250E438AFA5B93781A36FD6DD55AFABAB5E73EB4D2DF4A8F857DE1B0246F17239C4F43EBDA7B23904AC2A4A512932CBFEE2069C8B52F5163CAD6DCA708B0904A8956A2BA695A3F5A54ED15C6639A3CD394D58BCD3B84A43850C4779F68006402608F39BF96D7D3819331425094028302A34E27346068D7A5A2DB86C38580172DC9E16511FB18EC68417F30D488857EA6CB154F507EB1F58AC514F842549248513204401CE7D7A62A7DBDECC77F92E289C40C30EE54CAE2BFCA6A5886F16F48EB9D92C9F0D3D72C280D2AC391A5F60DA72B47E80DF413E62DE61F47FF0064E92D04BED8CEBBD709971415992C2428993610624F4B5B1F9B9FEA872F9B967C4CCF659C519E81353C0B27E5A26C1C90EFE7A47B93E15E5F87C160125084A8D2C91CF46DB773473B47B3A0212121490BDE2C3CBCA4F203D27738F33489C661583352E08A3B372BFB6DE3A6E63DD95A099009E497722CF46DADBEF53AEB94534C5688111E1005EF1BF972B73C45E284C9988969188FEE70CDB8D8DFCAB611218432C4951320370A87084835E122AC3CDED48F25BDAB2B6BBFFC5E7B3204B24203FA9803C3B4D322796F020FC71DE3B31842BC927A913C02657CC2F50926B6E82D51CABC1FB50A9433843E0C319AE0B3595436D77FABC7AB54E7868284A129054C3455E1927C099E53F198F2DF1C2F379B8C958F98254C51489847083407888D7DDC476BC8F0D859D97CA54C9284932D2C0A43DB524736AEBBC2E14EC8325092B804D85CC5BC85B903EE8C4A499D3D5201571061B9A96F0D796BA188E9D81C01C67089681534606CE76DCFE221FAF1B791A6B3BA86929E16B26CD14E3600F19144F70DE0C41BC5C6263229AF8AC3A66A8F12B1128A0D411FEE0241B1F173F730DDB6C1E1B0F934F9D2A5241125668904512696DDFC0C7C74EAAD78F54E7BA8E85D2AA7E0CE730484892920573C36063D3A5B9463EB17C2DC189F9560F8940FFB32D9D8FF006063BFDC9A88F8FF00F15FB55FA4CE3112C0349CB000A37CDEEDE1486BA4CA737D595F4F4F44DB8780F0F72A96D3565C8BF784009E1113E2C745CE30586C1CA56257313FED8E23C243F9024B1D5A9CC473BC1E74BCD148929155B301FF00736BF6E717552765234BD3B75F9DE4B505D653C6DB050EAD92A5899FAD2525B3C8DCF5F7F3F5FC43C221472F958D4495717013C40A85588E17DAACC0EB68B3CFEC362E64838B3216470F1F10496B3D4FD47942456619FE7B52D653434DF51A7A7E24B25A42528602A64ADC484A5E9E8A51E1B6D189B09C0FE8E6637BD0B9B39214B593C5C647ED29492787C39C73A9D8D9F84C5FE94B8659480EC4176F176B7D3495E4DA0E93295A733CE72F7350D7892EA69D2E28B4A3211C4194AC1DC6F698B6397E6FDAC95809CA9499E996A0AB93A38DF96B70E6F17DC0F62B159EE1FBD44952F892FF00B5EFD0381C9FC18D63BAA6BB33A52F36285DCB929FF84C10A6D6DA0C9F1029413E188E2FBB1D0BB199A65F9C4BE35AE59596FDC52A0A7A30AD35A6B15ECCFB233F20528CF94521C9A829147D2FF626FAC41D9CE93528465C285FCC2BEB894B496CB8A51524F2080A1CC4DFE76C5833C9596E5E8562A6E224C99680E949524F16BFF2046F60748D3229189C4CDE091215398B3004DF981A0EB4A0DA27F94F6579952B4C669AB296A68D2EA92ACA2816CB8555414A1DE0052906DE1DC1EBB639D27B7B93E2272F092FB92CE933810784876241BBB72D758B566395E6D864248CBA77090C7E45077F0BD28D485FAF2B339D26C50D3D2D3D569CA5AA491DFB94AE3A1C4881214E204483D441331CF1BE1E6E0313350B463E54CE253F0256950AE84051DDAA2DA4404ECBB16A92B33B08B96C29C40D05DEA01B7F9ABC52BA87508CB5483F5AFAD3AF24A9CA82384AD452083C3B02276E73B6D8EB192659271B2E5F772D20331501C54F01CBDD445352489D312F54A99A8FE1AF3F08A773CD646566403C8CF999D8833CAFE7B62F597F66CF106451C3A9835F636DD85DE1624E9E5BFBF22D5D08ABB36D53F598E2708E19BF15CF3BDC7588C5F703D9E4CB0974D5AA1AB50CFD4302F4D61CA5254453AB69D3D748AF735D4083C52E1EB1C4479723BDBA7E0459F0B94A5000096AD9AAF46A9F51E5A0859325C907A3EAFC86BA7BBC12B73F68B88594778A01690F178A031C40832926153CB7239DB1B4CCA0CCC5E1D610084A9DAE28DB126BF8D5A27F0004AC1CF0402AE1B9069422C76A5BC225DD957613DAE76E4C6A66BB23D3CEEA9AFD32AA75D586AA50CF748AC2A578B8C904700306F611BE28DF1A7E20657D8691949C7CF460A6630284A429871776520B10D5F017D5A935F0FF00B213BB4D371E65CA54D12880CC4E86DE5A7A5E2A0ED234A6A9ECCF5256E92D6B96AB28D4D96142731A353E1D5214E242D01412400384F2DCC1BC63A07C21ED3E1BB5F942F15879A99C829470A8317770C0FA59C6ADAE734ECA2F20CC528992CCB06654314D9B5F3E5A456157992493E2DC5AFF0018F5F2F3DA71D6F0D94A44D9930A5C1219EB6B7AD6A5B5BBC63B440A9186421AC28FC853DD7EEC6EE6095ECA262473B4F5E5D45883C84626E5609291448716E54DDFCBFC4472243CA4921E8ED5E5D1DF52417D4B59ADEAC02615D64933F21F77A83E4E9184A82534B966FB9AF56E70A230E285827A56DBD6FB3F5867A8AB4920F175D89B8163791E9704FB8CE1E4BC182430706E763CAE6E21D4BC33800077D68D47AB1B7BAC372EAC6FC4608224EDD391803D7E18708C154B80E19DCFF3434E7A43A1863F2B33694F47AB1A7836CD1ADBAC4A64F11B98DF90F79E7875FA5E160DE94A575377D7F98728C2392784BB6DCEBAD2BA6958E175A08038E7717206FBC926FEE8C6C9C3D4FCBEFC2BF6854E149B20BEAFB741BB743091CCC1488EEC933B9E5E5CCFE07CB0A8C3B8A8D742DF5F41A78C6461535E2A7D69E3CCEB78D5FC51FEB1EE18CFE993AA5FA91F983F4A8AB971D2B4B5493E8D0E1495DC6CBAF39501A5330024A67BC0B3004F2F5F7629FDA0C1A5536532C4B636B95390481A3F87DA18E230C7BD972D128CC4CC77502C11C350E357BB3E94A9A6972ADB5FD692D3A9A3701680A92A0E719598F0B64C6C48D8F2E58C62E72725C21C4E226F04A4A38895960400F724742DB30D00E83D9CC8862F0DC265712D88059F90637B30229BEC0595A6FB32D55A9F2ECCAB729CAB32ACA3C99943D5D99268AA4310E24AD04ABBBE048B45947DF0239D4AF8A7D9AC6E3D3814E3F0DDFA97C28477A80B2A70FC20A9CB78DCC2799F6233390B33132D66597247012002F5D74E86915A8CD2B5C72A51564D1AE956A69B70A78CACA1452A1C02F3298163E831D6A41972B069C54C295485238CA8AC335DC9A7F2D6D4B5C1F644CCF9420AD6A241604104E9677E4DB44F74B767FA9F57E5B579B655A7B33CD90C20BB595C9A5AA699A64B61452A24B45A5029178200FBB94E7BF18BB39946612B2EC2E370C674D982594098877E262C389DDDFC9EC4C4F0EC2E324CA066CB522500AE005069A9A8A914D6D5862A2AA4512E9DDA9571B8D2AA1B5B1B290A6CA9041024CA488BEF1E78E8786E1CEF069C62450A02D2A1FB4821CB69C874A450F39C957852A48B28906837FE6A07D840D6726ACAE4F025B24A5237B93631723DD699DF1A6580778B92AFDC0B01D1DE86956BB5DCDA2BE32C095213FB9CEDB11D79B72F0872A7AE91E9E67EEDF6B74E73D5FE2B0CE8259F930EB4F643E90F4E0061C0570D5AA6E3C5EC6E7D22434398250492A2640B93B46FBDF975FC0E20CE1DC9252C4934059BDFE68290C8A4CC253A0D2953B8AFDF9F496D06669041E2BDA21476F8EDF7EFE586389C30AD03D6AD4BFB6A168D152002771A558F377FBFDDA6995E6A94A95E3224833C47CB6BFE43CF6C55F1984624A8380E053EB4D39E90D94185410A0F4AD7A731EEB48EEFEA4D77479252AF2ED2EC314A96D250A791DD83000BF88024983B6C7CED8F2FE5F2B159ACEE2C5256A5ACFF00738034B160586A767021D9E15324103503DF58EAE6AED6A97D6971FCC5EACAD1C64B3C4B09428EF1E2298B721237E738EBBD9EEC22310D366A42258296200A825BC5A8C45EB58D84924EB7DABEFEBA0A18EBB6A8D522BD4B4BEE2E98A49809528CF99E1D86D73C84D8C476BC9BB2F84C0CB4A932D130001D4A6480DB0259DF97A429FA550A31074E7BF4D5B72F78A8736CCEB9D5B4C37DE55074A934EB6817140CC1909E2373D7CF718B94B5E53859478E74894784BA0A904D05831D0D1EBCDA2CF91E5986C413FA852659A37151DF968F4D236E4FD96F6B9A9DE42729A15AA85D23C6F06D9E14AA2E7BE00C409EA7A6D8A3665DB8C264EB599684CE0825B816C684B38483ADA8CD56117C9794E0A4CB79650A0055A8F461F5A569D69169D1FB2556B259CC3576AA6B2A091C4E5325B6EABBC9890436E1E189FEDBC8E98A663FE3263D73E5093819894F1101B88155280FCB6E76035BC45CCC74B9426489412A3C4385419C005C80CE4BFAD75A0794763DD87E9FCC5A7334A819C901417097D89213127849893B1DAE7A5A37B5BDB0CEB3DC8B1457266E18092A62144B82935A00CCCED4E82B16DECE674AC22E58528A7898026868DFC0A53CA3EE03E86DA1D2543EC5FA019D1F972B2EA39CD4477AE3A14057AE08EF0DAFD2C2DCB1F017FA8F38D9FDB8CD25E2F11DE244CFF6A802925892E412A3CB88B801C56B1EF1F837987EA700389355004A8B905C13FE45FABC7ACA84A9284C99266474B8EB279CC4FCF1E5D9397CF13261134A413B9AED7FAF5A476AC5CF4861C1C4776B0E8DAB7DEF0933104A50A0762094A60D8103AFDC0F4E738DA4E0569C54B0B98684B924D6ECD5DF61A7587B839D2CA1654001C35A5A87F9DDAEF48F33BDA9ABF2F4FB577B32B6E368EFBBDD4BC20800ABFCB372424DCC0E9CB7E98EF9D90C2CC392E604ACB2658E100D4D0DAAE7ADE388F6AB17874E71292A97FF00E630346FDC2A36F623D30A31C6CD3AA3C219660721FCA4C5B9CDBF1C7259B2509C6E256A524A8CC3C2EDFF00222DBFDFC23AEE5B342F2D9440E11DDF9B871F9F17E71B908714F49802E77E97F81DFE6061CAD52C4A60CE41A02CE1BFC7973AD6E5C9C4AB1C5452A090B2C482C2A77FF3D4888E6B2E3774AEA26511DF2F26CD12D091E22285F88E5BFC46F8DF2B9DC18FC299859A721A97216920817F5AD3AC3FED6611589C871A07EF4E1D756FFB0E9E6E7E8098F90FA6ECDA9EA7516A6CD357A90C3633BCC56D78924280AEA8200283D2279DCF4C7D2EF869DA6C5CACB30DC1296DDD203D69F2800DAAC757BC7C4BF8C792255DA1C50E2048C42C5F751D743F4D9EB0E8EE76D51D7B74FA66943CCE5EE35C4C349F155265370E04F123840B998DE77C755FF534E272EC7E2312A2B9E994BEEF8C90124A486E13436614A748AD64395230D9865E388042A6238CDC5D37D1A95D478D7DD6EC934769FED6FD96E82B337C929575AEE5B5AB7A987766A5B5529594F13E91DE8928B49079729C7CDDED676B731CABB6D394A339027E300487504B05B0205850B9661E71F47724EC46599C762A64DC22A5CF9C8C239084A5441E07A90E0171CCF311E2EEA7CFC653599E69EC969052A72EAAA969D4148EF29D21D73861C52429C2A026C48000EB18F76763710ACC7B392B309DC6168C2F15492144CB35634A31E6795447CD3EDD65389CB7B5E70AA92A42558C290188FF00F319B9F869ADE3D58FA3C3B28CA33AECE6BF5BEA2A76733467A406175C84A52834CF2DA50497A5224DADCE37B63C55F157B6389C3E73324E1714501135695B176F9A9A1F1711F48FE057C3CC366191CAC462B0E95F14A41495258074814D76AFD691D5CFA403B28CDF24ED3720A9D3540D51E4DA8BEB7F5B094B6DB4D2699A4849E22129209322201F3C760F81F9FCFCC30AA973318A54C40485A8124BA8D280DC78D7CA391FF531D8D9191F02F0B2C251F31570A40A029ABF4AD746B8887FB20F66D91D476B9A4F2FCC6859CD65756AA84A825C4A0A5A2B4F1C71A45C5A472816C4EFC699F9865D951C4A7319A014FCA975077206A473A8D2F1CD3E036024E6B9870CBC1A715C0B4F79404258D5FE53A0AD7AB5045D1EDE1DA9E96ECEBB5CEC972CA3A0A5A5CA74EBB5EAD48865B42B81B710D2E9F8D9420A956981C2666D8E19D83C266F9B23133CE266290B4A9D64A884B850DCDDDEF4A9348F58F6C256478491264FFA6C94AD80092948515001EE01BFE2D48EB97B607B5EF62DDA7685CBB28D06C37519BD2D3210E3832E76894D38037C652A718471EC762769E77EF3F073E1B6759A6638B9AAC74C9B2913905BBC2B48471925FE62D4E8ED68F3F7C431809981693804619625AC06481C6480DFDA34634DDAB68F22739D68BAB6D0E0A97EADC1DE175A4D33884B026C0391C2B1020F0CC45F79C7BFFB3D84C9F2597FA5C462E4255292848599882A5961C4384AFE562750E4C78F8767F375E3311311859AB965648012A00004EA017E474F28AAF35D4B59561468E96AAA409934EC3AF8B1DBF94857A72DA0F41D07099B767247089B99E1D0542814A46875756FD7CE26B0FD94CFA785775974F98CD6428EF7F969E3E1159E61A8AA0294D3A87699E132DBE95B2B3E5C0E2524C499F4BD862F395E2328C6B1C262E4CE701B8549376D028DDA8FE71BCFC8733C00FF00E6F0B370E752A490EDC940575D85DACF09CDF3DA8209E3299B03313E9B4CF31E91899C5FE932F94666216994801F894C186A5DC7D5B5D042984CBF1189253265296AA330249F2D0D869E31147EB2B5E6BBC3956695C82470FD5A96ADC41837975A6CA52204DD5D205A04049ED7764D13C22666D8497312AE101531018920070577EB4899576673DEED43F433D12D49AABBA5916A5386DCFF0088FA24FF00C3F34FFC4F38F69DEF288501A4A6D32426A521C5A78A9DE3F65E128248E8279EC4E3E6C7F5FBDA5C0E3335EC649C163538D4C95E278D522604865AA5900842AADB97F3B7AD7FA5DECB9948CD5799A4A030215365F0E8AA7CC0077F2EAE23C90FA4F9F799F6D1ED756B1C2555196A65238504229624204045A2605EE4E3D39FD1162A7627213278569C3A254A290B51506A93F329F9EAD63AC56BE39E5584959AA7F4265CC5198A7086705E96BD741EA1A3CFB62A6AAA96B14ECBF544D9229D972A15249E4D25667CA3F1C7BB3199FE43810462730C348EEDF8B8E621268F4AA9361E6F1C1734C9F3198A93C7849C525B80842D4EE06C08D75DA123D499CD2F78E55E5799D2B523C5534354C220EC789D6D222F3BFBCCDE1307F11BB1588C51C3CBCF708B9A5410940992C9772187CFE6DE10F53D97CDD3290AFD0CF08E176521428C1B4766360073B4332EA9D75410D256B52E7850D852D4A22660264FC26224C62ED3331CBF0D253899B88968C3A805A6628865248705C9666E7E17847FD1F1B2D410AC3AD2A51FDBC25DDF52DE97F186EAA5D43062A1B758528F843C85B73D63BC026046D244EF8532ACF327CD57DDE5F8C953D4925C2169241ABBB13F4B36D0FD792E370C90A9D8698806A92524537A86DAAFBD748481C71E3C0CA5C79667C2DA14B51F720127A9306D7EB896C663307974B13719391211565AC8F17A8F74D61F61320CCF1C954CC361664D4A3F7292951677BB258D053ED78D2E9A964F0B8CBAD2B925D6D4857C160131CEC7E186D97E7D93666B28C163E4CF502C52852491D589FA427FE9D8996A32D72D499828A0526EE69B0F7CE13A5558F71772D3EEF0DD61A69C584FFEAE049299E40C4F2C3AC666795E585031B8A9520ACB242D690F6B3900D4EC5EB5348772F25C74D415A30D316848752824F08BD7F6BB53F98D68A9712EF74A4385E5FD96D2DAD4E123786E0A8FB87CB0D319DA3C87052933B139848932D41C294B400433EFEDE12939662F1333BA91216A5A4F094A52A517766A5AADD7CA1CCD2E6E96FBE5E519AA59DFBD396D586E3AF7859E1F3DF11586EDD76471733BAC3E75849B3096094CD412EEDA178959FD8FCFF0D2FBD9D97CF972D9F8952D6CCCEF61A08D2DD653394D52D5532424800B8A25B2D284C4A6CAB9226622DB8B61CE6B81C3E3A4A71D22705F7693351C350A08054E5A961476DB788FC160CAB12996B4578825448B0763D3A781E7ED87D1C5F46D7651ED01A2D1DAD76D5AE32BCAF4AD3B89A84D1D656314EA7514EF10524FD65A7374581078B90BC1F9A5FD527F5419DE4017D9AC9B289F8A9C53364A972F8C04708677082F67BBD3C63D37F0FBB2194A9289D331929165709625CB96297D6DD23E8A352763BECDDA0BD8D7B435762D94652FE4C9C86A1A7B3A453B6F2AA1746D3EDA16DBCF214A212E20DDB70C8E626FF363B07DBCED3E63F12726CC733C5E310538A9B351853366A59D5C452A4F1071703886CC184764CCBB37835E5AB972F08853240337841715AD459B5F5BC7CE37D1D3EC0BD9C7B4E506AAED5FB5CED2B2BC9F4A6439EE60E1A2AE14F4A5D6D19A54A3BB014FB4E2802D40213B444E3E907C52FEABFB4DD9AECAE5D91E4DD9EC4E3F159AE0E64B13E5A9694CBEE258E251504101C56A43E95B50324EC4E469C619B89C6C99650B1FEDAB841249B00F4AF237D9E3E9B321F67CF66FD2BEC9FAAEAFB23C9F24CE3237B4D66ED8CE986987455B941495282B4B8A42D40A5D41921773D6063E6164DF157B5DDA0F899819B9862317215FEA282252D7308495CE4F121A80B3B07A8F37E87DA3ECCE00E4CB99859289A132DF8D207CAD7AB5776DF5A47E7EB99553CAD5DA81FA670AD946A3CF5A4B53E14A5BCCAA5B09126200004011D06C31FA51F85AB389EC06553B17F2CC9D8294A73534969F534A3B11D23C5FDB3C261E54F9C94949505101340CC5BCB4D3ADDD61A9E179C360A20152428409120743783F3DF0D64CE50CDA62250E24998C4836A9B36F5F50D578E6D2240E30E011FDA4EB537A68DF4BC2EA5AD22C5422473E91B19FDF3DF17B9D870653B7F66CE6CFCABE5BBDE15CC30EA4C8701C0069D28F4FCDAD687715CA44428136BCC6DB72B72B73B46D18ABC896A993660092C341AFDC59ACC1BC62B3224BAD4EF7DBDFB2D787EA0CC9700C9E5CF6E5204D8F4F913CCC46195574B06EB7AB81AF8E9CC18DD72D9C1A8FA3F5BDEE225B419A2E6EBFEDD95B79DBDE3DFD6715AC7619469C06AE280F4FF01C5BAB329A9B38FF00D5CEB4B794762B54E6C071A83A41333E237F58DBA5EF7DE71C7A565D225E253C12921883448152281C6D51B4339649559857C6F7DAAD7D6281CFF365B6EB4FB0A9711DE44999E4678A6C7AF58C769ECFE110BC1842C3215C2EC360E2CDE21CED13786AF8375E9EBD1B5178A7EBB33ABCC332397B6477F5B534F4EA240801D712824721014762248DF125DA5E2C2E54461D4A4044B515106AC2B73CAA7D889895278A6254A4FC86C79B0E5A901AC3AD63BE792F641A23B2BCAB2CA9CD69855E76ED326AB89D4AD694ADD6D2E8B282907EDCF3DA48031E5F38ECCB35C73E1B1737F4FDEA90085AABF310AA39208E7F888CCD676264CE0B0B29516A804381414040EA79B934AC573AED1B387EA1C6A90B34797A014A034869A21116FB294AB94FAEF8EB196F667032A44B99350A9B3D41255C4B591C4C0BB17162697DAD161C063316BC1CC2A9A543828EEE457C6CEFCBA5285CF359E62BAEA86E81D76A5E724A94BA8500929499E14AD445FC85E3DD8B22B29CBD6A92956165A96183809716636ADA9EDA23275CD5E3546628A92A5901DCB876677E74F3A98AD6B350D7BB46E2EAEA453BEEBED0727857094BC018BF4990236DB1359E76764CCECFE365230E90A561A6540AA7E451156AD3DE9178C405CBC5E0FBB0CEA4B80F40E9A96F36F311F6FF00F44CFB487627A07D8CBB31C8339D5749499930D6646A43A8292A5AEB0AC0054A093626627CF1F9D6FEA4BB1B9D49F8859DCF5C92705371044859500ECE08FF0095F4E4C358F7CFC27CD64E5B92E1C14FFB9DD8E335776A58789FE5A3D3C67DAE7B07A893FE35A0513B789223FF00783D368C79E667657311C24E1C8059994039DE86DC8C75D91DAA91312B2A092C39967F06F7CDA305FB55F624AA86186B5AD125D7C90DA000E070CC09F19E1DC7BB6DB0CF19D97C6257294B42A5A9C355DF97F9BBDAB0CD1DAE90913425600D6F5607D456DBBBB831D07F690ED5FB27CD3DA6FB08D495F9AB0EFF0085179EAFBE43842426B29D00294942B8556BDC1B74138EDDD8FECCE3E6F67B1C6493DFF749E04B0D01E2BB5EB7B4705ED876C24FFAEE140AA0CE72412EFC405B9791FAF7968BDAE3B1147749FF001C51381D6DB4A29F8384B2A420050278A4C9EB1B5A0638D637B25982F1B3D2B796B4CC5380417254FEA5FA73AC77197DBBC2E0B2FC12952C282E527889A30090C0536D47DA256DFB4AF63B52D17D3AB290242642B626D22DC40CEFBFA7A88ECCE612CA122515B9B920077D9CF21B35ED12D84EDCE027CA331284B84972D504F36372E5C0A39BC42754FB4E7636E64F9B32CEADA572BD596662C52B009056E3D4AEA001E21CD437F8EC70FD190E2B0D9860538895DDF14D965831765A6ED43B78D4456B3BEDA8C46539A32C1692B09029FDAA05CD3DDA823E726BB4D6A1D439C662AAA74D2E46E667983E97C29278D976A9E701001076563E90760D587C2E43841DC85CC3212C1AAAF94063E8FE11F1E3E27E67FA8ED1E2C951FF00F10B377BA8F3DEE1F76D1D5A15A4F42B81592559CCF34752A43E56C2D2195A92522EE05257C526FC8EFE53B2E4E2B3454D95DCAA44A7AA41278C39B6C035999AB668AC23303225CA5057FB80122B66622BE9EAD1EA67D1C3DA356E6B4DAD74267D5014D965A4E5ECACA600A843AB73BB40B0B284C0DA77E5E47FEA07B392F2DCC32FC7C99211DDCCE359081F310A4DC9036AB9FCC7D02FE947B5666659986131F33BE4CD95C284CC53B5160F08579EBA691E6DFB57D02F43FB446ADD2F48CA826B336CAD9A6436D1850AE711DE59293301D2609B795E3D03F0CBB5D82C6F60569529089D2706B4A8135044B291B3500F0E748E49F1ABB1E319DB5C26270F2190BC5B92948ABAC56800F46D9DDE3D63D679EB5ECDDECA7A4B4FD3D70A0AFA85E55514DC09EE9C70565753543E0410612975415CA3717B785F3FC9A7769F3FCCE76154A9A11885BB025BE657E29A1AF87B5BB159B49EC8F6772F913C0940E1D00020020F025DF7B86F1140219FDB652DEBAF673CB7B42A1A84D65465397D0AA9DF6520281A92C21F3C683E466F3F3C74CF833982BB31DA219762014AA7CC9685A9668CED650DCEDA5ACFC77E3BC8576AB239936534E2A9534A384026B4D37B80C28D778A1FE8BBD38ACC751F6A7AE3362A552E434B4151953EE712D3E0A675555C04CC41410A8FBA23A6FF005398DF9BB3D83C3AF8D3981095049A2788CB0280B7F73D5E28DFD1B7674E447B478BCCE571197F34B334587FB960A0478383D2F1D00EDF3B4DCB3B5FF6D6CC1CAD6C57698AECE692810DF787BAFF002FC34CE0481B12B490A81EA2F8BA7647E1F4EECC760A7E2952D4A5E2704660590470BCB2A0C5BFEEA6BE04449FC40ED2C8CE7B5D2F0B8629E04E2420A50A0430500D4F3A6D631D85FA4C7B09ECFBB23ECBF446A9D0990B397BF5B42DBB59DDA882F71A29E49E202D0B5796E76C3CFE9073EC42737ED665B8C9866210660725C83FEF70B29CF0B10051ACC6AC218FC68C99183C26453652693929E2012CF496EECE68EEFD6DADC5EC3BEC93D82F6D9ECCF95EAED55A69877387A87303535EA75C49A782E214E10980B800AAE6D1CB1CA7E2E7C43ED4766FB6F3F0F85C6CF121589504A12B57FB80AE8007A338D2FB88E87D81EC064D9BE469C5CDC1CA0A449054B29490E52EE695766F13E1D77CB7B55FA307D95F5337D966A5ADA5CE7575066CE50E74A5D0E6150D2DDCCAACA695B0EF03AD00D77A124A55102F187F2FFF00BD4ED5E0F119A617178CC26151251370C4052C21900AEC6BC446BBC5C3B2C9EC56598D56031587C199A66776C5281A90033737E8417878FA4D3D843B14CDBB0EA1F692EC3F29672E6F2DA36F31AB5D138E38DE60D661DDF7278388251DCA16491C2798306062D1F007E3B76A724ED88ECFF6AB319B3947132E5494CD74F02428853D4D081AB0B1B8880F8E1F0DB28CC72F46332AC24A948EECA94A9612D514B0B3EDCE3C95FA3EFD8CAB7DAFFB5072873D529AD09A51F4AB3B7B825B525C0A52525692950F1B651E156F36C7B53FAA0F8D583ECA76572F5659344DC6E61872112E5CDF996B2945B87626B7B4713F853F0CF0F88C7CC33D2172E52D24852416626EEE28CCD7F331ED076B5DA3FD17FEC44ED37657AB32FCAEA3324B69A5D4714B53982DA70B63B9529C6DB78B654553E150BEE4C63E7164B86F8B7DBDC662B32C1CFCCF0F216A13249489AA4A03BB3BB105FF00168F54CEC1F63B2E912F0B3F0B8452929E151504024D8D1BF8AEF1DBDF602D2BECA39865BDA876B9ECBD5AC3B9676954F42FE7397B02A1B5529CB5A712C0522A085A78C95010948E5046DC7FE30663DAFCB73DC932DED38C44D9A89FDD89B394A257F3201531729091A3F3ABD1DE5792E513F038E393AA5C80B40F96530268A37074F1A7311F2D9EDD9A0F5876C5F48CEABECE34B65EED466DAC334A1A4A4A169216B534C53A1352E955FBBEEDA25C85471011D4E3EBE7F4EFDAEC8FE1E7C239B9DE3B1B2A4ABFD3CCCEF145293C5C059342093C54E57358F3EE33E1D4DCC3B4015899AA9A9EF8B25609A055C13AB55A3DB2D21EC57EC31F474F627956BBF6A534555A86AA958AB7EB6A8543AF5454B8A42C34DD134A70ABBA5B81B3C283B49006DE1EED3FC50F89FF001AFB4999E1BB0F331872FC36226A672F0F314A010A52C24802B5636F08EDEBEC6F65F26C1E1978F93875AD284901410E4802E48247E5CD843AE8CED37E8AFF006F2AD1D8C694A4CA58D699834E31434BF52AACB54C843656DAD0FA9A612F153402880A244C1BEFCFE7E59F15FE1E6608CFF1F3F349F2B053113664B519C12A2140A81724338E90DE68ECAE3C8C2E1B0987750605212785A9B397B5DED68F1D7DACBD88321F60BF6BAEC9B33D4CDFF17EC2359674ED3525229B506128796C539429E1DE3A65EA800159F43C3B7B8BB2DFD48E3BE26FC3CC660A5625597E719560D689A9E22B521610A0826DC5C5C1D45758A2E73F0FF0D2F32C34D4E113DCAE62492122A388122DABBB73AB3476CBE995F611EC7B40F609A23B68EC4B4CA74F30DE5B435D9C2A9DC79F4D50CC51485A512BB2203AA22DD7D71CE3FA55FEA0FB519476C336C176971F331C9FD6777253314DC23BC58701C9A863A8F38DBE28F65B2EC365584560F06842D329D44243BB26EC0BEB61F58EB77D0CBEC69A0BDA2B5EEAECF3B48C9115DA5F4A379686DFA9714DD3B8BAE6149578EC9052E8B4F31B49C7A03FAD0FEA531B90766B2CC264188386C66310A226CB554B942943875A1ABD5E25BFA7ECBB2BC6E0B35958DC14B9CAEEF853C4134A2C3D41AFD77148CFE9C5F64DD15ECCDAABB21CCFB27D389CB322D4633E5E7556C294EB01146DA0B01448291C4498BFCB101FD0C7C4BCC3B6D8BCE26E7799ACAB02252D6664C241E30A51A1506B6C45F68E55F113B372324CE3113A5C905136728CA4705140ACD1EA035F9DDACFD87FA2DFD917D9F35B7B1EEBFF00682ED6B49359BFD7B23CC6A324CC2A5E7996D353963756DA8A00849979B48E524629DFD62FF501DA7C27C41C9F24EC7E70B9185C04E50C6CB90D30CC1F229292C5C380776D8BD7A9FC3CC8F2AC66478B18FC1CB13264A696A5330252AAFEDAFBA433FD16FF0047C7633ED01946B2F6A3ED7329198689CB736CF1CD319170BC80D51E519856D354789985B83829D2BF1209E84E3867C56FEA47B5D9965594653879D88C2E2B13284A5CFEF540A0808054524A5F8AA7C1F9C2BD81F875976133AC563674B973A4A269584148660A510CEE282EECE03C76133EF6D8FA209F5EAEEC8F37CAB2FC8AA72466B32CA247F07CC5C73EBADB6FB2905F14C140FD612920A951B99E78A9F6313F19666639763324CDF31C62A6E2242A68016A4AE5AA624CCA9240F95EDCAACC23B1F6C71BD9E9992CCC20CAA42572E4A92662529BF0900B04D5A80D5CF947CB7F6DD98682A9ED2754D0690A448D286B5E772AAC69C7385FA7756E38D1088E26F852A40009E77BC63EF5FC2D19AE27B2182979895FEAE6609099895D4998A9490B725EA0B9602C0DE3E7D66984C361F1F8E992F86B3144240FD9F329AD43EEA5DA204E7699DA05168C4E8ACBB50E6F43A64D7D10EE28B31A9A50106B10B221879060991D0DE6C4638DF6FBE086071B85CDB35C76024CF294CC9A17325A4AAA16A35209A0E679984BB3798E2E5E6F874CBC64CE033405490EC9AB0ABB1E63611F719ECCB4196577D12940C55079D6DCD299BA9CAA7DC75C71C5F0BCA256E2CF1AFC7B1528C998C7C5CCCB0B87C17C7E46130C844AC2231E89699290004D92599AE6E1BD23E876569953FB10B98B960CE18572BA12FC14D3CBEF1F1263B45D6195D26A5D1596EA0CCB2FD38ACFB37416286B9FA34A93FC52A5442FEAEF2146E49BDCDED8FB5123E10651987C3D938FC560244E9BFE9C572CAA524A83C804949524A83BD5887E758F9EFDA2C6E6327B52A12F1B350062FF00E902B0923BC6625C69C888FB62FA37436DFD10F45C0FD454A91A67582955352FBD50EB8A5AEB4925D794B70DC9FEA81E58F87FDB0C1E1B24F8E786C34A9489586959AA1299694A5213FEEA1DE81DCEEE7C9A3DDDD9793FAAEC4A97894F78B5610152C977F91C13B6E1B6E71F0D41E4FF0019D517B1D4F9FDE7AE6F567CB97A48DB6C7E8E7B00A188F879911C3B07CBA58615A8949B3035F060DAD63E7B76F113067F8C96147804E5F0DD802A3FC39F106F07D6386A5E954FD98127A6D791711D3117D9EC22E566589993417E371C557D4DFD3FCC56E4E19425CB2454025F5AF2BEBBF4D442B65F4A549F1117D8133B9DBF111118E9C7826CA5310DC2CD7D0FBB51F70D0EE6CB070EB0A0F42DCEF4F5ADDEA21DCD581C104806C04932237EA6F6F33E51882C348EEE6CCF9581347D1AE08A8FA3F28AAA241EF4B503D5875A537EBE46EED495890078A368BED3D3E23F29BE179A8490C589624F869F6DFCDA313648276D542BF9E477DED125A1AE4C99267C30677DAFB99FC09DE4E21B13265F1D520835622C4EC74F388C9F29945C5363CF5A1AFA9F38BB35566EB3C70BEBFD43CE36900188FC0922390232E2A9C9530A9AB077DFEC7D98889490A55ACD5AD7EBAEDA738A4F33AB7EA52E21A5C3A2E825406D1363E5CB68BCE3AAE4321387929EF43A05F50E5DB4B124B7B1161C248B52A0723BB1DBE9BC55D5D555F97D6B398A163BFA5ACA575C3292785A7D0B31FF00D2920C5AF8CF69B0C313835CB961C290B4816A28105EDBB1B78C5A70187965491387FB6012F5A16A73D06DA7231EC2D0E6343DB5F64794EA9C890DD4667945070670DA16953A8521096592A6EEA121063C33F7E3C9887ECA769A7E0318A29C3626705604A87CAE3E69B7A0209D6F0CB37C009C25CC4A6A824289A382ED4DF7DDF58F3FF55D53A8A8ACA6756ED33ACB8A429B295A4D94531C8F974DCDB1DD70D99499F230FC052470804820B8206BEBAC38C2614A306BA31092CFBB6C3D19BEC6A1CE2A1B6E94D552D6298A961412A012A529C0E2A0DA64409E7127A0C5AF0384EFE64A524D8855BF8A03AF2E710793A267EB485A010A98782AC181A8A16F0FA51E155F574F58EBB978796F3ED86D6E28A54890A0144126DB74F77417FCC241959262E7CC4A512BF4B31C382C532C87BEB52CEFD63A16225A9388C0CD029C69AB87A902B7D3AFD63ED77E88CF630EC27B6BF627ECBB55EB6D3F559D57BA33712D66B5F441A28AF536ABB0E212E714011702DEA7F365FD5776CF189F8939D6065CC12F0786C47FB44049E2E2249AD598BFD2CE23DE1F0CB234E3B22913520F11949E2150CE06A59F5FA3B523D456BE8DBF65AA623FFE03AE03911A9336303CA1FF0021D463CC333B578E584BE2980141C29D7EC2C1FA474DC3F64C244D704F10B329CDDF97AD18C3831F47AFB34D0BED3B4FA1EB42D0AE20E2B50666AEECA60A6389D26FE5CF0C31DDAB9E152C4F9C95936F9406F001E9EE86AC91D9204CE025100DEF5A3FB60199F58E8D7B457B34F63B90FB4CF611A5D9D2D50FB1AC1CCF9A52179BD60211434C9FEA53849B120472B0C769EC576BE6A3B3F8FE09E1333BA1C33784167E270DD287626D568E0BDB0EC71FF5FC277608499C1856EE1CF8F883AD8C776E9BE8F0F65F3DCD4AB485635565B6DCA8FF00E399990494050801E001E4607AE3924FED5E28E37124CD1326198A2E400D521C001B6A0B58EF1DE25FC3DFD5E5B81EF16C44A4B062744EA0E8DEBA6B2647B107B36D3B229C698AC526200FE31997DFDECDED68F3C03B439AAD49299818170191C9B41AF3A1B81489BC2FC3993230EB48554A7FEEE7CFF817D4B4373EF61DF66CCBA92B734674A568CC6932FCC2AA8E737CCD490B6695C7495254EF0C4A07DA91CE3A3E959C63B178EC1AF10B0A289F252FF2820296806D5B00ECF50FD28D9D7638E132ACD5810F26656BA254CF50FB7947831A8B5585D456D065B50728A0A5CC6BE999640FAC1E062ADC6805289E2D900DE37DE44E3EA4760F2892AC83033D127BE52F0F2CB92DC24A126D50F577AB97A5488F8E5F14303364F6931891C494A3113372FF00316D0FD39EB157E6DA919CBE1798BCDD436A5781D84A0C922E40F14926D72676BC0C746CBB234CB13172FE4580EA05360493737A1D08F431465F7E664841258D0726605EFBEAFBC7643D8BFB54CD727F689D274B96075594666E3E8AF5281699504D390D7138B0126E6DE2BEC271E5CFEA1B24978ACBA74D080A5484AD5C406C1E80835A3787311EA5F835DA09FD9DC760E54B9851FA85A1376FDC4021AAF43AD9EF1E95FB45F61995EA4F69BEC673E6F2B15CAD6AF57D4E6CA292A43472CA765CA72B51494DC8944C49B0DF1E36EC176EE6E5F2339C12A62A5CA96932C20A8BFCC169FDBC8B75BED1EEFCDBB132B3A9D94E63DD85AA6844D2784528824DBAEBD23AD7F4A7F69CC52E7FA1B413084A19D334CF273069A7C6FDC32BA7EF1B4AA525251299026245B7EFBFD3C761D3DA34E6F98CC1DE89EA2B0E976F9A61D47D7978729FEA2BB4733B289C9B0B2D7DDB0082104876E00CC36DABD358BFFD99EAA97B78F624ADC89D712FD65265798F7895381C752A654FAD80A049298E04F082013CAE71CD7E2CE0E7761BB62AC5A5E54BEF9250C0200E020166BEDA50C59BE17E151DB7C97867FF00BA7BB4B05391F303BF5AF86911CF672AC47B3A7B09EB3ED133C0296BDD6F51D1D4B8F8EE5C5835F5D474A49500612952786D7E538D519DCDF89DDADECBE0A6CC52E5CB9A8E034570F01965B672CD5B6D175C5F66657C3DECE677899284CA54C92A24A592F45D68DCD9BA574F9C3EC1F5EBDA8BB72D195B5B52A5B95FAC2BDE2932B5BA87736E26EC24C00A107EF8C7D53ED664186CA3E162B8E5A50519594824004B61C8A3B17A73158F017C3FCD67F68FE214E4AC952518FA3925819A7EC03E9A0BC7BC7F4D6D6FF09EC47B2F57D6453B4F652CA9692910A866948B58DBD31E0EFE93F15C19F76C8B904E215F35DBE79C2D7343E5E2DED0F8E39209B97767D93FB25A6800BB4B7F13AF808B4FE8FACFD549F477D567542FADA751A6B51A9350941242D2DD604A936894A8026098DE7149F8A586979A7C5BC1E1A604AE5CEC74B40492000EB4824D9A8790A1E7171EC14B184EC6631228A4E14F096B325479F3D0347C5C675A8733D4FAAB3FCF33FCC3F8B664F6AECCB82B9D400E2CB19DBC96B88993FC9094000AB940B1C7D81EC77C2AC9B29F86BDEC9912710B9D960592109F915DC71000B106A48A3171CDA3E7F67FDA7CEA4F6F92893366F7631E9494B90083380E8D5E5E31F657D9FBAF6A0FA23A8EA350D51CC1674DE661E5B80AD4E16DC70530264901AE1481702009C7C62CEB02B97F1C71B8192938799FEA00219C703289A33338A8A6FA47D19CCF2FC6633B0183C54C4A9415820B59209249402E6E472DF68A37E836D3D97D07B32F6959EB85B39ED70D46E553EDC38E452556666907123888284252902463A27F51133192734EC5E1E74D5CE9689B2C1E25BA4A4992FF00292798DA39F7C1CCB958939C1E13C487090C410471F206ED4FF11F2EFED8FA8F52EA1EDDFB4CAAAD79DA976B73A79AAA1564B8A4A296A1D431C21E24B7084A638627CC63EC27F4CF90F64717D89C395E030857FA1905733BB944BAE587513C3423E66249203D5DDF907C4D999B617365204D9B2E5F7AA0CE4502B7A7B2F4B1F7A3FF000DE663AA9DA2F69CA1CCAB9FAACA72CA6D37FC1A89C052CB21D69F35019512507888957081B7A63E5D7FF101ECDE4B9676EF245E562428CCC4CCE3EEC207012A433B683CE3ABFC229B889D8498A9B89513C0010493C4E0DDCB79D7ABD5E7B03CBF24D4DF4D0F68D575CD30CE6D9355D21CA92FF03A0177285F7E5A6DC94A89008514A4C4C9223152ED6CCC661FE0B49948C44D38695879616842D690BEF1496A820D09B30F1022F08C2E1FFD53884F471F192D4DBAEDCB77B88EB6FF00E230D59AD55DAE764D903A9A87749D28CE52CD0F7C5AA5AC52D868F1AAE107B8761694A8192200B63D3DFF00C34F22CA670ED22F30548EFE7770654C9B2D2B291F395278540BB8A170FA93148F8AF3A6C992832A72827849E04A8D580377A7361D291E2CFB2666FA9325EDFBB38CE748E72F2F57E539ED1B74CDD3346996EB15B52C35508213C29792DD3A949921462488C7B6BFA81EC7F65476273EC4FE93088C423093945932DC321452A0C9B967A5059C5E3987C369D8AC6E745D4BEE4CC40092A2A0083F31725EA6AC6D1F57DF4EE657923FEC8BD9F6ABCD99646A8D3949A7333CA1F79612F37501FCB6A6B0A4AA0C9524C83F2D87C73FE96F23C5768FB5BDACCB30EB52B0F3A7CF429491F2CB4A0CEA10ED50001401A8C418F5EF6865E0B0781C14D9851C72D095558392013737ABF56630F196E6C7DB87E89E6AB2BEA1ACCF3F3A7DBA6532036A768FF84389658909B9E2453A6091F2C42E6B879DF0CBE2F4FC3941978638827BCB267900A8D2A070977B3DCDE2A99F60F0FDA4C995DD11314896470A43905801B16D872B3563A8FD8A6643D877E8BDCF7B415D40CAF58EA9CE5867EB253DD55775976A834D716591DCC0936817B6273E21CDCC3E3576830D8096959C3E4921656A014A48EFA53A4B86A120B579D59E203E19E5E7B32719DE3A3F50B02B4601441E573BC5A9EDED95A7DAFF00E8B1D29DB250BE8CE35150399652D3543284BEF819967749435012A471281EED478C4DEF24628FF0CFB77987C09CEF3BCBD6B992A5CF284AE695143F0850173BABCA85C45C7B4FD94C1F69049528A14A7252C94921C826CC4D40BD5C3888E7B42D72BD89BE877D2FD9464B982323D579CE541540853694D43C330AE69FAC480B214B05150A077001DA76E91F09F21C57C6FF008BB8BCF66838BC1A274A33E6295DE252148F97E524EA3D0C547B5394CFEC764A9186E2E12820000B903722B6FA5447523E874FA4FBB34EC3F4D669ECE3DBA54B590E5B58B71AD3D993A953CCD5273971D7F350E36D2421BEF3EB0471BAAB4C836C76AFEA6BFA64CCCFFA6669D98C3AE64DC2A0AE6C99287131410909AA4109621D9AA4EF7A87C34EDF19B3F1387C4A08257C20A9554804824BEF5F5D6DDE1F694FA20BD9A7DA6B2BCE7B5BF657D4395E4F9BE694B559BE6147401399AB3AA82D395094ADC53AA142A2E1544849515584838E71F07BFA83CE3E0866986ECE76F7B389981731121189C4F04B32471048290A96EB0C45886AC7A0D59060BB4592E3F112260E3EE4A82407E27492D7DFDEA7E40BB5DD09AABB12ED0354766FAE3277329CFB22AE55355D33AEF7CE04F78A0C3BC424C3CD04B800FB33048DF1F6F7E1276EB2CED864F97E6D8032C61B19290B9694149487487629A50D3ECD48F9F3DA8CAB1180CE71D875850509AB090411FB496A9B50F5E948AED154DADD6D0EBB14C2AE8545266E3BF6CC72E639EC3963A6F6F932A5764B3498B4A7FF00C24EAB80DFED2EB434A79F9BC7767B0CD98E1D64007BC0E7982057DD5AD78FBEAF662AFA773E880CB14869229BFC279D8EF645E3EB039827DDBF524DB1F9A1CDF855FD47AE7713FF00FCDD2424D984D1AB81A5E84599CC7BDF23C6A7FF00B26B95C54FD310472E02E763B7324B5A3E04330A827526A39794298EA1CDC8DFFF00E6753EFF008FC36C7E8DF26C560D5F09F08BE14850CA4A4D451E4000EB73CEF7B4789FB418642FB4AA25001562814ADFFF00F23F9D3EBB53EF17E8DD7C39F43DD125091C08D2FAB036A172AF1D6CF29989FD6C4FE6E3E364B549F8F1317254ED9BCA5708714EF52687A104FA55C1F727663853D8DE07001C29DADC157B0153CB7BC7C2A3EFAD39C6A42018FF0013EA08FF005019BD64C7327AFA5F991FA25F8098838CF87D9226657830328126A6B292DEFEA2DE09EDCE042F3EC41480C672DE9CCF5DD9CFD5A3172A549A9709901411C2677B5E27E605E3974BA63F049C14C9B36581525541AD7DB6BADA22315970932A5F086A3B806D4A0A69E1A6AECA115465266E0F23C87DE7D63718322C51C52E625CB75B1AF93D01F5D221D587E397303513A1F16EAFB6FABC38AEB4422157326D73E9633F3208F291890C534951090C4D9BCEBE1B79BC41230CCA5921874DC9BB37BB42DA5AB55A5506DFD5E963EF3F872C45AE6BD5FC5ADBDEEFE95DE119B2039A3020B86DB9EDF5F52FD4D5EA491E2E917E91EF13F0DB0CE6A8AFE660143C7EA3D988D9F86AA986CFEE9EF5D22ECD40F90557B78B993D4DA3E47FDB15AC1E5E95B16A534B3B78FF00377AC5670C82E3776B3DCFE4D8DDADB54D9ABE12410A20C988B4753337E5636FBF172C149125212C006A8BF4D34B9DAF16BC149E2670E77AFA86E5E0E4BC56D9CBF2570A3799BF39B5A4733D49336318DB1B244E42924536D2C34E7BF268B6E1B0E0814D7CEB563D43D69D2B1D8BF644EDD6AFB31D768C86AEA4A74EEA7710DE69DF2B89942584F80042E42788A88F0804DB7DB1E5BF8C3932D58BC3CC972495A78CCB524170A2285FCBFC5DF62300674A2AA0E023E56078838366269B36FE3DF7EDCFB25C8F5C255AF34025A348DD38A8ABA36133F5A2A6813C3CC4104F8419918A6F65B3DC7E5C24603385A84F0A3C0A51A293C4E1C82C960C189A9E704CC20460A6AD2070941AD058359F4A9FBE91E5F6ABA775AAE7D54B4EBA179B70A1CA2752429B521453243804F111C42C37168838F4C765F3CC24F5490262492120A5DC681F57BE9A6BA8A165ABE1C4995310584C265CC7BFCC49D34B171D62B87DFAD69FAA7AB82509013E201209B47282771698B5A717AEDC62049EC8662BC3034C2CC345137428F366735DB58BCCCFF73138201F88AD0C1C9145245AD6E576ADDBF421FA081E6DFF00A3B3B225A2C952B3DF173319ABA0C1F224F5122DCB1F971FEA4D53719F10B3D52C9E3562893BD14A16D396B4AD23E8D7C2099DCE47210A179483E40793687A78FB2AA6CAA07148163F2F3B7FBDA31E7E998351E021668C08F2AB7A4760958896A0B205007A5BD3C357B469ABE15367FD31045B9ED68B7EE310F9AE5B3166594CC371AB00DC3CE96F6E211978D9604C5300100BB867B8B5796ECFE5E4C7B5B1AA57B657B27D400AEEE95FD58091B0E3A56C5CEE0F4BFBE6D8EDDD83C0CC464D8B2B55049AD2DF2A99C6FA0361D2384F6BF3195FEB7840502B3C696F9921FA5391FB7AAC8610A436F95C7794F4E08BC59A02F11EFDB718E62AC0A978EC4CC0A202A6ACB7451A75D5F6F08EED2B3A95232FC17124377496AE9C290CE7F834E8601429510B0AD89277B0F5E717B7AC61E04AA5293C35B8A9DD85A96FBC3D939E499929443304D7A0B576EAC79C326AC729DAD3B9F07109FF00F25CD477840F07F917E4F513E58525E24C8CC72F05C257390493AF0AD275A1B0677FCD373ECCE5E2729CD014848EE576BD9557DEDEB678F8E1D4F9E32D6A0D474542DAAB1F5E7799A51C00F8146BDF1B00A8B9927CADB463EAC7C2DED370E418342905411225B56CC8079DC0D46978F8CBF15A44A9DDA3C629D81C4CCADDC7191BFBF48D794F66398E69568AFD5EF16329716DB8DB6B570C2525248F0A82809EBE40E3ABC9ED34C9B87C42654BE29841E1029BD5D9A9A3ECD72639BE27092654DC312404B83D76AF93459D996B0A7D019AE42EE8D2D3797D2D7D025EAA6C252B4A45432167BC23886CA04F15C18338E4BDAEC9F17DA2C973097390553CCB99F2B3E8AE10DC9C5FCA3A764989461734CAA6CB53211325970E416282F73AD58FDEBF499A435D685D45A334A6BCCCB39CA9FAACA32353D48A5D4D377CCBA28501EE195F182A5A609B4F3136C7CE35F62736CAB3DCC72F460E7AD789C4A124A652F8529332AC5883451B6EF1F4DFB3BDB3C12F22C04E9F8894572A424104A5252C90DCDA805BED1F2C5ED9BDAD37DA37B40F69BA9D7998550D53F4AC51C39DE3605334A60F7601294C9489E10279E3EA77F4CFD805E41924E070CA2664996A09292EEA492AA915624D0DFCDFC45FD50F6A65F68733CB8489A0895318F097A0296D756D6B1DD9FA1DFB66CA5BCE3B40ECF33FCE986F2FCCBEA21A159528A7692840716E06C3CE2130A04F170EFCE71E78FEADBE1E4FC595E3E4E1967B8528F0CB4173C6A6FED0F7FA0B08ED5FD3776B70F96E1B0F879F31290B4CB492A22C000E1D85377E7179FD33BDAF694D0DECA2F765BD9F5565CFBBAC5C4AA918CBABE9C70FD533043D530197140F1852CA85A7A1338E73FD28FC32CC734ED4A71188C34E4A72A9D2D40CC94B0E165E8480D6B579DEBD7FFA81ED86053D9A9D2B0F350158890A4D140BFC9B3DCE9B79B7CD77B2766A32EEDEFB3072AE9196D0BCCDB577CED5B61A6141C68B8A5052826E649E23F9E3EA97C69CAB118EEC0CDC26124949C3E5F302B80151534922C072FE77F017C0B92995DADC4E3262811FA90B750666593ADC6ADCA8ED5F79BE9D9D6196E73D877654CE4F99E5F9A5553E5A84BAC52D7532948E24520095069D2AB0041045A27CF1F3E7FA49EC8E367E73DB554CC34E92133C8495A1697F9A6B91C4002D705ED48F717C4EED06171F82CAA585A0996800B10744DAAC35D3CAAD78FB04EB9CA32BFA322972CA8CCB2BA4CC9BD33A992ED23B5D489794A79157C03856E05137B5A6F618E61F14FB219E9F8C32E5E1A4625CE3A41429329652405209F9827845AA01ABDCE88E51DAEC265DD9DC44954C9602A5147015024B8237AD4BFB68F8D0FE20A6B3ACCF2DFE18DFD61ED599B283E2A91C1C2E674FAD2AB9E002140CCDC791C7DC6F8739663F07F0B70CAC5952972F2A53CA5A492B6C3D2A41208DACFE31E4BCC065F3FB6386C72928E0FD5A56A371598087F324EEDBC7D8F76739E65591FD132CE50EEA5CAD19A2F4F578550AABA914EA438E2C941417B8A549510044DE7A63E2DE2B2AC6F683FA929A065D364CB9F992A5999C0A0901CA1DF85855F56D3578FA378CEDA64EBF87F230B24C92B4E0D2821D2E0F00167A35EA0757631E6A7D081EDA3A43B2BCFF005CF619DA03AC65B926ABCCAB98C86B2B2B521A612BA9AC5D61256A4821D2EDB8D4041F0F2C7A13FABDFE9E33ACAB2BECD67D96CC993E64A93FA832132C924F0CB5247102598D5ABAD63897C24EDBE5B95E6799CBC419694CF9A52975003F72858B543EC2978EC3FB64FD0D190FB42769B98F69FD9176C990698D3DAA5F6EBB34A76CE5D5296DB442D6A05CAB04132A5129005E3AE285F08BFAACED47C30C966F67F1992E3D589EEBF4EE654E676294B132882E1ADA758B476F7B2B96F6BD68C5E1E74A4852B89D251576367B0B55ED6611E837D1D3D8EFB387B29E95D73D9668FED4723D49AEF2AA2A56F5F66685D3D297DF71A71745655429B5F772A4FF002C9B092463CE1F18F37EDE7C4AED2E5F9EE3F27C7A30D331266A25944D99C492B4963F238D0E8E29710E7B1FD8D9393E1712138E4105150E915093AB862ECECFB6F1F33DDB8FB4F663ECD1F4C46A1ED372CCD5BCC34FE4B9C50375B554EB40A5758CC28934CB529C6CADB5F76971517544198C7BA7B13F07715F11BE14FE8B1597CEC3A4E0E92A6216145728129FDC12A1F307F3022A824A64E76427304BA67317208AAAA2AAA96A5C37D7E813DAF7D9B3B11FA59BB1ED21AA346F68F91649AB74ED122A28EA7EB14AE3E8A8AE4B2AA805A72A5B5288525408502236F2F337617B67DBEFE98BB4B9A6066E4B8E9D2319394995365CB9BC0844A2BE1AA65905D245F7EB16DED7F6270B9D60A4CD46310A5997549E162E03D4AA800FCC7527D943E861D25ECD1DAA50F6E7DB776CD926A3CB3479555E59973AD515021A0868A544ADAAA01E3E04AA540C102379C5CBB6BFD55F6E3E20E538BECEE0F2BC623179924CA0A2998C94AA8B042900170A34E434022A1D98EC9E0BB278A13D7390A757168EE1CE84F202BCC563CF9FA747E900D37ED2FAAF48F62BD926629A8D1FD9B0ABA2D52E53387B9CFF00BE6DAFA88412477628D6D7FE52941405C441C7A5FF00A01F80398E588ED467F9E15C939A2113128992AA85A9331F849A9752812D67AEB087C4DEDA77B2F0F2F0EA2C804712554228D4D080EF7FB9EDDFFE1ECEDF34C6A4D2FDA67B3F6BAA9A5FE1540D658D51A730AF45335C351DF3CE06D0F389063651493245C1C79FBFAD5F8659CF677B468CD7012A6CD97227CD5F14B9449214A0CFC214751BB5A8224BE14F6865E2E4CE958A57CAB486E2340C0BD0DCE8FCEB5BB37D3F5DA4E8BD03A1FB2AF67DECD1CA0A9CA73A733E5E6AD50660CB8CD3943E8AB68AD2D2D6992B24A4820CDE4E247FA39EC5E6FDB0C6E7B3730C24C4CBC6A30C897DE4AF993C09525552028B9706CD6899ED6E7185CB1483865A400A51E20407ABBB3DB414B02EC0D6F2FA0EFB42D17DB1FB2AEADF66DD739965CCE55A0AA327AA0335AF6025C5D4E647304708A97533C2B6D2004930400231CD7FADBF81D8BEC8E6B968C2C99C3FD51538CC99264CC3C265F090FC009ABD1FA0687BD91ED29C74A99356B0132785454542805682DA1F0AF28E96FF00E221F684C973ED77D94762FA3FEAB5D93F67F4999B59A2B2ECC1B5538EF6959728F8D34EB2DAFC4D88DE3CAE07A6FF00F875FC20FF004DC873AED2E3662C4C9F252B9726721495BC94AD2C38AAE586973C8423DB1EDE6599C4B565AF2D7DDA4A388917218BF3A6D7E51487B197D12992FB6E7B2EE8CED8727ED3F2DD13AFB33399A33AA652E99CAB4269AB174B47C295D534B47F25008E048277B9BE257E2DFF005739D7C30ED563B23C4F646766982953C4B933940A92A4053121E52DA9CEC361150EC9F6224625189C6E16600A53A884B50FCC6CFCAAF4F08F793E8ECF653CCBE8CDD13DA8D576BFDBE516B1D33995031534197E67534ECAA8450B4FB8B6DA53D5AEB87EB0A2010902D682231E11F8FF00DA8C5FF513DA8ECE4FC83239D95AE54EFF007C4A90B481DE197FB9425201E1FF00D4760D1D0BB35DA49BD97938B918C2552D614900AAECE0D34636B5C3968F907FA447B67D33ED09ED73DADF6A7A792C3391E695F46C65686214CFFF000F42A91E712520254165B2AB822FB99BFD73FE9B324CC3B0BD8AECD649889F3711330F2815CC585024CC29531724D1DB661E5E67F89599E1F33CD66E230C94A553564A929E1726ACC40F4E82F1D247948AD71B69A3C6EBB574490B1002385F6C12784DC01733F7463DB1DB544EC6F617310924A95825B0B9FF00A65869AB59F7BB98AAE538632E7C998CCC41219C82FCF4FE35B7DDBFB336A1D3793FD1114D91661A9B2B7EAA9F4B66FC544BAEA565F42DC2F2908E00F070CAA364C9DF1F9D5C776733199FD434B9630338056684F7E25CC2857CFC553C2C963401EEF736F5164F99A11D9F989EF83995C25259C3EC77607E952F1F0AF98B15CFD56A6AFF00A9341273DCDFBA685437E20732A80DA80998363E933338FBBF869388C2FC36C361895059CBD824920FFD216075B53D77F336793258CFD2B04F0F7C4F78C4DD428C2F6F1E8F1F709F468EA4A2C9BE879C99BCD33DCB28F323A7758A2AB2A76B690D4203AED6A590A429D0E7892411E1988B63E137C46C8B198EFEA09787999662168566329489E25CD32CB14A89E2E129A1A5CB178F5A6419AA47645C4D48E1C3906A1CFCAC19CB8EA3A5EFF1079D56A9DD479CD0B47EA85AD47A8D65EB2D2B0EE6956B491C8820C8B9B75B8C7DEAF8272BFD27B2F95E166829030D253C268DFEDA685EF6B0E81AB1E46CEA60C566F3E61629338B1707FBC8AD6951E62102EA1F436DB6FD4FD6384A8254121300A8EE2D3F0F48E7D23B4B365994549775A48A6C03DDA9B787268C6712929C2A1807E116704061E2E6A3EF1922AA23C441F5F9441DA3DF883EC8A0F14F51258177DAF4B57EDB45630D85EF44C0D41A5FC5B6BF4DA17B3540F3E7613EFB1B0FD8DED1218FC4254B2904120D791D1FAFF88613F0641248D5B6BBF4D7EEDBC39B15299BDCFADE00F3BF31FBBE23FBDA0A38EB4F0F188E9987242810054736D4B915F1F5AC3E51D5004CAA768E7CEF73B794DB96136F5FF10C26E16F4E7EFCFAEE445EF9FBCA495C99916BEDE5E63E7317C37CB7BB3C3F3247450F3F06F5B450309C248A8D4B1D694F37766F4200A9B337AF24C133CF7822DCE08F95F6C5816B961988B5C355B5F0B922EFCA2E99690C12EC59AB4FE2B7A45739CBA47149067CED07A12768E7E98CA172C9F988FBEA6DCF98B45CB0286006B4B80C1AF77AFA6F102A9AAA8688729DC534B6DC43BDEA55C2B49696958008330A88B13D3683880ED276670B9ECB4A804AF8056D4B6A3A6BE4F13D265204D42D49E24B1052752A70E79EB6E5AC7B09EC69DBAD16A3C859CB7357D0E56E4ED064513AE052AA82C14990A3C809BA4FE5E61F899D9E565A0FE9A590563E65A41E24F0331A5473AD87384330C0CD93869E94A14B0524A5816AA5C5F50E0121CFAC4E3DA13D9FA83B45A1ACED1744308A4CC5092EE7B97B0907838070B0520402560711EED26F20CEC28DD8CED5E272BCC70D81C629687584CA98A27FDC018977A066662C4EED1C7B0699E8C7AC4D744B42CB248019D4E59D89FC1A691E516A5C933664E654556DADA76994A4292E24B6B3C2483E15709361331B796FECA9D9AE5F99F64B152578A97DE4CC22AEA492FC0A162AABB8FF00069D070D353331B8128F9F8549B312038BDDBEB406B1F7FF00F40754328FA39FB1E678871B6ACFC2E08327F8A3BB7C7AC74DF1F9ABFEA9B013301F14BB412E5874FEA125019A85C92799BF851C47D21F84F8633F219135350258141B74A6F6B5CD047B573C37170AEBCA3D3CCFCA31E7054C50E1FF006EA6F5B3791DFD6E0C752958644A4AD2A50254F7D3933DDEB5A53484756DFF0029464057862FB99E40C72BFB879E22F1F899A0CA4A65120104B5AF6B3C30384470CD26684EB56B56BA3DB4DB9C7997ED4C8A65FB4C7B3BBAA092ED2BD9F84A8C594B6100F39F90C769EC5E38232AC64B5A7878E5A68D664976D79B6FAD9F85F6B7088999F61BBB980844D1516FDC0E84801C7F916F48A8549FA95229C215C4C35179FF00CB06C07E679FBF9ACE5CFF00D6E238657CA16A6A8DCE9E57E7BD3B9E1729958CC0615256DC32D249A97A07EB60FD042D4BD07812D9E13304DA39449E9E71CE2708CC54D0A41E0B9AD411F57DABA9A56F0F5394C8C3C99893307EDE4052BB8FA9FBC43B5AF0AB4EE774EA8E0A8C9F354B8B240E0FF24FED7E60F97BF0E25619789CCB2DF91E5A27202C805EAB481CBAF4E91CF73DFD3C8CAB3596710973297C2E039649E7F47FB47C9CFF0087F4FE94CDB52E62C96AB6A579C664B21C50250AFAF3E47DB2779DA01FBB1F53FE18646064797CBE220CD92876154FCA08A354D5A9F48F8F1F144E2FFF00B438D54B96B52062165C02D45162FA8F1D6BBC55DAEB5E546669750ED48629297C3DD214059560070C1E42605A2F6DFB5C8ECE1C0C852E5A4A8CC0E0849B8D7CEB7F38E479AE2B1AA5E1C194B0C468695076E5E3A87B50F9EEB658CB5CCB43D14CF1E24BA560A92A6D457224CCF1446DF0DE7FB23D98563D73D18A90485FCB504382FA16AF879B45D329CC2711216A7E29401B331706FEFED1006BB78ED1F2C6574547AF330A6CA2950B67EA816EA92A4BA14DF081DE6C27A72F7E2771DF05B2D44F9589978290A54D515294654B7D2E4A5DEA48E62D48E98BF88D98E1B06A9285CD010801202D4D404559BCB4D0475D352EA97DD5BA0E60E5754BCE975E754A502B2B595192499DC9373EA39F77EC7F6364E4B82EEE5C84A4290DFB40B03A369CF5AEA1B926699EE63DA1C5099890B3C0B3C04B9D5F4B5BEC08D23B4DDA8E75A5EB5CACD3B995569FCD69D1097A95E741A80B4C2B88B6B483C0098924FA1DE9FDA8F85F27B4B8BEE276192B97316428AA58500E402E0A483726FF0066BE7663B5B98E46B9264159092976590CC41D19C035F28856A2ED63567696ED2D0EB3D4B98666CE9F53C72FFACBEFAD3FE6BC6F405B847BC9DE23A62FDD8EF82992F6170FDF60B0B25733149056A42128293A12007353AD9A8D171EDEF6EF34CEF05874954C502901438891A0E7737D2FA562BCA9D40FE459A65998E4B5AEB2F30E38B62A10E2C2DA5248B8F103722C7A581B62E0AEC761F1384C56131081313884291C2A0084F102050D3534A0D2D669D809F332E13B1330702D4CA36492589E553FCD8D1F75576A9ABBB412A6B5A6ADCC337A4A06826969EA6A1F5A112DC0094A9C2081C291EEF2C503B27F0872FEC763B19330F879481984C75704A4A48724D4015FDCF5D9F58B2E69DB1C7E2E6A10A2B28413C2EA2CD57AB9E60DB4D2B0DBA7FB70ED3322D34AD3997EB0CCA8B4E5225F65BCBDA7DD0D38D3E56140A43804428D883BE2C78DF81D90E3B33C3E3A661244DC4718985664A38A9C2AAAAA46C6B5A42A736C5E2E5A13DF2D0966238942A7714A5ED7E45E29276B87091C6E77AEBEB74D4F12B88B8E3A5C2B3B1278953EFDE71DA26E5B2B2CCA1196CA940C8549324200040053C26C0EEF42F6B34426264CD97884CD1338940951AB12407605FEEDBF3B353DAF76A54BA75CD08D6B3CD1DD38FB62687EB6F25969B47F34A0254F0042CC8B00224918F3F49FE9D322476865F69132E4CB9C7102795F7238828A8170581A1B6BA691D4FB239EE2F31C0CEC2E227AD12D29290952CB0670CEFD0FA91AC55D97E635EE553D9A503D5394D530E05A2B29EA9D69D6561478969536B428971424C2A6E649C768EDDFC3FC0F6970795E5D8C28C4A70C9084A972D2414B2284104580F3DE29598CDC564B9909D869CB525530FC892415392FF303A383E1B34596D7B5EF6FDA7285DC928BB50CF5BA1E014ED527D62A57DE34B942C77A5E253C2826FCEFEEE57DA2FE9DFB213A660572B29C112E0AD430F29C905372106B4D4E84C751C176C33395839404C5AFE573F39245050172FD473888E53DBA7695A1AAB37CD74AEBECEB2CCE75496959C569ABAAAA55616E40E24ADF3C3C016A48BCEDE98B2627E09F63F0323087FD1B09356809242A44B64D059D3BF4AF844BE13B7D987E8F1038E602A490071177A8FAE9A6A6B117D41A9EAB52D43F9CEAB7DCCFAAAAF8559966AF3CA4D4D5A80F0124953814D936214622C462E384C8F2DC9300A9383C049932B807CA89684866A8094A40028C4806BEBCCC769B34399098274D333BDE2EEBE6660A7AA8D2D5AF41A448342FB40769FD9636F27B25D5B9DE421B5346980CC6B1E69238A5CFE53CFF00040BC023CAD8A64FF86BD95ED9A7128C7E45835CC50204C99265A8B977214A43F3A9BD6BAF4CC4FC40C68C3C896B9EB432085312402C1A81C1D9EDF7996BAF6BEF6A7ED1A84651AC7B64CDEA74F3C80D869B0B614C881C485165D4B8E0717E12A3B5ED6C73EC37F4A1D99C2667FAC9383C2B77817C2244B00317350351E075BC452BB7388C4A529257C697A959215B720DA0D49A5E3AE55D4AFB4A7731ABAB71DA9E24ADBAA71D53EE38A599597256B52CAF97193C3336838F487677B3780EC9E5DFA6CBB0C894020256109E00AE1D580F17A8AD1ED10B8ACCE6664E272B881A1048B68C6A030E5666ABC4B3477693AB3B3DAF567DA1752D6696CF5F6C8AF4D1ADD6FBEE0414B454A42DB49F092773B9F29A4769BE1764BF12153139A61249AB1EF65A5770C28A05F97D350FB25CEA764AA3DCAC94A8FCA453AFD5BD2D0CFA9BB4AD6DDA356B59AF68F9F57EA4CC925EFE1AE555438A2C820A5CE02A717C05405CDA6DE470C3B29F0B724F845881FE998594B18958E2084252031352C1A8ED4E82D0BE79DA4C56629497514268B3C4494BB0B7D5BC636E94ED33B4DECE686BDBECFF0055E63A4559CB8D2B325D13EE95560A75CB417DDB8829E00624F5B7385BE27FC25CA3E24A7073F192A415243A44C968594BB1A150A3F215F5898ECFF693FD3B018A40593DE2181763622CFBF9DA36679A9F3ED6F9A576A0D5B9C556A5CD4B6C8CC6A6B2A1C2B57F2C210525C7167ECD884CF520EF8DBB15F09B03D85C3AB09829E89689C9632E5CB084B005D82193635A728A5CA5E2F1B33118C33152C05A9481C4FC45CB6B46A3D35B6D38ECDBDA27B6CEC7D8699ECA35DE67A5B2A60AD4DD0B0FBAED3A5C512AB32A7782EE19FB20199E6629DDB7F813D98ED8AD788C5E59869D393C44CC5CA4151513772924D75BD2B6ADFBB11F11B1B904D9B82C4A55312BF941366B5D8BB8A7A5ECE7AE7DACBB7CED8A94E51DADF69B9D6A1FE2922A285A7EA32E4308A732DA4AE95E42561D4813D3AC99315D88FE99FB33839A56BCB70C9EE8828224202878B39F7766893ED0F6867E67C5364932CADC800D01FF0026E47211D79A9CCF2D06BA99346E51B34FC011C6F2EA14E71FDA59714789449F11BA8DE099938F42E1BE1865F95E1E5CC91C3DDCA1F227858D00A017A352C34B4727C7E0B187172A6AA615AE693C40D804B6B6FB0D8986AA253ED24D45112A6DC50214A3050526410150A9E7D248F73AC4ABBFCBB1197CC4912D52D52FA8208B1D34F037AC4FC932A470778A4A66242788022B6D8E9D5ECC77B799EDC7B60469F6F43653AE7356B260DAD2BCA9350F374FDD9F1B8982F25B3226C419F2DB1E6FC2FC0CC8979F9CE152B0FDF77E66059948E3078B8BF71F9BE96B35AED83CEA52705350270AA18004D4D59C3DBD8058456B4E8A377EB05552B156B5713882B594A9C995AA4909F12A547D63963B2E7787949C261B2B92014A502529A80064A45052C00D3A544727CCF118B56350B12C2A49987E7A1FEED989A9B5ACFCA2DCCA3B77ED9748E937F4A69BED0732CB34CB882CA7256DC7154E50E921C484F7A1290A2A26C800CFC38FE7FF000772AFF51C366430B865CF52F8CCDEE659980B823E729E22D472F5B728EB595670A95932E5A9652F29B85C80696634F1F48A997589A4A751CCFF00CC562D4E3CB741BADC7945C52894F52B24FBCC0DF1D672D9672AC36170E80C1090030D801BEDD1E968E42A44CC4663326C90425535CA49B7CC6C4DDDA837A5A120AF55434C9EE032DA4ABBB571F115C9BCF3116B9E7BF9CB6653D73A5A454FCA34DC375F3E9511379980BC3CB48A900B80795F402D460C4794642A215008B7E5BEC3DE01EBB8C3DECDA3B9918A333E5252E09D686C2C746B5ED588CC04B4852828555AD2BCACC5B9F95995B5504CC72E5B7E1F84F9EE3103DE4C5E2A6853F0F116F07E41FECFD0C6B98E1857853C54E54F2F7CAD0EAC54A85E6E39C8B18F78F4FD92E3D6212661D4011C377E5FC74D1DC5EB0EAC55A81B2A662DCA39FA4DF7F8E1C4454D90B0E18815F467BD7CBD63B31A83FF0030F9729F3FDF5C5772ACAB109E1FF714DD5EC0023C58BB56F1C87064FCBCF5237BD9FDF8454B9AEFFF00501BFE1FBF23B62EF2329594FEF248BF27D37D7F2748BBE560F9DFC3C0D9B56AD9A2B8CE261572771BF33B7A4795B9DA30DB13964C40A2D887A8D46947F7CF5BC6096A6000B063CECDA06EB5F1115F660B2961D00F8942537BC03B73FC7737387196CA54942C2D7C65ACE76B6B4BDEE1E2D3804898A4BA4900B7A87B3378FD1C44F3B1CD74E7669AB726CED2F2D2AAEA80D5537C6A094A0A92D789174FD9513F64091B49C72EEDC61246213338A5853F1338043814A1D4B57A88BAAA4495E0D49525259140D770E5F7B8B92F5762447BBBD9F6BC0E06B32CAEB52BCA6AE9D872A11C21E6EA389A056DC2B885D4549909244CEE31E5DCEF2C4712FE4E15851E152404941770411B30B50EF78F3E76CA58C3E216A909EED890C000FC8351CFE34AC535ED49D82A35A6529ED5740E4E9A7AB6997D59BE9DA75A54A76525A0F155B7014F42516DBA623B2ACF335C3ABFD3B178F9AA2974A165D299A935E16FDA3803246F7DE1976471844EFF0076BF3A0A5CD5241AF9FDEB5871F656FA6A3B60F628EC4B24EC374A766CF6754BA42A2B02AA5CCC9144A52AB6B5750B4F74EB6543854A5241BC81320638FF006E3FA61CB3E296738DCFCCBE2C6E2780A94093FB53C3B905C72A0F38F72F60BE2CCBECC65430D310172C20339B33B3537F6E4C770B49FF00E240F69CD7DA86974E649D911454BAF52A12DA73AA5592952925C20A99E4992795AFE7C5F34FE89A46094B64148960924836A126FE941B6F0DF3FF008FABC3A138B4A949134AC896096649203902869B56A23D6CCB7E946EDBB32C8727CCF30D00AA3AB553A5754C8CCD874B8A7109264049038493CAF18E793FFA5BCBA54E992C4E49282C42914046C7463A87A5F78E6B9B7F54D8891296944A293C24385549B6DADC0E61A299ED17DB175FEB9D65A375E55E96FF0039A3D756B651F5E689FF003894A1710009001BC19E587184FE9EB0F830A40C425282188018116FF9023E9CE38ECEFEA5313331C27AE5296EB772A22C6E28CC5B4DA2E36BE93BED716BA5A2CB745B8E14252DA17F5C6E13090904CB7113CE4EFE7784CDBE03E4B800A5290272E6D4B121D89ADEB4F623B1645FD5CCC95874CB9A42025200E2581A731FE0B062D13CFF00F78C76CB45979ACCD74D251E00A4B66B2941822C2C276B0B6D1B6C6051F02B01895BE1F0EA4826CEA557A380F5F3B3E8669FD59AA705844D0285C85E8D4B6BF93BD693CFFE94CED32B5EAACB2A749A99A3A9A6ABA45BBF5D6D40F7ECB8D6E102078B91F23D7177C87FA70913264B5AE5174A90B49E134620EAEF51B8D2D58E4B9E7F5278EC6098133490A0A0C0D3E67BD18B83B1AED1E5CE7FAD2B97FC56A2B1A5533B9AD53F54A417F8E3BC79C7AD06DF6EFF00083B63DA3D83EC09CAA4C994A5525A5090E9A06006A4BF3D8EB68E099DFC44958F9CB9B3308959592492D5737A03D6DBC5199DEB069D0950A8E2E2E20B4F111B5AE49826DCF9FC477AC16449290854B414A406FDB5B3863E477BC404ACD70D9B14BE1C21ACFA7FEDD2CF435F18A7B506A469C04A5C22247085189322C41E66D63E51B62D797E4D230DF34B9684ACB5001E069B0FA18939494380848036B742FA3015D5AF58A8F33CE0155DC8E22A27C5B983B8B4FA1E67CA716C912A67CA9324CCE166A3F326C69E874261F224226065241069BD01E777B58E910BCC3356C93E3937BF15ED6E93D39CFB8E27646267A180C228B5D81B55A8DE7CE159396C90414CA1D5A8DCE84EBD1BC221B9A66685442828F8A4CC98F599300733D05AF13382C50278A7617BB240624786C0914DE9A4484AC24B42920A1D542CCDCF46A90DCF4AD6227515C8415149009DC8B4EFE9CC7BFE18B1C8C52267082C4358DACFAB8B9DBC6257825CD480B47101448B81666A7A8E9BC30D4D625704A8929B013D77E7E5D2FF002C4B4AC1A26BA811F3352D517634FAB57C21F485A657CA80C9147FDA080395EA1BC690C4FD741549227A137378DBF641F5C3A392CA9DC2ABA81B9F114F7AEF1212D32D4C4A58D093AF23F7F5D6120A90A0AB9BC5A48B74236F3103F1C18D9A8CA25A4A93C6E0806AFA3E9AE8FB43D4CA3352D2DC70D9BAD4D7670046A55401D2D7F4F5B1B8F761B4BCF70D3C1E342411404B1AD742F4EBFCC2FF00A25CCA4C25540CC0D35AF263E35D4437D655B29E1529E5A0DEE0124817E578063CB68E85EA71689A03106DC2011EF53EB6687B8595330A0894B28B384D1DFF003E957B086F73336F84B6CD42D40FF470290099EB11BF3369EBB61BCCC4E2CA9908330A59A9E9507969B0787ABC389ACA9ACB2352C589A8343420DBEE61B8D0BB592EAA95252824951793C4679804D8EFCBD712381C4255FF00F50099007ED330815DEBF9D4522470D3E5C84B2C150B003A369CBFC5C9C0AE812420D32BBC1027894B00C5E3700C748BFAE36C766794CB0D3319294002C389346E60E85BF9B4384E3E5A50A12D290821D55677AEAD7A873A36E63356599AD78032ECA6AF306D32169650F2BBBE232094212ADFCC72DF618A466BDAACAA43B4F94B4A6FF324003667D8DBEACF11E3159782B5AD6896AD0B713F27D08A0D2ADE12BD3BD9B6BDCF9E4D3657A5F365B8B20049A1A94A2FB4AD6C817E4662FBF2C52E6FC4CC9302A509788912D44D077881BFFDCF47A8A6CCF0CE766523898AF89239368F5F3B5B5EB7F647EC4FED1BA9592EE5FD9E2EB1901254A7F33A7A5EEC2EE0F0BAA4933D22C79E29B9EFF51585C866265CB2311DE71550AE266009A876D9F5BF3868ACD70284ACCCC426514D5296B96347A7D757B18B5322FA373B79CD78467196B7908541505D6D255F08F4EF8EDE5EEC5626FF0054D85980032542EE0A54DE3F2F56B5E1827B4985492EA0A4BE8A29FCB03FE22CCA6FA2AF523A38F3DD7AD50A94077484D132E1FF00571290E72F3E57E830D07F536B72AC1E14CC209E26251C3CEA9AE85EC393B05876B30E1242425059A8429DB91D5EDA58D61DE9FE8AE0820ABB4B440DBFF86A26FBC78EDB9BC09C34C57F5238FC494AA6E5A66105C1E3A83E29E42B082FB53289FDE189DFF173AB46EAAFA2DA9C371FFED6114EA13C08394A55DE1F52E7863AF5E76C43E3BFA94CD019694E0A64B4D4169855C351A70F2AF4DCD7795DA9C3A1DD6140DC7133F5B575AFA6B5FE75F45E6BC4073FC3FAADACE42BEC90D314A1C8DA429C1E42F204DB78C2F23FA93C50E156225AC002EE49F06497F4F4787D23B5387B258053BFCD4F0F3B33EDCE9ED4BF4777B43E996C2E9B224D734EF19EF1BAEA425B0904C96D2B24F15E39C99F2C5CF25FEA37018C5894A05C517C4952589E7C3A837DA8EC224A467B85042C043F25025F5737DF5703778EAA6B6EC6FB44D0150B6F55E4398875054389AA479C4A00B9FE6B2DA926D17E288E918EA7967C70CB25A4292B94870EAF9C135B386241DEB534262770DDA3953662509295710600A9AA2B525BC45FC1E2AA5BE5B5C3CDAC380C354EEB65B24C90788AC03311B89DC62DD84F8AB96E6B294A18847180591C4002FA00E2B436E578773D5331E4F0A824A59CA485B3EC5DFC34D8E9A066C95BA9A761BE3A8BCD37D8481B9872C36BC49F5C472BB55FEA738CA968E1492DC4CDADDC063BDCBFAC269C9E7A921E62B84F11EF1C93CA8FAD9CF8467515AD28B694B85156DF107D909527B90A8E1874001CE213B1F0EC45AEE8E4F3023BE91892B2594521A85BD59FCA1C232AC4489615C4BE136507636A91D2F4D6D5847DF892413277B9927CCC74EBD7094B54E0A6C42485248F995AB6CFD3CF5A5779721082954C4F1105C3D811C9A8FE7E158E7EB12209558D81262DCFF2FC3125326A26A50090B2072F201B4FAF487188C41527810A5252CCC090C3D3CBF980BE15F68957A927EF18D5D2400500B6E7F888D12824B82C6B6045FC63732F4C80600B6FB03BC08B72DB029408AA016B57FC5BDB465482AA1538B5BAE9D7DD21636F264C44DA4733F2B72F5B7963744E280C9A0B30342D4AB01E3184CAE0FDA5B5760EF1BFBF09E1BEF78FD8936EB1F2B37514051213525F66A79746D21708E200AABB121DFC1E961F6852DD4A6D06D17DE4738FBBCE7973C63BCE41C73F6D4FAC379B2900314860FB33574BEB6878CBEA412B24DAD37F75B616E971CF960331F4F5FE222E749410484802A6C36FADEAD7F08EDB6A0040701045BF3C31CB7304BA7FDB2FA579BFA3F378F3BE0813C15616661576D74F22D78A97340544F0DE27693D3A6DF2C5AA5E6A5293C2082756FF001A37BAC5E72C07C68E3A83CC7DE2B8CE5278556379E477822FEFF909279989C7672B03F6B9666DFA9D41BEDE16B9E0DE83D1EE29AE971E7B08AC734596EA29D441E0495950E5E11B73DF973F7C028E5D98AA695F10201DFC81D18EF4A79C5D3286A92C188B8DEFCADA9E95B98655D7AD550FD7107BA2A40A640994A93092A02D1E200ED1067152ED203384CB9A1E571B51E2EC84F1C9E009A81F317A105F6E434B691EA87B17F6AD539AE96AED10F362B73FA1EE0D0075F08516D6B538EAC15595DD340280327C3000918E059E610A662D4B5129413C619DCA8B245011AD0ED1C7FB6F9605A953254BFF006A603C079A5B8DC1A8A83B69B47A5DA2B519C9DD65D72BCE6B475414D66C1D6781B6A41406FB95CA48BA91294C18E2DAE68F98658713254152FBB5A6B2A60357049D1B50E4127504B472CC0A97976238D880F50E5AFE43C3C63A43EDADECD20297DAAF674B41A0AF4AAA33BC9A9A9D24502909096C95004AC3CAE25C25238660ED8E87F0A73F4489F3F29CD4044F96129C34F5B0FD55092364F7618126A6E23AEE4D9C4A9D2901DDD8104FEDDDC1F3371E05A3ABFEC4344731EDD326555708144E540A9429B0A054195252786265244D872F5C4C7C40C6CA380C47E9CA44DA061C24873A91B8A3BF8C3BED14AC3FE88CE511C2A4121D80703CEB4B5483A08FA26A3AE6695960B550AA86D68285A12DA95C240E14400098D87B8EDB63CB39B058E352A50410494A9C55EA4FD7634AEB1E54CFB339471CB94140A7BC29E170D73B694F26DC9892643A5DDAAA866BAB6A0B742B2E29E6DC470020FD910A20F316F973C73CC51C4AD6A329454F4F94BB7BAD4EDA5A3599230DFA633BE57E1A3B6DAEDD75AECF120CCF55E95D2A834B42DB4ED50078DDE107855CB84949111CC1E9230861F23CC33450E2428F0961720FF8F2D4F3A34F993B153552E44D52425458A7C7A7954DF48A0F57F6A4CD5171BA8AD524F8821B4A484EFB5845AC49881BF91E89D9FEC7CD94A4999873421DC3BDA963BF8C38919762D5533D570EE4DA806B715A39AE9143E79ACEA56C3ECAEB514A1EF152AFBB42CAF80F12BA14C6D7371EB8EC99476792908030BC4A02AC198598EFA6BD280C4FE172013402B9D5531A834AB5A87DD0C75E750EBACD16FD7BF515EAA86698B68427842678FC2600D87BA062EB23245CA4251264103CD893ADA874E4EE3533527B2D216C14B0A70EE69B1621EBE3D62AACFB53BA1C4968948209510A241E200FBB7F2F7462DD90F673118824CE2A961E9C5B6B41AD830E6FC9599934BCBD8CA214FB537A0BE962DB83CABECC351BAE182BEA6EAF5226E2C0F95E2D8BE60FB3699443CCE2F02C7C2DBFF0D573250490C1B42CE6EFD6C4D76A5E910DADCDD6E470B920C830AE978DEC7E43C862DB84CBE54A041097A0A8BDB7BFE7C62730F24380C5A95B3EE3DF5D5E2235F98BE6DC6522F2662C3CB909F3E76224E26E461E426A780780E5B0D89AFD627E4CB40482000534059DABB6E74F1DC4465DCC9C3FD44949224107E22FBCED8713B2CC3E350C3853B148A55B40D6B757EB1208C009A54501ADA6CCD5FC4335557B841324037BEDF3888E9CE7E1ACAECDA10070CD34B86ADFABF95442A32E54B7E21A8615DAB6229B5872AD5B055ADC2B009514C4917DE46F7BDCF5C494ACBE6618057116A358380CE19E8D4E96A5A164604B3F091ADAA6BB5ADE81EB085FA9B9922FBCD88E563BC8B79FBB0E06231086F914AF3A6BB73FC3DE1C0C3B1143535F0A0E7A1A68C79B205D5A927C2241BDCC7E22F63373870AC2E1B31923F56B4208144AD41243BEAA21E9A535DDE24B0613294788B6940ECDAF20CDF6D0C6C69398559029E92A1F9B70B2D38EA8F580DA56A3E71F28C44623B3F93212B51C74892054ABBE4D80D7E70283916D5E1D4CC5C8428A52A4BB56C35A5F517FB1898E9FECEF59EA4714C659A77347AA8A929612ED154B485294760B71909BDAE2C23CED48CE3B4390E43C6A939B61A7AA557804D43BEA080B27CD9EACE2194ECCA4CB524AD6025479114205081F9D83DE3B1FA33D823DA6B5829AA8A8D24DE5F93B852A354E56D105A5B55C9EED4B42E40E5636E471C7B35FEA7728C8B10A9070DFA8992CB06248537309203B1673E7584F159E6065CB4893344C24328BB70B36F42FD37D03C76AB4B7D18342E37DE6AAED03F83D43010A7E8D1446A038A31C480B69C8B796F6EA46396F6CBFA9CC776904B9595E58A9281C41644E32D9EA09701EDC9BC62B38EED62A505044C03621890297BBEBF715A76234B7B0C7B3A69A6D0D66D4BFE2CAB4402B57D6A8F8C88BD94A001E7726FF001E653FE26F697304F0A27CDC0F15E6199DE316BB13FE69688299DAB985FBC99C6F70297E8D5D5A8DCDE2F1D37D897635A24B8E696ECC6932E53DC25C79DAD35A1E0DC701087D2BE1E1E805EF388239FF006967A97FA9CF66E212A6F9423848FF00C4DCE9CB486533B461638904855C7CDE7AE8DD7D4C58ADE6EBCB1B0C65596E5542DA4404A72AA25280116E3EE38BD6FD245F1018ACAE7E366F7B3313882B26FDF4C0097B9653005C0B5F5BB207B4734D02CD5C1D7E9D46A2352B35CCEA7C4FAD3FE90C3696072990D848239C11E58565E117824A93889A663B7EF256D5A312FB8B7E62BF9AE753D750B21C9700967028F5D2A77F368D2A7EA957E37D20C41EF17CB7E7EB6EBBE1C24E1D54E140F2FC52FE3E110A3339E47EF556ACE58BFB0EF189A779D952DE748039B8B813D25437F9ED6C3D96990406425B56001E868EF7E9A5A31FEA9882ED315E2F4F33F6869A969D6C9875C302DFCC549173D7D3E7E787C89120904048D9C0DABB7BF53FD4E79A7117143534E8FC9FD3AC3154BC040A975D41FE8BAC91783B137E5EB1698385D381C2CCAA9085686836E4FBFD615959A620280E3350C2A59F5D77E5A5EB0D8E54BE3FF97CC9F644DBFE27431CFEE9C67FD270CA344A48D030B9F3FE6FC83E4669884D96A0372496BF3FF3053E619E33C6E0CE9C5017871B2B00F48595020F39C2BFE888A04A824AA80A5203D2EE08E5F6112387CE31003898ADB5BDADEBD6DAC6AADD4A9CDA9D596EA2C872ECFE81D05B794ED1D2B2BE056F0BEE4AE483BA4838513D9854A2A5C9C64C96B50A1E252803D38A97B35EB1252F3EC48293DE2C503976A35598B8F27A523AFBDA07B24FB3376A34AE53D16408D199ED5059773D6DDA9A914AEAEE1429414B6A9262DB74DB1B6165F68F245CCC4A272F1C5052A912BBCEEC283BA83BD29A11BD8C5FFB2DDAD9786501899C4059657117E837EB56D63CC6EDAFD81FB44EC9456661A5595768FA71216EA33AA608A27A9DB00A84D224A9E547D93693C338EE1D90F89E8C5A256071F2460F14964AC2D4286CE16400697A86A08EC9957697018A530527829C21C11CDDBCDBA523CF9AA7336A5AEAACBF36A3768DDA359406DE694D380DC292AE24851E1B8F10EB78C77CC9BB43230C12B13C6202C0243BD1AD42DE3E517644FC3622524A4A4F10B023A585CF854D79469EFD179880379B7A13C8FF00B6F8B81C761339960238252D983303B3E84B9EB4BC4163B0E2BC15B503F5BB36BE1A93A6C53E821245C1D8F5B5C5BA1DE074DB9C4FE8E76114F31F8093C24B904540D0B7E5F788C1294160A9F57A31A386234D1A30EF93FB9FCB193300A91EBFC42BC0373E9F88DCD3DF6B87CB9FE630779CBD7F883806E7D3F10B1B789F23B1FC2D1F3FD70779CBD7F883BB1B98C9EA854A60FC083F1B5FF1E671A2E630AD01E62BD76FE6374C9777A0D1DDFEA3DEFA728A93C8DBEEF740DFAC1BE11131C5C3D039B5EC694D07DED09CD906AC016A74DF7776E7B0877A0AA502A8369111E51BDB73BF2F2C678EA694A372DF4AC45CD90E750350C0D3EA7C34BC77CF51E5EB71C5051932AF0404F3200046F7FDED8432B12183292C19EA090F570FD3D63CC9817E2041A0D2F4B963420877F2A4545A859772E085200A5EF42A54921F2E70FA4F0C6D1F9E2DF839586C43844C042400414B33DAE35B6DE517DCB9822C1880C7AF2F2ADEF152672FD528A8877BD1CFC011689E83CB7F5DB18C5E512149078D2C7567B9DDF5736FF371C194B25CF2DC8A91F7E6CF6B456F9A07090A75239806C67AEDB7A7A4DB7849B21182A022AEC436AF7B74FA1BC5C32F21201497E4C777E57AED5884D70001B08DE3901FEF73CA715FC7244E428F0D4824017A1B791F0A6D175C11331043162C1B660FE15F758977649AF33CECFF005EE459FE56FA99629EA52DD692B012A6DF5A5BF182608095288F7F4C735CE32B528F1000A49571029D85C93B35CF8436CD728958AC0E213351C5340FF60B1F95CFCD4A03AD76018C7BED91EAAA6CDB2ECB731A65A2A29336A661C438D11C3DE25B4174786D3DE133D31CEF1D8732C2A581F32497B549B7A5ECE2F1C073FCA15855AC80C1CB162373E9CDDDB58B9F24AFA4A9A07B25CDD947F0ACE98729EA9D7877A965250A42086D5C533C53E1162271CEB3ECDC6553A44E49289D20A8A568F96F7729BBF32D70221F2699311315FEE94A4104F83DABA1D1C6D1D4EEC5FD9A33FECFBDAC296AB4A65CEE69A1F3172B2A1CAD282C329EF2956BDD60D92E2C8104440DA6D50CE7E2262716854B2E02B84125454DC2AF3AFAED61161CFB389588CB061D5891DECA4A8218D55C40BDB6A7531EBE64793653A529EA5FACAA6DDAC078D146B4825854CC49242A77988B4EDB55B179C62335526570144920052AE5541E219ABAF8011E67CCB2B2BC72A709DC40ADEAE3FB9C6AE06A01BD05E23F9F6B5ACCE10F34BE1629590784A385B1C2245B8426F6F5117D8E25328CA6520FCB24952AA5C955FF00F559DFA56D589718713B0DDCF7CC4A48DB403536DF4E44B375A7546B1656FA99A373BC5D39525DF119BED249BF2F2B7588EB1D9EC9A58964AE5A52E450A406F120120FF8E6CB2CC84C99B316495125C5BA915A7BD6F1486A0D50A056A2A04DFA488E62DE9E98E8784C0E1E4814492350D635A90187E6AFBCCAF00A4B324834AB1F2E75714BB549D6A1CEF527D65B2B5BE5A53615C12779F2E5B01F0C5A72F12D3312132854B6E5AFD0EFBF898504AC4A0060AA52943F47AD87561147E6DAA1E53EB6CFF310A2249D94394DAF07998EBD063A265987C34D4874A5058559EBB917AE95A3738591331628EA013A69FE0DB6ADDA2279C67C9643243E58EF02B89253C7C7CA24ED1C84CE2CD84CB82D4B200570B70914636D285C1D4D1D856B12983953B140F1254403525C9E6C0D9F666D5E21D579AD1B92A7495F9DD03DC200F5F85A31312F2E5AC072CC5A877E96A6B5DF78969381525884B39A505EDCB4AF97278D556654C920D22E5641E23C53C3D01067AFDD322D8772B2F41238E604116255FCB8E571B077893958650E1E305AE094B38B0667FBD9C07BB1D43F5AB9716F828BCA2104C45C5AF7F41720F39C2BFA1C3BB1C5A470FF00DC001B33A8EDA8A57568934F0A40484B1FF95459C825E95BEA46E2195758B0A8A5A4A82B9873BB65D7E49D884A52A22FD3A6DCB0B7EBF23CA10AFD66632934FEF58727C4D39FF989EC0A4A05D04914248F3A9D43FF00910FB94697D5BAA1D45365390E6B5EEB842508FE1B54CA5449B7F30B010073927E57C41E3BE21766B02852A5E658770FF2F7A8A9E4EA716F52D0EE6E265CA6134A43E80A4DBA758BAF4EFB1DFB456A250FE13A25CA3A77F83BD79EAA6124A55B1097824A60192239DF96396E7DF1FB26CB57C266226F0F170942F8830AFF00692396B7B3C68730C1A038989516622CDCAA3AFE2B1DA1D19F45CEBECD908ADD65AA5BD3E084A9D6BB962A7867ED0FE5BA0DAE3913CA39F3BC6FF565270C95FE9307FA8526C97297BD1CA5B415BDBC5BCCCD7082C108AB12EEEF6A55B7B45FDA73E8DFEC8723528EA8D53FE27523861A148FD206787EDA7890BF1F19040998F8E395F68BFA9CCF7B41C49C3E5F3B0411FB4A2612EE4D7E516E6C0F48AC66FDA456087FF293434CBD02883E20FA5FC5A3B0DA47D9DFD9F340703990E8C65EAE6C828A879C79E0549FEA28792B499B7236C73B9BF127B639B288566B899725414152FE6143A3B83EC86357A64FED1CE9B314B5A895A8D482C36D282DB8BB98B869AA58A64A5A6724CB1B61B1C34E96F2EA442909800CA92C711311751B462117271D8854C9EAC7E20AA6D55C53A6904F205675A9A798863373EC4AC01C67CDEAE343EC55E1CD2FD4D4A78471B083601B529A17E894948827947DD66B338E516989EFC821CA839FFC8824FD81D4C47AF339EA720A8F16B51BB8DB9D3F98D468452294A538A25DDF8D5C5B7BEF37DBCF1A771FADA22477406A05075A026DEED0C311899F32E49376726DABD7C347784AA4324C828F23001E5D0CEFB637FF004DC423F602A6152E453CFED5D79B41326AA951E20BF58E50A4A66556E84CFC24DBF19F2C06662B0F4EE896E4F50C7C793EBD68ACA335C072491AEE082E599BC6B4DE352D6CDE4A63F7E53BFECE105E718B92DFFCBA88AB104F3DB978C39E09859A85AAC01E5A9D2DF88C5A75A4856C7C847E53E9FB8798654ECDD1C53126504EE2EE48B167F1F08CFE9153182FE63573D6B6EBBD9F68D6AA865332073E6246FE40DBE1F761FCBCA59BE634B6E7ECC7CE3539730D0B1D6FD286A7C18BBBDA105454B728BCEFB1E7EEBFC236E987B2F2D20B124333B936AF3D34D7CA31FE9ED7040D75F1753F46F65B9CA84110543C849FDC7CF0F51810CDC64B5F95DB5AF3DF58DBFD39C58685EDE05DFEA7470CF0D954A6D7C3E14922FF003E5B9005FF0008C3D9187E1242AA92E1C6C00BDEFF00687787CB9249A07D8536D7A8F2AD21B1E423FB42444FA5FA81B7E1BE1F22525CB38E8FE546F53F7872701C24961D0D7C3A569F567742B284F100A067748833CF9C7FBFCB798274B0148048AD0D08EB736D9B5E90230C906CCDEF7E9AF386CA85260CC08312204FC23CF7EB783862BCC71F2AA994A34B3134DEC76E9CEF0A09006AFC9BEEF7DA9E570DAF02D34F5624A5229C0E2480257C5B7BF6DA4C9F84BE5988C4E34844F4AA5F17ED7AD06F4A74FA968AEE7388C4E1969FD3F130AB87172294E67EB0647A9730CB4B9581487B2F78143CC54A50F36A6D52850E07828010790B1E9C94CDF03879C8017F22E59E274ABBB248A872962588F1B8BC4F7677B4F8EC3AD1C4B50346049DABD3C5AD1D6FEDE3D913B30EDD32BCC73ED0E8A7CA35EA9A5BCA2DB6509A87402A212DABBB641E104481E7CF09E4DDBACCB24C477338CC9B2414212A249090282DC44B6B5D23BF767BB5EA9C2524ACF0967756D70CCFA53C447833DA4765FAA3B34D4359A5B55D15465CED23EB4BAFB8857054A428A9252A808BA40FB24EE3D71EA2EC56732332972F153316996DC2A282B1F33B16151D08AD6B526BD6B059849C5042E5965AA9C1722D5AB3EF70D4E8212E555138D34C50345A6980A06655C449B9955CC993B9FBB1D4F1B9EC9C721126524112D207159DF9B68D6D77A51DE230E95A8AC91C440E2200A1B587859B972D1C6AEBF21F96233BD2400D416AFF0010DFB8FF00BFFF006FFF0054668708993F2FD318EF08B06F183B8FFBFF00F6FF00319F7C46CA23DDFA6326613704F53FC41DC7FDFF00FB7FFAA39EFF00A92A1F77EFD0E1099340D58ECEED7D1BCF997D614461C382EED7D1DDFAC6F6DEDA0CFA5BCFCC79C1C23DEDFE6F4E9CBD3C79C6B3648014F534F7D7C07850876A2A88E3BEF69FD8B6F06FD6D80CEAB1557A7BB36DAF945CF94CEC1A95F4377DEF4D758F7DB59FB27D26A443B5DA635EB4942C2968CBCD121244EC8EF56B493FDBFA63CBF947C4ECDA44D48C4E1A64A941899A492E05E806EDE7E11E55C0844BE22B0F41C20D385B67BF51D6F1D57D4FEC9BDAC65EA29A3C9139937E28A94D653A83813B28202D453D62FE9B01D3F2DF8BB8698024CD5255F2820829ABEE40BD6C7E916DCB6721012153122F471A8B73DB7A6978EB4EB7EC3FB48C982FEBDA7EAD8E1E204B2D29F802D6EE90A99E9F0E98B02FE26CA29ACE43B3B1983ABDC1FF000E368B860F1B87494954C0C0D9C397AFDC98EB8E75A4751D2A887B29CD94429524E5D569098EA7BA88EB3B615C2F6EB038E5813F152D1A00482DA9B97E9A79C5B7058CC3A923BB5252DFF70735A6AFA68CF4A59EB6CD686B698AC3F4952D116875871B20DADE2408DF9F9CED8B049CE32EC427E4C44B503A710D7C7D9F38BDE498A925B8949B860E0877EBEC79986BC1D70A9A69EEE8929936B292414C90445F698E5CC5A2B369D84282D310EC5CB86E46F4FA3F9C5ED69C2AF0EEA29720FCAC0D1B4A56D7E7AD48F5BBD897B40CC75664343D9C966A2B333D36427EB010B7439F5A73BC400A09527C298FEAEB2236E319EE3F012664D267A0281759E260C1D99CB5A9A39DEB1C4BB7B83C3C997DE808952E6F1F761C1248FDCE2E2A4DC748F63B4776415EFB8C661AB9C34F42D842A9A9140053F61C40F010A4418FB42083E58E19DA8CCB09984F54BC1ABBF525C4C20370F9D08D3D46B1C1262E5CA4620A2684A8711005C8D350DD69AD758EC054578CBE9A8B23D3342C656FD1021CAE86DF754DA882485A815094822CA3BDE6F8A0A32B5A97326CC26622614F025B878384D41A56B7E948E5D98E678C998832D2B581C443B96356B68D5D76DA2B5D4B5685E66A78B8BE3504F7AE952825E21104845922FD2D04C729B4E599710B4B49766B0766E751E773D69B4DC22D720CC2A3C5C2E473DE9A170DCBC22A8D619D56B4C2DAA5580D1042B848063A7AFAF39922F8E9F926024F1A4AE50E2A3063E2EDA534B73310984462BF50996A52B84A83925B5FA1BBD0C75A33DCE99CB96A595CBAF93DECA88BA45AE491E91D6F16C5B71B2C20CA12889628080DBDF7726CFEB58BDCC989CBA52149F9CA920921EB4D48DA8D14CEA4D5C885F0EFE216923A5F96FEBBEF7C5E7B3B9461315C2676252E786854075A936E9E109CACDD2B3F3CBF4AEC28D4D2D41E315257EA1A7AB2454B6F786780212E2A49B5C207BC75F863A748C83072C20CB5C8530A9336586B6EADBD626F0B889136E024D1DDB6AB747D08E7CE34BA2CD337738327CAEBDD5AA424A28EA0DE3707BB20FCC5B91061CCF46558297C5331D2249009ACD411E6547C6C37E526818472192E1BFE3ABF87F9AC3ED0F60DDB16A984E59A6AAEA9498E02F27EABC1C7B7FC54A42E6D244C75938A7665F1532AECC71204E938E4BFF6CD4929035F94A987D5EBA44B613F472C1F9D32FC8B33D81607D88B334FFB047B43EA2527F88E548CBA8D712A35348A294D8981C4156116B138A4637FA95CAB0AB5265C932C870C3896D70F6200E861FAA7E0D80EF25922A15C4915BD9F77BEF17264FF00462E6301CCFF005CA72050E12E205222AFBFE6A00A1CF0F0DC08DF79B629999FF519889EEBC061D734172BF9CA0827F6B710F5AD199E90D66E6928278664C42B87FE991C3F2B9E4EFCBFCC5E5A4FE8FEEC5721EED5A93509D44EA2EB47D5AA69C2C8DC781440980091B75077A2661F1E7B43382C4A91370EA2E1333BE2BE1E60354F2AF5111ABCD81042A7858D8003D6AFF6DC98BFF21F673F678D2602F24ECFD8AB7EDC750ED4BAB00A2784F76EA488277023998DF146CC3B5DDACED3F12B139DCF4A0542424A59E8CE0B9D2A5C44163F3C561DBB952ABA851F1B1DCFF116AE5E9A1C95A14FA7322CA72E69B84A5272EA275691C80716CF17BE7CE462BD88CBB34C414AB119A6216D60264C079D38ABA73110ABED16281A2967672487F115E9AC6E7EBF50BDE27D6CB68FE8EE5965B007A36123A7481B63323033258527F50B98E0385F128EBAA892DAB0FA0AB39DDA0C58F99D55BDDC78339161EEAD8A756E2CF7F993A49DDB8584CF9C1F2DC6D63118789CB4104AA5850ABD03DBF9F462F4664BED062839F9C93677FF003E7FE5400C34900B21C0B175973681209124F2F5E584E6A8E0182240505120808725B5766A79EE7409CAC7CEC7179814CD406BAEE696B59ACF4846E54D2B5E215694C4FF002FBA1FF4F144F51B448E5B61CCAC589A901182295D3E600D6B701836FF00430B842D475009342C6A3504D6B7BBD9C98E59D4540D85875B48200E05752378006C236F96D892460B133EA1250EF46DC3B37BD28CEEEA561C29B8AFE94A917DB97AC3755EA8609FE49092072DB6371CF7F31E98929393A830981FA8DFE81BD29A43D978246ACC4588E953A7A0F188F556A171EE1529E8093065439F493BEC2D6EBCF0B4EC327049F96495BDD8174B741FC36B4108E2B0E89600410A05C11F4A9FCED7A437AF3C8559D4C1DA143F1EB6F31CFCF59730AC809C32EC78810AF070C1EE7EED0CD329CF090E6E77615A57E9FC423775129023BC0799F15C419117F873DAD8949382135819079BA49BBF27F5E51212F0C9201E163D4DBCD872A747844BD50A124AD244990543CB789BF3E57EB87E32394B002A5027FF00450BECCDEA21FCBC1A76FE1F4ABEA39F852139D565327BC03D543AF9903CB95FE1855191CB402112B843D404F2E87AF4F386B8C906511C20D5F9F9381F8DE342F562C890E0F14FF5A7DFBFBA3CBDD8DCE5069C29A0E458DF952BCB4F38E75A07CE3EC6BCAA7F10997AA564FF00C498B18526DCFD0EF8426E533459246C5B6F277A73BD1E3624F0B849AD8ECDCAAEFCBCE12B9A95524F1DCFFA87C7F7F3C31565D8A07F693CB86F7A0A13B59DF94612166BA6B46F3A16FE232A5D46A5F79C6A1023723DDCFDD387584CBB12A727880D4116A9D1BCBADE1D61D6438343BB86D7D3EFE718D467920CA811BC7145E27E516E9D231248C04C961CA4977DF6F06B373A73858CD27FCFE07F88C292BD355DECAD29E1893C5BF900489F5BE362860077640DAA5EDB8FAC26A9AA49AA29CCFB6A59C470FAD2A0A097048DEE0907DC64DF7B5FCF18135083594E2CC53AF3A6BE1AC6AA9E4D58FD7A685CB5FA436BCF30DB0EAAA1D2536F009F1F4FB33B72B4F2C2F2A782A4944BE0BB909F2D3CDFC01895CB72C939A85F7C4258382A67A3B8140C69A42043F963ECCADC2DA018EEC0599336F2F7EC3CF096372D9D8E6505148AF11B167D6A36DBC75847199248C32D4652D2003466A51BC5EFBF8D23625C6A9174CFD2BA685F492BA2524921E832B4A84C7900B917F8B34E130F854AE5CC94261218A88B3B8A52FCE15CB7133B07352CA20021AA6D5D3F3E24D44417B70EC334B7B50690A9A5CC2829F2ED7795D3B8BA0AA6DB4F15529292AF1A9B084494A07DB260911E2DA3E4E3B1BD9F9885C89D31380E225402947B872080C0BA828DB6B5ADDAFB359F70A90A54C09581A970C4070C4800E869B697F9D5ED2F416A2ECD35766BA475150BD4B59963EA6C294DC36EA3895DDA9B5A5210B1C204F0931378B63D07D83EDACBCDC1913480A40002890EA70EF50E3CCF2ABC75BC1E324E2A54B988980F183C4970599C56A5AA79024F9D7DC6A98813D20CFC2671D6C294A4F184929677D199F6DA1FA51C5FB520F808C16E2936B03CC117F81FDFE0D978E9083C2A5805D807D75E7E958C29007EE4B7A75B461DF2FCBE18593392B0E9623707F88C25295164873B545FAC721E5733EFB7DD184E62CAC809E8C2BB6BF56E861712BBB0EB0C0DAA6EDD6BE0F0A5B7AE20F3369DFDE479EDCEDD708A8197520872F7A93CAB0DA601707D2FCFFCE90B98A92926F04C11703CFF000E9EFC69DE23FE43667E7B7AEFE71173504A8EDCDEB4E7E14F03611EEB687EDA28B56E4B4B5F415A52AE04F1D1A5E217C560411C4166E3A7DF38E6399F626461D6102527814FC2B0078B860C29A8ADE3CD998767A74BE2480525248A0B9AEA39EB56D5EB178E49AE334453F7F4CFA815892D38BEF0A78605FBCBDFC85CEE76C51332ECD2A51504A4109B70A5B5DC5C575761B55AAD3B0B8CC3AC8429418B0BD0EB7A1058D37DE1F59ED3F380A087E9289F44C12ED2D2B93E678DB50DAFCFD0F2A8E27239D5265CE26E005AF437007260CDD6C61C49C46310A1C530BD1BFC3FDC0BD4439AF5CE555D4CBA5CD34F64F5497C4718A2A26C343FAA5419FEA9EBBD84E18AF21C793DE495CE90031502A5176EA6940FF589019B62A5283CE551810ED723622BCFCF522B5CDFB3AF67DD66EAF2FCEFB396332AFAC2502A292A1C6C256BB02453A20415036FF66188CEB38C8D4923325CB9693F32141F880E64D2F423AD6AF7CC8BB5BDC00264D2486A9558EB63B8E756E515767DF44BE94D4D5943A8B24CC93A634DBEB53D9865EB4AAA14EB44828405B8E25C4102D298266F84317F16D6B0642E712A0024FCE471102DF9DDF5BC5D95F1144891FEDCE1C481FEDA8A8324EB427E606DCAFA477C7D9F7D9C7B1BF67AA34A342D0D3D5679C094D4D6B85456E38911C443E55B5C0124016C53B1B9B6233E0A016B9724BFCC16544BF315BF372F1C73B5BDB4C4666B9AB99882B5ADC10080070B8700161A3B00FD62F7ADA8AFCDEA1E79E7128503FF00080084A06C0003853B03748F9E236528E440AE72FBD44DB155C80DA924F5276E42397CACC66CC5CCF9C92EE43DEFABFF001D2C18EA1BA868C90EAD5B7F2DB52A40B72067D66230EE5769702A2C6580FF00F73B3F40C352CC35F14CAD255C4B40E2B82456A6FAB730C2B10ECEF2DCD336EE9BA1CADFAB7D1C501495D3DD5612A5800CF9EDEEC4CE03B5584C3AD5C012C59EAF41767E5CBC21533CB049FDA6800AFD056FFCC41ABFB1BED433849527206E8A9553FCE56614EB21276250A58579C73C5830FF001272BC3AC209698080592ABEB5667DB9962F184B03C4940079102D52C34F0D1A22CE7B251CFDC0E6A4D7BFE1F553994308CB855F7FC5F693C6D984949B1379C2B9976FF173C4B396E0063925F8D426897DDD9A8C1DF6687285A6682274DE103F682C767D3F1B58564D967B21F65D4252333CE7FC431F689A77A9B8E05F63691CBFDB11E9EDC768387E4C1AF0AA028A13DF84F47FA862CCCD192890141960B37F6B7D77A0F1B356279967B3CF6099382468C4BCEA88870D53EAE229333C278A2FE93E7B618E23B5FDAF517FF599D2907FB5DEFA163A57CB7AC6FDEA01749D2EE5B67FADFADDE27796697D21A7CA7FC35A6A8A9383ECF1B0D3A44411FF0015B331FBB620330ED06758E97C189CC31334310E16B49AEC42BAD346A88DD38B9A97216435AA4937FF0015E512919B57BC022B6928D086ACC062969D98B00412D213C5B5A648F2C43E0654C26628AE74C2B238B8E6AD5FFF00B288D74617BC4763731C59002669D59A877D4F3ABF23B4267EAAA9D1C2DA96849D82145239DBC307E189232491F384B06350090FFE79C468C6E3CFFF009AB67BBBFBAFF986E4D23EEF117DC70C1044B8A264CF99318CA70A14C18005F4034B53D4185C6231441798A7A52A75D9EAFE8D7D2368A669BFB4A048DA483B6F2663F59C6DFA142A9C219EE40E8297D2947A987099939BF7AAD73CC31D7E8083AE91B05752D28225002F918E533B9EBE62E37185E4E02683FED2481AD2DA6D62C0DF43768590954C204C2549A9AD3A5074D61A6AF39A61242D23EEF94FE53CBA494BCBF1258976D86DE36A5AFE26B0A77097A02C3D3C798A5B41D6182AF5353D3000BA0C93CFA6D173E5D6D6DF129272A5A8025245AADF7EBF4D69019090C421C7476D39EAE59BC223957ABA94FF00E6206F7B731F0E5BCF3DF9E2564E50B15009A6C69E8E29F7B464E1A5A88F9051E8CFF5B7DE9ADE3D57AD92D001B766667C5C899037807DF07D7793939089A1D480A6FF00B45DEA6CFF00CF9C2B2E44A03E54B3D28E35F23E1F5AC46EAF5D1332E024F981703EF9FDDF1292BB3A84B34B48662070F2E9F4F387224814E1B5BC798F1FF26AC4FEB8248F1C8BDA76EB3064CDA67DE30FD1912524809BEC9D69F9F43194A149B06ABDC7E61ADED6E20F8EFCFC5CFDDCC7C2C230F5191BB30B96B379BD6AFE1195778BABD0FDB772D7B6BE02AC559AD9C514F0AC889FEA22F3B7EE63ADF0FE4E412CF1712126C47187FAFBA1D2329413FBEBBD6FB6F0D8E6B47044B86C6F0A3CE23F73D7D0BD4E4328544B40D43247E2AFA53F30B2252410421B9D2BB52F5D77844EEB4709003863AF11D86DB9F8F9DFD554E4B2D364D79240FB31F77D1DA2593FDB4F23EE9AC37AF59AC190B3D278A40F7491BEDBFBF7C2C32996DFB6ECE784D5B4B034A6DD2B0E901496615AD684DB66F7531A15AB7BDB29DDB621506FEA47EF95F1B272C4A5DD001E97F21E479C273A5098C0A5C8D4E9C98B7D630FF13A3FE72BFEB1F9E37FF4E47FC47FE3FC421FA51FF11E9FFF0014649D581BFB2E154EF2A063E78D55964B3FD96D923EE3DFD33FA61B0B35403B6E746A465FE3157F7FCC634FF4A957EEEBBF0A7F119FD3E8C1B664FE63735AA43C4953844742448F71F9FBB1B0CAD228897E694DB5D3A437992BBB366E8CC3DF5610B11A89B3092E18F27279CF33F0F3C68BCB4D7FDB05A96B1E8072D0C26505AD4F03E90A46A244801C2044471013D363CBC81DEFBE1BAF2A0C78A58DEC34BB346BC25DDAF7706B4FA78690BD8D428FF9A4C46EA3B73B49F2F293E986D332A4176403425B8454F887376D3EF0265077E1A1E8FCEF57A5DE168CF1A72C482636DC1F98D8FE7E8DCE5A949FD95BD874B1A7807D79C6C999364D251297BB38A3FF0027FC085CC668C9220A2368205BCF632447ECEC9AB06A0EC2FB69B3D7ED5D1A144AE6ADF896FE0F777A9A9AEF7FA2A7ABA99D085B8A03BBFB306DE2E824903AED88CC5617852410EE0D5BE85B96AF6B6B0EE5CA4B8243AA846AED434D9ECF53E149365999E694291539324A82E0385253C410601B9BC44FAF5EB4DCC6429414921D2F620B7277D798B51A25254D9929B814436D4F67AC7567DB77B00A5ED4BB305EB6D394AD3BABF4BB2E5454B4C3294BCF0755FCC2E148057C2DA55048558408B636ECD664BCB3324238FBA4A96912D4E594010E341C83FE5BAB762731981610B52969510169528B125D88B90C6B71E0F1F3DEDF7C9CD169A9416EA90E3AD34D2814F0AA9CA90F02081B7091E21D0EF8F67E419B4BC5E5492A292A54A0D624D00249A55C53CAC63BCE1132C278480A5000AAA0B712411A36BCF4A4697EA454D5BF503C285C252208129B1811D762371BEC3140CD6562958CE296A57095D6A433B5AB6B0D00E909E290002430B0FBFBF5A911C71A7AFC8E2D7830B97853C6493C22BAD479577357A437C2F0AA635C3816DCD79D6B5D7AC1C49EBFBFDFC79616CAF1697982656B47D2FEB41B810F33340084100301BF2DBAD86BAEF0718DC18F49B7FB7AFC70E715884ADF84B372BD6CF67A723CE2118867DB6BF383BCB8857A933CB6DF104A2B33388289ADF66E4F50631C2083405AE453F98BEF4CEBFCDF43E794F9965D50E9485A78A88295DDF0D81BCF01B5F613E9389CCCA4CD4A54264B2DCDE9A333756AF955AB79A64B214E90122E5D87873771AB063A47A3FD9AF6B949AC680D577E18AC69B6BEB6C71EC4A61302449317E104C11D714FC523052810B2902A5891426A5C92FAB5FA54C72ACE32B420AFE502EC58E976D2A03FF88B92975032FF000B3DF1EF098060CA89DAD33F0B9C432E6E5C16489B24DE84A74A015D7F8AD6B41C609525441205D9B715BD06DADCD9EF6EE83ECAB5B768350EB793E5B50FE54D29BFE2754B96830DAC8285202C02E710E48E5638E73DBAED8651934B95204C947133828042784BF0817297E17D373D5A2BB8D5A964996E529BDEFCB566D0135AB011DD2D15D90E98ECEDB64D251AB34CE4F0F1B6F36E0097089238DD053B93B1B45BCBCFD9BE69333C33A825243F090A492A0C492CF4E76356880C4E65370CC10B50A907ABEA4034FCEB511720D1FA973CA74BB9850A68287861084D6B6070931F612B498883613BE3974EC1E18E294938898A585314894B22EFFBAD4E6CEDE4C27768319C247129B60AA6D6F13E8C740859ECF74CE5CE17559BFD55D0656D80B724F31C5C5CAF7DB7C59F058F9F94200448336591FB94B09B5CD7DF48623113712A75AD4E6ACE6BB8B6FCEBBC3A21DD1F9780DAB2B39D2C1FF8A2A1CA5EEE01B9008E3E2F88F4C6313FABED08025E23BA425DD213C44BE875A31E5E4D0E01EE482C41362E4F56A1F62140D434ACC8CAF276E8F7E12B58A883E7C6923E0394E3597D9D9B29242E6289D4915BB3D01F7A1BC67BF528D15E0DCF701FCA13BFA8733AEF0D656B14FC00865A6E89A05C9B1054840222DB98F538DD1912A5926592CAFDC5CB6F625FC9A3638936770391FB8A35A181F4E60F2A4D33CA6C99EF9352A02277EEC1F7F4F33857FD3141642940A8EBC21D853C8F5DA35EFD4C3E7A3D8D6DD6ADA7F9AEC66899701EF2A94542E5050A3C3D07113B5AE7975C4A6193370547252451AD4B9676A1D7913A43895378C92E5F4FA1DA9A7DAA615A72DA350BBC1405B927DD333F9728C3BFD54D5DB88B9A72A59890799858924B98E54DD2D00965C4A4B932080EC91B1B931FEF8D485CF0CA4A8105810E2EDA5AB5AF2B883894050B35BDDFD61AEA734A76E4ADD4C83C92904F98E1FBA2270A0C02D5429241D473B56CFADBC633C4ADFE90CEE6754A248524C03BAA260F9FA8DEDD2C2F2585CB5612921041D0B3D4F2A57F31812C4CA6A2D6D8D1CE90CF55AB69A9F9A401207881E66768998B7A5BAE256564EB99520925BFB4DFEBCBEB1B230FC26A1F6A8007853CEBBED11BABD74DABFE1B89404CCC280BF2267EFF00C0E2464E44416E124DC534D74BF91D21D4BC3D89A1602C5C9F7B6F4D622398F682B6C2A1D49DFF00AC1BF9F8BE44FC70F9390AD80EECBF215BF4AFD0E94687430C4A696D5F9D59BEA2B10DCC3B45714524BC00122EA03F1BEDD207BF161CB7B3A560BCB714041B8D057EBF6A8877230E5AC69A569EF96BB0BC56B3B4274CFF003C1B5C718B8E5CC1D8FBF13F2FB3290C020B3EC69C85EBE7BD9A1D7E9940174D2847A3B1BDFCF61AC6730D74EBDC20BC07093B2D27AD890445C72B5AC31212BB38D5087DC375D5B5BF846BFA6511FB5B4A9B79D2CFE0F117ABD66F4121E1EE5811B473EBF2F762491D9DA0FF006DCEB415BB3D3DED5739FD312E025FA9BBB8E9D3A8A9BC323FADD4D59C701076F18E80CEFE5BF2B7962570BD9F24370330B30F64756E75610A230AA0FF00280D7D19ED5F77861ABD7727C2E5AF238A47CFA7CBA8C49272229BA7A52956AF8B74610A8C3916FB7E7F9E70D0AD7624CAEFE6A03E127FDB9E1C232276250EDA37E038AD7EF19EE0A86A474B5C6FD6F081ED729BC3969DB8A62FCEE7F2DBD70F139250108236A7F07EB1A8C31146D5EAD7D45C53EBB504379D6E924852F6E7C5E7D247C7D30EA5E48E920A59D8BB6CDEBE5AB88DFB824BB12CECCDAF8EC368D0AD689932A9F5503F8FE1F0C384E4D5B59DD9F4BE83EBE70E65618809171B31153CCF975E621139AD1004057583C561F3F7EDD05A7191947201D9C37A5479D7C61CA70E77E800000DFEDAEB7842E6B34816548DCC1FD7CB01CA3E604A75676F1760FB9A9A51E9ABC9720A52294D69E22AEFCE91A0EAB2F9F02E387FD43F3B45EF323A8C64E535A203176A7D69AB56FB18D2761EE5B85EF47D2F7F1F516783FC48EFFCCFFF00DBFF00DF8C7FA47FD89F2FE21B771FF7FF00EDFF00EA8DECEAA2D1571B9BC478F8BE65780E51FF006A4780FBA4C67F4E7424F8375DF979F9EFFF001827FE60F889F778BEF23DF8C7FA3F21FF008A7D7E5FA03E107E9D85490741BFA46D6F54A9E0781C1E189850E768B98FDEF8C8CA7874A3DC8481E845FCFEC9AB0E4E8EDCF7E9E1710B1BD46E5817418F303EE36F79DB91C6ABCB05004B3BBB5AAFBDEE1CEA4D18C2470E496143AEDE2FBC2D6B50B8AB9581111E2927E6267DDCF0D26654521F87992C3EAC2DCDEF194E18B12407D28C79BB17FAC3A53E7EB1B391CCDC193D37F38B461A9CA8104B709DCA5F9D01AB6B5D89D2038751B06F33E9EFF0FD459E2D6482E4111CC5847AF4F8729B623F17960FEDB1D5ADBF43EADB420BC3312141C9361F663AEBD4C3EB19CAC443827D45EF1BCD8DFDF798C33565E59CA496A0A5FEBB3D7D4C604B22C9DB63B0F2B44932BCC52FAF8AA163BA6E244EF3B6D24C6E0EFB79E2171D97F08F950E482CCFE24BD36D3CEF0B252DB82E1CED5E741E9BD22CFC8335A8A358718521748A0016E526124729BEE79F3988C5231F8104A93C3BDC5413A1F1FADE1CB52F6DEE7A7DE2DCD26ACB975754BCC1097B2ACD695FA6AEA75A789BFE732B65B24104594B9102058CE39BF6851330CB42652CCA58585058151C2A04B6B5142CD422F16FECC6293879C1CB391AEBD1EBCFCAF48F9CEF6DCEC453D8FF006BB9B53E5AD1672ECD2A955793A82785B525D1F58A80826CAB2C8DE4131CA31E81F87DDA6188C261E5A965CA02189B94809FA82DA72B3FA03B3D8BEF25D54486A9357A5013A0157D7C0C74D2ABBB052EB3096DCE5FEA480164CDEEA9FC31DA6465C8C4A5331828DC1AD1EBE66C7A686B162C47CE9048A1BD7A75F01F50212F193CC7CBF76C2799A46164100B508352C4D19EEF6FB5A1BE192CB1460487B59EB7B35FC290059E4418F43E938AB60712A4AD556726AFF4EBE3614A43DC6A3890973A58E9CBCFEC39C1C6AEBF218915CD2A04855DA94FC6DA188CEE81BD4E94F6F1A9D5AAC449F203FDFE7F942492AE249507BDADB7F93A36CD1B265814BFA790DDF6FCC7A3BA43D897DA2F5C86BEA1D9DBACD2B9C3158FD630D2824C1E3EEDE0950B72DEF1CF109DACF8C391484CC42E6A105415C251F3B535E10DEEBABF38C7769704B92172B12998B1747ED3714E22DAD4D6B66B4771FB2EFA323B56CA2A9399EA1D78747210A6D6AA3144CD726A4020A9254DAE121039911D31E74CF7E22FEBE6CC565B8A54C492A74F094D9C8A96176F66B4ACEBB4B97CCC32E5CDC083359A54D137F6124B9617A373DCC7A1DA23D973B3BC89348F6A0CF3FC499951F0127EAEED2071698B424C47879881C81C732C7F6AB39985412A9A82EAA85135362C08D34F0D8C714CD7321C4A505F0D4B03B6D4D816F2B477032AD5941A7B2EA6CA74F640CE554F4E8E053A82859AA000092AF00360247112761E58A2E2E566799E2A6623173A64D248E10AE2F92F6AF47635110F85C72269520AC5ADBBD1BC3D2B4763086BF546655AA2A4B08926CA0DA02B9DE4241B75B5E7CC99BCBF0F2E401DF715AAEAB378FF0098658C099AA50490E2E68C3A6CCC7576A924C372179A66055F5879E42531C0038B00850B82124585BACFBC1C4DA27E0A50FF006D12B88B392949B5AAA07DEA62115825153BBD4B1A7A6C6DA7D6323953847896A51B9924998247351FD7717C41E6D2D58B1FED6D460D76DB5D6C2BD0C4AE1308997C2A533E808E76A6AFBC6D6B23EF02C13B478BD7900227F0C23914B9B9671778E78F7D2A4B6B776F3AE85C6324215C212CEC4B0E5CFF000DF58548C992D7DA337DCCCFEE3F199C58558EE2B067E8C3ABB3F85B48622411CB7D7EA60759669C02549E7731F2263AC1D87C30267297706BCD81FB7E203294081777DBF3FC6F081DCC1A6C11C4205809B5A7CE3A5BF495912B8FFB59DF57D7AFE2F18187481F352DA93D69E7E9CD9ADFCF295B1E25A0127910368F537BF3BE1E4AC04C9A3E54BA74E4EF57E5B887985C3BD402DA1AD6FCED5FA54C45331D494C0C77C241BC28DF9DB90FDDC9DA4E464AB5172953D1836BCF7A57E9A43A1865392E4826819BEE0EBB9FB443AB75AB742210F7171CCCAC9022D6931E640E9EB89CC3F678AC0FF6D8EED7DF4B8F2DAD1B0C22B899ED5B73D75B369BF2787E65DA1A47178C738B83CBF5E7CE713B85ECD129629A1E5BB9ABF41F5AD2344E14872493A746D9CF336A6C0C40733ED0B6876082AD97122D0441E5F3E66F89AC07674A685048E8F6DC6DD2876A43BC361CB9E77A5697F434A75BC436BBB41324F79BFF00ACDCFBC4C723FB8B0E1FB3A354576E1EA3969F4EACF93874BD4D4B39AE834AF95222959AE43F056F149127ED913B8037F5BFBF13123B3547EEE81B427E809B914B386B343A4618306147AD1CD6C6BE0DE43788CD5EB068C8EF8DFAAE6DCA6F6E7BDBE589797D9B4A98F7551CBD5ACFFE7A3A4E1EB56E5B9B6B5E7AC43B3AD58DAFBBEEDF20DEE167EE9E5E66D36C4FE5DD9FEE81FF006AA2AFC3F5035AEFD61E49C307B1D19C1D2EDEF4B86788B3BA9D2265E3046DC6ABCEE7AFC671369C981AF776D4A5CFBEBD44385E19EF47D83BD3607CBF8A36BBA8D0A36748893F6D573FF508FDDBAAE8C9D229DD9ADA9FC72D6BE71A7E9056A6AEC18DC7D5B7E669B35BFA844477AA02F3E3E7E4388EE3D371CF0E1395049AA6BA387E9B37DF5A46C30E052B7A50FF001573EA219AA73D42A25D3B1DD5CA36267F73877272C4A480C0A8DC331157DDBCCB42A891566BEB5A5DF586B5E78DFF00CC83CA144DBA993CFA6DF0C3D4E5A1D9491E403EBA9D3FC6F0B7E9B97BFF00CA10D4E7483C24382F3324C7DFF8CFBA30BA32D4D999ABA13E2CF18186219EA77615EB5D36B5F786B733947F79224CF888FCE3E1BFBB0E9397A00140DB307ADDB9529BBF8C67F4C1852BC8D3EB60DB8BF846AFE309360BDA6FC479FC3E736E470A0C1A122890185C00F7E46329C355A95DDBEA490FF583F8B0BFF337FF0054C0EB73BFEE6241D7F4C904B2789DDE81EBEFA7285D3866360DE05BA0AFDFC213D466893C1FCC169B4813F33EE3B0DA231A8C3006A900B9B81AF9FBD03C3A120B8AB0D680136D39EF6E468C98E66836E3DF9123EF07F0F86F8C0C280A761D7DFE2B0E8480C38BC472D371EF5B473FC5120D9C8DB65728F51CFC87BED07E94034008E601FC74A8FA97D6761C10E030D8D7EBEDDB678E7F8B27FE67CCFF00DF83F4C3FE29FF00C53F986DFA73B0F21F98066C9FF99F3FCD6707E987FC53FF008A7F30770761E43F31BD19BA37E31E627EFF0017DD1F2C1FA61FF14FFE29FCC67B826EDE207E617339B213C5E33B8D951F8FE76B4EF8467614355218DC507466277E909F72C482068C43535B3BD5F4E421623371FF003150623C64FAF3133F39E9BB7386410FC201EB50D62E4B1EA5CFD8EE52DABEFF00C3FE617359C246EE131FEA8F4B4C7EF6EAD2661527FF004BF5BF466F00DE91A1C3A740FCEC7CADEF943A339CA0442C836985DBCB63EBCC01E47082F0A91D342C7C6FCEFEB78CA64243D1BC4926FB1FE6D7879A6CE923FF0030F23F68F4E7F9FC45CE194EC185E8F76205B9B3F98B6D0DE6C904BA412750697A59FF00C33BC49A873A4C0FE64F985493F80F39F29C355E5CC91476D19B6BEECED61630D55254E5A9B8D9AFBDF661E1131CB73D6D2140B84484DC93FB267ACF3B5B10F8BCB8A83F0D3E6E6E7714A536D61352787C7935A2C1D399FA03E805C24150B719EA3913D6D7EBCE6714BCC72E67213BF42EEDA7F986C0BBF36B16A0FB7D1B678ECEE8ECC935D4EF3282081DD13D4410641991307EF3B938E37DB1CB140899C25C3F85BCFDED0E30D8BFD3E225B1A715DCDF57DC97AB52F7B8E9CFD269D90AB53F64592F68F48D71BBA51BA82FB884CAC8A9752D278D43C4AB279F981CA63FB199D4CC2E3BB92AE14A16800380F4D282C2FCE3BE763F302B44B4B965D0DB7F16F2FA57E759550EBA029C04252A5049DBEC98363CC4796DEB8F6BF65F3046272F96A7015C1524BE9F7FBDDE3AC292424275A1EA0D7EE235973CA790BFAFCBEEC466758B4CC5292142B46BEC7714F5EB1ACAA2D3617FA1FAC6C43A6FBF2E7B7EA7D047DF5D912560B83424F838D74A335372D0EE727BD606840A86F2F7EB1B0B806E23D4E2465A295DEB7F2F2B9FA86847B8AD154E8E7EDF7FC62AAF7996D4CB090A2F885180600E932458F2BE375A8A0505073DCFA6BBBC6532120D4B87A7E49AFD0D23EE58D7D7B87F90F334A23FF2295968091784A12916E623D31F37578BC5A49054B501AACA97471FF27AFBE51F3CA5769715303AA6101EA6B5FE43ED5118703AA5A7EBD9D2CA567C08EE54A9F78988DA670B48C74C2A0F6342C03823C295B785A3188CDE74D4105448152E6ADF515F10FBC0E648A52C3D4AEF7A94C12A29E19D8EDF3369DEF89FC362659FFA92DC8D697A7DF5262A7986266CC25B88062E01D5DAA4330DAEDD21C9344BAA4210D27854CD9CB44CF4DB6F89B5BAECAC44A94B981494B2998961D0DBD2D5A44223193A4AD8053137A83D2DABDFA750BDACB5F6CDC098B4904DAF17E9B11E82F88E9DC331F8080EEE069D1F43EBCA27F098A54D62A0DB56FE9B3824C6F51553C7188045A0031B7404EC3783BF4D9A270D338832B6607D75F21CAEF1348E129D1C742EFF009FA51E95D2BAB49025503DD3D3CA3979DEC77C4B49904252407FBF99DFAF3D8319F8954BF9520921D9A8E487A300D7606D5D286123F9C374401EF078A6F206D1D7A5AE7E785958454D0C0356E2BAE9A68CDFC467033666214789241AFEE24BDC5F41D7CED114CC358776094B891C878927A81E5FBEB87587C996B3AB86A36A58F3BFA44909243D0BA7C5DDF9EDCA21B5BAD14EFF00E6A470837E310679DCEE3E78B061FB3EB2CE14E74626F66BBF9BF278DFF4E5DF57DFF9BB546819B6880E6FAD9D6F8887B69D9423AF22479FE63160C376616A1FB554D83D6DB7B1CDE35EE00AB7A1F5AFD6F15B66BDA0BE88870DE40F1F48E73CB9C1FBB16FC9FB30025416973472CEDE5A7869A562470522A6C69A0DFAD36143CEA220D98F685502DC7133FD53B6F10636F8FCB16CC3F6725A588439E9F5A55F95F6DA48E1C1B25AF63FCBFD36882669DA3383878DCDE784957BBD2D7FDC625A4644840712BA8B0D0FDF5BED77C7E98EC697DB96BB11107CCBB458E2FE77C553F79B7EE71268C9D9889543AB6DE1AF2A6F48C7E90E80B68000DF5310FA9ED0A7ED390449BAAC7A9131BF947C313383C8D731C22512433B06F56DCFD2978DD187E0366A790F7B539C45EB7B40041873CECAE77F506F61B7289C4EC9C8668209924071A52F7A57C0727DCBA9529D541C46CF6F01EFEAD11B7F5BAEA15097002264F1011D0EFF000F76DCE7B0D9404FEE4682E3A7D747EB630F112663064B02D522FABDB956CF6863ACD5CFC121D83FFAB6E53CEFCBF6226246552001C400A6DE27D9A6D7A391216CE433D4BEB40CF6036A18607F54BEB8974D898BF2EB24EDF893E78929796C9154241702A18EFA7E5FEF0F24A1449F9438B7A787AF367AC34BDA99C5132B248B595BCF94C7AEF85060D2094A6583762DFC35B975DA1C194B37413D4084ECEA0717C72E447FAC5FE26E6DF75BA6A708D6433BB8E1767DEDE756615A083BA57FC3D04277B3F59305C1CEFC5BF3F21B0EBE9B6105618B91C0430D8ED4ADFC1BD088C2A5A9AA8F4FB8722DF686D733D75572E584DA473262D3E5BFCF69DD18750154B73E61AD6E553585A5485100A505F723C47DBDD92AF3C5DBF99E9D4EDCBF630B265115B9DA94F7D75858E1A610CC5FD3F9F2109159D3A77583D25447E9E97C2F2E492C40A92761ABBFA54F846061542A5FC74E77E637E509579CB9BF797F5FD679F2FD70E44903FB69B381F7FABC6DDCA989AB3EDE9CE386B365A8A871DF7BA8FE07CF9DFF001467A120064B72B8D3D3A529CA364E1946A01AEC0F81B10357B46EFE28BFEF3EE3F9ABF0C35602C1A1C2308B001677DEFD1C68E2135466AB1C32B3B923C407A49323E1F9E08769C32C81C496E9AF3B8F6E7AA6FE2CBDF8CDBFD53F120C0BF909D873C10BCBC3B100A4DF5177F1A3539E83683F8B2CECB3F1302DCCCF3371CE647492359D86528D05A9AD3F3E3D2907F165FF0078FF00ABFF00BB0423FA49BEC472335593F6C7FD5FA9FBB0460E1660D3D3F98528CDDCFEF1E6388FC7D2FE57C118386982A416E9FCBF942E673654125520C589DB698E636DFDD717C379E3F69F0FAF2FBF5168495865F11A1AB3163CFF0093C86CF0B119B2AF0BE9FD463CB788C335817173A6FF00CFD7EBA9C24CAD1C8B50FA7F10A7F8BB96F1CF520FE67F7EFC345A5DCB3034F2B5A82BECC6BFA69C2C83E00FE217319C2C412AF7C9F4E5E5CA7A473C362826E0EFAF4B535F1F078C9C2AEFFF00ED3CBCB43E476877A7CE5C9BAAC77BDFDD049B4F2B7ADB1B499449F9833EFA5F57D79C379D87527FB5DF6A03B59FEBA59E251439D2ADE3B48983C85AF33D798FBB0E4C8960114A5AB42EDD29F73630C66495281052433871D7AD76FB44958CED61248724881F6A08F74EFD7732047945E2F0C1493C29A54E9E3CFF008D618CD9132AE9248A06FA790D6B6A9AC4D34E6A073BF44B877B99116E9CA47979EFCE9998606612AE14B8360C49D795296E8F11CA9337662FB0FF00034E76A563B63D98EAE0CD7B54CB5857D64A123C52045BC5D2C7A8EB7C735ED464EB99865CC54B628428B9005FC2AD66FA35232795C99E8F9480541B4F57D999E96E663B0DDB9E9A4EB5F67FED074C5434568FE18D5435C49903810BA8F09DFF00A44C1B9F5C79C50A548CEE4F092026629C02CEC59E9F6DF68EE7D859A4F03BDD2D6A5B7A59B63A74F8FECF1B6E92B2AB2F4A4257499857B4A064484D4B891D62C2D6BDBD4FB1BB15989465C80B53012C30259E95E6DCFC6D1DE904AC7117AA535028C05E9E3F9864539E7246DF1EB1E5CF0F67CC99889C7841238B9B33F900DB42A94D416A7E1E3969DBA813111D7F7E677E589944B972E5A12B676ABFBE6478187A9040480CFAF37FBE9D2371713BF14FC6F6F3F2C39425240E1200D83726D7A46EA42920929206BEF58C1EAB4D35338F012B4A9BE131600A84DE236EBD461963D69952D550686A1AB606F570ED6E51893C33961093BFA036F7D23EEB90C0E9E222361023FDBDD8F9E53E52438291434F478F99099412E05069ABFAD2FF00C0A4284B29FEA48F7807ADBCA30C912439A3541D3C4BDC68E7CA3612D9FE6356A36CDF8F7AB830F25BB13007B848F3BF97BEC39E25654A25258508A5DD9EBE1CFD8D0E1D157653DCB6E051A91B1598B6CA499049E9E198DAFE9D77B5FA6C704A9C40A80EEF5BD49F0D3F986D3B0729D252800005C52BE766F76863ACD46D37BAC022CABF4DAF20CF2DB79C3B93922D740E75A7A786BD7A88D512C22890C34034AE9A9E9EC45ABF59B54E2CA0419B1503100DF63F77E789AC276754BB8552CE2D466F7AC3C94859B17D19B5A52B51E9CA2039A6BE80A01404743EBB7E6019BF2C5830BD962B22A5AAC081F6D7973BC39124283901BC86EC6C3F07AC40B32D78E389480E9313693FB8F58817C4EE1BB2490589D469CC9F1A7BA0791C1E193A21B7D34715A7DD8B96315F66DAE570A3C6AFFA8DA37DE48823F41CAC983EC8CB05249AB0D00DAEF4D7979C48270E4B101B4DEFE3AF28AEF36ED01C6403C6A13360A304027A411E738B7607B2B289B03C2DA313ED8FE09683F4F5B5CD00FA50FDA95A33C57D99768CE92A951833BA89DC1DEF37F3F741C5AF0BD974060C2806839834D5ABE02D19FD393702DB0D34707C07E2209996BF7564788C09B137E80EDCAFB6E6313F87ECECB940B84D59E8DBD0DEC5ABD76687125A43850BEE1FD3CAA4FDE2215BAF1EE4AEBBA8F4F5B49DFD791C49C9C964B03AD68431246F7A07BFD21E09C820820176D486D6ACE2B7BC43F30D542BF87896416E600279FBF9F4DBA4624E564D2D92C052E4B5791F1B56C3785D130711A38A11A38A6BEFD2B17AACE512789C37064F118206DFEDC879E24E564928814018D28FA07A73D6DE10E51310481C2C7CF73B1F3FE222F9866C1C4A421C208E52473BF3DE2779F4DF161CBB05270E829094EF6150FE22C346FC6B36499EB484D00B902F50DB1BEBE2F0C2FE647FE6CEDCFDDD6D73CFEEDA5D12E4B5427A33B7B1E1607487D85C190A0E9E56BEFEEEFE24A2566409252E12044413F70EBE9CA63094D9485060863FF2A02C1DB6E94360444F49C1800028046C5A8DCDB7A8B38A184CE660019E33111F68CFDFBF958FA02488E99809ABAA490C6A03DEDB6C5F5D6BBEF3A42024FCB5FF003AF2DFC7486D7F304DA1CE479F49E9FEF6E587B80C2CC90E26329CEAFBFF0022FE15B6F8292921C867715EA77AE9BFDE1B575C913E3B936379FBFA7C312BDDCBD852FF00CC487E9D1B0F2FE634FD787FCC3F13FF007633C12CD78475FE633DC27D83F984CE55CC8EF0DA48B9BFFEE1F2B7974C704BD93B697FCC63F4E8D8797F309555A0117F9917BD8DFCB0D67A521D9205054372F1B75BEC214972057852FD037D2B1A1CAE17857A7895CFEEF4C3585FF4B47E1A1D77BDFE6EB094D7264CAEFCFC4BC107E99A8CDCBDAA38FAF23FBFFF0072F1B71AB7F41F88C1C283700F5FFF00EA37355C91C442F988B9BC0EA48B0E64CEDCF094D2FC3B87F173EF4AD6B0F30F85490C523C869E6F4DE87CE395E62019E23FF58B7BFF000184A1D7E8D3B0F249FAFF008848BAE0621479F318236FD2816007BFFD5187D70FF71FFA8608CFE9B97BFF00CA33456024CA80FF00D4411849603D2F57F48C190137D793FDCC67F5B1FF00311F2C690774397FE23F307D707FCC46083BA4F2FF00C4473F5DFF00F553F1FD7041DD0E5FF88FCC29A7AE09E225C076D898F7C1C27334F18061D2AAB024720295F0BFF887046629DF8933B1BABEE9FBF09D3DEDAC67F4C9FF0088B6C9A7F3CC79C2D6B304413C493B4C927E026E45F6F8E352949B814BFF003FCC63F4A9FF008BF4F7F585A9AF4C8F1EF72388FE7FBE538C7026FBB6BEEFFE231FA245F847D835986C75BBF285CCE60949FB569E4ABDA76B8993EB68C359E0241005DABF51B7BDDA23F17252904049200AEA6FF6F7762FD4D99A2C02F94183FAF59F7FB8E1A4462F0E922CEF534F1EA6FD6DBD5F18CD5278471C7FF5449B4F3F9DA2E3D304021BD7686D330E0B70D80A8A1DF707CB9C4CF29CD5B8038C8E5B91173E73720F5C2664CB533A438D587E3E90D558740BA4575DFDEACCF174681D52AA1CD58097152A75B54955E10A06C6E248FBF9099ACF68B29973F053D6123E596B7617749FA3B57D68D5CCD70E04D96426AEEE1A80355AA2BE7C8DE3D7BCAEBDAD5BD87E78F00852AAF24AA055024F734CE8B98F2B836BDF1E16CD248C276AE4B025299EB013A1E25746714BD599A3A576397C0123F69F958B1D3C2FBF9EB4F8CFED532F465FAEF523688FFF0036AE040B01154EF2B44DAD138F4D64B30C9C2618874F1212487E40E8D4D5CD01DC18EFD964E3330F2C7EE00539B8721F7A1D686DA45798E83964C9665924076BD34A1BD47D5A2591281E9BECD6DB4BB6AC6353AA03867CFF000BFA61863713F3B0535695E6E050F869D61DA249E20402C2EE59C737D4F946BE31FDC46FD7F77C2B2316521B89F4676E4ECE3E97F087989522649EED0C54DBD453AF4673D19A1592D5552BB4AE186D650A52F6E1E054C5C03E2888F7DE711F99E238A54C7535CB3FE4F98E9CE2264489D267A2784964F13ED5BE8D4BBB7231F79E8692483607CFA4F33D3A7E78F0CCE0A2753F8D1879FB78F9A610E03D0D5F57DB5D2372DB40493C42C0F3F96E709A10789238581D5B6B7B3F78381B9F2B79D7488ED6D4A5A053C6011100902237E63F600C4D61E4BF0B8B81A5FC2DADBAF283839BBEBB7AD5ED10FCD3352DA13C2B07ED490409BF3BC413187C65AA531425478B46D34F3F37F209AE5DABBD5AD6E715467FA8D6DF170B8044ECA1CE3A1DA62C7AF95A7300A98E01944BB35DBD0780A8F18C26497B39A69E3D4DEDE622A9CDB58AD9FB6B242A62E6DC26F6E9B7BFC8E2FD96E144DE10A9646EA20FD00A5A9FE21DCB96524937D2C7D2B5EB4E45A2BBCDB5B92170B55CC889B83D36E5E5B46DCAEF80C9E5A824DA81DC74A0F1FF0030EC218543BDCE835EB53EE910E7F5B59414B226D04EFBCFC62F137C4D0C914E381015CECCC76A3DDEF7D054449E0D245746D859B969A575F288566DAD93713E97B7BED7F48E773890C364D3D0CE87E82BA519BCC5A8D41121107ABD522AAE49841E6779DA2667CBF238B0E172F9E900041F6E3F3AFD60F7D07B6888661A8132A957B819F5E401F77E589FC3E167243841A5A8CE5E9706E7D7AD4888D4E7685127909DCFDF079FC2313586C0CC9C3E6490ED52DF4BD7931AC67F4C673102A7F8E63C3F9788B57E70832479F1413F7C4DF78F98C4ACAC9144BF16C76B3685BC7A54C2C8CB961EE096621CED56356BD6DADE22F559B990524A4C192491F1DFCF68E9E92B2325208F999E868FCADCE9CF5687A9CBE651817D6FE0DE218FD1AF1FA8CE1641959581EA2F71CBD3E3CF0FE5E4CAE22126946FAFAECDD6B48772F004DD241E86B7DFECC7AEACCEE6AB51FB479D898B5FAF9C6FD23AE1C8C9E63808AEEC6A0BEB5FE3986896C260121412450B5C1B53FCFA8BC36BF992C09E226677F48E7CBF0BCEE4AA9CA2626A2B6DCEED4A9E9FE1A7A4E050006482C5C161AE97D35AF84256B3155F8D5BCC4F9CC70F5E5B5BA61C270252C5436FF17E56BEB1209C2B248E17DC8D2874171E2E7C2BC3B5CE411260FAF59DCF2FDC61CA30E84B3801AF41CAB47DBCFCE23E7E1493661BFB1B37896A351B2A6BD5E0B9B024816B1F78F2DA2FE77C36C5A65A47CA41248DBC79DB6FB554C0E1EAA090E297E67DB9D078C36AEBCDF7F2137F84DFDF862E6EE5F778933873FF0017BD5EDEDF9F8C70D57295C526C47F70DFD27F7EB8C3EAFCDFEF07707FE3EA7EFE5BEDBC60BAD11BF3B78B7F9CFEEF8CB9DCED7F483F4EAA7CBFFBAD6BD7E9CE13AAB48820F90B8F91F3F3239EFC9A4F533EAFA93AD3EFF8E8ACAC39049663E07D5FDD7C343958B04EE6666E39FE1FB3869C67610BF72ADFE9F9F7B084A6B960917F88FDCE0E33B080C957D36DBA8F7BDE31FAFA86E63DE3F3C1C6761EBF983B857B03F31926BD5E220DCDA26479EDE42D84D6B347ADFED6F661C4A94A4D086E647531A5CAF72E01168237F9FCFA634EF03B51EB47AEADF673D690B776378D62B9CBC903A6FF00AE0EF361EBF7F380CB1A13E35FC4726B564CF11F404C7BED8CF782BF2F42F6F483BBE7E919A6B14641519F7FE53F2C36985CDB73E7FE20EEF73F6FCC67F5A3FDC7E7FF006E138CF00DCFA7E20FAD1FEE3F3FFB7041C0373E9F883EB47FB8FCFF00EDC10700DCFA7E2334D6A93B1E7CC9F2E91F3B61399A78FBF7F783806E615A2B960DD56F53F7613804B7DCF41A7BD7D216315EABF885BCFAC7EF6C101975D41E63CF6D87942E6F31541F189D8127D39F5F33D7041DDDAF6F3E6397B78503317131E3F2DF9CD8F3BEC3973B9C359C6B4B1FB010D71320936B8EBCB507D1FC21DE8F335DBC44C45CC4CFC7A7C4F5B611861330EE9735D29D46DE0F73E7477FE28B0A49E3DBFD44EF1BC47CB6E7821A2F0B47776D36F51F7EBBCB329CD96384F1DBD76F9C8FC799C10D26615DDEC76BD1B57AFAED13FC9B54FF000DAC61D51528CDB8495472BC0B5CC826DD31AE324A6665B8B2A0ED2D4C06A58BFA3442E3B08A98A49093F2B9A3F96AE6EDBB7378F6CBD997355EA5F67BCFDE52A4D3E5758949245FBD4BE9304FDADF604FC71F3FFB649123B5982401FF005712B04805CF0A9EB4A6CDAD6D13591CDFD3A892A090180A736B6ADADCD5F78F93FF00685CA9CC9BB50D594EEA5499CCEA1490A052654FB8A98224CCFA73C77EC19E0C34804D3BA43518B848A7979DE958EFBD9C9C3138292C6CE14D5B9A3EDD628C2A80241133F2FDFBBA62D597E294994B00B16D4E95F5B5766DA2EF2E41090598F5D2FAB5FA5234B8B24A523ED5EC0C9B6FE1FD397C22A7628AE6AAAF5B57EB7B33B36BD61D4A944CA98487B51EDA6FAB4042CA0AC24C0DC81205E37023E3E784BF5CA42CD4802CC5DFC896D0B188C9638B1291A150B8B870198E97F1AC29CBE9DCCC5F6B2C485F1573CD348E0495ACACAC25094A520A89248989F3BE2371D987121614A77259CDB9FB6EAD169CD25CAC165CA9C0252B12CA9E95A55C9B3E9BF847DE977E9FD93F963CA8403711F2A7BBE7E9FCC24AA7C04D8C588DFEEDAFEA396E30BC997C4A7091422A7617F0A0D2FCE0EEC6F6B53F98AE73EA829E205467909D81F7DFAC98EB8B460240212785FA8B1D797234783BBE7E9FCC55B9BE6EAA44A932541C993C46D137079FC276B0DF16DC1E5B2E7FEE48A33D2FC853CDE977730A224F103A9341A6DD5BEBD04529A9B3509529C0FA9B324D8157EC7C3DC716ECBB219331490994058D5ADBD773E3CE90A8C314967EBC9BF3C9C7845379BEA072B141B455F129B24429B080667990072DF68E5D6F381C9B0F2582C25205CB8A7875F6EF0E932428DFDE9EFD451EBECD735CE5BE25165B0D5E1C0F34605EFC324C8FBBCAD8B5E12565C3E4EF0120541A35A84BDFD97870891A31A54923DEDA163B1A4429DCF5A794B4D4D690B444212D1B13BDD3BDCDB96F7DB0F26E6395E5F45CC9638AE4A817B73F7A521C0989902CFA0B7A38F74A52196AEA9E767EAD4F5954397754B50A99E9C2855FD2DEBB9CA3B5393CB0077F2ACF5501F53CA9A5B68C7EAC3BB73AD9F62D7D6C075786FA6D3DACF3F5AD19469CCCDDEE48EF09A5A96878BECC153402BA7C49EA17476E32094DC588C397D0CD40A8AEFCFEB4615C8C524B92083E9A569E74AFD62454FD8576D19B81F52D2554B04FF5B896E3D78C00236E5D779C253FE28F66B07FF56749177E15856BA70B92E2951E942ACB9A8501C4BD580614F7BD7D2AE87D927DA2F30095536892A09992AAFA54403B1852A779E56E7883C5FC77ECA61292E78249A32555AF20D6D5F95ED37815A12ECA490C18961A787516AB52EC81FF00637F692BCE8804117FFE25487E1E212379DB9ED84E57F507D98A033A9A517BBD68DE0C74E71312D72DCFED1677228C3E9E5118CD7D8FBDA329921751A114A4C1852330A7544033210553EF1F9626709FD40F67669E193312F40428A83FFE4297F57DA1E266C9B28A5EC198B1E4DE75FCC5539FF61BDAB69C4ABF8B68FAF63BB9E20DA16FC0E63F96850BF53BFDF6397F1B72650752E53901BFDE4F8EBFE3EAAA67C80400C40BB306DADA9315366990E774CB08AECA735A22991DEAF2EACE111BCCB2058F3DAD0716FECF7C51C97342522749413A77A9513CD9F7F4BD2CF244E0A53A025401F992E900DB52DC81AB1E42B11475550CB8505A1992447DB50A45373B82954131E9BF962D67B5997B3C89F2C837F9817D857573A69E313B875C9984F11EE82438480540F881EA28FE70D9993CC3686DC7AA0B0E89EEE9D282B0DFF702B13C53E77C2A7B41859A974AD249D5EFA52A29B5EC3C64A423BD05405750FA581BED5E9CE1BE9B397140A1CA9E200785250124F2898916EBB79E3538FEF090920BB1047A519E96FF00308CEC27CC4F0B39734A1E5B8A0A5DC51AAD182AAD6A2A2A6CB69DD04DF8BA9DAD7E57B72C379B356A2789C27A9248F3E7BBBC2B86C1A407721EE386CDCEEDB75BC2672A81BF17A99FC62DFAE10E24EFF587BFA54D9CBF43F47FBFF089DA9008E131D60FCEC09F960E34EFE8631FA54B7EE3D58FE6FEDA357D689DC93FBFFD3838D3BFA1FC41FA54FF00CBD0FF00FC51A9CAAB893BF5E71EEE56E5CF7C369EA1422ADE1AFB3E3A43997870E0B3F890CDBB937F6743AFEB3E7FBFFA70DBBCE5EBFC438EE07FC07A7E639EFC281926DCA3F41EFF008E0132A1D34D6BFC41DC03640F06FE613ADE4C89F76E07EA7DDF760332EC3A560EE07FC01F2E576A7BE75E5AA8826F3B474F41B981E9EFC379AAB134049F7EF58048E7C23A3D7C08FCC6FF00AD790F9E11E34EFE8633DC7FDFFF00B7FF00AA13545403C3CBD27FDFE5EFC1C69DFD0FE20EE3FEEF4FE6137D60753F13F960E34EFE87F10771FF007FFEDFFEA8DEC5481C5700F9C9B7BFF2F7E3459059B478C89203B906DFDBD79FDFF951F5AFF5A7E18D236EE872FF00C47E60FAD7FAD3F0C10774397FE23F307D6BFD69F86083BA1CBFF11F98D6BAA16950E7E5D3C8E119AAE16A3F8FBF6F183252756E80463F5BFF005FCFF4C23DE72F5FE231DC0FF91F211B1BABB9F1FADFF7E7CBDF83BCE5EBFC463B815F98DA94D6B7E56F58588AB103C5BC45FAFBC6FEA70779CBD7F88CF703FE45BDF9FA78C2E66AC492553EF9E9222D3EE048DF1A124DC93D6119B87245F8B9B337A9A7BD6AEB4F5A9170AB7979ED79313E7BFC318866B9203862DBFE43D3F8A43B335C991E2045AC4DFF003BCF58B804D8E0840CA150534BBE9EC6DE90FB4B9824404A88E978F3B79C580BFBB04365C8493C4CFBF3D37D4ED5F1AC4BB2ACF9346164C2839C299578A0191FD524738F90D8E179CA6CAF16583896B63B0E13A589AFE758426E042E5CC5D9858815EA6E0B79F808F71FD95EBCD0FB2ED5D6344949695DDC13FCC0E54282E4CC90248BCF4137C7843B48944EED9E012520A7BF9E56C43020B8DD81E4DE8229B3E7FE96690E032806D5BDB9E54A068F05FDBDF432A935AA356D3B60379C3CF297C090005320054C08B99DF73D648C7674C9270F87521354A45BA002F4B6BD3731DABE1D6681695CA597E3E16F326C7D1AA7D63A00E38971BA5B01F6828C7398FDF9DAFB626F0292A96AD29577EBEDCF5BC777932C2A47117AD46D5B57434ABD2FA3425A86DBA37DEAB026A14128A74DC821638551B83123E1CAD88F97294664D5317AF9543B7315A9778D258E14AC3BBD816771E7FF00768DD636D3A2B1861CCB1100D47F31E5282645BBC4DD5B589DA76B622F160C849AD43D0EA1F6205A86F5AF846CC42D13BBF2966502036C58BD346B335F778EF6FB03F600AED63B51A2D479CD314E97D1AE1AACC1F7507B8716A6CB8CFDAB28871B1B489B5C462A198E35499530A13DE2E89097624AFE5706F477A7E04557B71DAD4E1300AC31980152140A5C38614F3A07B1E51F58E1D3CB88FCFF001B63877007E5B7F37F778F9F9C01DF4DBF9BC25AB74847F548D8111F8DFEFF00961E48284B0A51B56BF96BBDDB918024026DC872F1BC5719F3AA2493369DCC1E87E3F23CA3169C04C92809798916B9D35F75FAC67853B7D62A5CF90A7DB5109714B483C21B6DC5933BC84824440DF165C366F83C1DE6254ECE1C353A6BD357DA364B4B2F50D7677D47DE2A6774EEAFCEEAFEAF96E455350951294A9C4A9A499302EB40817BEC79198387A7B6F83921A528248A30587A72A0AD7F9A43849E201D56E5E76B747BD8561E97ECAFDA4EA84B0E2E81BCA1944971D152C2D442AFC45016140813637B7B8C0E2BE2B4A94B3242D7C7503E55106B4AD4791EB487680901DC30B546BAB5CF2FF1132C8BD89F2547039A9B582D6E0238E9452BAA13CD2548570F94ED88BC5FC58CC65ADB0F8733127FBBBCE137D99EA74A1B5377085201254B02C01DFDEE6A7A98B4F2FF0065CEC474EA52ACCF4FFF00885C708EE5DFAC5453776A4EE4A41F1151E4623A9338ADE69DB3CEF3CE032E7AF03DDFEE1FBCCC7A5EC1B938BEB0C71B3004FC81FA503EDD39D3517BD8F92E82ECEB4F84FF0002D0F4AC70C7097541FDAE27BE428CEC7CEF88539AE70B491373198A7B8019E8D707D6FAC46778ABF057FF005505B4D1EC6BCEB411384559612114F95E5B95A2200465F48E97472921A0470F29BE21E6CC2B5154C9D3D4A15713A6001479057E5B771194CF9B60199EE7C4E8E437D2F48C175599387F969A65CC7D8A561991063ECB698FC3EE406214876338D35993162E373B7AECC20FD44FA1A5A96BB9E6F6F510980CD883DF2C5288F070A52AE3EB3C3B797320E14E29F8A002261436F523CEFB1B6F511A2B1D8894411C4C0E85B8ADB786AD4246D081F4D692AFF3EBB5FF00E198DBDDD6DCAE07A6F2F05892586206946035BD6D4DEF7B46C337C4B8002B954FD7D98E292AAAE9839C59824154471D325CE28F250300758BF2387A301895103BF2E3FE25AECF40CFA43C4E6F8A21DD7B357EFF0088455B995528101343524FFCCCBA9940DB9F1B4A3E9B1DEDB4C94BCAE69487C4CC06C7FDC56CDFF2F4737D459CA33AC5ECAA5CEA7616D2E77A3C42739A2CAB3E6CD1EA1D2F95E6748E712168451D1D31095483E36D90AB8B4CCFE2A4BCD330ECE2BBCC06227267AAD302D6BB16259448FB75D657079BE216405F130AB59EEDA8F0E7AC755FB47F61EF67CD76CBF579436746E78F0528290AAAA94F78648F0CA5BDCCEDCC88C5D725F897DA494A40C499B8E24D57C7DD700DDAC76E9EB76CAF3C521011DE84248658500A2DC8A99A9B75D23CF8ED5BE8FAED3B47D2AF36D26FA759654C079C77BB0C5338C34992986CA94EB9C491C8488913271DD3B2FF0014F033A748C2E3712A953E610132D615C20815759F97CCD7D0DD3058CC3CC40216971552C2C3AB88B8F968CDD181F38E8266B95D4E4F5CF65D9EE4F539457D3A96829A86DD6C1520AB8A0AD0849888B4CF58C7A4322CFF002AC44B96A5E3651700BF12542A0355D9F4DF7E73F28C9989052A0A49146A934AEE450727BC449DCDDFA975CA7247774D01B200D9513717DADF28C5AE74DC2E2403849A89CC3FB0BFD09ADF50FA6912299094212B02AA7A359BDFA084AE54AC78BC50373B7DE07E186852A4D155E6CD7AFBB429DDA9BF6D3C1BA6DCE113952A26C6C6F63EEE9EBFA6D848CD40B9EBEFDDE8F1A8049600B8A5ACFCFEBEB1A8D4AC0B98F327CFE1B5B18FD44A667AEEFF0068C9045FEA2353952AB024F316BF5F2F220F48F8B798B4ACBA4BFBD6A76DBF10B4A415548A6845FC287C7D79E935046F23D47FF6E112A22E9F5FE21C77279F98852C544855FE71F801F29F3C63BCE5EBFC41DC9E6DD45FAC62B7FA104EC2E3D4DA3D718EF92ED4715BFF001E9783B93EDBCA349A829224C1BC7C0F41FBF38C27326254086AE977BF4F7E31A2E480D4726FCB6AD1F583EB47FB8FCFFEDC2109F75FF6FAFF00307D649E7F13F98C10775FF6FAFF00307D60F51F11F96083BAFF00B7D7F984EFD491C3E2DFA1E9E83CF09CCD3C7ED1BA255E8478FE49F7D213FD68FF0071F9FF00DB84E14EE4F3F3107D68FF0071F9FF00DB820EE4F3F3107D68FF0071F9FF00DB820EE4F3F311B1156AB8E23F13F97EFE184E669E3F68D552942C09F23F4F7F6D9F5A57F71F9FFDB84E35EED7FF00131B9AA95C9FB5620DE7F21F0B7E4463815B7A8FCC2D455192788C7333B7CBF3C60902E5A0E056DEA3F31B455994C2ADD419DBADC45FF6318E34EFF5D6353254AD3AEAFA6F0B98AC54C71729E53EB1791F1913D2300524D8DFAC21370C412149F16EA199FAFD61C45728100199BEF7046FB0BF2F775B8C6D0C662129714BD7EC6F4A0FB43C51D63C2150AE198920DFF2837F7C8C10D7BBE3A243D68D424DB7A373D2241475CA75496388953EF30D260C905C702009E57311CE6DD433CCF172F0D96E2FBC584032D4CFA963E3AF4874890D2660586F94B02CF6EA3C74173B8FA1BEC932E1D9FF00B2B68FA5ABF0AEB692B56FA17214A2B778DA2524711FB408B1E51D71E199934E33B638F2E5430D3D3DD96268B25EA37B9DA38EF690044F4F0D52565C8B33EDCBCB7D0C7955ED5B912354691AE79C6F8DCCA3BF5B64265403EB2AB089DAD69F3C77CC34A98AC249F94FED0496A014F07D3CE3A3FC3AC54B44D9616B01D40124B061A07F7E11E28672E2A8A502789B75C1C306603846D048B7DD79DB137815CA08582B014CC4539D6F4D6F1EB0C1CD953B088E050AA400072035D35362D76DF3154DD453A2A160ADC6C0EE85E49912600331CFE06D8D1084A4AD4A2CEECADE9A7B6BD223CC89E678E142B81EEC5BC09D0EE2D7A54C4A74DE9FCEBB44D4791696D3ECBAEE699C54B6C90D24A9494A5C6C2AC0181C04CDFACE2A39E4E9638D226A52A6E27BB302F63B0B18DF3AC5E0F2EC0CCC4CDE1265CB2E95109F988212C4EC40FBD63E95FB2CECA72EEC1FB12CAF4165E86D8D5B995353BFA8AB1290871402D152DA54B1D1B5A9278546DBE2858291331F8F5620712B0F294D862D4512196E1AAC46A3CDA3C21F113B633715984F9689A5654B502534012F40002CC07896E91EA7B1926655447D58771C5B712527DFE2B981E43A1C70B9B89080E54C0D5C124FDDBCDB511C942944D0FD21D11A1B377071E6199B6C22070028412AEA0106C3DF73CAF88F566409694A5129FDD460281B91A335E90ED091424373BDF56D3C39F8F1FE09D3E811982D35A6E1512824F9413CB78FBB1AAF31C451A628307BDBA907C74BDE1596CE695F31BFE3E9B46EA5A0D0D917789A4C992AAAA93E15282DE128F25A4A52098B1B61AAB1D8CE204E295C25F8925DF956FA5FEF189AA008A577F0FE7AE919C67750E7F96A7A5A7A256C94D353A5413CBC41015EB27D26D8D44CF9F88F1926E4AD46ADA827E83F108F78BD090341B46EA8CBA128287DC2F19EFC254A0279020103D23DFC861F2677197500E2E4A413AB69F8680AE6A59C902BA8A37BFF0031C3542120711BDF71C511D49EBE67607AE1C8095A5C067A6BF4A46C0CD21C1247D2BAF46F5F2DCE5234EA47110422E2448E879DCDF6F28C289509746A35F66DFAF4A985E5A4AFF73923AB0DCF5F2BF38D7DCD3B444AD23681C201B7BC79636078DF8535DDCF5B102E3F30B7729DFD0FE61BAB6B29982D8E2499E21C8CFBC9FDFA61497825CD04A659D0D8F4ABECFBD3D20EE0173D1FEDA8FA4361CF295A925C47C0088F779FEC6153944C51A20DAC4747D2A280F5D20EE13EC1FCC6A7354D12225D47389208816B79FCF7E787523249E6BC0455E9B1DF6BFAD2B19EE65B5520EE5839F12E69A43255EAAA3330E3441F31F76DBC91B1F75C3F464588B842A94142399FB5CD39DA329932925F801F7EBEF48627756D1200971B93E693F8FE7E98728C93141B841D34660342F63EB7687689128BBA035281BF07C36844E6B1A1360E376EA40F59BFCBE6360F5392629A81637FF3F8A561D2654AB042481AF969D7900DCDE1239AAE85F04075B91E622FCE06C07E56E78752F239A0033251535DD2F72EF5E40BB3EBA34394CA40FED62350DB03E9CE8F57D9BDCA8A3AC061D4926F2089EBB83BFE3E58D66E5E24A4B4A0826B415A78529E7F58DC4AA6CA3F228A46843D3E82EDF9A533A677F8705BCCACA9C5005BA85ABBD698FEE0A6164A17C62D04731EF64B95396381C841FDCC9295F50B4B283105D8B6E43346F81CC7132D6089AA0C402EA2CC6FC8EEFE5A452BDAEFB3B7657ED079255B59D50D2E5BAA10D2FB8D40C301905D20904B0C25B42BEC84893326712B83CEB39CA1094E13113A6E178A924CC53CAADCA892A2EE0D7A6B1D4722CE56952146610B0DF31A82FA312D6D8163E9E0676FBECDFADFB00D4028EBE8AAB34C973175FF00E139BA1A3DD38D3249517036161B02401DE284F58DFD2BF0AFB726485271B89EF0A827E55A98A696625F5367B3C757CAF128CC51C4C94A92050597CF61E7D2ACDD7B66A2AABCA9879BEE129DDE490E4C4CCA40B481CEF3E631DFF0D9D61F30ACA5A40536AE6BD0D2BA6FD626BF4D2D29725A96B5ABF7F0AC37BEF369754C21125AB17B889EF49F2330009DADCAFC9FAF2B5CE485256EE2E3CF4EBAD3D61AAC4B42411FBAAF4A80F4B0AE82BF68C50A49DC7BB9FE136C4062B053B0EA3F329B986A7893F5864A4AAE09B583EEDEEFB721995A524F4311BCC01EF3BFDDF0CE04A8F1025DEEE76B6AD0E308EE41767FB8E9BDFF00883BE4F4FBFF002C3F2A01DC57FE3EDFEB121C09DBD4FE611D53B3C3C260DF6E9EFF003C319AB1500DB5A8D6AC6CDF88D880407167ABDFF10938D7FDC711EB98A7724977D4C60002C238E359DD44FC30AC82E76D59F67FE1E02906E1DAD071ABAFC87E587718E04EDEA7F3071AC6CA23E1820E04EDEA7F31CF78BFEE381AFF009F67CA0E04EDEA7F31C15ACEEA27D630D67000800333FDA3200161071ABAFC87E5846331B5B59BCDF6F238208DBDE797CFF4C10462A722397CE7E58D9258B9DBCF940C0DC3C63DEFFABE5FA6304B926D030B353683BDFF0057CBF4C20A5BD4D00F1FB46A5293A0FA7D20EF88D9447BBF4C325CD2C43D352C0F9341C09DBD4FE63626A426788CED1D6F31F71C21316695AB12696FB69A43BC3CA4283148DF9DCEB5E5D2B0AD15224907736BF436FBCDAFEB87324D5B6A75773E1EB08E250928500966B53EADB8E5D6E61522AA1485893C324DEDE5BFEEFE7187C491C2A0683CEBE86D6D0FA56E6C924AC17F9EB41E76BF36E557893D16A3294861D4A7822012120C5B9C1F2F4893CCE365E21294BB81F73C9C535D7C637C160F816EA0E97EADB6EE5C9F08B7BB19D22EF693DA4699D1D94053EFE6D9830FB81092A296E89D4542ED36F020F911CA71C5FE26F68060E5772998C262174E261C4052C59DECDE05E1BF69669C2483325A820A12C43548550F5A1AD3D5A3E84BB5B798A3CA72ED22CAD29A7C972BA569B0D98417051B45C848313C6920C0277C710EC5E07F5B3BFD426CB3DECF984CC2760A3C26DB0D686387E6D88EF2628514C5C171527AD407D457768F33BB46AAFAF52565129292AAB45434A4AA088485A504883262FF00AEDE9AC2E0D2AC0042501FBBA0A5DB571FC987FD9CC44E953A584ACA7E6B0E55A79D3C23C43ED37275E9BD63995238DC043EB294910077C4A840023FA8444EE4E39DE33098AC2E294A05411C44EAD7AD4B69F6A8B9F5F763B18676070CA5AF89540A725CD69D1B9B03B5A21AC9719535434A98AA52BF94BE1E3E10B32B49491078C2B844891BE169F998EE38388021245C39A6ADB3C74CC666585C160D454949570FEEA51C07A6AC0D7C1E3DB0FA3E3D9D329D17962BB79D754210F6608074750D4A095B0B48553D639C047178D452B1C690003E13071CB71EBC4E331F351256B51E2F9C970250351C94E1C3E9E71E4BF8BBDAD5CEC28C0E0A6148477826CD0AFF00ADC45D3F2BD022C1AE7531DE6D53AA2A6ADCA87AB1E0A6D4496140A6C89809B2A6C205EDF0117CECDE5AA011C49A06AB0A93ADAFD1C8E4F4F21284DC46314B9CA2B254EE5CD8FF0000B374D23D7253B5B5622980667688113F033EFF004C78E0CC67A927635FA822357ABF8C6AFE159A2FC558E29E1B23C6501039EC6FB5FF0063092945449DEA6DD2A5B9FAC3D41241E5AF2FE291B0656849016B29B192495F43D49C6841208767F7F785E5EBE1F785CC51A5B0A534845544151584A7BBF4E2DE77F59F5C22A965C104BEED41A59DABE118980167D5FED1CBD5F4AC8E17561A3B140492262F71D4F4E9B5C61CCA96B5800034F0A3EF6FC7842600028290DCBCC2848269CC9FEB93F0249DF9EDE677B893938659AA83026BCFA7DCFA40C0B3D48861ADCE12D9512B4003A293CBDFFAF2F5949382510004923EBE3A8AD1BC8C6CE588DEFE1115ACD56180425693C57FB43DFB19FBFADED898C2E5466B7125C8616B1BF8B75A38EB0E30E81A1BEF7BD6BAFBB3D6119AEBD534490B1239F17EA7FDEFD266B0D919268871FF00A7DF8EE75D9DF77CFD22019A7680E3BC27BD1E12A89501327E1E9CFEEC59F05D9B26AA96C0B386FB36D5FB6B0777CFD3F9881667DA2BEDF143FC37BC2A46D6B4FE9F218B1C8ECA099FB500D350DE1F814D2918E02FF7F7E1E7AB188357F69D52D903EB0428CCF8F7DFCE0CFE42062C380EC8238085201234E1B3DF9D7C0F331A9412086E5BF37A4466A3B53A8850EFCDC9895DC472DF7E973E589A95D9094A1FF4D9887A1623621ADA9B96A6B00429ACFAE9E2FEA4F588C661DAB55254909A832267C7681B400679C7EE43F4762D0A149628CEC923D5EBC853A42F2E5A941EAE7705E9AF4AF28655F6AF58524FD60DF9779B7AC91B9FDC9C3C47629240694073236E82BE5E5587694AC0DD46F6A372B7E00E708DCED76B1929E1A851E23FDD3B795EE4ED3CBDE70DB17D8D290C9941F9279DED51A96F4891C3C92B49D4B5697F77E4C5A1DA8BB6FAA640FE793B48E21C88DE7D7A479E20315D8A98A04F766D6E1B79529ADE94AD1996330A482403CC5CBEA473A5BAF3690B1ED06E32A4D3BAAEFDA7C8E2638A3BCE1823C60786373793B75C404EEC54D49E2EE94E2D43AF8066A306671A38786EE95296183925CEC5B5E6D5B7DE2CFD3DDB9E48E1698CCC269E956414D3059924EF2EA6151241B9B6D30311388EC8E2405AA5A4A2616E13C20B35689B568FD68627B058A992AAEE28E2BA1A31A1A369FE2E8CC72DD01DB3E93CC34BE7B47415B97D753F754B5AE1696FE50A5A49E26E65E59716A04C111104918A8636466BD9EC6C9C54954C4CC493DFC90E0625BF6D6825F00BB5DA3A9F65FB408929E098A6B1049763CF42093E25F9478ABDBDFD1F3DAAF65598667A83B3EA7735468AA95B8FA9D692842D968952C2528254F2A0950B09B6DB01D3BB1DF14254B9C893899865E210405495929035B9A59CF3A8A878BE8ED1616700998A09243F7AF5E4C91D408F36F3ACAB30C9730A8A7CC69AA696A92B297296A69DD616DA84820075292A122E403D27618F4A647F127013D2841C44B51200AA83027406AE39D6AD416890C2CF4E264A149140FF00EE38255D520BA4528F7E7A321AA29540B106F0608E7F1DBDC0F3838BBA332C2E6684F76B492B0E450DE86A37A781B8A3484AC22A790D507602E06CCC3CF581152553C46E37BCC721FBEA00368C4762E58C190A019CD2ACE3F8A7A9BC3A565EB9041524A5EDB10DD5AF5F0EADB03E39284F90B88E7FBF74618FEA945E8E0EC7CEAD5F6EF0770B735D9830A7AEB1A5D72786F3BDB6FC3F5C36993BFE5A5A967B79D2DCA306490E49B72FE79C69EF3CBE7FA6102B0BB69D75F01B465324AAC7D3F983BCF2F9FE98D90B2922AC3D9FAC68B41433977F7EFA41DE797CFF004C2BDEFF00DDE9FC4690779E5F3FD3077BFF0077A7F1041DE797CFF4C1DEFF00DDFF00B7F8820EF3CBE7FA61354EDFC2BF602364A789EACD0779E5F3FD31AF7C9F6FF88DBBBE7E9FCC6C439B88F9FEFEEFD4EF93B7D7F1EFE8777CFD3F98D9DE797CFF004C1DF27DBFE20EEF9FA7F31A1E74880047BFF7F77BF1BA5616682DD75DEDE1D3946C257158DB5D23477CAFDC7E584D6B147A0D2F58C19453737E5FCC1DF2BF71F961B4D582181A8F7D6DBFF9C777CFD3F983BE57EE3F2C342B0297DF97A467BA3CFF00F1FE63053E411336BDA3DDC87BF7F9DD25AC121D85FD9F7B987B87965AFA736E5ADECFA6C291BD1526264F283FAC18BDB96DD670EE5A81D6A40F41F6DA1ACF0CA524835A00DE1D7DD0DE1E32EAB090EA9C850013E76F416DB7999185E6CE4CB492685A8747E5E8C7C7A9232E1398F01351F5E54EA75B0DCB830EB398AFB9694942B69046E4C6FB72F4B1D84E2AB9866C25950E2B3EA69F5B830BCCC28C2A4A8A5D22E35D4BD3AB51A879C7AF1F46476448CBB506AAED873A60AE9F45B0C8A05BA8FE5BEACC987183DC2D4385CE051495168AB84DCF0918F2C7C5CCF138AC6617042710A9F32810496E1525DD999F623560E6392F6F730E14A422812E082DAB114D7D1AB1DC8ED0F3DA8CC01AA5A897C3D505D24C12DADD25B1E8106398F9E3A176170A0612495A43290928A6C056803BE963778E32B9C66CCBBD89AB35C6BA077F60C74B35CB08FAE665560F829928537D09524CDCF9CDA37F3C774CA25F1CB94959AA8B35ACD46B7BE7164C94913D079BF4ADAF5B1D9ED1E52FB4464FDFE7C3374B453F5D5A8A951013DCC004AA204EC27DD7225AF6B72A97230C6680012851240D838ADAD4D3C418F4B763330E094002FC3C20279F21CA9A56269EC6DECF755DB57692DE719BD3B8D688D34EB1519F5538DA836613DE52A5B240539C4E37C2AEECAB732236F36AF1789C4632749940A8A14A4F059DC900BEE967E64342DF123B649C932D01C0C4625244B5F13997C20713A6B705803F68F6FB5867B414D449A4D30DB6C65140CB3454397A385A6D80D212C38E0042412E1471EC08E66716DC932698A4A3BF509D36A56BE009245481A03C2081AF8C790B3BCED59A2D4A2A2788927E67A9F0346B68DBB88A7EBDFA948A6A075E2E97B8D5C615207F5904824089237D85F7C749CBB048C3CB0A609006C03F2E5E772358AB8C331E337B7315BF95A8FE74FA0166912C8492424889EA46DB7BBF1EB8F9E17600F100F4666EA7C5EF5F288500A8B0ADE8D7F1B53F8BC735110DF88CDE4498DCFF00BFC6C70BA1249568295677A7BD7A6B0F91FB46DAF99F7E3CE1BDCA869BB2943CC4EC3CF95F0E048E20DC26F7624BF4635E45AF4BC2D2F5F0FBC3555674C5288E3038A440316E460413F779E1EC8CB5534FED25ABE760CFA3F37B429107CDB52D3F8BF9824837B4CFC763F9E2730D92A8B320D69635E9A75EAF04416B75630DECE01320F8A36EB16F96DB6E062C586C8944370D9AC1BD9176822B7CEF5835E387881B59663DE27E079F4838B1617B3A5407FB64EBA8FC0D18736171522A9CE75F268882878A839C5278F6B7207CE2E2201F8DA32DECD93FD8C7667B6946D3C2EE758752120EC0EFE6FE240F467115A671DA72A15E3277FEAB917E9BDE79F2EA316AC1F66C3B775E36D6BA1FF3CA1D7766EF417A796BEFC62B2CDFB4B528A4059B49B28DE3AF98B1DBAFA0B7E03B3A97004B1B540E4581F7B883BBE7E9FCC40B31ED21609FE6AA6FCF96DB93B0F889B8E58B7617B372D828A45A800B026DF6A3F283BBD5EDCB7F1880E6BDA22D6A49E3322608519F7FC7D368B62C382ECECB485120076D07261EFCA1D4990662598902DB68EFD6D5B5DF588A54F682E03016444C9E237F74DEFE9CBAE25E5E4726AE0519E801D7EBF5BC3B4607899C585E94D2BCB93B1D285E2335FAFDC25242D5378854FE16F8F94C61F4ACA248E2F901B7BFB5A9CED0E118124B3160EC451FA5DDB5F1D5CC313DDA0BB1F6951E6B2239CF3E43EEE7B3E4E572831E00FD03F88F62BE6E9182A5BA51ECDA86EB4B6DAC256FB4170714AD5D6E6639DB7EBE97E507189995C851AA1236A8F1E5B5FF00C49613046A120B16D0D3C079DEBD6315F684B93C2A23A78B7882791F593D37C6BFE8586994084316D05CBF5FA91E10B4CCAD4BA10C3A16D8B57CC5DEED0A287B45524A8A89266DC47ADA0123E406D1CE70CB13D97C3AC1696914E87C75E5ABD9A239791A89A21C7420F236D1B6D46D49053F692E0825C36123C4444C6D1D3AF2F7C62BD8AECBC9493FED8A93A0B073BEFD234FF465A2E867DF939DBDF9C58DA1FB69CFF21CE69F30A3CC5C6F2F60CD7B4A76CE050F04052A41046C07AE39B76B3B12314852E54BA804D12FE4E29F810DE7E171185FFA61418559FC3E97F5DBD79F679EDE721ED4B4E2F2B5BB4EBAFA1427FCBD4703BDEF112A52781C0526C0C883B89F2F2C76BBB3188CA718BC4A50A12D45426F0F12598302E19DC81EA4BBC664637168042CA9C7ED279173E82A5FC6C6211ED05EC5FD8EF6F34B53A86A6869B27D62FB6E062B2999534961D424A01532C8432AE30126E39CDC9C55B29ED563F2E9B2A4714D0994AF91456A20825ECEF4A569B522F3907686761DD066B22614858531B17A136F4D2D1F3FBDBE7B16F69DD8B66B5B555197D4E6FA790E38B6736A740290D4920965A0B518102FE64ED8F55FC3EEDF2E709427CF73F2D0A80A0E4588B5DAFB4769C97B41829825FEC4B0058904F3E95DCEF7D7A8A288BEB7FBB2A6CD3102A4B80B6A76491C3C0B852784C8902FF7F72C56792B1F2E5F7530120025883B0D2FE4FD0459B1F8A938896832F84D3420B16E54BDB61CA836B596BEF254BA4506823ED490663A027D4C6E27E0C462D540FF00C5B9357CB66A444A4A6BC49E2F13F57A587AC25356DB84B1C10F3261D5DC8513B1DA3972DF0A8C4059E151A8F7A795F96B0290400480CAF6C418E7892398FBFEEC3842B436D3DF38D638E34FEFF7FBF8E09EAE1A055C69A8A751CAFBC2339C800549F4B17F4838D3D7E47F2C35756E7CCC36E156C63052A6209F3DC60E23B9F38D822EEE36A8FE63193D4FC4E073B9F331B700DCFA7E23893BCDFAE14429C313516AD5AFF98510002075BF898E64F53F138DE178D88544C920F52795B9E08233E3FF0057FEEFD70411A9C50312A077DCFA6364AB85E8EF046B91D47C4632A5B8666DF58C100D0C71C69EBF238653161CF0BB9B9FB0F7D231C097FB69F9F58389279FE1F7E1BA95C2D4778DA3153894F39BFEFD7EEF3C204804026A6D12B8295C52D4793F3D5AAFB6FE5025C4AA6F11D7A47FBF21E587D2940DCD2846BE1F6E4622B152DA6B58F139A795B7F1F1854CBCA553BECB07F9CE29A09DA7838877963D1336E97E8434CD279972CB280614DDF6D77F41B44FE57212521C3961CEFE96BF90DE2CAD11D9E56EB3D6BA7B4BE9569CAB733CA965B7D2D712BB94214D97CA8DF8470951B91B475C714ED3674B9054429E8B7AD281CF8916B78C42F69B132B05879B3967FE98A21DB89C5F9333B7F88FA71D1BA1F2EEC7BB2ED2DD9BE5DDD8464D445DAA7109E15D43B5A94542D2FA8789D2DB8A504F78A5445A0638263702ACFB30398CBE2577B31248539E012D4051D99DAA68EE5DE3CB9DA7CE5599E2169E30424B30346A016D19A95B13D280ED12B920BBC3037DADFB8E5F9E3D25D8BC29461A44B218A529141B51C7A73D0EB15A929E250043F3A8FE3AF5E74E9EEB4A9A9A961686CFF97593F58322641F04F337FDEF3DA3072132C21668CC40B6C4DBD0B3F8D22C980024A9045DEDD341A1DF5ADB9F5AB3EECC737ED773ACAF43E594AA76B5DA81F5D7D081C2DB0161C27880013FCA0660824CC620BB699949565D352A58480929248A82CD6A12E6836D869D3320ED18CBA6226B717082C97672CC5DDEDEB4A47A59A6F46699EC07B39A3D21A6BB953ED530FE24EB690971C7970E14B8BBA97C2A2A0029460898031C3723CA5588C54C9BDD90952DD2752E4FA1BB18E71F13B3D9D9BCD413314A751700BA458000025B4D2BE51535766C336A779E71C2D8E2528A42A2E144C5A01B827F738EAF80CAD322585283300EE0FDF6D869AC50B01835291C641552A1BC286A5CD6ADF688B5255E699857D0E539334E543F50E16D4B00A8A1054028F1198F099EBE9BE13CC7304619052080002545C0B57EFEC98DF1BFEC8370C0B1EA79EF1F44D599B06F8A1409B990403F01CBDC7A63C0F2704EDF2D3A1A7DF5BD3CED570160964B0B33B9D6EE6F5D0D623CFEA0201957853360A173EA7A749F81C49CACBF8BFB0BAA83A52A08FB3E95AC3A9648A58A7EEFEDE2119BEAA5B6550E0000330AF97BA44ED89595969424012DC9D83F37B86FA1BEA216439249E515C66DABDE723F9974F15F8C017FC081F941C59F28CA8A93C4B450B0A8634B796AC2FAB43897AD36FF001EFF00115D66BAA9CF12BBEB9FF501E5B4CE2E584CA40E1025D68CE9D5EDE15BB7A38522B7CE756BA8E187C5C13F6803378E7B9FBA05CED68CBF264A81E2410A1A33F859AD6E45B4822ABCF357BDE287A08B9F1CEFD2FF00BBF5BDBB059225212D2DC3683AD0FB7E71B702B6FA7BD62A9CE75629453C6ECFDAE63EE9B7BF7E569C5A72FC88DC4B6DA9CEA3EA2FB50438929A07A359E807F80DE25F578ACF39D5890170B060C9F1794DA0DA3AF2B62C786C9549209960100B16AF3EBF53AD1E1D3278801CDEB4B1D5F9457F5BAA42B7546FB99F5E73E5EE3CF13D83CA8A6BC35A0B0F7616D3D236128AB88814A01CBAD7CAB110CC352A49278FDD3B41161F1B462770F8166052DCF98661AD799D6D1B270D3174483D4317EB703EBADAD0FABD42924CAC9898FC7F193D3D6EF84B12EC9B5B407C7A537E91399760560FCE926C6FD5E8DF588ED4EA049264C0E809F95EC363E5EB8CFCC5E9C3E47EDB0F11B44E8C18FF00800598354B02FBB56F6EB0C5539EB64595224DCF53B6DFB163E8BCA510DCB51CEFF78729C0A890C9A0B8E5F4F426196A33C499124474371D2F3B1BF3FC70E78D2039142D473714FBDB9D2242565E6C12E59C6A1BD2DA1DBCA10AB3D42448541E927EFE7D7E1E9889CC3126590516AFBE836A6B68792302A4129281522A40617D06E7D884ABCFD06FC5D058FADBAFFB88383098E5310A074151D37D696894465E1403A59DF4E85DAAF4BF95291827512533E2DE2F226C67A72F8EFE5896FD5CB2E4ABC1DC96DFECFF00430F539525491F2D1F6E9A31F4DFC21C58D4C9060AC587F76FF1E436F7F9E186266CB268A07AD3DD8D1A8FCA345E512D4E38452C680FA5AAC34B9B80F0A1DD48B7CB6CB5545A2E1E2212AFB7C3732418100409DF60271B60B0586C64A9826F0BB7F7355DFE82953E1568565F6764E2524109046E2F76F5DDABB3B45E1D90F6D59AF65FAE74C674CD538DE5B515496AA9A4AC94A8712199589200054771CE4440C716EDF76330D8D973BBB48527866592E4163C24B6DBFE1A2BB99F65F825CE32D20AD0C50281F7A1342351A57768FA23D3FAEE8F50E52C67678174599D1D2B9421A70143CA0CA0BA12EA0C24A566E2649B6FB78D732ECC8C1CF5492C67485AFBF510C500A89438B971CA976D4728CD26E232F5A9402801448E86B5D1B5EB09F3BA4A0D4794D56599AD15366F4952853672D7D0D4A12A0413DFB8951E7C5BDEC0488C2580993707353370AB5226CB219692A2363F2DAC7D0F8B7C376DF1386F912B5914043B352CEEDA72D6D1E457B4D7B026579A22AB56F66B1455680FBF9A652CA09EE54428B612A5101CE2B93C22D231DCBB19DB1E2C47E9B315AA48584893314494CD61F35E8963E7E11DBFE1F76B55994B28C54E60867E321C397B93F6A18F1933ED3FA9346E775392EA262A68D54EE38D82E34B4F1C122764F9441FC31D7E4665865DA7A58B310417717BB01D2ED1D725E270B8948326625445569E214DB5AF3E66CD0C2BB2D4509841D9569579C1B89F3E989595325AFE64A817A82FD5CFDABADA14490A6E1ABBF266BDF6A3F3318952809260752001F18C48A1429C25C1201FF27AFE6374A16A0FC247DA39E251124C03B18DF69823A0336C693663060A7DC6EEFD5BA78D1A1B4F42812E0823F87FA3FBA16FEF3F03F9E1AF79CBD7F886D19A386F2E7C41FC4E0EF397AFF118248B07F168CFC1FDE3E1FAE0EF397AFF00118757FC7FF708E0C5A140CCFCB0ACB983E67F96D57EBF5F778712412412185697F17B681B9BED0614EF11FF00210EA30592220F5FC3005A4D8BC11871ABAFC87E58CF1A77F43F88235B8A55AFD790FCB194CC4837EB4351FC7DE0626C1E35F1ABAFC87E58D57352A71C4035BF1BE8C5E33C2AD8C1C6AEBF21F961B19A80402475766E55FBB46785550D7BD469071ABAFC87E586E66A058BF4FF00107028D924F484EFB91C337DE4C7E42DCE7D3E1ACBF98B8AB5CF33FE6F13B9620095338F67B59B938AB8F1BF5E1A58292A83C3C88048313E5FB8C3DC3AD0A04715B516D4D9FD4DB7DE131692A9C78773EA691CD3D6770F21C68F12B8836122EA5170F0080249B9B002FEEC577B418EC361A5AC4E9E94382CE41AED7A7589AC03C994A2B7400E5CD2EFE4C1EBF48F7A3E8E6F6776345699A8EDAF545377CBCD508569C66ADAE175954A997D496DC1C6012B064A40D88240BF99FB5D9B4BC662266130AB3314E4AD601646A2B6214C4339357BC719F8979E61D1226265CE495F0AC04822E6FAD68EDBDF471DECD635D54CCBEF39C6A7F89492140C22E52090792488BFA011675D8DC377C959989F9924740E59DB9D39EBBC799F2B9B37158A9EA98E47112092599F4DF537D183523A8DDA1E624878070126E52140F3F2248DE31D8F2859C36265A00F95C7CDA50694B8DF6F4B3484CB04592CFE049A5FED58EACE66E56E6598D3E5F4E14E3550B536F250389416AF0B648124788CC8F59C75D562F0E8C119A5680A12DDC903FB7AEFE3A43C54E4A40F983FAB83B0A57AD393476BBB3FD2947D96E987B31A869B5EB7CC9B0A69E570F1B6D90AE6652921856DCE23CB1C4738C5E2339C6224CB0A5E082D42600ED34834622A38540EB51084DCC57292784B91600DA8F7E7CEB7E462ACD4DABB8D150D3CF29FA97D64BFE22A83C44F224589D85A05B962FF009065089694AD6809A07040B01D03D1EBFE0454C4AF309892B06849AFF9F16D7A308AB4E64F543AD51D38528BEE04F0A012A32A8FB224989BDA7CF699EC7AB0F8794A485A41092087A58D05583EE49E82D137879587912C82B4A484EB4F4E7AFDEE3B71A0324CA7B39C85DD4D9C3487330A9642E8D2EC071B54113C06542E41F1016EA231C4BB478B998C98B9387515842889894870E5CA471015E6DCDF58A8E72A0E4CB75036367AD2951B1F0E71EA36659C3664717226EA36B409F3B728F80C79D70B8304FED776B8DB6AB0A3176A7A4457027D9B7BE6F107CCB3B4240FE6753BC7A73E53EEC58F099792DF2D000006A907EA6F190902C22B7CE73C412A973ACCA8C7BBAD86E39FA462CB85CBC10029034FEDBBF852E06BCF9662B7CD73B6FF00E6708BDF889B6FB6E4F945FE3369CBF2F649E14072DE7B6D7E5CBA64122D1566779F24154BA45CFF005284EFE7602FCA716FC1E0520A4140AB68C4B7416FE3785E2AACE73B4A88FE612255038CDA796FEF91E96DB170C065E9FF008245051ACDFE75FB42E00141158E739B83C443A7983E237F2EA4F5E5E9B62DF82C024B3A053560341EB6A783C390C34A569FE7D8D22B8CCB34E22005A8913FD47DFD63A927DD6C5A3078364FED1A5C0AEC341B523632F8806A1DF6AF8546B6B59E21398E668F102A207A93E47FDF9CDE263139230C90015005AE1AF571A3736B885A561D45882E353A9D0F97D1A2179866215C30AB09E7FBFBA0DC937C3F972E5D59228D6E4FF4899C3616CC1DFCC56C2F7BF880F678BD556A493E283CAE679F39E63D3A838708968AFCAECD7FC79FE22730F82040743125EBC98F2634B7DA2355B5A2D04F393227ADA39F2F59F5C131080C486BD757F7FCEB12F84C210E079816F5B753E42D1CAAAD4927C4444C5FCAC664721333CF081084A41201B87B52A3EECDAE9AC4A4BC3970C97DE82BF5D343AD7AB2B95A0920A8DB7827693EF883B911E778C375000B00DAEB57DE24E4E1C16743BEC2BF47DB7E621ADFAC499B9F333063CFE07CF7B73C36529CFD044949C20D45069F9FC56D48697AB120024DEFCC47BE08F3933C8F48C359C0177AB3372B7958F9F3112D86C1214DF2D587570D4E74E8FF00442E5724EE7AECAB7C41836F8C0DF0D432052A0BB301F514F7E4F0E0827467AFED3F47D377F268D06B5226E62FFD5D3ADBEE9FC7092A72C502BC341CBED00904101E96A066F0DF95631FAFA3FBA0F3F10FFB8619AA6AC9352DF5EBEF946E306B0EC0B1F3FA1F6F7731C8CC9C410A6CA890A489E29DCC6F262660C1F29BE1D499D3112661130A69A7FF00AB4E5BB7285E4C8293B2B6D4EAD7D6C29E178795E7EF32FD352125448E2124CA4C05483CAF04411E5388BC2AC4E4E204E50997FDC1C6BBB8BEBB6B18C6E0FBC94A253522A6DB8BEBAED6D35F7B3D853B48675CF616F69872A0AEBF43A9A04AD654F2BEBF54560152CF11802D72074DA3C87F16B048CBB3999899008566055DE84BB204A0424DDAA7616F5E19DB0CB9284CC1DD8643906D777D8EB4D43DC388EE73F53DD17521C238D2D917327853248827DF706200E58E7FD9A946609CA5FCC0115218D497FBB694B6B1C52661889A43317A0F1AE8CCCF7F5668462B5AA94BE92E250EBC9E14154149004282C2BC2AB75F4B5862CAA966594841E14A4BB815A9A310C7AB1357A6D3B976327E048EE96657135412051BD5998E9568E977B41FB33E8FED432FACA9551B0CEA1085A9AAC6DAEEC2DC8241212128E82E637DE3172CAB1B3414A16B570822BC44B5294EAD6148EA9D9BCEF1699A850C42810DC4E7881D0821EA2D7E54263C32ED47B1DD57D93E78E51E7D46F399754BAE8A2A94A49404B64CCF76088129E7BD84CE3A9E513E624242A605022F4A027ABF9B78D1FBC6579948C6C994A03BB9881F3077EF1D83F2D49FADE295A97EAC3C94A877F9783B240494FAC4AAC79CFE38B74B99C49705F7B78728B8E1A6CB5212A291C400047A3697BFB10B6A54A0D30524160825A47347F749DCC99DC635984D1CD4DC56BF6D3AFD90C7250B4860C79ED616F523D211779E5F3FD309C45F723979983BCF2F9FE9820EE472F330779E5F3FD3041DC8E5E660EF0F43F1FD3015F06F5E434EBD616932921DC0F5FADF783BCF2F9FE98C77C79F9085F813B7A9FCC6D6D60CCC8F98FF007C67BDE6DE03EC0C1C09DBD4FE636F1A7AFC8FE583BDFF00BBD3F883813B7A9FCC705606D7F97E18D173096657A7F1070276F5309DC5EF3D2E768F86FF00BDF6C20B5AC10CA6E97F1FB78C1C09DBD4FE6908DC73602FD3F7CBD39DCE1098B5503B3BBB787BFA343E4A10003C21EF563EF96B1A7BCF4DFAFCBD7F71867DE2FF00E461544B4D5C3F5F18C915612B4B0A00A5E07895BF08489B1DC7388F2EA313D96AD3DC4E2B2EC9BF817EBAF421A821C7767BA584001F9B6FCE8E5BCABCD653D638D52D496480C01146540492490F44DC93CA7D4621F058D299D89055F213F292435C92D7F5D7AC43BCA973E519A38A73FF00BA384B00FF002B814A0A3B51E3B8DEC2FECA99AFB41F699475F9952BAC68FC96A13575EFB895772BEEC77E80788A64171B22C48B99118E09F16331C415BCA9EA425D99277236BF4FF10876B73C9383CB664B90532D66529D8D5DAE37F5BB347D2566ACE459464747439486D8A2D3B4EDD232C3490DB4A84A5824348E149BA249E1266E2F3344ECDCB993CB4E05666A5C2D42CC28F7771D4D58E823C2FDA2CCF158DCCA6056215313DE2800E5AA4EE49F7B33F5DF54E6EB8AC696A5292903EA4493BA812E45CEC771CA04473EABD97C0F77317F2808243B01536FAD35DE25B0525326425412028A4540BBDDD869E1CEAF1D4BD4AA79CAD577854E3AEAF8384289B1302C081CC63A2CB97C3502BEA1ECDAD7946B3A62D36253F97DF5BDAD6BC4FF0046E87C974851D46AECDD095D654252BA143838B8080428F0F885ED123716DC6196267E2B153C60A54C5140FF00ACC4D033A40635714A7A43513660209516FEDBD77E5E3466F3AFB5BEBDABAAAB5B8AAA4F0BD2869A04029481C205B6111B798E47172C97279328213DD5989E20EFABD5CDFC9CC399438CBABE635777018FF9B7E628DA8CD5FA6A9A879F052144428F8F88AB6481B9E298117BCDB9DA31F3118390C964324D2CE4793EDE35AB449A0A254B53258B3123EA29A79DB578EC5F62FA169DA655DA1EA767B9A0482ACAA89E07894E5D1C7C2405D9CE1500A4911B5B1C6B3CCD2762710BC2C89C5D4A214A497084ED7209507E8F6D62B3996216569E0511C2EE428B2AA34D18D2C1C72BA5ED4B582AB2A4B752F0352DF185F01E068B51FC901B443638500030395E0EF25906070E129946582054F11E2249A92497275678DF2C96AC4CC1DEFCCEC2D7DA9A7BAB47A7398E70F193736EBBF9C733EA71C070F80424B82E36236A353EACF488A880E6F9CB8024827C455CEC4FEB6FC37B59705824A883D2B60343D6C7AF8411586759D3A4AE144EF107D79DBAFCB16591854A00702D717DB4E9FE5E8456B9A674F447113B9224FDFF00B988E718B3E57864872A0030F1F3DF716A1DA08ABF3CCED7E205666F249BC91B7975361E87168C2E141F9A805399B8F5FC5E1C0B0D22B4AFCDDC528CA8AB7BFCBA1E7BC7C3171CBF0A1D23CDC374EA36FB5E1C457B9CE6AE78BC44133CF9413E9713B47A8BE2E183C325213C4028D6835DFC052DA6F0E694F567AF2AFD6D5B30AC0AAF3270932A3B9B5F793E5B5C6DCBAEE6691204A161A786DF6AECDCE24B0B28299D2C28EE5F99DEFF00E221D99662ABC1379FDFEF97BB0BA789C7FC6AF67D1BE8DB8D1844E61F0A82E05D2CE5ACFB575B797488ABB5CB502788DBD4F9003CAFD473F52E258357B166F5FBBFA44E61B0813C2281CD9BD7F00F8F363AAAC549B9136206DF21E7D37E4230E25EBE1F789B918349BD5FDEFCBEBBD63B5B58A004DF7D89E73F8FBAFB6E71ACE7E17D1EBE9F8898C3E112970430A5BC1B9F2209D22355758A13722D37BF5F311BDFD6D866B24853F2AEFF008689195844BBD850F9FE34DACED76572B172649E7FED37EB1CAD6EB86EB511E3AD0337F1D22570F84492C19C5E9BF93D18E8DF46B7AAD706E4F99BFEEE778DE2791C332A7B519EAFEED5F331232B09562001FDC47E2A3D37F16A76B166209833FEFEF9E7C8FA0084F3ADDE9D29E147B5BAD624B0F87482DD34D6A7ECC2D4840BAC50E7E637FBF7FDDB0CD4585013BEDFC7AFD8B93246C0F8FE77FF00309CD5B9D499EBFBBE1B295C2D4778D3B87A801B4A0E9BC71F5959DC7C0C7E1FBDEF11868A5851F95C0AEA7A7DA36EE696F17FE5A394E6A9A675A6D6990E104C9FED20F4EBEFEB6B1CA56384D6A4100877F3B4389785E22549B25B89CEE5A9E76630B9FCF1B72AEAAA026F4C1A4A4F4E301260F381F08C3196BEED6B06EA2C696B8F56FE443D9B81FF00648201E204A74A01E8F53FC523D2BFA35BB42A9A3ED79DD089528D26B3656E38893C3396D2B8F24F0DFF00A86F1EFDB1E68F8D5FED6265B31EF2CCDA33B120DF61B3B35B91F6DB2CE3C0CB9894022571F78453767A024F87D80F65AA3345BC8A9784FF0025F2D4F203BC2D816E97001F2BE39B766E58972C922843B7A9DFABBD19E9531E75C5E1409CB61AB721EC6C776A421CD1EA7A65B2CD538A692B0141692641226D11249B7A62D2A962600B48D6A0D486A539D397DE22F184482962ED6E56A6B7BD296686CCCF35A814BF5653519790422B090547CF8638F7B46D3D4E24F0321226898872B49A2743B3E9D4B1D0522C790E3A624A4034357B7997B5AA0F8C50FDA2F679A635E64EF506A0A269E67BB7050D52920AC29625644026CA20448C5D7018B9D2672552C711769D29C86164D5E828FB73D23B6F67F305B25894B70B58B9E7F4FB3B478BDDB876059AF66B9B55D6E5090F644E38B500784008DC40512AE768131E713D0B0B39D20A4B12016726BB5437D368EA981C72D68055FB8332874D68E695AFDC47565F0E25454567854480DFF6116313D4CED874B2EC742EDE7FE2260CC33D22E08A13BFAF43FCC2793D4FC4E348D7BBE7E9FCC127A9F89C10777CFD3F9824F53F13820EEF9FA7F31CF12873FC7EFC11B253C2F577F7BC1C6AEBF21F9608DA3636A55EFD3A79E0823671ABAFC87E58208E0ACC1936E76FC8608212AD66E67D07EFCBF7CB092EE3A7BF6FFC9089D5ED373CC7B87945B084CD3C7ED0F93FB4468EF0F41FA7EF9FCB0CE1697AF87DE32EF9A292D287F39653DD1BEC3EDFA0E107F330061EC99A65C998016241A72A8FE3A9E6625B0D2C2A5AA81D85478B136D5A96FB5BBD8FF65B9C76D1AFF21D01A7C91F5EAA6C344708E26D252E544F14720A1731EF99A066B982B0489F3662F825A41516E4F76E61ACCE763152CDF1A8CB7BC9C5026CD5823859B85835D8D4695B8BD23EA3BB30ECA329F679D0995E89D354CD53E6E9A563F8F54A10038A52909704AA24C82B1E156C6D36C70ECDB1CBED04F5E317F3617888C356DC2785742C4B91AF3F0F35F6DFB5335026C9E3539E20456C5DBC0023C2ECC2346AFCD29DC5B6DE5CB3F554A54AABB93C4B899337FB5C5E5E800C5A3B35844210AF943900696736AD1ABE768E13865FEB71A56AD5679EFAFAEF4B168EBBEAFCECB74E16A324F1269CED24920CEFCF99EB8EAB91E1021D40073566F3FB8BDE3A409625E1D054588143BBB303D2E5AE2C6231A474F36E29FCFB3B4F1B490A71B045844C6DE839183169C486366AD2A1270DFF0055640E96777BB8B546B1173C025459C01FB7C3466A8FB08AC35EF69CA0FD665A904D123C14C018080278AC049B89369BF3C59727CA6505214AACD5B152CBD48D2BCE97AB54E911FF0032A610372E0B7E69C9C9D7668EB56679C3150B5666FD4AF89B51286A1504A8909E703CCC6F36C741C3E01329085B86E9771B796AF1278595354A1292975173C2E03B03F40C6CE79C5F9D88F6655FAFAA9DD5FA9804E89CA54D3956490429464538213FCC82F2520900FB86397FC46CF93972A4E0A59271789E21264DB88062B3C4681857573477A95F1330A2539D010B5731403F9E51716BCD5AE53D4AE9A8DB0CE5D4AD7759751A2020B696F84ACC40160177124C9DE71CEB08927854A24CC51F994CC5CD5BC2D7D3668A8E2141732D47A5F91B73B56DE71D1BD55AADEA9CC2B180F29D430A90E99F171924A6F061311E62F18BE64E966A1040AF31E5E0E6D5A6F7EECF6010532A610FC676B358D29F4B47CB3E3F3111F6BE0C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C1041820830411FFD9, '1', '2021-10-06 01:15:26', '1', '2021-10-06 01:15:26', b'0', 0); -INSERT INTO `inf_file` VALUES ('26193c15-afd3-469d-b55d-eb1aaa2a4b63', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F0000010305010101000000000000000000000304050206070809010A0BFFC400431000010302030603060406020104020203010203110004052131060712415161137181082291A1B1F01432C1D109152342E1F13352620A172472164325345392E2FFC4001E0100010403010101000000000000000000000304050601020708090AFFC4004311000102040306040602010303010803010102110003213104415105126171819106A1B1F0071322C1D1E132F114234252081562161833437292A2B2D224258234FFDA000C03010002110311003F00FBF8A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A0AC4C7CF97DFD89ACEE920903F71909243FB3CA2953A948260E5AE5FEFEFD29962312647F261DADAB54FBB46C10A2D60FA966E70826F595BA5941E25A7FE44A4825BE9C63513CA69A276A214A097A9E03D63265A85DBDF46841EC5AD187C5BBCE0696AFCA56A0904F2039FCAA524AC4D018D5BEDC3CFD886932709658834BD0F0E56F3CA1E22E10B820183A1EBF4CB9CD6B326196A29A1B6B623B74F38525AC2D20DB510B05054C4E5D684CC2A6602BAFF71BC7B4A07CD9F841149580633FBF5ACC11E832268823DA20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20840820C73A5029934B8D789F7DA140A64711AF13F87ED142BF29F4FA8A6D88C289E0920391507D9F66D0D558B097A0245BCA9D7FA363108D34DDAE2172E38BE137E13C0A0608F084104E5F43A193CEABD8AC18C3106D7A5E95AE76A59BCA1791395398105EC3ADBD39DB268B6B10C5F0D18A0C3577187A9E42B5B958372743EEF3D2069A4803AB0FFBC8C2AF777C066624B736FEDA9A44C4BD90B9D2BE7192B552C843AB3A97D1C7F717BDB3ADBC96D6D2925053970E900465CEA6F0B8A18B97F31DC9624FBCB4F60464E90642CA14929539704311C0F9FEA1FB7CFD3F5A9295FEDEBF784614A710422BFCC7D3E828821447E51EBF53441155104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104450C4D92F5D301B70BD6DC3C400FCFC63FF00D79E70067D09F4A6EB9E106B400E7C75F6348C33B8F21786AEE2AD254C254D3E90EA5D5AD6A4C2184B492A25E3FDA08120FE99D64ED09094B93500D33A3F0B521AAB05316680B121FBD3D8EC0C72B7DBCFF894EE97D96762F197705DA5C2369F6F9E6D6CDA6016578C5E5DE18F825B3F8AB54AC38CF1485A6332248D0D5476EED793F2D5BAB4835A3874E7EFFF00F422DDB1360CE99392152D6427759C12921BCDBD75AC7CA1ED6FF11EF696DBEDE6E03B7F6FB718AE0F64E634D1B8C0ECB11BB61B72DDEBB69086C5B85907FA440209233D2B8BEDADBCBF9A425550A167CCB3B50F6341D23B76C5D8084491BF2C01B85BE90D6ABBEB6BF4AC7DC57B266DF5CEF13721B0DB518825F17B89618D2DF55C4F88A5A5B6D2A528992789526739EDCBAF783710711B2E5AD4492522A79F1F7E51C6FC6385186DAF3D2121292430019837A46CFA7DD05474807EFE357795FEDEBF78A94548585A428640F5A710426BFCC7D3E828821447E51EBF5344115510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510478639C7AD10422B70699F61F0D47D34F5A208B57157D9B3B945F38EA6D8B48756950570B2E808952AE4999091F97A647ACC06D3C4090824E8FA3D2D7E1A1830A37E72505FEA2DCE9AF5F58F9FBFE279FC5A30ADC058E31BB6DCF5FDA6D46F5F1369CB0BDB5B3713796D84A5E4F85E2145BAC3CCAC5BB8A5C990148988CEB96EDCF150C2EF8DF096041AD9BFE35B1CFBB88EBDE16F09AB1CA4FCC969992BE9282DBCAADDFAB335358F90FC671FDA5DB2DACC7769F6E318BDDA5C5F137957CEDC5F3EBBB603AF953A5A42DC3C50C9596C24C70F0C72AE57B43C6431130A44C24926E4BF06A7E7817AC76FD9FE071225A54248140C426D9E94F3E2F0CF67F1042F1861576C16BC2C4B0F36E1A4F0A045D37A13D3224E7998D6A2D13978D58512540A852F73E5435F661C6230A9C0A199B752ABB0A80457F0D7B47E871FC3C2E9CBCF65BDD95C3AA2B5AB0F70499984A9B09D73FCB15E96F044BF97B265A48AEE8A9CDC9FD7947977C6F33E6ED89AA77049E548DF55FFC47FF00A8FD2AF72BFDBD7EF14C8A58FF00893F7D29C4102FF31F4FA0A208511F947AFD4D10455441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041A510435372388A40CBA99E5AFDFCEB2C7431B896A29DE0CD5A674E9F78592E020120FA7FBADB715C3BC25315F2802ACFD9ED0C9CBC487FC208717EE9515244A13099827404C7DC56E656EA0294E1DFAF271EFAC371880A56EA475D3FA7F53A3C4BB8AB49B755CA92E04A78CF01FCEA4B73C4B039848127A0A693268403C01BE747A7EE91252A42A6B338720727B3DEF46FC47CEE7F186FE29985EE1F652F3747BA1C4DAC4B79BB4E872D1D5DB3C975FC1036471F096161EB75B8CA95196640EE6B967893C4F2113D7841FC88604B642ADF97D6863A6787BE1A6D0C74B4ED10A1F2CEEA9206F6B906D0E5FA3F1FB79B578EED16358A6D56D05DBF7FB538A381FC4F16C61C5BB8A153C494A1A7D5EFF00080A28009FC99682B89788F0D89C7854C94A2CADE2E496725D8B06D341DCC77FF0A6CC97B1CCA4CF4A545346AE547660DCB3B0E1157CEBADB8943CF5C34C13C43F0AA8599CC95F2CC991D672D6B96AF63E3913C952D4C55A9B5333F961C834761978FC0CCC37D284856E8029C297E35CF389AB3C66D117B84E1B609E2BCBABDB4E07AFA080A6EE1B27888CE55FDBD7A9AE89E1DC0ACFCB4AC97053C474ED5766CE398F8A12662672A596A1208003D3FB7AE75A47E875FC353F1AAF643DD5BD7E86D1706C6E38C36084C071213139990273AF50785E42A5E025A5A8406F795ECDC9DE3C83E2C27FEE73526E925CDEF6F4CBAB1BF41B8C2D05398311DAADB2D2433E4F5AB574EF1578ADA494A003DE96820520924E5F63CA8822B488007DEB4411ED104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104332D00B2A264F41A67FE32FB9A0162595D1F4E1EB0AA57BA8AB801DD850D4F7EBCA14CB4F80A5C6A73F21A7BE4E5A23713382CEE876163D7D3BFE60B124DC36DB82DE42AE20054E69232D46920FCE75D50C4CFDC40054ECEC1C503D7FAE1CA16C061FE6A9DA97E4C4971CEBDC0A67CC3FE259EDBFB39EC5FB88C6714BEBFB556DCE2B66FDBECAE1FE2A3F1172E3A54C5CA92D1525D596D2EA55EE194EB19556F1B8D4A50BDE57D441662E406B1A38EBE917DD8FB24E2D7266CB42BE56F0F98141C100B0619E649D4F38F811DB3DE2E2FBE2DBEC477BBB68E5F5D6D0E23777772117854E5BB69714E78296C392B03C352444E59655E7BF124D3336B29408A28B9CD9B2CA9991C4C7AA7C307FC4D8E996DBA4245281FA50E5EE8F67DC630E3D69885E5DB1174EA901808465EE2B8444E7F9634FAE74D14BDE90D9B503BB8EB763566E8F1954F06728D2F5BFE9F2F530861F8C9BC69CFC69875AE1E20AD424E49CBEF43553C6319A684107D8D732EF607AC5870B3C26592AB1029ADC55B5C9BEEF10B6F77737FB71B3563624A9C7F6870461A08CCF0BB88DAB6E4013970A8CC0F955B3C3E80A2839EF0E771DB8F7CA29FE22DA0942561CD942EFADEE1BB3F08FD407D92F6311B15B82DDC60086FC216FB3D873E5311EF5D59DBBEA310352A24F53CEBD29E1D4B602506144E5EC97F2C8671E50F13CEF9DB5710B705D43EEFC3311B3496C01CC7C8F79CBE1FA54FC57615A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828821B3AB4A544150062403E5590905CD011E777E30DA62941C55893AD2A1BF5E50D9B7D2B497152809FEE5E49CF2CB49C87AD68A9852145C80900DE9C857B3422941597DDBDC900F9FEF9B461DDF76F3F04DD76C3E2FB658EE256B8761183E1F7777757172EA5A014CB2E38DA10A5909E35A90123AA8819CD56B68E37702885391966391F7CE2E7E1ED9E274EFA9255660D4AE4DD6DC5A3F385FE203EDABB55EDABED378B6338BE2574ADD8ECF623776FB0586B8EAFDF2CF131882AE995294C90B7590A64B5A82273AA06D0DACC6602B2581B9D41AD4F1AC776F0FEC69625A1210024350240BD4F0ADAD6F3D78731F17984B16E2C98B661B9485787C172424812AD358907A6715C7F6A6304DDA0B50373AB82E38687DB978E8F2D230F204A14614E1E61EE1B90E062C2C57690DBBA96D0C85DAA3881E24CAC98911CB23CE3E4269D024CABB535A6B6EB6CDEF586292A54F05A84E560F62C5BF3E916A0C4EEAED38A5DB07C312C809320E796401CBEE2273AE624154FB9626CFDEBE6F67D4889C4EF26428D430A87CEAFFDE71B1BEC8BB0979BC6F68FDD0ECC23C172E6FF001D6AE5697412829B2B862E3300124808300E522AF5E1B96EA41A0A8E6DEF8DAED1CA7C598B32BE692A20310CE6F4635E55E01F48FD46377F689C3B63F666C4A63F0B816156F0065C4CD85BB6AC8F29498AF456C30D8443061BA18767C838F7C4F9DF69ACCCC5CC59B93F97F26CFA45EE1415313975A9B88E8F68820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20886C47F0E9429D5BA50BE24C4A8246640239CD658B3B75E7EEB5F36704952C92029B32C481D7DB72A431C582DF612CDB381B6D0DA9C7DCE284A5284859248D321399023946551F8A5A82083762E03B3694CC8E76D042D2A484946F060E03666B4E6072CFA47C5B7FEA1FF00E2238D31B43B3FECA7BAAC7949FC4A710636E6F70FB950FC280843F68875C657EE789EF27FA91331D6681B6311F4AD5BEDB8F404125EED99E3766D0C749F0EE1C26624A430514F61A7A91CF4A7CB7EEEB0DBA432B6F197495DA3AA7B0DB85A8F1DCA9F70BB7478D43DFCCE64684E7CCD722DAFB40852F749CDC3DA829AE7C63D01B064A44A416B80030D296D5EC7D488C8D7D8C97EE5618052D70A5000D3DD10743A4899D0CCE46A80B9E6662F7AE5C0B335684D1BA718B1CF91BD4614A583D2A75FCF786A2D9BBA1FD4D79CFA4E7DC8D0E43B0CEAC7296AF9391A0D2BC3F6D5A7186987C2EF4C14203DEC0D4F98D3EF148B06ED78D981C374A4C003FE9F231E4395474C4EF4D14BDDB2B135AD0FEEB689B9D86DCC39A1B162C6BE753EBC6E3A93FC19B76771BC2F6F3D8252992EE1BB2CF5CB974A20A90D7E22C8A9AE230401C439F38F4E85E1B961E58FA6AC6B7E7C69F78E03E392A499C9245281AF7AF2CDCE7AC7E8C585B29B6B3B46131C2CB0DB690232086C240CBB0AEFFB1C3615219A9CB38E0B8B24CD24B3B914E0D7B5625DBE7E9FAD4BC358528820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A3C41C6524111FDC7435A15805AFAC11E2DD4A412015C65091268F98343FBF79F9410DD37D6E484A95C0B248285101498EA279F2A3E60D0C10BB8F36D23C45AA11CD59401D4924563E60D0DBCFF001C7CA08F5A79A7D01C656971B54C2D06526323047435B82E1E0852B3045256018CFEFD68823CE31D0FCBF7A208B571E6FC4F01A09754A5AB88140948E15030B1D3A538972BE64B52B78242323405C93D843DC24D4A5D0A6B356ACF50E39DB8D738E7DFF115F6C4D9AF637F67FDB4DE063772E1BBBAC1AE2DF03B2B2527F1CF5D38C396C9534DA882A0D3CB42DCE1CD284CF4AAAED9C64BC382F352E410CE32C9AEDCDB5689FD99B3558C50051541B9142E4EEB3D2DAF611F975EF2F7D5B63BEBDE46D36F3F6C7164E218DED5E3776FDD3AEBEB75C66D5178EA6C9BB752C952562DD4843892609C84015CA36EED295B8A295EF1ABB106D50E34CFBF38E95B2B644CC3142D6592902CF60CCFC18FF548CF1B05BB1DF0EDE26CC6C96C06D46D0D9A1294E197383E18FDD372EC078DC2DB0470C9CA0F2CCF4E1FB73C45829626A9588952D52DDC4C50750D031B9B679657E8381DB72B01BA161F75B7788AE763CFB0CA376B63BF8757B536D1DBDB963763B4ACADE1C454FE11789038BDE1242758C8E473CC93A57259BF123032316A48FA994438DD3D4135ABD357789C3E2BC2CD48514EEF16003B379B77D62736B7F8737B57EC6DA1BCB9DD86D2DEA1292A09B2C1EF1C591130014807FD55B303F11F67CF425090D40EE0573A375BD4BF087DB376F613133025050A0F5620B372377E753A18D3DDB3D91DABD8BC66C702DB3C0712D93C5ACD6E26F2D71CB65D93C82B82D8521C1C43887E59D4C413CED9B3F6B49DA0B4992B1BCA228E0BF519B699C5BA662A54DC2AB75988EA0B3963DEFCCDCC7D13FF00E9CDDDBDD5EEFA37D5B697765E1B7828D9DFC05FBE8E1688B861C4385A77A119647D729AEC7E1C401F2E8080CC59CF337A172D5AC79DFC7C903E6BBA9DC84A43A8B3D407AB67A0ABC7DB058A38D86D695A5423549904C09835DCF6497C3279379C701C511F394002189BD0D4E6D1209494CCC671FAD4AC368AA8820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A4AC0319FDFAD10479C63A1F97EF4410718E87E5FBD1041C63A1F97EF44115032268823DA20828820A20828820A20828820A20828820A20860F2149716EBAFF000319402A80206797CE9057F23CFDF7BC11666D2EDADBE06C1164D1BD7D2098653E249F4CF4CBEF2C41166E05BCBB7BCBA51C630B7EC9CB8570A1C71A0DA441E104151CA4C41EC2688232C5BC9654B5A85CDA3E029224AA124663A089F97C48224ECDB61A6108B7484340A884A4400493390CB5A591FC4756EF0439ADA08457F98FA7D051045344116D62CFDD61C9BABDF716D0485A52A24F021225D24682132673F4A8ADAFB59381C217207D24BE74239E55F3D61EE130FBF346B4E01F2AF0C88EA23E367F8C3EEF77F5FC42FDA8706DC2EEA2EEF2DB775B1572A6315BAB75DCA6C6E5388B4D3AE788B6789A5F84B43807101C24419AF2EF8CFE24CBC0CE9FBD3095249F96970519BEF54D9B22CF7B18E9BB025FC94277F777BFDEAFF713715CD99983F988D9AF63EFE047ECE7B90C1B0FBFDE660ADEF076990CB2F5E5A6256F6D8A61697D438C8436F36160024F1839C8AE05B57E2999C66113882778108564697269525F3F38BD7F9094C94EEAD237B2984351ACE5BB3D63B05B19ECE9B98DDC61CD33B2DBBBD93D9BB665294B16B85E176F68F909802108004981A6624F3135C43C4BE3138A54C57CC7DE2436F56A4F17A5CEBCE23B153C4C56E041537FF1121D2332C6C34F4148CB78761B6966E8559D93F6481012C7861B291119240301433F2D35AA12F18668F9EA2CF5AF0D78039641B3A4252E6808604115078F0A173C34D5A24317167736E59BE65C711C2414AC05020F9E5E5CF2E734BE0FC512B09352952EC46741AD29AF730EF67CE5CB9A3E42D285121EE120D09B7534C985E38F7FC473D89374BBF1DD4EDA6D3B3B38D61BB6384D91BB671CB7B4659B8B95B2953A0AAE024AD45296C2046931AD778F03F8BE4CF99282144311BCE456A2DABD6B9DF9741C16D4C42657C9C42E5B28109DD35B5779ED95ABF7B3FF00F4F9EEA319D90DD0EDC63D8922E16EED0DF8B5B75BE1456EA307BFB8B702559ABDC4011F488AF68782270C6C894A0E4A8249734B86BBFEBCE39478DF1BBF3378A80037C12E1C3D1F5173D6B58FA6FC25C53962CA94C9B739A7C2524A48E131307918915DFF00662372424337D3F88E233CBCD59077812483CEBC35FB448D4942505104144105104144105104144105104144105104144105104144105104144105104144105104144108AFF31F4FA0A208A68820A20828821647E51EBF53441155104144105104144105104144105104144109ADD4B7A83F7FEC51045958D5E3172EBD69E25CA1600109308CFA798FB148ABF91F77AC109605B396885975E6C5C2559C3E0288E7CF2E9DFA56B043EC6B6770BBCB77FC4B0687829E2654CB490E056B918EA069C851046161B6DB43B3B72E30AC3EE6EF0F61442129694B5F082604640E9CBFD10465CD8DDB6B2DA6C383E8B67AC9F6F272D1E4043A0CF240CF3D7BF6AD3E60058127562D5CBBEBEB045EA8B84ADA0E942900980958856B12474E7E559F9BC55EFAC11EA882B81993F2C86BD3E7419841673C6BD7FBB41082EE1A6D6B438A08298CD4400644E46B066D0D5563EEF19170FAC6B27B4DEF217BBFDDE6337B68BF1B14BE43769855B33EF3CE1BA5FE1DD52500F11084B9C448D0024E715C8FC7BB653230D3D1F308514AB76BFC6878E7DB57AC59F64618CD505252C10DF31EE4AACC1ABAD79651AAFB8ADD4586CBECB8C7EE6DED95B7D8FAD7758962A1224B6EBAA759487A3C42B6D973848568A112057CEFF89BB7277CE9FBB354594AA856A5D99F8E94B333C5FF00012CA081421830565A1F4A371E7B09636C6C4ADB45D5CBE98042DE5F12CAB55051FF00A857E5E511E47CF3376B6297356D316CFAB539D5B36F3AC4F7D6A4212B4CB3BAE086A0193529D33AC797AAC42ED4DA0A2CF810A9F1784F8E04823DECF3FBD29862264F9A1D44DEAD7BE7C6FE56B0D44909720A9943F893F4B8B3701A449B988ADBF75B425C504A4788E895929039F6323F5A55789F978420ACB806A491E76A0E19650C66CA284155537648A015CBC9F9B690DBF1A5FF0076EADD95248E4993DB5E9DC4F5E75CD7696D5988C428254582C3E6CE79B71FCC35953D52D745117A83DFEFEEF8A37C96F60FEEFB1F6EE2D9B364E5B969D4292381497429052444199C875AED1F0C36B4F9B8BC3A43B1525EFADF4EE474CAC92316A423E62D64A88A026D4AF916D3A45C3EC57B23826C66E3367ED365F09B5C3106EB1277FA4C21A5A94F5FB8E294BE0E64A8C1EE3AD7D51F84A93370787047D44249241E3566E57E4358E61E2A9E664C9CA2B5105BE924103CF37A664C6F95AF1F80DF88657C2388832248072F8D7A525A021200D07908E7A15BCFC0FBE5CA1C5291B414410510414410510414410510414410510414410510414410510414410510414410510414410510422BFCC7D3E944114FBBFF0064FCFF006A208A8249008220FDF4A208F780F51F3FDA88214488007DEB4411ED1041441051041441051041441051047848027E5D688222DF773E7EA72E5AE7F64FC48220578797AE4BFC392C8CCEA741E7AD22AFE4608B86C5AF0841CBAFC3B9ED5AC10929775F89B801014C80380998329CE3B7DE74410CADAD6C9DF1BF1366CA8CC9E3427424E79F59E9441186DD79EC1F780EB966DF87875C2D03C240842211072190939F39FAB259AB07073228FEFF0030466C2E2AE5F6024FF4D29E254130AE2483D391F856AE753DCC10A5C5C1B40FBEA9E11C013AF3CBEFEE300AB3513C6D04446216CEDFAEDDC4ACB49852DD5494C2520193D3219498AC2D442165CD12A373A18C8B86BB86E71CE5DE862973BC6DFEFF00212E7E236536023F1E12A2AB77DCBFB70A678A4F028A1D1CF307A9915E2DF8C1E334ECEDA33F0666B315021F813DC7987E71D4FC39840BC1A5652904E6CD6377A0F74BC66FB36DBB4C2587D88E06F8901034080AE14E404649033E990EDE20F16EDC4ED09B30EF05051373435B8C87DEF16642129510033588018937ADE95EDC22590A0E202D26028498D67CFF00DD51654B0BFA88CCDC31CFAD72D1ABA43C4AC001EA78DBAF0D0BFDD839289199E83D358E5D3AF5A6D8C9D2E425449A797E32CB9D32541053BB40C439D1CE5C7335147610D56E24B9075E632EFF007DF99CCD57B158EDF96B093420D34D2D5F778D9787DE946809AD49176F74E59BC535503825E2A7B004EF2AE7526A0B7E7ED158992CA66804B549616EADEF84620F68571D4EE9F1566D64DD5CDDE1AD3694FE6295DEB685E999C952794666BD1FF0AB602D38AC3929FF00720B805AE3D7EE7A494B5A84BC8848BF3D03E9D78D236AF725B3AD6CE6C060384840496ED10EA931C2429E4A5D5748F789CFE35F55BE1360BE460E43803E8431B56DC78646B58E6FE235154D9ADFC722F4F747AF2CA33D5BBA3C24F1647A65CB21CFA0AEF4A67A5987A7BE778A6243121C1E5D6FFDD216F151D7E63F7AD6378AC104023434411ED104144105104144105104144105104144105104144105104144105104505694983AFA7EF4411E78A8EBF31FBD1041E2A3AFCC7EF441078A8EBF31FBD1045054D289F7E09E522474D3CA882105DBA97F957944E4743CBEF9E74410E59429B6D295192264D1042B44105104144105104144105104144105104144109389242BDE0001CCE9FB4D1045B57B74865478B88C4CC73FF1209F5D288225B0E75B7ED1B7384E723319E47BFC7D6932824921BDFEE32013610B2D694C8022798EC7B47C72ED4990C723CA164CA0AAD85BAB642FDCF78667124A16EB5C6DFF004C0993EF264492AEDDB23DE88DFE466DD03EB9790C83968B3711DACB1C39C2D2EEED9F79F3C286587029D0498F7933AC91F5A23030E4BBB86E5EDF87E229C130379EC42EB13C490DA997FC35DA367FE46C47BC5615A7148E1035ED35ACDC12B70AF79AD406A59DDFECDC21BCC1F2D401B17E3EF236B18BEC2036DF0B412956504F200E9941D341A77E906711FEB7C904EFBB1739F063EB0A84A481561A8F67B656A44462D78D7862DDC9487149F7E3DD94107CF5C865AE50273B1E1B63CD9F2FE605BB07202AB5C855B8D78F08748C0AE60DE410DA532D6F56EFA462FDEFEF230DDDFEC5E278D5E5C22D12AB376DED7C4586C97DE41619E19227FAAA4E633CFCAA8FE2ADB523C3B266AA7AFF008CB5B82A1FF13C5A8C73CB38525ECE5CC514A6AA494BEE976E63D75EEFA05B91B0C75DD9DBCC5B1C478DB41B497770FE2D7484AD41DB745CB8BC3F816A1C4A86149078B2E432815F24FE39F8E93B43C518932261DDDF50001D2F47A5ADEC760F0F608CBC000A71F4FF00B8D0737A57FB8D87B5BFF0D3FCB1E65E408010B526100E5993CB3CE73E95E795ED799356E54482753AB96E678826260E11EA92E03B101FB51DCE629F68B92D0165A4B4B3C4A124A939A7324C4E50454B48DAA809DD20BB5E8C7F5EB09893AB5CDC90694AB7AFE21DA4CE71A9CBBE83EB95426D19D3315BC104806C051EF42C076D7ABE486247BF6D10B70EA19B8216415023DD1911F1D7FCF6A811F3503E52F7897E94AB74A7BBBF96B4AA5697BDEEF5E9D876878D02E20B8AFE93600256E7BA8CFBFA67DF49AB16C7C3854E4AA60012487F2B3D9ED71C6ED1058993BD314A4B3E82FA656E1D58C618DE4E3981DCE2182ECE5C62568E8BBBA415B61E49092CBA858E313919194E875CB4F587C3618695370E5D0900A6EC0BFDEF566A5A12FE32D60A4BEE9A0772CEC35A8B746168DD2D9CC5ACAD3F0564CBCD5D7896D6E96FF0EA0B0809653F9A208D07F800CFD0AF00ED5C14991210264BFE2960142EC2FD0DB5E158A26D2C24CC4C954E52552824A89F9819C12599E873CED1909CC52DDB70B706404E4223300F977F9D77594B913E58989C44A0E0382A0EEC38FE69DA2AD2F662948DE4A98126A74761D34E70A22FDA5E8950F3F5FDAB55AE52003F3659A904850CBDE709CCC1290F576CEDD6D6E6444A34F23813C326674923BCEB07C865A5335E325A4B0208D41E5D3386AA96A45F26E07D8CCC0AB9099046604F0C67E5AD23331E94644962C067FF00DB6F65A1B99890ADD37E7EF5B3C788BB4A92094A927A1107EFCF3ED5A2768EF16DD20D1DC0CF8D7D2174A0AC021AB50FFD7AC565FF00FA89F3CBE84D4A4A0A58DE2CC6DEC0F7D9F3F2D4ED4ADAB4E5CFFABC79E39FFA8F89A5770EA3CFF119F92BE1DE2B4BB2341E99451B8751E7F88D770F0F7D2140A07B1FBD3AD6A43163946A43163945548AD6524D0306E756E3188A0AC0EA7CBFDD227120121879FEE0838C743F2FDEB231209018579C1092AE1093041FBFF34F512D6B48506AF4848CC67666E37F231EFE21249804C7435932D42EC1F9FE23433C26EDCF2FFF002848DE278CA122549891CC489F877A426A8CB2D4347A024D9CE7FBBD28635389A80002F9BFE3D87EB09AF1065B5842D412546005644F909FD67E94C958F4255BAA0D56AD3ADF8C60E2802C401DFB33C7AE2D2525D198ED9CE5AEA7FC548C9DD9A84ADE8A7A8346F7C6F02A7ADDC27E9362DDF87115ADA1AFE2D80095389491FDA489F818A658BC6C9C3024AD34A9721DBDF0D03830E657CC9A5820BD1A9ADBFBB738B4368F78BB23B24C2EEB68F19B1C1ED500A8DCDFDC22DD8000CC95ACE83E755D9FE2BC2C956EA88E7A51DCFBCE26B0DB1717894BA10A3C0073D83FAE91A6BBD8FE257ECB5BA7656E621BC1C171E75BE20BB3C0713B3B9B90A4EA0A14AD7B76A64BF1C60104825D9EA18DBF7C62CF80F87DB631D284C4A02378D1330282868E32D7567D239FBB45FC797D98ED31FBD6AD30ADB7B9B7B72800DBB366B4AF2FED21C00F383A66075A8099F14B672715FE36ED49005BAE74EB6E313137E16ED3C3E1FE74E22953BBBCDAE9D39C7537D943DAB3653DA8F77184EF2F636C318B3C1B17F185B5BE2CDB68BB3E03A5959525B5149F7812209C88E8455EB656DC95B51095CAA6F65C3D7AE6C639FED4D953366A9495D4A0B1777ED973D637090EF124129209131D3E3156058280F43C8F2E1C620D13378B311A93D721CA2AE31D0FCBF7A13F53366FE4FF0088557F43BE515020891410D431AA54141C47B446D051041441051041441051041441142E214329313D4FEBA510441DD61FE31396B3A67F5FBE7144116EDC58E2ED38A45BBFE1B00FBA9E25089CCCC69D75FA524B51721E9EEFEF9DA1E61D28287500E4E6389F7588F5D9ED01822E675CF8D47D7335A43A094E4057AFAFB31430E5C38DDED93E034FA1290BBB57BA973881885E731FBF9D101166715CBFA3D85333990D706D8FC2BDDBEB809BABB0A2A4B8785680AE23A1226040D3A40E704614486622D576F6E7215B68F1925A49084050485240108D0002123E1197A695AE331625C929CCD88E4D41C751DA18CD413535009B8F3F261AF011497614467AFA76EBEB1FE6AA5225AE662F780533DCD337FA587BB57368AC48954CC137F74A9A30A5E18E236D6D76DF84B212E6AD9D0A888309D27400E7CE3A55F25E32660A56F95B0082F91A248CFC9F4E912180C7294A00541B8CDB3CCB665EA0718E597B6FBB8CEF0369B61B73F845CB96CFE2578B7AE54CAD4996EC1D6AEA1C89905082065067400D78CFE37F8C4A7FC994164B058A13620F117BBD0718E9BB0F65CA9F2862124013189529A841D73FBD3AE68C1997B05B7B2B266D90CDADAD95A5B97B87852A71A61B69C515692541473CABE5CF8C14ADA3B5E762007056A2146B43E77A791D22FF00224A30F2848241DD01F7454BD6A1D988E2ED17336DA5E22E3C443EB4E7C2D90A333066333D32CE67CAAB08D9EA2E40A92CCDCAD46EFC808C198949284A4A121C1DEE232F4EBAC4DDBCBCDA5650A6C1905247BC08CB31F4CCCF5A7A8C1AA8198B54E8F95B8356D0D17300A3D4E6FF007FEB38916DAFFAC18D32FD33F5FF0074E656CF35A10491522CFE8D5E5943698BDEFF00711A9B69FD311C231A6F0F0ADA2C5ECD769B397D84D95E70C071E756DDD024E454532476CF41CB28901B004C4098CE74B922D50DEEA79624CC095AC12B3BCC5CD5218656E02B7C8EB801BDC96F571869C631BDBCC5ED5974903F95624F200049309E21D08E5CA9038656115BCCDBACC2D6ADBCBED1BAD6925560750CF4008E397DE2DC77D8FF000A7AF6CEEEEF6EB789738C30B5AFC7388A576FC64CA4A5447140F9721573D81E2B56CD5A1456A1BA430701BCF26A1E1A1AC7CC595294459C5412E4B74D2FECE44C1F731BCDD97BD373856DF628B602006138B624F129012520980069198CF5EF5DCB60FC619D8308099EB1BBA28F0E34F40618CF4A672548504AD2F621C3F1D4E5700DE2FDC3B6977D9B1CD2157ED5BED132C294A5DD3097EE94F02660AC91309CBB1CB4ABCC8FFA81DA4852509C5CD01C0AACB3578E435111337092C277004A5811BA96043BD59BF558C93B37ED2EC17136DB4BB3D88583A212A58B50D3614041CD674CE672EF5D0B617C73C562952D33F124A54D5DE27CCAABA1CF38839FB28B1DC52C924B6F3B6B4D2FAE7D6335601BD0D8DC7941FB6C79AB37DC88B4B9B94204CE49080499EBD08EE4D773F0F7C42C163928F99392EA6FE4A0D5B9A97B674BE510D88C0CD4072016D3F96879F6ABF01191BC67EF5B4B8976DD76CE094BF6EA2551CD5C432939673E75D7765EDAD91884A54B992882D5DE490F9558F971A8688C560D2545D2CACF7A84B016CE8C5BD6CF5B6E069210DBA5D4670E2D4173D4714C64646556F9123093A5A66A11294156290922F46A3380CED9C2C896508B330ADC96FC5AD9C48B6E92331946503AFAC79D23895A70E92D714DD1DA83DDE82125ACB543317E3C21D0526341E801FAD468DA254A6097E3EC7BEF0D97308B5341FD7E5BEF5A4A4E994F2FF1A7C3D69F4A9E99A2B43D9E9E46F639776EA9CB0ECAAD3A67D7CEF0BA220693F3D4D616A4A5443B935157E37FECEB0A4B51525D5724FDA2BA44A4ADFF00AE83DF38DE102412634FDB2AD7FC71C3CBFF00D608F2B230E9F607EA086EE708566067CC810329FBEF4BFCEF94022CD4B1AB572311B389DF60F6C8FD87BBC15A1C600F9B5873BD1F58525CBF983EA4D746A5CEA0E82185F3B656ADA5E7DC5214A39F86614A8319CC4C1C8672396B934993D0B503BC1D4ED5CBA16032275A43D95B3D730EE84D732065760CF907A88B3B6AB6DF65765B0F5631B478BE1985E18D214A55C620FA185A40199E224267BEBEA29B4C9725492A2536A03F661EEB4687B2B62CC98BDD32D4496FA98EEE84BF06FEE3955BFDFE30BECABB8BBCC5B0D6B68713DB3C5EC12529B2D9BBAB3BF4F8A50A29496F8C2A01D408CB903542DB3E3093B2E62B0C998A0A4B8A1A6BA81AFA3DA3A36C5F00E37192913552A57C823EA0C77EA28D6F4E85A388DBECFE3CBBECDBBBEBAB7DD3ECF613B3D8195AD2D398EDB3F6D8B96E4F0AB89973878C8CE4643280245738DA9E3D54C27FD4357ABE5C6B9D2F46D6B16AC3FC3D129BFD206B761992DCACDDDDDA39D3B6FED7FED39BF5C5311B8DA3DE66276F86DD70F16096D8B5DA18680490B4B76EB51090A1DF3CA6A8B8CF15AE62C8DF24AAF527EFE4CDCDA2EDB23C1C990A4112D346B8C9EE28FE51AE78DE39676ADDDA71AFC6DFE22B0A3F88BA8778972493C4A20E67BF3CA342C7FEFAB50BDE97AD69E9E51D4B65EC544B4005291BA34A59CF6EFC811185B0E606278AF05B3AB37B8B62D85DA35689325297EF1A60C379900A57396A290C0C85E2F69267392EA15A117EFADC6B5884F154E461A42E582032482006B7E473CB468FD14FF8766E72DF72BECB3BB4C19C6CA2EEDB0D174F248851388F8770272CC8F167EF2F5578370DB9869273600EB517E793B5695BC7913C598BF9B8BC44B3FED53825994F577E047D9AE23A1A93C494ABA807E226AFF882529000A65C6CFE6DECC52B0F55BDCB9278302DE7CFD60041CC5664972068FE6F0E27D52DA8EB710B2343E7FA0AD95FC8F3F4A42328302346FBC57588560A20828820A20828820A2082882122851513208310348A208560741969DA8821A3D6C1C515152B38C81D0F68A457FC8FBFBE9CB942B2E66ED353E5EDF586CAB04ABFB9D1EA63F4CFBD6B0B7CEA30207FFEA9F6880C6F6751895A1B66DE76DD6A20975A5702D4279A867A081D46BD0119130D492492D9E598EDCF8C2D85E088C330F45936FBCE2923375C502B3273CF4D39FA5119F99CDBEF639B5BEF12008B5050AF154948F796BCC99EA7A74E7F5A467618CF0031700B3FE3DF2816A0A41248B331390B505B87DEB152805A4B8D9E21049CE4E43B4F4FBD4AB84C0224A82D4056B517A93C3AF663157C6EF952B75EFA114390A7363722ED68B7AFEE12DADBBEB8712D34C3370E34851E152FC36D456540C03F964768CC542F8A368CAC360E67D607D2A6FA99AE3CECF9D4D6253634A9C54860E094B8625DCB1CB4C9BCAFC45DB7F691D911ED23B53798B0BA7F15C11E6ADF675868A14AE37982D5C00951E3954641199244D7CE8F8C38D9D8A9F88521649758BD0D59A8C19B2B47A5BC298290AC1CB92B037581340E480F9687BE5568CBB84E39BDDDBE71972C1BB6C1B01BA585316F8925E63134B6A5492EA40291C5AA0E85275E55E47C46CE54D9A4A85779553EEAF52D121B5548978829960519D839A00D5152D4BF03C636D763765EFB02C350BC42E7F1576A4F12E1456DF144C0E283049F5035AC4BD937FA43BB00C41E449B0CBCEEF15F9B8A2A59417E2A0EDA70635ED98117AB16AFDC3697941A41512385220009240D27BCF7A7C8D904B7D15F27F2D7422838C3533C2014825441B90E7BBB43D459B89E69D3BCFDFCB4D29C276492A622DC1802296B1E6FCDE105621F3B59957E6FF88A6E703B2B8683A96909BC2656EC09510444919E42227A6B06A625E125CA921012A2B63BD620F07F7D2F088C5CC44C505281416DDB922D723956A5853587B6B87B4D33C0F296A580608323CB965AC79F28A86C5ECD4CEDE0DF5170187BFED9A8F189B899A4FD0CC4DCDDB872D3CE133873438D456E05E5C1044089D3991D79C54327C3938A8B254483F4BDABC72A5A03314A29DD2376CAD6DCB3E6C6D94242DDF7521170195849212482441EB3D80F86752786F0E63A852086B81A5FD321F78DBE9DD26CAE19F3A738F51645B5296979CE1207FF001B8A2D8408C91DF9FC69E0D97324ABFD451749FE24E79F115AB7A65A6EA492E91FFCC456B98BDBADE2DCC67671389A148FE578392ACBC47191C7E64C6BDC472EE2A57098F5E09492950013A65DAB95C1343586EAC3862417E7DA8C29EF40D8C712DCEE1D8CAD6CAEFD5835E364290E614E861614731275FDEAD381F8838BC090113961233DE37EED969DEB0CE6E0D2B2494D6AECDE85F864F9E822350FEF4F7560376589BB8FE12DCC26F9E7AE6E3806790100E444E9A4559F0DF1AF6AC8094A71539280400CB56B5CC0E43BC319BB39054E101CEA32BE84B7F6D431943607DA57673137D9C07692CAF301C552AE05DCDF368B6B0796A248F016A32ACC00ACBF3111DFD31E02FF00A81F9B80932313892576FAD7516E24F13DEAF1058BC1A82D4121806B51DF2F57A74A46D2DA6236D72C22E18790EB0B48521E4AB89B5057BC08568723967CF4CEBD0FB07C6B276F041F9A0EFB31DE70FA82E5F87488C9B2181A392E0822BCDAFCC5697687CBC4ADEDDA6D450B794A2470B602940CEA474CB289D0E95D43038144E4158DD60017C8BE64B1D73636BDE21E6A56926967C891CBD3BD9E1F255C680E04A803FDA47BC34D47DFC6955484CA528A4BB1CAC4559BBDA90C26129C8F4BBBD843A654481FF975D79C5472D6EB22AE0DC9B30CBB7087D20BCB079FDA14592001D67EFF004A7A9237732D702F5261588EB8BC0C29280CBAE951CFC34C84CF33F7D69CA64EF237F7D22B626A5DEDC9ABFAAE5AD6AF71CE2BB8B945BB5E32C1298931A8F3F2CE7A4674829494920A998B7AFE3DD1F1112DE356F72B73C169D5A1A897801C19CFF74F633D0014B8952E6A77C9497147A9A3BF2F4F386C70AA98A4B7FB89B7DF367E50C76876B304D9AC02F369318C42DAC308B0656F5D5E5C3A96D96508924ADC3EEA6025524FC63484C7997252A5EF064BB817BD1AAC28EE747B9896C1E109989941277CEB6D79E8DA18E0A7B647F1CEF672DCD59639836EF71DC376DF6B6C92F31F87B4B9B5C46D9BB8014801286DC0B052A1EF4E7293A72A26D3DBF2F0FBDBA40A666CC2E3D0E61FBDE3666C45AD43E67D24336E50915BE7406C3A068F93CF690FE27DED2DED3D8CE22FBDB71896CA6CB3AEB9E1E0985E217564A530A51848B7E2289E18303204F3CEA958CF1B1438334B00400154CF5E83BC5E70BB092129FA0BB8A33E62BC41D7D19E352F655AC731FC4978B5C620ABB2FAB897738B3CA73117540FBE5F5E739E692732233E75CAF6FED39FB4710A9A851AB9727D2B5E14A748EDFE1CC148938044B28E7415E56B1E3EB4CDE19526DA54DD895369F79C00F1E594827B0FBE74E9F2F12A7FA946A6AEFEC657CF8C4E2A4E140277464C186B5CFDD1A14C3F6999B26CA584DB32FE61C7D43856E6A004A844C4C08EDD2929180C44D58241041CDF3CE95EC38E51A7CF91203A4806BCCB52C33AE6D912F18537938DCADEC41CBCC482585202DA65CCD7C6A480509332003249D055830BB1672EAAE14A6BD73CB8D5E31FF7C932412E2C74A30CEB95697A56CD1D0DFE14FECC175ED3FBFCC3EE2DEDAE2F3677642F70FBCC5D7768E34BC55C0FB019500524A16DFBFC530418ED7CF0F6C55267CB74BD45817A5DB8654D699C722F1A6DE42BE6913004905892181A80E6CD501AEF5CA3F431D9BB0B7C1306C2B08B56C2AC6DAC2CAD136CD2415B26D5869A1EE400904A24EA20798AF49F8730624C8410186EB579598F1F5B078F2FEDCC519939656A054544BA5D98BEEB74A3BDB52232234A3E1254A82607E5F8019F3EB53D8B6000E7EA3F0623F0409054482C00A5AAEDE5F8E752223D73AD30EFBC092F42DFDFB6873882C87F7710E11A1F3FD052CAFE479FAD611945C13AB7DE2BAC42B0510414410510414410510414410510414410520A0CA3EF8FDE082B10422AFCC7EF9511973A9EF14D106F1D4F7860DF8CAB8BA4BE10AB684F8204951CA4F148826748F2E735A9C5A650751B02CEE7EF4E7A16778C09BBC580AE84063EEC6A6F9443629B4786601875DDF62453656B6E852CADD86D30013CFDDE5CCF6D74AE6D7F1548C14A51DE09DD06AFA5433177763D69430FB0FB3158B50F9680ADE672059B57CCD581E2F1CDFDE56FCB787BC1C6F12D9DDCD5ADB5CD98E3B5BDC5313438BB669B7125B51C35E6090161255C53202C0D6BCD7E36F89328A66CB137250A9B5C3DF507A3F38B860362FF008DB8A5218674B659B50DC509AE9168EEABD92F6236318BDDB2DA2B21B57B758E3CDBF7CFED0A1ABDFC1BC1D24FF2F2A4F88D8014A8933091E9E5CF106D795B5A6AD5BDBEE54595506E0E64D281B325A2ED85DA3FE1CB32FE61960060A0A62E1A879E7964CF1B9B63B1D86E1B6ACB8C3447B89290E2471A724FBA3A246881D001CEB9D62B664B52F7D018073614CAA3EEF4E108AB6B4DC54D50984153B1527302C78DB8005DC9891B64F128B440E10787CA63491A7AD272F67241FE2031B8041200E55E34EC0C6AB98A0EA2C5DCDC9E1C3BF9522585B86FDC48303CB9E7AE9F3A792F673D5A8C031D682DD1BF30C264E5283871AB0A9B0B547BEE785D95F0FF0014ED1B2C33EEB16CC1AF260DD4F7D10F9A599D479B7A8CA3D09E1CB3F5D6994EC0284C6018756BFBB423F3EBE66833D6BEF8C7B4A48D9C1C2D6064F47BD6AFAE5C7BC3844DDE00062D71E9D385E8D14139E5F993981C8CC4FCBECD4EC8D9F86491BC9191B015E7D87EACE12A041191BEB476EFCA1322091D3F6A974C9C24B05928A248A00F6CBEF0B82E1EC4E9CCC56940201CF3CBD7A695CBFC452A69C72CE1DFE5BB0DD2D95CF3F57845530A0EED2F753D7367D6A2CF9F5ABC2ECAF87F8A869783C44C0CA4AAA2D56E1771F9B88D7E6162412599EA73D397210C8E0F6C1F55F2DD5071504A240D073CA7A7E9DDEA36229406FA40725BE9E37CB3BB346BF31CB6EA8F162C6D639F56D213B976D5D4969DB64BE902389490A1D33F3D3F4CA96FFD3A08344922D720F4AD9C3F93C6C4004A98BF07E568B2368762764F69EC97677383376D7290A2DE24DB084396EB2642D0F1CD241CE6397A544213B4B66E387C952D3292A0480481A5851E95D7267845782DF3BE405050240CCE7A54B861E4D5318B707B4DE4EEAEF14EE0B8CBDB5FB3A544B96F7AFBB7CE5AB4924F0A12004208048E7A67CABD2BF0F7E224ED9864A67E216D2F75C1516AF33F8FC4362B6703FC5212EE2A08347B7EFD2367776BBE2D99DB05A70D52D16F8C3502E2D5CE04A90E1904044950CC73123E75ED1F097C58C163254A926783BC00502A1C19EAD6627D728ADE3302B1FC523743B8CEB9E56CE8391158CEC16A2DAA0057BA4A38648D32E5F0D632CABB16076A4ADA32C2A52810A17497EB47CFF262066E1EA686DA6432D0713C4F111E58ADCF0506E3DD72552279126358E47965D28988DD9B7725C9D052312D3BA902DC0C3C52D2A882329D48EDDE9FCB4921C0BFB17FB7DE3788F7D01FE34F8A5942735ADB3C2B3D33CF29D7D7AE44E9A99128953BB6593E5EEEEF187AFA9C873310B718B58D95A3A1E778AD5A0A2EDD5C94964093C456BD00027B0EF3548DA9B6C4B593BE46ED6FD43D6B5D736BB53748ABDF22E282A19B9F7BE4CDC7DF6F5FE2F5ECE3EC4D86E202E2FAEB6C36B196969B6D9ED9272D2FCA6E4A6129BEB6E30B0952C8200CE388C659D77FF5FE1E4A861953909995AA94C2E5DFCEE6D5368B56CED96AC44B44C4A014577C815625830B39B13C0B111F15FEDC3FC6A3DA8BDAF710BDC3F0AC7F1DDD06C3DE3AEB565846097379818BDB75A8A529C4184AD4DB9C42240CB356550FB43C609C4AD72E4CC1398FD664AB791517D0EA7AE6C22D5B3F634A97BBF4925FF92C7D4FABF0A7ADA395F84E078DDE622EE33893ABC531ABA597AF2EC294F5ABE552A0E070C2D4B20F12C9D5649E66A83B4F689C5297F2D4ADD36DEFE56620E82EDCFA8BF6CDD9E12120A4134AD08EA7FAD38C648C31FB5FC4A18BF47E19F1C291E100949E44C9CF21F03C8553B1180C5CF5B82ADD7767367D2FEA783C5BB0F864A775EC187D5567B90E07F4C4466CD96B816F72B6997896C04F01E29CF84731D3C8FD625709B2CA640F989753177048F57B171CF361163C2E21725210927746552D7FEE9F78C86E5F3C2D5E01D3F96667E1AC1EFA7956B330528120A6A08CA9D72E17ABD61EAB10B2C9049CCD781E6F4BDDCE6498C4B88E32BB40E3B7971E1B685136E4AA38D45449199CFDECB2F8D2B230B2CCC0C81CC0A3D05B3BD39C44E3A74C092A06CEC3837524FEA31DE39B4F717EB16CB42DFBABC7ED6CEC6D900A94FB974EA18494A355105C4E911CB4AB56170B2804B804532041AFDF2EFC22998EC64E439DE51BBD4B0FEAF957B1FBF2FE04FEC896DB81F662C136DB1FC33836D36C6D85D622A5B205D34D78CA72D64A93E20059746BC87202AFFB0B67A4AD13129B33306BD1B3399A76BC71DF166D19931464A95F4AB789075150D503DF48EEFD95BDBB3C4A67371E990A8CB52223489CF90E935D87038712B0E80C599C96BB0CDA81B839EB1C7F1B89F9B3D8549D7514AFB01CDA25D8694D3010A571112A999D4F144F3A6D8E98CB1734A0FBD876BB44A6046ECB2090E58D0713FAF6F0A224054093965EA6B6C2972391F407EF0A62BF80E7F88748D0F9FE829C29DCB97E36CA1293FC7B7A98AEB585A0A20828820A20828820A20828820A208283404E90426A58989223A18EDA73CF2D4532F9DF327096902B4734F7CCFEA36092438F7EEDFA8A38D3A052893DFA7953B54ADD04BDBDE43DE51A2F7902A070ABF93088C77114A2E0B1E138B331C604A64C6A67BC9903F5AAE62B6D4AC24C3294952C82CFCDDB3CF2BF384C6F28D378F04F36F7ECC2AE5DB698E24AF212A29CF834FCC7ECF6A98D9D306D097BE92CE1C0A7637F6F0BA70EB51DDDE21C3B17B67A03FDDE2DEC5B1FB3C3ADAE31572ED962C2C5B5B972FBEB096CA5292612AD388C10419CFA662A9DE2CC6AF65AD692ADD090A2429B9D5FCBABB185E56CC9BF3A51049269BA5DDBB5732281E39D9B7BBC0DADF687DA0B8D99D8470586C8D83AA6713C56E54B698B86C9215E0BED92DAA0A5691235307531E55F1E7C424C84CE97BE428053170C2F6FC9B9E317DD9721184402A439A1500DBC454D985B36343934664DDE6EC300D8AC0DAC330C75C200972FDA523F10F3AA3C4E9538912A4F19504C9FCA44F39F246DEF16CFDA78B5844C56E952AA0F13C69976062C93B169284FCA4A0518850147A061C5F57A5728C9E30D65B4B4D332EA1325C5BF9BB394709D067DE72CA29FEC3D978AC6292BDF25370E4BD6EFC2B50D4E358AFE2FE6CC7650E0C580CDECF7A1C83EB0ED4DDC7861A4B9C484880567DE8E84F6E5F0EF52F8AD97364CCDC25E81C1BBD6C19A86F0E30A7E5206F01BCEE5FF007EF46786ECD9B8DAB889124C920F3EBA09FF0011148A700C5C8F2ADED63966E4DEA61D2A7053B9150D70C29CF5FCF08921319EB4ED18548CB93DFD0FBE10D94B2682803DA84F33EC426A7529E44CF97EF4B09433096E03F50814A8DC8E4E5BD228E20A923E741C3CA374BF36FC424A9449AEF1E469D29482B53874D40602CD6B743E50B4A0524124B747A0A353D6E1F8414DE648985B74D9E9563A519BD5A1E226240AB5793F23584CA0924E59F9D47CEC1E35544CD2903FF2229470DC7CFAC2E89D2C2402AB727EB0BA084240CCFC2B28C3C84A00C44BDE99A90E686B535F2E1C6194F52A62DC1000E3F703EE62AE31D0FCBF7A5449C2972896906C1C0A33F0A75E9946A14A600914CC67A450596DC254B52E0C6423C8EBCFE548AB0C924EEFF10EDD790A6679E90A198A09A11BC727A0E2457850FEA02C3491FD3409FF00CB9F63CB23CFE1DD33849AFF004EF30E0587DE83EF78513369F536562D6A171DC8E6D10EFD95C5C38A0F381A6103DC4B248F132829781FCC397918D66965E0F0870FBB3100CD62E480E789CDAB6E22F487D2F1084A494BA89762AB26AC4A4D18B1B0CF85DAB9625F49B77382CAD888526C00429D11FF00ED1A2A7B81A9EB3542DA88C5E1967FC75196905C6E929B170E539DB33D2D0D66265B28A54A528D5D4D47B80EEC0BF105DAA5846BD6DF6EFF0013B1C5DCC6F76C9561F8F2B85C78DC4B56F745B0090C168712D5C20F10CFDE396822C7E11F1963F6762A4A66E21659401FA8B1008096CC9D72D6EF11388C2198414335406E3776D0D99B3E117EEE67DA770EBCC753BACDB65BB85EDCB29F089BC29658B85841582C970F88B052019E73CF9FD00F85FF001230F3244846217BCA5000B9A1714BD620315B266B19A94B807EA09FE4C7986A3871F88DCAB3BE57876C8BA520BCFF00190B41FE9848CD3AF2298CF31CE73AF4361F684ADA4533A5325243E42841E26BD74CAB159C4A55266143021E87D5DBD323A3C4938BE00550549001E2198331A7589135609612100EF2599C97146615BF6CEB1B4997F3684B1CF2D5A87F3EA230E6F3B7C5B2BBA7C32E718DA3BD69087504B5685C407AE1491010CA164712B888100EA467A550BC5BE26C26C991314B9A93BA0E632E9A8BC4A61F644D99BA405104DF235BF12CD4EACD6E6E6DB6F5F7E5ED28B7F01DDFE16BD87D81794B6EE318BF62E30EBEB8609502BB47DA25B59D609C80226BC87E34F8E7B3F674C9C962A3501B758F98EED46A71964786310A620B39760F605F95A3125A7F0C1F673C69C462FBC5C2DEDBFDA0716A7AEF10DA466D71271F7D47895C4E3A9E25210A242330427872E9C2B1DF154ED19AAC6C898B421C90016A0241602D6F4A5CC741D8FB31586C3225A92193725EBE55E74FCE16F685FE0B9ECADBE0D9C7ED304D9AB6D95C69B6949B17B0AB4B3B2610B2212A5292D9500204C09E94B6CBF8B0654C08F9AB05446F1DEB9763636A1AF4CA9328F9685329296A1147B54BD28F947C9E7B6CFF000F9DE87B186DE5CE0B7B762EF615E717FCA719B65BAE043613C4A4DD5C1425B1EF282120089D6BB3F87BC6183DA625283998AAAC16297C99ECF9F6033899C16365A5410C2AD6CA8D90FBDED1A02EB88B0B979448BC55B94153AB1C725794A5594C48E233D72E47AE6CE99849884A952D2491A034EA4F5A18B4E16626687B0CDC50F56C88CCD416ADA2ECC27690D9DDAD65695A161247826502139807491306329EB90AD316100ABE52581B5393861CE1D89E25CCE160722E2D5BD74EF172DCEF01BB7B7712B0F12A040800807389CF4FF0476859A852890189CAB53517BFBBE50E918E949014402CF7FC57BB4611DAADA6B9C6826C9A2E361A2B5B4B54849CF8B32390233D2233E54F307B3E6CC50AD1FB1F5AFDDF9C56D1DAD21285380287477ADC5AF9DA3AA7FC1DFD86B6EFDB13DA576371EC730A69EDD76C2DE1BADA2BDB961C55B5F29482E590B470A4B2E16DF6929702A20E99D5CB67F87F1535490154A67F4B1E5996A5F80731CDB6B788B0F21330A81234003F02DA0ED4BC7E93FB01B1D65B21B278760382DA37656F63676F66D5B9406DB422D9B43321090350991020FAD752D8BB25785968DE7269BD5156F2E39FDA38C6DDC71C74F5A83115DD29A5C017D403C8DE2EE4E1A5B750B4A885092449E193398112739CFD7CAEE89E94CB32C83BA02402C09D58EB9FF4E6291330330CD0B05AEF52280B0E41FCF8C4A21B73800594F144652447EFE597D2A33152CCC5BA012D6BF12D5FDB651338649948017FC99A99313CAF7AD7BC7A968A673067EFF7ACC80659FA816B5AB61A429387CC4B0A177ADBCBF10AA41020F5FDA9C13BC49D75ED09CB414062DD3A9FBC55588520A20828820A20828820A20828820A2082B06C73A1A6B04357092A910620C73F874D29B09252AF9C4589ED773A7E381261647F11D7D63DE11911023CB39FF13E5F0A5D33E5CC05233A000F31521EA74E7570F084EDEAB351AEF4B5BEF0D9684A5D04244281E3312721967F4CBD73A85C76C413D66600924D4D3215AD037BAB08DA4122C0F3AB7E351AF1CA20EEAE59B017F7D7AF34D61E96C952D6A00200499CC809198EDE672A8A3B5E46C1428CD584A520D5C0667E79BFA8689297294A28009330FF001EBAF0229F6BC6816DDE37B53BE6DA4BCD8DD8CBA5586C660EF70E23888716DA71343A78D6961D6E5B7BC35052083A695E6AF88BF12E562F1D3A5A673B3815A160455F419F48B860F0DBA8131613F31817D1A819EA1F3F3E394763B63B03D89C359C23006529B27004DF82948B953B3EF28F04020B854A93CB3CEBCAFE2BDA29DA6B9A42C2829F37B917B8E033B7030FC214CE48278753F8148C8ED5A316484DBDB28ADA4E609226559A81390C8935CC8ECCF95882A6DE0083BC03839973D79035B4094A941C8097CB870A690FDBE7E93F7F1E9F3CBA06C4C6A70410924815AD038617FB76D633B8751E7F8852A4F138BFF2166685120B541AE9C1ABEE820DC3A8F3FC414D44D39953F03FB8370EA3CFF108B8E70923E9AF2EF59F9BC55DFF0070141CABEF8C3271D83E5FE34CFE347CDFFE6E35FDF383715C3BDFDF1685DA3C4DA4F6F8E7AD1F37FF009BBFEE0DC5708528F9BC55DFF706E1D479FE20A3E6F1577FDC1B8751E7F8828F9BC55EFAC1B8751E7F88294FF10CE0666EBD9BD34A59E33F2D46CC7BFE20AD0E1021C6E8074A7DC463E5A8E9E7F88A82E0465975EF9F5A6EBFA32A644501F7CA32259259C41E2F74FC7FCD22AC484D013C2B4E8CFDED18F96751EB0D1D77357D807383DF5FA0CE9A2A7059D586AF5E27DFE5D252C18A401714D5DFA8B70866E3A0F383CE35D3CCFE9F3AACED762853598DF3A12FFA6D2B19DC4B73E6F4E74AF0885C55FB8B1B471F48438FDC148C3CAA55E004901DE23FD9C40F2CA35E754A933D3227A565552A1BB57DD635DE177E0F58D0A415802C9BB1707EE465FD574CB7FBB977B6B311B0DE56C95D2F0FDBBD970ABFBD5DAB85A4DE21094B81B940F11CFE8B452412012632D0FA3BE1EF88132848054CC520DAC14053A1F79EDBA4EF02DBA5D801A86AF2BFDF4CA7ECA3ED9580EF81DC4365B1B4230BDACC0128B4C42D710E06431F854A9B2E942945690E2195384919EBA1AF7DF8476DE1BFEC72F10A9B2C112E84A9896B76AD3D9A86D2D8E573153132D4402EC915AB87000635ADE9D1E28DF57B746CDE07B46E6ED776CEB7B59B5C54AB774618A45EB36CEA9328F13C1571A0093AE723C85517C63F1651B2513512E781BBBC1D2AF3BF00F916BDA37C16C73F4AD482294045B982F4EAD666B0C3381EEA76FB7938B33B59BE4BC7EED9B858B8B4D9F4ADD5DB59A490A48FC2BE084710E052A3533E55E57F15FC6156D33364AA7A95BCE03ADF5E3DC5338B461309B80580160010389CB8D73E31B8786E0D6186616C5934A4D859DAB6136D676E435200192DB040CE01CB339EB9D712DA32D1B794B9AB65397AD49AFF006FD2A1844DA48410000F99E7906F74D6B0AA5CF1471F006C49012040001C8C752209EB3355AC561938196A909002402E05B33E67DDE25E52B725303900C59DBF157CBA45550D253B93D243B3827A0E99FE61B2D2E4B8A5DFDE6FEDA39EFF00C4A7D97704F692F672DA8C1C5AB08DA0C3B0DB8BDB1BB0848B91F850BBA7385C82B1286B87DD1A6B3CFBD7823692652A424A9882C43B5A9A9B74C83DA16C0CB22728B9214CDA0028D90ADCF334D7F3D2DA1B16B66715BAC19E654F39657F8A58DDF12415715A3EEB08E2D39B79157975AF56F87B1699F2905C10522CF980DE6743ADDE2EB83514802AC59C727AF95A95B8D71F5962096C9466985AE12A1060A89032D321979CCD58A724A8D29C6CF4D58F935844899617F5172DDBDE66FDA14C4F1305B3067DD33DFD674CBFDCE68230CEA0A22B5BE872A0ABD33E30D27912D0541419BF8E46BA017E59579C3EC5ECD637BC4DB7C1361F044ADEC5F6A313B2B2C25A6B894A2872E1A6AE8F0A7DEF75B70A8C010019D60D8F676155BE9A549C85068F6E428FC294A36D9C7A50140920006FCBEFA77148FD383F8597B1BE13EC77ECE9B05B0C8B060ED462F8622FB687130DA7F101C7D28BC612E3BC216327783DFE4234AE95B2E514A529003D1DF2FD373BD9C57906D6DA2899355F52884BD07F153BBB9CC69CDA3AE167C66DDBF10242C0293C208100C0D7392209E5D2AE5202826B66D69937DF93C5594ADF2540B82491571D21D4099813D79D388D60A20828820A20828820A20828820A20828820A20828820263A9F2D68820A208681242C922049F9CFCFEF9D656DF254FA1EEE47DE164FF0011D7D4C567E3E550924B4D014480E737E3DDBBC22BFA9DB36F2688176E1F55EBD6ADA92D9F7787C6301C912A2D811300E7940F2CEAC7326E1E561D3316A0FB8A26A0E54DE7ECFAE90E64A52900A92E4359F8B3DE8DD41D234AFDA1B6F71CC5F6AF07DD46C4DD326E6E14E8DA4BAE35163096F843ADA6F548CD83728E24B1C63DF30398AF1E7C61F180C11C4A24CE228AA24B53BBFF0064F3B3ECBC3A66A1334A46F1D722096637D3B9CE2736476551B35875AE1F62B0CB366994BAD9097EF1E7614F9BB23FE44870A8B71A24E7CABE7EF883C6B88C4ED25FFAAA037D55735726E5FCE9468B44A9094824951DE1549341C86BC7F4D7BDBDA9171F8D7084BCAC94D23FE088E1E2819F16A74D49CA9CECFDA7FE531592A7D59BAFDC5BB88544B480C09E04D48FB7944BF0210785B2A299C8AE264EBA72074ED560DD9653BC012E1CE84578D630941DD01443825C8170F4F7E50F112013AF413D35CBE039D454FC52A52BE82522CC29AE9A91ED8C6CA4A697D037BE66292F2418827AE83FC7C2A57058B2A940A8DF2068393D89CF3F383743DBCB9D9F9E547F2F3C71FF0053F114F3FCA1A9FF00EA1F98CB0D07610D5E738946011A73CF4E51F7AD63FC9FFC8F71F9BF970818683B0868A4A892441E809F43C88158189FFCBCC77B8F7DE061A0EC21E30785B4854939CC79D60E24E4AF31FB818683B08578C743F2FDE8FF00255FF2FF00EE1F8818683B0838C743F2FDE8FF00255FF2FF00EE1F8818683B0838C743F2FDEB2312A71F5663307C9AB06E8D076838C743F2FDEADB809C9387493BA685F9F11ECB528C6022C0123967941C63A1F97EF49E216835052189766AF36CEF7FEF0520906CC5E99F384D464935018A9EC0A4101AC469F7AFE348374053F0B69C63CA839B88DDB9AE8F977AFBA5E009038F3860FBC12E2926728CB91CBCFB7DE74CD38B4998C0DC970FC082E01F3B5DCE65D210E12EC4077198734CA9C61929C2A39653AF2F84534C7A3E64B531269C686BAE66F67E758DCCA4BBE438777A57852FE69BC8B552136F745D26F012DAD59A590DE64B44FE52ACE48D4F3E55CE31E172E7024167B8B38201E1957D18423F2C6FB8FF0069B0A9BFFB9BA37DE2DABA4E1D86B57CFADD0E61CCB4BFC5BBC414E94290A1FD654C70415083309ABEF8576A2E4197F591BAC6F6CEE39726B17221432986E9DD0A361CAA47366CC671C32DB0DD66DAEF1FDADF15B9DC762EC6CAECD38FA5ADAAC4F0E7DCB26EF90E5B1427F00F5B8E071C6E5C4BBC792579098AF42E07E2A1C0ECC18233C83BAC06F3573ADF2D39BD225A4E065AA4EF280B5185DEEE286ECC0F6CE3A59B89F642DDFEE52EF15DA0B172EB6A76BF1816EEDE62DB49E15E3EC3C904BAAB67C00E264A9404C9223A5722F1778AB13B5D530A6728EF12CCA26F77AB7A733708CCC2A0252120005DC9A10D5191CEF9F1AD36DF8906D92C3656B0911E33F9BE0F31C407E549C9234E181A571BC527186715EFAF77789724EAE6E5A909A30CA4555BAE1FE94BB372233B9191B3188F71588A53E0B2CD93CD2A789DB9054F0067349D01CE0796719558F666D91839604C249CCE766677B758D172AA9980A86E9A007E93615705EBC7F6DD09FC3FF4497164192B3EF66ACE275806009E5E54DF17B4938CC4BA4BA4F4FB56BDE967021D4B5A94002430CB53FAAF46BBC2C0CCE4479D26A414B4C71676177A9AB5A1DCB4B800B91C74C872A7E22036A70D6B1EC1311C34AD4D97309C52D9C4A8C21C17166F37A664E4A8F3D62AD1E1CDB22462A5277C065005CD4641B9F57ED0FA56F61953269495209484253553D89577E62968FCE1FDBFF76D71B9BF68BDE16CFB1641AB45627717569E2B640578CA76E1D288024CAA7202799EBEC8F877B4062E549ABB800BB31CDD9F9FE22C52567752A0E1C02791AE5A3E59BC73C6C31238978778AE161370B7810A3C21AF09453EF8D13C6734C6B945762992525767A03C2DAD4D5B83C4E4B989F92096E2EC4F1035AFDE9085E622CBEF1B62F21840506D574EAB8584B8A84B4852F40A757086C7F728800666A470780F98A480379449167A0FE9FD3855F6B6304B0ADD20000876008F4AFBD5BE9CBF8057F0C3DA1DE9EF2309F68EDE9604E5A6C86CC3EDDDECDB57D6EA43B71E282DADD425D470293C694AD2A428120826ADF80D9AC5F70D19E99D074AFE9E3906DFDA43EA4EF92B3BDBA1D817E14F76A47DEC5B60F6966194DA39C2CFE1D86322250DDAB4969A4B519084A52083CB402AE184C304904023785CD05079380DDACC1F97E371049672497A641C9AD34FC708BAAD0CDBA0CF16A27AC18CFBF5A9C9619091A08D64282A586CBEE4C39ADAAE2CD9EBC1A1682B30414410510414410510414410510414410510414410510414410D1C5F0AC891AF3EFEA3FDCD65C2D1B82E72A645EB58DB786EEEE7FB78A3C5EE9F8FF9A8AC6CAF912CCDCC027B5ECD93FB35D635DB7FFBD7C3775BB3AAC75E702B1828718C1EC10525DBD7AE3FA1C48689973C25AD2A907DD1279E7C4FC69E3D3B2B0F365998A4965004A99E95B1BD7B7689AC1E1C4C60A70090F43AFA5188AE547B6ADEE7766718B5B0C5B793B5FC573B47B6AE21EC6D2E7129766D30E2861C1A0B1C6D9532A471956B1EE98AF0CFC42F162B6D4D9E04C2A0EA04825EAEDCB2C9BBC5E70125084A120252080523DF0BD5DEACD48D85B17416112A99923FFA926075C84039FCABCCB8DC2CC38B54C20D54E1F2AE629476353689854A19003570C7D2255B74189D0F2E533944FF008CEAC3B331064EE87634B919599A9D4D78D2032D346038D05BDF778ACDC42A24F91D7E67F71156D97B437D206F0B35EB600D34D73A5E0328640371BF90872DDCEB9EB1CF3FA8D7B99CBE0DA7054E2FBD7B1CEEFA311EF211A992ED60DA7F5142DEE2513273E93E5D7B67E7CE9FE154508DD2E1ACC7524BE46BFDB9AC6532D21C100B379BF28A7C5EEAF8FF009A75F378ABBFEE37F968FF00888A819CFAD1F378ABBFEE0F968FF88828F9BC55DFF707CB47FC447857C2624FA7FBA3E6F1577FDC1F2D1FF111E78BDD5F1FF347CDE2AEFF00B83E5A3FE220F17BABE3FE68F9BC55DFF707CB47FC441E2F757C7FCD1F378ABBFEE0F968FF00888F3C5EB3DF3FB9E7525276B7C997B80B76EAF6AE59346BF283D83720FE8D1EF8BDD5F1FF0035A4DDADBC18967766F7C6B7318F95C13DBF5078BDD5F7EB51B3717F308DD51CE8E1ABA0FB40658C92FA9200E4D9FB7178F3C533CFCE73FBF5A66B24A492493C4EA7EF1B09696A80FEFA53AC47BE789C51CFD7EFD2A00E20A71052E5277B2350DEEC05B5685E52185817EA5EAF97B109559D28F9D87A312D5269AF6A690AEE876DD0FA35619E2171EEDBD838827F16974B57490786CD2D82A70B8BD1B0A00E63588D73AA76D4C12B7882D7A70E5616393F1840A1017F31949DDBB00CA761AD5B96B1A75BD1DBABCDB0BC7773BBBA7DC7B115BC96B1FC6DB59534DB2A5074A7F10D9E20435C6885039E54B6CB92B97BA0687AB545B8BFBAC6FBA972B20BE5BD91AD9ED761FB78CD3BADDCE6C6EEBF0A69BC30B5797EA6C38FDF39E1B8F3B70E8E3789740055C2E1508E5E750FB57138B958F212A59008A034ED5039106B68728C5A952C2024A124B7D4E0E840AB7BA59865AB14F0979F5C80B981CB2072CF969E8672D2A6366CC1380F9C5DEEEDC0D457EFAF11BCD595EE84814A123B822BA8B9F2314820C919093F5A90C64AC39964A521C0B518BF072EDD2372779B80CEE48BB0FEB8E4C551F68485851129C81A3FDBAB7611A2A56F26A2952458B67D73F4A9A380C345A0E1002889E84C1E672FAFED4C367A9631010B777CF2B75A8E5AF2604AA5CDDD043037CD8543F1A1FDC435DDC30C922520C99394F6FBC855D6724270BBDA26ED4B015F6EE468F13D8594A98000EC4DF4FC9E432A45818FE36AB76EE5F6B34B4A6D2A03FB83A4214394829267B738154995B53E56D0090B23EB19DC38AFEBA0D0582448489441009ABEF0700E4D42DA6BE71F187FFA81B65B08C037E5B0D8F61CC36C0DA56F1255D38848485A99B46C09226482A233F809AF777C12C48C56137DCA8A44B097399A171CB5E22968D1531686046E9259920330B061CF2CA8098F9AFC6F16C3F01B753EA32CB6A507594C12A2EA88494A4E47878B889E5F2AF50A2415CE09A0700D4DFE9E5635A67D5A155E384B90EF522C1A94CC6A3871615AF4A7F8567F0FFDA8F6FADF5607B3C6CAE99DDB60988DADEED1634A6D69B7BB4A568BBB66937052A65C0975A2D2C2B39C84E756CD95842A29DDA1166B9BD68294F6F1CFF6E6D51BB30EF1000CCD0BB017273A796B1FA6EEE1B72783EE3776F816EE764F0DB2B0C2706B0B5B44AED594B4B70B0D3695AD65109254A44CF73ACD5E7098408028038161439FE4E669D0F25DA78AF9CB2B2A721D8136F6E3F119BDBBA6D572D59356EB86C1F15D08FE9A4C1391CF5333D0CFACAFC94A4DB26A5037403D88ADA91BE52A193820F1EFEDA272C8116E906322AD34D67D35D0D6C030034871292120A4351AD9DFDD6BAC3BACC2B051041441051041441051041441051041441092DC28272C873E9973CC51190926D5EB088BA9310358E79F97F98AD54ADDC8C2BF256CFF004F272FE622B55C25313AF6CC72FDFAF23956A99814486208B8BB7BE0EF0CA7CE124805DDF2EBA8E51EF8E989391E5D23E3FA8A5189200773661EC778DE42FE6B310E6DC39E5A373D18C44BD769F1C85B6B6D103FACA10D679895729981DE7589A692A72A5E2F70B14DB4B86D4FECF3A3954B09CC96B817E94108BF74DDBDB3B74A5071A6D0A7096C923810095A87284804AB3119926293F104E4CBD9F3959EE1672327CADC6FCA1597237949033A17CB9D9A85B4B738E66EF0312B5F684DF658E1F863C87704DDABEE1714EA81B2C4977AD85280E194BAA61C411C8A142BE76FC62DB13C4FC42113084EF29802697B6597A728B66CFD9EA202897766EE351CA9AC6CB216C5B617716EA6E5B52186B86253FD101032D2047BBA488E535E503B4953274C1314E5C80F9B12736CAEF61C62F385D9AADF9403020135BB90FA66F5F2E3E32E301094B4AE28049464548E70A1CBB4F2A8FC62A52D5BE12695B720D7BB77AB878DF120C89850BAA8163BBAB73CE9D4C4BD9A177297148040409F7A73D724F726047523D22D78B4CBA80435DAFECBD7D61B7CF4DC8507B53F2DC871E8ED4871C9250E36648287010A1048981391891FAE54AE1B6AA779AC468CF7E9D69C236131EA283DBF6AB5BB42C8511014A1EF0CF3CC40CC1CFE3C888AB361B1E998016A0E1AF31F717BD046DBE38FBCA02F804C127A9075FDFEFBC2F33692504B120E675D33FBB508D21C4B96575AFEFCFCBFBF3F11D95F1AD7FEE5FF00946FF238F9FEA1637ADB2C29D5C908CCA47E6CC9D073F39AD86D548A10934B92470EF1A192BDE0901DEC6ADD69FB8A9ABF6DEB537694381BCFDD508518E83E1FAC56DFF764FF00C5376B9F7CB58D7E590B0870E7476F4849171E3B62E129712DA89038801106338319F5A708C57CC1BC081D5BEFEF58D5437494921C33F0F7EF48F5B790EAC368701513192B2FAD6FF38FFC8773F98D49090E6D0E5C696DACA0AC122261479FCEB266A8162A1DCFE6308585A428380758F034E75CBFFB4FC2B1F38FFC8773F98D89604E91E96D43FBC7C48D7CA4FCA9BAD13261041735B1F5367A7BA460170E338F3C357FDFE07F723E9594CB980015F38CC78A42BFEC08F3FD33FA52884AF371A3BD3AFE3F3047810A9C881DE48FD294620124B8639935CBCE084D6CA8AA6419EF303F7EDF6602660662B1466B9625D2EE4039BEBA52B6BC2889BB818B56CF7F56F3D2F08A93C399223D7EFB0EB564918B461A5042EAC2EC3F67D3362F0B09C86722BD1FDF0AB6710B7D6B7AF337EC34E20377CD29AF1164F8B6E1485364B247E59073EB94F3A88C66364CC0A1BA93BCC5C8167A65D385EB684D6A96A5A16EA1BAEE9C94FA8A8A1BF522AD18CB77DBA7C0F60938B5D3015718B62AE788F622EF0AAEA38D4A203A3DE02145226721F0672368C9C3972C0E428001CB5F3E548D8A92A2086DDCD3404DC8D7AD3B168C9565656968CB6DCBAE25256A2550A24A8F119E5A939F6D2A1F1DB4708B9EA56EB92694A3F91D47E21352492E0539D7ABB76E668F14DFB8EAD4916BFD36D260A55209197E58CA72E7A914D65ED24053CB05366E87AB0C8DD898565CB5937625AEE3FBB5790A98A537896C04290E123290099394E67BD3A1B494AB971A1A5F32286D0FD1254F5151D5C6B407ED96B0A8BB6C988503DF2FBFDB3A5D18CC29ACC48720DC03916ADAF6D0E7A29F256C4D2D4D7B1F7EB0CAEF186DA429B1C5291C898CE35FF03E154AC66D49387DA7BC94B277B40C187B03288B9B839A6782092E680660D0FEF219877318EB17C5D6A51E02A19926662750797293FA54D4CF14E1A6618C929014450903833D726ED16AD9B86504A41760039CA8DC75CF964D1108E0C4ECAE0282B85BE05BEA50F7441E240933055103AAA0D57F01B326ED4DA09992CD0A9269A13C34EB4E6626CEE4B60A20153900B396E17A718F91BFFD484965388EE56F30F69C4DFDC1C7D29B72902E5496BC24A961033E10905733F973AFA0BF03B616270D22482BFA1613BCE7316C9FC9C6B1158A989492A72082F5BB68F6E6EDE91F3C7ECDDECBDB7DED69BD9C27775B05862F1ABBBBBEB165F79B69DB8B1B265C71B3726F94DA54507C2F10A0C47109D04D7B1F0BE1DC44D289A934212C43E8D96AC18778E7FB5BC4F270D315209D453859EC7EFCF2FD38FF00868FF0F9D8BF61EDC9ECD6C761163871DA4561ECBF8F6256ED37F8979F7909B8E15BA948510DA96B400A04A408EA6ADDB3F64CCC3EEEF176E39E7EE833CD850F69EDC978A0A42412FC3E927537272EB6A474F2D597C2C2CAA19CC04926739991E64558A58DD46E9150C05F2BF7FDF3AACE5198A26956FB7A0F4859D65F449B54B0952BF3150890489CC769FF0035B924E64F38412863514D29EFDD61DA13C0909D32CE349E7F3AC428000ED9C5744660A20828820A20828820A20828820A2082880D013A434715C4A52635D0733E63CBD27E49AC29DDCB7334F661295881F3B70B57A31032CDA95AF11C23D44A567581CB2D3E87CFCC4D2A847CCA6A1FC9FF00A76CE25D202D0CD5D6B9E99F4F285B252028721A4FD7EFCE68124A54EE1B4ABB6869E4FD62176949DD0140125EA720DAF13E7CCC789546474F8C44E9EB4B8486DE1BBD2F76F7C222F0D8A549582350F4A1F6E69AE90C71071E470A1D6C2ECDD3C2B28054B4E907A0F78FE99738A9C532E6198A6A55DECFCC9E6FF889F94BF9A37C66327ADEE3323DE51803DA237888DD8EEEB1272C9F6158ADF866CB04B15287E2AE1378E8B6BA286C4159690EC98D009CF3AE67E39F13CAC2E0E623E601BA82010781672FD68FCE24F0682A5070E5CEF3B90F6193D34CDAAD47C05B97DD6A760701FE6AA529DC471A3F8DB975C1C4E9372A2FF0A9591211E2409D220738F9C5F1476FA7178B9E12B25D4A72F7E5FACED9C5E36728CBDC2588D054BEB6FBBB068CD178DA3F97A51038D4412233FCD267ECE42473AE19860A9D341BD4B9A72E943C2B4CEB65C3633E5CDF9854E08615043D079794610DB6DF7EECB7758DE17B35B518BB785E278EAD4CB4E3AFB4CA029212139AC82278801AF4ED5633B344D96E949721CBB11E57E2E0EA75852626662262E6B2776E2953472E006E4E32A9D7256098D26CEF5AB36EE957B87620DA5DB3C410AF11A295B7E283E2881FDE008CA4D57B19B254146840BB8CF5CBD34AB648FC9332525425EE924FD2A152D43973B753175AEED0D82DB8E871D924A8281267302626239F41AE7510306A9531B74E795B9716A126CFC2BBCBC39502774803FDA6F4A50573D5F36A3C453CFAD6496C92274FD7B0CCFC226A670CAF96C19890720E0F6AF5E91B1C329C1602AE685ABC4D78BB13DE1CDBF1169257F98C935B4D2E413435FB43C929DD491CBEF0B5250B430712B2B7828C2145303EB94E7FECF6A208B6B6CF6C98D97C2D965281C4E880207500FEBF648ACBFD2DC5FDD29DF5D6114CA4998A9AA776FA41CB870E3F710AE17B533B396B88DDF0B4C5C8570717BA4C2883ACC796B3152F879BBA801A96EDEF586B3128528907EAB299A94A3FBCE25F0DBFB57D837364E05BABFCA2665427403F4A5FE71CC6990FD5FF00A68D4A524314823944ADADE5CADB0ABB1C2F999049100481127204474F5ACFCF3CF9FF007A7B178025200601B26B4493572404F1106796647CF39CFBF9C1AC89E331F6FB98C14036A1F2F7CA152F24924C4798FDFF005FF0E25CE4B5090323637E7194A400C403D3CA0F151D7E63F7A53E70FF0091EE3F31961A0EC20F151D7E63F7A3E70FF91EE3F3030D0761078A8EBF31FBD1F3926E49EA3F3030D07611429C041CC47CCFDFD9E75AAA62425DC87B1A558D58BF4841490EC6AC5F9FB7868E3A0CC68222749E7CFE1F731F889A14336ADEF6BE64B74EF0572BE5EC4365391C51FE32F5981CAA1672C31006B5A3716AD1F9B51AA21D224A99D4286E2F6B647DF286AE3C24E6679C0E5DBFCC1A8A98B735CAF7A353FBCAB0BCBC33D774F014739F3EEF9D042887DB0D80BE119F389CB2CE7E597EB4DD5212B75352EF7EB5BF1BF3192E641DE2C0B51D837273AE75FDC20E5CB1DA4E5060E5E597D99E54894A6596ED41E4DCE164619776A0AEF55FBB53DE70CDEBCB4420F1293C6359E1E7E6723DFF006A497884A33D5EB422C3D7A7AAF2E4CEDE66514D2A5C9A37936472AB6B6ADF630D209085091D3AF7CFBFCE9AAB1E0160CCF7AF2E3A694A3F19346154523E9BEB9B574BB7DDA2D6B8C67C452A55AE5DC7ACF61F66699CDC3CAC42CCD252E58BE619BB0FCEB69393B14CD4A66D068E0B93A00DC7A677788A7961F920C939907AAA32D675EDFB5446325FCA0C94801C55ACD666D6B5A6594487F8270C91705AA32FEA8E1C0AC050DD859397574F1651C2A36ECA54128BA201E22F24FE74B27DE911C31564F0862A6A3192C0DE62A02F4B8AF0A8B9D3AC41E3B152D0E4941520177FE497161A7106F78F928FE2DBB15B6DED89ED59BAADC4EE6AD2E76BB6DF0EBFC42DF197EC50E5F611815A5EA195B8A754C4B96EA5DA1599508E341E409AFA47F05C4E9D8594B52F744B0874070B99BC5BE815762CEFABF3A16D3DB484298AEEFF0053D05C39D1F27ED1F4C9FC2EFF008576E6BD89376782DD5861D698B6F62F2C5BB8C7B17BF69879D178E23C52869FE04BFF00D22E2DB857E588AF6E6C4DEFF111BEEFBBE807E7988E4BB6A789F8A5AC6B95ABEE83ED1D6FB662FEE9A530CBE2DEFEDD69FC482A29494F14A4240CE38040E511153310F17E3265A46609090091A1500028FA99A208528820A20828820A20828820A20828820A20828820A208288C1B1E4622C8517CE7209233E5D87C7EE056AA0E1A970EEFE5E5FDC4392BFF002D3A035367FB716BD5A1B5CA0859D60E606B3A0EBCB5D29EE1C2001FC5AAEF91033EFE9778B5C82F2D23302BD5CF7FEE1BDBDFA4DD2AC432F95A48E27787FA425322546234CCF5A6F3F109966AD9E57EAE1EDC84218C47CC96C0820E952E2DEF4E514DF620D589425495BAA5988687114E99ABA6BEB50988DB52643FD429FF001B80E72A07A57CD9A2125ECB9AB5021248268CEC2BCB437C8D0461ADE5EF9F03DDF2B8AE14BC556EA08770CB321EBC656530D7F48C14FBC413968272AA76DDF1548C3C8528CD48DE0AA0354B0A3D476761A45F3647867118A904A5135250DF510C95BDD8B55AC7DBE9F5AE0D8FEF976F6CF6D76C0BCC6CA60AB75DC0B07B8E24BA4BC8857E29872504A5CE152383311E83C75F123C72667CF9689C4825565790639D29DC45B65F870C94B6E80B2C58DE99915D7DE7B316172E26DDAB77D216DB01484A19023C31EEB6003CC2409EB90EF5E36DBD8CC4ED0C4CC53A8A4A8B3127339BDADC8BC492B64894031008CF98E356CB84463F77C57DC2E7134C9FC81DCA32F28F879F9A7B32419652542CC4D3AF535E43843799869B292087292E01E5A535CE9E51A4FED97ECB167BF1D8EB8C4301BA4DB6DEE1A855D6CE3ED2C2429D6541E752B5A4170921B4A404F3D6AFD864A1526803B51AE5FD2CD4D5B5899C24C0996D34EEB00EA55AA4B579D3AB523597D8B7DA8719B1B8B8F673DF42DBC33799B38EAAD6CEEF142A65ABC6C296E23F0EB7CF8AE2BF0E84010224E90669962B0B2D414126A75671A8F47BF1B43B5253499BCA56E7FB52685C67A8FC36B1BD7B41BDAB6D9FDA3C3B08C430EC542B14586D8B84B405B8881C4A5A8FE43C52939E5C849AAD62708122D517A7DBF1C758587CB6E62805DFF7CEA7331B1764D86D16CB788507DA43A8291301480B00FF00E50623AFCE2E62371553714DD2DC3CF843654D1310A084EE94962141B36714E1ED843E514A8952125291020E47A4C773A4524E4DDFAC0874B254C546A48B70D3F5CDE282A09899CE88521BBA871C2929809044CEA403FEFF00CD10459FB5FB228DA572C8FB810C281742F22A00A4FBA331263AD64D4B8EC32F79F18C25C0637D6FD7F4F16AEDC6CE62D88B186E0D8238CDB61F62521C0B5142D4094295C213910485418F3EB4E5134331240C9EDC73F6FA4202490EA212497B73B07CF5CEDC22F7C36CADF0EC36CD8B54B9F8A6529F156BFCAA3A9208CC89F803E55933D0003BCC4F4A060DC283AD235095BA814009664B03BC5EEED4D3DDAE125DBA5078C20A8004742911DE0F90D6B6F9C923F9163C47E632997BA18249BD48735E90B250E2755031A664FE9F7D7A644C49B1B71FC1F28CEE81FED6E8D0BA5C310449E79E9F5A5A54E00665F2714BB3706FD46DF2F827B7EA2AF13B7CFF00C52BF3C7FC4F7107CAE09EDFA83C4EDF3FF147CF1FF13DC41F2B827B7EA0F13B7CFF00C560CF190238D0C06550D13D2FE91515C266333C8EA343F7D41EF48AE79A249715619F1CF8BC3298965301CB534CF96AD488F75E0924198E5CA74D7E51E7CB5A653A7F501E86AFF7CEBA7185E4497FA8D746B821F877B886EA7651C5233981A4C1E7FA7975A899F39F9370AD0D33BFEF94A22582580D2B4E4C32CBCF4884BAC4D0D4950CA4C81D0643EF4D2A29588625DD8E4EDDDE9D00FDCA4AC1A942960010FE6FEBF9702206E31795A9495108E40C65027AFC32E7999D1EC99C9F95957BB8D3BDEFC1EF232B03BA03A4139DAE68CD4F588A7B1A09513C66675D63CBA4C72F2A61899A9A8D3A3D457B8ED0E65E042812D7E078FF005C8365160E2FB50F357CEA52B70A7DD1C20E60C673A7D2A071588704037666E1986249A9B0A521DCAC03390976BE560180ED7A8F588E671D174616A5372732E401EB398D2674FAD41CCC4A92E1F5A82DC3334AD8B748768C1512424BB8A351890D95799B3EB1E3F752E05347C74082E2992541A1C8ACF29F9812749A4A4ED598957CA724921D892D56A8A5F4CF2CA2C986972FE4849025A92974B800A8E6D77A74899B5B96C302E3882D8FEFB8041691060F88BD131D73CC559B09B3713B4C2404ACB8191B16E1EF566783DA98997265A9C804B8634373AB30F3F58D66DF56F5B69F69AEBFF66F73986AB1DDB3C4D4DDA5C62A965773678234F14F8AB2F307C4B7529852F84C66B4E7005764F027803153F1524FC951FA93FED26AF7B5BD968E3BB7F6AA10A98C4077FA8667D8143CB81DAAF63BF61FD85F67AB8BADACC630EB4DA2DEE6D1A1ABBC5F6BEF5A6EE6FECDDE12E169ABE290FA121B714C90A27DC0139E95F4D7E117810E0B092553A5B6EA5156FE2585B3CDB83306B4723DA9B495316A0EA00B80067CEA4657FD3746EDEC997DA4BF66861A751925C6212952A6145440CF31A7527A8AF470C327084C90929DC09A10D421C79373A1BC41151554925F587F6987F86E1BA7F87F14E7FCA5BC90A8109CF5303AFD2B68C449252103852207EF441155104144105104144105104144105104144105104144105101A823586FE1A788A89023B89F4039F9F3CE26886A24BAF7DABC5C79FDBF709388490547967E5CA474F9D2AE5292C0B80E73AB07D7D1A1EAB109901945A81C74ADAF6B4312EB09539E18487140F12801940804911A012263A8D045336E6D0F912D41D5BC012F663A70F31F7470F8A4CF98108FAAB6ED6E27D5852F1A87BFBF687D96DD558DC5A1BE6AE31A752A0D329710A712B33038642A012274F21AD714DBBE2A4E1CAC0987783B906CD7B33776AD23B4782BC173F6DAE4CD5CB2892E08431DE50E34ED9F131CB8C537B98C6D5638ADA27DD7957F78F151B774A8B484A15C2DC209E2128E139F5F879E3C63F10D7284F4FCF25E8DBDAB59EADABD69DFD2DB23E1EA30F2512C48012025BE8E21EE199DCF5BC5E789EF677876564CAAD2E5869B4A470B4DADD060680A4440813DF58AF2B7893C5B371F88581394CA51600D2B980FC5F56CE2CD27E1FE1A63138696A531BA4123967C7F30D6C3DA0F78B83B8CDF5F8F12D9C2014FF54C0490939129039AA7D7CD0D95819B8B48592A20D781E39FA7770F11B4FC07874214061900814012033E46C6BC34E11B87BB5DE7D9EDB58B5737A017E0150000209D75248E9DE222A57158718445824839DDF80D0802E2C738E59B6FC32BC30509481BA92E428304F26F5EB19B6D5D6195171284A9E792461C56250D650E8569C2160C403999ED4DB0BB5BE58352F61A5D8FE78D6958A062E5AA5CC4C956EEE827E62452D66A70E995A39E9ED2DEC6786EF431B5EF67636E0605BD2D9B52AFDCB8B250B66EFCA3DF4B7C6DA4BCE1F09B2889993C22662A465E2C4E0E2F9BBDCB585EBD7A460630A1411BA4A55449193382E7CB2D1B28BB372B7B8D6FA766F08C3B6C30C361B5FB2AB5DB5EA9D694D38A2C381A69C95CACF88DB3C5240041D291C420292A25CA8E99F40D419E798A88DFFCA4A52A2A2129E3463E8C7CBCE375DB43D6D8759B0E125DB5E16C99954248488D0E806A3E555AC5A4A4D18D7B9FE9EC7864C013D2EB3425405072F6DDCC4DB8506548238541111CC8038BE73F4A6B785641242492E6AFE6DE4D0D5CE5EBFA510E6112BE12467E9FEE8820F17BABE3FE683404E9041E0B4E1E356AACC8273F89EDFEF2A6CA5D6B53C3280AC8A04BB66DF7FD73AC38430D11904E7D333EB98FDAB099A967292E75CBBEBD21352C87A5B2B9F510938436A281200E9A67EBF1D73A4D53D8900103A8AF7F7CA14402B485503E45FF0071478BDD5F1FF358FF0020F1F3FF00F68DF70EA3CFF114071434FF003F28A7D2A712090790059BCCDFF0636DC1C7A7EDE3DF157D7E67F7A5BE69E3FF00D47F106E0D4F97E2144A8900C9F89AD0CE2FFC88E153DEF5F6D09A831223D93D4FC4D63E71FF0099F7D23115AD7C29224C88033F2E7DC7D2939B30DDDCD4D2BE432AE7C2B0C268DD981C8CEBD0444DC3D3232D79F4CBBE71D728F5A8E9F3CB5ECFAD4D9AAFDFA448E1D02990BB0E23CBF77888BABE0DA549900A41E7D758FA1FD8D45CE9E374B1249B575EE05ABC3289D9186DF214C58E57F7C8F908B1B11C4614A3C4009D391EE467A7F9F3889F3D89255C6940E791F79E462C984C216140DEEC7AF01C323665EE28E1716105412065073E7F2EB90EF49A71C65B0259DEFF006ADF477AC4BCBC206629760323EADDEA784405C62AF1260939F39FAF2E5F62939B8B13050826AE4F32F47A9BF43A98712F0AD641AD2DCB830F53EAD416543F1AF9E22B994920E9968ACCFF00AA8C98B7CEBC3EF5F57FC48A3083737774D83B8E7C2B57EB11CFE396A494B162E2D5D4340CE9A46BDBE798A68B93F309DDCF8350B0AB707D2164E082412EEE1BF0282A5871ADA18AB6A1385B4F5DA9567676F6A92BC47F19EE36DB7F9878F9C02A483E1CF3F3AB17873C2188DA78B96B420A92A21C106B66C98B65D6D68ABED6DA88C1A8CB538525D88B82D96601EF7A59F1AD86D2ED36FF00F1C5EC86E4038C5885F818EE3376169C11B4190A558DCB1202800E0055978804F3AF6AFC39F83537188905521CFD25F7356FFC7F0E5C8B98E5BB7FC48196EB7002B30E05988D5F2BB9063A21ECEFECBBB2BB93B3B8BBB5BC563DB6989250E5F6338B2D171705E00952597C2439C08952120E890065CBD75E15F84F2B650953178748524057F0FA49A1BD78FE35E3DB4F6BAF12A539210B25812EA0C6AE1DAB4ADBBC6D43185DC22D941453F8F70FF59CCE0A672E13993EE9220CC6990AF47F87A461F66E1D329490964D52D57028CCD9D49BBF68ACCC2A98492470CF9D7B0A51B2B35C7616EDDB5BA5B6C242049F774E227DE3EA7CBCAA466CE33E62E612E49D5D8643B40CD4666CA1E52704144105104144105104144105104144105104144105104144105104365082260013AF327A4E9D7BD6C775282A3C7A37BB5CF2B64A9094B921CBE76BB53F37D612582E2480600D3BE475FF005D73CAB28589A93BA6B9FBD3A5B37AC46E210BC492104824B66396BC6E7A4620DE56D55BEC16CC6D1ED0E23728658B7B7E161457C30E3885211993AF194819F481CEB8D7C45DA276561F13356580048F79FBB6564F0AF86E762B684A96141467281005427759DEECF46D7331C0FDBDFE6BB61B4571B5FB557173756B7F7370AC2D84A94B2D25B5A9214EA579252612531CB9578D36DF8D24637113A52544289500C4644834D19CF7BD63E807C2FF000A0C2C99026049A26A43DB9FBAD2916E365D0865C60B28790A21453207003088CCE7C3A939033D6BCD5E35DA3889D8D9B2D2B5339CF50F4CBEF933347A464EC69094A54100D01A0A71D1B3BDEB6CA6977F72EA5B2E5D3CA527229E33C1972CE72EFA6623957309784C41C4FCC9AB5105540496E2D417ADAACF5858E124C807FD2481FF002090E72BDBA0E377876FE266F2DD36AFC847090824C09F5EA73E73E55D4F61ED5C3E124A11312E406A3353AF6D38C5776861244D0B4A659753B9201EA7B5B367B88B9375BB7F77B31B516D8638EA4DB3CEA42425478632C8E91AE703CF3AC6D8C7A31AE24DCD0352967A1CFF0021A39BED8F089C5A26EE86742D42F5604D4FBF38EAD6CD6256F8B612D38F2212B6905975B03C46E5238B80F2E23AE432F855657839F25615BC4A545DAB48F29788B64AF0F8F9B292485A56A0A3504B1239D8370CE1CA2D14029B0E14A493FD50AFEBBA0FF6BC7FB872CB9181DA4B0F315258A9CE9A1AD73AB68E00F5833805FF00C88B905CD38D39661F942186E0F8260388DF63187D9376D8BE221B176586D286145B4F0A5498E124A84C93FDC4EBA177331E9615655883F6B97CCF1E9097FDB6729D2B585CA268332D5A86A5453BD22E86FC37ED1C2E03E33924F9C9397393CF9795454E5A66390E730C055DBAF5AD2038652549485303425ECDE5F8EB0D2DF883294AC10A05591CB9C0FA5317093BA1F2F3D3D817EAF50A12992A356229C33F2851492A888CA75F4AD9EAD5B3DBDB7585C2D2598DEDE9EB1157AE8B595AC920E813AC69D81CE39F6ED5B8965445C33E5771A671B0FA8B023BC376AE43A92A85B60735989F2CF3A57E41FF0090EC6141294A2C18F27FC4542EB3949246706411DCF3D72F2F5351B3F0E42CB114A3D72B7285912D2C413517D28FC0BF67B52D0ED17262012083A8FF007FBFD2992C949FA95FC72BBEB7E9E6F48D7E52544B3685E80B727B7317E31529B71490EC9E15732639C72D73F865DAB51302C920D7969A6B1A24A524CB7FA93957CB87BBC22E079082B0DB8E0027DC93D7F6F8674E65C852C12C726B7BFDD396E152DC852C06C9C0F7EF486A9B97145005BDC02B244149F7639ABA4EA3B53D97845EE0217D01B57F27F30A6F4B01DD2D5B90E5B9C3E7D06DD29538EA53C5CB8B31E734AFF84B607E65F2DEAF60FF00DB884D1350B24043366580E858BC2A56866DD0F29C4292AD384C91A6BF326B6FF0D4120EFA4DA999E37AF956ED0893F3262920335C9603A5AD6FC4541C6CB45E0B1C004EB9C67397C3E347F88B037B7837AEA066F76A4608216106E73CBBFBC8670D7F148B84788D9201919E625391883DB979646A3A782951483F57FB790BE9F6CC69094C904AC28D4532714A023AF9F5311CF0528CE507F4E5F7DBBD35549529998EA2FD6DC214978A97295F5659528ED5ED668B471552D0B7110490066273CB965E79F39075A8DC4615402B8580C9F2361D3F713985DAB2414A4025DADC756BFDC5DE8F60E245D528E444C9CE7E072E5AE7D3BC557B1095209DEA905B85E9663F8E0C22DB83C7CB580024DAE037126B5886280532A492ACF9778D39C7D00E5511377F78BD1AB47160EDC395AB13D2E727E5EF121FB3E43DD07578897DB46797CA39FF009E9AC79080C46DB1859C6493551604D47014AF58712714852824062726CBAEB51C4D189AC5B58ADD7816EFF085FF004009047BAA2AD3863948D39FAD58306BFF0026426730DDA9F36AE44D844E26592905354B5FDF9E9A4686EFE7DAAD5B9D71D63FF8D75888504DBE18CCB97F72A5100218641054ACC683CB3AE8BE0FF05E23C558B9385C390153160382C5C9039350B3B5A22B1FB6246CF4933121F74D28E5875FBD8F28BA7D987747BE4F6D8BF5ED96D7AF1ED80D85696CBBFCB1B2FE19758AB00E69BE65614DBED909F7338E05F306BDF3F0E3FE9D71B82C3E1E7E25285164A8920F3A022FAC79CBC5FE2F96BC6CCDD2456C0DC654A135D4BE71DDFDD46E8B77FBABD9DB7C236570DB2C20B084B770EDBB4D30F5DB89305CB852238D4544924E664F2AF6A7833C2383D858542264997F312901CA5390B03AD0371F3E5B8EDACBC4AAFF0042AB515001A5327E757B5632F33832DE74B8B5B6CB2D41B55DB1871523DF2E9D0C91A7C66AFB35723700932C390CB7008045B77C9F3ED58198B54C2EED983E808F76B44D38C5C298E149487B21C44E4403064E6648D6ABB8AC3E296A2652F72AF4240E541D188FCC6C929DD0142B9B01EB43F8878D24A1B4A5512358D279C4F539D4860E5CD44B1F34BAB5CCFB6F7531AA8824910A53C8C41441051041441051041441051041441051041441051041441051043777FBBD3F4A471333E5C93DEDD35B5B27BC20B964AB3ABB31A665AD7F7942493A8FFB65F234D3098848739004FAFE5F2D05EB99402660268F70C2946E9EAF4CE39FBED86FDFED726C375387BCB61FDA0B865DE3428A54A6EC5E6EE5D120660A010759935E74F8DBB4C7F8589054582486735E5D3CAA6F1D5FC133E5C89C99BBA3E63D145A84598B86278F9135D0ADFF006CCDF6CA33688C3ED54BC3F0FB661B5AD282471969B4B8A94C0CD609E526329CABE7AE236A23FEE93025542A56772E736D7879C7B1FC11E235270F23E61DD550148A067D29DC51DDE359AD31242EDD2A194F16B99993224E5967D3A41D4D3F6E2C4EC6296E0839641C3E76A35BFBF4F6C1C54AC761659DE0E52F767CB98EB9E90A9C5B8753F319F3E833E59546CB90952B402F6FC5A2C5FF006E4CD1FC778351DCDDB43F704520FE65F8B2D34DAB83C3E2E220C1CC488CF3D7FD53B4CA4A40001BD855EB4E3CFADE18E2763225A553141212C487A373BF067B1E622DEC39DC4EE36F70C66C1B71C487D216B40240D33919CEB9F78D32A732E554580A13AD3A5FAF58E7DB57132B0626B94064AEECF50410EF9F9DC651DB5DD95BBADECA61887C12EF809E30666613F219FF00AA7330BA500D4805EDC32E0DEB1E2CF19CF44CDB98B54A6092B70D620E7A3E5AD5AF1929B679F08E51F31D33F9D20A4B80D4BB69C62A0A98CEE49D74FC7E22972D87171AB28898CA3E3113FBD24A940BD95EAF6E367F6D194CEA6E834269EC1D79E4FC3CF1DB68788540348CD664447727E79FCEB41280C94C387EA1252014A812378BD694B6B4CB4F410A8BBB6BE1F88B45256C2B24A92414929C95047FE535B9C1EF10A09D34D33A1E77A9A9BC47A42925295AB7940A9CF3B4149AA46EB500E63F43DF287096DE0CEDC6F68C31BD5DE2DD6C5A2D0B1B378A63085A8A54BB3B42FA07BC9008339C4E67AD247E972F67A8AF63D7A670EA4286F900B917032A1BF7F6C627367B1356D7E15698A7E0313C33893C4AB475A2CAF3CA382627EE69B4CC490A0056D41571A3D05FABF287895251552F77424DEF7D5BA45CCE2508570A1B75A4803DC7870AE6332477EB4D274F0E58A8035367045E819BEF1AA5616905D2A2E7EA4D8D7DDFEF0E5BCA472CBF5A899D33E616666CF539C6628657893D70EB508166CE683EF051912648CB590279EBA56F86016424DC640DEF5A8D5A9F68D0EE20EF3328D1F32FA7BA6B568C07BD0DF0DEEC93AAB1C3EC2FAE569047130D1704FA1EA4CD5930F24EE86E3F8B53F19B98C942557482DAC5B9BA1DEC63DB518DDC318A61F8930DCA4A03AD29281209D09EFCA9862538B44C2995BFBAF42976156C99ECDC4DA1D8C2EFCA7615663A5855F95B2A38D365D65FBCB9F7D32DFBBC2179F207E3FB522DB43559EAAF3AE8F5A3660B884F7112D164B7035D7227CB2ED0FF00C1B77C26D9D5F0AD04F12504011CA06BA77C8D6A46D014066139DEB614A572CCB7A335A8804A7743E79D32A1B93DE97CA558B1B52D1638CE70224139EA3CF38FAEB9E5231E4FD456DAFD458E7A310465A90E619AF10B490FBA4F5719DFF1EB68E76D1162E2AD90494A0E5399F7B333F7A5650898EF33F95DD9DAE731A30CF8BC2E8C52264B0E589B870C18D4B1635E511EE72F5FBFBFDE9E2774074A6A28DF8CB9901F856135A50B2295D29D295E3083D60D3ADA9E54C919E9CBA48F872E71A532C5A0EE9A00F73E8DC287AE8D0F30B212952737D398B33726A7A8367E2187B526129F2CB967E5DC728806AA98D949FAB334AE479EB5ABF38B8604A52C1A8C38D455EBA3FEA2CBBCB54A5C5A529C8691A67A74D34CF3E9AD414F94A09533391424F034E15E00671654282A4834B57817CFA4415C5B44E51AF2F872D23E1D39572BDB00FF009C5245942A347AD5B964D951A35C2A93F3455CB8AB5BAD3BD62DFBB5B12BB77ED0108523FA8B6F27648260F381C8E42BA3EC89811B2901490E00AB0FF90BEAE34F58B6C80A520AD330B043143D03A481422D60733A473FBDAA775DB118DEF977418E5F60AA4A1DC45D379C56EDFE19D297184B61634502749D7313D3D3DF01673F8830AC187CC40614D1DC176B9F28E75E25DF1266098BDE9890BA82E03BDDF46F4A47D0FEEEB0AC3767B66F67B0AD9CC22CF0CB57B0CB30E8B660328E14DB3441844093339819F9D7D8AF0B2B7B66480C0112D16E43D3DF0F2A6DF2A38D98A52B79D4ACDC062437BBDC878C849C3B0B5BCB471053CDC2968041CE388C8F31F1CEACA43EBCB23CF588389CB55214CA4B69284094849C88831A72ACB0160D0438A20828820A20828820A20828820A20828820A20828820A20828820A20828820A2086EEFF0077A7E94D31DFFF00CE585AA4E7937BB46410A4E8439639FEE8CD0D3C4E151C8CA4F3C81F5FF15052A6142580513F5540EBC3C8BD21171BEE6CF9F2F7EB1CF0DE75F398E7B4961966C1877000F02173C31776A348CF4274D33E599F2A7C75C699782C48CB74B00399A9E1E5C4C5E3C3D3D52D52C8240075E3A75B679DE24B6F360ED76A2CDFC2AE116EE256DACB8A700519E12A1C24EB072F87A7CE39FB489DAA402C42D65CDB3F75B1E11DDF61EDD560C4B5952D40148FA4E64B59F5ABF2CE91CD4DBCDC56D2E09757D7B8532877094AD45843416A772278F2480089074D75D4452D3B1226282D4C6EEAA64295A67D5ED1E92F09F8DD1264CB96A9A02801F49559FAB80C476E91AF8F5AE2EDDD2AD5EC2AFDB5A55C256A6149464489072CBD339ED584CE483BC9E058795C9E7EDA3BB6C5F19E1674A1F3160D01AD43D5B3CF85F4192F6D84ED0BD76BB6B2C23115AD6501372185FE1CF10E4B1AC139F965953C97884A98960D7CB2F75AD6B9C6BB77C5B874E1D7B8B48FA496040A8CEEDC5B91D2374BD9FB73AFA1D4E25B43689376B5256D29683293075E2CC6A34FA654F113921F788B6445EACD5F5EF1E62F1978C49337E54CAD6E68CF5CF896FC88E8561086B09B166CD49953408940F7784FE5D633032397A9A693B1A90A670CF4663D4971F71A479EB6A62958DC52E7BB1597BE97A07A3FDE26D18A5BA6650AED034EBCB2F49AC231214097A86A1258BF3CB8FA188DDC59A3B8EBF8E10B3D78D299012485DCA541A3FDC9294E8BE62797A7ABB42D24124D4E941D7A3716A1B46802CAC245377B17A86A7ECD9A916CDEB372E6CCE296616945FBB6F70B616A24240690E2CC9D46432F2EA327294A72A9A367FD1B65DA30B44C0B0A25935DE7CEFC2CCFEC4637DC3ED1398B6C9B5875F2D6AC46C6EAF9370FA892D287E25DE0E151CF2488CEA570F286E0373A914AE5DB816E75289511308DD25DB2A8A1CF2B7171190F15DBAD92C11CF0B15C770EB120C13717286C083067888A6B899692E02439CDB917E3D7808708FE40B3F0E9CFEF0C13BC0D80C6DD6EC6CB68302C75E91C16B6F72D5CAC139C040CC2B39E711509884EEB860746AE5C6AEE3C99E1C4B4266391BF2DEE41670072A80D9DBBC4B3D8707407ECDDBBB22DA789BB76C86D939716481D7288D66634A819C95256480A15E34CC0B55AB778709292A017B8B4B67535D6835CEDA8362DC5CDD5BA6E2E140BE4A92A6C93E20083C2091DC099A69353354951357676BFE6D7785B79091F2D09DD4A6B664D5EDCC9FB3522A6EE21C2DA9A71074952606463F7C874A60A42F78D77781241B7DC8EBC60157D058EB6B7786D89DD3785A9973C4BA5AEE891E1B4A05ACA06635CFEF2A7D8374919BDCDF86553CFCA130779F7923E934A026AFD69C6DE9AA3ED21BDFC4F7718687F03DD5E25B5F893E825955AE0CABE4F1651C45242B98D34D672156FC2A920241602973AFDFF00340D19001208592C482E5C69F9AD7368E79621ED19ED878A20DDEC6EE5DBC0DE7CA821177805F5BBA8014784A92D92448CF29EDD2AE183C260A74A0A5896F9EF370CEBD34D22630FBA258DE3967E6F522E29C69711682F6EFF00891635748786CDB564D13252C5AE28DC2409C872CB97E94EBFC1D9E5D928366603ABF3E873BC258854A0E00481A1142EC3A9A1F748F1BDB9FE237638D3CD8D9D6DD6121BE071EB5C514E12539F11919493CB410234ADCE03670500D2F3776A534B3DBEE2B10D3C7D5F4D53C1FCF97F778BD6C36C7F88F39709B8FE478606A4152556D8A710C84889E5AE5131F04CE07679144A1C02723971A6A2A223662544BB727F5C8768EACEE131CDE3627BB6C05DDE961AE31B6AA1703154B0D3A8B710E90C94F8DFD4CDBCCCCE7A64455136AC8969C4912F76A5D85880F6B53FACA236619A85B07A16A3354D838BF2AD6335A995940594940E8A107C88CE0E597F9A6C25B07B3666FE9DADC2E61D4A9B368EE793BF07AFE1B9BC205D053E085A4AA0FBB3A6A6239CE910640E951F8C40DDCEDDAB9532EB9E8625F0F88989FAAA00C8DE872EE7A72882BFB27735171A42359528803EB1D7E3D22AA98B96778F603DDC8AFE6B12B276B0412198B86701F8B7F62869AC5917C508756994B9C310B6C820F69C87A89D2A2572F7D2A49B31AF2E4FD43EB174C0E24CE91BE48622A03925E9EB977362602E16933EE91A6BFB7F9CA7CAB93EDD93BBB4142C4285EEDD43D3A73AC2F869844C046ADC5AAC74FEA2031369BB96D0B295A45B927FA6002B9CC4CEBA4C8D055E36691FF6B4822A1AE38DB5CFDB45AF0CA280B62499A1C0A9DD2054707E6F68D62F6862D5FE19B378A5D34D24E1D8B5826D1C4262E1017885BA1C927498E434D729AF487C059BBBE21C2906826247BA35685B57CE285E28584A26805C90AE21C8F304BD357B523B89B076E977663671F42DC8FE51619AC82A8366CF3191EB98F9E55F657C1EADFD932142C65A07601F33AC79636F157F9B3028241049648A317AF5D22F46F0F6DA7D572CE6EAC0E32B882448AB5D5CD9B2D78BC41D5F867FAE3D624D09E148100750349E7598CC5544105104144105104265C4804C1CBCBF7A208A92A0A008FB34411556017D473BC105660828820A20828820A20828820A20828821B9CD6A9CC6500FAFEA3E95B2D01728A48B83D59E8F08AD7621C31FD3FEB8B4337340498FD74FF3F66ABE642C6FB07A1619B077B81DB410BE1E5A66104BAB3A75BDEB4CF5B4738769DD461DED4D7AEDD9E14624122DF8B20AF0ACE17C33E7CB96A6BC73F1FD1B983C5354EE2AA78D7AD79522F1B170EFB840A5AAFAFF006D4E45E325DF5CAD372EA8FF00D8883A94A89000D728C88D39659D7CC7C74E5276BCC00D02D4FA5CF76FD17CBAA6CE947712086A0F263C01E34CA978B6EFB0F6D68530E34CB96C4150428711CE54796799E7A0D69D4DC7A81DC2A2DA13437E5E5C1C459B0D8C9921695A54A4B3074D0D29F8A7ABC630C5360B66AF5D5ABF9532A70AA494B29CD47EC69AE62954ED0144B816D18FBAB3D5F9BC5D367F89F1D2032671090D42A3F917E7E861E615B2983E1A84348C1D91E19399613399EBF4CA220E5269ECADA29B10096AF1EDE5C1EC6338FDBD8FC5952CE32690A006E8592035D867F9B0353191F0B7F0FB3424218433000C921307A65E596A2333CC56CADA2EB3F532438A13C46BCCBF168A1ED44E2B144FD6A5139972FDB950EB43130ABE4B878D2A949D0C920C7791E5E9D6A2313B4089CDBC40A31A01D736D0657E310E9C1AE582142BFF0090FBF3A57411E7E2BBFCFA4FFE54BC8C7B8037C971AD2FE7A0E1CA364E15C394D4E8187663A738F1AC4494DD28A813645AE1139FF508E28813CBA7AF598C3E31D2FBD40CFC3CF2A071EB18548DD5210515980B280D3A6A6D719E70FF0013C45855962188A9C436D5AE1B76209E1054E5AB894CCC892AD273FA54CCBC5216410A601B3FB72F6F084DC229081288256B25414452EE413536A7E99F9A9BAADD46F776DDEC6319B7DAFC4300D97BFBEBCFC33585DF3F6D78DA1372F2547840E01C473491320D4EE1B10552DDCD05CE63CABEB11B88409738241B268466C1AFE7FB8D82C07D923661929C4368F6CB6E7682E78F89C6B18BF4DD5B13C52470A84F01E8796998CC5CF0B046E9AF6FCC6A824281A1E7EECCFE90DB6EBD9D6DB04B91B5FBB0BB7EDB14C3CB6EDD5936B0965696C26006DA01454A4A4954F5EB4C572828300F7A69E96BDDE838C3B94A00B29802FBBC75CAB57B7EA3316C0EF5AC31DC22D70FDA6BB6706C7ECC06556D72E25872E5685704210B3C4B242499FF00CBBE6CD783DF0429E868C2879963C837385A5CB085A949AA660FA83580058A5ED72FC6B6B65DB8BA61EB6FC438461F2907C673FA485240C9415CF88099E73CB96666CE64394B1ED91EBCF4AE51A00259500A33534A3EF10E73E3D22D6676A2D97722C6DF86F94494F8EDC3A91DCA81073CA0EB977A80C5E1771C94BB3D4873CB85BEF710E08702A43642DEFA45E2186EE59699B8653C4C7BC97169120A8F16455D34D3BD452677CB5005E97229FDE79757786DBDBAB528289DE23E97766A503DF9430C45AB5B80953A8B7B82CE6943802A39E999E5DB3D3AD4A49DA3BAC1EB70097176B3F47CEBC6164EE8496078D03D73D0B0ABE4211670966F909BD0D2592E65C0D27850383DDCA3213FAEB066B49DB7F13294532D4B6B80096F2F2F586FFE62649F9656481404B392F6AD1AFC9AC21E7E1DCB51EE072120444FC2639469DB3CB44BFF0052634577D63AAB97DE364E2933AE4115BDB4E3CCD0E9A3B806D968E271A74BE7252B8667391993CBBF291DEB7FFD478C5172B9A49A9A9E5EFBC2A12B2B2C65EE64FAB572BDADF984D572D5B49517929EF97DE9D67B01347FEA1C633954D1CC9D5BDE5C6154E1173582370ABBB926AF9BE94072AD22D1C6378585618E38CFE29849464438B01C075CC4C8F3D4CD4D60E79C523E62CEF28805CBB8E64FAF03689FC0783F138C489C6429454CEC974364CDABE678674B5BFF00763669C70A2EB16B76C4E85F48F3CA7598F2E5CEA4E54B4AD3F5915E7951B8D5BEF944B2FC118C949DE95852A2057E93E54248A8E59B52166B6B366B10B8371618DDB38B7238509B84418906409F2D7BD34C6E191BA4A5493CEE08BDBF711B33C338B961A661A605077210775F51A30ED487779883CFB7325F6CE60A254387288EC00E474CE7AD371A8DD51AEA2869A55E9534CAA5EF1098CD8F3A5AAC6EC41151A7DC1B8E516FAD0149242383FF00150F7A679888CFCE2A384A065920558DC3D2AEE6BF8CA2CBB35065604A4E8589C9AF7AF1B54D2B7888B86CE720F68F9F7E5A7948AE41E221FF00F60A615DE1956E1C76875865BCD038977A55F3D03D7CB586B7486936E841C94E8565CF2E994E93D7E02AD580504ECA4B962400E4B661AAFC34CDA2D38652F789BEE07A1B02C34CFBDAF58D58F680B05B981E156ED82A0317C39413131FFF0020C2A600EF3CC65F1F40FC079C3FF51E140723E627D79D85F93C50FC533184DD6B6072E55AF677CE91DBCDDC2148D8FD9D4AE4286156120EA3FF0088D083F7A57DA1F042F7B6361C1B89693E498F31EDE2FB426E5C0E51901BE7E9FAD5CA21A14A20828820A20828820A2086ABFCA7EF98A208A9B5A528009CE4F4FDE88214F151D7E63F7A208AC104023434411ED1041441051041441051041441051043424176648198C86B33AE7D4F2E9CEB72B0894544380FDAAF9D73F758D0C82A0082C9258BF0E9EFBB3779B511023EFAE63A547CB5267853101DED7CC00435BCA1DC8099742483C34E141C9F9DDA39BFED41835E607BE3DDA6D6B4EB6C61C1DC4538A3CA5148056DA1A652B50112A260126BC81FF509B3969C162D6038DD57A6597B7A068BF787A6A0A65A7526FCCB11D0F1F31190F12B9B775A17691EE2DA69606449F701927A1C88D2457CB9C760D5336C4C0DBBF5AAEF5B923F27CF5EB3B26515A5082012C4D4519B2AE9606B70D9C5A0AC45374B2E953C8493010080070E472D0091CA399EF50DB492A918829776A1BE8E34CB5B6978B0AB6792948CF403882E4DC71E368F5174EB47FA086951A07733E797AE82A3D33560BBBF7E99F2EDCDD05E12623F8A95517724654E068E3D6137311BC5288710C0573E10A803947783D065DE9D2316A0C5EF7735D5B2EA75ED04942D0485134E3CF2F7A9AD2103E2BDF9A00EA24651DB3F4FF30B7F9A3FE4D4362FDDCF4A3FA187E89D2401BC0122D6A7BB74891B674B6D21B3991327E7D4741F604B398264E9856282B9D6D6D5F5E995984F54A2B200FA4D8162EDF872C7D21E25D52A20FCCE5F3E54EB0F2660A9272A039D2E3803ADFA4372B969A048ADC365DFDE9155BB6A40BF796B4A9A5A99F1500CAF2309CBF42721CF3CE730C85B5DB9870C2CFAE9979D5099889614974D43B1614F3D784629DF6E3589E15B2D6B86E08D3EE3F8DDC30D071A0541B6C5C212E874A4C89415012623BCD4D4B0A29156398A86E9F9BEB099C54A24EF2052C5AD950B9CEFE958CE7B01B396FB31B3369875BA43695DB34E909007F51E425C72748256A56B9F51315352710508092EE00CD83E79F768AEE38A553B7921C39627B53F079D69177780855A29859515924833A664FCE69C22782C5CB96BE7CC72D1FA43505887EBEC7DB9437B4B336CD3ECA5280E5D0212A0202A27883A4EB0321D01D29F4B9C802D7B161C2EFEEF6CF72B0552D4C92106A186F558E5E75ED5235577DBB97631B617B4F845CBF8663F8105DEF0DAAFC2B4B82DFF0054A5600E257BA888E67999A5C4C964592E320C395AA29A3BC3B46252E096034F646BD838D2301EE877C9BC0DF862F7FB2B8AD85D61786600B4DA397A869D67F121AE26F890E1252AFF008B33949351D89DAF2252BE4A83D2854C683D7ED0FE561C4C47CC012806A4B004B9A51BA7946EBEC761385600828B6538F2930971DBE292BE29CCA5423E27B557315B4254E2C96009B5B56EEC6E358557825B10028D1DC697D3A68D9BBB5ED717816E908754A49009F0CFB9CB4CC75F2F4AAF4E214A56E9A1B75AFBBF0D2139781536F14B1D0B057BB71BE70DD6F2D078ADDB6564EBF884C83CA323CF3A4521492E083ABBD7CB9C657842A052EC750A63CEA29A5B5E061DB6FADC424BAE1B75FF007376CAE06939EA94F53CC9FF0034F913A40401365A49D583DF577CBAF48899FB216A5EF6FB816AB13AD73EF7CAD15A956FFDCFDD93CFDE1CF5E7CFEF9D6462304A1FFBA1FF00D21F857A5DFCE1B8C3AF0EC93522F99F3619F9DF449DBD62C9B539E2385B482417152729249CB972CB2E5DA4B0B2B0B394375294EB4039796A7CA27707865E2421294A4A945AD5B81CF51EB9BE9F6FB77D69C14AACB0CB974DC12A48F097212447E6820C67CB908CEA613B224CD62025AE73D2D567B768EC7E1AF8798DC7C895304B092A624B149BBD69516F2E31A5F7DB73B418B5CB97577885C7F5CCAB85D564341A9CA408333967CEA4A5600490C94848E54AEBE5FD8AFA07C3BE07183C32244E40DF005C71073BF967A88B2F16BAB9BB928C52F50A339F8D1107CB9E5D35A7024EE8259C0EA3A53DE516E1E0A9332A10914190CC64F5BBFB7885636AB1ED9CE1559629882DE6CC92B7945A235CA35CBEB03AD31C44BDFDEB56874193D1CD731ADCE510DB4FE1E7CC967712900E5EB460FE6EEF6BEC76E6BDA4715B9C598C131A7D0E71A90D85BAA247432547F49CF5EB5E9FB326CD5B83726EFA3035B37E291C9F6E7C369A9139611500ABE905FE90EC32A8B657B88DFD62F59C518372CB8D28702567C320A0F1267239E7F669AED7D98BD91B3D78C98A1BA12E4039364E19EB4EF58E358AC0CCC22BFC7285A194B1F58666398A366DC18EA623DE09530A7828702499139C831A1D73FA9E506B814EC4276CED4299043EF3026E58F0EB7616EB17295F2A682A0487BF7E0DDA2D8BB4BD78F5BB8CAC25A649E34A8905526047A83AE9E622AE188C1AF66ECE0998090006A386A3E6D5E80D1DA2DF859E9F944D015062F7E5D88B91768C67BD2C1BF98BFB3D874B7E2E25885AAEDF889294FE1AE995AF8F2241201881DF38AEEBFF004F928E2F6FE0D69240F9A1C500351C6AC337E51CF7C52779334BDC28E55615CBDE79C760F64C26DB01C2590326B0FB341F34DB360FCE4CF5EB5F68FC264E1B64C8704FFA48B0B505A8DA0D34A5BCD7B4D0A998A98A51FA8A8E766367ABFAC5D68706700998CF97EB5615ED1DCBA559D0073F6EF118A94CCC4679F2E1CE29FC5B61C2D190A1033D331220FDC73A25ED0130B00DA960D76BFEA115324B13DE9EEF15A9F4A53C460F9199F21F3D6A4E52D3303EF2453335B69EFB422B9BBB6AF1FEED9E45DA1A7F32689E11055CD23F30E922644F2A6B371699733E581BC750FEEB52D0D958E420EE962AD054F5B0EDF6857F1CCA44AD40189099851F2075CB3E54E64A8CDD136BD39E7942A9C4A5428CFA77E3EF431E26FDB5202E14892442C7BDF09EDCFF00DED35489555CC401997B35DFDF9D21ECA96B9A010186B966D0D5DBF69394923E9CF3D62753032F8D42E2F6E60B0C4838896FA6F0A7E7BF0E21DA706A2CF4A805ED5EDEB163E37BCFD8AD9E5BAC6278F61CC5F311E2D82AE5B4DD278B3482D28C891046B919D2ABDB53C73B3B6661158A993659003B05269A67CFCA1D4BD933A6A884A084E4A214C75620D5B3A44161BBE9D8DC52E536F6F72A1C4603AB52037F107F59F94D3B67FC65D918FC60C2A14872ADD774EADAF06FC52313364CE96E4D8396D00E95F7C5B2A5AE316370DDBAADDD43CD5C025B79B50534A2333EF75D0475AEAB86DAD2715864E225AD242802038CC75E76E05A23CE1D61DBFDB70D51CFDE9AC488B8495A91C2A1C312AFED33D0F3FBE944BDA895CC0862E6D415FD18D3E529897142C469ECD2D9650AA161C4852743313DAA550ADF4856BCFEF1AA925258DE2BADE35828820A20828820A2086123C4E1EE0FCCFD8F5ACCE1FF00F156AC8053F2F64FA43A425E50E6A3D89A428540850E9233E7F647D399AAF6CC9CF8B32ED555FA9E1A8E35D1A358D3FF006C4D89BADABDD4E309C212A38EDAAAD6F6C5C6C1F150DDADC26E2E380A4710E26DB2150340796BCDBE30F860ED6D8B895A51BE4CB2ED930A8B708B46C09AA1302033259DF4539FEFBC6B3EED36C5DDB5D82C3F145A8A6E380D9BCDA8C14AEC57F8658209247116C9CE67B57C89F887B2E6787B6B4F985051B8B5D5980ADCF3E9A976A76FD893D9090E1DA8721916CF83BEA06513CBBA0D2CA262232D27FC6A3E72753C6315B4FF00C99A5649356BD78B67A533F4BBCAFAD00D19AE6C47BA7AD6176EF4883C5A77E5A473D24F61CAB444D2A65025F424F2E1FDF9EAB97BB4BB54BDBB55BBBB370878973C44858D0E99F2FD29E4B9656C5C1D4E9FDFEDA192D3BC4901ABCADAB663FB7BC3E6F9FA73CF2F59E7AFCE9CA70FBC452D5200BBDB27D32F586CB96C5C9BE41C9F4A768593F986BDFF00CF6A7689252057A1EB70DDA13521245125CBB96AD3DD38087CD7F6FAFEB4FE4A294E14CEE7F64F610DD520B12417E0FE6E3216D6247F061865370A59E1BC30533A701811A46672CF974A9995294102A0939569D1BDF488D5813173129FE528FD593BE6D9BE79C4D3780E137D6ADA714690FF0081EFB256124833C530A079C69965E712B225050AB06A56B57CCE6D9BF9B888EC42E682844A40512FBC482586AF67A9D6D71130CDDA14D27C3F7509F71232FCA9012072C801FB73AC295B8B24F2D1E9E8F73FD420B94490141DAA684D4FA7AF2857F140F3E7CE72EFAFD3D2964CC0082F4C8034D6C4FAE67A468A934A22B4CAA7DFE8DE28BAB852916C5A265B52B8C89CB88C0075EB3AE7C8D3D44D06A08E5956C7B674849324EFA8A92C0E4CD6E6EF6B8A33C597BCCC758C0B6471DBF7D21C1E034D2F9FFCF2D899CB32AD3BF5A5FE6EEEF68D972D5FB3539C6C892920100DFA5FD9ABC61CDCDD8E0D856CDDBBF86E1CD337B89BB72E3CEA1A4A16B2A794A0544004C71644C6B3E74EDA7337B12480CFF6D3DDB47A58F092C19037CEE8171950E63A17E4632D3ED356CD169D584BAE0924182273E79F3CA7A79C45C3E94B2B53A58CB1404B105867F76B71315D9AD2865012E7880490BE2E23A9E7CFA72E9446CA439706BC7DFE624D2BE21A8FB3CB5F58F5A21BAD172C5F30D78F7C4299CE008D4F5F3CB2FBD6929A58022E3F223558019B378497759812353399CC7C40FACE79F3A6C92C41766F7E578869D27E6CE600D081ABBB0E6F7D2CCD420617DEFEDD1D98C02E4B6AE15B8DAC20E801823B733CBA4198CE7F674D4EF07BD1DB8364F6CC9EFC3A5F83B63267E224A948DEDD62011435A3DCFBAB54471EF6A77818A5EED0DC397CF2DE6DD795C3C4A24264E838A6047FBABC60A6A77413502835E75BB79B5338F69F823610F91246E00E91D18662B619674CAB139698A85DAB6A27358EBE5940048CBB4CE841069FAE68D69975D72FBD62F58BD9CB9135920D05486D1FD8D6DA9A1CC450264881CA673ED32232C865E7A4B45CF21C034550B5A8DC79EAF0909CB9640215A501A375F4FC442DF620C2D21B5000AC11CA67965D73924D3499358904BE6E3F2EDDB48C7CF5CCFA06F1D3CFDF73CB155F3B89E0D8EB18861EEADB8702814A8A465E519C1E7AF3EED953774850259E9A65C73CBCAB0CA6EC59D892B265A88502EE1F5B5EF9F28EA0FB3DEF06F719D9962DEF1F5BB7496F85C2A5126048124E790D0CF3ED3517E319FF0033C3F32593BC4A1541A3E94F6ED78F32F8F7C3E246D09BFE9EE904D8354BBB5FA9D2F58D8672FDE369E0824159EB1A9E59F9F502673AF37787E4997B5F79882262A9D7DDC8E2238FCDD9C5134FD2D66A3356F5D21F5836AE04A543DE57BDDF298F9199FAD74DDBDBD3F05BA1DC8038E55E3FAB343E4C8F9729E808157A0FEBD8BC634DAFBCF1F7A3BACC178A4DE5D5EC26419F08A17CB98CF96401F5EFDFF4E3B3CCADAF84514D3E62090464F5AB797A1A8E6FE279A1299AE4FF0015371A1717EF7FCF607086FC0C36C520C14DB30982607BAD2464272F8EBDEBECEF8551255B2E402104FCB450B3FF0011CB4FEAC3CCBB571E99589526BFC959B677D726B696313CDAF23319C4472E994F3A9C9B8390A2019690CF50900F2D0B7AE511A31C998FBA4022A75AE753AE55EB0CEE6CCB8A53ED28A5460C1ED965EBEBF1A6337032D03FD30D43EE9E63918CA4AE654B9734EBFBCCDF934276A9712541E54C64028F2CC69F0EFF00AD7F1188998759FA983EA476D457DE4BA2402FBC2FA5DC7EB514E358A14CDBB6FBCF209F117054A5C78420671CC77CF9F7353B85C6603FC713710B921412E4A88DF06AD77AD3FAB16EBD9614B2B4A4BB50354B9C83036AE7D59C595B51B6FB29B3D6EE3D8CE2D66CBCD4C34CBE80EE5FF8AB9E407EB54BF1178FB66EC996BDC9F2C14BD4292EE1F9578E6D9C49613642D44028209BBA73A3DBCEDE51AC5B43ED3570FDC5E615B01B3D8BDEDFA484B18B6296BE2604E28C66879B54A929D164686BCD9E2FF8ED2B0DBE9918A7237836FD2828CC781351168C2EC898AFA0B849008DD05E9AE8C6313E26D7B42EF0093B5FB59806CC60EE199D8EBDB9B3C4D0D13201E3F74382418D2418CABCD3E20F8F78F5CE9865E2E6B026D315BB7E05BD2968B061B6484A424A3798DC8ABDC3D9DDF99A42DB3BB9DD9AB4B858C471DDA3DA8B84C156258EDC22F2FAE179921D78895250470A33C911AD72FDB1FF005098AC4C95E0A662E66F12410566B51C74CADC749D93B31A57F1019E940DCBAE9190118260B875BBA9B6B271AF0D24216A692932260830232D620F3E951BE17F8AEB95B4E54E54F213BE2A554BB3DF4634CF9445E376728021208CCB8F5A1A643A4671DD163CCE2B84AF062E14DC614A511240510E2CA877D079F202BE85FC29F8928DBD230D86F9FBFBC121B7B80A55EDC8966B068A7E330E641528A497BD1DDADCFB53A1319B5DBB52ED0B4DF10B9040274300C1EF981F3F87ACB666CE44E948C4160E01AD19C6B6CF47E0D7AECD5942DD2D5720356D502CF7D2272C12B45AB6173C512675939E7FA768A94284CB2509B0B7BF7CE1B6FEF926BEEC07010F2B119828820A20828820A20861C12E13A1E674CA75EB39E5E75B4D27FC75268CC4D79B81C896A71870957FA613C4F2677EFF00685384F14E5DE3AF38F3EBE7EB5AC14A54AC5FCC66FA89D2845001DB2F2A425314C014914BD788BF9F3D0C59BB4B602E59BC66E528751736D716EC323DE243CCADA59E13A81C5273981D00AB26D1C148DA5B2E6C854BDE3B8ADF252E1CBB0E4F7B75B895D9F89DD5A595BA1D2E41B91A17AF2B7511CAFC2D86375FB7D8E6EFDF4A9168E5CAAE30B5A0016CE97D4ABAB84B44E4A502A85009FCD97535F26FFEA63C1ABC34FC6CE91288AA88094B50BE5C3981CB3EC1B0F1EF2A5A8029A0606ED9160FA96BB01D22FDBC68DDB8BBB62196571C2DBBEE39EEF320693A8D6441E95E024E166C8529131C292A21B2FE5C6B4BD348EB3B397F370E8A3EF5C9CB3BE74E34B81110C5D715C7E1C1293A059C9073F4CB4CF28A792533010E6CF42723CF89E7120A97424B74773CA95E462EC6141A425A52D2B52466A4990673CA796639D4D6186E9AB16CB5B96F3F2A888F54B5281205C921DDEFD7F30FD1708E60E71A67F4D73CBE93528898803439BB71F6DA57386E517240BB54549E14ADA1C25F4710C8C7A7FAF9F4F4DBE6A29F50739387F5F48DBE48527F890780D0F2CE1EB770811AE5DBAD3C9335096AD7C9BED7FD6A92A4960DC7A5EB4B509D4758A96F5DBE0A78D0184478024C833EF710E5273CA321E553322685331D5AD4BF13DAB5D3364BC3A0951090952BF9716B1A72B73AE9376AFDCFE1C21F7029432053311A419E80F3F9549CA98C28AA6A48ED66EB7AE70C57242545D00306A0727F35F28789B84B00340CC6A44C7BD04E874D35CF2A8F9F39A6286F501B8208B7F41AD0CA6E1C95380467D3806D5F8985C5C9390933D24FEB23E535AA278554AC86B0767BDC7F40469F208B247507F07D61CB2E10D5C051953BC3E11CC84C6B33A03EB4F25CF600DF4E1ABDFCBA36692A428A907E9003EF0CEA29C3C8C5A1B65B3EEED5ECAE2F81AD683717EE5A2995289F0D2961E0B7028E664A410235269E23140A4835245079675E3E5C630A9133E6CA28291283FCC16274A5AEFF007BC31C1F046367916366C2521BB26C2484819A9491C4469CC4CEBFA56B1CBDE9E55A9763C35F7E64C4C4840548521CB960F6039F9EBD225AE116F7772E3CFF0019414C2008907860C8D333D34F9533A126E3CFD4F9F942A842A5CA084B120E76A9AB7AD7AD629B3B12CB094215EEA492924E704CE7F1EDEB58850A80A1BE6D6F387801403C5CB90CE33A234242886A1ADFF4FA43776E005409D739D065A9E7C8F5CFCE91981CD5D8B5B87F5E70DA6A4EF312472D381E7D793C473B720716A75D20E639E5F12338D7B068A705B8B3FB7A9C9FD690A6170E14B0AFE4A7140F4FC5AFCA35ABDA06C9EC4765AE54D254B752D2CA12904A879C67CA7AC75A96C34D4A1282097CF362F9DDCE56E2C2D1D8FC0625A315BAA01814B3D32A803BEA79C7212E12E5BE2B72DE2E859525D5786003900A233E2D3CFE11955B30389010904D40E5CB91CF933691ED3F086270E8C3CB48DDDEDD00136AE65EAD66FDD66EDF1342521014AE119252341DA35D0C1ED9F39A915E212A1722B4C9FB9FBDBB474199814CE4FCC74AF785C5F2FBEBC3524BA5DFCA09D673C8E7AF5D3D3E3CA9A2E6E76BB1CB4BBD7A74AC4362364EF1748CCFE3B353AD4DA2DBC6F114B4D32E369754B24CF081C880200A69367B8209ADBE92FA5DFDE8E23383D8A4CC054906BD0374E56D7998B5B10C51779E1212E21B724407494F4D633D20F6CE9B99C4B24292C3F8BE45A963AE917BC26C992894EA4151DD3FC402598DCDAF993FBDEDF65D45DB2CAFF10B4389584F096C92233EA0E7A03976279D43EDB9DF3B04B94A2E7748615A1D070F4AC7923E2F61654AC76254801201A0CC6A1B91E0D1BBC9BB63C4432A42F8D24498CB91CFE73D74AE4B84C38918FDF0199449360DAD6ED5A37DA3CED89967F9298BB8059F9D4E608EE0C5CF66A0FDC80D25442000531AF126065CC08EF19F6ABC0969C604A12E4121F3BB120307F4BF3888C57D3208240556A6C1C66467A6BDA30A5DB2BC63DA7F74F84DBAD017833B8AB97E09C921DB74B8D822352065C519E5A44FAFFE026C6323178599BA2AA15E3439F3ADFCCC71DF15CEDD4CD17A299893ABB5A9AEBAD44764AC5D53EC5B0692B090DA119CFF0062129303331918EC62BE9C787538A4E1A4EE9DD0501ABF4D0545FDF91F2FEDB96B56354966FA8B1ED9BEBF6CE9131E21B74A54EA5652A895019274CC9390113FB55C7FCC44A40F9EADD201724D389EB7F4D21BC8C2CEA50D6E75F77E19EB0D6F7136ED185DD29E6D16A94951714A809004AA4E8204C98CAA0369F8BB65ECF96A5AE6A0EE8352A4B5B57F2BF78B260B08A528259D4726BDF5B0CDBF6DA81BCEF6B2DDFEC7DC3D63678BA31DC59BE248C2B067DBB8BF5AD23F2A590A0A2A9CA23E735C47C47F15F634854D1F3E51500AFF00724316A06CBDD2D16791B2B78A7E8AE6E2F67FBE5525AED18A99DF26F8F78D85A2F706C39AD98D9FBFE34B0C630D5C59ED1B484129529F4A4F08E28E264FFD08EB5E58F1A7C7FC461715324E1314532D2540042C806962C4D19A99F38B1613C3E850F98505D4CC08A060D4E3A33F286F83EEBD8BEBAFE67B578E6378A5D9505AEDDEB90FDA49CD4025C1307CB3115E72F14FC72DA38D331271733EA7702629EAF70F6D74E959895B11200013F50CC870391616D7F35C9EC5AE0B8484DBD85A069A68421A4B690D891AC72922550333F1AE3D8CF1EE2B684C56FCF242890C55EA0BE60B3F9089CC36C800074017CAFCAAEE39D3562F0E9788DB110AB5682644C204FCCC44763F2A7123112F1A9798A1BC41CC568F6F7DA2451B2806DDA13572EC73AE75D1E0172C3612E59B4842B4571244667B69ACCFC2B8D6DAD9D8A5F889A4AD46515644B014E9DDBA64B0C1A93BC998DF5301BB6A5C97F4F2CA29BB5BB7C10D9E042345F0E47399024F3E53AE5E553F324E2767CB4CC0A208DDB38146D19FF3A986B88D9E8520B3922FBCCEF6D2FF009B45AD866D07FF00816D93174DAD630EBC75B4DCA947DD4121284F88720389648483AC7781EB3FFA7AF1BCDC36D4C24B9D38A46FA036F367673A80C2BD328A16D9D9EA017F48200A86AD7FBAF08DE3B2B862F059E20CA7DC71A42DC1A95788D8292206866467E55F62BC27E24C3E3763C9226254F2D1621DE96ADFBD41BD0C72CC7CA5CA5949AB6F55249B96E1A75EC22EB654168E21224CC1D469AD5A02D333EA4D8D5A1ACA0426AF7CEF427DDCC2B598560A20828820A2082B06C791821B05242B965ACC41EDE79D42A3682A6633FC32490F548371715360F7E02F585424945297AF5CFA450B751060C1E922467FE321E952EB929952D5319886AE43573473AE7CDE184E594AB749607372DF80FF009EB6E5EDB3D77885BDDA4AB82C82D2100E4E0793C264660F083F426743A61B694B5A6648762BA298DC07760CF5F22F9C3BC1CDA906C0E5AF63C99FD446897B5AEEC2E7F96DB6F0F0041FC7ECC3BE290D025DB945CBA90E8570895042279E4267515E6BF8D3E0346DEC2E2A7225050285127774196AD47C9E8D78E8FB0F68D65214C145986603DC8A548B1A1D230CE01B5B6FB5383DA5EB2A0DBEB425B76DE785495B4036B0539C4A924C11A57C9CF1F7857FECFB6A761F7373756A04377CAED6CFBBC7A2FC3A913300958AD03837A8E0EC4B6B571138DD9A5E1C208438661472332799CFBF6F49AA22B06A975673477C8E6DF819923368975A0272040AD9DA81DD837F50FD9F12CC780EAF8968CF8A7AC75EDDA0E99CD3698B12AE403CFDBD5A90D16029F75B81ECFE90F9AB9194E7AE720F5CA333EB34DD5B458DDC73FBD9F4E8E2F0D148214D523337E8E58439173A67D39C65F1CBE1E95A0C7392A05EB4A870D539E661DA255052ED762C391AF3878DDD6B9FCFFCFEBFAD3E958E342540D01A9B599BB1B5A34561F41DBF43D44495BDC7BA9274CE7BFAFEB9F99A9AC3635C02145F47CC11F8A54654786536433D393367E9E96A65128DDD8C803E7A09CF31A7C797954AA31E4A4EEAAE2D4EAFCF817A3F0862B906A4D6CC19ED7EBD61D78B2AD411E93F2314DA6620A94589B9A3F3C837B7864B94E5ACDC7F47CE1CB6F0C88C8C41981F4394F6F2ACA67106E7AFE7BDE8D7D234F95BA2C0F9935E5587497A10003ACC91E7E83EBE95212A783572096EFE9A793BC226555C01D6E3CBCEFDA00F1D38943D4FE84D3A4CE049A654D7DFB6307CA1C3853DB432753C6E295EF13F1F8EB51B893BD3093776603261EF8BC399602502A2BD2C4DB9427E17657C3FC5378DDC6A3B887CC8E16D23CF5F3FDA8845441510F0939A2BCFF5A05481AC651FC875F4310376E70BAB13A46435FAF7AC4C04023DB3DF85A1E270E26241677AD785743DA2356E8D4188F3F8CFEC7D4D47CE21CD0E556A5B8F07F511ACB0252EC03721E963CFFBB5F1FC1DAC5AD5D6AE1295B6E2542089047DE9F104D29869E1EB514A71CAE0B71EE0D62DDB1B69AB0D325AE5962935D4E7DAFC1A39E7BEBDC83AD3AFE2B86DB10254A8424C19F200CF4CC7A4D5870D88DDF50E73E5CEF46E3468EFFE1BF1B7CB952C7CD3BC00DE0FDEFA79E6F411A717D8662B862541D6821482AE20B0A0A80729D397C2454989E4DCB9CF3FB8D3FBCBBE6C0F19C99D8742553379D981555B817F2E76A45BCDE3AF070B6E96C198304E506273396791F5CE915CF228E69535A7077E1F9E57EC26D2958A1BC374B805C31E9F887AAC6F0F527C2B9E052849311CC4E527EB4DD53C005CD4D8BFEFEEF6A343D9B889724198161219F260D42D4F7E96D59E10F6D26D35ADB5921D4B2A74090232C8F29190397C2A3CCF24FF002163AB654CE8787E220F15E38918013126686014012AD417A3F316EBAF55F727B14BD9BC36DDB525521B4A8920EA44EA40F3CE464072A87C5E20A94506A05186B9B823A37121A8D1E56F88FE2197B5B15366214FBC7573F80FD684E95D86B5B22FDCADC1C86B1D3F688F8E7CAAAF3E4EE2FE6002B91777EB98CAA3AC713C5E2D23FD304BD180234A9EB7CE2E54307C36DEB7716D2D869F72E14150901B42949923B2753F2AB3F8687F938B932C1FF700AA0A694EAE699935BC436227ACA666FB1410C9003A8DDE8F95BB691AE5EC70FA7783ED65BDCC72F9D7B10B6D947B086F0C57178ADA0BF6CB6DFF000E4103310A098D3CCD7D0AF835B351253859850E06E9A0B97D2C45B331C5FC64A56E4E29504BD89341C0F3B6763CA3B5789ED2E0DB3B64A7AFAF2CB0D65A4125574E2590001275204C011E9E75EE3C3789365ECED9D2D33A6CB42D08662520EA796AED1C706CA5E2A66FAA5AE639A2921D357CFF005ADA91A3FBD2F6EAD8FD97B97F66B63ADEEB6AB691D516996ED128BDB52E8C802942828827A6BAF9F16F1C7C5FD9F804CE12A7241485070A00F30694D6B9F289DC2786A615552425814900D35DEA368D4EED1AD8EE31ED33BE7BA2BDA67D7B15B2B78AE26ACB0455DE1F88A1854487DB54A01524F4820FC3C57E3BF8E789599F2B0F8A5D94C02C80C5F27CB3EE6B16BC16C192809594A41A312056ACC33A722DCE329ECBEE5B77FB20DA6E1786B78E63EA016BC571665BB8C483BA9525F8E3E29933E43BD79536FF00C4EDB98C9CB32F1338A544827E628EA00ECED7358B3E1F62860771CF10F40039A01F7E228D1976CAF2DAD2CDB65D0AE36C11FD503C4009F7475E102027B0C88AAEA36D6231C8F998A9855354FBC564953D75A677CBC8CC49C0001212C4021BEFD4371A5C0842E3681B40842608F42627A6BE7A6994655178BC22B100A92C49773D684D6A5C7A7187C8C0A52E48734A016167A5AC1D8171D61A0C40DC8F149E12A9CB498819C93AE5FE62A167603112BEA028330FDB27B96F505E1F4B90909DD0C40347B8A934CFD34D63C37103527B020F61F5E9972D2914ED5C66114005AE94352CCFA5FD87857E50C9B3FF006FBEB0ED9BA1C31391981D0CF4CF4927A6B9F4B56CC54A992C63A78057724EA1B335F3CAF1133E6A513B74F604E63306F6CA9A0AB8768BAE1E124E5A723D758F803CBE34DB6C6D2C2CF96654B6DEABB52C5B57FD8D03467E599A9DE48398A3BD19B91FE8E4F696DEE12BC6B66F116AD65376B4B772DBA9C96855A10F40234E22800E42454C78076FAB63ED492B0A665A58823506B466F7A9883DAB800B0A7191737AB68F97172348CEBECD9BC73B6BB0D87AAF9D42715C2D4FDAE2ACAD50B6C36EA99B62B495482A4360898CF3026057D6FF0081BE2F5EDBC1E0E4098A51DD4821DC0343C1C1ABBDF2668E3BB6B67FCB9AB601D4AFA435581ABF106D71A3398DADB6585B414233E9D394768FF55EC9C34B32E5A42AA77479811525A0CB5141B8F7EC8A438A711A414410510414410560D41E460862B695C648227F7FDA7FC72AADC9D958846D6FF309FF0049CD896A0CC7EF3E30E12AFF004F745EB539177B7A77E109780A05464124CF9F3E9973F972922CD8B989561D72C36F100303D5FDEBADE3A7C92B5022BCBF40DE1838CDE36FB6B6548F0D321C4A89CC1CB2F39EFD472269D230389978BF9A15F4B92439AD6BEE96EB1B4A1F2D41CD012E06B959DF96A6F169E3BB3CF63AFBB657A8B6770479A710F5BAC152965C6C89283EE9851907D6A5F68E0656D0C22E44C46F132D40821F22053ABFF6F162C26D64480192833014FD4431605DB514B59F5D390BBCED96C7370FBE1BBBEC45A5B3BB4C5EE9B187DEB69526CF0E52C00B4DEB86196FC57DC096C8D4E4649AF9B7F1B7E10E315B5F13B4E525A4EF2D4285B95B864D51DBD11E10F14C8998144B0C16000A4E85C5F893972BC64EC531469DBC63F95BA8711E1B4ECB64282D2EA12B49491120A4F5F3AF0FF89E51D8D889926602E85148E2DD069DFAC742C1E2062929B97772CEE0D998E86F5E10F7F18AB85788E4A565290A072208196BD62738EDA455490938D4EF21C82F703D1F2A67931D2243FEDFF4FD36353A0A03C0E674CC712E1A749C81CB399E594E79FCFA73AAD6D952F0153BCE34FB0EEFDE911F3B0C50A2925CD9CF0CC77AE5CCBC3A0F1CB3CE791CBACF3EB9EBFA536C0CF5626589801A9B171CCF2B5A9C328752253201567964039A5A1E36F19D4E99F7CB223EFAEB52B2D6A04006835B06AFB6AE42B4817298D183BFBB5FDF37CCDC840824C8CC4E9EBD4F6E644CD4AC9C49481EB6B65DFA529C58CE4D1C0BDE9F7F3EF126CDEB41241041904401033F97CA633315228C61490C6EC286CD6A397D79B5CDA3A6A1CD081C39B69516D224117CDAA08E20349CB5119CC79CE7EB4E3FCE4B80F56B92C6DC0E9CB943338770E01A92EF7AE7D3434E90E91760F2313D33D3B0FF0073DA9DC9C5A580A1275E15A55CB54EBA3011AAF0E4243379F637FC3F387ED3A1690648D753F7CA3BD49499C0B35CE6EC03396CF2E875A886A431208AE60C384852B457C499F9FEF520858A3B1247507367E7EDA34514A6E9F20DEFCE1276E034E14C4981A673D3EF29A426252A39823F5ECD23644BDF4024917E63837B2F0A25D2A12065E47F7A4FE582F7A5EDF88C19605DC3F11F8F75D0C2A1E200100C7A79567712C2A789F6FE4234F941DFB1B9FB7F51E195273D4E7F3AD0A085820D01D687DE543181F4AAB56D3945B778DA8DC2C83CF4E5EA0919F5A4A6CE480451C6B7B3BE6C226F0CA48949A3DEA00AF57AC462D0B920900721CC91D79FED51F35495367EF30E4728426618AD6A21EB5A1ABF7B71F286E0381D25C292DC0084A7946B97DE51AE7484B1B84B92CE2DC1D9E093226C92FBC79B906F4FBF631058DE1F638A214CBEC8532A10414827969397D3D0549C9C60401BC016A55ADCBD5BA67160C163A7482085356A145B36E35A07E3A55F5976EF719B338E3B746D5BB965C7408E04A12DA55C3CA0729EBF1A79FF00714121BE9A56C071E4F4E6747A742D89E319D83DD1366380DFC4D5C3F37F77A46B2621EC8370EDDADD62F8A5B5289095384119CE7EEC4F5E99D657B450522A2BDF3357AB7BE7D6763FC59C2E0D094CC51A001DEFA3D7BE94E30F2C7D929C438CF8D736EB4A0FBE56A25644F972D23E191A6AAC6855986957E1C39E5EA0C9E3BE32E0A7CA32E5BD410F41DAA4F3CEDC6362B633D9EB65F035DBDC780DAEE5B852961283EF01391039C6667B742115CF46E9622C5F869FBA1E51C9B6E78E66638CC32A6A92953B1DE6353570FCCFEA873E3569658682C30829E0425290008C9207FAE9D6A03138B44B9A4A8B819BD6B5AD0F3CDB368A64CC5E231690B98B2AE65D4C4E7534FEAC21EE1AFB6C073C549515FE58823312013991969FB53156225E2C89680429D83655B3D7D2AD4D0D7F152A615956F11C9C963A83C7DEB61EF676F86C86ECF6BB1568B366E61F62B4FE22E3DC2E9B86DC6D3E12841570A8C1D62BA3782F62AE5E225CF56E9485051B937D326D29E71133C94975294F50340E35F7DEFCFEF629F6ABC3F753B27B6F8A61FB3B88ED0EF1768EF880ED9DA8BAB7716DDE3C18F1085070A5285A44E6400790AF69F82BC6F81F0E61A5A6784BA11761906A3915E2FEB5E7BB7F64AF6829C12525DC3BA4E8E3576EA6368D9C2FDA37DA2F13FE77BC8C69DD8ED9FC45616CE0B82DC5D585E30C24884BF6EECA525C4F091C8C9390D281F103E37CE5E3662309885A6539000511FEDC803C433D468F0C703B1918597F2CA522F972D47EDEE1C18DB2D82DCA6C16EEACD0E1C370EC5B106D2957F37C4D969EC4BC4199587C0078A46473AF3178ABE256D2C7159FF226105DC95927851D9EF47EB5112F2F00898A094A149ADDBE9367761620EBD6ED78DCE34965F5B96B7B74A57BA1285B92CC0C824091EE819013CA04E83914FDBB3F1138AE74C5A8135DE24FBEA732F60D3B85D9492005212025DE9AE741DDF3ADA1156D23CE0F7D8B4E28C9C4A7FA82720788C67DA35F854CE071F805247CF92925AEC1C1BBF4D444A4BD88CA13113266ED7E97A11986AD2FC03666B0D5370BB9578AE2CA8AA4EB33197C8683975AAD6D19EA56349C2AB764B80C3EEC776D4CDE99461783F94ADD0000097767D437322FAD6249A6ED9413C62546072CC7D67CFE13562D95890129138953E46CD6E0FDE9E51A2E510E52D56BB9623F2FADC3C78B6C2544344840D04C7E9F0D2AC8B99859B2C83287D4340E3A3BEA1AB9C6C896581FA4645857DE77308159491999FD3EFF007E9558C7E064A945494A5817A8D33A574CEFC214DC2C6B5CB4E2F0A22E0275981D4F799E71150F88C79449560A4D1767B369667BF9718AFE27013264E2A06E5E9F6F60F3B05C5EA0260851D7BCF6F53DA3AD57D5B371F289C44C98A29772378DBAD8B11A3E4CF47F879265202564DAF535D3D8ED9C95A62B6FE33368E5B5C2D170875B52820147BC929053AE401CFA537C3ED9187C74948554298D58B83AD7AE5D03445ED259099891BAE59A976BF96675CA312EEFF1373751BFA7F67710BB6ADB6776E1D4ADB507382DAD956ACF8812B39252A71C54467C4A98CF3AFA77FF004BDE3593825E08E2541481BA0906E3277E2CE6BCAD1CCB6D23E6054C4CB1BE9A25C6B43D1AB5B1A56B1D4EC32E9A36CD80B4A894254983F99244A543A820820F39AFA7F83F1061F1F85978992C10509B35683DDFBC731C5A0FCE59C89A6B76F66CD5E53156186705104144105104144108A8428F9CFC73ADF786E367FB778502C2535CBDDF2D229A6B3524BF166E8DEB942714A913273CF9F2E43A5353F4D48A8EE3BFB31A2D05E82B98B1868E351390F3CE79761A79E9583894804B81467E85AAE6977FDC6A2528107773BB569E768E677F11CDB0C0F07DCC6D1E1D890B773107D36E709B25709BBBCBA43E92836ED932B0CBBC0A5F0E6919F979F3E2C4F9733033904228955DB31968FCBB476BF03E0819067EF2895EE9097A067BF03E7A472EFD94F7E3B59738633B17BD8B7B7C2F1A59745862AB4AD9F16D82CAD84F8CFF00BC4A58F0D10040564328AF953F13766CB99B467AC005D6A3AD09B5BD34B8CBBCEC492C25BEF53270C72A81AE95B51AF1BE7637A875A43ADBE5F6CF170BBC5C41624899C811A11CA32ED541D958444A400774024DEE2ED4BE5FA8BD26480809005402F571A64C694B0B989C6EEC04C0D7427940EB3946703D22AB9E2BD9E89A8580CED7E3477F4B6552222F17860AAB5791A65D2F51FDC546F805646349CC881CFB7FBF5AA7E100C3A0201AB97007134E4DE79BC252E584CBFA921C700FA0E95B707AC3B45F080273D73FD7B7EA741CA45130383E791CB2B7A084A64B241296B8A5B5D2997E9EB0F9ABB0A0924CEBCF9E9A6A7B7FBA7489A1C54B771F815FEE23A6C925C1A0E1EACDEEB687A8BA190904E59C9E646BAFEBA74A7B2D6E1F7806B3963D7D3F55868AC31277999B571CB85EF539DDA241BBA1C2923E1F0C867FBCFA5644C014E1C936A023A5B5E6611128824D9F5D2F461687EDDCE5F9BEFBE79794F5CA9EC99C090D716D43DC53D7F508CC94452A470E9DDBF312B6F78021327AE5273E5A7FBA9A913451E8783E76E3EF50D0D26C81739817BE7C06991E31248BD498D27439E60FA1E7CA2A5513ECCD4B3D1C77D3AC3432C66FD7FA8A16B4B8B9009273CFAC7A74EFD666B2A9E1CD09E34F7D237480031CACDF77E3A43969412224E713DBB4749CFF007AD7E790F4BDE9FB84964166637F7EB0E909073398E5FE7EFE5419CF93721FB86CB98C0B676D7DF1FBC2B5AFCCFF00E6F7D61A9984162F5D2DD33FBF3881BDFF00FB0BF4FA547CE72A249046447DFAFEEF13D842F253C00EAF58897397AFE948C3E979F4FBC377397AFE9442910F73CFEFFEB4411EB6CDB2DA05680A590413009E713F71442A852C00C12D567EBC5E115DB594FE448CB2C81F9E5F4A216DF570F388F73094B8E179A4008511000E913CE338144604C228E09E37AF5F7DA1445BF8060888E7C8F231D873EF44677CB3325B46A5DE195C3216EA960483107D35C872FBCAA1B1D24A86F11ADA84BBDDDBEFC1A24E44D1B9420062E2A03F4C859891D2156ED867967A8E7A89888CF5D341DAA1F08F2E7821AEFA675AB59FEEF0DE74CDE71955CE7C75ABD6343BDBEADF686FB61B67300C21D72D2CB17BFB7B7C49E6D4A6C2DB5DF32D80B52722085100284679F4AECFE1ADA2254B960AB404BD2EE3B72A9882C5A86EA998DB893CB8F95BAEDB6E13D983763BA3D91C1EE5BC399BFC5EE6C2D2F1C75D6997125F7196DE278B841FCEA3CFE3CEDF8DDB72E54B24CC724506F123A720F4D78D22B6B5CE9D34A10909961F7CAA8AAD8A69DCB3F3778CF78A63F6CC214E9B7658B8094A421A484A4250385B006A3DD007D00CCD71BDBF8E189C42A606AD28294B5F53CEB7D21CE1B00508A954D00BBA9CD497356B062FC39B4639BDC7B12C4D6A6DB754941910091F08F2E5DFCEA838E1BE556A963C789E2E6E35B5225A4E0C862D42CC0587BAE6F720521807EE6DE1A714A52D2249CC9839F3FDB23CF5150A6532AC75ABB6AE78FB689AC3E0F7402E920D9854FB2F9BDA3DFC6BA3593F2CBAF3D396835CEA4244BA501B1BE7719FA6A748999787DD4821346E8697B7AC5DB85BA576CD2944E7C53D400A3A0EA0F5EA6293561C99AE1D9C06722AD9E5ABFF00422BB8E4EECD239D0FB6D28E4C5C4C3A32391E93CBE7A8F4CA3BD58307240DDA0B5989D7954B573FB3121C343A99CFAE75341C000E50000504325EA3CBF534CF14CC5ECD5E5F4C6628FBFBF8D5357249C715815715FCF0EBA3EB1B265A58BA5B98D79E7F98F2419CC65AD48ED29DB982292C193471FA61CCBD60549770C082E2CC69D2E215C26FEE9DC41E64320B5625210B293EF78B32674C8FCFCC57199F8829DA454E28B198A07700D5FF004080F5881DA1856A549503571CFBB659D7478C5FED13B2371B41B2831CC19D533B47B3AFDADEA5E68F0BDE125F6DE7405247147828502274E55ED9F81FE269782183056032902A585C020F534FB6747C7E08AB788723EA7A38A70F77B3D6378B707B7B6BBC7DD86CDED8DA5C05B86DFF000772D85494BB645368B2A03FECA6D473CC99F2AFAF5F0EB6AA369787E42C4C0A2A407AD7A8E1D1F23AF24DAB855231AB94414073BA45055CE9D5867AC6CD57A062BD05104144105104141A0274821051924FD690DFFA9812E6AD90CD8FDBBD2352A0FBA7CEDAC794BA405B0362EFD1FF0010A01F533F51C9E1A2AFDA4AD6C702CA9B8E22008CF3C8CE7F7DE9962C7CB04873EE8F5E1E6D95551294B248200701EB9D3F1EE90DD58836A4DC1085245BA14E28AB294A50546328D07330488AAA62B13B8953920A4289198B97BF3D3CD8AE65A9050ECADE20063992DE5DF83C70DFDA0308C53DA3BDA57F97DEBAB6363B6096EA2C6D41294DF2EFADA1C55D20CB6B2CBC9E268A47BA60EBAF8E7E2DF8C932F1589C31994015F4EF3B1008B3DB5FB08EF5E0AC37C8D9F2F7C0DE6AD8BB97626E6A6A1F8F18C3FB47ECDD6D87ED134AB8C47107459B9386BAD3A14E24982A43AA2326C1848098F7644D7807C73B6133B1335654F551777ADC1BF0FD523AF6CC98997BB5A8636A6552CD9B9C890CFC364366F07BFC2708B4B2BB536A7D8441282A28293920E9255C31C5AE7AD72E46DE4CA252179977229DEBCB99D62E122724A4070C33353C1F5EB5E81A2E24F1A44127976FD07EDA74A8DDA1B6538896AFAD2487A3BBD5AC09CA8D946D37FD4FFC7461EFB3B738F0B2E2A1D0A002B91999F211AFD67388AAB9C4BA94AA33DFC9CB1A3C315000D81072FCFA884D771E0E4A24C69C267FC73D7B1E74A2279A90A26D6B31F75AC69B81BF8D356E3AE55890B6BE416D27333ACEBE7039FD9A7A8C4501053C43FB670D952BC631FE3A540BB31E845F36ABC48B77A88E6077313F3F874F853A4CE71424BDD89667FD7B1091C0D281C7176E7D1BCF263128CDD254849139839120C41F879473E94A267310C4BDEB979E6DC5E194CC2906D6E4FD2943AB5B330F9BB94C6B19794FFBE733DCD3C953C13A72B1CAFC1C5FCB268A95914039DBF421F35789809F78F48EBF796524E7533879EC0390DA3F3F400E6C0D2F0D26C87FA5A9C8BE5E63D6B9C48B5700C448EBE7E7F1F873135288C40342486BB1A7BFEA1B2B0DBA93F4853DB5F327F5CE1E22ED2980788EA2674E739E5AF3CEB2B9EC7F950330259ED5E37E1AD2F0CA64920B817C9A9D19FBE6F0EDABC40000E2275D75ED964639FAEB5A0C439FE56737166AE74B65DF46EB9248219AEC452CFA57F6CFA44BB174D142409CE7F365D7B76F8D6558A2C18B1A66D72F91FD00781762B94A62E03E5FAA7A4394BC8509063EFF005F856AA9F675543D01704F17CA9701AF0D8CA5120EEA8B543547A5CF768B7EFDF425F58E6408EF20E7A9D23EF3AD8AF7EC4E4EC4B70A74ADE2C1844BC9045F3ADFDF488972E10391CA7E197DC510F100877CDBDFBF3868BBA41204191FAC511BC34710A767872F3F4FDBD28821C356E80DA78BF3738CBE7F7E7440E0355B480E1E16A8C8039F2D75FBCE32F2A23054407A9CEFE7124C36DB2C2595092999F5D2328D3EC5109B2D4ADE0A2125E84FE2BEF8C475C59A9D27878403D49FF7A7C0E9D688583EBFB6B5BCB288E368A6D5C2AE1319C8F975EBD49CB91ADB13212AC31555DAEC694CDEC4DFCAAF0B0C46EA00722B716377E197DA164A1291A09E754F520CB9C9235AF0D1C3F2E0E2958426621C3024358D3F7C757C9A310FB40EEE0EDE6EDAE1092D0BBB2BAB1BAB22278D28B7BC6DF7818132A4A2044F43578D97354896921541DBEFA6BC223664DDF514545CEF1700F7C99835ABCA32EEC86D17F37D8DC1136CD949366DDB25C7C43893628432EF11131250784822728A4B6A6D39A842920B8B67AF46E8C2199900CC0B0A502FFC41649B0A8F4CBD623B107AD6E5C5E6E2F382A519929C95E920FCAA9B331866A89726E35CEF7E5167C0615E50243F1CEBC8699E67388A6908615C4D0CE79F4FBEB1E94DD52CCE340EF4A5D9CDE85BA5A25E5C80C10121BFF217F6D5ABC2CA40721C580547398CC41E607D018EDD7518204EF29245F8335B2A55DBD1CD17004BFA40492D9FAE7E86AFC63CF01BE9F4F2E9D2B7124203311C68077B6B9C29F315C29CFAE79E7133689E06D0907213CCF53F79C69CB2ADD321D4E41A376CC598D73115DDA65E6D1201AF2341DBDB9A44F5B93A8F21D0CF3F9FD6A670B26A29A92C3D3BDFCA23A24D1A791A7AA4800D1886FC7BEF7821AB90083A0EFF00BFAD4562177702C79585FCA99C108ACC0D0CF2EB974EFD2A0D52809A565BD2B933166CF9C3A4A5CBE432D6FF00DC362E01208206533239FC39F5F86B50BB63103E5290E5D8D7CA96BF1E42D0BA50A5073BA34D7EF15B37EE5AAD2B65290858578E63DF24084441CF339CF2E432AE458C49FF0024AD2186F397B9ADF46074D4E50CF15864A812A033624DB50347B5B2D6B14D9B571892B106AF54971AC4187985A3320A5C6D4DA723AC050991EB39575EF03F88666CD5E1C15EEFD686A961F50F4AB7E1E2AD8CC227EAFA458D8703A52AF90CF568B0FD9331EBCDDA6F276F373B8A5D04E0E8B9B67F669BF10F02BF13C77777E18510930A589E0CC1F39AFAFF00F00BC668C56C0C24B54D752928497232C8BE742F71DDE394EDDC0033D4B523EA0EC5BFAF2D63AEF5F41A394C144105104144105609604E81E086C5414A206467A743A799EDDCD343FF00BC6A0FB8673F878457FC8E56FCFEA3C518498FBCE9F4914E9EA4FE217921C025E9F9311EA6D2975C75510A02644CC40EBF1FD269AE3801289CAA48FC1D783BE74021F8A25290EE6F7677A76E2CE6DC2CFDB4BF1856018D5EB64A549B37CE52238585F4E7979EBD66B98EDC9E5089CC48FA1449E878E59F0A350BC8E090662E525601DD26B424B90731AB5F83691CCCDD4356588AB17DAC712955F5F5E5CA5D5C02A2597DD6D3EF6A0C0CB58E5957CD5F8CBB4272FC47899695AB777D4C0167A1CAE6AF4E7725E3B8787E684609296C870ABD331703A8222F5C470DB7C495F895B214E2566094CC4188EBF4CA72EBE57F11E1E74F4AD6497A972795EADA67D62E586C604B7D4CCD98AB57ED61ABEB0DDFC1028173878652204690398CBEFB5719DA089D2A6299C313AB54F1274C998F08B2E17690A00A532A8EED40D634FD45B17964193040100F4E5DFEBA76EED70F2E6CE35A825F8FB2F406DCA827E562C2C0726BC7866FEDAA62354BE06C27A75F4CC0EBE7DB3E55ACF0A92B292F562C03D40ECE33F485400B5125C0A7A33F4881BC7413CA679F4FBE7977CE45665CD63987B81E4783F1D0BDA1CCB96EA029BBA9B5AFF9FBC356AF3812124E63F7D4F5F334F11345DD8E9996F5E196A61DA70E0B101DF3D32CADDC3DE8F0FDBBD0AFCCA811A93F300E59C098CFB9D69DCB98406714B17FD8B37BCDC9C28091BA05726FB5B958359A82262DAF416D2388F38CF3991C81EB3F38EA326794B3392EC4EBC49776E3DE223172B72636E8A52835F4E36E3122DDF640A8E5A139E44C67CBEE29FC99CC41C8DA9CC6AD5E1E511D324850702A323FD39E50E917C018E2CB9EB23319EA6A630F3892C72ABE5CF5F6EEF0CD72B781A116C980CA262DEFB2199E5AF78FA8CA474A939739E9F503E6071AEACCF943654B20B338399B7A7DA1637C028C100E53999F4C8C4E7D7AD0B985C392F5B7DEBEFBC64E0C285535EBA51EEF91BBF1061D377C081EF721A93FA7D6739D2693336F550A8ABF2BD7A7286D3304E480917A86B7603D4D75CA45AC440481C5A6B9E539763F31FE76F9F5B06F3ECFF7867336706074ECDCFCBD987EDE240089F8931E79447DEBCB22702CD57FF8F0C8DFF3C4086EAC00161D48A7EBAD32CE185D3E1C714BE67498CBAF79CFE7CF9C8C82E9F7DB4CF81E79292E58969DD1D6235C744E7F7E67A9FBEEBC291EB69E3015966796BE9E7E74410ED0D1CB98FB39988CBEFB9042A4418A21BA955739F97EA1CA3F30F5FA1A235F9838D32F6605FE63E9F4144642C6448F2FD4534463E6F151F7CE105B3C6A2A024E4797974D7F7E666A41697C29A3B8A9D397E6ACCD0D5734905CB0CAAD4BB77F79C79F86FF00C7D23FC7DF5AA74D40F9E684D49715E9F807C9E35130A894B8C9ABCADA583FE690A8B14DEDBBF6AECA982CB8953660825685465A183F09CAAD1B3641296C886E4DEDCDEAF7AC6AE5F526952EF97703CE30CEC4E38DD95EED1EC6A8F05C6CF3ADF829D14A17CB53878473C959F6A63B5F0CB014F6BD3DE95A178D92927871EB945E7F855B1FD3590A503C52733EFF00BDDF406A80B5FCB9C47F17E87DFB348B66CEFA64241CA84B71A574D32E791E1764FC3FC54CE1415B31622A479BE61AB4CFD0C86F8073705A90A04802201F4A9712A868321F904B5FAC60CC466A0F7ADFCE00848E533D62994D9612FA1D453D83EC504682725CEF100017CBD7D9F29063F2A2639C41C8EBAFD08EB4EB0F237D20DDD89A56BF815B31ED1018C98664E5682DD7A0313D6DCBCB4E833E8627976D2A664C90801C574EE0D087AF38690F0B9C23873D351D67F6CBE149E24356CFE6037DCBC10C9C7323973FD797A49FF5355EC49604D33FB7BFC410DD4E8EA66633F8F7FDAA2A79694559B2892D9BD2DC5A0FF2025410E6F52E5FB701C74EAD5C7233275EF33AE79C7D39552368CE2A252EE1CF50ED7ABE46F0FE54F490C7DD6F7B71B7DA85105B047AF4D4663AFD63D2ABCAD9C66FD6CF9E55604E4281D9CB5E9CB49CB1BA4920BB3035035234D49BD32CA6F04FF953E71F08F9FF00AE5580A5E0D48209494A833508ABE5E5C1AD15DC496DE21D4E7E902E336D3AF9346A6FB495CE2BBB9DE26C0EF5F034ADBB7C26FC338F968101D45EBACDAB25DE18E2090B2654401A7427E82FFD3DF8C97270D8390A9845500D7FF21DFD98A2ED8C37CCDF3A822D62416D73D1F32F947786BEDF479FE0A20828820A2082B04382350D0423E17BD20FC7BFA521F24EFEFBEA18FAD3DEB09A90492411580B64822467E7FB5390BDDDE24528CDC183DF8F0B7185659DD0C47B73F6310F7E16A6DD436616D14024E878950207FAD79C0A678D5FCC945097048CE8CE5B2357FB71877267A10BDE5B9B51BD72A458DB75875C5DECB6376DC4853AE61D74A46A724DBB8A39C4FA0F2F3E79B5F63E23132E7310C50B26A43063D4D1A85A99449E1F1D2654C4AD2183B119124B0E0E0F91E71CC7DC03CDB78662D6B700B86CB10BB45C30982E33E2DE3A10A713FDA15C8F31074135F32FE366097B3FC49893313BC42D5E635AB3EBE6CE4759D838C97330882924067EBF8E71B14E58DAB0FA2DB80C3852A4AC0050A044FBB9004A4644472CC579A76A6D5C2CC2A925237AA0D85EDF7BDEC0DA2D322715A4A81293902F6B56D434A5BCC45388336E0A9B42488033CBA7F831975CBAD4713E1DFF00B8952E58649ABB55BDFE844CE0D730A52B529DC9601C677FCB77D31BE3764A3C4A052224C73044E9F5D7302321155BC4E1E4EC452BE724109D450BD0655AF0D38C5C301342C01F507FF769970D39B73118DEF1F0CAD6D282894C024091FEB9FE99CD53F1B8A463310664A1BA1CB3160CC464387BB0B4C895BE9DE01C3E59F3E16CF567310370AE324E639E7E83989E5FA69AA2896A772483AD7D93E50F25C95381666636B0AFBCF867185B738894A81132333EA0F7FA75269E4A965C1736CED5CF3BD80FD987F2A5D1B93D7304DB8BF68593C7FDC72E93CFB7CFF6A7299643D546B93FBF5F387E84B07D4797BE9A4485BDC708824FBA3B9D7D7EFAD2C990A507DF23AF5D38F11D1A22717277E61666B55F83D439F489469D2B88240E84FEDE5CF97C9E4A429000FE4033387CEB71AFBBC46AF0E6AC017D0575191BEB0F1B5AE75240EE7FCF4F49EC2A4A4952581CF9BB072D7F2CBD192F0C5D8BA6DAD7DD0F0C8E92F6EA591AFC7FC6911D27D2A5252C30A87A3D6FC03D6D4B521AAE42F7EC00193776B663B8BC39257248574CA4FCFCBCE7E94AB2D44AFD1DC9D7A37EF285D32C0480454660DEA2FE74ED0B0714343F7DF38AD0DAC08CC1F7F68D572C2ACC3EDCA86164DCAC0E73D79FD72F81D3CE912B50140E732F5EE7EDFDE9FE383763CCFE0085917BC3C8F2FBC8E83CBBF334899DBAC2C43BEB93035D350D784578601CD0835A0FD71E10F5ABB42D299E2988D3A73CF954DE17100A035F314278BD7D1A9D622E761F754D501DDCB8BE56BB5FA457E1970FBAA10399C819FD75FB9A72678D5BB76BFEF8C246436BE9DA9F8891B76F85213AA87EBD33FF005F183FC814FBB57CC7BBBC24A400D56E7D7417A5A251A64902018E53E7F4CFB0AC89FA8FD757D783C375CC4A417E36FB711083EDA90E28149F203B0CBA65F79E547CF72CCDCF2E758899D8D42565390D6F09FE2380C9428913901E87AF5A772D3BE01D74CB57F7EA23418C41661424F1FBFE383C02E02D51C0A493FF006FF5DBA7952FFE31DD7ABE999F2BB369F78748585B0B12F7B7DE1DA1A52E22339F9524A94437DF3E4C215DD6FE4F5B337DFDFD9EA1809480A20913A41E87FD7FB9DD58A4A257CB2EC5DC5B577EF91A68623E7255BCC0B0F798E87DD28586D133FA75EB3CB9F2390CAA1BE519B38A85002087676E2C3FA2337AEA90C039248776F2A97CF3F21482CA6CAE8DEDC00BB27213E1A3374920A678498804C933A0F302D3B3D69414A480C5C16C88033073CEFD291A4D5AD52CA65969818825DEEFE63B738D24DBEDB9C0377DED43B33835F3FC09DE2FE2835C0A486D2AC3ED429297E620CA804EB988E8697C66CF998B973264B49284B6F100D09B7986AF28565624EE21DC29EC431A5E9CF8756AC6D25DAD0D043AEBAD2D4E0E24A50A95709CD32239A4F7CF9F3AE678FD913118A2681CB90470CACCFDEDC4C5A701894996135B0EAEECD5A8EFC018669BA64F17BA470827DE033D7439CFE952182C27CB29DE5001AE4B00D6AE9A30E62D12C10660040234CAF47D1B5D3BC3138A32501C436EAE54470240E210634FBEF15253664B427743161C0F2AFBE1902A9C028D4A9406AEDD731D61C33749791C7E1B8D8E8E260EBDA6A0F138A4A7FDAEC6C050F0B5ADF624C36560940D161455672EC03D7AFBA449D9BA16522149CF22AD3C869DFCB4D69FE071682907779BF17FCF688D9F832164A957B36A19F5A56F9F289F69D6DB4F115A4F380738CE7EB91F954F4B99BC90ADD773A39F57F7C5A18AA510696199B7714FDEB0E53C2FB7E236EA013AB64FF504728F4FF3AD23889732623E942BE907CDAE2BA5883CA90D953128594281E7979B7BEACD16D393EF24A0680AF248D39E9F7D6ABB8AC36254584A5B1E05AE19F8D3B5612389402DBC003627D7FB0DE6611530A0A212B43875F70CE7AFCB9C7A659D456270D8A5A0A132261CA8836CEFC1AE7CE3230867B4C133753715A7076E5E9788FB9429912E10913A9C819E7E9CFA4D55A7EC4C74C98E30F38392EE93577B8A802DE54021CA6589742B0C9E3A59A9EF9C38B6426E5A406DD6C83202A72272E7E9EBF0A5E56C6C52505270D3778D2893DB8BFBAC213E724024AC07C89146D3A8725F95E2EDC1F09750B0A2EB5CA73EDF64FAC9CAA2B1DE1BC7E20B891343116496350CD42F5D7FA82C4E20027EA0A73FED6D5A96D4D3FB8B6F7C1BBFB4DB6D8AC5B087956A0AAD977AE2EE2238AC10AB96F8091AF13606712623335DEBE11A71FB1F13864CC9733712B41208E233CA95D32A8885C60F99254776956A57335B90CD901DE3A7F5FA248F3641441051041441051041441056ABFE27A7A882193EDA65797FC8524C8FFAC1EBD7A7AC9A6337FDCFC3D4379460F0152439FCDB2E3C9A22311B5172EA6DD79B2FB2FB6E03D16D9466398F7B3EB4CA700A95301762936E51906BC88E5F9F28E4818DCFFB4D6D5EC662292D605B7EF32BC1D6E7BACA1766C179DF0C9F7412E2B329933A8D4D7CFDF8EDE145E336962B13B942546D900C2BC29C9BB751F0F4E57F8682972D47009CDF96B4A5D9E3688DC5AA516CDA96953B61C456B541E20F105B20F4E129D7B467957CF4F15ECF3B3F1CBFA4277546ACCF5E6E5AEDA5EF5B8E1674C04925442B22FCA9CD8BB80DAC33B94A16F39CD27848F513F0A4F66ED02256EEF55B95B8BFA16D22CF849E7752924B55B2A1E2EFF63DA2C8DA048085102241FBFDFAD527C5A83890B533F27AF17B39E5578B161B1664EEDCE64E57D491E6F4D2310DF31C6FAD406A731969DF239CF49CFBD50F0F8764B171C7F5EFD04742D9988F99870ADE3567626E5B566A56E395A229CB52675075CF2F49EF3F5CA9F210ED635A119717A3F5E59C4BA660480A772FC185756FBF0A0864A678544427D7A67D2453C9729DB2CEF7A57D294E5AC3B97352D40C0B683576D7CA29F0BB27EFD29EA25B5198E65ADE97872165550A3DFDFE22B4359E83D34F5CA94F9645037BE548673D637D8DC69C75B57FACA262DDACB4F86BCF4D7F7D4F3A70843007B7ABFBF5864B5B3EA7ECD7AC390214B1D08D3D69CA406043977A8A80C7EEDEA1E192CBA8D5F4CF2896B6E5F7FF006A7D2D0C904DEEC3BD61AAD63789A97F76C9EF0F29E243243FBAC60170F0526BFE47DE519829B1A13CCC1053199FCD5CE0855B742541249044E7CB49FDBE039E54B4B9E515A002F5AF419817BEBD5BCD92958AD40A8D47937189961C491131FBCF5D233CFF004A9097377F3A6751A52BD3CE2371092806AED6E00E67ED6E222E9B0B42EB285C4CF4E601EBDE239FEF272249981296724D1F2A9AF3FC1C8C40E2715B856E5865ABB726157AF9C4FB162604A7A1CA472063D7EA7BD490C0934DD069907CB835B5D2B77020E763807482EEED50E2AEEE69C69AD844B23096D684AD60151C8F5CB9E79FC63BE7AC7CD93F2E69435F30DA3B7E3AB06110F366898B726996ACCFE8CE7AF086AE60CCE5EEF6E5D27D0CE5FEAA5B0E96003529EA6BF9E3485253D1C9AB9ABE9FA7885B8C3421F52909F76004C0EDDE7A7CE9FABE9431CDF7BD6E3366F3D22770F301483C18EB9559BBB79C3450F0647965988C867F4E9CA34A8A9F340A02ECE031AE4FCABF7BBC48865243D7F3CFEFA455E3712667D0647EFCBA9E548FC9F992CCC203F70C3BDC7A738653D20ABE9CB8BDDB9FB162EF0D9C741CB2806013A1FDF4A889D3C492524B35F76FF8E57A563544A2A06EFD5AFC32D7A5A1CB0B6EE91E0A9400642811944AA639E7C8C771CAAC9B1569C64C4246EDEB93B8E635E3530AAE40975DD2EB66A529D01CB8C7CC77F14CDF9E27BB9F69CD81BFC2EFD617B118B205CF86E194B589AEDD242A22006E467CA7B477DF0B786938FC0E2F086582B9E84AA5AC8000DC054412C58E90EA5ECDF981134A084E8433F3C9DED51C23BADBABDAAB6DE8EEBB65F783865DA2E19C470AB452836BE21E236C32873249227881273D7BEBC3FC73B226ECBDA139003142883A79778929527E54C1282482681EC5B4E2332D4E4F192090EE182E90402252AD44C1E13D3420FC338AE4D8EDB0AC3120120A6843BBE4FABBE5DA26A44D32D5BAA72E29720357F41B37B88696D6A9504BCB2A434A909520C75060F98EF9FC9BE0B6A2B1AB4A12B2497CC16E9E553D21CCDC6EE4B2CA049B05337170F4F2B4480B1B8B53F8AB4745C253EF78774A2B4FC04F5F98EE2BA1ECAF0CCEDA094CC082ACD88705CE74EFAE4E5A20B15B551BAA4EF096A3729A372CABDCD6E6E9BFB5FB376AD78B8E5F5AE10FA5243BC4EA18B64C12014851CA4013AC98EF13E9F066293382132949723F8A481E9C34E4F1569BB6D3281419AA5EE9242965D44939B73A35338B77FF0077B77CD2D4D5AE28DE3CE03019C1DE6AE5E39CC7083A9CC0D64D744D85F0FB153F70190A24B0FE3DB9F3E111D37C409208DF14ADF5D756FB5ACD01886F796BB95A3677775BC3BB7CF086DDFE55C76AB3191050734FCA39E75D5F66FC1D9D88097C37F201C14126B6A31A0EA5A910F88DBE92A7DF0791C8D296CFECD488C5ED17B4A6D09E1C03774FDB30ACD0717C2AE90424E93C32272CFAE7356D93FF004FD3310949FF0012EC7F8137E9D9C6778889DE25912D442E72535A396B86A9A5BD9AD5EA775DED7F8BDAA2FD8676570E75F9E2B47137CD38D41812D819150CC6798AB76CFF00FA6DC2CC94F370690B0CE4A0022D67193B75B8A3B997E324225309A9292285DC16E2F51D351530DEDBD987DAF76956538A6D36CCE1ED4C7B9777AD40503966201D34D7AD3FFF00D9AB03BC01C1CB482D532C7FFAD5C3F5F26589F1B2508514ACAC8FF6A4BBF4773C47DC45FF0084FB126FC5BB768DDEF0E2E332E0B3C56E3F0F9CC16E53232D7F5CAB63FF004CF8100B616496ABEE25B90FA6BA655D33819BE37132BBD3522B42C08D2E696B5ACF998BBED7D8EB7CCC883BC6BA911A628FE79C83F9479721DF5AC7FECD18225BFC29433ACB19016A1AE79E5C1E317E2E249AA8825EFF0082CFF9EA6D6C4BD8B77DF89626F0777A37EDD884F86EB2318B808536EA7856387860852499D35E82ACBB13FE9B64C85A66A30B2928490412802D95B80FC55A1F7FEAC4AB0E874CC515BD80B87BFEB9DDE3AFB5EEA8E530510414410510414410510415AAFF0089E9EA2086B7124122252329EFF3FBF8B19BFEEE9F682231C5388B76C28053CA2785799004F3233CC72E94CE6BEE299AC6FEF568C8B87D6388FF00C52F7ABB3BBBEDAADD6B96AC5D39B6CBBDBAFC2BD6012432D8758FC42AE543FA890599E18E8794D79B3E2CE1B0AAC3CFDF03E66EA892C1F5CF4E9D5ABD9FC15B2E6E2704A9CC0C93BBF281077854EF026D5398E7AC65CDDEEF16C36EB6630CC6F0AB8FC4A95676DFCCD09585B81C4B484E406842C2B881CC19915F2DBE2761D29C7CF12C06DF351C4D45299E95BE51D065EC6DD5268F7BDEADE7622DADAD95FF009EB0D5B25F752E7094E6A104242722147411967AEA7ACF32D9B2267D34AB9CAEFF006F47B189991B294E027701A3839F6E3EB5D22C8C476B306C41F559DBDD34B7F4E04AD255C51A44833F18D09A4F6CE0B7904A810C0966A1FC37BD625E46CC57FBC2695041E5ED985E2DFB9B55A417142352126263B8E91A76D73C8D2578620B252284D142A75B8E00F23163C12C4A40402C2C374D388ABF0AFB10E4B6E15240854C72CF3F972EDCAB797870186EF30453830E1C1F8C49A2752A5F997E3C85EDAD6193D6F0E2840032D4769FAF96BE74F65C9DE4D1249A01981CE8DC8F387889E08A966E37AB52A1FA7F690B73CF847A034E938726C03EA5DCF973B08748C4351C97CEA416D0B8E7A7185516AB1052011DB9FEB97C8D60CB656E903B38AFE5B85A109CB04EF6F73D5FA72F6D4906D250334EBD35C8E91918EDDB48AD9282E1D8F0BBFBA43652BE92A0687337E9E77E25E160C29C25620054403AE5391D3CA9FC990017501C9A834CAFD290C674DDD0C286CD9BF11A0D3D6D0F5A49447167D87AF5E84D3A4A2B5AE9FD4332B2471CCFA43D4A4A9214220FC72CAB785E5AC04805DF5EBDE91413026915FF0023D3D042D14F18EFF7EB4D8DF3772FDF2820E34F7A6333F9AB9C10DCAD5F886D0028F8AA30672000CF8BA65E9F11496EA8AC685CDE9419F514EF1B9004B51A029A134715F3D22E8B0B65BE0F014FBA7324E5EF699F3FBCF5A90C2A14A50487617239BF60F5EED15ADA53D32D248CC540671CE8733195306C25E6EC99E25227DE397427AC7FAEA60D5BF67CA2C97A91600D07EDC76D68DCFB1D8F24AAAD90E19BB7A718B81AB55208E2E123E711967AEBF4AB3C99296714D5A9A8F36AD44434CC4A8B3E6ECC752097FEA1E1B67D49050501267224E711F7CB954262E48FF20B00C097A0CC163E8FAD6B09A66282805D9D8101F5CEFA72CE18BCCBC38812920EB1DF58F2E7D0C75C95932E9A6BAE7EB125266924390C2D50F415E86D119728096CF101C40667D632CA7BF3F5ADB10B094901ECFE97E0C6BC0F0892933095259C02406B5BCF5E5C1A2CEC4042A412069976C81D33F3FD0D5771130826CCF400D6FAB53A69C226654C06854406E9C8F319D43C44A6FDA6DF6AC940F88E85A92A3F97DC049063AC65F5D6A730E12AC0B9DD7637A9E47953D3842CB93BDF58766CBA926AE7DB5EED98C41ABB75E690140B0A09254323248047C33D34AE6FB5E62C4F5A52400F91625EFDAA2D47AC3B9528001D2406CDB4A75CBD28C621F1EC64E03678BE24B2536F8759BCF5C70FE672195AD01BD24A4A7DE274F4136AF07625B132C2D4FF005076342E685FB6BC8343D421139280DF5289DD24000006B5C9DB99CB26F8AAF6EBDB4BCDF06FFF007838A9755F84FC420308B852BC40BB36D4942923300F1B6082328AF6EF808C8FF1E4AD4582836F5890C7798926E07763589D932E504EEB0A52845D801CEB7CEBD23B37FC15F7CB8CED86E6AFB777B417EAB9BBD902B656971D52816EEAE1D2C8682C9221B48072E523491CE7E29EC1C2E2B6962276113FE8A80202D8A8A825CBF026C29C4B52313E5032BE61037D2A0CC03873EFD873D8B6AE1413738580A0A6D633232214A2A11A99EC34AF17F8B3654CC3CE58DD206F1A686D53AFEAF0AAE58090B60481FEDCF5D1EE6BDE13C5EFF196703C51BC0ACDBFE6584301C4A31042BC2BB2B495816BC32A594C7BC32CC8D75A6DE12D98B998B96ECCE9705DEB40D6D056D4269159DA139482400A21408DE4B306C89FBC6BCEEB5BDFAEFD715C4B0D5DF60BB2F6D62F29B76CD2EDC59E24B4F12802DB79CE499131911CABDE5F0D7C2523132646F212B2424071C017ADB3E0383C5036BE38E1A5AE62C929059DEBF51005C9CF8E71B8BB27EC2FB3B89B76F8A6D9ED7ED1E297AE2C9B9B07AF90F5982930021A7133C2A2339D743AD7A67667C1D938D08C40908292C689B934E3C3DB18E6BB4F6EA913968485D0515FED2E1D835CD6B9BD2367765FD99F74DB1CEB16D866C761EBB929917AED833C4484CCA9C0264E7399931D44753D83F086448521F0EE035D2185726D397EABE76F621614B52D2056809DE1C6ED52FC79659CF0CD8AC0B0D65B0C61564D38DE9E1B290948E5A0CBD79FC2BAEEC9F0260F0A9015252E007DE48C8532E178869DB56729759C5292ECCAC83BB87B7AF089D18724A4B72584447F408491D00D3BFA73AB6C9D818294001290198064836CEDAE54D4B988C9BB4C12CA56F914FA9CF5D32C8D3BC7AC614CDBA83BE33CEA89FF00F6AA67CC67E5FEE2909B83968594CA410336D45AB972FC42C3173152C268126A00C859868E21FA909223810465A8F39E823427CA915E1C9AFCB7A55DB203ABD3DB984CAD4EE951A8ABFA694EBCE17693C08E1002626001909E9FA8EB5812D219D0464E406A6B7E9AF184D454413FEE3ECFBBF584D4DB866081D3F5FB3D7E3B7CB4A88FA7300903234A9E3DE19AA54D2E778EE8AB3B1A7BA65DA18BD64B716D289013EF78C53F98FF00D6391E433E5E662D1853265482C9A32775C060D77F366D7842D2F18A928092E487A1B8E219D896E55346789EA46310510414410510414410510415AAFF0089E9EA2086970471251FF79F8A472FBFDA98CDFF00774F3682239E50532FCC715BB657DC0009FF007F6299CD2D2D674493025DC3B5C5B9F1EC3F6C3807BCFDDF2F7D7EDB7B518DE3A97719D98D83532D7F2CB9FEBD9B6AC4AC4B40B6CAA5293E280A3FF909D419F137C6AF14A70B8AC4614AC823783386B1D1ECCDFBBFA3FC1189972363CB4B805AD402EE4906ADA64FA3455B57BA8DE46C0E23885C6EA4AD9B7B3522E1581A83C1A7D025C0D22D99038E402003919F8FCF2F1763063F1F34BEF6F2CD2F57A357F74ABB45E13B430CC085A083BC1DC528D4E2FC5FCDA9D99DA9F69EDF0D862F82DC6C4B7B1F6CD2516E9BD770FBBB274F00285B8870120F1147171644C8275AD363EC733A585897401E81AF9FE6BA662A61F68E0F07BA9993F794B2774CD507357A13CF2E91963769B92C6B6230C38A6D3631758AE36A70AD4871F53CDA55E21C805C2C08239CF789A8BF116004996BB16A65462D7C9BBDE8F58954ED992A2109A519E8C5C6473F224114CCE60BF4BAEDBF1BE84B6E70C14A072190813398D67227E7CC66A01986F760070A6638E5911AC3DC34E48427754A50A9BBD0F1B3D6E3F5169B6D7F54C8124E51209D7A99EC738AD928208FA41E14CE9FBA7AC3D97354A2EF50C5BF23B7A8872F5B4AC98D6232FD60FDCD3F9325C5807A923ADF2F7CE1E89EC5BEAB5C56B736FB0A425F85EDF2FF00FE4D3912C3B96E82ADCF28792E6D01766C9DAE3C8F0CA1C22D55C2397CBA763D64F4D05349D2885BD0699655E7DBAC60CC4851049232A8CEF7F64E96854DA280399F847E95B4B95BA5CDF2ABB72F7A9A420B9A6C1BA1F5D7CA1C36C10800EA3969FA7ED34F522828C746FB4315A8B924BF2FEFEF48AFC0EFF3FF0014E25A094824004703EACFFA221BAA687D1AD7CF979D042C84F0A427A4FCC93492BF91F7943D45520FBBC375FE53E9F514DD7FC8F4F410EA11A6CAB9E67D608298CCFE6AE704327314B4B7B945B38A48B8585A5906388983300E663B4763AC4961F0A66201670D76E26E5A8789A0E2F0DF133D32D0A1BC58EA6EDC3EF78BDB656DEE4DAB9E28595A9692041260AC11944E635CE0F6A929185DD50200BE966C8356C598B5E968E79B6B68B0500482C43F77E347A072285DE33BDAB45AB76904442465A119099F53CAA7E47D1BA416CB466B79DF2ED1CF66628AE6106A4A9989E3ECD4085C9813F2EB53327115634D06BC2F56A97F4891932B7C0DE0FA021FEFC3830B887CDE6CA08C8906077EBF1FD32A6F352262C9157B51F953BBE9084E64CD2906CC468EC096F271CF488EB911247F8CE073EA273D73ED584A08A873AB0A67F91ECD1590B3BD514E1AB54FBEB10576725CCC4465CC41FBF3F8534C67D20BE6E3D07A889A90BAA493FC5E838EBC05F5AC59D7C499E433CB94683D4E507FD554B1AA62483C4D6C497FC8112B2945D24D5CD46B58C15BD0DA74ECA2B09BF52F8038E96A6624BAE25B83A4FE61CF3CA7954A61B1891830924D4103880F56B0CF21CE2D9819489B2DF7492DD32F315B74317BE1CEA5B63F1474B86EDDD0A3FF009A52AD4CEB320E939F9543694933662940E74E3C0F4C83D21499282544E45DBD1D9BB5F5E30AE2CCE138D377982E22A5A19C4592CB8B948042D0A4E5C4623DE396B9EBD5DEC7C47F87392B3A82E2F43ADFBD7BC3254D9921237777792E6BCEC39DFDB8E72ED4FF000B7DD16D66D5E298E0B92A77135ADD5A7899D5695183EE480788EB333A4E55DF7C39E3C184972E509E400000EAA076167F4FC46A36B848DE2EE0B1029997A598D6B9000B0CF9AF87DCE0DFC3CBDA9B6B764307BA2F6178F5CE18866C50B4A8FBACA4A816925293EF3B23203E157FC76D71B63672B1213F313291F5CC4FD5FC9DB78F90CF3E1166D9D3938C9414A3F4AC58B034D327AEA03738EEA6C5ED939B7F81E17B476166BB4188B2DB854A6FC39F7539C82275D395797BC6EA94A9D34B3073609A5E8CDA9BF7687DF291293BA15605B78FD5516EC4339E7AC648462372D5E165F6C2DCB64A4359122EBC44C2C1FF00BF00C8467E99554BC398E9585C6CB4A887DFC9812E68EF5A7BA44162F0895A14B4A4B170C4684D40B7DAFCA2C3C69FC736336A6C76D764AD0B4FA9D4AB14B1610A090D88412A691D51C4A12635F4F6CFC39F1961F0A8C3A77C02371AAD987E15FD8E341DA9B344D1312B4A54820D161C1BB16ABB1AE7C23A61BACDBAC076FF006558C5F0FB86BF98786D0BAB60B4788DBC984AC29092482A5856A79F6AFA6BF0CB6B6CFDA1B0A4E20EE1514A5CD08AB371CB36B5737E09E20913B0D8F3200795F5329AA033B1C8B74A335A336D9BD70F34D2DC6D293C2A0490414F0E4338E63EB1CABADE1E7618A3E86049B00199FD05FA031569A908DE0E09241BD6EFF9F6D1236E14B68294482641CF9490397A7CBAD3933124FD3514B446E2012694F633E3F68F1693A491DFAFDF9D369AB510C0916B58DB8D5B8F7A088E54B2E6BDCD7D214524FBA00CE0FE9D7CE95972D3BA3786F1D4D49CBD479F3894C3CC9611BAA351976E514F0A872FD7E95BFCB47FC476873F32528DEBCC57B9F48F0156A01E9A4E9F1158F952BFE09EC232F2FF00E447323ECF154AFF00F2F851F265FF00C13DA31FE987216FA073F7A7A47A41E11A73264FAE7F1E7CFC8D44E30CF4129964849B0141C853AFA110D664A04BB528F4A060D4E3CF5EEF2A4A330510414410510414410525F346F6EB1F7F76AE9C608F098127956E7EA4D33D79C10CEE13EFB5713EE3721439FBD9081E7AD359B294C585FECDEFD3382216F3FA0CE30EA892916370E003586EDD6A503DF281DFA5466255BB2A627FDC50BF43D2364075241B150B73A5FA472A372F7D69B4DBC6DEB5F1B0368CDDDEDA072F52D06EEDD368B7529F19CCF8A0A21327F29AF9A7F1E70B8A9FB7F13B8B213BCA60E6943F7D28C23B278713393B39265A8540606BDC7B6EE23653F9433785CC58B858B8414A0149E12E04C2071E5272034823977F1C6D0C1CC93882B9877B7555AB9BF2D687ED5116057CD9450877DE04B582732696E022B76C2F1A2A53178F31C6078ADB4E292DA80038613CF5939913234322CFB276C48C3C912E83E96233F3CE9CEB1B842A784AD602CCB3F4BD59E9467FC660BC327180E366DEE5A696D907FADC32F4F33C46739D7CB2CE6AB5E23DA32F13F3371218D2D4E24B52A6BD75787A84E2490A0B395892C45079675CE8E231DE3584C3AEB76EB25B0014970FBFEA4469CB98CAB9FA702A9BF586152C34737E072EF170D9B8A526484CC724D88A695E009F6CF161BB62E5BB854E70100C426675331D065AF6D7232A0C0947D4A0EF974C9FA92FCB48B0C89A16414921C3DF81197BD0985525B500A854C4729ED9F91F2F9D2BF2CA064C3BFA0896952C901414F7BD7CC73FB410DF43F015B25612DF4B9AD6872A3FB685144A033960D416E0D685836952530400064244FAE46905CBDE53D1858396F4B7B31877ABBF1850201D483E46B2943172DC2355390C3AF28A0A903224C8D634F4A581000A026BCC0E3EED0D56EFBB964D9B7AFF0051E05A39854FA476EFE797A56E2790C1879F330D57FC8FBC8452563903EBF7F7D4F30A029D4FA7E3FBAC494921494A7302BD3DF0786EB39475FD08A67301770D5D780FEBCE1E478D34B796A6D00929FCC6321D3BE7A691396B48250A5D69535FBFB2D094D9A9942B736E9091212EA9B70F841295A94E2F242781254428F2240CBAD653B3A64D5E75209ECE40FBD435E9947CDDA6896EE199DDC76ABF38C0EC398C6DBEF430C6B016DD461D83DC2C5EBCE85062E02C40F00A642A083C53CF95593058612E504AB87F63234198B1BC57F1FB553312A4A6EC5B8532AD33BDB578DFCC330765BBA60A4250D969B0B6FF00B8A92D804C72958273C8EB5226407253FEE6F629EEA1A2878D54C9B2D4564935B59AADD80BD2FC22EB7D3C2E148C8240CBD3CFE3D6B7F94B0C1A9CC96D32310B2B045453343DF4D0DF23EF330CDC4A95319CC46B94452E994A4B39A6A1C1CF3FEA9133280400E0E6F4AE62D7E3D6251949F051A640CE7D634EFF00AD3A4495302492F9BD8E61EFDB5BC47CF46F4D2CE0EA3F35D1A22EE96912241CE08E7E9A1E5DBB8AC4C589798A3DAB6D2DF885A4A0A540105DDED4D0FEBF316FE26F22D98F19638D2B07DD466A11AFD75EFCB2150D8C9A54F50F561E879BD4F0CA25A44B24A83170DC882F6D695CAD163DE5EB0B4832532600244F2898F2922797C6A78B49528872378DEA1AA0E6FD386994BCA410AA82D421813A9FDE87AC692FB5D6309B6B5D8EC259722F716BF49B6208E1E162ED953BC4467F9721DFD6A5A5ECF9A8C1266BFD206F1BEB47A53339DAE22E1B2E7265A260291F500C4F3B3836AF1ED7D9CB6291B3D67C4485B56160544FE551F05A2634E608131CA44D57A74C0B5996DF55452F9BDEBD472AC667ACB9600825C11C6AD9674666A56977C87DBBA6987FC2B6E063842CAC0F155C442473839CFA18D4D4263F19FE1B38600936626BAB0F5883C4052D4A3BC72A3D052B5BE7179A509C3D1F8F425A9F08AF879A5294492A19408CFCA62622A5BC3A9C5EDA9D2E561D4A495AC0A920D1474A1E5F7262255226294523799E86AD7CB857EDC63E5EFDA3C6C46F5FF8945ED85EE2B6D8B2EC6E6DD6EE1D66FB6FF82A670F4AC05347F292519E998E5AD7AE767F85B6DECDF074C33004C9C4CB054B5056F9DC538DD2455B3AD8D23A6F86B66A9787960A8EF245413624D7F5C4E423B41BB6DB1699B3C2F67B09B54DAE1F66C8650852381D012809C827DDD4035E5CF14E07153F18BC3209DE2A50705EDD6BD1F37D22E6BD82B9725539442830B9A8F20039EF6AD4C677B5C4829696C32EDCDF5AC96148405FFC827FAA75809C81D469558C2F84B6A22709A12B2C527783B1AEB99B695B88A76D532F09BC4A9225A87D6972E96A3A45B8FA69101B49BD4D8FD8FB7B9736871EC159C5EE9050BC29DB96D372A1051C0D30A3C45C283A7581CB2EEBE0AF0F6DB9D3244B419C3EA43BEF80CE3B5BD961144C5E3B0B30A93BC9176B3D439E6DD48A868CE9EC4EB6F1BC4F69F15C2ADF11B7C06F956EBC351788E148238FC75003DCE1528CA4A41F7609D32FAB9F077C37B5A4786B0C95CC50225A6E540D783717E46D48F3C78BF1D286D198037F22CCCF6A9D0F2E1DFA34DBF72B7D564D16C2D9FF00954660A48900467200CC4448E46BBB60F6763E4801531AC6E69C81D5F818A42A74A24CC6249C95566D07EF3E7170DB0FE8A40293DF3826615D32E9F3AB14842D29014A7A5483FD9075FDC339877944DC7BA7BF48A94839E52272E7F2D69D5086207322BEFA43428AEF1079353957EE6F09A9B5932263A67972D07DE758750A034CAA47D8FDB8C26A94A2CA49DD15BD6F971B7B68F381CEA7E7FA8AC12B218100EA493E4C2309973011F50E4CCFE515065CFF00B01DA4FED5A7FAAEFBE1DB43F985BE5CDFF926DA9F4DD68AC36A004904FAFED434D37507A56B956DFBE7A0DC2161AA1C73FC74E3092DB5CE4091CA34F9FDF2E54B0DD23EB1BC75F67DD21CA160065024EA0DBBDFAC3BAD613828820A20828820A208299FFF0013DFFC608A57F94FA7D453A47F11D7D4C10DDF8F060F323E4AAD5740A26D422BA0AB0FEA088CBB48B8B7C4D09125766F3601E7C6C2D1CB3F4F4EF5078D6DC5EBB8AFFF0012CF96BFD46E8A282B20473D3EF1CA8DD0DE59E13BDBDEEEEFDC4A2DF11B7BCC3DCB79012A712FA9CB85708D4FBAAD3FC47CF8F8D5289DAF8A2C1DD437855A86E74B3DF9D5E3AF787676EE0E4AB7C2420170F7E0D9FE6F48D9FB860F8E70F6D6129414124640C00A39F3333023ACE75E2BF10A77710B0E5B7A9A71E8DC6EEF16613F7C024558DF3F3152CD5E54115DEAC2565214141294891D426398D41CA399A819001994766CC039676D21C61C28252E0877B86A0A0FB7BBC03EEE7CBD3C865D796BA79CD36C7C8242980AB3B7953B0D29D21F4B99B94670E3B67EBA18B5F1148515AB2931A73119F7190F5F9D454A4196189001B83F6D6BFD44EE08EF252470BE57B83CC748C7F89B79AA67231979E7D7282477CF9450A5B549059D865D3F35C9E2D582965C51EDA3369E62FD2AF10215C038721CF3D73F514D262C176CDBC9AFDA2C9291F487A0F3E0DD83BC7BE2F74FDFAFD29AAD443005B3FEFDFDA139D2CD58B92DEA3200E86154BC024684E73198D7CC7D4FA51F30015F2B7AC611299357A7DCFE72FDB2A1D498EFE5FBD67E624D8BF01EDBCE02821CD0B778A090492343FB50169363D7286A45C5473A18F2B1F3124EAD9D0B79BC325214E49CF32EFE9053C97FFBB3D3FF00C8C3E904248245DEDD7DF48A1424A472CE7E54CE665D7ED0F45B2E968AADB1145ADF3768B489BC0BE124681A4C9CE39FAE47B56924172055FD06776FC5DDA23B184298B91B8ECD6CBBDDF3AF9E2FDEAED03F68DE178261DC49C476A9C5B36A10616916EE252EC419CD249C8491153F8697BC037F2B8E44E7F76F3CAAF8D55C062C1CBD45BB0F75148D98DCF6C261BB2781DB317ECB6AC64341DB979491E2294FFF005132A2388C255913A659F3A9995242432DE80114CEF6BE74ADDB8C5231F8A593FE92D3BA4B1292F66703B7AF33911A65E17EE3A82434954889394738E63C84F5D2B64A4A560D48EE0303964F0899E160214A0C457B5DD87BA50DA57C5F18970EA7231D801FA67DE69625CBFA70A46A1625A025352E74A76FC7482B216406A7BEB07CF660C4BBD5BD6B0A17B81A827A83DBA4651A7C7CE905E328500B3676E2D99BF3CA3225A96A7E447137AFAF017881BBB9009EA0664F7FA93DB4A6D327EF87D6E33A65C07AE50FE46195BD7714ED5F77F4316A5D5DF8CEDC34B3EE3404011C24913D73FD35CB3A63392A99517ADCD00C8367E5CE26E4481402E68E34177A587B61164A8B2EADE79F70356ECC9E251E1481AE73CA44E83A8EB4C7FC3330871987CB3A1E397DF211232A45992546C031A353DD7D639EBBD67D7BD2F686D8ED99C39E4DC613B26F5D3976E36AE26D25E652EA388891F99394F7E75318A5093B30CB269BA7D9CA83A71BB58F0D861F29D41880D6A662E4E678F2D63720E265F09C1DA02586DA68919710690903DEE7F96464749AA061C0998A2D72A24127BD85F2ABD68F0BAB084A416372D471C0B1B0D7FB89862CDD5A5B6C2C84AC852C4C0FE99E2D07FF0058F5D4532DB98054D4D03DADCE9906EE486B58C309D8437200A97A53B37AF36A4618F6AFDFD617B8CDCC6D1EDA5E5E21ABA187BD6F66CADC016A71C42ED814A4C12429409E1E7DEBA97C27D80A5E330EADD72E0B0150C7D915A986C30DF5292A0404B17670496B393668F92CF61ADACC5778DEDABB61B778FDCE1AE5C5DDE5C3DF8ABA5137696DCB77FC3971449108238794089022BDA7E295FF0087E0ED9F8647CEDE5CB9817BDFC28437CBCCD039E56BC593646397855A92E404B3659676E22DE71DC63BEDD9BDDA63785DA5B3D8A6D1ED0E2AF3E8B4C3B0F28BB0B712AE14B686810A3F98447EE2BCD5B3FC21336C6D641F96565732859DDF8FDAA6BCE2D98AF10FCBC210A5D02490E4B0605DEB90AD5C0B3E51BB7B0DB01ED2DBEAC3ACDCB2B3B0DDC6177A125C7F1B6EEB0AC7576EB208532A48292B2D994F2823BD7A63C3FF0003A66270B295330CC5490A7523AE61F87615A479EFC5FE33960CE32A689894A98896A06A49F537E2D6A08DE0DD77B0D6EE36510DE23B6C85EDCED428216F5D6D986B11B7F189926C94E242F873FEEE5C23CBBBF817E0A4AC362251561D0374B90A486A31D3A6768E398AF16CD52D43E6292836282CB15A3B71D33D408DE9D8ED91D9ED8FC391618261587616BE1E1FC3D830965A427904A52343EB9D7AD761EC846C6C1A30B2C04A4240205A8CCD4B0FC52299B5315FE5E21530A8A80620A8FD5C4E557A1034AE917531861656E3A552E3BA9CC9D343CF29FF007532E3511191276AC96194B64C90499F333400C19DF89821C5660828820A20828820A20828820A20828820A20828820A208299FF00F13DFF00C608A57F94FA7D453A47F11D7D4C10D5F696E363848100CCF998F9C7F8AC2E893EFDEB0432B5656D25E0EA924B808CB311075E472311E95078C1F4A8FF00E25FB1B7711BA54032732A04770FE91C96DFFE0EFEE7FDA7B01DE7BEA4DB6CEED638F358938825202D8B616F6FE31C91FF0022870CC939011957883E2FEC75CFDA1889A949DD724122E19CB71CEEFD63A3F87E624E1D290A04A5810E433D2CF99D286E7439AF13DAE690966F6D1C172E3C8438A6D83C6E04BC9050A201C804AA5463313A45786FC5D81323133090D53C29506F9B7957845FB0528CD6A64F517BBB6B4391EB4312D698BB6BB76CBCE78AE11C4A5A0F124CE704F54E87A10455264A82166A58DDED4A6BA1A166BEA5AC12F04B290A20D03B35BA70E459F9452E3E8733492274931965E5E5DF9E959C4CD4A839209019870E1C58E56E158D178662000CC6BAE64FE053B3C46DE2D01044891A9FA77AAFCC50249A804D2F6E96D5B9DE25F674B526EE4351EA471D453D78463EC56E5B0B5403AAB2006599E874CF974CF4A66B5BB8D7434CBCE8C7D88BAE0124848CDBB706777E9D9E2D371E0A515007BCE5A08EFD3F51AD3598B2976C98E8F6BFE338B0A65D057CBDF4BC781C49CC4C7A7EF4D973BEA05A87F593FDFD6135A0BB38A7DF8F6CA2A0F84E59769D7EA2B099848CB3BDEE6F58DD082C069ABD5EB483F129E7A7689FA9AC85105F5B8C8C6AB946FAF6F4A43943E8E111244EBD0796BCF4D7E228DF21C814BB54F6E6619CC940925883981D1B23C7FA8582B8A72D22B50A20867AF0A7584552D2A0D6EE59B3F7D697A4BA90A2933232F3A7D256A32C9B31BB90CC7DF484012956E0C9EAF5D7AF68590952F4103A9D3E5349AFF91E9E82174CC648FA8F427DE70DAE2DD01E6545A5AAE42FFA0E04CA120C05C9D47126440D29E61653A8646C0581777A59C5002C6ADC218E296774800126FC1DDA9F739906315ED8DBB877BDBBDBF7F0DBCB8C2F0372EC2D2D34572BB96D2949483EE901C92A3D3A9AB6E0F0C9012C32CF3C83EB91E19D22A58D9AC561C824170FA8B59AD4195728DEC43F6649716871370A6580A00001292DA7802A73900E731CC015349C2950752686D72D6E05BFB0E050D0312A4A17BA8AA5C977A5DCD8000BBF1AD9A1D7E2AD30EB72B79F6DD53D9210D2829633FEE1946B947CB2A49586A12D5D1980CAED4F2E1942682564862199C91F4D43D0C37174CB5EE292B4EAA055119FBD999E9E5E54CD69081BBBB9D0D39E5E94CF8C3C4CA5101ADA9D3B01F98A17895B2464B4ACFF00D5264FD3FDD24A2C0D5A85A1CA70EADDFE2E722D7AD5E8FEEB11CE62D6EB511C7C2AFF00A28C1196597CF49E7CAA1A7A8FCC56E96395487FCD3311272708B094967A685EE323CAC6910189620A6415FE1DF753AF1368919F33DB4131972CF5D10951D4826A732D5B86E54C9F4893912536DE4EF13FC49FAB27719EBA3748B22E71A4B2E29E55B5CBA2EA652DA24B013A97C4FBA2093DC024C53996904A5F3C856D77F22F1332F0C58170929AFD428AE01AE72FEE347BDA7BDA2B05D99B17B617642E5DC576BB14429969AC2D697BF04EAB206EC3678D0005C9C8C70ABA5384A10087506704B102859DBA44BE1F0EA5201DD6A5998E41F969AE9AE2BF65CD92DAED986714C6B6E6E2DAFB6AF1A71A798BA654B7434D15A95C2E2DCF7D2B0CAC2607F703CB2A8EF10CE929C3CC4E1BE67CB0004EFDC16FA9DAD5B3338E158B361B0FFE8A42B74BFF002045D886CB2E7EB1BCED5A06169BD1FF0022932B3A12633F9F3CB21D32AA16CD56F62DDDDCB8CCF16CF874348D9694B948CA8D91D1AEDA8F289CB472E9C4ADD688525F292C273E24041FEA8580722A12131AC8D79DBA7E193325870093BAC746350EF5A3B74AC46E211BAA2EC0203A9EC7787D246AC4579B8B3C7CF67F197DA3DE4E2988609B2F82E078FB9B16DB776E62AF5BDBBC6D4786DA5D4A9653FD3E10E26655D2626BD15F06F64E156B54D24A674BDCF928240DE2AFE54B939BB539C35972945082B295124B949A370EF6C8F111C3BF62BDFBEC56E9F7DB8BE33B4ECBB74C5E38DB4E2D80DAD2C061A5B4E0794B50093A83DC1ED3E93F15EC3C462F64E0E59412890956E8DD3FEF634147AFAEA61E61B08F34AD2D5ABE82C1E9DB4D1E3B84E6F77723B578BEEEF7B1B15895A3AE6CE623E2E2B62875855C137172CA130DB64E498515711194D33F875E0E48DAF2BE74820A56090A48D5C30B39E19B35210DB52CFF0089312E2A8527E922C4350D0BD69561CE3EBAF70DB7DB3BBD5DD7ECB6D8E149B276DEF70E61B6CAF855C0AB765B655C1C2602814E647388E95EFED93B1B052364CA5AA523784B00D038602D6637BDDB998F21F8A70937098DC44942E7195BE548517624B921474766190193C671B1B1612F2D2F22E2E9700B6ABA85B2D889FE9481034F38E74EF038CC1E1E794206E92CCCC18E6DCF955ED1CFF7267CC2A25543406DD0519B5FB44FB16A8528DC84F0B8AC80E402728E67B0CFE5562F9A99B5497196B5BF9E94EF1BA8104BDFDF285822E94A2A2A401C86632CE86CF4FBC6B0ED1C7C23C4E1E2E7C3A7CE8822AA20828820A20828820A20828820A20828820A20828820A2082738CF499E5FEE993FFA963DB837EF95608A57F94FA7D453B47F11D7D4C1142085028E9FBCFD7F5A260FA6B627DF2BDFA406BFA888C52E45937E202233EC3213CBEF5F481C6D88176367AB81FB1F6AC640048700D45F9C73BBDB4ED2D76F361312B25A02AE70961DBBB479A00BCD3AC82FB6904E69E371091035903BD79EFE20EC438944E9A52080959A8B9A8BEBD2DE7D23C37210501690EA5338B545DB3B3BF5E11CF0F65CDF33BBC0D8E7303BFC4D08DE661576F5A5DE0B70E91722D98BB5B2C28B0545DCED11C7310419D32AF9FF00F10F667CA9F3CEED5D54B70007DB3716B4762D8D854B254BFA521AAAB559AFA9B10E46A1A37AEDF13FC234DDBA894A9284F10320F1912A93D02A63E51A57009D30C85900589BDC70E8ECC43C5EE56CA0A961696622FA3B56F63DAA4C3F6F1B03FBB9EB3FB18E93A475A88C663C00CFFCAF534EE78548C9D9E911989D9E12545B30F6737E163C352D0CEEB1A4F1292173DE40F3E47BC6BF4A8F4CEF9A1C1770F7C8FBCFCE34C3CADD56EF2D72B657D0708B6EEEE7C624E5FAEB98F4F4E9A655A2945D81A70378B460259041160CF6FB50535AB3E7588570FBC40D01E53D8E7D629ACD986EE082FAB9E7C88EC45A2793603DE7F77FEE2A49040D3CBA5335ACB105DDE872CBED90A40A43D6C72391841C71295904E7974E9E63CAB644D094D5C9A75A9D7BFA438972FE9059DF5E19D6AC7AC51E2A3AFD3F7A0CD0C18ADF3ADBFB8C2E580E2E74BF937BE50FD820B608D0FAF4FBED419D57AF26A767AFAC32584B97EE687BF38916F9FA7EB58F9B5BAB3AE96D3DD28346AB4328B1E795C70F385916FE2282A241E71D32D63B659E5CEA4E4A8FCB0F6604F1D399D34615AD2227ACA66001F7AA4E8FE5EED12ECDB42047088D35FD8C759EFDAB604296F91D796919F9A1850726A8F3E5CFA43830DADA538DFB88564B23212759D6331FA8EB378196EA4B338F322F9E9C75CCC30C42C1DE2145D8167E1D6E1FAEB688DDE46CCE358A6CE9C5B654B4AC52D9A2B67F371F191970F067A8E46AF78291BC90401950799CB872BC5431B38296524907EAAD82AF50D7CDFF004D1687B3EEF2AEB11BCBBD97DE45EAF0FDA4B05F8776EDD385AB65A5454A60254EFBE47860033A9F4A9A4E1C10067AB301C1F83EADC338A96310A415AE5A4AC82084A43EF7D81E2236BAFC60CA6DB6ED1DB7BF4C8297ED141D20CCCF109D3B1FA5359F204B191E4C417B64DA9EA2F785306954E482A96B96CEE169637A900FA7586D70E36C8287997D694A07BEA124822609CE6328F86794C362250756F05240B1B71A5B2BE8EEFA4C61E46F91F2D52DC64554E1974CF4A345A78862D60C13E030F29CCFFB5249F841CFBC729E42A2672909A872D42FABB06E1C866F13987D9D38B29625EE8018241721858E8796BD2CF771F75DB85F8B6E80CC8CDB49FC5360092A76623ACF20338A40E18AD214452E08AE6F7AE7601F311292F03BAEADE50B50FF001391CDC83634F26318E76BF7B3B2DB2695AEE76C30D5BADE6AC1CDF2157EA3FF00F8D2C1CCAB4CBB839D6ABC3942410A1C52FEC53F1CE1DE170D28CC2932085021E62922B4A6E9CDBC9818D42DB3DFFED66F2EFAF365761AC6EF66F0F30DDCE2D7AD2ED6F2E90B0655873CD9217971054820020999CDB297B82A1AC090EEC5BFBD72A0113F87C1209AB2C38A1A80C459F8DF5F4B4367B7236585DDA717BC69FC6B14795E2DC6217094DC62EDB84F1152DC202928049009FEC1234A6EAC60466E32B3DABA9A1E1CC5DA611874A52280301A07D1A9973EB9C6CDECCE002D50C3885A5E48193A832328F74AB4949C95AC28543ED99BBF835281350DF8772C7B985C2D2964B860EE721A71EED1950A816020EA040FA4F2F38EDDEA9FB266286281BB28DCD454737ADDF8EB0D96B01C8AB8C83935E2DC2BF731459BB76A6DCB603F0ECB6A4C5C0949826550AE51A65196B15799939909FA98060EE003D79387EBC6184E5209DF512A77649AB90294A694BF3CE354BDB797816CFEE17783B4589E1D85E35F87C21C16CF620D26E0A16B6968570A9511EF473E5E95E8CF83B881FE66180A82A4872F67F66BF686A89DBC80427E58ABA2C29C2F6A9CCBC7E7F8AC6AD1EC4F69B1A699B7C314FE2B7B9211E0B251F8C7920339E7EECC8313957BE676C74E236326629D6528428331624034CEF4B5380A43A91B4A54A3BA4849CEC32E0C18937FB18CA1B078EED65FB89D9DD85B8C7D6BB94A9C5358629654E2DB05D48692DC924A802246B9F4A6FE1190946D64A9406F6FA5FA503FA35F94436DDDAF2BFC7584B541B1A73AE7ADAE35A7DC9FF00ADBEDEEE33B8CB0D89DE760BB45636D80A9E4E1F79B40C3EDBEF876E5C59E35BB214042424A63223AD7A802D6BD98128A3A0333F2E9E4794798BC61B411326CD015F5025CBB8EBC03F4BF3FA3AE1B90095A9B4A523DCE1273026049D328F2E5CE6A387C1E326E306EEF1651AF992E0706E79E714594A41BA779F2D3AFEAD5E5258738B72D92A7014AA4E4441D48CFE15D0F052E64B94913410B6ABBEBC7AC37C5A5299CA092E29D283F70FA9EC35828820A20828820A20828820A20828820A20828820A20828820A2084CAC82440807BFDFCBE349264952DF4B9CAD953D9E461354D4A5A84FAF4E5D22A90A919FDFC694002433DB33190B72CCD0D5B205C3A24C2635EE272F3A4674E64B641CBF5EDCB90B429761FD9FCC5ABB605430B79F4E41B4924692049CBEFAF3D61F1002D254E33E341CB4F5BDE8A22592450BB8B57BD3EF1CEDDEE5EBB77846D23B6D2E855A3C5E6DDCC02D34B29E103FB721C4491974CEB8F78C76A61F766E14A7EA00A5D403BEBEEC63AF7857045587429EA5AEEFA51C69C8691F3C9B1382EF176237B1B5DED03B349B9B809C4102E70BB1F11568A61A7576CE16D94C7BC1BE252A4FE6D6BC61E3FF000C2B68AA72E4AF7492A2082CF5E0E0F91CB9F6ED838340094CC01480CE15504BD3414636CF8C759F76BBFDD97DE66048C5EDEF9BB5C4DB4368BCC22E1C422F9A7A78172C0515005614AE7EE8122457963C43E119D83F9AA54D1F4924806B716B67714E0D48BFCA969420237286C52030622EF67A65967966BB0BF37C62D945D4A512A5A33427DD98528686328EBDB3AE2BB64CEC32D49DD2589A81C59B2A8BB67E51198E9297A86166199B1CF26F748A54F38B5A97242742093323DDD3BC1D33D33A4B03895995549078821C1BBBFA8E1C618CAD9E662B7D2C00A97762723CDAF5F48A937FC1F99975644E89D667CA7BFD73152482A591603B5C53DFAD22670F8732CEE82EFF006DEB30E3A08F42FC585A5B5A02B92844465E9DBAF2CA96183F98C4A921C9600B538E7F8E01E24501207D44150CB5E747CF4A1A9BC29C4842415109EC624EBE53DA951B18ACB99A91A024E94D05C545E8748092737F4E828DDA239E5A54EAA0C8E4797E9CF2E79D466270870E482A496D0BF7E2C7979C6C9C4EE108524B3163AB0E7AE659EB68F024AB3047DFDFDE751AB9A11A77A77F5FBC6DF337FEA0925F874E3A44B5A7FC694F3060FC7E3F4AD133F7D411BADAE473B1ECDCE8D9339EAFE4A6140ECDCAFA9F7AC4FDBD9B8E890A4671A98F3D7E35272B0A66241DE009C9C3679F6D6F58899D8E4A09705C8B916C867CB56CDE24D9B752141A50E229FEE198D0739F8FC0F3A723FD3FA0924E82C5B4B3FBCDE22E6CF4CC5EFB64398A7DFDBC4DB164E2C26074EDF1D79E87A9F83B9127E62812EC0E4FE6D97A437998842695D5EC73B71A44EB5847E2994B6F04F87A029FCD139E664663EE6ADBB3F0CC52EED537771C05F3047A8887C462D0EADD249346366E0D973CF4CA5B0FC25FB058432F2CDBA89E26D6A24C7602AE5833F2C00C28D931A67C7AF18839F342CA8AB76954DA8E00F32D66A8886DABDCF6C9ED9B4FBEE34BC2311B8482EE278725B62F5C291014E3B1C4AE180019D32E74F95B424CB05252E450167EE4DF4E0CE620A64DDC5804037DE0CD7B1B79E8D7731AFD8BEEEB7A7BB8E0FF00F02DA36F1465B595706D25D3CF4A78A4001B006432F9654CA66325CC2490CF9022957CF8FBCE1F499B2D49092CE4977E3A96D1F3D2CF0C93BC3F6810FA8E3183E0570C242415E1EC5CAD0B84804A4930731E951B3D6A9B41D2ED4356E9A6B5D626B048C3211BA120977DE663772C7ADAB4D22C4DB4DE3EF70B0B182ECF30D5C807DE7ED5E08E239CFBB2489988CA39D464CC395134B9C9DB5D072A7E62CB2264B003173CF875A575A4609BDC3FDA2B6F1A8C5F17B4D9AB57894A9CC11EBAB4C40A78A21C2A904C6424E4093AEB90B4C90CAE9DAB9B1A534787416822961951EFA7BD625365BD9C7F0D709BCDA0BBB8DA0BB510A55E62AB17373275295AC4CE7F28E8698E227CBB0FB70360DA5AAFA98732E720067D19D9FB0F76D699FB08DDE6138516D2CD9B4A2D8050EB8DA7C46CE521063204E59C6550F8898E5F4D73ED5341EEB12B271728252D7CC585697B3FBD62F746CC593A80A4ADDB77844AD82105E11925C3FDC00CBA807A45442D678BE4F6F51FBA1D0C3B5E3DE8908296FA8915D2963A69DE1FB762CDB302DD2CB4C944C2191C2DC927DE8EA7F32BA9EF4DF14AFF00230EB9207D6CCD9307C81EBC223D58E44B5EE83BC2EE6A4B9B7E05B5E292587418253C33966491FEF2E5FBD5691255B3E6FCE58700BBD09E5DF40FCE1413153599DCF1605F9B59BFAB4561DB8B45A96521FB55A7FA8D89516C9109244C244E797298CE9F61F6B1DA1351874214E54002DC6E3D96CE80422B94A2E09AE47DD072D0D59E386DFC4F76F36B37A5896CEFB2DEEDF137862FB4EEBF6F8E3985BCE78762CF1377091745A254D9532A504050FCDDB2AF6E7C06F076D09F3F0B8C4A52A09295044D7293CC58B33F2E05CC5E217B8E0A9DBEDAD1DF2A519E30C7B3C7F02DDCDECCBB61B4BBCFDA6DA8C79C7FC1BC7F0655DDBDD61E5E570BAE2576EEB67DC5384C89CC124E75EF79C572B00304B4A65CE284A775144D0370AF5376D229F8EDA0B913944294D56AD752D4E36CEEE5A3B3BBA7F635F65CD91C53086F03DD2ECA5B5C58F036D5E0C12CD172E848482A79C48F79440CF2CE67AC34F0FEC49F2F1E99EACD4EE4EB9171CB4B1AC53F6CEDB2A92A00AAC4104FE38971A67668ED0EEBF63F65F66F00B5B0D99D9DC1F03B4286FC3FE5D6A8B67084C157104E473F5835E88D9C52AC2225101F75A9996CFD4EB4B51F8A6D913311326CC0A356706C2AE19F8B8CF8465F72D564A0F88B2129FCA1592A00FCD3A904476FACB6130B2652B7CA06F5C1233D1C7B073886C295214525CB6649D2CDEFCA246C82C329E3E1933F97439EB9E7D7A5389C5256775F893C87BFBE9B4F52553094E801ED0F2928460A20828820A20828820A20828820A20828820A20828820A20828821056A7CCFD694979F4FBC3399975FB4548D4F97EA2915FF13D3D442C8FE43AFA1847861D7951AC69AE5D7F4A633BFDD425DB27A37EA16171971D22D9DB04716097794C20E5E87E3E54CA60FA59A8CAB0D787B787B21492A507AFD239D5E9E75CAFA472EB7B6BBE385ED5B587AC2568C3AFFC4CD420AAD9EE09033C8C46933A19AE35E35D94162762022A012EC3425FA51A3B078627844896934219A9EFC99AB1CC8F676DA96362771B8E63BB5364C62BC18BDE5A5F5B38DF8CE94DEE2EFDB347857D0382267B682BC51F11B6EE23662E7A5256129DE176D6B43D7A5C10F1D8B63E24290900B12DC496E1AD3D6CF0E778DB8CC1300C291BC4D86DA156C762375E15CDC5AE27749B1C3AE9774525A43086C4AF3720A4CFBC40D4D795F69788317B4F12A940AD414A20DCDDED56D795ED176978BDD4B29C8206EB64DABB172386958C6569ED8988EE871CC3776BBC9C3F16B5771542B87692C9A28B171B6DB0E871376EAB3494119E9D349A9BD8FF000E311E2097F35525DEBBA524294EF402C7CFEF11B8BC4826F40ED63CCB0D5E835E51B3FB31ED35BA5C4F0AB6759DE560092EF11F0B10C559178933987532633C93CB21DEB5C7FC1FC7E16614CB90A005BE9200A3E94E361A18464ED34246EEF3330A1153F67AD5BA5232059EF9362EFC8559EDAE07700E858C41B50D01E44E4476CFE134EDA3E01DAB8376953A8F6490E43816FEBBC48C8DA2852AA439156F215FDB9D1AB78611B4985E2EB439678CBF76E3874B57D2B615063DC00C9D33E53CCD50B696CDDB382DE644EFA49228A661CAE683AB718939535332C5ECC4D0FE7F65B38BC6E6CDE5301C7AE2E186C8FCEEAB875EA488FAE5F1AA4E2B696DB90B2DF3C373671A0ADF5A01D2AF658429802951B109A90E730DF6B68F0CEDDE436DA52DBFF8842491E2F105CE706543A69A11232AC61F6963A78FF5FE6151615243EAE3CF3F485BFC32A62D4C81E37F2CC919DA245BBAEE4E9CE09F5EB0465D674A9EC2A04D00AE845F79A94CC1737E40E9AB84E10243333D8E5F625FD4F794B5B900A3B4FC01FB8FAE469DCC952A5A77814BD2BA7B6B0A528D688EC561D92A2D4670DFBAF0F4BC5E36174084EBDFD7EFAE91D05444EDA8B904849342C188D3F54AE7567AD3F1D288DE167E67F75356191AD691775921B79285989333A671CBEFA73CEA5B073D7894256A241CCD8F3AF4BF9443952852C479FBD738BB6C996C464339EFDB3FAEBD39558F06A4A4D4D465626B4ABBE9F9CA22B153164DCB0A96E56ADCD7D22E4610D04241E181F18D403E67D0FA656BC1CE09DDBDBB3FE69CB8C424D52C28FF003FAADC3BDAFAFAD651A4B320C8111AE8341A8D3F69E756191884EE9750B52CEF9BB1B574E10C56A5870778B7FB8DEAC6F415B5DBBC392B4B44919B640D73072198ED9FF98A8FC56206FBBD0DD9AB4D7AD75A50445CD2A54C04B5097E595EAF5AFB30C2EACAD710052BE132208CBB46BF0133CFA014DD3880A7751072AF4D791BEBC21CC85949FAADC457DF4AD9D9E229DC26D6DDA36E8F0804CE47501464E5DC9903ECE4CF2186F31ADC9EBE599EF4898C3E24029290ABE55CF4FBF18B2F11D9DB77D4726733DA3BEB1ACFF9CE813C1A953E95D1F537D183DD844D49C45C8DECB831D73D2B9768861B3987B29085B6D29C4CCC0067B826397A10353A963397BEAF7DBA655A5A1F2318C0024B97AFB6A37EA1B39845B2092DB423B247307EF99CB28A6335EA2A79E97CAD5CB4AB34394625D4050BEB56E373DA1839837192EA5B0907310348EA0FEC7E951F312E906A497A135D0E55E5487D2F12919E54073E601CBDBC47396FE04C1397FDA728F5CC69CBD3234CD5289C800E5AEF77CC77870310F7722C5BCF33DA235D471B8489F41F03FBF79A48A04A49530E3A9F21D6374C833485901813C9C9662C1EBEEA4C51E17FF6EF97DC5203069DA0B1299CA8814142E6D636CF31CDDA464832C0A800543D2ADED87DAF83B7FF00BD5C3774BBBAC7B1CB87026FD4CA6D70EB30522EAFEEAEC9B767F0ADC85381A75C429C23348CF235D93C05F0A4E3B112270C3B82524326CC41AFBF3610DB178C4A105EE1D99FFA1F637223497D93F702E5AE258A6F877ACDAB13DE06DCBFF8CB87AE41791B34C30B51C3D36EA7878B686EED56DA5609FEA1194F3FA23F0C7C2C3C3F8792A52370212059AC2971426FEE951C76D015FA99DFB54D39C74556D2BF0EC052022324A522070A7241CCC6691396B3975AE9B8D299D8B0B4DB53A5AEFAEAF9DF3A76D09E263A81241A35C9C9DAFE77AB9CEECD8E6BFF00E6ECE468E0D27A8CB2E79FCC9CEAD3B2100292482F4AD0E9735D08E3D4C50F6AAC90A25D8851F7D2F4A9B523A5FB12230CB11C837A8CF90CBE1F1F4AE95B3EC19C30CE85EBE9AC51316B652C3D1ADAF21958916BC64958800F248F5FBFBF2B0A1B74019522292A1BCFA1A8E632852D7FE14FAFD6933736E96E9082FF0091E9E821C56235828820A20828820A20828820A20828820A20828820A20828820A208415A9F33F5A525E7D3EF0CE665D7ED152353E5FA8A457FC4F4F510B23F90EBE863D52638CC0CE3CF2EB4CA6921EB666E0ED0B45B1B440DD61D7368810B75042547F28273127E1CE99CC202483983E4CF0E2424858551A94ABD639E5B7FB2EE5AE2D8E5AE22522CDF4F8772A689CD0F20A722A81A28820CF58D6A87E244A67E1E6CA672A0459FA51F3D2F5238F43D858AF96948DE619134CEDFB23CA3827ED7B816F1B703B67865DECC5AAF1ADCE63B89B3738A58D925DB8BA67C1B969D256DA21848F1D4A32AE93135E40F1F7C3CC46D9993B76593BE4D4268D5CF4EB7E21E3ABEC6C76E9402A3955CD6FC38BFEAD6D7B69FB55619B63B05B0581EEE302C7717C6DF5E181EC2F0BB64BE2D976CF5A150BA65A3C48E20954C89C89E55C9367FC12C4271816BC3D029C9DDAE76A5B2E758BCA71DF403BC59867C087F3F2A868DA1D97DC15EEFAB0CD99DE76F4367DA699B2B0B3186E0AF5A94AC45B32CBE9BD61E04428A791191322BD25E0DF87B87D9E895F3248FA4016AF1CB8B7F548DC563F75249512E0D9B8919BF71C5818C9B8B7B296E5F1B2BBB1B178260EFAD08416F09B0B761A4290908E3402990E28895AB9A89922BA54EF046C89E9DE992251240A1482C4B5DE9E561C43D7266D35A6690925B30D46B57DD39C623C6FD88B622ECACE1BB47B4F8324CC270DBB6984A7A00026321EBD339AA5ED7F865B271214061E4D41B203D7855DFDE913184DA0490E4D6FD18F43AF78C4989FB136F1709BB7AE7767BEADB5C3EED9016C338FED03AD614A58121280CA41827256999EE2B926DBF82DB3F129294E1651A963B81F3BD2A38D7C8BDB3058F620EF03931CDC67D2D50DD22DE6F799ED7FECF771C1BC7C393BC6D9DB7242AE7056AFB15716D27995BC420A881993D0F399E5FB4BFE9EF0F396B50C2A2D40101ADA6EBBD0B70B459B0D8A964B8201615058D879DFB50B5636DB735ED6FBBEDEB5BB0C3C95EC863A6517382E301BB1B86169240058E22A495C710CB30418AE29E27F8313365CD98518764A49A25059874ABBBF37E0D60C2CF46EA4156FB13FC8826B9BBBBFE9E3692C71766F57C2CF8859569723FE050D4292B920883D79FA8E11E22D9188D8AA9837149092C0976001ABD9F5AF9801DF2A64B525C0045C01573DBCB2A6B5996F14B761E0CF18700221C410A6D5397BA474D3B9D473AE74BDB334CEF92545AD7FB3DDF952D686388489B294424A5C588EBD2AFA54D327BE30ABD6DEE11C611A415981F1CB9EBCF2CF5A9FD9FB317B4589058FD5514399E2E48B53F351C7E15552524EACEE6F61C2FA3B6822F9B47168E101E41E8127AF31F2CC48F2E73E30A7027E530200C8D2B5D3F37D1A2AF3E490B2C9525EAC47BE1EC345D56778E048F789D34267F5D3B4C65E54F30F34EF3B86A3DA94E957074D2D11B3A4B92E90C5AEEDA65ADB43CDE25D1882A47BC124E441CA23D7591AF79ED53D87C504DCF177FDBF0639758879F214092C487C85B43C3F1E724DDEAD4212B132273F2CC73F3CA338A94958C02E68D9E8C0E9E54600C464C96A3BCC09CB80A6B4E1971B44AAF106CDAA5A85174482A0070FA199F3CF5E8669ACEC63AC8717CECDD48BEBC4F3860708B528A98805D8313D5C0F2FB4465BDCDC34E95A9529998075F4E5F2A47FCCD19C35496EDECB768593875020949A7FE26BCE9FD4387EF90E38A570E662720740074FAFCA8FF2CD5CD7A7A5CF06E7587D26514A47D2435836AEEF4E3C3B34352FB2AD5B9F41F3F8655918C04583E7FA76F46CA1D252B702A3913E4DE7C2211F682EE56BE121063DD034CB9448F43D474A513337C02146B93FB7F487282ACC1E7CB81FB6799BC2CDAAC513E234E11CE123303CC83F5D73E95BFD2D577CD9ADF9FEF846CA3382BE921F8BD2DCEED71F8641E530EF1065B2949D0A840F5EBAF98AD7E48517B067EA74BF11C98B6AF6419C024AC826B6726E496F2ED945A18A5A49E3F11B4E44813CCF58CC72E9D6B070C9AD3CF37D1B23AF0AE920998B7018876EBC98D47166BF216AB64ADE79A8E14B31C4F1C9A3C59A615CCFEB505B424CCAA520B0D38B66D9E9956D13D879A99720155D87D39E76F77EF1686DAEDBE05B01805EED1ED2DC270FC3ECDB538953EB4B46E826470DB9564B512008EA40A9FF0006EC79F8AC7C92A42F777C646B517FDF0E2219E231E84950DF7DD150F6719F6AE9A8CF99780BBB4BED81BF2B0DAF7AD9DB6DD2EC7DC3BFFE3F8462485A138AF8882DDCBB88319B0F165F6FC5B4524E47849AFA4DF09FC3587978590A99280FA126A90F4029E85B2F28AA63F6928957D74AD03FEC6BA1CDEF1D14B6C26D10B7B05C3385AC3184B097DFBD01372F78094942429320A1A52785B06084848CF5AEDFB4D48C048DD943758300037B033F5CA2AD89C5AA6A8BABB1E7D746E05E913CFB8D396AD3AC92B687B80EA4F8709398E597EC2B5D91BD8A4852C0E04DCD79B53F0E2A223D73094A9E8189B9F6FD9FAC5F3BBEC31FC4715B6798294A50B1C5C5209CC1E5AE433D4E626BA36CAC391BA7938E0F677E40DABC6299B594EA5358D40AD181E1EC115B08E92EC8D83ACE1966B52870844473919139FDF99ABDE0E584A4166E038801AEC6D4D2DC2287895A4A94337A12ECCF97AD59B8C5F0A525488FEE20CF4D7CFE952454539D2AE333A74D7D888D0A2093AE4D4F7EF575ADC10D007A9D3CEB20B807580972E7385AB318828820A20828820A20828820A20828820A20828820A20828820A208415A9F33F5A525E7D3EF0CE665D7ED152353E5FA8A457FC4F4F510B23F90EBE862971D482519CFC3F63EB4C66FF00BA9A7DABEF585D201501AD7A0BC473F6A5E049E9CF33F7F4F432CE6074B9205C578C3A42802C680B5B87BBEB1AEBBD3D8543E9BEBF21C7137A905411986BC311247298D67F4AAB63702B9B38923E9341D8DE97E97A50B189AC0E33717BA19810D4E5A3BD4D7F348D16DA5D90C1F16B6BBD9FDA2C16C31CC31055EEDDDBA6E5C4024A8F0858E1064444E446424547AB64E15559A849A33103D68C7EDD0C74DD8D8B2A4A54E7A1E77007DAE6312ECE6E8F74183624F5CE1BBBAC35772957126F2E30B6086D59E6870094F0E83908D795339FB3B65C9FA932D00B6807F4E7C9B48BC4AC613280DE34B826C3977CB5B464271F7025586E1E52A62021BB56B3619198090819240CB4D48911A88F5AA44B27E5002E404B060D60DCB534AD5DC4663316A7FE4C2AC41B5E9CF216111CAC39FB64969F480E0FCC120C0E2322273D0E63581E555BC66D0C50584A0AC26AF520355BBD7CC4478529642AA756CEDF7CEBC6E5A21FB6F7A232CFD3E47D3A7C61B2319895FF0032B2FCEE6F4E27A7189492B54B00B9CEF7716EB51E9AC4270076E96CDD24861A23C328D64E66493D73F29E722B6F98A5B15A49702E0DA9CE822670B8FDCFF71F3670CC2D473EAF156321BBCB33875CD9E1D7387A870A85CA389CE1E73CBAE67D295DC94B4D51C983BBE5D470E71352B6CEE007798F0E81A97CAC5F9C68B6FBBD92361B6FD6BC4F64F13BFD92DAA92EB177B36F3763FD64C293F8F5A015F04800091913A646A8FE23F0DE13684B984CB495149674826D6B711C6F13185DBF91517CB30CD5D0F1B75AB4604C037DFBE5F664BE636237A9855F6D8ECB29618636970365FBE5DB320E4E62376EC368805324468ACA6BC7BF113E144CC67CF5489143BCCC9E6E5EB4AC59F05B5B7C004BBD5C105DEBDDF5E79D3A49B9FDE0EC4EF4B08B6BDC03686C3104B88E316F6F72DB974DA880A5B6E25130B42A52A1C8823B5793F6CFC2BC5E027AA6192432892774E5C481C75AB919C4F8C4054A71A33F6D3F7CB5CC76EFDBB37AA6D97DEF1983932FAB2544689D4E4397999CA9AE0D32B633226B0DDA1DE6D08FC30343965092F0C569214012450E8E28D90A0BBEB58B818DA3BB5DC00FA030B100B69052948190201D02B224EBDE69AE37152F1538AD0CC49B72F6FAD2948ACE236780ADD04AC027EA2C7D916AF570232560D8C21C424A97079927FD03D23CA3A53742B749AB3E7EFDBC4462B6791FC53958D5F4F36BF578B9D2EB6F283895E47BC67E59F6C892234D69EA66669533DEB7F38879B8577494D4065532E596773969126C148CC39E8159E9D20C680FFAA709C492C0A83F7EAEEF9F4B8B4464CC1A41FE1C5EC2FC73E34AE50AAEF434A28E398CCE7073EF041A426E21492594FF00D0A7BF468DD18305208043EA1FEDA367D228FE663A9FFF00D87ED487F94BD4F61F98DBFC2F7BBFA8ABF19C598224EA0AA08F9FC7215B7F9254010A19BBB7979F58CFF86902A97D4D07D87BBC1F8A13AE7A73FACE959FF2A9BA5EA6E0866F2039D5B9C63FC66760903437F207D4748709B849410A201391279687F5FF00753585585CBE2337F64E55D73C86BFE3A82AD4C9AA3ADCBE7C21A3972D0D60CF5F58D481F5E5D2A4A4A42981E6065D69AFAE90AA30EA51277496CDAE03707CDA20EF318650A5B08202D319E5CC48CB3CFF005D69F252281B8659F67F2A5290FA561CA40510CF4622D5CADA58D62D5BCBC6A49B8B94A1339852C800753F0EB9D394480B60A0CDFEE6615B548ABF67A43F461CD4B127219EBA7A03C1EB18C76DF791B21B1F85DE6338AE316D6CCE0CD974599B8421EC51C5025B6DA41203C50B0124488E2EF3574D89E085ED7095097BC090FF004B923B7DBCA19E2B1424A424BBFD5AB27CF2BD29EB1CFF0052F6E3DB476A8DFE32DDE6CC6EB706B8219B05872D177ED255C33E1AA597015B61407454F6AEFDE0EF849364AE54F121AC689FA4336A38393E6CF153C5E3021240512493BCA37CDB78FE7AC6F66CCECDECB6C16CF58601B1986B768D59365B2E25A4216B5180A52CA009E23267299AF54F86F672F644A952CA5B7404D29976E1DDC18AE4DC495AEAA2CF99ABB73FD680677731656D7366B75C3E0BCA12E1C84EA79E672D663F5AB6CFD9EBDA83751BCA243E6F9643C867935A044A2B2491AB7B66B0605EFC8C37B5B668B0DDA30A2B6D2A30A104925524C9EB9919FD26A5766ECB3834A65AD0410F96BA599EC2FE6D0C718D2DD35000A92EFF0070FC5B5A0631B29BA6D9C21E65C08C8A92743D729F203F6ABCECD96C94D2A72CC8143CFDD6B145DAAB7DE2E5FA7A5FCAFC6379F0867F0F87B0D10470A743DE0F3E5570C3A5887B1D2F62FC2F147C5CC725AEECF7D0FA5B2CB9C9D2B3087352DC72F3E5EE911BF32AC547B96F7AE435876CFE41E66B32CDEB4A379C2E92E906FC7AC2B4A46D0510414410510414410510414410510414410510414410510414410929064C6739D6E9504BBBD5BEF0D972D459859F5E1C22A4248249F2A4D41C11EEF0A24177666D61B2D8714E958238491A93947DE7F72D664A529D9FFAB37BFD2C181048B438E0CB5CFE5FBD22AC312962F93D3AE61BCE3255F56F0E8FDA2D3C76DEE31143F60865A29527878DD4CFE607F29194C76CA0674CE7210414EE90A66A8B355DFF00BABE4D0F30E374098A5115B3DF2B75B3DF48D29DE7EE81EC25F7313B2BDBC05C5296FB2870F8644CC25206801391CF3CEAA3B4B0F88FAF71442AC0825DAE486D1DB3B6B7BEEC9DA0896849B80CE3CA9FAE51AF97187B56F76B45BBD7EC37925C4BEAE149207BD09034267A73354DC4E0F686FD56A524E44927370030E2ED7ED17295B5D0B48029C2DBDA1E35E0DC6AF093682CBC1AC398694167FAAFF0FF0057A92950E799D40A4D3266A48DFD5944F503476E35BC626CF135254D52CEF6B86D5FBD7842F7987AC2D50A5A814A4F13C6564902412390CE04E4075A96C3E0B0CB4BAD0144DAC7B07FBE79D214958A44A001EF7B5455F9BE82916EDCD9A9274D394FFACB9E91D795666E1306827FD31FFD23ECF9D3DD1C231C951228C0F56767F23DDD806868E58DB78056DA26E553C5C63DC1D2329D2751F2A8D9D2A42086450568056CC2EFDFC9E1EA26850749619B96ECC6BCFCAB4B3EFF000643CA2A76E6E1067F2B4A1C1E5A1F8CEA08A62B54AC9200B3066B655A7439584384A966DDEAFE54F2D22199C2D9B275D5B4DA145407BEB48F117023DF235E824F59E95193247CD984DD2694B75F36CB430FB0F2E71008530D41208FB65E94D6CFDB0D93C236B70CB8C2717C2AC1FB6B84942C964294A4AA66788473F3C8F794311B0B098992A1364824E7BA33E80B3EA79E462D380C61925017500D49B65573FA191168D19DB3F664DBFDD29736E7D9B719698C5D6A5DCDF6CCE22FB89C2D0106786D2CED42540B89E22A0755281CF2AE29E32F86F83C7CB9BB92424A829B71201CFB777148B8E1F6E484240500695736CC5DBB6515EEC3DB771CB1C5D8D94DFCEC662FB2DB40DAC30EED13160BB2C0F891092EAAEAE55C45110AE2CCF9675E33F1B7C0ADB7899D357835AD287247F3720540A03A6B1292FC418520B8B86000147A1CECCFA3BDF4E87ECB6F036476B9B6DFD9CDA2B1DA16D684B89BBC3EE9174DBB29E2284AD33C4A6F342C7250E935C3319E12DABB0712AC0E2513173525B7D94451FD68DCDB81504F933C6FA0009360CDC0F2AF5CF9647C331B5292A952AD4A084FFF0022513248919E607603CF952A36362C23795296903FE40D7859FA13F686CB4058CB872396777E2F1778C6EF2D582B0A53EDA38214DF110BE331EEE70424913032F95436254BC2A94952542D71A6648E1D6D9444CDC1A4A8FD22AE48D3BB68F9B70222455B4D756C9694B0E2D4E09094495088D472F21D472AD64CD334B82C4317D35AB9B4305ECF0A2E052EF60EE7DDFBC4BDBED236FB4DADD65EF19C305B09F78198CC6713FE69962B1E64CD2820AAA6B46F7A9D78C339929129450A42891983FB1A8A5EF12C9BE44A78DB75949FEE713C20749E629346D12A3541166B55FA1B76E302512D401092736724F6730E1FBE6ED9A0E825E4A808F07DE27CCCFF00A83953C9334AD8258BDA9DEC5DE3099466160821B23CEC18D73FCC26CE32DBA9E2216D000E4E0E1518EC7F61F0A9093835CC75070EE4795EB5E59F3853FC298EC03926A2EC28ED5157340417F2886BBDA74A2E0B6DA1F7018014D00A403CE6397FB3AD49499A70E7E5EE289CC81D3BF377A55E1F4AD90552C15EE8A5CDFABE61F9579C20F63C86C02E3E1B075E3504F0889CE63A7CBD44D6096B9AB4B2147A6668E7FAA1CA30766194EE46EB3029A3D5BCEB9FDE31DED7EF0B67F6612710C4710694CB82438DBA928102082547AC0D27D6AF9B23C3789C79425093BCA6BF16CAFC0FE03422BDC94EF5E7FD30CEBEC6986F43DA1DAC5AF11846C65CBD7F7B70781A4D9AFC585188E2E054E848FBCBA76CCF851B4F18942805004A49B8A38B822A1E1B2B69C9942A0588BB3B38BE64F4BDF45F6437138D6F1D386637BDABEBC6ED2CD65FB0C2AD5C5254F052B8E31261E1EF24C24B607F6933CABD3DE01F86E76761651C4A0129097701E9AB8AD341776CC45076C6DB96310A4805AAC435DAEF903C637170BC1B07C22D6DACF0CB0670CB5B3425B6AD6C5B4B2C3C94A42429E424C29440E23A1E23AC57A2B65E070182C3A50A949DE48000DD1F8C9F26EB157C4635539F7598DFBF3E4FAC5C4EB4979A42AC98436B392894F0A0C18CA3393CCE93DA92C64844D98552C6E8B06B3741DBEC6B08494294A05F788B3126EEC39D756BC0F5BA516E52B0B0A508514446B999CFB919139CE862AC7B0F1387C26EFCF402F4767A5466D6FC67589CC3A928B9761504D6DC789CB8D5CD54D9FB12ABB6DA652B5238F20449CC826791F9F7CAAD8AC08DA2A4CF900250A62C030B72F75393C5736B632589AABD99BA72A37168DE9DD6E0AB432C2D480880932444E5241FDF3ED52985D9AB92A00D599F5176D03DCF1245EF147DA0B4A8296429839005CBD3D7CB2358D9069B21090001023A72FF00433A99972F728A72DA9AFA51F93DF58A5E2120BA83821C56BAF2A7B1A429C0AEC3EFB4D0B46F5B30C7DD623D72F7AD9DEBC5E1CB7926398D7F4F80115B253B800E17D7DFEF38712C86DD1FED1EFC88852B68520A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828821A3EE34D92A2015467D48F989F81A6B324EF0248008CF5EDA5EB61942885FF00B4AA8198136BF6EBD22D6C5B0BB5C6D05B7DA42873E248394F2907A673FA9062713852A72433D2999B657F76A9895C262BE4021C90C0DECF90CDB80F28D76DE1EE5517CCDC5CE16D842CA491C020C81D00EBD0EB2222A0F13B394E0B2800EF43404D9F2B795227F09B5104805401C876A5EDCDB5AC6B35AECF5EECFDF2ED2F6DD6485405291F3CC8F3923E7509336792A50DD37BB54BE4697E7A44E236900032AFFED2E74ADAB9D9B5176892BFC33C5714B4A40040CA34C88F4F88CF5CE95460FE5A40666A3B1EA3856E087B16A557FF00304C6DD37CC963636AD9F969AC5AB79849930939EB9798CBAC4D369D215BA4B07197AB73EC61DC89C01363625EF4A9A9A38D74B59C413F61C1C49888EB9779EDDB3EF50F89C392E4675E56B7323C985E26E4CF70327B686EFF00AE15E56D5E589E239489CB43CF97AF3FD62A24C9625C647A6B968CCF7E31252A7848157D2A19C5387463E8D10AEE1DC4147864C667E323423EF2D49A66A5EE2C0341A350DA8783FDEB133879E0241DE07870B3533FC86CA21DFC3553A13E59FC2048CFFCE993B4AF7D208343D9F90F7A43D4625259E95701E8E3813A674842D2D9D6DF5B686020019BCB494A5723FEDA98CBAC75E9178DC399885101DC663EC6E3FA6178749C502A636C8022A5AAFEA22C5DB5DD5EC06D9A56CED7ECD5AE22873253CDD9B6EB99F3E258D4E93D7AE7547C76C654D52814BBB801A95A58FBEB50EC62B46073770C39E7C9B5D2358769BD8D5FC18DEED1EE5B6E719D92D176381BF889B2C2D970020A516D6E9C92E2C4AA224CE872AE7F8DF84382DAF89562A74894B98A2FF5A6A5854971D6834ADA2C982C7A53280DE6200706C5ED9F5357E04C60C637ABEDA5B98C69CC3F783B1B866D6EC55BF1A9CC6707B0BEBEBF36EDA54BF13C77086F88849CC889CF28AAEEDDF83982C3E194538745029BE9E1614AD39D2B7A449C9C626630B3B333E75FC3FDE919A775DFC477737B73776DB34E626E6038A61EA71AC52C318798B7B9B67944801D6B8A5292B04A246600033AF2A78F3E1A623040E213865224CC2AF953770842F74B16362D6247F6FE5044C53392736233B5FF0059E85B6C70DDFE6EE31265E36BB6DB3EAB87024DAA1EC41A0662600067211315C50F8731B266EE2028024D81D73A73CFCEB1228C0254086C9ACE03F215EF9D844B61BBD1C2AF8AD4D63D87B970DE65DB7B90A61433238153C80131A6A3A53F95E1433803350EB3A8E3FDD2EE6174F86D33C0594824D4E9E60FBB6717261BBCC43C1DF1F1266EDB6B3E169E0BC87627B453A1E0EA809964D724BB771EEB01F0DA10092814B960FED8449FFEE8E10E5AB6E1BB2C34A2A002969470C18248073CFBE94FA4783E72082892A615FE2FDAD715E26819A103B225A0BEE80012C5AEC73B8D323CA23717DEAECDD8E1EBB84E2C2E16904F84D3E9528F6893AE63B7ACD494BF0D62890912D49721C37767EF9706784FFC244B56FB208A31A6F646BE74AF58C4B79ED47B2B84D8285CA5EF1D5E22521213E285490264F32411D6262BA56C6F86EBC6E1D334C92544554525CB90F56EA78E60444E2F172A42C85123402A939D6AD4CF2B5B2C2D896FF76C31E7DC6B64306C43145BE48652F30B7904AA40808327CBE9575D9BF0B5689809901A87F8E8796A2B1098BDA89DD2029935B1F79BD9DF5156A309DC7EF7F7C0EA5FDE25F39B2981CF1A2DEDDC7ACDC08992149765209232EB273CCD764F0D7C3F32572CFC948008B2780D00C868DEB157C5ED10EE54C0BBD682E00CAF616A9E91B47BBADC2EEFF621808C3B0CFE6F7AC0138BDD32D3EB0B4C92B0FA6089339E672CC577ED87E14F952D2E9600682ACD4B5816FB457311B40289216F53C5891EDB96869995A64786385C0B0320419000C824764881A888F4AB72657F88D2AC2D4A12C3A31A55FF005159C54BF9EB52C3D3B8D6A59EDCA14F00F5F4E7F18229CA092A152473A5453843032FE5922BD7F1D7F1136D5E356B668429292A1324F39396BAEA0F202A4E4E154B1715A37AB5383119D3284FFCA1243B81773A5FCECFFDB1685CC4D7C2DB5C5240809D2644EBA9E43A72815252B66294A02C4B1A5AF5E43A8A645E3076ACBFF9E55AF36CAC3A3F08D8CDDB6EE55768B5BC799E10A2492A4F43DFF4CEBA1EC89224E1820DC5B4BD5C9D39E715CC6E3133662D64B019937BB8A3DCF1E91B8582E0B6D84DA2128400A4A7A69FAE675F96553491BA092CEDD3DDACFC0D62A98BC52A7ACA45100B30CF9F0F662E2617C6DF144493F414992E49D622E7A774A83BD8F7685AB10C141945BDD21540CBCCFDFEB446C8CFA7BF48AE88520A20828820A20828820A20828820A208FFD9, '1', '2021-10-06 01:13:39', '1', '2021-10-06 01:13:39', b'0', 0); -INSERT INTO `inf_file` VALUES ('427.jpg', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFDB00430006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D302D283025282928FFDB0043010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC0001108017F038403012200021101031101FFC4001C0001000203010101000000000000000000000607010405020308FFC40051100001030301040507060A08030803000000010203040511060712213113415161811422357191A1B115233242C1D1161752545572749394B2242536537392E1F0264362083334374482A2F163C2E2FFC4001C0101000203010101000000000000000000000102030405060807FFC4003811010002010204030507030402030000000001020304110512213113415114223371B13235617281A1D11552C1233454910642B2E1F1FFDA000C03010002110311003F00E5000D57E96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001832600905ABD1F0F8FC4DA356D5E8F87C7E26D1EA307C3AFCA1F35F1DFBCB51F9EDF564006572800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000115001E49F5480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060C9802416AF47C3E3F136CD4B57A3E1F1F89B67A8C1F0EBF287CD7C77EF2D47E7B7D400195CA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454007927D5200000000000000000000000000000000000000000002407DA9692A6B24E8E8E9E6A893F26262B97DC84928B67BA9EB1A8E6DBD206F6D44AD67BB8A931599ECC3933E2C5F6ED11FAA2A09D26CC6E8C44F2AB9DAA05EC74AABF6184D9B55AFF00DDDF2CEE5EC4949E4960FEA1A6FEFF00AA0C09AD46CCF51C6D5740CA4AA6A7F753267DF823B73B05DED795B85B6AE06A7D758F2DF6A6508989865A6AB0E49DA968997301E517D5ED3D10CE000000000000000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF500065728000000000000000000000000000004BF41E9EB75E9B54DAD95ED9E3C2358D5C70EDC7ACE4EA7B14F62AF5865F3A27718DFF948638CB59B7279B6EDA2CB5C11A8DBDD96BE9FA165CEF549472395AD95F8554E7C957EC3ABAE6C94F63B945152B9EB1C91EF6EBBA9727334ED4BE86F14D58CA7927481DBCE6B13B950EAEBAB9BEEF7064E9473D3C71337732B719E3EE2B336F1636EDB3631D717B15B78F7F7E9F24681B16CA29EE3591D352B15F2BF97777AF7131D47A4286CFA7BCA24A87F96B5513B9EAABC5A89D98CF12D7CD5ADA2B3DDAF8347973D2D92B1EED7BCA060032350000000000000000000000000000000000000000000000000000000000000000115001E49F54800000000000000000000000000000000000063217FDFAC9D58F4A525B6DECBD6B391D4D46BC61A245F9C9D7AB29CD3D5ED2621873E7AE18DEDDFCA3CE51FD37A6AEBA8A454B6D32AC2D5F3A793CD8DBEB5EDEE4C9275B7E8FD2EDC5D677DFEE2C5E34F0E12362F7AF2F6AAAF71C8D49AD6B6EF079150B3E4DB4B3CD65343C329FF0052A7C1381172DBC4766BC62CFA8EB967963D23BFEB3FC2695BB47B9A46B4F63A5A3B452FD56C51239D8F5AF0F71DFB1E89D41A9EDD4F71BBEA3A88E2A96F48D8BCE55C2F2CF144F7155390FD41A178E8EB3FECB1FF002A16ACEEE7F1498D0E2ACE0888999EFDE50A8B63B6A545E9AE55B23D79AA6EA7D87D1763B65C79B5B5C8BDBBCDFB8B0EE956DB7DB6AEADCD57A4113A556A2E15D84CE08F684D6516AC6563A2A39297C995A8BBEE45DEDE4CF0C16DA1C5AEB75D6A4E48B748EFD9127EC966A3C3AD3A82AA07A72DE454C7F95508954EADD53A5EED516DA9B836ADD4EFDD7B676A488E4E6985E0B83F43751F9B369E99D7977FF11BFC8D22D1111BBA3C2F516D6649C79E22D1B7A43AC97FD29A85772FD69F936A9FC3CAE8F967BD138E3D68A685E341D5C34C95F60A98EF16D5E28F8573237D6DEBF0E3DC43B0746C97AB8D8EA92A2D754F81FD6DE6C77EB379298F789EEED7B2E4C5D705BF49EB1FCC39EA8A8E5454C2A73EE058A8FB1ED09158F6C369D4CD4E0A9FF7752BF7FBFD641EED6CABB457CB457185D0D446B8545E28A9D4A8BD68A44C32E1D4C649E4B46D78F2FE3D5A40021B00000000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF5000657280000000000000000000000003260EB586C35B7C9256D0B1AEE89115EAE76319CE3E0A45AD158DE593162BE5B72638DE5A343593D05547534B22B2662E5153E0BDC4F6D90566BAA886A6E6D6C5434996E234FF00BC770CF1F611ABC693B9DA6916A6AE362C48B85563B7950B0AE73A69ED0ACF2576EC9D135AC7638EF3B9AFC54D3CD7ACED34EB32EF70DD364C7CF5D4EF14AC6F35F5F462B750D8B4DA3A929A26BA46705644DE4BDEBDA6AD1EBAB3DCB14F5F4EB0A3D513E7111CDF12A9739CF7AB9EE5739572AABD664B7B1D7BCCF562B71FCFCDEE5622BE9B2D1BC58D6C73A5F34EB58A8C4557C38CB55ABD68402FF7CADBE552CD56F446A7D18DBF45A84F765D717D5DB6B282A155ED871BAABD4D5EAF72911FC19ACB85EEE14B6E63563A7915155CEC22679214C3314BCC64F2F367D752D9B0D2DA5E95BF7AC7AA38090DDF48DD6D544FAAA98D8B133E92B5E8B823C6E56F178DEB2E0E6C19304F2E5AED2006CD0D1D457D4360A385F34AEFAAD4F8F61699888DE58AB59B4C56B1BCB58FB535354554891D2C124CFF00C96372A593A7F67F0C2C6CB7A547BF19E898B86A7AD799D0AED5561B1B560A18D923DBC1594ED4C7B791AB6D56F3B638DDDBC5C1B92B1935778A47A79A1743A0EF550D47491C74ED5FEF1DC7D8874D9B36AD5CEFD7409EA62A9F1B9ED0EE3322B68A28E99BD4ABE73BDE71E5D5F7C91DBCB5CF4EE6A22215DB5168DFA42D36E138E79622D6FC5DE9366D588DCC75D0B97B158A872EBF42DE695AAE8E2654353FBB771F628B7EACD473CCC8296774F33B9377117259F6375CDB48F7DF1606BF1BC891FD54EBCA98F265CD87ED4C4B7749A3D06BFA62A5ABF8F928CA8A79E9A45654C3244F4E0A8F6E307C4BF116D77E8248D3A1AB8D8AAD72A71445EE5217A8B67B86BA6B2BF971E8645F82FDE64C7ACACCED78D9A9ABE01931D7C4C16E7AFEEADC1F4A8864A699F0CF1BA3958B8735C98543E66E38131313B4C00008000000000000000000000000000000000000454007927D5200000000000000000000000000000000180A4CB67F65A693CA7505ED11B68B779F85E3D2C89C51B8EB44E1C3B704C43167CD18693796FE9FB551695B3C7A9351C6AEAA7F9D6FA17261CE7753D53DFDDCF99C1D58DBE5C60A6BFDEDAE6C558E5640DEA6A226530DFAA8BED534B545F6AB51DD64AEABCB73E6C5167846CEA4FBFBCB6E66FE1BEC9DAE6377EBA18B7B7539F4B1F344F5A27BD0BC46FD1CBCB6BE9AD4CF9BACDA7699FED8F48FF2816CEB453756256495334B052C0A8C6BA2C2ABDCA99C71ECE1ED4265F8A0B5F5DE6A53FC86E56AA685D96A45F42E13B373873E95FCFF00CA9F028E491E9F5DFF00E6513111DD5C56D4EB6F7C98F272D62768E9BAE45D90DA7F4CD4FB23FB8B26C940CB659E8E8A29165653C4D89AF5E6E444C654FCA4B23FF2DFFE653F4FE85E3A3ACFFB2C7FCA85A9313D9CEE3183363C75F1727346FE9B205B50B3EA9AABBD4D65BA6959676D326FB12A3753088AAEF333D857DA3ED7A8EE6CAAFC189A46246AD499193F45955CE3DC7E93AFA58EB68A6A69F3D14CC58DD85C2E1530A7274B695B66996D425AA391893AB55FBEF57724C2732663AEEC5838B785A79C5CB1BF4DBA7D5D6B7325650D3B6A155666C6D47AAAE72B8E3EF3F3A6D3BFB7977FF11BFC8D3F49A1526AFD9A5D2F7A8EB6E1056D23239DC8E46C8D76530D44FB08B44CC6D0AF08D463C19ED7C93B46CA7CCB237CD345144D574923918D6A75AAAE110B1FF14179FD2141FE471E742E8DABA3DA2A535CE2456DB99E51D2373BAFCF0663C73FE531C527CDE92DC4F4FC96B52DBCC46EDCDA3E9AB4D9B4F58E28B14F7557B299B331708EE19739DEA5E39E79535A92AA3D4913B4B6B0CD35EA9FCDA5AC7A61CAEEA455EBCF0EE72779CFDB25DFE52D58EA58DD98685891FF00EF5E2EFB13C0DB9DD6CD59A1E965A8AEA6A4D4540DE8D1F2C88D59913922AAF6A630BD4B9267BB9F4ADE34F8EF977DE67BF9C6FDBF4F5416F16DAAB3DCA6A1AF8963A88970A9D4E4EA722F5A29A858D0B9BB42D32F8E4DD4D4F6B8F79ABD7511FDBCBDBEB2B84CA2AA2A6153A94ACC6CEB69B3CE589ADFA5A3BFF3F2964004364000000000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE5000000000000000000000000074ECB7CAEB2BA575BE548FA54447A2B51738CE39FAD4E6022622D1B4AF8F25F15A2F49DA5DCBAEAABADD697C9EB2663A1CA2AB5AC46E71CB9162DCA1FC21D0ACF244CC9D1B5CC6AF5AB7A8AA2DB433DC6AE3A6A462BE47AF57244ED52796D9EB3424D0D3DD5EC9E86A9729D1E556254E784F1434F3D2B1B453BC793BFC375192DCF6D56F34B46D33E8AEA46BA391CC91AAD7B570A8BCD0CA16FD65874FEA755ACA791A93393CE7C2EC2AFEB27DE7CE9744596DCADA8AB95D2A3173991E88DF12DED95F38EAC73FF008FE69B6F4B44D7D776AECBEDEFA4B5D4D7D43771B51F45179EE275FB7243DDA9AB28AF171A9B5CC8C65448AAA8AD4545C725C2F592FBDDF16F953F2069D5661ED54926CE1AD6A7344F7103D4164ACB1D524558C4563932D95BF45C570C45AD3393BCF933710BDB0E1A534BBF2D3BDA3D5F7BB6ABBB5D29169AAE76AC2E5CAA3588DCF71C3077748E9E96FD5E8C4CB69A35459644E58EC4EF3667930D77DB6871A3C7D6E58AEF36B4BC69BD395B7E9D1B4EDDCA6477CE4AF4E089DDDE5979B3689B5F9A89D22A72E7248BDFFEF81F2D437DA1D236E6D150318B528DF323EA6A7E5394A9AE15B3DC2ADF535723A495FCD57ABB93B8D488B6A3ADBA55DABE4C1C223931C45B2CF79F2876F51EADAFBC4AE62B960A6FEE5BD7EB5EB23CBC7060F46ED295A46D58707367C99EDCF927790D9B650D45CABA2A4A466FCB22E13B113B57B8F8451BE591B1C4D57C8E5C35A9CD57B0EBC4B73D29748A5960E8A656E51AFE2D722F34E1CC5E676DABDCC18E26D17BC4F246DBCC2C6B65B6D7A2AD4EABAC91AEA854C3A554E2E5FC96A7615FEA7D575B7A7AB379D051E5710B579FAD7ACD0BDDE6B2F556B3D6BD17098631A98462771CEC1AF8B4FB4F3E4EB2E8EB78A73C781A68E5C71FBFCD3AD93D6B9974A9A4CF9B2B37D3D69FFD9B57ED435DA6B55D4B51566A295525E89FD59E7BABD5C5148D6839961D5743BBF59CAD5F61DDDADC28DBAD2CC9CDF12B7D8BFEA63B52BE3ED31D261BB87519238673E39DAD4B24371B75AF5B5A1B5346E6B6A9A9E6BFEB357F25C9D855573A29EDB5B252D5B1592B170A8BD7DE9DC6D69DBD5458EE2CA9A755E8D78491F53D0B23525B29B56E9F657DBF756A9ADDE8D7AD7B5ABFEF9889B69EDB4CFBB2AE4AE3E2D86725236CB5EF1EAA8C1E958A8AA8BC15382A28C1BCF3BD9E40010000000000000000000000000000000008A800F24FAA400000000000000000000000000000004B62D9452DC6E14D474C999A77A46DF5AFFA71F0261B47B8436F8A874ADA9F8A3B73516754FF00992AA75FAB2ABEB5EE3DECBE28A821BC6A6AA6A2C76E85590F1E72393FFA4F138D43A5EF17EB5576A06A31D1A39EF915CEC3E454E2EC263AB897ED0E6E4C94B6A37C93B569FF00CA7F8847510B4F6157748EBEBACF22F99335278D157EB27077B787B0AB10DFD3F7296CD7AA4B8C0ABBF03F2ADFCA6AA61508A4ED2D8D6E9E35182D8FCFC933DB55F56BF51C76E89D9A7A06E17BE45E7EC4C215E9F4AB9E4AAA996A2672BA595EAF7B97AD5572A7CC5A7795B498234F86B8E3C83F49ECDAE34F5DA3ADBD048C57430B6291B9E2D72261514FCD87B8A5923CAC52491AAF5B1EAD5F7135B72B0710D0C6B6914DF6D9FAEB982B9D8EDCE066908A3ADAE8D6A5F50FC3669B2F5555E09C5724EEB2BE9691A8957510C0AECEEA48F46E7D5932EFD37789CD82D8B2CE2EFB361EF6B1AAE739A889D6AA7E7AD65AD6EB26A7B8FC9179AA650B64DC8D237E1BC111171E3922F74A999F70AE62554EE8D677E13A45DD54DE5E499C60D2C7798E6EF55A0E114C13CF79E6DE3D121A6D69A8E1A98A65BC55C9D1BD1DB8F765AE44EA54EC52F4A2D534357A424D4316EF46C815CF6AF36B9138B17C781F9A910DDA5B955D35A6B2DB14CA94954E6BA4677A2E787BB3EA222FEACFACE178B5115E4888989FFB8F36B54CEFA9ABA8A99955D2CEF591EABD6AAB93E58E27A05267774E2368D9BD60BB4F63BBD357D2AFCE44EE29F94D5E6D5F5A122DA65B608AB69AF96C6FF56DD5892B31C9B2638A77679FB4873932A84FB492FE10686BC58645DFABA2FE99479E689CD513BB394FFDC5A3B6CD2D57FA57AE78F94FCA7F894010C9843255BA000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF50006572800000000000000000000000000012DD0BA8686C3154F95C323E57AF9AE6222F0EC393A8EF93DF2E0EA89BCD8DBC2367E4A1C808638C558B73F9B6EFADCB7C31A799F761D4D394EFADBC52D2367921499DBAAE62F1443A7AF6D8EB3DC618A3AA9E68E466F7CEBB795173DA722C35CDB65E292B1EC57B617EF2B514E96B7BDC37EB94735344E6471B37115E985771E65662FE2C6DDB667C57C5EC56DE7DFDFA7C9C6A1AC9A82B22AAA57AB268D72D54F82932D47AC28EF1A696966A6779639132AA89BAD776A2906C054C96BE1ADED169EED7C1ADCB8296C749F76DDE188911CF4472EEA2AF15E782F4B23AD36AB5C105354D3B62DDCEF2C89972F69456015CF83C6888DF66D70DE25EC369B4577995BB5DA734DDCAA5F34956C59DEEDE7392A132B939170D9BE51CEB65723BB1923787B50AE5155392AA1D8B56A0B9DADED5A5AB9309CD8F5DE6AF82987C0C94EB4B36E78968B3DBFD7C3B6FE712F85DACB70B4CAACAEA67313A9E9C5AE4ED45439E5B162D61417C44A2BB431C72BF8223B8B245ECE3D671AF7A01EDBA40B6CF3A8A593CF6AF3893ED42F4D4ED3CB9636953370BADE9E2E8ADCF5F4F387D7669624CADDEADA88D66521DEE5DEE23FAF2F6DBCDDFE670B4F4F9631C9F5B9657D44D35EDCE2B269F8ADB46A8934CCE8DA89CDAC4E0ABF615314C11E25A72CFE8C9C4AF1A5C55D0E3F2EB6F9867ACC036DC077345AFF00C556CFF17EC251B5D5FE9741FAAEF891FD9DD3F4FAAE957FBBCBFDDFEA7536B336F5F29E2CF06439C7AD57EE352DFEE23E4EEE19E5E159267CEC84AA130D9C5FD2DB5CFA3AB911B493AF9AAE5E0C77FA90E43286CE5A464AF2CB95A5D45F4B9632D3C922D7B1D1B350CD2504AD91B2A23DFB9C511CBCF0BEFF00123A8B93BD45A5ABAB2C6FB9C4B1A46D457231578AA2673F038284629AEDCB13BECB6B2324E49CB7AF2F37587900191A8000000000000000000000000000000008A800F24FAA4000000000000000000000000000000C2B55EDC378AAAA22027A427B7DCDA365965A16A2B65B9CCEA9953FE945CE17FF00892DD9DAA7E28EE1C3AAA7E0A4476BAE4A7BA5A2DCCFA14544C6227AF87C1097ECEB09B23B8F0EAA9F829963ED6CF39A98DF495BCF7B5B7FFB95231AFCD33F550FA1DAD11A6AAF54D7B29699ED8A38D8D7CD33933B8DEEEF52D766C7ECDBA9BF595CAFC717239A99F7158A4CBABA9E25834B6E4BCF551E0BAABF63D6C5A7779157D5C7509F4164DD7373DE98429EBADBEA2D572A8A1AD66E5440EDD722725EC54EE5422D598EEBE975F8757BC629EB0D606327D994D52E6E5296A1517AD2272FD846CDB9B447796E69A6A2EA6B46533FD2E2FE742C4FFB40222D4D9F2D4779B273F02B7A1656D1D7535545493ABE091B2B5AE85D8556AE533C0ECEAED4577D54FA67D75BD635A747237A389FC5171CF29DC5B7E9B39B9B14DF578F2C6DCB113BA30864FA792D5FE6951FBA77DC3C96AFF34A8FDD3BEE29B3A5CF4F57C81F6F24ABFCD67FDD3BEE1E4957F9ACFF00BA77DC3639ABEAF883E8FA7A88DB9929E66A76B98E4F8A1F14767B3DA0DE27B4BD926D9AD7FC9DACEDEF72FCD4EE5A77A7739387BD108C9EE095D4F5104CC5547472B5E8A9DCB9FB0989DA58F3523263B527CE1D1D5543F25EA6B9D12261B14EE567EAB97793DCA72C9AED7E344D61D3B795452C7267B578A7D884285A369534979C982969EFB3000219C00000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE500000000000000000000000000000000000080005920000000AA1E8B1F456B58A2A54A3BD4D8731311CEE4CEF2762F7F795C031E5C55CB1B4B7345AECBA3BF3E39FD16F576AAD332488B53D1CEEE48E743BDEF53A13592C35F44CA9968E08E191A8E47AFCDF05F615269AB6FCAB7BA5A6C658AE473FB9A9CC9DED52E694F6FA7B6C0A89D2F9CE44FC94E4685F0456F14A4CEF2F4FA6E2339B4F9353A9A56623B74EF2F9DDB6750CAC74B68AB54EB48E5F39BEA472724F6901BA5AEB2D550B0D740E8DC9C979A2A76A293ED93C756E8EA279679168DA9B8C8D578679AAA7FBEB3BCDB8D9F533EAEDB2235EF89CADC3B9AE3EB34B57364C569ACF58861C9C3B4DADC35CB8E3C3B5BB47AA25B26A5E92E557549F4638D1A8BEBE3F61C3D7D56955AA2AD5AECB23546278271F7E4B3F4FD95BA6ED754C8DCB3B95CE7B7098554C7042A2AEB65C96592A2A68EA5AB2395EB98D79AAE54BE1BD6F966FBF46BF10D364D36871E9F6EBBEF2E6032A8E6B951ED56AA75298375E776D96BECB2A52A34FD452393290BD5BE0BC7EF2B4BA53AD25CEAE05FA92B913DA4CB6472B9B71AD853E8BA34763BD14E3ED0E9FC97534FFF00E54E93DAABF71A98BDDCF68F577B591E370DC593FB7A23200371E7C0000000000000000000000000000000115001E49F54800000000000000000000000000007DA878D7D237A9D33117FCC87C4FA533FA3A9824C7D0918EF63917EC08B7D994BF6C0F576BCAA6AF26431227B1549B6CE7FF292E3EAA9F8290BDB1468DD7123D39494D13BDCA9F6135D9C7FE525C7D553F0532D7EDCBCFEABFD8E2F9D51ED84DDA9686E1574352F464956C63A2739708AAD45F37D6A8B9F02F4CA769F91ADF4F3D64D4F4F4713E5A8911118C67355EE2C28748ED05226EED554B13A9AB5DC93DA296DA36D95E29A0C59337893922B33E52BD6491B1B1CF7B911AD4CAAAAF043F3F5EA2875B6D4960A273BC9267231D2C69CD8C6F9CE4FF7D67DAE5A3B5DCB472255BEA2AA1C79D0A566F6F78678FA8DAD8D5CE86DB7BA8B6D6D2AC771A95DC64F2734DDFF0094A8A9C3EDF61333CD310C5A6D357498B266C578BDB6DBA797E2B4AC1A46CD628D128A8A3E93AE591379EABFACA4811AD44C235113D4641936D9E7F265BE49DEF3BCB184EC4184EC432031B184EC4184EC43200C613B10613B10C803CAB1AEE0AD6AA77A114D4FA0ACB7E85CAFA665354F36CF0351AE45EF4E4BE24B4113113DD97166C98A79A93B4BF2DEAAD3D5BA66E7E495ED4563F8C5337E8C89F62F71C593E8397B1327E93DA5D823BF697A98D199A981AB3C0E4E68E6F578A653C4FCD8EE2D7276A60C36AED2F69C375BED78666DF6A3BA7BB57F3A4D3CFEB75B98AA40C9E6D7711DC6CD4D9E30DBD88BEDFF00420645FBB370EFF6D5FD7EA000AB7400000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE50000000000000000000000000000000000000002C00000000001F482274F3C7146997BDC8D44F5952B1369DA1636CA6D8E8E19EE52A265C9D1C6AA9D5D6A43B565C9D78BFCF33155EDDEE8E344EB44E09ED2C7D412B34D68A4A68977667B12262A73DE5E6BE0995207A06D6B71D4502B93E669FE75FE1CBDE68E3B44CDB34FE8F4DACC3315C3C3A9DE7ACFEA9DCCE4D27A11ADCA24E91E329D6F77595452D4CB4B591D540F564EC72391C9DA4DB6AF74496B21B6C6ECA429BEF44FCA5E5EECFB481A1934B49E49B5BCDA9C673FF00AF18B1CED18FA47CD65D2ED2A9FC9A34A8A2996A31E76EAA6157B8F69B4AA4FAF6F9BC1C8A56461C9927D9317A2238EEB3688E6FDA16FC17ED357F448AA5226C8BC9B3B3757C17B4E45FF67CC7C6E9AC92F7A42F5CB7C14AD53872243A7356D7D96446A3967A5EB85EBC113BBB0C7E05F1F5C53FA33D78A60D57B9ACA47E68EEEBECE20A8A1D552D354C4F8A5485779AE4C2F343E7B564FF008962E3CE99BFCCE2C5B3D4DB6F71C572A6463E66A6EE7939B9E6D52BADAB393F096344C2E29DBFCCE2986FCF9F798EBB3775DA5AE9B86F2D6DCD133BC4A16003A0F22000000000000000000000000000000008A800F24FAA4000000000000000000000000000030A64013CDA7E6B6834CDD5BC52A6912355FF00AD31F79AD69A9D676CB33ED9436FAB4A37EF6F316937B3BDCF8F89B14C897ED924D0A7FE2ACB51D22679F46BC797A957D86FD06D6AB696869E07DAE199F1C68C5916654572A26338C193A6FBCCB8B1E2462F0A948B72CCC6D3FF0071FB23D60A7D57A7EADD536DB3D5367737737E4A5DF544EEEC242BAAB68B95FE8753FC127DC7DD36C75A8A9FD4F022F674EBF719FC7257AF1F91E0FDF2FDC4ED5F553263D565B735F05667E6D776AADA2F0FE8753CFF00324FB88EDC29354D75E52EB35A2AD2B9AF6BFA48E9B772E6E30B84EBE084A976C75EAA9FD4D073FEF97EE0BB63AFE3FD4F073FEFD7EE1EEFA94C7AAC73BD30563F56AFE156D1BF33AAFE093EE33F853B465FFD1D57F049F71B3F8E2AC44E367833FE3AFDC6536C757FA1E0FDFAFDC3DDF563F66CFF00F1EBFB357F0A368DF9A557F0483F0A368DF9A557F0486D7E392AFF0043C1FBF5FB87E392AFF43C1FBF5FB87BBEA7B367FF008F5FD9ABF851B46FCD2ABF8241F851B46FCD2ABF82436BF1C957FA1E0FDFAFDC3F1C957FA1E0FDFAFDC3DDF53D9B3FFC7AFECD5FC28DA37E6955FC120FC28DA37E6955FC121B5F8E4ABFD0F07EFD7EE1F8E4ABFD0F07EFD7EE1EEFA9ECD9FF00E3D7F66AFE146D1BF34AAFE0907E146D1BF34AAFE090DAFC7255FE8783F7EBF718FC7256FE8883F7CBF70E9EA7B367FF008F5FD9A926A7DA33915AB4753854E3FD09086525A6AD75050D05652CF4F3544ECF32566EAE15DC571D9C3DC4F936C95B9F4441FBE5FB8F8E8FB83B54EBEA8D457089B0D3DBE9FA456A3B28C544546A7BDCBE0368F566C739B4F4BDAD8A2B1B7979CF9381B56AB4AAD735AD6AE590323853C1B95F7A9123EF70AB7DC2E3575B2AAEFD4CAE9573D48ABC0F818E6779DDD6D363F0F0D69E9000086500000000000000000000000000000C19300482D5E8F87C7E26D9A96AF47C3E3F136CF5183E1D7E50F9AF8EFDE5A8FCF6FA80032B94000000000000000000000000000000000000000B00000000012FD9A5B52BAFCB3BD33152B77D7F5BABED2225B9A3E99BA7F46BEB2A3849235677F7A7D5F763DA6AEAAFCB4DA3BCBABC1B4F1975117B7D9AF5945F6A1745AABCB68D8B98E99BE0AABCC92ECF28E3B5E9892E350DC3A66AC8ABD7BA9CBDDC4ADE9229EF97C6B132B2544B973B9E11578AF827C0B1768B5CCB669F8ADB4AA8C599123444E68C435F2D76AD30C7EAEA68F2F364CDC432768ECAC6EB58FAFB8D45548AAAE95EAEF51AC8A39837E3A4443CCDED37B4DA7BCBD000954306401D5D3D7EABB1D4BA5A554735C98746EE4BFEA6B5DEE53DD6B9F5554A8AF77244E4D4EC434C15E4AF3736DD59673649C718B9BDD8F27900191840000000000000000000000000000000115001E41F5480000000000000000000000000000000259B2FBAC741A93C8EB38D15C58B4D2B579657822AFB71E270F525AE5B1DF6B2DF322AF42FF31DF94C5E2D5F61CD5CA2A2A2AA2A7254EA2C5BF3135A68E86F50222DDED8DE8AB1889E7491FE5227BFDBD85BBC6CD1CBBE0CF197FF005B749F9F94FF008482AE9E24D87365E8A3E956919E7EE2678B9133929CC96E4772A6AED87D4454F222CB4B036195BD6D76F27B95389512136F263E17CDFEAF37F74B2002AEA8000000000000000058BB0F8A3935157B64635E9E4C8EC39329F490AE8B1361B2322D457292472358DA3455555E089BDC549A7768714998D2DF64675F2359AD2F0D6B5111B3E11113098C275120AACE97D99474DC1B72BF3B7E444E0E6C489CBD9C3FF729E6DB6EA6D59B40BADC5DE848245A89A57A61AAD444C357D7BAABEA381AD2FCED457D9AB1379B4ADF9BA762F0DD8D392E3A9578A9333B4CCB5EBBE6F0F079562267E7E51FE5C2001475C0004000000000000000000000000000000003BF6AF47C3E3F136CD4B57A3E1F1F89B67A8C1F0EBF287CD5C77EF2D47E7B7D400195C90000000000000000000000000000000000000196B55CB86A2AAF62264CB1AAF7B58D4CB9CB84253B4BC827743B38AE9988B55590C2BD8D6ABFEE3AF1ECEADB1373575D3B913B15AC4F81AD6D5E38F37571704D664EBCBB47E32AB816CB74BE94819F3B246FFD79F39F78F93F44B39F92F8C8EFBCAFB6567B44B63FA0E48FB592B1FAAB9D376E75D2F34D4C9F41CECBF8670DEB5279B53B8A52D053DB61546EFE1CE6B7A9A9C13FDF71D8B63F4ADBA7596DF352C52AA6EEF23B2B83DDCA9F4D5D67E9AB24A79A54444CACB8E1ED35AF9F9F245A6B3B43A98387F81A4BE1A64AF3DBCF7F245B6516BDEABA8B8CA986C69D1C7EBEB5F670381AF6E9F29EA19FA3766183E699D9C39A96B5B1B69A3A1F24A09E28E2E3F464455CAF5E72466A367543222F93574E8E55CAEFE1FF007134CF5F16725FF45753C3737B1534DA7989F39EAAB0137AED9D5CA1CAD2CD0D42272CF98ABF123770B15D2DEDDEAAA299ACEA722653DC6ED72D2D1D25E733683538637C9497300EE54C283234DE800480000F2002C0000000000000000000000000000000022A003C83EA8000000000000000000000000000000000ED692BFCFA76F11D5C397C2E4DC9E1EA919D7E29CCE2810AE4C75C959A5BB4A71AC6D4B6CA49AF1A72557E9DBBB375EC6F28D55728D54EAE3C97AB910545251A33543AC6E9E92B61F2CB355652A299533CF9B93BFB53AFD66C6ACD2294B49F2C69F93CBAC7226F2398997C3DCEEE4EDE69D65A7AB4B0E49D3DBC1CBE7DA7D7E7F8FD51107969E88744000480000000000007574CD35D2E35925AACF9DEAE674736170891A2E55557A93B7D878D3F64AFBF5C19496D855EE55F3E45E0C8D3B5CBD44C6ED78B7E8DA096C9A6A549AE9279B5B7044CAB57ADADEACFB93D64C7AB47559FAF838E37B4FEDF8CB5F5A5C68EC9676E93B0C88E631735F50DE0B2BFADBF7F821040AAAAAAAAAAAABC5557AC1599DD974F8630D36EF3E73EB2000360000000000000000000000000000000000001DFB57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6AE3BF796A3F3DBEA000CAE48000000000000000000000000000064C1D0B25AAA6F35CDA5A36E5EBC5CE5E4D6F5AA916B45637964C78AF96D14A46F32D4A6A79AAA66454F1BA491CB846B533927564D9E4D32364BACDD0B57FE5B78BBDA48E286CFA26D8D7CBE754BBEB632F91DDC9D49EE20B7FD6572BB6FC71C8EA5A65E4C8D70ABEB5E669F899337C3E91EAEF7B269387D62757EF5FFB63FCA6EEA9D33A61158CE85274E0A8D4DF7F8F6156DCEA23A8B954555347D147249BEC6A751A88864CF8B07873BCCEF2E76B388CEA62295AC56B1DB67726D5D7B9A1489F5AF4444C65A9BAABE27267AEABA8E3354CAFF5BD4F8221932463A57B4356FA8CD93ED5A65E40305B661DE59000D8DE59472A72554F529B305C6B29F1D0D54ECC7E4BD4D403963CD6ADEF5EB59949A835ADE6937512A3A5627D591339F1E649EDBB4785ED6B6E74CAC775BE3E29EC2B23260BE9B1DFC9D0C1C5F57827A5F7F9F55BCB43A6754C2AEA6585B3AA6731F98F4F5B48A5FF0041D75035F2D0392AE24E3BA9C1FEC21B13DD1C8D9237398F6F16B9AB8545269A6F5DD651B9B0DD57CAA9F96FE3CF6F8F598BC2CB8BE1CEF1E92DEAEB347AEF77534E4B7F747F984338A2AA39151C9C1517A816D5FEC16ED554495D6C7C5E538CA48DE4FEE7779555653CD4750F82A58AC958B87357A94CD8734648F4973F5FC3F268E627BD67B4C3E20C193339EF2002C0000000000000000000000000000000022A003C83EA8000000000000000000000000000000000000614EDE96D4B70D3952AFA2911F0BD7E769E4E31C89DE9D4BDE9EF38A60989D95C98EB92B34BC6F12B0DF66D3FAD58B3E9C9E2B4DE1C9E7D04FC237AF5EEE3B7BBD88436F565B8D96758AE7492C0BD4F54CB1DDE8E4E0A73D1551C8E6AAA3938A2A2E153BD17A949759F5F5DE8A04A4B824375A0C6162AB6EF3B1D9BDF7A293BC4F769C62D460E98A79ABE93DFF49FE51045C99276AED077B4CCACABB04EEE2AADCBA3DEF7A7B907E2F5954DDFB26A2B6D73179239DB8BEEC93C933D978D7E3AF4C9135F9C7F9EC82026B26CC75335331D3D34A9DADA84FB707C9366BAA57FF431277AD4331F1239656F6FD37F7C7FDA1E09D45B34BAB1BBF5F5F6DA38FAD5F36F63DD8F7994B0E8CB53B376BF4B719539C144D4C2AF670CFC49E59F356788619E94DED3F846E83451BE591B1C4C7C923D70D63132AABEA26B6BD06B0D3F97EADAC65A681A9BC8C5722CCFEEC757BD7B8FACBAF696D71BE1D2566A7A16AA63A79911F22FFBEF5521973B8D6DDAA9D5171A996A265EB7AF044EC44E4883DD5667519FA7D88FFB9FE23F74AEFBACA265B56D1A4E97E4DB5E30F97FE6CDDB95E69EDCFA8861E51307A2932D8C382986BB523F99600043280025600000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF5183E1D7E50F9AB8EFDE5A8FCF6FA80032B92000000000000000000000000120D1FA7D6FF005CF8DD32450C288E7AE32E5CF5211F3668AB6A68645928E77C322A63798B829939A6BB57BB369ED8E9922D9637AC792D6752E95D36DCCEDA7E99A9C77FE724FB4FA52EB4D3CC7E237244ABD69163E053F23DD2395D2395CF5E6E5EB3C9AFEC713F6A665D98E3D7C73FE8E3AD63E4B8AFBA7EDBAA99E554D53F3FBBBAD918EDE6A772A15EDDB49DDADB22A3E95F347D52429BCDC7D8722DF5F556F9D26A399F149DAD5E7EB26F6DDA44B1B11971A44957ADF1BB0ABE0A56299B0FD8EB0BDF51A0E213BE78E4BFAC7641DB4B52E7A3129E6572AE1137172AA496C3A1EE3707A3AADAB494DF595DF497BB04A1DB43B5747BC94753BFF93BAD4FB4E05E75FD6D5C6B1D04494AD5E1BD9DE77FA133933DFA56BB295D2F0DD3CF3DF273FE1094250696D36C449920595BD722EFBD54F2BAA34B54B7724647BBFF00541C0A9E59649A474933DD23DDCDCE5CA9E10B7B26FD6D699944F1C9A74C38EB15F92D8ABD2DA7AFD0F4B6D7C513978EFC18C78B79107BC690BB5B65545A774F0F54B12653C53A8E35256D4D04C92D1CCE8654FACD526F69DA44F1C691DCA95B32E31BF1AE157C0AC53362EB5EB09F1B41ADF8D5F0EDEB1D9075A4A8E93A3E825DFE5BA8C5CE491D8744DCEE32B5D551BA929FADCFE0E5EE44257F8C4B5247BCB4751BFF0093BADFBCE15DF6895752C732DD036991786FAAEF3B1F613E267BF4AD76234BC3B04F3E4C9CFF008424EDB6697D371A36A920E9719574D87397BF1F71E3F0AF4BCB1A325466EFFD54FC3E054D34D2CF2BA49A4748F771573972AABEB3C389F64DFADED33289E3B349E5C38EB15F92DAAAD37A72FECDFB6BE38A444FA54EA889E2DE441EF3A3EED6D7F9B02D4C5D524499F6A751C2A3AAA8A2A86CD4933A291BD6D5C139B5ED1AA216232E14AD9D7ADEC5C2AF811C997175ACF341ED1A1D6FC68F0EDEB1D908F23A8E9773A1951DD8AC5424363D1772B948D5A889D4B065155F2271C762212C4DA1DA5D1E5D4751BFF92AC6FDE71AEBB45AAA8639B6DA76D3B57948E76F2FB303C4CF7E95AEC9AE9387609E7BE5E6FC2212DA082CBA3E95D1AD5246E7E15EAF7E55EA9D78EAF035AA35669AA97AB6A3122F2557C394F815255544B5333A5A891D24AEE2E73972AAA7C488D1C77B4F55B271FB563C3C38E22BE92B764D3DA6B5042AB6E74314C9C51D02A22A7ADA56FA92D12D92E4B4B339AFCB51ED73792A2AAA7D8685354CD4B2A4B4F23A395BC9CD5C2A18A99E5A999D2CEF74923B9B9CB95532E2C56C73F6B7868EB35B83538E27C3E5BFAC767CC00677300000000000000000000000000000000115001E49F5480000000000000000000000000000000000000C003200212185C271C267A97AD0C804ED3DDF48AB2AE36EEC75752C4EC6CCE44F89F575C2B9CDC2D755AA75A2CCE545F79AB83284EEAF875F41EAB22E65739EBDAE72AFC42222270320895A221E4C80000000001200090000000000000000000000000000000000001DFB57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6AE3BF796A3F3DBEA000CAE4800000000000000000000000064DDB6DAAB6E7D279053BE758F1BC8DEACE7EE3E75F41536FA8582B617432A26775DD8579E37E5DFAAF38B2453C49AFBBEBE4D5001650000197183AF1E9DBBCB4EDA88E825753B9BBED9131C5BCF2724AC5EB6ED2C97C3929B73D6637650C9843AD6DD3B77B8D3A4F4B412BA25FA2E5C3729DA99C649B5E2B1BCC98F0E4CB3CB8EB33F27254C60E85DACD70B56EADC69A4811CB86AAAA2A2F8A2A9CF4E02B3168DE117A5B1CF2DE36914C19530595650F4793AD53A76EF4D4CEA89A865642D4DE572E38276F322D78AF795A98AF9379A5667672000140C9800003AD169CBBCB4EDA88E825753B9BBED9131C5BDA56D78AF7964A62C9937E4ACCEDE8E51930096260004A40000000000000000000000000000000115001E49F54800000000000000000000000000000185036AD9433DCEE34D454AD474F3BD23622F6A9743F4DE8FD196D864BE3595133FCD49266AC8E7AF5EEB392271F81586CF2B22A0D676AA8A876EC4D955AAABD5BCD56A7BDC5A5B5CD2B72D40943536A6A4EB4E8E6BA2DF46AAEF2A2E533C3ABB7B0C958DA3770B8966B7B4530DEDCB49EF30F355A4B4AEAEB33EAB4F24704A996B65851588D7A753D9C3B53AB257BA0B4749A86FF53495AAE869E8B854A27D2DECAA6E278A2F1EE2D0D9369BAFD3F67AB6DD11239EA25DEE851E8EDC6A261155538657BB3C3079D13554B0EB3D59429B8C9DD5093353ADC98E3EF5F796DB78DDA11ADC9863363C569B4476969D737679A7EBD2D7574B4A950DC6FF004913A5DDCA7D6771C29C0DA5E85A2A2B5FCB5624DDA76E166898BBCD56AAE11EDF154CA72C2E7860D6D61B3DBF55EA8AC9E8216D4D3554CE95B2ACAD4DD472E551D95CF0CE3867860B1AF141F27ECD2AEDF23925753DB1D1B97A955B1F34F14276E9B4A273469FC2C98B24DA67BC6FBABED9A684A4B8DBD2F17CF3A9D573143BDBA8A89CDCE5ECCA7B892DB23D9FDFEB1D6CA2A3A474D85C6EC4E8D5E9D6AD77055FF7D477FE467D468186D146F48DF251C70EFBB8E115111CABE1922745B30B22E528AF957E5B1F37C5333CD5EBE08994F69131B76567575CF6BDF2E49ACEFD36ED1F8CABEDA069A4D337C5A68A47C94B2B7A485EEC671C9517BD17E2871EC3047537DB6C33377A392A63639BD4A8AE445453775969FACD397875256B925DE4DF8E744E12A2AF3F5E79A1A9A6FF00B4B68FDB22FE7429E6F498ED33A5DF9B9BA775A3B55D2D67B46974A9B7514704EB3359BCD55CE1517B54E26CEB67A97BA76DCAF0E923A157622898BBAE971C15557A933E2BDDD735DB5FF6359FB4C7F071D8D46AFD3FA02A9287E69D4F4BD146A9F55708D47782AE4B4C46EF398F5D9ABA6AD2B6F7AD698DFF000E8E43AD7B3FA49FE4E99B6D64EDF3375F2F9CD5EC572AF05F1227B44D9DC16BB7C973B12BFC9E2F3A5A772EF2B5BF94D5E784EBC9583955CAAAAB955E7DE48A4D6D7E75A62B6A572B69591742A88C4DE73718C2AAA67970226636DA61D5A6835382F5BE3CBBFAEEB0B65FA52CB78D27155DC68239A7591EDDE555CE11787594FD6B1ADAC99AD4C35AF7227AB25F9B18E3A162FF001A4F89425C13FA7D47F88EFE6522D1D224E1D92F7D5668B4EFB4FF002B37641A6ED37BB657CB73A38EA1F1CC8C6ABB3C1319211AE28E0A1D5972A4A48922822930C6A2F044C21676C13D0F74FDA13F950AE3693C35CDDFFC6FB106DEEC234B92F3AFC94999DA23F84700055DC00000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9AB8EFDE5A8FCF6FA80032B920000037AC75CB6DBCD1D52265237A2B93B5ABC17DCA5A5B47A08EAB4ABEA226377A07B256AB53AB92FB973E060C99BC3BC5663BBA7A4E1FED583265ADBAD7C94F82D1D95D0363B4D555CCD45E9A4DDCBB8E5AD4EFEF55399B58A0486BE8AAA34444918B1AE3A95AB94FE62B1A989C9E1B2DB845EBA38D56FFA2020BAAC71C162D150C93469F334FD33D1C9C55CA9BCA9ED5C113D9F69E8AF12D45DAE8DE998B22A318E4F35EEEB72A75A71E5CB9911AA8DAD331D2192DC12F16C78EB6DED68DFE5081A31EE6AB9AD556B7E92A2706A76A9E50B86E1AD2CF6AAF7D0F412BBA25DC7AC4C4DC62F5A734E5D7833A9B4ED05FED0EADA16312A959D2C534698E93AF75DDB9E5C7914F6B98DB9ABB44B2DB8145A2D1832C5AD5EF0A74F4D6B9D9DD6AAE1155709C910B4F64B1B24B0D52BDAD77F497734CFD461BD2DE2C3A6EB27A573F153348E9665646AE54572E7CE5EECFB09B6AE62D34AD779571F04ACE1A66C9962B13EBFFEB81B1F5F9EBAFEAC7F171C8DA8AFFC56FF00F099F6926D9DD67CA3A82FD54888D64AAC73513879B9763DC7CF50E9B9EFFAD5EEC2C7451C6C49264EDE786F7FC33EDC3178AE79B5FA746F5B4D6CDC3298B0F5F7BFCCAB005C7A8EF16DD2F6E6D252C50BAA91BF350639762BBAF9F8AFBC8169CB14DAB6AABA69AB12196356AB9563DEDEDECF7A631836A9A8E6AF3DA36872753C2FC2C95C18EDCD927CBD3F5464162FE2CA4FD28CFDC7FF00D1CDD43A1DF66B44F5EB5E93245BBE6245BAAB972273CF793ED38A6768952FC1F598EB37B53A475EF0B0ACBFD8AA3FD85BFC88413416A3B5DA2D33C37255E95D3ABD311EF70DD6A7D84EACABFF000551FEC2DFE4423BB298209AC555D2451BB76A5C89BCD45C26EB4E7D6622B6DFD5EA7356F6CD8231CC44F2CF7EBE8835DE782EDAA24922CAD3544CD44CA6155382722DED4B5EB62D3D355D2C2C73A246B58C5E0D4CAA2272EAEE21F4178A3B2EB5BBC53C123FCA266471F46D4546AF7E553B509CDFAE505A6D72D65546F9216632D6222AAE571C9553B49CF69B4D6BB7462E198AB4C79EFCF116999DFA76DB7531A8F50D55FE581F56D8DBD1355A8D622E32ABC578AAF77B0E4265CE46B532ABC93AD549356AC3ABB5840DA06BE2867C22AAA615A8D4E2BC17B13813DB957DA345D143143499924CEEB1A89BCFC632E72A9B7E3785B52B5EBE8E25787DB596BE7CB97DD8FF00DBD7F4538F4731CAD7B55AE4EA54C28452DFB2DFADBABE3968AAE85AD95ADDE58A4C3DAA9CB28BDBCBB17895CEB1B2FC897C969D8AAB03DA9244ABCF757ABC1514C98B51CF6E4B46D2C1ADE19E0628CF8AFCF49F3ECE3977EADFEC857FF81F6147A17FD7B29E5B3CADAE544A5E8F32E796EA2657260D6CED6A4BA3FF008F579F1E7AFAC7F2A011AE56B9C8D556B79AA27043C97258356D9EBAB9B6EA589F4EBF463DE62358EF5617811DDA85860A564572A385B12B9FB93358984555E28EC7B7DA5E9AA99BF25ABB353370788C13A8C3922D11DD5E9F4E8A4E8FA458DE8CFCADD5C7B7916168BABD376AB52544D5113AE1BBBF22BD8AAE6AE3E8B729F0EB3A769D72CB95C9B4B0DAA7742AE46F48C5DE56E579B91138278936D45A26796BD20C3C270DEB59C99A226DDA2237FF00B54C5EB65FEC551FEC2DFE44227B4DB0524148CB95344D8A457A32646261AE45CE171DB9E1E24AECD84D1547CFFF0002DFE4435B519632D2B6875B8568ADA2CF9715A77F75461E991BDF9E8D8E7639EEA6495E824B1433CD517B9A2599AA8D8A2918AAD4EBDE5CA633D9D9825157AFA8E3AEF24B6D03EAD8C76EAB99C33FAA888B936AD9AD13B56BBECE2E9F8762C98E32E5CB11BF977955460B9B54D9A9AF9627D5793AC356D87A68D55BB923571F45DF035B65D1B1DA71CAE6B557A777154CF5214F6C8E49B6DD9B3FD06D1A88C336E931BC4EDFE151E1CBC1A995EA4EB55EC430B945547261C9CD3B0B62A2FDA7B4DDDAA69DB03DF52F955F3CAC622AA2B955DCFB133D474F5A5AE96EFA72A6658DAB2471ACB148DE7844CE33D8B823DAE62637AF4947F43ADA979C79626D5EF0A50F4D6B9D9DD6AAE132B84E484E3675A660B8A495F708FA48A37EEC71AFD1739138AAF6E3284AEEFABACF64ABF2148A47BE3C239208D1519DDCD3DC5EFAADADC948DE58B4FC222D8633E7C91489ECA73031DE5B1A9A8EC17DB3A55A54D2D34F237A48A773918AE5EA4777110D05A763BD5CA5756377A929B0AE445FA6EEA4F5732D5D4C4D66D31B6CC59B84E4A67AE1C768B7376945DB1BDF948DAAF544CE113A8F05BB7BD5D6DD3B55F27D2D1748F89137DAC446B19D78E5CF1DC6C4715A35B595D3A41BAFE2C47AB51248DDEBECE463F6B98DA6D5E8DBFE874BDAD8F1E589BC796DFE54D983ED594EFA4AC9E9A54C490BD58EF5A29F1373BF5702D59ACED20002A000000008A800F24FAA400000000000000000000000000000001B36DA292E15F4F4703A36CB33D236AC8EDD6E5782657D782CBB97E1DE90B440E4AC4ABA654566236F4AB172C6555B9F6E53815631CE639AE6395AF6AA2A39382A2A75A16659F6B55D4B44C82E56F8EB646A63A56CBD12B93BFCD5E25AB31E72E6EBF166BCD671D22F11DE27FF00B4D765EDBABAD75B75D4324AB5154E4DCE993755236A705DDC26EA655DD5DFD656D414373D59ACEE971B055454F347374AD91F22B17755551B8C22AAF04E29DE7AD59B49B95F28DD474B0328291FC246B5EAF73DBF92AEE1C3C08AD86F35B60B9C75D6E911B33515AA8E4CB5ED5EA54ECE05F9A22366AE9B459AB1932CC445ADD223CA13CBE5E75F5BEBBE4674D34B2B9C8D64F153B7E7117B177797BD09AEAC992C1B319E9AAE6E92A56952955D9CABE47261CBED5555F122ADDB34BD1A23EC91BA4FCA4A9544F66EFDA41B576ACB8EA99D8EAE56B208D731C11F06B7BFBD7BFD98226D11DA5829C3F3E7BD2B931C5223ACEDB755D50CD35F3661BD6C72AD5CD43B8D46AF1DF46E1CDCF6E5150ABB66D65BCB359D13D292AA9A381EAB3BA462B111B85CA2E7B7960D2D19ADAE1A5F7E281AD9E8E476F3A07AAA222F5AB57A95496546D8AA16354A5B3C5148BC9CFA857A7B11A9F12DCF129F63D569A3262C548B56DE6DADB4C1F29DD74FDB69918EAF9164C22BB1C155A888BEBC2FB08737485DB4FDE6CB51728A3646FAE8636E1E8B95DECF57A8E5B351D63F53C37BAD72D454C72A49BB9DD4C27D54EC4243A9B6892DF56DAAEB7320F23AA654A625DEDFDDCF9BCB8732B368DF796CE3D3EAB4F4AE0A444D769DE7E69F6DB3868C8FF698FE0A75AD7241AC342358E7E3CAA99617AA7D493185E1DCA992A8D69B419753DA1281F6E653A248D937D25DEE5DD84385A5F54DD34DCCE75BA66F46F545921913798FF0FB899B44CB4E9C2B34E9A2BDAF13BC3E957A2F50D35C92896D55524AAB847C6C5746BDFBFCB1EB542C5BA682B1DAF447945DA356575341BD24D048A8AE7AF1DD4EA5E2B84CA761A71ED8E548D3A4B2C6E913ADB51BA9ECDD5217ABB595CF53AB1957D1C548C76F369E34F373DAB9E6A47BB0D9E4D7EA2D4AE48E488EF313DD676C42BA39B4C4F468E6F4D4F33955B9E3BAEE28BEDDE4F02BCD5BA26F3417CAB482DF53534B2C8E7C32411ABD15157288B8E4BD5C71C8E0586F55D62AF6D5DB65E8E544DD722A65AF6F62A7616353ED8E7489A953668A495138B9950AD45F056AFC47344C6D28B69F55A5D45B2E9E39A2C956C974FD5E9FD3F3FCA2C58AA2A65593A35545DC6A222222F7F055F1294D5F5CDB9EA7B9D646A8B14B3B958A8B9CB51708BE2888A493546D2AEB79A57D2D346CA0A67A61FD1BB79EE4EB4DE5E48BDC840C8B5A3688867E1DA4CB4CB7D467FB56F2640055D900000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000171E8DA88EF9A35B4B33B7B76375349DB8C613FF8AA14E128D0FA9A3D3B254A54C52CB0CDBB848F0AA8E4CF6E3ABE06B6AB1CDE9EEF7875F836AEBA6CFB649F76D1B4A6775CE9DD9C369D331D43A148F08B8547BD7CEC75F5B94D8BC52FE13699B6CC89973A486454C752AA35DEE55F610BD6FAAE2D410D2C54B14B1471B9CE7A4889C57184C617D7ED37B496B6A6B3D962A2AC82A247C6AEC3A344C61573D6A9DAA6AF8178A45F6EBBBB71C4F4D7CF6C336FF4B96223E70EDED52E294D638A89AEC3AA9F877EAB70BF1DD36B6613324D2D1C6C5CAC723DAEF5E73F0542B9D637D4BF5D52A236BD903188C635D8CA76F2FF007C8F3A5F5154E9FAB7490B52585FC2485CB8476392E7A94C9ECD6F07963BF76A7F57C71C4A734CFB9B72FE8F86A7A6969350DC239D8AD72CCF7A653E922B95517D8A5C3A4A1928B4B5147548B1BDB0EF391C98DDEBC2F6703851ED06CD335AFA8A6A86C8DE288B1A3B1EA5C91FD55AE9F74A27D15BA17D3C12262491EA9BCE45E6984E09ED52B6AE4CD1159AEDB33E0C9A3E1F6C99E9979B9BB424DB2D9124B3D7C8D4546BEADEE4CA617E8B4AD75348B36A2B9BDDCFCA246F823951090E8AD594BA7EDD3D35553CF23E49964CC7BB8445444C715EE22972A86D5DCAB2A58D735B34CF9511DCD115CAB8532E1C76AE6B4CB9FAFD5E3CBA2C54A4F58EF09E6C753FA4DCFF00563F8B898DDB51D05AAE1494750F5E96A1C89C3EA22F255EECE3FDA159688D474DA79F58EA98A593A746A37A3C70C6739CAF79A5ABEF10DEEF4EACA7648C62C6D6EEBD133C33D9EB31DF4F39334EFD9B9A6E2F4D270FA56931CF13DBF54D3699A716A62F95A8D999634F9F44E6E6FE57AD3E1EA2B6A5ACA9A4DEF25A89A1DEFA5D1C8ADCE396704FAC1B40829ED51535CA9EA67958DDC57B11151C9D59CAA71209767D24B5F2C96F6C8CA67AEF35922222B73D5C15781974F17AC78778ECD0E2D7C196D5D569EDD67BC79C4BEDF2BDCB8FF58D6FF10FFBCF94D70ADA889D1545655491BB196BE6739171DCAA6A21E9BD66CF2D63C9C9F1B24F49B4AF1B327FC1547FB0B7F910E36C8D3FA8AB3F6A77F2B0E5506BBA1A7B0C16F75354AC91D3242AE4DDC2AA371DA73F43EACA3B0DB27A6AA86A1F23E65951636A2A222B5A9D6A9D873270DF96D1B79BD95788E9BC7C36E78DA2B313FB34B50FF6F65FDB19F61606D23FB1F55FAD1FF3A1575D2E50D5EA675C636C9D03A76CB8544DEC263298CF3E04A3566B5A0BC58E6A1A7A7AA64AF562A2BDADC70722F538CD7C5799A74ECE7E9F5986B8F5516B6DCDBEDF8F77336673321D55123F199237B5BEBE7F61616AEBD45656C12D4DBBCAA27AAA6FF0C317861173DBF614B413494F5114D0B959246EDE6B939A2963DB76894D25224577A47ABF1873A344735DDF85F871275386D378C911BA384710C74D3DB4F7BF2DB7DE276DE1B169D62CADA87A5B2C2F9256B72EE895A9C3D7822DAFEE53DCAB699F536FA8A27C6D73712A7D2E29CB87124EFD7B65A389CDB75148AF54CEEB6346267BD7FD14AFEFD77A9BD5C1F5556E4E3C18C4E4C6F6211831CF3F372ED0713D5D674DE178BCF33E91110E7A17B6A2824A9D3159140D57C8EA75DD6A75F9BC8A250B366DA3D1B6955B4D4D3F4CD44DDDF44C78F12FABC76BCD66B1BECC3C0F53830D32D735B6DE3F942F47D2CF57A9681B4E8ECB256C8F544CE1AD5455CF67678962ED4E546699E8DDF4A499A89EB4CAFD86BC3B40B4246B23E9A78A77226F31AC4CAAFAF3F120FAC752CBA86A63548FA2A58F8C6C55F39557EB2E3BB063E5C9972D6D35DB66CF8BA6D0E8B262C7939E6E9EDB34F5A74F587CBABE9A3A89A38D1F2BDEDDFE3D8D45E073E8F5B54DCEB62A1B2DB1B1ABDC88AE72E775BD6E5444E18F5A9F2B06BFA46DB23A5BB4122CAD62315CD6A39AF4C63976F69F2B9EBCA58617C760A148A477395EC46A7B13ED31C62C9369E6AEF3FB36FDB34D4C549C1922958EF111D6521DA871D2927F8ACF89D0B3FF0062A8FF00616FF22108D55ACE82F763928E3A6A9648F56B91CE46EEF05CF6E78F2E47DEDFAEE820B053DBDF4954B2C74C90AB911B8CA371DA57C1BF8711B79B2CF12D2FB55EFCF1B4D76FD5EB679A628AAEDE973AF8D27DF72A471BF8B511170AAA9D6B9F81F6ACD75494150EA4B2DAD1DBAEE8F7B1BA8AA9D8D44CAFB8E368BD60DB2D3BE8EBA37C94EAE57B1ECC658ABCD30BCD3ACEDD5EBBB3C2F74D436F592ADC8B87BA36B3DABCCC96C7926F3CF5E68FD9AB8353A6A69A9E0E48A4C77E9BCA5B13EAE4D3CE7DC11ADAA7D3ABA46B5308D5545E18EEE470F653C74BAE787CF3FEC39147B42A75B6F4374A7A87543D1C8F744898C2E708995EC5434B486B0A3B0DA568EA29EA647F48E7658D4C71F131F81922968DBCDB7FD534939B1DF9FA444FF8EE8AEA37B9DA86E7BCB9C554889FE654FB0B9D7FB1ABFB17FF00A147DD2A1B5773ACA9635CD6CD33E44477344572AF1F693FFC3CA04B22512D3D4EF793F45BD86E33BB8CF3363518ED7AD368ECE570AD6E1C3933DAF6DB9BB7EEEDECC26649A5D91B172E8E57A3BD6AB9F82A15A6ABA59E975157B6A5AE6B9F339ED554FA4D5555454F053EFA5B51D4E9FAA73E26A4B4EFFA712AE33D985EA5276CDA159A68DAB5305431E8B9DD7468B8F795E5BE1C93688DF764F1B4DC43494C3932725A88851E86BBD5504554C4818D91BBC8C7B951E89DE9824FB257B194972A6739AE959322AAB573BC8A98E1DD96AFB4E76A6D7E957472525AA17C69222B1F2BD51151392E113E2442C178AAB257B6A69153B1EC5E4F6F62FDE5FC3CB931CC5A1869A8D1683554B6199988EF2B2752EA9A7B2DD24A6AAB42CAB8CB64554C3D31D59416DD592D450F4F6ED3B52B4EAABC6356F15F51F06EBFB2D5C2D4B951488FC6775CC491117BBFDA1AF72DA1D2C54AE82D14922BB186BA4446B1BD8B84CE78FA8D78C56988AF27EEEB5B5F8E26D97DA2397CA2223741B51543EAAF95751240FA7748EDEE8A44C39BC3AFE3E2734FB544AFA89E49A672BE591DBCF72F5A9F3C1D4AC6D110F179AFE25ED6F59790012C4000000008A800F24FAA4000000000000000000000000000000000005800054000580005800000005400120002150001200094800090000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F4614C9850960C9801564C80580C29930A40C000AA59064043C8009480000000000000003D00025E40010000B0000000000000000AA193201000003C80091E8005800007900048000000022A003C83EA900000000000000000000000000000000000160000000000016000000000004A0000400000000000090000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F400097900040002C00000002A0000000000000000000000003D000240001E4005800000000000000010000A800000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B00000000000000000FFFD9, '1', '2021-03-13 13:10:28', '1', '2021-03-13 13:10:28', b'0', 0); -INSERT INTO `inf_file` VALUES ('5e8609290e915c4fa8b08e67.jpg', 'jpg', 0xFFD8FFE10DFA4578696600004D4D002A000000080007011200030000000100010000011A00050000000100000062011B0005000000010000006A012800030000000100020000013100020000001F000000720132000200000014000000918769000400000001000000A8000000D4000AFC8000002710000AFC800000271041646F62652050686F746F73686F702032312E30202857696E646F77732900323032303A30343A30322031373A32343A3135000000000003A001000300000001FFFF0000A00200040000000100000320A003000400000001000001C20000000000000006010300030000000100060000011A00050000000100000122011B0005000000010000012A012800030000000100020000020100040000000100000132020200040000000100000CC00000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD9FFED160050686F746F73686F7020332E30003842494D0425000000000010000000000000000000000000000000003842494D043A0000000000D7000000100000000100000000000B7072696E744F7574707574000000050000000050737453626F6F6C0100000000496E7465656E756D00000000496E746500000000496D67200000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D65544558540000000100000000000F7072696E7450726F6F6653657475704F626A6300000005682168378BBE7F6E00000000000A70726F6F6653657475700000000100000000426C746E656E756D0000000C6275696C74696E50726F6F660000000970726F6F66434D594B003842494D043B00000000022D00000010000000010000000000127072696E744F75747075744F7074696F6E7300000017000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40520000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000000000001063726F705768656E5072696E74696E67626F6F6C000000000E63726F7052656374426F74746F6D6C6F6E67000000000000000C63726F70526563744C6566746C6F6E67000000000000000D63726F705265637452696768746C6F6E67000000000000000B63726F7052656374546F706C6F6E6700000000003842494D03ED000000000010004800000001000200480000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000005A3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D040000000000000200093842494D040200000000001400000000000000000000000000000000000000003842494D043000000000000A010101010101010101013842494D042D00000000000600010000000A3842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000001C20000032000000005672A68079898002D0034000000010000000000000000000000000000000000000001000000000000000000000320000001C200000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E670000032000000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E67000003200000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D041100000000000101003842494D04140000000000040000000A3842494D040C000000000CDC00000001000000A00000005A000001E00000A8C000000CC000180001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD93842494D042100000000005700000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001400410064006F00620065002000500068006F0074006F00730068006F00700020003200300032003000000001003842494D04060000000000070006000000010100FFE10DD2687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E362D633134382037392E3136343033362C20323031392F30382F31332D30313A30363A35372020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F757263654576656E74232220786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F2220786D6C6E733A70686F746F73686F703D22687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F2220786D703A43726561746F72546F6F6C3D2241646F62652050686F746F73686F702032312E30202857696E646F7773292220786D703A437265617465446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D65746164617461446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D6F64696679446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D704D4D3A496E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D3232623834663439646366312220786D704D4D3A446F63756D656E7449443D2261646F62653A646F6369643A70686F746F73686F703A64633333616566382D343164372D343134372D626566652D3133623366363839326632642220786D704D4D3A4F726967696E616C446F63756D656E7449443D22786D702E6469643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222064633A666F726D61743D22696D6167652F6A706567222070686F746F73686F703A436F6C6F724D6F64653D2233223E203C786D704D4D3A486973746F72793E203C7264663A5365713E203C7264663A6C692073744576743A616374696F6E3D2263726561746564222073744576743A696E7374616E636549443D22786D702E6969643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222F3E203C7264663A6C692073744576743A616374696F6E3D227361766564222073744576743A696E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D323262383466343964636631222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222073744576743A6368616E6765643D222F222F3E203C2F7264663A5365713E203C2F786D704D4D3A486973746F72793E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203C3F787061636B657420656E643D2277223F3EFFEE000E41646F626500644000000001FFDB0084000202020202020202020203020202030403020203040504040404040506050505050505060607070807070609090A0A09090C0C0C0C0C0C0C0C0C0C0C0C0C0C0C01030303050405090606090D0A090A0D0F0E0E0E0E0F0F0C0C0C0C0C0F0F0C0C0C0C0C0C0F0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC000110801C2032003011100021101031101FFDD00040064FFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8E35D5BCC737C2D3C9BFBFF666A389DAABAAEB92D09964A9F7C78D5CFA56B736CD2C94EF538F1AA82F96F534916762EE10D78F8E112B54DEDED35BD3EEA09B45B992D25620CA14D3265239BD8EDBCD5E6BB286DA2B8BE79A375FDFA924D4D3205B0232DB5BD4EF199998E5459C58F6A9ABEA16F71CB9114EF9125B120B8F3A5CDA026573418AA583F34D616346AB5298A09A424FF98F2DD0F80D2BE18691C4925DEBD7DAB05B61522434CAF2C51C6FBA7FE7122F60D17CBBA84175B333D4D7E6329E172714DF5E6AFE7ED22CE1043865814FAAB5F118F0B9A26F8C7F30BF306DEE7549AE2C8889391A95FA71E1499BC4758F3D5037A77ACDEA0AB47CBAE4E30713366E12F35D43F302DA14901531CE7ECCA7C72C11718E7796EAFE6ED57516663AA12A0515431E99608B8F2D430D9A677E524F3FAA4F5A9AE5822D0750978B98B8D140D8E4C63B63F9843BDC13F64532431B1F1AD0C5DB916EE72D8E362656ACB7457BE4BC3606368A13F2553F7E5321BB5F0EEDD0B6F916C0141ADD0558F5385BE2690CC5536E98B682985A4527312ABF1A6F5C9F44527A6F5255114979C48EC4E424136EE70A2D2593E54CA2516432D265A76A6F6B5FAACACBE041E995F0B319DE9DE5BFCCBF37E8C54E9FE619A075E8A1C8FE18699F88FA4FC9FF00F395FE6ED08C0BACAB6A71A302D2BFC5B0F98C890D8323EA6F247FCE5769BE63B8449ECD62F50F5D875AE564360C8FA2EC3CC5A46B32DADF898514F2F4EBD72B21BF14F74FF4D7626F1F53F8A192BF5207B785320439FC4115A4693711DBDF5F5F12CE8C0D913D857B640865CD910BAFAE46A41FEE46F95909115A6CE4BB46B98FAC20D7214C643662170CF7323C858AFA27E2FA314452DD56DE2D4F4C9F94A6B1827AF862DF163FA65C8FD1C2C11EADCA80D716F09EC33DE42A6D1472A2824F861069AB502C331D3BCB3E55F3C412795FCE9A746D05DC6CB0CEEBBD4A9A6FF3399784BA4D445F8C9FF3931F9253FE507E61EA96B145E9F97B57919B426A6C402C4D3AF866C605D3E41BBE5BAFA5230FC32DB583B90724F865D8B930CC5BCB5A16375C55AC5578E98AB78AA8BFDA38AAA2F7C55A3D7156B155EADD315560D8ABFADEFF009C6EFF00D677FC84FF00CD73E56FFBA45AE5A39349E6F68C28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF917B754FE45FBB34FC2ED532A855A803C71E1551370C0E3C2AADF5A26361ED863155D0DC52840DFC72C2A39A6893B3D0124F8D7205B423E172F227A6C401D86D9516714AB5F0D52FD80A139193607916A21A49641526A722125825DE9F335C1F4C75ED96C434929D699A6C96C434DD0F639708B519B2F86D62F8446DC7EB1F0971B52990CB0D9871BE87FCB0F341D3236D0D5B8C6E3E2981A1FBF28E17231CD35F3479E9A06B8D356666080FC7CAA4D6BDF0F0B9919BE7FD5BCC7246F2B3BB10C4EC4E3C2994DE7979AD87666AFDAE9921171331B2C0F56D4F996EFF003CB045C5931D8EF2A483F765822E3C93012875EBB1C988B4108794A034D865910C68BA38D5CFDACB0048895EF171AE4C36479A0A470A7A6580362A4738A2F877CC49C775A4724E0D32149016B354935AD71A4A1DD6BD77C7853689173C4000D282981B835EBA75A0AF8D30316FEB00F53CBE780C5810510B7617A1A7CB21C2C68DA6FA7EA011872EBE39021BC16463520EBC791A11BF8640867128FB5D46EECDD26B2B9642A6A021A6408660BEA2FCB2FCFDD73CBED676DA8D64D3C301752BEE42FCCE56437639517E927903F33746F37E9D6F35B5CC6CC69C5188FE272B21CE195EF305FA4D63FBD6531AAF4047864086E8E4B486CAF94DD3C40F0427627A64086D8CD96A5DDCDA59B81C5A07EAC065720CA52B09035922C373792515250683B641116276C6D6D61BBE6F53302029E9BE2DF179F4113DAEA124A8F54249515DB16F0CA34926E2FE49AEE5291C6018F7A54F860465161EA22FDB4CB9B1BE11ABC42946201CC9C45D46A60F8AFF00E73E6C935ED07CAFE6151B69FEA733E1CB966C6127479A3BBF21B5802DEF21BB07F772A9A2F6CB896A8B7129F492423FBC15197E12C7338F7CBDA14FB8C555475C55CDD7156B156A98AB78AA8B1353BE2AB6A7C7155E3156EA7C7157F5CBFF0038D9FF00ACEBF907FF009AE3CABFF748B5CB472693CDED5850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91688D3E8CD770BB55732D29BED5C3C2AA125C2826831E155317408208D8E02155E1B85AF4C8951CD358A7AEC0640B684DB436F56492BD16B9596615B5884496D2F7DF6CAE41B2245BC82F22E370C08A6F82213221279612262C82A46E7E599100E3CCAE5B8127C2F41C732621C6949524D42354F4A234917A1AE47306A2535D3BCDEBA4425797FA536DCC1FEDCC76FC4509A9F9B4384B899EB24952C6B5FE38D39824C1F50F30477E480698D24CAD8EDC5C8D85474E95C9C766360A4574C1CF635E9EF930D6404B3D13EA5541F0229BD72C01A26023D4B200A41E5D969BFDD9688B498A9C8A643CC30A7422BD32241B4C601C9CD0D0D4622D78559E6DA85BE9CB031A4148391EBD7EFC95A3758ABD0572A31B6611B1823A838384A95415A9D8EDDA98F09415600537EFDB070962DFD589EDEE477CA8B782D7D5877207CCE16629B36E3C4570F267C214BD23C80EE4F4C2427802690DB9461BF5CA484009D470F214276A6FE232B21980A5CBD19290CC580EB4DE83DF2B660332D27535212DEE8FFA3C9B487DB20591D9EA7E53F3E7983CB371CF47BA75B588D42722361ED5CACD22322FADFF002DBFE729E486FECA3F324A5B4F43C6EB7AD6B403F6B2B2DF0917D9AFF997E53F30E976D75A2CF1C72CA0114615DFE9C8172A322F48F2E1BBD5F477844BCCF02EA6BE032B937028CD596783CBD6EAE486690291DF2A6C890F3BF35C434FB6B478C9AC8A0B530D37C4879A9BFB99670B1D41AED5EFF2C0DE0B228A4BA8602D3935603D3A78FD1912CE554CFF004DBBBDD461B5B6949F4D3BB6DFAF32313ABD48BE4F08FF009CBD8E0D47F29B5582DF79B4BF4C311B9F889E99B081D9D0E789B7E39EB9664FE87818D4B86E5F7E5A1C5029425A239806C20F8732B0726190DA1CF7CC86A531D462AAABD7157375C55AC55D8ABB15506FB47156B155E3A0C55BC55FD72FFCE367FEB3AFE417FE6B8F2AFF00DD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91745DBAE6B5DAA0270038DFBF4C557A007DF1B569937DBBE025217C042073DC654C931B4B9E50CA83AF638153ED2A660AE69F7614A367BA58ED6466DC57BE210497946B3748D33508EB930030322C65AED519B7A6D930C0A4B25EA976A1A6581AD2C9AE872FB4704D38D012DCEFD72B6D40CD37A94DCD07BE2CACA024DF7F0C56CA8140C8FF00BB32CBD8569F0F7CAB27369C922D18005B7B89916CE2B561340E5BAB2F4EB92C64B5D943DB5FDB89F5295B5385DAF559A094950D1CE7B04AEF99B8C2D95595FCC31E95FA5A2F2DEAB79369A4C971E6692CA54B64886DBBF1E1B7BE654698F1747A07953F25FF00357CD5E47B8FCC3F2CF921F5AF26DAC924BAB6B8AEDF686F20A01B713919D1482F2ED2EE9AFF0053F4EEAE9567B5774B4D35A8AB291B1591BF678F6AF5C85320537786D4C727D62D7D2746ACB0024AAB57E1A37BE16C1BA0A592333C1F5AB6956F6452D6B040A646283AFC2B8B2D91111FAC46DF5AD0357B7907FBCF3A594ADC97BBF4ED8D30F103505E5DC61A19341D524914F1B6B916725593FDF9C698D3094C2BC17577C9A69749D5DD17E004584A7930F1DB6C698198519259239ED629ECE48EE637F5EE6CEF94DAB7A0DF64D1E87010C6D165EFA492CFF437FCEC1AD7982636B06996E39B2843F0A8095272AE0B6424C9F59F2D79A3CADA9E9BA7F9E7C8D3686FAFA7FA33DD1786BC056A3985C85331262333C3A54F76F7BC648AB4B360D5AF80195D16C12513E60D2CD80917D45D661916331703F0A31DDBE818981642749BC3AE6906375955CC900F87512A429FE19594FE60222D35781D3EB68CAD1034926660015F9572B3129FCC840C7E65D1D24BEB4B581E196ED089EE402E021EE32070CAAD7F3211EFE61B4168AB6D299934E50F75301F184E8085EF90F02523417F34193E95ABBEB4AB7361A9FA4427EFD88A72403A53C6980E92498EA8047DBF9C7CB567070FAFC915C4CE561708580643F1127B54E0FCA49C886AA2CCF4DFCE48343113DBF98273C2842D0D36FA71FCA172A3AB8BE9FF00CBBFF9CDB4D1FD0B6D435C905A2AD18F0A9FF896425A434CA7AC14FAC348FF009CD2FC9CD42C53F4D798CACC46EA631D7FE0B043465C6FCE29EAFF00F393FF00939ABD91B3B0F33299266A44F22AA8527BD4B659F932D90D6EEC1B4AFF009C92FC948F548E1D6BCDBEB7D5488E20B10E0B20DAA581E9954B4843B0C5AC0FA4F4CF3168FABC116ADA4C424D0EE943D9DEF51231DCD3B653E018736EC9A8E21B326B4D5ED26FDD28E20EDB6D8D535DDBC63FE7231043F97F76F6EA5FD68D8B83BD681BAE646271B34453F1A350B93EBFD65BAC723023C3E239B1C54E8B53B294BF1309FB5C0E4332C38504337F1C2CD662AAABFC3155F8ABB15587AE2AD62AEE15DEB8ABB80F1C55DD36F0C55D8ABFAE5FF9C6CFFD675FC82FFCD71E55FF00BA45AE5A39349E6F6AC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90949CD3DF35AED52FB89CF2AF7C55B86E091D7E78AA21AE147461F7E02A39A924D50F534F0CA99A334E620B96D86F4AE054F2D6EFD2473D3C3154A750D59DAD254AF1F88648734179BDEDD33C8C49D8E4C302C72E27356DE9930C6492F362E77DB26D6A44FC66A69B7538CD38D42523B1FA72B6E435483D7156B155F63A7CDACEBBE57F2EC774BA6C5E65D66CF4A9755A8E708BA9021600F600D6B93C70123BB466354FD9DB4FF9F49FE51E9B35B5DF9C7FE725E596D2C19259EC276B48A07400311EA48EBB7C865808ADA838F7BBEA8D27FE704FFE70B7F2CBC93ADFE62EB5E4ED2FCFDA1F97AD1F53B8D68CE66458A1AB332885B893F4E5D007DEA4EFDC5F217E7E7FCFC07FE716353FC95F327E49FE4E7952E35AD3FCD1A73D92DB5DE9DF548AD1A421898DE956229B1CBE2A0D9B7BB7FCFBAED6DAEFFE7DEDABC11C097125CEA9E608E58A641C5CAD0F02C474D8EF91931E27CE5FF386BF901FF38ADFF3939F947F9A5E46D4AC20D13F3DE4D4AFA3D5B502693D8AA5C31B692CB911EA29FDBA74FA3229E2A7E6C7E75FE48FE62FE43F9FB55FCAFF003FD93DAC31B9934FF32509B7B8B752CD0949A9C492805403D7037465694FE5779EB49FCAEFCC9F267E62EBFA147E6CF2EE9F1490DDE9774291BF26A6F8B2E2EAFDABFC97FF009CC4FCA9FCF4F37697E48F21FF00CE3B5ADDCD7052DF51BD5B3AD9D9DB103D4066084034DC570B1E305EEDFF00393BF9B5F917FF0038B736896771F9223CD9E6AD663E3A258D869FF588BEAA48520BA275A9D862C38DF24AFF00CFC07F285102BFFCE28EA5A6B472F2BE54D1A4243F7A829818193E5CF2EEB1F945FF0039A1FF0039BFA5493F92469FE42D5B4CB5D2E7D04C660314D0D43332281435070B0326BF337F28BCA9F919FF003F16F267E5FF00E5ED82683A169F269B7D6F08FDE822E95988A3D41D80C89E4CE25EFF00FF003F7E5B6B6D7BF216FAED56EE1B8866F5D446B172F848FD803B9CAEB9B3069F945A4FF8720F3D7902F7CCBA4407CA305FC0757B66735684CAA5B90FF572BE8DAFDCAB4F397FCFACEEF5A9560F2669B26AD218AD25536AE12579540001F528C7B5460970F716278AB9BE8CF3FF00E497FCE0E7E5E7E5C69FE7AF387E5468DA6F90EF8441677470419BEC02858124FCF23C239D7E3E4E29B7CC49E6EFF9F50CE925A2F93B4A8B4E1113C84120527C38FAB5AFD3938C224F543E93FC95FC95FF009C13FCF1F2BEA3E60FCB0FCA9D1F52D0EC646D3EEEE9E378D870A93D5DBC32D18815DDE0B79E65FF009F5A683AA6B3A4DE792B4AB0D6B4B9A7D36FE25B7763CE0AAB0E5EA53AFB75C9C71041BA7E10595CE9716ADE686D3E258B449B5DD4A4D123AD185A191BD15A7871A65BC23AB5926F67DC5FF3827AD7FCE27E9FA779F3FE865346B2D425D52E61FF000CC570865F4A341FBDA85652A49A1EB8384364645FA0ADE64FF9F54F0E2FE56D1154776B7907FCCEC7843689C97DBEBFFF003EAD240B6F2B684EC4D14185C024F6AFAD80C026539232EB55FF009F5B229F5BCA9A1AB20ABA7A7202A3DFF7DB618E30D5C459F7E5FF0090FF00E7DF7F9C370BA2790BF2B6D35DE5F66FADEDE6FAB236FD67595941DBBE1300CE32931BFF009CC4FF009C6AFF009C4DFC9FFF009C73FCD3D534FF0021E85E59F375CE85247E5495A765BA92F792F130866DD857B0CA66221CAC5399237D9E1DFF0038E06E1FF24BC8D6FA85CDC48EB67037D52742BC18C62AC09DCD7357A900BB9C123D5F4B695A658ED26C48DC819824539F1281FCC5F2E5A79A3C9FAA5A7107EAF03F15EE7E16E99386CD59793F083CE5A73699AFEB5A5BC6D088677081C52B466E999F8CBA3D4C5283B5B59A9054AA1A5733226C38110866FE39364B315545FE18AAFC55BC554CF5C55D8AB5CE9B53157733E18AB7B9DE9D715750F862AFEB97FE71B3FF0059D7F20FFF0035C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EE4B96A57F0CD6BB54BEE6E4F2FD78AAE86E01502BB62AB1E41CC1F7C05211724A0FA7E1953247B5D0458CD771D302AC9756E0B4AE2AC5EFF0053332B28F1E9921CD058C5DDC9A1C98605209A72C684F7DB2618C96890713936B5093F7854786F8CD38DBF476F6CADB96AC542DF462ABFD318AAA691E55F3379E7CD9A1793FC99650DD799AF254BAD31DD8AC8AF1B7C3C69EF976201C4CE5F60F993FE70D3FE739BCCF6ED6FE636BAD4D0A7A0BA64974C55430141414FC72EA01A2CBF643F2F3F273CFDA2FF00CE0F79D3F27751D3560F3D6A7E56BAD3AD2D236678CCF22154058926A49DF7C9C764136FC52D1FFE701FFE72CB48B23A6C3E43D327E0C6E11A590B4CA587B532C0520D3F6A7FE70B3F25FF00307F2DBFE70CB52FCA9F37592691E78BBBFD6E6B3B02DD56EF8984D76EA01C892C0C9F94DF94FF00F389FF00F3995F93FF0099EDF98DE46F2ADA43ACF97B58B9B9BFF5A5741716D34DCA84568C0AD6981417AE7FCE7FAFFCE51FE6E79534AF35F9F3F2AB43D1FF002EBCAD1B32EA1612BCB7E1CA1F51AE118D5072AD074C590953F38FFE71DF41F23F993F327C9F61F9CBA9DDE9DF96FAE3B23DCB201688E1C22891CF40316CE27EE04FFF003953FF0038D3FF0038DF77A57E43FF00CE2AF97F45D77F31FCC37D67656F7518A6957724DF097B9BD427E3626800C58195B18FF9CAAFF9CCDFCF4FC80D7BCAFA67E687FCE3DF94F59BED56CC3691AFD83497715B5C16A2A4323861EA03B85271636FABFF002FFF0038507E40CFF9F1F9F7E46D13C8B05BDA9B9D3F4E4445935042AC10CEACBB48C69B0C5812FC5DFF009C15D5A2D67FE7381F58D3AD6DADAD7CCBAE5CEAD690D688B677723CB1C6941D830DB16264F56FF9CB6980FF009FA17962F26790A01A3C56CD08AFC512BA95FA2BBE25B81671FF003F8D92E6E35DFC86B458964B3FAB48F6A53790B537046408641F93B24769776F1C5A8D8BDC5E5005AA9AD32A21B8153B8D1ACADF59F24FD5E27B49CEB5640015A8FDE83B570034CB9BF793FE7E412ABFFCE01F962299A79644D5F458DA471425D6A77F6DF2C8C6A9818EE5F822DA1697A868B63A7E97A1869E3B413DF5D92F5F5075EF84367007EF97FCFA0C347FF38C9E7F8608E44B9FF10DDC61C0FDA11353EECB049AB806DF17E12F9AB47B1BAFCC0FCCEB8BA8DA7BDFF156A70A3396A02262C6BBF8938253D9B3806EB5E3B64FAAB416104933FC0DC4D7EC8CC7F14B1F0829A683A75C3FD616C230D727F7CA091B8F91C7C52918C27967E5AF2D4C04779A2A4DE22AFF00D71F14A784226DB4BF2FEA7AAD9F93BCA1F97771E62F34DF4C9FA3B4FB38E4964E75A091954D4283D4E4A323252007E937E427FCFA63CE7E6BD624F38FFCE42EA16DE50D126845CC1A268937AB24A08A94B9E6D5414EA2B970B69343DEFAFBF303FE72AFFE716BFE708FCA571F975F92DA2D9EB9E72107A561A1E8CA67B496FC01F15E4C0B1526A6B4C8CA7B338C093BF27E59F9CF5FFCCAFF009C81D6EDBF31FF003BB537D6EE21B8F5743FCBD8E42FA6D9467EC96E276A53BE60E6CF5C9D8E0C3B6E1F657E5BFE6369D731586871B246D63122D22A1B745A50468C07ECE61711939F5C2FA534DBE8E15925460EAE054D72328B7C24CC22D5AC61D12EA696CBEB7CA290B102BC7E13918AE4E4FC43FCFDBED3F5AF3EEAA2CE0F41D256DA94A6ED997093A7CE1E1FEA48CAB1C8FCFD01C57D8667623B3AF229D96A1D8ABB155CBDF15546ED8AAC1D3156F15770077AE2AEE03C7156B9D36A74DB157733E18ABFAE6FF9C6CDFF00E71D7F208F8FE5C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D34BC51D4D0F8E6BA9DAA5D757887900C2A71A55B6D7229BB0AE34A897909F881D877C041506914D7085128E2A32AA2CB88285DDE7100A372E23B634578825125F3B6DE3DB0526D0734E0296AD08C9008291DD5D541EF920C0A4C65777FB27E7930C485FCC81BFD3930585174720E677DA9824530148B0F5141BE41B2D48B91D8FCF15B6BD4C56D917917CEFE6DFCBCF3E68FE74F25D8DA4FADE8686E21BDBD1FBA4E07970AF89F0CC8C3C9C5CFCDF7349FF3F5EFF9CA09EC6E2F7F40F96EDEE2C9C5CDC4A63A3948C50D169EDE39750B71DFAE1E46FF009C8DF3C7997FE70D7CC7F9F77D6D65079CF43D126F318B287FDE7668D4B05229D0853DB26021F945E58FF9FADFFCE5A79B35516DE55F22681E62D56E938AD859DA9967DABFB0057B78614BF5BFFE7113F3E7F303F3EFFE71A6FF00F34BCD7656107E6269DAB6B5A78B38978242DA7FD8475A7C2DB1A8C04354DF9BBF941FF3F0CFF9CA9FCDFF00CFA87F28345D1BCB916A1ABEA975A7BCB321458A3B4765E4CD4EDC70522934FF009CF1FCF6FF009CA8FCBB54FC9DF3CC3E4CD4B45FCDAB77FABC1A0167BE8560F85BD6561F0D6B51F2C5987E547903C85E7FFCE1F31E95F90DA75CE97A4DCC5234B6925EBFA51B3F2E410B7892705864FD16F257FCFA23F3F26D7B44BFF33F987CB7E4EB2D2CACD0DEF97A57FAFA5C210D14B5634E4AC01AD70A0BF577CE1E75FC81FCA3FCB5D0BCB7F9F7E7DD07F32353F23411CEF26B7325C6AD737D0F499537AB531624BF32FF00E7323CE1F9DBFF00392DF975379D3CA7E4D9FCB9FF0038CFE50893559ED75188C37B3C51FDA96341406234F84E1A60FCCAFC9CF2BF9BFCFDF9CDE47F2C7E5B79864F2479AFCE0F1D9F917558E43088E40A5C7AAC3703883D31E140897EB27E5E7FCFB5BFE727B4DFCF1F24FE6C7E63FE61689E709343BC49F53B89E691E765414DAB4AD6B5C69B86CC2FFE7EF9AD68DFE37FC9DF2EE8BA9A4BE67F2DDBDCBEAF6D237C36EB22928CDE0180DB2259805F3C7FCE28FF00CE04F9B3FE7277C8B379FED3CEF2E942398C3C1E42073EA05011EF913BF26775CDF5A68BFF003E80F35DB6ADA36B1ABFE62B5E3E957F6F77F57E65AA20903D055BA9A5300891D14CC17E927FCE507FCE31CDFF003909F913A5FE4E5B6A8FA49B39ECEFCDFF00EC97B4D954EFDF2C0C0CC9DDF9B23FE7CF5E6CB5D3445A7FE68CD0DDBB5651EA3052BDD766A644829F10BF463FE710FF00E717AF3FE717FF002A75DF235E6BF36A771A95F4DA9497719F84348A568373BEF954C90A245F9F1E67FF009F44F98B5AF37F9975FB0FCC06B6B3D7B50B8D4C42F211F1DCC86460C037515C4094BA289D17C03FF393DFF38B1AC7FCE29F9FBC85A4EA5AE9D56D3CC32395915890415F72727E1D06CF11E5115ADBC0BC0ACCAD3B3189E9B75DE990E109E22AF02A25CA98A4775EE7B60A0C6CBEB5FF009F6E24C3FE73B742F456393FE752D5CC824EC9C7E265F714DB2E8061225F657FCFCFFF003C3F35FC97E6DFCBAFC96F2179A27F2BE93E74D264D47CC3E6289FD3B9611CDE998B9D3BA8E9965048912FC9FF002E796B4CF2F6A1746D8A5FCB75704DF6B7A99ADCBC86A4C8A6BD77CAB200DF025ECD06A30454B7B39648D29FBFB81D251E0C7C335D962E7E29109E69570F65730DF69E56CA20DF15B45B4751D5BE6731E31A72B8ADF587E5979ECDFABDB5F5C28E2005E47AFE18261BE05F56793754B6B9B7BDD2DD11E3BD8D979B741B532B00B39BF217FE726FCA5FE19FCC1D4EE238EAB732332D3A1A96E999100EAF5043E588DA30F351BE22DF1A9EA0E67E2D83AD9157A1F0CB98BB7F0C3452D12075C08B5CA46FBE2AA8C46DBE2AB01DB156EA3C715773A6D4C16134EE67C31B5A6F883BD7AE3687701E3855FD72FF00CE367FEB3AFE417FE6B8F2AFFDD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87A96FEF941ACBF8E623B3B0963DF5F16DA5AE34B611515DDF541F571A5D9318B53BD42A1E4AA7ED2E0931927706A3CC0E9BE52D61166E7638B38A5E6EBE33D4E2D8103717049C52833FBC23155616C42F21DF15434B1D3B62A868D7E36F0F0C5894746A3DBE8C582BB461BE43155168462AC93F2FBF2CFCE1F9BDE7FD1FF2EBC9776965A8EAF19905C4E6900A1A7C7976271B31DDFA2BA47FCF9FFF003D7597F43CC9F997E58B4B688049A0B3123CA57AD18AEDF7E640F268B7EC4F907F217CA1F937FF0038F179F955E75D6E26F23C1A335AF9A359B87280447FBCAB9AD12872616DF1CEABFF003963FF00381FFF0038BD6BA743F96BE5BD23CF9A8D847C5755F29411C972838D2B3CEC2B5DC8241C905B5BFF003EB4FCC58FCF1F979F9AFA45BDB470DBEA3E63D675CB68140E5026A2EC544B4EFF00150E4BA2F0DB17FF009F7DFF00CE324FF963E63FCDAFCFEFCCDB44B09FF4B6ACDE5AB8B8F84DBC31CECCF23927F6C74DB010CB81F96DF9DDF9D7FF002BE3FE7253CE9F98D6F74D045A7CCD65A2E9970D50A9033C3CA01414E4054E56436C616CDFFE712FF28FF257F327CF9E6FF31FE72FE7149F963AB796353B69BCBCB6F75F56B8942307356F0AE459786FD51F38F93BFE71CFCE8D7B3AFF00CE71F98B48B4344BB5D3B5DE01005028483E032A32A3CDA4E2277A79DF977FE7DABFF388BF9C724FA9681F9DFE67FCC6BB8EA6F35A1A8ADDB0A750CEC07864F8C745E0A7D95F97BE4CFC8BFC81F25FFD0B3F99FF0036D7CCFA7F9B4496BA47977CC577EBDF4905C8A0B58A951C00FB2B931913C07B9F1A79AFFE7DDDFF003895F947E615F32F9A7F3CF59FCB2D465BD7B8F29DF0D405ACB64ECC4AADAB863C4A5683DB26269AA1C932B9FC9FFF009C6DD4E4B4D31BFE73E3CEE249C520787CC4435C9EA55985795326770C385F15FF00CE607FCE3DFF00CE35793FC93A9FE677927FE722AEFF0035BF320CB15BDBE9DABEA02FAEAE854A30AD6A780ED95C837C075A7C55E4DF31FE71792B429EDFCA5F991ADF923465E12CD616174D00776151B2E634B6673887D0DFF38F9E6FFF009C92F3EFE7CFE58F92FF00E576F99F50875F9E3D66F2CA5BF77A5BD9C80C9148A76A3807614C8F38DD72712517E82FFCFD9BF3BBCF5E43D53F2BFC95E46F376ABE50D47CC9A7CBA8CF75A64ED0168E297830629BF6F1CB9B7146F67E4949F9B1FF0039096D688A9F9E7E6F8AD66FDFCB72DA8CA013ECD5AFE382DCA9C283F6FBFE7D73E78F3479EFFE71CBCEFAC79EBCD5AC79AEFB4CF30DDC2BA85EDC34F27A0B192A159EA695A9EB8251704737E2FF009DFF003E7FE720AFBF30FF003022B5FCE7F34697A7DAEBF7D69A7410DF3A2450C729F4D68294016836C31A05CD8E332890C035DD5BCF3E67D574EF30FE64F9EEFF00CECFA07C7647509CCECBCF614AE4E73586911714D00BE54BA9663752A97D3E2AFEEC022A6A3E5989293951D3D2B5AB7A48ED5FDAFE3862584B1BEBEFF9F69C9EA7FCE75684C3FEA4ED647FC933991170F2C69EDFFF003F6FDFF3EFF26475FF0070139A7FD1C60916A897C11A8C06541DF8C9CA998F22E5C0A7769767EA8B08FD9ED9448B971679A34DCA08E393ECD77C85B75DB34B4D4A5D2EE2196CBA0209A64245CAC6FA93F2F7F32121B8B35B9702BC565AFBD3DB220B64F93C6BFE7316D6CB516B1D6AC183B3AD5A9F4E64C0BAAD445F9DD35A43EA99631F13EF2FCF2FE275A614A6E782D075CBE05690E243D3DF2EE882BC0E79596B937C78ED819479378B2762AEC55ACC79736D1C9BC4312578CB43592EEB920C097F5CDFF38D9FFACE9F905FF9AE3CABFF00748B5CB87260F6AC2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF864BB048AACD51DB311CEB4BC2B147612EE01C56D17621DC0AC98ADA65E8307525EA2BB8C124129D5B45D38F4CA501306040229D716C8A58E28E49D862D88571C9F6DC629548E36A8DB154D235AAD08E9DB1541DC42687E1FA7154A1D5D0F43BE282A91C8E0F4C58F0A3519A9BEC3B62BC2B8891BA2938AF0B21F2279EFCFF00F94DE7DD13F323F2F2682DBCC7A3AFA3682ED3D5818B1AFC51F7CBB1CA9C4D40DDEF1F99FF00F39CFF00F3963F99305EDCF983CE163A19D22DDC48BE5D88D8BAB28AD1F89353F4E5DC40971E9FAFDF975AC7983CE1FF003EDFFCC2D67CC3ADCBADEAFAC793AF6692F6F5CCACAEC87A96F0C9476B5A7F387A7BE85A5F97E686F0C4B71A859A08A7863264776DF812A09AEFDF240AD3F707FE7D29F951F9A9E58D67F327CEFAF794AFFCB3F979E6FD06D2D74586F289F5A962209786B4A13D6A72D06C289D3D0FFE7EADF9D7E75FCBCFCB8F2D7E4FF95F4E9747D37F3126922D63CDB6EA5623146D510C6CA2AAC4FDADF7C494F1EEF91AF7FE70E3C83AA7FCE05F92BF3AEF2F5BC95F997E5B8A7B89B5A998AC37BEA48591645EA49A0A13EF9592D8323E2BFF009C7CFC90FCC1FF009C9CF3F6A1E5DF285F695A3F99A0478754D4EFA15781907C3CD50EF5A6F91B6632ECFD44F20FFCFAB7F26BF2AB40D53CD9FF003943F98B1EAF1E9122DD31D16E0D85B451A7C6C6757AB301DE83A60113F0419DBEF0F30F9D3F2CFF00297FE7157CDDF985FF0038E51E8F77A2E99A34D3E87AB584002CA507C25DB882FDF7A647C2A533B3BBF9ABD5FCC1E62BDBFD3BF38B52F3E1D5FF00332009E6CB79656692289588A59C486BC597C06110A62723F717F317CA1E4DFF009F8A7FCE1B683E61F29DEAA79DFC9B6E93C371250BAEACB12ADCC53746E24D763921162676F3AFF9C76FF9C4AFCACFF9C2AF256A3F9DDFF392BAF68DAC6BB25AC8348D2EEE1F56DE1050845489C37C66B4AE4B8D1C4FC98F3C683E4FF3F7E6A7987CE9A0F95AFF00CB7F97BAD5E493E91A34D227AD21690B17B72BF654D4103C32B3367E3523BCC3368DE5ED38437CCF631C29EAC4D72DCC48631544A0AD49A532A3BA7C6B7EAA7FCFAF3F21AF74CB6F31FF00CE577E62D9AE9F1EAD6D2BF93BD61C560D302B7AF32F2A5140527135F00C38ADF0C7FCE507E6BC1F9E5FF3923E60F3559336B1E4BF277ADA2792A590F34B9B5726B3475EC1AB91F136761A7C24EEF13D4A2B98216F556DEFED9374B08928CA3C0D76C7C47272E2D9FB2FFF003E9130C7FF0038CDF98534B0936D279BAFFD6B75D8AA08A9C7E8CB89DBE4EAB83D4FC42B8373FF002B0FF346E6C618E5B6B7F36EA8E7D75E4157D634041F0C864950761A68F34C66823B9FAC35E7A572978ABF0C0BC42537E99852CCEC052AAA97948E11B154E30923E3000EC721E2309CC24B3CE90432F3902146A3D4F427A65F09383972D3EC4FF9F65C7327FCE717971E44204FE4DD65E13D792F03BED9990E41D74F2713DD7FE7ED2449F9FF00F92E10F22FE5F9CA7B833E5732B10F862E5828B84A5655AD5331E45CBC6126D3AF59262937EEF7D81CC79172E2F55D2984B0523352AB5DB204B918E36C8F4C9E559024919604D2A72B949CA80A679663EAD494CBE9348414FA32024DB241F9EDEF35FB18ED9C35C431A101FA819938E4E0E585BE39D634AB9D26FEEA39A268D2662D096EE3DB2EE370E5898E354B6FF7E6463938D38D34D18D88FA73281D9C5915363C7A76C8940709053734381B03B9A78E2AB81077071575478E2ADD3C329237656EA1F0C900C495DD865803592DE4A9812FEB9BFE71B3FF0059D7F20BFF0035C7957FEE916B96057B562AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF86BB8802C67311CBE240DB460B32F63B1C57899159D94483A7CB15E25595139003AE465C97891F6DF00CA9215659878E2D914A669013D6A7B62D81411BE21E18A519137BE2A8C57A6F8AB52BD57DF154A6615A629014E35DFF008629A469140B8AD2262C5682DBA92EE182EA4897D5B636D227A6366F588F8581F6C944B46585BF40FF00E70A3FE70BFF0024FF00E723FF0029B5BF3279AFCCB2E85E6CD3F54FD1B7D1CF7CB1F2A8279716604E5FC449B718C2BA3F4B7F3B2EFF00283FE71B3FE7103CF7F9456BE72B18EF350F2ECFA4796A059D267BDB87144850231219B975392053E1DEEF8D7FE707F47FF9C0DF27FE58699F9D5E7A920D17CE3645F4EF33E9FE629BEBB0472C5F6A58ED983503B74A0C9DA38084AFFE7217FE7E75E7BF365C5E7907FE719F438FCB7A1D9BB245E63302FA77D68A6A9F554D84551B9A76C78E9A678492FBA3F267F36BF20BFE73B3F246D3F2E3CE2F6ADE69D3EDE14F3568B7AC8B7B693DB95E53432C86A3D4707ECFBE0333C988C469F327FCFCB3F353CABE53FCBAF26FFCE267E5CDFDA3C1E60317E9B4B77594D8C5624344ACC8763215A1191E3A663097E57797752F3AFE5FF9C6C7CCDF943A9C9A0F9CF47B37B69ADC3304BA5917E290814069EF94F8AD834F27D89FF38B3F927AAFFCE6FDA7E64798BF3E7F37350B297C93A92E973E8C3516B68AE39C65D8B46CE015A8A5732465003038E4FD4FB9B5FF009C5EFCACFC8DB6FC88F3D7E61E976FF96F73A61B09B4D8665F5F8B1DCB4D11635DFAD301CF148C322F85A05FF9F51FE534B65AAF9524BCF3E5F69779EB5A587D6E6BA592E54502399556AA41E94A644E701B069645F0D7E4CFE707E71FE4DFE6779E7F353F27ACA7B7F2BDEEB5777FAA7901F91B67D325959D04716C81E8C454657F9A8B68D148F47EAA587FCE5D7FCE207FCE64F97A0F277E7DD8CFE44D68148A2F29EA333219A56D898E455E2373B03F7E40E51F51E5E4C65A390DBABF3FBFE735BFE7193F2E7FE71D6EBCA4BF931E6B9F599BF306493F44F97BEB7F5C7B6892AE2854B05A8A0C81CA48B3C9A8E9A47A24BFF3851F919E41FCF8FCE08BCB7F9D5E708F47BEF273A5EE8BF97374C527BFF4784AEC676A2B2AF75EE36C1C6472EBD57F2E62FB7BFE738BFE730D64B5BBFF009C5CFF009C7DB8B4B9D4AE02D96BFAD6931886D349B68C7096D02A1E279A93BAED8F89E9B972FBDC8C7A49134FCD7F2F791E1F2BD8A68176E65963AD2F474AB6E687E67304EA2CBD060D36C9D5FF00962CDEC2E4C7290D6F197694577A7CB271CD6DB9F4FB3F537FE7D471DBC1FF0038CDF9836D79756F682FFCD9A8A47EB4F1C6DC425391566046FE39B033B1B793CF4F170CC03DE7EF7E383E88DABF9ABF332F6D2329158F9BF538A57471C64549295DBED5731F3CEA2ECB1E2B0B64B2FAB6DC295ED9A83959F8450935A7AA80863180EB571D695CB2191AE78497A47FCE3F7E527E5A7E66FF00CE4DE8BF97BF9B2B736BE4AF3858DC5D45789762D544B6F1928399200E4453E9CDB69C931BBE4EB73E120D53F757F207FE70C7FE718BFE71AFCE927E65F912FE4935C165716D61ACDEEB114F0C16970A04CA23671527C4666125C2188F73F2B3FE7E3BF9A5E4EFCDFF00F9C87FCBEB2FCB3F30C1E6A87C89E5FB8B0F31FD554D22B812972BEA74AD08CA67CADBF1E3DDF31DAC4D05A3A188C69337A8439E4E1BFD6CC69173A18924F4C0BA048EF98E4B950C4F51D01855631D5C01954E4E4C31D3D46DF46944493053B8AE63CA4DA229835ADEBC6A5222C22EBB64449245AB5B5C4A54C33C541EF9938E4C4C2DE59F9A3E5C4BCB14D4ADE3DED50AB53DF2D949A32627CC778E915B014A4B5A1CC8C527559E348462CA23AF565AE6C22EB25CDCA390DFB64CB3839A315C836114B7D35C50EA53618ABB155C1C014F0C8916825AF572403025BF532603025DEAE5822D64BFAEAFF9C6B35FF9C74FC823E3F971E55FFBA45AE0661ED78A5D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF881BC880420F5CC3E20E424B0A857A1EA4ED8F12B24B50B4218D31E20AA8F08670CBB9ED809B0A39AA03C41076395F0B604BE5662C6870F0B30504E1C9AD31E165C6D29E277FA7070B21205171354FC382928CF8A83E78D2B8D698D2A12406B8A625A8D0D7A6D8B2B45B23300145698AD85F1EDB1EB8ADAA4A225884FC4CD3AB045B6AD0153D5BE8C429A2868F47BB86133689E66D47465BDBA56BFD32CEE6585789FB529E0402465832531E005338FCBB6FA84CE751D4B53D461B17E766D79772CEAF20E8C15C9030F8BDE98E11D11F0795F499EFEDAF6F2C266B595F85D69026222007FBB997ECB57C30F8C19F83BDB33B782934292BC7E8C4ECB672C2823F4231B2D78815DB6CA67985B64710EA91EA7E5A437115F68D25EF97EEA32FFA4F52D3EE5EDCDE06FB3511914E390F1E9B3C081768DE5FD3ED8FD72E26BBD7F5E0DB6AB793BCAF427B1724ED909E7B671C1001E86B6EF2DC590922A49044CAFABA1E2483FB240DF7CA8E50DBE0C52883F2E6D4EB125EC771AA59E917959750B0B1BE96DBEB128E858C64549F7CAFF3738F271A7A404BD4B4AFCA0F20CF6D75A85CD86A90996129159DE6A12DD0527BD5C9CA726AF24F9B762D180ED0FC95E5FD05E19F4BD0603769271769155C18BC68475F7CC796693B0C7A50F52D3ED674B48A28163B4912E1A66754142ADFB0C0751EC72BF1A4E6474B163FABFE5BF943CCB3DC5D6B1A12EA3716A39D98B522DA49246EB491402299911D4D7544B4B1287F227E4F59E81AD5C7992EAE2F3EB112D346B2D46E1EF7EAA0FDA0A64AD36F0C9CB59C5CCB8FF901D143CF1F94BA579AAE96F74992E3CADE648DAA3CDF6933C721435E6948E8DF1034EB9286B047CC2FF2782ED17F2EB4DF2AD9BD969566F737F74419BCC533F3993F9B9330E4C5B213D582092E54745188D833187CB62EAD134DB88792A75D40F53FC73046716D98F152B4FE598AD6DD2D6CC85957EC5CB0A807C48EF96C753109CB8F886CF269BFE71FC4B7D793E99E62D5B4A17B5B899AC6F26B783EB2E7E26F4A3206F99B1ED1A157B3A89682E5C54CA34AFCA7D23CB5A63D9C76B2DDDC475996F4C86AD3B7DA771FB44FBE5597571946ADCAC7A7203CF75FD0E64998087A1F8B35E32370D384AE0D338C0E49F4DD47C2C45687B6646292CB00609E67F2EBEAF0D8DC5DC93DB6B36CFC6DEFEDA5689E28C9F8802BBEE336DA7CDC2E0E7D2C65CD8A6A3A0EA36B2B45A7F9B35FBC8C7C715BFE91B85141D57ED77CCD3A814EBB369611E5F794CB42B39B42944DA3DD8824D64F3D75661EACAA4ECCBEA1DCE512CE1A2189EBB1D84090ACF0C6C2D8AF0F58B16E4DF2CA279A2E6431A0534EF527AA2D77CA2598391114CF346D3E7867B762945E42B944B286FC71E3E4FA7F44D352F2C21089CCF115DBDB293305B0E0932587CBA3D27458E8CC3714FECC00B0F0A439B17D4FCA324619C2D3AF41FD99930986420C0753D0A76B1BCB59D39C12EE58F63965F1726196161F1E79A3CB8D63A8CFCA32B6FC8956CCBC669D26AB1960ECBCB91614543C53E599F09874D381054A46F4E95D81E872EE265034A4F2F1343D698096C26DAF52B8A1557703155C411D462A8377F888AE203592B79FBE48062EE7EF93B6041772F7C9713120BFAF7FF9C68FFD671FF9C7FF00FCD6FE54FF00BA45AE066393DB714BB15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8779E6690D0E6BDC86E0B62C55A9D0D6B8AA7B1454C555F8814C473508693A9CB59A5E480C49E98AB4CE9E18AA1A465236C05945742699536F1047092A078E2B61716DBF8E15B08391B7AD701482A9130DB026D16ADB1FD78ADADE4395715B5CC6A062A9859FD93912D914FACBEC37FAD95C9BA09CC1906F8A6B0A0645AF8E565124EE5B5E56640EE320531482C21F4EE0AFF29DF2B9330CEACE0F56829B9C8368E4CDAC6C8B24629D3205B22F49B3B43FA35969534C81722095DBD8BF3A50F5CA8B97065B6766FC7EC91909392190E9DA51E60F1A6F539510D822C94E9842EE2B4182922294BE9CBBFC3DF1A6D10413E9C95E9808D9918A3AD6C100A53AE505ABC3569B4C47A10BB8C57C3455AE9E00E9D714786EB9D2B9A3F14DE9B62830A0F10F35689708F3388C77C945800C0A1B0924B69D5D00DF7CCCC658CA2C43CC9A64B085600D3332127032879C5F44D1D651B3014CBB8DD6E68EC9569E93493D373BE4096BC707D0DE5ED224BCD3238D81217E2194CE4EC2186C27B0F95E4120223E9ED98F22CCE9CB2BB2D12485E12E869514DB2B3272F498082FA3BC976F1FA31C6CBD80C00B9B2C4F5CB6D22065A85FB5D72C12689E35F75E5C826423D304E4C16838DE5DE70F28FA16FCA18FE12A4B003FB332B0C9A270A0F913CE5E598A54B82F0FC42BDB33232B755A885BE51D7EC24D3EE1A3E344EA332A05D2E68531CB9903428D5E99931710841897950E5A98F25656C595ABAC805315B5479401F3C56D2F91FE33BE4C354B9ACE7EF8B1773F7C55DCFDF157F5FF00FF0038CFFF00ACE1FF0038FDFF009ADBCA9FF747B5C9ABDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88316FCCD45335EE42630C7C17891F11D862AAE55A3FB5F862AA7CC9751DB08E6A164BD4E58CD00D192493F67C71552654F1E98AA832AF6EB91290B797134C832564620D6BDB1557E551B1EBDB1542C8AC687016512BE3246C4E0656881228DBC715B5E11CEE294C56C2AD0D003D7B629B4CACC1A53B9C896D8B20B34655607B9A8CAE4DD04EA089F20DF14C63AA7153E3BE56512656AC0D9EFE1902CA2C7A01FE94CD4D89DB2B9320F44D1A22C54D36A641B43D174E882B0E4366E9902D917A259DB936C4506FD32B2E44175B598E7F677AEF95972E0CB2D2D502EE3225C90C86CA10A46DB6574E481B270E8A474ED8D360012CFAA73AF15EA71A6C0109258B03BAD3011B3202D523B609F6B314B2E04D22B3590034AD714702362B38D4D08A62BC08D92CE26864A0DC8D8E2C670D9E75E64D0627B39A4352789ED928B8A214F04F4608659A2058B96A71236EB97424C65040F9A34E89EC95C28AF1CC98CDC1CB17806B5108838E3DE800CB3C475D9216A7E5FD3A7B8B80238C31276180CD9E1C4FACFC9BA25D0B4F4DA1019539357C331E591DBE1C2F4FD1740FAEC9C12352E3AD76CC796473469D93DC796E24291B4604886A6991E2B6EC7800667E5DD3440E9F0D0786112672C6F5FB14B68E3024AD587C3B65824D13C69CA476CD41BFB6D9609B41C4A77FA1C17F6B22320208EF97E39B899A0F913F337CA4B6E2E0DBC436AD4D3E59970C8EB33E2B0F827CFDA605F55B851D76FD599B8E56E935189E113865050F8E66C0BAAC91A520A4003B66406B05554D3AFD38A6D706A1AF6C56C36D20A7738ADA14B124EF930D6D54E28754E2AEA9C55FD837FCE337FEB37FFCE3EFFE6B5F2A7FDD1ED726AF6EC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88EB5527A8EF9AF72138584000F862AB580622B8AAAAC0BC4B6D5188E6A1033851F3CB59A058A952062A876E3FD715506A74EF912BC90EDF6B2B5E254AD00A615E25367618AF129FAA5B6F0C0520ABC75207BE0648911B1236E98A11A88C314DB60126A7E8C59C135B35DC644B745925BAED95C9BE09EC0BF08C837C559C5181CACA24CA6DC7A9694F6C814C52DB7B73EBF4EF95C9987A5E876C788DBB641B4727A3E9B685DA314E832B2CE2F46B2B6263094C8172609D5AE983903E395972E0C8E1B001694C8C9C909A5A5A8AF4E9869B849363682831A6626BA2B44A7D9C69B04D42E2D12A76C8C86CCC4B74B4DA1AF4FA3304B7DA6F69684F1D8605B4CC590AD298ADA30598F4DB6ED8944B7093EA9610CB613A9515E27F5620B488BE60D5F4C486FA62ABD1F7FBF260B19063FE62F4CDA08EA2BC72624E0E58BC2354B0E572DC96A9434F9E4FC470B82CB37FCB4D05AEB534E70FC3CBA91F3C066E5E2C54FB7B4ED02D6DED144680394A1CA2537678A349BE91A6AD9CA5F852BDF2894DC8B013A36A269D98AEDDB0464D9020B26D2ECD232A4AF4CB049259A5BAC2FC435053A659C4D134E3D3B7420F2C989341451B988008879061BE4E33A71F246D83F9B7CB36BA8E997521505CA93FAB32F1C9C2CB8DF97BF9BDA0BD95D5CC623A0DC8FC336584BA6D563A7C937D66DEA91D2873658CBCEEA0520658FD26E077D81CC98F27094F0AB44818ADA8B362B6B7AE4C2BB15762AEC55FD837FCE337FEB377FCE3EFFE6B5F2A7FDD1ED726AF6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A0B7896BB6D9AEB72116C388EA3DF1B553E05BEC918DAAA51C2F1E43082A94DDF21DF25C4CAD2AA495D8E3C4B68696564D88C78D6D62B926A41380C946EAA2367351B0F7C8DB2F0D50055346618DAF86B1E30C2AA7AE36BE1A82A146F886C7A6048852696F172DE98A784A64B1AAF5EA7A62BC255982D0D06F8AF0950E209D87CF10120F0A696686A36C0436C66192DBA1DBA6552722124FEDE2240E9ED951939312AB340C29B8391E69E1B647A78ADBF1EF4C8908BA46DB5848CE1C5284E57209137A2E836CCC428A5477CACB744BD434BB378594BD083E1954A5BB7443D074EB477A11403DF21C4E5420591431716F8874DB225CA8C29378D4505075C8916DDC48BB65A374DB0ADA6C232C36A615E3A44288D054A934C5B233B509551C6C0D7232E4DC0A10C04B0D866010DE3284DED6DD956B4191B65E222429077180C93C48F8684712363913365CD21D4D084954746072226BC34F9E7CCF02C124EED4249DA9F3C98935C9E37AF34B2B829F647519306DC3C91B49ECB467D52EE2855284EE49C375CDA31E2B2FA6BC83E4C86CA38E568D79F723227239F0C74F6EB4B13EA0DA8A17A1CA897240A4E96C569F0819598B2E1255C5B46801A6E3AE08C59C2242716691BF414A78E4D914D2283E3156D97240B4C85A36508CB452464F8DA4C54EDA89255892064E32B6990A446A33A3DABC22B475A0CC9C73A699C6C3E1FFCF3F2C7A51C978C8ACA63AFC3D7B66D304DD46AB1ECFCEAF30DB98DE4923015549DBBE6DB16EF2FAB86EC2259FD56E46B502999575B3AEE02A7CC7BE4830229631A9F6C242A91563DF224D32112570141BF6C226B54B4B81E3878969776AD7256B4B4B01D8E2B4FEC23FE71977FF9C6EFF9C7C3E3F96BE53FFBA3DAE4D0F6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A889788DF6CD7539086B99B8D6871A5538666618D2A20C8C0548E98D2A0E6FDE0A8FBB1A54BC2D1E871A540DC805F7F1C6954F9704AD37E98D3387344464BAEC298D37F120A6B794B7C24E34BC48A855900E5DBC71A5E257DA62140DD37271A5E24C625E031A5E256049231A5E2452AF2071A5E25F1435AEDF4E4834CF74CAD63A1F6C816706456895207BE51272E0CAADE1A2034E994C9CA8F25EE9C8D298C4ECD80A75A5C7521299125AA4CB9221146AB4F880DF2A2562CC7CAEB59D790DAB9025CB845EC16F10E4B45DBC731E5CDC880671A58A28DB22E6E309C2A0E75A77C5CB099451A918B021116F1FC74F1C5253A48A806D8B54954A2D3F8E2D9050E0B5A78E097272A28848158F4E9984425191A0414CAC8641A6A02476CAC86C0BD245515F0C810CC1A63DADCE1629187864405E37CFDE636699A6205687A64C313BB03B7D224BFB9E012A2B97458F876F5CF2D792A38E786478A8DC7C32333B2638A8BDE749D320B481005008194B7009FC50C75D862D8023046A0785316C010F20500E29A57B324134C2A426292B066C0D642A3CAD4A62D6421C5C145624EF5DB2C816B942D0525F173C589A65F02C0E379AFE66E996FAAE8570B40CE10D3F0CD9603BBACD5637E4D7E6158C9A7DFDCC0148018FF000CDE603B3CA6B31EEF25039027DF326F7757214D85F965D171A4E2BF2C99601BE3D3A65127231A9323576E9910C64A0C8D920C56A96AD0E58155D0035AE495FD83FF00CE337FEB37FF00CE3EFF00E6B6F2A7FDD1ED72618BDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A8F54702DC7305BD2695FD57E9424E2A898542F520E2A887914A15F11D71542A9AD452A7C7154BA7942494A6F8AA5D31323020D2B8AA22180135770569B8C5944EE8E411D28B8B6A1979198A114DBAE2AAF28F4D775E55F0C556DA71E4E7895A8C551EEEA829D7C062ABA08DA46240A0C55341198D6A472F962ADC13A92CBE99153D7161229DC101A06AFD19596704DECFED57C0F4CA24E5C198DB30740A053DF2993971E4ABE8947A7DAF7195B34F74A819650FD457A64496B3CD99C712CF2569C41A6C72B25B718671A0D9849148A139025CD84767AD58C01D5052847539496E8C7765768521A2952D4F0C0E66308812564340684EC3172404CE1734AF86282138B70052A7AEF4C5849368D948F0F6C5AA4B1C507DADB16D8286E7BF4380B9314744D4ED98A42551989208046F9590C8284C5BEEC810D810AEEDC0F6C8109972633AD4B5B765A9269D7234E3C4BCC24D39EE5DAA6B53D31AA72602D3FF2DE80AB74ACEA0EF5A530F139508BD86DECA389A3E294A0C04B394682747E08C7C3906B015ADA60E7885208DEB8B301184D462CC0404A18EDCA9E18B346D8802B5607160423FD440C7DB162434F32018B59096CD729E1B6374988492EAED549A0CB2326528B1CD465FADA3C4DF65D78D0E6CB049D5EAA2FCECFCE9D1E2B4D6AE233462E49047BD3377824F2BAB86EF96678C452C89D402733E06DD0E6145439004ED991170A4B8508AD29932C03741E19449C8C6DF25029C77C8863258789FD9C218A1D901AD053BE5A154591BB1A6495FD84FF00CE32FF00EB377FCE3E57AFFCAB5F29FF00DD1ED72618BDBF15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF89F0E3D33BE6370B90957306400773B63C2A893C9057A531A5414B39AF107738D2A6360038353D31E154BB508584E08FB23BE34A81F41BAF8634ADD1B74AFBE3C2A0A32D41F9E0E14F1353B32CAA4277A63C2BC49B7C0D082CBBE3C2BC484A537514C785789A1148F22D477C78578995C16E91C4848DC8EB8F0AF122B8464531E15E2524B74120A0EB919041DD3B55548C6525BA2BAD1AAF41E3BE5127320CD6CD78C60D329939514DA35E681B8D77CA645927FA70008DBE79592C3AB2FB280C8E1E9B1E99025CAC4377A3E8500E6A4FD39592EC71C5EA7A75B5694E990655453A11716DB172F105648A86A7BE2E5008C8F614C58108849CD7AF4C5A64994539D8E2D5269AE0B122BF2C5B20A911248AF42712E5453D8A9435CA2412BCD011E195C83243CCCBE34AE564360404C418A403C36C8D32E618B5E219BE06DFC31A6B1043DBE9C88EAC57E795C9BE019569D6D142438503DF2A2E4C4D0653115722831059C8D84C245063E98B00142301771D7BE2CC05766DB16C010ACA64AD0D08C595226D548A8AE2C486D890C77C5AC8519588077C2C084B26734EB954CA46C92DC826BBED8C249914B48F8C0FA7365824EAB54762F867F3DA0FF738E69DBFA66EF049E5B56777C797AA05CCBB53739B5C6E833F34BD97AE65479B8325C3651932C02ECA24E441AA0C88632688184315608BC47CB2D0AA4C8BE1D724AFEBEFFE719F6FF9C70FF9C7E1E1F96DE54FFBA3DAE4C317B6E2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88C69196127AED9570B9096DAC8649D09D80618F0AB26963050B571E15484A8697C287070AA610308CD41AF88C3C2ADCF2ACBFB1F11C78556B47C63E5C7B74C78552891B91200E27C7052A6FA64609DCD70213292D95E4A70A537AE0295CF6C586DB64789544DBB12AA13EC9DCF8E08CAD53386D49A129C6992B545CC68AA03538F6F1C6D54EDCB4A695C6D5368AD893CB9F4ED913BA2DB9A42B48C0DBC72A945BA324C34BB33248007EA6A4D328945CB8167013EAEA13EDD7BE5243951927DA622C90056D8D4E52609326436500120402BEF95CA34DB0C76F41D3AD38471ED94C8539B8F15335D2217F500029EF95172E269EA9A7A88E38EA2A69BE066237BA6E6207E2AEDE18B91134E238D3BF862DE26AF1C7CE9BF1C549B5AABF11F638B4C8A3D361F2C585371C7CBE2AD37C52364CED5796DE180B7C7226491D3F6EBF4640B3E25B27C3DEB4CAC864248095B96F5A65526D0508CFB78E479320503E887979D694ED9599B6844B5B86150DC699519338A6F6E802019592D802776D1D5280EFE3823CD289766E3403A65BC2B6A28581A15A0F1C7859892282961B1DCE3C2DA0A998985487EBD4E3C2C81B5D1A322B1E75A63C2B24BE49DCB9DBA63C2D6A4CEEFDE871E16B2859A1928183D699465145318DA477AF242A0D0B1390894CA0878F9B3A9A54115AE6C7049D4EAE3B3E30FCFBB7923D45AE78F2AEDC7EECDCE1C941E53571DDF1B6A16ACB3C8EC69CB7E3F3CDBE09ECE8B34774918D0D3C333625C1986E95EF97736B6CAD3BE5320DD02B9412064445245AF1193DF080BC2B0AB02464C15E1586363DF1B5E17F5F3FF38D029FF38E3FF38FE3C3F2DBCA9FF747B5CB03597B6E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D98A8B7639072125B39544C3E78AB27797F75F462A948156A62A88A30C554E163F584E5F67154E27E0D0D075A62AC7648CA82701546E95381285F7C8143339230D1864153DF2252A0A08201195211D0C695078D7C718F34A39A48047C76072C548AEC8E69C0D41EB8AA63A7C144E647CF154CE175AB8F7C082B1A1F524141D4E466CE2CA34AB6F488246F98F37331B2066569157282E4C59269F6CC5D4A8F848D865726639B34D32D97EB09C865322E6620F41855508551B28DB289976100C974992928A8DF2825917A04120E2A7C70B743927B6EDEA003B62D88958F93118B64516917100E2CC287A7F113E2716B3156040F9628E144C4B45DF7C578530B55EB812228A1CA83205B5425E546C8499452E7E54CA4B70429EA3C32259072FDA39410CC146A005699021B01B4CD015400E4086C0532B7978AD46301452792351CB76CBD00A2163E54DB61BE2CC145A41B74A571660AC922A0DB6C5B6254516BC875C5050BF54E4EE695C581287961E1DBA62D64A02694468478E63E50CE058FEA24BAA9032B8865296CA5C9A28E33C7AED99D846EEAB57C9F257FCE4246D0C493B2ECDDE9F2CDCE11B3CAEAB9BE25D56759642C050140299B6C01D0E61BB139012C69F4667E37026BD010287AE5E1A951BF865726C8AE465005722DA15D5D7EEC2AA9453BD3AE2AEE2BE18ABFAEAFF009C6BFF00D674FC82FF00CD71E55FFBA45AE5A39349E6F6BC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EBA9D962318514F1CA2DBD2086568E74237E4DBE36ACCE37F5223DB1B543A8E2F5EB4C6D51AC57D3E58DAA5F50581AD0D76C6D5305E4C8057E9C6D5053A108C08DBC71B5405BAFA73F20DBD712ACF6C6E8AA54A06DA943912944170E6BC403E195A15D2E022BD5474DB0412C76F2F19A4214D07B658AA96FCD8835E7E3ED8AB258A65861DE9B8E98AA5E977C653C68C09A9C5053DB39C33A92A0E426CE2CC6DD8351BA517A663CDCCC689854B5CA6F9417262F56D06C8488A37F63944CB7445A791C0F0DE2A28A8AF5CA497371067F6567249C7634A7DACC79173E316496561E8C80F224E524B221964638A281BED930D914DECE765A7C35C2CD3B81F93569D4E2D91473B6DD3166146353254D29BE285850F2229B62AAE8EE9B7018AA6768F4EA3AE2551ECCA83C72B2C908F286AED909328A11C8A74CA4B7041484006942476C052A51824824532B21368F8EB5DF61E390219829824818053B656436028F80A82141AD71884996C9BC4AAA011BE588053355AA29A52A77C5B01560CAA37C5982879248DC30AF4C59C4A0165547206F5C524A3519284FF375C5AC940DDAA052791C5812C62F1BE02C054A9E994E4512A414BC1EDD5C8A1F0C8C53C4E6712A20540420AE66E1165D76A4ECF9B3FE724B4F79FCBB1DD2C615947D91ED4CDCE10F35AA7E736A49E9BD1CD0F1155CDA61E4E833F349C0A0E43E23E199D8DD7CDD52DF115A13DB2F0D4D9A93D32B93645408F888AD37C8B6856403BB6154482B403962AA8154FED9C55FD75FFCE35FFEB3A7E417FE6B8F2AFF00DD22D72D1C9A4F37B5E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF876BBE87315C8485CF160DE06B8AB2DD364F561FA31555941018E2A88452D01F962A955584943E3B0C5538B771C77FBB156AE1D1D4A8EA70C552A02928F9E48A197589AAD3DB22528D63C72A4202EA7288287AE304B1A7959E5A7BE58A9D5BCAD12123BD3156E5D4491C4B6F8AA8C37039160D5A9C50591E9B745A5515EF909B38BD1ED5FECFB8CC79B998D3AB14E57287DF282E4C5ED7E598D43A46DE198D939B918D92DD411A5DA35075DB289173F10675A5BC7E94629BD331E45CF804DE8CCD551B786524B221388549550763DF2D8F2484DA24E00649926D6DDB16C8A3DFA62CC23ADE35E35F6C59D34235E67DF15A44FD5C374C569AF4590EDB602B4BDB91C8162A251B7ED909328A83A353AE525B8210A357A6053C9B58DC6FC71402AA0B1143B7BE408660AF5661DF2B219828BB695BD51BF6C88E6C89D936FAE84E35392620B23B5BB8E48802462D81AB89929B362D80A5227ABB0E58B3057AA826BE38A928D8CA804571604A1AEDD781DF16B258E3CF17C5191CB91A8CAE41ACC964482E3946A9B0ED8C42789A82CE732B2AA1E20666E1145C4D472795FE7CE96F2792E591A3FB009CDC610F39A97E4E6BCE5EF64A6C17E1A7CB3658DD06A39A5F08063DF3371BAF9B7407A65E393535C4572B9364541E262C48E9916D0B789185555436D8AABAAB53157F5DFF00F38D5FFACE7F903FF9AE3CABFF00748B5CB472693CDED7850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87BBB5531935DF31E9C863A543921B61ED8D2A6FA4DD324A200070AD2A7AE1A54E75173071F4C0656FB44E0A54C34F904B0716006DB61A54B2E222B72A00AA93D7052A342468952C41231A543955506452491B50F4C2020A1A83D415385871325D3E4F8B8F6E38299DA6373444E4BD7DF0708674C7EE1E4956941B1C1C20208A4BE38BF780B57E8C076502D386904501E00134E87236C8458C4B2C92CA6A00DFB640C99885A3AC80F4E466635076C788B194190E94DFBE06BDF2066CE117A759CCC4AF4D865129B9708B35F2E446F2ED44BB007F67283272A317B669F69F5495668EA76037E998F236E4420C87D2378E1CECC3F972B21CA86CCC749B3A471835AF7CA65172A136530C25187C35CAF80368926D1C2397235A9ED92029B446D328E20C37AFB6165C29A4302A01427E9C590D915C1586F5C520A362015401DF167C4E650096A9AE2BC48A85CED418AF1225959874FA3015E25AB6EFD5853293265C2E3180694EBB642526622AA2C95C7C24D72A25B4042B69D3A49CB882A0EF91E25217B5A3FECA60E363C28792D66542C62F8475A6478923642B46C3A46D8136B6349C3AF08CF23DCF4C40DD0648EB9B19446B21A863D874C953113455A7AB1A0E47638D33135D7771E9AFDADFDF1A6CE341C127AA58D7A0C04536C668E499D76FC7032E26A5BBE20107AE2C52A9EFA490F1DA98A0C6DD691722CF4E4D5D864A301269C9B328D32131373F4D4D7AD4648630A192470DBC70BCC8A0DC336E87A53333144071353C982FE6C68306B9E45BF515F552363C53C7369843CDEAA443F147CC3A4CB6DAC5F5B5C03188A4603E55CD96301D2651658DB22C5550DF2CCB8389382C415515CB9A0C5771CA6452154283414C900D814E445180AA9C6C4B71A6C3224A53058C507BE438D5FD727FCE36EDFF0038EBF9063C3F2E7CADFF00748B5CCA8F20D079BDA70A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8749E4AC447B652DE9347F131A77DB1557B6AC3386E9BE2AC8AE5C5C427F9A9B62AABA7B98D4027154C4C625607BF6C550579CA31C7BE2ABA08CC916E31415268087C5AD34B4E51B03F462D8134B97E51FD18B68415AA076901F0C05126A5B602A5464648097CC484653D32B6C4A963A927C7BE565B62B91FD30E3C4E218493CD1A4E532FCF2126507A969FBBA8F1198E5CB83D5FC9B6D5BAE9DF292E541ED92A18ADD683282E54026BA2C2EC39B0D8644B7443D0F4C8D782E5527222190C71AF31B641BC04C52104834EBD316F8A67142076F9E2C9305B72698AAB0B638AA323B7341B62C9CF6C7154C2DAD136DF154E560840F703014851692255F88019410DA95CF7766A08E601F1C810C9049AA5BC469EA8DBDF2B21B0228EAD1488C88E3938F872045325B15C4951591720C11C2E55455DD597B8C55DF5AB56EC98AAEF5ED88FD95F7184319206EAF2071C3D41926210735CC7140A43D77ED8B20C62FB52E4E141F6C5B137D2C92189E8C36C05B2298CAC1109C8B3B486F2EC28DCECB8ADB1A7D7218A5E25FA75C56D33B7F355A5BD393800E5B02C08B4DD3CFDA7A2D0381F4E49908D2D5F3FDB199B8C808E1B0AF7CBB1C9C6CF0B4A0F9D67BAB6BFB49B7826560A0FBE6CB14DD0EA30597E74FE7368325B6B97B7B04748A51C811E273638A7B3A2D462E12F9DA60F1BA07EE73371C9D76514887015A83C065D6E21E6B7204A40554FE1841D99A9C9D701296E28F7AF8E564AA37A0CAED5FD707FCE36FFEB3AFE41FFE6B9F2B7FDD22D733A1F48683CDED39243B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8739D15050D6994B7A56838C8A53A72DEB8AAACCDFBCF87C7154E2DE86024FDA036C551B6EBB6E37C551F1CA237523B763EF8AADBF40F1FA83ED1DF156ACE5E30D0D3962828D58E3937A5716B5748B7A1FB23A62D817CA6A287718B68528488CB15EF80A24AE5CB0C8C9012BBB4F877CADB12C8C1DC0CACB6C50EC84B1E58B0927DA3C6038206F5C849941EA7A38F526507AD36CC72E5C1EDFE4F83D39B95329939507AE9ACD1A2D3E119417371F2659A55BFA70F151DB225BE219469B190429D88CAA4E44427D6EAED3053F6720DE032686D01A6C698B604D52D1788A038A5328ED8F15DB6C5518966081B7CF1555312203418B2433E2ABE3623BD3155579F82925BA024E2AC5AFF5A8F81A380720437304BEBDB89598A49F09CAC8641266B8946E646FBF2B21B436BAB4F1FC21CFCF2B904AE3ADDCAF499BEF394B05875FBCA504E7E938AAD5F30DE29DE7A62A887F32DC471971354F4A610C648287CCB712CB4692B9260190C1AB4D31285AB45A818B30EB6E7753FC7B8AF6C5B1E81A7C451197A055DB0499DD35773908DB8DB22BC4F3ED56EE5A482BB0AE2BC4F2DBFBB732B166A11E18AF124536A2EE4297240E94CB20CE25080DECB25217600F8EF8934D9619058E9FA9F2462599BB1DE9928CF76899B67B67A56AB7118528294EC3336191C2C98ADE51F9ABE4D9A5D3EF649E127D0879A353BD333F164D9D06B70D17E7FDFAC4CD70B30FDF40E4474D86C7BE67E2C8F3DA914972492301EA50B77CCC8C9D613BABAEF4AE025B61BAB2004D3240ECCCB6F12D2A7224AAC0FC7E8CAC9558F3B76A7CB236AFEBAFFE71A8D7FE71CFF2049EA7F2E3CAA4FF00DC22D73610FA47B9A0F37B5E490EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87FBA8BD4048194B7B1D95BD16A1EB8AAAC3FBC353F3C553112FA6A476C553AB12255A8EF8AAF9E321AA3B74C5549AE015F4D8EF8AAC4AD76E871414E6D7B138B5A6C801E9E18B6042DC6DF3C5B52DF50A927C701449176CFEA353B646480985DD972841A74195B63152BC1C8EC0E565B62A4D4635F0C430927FA42FEF07EBC849941EA7A0445AE51BB0EB98F272E0F7DF2E22D40194C9CA83D12CB99611F5DF6CA0B9F886CCEB4D0C38AD3E8C89E4E44597E9F0FF00A415237DB2A939116530DA8F5850641BC06490460103C31649B2C6B4C551491B6D41B62A8D446A0F871569EDCD09A6E7164817B73BED8AA1243C176ED8AA4379764065AD6A08C55874D652DCEC95381B9520D0AE08355241C890C9171F961E43464A8F97F66565B0233FC191B293C7E2ED954F932E88197C9A00E998CC12CB8F2B8B78DA5E05F8761DF156297F6621AD206DBBD31563176EC6328B0B29AF5C218C90964D289B743D724C0335D3999E52A548F8716619DE89680B863D716C6573968D2918DFF6A980A4A4924C4F20FB7BE4516C475754653C37AD6B8ADBCDEE74C92791A83A9C56D42CFCB5732CDC1622E09EB4CB22764893D3347F216E924D1F1EFB8FECC848A99BD2EC7CA9630AA82AAC7AE40163C4CA6DF4AB5800E2829F2CCA84940619F99FE5A1A8F937549EDE1065F4986C3C01CCFC52D9D36BA1BBF1A35FD2CD96A5A84338E327ACDC54FF00AC7363864F27AD0C6648CC52943D466C205D213BAF4C9B978BBD156E393D0E36CA489BB4E2A3B57204A1219A52B5C892A8749F91A57A6564A1FD7F7FCE346FFF0038E3FF0038FE7C7F2DBCA9FF00747B5CD9E3FA47B9A4F37B6E4D0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88FE09E89206F986265C86217D18790FE1928CAD5640FE91DF2684C42ACA093B8C2A9DE95F01A1FB3E18AA6578547D8D81EB91B4A41229E7CB2064847C0EA29CB718612B2829FC7E888EAA37F1CBA835A26DDD016277DB225B0284E19CD17A65664DA103242114B30EBD30192D5AAE9FFDE644C9908B241CE489D4EE00E982D980C4F50B52AC59453DF06CD8024EBC91B89EF9125B238C1E6C93493FBD51DB2B914F000F5FD094ACC9C45052A731E45B601EE3E5621A401B7AE504B9B08BD5ECA14AAB22D189EB98B3951765860299FE9502D15996AD90E22DE22199E9F6D1FA9EA71F8CD2A7236DB10C9E1894B82474EF8B626B144ACE7E793114A611464B713D3C325C2153A8E3000DBA0D8E0E10AAAC0A8DBEFC7842AAB0F86BED8F085B40BF5C7842DA577708E2DC0531E15B62F3E9EF2B13C490712026D1765A5246DFDDED9512BC4C892DE355A7015A656496C125C88A29F08CAC96F8C95C01D29D72B2CEDC638DBED2D722634B4A0F676EC0D23049ED9548522987EABA7C6C5FF74BF2A0CA49626DE75A8E99C8B462314AF4A61848DEE903BD278F4708F511EF5CBEC32E109FDA69C435553E223AE3B278598E9903C34EC3BE1B09A4E652163241F88F5C8C9B211058B5DFED6FD6B9149800C6258DA4675AD47718B510A967A6C4CFF147518B512CE74AD3ECADD59961018904138AC4B2B49232B420500F9603BA69689A388D176AEFD71A452256FA9FB59206992716CF16A9A65E69B3012452C6FCA33DFE1399FA736EA759B97E31FE70E94BA6FE656B564578DAA3B3431781A939B9D3879AD6403C655A49EB34E794A5882DD36068336511B3A1C9000AA00074DB2B9158121176E55483DFBE52665CB8C6C29DF5C301B361E22A62C6E6766AF235C9B02104B38434069878583FB10FF9C653CBFE71BBFE71F1BC7F2D7CA67FEE4F6B9B087D23DCD079BDBF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8DAB09F719801BD8DDC8A4849EC77CB2294B5C736AA9CB1531B69285636FDADB0A19143FBB5AD7A60554F53D45627B602942BA77F0CA8A143D4DC01E38C0D154FE02C621E19719288A362069F3CACC9B045308E2046FF007E5664D822A7731064000E991253C2A7A7DB7EF3A64789908B2BB5B6AF30456B8F1331143EA7A627A65A831E26C1160A6CF94D41DB6C04B6C62CA746D3099936AF8E5722A43DA746D302F134DC65132CE01E9BE5C88ADC5076398F22E7630F63D1A20F22A1F1CC69F376388507A3D9C3C19401F4641B87366D610D29B6F8B6C53A4401C7862CD31B789CB123A65A392A610C3273C2AC8228C71507AD3155EF18A53BE2AD32EDFC715413AEF8AA19A307AFD38AB696D19EC36C0555BD140360065549010B22D180F7C810C8158401F3CAC86624B3991B9391E16C8C9DEB0C4C5B4168DC8405ABD3299452C72F6F1199878E6398A6AD875ECAA5C90054E400A4F0D2053E371B77C3C48643656C6B5A6D4DB1E254E12260BB63C4AB5A195C30F0C902DB89239AD253CBF56499C9237B57491B6A16C5A24995AC0C083DF16892730C8D1EC72405A225182E881D70F0B2B51376A49E477C7856D512ED36DFDB1E15B649A15D1127C3FEEC0CB4FA0E6660D9D6EAB72FCAFF00F9C90B196DBF342F66238A4AC493F7E6E74E5E73561F394A156460BF66B9B2076745946EA7FC72A996B886BD42A72AE6E643925D7331634C980892493DCFDA51DB6C980C4A56CE49D8E4C06A7F645FF38C1FFACD3FF38F1FF9ACFCA5FF00746B4CCD8F20D079BDCF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D880E040E87B66006F492FA2F88803AE5914A1C5B7186BC7E2F1CB108781585C46CDBAA9C2ACB15E3684803738154955A35663F6476C05285594BC9C6B55AF4CA8A157D052E2837C8F567109CDB3AA808D8993688A6B0C44B0A7D93DB2064D8229EFA01635A2D09CACC9B0456081581F86A720649E15D6F6AC1C7A6BC71E26422C9AC6D242D535A63C4CC4532BFD3CBC068B534C789988B036D34C731F82849C789B04597E8765C654257204B121EB9648B18400509198F32CE019C688A82652A286BB9CA497371F27B068CA81D582D0F8E5122E7E3E4CF6CCF29D2BD3C322DA39B36B4AF3F84D17B62DB14D56A5B03364368E811011BD284E5D1E4A9B200402A389F1C2A8F49102AEDBD3738AAE3221EA31543927715DBB62A82949036C550F473FB471556457A801A82BB9F6C555E458A31549BD4F639021925B35DB80CA2DD189E8DE190216D45EFA38AD889621EA53EDF7C810C4C92A4BB8DA29A46958B28F8129D72206EB19A0D2EA607D53C9D3F9299618B68CADB5ECB7069E87A71D3E2343944E0DB1C9691DD7EF83F01C58577198F28B609B1B78A560C492483F6B299C68365DA2ACEDDCC82BBE55C28675676A0AA80BF1531E154D52C588E98F0AAE5B1707A75D8E4A21B71A12EF4F2A84AAD0F8E58CE4C4E6B26939A96E2F5F84E2D1256787D2B16319E52C42AD20F018B449E6F79F9A5E52B099ACF51BD4B6B984F16151BE5916B2692D93F387C822A1B5B2BF223254BC4BED3F363F2FAE24A0D6D9B7DEB4C697899345E73F28DE11F53D5D2A7A02C31A5E2665E5DD574C9264F4F555256A428208DF2FC45C2D46EF833FE7278423F31E36DA482653507A13439B7D39741AB8BE3F6565BCB84635556345EC01CD903B3A2CA374422214625457B65536B8849677605E86832500E4C521B8B97527E3CB00625262EEECC791DCD7260312B94E4C06A7F64DFF0038C1FF00ACD3FF0038F1FF009ACFCA5FF746B4CCA8F2683CDEE7850EC55D8ABB155AE683E9C554F97B62AEE5ED8ABB97B62AEE5ED8ABB97B62AEE5ED8ABB97B62ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88BB53C866006F5971082E0D3BE5914A16E00488FCB2C42550D19E83AD76C2A98DBC844BC3DFA6054E2E29F56603BD3014A4515564CA8F3423C5C0420F7A65726DC7CD745704B8232B25C9AB6490DEA22A6E2B5CAC96C8C593433ACB1AEF9025B04535B4B70E188A1DB20649E14FAC6C55985464789970B281A7848C328C3C4D9108EB6D3DA78DAA2BB63C4CC063B71A3137205325129AA4EACB4A68DD6829824C4866305B32B2023B663C8B38B35D1A03EAA6D9492E6630F56B106109951E6E6C59D69DF100D81B073673A6FC4AA69D7BE2DB14E917E3C59A7D6B6C48461D0EF96C792A751A711BE155C57DF157703E38AB5F4E2A849BA62A82798462BBD71541B6A616B5AE2AC7F51F31D9C1192CC63A77C910D8C02F7F30F4BB763CB520A57AA93FD99590C0B179FF003C3CB167270BABC593DABFD99590D04A47A97FCE48793ED2A91852C47C27DFEEC111BB59953CAB56FF009CAA82DEE78DAC21A3AD1401FD99710C2390DA5F27FCE4A6BFA821FA8D89E0C09E407F665120DF1C858D45FF00391BAEDAFAED776C556BDC7F6663C839519BE91FC9EF3EBFE61426231805D4B961ED954837C256FA2AC7437AA9E3F4655C0DCC9EDB4C78CD48C3C0A9DC160481515C1C2AACFA79A834EF8914DD8D0379A79E1F7E06526177962A03963C585787BE2D1248D61963B1D453ABCB1B08FE74DB16893F32BF313F293CFDA8F9AB50BE8209A5B79A4668F8F402A7DF32314801C9A64C462FCACF385B6D73A4CF2D3BF13FD725B215D7F2EBCDF34CB1D9E893C751BB713D7EFC7657A0F977F243F30A7991E4967B343BD09A7F1C695F5FFE597E526B1A5DBC6DA96A0F34CAF5662D5D89E9D7251E6D1946CF1DFF009CCDF253680DA3EB11356474EBDFA1CDAE9CBA0D587E7F593C9373965D9DBAD73640ECE8B28DD16A7E07F1ED954DAE218BDCDC0124895E8694CBB1F26F88D9239EAE4E5A031921F8D065803595226876EB9301ADFD94FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A0F37BA6143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8294F845330037B52D4B29AF7CB2294AAF6BB8CB152D8D5830A547CB0B13C930854870DBD7C72122C2253953585ABBE54496C4A1BFBC6F9E441552641238567283AD7F86322299E306D98F967CADABF98AEE2B5B3B62C8C69EA01DB31CC9D8E385BEDAF227FCE2EC17515B5D6B32155900A293FB5BFBE5129B9F8F102F43D57FE716EDA2B988E9CF5403EC76FF89663CA65BBC10F25F35FE476B9E5FB932C687D193E1555ED4FA72066C7C10F3E5D0750B0B8F4E5571C4D0D7009A462A6616D632491014AF11BE59C4CFC20BCD9DC4428B551ED931309F0D012DB49CD59C50F8E094BB94C02636B1134F1C8711699C53368A452A791E9B60B6BA65DA0C94750C706CE442DEA763229E15DF289F3765879334D35C55476F0C8B7B3EB023E103618AA7D18AB0DB02DB27B16F8554F6197479330980DDC006A3C30A551862AAB18046E31545718986C82B4C585A57716ACD5E228322B691CDA75D716F8493BD32B2516F3FD674BD4DCBA4523A73040A1E99124A5E3BAE7E4DF9C35F467835BBB8977AAABD3F8E4F88A402F1CD4BFE71BFCE6F3D06AD732B576ABF5F9EF82D9D16357DFF38C5E757A97919DFF0098FF00B78B218D8A5C7FCE3179D43F22BCCAF4AFFB78F2639310E1427FD0B379CC48ACF6EBB1EE3FB720723891C459FF00973F203CD715C436F39F4A0604391B536F9E4253722185E97A27FCE37581BC59757B812AF2ABC2C6A0EFE15CA8CDCA8627D4BE51F22F97BCA10C49A3D9C5048ABC4B462808EFDF2A9CB67271E3A2F52B68AA828287C72102DE629D5BD9B4AA07877CB835909BC569E9815CAE4C0AAB428C0D08F837CA81B402424B733060D18415E95C2DC0B0ED474F6A973B835A0F0C5B0C424F1C216A196B4C5A6710105736314EDCC205E1B103BE0B21C59C2F9249756B69103CE352464F88B5F865298A6B78A5A450278D699602BE19661653F35154070DAF8659369F7D0DA144745FF4821547BE46CDACA1B6EC37FE7263C99179DFF2D64586D926BCB088C826A55C0E2C7AD7365A693A4D5C03F119A136BA9CF6922F131C8D191EEA48FE19B8C727439318B5194888DD21D890787B6DDB26402B080616EB44AB6EE6BC98F5C9844A21047ED1CB034C821DBBFD3930D12438DC9AE58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4F37B9E143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B535CC00DEAF28EF9645528BA1C8E58AA10C60B8AE2A5181789C045B590982FF7669E191314829431FDE36532D9BE22D52D2C9F52BE82D233467351F466365C941CCC18ACBF49BF21FC950E9D6105EDCDB2BD003C88F9E611CAEDB1617D71FE2ED0B4B8E21385E286813C0E512C8EC71E057B7FCCAD0EF6EE386270A76037CA2591BCE165F7369A4EAD6CF2CC527122FC209AD32BF111E03C475DFCB0B2D424966B78946E69B63E22F80F329BF2DEE609654856A17ED532D195071525571E49BB86BCD0ED93191071A437BE567442CEB4206DB6113B6AC90628BA7345395F7E98789C5945329ADB8462BD69D71B6BE156D224E33818F137462F48B49887515EC32B917618850679A4C84B2FBE06D7A3E9CDBAD76C5594DB8E4C3154E6D5C89197C32D1C9984DE13571852886FE38AAAC7D3154C228BBF638A6959A21DC74C82D21999882380CAD692C9ECFD53BA0A9DABE1919288EEE8ADE6B65F4924EA29838DC8F0D092DACA8793C8013D1BC31E36631A5773F003CAF01FA4E3C4D831B1E96F2047DEE86DEE72139ECCBC2B496EF568492A9722A7E798A7228D3282B5C489EAC373561D1413959C8DD1D3A274EB7964B80D2C859ABB2E40E46E1829E8D6914CC1226B6E117FBF48C8F1DB2963A65B6D6E11176AED96C0B5109D4238A82075CBAD810ACFCB8E5732D6425CED22568763D72B896043A38A39012454F8E49B6297DC5AF21257A0FB38B7249FA3958B6DF4E2D3916C1A423ACBCBB1DB22538B1F131ED53CBE8FCA87AE20B6F82C364D0258A60231C93A93938C97C047C505C5BAF43B6596BE026B6B0C976D645BED452127E583AB899B1D3D3AD2DC6ABA76B1A6CC39ACF6C63507DD48FE399D84D3A3D5C2DF87DF9F7E50FF0003F9EB50B20BC6970CF4A7F3B31CDB6296CE872E3A2F1CD4855D641FB4BBE650DDC7E4C4AE362C3C32C6322969FB67241A64876EFF004E581C7921C753963497F655FF0038BFFF00ACD1FF0038EFFF009ACBCA5FF746B4CBC72692F73C28762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B360BD730037A3E4A1E9DB2C8A529BB42C76CB10A50AF165A8A625211B55C622D8494E52786C77A8C998ECD60EE83BCF8AE9388A506F4CC2CFB39F845BD1FF2CB493A96BD68047CB8CAA6B4ED5CD5E59DBB7D3E3DDFA93A3D8B69DA6DABA0F4D1211555D8663176D8A2F2BD72D751D7353962B3321084B1504D32893B1C71D952DBCBBABE9EA26657046F5EF98F26FE009EE8DE78D5B41BD1CCC9344D45911892001DE99595107B868DE79D1B5B31AC92FA5310014069BE36930658D6A8E1DD40E128F81BC72C69945299F4A421AAA0D7C46581A0B0DD574359012117A1ED9312A6A9C5E51A9E83C2524201BF618789C69C58F5D69DC410476C789AB85274B5E126DF0D0F518F137C22CBB4752028356DFA9C376E5C0507A4E974053B7F98C2C9E83A6CA15803DA98AB288E7008A62A9AC2E480C3BF5CB63C998E49A42E69D4E14A395BA62AACADEFB62A9BDA5D536206D8B35F7373CA945A5720B4840ACDD09CACAD221232BD6BF3C84CA62375D2AF53D0E637139A12B9622FF0D49E5B6F8789B404A2EB492CA69DB071338B1A9BCBCCEE47106BED919CB66D88DD47FC2E3FDF43EECC4B6F115787CB8D1C8A40200ED902590A661A6E841543155A8F6CA8A788271E97A478D6A3C3082899B08E801D854E5F02E3109AA82A0153990C4869A471EF954CB590A2D2B32B0200C840DB54C25A4B89050903C32D6714C963F5A3DCD0A8DB16E4B64B295492010B5C5A72289825D8455A7ED655334DDA734BBEA32CA28687E782DC9E2583494460B201C9B71F2CB014F10448D060906EA3EEC9028E25F1796914F258FE9196C5C4CC2D36B6B45B53B2B03DC8EF97E39EEE9F518DF9A7FF0039C1E5223518FCCD15B8F4EE295217F9797539B2C32743A8C6FCE1BE9B8832EE55968066CF13AB9ECC50124B549CB4B594249D4E48354940F4CB038F2511D4E58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88089A86B9801BD338CD40F1CB22969E30C32C420D8713B6291CD6D4E4A00B1C8B58D46E69979AA681CD40FC7331F019ABD4BB4D353E9EFF009C74D21751D692A952B535A78669C9DDDDE101FA397F6CB6DA3D360563A01DF2120ECB0B7F96FE5B8F503777862ABD08AB0EDBF88CA661D96309BF99F4A3043246918E9D8663C8373C0752D0F50796436F096321A37C35DBEECAE99458DCB65AAF96E48EF4A4B50C0D02B78FCB101127D05E48F375D6BB6612E418CDA850BCB626B4F1CB0071E6CFEE66658C7BE594E34C149A525D1AA3AE46450030AD4EC83B31A6F91DDAA51613A958D0F4A6DD71DDA845864B6A56423EFC6CB7C629EE92854283D6B9747937067DA79A32E4959BE9FBB8FA31564A83718153C85A8A9F2DB2D076660A6B136DBE1B4A354EC3F1C2AAEA4D3154742E148AF862DC119556C8324C6DE256A74DB2B28559630B95CF92421D979661B900A87A7BF4C0CE25B30F2ED8B60696C4160481B74C05B224DAAFD487F2D7E8CACC5B812EFA90F0032042D9575FDD0E23E9CAC861C454DE124FA9D7DB214CA3225673F4CF4CB62C885C353111AB6E3A65CD65506A91C9DB2120C0B6F771D36DABD7238F9B44D0E675AD69972628BB797D571C7609D716F64B58A587871DE98B4CC162B7F21D31F8769872194E45C7612F87519A46A274F6C886EE229B44E646066D9874F96482F116416C22E23A64D788A756F2AAC4151030AF5CC989D98917BAA344D37488610E0E78BE6AFF009C9CFCBF4F347E5EEA73BC5FBCD3E2661B54FD963E199D824E83541F83FAA5A1856F216D9ADA5650A7AECC7B66EB09D9D0E6D8B0FEA58E5E5AC1D9072F7DF2516B9287ECF5ED96071E4A2A773963490FECABFE717FFF0059A3FE71DFFF00359794BFEE8D69978E4D279BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EB35F7CC572138A74DB2415A634196054B67900E44E487355B1CE38D2B96EC8282B9AB74F1CA665880A912F22CBDE99ABCE5CCC5B3EEAFF9C4EB113DD988815E25AB4DF6CD69767A626DF647999435D5A5BAB1D880403FC32B93BDD3F37B97962CD6D34832280ACD0EF414CA245DC621B30AD5A77B849A302A6A77CA2459494B4AD209812478C115DC951FD32316A1CD3AD5F49D15B4D91DCC3EAAA134655EB4F964993E64BFF300D235631DB30085C8F82806C7DB1453D5F45D7E4D52D54D6A683F56147084DE0BB3C9C4B4DB619645A728A49EE7799DFB1E992A68A627A944199EBD4EF8D2D30A9AD944BF3C6928AB440B28A61566BA79A30C559A58BFC43E8AE2A9F46FF10C55388EE00551E191BDD04A3A3BAA8EB8414A363B91B6FF003CB1B02312E47CE993661328DEB43E3DB16E099C4E38FF000C82A2606A656528D2A5C0A75C84D5BF4CE6310DA1A2877C890DB169537E99590E405754DC572239B656C98C511A74AE4E419C10D7111A1F7CA64E4001085780DFE9CC793090097CD7263A953F17860873681CD26B8D4E58EB5A6F97AC92A7BD9A405877E9938B4C9AB7BC9D09CB29A095433DDC8E4AD7010D68F82EEE0515D6BEF819C5368272159E9C69DF16F82223F307A4425457A62DD1016DF39D5F871FB4A28299092C804A6386EB4B928C84A9EE722C53D86EA3640CFF0068E2A98DBCF0D462A9EC13D221C3ECD76CCBC5C94A6B67744115CB1C2CE16F9AB4B1E63F2E6A1A4900FD7A090014FF00248CC9C45D06AE0FE76FF3A3CA4FE54FCC6D7347652AA9348C05283AB1F6CD96293CFE68EEF03BA6FDE483A10732E25A2B648E7152773BE5C1C69F35315000AE6445A96E5A036C407F661FF38BBFFACCFF00F38EDFF9AC7CA3FF00746B4CB43833FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B31D2B98AE426E47C3920A8694EDB6F9605482ED982BD01AF864952E86670D435F961B414D50730396D909A0370370B8907B7539AECCE5637DD7FF388F76A359642E05617A0AF7CD74C53B4D3737DAD359B5DEB30730410C280E63C9DEE9F9BD5EE3513A558B2745F4F8E5327718B9304B6D4629D679188EA69BE63C99496DDF9DEDB46B231B952D355547707C72316A1CDE15E63F38EA77F2C896933047A8A2939364C22DF48D42E6669E7E72173553D7157A56853DCE9A1622080682A715672D70DE9A3AB862FB900D72D838F991729E56E186EC7A81D726D2905FC25CA9FF277C558B5CDA9049A6D8AA95AA71931565567B32EF8AB2BB37A11BEDDCE2A9E46FF0010A9C55358CD40DF21D58946C792641191E58D811B1D6993661368998003C316F4D6273415E990423918D4532B294EED8065DF6F0C849513C465242789A2828720437464B553C7AE4087263255A002B4E9910376CB454520E3D69ED864DD0536219C0EA3C7289736F082BB1C50D3AF8E63C98C986DE4AC3950EE0E087368EAC3758BA99281493F2CBD125897130B346FDA66A11938B4C9111C92B15A6FEC32C0E396596B6D298D0AA924F51896B45C92C36A959402E3AAF7C8B6458E5FF99A0A18E21E9F0AF3AED8B7C5875C7984090BF30057662716F8A79A379A8C328726A95EBDB2052433C9FCC16DA94694515EE46458F0B514913505413E0315E14EED0C408E5F0FCF6C53C29D2CD1A2715229D46F97E33B302AD6F78A1BA81F4E4F89AA70B09B5AEA9CAE91030658C153FECB327149D36AF13F22FF00E7387C9B168FE686F3446800BE6259C0DAA6BDF3618E4F37A8C745F9A7786B7136D4F8B3638DD7C85256E09ED9787167CD408A66445A9665A1BA2FECC3FE7177FF00599FFE71DBFF00358F947FEE8D6996B813FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B33D37AE62B909B337C24788C2150E57E1396854A665FDE0C4AA4F29A4D5F7C802828E0F545DFC36C24A02E97EDB53C33132072B13EABFF009C5AD5E3B7F345BC6ED40411BF8D735F986CED34BCDFA88F12B6A36578375E20D730A4EF74FCD11E719DCE8F2CD16E6BC49CA64EE317278326AB710C14E5BF2E998F26526317AF79AA5F3210480A29918F36A1CD97683E45BBB86599E33C4D0D48C9B27A641E5FB0D360637340C47C18AB1BBFB6B494B7A43A74C550FA4A869DA222841A0CB60E3E6667058D09A8EBBE4DA503358061257F9B154A27D257D36FE98AA4034E546229DFAE2A9D5B5B22815C5536854290A3A0A62A9E47D302A2524A151E191EAC4A670CC7EFC90649847374CB1B022D26AE4D984E6396A06FB5316F098C6D5A64109A44C2A32B294D216A50D76AE4648298FAAA76C890805BE55CAC86D896F9656439112E26A322DD12A65C0EFF003C8C9C9C6D7D657A65126F086BA9818CF8E63C98C983EA32F10EC3C7A6087368EAC1AF2F19A4A7865E8936B7C562A1DF261A648ED37518849CA4DA996071E48ED7BF31F4AF2D69F25D4AEA0A834AFB62583E6AD6FF00E7226C2732CF030660C40A1FECC8B38A3BCB7E7A8FCCF6F73717527A224A7A5BD2B8B7C53237D1CC5E2AF348F7AE2DF1627A87E63C76529B0869198F6A0EF902D8032DF2B79D6FEEDC0E478B7BE4534F6FD0F5096499096DCE2B4F4225E5E1F175C5691261936A4DC76E95C9034D13E6EF425FF968FC71E26C10B08CB698D9D02B739240791AE64E29381AAC3B3E3CFF009CDAD163D5FF002CA3BF02B25A30634EBB54E6C71CDE57578F77E2BCF2195DE43FB44FE1B66DB0F27479051428EA3E79921C39A1E41B9F9E6445A90A577CB83745FD98FF00CE2EFF00EB337FCE3B7FE6B1F28FFDD1AD32C7027F51F7BDD7162EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87DB371502A2B98B4DF69C13D01C90554E3B7D19312094A275F8FF005609482B1EB8DA6F964225055E3625900049F0C9A014D110167327C238EC4FCB31F240B938E41EA3F935A8FE8AF31DB4AB2846332802BD413D7303340D3B3D2C85BF5FF4FBEFAC6876376AC1C7A43E319AF90A77DA722D34B906FF00CB573DDC3120663C8BB9C4367CFB35ACCF70B0202CDCF751D466392999A7A8E81E5AB7F53D69286408A48F0C62D319025EA16D3456B0085221D280E499DA4B7BA7C9A99268691EF418DA5E5DE60BA83439191E550D5FB24EF82D52DD0754FAE6A30B28E20FE396C0868CA1EC8564540C632011B31193B684ADC1624914DF738ADA94F1A985A8C09A614816C6CDB92C4D3BE282295046CBD01C55150EC77FC7154F22208EB8AAB2005AB9162533840A75C21923E351B64DB0146C69B64EC3208A89CF2A5698DB784EA17D86F90B54D616AD28722529AC6F414272242AA2CC01153898B0E0368F4DC546FF002C818B6C415F46F7CACC4B9116B953A9A7CF20634D91284B89000486195483978C84A4DC7C62AD4F7CA241C805B966AA1DFB65120C64C33569F843235413D86463CDA3917973DEF2BA615AEFD32FB6264159AF9A12ECC85815D864E2D5229249E6048924DC230AD01EB9686821F337E6C6A3ADEBF6F1D8D8A4A07A8DCD97B838086145E59E5AFCABD62E21ADDBBAF26E546FA0F8E459C43E91F2CF96E2D234B68AE18C92C207A2ABB9F7C69BA3B2AEA725EDB594AF65138918100537C5B8178FE9DE5BD66FF547BABE57ABBD547B64241B4483E92F2CE8A6CE18A886A06E70527883D934189F9AB73E86871A5E20F4069278F8904D3C7052F105C6ED89AB392DED80DB44B9B5F5BFF29B23BB91090554BE113C4C5AAA55AB5EDF3CC9C4D3A88D8D9E47F9E9A41F30FE5579801AC92C51B32C23AD02935A66C71BCAEB31905F8377711867B8848A18A46047FB239BAC3F4BCCE7152418076DBBE65C5C19858EBB9DB2F8B4A1580CB04806E8BFB2CFF9C5EFFD667FF9C76FFCD63E51FF00BA35A65A393813FA8FBDEE9858BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF874B265328CA593246507853C72259C513C07139596D0935D28562721D5279311BC929375CBA1C9A24BE0B90268E872F8F26013B9650F1EE72126FC68DD12FDAC351B5B98DB8B472015F6CC2CE36761A73BBF5CBF267CCA9AFF966D6D24903148C0A66AB287A1D2C9EF3A5AA3C9FA30AF10FBD735D91E8714B6615AEF96C695E6084C43E0998548F7CA29A739B7B3E89E598CC6B3247EA19D0034DE996403878B9B2EFF095959C5F5ABB70AA054A9C910E482F39F3AF9B340D26C192C028B85560E57B900D32B21982F8EB53D425F345F4CD2A91463C09F9E565B014C740B2D46CEEC39AF18D870F964E0C66FA4B4DB8379651ACB27C400D8E5B17166956A21E262886AA456B9634F54B2332383B6581C8835E9301B8DF0144D690475C0C694FF6CE2B48F85C01F2C569188D520D698AD2650B50628A4D633D314D23636DBE58A8B6D1C73A62E60E49A44FD37EF8A53BB6906D8AA64241B6298F36CB0241CB9C9149B5ACC1471AD2BB656BB2600823AE40ADA1A7038B37865534DA493C828731CB740A4B3C94AD3AE51272E054DAE1BD322BDB2892C8B17BEFDE73E7D32B71E658826968D7264A7535C21A2D327D2BD40401D475CC88AA42FE528A69099146F99015747E43B157E7243EA03D0787E38C92194DAF9574C8900FAA8DBDB20C9CFE5AD3CCA812D40F1DB154F57C91A75C45536C3953C3FB714A4375F9736C2559628F804EBFE75C8948445AF97520223A74C0A9FDBE962CF7036AD4E2A9DA32BC746C550727A49B03912CFA2025B845DAA3DB20D40EE827B9574702868466463E4E55EC93F9C6E3D6F27F986253F11B4947FC21CD962745AE2377E0879810C7ADEAA87AACEFFF001239B6C3C9E3B55F594A17F8E67637026B24077FD796171D02EBBE5526E0FECABFE717BFF599FF00E71DBFF358F947FEE8D6999D0FA47B9D7E4FA8FBDEE99260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF861D3DE432034DBC72964CB565278537DF2259C51C6600152C2BE19516D093DDB13CBDF23D5279308D403ACA3623C32E8726892193D65742548F039911E4C03258F9B415E276CAE4DF8D49039755A94A1AD7E5989945873B0BEE7FF9C71F39AD95CC3652DE0EC3893F3CD7658BBAD34E8BF49F4D9C4C12F512944AAC9E39AEC90779872A6B75045AA442EA420CF17D95EFB653C2CF24AD9FF94B596B3B6953D1FAC49C6853BA8F1C9014D111458679F7CD173E94886630F20691FDF890DC0BE62BB6B9D42E984E8E6366F858F7A9C810CC1645A779360216644E04EF9510CC1640DA298978C49CDA9BD30C42C98F1D46F6C2F56DDB946A4F4CB22E3CDE84B492C83BB0666DF2D69EA81876276DB261C88372321620900D3A602C8A0E414DFB604521F73B8FBF15A5652C3A0C5691F1F2A2FEBC56933849A5295C569348C9D85715A46AB506FF004E290162960DD3E9C5BC724C627A002B4F1C529DDB38DA8698AA6AA4F615C5239ABA1EE72E6DB541280CA396F5DB2056D324B903E127E2CAD6D7CF23189FC29D72A9A82C7AE255E81B7F0CC72DF0293DC39505A9D3289B95028069DE9D0D3C7289A494AAE999D08A6F5DF2B699157B5B55600D37C21A93AB6B3ABD38D76DF3222AAB3D8AEC547CF3202A360B3429B10580F881C64C8223EAE9F6792FCB20C913069A240EC08057ECE2AEE735BBF02E062A8EE64C4C18862DD32254242E8166AB0A6F812A978C161AFE38AA412DD98E062AD52062AC4DB54B862C0D46E72126CE88492FE43B16A6443472288B5B8E714A7957A664636F32F4A035894C9A16BEA4D57EAD257FE04E6CB13A0D74DF86DE6D503CCFAE85DC0B96A7DE736D8793C9EA0DC98F053E199D8DC19B9CAD3AEF96171D06E2A76CAA4DC1FD92FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD333A1F48F73AFC9F51F7BDCF24C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85DD35C96DF2964CB6023E1F9E44B20BA47FDE1DFBE5526E081BC7A2935E8323D527930FD45CB4887BE5D0E4D1253673CE1073223C9806516854C237CAE4DF8D12618E343336FDB31E4E66366BE45D767D175482E623455606BF7E61E58BB1C137EB17E5579EA1D734AB485E60D23280457E7EF9ADC917738723DF2D678ECAE638E75062946C7B6F94F0B9B1DD1535D496978CF6BF0C53281B63C283B21750D223D6007B800D7C7224282803E4ED387A4428AAE4086C05192E8F15BC5C621B814C810CC1632F697AB3858A22EA7A90322366576C7353F2BDE5CDCA4E632287241A26C820B0921B658DF7232D691CD4A5B431C6C476C9872209210DC8961BE02D94A72313B605E15200814C5695D6BBE2B48D4278A8F6C578531B76E9B62BC29B420938AD261E9B1FA714D2F119FA462D815D63DE98A53680D0818AA6F149414EB8AAE6980D89CB99F12D5605948EC6B5CACAF12A7D6292EE77C815E245CD755888F11954D416352CE7D43ED98E5BA086B89B92F1F1CA66E5C4A5D24C146E731E4A4A57713165F8776AE56D5229B69DCDA95C218B2AB5421AA4F514CC88AA37EAE5F71D33202A8C917A2373C6BB63264103FBB06A64A78E4192610DD451A37192BE3BE2A96DC319E4E4B21A0C551714AF1B202D514C894847CBE93A87D8918158F6AB72681074A74C55894D73C636538AB16B9999559972326D1F4A4C2EE477A1AD322E393BA716F70638580EAC4664636523B286BB2341E5FD79D8F10D6B21DFFD439B1C4F39AF93F11BCC8E24F30EB0E0D435C3107E939B5C3C9E6729B293667637126A2CB5AE5A5C7502BBE5526E0FEC8BFE7183FF0059A7FE71E3FF00359794BFEE8D6999D0FA47B9D7E4FA8FBDEE79260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85EB109D5771E394B24EE19497451D3950E44B208D724C840F1CAA4DC1037B50A4378647AA4F263B7B18AC6C72E872689206EC51A2653D32F8F26B08F82E48A440FEF295E39093918D3FB23F595759AA225EA7FCAED94172E299412FD5A2223FB75F8328C9172B1CA9F48FE507E663685756D0DE5D985C90B1A13B577F7CD7648D3B4C3983F4F342F325A6BDA35B5C3DC235D7006300824FE398C767698B202C860D46692358E54A18B704E0B05BA62D35B6BD77DBA0C890C63128A79D8107964086D102AC932B00246DBB9C898ADD2296EE2B643E8C425E5BB31ED95914CE3BA167D4A2991B946108F6C431940B13BCBC049111AD32624D3E19B4ABEB13382AC2993130DD114974E3892186F8DDB6092041DCD46D8AF12E6EA4D36F1C57897091456A715E2565993615C578C2656CEA69EF8AF104EEDA4407738A6C27B132151BE295540189A62CD1023351B7D38AA24232D0914C55148DD29D31559373AEC32DB544DB9A0F8BE9C812869C7C7C874F1CAC94B6F229000395CCDA84AA68DB996A6DDCE63B7C36414CE95A577CA66E540A45792D09DEA331E6C88B41C2FCE4006E7C32B6B9448DD9259C81283A64C45AF8939FAD3715E0475DF2E0BC4135B7BD2A9566CBC49788295C6A1137DA3CA9D4612CE26D8F5F6A9044A5AAAB4DF761FD723C2CE982EA5E7AB3B105566524D796E36FC71E15A63C9F9AB6B1D47A8A5BE63FAE34B4A4DF9AE92238128592BFBB507AFE39190544695F99324B308EE25A027615FEDC8D26DE956DA8C1A8C0662D56E831A5B63BA93FC7C23A927B531A543456723C3FBD4A313F86464D8262A90ADA70462426F91693024ECB5ADCAA0929448D8733E19763906194F0879FFE736BA343F26EA571EA7A69776AE96EDFCCC54803EFCD86298797D76404BF1AE617524D2CB74BC6791D9A415AFED1CDBE290AD9D1CE24EEA7C18F419990C81C498A5AE8C06E2872EE305C7A52E058ECB5CACEEDC1FD8DFF00CE308A7FCE35FF00CE3C8F0FCB3F290FFB935AE67C3E91EE75D93EA3EF7B964983B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BD3BEC652C938B6FEF53FD6C89641399500ABE5526E090DF3B32B11D40C8F549E4C7AFDE4E31FE397439344905217668C78E644793584C2C406BA27F9475CAE4E4637A6796B49FAFD95DBA0E455AB94D5B951E4C7EF266B5BC6B775A50D304A2CC4D7C26EBD7496194C7E97C48D5EF985931B918B23EA0FCA5FCDFD5B48BEB6B6D4EF19AD9481F131A537F139833C4EDB06601FA51E59F3FF9775DB2B764950C8CA3910457F5E53C1C2EC6192DE8D0C7672422789AA08AED91B72E050F34C84A88C74FB59025BC6ED2C8DF3F0C899354A289496A8CBD2BDB21236CF0C50922D011E390A6E314BA4B22416A634D44255246633BF638D3021033905B7F0E996C5ACA0682B5C92AC734247E18AA8337BFCF1572B74FD78B594CEDA6A0A62D914EADE652462CC325B6605462D89B4282A3BD71668EE031558ED8AB68DD3C3155772A77C9AD2989950100E56534A46707A9C84969A1254D474CA8A40DD648F5539516D8A4B350354E5126F821258048390DC0CA26DF14B638945C71E5C4D3AE463CD728B8A6358E05E4641B75DF2C70F850ADAC5B16E0660BC4D6B5C9C53C0D4FE71D2ACA2224B95A8F7FEDCB578581EB3F9B1A3DAC4FC640C4D42D3C7EFC945B2029F38F9ABF379DE597D19DD63A9E95FEB926C7906A1F99CD71EA52E9AABD4127FAE2AC557F301DE46ADD356BE3FDB8AA656BE75BD915E4B79CB2A1A36FDFEFC8C9059D7947CED24B7F18BB6661C803D7FAE455F61F973CE960B68891EE0EED5F1C559347E6182E6752B106A9C55939B95940658F8823A64486A3CD0CEF5AFC19590E4C64A2FE9B2FA4C2866EDF2C9C22E0EAA5B3E40FF9CA7F308B7D046911BFC71A9F86BF3CCEC71793D61DDF9A864E681D8FC4D527375861E975929521B91AEDE399020E26492E33A13C5B7236CB40A68B4D2CE28A4EAB9600DA0BFB03FF009C6A017FE71CBF2000E83F2DFCAA07FDC22D73363C83AFC9F51F7BDB324C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85CD3C715A1EB94B24E228DC303B75A8C896514F44323C058D3EFCA8B70499EDCB24B5A647AA4F2492F638CAAFF91F6B2E87268925A5E07F8D2B48F63F4E6447935854B3E4B73327ED15247DD95C9C8C6FA0BF26AC66D5D2F6D22512486A287A6541C8E8C6FCFDA1A586A5710950B75093EA0ED936B32A79F192E1220A4D2A39291954A1698CD562D4A485158BB2C8A762329389CFC59DEF9E40FCD2BDD0960334F2B46E42F52694FA7313538A83B3D36A1F767917F3C6C350B782092EC06A00431A78660183B5C595F44693E60D3F558D7D39939103BF8E53214E7C260B295B66E21832303D286B94CB666775DE8488EA781A1F6C31DD944D35246EC6A23603B922992A64648A11A98B8820B569418D06B24062FABC2D683D4996887A531A6B25884B751B92C84D0F8E16050F57FB5514C285BEA57BEF8AA9B9F7F962AEE42837C5ACA2612716C8A3A17756152298B30CB2CE71C455B16C64115C28A55A9418B3470B943D0E2AE3206E877C55B57A0F7C5548CFC07C677C9B6D20649CB37C26801CACAAAC659B71D32125562DC76AEE72A2AB7983515DF2A2CA2955F3D15941F88D29944B937C1A8A4021F8CEF4CA26DF1631A9DD7A3C9D1A86B4C8C39B29724A9EEE49E3203354E58D54C4758B3D4562F5226DCB5363BE4E2B4C2A5D0754BE722494F1EF56396AD05A7C8B6654FD61CBB1EC7A64A2B4935E7E5C79767564907C4C3C324AC0F51FC93D2262CF6E7883526BB62A935B7E45D8FA9B9A927AE2ACCB4AFC83B510CCFEA705E42A323241677A0FE53E83A5C81A62A597C722AF51B0F2BE90CEA96BB1514A2F4C55153583E99708A895DF638AB2386FDFD3459051FC3034CB9A2D6E19876C8F0AF1D34D342CF1CA4F1FAA2B35D7CBAED9918A3BB81AAC9B3F327FE7257CD967AF79AEF2D74D9DA48E0E4AEAFB6E2BD33638F1BCDEA4D97C82C5D763D3B66E30C7D2EA66511000C4572DE4E24CA356D6126BFB44EF86D880C92C2CE20061E26F8C5FD757FCE3780BFF0038EFF90AA3A2FE5D79580FA349B5CCE87D21D764FA8FBDED19260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BB6F848AE52C9904352B5F0C896514D3D7E36C77CA8B704AE3943AC9BEF91EA93C921BBFB2FF004E5D0E4D124854D2198FF94BFAF2F8F2601358471B966F18FF0086424DF8DF5BFF00CE24D8A6A7E63B9B6715564634F7198F234E544585BF9F9E5A934FD775396342055B7FBB1136B9C1F3100C614E4370B96036D06C20E54F8078D72756DB09334D247FA1C629B9EF9467C761CCC597853D827BFD3254B8B6BE642A6A141CC09E27698350F58F2A7E73EBFA4DC470CF3B988951CABE14CC49E276F872BECDF23FE7858DD476EB3DD8694815527E5ED9893839A26FA16D3F306DEFE28A55911380A28AF5FC32318A99D2723CCC6F10233A229FDAC970A0E54AEEB5C834C9030BD578C8E4C6BDF1E16A395E4DE74FCD485A64B586753DB63FD98F0B039103A66BAD7D124BCEBCBC30726C89B4F45EB1A2F2DCE2CD1092357AE2A88F888EB8AA834850D3C31605562B923BE2CE2895B86AD6BD716613AB4BB7000AF5C5B03238AF8FC3BEF4C59A651DD934DFAE2A9925C57BE2A89593E1FA314C79A065763BD726DF4A22BD7E9CACAF0AAACC13BE424BC2E6B8AFC43B6545045209AFB8BF5CA8AC50571741DAA4F5CA64DF04BE7D43802AA731E6DF148E59BD77A3FD9AD4E461CD390D04F6CCD998C291BD32C71B8D4EE6D2240640BCD5B6E3FC72617898FB58A732E4045EF962F1A51A8CB688AA88FF001D77C9C59C656C3A7748E4E6D27C35AE49938EB9A728547DC8C55522D734F520C7154FCB154C63F30B49F0C44411FED29DAB91920A5375AAF2B9553217A9ED9157A77945B99568C1E05A8D5F1C559B798AC80B713AA0E406F8ABCDE3D44F221CD181A53080E3CCA6D1EA238F5C20346495060DF999E7087CAFE5C17AB2859EED1C15AEFD08CCCC31757A89D87E54F99EE6EB5CF30EA3A93312B2B311F4939B5C50D9D266365881B52546D999195075F38DABDB5A9EC3194DA2504F60B08D8AF8F7CACE4651C4CBAC3490C071E9E190395CA8627F58BFF38EE9E9FF00CE3F7E45C7FEFBFCBDF2C2FDDA55B0CDCE23708FB83A3CC2B24BDE5EC59635BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85884F361C76CAF8536C96DC111904D6A301816424D4A58C5C075A65462CC6441C41E1560CA5C9E80654765394525D76A423B31095ECD96E336D12CA18F05E69242AC0B484107B6C733230348134E0FC0EA6849910814F964278C86F84DF60FF00CE1AFA8BE6C997890CB5427B6F98594539D8657B3DBBFE720B44F56E352AA8320526BF40CC7E2A679214FCFAD422F413895A713C4E591CAE14F6485D8351286B5CCA84C14464F40D0A20D0C709A127BE3964006F88E264377A544A16AC797E19892C81CEC008418B78D5951D6BE04662642EDF164A099E9E2EED2E565B29CA1435A1398920E58D500F50B0FCCBD6A0F4E192770F0ECBC4ED4F7DB2996CCBF3024CDED7F37358E01259E4E245363FD991B41CAA7A97E61EA7771FA705CCD461B963FD98DB0F1187DA6A375A8DFA09E4919F97DAED8DB1337D27E58965B5B3854B971D70F0DB958A7419A457ACD2AB576F0C781B78D90C37CB51F153E79122990926B15CABAECE3E9C090B6491493DCF8E282143D555F1F962C86C8859EB4A57DB1640A696D24840DF167C4C82094556B5C53E204EA09169DF14F1A3A19949FB58A414DE27523ED8F962C816DD4788A0C9B68CA165630A41EB4D8E40848CA12C9E4E3FB5F3C810CB8D086E9551AB5395485053249E694B3F2076F0CA0C911507B8526B5E998F2986E8EC954D3879295CA8FA999CA229B69D6F1CF22ABF422A708853564D4090A6616FA65804AFC5CA985C7F1107776E2353E99A8EC3240AF88C3AFC4EA181A508E8327C6BE2306BCB3672F20635EA41CB319B6DC79186DFC7292CA49A65DC2DBE284858411732558B1E95C7857C5097FE9178643C5453DF1E14F8A11BF5DFAF71E6CD13A0A2F1E87E795CC5309660CAF42B41EAA34BFBDDF6AE52649196DEDBA3AC91C6A21554A374C1E2065C69DEB17D722C9A3908269D7263763E2878E3CB28B89030DEB52C3A53261C7C99022CDF47042D34AFC238FED13964604B87972BE3AFCEAF345C799357B8D2F4F98FD4ECA80723B1AD6B4CD861C6EAB3650F99E6B7BA8AF3882BE99D9877CD9E3141D5E49A0EE2DC076006C3265C594952DA2A76CAE450236CA34DB28E591405353D7316526F8637AF68BA242630596BB6527239718BFA78FC884117E47FE4D443611F91BCBAA07B0D32DC674FA7FEEE3EE1F73CBEA3FBD97BCFDEF56CB9A5D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF858B4FB432AE36EF0D94C1F6457A77C789061488210F4C89DD81539220637E0C15E9F0B7865660C244524D756F13A52693D47F019761C6E31905B67E5ABED43F756D68EAAFB89E9B0A66C61065198B425DE8B7BA7DD4114CFD036D95640E66220BEC4FF9C378DD7CE37019830E62A335D99D8E10017D63F9B7A7A6A3AB6A7005E47D36DBE8198526DCA6DF997E77B23A6EAD25AB0E2A0D7200D38138B07922A10C33271C9AC459B79526E573E9B7602992CC6C3958B67A75E5A7308CA3A8CC493B0C692359B89375DF28C8E6C792BD9C6E26238E63C925131C00CEC5C5083B644C6D946549998D5694C1C0CB8D1B1395E31815AEF8F02F1BD5FCABE5F49D16764F8BAE3C0BC4F5AD3A16810474D94ED86A9CAC4764E919B983F7E25B814DE201A8CCD4272A93644A690F1029C8E41B0146FAD40003B0C5928B4FEF8A559273F0D4F862A9A5B5DD286B8109DC57CA08DF0B105358F50403ED7CF16C051297B08228F8B3051E9A8A01B3F4E98B3B6CEAC4FED64896622B7F4913DF205988A067BD249F8B204B608A0FEB47725B6CAA6526282B8BC201A1CC599445269AF5FB5731E4DBD17DAFA93480F63928868996716303222B74DB2E1071AF74EA3770295230F84B6A53B32AF23BD71F097898EDED5C1F871F096D8D4F0121885EBD72CC71A6C81B63B77A6990310BB9AE5CDAC12FF4AB80CDC50D0F4C558EC9A3DE3BEC877F6C551B65A2DE8956B1B52BB653910636F54D134C962319910E6290D9183D46C42C7C05295DE980067253D7A655B76DFB665422E34CBC8AE2ED959C0FB3FCD968838939879279F7CD7E8594D630B9591C1008F7AE5F8E0E1E49BE6986D2E66B998CE4C8EC49673EF99D8F675D96492EA9A6709AA13BE65C4B8336373E9D234AD45EF84968E04759E8D2B015427299C9B61167BA2E84EAF1931F5CC6939110F67D1F4BE318F87B65326F8BFA35FC955E1F937F94A9FCBE4CD047DDA7419D5E9BFBA87B87DCF29A9FEF67EF3F7BD372E69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF855B670AC2A330CB984B2785D5A23C4EE46C300938D3C8037146EC0D640A57B1EA73271C6DC59E7013FD17CBB7FAEB98A106353D588EB9991D3B85A8D50112F59D1BF2CACE1557BF01993724E5F8F03A39768B3EB2B0D26C08B45317A454D401F16C3C732BC3D971F68BE7EFCC1D3E117D1DCDBB5631C8041D7BE60E78D3B9D2EB789F437FCE1B5928F37DC48C4A6FCAADEDDB35595DFE973F117D6DE76B8853CCBA848F19742AC38FDD98530EC4EEFCF4FCE7D0AE26D50DF5BC263889E5D3AF4DB292D5283C3230655657431B275AF7CB612A6A31A651E578C9BE1C5A94A65933619E30F7148792460EFB653273F1AF4B1ABB029C89E87C3289B9B16EDB4CFF004A3F0F5F6CC7924A3C6845A6E741D7A530C5814DA3F2DB4D4A2D3DE99246E9B59F955DAE230141A7B62BBBD7748D35ACA255DABE00615B2C9238C83C9969ED95973709D912B1FC4081F31912E48298C7C788D8E552660A2D08A743EF90660AA7A95D80E9D31656EE05BF6A98A6D772A7C35E9B62B6898A4E3D4D7145A244DDF9D315B442DD11D1B1640A3E1B84A8AB6F8B65A6D1DC42109A9E98B3077524BA534DFE5809724144FAE0A9A1A6DB6449660A02595BFDF832A25B0150FAD71DB9572B994CCEC8692E958D28731A4D112BE38BD42083D7B656D97B325D36D5415240F965D8E2D332CC15408C00287C732E107189B2B7E207ED5465BC010A95E638B0AE3C0150B2DB07E8B8F00543A699CF9D453C32328D3762431D138B54D18785320DE8693CBF0CE45502D3C7156E2F295B83560A47CB154CE0F2E598707D351C4F865536704CA6D16085032D001945365A47724C33A90A7805EA3C7271834E4C94C63CC5A8C0B6EDC9E840DF3371E375B9333C3755D61A4574B67F1ABE640C4E064CFBBC875ED367D4A61297F881DC9C988538F3C96A56DA488630CD1737237232D8871A52B492FF00449A798BAC3B78658254D2425FFE1E666DE2A1F9644CD90C6C86C3CBDC40AC5DBC321C4D831B38D3F468D387EEF7A6F9592D822CEAD2C5234038819596603F7D7F27871FCA4FCAD5F0F286883FE9C21CEAB4FF00DD47DC3EE792D4FF007B3F79FBDE8D9734BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF84F5A9238F5CAA50699EA135805C2D19413C7A0F1CA841D7E5D4BD77C9FE4C9F5955BAB9531A36FB8A7F0CDAE9B15BABCBABA7B25BC363E568B8428AD2D3E13B75CDC474FE975F9B54642929D43CD1733551578D7C3251C4EA660B1C79EEA4E530908600D30CE1B231715A437D65F5A82269F76DFAE6A75317A5D04097D2BFF38A5603FC513C69B50F519A5C8F59A4818BDF3F32C8B6D7EE550D4EF503E8CC4C8EDA06DE35E6CD274ED634C8E1745F5C2F2DC6FDB31645BC45F0F79C3499F4CD4E482088842DD40C6326A9C55BCB703DBDDC25B66722B97036C22FA334EB45963889EE06093998D91DB69F1FA87E1AE5191CD8F245DB5845F5ADD46512E6929EC1A746D253877F0C8DD2631B66365A3C2101283071B2E0641A7E9B6AB2F22A0536C7897813496D944AA517E11D71E35E0463C28C415E94186DB63B2E580602DA0AA88B88F6F0CAA4DA0B74A641902A65A84D3164D09A9D7155F50686BD77C55DCC0DB90C554DA6A54F2C516A26EE9D1B16C06D552F883F6B0330518BA937F37E3859834AE97F4FDACAC96C1345AEA15523976C812CC4D4DAF474E5BE544B671A88B82CD4E5D72124CA7B2AAB0E42A7BE504B18B23B331FC3B8C039B6B27B39A35A6F9978A2D190A73F5D8F8D2BBF6CCBAA71495CB728DB636BC4ACB301B8F9636BC498DB3ABF518DAF126255154103AE4265C8C25AA467ED0CADC97048491B0C5556910EE31550692256A823DF2B9ADD216EEF23E34AE5643194D846AFA82420B33058E952C72EC637703365781F99FCDF662678397A8A4D0919B2C7074D9B3BCEE7D5EC0C9584D10EFF004E6588389E2DAFB7F4AF4811906B80C11C68897479C39A3D01E8BE19514A9FE8B71F69B204A695974DA007803EF4CA8C9CA84764C6DED78EDC0636CF85905B45180BF08069BE368213650028A0FA3157EEEFE50FFE4A6FCAFF00FC04B44FFA80873A8D3FF771F70FB9E4753FDECFFAC7EF7A265CD0EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85F8ECA6827585979C84FD919084FC474B9674F6CF29F906F35036D773218A18D833A95FB437DB719B1C3A1E274FA8D43DA2E0C763686D6D2216DC06CE3BE6D30E8F81D5CF2F11610F34D76CEB212EC8767CCC3300535006ED2AB986E56455F4CB03FB54CC7F1699CB7539675B32AB335030DEBB532B9E76EC1877633ABEBD05BC4817E3095DEBE39AFCDEA7A8D0E301F49FFCE3379B34BD275C3753CAABF58466DC81C4F875CD5E6C342DE931914F72F3ADEC17BACC9A94171F5A4B9DFD21FB35CD7CE36E44254F2DD5E40F74AC253188D3E28FDB31A78CB951C8F3BD4BCA69E67B826C23334CBD471FEC395F0D322049E6DA8F93752D03518E4BC89E28D5BEC95207DF4C2254C6389EA9A33F3B58E48979851B8C4CDC884699569EEACE6BD5FF000CA652722324EBD158255940E61BB6545927D6AB1D43EDBEE47865728DB644D32A8A7884600F0C1C0CC4ADAFAC952283BE3C0DD18DB27B39964B73CA3DE9F6B1E06C186DD1A90A6A77A9C9C62D528515707AED84848D950380A2A37CAA41902A4CC7B0FA3214CC490EC549353438190921A42AB53CB14F1297390814AD3B62B6A2C66F7EB8ADA8BCAE2B5E98AD201E46AFDBA62C97FAE07FBB2A7BE2CB89DF5C03ABD0F8E02CB8DB5BFE34F8ABF4E506569051B1DF7203E2C896C89561755FDBC8D3305556E7810FCAB4ED8382D24A252ECBB57A7D39138523252716B7C626525B901DB11869978CC9ACEFD64A7C5C72F87A5AE53B4DE394935E5B53AE5BC77B35108B8EE82903957DF229114CEDEE62E5566E43C3DF1663127705DC0A2B8B3181305D460208A74F7C05B618F854A4BF87C46001B2D06DA8C6BBF2FA3088ADA1A4D622029CFF001C9702DA17F4AC4C681BE23D05729CB1A5AB405CDD731BBF0F01918C2DC7C9B3C4BF35FCCF268FA60B6B78DEE2F27158E34AF434DEA332F1E3751A8C8AFF00959F947A8F9D3433AAEA90B5BFAA2A3983B75F119B1C717499A565BD67FE71E6F9B549EC74CD4B9F04E6005EE7B74CCC842C38E254C2A7FCA7F39795E57730C9731C7D5829FE991941B23240C3785A76B4BD06DEE22DA507B6634E0E4455269E35902A2FAA9DE40731CC5B8056F5410027D9FD939518B9319505E8CE36AE222C84938B13CC8A8E9D708091BA7885760570A781FBABF947FF0092A3F2C7FF00013D17FEA061CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8797343B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D2F23F91A57BA4BFD6D6BC0D68D99B874D4F199B556F6FBFF00315959471D8E9F1AA0A7024019B9C18F85D466CD6C59E49EF25615E4332A52A0D50DCB2DF2D6856B70C52551CE43DF31324DCEC38B88D3D353C81A7CB0F32AB551E03FA663193B0FCA3E7DFCCDF2B2E9FEABC7B2C7E1F4E53293938B4F4F9C6F56297D485DF7198E64EDB4F0E146E83AFDC797196E2DE46AA9A00091D7E9CC6CDB876719D3DDBCB3F9BD24F2C31DE0DA94AB1FEA7308C1B0667B4D94D69ACB0BD12208D97E3151D3289636F8657A07911B4F7D723B3D2E146909A39DB7CC738DBE395EB1F997F96F6BAE687305B355D42DA332D55454D47B0C8F03938A76F86AD6E6EFCB17173A65F42C9F1955E429DF0183920B2BB7BC4616F2C5B16DDC65660CC165F14EB3463B9032071B30532B566E2C3B83B65538D1499526D019BBD6990E16719A6917C5DBA63C2DF19A6D6F7CB1008C7E8C785BE395344BA420107AE061396E881329C892A0DAD663C8D0ED9592CC054571DF2BB6C017F2B7FDA1BF7C2A8599ADE876DBBE2A82372A361D3A0C5541AE7155295D4AD477C52934EC6BB6D8AA0C87F138AA8307DB7380A43AAD502BB7865062DA0A3E1269D7A60A6C0510A5BF98E34D80ABA3316515F98C69369846687AE16B4C2075322A96D8F7C55328A7F498156AD31564767AA23108EDDB08544B5EC55DA4FC724C81444378A5A9EA7BF5C2CC14C92F401F6F6F9E06C1277E9458EB593AEC37C84CB6715A849AC27412F4F7C8829421D6A25AF292BE1BE580AA026D6226DC3FE39602A841AA52B2C64B329A0032AC82DC5CF9B81E8FA0797EFF00CC36DF582AC8AA3AD30C62E064D45B23D2FF002E746D666FABEB1682EAEE27FDDB915A27874CCCC61C0CB2B7BEC5E5C8B43F2FBD969AA96E889B050053F01997034E0CE16C3BC93A446D35E6A37975CAECB32853E03A665C25B38C63BA6F3C3CEDB526BEB5496201B83151EFED82526710F942FF00F2B62F34EABAAEA1631FA2F393450294A57DB31E45C8807897983488FC97713E9FA8CA1A624844277CA0B7C52BB760F0C4E05030A819590C81A45AF5C14CC14D74F6F888F0C7859829D237C58D3305FBB9F945FF0092A3F2C3FF00012D17FEA021CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8796B43B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF911B5D4CA4450905BBAE74F1C603E6D3B48AE67FACCEA900FDE16A6D9682038A626D9EF97B49957795D99CFEC9195CE6E660C6F47B1B58EC87AAF540BB961D4661CE4EE74B87D4191C5AFAAC65616692836E5B65066EFC600F1FF3E4D71AB45708F1045607E21F4E5329B64703E3BD62C6EECB539792FEE8B1F88FCF31CCDB04292D9AE9C158E18C484915AE57C56C8DA31A49596358E416F21EA54E44840059C68FE69D574B44824D51BD24151F16E7D8E63C837C6DEEDF96BF9A30697AC437F733A5B98C8A9E5D7E798F272216FBDBC9DF9E9E4FD7AF7EAF7B7111F56309212474C003978362F14FCFAD33C9F3EA31DFE8572B34929E46314A54D7C301736DE23636377C39471820F5F6C8101B0499559B2DBA8F59E847619590CC14FAC751B37996105CB374DB6CA671B613932D59618940988453D0F7C8F0A04D136CD6F2352390BA9FDA1BEFE18385B064A593E9D74D30689498C9DD8E3C2CC66461E76A80354A81BB65538EE9F15B87528DDB846416F0272B316C8E54DE3BC454025A06EF4CACC5C98E45296FE05DD4B37B5321C0DE24BA2BC570095007BF5C8B0326E59EDE9BB004E28B4B5E48F7A1A8C56D41A44DF7C56D45A4DB167C482797AEC315E24135C76A62BC4A06E0D7A75C4A89287AB43D72921B414545734A53E9C785B01B45ADC8F1C785982AE2E42D0D7A74C14C89D95D2EEA2B5DF035DAAADD92C17953DF15B4CE0BB006EDCBDF15B44BCE78F247A3FB6109050E2EEE01FB44FD392664A69697B329A93DB147123FF4A3014240FA71533A434FA846D148EF394310AA81DF018DB28654A6E3518B9DBAC324B2198D1CD3A60106CF142A299A4BC92D622F2040086237DF2622BE28651A77947CC5A9C4F35BD83945E8C4102996082F881EB3E4EFCA9BD9D44FA8388EA7918FE5898BAAD7E4DDF4559E9967A26872A40024C828A0EC09C9083AFE3280F24DBDEACF7535F5BA2C8EC5A075DFE1DE997C4522ED966AD33DA5A4934D2963312A213D299785E152D23CBF696D62D3ABB191FF007A2BDCB76CB449A670DD4BCD4C2CF402DC4249715529F3DAB80C944698D7953405B5B06BB9A61140D1C923CDFB5D2BD32B25980FCBFF003D4B379FFF003D6EF4486FCC7A769D39ACAA7ED509EB9021982FA1F54FC9D96DF4DB7BFD27525BB9258C39B52C28BB0D85322907778AEA52AE8F70D677C443780D046761F7E2C814CEC599516534A30AEDD30365A6515E425FE26A7B61676FDE9FCA021BF297F2B997756F28E8841F63610E74783FBB8FB87DCF21A9FEF67FD63F7BD172D68762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EF578F9B5C06FDDBF4CE9B8DE267A6651E54D1967BAFADC9BA72AAE552C8E29C1BBD62DE25826E4AB45AE56656E6E0C28FB8B9068427241F697C72B9F276F871F0EE94C97B4256184257314C9D96395B10D522BB9CC8D23058687965129399116F07F30E857BACDF35B58446572D4F8728949651A4E34BFC8DF335FC6918B3912693756A76FBF2B126118D966FA67FCE2079E3569D2425E28DBA7F9F2C4C9C918596BFF00CE13F9AA29D1E5BD255853896E9FF0D944A4DD0C4CC2CBFE706B5A9E359DB5858C2EECBCFF00E6ECA2526F8E265563FF0038CDA7E8171691DF7994594A8F4F50494E4476EB91126D11E17A95A7E487956EAE62177E6E597881D6407F8E032660A7179F957E4CD35D2DE1F32C444A28C798DA995993602A69F929E539E932F9A6293BF0120C812D82491F987F2C348D2EDBEB1A7EAA048836F886E7EFC46ED3964C33FE55FF009A2FECCDDDAAFD7517A01BFF001C970B57131F6D13CF3A6481DB4B6B5B68FED02A454F8E3C28F11136DE77BCB598417D6E4229A31A634BE2338B4D6B48D6A25442179EC6BE380C2D81CD45BBAF28385F5EC65A93B8A1C81C6DF0CC92CBA4EB91A13E9B3D3BE40E37331E54BCCDA9DAB7EF6D0923DB2BF0DCA8CD53F48A85E722346C7ED2F8661CC516CBB516D4ED5BED311F3C82AFFAEC741C5B63D3E58AA8B5E27F362AA2FA82F4AEC3BE2D96817BF5AF5DBBE29B59F5A88FED62B6DFAF19EF8A82A2648EBF6BAE45B42BC6CB4FB5BE1640AB2B8DB7C0D815B92D3AD70164AD1B0A75CA9AD7F2DC50EF8551D0135A5715477A8513956BBD310CA3CD6FD61BAD324CCA9BDF49F663EB8B548A3ED2C750BFA705635F0C5ACC99E795BF2D359D7F538AD591845506507C0FD396E38DB0964A7D476DF933A0D959033C4867812AEC7B6DF3CBBC363E2A47A4F937C9BA5DEDDEABA95DC29145BF027AF1FF006B2C18D7C5629E7CFF009C98F23796F4ABBD13CB56714B76A0A0950577029E1ED93F0D7C57937E5BFE746B779ACC375AC4AD0E9CC4B70EDC6BF2C84E14E3E63C6FAAB53FCD9F25F9AEDA0D1F43981BDA8590AF5AF7ED80069E07B5E83A3AD8E9B6019FD4927456E47B03DB260278588F9D0BDE6AB67A65BF660580C902ACD043E8C3A7C1D2A02B8F96264C4861FF00987FE997DA7E996FD178F35191E2470A335A8DA0F265F5869B66D3EA4B6CCA0815DD908C921F9C3F96FE439FCB3E7ED77CC1E77D224852EE6768DCA6F424FB9C3487D831793349D5EC21D5BCBBADB441E3E6D64ED4E1ED4C348B7E587FCE45F9ADF47F3B0D3667A346FC5A64F6A60E1660A1FCA5F98F1DD086D6693F771A84563DC78E34D80D3DA2CEEF4FBD50F1CC391F7C69982FE81FF26E83F287F2A829A81E4FD0E87DBF47C19D061FEEE3EE0F25A9FEF67EF3F7BD232C69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8BED12FA6D457F46FA12ADBC7F626A7C47E6736E72BCD5193DAFCA1772C114D67796EF4894FD51E31D5BB72F6C899A63A6B6609AB5DA32C37B6E2DD587C2E452BF2C78DCDC5A4012093CFBA5D95C5C4123AA9B7157693A7EAC13C9B39630D30CD5FF003318397B28A39E2ECD18AFF0CC4326D863A62B73E79D575085C4517A61F6F886DFAB29949CC807D51FF38D7F96B36BF24BE60D7A33C62F8E30BF64F43BEF98F29378C40BEE7D22C74E69E9269D0C76D07C10CB1AD18BF45AFB655C4CBC1E1DD9E8BFB58ED1ED0C421BF857933462881478E266DF8E16F93FCD9F9B3A89F3543E5DD06E92E5E7904370EC6BC2BD48DB2894DCD86114C9FCEFA4EB5E4DF2D0D6EE7CD33CD77749CA3B3864DAA7B5331A536C38E9E45E5CFCBEF30F9C746D43CE7E64D66E20B0B2532DB425E858FB0C89C94C463B64BF967F973179E359223BABDB6D26DEBEBDD31A6CBE06A32072527C17977E75585B796FCC53E81E54B9BBD4A68BE15773C8F2DC640E56DC7A7B286FCAFF002B79ECCC351D62C6F9A0421B801F0F1EB959CAEC31767F13E9997F303F2DADECC68BE67D3A6B4BB20707028DB6C4E1198863A8ECDA28BB3F307935EDBD0F2EEBB25AA1FB2B2BD313A92D3FC9A82D7B509BF41DC2C9AADB5F475256456ABFCB251CE4B4E4ECFE17805ADC68374F7306A7693F224F0940D8E644276EB3361314A5FCB71DB96BED36F0C31F22521734232F0C2386C59661A17994D9010DE5D212BB75C90882931A7AE681AF68FAB442DD6E22172B5E418ED919419C7210C953CBDA4EA2A566A7ADFB253ECE63CB6726398B18D47F2CE695A4789223131AA377A7DF98192365CC86434C1755FCB7B8B552CB1866F0EDFAF2A316CE379BDEE87A8DB170B6D29E269D36FA3234C81481A3BD462258245A7B645210F34BE98F8C1030B7525C6F2035058838B3115212F03591CFB53148802A6DA8C6845198E2C8E20022A1BB59A95241F6C5AC48A3967229C6B4F138B30510B73D37E98B74510B703ECD7AE03BA65B045070AB50D91E171BC42AA92EC64AEEB9131489A36DAEC3380DB0F118084892266BD759111006889DEBD71886C81DD1F0992E18C50C4657A7C210572CE16D243D3BC97F957AF798E482792310C524A1645E8426FBF5EB8F0B8D393EB1D1FF002374CD2AD24B8FACC8B2409CBF7A76247D38F0B8D29A0B4DF33689E5E3793CF730C571A7D79F134A8197618B10789E11F993FF003955A5E97697F6FA0A9BABC98323B49BA8EA36F87325AE669F188F3B7E6079FAF9ADAD2F561B59FD46B94534201A9006C3C70DB8E7290C5B4AD3E1D275392DB592F717334A03C8FBF53DB27C69194BEACF2AF93E2D6E1161A2A492974A3B36FC411DB2B99B6C8CDED5F941F9172796BCC4FA84AD2CE8CFCA6F537E277E9BE56CF8EDF74C691C2A8109E1025501F6C3652082F3BB1AEA1E6A7BCA739223C78FECED8DA683D06F1115A198578A312DEC72F8C0485A90180C006AFE6C9243F14708DA982500189A66B1C4F1488518AA4B5E5F25CAA52A6069E4DE67B48BCC7E67B6D2DADD25B585C7AEC07C54077CABC621AF64279ABF2B6EF4DD2B5AD5741BE6B484216823534A0A0EBBE4865B6C1005F879F9B02E6E7CD9A80D61E3BA9E1958073B9DB26269E00F3089B568627BAD3D12358E4A1E636E3ED960368D83D2B43F3C4F63259C11C9CE5968272DF641EF4DB274178807F551F9093B5D7E45FE4BDD350B5CF913CB92B11D2AFA65BB7F1CDEE1FA23EE0F2DA8DF2CBDE7EF7ACE58D2EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90FF00CB7F20CFABEB70F9784FE9BBB0569CD76FA727E3B8A3474FD1DD03F23BF2F3C93A589BCC5E60B79AEDE3E4119F707EFF007C7C76C8E969F1C7FCE4679DBCA97925BE9BE5331C6DA651649E3E8DC698F8EDF1C34F985743D435AB73A95C5AB244568B514F57DBDF01CEC8E34D74AFCB3F36EB344B1B65B6B63FB4C074FBF29395022CB74FFC91D5CEA169646F0CB792B82B02D6868457299657271C5FAB7F90DF96FA8695E588AC2E2331968C027E81941CAE6460F7693CA361A1E8F705C896E5DC145EFCBB1CA8E46E10BD9F397E76FE60587923CA7269D6404DE66D67F72186EC81E9BE0395C8861A60BF911F93BA0E956D75E74F38EA0B3DC5CC06ED8B36E8C6BB75CC79657371E36216F637DF9B9F9A52D868F792CBE5AD35E9287354A2FDDE198F2CACE589ED7E70F2C5C6B0963E42F2E5C1B68B4F939DEBC6688E0F63959CAD4715259E7AF3EE89F933F97B37956C5565F325C2141243F6F930237A57227236E3C5C4F19FC99FC9EF3579E357B2F3B7982E85BDACF299409BAB2F20DEDE390395DBE97476FA57F323F30348FCBD8C68F62F6D3B88F837115DC0A7BF8656723D0E9B40F813CDFACB79A75A6BE9E0145242328E80E0F11CC9F65F131F9AC2248F925F4B6EDE08D4C81CAC4F6481D1434AB8BFB2BB8A73AACD71A746F59A177AD4F7C9C32BAFD4F66D07D412F9D7C87AC79623B2D3ECA38F5644A34B415E599B8F23CE6A7414F0F3A6EAF7777248B3B95AD16253B53E599D8E6E8F2E1E03499E9BE5C56BD53AB192DE2247276DB2F127127165D7FA0E8F0317F2EEA85EF1002C8ADB93E18CA4D6229B7953F33A6D26F5346D6AD65424F1FACB0FA3AD330E72722117D2D63AAD9DEDB42F6B79CD5D4155AE634B9B971E48AF5AD89E372BCD7C72B219A1DACF4FB9E4A6C57813B371EA3C72B21B2293DE792B49BB25BD08D49F6FEDC810CC3CE75CFCAFB296390C4A2B534A7FB78B787916A1F965240EFC54D05698B6061D7DE50D42353FBB240E9F462CC31B974CB8B7E4B25B9AF8D31672E4848D2584EE87171AB74D61B9A8E25295D89C5B150951DF1640B4B28A80A773DB14CCEC9AC658A0DF22E2A3ED62326C7A1AE34B68D58A15824653F18E831E15B645E43F296A9E67D5E1B75899A194D2B966385948C9C2FB83CAFF0092FA779295353D5A2170654E410EF4AFD3991E1A0E77A4E82DA4699F5ED6AE255B3D3ADE3630C55A55C7418F86D32CCF3DD5BF33AE7CE574749D20496F6ECDE9B4E36047CE98F84E34B23CEBCF1A3792FCA7A1EA926BBAA97BEBD80FA4BCF7E743D725185328647E5DEBFA8C32EA57C2CE212DA991B8B91534AE4A98E4928F9735ABDD1EF0DD69B251CAB7A918F9634E29927A350BBF32B5ACB1DBB3DFB5C207A0DFED634CA2FD64FC8CF29C1E5EF2B0D66F63A5CC9081F17662A3010D8F77F23D85DCB6FA9DE5CC815667261AF8646922D3CD6EEC69D62189A168F8D7DF1A6C8DA43E4EB4FAB9B9D4661B4D5E24FBE34CF74E755BCFABE8B3C8C68ECEDC7E9E9878E934520F29DB1B2824D4E71BDC92149F7CAE5918905956A139B4B19A73B7D514927FD615CA253B6B312C23C8F6AD35FDFEB972B54B824424FBE5129313128BFCC0FD23079435716F2B969636A460F4DB2D8DD391189E17E06F9FFCB7AE0F34EA9A85FD94CD01998F220D2996C4B0902C7749D26F7CCD7834686136494AA9229C865824E348909B47E4F86CB506D288E57711A09325C6E399C83FAA2FF9C7E80DB7E437E495B375B7F20F96E33F34D2ED87F0CE9307F771F70FB9D2E5DE67DE5EBB96B0762AEC55D8AAC7DC7D38AA9D0E2AEA1C55D438ABA8715750E2AEA1C55D438AAFC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF233CB9FF0038C3E4DF2ADCBEB13B133D0B1911C0CC3B2E7ECFCE5FF9C95D5A6B1F346A1A7E95AB4E6C625612C5CC96E229B03DB1B29A0F89DEDDEF00926B97974FF5394909AFAA47BB63653C2FA87CC9AF797F56F2279774DD25D34B4D3A86707FBD6A0A751BE365061B337FC8DF2C5E79C752B7D26D6F2E0CAEEA11B937122A32B258460FD2CD3FF27FCBDE569F47B4B9B432EAF28065BC6DF8F427299172618DF40456B6BA6D9C16FA4C4102A51E4661D69EE72891A732106272C4F737978F79C94DADBC970B272AA1F4C578D077395D972B1E3DDF9E76B6317E6E7E6FDCDAEA08F69636B318F8CA7ED509FB35F96425272B829F42FE69F927CBDF977E4FBCB5B1FAE896F63315A4924C4A7A8694A0F0DF28916D8079F7E5DDB5EF907C986636E96B7BAC9ACD7DC6878B03D0E512939118A6307E6459E97A6DCD968086FF00CD3316F4EE07C67936DBD2A72B2594B0DBCCBCB9F94BE65F327999FCDDE78B1B8BA4327A932C95E0141AEC08DB2264E4E9F4FBBD4FCFBF9ABE57F2AE8F0E81E52E7677F0A18E242F550D420EC32B26DE8F498007C75AEDF5D6B378B7DADDCB4D7B292CBBEDD7C32B327A0C31012DFADC21FEAF343EABAED118C5283DF07139825174B3C0842B583B13D2B91254CE285BAB580C5EAADAB41714FB1FB253C699289759AA31AD93BF21FE5BF997CF5AA25B7942D9E390B52E6465257DE9B6676393CB6AA9FA0BF97DFF0038C4BE5FB186E7CD3299AF1497996BFC33618E5B3CA6B620CB646F9AFF0025F45F3497D3AC6330A8F843A6C7C3AE64893AE9C5E7FE59FF009C4B6F2E6BEFA88BA9E78B90608EE5878F4C12935883D1FCE5F91FA16B366919822B5BC450A27550A6B4CC49CB7722317CD97FE5DF30FE5DDECA90C72EAB696CD44F4EA683000D8F40F2E79AEC35E884733AD9DD746B7907C55FA7010CD983EA0F1AFA3C1404F85180EB9590D812B7FADCADCBD6F84F4036C810C834F248AB406BDB7CADBD21BA53293CD41C5B42552E936F221AA038B20C2B54F2BC3217A44BB83DB16C3BBCCF54F2A4B17F751803E58B5F0B13B9D1E5B706AB4FA314243346F1FDA53BF4C50A5146DC838041076C0589927F096E03236C0A6F6C582FC3D7FCEB931BB548A3A0D2A6BABC820B40CC2660251D7AE5A22D7C4FD0BFC98F24E95A1E9D6B7A2D985F08F90673515A7865F8A3BB4CF23D4FCD9E6780AC36D247CE78E3ACC3F6683AED99341C7F11F21DDF9E17CF3E61BCF275ADF243A7D94865BB8D0856A0EA2B5F6C691E25BD5935BFCBEF2569062B7A34F0A7266EADCBFD6C683025F9C1F9BBF987A879ABCC37C25AAE903E1B5727627C0602144A9E07E85AB1755670AC4D77C1C2C2791D64B67A6DC898BB2CBB8849355DFAD463C2D5C56FA7FF00203CAB16AFAF433BBC73C664570817DC1C785BE127EA25D4634ED0934E0BC04DC5828DBA0ED9121CDC401E6CF7CB6D0268F089CBAB2814A1A7DF829BC4425FE6C65BF8AD6D636E3561C877E38D331009F689666F74B92DE195614B215766F6C69B0462C1FCF9AFE876D2C3A341AA4308545370ECC0EE7AF7CC79C776C1008D7F39FE5FDA687656D77E64B5630D0944700D7DF7CACC14C22C4BCD5F9C5E4792D27B1D3F5980FD6C2ADC55813F08A0A6FB640E32D6718653E49F37F93EEB4286C1756817D221A3F8C035EBBEF90F08B0F0C273AE79A34C3A7CF099619CCBB2B5410C3DB7CC8863A0E44202980CDF92FE44F3BE963EBBA72FD6AF3ED3A902B5C3C0C258C3E78F3E7FCE23685A523EB9E5EBAFAB6A963FBB823076A2F4040EB83869C69E10F9423FC92F3C4BE66FAC49A6CB33C8D46B8553C4FE18971CE9EDFD0E7E5058CFA67E52FE5769B72A52E74EF28E896D7087A8786C21461F78CE9F4FFDD47DC3EE797D40AC921E67EF7A2E5CD4EC55D8ABB1568FBE2AD547862AEA8F0C55D51E18ABAA3C3157547862AEA8F0C55D51E18AADC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF30EE7FE3932FFBDDF60FF7998EE4BF25BF357FE537D53FE39BFB5FEF6F5EDD716D0F1497FDDBFF001C5EA7FB9E98B745253FDFDAFF00BC7FDE0FEFBFB9EBDF23264793F4DFFE7143FE3BBA67FC707A2FFBC7FDE74194B18BF42B56FF0094853EC7D8FF0077F5E9FB194CDCA83C8BCEFF0061BFE521FB5FF1E7F63A9E9ED98F272E09DF927FDE49BEDFFBCB27FBDFFDEFFB2FE3953938DF1A59FF00E4EBB4FB1FEF50FF00783FBAEA7EDE464DF27D01FF00395FFF001CEF2EFDAFEF63FF008C1DBAFBE53258F3625F985FF92AB47EBFDCAFFBCDF6BA663C9CDC6F00FF009C69FF0094FA7FEE7ED0FF008EAFCFB65679B9717EA37997FE51BD43FDE3FF00799BFDE4E9F64F4C94F936E93EB7E3179D7FE531BAEBFEF43FF7DFEB9E998E5E9B4FC921BDFF008EDDB74E9FEEEFB1959E4EC23C936D3BFE3A375FEF1FDB1D3E5DB029F8ABEB3FDF27D8FF009E790973627E2AB17FBD717F75FDC8FF007A7EC7D39383AFD47C5FA1DFF389BD2EBFE385D0FF00BC3FDF77EB99F89E675DC8F37D49AFFF007D71FDF743F6FECE6645D066E6C5344FF7A24FEE3AFECFDBEB99117124CCAD3FBE7FB5FECFA60C9C9AC3CD3CF1F69BEDF5FF0075FD398736F8BCA74FFF00A587FBC7DFFE3A19747E9497CB7AEFFCA552FF00BCDF6FFE95B80A43D7A1FF00792DFF00BCFEEC7F7DD722DB1504FB67EDFD1959641565E9DF2A2DE12997ED606D0843F4E2C825571D5BED7D38B6B12BFF00DAFB3FECB14179F6ADF6BFDD78B51611A8F5FF00757D18B192017FBB3F67A603C9804543FDD8C805926D69DF2E8B44F9BD2FC89FF1D6B7FEEBED8FEF7E797C5A25CDFA15E5BFF8E6DA75EA9FDD7D1F865F071F27262BE69FF8EB6A5F6BFDE47EBFC32E71DF97FE4FFF00C995E66FF7BFFDEC93FBBFB7F4FF00938ABEC7BDFF00943F52FF008E77F70DFEF47F7FF47BE2AFCCCD7FFDEDBBFF007A3FBF7FB7F63FD8E1632E4C6A3FB4DF6FE8C0D3245C3FDD5C74EDFDEF5FF638583EDFFF009C50FF008E9C5FDCFDA5FB5D7A8C0E4C1FA41E6DFEFB48FB3FDCF7FB3909399064D63FF1CF8BFBBE9FB3D320DC3E2C67CC5FF1D0B0FB7F647F77FC71671F8A62DFF28CEB5FEF67F74DFEF07F7BF4E167F37E67FE65FF00C746F7FE526E9FEEDFB5903CDBA3F178737D97FF008EDFFCF6EB8127E2952FF7FF00F4B5EBDFAE2D72F8BD3FCA9F6D7FE526E9FF001EFF006708607E2FA3EDBFDE1D1FFE523E8BFDFF004FF65930DD1E5D5F5BF977FDE0D27FDEFF00B2BFDD7DAFA72054A7FE6EFF007960FF007B3A8EBF47DAC816324FB4DFF8E7D97FC733A0FB5FDEF4EF902C1F62796FFE51ED07ECFF00C73AD7ECFD9FEE57A7B674DA7FEEE3EE1F73C7EABFBD9FF58FDE9D65AD0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD9, '1', '2021-03-13 12:45:48', '1', '2021-03-13 12:45:48', b'0', 0); -INSERT INTO `inf_file` VALUES ('6edb3893-8ec8-4bf9-aa64-c04f1c7ad98e', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F0000010305010101000000000000000000000304050206070809010A0BFFC400431000010302030603060406020104020203010203110004052131060712415161137181082291A1B1F01432C1D109152342E1F13352620A172472164325345392E2FFC4001E0100010403010101000000000000000000000304050601020708090AFFC4004311000102040306040602010303010803010102110003213104415105126171819106A1B1F0071322C1D1E132F114234252081562161833437292A2B2D224258234FFDA000C03010002110311003F00FBF8A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A0AC4C7CF97DFD89ACEE920903F71909243FB3CA2953A948260E5AE5FEFEFD29962312647F261DADAB54FBB46C10A2D60FA966E70826F595BA5941E25A7FE44A4825BE9C63513CA69A276A214A097A9E03D63265A85DBDF46841EC5AD187C5BBCE0696AFCA56A0904F2039FCAA524AC4D018D5BEDC3CFD886932709658834BD0F0E56F3CA1E22E10B820183A1EBF4CB9CD6B326196A29A1B6B623B74F38525AC2D20DB510B05054C4E5D684CC2A6602BAFF71BC7B4A07CD9F841149580633FBF5ACC11E832268823DA20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20840820C73A5029934B8D789F7DA140A64711AF13F87ED142BF29F4FA8A6D88C289E0920391507D9F66D0D558B097A0245BCA9D7FA363108D34DDAE2172E38BE137E13C0A0608F084104E5F43A193CEABD8AC18C3106D7A5E95AE76A59BCA1791395398105EC3ADBD39DB268B6B10C5F0D18A0C3577187A9E42B5B958372743EEF3D2069A4803AB0FFBC8C2AF777C066624B736FEDA9A44C4BD90B9D2BE7192B552C843AB3A97D1C7F717BDB3ADBC96D6D2925053970E900465CEA6F0B8A18B97F31DC9624FBCB4F60464E90642CA14929539704311C0F9FEA1FB7CFD3F5A9295FEDEBF784614A710422BFCC7D3E828821447E51EBF53441155104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104450C4D92F5D301B70BD6DC3C400FCFC63FF00D79E70067D09F4A6EB9E106B400E7C75F6348C33B8F21786AEE2AD254C254D3E90EA5D5AD6A4C2184B492A25E3FDA08120FE99D64ED09094B93500D33A3F0B521AAB05316680B121FBD3D8EC0C72B7DBCFF894EE97D96762F197705DA5C2369F6F9E6D6CDA6016578C5E5DE18F825B3F8AB54AC38CF1485A6332248D0D5476EED793F2D5BAB4835A3874E7EFFF00F422DDB1360CE99392152D6427759C12921BCDBD75AC7CA1ED6FF11EF696DBEDE6E03B7F6FB718AE0F64E634D1B8C0ECB11BB61B72DDEBB69086C5B85907FA440209233D2B8BEDADBCBF9A425550A167CCB3B50F6341D23B76C5D8084491BF2C01B85BE90D6ABBEB6BF4AC7DC57B266DF5CEF13721B0DB518825F17B89618D2DF55C4F88A5A5B6D2A528992789526739EDCBAF783710711B2E5AD4492522A79F1F7E51C6FC6385186DAF3D2121292430019837A46CFA7DD05474807EFE357795FEDEBF78A94548585A428640F5A710426BFCC7D3E828821447E51EBF5344115510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510478639C7AD10422B70699F61F0D47D34F5A208B57157D9B3B945F38EA6D8B48756950570B2E808952AE4999091F97A647ACC06D3C4090824E8FA3D2D7E1A1830A37E72505FEA2DCE9AF5F58F9FBFE279FC5A30ADC058E31BB6DCF5FDA6D46F5F1369CB0BDB5B3713796D84A5E4F85E2145BAC3CCAC5BB8A5C990148988CEB96EDCF150C2EF8DF096041AD9BFE35B1CFBB88EBDE16F09AB1CA4FCC969992BE9282DBCAADDFAB335358F90FC671FDA5DB2DACC7769F6E318BDDA5C5F137957CEDC5F3EBBB603AF953A5A42DC3C50C9596C24C70F0C72AE57B43C6431130A44C24926E4BF06A7E7817AC76FD9FE071225A54248140C426D9E94F3E2F0CF67F1042F1861576C16BC2C4B0F36E1A4F0A045D37A13D3224E7998D6A2D13978D58512540A852F73E5435F661C6230A9C0A199B752ABB0A80457F0D7B47E871FC3C2E9CBCF65BDD95C3AA2B5AB0F70499984A9B09D73FCB15E96F044BF97B265A48AEE8A9CDC9FD7947977C6F33E6ED89AA77049E548DF55FFC47FF00A8FD2AF72BFDBD7EF14C8A58FF00893F7D29C4102FF31F4FA0A208511F947AFD4D10455441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041A510435372388A40CBA99E5AFDFCEB2C7431B896A29DE0CD5A674E9F78592E020120FA7FBADB715C3BC25315F2802ACFD9ED0C9CBC487FC208717EE9515244A13099827404C7DC56E656EA0294E1DFAF271EFAC371880A56EA475D3FA7F53A3C4BB8AB49B755CA92E04A78CF01FCEA4B73C4B039848127A0A693268403C01BE747A7EE91252A42A6B338720727B3DEF46FC47CEE7F186FE29985EE1F652F3747BA1C4DAC4B79BB4E872D1D5DB3C975FC1036471F096161EB75B8CA95196640EE6B967893C4F2113D7841FC88604B642ADF97D6863A6787BE1A6D0C74B4ED10A1F2CEEA9206F6B906D0E5FA3F1FB79B578EED16358A6D56D05DBF7FB538A381FC4F16C61C5BB8A153C494A1A7D5EFF00080A28009FC99682B89788F0D89C7854C94A2CADE2E496725D8B06D341DCC77FF0A6CC97B1CCA4CF4A545346AE547660DCB3B0E1157CEBADB8943CF5C34C13C43F0AA8599CC95F2CC991D672D6B96AF63E3913C952D4C55A9B5333F961C834761978FC0CCC37D284856E8029C297E35CF389AB3C66D117B84E1B609E2BCBABDB4E07AFA080A6EE1B27888CE55FDBD7A9AE89E1DC0ACFCB4AC97053C474ED5766CE398F8A12662672A596A1208003D3FB7AE75A47E875FC353F1AAF643DD5BD7E86D1706C6E38C36084C071213139990273AF50785E42A5E025A5A8406F795ECDC9DE3C83E2C27FEE73526E925CDEF6F4CBAB1BF41B8C2D05398311DAADB2D2433E4F5AB574EF1578ADA494A003DE96820520924E5F63CA8822B488007DEB4411ED104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104332D00B2A264F41A67FE32FB9A0162595D1F4E1EB0AA57BA8AB801DD850D4F7EBCA14CB4F80A5C6A73F21A7BE4E5A23713382CEE876163D7D3BFE60B124DC36DB82DE42AE20054E69232D46920FCE75D50C4CFDC40054ECEC1C503D7FAE1CA16C061FE6A9DA97E4C4971CEBDC0A67CC3FE259EDBFB39EC5FB88C6714BEBFB556DCE2B66FDBECAE1FE2A3F1172E3A54C5CA92D1525D596D2EA55EE194EB19556F1B8D4A50BDE57D441662E406B1A38EBE917DD8FB24E2D7266CB42BE56F0F98141C100B0619E649D4F38F811DB3DE2E2FBE2DBEC477BBB68E5F5D6D0E23777772117854E5BB69714E78296C392B03C352444E59655E7BF124D3336B29408A28B9CD9B2CA9991C4C7AA7C307FC4D8E996DBA4245281FA50E5EE8F67DC630E3D69885E5DB1174EA901808465EE2B8444E7F9634FAE74D14BDE90D9B503BB8EB763566E8F1954F06728D2F5BFE9F2F530861F8C9BC69CFC69875AE1E20AD424E49CBEF43553C6319A684107D8D732EF607AC5870B3C26592AB1029ADC55B5C9BEEF10B6F77737FB71B3563624A9C7F6870461A08CCF0BB88DAB6E4013970A8CC0F955B3C3E80A2839EF0E771DB8F7CA29FE22DA0942561CD942EFADEE1BB3F08FD407D92F6311B15B82DDC60086FC216FB3D873E5311EF5D59DBBEA310352A24F53CEBD29E1D4B602506144E5EC97F2C8671E50F13CEF9DB5710B705D43EEFC3311B3496C01CC7C8F79CBE1FA54FC57615A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828821B3AB4A544150062403E5590905CD011E777E30DA62941C55893AD2A1BF5E50D9B7D2B497152809FEE5E49CF2CB49C87AD68A9852145C80900DE9C857B3422941597DDBDC900F9FEF9B461DDF76F3F04DD76C3E2FB658EE256B8761183E1F7777757172EA5A014CB2E38DA10A5909E35A90123AA8819CD56B68E37702885391966391F7CE2E7E1ED9E274EFA9255660D4AE4DD6DC5A3F385FE203EDABB55EDABED378B6338BE2574ADD8ECF623776FB0586B8EAFDF2CF131882AE995294C90B7590A64B5A82273AA06D0DACC6602B2581B9D41AD4F1AC776F0FEC69625A1210024350240BD4F0ADAD6F3D78731F17984B16E2C98B661B9485787C172424812AD358907A6715C7F6A6304DDA0B50373AB82E38687DB978E8F2D230F204A14614E1E61EE1B90E062C2C57690DBBA96D0C85DAA3881E24CAC98911CB23CE3E4269D024CABB535A6B6EB6CDEF586292A54F05A84E560F62C5BF3E916A0C4EEAED38A5DB07C312C809320E796401CBEE2273AE624154FB9626CFDEBE6F67D4889C4EF26428D430A87CEAFFDE71B1BEC8BB0979BC6F68FDD0ECC23C172E6FF001D6AE5697412829B2B862E3300124808300E522AF5E1B96EA41A0A8E6DEF8DAED1CA7C598B32BE692A20310CE6F4635E55E01F48FD46377F689C3B63F666C4A63F0B816156F0065C4CD85BB6AC8F29498AF456C30D8443061BA18767C838F7C4F9DF69ACCCC5CC59B93F97F26CFA45EE1415313975A9B88E8F68820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20886C47F0E9429D5BA50BE24C4A8246640239CD658B3B75E7EEB5F36704952C92029B32C481D7DB72A431C582DF612CDB381B6D0DA9C7DCE284A5284859248D321399023946551F8A5A82083762E03B3694CC8E76D042D2A484946F060E03666B4E6072CFA47C5B7FEA1FF00E2238D31B43B3FECA7BAAC7949FC4A710636E6F70FB950FC280843F68875C657EE789EF27FA91331D6681B6311F4AD5BEDB8F404125EED99E3766D0C749F0EE1C26624A430514F61A7A91CF4A7CB7EEEB0DBA432B6F197495DA3AA7B0DB85A8F1DCA9F70BB7478D43DFCCE64684E7CCD722DAFB40852F749CDC3DA829AE7C63D01B064A44A416B80030D296D5EC7D488C8D7D8C97EE5618052D70A5000D3DD10743A4899D0CCE46A80B9E6662F7AE5C0B335684D1BA718B1CF91BD4614A583D2A75FCF786A2D9BBA1FD4D79CFA4E7DC8D0E43B0CEAC7296AF9391A0D2BC3F6D5A7186987C2EF4C14203DEC0D4F98D3EF148B06ED78D981C374A4C003FE9F231E4395474C4EF4D14BDDB2B135AD0FEEB689B9D86DCC39A1B162C6BE753EBC6E3A93FC19B76771BC2F6F3D8252992EE1BB2CF5CB974A20A90D7E22C8A9AE230401C439F38F4E85E1B961E58FA6AC6B7E7C69F78E03E392A499C9245281AF7AF2CDCE7AC7E8C585B29B6B3B46131C2CB0DB690232086C240CBB0AEFFB1C3615219A9CB38E0B8B24CD24B3B914E0D7B5625DBE7E9FAD4BC358528820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A3C41C6524111FDC7435A15805AFAC11E2DD4A412015C65091268F98343FBF79F9410DD37D6E484A95C0B248285101498EA279F2A3E60D0C10BB8F36D23C45AA11CD59401D4924563E60D0DBCFF001C7CA08F5A79A7D01C656971B54C2D06526323047435B82E1E0852B3045256018CFEFD68823CE31D0FCBF7A208B571E6FC4F01A09754A5AB88140948E15030B1D3A538972BE64B52B78242323405C93D843DC24D4A5D0A6B356ACF50E39DB8D738E7DFF115F6C4D9AF637F67FDB4DE063772E1BBBAC1AE2DF03B2B2527F1CF5D38C396C9534DA882A0D3CB42DCE1CD284CF4AAAED9C64BC382F352E410CE32C9AEDCDB5689FD99B3558C50051541B9142E4EEB3D2DAF611F975EF2F7D5B63BEBDE46D36F3F6C7164E218DED5E3776FDD3AEBEB75C66D5178EA6C9BB752C952562DD4843892609C84015CA36EED295B8A295EF1ABB106D50E34CFBF38E95B2B644CC3142D6592902CF60CCFC18FF548CF1B05BB1DF0EDE26CC6C96C06D46D0D9A1294E197383E18FDD372EC078DC2DB0470C9CA0F2CCF4E1FB73C45829626A9588952D52DDC4C50750D031B9B679657E8381DB72B01BA161F75B7788AE763CFB0CA376B63BF8757B536D1DBDB963763B4ACADE1C454FE11789038BDE1242758C8E473CC93A57259BF123032316A48FA994438DD3D4135ABD357789C3E2BC2CD48514EEF16003B379B77D62736B7F8737B57EC6DA1BCB9DD86D2DEA1292A09B2C1EF1C591130014807FD55B303F11F67CF425090D40EE0573A375BD4BF087DB376F613133025050A0F5620B372377E753A18D3DDB3D91DABD8BC66C702DB3C0712D93C5ACD6E26F2D71CB65D93C82B82D8521C1C43887E59D4C413CED9B3F6B49DA0B4992B1BCA228E0BF519B699C5BA662A54DC2AB75988EA0B3963DEFCCDCC7D13FF00E9CDDDBDD5EEFA37D5B697765E1B7828D9DFC05FBE8E1688B861C4385A77A119647D729AEC7E1C401F2E8080CC59CF337A172D5AC79DFC7C903E6BBA9DC84A43A8B3D407AB67A0ABC7DB058A38D86D695A5423549904C09835DCF6497C3279379C701C511F394002189BD0D4E6D1209494CCC671FAD4AC368AA8820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A4AC0319FDFAD10479C63A1F97EF4410718E87E5FBD1041C63A1F97EF44115032268823DA20828820A20828820A20828820A20828820A20860F2149716EBAFF000319402A80206797CE9057F23CFDF7BC11666D2EDADBE06C1164D1BD7D2098653E249F4CF4CBEF2C41166E05BCBB7BCBA51C630B7EC9CB8570A1C71A0DA441E104151CA4C41EC2688232C5BC9654B5A85CDA3E029224AA124663A089F97C48224ECDB61A6108B7484340A884A4400493390CB5A591FC4756EF0439ADA08457F98FA7D051045344116D62CFDD61C9BABDF716D0485A52A24F021225D24682132673F4A8ADAFB59381C217207D24BE74239E55F3D61EE130FBF346B4E01F2AF0C88EA23E367F8C3EEF77F5FC42FDA8706DC2EEA2EEF2DB775B1572A6315BAB75DCA6C6E5388B4D3AE788B6789A5F84B43807101C24419AF2EF8CFE24CBC0CE9FBD3095249F96970519BEF54D9B22CF7B18E9BB025FC94277F777BFDEAFF713715CD99983F988D9AF63EFE047ECE7B90C1B0FBFDE660ADEF076990CB2F5E5A6256F6D8A61697D438C8436F36160024F1839C8AE05B57E2999C66113882778108564697269525F3F38BD7F9094C94EEAD237B2984351ACE5BB3D63B05B19ECE9B98DDC61CD33B2DBBBD93D9BB665294B16B85E176F68F909802108004981A6624F3135C43C4BE3138A54C57CC7DE2436F56A4F17A5CEBCE23B153C4C56E041537FF1121D2332C6C34F4148CB78761B6966E8559D93F6481012C7861B291119240301433F2D35AA12F18668F9EA2CF5AF0D78039641B3A4252E6808604115078F0A173C34D5A24317167736E59BE65C711C2414AC05020F9E5E5CF2E734BE0FC512B09352952EC46741AD29AF730EF67CE5CB9A3E42D285121EE120D09B7534C985E38F7FC473D89374BBF1DD4EDA6D3B3B38D61BB6384D91BB671CB7B4659B8B95B2953A0AAE024AD45296C2046931AD778F03F8BE4CF99282144311BCE456A2DABD6B9DF9741C16D4C42657C9C42E5B28109DD35B5779ED95ABF7B3FF00F4F9EEA319D90DD0EDC63D8922E16EED0DF8B5B75BE1456EA307BFB8B702559ABDC4011F488AF68782270C6C894A0E4A8249734B86BBFEBCE39478DF1BBF3378A80037C12E1C3D1F5173D6B58FA6FC25C53962CA94C9B739A7C2524A48E131307918915DFF00662372424337D3F88E233CBCD59077812483CEBC35FB448D4942505104144105104144105104144105104144105104144105104144105104144105104144105104144108AFF31F4FA0A208A68820A20828821647E51EBF53441155104144105104144105104144105104144109ADD4B7A83F7FEC51045958D5E3172EBD69E25CA1600109308CFA798FB148ABF91F77AC109605B396885975E6C5C2559C3E0288E7CF2E9DFA56B043EC6B6770BBCB77FC4B0687829E2654CB490E056B918EA069C851046161B6DB43B3B72E30AC3EE6EF0F61442129694B5F082604640E9CBFD10465CD8DDB6B2DA6C383E8B67AC9F6F272D1E4043A0CF240CF3D7BF6AD3E60058127562D5CBBEBEB045EA8B84ADA0E942900980958856B12474E7E559F9BC55EFAC11EA882B81993F2C86BD3E7419841673C6BD7FBB41082EE1A6D6B438A08298CD4400644E46B066D0D5563EEF19170FAC6B27B4DEF217BBFDDE6337B68BF1B14BE43769855B33EF3CE1BA5FE1DD52500F11084B9C448D0024E715C8FC7BB653230D3D1F308514AB76BFC6878E7DB57AC59F64618CD505252C10DF31EE4AACC1ABAD79651AAFB8ADD4586CBECB8C7EE6DED95B7D8FAD7758962A1224B6EBAA759487A3C42B6D973848568A112057CEFF89BB7277CE9FBB354594AA856A5D99F8E94B333C5FF00012CA081421830565A1F4A371E7B09636C6C4ADB45D5CBE98042DE5F12CAB55051FF00A857E5E511E47CF3376B6297356D316CFAB539D5B36F3AC4F7D6A4212B4CB3BAE086A0193529D33AC797AAC42ED4DA0A2CF810A9F1784F8E04823DECF3FBD29862264F9A1D44DEAD7BE7C6FE56B0D44909720A9943F893F4B8B3701A449B988ADBF75B425C504A4788E895929039F6323F5A55789F978420ACB806A491E76A0E19650C66CA284155537648A015CBC9F9B690DBF1A5FF0076EADD95248E4993DB5E9DC4F5E75CD7696D5988C428254582C3E6CE79B71FCC35953D52D745117A83DFEFEEF8A37C96F60FEEFB1F6EE2D9B364E5B969D4292381497429052444199C875AED1F0C36B4F9B8BC3A43B1525EFADF4EE474CAC92316A423E62D64A88A026D4AF916D3A45C3EC57B23826C66E3367ED365F09B5C3106EB1277FA4C21A5A94F5FB8E294BE0E64A8C1EE3AD7D51F84A93370787047D44249241E3566E57E4358E61E2A9E664C9CA2B5105BE924103CF37A664C6F95AF1F80DF88657C2388832248072F8D7A525A021200D07908E7A15BCFC0FBE5CA1C5291B414410510414410510414410510414410510414410510414410510414410510414410510414410510422BFCC7D3E944114FBBFF0064FCFF006A208A8249008220FDF4A208F780F51F3FDA88214488007DEB4411ED1041441051041441051041441051047848027E5D688222DF773E7EA72E5AE7F64FC48220578797AE4BFC392C8CCEA741E7AD22AFE4608B86C5AF0841CBAFC3B9ED5AC10929775F89B801014C80380998329CE3B7DE74410CADAD6C9DF1BF1366CA8CC9E3427424E79F59E9441186DD79EC1F780EB966DF87875C2D03C240842211072190939F39FAB259AB07073228FEFF0030466C2E2AE5F6024FF4D29E254130AE2483D391F856AE753DCC10A5C5C1B40FBEA9E11C013AF3CBEFEE300AB3513C6D04446216CEDFAEDDC4ACB49852DD5494C2520193D3219498AC2D442165CD12A373A18C8B86BB86E71CE5DE862973BC6DFEFF00212E7E236536023F1E12A2AB77DCBFB70A678A4F028A1D1CF307A9915E2DF8C1E334ECEDA33F0666B315021F813DC7987E71D4FC39840BC1A5652904E6CD6377A0F74BC66FB36DBB4C2587D88E06F8901034080AE14E404649033E990EDE20F16EDC4ED09B30EF05051373435B8C87DEF16642129510033588018937ADE95EDC22590A0E202D26028498D67CFF00DD51654B0BFA88CCDC31CFAD72D1ABA43C4AC001EA78DBAF0D0BFDD839289199E83D358E5D3AF5A6D8C9D2E425449A797E32CB9D32541053BB40C439D1CE5C7335147610D56E24B9075E632EFF007DF99CCD57B158EDF96B093420D34D2D5F778D9787DE946809AD49176F74E59BC535503825E2A7B004EF2AE7526A0B7E7ED158992CA66804B549616EADEF84620F68571D4EE9F1566D64DD5CDDE1AD3694FE6295DEB685E999C952794666BD1FF0AB602D38AC3929FF00720B805AE3D7EE7A494B5A84BC8848BF3D03E9D78D236AF725B3AD6CE6C060384840496ED10EA931C2429E4A5D5748F789CFE35F55BE1360BE460E43803E8431B56DC78646B58E6FE235154D9ADFC722F4F747AF2CA33D5BBA3C24F1647A65CB21CFA0AEF4A67A5987A7BE778A6243121C1E5D6FFDD216F151D7E63F7AD6378AC104023434411ED104144105104144105104144105104144105104144105104144105104505694983AFA7EF4411E78A8EBF31FBD1041E2A3AFCC7EF441078A8EBF31FBD1045054D289F7E09E522474D3CA882105DBA97F957944E4743CBEF9E74410E59429B6D295192264D1042B44105104144105104144105104144105104144109389242BDE0001CCE9FB4D1045B57B74865478B88C4CC73FF1209F5D288225B0E75B7ED1B7384E723319E47BFC7D6932824921BDFEE32013610B2D694C8022798EC7B47C72ED4990C723CA164CA0AAD85BAB642FDCF78667124A16EB5C6DFF004C0993EF264492AEDDB23DE88DFE466DD03EB9790C83968B3711DACB1C39C2D2EEED9F79F3C286587029D0498F7933AC91F5A23030E4BBB86E5EDF87E229C130379EC42EB13C490DA997FC35DA367FE46C47BC5615A7148E1035ED35ACDC12B70AF79AD406A59DDFECDC21BCC1F2D401B17E3EF236B18BEC2036DF0B412956504F200E9941D341A77E906711FEB7C904EFBB1739F063EB0A84A481561A8F67B656A44462D78D7862DDC9487149F7E3DD94107CF5C865AE50273B1E1B63CD9F2FE605BB07202AB5C855B8D78F08748C0AE60DE410DA532D6F56EFA462FDEFEF230DDDFEC5E278D5E5C22D12AB376DED7C4586C97DE41619E19227FAAA4E633CFCAA8FE2ADB523C3B266AA7AFF008CB5B82A1FF13C5A8C73CB38525ECE5CC514A6AA494BEE976E63D75EEFA05B91B0C75DD9DBCC5B1C478DB41B497770FE2D7484AD41DB745CB8BC3F816A1C4A86149078B2E432815F24FE39F8E93B43C518932261DDDF50001D2F47A5ADEC760F0F608CBC000A71F4FF00B8D0737A57FB8D87B5BFF0D3FCB1E65E408010B526100E5993CB3CE73E95E795ED799356E54482753AB96E678826260E11EA92E03B101FB51DCE629F68B92D0165A4B4B3C4A124A939A7324C4E50454B48DAA809DD20BB5E8C7F5EB09893AB5CDC90694AB7AFE21DA4CE71A9CBBE83EB95426D19D3315BC104806C051EF42C076D7ABE486247BF6D10B70EA19B8216415023DD1911F1D7FCF6A811F3503E52F7897E94AB74A7BBBF96B4AA5697BDEEF5E9D876878D02E20B8AFE93600256E7BA8CFBFA67DF49AB16C7C3854E4AA60012487F2B3D9ED71C6ED1058993BD314A4B3E82FA656E1D58C618DE4E3981DCE2182ECE5C62568E8BBBA415B61E49092CBA858E313919194E875CB4F587C3618695370E5D0900A6EC0BFDEF566A5A12FE32D60A4BEE9A0772CEC35A8B746168DD2D9CC5ACAD3F0564CBCD5D7896D6E96FF0EA0B0809653F9A208D07F800CFD0AF00ED5C14991210264BFE2960142EC2FD0DB5E158A26D2C24CC4C954E52552824A89F9819C12599E873CED1909CC52DDB70B706404E4223300F977F9D77594B913E58989C44A0E0382A0EEC38FE69DA2AD2F662948DE4A98126A74761D34E70A22FDA5E8950F3F5FDAB55AE52003F3659A904850CBDE709CCC1290F576CEDD6D6E6444A34F23813C326674923BCEB07C865A5335E325A4B0208D41E5D3386AA96A45F26E07D8CCC0AB9099046604F0C67E5AD23331E94644962C067FF00DB6F65A1B99890ADD37E7EF5B3C788BB4A92094A927A1107EFCF3ED5A2768EF16DD20D1DC0CF8D7D2174A0AC021AB50FFD7AC565FF00FA89F3CBE84D4A4A0A58DE2CC6DEC0F7D9F3F2D4ED4ADAB4E5CFFABC79E39FFA8F89A5770EA3CFF119F92BE1DE2B4BB2341E99451B8751E7F88D770F0F7D2140A07B1FBD3AD6A43163946A43163945548AD6524D0306E756E3188A0AC0EA7CBFDD227120121879FEE0838C743F2FDEB231209018579C1092AE1093041FBFF34F512D6B48506AF4848CC67666E37F231EFE21249804C7435932D42EC1F9FE23433C26EDCF2FFF002848DE278CA122549891CC489F877A426A8CB2D4347A024D9CE7FBBD28635389A80002F9BFE3D87EB09AF1065B5842D412546005644F909FD67E94C958F4255BAA0D56AD3ADF8C60E2802C401DFB33C7AE2D2525D198ED9CE5AEA7FC548C9DD9A84ADE8A7A8346F7C6F02A7ADDC27E9362DDF87115ADA1AFE2D80095389491FDA489F818A658BC6C9C3024AD34A9721DBDF0D03830E657CC9A5820BD1A9ADBFBB738B4368F78BB23B24C2EEB68F19B1C1ED500A8DCDFDC22DD8000CC95ACE83E755D9FE2BC2C956EA88E7A51DCFBCE26B0DB1717894BA10A3C0073D83FAE91A6BBD8FE257ECB5BA7656E621BC1C171E75BE20BB3C0713B3B9B90A4EA0A14AD7B76A64BF1C60104825D9EA18DBF7C62CF80F87DB631D284C4A02378D1330282868E32D7567D239FBB45FC797D98ED31FBD6AD30ADB7B9B7B72800DBB366B4AF2FED21C00F383A66075A8099F14B672715FE36ED49005BAE74EB6E313137E16ED3C3E1FE74E22953BBBCDAE9D39C7537D943DAB3653DA8F77184EF2F636C318B3C1B17F185B5BE2CDB68BB3E03A5959525B5149F7812209C88E8455EB656DC95B51095CAA6F65C3D7AE6C639FED4D953366A9495D4A0B1777ED973D637090EF124129209131D3E3156058280F43C8F2E1C620D13378B311A93D721CA2AE31D0FCBF7A13F53366FE4FF0088557F43BE515020891410D431AA54141C47B446D051041441051041441051041441142E214329313D4FEBA510441DD61FE31396B3A67F5FBE7144116EDC58E2ED38A45BBFE1B00FBA9E25089CCCC69D75FA524B51721E9EEFEF9DA1E61D28287500E4E6389F7588F5D9ED01822E675CF8D47D7335A43A094E4057AFAFB31430E5C38DDED93E034FA1290BBB57BA973881885E731FBF9D101166715CBFA3D85333990D706D8FC2BDDBEB809BABB0A2A4B8785680AE23A1226040D3A40E704614486622D576F6E7215B68F1925A49084050485240108D0002123E1197A695AE331625C929CCD88E4D41C751DA18CD413535009B8F3F261AF011497614467AFA76EBEB1FE6AA5225AE662F780533DCD337FA587BB57368AC48954CC137F74A9A30A5E18E236D6D76DF84B212E6AD9D0A888309D27400E7CE3A55F25E32660A56F95B0082F91A248CFC9F4E912180C7294A00541B8CDB3CCB665EA0718E597B6FBB8CEF0369B61B73F845CB96CFE2578B7AE54CAD4996EC1D6AEA1C89905082065067400D78CFE37F8C4A7FC994164B058A13620F117BBD0718E9BB0F65CA9F2862124013189529A841D73FBD3AE68C1997B05B7B2B266D90CDADAD95A5B97B87852A71A61B69C515692541473CABE5CF8C14ADA3B5E762007056A2146B43E77A791D22FF00224A30F2848241DD01F7454BD6A1D988E2ED17336DA5E22E3C443EB4E7C2D90A333066333D32CE67CAAB08D9EA2E40A92CCDCAD46EFC808C198949284A4A121C1DEE232F4EBAC4DDBCBCDA5650A6C1905247BC08CB31F4CCCF5A7A8C1AA8198B54E8F95B8356D0D17300A3D4E6FF007FEB38916DAFFAC18D32FD33F5FF0074E656CF35A10491522CFE8D5E5943698BDEFF00711A9B69FD311C231A6F0F0ADA2C5ECD769B397D84D95E70C071E756DDD024E454532476CF41CB28901B004C4098CE74B922D50DEEA79624CC095AC12B3BCC5CD5218656E02B7C8EB801BDC96F571869C631BDBCC5ED5974903F95624F200049309E21D08E5CA9038656115BCCDBACC2D6ADBCBED1BAD6925560750CF4008E397DE2DC77D8FF000A7AF6CEEEEF6EB789738C30B5AFC7388A576FC64CA4A5447140F9721573D81E2B56CD5A1456A1BA430701BCF26A1E1A1AC7CC595294459C5412E4B74D2FECE44C1F731BCDD97BD373856DF628B602006138B624F129012520980069198CF5EF5DCB60FC619D8308099EB1BBA28F0E34F40618CF4A672548504AD2F621C3F1D4E5700DE2FDC3B6977D9B1CD2157ED5BED132C294A5DD3097EE94F02660AC91309CBB1CB4ABCC8FFA81DA4852509C5CD01C0AACB3578E435111337092C277004A5811BA96043BD59BF558C93B37ED2EC17136DB4BB3D88583A212A58B50D3614041CD674CE672EF5D0B617C73C562952D33F124A54D5DE27CCAABA1CF38839FB28B1DC52C924B6F3B6B4D2FAE7D6335601BD0D8DC7941FB6C79AB37DC88B4B9B94204CE49080499EBD08EE4D773F0F7C42C163928F99392EA6FE4A0D5B9A97B674BE510D88C0CD4072016D3F96879F6ABF01191BC67EF5B4B8976DD76CE094BF6EA2551CD5C432939673E75D7765EDAD91884A54B992882D5DE490F9558F971A8688C560D2545D2CACF7A84B016CE8C5BD6CF5B6E069210DBA5D4670E2D4173D4714C64646556F9123093A5A66A11294156290922F46A3380CED9C2C896508B330ADC96FC5AD9C48B6E92331946503AFAC79D23895A70E92D714DD1DA83DDE82125ACB543317E3C21D0526341E801FAD468DA254A6097E3EC7BEF0D97308B5341FD7E5BEF5A4A4E994F2FF1A7C3D69F4A9E99A2B43D9E9E46F639776EA9CB0ECAAD3A67D7CEF0BA220693F3D4D616A4A5443B935157E37FECEB0A4B51525D5724FDA2BA44A4ADFF00AE83DF38DE102412634FDB2AD7FC71C3CBFF00D608F2B230E9F607EA086EE708566067CC810329FBEF4BFCEF94022CD4B1AB572311B389DF60F6C8FD87BBC15A1C600F9B5873BD1F58525CBF983EA4D746A5CEA0E82185F3B656ADA5E7DC5214A39F86614A8319CC4C1C8672396B934993D0B503BC1D4ED5CBA16032275A43D95B3D730EE84D732065760CF907A88B3B6AB6DF65765B0F5631B478BE1985E18D214A55C620FA185A40199E224267BEBEA29B4C9725492A2536A03F661EEB4687B2B62CC98BDD32D4496FA98EEE84BF06FEE3955BFDFE30BECABB8BBCC5B0D6B68713DB3C5EC12529B2D9BBAB3BF4F8A50A29496F8C2A01D408CB903542DB3E3093B2E62B0C998A0A4B8A1A6BA81AFA3DA3A36C5F00E37192913552A57C823EA0C77EA28D6F4E85A388DBECFE3CBBECDBBBEBAB7DD3ECF613B3D8195AD2D398EDB3F6D8B96E4F0AB89973878C8CE4643280245738DA9E3D54C27FD4357ABE5C6B9D2F46D6B16AC3FC3D129BFD206B761992DCACDDDDDA39D3B6FED7FED39BF5C5311B8DA3DE66276F86DD70F16096D8B5DA18680490B4B76EB51090A1DF3CA6A8B8CF15AE62C8DF24AAF527EFE4CDCDA2EDB23C1C990A4112D346B8C9EE28FE51AE78DE39676ADDDA71AFC6DFE22B0A3F88BA8778972493C4A20E67BF3CA342C7FEFAB50BDE97AD69E9E51D4B65EC544B4005291BA34A59CF6EFC811185B0E606278AF05B3AB37B8B62D85DA35689325297EF1A60C379900A57396A290C0C85E2F69267392EA15A117EFADC6B5884F154E461A42E582032482006B7E473CB468FD14FF8766E72DF72BECB3BB4C19C6CA2EEDB0D174F248851388F8770272CC8F167EF2F5578370DB9869273600EB517E793B5695BC7913C598BF9B8BC44B3FED53825994F577E047D9AE23A1A93C494ABA807E226AFF882529000A65C6CFE6DECC52B0F55BDCB9278302DE7CFD60041CC5664972068FE6F0E27D52DA8EB710B2343E7FA0AD95FC8F3F4A42328302346FBC57588560A20828820A20828820A2082882122851513208310348A208560741969DA8821A3D6C1C515152B38C81D0F68A457FC8FBFBE9CB942B2E66ED353E5EDF586CAB04ABFB9D1EA63F4CFBD6B0B7CEA30207FFEA9F6880C6F6751895A1B66DE76DD6A20975A5702D4279A867A081D46BD0119130D492492D9E598EDCF8C2D85E088C330F45936FBCE2923375C502B3273CF4D39FA5119F99CDBEF639B5BEF12008B5050AF154948F796BCC99EA7A74E7F5A467618CF0031700B3FE3DF2816A0A41248B331390B505B87DEB152805A4B8D9E21049CE4E43B4F4FBD4AB84C0224A82D4056B517A93C3AF663157C6EF952B75EFA114390A7363722ED68B7AFEE12DADBBEB8712D34C3370E34851E152FC36D456540C03F964768CC542F8A368CAC360E67D607D2A6FA99AE3CECF9D4D6253634A9C54860E094B8625DCB1CB4C9BCAFC45DB7F691D911ED23B53798B0BA7F15C11E6ADF675868A14AE37982D5C00951E3954641199244D7CE8F8C38D9D8A9F88521649758BD0D59A8C19B2B47A5BC298290AC1CB92B037581340E480F9687BE5568CBB84E39BDDDBE71972C1BB6C1B01BA585316F8925E63134B6A5492EA40291C5AA0E85275E55E47C46CE54D9A4A85779553EEAF52D121B5548978829960519D839A00D5152D4BF03C636D763765EFB02C350BC42E7F1576A4F12E1456DF144C0E283049F5035AC4BD937FA43BB00C41E449B0CBCEEF15F9B8A2A59417E2A0EDA70635ED98117AB16AFDC3697941A41512385220009240D27BCF7A7C8D904B7D15F27F2D7422838C3533C2014825441B90E7BBB43D459B89E69D3BCFDFCB4D29C276492A622DC1802296B1E6FCDE105621F3B59957E6FF88A6E703B2B8683A96909BC2656EC09510444919E42227A6B06A625E125CA921012A2B63BD620F07F7D2F088C5CC44C505281416DDB922D723956A5853587B6B87B4D33C0F296A580608323CB965AC79F28A86C5ECD4CEDE0DF5170187BFED9A8F189B899A4FD0CC4DCDDB872D3CE133873438D456E05E5C1044089D3991D79C54327C3938A8B254483F4BDABC72A5A03314A29DD2376CAD6DCB3E6C6D94242DDF7521170195849212482441EB3D80F86752786F0E63A852086B81A5FD321F78DBE9DD26CAE19F3A738F51645B5296979CE1207FF001B8A2D8408C91DF9FC69E0D97324ABFD451749FE24E79F115AB7A65A6EA492E91FFCC456B98BDBADE2DCC67671389A148FE578392ACBC47191C7E64C6BDC472EE2A57098F5E09492950013A65DAB95C1343586EAC3862417E7DA8C29EF40D8C712DCEE1D8CAD6CAEFD5835E364290E614E861614731275FDEAD381F8838BC090113961233DE37EED969DEB0CE6E0D2B2494D6AECDE85F864F9E822350FEF4F7560376589BB8FE12DCC26F9E7AE6E3806790100E444E9A4559F0DF1AF6AC8094A71539280400CB56B5CC0E43BC319BB39054E101CEA32BE84B7F6D431943607DA57673137D9C07692CAF301C552AE05DCDF368B6B0796A248F016A32ACC00ACBF3111DFD31E02FF00A81F9B80932313892576FAD7516E24F13DEAF1058BC1A82D4121806B51DF2F57A74A46D2DA6236D72C22E18790EB0B48521E4AB89B5057BC08568723967CF4CEBD0FB07C6B276F041F9A0EFB31DE70FA82E5F87488C9B2181A392E0822BCDAFCC5697687CBC4ADEDDA6D450B794A2470B602940CEA474CB289D0E95D43038144E4158DD60017C8BE64B1D73636BDE21E6A56926967C891CBD3BD9E1F255C680E04A803FDA47BC34D47DFC6955484CA528A4BB1CAC4559BBDA90C26129C8F4BBBD843A654481FF975D79C5472D6EB22AE0DC9B30CBB7087D20BCB079FDA14592001D67EFF004A7A9237732D702F5261588EB8BC0C29280CBAE951CFC34C84CF33F7D69CA64EF237F7D22B626A5DEDC9ABFAAE5AD6AF71CE2BB8B945BB5E32C1298931A8F3F2CE7A4674829494920A998B7AFE3DD1F1112DE356F72B73C169D5A1A897801C19CFF74F633D0014B8952E6A77C9497147A9A3BF2F4F386C70AA98A4B7FB89B7DF367E50C76876B304D9AC02F369318C42DAC308B0656F5D5E5C3A96D96508924ADC3EEA6025524FC63484C7997252A5EF064BB817BD1AAC28EE747B9896C1E109989941277CEB6D79E8DA18E0A7B647F1CEF672DCD59639836EF71DC376DF6B6C92F31F87B4B9B5C46D9BB8014801286DC0B052A1EF4E7293A72A26D3DBF2F0FBDBA40A666CC2E3D0E61FBDE3666C45AD43E67D24336E50915BE7406C3A068F93CF690FE27DED2DED3D8CE22FBDB71896CA6CB3AEB9E1E0985E217564A530A51848B7E2289E18303204F3CEA958CF1B1438334B00400154CF5E83BC5E70BB092129FA0BB8A33E62BC41D7D19E352F655AC731FC4978B5C620ABB2FAB897738B3CA73117540FBE5F5E739E692732233E75CAF6FED39FB4710A9A851AB9727D2B5E14A748EDFE1CC148938044B28E7415E56B1E3EB4CDE19526DA54DD895369F79C00F1E594827B0FBE74E9F2F12A7FA946A6AEFEC657CF8C4E2A4E140277464C186B5CFDD1A14C3F6999B26CA584DB32FE61C7D43856E6A004A844C4C08EDD2929180C44D58241041CDF3CE95EC38E51A7CF91203A4806BCCB52C33AE6D912F18537938DCADEC41CBCC482585202DA65CCD7C6A480509332003249D055830BB1672EAAE14A6BD73CB8D5E31FF7C932412E2C74A30CEB95697A56CD1D0DFE14FECC175ED3FBFCC3EE2DEDAE2F3677642F70FBCC5D7768E34BC55C0FB019500524A16DFBFC530418ED7CF0F6C55267CB74BD45817A5DB8654D699C722F1A6DE42BE6913004905892181A80E6CD501AEF5CA3F431D9BB0B7C1306C2B08B56C2AC6DAC2CAD136CD2415B26D5869A1EE400904A24EA20798AF49F8730624C8410186EB579598F1F5B078F2FEDCC519939656A054544BA5D98BEEB74A3BDB52232234A3E1254A82607E5F8019F3EB53D8B6000E7EA3F0623F0409054482C00A5AAEDE5F8E752223D73AD30EFBC092F42DFDFB6873882C87F7710E11A1F3FD052CAFE479FAD611945C13AB7DE2BAC42B0510414410510414410510414410510414410520A0CA3EF8FDE082B10422AFCC7EF9511973A9EF14D106F1D4F7860DF8CAB8BA4BE10AB684F8204951CA4F148826748F2E735A9C5A650751B02CEE7EF4E7A16778C09BBC580AE84063EEC6A6F9443629B4786601875DDF62453656B6E852CADD86D30013CFDDE5CCF6D74AE6D7F1548C14A51DE09DD06AFA5433177763D69430FB0FB3158B50F9680ADE672059B57CCD581E2F1CDFDE56FCB787BC1C6F12D9DDCD5ADB5CD98E3B5BDC5313438BB669B7125B51C35E6090161255C53202C0D6BCD7E36F89328A66CB137250A9B5C3DF507A3F38B860362FF008DB8A5218674B659B50DC509AE9168EEABD92F6236318BDDB2DA2B21B57B758E3CDBF7CFED0A1ABDFC1BC1D24FF2F2A4F88D8014A8933091E9E5CF106D795B5A6AD5BDBEE54595506E0E64D281B325A2ED85DA3FE1CB32FE61960060A0A62E1A879E7964CF1B9B63B1D86E1B6ACB8C3447B89290E2471A724FBA3A246881D001CEB9D62B664B52F7D018073614CAA3EEF4E108AB6B4DC54D50984153B1527302C78DB8005DC9891B64F128B440E10787CA63491A7AD272F67241FE2031B8041200E55E34EC0C6AB98A0EA2C5DCDC9E1C3BF9522585B86FDC48303CB9E7AE9F3A792F673D5A8C031D682DD1BF30C264E5283871AB0A9B0B547BEE785D95F0FF0014ED1B2C33EEB16CC1AF260DD4F7D10F9A599D479B7A8CA3D09E1CB3F5D6994EC0284C6018756BFBB423F3EBE66833D6BEF8C7B4A48D9C1C2D6064F47BD6AFAE5C7BC3844DDE00062D71E9D385E8D14139E5F993981C8CC4FCBECD4EC8D9F86491BC9191B015E7D87EACE12A041191BEB476EFCA1322091D3F6A974C9C24B05928A248A00F6CBEF0B82E1EC4E9CCC56940201CF3CBD7A695CBFC452A69C72CE1DFE5BB0DD2D95CF3F57845530A0EED2F753D7367D6A2CF9F5ABC2ECAF87F8A869783C44C0CA4AAA2D56E1771F9B88D7E6162412599EA73D397210C8E0F6C1F55F2DD5071504A240D073CA7A7E9DDEA36229406FA40725BE9E37CB3BB346BF31CB6EA8F162C6D639F56D213B976D5D4969DB64BE902389490A1D33F3D3F4CA96FFD3A08344922D720F4AD9C3F93C6C4004A98BF07E568B2368762764F69EC97677383376D7290A2DE24DB084396EB2642D0F1CD241CE6397A544213B4B66E387C952D3292A0480481A5851E95D7267845782DF3BE405050240CCE7A54B861E4D5318B707B4DE4EEAEF14EE0B8CBDB5FB3A544B96F7AFBB7CE5AB4924F0A12004208048E7A67CABD2BF0F7E224ED9864A67E216D2F75C1516AF33F8FC4362B6703FC5212EE2A08347B7EFD2367776BBE2D99DB05A70D52D16F8C3502E2D5CE04A90E1904044950CC73123E75ED1F097C58C163254A926783BC00502A1C19EAD6627D728ADE3302B1FC523743B8CEB9E56CE8391158CEC16A2DAA0057BA4A38648D32E5F0D632CABB16076A4ADA32C2A52810A17497EB47CFF262066E1EA686DA6432D0713C4F111E58ADCF0506E3DD72552279126358E47965D28988DD9B7725C9D052312D3BA902DC0C3C52D2A882329D48EDDE9FCB4921C0BFB17FB7DE3788F7D01FE34F8A5942735ADB3C2B3D33CF29D7D7AE44E9A99128953BB6593E5EEEEF187AFA9C873310B718B58D95A3A1E778AD5A0A2EDD5C94964093C456BD00027B0EF3548DA9B6C4B593BE46ED6FD43D6B5D736BB53748ABDF22E282A19B9F7BE4CDC7DF6F5FE2F5ECE3EC4D86E202E2FAEB6C36B196969B6D9ED9272D2FCA6E4A6129BEB6E30B0952C8200CE388C659D77FF5FE1E4A861953909995AA94C2E5DFCEE6D5368B56CED96AC44B44C4A014577C815625830B39B13C0B111F15FEDC3FC6A3DA8BDAF710BDC3F0AC7F1DDD06C3DE3AEB565846097379818BDB75A8A529C4184AD4DB9C42240CB356550FB43C609C4AD72E4CC1398FD664AB791517D0EA7AE6C22D5B3F634A97BBF4925FF92C7D4FABF0A7ADA395F84E078DDE622EE33893ABC531ABA597AF2EC294F5ABE552A0E070C2D4B20F12C9D5649E66A83B4F689C5297F2D4ADD36DEFE56620E82EDCFA8BF6CDD9E12120A4134AD08EA7FAD38C648C31FB5FC4A18BF47E19F1C291E100949E44C9CF21F03C8553B1180C5CF5B82ADD7767367D2FEA783C5BB0F864A775EC187D5567B90E07F4C4466CD96B816F72B6997896C04F01E29CF84731D3C8FD625709B2CA640F989753177048F57B171CF361163C2E21725210927746552D7FEE9F78C86E5F3C2D5E01D3F96667E1AC1EFA7956B330528120A6A08CA9D72E17ABD61EAB10B2C9049CCD781E6F4BDDCE6498C4B88E32BB40E3B7971E1B685136E4AA38D45449199CFDECB2F8D2B230B2CCC0C81CC0A3D05B3BD39C44E3A74C092A06CEC3837524FEA31DE39B4F717EB16CB42DFBABC7ED6CEC6D900A94FB974EA18494A355105C4E911CB4AB56170B2804B804532041AFDF2EFC22998EC64E439DE51BBD4B0FEAF957B1FBF2FE04FEC896DB81F662C136DB1FC33836D36C6D85D622A5B205D34D78CA72D64A93E20059746BC87202AFFB0B67A4AD13129B33306BD1B3399A76BC71DF166D19931464A95F4AB789075150D503DF48EEFD95BDBB3C4A67371E990A8CB52223489CF90E935D87038712B0E80C599C96BB0CDA81B839EB1C7F1B89F9B3D8549D7514AFB01CDA25D8694D3010A571112A999D4F144F3A6D8E98CB1734A0FBD876BB44A6046ECB2090E58D0713FAF6F0A224054093965EA6B6C2972391F407EF0A62BF80E7F88748D0F9FE829C29DCB97E36CA1293FC7B7A98AEB585A0A20828820A20828820A20828820A208283404E90426A58989223A18EDA73CF2D4532F9DF327096902B4734F7CCFEA36092438F7EEDFA8A38D3A052893DFA7953B54ADD04BDBDE43DE51A2F7902A070ABF93088C77114A2E0B1E138B331C604A64C6A67BC9903F5AAE62B6D4AC24C3294952C82CFCDDB3CF2BF384C6F28D378F04F36F7ECC2AE5DB698E24AF212A29CF834FCC7ECF6A98D9D306D097BE92CE1C0A7637F6F0BA70EB51DDDE21C3B17B67A03FDDE2DEC5B1FB3C3ADAE31572ED962C2C5B5B972FBEB096CA5292612AD388C10419CFA662A9DE2CC6AF65AD692ADD090A2429B9D5FCBABB185E56CC9BF3A51049269BA5DDBB5732281E39D9B7BBC0DADF687DA0B8D99D8470586C8D83AA6713C56E54B698B86C9215E0BED92DAA0A5691235307531E55F1E7C424C84CE97BE428053170C2F6FC9B9E317DD9721184402A439A1500DBC454D985B36343934664DDE6EC300D8AC0DAC330C75C200972FDA523F10F3AA3C4E9538912A4F19504C9FCA44F39F246DEF16CFDA78B5844C56E952AA0F13C69976062C93B169284FCA4A0518850147A061C5F57A5728C9E30D65B4B4D332EA1325C5BF9BB394709D067DE72CA29FEC3D978AC6292BDF25370E4BD6EFC2B50D4E358AFE2FE6CC7650E0C580CDECF7A1C83EB0ED4DDC7861A4B9C484880567DE8E84F6E5F0EF52F8AD97364CCDC25E81C1BBD6C19A86F0E30A7E5206F01BCEE5FF007EF46786ECD9B8DAB889124C920F3EBA09FF0011148A700C5C8F2ADED63966E4DEA61D2A7053B9150D70C29CF5FCF08921319EB4ED18548CB93DFD0FBE10D94B2682803DA84F33EC426A7529E44CF97EF4B09433096E03F50814A8DC8E4E5BD228E20A923E741C3CA374BF36FC424A9449AEF1E469D29482B53874D40602CD6B743E50B4A0524124B747A0A353D6E1F8414DE648985B74D9E9563A519BD5A1E226240AB5793F23584CA0924E59F9D47CEC1E35544CD2903FF2229470DC7CFAC2E89D2C2402AB727EB0BA084240CCFC2B28C3C84A00C44BDE99A90E686B535F2E1C6194F52A62DC1000E3F703EE62AE31D0FCBF7A5449C2972896906C1C0A33F0A75E9946A14A600914CC67A450596DC254B52E0C6423C8EBCFE548AB0C924EEFF10EDD790A6679E90A198A09A11BC727A0E2457850FEA02C3491FD3409FF00CB9F63CB23CFE1DD33849AFF004EF30E0587DE83EF78513369F536562D6A171DC8E6D10EFD95C5C38A0F381A6103DC4B248F132829781FCC397918D66965E0F0870FBB3100CD62E480E789CDAB6E22F487D2F1084A494BA89762AB26AC4A4D18B1B0CF85DAB9625F49B77382CAD888526C00429D11FF00ED1A2A7B81A9EB3542DA88C5E1967FC75196905C6E929B170E539DB33D2D0D66265B28A54A528D5D4D47B80EEC0BF105DAA5846BD6DF6EFF0013B1C5DCC6F76C9561F8F2B85C78DC4B56F745B0090C168712D5C20F10CFDE396822C7E11F1963F6762A4A66E21659401FA8B1008096CC9D72D6EF11388C2198414335406E3776D0D99B3E117EEE67DA770EBCC753BACDB65BB85EDCB29F089BC29658B85841582C970F88B052019E73CF9FD00F85FF001230F3244846217BCA5000B9A1714BD620315B266B19A94B807EA09FE4C7986A3871F88DCAB3BE57876C8BA520BCFF00190B41FE9848CD3AF2298CF31CE73AF4361F684ADA4533A5325243E42841E26BD74CAB159C4A55266143021E87D5DBD323A3C4938BE00550549001E2198331A7589135609612100EF2599C97146615BF6CEB1B4997F3684B1CF2D5A87F3EA230E6F3B7C5B2BBA7C32E718DA3BD69087504B5685C407AE1491010CA164712B888100EA467A550BC5BE26C26C991314B9A93BA0E632E9A8BC4A61F644D99BA405104DF235BF12CD4EACD6E6E6DB6F5F7E5ED28B7F01DDFE16BD87D81794B6EE318BF62E30EBEB8609502BB47DA25B59D609C80226BC87E34F8E7B3F674C9C962A3501B758F98EED46A71964786310A620B39760F605F95A3125A7F0C1F673C69C462FBC5C2DEDBFDA0716A7AEF10DA466D71271F7D47895C4E3A9E25210A242330427872E9C2B1DF154ED19AAC6C898B421C90016A0241602D6F4A5CC741D8FB31586C3225A92193725EBE55E74FCE16F685FE0B9ECADBE0D9C7ED304D9AB6D95C69B6949B17B0AB4B3B2610B2212A5292D9500204C09E94B6CBF8B0654C08F9AB05446F1DEB9763636A1AF4CA9328F9685329296A1147B54BD28F947C9E7B6CFF000F9DE87B186DE5CE0B7B762EF615E717FCA719B65BAE043613C4A4DD5C1425B1EF282120089D6BB3F87BC6183DA625283998AAAC16297C99ECF9F6033899C16365A5410C2AD6CA8D90FBDED1A02EB88B0B979448BC55B94153AB1C725794A5594C48E233D72E47AE6CE99849884A952D2491A034EA4F5A18B4E16626687B0CDC50F56C88CCD416ADA2ECC27690D9DDAD65695A161247826502139807491306329EB90AD316100ABE52581B5393861CE1D89E25CCE160722E2D5BD74EF172DCEF01BB7B7712B0F12A040800807389CF4FF0476859A852890189CAB53517BFBBE50E918E949014402CF7FC57BB4611DAADA6B9C6826C9A2E361A2B5B4B54849CF8B32390233D2233E54F307B3E6CC50AD1FB1F5AFDDF9C56D1DAD21285380287477ADC5AF9DA3AA7FC1DFD86B6EFDB13DA576371EC730A69EDD76C2DE1BADA2BDB961C55B5F29482E590B470A4B2E16DF6929702A20E99D5CB67F87F1535490154A67F4B1E5996A5F80731CDB6B788B0F21330A81234003F02DA0ED4BC7E93FB01B1D65B21B278760382DA37656F63676F66D5B9406DB422D9B43321090350991020FAD752D8BB25785968DE7269BD5156F2E39FDA38C6DDC71C74F5A83115DD29A5C017D403C8DE2EE4E1A5B750B4A885092449E193398112739CFD7CAEE89E94CB32C83BA02402C09D58EB9FF4E6291330330CD0B05AEF52280B0E41FCF8C4A21B73800594F144652447EFE597D2A33152CCC5BA012D6BF12D5FDB651338649948017FC99A99313CAF7AD7BC7A968A673067EFF7ACC80659FA816B5AB61A429387CC4B0A177ADBCBF10AA41020F5FDA9C13BC49D75ED09CB414062DD3A9FBC55588520A20828820A20828820A20828820A2082B06C73A1A6B04357092A910620C73F874D29B09252AF9C4589ED773A7E381261647F11D7D63DE11911023CB39FF13E5F0A5D33E5CC05233A000F31521EA74E7570F084EDEAB351AEF4B5BEF0D9684A5D04244281E3312721967F4CBD73A85C76C413D66600924D4D3215AD037BAB08DA4122C0F3AB7E351AF1CA20EEAE59B017F7D7AF34D61E96C952D6A00200499CC809198EDE672A8A3B5E46C1428CD584A520D5C0667E79BFA8689297294A28009330FF001EBAF0229F6BC6816DDE37B53BE6DA4BCD8DD8CBA5586C660EF70E23888716DA71343A78D6961D6E5B7BC35052083A695E6AF88BF12E562F1D3A5A673B3815A160455F419F48B860F0DBA8131613F31817D1A819EA1F3F3E394763B63B03D89C359C23006529B27004DF82948B953B3EF28F04020B854A93CB3CEBCAFE2BDA29DA6B9A42C2829F37B917B8E033B7030FC214CE48278753F8148C8ED5A316484DBDB28ADA4E609226559A81390C8935CC8ECCF95882A6DE0083BC03839973D79035B4094A941C8097CB870A690FDBE7E93F7F1E9F3CBA06C4C6A70410924815AD038617FB76D633B8751E7F8852A4F138BFF2166685120B541AE9C1ABEE820DC3A8F3FC414D44D39953F03FB8370EA3CFF108B8E70923E9AF2EF59F9BC55DFF0070141CABEF8C3271D83E5FE34CFE347CDFFE6E35FDF383715C3BDFDF1685DA3C4DA4F6F8E7AD1F37FF009BBFEE0DC5708528F9BC55DFF706E1D479FE20A3E6F1577FDC1B8751E7F8828F9BC55EFAC1B8751E7F88294FF10CE0666EBD9BD34A59E33F2D46CC7BFE20AD0E1021C6E8074A7DC463E5A8E9E7F88A82E0465975EF9F5A6EBFA32A644501F7CA32259259C41E2F74FC7FCD22AC484D013C2B4E8CFDED18F96751EB0D1D77357D807383DF5FA0CE9A2A7059D586AF5E27DFE5D252C18A401714D5DFA8B70866E3A0F383CE35D3CCFE9F3AACED762853598DF3A12FFA6D2B19DC4B73E6F4E74AF0885C55FB8B1B471F48438FDC148C3CAA55E004901DE23FD9C40F2CA35E754A933D3227A565552A1BB57DD635DE177E0F58D0A415802C9BB1707EE465FD574CB7FBB977B6B311B0DE56C95D2F0FDBBD970ABFBD5DAB85A4DE21094B81B940F11CFE8B452412012632D0FA3BE1EF88132848054CC520DAC14053A1F79EDBA4EF02DBA5D801A86AF2BFDF4CA7ECA3ED9580EF81DC4365B1B4230BDACC0128B4C42D710E06431F854A9B2E942945690E2195384919EBA1AF7DF8476DE1BFEC72F10A9B2C112E84A9896B76AD3D9A86D2D8E573153132D4402EC915AB87000635ADE9D1E28DF57B746CDE07B46E6ED776CEB7B59B5C54AB774618A45EB36CEA9328F13C1571A0093AE723C85517C63F1651B2513512E781BBBC1D2AF3BF00F916BDA37C16C73F4AD482294045B982F4EAD666B0C3381EEA76FB7938B33B59BE4BC7EED9B858B8B4D9F4ADD5DB59A490A48FC2BE084710E052A3533E55E57F15FC6156D33364AA7A95BCE03ADF5E3DC5338B461309B80580160010389CB8D73E31B8786E0D6186616C5934A4D859DAB6136D676E435200192DB040CE01CB339EB9D712DA32D1B794B9AB65397AD49AFF006FD2A1844DA48410000F99E7906F74D6B0AA5CF1471F006C49012040001C8C752209EB3355AC561938196A909002402E05B33E67DDE25E52B725303900C59DBF157CBA45550D253B93D243B3827A0E99FE61B2D2E4B8A5DFDE6FEDA39EFF00C4A7D97704F692F672DA8C1C5AB08DA0C3B0DB8BDB1BB0848B91F850BBA7385C82B1286B87DD1A6B3CFBD7823692652A424A9882C43B5A9A9B74C83DA16C0CB22728B9214CDA0028D90ADCF334D7F3D2DA1B16B66715BAC19E654F39657F8A58DDF12415715A3EEB08E2D39B79157975AF56F87B1699F2905C10522CF980DE6743ADDE2EB83514802AC59C727AF95A95B8D71F5962096C9466985AE12A1060A89032D321979CCD58A724A8D29C6CF4D58F935844899617F5172DDBDE66FDA14C4F1305B3067DD33DFD674CBFDCE68230CEA0A22B5BE872A0ABD33E30D27912D0541419BF8E46BA017E59579C3EC5ECD637BC4DB7C1361F044ADEC5F6A313B2B2C25A6B894A2872E1A6AE8F0A7DEF75B70A8C010019D60D8F676155BE9A549C85068F6E428FC294A36D9C7A50140920006FCBEFA77148FD383F8597B1BE13EC77ECE9B05B0C8B060ED462F8622FB687130DA7F101C7D28BC612E3BC216327783DFE4234AE95B2E514A529003D1DF2FD373BD9C57906D6DA2899355F52884BD07F153BBB9CC69CDA3AE167C66DDBF10242C0293C208100C0D7392209E5D2AE5202826B66D69937DF93C5594ADF2540B82491571D21D4099813D79D388D60A20828820A20828820A20828820A20828820A20828820263A9F2D68820A208681242C922049F9CFCFEF9D656DF254FA1EEE47DE164FF0011D7D4C567E3E550924B4D014480E737E3DDBBC22BFA9DB36F2688176E1F55EBD6ADA92D9F7787C6301C912A2D811300E7940F2CEAC7326E1E561D3316A0FB8A26A0E54DE7ECFAE90E64A52900A92E4359F8B3DE8DD41D234AFDA1B6F71CC5F6AF07DD46C4DD326E6E14E8DA4BAE35163096F843ADA6F548CD83728E24B1C63DF30398AF1E7C61F180C11C4A24CE228AA24B53BBFF0064F3B3ECBC3A66A1334A46F1D722096637D3B9CE2736476551B35875AE1F62B0CB366994BAD9097EF1E7614F9BB23FE44870A8B71A24E7CABE7EF883C6B88C4ED25FFAAA037D55735726E5FCE9468B44A9094824951DE1549341C86BC7F4D7BDBDA9171F8D7084BCAC94D23FE088E1E2819F16A74D49CA9CECFDA7FE531592A7D59BAFDC5BB88544B480C09E04D48FB7944BF0210785B2A299C8AE264EBA72074ED560DD9653BC012E1CE84578D630941DD01443825C8170F4F7E50F112013AF413D35CBE039D454FC52A52BE82522CC29AE9A91ED8C6CA4A697D037BE66292F2418827AE83FC7C2A57058B2A940A8DF2068393D89CF3F383743DBCB9D9F9E547F2F3C71FF0053F114F3FCA1A9FF00EA1F98CB0D07610D5E738946011A73CF4E51F7AD63FC9FFC8F71F9BF970818683B0868A4A892441E809F43C88158189FFCBCC77B8F7DE061A0EC21E30785B4854939CC79D60E24E4AF31FB818683B08578C743F2FDE8FF00255FF2FF00EE1F8818683B0838C743F2FDE8FF00255FF2FF00EE1F8818683B0838C743F2FDEB2312A71F5663307C9AB06E8D076838C743F2FDEADB809C9387493BA685F9F11ECB528C6022C0123967941C63A1F97EF49E216835052189766AF36CEF7FEF0520906CC5E99F384D464935018A9EC0A4101AC469F7AFE348374053F0B69C63CA839B88DDB9AE8F977AFBA5E009038F3860FBC12E2926728CB91CBCFB7DE74CD38B4998C0DC970FC082E01F3B5DCE65D210E12EC4077198734CA9C61929C2A39653AF2F84534C7A3E64B531269C686BAE66F67E758DCCA4BBE438777A57852FE69BC8B552136F745D26F012DAD59A590DE64B44FE52ACE48D4F3E55CE31E172E7024167B8B38201E1957D18423F2C6FB8FF0069B0A9BFFB9BA37DE2DABA4E1D86B57CFADD0E61CCB4BFC5BBC414E94290A1FD654C70415083309ABEF8576A2E4197F591BAC6F6CEE39726B17221432986E9DD0A361CAA47366CC671C32DB0DD66DAEF1FDADF15B9DC762EC6CAECD38FA5ADAAC4F0E7DCB26EF90E5B1427F00F5B8E071C6E5C4BBC792579098AF42E07E2A1C0ECC18233C83BAC06F3573ADF2D39BD225A4E065AA4EF280B5185DEEE286ECC0F6CE3A59B89F642DDFEE52EF15DA0B172EB6A76BF1816EEDE62DB49E15E3EC3C904BAAB67C00E264A9404C9223A5722F1778AB13B5D530A6728EF12CCA26F77AB7A733708CCC2A0252120005DC9A10D5191CEF9F1AD36DF8906D92C3656B0911E33F9BE0F31C407E549C9234E181A571BC527186715EFAF77789724EAE6E5A909A30CA4555BAE1FE94BB372233B9191B3188F71588A53E0B2CD93CD2A789DB9054F0067349D01CE0796719558F666D91839604C249CCE766677B758D172AA9980A86E9A007E93615705EBC7F6DD09FC3FF4497164192B3EF66ACE275806009E5E54DF17B4938CC4BA4BA4F4FB56BDE967021D4B5A94002430CB53FAAF46BBC2C0CCE4479D26A414B4C71676177A9AB5A1DCB4B800B91C74C872A7E22036A70D6B1EC1311C34AD4D97309C52D9C4A8C21C17166F37A664E4A8F3D62AD1E1CDB22462A5277C065005CD4641B9F57ED0FA56F61953269495209484253553D89577E62968FCE1FDBFF76D71B9BF68BDE16CFB1641AB45627717569E2B640578CA76E1D288024CAA7202799EBEC8F877B4062E549ABB800BB31CDD9F9FE22C52567752A0E1C02791AE5A3E59BC73C6C31238978778AE161370B7810A3C21AF09453EF8D13C6734C6B945762992525767A03C2DAD4D5B83C4E4B989F92096E2EC4F1035AFDE9085E622CBEF1B62F21840506D574EAB8584B8A84B4852F40A757086C7F728800666A470780F98A480379449167A0FE9FD3855F6B6304B0ADD20000876008F4AFBD5BE9CBF8057F0C3DA1DE9EF2309F68EDE9604E5A6C86CC3EDDDECDB57D6EA43B71E282DADD425D470293C694AD2A428120826ADF80D9AC5F70D19E99D074AFE9E3906DFDA43EA4EF92B3BDBA1D817E14F76A47DEC5B60F6966194DA39C2CFE1D86322250DDAB4969A4B519084A52083CB402AE184C304904023785CD05079380DDACC1F97E371049672497A641C9AD34FC708BAAD0CDBA0CF16A27AC18CFBF5A9C9619091A08D64282A586CBEE4C39ADAAE2CD9EBC1A1682B30414410510414410510414410510414410510414410510414410D1C5F0AC891AF3EFEA3FDCD65C2D1B82E72A645EB58DB786EEEE7FB78A3C5EE9F8FF9A8AC6CAF912CCDCC027B5ECD93FB35D635DB7FFBD7C3775BB3AAC75E702B1828718C1EC10525DBD7AE3FA1C48689973C25AD2A907DD1279E7C4FC69E3D3B2B0F365998A4965004A99E95B1BD7B7689AC1E1C4C60A70090F43AFA5188AE547B6ADEE7766718B5B0C5B793B5FC573B47B6AE21EC6D2E7129766D30E2861C1A0B1C6D9532A471956B1EE98AF0CFC42F162B6D4D9E04C2A0EA04825EAEDCB2C9BBC5E70125084A120252080523DF0BD5DEACD48D85B17416112A99923FFA926075C84039FCABCCB8DC2CC38B54C20D54E1F2AE629476353689854A19003570C7D2255B74189D0F2E533944FF008CEAC3B331064EE87634B919599A9D4D78D2032D346038D05BDF778ACDC42A24F91D7E67F71156D97B437D206F0B35EB600D34D73A5E0328640371BF90872DDCEB9EB1CF3FA8D7B99CBE0DA7054E2FBD7B1CEEFA311EF211A992ED60DA7F5142DEE2513273E93E5D7B67E7CE9FE154508DD2E1ACC7524BE46BFDB9AC6532D21C100B379BF28A7C5EEAF8FF009A75F378ABBFEE37F968FF00888A819CFAD1F378ABBFEE0F968FF88828F9BC55DFF707CB47FC447857C2624FA7FBA3E6F1577FDC1F2D1FF111E78BDD5F1FF347CDE2AEFF00B83E5A3FE220F17BABE3FE68F9BC55DFF707CB47FC441E2F757C7FCD1F378ABBFEE0F968FF00888F3C5EB3DF3FB9E7525276B7C997B80B76EAF6AE59346BF283D83720FE8D1EF8BDD5F1FF0035A4DDADBC18967766F7C6B7318F95C13DBF5078BDD5F7EB51B3717F308DD51CE8E1ABA0FB40658C92FA9200E4D9FB7178F3C533CFCE73FBF5A66B24A492493C4EA7EF1B09696A80FEFA53AC47BE789C51CFD7EFD2A00E20A71052E5277B2350DEEC05B5685E52185817EA5EAF97B109559D28F9D87A312D5269AF6A690AEE876DD0FA35619E2171EEDBD838827F16974B57490786CD2D82A70B8BD1B0A00E63588D73AA76D4C12B7882D7A70E5616393F1840A1017F31949DDBB00CA761AD5B96B1A75BD1DBABCDB0BC7773BBBA7DC7B115BC96B1FC6DB59534DB2A5074A7F10D9E20435C6885039E54B6CB92B97BA0687AB545B8BFBAC6FBA972B20BE5BD91AD9ED761FB78CD3BADDCE6C6EEBF0A69BC30B5797EA6C38FDF39E1B8F3B70E8E3789740055C2E1508E5E750FB57138B958F212A59008A034ED5039106B68728C5A952C2024A124B7D4E0E840AB7BA59865AB14F0979F5C80B981CB2072CF969E8672D2A6366CC1380F9C5DEEEDC0D457EFAF11BCD595EE84814A123B822BA8B9F2314820C919093F5A90C64AC39964A521C0B518BF072EDD2372779B80CEE48BB0FEB8E4C551F68485851129C81A3FDBAB7611A2A56F26A2952458B67D73F4A9A380C345A0E1002889E84C1E672FAFED4C367A9631010B777CF2B75A8E5AF2604AA5CDDD043037CD8543F1A1FDC435DDC30C922520C99394F6FBC855D6724270BBDA26ED4B015F6EE468F13D8594A98000EC4DF4FC9E432A45818FE36AB76EE5F6B34B4A6D2A03FB83A4214394829267B738154995B53E56D0090B23EB19DC38AFEBA0D0582448489441009ABEF0700E4D42DA6BE71F187FFA81B65B08C037E5B0D8F61CC36C0DA56F1255D38848485A99B46C09226482A233F809AF777C12C48C56137DCA8A44B097399A171CB5E22968D1531686046E9259920330B061CF2CA8098F9AFC6F16C3F01B753EA32CB6A507594C12A2EA88494A4E47878B889E5F2AF50A2415CE09A0700D4DFE9E5635A67D5A155E384B90EF522C1A94CC6A3871615AF4A7F8567F0FFDA8F6FADF5607B3C6CAE99DDB60988DADEED1634A6D69B7BB4A568BBB66937052A65C0975A2D2C2B39C84E756CD95842A29DDA1166B9BD68294F6F1CFF6E6D51BB30EF1000CCD0BB017273A796B1FA6EEE1B72783EE3776F816EE764F0DB2B0C2706B0B5B44AED594B4B70B0D3695AD65109254A44CF73ACD5E7098408028038161439FE4E669D0F25DA78AF9CB2B2A721D8136F6E3F119BDBBA6D572D59356EB86C1F15D08FE9A4C1391CF5333D0CFACAFC94A4DB26A5037403D88ADA91BE52A193820F1EFEDA272C8116E906322AD34D67D35D0D6C030034871292120A4351AD9DFDD6BAC3BACC2B051041441051041441051041441051041441092DC28272C873E9973CC51190926D5EB088BA9310358E79F97F98AD54ADDC8C2BF256CFF004F272FE622B55C25313AF6CC72FDFAF23956A99814486208B8BB7BE0EF0CA7CE124805DDF2EBA8E51EF8E989391E5D23E3FA8A5189200773661EC778DE42FE6B310E6DC39E5A373D18C44BD769F1C85B6B6D103FACA10D679895729981DE7589A692A72A5E2F70B14DB4B86D4FECF3A3954B09CC96B817E94108BF74DDBDB3B74A5071A6D0A7096C923810095A87284804AB3119926293F104E4CBD9F3959EE1672327CADC6FCA1597237949033A17CB9D9A85B4B738E66EF0312B5F684DF658E1F863C87704DDABEE1714EA81B2C4977AD85280E194BAA61C411C8A142BE76FC62DB13C4FC42113084EF29802697B6597A728B66CFD9EA202897766EE351CA9AC6CB216C5B617716EA6E5B52186B86253FD101032D2047BBA488E535E503B4953274C1314E5C80F9B12736CAEF61C62F385D9AADF9403020135BB90FA66F5F2E3E32E301094B4AE28049464548E70A1CBB4F2A8FC62A52D5BE12695B720D7BB77AB878DF120C89850BAA8163BBAB73CE9D4C4BD9A177297148040409F7A73D724F726047523D22D78B4CBA80435DAFECBD7D61B7CF4DC8507B53F2DC871E8ED4871C9250E36648287010A1048981391891FAE54AE1B6AA779AC468CF7E9D69C236131EA283DBF6AB5BB42C8511014A1EF0CF3CC40CC1CFE3C888AB361B1E998016A0E1AF31F717BD046DBE38FBCA02F804C127A9075FDFEFBC2F33692504B120E675D33FBB508D21C4B96575AFEFCFCBFBF3F11D95F1AD7FEE5FF00946FF238F9FEA1637ADB2C29D5C908CCA47E6CC9D073F39AD86D548A10934B92470EF1A192BDE0901DEC6ADD69FB8A9ABF6DEB537694381BCFDD508518E83E1FAC56DFF764FF00C5376B9F7CB58D7E590B0870E7476F4849171E3B62E129712DA89038801106338319F5A708C57CC1BC081D5BEFEF58D5437494921C33F0F7EF48F5B790EAC368701513192B2FAD6FF38FFC8773F98D49090E6D0E5C696DACA0AC122261479FCEB266A8162A1DCFE6308585A428380758F034E75CBFFB4FC2B1F38FFC8773F98D89604E91E96D43FBC7C48D7CA4FCA9BAD13261041735B1F5367A7BA460170E338F3C357FDFE07F723E9594CB980015F38CC78A42BFEC08F3FD33FA52884AF371A3BD3AFE3F3047810A9C881DE48FD294620124B8639935CBCE084D6CA8AA6419EF303F7EDF6602660662B1466B9625D2EE4039BEBA52B6BC2889BB818B56CF7F56F3D2F08A93C399223D7EFB0EB564918B461A5042EAC2EC3F67D3362F0B09C86722BD1FDF0AB6710B7D6B7AF337EC34E20377CD29AF1164F8B6E1485364B247E59073EB94F3A88C66364CC0A1BA93BCC5C8167A65D385EB684D6A96A5A16EA1BAEE9C94FA8A8A1BF522AD18CB77DBA7C0F60938B5D3015718B62AE788F622EF0AAEA38D4A203A3DE02145226721F0672368C9C3972C0E428001CB5F3E548D8A92A2086DDCD3404DC8D7AD3B168C9565656968CB6DCBAE25256A2550A24A8F119E5A939F6D2A1F1DB4708B9EA56EB92694A3F91D47E21352492E0539D7ABB76E668F14DFB8EAD4916BFD36D260A55209197E58CA72E7A914D65ED24053CB05366E87AB0C8DD898565CB5937625AEE3FBB5790A98A537896C04290E123290099394E67BD3A1B494AB971A1A5F32286D0FD1254F5151D5C6B407ED96B0A8BB6C988503DF2FBFDB3A5D18CC29ACC48720DC03916ADAF6D0E7A29F256C4D2D4D7B1F7EB0CAEF186DA429B1C5291C898CE35FF03E154AC66D49387DA7BC94B277B40C187B03288B9B839A6782092E680660D0FEF219877318EB17C5D6A51E02A19926662750797293FA54D4CF14E1A6618C929014450903833D726ED16AD9B86504A41760039CA8DC75CF964D1108E0C4ECAE0282B85BE05BEA50F7441E240933055103AAA0D57F01B326ED4DA09992CD0A9269A13C34EB4E6626CEE4B60A20153900B396E17A718F91BFFD484965388EE56F30F69C4DFDC1C7D29B72902E5496BC24A961033E10905733F973AFA0BF03B616270D22482BFA1613BCE7316C9FC9C6B1158A989492A72082F5BB68F6E6EDE91F3C7ECDDECBDB7DED69BD9C27775B05862F1ABBBBBEB165F79B69DB8B1B265C71B3726F94DA54507C2F10A0C47109D04D7B1F0BE1DC44D289A934212C43E8D96AC18778E7FB5BC4F270D315209D453859EC7EFCF2FD38FF00868FF0F9D8BF61EDC9ECD6C761163871DA4561ECBF8F6256ED37F8979F7909B8E15BA948510DA96B400A04A408EA6ADDB3F64CCC3EEEF176E39E7EE833CD850F69EDC978A0A42412FC3E927537272EB6A474F2D597C2C2CAA19CC04926739991E64558A58DD46E9150C05F2BF7FDF3AACE5198A26956FB7A0F4859D65F449B54B0952BF3150890489CC769FF0035B924E64F38412863514D29EFDD61DA13C0909D32CE349E7F3AC428000ED9C5744660A20828820A20828820A20828820A2082880D013A434715C4A52635D0733E63CBD27E49AC29DDCB7334F661295881F3B70B57A31032CDA95AF11C23D44A567581CB2D3E87CFCC4D2A847CCA6A1FC9FF00A76CE25D202D0CD5D6B9E99F4F285B252028721A4FD7EFCE68124A54EE1B4ABB6869E4FD62176949DD0140125EA720DAF13E7CCC789546474F8C44E9EB4B8486DE1BBD2F76F7C222F0D8A549582350F4A1F6E69AE90C71071E470A1D6C2ECDD3C2B28054B4E907A0F78FE99738A9C532E6198A6A55DECFCC9E6FF889F94BF9A37C66327ADEE3323DE51803DA237888DD8EEEB1272C9F6158ADF866CB04B15287E2AE1378E8B6BA286C4159690EC98D009CF3AE67E39F13CAC2E0E623E601BA82010781672FD68FCE24F0682A5070E5CEF3B90F6193D34CDAAD47C05B97DD6A760701FE6AA529DC471A3F8DB975C1C4E9372A2FF0A9591211E2409D220738F9C5F1476FA7178B9E12B25D4A72F7E5FACED9C5E36728CBDC2588D054BEB6FBBB068CD178DA3F97A51038D4412233FCD267ECE42473AE19860A9D341BD4B9A72E943C2B4CEB65C3633E5CDF9854E08615043D079794610DB6DF7EECB7758DE17B35B518BB785E278EAD4CB4E3AFB4CA029212139AC82278801AF4ED5633B344D96E949721CBB11E57E2E0EA75852626662262E6B2776E2953472E006E4E32A9D7256098D26CEF5AB36EE957B87620DA5DB3C410AF11A295B7E283E2881FDE008CA4D57B19B254146840BB8CF5CBD34AB648FC9332525425EE924FD2A152D43973B753175AEED0D82DB8E871D924A8281267302626239F41AE7510306A9531B74E795B9716A126CFC2BBCBC39502774803FDA6F4A50573D5F36A3C453CFAD6496C92274FD7B0CCFC226A670CAF96C19890720E0F6AF5E91B1C329C1602AE685ABC4D78BB13DE1CDBF1169257F98C935B4D2E413435FB43C929DD491CBEF0B5250B430712B2B7828C2145303EB94E7FECF6A208B6B6CF6C98D97C2D965281C4E880207500FEBF648ACBFD2DC5FDD29DF5D6114CA4998A9AA776FA41CB870E3F710AE17B533B396B88DDF0B4C5C8570717BA4C2883ACC796B3152F879BBA801A96EDEF586B3128528907EAB299A94A3FBCE25F0DBFB57D837364E05BABFCA2665427403F4A5FE71CC6990FD5FF00A68D4A524314823944ADADE5CADB0ABB1C2F999049100481127204474F5ACFCF3CF9FF007A7B178025200601B26B4493572404F1106796647CF39CFBF9C1AC89E331F6FB98C14036A1F2F7CA152F24924C4798FDFF005FF0E25CE4B5090323637E7194A400C403D3CA0F151D7E63F7A53E70FF0091EE3F31961A0EC20F151D7E63F7A3E70FF91EE3F3030D0761078A8EBF31FBD1F3926E49EA3F3030D07611429C041CC47CCFDFD9E75AAA62425DC87B1A558D58BF4841490EC6AC5F9FB7868E3A0CC68222749E7CFE1F731F889A14336ADEF6BE64B74EF0572BE5EC4365391C51FE32F5981CAA1672C31006B5A3716AD1F9B51AA21D224A99D4286E2F6B647DF286AE3C24E6679C0E5DBFCC1A8A98B735CAF7A353FBCAB0BCBC33D774F014739F3EEF9D042887DB0D80BE119F389CB2CE7E597EB4DD5212B75352EF7EB5BF1BF3192E641DE2C0B51D837273AE75FDC20E5CB1DA4E5060E5E597D99E54894A6596ED41E4DCE164619776A0AEF55FBB53DE70CDEBCB4420F1293C6359E1E7E6723DFF006A497884A33D5EB422C3D7A7AAF2E4CEDE66514D2A5C9A37936472AB6B6ADF630D209085091D3AF7CFBFCE9AAB1E0160CCF7AF2E3A694A3F19346154523E9BEB9B574BB7DDA2D6B8C67C452A55AE5DC7ACF61F66699CDC3CAC42CCD252E58BE619BB0FCEB69393B14CD4A66D068E0B93A00DC7A677788A7961F920C939907AAA32D675EDFB5446325FCA0C94801C55ACD666D6B5A6594487F8270C91705AA32FEA8E1C0AC050DD859397574F1651C2A36ECA54128BA201E22F24FE74B27DE911C31564F0862A6A3192C0DE62A02F4B8AF0A8B9D3AC41E3B152D0E4941520177FE497161A7106F78F928FE2DBB15B6DED89ED59BAADC4EE6AD2E76BB6DF0EBFC42DF197EC50E5F611815A5EA195B8A754C4B96EA5DA1599508E341E409AFA47F05C4E9D8594B52F744B0874070B99BC5BE815762CEFABF3A16D3DB484298AEEFF0053D05C39D1F27ED1F4C9FC2EFF008576E6BD89376782DD5861D698B6F62F2C5BB8C7B17BF69879D178E23C52869FE04BFF00D22E2DB857E588AF6E6C4DEFF111BEEFBBE807E7988E4BB6A789F8A5AC6B95ABEE83ED1D6FB662FEE9A530CBE2DEFEDD69FC482A29494F14A4240CE38040E511153310F17E3265A46609090091A1500028FA99A208528820A20828820A20828820A20828820A20828820A208288C1B1E4622C8517CE7209233E5D87C7EE056AA0E1A970EEFE5E5FDC4392BFF002D3A035367FB716BD5A1B5CA0859D60E606B3A0EBCB5D29EE1C2001FC5AAEF91033EFE9778B5C82F2D23302BD5CF7FEE1BDBDFA4DD2AC432F95A48E27787FA425322546234CCF5A6F3F109966AD9E57EAE1EDC84218C47CC96C0820E952E2DEF4E514DF620D589425495BAA5988687114E99ABA6BEB50988DB52643FD429FF001B80E72A07A57CD9A2125ECB9AB5021248268CEC2BCB437C8D0461ADE5EF9F03DDF2B8AE14BC556EA08770CB321EBC656530D7F48C14FBC413968272AA76DDF1548C3C8528CD48DE0AA0354B0A3D476761A45F3647867118A904A5135250DF510C95BDD8B55AC7DBE9F5AE0D8FEF976F6CF6D76C0BCC6CA60AB75DC0B07B8E24BA4BC8857E29872504A5CE152383311E83C75F123C72667CF9689C4825565790639D29DC45B65F870C94B6E80B2C58DE99915D7DE7B316172E26DDAB77D216DB01484A19023C31EEB6003CC2409EB90EF5E36DBD8CC4ED0C4CC53A8A4A8B3127339BDADC8BC492B64894031008CF98E356CB84463F77C57DC2E7134C9FC81DCA32F28F879F9A7B32419652542CC4D3AF535E43843799869B292087292E01E5A535CE9E51A4FED97ECB167BF1D8EB8C4301BA4DB6DEE1A855D6CE3ED2C2429D6541E752B5A4170921B4A404F3D6AFD864A1526803B51AE5FD2CD4D5B5899C24C0996D34EEB00EA55AA4B579D3AB523597D8B7DA8719B1B8B8F673DF42DBC33799B38EAAD6CEEF142A65ABC6C296E23F0EB7CF8AE2BF0E84010224E90669962B0B2D414126A75671A8F47BF1B43B5253499BCA56E7FB52685C67A8FC36B1BD7B41BDAB6D9FDA3C3B08C430EC542B14586D8B84B405B8881C4A5A8FE43C52939E5C849AAD62708122D517A7DBF1C758587CB6E62805DFF7CEA7331B1764D86D16CB788507DA43A8291301480B00FF00E50623AFCE2E62371553714DD2DC3CF843654D1310A084EE94962141B36714E1ED843E514A8952125291020E47A4C773A4524E4DDFAC0874B254C546A48B70D3F5CDE282A09899CE88521BBA871C2929809044CEA403FEFF00CD10459FB5FB228DA572C8FB810C281742F22A00A4FBA331263AD64D4B8EC32F79F18C25C0637D6FD7F4F16AEDC6CE62D88B186E0D8238CDB61F62521C0B5142D4094295C213910485418F3EB4E5134331240C9EDC73F6FA4202490EA212497B73B07CF5CEDC22F7C36CADF0EC36CD8B54B9F8A6529F156BFCAA3A9208CC89F803E55933D0003BCC4F4A060DC283AD235095BA814009664B03BC5EEED4D3DDAE125DBA5078C20A8004742911DE0F90D6B6F9C923F9163C47E632997BA18249BD48735E90B250E2755031A664FE9F7D7A644C49B1B71FC1F28CEE81FED6E8D0BA5C310449E79E9F5A5A54E00665F2714BB3706FD46DF2F827B7EA2AF13B7CFF00C52BF3C7FC4F7107CAE09EDFA83C4EDF3FF147CF1FF13DC41F2B827B7EA0F13B7CFF00C560CF190238D0C06550D13D2FE91515C266333C8EA343F7D41EF48AE79A249715619F1CF8BC3298965301CB534CF96AD488F75E0924198E5CA74D7E51E7CB5A653A7F501E86AFF7CEBA7185E4497FA8D746B821F877B886EA7651C5233981A4C1E7FA7975A899F39F9370AD0D33BFEF94A22582580D2B4E4C32CBCF4884BAC4D0D4950CA4C81D0643EF4D2A29588625DD8E4EDDDE9D00FDCA4AC1A942960010FE6FEBF9702206E31795A9495108E40C65027AFC32E7999D1EC99C9F95957BB8D3BDEFC1EF232B03BA03A4139DAE68CD4F588A7B1A09513C66675D63CBA4C72F2A61899A9A8D3A3D457B8ED0E65E042812D7E078FF005C8365160E2FB50F357CEA52B70A7DD1C20E60C673A7D2A071588704037666E1986249A9B0A521DCAC03390976BE560180ED7A8F588E671D174616A5372732E401EB398D2674FAD41CCC4A92E1F5A82DC3334AD8B748768C1512424BB8A351890D95799B3EB1E3F752E05347C74082E2992541A1C8ACF29F9812749A4A4ED598957CA724921D892D56A8A5F4CF2CA2C986972FE4849025A92974B800A8E6D77A74899B5B96C302E3882D8FEFB8041691060F88BD131D73CC559B09B3713B4C2404ACB8191B16E1EF566783DA98997265A9C804B8634373AB30F3F58D66DF56F5B69F69AEBFF66F73986AB1DDB3C4D4DDA5C62A965773678234F14F8AB2F307C4B7529852F84C66B4E7005764F027803153F1524FC951FA93FED26AF7B5BD968E3BB7F6AA10A98C4077FA8667D8143CB81DAAF63BF61FD85F67AB8BADACC630EB4DA2DEE6D1A1ABBC5F6BEF5A6EE6FECDDE12E169ABE290FA121B714C90A27DC0139E95F4D7E117810E0B092553A5B6EA5156FE2585B3CDB83306B4723DA9B495316A0EA00B80067CEA4657FD3746EDEC997DA4BF66861A751925C6212952A6145440CF31A7527A8AF470C327084C90929DC09A10D421C79373A1BC41151554925F587F6987F86E1BA7F87F14E7FCA5BC90A8109CF5303AFD2B68C449252103852207EF441155104144105104144105104144105104144105104144105101A823586FE1A788A89023B89F4039F9F3CE26886A24BAF7DABC5C79FDBF709388490547967E5CA474F9D2AE5292C0B80E73AB07D7D1A1EAB109901945A81C74ADAF6B4312EB09539E18487140F12801940804911A012263A8D045336E6D0F912D41D5BC012F663A70F31F7470F8A4CF98108FAAB6ED6E27D5852F1A87BFBF687D96DD558DC5A1BE6AE31A752A0D329710A712B33038642A012274F21AD714DBBE2A4E1CAC0987783B906CD7B33776AD23B4782BC173F6DAE4CD5CB2892E08431DE50E34ED9F131CB8C537B98C6D5638ADA27DD7957F78F151B774A8B484A15C2DC209E2128E139F5F879E3C63F10D7284F4FCF25E8DBDAB59EADABD69DFD2DB23E1EA30F2512C48012025BE8E21EE199DCF5BC5E789EF677876564CAAD2E5869B4A470B4DADD060680A4440813DF58AF2B7893C5B371F88581394CA51600D2B980FC5F56CE2CD27E1FE1A63138696A531BA4123967C7F30D6C3DA0F78B83B8CDF5F8F12D9C2014FF54C0490939129039AA7D7CD0D95819B8B48592A20D781E39FA7770F11B4FC07874214061900814012033E46C6BC34E11B87BB5DE7D9EDB58B5737A017E0150000209D75248E9DE222A57158718445824839DDF80D0802E2C738E59B6FC32BC30509481BA92E428304F26F5EB19B6D5D6195171284A9E792461C56250D650E8569C2160C403999ED4DB0BB5BE58352F61A5D8FE78D6958A062E5AA5CC4C956EEE827E62452D66A70E995A39E9ED2DEC6786EF431B5EF67636E0605BD2D9B52AFDCB8B250B66EFCA3DF4B7C6DA4BCE1F09B2889993C22662A465E2C4E0E2F9BBDCB585EBD7A460630A1411BA4A55449193382E7CB2D1B28BB372B7B8D6FA766F08C3B6C30C361B5FB2AB5DB5EA9D694D38A2C381A69C95CACF88DB3C5240041D291C420292A25CA8E99F40D419E798A88DFFCA4A52A2A2129E3463E8C7CBCE375DB43D6D8759B0E125DB5E16C99954248488D0E806A3E555AC5A4A4D18D7B9FE9EC7864C013D2EB3425405072F6DDCC4DB8506548238541111CC8038BE73F4A6B785641242492E6AFE6DE4D0D5CE5EBFA510E6112BE12467E9FEE8820F17BABE3FE683404E9041E0B4E1E356AACC8273F89EDFEF2A6CA5D6B53C3280AC8A04BB66DF7FD73AC38430D11904E7D333EB98FDAB099A967292E75CBBEBD21352C87A5B2B9F510938436A281200E9A67EBF1D73A4D53D8900103A8AF7F7CA14402B485503E45FF0071478BDD5F1FF358FF0020F1F3FF00F68DF70EA3CFF114071434FF003F28A7D2A712090790059BCCDFF0636DC1C7A7EDE3DF157D7E67F7A5BE69E3FF00D47F106E0D4F97E2144A8900C9F89AD0CE2FFC88E153DEF5F6D09A831223D93D4FC4D63E71FF0099F7D23115AD7C29224C88033F2E7DC7D2939B30DDDCD4D2BE432AE7C2B0C268DD981C8CEBD0444DC3D3232D79F4CBBE71D728F5A8E9F3CB5ECFAD4D9AAFDFA448E1D02990BB0E23CBF77888BABE0DA549900A41E7D758FA1FD8D45CE9E374B1249B575EE05ABC3289D9186DF214C58E57F7C8F908B1B11C4614A3C4009D391EE467A7F9F3889F3D89255C6940E791F79E462C984C216140DEEC7AF01C323665EE28E1716105412065073E7F2EB90EF49A71C65B0259DEFF006ADF477AC4BCBC206629760323EADDEA784405C62AF1260939F39FAF2E5F62939B8B13050826AE4F32F47A9BF43A98712F0AD641AD2DCB830F53EAD416543F1AF9E22B994920E9968ACCFF00AA8C98B7CEBC3EF5F57FC48A3083737774D83B8E7C2B57EB11CFE396A494B162E2D5D4340CE9A46BDBE798A68B93F309DDCF8350B0AB707D2164E082412EEE1BF0282A5871ADA18AB6A1385B4F5DA9567676F6A92BC47F19EE36DB7F9878F9C02A483E1CF3F3AB17873C2188DA78B96B420A92A21C106B66C98B65D6D68ABED6DA88C1A8CB538525D88B82D96601EF7A59F1AD86D2ED36FF00F1C5EC86E4038C5885F818EE3376169C11B4190A558DCB1202800E0055978804F3AF6AFC39F83537188905521CFD25F7356FFC7F0E5C8B98E5BB7FC48196EB7002B30E05988D5F2BB9063A21ECEFECBBB2BB93B3B8BBB5BC563DB6989250E5F6338B2D171705E00952597C2439C08952120E890065CBD75E15F84F2B650953178748524057F0FA49A1BD78FE35E3DB4F6BAF12A539210B25812EA0C6AE1DAB4ADBBC6D43185DC22D941453F8F70FF59CCE0A672E13993EE9220CC6990AF47F87A461F66E1D329490964D52D57028CCD9D49BBF68ACCC2A98492470CF9D7B0A51B2B35C7616EDDB5BA5B6C242049F774E227DE3EA7CBCAA466CE33E62E612E49D5D8643B40CD4666CA1E52704144105104144105104144105104144105104144105104144105104365082260013AF327A4E9D7BD6C775282A3C7A37BB5CF2B64A9094B921CBE76BB53F37D612582E2480600D3BE475FF005D73CAB28589A93BA6B9FBD3A5B37AC46E210BC492104824B66396BC6E7A4620DE56D55BEC16CC6D1ED0E23728658B7B7E161457C30E3885211993AF194819F481CEB8D7C45DA276561F13356580048F79FBB6564F0AF86E762B684A96141467281005427759DEECF46D7331C0FDBDFE6BB61B4571B5FB557173756B7F7370AC2D84A94B2D25B5A9214EA579252612531CB9578D36DF8D24637113A52544289500C4644834D19CF7BD63E807C2FF000A0C2C99026049A26A43DB9FBAD2916E365D0865C60B28790A21453207003088CCE7C3A939033D6BCD5E35DA3889D8D9B2D2B5339CF50F4CBEF933347A464EC69094A54100D01A0A71D1B3BDEB6CA6977F72EA5B2E5D3CA527229E33C1972CE72EFA6623957309784C41C4FCC9AB5105540496E2D417ADAACF5858E124C807FD2481FF002090E72BDBA0E377876FE266F2DD36AFC847090824C09F5EA73E73E55D4F61ED5C3E124A11312E406A3353AF6D38C5776861244D0B4A659753B9201EA7B5B367B88B9375BB7F77B31B516D8638EA4DB3CEA42425478632C8E91AE703CF3AC6D8C7A31AE24DCD0352967A1CFF0021A39BED8F089C5A26EE86742D42F5604D4FBF38EAD6CD6256F8B612D38F2212B6905975B03C46E5238B80F2E23AE432F855657839F25615BC4A545DAB48F29788B64AF0F8F9B292485A56A0A3504B1239D8370CE1CA2D14029B0E14A493FD50AFEBBA0FF6BC7FB872CB9181DA4B0F315258A9CE9A1AD73AB68E00F5833805FF00C88B905CD38D39661F942186E0F8260388DF63187D9376D8BE221B176586D286145B4F0A5498E124A84C93FDC4EBA177331E9615655883F6B97CCF1E9097FDB6729D2B585CA268332D5A86A5453BD22E86FC37ED1C2E03E33924F9C9397393CF9795454E5A66390E730C055DBAF5AD2038652549485303425ECDE5F8EB0D2DF883294AC10A05591CB9C0FA5317093BA1F2F3D3D817EAF50A12992A356229C33F2851492A888CA75F4AD9EAD5B3DBDB7585C2D2598DEDE9EB1157AE8B595AC920E813AC69D81CE39F6ED5B8965445C33E5771A671B0FA8B023BC376AE43A92A85B60735989F2CF3A57E41FF0090EC6141294A2C18F27FC4542EB3949246706411DCF3D72F2F5351B3F0E42CB114A3D72B7285912D2C413517D28FC0BF67B52D0ED17262012083A8FF007FBFD2992C949FA95FC72BBEB7E9E6F48D7E52544B3685E80B727B7317E31529B71490EC9E15732639C72D73F865DAB51302C920D7969A6B1A24A524CB7FA93957CB87BBC22E079082B0DB8E0027DC93D7F6F8674E65C852C12C726B7BFDD396E152DC852C06C9C0F7EF486A9B97145005BDC02B244149F7639ABA4EA3B53D97845EE0217D01B57F27F30A6F4B01DD2D5B90E5B9C3E7D06DD29538EA53C5CB8B31E734AFF84B607E65F2DEAF60FF00DB884D1350B24043366580E858BC2A56866DD0F29C4292AD384C91A6BF326B6FF0D4120EFA4DA999E37AF956ED0893F3262920335C9603A5AD6FC4541C6CB45E0B1C004EB9C67397C3E347F88B037B7837AEA066F76A4608216106E73CBBFBC8670D7F148B84788D9201919E625391883DB979646A3A782951483F57FB790BE9F6CC69094C904AC28D4532714A023AF9F5311CF0528CE507F4E5F7DBBD35549529998EA2FD6DC214978A97295F5659528ED5ED668B471552D0B7110490066273CB965E79F39075A8DC4615402B8580C9F2361D3F713985DAB2414A4025DADC756BFDC5DE8F60E245D528E444C9CE7E072E5AE7D3BC557B1095209DEA905B85E9663F8E0C22DB83C7CB580024DAE037126B5886280532A492ACF9778D39C7D00E5511377F78BD1AB47160EDC395AB13D2E727E5EF121FB3E43DD07578897DB46797CA39FF009E9AC79080C46DB1859C6493551604D47014AF58712714852824062726CBAEB51C4D189AC5B58ADD7816EFF085FF004009047BAA2AD3863948D39FAD58306BFF0026426730DDA9F36AE44D844E26592905354B5FDF9E9A4686EFE7DAAD5B9D71D63FF8D75888504DBE18CCB97F72A5100218641054ACC683CB3AE8BE0FF05E23C558B9385C390153160382C5C9039350B3B5A22B1FB6246CF4933121F74D28E5875FBD8F28BA7D987747BE4F6D8BF5ED96D7AF1ED80D85696CBBFCB1B2FE19758AB00E69BE65614DBED909F7338E05F306BDF3F0E3FE9D71B82C3E1E7E25285164A8920F3A022FAC79CBC5FE2F96BC6CCDD2456C0DC654A135D4BE71DDFDD46E8B77FBABD9DB7C236570DB2C20B084B770EDBB4D30F5DB89305CB852238D4544924E664F2AF6A7833C2383D858542264997F312901CA5390B03AD0371F3E5B8EDACBC4AAFF0042AB515001A5327E757B5632F33832DE74B8B5B6CB2D41B55DB1871523DF2E9D0C91A7C66AFB35723700932C390CB7008045B77C9F3ED58198B54C2EED983E808F76B44D38C5C298E149487B21C44E4403064E6648D6ABB8AC3E296A2652F72AF4240E541D188FCC6C929DD0142B9B01EB43F8878D24A1B4A5512358D279C4F539D4860E5CD44B1F34BAB5CCFB6F7531AA8824910A53C8C41441051041441051041441051041441051041441051041441051043777FBBD3F4A471333E5C93DEDD35B5B27BC20B964AB3ABB31A665AD7F7942493A8FFB65F234D3098848739004FAFE5F2D05EB99402660268F70C2946E9EAF4CE39FBED86FDFED726C375387BCB61FDA0B865DE3428A54A6EC5E6EE5D120660A010759935E74F8DBB4C7F8589054582486735E5D3CAA6F1D5FC133E5C89C99BBA3E63D145A84598B86278F9135D0ADFF006CCDF6CA33688C3ED54BC3F0FB661B5AD282471969B4B8A94C0CD609E526329CABE7AE236A23FEE93025542A56772E736D7879C7B1FC11E235270F23E61DD550148A067D29DC51DDE359AD31242EDD2A194F16B99993224E5967D3A41D4D3F6E2C4EC6296E0839641C3E76A35BFBF4F6C1C54AC761659DE0E52F767CB98EB9E90A9C5B8753F319F3E833E59546CB90952B402F6FC5A2C5FF006E4CD1FC778351DCDDB43F704520FE65F8B2D34DAB83C3E2E220C1CC488CF3D7FD53B4CA4A40001BD855EB4E3CFADE18E2763225A553141212C487A373BF067B1E622DEC39DC4EE36F70C66C1B71C487D216B40240D33919CEB9F78D32A732E554580A13AD3A5FAF58E7DB57132B0626B94064AEECF50410EF9F9DC651DB5DD95BBADECA61887C12EF809E30666613F219FF00AA7330BA500D4805EDC32E0DEB1E2CF19CF44CDB98B54A6092B70D620E7A3E5AD5AF1929B679F08E51F31D33F9D20A4B80D4BB69C62A0A98CEE49D74FC7E22972D87171AB28898CA3E3113FBD24A940BD95EAF6E367F6D194CEA6E834269EC1D79E4FC3CF1DB68788540348CD664447727E79FCEB41280C94C387EA1252014A812378BD694B6B4CB4F410A8BBB6BE1F88B45256C2B24A92414929C95047FE535B9C1EF10A09D34D33A1E77A9A9BC47A42925295AB7940A9CF3B4149AA46EB500E63F43DF287096DE0CEDC6F68C31BD5DE2DD6C5A2D0B1B378A63085A8A54BB3B42FA07BC9008339C4E67AD247E972F67A8AF63D7A670EA4286F900B917032A1BF7F6C627367B1356D7E15698A7E0313C33893C4AB475A2CAF3CA382627EE69B4CC490A0056D41571A3D05FABF287895251552F77424DEF7D5BA45CCE2508570A1B75A4803DC7870AE6332477EB4D274F0E58A8035367045E819BEF1AA5616905D2A2E7EA4D8D7DDFEF0E5BCA472CBF5A899D33E616666CF539C6628657893D70EB508166CE683EF051912648CB590279EBA56F86016424DC640DEF5A8D5A9F68D0EE20EF3328D1F32FA7BA6B568C07BD0DF0DEEC93AAB1C3EC2FAE569047130D1704FA1EA4CD5930F24EE86E3F8B53F19B98C942557482DAC5B9BA1DEC63DB518DDC318A61F8930DCA4A03AD29281209D09EFCA9862538B44C2995BFBAF42976156C99ECDC4DA1D8C2EFCA7615663A5855F95B2A38D365D65FBCB9F7D32DFBBC2179F207E3FB522DB43559EAAF3AE8F5A3660B884F7112D164B7035D7227CB2ED0FF00C1B77C26D9D5F0AD04F12504011CA06BA77C8D6A46D014066139DEB614A572CCB7A335A8804A7743E79D32A1B93DE97CA558B1B52D1638CE70224139EA3CF38FAEB9E5231E4FD456DAFD458E7A310465A90E619AF10B490FBA4F5719DFF1EB68E76D1162E2AD90494A0E5399F7B333F7A5650898EF33F95DD9DAE731A30CF8BC2E8C52264B0E589B870C18D4B1635E511EE72F5FBFBFDE9E2774074A6A28DF8CB9901F856135A50B2295D29D295E3083D60D3ADA9E54C919E9CBA48F872E71A532C5A0EE9A00F73E8DC287AE8D0F30B212952737D398B33726A7A8367E2187B526129F2CB967E5DC728806AA98D949FAB334AE479EB5ABF38B8604A52C1A8C38D455EBA3FEA2CBBCB54A5C5A529C8691A67A74D34CF3E9AD414F94A09533391424F034E15E00671654282A4834B57817CFA4415C5B44E51AF2F872D23E1D39572BDB00FF009C5245942A347AD5B964D951A35C2A93F3455CB8AB5BAD3BD62DFBB5B12BB77ED0108523FA8B6F27648260F381C8E42BA3EC89811B2901490E00AB0FF90BEAE34F58B6C80A520AD330B043143D03A481422D60733A473FBDAA775DB118DEF977418E5F60AA4A1DC45D379C56EDFE19D297184B61634502749D7313D3D3DF01673F8830AC187CC40614D1DC176B9F28E75E25DF1266098BDE9890BA82E03BDDF46F4A47D0FEEEB0AC3767B66F67B0AD9CC22CF0CB57B0CB30E8B660328E14DB3441844093339819F9D7D8AF0B2B7B66480C0112D16E43D3DF0F2A6DF2A38D98A52B79D4ACDC062437BBDC878C849C3B0B5BCB471053CDC2968041CE388C8F31F1CEACA43EBCB23CF588389CB55214CA4B69284094849C88831A72ACB0160D0438A20828820A20828820A20828820A20828820A20828820A20828820A20828820A2086EEFF0077A7E94D31DFFF00CE585AA4E7937BB46410A4E8439639FEE8CD0D3C4E151C8CA4F3C81F5FF15052A6142580513F5540EBC3C8BD21171BEE6CF9F2F7EB1CF0DE75F398E7B4961966C1877000F02173C31776A348CF4274D33E599F2A7C75C699782C48CB74B00399A9E1E5C4C5E3C3D3D52D52C8240075E3A75B679DE24B6F360ED76A2CDFC2AE116EE256DACB8A700519E12A1C24EB072F87A7CE39FB489DAA402C42D65CDB3F75B1E11DDF61EDD560C4B5952D40148FA4E64B59F5ABF2CE91CD4DBCDC56D2E09757D7B8532877094AD45843416A772278F2480089074D75D4452D3B1226282D4C6EEAA64295A67D5ED1E92F09F8DD1264CB96A9A02801F49559FAB80C476E91AF8F5AE2EDDD2AD5EC2AFDB5A55C256A6149464489072CBD339ED584CE483BC9E058795C9E7EDA3BB6C5F19E1674A1F3160D01AD43D5B3CF85F4192F6D84ED0BD76BB6B2C23115AD6501372185FE1CF10E4B1AC139F965953C97884A98960D7CB2F75AD6B9C6BB77C5B874E1D7B8B48FA496040A8CEEDC5B91D2374BD9FB73AFA1D4E25B43689376B5256D29683293075E2CC6A34FA654F113921F788B6445EACD5F5EF1E62F1978C49337E54CAD6E68CF5CF896FC88E8561086B09B166CD49953408940F7784FE5D633032397A9A693B1A90A670CF4663D4971F71A479EB6A62958DC52E7BB1597BE97A07A3FDE26D18A5BA6650AED034EBCB2F49AC231214097A86A1258BF3CB8FA188DDC59A3B8EBF8E10B3D78D299012485DCA541A3FDC9294E8BE62797A7ABB42D24124D4E941D7A3716A1B46802CAC245377B17A86A7ECD9A916CDEB372E6CCE296616945FBB6F70B616A24240690E2CC9D46432F2EA327294A72A9A367FD1B65DA30B44C0B0A25935DE7CEFC2CCFEC4637DC3ED1398B6C9B5875F2D6AC46C6EAF9370FA892D287E25DE0E151CF2488CEA570F286E0373A914AE5DB816E75289511308DD25DB2A8A1CF2B7171190F15DBAD92C11CF0B15C770EB120C13717286C083067888A6B899692E02439CDB917E3D7808708FE40B3F0E9CFEF0C13BC0D80C6DD6EC6CB68302C75E91C16B6F72D5CAC139C040CC2B39E711509884EEB860746AE5C6AEE3C99E1C4B4266391BF2DEE41670072A80D9DBBC4B3D8707407ECDDBBB22DA789BB76C86D939716481D7288D66634A819C95256480A15E34CC0B55AB778709292A017B8B4B67535D6835CEDA8362DC5CDD5BA6E2E140BE4A92A6C93E20083C2091DC099A69353354951357676BFE6D7785B79091F2D09DD4A6B664D5EDCC9FB3522A6EE21C2DA9A71074952606463F7C874A60A42F78D77781241B7DC8EBC60157D058EB6B7786D89DD3785A9973C4BA5AEE891E1B4A05ACA06635CFEF2A7D8374919BDCDF86553CFCA130779F7923E934A026AFD69C6DE9AA3ED21BDFC4F7718687F03DD5E25B5F893E825955AE0CABE4F1651C45242B98D34D672156FC2A920241602973AFDFF00340D19001208592C482E5C69F9AD7368E79621ED19ED878A20DDEC6EE5DBC0DE7CA821177805F5BBA8014784A92D92448CF29EDD2AE183C260A74A0A5896F9EF370CEBD34D22630FBA258DE3967E6F522E29C69711682F6EFF00891635748786CDB564D13252C5AE28DC2409C872CB97E94EBFC1D9E5D928366603ABF3E873BC258854A0E00481A1142EC3A9A1F748F1BDB9FE237638D3CD8D9D6DD6121BE071EB5C514E12539F11919493CB410234ADCE03670500D2F3776A534B3DBEE2B10D3C7D5F4D53C1FCF97F778BD6C36C7F88F39709B8FE478606A4152556D8A710C84889E5AE5131F04CE07679144A1C02723971A6A2A223662544BB727F5C8768EACEE131CDE3627BB6C05DDE961AE31B6AA1703154B0D3A8B710E90C94F8DFD4CDBCCCCE7A64455136AC8969C4912F76A5D85880F6B53FACA236619A85B07A16A3354D838BF2AD6335A995940594940E8A107C88CE0E597F9A6C25B07B3666FE9DADC2E61D4A9B368EE793BF07AFE1B9BC205D053E085A4AA0FBB3A6A6239CE910640E951F8C40DDCEDDAB9532EB9E8625F0F88989FAAA00C8DE872EE7A72882BFB27735171A42359528803EB1D7E3D22AA98B96778F603DDC8AFE6B12B276B0412198B86701F8B7F62869AC5917C508756994B9C310B6C820F69C87A89D2A2572F7D2A49B31AF2E4FD43EB174C0E24CE91BE48622A03925E9EB977362602E16933EE91A6BFB7F9CA7CAB93EDD93BBB4142C4285EEDD43D3A73AC2F869844C046ADC5AAC74FEA2031369BB96D0B295A45B927FA6002B9CC4CEBA4C8D055E36691FF6B4822A1AE38DB5CFDB45AF0CA280B62499A1C0A9DD2054707E6F68D62F6862D5FE19B378A5D34D24E1D8B5826D1C4262E1017885BA1C927498E434D729AF487C059BBBE21C2906826247BA35685B57CE285E28584A26805C90AE21C8F304BD357B523B89B076E977663671F42DC8FE51619AC82A8366CF3191EB98F9E55F657C1EADFD932142C65A07601F33AC79636F157F9B3028241049648A317AF5D22F46F0F6DA7D572CE6EAC0E32B882448AB5D5CD9B2D78BC41D5F867FAE3D624D09E148100750349E7598CC5544105104144105104265C4804C1CBCBF7A208A92A0A008FB34411556017D473BC105660828820A20828820A20828820A20828821B9CD6A9CC6500FAFEA3E95B2D01728A48B83D59E8F08AD7621C31FD3FEB8B4337340498FD74FF3F66ABE642C6FB07A1619B077B81DB410BE1E5A66104BAB3A75BDEB4CF5B4738769DD461DED4D7AEDD9E14624122DF8B20AF0ACE17C33E7CB96A6BC73F1FD1B983C5354EE2AA78D7AD79522F1B170EFB840A5AAFAFF006D4E45E325DF5CAD372EA8FF00D8883A94A89000D728C88D39659D7CC7C74E5276BCC00D02D4FA5CF76FD17CBAA6CE947712086A0F263C01E34CA978B6EFB0F6D68530E34CB96C4150428711CE54796799E7A0D69D4DC7A81DC2A2DA13437E5E5C1C459B0D8C9921695A54A4B3074D0D29F8A7ABC630C5360B66AF5D5ABF9532A70AA494B29CD47EC69AE62954ED0144B816D18FBAB3D5F9BC5D367F89F1D2032671090D42A3F917E7E861E615B2983E1A84348C1D91E19399613399EBF4CA220E5269ECADA29B10096AF1EDE5C1EC6338FDBD8FC5952CE32690A006E8592035D867F9B0353191F0B7F0FB3424218433000C921307A65E596A2333CC56CADA2EB3F532438A13C46BCCBF168A1ED44E2B144FD6A5139972FDB950EB43130ABE4B878D2A949D0C920C7791E5E9D6A2313B4089CDBC40A31A01D736D0657E310E9C1AE582142BFF0090FBF3A57411E7E2BBFCFA4FFE54BC8C7B8037C971AD2FE7A0E1CA364E15C394D4E8187663A738F1AC4494DD28A813645AE1139FF508E28813CBA7AF598C3E31D2FBD40CFC3CF2A071EB18548DD5210515980B280D3A6A6D719E70FF0013C45855962188A9C436D5AE1B76209E1054E5AB894CCC892AD273FA54CCBC5216410A601B3FB72F6F084DC229081288256B25414452EE413536A7E99F9A9BAADD46F776DDEC6319B7DAFC4300D97BFBEBCFC33585DF3F6D78DA1372F2547840E01C473491320D4EE1B10552DDCD05CE63CABEB11B88409738241B268466C1AFE7FB8D82C07D923661929C4368F6CB6E7682E78F89C6B18BF4DD5B13C52470A84F01E8796998CC5CF0B046E9AF6FCC6A824281A1E7EECCFE90DB6EBD9D6DB04B91B5FBB0BB7EDB14C3CB6EDD5936B0965696C26006DA01454A4A4954F5EB4C572828300F7A69E96BDDE838C3B94A00B29802FBBC75CAB57B7EA3316C0EF5AC31DC22D70FDA6BB6706C7ECC06556D72E25872E5685704210B3C4B242499FF00CBBE6CD783DF0429E868C2879963C837385A5CB085A949AA660FA83580058A5ED72FC6B6B65DB8BA61EB6FC438461F2907C673FA485240C9415CF88099E73CB96666CE64394B1ED91EBCF4AE51A00259500A33534A3EF10E73E3D22D6676A2D97722C6DF86F94494F8EDC3A91DCA81073CA0EB977A80C5E1771C94BB3D4873CB85BEF710E08702A43642DEFA45E2186EE59699B8653C4C7BC97169120A8F16455D34D3BD452677CB5005E97229FDE79757786DBDBAB528289DE23E97766A503DF9430C45AB5B80953A8B7B82CE6943802A39E999E5DB3D3AD4A49DA3BAC1EB70097176B3F47CEBC6164EE8496078D03D73D0B0ABE4211670966F909BD0D2592E65C0D27850383DDCA3213FAEB066B49DB7F13294532D4B6B80096F2F2F586FFE62649F9656481404B392F6AD1AFC9AC21E7E1DCB51EE072120444FC2639469DB3CB44BFF0052634577D63AAB97DE364E2933AE4115BDB4E3CCD0E9A3B806D968E271A74BE7252B8667391993CBBF291DEB7FFD478C5172B9A49A9A9E5EFBC2A12B2B2C65EE64FAB572BDADF984D572D5B49517929EF97DE9D67B01347FEA1C633954D1CC9D5BDE5C6154E1173582370ABBB926AF9BE94072AD22D1C6378585618E38CFE29849464438B01C075CC4C8F3D4CD4D60E79C523E62CEF28805CBB8E64FAF03689FC0783F138C489C6429454CEC974364CDABE678674B5BFF00763669C70A2EB16B76C4E85F48F3CA7598F2E5CEA4E54B4AD3F5915E7951B8D5BEF944B2FC118C949DE95852A2057E93E54248A8E59B52166B6B366B10B8371618DDB38B7238509B84418906409F2D7BD34C6E191BA4A5493CEE08BDBF711B33C338B961A661A605077210775F51A30ED487779883CFB7325F6CE60A254387288EC00E474CE7AD371A8DD51AEA2869A55E9534CAA5EF1098CD8F3A5AAC6EC41151A7DC1B8E516FAD0149242383FF00150F7A679888CFCE2A384A065920558DC3D2AEE6BF8CA2CBB35065604A4E8589C9AF7AF1B54D2B7888B86CE720F68F9F7E5A7948AE41E221FF00F60A615DE1956E1C76875865BCD038977A55F3D03D7CB586B7486936E841C94E8565CF2E994E93D7E02AD580504ECA4B962400E4B661AAFC34CDA2D38652F789BEE07A1B02C34CFBDAF58D58F680B05B981E156ED82A0317C39413131FFF0020C2A600EF3CC65F1F40FC079C3FF51E140723E627D79D85F93C50FC533184DD6B6072E55AF677CE91DBCDDC2148D8FD9D4AE4286156120EA3FF0088D083F7A57DA1F042F7B6361C1B89693E498F31EDE2FB426E5C0E51901BE7E9FAD5CA21A14A20828820A20828820A2086ABFCA7EF98A208A9B5A528009CE4F4FDE88214F151D7E63F7A208AC104023434411ED1041441051041441051041441051043424176648198C86B33AE7D4F2E9CEB72B0894544380FDAAF9D73F758D0C82A0082C9258BF0E9EFBB3779B511023EFAE63A547CB5267853101DED7CC00435BCA1DC8099742483C34E141C9F9DDA39BFED41835E607BE3DDA6D6B4EB6C61C1DC4538A3CA5148056DA1A652B50112A260126BC81FF509B3969C162D6038DD57A6597B7A068BF787A6A0A65A7526FCCB11D0F1F31190F12B9B775A17691EE2DA69606449F701927A1C88D2457CB9C760D5336C4C0DBBF5AAEF5B923F27CF5EB3B26515A5082012C4D4519B2AE9606B70D9C5A0AC45374B2E953C8493010080070E472D0091CA399EF50DB492A918829776A1BE8E34CB5B6978B0AB6792948CF403882E4DC71E368F5174EB47FA086951A07733E797AE82A3D33560BBBF7E99F2EDCDD05E12623F8A95517724654E068E3D6137311BC5288710C0573E10A803947783D065DE9D2316A0C5EF7735D5B2EA75ED04942D0485134E3CF2F7A9AD2103E2BDF9A00EA24651DB3F4FF30B7F9A3FE4D4362FDDCF4A3FA187E89D2401BC0122D6A7BB74891B674B6D21B3991327E7D4741F604B398264E9856282B9D6D6D5F5E995984F54A2B200FA4D8162EDF872C7D21E25D52A20FCCE5F3E54EB0F2660A9272A039D2E3803ADFA4372B969A048ADC365DFDE9155BB6A40BF796B4A9A5A99F1500CAF2309CBF42721CF3CE730C85B5DB9870C2CFAE9979D5099889614974D43B1614F3D784629DF6E3589E15B2D6B86E08D3EE3F8DDC30D071A0541B6C5C212E874A4C89415012623BCD4D4B0A29156398A86E9F9BEB099C54A24EF2052C5AD950B9CEFE958CE7B01B396FB31B3369875BA43695DB34E909007F51E425C72748256A56B9F51315352710508092EE00CD83E79F768AEE38A553B7921C39627B53F079D69177780855A29859515924833A664FCE69C22782C5CB96BE7CC72D1FA43505887EBEC7DB9437B4B336CD3ECA5280E5D0212A0202A27883A4EB0321D01D29F4B9C802D7B161C2EFEEF6CF72B0552D4C92106A186F558E5E75ED5235577DBB97631B617B4F845CBF8663F8105DEF0DAAFC2B4B82DFF0054A5600E257BA888E67999A5C4C964592E320C395AA29A3BC3B46252E096034F646BD838D2301EE877C9BC0DF862F7FB2B8AD85D61786600B4DA397A869D67F121AE26F890E1252AFF008B33949351D89DAF2252BE4A83D2854C683D7ED0FE561C4C47CC012806A4B004B9A51BA7946EBEC761385600828B6538F2930971DBE292BE29CCA5423E27B557315B4254E2C96009B5B56EEC6E358557825B10028D1DC697D3A68D9BBB5ED717816E908754A49009F0CFB9CB4CC75F2F4AAF4E214A56E9A1B75AFBBF0D2139781536F14B1D0B057BB71BE70DD6F2D078ADDB6564EBF884C83CA323CF3A4521492E083ABBD7CB9C657842A052EC750A63CEA29A5B5E061DB6FADC424BAE1B75FF007376CAE06939EA94F53CC9FF0034F913A40401365A49D583DF577CBAF48899FB216A5EF6FB816AB13AD73EF7CAD15A956FFDCFDD93CFDE1CF5E7CFEF9D6462304A1FFBA1FF00D21F857A5DFCE1B8C3AF0EC93522F99F3619F9DF449DBD62C9B539E2385B482417152729249CB972CB2E5DA4B0B2B0B394375294EB4039796A7CA27707865E2421294A4A945AD5B81CF51EB9BE9F6FB77D69C14AACB0CB974DC12A48F097212447E6820C67CB908CEA613B224CD62025AE73D2D567B768EC7E1AF8798DC7C895304B092A624B149BBD69516F2E31A5F7DB73B418B5CB97577885C7F5CCAB85D564341A9CA408333967CEA4A5600490C94848E54AEBE5FD8AFA07C3BE07183C32244E40DF005C71073BF967A88B2F16BAB9BB928C52F50A339F8D1107CB9E5D35A7024EE8259C0EA3A53DE516E1E0A9332A10914190CC64F5BBFB7885636AB1ED9CE1559629882DE6CC92B7945A235CA35CBEB03AD31C44BDFDEB56874193D1CD731ADCE510DB4FE1E7CC967712900E5EB460FE6EEF6BEC76E6BDA4715B9C598C131A7D0E71A90D85BAA247432547F49CF5EB5E9FB326CD5B83726EFA3035B37E291C9F6E7C369A9139611500ABE905FE90EC32A8B657B88DFD62F59C518372CB8D28702567C320A0F1267239E7F669AED7D98BD91B3D78C98A1BA12E4039364E19EB4EF58E358AC0CCC22BFC7285A194B1F58666398A366DC18EA623DE09530A7828702499139C831A1D73FA9E506B814EC4276CED4299043EF3026E58F0EB7616EB17295F2A682A0487BF7E0DDA2D8BB4BD78F5BB8CAC25A649E34A8905526047A83AE9E622AE188C1AF66ECE0998090006A386A3E6D5E80D1DA2DF859E9F944D015062F7E5D88B91768C67BD2C1BF98BFB3D874B7E2E25885AAEDF889294FE1AE995AF8F2241201881DF38AEEBFF004F928E2F6FE0D69240F9A1C500351C6AC337E51CF7C52779334BDC28E55615CBDE79C760F64C26DB01C2590326B0FB341F34DB360FCE4CF5EB5F68FC264E1B64C8704FFA48B0B505A8DA0D34A5BCD7B4D0A998A98A51FA8A8E766367ABFAC5D68706700998CF97EB5615ED1DCBA559D0073F6EF118A94CCC4679F2E1CE29FC5B61C2D190A1033D331220FDC73A25ED0130B00DA960D76BFEA115324B13DE9EEF15A9F4A53C460F9199F21F3D6A4E52D3303EF2453335B69EFB422B9BBB6AF1FEED9E45DA1A7F32689E11055CD23F30E922644F2A6B371699733E581BC750FEEB52D0D958E420EE962AD054F5B0EDF6857F1CCA44AD40189099851F2075CB3E54E64A8CDD136BD39E7942A9C4A5428CFA77E3EF431E26FDB5202E14892442C7BDF09EDCFF00DED35489555CC401997B35DFDF9D21ECA96B9A010186B966D0D5DBF69394923E9CF3D62753032F8D42E2F6E60B0C4838896FA6F0A7E7BF0E21DA706A2CF4A805ED5EDEB163E37BCFD8AD9E5BAC6278F61CC5F311E2D82AE5B4DD278B3482D28C891046B919D2ABDB53C73B3B6661158A993659003B05269A67CFCA1D4BD933A6A884A084E4A214C75620D5B3A44161BBE9D8DC52E536F6F72A1C4603AB52037F107F59F94D3B67FC65D918FC60C2A14872ADD774EADAF06FC52313364CE96E4D8396D00E95F7C5B2A5AE316370DDBAADDD43CD5C025B79B50534A2333EF75D0475AEAB86DAD2715864E225AD242802038CC75E76E05A23CE1D61DBFDB70D51CFDE9AC488B8495A91C2A1C312AFED33D0F3FBE944BDA895CC0862E6D415FD18D3E529897142C469ECD2D9650AA161C4852743313DAA550ADF4856BCFEF1AA925258DE2BADE35828820A20828820A2086123C4E1EE0FCCFD8F5ACCE1FF00F156AC8053F2F64FA43A425E50E6A3D89A428540850E9233E7F647D399AAF6CC9CF8B32ED555FA9E1A8E35D1A358D3FF006C4D89BADABDD4E309C212A38EDAAAD6F6C5C6C1F150DDADC26E2E380A4710E26DB2150340796BCDBE30F860ED6D8B895A51BE4CB2ED930A8B708B46C09AA1302033259DF4539FEFBC6B3EED36C5DDB5D82C3F145A8A6E380D9BCDA8C14AEC57F8658209247116C9CE67B57C89F887B2E6787B6B4F985051B8B5D5980ADCF3E9A976A76FD893D9090E1DA8721916CF83BEA06513CBBA0D2CA262232D27FC6A3E72753C6315B4FF00C99A5649356BD78B67A533F4BBCAFAD00D19AE6C47BA7AD6176EF4883C5A77E5A473D24F61CAB444D2A65025F424F2E1FDF9EAB97BB4BB54BDBB55BBBB370878973C44858D0E99F2FD29E4B9656C5C1D4E9FDFEDA192D3BC4901ABCADAB663FB7BC3E6F9FA73CF2F59E7AFCE9CA70FBC452D5200BBDB27D32F586CB96C5C9BE41C9F4A768593F986BDFF00CF6A7689252057A1EB70DDA13521245125CBB96AD3DD38087CD7F6FAFEB4FE4A294E14CEE7F64F610DD520B12417E0FE6E3216D6247F061865370A59E1BC30533A701811A46672CF974A9995294102A0939569D1BDF488D5813173129FE528FD593BE6D9BE79C4D3780E137D6ADA714690FF0081EFB256124833C530A079C69965E712B225050AB06A56B57CCE6D9BF9B888EC42E682844A40512FBC482586AF67A9D6D71130CDDA14D27C3F7509F71232FCA9012072C801FB73AC295B8B24F2D1E9E8F73FD420B94490141DAA684D4FA7AF2857F140F3E7CE72EFAFD3D2964CC0082F4C8034D6C4FAE67A468A934A22B4CAA7DFE8DE28BAB852916C5A265B52B8C89CB88C0075EB3AE7C8D3D44D06A08E5956C7B674849324EFA8A92C0E4CD6E6EF6B8A33C597BCCC758C0B6471DBF7D21C1E034D2F9FFCF2D899CB32AD3BF5A5FE6EEEF68D972D5FB3539C6C892920100DFA5FD9ABC61CDCDD8E0D856CDDBBF86E1CD337B89BB72E3CEA1A4A16B2A794A0544004C71644C6B3E74EDA7337B12480CFF6D3DDB47A58F092C19037CEE8171950E63A17E4632D3ED356CD169D584BAE0924182273E79F3CA7A79C45C3E94B2B53A58CB1404B105867F76B71315D9AD2865012E7880490BE2E23A9E7CFA72E9446CA439706BC7DFE624D2BE21A8FB3CB5F58F5A21BAD172C5F30D78F7C4299CE008D4F5F3CB2FBD6929A58022E3F223558019B378497759812353399CC7C40FACE79F3A6C92C41766F7E578869D27E6CE600D081ABBB0E6F7D2CCD420617DEFEDD1D98C02E4B6AE15B8DAC20E801823B733CBA4198CE7F674D4EF07BD1DB8364F6CC9EFC3A5F83B63267E224A948DEDD62011435A3DCFBAB54471EF6A77818A5EED0DC397CF2DE6DD795C3C4A24264E838A6047FBABC60A6A77413502835E75BB79B5338F69F823610F91246E00E91D18662B619674CAB139698A85DAB6A27358EBE5940048CBB4CE841069FAE68D69975D72FBD62F58BD9CB9135920D05486D1FD8D6DA9A1CC450264881CA673ED32232C865E7A4B45CF21C034550B5A8DC79EAF0909CB9640215A501A375F4FC442DF620C2D21B5000AC11CA67965D73924D3499358904BE6E3F2EDDB48C7CF5CCFA06F1D3CFDF73CB155F3B89E0D8EB18861EEADB8702814A8A465E519C1E7AF3EED953774850259E9A65C73CBCAB0CA6EC59D892B265A88502EE1F5B5EF9F28EA0FB3DEF06F719D9962DEF1F5BB7496F85C2A5126048124E790D0CF3ED3517E319FF0033C3F32593BC4A1541A3E94F6ED78F32F8F7C3E246D09BFE9EE904D8354BBB5FA9D2F58D8672FDE369E0824159EB1A9E59F9F502673AF37787E4997B5F79882262A9D7DDC8E2238FCDD9C5134FD2D66A3356F5D21F5836AE04A543DE57BDDF298F9199FAD74DDBDBD3F05BA1DC8038E55E3FAB343E4C8F9729E808157A0FEBD8BC634DAFBCF1F7A3BACC178A4DE5D5EC26419F08A17CB98CF96401F5EFDFF4E3B3CCADAF84514D3E62090464F5AB797A1A8E6FE279A1299AE4FF0015371A1717EF7FCF607086FC0C36C520C14DB30982607BAD2464272F8EBDEBECEF8551255B2E402104FCB450B3FF0011CB4FEAC3CCBB571E99589526BFC959B677D726B696313CDAF23319C4472E994F3A9C9B8390A2019690CF50900F2D0B7AE511A31C998FBA4022A75AE753AE55EB0CEE6CCB8A53ED28A5460C1ED965EBEBF1A6337032D03FD30D43EE9E63918CA4AE654B9734EBFBCCDF934276A9712541E54C64028F2CC69F0EFF00AD7F1188998759FA983EA476D457DE4BA2402FBC2FA5DC7EB514E358A14CDBB6FBCF209F117054A5C78420671CC77CF9F7353B85C6603FC713710B921412E4A88DF06AD77AD3FAB16EBD9614B2B4A4BB50354B9C83036AE7D59C595B51B6FB29B3D6EE3D8CE2D66CBCD4C34CBE80EE5FF8AB9E407EB54BF1178FB66EC996BDC9F2C14BD4292EE1F9578E6D9C49613642D44028209BBA73A3DBCEDE51AC5B43ED3570FDC5E615B01B3D8BDEDFA484B18B6296BE2604E28C66879B54A929D164686BCD9E2FF8ED2B0DBE9918A7237836FD2828CC781351168C2EC898AFA0B849008DD05E9AE8C6313E26D7B42EF0093B5FB59806CC60EE199D8EBDB9B3C4D0D13201E3F74382418D2418CABCD3E20F8F78F5CE9865E2E6B026D315BB7E05BD2968B061B6484A424A3798DC8ABDC3D9DDF99A42DB3BB9DD9AB4B858C471DDA3DA8B84C156258EDC22F2FAE179921D78895250470A33C911AD72FDB1FF005098AC4C95E0A662E66F12410566B51C74CADC749D93B31A57F1019E940DCBAE9190118260B875BBA9B6B271AF0D24216A692932260830232D620F3E951BE17F8AEB95B4E54E54F213BE2A554BB3DF4634CF9445E376728021208CCB8F5A1A643A4671DD163CCE2B84AF062E14DC614A511240510E2CA877D079F202BE85FC29F8928DBD230D86F9FBFBC121B7B80A55EDC8966B068A7E330E641528A497BD1DDADCFB53A1319B5DBB52ED0B4DF10B9040274300C1EF981F3F87ACB666CE44E948C4160E01AD19C6B6CF47E0D7AECD5942DD2D5720356D502CF7D2272C12B45AB6173C512675939E7FA768A94284CB2509B0B7BF7CE1B6FEF926BEEC07010F2B119828820A20828820A20861C12E13A1E674CA75EB39E5E75B4D27FC75268CC4D79B81C896A71870957FA613C4F2677EFF00685384F14E5DE3AF38F3EBE7EB5AC14A54AC5FCC66FA89D2845001DB2F2A425314C014914BD788BF9F3D0C59BB4B602E59BC66E528751736D716EC323DE243CCADA59E13A81C5273981D00AB26D1C148DA5B2E6C854BDE3B8ADF252E1CBB0E4F7B75B895D9F89DD5A595BA1D2E41B91A17AF2B7511CAFC2D86375FB7D8E6EFDF4A9168E5CAAE30B5A0016CE97D4ABAB84B44E4A502A85009FCD97535F26FFEA63C1ABC34FC6CE91288AA88094B50BE5C3981CB3EC1B0F1EF2A5A8029A0606ED9160FA96BB01D22FDBC68DDB8BBB62196571C2DBBEE39EEF320693A8D6441E95E024E166C8529131C292A21B2FE5C6B4BD348EB3B397F370E8A3EF5C9CB3BE74E34B81110C5D715C7E1C1293A059C9073F4CB4CF28A792533010E6CF42723CF89E7120A97424B74773CA95E462EC6141A425A52D2B52466A4990673CA796639D4D6186E9AB16CB5B96F3F2A888F54B5281205C921DDEFD7F30FD1708E60E71A67F4D73CBE93528898803439BB71F6DA57386E517240BB54549E14ADA1C25F4710C8C7A7FAF9F4F4DBE6A29F50739387F5F48DBE48527F890780D0F2CE1EB770811AE5DBAD3C9335096AD7C9BED7FD6A92A4960DC7A5EB4B509D4758A96F5DBE0A78D0184478024C833EF710E5273CA321E553322685331D5AD4BF13DAB5D3364BC3A0951090952BF9716B1A72B73AE9376AFDCFE1C21F7029432053311A419E80F3F9549CA98C28AA6A48ED66EB7AE70C57242545D00306A0727F35F28789B84B00340CC6A44C7BD04E874D35CF2A8F9F39A6286F501B8208B7F41AD0CA6E1C95380467D3806D5F8985C5C9390933D24FEB23E535AA278554AC86B0767BDC7F40469F208B247507F07D61CB2E10D5C051953BC3E11CC84C6B33A03EB4F25CF600DF4E1ABDFCBA36692A428A907E9003EF0CEA29C3C8C5A1B65B3EEED5ECAE2F81AD683717EE5A2995289F0D2961E0B7028E664A410235269E23140A4835245079675E3E5C630A9133E6CA28291283FCC16274A5AEFF007BC31C1F046367916366C2521BB26C2484819A9491C4469CC4CEBFA56B1CBDE9E55A9763C35F7E64C4C4840548521CB960F6039F9EBD225AE116F7772E3CFF0019414C2008907860C8D333D34F9533A126E3CFD4F9F942A842A5CA084B120E76A9AB7AD7AD629B3B12CB094215EEA492924E704CE7F1EDEB58850A80A1BE6D6F387801403C5CB90CE33A234242886A1ADFF4FA43776E005409D739D065A9E7C8F5CFCE91981CD5D8B5B87F5E70DA6A4EF312472D381E7D793C473B720716A75D20E639E5F12338D7B068A705B8B3FB7A9C9FD690A6170E14B0AFE4A7140F4FC5AFCA35ABDA06C9EC4765AE54D254B752D2CA12904A879C67CA7AC75A96C34D4A1282097CF362F9DDCE56E2C2D1D8FC0625A315BAA01814B3D32A803BEA79C7212E12E5BE2B72DE2E859525D5786003900A233E2D3CFE11955B30389010904D40E5CB91CF933691ED3F086270E8C3CB48DDDEDD00136AE65EAD66FDD66EDF1342521014AE119252341DA35D0C1ED9F39A915E212A1722B4C9FB9FBDBB474199814CE4FCC74AF785C5F2FBEBC3524BA5DFCA09D673C8E7AF5D3D3E3CA9A2E6E76BB1CB4BBD7A74AC4362364EF1748CCFE3B353AD4DA2DBC6F114B4D32E369754B24CF081C880200A69367B8209ADBE92FA5DFDE8E23383D8A4CC054906BD0374E56D7998B5B10C51779E1212E21B724407494F4D633D20F6CE9B99C4B24292C3F8BE45A963AE917BC26C992894EA4151DD3FC402598DCDAF993FBDEDF65D45DB2CAFF10B4389584F096C92233EA0E7A03976279D43EDB9DF3B04B94A2E7748615A1D070F4AC7923E2F61654AC76254801201A0CC6A1B91E0D1BBC9BB63C4432A42F8D24498CB91CFE73D74AE4B84C38918FDF0199449360DAD6ED5A37DA3CED89967F9298BB8059F9D4E608EE0C5CF66A0FDC80D25442000531AF126065CC08EF19F6ABC0969C604A12E4121F3BB120307F4BF3888C57D3208240556A6C1C66467A6BDA30A5DB2BC63DA7F74F84DBAD017833B8AB97E09C921DB74B8D822352065C519E5A44FAFFE026C6323178599BA2AA15E3439F3ADFCCC71DF15CEDD4CD17A299893ABB5A9AEBAD44764AC5D53EC5B0692B090DA119CFF0062129303331918EC62BE9C787538A4E1A4EE9DD0501ABF4D0545FDF91F2FEDB96B56354966FA8B1ED9BEBF6CE9131E21B74A54EA5652A895019274CC9390113FB55C7FCC44A40F9EADD201724D389EB7F4D21BC8C2CEA50D6E75F77E19EB0D6F7136ED185DD29E6D16A94951714A809004AA4E8204C98CAA0369F8BB65ECF96A5AE6A0EE8352A4B5B57F2BF78B260B08A528259D4726BDF5B0CDBF6DA81BCEF6B2DDFEC7DC3D63678BA31DC59BE248C2B067DBB8BF5AD23F2A590A0A2A9CA23E735C47C47F15F634854D1F3E51500AFF00724316A06CBDD2D16791B2B78A7E8AE6E2F67FBE5525AED18A99DF26F8F78D85A2F706C39AD98D9FBFE34B0C630D5C59ED1B484129529F4A4F08E28E264FFD08EB5E58F1A7C7FC461715324E1314532D2540042C806962C4D19A99F38B1613C3E850F98505D4CC08A060D4E3A33F286F83EEBD8BEBAFE67B578E6378A5D9505AEDDEB90FDA49CD4025C1307CB3115E72F14FC72DA38D331271733EA7702629EAF70F6D74E959895B11200013F50CC870391616D7F35C9EC5AE0B8484DBD85A069A68421A4B690D891AC72922550333F1AE3D8CF1EE2B684C56FCF242890C55EA0BE60B3F9089CC36C800074017CAFCAAEE39D3562F0E9788DB110AB5682644C204FCCC44763F2A7123112F1A9798A1BC41CC568F6F7DA2451B2806DDA13572EC73AE75D1E0172C3612E59B4842B4571244667B69ACCFC2B8D6DAD9D8A5F889A4AD46515644B014E9DDBA64B0C1A93BC998DF5301BB6A5C97F4F2CA29BB5BB7C10D9E042345F0E47399024F3E53AE5E553F324E2767CB4CC0A208DDB38146D19FF3A986B88D9E8520B3922FBCCEF6D2FF009B45AD866D07FF00816D93174DAD630EBC75B4DCA947DD4121284F88720389648483AC7781EB3FFA7AF1BCDC36D4C24B9D38A46FA036F367673A80C2BD328A16D9D9EA017F48200A86AD7FBAF08DE3B2B862F059E20CA7DC71A42DC1A95788D8292206866467E55F62BC27E24C3E3763C9226254F2D1621DE96ADFBD41BD0C72CC7CA5CA5949AB6F55249B96E1A75EC22EB654168E21224CC1D469AD5A02D333EA4D8D5A1ACA0426AF7CEF427DDCC2B598560A20828820A2082B06C791821B05242B965ACC41EDE79D42A3682A6633FC32490F548371715360F7E02F585424945297AF5CFA450B751060C1E922467FE321E952EB929952D5319886AE43573473AE7CDE184E594AB749607372DF80FF009EB6E5EDB3D77885BDDA4AB82C82D2100E4E0793C264660F083F426743A61B694B5A6648762BA298DC07760CF5F22F9C3BC1CDA906C0E5AF63C99FD446897B5AEEC2E7F96DB6F0F0041FC7ECC3BE290D025DB945CBA90E8570895042279E4267515E6BF8D3E0346DEC2E2A7225050285127774196AD47C9E8D78E8FB0F68D65214C145986603DC8A548B1A1D230CE01B5B6FB5383DA5EB2A0DBEB425B76DE785495B4036B0539C4A924C11A57C9CF1F7857FECFB6A761F7373756A04377CAED6CFBBC7A2FC3A913300958AD03837A8E0EC4B6B571138DD9A5E1C208438661472332799CFBF6F49AA22B06A975673477C8E6DF819923368975A0272040AD9DA81DD837F50FD9F12CC780EAF8968CF8A7AC75EDDA0E99CD3698B12AE403CFDBD5A90D16029F75B81ECFE90F9AB9194E7AE720F5CA333EB34DD5B458DDC73FBD9F4E8E2F0D148214D523337E8E58439173A67D39C65F1CBE1E95A0C7392A05EB4A870D539E661DA255052ED762C391AF3878DDD6B9FCFFCFEBFAD3E958E342540D01A9B599BB1B5A34561F41DBF43D44495BDC7BA9274CE7BFAFEB9F99A9AC3635C02145F47CC11F8A54654786536433D393367E9E96A65128DDD8C803E7A09CF31A7C797954AA31E4A4EEAAE2D4EAFCF817A3F0862B906A4D6CC19ED7EBD61D78B2AD411E93F2314DA6620A94589B9A3F3C837B7864B94E5ACDC7F47CE1CB6F0C88C8C41981F4394F6F2ACA67106E7AFE7BDE8D7D234F95BA2C0F9935E5587497A10003ACC91E7E83EBE95212A783572096EFE9A793BC226555C01D6E3CBCEFDA00F1D38943D4FE84D3A4CE049A654D7DFB6307CA1C3853DB432753C6E295EF13F1F8EB51B893BD3093776603261EF8BC399602502A2BD2C4DB9427E17657C3FC5378DDC6A3B887CC8E16D23CF5F3FDA8845441510F0939A2BCFF5A05481AC651FC875F4310376E70BAB13A46435FAF7AC4C04023DB3DF85A1E270E26241677AD785743DA2356E8D4188F3F8CFEC7D4D47CE21CD0E556A5B8F07F511ACB0252EC03721E963CFFBB5F1FC1DAC5AD5D6AE1295B6E2542089047DE9F104D29869E1EB514A71CAE0B71EE0D62DDB1B69AB0D325AE5962935D4E7DAFC1A39E7BEBDC83AD3AFE2B86DB10254A8424C19F200CF4CC7A4D5870D88DDF50E73E5CEF46E3468EFFE1BF1B7CB952C7CD3BC00DE0FDEFA79E6F411A717D8662B862541D6821482AE20B0A0A80729D397C2454989E4DCB9CF3FB8D3FBCBBE6C0F19C99D8742553379D981555B817F2E76A45BCDE3AF070B6E96C198304E506273396791F5CE915CF228E69535A7077E1F9E57EC26D2958A1BC374B805C31E9F887AAC6F0F527C2B9E052849311CC4E527EB4DD53C005CD4D8BFEFEEF6A343D9B889724198161219F260D42D4F7E96D59E10F6D26D35ADB5921D4B2A74090232C8F29190397C2A3CCF24FF002163AB654CE8787E220F15E38918013126686014012AD417A3F316EBAF55F727B14BD9BC36DDB525521B4A8920EA44EA40F3CE464072A87C5E20A94506A05186B9B823A37121A8D1E56F88FE2197B5B15366214FBC7573F80FD684E95D86B5B22FDCADC1C86B1D3F688F8E7CAAAF3E4EE2FE6002B91777EB98CAA3AC713C5E2D23FD304BD180234A9EB7CE2E54307C36DEB7716D2D869F72E14150901B42949923B2753F2AB3F8687F938B932C1FF700AA0A694EAE699935BC436227ACA666FB1410C9003A8DDE8F95BB691AE5EC70FA7783ED65BDCC72F9D7B10B6D947B086F0C57178ADA0BF6CB6DFF000E4103310A098D3CCD7D0AF835B351253859850E06E9A0B97D2C45B331C5FC64A56E4E29504BD89341C0F3B6763CA3B5789ED2E0DB3B64A7AFAF2CB0D65A4125574E2590001275204C011E9E75EE3C3789365ECED9D2D33A6CB42D08662520EA796AED1C706CA5E2A66FAA5AE639A2921D357CFF005ADA91A3FBD2F6EAD8FD97B97F66B63ADEEB6AB691D516996ED128BDB52E8C802942828827A6BAF9F16F1C7C5FD9F804CE12A7241485070A00F30694D6B9F289DC2786A615552425814900D35DEA368D4EED1AD8EE31ED33BE7BA2BDA67D7B15B2B78AE26ACB0455DE1F88A1854487DB54A01524F4820FC3C57E3BF8E789599F2B0F8A5D94C02C80C5F27CB3EE6B16BC16C192809594A41A312056ACC33A722DCE329ECBEE5B77FB20DA6E1786B78E63EA016BC571665BB8C483BA9525F8E3E29933E43BD79536FF00C4EDB98C9CB32F1338A544827E628EA00ECED7358B3E1F62860771CF10F40039A01F7E228D1976CAF2DAD2CDB65D0AE36C11FD503C4009F7475E102027B0C88AAEA36D6231C8F998A9855354FBC564953D75A677CBC8CC49C0001212C4021BEFD4371A5C0842E3681B40842608F42627A6BE7A6994655178BC22B100A92C49773D684D6A5C7A7187C8C0A52E48734A016167A5AC1D8171D61A0C40DC8F149E12A9CB498819C93AE5FE62A167603112BEA028330FDB27B96F505E1F4B90909DD0C40347B8A934CFD34D63C37103527B020F61F5E9972D2914ED5C66114005AE94352CCFA5FD87857E50C9B3FF006FBEB0ED9BA1C31391981D0CF4CF4927A6B9F4B56CC54A992C63A78057724EA1B335F3CAF1133E6A513B74F604E63306F6CA9A0AB8768BAE1E124E5A723D758F803CBE34DB6C6D2C2CF96654B6DEABB52C5B57FD8D03467E599A9DE48398A3BD19B91FE8E4F696DEE12BC6B66F116AD65376B4B772DBA9C96855A10F40234E22800E42454C78076FAB63ED492B0A665A58823506B466F7A9883DAB800B0A7191737AB68F97172348CEBECD9BC73B6BB0D87AAF9D42715C2D4FDAE2ACAD50B6C36EA99B62B495482A4360898CF3026057D6FF0081BE2F5EDBC1E0E4098A51DD4821DC0343C1C1ABBDF2668E3BB6B67FCB9AB601D4AFA435581ABF106D71A3398DADB6585B414233E9D394768FF55EC9C34B32E5A42AA77479811525A0CB5141B8F7EC8A438A711A414410510414410560D41E460862B695C648227F7FDA7FC72AADC9D958846D6FF309FF0049CD896A0CC7EF3E30E12AFF004F745EB539177B7A77E109780A05464124CF9F3E9973F972922CD8B989561D72C36F100303D5FDEBADE3A7C92B5022BCBF40DE1838CDE36FB6B6548F0D321C4A89CC1CB2F39EFD472269D230389978BF9A15F4B92439AD6BEE96EB1B4A1F2D41CD012E06B959DF96A6F169E3BB3CF63AFBB657A8B6770479A710F5BAC152965C6C89283EE9851907D6A5F68E0656D0C22E44C46F132D40821F22053ABFF6F162C26D64480192833014FD4431605DB514B59F5D390BBCED96C7370FBE1BBBEC45A5B3BB4C5EE9B187DEB69526CF0E52C00B4DEB86196FC57DC096C8D4E4649AF9B7F1B7E10E315B5F13B4E525A4EF2D4285B95B864D51DBD11E10F14C8998144B0C16000A4E85C5F893972BC64EC531469DBC63F95BA8711E1B4ECB64282D2EA12B49491120A4F5F3AF0FF89E51D8D889926602E85148E2DD069DFAC742C1E2062929B97772CEE0D998E86F5E10F7F18AB85788E4A565290A072208196BD62738EDA455490938D4EF21C82F703D1F2A67931D2243FEDFF4FD36353A0A03C0E674CC712E1A749C81CB399E594E79FCFA73AAD6D952F0153BCE34FB0EEFDE911F3B0C50A2925CD9CF0CC77AE5CCBC3A0F1CB3CE791CBACF3EB9EBFA536C0CF5626589801A9B171CCF2B5A9C328752253201567964039A5A1E36F19D4E99F7CB223EFAEB52B2D6A04006835B06AFB6AE42B4817298D183BFBB5FDF37CCDC840824C8CC4E9EBD4F6E644CD4AC9C49481EB6B65DFA529C58CE4D1C0BDE9F7F3EF126CDEB41241041904401033F97CA633315228C61490C6EC286CD6A397D79B5CDA3A6A1CD081C39B69516D224117CDAA08E20349CB5119CC79CE7EB4E3FCE4B80F56B92C6DC0E9CB943338770E01A92EF7AE7D3434E90E91760F2313D33D3B0FF0073DA9DC9C5A580A1275E15A55CB54EBA3011AAF0E4243379F637FC3F387ED3A1690648D753F7CA3BD49499C0B35CE6EC03396CF2E875A886A431208AE60C384852B457C499F9FEF520858A3B1247507367E7EDA34514A6E9F20DEFCE1276E034E14C4981A673D3EF29A426252A39823F5ECD23644BDF4024917E63837B2F0A25D2A12065E47F7A4FE582F7A5EDF88C19605DC3F11F8F75D0C2A1E200100C7A79567712C2A789F6FE4234F941DFB1B9FB7F51E195273D4E7F3AD0A085820D01D687DE543181F4AAB56D3945B778DA8DC2C83CF4E5EA0919F5A4A6CE480451C6B7B3BE6C226F0CA48949A3DEA00AF57AC462D0B920900721CC91D79FED51F35495367EF30E4728426618AD6A21EB5A1ABF7B71F286E0381D25C292DC0084A7946B97DE51AE7484B1B84B92CE2DC1D9E093226C92FBC79B906F4FBF631058DE1F638A214CBEC8532A10414827969397D3D0549C9C60401BC016A55ADCBD5BA67160C163A7482085356A145B36E35A07E3A55F5976EF719B338E3B746D5BB965C7408E04A12DA55C3CA0729EBF1A79FF00714121BE9A56C071E4F4E6747A742D89E319D83DD1366380DFC4D5C3F37F77A46B2621EC8370EDDADD62F8A5B5289095384119CE7EEC4F5E99D657B450522A2BDF3357AB7BE7D6763FC59C2E0D094CC51A001DEFA3D7BE94E30F2C7D929C438CF8D736EB4A0FBE56A25644F972D23E191A6AAC6855986957E1C39E5EA0C9E3BE32E0A7CA32E5BD410F41DAA4F3CEDC6362B633D9EB65F035DBDC780DAEE5B852961283EF01391039C6667B742115CF46E9622C5F869FBA1E51C9B6E78E66638CC32A6A92953B1DE6353570FCCFEA873E3569658682C30829E0425290008C9207FAE9D6A03138B44B9A4A8B819BD6B5AD0F3CDB368A64CC5E231690B98B2AE65D4C4E7534FEAC21EE1AFB6C073C549515FE58823312013991969FB53156225E2C89680429D83655B3D7D2AD4D0D7F152A615956F11C9C963A83C7DEB61EF676F86C86ECF6BB1568B366E61F62B4FE22E3DC2E9B86DC6D3E12841570A8C1D62BA3782F62AE5E225CF56E9485051B937D326D29E71133C94975294F50340E35F7DEFCFEF629F6ABC3F753B27B6F8A61FB3B88ED0EF1768EF880ED9DA8BAB7716DDE3C18F1085070A5285A44E6400790AF69F82BC6F81F0E61A5A6784BA11761906A3915E2FEB5E7BB7F64AF6829C12525DC3BA4E8E3576EA6368D9C2FDA37DA2F13FE77BC8C69DD8ED9FC45616CE0B82DC5D585E30C24884BF6EECA525C4F091C8C9390D281F103E37CE5E3662309885A6539000511FEDC803C433D468F0C703B1918597F2CA522F972D47EDEE1C18DB2D82DCA6C16EEACD0E1C370EC5B106D2957F37C4D969EC4BC4199587C0078A46473AF3178ABE256D2C7159FF226105DC95927851D9EF47EB5112F2F00898A094A149ADDBE9367761620EBD6ED78DCE34965F5B96B7B74A57BA1285B92CC0C824091EE819013CA04E83914FDBB3F1138AE74C5A8135DE24FBEA732F60D3B85D9492005212025DE9AE741DDF3ADA1156D23CE0F7D8B4E28C9C4A7FA82720788C67DA35F854CE071F805247CF92925AEC1C1BBF4D444A4BD88CA13113266ED7E97A11986AD2FC03666B0D5370BB9578AE2CA8AA4EB33197C8683975AAD6D19EA56349C2AB764B80C3EEC776D4CDE99461783F94ADD0000097767D437322FAD6249A6ED9413C62546072CC7D67CFE13562D95890129138953E46CD6E0FDE9E51A2E510E52D56BB9623F2FADC3C78B6C2544344840D04C7E9F0D2AC8B99859B2C83287D4340E3A3BEA1AB9C6C896581FA4645857DE77308159491999FD3EFF007E9558C7E064A945494A5817A8D33A574CEFC214DC2C6B5CB4E2F0A22E0275981D4F799E71150F88C79449560A4D1767B369667BF9718AFE27013264E2A06E5E9F6F60F3B05C5EA0260851D7BCF6F53DA3AD57D5B371F289C44C98A29772378DBAD8B11A3E4CF47F879265202564DAF535D3D8ED9C95A62B6FE33368E5B5C2D170875B52820147BC929053AE401CFA537C3ED9187C74948554298D58B83AD7AE5D03445ED259099891BAE59A976BF96675CA312EEFF1373751BFA7F67710BB6ADB6776E1D4ADB507382DAD956ACF8812B39252A71C54467C4A98CF3AFA77FF004BDE3593825E08E2541481BA0906E3277E2CE6BCAD1CCB6D23E6054C4CB1BE9A25C6B43D1AB5B1A56B1D4EC32E9A36CD80B4A894254983F99244A543A820820F39AFA7F83F1061F1F85978992C10509B35683DDFBC731C5A0FCE59C89A6B76F66CD5E53156186705104144105104144108A8428F9CFC73ADF786E367FB778502C2535CBDDF2D229A6B3524BF166E8DEB942714A913273CF9F2E43A5353F4D48A8EE3BFB31A2D05E82B98B1868E351390F3CE79761A79E9583894804B81467E85AAE6977FDC6A2528107773BB569E768E677F11CDB0C0F07DCC6D1E1D890B773107D36E709B25709BBBCBA43E92836ED932B0CBBC0A5F0E6919F979F3E2C4F9733033904228955DB31968FCBB476BF03E0819067EF2895EE9097A067BF03E7A472EFD94F7E3B59738633B17BD8B7B7C2F1A59745862AB4AD9F16D82CAD84F8CFF00BC4A58F0D10040564328AF953F13766CB99B467AC005D6A3AD09B5BD34B8CBBCEC492C25BEF53270C72A81AE95B51AF1BE7637A875A43ADBE5F6CF170BBC5C41624899C811A11CA32ED541D958444A400774024DEE2ED4BE5FA8BD26480809005402F571A64C694B0B989C6EEC04C0D7427940EB3946703D22AB9E2BD9E89A8580CED7E3477F4B6552222F17860AAB5791A65D2F51FDC546F805646349CC881CFB7FBF5AA7E100C3A0201AB97007134E4DE79BC252E584CBFA921C700FA0E95B707AC3B45F080273D73FD7B7EA741CA45130383E791CB2B7A084A64B241296B8A5B5D2997E9EB0F9ABB0A0924CEBCF9E9A6A7B7FBA7489A1C54B771F815FEE23A6C925C1A0E1EACDEEB687A8BA190904E59C9E646BAFEBA74A7B2D6E1F7806B3963D7D3F55868AC31277999B571CB85EF539DDA241BBA1C2923E1F0C867FBCFA5644C014E1C936A023A5B5E6611128824D9F5D2F461687EDDCE5F9BEFBE79794F5CA9EC99C090D716D43DC53D7F508CC94452A470E9DDBF312B6F78021327AE5273E5A7FBA9A913451E8783E76E3EF50D0D26C81739817BE7C06991E31248BD498D27439E60FA1E7CA2A5513ECCD4B3D1C77D3AC3432C66FD7FA8A16B4B8B9009273CFAC7A74EFD666B2A9E1CD09E34F7D237480031CACDF77E3A43969412224E713DBB4749CFF007AD7E790F4BDE9FB84964166637F7EB0E909073398E5FE7EFE5419CF93721FB86CB98C0B676D7DF1FBC2B5AFCCFF00E6F7D61A9984162F5D2DD33FBF3881BDFF00FB0BF4FA547CE72A249046447DFAFEEF13D842F253C00EAF58897397AFE948C3E979F4FBC377397AFE9442910F73CFEFFEB4411EB6CDB2DA05680A590413009E713F71442A852C00C12D567EBC5E115DB594FE448CB2C81F9E5F4A216DF570F388F73094B8E179A4008511000E913CE338144604C228E09E37AF5F7DA1445BF8060888E7C8F231D873EF44677CB3325B46A5DE195C3216EA960483107D35C872FBCAA1B1D24A86F11ADA84BBDDDBEFC1A24E44D1B9420062E2A03F4C859891D2156ED867967A8E7A89888CF5D341DAA1F08F2E7821AEFA675AB59FEEF0DE74CDE71955CE7C75ABD6343BDBEADF686FB61B67300C21D72D2CB17BFB7B7C49E6D4A6C2DB5DF32D80B52722085100284679F4AECFE1ADA2254B960AB404BD2EE3B72A9882C5A86EA998DB893CB8F95BAEDB6E13D983763BA3D91C1EE5BC399BFC5EE6C2D2F1C75D6997125F7196DE278B841FCEA3CFE3CEDF8DDB72E54B24CC724506F123A720F4D78D22B6B5CE9D34A10909961F7CAA8AAD8A69DCB3F3778CF78A63F6CC214E9B7658B8094A421A484A4250385B006A3DD007D00CCD71BDBF8E189C42A606AD28294B5F53CEB7D21CE1B00508A954D00BBA9CD497356B062FC39B4639BDC7B12C4D6A6DB754941910091F08F2E5DFCEA838E1BE556A963C789E2E6E35B5225A4E0C862D42CC0587BAE6F720521807EE6DE1A714A52D2249CC9839F3FDB23CF5150A6532AC75ABB6AE78FB689AC3E0F7402E920D9854FB2F9BDA3DFC6BA3593F2CBAF3D396835CEA4244BA501B1BE7719FA6A748999787DD4821346E8697B7AC5DB85BA576CD2944E7C53D400A3A0EA0F5EA6293561C99AE1D9C06722AD9E5ABFF00422BB8E4EECD239D0FB6D28E4C5C4C3A32391E93CBE7A8F4CA3BD58307240DDA0B5989D7954B573FB3121C343A99CFAE75341C000E50000504325EA3CBF534CF14CC5ECD5E5F4C6628FBFBF8D5357249C715815715FCF0EBA3EB1B265A58BA5B98D79E7F98F2419CC65AD48ED29DB982292C193471FA61CCBD60549770C082E2CC69D2E215C26FEE9DC41E64320B5625210B293EF78B32674C8FCFCC57199F8829DA454E28B198A07700D5FF004080F5881DA1856A549503571CFBB659D7478C5FED13B2371B41B2831CC19D533B47B3AFDADEA5E68F0BDE125F6DE7405247147828502274E55ED9F81FE269782183056032902A585C020F534FB6747C7E08AB788723EA7A38A70F77B3D6378B707B7B6BBC7DD86CDED8DA5C05B86DFF000772D85494BB645368B2A03FECA6D473CC99F2AFAF5F0EB6AA369787E42C4C0A2A407AD7A8E1D1F23AF24DAB855231AB94414073BA45055CE9D5867AC6CD57A062BD05104144105104141A0274821051924FD690DFFA9812E6AD90CD8FDBBD2352A0FBA7CEDAC794BA405B0362EFD1FF0010A01F533F51C9E1A2AFDA4AD6C702CA9B8E22008CF3C8CE7F7DE9962C7CB04873EE8F5E1E6D95551294B248200701EB9D3F1EE90DD58836A4DC1085245BA14E28AB294A50546328D07330488AAA62B13B8953920A4289198B97BF3D3CD8AE65A9050ECADE20063992DE5DF83C70DFDA0308C53DA3BDA57F97DEBAB6363B6096EA2C6D41294DF2EFADA1C55D20CB6B2CBC9E268A47BA60EBAF8E7E2DF8C932F1589C31994015F4EF3B1008B3DB5FB08EF5E0AC37C8D9F2F7C0DE6AD8BB97626E6A6A1F8F18C3FB47ECDD6D87ED134AB8C47107459B9386BAD3A14E24982A43AA2326C1848098F7644D7807C73B6133B1335654F551777ADC1BF0FD523AF6CC98997BB5A8636A6552CD9B9C890CFC364366F07BFC2708B4B2BB536A7D8441282A28293920E9255C31C5AE7AD72E46DE4CA252179977229DEBCB99D62E122724A4070C33353C1F5EB5E81A2E24F1A44127976FD07EDA74A8DDA1B6538896AFAD2487A3BBD5AC09CA8D946D37FD4FFC7461EFB3B738F0B2E2A1D0A002B91999F211AFD67388AAB9C4BA94AA33DFC9CB1A3C315000D81072FCFA884D771E0E4A24C69C267FC73D7B1E74A2279A90A26D6B31F75AC69B81BF8D356E3AE55890B6BE416D27333ACEBE7039FD9A7A8C4501053C43FB670D952BC631FE3A540BB31E845F36ABC48B77A88E6077313F3F874F853A4CE71424BDD89667FD7B1091C0D281C7176E7D1BCF263128CDD254849139839120C41F879473E94A267310C4BDEB979E6DC5E194CC2906D6E4FD2943AB5B330F9BB94C6B19794FFBE733DCD3C953C13A72B1CAFC1C5FCB268A95914039DBF421F35789809F78F48EBF796524E7533879EC0390DA3F3F400E6C0D2F0D26C87FA5A9C8BE5E63D6B9C48B5700C448EBE7E7F1F873135288C40342486BB1A7BFEA1B2B0DBA93F4853DB5F327F5CE1E22ED2980788EA2674E739E5AF3CEB2B9EC7F950330259ED5E37E1AD2F0CA64920B817C9A9D19FBE6F0EDABC40000E2275D75ED964639FAEB5A0C439FE56737166AE74B65DF46EB9248219AEC452CFA57F6CFA44BB174D142409CE7F365D7B76F8D6558A2C18B1A66D72F91FD00781762B94A62E03E5FAA7A4394BC8509063EFF005F856AA9F675543D01704F17CA9701AF0D8CA5120EEA8B543547A5CF768B7EFDF425F58E6408EF20E7A9D23EF3AD8AF7EC4E4EC4B70A74ADE2C1844BC9045F3ADFDF488972E10391CA7E197DC510F100877CDBDFBF3868BBA41204191FAC511BC34710A767872F3F4FDBD28821C356E80DA78BF3738CBE7F7E7440E0355B480E1E16A8C8039F2D75FBCE32F2A23054407A9CEFE7124C36DB2C2595092999F5D2328D3EC5109B2D4ADE0A2125E84FE2BEF8C475C59A9D27878403D49FF7A7C0E9D688583EBFB6B5BCB288E368A6D5C2AE1319C8F975EBD49CB91ADB13212AC31555DAEC694CDEC4DFCAAF0B0C46EA00722B716377E197DA164A1291A09E754F520CB9C9235AF0D1C3F2E0E2958426621C3024358D3F7C757C9A310FB40EEE0EDE6EDAE1092D0BBB2BAB1BAB22278D28B7BC6DF7818132A4A2044F43578D97354896921541DBEFA6BC223664DDF514545CEF1700F7C99835ABCA32EEC86D17F37D8DC1136CD949366DDB25C7C43893628432EF11131250784822728A4B6A6D39A842920B8B67AF46E8C2199900CC0B0A502FFC41649B0A8F4CBD623B107AD6E5C5E6E2F382A519929C95E920FCAA9B331866A89726E35CEF7E5167C0615E50243F1CEBC8699E67388A6908615C4D0CE79F4FBEB1E94DD52CCE340EF4A5D9CDE85BA5A25E5C80C10121BFF217F6D5ABC2CA40721C580547398CC41E607D018EDD7518204EF29245F8335B2A55DBD1CD17004BFA40492D9FAE7E86AFC63CF01BE9F4F2E9D2B7124203311C68077B6B9C29F315C29CFAE79E7133689E06D0907213CCF53F79C69CB2ADD321D4E41A376CC598D73115DDA65E6D1201AF2341DBDB9A44F5B93A8F21D0CF3F9FD6A670B26A29A92C3D3BDFCA23A24D1A791A7AA4800D1886FC7BEF7821AB90083A0EFF00BFAD4562177702C79585FCA99C108ACC0D0CF2EB974EFD2A0D52809A565BD2B933166CF9C3A4A5CBE432D6FF00DC362E01208206533239FC39F5F86B50BB63103E5290E5D8D7CA96BF1E42D0BA50A5073BA34D7EF15B37EE5AAD2B65290858578E63DF24084441CF339CF2E432AE458C49FF0024AD2186F397B9ADF46074D4E50CF15864A812A033624DB50347B5B2D6B14D9B571892B106AF54971AC4187985A3320A5C6D4DA723AC050991EB39575EF03F88666CD5E1C15EEFD686A961F50F4AB7E1E2AD8CC227EAFA458D8703A52AF90CF568B0FD9331EBCDDA6F276F373B8A5D04E0E8B9B67F669BF10F02BF13C77777E18510930A589E0CC1F39AFAFF00F00BC668C56C0C24B54D752928497232C8BE742F71DDE394EDDC0033D4B523EA0EC5BFAF2D63AEF5F41A394C144105104144105609604E81E086C5414A206467A743A799EDDCD343FF00BC6A0FB8673F878457FC8E56FCFEA3C518498FBCE9F4914E9EA4FE217921C025E9F9311EA6D2975C75510A02644CC40EBF1FD269AE3801289CAA48FC1D783BE74021F8A25290EE6F7677A76E2CE6DC2CFDB4BF1856018D5EB64A549B37CE52238585F4E7979EBD66B98EDC9E5089CC48FA1449E878E59F0A350BC8E090662E525601DD26B424B90731AB5F83691CCCDD4356588AB17DAC712955F5F5E5CA5D5C02A2597DD6D3EF6A0C0CB58E5957CD5F8CBB4272FC47899695AB777D4C0167A1CAE6AF4E7725E3B8787E684609296C870ABD331703A8222F5C470DB7C495F895B214E2566094CC4188EBF4CA72EBE57F11E1E74F4AD6497A972795EADA67D62E586C604B7D4CCD98AB57ED61ABEB0DDFC1028173878652204690398CBEFB5719DA089D2A6299C313AB54F1274C998F08B2E17690A00A532A8EED40D634FD45B17964193040100F4E5DFEBA76EED70F2E6CE35A825F8FB2F406DCA827E562C2C0726BC7866FEDAA62354BE06C27A75F4CC0EBE7DB3E55ACF0A92B292F562C03D40ECE33F485400B5125C0A7A33F4881BC7413CA679F4FBE7977CE45665CD63987B81E4783F1D0BDA1CCB96EA029BBA9B5AFF9FBC356AF3812124E63F7D4F5F334F11345DD8E9996F5E196A61DA70E0B101DF3D32CADDC3DE8F0FDBBD0AFCCA811A93F300E59C098CFB9D69DCB98406714B17FD8B37BCDC9C28091BA05726FB5B958359A82262DAF416D2388F38CF3991C81EB3F38EA326794B3392EC4EBC49776E3DE223172B72636E8A52835F4E36E3122DDF640A8E5A139E44C67CBEE29FC99CC41C8DA9CC6AD5E1E511D324850702A323FD39E50E917C018E2CB9EB23319EA6A630F3892C72ABE5CF5F6EEF0CD72B781A116C980CA262DEFB2199E5AF78FA8CA474A939739E9F503E6071AEACCF943654B20B338399B7A7DA1637C028C100E53999F4C8C4E7D7AD0B985C392F5B7DEBEFBC64E0C285535EBA51EEF91BBF1061D377C081EF721A93FA7D6739D2693336F550A8ABF2BD7A7286D3304E480917A86B7603D4D75CA45AC440481C5A6B9E539763F31FE76F9F5B06F3ECFF7867336706074ECDCFCBD987EDE240089F8931E79447DEBCB22702CD57FF8F0C8DFF3C4086EAC00161D48A7EBAD32CE185D3E1C714BE67498CBAF79CFE7CF9C8C82E9F7DB4CF81E79292E58969DD1D6235C744E7F7E67A9FBEEBC291EB69E3015966796BE9E7E74410ED0D1CB98FB39988CBEFB9042A4418A21BA955739F97EA1CA3F30F5FA1A235F9838D32F6605FE63E9F4144642C6448F2FD4534463E6F151F7CE105B3C6A2A024E4797974D7F7E666A41697C29A3B8A9D397E6ACCD0D5734905CB0CAAD4BB77F79C79F86FF00C7D23FC7DF5AA74D40F9E684D49715E9F807C9E35130A894B8C9ABCADA583FE690A8B14DEDBBF6AECA982CB8953660825685465A183F09CAAD1B3641296C886E4DEDCDEAF7AC6AE5F526952EF97703CE30CEC4E38DD95EED1EC6A8F05C6CF3ADF829D14A17CB53878473C959F6A63B5F0CB014F6BD3DE95A178D92927871EB945E7F855B1FD3590A503C52733EFF00BDDF406A80B5FCB9C47F17E87DFB348B66CEFA64241CA84B71A574D32E791E1764FC3FC54CE1415B31622A479BE61AB4CFD0C86F8073705A90A04802201F4A9712A868321F904B5FAC60CC466A0F7ADFCE00848E533D62994D9612FA1D453D83EC504682725CEF100017CBD7D9F29063F2A2639C41C8EBAFD08EB4EB0F237D20DDD89A56BF815B31ED1018C98664E5682DD7A0313D6DCBCB4E833E8627976D2A664C90801C574EE0D087AF38690F0B9C23873D351D67F6CBE149E24356CFE6037DCBC10C9C7323973FD797A49FF5355EC49604D33FB7BFC410DD4E8EA66633F8F7FDAA2A79694559B2892D9BD2DC5A0FF2025410E6F52E5FB701C74EAD5C7233275EF33AE79C7D39552368CE2A252EE1CF50ED7ABE46F0FE54F490C7DD6F7B71B7DA85105B047AF4D4663AFD63D2ABCAD9C66FD6CF9E55604E4281D9CB5E9CB49CB1BA4920BB3035035234D49BD32CA6F04FF953E71F08F9FF00AE5580A5E0D48209494A833508ABE5E5C1AD15DC496DE21D4E7E902E336D3AF9346A6FB495CE2BBB9DE26C0EF5F034ADBB7C26FC338F968101D45EBACDAB25DE18E2090B2654401A7427E82FFD3DF8C97270D8390A9845500D7FF21DFD98A2ED8C37CCDF3A822D62416D73D1F32F947786BEDF479FE0A20828820A2082B04382350D0423E17BD20FC7BFA521F24EFEFBEA18FAD3DEB09A90492411580B64822467E7FB5390BDDDE24528CDC183DF8F0B7185659DD0C47B73F6310F7E16A6DD436616D14024E878950207FAD79C0A678D5FCC945097048CE8CE5B2357FB71877267A10BDE5B9B51BD72A458DB75875C5DECB6376DC4853AE61D74A46A724DBB8A39C4FA0F2F3E79B5F63E23132E7310C50B26A43063D4D1A85A99449E1F1D2654C4AD2183B119124B0E0E0F91E71CC7DC03CDB78662D6B700B86CB10BB45C30982E33E2DE3A10A713FDA15C8F31074135F32FE366097B3FC49893313BC42D5E635AB3EBE6CE4759D838C97330882924067EBF8E71B14E58DAB0FA2DB80C3852A4AC0050A044FBB9004A4644472CC579A76A6D5C2CC2A925237AA0D85EDF7BDEC0DA2D322715A4A81293902F6B56D434A5BCC45388336E0A9B42488033CBA7F831975CBAD4713E1DFF00B8952E58649ABB55BDFE844CE0D730A52B529DC9601C677FCB77D31BE3764A3C4A052224C73044E9F5D7302321155BC4E1E4EC452BE724109D450BD0655AF0D38C5C301342C01F507FF769970D39B73118DEF1F0CAD6D282894C024091FEB9FE99CD53F1B8A463310664A1BA1CB3160CC464387BB0B4C895BE9DE01C3E59F3E16CF567310370AE324E639E7E83989E5FA69AA2896A772483AD7D93E50F25C95381666636B0AFBCF867185B738894A81132333EA0F7FA75269E4A965C1736CED5CF3BD80FD987F2A5D1B93D7304DB8BF68593C7FDC72E93CFB7CFF6A7299643D546B93FBF5F387E84B07D4797BE9A4485BDC708824FBA3B9D7D7EFAD2C990A507DF23AF5D38F11D1A22717277E61666B55F83D439F489469D2B88240E84FEDE5CF97C9E4A429000FE4033387CEB71AFBBC46AF0E6AC017D0575191BEB0F1B5AE75240EE7FCF4F49EC2A4A4952581CF9BB072D7F2CBD192F0C5D8BA6DAD7DD0F0C8E92F6EA591AFC7FC6911D27D2A5252C30A87A3D6FC03D6D4B521AAE42F7EC00193776B663B8BC39257248574CA4FCFCBCE7E94AB2D44AFD1DC9D7A37EF285D32C0480454660DEA2FE74ED0B0714343F7DF38AD0DAC08CC1F7F68D572C2ACC3EDCA86164DCAC0E73D79FD72F81D3CE912B50140E732F5EE7EDFDE9FE383763CCFE0085917BC3C8F2FBC8E83CBBF334899DBAC2C43BEB93035D350D784578601CD0835A0FD71E10F5ABB42D299E2988D3A73CF954DE17100A035F314278BD7D1A9D622E761F754D501DDCB8BE56BB5FA457E1970FBAA10399C819FD75FB9A72678D5BB76BFEF8C246436BE9DA9F8891B76F85213AA87EBD33FF005F183FC814FBB57CC7BBBC24A400D56E7D7417A5A251A64902018E53E7F4CFB0AC89FA8FD757D783C375CC4A417E36FB711083EDA90E28149F203B0CBA65F79E547CF72CCDCF2E758899D8D42565390D6F09FE2380C9428913901E87AF5A772D3BE01D74CB57F7EA23418C41661424F1FBFE383C02E02D51C0A493FF006FF5DBA7952FFE31DD7ABE999F2BB369F78748585B0B12F7B7DE1DA1A52E22339F9524A94437DF3E4C215DD6FE4F5B337DFDFD9EA1809480A20913A41E87FD7FB9DD58A4A257CB2EC5DC5B577EF91A68623E7255BCC0B0F798E87DD28586D133FA75EB3CB9F2390CAA1BE519B38A85002087676E2C3FA2337AEA90C039248776F2A97CF3F21482CA6CAE8DEDC00BB27213E1A3374920A678498804C933A0F302D3B3D69414A480C5C16C88033073CEFD291A4D5AD52CA65969818825DEEFE63B738D24DBEDB9C0377DED43B33835F3FC09DE2FE2835C0A486D2AC3ED429297E620CA804EB988E8697C66CF998B973264B49284B6F100D09B7986AF28565624EE21DC29EC431A5E9CF8756AC6D25DAD0D043AEBAD2D4E0E24A50A95709CD32239A4F7CF9F3AE678FD913118A2681CB90470CACCFDEDC4C5A701894996135B0EAEECD5A8EFC018669BA64F17BA470827DE033D7439CFE952182C27CB29DE5001AE4B00D6AE9A30E62D12C10660040234CAF47D1B5D3BC3138A32501C436EAE54470240E210634FBEF15253664B427743161C0F2AFBE1902A9C028D4A9406AEDD731D61C33749791C7E1B8D8E8E260EBDA6A0F138A4A7FDAEC6C050F0B5ADF624C36560940D161455672EC03D7AFBA449D9BA16522149CF22AD3C869DFCB4D69FE071682907779BF17FCF688D9F832164A957B36A19F5A56F9F289F69D6DB4F115A4F380738CE7EB91F954F4B99BC90ADD773A39F57F7C5A18AA510696199B7714FDEB0E53C2FB7E236EA013AB64FF504728F4FF3AD23889732623E942BE907CDAE2BA5883CA90D953128594281E7979B7BEACD16D393EF24A0680AF248D39E9F7D6ABB8AC36254584A5B1E05AE19F8D3B5612389402DBC003627D7FB0DE6611530A0A212B43875F70CE7AFCB9C7A659D456270D8A5A0A132261CA8836CEFC1AE7CE3230867B4C133753715A7076E5E9788FB9429912E10913A9C819E7E9CFA4D55A7EC4C74C98E30F38392EE93577B8A802DE54021CA6589742B0C9E3A59A9EF9C38B6426E5A406DD6C83202A72272E7E9EBF0A5E56C6C52505270D3778D2893DB8BFBAC213E724024AC07C89146D3A8725F95E2EDC1F09750B0A2EB5CA73EDF64FAC9CAA2B1DE1BC7E20B891343116496350CD42F5D7FA82C4E20027EA0A73FED6D5A96D4D3FB8B6F7C1BBFB4DB6D8AC5B087956A0AAD977AE2EE2238AC10AB96F8091AF13606712623335DEBE11A71FB1F13864CC9733712B41208E233CA95D32A8885C60F99254776956A57335B90CD901DE3A7F5FA248F3641441051041441051041441056ABFE27A7A882193EDA65797FC8524C8FFAC1EBD7A7AC9A6337FDCFC3D4379460F0152439FCDB2E3C9A22311B5172EA6DD79B2FB2FB6E03D16D9466398F7B3EB4CA700A95301762936E51906BC88E5F9F28E4818DCFFB4D6D5EC662292D605B7EF32BC1D6E7BACA1766C179DF0C9F7412E2B329933A8D4D7CFDF8EDE145E336962B13B942546D900C2BC29C9BB751F0F4E57F8682972D47009CDF96B4A5D9E3688DC5AA516CDA96953B61C456B541E20F105B20F4E129D7B467957CF4F15ECF3B3F1CBFA4277546ACCF5E6E5AEDA5EF5B8E1674C04925442B22FCA9CD8BB80DAC33B94A16F39CD27848F513F0A4F66ED02256EEF55B95B8BFA16D22CF849E7752924B55B2A1E2EFF63DA2C8DA048085102241FBFDFAD527C5A83890B533F27AF17B39E5578B161B1664EEDCE64E57D491E6F4D2310DF31C6FAD406A731969DF239CF49CFBD50F0F8764B171C7F5EFD04742D9988F99870ADE3567626E5B566A56E395A229CB52675075CF2F49EF3F5CA9F210ED635A119717A3F5E59C4BA660480A772FC185756FBF0A0864A678544427D7A67D2453C9729DB2CEF7A57D294E5AC3B97352D40C0B683576D7CA29F0BB27EFD29EA25B5198E65ADE97872165550A3DFDFE22B4359E83D34F5CA94F9645037BE548673D637D8DC69C75B57FACA262DDACB4F86BCF4D7F7D4F3A70843007B7ABFBF5864B5B3EA7ECD7AC390214B1D08D3D69CA406043977A8A80C7EEDEA1E192CBA8D5F4CF2896B6E5F7FF006A7D2D0C904DEEC3BD61AAD63789A97F76C9EF0F29E243243FBAC60170F0526BFE47DE519829B1A13CCC1053199FCD5CE0855B742541249044E7CB49FDBE039E54B4B9E515A002F5AF419817BEBD5BCD92958AD40A8D47937189961C491131FBCF5D233CFF004A9097377F3A6751A52BD3CE2371092806AED6E00E67ED6E222E9B0B42EB285C4CF4E601EBDE239FEF272249981296724D1F2A9AF3FC1C8C40E2715B856E5865ABB726157AF9C4FB162604A7A1CA472063D7EA7BD490C0934DD069907CB835B5D2B77020E763807482EEED50E2AEEE69C69AD844B23096D684AD60151C8F5CB9E79FC63BE7AC7CD93F2E69435F30DA3B7E3AB06110F366898B726996ACCFE8CE7AF086AE60CCE5EEF6E5D27D0CE5FEAA5B0E96003529EA6BF9E3485253D1C9AB9ABE9FA7885B8C3421F52909F76004C0EDDE7A7CE9FABE9431CDF7BD6E3366F3D22770F301483C18EB9559BBB79C3450F0647965988C867F4E9CA34A8A9F340A02ECE031AE4FCABF7BBC48865243D7F3CFEFA455E3712667D0647EFCBA9E548FC9F992CCC203F70C3BDC7A738653D20ABE9CB8BDDB9FB162EF0D9C741CB2806013A1FDF4A889D3C492524B35F76FF8E57A563544A2A06EFD5AFC32D7A5A1CB0B6EE91E0A9400642811944AA639E7C8C771CAAC9B1569C64C4246EDEB93B8E635E3530AAE40975DD2EB66A529D01CB8C7CC77F14CDF9E27BB9F69CD81BFC2EFD617B118B205CF86E194B589AEDD242A22006E467CA7B477DF0B786938FC0E2F086582B9E84AA5AC8000DC054412C58E90EA5ECDF981134A084E8433F3C9DED51C23BADBABDAAB6DE8EEBB65F783865DA2E19C470AB452836BE21E236C32873249227881273D7BEBC3FC73B226ECBDA139003142883A79778929527E54C1282482681EC5B4E2332D4E4F192090EE182E90402252AD44C1E13D3420FC338AE4D8EDB0AC3120120A6843BBE4FABBE5DA26A44D32D5BAA72E29720357F41B37B88696D6A9504BCB2A434A909520C75060F98EF9FC9BE0B6A2B1AB4A12B2497CC16E9E553D21CCDC6EE4B2CA049B05337170F4F2B4480B1B8B53F8AB4745C253EF78774A2B4FC04F5F98EE2BA1ECAF0CCEDA094CC082ACD88705CE74EFAE4E5A20B15B551BAA4EF096A3729A372CABDCD6E6E9BFB5FB376AD78B8E5F5AE10FA5243BC4EA18B64C12014851CA4013AC98EF13E9F066293382132949723F8A481E9C34E4F1569BB6D3281419AA5EE9242965D44939B73A35338B77FF0077B77CD2D4D5AE28DE3CE03019C1DE6AE5E39CC7083A9CC0D64D744D85F0FB153F70190A24B0FE3DB9F3E111D37C409208DF14ADF5D756FB5ACD01886F796BB95A3677775BC3BB7CF086DDFE55C76AB3191050734FCA39E75D5F66FC1D9D88097C37F201C14126B6A31A0EA5A910F88DBE92A7DF0791C8D296CFECD488C5ED17B4A6D09E1C03774FDB30ACD0717C2AE90424E93C32272CFAE7356D93FF004FD3310949FF0012EC7F8137E9D9C6778889DE25912D442E72535A396B86A9A5BD9AD5EA775DED7F8BDAA2FD8676570E75F9E2B47137CD38D41812D819150CC6798AB76CFF00FA6DC2CC94F370690B0CE4A0022D67193B75B8A3B997E324225309A9292285DC16E2F51D351530DEDBD987DAF76956538A6D36CCE1ED4C7B9777AD40503966201D34D7AD3FFF00D9AB03BC01C1CB482D532C7FFAD5C3F5F26589F1B2508514ACAC8FF6A4BBF4773C47DC45FF0084FB126FC5BB768DDEF0E2E332E0B3C56E3F0F9CC16E53232D7F5CAB63FF004CF8100B616496ABEE25B90FA6BA655D33819BE37132BBD3522B42C08D2E696B5ACF998BBED7D8EB7CCC883BC6BA911A628FE79C83F9479721DF5AC7FECD18225BFC29433ACB19016A1AE79E5C1E317E2E249AA8825EFF0082CFF9EA6D6C4BD8B77DF89626F0777A37EDD884F86EB2318B808536EA7856387860852499D35E82ACBB13FE9B64C85A66A30B2928490412802D95B80FC55A1F7FEAC4AB0E874CC515BD80B87BFEB9DDE3AFB5EEA8E530510414410510414410510415AAFF0089E9EA2086B7124122252329EFF3FBF8B19BFEEE9F682231C5388B76C28053CA2785799004F3233CC72E94CE6BEE299AC6FEF568C8B87D6388FF00C52F7ABB3BBBEDAADD6B96AC5D39B6CBBDBAFC2BD6012432D8758FC42AE543FA890599E18E8794D79B3E2CE1B0AAC3CFDF03E66EA892C1F5CF4E9D5ABD9FC15B2E6E2704A9CC0C93BBF281077854EF026D5398E7AC65CDDEEF16C36EB6630CC6F0AB8FC4A95676DFCCD09585B81C4B484E406842C2B881CC19915F2DBE2761D29C7CF12C06DF351C4D45299E95BE51D065EC6DD5268F7BDEADE7622DADAD95FF009EB0D5B25F752E7094E6A104242722147411967AEA7ACF32D9B2267D34AB9CAEFF006F47B189991B294E027701A3839F6E3EB5D22C8C476B306C41F559DBDD34B7F4E04AD255C51A44833F18D09A4F6CE0B7904A810C0966A1FC37BD625E46CC57FBC2695041E5ED985E2DFB9B55A417142352126263B8E91A76D73C8D2578620B252284D142A75B8E00F23163C12C4A40402C2C374D388ABF0AFB10E4B6E15240854C72CF3F972EDCAB797870186EF30453830E1C1F8C49A2752A5F997E3C85EDAD6193D6F0E2840032D4769FAF96BE74F65C9DE4D1249A01981CE8DC8F387889E08A966E37AB52A1FA7F690B73CF847A034E938726C03EA5DCF973B08748C4351C97CEA416D0B8E7A7185516AB1052011DB9FEB97C8D60CB656E903B38AFE5B85A109CB04EF6F73D5FA72F6D4906D250334EBD35C8E91918EDDB48AD9282E1D8F0BBFBA43652BE92A0687337E9E77E25E160C29C25620054403AE5391D3CA9FC990017501C9A834CAFD290C674DDD0C286CD9BF11A0D3D6D0F5A49447167D87AF5E84D3A4A2B5AE9FD4332B2471CCFA43D4A4A9214220FC72CAB785E5AC04805DF5EBDE91413026915FF0023D3D042D14F18EFF7EB4D8DF3772FDF2820E34F7A6333F9AB9C10DCAD5F886D0028F8AA30672000CF8BA65E9F11496EA8AC685CDE9419F514EF1B9004B51A029A134715F3D22E8B0B65BE0F014FBA7324E5EF699F3FBCF5A90C2A14A50487617239BF60F5EED15ADA53D32D248CC540671CE8733195306C25E6EC99E25227DE397427AC7FAEA60D5BF67CA2C97A91600D07EDC76D68DCFB1D8F24AAAD90E19BB7A718B81AB55208E2E123E711967AEBF4AB3C99296714D5A9A8F36AD44434CC4A8B3E6ECC752097FEA1E1B67D49050501267224E711F7CB954262E48FF20B00C097A0CC163E8FAD6B09A66282805D9D8101F5CEFA72CE18BCCBC38812920EB1DF58F2E7D0C75C95932E9A6BAE7EB125266924390C2D50F415E86D119728096CF101C40667D632CA7BF3F5ADB10B094901ECFE97E0C6BC0F0892933095259C02406B5BCF5E5C1A2CEC4042A412069976C81D33F3FD0D5771130826CCF400D6FAB53A69C226654C06854406E9C8F319D43C44A6FDA6DF6AC940F88E85A92A3F97DC049063AC65F5D6A730E12AC0B9DD7637A9E47953D3842CB93BDF58766CBA926AE7DB5EED98C41ABB75E690140B0A09254323248047C33D34AE6FB5E62C4F5A52400F91625EFDAA2D47AC3B9528001D2406CDB4A75CBD28C621F1EC64E03678BE24B2536F8759BCF5C70FE672195AD01BD24A4A7DE274F4136AF07625B132C2D4FF005076342E685FB6BC8343D421139280DF5289DD24000006B5C9DB99CB26F8AAF6EBDB4BCDF06FFF007838A9755F84FC420308B852BC40BB36D4942923300F1B6082328AF6EF808C8FF1E4AD4582836F5890C7798926E07763589D932E504EEB0A52845D801CEB7CEBD23B37FC15F7CB8CED86E6AFB777B417EAB9BBD902B656971D52816EEAE1D2C8682C9221B48072E523491CE7E29EC1C2E2B6962276113FE8A80202D8A8A825CBF026C29C4B52313E5032BE61037D2A0CC03873EFD873D8B6AE1413738580A0A6D633232214A2A11A99EC34AF17F8B3654CC3CE58DD206F1A686D53AFEAF0AAE58090B60481FEDCF5D1EE6BDE13C5EFF196703C51BC0ACDBFE6584301C4A31042BC2BB2B495816BC32A594C7BC32CC8D75A6DE12D98B998B96ECCE9705DEB40D6D056D4269159DA139482400A21408DE4B306C89FBC6BCEEB5BDFAEFD715C4B0D5DF60BB2F6D62F29B76CD2EDC59E24B4F12802DB79CE499131911CABDE5F0D7C2523132646F212B2424071C017ADB3E0383C5036BE38E1A5AE62C929059DEBF51005C9CF8E71B8BB27EC2FB3B89B76F8A6D9ED7ED1E297AE2C9B9B07AF90F5982930021A7133C2A2339D743AD7A67667C1D938D08C40908292C689B934E3C3DB18E6BB4F6EA913968485D0515FED2E1D835CD6B9BD2367765FD99F74DB1CEB16D866C761EBB929917AED833C4484CCA9C0264E7399931D44753D83F086448521F0EE035D2185726D397EABE76F621614B52D2056809DE1C6ED52FC79659CF0CD8AC0B0D65B0C61564D38DE9E1B290948E5A0CBD79FC2BAEEC9F0260F0A9015252E007DE48C8532E178869DB56729759C5292ECCAC83BB87B7AF089D18724A4B72584447F408491D00D3BFA73AB6C9D818294001290198064836CEDAE54D4B988C9BB4C12CA56F914FA9CF5D32C8D3BC7AC614CDBA83BE33CEA89FF00F6AA67CC67E5FEE2909B83968594CA410336D45AB972FC42C3173152C268126A00C859868E21FA909223810465A8F39E823427CA915E1C9AFCB7A55DB203ABD3DB984CAD4EE951A8ABFA694EBCE17693C08E1002626001909E9FA8EB5812D219D0464E406A6B7E9AF184D454413FEE3ECFBBF584D4DB866081D3F5FB3D7E3B7CB4A88FA7300903234A9E3DE19AA54D2E778EE8AB3B1A7BA65DA18BD64B716D289013EF78C53F98FF00D6391E433E5E662D1853265482C9A32775C060D77F366D7842D2F18A928092E487A1B8E219D896E55346789EA46310510414410510414410510415AAFF0089E9EA2086970471251FF79F8A472FBFDA98CDFF00774F3682239E50532FCC715BB657DC0009FF007F6299CD2D2D674493025DC3B5C5B9F1EC3F6C3807BCFDDF2F7D7EDB7B518DE3A97719D98D83532D7F2CB9FEBD9B6AC4AC4B40B6CAA5293E280A3FF909D419F137C6AF14A70B8AC4614AC823783386B1D1ECCDFBBFA3FC1189972363CB4B805AD402EE4906ADA64FA3455B57BA8DE46C0E23885C6EA4AD9B7B3522E1581A83C1A7D025C0D22D99038E402003919F8FCF2F1763063F1F34BEF6F2CD2F57A357F74ABB45E13B430CC085A083BC1DC528D4E2FC5FCDA9D99DA9F69EDF0D862F82DC6C4B7B1F6CD2516E9BD770FBBB274F00285B8870120F1147171644C8275AD363EC733A585897401E81AF9FE6BA662A61F68E0F07BA9993F794B2774CD507357A13CF2E91963769B92C6B6230C38A6D3631758AE36A70AD4871F53CDA55E21C805C2C08239CF789A8BF116004996BB16A65462D7C9BBDE8F58954ED992A2109A519E8C5C6473F224114CCE60BF4BAEDBF1BE84B6E70C14A072190813398D67227E7CC66A01986F760070A6638E5911AC3DC34E48427754A50A9BBD0F1B3D6E3F5169B6D7F54C8124E51209D7A99EC738AD928208FA41E14CE9FBA7AC3D97354A2EF50C5BF23B7A8872F5B4AC98D6232FD60FDCD3F9325C5807A923ADF2F7CE1E89EC5BEAB5C56B736FB0A425F85EDF2FF00FE4D3912C3B96E82ADCF28792E6D01766C9DAE3C8F0CA1C22D55C2397CBA763D64F4D05349D2885BD0699655E7DBAC60CC4851049232A8CEF7F64E96854DA280399F847E95B4B95BA5CDF2ABB72F7A9A420B9A6C1BA1F5D7CA1C36C10800EA3969FA7ED34F522828C746FB4315A8B924BF2FEFEF48AFC0EFF3FF0014E25A094824004703EACFFA221BAA687D1AD7CF979D042C84F0A427A4FCC93492BF91F7943D45520FBBC375FE53E9F514DD7FC8F4F410EA11A6CAB9E67D608298CCFE6AE704327314B4B7B945B38A48B8585A5906388983300E663B4763AC4961F0A66201670D76E26E5A8789A0E2F0DF133D32D0A1BC58EA6EDC3EF78BDB656DEE4DAB9E28595A9692041260AC11944E635CE0F6A929185DD50200BE966C8356C598B5E968E79B6B68B0500482C43F77E347A072285DE33BDAB45AB76904442465A119099F53CAA7E47D1BA416CB466B79DF2ED1CF66628AE6106A4A9989E3ECD4085C9813F2EB53327115634D06BC2F56A97F4891932B7C0DE0FA021FEFC3830B887CDE6CA08C8906077EBF1FD32A6F352262C9157B51F953BBE9084E64CD2906CC468EC096F271CF488EB911247F8CE073EA273D73ED584A08A873AB0A67F91ECD1590B3BD514E1AB54FBEB10576725CCC4465CC41FBF3F8534C67D20BE6E3D07A889A90BAA493FC5E838EBC05F5AC59D7C499E433CB94683D4E507FD554B1AA62483C4D6C497FC8112B2945D24D5CD46B58C15BD0DA74ECA2B09BF52F8038E96A6624BAE25B83A4FE61CF3CA7954A61B1891830924D4103880F56B0CF21CE2D9819489B2DF7492DD32F315B74317BE1CEA5B63F1474B86EDDD0A3FF009A52AD4CEB320E939F9543694933662940E74E3C0F4C83D21499282544E45DBD1D9BB5F5E30AE2CCE138D377982E22A5A19C4592CB8B948042D0A4E5C4623DE396B9EBD5DEC7C47F87392B3A82E2F43ADFBD7BC3254D9921237777792E6BCEC39DFDB8E72ED4FF000B7DD16D66D5E298E0B92A77135ADD5A7899D5695183EE480788EB333A4E55DF7C39E3C184972E509E400000EAA076167F4FC46A36B848DE2EE0B1029997A598D6B9000B0CF9AF87DCE0DFC3CBDA9B6B764307BA2F6178F5CE18866C50B4A8FBACA4A816925293EF3B23203E157FC76D71B63672B1213F313291F5CC4FD5FC9DB78F90CF3E1166D9D3938C9414A3F4AC58B034D327AEA03738EEA6C5ED939B7F81E17B476166BB4188B2DB854A6FC39F7539C82275D395797BC6EA94A9D34B3073609A5E8CDA9BF7687DF291293BA15605B78FD5516EC4339E7AC648462372D5E165F6C2DCB64A4359122EBC44C2C1FF00BF00C8467E99554BC398E9585C6CB4A887DFC9812E68EF5A7BA44162F0895A14B4A4B170C4684D40B7DAFCA2C3C69FC736336A6C76D764AD0B4FA9D4AB14B1610A090D88412A691D51C4A12635F4F6CFC39F1961F0A8C3A77C02371AAD987E15FD8E341DA9B344D1312B4A54820D161C1BB16ABB1AE7C23A61BACDBAC076FF006558C5F0FB86BF98786D0BAB60B4788DBC984AC29092482A5856A79F6AFA6BF0CB6B6CFDA1B0A4E20EE1514A5CD08AB371CB36B5737E09E20913B0D8F3200795F5329AA033B1C8B74A335A336D9BD70F34D2DC6D293C2A0490414F0E4338E63EB1CABADE1E7618A3E86049B00199FD05FA031569A908DE0E09241BD6EFF9F6D1236E14B68294482641CF9490397A7CBAD3933124FD3514B446E2012694F633E3F68F1693A491DFAFDF9D369AB510C0916B58DB8D5B8F7A088E54B2E6BDCD7D214524FBA00CE0FE9D7CE95972D3BA3786F1D4D49CBD479F3894C3CC9611BAA351976E514F0A872FD7E95BFCB47FC476873F32528DEBCC57B9F48F0156A01E9A4E9F1158F952BFE09EC232F2FF00E447323ECF154AFF00F2F851F265FF00C13DA31FE987216FA073F7A7A47A41E11A73264FAE7F1E7CFC8D44E30CF4129964849B0141C853AFA110D664A04BB528F4A060D4E3CF5EEF2A4A330510414410510414410525F346F6EB1F7F76AE9C608F098127956E7EA4D33D79C10CEE13EFB5713EE3721439FBD9081E7AD359B294C585FECDEFD3382216F3FA0CE30EA892916370E003586EDD6A503DF281DFA5466255BB2A627FDC50BF43D2364075241B150B73A5FA472A372F7D69B4DBC6DEB5F1B0368CDDDEDA072F52D06EEDD368B7529F19CCF8A0A21327F29AF9A7F1E70B8A9FB7F13B8B213BCA60E6943F7D28C23B278713393B39265A8540606BDC7B6EE23653F9433785CC58B858B8414A0149E12E04C2071E5272034823977F1C6D0C1CC93882B9877B7555AB9BF2D687ED5116057CD9450877DE04B582732696E022B76C2F1A2A53178F31C6078ADB4E292DA80038613CF5939913234322CFB276C48C3C912E83E96233F3CE9CEB1B842A784AD602CCB3F4BD59E9467FC660BC327180E366DEE5A696D907FADC32F4F33C46739D7CB2CE6AB5E23DA32F13F3371218D2D4E24B52A6BD75787A84E2490A0B395892C45079675CE8E231DE3584C3AEB76EB25B0014970FBFEA4469CB98CAB9FA702A9BF586152C34737E072EF170D9B8A526484CC724D88A695E009F6CF161BB62E5BB854E70100C426675331D065AF6D7232A0C0947D4A0EF974C9FA92FCB48B0C89A16414921C3DF81197BD0985525B500A854C4729ED9F91F2F9D2BF2CA064C3BFA0896952C901414F7BD7CC73FB410DF43F015B25612DF4B9AD6872A3FB685144A033960D416E0D685836952530400064244FAE46905CBDE53D1858396F4B7B31877ABBF1850201D483E46B2943172DC2355390C3AF28A0A903224C8D634F4A581000A026BCC0E3EED0D56EFBB964D9B7AFF0051E05A39854FA476EFE797A56E2790C1879F330D57FC8FBC8452563903EBF7F7D4F30A029D4FA7E3FBAC494921494A7302BD3DF0786EB39475FD08A67301770D5D780FEBCE1E478D34B796A6D00929FCC6321D3BE7A691396B48250A5D69535FBFB2D094D9A9942B736E9091212EA9B70F841295A94E2F242781254428F2240CBAD653B3A64D5E75209ECE40FBD435E9947CDDA6896EE199DDC76ABF38C0EC398C6DBEF430C6B016DD461D83DC2C5EBCE85062E02C40F00A642A083C53CF95593058612E504AB87F63234198B1BC57F1FB553312A4A6EC5B8532AD33BDB578DFCC330765BBA60A4250D969B0B6FF00B8A92D804C72958273C8EB5226407253FEE6F629EEA1A2878D54C9B2D4564935B59AADD80BD2FC22EB7D3C2E148C8240CBD3CFE3D6B7F94B0C1A9CC96D32310B2B045453343DF4D0DF23EF330CDC4A95319CC46B94452E994A4B39A6A1C1CF3FEA9133280400E0E6F4AE62D7E3D6251949F051A640CE7D634EFF00AD3A4495302492F9BD8E61EFDB5BC47CF46F4D2CE0EA3F35D1A22EE96912241CE08E7E9A1E5DBB8AC4C589798A3DAB6D2DF885A4A0A540105DDED4D0FEBF316FE26F22D98F19638D2B07DD466A11AFD75EFCB2150D8C9A54F50F561E879BD4F0CA25A44B24A83170DC882F6D695CAD163DE5EB0B4832532600244F2898F2922797C6A78B49528872378DEA1AA0E6FD386994BCA410AA82D421813A9FDE87AC692FB5D6309B6B5D8EC259722F716BF49B6208E1E162ED953BC4467F9721DFD6A5A5ECF9A8C1266BFD206F1BEB47A53339DAE22E1B2E7265A260291F500C4F3B3836AF1ED7D9CB6291B3D67C4485B56160544FE551F05A2634E608131CA44D57A74C0B5996DF55452F9BDEBD472AC667ACB9600825C11C6AD9674666A56977C87DBBA6987FC2B6E063842CAC0F155C442473839CFA18D4D4263F19FE1B38600936626BAB0F5883C4052D4A3BC72A3D052B5BE7179A509C3D1F8F425A9F08AF879A5294492A19408CFCA62622A5BC3A9C5EDA9D2E561D4A495AC0A920D1474A1E5F7262255226294523799E86AD7CB857EDC63E5EFDA3C6C46F5FF8945ED85EE2B6D8B2EC6E6DD6EE1D66FB6FF82A670F4AC05347F292519E998E5AD7AE767F85B6DECDF074C33004C9C4CB054B5056F9DC538DD2455B3AD8D23A6F86B66A9787960A8EF245413624D7F5C4E423B41BB6DB1699B3C2F67B09B54DAE1F66C8650852381D012809C827DDD4035E5CF14E07153F18BC3209DE2A50705EDD6BD1F37D22E6BD82B9725539442830B9A8F20039EF6AD4C677B5C4829696C32EDCDF5AC96148405FFC827FAA75809C81D469558C2F84B6A22709A12B2C527783B1AEB99B695B88A76D532F09BC4A9225A87D6972E96A3A45B8FA69101B49BD4D8FD8FB7B9736871EC159C5EE9050BC29DB96D372A1051C0D30A3C45C283A7581CB2EEBE0AF0F6DB9D3244B419C3EA43BEF80CE3B5BD961144C5E3B0B30A93BC9176B3D439E6DD48A868CE9EC4EB6F1BC4F69F15C2ADF11B7C06F956EBC351788E148238FC75003DCE1528CA4A41F7609D32FAB9F077C37B5A4786B0C95CC50225A6E540D783717E46D48F3C78BF1D286D198037F22CCCF6A9D0F2E1DFA34DBF72B7D564D16C2D9FF00954660A48900467200CC4448E46BBB60F6763E4801531AC6E69C81D5F818A42A74A24CC6249C95566D07EF3E7170DB0FE8A40293DF3826615D32E9F3AB14842D29014A7A5483FD9075FDC339877944DC7BA7BF48A94839E52272E7F2D69D5086207322BEFA43428AEF1079353957EE6F09A9B5932263A67972D07DE758750A034CAA47D8FDB8C26A94A2CA49DD15BD6F971B7B68F381CEA7E7FA8AC12B218100EA493E4C2309973011F50E4CCFE515065CFF00B01DA4FED5A7FAAEFBE1DB43F985BE5CDFF926DA9F4DD68AC36A004904FAFED434D37507A56B956DFBE7A0DC2161AA1C73FC74E3092DB5CE4091CA34F9FDF2E54B0DD23EB1BC75F67DD21CA160065024EA0DBBDFAC3BAD613828820A20828820A208299FFF0013DFFC608A57F94FA7D453A47F11D7D4C10DDF8F060F323E4AAD5740A26D422BA0AB0FEA088CBB48B8B7C4D09125766F3601E7C6C2D1CB3F4F4EF5078D6DC5EBB8AFFF0012CF96BFD46E8A282B20473D3EF1CA8DD0DE59E13BDBDEEEEFDC4A2DF11B7BCC3DCB79012A712FA9CB85708D4FBAAD3FC47CF8F8D5289DAF8A2C1DD437855A86E74B3DF9D5E3AF787676EE0E4AB7C2420170F7E0D9FE6F48D9FB860F8E70F6D6129414124640C00A39F3333023ACE75E2BF10A77710B0E5B7A9A71E8DC6EEF16613F7C024558DF3F3152CD5E54115DEAC2565214141294891D426398D41CA399A819001994766CC039676D21C61C28252E0877B86A0A0FB7BBC03EEE7CBD3C865D796BA79CD36C7C8242980AB3B7953B0D29D21F4B99B94670E3B67EBA18B5F1148515AB2931A73119F7190F5F9D454A4196189001B83F6D6BFD44EE08EF252470BE57B83CC748C7F89B79AA67231979E7D7282477CF9450A5B549059D865D3F35C9E2D582965C51EDA3369E62FD2AF10215C038721CF3D73F514D262C176CDBC9AFDA2C9291F487A0F3E0DD83BC7BE2F74FDFAFD29AAD443005B3FEFDFDA139D2CD58B92DEA3200E86154BC024684E73198D7CC7D4FA51F30015F2B7AC611299357A7DCFE72FDB2A1D498EFE5FBD67E624D8BF01EDBCE02821CD0B778A090492343FB50169363D7286A45C5473A18F2B1F3124EAD9D0B79BC325214E49CF32EFE9053C97FFBB3D3FF00C8C3E904248245DEDD7DF48A1424A472CE7E54CE665D7ED0F45B2E968AADB1145ADF3768B489BC0BE124681A4C9CE39FAE47B56924172055FD06776FC5DDA23B184298B91B8ECD6CBBDDF3AF9E2FDEAED03F68DE178261DC49C476A9C5B36A10616916EE252EC419CD249C8491153F8697BC037F2B8E44E7F76F3CAAF8D55C062C1CBD45BB0F75148D98DCF6C261BB2781DB317ECB6AC64341DB979491E2294FFF005132A2388C255913A659F3A9995242432DE80114CEF6BE74ADDB8C5231F8A593FE92D3BA4B1292F66703B7AF33911A65E17EE3A82434954889394738E63C84F5D2B64A4A560D48EE0303964F0899E160214A0C457B5DD87BA50DA57C5F18970EA7231D801FA67DE69625CBFA70A46A1625A025352E74A76FC7482B216406A7BEB07CF660C4BBD5BD6B0A17B81A827A83DBA4651A7C7CE905E328500B3676E2D99BF3CA3225A96A7E447137AFAF017881BBB9009EA0664F7FA93DB4A6D327EF87D6E33A65C07AE50FE46195BD7714ED5F77F4316A5D5DF8CEDC34B3EE3404011C24913D73FD35CB3A63392A99517ADCD00C8367E5CE26E4481402E68E34177A587B61164A8B2EADE79F70356ECC9E251E1481AE73CA44E83A8EB4C7FC3330871987CB3A1E397DF211232A45992546C031A353DD7D639EBBD67D7BD2F686D8ED99C39E4DC613B26F5D3976E36AE26D25E652EA388891F99394F7E75318A5093B30CB269BA7D9CA83A71BB58F0D861F29D41880D6A662E4E678F2D63720E265F09C1DA02586DA68919710690903DEE7F96464749AA061C0998A2D72A24127BD85F2ABD68F0BAB084A416372D471C0B1B0D7FB89862CDD5A5B6C2C84AC852C4C0FE99E2D07FF0058F5D4532DB98054D4D03DADCE9906EE486B58C309D8437200A97A53B37AF36A4618F6AFDFD617B8CDCC6D1EDA5E5E21ABA187BD6F66CADC016A71C42ED814A4C12429409E1E7DEBA97C27D80A5E330EADD72E0B0150C7D915A986C30DF5292A0404B17670496B393668F92CF61ADACC5778DEDABB61B778FDCE1AE5C5DDE5C3DF8ABA5137696DCB77FC3971449108238794089022BDA7E295FF0087E0ED9F8647CEDE5CB9817BDFC28437CBCCD039E56BC593646397855A92E404B3659676E22DE71DC63BEDD9BDDA63785DA5B3D8A6D1ED0E2AF3E8B4C3B0F28BB0B712AE14B686810A3F98447EE2BCD5B3FC21336C6D641F96565732859DDF8FDAA6BCE2D98AF10FCBC210A5D02490E4B0605DEB90AD5C0B3E51BB7B0DB01ED2DBEAC3ACDCB2B3B0DDC6177A125C7F1B6EEB0AC7576EB208532A48292B2D994F2823BD7A63C3FF0003A66270B295330CC5490A7523AE61F87615A479EFC5FE33960CE32A689894A98896A06A49F537E2D6A08DE0DD77B0D6EE36510DE23B6C85EDCED428216F5D6D986B11B7F189926C94E242F873FEEE5C23CBBBF817E0A4AC362251561D0374B90A486A31D3A6768E398AF16CD52D43E6292836282CB15A3B71D33D408DE9D8ED91D9ED8FC391618261587616BE1E1FC3D830965A427904A52343EB9D7AD761EC846C6C1A30B2C04A4240205A8CCD4B0FC52299B5315FE5E21530A8A80620A8FD5C4E557A1034AE917531861656E3A552E3BA9CC9D343CF29FF007532E3511191276AC96194B64C90499F333400C19DF89821C5660828820A20828820A20828820A20828820A20828820A208299FF00F13DFF00C608A57F94FA7D453A47F11D7D4C10D5F696E363848100CCF998F9C7F8AC2E893EFDEB0432B5656D25E0EA924B808CB311075E472311E95078C1F4A8FF00E25FB1B7711BA54032732A04770FE91C96DFFE0EFEE7FDA7B01DE7BEA4DB6CEED638F358938825202D8B616F6FE31C91FF0022870CC939011957883E2FEC75CFDA1889A949DD724122E19CB71CEEFD63A3F87E624E1D290A04A5810E433D2CF99D286E7439AF13DAE690966F6D1C172E3C8438A6D83C6E04BC9050A201C804AA5463313A45786FC5D81323133090D53C29506F9B7957845FB0528CD6A64F517BBB6B4391EB4312D698BB6BB76CBCE78AE11C4A5A0F124CE704F54E87A10455264A82166A58DDED4A6BA1A166BEA5AC12F04B290A20D03B35BA70E459F9452E3E8733492274931965E5E5DF9E959C4CD4A839209019870E1C58E56E158D178662000CC6BAE64FE053B3C46DE2D01044891A9FA77AAFCC50249A804D2F6E96D5B9DE25F674B526EE4351EA471D453D78463EC56E5B0B5403AAB2006599E874CF974CF4A66B5BB8D7434CBCE8C7D88BAE0124848CDBB706777E9D9E2D371E0A515007BCE5A08EFD3F51AD3598B2976C98E8F6BFE338B0A65D057CBDF4BC781C49CC4C7A7EF4D973BEA05A87F593FDFD6135A0BB38A7DF8F6CA2A0F84E59769D7EA2B099848CB3BDEE6F58DD082C069ABD5EB483F129E7A7689FA9AC85105F5B8C8C6AB946FAF6F4A43943E8E111244EBD0796BCF4D7E228DF21C814BB54F6E6619CC940925883981D1B23C7FA8582B8A72D22B50A20867AF0A7584552D2A0D6EE59B3F7D697A4BA90A2933232F3A7D256A32C9B31BB90CC7DF484012956E0C9EAF5D7AF68590952F4103A9D3E5349AFF91E9E82174CC648FA8F427DE70DAE2DD01E6545A5AAE42FFA0E04CA120C05C9D47126440D29E61653A8646C0581777A59C5002C6ADC218E296774800126FC1DDA9F739906315ED8DBB877BDBBDBF7F0DBCB8C2F0372EC2D2D34572BB96D2949483EE901C92A3D3A9AB6E0F0C9012C32CF3C83EB91E19D22A58D9AC561C824170FA8B59AD4195728DEC43F6649716871370A6580A00001292DA7802A73900E731CC015349C2950752686D72D6E05BFB0E050D0312A4A17BA8AA5C977A5DCD8000BBF1AD9A1D7E2AD30EB72B79F6DD53D9210D2829633FEE1946B947CB2A49586A12D5D1980CAED4F2E1942682564862199C91F4D43D0C37174CB5EE292B4EAA055119FBD999E9E5E54CD69081BBBB9D0D39E5E94CF8C3C4CA5101ADA9D3B01F98A17895B2464B4ACFF00D5264FD3FDD24A2C0D5A85A1CA70EADDFE2E722D7AD5E8FEEB11CE62D6EB511C7C2AFF00A28C1196597CF49E7CAA1A7A8FCC56E96395487FCD3311272708B094967A685EE323CAC6910189620A6415FE1DF753AF1368919F33DB4131972CF5D10951D4826A732D5B86E54C9F4893912536DE4EF13FC49FAB27719EBA3748B22E71A4B2E29E55B5CBA2EA652DA24B013A97C4FBA2093DC024C53996904A5F3C856D77F22F1332F0C58170929AFD428AE01AE72FEE347BDA7BDA2B05D99B17B617642E5DC576BB14429969AC2D697BF04EAB206EC3678D0005C9C8C70ABA5384A10087506704B102859DBA44BE1F0EA5201DD6A5998E41F969AE9AE2BF65CD92DAED986714C6B6E6E2DAFB6AF1A71A798BA654B7434D15A95C2E2DCF7D2B0CAC2607F703CB2A8EF10CE929C3CC4E1BE67CB0004EFDC16FA9DAD5B3338E158B361B0FFE8A42B74BFF002045D886CB2E7EB1BCED5A06169BD1FF0022932B3A12633F9F3CB21D32AA16CD56F62DDDDCB8CCF16CF874348D9694B948CA8D91D1AEDA8F289CB472E9C4ADD688525F292C273E24041FEA8580722A12131AC8D79DBA7E193325870093BAC746350EF5A3B74AC46E211BAA2EC0203A9EC7787D246AC4579B8B3C7CF67F197DA3DE4E2988609B2F82E078FB9B16DB776E62AF5BDBBC6D4786DA5D4A9653FD3E10E26655D2626BD15F06F64E156B54D24A674BDCF928240DE2AFE54B939BB539C35972945082B295124B949A370EF6C8F111C3BF62BDFBEC56E9F7DB8BE33B4ECBB74C5E38DB4E2D80DAD2C061A5B4E0794B50093A83DC1ED3E93F15EC3C462F64E0E59412890956E8DD3FEF634147AFAEA61E61B08F34AD2D5ABE82C1E9DB4D1E3B84E6F77723B578BEEEF7B1B15895A3AE6CE623E2E2B62875855C137172CA130DB64E498515711194D33F875E0E48DAF2BE74820A56090A48D5C30B39E19B35210DB52CFF0089312E2A8527E922C4350D0BD69561CE3EBAF70DB7DB3BBD5DD7ECB6D8E149B276DEF70E61B6CAF855C0AB765B655C1C2602814E647388E95EFED93B1B052364CA5AA523784B00D038602D6637BDDB998F21F8A70937098DC44942E7195BE548517624B921474766190193C671B1B1612F2D2F22E2E9700B6ABA85B2D889FE9481034F38E74EF038CC1E1E794206E92CCCC18E6DCF955ED1CFF7267CC2A25543406DD0519B5FB44FB16A8528DC84F0B8AC80E402728E67B0CFE5562F9A99B5497196B5BF9E94EF1BA8104BDFDF285822E94A2A2A401C86632CE86CF4FBC6B0ED1C7C23C4E1E2E7C3A7CE8822AA20828820A20828820A20828820A20828820A20828820A2082738CF499E5FEE993FFA963DB837EF95608A57F94FA7D453B47F11D7D4C1142085028E9FBCFD7F5A260FA6B627DF2BDFA406BFA888C52E45937E202233EC3213CBEF5F481C6D88176367AB81FB1F6AC640048700D45F9C73BBDB4ED2D76F361312B25A02AE70961DBBB479A00BCD3AC82FB6904E69E371091035903BD79EFE20EC438944E9A52080959A8B9A8BEBD2DE7D23C37210501690EA5338B545DB3B3BF5E11CF0F65CDF33BBC0D8E7303BFC4D08DE661576F5A5DE0B70E91722D98BB5B2C28B0545DCED11C7310419D32AF9FF00F10F667CA9F3CEED5D54B70007DB3716B4762D8D854B254BFA521AAAB559AFA9B10E46A1A37AEDF13FC234DDBA894A9284F10320F1912A93D02A63E51A57009D30C85900589BDC70E8ECC43C5EE56CA0A961696622FA3B56F63DAA4C3F6F1B03FBB9EB3FB18E93A475A88C663C00CFFCAF534EE78548C9D9E911989D9E12545B30F6737E163C352D0CEEB1A4F1292173DE40F3E47BC6BF4A8F4CEF9A1C1770F7C8FBCFCE34C3CADD56EF2D72B657D0708B6EEEE7C624E5FAEB98F4F4E9A655A2945D81A70378B460259041160CF6FB50535AB3E7588570FBC40D01E53D8E7D629ACD986EE082FAB9E7C88EC45A2793603DE7F77FEE2A49040D3CBA5335ACB105DDE872CBED90A40A43D6C72391841C71295904E7974E9E63CAB644D094D5C9A75A9D7BFA438972FE9059DF5E19D6AC7AC51E2A3AFD3F7A0CD0C18ADF3ADBFB8C2E580E2E74BF937BE50FD820B608D0FAF4FBED419D57AF26A767AFAC32584B97EE687BF38916F9FA7EB58F9B5BAB3AE96D3DD28346AB4328B1E795C70F385916FE2282A241E71D32D63B659E5CEA4E4A8FCB0F6604F1D399D34615AD2227ACA66001F7AA4E8FE5EED12ECDB42047088D35FD8C759EFDAB604296F91D796919F9A1850726A8F3E5CFA43830DADA538DFB88564B23212759D6331FA8EB378196EA4B338F322F9E9C75CCC30C42C1DE2145D8167E1D6E1FAEB688DDE46CCE358A6CE9C5B654B4AC52D9A2B67F371F191970F067A8E46AF78291BC90401950799CB872BC5431B38296524907EAAD82AF50D7CDFF004D1687B3EEF2AEB11BCBBD97DE45EAF0FDA4B05F8776EDD385AB65A5454A60254EFBE47860033A9F4A9A4E1C10067AB301C1F83EADC338A96310A415AE5A4AC82084A43EF7D81E2236BAFC60CA6DB6ED1DB7BF4C8297ED141D20CCCF109D3B1FA5359F204B191E4C417B64DA9EA2F785306954E482A96B96CEE169637A900FA7586D70E36C8287997D694A07BEA124822609CE6328F86794C362250756F05240B1B71A5B2BE8EEFA4C61E46F91F2D52DC64554E1974CF4A345A78862D60C13E030F29CCFFB5249F841CFBC729E42A2672909A872D42FABB06E1C866F13987D9D38B29625EE8018241721858E8796BD2CF771F75DB85F8B6E80CC8CDB49FC5360092A76623ACF20338A40E18AD214452E08AE6F7AE7601F311292F03BAEADE50B50FF001391CDC83634F26318E76BF7B3B2DB2695AEE76C30D5BADE6AC1CDF2157EA3FF00F8D2C1CCAB4CBB839D6ABC3942410A1C52FEC53F1CE1DE170D28CC2932085021E62922B4A6E9CDBC9818D42DB3DFFED66F2EFAF365761AC6EF66F0F30DDCE2D7AD2ED6F2E90B0655873CD9217971054820020999CDB297B82A1AC090EEC5BFBD72A0113F87C1209AB2C38A1A80C459F8DF5F4B4367B7236585DDA717BC69FC6B14795E2DC6217094DC62EDB84F1152DC202928049009FEC1234A6EAC60466E32B3DABA9A1E1CC5DA611874A52280301A07D1A9973EB9C6CDECCE002D50C3885A5E48193A832328F74AB4949C95AC28543ED99BBF835281350DF8772C7B985C2D2964B860EE721A71EED1950A816020EA040FA4F2F38EDDEA9FB266286281BB28DCD454737ADDF8EB0D96B01C8AB8C83935E2DC2BF731459BB76A6DCB603F0ECB6A4C5C0949826550AE51A65196B15799939909FA98060EE003D79387EBC6184E5209DF512A77649AB90294A694BF3CE354BDB797816CFEE17783B4589E1D85E35F87C21C16CF620D26E0A16B6968570A9511EF473E5E95E8CF83B881FE66180A82A4872F67F66BF686A89DBC80427E58ABA2C29C2F6A9CCBC7E7F8AC6AD1EC4F69B1A699B7C314FE2B7B9211E0B251F8C7920339E7EECC8313957BE676C74E236326629D6528428331624034CEF4B5380A43A91B4A54A3BA4849CEC32E0C18937FB18CA1B078EED65FB89D9DD85B8C7D6BB94A9C5358629654E2DB05D48692DC924A802246B9F4A6FE1190946D64A9406F6FA5FA503FA35F94436DDDAF2BFC7584B541B1A73AE7ADAE35A7DC9FF00ADBEDEEE33B8CB0D89DE760BB45636D80A9E4E1F79B40C3EDBEF876E5C59E35BB214042424A63223AD7A802D6BD98128A3A0333F2E9E4794798BC61B411326CD015F5025CBB8EBC03F4BF3FA3AE1B90095A9B4A523DCE1273026049D328F2E5CE6A387C1E326E306EEF1651AF992E0706E79E714594A41BA779F2D3AFEAD5E5258738B72D92A7014AA4E4441D48CFE15D0F052E64B94913410B6ABBEBC7AC37C5A5299CA092E29D283F70FA9EC35828820A20828820A20828820A20828820A20828820A20828820A2084CAC82440807BFDFCBE349264952DF4B9CAD953D9E461354D4A5A84FAF4E5D22A90A919FDFC694002433DB33190B72CCD0D5B205C3A24C2635EE272F3A4674E64B641CBF5EDCB90B429761FD9FCC5ABB605430B79F4E41B4924692049CBEFAF3D61F1002D254E33E341CB4F5BDE8A22592450BB8B57BD3EF1CEDDEE5EBB77846D23B6D2E855A3C5E6DDCC02D34B29E103FB721C4491974CEB8F78C76A61F766E14A7EA00A5D403BEBEEC63AF7857045587429EA5AEEFA51C69C8691F3C9B1382EF176237B1B5DED03B349B9B809C4102E70BB1F11568A61A7576CE16D94C7BC1BE252A4FE6D6BC61E3FF000C2B68AA72E4AF7492A2082CF5E0E0F91CB9F6ED838340094CC01480CE15504BD3414636CF8C759F76BBFDD97DE66048C5EDEF9BB5C4DB4368BCC22E1C422F9A7A78172C0515005614AE7EE8122457963C43E119D83F9AA54D1F4924806B716B67714E0D48BFCA969420237286C52030622EF67A65967966BB0BF37C62D945D4A512A5A33427DD98528686328EBDB3AE2BB64CEC32D49DD2589A81C59B2A8BB67E51198E9297A86166199B1CF26F748A54F38B5A97242742093323DDD3BC1D33D33A4B03895995549078821C1BBBFA8E1C618CAD9E662B7D2C00A97762723CDAF5F48A937FC1F99975644E89D667CA7BFD73152482A591603B5C53DFAD22670F8732CEE82EFF006DEB30E3A08F42FC585A5B5A02B92844465E9DBAF2CA96183F98C4A921C9600B538E7F8E01E24501207D44150CB5E747CF4A1A9BC29C4842415109EC624EBE53DA951B18ACB99A91A024E94D05C545E8748092737F4E828DDA239E5A54EAA0C8E4797E9CF2E79D466270870E482A496D0BF7E2C7979C6C9C4EE108524B3163AB0E7AE659EB68F024AB3047DFDFDE751AB9A11A77A77F5FBC6DF337FEA0925F874E3A44B5A7FC694F3060FC7E3F4AD133F7D411BADAE473B1ECDCE8D9339EAFE4A6140ECDCAFA9F7AC4FDBD9B8E890A4671A98F3D7E35272B0A66241DE009C9C3679F6D6F58899D8E4A09705C8B916C867CB56CDE24D9B752141A50E229FEE198D0739F8FC0F3A723FD3FA0924E82C5B4B3FBCDE22E6CF4CC5EFB64398A7DFDBC4DB164E2C26074EDF1D79E87A9F83B9127E62812EC0E4FE6D97A437998842695D5EC73B71A44EB5847E2994B6F04F87A029FCD139E664663EE6ADBB3F0CC52EED537771C05F3047A8887C462D0EADD249346366E0D973CF4CA5B0FC25FB058432F2CDBA89E26D6A24C7602AE5833F2C00C28D931A67C7AF18839F342CA8AB76954DA8E00F32D66A8886DABDCF6C9ED9B4FBEE34BC2311B8482EE278725B62F5C291014E3B1C4AE180019D32E74F95B424CB05252E450167EE4DF4E0CE620A64DDC5804037DE0CD7B1B79E8D7731AFD8BEEEB7A7BB8E0FF00F02DA36F1465B595706D25D3CF4A78A4001B006432F9654CA66325CC2490CF9022957CF8FBCE1F499B2D49092CE4977E3A96D1F3D2CF0C93BC3F6810FA8E3183E0570C242415E1EC5CAD0B84804A4930731E951B3D6A9B41D2ED4356E9A6B5D626B048C3211BA120977DE663772C7ADAB4D22C4DB4DE3EF70B0B182ECF30D5C807DE7ED5E08E239CFBB2489988CA39D464CC395134B9C9DB5D072A7E62CB2264B003173CF875A575A4609BDC3FDA2B6F1A8C5F17B4D9AB57894A9CC11EBAB4C40A78A21C2A904C6424E4093AEB90B4C90CAE9DAB9B1A534787416822961951EFA7BD625365BD9C7F0D709BCDA0BBB8DA0BB510A55E62AB17373275295AC4CE7F28E8698E227CBB0FB70360DA5AAFA98732E720067D19D9FB0F76D699FB08DDE6138516D2CD9B4A2D8050EB8DA7C46CE521063204E59C6550F8898E5F4D73ED5341EEB12B271728252D7CC585697B3FBD62F746CC593A80A4ADDB77844AD82105E11925C3FDC00CBA807A45442D678BE4F6F51FBA1D0C3B5E3DE8908296FA8915D2963A69DE1FB762CDB302DD2CB4C944C2191C2DC927DE8EA7F32BA9EF4DF14AFF00230EB9207D6CCD9307C81EBC223D58E44B5EE83BC2EE6A4B9B7E05B5E292587418253C33966491FEF2E5FBD5691255B3E6FCE58700BBD09E5DF40FCE1413153599DCF1605F9B59BFAB4561DB8B45A96521FB55A7FA8D89516C9109244C244E797298CE9F61F6B1DA1351874214E54002DC6E3D96CE80422B94A2E09AE47DD072D0D59E386DFC4F76F36B37A5896CEFB2DEEDF137862FB4EEBF6F8E3985BCE78762CF1377091745A254D9532A504050FCDDB2AF6E7C06F076D09F3F0B8C4A52A09295044D7293CC58B33F2E05CC5E217B8E0A9DBEDAD1DF2A519E30C7B3C7F02DDCDECCBB61B4BBCFDA6DA8C79C7FC1BC7F0655DDBDD61E5E570BAE2576EEB67DC5384C89CC124E75EF79C572B00304B4A65CE284A775144D0370AF5376D229F8EDA0B913944294D56AD752D4E36CEEE5A3B3BBA7F635F65CD91C53086F03DD2ECA5B5C58F036D5E0C12CD172E848482A79C48F79440CF2CE67AC34F0FEC49F2F1E99EACD4EE4EB9171CB4B1AC53F6CEDB2A92A00AAC4104FE38971A67668ED0EEBF63F65F66F00B5B0D99D9DC1F03B4286FC3FE5D6A8B67084C157104E473F5835E88D9C52AC2225101F75A9996CFD4EB4B51F8A6D913311326CC0A356706C2AE19F8B8CF8465F72D564A0F88B2129FCA1592A00FCD3A904476FACB6130B2652B7CA06F5C1233D1C7B073886C295214525CB6649D2CDEFCA246C82C329E3E1933F97439EB9E7D7A5389C5256775F893C87BFBE9B4F52553094E801ED0F2928460A20828820A20828820A20828820A20828820A20828820A20828821056A7CCFD694979F4FBC3399975FB4548D4F97EA2915FF13D3D442C8FE43AFA1847861D7951AC69AE5D7F4A633BFDD425DB27A37EA16171971D22D9DB04716097794C20E5E87E3E54CA60FA59A8CAB0D787B787B21492A507AFD239D5E9E75CAFA472EB7B6BBE385ED5B587AC2568C3AFFC4CD420AAD9EE09033C8C46933A19AE35E35D94162762022A012EC3425FA51A3B078627844896934219A9EFC99AB1CC8F676DA96362771B8E63BB5364C62BC18BDE5A5F5B38DF8CE94DEE2EFDB347857D0382267B682BC51F11B6EE23662E7A5256129DE176D6B43D7A5C10F1D8B63E24290900B12DC496E1AD3D6CF0E778DB8CC1300C291BC4D86DA156C762375E15CDC5AE27749B1C3AE9774525A43086C4AF3720A4CFBC40D4D795F69788317B4F12A940AD414A20DCDDED56D795ED176978BDD4B29C8206EB64DABB172386958C6569ED8988EE871CC3776BBC9C3F16B5771542B87692C9A28B171B6DB0E871376EAB3494119E9D349A9BD8FF000E311E2097F35525DEBBA524294EF402C7CFEF11B8BC4826F40ED63CCB0D5E835E51B3FB31ED35BA5C4F0AB6759DE560092EF11F0B10C559178933987532633C93CB21DEB5C7FC1FC7E16614CB90A005BE9200A3E94E361A18464ED34246EEF3330A1153F67AD5BA5232059EF9362EFC8559EDAE07700E858C41B50D01E44E4476CFE134EDA3E01DAB8376953A8F6490E43816FEBBC48C8DA2852AA439156F215FDB9D1AB78611B4985E2EB439678CBF76E3874B57D2B615063DC00C9D33E53CCD50B696CDDB382DE644EFA49228A661CAE683AB718939535332C5ECC4D0FE7F65B38BC6E6CDE5301C7AE2E186C8FCEEAB875EA488FAE5F1AA4E2B696DB90B2DF3C373671A0ADF5A01D2AF658429802951B109A90E730DF6B68F0CEDDE436DA52DBFF8842491E2F105CE706543A69A11232AC61F6963A78FF5FE6151615243EAE3CF3F485BFC32A62D4C81E37F2CC919DA245BBAEE4E9CE09F5EB0465D674A9EC2A04D00AE845F79A94CC1737E40E9AB84E10243333D8E5F625FD4F794B5B900A3B4FC01FB8FAE469DCC952A5A77814BD2BA7B6B0A528D688EC561D92A2D4670DFBAF0F4BC5E36174084EBDFD7EFAE91D05444EDA8B904849342C188D3F54AE7567AD3F1D288DE167E67F75356191AD691775921B79285989333A671CBEFA73CEA5B073D7894256A241CCD8F3AF4BF9443952852C479FBD738BB6C996C464339EFDB3FAEBD39558F06A4A4D4D465626B4ABBE9F9CA22B153164DCB0A96E56ADCD7D22E4610D04241E181F18D403E67D0FA656BC1CE09DDBDBB3FE69CB8C424D52C28FF003FAADC3BDAFAFAD651A4B320C8111AE8341A8D3F69E756191884EE9750B52CEF9BB1B574E10C56A5870778B7FB8DEAC6F415B5DBBC392B4B44919B640D73072198ED9FF98A8FC56206FBBD0DD9AB4D7AD75A50445CD2A54C04B5097E595EAF5AFB30C2EACAD710052BE132208CBB46BF0133CFA014DD3880A7751072AF4D791BEBC21CC85949FAADC457DF4AD9D9E229DC26D6DDA36E8F0804CE47501464E5DC9903ECE4CF2186F31ADC9EBE599EF4898C3E24029290ABE55CF4FBF18B2F11D9DB77D4726733DA3BEB1ACFF9CE813C1A953E95D1F537D183DD844D49C45C8DECB831D73D2B9768861B3987B29085B6D29C4CCC0067B826397A10353A963397BEAF7DBA655A5A1F2318C0024B97AFB6A37EA1B39845B2092DB423B247307EF99CB28A6335EA2A79E97CAD5CB4AB34394625D4050BEB56E373DA1839837192EA5B0907310348EA0FEC7E951F312E906A497A135D0E55E5487D2F12919E54073E601CBDBC47396FE04C1397FDA728F5CC69CBD3234CD5289C800E5AEF77CC77870310F7722C5BCF33DA235D471B8489F41F03FBF79A48A04A49530E3A9F21D6374C833485901813C9C9662C1EBEEA4C51E17FF6EF97DC5203069DA0B1299CA8814142E6D636CF31CDDA464832C0A800543D2ADED87DAF83B7FF00BD5C3774BBBAC7B1CB87026FD4CA6D70EB30522EAFEEAEC9B767F0ADC85381A75C429C23348CF235D93C05F0A4E3B112270C3B82524326CC41AFBF3610DB178C4A105EE1D99FFA1F637223497D93F702E5AE258A6F877ACDAB13DE06DCBFF8CB87AE41791B34C30B51C3D36EA7878B686EED56DA5609FEA1194F3FA23F0C7C2C3C3F8792A52370212059AC2971426FEE951C76D015FA99DFB54D39C74556D2BF0EC052022324A522070A7241CCC6691396B3975AE9B8D299D8B0B4DB53A5AEFAEAF9DF3A76D09E263A81241A35C9C9DAFE77AB9CEECD8E6BFF00E6ECE468E0D27A8CB2E79FCC9CEAD3B2100292482F4AD0E9735D08E3D4C50F6AAC90A25D8851F7D2F4A9B523A5FB12230CB11C837A8CF90CBE1F1F4AE95B3EC19C30CE85EBE9AC51316B652C3D1ADAF21958916BC64958800F248F5FBFBF2B0A1B74019522292A1BCFA1A8E632852D7FE14FAFD6933736E96E9082FF0091E9E821C56235828820A20828820A20828820A20828820A20828820A20828820A208415A9F33F5A525E7D3EF0CE665D7ED152353E5FA8A457FC4F4F510B23F90EBE863D52638CC0CE3CF2EB4CA6921EB666E0ED0B45B1B440DD61D7368810B75042547F28273127E1CE99CC202483983E4CF0E2424858551A94ABD639E5B7FB2EE5AE2D8E5AE22522CDF4F8772A689CD0F20A722A81A28820CF58D6A87E244A67E1E6CA672A0459FA51F3D2F5238F43D858AF96948DE619134CEDFB23CA3827ED7B816F1B703B67865DECC5AAF1ADCE63B89B3738A58D925DB8BA67C1B969D256DA21848F1D4A32AE93135E40F1F7C3CC46D9993B76593BE4D4268D5CF4EB7E21E3ABEC6C76E9402A3955CD6FC38BFEAD6D7B69FB55619B63B05B0581EEE302C7717C6DF5E181EC2F0BB64BE2D976CF5A150BA65A3C48E20954C89C89E55C9367FC12C4271816BC3D029C9DDAE76A5B2E758BCA71DF403BC59867C087F3F2A868DA1D97DC15EEFAB0CD99DE76F4367DA699B2B0B3186E0AF5A94AC45B32CBE9BD61E04428A791191322BD25E0DF87B87D9E895F3248FA4016AF1CB8B7F548DC563F75249512E0D9B8919BF71C5818C9B8B7B296E5F1B2BBB1B178260EFAD08416F09B0B761A4290908E3402990E28895AB9A89922BA54EF046C89E9DE992251240A1482C4B5DE9E561C43D7266D35A6690925B30D46B57DD39C623C6FD88B622ECACE1BB47B4F8324CC270DBB6984A7A00026321EBD339AA5ED7F865B271214061E4D41B203D7855DFDE913184DA0490E4D6FD18F43AF78C4989FB136F1709BB7AE7767BEADB5C3EED9016C338FED03AD614A58121280CA41827256999EE2B926DBF82DB3F129294E1651A963B81F3BD2A38D7C8BDB3058F620EF03931CDC67D2D50DD22DE6F799ED7FECF771C1BC7C393BC6D9DB7242AE7056AFB15716D27995BC420A881993D0F399E5FB4BFE9EF0F396B50C2A2D40101ADA6EBBD0B70B459B0D8A964B8201615058D879DFB50B5636DB735ED6FBBEDEB5BB0C3C95EC863A6517382E301BB1B86169240058E22A495C710CB30418AE29E27F8313365CD98518764A49A25059874ABBBF37E0D60C2CF46EA4156FB13FC8826B9BBBBFE9E3692C71766F57C2CF8859569723FE050D4292B920883D79FA8E11E22D9188D8AA9837149092C0976001ABD9F5AF9801DF2A64B525C0045C01573DBCB2A6B5996F14B761E0CF18700221C410A6D5397BA474D3B9D473AE74BDB334CEF92545AD7FB3DDF952D686388489B294424A5C588EBD2AFA54D327BE30ABD6DEE11C611A415981F1CB9EBCF2CF5A9FD9FB317B4589058FD5514399E2E48B53F351C7E15552524EACEE6F61C2FA3B6822F9B47168E101E41E8127AF31F2CC48F2E73E30A7027E530200C8D2B5D3F37D1A2AF3E490B2C9525EAC47BE1EC345D56778E048F789D34267F5D3B4C65E54F30F34EF3B86A3DA94E957074D2D11B3A4B92E90C5AEEDA65ADB43CDE25D1882A47BC124E441CA23D7591AF79ED53D87C504DCF177FDBF0639758879F214092C487C85B43C3F1E724DDEAD4212B132273F2CC73F3CA338A94958C02E68D9E8C0E9E54600C464C96A3BCC09CB80A6B4E1971B44AAF106CDAA5A85174482A0070FA199F3CF5E8669ACEC63AC8717CECDD48BEBC4F3860708B528A98805D8313D5C0F2FB4465BDCDC34E95A9529998075F4E5F2A47FCCD19C35496EDECB768593875020949A7FE26BCE9FD4387EF90E38A570E662720740074FAFCA8FF2CD5CD7A7A5CF06E7587D26514A47D2435836AEEF4E3C3B34352FB2AD5B9F41F3F8655918C04583E7FA76F46CA1D252B702A3913E4DE7C2211F682EE56BE121063DD034CB9448F43D474A513337C02146B93FB7F487282ACC1E7CB81FB6799BC2CDAAC513E234E11CE123303CC83F5D73E95BFD2D577CD9ADF9FEF846CA3382BE921F8BD2DCEED71F8641E530EF1065B2949D0A840F5EBAF98AD7E48517B067EA74BF11C98B6AF6419C024AC826B6726E496F2ED945A18A5A49E3F11B4E44813CCF58CC72E9D6B070C9AD3CF37D1B23AF0AE920998B7018876EBC98D47166BF216AB64ADE79A8E14B31C4F1C9A3C59A615CCFEB505B424CCAA520B0D38B66D9E9956D13D879A99720155D87D39E76F77EF1686DAEDBE05B01805EED1ED2DC270FC3ECDB538953EB4B46E826470DB9564B512008EA40A9FF0006EC79F8AC7C92A42F777C646B517FDF0E2219E231E84950DF7DD150F6719F6AE9A8CF99780BBB4BED81BF2B0DAF7AD9DB6DD2EC7DC3BFFE3F8462485A138AF8882DDCBB88319B0F165F6FC5B4524E47849AFA4DF09FC3587978590A99280FA126A90F4029E85B2F28AA63F6928957D74AD03FEC6BA1CDEF1D14B6C26D10B7B05C3385AC3184B097DFBD01372F78094942429320A1A52785B06084848CF5AEDFB4D48C048DD943758300037B033F5CA2AD89C5AA6A8BABB1E7D746E05E913CFB8D396AD3AC92B687B80EA4F8709398E597EC2B5D91BD8A4852C0E04DCD79B53F0E2A223D73094A9E8189B9F6FD9FAC5F3BBEC31FC4715B6798294A50B1C5C5209CC1E5AE433D4E626BA36CAC391BA7938E0F677E40DABC6299B594EA5358D40AD181E1EC115B08E92EC8D83ACE1966B52870844473919139FDF99ABDE0E584A4166E038801AEC6D4D2DC2287895A4A94337A12ECCF97AD59B8C5F0A525488FEE20CF4D7CFE952454539D2AE333A74D7D888D0A2093AE4D4F7EF575ADC10D007A9D3CEB20B807580972E7385AB318828820A20828820A20828820A20828820A20828820A20828820A208415A9F33F5A525E7D3EF0CE665D7ED152353E5FA8A457FC4F4F510B23F90EBE862971D482519CFC3F63EB4C66FF00BA9A7DABEF585D201501AD7A0BC473F6A5E049E9CF33F7F4F432CE6074B9205C578C3A42802C680B5B87BBEB1AEBBD3D8543E9BEBF21C7137A905411986BC311247298D67F4AAB63702B9B38923E9341D8DE97E97A50B189AC0E33717BA19810D4E5A3BD4D7F348D16DA5D90C1F16B6BBD9FDA2C16C31CC31055EEDDDBA6E5C4024A8F0858E1064444E446424547AB64E15559A849A33103D68C7EDD0C74DD8D8B2A4A54E7A1E77007DAE6312ECE6E8F74183624F5CE1BBBAC35772957126F2E30B6086D59E6870094F0E83908D795339FB3B65C9FA932D00B6807F4E7C9B48BC4AC613280DE34B826C3977CB5B464271F7025586E1E52A62021BB56B3619198090819240CB4D48911A88F5AA44B27E5002E404B060D60DCB534AD5DC4663316A7FE4C2AC41B5E9CF216111CAC39FB64969F480E0FCC120C0E2322273D0E63581E555BC66D0C50584A0AC26AF520355BBD7CC4478529642AA756CEDF7CEBC6E5A21FB6F7A232CFD3E47D3A7C61B2319895FF0032B2FCEE6F4E27A7189492B54B00B9CEF7716EB51E9AC4270076E96CDD24861A23C328D64E66493D73F29E722B6F98A5B15A49702E0DA9CE822670B8FDCFF71F3670CC2D473EAF156321BBCB33875CD9E1D7387A870A85CA389CE1E73CBAE67D295DC94B4D51C983BBE5D470E71352B6CEE007798F0E81A97CAC5F9C68B6FBBD92361B6FD6BC4F64F13BFD92DAA92EB177B36F3763FD64C293F8F5A015F04800091913A646A8FE23F0DE13684B984CB495149674826D6B711C6F13185DBF91517CB30CD5D0F1B75AB4604C037DFBE5F664BE636237A9855F6D8ECB29618636970365FBE5DB320E4E62376EC368805324468ACA6BC7BF113E144CC67CF5489143BCCC9E6E5EB4AC59F05B5B7C004BBD5C105DEBDDF5E79D3A49B9FDE0EC4EF4B08B6BDC03686C3104B88E316F6F72DB974DA880A5B6E25130B42A52A1C8823B5793F6CFC2BC5E027AA6192432892774E5C481C75AB919C4F8C4054A71A33F6D3F7CB5CC76EFDBB37AA6D97DEF1983932FAB2544689D4E4397999CA9AE0D32B633226B0DDA1DE6D08FC30343965092F0C569214012450E8E28D90A0BBEB58B818DA3BB5DC00FA030B100B69052948190201D02B224EBDE69AE37152F1538AD0CC49B72F6FAD2948ACE236780ADD04AC027EA2C7D916AF570232560D8C21C424A97079927FD03D23CA3A53742B749AB3E7EFDBC4462B6791FC53958D5F4F36BF578B9D2EB6F283895E47BC67E59F6C892234D69EA66669533DEB7F38879B8577494D4065532E596773969126C148CC39E8159E9D20C680FFAA709C492C0A83F7EAEEF9F4B8B4464CC1A41FE1C5EC2FC73E34AE50AAEF434A28E398CCE7073EF041A426E21492594FF00D0A7BF468DD18305208043EA1FEDA367D228FE663A9FFF00D87ED487F94BD4F61F98DBFC2F7BBFA8ABF19C598224EA0AA08F9FC7215B7F9254010A19BBB7979F58CFF86902A97D4D07D87BBC1F8A13AE7A73FACE959FF2A9BA5EA6E0866F2039D5B9C63FC66760903437F207D4748709B849410A201391279687F5FF00753585585CBE2337F64E55D73C86BFE3A82AD4C9AA3ADCBE7C21A3972D0D60CF5F58D481F5E5D2A4A4A42981E6065D69AFAE90AA30EA51277496CDAE03707CDA20EF318650A5B08202D319E5CC48CB3CFF005D69F252281B8659F67F2A5290FA561CA40510CF4622D5CADA58D62D5BCBC6A49B8B94A1339852C800753F0EB9D394480B60A0CDFEE6615B548ABF67A43F461CD4B127219EBA7A03C1EB18C76DF791B21B1F85DE6338AE316D6CCE0CD974599B8421EC51C5025B6DA41203C50B0124488E2EF3574D89E085ED7095097BC090FF004B923B7DBCA19E2B1424A424BBFD5AB27CF2BD29EB1CFF0052F6E3DB476A8DFE32DDE6CC6EB706B8219B05872D177ED255C33E1AA597015B61407454F6AEFDE0EF849364AE54F121AC689FA4336A38393E6CF153C5E3021240512493BCA37CDB78FE7AC6F66CCECDECB6C16CF58601B1986B768D59365B2E25A4216B5180A52CA009E23267299AF54F86F672F644A952CA5B7404D29976E1DDC18AE4DC495AEAA2CF99ABB73FD680677731656D7366B75C3E0BCA12E1C84EA79E672D663F5AB6CFD9EBDA83751BCA243E6F9643C867935A044A2B2491AB7B66B0605EFC8C37B5B668B0DDA30A2B6D2A30A104925524C9EB9919FD26A5766ECB3834A65AD0410F96BA599EC2FE6D0C718D2DD35000A92EFF0070FC5B5A0631B29BA6D9C21E65C08C8A92743D729F203F6ABCECD96C94D2A72CC8143CFDD6B145DAAB7DE2E5FA7A5FCAFC6379F0867F0F87B0D10470A743DE0F3E5570C3A5887B1D2F62FC2F147C5CC725AEECF7D0FA5B2CB9C9D2B3087352DC72F3E5EE911BF32AC547B96F7AE435876CFE41E66B32CDEB4A379C2E92E906FC7AC2B4A46D0510414410510414410510414410510414410510414410510414410929064C6739D6E9504BBBD5BEF0D972D459859F5E1C22A4248249F2A4D41C11EEF0A24177666D61B2D8714E958238491A93947DE7F72D664A529D9FFAB37BFD2C181048B438E0CB5CFE5FBD22AC312962F93D3AE61BCE3255F56F0E8FDA2D3C76DEE31143F60865A29527878DD4CFE607F29194C76CA0674CE7210414EE90A66A8B355DFF00BABE4D0F30E374098A5115B3DF2B75B3DF48D29DE7EE81EC25F7313B2BDBC05C5296FB2870F8644CC25206801391CF3CEAA3B4B0F88FAF71442AC0825DAE486D1DB3B6B7BEEC9DA0896849B80CE3CA9FAE51AF97187B56F76B45BBD7EC37925C4BEAE149207BD09034267A73354DC4E0F686FD56A524E44927370030E2ED7ED17295B5D0B48029C2DBDA1E35E0DC6AF093682CBC1AC398694167FAAFF0FF0057A92950E799D40A4D3266A48DFD5944F503476E35BC626CF135254D52CEF6B86D5FBD7842F7987AC2D50A5A814A4F13C6564902412390CE04E4075A96C3E0B0CB4BAD0144DAC7B07FBE79D214958A44A001EF7B5455F9BE82916EDCD9A9274D394FFACB9E91D795666E1306827FD31FFD23ECF9D3DD1C231C951228C0F56767F23DDD806868E58DB78056DA26E553C5C63DC1D2329D2751F2A8D9D2A42086450568056CC2EFDFC9E1EA26850749619B96ECC6BCFCAB4B3EFF000643CA2A76E6E1067F2B4A1C1E5A1F8CEA08A62B54AC9200B3066B655A7439584384A966DDEAFE54F2D22199C2D9B275D5B4DA145407BEB48F117023DF235E824F59E95193247CD984DD2694B75F36CB430FB0F2E71008530D41208FB65E94D6CFDB0D93C236B70CB8C2717C2AC1FB6B84942C964294A4AA66788473F3C8F794311B0B098992A1364824E7BA33E80B3EA79E462D380C61925017500D49B65573FA191168D19DB3F664DBFDD29736E7D9B719698C5D6A5DCDF6CCE22FB89C2D0106786D2CED42540B89E22A0755281CF2AE29E32F86F83C7CB9BB92424A829B71201CFB777148B8E1F6E484240500695736CC5DBB6515EEC3DB771CB1C5D8D94DFCEC662FB2DB40DAC30EED13160BB2C0F891092EAAEAE55C45110AE2CCF9675E33F1B7C0ADB7899D357835AD287247F3720540A03A6B1292FC418520B8B86000147A1CECCFA3BDF4E87ECB6F036476B9B6DFD9CDA2B1DA16D684B89BBC3EE9174DBB29E2284AD33C4A6F342C7250E935C3319E12DABB0712AC0E2513173525B7D94451FD68DCDB81504F933C6FA0009360CDC0F2AF5CF9647C331B5292A952AD4A084FFF0022513248919E607603CF952A36362C23795296903FE40D7859FA13F686CB4058CB872396777E2F1778C6EF2D582B0A53EDA38214DF110BE331EEE70424913032F95436254BC2A94952542D71A6648E1D6D9444CDC1A4A8FD22AE48D3BB68F9B70222455B4D756C9694B0E2D4E09094495088D472F21D472AD64CD334B82C4317D35AB9B4305ECF0A2E052EF60EE7DDFBC4BDBED236FB4DADD65EF19C305B09F78198CC6713FE69962B1E64CD2820AAA6B46F7A9D78C339929129450A42891983FB1A8A5EF12C9BE44A78DB75949FEE713C20749E629346D12A3541166B55FA1B76E302512D401092736724F6730E1FBE6ED9A0E825E4A808F07DE27CCCFF00A83953C9334AD8258BDA9DEC5DE3099466160821B23CEC18D73FCC26CE32DBA9E2216D000E4E0E1518EC7F61F0A9093835CC75070EE4795EB5E59F3853FC298EC03926A2EC28ED5157340417F2886BBDA74A2E0B6DA1F7018014D00A403CE6397FB3AD49499A70E7E5EE289CC81D3BF377A55E1F4AD90552C15EE8A5CDFABE61F9579C20F63C86C02E3E1B075E3504F0889CE63A7CBD44D6096B9AB4B2147A6668E7FAA1CA30766194EE46EB3029A3D5BCEB9FDE31DED7EF0B67F6612710C4710694CB82438DBA928102082547AC0D27D6AF9B23C3789C79425093BCA6BF16CAFC0FE03422BDC94EF5E7FD30CEBEC6986F43DA1DAC5AF11846C65CBD7F7B70781A4D9AFC585188E2E054E848FBCBA76CCF851B4F18942805004A49B8A38B822A1E1B2B69C9942A0588BB3B38BE64F4BDF45F6437138D6F1D386637BDABEBC6ED2CD65FB0C2AD5C5254F052B8E31261E1EF24C24B607F6933CABD3DE01F86E76761651C4A0129097701E9AB8AD341776CC45076C6DB96310A4805AAC435DAEF903C637170BC1B07C22D6DACF0CB0670CB5B3425B6AD6C5B4B2C3C94A42429E424C29440E23A1E23AC57A2B65E070182C3A50A949DE48000DD1F8C9F26EB157C4635539F7598DFBF3E4FAC5C4EB4979A42AC98436B392894F0A0C18CA3393CCE93DA92C64844D98552C6E8B06B3741DBEC6B08494294A05F788B3126EEC39D756BC0F5BA516E52B0B0A508514446B999CFB919139CE862AC7B0F1387C26EFCF402F4767A5466D6FC67589CC3A928B9761504D6DC789CB8D5CD54D9FB12ABB6DA652B5238F20449CC826791F9F7CAAD8AC08DA2A4CF900250A62C030B72F75393C5736B632589AABD99BA72A37168DE9DD6E0AB432C2D480880932444E5241FDF3ED52985D9AB92A00D599F5176D03DCF1245EF147DA0B4A8296429839005CBD3D7CB2358D9069B21090001023A72FF00433A99972F728A72DA9AFA51F93DF58A5E2120BA83821C56BAF2A7B1A429C0AEC3EFB4D0B46F5B30C7DD623D72F7AD9DEBC5E1CB7926398D7F4F80115B253B800E17D7DFEF38712C86DD1FED1EFC88852B68520A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828821A3EE34D92A2015467D48F989F81A6B324EF0248008CF5EDA5EB61942885FF00B4AA8198136BF6EBD22D6C5B0BB5C6D05B7DA42873E248394F2907A673FA9062713852A72433D2999B657F76A9895C262BE4021C90C0DECF90CDB80F28D76DE1EE5517CCDC5CE16D842CA491C020C81D00EBD0EB2222A0F13B394E0B2800EF43404D9F2B795227F09B5104805401C876A5EDCDB5AC6B35AECF5EECFDF2ED2F6DD6485405291F3CC8F3923E7509336792A50DD37BB54BE4697E7A44E236900032AFFED2E74ADAB9D9B5176892BFC33C5714B4A40040CA34C88F4F88CF5CE95460FE5A40666A3B1EA3856E087B16A557FF00304C6DD37CC963636AD9F969AC5AB79849930939EB9798CBAC4D369D215BA4B07197AB73EC61DC89C01363625EF4A9A9A38D74B59C413F61C1C49888EB9779EDDB3EF50F89C392E4675E56B7323C985E26E4CF70327B686EFF00AE15E56D5E589E239489CB43CF97AF3FD62A24C9625C647A6B968CCF7E31252A7848157D2A19C5387463E8D10AEE1DC4147864C667E323423EF2D49A66A5EE2C0341A350DA8783FDEB133879E0241DE07870B3533FC86CA21DFC3553A13E59FC2048CFFCE993B4AF7D208343D9F90F7A43D4625259E95701E8E3813A674842D2D9D6DF5B686020019BCB494A5723FEDA98CBAC75E9178DC399885101DC663EC6E3FA6178749C502A636C8022A5AAFEA22C5DB5DD5EC06D9A56CED7ECD5AE22873253CDD9B6EB99F3E258D4E93D7AE7547C76C654D52814BBB801A95A58FBEB50EC62B46073770C39E7C9B5D2358769BD8D5FC18DEED1EE5B6E719D92D176381BF889B2C2D970020A516D6E9C92E2C4AA224CE872AE7F8DF84382DAF89562A74894B98A2FF5A6A5854971D6834ADA2C982C7A53280DE6200706C5ED9F5357E04C60C637ABEDA5B98C69CC3F783B1B866D6EC55BF1A9CC6707B0BEBEBF36EDA54BF13C77086F88849CC889CF28AAEEDDF83982C3E194538745029BE9E1614AD39D2B7A449C9C626630B3B333E75FC3FDE919A775DFC477737B73776DB34E626E6038A61EA71AC52C318798B7B9B67944801D6B8A5292B04A246600033AF2A78F3E1A623040E213865224CC2AF953770842F74B16362D6247F6FE5044C53392736233B5FF0059E85B6C70DDFE6EE31265E36BB6DB3EAB87024DAA1EC41A0662600067211315C50F8731B266EE2028024D81D73A73CFCEB1228C0254086C9ACE03F215EF9D844B61BBD1C2AF8AD4D63D87B970DE65DB7B90A61433238153C80131A6A3A53F95E1433803350EB3A8E3FDD2EE6174F86D33C0594824D4E9E60FBB6717261BBCC43C1DF1F1266EDB6B3E169E0BC87627B453A1E0EA809964D724BB771EEB01F0DA10092814B960FED8449FFEE8E10E5AB6E1BB2C34A2A002969470C18248073CFBE94FA4783E72082892A615FE2FDAD715E26819A103B225A0BEE80012C5AEC73B8D323CA23717DEAECDD8E1EBB84E2C2E16904F84D3E9528F6893AE63B7ACD494BF0D62890912D49721C37767EF9706784FFC244B56FB208A31A6F646BE74AF58C4B79ED47B2B84D8285CA5EF1D5E22521213E285490264F32411D6262BA56C6F86EBC6E1D334C92544554525CB90F56EA78E60444E2F172A42C85123402A939D6AD4CF2B5B2C2D896FF76C31E7DC6B64306C43145BE48652F30B7904AA40808327CBE9575D9BF0B5689809901A87F8E8796A2B1098BDA89DD2029935B1F79BD9DF5156A309DC7EF7F7C0EA5FDE25F39B2981CF1A2DEDDC7ACDC08992149765209232EB273CCD764F0D7C3F32572CFC948008B2780D00C868DEB157C5ED10EE54C0BBD682E00CAF616A9E91B47BBADC2EEFF621808C3B0CFE6F7AC0138BDD32D3EB0B4C92B0FA6089339E672CC577ED87E14F952D2E9600682ACD4B5816FB457311B40289216F53C5891EDB96869995A64786385C0B0320419000C824764881A888F4AB72657F88D2AC2D4A12C3A31A55FF005159C54BF9EB52C3D3B8D6A59EDCA14F00F5F4E7F18229CA092A152473A5453843032FE5922BD7F1D7F1136D5E356B668429292A1324F39396BAEA0F202A4E4E154B1715A37AB5383119D3284FFCA1243B81773A5FCECFFDB1685CC4D7C2DB5C5240809D2644EBA9E43A72815252B66294A02C4B1A5AF5E43A8A645E3076ACBFF9E55AF36CAC3A3F08D8CDDB6EE55768B5BC799E10A2492A4F43DFF4CEBA1EC89224E1820DC5B4BD5C9D39E715CC6E3133662D64B019937BB8A3DCF1E91B8582E0B6D84DA2128400A4A7A69FAE675F96553491BA092CEDD3DDACFC0D62A98BC52A7ACA45100B30CF9F0F662E2617C6DF144493F414992E49D622E7A774A83BD8F7685AB10C141945BDD21540CBCCFDFEB446C8CFA7BF48AE88520A20828820A20828820A20828820A208FFD9, '1', '2021-10-06 01:13:41', '1', '2021-10-06 01:13:41', b'0', 0); -INSERT INTO `inf_file` VALUES ('7e7ed694-2242-46cf-9ac9-0709debcc22f', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F00010000060301010000000000000000000001020308090A040607050BFFC40045100001020404040403060503030401050101020300040511060712210813314109225161147181233291A1B1F00A1542C1D116E1F1175262243363723443538292A3D3FFC4001E0101000006030100000000000000000000000203040506080107090AFFC4004A1100010204040306040405030304000309010211000304210512314106516107132271819108A1B1F01432C1D1234252E1F1091516243362435372923482A23654636473B2C2D2E2FFDA000C03010002110311003F00DB823E07E37221084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210844495A905D25BFB690844CEFE6FF54210EFE6FF00542112497249D4DCC2108421084210842108421084210842113E5CA72E5EDA37F8E5FDF584409B0BEFF48A832DD291CEC0EBEFCDF5EBBF28640BB163C9FEF589085292544591EA6D6BF4B5FDCFAC56D3E0CA9E9CC27213C81D4F958F9F571A341E5CB3721C380059B673BDD8731CDE2A458E1084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084211508960904681AF7BF95B5F4B1E5084574B4598062DBF27FBFD6112AB569240240DD76363A07DE20FE115B2A91552AEEE525D4740399D2DCBF6688173132C6656D70DCF9F266FB31F22AD52A5C8539D9BA9D45BA4531A429C5CDD4679A9461B084A965C3CE7921494252547D85ADB98EC7E10EC7B8DF896A648A0A3A899296B4F892859195D9EC92E6D6203EBD40B1565707565CA14A172C3C5E659F91DEEEC39FD98E958C8210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108472091A184239CEAE7F21FB4210CEAE7F21FB42110EB08421088E5E5CC3300431B1BFCB78437F97CADFDC7E9134CB0A3E005BA581FBF7F46844FE403CC77F99B6FBED6FDF5ED15D4B4D2759E82C7F5D3CB99312D4B63A86EBCDD9BEDA2522C76B588B8B7FBDE2EABC0E9EA249A893574F2128194CA5A996A624B817377673A989130CF529265964EF672FECDF4FDC0A13BAFEE807DB7EDD3DE28A51A1A75777328E6D5312EA96090AF23981B36DFB444813ED995ABB9B586CFAFD3D1E38DCF4955924F5B76DFEBDC7CBB7CE2399F839A3F8586D424AB474A8B7CCE9BBDB57D22AD92078943477D80E6E186D6FA189984B85603EA521A58F23F76CA49F42D825EB74370DF4E9DE2AE9F06A994B428D24FA94AD8A51282944B9B067B1DB4167E514B595D4D210E148CC0789209043EE087048D8027778F8188F155030AD2E72B38A71261DC3148A7A14E3F57AA54E5E9926B6D00A9612AAC392E5E7DB4A6EE352A9715E64D93B8BF7AF0376478971B4D954D478355C85CDCA04C9925612E6C1C91A97B73E4631556373D738A10A704E50C3AE8ED71D4FAF4C39713FE377C39E4E551FC17936AA8E7D63D712B97629F83A9D35352289A1E5287D6E332CE3AC078A10A7257982E53A5442AE77BBB25F80DA8C3ABD18F7194EA5460DDDA54135933F0E896B70439577799446621292A2ACB605A23AD99895553A134A16A5B87094662C5DCB316F3B6DA8D719189A77C48FC465A54DE65E269BE1B328DF70392385A96890A4D626245C3A4214B956CE255AD72CA50B3CAE595101C36B93B99832FB1CEC9E49A5C369B0EC42A24200354ACC24A272032932A5CDCBDE202B79A82EC08B1262EF81F0AE29882906AD0B0951B86B94B81A8D3676208763CA36E98F9A48BC42108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084220ABD8DAF7F6EBD601F6F942223EE8BDF57E5FEE7FE7AC5DB0E97DECC424B124E8767D2FA683CDFE72E62F20F9F3E71F16AF5594A6A983393723241D9E6245A13B50919353CB783250B65132FB4A7802EE9D0C852D4A0404F48ED2C1781AB3184A7F0D254B2AE492439DBCAD168A8AC6258F5D85AE370C6FD1C87F38FACCB9CFD2194F32CAD0A285254026FB39706CA041B84A4951162010445B389BB38C7B08AF932BF0B51967202F284A9D9CE819B661F48952F19932C142AEA0EC437E96D45D9FD220EA994874CC3C9939669402A6A710B956FA9B9097C36B2D8FEA780E5207996B4A45E333E12E08C4AB952E427876BA6A94C9EF3B898AD6DAB1F3E5789533192A0720241D033160CEFE4FE66DAC5A3673F1C1C2D70FB2B393398F9C182A4E6A4C2AF49A657A9D5BAB3853736453E93313D361574E9D2590ABED6E91B25C33F0ADC67C52BA7551E11554F256B96164D2AB280E09CCA32C8486DC9B5EFCA8D58954CCB0CE33F84000B6BF3D6FA90DAB5A30DB9A5E3998DB332A33185B820E1F31563DA8B5AE5CE39C4F4F7A428A92B5684BD2F2D507241364D8AC1725C822DB7511BCBC1FF00073C17C272696AF8CF15C32494A10A992066AA9CA5243AC034E998841D001372DF5D0C5C11C3788D600A4CA9AA0A4821C9D4FF00F262413BFB88B53ACF0A5C6D718B5194C49C5F67CD4F0FE1C9D77E28E5960B9B5C9372D2AA21486DF320C8A682E216B6D6A6DDF883A41755F723B0AAF8EBB24ECAA9552B85B04A2995F2E5A909ACAD44A9EB4AC064AA5497325C1018AE5121FCDB28C2BB37AA9EA419C9233105920816D9DF30DF768BF0C8EE0BF20F8799368605C074772A9A5297B11D7E5FF9DE2075570A594CFD50CE3AC05AD216A32EB6D414949490018D6CE39F8A3C7F1C136827D49FC1296549968968952F30709509729284000288484A40625AD68ED9C13812550E55CC940A7280330727A9D49767BBBF9978BA179B43EE36E3A5C77960250DA96A406D23601B79B29984240E890E04F416D3B46B571071662FC43316B935535282E4E559763B6A412F6BDC876BC671498452D390532D296DC02038D7A9F5043EA2D196B8F39A359E10842108472C59D8B736B4211C42108E1C0D481EB08E424A8B00E758383A107D6111776BFE931CC221208B1041E4434211C421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210844FA64A1535216404B13736D3CC6CF68422EB488EEEB652DC89799249B652971FCCDA33D9C68363149521652A604EA18027CB47EAFD4C625BC5C723736F34723E9B8F3237165728998792932D6366E9347985A65F12B5499D1565C8CC36DA4F3C99664B6B6C282F962CAB01B7AB3F06F3F82D788AA931B46175B2314A29B874F4D57773275209F2D72D3574B98B267C852FBC43A54E5094B125A30AC5513D63324AE5996B4A859401662525C12411B0EBCA30FF971E355C7267261D96C0D923C35E1EC458FB0B48B185F16E209F76B084532B72290C3D3EEF2AB92D4F4321A532A53B32CA91F109790547416D3E8AE3FD8076514C8A7C671E453FE025C84CC975264CC5A97241514B8949695308BF8C0D4280CACF434D4D555F34264CB54D597040D417DAF717F4D1C398E3629CBDF168E294A3FEAFF001308CAFC3D308D350C3F8585065FE124661453CB96769B2AE551D23ED1A438265C46A410E950044758278E3B01E0D99512704E15A4C5AA24A9A5CD9D3545495CBD1D14F325F81447882939D9F48EC8C2B81714A8085CEA69D2D0C03E420176772A04380C5DEFBC7A4657F850E436199D93ABE6AD471667463169497E4EA789EBCFCDD2A6A6894AD7F1EC535C937DA6CB801B3EB6FCAA56E77B6198F7C54CC41A9918149A6C1E42D16A4A7A7932D29CB982405AD0A9C40D0BCD2ED7711D9185F673256941328A9682E4A9C9DB51A1E5616776D6322984F2FF000565F4A269383F0A50B0E372C005FF002FA7CB043A027484879A4A94AB04DBFF0070A8DEE4C6AD711FC41714E25327A27D5CD9C95AD6C01CB636E439FD3AB763D260326484215283CB64B650C7EF41B8BBEC63B8216B492541B0A2AB8E5EA29D2474F3A945245B74936171B474A62DC5F598B2D73271984A8A9F34C2F76D03F5DB5BF98CA6969A9E404E5969040B823CDC8DC17D0F2F5894BAF29C21441458FA1DEFB1EFEFFAFA88C726AD53D254A5BEAC1459B721CB3916BBF9022D1799425D4112C808BBB1D1B40C771EBD62205FB81F389B49884CA4494A40507E6003EFAFDDEF1CAE86503AA6E4DAD66B336A2FADFDEC632CF1A4B1A6708E589D013E9084710844495149D6DA11B31D7EC5E114352AF72771D08FF1FF003138CC9440694C7CCEDD0F3D75D5E2320100A41F262DEFF7D22AA557B5ED7F98DFF3FF001F8440552BFF006CEFB9F931F38965209B8BEFB7BFDBFD22722D6DC6FD81BFE5FDC7D7B47227207E49794F32EC47BEBED10A501249737B31D9BF7D6211C9A8984310961D0FEF11C220F14D50B5DAE76B6E790FBBC21101052483A88423884210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210881DC1B6C6108A69D8D8DC9D477DEDB03E9DCFBF51192D34AEFA95CD94948B96723A73DBD75E9C10E18EF1C09E93969C42E548626989B4028947920B73AABF2A6E9F300A86A4CC3295A2D704A5D0047737635C62384F1F913D73D484A26A4FF00DC22C08D7C4346BBBBC63D88CA5942B32772E4E87FA4860DA37507D23536E2E328EA5E183C7949E7E61C6A651C387129539695C6549916D69A7E0FAD545628F55176C28309698E4D49B2EDFED5E51B9B587BA7D9DF68749DB5765D3B8724D449FF0075C2E8E6990AEF1E655D2212A9AB92015052E7CB26628285F294218B5ED78056270DC6A48984649B352EE2C9512003C8025BD5DE32C9469A97AA5269F52909895A8CBD49845429D392CB438DBD2334C34EB485290A29296DA216371F68B73BDC0D02ED3785EAFB3DC4AA27CC1353DECC5AC851533936D49362082C6C760E6377B87E6C8ACC2E5652851EED2EC13FD20B160E0B333FEB1F40A9B6946E4B6E7F572FF4D81E87A743D7AC74C1AC388054FCC6EE3522E5DBE5CFA5B78989989A39A52964DD8369736BB30D85C72BEA623D62C539CA9D4DA93A726BDC9DB7B4579493E2045C3FCBD8BF3B42282697BF33FA1FB31104060EEFBE9FB4224C4FA74B2887760E3DC06DED08456465A234DE34BE11594E9CC85076F11DB98108828E917B5F7B4552684CE3605F4F08E6D7207203F71BC20B75252404807D77B7B837B6DFDEDBDA27A7079997BCC8A294DC862E5AE47DF58840626E4F20768E2B6F357F3B8DB9D7642C3205ADB12BE67E37EA378ACA31214BCA680962416D75DDC1F2160C3AC40BAA484B25402858E6208F326DBDADF28E40765C2482D2D02F70EFC730B491DEE0320DC74B5FF48BA4FA7A612DD386AB3358EEFB91E1161BFE9146AAC5851CCB9447FE285076D812A53F9DEDD6D12A17AD4742D2B6EDB1093A811616D7A8A4FAEC05FAFCACC8A34572E64B974A65292097B9075DD868FA8D34F3994F52272D412DA17DF4D0FCF660DCA2AC5AEB30F9B4AB21414403CAE3F7DED63E7BD6C220A340528BEAE1873637BFDBB421126A401396DD3E8DFA4211221084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084211C80E586F1C12C09E512936FF001D6FBF61EBEF7DFD3A45DA9EBD32A5E460469B8366BFB0F6E45C4722EDD79DA264A1B5202B40D41E4CC03DC3CD690DB80FAA4211B7DD36F3024989332AEA25CC13A4A88162081A39BE9766362F147572028124396B7273762795DF4BEC748B3EE3A3860A2F17FC38E60E5454E4E51EAE4C51EAB55C2F54994053F4DC452322A9AA10957016F4AA76A8C312EE137BA0D9206E637EFE0CFB61A9E15E21A5A6ACAA250AA900852D82D07205A0B9365A5D2A61B9F21865652AA4D4A6A00395252EC086209BBF4B68469CA3009E19D9C589A66878DF871CCD7669BCD3C8D9C5D326252A0A29A84FD05B9A9812DF64B09594B6865F20A517E529B2491631E8DFC4B703CBE34C06471060B244CA3AEA54D4489B2D04A338493325E6BF892A752AE2CA1A3DFBDFB39E374A932A8A64C7520996B054091A0B0DADBF327CE32B096103CF2EB53CA7505EB38012D1171CB02DEA075F5F5BC799C696661B513A8677826233272F54921DB727A359F431DED329FF00192913A5BA92482481CDB71D074D0ECD14FF007E91669EE165DF5DEF7DEE0795CDA2ED2E532120A4B8006FB795A114131DAFABDECDB188FBB1FD27E708931325A7293621C75E639C2113632D2B1A5370413E96DBF1BFB88D384256BBA50A239B758D2D4AB3683F57F28A682A735E84EB2D8D4E2527CE11DB968DCB8A363E5041E9BEF715B48898A5096949CCA25831726CEE1EDB35BFBF330F760155B35927519B928FF2EA39BED12BB32CCAB5CE7D4DB6DA81239CE064A103EF178A81E4B82D7436AB972CA008D378EE7E0EECF719C7A6CA44AA49A3BC20056451FCCD7D3AF97D0582B71C452139924B1E6D71A8EBCF5F4D231CBC50F8AC7063C27CD2E8B8F332256AD8D2CBD18270FAA5E72B6A52076652FAD691AB62A2C900EFA760237D7B32F817E23E32A597884C9B364D2CAEECCE3DC152121434592A4B3E52CFA81E71609DC6D2659CA24B920B0CCC6DAD9AF7B4611334FF008A23084AD4E764329F878AC56E5A5E6552AC54EB98A996913001584BC8926B0EA14A4D93A8A7E26E01EA7AC6E6F0E7FA75F0E144935D3A9E44C54A4AC04D389AB52AD69802D3DD12FBB8D7CCD895C6414559242AC4B1D12CFB162F76622C5CE81E3CBF0AFF0014762C72AC246BDC39526ACD36FAD335274AC4AA93A832C972C95042E933A5C7143709084D8EDDE332AEFF004E6E11452A946A6466C80A40A6042944071FF70650347F10205AF6347338C5811DCB925FF36E6FAB3BB746F28CA670E9E3F5C256714FD3E898FA9988724AAD3BCB495E2E986D74665C71C4B60B93EE485312DA14B58B38524588DAC45B5B7B4CF808FF006AA2993387A4A664E965456BA593DE3A4256A2494D982439E57B98ADC2B8D25A66ABBC9590286AB55F5661E762CFA9D088CDCE1BC5748C6147A7622C2F3B255FC395B61A9AA1E20A54E373B47AA4B3E90E34E313CC853575A085048D66FB5FBC799DDAA7633C41C233A6A6652CE5A25A94EB32D490C017B5C90C2DD3CA337A5E219152C026E58BBD86E0DACDA797D3B1A545574E85A5C6D650F21692808B7F521476753EE026DF2DE35C44A5D34D299A322C29563AEA41243588B5BF7117E95384D19980490E920E672CECC006F47BDA220DFD3A91B1B8D891D47EC748B7549067288B8B7D2277F6D6D11891084459490FF6DBFDFD94221842108421084210842108421084210842108421084210842108421084210842108421084211C80352E12F72DA08440DC7417B75EDFDBE71528954EA01E7804BDADA738020BDFEFAEE3D8BC4BACF4D26FE9FB1F388674B9281E09BDE13C886FA7ED1CB00097B8D86FAE9E81FD62A00A209234DBD4C5366161ABF2BC40A5650E0666B16DA21B800916045F7FDFEF6F58AA912E44C0AEF270411602DAFAEBC8F2F680513B36FAFF6F6E6D10B82091BDBF7F389ABA7A64FE5A90BF261F7F41CE228883700FA8BC51A800A20170343F7CB47DE10886108E41620F28E08704738811716FD88E23901801C834453E516EB7D8F6FDFE715D22AA5CB9650B979B563EAE03EBD3CA38580B7CD7E56D2CCFF00AEDB44A90D05A12FA8995E6954DA124256439A532802883D6606D706DD6C40B9CE7B3AC46752F12D2CEA72A90942D2B241B780E620DC3381E57B03A45A311A54CC90B940A42969396EC6D7530BE83DC0D63555F13BCB9A8F05FC7565171858692AA560ECE7AA230C660265D854BC8A669130CCA3CF3EEA565A587E42725D2942D092DB8971C2A5870253EF5FC3A71E5376A1D9AE29C3F52906AB09A7993A95130E72B08927F1465B870D2E5A5459C17EB18FF0E53CEC271697384E2B42960283B017748373A9376219A32734CA9355191A555D975B5C954D69AB4ABCCAB5A6764DB969579F690011A0252E03CCBAD24AFEE009223CFDED2307550714E27396932E5A674E4A506DFCC599B61CF56F68DD4E15C7D153432E52A51CC94B024B87CA003A0D5F9DAD1CC26E49F537FC7F0FD23A926D4BA8802C145B968DABBF4FDCC6582A125D927DEFF40CFB6BF2884532A666770CEDBF289A8585E9089711C2108CB24D3A86D2A2A5001B5A5B593BE97156D293B920AB526DEB7B5EF1AC7493A9414C9080E47874D09D7401DEDFE234991532D049D589BE9A5AFAD8730F770C23A0E3CCCAC1D957862B18CB306B9218630A61E61C9EAD5627A6512CECB32D214E284AA9CB25C7D484A8A504A4FDDDCDE364BB1BEC5EB38E712A6AC9348B5C83350804214A49398170183BB80C5F6E822C18D6372E428212A00643A96D6DCBCEECFF0048D287C517C77B32B36F13E23CA4E186AD3B82B2BDA5AA9950C4CC3CA35AC46C6B799717A99E52132AF3772B297147CC9DF68F78BE1FFE10B02C370EA2AFC630F973EA3BB44C452F761225901242A728A4B31FFD3CB71A2E3AAF16C5D73A6108532492EA7B9F27F2F97531AD6572BB5BAF4F38FD42B5529A54C3AB989B9D9A79C9E9A989859D44E9756149495137FB5B017D8F7F41F06E0AC1B094211365C9414CB44B4CB9684CB9694A410004BDB61BFD41C745490080E6CDAD9F7D9C3EFCFD8C64C7C2FF00C32737FC47F3819C1D8710FC8E5D61F769CF66AE36984AD12B457E78AD729234A7D29E5A9D9E665AA0B652B582532AA246D1912B06A1A2654B4A4380583311ABBF2B0F668B6CCAA5DD24DD8EA5AD6B336FB10469611FA207099E0C7C0AF0A78768F4BA264AE15C6F8A25D86DB9CC5F8C2892D51A9BB34020BB3A667524596EA0A994149D29510567A981A9EA3C0A0188003B68DEBCF47DAED78A29B52A21C96670A00DBABDBA5AD7D7CEF8B197063C3363CA42A8F8B72672EEBD4D6DB29665E670DC9B4C36396A67C8940D63430B712DAF59D2A29558DAD1455FC17836292BBBA992950591A01770437270090DE9CE29C622BA72E9043DDC9361CCB0B7EB189CCD2E0F717702B3F53CD7E0D8D6AB593F3532F4E664F0F9539C76A529274D0E17EB55BC245B69B14F4D325D0FD46525CCA3C34B4941753BAA34DBE24FE18B87F17E1FAEADA6A296A9A69D6A49125254C997E101BFA58061B87F2CAF05E21525694A97A91A1606E0EE4F91B7CB4BB9CB4CC7C379BF822838EF05D55550A35728A5CA712A4A8D2A6A554B979EA6D54A55F673D28FB0FCB4C3640521D42C5B68F9B5ED93B25AEE19E24AC948A65CA9299EB0C94948090ABE83567E77B98EE9C0B1513D092EEEC1405C90D62EFCF53C847A2304F29A0A012BD09D601B8D7A415A8136BA54A2549FFC4FB46B857D02A454AE5A81494923996D6EE05F5F96968CC01CC01777BBE9AFEDA457208EA2D16F992B2E8180B33FDDF7E4768E621122108421084210842108421084210842108421084210842108421084210842108421084211015804DB4DDDBF4845449959C82438D4BFDDF9F26D621EF433B5BCFF00B3C2F6DFD378AF142A9A932D232BB31DB9E9E8C4BB9DA057983331569763F7CE097D2A04A54921240277D89F5E9126660F3901F338BBB0D1B5D7EFAC4B34AB07F3A8137607D76F9444DCDEE3AEFF0043FDBB44CA7C34158135795208DB5F5058F5F5D221EEE60F0855FAFCC92FF43AC4AB0A08240569FEA3DADFBF6B6FEF179381D34F4BC9580503C4C41E7E5AB723689D27F332C872EC34274E5CB71D6FA344A9D66E6C6D6BDCF44F7BF7B0DFFB768A19D82A500E59C333B070E3DDC7E9CC44E3945B3026D6D1F5B0E677F28AC90B02E1371DCDBAEC3F7F58903029F32E9989200D5881D776BFE9AC40540753CBF7E51245AA74A54898B94BFCC82527AB59E2205C03CC3C225C21084210842114B58F886DB5A0A9B1CB5382D70E05B9A1BDEFB09758E728906C937B0EF97F0E4DFC1257581B3A7300C6F74FCC870E1F66D629AA4781F2924050059C0B5DCB86CCE0462C3C65724D19D3C0DE67CB3A944DD5F01CB3D8BF0E16D1AE624DCA234AA8CCBCD28F9D097D0C34D5D3FD4C9DCEC23D36FF004F9E3A9838A1587CE9AC99B3E63A0A892B42800A4905DD2A4B823A9058968C76988154DE27705FCCEBA16BF4B74044590F87B6613B995C2565156A69D5CD56E8B26F618AA4E3CBD69667245D409D0FA89BA54A957A502924DEC81DAD6EC8F8BCE19A7E1DC76AA6524B299752B339194312263A880CDB96E6D62F1B1FC1554D22592C090010DCB53A33F2EB7D418BCB3D4F4EA7A74FA7B7A468F041201259C3DC73F58ED244D3AE80805CEFD086B7BF3E5108777D7E5FDE2B654C09DC17DFA9E8F6D3D37E88E148CA1DF5E8DCFF0068AB4AC2B4E57F97EF0882228CABCE16DBFF00D73B32DC8B0861C616F4C2ACCC9A582B7A66A13248F2A1965C4AF5764B67CC3B751F643D9D5671A6334F462495A7BF77082A073252004B0D2CF73AB9D75D0AAF9A64B9CCE6F62430040D36EBD75F2D0FFC707C52710F10398F5CE1D7292BAE7FD1BC1B55758C413B4F9A534711D592A0C541F438D2B42E496DCB32C2028AACB43BB0EDF46DF08DF0E949C13C35455F5F448556CD22A2953364248944A53926AB33292A494920338B17731D57C4156A9B50A4A56486655C39E637B0E6E5892DD75CC0E294DA92A6FE1895950972BE6ACA36D2B71CB24DF75586937F58F4CB0BA69384D025084244C291994078896F5F5FD230D9CA52CB3800D85AC06970FB7DE9695282E292817256A0800752544016F7DE2D53A8AB2BA699A952B2A1454C1F4776B72DFEB13A54ACC924DB28E409FF001E47773BC7EA6FFC3FDC2C61CE1DBC39B256A32B20C3788B38B0C51334B115614CA5152985D769A99DA7D39F5DB5AC53933B34DA35AFC9CC20246A317112A655242092484949BE9B6B7E5BF5D358B74D925CAB53C8727D75E6436FADA339127284B2D2DC74AD6A4056E9B286C2C93B9B691B5FEB6BC4B4E16A924AC28050D6E46F716B9BD87DB514C96924D806E8DB96BFDDA3E838D5D011AF4EAB017EFB5ED6BF5B7CE26A8D42C77685293DDDC90ECC39DC587CA28A653898921EE3700797A8766FDA3AF54687233327372932CB532998977DB5CB3E84A99984BADA92A65D06E9E5BA096D7706E851041E865D7D18C7B0E9D87D534C4290A490A16636D0BF9D8BB599C08829C2A9E6A402480C4598F4B8361766FA6B1ADFE526246F86BF10FCF8E0ED15112B8533265A5738B2BA9732AD2891AFD525A9F51C534BA7B57D09A73530E56E6101AD23426E509DC8F1AFE377B12A2E1FA2ACC6D146801A62FBC44A17CC933029652FCEC4E9A79F7070C5794776E45D817360469D75B1F6DE32B1A349B9042AE42EE2C39A9252E948EC953816A47FE047BC7815C47290BC4AA9494B253354966FE82DA1BD88F23CDE3B9E8661994E8512E4871B3FB6DB73F9435EAF2FFDBEDD7EBEDFBBC6213D000D1ED63A9163FAE9156033F5DB61E508B54730842108421084210842108421084210842108421084210842108421084210842108422242731676FF00205BADFDA28272C8594B5B5F573D2117DA296094B00A1A03A03BBB31DF9BF5E465779D3E7FDA20A525092A528A529054A501A8A401724276D440DC0B8B9DA332C3B099B5F36548A74A95327282101092A24A8848B80589275D1E38554A6482B53654392E761ABDADA6BB34790668678E5464DD25755CD2C7587308D292D17C3F55A9B01F521214A24C89525C3B0FBBACFE368D91E03F869E28E2B5CB4A696A5417909FE12D4121577D183F561637D445B26F13D32092932C120A5C3055AD6BE9D6DC9C02D18FAC4BE365E1DF85A6DD929CCE2929F536E9639D214A6D52C4A7FA9A26747937201B0B9BED1B172BFD3DF8D2BA9C4CA6C3EA56A290ACA896DB6CEDE7CAF7D18D9AA78BA9E5803BD272BB15A9CBBBB390E481ABD847AB65478A670339C35993A5611CF5C38AAB4D8024E4EAE19A6A02DD2004A9F334E849510906E9EDE9B46118CFC0EF1CF0DCA9AA9D4159E2709CB256A2181D9398BDEFCF48974DC5F2EA4AC256924725358D8824DC686ECCFE76BF192AED32A94F6EB3489DA3D425E7480CCE532A08AA3136950D490C3CD2121BD5D6E76B6C235478FBB18E29E1A9B34CEA6AA09959BF32169208BB9B3B80EE0B737D1AF94D8BF7A52010F66BF26B31D5DF979B3C7D7438B99681374150DEE6DBEFD0EDFEFEB1D1B35389504C5217F884149218BBB827672C0B5CB73EB17D94B331399811D2EFA6C3CFD3AC5609D2026E55A45AE7A9B77FAC5B264C5CD5AA62C92A5172FAFAF5E71562C03F288C411CC21084210842291F2BE8737B04DBF32477BFE47F18BB505412052B3898A6D1EC4DF96D667F944339FB85B6CE4DFA06D8E8770DEB1E3BC43D065B15E48E6F50E698130DD572E317C886880A05D98A34DB4DAAC76D94B041B5C6FDAF1BB5F09956BE17ED270BCAA2913932D44681D6A20821FF005E83A61C89853582C7F3366EAF7DDC020BBEFBD846B2DE11D5C99392398B84C927FD2B99B5861A6093E444E38C35603A0FFF0017A7B778DF8F8C897F8FC428122FDF6134D5414392FBC1AF4CAEFB9B35ADDF1C17519A4CBD1DC020EFE5D5F43CF668CB4479E4A9241286163940276E96376DADE71DC32A6121373A0F22390F4D2DD6110F766E19C0E7A6FA3F9B721A5A2BA5AF301AEE41DF58449A84B240218A4E80D8DD9E2E14CA398A6CECC4F36DC422922B23E178D9F17935C2AF0818965F0AD4E624B32B3464A6B0BE1D98979A32CFB54D9D6BE0AAF5261E4283A8765A5A65443890157652014E916DDEFF004FBECE287159B49595F432E69CC95998B9799921293943A48CC6E120903335DDE3CD9C72B6727334C22E580243EA6FC9831BF9911F9C25467266A939393530753930B5A5D55C90E85BAECC28F4DD0A7E61E5D8F55AD67A9263E82387B0D451514B19085327C4ABAD59400092752C00E6C00168EB4AC9EB5CD27312391F7D01EA5FE778E1A1050A51161AEC16475568BE9076DF4DCD876B9F58C8CA94AB124DB4276F2DE284924B9F362E7EA7CFDF68E632E8967E56634EAE4BCD3A53FF00772DC42C8FADAC2262274C96190ACA34616F3D1BEC472662C2540288041702C0EBA8DE3F5C8F081CD2C3B9ADE1DBC2862DA14CA1128CE51E13A0D4E4C283C69F896528F248AAD397A2FC84C93E80D213B69D4404A7A454CB190029B12351D768B4AA6ADD5E32C4DC3D8B738C9FCB1525B4A1D480E2494AACABEB29362A27ADD46E6C45C5E261512083BFEEF1095920825C6CFA81B0D741CB6D2394E1BA536483E636EBE5D8D8FB1DEC7F5B4429480261DCA093D5AEC59B4D6FCA244D52865092C5C6DE7AF43F6FA470E614BD0BB69B86D5E43B6A2524E920F5076041DBAC51519589732623F302AF1004E5653A481B335BA81D627A91FC30A03C4DAB39E66E072258C6893E22DC4BD3E5BC7F32127B0756D2FA7071C3D80B10BAC39CB765CD7692D48CFD2F9A8513C83FCC9D65E6494A4A4AD2A4D898D69F89CC1A8B17ECDB1E56272454A95433D402C02954C492467CCE6CCE1DEE1ACD19370B4C9A6A129CCE01F26736B3D83FE84738DAC03A5EE9A8730735209B90DB9F68D26F73E54B6A4848EC9000B585BE4DFB56C29143C438AA6911DD4B1513825080C01EF09D9ACCC06DBC6C3E1CA50A79409D833ED67B68DD03EE2C2D11D3A763D7B9F5F7BF58E97A70B54C2959516D5CBB312ECFF4DC6D175413B926DF3FD37B44A2F7B7604837EB6B6DFAFF009EF795501215E1003BBD80BB9F7F3E7E7132268A7842108421084210842108421084210842108421084210842108421084210842108124036F436DBDBF7FDA2A6453CCA929972802A7B9DEE6DA5CF5897952661240717DB90D7F7DA292DCE5A52544DD6A0D25294DCEB7886DB51B90129694A0B593D12937BF7ED0E19E12ACC6572282992A3513141072824E626C2C2E58B7937A52D6AE5CB92A3605AECCFB0FAFB07D630B9C78788DE37C298EE83C25F071456F3138A9C7336DD2AF28E0345C16C3EFF21BAACF3AD3730A945CB235CCCCB818D61B45F736B7B05F08FF0009F22A25D1E37C5583CB9D4D29529495D4484CC99316485044A42C329B3254B24A4049719882074F71062D52852E5CB9EB009219C84D9FF31E476B5CED1E8FC3F780DE12C72993CD7F119C7D8A7890CD4AD25BAC4E526AD589D7B07E149878077F94CACAD41E7D13ACB0B245BE0D841BE92848DE3D8BE0DECC3867014A1386E0D4D440C944A5FE1E54B946621398B4D08480B3E220E627D8475CCDAEAA512553944B96BA8E537FCBEC2F6B6B17F156F042F0CEABE1F3499AE16B2F9B61682D2E72430ED1A995DD3A059C62A6CCA1782ECAF2AB5A4DF73EDDC48C170F93232269A58480080122DB36835636B3FCE286655D428879AA2483B9361AB07EB76D635CFF0013EFE196A4E12C27883383821AAD453354677E2EA1957594AE75C7295A1E79EFE52F075E6FE2590D14A161B68A750B1DE2D8BE1AC2E7A66AD54A0651FCBE1777D1872D47BEED558755AA5F7854B2F6377363FCBBF93927D235DFE12FC4FF008C2E04B158C2B278B6BB3384A97555CB55B2DB16CECEA69B28CCABA1A7E45EA7BC5F625665F4EA4B2032A2C7248DB546B4769DF0E5C1FC7D4F5B2D180C89752B4AC99F269E5AD73164165CC0420BBB9529C936B168BCD3633552E7272D428070C92A622FFCAC6EEFD00667777DE63808F124C92E3BB2F64EA981E6DDC3F99547916062DCB9ABBAC2E66993250034F353C5F52E7DA9CD330B963F0E8E6A1A5393225DC4B4DB9E15FC547C22E39D9F55D5575350934C5739525726593296259F180C12465702E901EE1EF1DBDC3F8D2A621089939401482A25442812465601F5DFC5D37719109399334842D29284A9295241595948236054A082AB0EAA2013D6DBD879BF5342AA3993A4CF9051325A8A541408292090400C7FB1E519FA2A25AE5856619983920024D9C8D407F38FAA84690751D5F3DEC07B9FCCC6315292262B224848D407B12778E33B90C6C5B6D5F96BFA7478A04DDC3626D73B76E9E90414849CC1D4D62FADAFFB83ABE913C0F0126E5DDF95D9A2788220842110006B0A201005AC7FC743FBE9175C2552D3500A920A8174A88D2DFBB1F488165C141FCA41717EA7C88B79C7C5C4F229A961DC432602344CD0EA4C2D0A48295A5C96712A4AD3B85055EC41DADB5A3643B1EC4AAD3C65844E97394858ABA6961492CC9135362D77B9E5AC6258A23BA9AE9606C5C58EA7705F560DB316D63524F0A843D2353E25E981C586E433567D4A6428F2D094CD3C52023A0D3BE9DB627DF7F5B3E26A8915381F0DD62E5833D5C39440CD6B96EF8DCF477B9B5DAF78EDCECF14A5E40A512925995B9E9AF4BF94663BAEFEBF48F34B12795316124BE6587D086FBF48EFE4212508B3002C3E9D1C7368459BBC5FF51E7AFDFB6917196125CB0D06C377844D98B52A5241BDF5E419FF005DF94562404FE5B6DA98453C45994773CB58D74FF89873BA7313711F95D935293EAFE4981B2F25E6A765D0E12A454AB55AAEA6610EB62C017251B9548513AB4E9DB611EE47FA7C70148A3E0D935EB97E2A89F2E524140007712E54E5282B7244D01B4D0F48F30B8867113160100A42947AE674BF2D9B5B1B6ED1AC53056865AE6274152494B5727949D6A4A51A8EEAD93AEE6C6EA23B47A8D3A522494CB400025212C2CCDCF4BDFF00BC6066667274606FE77789D4AD42D6B6F7EBFED126110510A001B8006F63BDB6BFE90810E08E61A36B4FE1E1F18AC39C25D55FE13B3E2BAE48651632A99AA612C513CF38E53F0954A69E48765E70ACFD8A2643E82A08D69499717E80C578D07908B71483A8DEFB7BEF1FA0EE12C7D84F18D1E5712612AD5371361FAB2133F2558A14FB351927E5E6ECEB4FA48712FA50B4282820B29D17D361DB9F46FBD638CBAB004B921C580FECD1DAA6EB52D28CA9D7961080DA9E0E00E14F293F7493A079964A4580B00A3BED1CB7F0E6916210A62CE1F7F97D625CD466CA00D54010031DCB8BFDDBA88C417895F8B1E49702593788ABF5CC4B213F9A73F4FA9C960EC094F9F969AABBF539995986693507D8967DC7A5E5197D4CCCBCB7101686C28F2CD8034D87247E126A9475CEE79DCE836E7EFE95C6514CA7B3117D7C9BD4307E863F39EE1AF31F317895F11ACBBCCBC635176BB8BF3033BA8B8B6649042993395965C769CD383CCE4B53244A9D6DD524297F0C905B48248D70F893C424C8ECD3880949294E1B5054B0CE8374A4B13FCEB64D8D8289170D17EE1796915492080730B36A4060E4793E81F9EB1FA7053D85CB25942D5AD6D4ACAB2AD5BF99A966907724DC8D36B9E9E91F29BDA75548A9C57129BE1635338D88DA6AC3316E5B01D3731B05463F832C0B30FE57BDBCC3E9FB5AD1CE70DD57B761F8EFFAC74225483357959DF6D72937D1F6E9E80697397A9D45B7F3DFE71407DE55B6E9DBE57FC7F3EBE916CAAFFBA5B460DCB53136278A6842108421084210842108421084210842108421084210842108421084210842108993A54AD0490AE52962C2F7D24DEFEC122F7F6B7A45CB099FF87AB44C37495841D6CE017D3CFDE244D59439B245AFCC373B6F6D74E66D1615E23DC5B49F075C2AE3FCD6626A5DBC4F3126E61FC172B30A08F8DACD50269C9750E00A71B5C999BF89416D0A512D0074DEE3D20F841ECC6A38DB8D30C5FE1953A9BF152664C640565928295CD5B16072A12B56AE74E4630BC771212A5AD94C729CA3472CC2CC2CEDE641F38C7F7F0CA70E4ACC9C2F9BBC7B66DCBAF10E6766B63FAFD1B0DD62B0CFC43F254095A748FC5B94F997F5BA96DD7662A124129D0121AD43CC6C3E9C383781306E1EE1FC2E9A4D3CB94A972501084A06601878CF86EB5125CDF4CB7023A6715AEEF262813E2510E59C5CED72036B6BB5D89D36E51470E34D32FAD33086957487D943AD6806E94A585DDB4A80000700BF4BF6B67E8912245929003B8B00A7F30FD3CA31E5E562029C10406705C6A1FD9F48FAA25006424E97AC494F38056956C2E8041081600694D8003A5A2298A0B0A01094B800336BD6DF3B9FAC52CC3A1F3D874DB48F873F467E698790660B4B7016398D80AD32CF022612126C2EA096C2556051BE9EA6244A94405CB2582C8DCDD9C33076D7D7CF5972CAD2E017059BAB3907D3AFD05BF372FE270E0AF0EF0F5C624866EE10A44BD270867A4A556BD59A636D2053958B6526251C9FA8CBB2072922ABFCC82CCA0436D491964F2357315A66CBA9A5C1A5F7EA405E662A0525F7B1046A092CEF1512D531335C9B6847EC6FE567D3578C0C70D3C48663F0A79A18533432D310D5E9556A3CFA5CA9309A84D2E4EB34D0B42BE0AACD15944DB2A4A2CA2F36E95AACB502A488E9CED13B3BC17B5DA2ADA1AAC3E9A689D22684AE64A4AA64B59493990A5A5C3DC162C4B1D4465F87629324196D30A7291BD95B31BB68CDEB60E1BF4A5E0238CDC0DC6A70F58433770CCC49B35B72972F2D8EA84CB9E7A262465A422A32F2A8202DC9144D22650D3CB432484B7F6635587CDB7C4FFC35D7701F18712F7744A95492EAE72E4A8206554952D6A429243A4023290E5D88700C76A6118D77E99633853B0D6C08DB9E85DDB5B45EECB3E5D970FDFECDE515360D82C364F90AD276495274A8004FB6DBC79E35F469A7A99B2169CAA4A8820F47BF3BB68DA18CF698F789045ADA6CE43BDBDAE2FAF58AA079B55F7DFF000E83FB7CE31FA8484CC2069EDA74FBF95EA492C0727F7789E2447108420ADDB206C6E77FA7EFDBD62AA842BF152C8D2CFEE7EFCDB918814EFD0254FD1C16F7FD23E7D4965BA3D4544836937CA947FED2D2811F203A8B7AF5DC1D8AEC61C7166119BFFDF69F7FFF008A1CFB35F95B68C4F15FFBC860C1DC3EACE34E572F668D487C2E2FFEBBE2CD03CECCC667CF00BE9A15F113009481B13BF7E84C7B2DF11CA95FF15E1B040FFF0067A8D86A481DE9773CEC0E9666BC76BF6761CA741767035D1FA79FF88CC3A93A075BD81ED6E9FBF48F2EB1663394DA15ADADD7972E9CA36165FE44F94489248B9F5FF11645000B0E5FBC57CBDFD3F589A2357FDB479FFF00E222B2112A11A86F8FA2A61EF116CD7F8A4287C3D3F0DCAB416A0A0CB7F0DAE5C36029574BAFB8E005174A557D453631F461F01E8454766B87CEA719A4CA9B366A94001734D4EFB87B252EDD23CB4E270B4CC9A4921C33E8D73AB585F5D4FEB852056E152C8D94ABA45C6C90026C37E9704FB5ED1B9F2ABA4D5CC9DDDAF3144C2820BB82ECDA6DE7BC60F48ACC955DCE67F4D3EC40A48DC88AC4CB5AEE90F157108196A4EA3DBEFE908A8A5A9296594A9B5CBAD84A9F66CA423E2125252B52C23587507514A9BD4012AF36E22789C860EF61CA38EE147407E4797DFB7AE453859F156E37B84593628F94B9E98B9BC3AC329699C338994C5768B26DA7492CC90A8AE7D68641012D37CA6D2DA0694A520DA1DF23AFCFF687E1D77B1E9616F9FDFCA2EDF31BF889FC4C330A82F501DCD795C3D24F4B99375541A0D1A4279D4A9050B509F95916266512412B4BB2CEA5E4B81200092A22A64A84C4CE4A43954B20381AB8DCE9AC4999216921405C313B3A6FAED63BEBEF186ECC2CCBC7D9AD89A7319665E2FAE63DC415175C7DFAEE21AD54EAB5F9571D24AE5E4AA35079D7DB92255CB54BA6650DFC39E572CA7CB16B33E5D052CD97395956A0B012937054AB5C7D91CAD1397365AA5F77FCC5218368C2EDA5BDB95E3315FC3FF9033F9C7C79615C58F49BCEE1FCAEA05671954A6CA52A949279B949FA5D34BA4AAC56E4EBF2A86DB692E3A0AD2EA921B05C4E8AFC61717D3E07D95E3A99F552E5FE2A44F904120AD484CB54D4A5201CC06748753072E1F6395F0B51CCFC44B594380336D72E3D1C0E6413D748FD0EA58ABEFA9455A8ABCD7D942FB6DF976B5AC7A6DF2C3C538DFF00B955D6AE4954C0AA9A8208D6F315CEFF00DFA391DE7492D4254BF0B0B72D585BD79FED1C85904EDE96FCCC6094C99A998553028073A91A72B16317048235163F5FBFBD629D8EABF6B9BFE000FCE21A90E429F98F3B9D3C837CCC4713452C2108421084210842108440903A9B4210041E97FC0FEB68316762DCF6844610888049B08E0902E610208EB0041D21108E610842108421084210842108440AD4D942D2D9513CE6B620795C975807A816D6A03CD6DF71B6E2FF004B228A68A144A98F55327212B961C162A606E189361AF40F1435CB08965FF294E63B1CC0B01EC1DF6F38D3C3F8A0F3927D998C94C91929C537212B2A8C5351924A9612F4F4FD46724980F1166CFC3A5B6267515142529BDEE081F473FE9C3C0387D3E094B8A55CA972EA57202BBC29752410A0438048EF12E92E7425CB061D41C4756095B1163A6BA69736D6E4BD86CF1B007F0D366050719786565452688B9555430756F1461BAFCBCA2521F91ADB7569BAB3827084A4EB7E9751905A57A94DADB75094A8A8148F5F2A27833E549A7F14B9210124386012FA300C19F9FD63AAAAA62953924E85403826C1F90BDF9799D4131B0C34FA145B0370B0AD2373AB47DE3D3600DC6FD77B036B45610B37CA03B3B9DC8DEDCCF96D6DA5AB29D1F9F4275DCFE91C852D035592A2ABDEC3E5EE40E9EFF58890145EE9037D4F3D989FDFE929692A660ED7D5B9347CC7275925C0B250A6D362DAD41255AAF7500090426C2E6F617173B8B4D989C892B749510E3A14870C4B6BC816717244474F2AE41B01A1E7A92CE03B5BA1EAD7D18FF8BBB1961D5D5786FC0CEADB7EB32CCE259D532563E2A5D970D092DBCB4121C2CA88202C02D9B1B288B18B752CA975B5193123DD49CDA90F606EE2FD18EFE6F15F2E5CB6770FA12D6035D1B5F73A794693201698E7B6EA14F3CAE5AE59492A536D9FEB2549D1B586C95157A6D1578CAB0FC16405E05304E9A43148046BAB93E77B9D40F3E16E2E0D9DBFBF97F8BDE33AFE045C6D4E70DDC51D172971254D3FF4D7399E56139E71F7969A66199E9971BA849559C973E65393B35229930B9665E712A9DBBA10DEB58D0BF8BAECB29F8AB822BF1AA697295898C3D73E7CB5A56A99316A081DDA08429399398B66284324DC1201CBB87B114226CA4155F380AB8649626E753A36E5D88B1263F429712C89979A61485A109974256DA8299529B68257CA522E85252A05374F955D52542C63E587B4BC1EBF01E2BAEA3A89264A935335013A394AD419AE188040E40477DE1539132421492E08076E5B0D869CB7B36B505C24156D6B0BFE9D3DAD1D775685A56952C315005BF5F5E5B45C0AAE07325FE67E67EF9453E6E9BFE5FAC524090358748473AC414404D8F53AADF808BCE132D3DE77930003F95D892DBB7420EACF66EB094952AC1CE520F47763F51BC7C1C4EFA65F0CD79C2A09535489E741BD800DCBB8A2A247A0DEC0827B46C376254D3311E36C26928D39E68AA9134A458E513439B1E874E42313C70192B0B5B0043004E97BBF262395F58D4B7C2957F113FC4D546C541FCD09E710E69235B6B9B994B6A04F40A536B1BEFE5DC0045FD71F89AAA12304E1DA252DA7CBE1DA24AD1C940CD7D35235B58FA34769F6673133CA3BA72CA0E0EDA077E4E35D6CC63316B3A80037363EDB903E91E6AE2293366A8A468B53FA98D8947E50FAFF0078A69040DFD7FC459A62160DD26C1B6D6F15C8DFD3EFE713417F9123706FEC3F68AD009D2112A39C8AE5F31FBC6B5BFC4959293D8578B9C0D9A4C53DD670FE62606A731519C505043B59A1D5AB2E3CA2A2AB95094764C7C82447BD9FE9C5C6D4B51D9DC8C297350152D4165C87509B2254B091AB5D0E7A5F58F3278BE95CACB06208D18D8A8D980F61FB46B57CEE5A83695EB4A755943B8E62BE43F1FD23D0B451A28A7CEC8434D98A592E2E4DDFCAC1BD6DA475A53CBC8953867516E7EEE77FF11CA26E807D6DFBFC445F29D7952E1BCDF99E9F7789F14E219AB37D1DFE675F6E5A73D842114D1CFE2903FA8741A7D6F0843F168E6BF6FEF1239D07CFFB18953A6AE5CB59964F785242403725C37CFEF588913133C94A7313637E4FE71C995A6CF4F3CCB124C97DF9871B6589746EB79E7561B69A4FA95AD4948EF73D7BC627553A6D252555762CB32A54B94B5669849484A743A9D0072C09DFCA3958795CD0A4A4963A1536AF63A077B6BD5A3F41CF012E08A7F864E1B99CC6C6545FE538E739C1AC4C2669A099C93A126589A7C8254429486A69A95969CD09504A8BBA88B931E0CFC7976F52B12C46AF86E96A52BA294A54840490C52A27328B7E6CC492333A8021240668ED7E1AA254B420E5736B5AD70C2F63943FA69B88CF280802C84942412024DEE3737EBBD89B91EC4478D756A93DF4C54850295A94B600B3A9449FAF93EF1D9D252532D20F9FD3E87D62316F9AAB126CFAB72FB689B08A098B0A7DF603975FF10844984210842108421084535024FDDBFBEAF4EFD47E1EF1588952B2A54A372013AB071F7FA4226009B5D23F1B9FD0FEB102BB80E01162C0B39FA5C75F9BC227D27FED3F844A3325B6A0F4FBB420411D411F3820CA53955883B39047A3B75D3A6F088454265D3AC7B86757D0DF4842E4F5378A79A84CB5654B33025B997FD1A108970842108421084210842108422520907D01246FE88BDFD8DFFE7AC5DF0341FF0075C396C1BF132EE6F70AFF00163E6D141884B0A92A24EC4F930219FADB6D4346887FC4CAFCEAF8AEC0ACAD0F3E0E07A5069B48251C81569CF8ED7E84CA73436AB850558820EF1F50FF00008B4FFC0E926BA33212942C921C20CB4E501CBB39BB753B3C748F1120898B4904D981D77E5D430058ED73AC73FF00877BC50F0FF0499C95BC98CE1AFBD49C96CE6A8D3A625EB69716E5170C632D4CD365E726DC1AD1292932CC9D2A56717A741E5BA5C17D4A3E97D1A02E6A948B8CAEE1DC11772FB696D35F4EBA9D2CE77BB82EDB10496F3DC1BFCAF1FA44E18C6341C634762B3862A74FA9D067A465A6E995B9175B7A5E7989C4F312A977104821614149D2075F58BA051D4BEBA13A91B9BF9368FE912F22B97CC7EF1D9DAA830F21B080A4AAC752549F30B6C4281DF7EBEB623D601B7246F6E63471BF9432AB97D22DD3886E21F2A7874CBEC519A19B18A6898530AE19A7CC4D4F4D55A65B61E9D421B71C3234F0ABA9C987F9605900281D3BEFBF1356E05D8DEDCF466DF6B368DEB13A58660D7724DFC98F46F9C7E54FE2ABC74563C4178B8C5B9CAE4C4E1C2F4F666F0F604919A52912B4DC274F9A3F04B6D92797F15556D4DA92BB29C713284956D78A39A3327762E0B6CEDABE8F7EB6E6D13D80B0167D99BCFEEF18D98B7AE4289203100D8E96F93F56F9168E79F97DEB1DB702E239CC278AB0EE2191506EA940AE48D4E5A6E59CD0F32A62690FB3A948526CA4B2850513E9B82230FE3AC1C62DC3B5D4EA405A0D3CC95312D981CD2D41208B970BCA459EDAC5561072553B16CCE1DEEC6DD3426F1FA9670479B433BB85CC94CC433089B7EB781E88A9E792A0B71CA8374E956E78BAA1725C3321C2A5124924F61B7CB97C597670AC1F8EB1298B9441975B54E5807095AC39B6B6B0DFD9F60700A90A9090EF9909239BEA396D6B72D62EC9E074FB0EBF88B468662E3255996E5921803B36B19425CA8747FBF7312B3D07C8FEB16B8897A0F3FD0C15D4FCCFEB08893A0F21F48A6BE83E7FBFDFB45DA816020A7FF26EBCFDAFF3B17885133F8D979DB7D4027C8EBF28F38CD99844965C63A9D53A5A12583710CD05DED65314F98706E3A5C8F7B7422F1B65F0B346A99DA9614B667EEBAFF391B06BFCF5D34C538AAE84BF2D1CF3BDC7A9E46FCE3564F08C6D7319759C5592D8D355CD5AC4B7340009129301D1BDAE47FEAEFEA3574F5F4DBE2CD229EBF0B4920146074A0BB6A0CD2DE77F33B4769763F2DF2962F98DDDCB59DF51D7E96B465F7A479C33D6A54E98C4B672D761AEB72DE87CA362C060072845BA6AD4545F4FD9C7BC57A3F2F9FF008FD21125C91724FADB7FBF78AD46A7CBF5108E226C7C1F19DE0B4F18BC29D79FC3B26A99CC0CA8969FC4185A4DA6C7C74EAE5A5933B51969274243F3C27A5D86E5D896438EA4BFCC096C294ABEE1FC0D76D5FF0012C5E870C9F53929E64C44B9C1D4A025AB2A145AE73252E52C1C1D2E43F9CDC4F499D2BD0EA43D8EBA1716723A0D06B1F9C756E9351A2562A547A94B38C4DD2661EE636F4B19679A75A714C3B2B30D290D943CDB8C28A9B52526CB0A293AAE7E8338771F18DD248A90B42C1968216852568525690A0A4A92485020D8E8085070416EA1AA94254D291D4EE2DB38B7A7468F9BAD164137E6BE0ACA7A048476D3DAFABD3AFC84675217E1D5BCF4D8EA7D3974114D118826ADCB69B39B020BB5CDAF77E50D611144A34A765003910EDD1DE293854748483E5209B5B7BFEBD7A7D7B4239FC29FEBF94576D066661A4061B702BC802DE2CA12A282038541C6C158EA946A3AD5646837D3168C571397858913E6A4A922602A00151290E48600DB726CC05CB457E1F4C04E2E41195EE05AE2FB7DED1B217826F852D57883C6949E2033A69150A6654E079E6E76834DABC9AE5063AA8CA4C85CA2D2C3ED365C939598487C2ACDB534D4B00A53C976CBD09F8C6F8A6C1386B876AF0AC26B244BAD4C832E68913524A49967C2A54B252E34201707C2A014E233AC2F0E4CCC85B706E350DABB3EDD5F7DA37B6A733234A97A653A932865A974F9344B4AB01BD12F2ADB4D169A6A598B06996DA42434DA1A4A52840094009000F99DED47B40A8E38C5EAEAE6CF54D98B9F3157249578CB00EEE436D6DA3B3F0CA04CB976172035C83622F6B8B73D343ABC72DB37403A8AAE546E7DD6A36DFD2F6FA475685AD28F182936B10C6C00B69A90EDD7945F48CB6E407D044F14D3261248D411BFCBD5BEBCA38844984210842108421084210844D4C89AABA65A8BF263FAC482AB9015BD839DEFA74FF0F103A7FA9447A5B56FF86DB7E31552F0CAC9BF92513CB5BF93031095582893AB0777B7CC40AD29BA82D4A237B1D76E9EE7FCEF157FF1DC448FFB0CFD2EDCF43B7AC449582A00A89726D7EBE8D1444E952F416C01EB6FC2FF00BEA773D224AF01AE95732D7A12E34F7D74E6044C0800B827CB6DFF00B7B47209BF603E5B451AE8EA2590152D449BFDD8446CDCFD4BFD62112549524B28107AC2110C210842108421084210842108A0F95843AA4B6A559971B4DBA5D6855D42DBDD3AB6575DAC3A45D30EA8EE6B284BB659F2D4DB125635B7D878A7AB4A4C85DC151492C5EC0386E4C777E76BC69B1FC509960ED371AE46E67C934EA64AA987BFD34FCDE93A04E07A7D7A1C73BA87392121449E9DA3E913E0031C54EE13FC30983FFC24B9A849672651CD30870EFDDA4826D61B474BF11A1A6662C0BA92E0B7E6240172DA9BB967363A46A4295292CA5B6DD1F60F1967E592E061B525243EA7004A9096DC1CC2B4BA08536AF3852542F1EB360159DF216730FF00B761ADDBAF37FEF1D753D0339F50390626C3561A12DE4F1980E0BFC7038EBE09E52570F609CC16730B064AF290CE0CC7D2D51C45252D2ACE94A25E5AA3CA7A6E59B4A404A3913C8E5DBCA5317DCE797F9FF3B3696BC53F76798E9F7B7CE32A158FE2DBE2DA7B0F3F4AA4E45E50D0F104D36A73FD4F21FEAE985D39E29D3732957AC4D49385253CCD2655C45CD88B6C78CEAE9ED1CF7679C60AB8BEF123E2C78DDABBF53CEECC7A857686E2E615298629B309A761A6CBE525E0F50E404B493E404B496D5372CEA9002B96A054BD52E62CB82C1DBEF7B7EBE91125395F7FBFBF68B0848242B5F976404A13B22CDEA0D809161A5B0B5040B79352B4D813112015B01FCCCFAB72EACCEC62284550A64B1B3900DEC03B1D3FC984519770B538D36CB652E38A75C538AD92B215B7FF0061BD937B800D858136B1932E761F8BCB9803242C39E63333685C73F23D62A685C4E770CFCBAB17B6ADE6F1FA2C7804623A9E20F0EEC0E8A8AD6E2A8789314484B2944A9425FF009ED40B6D82493CB69284A1A47DC6D090940005A3E75FE3EA5D1D0718574B960054C4A66B96752A6CACEA249BB924EB772EE63B77872A9D0904B949200B80CE40D98581DFDA336C5DE6300AB651036B5AFBFF00C9B5FDFAC78F58DCB51AC3340F0177D2CF73F63AEDAF66493992140100A47B80C47AEADB72788B3D07C8FEB16688D7A0F3FD0C15D4FCCFEB08893A0F21F488100F500FCE2A695653350068542DD4106FBE8229262F254A03B38B0EB71F53AF9DE2DC78BBAF35863863CF4ADB8B4B224B2C7182D2E93A0A15FC9274A4A542C52AB8D88208EA237BBE12E93BCED27095650A51128804ED98ECFC8FCF4DE31AE23567C8356171D4960EFADF7D9F5168D797C2429625385F9FAF21BF357331F13CFB64A767105BA579F71650BEE09B9BEFD0C6FF007C60854AC4E8C2CBB61D212E48B001561FFC4BB0BEBC8BC774763D2925034040BF9B06D762CCC341B464F96D940D4E5C4ADEE1409D7A8F6B83ABFCFE51E7F4CA0CE55307F3171AB17F3BD83F9F222D1DF4410483CFCADB6F04951173D2FE53B6E9EC76EA4F7277F58A199879672837D1F5E5CADCCBBEDB3456205B5BEEC5DBD34F567FA09A2827D1F732F3170A1ABE87C86DD7945721DF6D3E4E3D8C228226C656D72C971B5B4E279894AD2B94D684AC4994D890842925B98429775A913699842B5149051E58E9EECF38EF12E13C564E274C90264A525410EA09749CCE7C43981AB5AF1A1F5D86CBAEFCE5409724872E79B696E8DA078D5BFC5D7C0FDCCE198C499F1C29521893C67301754C5196B2A24E4E4AB0EB616F3D37410F250F9A8CE9D4876584CBADEA4325A9649592BF71FE167E35E92AB06A4C2B8AE64BA6026A2409A939D7265B240999495A94847894A968198870963AF5963DC348913C99254A195C0F2727A924EDA731BC69B79959499899495B9EC3D989846B784ABB26E29B76955BA45464A765032A521C4BAE3ECB4CBC1D5001A7194E83A092557047ACBC0BDA3708F14534B9B271591512D60144E92B4B292A1E152904954B2774CC0141AE2E63119D86CC960F8482350AB106FA73F47EBD3CD94A2969978B6B6D95FDE71652BF9E94A3CC3BECABC65B8AD5D32539B0F9F26706F0E69A87E8E1C5BA86D6E7959A626A50E421EE6CD701C5FE7FAC5343E975CD0DA54A07A1510DABD0F917659DC8D80FCE2D5438AD4075622AA7952C6AA0B48B737CC76BE9AC4E96BAB5003BA6B13A3EFD2FE5E7EB1EB796B9399A19AB5B630FE5E607C438C6A736FB12C893A2D16A53AEA153074A16EBB2EC38D4B361446A71FD2D907EF01BC63DC5BDA870870CD2AE7D562D4B4E10852D4B9F3A5A41081E2EED24854D2F6640262E12A4CE59F12147664A6F7BBBB3245AEFCB9C6D27E1C5FC3CF8A5AAE61CCDAE31E5D990A7D3DC62B74ACAA6A6A5549AA21452A63FD4EF4BADC9944AB4DB81D725A56664A67E2D2CA564B21E6D5E697C47FC71D151E0B3F0FE0D9D22AEA565520D4294A44C424B85CC9212A4292E4300B05412A215768CB700C113573C89E0A424666001DC1651BF319ACCE1D9AD1B75618C1786B085028F84306D26468986282869990A4D2A59A96939697611A589546848714DB36400E2D6A7DCD00BCEBAA52CABC38ED67B4CC738CABEAEAB10AEA851A852D4A4898A520151777255D45C926F1D8B478549A420A545446CD61AB5F5B0D198748EEC6E41049B137B580B77B0DBA6DDEF1AEB242535499A19665CC0A214FE23989F2D4B10DA7CAF92E7996059D830F2F705FEF7B40000580007A0E9BEE7F3DE2662154AA8A954CC89960B78123C36003B6DA3DB9C56CB59989CC753F7B5A2316F25EE6238421084210842108828D813FBEB08453D67D07E7FE610370473895D984B496DCD2A754EB886D1288F2CD285F438E8D434F2839BA55A6DA48B92482737E1DA2ABAD9F224A64A0A56A4A4A9419C1DC5C10DBB8726EFB45B27AA6A3358101D947460AB037D483AE8FE60463EF8B5F13AE153835A8AF0DE6A62C9D99C70C3466DEC1F44A3D526E78CABA9E6CA244F33293324CCC2D97192B43CAF315A9484845ADE84F62DF09D89768D488AD934ABEE1D295CE05089409DB3AFC36D0906C436B18AE23C41328D5972A09B96D4B790FD7CDF718A299FE270E1755509C9597C9FCCA6E9EDCCB8C4BCE3FA01525B274B8F5A4529425D2362528B056E7BC6D9A3FD3831A5D30994C844E51979D91514F30B11A242145CD81B5C69B30C7BFE71588999532527501D2751D490C1DEFCDB945E2F0E1E39FC1671158970F608957B16E0EC5F89A759A3D1A8D55A44F4E2AA15498712CB01AA84AD3448B52CA7149054F39E54855D63631D15DA5FC10716F06E1B5B8A4CA296BA3A09626542D351216A92145921684ACA8172032803BC5DE8B8C2AAA16997324A1256AF0B2560DB5B92D762DA8EAE1E333C8750B65B75B55C38D21C483D6CB485209037DC11D3DFE51E747196152B87AA66D3D4251992A524D8120E80009BB3B73E42FA677433D7529CCB0DB962086B3DF66F4BC4CDA8A9373D6FE96FED1D4B5D3A54E980CA0C2E5FCFD2DE515CB00161CBDF5BC4F14510C2108421084210842108421100A5A15AC28D82569D040D275A0A2E76B929D5A86FD40BDC6D173C364A674E419812132CA54145C174DC5C96B90367B96DE2867294B0A9792FFD43467B0D6F76B1F48C1F78F5F0EF3B9DFC06E28ADD225BE3ABF93B5293C692879497669FA722A52A6AADD929E616E5A41334F0E4849484DDC2537BFB3BF00BDAB228F1AC3B87A764FC3CDFFA2CC1694AD26A11DC8512A2C120AC28822E1F78C131FC1E5CC96B9854429F336E18B91A1366DB4F211F9DCBAC242E612A09979D9598026549492DB93330CB40B684B8569525B975B24A55AACFF302AE9F20F7DE9D72B0EA5A09D44BEFA5D4651395981091676236D4BF50C747EA1C425A244E0906D99CBED7F204B69BFED1B9E625CB90A08D04364B49575DCA5BD29BEE7A01197C9553CE9456898ACCC6C49D586BEADC9FD2F4E0CBBF8AFB6972C3CDDEDECD122920B61B0549B1F2AC13A80B92527512160DFF00AC28FBC5A26D55489FDCCB4B8248CDEAD7BBFAEFCE39083C99CFCF77E5BFB7510D3A55ADB3CB2400BD0000BB5EC4A6DA41DCDCA40BF7BC5C66CAA944B96BCA08502544DEC1BAF2EBF38854876771CA2A95950B102FFF00777F7DBA0FA0113A9E7A12DDE1CAC43BB59B4170DEEF10641CCC4915E2BA9588497B101D880E376D7D7EB0C82FAE85B4D768AB2D2F35373B66D242255B6420E9014E3AFA9012C8240BA8F994948DF42557B9DE302C4EB2761B4F88CC9A909935256524D9D25CBDCB3B746773A3C4FA04E79AC4DED61700F98040F2D79E91FA49F823E5954B2BFC3F32A29959977A5EA388BF9A62979B79010932B5B9F7EA54E7191A52A2DBB2738DAC296544820831F389FEA0F8C48ACE28AEACA69C954D44C327202480992F2D25401B2B2A466BB66D0691DB3C3F4BDDA50D7719893CF52C5F9D9AEDB978CB7BC84EA42526C13E9FD574926F7EFBFF009B9E9E541AB9955493953929CE836B3120B7CB571EB1D8D4F3660484148621DCEB6D0EDAE9EA2228251D3DC0BFA1B1FD62D315840218C0EE49F584722C00E501BAAD6DB6DFF5FDDBD62A29C01325AB56580DB17205F7DF6222DB5672CF42F7091F57F2D631DDE2B5881FC33C077105506356B5E0CAA4928A090AE5CE484DB2BB58EC3492493716EA0DE3D1AF833A3FC4769FC3632002754D1CB3624655CD0920F201F5F78C6F1D39D2A51B1082433D9873DBD75D9A30BBC26E63CB70EDE1A985B3326685375896A1D0F106329C969242DC79C2A69B5143896415F2B4C9750028951F30DADE9A76C9C0187768DC65418355D4AA52E7CB954D4E73A1092B2B284E752C654A493724861BDA3B3FB3BC5E6E154FDE225A4E59654429CD807B3107E7A39E8395C39F8B470DB9F330CE1AADCF1CBEC6ABE4BA9A3D7E61B91A24E33A948725E42B73896E9EED41E213C867E35C537A55CD695AD24F4F71B7C1DF1070F522AB30F9532B29C67C93259CEACB2C02573252495C9410A012A5848532B29394B64D23B52A85D59933A5CB969CF95C8617533667B91A101C8B68E2326D4D9D91AAC93753A54EB352A63EB52999B61412C960E92DE9796794E2403FFBC825A58DD048063543887B3FC730054C159453529964824CB2EE97D181049FB78EECE1FC670DC569D33573D285901C0367DDC392D71CC5F4E7CC2928365EAD4BF3B45B42DE60B7DCAA71B0A96E66E9B36161646A201D2AB75657896A4AE5AD25265AC2559ACA7215A03729196E4020167D445FD13654EA85CAA7216424A831770E3EC060E1DB94422D49A5A32F9D6A4F2BB39B5B61BDA296A17884A2ACB252520EFC9DBAF22D73FA1CB602803E9B9B1FD8FA46A6D64D452CB79440531218F4D2DCD83031A7250A7D07BE9D03F94533A4297B208294801C24DAC4EA2C1494943C41B15B85C6EDA6C8D8DF20E14E29ACC347E2115B364290B7C89594E801D0697DCF2BBDE282AF0E4D49CC407367B3867B925DC17D031FA45B2E737077C35F10D28FB39B394584714B9308D2B9FA9C9BA8AB85EFA5D13F497E43594151524381609FBC15B46D8702FC6063BC1A6549958A546594438EF96C72B657014C77D45BD62C955C3F2D600CA0A8001C0B3BE9CFFB0DF58C5E639FE1DFE00714CFFC7D2A4F30F09A9D5A9C72530ED7294892694A37B36D5628D545948EC0B86DEA7BED0E0FFEA498E224A51515899C84801495860C35BA0853F47663CDA2C53B85252941425B39008FA1BEADB802DBB473B017F0F9787EE089A95AACF61BC758EAA52EB4AF4629C414CF82514907ED19A452692B50240B84B80DAFB826E22C73FD4B2BEAA96653535404050621014496046A4957931E479454CAE1496E3F86E43ED6D8900581F36F48CA364FF0AB9059094D12994795183704BA9535CC99A6D3D7333F369B12E73A76A8F4FB892955ADCA2DF4BA6C363A8FDA1FC59F1071AAE6CA4E275094AF3040EF941290A3A32944070C76BEBB45C6470DCB46881A07B0D5EDA7AFF68B802D2FEDD209534FAD243456A3CB1637B2D454A091D02104277164EDB6AF625C4D8ACC9F32AEAABE6CF4CDCC42153338751241035D3A168BB52E168A45664245C312CCEC1B7E6DF3F6AEDA1B6980CB292D0B82AE8A277B904EDB1DFDF7EB7DE310AEC56755921CB1249725F4D413CCECDA5B945C04BD741E9AF589A2D928B2C1FAEFA3F2EA6F0C8798DDFA72F3F942139414B2445520327D6DF21FA4225C47084210842108421105024103F7BC2114B42BD3F31FE61083ACB730565C4A94E725B61050AD0E369BA1C5AD2A208079884F404907E5191617C4157854E91340CA996458A487095066D1DD3A9B802C766A59F2CA9252DE139945408B924F858F42EFA3DB78C50788D7856E54F1F5444D5A6E69583B37A954D759A256E4DC684B54912439524DD590A4296F3AF21B64175B7594A13E45242AE63D45F857F8B64F079A7A2A89C9974CA64CF91312F2D76CA490AFCA46A086F173DFAF71BA0330AD4525D2ECC2EDA9D3E9FB469FD8E7C0AF8F9C258F5FC2329978CD729F3B53989495C4D4F54C2A98242EB4B737373A669E91616E369490970A097141B480B526DEC2601F1DFD99D360495AAA64C89F2E9100CB992BBE54C9A000532CCB0960A21C12E52EE7478C1E561D52AAA00CBCC1C80C72867B6A7ABB0DF4DE3646F0AFF050C37C244DD1F3A73C5F5E31CDC4B0918770D38BA72F0EE169871252DD4DD522594F4CCCCB2DC53C1B44EA14548000B98F3ABE27FE37F0FE25A2ADA0C365CA954F39535FBBCE833DC14A7BD656553302D9585890EE6332C3F0E29521653704036040075037F5DB7E51B0BA5A7D26CE0474B59B1645EE41D092A25290774824D93606F1E2F717F14CFE2CC5275490C17354A4A459DDC8275007A8FD23B0A8101094A5CB300AE570496D76D6F7BC5740201BFAFF0088C4A7D3AE9CA44CD4876E9B7AEAFE91725104DB60DFAFEB13453C43084210842108421084210844149252481B7FBC5DCABB8A24292D9D60070EFB820FD7E7B44195198BBB9171E96FDCF9931D4B17E12A563AC2F88F05D769ED5528D8BA8D52C3352937101D4993AFCA3D4A98982D5895FC1B336B9A510086C37AD5B24DB607E1C78FAA784B8C28EA3BF989949A992ACD988CACA4D9DD9833F4B748B1E37202E4A99394906E45896DCEC1474B74D63F324F11FE103177075C4AE60E02A9D366938597589BA9E0F9F32CA2C55E8F3CF2A68CD4BBC8406DC4C9256ECB39A54794995B28274C7D47F621DA8E1DC75C21413855A274F14E844F42541A52C20250487CCD3192CA2594B2402EE0741E39473133D6A53B0248E44B9D0B5F6075B73DF1FE494B41F5A56860EC1E5A4A5B27D02CD9255EC0DFA6DB8BED0E01202E43953BBD891A37E9ABED7BC63D24ACA838043E8075F7F4D87A4127500AB11717B28107EA0EE3FC6F1C57CF9545519D5600B12A673E7EDA69660F17695977019C00FA91E56B866D1C4462E1271DA5A99252328290407617E9B33F43E711D56564B10E5C103A35C97DDFFB59E204D85C02AF6482547E406E62CB5089B5330094EC5F4EBA7D1F52DCAF14512ADC4A0849D4A511750424ACB63D5D09BF2C0E84AAD6317BC33009D33C539797437394902E6C4FCECDC85E1F7F6378BE2F0FAE183147167C4F658E55D229D3935439EABCBCCE2BA9B2D2BF97D268ACA933E2A53B3A50A979748430991650F2D3CDF8CBA3514DE3A13E297B44C1F81F826AE749ABA693574943313290B502BA8A82912CA72A5416C94A96A54C072A16129241501176C36816A9C8284AC85AC6637602E75D1EC3ADC98FD3DF2EF03D172D303E14C038740146C214692A053BECF9444A52D8664E593A6C9D484B2C2436E81A5D400E2494A847CA476E1DA2CDE32E22AFEFE7F7AF5339CA959B55AB5724BF33A3B1B5E3BAB04A40844BCE360FCB42FA33BEFAF21667EE2A5152C13D0DFB5B7DFF007D7E5B46B55584C9742000958771AE876EA7F5EAD97A5294A48000200039FBDB4601F95A2316E8E610844A080E01DC807E809BFE83E71532A5A8A52BD122624BE80870087FD22DB565A7241D0A43742E6E796C1F67E518E7F16AA62AA9C02710EC042D7A304556642504851F87A74E2EFB5CD811626DD2FF005F4F7E0895295DA0F0FCD74832E752AC28EA32CC05FA806E47B5DE2C38A4BCE93ABE52006D77F3DBC8C629F80EA3D1F327801CBEC2755690BA5E22C195BC355965E097528E66A42404281BA8A660957A022E3711BD3DB9712AF867B48C2F24D3965AA9D454090E0CD2A2C431B696B87B68F1D8BC1D4A55484B0BCAF3FE50E35D4B7AF9C599F864704BC31E786767125E1CFC4FE194D3F15D36AB338DF26F3370EBCE51B1CCA2EA4B9B96A8D3999E78CC5366A59AF83A53B4FD14D002CCC84A965474FA6BD9CF13E17C71C3F830553C9577D4C9919D490A2B992908CF9C29C2923BD162092FD63A2F8F311A9C22A67996149289854A0C6C924DFA3B10F66234DA2E5B357C377C4FFC37AA350C53C36632A871479234775D989AC215895157C40C52412A217214F32F516ECC35A50EA59436A372DA41168B0F695F0D9C318FD1CD51A3972D73659095C84A03ACDCAA6A4A54480ECD2F2EB6BC41C13DAC56534D4CA993D40121242892DD1DEDC9C9D5ADB470387FF151C99CC6AAAF04E6F49CE641665B73424A670963075548A6393E85969D4306B0D30FB331CDD9A69734ABA0B9E4569BA7CE8ED4FE0DD5414B515B83D2CCA9525456A549979B2CA2EEB58427C21C8776CA4DF68DA0E11ED5A9A4D4226D54E43A9012332AE49666D01203BB12D1946959C969F625E6A45D4CE49CDB297E52765487E4E6D95A42D2ECB4CB454CBED9410A0A6D4A0526F78D17E32EC531EC0F391226808249050A60068E1AFE7BEC63BF708E34C1F18400552D456029C1BF2D7770496F72D196F56A005C5813637EA2FEFF002B75E97F78F2FF00BF993484AD5981617B8B9E5D4DBF78D4488800D8A813D3A9B1FAF5FAFCE26FE0EA08FE1E86CEE75D1AD6279743711C15006FF7F7F7A44E48B580B6FF005FDFD7DA241A59E8254BDAC6F61EC7A72F9C4A52C906CFC9F5E8DA37CFCCC4B157227CA9285A095124105859CF2FA17D625162A00A5EC5891A736B7907B4352D3600FCEE3A0DB6FF001140996262980B9DDFE6747FB3157E511BDCF9AE6FD6DB7EFF007BC542A8E721214901B517B8DEE1DC5F43F28E09035DE224240D893F3FF88905537F2CC2583100927D6E7605A380A074E46DBEDE9102A27A988529E43EFD62288421084210842108421084210842108401620F22F08858837DAC45AFB8BEFF0081F9C5DE7D7D3CFA79728CA01684A428817B0E7E8393B728E087B1D220A783435590413A4828FB4EFB2564DD23AF4045C13EC6F5C3D5829495C998B96A076535F9DF62CFCB5EB14D32825D4A8E61B38F5B173AEB76FD045129426CB4B8A652E11A94A75A78EE7A8694DEB27B5C2869EB6DB7CB6571EE2341572CCCAA9CB9290429099854406203A6F616B91ABB6D16D9983D3A1D484AB324DD59084F26CDA0B6FBF48E616C294DB6D15B8950F34CCC6C117EA520040001B91DAC7F1C7788B8B24E34145656493FCCF9B9105246DD46910CBA54A41394EE410356B81A073EFCDB58908D248B836245C743636B8EBB18C2513128585CB05C5C3FD6DA5BD045D25BA40F0B307F7177EBE83D2D1088EA6A1550A0A50660DABBF58A849704B35FF4108A688A10842108421084210842108AA366EE6F7FE9F7215F5BDBAC459D73552E493E104240BFF35AFEF1689954B4D6196904861AF367F70FF62380B4AB5071B5AD971BD7F6C9170DB4B494CC03B0DDD675B6826D65A8102E008ECFA3A218261B2713933009F90AC31F1020B330F1176E9C9CB98AB9D2FBF940292E48FCBB96B821B4BECFB5B48C5FF8A07876E1CE3DF261747A77C251F3430C494F4CE01C5AE30D26EF3685CCB5419F5108E70A94E7325D37710A099B09483617F4BBE0BFE21EA306AC914788554B553852254FA69F34A04D94FE20925432CC00932D45C05105493A475DE3B8289889C424E662A0407BB72BDB63CC0239C7E773C4170E9999C3AE61D7F02666E15AAD0ABB419B5CA06A75975BA655D08511F1D241C69BBA1763A4A5C5825205C902FEF0F673DA4E1D8D5352CFA0C4A454C89E80A5C91302A6D292E04B9A42AF6D159520DEDBC7594DA0992CA82E5292468426CA0D7205B936A19A3C2086C121A56B6C7DD56C6FEBD36D8DC0B6D611DCF5144316969992D59B3872411F2D5AF700DB7E71679EB9921C242AC1CD8F32FAEFB9F4F388458EB7089D864C91E2244E511AF222E46C2FBEBA69789722A0CE2A05DD237DFA8FDB5815251E6585148DCE8FBDF4D8F7FCBD3AC6474F3A451D377F3572D3912E5C806C073D469A6CCDAC5531E47DA2E5F86BE14739F8A6C7D48C0394584676B188AA6F21137596D879EA5536556A4A54ECEF2D3A129495249529D6FEE9EB1D51C69DB4E19C274F3E754D7C8921085F75244C4A66CF0917297242522DE229507291C8C7294CC2B0132D6A63E2212484E9AB0D6FFDC47E82BE17DE1B181B80CCA992A6CECBCBD7339F1253E5959858950CB6A975CF3896E6DFA3D1D612B532CC93C85B49D2FBAAE5336263C06F8AAF8A5AFE3CE22E20C264D514D153CF9D4B4B284C272CA4A949054A7654D504833141294A9574A520B0EE7C07089628A9E6AD394A900ACA92CC54D662F606D72FF58CAACA25E537A9F5A14B5BAF14253FFE8CAF315F08CAF7BEB6A5CA1B513624A6E6C498F27B1FA95AF139D5014A2A5A8A9C97759FCC5F912F66701B522D9CC893DC2084A4F8776B1762E07CAEF7D2E62B9EA7D8F716FAFE7FAC5A14B54E4952B54806C6D72079EFAF95F6888542BBC09205F93B37CEFF007A4224C5642108A4BD9615E89B5BEA7BFE517E95252707993AC1489B6D5D985EDD4DCC59EB0955420000800BB6BA1F36DB945B1F19185D18F3862CF4C26E341D156CB3C5B2EDA0DD5F6AAA2CE2506D6EA952AE36B9ED78DD7F82EC7D5238FB0E42E677413918A8E50E09667F77162FEB141529485241205C063B13E6DBDBAC6BF7E129585CFF000C350C273CE10EE1BCC7C534596BDEED30F4BD21A964007A69710F10361B9B46FF007C53CA988E2DC36BD39CCAFC152CF3318E44925648CDA380906E37D2EC7B6B80A5CA994E5208538524656760030D4D8BB07FF1E3FC7B7FA8784FE27F873E3FF2E82E59DC2D8A6428F986994D4DB550C3689C9479972683646AE6FF00EBAEA5EA074F4EB1B55F08FDA952564B93844E9C094210BA74A882A13A58032203B933C14E66FF00DB1A18EAFED5F84FBE4CE9C99533553A80B105DB316360C598DFADA3786CAEC798573AB2D709668E1826B386F3070CD2711D01A6D697C34C54A5B9BADD61A482E22CA4825D2A6CEE0245C83E9A54572B18A394241CC952100AC1722DB9761724E839EC23557FDBA661F50B57E42144B17177D1B9DAFD4B726B33E2F3C26F84AE32E99333198F9754DA763454B39F0B8F30B4A4AD1B13484E68296C1718967251C6895171C4AE4FE216E36DE99845961568A8E0FA7AA90A156A4AB30BA4D8286FD141C5C69177A0C6AB04D080B5A128B2495101B40731E5BDF7D7531AD966FF00855F89B78794D4FE2CE157164D712591F2CFB9333197F58979C62B52122D953E52E48B9393752AABAD3295A12E538C83257650674A82474871DF6118363B267A974F2DE6053CC4CA493F9491E1486624016008B1360D1D9FC3FDA1D6616B423BF24A4A6C261360402D7B816E81DA36970B0E0BF51736B811F19270C548398A81662C1CDF63E91DAD348A44E6512A0C4F88B9B726B74D479444003A472B98B7001600306DFEFF00789126AC55DF500D9FA0E85B5D79FBC22DF316A50B926ED7DEC7DF58AC47E61D5C1F68A5A95AFA9FBDEBEF1262730E5D3D394558E4122E0907982D0844466CC362B57B984220D75842108421084210842108421084210842108421121413FD47ADEDE9F9C4CEECB02FAF4DF71AFDDE11384A48DEDB6DD3F41BD81EFF00217BED11266AE592125BFF008F87F7D6205120DB46E9ADFA444B681B8293ED6FD05FAFD077809AA9C72292A24B33BEA3A8F5DDB94490A529652AB824020682C35D351CFD22112949292410C444FC89E5F33FBC22296C1697EBF43114226545D6080DE116F530844884210842108421084210842108AD9011950A23C40920DF991E9F2880CB41254521CEA5AFA37D2115C6AA6A91DDAA6ACA013E17253A9DB4BC4712AD295A14DAD3ADB50214DDF485023717EC4F4BDAE3AC5C309C7AB303A9975745553A4194B4A8892A52335C5AC3789532521695664A4B8BB87FBDFD7CCC5947157C0B70E9C6261B98C339D18229F539E2D2DAA4D6E96CB5275CA629C49087199B53531CE71B590B49537D411BDE37D3B07F8B6C5783AB69E6CDC5AAA494E5412A9C4E64064A810A0DA58BEA395E31DC470B953A5A80932D9812C9D3AB83AF9EF68D7133C7F862B11CBD66766320F34DB768CF38E392B48C6549E5CDC9B0BB14B0FD49AA830D4C2D2755DC4C9B234148E5DEE4FAA9C19FEA19814BA4922A6A64A96A48CC944C4A19400723366673720EE491AC75E627C36A9A099681BECE0F506DD5AC40DEC62D5695FC357C5EBF5032F3F8EF02C8529974DE716E19E6DA0A22EAE5227258A0D920F99D5EAFFC74DCE59897FA84F074C4833F3CD50BA422B65200D95632176D34237E6D168A4E0AA89EB51019AF74B3B6BCB5E7BDEC4EB7F7C3B7F0CFE04A55529F50E21333EA38CE5E5E61A79CA260B658A6CA4E2104A972AF3D30BAB1085EC09B0D81D85E3A578DBFD43B095C89F230BA844A2B4A9328998264F4280B14AD265A7375C85AF6D232391C14A9490B9CC1203A89B002D7BE83A1E91B1C70F3C2FE4270C186E5B0BE47E5A5130651E4DB44BCC54694D34E57A7A61A4848555269C654A528D9657A10D0D46F616B0F353B5EF8B3C4F8B6B67CD18AD4CC5CE2B7577A5FC44DD810003C872D498C969B85E44801265A524070E3563AF9680E8CEF7BC5C6151528ACECA512B3616F32AF73F3DC827AC694E298DCFC56AAA2BA64D98A5542CCC2A52892EA24DC9B9D5B5668CC69E9D12252258481912000341603991B442317AB5672E4BBAAC7D0DBADCEBBC544228E21C8905D838D0C21114210882BA1F91FD22ED4931E47764B8CDF94E9721891BD87F78A09C926A90C01F0871FFDAE7CCEF1D76BF4D6EB545ACD21D46B6AA74D9D91712521414899616D2C106E370A3D7EBDE3613B1CAD386F13618A92B5495F7F21D48394B158B588F913A9BE8F8DF1385A120A14126CED622F7BEF6DEDEB1A9578653FFE93CD0E2E326DF0A61CC1D981375644B2C90B0AA83B361D2949B69D2DC9B4761717BF78F667E2150715EC9302C6972D0AA89B83D1AFBF09F190813014855F70097E7E463B03B259C42BBB5ACADA6B10A3700E523FCF4E8E3235C4C64DD233D724F1B65B55A579CDE25A04CBD2EC5925725354C61D32AB4950514EA54DAAC12124E9EA2D78D5BF878E3D9F87713D11A7A8549994D548292936252B48D2DAB1F7023B8F8D30F935186ACF72839A592CA482E00279037D2FAB8023D9BF86DB8A7ABE37C82C67C27E625650732786AC4FFC929F2332B299C730791352CCB2969D70BA532469ED24AB748E700529BEFF00429D976374F896092CA18CBA99089B212ABAD085A5D2E5F662E402778F3D78E69D54789CC514948EF08530213626EC2C1DCB72BF58D9B585256FB847475287594FA200B2EF6FFB4A9209B75247A46535F3A7CCA83292B5654B10D67CBD7AD8F90DA31B54D4D452A132D92A6399ACA72C468C49B9DC0F9888D4A5C4DB0A61690E36A4292B428056A0A4904588293704EC458DC003789B2A9973100AC92EC195A581B9BFBF5E9A71210A96CE49BB927F6B5C96E4FF004B076CA5E965CD4BAD0B96274A5E3E5E5286DA9C479AE0F5FBDB01D63E182AB05C5686B5722B644D4A50A527328283B1B10E069CB9DDE36997562B1211A12CE1F7D6C741BE9F2888BE94EA02FA479926E95FFE69D8581E96DFA137B1116EC464A64CD480CF943B33177E5F63AC4DA5A714E328DC9F4B3B6A403118B1AF4F5FD0C5727F3067DFAEDE4228FF005FFF00CBFBC4A89D15A108421084210842108421084210842108421084210842108A7A4A8DEE46E40DBA5891EBED78BB22585213C9817363A02D673BB7ED088A8816BDC5FB8D81F98BFF00BFBC7270F9934E6426CF7B173FBFC8F5BC4B5EA34D3D7FC72F58980E9B923DFF00E2FF008C4D93854C4AC2D40E5BD98B86E4C7C869F5890807BCBEC41F76B7D81118A7AD9195CB5C5EC3CEDF7D186D15708B60201BE977F50D0844C9AA0A50234CA3EA4C2112A10842108421084210842108422A25AC84001B7FA9EB084479CF21F3FDE1102010411707620C47292674C4CB2400A203DEC5C3177D8DF430D62555D7E5754A7D0149D2DBD65368FF00EA00045B6E87B8115F5186CCA701521613943854B2C4BEA1F427C99BCDA257732C6660C55A9058FA1895652A520A9A41084E90920DADB917DFB5FF006220918AE2F4AA025D54F484801B39CB6E5CB972710FC2CA55C84DF9B38DAC1ADCC0EB11BA9684A3514A5B24B606DA0ABA9474B5EC2F7BDED7EB15753C478BAE5841AC9C366CE4B0EB71F4B9F9F224C9A775A52919C312000E0680EC45CF2239C54712979296DF25F426D6E61BDADD2D603A7FB0DA2CB36BEBEA16262EA271580400144FA6AD7DF5B973B3419E521F225201FCD96C15AEBABEBEF133A43A517480DB62C86922CD8B5AC748FEADBADCFEB79F4B453660FE24CCA48BA8975907F95DAC2D7D5F6222904CEEF314A57997F9892EA517B5DAEDC80163E512C499B33B952A4A194941CA0BEA06966B1B070F170428A92090C5BEC8E86114AA515973E8360222844308421084220AFBAAF91FD227D3AD499A801D8A8023CCC5296FC64B27560DD75FA6BF28E3CB3A96DF4AD490A00F99245C595D491DC5BAFB5F78EDEE09C40D0F12613E260A9D2092E5FF00EE076B80DB38275F58B4713C90BA70A6B80F6DCB9E86FEDF38D49F0A497FD25F199E28B00147C349663B0711D31A02C8996DE666186F4D800521D65CB2424D9448BEE23DE9E2892AE25F878C0E694E6FC3D34CA22C5FC32E449988510DAA8CE501B16706F177ECD6709357F99C152576E65C33B87D074DBAC65E8A88494AD44A5F41679A36581B029D66FB2BA280EA0017006FE73702CA3C37C4AA9D3159128AA605F2E8B24687FCBBD8DE3676B29856503315669563A9663A3DB7D4E818B461D6978D67FC3C7C5DB2CF885651FCAB2A78800FE15CC4665D2A6E8ED4ED5AA14E7DE9E6DA050D4B38858D2C9714F14A5C705CDC98F74FE1ABB48A2C4308A4A254F49992928CA02813908014557BA524240166CDCCC69076B1C36B97553E6041B955C6FAE8E186F7B7CA37D7A4D4246A4D89BA73E89C959A4FC5CBCDB442995313365A1B6CA4904253A415056E2DB5AD1BBD324C99B265D582921400077530FCCEFA93ECF1D0D492264852D2B4948D1B4208D39BFD35E91F7D09558F537B74ED7FD3F3FAC0148486D5BC56B391D1CB5AFE9152B219873279F3D7AF90DB48D6E3C3AFC4630071CB960A9B137274ACDEA138C48634C02B2DCABD6434CA5E9F90610A5A9E6564BCB24B4D1414280D5A6E7E6A7E283E19E7F08D3D6E2B494F28D3FF001264A9B2D0405A43A8149CBAD803C99AE18C6C5E2926AF87B189945552A6A56898525494B243167DBCDC73F5393F9697286D494A91CA0B219B2CA872F4A4D81291D14542D6001BC791B8D19B22AE7A66CB20CA9AA9641703C25AC08F2EA1E2FF002E7898942C5810EC7D5C96D2C75E9A6D0D6359459408EE46DFAFF6DFE862DD2A997532D4B43008B973CBEB6FBE7572C85170E7562DB6E5F944A410A07D4DC5BE7D3E71488495A8247EEC2278F6F38AB109B1239421084440BF703E70BEC09F20F0881B0EA458753DBE7F211514F4CB9EACA011670E1A2052C25DDEDF7CE21A91B9D69B72D2E8373E64A9E0C009DB756B22E3B0DC9BED114EA49923F3149B9006E5839B7400EF76B3C495554B4AB297EA4683CECFADB4D623FD45241491FF0076DEFF00DC7E2220FC34EEE84E12D4A96A240290FA6BECD1CFE210CEC5BFBB7D6D03B5B706F6DC6E37E9FBF7110224CD985932D6EED74900799E510FE290ED9544DF41CA04D813E913C51ACA824A909511A13BF2D45E2722605B3021CB78ADFA449CC1D2C77F688A650CD9775293A39FB7313B2FFE49F788950001DF7892241568A1F61FD3D5A21172438B75B7DF9B44A1D4136DFF000FDFEC426485A081F99F93903FC6FCBDDA5CE9A8920152817D81BFDFF688958092AB1207602E7A81B01F389D228664F4E60A4201D029C12FA6ADA9E4FCE241AD940397F4F5E9D3E6368A80595A1652D2F4EA097080543D82756FF3B4433A8E6C9D4A577605377F2897F8F97FFB737CF28FD4FD22915200090A0B5AD47ECD3BAC77D4A49B59361B9BF4F73191E078362D89CF9326970DAB9C56400A449514B682E35D6F6168986B65306CC4B02CC1DBDF5DBA6F1E119B5C48E45E4A31F1D9A39A584304CAB4921C5D66AAD34A0B0AB72B94C879FE65C5824B605C7511B6DC0FF0ABDA1F16D322AA8E87BB42D29532E54C07C40102C921C1E676F41493F11080FDC4D533E89D87AB1E7E4368F95937C5CF0DD9F8B7E5F28B38B05E399B95514CCC9D1EA61536C116DD6C4C2185906E1434255B107A74BAF187C2CF681C2D46B557E1EA40487CC25CC6209704282198B6C7DB48A1918CCA9B51DD2A44E483FCC410970C5957E5D75F48B8F5A92D9097569694A1A9B4ACF99C49170501214540FAED1AB1C51C198B609DE7E3A59494BB92921C39DC81A7A6FE717C1532CF36E7AB35E27092A1704475A4A90B9D37BA436676009EB688FBD06C2FE45FF4BF908914A09363BED7DB71FDA2A2AE867D3292169FE517BEB7B69F3B47226021D88FBD6201609B6FBC5114A81620BF94460821C40A80BDFB5BF3F489C9A65A939B3253CC13711CC4358F7FCBFCC53C21AC7A1FCBFCC21110A04D85E390092C211340820B184238842272242A60CC086F9EA47E9D6108E554EB4872437AFE80C211241292082411B8D443CA1F97CA2726A67243672407D6FF006F1032F98FBF487CE38993E62C0BB11B8717F3D5BEFCF8567D3A1D016E8E7EA2263A7B037F4F7F5277FDFA77A719FF009883D7A72DBECEF10A12B2FDE17BF859DDBABFDFA4523AF7B7A9F4B91DADFBBC54A26E51762599C8BB1F771CF43134250CC43FB7ABBC4A4ACFAFD0111C2A7CC517CC53D136100948B0000DAC1FEF9C5517205FADB7F9C4225A941C317EBF58E47B7972DA110149496208FBD8E87D2111B6D7B8207F9B74EB1082E598BF97EA2DFDE382583FCB9C2DFF001BDCFE5688995FD27CDBECFCA20EF3FF001F9FF68844689531659293E6C5BDDBA471DE8E5FB7BB31F4BBC414A484906FA88D88E83F7BF6313E9A9672EAE549092159816BDDAFA8D00E85F668851295327A67380940662353AF42FCFF0048E1A11A1C41529210A7129794A3D1951B2EC08B12104D877E9B465F4555F80E22C30CCCC3BB9B20961C96D7F507CACC5F5A0C7DA7D389680EA0EC791BFB8E76D7DE356AF10BA2AF283C5BB85ECCD45A5E473129145C2F539B274A9E9A4D7A743E1C16092D0627D8F31709DC8281604FD09F6555F278CBB0DAAC3A914A33692928E7E55FE41FC35F78A05CDD41091A5D872022DFC31592F0AAB9289D98199359C3F3480E6DD79EA6326E410C32DB83ECC1E65C6CA3AF705293B1DAE7A8B7D63CD7E3B9F36831CAB934CE9992EA9697B06217776D87EF68DC5C08A6AA9255DF3CB04036B116F3DBE6F161DE22F91073A786DC58BA3B1CCC5F80D52D8D30ACD281438B9DA625E51A7879095BAD87B5A1C3A12B376126C4EE36D3E187B48A9E1EC6B0E9589D42FF000B50B97226F7633A84B5A92E5282A4025F29624003E7D39DAA707CEA8933A74B421C02A4BDB62581DB9728CDF78197174EF15DC0D601AA57A795318EF2DD8465F63561F20CF1A9509A6A4533F3092B5384CF2E5A61DD4E04A8E924DF7B7BC5C29553712E189155DEA664B04242C1241CA0DD3B104DC1D08DF63A3BC474FF00EDCB58525941459C31172E34D1F67D5ADAC6695B75B04A350D4908B806E77BDADFDE2E69AD4217DD29F33B7307D6DE44EDE6F18D216A98E54A0580243F366B74F7BEF1F94FE03CC8C61C15E7D619E27B29D0BA67C03D2EF633A54BA94997ADD0D97899F0EB6CA4A1C52D83328216855EDB98D27ED1384697B49E19A9E1CAE9699FF8996B1874C58FFF000F5931391092A374C99CA12D331B448258E91ED076EFD86D2E1B4F538ECAA7485B2A628E4FCC8FCC7A9209B3E86F1BEAF0D59FB84B896C9AC119C782679A9AA4E31A4CBCF3D2ED38852E9F52294A66E9EE21B5AF96E36B0165074AFED41D3BC7CFCFC53760B53C058AD577148509CD326AB2A48055995605838395DEF63A468A4996CB9E803289731480144EDAB8DFEDF68B8043885F4B127A2AFABA7517F5DC5C1E9F58D29A01325CB9D2C5B50A0C76E963BB1B45C25A598DAC1981F9B69EBABC5428242546DB137EE2DB5BAF7FD3DAD16DA63FC7525AE12AE9F5E56D7589D0890AD4F99FAC211C4220A3617F7DA2E1413E9E42D6AA849527296000249F523EDA39177B816DE2620817B5F6D87AEDD36F5E9F5F9C564BC4A5CC9E8972E5E54A9411C8DCB31B93BB5BD768A0AC504249BB9D003C8721AEB7B697F3B4AE2378BACA4E16060D5E6FE205E1F97C5D5C4D2E49D12E5C4308752E3ED38E2CADB096D2EA079890011EBB1DB6EC93E1D6BBB520A551531A9EEA48A89C10CF2E5384296C58901F4014A6DB961B5989F70AF12C872C0DD9DF9FA30D99BAB7BD65FE66605CD6A348D7B01E2EA6E2CA454184CD4A5464A6A59D71D6964DC3CCB4F3AE34A65614CD9CB1B36147B0893DA37C3C718703D55448A4C2E74CA1909052B4C95A836404FF0020BF3BEA7C8C5761D8CCA56444C55CAB52DB917B91D7D74731DE1C69D6D5A53BE9EA46E2C49DF6BEDF306DF4B4740CC55550CC5D1D6619512A68252A2649003B022FEE741D748CBA54CA75A33029BB9D6ECCDFA1F38982B6B037BEDD7724F6B8F9F4FC36DA31F9FC3B533E77E269CA6585282B2AC94906C6C18B1D01D2C6FCE28E7D4CB27B896A0998B60FA0176D411CECFF002D621A80EE0FB77DF6E9D6E3F6224CEC17137399724D9803339D99B21B73F5B4527FB7D5A9DA7A6F67CEAD07A379F99BDE2A2834517DEE36501BEF6EBED6FEFD768912787B1352ECB90CEFF9C93E43C3D753F588461D58EDDF274D7311EC59C6B7FEF1C05841559BB9BDF6EBB03D40173FB1F5BCC9C32AE8D065CF942A153834BEED256C5B42C1C3BF2720F50D39385AC826A2A07966398736243726E76B17B7235043616A5BED824E95CBDB9F71D43375A015DBFF0031B137368BFE07D97F16712D64A14587CF32D6BD04A510012CC400C59F7E45A389A8934A950494CC22CCEE011B12C5B6D8973D5E2D3F884E327874E18A9351C439AD98B43C39332CCAD68A14BCD4BCFE26A8948BE94B0D3C032E9B5C85BE2C7A98DC6ECDBE0AB89F88534CBACA498CB28395485B25CB9BE560EE4396D4F4894719952BC0A913161D92C8B172427C3A10924747BB0600EB2FC5578EEE7FE78D5E7B037065855DC0586029F9098CCDAEA8B3899C924A94D266E412C36F940986C075005410424807DFD53ECA3E12780B83282817C494F26656499328F712A5A14E72273A67CE56432D41CBF76263A983B391D95C1BD9C631C473E4D40A499F86A9505852905803E2052188539637239011884ADE55627CCAC46EE39CF0C7589332F12CF3EB9B9A98ABCECCBB79875456E3DADE987D4C25B59504B6DA5614005122F68D9552F86B862985070ED3C8A0A7CA10B1492A5CB9931219BBD9A8654D2D62542F6B6D1B7BC3FF000D726AE8E5CEABA50B564492148B68E4B1059DFCFDAFCEA765B620CAEC4725991C3F620A9E0FC754371138CCCCB4ECC06E6C349297DA71E4AD9712812BCC4A921A58584941165189D594DC2BC5F81AB06C5129AC33124269E729254826E4CB2A2AC8B05D4E90E6E1C3BC63BC7DF0EF4D86E0D5551434A13549BA4A10012EC18B0F201CF22CCF1B30786AF8CC612CDB99A5645F146FFF00A0B37A4D0DD2A8F8DAA0E215218B396036CB5A9D530B9771E09E56B701170157F4F393E227E128D6D155E23C3F4F2EAA89944F7414A9D4C4964CB9E908604120254852C2925254C49034D388784719C11444D91310A46A329018594A05B97CDEE446C2CC5498530DBF2B3099B959942572F34D2D2E32F36B00B6E21C41536A0A41B801446FD77BC7927C57D8E633C1F884E5D4D24C4225CC56A850B02CEE46C5CFA728C6282B952A61454E600116367FFE409B1B36FF00B7251720A892493737ED7B5877B7CBD63AAF17AE952EA9326620BA5012C0683335C1B816F58BFCCA89534A55254E32DC82E09DDF6D2F7EA6EE22AA3A83EBD0FBF5EBF2FD628D629A6CBCE900167039DB537EAD73EEC226217616EA7F61D6DF3115929D573ABD80EDFF003B75FCA31B9EB698A06E1C807A06D3AFDBF29F14741F51FBFA44308683EA3F3FF10844C94906E6DD3FC42113C21084211C85280B2881D090211314902E7FE3E7013546D98FADDFDFF5844B1304BCC82B7B8737E407BBDA108950842108421084210844CEEA6650B00B588236EBD3CE202B487D6DBD9BEB11B1B5EC6DEBDA2AE44F916133F3331D0DF980C796C1EFD6CCE391F97EF04EE76B1F5DAFF908AEA8552A69F3C800CEB101AE6E0060C587F7BEE5992AB73E7FD8C415A6C6C6FD41BEC2DDF71D3F0FC22D899956AFE43CEC8FD19BCD8D8C71DD21DD9B7B13FA923E510B8F51F888A84D456CA07C0592D7C9E9EBB6D6DE3932D279DAFEBCFCE29AF7371BD8589F4DFA13DBA8DA2B70DC465CBAF44FAB4FE549482DA723CDBE9CF945DE265A72EE5C87FAFBEA3DBA5332E99A28975A8203CB4A028EC12546C1449E8124DC9B802DB98B84CACA7ACC729274BD04C9602816FE7703EF43A6E62D9569050A2CEC0AAF7E6E7993FBFB6B8FE3F9861DA5D03860CFC914F2A7302E64BF2AECC36921C436F3D4232A85AD23CBE765E524288BDCE9BEF1EEBFC20E30AC47846BF0794A4915582D4CB20FF5CA91FC324877014A36F38C726A4CAAAA6984B34F956D0865073AE86D6076768BC5C3F566B1061AC395C6CA4B53D4E91714A053A4F325DA5059502459449B126C6C403B18D33ED870B9B87F11562CA487AA985C8D4859BB3FCDC3BDE3703846ADE9E952083FC2961B5D83F26D76F3E91CC9A944CDB3354A7825E66A1CD6D52EE00A69682DA91A5772414A90E2EF716B81BF48ADECF71D34588512CAC0089B28E6722CE1DBDBCEECFA45C78CE90D650AC241BA083BD883ABF9BB93B92072C69F862E70D47C3E7C5531EF0DD5698765724F8A244F62AC20C2D65A9394C40E4FB5314B69842CA590A549D4E7B99CB56A4A9B4800DE3DFCF879ED065E3DC1D4346A9A950A695229D41ED69644AB3DDD295393D35B18D08ED2387174EA9930A2CA9AB20B1DDDCE8CEFA39F68DE269CA4CB961C51F887DD9653856157BDDD6929055736584A8920EE4037EE6364914885B4D09DC14DB4704F3B7ADF58E95549EE1DF62C4B75D34BB333F3263F2EDAC52DAAD5367A97382F28FB0E52DA4900FD9CDA085A803FD377957F61ED68D2DE1BC72529424CE2953324BB6A0B5DC6F1F4FDDB26088C638766D226582A54A218873F96ED63A0FAB6D7C8F780AF1315ECADCE9CC6E0CB16CF095A362443989F2B1730E00D375B936DC138D344F45CF2534E690123CC5AB6D611AD1F18DD9AD07137085471152C92B992652E5D41284F814539A52C2EE7F88A252C34C849D418F1E78DF8557C378D54524D42529993264C65020142890B0465F168C361CF511B7E30A6B98B6991A5B421B7D361E5D4F8295A47522C5ABDAF6F30DEF1F3CF8B60A9C3F15AE921232A26CE0DCD8B331FDF7D368C28BA45FF0037E52A1A16D0866D8DACE2FA472E3ADE70126A561980CD6F307EFF00BD8D399A01B82C4B3F3DC7B9108A43724F3262AD3A0F21F484711CC408BDBBEFFD8FEFBC5D70B93473A64C4D5A825390E52EDE2B37C9FDBD9056EDA92A27494A82ACB295004106CB362936E8A16D37BDF688CD1D3CBA942E44CCC10B075BBBB87E7CFAFA5E86B102624A5B6E572E2DD0750FB758F08CF1E1DF277890C2F318233A70661CC5B48764D6CD3276B54E62A157A628A0843B4E9F7A59D71A79A3E669487DB2156B2876DB6EC7FB78C5FB385499B41553E9662100154898B94B29DD2A28209041F107218DC308C46B30BEF94ACC84ABA116E840BE9AB7AEF182FC5DE109C4870E15F9EC77E1F9C45E23C30C3536A9A465BE28C4B88A5A973835070C889364D429330C38B2436DCE29968365285694A6C3D1EE16F8BCECF78DF09A4C378EB0EA7A99B3902554D4535352CAAA2A032256579A599AA2027395AC3924DC9BD96AB02AAA69667C85948D424A890CF7DEDBE9A5C691D42BDE291E247C19CA3EAE31785699AFE1DA3A1A62631CE167E8F2D4F99612BD2B987052DE6DB5A94DF9FEDCA54A27CC01E99AD3FC3C761FDAA8975BC3F8AD1F7F5AA7452564B54AA842A616423F8099D2C92A21215DE6B736722DD478CD7226F71312A0C425D24105ED776370DA73EA63D632FBF88DF841C492927FEB0C2D99B822666396FADC670ED16A1268208D65732AAE2660B6920952D0CAD76048415581EBEE2AFF004FB4CC33D383090082528226A42731B0B10F974DB425D9C81D9541825756D37E2A505158014078BD08201723403736D1E2E8289E38FE1D15A9613151CE96686923516AA741AC4ACFA7627755324274820FA397BF43DCF554CFF4ECE3052880B907312C04C397CC1CB9599F70D111C378843E544C21FF00A0866F30E1EEFF003678F8189BC797C39F0DA1E14FCCFABE274A412DB547A3D6D4F4C100D8736A52F2015A8ED77160F5E8378AFA5FF4E5E3072553694004BBCF4BB6F60E5DB90D03DA1FEDBC427495301B90421434DC06F263D2FA88B37CCAFE23ECA490977464BE4A63DC5B3E9E6B32D3156448CA4AAB9800696843554992EA5C29D4BE736829012003A956ED5E0AF8009787CECFC4359878653A3BC339494310EE51214092C00671ADDAD110E0CE37C726253414D52B4CB2D30A10A624B00EC1F477773ADA31A79C3E2F5E235C44373B87F05352992185275B5A5BA8525C4C8E249069C50FB6A6D4A4D869F959A4A6ED975136D2B438B1AECA20EE1F047601D9C705D3CB33254AA9AA94C4897290990B290CC262CA668D3512DCD835E3BAB82BB05E28C5152D388D2AC216C162621449720E8537E834E5160EE64F56B19E217319675E35C4398F8AA6965E9899C475299ABA9C7566EA2B5CDCCCC1515289B951F58ECBA9C469F089229F04A4934B2539411224A12548486F1AD202961BFA8B7AC6DC70B7C24E195B2E54DAD900AC0492163A826C74BB5C0778F69A652A4A8F21F034AA749C8B6D80DA529421212DA3CA12121160024580E805EDD228F19C729F16A2954F48B4A2AD32C2668496505E8A162E2E2FFD9E36C3867B25C1386A96929D34F2C0A642500E44DF2B00E5B50DAFEA23E824A74B6805B2509B2CA0586A2ABDC8207A9F6B7D231FC3F0A44B42D5884D254EA21D4588D9829AD76366F3678ECB952E8A9E4FE1E4A136013648E46C5BA1F944B30B28B10875C2568404B1FF00B835D90542EA48B2028A942FBA41B5ED68B4CDA3A9C3B11978952ACF712C90405288624D8EBCFA5AC378B256F0DC9C4F3A2A25255256E4829052C5DB5D9AE45B53BC79D63ACB3A2E36489879A96A5D769494BD4EC5524909A9CAAD3F688FB44043BA90A3FD2B3DF7B476FE018A5062B48BA7AC29299C8CB352A62998CC405A0B05234705C1E578D75ED3BB17C3710A69D324D2A02B2A99901C1637058BFCFA18BE9E0D7C5EF3FB8339A91CBAE224D6337324D97D9966313CC2D7395DC272C421A6DD69C9C525750F876836EB74FF008A54886C212A712EA9E6DBD78ED9FE1C301ED0A8EA95824AA79388290A12E90A42533E63951EEE6B650E08CA165202814B8178F37BB46ECA2B306A99D3254921014A399208B681C30D35B6CC5DD846D9DC37F14D91DC4E61A91C5D9458F6958A64AAB28977F97313C86AB2C4C68D6EA26A9332B65C6CB495250A4286E50A08D4DE859F1F3B5CF83FE20E1DC5E729747325302A3E1510C14AFCAA01887043A491B0DC474E48A39F400CA9CE083A17058733F7CE2E72E1D4A14E3EC1532A520B68B4B38DEA2059D96484A1C3E8E0D7A4DF7EF1A85C4BC115BC373A6C99C829C9624853F85DDDC793DE2BE52D88B900BA8825C722126EC34B585CB0DA260957DE69608B1DC1276F96D7FF003181FE0913733EA9725D81B6FF005B1D75DE2B92B2C5AD76E7EC7F589E2D2A195447224470E06A40F58471071CC7B8888569DFE90C856424737F4FB311A08CCC082E36302F03B036F7DFFC6D1592689C87F5BDF42DCC8EADFE2665725C9239683EFDA29DBFF941FA9FEE445E2461AECC90469CC93EC2FEBA7388BD0FCBF788A5DD2746A0AF43D7A807E7B13DFDF6B08ABA8C049906604876BEC5B577F3E9FBC70DBB317BF3E5AFB69FA98AE55E5BFAEDFAFEFF00778C426C85499AA41D125C1E8FCA3800051E7B5B6D1ED6BFA1D6D78A515727FECCCF3FDA22845242108421084210842264A5B49D4A22EAB9DCFE3EA2FDB71D62EFDECA5D32100788000E81ED6B6B7727D378A05CC01445CB7C8FBDFF00BC454F25C525B6D4137493CC5ABECD3637D2A46FA89DFB1F9C4CC3B87AB71099924A02B3285C0755EE03B383E5D625158377568CDF6468035CB696D6386ECF312EBD2EB85942012E4C265A5D894B006E56EBAB6BDF7D26EAFADFB4B05EC7B88AB96855353CF9F30A4144B085CC7E76234677F3D5E384CCCAAB3149D4A945C101C3062036EC4167D5E3A6D433372E29AE2DA9EC6D85A45682A0E89EADCA4A149BD8956970EFF80FEFD9941D8171C2807C1AA48673FF004EA22F73AA5C5DD9B9BBBC4FFC500921C3B0660FD3702DF64DA2AD2B3032DEA8A70D2F1DE0FA93AD275866571049CD2946D700214E8FBDD877B822DD224E27D83F1CCA0A2306A9B7FF00CBA98D9F74DC36AF7F3310FE301003283B82AB0DFA1245998802EFCA3BB3132D3D2EDCCB6C25D9479254152AF4B2AEAB901D0965E3A85ADE7B5F6B102D1D6B8F7639C59434F32B2AA8A653CC47842664A524103A1019AD6D9FCCC514DA9FE384A54543F99CA9EFA312D6E81C3B748A4E7297A9BF2A995254A5AD5B38DA77D60936EA2F7DFA1B5AC0C6094FC3389534D4CF9F2CA44A98330482DE1625C300F7D9FCC931744CB0B959CB91A313725B47B91F3B9F6C43F8DBE004634F0FACD0A9B2C29CA8E0376858FD8094DC84D255517E695B0E896A5182A36D811BED1EB27C0BF15E6C6F0DC1973804D54E450AC1538289E44A5803A8D74E718D622324D0A507CB31240D4062E0924F51CC5B4BBC5B6706B8C1CC75C34656560BC1D150C35212335656AD1FCA1B05415DAE3E36C6D6237262E9F139C3A30DC5672C2322C4D529C3862546DEA1B47B680C6C87065566954C972FDDA45FFF0021EBFB39F211754F10E4D2F9674B610E31A8F4E59D3CBEFDECAB6DF2E91AA987D5AE8BB998925253312435EDB7A68E7E71DC73E9455D2310540A7771AE9BE9A8F94623BC5472BAB6DE13C03C4DE5D19893CC8E1F2BF45AD4B4E4B0703CDD1987019F4A14DF9B4BE5997655DB4B8AD5600C7A89F081DA54E4E292F0F9F356A9332480A979C801496099B95DB3A5D49075651BB1BEB076BFC3D2E4613DF6548577A729CA792ADE4790BD83C6DF9C00F14D8778C1E17F28B3C291C966671461CA23F8869ECA90554DC64AA4A5588696EA5BBA52891A819A61247955CB16001DBD8BE1EAF15D852673A41EE926EAE809D3572373F38D2AC6E47E1E64C04B9398860080970C93C8B339B92CF6DFF3CC74A1252E2C5CA08527FEDB83B12916048B0DEDD8479EF427B99B9D04A540BEA6DF5D5CBC7D4CF12A0D4226257E24B33301ADCBEDA5B4E51E4E9C7B3F905C46E4571154575C95730BE2FA7A2A6F3675FF00E96467652696971B59E596DD4BAB4BA9234BA9484B80816195E3D86FFCB382B18C12B65AAA115149395265A6C573654B2509009482A5288CA096BDD81BF9B7F1358052534E562B26584CF96929CCD6009274008F32C7CC98FD0BB01E2796C6186A838969EE21D90AF51A9B559771B092922725D2B5D943AA0904A517D2937D00152A3E6FFE247023C1FC5F59230E9464CA54F9B9810EC4AD4087DD9883CADBC690E17553EAC4FEFCB9429936DAF71B061C87D23BC46B8574894695352524CF5148274170492CF7D6EE3D348A797326CCABC8FE00A729E40117E9B80D7F7877F6DFFB5BFBC5862FE9D0790FA4211CC2F6FF00807F5833FF00923E9081B1EA010762080524770474208D8822C7BC4485AA5A8292482342E4FF007F9C4250953B8D7CE0424941286C86C5908E5A3969EDE545B4823D401FA4578C4EA8060A6B3756F3D7E712BF0E8FA6DCB6B98A48515AFCC014B7FD040E52C2AE4875AFB8E8DC81CC0AB0000B694DABA8B17AE93365CC973E62148650CAB29B8208D1AFD795B4B452E2694A2880097CE4BBDD85C326DE10D764B0CC49372631CDE2AB838636E05B3F68DCB25B6708542A886D9529A2CBD232CF4D36B972D14A98F3B292E06F485A014AEE98F4DFE0AB8EF16A8E2DC264D755AA6C8935D46AEED6B2A49089A85314A89494822E92188DB68B2D3E078714227AA59EF14E4973AF4BEBE7E9B3690F92942C2F88F2BF0CAAA743A54FBF2489F917E69F909671E53C89A79094B8EA9A2E28805362A55FA5FD63DB7E26AC9D874942E95926714AE602C5BBC425619DD8806CC036CDA47A13F0EBD9DF0D712E140D7D3F7A512D252FABB7555F9171F58EF6F64FE5BBEE735784E91CCFFBD126C21571DEE96C1BC6314B8FE26B490AA89A10FF00973AC0DB676B58FE8FA6CD1EC2F82D2A6386A4BED9525AEE4EAEC7EEE447258CACCBB9316670BD2D6E1B5FE225599817EBE50F216136F4481D368AA5E3D5524029587EA735DB997D86BEEDBD653F623C009244EC3413BFF2FAB020302FA16D04768A7E1CA3D21015234BA549A05AC18A7CA34A5586C41434920A77B11BEE7DE2D555C5D8ACD69614022ECC9161D4EBD403EF768C8A87B2BE1BC309FF008FE1F2D092419F9D01648D99C2B997DAFBEDF6EEE2DA52544A9A705ACE28A936241B106E34D8741D361BC5AD5515F5ABCCA59B93A1203901C5AC4F3371E5AC67987E11826152C2AA6553CB5001C14A12CDB9B0E7E6E22B0425D40D2DA5A2D8B731AB27A6DEA371D7D76EB72045C69E9B160190090A4B1252EC0F521C0D362D7EB136A78AB07A0B53CE9290CD6500C363AD8B0BF568E3B885AD449F3D8DB56B686A1B8BAAEBB927AEFB923DC916691C3B5F4B573AAE522609B3661985DC872492C925B7B16D36E74353C53267CB0A18853A7380E0A815005B76B3DBAFCC4412D2812406507A1054028903EF59AD436B6E546E4FB457555062D557989586203E5034DBAF227945AE9F1DA71349FC7D3B937FE2585F7B07B0F2B4456AD249E610AE9F601C2E74B10924246FB8209B1171731CA28B124485489A85992E02BC3770430059C681D881A748CCA8789284809A8ADA632D8582D37605D9802FC8D9C1BEF13210928166CB57DD4B79160BBF5D6370AF7D5788512E7D25E5A66208B8B9E6F70E7CFADE2A6B310C0ABA4AD099B28BA6C92A0766D013A8736FD8470AAB4E91ADB069F5494949CA7A9B5204BCC30D4D4BA42AF7D2CBC853480492AB0401A94A2003D6EB2789313A41E02F9430CE80A7E56502C458FEBCBA3B8BFB39C0F1E2B2B928999DCD80B8366B5F9FBB5F48F24C2983B32F21F169CC8E1BB32711E5F6276A604E2E952D529E97A3545E6D41602DB69E5213CD484B0A6B93CA08424742445D6A1780718616AA4E29A1A6A99880512A6A64CA97532E5BB8099A94A56A014490852B2392E2EA7D4DE3FF00873A75AE6D56174CB0A095164E629700EC1C68DB3C6693866FE203C5585D54EC0BC67E56D459999528904E6461995905234D92DA2727794FCABF320A815B80B2F3C46C94289B46A876A9F079C11C5F4D5557C3D26554D4CC4A94294A972AA41209621792458DC94CD5007C9A34878DBB3DE34C02AA6A64D3CC4494A8F884A246504B5C2496F41AD9E3620C88E32B86AE2128F2B52CA5CE3C15880969B5BF23395372915D4B8B483C9FE5355664A61C58274EA9769D4956C951DA3CB8ED27E0F78D302ACAA46198655D3C894B5E6065288397F3044C4852140001D964024462141575F489527114294A66D082FCD880435EFA1D3AC5D4B6F29C49702DA71C50BA6525D130E246D7F2CD1684B9D8EDADF03BF4BC6B0E29D927116153549AAC3AA54505963BA50B8F200FD9EAD72A3C464AF309E0A1C929529214C01B020BEBCF9831C31353A546F2732DD8EE952E45640F62D4C2C58F604EB1FD401DA287FE12B4CA515E195598027F21046B637DBCFE515A716C2D0C95642AFF00C5EE39B103C881A5B9C7256EBC96C38B69E209094A12658F9EC482E59D2A4A36372904DF600C5B28784AAEB2B26C895455128A104A0AD0C09716724EC766D3568A9955B44B0F29525DAE4939824EE0333F9D9B5DE2AB575B7775D946DD501F620CD234057F538ECC32DB7A503EF1438AEF6BED7BFE13D9471AE275B2A4D0E1959390A580B58924A5B3072181B5CB3B16D6E62CF8862A64664CB58704B28017F41B72040DA2C1B8B8F10DE1CB847A2CFCE634C614DAA62C9469C94A565BE199D15CC4588EA6A05B9708128B758A7B6B7085A91393724E048292DEA3A237E7B20F83CAEE24952558CD04C92E94AA74D9E9549952923F3CC98B2400948F110E4EA12924B1C697C455A92495800961BBF20C4172FA722768F09F0F1E2BF8B3E2AEB38F333334B29BFE9B6443CA43797F25392D28CE27B296C30CCCADA179E9B4BCA2B7D45F71C682147944B6124C3F111D8F7655D9960F2F0DC0EBD38A6392A91733119F21C524A9C4A8225CA5CC285AD61190A884146ACA26C6E1418BD7CF733192927C0E3C4A7DD5661D1EF71AC65E4582020283A9D2DAD0F0B0252B6D24A1D48B043C95156A45B606F7ED1E5A570CF5F3729397BC521B29B82A2414FF00E395AF6F1022F19552CD5CC0EAFE90E3705CB1D1D88D03B5DD9DE25F5F9FE1B0FF009FAC71393DCA425048CD753EFE11CF7B1FA08A95120A5B737F9422922284211037B8B74BEF11272B10412A2D95B63777B8FD6113DD02F706DFBF7FC3FCC44696A8242CCB504B12F95C16E4403FB7A453A7BD3308259235077EA352D7DC8895C42DA046A0B5A85D0803CC01E97B6DE9D7D62BE80D1CCCA89B294B59B060352586E1EDAF5DECF104EAFA6901E610920905CFE66676BBB79B6BD23A8621C5941C2B47A9D7717D6E9D85A874C47C44D566AF34CCA4AA5948D4B4239CA1A5691B153E8434BD24B0B73CB7D82ECF3B16ACE35AAA6974987D4E59CA4B2B22FC44B00C90E18BEC39078B657D7489D207FB79CF38A400004BE63A952B5B1D0077B93CE300DC6478FA651E50D72A980786BC28E679634483292F5261130DE1E909F410D170CD3E584BC12BD4A216DA987083C9538DE951F53FB16F80744C954D88639293494682954D9935330A859CCB084A55333382012909041721DA20E1FE14E35C62A9225C89932529418250D6240D580B0D595CCB4613333B8F4F127E25669C7316E6B4D65AD027895270FE0F5CBE1F5CA4A2C85B52C87A8ADCA09B5B634256B79D52884A964EA11BA3807629D937074E44B9783AA6D6C82512E7CE2522614B8CC519C801C022C1F70ED1B5FC31D82565751A2657D1CC33549495008218B5C936737DDECFCA2D7EBF96998B5E74BD8AB3E73527DD9A56B9A2E627ADCD6B5A8DD4415D455A413D00B0B5B6EA63B329E470B5304A65E1985B200033E1F46B36B788AA512A2DB97BDF611D9141F0C941387F128A71275BCC07AFF330F31FBC51A3E5963CA1BC66B09E7DE6761D9B4D8279D886B8CA1DE58013654BCEB8A015606E6C77E978E67D3F09D524A2A708C2A624F2C3E925A83FFE4896147A0760C06822756FC30D04A4954BA49E0B59D4B51B6AC3391E5BFB5AEC72AB8F6F108E1867242770F661CD66D61B90790EBD43C43308ACBF3ED36425D9044CD792B99964A9948502CB8DA12B74AD2AD6551D65C43D8CF66DC6B30D2D5E152E5AA6864CD401DDCB725F32259761D10A2DF96E008E98E32EC427E0F37FE969673A525403172C0E9B35B9EC7CE3609E073C6C724389E9C6B2FF0037A4939319A336B44A3F46AD3825E9534F25294BA86AA6971D4B4ECD15290C043881AC84829EB1A1BF11BF07ABC130DA8ACE0DC355329B2A97DF5382B0A1AE6C87F8C848DCAD09667360F1AF38E609C51854E5A132972E5A4964AD07406CE4A48BFF00E24DC4646F8C5C0CDE6D70AD9DF81995333CE632CA8AF48D2D128A13087DA9DA7CEB4D2E59D41521E52814941D45C49B900289BF407C38E078C766DC57455189CA99227C8AE92A945492005266022CA0016BEA1BA3458654F417189ABC62C46977F47D6C7F578D7EBC24B13BB5DE19061C7DD52E6F01E35C41409C2AB24CBC8389916E5D9527B2B5CABDF6A46BBDFCC488DBFF008C0C30149AD4A58D44897509527465A1C11CEEF63A5F9BC77676778822A3BA4E77CAC94E8580E7A9240D1BADF9E542725C30A2DDEE0A10A041EA945CA0DF637F31D47FAB6BDED1E78E032D3579D154490851DD8D8B7401835B57BC6C19A99D2E4812CBA5AEE1C37933EBB80F1D4B1DE1CA6E3AC178A309D765A5E6A9588E8B3949A834EB28D2A6A699536DAF64DD2A6E60B2E85A46B1A763B98EF8EC578CEB385F8DA422967897241406597719D162E08B8D459B71A18C1F8C706958E61332555CBCC120A835988046BABDDD83D86F16EFFC3B59E551C84CFBE203C39F30AAAEBB3183E66A989B2DA66716196EB126D56D997986A442B4AE61F986AA089AE72921D2DB2E0D7652C1FA0CEC7B8A24F1170DD3552BBA4AAA643AA5214E94CD48026109FE54A9449969B009D0001C79DFDA260F3A83129B264A5425A1647E50E41360E46A1AF7D6F7D63010E8494D94350B7E207FCFA7B46A3D3338B3B93AED6FDA3EA131A9399040E40F2DF7D35DFDC74F09E22A942A19515C7255239D4E4AE79214095361B46A529045F495684D8FAA77204766F0DCC9444992B3FF00AC951E81C66B5C976B82588D846907C48E062A302AB9D949694BD47306CDEE435EE7A36EFDE1738F9798BC0770F18B1F75D999C7703D3E9B5171C525C7153B201416A2A493B143C80012163492A16B13E15FC73F094BC338BF14CA8044AA898CA218975A94E6CEF7FA72BF993409EE265420021E62CF3BA5C01B9E6DA0DB78C81056A492011B13BD8FF7F4F68F38AB96F4E10FF954DE400B020F91BD8F58868521557354412A48370F7399886F3F7789C1B807D45E2C517B8421084210842108E287036A374A8951005BF01DFE7DBFC45752804DF64EBCAD14389826953BB28017BB9572F2368F15E22B07378FF24336308BCD87515DC0589E450C9495175F7E8F3ADCBA52122FBBAA4F4B1DEC37B46E47C28F10FF00B6F19D123BC293F8991BB1BA92799661F65A24A7F874B2D4C6C92EED6E8D6D7D9C8B1DBF3DDC85BD1D7989825F4AD28C378CAA52ACA15605B5FF003279A08B13A868280A5277D88DAE63E89B139A6BF0CA2A8242C4EA2A69E14096FF00B084B83B8F06FBEF78DFEF855C6325225015B04949209D49B02FAB8DB7B9B08B842AD2AD2411DB576FF36FA461A85642400CC6D7DC59EDEBCF40EF1E8561EA456119C0620172074BB5EDB5C0F4110710DA6CAE6581DCA82566D737B00137236FE906E76EA2262A4CC9C52C09CDA79E8C4681833E97D4DC4565650D2210A5AA64B41F3034D7CBE47503A70AB13D214F91339549D669F4F646A5CF4C2CA1A401651BB2019859B58F91A55BBDAF68AFC3F86EA2AD655DDAD85BF2FCEEC2D71AFE91D6FC43DA2E11C1326677D512734F4AB2A4AC12E06CFC9EEDA45AD63FE2DF06E1B77E070A73F12CCCB9500F30C96A4798905239899C4B0EA91F7BEEA54490362378EC7C0F82D6ACB9E50008B022E4BF20EC741761EB1A55DA77C4BA65CD988A2A8252EB6C8A0CC0D9C86E970FB08B4AC43C56E62D75E996E4A7114A61C52CB4C4AB2EB6EA413B0D6A64377E83659DC8ED1DAD85F034AC89CF28330CC598BB166D0F3F3F58D63AAF88FC66A26ACA674E20122CAD3AEB702CC06BCA3A02B3CF345360713D4AE46E04ECB0B1F4DDC0458ED620456AF81640516942C4B02069E46EFB69186D47C4971A99F311295546585B26CAB279D9FD2FA73D23992B9F39A88F3338B670006EA0E3F20E1B8ED65294AE9FF68B03EE6203C0D20FFE881C88047B38617F4B74823E22B8E124280ACE764286A3958728EC725C4B66ACAB8D97312A9D4A41F23B249285AAC426EF372DA6E5440075D89B24122385F004A9A8EEFB91C8300EFC8F97D22E523E26B8CE9D48FC42AAD32DF749B6BFCDF527AEC5A3BBD378BFCD094F254E5E953AC9FB88703697562C371E54F5B9B5EDB7A6F165ACECC920102597035CA37D1B53C8B3467D807C55E2895A44F9D358104B953DDB571A83CBD7AFAFE1AE34692F34A96AFE1C9E69E4E90E3924A91424036D452B79F426C2CA360AD561B0DA311ADECD569CCC87B924005EC3AFBF2F9C77B605F143267213DF4EBB004A9406A3CC5FA6DABC5C6613CE6CB5C5CD3029189528A94D00D2642A41C69F97709EA0BE84C8AD1E616710B55C8201200B61B8870157D35485CB42932C241206603ABEDA6874FAC76F603DBFE01894B126A66492A51BE628D4EBA9FD36DCC7A55428B42AE492A52B14B91AE32A41E6CD4D7C3BC1095742C2A5D4A652B1D504E9712ADD1624C5CE969E5E1A902A90429296CCECA1EA082C5AEE59B980F19BD4613C1FC6F48569148A5CE4900B21C9201B0B7F516FD23C1E77217F97D43FD419638D311E01AECBACAA566E8956AA5203642B50D53928F3334024D88D0E103D2FBC713712E1DA9229AAA453CF44C390A6A254A9E03900B77C159736F9407B3EC0F41716FC31D26253A64DA1928CAF9FF86185DC8BA40701AFEE06A0DD365871B7E253C3DCAB149C279E752CC0A0CBA92A3298994D57A7E6128160DAA7310CB3EE5940149D33009BF7B4605C6DD82765F8CA26547FB651C99B56D373D390C82A724E42ACA181B0096E4356E88E24F873C4F0F4A932A4AFC2EDE156C6D7624B73B836BBC5DCD17C7978EDC38D3E9C4991D83EAEE4AB52ED29F0DB6C4C4D17028257CAA7B8D498594A16B51165100EBDEC23AA47C1F767D5B97F09916A98095AA62129968B064B0014E6E2C0DF68EA1C57B12C6E925CC9EB92B4A520ECB7B6B76B681CB87F38F50CA1F1ACF102E22710D7304E4BF0D186313E24A52968A8B72532DB4696D25E0C1995BB509E9794490FADB404B8E5BCF7B5818C5F1BF83EECD387D02BB13AB9186CA01C4E01241524BE520824D81B80D6F28E92C5A86BB03A85CBB950514949517E5CEF6BFAB6A045CE4C64EF8E0714EDA6999818D70CF0E18426D2029C94AA619555C4A3A2CB434FE115546A087792A572D4E2D2B0E006E1636C3E67167615D932552E5A2562D53252596A120495286A52C5135C1E801DEC62810AACAA63303025D83A94DD366B86D7F58BA2E1A3C15322F2A31149665674D7AB39FB9AD2EF226DCAEE339D9EACD20CDA55A8BC69D54714C4D2C1174B93926E39AACBB858046B4F6C3F1A61786CFC2B8366270AA6CCA6451CB95256A252A19664D9404D988BDD2B5949DDC08AE97869CD9D4824B7F33D8F406C2F7B01A6D199AA7D2A9549625252914C93A3CAC9A10897629AD89797974B32FC865B62510132A9692129FB3E584A06CD8012911E6871AF6B78DF15CC9E712A9993A6CCCF98B9B872C9B3000DBD185ECD9251519094B8B387491AECEE390D1BA748E5A414048164950529F02C12E3EA75479C06C428B452952459208F28B111D554C65AD7DEA92E58F8945D4D7B33A80009241673B9D4C64B265F760B905D826C1C240162753773E4DBBC5403ADED7ED6EFF3F7DBF48A4AE5E69C024B8018EC06A74DCDF5F7D6DCA9473B316041B9D9B6BEE47F6845244E898A4817DADB7E708842812D77BFCA29856AB80924FADC6DEF6EE7DBA6DBFBC490A0A0A0E42487001BFAEDFABC4A99332CC422E01373CF4B37BFE912252A5072EA03CBE50A36DC7624D80E9D49F9464F33134D552CAA1A7965535404B0C87249605CB6A3FC447553532649502C403770FD3CCFBD85FADBF7127C4B654F0AF96B89B35336312CAD06994D90755489379D49A857E6C254A4CA5325FCCB2F2C20E92F25B6F71E71D236CBE1F3E19718ED0EB29264CA49A65CC992C84996B01944396093A072543401DD8DB045D1D763152A45385AF32AD95CB8277D1F6E67EB1A46715FC7B7119E2338D2A4D3759C41963904CBEE4BD170CB2FAA9F3F5DA136BD34D7EAE698A2CCE3EF4A250E388987DC690E2945A02C0C7BC3D9BF615C1DD92E0B425345435D8C53489495CE500B97296103BC0944CFCF3133129F1E5524B1214418D98ECB7B03C5F169B455357226A64CD285F8926F998B9B75E86FA08F30C138170F6069644A61FA4CA32CF2D0D4CCC4E4BB5393D36B4A4054C99F984BD361CBDF4279E10D83A50024003B465F6A66850BA214E90951214A125001528DD49CA9600BECD7BB47A7FD9BF60F8461541226D4524AEF132D1F990926C90FA8279B1B6BEFDEAFA6ED052DF964DD4C87EC879A5ABEF6971AF369DD400D7D2C0F78C7314ACA2C625AEB10B4A6A49CC10157B9B8606FA97DF6B1B4771FFC7308C39A5A244B01366084B5B4B003E4E6C4BBDA29A523FAB58B74D2F3CAB7FF00DD67FE778C58C99EDF99577DC8B3B6DA74700758BAD2C9C2E580F2A5863A6506CFE4F7366DEC62294A5BBE90A59249D4F28BC45C1E8970AD2074B0000DA0254FE6BD0EEA3A07E77B44CA99585CC040948B8762801FDC7D3A7945441085978A96EBC41400A4A1965A411F79B431A0176E4F9D49B90120A88168BA51624AC2489D349241D49B84EB772FFE1CEF187627C0585710AFBC54997E1052F952ECE5EE436A6FCAD1E5798595987B1B044FB3CCC3D8865D6DAA42B74A5B92532CCD257A9A9D7E6A554DCC9725DCB38820A8123CFE58EC6C1B8A308C7252A96A65C9529485CB5A66CB44C44C42865295CB582852540905D26CF1AEFDA8761D86AA8A7CD974C824214414A0588720BB3D8EFCEC1CC665FC2AFC52F12A2B14CE0A78A3AA99533ADAA9597D9A15971A2E3CC280966E4A7675E2661ED4AE5F2D242C7995722FBF41768BD8161D886232318C0E9E5CA49A997326CA96923BA566CCE3F94A14FE101D4194140067F27FB5AE07C4706AF9C99125484216A2E80C960A3AECE06AC1CBF5BF4CF0CC9B4E08CEDE3532550A5372D4ACC0959FA3CAEB4DDC944CC56D4FCEB090A3F62FA56C94A810494EE00B475F7C4F70AA95C2F8695054C5CAC365D3AD4A0A242E424BA0950CC549CC3310E18863CA6F64F5733F1224920A92B620FE67703FF8EC6E2FEB78CCBB8E2DE4214B275140B057DE40DB4A15FF00926D6245C7707B4793735030AAD9F2C9CAEB5063ADC97B0B58EF61BBC6E24896154E92AB9CAEE06CDCDAEF72F7F91891482A69C4041755A524363A2CA549D940F54804A88FFC45B788B0EC597418B53D64B24293312E46ACE2E79E9F51ADA2555CA973A9D72AC4A9243303B6DF472E7A68230CFC7326B5C27F169C38F1EF800BD2030D63790C298F154B4ADB6E6A8D3AD3B27353152242187582863984BCA279BCB576247B45F089DA9A6BA8E4E1132A539FBB44C9685286799312529EED2F7FC8A5AC8B2591CDA3503B56E110F36A932588529CE5D2CE0E83911B104E8EE4E3C9C20A7637363E87B7B77F9464B4E3C5761E271F41ADC0F6D9E3E8371212D48CC1419B5777D43D8ED7FAD8C797E6EA3565B62F4A6C14BA1D4398576094A112EB29DD5B0372AF73D3D6D92603513D78B2244A42A624655A9280A2C01B9B07E7A6BAECD1AB7DBE53495F09562BC2491300F3CA34776E4C7CC5E36D2F0299C72A1E1C9938B5AC96D8AC629A7F989B16E4A5A80B60A49B5D054FBA1253749B2AC4DA3CA8FF00504453A38A31594A5244F5CE52BBB2597F97FA75F96DE71E422D915D572D2E0254B214C59CA94000742435C0B8717D23314E0425A3A4A6FB0DAC7A03B7FCFEB1E47D7CA32D0A4CC4A90EA240208E5B9D7D35FA718581DE4D2EE49D5B6720FCDB76D209FBA3F7DE2C11733A9034BFC8DA26842108421084211414D8D48F4D5D7D3F771EB1574B62B3A3A0805AC4DF7D39450D72553652512C673DE02000ECD73A740D731338D30EF31A7501E69681CD6F4EB4AD03771040BDD2B4DD36EFD3DA3BC3B0AAD9D86719D0CF9CA32A4FE2A493356E940016904B9606C0B9F5B452D613268529596514A86570EE5ADAF5DB73A388FCF2B3BF2F26F21F8FFE26B29E642D99238D26AB94C4389E525E96A9C8CAD55B725F504971A4BD30E36168D48D6DAD37D48508FA61E06C464F127675C375D453D35AB4617F859F325284C79B255326292ACA480B12E62014D884907420C6E17C2C57C9955D2E966CE4CA33662322545B56167D5CF983A58BC76A0E25F1A0900D8DD4748001EE49B7B7E178A04CB9899C5131241CCC0301ABBF2DAFF663D2EAAC630DC12994B99592652908D54B0901D2EC6FBF9318F10CD6CF5C2B95AC1949A9A6E7B1025B53723232AA1349D400B7C5219E614A82880438526DB91BC763F0E70DD5D700B452AE625B3254104DB90700374E86DAB6A776AFDBFD26088A8452627254B405B251303D9D9803AF2EA7DF1A398B9C98E332AA2E0A94F4E352BADC12D4FA74D225DB6D2EA87D9B92E95A4BCB5D93A1252A234A86C5568EF6E13E0F404CC13A53109BE64B1CDC85BEB71BBC79DBDA176DF8E71956CB934F327CC44852C128528BE62395FF0097968FCAD709C37F0139F3C46AA5A76998666F0CE1C69E417310E26939BA6CA2985DC739A4B8961FA80360409343EB370AB69D463B129F87A453B6596905C1609BEE753A00D6D3E66313C3300C6388D693512E7AC2F52A0A6BDCBF9EFA6B199ECA7F066C96C3F2F273D9A75FC538D6A8A4A0BF49A7CC49D3A85AEC35203CCB327544B60EC0AA642ADD49317D914A89432A52C036A007F205CD887FB11DAB83F62FDEA52B9B24826E428286ACEDCFF47BEF17668F0D2E0DE5E5DB97193D4C5686D0D0E6566BCEB8342401CC70D5D456BDBCEB2A5151B924EE638553B92420B126ED673736D3D3A467345D92612854B97369505401CC480059C392E01E5A75EB1F2E6BC2D78339F4153B95B2B2CA37015275DAE36B4DEFBE9356FBC36DCA7BF4BC71DC16CB90B7908C8D3D94E00101E9E4861CC6BA3B0E77B3B6A2C18479F55FC21383E9F43A24E8F8BA94FAC82DB92588669C6DA37049089F9D7A5943A821C6D440DD365011C042A4B14CB512F6B3EAFD1BAB5BE516AADEC7305AF49A64C9952CAF45D8007567760CDBB9DB78F01C69E08B94B502A770666B627A24FA8DD96AA6C53A7986C760A70539F6F6DAF757B7B0856B5AC5E41EA72F46D00F96F6BEE7AE71BEC2A55085AA9594521BC04923AD89776F41CF58B32CCBF06DCFDC332CECC60EAED0330649AE6A954C2EC9D2669686CA885075D553CA96B4A41294AFA9D29481B4502E94ADC9907723C3BB3E8CFD0B6FF2EB1AAE05C630D98B4C99352A009CB942890D70EE2CE77EB7B698CCCC3C9CCDFC9CABAA471DE0AC5584E6651C28957D74CA84BD33E192AB216D56C32649D1CD0E6FF18B36B1E8413455382A27C9528D382A20B0CAE599998DC5F90373B45BC2F1EC1E7A4FFD44B5D94124281B68EEC3C87EAC0F66CB4E2331BE067FE0A767175AA529D46B94997C3E6D7B25499852C92E27728643A54B36484AA3A7789783E7CF337BB9331249533A54524B59367676BAAC39C772F0476DB8A70FCF932AAEA264A40287EF14C19D8FE7B10DB5EFE91928CB7CE3C1B99D2ECB1213EC8A9A5B1F1143985A24A602AC2FA5B74B0F2D37B8BA49F99237EADACECF27A533679514AA5A4AC02E0E64DF6E6D601FF58DFF00ECD3B6EC231B954D2A75753AD533225454B41605B57B8FD39EB1EA09429E2B4869C25B27981B59496FA8BA885274DAC77558758EA6A8AFC5A9EA552EA67AE54A9530A1E63846549D8AAD71E91B335585E13C432E54CA29726A814254A32C256012C751AB83701CFD23AEE26AAA28744AA5414E252DD2E51CAC3A87969742912EDA98014E12A0752A69361AFCBA76B6F1D8B8157D64EA1CF433BF10C2EA96CB6722E40B59DEC34D43474CF6ADC3D82E0B80D62EA132244E1296425602540E55598DEFE568CEEFF0E5E4C2A4727B367887AC34A1399998B0D3A90FB92CC95990957E7DD9A32C669A3CC964BCD4B8756C6AD2E1681502A00E857C7776A58B70FE072F07C2B1614B574EB909A81DEA4295304A589AE012CEBB91B1B168F16F8AA7AF14E2EAD909967F0C85CD29580027F3B000F95CEBA0631B28AC9B04852260FF00DCDA10D293BF7E72529DBFF0B937D85EC078918EF68F8EE2555306235951521DCAF32C82B7D3C3CEFA5B6D35B850E172D0332C2410400540A8162C1B2927D3C9EDA4028136B11E97FDEDEDEB187D6628BAF9658AE5ACBBE75A89BDDEE4ECDE9EF174551CA67006FB973EEC469AC4D165974E0A9E6AC6BBA85EFA92E75EBE4F09729282592401F3BFB11E43DDE2900A2A1D45CF522DB7D6E361F3FC6209EA32D652953A406195EF6D8D81E8396A22A89194017E67D496E7AF97CE2A902E45EE36FD07A7BC49432828ACB1670E6E4BEEF7761C8BF2668A59A14569CA0B39CC46E001EFFDAE358404B5ABF2A4ABC81FD408A88A848D16BEF61B77ED1C042C9CB94E6E5BF4F7E5FB44AD167D4F2DBFB811C7407374A6C0ACA50906D75ACDF4A137EA5563602E4F6117BA2A450A6A8336594929F095037716F37B30F360E628EB0A84C94B03C28512B3D010E4B359B998F24CE9CD8C2B91196D8BB36B302A3274EC2782E9EFCFD4D7393ACC921F75A6DC5B34F6DD79C6C2A7664A4966552AE7B896DD2DA0842C8D99F86EEC5311ED0789A8C7FB65454D389D2C664CA5A900155CD937B073AEFE716AC52AD754052D203366AADDDCBFCEFA3B00F6D0EBADEEE63447E2BF8A0CCAF120CE5AA663632A9D4E87925862AF312383303A1130CD3AA6D25E52589C12E127E2872591776EB4FDA7DEB2A3E893B30ECDB02EC9B86E96548A6A64E24BA694B9B352077B2BF8779284BB254491DE2C8CC0A404900A9F68BE1EBB29C471CAA913F12C2E7A6515A559A6C92124020B9253A17B03625CB6E38F232125232AD536565DA9495966D0CB2997683494B4D00940012058040000B6DB7A4438862757595B3D6A5A84A5AD65291A24124E56602DCFCC728F5DF87381706C0F09A212A5494CC95252E909402E129D99B51ADDDFDF9FE40021054423CB75022FDEFB817EDBEE3E5145328E96A85C34C21B36971ABDF7D747BF998C90623364B499682258B066667173A7D058DB66450A30A5522CCF44E0509D519EE43EC1C9BF5DACDA472AA7156EB54C097D89E5EF7E9EBCA1159F8B2FF94B7917FF00FB629CD025258AD2DD08B9F66FBE508E3F16A7FCA5BCBFFF009FD3D638142925B3A4827A3E96DB6FA69AB422867A7F1B384A59C8950D4F8400347D2FD791E8C4264EA09C9972939D0A05CA466B93D1C69D039D440A0B88711E5D0A6D61DD4403C9D2799A3704B9A6FA129BA8AB648262BA46132F0B29A8A7AA429563952BB9B9E449275BC48C6A4FFB9514C9532513990A0CA4DBC42F66BEBA6FCA3C6F38701BD89284FD5F0E2DC90C5D86529C4B842B92CA53151977E4C29C326148B39CC5AE5DB2869492B55F61BC76870DF119504CBAA49521442559C020A5EE6E3F35EDB837B6B1A51DA9F6492315A7C46A3F0256B12272832092EC4836DC723A9B35A3DB7C2433BB11E29E31F185471838E0C4B8EB0AD569F3C1D05B53935465CB204D388504DD4AF8E2398A1BF63D63AE7E22F0BFC770AAE74A42574F213326E6431093529B249D8A7BA720B9BE9A13E6EF05E1D3301E24AC93894A3421357312813C6474A5458F89AC5CF2008F28DA854A2B529450A4124EA0A4A9373D3500AFE93D88D8F68F0B78E259463753DC8252998B0549BFF35DC00D650F4B46D9CB9B2E6D0A2648509882900290414D803B166D7DDEF13CBB8A6DF6D482906E41B916B14906F7DBA9118FD0E498334C504A8390542E48F6D6CDE7168975673E558290A39731B82492EC58D8D85ADADC18F00E287282899DD91198196D549444DCACFD0A61726AD05C996EB72E9130C4C4B5AEE151710B48522E4EBB026F63B5BF0E3C7B3B87B8AB0FCD5429822A258495AC049739487D829248E80FAC629C7F831ADC1E7CC44A2B2A4288616279B8F773BC6BA31E9D800681BCAD1EC44C91FF00464907401EE4585F4BF31CBD84792678CFA2999638B661C017CEA4CD4B21B3DD4E32E276B6F72542DD2334E026918E2A7A9208553A920A998A8BD9CEE5FCBE66351BE216BD349C3B5925445D332CE6CE9D9CEBA9B6B1B82782C61898C29E1D19032B30D299357A6CF6206D0A494DD350448B7700F507E17A81D6F1E2EFC7EE289AFED57144CB5E74A56A49F1020F88D9816F5FA5A3CA1967F115152B0011DE2D4E43D892EC762DA1E57DE32BC36474FF00B761F231E697134C1327CB4A5AC038075CBB9676B37AB9F2978620A274D17BBEBB37D9D39738E427A0F90FD23128B9C46108421084210845258B91F21FA9B456CC4997229D406555CEBAEA7DCB7BB44129250B528BB7EADB3DB604B31E7BBF0661C719E6724FDA5D84F426E92E8E674EC13ABADADED736CFF8671C12574A33E556648052C08B84B82CFC88E7B9B03160C7164E4CA49637B697258F2FAF5B5F4E5F1DECA87B2BF8CFCA2CF89060314ACD192A661FAECFB80265DAA926A53326E17DD3A509D12AFCB295AD42C83726C447D10FC09E3A317E06FF006498BEF589AA92952B31EF274A44B9AC4920782520816172EF1D9DD96F17CBE1EC5F0FAB5CDEEC4A5CB330E6CAC12B0A0F71E8E3D0C613B3BF897A661C969DC35835499EA93C971B9BA8344B89975105254CB893A094EE76BF4F7BC6ED55767AA9D5826E42139AE02497166660CE5CB38201BEE23BF7B41EDDA5E214CB952EA9C2A594B2661727281B17B33F9EFA08B10C278571CE77E3C91A0D025EB38CF11D65F4896A2CACBBEE3DCE797A7F983F38D34392C24900A16EA1002493B5E3BD7847034E1F4A842A4A50128B3A41623405C13763E47A346A462ABA9E2DAC9995732685A8FF003A943C5C8BB6D7EA0F48D8FF00836F0A0C2D964AA5E37CF26E5F1A6345A6566D187925B552E8E1214B5313C862C875C529490398E1559A50DB7BE634F2932D730A400E6F66D5F6B75BB74D1A328E19ECC27D22CCD99289EF082E52ECF7704DB77B78AE7A36686429F4BA34B0A7D269F4FA65365DA0894A5D31A4B52B2413609B252A55C84F97751DBB455C6C570B6009C3E5A54A94900009FC818BB390E19AC18ECC7998ADCE1EDF818476326A5126584A5297018D8338DF4D39F3B79C4A5A2AF30EFBF6EFBEDD2D6F78AE487487BB80403B79756D75DFCE382A0BF1B839AF60DAFA34020A363D4FEFDE3961C87B08E2260402094858EE93D0FE9D3AFD20C390F611CA4949046D13F31BDBFF004E8FCBEBFD5F85EF6830E43D847135A6865006CD700FD45FD629FC858761E9EDF48651C87B08B54EC165CF2559125F7291F2B6FE7F48E9B8DF01E0FC7D449AA3E33C2F47C494C7DA5B45AA8D3D1373002C14AD32AE29256858041484EE146F6DE28EA27F74A0819763700EF66007D6E446238A767527149E26AA5A49660C1AF7D2D6F6D6FE5838E2C7C20256AD2F55C6FC38BF372134969D9EA8E05A9B6D3466DB405B930AA6179965D43CDA3FFC74B4E951510129518B7554B15082084E8760E4373B7F88E89ED07B2B9D225AE6C896A0CE5D014347D0A6DADB4D630253F4EC759478A1E939FA55730BE26A1CC2982ECE33312AB94536E589982F213F1282A49D37D62C0DBDF03C5307EF73A4A432810C007B91B6E3A36A4F3B75D70CE318970955A10A5CF025AD3AA9603037BB8B59FCA322390DC4253B1F3030F6259A149C4520121D7B572935255826C0AFCABBA813E53FD5B4744F1C766C9ACA69825A594A51629706EE5AC7A06BF998F473B12F886A5A4912A5D45427326584A84C98F719458294480DD06D61B77BCF29AAA4FD128D81A94102B78F6B323469096974EB9A7A49F7343A8084EA5282CAD876C13BE8BDFADB09C030FF00F8461758BA8392549A79D3A62964654CB407CC4AF62ACA39B961165F880ED569B89A9A7269AA1CAD246542F5716663A5C5C3E91BDEF01591F25C3AF09F93994922D3685E1EC17457EB5E4D0F8C4537212CBAC29CD81BBD3A5D5AEE012A17EDBFCFFF00C66F685378BB8E31239C844CA99F34A10A3DDA4AA66664BA8B84DC3B9B3C79F8A923F1932733B95788B392E2EFBBB5FF004DAEEE5D5CD5A937DD249F6D8F4FD3F3DFBC68B4C524B82012E0BB8BB5C3FAEE4EA22B51A06245EEDCFF00C369BC72748BDFBC51AD7CB5D2C2C1BEDBE5AB4554462917F98FDED08443087484224045CF626C6C4F7B9BFE3B7BC5C697C0852B98EBB6CCF6EBA7E908A9636BF6BDBEB14E89E4542576FCC2C40259D83EBE5CBEB121572AF33CF57F7D629ACCAA4176694B436C254F9712A290D06C02A789B5B53771A6FD8AB63BDBB4B87B0B9FC478A61985C996A5FE2262107225CF88A6E7280F627A1BBBEB16FA9A8C88327C39A73A58B9373CDEC093E679BEBA6778DA71935EE26F3E91C1F656565F94CBFCB99875799D334E7F5D3311E2075E6D971130EA35B4EA29E996994B21B50004E39F7AFB7D047C24764323B38E0DA6E20AFA74FE2ABC20512548095CA12D20CCA898E0121D6912F44ABC565338ECDECA3B3BA9C631BA7A8EE14B97DE254A514E677513941219AC5EC768B0FA451E9944A53147A4B09669F4A9666564194EC1C742425D7937EA3C89248DBCD73B18D96E28AF4CE6A94ABC201243DAFB30B103DF9878F60FB32E194E0D85D3A0C844B5265201025A42AC058B241DBD01F37FA4949425282A2A29012544DCA881626FDEFD630B9733BE4899665DC375BFEB1DB19945C1240BB072CDD06DE513446E468488E21073A3DB941CE8F6E508E18721ED08418721EC2108A69A82EEC6EFA79DB4BBF3FDA2A242920B167770ED7E63CE207FB8FD444996179D8AB30D85C903DF76D3EAD15134A5495048B80790DBED8E9A8E713B96D02FFF00691F881195E1D332041258020B39058EADEDF58C2F1BA74CEA7AA494A4854A58BA5ECA4B3D83962368F21E174AF2A7C4332AA6F4A69F46C5B306940A7CA959AA4DCB09AF9ECDB5A80DF707D0C5E3B4447FB876638A84273A9292A700139532D6EE7903FA8DA3C8DEDD785E652713AE6A11DDE69E48284E424A967FA5AF6F96D1B8207D2B1A52A2A09011A95D490077DAFD47D0F7EB1E0FF17C8553E25896701FBF9ECE1ED9B6E619F4319B70B4BEEB87658513648D6E7F28D497D87AFAC12DEE55D0107D3AF7EFB7F68EB2739105CD94D6E56DB97EADEB45312B989003F86606661B9D180FB0F0B15794004AB600F424EC01F63D0FB476070ECC34757435E145065CC96B24129200BBBEEED737370CD17DC5D299B82CC944329528B0604BE536F1737F23CA3558DB9BA7FA74DEDF4F5FF78F6EA3D51C5670A6A13A0F0F36D05EE7993E71E01C43BCA9EC2F43C2120853957C5D8858A54AA1B1A9C710552E85A023CC08587C0E9717B8B11197607365D0D2D462534E59349227D44D568909929CE5C8167BEF7DAE63CE4F8A1E2029A1A992951F1A5490DA02410EDD19FCB6E7BFAF09596FFF0049786DC94CBC5321B4E14CBDA153D0D22E94B2EB8D38F4C24024A8956B413AC9370371BC7CFCFC4EF10CCE21ED1B159CB9BDEAD5327A8ACDDDA62D8F8586846DA7520C79E782AFBE4D42C6866285AEEFADDCE8C0F41D22E554004F96D627E63FE2F1A5D3CAAA7139A955DA5A8005F549D58EFD34B45753CBEEEA66302C413A36E6D1507416F48B12832943400903C9ED1510886108421084210FD221A4137F4B6FBEDDC03F3FEF15336685CB932C5D49DADEDF3F939D624D44DEEA59274B96EBF5E46C768A4BE436A4ADC4254A51290557BA428596E26CA02EDA2EBDC11B6E22E32E44FA697267074DC29C07D0BD987CFD48778B70A5358952F6059CEE4E9D1C9200D7908C16F8FE70F5FF0058B826C498D68D21373B5AC9EAA0C5ED2D085DC61F9144ACED6A78B8CA50EA25DB9494779AE21C4F2D2D29695A092A8F68BFD3D3B4D4D2E2585E12A58986A952E8D28528D9738F7692CE0BA49D1F958DA30BC6E7D46164896548502E0076617F7FD3CC46899905C3E66371199852380F2F69B393EE226597AAD599F65D5495224DE5D966AB3366D0DA025B5960A9D68909515297DBE85786174989CA96B5842959520B0058B3173AB92E0E9E71C6054B8BE3F39092A9AA0A206E581DC83672F6B0763D5F6D2E13782ACABE1730D372349A3A2AB981392ACA6B589E725C2E69539A0F396CBDCB09650547CA997D0916040B98CB272654821080371BEA3A3EFCC1F902636BFB3DECFA6538953AA25160CA254921DB5D5F7DDFD8C5E6B6DF2584C828A55C824AD68528ADC5396075B9ACAD76D161756D7D80B9110AA5E54A56C40568E3D75B7DB98D87385D14893292132D052003F945DBAFDBEF154129472C5823A580173F355B51FA9882385264212532F282030D353E807DB449A53E9F9910FBFBF68A1988528009F6F6EBFA1FDA7B9F53F8C5722E94EF6F99BC554B494A1293A800442E4F53788A238100EC6108974A7ADBF0247F784251FCA4F57F98FB313422ED226CA00020397F220071A68DEC6CD03BE8FF00C15AD3BF456DBFBF41D6E22D555256B9E0A4961A803404972E41BEDCB42ED1495D5C6956854A032E52F671A9B5F7F6FAC48E210E294E38B792544296F36B5F31B03FAD22E4109BDCA4A4A08FBC920455A299920ADEFD011B5B4D6DB6A7918A2EE6971E94B933509515BB381E5E640B7ED78B01E363814C11C5261676A9254C97A0E6B53D0E1C3D5691684BBB5AF26A0279A40128E9E604FDE6524EB3BEF169AB928217A39B0D2E5CD8837046F7DEF1D29C75D9953225D44E932929594A88200DBEF78D4DB1CE06C7591F98754C2B89A4A7F0F62BC2337CA4AA71A32EA9F966DD52553F2FAD080F0D4D26E4071BB2C6D620460588489C679973A5B245EE36E65EDC8D87EADA9F2A7631C2F533CA664E4A5135762E2C2E05B6671EA4B8DB353E10F9538978D7E34F2F6A95F924CEE0DC97A17FABAB95275B52E4173722ED3E5292D3CAD9A1315413333325BBF9952A421B4A52A11A6BF14DC6145C1BC198A284E122A2B50BA4968B34CA7095AAA54A3FCAA4CC4C801C87049019E2BC71855E2B35289F356B0F7CC492953DAE4E8C4BDAD1BFAD3A5D6C2A642921B2A2DF312940424AD492A5202400901A23400903E51F33BDAF631271AC66AABD3342F34F5827303BAB4E8C2DF2D62F400EEC16B9482FA9D8F9FBECDEBF45084364A9090926E49F5BF5EB78E8B9931EEF6FDDEC2FA5F488D3A0F2882D5D87D7F7FBFF0034E56E2D63A7D93F5D7DAF531327EE8FDF788211342108E53F993E63EB0892E35107ADC11F80B7F78B816EE5597928684177F778454241D449D086D049D879D5636DC8BFE16BDA29A8E42A74F4200CCA52D2C43B80FA00FA17F78A758214482FAB0B33F5F26DC83AF368C7F788D7144CF0A5C27666667CCCE891ADB720F533093414D87E7AB9372D3024E5986DC0AE6AD453F74215727A5AC47A55F065D8C4CE39E29A3A954B1DD51555395AE625E5CB75392A51601232104B8DAFCEDC29575588D02002477A3304B93AA59EDA5B96C3D747DC96A454E6A9751CC6C505D9EC519933B315FAA552714E393EB72657CE5CABCB2404961531BD908579EC7B5BDECAB461B4780CAC2F0E328228248A695DD1053DDCA4848CA1C92E43BB9BEBA5FD4EF87AE06A69786D254CD9290B2896B25490E0900FA970DF3F3F7148092D148B16505B6FBE942AD71BDEF7B0DD5757A1EB1D47895515CA994CA3E32E058DD8EF7EA2FF00E23766448972650952801943727EB6D44000901205801603DBEB10D2A4A644B4AB54A403E8037CA22D2231510842108421084226894172DF773E763A8D9DBA7BE91019813310922EAB8F4FF1103FDC7EA3F48B6CC010B012E3437F9BF42C475DA2E2856619B9F46D3689946EB427FA4A46DF33FE3E5174A69B910492C12F61ADB7DEFCB99B0EB66AD9266255AB3106DB3962DFDB61A3C7806369D99A0F107C386280B2C1A6633257349B0D2C998A616D249053A5252E5B55C9D4A24DB68CE028623D9C6352D5E27A7AA0010E73196962399B7A1667DFCEBF896C32448C550B6621614E181D4EFF00B39671A3BEE312AEF3909787DC74A1C6EDB0D0B420A6DEA23C32ED729BF078C62094A425E7CC66DD9675D083773A5DAD1D7782D4A060A84A7461E171C8BEE4F41BBD8E91F517E51E5DBA0FCB7FCFEBEF1D312E44C9B4C5694B842CB90341CC9E56D39B9DAD5B454C2749CC41233662DCDF4EBB368CF726290495102FA751B0574B5F6BDFDBAFB45DE8710264A2981F1A40209B1B036BEBE9B72789D3099E9553B38008EB6B5FA5FA7AEB1AAC32971E76E96C8503A4A09DC236BB9D3A0DF6F63BC7BE270F74A0A266752D0951401E2049D23D25E3AC5BFDBF0F99372156541D0B06DC8B1EA3576BF26ED9C0CE4C3FC5A7885E52E119168CF60CCAB9F94C5B8DDD5CAAE6651A664E792F196734A92DB2B9D4493ADA1D70A820A35142ED162ED478864F02F6678C55D48266D5A5726427433109964CE04EC0A5696D8DC0D2DE48FC4471DA315C5D785892A4AB2975E63B921258805C10799DCB46FAF2EC34DD3E9F2D2C90DB32ED6845AD608421B690CD9205B9296C1BDB7D605869DFE737B43E2395C41C5B89D72432553270CB9B9A9446A6C1FF00C46B5E08F4889885DFBC538243102F7B9DC73E562C5A390A074848B9FEF6FDF4FC3B4746AE77E17119B34A3BC042D838DCF36F724078BEA027BC52DC5DC3359FA9F5D5A271B003D22D130E65A8E8EA3F5842208421084210842237DAD6F9D8F5F4F51F94729B292A3B1076B5EFB38D3EED143588EF90C9246DE6EFF7FA4525B6B5EC8290B295A2EA49500971250AB0B8B129245FAF7F411971C4E4D5514BA64CA095A036721F51626EEC5FEDA26522D1225842F31CAA4AC652C4941CC97770403B3F3D8C740CD1CBEA6663E01C6D9775D6C4FD2B1CE16A9E0F9B95710172C6995A9398919E69D6C82A754F3532E0052A494DC5AE378D8FF869ED066703F1AE089505AA5AEBA4070B2023F88972E9D2C6CC4336BA08B0637868C4E6A67785194B90198B13721C5C8670C34768D347C3D6952DC3FE7A712BC2756E872B258CF09E2B7F10D16A330C8667B1150279C996C48294E0E6258A5B521AD2104EB1384796DA8FD5C7623C592F88F02A2C66410A45452CB5CC96924844E42121484804A9B2E455C972A277B76476672A8A8EAE54B9929335495A43EEC0F90B93661B30B4660E59D134D36FADC7D6DADAB001694AEF722E545B24DAD61EC07B18D84A4A638A2D534AC4A28BE53B82FA0B172DF60346EF615F83386A66499212AC83C235072EA6D7F60081D04546D21B6D2DF5D254759DD4AD447DE3DED6DB61D4C1338CF9D3699B28A72539B5CDD760DA7AED16454D993E7CC4A9C25077079ED766DC7C9B489A27F702FE2DED6D05EDAFDB472259DD6FFF00E503F58443DC17D587D7CAF6F5D3AC4F95910E54028B59C6FBB6BCACFA73844F4A42430828E6512030274844510C21084210841CF38453AEA132A600A482E0DD9F721CF4689CA948A8A55A161D409651D406D05C7BEAE7D4445AE2E14A171709205C7706E0EC7D2D15A9526621D2351AF43A7B1D0DBF58B45109B864ECE0660492120E9C88B11F460CF72F112A32C87C34B71C53D6E5A94417A58FFF000A824048371D527A01D22CF3E532F338B282B29B3826E357BB16B375B455E2B33FDD505053DD852487203380410FE7BF26F2386BF177C85CBEC4395A8CE49C9B92A4662E1B9C96A2529D12C958C48E4E25C52E9AE25B5B4A5BED1956CAE60A8A525C00B63588B57132A91183CFC61494CA14F295E0258928049676B6960E7918D51ED7702A4C350B32CA0A94092430209F223F73A18CCBF8117098BE1EB84F94C6B5DA6B5298AB3A5DA6E289A57C1AE5A718C34DCBBEF5165398EA9C5143A8A895AAC9093C949091B11F3C5F1D5DB92389311C4787281264FE1A64D97DFA26E742CA0A905486B04ADB30E82E7431D19C3B822EA0AA7998122E48208200D2C7524F2EA3A4678F65A52EA762A2B2E83D54EB842D4BED61706C37B0223C55C4EAEA4544EA79D30CD698A5E7279936D0F3E7B79465C0A913D74A2E5091E21A102DA5EF7E6FAFA22D0A566E822AD12C801C81E9E7AE9102904DCFA5A2189D11E908421081DC11EB112139D694870E407173025813C83C4A40D9449DB6FC37DF68A9130A14A94A199992FD6FAE8352036DBDA384AB307D2FF7E514DC0B582424AD2CADA3A41B6BE6150D20D8D8A74DC937EBD22EFC332BBDC6692982331A89C25EA7C374804B6A0BD874778A2AAA8124124155980BF524160FBDB4B5EF1A8FFF00110672BF8DF38720F85AA34FDE469B3CEE3BC54969D0B614E3AEC8B149919993410ABCB1959E2B5ADCD2E07800846824FD0EFC0BF03A384B82F887179ECB562926969E4132D94833D13F3290AD42A5B249DC66171BE5BD9AE1A78931EA6949053DCCE49510C4594080DC8F37BB6F78C65C832DC9C84853194A52CB689C9C6DB426C2588F864ADBB5FEEB87484EC9D3A08DC9DB6B254A9D453AA1532699B294A2528D59DFCF9DF5672FB47B3DD9570B9C2B8729A61502D25076D426DA752FA6BB6F1CA8C4EBE466AD35215E0752B233EA438E6C3E5611D954539536A4CA50600817D1B671CB5E7B75308A804100A6C0871EB15D3D1926AD2E0B28DC75BC23989508421084210844D4CF12D3948724BFA1DFFB037894B9256A4CC76CAC1BD5F9F51F3F288117FC41FC0DE29168EF0E70A6706CDA5CB0EB7D4FB454A67776026CD726C49FAB6DF7AC44EEB0BF4036F523F41F8C4EEE8A65AC380C82DE7D58DF6FD3468A49B3C4C761ADB930F6D62D67890989A9398CB5AB34B095C8E2391082904281332C1242B5796F6B74BEDE9D33CE0F989A8E13C4B0D98970B454F8F98C8CCEFB75FF003E7EFC55C95CBAE42D25FF00210C2E439B6A2FA6C402DA6B1B9360D9933F8570E4F120999A3C83C6DD8AE5D048BDFCC41EFD0FA0B5A3C59EDF28453F1157C94973DFCD503ADB39716FA6D1D21C3C4AF0C4254480E05EC74D03E9D2E6FF003EDAB3700FCBF21B6DF2FD3DEF1D038656A64266D32E5E74CD4A803A10A37EACCE7FB3467F86D32655266CD99C396D1CB0F5DD859EF6B44AB56B01247416F2F537F4F43D6DEE6286995F86AA42D57CAABEFA38D06BD7C85F9DBC5319150A9AA5829727297D09E96623A38DDE3510CD4C7A9C0587A7279C2815C7241F97A7B28365AE69C42C3480804A94B256DEC900EE9B1DC47D14601864C5A054CF7082B0949525C212E0E625C0CA01751E578D90EDBBB56A0C2E8EA24AA72065429BC61983DC0B7A46D09E093C1156B872C9B9FCDFC774F5C8E69E752A5EA3501509632F3D49C3C194BB212CEB6EFDAB6A7BE3669D054405256921201B9F353E363B6FA71495582D05524C9A797329CA10A1942925495120382490CFAB011E5A719E372B89F18995F28E748252E03D8924DDF500FA3D8C673396038B5A084B4B71C521BB58A01081B8B9EA4122DEFE82FE2A4BC4E6D4D7D4CE512A1354B984E61AA89720DBA6DC858463F4F28A05F99670C0FD4BDBC85EC4454B6E0FCC7E9FED168CFDFD52C936F11B7276F99F3FD62E487CA3E5E5F7F28451AB53E67EB114238842108421084210F3892A4DCB24B797DDA222E08B758AE91318A46A9B007A0F6EA7CC9884A1C3652C3A18A6E38A6C17EE12E320B8D85DB4EB48BA6FED7B77EBD2E778C9F01C6D7846274B5F2CF8E9A6A569209242828283105DCF41122A907B898424B849D0176D36DF97ED1A9878C9657CCF09FC66E4771B387DB729F8131BD54610CC45368E572A7256624DE70CEBA9B25B4CECBD542190E24EB2CB96240207D30FFA79F6B52789F8729F0FAB9EA5CC4C8945282B0425811354410E424049D587B43867153495D2C394B2C06B3862C36E6E35DF9DE2F5E8F5393ABD164AB72251FCBA6E42527DB710A0A6912F36D95B2B2B1B695E95E93DF4ABD23D4E5624292A92990AF04C50622E4ED76E5AB5ECFA068DDCE0AC6115987CB04E6F0071625DACE0FB9D5EDD23E99BA56A42B65A2DA927A8BDED71EF68C9534B925A2A4243D407246FB8FAF58BFCE94997314B01B33663EA59FCFF00B42388970842108421084210842108422827A5E68EA3F527E86D1CA67041C84FE60F60FD19F6B3C4C9246B55AE10852D67B250917528FA048DC9ED1552D795236663BE8799B0B3070D6EAF15669730700105CF202CE3C88DBCE283E5B6D21C0B0A0A5349D8DFCCF6AE50BF62BD0BD3EA126DD22D7555012B3999B5049D03B1B1F968DA1D5C58F11A99547267289014942882580F0DCB3F30FA6CDA5E31278D30A57BC41BC4032DF863C2E5E98CA0C9D9E6EBB98D55944AA669CF4C3D392A99E727261043082E1910994E66BBA4CC017DEDAB3F123DABD2F06707D723F129939E54E972867C8A5CCC873100BE64CB1942D9AEA4871BE96F693C44AC527CD94951584AC8201CCC0120025FAF237D2373EA1D029587A934FC3B45A7A69745A24A334BA44925096912B4F92406A5594A4252025B6D21205ADDEC9B6DF2C1DBCF1EAF1CE29C42A5330AD1326CE20E6FEA516B8B7CBDDC4621C373552A5906C140B06B97DF5B79B5BD447DE536842414A813B020107B1DCD8FB0F6FC493AB55134CE9EB986F9AFCD89BB3E8D72C390BC5FD2826A5537FA92475D8FB3066FED1244A8AA84210842108422649B4D437F50810E08E61A236F2DFDEDF97A44E969CD5A124FF3EED72EDD3FCB69BC219367D39FBEBA79791EAD514AB21006C1016FB84F72D849426FDB51B81D7A7A88EE3ECCF87535DC5986787313532F51AF893CB771A7BB5A2DD549330A85DD49661B59AFA3EBF7A0D0178CCC66BCE4F124CF9C5734F7C5C860899461FA6BC17CC976D72B313AA6996D77290B5952AC91B929BDA3E943B21C24F0EF661C394C94A659AA136A96C194A42A5538944976B10B6B6E6363BE19B877F1F8D575414B8926581E1704BADF4E6C1EEDB738F8081A753C9DCAF96D04F5296DC0B2E9B0EC0A51ABB0B88CBAAA715055F6201D7A5F97405F6EB1EC9707524B95824A90C3FED2037A680E9B39B6C3D2A463D509CC5CB59FC8B74FF3FAC433650A3A852D80014D676D776D5C6BBF43A9440341E42271567257FD57F784731C42108421084211297A8F2FD4C463F22BCFF684469FCA3D7EA629D7A8F2FD4C22B121F3067F09B7B45245AF7148162818450DA0971389A9810026EA3CD7D1CBB773AF96AD236DC11DA3B038469D12B08A82A0C324F5124B0CB903EACC367E8DAB468A7C57292BA99697B84A188D3771F3B746DDC1DC5F2E99533807062177E62B0D525D5A542CA0A5CAA09B8EA3A478AFF1013E5CCE2DAF45AD366BB1B0F196176B5FD341D35FF0305386A19C7892400D6605EFCB6B6C3CE3B99047516BC6B52D3DD4F2A018105B737D48D07E82D68CDB0EAA269F2A9D57B6D61BF2E9F7686FDBAF6F9C48D66B820B904EECFEDC989EBD6229ABCF99CF436D80F26FDCED1808F0AAF0FF00C55C6067052389ECF1A04ED3B24F2F2A7295BC19846A2CACFF00AB8D31D44E48B6FA1E4843B2F31516DD6E60A5B72EC102D78F693E243B75C3BB30E1A9FC3B8654A1788D4D22915B528983F86A99DE217224105CA4CB090B5784E6252DE073A9FDAD71C625C498BD4C81397DDF7AA09439D1DC1234B29FD9FCB751A5C94BD36974EA6CA30CCB49C84A372B26CB2004372AD957251600005B49E5F4D82001B08F01FB5EE32C4389EA2A27D44E5CC44E9EA5F89449295289DC9D1CF9F2D0C60982514DA7A7509E5E62A6155DC9661637BBEE39302F1CF26E49F58EA8C1E84AE92A27B0052950049D6CE5BEC6ACD17A12C06BE97666DDFAC4CAFBA9EFEFF4E9FBF48C7652FBB9AA503A15021EE799BF5BDC7AC44A5652CCF67D7FB4491C12E49E65E22842108421084210894A6F7B123EBB44C4A4100DFF004D7CA1104ABB1EBD8DFEBD7F4B402B2D8EC751E7088A9C2871B5E9E614292A083BEB2157D3DFADBBEDEB1365679F311293AAC8487BDC9034B3F417BFAC70B47792E625C070CFC9DFEDB7F91C7F789AF0B948E2BF843CC8CAF97944D4711B346A8E27C3932E361D9866BF48957661A44A020A83B32B32ED8D27512D0EB1E9AFC0EF6A957C1FC5B87613DF94A0D4C84141514A48CE014A838F09DC369678C22A54AA3AC490420858CA5CDC38D6CEEEFA90DD63017E1BB9C3378DF247FD0B889D73FD5F9433731836BD273AA2671D96A71D326F4C2576585051984DD40D80B031F4DFC3759FEF583E1F5E14266794898562E0F8505C5FA9D431F48DA3ECC71952A44A4297A849673CB467371F2772FB6431297D3A79E4294A69B5158E856756B4FCD1E51F5F717EDF97342E8A9A58FE4431BE9A6CD6D39DFA1B46C0AA689A84286E1FF60D7B5ED789E25C4B841C6E7CBAC2108421084210842108422927A5D614FA59BCC738A5593F8848D4302C35D7F6DB7D220AD2015292A58482A0DA05CB8A4EE1B23B85DAC477110AD4132F523C21DB5008FBB383190CD5F754C565DBBB3A5F627F563EC1CC5A671B3C43C8F0F19295DAD34B44E62EC4F2EAA1E0CA530A1F13313F526D4DF39B4EEA2BA7AC327CA094FC40E9717C271CACFC3D354CE52F2F752662CB9032E51F4E5A5FCA35E78E7890D3A6A519F2E64AC0F16F71F4DBEA22F9FC1338327787DC80566BE60C9B9399C19EEE9C49896A5506FF00F5D44912D97E5A454B7017521C5CF3BF78A2E5AD85C08F9E9FF501EDDAB958B546114552A4C890B5489684A880C0A8198B0090662C0198821D83C6AC842ABA7D4CC582A2A98545F525C161CD9EFB8B98CD9A15A9A64A9252E7291CE04DC87ADF69D86DABA6D1E42621366E2F4D32B66A8AC95924B9B9625FEAFCFE952995F842325B448036F32DEFFA5A268C31ACFD5BF7FD22ED4CB52CA546FA8274D8B5B6F9EEF7847115D0842108421087489B203CE962F750D3586B004690013604FE837FEDF8DB68A8929CB5E010CCB4FA31737FBF23A44A9C7282E40607E42DA6FAF5D7778E0D59458A7CF4CA1CD21320EA7D2CF0438A17F53BA4EE36F5BC6D276252E5CCE2DC252A00BD4C92188BF8D04EC7F6DA24C8489A5208198A8BBEC39F9F98FA88FCE5B0D569CC479DDC446259D3CD9BABE624FAD6A26E796D4D4DA5BDEF73D556EDE9EB1F4774129345C0FC252C32569C2E4A54058384825FCC11FAB5A374FE1629E5CB9B8B4D2920E6490FFF00E673AE875243EDE9EC65C7145166EC92773BED7DCF6FC77F6116A54C7B383B81B7CB7FB31E9BF0857E7948927602DF4F7663D793C548A399737BBBF41FE5F56E9A45FF001D941092B4B30662D72ECC7AEF7F43088348B64824C996497748BF384226C2108421084211297A8F2FD4C46E04B5396BFA6DBBC2234FE51F7BC53AEE43721F5308AD46A7CBF5114330E542CF204DFA45B7E774A3F8AB15E4EE0C934972A98971A25C6A545CABE1255FA7096361BE9BBEF5BBDEFEF19AD0552A8B85F14A963964D2543EC33A903207E658EB6B7988F3B3E27311EFB134CB2B21D4904022E013B74275B7B878DC870FCA894A6D324D07ECE56424D86876421B65294A3BD80B1DB63D7B4785BDB9622B9DC675E12A71DE4C26F727BC3AE9F521E3ADB8765A66612826E4B5F46B06BF93DBFB47DB73B7D7FB474E544C4CC4CB601DB5DDBF4EA09F48C964CBEE29CAF51A3DC5DF9FAB86E514E24CA0EBFBF3FD2212B706DA8E7CFD2325781706E1CCBDC3F46C2783A912587A8187E511214AA653586E565A4A5D0D86CA1A69A09424A8005CD22CA56A3D0C639DB0F6BD8A717625513313C4D75A55314D9D6A55CA891AA94C1DDDFE7B68ECE94BAAA9335473AD4B2EB2EEE7FB9B39BDF6D3BD21094202136000205BA00493B7B5C93F324F78D6AC4B129B5CBBAC9960061D43EFBBD9FA003577BBC84AD08CAB249B6AFF00AC4FD22965D6D44A96654B985282194012C793DF5F3F389F0F6EDE91486E49DC973D4C70C0EA01F4842398421084210842108472091A130880481B811C4220B52920AD3BAD035209DECA1B823AF422F7ED159875AAE49019960DAD1C1B850E6086E6E343D0C715D9495130D9754E34DB8C292DA59074B4B55C95213701249209F5EE768EEEECDB1D9F81F17D155C89E64AD35129614924310A4BDC37986FD62C988534B989CEA402522CA3724B6B7F3B9DB511A72E78E049DE067C57AB54B0CB749C9EE2B15F174C4348F85A3D2EB9539B71993FB01F6085B4A75D5CC292A04731074F98C7D497C237698788F8430DA4C42AC54CEA7912E58CEABA92B48C818A8F892412A2362036B190F02635328B129728CF5265674F85DDAF76BB071A1BDDB9B464F12E05A5294DC36948E56F70B695BA1E57ABAE804BA77BD931BD48CE9F102A0850F0F21A6876707CF5BDA37530AAC978861F2152085282015A8751EAC6C1B73D0E9344CCCA2CEA25B99FB7F58E664B9D98F8940B8D5FE9987DD8738433A9FF003126C2E74E5AE9E67AC56D2D8B2CE81AE5EFCBA9FD7D1D15892E073163D4B5FD3E711AC82A24583BB337A11F77844510C2108421084227F2A51AD7B2756907BDEDDBD7E5F3BF68A5AFAD91229172B20EFD45C2B522C2FF002DAFCA38FC14E9AA13C12109074B7BED6B6C74F6E24FCFA28928F55A69D6A569B4F6953B3B3CF381A4CB4AB092E3CE95A8F4420151E9FE2D58555A65226D456B2E5A412CA701989DF4605B4F90618FF117114AA2A499294B01484900067B0B8D6F7EAFAF58C5870B795359F13DE3ACE2EAEC8CCBBC2D70FF003AB7E48CC053F47AB622726C2D99032CB0259CF8A4D36D3977095252C6A49B46897C5676E143C1F846232A82BC5356D4C99A8972D2B0932A46523BD5328399C49082D6EED5ABC69BF1BE2F515D5EA4CA9A4CBCECACBB927477361B8DC7946E2D44956E9F288A749A12C4936CB4C265DA1A19E530928693A00B04A53B253616FCE3E69BB56E309FC598A621598AD5AAB661A99CA44C9AA73F98B0B956DA3683517734D229A4A5083DD8CD95DC8B8767F7611DA6EA3BA892A26EA27A93EA635B2A2AA62153244998A448CDF901203DECDA35FDC9F49A644A2CE816D180B422DF11265A505D21BD9BD035A1088E10842108421089F4ADF8894E1C670E34E708748A99A526BC14DC7789D39BD9BE512A6876E773E65ACFEF1F22B6426993E4B61C6D328F2D4D1170B7396BF314DAC49000FA7B08D9BEC1D4A1C6384E73635528E52DB2D2CFB38E4CF77722F13289290B0E900B827C81D1ACCE3DACE1C47E711976D191CD2CFF00A3CC20375092CC19D49D40071083393C426FE801DAC3E5E83E9196B13B82384A64A0DDE504A5E9B14A3A93B6BEFAC6F7FC294BA69871B0B969CC3BB60A6DB3E9A3EA6E35F28F7E52CF90051D3A74903A155875F736EBBF78C6EE94DEE79F2FDCBFD79078F40B87A9A64B98952414A2C459835D98F2D3AF48453CC98A50092A2E3DB910D68CC6BD426490959248E7B103463EBB7D211126C963AE9E57FDADE516B94C25A43378436CD77B7DEF08E623842108421084221EE56A0A98F64D9B61E7EFFE4C43303CB3D0A8FC87DFCA264A50A365A8A4589B8EB71D07BDFA44B9753290A12D4D98170FBEEDF767DE2A70B97DEAFF008802824BDCDADB6FD77B9F489F415DC200B01D48B5CFE67F3F5ED19261D48AAC9D2B2273256B4A4DB5048D6C6DE7C9DF48B6F1654D2D150D4A90D2D48913141ACCC937E7D49372EFB4752E13F06CD67C71F78224512E66E9595D4F355AAB83ED25645C919A694B4366DA50A7801ABA151685FEE889BDB26274DC19C115C3BD4D32AB0494CB95A674CA44D338962C582E5F4BE8C03F933DA763231FC6EA52B589CB953E6049D48F17840F624B1D985E36D169B665F4A65C290D048E528F5522D64AB6BDC11D06E01FAC783FDA46209C5F892AAAA511312B5CC04A6EFE2B3FB9B45470952CE974C1131CA2C4077000E846A4124ECC20493D493F38C49669D144996B4033C29DEC0E971E96D75F568C927CE42A61903401C87DCEAE3AF3E761108B7A662125C24FCBF40225E54F21ED195F4B0194F9544DAC06A24AAC361756E49E97277BDCF78D40A933EA27296B249517724971D2D7EBD59DA34B68E50482A5067B6F7B33BBBBD8388AE8FBBF58A59B2C4B2066CCFF00DBF7F94561001B1789A254710842108421084210842108421084210DBB8B8EE3D47A44FA698254E42D5A24BF4B11F7F281D0ED6D794012140EA06C7CA08BDBE5BFCAFF00DA328A1AE5C9AD97572CFE5585120960CD705B6D472DA29EA650992169087394B293D41DBFC6BE7182CF1DFE1BA733638617B3B707D352EE3BC84A88C5527312C926A535245B4BF3F2A852105C976E5853D8534E365C254F39E54E9055ED07C0BF6C424E3384E115557DD49A85CAA65AD4B3FC2CE40EF402D9B28D03877D4461D4D3A6D0D726600A395692002CE017617771E76EB68B5EE1633969F9D59138171F22650F4E54645A90AA34DACBAECAD6A4D96454A5A6490952032A71A0DA943CF75929469DFE85703C4E562783D0CE42B32FBA057CC1CA9D6E5DFF005DDA371BB28C7054D1CF44E5B8CA9CAF76E4039B33DFADF668B8C01614E2169014937480490A6B7FB4B902DFD3B0046E7CD1746E7E9D3FBFDF9F702A64B9E1810C1807372FCAF7D39FBEC8453A93DDE8E4E97EB7F6FBB6908AC941903ADFF61E8D1182E01E61E11321084210842108896D6E84357437AC3CEB2E4CACB5284CB212E4C071D407168286F42B669448FBB73B463D5B23BEAE4052990C1C1660C777FBBB795CCE234D4784CE131694AC956A766DDC5BD3F58C5A71E79B18CF30B10E13E0E720C4DD7334735DF91A7D6514A79C43141A2D466554F53130F4B85AC3CF813066D2A6D0897974CBB816E29D525BEAFED638E309E0CC02B26CFAB44844992B5AD49290B510939509B8754C6200FCA08B90D1A71DA37144C5554E972A61233166516D4B13E5EB7F71B2F702FC20607E0E787CC2994186996D7504B0D56B1BD610D36CBF5DC5936C3226261C436562CD96B4241715A49276D463E69FE2DBB72ACE2BC72BD326BD739014A952C09855965A54A09426E5807366677E91D4F4895D72BBC98147C40B92FA8724B976766717B8E422F219934B26E14543AD8A401FA98F37710C5A7D42D7994ACCA249B960FD7578C8C0603C9A39A4DCF4B6D61162BDDC924926FD60030FAF53CE211CB866DDDFD1BFBC7308E2108421084210813604FA0BC47295966215C943E767F477812C09E5135C045CF404FE62DE9D444F90AEF2B90543550373A653FDAFEFB440F99C37AB3B6BD7969D5F68A2EB48986B4BAA6D2C2DA7DB98D44DD0909BA5562083AF5286E401A7AEE63613B25C565D0715E16A2A0922A653DC6CB4DF5B6E3CC126E625A96A9398005D2C42AC013BA497B00C1CDD9C6BA47E7B79D181E632A38F0E26B08D41025CD5316B957A33253CB33326E3D39A5CD3601215736292A1707DEFF48DC058A48E20ECEF8566CA751914269E692036794994A2DCC34CD0B1E40C6DA7C30F12A68312C4644C98009CA94C093A12B1A1B91AD8EBECFF0057ECC2580959517105C7469B729D16B35B1370756EA363B0B88E3104892ACBBDF4274BF51A6C5CBDC748F57786172EA30E97516FFB60E9A0B6ACFF00ABDDDB589E2D929A61629D03B6B7F4DF58A99930CD9C65BE6D773ABB173F7ED08A8D22023296E56F6B421084210842108440F436F48AB97325A299695119944B02402CC7EBFB6B11E42A412CE1F4D8EDABEDFB36B14CAC124B89B348BADC55F70840BA881B6E05F62403D2E3AC634AA69F36A9D092C556376D7FBBFCA394D40A294B5964B026E40B00FB5EFBB74DB4F38CD6C7F2F80F09CC55CA4AAA01A7D9929242C844E549B405A2552E8BB810F07590D3A1B5152CBA9D00201576F70AC812C4B33328292082A19420002E4B5920DC9B30B9208BEB076B7DA2C9C3E9EB64F7E12552A6A00CDB949660FA9E8C766DA32E5E117C303D94D94F58CE0C6D4E98463ECDB71B9853F329297E9F2812E38A95438ABB8E36FF00C5A752D41B23942C937DB49BE313B4B4621493B0FC32A8CC954C1725012ACB701944A42884A94D7D49000E51E7660A9A8C5B17AA9D312A226542D6E5CB82A7DEEDD47B46608795B61BB11C9650CEEA2AFB808D89EDBEDFDFAC795D4733BEA89F327A89CD99409F76EBD7AF3B4776D2A25D0D2A5360A09B82C58B338E7C9F7E42CD1B0B5EFBDFA7F78B7559CD3D65F761E4098B5A65AD55467310823AB3BF5F23ED108A68AD8CB446A04DA82A709B0E9ADB6FEEE5FA469A29D23C2186EDF2FF003E5787D6FF008FF70229CA94ABA89F53FB130412439D5FA7E908E223842108421084210842108421084210874EBD3BC22098F94E5D7F4895685DC2C03A46FD7DF6FF001D37FA08BEE1B324A69E609AA00876245F4D46BA5F97D23994B4776CA201637201F6DBD2D1D4B1760EA4E37C358A309D6E525EA14DC594A7E95352CFA02E5C4B969E439CF6D6929597BE200FBAAD91BDB6BED17C3671B49C178C2833D4AA5A13532B7292C16346D7AB9EB18D55D2854F0B480466D53BF5F2FBE91A6CF0BF2B53E0F78CCCFBE09B190E4D26A9587B1860371F0A0CFC1BB373AD3CED3FCAA484BFCC94BA11A5C1CB4EB40B08FAAFF87CE33A3E27E0FA2A8935499F964094A577816BEF25206652C139815661E7721D8C770767989A6915369D331944A583B1B92C3605B70010CC232D4D21D265D6A515699275A716374A96DAD91A491717373626C15625254018D874CC428120D87DDA36530B33E6484CD5B94B03989B333EBD1F7B93B0BC4F1CE649DFE47F68BD2549AA5044A7528580B33BEF7B69AC22E32D0AC89B6C371FBC44A4141C8AD5363E908856B08B11A6BD3D9E388136EB12CD4203B916D6FF00DA382424392C39F9C46C6C0F631C0A9964B0209F33FB40282AE92E39889524293A93BA6FA49B1001F7BDADEC4EC6E2C77113173512D1DE28B27AEB6DDBEFD238529290E48116ADC5FF0012742E1AF29AAB8A670B351C4D32448612C34E1E63B56ACCDD98972CCB2438A765D9794CAAA20367992C5286D2FA816C61BC4588FE0A966E2692934F292A4A979C27C4C6C4A88000704924243B92D78E9EED0389FF00013BF0D2E690954A0A64BD9C1B9018936D399D768F77F05BE0731261192C47C6A67F48BF3F9E399EB7AA785E8B536D2F3F8530FADB4B92936DADD2B6587EB2A79D9795432BD6D7F2ED4EF242904F873F1C5F11F49514F5D826098A899512FBE96A44A98B75AC3A4BA8B16B3253A02090D98BEAE63552AAEAC5AD799492336627C24927C29BBB8675386F10626E6360E6E518974A3E19B75284A532ED36E2829C6DC04AD538E1D4429254BB0B2D4BB20F9378F0B313C5B12C4B119F57892D644C3317996B511E251CA082E0285EC2C5C39378AFC384B44ACA03314957E51993BCB497724F3206A09B3373631559904924A497D4E5FD58C57C229A6F77A219DCBB0FB1EC6108930842108421084210881E87E46394EA3CC7D638502410358893F6647537BF43B8B6FF005F6F5899295DDD4A56A0C124BFB9DADCE21969297CD7F26BDCF5B7BDA25E59710B4292D212B43683AF51D7A54B2A26C93D01036EBF3BC661C33894CA7C7E86A65A94254A9C852D4EC0242817B31275EB6893529510AC84AB3289E89748013FA82CEF6D2F1A6B78F4E4F5432678AECAAE2464248B387F33A48E1DA9CDB08024E5EAD479965D5B530536D2EBC8AAA4A4A93A5C083655D26DF463F06BC694BC6BC095584D1554BA89983A69E6CC964B2A5AA6CB5266972D66948B03E4EED19FF64D89CEC1F8864F7AA3284E988487536665161E5767B1B69162ACBACBAD735AD2E2668B732CAD04292595A54A2B045C58DC5B7055B9403636EF1C752D5464A1CAD24860E030B1198116F76DC73F69FB37C4454F0D485A5798AE44B3A83FCBBDEE3AFEE62AC5253D1CD949EF6686494B0653BFB1DDADF5074CA2814A35AA330784921C860CEEF7F21FDDA110ACA41241B5B5F61FA3F58AEA85CB4CD580A0CE75F3308862505A54582813C84204B6B13532D4BFCA1FE5F7F7C8C2210A49B3FD626FE1677F4FCC42228817266203A936DEE0B79C06EA427BAC94A7DC8173BF4D81BEE445B278AA5D54B972925482DCB9BDB7B06F5EB12D388514950A69B31A7AEE9433F84B3B97B6FC8C70EA33B4E94A7BD3B3936DCAC9212EF3E69E0B4B0D36C80A7D4B5D88D2DA3CC40B950D9214768CF705C3A5CF5A25AD2F394058A7F5235F3F326F6C038FF8BB09E19C36754621569908085104EAD94B69EAED6717678E1F07390D39C6FF0010CD57EACE25192194F3B25509EA729414D56A724DF71F94A7A5A04F3DC714CB85D52829A2DBED02E120A5359C678A2383B87F145CE4F753E7D1CE9689A09265A0A09CA948DE6BB1558A02410F1E5776B1DA0C8E29C58CAC12B7F148138E6092012A2AD4936F0D980B12E368DACA4A5A56954DA752A4E55A94A7CBC9A65A9B4E603653225B4A5082A435A90D92128B5CA774EFDE3C52E30E22ACC6B13C54E26668926AA70415A54A74951219FA3EB6BBEB17CE11A1934B265CD9B91331684A95A13988E7A83B5AFA6FAF2D9E6165AE60B2D09E5AC92012B46CA3D771B8DF707B131D23882108A82287C4093F96C6E77FCBAF95B9C5F3129B30CE0658796E1CA4E9772587CF7D468F135FCC5237B024900D86E075B5BBFAF689D4F854F54B33E6CB16198EE48DF98D4F4BE9D6E5F8DC3D34494F789EFDC166255A1B3EA4B6E6C1BD627D0AB6AB1B7AFF00B753D228D53A91337BB09BBB5922C4EDA8E607BF28932A626636453967DC1FBF27D632CD1A451A75084210842108421084210842108421084210842D7DBD76FC606C09E51C2BF29F2310D5BF2EF7F63EBE87F5F43BF78BB61D2D33654E05883D5B401B5DDFF4EB14CB43A416005EED66BBD86BA6FD622B6961B65B6C9F8879C992D01F7B4212D6C091BEEAE97B13EA378CA383ABD38263922A9F2844D45C69E151209F3DF901D628262194AB5C0B3960E5F7D187B7D6358DF1DDC86AE60BC4F93BC79E57D3172D5DCB4AB9A463E725501B54DD26A8E4ACC21D9D527675A964D32600E6936E71B0DCC7D097C01F6CB22BF0EC470A5D4A14EAA70119866CE91312026F6D4B80C15BDC089F86E2BFED788531272E755C8274047DFB69631EA396998341CD3C038771DE169B6D549C4F234CAB34C0375B4C392CB5A257A1D2B96E7044C0077529172A22E3D9AE1D992B12A04D424A559C036B9BB1F95DC9E76B46E7706E292B12C36520AC2894246CE430049D2F6D1B7F28EF315E6481332021B301A5BD3A731BEDB465F2650A39D99AC4920FECDD08DEDF545CC4C094A5214C121B293AFAECDA86B741098BEF16A5732FF7F584524CF1153117BF4DA20881FEE3F5114736966CE494CA4F8CB161B804126D7FDFDE25CD495232B3B90EFD086B6F7D3A889D5FFB60FA6AFEFEC7D3FD8C5D6824D0CA1DD541489C468AD41FF222BA969E58944AAD6246FE977BB373E7B474ACC1C7B8672DB0657317E2DAA3146A4D0255CACCEB8FA8A135497936B9A65A5AC0DD6AE496AC020951B5FBC635C5153FEDB295349690DCCF89CD983172458003CA3AD38C78965E12898D312E87736BA6D6661ADF5DC13B98B1AE04385AC6FE24DC4F4BF1539EF439A94E1AB2C2B68395586670E993C46FCA3A8984CF4C4A2545A9861D99E520A9FD4086D4922C2D1E687C58FC51E19C1986CFE17C3ABBFEA2AE9E62AA929210253A549125ECA135D24CC6190A549F11B81ABDC47C49FEF95A6785B840284DDC177625ACCFA1D45CB6B1B74D3A4E5694D49D2A9F2ED53E4241932129292ACA199532928847C3B4D25B4A5004BEB51B048FBF78F9CDED538E67F14F1055D58529626CD5A9DC9FCCA537305B99FA308C6C4AEF941C056C76F23E97BB5F478FAA5606DDFE5FF1DBA474C6293E729294A828279836EAF7D9F95B66B98BBC8A6EED1CCEAFFA00DA0E4D7BEE584D16289F0842108421084210842108423905883C883ED08409724DEE77B98452712E9E9D2C6DBF61D00F7FF6B45EB05599738298366BF26DDED77D8B9EBA3873F9FB0FD1A31DDE267C204A7197C2A63CCB6128DAF1652649EC53822A6520CCC8E21A5CBBA65589776C56D09D53890E041D2B2CA35821223D16F83CEDDC7657C512E8A69CD498C54D3A6AA4953266CA4A94952482406F19B10CD160C4F12AFC2EBE86A6973012D4E4A1C310525C91E5ABB3DE34A4CA5AB54E9ADD7F2BF1AC94C51B1D60C9D4536A3233A0A6652DD08BD2C89720951E621530BF880482496F5151008F77E4D0E17C43C37FEFB864D975027C81554D312E153254D4674299412AB81A1D8691EA07C3376CB4D88D1D1E175F5094CCC92A5A90B5B97218EA4805D9CECEEE58C7B0C74D61F5F892B1799455695A64216A4877D012036D60F7200F3DF7CB119085D2A2B70F2159D216E82082F7DB5F2D356636846473901331413A662C072E9D3A6D1229A42A6CA4296019840CEE40BFDEBD6112B2AB91F689A640478B2A411A31FBE9AF9EA211C290588367B3FF00831455556B91297DD139810183BD9B421EEFAF4B1BC225143071B3EB7B0D35773CDE20A2AAAF9E74985C0737D2DCCB6FE606A39225952DED7F33FA388AF9A8AA2851567B6CFEA4B02DCEFE770D1337AD2E21D6DB0B0D2AEE29EF2CB21B558294A51F28504EABFA0B45E30854B4CF96A9D2C1255F9887013B925886D5F76E767B6621270FA1C32A71AAB98844D9095105643B24022E5F57B5F5E8C63CE72FF2831FF1D39F546E1AF2A915046156EA32CFE3AAEC9179AA6C8539B750ED450A9B97F373D72C1619654034EB83438AD37233CE34E3AE11ECFF00860E3558BA7A7A9EE262A982D28CF31494F854125C99614F99475B84B9063CB5F88EEDA2462CBABC1A9A7A660495CA2016D1C063CEE188D2DE719B2CC1F054CF6E13E992B98BC0867A54DCABD229ADD42AB97F8955332D2D5DA84A239CEB68937587B0FCEA0A8680671E0A21442AC0DA34C387FE2AF8278FF18A9C0B8A853CDA31366265CFCED36582A09F0824226060084AC9483A6A634164E2988D056AEAA485A42965434CA6FA16248FAB36B1E5B817C4A330B2C310BD96FC6B64E57B2B71207112F318C29B8704961FA8104B456D4D4B34CB213A81714B6DB03CC08247495C5FD8AF0771B61D3712E08AAC3F134CF54D50A692B952F1090C017994EA282A01F59066070DC9FB4F03ED3EAC2E5C9A8CC8203397297B3B2AEC5F57637DA32BB80F31703E6361C97C4382715E1DC5524FCAB4E308909C6E6265964A6E96E605814CC3608E6A49D4091F38D22E30F87AE2AC126CDA9934D53DDA4956421492C1C8053F9800016B01ECD1DEB81F14C8AE952CCD9A9399237075D5FADFAEDADA3B8E9496D971A7C6879056B95BF992B007986DB04824582BBDF7EB1D4758713C03FE9EBE926A43E425692DA9704E86ED7D1F4D233DA09785D52DD2B9654012580D0B1B7936EDA5A25D5A4137500373A0E95586E6C6E2C76D8DC58D8DC4712F87518B844DA1428CF9846542527F317374E8FCC9B1BEBBD5D65561D874951CF2EDA170DBF3772790B0763D32D11E7D469B42108421084210842108421084210842108421111B11F3889092B5040D54587D986B14EDA9C161736DF6DEFBF53EDFAFCA2B25D42A90A917D9D835F6B5BE4F7DC98100A43E9703A01B8E4D7FB789DE5594829242DBBE9503E64DC0074AAFA85EC01B5AF6DFA4402A26AD59905414F60EDBEF71CBD229168046815E7707CF359C5B5B8F68F15CF7C9AC2F9F99319939518C65513944C6186E7E9E65D4D21C519F71A58935B214094BE85A8E871165A01558D8AAFB9FF099DADD5702713A29D550B962AEA656519D4904A56C5218B87CC46BA167B458713A25CC99267A411DC92480D616F16C1836B7E9D351BE01B10E21C84CCFCD4E05B359D5338A32DAB1547F08A674ABE2A7E41A9D5CB4EA25661D1AD72EEA8492E55B42B969690BE5A529B88FAB0EC2B8E2571270BD2E212EC9AA912E78961B2CA529214A96350C876B38362F1DBFD9A7189A59B268E64C7282941753BB167673D4DEDA3EF1961654EB92AB99290801DE5B92CA1F68122E09077576EB7DEF1DC526B1332B169170547C2198DCE8DD0F4B6DCF6B65D50ADA54CC43789292082E74727FB5F52C778AA34FF45F41DD3A892AD27EEEA277BDAD7F78B81980AC8666B11B803A8616B5A2343E50E19801E6D63ADFDE11390339617B121ACFEACCFCF7E71142C4824148D0953B655ACAE502E1458EC4B813A123D488BBE1D369A8E78A8A864CB0820E6B80A2922DADEFCDB4E71C804E9FAF9ED1F231055E9B46A33F5CAB4DB7214490617539FA8BCF2586E99C8056A4CD28A9376FECEFA141492955883731D5DC49555E9C5975D499C5225454E9242425CBBE836D9F48C5F1EE2497854A58EF02084ABC4766041F97CCEF18B8C3383B333C5B788890CAFC0CB9AA470BB96B5043F8CB14239B232F88912132A999F9365F486D736CBC1B534191A90B4ACA4A6C483AA5F129F11D85F0670BD4C9FC4A25E26890B12A5E609989535A6AAF99241F14B7F166014C12413AA9C6FC4F331754D972E6382A21C10C45F7DDDFC8731B6DFF0094796984327F2F30A65AE04A54A5270B613A4CB52A9B2D2928C49A1F44BA945734F34CB6D85BCEBEA7097560ACD937276B7CC9F6E5DAE62BC77C5759593AAE74D42A62C24A96540BAD4CC4923D4475C61B493C662A0A2EB203DDC1E84D9B6F2EB1E8AE2825494800841514816B20A800AD23FA4AAC35586F6009368D779B56942CAE6A8951399CBEB7D83EDE6C3934657229932D24E8AB392EC7A3EA40E8E1C9DE298428EFD8EF7BEE6FFBEF11AAAA92AA5A86AACAA60C07D6FE4DD5E2A0CD4203393C9FE436B7B6ECF15A3175B675368E5A21D6110C210842108421084210842108405C81CE108BAD29EE806706C5FD5EE3A107EC423813626F5244B381B4AC10E056E959360949491624EF6041EB19FF000A62429B12A6AF3332AE926052482C5DC1E6FB6B607CE23CB48B953135284A8A8320A99C58BB1377D34E578D63BC627C31F1139885DE32B869A73BFEAAA448CE54732708D325137AE35AD97E6DC97A536D166727E61414A5BBCA53EE04799674C7B87F09DF131475D87D3708E395485534C97264489F3540AA9969192512ABACC86242903300729086048B5F0BF1262DC1FC4126BA8E6CD448973731C8A21050140F301F5BEFB98C0F607CC6A36336A62594B99A4622A2ABE16B7876A61123544CEA0A92EB6D4ABDCB73CAE2169B2136BDAFEB1BED8A609435325188512259993E5F7C89924A5489885004292B4B820821C3BA5D9401D7D69EC5BE23F09C570CA6A3C4AAA599A94210A13141CA998820D817605F959C88F4E96507937425ED42C552F38DFC32D83FFED17084070A142DA82DCBDAF7B461AA92B428A569F10B1701FE778D8DA4E2AA6AF9C6753293DD4C53CBCAD97293A803417B10D106D4495837BA480410748FFEAA3F787D4DBEB10F767FA47CA329155DF49CD620877166FA5F5D3DC69139BDBCA424EDBAAD61BEF7B823A5FB758953D39259565166D81672DFDF711434F3651AA409E5D0A512ACC036E40E4EEDA74DE2575D4B68BB8359EE5AB8F97DDB5AFDF7B9BFCA25534BEF94D7655B41F57B7F862F1929C5707A196A566941924DD80040E418BE83A920BB470A72AB212095393938DB326DB45D5CFCE699269A013A8B639819E6949F2DC255A88B826F739252E0267E564FC897DC0E57F5F3DE3A878C7B5FC0B0644C06A24208736205873D1DC8DEFD045BAD4734B13E7262FA46446445127B1462CC715495C30E26410E02E22A7329923352D3492D89212497D534A9C438C9294E92EA928091949A0C1787703ABC5F189F2A90522264D42A6A414AD72D0552E584A92ACD9D40219B28CC0A992498D1BED9FE26933A8E7E118554B89E85214996B6B97049B82000CCD760400748DD9BC357C3E30CF03D935272210CCF66D6299392AC663629504BB30F4CCC8D12B4692985DDD6154C2D2D536A6395CF130038B740007899F16BDBDD4713F11D4617478977741207E1A4D3C89AD2A4CA0B5BA42416F11529449049CCC0B0481E6CD54CC4B1DC6A6D6D4CC99313327A96A2B5120E625CB682C583DB76DE326012E1692D3C0BCD04900384B880166CAB25774A42AC350005FE40479F5C458CD4E12A955984E253A5CF52D2A599530A48048243A487B92C1EDB81A467A30EA25C84CB54B4B80C54CE4960FF004F3D79BC793E7470F793FC43E199CC2D9B397B44C794F98656CB626E9F206AF21AD0525D66A4F25B9B469B829D135D53D6F1DF3D9CFC49E3BC193E8E7CCC4EA7BC421014B4D44D973012438CC95A54412015006EC1C6D16C9B8653D382A42120E64F8941D2A377CADA1B3F898FA4600B3BBC14F34F25EAEFE6470179C952C36A95599D772CF12D627CD2E62613A9D7A5241A992FD2C38E14A1B3FCCDD6E5D5A501A590176F47BB35F8C1E0FE3E91230DE31A5A6A82A9790564A4CA97579D59528EF49EEC4C4206624AB329C837BC432715ABA153534C52427C3949B16B950D5896E9D62DCB097889E6A644E27195BC72E49E24C01895B59A749E3B94A4293409808710D99898769BCCA6ADB78243BF172885B080082EA75A35773711F639D9D7695839A9E1CAEC36BA75A71952CC9975603789A42F24C9A428A434A4AC9D52088CBB05E3DAFA29A5750A5CB0A494BBA8A4DC0D744D811723E71E9DC447891601C3349A0E0EE1C1B98CEACE1CC36912D87B0F617945D5D2DAE65B0944CAC21050D8975B8D38EA4A810014949B9116BECE3E1584AC6A52A6CA54AA4973419AA9D2D40A4024E528292B054D94272D8DC86062D7C4BDA455CC9330226A8B83940535DF5770EE1EE09B3878DAA23E6E1484E89F9BEBC8BC731017DEFD6FDA25104163088C710842108421084210842108421084210844C9530CA98958BE53F2DE112A53A541409D85AC7DFF007F3F784E98672D4A2E33379DB4F28E49CCC0EDF3F3E7052428DCFE5F33F3F58E25ACCB50500EDB1DDB73F7E712F20D1CEFF36FDA205486C1B3A5B71B22652A090A500CECAE50292953C4AD2109505248D5E526D6CA3863139F458DD16212990AA39A898002C090A06EECECDB3EBE514D56724A3674A8292A21DEECCECC000DE77B59CC6B2DE395C2B624C038B301F884E4D51A698C4F81A765DBCCF93A43579C9BA2B8024CED465D905F536148597D61213AD482A209023E8A3E087E23EA714A4C3F8671034D4F2D5225C9913D6B48489C027289854A64A14949BD86609B80631CC2A72A831144F94A3FF7038E8E2E367BEBCADD4768C8ECD4A0E73E57618CC4C3F38D4F313B45A7B936F30E25C976EA0EB2C999979A48515B6EB6B2E0208490A49076B88F60F0412EBE9515F4EA2A9931209965C113080482351BB8B5FC9E375381388057524995348094A12905C5EDD3AF3EA76B7AD1569559640055E429E8A1D7DC5C8F4DBD22F32697169B30A8C9484B9BE64BEB62412145DB4E477DBB1512973147BB054924B6CE398BF5F573AB08996140A0213AF56FA6E12A5DBFA504903513D01ED7BC5F2452544A0153D21200670DBEAEC4DDAE186E0E978E67C89F210EA45C5DECC433DAF72DB7EB68A13CFCAD3A5A6AA1529E92A7C949B0E4D3C671CE5AA5D0CA0B85532E85061A4129D3AD6A4B690A0A5909BC50E312E555512E9BBF325765128241F0905DC0043B5FCE319C471FFF006E933261CB992198E999BE5BEF768C4566062ACD7F11DCF36F84FE180542432E642A12B2D9AB98F24879AA74C4AEB6D557956679E1F00844B4BEB6D16485CD94044A9756E35AB56BB68EDE70AECC785EB24CE34B327F773254A33168EF4B258CC2EA04A0974929B950235B46AF768BC715752A989932D0524104A4EE49B58866D58EB6F5DAE3855E1832D7848CA3A1653E5D509994453D9955566B886908A95667D0D3499D7669E404A5C6DF9842D4010094AAC7AC7CD4FC4FF6FF008D71DE3D5C69EA1465CC9CB00266950604EAEA3E10001CC0B08E9EC22B2A6BAADEA12C92AD1890972FE8EFE9A45D532A2E82B5DD2000128B0484A401B0005C026E4F7249373B468B56D7D52E795CE49CEBF13390FD5AEE7F68CE952912BBB4A2F6D459DF41B8B6BB3EE22991A9640B8DCEE7723F76FD22D7366AA6A8A893E44DBDA26BF8401E65EED7B6BCF7FEE5EB93D3A0B0B44B4A9482E9241F3E7B7F8D2242E5E720BE9D59CF5617FBDA211C44C01801C801ED08473084210842108421084210842390588235041F6842270A858E5E8E3F58441448091CB4AECE21CF36A162D9240F291D751B8FC22ED874D98B44E23C2A005C12E4B1205C917BDBCA2DD59878AC9929667AE577649CA824050B72E440D7A0E6FC09B9454E2669332A438CCDB856E36F32D3CC68B2D0A614C2D0B43AD2D2B21416955EE3A758ECEECFBB49C5B84315933A4A8FF0E6209254468417370012CDD3DA1574E8553894C1C25B396CD6003BEA79B102CFB8023029C7FF00820E57F1035B9ECE4C849A95C9FCD7B3B32BA55367572946AFCEB87985F999671D70216A746AD2D29A4F9D564EDB7AFBD88FC66CE9586D2E1D8D193514A132A5A93314833102C93DCA964997BD810924070A64C5061188E23C3D522751D5CD19561565902C5F40C08D1DC1E91AE6E6CE4A71B7C2D56A66899DF91D8A714E1FA638F4A318C70DD2A6EAD499B62557CB4CFAA7E841F61844C213CD4A67DC4BC02ACE2750508DF4C0F8B381F8B24C9C46871DA742AB25A2A154B55365CA54ACF9546589A4A24AD482ACA72A8BB12924398DB5E0DF8ADA8C2A968A82AE4CB5AE9D0896A985D4A2520024DDF63736F3B378B35C49E0A07955893AFE1F7D1B2A5EA544A904376D941A75B93FB54A48095A8AD6A0ADAF78CF918160D3E489B4F5D2A79525DA4544A9B725C3896A514B8B8701C36C6362303F8B4A09F29299DF874822EF6E6FCAC08D069E61E2A3DC4AE592104313551AA3842425993A6541BD6A51B04F31E954A13A4EE75293709291E62045A6A787095293FF00A16254A9B2D0A0967B254A04B5DEC6DA39BC5EEB3E25F079B4E55227C8134870124B72D73374671B5CC73A878D7363346A4D50F26723B3171A54262C1A7E4309D7E7A9E8BF42E3F2726522C06FA5CEA7A98A79BFF11C0291559896314B2912DBC09ACA75CE7701BB996B52DC394974B0BE9AC74D7177C4DD5CA93365D3290A2A49CA7311E999C0D1EF61B6BAF77E223813E2372B7271ACD6E2EB1527010C44A44965FE4F61B7E4AA58CABD529D713F07CE92A47C7BEC48C934F3731506664333E52C4CC9B67E3D21A191601C59C31884854CC0EAD152A41004C9E04B403943952A72532D09771996C9DC1168D34E3BEDA788B88A64C659961454004A8B92E5B424F2D3CB6B6C07E085E17ABC83C1349E2373568725FF0053316CAB8FD1A8D555CA3F3384687372A934A7ECD2CCD4AD61E6DD35408995F39B6E625D0EA1252511E6E7C67FC41E2986E2133843089F2C50AA410BA8A79A41993485778B202F28292320CA908294029725CF50D18AFC5271ACAF9F37BC0A3E052890403A02FADF35C963CAF1B23B6DB5A1B482A5A92A2B71E24799452902E364D9253B103512772768F11F8C2A6A2BB11A8AC9D5D3A6CC9D35531CAD4540AAE475FA6EE2ED9F502C212121203A024160483772EDB8D6E430B738AAB4A0D936B7B8B6D7B77DEFB74B763D7D311A7130A8CC9B3573521C842D448DF63A7B45C3BA5175198B06E4016BFD4B9F96F78A4A6D2A02FA82D26FCC6D6B6966DD012DA9208F9DFBC51A55397309CCAB962E90A480E5AC458750410378A79C0CD4E42490189B9670EFCEDCBCA24710E2C04A74DB6D576DB5F33AD8381695051049B2882AF31DEF19970ED6D5E153513A9EAA74952492C85948049F37B1E5E5A452268D21947C4FCF9B8D89725BA5BE63C7B3532172973A28B3987B3570061EC7149A88532F335BA7B53536C8536E36932B533A6A526DA02CFD94A4D30D15045D04A53A767BB39EDEF8DF84711915785D655552A504832D73D4C94B87219693B024BED7E711CFA644D97DDB64E643BEFABBBBBEFE7CA35EFCE5F02EC7993598F219FDE1FB996DE0AC6B86E7A66A345C335D144AA536443854EFF2E935D6A5672652D9B2186B9B306C2C56AD898F563B10F8F3A15264527194AA4953A6E44CC9E0A3BECC01B925452544EAA5824DEEED18662F8610850495298E84580BDB4F20361BC6CEC06DD49BFA98F9D14AD4ECEE0D8BEBAF3D63B273A79FC8FED118E6665CC32970DAFA98E4106E2112E3984210842108421084210842108421084210842108471E650A710C8427ED19996A6526E06AE4858E5A8122E85F32EAED740BF68BB61B3049EF265B310C92A7B0D490C6C6D677F4895365098CE4B00A1976254CC7D08D1D8BF48EB18E30450B3270C624C258C64E5EAF47C514C9CA1D665A6DB0F4B5469F506CEA5160A4A5A5CA38DB6A428042ACA5104D8C6D6760BDAE54F09E3945FF0050A96897365E8583670C5FA337AB6B18EAE9552A6B84304F5D1AE1D9C9B3EFF511A6A664609C7DE10DC4D55703D75BAA55B84ACD9A938AC275B71976A14BA24FCE4D26652DA1F934132C196D6F2421F55AC9B5B6B47D30FC3176F787716E094A9A8AB9736AE5D34B3365A94332D094A52169B8056EA1DE26EA24E60004931D91C33C4EBC2C4B41514249005F42E1D2AFA0BD886D5A32A542C4987315D1E46B187EAD2D55A3CD4ACB4C4A54A5DC4AE596CBAD256CF31D49D0D3EA6CA75B0E292EA17A90A40525406D950710E31595B30D3C84AE91730992B1E20524821989B00CE743B46C970E71E512A549EF569CD9124BA83070C75B7316EB156B15CA451E913D55AE4E374FA4D3DA5B93550997D1252B26D3682EAA6953AFA9B612025212105775055D208208CAF10C657494A5758132C250495125274724BAB636B807ABDA2FB8FF001C61A8A39850B438960FE600D8727BFBF3DEF189AC518EB3CBC49F3493C35709626A9196B4EA922999979B8DB4B6E9D354B92704CD45A66AB37FFA3743CDB46500925975ED450C1E6AD263583B57EDAF08E08C1ABB119F552A5AD1256512D53521473248428A5C29214E169CCD9810402088D4BE33ED09550A9F4F4F30B296CE97D943CDF5637E6D711B4D7059C17E59F05594D8632F32D68B26ED7DB6173B8D71B4EA10E54F15555EE63CE22696AD2FA1A69C2DB722590CA501A64CD17D21DE67CE1FC5CFC4CE23C698E5451D1621344898A988CD2D6B530CCACA02525432BDC802E5EEE63AE25CC9B891CEBCCB7006439728F15D6490E4E5240BB30B0DE2F1DD6DC74EB0B09528EA5A6D6B2AE491702C4024F403A6DEFA188A9AA9922657D7CC5CC24A9414BB953DB7BE8C18B1F9C5C138722907788D478ADA1D35E9A69EEDA5768143642D40A9573B0EDD00D875EBEDFDF19ADABFC5CDCD942427C23A8D47C88FD86F5B4B315345DCE55105CE9707C8EBA8F68A61275DEDB5CFA77BC51C574548421084210842108421084210842108421084210888BF617B7CF6F7FF0098ADA4AB14C160B32C8D4F27BB6EDFAC7043FDEDB8F5E9136B581E4294280D94A4EA483EA53DC7A8DFD62B92153BF892CDF5B33B1DEF6BB7202DAF3A79A82A0A04383A3DB7B5C68E3D46D6B450F86635175B69B5BCAFFDC33214E15F75724A540366E76B8D811E9B4EA7E21C670C5B4AABA8920365285B04906C483F987449B45B66D29538CA2EE016D41E4E6E7E5D39F5BAC52A9D57957A4AAD4D95ABC9BCE2D2F536A72F253ED2DA24FD9A5136CBD2A5B009D9D6D6E5AC4A89BDFB9B867B70ED0B0A453CAA6C527AA9E58012BEF9603002D94A811B3101A2D69E0ECF34D477EB41984AB2A54C120DDAD77DB7B00F16F188B82DE13B1ABEFCC625C84CB89A75F374392F4454B3EAD7E673E2B92FB729CC52EFA4CAB4CB6537BA09E9B01807C52F685492108562B549530702AA6A5F401F2CC0EC0B0D80B33697793814DA74909A99A02400095020EB76D75D7CC3F38F874AF0F9E0CE86EB5354EC84C01285B710B0EBF4E43FA55A81DD332F3AD104F96EB4102F7002AC466749F13DC71894DFC3CEC6ABD2952144135D3AC425D9CCDDF97563637A79B2EBE4A95DDD52946EC92A0C6E5AD636D40D437A4778C653D913C2AE5E631CC97E838372FB0BE0EA62A6E69325274AC38E4C25B42396C49CECC36D7C54ECD6A4265256596E3F34E38D36C36E2D6906E1D92F1EF693DA4F6812703AF15F3F0A5D5A91DEA7BE999A5A4A8E677585064824DECEA360F188E273F1251266CE5A9249D4E8072DB561E7EB1804E1532DF1EF8ADF16B53E2E33C68AEC9F0E194B5B7D193B84AA867E9F295DA953DE54BC8555D54C3CD30B6D87D4DD49728F8D53932D38D290ECBBC9615BD9DB9F68D85F621C013B07E1DABCFC4788D34B15F37349989A79250850A79672B89E56099B3104E54AFBB74CC4A9A8E8294CF9A89935CA125C02EE54E4124368CECF6B66B8D767490A43122DB4CCBA39328C21B6A5A450DB4CA659865B436DB4A5348421FD9014DB975E864B6CDC06C253E20F687DA5E3BC4B8B4EACC627AD7356A52A592BCCC87569989D4BB005AFB80D19AD3D2242032580B66B5C37EBA1B8368FB3A5211E4F2116011D6FEA493E9F38E99ACC466D52C925C6EFB972E472D98F48B9C99252058BB8DDADB35EFF003893ED3F768E69CB0502F724BBF3B1B746F9BDCC5C10E05FAB3BDBEFDA2A44E099697673D3F416B0F2FDA259412E19C79B7EB1305102C00FCFFCC3F14502CA0E2E05C1F47864568C18797DF972E9112B24822C2C6FB8D57D88B7B75FCBAC5CB0FE28A8C3A62E64B485A94928BECFB8B8059B9DE19093716D0E9A7CFCE387CA086A60B2843732E2B63756DE624AC5CE90A02C537DB6DC18A5FF0077C62AAB454A2A6A650CC54D2A619601D406B59EC482E6EC629EA28913CB1B0E76E5A335FE623936B6DE9B7E116020A5446E0B7B189998FF004A9FCBF5FED088A686500429272870A0C4173E51365A83310DE7FDFE5FBC225C4D84210842108421084210842108421084210842108448BBDB6B7D7B1EC46E3F589F215E308760A2DC989FED68446E556425412A23EF1B5874BDCD80B11717E9BED6BDE32292A9B86AA5D54A98525042832803B11EB7D2FD7489536521692543AB8373B5B9EB76D3CE3C1F881E1CF2E7899CB9AFE5AE68E17A6620A0D52594CD3DC9C693F13419A524A533D459A16704D22EAD162E8DCF93D3707B0DF897C67832A69908AE992448992DBF8852084AC12F70E0E5BA48D39DA2D73C194AF0E636BB073616CD6F091ABD8EFA9BEB558C3C1CB8FCE1C2BB3E8E0CF3A64717E017E7665F6B016399A92627A992AB796B9770BF3D312AAB308525255CA08DEF609B01EDAF66BFEA3DC128C170EA2C4E7CA15C990844E9EC184D281994B400EA75386490CEF76112D38D575125265CC5E500B3925C3116218379BF5BC56C29E0F1E221C4255A495C5B67B51F0C65DB4FB4E55B0860CAF50678D669A85875F9579CA53AF3B2CE25C1F0FCA76EEA9009BDAF141DAA7C7E70F4FC26A666155122A27AA4ABBA59590896A0C52B4A12B492A0C1B39286B292444A9BC4F89578EE15326A41B13E2B8DC13CBA8B03E71B1970CFC2F64CF0B397F47C0394D84A9B86E8F272ED3535352EC876A75A9C424F3E6EA936E6A78A9D7829E162DDD5A469B794F8BFDB6FC58713F1C4FC428135D36626A27282D7DE2806CCD60141200D02521800E368A74E08BAA9A26CC2A66CCDCEC092E41277DDDEEEF172FCA50792B07C840B0B1B7D3DFF001DBB5ED1A755D366D6CCFC656CC33567C5E239B52E5F7B824F9B0117BA5A4974A82946CEEFAB9041F4760FA9772758811A4950DCDC8EBE877DF6E9FDBE716CABC495552D34684B2010033A5EECC5C9B59BF78AD2D312DA8D34BDF6EBAFCCB40282F71FBF975DBD3F2DA2DD3A9A6D314A66800A838B8258F36FBE710CB92248291B9727993A91E7FA0B3888C488990842108421084210842108421084210842108421089828A6F6B6FEB0C857A025B937DED10A9452CCD77D7D225B12401FDB7FC7FE7AC55D3D5AA9BAB16662772EEC762037D60E950B91A7B1DFDBEED1026DB6E4F703B5FBF4B5F6E8627CCAD953537961CEB6FA173E9CB68E320E67D58FE913F250AB13626DD48DF7DCDC8EA3F6045322B6A81099648009602C2CF60799F3FED466A2B53372A12E8059CB80D7E805B9BFB448436CA4DC0B1BDC8EA0F7F5EA7D80F5DBA64D83D1E3B5D31024B84A8D8AD441236DC339B31DBADE2298AAB5A5DC07E45AE46BADEDC85CDDF58E8198798582F2CF08D7B1D634AFD3F0E61BC3124BA9D62AB5479B6A52564DA5252B1A9C5B6954D3EA5265A45AD44BD3CEB0DA50E29610761FB3FEC6B8DF8CB14A2C3F0F9530CC9F3104CC40504848214A054EDA2487D376722316C4675461C17573561694120A52ACC6F6D01F5B79DD9E357FC695FCE7F1ACE2065F0765E9A8E12E0CF2A71507EB555756FB4D633939098B4F054C28B489B9F9F529C4B52884A8D3C2D0A53204B18F61F85B0BE0DF871E01973B1E9743278B461899A145283534B3662000B55C9CF35044C4850BA1692C5DE30D9DC4F2ABD650259C854012124051DF57E4DD407711B3C657E5A60DCA1C0587B2F70650A4E8D85B0D48C8CB52E8F2CDA5B654E48CBB2D227E7DD480B75F794D098754A5242D6A248F35A3C83EDCBB6AA8E37E25AF12EAA7544B35534A02D44A194B25C9D1893A25801A002330C0A4A6ACA484A92E960C9BF422DB0D1DC93CC47A134E25D53AEEA529C75616E8B7D9256129404B1FFC410947F52BCDAB7EA06ADE34AA99D5095D410094BA424B86BF5373716B466829BBA4E53F94593719998139C6A144BD88059B9C56E91681254E1D9BA1D3CEDF4F78E42002F72DCDBF40211C99850A641D0DDEFF0030DEADE4F052882000FF005D624F3027CA373DB6BFE6638EFE61373AEA05BF788E205449B276F9FF007F9443989362CF7BDDCEFABB6E7FCC2264A74DF7BFD3F7EB1514EB95216F3466074B726F5B6BF77E0902E62622FF0050444732AD4A59120650E58871EC1FCB5F268E33A79FC8C525BA1D2082494800956CA24775000589B5C8B017B8B5B68BE0E1E9F4A8993EA82913A54C53CB506F10BB317245D872D758B7D2D52159430B68E5C74D39BEE3F78A8D8BA53FFDB4F6E9B6F6FAEFF43DE2C15F5B36B6705CC96841420212109CA1924B66726F7BDC08A998BCCA0CC3E9D1F523C873D7488C51C4C43BEBE7D628A42AE08E97DFF7F2F68E4027627CBFC44D8AD1C6908421084210842108421084210842108421080241716221089866CC5062B510CDAED088DCFA984B9B325282A5AD4953BBA490621284A9DD20BEBD621CC52D646FA8A74157F52923A02AB0245BDEDB0BC64F4F8D564A423BBAA9B2C8672998C7AEE7DBDA203224905D093D0A411E637F4EB6E9C654903F746906F700800DFD8587F7BEFD62A66710E2335395788542D25C10A985AFE8621122402E252411FF0081FDBEBFB41B94E5282B6B0BEC4FA8B6C3EBF80F94592B27A66214B242A613656AA73A5DBECFCE782D64B81D0103E968E4DCFAFECF58B499B30820AD441D43984220D348422252D6B6CCA2A60C1F6108443084210842108421084210842108421084210842108422346705D009E7671F77896B4A94D96DAF2E9CE11592909981A62402747B6D73E7D0FB44210A60E2FBDC42277FB785DD0480C4B5806E9AFEDC9A2624102E6E4BFDFDF947157392CC2CA1735CA037097125C0B776F2A402836BED6BFCCDFAC745864CAC9C6521255350404B6A482000C01B9DF9B7568A69D572E5A4BA5266074E60E0A53CC8721EF73D46D1E419D99FD96B905806B998F99D8AA8586A854D975FC43530E264EA552F21537254E44CCCA82A69F521210A4B2E5B71CB51371B77D86F623C5BC6B8AD253CEA09B2A88CC4242D32D614B482E0A544313670CE59F9462D5F58B7294CD98400493998E846C19F95AC1EC358D6C2AB5CE233C6CF353FD3F4592AD650F04F802B613579F6DA9A62AB8C69D2531A65855671CE54B4E4BCFD404B1684BCA31A0ADA5EA58410AF58A911C19F0D3C26AAB59A2C4B89C513675AA5CD461226000A9591B355B2B2292A5012CA94152C94BC628535188D4090B5AFB951202560BCD5072C39A433DB96AD1B25E44E4765E70F196B43CB1CAFC2F2F86B0ED0E565E9E1E94436B99A84D14244CD567DD43485294F3AB71D5158EFF7AC2F1E51FC40FC40D6F1C62B529915F31699AB5A94933592A049536BD58274660031022F74B804B925CC84306B6516D2E395F5D753CA3D99C68A53A0AF99A4692BE9AEDB6AB5FA2F622DEDD846AE77A9ACA75CF5A477A412546CA763A68E6FC9B93465D4320D325252026D6CA000DD6EFD3D2FAD8C0D2142D6F37A7B0E9EA3E5B7E7187CE528AC82A516275512753BFB45DB395804973A6BD7E515E251528862A24722491ED08471084210B0BDEC2FEBDE10842108423199C01788D655F189845AA63EE8C1B9C78793F098D32F2B0F225EAB2F36C2432F3F2D2EEA5B986E454F36F25130B6960A90E26C4B7757AAFF0011DF0B588F0FE26BC47069099F84D6AD5369AAE97F894D3D2A39CA513100254BC8A4E64804A49CA79C758E1F8ABAC0CD71AA6E080E5FC3721EE3E978C95A5D0871D966D95CCCC855B9216197595292950E73652E11B28280B8B8F35FCDB68971676733707A94CA32569564CCA7053E224E81AFB682FD358CCE967F7D29330286505CD9C948D46BF3313A1C0496CAC29E6EE1E4A4795B26C52926FD7AF6E96F58EA7AEC3A6522C8292C3576B731FDAC5B68BA4B2E5D98338BEBAECDEBFADA273701207A81F48A7956B74F320FD98A94805DF6493EB134532B53E67EB10C238842108421084210842108421084210842108421084216B7EB073CCC210836BD75842108421084210842108421084210842108421084210842108421084210881B9D877BEF6BFA7E7BFE5D2321C1A9D13D1382DBC2035D9DDFCFEFD184800924001B52DABDFD396EED688DB4A929B02544582961B4926DB6B215A7A1B581F90B88933E8664C9C25C8CDF9AF9415313A68C6C1EE1DF9BC534EA8421248371B0D6CF6D472FA18A6B71286CA89B39AAC5873ECDF401B15B6D9D466120DBA68BDC6E2E2334C0380F88311C9DCD34C58514FF002A8B0537B937243ECD16F9B88A424F47653BFB9E8DADC6F668C6C71B7E24990DC18532625AAD567314668541B725F08E0BC31CA9EADCE579DF2219A853505D7E5DB438487516529B2424A8DAF1E837609F0915BC4955438B56484C9A5909454D7D4D5112A969E524256A5CE9AB494A40D81D4900177118756627FC55E656AA20252495172400C0172F6B75318B6C9DE0DF8B6F135C6F4BE2178DCA954F0264E4BCCFC7E10CA54B8F482AB14D98744E4A2EA0C4C0B065284B687580C15ACAC6975001076FB8EFB6BECC3B18C02770C709CFA3A8C7A4CA34E31497265A0A66CB4196BFC2A92B5158510A026B90A9649C833068A4CA9952139D395240010E4926C407DC0D40D4100398D8E32EB2FB0B657E12A260DC1540A661FC3B429514F92A3D3659B9690618658530DCCA5A48E6AE69C1A56E38E3CE24B8B5A8206D6F2A3B50ED8F8838BA757C9AAAA98B9559356B04CC51042D454F72C2E5DB42CF17DC2F0BC9532E6AD395282081A10400E2EF63B8E4EC4477566ECA4A5B0528524A1C03AB8140EAE61DC1363DADB7CAF1ABB594535530AE6AF3072B0A55D40820D8BEAFD0A58C654B932945C806E160386045BC3BDDB99DF47115927524036B74F90D80F71B0BDBBEC7B889132B152A51952BF99EE090EFF7A732FA0BF0500F4F26688E909D81BF7EB7FDF48B5BBB9622FB868241018F3FDA11CC450842108421084210842304DC77785854ABF8951C52F06D597F2C3894A23BFCE1F92A4ACD3E4B17BF20AE7312FCA95D0B54C3A1B0C2A6541DD49281C8F212AF727B07F88EC2F8830095C25C7EA4E2B854D012A95302664DA45A8009A8A45AC9C93259016031CC521C8D4750D4E0D572672A7232A569DC12C43E8AD9BDBA3E87E9F049E295298D71149F0EBC5D5393947C40D25C4D1CCE54AF252588E6DBD2C30ECABF3296545530F25615AB502A55C28EAB0A6EDABE1E66714A57C57C0D3A9711C01526CB9601A894B56650973A5273649A9053E10A20862F7B5CF0FC7E9E807E12AD2B4CE26C19D376B876705EC1839E8C233712D312F32961722A6DF6020F3E6658A5D65E2B092DBDCF0402909B924022C6F722C63CB4ED1783B15C06B6748AAC3E7CAEED4A056652822C58EBE435B7AC669435F4F5233A54CED941D9C7E57EBAB163A3C72C1D64E904A1241E6EDCA57A84AFBDBBEC23A5A70FC3AC80524B90425CF99B0F2FF117513000E3F981B6EDEFE5EF13C521B927993114238842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842234CB5292540800733AF940D813CA11044B33072F7B7EF08E402A2024124E800731019E90D6372DEBED08AE9787CE5A5CA908B3B2CB1FD2F118980EA08F9EDF62CF7894AAD7B855877B6D688E561553366776907FF009149CBEA5FCE26800E8A4FA98A8D3ADD96B52AC940054AEC8BDEDA88E9DED6B8B83BED19451F0A62E854B4D3CC9530CFFE594B248361E26E9B6FD22DD88D4A69528CDFCC4B7566B8DB7BBFD63CD734734700653E16A9634CC4C5948C2986A9726ECECDD4EAB30DB4D372CC805C5B6D2D6DA9D50D413A42937241BF68D99ECB3E1FF8B7896AE966FE0CCD96B5218774A2F988D2DA800B0D3C8C61D578D480E0B80FAF32DBFAE8C1DFDE35FF00CF5F141CF9E2B7174CE44F86B60BAB57BF99BAE52B15E6C54A4DE44A50A58AF92BA85326A5B98969B0A25C428BB7D2949DCF4F513813B12E0CECE70A9589F68732970F299299F2280A659ABAC32C0250A4AF2F72862332FC641397217262CEAC45554A52648510EC56E72807CBF3173A37AF2BA0E0CFC23707654575BCF0E25AB7339F3C45CEA113CEE26ADBC154DA54FCDD9F9D6A5D8994CF2A64A1E3A5133CC972B09D5CA4EAD23A37B71F8B0C368696B384F8100C2F07A5993109A1A4697214B1993DE2D4829EF16C5402FC36528B5C34DA5C26715F7C7C6B533AD57241BB0E439F974BE65E464C49CA3728D36CCB30D1429A61A482DB41008084582004A76B5922C36B1B47979C55C6231EC426D7D655542EAD7316B482A25249249B1D05EE1CF521C4667875114175A45EEFAFB6C4F33BB691CC1BBCA7144A94A1A6E760902D6D237EC2DD46C7DB7C46B7109B369573497989004B62CC2D7E6EC357E9D632232D9032F808E8E0BF3D1B7F5F48AA6C6FB0DC58FBED68C567564F9C085A8B1E4EE6EFABFDE9BC4BF181B2BEFEF99EB055881A45AC2DBF436F503D7A1FDDE950188CE6D9812D761BEBF4FAC471017EE00FDF7F78AAAA3209477249F0F8BCFF0043D3FB422314B084210842108421084211C47913328968CB8750C4B952E4DD49BCF493AA3A96E050EAD9579800B174DFE9DA3C11DA0D6E055B2809C432C7892A2DA0DEC5C6F60D16399462A01CE904104104302EF666E5A863AEF68C74F1AFE1D1929C68619997F125265305E64B0CAD34FCCFA1C9B3FCE5B54BEA7641DAC041967A6651A9871E5A00992A6545E5252B2BB47A0FD8C7C5654F0E63347475B524E1AB484CE97399729626F86605CB52824BA40177B3EF161C4B8724AC77CA4174A6C45988F7D1DC3EE47531891CBBE3038C9F0B6C592592DC65E17A967170FA2643184336E9AF4E4CBF4FA5B6E06A510ECCCC4AAD7372E96815BC87DD9412D61A39FCD568DDBE38E06ECC3E20B84E7CDE14187C8C7A6D399A285E4A1539450A33552143F2972908964312497043C62DFEE5370C9C2592A0805B37F4F225AECFBFCA3634CA1CE6CBFCF2C1745CCACB5ACAEB783EBD2CDBB4E79080DB726E388438587901C5EA5A0287436163F4F1C7B4AEC1AA7B3DC531295892532FB99939D0BFCC9524B04ABCB4DEC488EC0C26B8D64B42C28310EEE6E96D2FCDF6E4D68F5B8D5E9A90898B48B84A881E86323844B84210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084226194B0813329C877F523DAD12D44E6CAF62C3DFFCC41448B585C9207F9FCBE5F38E64AD2850CC1C1B5B67B13F7A6B1CE44F33EE3F6890389248BF4EA6FB8DBB81198D2A29914E6A654B0B992D39C24072543460C5EE2F7E9B3C4464240CC4E96F736B91ABF3F789B526E13A93A8F417173F217BC500A2ACC6A7664C99895384A529490080761CC9B3EFB691473A6A653B906CFCB4D40D5EDE51F0310E22C338529D355AC4F5B6A814D946DD7A6A6DE98659A6252848257522FBAC1B917D4108780401B9E83BF3B3BEC838BF8AA6CAA0A7C3E777538A1026192A03C459CA802598817DB578B054631DD29C076248516B36E356D1DAC35D58BE13F89DF19FCBAC2D517B2AF848C1B3FC42E774DCC4C48CAD3288DDB0C51DD41434CCC19D6DB9B0E19A75C56A0A9768012DB2957DBD19EC7FE0770FC0A9E6E3FC755D2682966290A4CC9CA493298152B2CB9990AD6014B27C20BEA0C58AB7165D60CA1D653B6AE058126ED7D4B13A88B74CB9F0E9E2E38EFC4F279ADE20F9975AA1E03538DCFD2F263093F34E229E95A83A6467D97DF919671AD1A5A713CADC249DFBF62F1276FF00D9976234DFEC3C2B8709F3E9A59953718AA1295553968F0A574D4E14A146CC4828A89A4BDC0CAC6D29C3EA6A56A54C6D4E49693E1CBD567F306E639467BF23F21B29B876C1B2B80F29705E1AC2986A5586DA5A24251A945549D69012998989C665C3AE4F2815296853453A96AFB5D813A13DB17C47D776933679A4AD548EF0ACA8AA6A92F9897B827561E768C8E8F0A12825410A50703C2916EACFA37577DA3DA5A012DA004AD20252025CB7300B6C17627CC3FAB73BDFBC69FE2B8CCC9885266CD3366DF32CAB3662355137776DF5E717F9549959830DB60FB8D2CFB0F9F3A96DAF6DBA7B7CA3AF27D419B34A89D0923ADF5FDA2EB25052DB65166B7ADB73AF40DCE292479BA6F6DC1E82D6DC75FEDF388BF12B328CB7D6DA91ECDEEC5BE422A8AACC4DC9D39EE7A003D6FCA2AC52C4308421084210842108421084210842113BAAF2DAF7163DC9E9B7E1FE2F096F2A692FF914CEDEEDD40D2258225F88EA2E06BA72E87AB72BC71904367981C2176D211BF41720EDDC93D37E9F867D47552154C85AE6995392A0CACCC59837F306B92EDA1B011CCC9A898854BC9A85329C6AAB337462FE7A18F3BCCDCB3C1B9B584EB583F3070A53F15E19ABCB2D9A852EA4DB4E30E0295243E10E36EA4BAD85AB46D7F39E9DFBBB803B6CE20E0908387574F3DC9065A9139799053F94A483622EC6C7CAD1855770EF7F37BCCA9F11D3505CB369B5EEDB5C8168E0E4F650E09C94C0D47C059714090C2F8469EB53B4F94906DB6D2CAB4A124292DA1B09F281F87A6F189F6AFDB5F11F1F54CE99884C9B366CE5297366CD2A54D9CA57E652945F328BEA4BB8DCC5750D28C3C22581A30CACC03E8396BA5981676B47AC47401254493A92E7D63294E83C87D211C47308421084210842108421084210842108421084210842108421084210842108421084210842108421084210842110B8BDBBFF009FF91F8C5D04F942844A206700EBBD987BF57E8DB7052DE3BE86E5DBEED112AB581D49480ABB884EB2DDC1015A091A86FD36EDB88A9C1387EAF1BAA97229D0A65A901403926E2EC059FCD9E28E7D4894012013A804FCBD48F47D5A3CCF1FE6765D658D15EAD63FC618770C5259D7333153A95499A63A89666EB79C7651056E4CA5B4A56A5326FCD00A3FAA3723B3FF00875C67189748A4514C9C1443A1085294B16364E52F62D7FDDECD558D265CB5BCC60907C2AF107D035EC473B16DE30ADC4178CEE0497A94E606E10303D7B3F731DE7CD3A9F352529312986D99E715CA65D66B0CB73B3CE10B5255C87298D4B90024BE94A894EEF702FC20F0EE1A6462DC6664E0F4A8089CB338CBEFCCB06EA449CC1CD8F856A473D098C6D58E0A9514A3C6A0481B07E4F71BD8DC73DDBC1287C0EF88D78804D358A78DDCD2AA650E5BCC38DCCB194B427E610FBD4A78EA32F3F2528ECBC8A57CB1A6C1C7414A8155945494F65F13F6D3D8F761F44AC338528E46255F4F2823FDDA726529299E9CDE2914EEB194029216548538578583980514FAD2EA394125902E6ED62417DD9B9728CD1F0CDC0D70CFC26D0A4E9B93D9798765EA09659FE618D2A146957AB15B99612AD0669DE4B8F20CAAD4E2D3A9E5DCCCAED6B6FA17DB37C62F1771904A70BC4268968CE14D354159491940CA4B000358FE9171A4C10CB273900280094E9CDC8767F2D8F5BC5E24AB8DAE5820F9DF43C56B5309F8765091FF00C408053E82DB5B6EF1A4D8D71CE358FD42A6E293264D52D454E56A51503AEC58B91EAF7378C92930D4A00CF97460DBAB66234B3DFA33C7201B8BC62758B9AAFE2254A4277492C4921C1FAF41CE2E0A969942E0300C6C068DE978815806D7B7B83D0FF9BFCFB45377AA54B4A4924D9DF7FBF2E7D227A65029045DC0B1B7B5FED9BCE00A8DEC41FC41FDFD6298A083A6E7D3CDDBEB111494D99BEFA44403705477B5ADE9F5FF0068823889A108421084210842108421084210842108137163D3A7A7E906B93B9B9884A52751D3EF6880007402FEA4027F1209FA472A5294C14A510340E40F605A20EE92F986BCF53FA441490A26F7B1EA9BF94FB11D08EC47423AC56D26213A8AF24DFF00F2621BC883CA273D9986843B5EFD75FBF26821B4212B4A4592BFE9FE94FF00F44F44FD04735788CFAC20CD090435D203BEE4DB778A7994E89A41512E342F7F27D5BEDE278A089E2C00E50842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842200006F607DFBFA6DE9B77FCA2AE6514E453A2A5BF86A2C0EEFAEDB73BE8FE90AF33166D37E7F6C79C757C6D2B88E7F0B57E430AD45BA3D76728B5597A555DC473134FA9AE45F4D31E2D04AF5A4CE9642C6955937241170765BB05C5383A8EB654CE219456A428720ECAEAA008218B3F2B3C58AB65CD9815CEC2C3A680B7CC06D4F9EBFD46F070CD7E21F14D4F1AF1C3C42626C74C22BB34A93CB4C3755AA2692FD294FDE51E9B982F48A29EDF2882F312CDB9F6683642CAC83E96CDF8B4ECE3817064D1703E134743894AA608A6ACA89722A2ABBF324256AEF179CCBFE2662928538043170D18B4EC30CECE26A94A049747E54E5D2E3551D2C407E66331BC3CF099C3CF0CB4B92A664FE5AE1CC2D51926132EED7D1489399ADCC2123492AAC3ACFC6A96413670BDAAF63EE34F7B45F8A4E32E2CEF8D6E223F899EF297914C49203A5ACC4331E6F6788A9706952C8CA9372E06D7E7CDBAC5CF25600250B75CD4490F4C2D4ECCD8F54F39C25C08BDEC80426C7A46A1F11718D562EB986AAA664C2B2A72A98A51199D83391D59C6A3CA32AA1A308661A6AE2CA67B5DECCC2FD7CE217290436A5320FDE4B0A2D2576BFDF4A2C14773B917DFAC60536A44A2A3209FE2865025C59F673CFE97B45D932501B3252ACA4949233104B3DC8B683488292951048008EE3627A7DE3D4F4EF14D2EAE64B5660947FF00502FB7389E92521869B3B96F2736D9DB560F0000161FBFF3F38E27D54DA86EF08B17B5874B696DBCE25CC40981947CFAE9C88E510D293BDBDFB8FD2DF9C494ACA746F6BFDFDED13124A4000E9110903A088BBE5331093E63FBB4092753118964B973BC7108E2108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084535056A041200B7A5AC76FEF7F7E9D378BBAABF3D0CBA562C93A90399E8FA9B1FA4460A72DC686DD6DEFFA69105A14BD212AD04282839A52B520A4829D285DD0BB94F982FA03B0BC5FF85D545226154F9E25E623F9CA496018B8206B6376E46242D0142CC0F222C75D77EAE2F1054BB6E73358534A7B77DD93519571E5A40085B8582DEB02C9D4DA896D56B1052488C97169585CE42AAA556A4CD4254520CD2A72A052E03900DED94383705F5A4994485019521C105C9E5CDF9E9BB6DA5C19012940756023A2804EB3FF00D8F7BFCFF531834D9B51500A4CC245C02492080EC7AF993A9B1111CBA508BB26DB1BFE8C474E7F3989205AE4DB62483F874B74EF707D2289787CC5172497BDDFC8FD3668AB094822CC398D40D3A96B691147426DD7F7F87FBC524FA73200248249D8FCBE87CB7888B6DF57FD05F57F489E29638842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210843584223EED7FD26110B8F51F8C4041058D888381A9685C7A8FC639092AB00E79405F4BF95FE90B8F51F8888BBB5FF00498E58F23EC6171EA3F110EED7FD260C791F63118776BFE931C421DDAFFA4C211C142C072920084221842108418B3B16E7B470E06A40F584221EF11FD4211104288700B444083A1784431CC21084210842108422248CC425C804B18A65CC5A56C2E2EFD03D986FC9FD2220DBB03F317899369CA40226036764A9881D7CB7FF0011185A8D803EA2F112AEBE548FA6F13514730CA54E33D29C833652B2EA6BD99C1EA1ED13337FE2AF68962648AD5A080A621C5FF52EFF0064C705476497EA211553B133972A05F9BB81CB76F367E512CAD61DAE46B61FDBE4FCACF11DBB580DFE9EDF4FDFB5B26CF5CE3E3DB937D46BCB5FD23994B52CA9DDB676E9D4E9BE83944224C4E84210842108421070352D0841C1D08308421707A1BC21084210842108421084210842108421084210842108421084210842108421084210D2E3686B13E83EA9FC7FDA22FC42F62A7FFE29FDA0E06A5A2422C41251D6E09B7E7B83B5BAF4F94121738B252A528D980BFA75BBEF12D492BD3463FDF47035DD8FA44C12DAC12B525241EC7ADFEBD3D37B6E6DEA669A5AA96CA0850246FA8D7CBD5EFE76694EBA624E55282BA0B72DB7F206D7816D9B1D2B04F617EBF9C3BBABDD25B7FB31CFE2D674429FC81FD229E84FA7E67FCC45DDD4FF004AFE50FC54CFFDB57FF588DC0DAE36DBAC70D502D9556B7E51FB4540CCA00B1B8736DCC2E3D47E221FF51FD2AFFEA3F68E58F23EC6171EA3F18E1427904292A6DFC23F40F06235047A44625645FF004ABFFA9FDA3884322FFA55FF00D4FED088DB6BDF7BF4F68E1D693958806E2C7576D1BFB6B12165615F95F6040B3FCDF51F3BC44E816B2AE6D73DBA5FD6DFDFEB1C3CC55CA6C4BBF3D9ECE0B336DE71284959B9045EF720FB6FEBEB12EC3706F7B13F3FEFD07B44C4CD9A9041B0FCB70EE3DB7F7B4542539370CCC1EDE9F2F3844B89908421084210842108470C390F6842396034004239CCA6672DC9CB7B4211C42108E18721ED08472C06800842108421084210842205E83CFF004308E5AE1ECE1DF5B449412C0B97BDDF5BC4AA4DFA75DBBEC47BDBE7172934489D97C612ECF7D398B9DFEDA27A4A7C24B16E658E8C7AC100806FEBFD8453D6530A699902B303BFE9B1FBD6232413E1D36FBF389A29238842108421084210842108421084210842108421084210842108421084210882BA1F91FD2264A4E79884FF00516E5AF5DBCF68E46A1F988E3B6B595805571F4EC3E87A6FFDAFB8B97E0E4A54332C0F50C766BF96FD4C4150024A5BC232BF57B39BBFA73E51D2F30CD72568B313587DE4B13AD214B48490B71764937D0E1580761D1207B0119B70F61F87CC9D2FBD4A549CC3307B9D34FB23A9313A813DEACA5F5209B682EC1D98FCCEA7CACE9ECE9C7F4E7552CF4F95CCB6B50986D6DCB24A2C404923969209B2AFB58DBE71DA88E13C2AA80525196528032C84BBEE7507A137EA778EC0C27875388A0952012860599C72F4B6BBDB9C73D8E20316B607316C2963A29694E927D48414AADEC2251E08A004325C3DFC21C8E574B0E6EC79345EBFE13288632BDDFF0042639E8E223168B0E553DDF936FDFF00277FCFE10FF85503969674E482C5ACE320FA7CE38FF83C8FFDA1FF00EA8E627889AF1DDCA74993FD44158DFB91774DAFBD81E9DFA448570252E62404B13A143B7470CE7CAD120F052038EE880346517FAE9C9C9DA2A0E22AAD6DE42541F659DFFF00F431C7FC1246C847FF00450FDE38FF008523742FFF00B3FED1599E22AA41C4F3241829DEE10A5157D005DCFBFE30FF0081D390C5097246892033877245B778826705A424912D479B927E435DA3E99E240B4805CA5DCD8136E60B7E040F7B778E7FE03487FF004D3ECDF48A43C18F709581C8001AF7D4751F2D62238932403FC993D3FEE73FFF00A888BFE0549FFB52FF00FAFF007887FE17FF00F57FFD1FFF00AC4E9E24D0010AA484A8F4B1748B7AFDF3BF5F95C7BC51CDECF24CC9998494948B064FEEFCC1D6DB3344A5706AC28069BCF2B0D35170966F26F9C54638919353C84CC534A50B296F512BB24AB607EF5B63EE2D6EE3A97C012E5A484C84120153006FCDAEEEDF3BEB12EA3850C896544CC0078B41D5C7E50599BD5EF68F69C038D67717373534ED37E12525EC65DC56B027011B58A9442AC00FB85277F9475DE3F81D2D01CA152D6ACA4A909FFD3531F09D5CEE6305C4902996A4070C7A3060D677F9F3BDC47A5475DA9B3298300486F23100B81E42110C7308421084210842108421084210842108421084210842108421157452D136A1085B6520BDDB6D5F9F9D9E21507077E508A8ACA60951EEBC403B005CB7521DD80E9E8F14EA396E4E8F6240E4E2FD43FCA267026CAD21C0509D487824AA51D5752DA976B85249293658B11D46D6E6870CC4A7A8193266292A2D649CC9E4416CAE7935B523734AA9E527503762C4B73F26DF4D75DE06C52855D254A4DD6947DC42AE4593724D8A4026EA26E7D223C430EADA29894564B989528050CE18B17BE809B86E51554B34CD4924D815002DB11BFABF918845BFBB1FD27E7155087763FA4FCE108910842108421084210842108421084210842108421084210842108422045C103B8222396485A48D5EDE66DFE6391620F2222921AD26E55723F4DBEB7DA2A26098BDEEEF63A740FA036D39441500CDFCAE1C3176FBBFC9B483EC34FDCB8D2564A74D9449163EC763F845CF0BC427D04C0B5A8AC0FE51EFCFCB6D5E14D9A4060A29721F736BFB5F93EE3945A7672E5586F5E27A63284B639AAA925B4294B2494A99B252ADB60EDC80476ED63DD3C25C4E2B91329CE6409646472C94E6706E43DD835F68EC8E1FE2F95403BA992332940242C162AF7B5983DB7D22D45D65A404120A54EACA1011F7C1EBB83A823616BA9247A08ECBA7CD34FF00DC16B904DBD7426EDA476A6178B4AC492081DDB80439DC8DF987B5B7222A27992E2E97DE4D86E0F2557B0DF7E5DAE3D07D2F13E64A50BD9CE803936DF5F367F2B08BE2A58480A05C38B1DC7B6FF6F1497A1775595A95B95123727A920003DFA7D00885339831290536B9EBE7B6FB08A895534EA013DC051000243DD981E7777DDA29A5094DC6906E6FBDCDBF388BF1096B94D9C0BFDB8F5E6C62A15329C24114E492EC329F9B3DA26BDB74A520F6363FE7F7D6099CE43104EAC35FD6E366F38A7554485FF0C53B120DD988E841BEB6BB74D6F15A94E0B288B6DDBA81EBEF7BC4D336633B11B5C0FD2204CB945DE501E96FA7588210857F52C01DC116DBD361FE3DE39CE0302468EE406F73A7AF9445DDD3339091EDFA0814A41002B5A55B022CA5155FEEE9EBB5C1077049DBAC45F8C44A494E54A88199DD80E6E4301A73B5F62628EAE6D1D302B64121DDD81602F67D75DAE3CA3DC72EF27EA1891E96A9551BE4D212A0B5A16DA838EE92952528374DAFD0900DAF18763BC532644B5A5082149046641D1C31D8FB9F56263AD38878B68E509B2134C92B214CE7CD8916240D480C5CF38BDEA451E4E9920CC84B369665E59094CB06C6952481625761E706C2DD3B93D76D7EE21C515553A629198249B826F73CF5773C8474C620B35F31531242492EA6701DDD92092CDD5F6F28FB31886B016007202108E6108421084210842108421084210842108421084210842108422A2950A9934252ACA482DD6DF284401BAB49DBA6FF0087E978BAD32849AD952668EF5C82A3EA4FB3E859ED7768A69D604B681C7A97BFADBCBA45897890F1278C784EE15F1BE7360612B315DC3EBA1B32F293AD972415FCEAB92746428B616DB9AD954C97964BB6581A40178F41BE18BB20C1FB4DC628686B262A9A9D6B69CB42506714243A84BCE952412CC145045C13B88C7EB2A4CB4ACA402A00B3BB13737662C46A07CA3D5B838CD6C419E7C33E4DE6BE286E5D188F1EE15556EA6894416E544C26AD5291FB24A96E14A4B7248362B5106FBF68EA4F8A4ECFE9B8538D5585E1AE645299B25248016B44A9935292A648198801C8003DC0022AF0FAB5092E50E4B1243B3903CCEB6009DF6D4DCC8075142BCAA1DB620FD446A5544A994E48520D8B69FB6E3F43A45C056390326BADF4EADC8FEE35113F2FDFF2FF0078A235045F2BFA1F5FBE5E713D33D2A0F6EA1EE3D37FD629FCE24C4CCE7FA4FDFA42E3625491BFA8BDBD6DE91C3EA18E8FD3C9E22049D9BEBECD113A7B2813E900FB86F507E43488988D411E9108E6388FFFD9, '1', '2021-10-06 01:19:11', '1', '2021-10-06 01:19:11', b'0', 0); -INSERT INTO `inf_file` VALUES ('8448cada8c714e4ab61f521c8da21990', 'jpg', 0xFFD8FFE10DFA4578696600004D4D002A000000080007011200030000000100010000011A00050000000100000062011B0005000000010000006A012800030000000100020000013100020000001F000000720132000200000014000000918769000400000001000000A8000000D4000AFC8000002710000AFC800000271041646F62652050686F746F73686F702032312E30202857696E646F77732900323032303A30343A30322031373A32343A3135000000000003A001000300000001FFFF0000A00200040000000100000320A003000400000001000001C20000000000000006010300030000000100060000011A00050000000100000122011B0005000000010000012A012800030000000100020000020100040000000100000132020200040000000100000CC00000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD9FFED160050686F746F73686F7020332E30003842494D0425000000000010000000000000000000000000000000003842494D043A0000000000D7000000100000000100000000000B7072696E744F7574707574000000050000000050737453626F6F6C0100000000496E7465656E756D00000000496E746500000000496D67200000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D65544558540000000100000000000F7072696E7450726F6F6653657475704F626A6300000005682168378BBE7F6E00000000000A70726F6F6653657475700000000100000000426C746E656E756D0000000C6275696C74696E50726F6F660000000970726F6F66434D594B003842494D043B00000000022D00000010000000010000000000127072696E744F75747075744F7074696F6E7300000017000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40520000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000000000001063726F705768656E5072696E74696E67626F6F6C000000000E63726F7052656374426F74746F6D6C6F6E67000000000000000C63726F70526563744C6566746C6F6E67000000000000000D63726F705265637452696768746C6F6E67000000000000000B63726F7052656374546F706C6F6E6700000000003842494D03ED000000000010004800000001000200480000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000005A3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D040000000000000200093842494D040200000000001400000000000000000000000000000000000000003842494D043000000000000A010101010101010101013842494D042D00000000000600010000000A3842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000001C20000032000000005672A68079898002D0034000000010000000000000000000000000000000000000001000000000000000000000320000001C200000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E670000032000000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E67000003200000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D041100000000000101003842494D04140000000000040000000A3842494D040C000000000CDC00000001000000A00000005A000001E00000A8C000000CC000180001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD93842494D042100000000005700000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001400410064006F00620065002000500068006F0074006F00730068006F00700020003200300032003000000001003842494D04060000000000070006000000010100FFE10DD2687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E362D633134382037392E3136343033362C20323031392F30382F31332D30313A30363A35372020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F757263654576656E74232220786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F2220786D6C6E733A70686F746F73686F703D22687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F2220786D703A43726561746F72546F6F6C3D2241646F62652050686F746F73686F702032312E30202857696E646F7773292220786D703A437265617465446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D65746164617461446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D6F64696679446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D704D4D3A496E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D3232623834663439646366312220786D704D4D3A446F63756D656E7449443D2261646F62653A646F6369643A70686F746F73686F703A64633333616566382D343164372D343134372D626566652D3133623366363839326632642220786D704D4D3A4F726967696E616C446F63756D656E7449443D22786D702E6469643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222064633A666F726D61743D22696D6167652F6A706567222070686F746F73686F703A436F6C6F724D6F64653D2233223E203C786D704D4D3A486973746F72793E203C7264663A5365713E203C7264663A6C692073744576743A616374696F6E3D2263726561746564222073744576743A696E7374616E636549443D22786D702E6969643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222F3E203C7264663A6C692073744576743A616374696F6E3D227361766564222073744576743A696E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D323262383466343964636631222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222073744576743A6368616E6765643D222F222F3E203C2F7264663A5365713E203C2F786D704D4D3A486973746F72793E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203C3F787061636B657420656E643D2277223F3EFFEE000E41646F626500644000000001FFDB0084000202020202020202020203020202030403020203040504040404040506050505050505060607070807070609090A0A09090C0C0C0C0C0C0C0C0C0C0C0C0C0C0C01030303050405090606090D0A090A0D0F0E0E0E0E0F0F0C0C0C0C0C0F0F0C0C0C0C0C0C0F0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC000110801C2032003011100021101031101FFDD00040064FFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8E35D5BCC737C2D3C9BFBFF666A389DAABAAEB92D09964A9F7C78D5CFA56B736CD2C94EF538F1AA82F96F534916762EE10D78F8E112B54DEDED35BD3EEA09B45B992D25620CA14D3265239BD8EDBCD5E6BB286DA2B8BE79A375FDFA924D4D3205B0232DB5BD4EF199998E5459C58F6A9ABEA16F71CB9114EF9125B120B8F3A5CDA026573418AA583F34D616346AB5298A09A424FF98F2DD0F80D2BE18691C4925DEBD7DAB05B61522434CAF2C51C6FBA7FE7122F60D17CBBA84175B333D4D7E6329E172714DF5E6AFE7ED22CE1043865814FAAB5F118F0B9A26F8C7F30BF306DEE7549AE2C8889391A95FA71E1499BC4758F3D5037A77ACDEA0AB47CBAE4E30713366E12F35D43F302DA14901531CE7ECCA7C72C11718E7796EAFE6ED57516663AA12A0515431E99608B8F2D430D9A677E524F3FAA4F5A9AE5822D0750978B98B8D140D8E4C63B63F9843BDC13F64532431B1F1AD0C5DB916EE72D8E362656ACB7457BE4BC3606368A13F2553F7E5321BB5F0EEDD0B6F916C0141ADD0558F5385BE2690CC5536E98B682985A4527312ABF1A6F5C9F44527A6F5255114979C48EC4E424136EE70A2D2593E54CA2516432D265A76A6F6B5FAACACBE041E995F0B319DE9DE5BFCCBF37E8C54E9FE619A075E8A1C8FE18699F88FA4FC9FF00F395FE6ED08C0BACAB6A71A302D2BFC5B0F98C890D8323EA6F247FCE5769BE63B8449ECD62F50F5D875AE564360C8FA2EC3CC5A46B32DADF898514F2F4EBD72B21BF14F74FF4D7626F1F53F8A192BF5207B785320439FC4115A4693711DBDF5F5F12CE8C0D913D857B640865CD910BAFAE46A41FEE46F95909115A6CE4BB46B98FAC20D7214C643662170CF7323C858AFA27E2FA314452DD56DE2D4F4C9F94A6B1827AF862DF163FA65C8FD1C2C11EADCA80D716F09EC33DE42A6D1472A2824F861069AB502C331D3BCB3E55F3C412795FCE9A746D05DC6CB0CEEBBD4A9A6FF3399784BA4D445F8C9FF3931F9253FE507E61EA96B145E9F97B57919B426A6C402C4D3AF866C605D3E41BBE5BAFA5230FC32DB583B90724F865D8B930CC5BCB5A16375C55AC5578E98AB78AA8BFDA38AAA2F7C55A3D7156B155EADD315560D8ABFADEFF009C6EFF00D677FC84FF00CD73E56FFBA45AE5A39349E6F68C28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF917B754FE45FBB34FC2ED532A855A803C71E1551370C0E3C2AADF5A26361ED863155D0DC52840DFC72C2A39A6893B3D0124F8D7205B423E172F227A6C401D86D9516714AB5F0D52FD80A139193607916A21A49641526A722125825DE9F335C1F4C75ED96C434929D699A6C96C434DD0F639708B519B2F86D62F8446DC7EB1F0971B52990CB0D9871BE87FCB0F341D3236D0D5B8C6E3E2981A1FBF28E17231CD35F3479E9A06B8D356666080FC7CAA4D6BDF0F0B9919BE7FD5BCC7246F2B3BB10C4EC4E3C2994DE7979AD87666AFDAE9921171331B2C0F56D4F996EFF003CB045C5931D8EF2A483F765822E3C93012875EBB1C988B4108794A034D865910C68BA38D5CFDACB0048895EF171AE4C36479A0A470A7A6580362A4738A2F877CC49C775A4724E0D32149016B354935AD71A4A1DD6BD77C7853689173C4000D282981B835EBA75A0AF8D30316FEB00F53CBE780C5810510B7617A1A7CB21C2C68DA6FA7EA011872EBE39021BC16463520EBC791A11BF8640867128FB5D46EECDD26B2B9642A6A021A6408660BEA2FCB2FCFDD73CBED676DA8D64D3C301752BEE42FCCE56437639517E927903F33746F37E9D6F35B5CC6CC69C5188FE272B21CE195EF305FA4D63FBD6531AAF4047864086E8E4B486CAF94DD3C40F0427627A64086D8CD96A5DDCDA59B81C5A07EAC065720CA52B09035922C373792515250683B641116276C6D6D61BBE6F53302029E9BE2DF179F4113DAEA124A8F54249515DB16F0CA34926E2FE49AEE5291C6018F7A54F860465161EA22FDB4CB9B1BE11ABC42946201CC9C45D46A60F8AFF00E73E6C935ED07CAFE6151B69FEA733E1CB966C6127479A3BBF21B5802DEF21BB07F772A9A2F6CB896A8B7129F492423FBC15197E12C7338F7CBDA14FB8C555475C55CDD7156B156A98AB78AA8B1353BE2AB6A7C7155E3156EA7C7157F5CBFF0038D9FF00ACEBF907FF009AE3CABFF748B5CB472693CDED5850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91688D3E8CD770BB55732D29BED5C3C2AA125C2826831E155317408208D8E02155E1B85AF4C8951CD358A7AEC0640B684DB436F56492BD16B9596615B5884496D2F7DF6CAE41B2245BC82F22E370C08A6F82213221279612262C82A46E7E599100E3CCAE5B8127C2F41C732621C6949524D42354F4A234917A1AE47306A2535D3BCDEBA4425797FA536DCC1FEDCC76FC4509A9F9B4384B899EB24952C6B5FE38D39824C1F50F30477E480698D24CAD8EDC5C8D85474E95C9C766360A4574C1CF635E9EF930D6404B3D13EA5541F0229BD72C01A26023D4B200A41E5D969BFDD9688B498A9C8A643CC30A7422BD32241B4C601C9CD0D0D4622D78559E6DA85BE9CB031A4148391EBD7EFC95A3758ABD0572A31B6611B1823A838384A95415A9D8EDDA98F09415600537EFDB070962DFD589EDEE477CA8B782D7D5877207CCE16629B36E3C4570F267C214BD23C80EE4F4C2427802690DB9461BF5CA484009D470F214276A6FE232B21980A5CBD19290CC580EB4DE83DF2B660332D27535212DEE8FFA3C9B487DB20591D9EA7E53F3E7983CB371CF47BA75B588D42722361ED5CACD22322FADFF002DBFE729E486FECA3F324A5B4F43C6EB7AD6B403F6B2B2DF0917D9AFF997E53F30E976D75A2CF1C72CA0114615DFE9C8172A322F48F2E1BBD5F477844BCCF02EA6BE032B937028CD596783CBD6EAE486690291DF2A6C890F3BF35C434FB6B478C9AC8A0B530D37C4879A9BFB99670B1D41AED5EFF2C0DE0B228A4BA8602D3935603D3A78FD1912CE554CFF004DBBBDD461B5B6949F4D3BB6DFAF32313ABD48BE4F08FF009CBD8E0D47F29B5582DF79B4BF4C311B9F889E99B081D9D0E789B7E39EB9664FE87818D4B86E5F7E5A1C5029425A239806C20F8732B0726190DA1CF7CC86A531D462AAABD7157375C55AC55D8ABB15506FB47156B155E3A0C55BC55FD72FFCE367FEB3AFE417FE6B8F2AFF00DD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91745DBAE6B5DAA0270038DFBF4C557A007DF1B569937DBBE025217C042073DC654C931B4B9E50CA83AF638153ED2A660AE69F7614A367BA58ED6466DC57BE210497946B3748D33508EB930030322C65AED519B7A6D930C0A4B25EA976A1A6581AD2C9AE872FB4704D38D012DCEFD72B6D40CD37A94DCD07BE2CACA024DF7F0C56CA8140C8FF00BB32CBD8569F0F7CAB27369C922D18005B7B89916CE2B561340E5BAB2F4EB92C64B5D943DB5FDB89F5295B5385DAF559A094950D1CE7B04AEF99B8C2D95595FCC31E95FA5A2F2DEAB79369A4C971E6692CA54B64886DBBF1E1B7BE654698F1747A07953F25FF00357CD5E47B8FCC3F2CF921F5AF26DAC924BAB6B8AEDF686F20A01B713919D1482F2ED2EE9AFF0053F4EEAE9567B5774B4D35A8AB291B1591BF678F6AF5C85320537786D4C727D62D7D2746ACB0024AAB57E1A37BE16C1BA0A592333C1F5AB6956F6452D6B040A646283AFC2B8B2D91111FAC46DF5AD0357B7907FBCF3A594ADC97BBF4ED8D30F103505E5DC61A19341D524914F1B6B916725593FDF9C698D3094C2BC17577C9A69749D5DD17E004584A7930F1DB6C698198519259239ED629ECE48EE637F5EE6CEF94DAB7A0DF64D1E87010C6D165EFA492CFF437FCEC1AD7982636B06996E39B2843F0A8095272AE0B6424C9F59F2D79A3CADA9E9BA7F9E7C8D3686FAFA7FA33DD1786BC056A3985C85331262333C3A54F76F7BC648AB4B360D5AF80195D16C12513E60D2CD80917D45D661916331703F0A31DDBE818981642749BC3AE6906375955CC900F87512A429FE19594FE60222D35781D3EB68CAD1034926660015F9572B3129FCC840C7E65D1D24BEB4B581E196ED089EE402E021EE32070CAAD7F3211EFE61B4168AB6D299934E50F75301F184E8085EF90F02523417F34193E95ABBEB4AB7361A9FA4427EFD88A72403A53C6980E92498EA8047DBF9C7CB567070FAFC915C4CE561708580643F1127B54E0FCA49C886AA2CCF4DFCE48343113DBF98273C2842D0D36FA71FCA172A3AB8BE9FF00CBBFF9CDB4D1FD0B6D435C905A2AD18F0A9FF896425A434CA7AC14FAC348FF009CD2FC9CD42C53F4D798CACC46EA631D7FE0B043465C6FCE29EAFF00F393FF00939ABD91B3B0F33299266A44F22AA8527BD4B659F932D90D6EEC1B4AFF009C92FC948F548E1D6BCDBEB7D5488E20B10E0B20DAA581E9954B4843B0C5AC0FA4F4CF3168FABC116ADA4C424D0EE943D9DEF51231DCD3B653E018736EC9A8E21B326B4D5ED26FDD28E20EDB6D8D535DDBC63FE7231043F97F76F6EA5FD68D8B83BD681BAE646271B34453F1A350B93EBFD65BAC723023C3E239B1C54E8B53B294BF1309FB5C0E4332C38504337F1C2CD662AAABFC3155F8ABB15587AE2AD62AEE15DEB8ABB80F1C55DD36F0C55D8ABFAE5FF9C6CFFD675FC82FFCD71E55FF00BA45AE5A39349E6F6AC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90949CD3DF35AED52FB89CF2AF7C55B86E091D7E78AA21AE147461F7E02A39A924D50F534F0CA99A334E620B96D86F4AE054F2D6EFD2473D3C3154A750D59DAD254AF1F88648734179BDEDD33C8C49D8E4C302C72E27356DE9930C6492F362E77DB26D6A44FC66A69B7538CD38D42523B1FA72B6E435483D7156B155F63A7CDACEBBE57F2EC774BA6C5E65D66CF4A9755A8E708BA9021600F600D6B93C70123BB466354FD9DB4FF9F49FE51E9B35B5DF9C7FE725E596D2C19259EC276B48A07400311EA48EBB7C865808ADA838F7BBEA8D27FE704FFE70B7F2CBC93ADFE62EB5E4ED2FCFDA1F97AD1F53B8D68CE66458A1AB332885B893F4E5D007DEA4EFDC5F217E7E7FCFC07FE716353FC95F327E49FE4E7952E35AD3FCD1A73D92DB5DE9DF548AD1A421898DE956229B1CBE2A0D9B7BB7FCFBAED6DAEFFE7DEDABC11C097125CEA9E608E58A641C5CAD0F02C474D8EF91931E27CE5FF386BF901FF38ADFF3939F947F9A5E46D4AC20D13F3DE4D4AFA3D5B502693D8AA5C31B692CB911EA29FDBA74FA3229E2A7E6C7E75FE48FE62FE43F9FB55FCAFF003FD93DAC31B9934FF32509B7B8B752CD0949A9C492805403D7037465694FE5779EB49FCAEFCC9F267E62EBFA147E6CF2EE9F1490DDE9774291BF26A6F8B2E2EAFDABFC97FF009CC4FCA9FCF4F37697E48F21FF00CE3B5ADDCD7052DF51BD5B3AD9D9DB103D4066084034DC570B1E305EEDFF00393BF9B5F917FF0038B736896771F9223CD9E6AD663E3A258D869FF588BEAA48520BA275A9D862C38DF24AFF00CFC07F285102BFFCE28EA5A6B472F2BE54D1A4243F7A829818193E5CF2EEB1F945FF0039A1FF0039BFA5493F92469FE42D5B4CB5D2E7D04C660314D0D43332281435070B0326BF337F28BCA9F919FF003F16F267E5FF00E5ED82683A169F269B7D6F08FDE822E95988A3D41D80C89E4CE25EFF00FF003F7E5B6B6D7BF216FAED56EE1B8866F5D446B172F848FD803B9CAEB9B3069F945A4FF8720F3D7902F7CCBA4407CA305FC0757B66735684CAA5B90FF572BE8DAFDCAB4F397FCFACEEF5A9560F2669B26AD218AD25536AE12579540001F528C7B5460970F716278AB9BE8CF3FF00E497FCE0E7E5E7E5C69FE7AF387E5468DA6F90EF8441677470419BEC02858124FCF23C239D7E3E4E29B7CC49E6EFF9F50CE925A2F93B4A8B4E1113C84120527C38FAB5AFD3938C224F543E93FC95FC95FF009C13FCF1F2BEA3E60FCB0FCA9D1F52D0EC646D3EEEE9E378D870A93D5DBC32D18815DDE0B79E65FF009F5A683AA6B3A4DE792B4AB0D6B4B9A7D36FE25B7763CE0AAB0E5EA53AFB75C9C71041BA7E10595CE9716ADE686D3E258B449B5DD4A4D123AD185A191BD15A7871A65BC23AB5926F67DC5FF3827AD7FCE27E9FA779F3FE865346B2D425D52E61FF000CC570865F4A341FBDA85652A49A1EB8384364645FA0ADE64FF9F54F0E2FE56D1154776B7907FCCEC7843689C97DBEBFFF003EAD240B6F2B684EC4D14185C024F6AFAD80C026539232EB55FF009F5B229F5BCA9A1AB20ABA7A7202A3DFF7DB618E30D5C459F7E5FF0090FF00E7DF7F9C370BA2790BF2B6D35DE5F66FADEDE6FAB236FD67595941DBBE1300CE32931BFF009CC4FF009C6AFF009C4DFC9FFF009C73FCD3D534FF0021E85E59F375CE85247E5495A765BA92F792F130866DD857B0CA66221CAC5399237D9E1DFF0038E06E1FF24BC8D6FA85CDC48EB67037D52742BC18C62AC09DCD7357A900BB9C123D5F4B695A658ED26C48DC819824539F1281FCC5F2E5A79A3C9FAA5A7107EAF03F15EE7E16E99386CD59793F083CE5A73699AFEB5A5BC6D088677081C52B466E999F8CBA3D4C5283B5B59A9054AA1A5733226C38110866FE39364B315545FE18AAFC55BC554CF5C55D8AB5CE9B53157733E18AB7B9DE9D715750F862AFEB97FE71B3FF0059D7F20FFF0035C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EE4B96A57F0CD6BB54BEE6E4F2FD78AAE86E01502BB62AB1E41CC1F7C05211724A0FA7E1953247B5D0458CD771D302AC9756E0B4AE2AC5EFF0053332B28F1E9921CD058C5DDC9A1C98605209A72C684F7DB2618C96890713936B5093F7854786F8CD38DBF476F6CADB96AC542DF462ABFD318AAA691E55F3379E7CD9A1793FC99650DD799AF254BAD31DD8AC8AF1B7C3C69EF976201C4CE5F60F993FE70D3FE739BCCF6ED6FE636BAD4D0A7A0BA64974C55430141414FC72EA01A2CBF643F2F3F273CFDA2FF00CE0F79D3F27751D3560F3D6A7E56BAD3AD2D236678CCF22154058926A49DF7C9C764136FC52D1FFE701FFE72CB48B23A6C3E43D327E0C6E11A590B4CA587B532C0520D3F6A7FE70B3F25FF00307F2DBFE70CB52FCA9F37592691E78BBBFD6E6B3B02DD56EF8984D76EA01C892C0C9F94DF94FF00F389FF00F3995F93FF0099EDF98DE46F2ADA43ACF97B58B9B9BFF5A5741716D34DCA84568C0AD6981417AE7FCE7FAFFCE51FE6E79534AF35F9F3F2AB43D1FF002EBCAD1B32EA1612BCB7E1CA1F51AE118D5072AD074C590953F38FFE71DF41F23F993F327C9F61F9CBA9DDE9DF96FAE3B23DCB201688E1C22891CF40316CE27EE04FFF003953FF0038D3FF0038DF77A57E43FF00CE2AF97F45D77F31FCC37D67656F7518A6957724DF097B9BD427E3626800C58195B18FF9CAAFF9CCDFCF4FC80D7BCAFA67E687FCE3DF94F59BED56CC3691AFD83497715B5C16A2A4323861EA03B85271636FABFF002FFF0038507E40CFF9F1F9F7E46D13C8B05BDA9B9D3F4E4445935042AC10CEACBB48C69B0C5812FC5DFF009C15D5A2D67FE7381F58D3AD6DADAD7CCBAE5CEAD690D688B677723CB1C6941D830DB16264F56FF9CB6980FF009FA17962F26790A01A3C56CD08AFC512BA95FA2BBE25B81671FF003F8D92E6E35DFC86B458964B3FAB48F6A53790B537046408641F93B24769776F1C5A8D8BDC5E5005AA9AD32A21B8153B8D1ACADF59F24FD5E27B49CEB5640015A8FDE83B570034CB9BF793FE7E412ABFFCE01F962299A79644D5F458DA471425D6A77F6DF2C8C6A9818EE5F822DA1697A868B63A7E97A1869E3B413DF5D92F5F5075EF84367007EF97FCFA0C347FF38C9E7F8608E44B9FF10DDC61C0FDA11353EECB049AB806DF17E12F9AB47B1BAFCC0FCCEB8BA8DA7BDFF156A70A3396A02262C6BBF8938253D9B3806EB5E3B64FAAB416104933FC0DC4D7EC8CC7F14B1F0829A683A75C3FD616C230D727F7CA091B8F91C7C52918C27967E5AF2D4C04779A2A4DE22AFF00D71F14A784226DB4BF2FEA7AAD9F93BCA1F97771E62F34DF4C9FA3B4FB38E4964E75A091954D4283D4E4A323252007E937E427FCFA63CE7E6BD624F38FFCE42EA16DE50D126845CC1A268937AB24A08A94B9E6D5414EA2B970B69343DEFAFBF303FE72AFFE716BFE708FCA571F975F92DA2D9EB9E72107A561A1E8CA67B496FC01F15E4C0B1526A6B4C8CA7B338C093BF27E59F9CF5FFCCAFF009C81D6EDBF31FF003BB537D6EE21B8F5743FCBD8E42FA6D9467EC96E276A53BE60E6CF5C9D8E0C3B6E1F657E5BFE6369D731586871B246D63122D22A1B745A50468C07ECE61711939F5C2FA534DBE8E15925460EAE054D72328B7C24CC22D5AC61D12EA696CBEB7CA290B102BC7E13918AE4E4FC43FCFDBED3F5AF3EEAA2CE0F41D256DA94A6ED997093A7CE1E1FEA48CAB1C8FCFD01C57D8667623B3AF229D96A1D8ABB155CBDF15546ED8AAC1D3156F15770077AE2AEE03C7156B9D36A74DB157733E18ABFAE6FF9C6CDFF00E71D7F208F8FE5C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D34BC51D4D0F8E6BA9DAA5D757887900C2A71A55B6D7229BB0AE34A897909F881D877C041506914D7085128E2A32AA2CB88285DDE7100A372E23B634578825125F3B6DE3DB0526D0734E0296AD08C9008291DD5D541EF920C0A4C65777FB27E7930C485FCC81BFD3930585174720E677DA9824530148B0F5141BE41B2D48B91D8FCF15B6BD4C56D917917CEFE6DFCBCF3E68FE74F25D8DA4FADE8686E21BDBD1FBA4E07970AF89F0CC8C3C9C5CFCDF7349FF3F5EFF9CA09EC6E2F7F40F96EDEE2C9C5CDC4A63A3948C50D169EDE39750B71DFAE1E46FF009C8DF3C7997FE70D7CC7F9F77D6D65079CF43D126F318B287FDE7668D4B05229D0853DB26021F945E58FF9FADFFCE5A79B35516DE55F22681E62D56E938AD859DA9967DABFB0057B78614BF5BFFE7113F3E7F303F3EFFE71A6FF00F34BCD7656107E6269DAB6B5A78B38978242DA7FD8475A7C2DB1A8C04354DF9BBF941FF3F0CFF9CA9FCDFF00CFA87F28345D1BCB916A1ABEA975A7BCB321458A3B4765E4CD4EDC70522934FF009CF1FCF6FF009CA8FCBB54FC9DF3CC3E4CD4B45FCDAB77FABC1A0167BE8560F85BD6561F0D6B51F2C5987E547903C85E7FFCE1F31E95F90DA75CE97A4DCC5234B6925EBFA51B3F2E410B7892705864FD16F257FCFA23F3F26D7B44BFF33F987CB7E4EB2D2CACD0DEF97A57FAFA5C210D14B5634E4AC01AD70A0BF577CE1E75FC81FCA3FCB5D0BCB7F9F7E7DD07F32353F23411CEF26B7325C6AD737D0F499537AB531624BF32FF00E7323CE1F9DBFF00392DF975379D3CA7E4D9FCB9FF0038CFE50893559ED75188C37B3C51FDA96341406234F84E1A60FCCAFC9CF2BF9BFCFDF9CDE47F2C7E5B79864F2479AFCE0F1D9F917558E43088E40A5C7AAC3703883D31E140897EB27E5E7FCFB5BFE727B4DFCF1F24FE6C7E63FE61689E709343BC49F53B89E691E765414DAB4AD6B5C69B86CC2FFE7EF9AD68DFE37FC9DF2EE8BA9A4BE67F2DDBDCBEAF6D237C36EB22928CDE0180DB2259805F3C7FCE28FF00CE04F9B3FE7277C8B379FED3CEF2E942398C3C1E42073EA05011EF913BF26775CDF5A68BFF003E80F35DB6ADA36B1ABFE62B5E3E957F6F77F57E65AA20903D055BA9A5300891D14CC17E927FCE507FCE31CDFF003909F913A5FE4E5B6A8FA49B39ECEFCDFF00EC97B4D954EFDF2C0C0CC9DDF9B23FE7CF5E6CB5D3445A7FE68CD0DDBB5651EA3052BDD766A644829F10BF463FE710FF00E717AF3FE717FF002A75DF235E6BF36A771A95F4DA9497719F84348A568373BEF954C90A245F9F1E67FF009F44F98B5AF37F9975FB0FCC06B6B3D7B50B8D4C42F211F1DCC86460C037515C4094BA289D17C03FF393DFF38B1AC7FCE29F9FBC85A4EA5AE9D56D3CC32395915890415F72727E1D06CF11E5115ADBC0BC0ACCAD3B3189E9B75DE990E109E22AF02A25CA98A4775EE7B60A0C6CBEB5FF009F6E24C3FE73B742F456393FE752D5CC824EC9C7E265F714DB2E8061225F657FCFCFFF003C3F35FC97E6DFCBAFC96F2179A27F2BE93E74D264D47CC3E6289FD3B9611CDE998B9D3BA8E9965048912FC9FF002E796B4CF2F6A1746D8A5FCB75704DF6B7A99ADCBC86A4C8A6BD77CAB200DF025ECD06A30454B7B39648D29FBFB81D251E0C7C335D962E7E29109E69570F65730DF69E56CA20DF15B45B4751D5BE6731E31A72B8ADF587E5979ECDFABDB5F5C28E2005E47AFE18261BE05F56793754B6B9B7BDD2DD11E3BD8D979B741B532B00B39BF217FE726FCA5FE19FCC1D4EE238EAB732332D3A1A96E999100EAF5043E588DA30F351BE22DF1A9EA0E67E2D83AD9157A1F0CB98BB7F0C3452D12075C08B5CA46FBE2AA8C46DBE2AB01DB156EA3C715773A6D4C16134EE67C31B5A6F883BD7AE3687701E3855FD72FF00CE367FEB3AFE417FE6B8F2AFFDD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87A96FEF941ACBF8E623B3B0963DF5F16DA5AE34B611515DDF541F571A5D9318B53BD42A1E4AA7ED2E0931927706A3CC0E9BE52D61166E7638B38A5E6EBE33D4E2D8103717049C52833FBC23155616C42F21DF15434B1D3B62A868D7E36F0F0C5894746A3DBE8C582BB461BE43155168462AC93F2FBF2CFCE1F9BDE7FD1FF2EBC9776965A8EAF19905C4E6900A1A7C7976271B31DDFA2BA47FCF9FFF003D7597F43CC9F997E58B4B688049A0B3123CA57AD18AEDF7E640F268B7EC4F907F217CA1F937FF0038F179F955E75D6E26F23C1A335AF9A359B87280447FBCAB9AD12872616DF1CEABFF003963FF00381FFF0038BD6BA743F96BE5BD23CF9A8D847C5755F29411C972838D2B3CEC2B5DC8241C905B5BFF003EB4FCC58FCF1F979F9AFA45BDB470DBEA3E63D675CB68140E5026A2EC544B4EFF00150E4BA2F0DB17FF009F7DFF00CE324FF963E63FCDAFCFEFCCDB44B09FF4B6ACDE5AB8B8F84DBC31CECCF23927F6C74DB010CB81F96DF9DDF9D7FF002BE3FE7253CE9F98D6F74D045A7CCD65A2E9970D50A9033C3CA01414E4054E56436C616CDFFE712FF28FF257F327CF9E6FF31FE72FE7149F963AB796353B69BCBCB6F75F56B8942307356F0AE459786FD51F38F93BFE71CFCE8D7B3AFF00CE71F98B48B4344BB5D3B5DE01005028483E032A32A3CDA4E2277A79DF977FE7DABFF388BF9C724FA9681F9DFE67FCC6BB8EA6F35A1A8ADDB0A750CEC07864F8C745E0A7D95F97BE4CFC8BFC81F25FFD0B3F99FF0036D7CCFA7F9B4496BA47977CC577EBDF4905C8A0B58A951C00FB2B931913C07B9F1A79AFFE7DDDFF003895F947E615F32F9A7F3CF59FCB2D465BD7B8F29DF0D405ACB64ECC4AADAB863C4A5683DB26269AA1C932B9FC9FFF009C6DD4E4B4D31BFE73E3CEE249C520787CC4435C9EA55985795326770C385F15FF00CE607FCE3DFF00CE35793FC93A9FE677927FE722AEFF0035BF320CB15BDBE9DABEA02FAEAE854A30AD6A780ED95C837C075A7C55E4DF31FE71792B429EDFCA5F991ADF923465E12CD616174D00776151B2E634B6673887D0DFF38F9E6FFF009C92F3EFE7CFE58F92FF00E576F99F50875F9E3D66F2CA5BF77A5BD9C80C9148A76A3807614C8F38DD72712517E82FFCFD9BF3BBCF5E43D53F2BFC95E46F376ABE50D47CC9A7CBA8CF75A64ED0168E297830629BF6F1CB9B7146F67E4949F9B1FF0039096D688A9F9E7E6F8AD66FDFCB72DA8CA013ECD5AFE382DCA9C283F6FBFE7D73E78F3479EFFE71CBCEFAC79EBCD5AC79AEFB4CF30DDC2BA85EDC34F27A0B192A159EA695A9EB8251704737E2FF009DFF003E7FE720AFBF30FF003022B5FCE7F34697A7DAEBF7D69A7410DF3A2450C729F4D68294016836C31A05CD8E332890C035DD5BCF3E67D574EF30FE64F9EEFF00CECFA07C7647509CCECBCF614AE4E73586911714D00BE54BA9663752A97D3E2AFEEC022A6A3E5989293951D3D2B5AB7A48ED5FDAFE3862584B1BEBEFF9F69C9EA7FCE75684C3FEA4ED647FC933991170F2C69EDFFF003F6FDFF3EFF26475FF0070139A7FD1C60916A897C11A8C06541DF8C9CA998F22E5C0A7769767EA8B08FD9ED9448B971679A34DCA08E393ECD77C85B75DB34B4D4A5D2EE2196CBA0209A64245CAC6FA93F2F7F32121B8B35B9702BC565AFBD3DB220B64F93C6BFE7316D6CB516B1D6AC183B3AD5A9F4E64C0BAAD445F9DD35A43EA99631F13EF2FCF2FE275A614A6E782D075CBE05690E243D3DF2EE882BC0E79596B937C78ED819479378B2762AEC55ACC79736D1C9BC4312578CB43592EEB920C097F5CDFF38D9FFACE9F905FF9AE3CABFF00748B5CB87260F6AC2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF864BB048AACD51DB311CEB4BC2B147612EE01C56D17621DC0AC98ADA65E8307525EA2BB8C124129D5B45D38F4CA501306040229D716C8A58E28E49D862D88571C9F6DC629548E36A8DB154D235AAD08E9DB1541DC42687E1FA7154A1D5D0F43BE282A91C8E0F4C58F0A3519A9BEC3B62BC2B8891BA2938AF0B21F2279EFCFF00F94DE7DD13F323F2F2682DBCC7A3AFA3682ED3D5818B1AFC51F7CBB1CA9C4D40DDEF1F99FF00F39CFF00F3963F99305EDCF983CE163A19D22DDC48BE5D88D8BAB28AD1F89353F4E5DC40971E9FAFDF975AC7983CE1FF003EDFFCC2D67CC3ADCBADEAFAC793AF6692F6F5CCACAEC87A96F0C9476B5A7F387A7BE85A5F97E686F0C4B71A859A08A7863264776DF812A09AEFDF240AD3F707FE7D29F951F9A9E58D67F327CEFAF794AFFCB3F979E6FD06D2D74586F289F5A962209786B4A13D6A72D06C289D3D0FFE7EADF9D7E75FCBCFCB8F2D7E4FF95F4E9747D37F3126922D63CDB6EA5623146D510C6CA2AAC4FDADF7C494F1EEF91AF7FE70E3C83AA7FCE05F92BF3AEF2F5BC95F997E5B8A7B89B5A998AC37BEA48591645EA49A0A13EF9592D8323E2BFF009C7CFC90FCC1FF009C9CF3F6A1E5DF285F695A3F99A0478754D4EFA15781907C3CD50EF5A6F91B6632ECFD44F20FFCFAB7F26BF2AB40D53CD9FF003943F98B1EAF1E9122DD31D16E0D85B451A7C6C6757AB301DE83A60113F0419DBEF0F30F9D3F2CFF00297FE7157CDDF985FF0038E51E8F77A2E99A34D3E87AB584002CA507C25DB882FDF7A647C2A533B3BBF9ABD5FCC1E62BDBFD3BF38B52F3E1D5FF00332009E6CB79656692289588A59C486BC597C06110A62723F717F317CA1E4DFF009F8A7FCE1B683E61F29DEAA79DFC9B6E93C371250BAEACB12ADCC53746E24D763921162676F3AFF9C76FF9C4AFCACFF9C2AF256A3F9DDFF392BAF68DAC6BB25AC8348D2EEE1F56DE1050845489C37C66B4AE4B8D1C4FC98F3C683E4FF3F7E6A7987CE9A0F95AFF00CB7F97BAD5E493E91A34D227AD21690B17B72BF654D4103C32B3367E3523BCC3368DE5ED38437CCF631C29EAC4D72DCC48631544A0AD49A532A3BA7C6B7EAA7FCFAF3F21AF74CB6F31FF00CE577E62D9AE9F1EAD6D2BF93BD61C560D302B7AF32F2A5140527135F00C38ADF0C7FCE507E6BC1F9E5FF3923E60F3559336B1E4BF277ADA2792A590F34B9B5726B3475EC1AB91F136761A7C24EEF13D4A2B98216F556DEFED9374B08928CA3C0D76C7C47272E2D9FB2FFF003E9130C7FF0038CDF98534B0936D279BAFFD6B75D8AA08A9C7E8CB89DBE4EAB83D4FC42B8373FF002B0FF346E6C618E5B6B7F36EA8E7D75E4157D634041F0C864950761A68F34C66823B9FAC35E7A572978ABF0C0BC42537E99852CCEC052AAA97948E11B154E30923E3000EC721E2309CC24B3CE90432F3902146A3D4F427A65F09383972D3EC4FF9F65C7327FCE717971E44204FE4DD65E13D792F03BED9990E41D74F2713DD7FE7ED2449F9FF00F92E10F22FE5F9CA7B833E5732B10F862E5828B84A5655AD5331E45CBC6126D3AF59262937EEF7D81CC79172E2F55D2984B0523352AB5DB204B918E36C8F4C9E559024919604D2A72B949CA80A679663EAD494CBE9348414FA32024DB241F9EDEF35FB18ED9C35C431A101FA819938E4E0E585BE39D634AB9D26FEEA39A268D2662D096EE3DB2EE370E5898E354B6FF7E6463938D38D34D18D88FA73281D9C5915363C7A76C8940709053734381B03B9A78E2AB81077071575478E2ADD3C329237656EA1F0C900C495DD865803592DE4A9812FEB9BFE71B3FF0059D7F20BFF0035C7957FEE916B96057B562AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF86BB8802C67311CBE240DB460B32F63B1C57899159D94483A7CB15E25595139003AE465C97891F6DF00CA9215659878E2D914A669013D6A7B62D81411BE21E18A519137BE2A8C57A6F8AB52BD57DF154A6615A629014E35DFF008629A469140B8AD2262C5682DBA92EE182EA4897D5B636D227A6366F588F8581F6C944B46585BF40FF00E70A3FE70BFF0024FF00E723FF0029B5BF3279AFCCB2E85E6CD3F54FD1B7D1CF7CB1F2A8279716604E5FC449B718C2BA3F4B7F3B2EFF00283FE71B3FE7103CF7F9456BE72B18EF350F2ECFA4796A059D267BDB87144850231219B975392053E1DEEF8D7FE707F47FF9C0DF27FE58699F9D5E7A920D17CE3645F4EF33E9FE629BEBB0472C5F6A58ED983503B74A0C9DA38084AFFE7217FE7E75E7BF365C5E7907FE719F438FCB7A1D9BB245E63302FA77D68A6A9F554D84551B9A76C78E9A678492FBA3F267F36BF20BFE73B3F246D3F2E3CE2F6ADE69D3EDE14F3568B7AC8B7B693DB95E53432C86A3D4707ECFBE0333C988C469F327FCFCB3F353CABE53FCBAF26FFCE267E5CDFDA3C1E60317E9B4B77594D8C5624344ACC8763215A1191E3A663097E57797752F3AFE5FF9C6C7CCDF943A9C9A0F9CF47B37B69ADC3304BA5917E290814069EF94F8AD834F27D89FF38B3F927AAFFCE6FDA7E64798BF3E7F37350B297C93A92E973E8C3516B68AE39C65D8B46CE015A8A5732465003038E4FD4FB9B5FF009C5EFCACFC8DB6FC88F3D7E61E976FF96F73A61B09B4D8665F5F8B1DCB4D11635DFAD301CF148C322F85A05FF9F51FE534B65AAF9524BCF3E5F69779EB5A587D6E6BA592E54502399556AA41E94A644E701B069645F0D7E4CFE707E71FE4DFE6779E7F353F27ACA7B7F2BDEEB5777FAA7901F91B67D325959D04716C81E8C454657F9A8B68D148F47EAA587FCE5D7FCE207FCE64F97A0F277E7DD8CFE44D68148A2F29EA333219A56D898E455E2373B03F7E40E51F51E5E4C65A390DBABF3FBFE735BFE7193F2E7FE71D6EBCA4BF931E6B9F599BF306493F44F97BEB7F5C7B6892AE2854B05A8A0C81CA48B3C9A8E9A47A24BFF3851F919E41FCF8FCE08BCB7F9D5E708F47BEF273A5EE8BF97374C527BFF4784AEC676A2B2AF75EE36C1C6472EBD57F2E62FB7BFE738BFE730D64B5BBFF009C5CFF009C7DB8B4B9D4AE02D96BFAD6931886D349B68C7096D02A1E279A93BAED8F89E9B972FBDC8C7A49134FCD7F2F791E1F2BD8A68176E65963AD2F474AB6E687E67304EA2CBD060D36C9D5FF00962CDEC2E4C7290D6F197694577A7CB271CD6DB9F4FB3F537FE7D471DBC1FF0038CDF9836D79756F682FFCD9A8A47EB4F1C6DC425391566046FE39B033B1B793CF4F170CC03DE7EF7E383E88DABF9ABF332F6D2329158F9BF538A57471C64549295DBED5731F3CEA2ECB1E2B0B64B2FAB6DC295ED9A83959F8450935A7AA80863180EB571D695CB2191AE78497A47FCE3F7E527E5A7E66FF00CE4DE8BF97BF9B2B736BE4AF3858DC5D45789762D544B6F1928399200E4453E9CDB69C931BBE4EB73E120D53F757F207FE70C7FE718BFE71AFCE927E65F912FE4935C165716D61ACDEEB114F0C16970A04CA23671527C4666125C2188F73F2B3FE7E3BF9A5E4EFCDFF00F9C87FCBEB2FCB3F30C1E6A87C89E5FB8B0F31FD554D22B812972BEA74AD08CA67CADBF1E3DDF31DAC4D05A3A188C69337A8439E4E1BFD6CC69173A18924F4C0BA048EF98E4B950C4F51D01855631D5C01954E4E4C31D3D46DF46944493053B8AE63CA4DA229835ADEBC6A5222C22EBB64449245AB5B5C4A54C33C541EF9938E4C4C2DE59F9A3E5C4BCB14D4ADE3DED50AB53DF2D949A32627CC778E915B014A4B5A1CC8C527559E348462CA23AF565AE6C22EB25CDCA390DFB64CB3839A315C836114B7D35C50EA53618ABB155C1C014F0C8916825AF572403025BF532603025DEAE5822D64BFAEAFF9C6B35FF9C74FC823E3F971E55FFBA45AE0661ED78A5D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF881BC880420F5CC3E20E424B0A857A1EA4ED8F12B24B50B4218D31E20AA8F08670CBB9ED809B0A39AA03C41076395F0B604BE5662C6870F0B30504E1C9AD31E165C6D29E277FA7070B21205171354FC382928CF8A83E78D2B8D698D2A12406B8A625A8D0D7A6D8B2B45B23300145698AD85F1EDB1EB8ADAA4A225884FC4CD3AB045B6AD0153D5BE8C429A2868F47BB86133689E66D47465BDBA56BFD32CEE6585789FB529E0402465832531E005338FCBB6FA84CE751D4B53D461B17E766D79772CEAF20E8C15C9030F8BDE98E11D11F0795F499EFEDAF6F2C266B595F85D69026222007FBB997ECB57C30F8C19F83BDB33B782934292BC7E8C4ECB672C2823F4231B2D78815DB6CA67985B64710EA91EA7E5A437115F68D25EF97EEA32FFA4F52D3EE5EDCDE06FB3511914E390F1E9B3C081768DE5FD3ED8FD72E26BBD7F5E0DB6AB793BCAF427B1724ED909E7B671C1001E86B6EF2DC590922A49044CAFABA1E2483FB240DF7CA8E50DBE0C52883F2E6D4EB125EC771AA59E917959750B0B1BE96DBEB128E858C64549F7CAFF3738F271A7A404BD4B4AFCA0F20CF6D75A85CD86A90996129159DE6A12DD0527BD5C9CA726AF24F9B762D180ED0FC95E5FD05E19F4BD0603769271769155C18BC68475F7CC796693B0C7A50F52D3ED674B48A28163B4912E1A66754142ADFB0C0751EC72BF1A4E6474B163FABFE5BF943CCB3DC5D6B1A12EA3716A39D98B522DA49246EB491402299911D4D7544B4B1287F227E4F59E81AD5C7992EAE2F3EB112D346B2D46E1EF7EAA0FDA0A64AD36F0C9CB59C5CCB8FF901D143CF1F94BA579AAE96F74992E3CADE648DAA3CDF6933C721435E6948E8DF1034EB9286B047CC2FF2782ED17F2EB4DF2AD9BD969566F737F74419BCC533F3993F9B9330E4C5B213D582092E54745188D833187CB62EAD134DB88792A75D40F53FC73046716D98F152B4FE598AD6DD2D6CC85957EC5CB0A807C48EF96C753109CB8F886CF269BFE71FC4B7D793E99E62D5B4A17B5B899AC6F26B783EB2E7E26F4A3206F99B1ED1A157B3A89682E5C54CA34AFCA7D23CB5A63D9C76B2DDDC475996F4C86AD3B7DA771FB44FBE5597571946ADCAC7A7203CF75FD0E64998087A1F8B35E32370D384AE0D338C0E49F4DD47C2C45687B6646292CB00609E67F2EBEAF0D8DC5DC93DB6B36CFC6DEFEDA5689E28C9F8802BBEE336DA7CDC2E0E7D2C65CD8A6A3A0EA36B2B45A7F9B35FBC8C7C715BFE91B85141D57ED77CCD3A814EBB369611E5F794CB42B39B42944DA3DD8824D64F3D75661EACAA4ECCBEA1DCE512CE1A2189EBB1D84090ACF0C6C2D8AF0F58B16E4DF2CA279A2E6431A0534EF527AA2D77CA2598391114CF346D3E7867B762945E42B944B286FC71E3E4FA7F44D352F2C21089CCF115DBDB293305B0E0932587CBA3D27458E8CC3714FECC00B0F0A439B17D4FCA324619C2D3AF41FD99930986420C0753D0A76B1BCB59D39C12EE58F63965F1726196161F1E79A3CB8D63A8CFCA32B6FC8956CCBC669D26AB1960ECBCB91614543C53E599F09874D381054A46F4E95D81E872EE265034A4F2F1343D698096C26DAF52B8A1557703155C411D462A8377F888AE203592B79FBE48062EE7EF93B6041772F7C9713120BFAF7FF9C68FFD671FF9C7FF00FCD6FE54FF00BA45AE066393DB714BB15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8779E6690D0E6BDC86E0B62C55A9D0D6B8AA7B1454C555F8814C473508693A9CB59A5E480C49E98AB4CE9E18AA1A465236C05945742699536F1047092A078E2B61716DBF8E15B08391B7AD701482A9130DB026D16ADB1FD78ADADE4395715B5CC6A062A9859FD93912D914FACBEC37FAD95C9BA09CC1906F8A6B0A0645AF8E565124EE5B5E56640EE320531482C21F4EE0AFF29DF2B9330CEACE0F56829B9C8368E4CDAC6C8B24629D3205B22F49B3B43FA35969534C81722095DBD8BF3A50F5CA8B97065B6766FC7EC91909392190E9DA51E60F1A6F539510D822C94E9842EE2B4182922294BE9CBBFC3DF1A6D10413E9C95E9808D9918A3AD6C100A53AE505ABC3569B4C47A10BB8C57C3455AE9E00E9D714786EB9D2B9A3F14DE9B62830A0F10F35689708F3388C77C945800C0A1B0924B69D5D00DF7CCCC658CA2C43CC9A64B085600D3332127032879C5F44D1D651B3014CBB8DD6E68EC9569E93493D373BE4096BC707D0DE5ED224BCD3238D81217E2194CE4EC2186C27B0F95E4120223E9ED98F22CCE9CB2BB2D12485E12E869514DB2B3272F498082FA3BC976F1FA31C6CBD80C00B9B2C4F5CB6D22065A85FB5D72C12689E35F75E5C826423D304E4C16838DE5DE70F28FA16FCA18FE12A4B003FB332B0C9A270A0F913CE5E598A54B82F0FC42BDB33232B755A885BE51D7EC24D3EE1A3E344EA332A05D2E68531CB9903428D5E99931710841897950E5A98F25656C595ABAC805315B5479401F3C56D2F91FE33BE4C354B9ACE7EF8B1773F7C55DCFDF157F5FF00FF0038CFFF00ACE1FF0038FDFF009ADBCA9FF747B5C9ABDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88316FCCD45335EE42630C7C17891F11D862AAE55A3FB5F862AA7CC9751DB08E6A164BD4E58CD00D192493F67C71552654F1E98AA832AF6EB91290B797134C832564620D6BDB1557E551B1EBDB1542C8AC687016512BE3246C4E0656881228DBC715B5E11CEE294C56C2AD0D003D7B629B4CACC1A53B9C896D8B20B34655607B9A8CAE4DD04EA089F20DF14C63AA7153E3BE56512656AC0D9EFE1902CA2C7A01FE94CD4D89DB2B9320F44D1A22C54D36A641B43D174E882B0E4366E9902D917A259DB936C4506FD32B2E44175B598E7F677AEF95972E0CB2D2D502EE3225C90C86CA10A46DB6574E481B270E8A474ED8D360012CFAA73AF15EA71A6C0109258B03BAD3011B3202D523B609F6B314B2E04D22B3590034AD714702362B38D4D08A62BC08D92CE26864A0DC8D8E2C670D9E75E64D0627B39A4352789ED928B8A214F04F4608659A2058B96A71236EB97424C65040F9A34E89EC95C28AF1CC98CDC1CB17806B5108838E3DE800CB3C475D9216A7E5FD3A7B8B80238C31276180CD9E1C4FACFC9BA25D0B4F4DA1019539357C331E591DBE1C2F4FD1740FAEC9C12352E3AD76CC796473469D93DC796E24291B4604886A6991E2B6EC7800667E5DD3440E9F0D0786112672C6F5FB14B68E3024AD587C3B65824D13C69CA476CD41BFB6D9609B41C4A77FA1C17F6B22320208EF97E39B899A0F913F337CA4B6E2E0DBC436AD4D3E59970C8EB33E2B0F827CFDA605F55B851D76FD599B8E56E935189E113865050F8E66C0BAAC91A520A4003B66406B05554D3AFD38A6D706A1AF6C56C36D20A7738ADA14B124EF930D6D54E28754E2AEA9C55FD837FCE337FEB37FFCE3EFFE6B5F2A7FDD1ED726AF6EC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88EB5527A8EF9AF72138584000F862AB580622B8AAAAC0BC4B6D5188E6A1033851F3CB59A058A952062A876E3FD715506A74EF912BC90EDF6B2B5E254AD00A615E25367618AF129FAA5B6F0C0520ABC75207BE0648911B1236E98A11A88C314DB60126A7E8C59C135B35DC644B745925BAED95C9BE09EC0BF08C837C559C5181CACA24CA6DC7A9694F6C814C52DB7B73EBF4EF95C9987A5E876C788DBB641B4727A3E9B685DA314E832B2CE2F46B2B6263094C8172609D5AE983903E395972E0C8E1B001694C8C9C909A5A5A8AF4E9869B849363682831A6626BA2B44A7D9C69B04D42E2D12A76C8C86CCC4B74B4DA1AF4FA3304B7DA6F69684F1D8605B4CC590AD298ADA30598F4DB6ED8944B7093EA9610CB613A9515E27F5620B488BE60D5F4C486FA62ABD1F7FBF260B19063FE62F4CDA08EA2BC72624E0E58BC2354B0E572DC96A9434F9E4FC470B82CB37FCB4D05AEB534E70FC3CBA91F3C066E5E2C54FB7B4ED02D6DED144680394A1CA2537678A349BE91A6AD9CA5F852BDF2894DC8B013A36A269D98AEDDB0464D9020B26D2ECD232A4AF4CB049259A5BAC2FC435053A659C4D134E3D3B7420F2C989341451B988008879061BE4E33A71F246D83F9B7CB36BA8E997521505CA93FAB32F1C9C2CB8DF97BF9BDA0BD95D5CC623A0DC8FC336584BA6D563A7C937D66DEA91D2873658CBCEEA0520658FD26E077D81CC98F27094F0AB44818ADA8B362B6B7AE4C2BB15762AEC55FD837FCE337FEB377FCE3EFFE6B5F2A7FDD1ED726AF6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A0B7896BB6D9AEB72116C388EA3DF1B553E05BEC918DAAA51C2F1E43082A94DDF21DF25C4CAD2AA495D8E3C4B68696564D88C78D6D62B926A41380C946EAA2367351B0F7C8DB2F0D50055346618DAF86B1E30C2AA7AE36BE1A82A146F886C7A6048852696F172DE98A784A64B1AAF5EA7A62BC255982D0D06F8AF0950E209D87CF10120F0A696686A36C0436C66192DBA1DBA6552722124FEDE2240E9ED951939312AB340C29B8391E69E1B647A78ADBF1EF4C8908BA46DB5848CE1C5284E57209137A2E836CCC428A5477CACB744BD434BB378594BD083E1954A5BB7443D074EB477A11403DF21C4E5420591431716F8874DB225CA8C29378D4505075C8916DDC48BB65A374DB0ADA6C232C36A615E3A44288D054A934C5B233B509551C6C0D7232E4DC0A10C04B0D866010DE3284DED6DD956B4191B65E222429077180C93C48F8684712363913365CD21D4D084954746072226BC34F9E7CCF02C124EED4249DA9F3C98935C9E37AF34B2B829F647519306DC3C91B49ECB467D52EE2855284EE49C375CDA31E2B2FA6BC83E4C86CA38E568D79F723227239F0C74F6EB4B13EA0DA8A17A1CA897240A4E96C569F0819598B2E1255C5B46801A6E3AE08C59C2242716691BF414A78E4D914D2283E3156D97240B4C85A36508CB452464F8DA4C54EDA89255892064E32B6990A446A33A3DABC22B475A0CC9C73A699C6C3E1FFCF3F2C7A51C978C8ACA63AFC3D7B66D304DD46AB1ECFCEAF30DB98DE4923015549DBBE6DB16EF2FAB86EC2259FD56E46B502999575B3AEE02A7CC7BE4830229631A9F6C242A91563DF224D32112570141BF6C226B54B4B81E3878969776AD7256B4B4B01D8E2B4FEC23FE71977FF9C6EFF9C7C3E3F96BE53FFBA3DAE4D0F6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A889788DF6CD7539086B99B8D6871A5538666618D2A20C8C0548E98D2A0E6FDE0A8FBB1A54BC2D1E871A540DC805F7F1C6954F9704AD37E98D3387344464BAEC298D37F120A6B794B7C24E34BC48A855900E5DBC71A5E257DA62140DD37271A5E24C625E031A5E256049231A5E2452AF2071A5E25F1435AEDF4E4834CF74CAD63A1F6C816706456895207BE51272E0CAADE1A2034E994C9CA8F25EE9C8D298C4ECD80A75A5C7521299125AA4CB9221146AB4F880DF2A2562CC7CAEB59D790DAB9025CB845EC16F10E4B45DBC731E5CDC880671A58A28DB22E6E309C2A0E75A77C5CB099451A918B021116F1FC74F1C5253A48A806D8B54954A2D3F8E2D9050E0B5A78E097272A28848158F4E9984425191A0414CAC8641A6A02476CAC86C0BD245515F0C810CC1A63DADCE1629187864405E37CFDE636699A6205687A64C313BB03B7D224BFB9E012A2B97458F876F5CF2D792A38E786478A8DC7C32333B2638A8BDE749D320B481005008194B7009FC50C75D862D8023046A0785316C010F20500E29A57B324134C2A426292B066C0D642A3CAD4A62D6421C5C145624EF5DB2C816B942D0525F173C589A65F02C0E379AFE66E996FAAE8570B40CE10D3F0CD9603BBACD5637E4D7E6158C9A7DFDCC0148018FF000CDE603B3CA6B31EEF25039027DF326F7757214D85F965D171A4E2BF2C99601BE3D3A65127231A9323576E9910C64A0C8D920C56A96AD0E58155D0035AE495FD83FF00CE337FEB37FF00CE3EFF00E6B6F2A7FDD1ED72618BDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A8F54702DC7305BD2695FD57E9424E2A898542F520E2A887914A15F11D71542A9AD452A7C7154BA7942494A6F8AA5D31323020D2B8AA22180135770569B8C5944EE8E411D28B8B6A1979198A114DBAE2AAF28F4D775E55F0C556DA71E4E7895A8C551EEEA829D7C062ABA08DA46240A0C55341198D6A472F962ADC13A92CBE99153D7161229DC101A06AFD19596704DECFED57C0F4CA24E5C198DB30740A053DF2993971E4ABE8947A7DAF7195B34F74A819650FD457A64496B3CD99C712CF2569C41A6C72B25B718671A0D9849148A139025CD84767AD58C01D5052847539496E8C7765768521A2952D4F0C0E66308812564340684EC3172404CE1734AF86282138B70052A7AEF4C5849368D948F0F6C5AA4B1C507DADB16D8286E7BF4380B9314744D4ED98A42551989208046F9590C8284C5BEEC810D810AEEDC0F6C8109972633AD4B5B765A9269D7234E3C4BCC24D39EE5DAA6B53D31AA72602D3FF2DE80AB74ACEA0EF5A530F139508BD86DECA389A3E294A0C04B394682747E08C7C3906B015ADA60E7885208DEB8B301184D462CC0404A18EDCA9E18B346D8802B5607160423FD440C7DB162434F32018B59096CD729E1B6374988492EAED549A0CB2326528B1CD465FADA3C4DF65D78D0E6CB049D5EAA2FCECFCE9D1E2B4D6AE233462E49047BD3377824F2BAB86EF96678C452C89D402733E06DD0E6145439004ED991170A4B8508AD29932C03741E19449C8C6DF25029C77C8863258789FD9C218A1D901AD053BE5A154591BB1A6495FD84FF00CE32FF00EB377FCE3E57AFFCAB5F29FF00DD1ED72618BDBF15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF89F0E3D33BE6370B90957306400773B63C2A893C9057A531A5414B39AF107738D2A6360038353D31E154BB508584E08FB23BE34A81F41BAF8634ADD1B74AFBE3C2A0A32D41F9E0E14F1353B32CAA4277A63C2BC49B7C0D082CBBE3C2BC484A537514C785789A1148F22D477C78578995C16E91C4848DC8EB8F0AF122B8464531E15E2524B74120A0EB919041DD3B55548C6525BA2BAD1AAF41E3BE5127320CD6CD78C60D329939514DA35E681B8D77CA645927FA70008DBE79592C3AB2FB280C8E1E9B1E99025CAC4377A3E8500E6A4FD39592EC71C5EA7A75B5694E990655453A11716DB172F105648A86A7BE2E5008C8F614C58108849CD7AF4C5A64994539D8E2D5269AE0B122BF2C5B20A911248AF42712E5453D8A9435CA2412BCD011E195C83243CCCBE34AE564360404C418A403C36C8D32E618B5E219BE06DFC31A6B1043DBE9C88EAC57E795C9BE019569D6D142438503DF2A2E4C4D0653115722831059C8D84C245063E98B00142301771D7BE2CC05766DB16C010ACA64AD0D08C595226D548A8AE2C486D890C77C5AC8519588077C2C084B26734EB954CA46C92DC826BBED8C249914B48F8C0FA7365824EAB54762F867F3DA0FF738E69DBFA66EF049E5B56777C797AA05CCBB53739B5C6E833F34BD97AE65479B8325C3651932C02ECA24E441AA0C88632688184315608BC47CB2D0AA4C8BE1D724AFEBEFFE719F6FF9C70FF9C7E1E1F96DE54FFBA3DAE4C317B6E2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88C69196127AED9570B9096DAC8649D09D80618F0AB26963050B571E15484A8697C287070AA610308CD41AF88C3C2ADCF2ACBFB1F11C78556B47C63E5C7B74C78552891B91200E27C7052A6FA64609DCD70213292D95E4A70A537AE0295CF6C586DB64789544DBB12AA13EC9DCF8E08CAD53386D49A129C6992B545CC68AA03538F6F1C6D54EDCB4A695C6D5368AD893CB9F4ED913BA2DB9A42B48C0DBC72A945BA324C34BB33248007EA6A4D328945CB8167013EAEA13EDD7BE5243951927DA622C90056D8D4E52609326436500120402BEF95CA34DB0C76F41D3AD38471ED94C8539B8F15335D2217F500029EF95172E269EA9A7A88E38EA2A69BE066237BA6E6207E2AEDE18B91134E238D3BF862DE26AF1C7CE9BF1C549B5AABF11F638B4C8A3D361F2C585371C7CBE2AD37C52364CED5796DE180B7C7226491D3F6EBF4640B3E25B27C3DEB4CAC864248095B96F5A65526D0508CFB78E479320503E887979D694ED9599B6844B5B86150DC699519338A6F6E802019592D802776D1D5280EFE3823CD289766E3403A65BC2B6A28581A15A0F1C7859892282961B1DCE3C2DA0A998985487EBD4E3C2C81B5D1A322B1E75A63C2B24BE49DCB9DBA63C2D6A4CEEFDE871E16B2859A1928183D699465145318DA477AF242A0D0B1390894CA0878F9B3A9A54115AE6C7049D4EAE3B3E30FCFBB7923D45AE78F2AEDC7EECDCE1C941E53571DDF1B6A16ACB3C8EC69CB7E3F3CDBE09ECE8B34774918D0D3C333625C1986E95EF97736B6CAD3BE5320DD02B9412064445245AF1193DF080BC2B0AB02464C15E1586363DF1B5E17F5F3FF38D029FF38E3FF38FE3C3F2DBCA9FF747B5CB03597B6E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D98A8B7639072125B39544C3E78AB27797F75F462A948156A62A88A30C554E163F584E5F67154E27E0D0D075A62AC7648CA82701546E95381285F7C8143339230D1864153DF2252A0A08201195211D0C695078D7C718F34A39A48047C76072C548AEC8E69C0D41EB8AA63A7C144E647CF154CE175AB8F7C082B1A1F524141D4E466CE2CA34AB6F488246F98F37331B2066569157282E4C59269F6CC5D4A8F848D865726639B34D32D97EB09C865322E6620F41855508551B28DB289976100C974992928A8DF2825917A04120E2A7C70B743927B6EDEA003B62D88958F93118B64516917100E2CC287A7F113E2716B3156040F9628E144C4B45DF7C578530B55EB812228A1CA83205B5425E546C8499452E7E54CA4B70429EA3C32259072FDA39410CC146A005699021B01B4CD015400E4086C0532B7978AD46301452792351CB76CBD00A2163E54DB61BE2CC145A41B74A571660AC922A0DB6C5B6254516BC875C5050BF54E4EE695C581287961E1DBA62D64A02694468478E63E50CE058FEA24BAA9032B8865296CA5C9A28E33C7AED99D846EEAB57C9F257FCE4246D0C493B2ECDDE9F2CDCE11B3CAEAB9BE25D56759642C050140299B6C01D0E61BB139012C69F4667E37026BD010287AE5E1A951BF865726C8AE465005722DA15D5D7EEC2AA9453BD3AE2AEE2BE18ABFAEAFF009C6BFF00D674FC82FF00CD71E55FFBA45AE5A39349E6F6BC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EBA9D962318514F1CA2DBD2086568E74237E4DBE36ACCE37F5223DB1B543A8E2F5EB4C6D51AC57D3E58DAA5F50581AD0D76C6D5305E4C8057E9C6D5053A108C08DBC71B5405BAFA73F20DBD712ACF6C6E8AA54A06DA943912944170E6BC403E195A15D2E022BD5474DB0412C76F2F19A4214D07B658AA96FCD8835E7E3ED8AB258A65861DE9B8E98AA5E977C653C68C09A9C5053DB39C33A92A0E426CE2CC6DD8351BA517A663CDCCC689854B5CA6F9417262F56D06C8488A37F63944CB7445A791C0F0DE2A28A8AF5CA497371067F6567249C7634A7DACC79173E316496561E8C80F224E524B221964638A281BED930D914DECE765A7C35C2CD3B81F93569D4E2D91473B6DD3166146353254D29BE285850F2229B62AAE8EE9B7018AA6768F4EA3AE2551ECCA83C72B2C908F286AED909328A11C8A74CA4B7041484006942476C052A51824824532B21368F8EB5DF61E390219829824818053B656436028F80A82141AD71884996C9BC4AAA011BE588053355AA29A52A77C5B01560CAA37C5982879248DC30AF4C59C4A0165547206F5C524A3519284FF375C5AC940DDAA052791C5812C62F1BE02C054A9E994E4512A414BC1EDD5C8A1F0C8C53C4E6712A20540420AE66E1165D76A4ECF9B3FE724B4F79FCBB1DD2C615947D91ED4CDCE10F35AA7E736A49E9BD1CD0F1155CDA61E4E833F349C0A0E43E23E199D8DD7CDD52DF115A13DB2F0D4D9A93D32B93645408F888AD37C8B6856403BB6154482B403962AA8154FED9C55FD75FFCE35FFEB3A7E417FE6B8F2AFF00DD22D72D1C9A4F37B5E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF876BBE87315C8485CF160DE06B8AB2DD364F561FA31555941018E2A88452D01F962A955584943E3B0C5538B771C77FBB156AE1D1D4A8EA70C552A02928F9E48A197589AAD3DB22528D63C72A4202EA7288287AE304B1A7959E5A7BE58A9D5BCAD12123BD3156E5D4491C4B6F8AA8C37039160D5A9C50591E9B745A5515EF909B38BD1ED5FECFB8CC79B998D3AB14E57287DF282E4C5ED7E598D43A46DE198D939B918D92DD411A5DA35075DB289173F10675A5BC7E94629BD331E45CF804DE8CCD551B786524B221388549550763DF2D8F2484DA24E00649926D6DDB16C8A3DFA62CC23ADE35E35F6C59D34235E67DF15A44FD5C374C569AF4590EDB602B4BDB91C8162A251B7ED909328A83A353AE525B8210A357A6053C9B58DC6FC71402AA0B1143B7BE408660AF5661DF2B219828BB695BD51BF6C88E6C89D936FAE84E35392620B23B5BB8E48802462D81AB89929B362D80A5227ABB0E58B3057AA826BE38A928D8CA804571604A1AEDD781DF16B258E3CF17C5191CB91A8CAE41ACC964482E3946A9B0ED8C42789A82CE732B2AA1E20666E1145C4D472795FE7CE96F2792E591A3FB009CDC610F39A97E4E6BCE5EF64A6C17E1A7CB3658DD06A39A5F08063DF3371BAF9B7407A65E393535C4572B9364541E262C48E9916D0B789185555436D8AABAAB53157F5DFF00F38D5FFACE7F903FF9AE3CABFF00748B5CB472693CDED7850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87BBB5531935DF31E9C863A543921B61ED8D2A6FA4DD324A200070AD2A7AE1A54E75173071F4C0656FB44E0A54C34F904B0716006DB61A54B2E222B72A00AA93D7052A342468952C41231A543955506452491B50F4C2020A1A83D415385871325D3E4F8B8F6E38299DA6373444E4BD7DF0708674C7EE1E4956941B1C1C20208A4BE38BF780B57E8C076502D386904501E00134E87236C8458C4B2C92CA6A00DFB640C99885A3AC80F4E466635076C788B194190E94DFBE06BDF2066CE117A759CCC4AF4D865129B9708B35F2E446F2ED44BB007F67283272A317B669F69F5495668EA76037E998F236E4420C87D2378E1CECC3F972B21CA86CCC749B3A471835AF7CA65172A136530C25187C35CAF80368926D1C2397235A9ED92029B446D328E20C37AFB6165C29A4302A01427E9C590D915C1586F5C520A362015401DF167C4E650096A9AE2BC48A85CED418AF1225959874FA3015E25AB6EFD5853293265C2E3180694EBB642526622AA2C95C7C24D72A25B4042B69D3A49CB882A0EF91E25217B5A3FECA60E363C28792D66542C62F8475A6478923642B46C3A46D8136B6349C3AF08CF23DCF4C40DD0648EB9B19446B21A863D874C953113455A7AB1A0E47638D33135D7771E9AFDADFDF1A6CE341C127AA58D7A0C04536C668E499D76FC7032E26A5BBE20107AE2C52A9EFA490F1DA98A0C6DD691722CF4E4D5D864A301269C9B328D32131373F4D4D7AD4648630A192470DBC70BCC8A0DC336E87A53333144071353C982FE6C68306B9E45BF515F552363C53C7369843CDEAA443F147CC3A4CB6DAC5F5B5C03188A4603E55CD96301D2651658DB22C5550DF2CCB8389382C415515CB9A0C5771CA6452154283414C900D814E445180AA9C6C4B71A6C3224A53058C507BE438D5FD727FCE36EDFF0038EBF9063C3F2E7CADFF00748B5CCA8F20D079BDA70A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8749E4AC447B652DE9347F131A77DB1557B6AC3386E9BE2AC8AE5C5C427F9A9B62AABA7B98D4027154C4C625607BF6C550579CA31C7BE2ABA08CC916E31415268087C5AD34B4E51B03F462D8134B97E51FD18B68415AA076901F0C05126A5B602A5464648097CC484653D32B6C4A963A927C7BE565B62B91FD30E3C4E218493CD1A4E532FCF2126507A969FBBA8F1198E5CB83D5FC9B6D5BAE9DF292E541ED92A18ADD683282E54026BA2C2EC39B0D8644B7443D0F4C8D782E5527222190C71AF31B641BC04C52104834EBD316F8A67142076F9E2C9305B72698AAB0B638AA323B7341B62C9CF6C7154C2DAD136DF154E560840F703014851692255F88019410DA95CF7766A08E601F1C810C9049AA5BC469EA8DBDF2B21B0228EAD1488C88E3938F872045325B15C4951591720C11C2E55455DD597B8C55DF5AB56EC98AAEF5ED88FD95F7184319206EAF2071C3D41926210735CC7140A43D77ED8B20C62FB52E4E141F6C5B137D2C92189E8C36C05B2298CAC1109C8B3B486F2EC28DCECB8ADB1A7D7218A5E25FA75C56D33B7F355A5BD393800E5B02C08B4DD3CFDA7A2D0381F4E49908D2D5F3FDB199B8C808E1B0AF7CBB1C9C6CF0B4A0F9D67BAB6BFB49B7826560A0FBE6CB14DD0EA30597E74FE7368325B6B97B7B04748A51C811E273638A7B3A2D462E12F9DA60F1BA07EE73371C9D76514887015A83C065D6E21E6B7204A40554FE1841D99A9C9D701296E28F7AF8E564AA37A0CAED5FD707FCE36FFEB3AFE41FFE6B9F2B7FDD22D733A1F48683CDED39243B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8739D15050D6994B7A56838C8A53A72DEB8AAACCDFBCF87C7154E2DE86024FDA036C551B6EBB6E37C551F1CA237523B763EF8AADBF40F1FA83ED1DF156ACE5E30D0D3962828D58E3937A5716B5748B7A1FB23A62D817CA6A287718B68528488CB15EF80A24AE5CB0C8C9012BBB4F877CADB12C8C1DC0CACB6C50EC84B1E58B0927DA3C6038206F5C849941EA7A38F526507AD36CC72E5C1EDFE4F83D39B95329939507AE9ACD1A2D3E119417371F2659A55BFA70F151DB225BE219469B190429D88CAA4E44427D6EAED3053F6720DE032686D01A6C698B604D52D1788A038A5328ED8F15DB6C5518966081B7CF1555312203418B2433E2ABE3623BD3155579F82925BA024E2AC5AFF5A8F81A380720437304BEBDB89598A49F09CAC8641266B8946E646FBF2B21B436BAB4F1FC21CFCF2B904AE3ADDCAF499BEF394B05875FBCA504E7E938AAD5F30DE29DE7A62A887F32DC471971354F4A610C648287CCB712CB4692B9260190C1AB4D31285AB45A818B30EB6E7753FC7B8AF6C5B1E81A7C451197A055DB0499DD35773908DB8DB22BC4F3ED56EE5A482BB0AE2BC4F2DBFBB732B166A11E18AF124536A2EE4297240E94CB20CE25080DECB25217600F8EF8934D9619058E9FA9F2462599BB1DE9928CF76899B67B67A56AB7118528294EC3336191C2C98ADE51F9ABE4D9A5D3EF649E127D0879A353BD333F164D9D06B70D17E7FDFAC4CD70B30FDF40E4474D86C7BE67E2C8F3DA914972492301EA50B77CCC8C9D613BABAEF4AE025B61BAB2004D3240ECCCB6F12D2A7224AAC0FC7E8CAC9558F3B76A7CB236AFEBAFFE71A8D7FE71CFF2049EA7F2E3CAA4FF00DC22D73610FA47B9A0F37B5E490EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87FBA8BD4048194B7B1D95BD16A1EB8AAAC3FBC353F3C553112FA6A476C553AB12255A8EF8AAF9E321AA3B74C5549AE015F4D8EF8AAC4AD76E871414E6D7B138B5A6C801E9E18B6042DC6DF3C5B52DF50A927C701449176CFEA353B646480985DD972841A74195B63152BC1C8EC0E565B62A4D4635F0C430927FA42FEF07EBC849941EA7A0445AE51BB0EB98F272E0F7DF2E22D40194C9CA83D12CB99611F5DF6CA0B9F886CCEB4D0C38AD3E8C89E4E44597E9F0FF00A415237DB2A939116530DA8F5850641BC06490460103C31649B2C6B4C551491B6D41B62A8D446A0F871569EDCD09A6E7164817B73BED8AA1243C176ED8AA4379764065AD6A08C55874D652DCEC95381B9520D0AE08355241C890C9171F961E43464A8F97F66565B0233FC191B293C7E2ED954F932E88197C9A00E998CC12CB8F2B8B78DA5E05F8761DF156297F6621AD206DBBD31563176EC6328B0B29AF5C218C90964D289B743D724C0335D3999E52A548F8716619DE89680B863D716C6573968D2918DFF6A980A4A4924C4F20FB7BE4516C475754653C37AD6B8ADBCDEE74C92791A83A9C56D42CFCB5732CDC1622E09EB4CB22764893D3347F216E924D1F1EFB8FECC848A99BD2EC7CA9630AA82AAC7AE40163C4CA6DF4AB5800E2829F2CCA84940619F99FE5A1A8F937549EDE1065F4986C3C01CCFC52D9D36BA1BBF1A35FD2CD96A5A84338E327ACDC54FF00AC7363864F27AD0C6648CC52943D466C205D213BAF4C9B978BBD156E393D0E36CA489BB4E2A3B57204A1219A52B5C892A8749F91A57A6564A1FD7F7FCE346FFF0038E3FF0038FE7C7F2DBCA9FF00747B5CD9E3FA47B9A4F37B6E4D0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88FE09E89206F986265C86217D18790FE1928CAD5640FE91DF2684C42ACA093B8C2A9DE95F01A1FB3E18AA6578547D8D81EB91B4A41229E7CB2064847C0EA29CB718612B2829FC7E888EAA37F1CBA835A26DDD016277DB225B0284E19CD17A65664DA103242114B30EBD30192D5AAE9FFDE644C9908B241CE489D4EE00E982D980C4F50B52AC59453DF06CD8024EBC91B89EF9125B238C1E6C93493FBD51DB2B914F000F5FD094ACC9C45052A731E45B601EE3E5621A401B7AE504B9B08BD5ECA14AAB22D189EB98B3951765860299FE9502D15996AD90E22DE22199E9F6D1FA9EA71F8CD2A7236DB10C9E1894B82474EF8B626B144ACE7E793114A611464B713D3C325C2153A8E3000DBA0D8E0E10AAAC0A8DBEFC7842AAB0F86BED8F085B40BF5C7842DA577708E2DC0531E15B62F3E9EF2B13C490712026D1765A5246DFDDED9512BC4C892DE355A7015A656496C125C88A29F08CAC96F8C95C01D29D72B2CEDC638DBED2D722634B4A0F676EC0D23049ED9548522987EABA7C6C5FF74BF2A0CA49626DE75A8E99C8B462314AF4A61848DEE903BD278F4708F511EF5CBEC32E109FDA69C435553E223AE3B278598E9903C34EC3BE1B09A4E652163241F88F5C8C9B211058B5DFED6FD6B9149800C6258DA4675AD47718B510A967A6C4CFF147518B512CE74AD3ECADD59961018904138AC4B2B49232B420500F9603BA69689A388D176AEFD71A452256FA9FB59206992716CF16A9A65E69B3012452C6FCA33DFE1399FA736EA759B97E31FE70E94BA6FE656B564578DAA3B3431781A939B9D3879AD6403C655A49EB34E794A5882DD36068336511B3A1C9000AA00074DB2B9158121176E55483DFBE52665CB8C6C29DF5C301B361E22A62C6E6766AF235C9B02104B38434069878583FB10FF9C653CBFE71BBFE71F1BC7F2D7CA67FEE4F6B9B087D23DCD079BDBF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8DAB09F719801BD8DDC8A4849EC77CB2294B5C736AA9CB1531B69285636FDADB0A19143FBB5AD7A60554F53D45627B602942BA77F0CA8A143D4DC01E38C0D154FE02C621E19719288A362069F3CACC9B045308E2046FF007E5664D822A7731064000E991253C2A7A7DB7EF3A64789908B2BB5B6AF30456B8F1331143EA7A627A65A831E26C1160A6CF94D41DB6C04B6C62CA746D3099936AF8E5722A43DA746D302F134DC65132CE01E9BE5C88ADC5076398F22E7630F63D1A20F22A1F1CC69F376388507A3D9C3C19401F4641B87366D610D29B6F8B6C53A4401C7862CD31B789CB123A65A392A610C3273C2AC8228C71507AD3155EF18A53BE2AD32EDFC715413AEF8AA19A307AFD38AB696D19EC36C0555BD140360065549010B22D180F7C810C8158401F3CAC86624B3991B9391E16C8C9DEB0C4C5B4168DC8405ABD3299452C72F6F1199878E6398A6AD875ECAA5C90054E400A4F0D2053E371B77C3C48643656C6B5A6D4DB1E254E12260BB63C4AB5A195C30F0C902DB89239AD253CBF56499C9237B57491B6A16C5A24995AC0C083DF16892730C8D1EC72405A225182E881D70F0B2B51376A49E477C7856D512ED36DFDB1E15B649A15D1127C3FEEC0CB4FA0E6660D9D6EAB72FCAFF00F9C90B196DBF342F66238A4AC493F7E6E74E5E73561F394A156460BF66B9B2076745946EA7FC72A996B886BD42A72AE6E643925D7331634C980892493DCFDA51DB6C980C4A56CE49D8E4C06A7F645FF38C1FFACD3FF38F1FF9ACFCA5FF00746B4CCD8F20D079BDCF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D880E040E87B66006F492FA2F88803AE5914A1C5B7186BC7E2F1CB108781585C46CDBAA9C2ACB15E3684803738154955A35663F6476C05285594BC9C6B55AF4CA8A157D052E2837C8F567109CDB3AA808D8993688A6B0C44B0A7D93DB2064D8229EFA01635A2D09CACC9B0456081581F86A720649E15D6F6AC1C7A6BC71E26422C9AC6D242D535A63C4CC4532BFD3CBC068B534C789988B036D34C731F82849C789B04597E8765C654257204B121EB9648B18400509198F32CE019C688A82652A286BB9CA497371F27B068CA81D582D0F8E5122E7E3E4CF6CCF29D2BD3C322DA39B36B4AF3F84D17B62DB14D56A5B03364368E811011BD284E5D1E4A9B200402A389F1C2A8F49102AEDBD3738AAE3221EA31543927715DBB62A82949036C550F473FB471556457A801A82BB9F6C555E458A31549BD4F639021925B35DB80CA2DD189E8DE190216D45EFA38AD889621EA53EDF7C810C4C92A4BB8DA29A46958B28F8129D72206EB19A0D2EA607D53C9D3F9299618B68CADB5ECB7069E87A71D3E2343944E0DB1C9691DD7EF83F01C58577198F28B609B1B78A560C492483F6B299C68365DA2ACEDDCC82BBE55C28675676A0AA80BF1531E154D52C588E98F0AAE5B1707A75D8E4A21B71A12EF4F2A84AAD0F8E58CE4C4E6B26939A96E2F5F84E2D1256787D2B16319E52C42AD20F018B449E6F79F9A5E52B099ACF51BD4B6B984F16151BE5916B2692D93F387C822A1B5B2BF223254BC4BED3F363F2FAE24A0D6D9B7DEB4C697899345E73F28DE11F53D5D2A7A02C31A5E2665E5DD574C9264F4F555256A428208DF2FC45C2D46EF833FE7278423F31E36DA482653507A13439B7D39741AB8BE3F6565BCB84635556345EC01CD903B3A2CA374422214625457B65536B8849677605E86832500E4C521B8B97527E3CB00625262EEECC791DCD7260312B94E4C06A7F64DFF0038C1FF00ACD3FF0038F1FF009ACFCA5FF746B4CCA8F2683CDEE7850EC55D8ABB155AE683E9C554F97B62AEE5ED8ABB97B62AEE5ED8ABB97B62AEE5ED8ABB97B62ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88BB53C866006F5971082E0D3BE5914A16E00488FCB2C42550D19E83AD76C2A98DBC844BC3DFA6054E2E29F56603BD3014A4515564CA8F3423C5C0420F7A65726DC7CD745704B8232B25C9AB6490DEA22A6E2B5CAC96C8C593433ACB1AEF9025B04535B4B70E188A1DB20649E14FAC6C55985464789970B281A7848C328C3C4D9108EB6D3DA78DAA2BB63C4CC063B71A3137205325129AA4EACB4A68DD6829824C4866305B32B2023B663C8B38B35D1A03EAA6D9492E6630F56B106109951E6E6C59D69DF100D81B073673A6FC4AA69D7BE2DB14E917E3C59A7D6B6C48461D0EF96C792A751A711BE155C57DF157703E38AB5F4E2A849BA62A82798462BBD71541B6A616B5AE2AC7F51F31D9C1192CC63A77C910D8C02F7F30F4BB763CB520A57AA93FD99590C0B179FF003C3CB167270BABC593DABFD99590D04A47A97FCE48793ED2A91852C47C27DFEEC111BB59953CAB56FF009CAA82DEE78DAC21A3AD1401FD99710C2390DA5F27FCE4A6BFA821FA8D89E0C09E407F665120DF1C858D45FF00391BAEDAFAED776C556BDC7F6663C839519BE91FC9EF3EBFE61426231805D4B961ED954837C256FA2AC7437AA9E3F4655C0DCC9EDB4C78CD48C3C0A9DC160481515C1C2AACFA79A834EF8914DD8D0379A79E1F7E06526177962A03963C585787BE2D1248D61963B1D453ABCB1B08FE74DB16893F32BF313F293CFDA8F9AB50BE8209A5B79A4668F8F402A7DF32314801C9A64C462FCACF385B6D73A4CF2D3BF13FD725B215D7F2EBCDF34CB1D9E893C751BB713D7EFC7657A0F977F243F30A7991E4967B343BD09A7F1C695F5FFE597E526B1A5DBC6DA96A0F34CAF5662D5D89E9D7251E6D1946CF1DFF009CCDF253680DA3EB11356474EBDFA1CDAE9CBA0D587E7F593C9373965D9DBAD73640ECE8B28DD16A7E07F1ED954DAE218BDCDC0124895E8694CBB1F26F88D9239EAE4E5A031921F8D065803595226876EB9301ADFD94FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A0F37BA6143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8294F845330037B52D4B29AF7CB2294AAF6BB8CB152D8D5830A547CB0B13C930854870DBD7C72122C2253953585ABBE54496C4A1BFBC6F9E441552641238567283AD7F86322299E306D98F967CADABF98AEE2B5B3B62C8C69EA01DB31CC9D8E385BEDAF227FCE2EC17515B5D6B32155900A293FB5BFBE5129B9F8F102F43D57FE716EDA2B988E9CF5403EC76FF89663CA65BBC10F25F35FE476B9E5FB932C687D193E1555ED4FA72066C7C10F3E5D0750B0B8F4E5571C4D0D7009A462A6616D632491014AF11BE59C4CFC20BCD9DC4428B551ED931309F0D012DB49CD59C50F8E094BB94C02636B1134F1C8711699C53368A452A791E9B60B6BA65DA0C94750C706CE442DEA763229E15DF289F3765879334D35C55476F0C8B7B3EB023E103618AA7D18AB0DB02DB27B16F8554F6197479330980DDC006A3C30A551862AAB18046E31545718986C82B4C585A57716ACD5E228322B691CDA75D716F8493BD32B2516F3FD674BD4DCBA4523A73040A1E99124A5E3BAE7E4DF9C35F467835BBB8977AAABD3F8E4F88A402F1CD4BFE71BFCE6F3D06AD732B576ABF5F9EF82D9D16357DFF38C5E757A97919DFF0098FF00B78B218D8A5C7FCE3179D43F22BCCAF4AFFB78F2639310E1427FD0B379CC48ACF6EBB1EE3FB720723891C459FF00973F203CD715C436F39F4A0604391B536F9E4253722185E97A27FCE37581BC59757B812AF2ABC2C6A0EFE15CA8CDCA8627D4BE51F22F97BCA10C49A3D9C5048ABC4B462808EFDF2A9CB67271E3A2F52B68AA828287C72102DE629D5BD9B4AA07877CB835909BC569E9815CAE4C0AAB428C0D08F837CA81B402424B733060D18415E95C2DC0B0ED474F6A973B835A0F0C5B0C424F1C216A196B4C5A6710105736314EDCC205E1B103BE0B21C59C2F9249756B69103CE352464F88B5F865298A6B78A5A450278D699602BE19661653F35154070DAF8659369F7D0DA144745FF4821547BE46CDACA1B6EC37FE7263C99179DFF2D64586D926BCB088C826A55C0E2C7AD7365A693A4D5C03F119A136BA9CF6922F131C8D191EEA48FE19B8C727439318B5194888DD21D890787B6DDB26402B080616EB44AB6EE6BC98F5C9844A21047ED1CB034C821DBBFD3930D12438DC9AE58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4F37B9E143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B535CC00DEAF28EF9645528BA1C8E58AA10C60B8AE2A5181789C045B590982FF7669E191314829431FDE36532D9BE22D52D2C9F52BE82D233467351F466365C941CCC18ACBF49BF21FC950E9D6105EDCDB2BD003C88F9E611CAEDB1617D71FE2ED0B4B8E21385E286813C0E512C8EC71E057B7FCCAD0EF6EE386270A76037CA2591BCE165F7369A4EAD6CF2CC527122FC209AD32BF111E03C475DFCB0B2D424966B78946E69B63E22F80F329BF2DEE609654856A17ED532D195071525571E49BB86BCD0ED93191071A437BE567442CEB4206DB6113B6AC90628BA7345395F7E98789C5945329ADB8462BD69D71B6BE156D224E33818F137462F48B49887515EC32B917618850679A4C84B2FBE06D7A3E9CDBAD76C5594DB8E4C3154E6D5C89197C32D1C9984DE13571852886FE38AAAC7D3154C228BBF638A6959A21DC74C82D21999882380CAD692C9ECFD53BA0A9DABE1919288EEE8ADE6B65F4924EA29838DC8F0D092DACA8793C8013D1BC31E36631A5773F003CAF01FA4E3C4D831B1E96F2047DEE86DEE72139ECCBC2B496EF568492A9722A7E798A7228D3282B5C489EAC373561D1413959C8DD1D3A274EB7964B80D2C859ABB2E40E46E1829E8D6914CC1226B6E117FBF48C8F1DB2963A65B6D6E11176AED96C0B5109D4238A82075CBAD810ACFCB8E5732D6425CED22568763D72B896043A38A39012454F8E49B6297DC5AF21257A0FB38B7249FA3958B6DF4E2D3916C1A423ACBCBB1DB22538B1F131ED53CBE8FCA87AE20B6F82C364D0258A60231C93A93938C97C047C505C5BAF43B6596BE026B6B0C976D645BED452127E583AB899B1D3D3AD2DC6ABA76B1A6CC39ACF6C63507DD48FE399D84D3A3D5C2DF87DF9F7E50FF0003F9EB50B20BC6970CF4A7F3B31CDB6296CE872E3A2F1CD4855D641FB4BBE650DDC7E4C4AE362C3C32C6322969FB67241A64876EFF004E581C7921C753963497F655FF0038BFFF00ACD1FF0038EFFF009ACBCA5FF746B4CBC72692F73C28762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B360BD730037A3E4A1E9DB2C8A529BB42C76CB10A50AF165A8A625211B55C622D8494E52786C77A8C998ECD60EE83BCF8AE9388A506F4CC2CFB39F845BD1FF2CB493A96BD68047CB8CAA6B4ED5CD5E59DBB7D3E3DDFA93A3D8B69DA6DABA0F4D1211555D8663176D8A2F2BD72D751D7353962B3321084B1504D32893B1C71D952DBCBBABE9EA26657046F5EF98F26FE009EE8DE78D5B41BD1CCC9344D45911892001DE99595107B868DE79D1B5B31AC92FA5310014069BE36930658D6A8E1DD40E128F81BC72C69945299F4A421AAA0D7C46581A0B0DD574359012117A1ED9312A6A9C5E51A9E83C2524201BF618789C69C58F5D69DC410476C789AB85274B5E126DF0D0F518F137C22CBB4752028356DFA9C376E5C0507A4E974053B7F98C2C9E83A6CA15803DA98AB288E7008A62A9AC2E480C3BF5CB63C998E49A42E69D4E14A395BA62AACADEFB62A9BDA5D536206D8B35F7373CA945A5720B4840ACDD09CACAD221232BD6BF3C84CA62375D2AF53D0E637139A12B9622FF0D49E5B6F8789B404A2EB492CA69DB071338B1A9BCBCCEE47106BED919CB66D88DD47FC2E3FDF43EECC4B6F115787CB8D1C8A40200ED902590A661A6E841543155A8F6CA8A788271E97A478D6A3C3082899B08E801D854E5F02E3109AA82A0153990C4869A471EF954CB590A2D2B32B0200C840DB54C25A4B89050903C32D6714C963F5A3DCD0A8DB16E4B64B295492010B5C5A72289825D8455A7ED655334DDA734BBEA32CA28687E782DC9E2583494460B201C9B71F2CB014F10448D060906EA3EEC9028E25F1796914F258FE9196C5C4CC2D36B6B45B53B2B03DC8EF97E39EEE9F518DF9A7FF0039C1E5223518FCCD15B8F4EE295217F9797539B2C32743A8C6FCE1BE9B8832EE55968066CF13AB9ECC50124B549CB4B594249D4E48354940F4CB038F2511D4E58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88089A86B9801BD338CD40F1CB22969E30C32C420D8713B6291CD6D4E4A00B1C8B58D46E69979AA681CD40FC7331F019ABD4BB4D353E9EFF009C74D21751D692A952B535A78669C9DDDDE101FA397F6CB6DA3D360563A01DF2120ECB0B7F96FE5B8F503777862ABD08AB0EDBF88CA661D96309BF99F4A3043246918E9D8663C8373C0752D0F50796436F096321A37C35DBEECAE99458DCB65AAF96E48EF4A4B50C0D02B78FCB101127D05E48F375D6BB6612E418CDA850BCB626B4F1CB0071E6CFEE66658C7BE594E34C149A525D1AA3AE46450030AD4EC83B31A6F91DDAA51613A958D0F4A6DD71DDA845864B6A56423EFC6CB7C629EE92854283D6B9747937067DA79A32E4959BE9FBB8FA31564A83718153C85A8A9F2DB2D076660A6B136DBE1B4A354EC3F1C2AAEA4D3154742E148AF862DC119556C8324C6DE256A74DB2B28559630B95CF92421D979661B900A87A7BF4C0CE25B30F2ED8B60696C4160481B74C05B224DAAFD487F2D7E8CACC5B812EFA90F0032042D9575FDD0E23E9CAC861C454DE124FA9D7DB214CA3225673F4CF4CB62C885C353111AB6E3A65CD65506A91C9DB2120C0B6F771D36DABD7238F9B44D0E675AD69972628BB797D571C7609D716F64B58A587871DE98B4CC162B7F21D31F8769872194E45C7612F87519A46A274F6C886EE229B44E646066D9874F96482F116416C22E23A64D788A756F2AAC4151030AF5CC989D98917BAA344D37488610E0E78BE6AFF009C9CFCBF4F347E5EEA73BC5FBCD3E2661B54FD963E199D824E83541F83FAA5A1856F216D9ADA5650A7AECC7B66EB09D9D0E6D8B0FEA58E5E5AC1D9072F7DF2516B9287ECF5ED96071E4A2A773963490FECABFE717FFF0059A3FE71DFFF00359794BFEE8D69978E4D279BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EB35F7CC572138A74DB2415A634196054B67900E44E487355B1CE38D2B96EC8282B9AB74F1CA665880A912F22CBDE99ABCE5CCC5B3EEAFF9C4EB113DD988815E25AB4DF6CD69767A626DF647999435D5A5BAB1D880403FC32B93BDD3F37B97962CD6D34832280ACD0EF414CA245DC621B30AD5A77B849A302A6A77CA2459494B4AD209812478C115DC951FD32316A1CD3AD5F49D15B4D91DCC3EAAA134655EB4F964993E64BFF300D235631DB30085C8F82806C7DB1453D5F45D7E4D52D54D6A683F56147084DE0BB3C9C4B4DB619645A728A49EE7799DFB1E992A68A627A944199EBD4EF8D2D30A9AD944BF3C6928AB440B28A61566BA79A30C559A58BFC43E8AE2A9F46FF10C55388EE00551E191BDD04A3A3BAA8EB8414A363B91B6FF003CB1B02312E47CE993661328DEB43E3DB16E099C4E38FF000C82A2606A656528D2A5C0A75C84D5BF4CE6310DA1A2877C890DB169537E99590E405754DC572239B656C98C511A74AE4E419C10D7111A1F7CA64E4001085780DFE9CC793090097CD7263A953F17860873681CD26B8D4E58EB5A6F97AC92A7BD9A405877E9938B4C9AB7BC9D09CB29A095433DDC8E4AD7010D68F82EEE0515D6BEF819C5368272159E9C69DF16F82223F307A4425457A62DD1016DF39D5F871FB4A28299092C804A6386EB4B928C84A9EE722C53D86EA3640CFF0068E2A98DBCF0D462A9EC13D221C3ECD76CCBC5C94A6B67744115CB1C2CE16F9AB4B1E63F2E6A1A4900FD7A090014FF00248CC9C45D06AE0FE76FF3A3CA4FE54FCC6D7347652AA9348C05283AB1F6CD96293CFE68EEF03BA6FDE483A10732E25A2B648E7152773BE5C1C69F35315000AE6445A96E5A036C407F661FF38BBFFACCFF00F38EDFF9AC7CA3FF00746B4CB43833FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B31D2B98AE426E47C3920A8694EDB6F9605482ED982BD01AF864952E86670D435F961B414D50730396D909A0370370B8907B7539AECCE5637DD7FF388F76A359642E05617A0AF7CD74C53B4D3737DAD359B5DEB30730410C280E63C9DEE9F9BD5EE3513A558B2745F4F8E5327718B9304B6D4629D679188EA69BE63C99496DDF9DEDB46B231B952D355547707C72316A1CDE15E63F38EA77F2C896933047A8A2939364C22DF48D42E6669E7E72173553D7157A56853DCE9A1622080682A715672D70DE9A3AB862FB900D72D838F991729E56E186EC7A81D726D2905FC25CA9FF277C558B5CDA9049A6D8AA95AA71931565567B32EF8AB2BB37A11BEDDCE2A9E46FF0010A9C55358CD40DF21D58946C792641191E58D811B1D6993661368998003C316F4D6273415E990423918D4532B294EED8065DF6F0C849513C465242789A2828720437464B553C7AE4087263255A002B4E9910376CB454520E3D69ED864DD0536219C0EA3C7289736F082BB1C50D3AF8E63C98C986DE4AC3950EE0E087368EAC3758BA99281493F2CBD125897130B346FDA66A11938B4C9111C92B15A6FEC32C0E396596B6D298D0AA924F51896B45C92C36A959402E3AAF7C8B6458E5FF99A0A18E21E9F0AF3AED8B7C5875C7984090BF30057662716F8A79A379A8C328726A95EBDB2052433C9FCC16DA94694515EE46458F0B514913505413E0315E14EED0C408E5F0FCF6C53C29D2CD1A2715229D46F97E33B302AD6F78A1BA81F4E4F89AA70B09B5AEA9CAE91030658C153FECB327149D36AF13F22FF00E7387C9B168FE686F3446800BE6259C0DAA6BDF3618E4F37A8C745F9A7786B7136D4F8B3638DD7C85256E09ED9787167CD408A66445A9665A1BA2FECC3FE7177FF00599FFE71DBFF00358F947FEE8D6996B813FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B33D37AE62B909B337C24788C2150E57E1396854A665FDE0C4AA4F29A4D5F7C802828E0F545DFC36C24A02E97EDB53C33132072B13EABFF009C5AD5E3B7F345BC6ED40411BF8D735F986CED34BCDFA88F12B6A36578375E20D730A4EF74FCD11E719DCE8F2CD16E6BC49CA64EE317278326AB710C14E5BF2E998F26526317AF79AA5F3210480A29918F36A1CD97683E45BBB86599E33C4D0D48C9B27A641E5FB0D360637340C47C18AB1BBFB6B494B7A43A74C550FA4A869DA222841A0CB60E3E6667058D09A8EBBE4DA503358061257F9B154A27D257D36FE98AA4034E546229DFAE2A9D5B5B22815C5536854290A3A0A62A9E47D302A2524A151E191EAC4A670CC7EFC90649847374CB1B022D26AE4D984E6396A06FB5316F098C6D5A64109A44C2A32B294D216A50D76AE4648298FAAA76C890805BE55CAC86D896F9656439112E26A322DD12A65C0EFF003C8C9C9C6D7D657A65126F086BA9818CF8E63C98C983EA32F10EC3C7A6087368EAC1AF2F19A4A7865E8936B7C562A1DF261A648ED37518849CA4DA996071E48ED7BF31F4AF2D69F25D4AEA0A834AFB62583E6AD6FF00E7226C2732CF030660C40A1FECC8B38A3BCB7E7A8FCCF6F73717527A224A7A5BD2B8B7C53237D1CC5E2AF348F7AE2DF1627A87E63C76529B0869198F6A0EF902D8032DF2B79D6FEEDC0E478B7BE4534F6FD0F5096499096DCE2B4F4225E5E1F175C5691261936A4DC76E95C9034D13E6EF425FF968FC71E26C10B08CB698D9D02B739240791AE64E29381AAC3B3E3CFF009CDAD163D5FF002CA3BF02B25A30634EBB54E6C71CDE57578F77E2BCF2195DE43FB44FE1B66DB0F27479051428EA3E79921C39A1E41B9F9E6445A90A577CB83745FD98FF00CE2EFF00EB337FCE3B7FE6B1F28FFDD1AD32C7027F51F7BDD7162EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87DB371502A2B98B4DF69C13D01C90554E3B7D19312094A275F8FF005609482B1EB8DA6F964225055E3625900049F0C9A014D110167327C238EC4FCB31F240B938E41EA3F935A8FE8AF31DB4AB2846332802BD413D7303340D3B3D2C85BF5FF4FBEFAC6876376AC1C7A43E319AF90A77DA722D34B906FF00CB573DDC3120663C8BB9C4367CFB35ACCF70B0202CDCF751D466392999A7A8E81E5AB7F53D69286408A48F0C62D319025EA16D3456B0085221D280E499DA4B7BA7C9A99268691EF418DA5E5DE60BA83439191E550D5FB24EF82D52DD0754FAE6A30B28E20FE396C0868CA1EC8564540C632011B31193B684ADC1624914DF738ADA94F1A985A8C09A614816C6CDB92C4D3BE282295046CBD01C55150EC77FC7154F22208EB8AAB2005AB9162533840A75C21923E351B64DB0146C69B64EC3208A89CF2A5698DB784EA17D86F90B54D616AD28722529AC6F414272242AA2CC01153898B0E0368F4DC546FF002C818B6C415F46F7CACC4B9116B953A9A7CF20634D91284B89000486195483978C84A4DC7C62AD4F7CA241C805B966AA1DFB65120C64C33569F843235413D86463CDA3917973DEF2BA615AEFD32FB6264159AF9A12ECC85815D864E2D5229249E6048924DC230AD01EB9686821F337E6C6A3ADEBF6F1D8D8A4A07A8DCD97B838086145E59E5AFCABD62E21ADDBBAF26E546FA0F8E459C43E91F2CF96E2D234B68AE18C92C207A2ABB9F7C69BA3B2AEA725EDB594AF65138918100537C5B8178FE9DE5BD66FF547BABE57ABBD547B64241B4483E92F2CE8A6CE18A886A06E70527883D934189F9AB73E86871A5E20F4069278F8904D3C7052F105C6ED89AB392DED80DB44B9B5F5BFF29B23BB91090554BE113C4C5AAA55AB5EDF3CC9C4D3A88D8D9E47F9E9A41F30FE5579801AC92C51B32C23AD02935A66C71BCAEB31905F8377711867B8848A18A46047FB239BAC3F4BCCE7152418076DBBE65C5C19858EBB9DB2F8B4A1580CB04806E8BFB2CFF9C5EFFD667FF9C76FFCD63E51FF00BA35A65A393813FA8FBDEE9858BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF874B265328CA593246507853C72259C513C07139596D0935D28562721D5279311BC929375CBA1C9A24BE0B90268E872F8F26013B9650F1EE72126FC68DD12FDAC351B5B98DB8B472015F6CC2CE36761A73BBF5CBF267CCA9AFF966D6D24903148C0A66AB287A1D2C9EF3A5AA3C9FA30AF10FBD735D91E8714B6615AEF96C695E6084C43E0998548F7CA29A739B7B3E89E598CC6B3247EA19D0034DE996403878B9B2EFF095959C5F5ABB70AA054A9C910E482F39F3AF9B340D26C192C028B85560E57B900D32B21982F8EB53D425F345F4CD2A91463C09F9E565B014C740B2D46CEEC39AF18D870F964E0C66FA4B4DB8379651ACB27C400D8E5B17166956A21E262886AA456B9634F54B2332383B6581C8835E9301B8DF0144D690475C0C694FF6CE2B48F85C01F2C569188D520D698AD2650B50628A4D633D314D23636DBE58A8B6D1C73A62E60E49A44FD37EF8A53BB6906D8AA64241B6298F36CB0241CB9C9149B5ACC1471AD2BB656BB2600823AE40ADA1A7038B37865534DA493C828731CB740A4B3C94AD3AE51272E054DAE1BD322BDB2892C8B17BEFDE73E7D32B71E658826968D7264A7535C21A2D327D2BD40401D475CC88AA42FE528A69099146F99015747E43B157E7243EA03D0787E38C92194DAF9574C8900FAA8DBDB20C9CFE5AD3CCA812D40F1DB154F57C91A75C45536C3953C3FB714A4375F9736C2559628F804EBFE75C8948445AF97520223A74C0A9FDBE962CF7036AD4E2A9DA32BC746C550727A49B03912CFA2025B845DAA3DB20D40EE827B9574702868466463E4E55EC93F9C6E3D6F27F986253F11B4947FC21CD962745AE2377E0879810C7ADEAA87AACEFFF001239B6C3C9E3B55F594A17F8E67637026B24077FD796171D02EBBE5526E0FECABFE717BFF599FF00E71DBFF358F947FEE8D6999D0FA47B9D7E4FA8FBDEE99260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF861D3DE432034DBC72964CB565278537DF2259C51C6600152C2BE19516D093DDB13CBDF23D5279308D403ACA3623C32E8726892193D65742548F039911E4C03258F9B415E276CAE4DF8D49039755A94A1AD7E5989945873B0BEE7FF9C71F39AD95CC3652DE0EC3893F3CD7658BBAD34E8BF49F4D9C4C12F512944AAC9E39AEC90779872A6B75045AA442EA420CF17D95EFB653C2CF24AD9FF94B596B3B6953D1FAC49C6853BA8F1C9014D111458679F7CD173E94886630F20691FDF890DC0BE62BB6B9D42E984E8E6366F858F7A9C810CC1645A779360216644E04EF9510CC1640DA298978C49CDA9BD30C42C98F1D46F6C2F56DDB946A4F4CB22E3CDE84B492C83BB0666DF2D69EA81876276DB261C88372321620900D3A602C8A0E414DFB604521F73B8FBF15A5652C3A0C5691F1F2A2FEBC56933849A5295C569348C9D85715A46AB506FF004E290162960DD3E9C5BC724C627A002B4F1C529DDB38DA8698AA6AA4F615C5239ABA1EE72E6DB541280CA396F5DB2056D324B903E127E2CAD6D7CF23189FC29D72A9A82C7AE255E81B7F0CC72DF0293DC39505A9D3289B95028069DE9D0D3C7289A494AAE999D08A6F5DF2B699157B5B55600D37C21A93AB6B3ABD38D76DF3222AAB3D8AEC547CF3202A360B3429B10580F881C64C8223EAE9F6792FCB20C913069A240EC08057ECE2AEE735BBF02E062A8EE64C4C18862DD32254242E8166AB0A6F812A978C161AFE38AA412DD98E062AD52062AC4DB54B862C0D46E72126CE88492FE43B16A6443472288B5B8E714A7957A664636F32F4A035894C9A16BEA4D57EAD257FE04E6CB13A0D74DF86DE6D503CCFAE85DC0B96A7DE736D8793C9EA0DC98F053E199D8DC19B9CAD3AEF96171D06E2A76CAA4DC1FD92FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD333A1F48F73AFC9F51F7BDCF24C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85DD35C96DF2964CB6023E1F9E44B20BA47FDE1DFBE5526E081BC7A2935E8323D527930FD45CB4887BE5D0E4D1253673CE1073223C9806516854C237CAE4DF8D12618E343336FDB31E4E66366BE45D767D175482E623455606BF7E61E58BB1C137EB17E5579EA1D734AB485E60D23280457E7EF9ADC917738723DF2D678ECAE638E75062946C7B6F94F0B9B1DD1535D496978CF6BF0C53281B63C283B21750D223D6007B800D7C7224282803E4ED387A4428AAE4086C05192E8F15BC5C621B814C810CC1632F697AB3858A22EA7A90322366576C7353F2BDE5CDCA4E632287241A26C820B0921B658DF7232D691CD4A5B431C6C476C9872209210DC8961BE02D94A72313B605E15200814C5695D6BBE2B48D4278A8F6C578531B76E9B62BC29B420938AD261E9B1FA714D2F119FA462D815D63DE98A53680D0818AA6F149414EB8AAE6980D89CB99F12D5605948EC6B5CACAF12A7D6292EE77C815E245CD755888F11954D416352CE7D43ED98E5BA086B89B92F1F1CA66E5C4A5D24C146E731E4A4A57713165F8776AE56D5229B69DCDA95C218B2AB5421AA4F514CC88AA37EAE5F71D33202A8C917A2373C6BB63264103FBB06A64A78E4192610DD451A37192BE3BE2A96DC319E4E4B21A0C551714AF1B202D514C894847CBE93A87D8918158F6AB72681074A74C55894D73C636538AB16B9999559972326D1F4A4C2EE477A1AD322E393BA716F70638580EAC4664636523B286BB2341E5FD79D8F10D6B21DFFD439B1C4F39AF93F11BCC8E24F30EB0E0D435C3107E939B5C3C9E6729B293667637126A2CB5AE5A5C7502BBE5526E0FEC8BFE7183FF0059A7FE71E3FF00359794BFEE8D6999D0FA47B9D7E4FA8FBDEE79260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85EB109D5771E394B24EE19497451D3950E44B208D724C840F1CAA4DC1037B50A4378647AA4F263B7B18AC6C72E872689206EC51A2653D32F8F26B08F82E48A440FEF295E39093918D3FB23F595759AA225EA7FCAED94172E299412FD5A2223FB75F8328C9172B1CA9F48FE507E663685756D0DE5D985C90B1A13B577F7CD7648D3B4C3983F4F342F325A6BDA35B5C3DC235D7006300824FE398C767698B202C860D46692358E54A18B704E0B05BA62D35B6BD77DBA0C890C63128A79D8107964086D102AC932B00246DBB9C898ADD2296EE2B643E8C425E5BB31ED95914CE3BA167D4A2991B946108F6C431940B13BCBC049111AD32624D3E19B4ABEB13382AC2993130DD114974E3892186F8DDB6092041DCD46D8AF12E6EA4D36F1C57897091456A715E2565993615C578C2656CEA69EF8AF104EEDA4407738A6C27B132151BE295540189A62CD1023351B7D38AA24232D0914C55148DD29D31559373AEC32DB544DB9A0F8BE9C812869C7C7C874F1CAC94B6F229000395CCDA84AA68DB996A6DDCE63B7C36414CE95A577CA66E540A45792D09DEA331E6C88B41C2FCE4006E7C32B6B9448DD9259C81283A64C45AF8939FAD3715E0475DF2E0BC4135B7BD2A9566CBC49788295C6A1137DA3CA9D4612CE26D8F5F6A9044A5AAAB4DF761FD723C2CE982EA5E7AB3B105566524D796E36FC71E15A63C9F9AB6B1D47A8A5BE63FAE34B4A4DF9AE92238128592BFBB507AFE39190544695F99324B308EE25A027615FEDC8D26DE956DA8C1A8C0662D56E831A5B63BA93FC7C23A927B531A543456723C3FBD4A313F86464D8262A90ADA70462426F91693024ECB5ADCAA0929448D8733E19763906194F0879FFE736BA343F26EA571EA7A69776AE96EDFCCC54803EFCD86298797D76404BF1AE617524D2CB74BC6791D9A415AFED1CDBE290AD9D1CE24EEA7C18F419990C81C498A5AE8C06E2872EE305C7A52E058ECB5CACEEDC1FD8DFF00CE308A7FCE35FF00CE3C8F0FCB3F290FFB935AE67C3E91EE75D93EA3EF7B964983B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BD3BEC652C938B6FEF53FD6C89641399500ABE5526E090DF3B32B11D40C8F549E4C7AFDE4E31FE397439344905217668C78E644793584C2C406BA27F9475CAE4E4637A6796B49FAFD95DBA0E455AB94D5B951E4C7EF266B5BC6B775A50D304A2CC4D7C26EBD7496194C7E97C48D5EF985931B918B23EA0FCA5FCDFD5B48BEB6B6D4EF19AD9481F131A537F139833C4EDB06601FA51E59F3FF9775DB2B764950C8CA3910457F5E53C1C2EC6192DE8D0C7672422789AA08AED91B72E050F34C84A88C74FB59025BC6ED2C8DF3F0C899354A289496A8CBD2BDB21236CF0C50922D011E390A6E314BA4B22416A634D44255246633BF638D3021033905B7F0E996C5ACA0682B5C92AC734247E18AA8337BFCF1572B74FD78B594CEDA6A0A62D914EADE652462CC325B6605462D89B4282A3BD71668EE031558ED8AB68DD3C3155772A77C9AD2989950100E56534A46707A9C84969A1254D474CA8A40DD648F5539516D8A4B350354E5126F821258048390DC0CA26DF14B638945C71E5C4D3AE463CD728B8A6358E05E4641B75DF2C70F850ADAC5B16E0660BC4D6B5C9C53C0D4FE71D2ACA2224B95A8F7FEDCB578581EB3F9B1A3DAC4FC640C4D42D3C7EFC945B2029F38F9ABF379DE597D19DD63A9E95FEB926C7906A1F99CD71EA52E9AABD4127FAE2AC557F301DE46ADD356BE3FDB8AA656BE75BD915E4B79CB2A1A36FDFEFC8C9059D7947CED24B7F18BB6661C803D7FAE455F61F973CE960B68891EE0EED5F1C559347E6182E6752B106A9C55939B95940658F8823A64486A3CD0CEF5AFC19590E4C64A2FE9B2FA4C2866EDF2C9C22E0EAA5B3E40FF9CA7F308B7D046911BFC71A9F86BF3CCEC71793D61DDF9A864E681D8FC4D527375861E975929521B91AEDE399020E26492E33A13C5B7236CB40A68B4D2CE28A4EAB9600DA0BFB03FF009C6A017FE71CBF2000E83F2DFCAA07FDC22D73363C83AFC9F51F7BDB324C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85CD3C715A1EB94B24E228DC303B75A8C896514F44323C058D3EFCA8B70499EDCB24B5A647AA4F2492F638CAAFF91F6B2E87268925A5E07F8D2B48F63F4E6447935854B3E4B73327ED15247DD95C9C8C6FA0BF26AC66D5D2F6D22512486A287A6541C8E8C6FCFDA1A586A5710950B75093EA0ED936B32A79F192E1220A4D2A39291954A1698CD562D4A485158BB2C8A762329389CFC59DEF9E40FCD2BDD0960334F2B46E42F52694FA7313538A83B3D36A1F767917F3C6C350B782092EC06A00431A78660183B5C595F44693E60D3F558D7D39939103BF8E53214E7C260B295B66E21832303D286B94CB666775DE8488EA781A1F6C31DD944D35246EC6A23603B922992A64648A11A98B8820B569418D06B24062FABC2D683D4996887A531A6B25884B751B92C84D0F8E16050F57FB5514C285BEA57BEF8AA9B9F7F962AEE42837C5ACA2612716C8A3A17756152298B30CB2CE71C455B16C64115C28A55A9418B3470B943D0E2AE3206E877C55B57A0F7C5548CFC07C677C9B6D20649CB37C26801CACAAAC659B71D32125562DC76AEE72A2AB7983515DF2A2CA2955F3D15941F88D29944B937C1A8A4021F8CEF4CA26DF1631A9DD7A3C9D1A86B4C8C39B29724A9EEE49E3203354E58D54C4758B3D4562F5226DCB5363BE4E2B4C2A5D0754BE722494F1EF56396AD05A7C8B6654FD61CBB1EC7A64A2B4935E7E5C79767564907C4C3C324AC0F51FC93D2262CF6E7883526BB62A935B7E45D8FA9B9A927AE2ACCB4AFC83B510CCFEA705E42A323241677A0FE53E83A5C81A62A597C722AF51B0F2BE90CEA96BB1514A2F4C55153583E99708A895DF638AB2386FDFD3459051FC3034CB9A2D6E19876C8F0AF1D34D342CF1CA4F1FAA2B35D7CBAED9918A3BB81AAC9B3F327FE7257CD967AF79AEF2D74D9DA48E0E4AEAFB6E2BD33638F1BCDEA4D97C82C5D763D3B66E30C7D2EA66511000C4572DE4E24CA356D6126BFB44EF86D880C92C2CE20061E26F8C5FD757FCE3780BFF0038EFF90AA3A2FE5D79580FA349B5CCE87D21D764FA8FBDED19260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BB6F848AE52C9904352B5F0C896514D3D7E36C77CA8B704AE3943AC9BEF91EA93C921BBFB2FF004E5D0E4D124854D2198FF94BFAF2F8F2601358471B966F18FF0086424DF8DF5BFF00CE24D8A6A7E63B9B6715564634F7198F234E544585BF9F9E5A934FD775396342055B7FBB1136B9C1F3100C614E4370B96036D06C20E54F8078D72756DB09334D247FA1C629B9EF9467C761CCC597853D827BFD3254B8B6BE642A6A141CC09E27698350F58F2A7E73EBFA4DC470CF3B988951CABE14CC49E276F872BECDF23FE7858DD476EB3DD8694815527E5ED9893839A26FA16D3F306DEFE28A55911380A28AF5FC32318A99D2723CCC6F10233A229FDAC970A0E54AEEB5C834C9030BD578C8E4C6BDF1E16A395E4DE74FCD485A64B586753DB63FD98F0B039103A66BAD7D124BCEBCBC30726C89B4F45EB1A2F2DCE2CD1092357AE2A88F888EB8AA834850D3C31605562B923BE2CE2895B86AD6BD716613AB4BB7000AF5C5B03238AF8FC3BEF4C59A651DD934DFAE2A9925C57BE2A89593E1FA314C79A065763BD726DF4A22BD7E9CACAF0AAACC13BE424BC2E6B8AFC43B6545045209AFB8BF5CA8AC50571741DAA4F5CA64DF04BE7D43802AA731E6DF148E59BD77A3FD9AD4E461CD390D04F6CCD998C291BD32C71B8D4EE6D2240640BCD5B6E3FC72617898FB58A732E4045EF962F1A51A8CB688AA88FF001D77C9C59C656C3A7748E4E6D27C35AE49938EB9A728547DC8C55522D734F520C7154FCB154C63F30B49F0C44411FED29DAB91920A5375AAF2B9553217A9ED9157A77945B99568C1E05A8D5F1C559B798AC80B713AA0E406F8ABCDE3D44F221CD181A53080E3CCA6D1EA238F5C20346495060DF999E7087CAFE5C17AB2859EED1C15AEFD08CCCC31757A89D87E54F99EE6EB5CF30EA3A93312B2B311F4939B5C50D9D266365881B52546D999195075F38DABDB5A9EC3194DA2504F60B08D8AF8F7CACE4651C4CBAC3490C071E9E190395CA8627F58BFF38EE9E9FF00CE3F7E45C7FEFBFCBDF2C2FDDA55B0CDCE23708FB83A3CC2B24BDE5EC59635BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85884F361C76CAF8536C96DC111904D6A301816424D4A58C5C075A65462CC6441C41E1560CA5C9E80654765394525D76A423B31095ECD96E336D12CA18F05E69242AC0B484107B6C733230348134E0FC0EA6849910814F964278C86F84DF60FF00CE1AFA8BE6C997890CB5427B6F98594539D8657B3DBBFE720B44F56E352AA8320526BF40CC7E2A679214FCFAD422F413895A713C4E591CAE14F6485D8351286B5CCA84C14464F40D0A20D0C709A127BE3964006F88E264377A544A16AC797E19892C81CEC008418B78D5951D6BE04662642EDF164A099E9E2EED2E565B29CA1435A1398920E58D500F50B0FCCBD6A0F4E192770F0ECBC4ED4F7DB2996CCBF3024CDED7F37358E01259E4E245363FD991B41CAA7A97E61EA7771FA705CCD461B963FD98DB0F1187DA6A375A8DFA09E4919F97DAED8DB1337D27E58965B5B3854B971D70F0DB958A7419A457ACD2AB576F0C781B78D90C37CB51F153E79122990926B15CABAECE3E9C090B6491493DCF8E282143D555F1F962C86C8859EB4A57DB1640A696D24840DF167C4C82094556B5C53E204EA09169DF14F1A3A19949FB58A414DE27523ED8F962C816DD4788A0C9B68CA165630A41EB4D8E40848CA12C9E4E3FB5F3C810CB8D086E9551AB5395485053249E694B3F2076F0CA0C911507B8526B5E998F2986E8EC954D3879295CA8FA999CA229B69D6F1CF22ABF422A708853564D4090A6616FA65804AFC5CA985C7F1107776E2353E99A8EC3240AF88C3AFC4EA181A508E8327C6BE2306BCB3672F20635EA41CB319B6DC79186DFC7292CA49A65DC2DBE284858411732558B1E95C7857C5097FE9178643C5453DF1E14F8A11BF5DFAF71E6CD13A0A2F1E87E795CC5309660CAF42B41EAA34BFBDDF6AE52649196DEDBA3AC91C6A21554A374C1E2065C69DEB17D722C9A3908269D7263763E2878E3CB28B89030DEB52C3A53261C7C99022CDF47042D34AFC238FED13964604B87972BE3AFCEAF345C799357B8D2F4F98FD4ECA80723B1AD6B4CD861C6EAB3650F99E6B7BA8AF3882BE99D9877CD9E3141D5E49A0EE2DC076006C3265C594952DA2A76CAE450236CA34DB28E591405353D7316526F8637AF68BA242630596BB6527239718BFA78FC884117E47FE4D443611F91BCBAA07B0D32DC674FA7FEEE3EE1F73CBEA3FBD97BCFDEF56CB9A5D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF858B4FB432AE36EF0D94C1F6457A77C789061488210F4C89DD81539220637E0C15E9F0B7865660C244524D756F13A52693D47F019761C6E31905B67E5ABED43F756D68EAAFB89E9B0A66C61065198B425DE8B7BA7DD4114CFD036D95640E66220BEC4FF9C378DD7CE37019830E62A335D99D8E10017D63F9B7A7A6A3AB6A7005E47D36DBE8198526DCA6DF997E77B23A6EAD25AB0E2A0D7200D38138B07922A10C33271C9AC459B79526E573E9B7602992CC6C3958B67A75E5A7308CA3A8CC493B0C692359B89375DF28C8E6C792BD9C6E26238E63C925131C00CEC5C5083B644C6D946549998D5694C1C0CB8D1B1395E31815AEF8F02F1BD5FCABE5F49D16764F8BAE3C0BC4F5AD3A16810474D94ED86A9CAC4764E919B983F7E25B814DE201A8CCD4272A93644A690F1029C8E41B0146FAD40003B0C5928B4FEF8A559273F0D4F862A9A5B5DD286B8109DC57CA08DF0B105358F50403ED7CF16C051297B08228F8B3051E9A8A01B3F4E98B3B6CEAC4FED64896622B7F4913DF205988A067BD249F8B204B608A0FEB47725B6CAA6526282B8BC201A1CC599445269AF5FB5731E4DBD17DAFA93480F63928868996716303222B74DB2E1071AF74EA3770295230F84B6A53B32AF23BD71F097898EDED5C1F871F096D8D4F0121885EBD72CC71A6C81B63B77A6990310BB9AE5CDAC12FF4AB80CDC50D0F4C558EC9A3DE3BEC877F6C551B65A2DE8956B1B52BB653910636F54D134C962319910E6290D9183D46C42C7C05295DE980067253D7A655B76DFB665422E34CBC8AE2ED959C0FB3FCD968838939879279F7CD7E8594D630B9591C1008F7AE5F8E0E1E49BE6986D2E66B998CE4C8EC49673EF99D8F675D96492EA9A6709AA13BE65C4B8336373E9D234AD45EF84968E04759E8D2B015427299C9B61167BA2E84EAF1931F5CC6939110F67D1F4BE318F87B65326F8BFA35FC955E1F937F94A9FCBE4CD047DDA7419D5E9BFBA87B87DCF29A9FEF67EF3F7BD372E69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF855B670AC2A330CB984B2785D5A23C4EE46C300938D3C8037146EC0D640A57B1EA73271C6DC59E7013FD17CBB7FAEB98A106353D588EB9991D3B85A8D50112F59D1BF2CACE1557BF01993724E5F8F03A39768B3EB2B0D26C08B45317A454D401F16C3C732BC3D971F68BE7EFCC1D3E117D1DCDBB5631C8041D7BE60E78D3B9D2EB789F437FCE1B5928F37DC48C4A6FCAADEDDB35595DFE973F117D6DE76B8853CCBA848F19742AC38FDD98530EC4EEFCF4FCE7D0AE26D50DF5BC263889E5D3AF4DB292D5283C3230655657431B275AF7CB612A6A31A651E578C9BE1C5A94A65933619E30F7148792460EFB653273F1AF4B1ABB029C89E87C3289B9B16EDB4CFF004A3F0F5F6CC7924A3C6845A6E741D7A530C5814DA3F2DB4D4A2D3DE99246E9B59F955DAE230141A7B62BBBD7748D35ACA255DABE00615B2C9238C83C9969ED95973709D912B1FC4081F31912E48298C7C788D8E552660A2D08A743EF90660AA7A95D80E9D31656EE05BF6A98A6D772A7C35E9B62B6898A4E3D4D7145A244DDF9D315B442DD11D1B1640A3E1B84A8AB6F8B65A6D1DC42109A9E98B3077524BA534DFE5809724144FAE0A9A1A6DB6449660A02595BFDF832A25B0150FAD71DB9572B994CCEC8692E958D28731A4D112BE38BD42083D7B656D97B325D36D5415240F965D8E2D332CC15408C00287C732E107189B2B7E207ED5465BC010A95E638B0AE3C0150B2DB07E8B8F00543A699CF9D453C32328D3762431D138B54D18785320DE8693CBF0CE45502D3C7156E2F295B83560A47CB154CE0F2E598707D351C4F865536704CA6D16085032D001945365A47724C33A90A7805EA3C7271834E4C94C63CC5A8C0B6EDC9E840DF3371E375B9333C3755D61A4574B67F1ABE640C4E064CFBBC875ED367D4A61297F881DC9C988538F3C96A56DA488630CD1737237232D8871A52B492FF00449A798BAC3B78658254D2425FFE1E666DE2A1F9644CD90C6C86C3CBDC40AC5DBC321C4D831B38D3F468D387EEF7A6F9592D822CEAD2C5234038819596603F7D7F27871FCA4FCAD5F0F286883FE9C21CEAB4FF00DD47DC3EE792D4FF007B3F79FBDE8D9734BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF84F5A9238F5CAA50699EA135805C2D19413C7A0F1CA841D7E5D4BD77C9FE4C9F5955BAB9531A36FB8A7F0CDAE9B15BABCBABA7B25BC363E568B8428AD2D3E13B75CDC474FE975F9B54642929D43CD1733551578D7C3251C4EA660B1C79EEA4E530908600D30CE1B231715A437D65F5A82269F76DFAE6A75317A5D04097D2BFF38A5603FC513C69B50F519A5C8F59A4818BDF3F32C8B6D7EE550D4EF503E8CC4C8EDA06DE35E6CD274ED634C8E1745F5C2F2DC6FDB31645BC45F0F79C3499F4CD4E482088842DD40C6326A9C55BCB703DBDDC25B66722B97036C22FA334EB45963889EE06093998D91DB69F1FA87E1AE5191CD8F245DB5845F5ADD46512E6929EC1A746D253877F0C8DD2631B66365A3C2101283071B2E0641A7E9B6AB2F22A0536C7897813496D944AA517E11D71E35E0463C28C415E94186DB63B2E580602DA0AA88B88F6F0CAA4DA0B74A641902A65A84D3164D09A9D7155F50686BD77C55DCC0DB90C554DA6A54F2C516A26EE9D1B16C06D552F883F6B0330518BA937F37E3859834AE97F4FDACAC96C1345AEA15523976C812CC4D4DAF474E5BE544B671A88B82CD4E5D72124CA7B2AAB0E42A7BE504B18B23B331FC3B8C039B6B27B39A35A6F9978A2D190A73F5D8F8D2BBF6CCBAA71495CB728DB636BC4ACB301B8F9636BC498DB3ABF518DAF126255154103AE4265C8C25AA467ED0CADC97048491B0C5556910EE31550692256A823DF2B9ADD216EEF23E34AE5643194D846AFA82420B33058E952C72EC637703365781F99FCDF662678397A8A4D0919B2C7074D9B3BCEE7D5EC0C9584D10EFF004E6588389E2DAFB7F4AF4811906B80C11C68897479C39A3D01E8BE19514A9FE8B71F69B204A695974DA007803EF4CA8C9CA84764C6DED78EDC0636CF85905B45180BF08069BE368213650028A0FA3157EEEFE50FFE4A6FCAFF00FC04B44FFA80873A8D3FF771F70FB9E4753FDECFFAC7EF7A265CD0EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85F8ECA6827585979C84FD919084FC474B9674F6CF29F906F35036D773218A18D833A95FB437DB719B1C3A1E274FA8D43DA2E0C763686D6D2216DC06CE3BE6D30E8F81D5CF2F11610F34D76CEB212EC8767CCC3300535006ED2AB986E56455F4CB03FB54CC7F1699CB7539675B32AB335030DEBB532B9E76EC1877633ABEBD05BC4817E3095DEBE39AFCDEA7A8D0E301F49FFCE3379B34BD275C3753CAABF58466DC81C4F875CD5E6C342DE931914F72F3ADEC17BACC9A94171F5A4B9DFD21FB35CD7CE36E44254F2DD5E40F74AC253188D3E28FDB31A78CB951C8F3BD4BCA69E67B826C23334CBD471FEC395F0D322049E6DA8F93752D03518E4BC89E28D5BEC95207DF4C2254C6389EA9A33F3B58E48979851B8C4CDC884699569EEACE6BD5FF000CA652722324EBD158255940E61BB6545927D6AB1D43EDBEE47865728DB644D32A8A7884600F0C1C0CC4ADAFAC952283BE3C0DD18DB27B39964B73CA3DE9F6B1E06C186DD1A90A6A77A9C9C62D528515707AED84848D950380A2A37CAA41902A4CC7B0FA3214CC490EC549353438190921A42AB53CB14F1297390814AD3B62B6A2C66F7EB8ADA8BCAE2B5E98AD201E46AFDBA62C97FAE07FBB2A7BE2CB89DF5C03ABD0F8E02CB8DB5BFE34F8ABF4E506569051B1DF7203E2C896C89561755FDBC8D3305556E7810FCAB4ED8382D24A252ECBB57A7D39138523252716B7C626525B901DB11869978CC9ACEFD64A7C5C72F87A5AE53B4DE394935E5B53AE5BC77B35108B8EE82903957DF229114CEDEE62E5566E43C3DF1663127705DC0A2B8B3181305D460208A74F7C05B618F854A4BF87C46001B2D06DA8C6BBF2FA3088ADA1A4D622029CFF001C9702DA17F4AC4C681BE23D05729CB1A5AB405CDD731BBF0F01918C2DC7C9B3C4BF35FCCF268FA60B6B78DEE2F27158E34AF434DEA332F1E3751A8C8AFF00959F947A8F9D3433AAEA90B5BFAA2A3983B75F119B1C717499A565BD67FE71E6F9B549EC74CD4B9F04E6005EE7B74CCC842C38E254C2A7FCA7F39795E57730C9731C7D5829FE991941B23240C3785A76B4BD06DEE22DA507B6634E0E4455269E35902A2FAA9DE40731CC5B8056F5410027D9FD939518B9319505E8CE36AE222C84938B13CC8A8E9D708091BA7885760570A781FBABF947FF0092A3F2C7FF00013D17FEA061CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8797343B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D2F23F91A57BA4BFD6D6BC0D68D99B874D4F199B556F6FBFF00315959471D8E9F1AA0A7024019B9C18F85D466CD6C59E49EF25615E4332A52A0D50DCB2DF2D6856B70C52551CE43DF31324DCEC38B88D3D353C81A7CB0F32AB551E03FA663193B0FCA3E7DFCCDF2B2E9FEABC7B2C7E1F4E53293938B4F4F9C6F56297D485DF7198E64EDB4F0E146E83AFDC797196E2DE46AA9A00091D7E9CC6CDB876719D3DDBCB3F9BD24F2C31DE0DA94AB1FEA7308C1B0667B4D94D69ACB0BD12208D97E3151D3289636F8657A07911B4F7D723B3D2E146909A39DB7CC738DBE395EB1F997F96F6BAE687305B355D42DA332D55454D47B0C8F03938A76F86AD6E6EFCB17173A65F42C9F1955E429DF0183920B2BB7BC4616F2C5B16DDC65660CC165F14EB3463B9032071B30532B566E2C3B83B65538D1499526D019BBD6990E16719A6917C5DBA63C2DF19A6D6F7CB1008C7E8C785BE395344BA420107AE061396E881329C892A0DAD663C8D0ED9592CC054571DF2BB6C017F2B7FDA1BF7C2A8599ADE876DBBE2A82372A361D3A0C5541AE7155295D4AD477C52934EC6BB6D8AA0C87F138AA8307DB7380A43AAD502BB7865062DA0A3E1269D7A60A6C0510A5BF98E34D80ABA3316515F98C69369846687AE16B4C2075322A96D8F7C55328A7F498156AD31564767AA23108EDDB08544B5EC55DA4FC724C81444378A5A9EA7BF5C2CC14C92F401F6F6F9E06C1277E9458EB593AEC37C84CB6715A849AC27412F4F7C8829421D6A25AF292BE1BE580AA026D6226DC3FE39602A841AA52B2C64B329A0032AC82DC5CF9B81E8FA0797EFF00CC36DF582AC8AA3AD30C62E064D45B23D2FF002E746D666FABEB1682EAEE27FDDB915A27874CCCC61C0CB2B7BEC5E5C8B43F2FBD969AA96E889B050053F01997034E0CE16C3BC93A446D35E6A37975CAECB32853E03A665C25B38C63BA6F3C3CEDB526BEB5496201B83151EFED82526710F942FF00F2B62F34EABAAEA1631FA2F393450294A57DB31E45C8807897983488FC97713E9FA8CA1A624844277CA0B7C52BB760F0C4E05030A819590C81A45AF5C14CC14D74F6F888F0C7859829D237C58D3305FBB9F945FF0092A3F2C3FF00012D17FEA021CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8796B43B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF911B5D4CA4450905BBAE74F1C603E6D3B48AE67FACCEA900FDE16A6D9682038A626D9EF97B49957795D99CFEC9195CE6E660C6F47B1B58EC87AAF540BB961D4661CE4EE74B87D4191C5AFAAC65616692836E5B65066EFC600F1FF3E4D71AB45708F1045607E21F4E5329B64703E3BD62C6EECB539792FEE8B1F88FCF31CCDB04292D9AE9C158E18C484915AE57C56C8DA31A49596358E416F21EA54E44840059C68FE69D574B44824D51BD24151F16E7D8E63C837C6DEEDF96BF9A30697AC437F733A5B98C8A9E5D7E798F272216FBDBC9DF9E9E4FD7AF7EAF7B7111F56309212474C003978362F14FCFAD33C9F3EA31DFE8572B34929E46314A54D7C301736DE23636377C39471820F5F6C8101B0499559B2DBA8F59E847619590CC14FAC751B37996105CB374DB6CA671B613932D59618940988453D0F7C8F0A04D136CD6F2352390BA9FDA1BEFE18385B064A593E9D74D30689498C9DD8E3C2CC66461E76A80354A81BB65538EE9F15B87528DDB846416F0272B316C8E54DE3BC454025A06EF4CACC5C98E45296FE05DD4B37B5321C0DE24BA2BC570095007BF5C8B0326E59EDE9BB004E28B4B5E48F7A1A8C56D41A44DF7C56D45A4DB167C482797AEC315E24135C76A62BC4A06E0D7A75C4A89287AB43D72921B414545734A53E9C785B01B45ADC8F1C785982AE2E42D0D7A74C14C89D95D2EEA2B5DF035DAAADD92C17953DF15B4CE0BB006EDCBDF15B44BCE78F247A3FB6109050E2EEE01FB44FD392664A69697B329A93DB147123FF4A3014240FA71533A434FA846D148EF394310AA81DF018DB28654A6E3518B9DBAC324B2198D1CD3A60106CF142A299A4BC92D622F2040086237DF2622BE28651A77947CC5A9C4F35BD83945E8C4102996082F881EB3E4EFCA9BD9D44FA8388EA7918FE5898BAAD7E4DDF4559E9967A26872A40024C828A0EC09C9083AFE3280F24DBDEACF7535F5BA2C8EC5A075DFE1DE997C4522ED966AD33DA5A4934D2963312A213D299785E152D23CBF696D62D3ABB191FF007A2BDCB76CB449A670DD4BCD4C2CF402DC4249715529F3DAB80C944698D7953405B5B06BB9A61140D1C923CDFB5D2BD32B25980FCBFF003D4B379FFF003D6EF4486FCC7A769D39ACAA7ED509EB9021982FA1F54FC9D96DF4DB7BFD27525BB9258C39B52C28BB0D85322907778AEA52AE8F70D677C443780D046761F7E2C814CEC599516534A30AEDD30365A6515E425FE26A7B61676FDE9FCA021BF297F2B997756F28E8841F63610E74783FBB8FB87DCF21A9FEF67FD63F7BD172D68762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EF578F9B5C06FDDBF4CE9B8DE267A6651E54D1967BAFADC9BA72AAE552C8E29C1BBD62DE25826E4AB45AE56656E6E0C28FB8B9068427241F697C72B9F276F871F0EE94C97B4256184257314C9D96395B10D522BB9CC8D23058687965129399116F07F30E857BACDF35B58446572D4F8728949651A4E34BFC8DF335FC6918B3912693756A76FBF2B126118D966FA67FCE2079E3569D2425E28DBA7F9F2C4C9C918596BFF00CE13F9AA29D1E5BD255853896E9FF0D944A4DD0C4CC2CBFE706B5A9E359DB5858C2EECBCFF00E6ECA2526F8E265563FF0038CDA7E8171691DF7994594A8F4F50494E4476EB91126D11E17A95A7E487956EAE62177E6E597881D6407F8E032660A7179F957E4CD35D2DE1F32C444A28C798DA995993602A69F929E539E932F9A6293BF0120C812D82491F987F2C348D2EDBEB1A7EAA048836F886E7EFC46ED3964C33FE55FF009A2FECCDDDAAFD7517A01BFF001C970B57131F6D13CF3A6481DB4B6B5B68FED02A454F8E3C28F11136DE77BCB598417D6E4229A31A634BE2338B4D6B48D6A25442179EC6BE380C2D81CD45BBAF28385F5EC65A93B8A1C81C6DF0CC92CBA4EB91A13E9B3D3BE40E37331E54BCCDA9DAB7EF6D0923DB2BF0DCA8CD53F48A85E722346C7ED2F8661CC516CBB516D4ED5BED311F3C82AFFAEC741C5B63D3E58AA8B5E27F362AA2FA82F4AEC3BE2D96817BF5AF5DBBE29B59F5A88FED62B6DFAF19EF8A82A2648EBF6BAE45B42BC6CB4FB5BE1640AB2B8DB7C0D815B92D3AD70164AD1B0A75CA9AD7F2DC50EF8551D0135A5715477A8513956BBD310CA3CD6FD61BAD324CCA9BDF49F663EB8B548A3ED2C750BFA705635F0C5ACC99E795BF2D359D7F538AD591845506507C0FD396E38DB0964A7D476DF933A0D959033C4867812AEC7B6DF3CBBC363E2A47A4F937C9BA5DEDDEABA95DC29145BF027AF1FF006B2C18D7C5629E7CFF009C98F23796F4ABBD13CB56714B76A0A0950577029E1ED93F0D7C57937E5BFE746B779ACC375AC4AD0E9CC4B70EDC6BF2C84E14E3E63C6FAAB53FCD9F25F9AEDA0D1F43981BDA8590AF5AF7ED80069E07B5E83A3AD8E9B6019FD4927456E47B03DB260278588F9D0BDE6AB67A65BF660580C902ACD043E8C3A7C1D2A02B8F96264C4861FF00987FE997DA7E996FD178F35191E2470A335A8DA0F265F5869B66D3EA4B6CCA0815DD908C921F9C3F96FE439FCB3E7ED77CC1E77D224852EE6768DCA6F424FB9C3487D831793349D5EC21D5BCBBADB441E3E6D64ED4E1ED4C348B7E587FCE45F9ADF47F3B0D3667A346FC5A64F6A60E1660A1FCA5F98F1DD086D6693F771A84563DC78E34D80D3DA2CEEF4FBD50F1CC391F7C69982FE81FF26E83F287F2A829A81E4FD0E87DBF47C19D061FEEE3EE0F25A9FEF67EF3F7BD232C69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8BED12FA6D457F46FA12ADBC7F626A7C47E6736E72BCD5193DAFCA1772C114D67796EF4894FD51E31D5BB72F6C899A63A6B6609AB5DA32C37B6E2DD587C2E452BF2C78DCDC5A4012093CFBA5D95C5C4123AA9B7157693A7EAC13C9B39630D30CD5FF003318397B28A39E2ECD18AFF0CC4326D863A62B73E79D575085C4517A61F6F886DFAB29949CC807D51FF38D7F96B36BF24BE60D7A33C62F8E30BF64F43BEF98F29378C40BEE7D22C74E69E9269D0C76D07C10CB1AD18BF45AFB655C4CBC1E1DD9E8BFB58ED1ED0C421BF857933462881478E266DF8E16F93FCD9F9B3A89F3543E5DD06E92E5E7904370EC6BC2BD48DB2894DCD86114C9FCEFA4EB5E4DF2D0D6EE7CD33CD77749CA3B3864DAA7B5331A536C38E9E45E5CFCBEF30F9C746D43CE7E64D66E20B0B2532DB425E858FB0C89C94C463B64BF967F973179E359223BABDB6D26DEBEBDD31A6CBE06A32072527C17977E75585B796FCC53E81E54B9BBD4A68BE15773C8F2DC640E56DC7A7B286FCAFF002B79ECCC351D62C6F9A0421B801F0F1EB959CAEC31767F13E9997F303F2DADECC68BE67D3A6B4BB20707028DB6C4E1198863A8ECDA28BB3F307935EDBD0F2EEBB25AA1FB2B2BD313A92D3FC9A82D7B509BF41DC2C9AADB5F475256456ABFCB251CE4B4E4ECFE17805ADC68374F7306A7693F224F0940D8E644276EB3361314A5FCB71DB96BED36F0C31F22521734232F0C2386C59661A17994D9010DE5D212BB75C90882931A7AE681AF68FAB442DD6E22172B5E418ED919419C7210C953CBDA4EA2A566A7ADFB253ECE63CB6726398B18D47F2CE695A4789223131AA377A7DF98192365CC86434C1755FCB7B8B552CB1866F0EDFAF2A316CE379BDEE87A8DB170B6D29E269D36FA3234C81481A3BD462258245A7B645210F34BE98F8C1030B7525C6F2035058838B3115212F03591CFB53148802A6DA8C6845198E2C8E20022A1BB59A95241F6C5AC48A3967229C6B4F138B30510B73D37E98B74510B703ECD7AE03BA65B045070AB50D91E171BC42AA92EC64AEEB9131489A36DAEC3380DB0F118084892266BD759111006889DEBD71886C81DD1F0992E18C50C4657A7C210572CE16D243D3BC97F957AF798E482792310C524A1645E8426FBF5EB8F0B8D393EB1D1FF002374CD2AD24B8FACC8B2409CBF7A76247D38F0B8D29A0B4DF33689E5E3793CF730C571A7D79F134A8197618B10789E11F993FF003955A5E97697F6FA0A9BABC98323B49BA8EA36F87325AE669F188F3B7E6079FAF9ADAD2F561B59FD46B94534201A9006C3C70DB8E7290C5B4AD3E1D275392DB592F717334A03C8FBF53DB27C69194BEACF2AF93E2D6E1161A2A492974A3B36FC411DB2B99B6C8CDED5F941F9172796BCC4FA84AD2CE8CFCA6F537E277E9BE56CF8EDF74C691C2A8109E1025501F6C3652082F3BB1AEA1E6A7BCA739223C78FECED8DA683D06F1115A198578A312DEC72F8C0485A90180C006AFE6C9243F14708DA982500189A66B1C4F1488518AA4B5E5F25CAA52A6069E4DE67B48BCC7E67B6D2DADD25B585C7AEC07C54077CABC621AF64279ABF2B6EF4DD2B5AD5741BE6B484216823534A0A0EBBE4865B6C1005F879F9B02E6E7CD9A80D61E3BA9E1958073B9DB26269E00F3089B568627BAD3D12358E4A1E636E3ED960368D83D2B43F3C4F63259C11C9CE5968272DF641EF4DB274178807F551F9093B5D7E45FE4BDD350B5CF913CB92B11D2AFA65BB7F1CDEE1FA23EE0F2DA8DF2CBDE7EF7ACE58D2EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90FF00CB7F20CFABEB70F9784FE9BBB0569CD76FA727E3B8A3474FD1DD03F23BF2F3C93A589BCC5E60B79AEDE3E4119F707EFF007C7C76C8E969F1C7FCE4679DBCA97925BE9BE5331C6DA651649E3E8DC698F8EDF1C34F985743D435AB73A95C5AB244568B514F57DBDF01CEC8E34D74AFCB3F36EB344B1B65B6B63FB4C074FBF29395022CB74FFC91D5CEA169646F0CB792B82B02D6868457299657271C5FAB7F90DF96FA8695E588AC2E2331968C027E81941CAE6460F7693CA361A1E8F705C896E5DC145EFCBB1CA8E46E10BD9F397E76FE60587923CA7269D6404DE66D67F72186EC81E9BE0395C8861A60BF911F93BA0E956D75E74F38EA0B3DC5CC06ED8B36E8C6BB75CC79657371E36216F637DF9B9F9A52D868F792CBE5AD35E9287354A2FDDE198F2CACE589ED7E70F2C5C6B0963E42F2E5C1B68B4F939DEBC6688E0F63959CAD4715259E7AF3EE89F933F97B37956C5565F325C2141243F6F930237A57227236E3C5C4F19FC99FC9EF3579E357B2F3B7982E85BDACF299409BAB2F20DEDE390395DBE97476FA57F323F30348FCBD8C68F62F6D3B88F837115DC0A7BF8656723D0E9B40F813CDFACB79A75A6BE9E0145242328E80E0F11CC9F65F131F9AC2248F925F4B6EDE08D4C81CAC4F6481D1434AB8BFB2BB8A73AACD71A746F59A177AD4F7C9C32BAFD4F66D07D412F9D7C87AC79623B2D3ECA38F5644A34B415E599B8F23CE6A7414F0F3A6EAF7777248B3B95AD16253B53E599D8E6E8F2E1E03499E9BE5C56BD53AB192DE2247276DB2F127127165D7FA0E8F0317F2EEA85EF1002C8ADB93E18CA4D6229B7953F33A6D26F5346D6AD65424F1FACB0FA3AD330E72722117D2D63AAD9DEDB42F6B79CD5D4155AE634B9B971E48AF5AD89E372BCD7C72B219A1DACF4FB9E4A6C57813B371EA3C72B21B2293DE792B49BB25BD08D49F6FEDC810CC3CE75CFCAFB296390C4A2B534A7FB78B787916A1F965240EFC54D05698B6061D7DE50D42353FBB240E9F462CC31B974CB8B7E4B25B9AF8D31672E4848D2584EE87171AB74D61B9A8E25295D89C5B150951DF1640B4B28A80A773DB14CCEC9AC658A0DF22E2A3ED62326C7A1AE34B68D58A15824653F18E831E15B645E43F296A9E67D5E1B75899A194D2B966385948C9C2FB83CAFF0092FA779295353D5A2170654E410EF4AFD3991E1A0E77A4E82DA4699F5ED6AE255B3D3ADE3630C55A55C7418F86D32CCF3DD5BF33AE7CE574749D20496F6ECDE9B4E36047CE98F84E34B23CEBCF1A3792FCA7A1EA926BBAA97BEBD80FA4BCF7E743D725185328647E5DEBFA8C32EA57C2CE212DA991B8B91534AE4A98E4928F9735ABDD1EF0DD69B251CAB7A918F9634E29927A350BBF32B5ACB1DBB3DFB5C207A0DFED634CA2FD64FC8CF29C1E5EF2B0D66F63A5CC9081F17662A3010D8F77F23D85DCB6FA9DE5CC815667261AF8646922D3CD6EEC69D62189A168F8D7DF1A6C8DA43E4EB4FAB9B9D4661B4D5E24FBE34CF74E755BCFABE8B3C8C68ECEDC7E9E9878E934520F29DB1B2824D4E71BDC92149F7CAE5918905956A139B4B19A73B7D514927FD615CA253B6B312C23C8F6AD35FDFEB972B54B824424FBE5129313128BFCC0FD23079435716F2B969636A460F4DB2D8DD391189E17E06F9FFCB7AE0F34EA9A85FD94CD01998F220D2996C4B0902C7749D26F7CCD7834686136494AA9229C865824E348909B47E4F86CB506D288E57711A09325C6E399C83FAA2FF9C7E80DB7E437E495B375B7F20F96E33F34D2ED87F0CE9307F771F70FB9D2E5DE67DE5EBB96B0762AEC55D8AAC7DC7D38AA9D0E2AEA1C55D438ABA8715750E2AEA1C55D438AAFC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF233CB9FF0038C3E4DF2ADCBEB13B133D0B1911C0CC3B2E7ECFCE5FF9C95D5A6B1F346A1A7E95AB4E6C625612C5CC96E229B03DB1B29A0F89DEDDEF00926B97974FF5394909AFAA47BB63653C2FA87CC9AF797F56F2279774DD25D34B4D3A86707FBD6A0A751BE365061B337FC8DF2C5E79C752B7D26D6F2E0CAEEA11B937122A32B258460FD2CD3FF27FCBDE569F47B4B9B432EAF28065BC6DF8F427299172618DF40456B6BA6D9C16FA4C4102A51E4661D69EE72891A732106272C4F737978F79C94DADBC970B272AA1F4C578D077395D972B1E3DDF9E76B6317E6E7E6FDCDAEA08F69636B318F8CA7ED509FB35F96425272B829F42FE69F927CBDF977E4FBCB5B1FAE896F63315A4924C4A7A8694A0F0DF28916D8079F7E5DDB5EF907C986636E96B7BAC9ACD7DC6878B03D0E512939118A6307E6459E97A6DCD968086FF00CD3316F4EE07C67936DBD2A72B2594B0DBCCBCB9F94BE65F327999FCDDE78B1B8BA4327A932C95E0141AEC08DB2264E4E9F4FBBD4FCFBF9ABE57F2AE8F0E81E52E7677F0A18E242F550D420EC32B26DE8F498007C75AEDF5D6B378B7DADDCB4D7B292CBBEDD7C32B327A0C31012DFADC21FEAF343EABAED118C5283DF07139825174B3C0842B583B13D2B91254CE285BAB580C5EAADAB41714FB1FB253C699289759AA31AD93BF21FE5BF997CF5AA25B7942D9E390B52E6465257DE9B6676393CB6AA9FA0BF97DFF0038C4BE5FB186E7CD3299AF1497996BFC33618E5B3CA6B620CB646F9AFF0025F45F3497D3AC6330A8F843A6C7C3AE64893AE9C5E7FE59FF009C4B6F2E6BEFA88BA9E78B90608EE5878F4C12935883D1FCE5F91FA16B366919822B5BC450A27550A6B4CC49CB7722317CD97FE5DF30FE5DDECA90C72EAB696CD44F4EA683000D8F40F2E79AEC35E884733AD9DD746B7907C55FA7010CD983EA0F1AFA3C1404F85180EB9590D812B7FADCADCBD6F84F4036C810C834F248AB406BDB7CADBD21BA53293CD41C5B42552E936F221AA038B20C2B54F2BC3217A44BB83DB16C3BBCCF54F2A4B17F751803E58B5F0B13B9D1E5B706AB4FA314243346F1FDA53BF4C50A5146DC838041076C0589927F096E03236C0A6F6C582FC3D7FCEB931BB548A3A0D2A6BABC820B40CC2660251D7AE5A22D7C4FD0BFC98F24E95A1E9D6B7A2D985F08F90673515A7865F8A3BB4CF23D4FCD9E6780AC36D247CE78E3ACC3F6683AED99341C7F11F21DDF9E17CF3E61BCF275ADF243A7D94865BB8D0856A0EA2B5F6C691E25BD5935BFCBEF2569062B7A34F0A7266EADCBFD6C683025F9C1F9BBF987A879ABCC37C25AAE903E1B5727627C0602144A9E07E85AB1755670AC4D77C1C2C2791D64B67A6DC898BB2CBB8849355DFAD463C2D5C56FA7FF00203CAB16AFAF433BBC73C664570817DC1C785BE127EA25D4634ED0934E0BC04DC5828DBA0ED9121CDC401E6CF7CB6D0268F089CBAB2814A1A7DF829BC4425FE6C65BF8AD6D636E3561C877E38D331009F689666F74B92DE195614B215766F6C69B0462C1FCF9AFE876D2C3A341AA4308545370ECC0EE7AF7CC79C776C1008D7F39FE5FDA687656D77E64B5630D0944700D7DF7CACC14C22C4BCD5F9C5E4792D27B1D3F5980FD6C2ADC55813F08A0A6FB640E32D6718653E49F37F93EEB4286C1756817D221A3F8C035EBBEF90F08B0F0C273AE79A34C3A7CF099619CCBB2B5410C3DB7CC8863A0E44202980CDF92FE44F3BE963EBBA72FD6AF3ED3A902B5C3C0C258C3E78F3E7FCE23685A523EB9E5EBAFAB6A963FBB823076A2F4040EB83869C69E10F9423FC92F3C4BE66FAC49A6CB33C8D46B8553C4FE18971CE9EDFD0E7E5058CFA67E52FE5769B72A52E74EF28E896D7087A8786C21461F78CE9F4FFDD47DC3EE797D40AC921E67EF7A2E5CD4EC55D8ABB1568FBE2AD547862AEA8F0C55D51E18ABAA3C3157547862AEA8F0C55D51E18AADC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF30EE7FE3932FFBDDF60FF7998EE4BF25BF357FE537D53FE39BFB5FEF6F5EDD716D0F1497FDDBFF001C5EA7FB9E98B745253FDFDAFF00BC7FDE0FEFBFB9EBDF23264793F4DFFE7143FE3BBA67FC707A2FFBC7FDE74194B18BF42B56FF0094853EC7D8FF0077F5E9FB194CDCA83C8BCEFF0061BFE521FB5FF1E7F63A9E9ED98F272E09DF927FDE49BEDFFBCB27FBDFFDEFFB2FE3953938DF1A59FF00E4EBB4FB1FEF50FF00783FBAEA7EDE464DF27D01FF00395FFF001CEF2EFDAFEF63FF008C1DBAFBE53258F3625F985FF92AB47EBFDCAFFBCDF6BA663C9CDC6F00FF009C69FF0094FA7FEE7ED0FF008EAFCFB65679B9717EA37997FE51BD43FDE3FF00799BFDE4E9F64F4C94F936E93EB7E3179D7FE531BAEBFEF43FF7DFEB9E998E5E9B4FC921BDFF008EDDB74E9FEEEFB1959E4EC23C936D3BFE3A375FEF1FDB1D3E5DB029F8ABEB3FDF27D8FF009E790973627E2AB17FBD717F75FDC8FF007A7EC7D39383AFD47C5FA1DFF389BD2EBFE385D0FF00BC3FDF77EB99F89E675DC8F37D49AFFF007D71FDF743F6FECE6645D066E6C5344FF7A24FEE3AFECFDBEB99117124CCAD3FBE7FB5FECFA60C9C9AC3CD3CF1F69BEDF5FF0075FD398736F8BCA74FFF00A587FBC7DFFE3A19747E9497CB7AEFFCA552FF00BCDF6FFE95B80A43D7A1FF00792DFF00BCFEEC7F7DD722DB1504FB67EDFD1959641565E9DF2A2DE12997ED606D0843F4E2C825571D5BED7D38B6B12BFF00DAFB3FECB14179F6ADF6BFDD78B51611A8F5FF00757D18B192017FBB3F67A603C9804543FDD8C805926D69DF2E8B44F9BD2FC89FF1D6B7FEEBED8FEF7E797C5A25CDFA15E5BFF8E6DA75EA9FDD7D1F865F071F27262BE69FF8EB6A5F6BFDE47EBFC32E71DF97FE4FFF00C995E66FF7BFFDEC93FBBFB7F4FF00938ABEC7BDFF00943F52FF008E77F70DFEF47F7FF47BE2AFCCCD7FFDEDBBFF007A3FBF7FB7F63FD8E1632E4C6A3FB4DF6FE8C0D3245C3FDD5C74EDFDEF5FF638583EDFFF009C50FF008E9C5FDCFDA5FB5D7A8C0E4C1FA41E6DFEFB48FB3FDCF7FB3909399064D63FF1CF8BFBBE9FB3D320DC3E2C67CC5FF1D0B0FB7F647F77FC71671F8A62DFF28CEB5FEF67F74DFEF07F7BF4E167F37E67FE65FF00C746F7FE526E9FEEDFB5903CDBA3F178737D97FF008EDFFCF6EB8127E2952FF7FF00F4B5EBDFAE2D72F8BD3FCA9F6D7FE526E9FF001EFF006708607E2FA3EDBFDE1D1FFE523E8BFDFF004FF65930DD1E5D5F5BF977FDE0D27FDEFF00B2BFDD7DAFA72054A7FE6EFF007960FF007B3A8EBF47DAC816324FB4DFF8E7D97FC733A0FB5FDEF4EF902C1F62796FFE51ED07ECFF00C73AD7ECFD9FEE57A7B674DA7FEEE3EE1F73C7EABFBD9FF58FDE9D65AD0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD9, '1', '2021-03-13 12:29:10', '1', '2021-03-13 12:29:10', b'0', 0); -INSERT INTO `inf_file` VALUES ('9a2317ba-fa4c-4f77-84b4-7cc537d382df', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F0000010402030101000000000000000000000405060702030108090A0BFFC400511000010302040305040804040404040309010203110421000506311241510713226171088191A1091432B1C1D1E1F015234252162462F1335392D20A4372A2253482E218356317192655648393A3B2FFC4001E0100010403010101000000000000000000000304050601020708090AFFC4004A1100010204040306050303030302030607010211000321310405415112617106138191A1F00722B1C1D11432E10842F115235233629272A20924E21617344382C2D225354463B2F2FFDA000C03010002110311003F00FCFF00F041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C10418208FD87B813D3E67F3C7788F3FC6E69363C22D6FDDF0411BB815D3E63F3C104286410153D460823760820C10418208E4027618208E7815D3E63F3C1041C0AE9F31F9E0820E0574F98FCF04119A10A936E5D479608525EBE1F78DBC0AE9F31F9E08520E0574F98FCF0410702BA7CC7E78208DADA0999B6DE7F8E08236F77E7F2FD70410777E7F2FD70410777E7F2FD704118A93C317999C10CF13AFBFF008C638219C72013B608232E03D47CFF002C1046694F0CCF38FDFCF094D4158006875877214CC4D4FD59E32C6132985EBAD1DBC7E9189A1DBE576B559DD9FA7DE0C2D0D1724AAA4545ABF8AC18553348A7AD1FC695F7ADF44E1946C9F53F76F5BC6C473F76174E33BB4F03024EB57AF9368DA3830E51803308511C2536ABBB6EC6FE9D1A366135E0FBF1DE92CDF335347DDEE075873FAB3873DD005AC29CB7F4D6B780E5F4D5A851A8FB2D5C6FCFDE363F973C309B988C092848E23661A353F0E1FEF1B1CBBF5AEA52806AD7954F9B1B391E70DFF567A9D7C397282190654A510010227ED1F523D3E3A0CBA7F68FE44CB50E2F95D8D8BEBB6EFE908AB3AC2766471AE623E4A8721E9CB4B73D7AC467586B5D2BA4A851555F54D2B3108594242AE1691B7849036DA2498EB6BC763FE0E62FBF335285B02145D07567AB3373E839C707F8B3F13F099FCB1290B41E0052E143F8D47E2EF1E7E769BDBC67DABAADECBA8415508529008E12384980678418B58EC46F7DFD51D8BEC1E2B2C54A331040053420A6D4D5DB4616EB78F1AF6AB1E8C5266709A17DA8E49ADFDF98A15D4F1A96E288FAC39726D6264FDE7974E5B63D138341C3C89686F942403B1259FA01BF3146BF11C561D4AC41535D46ACE2E3416D980B78C33F7B56CB87BCF13677208B0B58013EFE77E5BE1D4FC4E164A0103E602A5EA0F46E9EB5B45932826536F4DD9C352D4F3D2FB3D52AD755FC9CB69D6AA85405AE080831637111067A72BE2B38BCC82D570DD5DBF34FB545E26B329A26A101DC0DBCB6D7DF296D2692FAB2135D9FD5200FB41B252088822E08322C6FCFA5F112BC5898E259248B9B01B6DC8F3B5AF09DD10CA04B0BDBDDFCB5768E2B75F6579237F56CBC0EEC82952B8ACBE1B022790F58E57DB0B48C089EB97C60A9BF6D051CF2BDFD0738CF0B7ED2DBEBF58A8B526BFF00AE05C41924CCDE6E6F620C5C7A82011CBA064F952259494A49B3DC57AFD1875DE32C5EF4D9B4FE7E914E669A892E9971405D51B73DE4FF00B8169E78BD48CAC2C070C031353E0C4FBBD214960D6BEFA7D2AFD5CC57B9BE76C282A48264F31F388F2C5830A8561C0094150029CEB5B3D2FEE90B02458C5659CE748414107884AB8960CF0743CC103623167CBE79596EE94016DFA3DBC474D602A56FABFBB539443ABB50B652A4B55A16A0090D94F09932624F43E9E98B127284E3903893DDCB7625C9A1A3B5F7FB466F57751D1B9EF688457E7D9A212B536D0A74916295A5C2F728099244741BF4387185ECAE5929655FAC4F10A974B355CDDB63E2E7687F845F7038881A74156ADBD80C46AD1966479EEB3AE4D1D165F58FBCEAB852A34AFA112AB495A91C113E7F3C67138DCAB26429B1929D22A0A92096E4FAB69CD8690FD58B29038998F420ED607C5F4D23B15A53D8935667C935FA8EB5191D227816D347B97D758857DB061C0A68A45A08BCD8CC6397E79F18303226AB0982FF00E6785D2B354849D2A4172F5A13B46E9C6CB482490966E120BB1B9B1EB77F28EC2699F669EC9F45774E57D00ACCC1AB9A90F3A8950DD5C21445FEE0440C72CCEFE2063F16B2A9092949774049513D0B75BF4143185E669593C441239EA1F73A0A103520EF16DB35D9169D60B392A825A5A424B72A3C2102D75493EF323D310723033BB529EF714852384BB11551275D400DA3B93D22B79BC93982870034D75F00FD4921BF2C198EB9692092B4DE67C43A5C6D6B5B162C2F651583471CA4958005003E16BD3F310F2B2598925C103426F5F2B5B5BED15FE6DDA286F83B92823C5C478922236DCFC45EF893C360F1085702B09316C59FE617A060C77E40F51599C365533880AB01424569E5D6C4E8763F43BDDF9FCBF5C7C6A8FB131B1B6F7BF4E5EBE78208D9DD93B19F77EB8208CC20A6666FD44608239C1041820830410A1948215239E082377027A7CCFE782083813D3E67F3C1041C00EC27E38208D884004CA62DE7E5CFF0C10A4BD7C3EF1B3813D3E67F3C10A41C09E9F33F9E0820E04F4F99FCF0411B5B481303A608236E0820C10418208D0FEC98DA4CFEFD7E6704369C2A7937D0084D82108DEC6EAF4C10429C1046B7397BFF007FBEB85E454A81B375D768D54A2080CEFEDBE91AF1B2C0248D296E821DCA415F086277E956F0E9061B2BE57D5B6F7E71209C10500785CF3A0F37F1A6FAC7307A1F81C3757CA1EE7503D2B6E7CA36FD3357840DEBA79FE233458906C4EC0D89DF61CF1B494158E32A219CF0B78EFF0096D371A99A9927846B43A93CB95EBEAD1B0DAE6C3CEDF7E135E3E725624CB4A94FF28A3EDCB9F3DA31330B24CA33662920B7155B7D4927E9CB584B599BD1E4CC2EAAB9C42184A655C6A090A001DA489F389DBD316AC87B198ACF6721465AFE6503504B545C0B373357E4D1CCFB55DBEC2767E4CD4A26A78D20FF00700C40237D3EA6E0D23AA9DA97B41D332DBD41A6DC42570A471A162EA883736EBCFDF8F507633E14272F952E66270E1870A99419EAFAD5DC0D2F78F2376E3E2FCCCC8CD932672812541252A3F2935B0BEFA0E978E906A3D759BE6D50BFE3B50F2FBF512C00A5917BAAE9240B0E6664917DF1E89C8F23C248C3818591292500098FC2CA61435D983B0A9BED1E7CC7F6971666A973E72D426124024D35B39BBBD3C621A3307585FF002524A567ED106D3E666F7B01F118B1AE461928799C0929B0000E7561E7A97DAB0C5199FEACB1750258B9F017E6684EBCA14AA96B1F5B45995B951FDBE2E020C0E289E1BF5237EA31058BCD254B79682DC2E2EEEDD2B5D4EFE0DAAF0495BA8861A335EA46F41A915AE8226D94E87AE6529ABCCD680C7DA2952900F08BFD9E2927CCFEB8AD4FC7AB1130CBF9893D75ADFDB1A690DB80E1EA0B373BD036B4035BD3C21C333D4F91E46D0672361B554905350E18F09488175023D23F2930B96E2312B515F114D38433B5DDB5E437F28CCBC419CE92F6605DDC543DAFEDDA29BD41AE1350B50CCAA949249E16D1C5C23A094102DCF7F28C5830B904E5280E025C8AB352FCDFC7CEA215E015F6C3DEBE91546799EADC2D990191C45B5055C8E7304116DAF8BBE53D9A595259160E5C10CFEBE9E2D521962CF5DC5BDFD3C04573996A24B4140AED3D63EF31D07E62D8E9596E401013F2ECC1897A56BE356BFA1D420EA5BDF5F7F4AEF3AD4C1DE0E05C70F14DEDBF95BE1E78B561B23E2203300D417AB7974ABD342F0A2106AD5F2F7B8BC5719A67CE9E2217293B4131CF97E38B0E1F26C34A40330A53C357207DCEDE20C6C4117D62249CE6BAAD6696929AA2B5D7D5C284B2D2DD0924C429494A8226D1C513CAD384B1D8DCAB2F149D2828034701D86B5F76BC64214A4A940512CE5F7B7BE9168692F674ED1B5938DD5D4E5AACBB2E708597D6EB654942B9941215B6FCE76C737CE7E25CBCB5E5E194E5CB70D8B01A5B52CDE71AB6BB74BF4BEFEDE3B33A5FD98B4069B525ED515BFC7AB7C0A61A525D61348A4C158F0A8A1C0B3D640E9D39DE3FE2666999CD2995355864A5DC825D6F4AD886FB36D19FF74A552D2EA0BB8D49EB4AEBA336BADF946F643A6A8D34993D150D22109E14A8D3B0A58E1020F196F8A6013BDF7E78A86638BC7E6734CD54E9F3261FEE0A98906C2C0B1D80A51AE6012E7B01F3569BB72BD76AF4110FCDF581A4595F12AA03F370EF7496639A532019E805ADD4E12C0E439962A60E34288243B80E4022E59EC7DDA35EE26B5016AB0DF7E5EEB158675AE6951C6B7B312DEE4B6A4A9503A711BDFF00327963A7E4DD90594A0CCC389967240A1D74AD58C024CCAB8507D2B5E75F75EA22A8CF3B4FA36520533E85405719EF00EBB898103974B7AF47CAFB21C20BCB4CB048E1000DE9B5D80B1F4895C0C86204CBBD5F9BB0A8A50783F952FA8BB5C5242F81EE217809503693D2763EF1B5B95D309D9BC0E1C0FD44C9680003F3149D8D8989944992194DC99AF5D79BDF9161B0A9332ED3B38CC1C4B7468AC599321961D7449DB88A52A03CA6FE7189299FFD9DCBC12B992262AFFDA1DBA56A75F5893952E4FEEE14B269A0BF2A75D8C7D9F702BA7CC7E78FCE947D488CD00899E7820856D7F4FBFF001C1046C7397BFF000C1046BC10472013B0C10473C0AE9F31F9E0820E0574F98FCF0410702BA7CC7E78208CD00899C1042D47DA1EFF00B8E082327397BFF0C10A4BD7C3EF1AF04291B1BE7EEFC70411B304118A93C51788C10463DDF9FCBF5C1041DDF9FCBF5C1041DDF9FCBF5C1046C4366F0472DEDD7D7046AA4F13559A33E03D47CFF2C11AF77CFD3F98E0A4A6262F820EEF9FA7F318E083BBE7E9FCC6494F14DE2309AE7095AD4DC0F4D21ACC404AB702C767F7AFD9E32EEFCFE5F1E78C27121542AB50F46E9E17AD59E25B0880407143F624F87500F231AD41485A63633263D63979F581BDF0A0636ABFE7F36F48972BEED2598003A7ADE9785E97611E000AA2C009933E847E5EA6CA0C3950709AF536F63DB457B1D980960B1B3EBBF386F5A1F2E7795280D2904965C2425206EB27607C89983B637460B12B9A897250541440A026B4B5FCCE962D103333EC1C94AE64F9A947007F995AEFE837E758ACFB40ED7B49691A171BCCEA9BA8AF4A141A085414AD22D3DD9BEC3A73DAF8ECBD90F86188CD97266AE5514439526D57B37516FE787F6DFE2F4ACB53364C99C0B710042BCA8EFE1D0DA3A0BAE3B6DD45ABAB3EACEBAE3792A4B818E05F0C2153CD30A3CAEA9F863D51D9AEC160B2097C62524CC64F1929D980615D49D2BE71E43ED576FB17DA099302672D94A2ECA25DDF9DEF67D0E800A32B5C72AAB0A299C5960A8A9C5A964913E2B9513CE79F2F71E852E6CA54B1282412DC219852C2D7A6F60E3568E61370B880B3396A528383577AF89E7C8E9631ADEAC697C34AC8EF9C62CB4F0F1294544110482607979F3C44E331ABCA5887F9AE1D83D7F353E71159809B882020171471F6E648FE1A90F794E98CD7365871491474A2EB2E04DD063FBA08B4D801E5D442CFCF7138C3F2950068384925CEED785B01297214935040AB8B9D6F5D2BCF689839FC0F48B45197AD0F5554A4FD6D44F180A6C0E1E10A2A09BCDD3E569384F0F87C4E26612B4A88A312E5FD0BF8FF009B14BC406093C9CB83D2BD7A00FE759EA5D6AEB895A50E2D2992084A8C46DB0F4E9EEE58B9E5D9271315203D2AD5FE437D5C447E2809BC4003A7B715A5EBE42F151D76A72E71F78A22E4824C13D46F3E71B62FF95648944B0A080E68430E6DCCFADDB946B8190CA20861A1AD7C3EFD4968AF739D40D10A2B50B4F43BDA79F5F527618B8607260E9FF6C1377200BF20DB7F889054A0EA6340CDEF5D76F48ACB3ACF95C214D3A4F0C9E0130A9DAFB88FBF6C5AF078144A07BC481D40A6CDE9FCD635EEF9F5F7D22AFCC750D45495A16CFD58DE17DE7113CAC89E76DA7D4C624E4E270F852429495736614E47CF7D768C940A72F50F5AF9FF0010DF94E5B9FEA5A85D0657435598D4A9494B290D3ADA254620BBC3C2396E4623F31EDC65D93389810A55C7CC01A07D3ABB3788A4615F29A51DDC69E1E71D89D1BEC9FA82B8B199EBDCF13A5E8950BFA806915E5D418F09534AE24CED3CA76C732CF7E2B4EC68523289267AD2E95242FBB67E65810078F2302502BC5F28350757A93E7B1FB476974DF673A0BB3EA7713A6B25A6E3AA091579A3C43EAAE5343C2A4B2F051A7E13C93C24C99C73AC463738CD27CC9B889D312EDC3872A5349767F9C11C4F7A337AC60D0326BC5767AB1D9E9515A316F25D5DA83EAC9296F81A481012D8091FF4881B4DA3D061C48C9674FF009A6ACAAF42E6B5D5C9B5691A457D9CEADA068076B1CE052788A1C924A6638A403723A6E3EE7533B2B389419128A8387603FCF9D0E97896CB90851F98F2B0D3EB5DAA75BC5459FF0069542942D34E7EBCB4880B528D3F099B58C4FCE0FCAF5D9EEC84C982599C8E12083548275F3A00C452912E2549092431B0E74DDDEC35B750D14966FDA5D6BAB5F7CA53886C92D36DAA4B53361C175CEC378F22631D7705D95C24940527BB42884F12C81F330E76620B9153EB194CA9003900DEBBD1CD6ED53B3B18AF2A738D47AB5E34795B55656E12800D33C94C9B7FC45242779B93077E589350CAB2F9759D282807532D0F4D83DED6DF9C60C99360D7200602E4120BD9A950D123C9FD9B35B66E876AF50E6E720A65F0AD912DD49A94AAEA94A17C4D948EA39FC6859BF6DE5CB5AA5E58B338CB2CBE1052CF600B17F0AE81AD08CFE0C30534BE252838214CDD40FC01436689851760DD9DE429073DCCD39B3C800AC28AD90A2093221640B08F39BDB1589B9B67999A80968C4278AAE0A983F26B7DBC223CE2A7AA8A24241B52A0D59FEBE1A38896D1661A0345B6B190645423BD003CE3AE36F13C164901E4A888E7004DE7961493D96CEF1E52A9B889E90AB92165B4AFF86E4E408C9C54D724120D2C6FE1FCEF4DFEA0B813D3E67F3C7C448FAE1182C01103AFE18208DAD7F4FBFF001C1046C7397BFF000C1046BC10428640215239E082377027A7CCFE782083813D3E67F3C1041C09E9F33F9E082315262201E73B9E98208DC8FB43DFF71C10464E72F7FE1821497AF87DE35E08523637CFDDF8E08236608236B6099813B7E38208DBC0AE9F31F9E0820E0574F98FCF0410702BA7CC7E78208D8DA0C99B5BC8FE3851129730128492DB03F88D4A929604B3C6EEEFCFE5FAE345A552DF8C14B5DC41C69DFC9CC25A84414C49B1E584BBD976E34BECF1B42683D0FC0E144FCEDC3F33D9A08554E82AE29062D68F774F31EBB74223333973D2C532D5CA86EDEBC879C68B0E40F60381E3F6850503991EFF00F7BF2E9D79623E4CD5A3F7862DF6D6EFAFD62530A81F2922ADA1DDCE87DDB48E52D852D28304AE403C86D79B6D7FCB161C02D33F85D8BB3695ABEBE239F284F30C64B9328954C4861A9D9E8CFA74DF94346A0AFA5D334CBADA8A86509402AE15BCDA4D8490125533F38B5B173C164F8AC424193214BD5922AE76A55EC06DE11C833FED56030CA5F162D0821E8A50B8EA59AECE63A7DDAA7B49A94CA32BCA4A53671B79D6D4991FDA640133E47CFCB1DFFE1A7C3A39924E231D87E0EED890A4DDFA8ADBC9AFA793FE2AFC5299972C4ACBA7F7DC45415DDAF98A509A57968DCBA35A8B3BABCEEB5CACABAB72A8B8A2AE052D5099E504991E57E533338EFF0085CBE4F673865CA94084B00C1B7B9FCB6E1A91C067E718CED0054CC44C5A42854124924EDB30ADC784343D5A5B6437629779003C3C3BDC093BFEF9CBC9C7FEB4F0A93C06C4BF938A0B50EA79561A0C18C19EF0AF8F5F5DB7F0B7431BB2E4399B1197E5ADBA9754614E702F8403170A2909023CFD30E4C993844F7EB9A193F31147DC51DCD7D0E85842C31699E44BE10D40FE62A49A0DEDE57B0E934E64BA5984D4E62B43998B838D282AE2248BC5A529B5A481327AE2BF982E6672BE1C3C95144B35531170C0B1E96D7A42F2B2EC3A4778B5A49502458B36F5EB7FA9AC3B52768350EB6AA44C5234994A3BB29320587D88378EBE7732712195F67A6383310470B1729DCFD69F5EB0C7152E4CBE208502DA8F1D411BFDC08A6B36D4F5544438FB8A750F71142F8A763264090396F13B73C745CB324C31212402B4B3B80F514A11B8DF588552D6E785CBEDD357BF4D6A6915F663AC12EF1092679C9F988B753691E918B2272A5CB712A5B8A51987D4FAC48E152B985969246BD01A7566AF9440338D4895C70AC08E2913173F03CCED2475C59F27C2290969D2CA53A72BBF27F06A5A251587080080D6E54B5BA69BB12358AD735CFD6A514A572A13B193F0DC9BEE2E4CF2C584CE918541AA52DA9A9D3D2FD5BC635280D40C7993E30DF9465DAC351542A9F22CA6A2A9C5A9295BEA429286428D882B4049045EC63E2315ECC33F91282809E974BEA97D4DABA680758D084E8AB339DC9D3A5347BF28ECD683F65862AFBACEFB42CDC30530E0A20DF15EC4A4A9A544C45C8B1BF2C72CCEFB6B880A29C0A3F505D414CAE1E1AD0824D79B7F319FF6FF00B884DD892F6D4B6FE3CA3B2D97A748E8DA6396699CA695A0A486DCAA5212A5BBC0212415A0A916BDBE3CB154387C7E7E1588C56257420A52C7E4D48A5FD9B184D402E882585E80BEDD05B6E7AC36D7E7294A56BA806F24153A4848BFF4931EE03D7AE24F07947E9871A0998A0C48E121D9AA6E796E1ACE29A2A5AD3423F1AD36DCD7EF15E57EA96E902FFCC15A144C24130D81E7263E3CB98179895350A5241C39045096626C0559A8DF4D69191C61C90EF67A5BD9D2FE71516A3ED0D0C970072499E704C728EBCADBC8907170CB24C89A9038784B8D59AAD5F3EA06D4318214A366F114F7E315557EA3CE73E525ACB32FAAADAA04F70C06DC4B6E1302EE9414245C1249B832671699589C065724F7A25ACAAA1D497A6C2F60458D61591395248649A967AEFB1A59FEF1BF2FEC875667EE7D735BAD3A532F242843ADD515A39C869414391B89BDFCD15F6F24C99331380C195CC450000A5EAD761CDFCE1CCCC54C0A294925243B87E47E94E74BC4E99D15D94E97434B08467EF23ED54ADD718EED49DFF96A242A6368F80C404EED57687325A532C4DC1A4B8E04A78DC1D8B53AD2E23518D50354F15033ED7F1DEB47109732ED674CE4CC9A4CADBA3A100708E1A7694A03942CA267DF208DE775A56498FCCD5DE4D9D384C2039254012756240E54E8F185636610DC2A67E9A860ECFEF9C53D9FF6C152D9E2A3CD9FFE7717136D32B7A609800241088BDA00DAD8B764DD98C065EF33319885BD7E7604355DC972FF0047E6CFB0AB188A4C3C2D4F9B5AF33EC88AFDACDF5CEB3ABFABE51936659938B5405A9A7E992A2A3FDCB404C5F798138B0CCCFF00B3D948225A641290593C4870DD1CE9A3DC0D61E1C3C915E201BC6E2EFA0E55040701E27B45ECDDDB3E7C84395D90AB2AA65805152ACCD9594A5512A2D1701300EC47E00D6F17F19329C29549C3E152560904014D6AECCDE7472212386921CF186D6D576BD5CEE2DA120C7D69E3E0F47D6C80807700FAE0820C10460B49511161CCFE9EE8C1046D423E1F7FEFF41E4410A020FF00E91E9F8608232EEFCFE5FAE08237349E124CCED8D16680737F2FF3030370F1BB0946186C3C840403B807D719722C488180B0020C62061B0F28C929E29BC4608CC65DDF9FCBF5C1041DDF9FCBF5C1041DDF9FCBF5C1042AA64F09573C1042AC104182304034306081850B5ADEFDB4189CCAB32C3E102C4E0090000E1FC8B7D9B9C6ABC14CC5074288E1B73D3EC7C6FCCC218F9F2F18E25D097B36B61B59F5E95B335C89987352FC2EE0DDAA0F27B6F4F28E201DC03EEC5715964FE22A0A535C162037E0FD358C271A38B8483521EAEFE0C2DF6D9A081D07C06257053460C8EF403C2A04BD2BA8AFDEFEB137879667B0142C2C3A8B5396DADB44EFBD50C42984CA3FF32C3DDC89B1BDBD0DB12788CD70F8C09969949530201A6F714F0BEBB46D8CC30C2A4AD6A6D6BAF83F3AFB7E02D971B554D43818424712CA884EDB8F1116B1BFAF2C2723B353735534A96A1C4400C1E87A0ABEBB522A599F6B30B964A513312E906EA03C6FE26FA333C541DA0F6D7A674BD306289E6DECC21C4852553C2A168316E9626FD48231D2FB31F09B3099325CD54B99C2483549EA2FE3F5611C1FB61F14E4290B44A9E051428B048F5F31E0F531E78F68FDAB679ACEB5E1555CEA69829412843A4002F000491E86DF3C7A7FB21D809597A658C4C80B147E2480777A820E94FE44791FB63DA2CCB369B37F4F8B98905DB8546E6A2C5BFC6E0353ED39F5BEF50E71252DC0EF56A51E2264CDC99F75F1D824A30B95202644B4CB7150960ED7B0D3CF9C735C160B1656A56653173C9248E304D39151D5C3728D0D507D62A52CD3B6BA92A500549E2013B740A1B99E7CFAE23F1D8F95381709D6A6A75A134AD1AF577D8C4BA42650F91013C3FDB667D1FF001A88B432BD0D49414EACC3397D219090B0C2889E662C67CCD8F96F8AE9C61133BB9293C4AA822C9BD7C5DE9D21B6214A52439A0D1C543F3F4FE6AC79CEB3628D2BA4D28869829052A584A7888F252D3C5C8DEF688C4AE1302AC510AC5A9534E8092914E42F4A795223A62969712FE471A6A75D68DECC55199EA1A9796A5D538B150A278C95920ABFD227840B1FB3BF9E2F794E12522584942526C01001A35CEB4A353684D336711C2165B9DA8F4A07D5EF468AFB36CE5B85294E78AFCCC73EA6D6DCF962DD84C12569E14A472200A5431D3CFC7946122613572FA93720DEFA3914E422B1CEF3F70777DDD484B7E20E34471F780EC02BFA63A889D8733896C3E4F3259E304EE4B353C1CEBCE8FA448C8420BF100C3EC06FF715D62B1CD756B6959629E9781D5482B0E05993009E1F9E2C3231185C394F7E525290DC2435854BDB6F06A8B44B495CB9690C90EEEFA6BC8F2F58D794E88D73AE1E0C64740FBA0901EA93FCB45325C363E20028104CC6F1104E18675DB3C0602504E1D32C5083F30736F122D63CB91DE74F49D406B6B4F2DFD3A34766344FB30E4FA74379BEBFCED35B54385C145DD9042B7E096D445AD7237B75C726CDFB7B89C428A70B2C94A9C779C4C13CC03CFA7943454C4B925437602FE1717BEADCC98BF69DEA1A1A3728B4BE594F454CD25282F169A2B7922C93C4B4858889306E0ED338A82B133F19342E74F54C5BBA6A5210ECEE01634D08A784325CC592529A03D2B7F2D7EDCD9BF88D6D1F7AE57B854923ECF140883CA63FF6FC394E60F2B13C0E22492000C08776D75A7F8864B953947F716B9DDD8B337ABC40F35D4F4AA538A6DA085A64874AF842226E12A0019F5F518B5E132B97804242A604A1603A08A9AD43E9734F2890CBD1C0FC4E4D402742F5DF76F74A8339D7CC07974AE55BB5EE9202596DB5C09361C4806D31CEF1BE2CB839397280485A11C41CBA85FA13E5B3BECF28426EA0EDCDBD61137936AFD4AA6DBCBDB5E5197BD77EADCE17613C8842E15617107CB6C2B8B19561105969993B4484D49D03D58D817D34A46532788B80C3572C3D6BEBA7521DA97B3AD1F912BBED539BA351D427C61B334812B17E1250A20DEC6D163EB8ADCEC563D5296AC3619724A8FF00B6A0EA7008AF0B6BEBBC6552D095014551EFF7F5D59E8766FCE3B60A3D2FFE4720A0A4CB29D00A1A6B818A85D504F475482B411D4193898ECEF67CE7EBEF33698A42E5D415CC32C3171FB78922C36D9EA63454C42414801376D58F53CCF872678A633BED3B51EAAA834D4B479834F38A29406987DD696546DE24365B4836332201F762D98BCAF26C9C30C44998A483AA43EE1DEBB35FA930DCCC4A9D400246BB8B73B7873BC3B651D8F76C1A8D21CA8C8D54744F416EB975CD71F02B752A9F8829300FD95004F316B56E776E72FC14E54A46150B5208621373D598BB7A8DA324CB090428125C10D6F4B45A593FB2665A809ACD59AB0D42800A732F148B49EA51DF2147E37E4646D86B33E2662F8BBBC2E583855699C403529429B83A75148C254805D469A5363416B1D06FE962651D96F64BA5160D268D6EB2AA53354ED738A0B52765774E7104ED31104F2DB15BCCB36ED0668A4CC9B982D085391282384240AB3A59F6DEDE08E2B1219A586291A7D37A6F5F48B21AD48E65F4FF0057CBF2ACBF2BA303847053D22D684C58F106F8C9F7C8F9E20D7964CC44DEF67CD9AB59673C6A00B07FDBC5F4E9710C3F578866EF0B1DEBF588F3B9BAEBD6E29AAF5BCB0417525469D289D8004A527A1816F7E2464E5F2C30984166009009EA4FE5F78D3F513BFE6AF323E847E23DECC7C878FB35060820C104668483337DA3DF82085A845801CB73CBF7C86082378481B608239C104184E669E3F6820C27041820830410A69D20F1126361820855C23FBC7CBF3C10473C00ECA9F77EB82083BBF3F97EB8208C8009993BFBBAF9E0823991D47C46082091D47C46082091D47C46082091D47C4621F3113411DD922EED57D4F93B1D59E257018A972814AD9C8A39A16E5E2FB738CA0F43F0C38CBB106510269AD1C973776A73FC6B1A62A4271615DD01E06FE3CBDE91C7BBDFD316B463642D2CC38D8598EDA7DBFCC404DCA57294555046B5372FBF5B0E8638E24FF70F88C4762B013B141465A4925D9ABE81B4E9CA91B0CE64659F2CC58043072469BDDEDF7860CF3525269EA735D52F30186D2A53895BADA490279150240E606DCE3161EC8762B1D986251C52E61054E070A886B9FED6E9BD6AF143EDAFC44C24890C99C80A092C428072CE351D2BA79C7457B62F68A73375BF95E9474B4471216A6CDBA13361E97F4C7ABFB11F0F4618CA3889628C4BA7EFE75B08F2176EBE22CD9C26093394CCA145EEED626FBEBAD1E3A69996779ED6BEAFAC3EED43EF9256788A8B7B9BDCC4836F98C7A432BCAB2EC248484CB40EEC072120396AE9A757D3568F32667DA6C762B107FDC591C45AA58392E0BEACDD3D21BDA7F2FA154E64EA9550B8E1404A892A2622124F5DA06E3918C298DC44B961E5A512D20162C34B52F5229C9DF789EC8B13DF9499EA249209E2BF874ADABA6C048B2DD2F9FEA073EB4D27EAB9332429D5B812DF78DAAE3842A167C3BC4C03E726978FCC53326A65713A96EC12EAAA7FE4D673BB06B4587384C94CB49941367A36DECF5058D584E4E69A774A52F7394B68AAAD4A48754A9B2E3C5754F3FED36E62C30D6565F89C428F1A1610A6F95DDC3BBD2941E9D62AEB584D8F12AA09EBE60536FBC5699F6B673325254E3CA6FBAE2E2A70484906C048201B7FB5F169C0F67E61E17430A3121CDDB930AEA5C4205D4E4D46BC87BFCC54B9BE785D5A8B07EAEA932A9DFCC93113D245A7173C0F67C84A68C056C1D8F205B91F1A3C375CB7341A50FD8F5FBF5884E699FD5AD0DA1C8847142D2A04AA44CF86E23CF9F5C4A4DCA972787802985E9D35FF00378564C906F53A8A55AA3969BEFAD4D659C678E1529216A2ABF824924DF95C99F4F332379DCBA6A70AC66D367274B97366AF9738597213AB31140DB7F25FF10D195E9FD4BABDF5D365740FBAB94A0BAA4A9086B8F9A4A841041E46DE5CA4719DA5C1E1E51056805B7AF956A29467A79EAC6C68123414E5B54DBC394762344FB346459625BCDF5D66A0D4D9C6E93BA2AF172492DA88DE05E773D231CA33DED5E23133169C04854E9609E29817C3C2E59D8D09D4FD890C999852FC4A22EC2A6DF96FA0D62F7A3CCDBD2ED2F2DC9B2F62832F74043354036B5D4A50224829E3470EC66F27E15F91819B9B28CEC4297C52AA904A83137700D40E6E28C1A1133D75483C40B798DBCFEAD0C55F56D289A9A86D554E93214A754900998F0CC45EDC8C46155640FF003214E454802C006BD3ED194951503A9B87DBA52C1E83A8311C5EA4038C38FF007684CF7680809088E448DFCC9E7F0C208CB664999549D1F7A727F7D21E4A4BA8248626C5BCDBD9FCD51A8F54E7755589A5CB10E3E952A09424A80E57201DBA74F2C59F018D561E850CCC03FAD4DDFAB3D2241186E3B5199EFF009630A5DD179B6694F49519C560A1A532A711092A701024182088DB6C6732C562B31E197870A2514570DAAC45474EB5368274AEE1228C2C74D9B5356731B54AECFF0046B25CA6A0A7CCAB523894F2AA01525606E1B5151372791B817DC8C60B2AC62B87BD9CB96C352479D5F416DF9C240BFA1FC7F9EB102CFBB58CD7345A32AD314350F553C4A1BA56A95C4366E213DFF77C207424C74C58F0F829186509B3B16898A4B9659156DAA4D033DFC2360A2011E5CAAFEB1865BD8BF6A5AD9095EA0617A5D959E21506A5BA92A49933C09585260728BF2DCE1EA7B6B96E01250252710B45199813B71330E77E718D9CD0D5EFE3EEBCA27D967601D9E64C108D639B1D4158C90695052ED3C2EC5CBA150676932003D23142ED776CF34CD8A1394E19783624284924B8A307481CCD183F388FC6CC52280EC47E3C770FE348B8B2BA8D3DA5E9114BA7A86872EA74240495D3B358E2D226DC6E214B13EB23AD862B3864E6D8F081994C9F420875AC1AB12E1D8EF0C0629490C1C13D48600D395EFE50D953AA1AA8716AA665D65D905D79BE3E07093E129680E04C5AC1201993CA2E385461658509D350B0C004A800400198A8B957992D7D635FD612096AEAE5FD1B5ADBC5F44C9ACCEF30584B4A79D4AA3C3DCA933B40E22981EFDFE58D978FCB70C4944B4A9B6200240F07AF2FA467F52B7DFADB56E5D474D6B0A7FC2B9FD514ACE524857DA75750968A3A10851133CEDEFDCE23E767F2E6B2508091A1150DE1D18EEDABC67BC330D284D087BDBD34BF2EAE6D7672E389E3ACCDD3978DD48E10F01CB70A8F94EF86ABCDE6A52552D0A98480750F566D9C0DBC63520BDED42297F7EF7D4F68BD23430735CF3F882893DDA50CAE9F808FB576D438F8AD726D1206114E79892549549286622AFE83C7762488D8D855C540B0FBBFE0347B95C0AE9F31F9E3E55C7D9E8DADA0999B7CFF007FA608236F77E7F2FD70411B5A401337DB718208DF8208304106082324A78A6F1184E669E3F68232EEFCFE5FAE138236B68179BFCBF7FBE98208DBC09E9F33F9E0820E04F4F99FCF04107027A7CCFE78208514E002A8168C1042AC10425A80094C8B4608213F027A7CCFE782083813D3E67F3C1041C09E9F33F9E082324D10A93C72AFE544004DE76B741F8E1DC8C3A2783C407537A3B01BF37F37B44E3953D2B4997C4CE6D6DF4FA6BAEF0E0DB8FA07748488800C807CBA44F337DCF28388DC6E0D6853490E09A84835666A8EB7F1312F97E3C480F38B505C80E3CED4FBED1A5F7174692BA9521B61CE2EF14A2910123DDB091B73C3DCA329C5E226A3E4590486A12CE45A9CC72DF410CB3EED66070D87983BC9614124FEE48D0D3AF2AEB1D79ED47B63D37A5E9DE672DA943B570A078566CAE7CC8933CB6F863D15D8EEC1CCC70477D289A24D52FB568C18EBE2D5AC794BB6FF00113B954D32A707054C12A1CE9473F8B3D5CF40F5FF006A59CEAD71A43952F21849761A4BAA48712ADA4248DB9C83E5CC63D43D90EC4607289056A909E32126A914A54543F3B9A3758F2DF6A3B7D8CC7CD5253354415100859347B383E914C54BB534C4AD973BA0ABAB888515493375C1BDFCFDF8B96225C8C24AE3949482DA5096D8E8CDF6778A32F173F1A499855F31AB9A52BEFABD617646D56E64EB8D6574CB0FACA454542C1291FDAA01620082660F493D2A58CCFE6A55C090404D1C3D2E6A35FCDE3072897FBEE4B3E9FE2BD356DA2C8634C69DC890330D50E22A6B40E36C724AA398448F2BF2DCE231798633174758E226B52C05F4DB4FA464BE098A0971564914277F53E8F0C59FEB9398A1BA7A750632FA4E24D321B86CA81B10AE182AE51C409BF217C5A3B3B94A5466CF5CA2A9931B88A9D56B33D07A56F183984DC480164B25E8F67ABEF563D68DB1AA735CE91255C769EBF39264FDE791B63A160F2C007EC0E7968CE0FD3A728DD0AA9737667F7FE62BACE738010568584AC025299BABCA79C5FF002B62D183C081F2292C926AA6019B5E74F585C70A5882F77BD7F0DCEF155E67AA9F5AD6DBAB0CA45B912AE5B8BCDF95F9C6D13D25183C3B1510784B5D859DDBFC7842C9009259C8BDDCD051FCA18E91CD439E3E32FC832EA875D78F0AEA8A565082A220C389200BC83378DF0962F1F824216A98B425206A5209A56848B51D88D2F028F7601259DC74D7D6DEDE2FCD11ECFAE53A919CEBCA80F03C2EA59B022D37EECFA4D8F4C730CDFB49266AD72F2F52A628062405009BDBADBD7A616B143B8717AFA534A55BCE2FC6ABB4F644C228B4FD3329425212B525B485022C2545215E867EEC50B158DC5CF980ACA96A7F94D58576B12DCAF7686EFCEFE2FEF7861CCF3543AA2E3CBB7424C08E8240B7E96B9C4E65B2573B87BC04715E8C0ED41BF87E74324AEA5C9DDAF6D010F119AACEA9DE6D4A4284B1C50A5287849E8933EB6D8E2C404BC0002628049BA451C6CF7FE29BC09C3D406A93434661CF42DE3D4DE0EFE7199660FA9965E5D409212DA5B2916FF58106C2E6479CD8617958EC19708940391FDCEFCFD61C264A87EEAFDEFAE9E75BF5C93A7731AE5A6A334CC5BCAE8A98F12E957C0A35C954784AF88291C3039DE71B4E5CB5292997244C2B70482DC1B1E6CEFCEE6B0FA4C804B936A8D3952BEE94DDBF34ED0720D3ABFE17A572952F3357F2CBCDA1CAB0B7088064B6B489DCF8A3AC61EE1BB3FDE052F198A4774AAA65964B001C7CC0825835361489044C9690C181F37E5B5ED6DEC68DAAD2DDB06B30CD4552065F973D252FA9DA76E1B277EE8A924100DEC3D37C6ABCE72AC8A62E4E19231539D94C951029AA8022AFCAC39435C62CA920B7D093BFA379D21FF2DEC4BB3EC9168ADD539DBD9A6683C4AA64A2A0202FA12DA94D913D3CC6D1883C7F693178D98512B07DCA1569BC605D8FED6069615F2AC4705A48E251A8FEDF6DBBFA74B0A92BF2CC98219C972E672E60C065D1469AB71F8B4951694B6A37B91336E711189C0AE7A92A56348A12471D89157655486FBF4D04D2096B1B0A7E35F4E70F02B7516663FCBA1755C768314DE83C5C200E5B5B0D8C99787078E626601A8AD87224B7BE507784D002454F3DFF003BF28C17A1AB73458733C6DBCAD283FC950A843EA7A7ED4F0A8F0F0C73DEFE987D82ED0C8C220A25484CD5D944A4023A15276FA0A6B0CB1838882B0C3A8377D06FEE90E4D68BD2796A439559877CA489293C66E04DA146DE5E76F2D3119C62B1CAE14E15287A382353CBEBA4302DA17FF34F4BC64ACCB4750A0F754A97DC16061420898DD379E968DEDB61AFFA4637145C2D487B3F3BD29D5C884F84EA3886E28DB0D2FA0B08677B5CE60CA94DE5342DA132027F968317371C49E912461D48ECC82927118863A82E3D5F71EED19083606BA52D4EA012DBFDE1BEB351EA0CC0215983A5A0890D25B084833733C040F59F779CBE0F24C14A1FEDAC4C7A17D1BA9B97BBC38972D44BD9B9FE3DB8863A8CCEBCC8352E0106D0AE9E768BCFBFCB121FE8D216DF28045ED47FF1FC428401AB9E43DFB6D21ADD715557AA754BE01E13711CCEC47C67AE355E4320B1041BD185BEF6B51E8CD180CC5CF41CE3E827813D3E67F3C7C7F8FB3F1B5B481303A608236E0820C104182083041060821553278B88CC6C36C27334F18215777E7F2FD709C119A1004CA80F5FF7FDDB0411B3847F78F97E782083847F78F97E782083847F78F97E78208CD20098333FBEBE78208CB04118A93C51788C64249720381730463DDF9FCBF5C6AE096D76F7D63608529983BDBFC5E0EEFCFE5FAE1512A61B24F913F40605A4CBAAC30DFF003B41DDF9FCBF5C2334F73599F28DCD3C77AFE37AA299A859E14972341527C89B7B78534C9525445E1504988100733FBB4DF082317316B12F0A0CD0A2C420D9DB40E75AE96A562630F2F2E97256BC7CF97228E9EF080E79390FE1C9B788CEB0D5F41A5A8DCA875E6429092A20BA806403C8999DB91E5B418E89D9DECF63332988E3C32CB91562589E4CD476BB53998E3BDB7ED465D97226FE93192D7C214DC2A1663B135DEC6F56AC744BB53F698A9CC94D65794ACA427BE6DD5A0C8BC817FBAF8F48F64FE1AF109532661D8FCAAA81D59CED4D0D5F58F1AF6D3E27634CD992E54E5A9CA83824867A7D7C868D1D42CEF3E5D73CED4D7D4ADE75C5710495120711FF00EA039FE938F42E47D9A9397CB4012C7CA120BA59B9D458372B470CCC3B498DCCE61E352C827576AEEEDEDF788655B952E3EC968294F2CFF9742415711D8F144C0DBED45FE387B9D66E9CA6584259D42A686DE9BDB9C37C265E9C5152E62C39AD7C4EA77BE8D13BC974066F99A5198EA17052D23403810A521329F301493CB68B4CC75AB4CCE958B484A428A967E54D58BDDEE282F5E5D1E9C2A247ED62CDE8DCFF0005DF61128CC7566579553232BD38C349718053595090388923C264893CEE955BEF7182C82762662A6E25C216C509290C96B8A0A9DDC437562D95C201A5E8E7E87E8DA3EF54671A8D0B5A8D73E5F52893E2511C27DE6F1D7A7CEE380ECC4B29042028581671CF47D0F23D2009FD439340AB3F8374A6BB5B940B31CD5A4C2997070AE7C01511E9E5EE1B7A62DB97E59FA67404301C3A0F32E1FC7A50886B3F08B92C5150A3A07F56B6CCFAC40335CD9C4F100BF326401E46F1E9EA316294844A0EA4B3022A2D6FB7D6D1ACB1301AA4802D47AEBA6AE7ECD15DE69995556D4D35252A1E7AB5F2A4B01A6DC713C52012B294A929DC594403060E1862F389387491DE253BD406141B8A8D39DA1E4B06A542B4BFE2C0DADE9170E89EC0F36CD4359BEB157D5E96CE21B252494EF10D906E2D713F7628D8EED580B992A44C2B58B241372E3F75A8EFE778792F800F98F08AB9D69EFDBC76068FF80E9160506459730E180976A6101482810140AD24C9BCC751B462A1986698EC54D96662662D21D9292A003E8598173BDBCE23F30C414B7764177AD2FBD34FAC26A9CF5B7C2D352F29D4A859B014902DD45AC23F1B4E2532F94BC40654AEEF89AF5D28E5A97FB8BBC45A264D591C454403CF9EFCFEED588CB953474A8A87DA4C950920927840BFA83B7BB6DE313B23279666A42D21DEAED762E5C359ADF4899C3A09038B6A6FB721AEDE01A206E664FE6D59F56678F854A8309200927E7D24DBC8624274AC3E15C24A681C00DD69B695F21BCACA93C4C4DB6D9BA69FE3687E7B45505232D57E6F9A8A765292B5309256B77994F0A145423CC7A6F3881C662138C981082FC27E773C2C0D475B579B43A4E1A5862A2036FA9F37A368DBEF0C6BCCF35AD7865BD9FE9E5BC80425CAF765B027FAC77E913CF63CBD063051230C92A54E48091F33548A5A85FF008B18D4A253965060ECCE4539BFD4D1D8C3E9ECB9FAE432FEB5D48595BD25596328E22B3B9471D3AFC3130277D84E1A2FB45DD14FE9C7788018AE8967A588721F97F0D2694A49F99B60E45AF725DABB7D227FA6B4BE41A711DCE95C9425FB7F99A86CD471AAFE206A10AE199EB691888C6F69A64D2518A52E6CA49F965A54A9652F70E92FCC68F4869FA9E0A8FDC054DC17BDDFD37D61FABB4AE7B5EB69DCFB8282957C45A79B7D0070FF0051EE5A5262DFD247BA766927B6B2706152E4600AC1038B89D45BFF005281347F5EB0DE6624CD62A2F7602D7E839B7918E5BCB343E46DC9CE0668F0FB4C2E9D6140F3016AE2927A8E7EB25A623B513F18B213853281B10FAEE3847913A7584DD2F715E7AD21BC6ADC9E914E0C972B69852A05429C21D0E47D8E10EA484D85F86DBF4C2F84918AC6AC199314800B8BD1FA5E9BB585E91B8243B6B786AACD4EF541934AA120CF7083EEFF00869171CE2F8BA60B2247085CC9E8593A294000D615569FE37813C27FBB6D3DF99D8B88630F66398929A3A6AC2763C61F0049B01C6047BA67D7066392E1528044D948D7852A492B6E8AD07F26129F2EC01E2B3062C0BDEC3C284F58DECE8AD61527BD6E914B46F0E3C94C4DAFC4479741F2C44CACC70B97100AB8DA8C0120FE29CC4371289B1DBDFE37E50E88ECD757558E34D332D773757154D39E29E775CD874E91B61E1ED8E1A538EE540A87CB425F42580A78D77D633DD172C41B569FC736BD4B73854741EA36C774A0CB6A00ECE30AEBD0C0F7DFDE30D2767A8C602CA992C1D4254E1EAD40F5DFA467B956FE405FCFDEF18D3F673AA9EE33C54EFF0040AA8A747044EC14ABCF2E9F2C311DA03972BE554C98146DC0A16EA0EA5DDAD6DE3432D40396E61C13CADE31ADEECC756C1229E98EE20D5D34DBCB8E3A6DD646D7792FB6CE2A8586A97496AEE18743E71A80F6FA81F5863ACECF33DA28557B494850F0065C43C6DBCF764C6DCC5F962630DDB01378B8525811C44B8EB7B5EDE87508502035DF51A728F7531F24E3ECFC6C6F9FBBF1C1046CC1046494F14DE2304119777E7F2FD70411B5B40BCDFE5FBFDF4C1046DE04F4F99FCF0410A69C01C51E5F39FCB04288D7C214E085235B9CBDFF008608C100DC03D635E08186C3C8472013B0C1030D87908E7815D3E63F3C1030D87908D8DA157B74E63CF040C058011B3815D3E63F3C10307076B78C668044C8FDFEFF0076C6C2614B2407E2A01D2BEEDB3C359FC5C40006A6F4D05DBC2F5BB346785D385A778A21EF7E9A13A7D99A24E44B44897DE2CF152C6F4366A90DE16AC1C2AE12A4C42374F320D847A794EC6D8D6667327040A182D5616D5DC59CE9EA219CD98BC61328A4A454055A9AF8FA3D1AE212BAB65B6D550B712D21B054A2B206DBEF122DB7218CA32FC57699918696A495020F00DDDADF8262B79AAF0DD9D44CC5CDC5051038F8491FDB56A9B5361E4E2284ED37B7CCA34C5322872F79B72B569752A29503E24881C88E7D7A5F1DAFE1A7C1CC561CF7F8C42A677842871A0B5CEF414F3178F297C56F8BB88CD8FE972F9C70DDC128265AC8E236FED22ED53D4F21E74EBFED6732D575AEA33079F4B4E2D413C2EAC24024C084900F291BEF8F567677B1785C0703E193403FB6D4D4355F937DE3CEF8CED26678B2A13B17326715C9528D198EBEF6D62A879229525C2BE2454DD3C4789422E7724CDFD79C6F8EA38746130E84A1084CB54B152183BDBEBAF9B522BB89526629D63BC7724AAAE75F07EB42F7B99664398E67529552214585195A9426C62FE2DA2F61CBCED8431D9BA2524A1243B338D7C00BD9CD8BF488C561D0E78500381E0C5E963EA4DA2DCA4CA74F69BA32FD429B5E6CE241610BBF8C0B813206FEE33EFE7B99CCC466B8860925292DC4347EBD3F11A80A940949290A34BD750EEDE8FB8AB18AFF0039D4F9AD71719CD5459A3121AE05048206D6410761F9626F26CB1485238D1C5C2DA37D07DD8B6D7D54B529DCBBFF0098AD6A3306D0A78D2BDC2DA2EA59333EB26E3DF7E5E7D37098796108050EEC0066AF27B0FBEF184A52028ECCE2BE15F637DC57F9967F975538B69F05D7A4C2C15244DEE427A799F5107162C2C9320278260969B94B03CDF88DB9D7F11BF100CC1D85DDBAE95DE20D9AE6C9A3E04345556F5448A6691C454D907621326E0F38F888C482F1B85920AA64C4A5491F35871B3B16D0D05BEF0EA414AA93038A54BB0A6C74F3076898689EC7F5BEB379198662E9CBF29242D69742012DF41C5C2A88E979337E543CEBB628904C994388A9C24A6AFB59FD5857A8859425004200E26673D76FA3116F18EC9E53A6744E8869C672A6587B30E148AE79C4F7AA2B47D828EF02B809BC94113EB8A5946619C4C98B98552D0B6E1AD3CC1F4FE59152411F2B12474AECE35E7EC21CCB54B8E9534D921A1221321201E8040F2DAFD2F187527B30A92F38CD2B53394B17D2BBBC47AA5CD24A9C9074B54F4A5BA6E6230E6614892A52DE879C32DB241FE6904C82B261113CFCF98C4B610253FECAA504B515314038E6C4574FE630241511C639EF7DEBE875E5766AACD2ABBC08711F524A8C02DA7EB5C5B6E5B0787DE47BB94903849201252B53514070D7C286B6E8FCCA889291FDAC5C31A13AF5F752F1B5BA3754D97EADF729694C71250C29F5D6CEC0A100AD920F2816E5D62F1799F00A2824070EFE55EB4AD4F8C3A4100304D5B7BFB7261D6974C67999B61DC932D4E9BCBC5D79DAD48A979C4F350A273F9A9BC8E1099FC2B589CD0AE67019C78D40F0B3905AB734AB0D6B7D62465CE64BB0005FC6CFA9DE9D00892E4FA1320749152E556A7CDC91DD553A8A8A1692B06F2D2C06A395C006E7D21A662679F9C4C082788F0F10268FA82F56AB55F90A35C5CD247CA4B52A2D714B7B689F2321ACC9A9C9CE730A6CA68801C148C32C3EE2D16F0778C8E3498804933798C3246266E20A97294B98A059414E90347A96363E50C8CC58001554BF51E2E6EDD3C6191FCC743658A2FAF2071E7D5766B5558F2FBE527ED1EE1455C107900266061412316B981427F0CBB997C03415F17A6BE75867366926A493B1A37D6BE5D06ADAE76859DD52CD2E474EE32C1F0A51F538001DA5C53408B79F9CE1C7E8A42D7C5318AE80FCC2E07FC41EB7DED0D56B58D68795AD478C469BD61A865EA97954284DCB86A12B94A8CCF76560A607288EBC861F4A380C229A64A0A245B878812D6259BEFB5A149014A075B6B56D287EBF57785AD681A3A24F7B996A843AB172C7D5D33E63882C9E5D27A635FD58529A5E5E9087A2DC55F56E17047DC690B306BD7663F58D4F37A3E9212FE567315A6036EA5F71A8237242779E876BF5BE674DC4BBC8986504B12909041A6ED46B0F3E990A2976D7F98DADEA6CA6800FE1F9421881E12A577845EFF6C198C20BC562D48E05AE62C30B122BEAD56661F88C0252EC5ADB69E11B5DED033152404229DB4806006184904ED278413EFDADCF19C26055885BB4D26E5E62C8A6C0F8EF734A46C662CB39B72F7688C663ABF50D5CF7550100FF006F0276EB045C0E87160C3652400E8A0DEA7CEFCADAD76844A1C92F53CBD2F11A39FE76C294AABA97561CFB1C2E28011B93C26FE73EEC4B48CA9142A969F14026FD2C7E96178C701B7153DB307AC267351D6F279E33BAB8D667DE5437F8FBB133232E9691492936B20680727209F08CF07FDC7FC5B5EBE7E6DD51A96BC1003EFA45FECBAE0DEF78541D8753E98CE232993359E4A054D4A053500B03BD396D0DE70502DC47A837B6A0BFAEDA426FF1357EDF58A983FF00EB391FFF00DE18AB2295A4A4D1EC903EC5E1100837BB6F7D353E821C6875A673421C55357A9A0A8E34BC03DC7D000E93C31B1E1DFDD76537B3C95824CBE1356091C3BECC096F5F187D2DC3B726A3FBFAD63DF2C7C938FB371B1B04CC09DBF1C1046D83D0FC0E08214D3A24AA645872C1042AEEFCFE5FAE08233420099501EBFEFF00BB608236708FEF1F2FCF04119A4013041DBF1F3C10A4BD7C3EF19608523058262013BFE18208D707A1F81C1046E6904CCDB6DC608236F77E7F2FD70411B9A6F7B13B6C0FE1FBBE0823670A7A7CCFE782063B462B4C0040317F4E5CF12783C3226254A590E03B1D99CF4FBEF1B15A1287203D6A5B7E77E5E20F2D720EC715ACD7309D2667732C1370C1EA3766353CADBECC82D7C454B244B7724D9AE69AB72F1A3430E7B9CB792532B3075F69BA7610A53C95BA8471003601441277DA7A461FF66BB298EED06253C4898CA5025D24DC87D85B67B58C577B53DB7CAB20C24C509F2FBCE134E201884F22EDCEEDE31D13ED87DA357982DFCA74D3DC05054DAD4DAE4133133B6F3CCF3DB6C7B47E1C7C2C465E9933A7CB0AA24974D281ECDD5B6F28F10F6FBE2F62F37C54CC34998A12F8949052A2C41A587837956E7A559EEA3ACAF792F56BCE3B56A52D49F1120124F99178DBEF818F5065B94C8C3CB0992896942000484A68E3C398AFD8C70DCD312A528CF99338D4BA91B390F7353CB7F186A6AAA9EA15C35C897366C4493681B0FD70AE33BBC2A7E42900BD38478DF9FBDA253882A62E41A3EADCDC8736DFF1129C934557672B5D5BEB0CE5F49C2A6C3D08E34AA09E1E382A8E71276C52F1D9BA04D1292BF9A61200487A8A55AC5FA5BA43D94492EC40D79FDA9A743D224798EA7CB74ED31A1CB5082F2014A9420C9D89BFCAF78E57C272F018AC5BAC9514962915A0EAEEC40D7587899695330E44F9F9D5F97845319CEA4556540AA75D5F7CC9596D209892798109DA3E4479DBF22ECED38E6A6FA9FE7CBAF9C32C64A0804B8A55F7045075DFAF3222199A6A4AECCC776FA825B48804285E0C72BFEFAE2DB2B289723F6A40DEC29EC57C623A2135D9A06F853DF453890F80A92676100C9B9E585D4A124306A74FBF88A6D56104194E99CE75555213A6A996BA752A1E75C050009BDD71B78B9D8FA623F179BCBC3A0AA6CC609D4338D2C1DFEF4BC0C5DB972F4F0EAFA6AFD83D3DD96699D28DA731CE386B33480B534A0A506D62E76E24804FEED8E6FDA1CEF1989983F4A261924B05071C41C034D81E84D2052CCAB1A9049E5F987FCE353D45731F51CBD69CBD840E1086C253316004705F6DFAF5DE4B26C14B992C623128E298402AE22FA9D0F3E8EC291A4B9CB5900A80E47ADDEFABBF5D6B1057DAAD4142DD54C932E158973E26F1D3D39E2E127F4E10AEE40240B04D88FCF94498410905B47B83F48E5450F2785082A7369402A9923A0373F0BFBF090C5094B69DF225E8E740357341BDBA438952C077B6A3917B03F7685997E83CCB3B2B742D6865882E305B23BD0AD8070C14111CB103DA1CDB0D2912CC85A4294E15C2DE16D0DFA878526619203A6E0BD7C373FCDA2C3C9B485365E90DA1B144BB0571A7EB7C645CDD5C404F381CF7B038A87FACAA624852DC0DEFE8DCF4A8686531205856E096F13A0B023A72894B191A288AAA29D4CE5F605ECC9D4B6E848022452AFC37E612075386989C699E82953AC2AC904A49634750723EF6A3420B5F097E26167BB72A36BB7ABBC20ADCF322A074394F5DFC57334EF56DB2A65A4A87FF00D327F967680784C917C212D6A5A12E8EED350A415711FF00C9891E6618AF1252A3F3120D8F3E81F5BBD8D7AB4BFA8B5B67A453E4C94D2251E1A851A569B35A954F004A948496F807349133279E159587C3021641F92A3E6248772410E7D6DE91B4AC42E6FCA4BBD09B7986B071E7CE1C29346D406CD5EA6CC4E5CB2389414B35416664C2428813BC45B688C2E7109207E8E477CB7A86EED88717342D537F285CA080E4814EACE396AE6A368E10CE8FA55ADC34E3367198EEEA0A96D06CC5CF74652A98DA396FB61E0C3E2A709678BF4C43F12182C2B6E41BD2EE690CA6AAB51C6FB16B015BFBD21054F6888649A4A26996DAFB01B14CDF108E5DE16C1B0E7EFC38465120A84C582B9A2A5414A0FCDB88016FCDC43798B2C00A0AD3F9F1FBDDC98FD7E7AEB890B4B8AA253A09E14ACB9F58E920186E04F4EBCED33232E4CCE10A008A5581296A8EA793F28CC87AB12051F9EE39535F2D621B54F55AD7DE2E8DC75333DF7D6942DC8844CFBA3711CF1228CAF0FC410141E8FF002B5090FE7CE1CC694661510A4D354164A7EDA548E38E6002ADBA6F187A32492082A4A549558BD4EFF7ABDC068C804D8437D4E635C8E22B7839E7C294CFC36FDF538712F21C22D8AC01BFCA0D43B506DEAD625A33C2ADBD47E79C34AEB1FA8214E2CB6048179E299F75FA1F5DF1212B27C361FF00E90E27B800A6A7ADEA6FE42321075207AC6835A968FF00F33B5A26D7F203F7BE1F232F4B8694F4FE6FAE8EF4D2F19EEF9FA7F31A9CCE5B48852FBCE9CF879EF73FB89C3B46014689484B3D680927AB7BDF4C141D0BF266FBC373B9E20589BF9188F4117F3C3A4E015A3807C7E8FF00568D82030715D6BF83086A73C64F0F2DF73F98E71F2F3C64E14CA7E21C43A1F03A73F386F3D0281BA1FA7DE879C26FE36D7EFF00DB1B230E85D801BD0D3D457942299628D53F4E7B7D7CE1155E6297D4DAC37C696E4ABC653131161138728C14BAA480E450B061A6E77DF485D2909622E35FE0BED1F4AFDDF9FCBF5C7C3D8FB350A69D20154C1B6E47CB0410AA0741F018208E426761EB10304119702BA7CC7E78208D2EA488991EFF00C8FAE0823540F3F89FCF0411B5A493C51276DCFAF53821497AF87DE37702BA7CC7E78214850C8202A45E7F7F760823760823058262394E08230E0574F98FCF0410AE99E2C25C4981C7B6C76F7E08238642DC778B913E7F18FDDB98112100D0C10E75CE328A64B40A42DC163D001279FE9F3185A54C9C169972D2A5719E12DA3F423476F6D198E988920CE5CC094A0124380030D5EFB6B5DAD14F6ADED0324D134350BCC6A9B2FF000ACA47109E20091201F302637F763A9F657E1A4ECFE6CB9864F105104BA4D053537AF90DA388F6EFE2F60F29C34DC348988E209525D2AA82DF5372C36778F37FB52EDA730D5D990CBDB7DD4654A5BA16A43CA40E124DCF0907D24DBEFF0052765BE1AE1F2244B5AA4A1C00E38439FABD5BF378F11F69FB779B67D8A9AD3A6196A52BFB8904134A3B3331D5ECEF1D73AD71BA7AC2CD02D4B43A654A528A8C912492A9BDF69F21D71D6B0988952909932E58433024306601BAD3EFB456D05253C53140CCE65C83A53EF5EAD182692AEA1F6E9D8A75ADF74F85E825283CC9E569E640B61DE2330FD22490BBD4D852BA02C75F7687C526629557297B6EE6FF005DE2CBC9B4AE5F92B69AFD46B4BEEA405A1361C24DC02127D224408E4315AC5E613F1A0A6529552012D41E7B8EBADE13485020B11EF5DBDEB0DFAC7560AF6A8E9A99D0D52520743286886C90409E32D9055B082A07CBCF6CB3294AA719AA492B9853DE12E6DCAAD7D186FBC3C97354E012C2BA7E3715F6D14B66B9A13C5078B7B9373E649FDF3C752CB72D421090120160E48B5B97D34D9A1F4BC400003403526AF567FB115F5881E659C2DB5A5B0986AA09E35822101331F7CF9F438B1A244A928E3550A050333E9CBDF3108E366A6600010790343671A9FB38A188DF05754D4A58CB1876B3BD304A38A1324749EBD45BCEF88FC663A5A41248480EE5DBF0FF009ABBD21845CBA5BB17A6AA6C66BA81EE1202568A55133782A100824F3BA76F953331CE809C9952419855C4E412C9E6EF5EAFF48D92970E4B6DEF6FE768B6E9DDA5C9694D164686E97812132128055C22665404FC639ED0045AF0E714A0BC4BAB54A41347E94DB9BC0542A1346A3EBA1FC73F1778A5566B98A56EA89E22A27BC2A215DE003FA649023CA36DCE25F0D82C2A929EF509734402053E971CC5793426651984FAF878F2FCC46DF759AA5296E2BB87A6787C44ABDC0817BC5AE2679E159981E075CA514A459AA29BD75236D2309C32829CDC10C351E2FCF67B33C6DCBB21D4BA96A053E5D42EAE92988151532521295DD2785513D6C77107081CEF0D97527A93C6A1F28A39005B97E4F9484B2A0068C0737A1B036BEDD18068BDF4FF0066F4D94B287AB2A43EF708516D4DFD9205E4FBBE1EFC513B41DAC18A131121010CE1252A724D6CD6D2947E7787489812CF524073B7DBF1CA251515D4B9636942DF699660CD3252826A026D0A5A6EDC4089B99E56C51309371B8A5CC54D52C8D0173AD3F716F768C4EC40018AC33073E0EEC1EA3F976888661ACBBC7052E4B953944FA8F087D3C5549715D7EC94A77F75F78C49CB90B47EF5D4E85874B9F2A93EB0C66E252A040A91A35B7FA56BE4EF0997A775167686DDCFF34148C0054C84F04BC93B8521B50298062E01331C8E1DC941E258BA92DC418B07B56C4977FE61929455521817A7B25D8C6E4651A5F20477C809ABAB45C28A8F89436B1240F4B6DEEC3B4380AE24B59CDC1F2BEAEFB97B3C335CB2493663CCDECCFB7DEB0CB5FDA03ABE063BB4502192A0D77684A8B808DC94266D1B9263961C61A5212A2AE1AAD892A2FC4CE6C6829D1FC61690952487B569E0FF007F3A4476AB3CCC3300422A1E7A6E3C0A2083E57B795A399E92885A1218048E6004BFA0F6E6B0E88704421629B397B8BB969E215B80D2A075984FC663A6D8593894A58A949049A02A0391D9EF5DA1A2C5880799F76A7BD96A348EA7ADF137401C0AFEF521A37BFF005011F1E9B6379998C8921D4B0280923E61E2078D89F48414973415EB7E5D7C9F4736507B35D66E82AFA8B4C81713594EAE29F22AF0FA19F99C309BDA495288EE54B26AEE950D6A2A069EE90ACA414F13EE05F6FC74DE13AFB32D6A1265A6B9C4D5306DCFFACFC3D631B48ED6A9FE67045CF09FB06DFF008061686DA9ECCB5E0134CC30491E33F58A69B6DBA89E5BCF5E789893DB293F2F7814787604B1A5E9F53CDE320136D39C42B37D05DA432543F8621F1D5350C73DAC93CFD7A62730BDADC3AFF6A08D6C4539B80EFAF93504655C563FE6F5880E69956B1C9C4E71953F4C854F741A9A82E017325A49E083D627979CF60FB4322791C4532CBDCA833317E47CB58524A544579B167EBB72FAF38ADB33D5154DB8A61541534E663BD5B6EA408E67893005A7A40C4F49CC654C03854950701C11A16D0DE90B777CFD3DFDE3450EA4ABA54BCAE36EB52EC120B886D54D133209255363FBB4ACA5A2714926DA3DFAF21A8F1A46021E8EC45FECDD6BE4CD0DF53AA5A2E052B304A164925908E28B1B4881899932524710A00185CBEFFCEAF19EEF9FA7BF6758E06A34BD1C46020595F678A7CA6DF87C2313F00A981D20A8867715F0D3A8FC468A92E0907E63EFDB8F0DF7379EB53056224733CEDCE2DB73C248CB6705070BA5C70B7DEDD5B4F04BBB0356D5ED5DFF00970DCE36399D34AE14858F71BF5BDFA75DFD2D87C9C14C4B7C849E63D2DFC7D6125A824B5CF2000F478FAA9EEFCFE5FAE3E0C89885332856DA7D63ECDF02B6F51F98C80099922FD6DB7BFCF1BC60822E232C6C124D40F51188DCD0078A481B6FBF3C1C0A360FE519009B08DBC03FB87EFDF80A14039040E719E056DEA3F3182DB248893EEFD7CB1AC60822E230EE8F9FFD27F3C1188CD08899313D446DEA7CF046E8203BEB1B3801D953EEFD704280836AC66941131267CB1A95A45D43CE36E151D0FD3EB19411B823DD8C7788FF00908D84B59B249E958CDB4154F84988D813F763066CB01CAC010195305D0A1D4465C09E9F7FE784FF005521DBBC0EEDEF9467B998CFC26CF63F86F568DCCD1FD60D85926E7D6379F38C2C852564041E27DBDFBB5DA135BA012A0C05CB8A7BA7B11CD77065ECA96A504800995111600EE4C7EA4FBE42565B8C9DFF004E4A95AD219AF1F8496FC7392967B91A7F98EB476B7DB153E92A0094D436AAA7D2E86381D4A8A0A78B7292637B131F9F67F873F0FE766EAEF71521480820FCC9A1AF303AEBBD75F377C6BF8943B392D387C24CE3EFB8904A14CD60F404DD8F851A3CD6D53DA1675ADEBEA55985538A602D5C03BCB419E40C72B4F9EF79F54F66F274E46512D12010800060D6D682BEF48F1AE6ABC4F6856AC54CC4948592B292490C4BB5FD05EF15AF7DC4AA8654B01282384A884CC9E52798F2F8F3EA32387152871A780B3049D5FE9A73BC56A64D97820650471173F37A3D8D76D1C561E726D3AFE78529A00A2A4AA54E14F840DCF88C8137BCED26D338AF669265E05E677A01A9617BD07F97F1686D2A5CC9F30289294B82CFA03BD2EFA8AD4B88B5159964FA6281140F34DBB5E5252B7400A2D91CC403FBB7962030866E6B88A4D644BB23877B5F7D5BCE2566995C094801C0152CFF004D856DB6F150EA1CF2BDE5AD4DBCA758519093E1E117D81DBE5CEC062E383C9815255C3517A7959BF3EB0C968490F46FAECDFC6915D3F52B6CAD6A7788AFFA788908F7DFCFA4F4C5AF0F9726500B4A78599C357D456BD4D4EB0C660208AD9EBE5B7BBC44731AE5A8A9216093602428C911D66E64587CF12273097857723E5624BB6B66D7EFD61A4C9F32A00B8A372BD6FE2F4872D2DA2B36D60BA8525B5B34148506A9C790503856411C05613C5707EC123699C43E65DA790E995DE00A502129152E342D41E3D442B875A9555BB356BEDF4E757768BD727674AE85A72CE5F4E8AEADE185A8A54A8541132A0A1FBE5B629F9862B158E70A52A54B770805F883BBD08EAD57B43C0A480183B863EEB42FEDA1AAB353FD72A3BFEF14C3927829E0A5279401013B6E7CF09CA4CC4942425C02439AFAD75FC35DF5AA8EE4FAFE3DF266CADAC76B104BCA2CA87D9E19326D13C302F6F8F4BE2C384402DC4013D767DE9716AF8B46C25AD4EC934FE3F30C14ECE735CFA29DB438E2CAA28CB692BE393E2E220787CB8FA88E785F1624A071F7C9414876240A6947AB723E0454BCC2CB493FEE029E166D8F503F3CF78BD7487640F5425ACCF57114ED8E15A10A2078409B8491D472F238A4E69DB43210BC3E0BFDD98974958B0D19CB8F5B3F8AF31284915001A33EBB7E75AD79DB5519CE41A529914997A986587070385084AD4F706D300A9245BF7BF3DC5CFC4E6B34CD993162612E0D404BF205B5FA88426AD09E24A0B00C431BB53C3A52FD1ABCAECF755672EA98D33951553384872AD4EA510956EA09700279EC76E6409C187CA4E1D499D3E695A49FDBD2DA9F01CAA223D731492CEFCA94FA78B8077D192A34C657918359AA33A554D4D6F89597776B2029024A038824279C9116E9B62C38752E6BCB918701219A7050A3EA451F66B5219E226A8872A2FF00F115FCEFF4D2353DABFEA08EE34BE5CD503401497DC08A852845C80EA54A13C883387C32844DFF00F1534CF208524A7E4E12EE47CACFB3F2A43718850601241D5C3BF990D406B4B7288EAEBAB6B5C52FBAA87AB1E3FCC7077894715F8785221099F281D79E1DAA4CA4242414A5800EE1CB6875A59FAD21DCB3C572DD747DFC79D39011CB1A3B51D72C3B54E7D5E9946656E249E1DF6E20498FF6DF0D57325214521D6694009F221F7143B3C394CA04124D34A375D625D43A6345E5A92739A94D7D42C0E0400A4F7253F6AE92649FF6C349C9C62D40CB965080CCA05DC11701891EEF48DD4254A624B93BFDAB6DDC79C66EE6DA53290A19765887B876F11B40B5940FC79EC71B0958C23F7AAB764F9DBEDAD79424A992C9141C989FC81A359B4DA1B9CED26B18F065CC3396255FF10961A7FBE036FB48053C3E5136C61596F7E52A9C998BE1FDACA2867DD8B79DA1B4C9C12A74A80045880D66D8F95A962D467A9D6F9B56821CAA0B077E06D2D5FA0E100EFD0751B0C4861F06245449240B12EAA6E5DDFC4FAD61B4C9BC4CE5B71CB414AB36F0C1539C562883F597999076716BE23D202A047291D6713123264E3D24AD212CDFD8C6B6FF0088F7717856428105B96B777A8F7F58685E6F5C3C23317C0BF35106E660150F2DBCB0F13D96929D52C030A0D7D9EB587108DDCE733490A4662FA60D812BF17FEE3F327F2772BB3126951FF88DA87E95A1DE08554FAB7356665E5BC446E77BDE64FEBBF2C3E4767F0C3FB80074E11E9E3AD057782143BDA066EC94F030CF0ABFE221D69977BC03A7789570C738009E588DCCB23932F80A10B9A03F094A9496A87B1A8F7BC3DC37100588ADC10EC2A3DB11AF8A0ABD47A5F3F6CB1A934D53BC14005B88525926F04CB4DC8F71F7E12C261B31944A70F3978643060A495DABA97676FA43A4A52E4A92EE46BC87DC37214A88AC353F62DD9DEAC4A5CD1B50AD3158D859AA696E3D509AD5ACF8002E2C25AE0DA475BF95832FCCF35CB26138E7C64B531130327BA019CF0A7F7120BB35348DF825ABFED3B56BF41AF5D39C75EB56F60BDA26960E5751D02B35A16E562A1A79B512912A2AE04952AE22DBFDE7A0655DA9CAB14B4484E27866D1D2B4292DCB89403973F50EC29A2A42C00A6A6A5C1E761AB5F4B5A28B7F5156B6EB94954C3F49514AAE1710F36B6C12491652C242A083B480778C752C85781C4820CE96554003A6A497FC579EB68C77547D2BA8F02D7B5E95B8B18D88D44A3E12E0E5042C48DAD63F95F9C62D072C94A0E809376602BE156EA2908AE592E521DAE68F6F03B721E50E14F9EB8BE2FE6131037FBE26E6F724EDE78417964A480C815059CBB74DFF00311D365AAEC4B3BEF5ADAA63EC831F9C095839AE5C94B333823C0398FB38AC4CB510CCF5F1F21D6343DBA6F11CEFCE7CFCBD7CF1212A470DDCEC1F53D2E3EFA4604CE21FB5C0BBF875DE3142547727DE6607E7FBEB87F2C0003D8D4B6DA0FE3AB460254A2A60FC8066E9F9FBDD634024102794F9FEFA7973BE10C4E255254E84710E9CABE95D3988DD0A4CB07BC152D5351E819AF5F02446DC3318C5AE851D5F6D49A563071491F2A405528C697DDCB78C641D71BFB09E2264F5836827FD8FA1C2A898482E1F4D00FA7A69082E7CCAB21C1079D79DB71B5F48DC871F7265C089882426D7F4F891F3C2A99214FC47A06D2EE7DFDA1A2B158B144C9596772029F968C0F58CDC436803EB2A352493C3C1E1088899E106645EE46C71198FC4CDC2377492B7BB75E9CFA74710BE19626907123B903FE619EFAD350DE3AC6D645393C2867879F89447DF1B7C4619CA9D8CC45449587E4EF7BBB7430F26627052407C42001B2853F9FCC294B9C0084A1A8E654E206DCE144193CEE3E7897C2E498FC5B34B5D6C58B87FAB577E750D0CE676932CC3FEEC44B2D562A039EFECD0D210D566F9753A66AEA2999817979B047FEEE53EEF38C5870DD89C74D01C2C9BBF09200AF27B74F5864AEDE64F2B8BFF009892C3750BD3737F43B558B4AB5C69ACB829F39E5236C27FE38E26D731F641F11208EA089838964FC32CC316C89689C566C02155BBD746DABAF48AF66BF15F2BC17FD39929628E42D34F00F7E5CB9C305476AFD9F38E2AA17A96910DA264909827CC71016B8B7E786B3FE10E6F2CA4AA5CE06A482953EFD6A3C7AC42FF00F7D39714F0F1A050D5C1D1FD3760ED788F7FF882D0D48E3C8A0AD6F306CD9C711C490D948812448215D2D389AC97E1C63A4CD48992D65881F32496B55989EBBF368AA673F19B0BC0AE05205C82140BE87974AF2DA3ADFDB07B4AB6F52BD4990BA12A712A49295410152362266F8F41F63FE1FC996B44CC4CAEF08E160A4B01CACCC3C79C70BED1FC68524CC12A6F0B3D44C2D63A3F414DABCBCFFCEF3FCD7397AA2B739AE71D6DC512DB4A595589364C28913E5BF28BE3D1990F67F098342448C3A50081600585EC037D9F78E19DA2ED8AFB5530AA6CCEF382D5048E757A121FA446DB63EAE3EB617DCB0B3E14195151260EE64413CA712F88561B08E1494B8B9A0B7E39379C57933A620325440E4FF9891E53A1EB33CA962B2B12B6B2C2AE25386521494FFD244907E26F8879D9F4A48299412E91400F09D79FF24E8F08A997FBAAFAFBF38B0F31CF69B49D28CB321E05B65252E2C70C8B4925464CFBE397AC28C2E23362672F8B8DFE506A05480D56B35852F405A3604A1D293F2D35F3A0714B6A08D6292CD754B85F7B825750EAAE5478BAF5902DD395C8E96DECEF6695862A993430353A3E9FE29C8B184A612E9726A4DC935BF9DEB110ADCEDD434B35EB0804184FAFA5CFBEDE5B1C5C026560EB4E11577DBEDE0D5D85352A2431F7AFB6886D353E77A82BBEAFA769DDA94A963BF6FC412B04D8F78A10809DCF5DB0D713DA0C3006A904023D8170DAE8046840343EFF00117C699ECC74FE4C84669AC1D0FD7405A3282A50E1501201750608363703F3A263B158BCCE7AA5E1507BA3FF00F7014CDD13AB9A5EAE0BDE0EE65A43962A06DBBEAED421B6D5EF589466BAAA99A63EA8CA114F428494D3D13294A14DA62FC4EA1216E4DC8E2923118325C661A72A6F0AE6AA690EAA96B58924797D291A9412C123A803D77373BF9C578BCD09A82AA263BB0A2495384A84F33E3F3F772EA7167CBF07C491DFB020390696DF61B579428896430218DCBFA0FE34FAF0FB88AE537F5B6D55552927B84B28E1851201E22D0215CB7B731E52AB460E4310B42529152549714AD1DEEE000C6E3943A97C23E635E16A351F4DFC9A2CCD23D946A4D45C35956A19665A98510E841251B11E320FC2F7C52B38ED4E1702BEEE5AF8D6E78528048A740CFCDC561F4B5A58D0067AD3DD7DEA62D166AB44F674DBC8A453559982C27EB0BE12EA82D03C3C09855CFF00A76E722D8A74FCD7139CCD69AB5CA969B24122EEE0B16AEBE70D3173C24012C877AB6E0D3968FCFE91F7B38ED0FB415919165AA4652930BA871C45284B60DC8438104C01CBE7CD354CCBB0491DE7F796763314EF42400E2FAEDD623BBC98B3FBAB7BB7ADF7B56B4B8829F24C8F272EA733AE39AE6C882BA5571A514CB1BA439250B0A33245875BC61696EB5132E5F04A1C244CA7CCFCB46D7534B426EE4B9BD4B9277AB79C32661AD2B985FD4A887F0A4A894A03480F95721240913205E636C3E3292A6E3F99BCBA37DC3460DCEBCF78D74BA7758E7A7BF790A7583E245538529E049BCF02BE7F773C615899520F095849D921CF90B426B524508735A5A9AD6D1236B22D3F91242F3CCCD1595200229D0D91067ECCB648DCC5F975C2B2E6E266B8949212A3498E4335D81A9A381BDE13EF24A48AFCF5F958DC73B56953C9A0A8D5F4F449EEF2ECB9B6985C84AC84ACAC0D89E24120C7291CF0F519799BF3622615ABFB5BE5D2AE030F5AE86D185620243A52CF76D2AE3D75E8394305767B51988216A5B73C924A449F48E47A5CFC04DE1B052E526890ECD50EFE27C06BE702B16433DCF36BFBEA74148634D3A5B2A529C528B907C4A2A889E64902797AF4BE1EA6420B02905BC00F0B7A13F66988C4296C1D9AD57EB7D3ABFD63538844C48EB78FD9F761512258B2436C403FE39D3486DDEAFF00E47D863E7FE1A113E1B000253CE0C739F3FF006E5CB0E65C941A8961B9900D76A59C6BD631DE2DCB93B54BBEFD3FC6D0DEB2DC1F10E8449FDFAE1C8C3A4DE5B1AE83F0DA535AB41C6ADFD0437D43EDB407881E2917E51B6FC8003CFD30F644874B24330D8B1A9D87D07D1A1F609D8EDA7ADF43BEF414840AAE6047119236836FC7CA77FC30E53875357C6A47A53D6EC224211BD5CD9E102204FEC4CFCFCF0B4B9452E2DB6BEF5D6086F5D6A0837F75BF7E779F4C29C0DFDCD6B0FE75B4109975295F0C19DC99B812622DD630EA54A4A920A98DC5439F571D4DE1594A29762D6FBC2571D4926C24F97972E60FAC5F0B1932DAA81AD424026BEA7CCC2BC6ADFD07E211FF0011629DE6E9DC42BFCC980B42949E0E1BC9281CC91F9E18CC934B50BB16707CE81AB4EA233C6AA9E2AF415F187D4EAED47A78368CBD62AB2E77FE221D0878047310EF11DA7CFF00185C56592F10A4AA623E641252504A087D8A4A49F41F58D84D98971C47C61AB54E97ECC7B4EA7A56338A5628338752E019836853629DD588054868210BE251FEA369EB87582999D65E5588C32A64D91218A6471F0950D7E62788F09FC757D84026FEE5313AFAB01D7F160F1D27ED53D9D759766CF2F36A243B9CE975A8B89CD18BF76DEE3F92D95AAD2522676338EB1D8EF8872B19325E127AB827A084AE52D4C52FCD4CEE7F1AC3A9984E1142E0DB571A9FB5E28C7739532D06E83892572971C7014294A4DA0A1705252AF8F3E98EF3844E17152FF51316821829297147B9A1ABF36AF230DD58628F95497357D497059BD2AC07578FB7CC7E6CC4E4005806DE9E2D43E61ED1F5CE5E196E2E583391BB3D89F01EB189415DC49E1DE01547AC6D84578800B685FC391A3FA6FA343D44934228055B7F13B356362131629B799223F3FC30DCE2175E10E2A3416F0AF41E70F654B48AA9403914E7A3FADF468DE4445EE7974FDDFE18DE562012CB6E840F1041FAFF00889191946171B59D8844A61476AED7352DE4238F3E5D712386C32710C10872A346035F27EBEA4D21A63301966041271B2CF0D7F7245B9397B338D8E91C8AC66990B5B8F32DA40995B8DA66378E2509F77CF6C58A47661738A7E457CC47ED4151F161E1E02D57A8637B5B93E59C5C58892AE1B82A4876D9EDE1BE9101CFFB54D1790717F13AFA747083C5C2F24ED7BF02AF37FC2716AC17C33C7E2D295CB9334BEBC2A1434F6C7CB4A9E33E3664181E249321D3AF120BB5F715B6AF14EE7FED67A03254A5392BADD638B2A0F82B578236FB522FD131B62F9D9DF8178CCC4A8E264A900311C697E2D2C5A9CEE5EBA472FED77C6FC1E62C9CB9694B38265A83DF97DFD228FD4FED9B50AE2FE18C84CCC70A84011623C3CB6BF3E78E9584FE9F644A62A4A69FF60150068FCBED531C8B31F8AF8E524A53316EA06CA3A740E39741B98A473AF6B2D7B9BAD28A2A97691B4157111C278E6C394DADB7588316B4E0BE0C61B0801EED0786E784333BB1D0F98BF8473ACD7E25E6CBE2E19B32AECCA50B31F37AEE29D22BECD3B5DD679E89ABD4552C71CCF0855A6DFD2A1E405B6F3C4E23E1FE1B0A18C943501748E5C9E8056FF68E73987C45CFB895C3327D4B8F995D75A0FA72885D6EA6D4C1B729D8CFAA6BDBACBBFC4B71B0D04191BAAFC57DA448B8C5D7B3BD9BCAF0C952E7C89448A25D209D41D1DBD3D1F4CABB519CE68A3DFCD9A18B3A8ABA01567FAB6950CD543459FEA47539551D6562005CBAE77CEF0113C46545511CB78E90621E67392647264AA74C44A4B876E104D4D0301ABD9BF02D12F178E58613D6FBB9A9A69E7ADFC1EE845651E87C9D1943657519854208AA70BAA708524784924A80927918B6E314BC176770D8C9CB9F2E4A65C804143A402A72C6E90430A9603D6AD71A718A4979AA73D69ADDD9BADBA45479857ADFAA5AEA1D212B55815710B93CE6DBFB8822778B8E03249320829480C050003425A8C683D691CFF34CB71B3CA8A96A2E6A2A5A9422F46DC68613AB2B26A29AAD4FA9E4492DB224F1156D10542248E5CB61CE4A7636560E5AA5B04101B4D68EE7F36342C28865597CEC1A9466125CB80797234F5BF568B0B29D2CAA85B59AEA43F56CA5B1C4DB3CCC0B4A130BFB4049239913BCD1F34C67EA94A9723894B07F68762F5FDD7B7E0C5859EB615E6DEC96F3DA156A2D76A4538C9F2C4258CB784A68DD109242478CDC0572DC993CAF7C43E1B27C54D9FC650A01452E6AC7566B060F517D235AB004BB453798E7EF309729D0B53AF2EE5464D899373236B833E57DF1D4320CB5324244C484877A803C6BEDBC6088356E6FFCD652DB6B5D4051EF42413727C26D3F7C7AED8B6AE7C8C2A56164310024380CC2BE06CF616A54C68BE11C240735706DEF5D45625394F66D9D6B071AAFA9596689052B50721129064C85149881EFF7E2979E66B2427BB0B20A8909094953D6CE079D830D2130926C29BFDA2EAA2CC720D194472AC9E95B4D6B8808ADCC4242CD3140012784A55C7C664784CFBC629333078A9F3828A95C176F9AA0D6F46D3D01B4093C229E66FAD7AD621398E64E54BAA71D756F8513FF00C4AF6E63F9009B0FB3616126D8B5E592C4800ADA8C48A0714F76829B7F17E7F7D21A1B0D3ABEF944BE1933DE10525EE2D806CC404999B79DF13B331B879728A54B44B49FECA2B81BAD5CD2DD3ABFC3A41A90E5C317E97A9BFE0BDA24F9668DD41ABDF6D748C8A4A0491DEAD4128F04DFED7018201BEE663151CE339C2489265CB98CA51674B9E2B5481CC55FAC6F31254556029B507A036BF48B9F2F6BB3AD0AC34CB884E639FAC40470B8B097936B1852609B4EC27CCC731C6CFCC674C5913D6845D2789F8C747A30E571E30CE62F841653BDE8CDE1EDF9B346BAEA9D79AB941B654727C98447086D00B676B0E056D1D7CC1DB0D30B2972D45531E6951ABFCD5D4B976B9A5295864BC5292E09DD80F0B73AFDE358C8B4D643DC3950D7F15CD5525352B795C34EB024A968E25257C53B1B401D7124A0B2B4909EE9201E2481FBDEDA79F2686C310A5062E0AAF514AFD4F23A8F04399EB6CF549FE1EAAB0BA758E0698A669B67844C0054CA4131379DE2F33824616521456996EA56AA3C43C8B815D79C1C44EA7E9F48479668CCFF0032EF6ADE7BEAB42F14A9DA975490A693CC84AD416E7A2648F961E2E722594CBBAD60F0A52924121CB5289A8D5AFD6000973E25CFE624ADD1E90D38D9552AD3A9F3148BA57C54FDDAC5F759E130768B58FBB32A5E618A0AE296707C27E5B2FBC1F6A3539E91BFCA9B1E23E829A6FB7DE19EBF5A675512CB6AFE174A652AA642438427902B48936E7CF7BC62530F952070CC5278A6007E725C3B5684B0D98FA5223F15356976376DBEC75D2911879D0BE2719A4358F2AEA79C78A003BF17028FA98FD99697842861C2C1EA001F8B1F1B56EF0C7BE531AD740DEFEDE3686D7F316E80CD5BA1D53A3C2CC4060A6C405010AF5F899DA4A4E116A50253A9AEFB528370D077C40A54EC5BEBAEDE7686D7B3C61CE20D909E704C586C2E39FC4FBB12F270A6CC6D5A1EBF5DB954C6BDF2D550695029D43F5E74FB43554E7BDDF04B89E1331E20408FDC733EB787F2B02A2E58B8B8009A7D453E958511C531C9E55347F01FE3A4352F5118BAC4F5E2E43CFE64488C394E5EA70E9BDEC006F1A783F9D6151289B1F4FE61B2B752287042C73BF103F8E1DCBC0106897A75DB73F43E1780CA22E6F6B7E7F10D4BD48A9238C473F1263F48C38460554F9091B55ABD1FEFBF28C777CFD3F9844E678AA823F98070CFF5723D0DBA4F2B03D061E49C1949FDA45C9A337AEEDF6A54BEC2A7868EEF5DB7FC5FC2C61BDCCD557858B03FD42DBDB7F4BFCF0E061AA686843DD9BC7DF287D1C3599A94092B163FDC3F138C9C2BD8795BA51ABEDE08D6BCC094AAE08DB7079DBF0E5F0C63F4AE1A85C8D09E7BF9B7DA08C98AC0BE2E2500444091B5FF00630A264A903840A5F60078D61497AF87DE335D40EA09E5E216C1DC294A26E1FA7ABF41F4DE148D6DD5B6D05171016372AB029DE62449DBF59C0708667CACCFA5EA2D572DEF9C118A3306AA41432E48120A4836B9B5E0FBC6D37B63656042032920061517661CE96621B4EB1935EA6FEFDECC183E28140AE345424C120F024A9256A1B10A0653C27CF63B6C70C3172A648E032C128550B6828366D75894C0021DC6FD36B8E7F5893E59ACEBF2D6159457329CE74FBE3BB5E5AF849EED06D679C0A54DF885E6D88DC6E5183987F592268C2E392CA44F413FB83DD23E52F6A8DDE25E5CC09F9549E24D68CD53CFFCC513DAFF00B39E47AAE81CD53D9D14525536DBAFE679536254CA9409406F8882E711927BB4AA22F02D8B0F67FB7799E0F112B2ECC662D9C264E28D133C0607880608614009ADEB1B89095974D7705CB0A6FF006E76158FAAB14EF3A0A90E82D93F6004F101D36FC7CEDBE3E20C8913A610385441A00EC29F4E56ADDE91F59F118E9125DD490DAE86FF006B73715684CA72BE9969450321B4B9FF00CC2D7C30A236238C5A04ED3B1C4F617259D3880124BB12361D5B5F3615E55BC6769B0F21C7789003B90459BF3D5A346659A64F9630AAACD6B594388054A05C48D874040B11FBDCD8B0FD92C4CF1F24B596607E53AD99C0A3B781F2AC623E206130E5415350E9E62AECDA86BEC6295D51ED01A1F23B1A969E750141084AD5E28DC120981B419117DEF8B7E49F08F1B9C1E24CB5A58D5924BBDB9BD29CDFC389FC45F8DF8BC9001815A960BBF02C96B33B37AD772CC23AC3ACFDB12B96B769321A314A83294540712E0F230527D63CCDB6C746CAFE0AE2706B42D6851622852696E83DF28E1F8CF8F19E63C1733920B82CB51E5EFF002F1D76D4BDB8EBCCE8A5751A89F7D2A2BE065A6FBBEE42B70A53647174BDF9F3BF55C93B11272F20CD9292433F12013460E1EDE94D22A38FEDD6719985033E7278BFEE56BF9E81CD2B68A8EB739CEF3A714AAE456D5F19932F3C99044EC09DE76F49BE3AA65D272EC2CB4A3B99492033F08A11C9BDD6F150C4A332C7289563660E225DD458EDFDD61D7C43426469E72A882C650FB6AFFCC52AA1C571CF4E2F2E60F98F27389ED0C8CB292C2268D025012C756615E60B786ADA42E764C5466CF334A8BBA95FC91AB6AD48548D25999108A4EEFF00F538099F45183CE07C0DF0F307DAB4628006530AD1CFE3ADC3BD0087E8CFE5CD0C58BD49241F520B06FAF36852D692CC385C76A0329EEF8424171A4C9263FB8191F1BFAE24BFD6F0CA21012A49554B851E66C3D39439978BC34EFDC94101E85BA7D768CB30D179DB9429AAA32CC0FB49EFD904806F04A81EB6DF7EB8653F38C1AD6649242CEA50A6259EE4352D4859385C0CD1C4532EA4172C585AAFADEBE2690F5A734057E64D30AA94A5AA51C4730702D2AB054A6E93E1E60F0D8F989C406639D7E854132144A9764F86DAD6CF5D21B626661301592122CECD4622F46AD6BF7A43FE7799651A5DB396641C2B70A7856EA0788280BF8A09DC9D8EF6B622E463E76366056252A59249E024B002C0D9CF514AF323546768482134E747A57933D7C1DB56A8EAF37CC8D438AA90A71970F8D2A32A50E5C24CA844990244018B1C89F44B27800601A8D6F036D6B67DE1519DCB200501E2CC5EB6228CDEE91B586691C5216F952D959114E38B8812481712AFB5F95B7C490CC0CB04710068C68767D41B6946B0BB46A71F254A07840511BBD2F5F0D398B345A5A7B4E52E5684E6D99AE19580ACB185927BB800B9379B9FEEDE3D6299DA2CC2662E60952145453FBF841ABDABAFF815863889A998414A425EB4F1DB9FDD9A10E7DA95556FA90B3FC9448480610001174A77B81FB3891C872F993129529152410E2A3CC5295637F366CE6A37BF845339AD7F7F52F9AE7434DB5FFCA5E37FB51C246F6FC76C74C9197C844B96A44B4A94C4AC1A11B5E97F2DDED9E1E1153C3B58BEA7F930C748F56E6358DD1D1503952952827BF01400E222E4C5F97CFD31179A6351824B23852402D50FF8B35AD188BCF23D03956414DFC5B3BA865C7DF095B2C2928968A4788113CED756C67C8E2818BCE711899BC082A213422B6D6D4A0D7784E669E3F68E730D45F5D49A4CB406DA48290A6BC00804DE131BC7E00E25F299299A7BC9E1C83FDD5D3636E7AF22E634249A3D36FA7979727AC4442D4C970BAE2540901C4900A957EBBF53FB8C59952E4147CA8482D7A5B96963B0D2EF1903E663CDFC9E1C28281FCCD696F2CA25F093E271415C3732480A1C36DFA1E98A8E6D8C1872A12D40B39A1ADB6A9A07BFE4C6B164657A4725CA50BCC73A790EBE8095374A91F6940494F0A099320EE3CB738A54DCD264D532D642483F315370D767AD74ADDC42D2A6A50E09620382F5A93E57EA2F0B135FAA3533E9A1D3944ACAF2E42B816F1010148062656944D81BCF48C5731B8E9C14AE07984E9FBADEFD758DD7890A003EE6ECFB83A6AD489454645A5F4C334F5598BC8CC739502A5124ABBA7073201503276DAF7C34C3E231B3A6F0AA42F84D2C751CC396D6CD7B4305A8A892FD36F2F65A19731D675B99B2BA64B6453A13C2DA5A1C32361050013E7E7D77C742C9F2CC3293C4B484294CE144DAE4B28D2BA72B690D264B54C2017A390296E6435BC341B430E41936699EBF56A710ED253D2A9257DE9528B895CDD25571B5E397BB0E33DC26070E990254D4AA64C7F9501C820589492CD5A529CC424652921418B26E5C83E1FC52FE32DFABE9BC97C41BEF2BC5C2D456A057B4C1246F7F5F8E2224E0A628B5810E4004D08A3D6E45BD2350417176BD4B8E5B7A1F4864CDF3FCCF38EE997DC2CD352F10A7436AEEC10AB10AEEF878B6047145E4811898C26532A592B4CBAADB894AF9AD66E276F2B3D636330292E406D0DB7D2E756F015A4459C71B6892577EA5444D8F9DF6E7D7DC276560410DC3660EDBB696D81D4D810635AEA7AFBAC37B99BB4CFDA583C5CCF4079DEFEEB6E67A49C9CB8948012FB966D0335FD6F0DE7A0A8063E1D2D5FB75AC30D6EA1607142C2605A1511F0FF7B79E2464654A2DC487AB501A574BB8EB4AC35EE14C75B785DEC69A5493C8443731D44D150E250E70499F7DB90F3307CB13527292C192D4AD3EA7C3F98C890A1FB8172FEC445EAF50B4A9870081D773BF336D8DFAFA5E425654A7608A167A6C18354BEE3703CF412964870D5DF476D1FDBE95860A8D42D7FCDD89FEAFBA76E7B6C6D896C3E50A2E782BD356E5CB95BA3079213C3C4E18500ABEEF4AFBEB0D2FEA36D323BDEB7E2549BED161D7E76B6245193F100F2F95A8FADC1FCF5870DCBDFB3EB0D2EEA141301C9FFEA3637E5C5F2E5EFC381939000EEC9ADDB4DED7FC6B04225E7EDC1FE61F39511CFC893F324F3C3A464FC207FB6FE14B73A7BA410DEFE7CD9E11DE1E67ED91F71FDF9F25464C546881E1414B682B530E246B4A7E34F7E9AA6FE3ADFF00CC57FF00E457E78DBFD157FF001FFDC7F30E23919E36777543FF00EE1FFB8631FE8CA76E1ADEE6DD5E08528CF51B1709B5A547EEE21F2F7E30AC98D886B356C2D4A182370CE9300A5C2379851EB6B138426654514E177F06F16F75F1511AF87BF585EC6728FF009849E9C5D49F3B587BAF384C601418701A9156B3D39EEEC7561A39521C539B2146EAB73BF96DBFDF8D7F46520B259AD6F6FC818215B15EDF1020A44F21CED3D7F51842661D4456D63F6D7D5F94652A29FBC2DFADA5704116BC0249F4F2B0E76F761BAF0E0A5495241705BAB52A5F958DDFC5E49C404A48258BD0687C7F8FABC6F6EA87507FBAF7B100585EC3CBDC714BC664D8CEFB8DD5DD951219E82FE03DD2A21F4BC4A0D8B6FB1B31AF8D8DADAC3FE539A54D02955B40E115D4E4162482D142A03A1683FCB5CA0C0E206390E78595270F3A48C34F40285065814571519943E60C58B067E7123271001704380C09E6075AFF0036BC7BF3AC7B66D1FA494E135ACADD6F8BF969741937E84CF29B1906048C7CAECA7B258D5A920E196F7FDAA0FE83C4F531EF1CEBB7580085706312431FEE1F9DABB1B4757B5DFB5DBF5C86A9F4FA02035DE25C5226564D9264A790E9D37B63B1767BB0AEA4AE7492C4070DFB480696FB0D2C63887693B7EC17DDCF0407019635E43AEC7C2D1D5FD45DAAEBDD64FA9A554D4B2D3AA2375253076E968F3DC6E37C763CA3B1D9722524CC4A12C3E674876E76B695BB33C70ACF3E206378C844D5A81268146A1C9F7F48853F9054370F6719829D2FC90AEFB8CB7175484ACDC83CC7E38B7E06760B23491839299A411C4C86236D3D436BCA2A0BED5CCC7A9B1897FF00885973A58973F52E29C92BB4FA36851C7519B87D699259EE9627AA78879DA6D6E9CA6E5E6F89C6D25E0B80287EF6700F88DCDFC2AF1B8CCF0F313F2E1D24E8CC2B6D35B68D76D21A1CD6BA4E81696D8CAD2667C6A755FCC0911212A16117813F09C292F2CC66255FEECDE02BA049400D5A07363E760FCD2999868892C75BEDD2BBBB6F4168459876AF96D1B455474CC36A1BC14AF6B8DC6F613313E71189C93D869F8801E729955A24B7938ABE9ECB338CC52D8CB4A9AE4077DB4AFB1CE2BDAEEDFABDB52D287596D2926490D2605A2640F88EA22F3890C37C2C389502A9856D5FDA4B750E6BE7D1E1D61B28C5672E161496620170FCEF5B6ADAF843731F685A900977326DA039A4208DB62523CBDDD799B5603E142920140528D4905045056CDE3604D77874AEC74E92FF00EE1009A51886EB42E7AB8A369100CDBB7EFACB8C0FAFAAA5B1C657C2E16529B5AE08076DC0B0F22709E61D959395A4A66A9285D8829009E8EF4E5CEF1A8ECE62921452A5280AB0734EBCFEE41BC4F3B2DD59A9FB4BCE11419526A0E56D2D3DE3A9714A6B845CCAC9E1DC1FEADE6D7C736CF0230A0A829013BB25CB1664B3B9B7DC434998799875042A694AB4049A1A316704EDFC476FABB3CFF0F50AB4FE584A2A8B694D7B9DE71C92014F0A892266C4249DEF7DAB581C1CBCCF10578850013FF4C287EDA005EEEE2DA588A40AC14C989056A25DEF527CF5A1ABECD1515467148DBCAA62A2ED72D478944AB72646E623DF318B6C8C830F2C02569E1BBF981AFD2DD2B0DCE5938170694AB1A8D2A2DA3741D23706DCAF7A8A9A991DED792AEEDB4DC2A6E66011617B8D88F3C63112F05212409C800025DC1B03ABBE9AD74E9AFE82671001449E8C697D7AD0B7A87B7F28D3993E4544732CDD4DAF36E12A452954C2AF7B4A4181B102F8A5E3F138898B230C82A92927E70E3A535EAFD378789C1AD20294B246DA8A01A5EEDE0CE22BACEB573CF1ACFADA9490084D1308F106D3B1FB13B8BDF7F8C4CF65F2D56625467A3F6915533EBA9BB336EDAB340A32A4D0CC0496A3B9BF3AFA1881566A25B74A43A92A75C308812A99816BFAC799C5C96309971212B438FED76F20CF72DCBC28A04952428541D7E9E75FADAB0F9A7BB38ADD4494E699C2D4CE5E921684AFC1C693720494A8F2E477F3931B89ED194132A5B296A042529A8B6A459F991EA2123365A4B15007626F7FC74E7168A6A72ED374668F4CD232FBA94F0B8EA8A0293D482EDCDE763E5CE0577103118F5257892A72E529721AA2EC454EA2BF58732D132601DD825F502876D0B5EFAF237AD734A8ADABA89A9AA5ADC7092E3409086AE6C9E1F09B1B91E5BE25B2AC9A432A6CD02805E8ECEE0EE079BC253A52D052160A5ECE3F9DC74BD617656DA8A85252216A71C84850429504DA660F53CFE42C9E2F1185C1F1095312549B80A17D0BBD6D6D3EA8CC065D5747ABEF6E9E9F58B032DECDFEA4A39AEA1A8029DD85B2D12018173C412411331045E0E2A38BED5AA52952788D1C392D7722E2A0FE63596D33F655B6D3C36D983562734F9837DC8A1D3F40142380BE940213CA78949BEFD794623518A4E378A6AE6710350E77E4E6DB39A6B1998B4A4F091C2545AAD5A3B6C2A3434A3DE36D1E9AA3CBCBB9B67B541E7D10B6698A8DCF310959102C208BFC31178BCB06371084E1A61E00FC6A14096A8D6AF57A7833B33C515A0029716A8D7E9F5B0A8611AEBB58E6D9B32AA1CAE91BCB291A051DF24B60A9239FD94933C3313BEF899C064986C214CC9FFEE2B73AEF434AFDED0D133575150CCE29E429D2B70FE706A4C9B32CD2B1D6689D5D63C149FAD2DC909493241415CA4DB7E13EB737B14CC56598792FDC21C0D05475000724599FD21CA160B82A1BDFEA7CAFD22CBA0A1A0D254E1DCE50876A0890810BBDCC4A245AC36E700E2AD9863664E495E102920B874B87D03A41715FC720E5065A4FCC43806C41D8F4D79BD9CDA23F9CEB87AA5484D2D3A68E9FC4105011FCD02D0A80088E5C5EE1318C64985C5E2262953C2D4090DC4E48E94A5F47F178618C9B2C2992B751A000B123A7B6F07887D5E7A5C3C6F360CDCA94B13BEF1CF6E5F8DAE585C192689D589FA0B1BD6B5F0061B9933420AB84807521FF0087F17FA447EB73E652905A792557949504F0CF2127C899B49C5870997AD4C384814D2A4935FE6EEFA330D5089C43B384D8B1A3BBD1ABA9B52B101CDF5496F8A1C0627FA80B6FC8FA6E7EEB58246553385F80B51BE5D29E36BD34A42467252A62B0145831F16E5BFB3104A9D56A755FF140E136F10BEF1B917E53EEDEC6C183CB0949796F673F6A73D1FCAF0F25CB2B62490E1DD9DC54F833D2CEFB445EBB51B92A3DF0B72E31CFD081F9E2625654A2CD2AA6D4361BBDACCCEDCAD0B19029F35AEFA74888665A91C2A402EDAE6CB11F7824F3E7EFC4BE1F2B98C0196CC2B4D99F7F4F38D44820B3B0F7CDC9F088BD5EA35AB77A081FDE09336D81FDF5BDA465656A0C44B735D1A966B72F7AE5586AF102CF62DC98DCB69AE85E23D53A85DE4E026E7ED475E84CFEEF7C4DE172DBBCAA1D83FF00FB7F9AEB511B09640147275D76D74A35294B986A7F50BC2DDE4DCCF8891CED73E6791E5D70FD3966BC1E9BEEC0F3E7B178CF028E9EC7A7B1B874275039C4AF1CEDCC7CEFCF0E519726A0A1DB71F753728381434FA7E634AF3E7099EF08DCEF73E5BF2DB0E13972187C9C8D016F27F483815B7A884AACF56A375931CC2B693CFDFD3DF8C2F02948FDBC2D761A0A0A836F621442141C949D3EF1C7F1B56DC67AEF68EB311843F4D2FF00E5EBFCC1C497670FB4033C5F270DED3C604FE3F2F96373824B71105AF51F9A42810A21C0710A919DAEC7BC2473F10178E7CB9FE58D5385973094A594D46BB574D746A0FAC618BB6BE10A5ACED6A27F983FEA120499BCFEE309CECBF87E6200480C5C33BEEE2CEFB3C6E3E43F3538980F53EFAC3AB19D2A44B824EDE2DFE7E7F7CC6E19AF06548744BE2A35001EEE1F91703585C4B5A83A524F4F7EDE1F28F3852F8897072E7F2DCCDFDDF2C436324F700712784A8D396F435F2DEB1AA814FEE0DD61F98CCD500F18F5E21E5E639EC797CB117FA79AB2549415234228FD2952F52CF0977892581726C07376D46DBC3E51E653214A06C902E0FDA1E5BC193C845BD1A9C2198A0B52486771B1D76F7CE349A569524B108A574E7EC08764D428414AC137240222E041B7974EB718D664A49490A48200356B68FBBFF9E70B49C428D2DA6EED52DFCF833B43AD354ADCE249516E9AC5F7044A4FF48091E2326D6DB9CEE2B98ACA2522677A164A892A096D056F6A1E8FD686564CC55DE8343B86B54FB6DEBDD07F2A7EB966BB51E68B78995AD25D5113B9B0599BCEDB472E7E6F464597E1788CAC3A54117FF6DADD534E7FC3C6ABCDF3458FF7315354FA712ABB0725F4EB5DA1A2B750E92CA94D37474C2B1E1C414AE35A4A08D8DECA2623A8B47338778693C7300972C4B492001C352D46259EFB986ABC5E22692264C511FF00A8D5C5E95A7AC46F39ED12A92C292D25AA66384880947104C750028DFCFD2716FC176566E2D940A9054DA16ADF61B16FBC32323BD72A0E75700FD4D77B52298CD7B44A36D6A51CE9548A24F1A1495381DF20552940126E3FDAC69EC4E270252BEED5890B63FB2CC694A8FCF3786D332B54F520CB1C201B8DBA1E6CD5D62AFD41DAD65B468529354DBAB0492B2E804F9F093607CF963A3767BB2A7112D972532980705007D40AD35A08B5E579384201980A8D3A790D9DFC2B14E673DB930E3ECADB5B95350CA5D4B0594AD5DD29C0526528078A7948E56C48E65D93C1226C84F7D2E59E2A80D70A17636A72AEE6A5DE27052D2582343A01663EB5ABFDA2AD7BB48D5CB52BEAABAEA976A164A58348F2001C5207196E0083126398E78E9995765B2E19795AA6C952932C70A8CC4248201AF0F103FE1ECD19C1CB44B5FCD2D240342C0F3367B3E9D4421AB63B57CF9756E8C8D4D53381B97175CCB5208B1E12A4949EA2079F5C46644BC164B8D9DFAB216852FE43C25693C2589F95D88BF9178BB607F4C8427BB090A57EE0CCDA8AB7956ECEFAB4BBA27B48AAA734EE5336D33B92ACC1827726092E037B8DFD31D025768FB349E29AA2A134821291216C4B14D592C295F3F04F345A5212124352CA0DB55893ED891689B766DECFDDA4F6919DD26554CD2A8A868D73985621E6DF4069638941442884CA0280BE3CC1F17338929C4F7B257C1296A2C0382A721B84382CFB0B448E5C70EAC24E2A092A09BD284397D6C6F67A8AC7A7DA732DC97B11D3597E8CD2450BA9792539954777C4E3AA0429D8717C4A4DCB9B28C0F28C732C0652ACDD2AC5E632CF73874954849510FC42A48043EF5D758E17DA5CC38735484CD1598CA00528A037E571EAD0B17574798B952FF7AA6DA2106882B88A90E11FE638D47C4A0573F6CDA60784E18E132F3FA99812582154140E03D035D9BC46A6F12D9866024E1B0E65A5C902DD2A7AF3A6A6F11F6B2319957A5145C55554A5C2D494A884A64026448FB26E7CB7C587198708C1A953A67720268A26F7602BBE839C62566A66CB09EE6AD550D49AEDEB6D748BBE82874FE81A46B32013559F54B6A4788A8FD50A93DDDC2894F882B9C4103D31CA55226E231AB95326A9520AC10AE2FDCC5EC0D3437ADAD48C2E7CDE207BB2923400D1FC3A78F898ACB39CD5D6C56875E50AE9E342F8E5203B2B03864A620C6DD77C752C065B2A64AC3B04AA5AD2C4F0B31096AEB53F4BEE86231844B50E0341CEFB6D5FAC4332646679EACD1D0D2386A9A59FACD4AC12921C24A080B1C161CD24FADF1B2BB9CA933921494853948000239DDC97F6CD151527158AC424A4AC242EBE63A73FC345B796690D3D90B09AFD50A45555C05B68BC0526F109907E1D3DFCFB1737118BC4998952D48E3372AA5580772FBBBF95A2F5875265E184B27E7296A80F47D34EA35F44B9F6B2A8AE0C50D2B41BA06F8D14CB6CF006D077E2E10999B7DAB75DB13D95CBC261B8A7CC03BC980099C5524A4101817029A8BE9568AD4FC1E2A6CFE21C5C014E1BC4D34F77A9784B8E3C1F0DB6B72A9D70C70B7C52924F3299D846F3D622E5FCEC5485281484B519A81AD7F3A5045EB275CAC34B4A2704B902EC7424FE3E9BC58F90E81AF75BFE259BBA9A3CB602DE715C2A7109DE128FF88B9D8C030664E21339ED0A30F2D586904F785268976700EA0303AFF22233B438B44C9F27B9E1090A62D5A53C6F5DAEF6898399DE9FCA194D1E94A0EFDE309566DC2A52F8A409FABAD2A32488B72BE39F65AB9B8C9F34CE9C4A492482AB55C7CC4D3D3C19A1C66186C24EC24A2A9C996AE0A92D570FBD74AB0E5A339655A673BCD07D6F52D7C65EF0E26B8949417920DC774950537C361B49911B1C37CEF0CBC54F1230C851EEC8E352412002037CC28AB5DCF50042DD9CCAB2CE19AB9B8D965C5124A5F5A371120F2EA7585359A8E9B4F28E55903086A980E15D42871957532E5F73C8EDE78B4E51D9996AC27793D4AE34A5D280EEE41D9B9162348AF768A4C9938B47E9A7A540289201150FB8366A5F95223158F1CD1C52A9C3B53528238D0952F856A5ED00022D3CB7F29C3695227E0674C13414A41F9490051B525B98D2369C50B912C149058B3D74E61AA36B73A3C8B25D159916C667AA6A92C65691C69A2942145226CA285070C98DC6C79E1BCFCC4AE67712945531F404A438FF0090A1A6C74DE23BBA0012452C2F5AB3D6DEED78DF5FA8F26A40963226C36CB414145208593112A52BC44C89B9C38C3C99EB09131454A2CEE1C1F3F00F71F56137E42A2091B1777636F7D6D4101CDF55B8B90B5156FF0068CFDFB79EC36C5AF2FCB52B002E502555228CE395BF35B4305AA6EB3157BF9B0BD2FE3E1100AED4C9511C64240E28D87C36F9F4E98B7E0F2B4253C294840236AE8C6C37D0FDA23D52B1137198758528252A0540BB2AA3C3ABC42B35D4CD99977C239050006FB41FC39EE312B96646A52D4E93C2F4241E7607E9B3523A6E3F1386958194C8485F08726EEC1EFA9F0E9726BACD751B6784A5D2278A7C647A7300EC63D2D7C5CB099294948E0F9410E0A76B7BDCEF11996CF958B97380482A4A5836E41F33D0D6E62BECC73D016497491267C66E26799803A7511EFB449C0012EA803421BD34BEAF6715B452733C24E46352A4F184859A6843F56DDFAD2B10CAFCFD2A20A5E3CC471458ED3CCEF6368E932313380CB93F334B00534A8F4B8BEB16F12C0C34B2470AB87CFF00C9D1FCCB3C72AB3C041FE7122F038CFE727F1BD8DCE2764E5E0542075007833D3A8D28CD68D00510351B5BDBE86AD11DADCE92A2901C2626E556B8DB97DF389291800E494826971D3D4E9A52D0B212096D05C75B577E4F0C2FE6E9B8EF0C8907C47EFB8BD80FC30F9182096F901A12C45697723A3FD68C21CA659507B253B877360DD3D986E566817B393BF3B01BDED249F2E7F3752F08003F280C6D46E9BD3FCEA61544B4921C13BDF6E51A1CCC904005C1CC8827F318553866D007E87DFA9BC2DDD207F68FC7B6D6B081DCC900CF1C5C8E511F1BFEFDCB0C3A3500F4FF00023532050D4036603DFD3531ABF89A3FE67DDFF763612258B068D7B81FF23E5182F366D304AF6E7E667CE22206FBE37FD089E93F2920820330E7B6FAFDC08732D80EEF878B8A8E0506CFB0D2E3D04708CDDB5184ACDFA9B0F53F95C93388F3D9E0999DEA945DDD9B47D6A7C2EECD08E2BB3C427BF132AAF9C241AB01D76E6232733147085779F3B9F77CA6FCB71872BCB4CE0100708662406BD09D0FD39B5619E1A64C4FFB2A964B1E106951636DC55F42F66781ACDD04C0548039288BC5BF1EB6EB8424640308B334AD4A51735A00FA5F6B7D7589BFF4542657EA0CC0EDC412CE6AE483D3F9856C57000A8BA46DB133D7D48F5B8C6715844E29065A2E2F4B3353404BFAEB48ABE3A64D9B31294A58254D66074D28FE62B5B557B79924812B320F3511F1826E2C6E6FEF386D86C0F7482820716A2AE0396D2A3F1168C9CA12825601F946BAEE5FED7E6D0F9439A24260ACC7FEA3D6D6F758CDFD6062A1DADC02D430E65820F128A881CF561D7EAC62333A50AF754D4B56AD43F4F6D0FECE6D0532E1B40B289036FC87CC72C39C0604A7088F943B397DF4B83E15D75884CB92A5CC2555622E79EA2E7F160CCD25A4CD53F694E9D8589DBCEC418DE399EBBE19CDC2B4D989090D4F3AFABF96D58B062A48084828D9F57736FA1A75DE25F9766A92412EC8B58C1F84FE5F9E22F158321D9246DE7BEFEC0AB06A895F351343CF93EEFEEA369652D7B6A0003CC4DF7B8F744131BC7CB1018AC3109502284353DD8EC2BA8A43F961980B0B8B6EDCBA6DEA7B219EEAB6E95A5FD62B0F0806C571EBCEDF87AC1C72BC364431A383B8097A12C1ABB9603936E213329C38A0BFF817E7B34509AABB4FC8B2921C6EB5282AE3E200970A88D801E254CF48FBB13384EC54B94A0B52425AA03020D5CFA7D1ED1852284804DADA55AAFBFBD5A98CCBB5ACFF00523A6834D52D5D53CB3C083DCBA841262095291C31026E408DF7BDA70E8C0E5AC26A524A06AC2DB780E605232A94A007C8DC562EED67A7F35D233A0EC93B5CD48976AF515635A7A8442D9529DA6796F21775F842C2D25201DFDD87A3B7B9660D6654AC08C42D343721F467497A11AD76891C3144A523BC20F17200FA8FB574A3337E61D99766590A8AF54EAA566D5693E3A5E07D94A9437485A16537DA45B99B4E2532FED1E6F9DA972B2FCACC94AE9DEA48F945DD8A6BB7D22E9829B2152E8D50DC3EEE3E9F46AFF13F649A51B7579369168D414CA2A9CAE5BC5C52365869DE28F3040BE37C4762F3DC462A54EC4E2662F88BB04B04837143CEEE6C4C31CC70A99C7FDB04390CCF770EE6FD0559F68ADB3CF683CC909AC5E5E28E99B69486E998FA95328A78CF008516E7722E76BF58C5F51D91CB30180188C7198E99654B3DFCC40E24A5C538DAFCBAB5838CAB26C4CF530043B3029A9028EF5EB6FE7BE5D867B04FB587B54F665936BFD1144AABCBF35EFD65D69DA461BE14BA529E1515A4288023C33067AC63C6FF0012FF00A98EC8FC38CDE7652BC5A0622528A4CB215319AB555454784770EC87C1FCC7B4B2FBC9485814F980671E8D51FC459751F429FB6CD45452B4F65D54D31DEA4BE456529051C60AB67B98B48EBEFC5070BFD73F64BB95A573D05C3026517773AF07BA458B35FE9CF374AD053C6F6142D701D9F5ABFADE3D1DECBFE8BAEDDBB30D1D4995E4795AC6639B3406A2AB5BCC2DC694CDDA8EF16A32A25425044F4338E2BDB5FEAC7B399EE6527101626092B265B9525290A6770C0286DB1DAD133967F4E59AA3018842B8D948621AA684DDDE8F60F6D68F49EBBF649ED5F48769DA6742E7D95139CEB535634C294E324BAAA26B8EAE405148DEDC660D809938B8647FD47E418ACB674EE20512509EF439B90426C059BABBC79E7B4FFD3AE689CE25A5D65E691FB08FEE6707E9A3D445AB4BF46CFB42D49425ECA96D0A920BA0394E4348DD3052ABCA6F6F43B628B3BFA9BC9938B5CC1352895C44035B24B7ED6E46F78E8723FA6ACCD78592172D7314100D53472295FA9BB7888B7B25FA3E7B5BD1D4119564FF005DCD5D480B2B5B03855104F8C916079100C5F0AE69FD4A767333C2A513310489696484F125C9A87600383BD2D4D636C2FF004F58FC3CE32D724872CDC20B8D03D7DF9C573AB7E8FAF68259733472856DD3298A9AACDA5C615DCA699B53AD0482A9B84C7839D8CF3A8E5DF1E32C9D984A0AC50095CC4A5142CE4802CF476BB5EBAB4BE3BE044FC2E11734C83F2A492E8B53EBAF2B39B4744F2EECD7501A8CCAAB523BDDD0D3551A7714A292AFF2EF29920A428AF7411CFD71EBBECEF6E138BC04AE01C4B9B2819600DD2FC4ED4F2D3908F3F768BB1C8C04F54B5B009514970D50762E7CC7D627398E63419027EA790D334964A10972A470852884813E283636DF9623B1B8FC5E2672153D478CACFCA280026D60F436BE94D6B53728918596B52784FCAEEC36BBDCEFE1B56203579AA5F59FAD2D55255B24491799802474D8751B5B173C065F2D7850B253C5C37200D9CBF56DCEFAC51B138952311C01C241621C806A1ABF7AB6BBC2FC9B4A6739FA9C396B4A6B2F4149AD5BA9EEC2127EC96FBD00AC58CF0131BF4C54B37C48C24E1282C3AC901296502C6AE4394D09201009D00B45C30064AE4B9090403767B0E5F48B532B4767BA3592D102BB3822E9521D514B906627893BF4076F53886188C66266097DEF75243712A84A86A286E6A09B51E915DCE731FD33940248240009607951BA73E6D1853516A1D615AA7D2E2B2FCBA9552DAD5C21086D7BFF002CF0F78142C2C626D18639B63158541938792672A6063303922E2AC091D7AEF15CC3663331934959258B81A07D68D600D0FA3B89AF0698D2D4E56C5334FE6FC278F3499471C183F5720A01E5B743BC1C4365D819C95F7D3B8932D45D726A14AD5B881A35ED53A6CEF33C262B3195DDE1E72D2A01833967ADC569ADEFB88ACF33CE2B3317D6E5456283DC47EA8A49E04BE09F100DA4A528E110088E5318B4CACFE46101C3CACBC84964925D4A0DAB94B91AD7C394060FB2F9CC8529671B3B84D59D41C07A5FC8D3D5A0A5C83526A501971AEE196E097C70994820CC88B408DE60C1F39FC267B83C220CE501C4A0590FA9B86D0BEE2FA343B3956324CD42E6CE5AD94092A2FAD6E59B975E5135A77B2BD254EDB3488455E6CD24F79C5B2957224AA5361F740E78AFE27319B9CCE99C492251344F0B1AE8EDCAE0DFAD2CE71495C9972825949001377207F1B7E62079FEADACCD5E2ED5552997D3B5189088B08E2042222E3A89C39C1654785294228F43725DCDEEE1FEB5308124B925CF3E7B69CE20799EA4A5612820043EA90FA7886FC8CDC13CB9F9EF8B7E03252A524A935A55BC0D5C3FF30D4827881AD68F773FCF8DEF15FE6DAB1A1C44293BC0F101B9F2B8FC63D062F797E48470B259AF4FAD74F65A1232DC07152FD1BAB50DFCAF48AD33DD521CEEC36EA418513E21279D8137B6F63E6631273302A9588C3A384B2D55A74BB35C1D3A8112D9765C898854D203A6ACDB68F6F0B6A62B2CD753B8B2A0974285C1215BC7483CBE5E7B63A461B2F9186972D53120384DC35C36ACF43CBAD0C46666B9B3C2D087570529CAD61BF3FBC40EB351BA54415CC722BDA3AF3FDFA9167C365F2972C2D0010402384392FD1F573F8A46BD9533533D52D692C540317B3DAB7BB50DF42C222798EA074951EF02A761C516DF91DF636E9B6109582519CB41140450587B6FF348B567995210A93338402AAD03EDA003DDD8C44DFCF5D244AF7079DA7EE9371FB8C5AB0780EE9344B95004783BBD0BEF7109AE4714B4252C03063C837D3D5A186B33C74AACA2520112153EE1D27D2F7E5B4ACBC1AADC229C8F4D05858EF51D124E1406E2A91AF95181E5E3CA19979BB8A90A5445C5FC8F9C74E62DD36C3C460CA4B101EF4FAB51A95DFAD4C3A97877341437A7F3EB0DF519BAA6CB85007FAB7B7AC7422FD075C3B4614901869F96D7DEFAC3A12000346BDF573BF88AFD2A959CD5C5154ACC0E40FE33E44EE4018752F0459CD01F60D6BE1D616461F4097D6B46E752F4FBD0462E664AFEE5DA62F1F8DFDDBE161826B26D46625C697FA53D046E70E59CA03757F1BD3C5A123B9829444A95F133CF19FD116A20F93FD49BFA368F5C770FFD8EDE2DEB1A85728FF52EDB9981F3FCF18FD1285D247FFA47DC08C19005E581D7FCC62AAA539CC9888337F7F23B7C2FCE709CCC44BC1944A586E270E457F1AB75A68D0BCB4265A492900914047A83A50EE2F7BC02ACA08014491B9076E77106F1D63EFC48A1099C90A0C41A8E6799A6E2FAE9681299D354000A52491462CDD756F61E35BB982D447888BC448BF49DB9F90DF0D1139026141961206B7048FA0D776F387F3B2E912A57794E221D98120F9BD6DB73856C3EA4A544ABC46F79F8F9EF617116E9853152D465ABBB62520B10D40472F7AC442FBC532524948705B67EB407939FB70ACD5482471F0DC820AA0D89E46E3DFF007401179361A64C9738CD4170A277B13E54FCB40BCB810998104F139701F913B52CE2D0EACE66B21104C9DA3981B91E97F3B79E1A6608561710084FEE34DCB03777D3C29A3C3544B5E1C28005B7D00DBC2961E20830EAD666E20825563E640B4F537F873BCE1BE232F4E3D09F95DAACCF5FAE9CFD68C710833ECE6C4DCBF81A79EDD19EA97355909E254CF98DE663CFD26DF18D3F41DC4B292914140DBD35D687CFC94C1604A5567259CF2AB1A8B575A8DDA2434D9A2B652FED6C26F6EB11163B5BE2710EBC110B52B86A76A86B0B1B736DC6B594C4C970070B90CD5FBB816160695A0897E599A2E5202FA589DFE307F1C4662B04A20921CB5473D77E85F9814868249492FF002BB102FEB6F7B3458393E64A58582AB2787FAC1FBFDF7E5CE3158C661BFEC2F5F99ADE15D7A575AC2A896439BD9852AC4BEB1AA95BED3BB4FABEEA8D87E8E8DC5417950070C6F0A026C3CEF3BE2898C9F86CAD049280946819C54B52EFF61E6A892AA0B3EDA791A7E62C7A0EC034D64094661DA0E6C9AD7C80E53305C20A08BAC10DAC83E844748B6206676B26E2499584415D6ABAA7836A1BBDAFD79EE24F0A5492C4534AD399AD1ADFE21C337D75A5B4C512E8B48B5474CA690529714CB6A5981B853A8E29F7CDC1C3CC364F8DCDC714E0B592494B3A58DAC3E9D7A46BC0EE52E0747B5ABA30D472B475AF51F6C59AA96F2330A9714B54FD58A1E5251CC2A1283C207AF96F8BFE43D84537793A4F11A28F121CD37D69D4EDD59CFC3CF5AD250E438AFA5B93781A36FD6DD55AFABAB5E73EB4D2DF4A8F857DE1B0246F17239C4F43EBDA7B23904AC2A4A512932CBFEE2069C8B52F5163CAD6DCA708B0904A8956A2BA695A3F5A54ED15C6639A3CD394D58BCD3B84A43850C4779F68006402608F39BF96D7D3819331425094028302A34E27346068D7A5A2DB86C38580172DC9E16511FB18EC68417F30D488857EA6CB154F507EB1F58AC514F842549248513204401CE7D7A62A7DBDECC77F92E289C40C30EE54CAE2BFCA6A5886F16F48EB9D92C9F0D3D72C280D2AC391A5F60DA72B47E80DF413E62DE61F47FF0064E92D04BED8CEBBD709971415992C2428993610624F4B5B1F9B9FEA872F9B967C4CCF659C519E81353C0B27E5A26C1C90EFE7A47B93E15E5F87C160125084A8D2C91CF46DB773473B47B3A0212121490BDE2C3CBCA4F203D27738F33489C661583352E08A3B372BFB6DE3A6E63DD95A099009E497722CF46DADBEF53AEB94534C5688111E1005EF1BF972B73C45E284C9988969188FEE70CDB8D8DFCAB611218432C4951320370A87084835E122AC3CDED48F25BDAB2B6BBFFC5E7B3204B24203FA9803C3B4D322796F020FC71DE3B31842BC927A913C02657CC2F50926B6E82D51CABC1FB50A9433843E0C319AE0B3595436D77FABC7AB54E7868284A129054C3455E1927C099E53F198F2DF1C2F379B8C958F98254C51489847083407888D7DDC476BC8F0D859D97CA54C9284932D2C0A43DB524736AEBBC2E14EC8325092B804D85CC5BC85B903EE8C4A499D3D5201571061B9A96F0D796BA188E9D81C01C67089681534606CE76DCFE221FAF1B791A6B3BA86929E16B26CD14E3600F19144F70DE0C41BC5C6263229AF8AC3A66A8F12B1128A0D411FEE0241B1F173F730DDB6C1E1B0F934F9D2A5241125668904512696DDFC0C7C74EAAD78F54E7BA8E85D2AA7E0CE730484892920573C36063D3A5B9463EB17C2DC189F9560F8940FFB32D9D8FF006063BFDC9A88F8FF00F15FB55FA4CE3112C0349CB000A37CDEEDE1486BA4CA737D595F4F4F44DB8780F0F72A96D3565C8BF784009E1113E2C745CE30586C1CA56257313FED8E23C243F9024B1D5A9CC473BC1E74BCD148929155B301FF00736BF6E717552765234BD3B75F9DE4B505D653C6DB050EAD92A5899FAD2525B3C8DCF5F7F3F5FC43C221472F958D4495717013C40A85588E17DAACC0EB68B3CFEC362E64838B3216470F1F10496B3D4FD47942456619FE7B52D653434DF51A7A7E24B25A42528602A64ADC484A5E9E8A51E1B6D189B09C0FE8E6637BD0B9B39214B593C5C647ED29492787C39C73A9D8D9F84C5FE94B8659480EC4176F176B7D3495E4DA0E93295A733CE72F7350D7892EA69D2E28B4A3211C4194AC1DC6F698B6397E6FDAC95809CA9499E996A0AB93A38DF96B70E6F17DC0F62B159EE1FBD44952F892FF00B5EFD0381C9FC18D63BAA6BB33A52F36285DCB929FF84C10A6D6DA0C9F1029413E188E2FBB1D0BB199A65F9C4BE35AE59596FDC52A0A7A30AD35A6B15ECCFB233F20528CF94521C9A829147D2FF626FAC41D9CE93528465C285FCC2BEB894B496CB8A51524F2080A1CC4DFE76C5833C9596E5E8562A6E224C99680E949524F16BFF2046F60748D3229189C4CDE091215398B3004DF981A0EB4A0DA27F94F6579952B4C669AB296A68D2EA92ACA2816CB8555414A1DE0052906DE1DC1EBB639D27B7B93E2272F092FB92CE933810784876241BBB72D758B566395E6D864248CBA77090C7E45077F0BD28D485FAF2B339D26C50D3D2D3D569CA5AA491DFB94AE3A1C4881214E204483D441331CF1BE1E6E0313350B463E54CE253F0256950AE84051DDAA2DA4404ECBB16A92B33B08B96C29C40D05DEA01B7F9ABC52BA87508CB5483F5AFAD3AF24A9CA82384AD452083C3B02276E73B6D8EB192659271B2E5F772D20331501C54F01CBDD445352489D312F54A99A8FE1AF3F08A773CD646566403C8CF999D8833CAFE7B62F597F66CF106451C3A9835F636DD85DE1624E9E5BFBF22D5D08ABB36D53F598E2708E19BF15CF3BDC7588C5F703D9E4CB0974D5AA1AB50CFD4302F4D61CA5254453AB69D3D748AF735D4083C52E1EB1C4479723BDBA7E0459F0B94A5000096AD9AAF46A9F51E5A0859325C907A3EAFC86BA7BBC12B73F68B88594778A01690F178A031C40832926153CB7239DB1B4CCA0CCC5E1D610084A9DAE28DB126BF8D5A27F0004AC1CF0402AE1B9069422C76A5BC225DD957613DAE76E4C6A66BB23D3CEEA9AFD32AA75D586AA50CF748AC2A578B8C904700306F611BE28DF1A7E20657D8691949C7CF460A6630284A429871776520B10D5F017D5A935F0FF00B213BB4D371E65CA54D12880CC4E86DE5A7A5E2A0ED234A6A9ECCF5256E92D6B96AB28D4D96142731A353E1D5214E242D01412400384F2DCC1BC63A07C21ED3E1BB5F942F15879A99C829470A8317770C0FA59C6ADAE734ECA2F20CC528992CCB06654314D9B5F3E5A456157992493E2DC5AFF0018F5F2F3DA71D6F0D94A44D9930A5C1219EB6B7AD6A5B5BBC63B440A9186421AC28FC853DD7EEC6EE6095ECA262473B4F5E5D45883C84626E5609291448716E54DDFCBFC4472243CA4921E8ED5E5D1DF52417D4B59ADEAC02615D64933F21F77A83E4E9184A82534B966FB9AF56E70A230E285827A56DBD6FB3F5867A8AB4920F175D89B8163791E9704FB8CE1E4BC182430706E763CAE6E21D4BC33800077D68D47AB1B7BAC372EAC6FC4608224EDD391803D7E18708C154B80E19DCFF3434E7A43A1863F2B33694F47AB1A7836CD1ADBAC4A64F11B98DF90F79E7875FA5E160DE94A575377D7F98728C2392784BB6DCEBAD2BA6958E175A08038E7717206FBC926FEE8C6C9C3D4FCBEFC2BF6854E149B20BEAFB741BB743091CCC1488EEC933B9E5E5CCFE07CB0A8C3B8A8D742DF5F41A78C6461535E2A7D69E3CCEB78D5FC51FEB1EE18CFE993AA5FA91F983F4A8AB971D2B4B5493E8D0E1495DC6CBAF39501A5330024A67BC0B3004F2F5F7629FDA0C1A5536532C4B636B95390481A3F87DA18E230C7BD972D128CC4CC77502C11C350E357BB3E94A9A6972ADB5FD692D3A9A3701680A92A0E719598F0B64C6C48D8F2E58C62E72725C21C4E226F04A4A38895960400F724742DB30D00E83D9CC8862F0DC265712D88059F90637B30229BEC0595A6FB32D55A9F2ECCAB729CAB32ACA3C99943D5D99268AA4310E24AD04ABBBE048B45947DF0239D4AF8A7D9AC6E3D3814E3F0DDFA97C28477A80B2A70FC20A9CB78DCC2799F6233390B33132D66597247012002F5D74E86915A8CD2B5C72A51564D1AE956A69B70A78CACA1452A1C02F3298163E831D6A41972B069C54C295485238CA8AC335DC9A7F2D6D4B5C1F644CCF9420AD6A241604104E9677E4DB44F74B767FA9F57E5B579B655A7B33CD90C20BB595C9A5AA699A64B61452A24B45A5029178200FBB94E7BF18BB39946612B2EC2E370C674D982594098877E262C389DDDFC9EC4C4F0EC2E324CA066CB522500AE005069A9A8A914D6D5862A2AA4512E9DDA9571B8D2AA1B5B1B290A6CA9041024CA488BEF1E78E8786E1CEF069C62450A02D2A1FB4821CB69C874A450F39C957852A48B28906837FE6A07D840D6726ACAE4F025B24A5237B93631723DD699DF1A6580778B92AFDC0B01D1DE86956BB5DCDA2BE32C095213FB9CEDB11D79B72F0872A7AE91E9E67EEDF6B74E73D5FE2B0CE8259F930EB4F643E90F4E0061C0570D5AA6E3C5EC6E7D22434398250492A2640B93B46FBDF975FC0E20CE1DC9252C4934059BDFE68290C8A4CC253A0D2953B8AFDF9F496D06669041E2BDA21476F8EDF7EFE586389C30AD03D6AD4BFB6A168D152002771A558F377FBFDDA6995E6A94A95E3224833C47CB6BFE43CF6C55F1984624A8380E053EB4D39E90D94185410A0F4AD7A731EEB48EEFEA4D77479252AF2ED2EC314A96D250A791DD83000BF88024983B6C7CED8F2FE5F2B159ACEE2C5256A5ACFF00738034B160586A767021D9E15324103503DF58EAE6AED6A97D6971FCC5EACAD1C64B3C4B09428EF1E2298B721237E738EBBD9EEC22310D366A42258296200A825BC5A8C45EB58D84924EB7DABEFEBA0A18EBB6A8D522BD4B4BEE2E98A49809528CF99E1D86D73C84D8C476BC9BB2F84C0CB4A932D130001D4A6480DB0259DF97A429FA550A31074E7BF4D5B72F78A8736CCEB9D5B4C37DE55074A934EB6817140CC1909E2373D7CF718B94B5E53859478E74894784BA0A904D05831D0D1EBCDA2CF91E5986C413FA852659A37151DF968F4D236E4FD96F6B9A9DE42729A15AA85D23C6F06D9E14AA2E7BE00C409EA7A6D8A3665DB8C264EB599684CE0825B816C684B38483ADA8CD56117C9794E0A4CB79650A0055A8F461F5A569D69169D1FB2556B259CC3576AA6B2A091C4E5325B6EABBC9890436E1E189FEDBC8E98A663FE3263D73E5093819894F1101B88155280FCB6E76035BC45CCC74B9426489412A3C4385419C005C80CE4BFAD75A0794763DD87E9FCC5A7334A819C901417097D89213127849893B1DAE7A5A37B5BDB0CEB3DC8B1457266E18092A62144B82935A00CCCED4E82B16DECE674AC22E58528A7898026868DFC0A53CA3EE03E86DA1D2543EC5FA019D1F972B2EA39CD4477AE3A14057AE08EF0DAFD2C2DCB1F017FA8F38D9FDB8CD25E2F11DE244CFF6A802925892E412A3CB88B801C56B1EF1F837987EA700389355004A8B905C13FE45FABC7ACA84A9284C99266474B8EB279CC4FCF1E5D9397CF13261134A413B9AED7FAF5A476AC5CF4861C1C4776B0E8DAB7DEF0933104A50A0762094A60D8103AFDC0F4E738DA4E0569C54B0B98684B924D6ECD5DF61A7587B839D2CA1654001C35A5A87F9DDAEF48F33BDA9ABF2F4FB577B32B6E368EFBBDD4BC20800ABFCB372424DCC0E9CB7E98EF9D90C2CC392E604ACB2658E100D4D0DAAE7ADE388F6AB17874E71292A97FF00E630346FDC2A36F623D30A31C6CD3AA3C219660721FCA4C5B9CDBF1C7259B2509C6E256A524A8CC3C2EDFF00222DBFDFC23AEE5B342F2D9440E11DDF9B871F9F17E71B908714F49802E77E97F81DFE6061CAD52C4A60CE41A02CE1BFC7973AD6E5C9C4AB1C5452A090B2C482C2A77FF3D4888E6B2E3774AEA26511DF2F26CD12D091E22285F88E5BFC46F8DF2B9DC18FC299859A721A97216920817F5AD3AC3FED6611589C871A07EF4E1D756FFB0E9E6E7E8098F90FA6ECDA9EA7516A6CD357A90C3633BCC56D78924280AEA8200283D2279DCF4C7D2EF869DA6C5CACB30DC1296DDD203D69F2800DAAC757BC7C4BF8C792255DA1C50E2048C42C5F751D743F4D9EB0E8EE76D51D7B74FA66943CCE5EE35C4C349F155265370E04F123840B998DE77C755FF534E272EC7E2312A2B9E994BEEF8C90124A486E13436614A748AD64395230D9865E388042A6238CDC5D37D1A95D478D7DD6EC934769FED6FD96E82B337C929575AEE5B5AB7A987766A5B5529594F13E91DE8928B49079729C7CDDED676B731CABB6D394A339027E300487504B05B0205850B9661E71F47724EC46599C762A64DC22A5CF9C8C239084A5441E07A90E0171CCF311E2EEA7CFC653599E69EC969052A72EAAA969D4148EF29D21D73861C52429C2A026C48000EB18F76763710ACC7B392B309DC6168C2F15492144CB35634A31E6795447CD3EDD65389CB7B5E70AA92A42558C290188FF00F319B9F869ADE3D58FA3C3B28CA33AECE6BF5BEA2A76733467A406175C84A52834CF2DA50497A5224DADCE37B63C55F157B6389C3E73324E1714501135695B176F9A9A1F1711F48FE057C3CC366191CAC462B0E95F14A41495258074814D76AFD691D5CFA403B28CDF24ED3720A9D3540D51E4DA8BEB7F5B094B6DB4D2699A4849E22129209322201F3C760F81F9FCFCC30AA973318A54C40485A8124BA8D280DC78D7CA391FF531D8D9191F02F0B2C251F31570A40A029ABF4AD746B8887FB20F66D91D476B9A4F2FCC6859CD65756AA84A825C4A0A5A2B4F1C71A45C5A472816C4EFC699F9865D951C4A7319A014FCA975077206A473A8D2F1CD3E036024E6B9870CBC1A715C0B4F79404258D5FE53A0AD7AB5045D1EDE1DA9E96ECEBB5CEC972CA3A0A5A5CA74EBB5EAD48865B42B81B710D2E9F8D9420A956981C2666D8E19D83C266F9B23133CE266290B4A9D64A884B850DCDDDEF4A9348F58F6C256478491264FFA6C94AD80092948515001EE01BFE2D48EB97B607B5EF62DDA7685CBB28D06C37519BD2D3210E3832E76894D38037C652A718471EC762769E77EF3F073E1B6759A6638B9AAC74C9B2913905BBC2B48471925FE62D4E8ED68F3F7C431809981693804619625AC06481C6480DFDA34634DDAB68F22739D68BAB6D0E0A97EADC1DE175A4D33884B026C0391C2B1020F0CC45F79C7BFFB3D84C9F2597FA5C462E4255292848599882A5961C4384AFE562750E4C78F8767F375E3311311859AB965648012A00004EA017E474F28AAF35D4B59561468E96AAA409934EC3AF8B1DBF94857A72DA0F41D07099B767247089B99E1D0542814A46875756FD7CE26B0FD94CFA785775974F98CD6428EF7F969E3E1159E61A8AA0294D3A87699E132DBE95B2B3E5C0E2524C499F4BD862F395E2328C6B1C262E4CE701B8549376D028DDA8FE71BCFC8733C00FF00E6F0B370E752A490EDC940575D85DACF09CDF3DA8209E3299B03313E9B4CF31E91899C5FE932F94666216994801F894C186A5DC7D5B5D042984CBF1189253265296AA330249F2D0D869E31147EB2B5E6BBC3956695C82470FD5A96ADC41837975A6CA52204DD5D205A04049ED7764D13C22666D8497312AE101531018920070577EB4899576673DEED43F433D12D49AABBA5916A5386DCFF0088FA24FF00C3F34FFC4F38F69DEF288501A4A6D32426A521C5A78A9DE3F65E128248E8279EC4E3E6C7F5FBDA5C0E3335EC649C163538D4C95E278D522604865AA5900842AADB97F3B7AD7FA5DECB9948CD5799A4A030215365F0E8AA7CC0077F2EAE23C90FA4F9F799F6D1ED756B1C2555196A65238504229624204045A2605EE4E3D39FD1162A7627213278569C3A254A290B51506A93F329F9EAD63AC56BE39E5584959AA7F4265CC5198A7086705E96BD741EA1A3CFB62A6AAA96B14ECBF544D9229D972A15249E4D25667CA3F1C7BB3199FE43810462730C348EEDF8B8E621268F4AA9361E6F1C1734C9F3198A93C7849C525B80842D4EE06C08D75DA123D499CD2F78E55E5799D2B523C5534354C220EC789D6D222F3BFBCCDE1307F11BB1588C51C3CBCF708B9A5410940992C9772187CFE6DE10F53D97CDD3290AFD0CF08E176521428C1B4766360073B4332EA9D75410D256B52E7850D852D4A22660264FC26224C62ED3331CBF0D253899B88968C3A805A6628865248705C9666E7E17847FD1F1B2D410AC3AD2A51FDBC25DDF52DE97F186EAA5D43062A1B758528F843C85B73D63BC026046D244EF8532ACF327CD57DDE5F8C953D4925C2169241ABBB13F4B36D0FD792E370C90A9D8698806A92524537A86DAAFBD748481C71E3C0CA5C79667C2DA14B51F720127A9306D7EB896C663307974B13719391211565AC8F17A8F74D61F61320CCF1C954CC361664D4A3F7292951677BB258D053ED78D2E9A964F0B8CBAD2B925D6D4857C160131CEC7E186D97E7D93666B28C163E4CF502C52852491D589FA427FE9D8996A32D72D499828A0526EE69B0F7CE13A5558F71772D3EEF0DD61A69C584FFEAE049299E40C4F2C3AC666795E585031B8A9520ACB242D690F6B3900D4EC5EB5348772F25C74D415A30D316848752824F08BD7F6BB53F98D68A9712EF74A4385E5FD96D2DAD4E123786E0A8FB87CB0D319DA3C87052933B139848932D41C294B400433EFEDE12939662F1333BA91216A5A4F094A52A517766A5AADD7CA1CCD2E6E96FBE5E519AA59DFBD396D586E3AF7859E1F3DF11586EDD76471733BAC3E75849B3096094CD412EEDA178959FD8FCFF0D2FBD9D97CF972D9F8952D6CCCEF61A08D2DD653394D52D5532424800B8A25B2D284C4A6CAB9226622DB8B61CE6B81C3E3A4A71D22705F7693351C350A08054E5A961476DB788FC160CAB12996B4578825448B0763D3A781E7ED87D1C5F46D7651ED01A2D1DAD76D5AE32BCAF4AD3B89A84D1D656314EA7514EF10524FD65A7374581078B90BC1F9A5FD527F5419DE4017D9AC9B289F8A9C53364A972F8C04708677082F67BBD3C63D37F0FBB2194A9289D331929165709625CB96297D6DD23E8A352763BECDDA0BD8D7B435762D94652FE4C9C86A1A7B3A453B6F2AA1746D3EDA16DBCF214A212E20DDB70C8E626FF363B07DBCED3E63F12726CC733C5E310538A9B351853366A59D5C452A4F1071703886CC184764CCBB37835E5AB972F08853240337841715AD459B5F5BC7CE37D1D3EC0BD9C7B4E506AAED5FB5CED2B2BC9F4A6439EE60E1A2AE14F4A5D6D19A54A3BB014FB4E2802D40213B444E3E907C52FEABFB4DD9AECAE5D91E4DD9EC4E3F159AE0E64B13E5A9694CBEE258E251504101C56A43E95B50324EC4E469C619B89C6C99650B1FEDAB841249B00F4AF237D9E3E9B321F67CF66FD2BEC9FAAEAFB23C9F24CE3237B4D66ED8CE986987455B941495282B4B8A42D40A5D41921773D6063E6164DF157B5DDA0F899819B9862317215FEA282252D7308495CE4F121A80B3B07A8F37E87DA3ECCE00E4CB99859289A132DF8D207CAD7AB5776DF5A47E7EB99553CAD5DA81FA670AD946A3CF5A4B53E14A5BCCAA5B09126200004011D06C31FA51F85AB389EC06553B17F2CC9D8294A73534969F534A3B11D23C5FDB3C261E54F9C94949505101340CC5BCB4D3ADDD61A9E179C360A20152428409120743783F3DF0D64CE50CDA62250E24998C4836A9B36F5F50D578E6D2240E30E011FDA4EB537A68DF4BC2EA5AD22C5422473E91B19FDF3DF17B9D870653B7F66CE6CFCABE5BBDE15CC30EA4C8701C0069D28F4FCDAD687715CA44428136BCC6DB72B72B73B46D18ABC896A993660092C341AFDC59ACC1BC62B3224BAD4EF7DBDFB2D787EA0CC9700C9E5CF6E5204D8F4F913CCC46195574B06EB7AB81AF8E9CC18DD72D9C1A8FA3F5BDEE225B419A2E6EBFEDD95B79DBDE3DFD6715AC7619469C06AE280F4FF01C5BAB329A9B38FF00D5CEB4B794762B54E6C071A83A41333E237F58DBA5EF7DE71C7A565D225E253C12921883448152281C6D51B4339649559857C6F7DAAD7D6281CFF365B6EB4FB0A9711DE44999E4678A6C7AF58C769ECFE110BC1842C3215C2EC360E2CDE21CED13786AF8375E9EBD1B5178A7EBB33ABCC332397B6477F5B534F4EA240801D712824721014762248DF125DA5E2C2E54461D4A4044B515106AC2B73CAA7D889895278A6254A4FC86C79B0E5A901AC3AD63BE792F641A23B2BCAB2CA9CD69855E76ED326AB89D4AD694ADD6D2E8B282907EDCF3DA48031E5F38ECCB35C73E1B1737F4FDEA90085AABF310AA39208E7F888CCD676264CE0B0B29516A804381414040EA79B934AC573AED1B387EA1C6A90B34797A014A034869A21116FB294AB94FAEF8EB196F667032A44B99350A9B3D41255C4B591C4C0BB17162697DAD161C063316BC1CC2A9A543828EEE457C6CEFCBA5285CF359E62BAEA86E81D76A5E724A94BA8500929499E14AD445FC85E3DD8B22B29CBD6A92956165A96183809716636ADA9EDA23275CD5E3546628A92A5901DCB876677E74F3A98AD6B350D7BB46E2EAEA453BEEBED0727857094BC018BF4990236DB1359E76764CCECFE365230E90A561A6540AA7E451156AD3DE9178C405CBC5E0FBB0CEA4B80F40E9A96F36F311F6FF00F44CFB487627A07D8CBB31C8339D5749499930D6646A43A8292A5AEB0AC0054A093626627CF1F9D6FEA4BB1B9D49F8859DCF5C92705371044859500ECE08FF0095F4E4C358F7CFC27CD64E5B92E1C14FFB9DD8E335776A58789FE5A3D3C67DAE7B07A893FE35A0513B789223FF00783D368C79E667657311C24E1C8059994039DE86DC8C75D91DAA91312B2A092C39967F06F7CDA305FB55F624AA86186B5AD125D7C90DA000E070CC09F19E1DC7BB6DB0CF19D97C6257294B42A5A9C355DF97F9BBDAB0CD1DAE90913425600D6F5607D456DBBBB831D07F690ED5FB27CD3DA6FB08D495F9AB0EFF0085179EAFBE43842426B29D00294942B8556BDC1B74138EDDD8FECCE3E6F67B1C6493DFF749E04B0D01E2BB5EB7B4705ED876C24FFAEE140AA0CE72412EFC405B9791FAF7968BDAE3B1147749FF001C51381D6DB4A29F8384B2A420050278A4C9EB1B5A0638D637B25982F1B3D2B796B4CC5380417254FEA5FA73AC77197DBBC2E0B2FC12952C282E527889A30090C0536D47DA256DFB4AF63B52D17D3AB290242642B626D22DC40CEFBFA7A88ECCE612CA122515B9B920077D9CF21B35ED12D84EDCE027CA331284B84972D504F36372E5C0A39BC42754FB4E7636E64F9B32CEADA572BD596662C52B009056E3D4AEA001E21CD437F8EC70FD190E2B0D9860538895DDF14D965831765A6ED43B78D4456B3BEDA8C46539A32C1692B09029FDAA05CD3DDA823E726BB4D6A1D439C662AAA74D2E46E667983E97C29278D976A9E701001076563E90760D587C2E43841DC85CC3212C1AAAF94063E8FE11F1E3E27E67FA8ED1E2C951FF00F10B377BA8F3DEE1F76D1D5A15A4F42B81592559CCF34752A43E56C2D2195A92522EE05257C526FC8EFE53B2E4E2B3454D95DCAA44A7AA41278C39B6C035999AB668AC23303225CA5057FB80122B66622BE9EAD1EA67D1C3DA356E6B4DAD74267D5014D965A4E5ECACA600A843AB73BB40B0B284C0DA77E5E47FEA07B392F2DCC32FC7C99211DDCCE359081F310A4DC9036AB9FCC7D02FE947B5666659986131F33BE4CD95C284CC53B5160F08579EBA691E6DFB57D02F43FB446ADD2F48CA826B336CAD9A6436D1850AE711DE59293301D2609B795E3D03F0CBB5D82C6F60569529089D2706B4A8135044B291B3500F0E748E49F1ABB1E319DB5C26270F2190BC5B92948ABAC56800F46D9DDE3D63D679EB5ECDDECA7A4B4FD3D70A0AFA85E55514DC09EE9C70565753543E0410612975415CA3717B785F3FC9A7769F3FCCE76154A9A11885BB025BE657E29A1AF87B5BB159B49EC8F6772F913C0940E1D00020020F025DF7B86F1140219FDB652DEBAF673CB7B42A1A84D65465397D0AA9DF6520281A92C21F3C683E466F3F3C74CF833982BB31DA219762014AA7CC9685A9668CED650DCEDA5ACFC77E3BC8576AB239936534E2A9534A384026B4D37B80C28D778A1FE8BBD38ACC751F6A7AE3362A552E434B4151953EE712D3E0A675555C04CC41410A8FBA23A6FF005398DF9BB3D83C3AF8D3981095049A2788CB0280B7F73D5E28DFD1B7674E447B478BCCE571197F34B334587FB960A0478383D2F1D00EDF3B4DCB3B5FF6D6CC1CAD6C57698AECE692810DF787BAFF002FC34CE0481B12B490A81EA2F8BA7647E1F4EECC760A7E2952D4A5E2704660590470BCB2A0C5BFEEA6BE04449FC40ED2C8CE7B5D2F0B8629E04E2420A50A0430500D4F3A6D631D85FA4C7B09ECFBB23ECBF446A9D0990B397BF5B42DBB59DDA882F71A29E49E202D0B5796E76C3CFE9073EC42737ED665B8C9866210660725C83FEF70B29CF0B10051ACC6AC218FC68C99183C26453652693929E2012CF496EECE68EEFD6DADC5EC3BEC93D82F6D9ECCF95EAED55A69877387A87303535EA75C49A782E214E10980B800AAE6D1CB1CA7E2E7C43ED4766FB6F3F0F85C6CF121589504A12B57FB80AE8007A338D2FB88E87D81EC064D9BE469C5CDC1CA0A449054B29490E52EE695766F13E1D77CB7B55FA307D95F5337D966A5ADA5CE7575066CE50E74A5D0E6150D2DDCCAACA695B0EF03AD00D77A124A55102F187F2FFF00BD4ED5E0F119A617178CC26151251370C4052C21900AEC6BC446BBC5C3B2C9EC56598D56031587C199A66776C5281A90033737E8417878FA4D3D843B14CDBB0EA1F692EC3F29672E6F2DA36F31AB5D138E38DE60D661DDF7278388251DCA16491C2798306062D1F007E3B76A724ED88ECFF6AB319B3947132E5494CD74F02428853D4D081AB0B1B8880F8E1F0DB28CC72F46332AC24A948EECA94A9612D514B0B3EDCE3C95FA3EFD8CAB7DAFFB5072873D529AD09A51F4AB3B7B825B525C0A52525692950F1B651E156F36C7B53FAA0F8D583ECA76572F5659344DC6E61872112E5CDF996B2945B87626B7B4713F853F0CF0F88C7CC33D2172E52D24852416626EEE28CCD7F331ED076B5DA3FD17FEC44ED37657AB32FCAEA3324B69A5D4714B53982DA70B63B9529C6DB78B654553E150BEE4C63E7164B86F8B7DBDC662B32C1CFCCF0F216A13249489AA4A03BB3BB105FF00168F54CEC1F63B2E912F0B3F0B8452929E151504024D8D1BF8AEF1DBDF602D2BECA39865BDA876B9ECBD5AC3B9676954F42FE7397B02A1B5529CB5A712C0522A085A78C95010948E5046DC7FE30663DAFCB73DC932DED38C44D9A89FDD89B394A257F3201531729091A3F3ABD1DE5792E513F038E393AA5C80B40F96530268A37074F1A7311F2D9EDD9A0F5876C5F48CEABECE34B65EED466DAC334A1A4A4A169216B534C53A1352E955FBBEEDA25C85471011D4E3EBE7F4EFDAEC8FE1E7C239B9DE3B1B2A4ABFD3CCCEF145293C5C059342093C54E57358F3EE33E1D4DCC3B4015899AA9A9EF8B25609A055C13AB55A3DB2D21EC57EC31F474F627956BBF6A534555A86AA958AB7EB6A8543AF5454B8A42C34DD134A70ABBA5B81B3C283B49006DE1EED3FC50F89FF001AFB4999E1BB0F331872FC36226A672F0F314A010A52C24802B5636F08EDEBEC6F65F26C1E1978F93875AD284901410E4802E48247E5CD843AE8CED37E8AFF006F2AD1D8C694A4CA58D699834E31434BF52AACB54C843656DAD0FA9A612F153402880A244C1BEFCFE7E59F15FE1E6608CFF1F3F349F2B053113664B519C12A2140A81724338E90DE68ECAE3C8C2E1B0987750605212785A9B397B5DED68F1D7DACBD88321F60BF6BAEC9B33D4CDFF17EC2359674ED3525229B506128796C539429E1DE3A65EA800159F43C3B7B8BB2DFD48E3BE26FC3CC660A5625597E719560D689A9E22B521610A0826DC5C5C1D45758A2E73F0FF0D2F32C34D4E113DCAE62492122A388122DABBB73AB3476CBE995F611EC7B40F609A23B68EC4B4CA74F30DE5B435D9C2A9DC79F4D50CC51485A512BB2203AA22DD7D71CE3FA55FEA0FB519476C336C176971F331C9FD6777253314DC23BC58701C9A863A8F38DBE28F65B2EC365584560F06842D329D44243BB26EC0BEB61F58EB77D0CBEC69A0BDA2B5EEAECF3B48C9115DA5F4A379686DFA9714DD3B8BAE6149578EC9052E8B4F31B49C7A03FAD0FEA531B90766B2CC264188386C66310A226CB554B942943875A1ABD5E25BFA7ECBB2BC6E0B35958DC14B9CAEEF853C4134A2C3D41AFD77148CFE9C5F64DD15ECCDAABB21CCFB27D389CB322D4633E5E7556C294EB01146DA0B01448291C4498BFCB101FD0C7C4BCC3B6D8BCE26E7799ACAB02252D6664C241E30A51A1506B6C45F68E55F113B372324CE3113A5C905136728CA4705140ACD1EA035F9DDACFD87FA2DFD917D9F35B7B1EEBFF00682ED6B49359BFD7B23CC6A324CC2A5E7996D353963756DA8A00849979B48E524629DFD62FF501DA7C27C41C9F24EC7E70B9185C04E50C6CB90D30CC1F229292C5C380776D8BD7A9FC3CC8F2AC66478B18FC1CB13264A696A5330252AAFEDAFBA433FD16FF0047C7633ED01946B2F6A3ED7329198689CB736CF1CD319170BC80D51E519856D354789985B83829D2BF1209E84E3867C56FEA47B5D9965594653879D88C2E2B13284A5CFEF540A0808054524A5F8AA7C1F9C2BD81F875976133AC563674B973A4A269584148660A510CEE282EECE03C76133EF6D8FA209F5EAEEC8F37CAB2FC8AA72466B32CA247F07CC5C73EBADB6FB2905F14C140FD612920A951B99E78A9F6313F19666639763324CDF31C62A6E2242A68016A4AE5AA624CCA9240F95EDCAACC23B1F6C71BD9E9992CCC20CAA42572E4A92662529BF0900B04D5A80D5CF947CB7F6DD98682A9ED2754D0690A448D286B5E772AAC69C7385FA7756E38D1088E26F852A40009E77BC63EF5FC2D19AE27B2182979895FEAE6609099895D4998A9490B725EA0B9602C0DE3E7D66984C361F1F8E992F86B3144240FD9F329AD43EEA5DA204E7699DA05168C4E8ACBB50E6F43A64D7D10EE28B31A9A50106B10B221879060991D0DE6C4638DF6FBE086071B85CDB35C76024CF294CC9A17325A4AAA16A35209A0E679984BB3798E2E5E6F874CBC64CE033405490EC9AB0ABB1E63611F719ECCB4196577D12940C55079D6DCD299BA9CAA7DC75C71C5F0BCA256E2CF1AFC7B1528C998C7C5CCCB0B87C17C7E46130C844AC2231E89699290004D92599AE6E1BD23E876569953FB10B98B960CE18572BA12FC14D3CBEF1F1263B45D6195D26A5D1596EA0CCB2FD38ACFB37416286B9FA34A93FC52A5442FEAEF2146E49BDCDED8FB5123E10651987C3D938FC560244E9BFE9C572CAA524A83C804949524A83BD5887E758F9EFDA2C6E6327B52A12F1B350062FF00E902B0923BC6625C69C888FB62FA37436DFD10F45C0FD454A91A67582955352FBD50EB8A5AEB4925D794B70DC9FEA81E58F87FDB0C1E1B24F8E786C34A9489586959AA1299694A5213FEEA1DE81DCEEE7C9A3DDDD9793FAAEC4A97894F78B5610152C977F91C13B6E1B6E71F0D41E4FF0019D517B1D4F9FDE7AE6F567CB97A48DB6C7E8E7B00A188F879911C3B07CBA58615A8949B3035F060DAD63E7B76F113067F8C96147804E5F0DD802A3FC39F106F07D6386A5E954FD98127A6D791711D3117D9EC22E566589993417E371C557D4DFD3FCC56E4E19425CB2454025F5AF2BEBBF4D442B65F4A549F1117D8133B9DBF111118E9C7826CA5310DC2CD7D0FBB51F70D0EE6CB070EB0A0F42DCEF4F5ADDEA21DCD581C104806C04932237EA6F6F33E51882C348EEE6CCF9581347D1AE08A8FA3F28AAA241EF4B503D5875A537EBE46EED495890078A368BED3D3E23F29BE179A8490C589624F869F6DFCDA313648276D542BF9E477DED125A1AE4C99267C30677DAFB99FC09DE4E21B13265F1D520835622C4EC74F388C9F29945C5363CF5A1AFA9F38BB35566EB3C70BEBFD43CE36900188FC0922390232E2A9C9530A9AB077DFEC7D98889490A55ACD5AD7EBAEDA738A4F33AB7EA52E21A5C3A2E825406D1363E5CB68BCE3AAE4321387929EF43A05F50E5DB4B124B7B1161C248B52A0723BB1DBE9BC55D5D555F97D6B398A163BFA5ACA575C3292785A7D0B31FF00D2920C5AF8CF69B0C313835CB961C290B4816A28105EDBB1B78C5A70187965491387FB6012F5A16A73D06DA7231EC2D0E6343DB5F64794EA9C890DD4667945070670DA16953A8521096592A6EEA121063C33F7E3C9887ECA769A7E0318A29C3626705604A87CAE3E69B7A0209D6F0CB37C009C25CC4A6A824289A382ED4DF7DDF58F3FF55D53A8A8ACA6756ED33ACB8A429B295A4D94531C8F974DCDB1DD70D99499F230FC052470804820B8206BEBAC38C2614A306BA31092CFBB6C3D19BEC6A1CE2A1B6E94D552D6298A961412A012A529C0E2A0DA64409E7127A0C5AF0384EFE64A524D8855BF8A03AF2E710793A267EB485A010A98782AC181A8A16F0FA51E155F574F58EBB978796F3ED86D6E28A54890A0144126DB74F77417FCC241959262E7CC4A512BF4B31C382C532C87BEB52CEFD63A16225A9388C0CD029C69AB87A902B7D3AFD63ED77E88CF630EC27B6BF627ECBB55EB6D3F559D57BA33712D66B5F441A28AF536ABB0E212E714011702DEA7F365FD5776CF189F8939D6065CC12F0786C47FB44049E2E2249AD598BFD2CE23DE1F0CB234E3B22913520F11949E2150CE06A59F5FA3B523D456BE8DBF65AA623FFE03AE03911A9336303CA1FF0021D463CC333B578E584BE2980141C29D7EC2C1FA474DC3F64C244D704F10B329CDDF97AD18C3831F47AFB34D0BED3B4FA1EB42D0AE20E2B50666AEECA60A6389D26FE5CF0C31DDAB9E152C4F9C95936F9406F001E9EE86AC91D9204CE025100DEF5A3FB60199F58E8D7B457B34F63B90FB4CF611A5D9D2D50FB1AC1CCF9A52179BD60211434C9FEA53849B120472B0C769EC576BE6A3B3F8FE09E1333BA1C33784167E270DD287626D568E0BDB0EC71FF5FC277608499C1856EE1CF8F883AD8C776E9BE8F0F65F3DCD4AB485635565B6DCA8FF00E399990494050801E001E4607AE3924FED5E28E37124CD1326198A2E400D521C001B6A0B58EF1DE25FC3DFD5E5B81EF16C44A4B062744EA0E8DEBA6B2647B107B36D3B229C698AC526200FE31997DFDECDED68F3C03B439AAD49299818170191C9B41AF3A1B81489BC2FC3993230EB48554A7FEEE7CFF817D4B4373EF61DF66CCBA92B734674A568CC6932FCC2AA8E737CCD490B6695C7495254EF0C4A07DA91CE3A3E959C63B178EC1AF10B0A289F252FF2820296806D5B00ECF50FD28D9D7638E132ACD5810F26656BA254CF50FB7947831A8B5585D456D065B50728A0A5CC6BE999640FAC1E062ADC6805289E2D900DE37DE44E3EA4760F2892AC83033D127BE52F0F2CB92DC24A126D50F577AB97A5488F8E5F14303364F6931891C494A3113372FF00316D0FD39EB157E6DA919CBE1798BCDD436A5781D84A0C922E40F14926D72676BC0C746CBB234CB13172FE4580EA05360493737A1D08F431465F7E664841258D0726605EFBEAFBC7643D8BFB54CD727F689D274B96075594666E3E8AF5281699504D390D7138B0126E6DE2BEC271E5CFEA1B24978ACBA74D080A5484AD5C406C1E80835A3787311EA5F835DA09FD9DC760E54B9851FA85A1376FDC4021AAF43AD9EF1E95FB45F61995EA4F69BEC673E6F2B15CAD6AF57D4E6CA292A43472CA765CA72B51494DC8944C49B0DF1E36EC176EE6E5F2339C12A62A5CA96932C20A8BFCC169FDBC8B75BED1EEFCDBB132B3A9D94E63DD85AA6844D2784528824DBAEBD23AD7F4A7F69CC52E7FA1B413084A19D334CF273069A7C6FDC32BA7EF1B4AA525251299026245B7EFBFD3C761D3DA34E6F98CC1DE89EA2B0E976F9A61D47D7978729FEA2BB4733B289C9B0B2D7DDB0082104876E00CC36DABD358BFFD99EAA97B78F624ADC89D712FD65265798F7895381C752A654FAD80A049298E04F082013CAE71CD7E2CE0E7761BB62AC5A5E54BEF9250C0200E020166BEDA50C59BE17E151DB7C97867FF00BA7BB4B05391F303BF5AF86911CF672AC47B3A7B09EB3ED133C0296BDD6F51D1D4B8F8EE5C5835F5D474A49500612952786D7E538D519DCDF89DDADECBE0A6CC52E5CB9A8E034570F01965B672CD5B6D175C5F66657C3DECE677899284CA54C92A24A592F45D68DCD9BA574F9C3EC1F5EBDA8BB72D195B5B52A5B95FAC2BDE2932B5BA87736E26EC24C00A107EF8C7D53ED664186CA3E162B8E5A50519594824004B61C8A3B17A73158F017C3FCD67F68FE214E4AC952518FA3925819A7EC03E9A0BC7BC7F4D6D6FF09EC47B2F57D6453B4F652CA9692910A866948B58DBD31E0EFE93F15C19F76C8B904E215F35DBE79C2D7343E5E2DED0F8E39209B97767D93FB25A6800BB4B7F13AF808B4FE8FACFD549F477D567542FADA751A6B51A9350941242D2DD604A936894A8026098DE7149F8A586979A7C5BC1E1A604AE5CEC74B40492000EB4824D9A8790A1E7171EC14B184EC6631228A4E14F096B325479F3D0347C5C675A8733D4FAAB3FCF33FCC3F8B664F6AECCB82B9D400E2CB19DBC96B88993FC9094000AB940B1C7D81EC77C2AC9B29F86BDEC9912710B9D960592109F915DC71000B106A48A3171CDA3E7F67FDA7CEA4F6F92893366F7631E9494B90083380E8D5E5E31F657D9FBAF6A0FA23A8EA350D51CC1674DE661E5B80AD4E16DC70530264901AE1481702009C7C62CEB02B97F1C71B8192938799FEA00219C703289A33338A8A6FA47D19CCF2FC6633B0183C54C4A9415820B59209249402E6E472DF68A37E836D3D97D07B32F6959EB85B39ED70D46E553EDC38E452556666907123888284252902463A27F51133192734EC5E1E74D5CE9689B2C1E25BA4A4992FF00292798DA39F7C1CCB958939C1E13C487090C410471F206ED4FF11F2EFED8FA8F52EA1EDDFB4CAAAD79DA976B73A79AAA1564B8A4A296A1D431C21E24B7084A638627CC63EC27F4CF90F64717D89C395E030857FA1905733BB944BAE587513C3423E66249203D5DDF907C4D999B617365204D9B2E5F7AA0CE4502B7A7B2F4B1F7A3FF000DE663AA9DA2F69CA1CCAB9FAACA72CA6D37FC1A89C052CB21D69F35019512507888957081B7A63E5D7FF101ECDE4B9676EF245E562428CCC4CCE3EEC207012A433B683CE3ABFC229B889D8498A9B89513C0010493C4E0DDCB79D7ABD5E7B03CBF24D4DF4D0F68D575CD30CE6D9355D21CA92FF03A0177285F7E5A6DC94A89008514A4C4C9223152ED6CCC661FE0B49948C44D38695879616842D690BEF1496A820D09B30F1022F08C2E1FFD53884F471F192D4DBAEDCB77B88EB6FF00E230D59AD55DAE764D903A9A87749D28CE52CD0F7C5AA5AC52D868F1AAE107B8761694A8192200B63D3DFF00C34F22CA670ED22F30548EFE7770654C9B2D2B291F395278540BB8A170FA93148F8AF3A6C992832A72827849E04A8D580377A7361D291E2CFB2666FA9325EDFBB38CE748E72F2F57E539ED1B74CDD3346996EB15B52C35508213C29792DD3A949921462488C7B6BFA81EC7F65476273EC4FE93088C423093945932DC321452A0C9B967A5059C5E3987C369D8AC6E745D4BEE4CC40092A2A0083F31725EA6AC6D1F57DF4EE657923FEC8BD9F6ABCD99646A8D3949A7333CA1F79612F37501FCB6A6B0A4AA0C9524C83F2D87C73FE96F23C5768FB5BDACCB30EB52B0F3A7CF429491F2CB4A0CEA10ED50001401A8C418F5EF6865E0B0781C14D9851C72D095558392013737ABF56630F196E6C7DB87E89E6AB2BEA1ACCF3F3A7DBA6532036A768FF84389658909B9E2453A6091F2C42E6B879DF0CBE2F4FC3941978638827BCB267900A8D2A070977B3DCDE2A99F60F0FDA4C995DD11314896470A43905801B16D872B3563A8FD8A6643D877E8BDCF7B415D40CAF58EA9CE5867EB253DD55775976A834D716591DCC0936817B6273E21CDCC3E3576830D8096959C3E4921656A014A48EFA53A4B86A120B579D59E203E19E5E7B32719DE3A3F50B02B4601441E573BC5A9EDED95A7DAFF00E8B1D29DB250BE8CE35150399652D3543284BEF819967749435012A471281EED478C4DEF24628FF0CFB77987C09CEF3BCBD6B992A5CF284AE695143F0850173BABCA85C45C7B4FD94C1F69049528A14A7252C94921C826CC4D40BD5C3888E7B42D72BD89BE877D2FD9464B982323D579CE541540853694D43C330AE69FAC480B214B05150A077001DA76E91F09F21C57C6FF008BB8BCF66838BC1A274A33E6295DE252148F97E524EA3D0C547B5394CFEC764A9186E2E12820000B903722B6FA5447523E874FA4FBB34EC3F4D669ECE3DBA54B590E5B58B71AD3D993A953CCD5273971D7F350E36D2421BEF3EB0471BAAB4C836C76AFEA6BFA64CCCFFA6669D98C3AE64DC2A0AE6C99287131410909AA4109621D9AA4EF7A87C34EDF19B3F1387C4A08257C20A9554804824BEF5F5D6DDE1F694FA20BD9A7DA6B2BCE7B5BF657D4395E4F9BE694B559BE6147401399AB3AA82D395094ADC53AA142A2E1544849515584838E71F07BFA83CE3E0866986ECE76F7B389981731121189C4F04B32471048290A96EB0C45886AC7A0D59060BB4592E3F112260E3EE4A82407E27492D7DFDEA7E40BB5DD09AABB12ED0354766FAE3277329CFB22AE55355D33AEF7CE04F78A0C3BC424C3CD04B800FB33048DF1F6F7E1276EB2CED864F97E6D8032C61B19290B9694149487487629A50D3ECD48F9F3DA8CAB1180CE71D875850509AB090411FB496A9B50F5E948AED154DADD6D0EBB14C2AE8545266E3BF6CC72E639EC3963A6F6F932A5764B3498B4A7FF00C24EAB80DFED2EB434A79F9BC7767B0CD98E1D64007BC0E7982057DD5AD78FBEAF662AFA773E880CB14869229BFC279D8EF645E3EB039827DDBF524DB1F9A1CDF855FD47AE7713FF00FCDD2424D984D1AB81A5E84599CC7BDF23C6A7FF00B26B95C54FD310472E02E763B7324B5A3E04330A827526A39794298EA1CDC8DFFF00E6753EFF008FC36C7E8DF26C560D5F09F08BE14850CA4A4D451E4000EB73CEF7B4789FB418642FB4AA25001562814ADFFF00F23F9D3EBB53EF17E8DD7C39F43DD125091C08D2FAB036A172AF1D6CF29989FD6C4FE6E3E364B549F8F1317254ED9BCA5708714EF52687A104FA55C1F727663853D8DE07001C29DADC157B0153CB7BC7C2A3EFAD39C6A42018FF0013EA08FF005019BD64C7327AFA5F991FA25F8098838CF87D9226657830328126A6B292DEFEA2DE09EDCE042F3EC41480C672DE9CCF5DD9CFD5A3172A549A9709901411C2677B5E27E605E3974BA63F049C14C9B36581525541AD7DB6BADA22315970932A5F086A3B806D4A0A69E1A6AECA115465266E0F23C87DE7D63718322C51C52E625CB75B1AF93D01F5D221D587E397303513A1F16EAFB6FABC38AEB4422157326D73E9633F3208F291890C534951090C4D9BCEBE1B79BC41230CCA5921874DC9BB37BB42DA5AB55A5506DFD5E963EF3F872C45AE6BD5FC5ADBDEEFE95DE119B2039A3020B86DB9EDF5F52FD4D5EA491E2E917E91EF13F0DB0CE6A8AFE660143C7EA3D988D9F86AA986CFEE9EF5D22ECD40F90557B78B993D4DA3E47FDB15AC1E5E95B16A534B3B78FF00377AC5670C82E3776B3DCFE4D8DDADB54D9ABE12410A20C988B4753337E5636FBF172C149125212C006A8BF4D34B9DAF16BC149E2670E77AFA86E5E0E4BC56D9CBF2570A3799BF39B5A4733D49336318DB1B244E42924536D2C34E7BF268B6E1B0E0814D7CEB563D43D69D2B1D8BF644EDD6AFB31D768C86AEA4A74EEA7710DE69DF2B89942584F80042E42788A88F0804DB7DB1E5BF8C3932D58BC3CC972495A78CCB524170A2285FCBFC5DF62300674A2AA0E023E56078838366269B36FE3DF7EDCFB25C8F5C255AF34025A348DD38A8ABA36133F5A2A6813C3CC4104F8419918A6F65B3DC7E5C24603385A84F0A3C0A51A293C4E1C82C960C189A9E704CC20460A6AD2070941AD058359F4A9FBE91E5F6ABA775AAE7D54B4EBA179B70A1CA2752429B521453243804F111C42C37168838F4C765F3CC24F5490262492120A5DC681F57BE9A6BA8A165ABE1C4995310584C265CC7BFCC49D34B171D62B87DFAD69FAA7AB82509013E201209B47282771698B5A717AEDC62049EC8662BC3034C2CC345137428F366735DB58BCCCFF73138201F88AD0C1C9145245AD6E576ADDBF421FA081E6DFF00A3B3B225A2C952B3DF173319ABA0C1F224F5122DCB1F971FEA4D53719F10B3D52C9E3562893BD14A16D396B4AD23E8D7C2099DCE47210A179483E40793687A78FB2AA6CAA07148163F2F3B7FBDA31E7E998351E021668C08F2AB7A4760958896A0B205007A5BD3C357B469ABE15367FD31045B9ED68B7EE310F9AE5B3166594CC371AB00DC3CE96F6E211978D9604C5300100BB867B8B5796ECFE5E4C7B5B1AA57B657B27D400AEEE95FD58091B0E3A56C5CEE0F4BFBE6D8EDDD83C0CC464D8B2B55049AD2DF2A99C6FA0361D2384F6BF3195FEB7840502B3C696F9921FA5391FB7AAC8610A436F95C7794F4E08BC59A02F11EFDB718E62AC0A978EC4CC0A202A6ACB7451A75D5F6F08EED2B3A95232FC17124377496AE9C290CE7F834E8601429510B0AD89277B0F5E717B7AC61E04AA5293C35B8A9DD85A96FBC3D939E499929443304D7A0B576EAC79C326AC729DAD3B9F07109FF00F25CD477840F07F917E4F513E58525E24C8CC72F05C257390493AF0AD275A1B0677FCD373ECCE5E2729CD014848EE576BD9557DEDEB678F8E1D4F9E32D6A0D474542DAAB1F5E7799A51C00F8146BDF1B00A8B9927CADB463EAC7C2DED370E418342905411225B56CC8079DC0D46978F8CBF15A44A9DDA3C629D81C4CCADDC7191BFBF48D794F66398E69568AFD5EF16329716DB8DB6B570C2525248F0A82809EBE40E3ABC9ED34C9B87C42654BE29841E1029BD5D9A9A3ECD72639BE27092654DC312404B83D76AF93459D996B0A7D019AE42EE8D2D3797D2D7D025EAA6C252B4A45432167BC23886CA04F15C18338E4BDAEC9F17DA2C973097390553CCB99F2B3E8AE10DC9C5FCA3A764989461734CAA6CB53211325970E416282F73AD58FDEBF499A435D685D45A334A6BCCCB39CA9FAACA32353D48A5D4D377CCBA28501EE195F182A5A609B4F3136C7CE35F62736CAB3DCC72F460E7AD789C4A124A652F8529332AC5883451B6EF1F4DFB3BDB3C12F22C04E9F8894572A424104A5252C90DCDA805BED1F2C5ED9BDAD37DA37B40F69BA9D7998550D53F4AC51C39DE3605334A60F7601294C9489E10279E3EA77F4CFD805E41924E070CA2664996A09292EEA492AA915624D0DFCDFC45FD50F6A65F68733CB8489A0895318F097A0296D756D6B1DD9FA1DFB66CA5BCE3B40ECF33FCE986F2FCCBEA21A159528A7692840716E06C3CE2130A04F170EFCE71E78FEADBE1E4FC595E3E4E1967B8528F0CB4173C6A6FED0F7FA0B08ED5FD3776B70F96E1B0F879F31290B4CB492A22C000E1D85377E7179FD33BDAF694D0DECA2F765BD9F5565CFBBAC5C4AA918CBABE9C70FD533043D530197140F1852CA85A7A1338E73FD28FC32CC734ED4A71188C34E4A72A9D2D40CC94B0E165E8480D6B579DEBD7FFA81ED86053D9A9D2B0F350158890A4D140BFC9B3DCE9B79B7CD77B2766A32EEDEFB3072AE9196D0BCCDB577CED5B61A6141C68B8A5052826E649E23F9E3EA97C69CAB118EEC0CDC26124949C3E5F302B80151534922C072FE77F017C0B92995DADC4E3262811FA90B750666593ADC6ADCA8ED5F79BE9D9D6196E73D877654CE4F99E5F9A5553E5A84BAC52D7532948E24520095069D2AB0041045A27CF1F3E7FA49EC8E367E73DB554CC34E92133C8495A1697F9A6B91C4002D705ED48F717C4EED06171F82CAA585A0996800B10744DAAC35D3CAAD78FB04EB9CA32BFA322972CA8CCB2BA4CC9BD33A992ED23B5D489794A79157C03856E05137B5A6F618E61F14FB219E9F8C32E5E1A4625CE3A41429329652405209F9827845AA01ABDCE88E51DAEC265DD9DC44954C9602A5147015024B8237AD4BFB68F8D0FE20A6B3ACCF2DFE18DFD61ED599B283E2A91C1C2E674FAD2AB9E002140CCDC791C7DC6F8739663F07F0B70CAC5952972F2A53CA5A492B6C3D2A41208DACFE31E4BCC065F3FB6386C72928E0FD5A56A371598087F324EEDBC7D8F76739E65591FD132CE50EEA5CAD19A2F4F578550AABA914EA438E2C941417B8A549510044DE7A63E2DE2B2AC6F683FA929A065D364CB9F992A5999C0A0901CA1DF85855F56D3578FA378CEDA64EBF87F230B24C92B4E0D2821D2E0F00167A35EA0757631E6A7D081EDA3A43B2BCFF005CF619DA03AC65B926ABCCAB98C86B2B2B521A612BA9AC5D61256A4821D2EDB8D4041F0F2C7A13FABDFE9E33ACAB2BECD67D96CC993E64A93FA832132C924F0CB5247102598D5ABAD63897C24EDBE5B95E6799CBC419694CF9A52975003F72858B543EC2978EC3FB64FD0D190FB42769B98F69FD9176C990698D3DAA5F6EBB34A76CE5D5296DB442D6A05CAB04132A5129005E3AE285F08BFAACED47C30C966F67F1992E3D589EEBF4EE654E676294B132882E1ADA758B476F7B2B96F6BD68C5E1E74A4852B89D251576367B0B55ED6611E837D1D3D8EFB387B29E95D73D9668FED4723D49AEF2AA2A56F5F66685D3D297DF71A71745655429B5F772A4FF002C9B092463CE1F18F37EDE7C4AED2E5F9EE3F27C7A30D331266A25944D99C492B4963F238D0E8E29710E7B1FD8D9393E1712138E4105150E915093AB862ECECFB6F1F33DDB8FB4F663ECD1F4C46A1ED372CCD5BCC34FE4B9C50375B554EB40A5758CC28934CB529C6CADB5F76971517544198C7BA7B13F07715F11BE14FE8B1597CEC3A4E0E92A6216145728129FDC12A1F307F3022A824A64E76427304BA67317208AAAA2AAA96A5C37D7E813DAF7D9B3B11FA59BB1ED21AA346F68F91649AB74ED122A28EA7EB14AE3E8A8AE4B2AA805A72A5B5288525408502236F2F337617B67DBEFE98BB4B9A6066E4B8E9D2319394995365CB9BC0844A2BE1AA65905D245F7EB16DED7F6270B9D60A4CD46310A5997549E162E03D4AA800FCC7527D943E861D25ECD1DAA50F6E7DB776CD926A3CB3479555E59973AD515021A0868A544ADAAA01E3E04AA540C102379C5CBB6BFD55F6E3E20E538BECEE0F2BC623179924CA0A2998C94AA8B042900170A34E434022A1D98EC9E0BB278A13D7390A757168EE1CE84F202BCC563CF9FA747E900D37ED2FAAF48F62BD926629A8D1FD9B0ABA2D52E53387B9CFF00BE6DAFA88412477628D6D7FE52941405C441C7A5FF00A01F80398E588ED467F9E15C939A2113128992AA85A9331F849A9752812D67AEB087C4DEDA77B2F0F2F0EA2C804712554228D4D080EF7FB9EDDFFE1ECEDF34C6A4D2FDA67B3F6BAA9A5FE1540D658D51A730AF45335C351DF3CE06D0F389063651493245C1C79FBFAD5F8659CF677B468CD7012A6CD97227CD5F14B9449214A0CFC214751BB5A8224BE14F6865E2E4CE958A57CAB486E2340C0BD0DCE8FCEB5BB37D3F5DA4E8BD03A1FB2AF67DECD1CA0A9CA73A733E5E6AD50660CB8CD3943E8AB68AD2D2D6992B24A4820CDE4E247FA39EC5E6FDB0C6E7B3730C24C4CBC6A30C897DE4AF993C09525552028B9706CD6899ED6E7185CB1483865A400A51E20407ABBB3DB414B02EC0D6F2FA0EFB42D17DB1FB2AEADF66DD739965CCE55A0AA327AA0335AF6025C5D4E647304708A97533C2B6D2004930400231CD7FADBF81D8BEC8E6B968C2C99C3FD51538CC99264CC3C265F090FC009ABD1FA0687BD91ED29C74A99356B0132785454542805682DA1F0AF28E96FF00E221F684C973ED77D94762FA3FEAB5D93F67F4999B59A2B2ECC1B5538EF6959728F8D34EB2DAFC4D88DE3CAE07A6FF00F875FC20FF004DC873AED2E3662C4C9F252B9726721495BC94AD2C38AAE586973C8423DB1EDE6599C4B565AF2D7DDA4A388917218BF3A6D7E51487B197D12992FB6E7B2EE8CED8727ED3F2DD13AFB33399A33AA652E99CAB4269AB174B47C295D534B47F25008E048277B9BE257E2DFF005739D7C30ED563B23C4F646766982953C4B933940A92A4053121E52DA9CEC361150EC9F6224625189C6E16600A53A884B50FCC6CFCAAF4F08F793E8ECF653CCBE8CDD13DA8D576BFDBE516B1D33995031534197E67534ECAA8450B4FB8B6DA53D5AEB87EB0A2010902D682231E11F8FF00DA8C5FF513DA8ECE4FC83239D95AE54EFF007C4A90B481DE197FB9425201E1FF00D4760D1D0BB35DA49BD97938B918C2552D614900AAECE0D34636B5C3968F907FA447B67D33ED09ED73DADF6A7A792C3391E695F46C65686214CFFF000F42A91E712520254165B2AB822FB99BFD73FE9B324CC3B0BD8AECD649889F3711330F2815CC585024CC29531724D1DB661E5E67F89599E1F33CD66E230C94A553564A929E1726ACC40F4E82F1D247948AD71B69A3C6EBB574490B1002385F6C12784DC01733F7463DB1DB544EC6F617310924A95825B0B9FF00A65869AB59F7BB98AAE538632E7C998CCC41219C82FCF4FE35B7DDBFB336A1D3793FD1114D91661A9B2B7EAA9F4B66FC544BAEA565F42DC2F2908E00F070CAA364C9DF1F9D5C776733199FD434B9630338056684F7E25CC2857CFC553C2C963401EEF736F5164F99A11D9F989EF83995C25259C3EC77607E952F1F0AF98B15CFD56A6AFF00A9341273DCDFBA685437E20732A80DA80998363E933338FBBF869388C2FC36C361895059CBD824920FFD216075B53D77F336793258CFD2B04F0F7C4F78C4DD428C2F6F1E8F1F709F468EA4A2C9BE879C99BCD33DCB28F323A7758A2AB2A76B690D4203AED6A590A429D0E7892411E1988B63E137C46C8B198EFEA09787999662168566329489E25CD32CB14A89E2E129A1A5CB178F5A6419AA47645C4D48E1C3906A1CFCAC19CB8EA3A5EFF1079D56A9DD479CD0B47EA85AD47A8D65EB2D2B0EE6956B491C8820C8B9B75B8C7DEAF8272BFD27B2F95E166829030D253C268DFEDA685EF6B0E81AB1E46CEA60C566F3E61629338B1707FBC8AD6951E62102EA1F436DB6FD4FD6384A8254121300A8EE2D3F0F48E7D23B4B365994549775A48A6C03DDA9B787268C6712929C2A1807E116704061E2E6A3EF1922AA23C441F5F9441DA3DF883EC8A0F14F51258177DAF4B57EDB45630D85EF44C0D41A5FC5B6BF4DA17B3540F3E7613EFB1B0FD8DED1218FC4254B2904120D791D1FAFF88613F0641248D5B6BBF4D7EEDBC39B15299BDCFADE00F3BF31FBBE23FBDA0A38EB4F0F188E9987242810054736D4B915F1F5AC3E51D5004CAA768E7CEF73B794DB96136F5FF10C26E16F4E7EFCFAEE445EF9FBCA495C99916BEDE5E63E7317C37CB7BB3C3F3247450F3F06F5B450309C248A8D4B1D694F37766F4200A9B337AF24C133CF7822DCE08F95F6C5816B961988B5C355B5F0B922EFCA2E99690C12EC59AB4FE2B7A45739CBA47149067CED07A12768E7E98CA172C9F988FBEA6DCF98B45CB0286006B4B80C1AF77AFA6F102A9AAA8688729DC534B6DC43BDEA55C2B49696958008330A88B13D3683880ED276670B9ECB4A804AF8056D4B6A3A6BE4F13D265204D42D49E24B1052752A70E79EB6E5AC7B09EC69DBAD16A3C859CB7357D0E56E4ED064513AE052AA82C14990A3C809BA4FE5E61F899D9E565A0FE9A590563E65A41E24F0331A5473AD87384330C0CD93869E94A14B0524A5816AA5C5F50E0121CFAC4E3DA13D9FA83B45A1ACED1744308A4CC5092EE7B97B0907838070B0520402560711EED26F20CEC28DD8CED5E272BCC70D81C629687584CA98A27FDC018977A066662C4EED1C7B0699E8C7AC4D744B42CB248019D4E59D89FC1A691E516A5C933664E654556DADA76994A4292E24B6B3C2483E15709361331B796FECA9D9AE5F99F64B152578A97DE4CC22AEA492FC0A162AABB8FF00069D070D353331B8128F9F8549B312038BDDBEB406B1F7FF00F40754328FA39FB1E678871B6ACFC2E08327F8A3BB7C7AC74DF1F9ABFEA9B013301F14BB412E5874FEA125019A85C92799BF851C47D21F84F8633F219135350258141B74A6F6B5CD047B573C37170AEBCA3D3CCFCA31E7054C50E1FF006EA6F5B3791DFD6E0C752958644A4AD2A50254F7D3933DDEB5A53484756DFF0029464057862FB99E40C72BFB879E22F1F899A0CA4A65120104B5AF6B3C30384470CD26684EB56B56BA3DB4DB9C7997ED4C8A65FB4C7B3BBAA092ED2BD9F84A8C594B6100F39F90C769EC5E38232AC64B5A7878E5A68D664976D79B6FAD9F85F6B7088999F61BBB980844D1516FDC0E84801C7F916F48A8549FA95229C215C4C35179FF00CB06C07E679FBF9ACE5CFF00D6E238657CA16A6A8DCE9E57E7BD3B9E1729958CC0615256DC32D249A97A07EB60FD042D4BD07812D9E13304DA39449E9E71CE2708CC54D0A41E0B9AD411F57DABA9A56F0F5394C8C3C99893307EDE4052BB8FA9FBC43B5AF0AB4EE774EA8E0A8C9F354B8B240E0FF24FED7E60F97BF0E25619789CCB2DF91E5A27202C805EAB481CBAF4E91CF73DFD3C8CAB3596710973297C2E039649E7F47FB47C9CFF0087F4FE94CDB52E62C96AB6A579C664B21C50250AFAF3E47DB2779DA01FBB1F53FE18646064797CBE220CD92876154FCA08A354D5A9F48F8F1F144E2FFF00B438D54B96B52062165C02D45162FA8F1D6BBC55DAEB5E546669750ED48629297C3DD214059560070C1E42605A2F6DFB5C8ECE1C0C852E5A4A8CC0E0849B8D7CEB7F38E479AE2B1AA5E1C194B0C468695076E5E3A87B50F9EEB658CB5CCB43D14CF1E24BA560A92A6D457224CCF1446DF0DE7FB23D98563D73D18A90485FCB504382FA16AF879B45D329CC2711216A7E29401B331706FEFED1006BB78ED1F2C6574547AF330A6CA2950B67EA816EA92A4BA14DF081DE6C27A72F7E2771DF05B2D44F9589978290A54D515294654B7D2E4A5DEA48E62D48E98BF88D98E1B06A9285CD010801202D4D404559BCB4D0475D352EA97DD5BA0E60E5754BCE975E754A502B2B595192499DC9373EA39F77EC7F6364E4B82EEE5C84A4290DFB40B03A369CF5AEA1B926699EE63DA1C5099890B3C0B3C04B9D5F4B5BEC08D23B4DDA8E75A5EB5CACD3B995569FCD69D1097A95E741A80B4C2B88B6B483C0098924FA1DE9FDA8F85F27B4B8BEE276192B97316428AA58500E402E0A483726FF0066BE7663B5B98E46B9264159092976590CC41D19C035F28856A2ED63567696ED2D0EB3D4B98666CE9F53C72FFACBEFAD3FE6BC6F405B847BC9DE23A62FDD8EF82992F6170FDF60B0B25733149056A42128293A12007353AD9A8D171EDEF6EF34CEF05874954C502901438891A0E7737D2FA562BCA9D40FE459A65998E4B5AEB2F30E38B62A10E2C2DA5248B8F103722C7A581B62E0AEC761F1384C56131081313884291C2A0084F102050D3534A0D2D669D809F332E13B1330702D4CA36492589E553FCD8D1F75576A9ABBB412A6B5A6ADCC337A4A06826969EA6A1F5A112DC0094A9C2081C291EEF2C503B27F0872FEC763B19330F879481984C75704A4A48724D4015FDCF5D9F58B2E69DB1C7E2E6A10A2B28413C2EA2CD57AB9E60DB4D2B0DBA7FB70ED3322D34AD3997EB0CCA8B4E5225F65BCBDA7DD0D38D3E56140A43804428D883BE2C78DF81D90E3B33C3E3A661244DC4718985664A38A9C2AAAAA46C6B5A42A736C5E2E5A13DF2D0966238942A7714A5ED7E45E29276B87091C6E77AEBEB74D4F12B88B8E3A5C2B3B1278953EFDE71DA26E5B2B2CCA1196CA940C8549324200040053C26C0EEF42F6B34426264CD97884CD1338940951AB12407605FEEDBF3B353DAF76A54BA75CD08D6B3CD1DD38FB62687EB6F25969B47F34A0254F0042CC8B00224918F3F49FE9D322476865F69132E4CB9C7102795F7238828A8170581A1B6BA691D4FB239EE2F31C0CEC2E227AD12D29290952CB0670CEFD0FA91AC55D97E635EE553D9A503D5394D530E05A2B29EA9D69D6561478969536B428971424C2A6E649C768EDDFC3FC0F6970795E5D8C28C4A70C9084A972D2414B2284104580F3DE29598CDC564B9909D869CB525530FC892415392FF303A383E1B34596D7B5EF6FDA7285DC928BB50CF5BA1E014ED527D62A57DE34B942C77A5E253C2826FCEFEEE57DA2FE9DFB213A660572B29C112E0AD430F29C905372106B4D4E84C751C176C33395839404C5AFE573F39245050172FD473888E53DBA7695A1AAB37CD74AEBECEB2CCE75496959C569ABAAAA55616E40E24ADF3C3C016A48BCEDE98B2627E09F63F0323087FD1B09356809242A44B64D059D3BF4AF844BE13B7D987E8F1038E602A490071177A8FAE9A6A6B117D41A9EAB52D43F9CEAB7DCCFAAAAF8559966AF3CA4D4D5A80F0124953814D936214622C462E384C8F2DC9300A9383C049932B807CA89684866A8094A40028C4806BEBCCC769B34399098274D333BDE2EEBE6660A7AA8D2D5AF41A448342FB40769FD9636F27B25D5B9DE421B5346980CC6B1E69238A5CFE53CFF00040BC023CAD8A64FF86BD95ED9A7128C7E45835CC50204C99265A8B977214A43F3A9BD6BAF4CC4FC40C68C3C896B9EB432085312402C1A81C1D9EDF7996BAF6BEF6A7ED1A84651AC7B64CDEA74F3C80D869B0B614C881C485165D4B8E0717E12A3B5ED6C73EC37F4A1D99C2667FAC9383C2B77817C2244B00317350351E075BC452BB7388C4A529257C697A959215B720DA0D49A5E3AE55D4AFB4A7731ABAB71DA9E24ADBAA71D53EE38A599597256B52CAF97193C3336838F487677B3780EC9E5DFA6CBB0C894020256109E00AE1D580F17A8AD1ED10B8ACCE6664E272B881A1048B68C6A030E5666ABC4B3477693AB3B3DAF567DA1752D6696CF5F6C8AF4D1ADD6FBEE0414B454A42DB49F092773B9F29A4769BE1764BF12153139A61249AB1EF65A5770C28A05F97D350FB25CEA764AA3DCAC94A8FCA453AFD5BD2D0CFA9BB4AD6DDA356B59AF68F9F57EA4CC925EFE1AE555438A2C820A5CE02A717C05405CDA6DE470C3B29F0B724F845881FE998594B18958E2084252031352C1A8ED4E82D0BE79DA4C56629497514268B3C4494BB0B7D5BC636E94ED33B4DECE686BDBECFF0055E63A4559CB8D2B325D13EE95560A75CB417DDB8829E00624F5B7385BE27FC25CA3E24A7073F192A415243A44C968594BB1A150A3F215F5898ECFF693FD3B018A40593DE2181763622CFBF9DA36679A9F3ED6F9A576A0D5B9C556A5CD4B6C8CC6A6B2A1C2B57F2C210525C7167ECD884CF520EF8DBB15F09B03D85C3AB09829E89689C9632E5CB084B005D82193635A728A5CA5E2F1B33118C33152C05A9481C4FC45CB6B46A3D35B6D38ECDBDA27B6CEC7D8699ECA35DE67A5B2A60AD4DD0B0FBAED3A5C512AB32A7782EE19FB20199E6629DDB7F813D98ED8AD788C5E59869D393C44CC5CA4151513772924D75BD2B6ADFBB11F11B1B904D9B82C4A55312BF941366B5D8BB8A7A5ECE7AE7DACBB7CED8A94E51DADF69B9D6A1FE2922A285A7EA32E4308A732DA4AE95E42561D4813D3AC99315D88FE99FB33839A56BCB70C9EE8828224202878B39F7766893ED0F6867E67C5364932CADC800D01FF0026E47211D79A9CCF2D06BA99346E51B34FC011C6F2EA14E71FDA59714789449F11BA8DE099938F42E1BE1865F95E1E5CC91C3DDCA1F227858D00A017A352C34B4727C7E0B187172A6AA615AE693C40D804B6B6FB0D8986AA253ED24D45112A6DC50214A3050526410150A9E7D248F73AC4ABBFCBB1197CC4912D52D52FA8208B1D34F037AC4FC932A470778A4A66242788022B6D8E9D5ECC77B799EDC7B60469F6F43653AE7356B260DAD2BCA9350F374FDD9F1B8982F25B3226C419F2DB1E6FC2FC0CC8979F9CE152B0FDF77E66059948E3078B8BF71F9BE96B35AED83CEA52705350270AA18004D4D59C3DBD8058456B4E8A377EB05552B156B5713882B594A9C995AA4909F12A547D63963B2E7787949C261B2B92014A502529A80064A45052C00D3A544727CCF118B56350B12C2A49987E7A1FEED989A9B5ACFCA2DCCA3B77ED9748E937F4A69BED0732CB34CB882CA7256DC7154E50E921C484F7A1290A2A26C800CFC38FE7FF000772AFF51C366430B865CF52F8CCDEE659980B823E729E22D472F5B728EB595670A95932E5A9652F29B85C80696634F1F48A997589A4A751CCFF00CC562D4E3CB741BADC7945C52894F52B24FBCC0DF1D672D9672AC36170E80C1090030D801BEDD1E968E42A44CC4663326C90425535CA49B7CC6C4DDDA837A5A120AF55434C9EE032DA4ABBB571F115C9BCF3116B9E7BF9CB6653D73A5A454FCA34DC375F3E9511379980BC3CB48A900B80795F402D460C4794642A215008B7E5BEC3DE01EBB8C3DECDA3B9918A333E5252E09D686C2C746B5ED588CC04B4852828555AD2BCACC5B9F95995B5504CC72E5B7E1F84F9EE3103DE4C5E2A6853F0F116F07E41FECFD0C6B98E1857853C54E54F2F7CAD0EAC54A85E6E39C8B18F78F4FD92E3D6212661D4011C377E5FC74D1DC5EB0EAC55A81B2A662DCA39FA4DF7F8E1C4454D90B0E18815F467BD7CBD63B31A83FF0030F9729F3FDF5C5772ACAB109E1FF714DD5EC0023C58BB56F1C87064FCBCF5237BD9FDF8454B9AEFFF00501BFE1FBF23B62EF2329594FEF248BF27D37D7F2748BBE560F9DFC3C0D9B56AD9A2B8CE261572771BF33B7A4795B9DA30DB13964C40A2D887A8D46947F7CF5BC6096A6000B063CECDA06EB5F1115F660B2961D00F8942537BC03B73FC7737387196CA54942C2D7C65ACE76B6B4BDEE1E2D3804898A4BA4900B7A87B3378FD1C44F3B1CD74E7669AB726CED2F2D2AAEA80D5537C6A094A0A92D789174FD9513F64091B49C72EEDC61246213338A5853F1338043814A1D4B57A88BAAA4495E0D49525259140D770E5F7B8B92F5762447BBBD9F6BC0E06B32CAEB52BCA6AE9D872A11C21E6EA389A056DC2B885D4549909244CEE31E5DCEF2C4712FE4E15851E152404941770411B30B50EF78F3E76CA58C3E216A909EED890C000FC8351CFE34AC535ED49D82A35A6529ED5740E4E9A7AB6997D59BE9DA75A54A76525A0F155B7014F42516DBA623B2ACF335C3ABFD3B178F9AA2974A165D299A935E16FDA3803246F7DE1976471844EFF0076BF3A0A5CD5241AF9FDEB5871F656FA6A3B60F628EC4B24EC374A766CF6754BA42A2B02AA5CCC9144A52AB6B5750B4F74EB6543854A5241BC81320638FF006E3FA61CB3E296738DCFCCBE2C6E2780A94093FB53C3B905C72A0F38F72F60BE2CCBECC65430D310172C20339B33B3537F6E4C770B49FF00E240F69CD7DA86974E649D911454BAF52A12DA73AA5592952925C20A99E4992795AFE7C5F34FE89A46094B64148960924836A126FE941B6F0DF3FF008FABC3A138B4A949134AC896096649203902869B56A23D6CCB7E946EDBB32C8727CCF30D00AA3AB553A5754C8CCD874B8A7109264049038493CAF18E793FFA5BCBA54E992C4E49282C42914046C7463A87A5F78E6B9B7F54D8891296944A293C24385549B6DADC0E61A299ED17DB175FEB9D65A375E55E96FF0039A3D756B651F5E689FF003894A1710009001BC19E587184FE9EB0F830A40C425282188018116FF9023E9CE38ECEFEA5313331C27AE5296EB772A22C6E28CC5B4DA2E36BE93BED716BA5A2CB745B8E14252DA17F5C6E13090904CB7113CE4EFE7784CDBE03E4B800A5290272E6D4B121D89ADEB4F623B1645FD5CCC95874CB9A42025200E2581A731FE0B062D13CFF00F78C76CB45979ACCD74D251E00A4B66B2941822C2C276B0B6D1B6C6051F02B01895BE1F0EA4826CEA557A380F5F3B3E8669FD59AA705844D0285C85E8D4B6BF93BD693CFFE94CED32B5EAACB2A749A99A3A9A6ABA45BBF5D6D40F7ECB8D6E102078B91F23D7177C87FA70913264B5AE5174A90B49E134620EAEF51B8D2D58E4B9E7F5278EC6098133490A0A0C0D3E67BD18B83B1AED1E5CE7FAD2B97FC56A2B1A5533B9AD53F54A417F8E3BC79C7AD06DF6EFF00083B63DA3D83EC09CAA4C994A5525A5090E9A06006A4BF3D8EB68E099DFC44958F9CB9B3308959592492D5737A03D6DBC5199DEB069D0950A8E2E2E20B4F111B5AE49826DCF9FC477AC16449290854B414A406FDB5B3863E477BC404ACD70D9B14BE1C21ACFA7FEDD2CF435F18A7B506A469C04A5C22247085189322C41E66D63E51B62D797E4D230DF34B9684ACB5001E069B0FA18939494380848036B742FA3015D5AF58A8F33CE0155DC8E22A27C5B983B8B4FA1E67CA716C912A67CA9324CCE166A3F326C69E874261F224226065241069BD01E777B58E910BCC3356C93E3937BF15ED6E93D39CFB8E27646267A180C228B5D81B55A8DE7CE159396C90414CA1D5A8DCE84EBD1BC221B9A66685442828F8A4CC98F599300733D05AF13382C50278A7617BB240624786C0914DE9A4484AC24B42920A1D542CCDCF46A90DCF4AD6227515C8415149009DC8B4EFE9CC7BFE18B1C8C52267082C4358DACFAB8B9DBC6257825CD480B47101448B81666A7A8E9BC30D4D625704A8929B013D77E7E5D2FF002C4B4AC1A26BA811F3352D517634FAB57C21F485A657CA80C9147FDA080395EA1BC690C4FD741549227A137378DBF641F5C3A392CA9DC2ABA81B9F114F7AEF1212D32D4C4A58D093AF23F7F5D6120A90A0AB9BC5A48B74236F3103F1C18D9A8CA25A4A93C6E0806AFA3E9AE8FB43D4CA3352D2DC70D9BAD4D7670046A55401D2D7F4F5B1B8F761B4BCF70D3C1E342411404B1AD742F4EBFCC2FF00A25CCA4C25540CC0D35AF263E35D4437D655B29E1529E5A0DEE0124817E578063CB68E85EA71689A03106DC2011EF53EB6687B8595330A0894B28B384D1DFF003E957B086F73336F84B6CD42D40FF470290099EB11BF3369EBB61BCCC4E2CA9908330A59A9E9507969B0787ABC389ACA9ACB2352C589A8343420DBEE61B8D0BB592EAA95252824951793C4679804D8EFCBD712381C4255FF00F50099007ED330815DEBF9D4522470D3E5C84B2C150B003A369CBFC5C9C0AE812420D32BBC1027894B00C5E3700C748BFAE36C766794CB0D3319294002C389346E60E85BF9B4384E3E5A50A12D290821D55677AEAD7A873A36E63356599AD78032ECA6AF306D32169650F2BBBE232094212ADFCC72DF618A466BDAACAA43B4F94B4A6FF324003667D8DBEACF11E3159782B5AD6896AD0B713F27D08A0D2ADE12BD3BD9B6BDCF9E4D3657A5F365B8B20049A1A94A2FB4AD6C817E4662FBF2C52E6FC4CC9302A509788912D44D077881BFFDCF47A8A6CCF0CE766523898AF89239368F5F3B5B5EB7F647EC4FED1BA9592EE5FD9E2EB1901254A7F33A7A5EEC2EE0F0BAA4933D22C79E29B9EFF51585C866265CB2311DE71550AE266009A876D9F5BF3868ACD70284ACCCC426514D5296B96347A7D757B18B5322FA373B79CD78467196B7908541505D6D255F08F4EF8EDE5EEC5626FF0054D85980032542EE0A54DE3F2F56B5E1827B4985492EA0A4BE8A29FCB03FE22CCA6FA2AF523A38F3DD7AD50A94077484D132E1FF00571290E72F3E57E830D07F536B72AC1E14CC209E26251C3CEA9AE85EC393B05876B30E1242425059A8429DB91D5EDA58D61DE9FE8AE0820ABB4B440DBFF86A26FBC78EDB9BC09C34C57F5238FC494AA6E5A66105C1E3A83E29E42B082FB53289FDE189DFF173AB46EAAFA2DA9C371FFED6114EA13C08394A55DE1F52E7863AF5E76C43E3BFA94CD019694E0A64B4D4169855C351A70F2AF4DCD7795DA9C3A1DD6140DC7133F5B575AFA6B5FE75F45E6BC4073FC3FAADACE42BEC90D314A1C8DA429C1E42F204DB78C2F23FA93C50E156225AC002EE49F06497F4F4787D23B5387B258053BFCD4F0F3B33EDCE9ED4BF4777B43E996C2E9B224D734EF19EF1BAEA425B0904C96D2B24F15E39C99F2C5CF25FEA37018C5894A05C517C4952589E7C3A837DA8EC224A467B85042C043F25025F5737DF5703778EAA6B6EC6FB44D0150B6F55E4398875054389AA479C4A00B9FE6B2DA926D17E288E918EA7967C70CB25A4292B94870EAF9C135B386241DEB534262770DDA3953662509295710600A9AA2B525BC45FC1E2AA5BE5B5C3CDAC380C354EEB65B24C90788AC03311B89DC62DD84F8AB96E6B294A18847180591C4002FA00E2B436E578773D5331E4F0A824A59CA485B3EC5DFC34D8E9A066C95BA9A761BE3A8BCD37D8481B9872C36BC49F5C472BB55FEA738CA968E1492DC4CDADDC063BDCBFAC269C9E7A921E62B84F11EF1C93CA8FAD9CF8467515AD28B694B85156DF107D909527B90A8E1874001CE213B1F0EC45AEE8E4F3023BE91892B2594521A85BD59FCA1C232AC4489615C4BE136507636A91D2F4D6D5847DF892413277B9927CCC74EBD7094B54E0A6C42485248F995AB6CFD3CF5A5779721082954C4F1105C3D811C9A8FE7E158E7EB12209558D81262DCFF2FC3125326A26A50090B2072F201B4FAF487188C41527810A5252CCC090C3D3CBF980BE15F68957A927EF18D5D2400500B6E7F888D12824B82C6B6045FC63732F4C80600B6FB03BC08B72DB029408AA016B57FC5BDB465482AA1538B5BAE9D7DD21636F264C44DA4733F2B72F5B7963744E280C9A0B30342D4AB01E3184CAE0FDA5B5760EF1BFBF09E1BEF78FD8936EB1F2B37514051213525F66A79746D21708E200AABB121DFC1E961F6852DD4A6D06D17DE4738FBBCE7973C63BCE41C73F6D4FAC379B2900314860FB33574BEB6878CBEA412B24DAD37F75B616E971CF960331F4F5FE222E749410484802A6C36FADEAD7F08EDB6A0040701045BF3C31CB7304BA7FDB2FA579BFA3F378F3BE0813C15616661576D74F22D78A97340544F0DE27693D3A6DF2C5AA5E6A5293C2082756FF001A37BAC5E72C07C68E3A83CC7DE2B8CE5278556379E477822FEFF909279989C7672B03F6B9666DFA9D41BEDE16B9E0DE83D1EE29AE971E7B08AC734596EA29D441E0495950E5E11B73DF973F7C028E5D98AA695F10201DFC81D18EF4A79C5D3286A92C188B8DEFCADA9E95B98655D7AD550FD7107BA2A40A640994A93092A02D1E200ED1067152ED203384CB9A1E571B51E2EC84F1C9E009A81F317A105F6E434B691EA87B17F6AD539AE96AED10F362B73FA1EE0D0075F08516D6B538EAC15595DD340280327C3000918E059E610A662D4B5129413C619DCA8B245011AD0ED1C7FB6F9605A953254BFF006A603C079A5B8DC1A8A83B69B47A5DA2B519C9DD65D72BCE6B475414D66C1D6781B6A41406FB95CA48BA91294C18E2DAE68F98658713254152FBB5A6B2A60357049D1B50E4127504B472CC0A97976238D880F50E5AFE43C3C63A43EDADECD20297DAAF674B41A0AF4AAA33BC9A9A9D24502909096C95004AC3CAE25C25238660ED8E87F0A73F4489F3F29CD4044F96129C34F5B0FD55092364F7618126A6E23AEE4D9C4A9D2901DDD8104FEDDDC1F3371E05A3ABFEC4344731EDD326555708144E540A9429B0A054195252786265244D872F5C4C7C40C6CA380C47E9CA44DA061C24873A91B8A3BF8C3BED14AC3FE88CE511C2A4121D80703CEB4B5483A08FA26A3AE6695960B550AA86D68285A12DA95C240E14400098D87B8EDB63CB39B058E352A50410494A9C55EA4FD7634AEB1E54CFB339471CB94140A7BC29E170D73B694F26DC9892643A5DDAAA866BAB6A0B742B2E29E6DC470020FD910A20F316F973C73CC51C4AD6A329454F4F94BB7BAD4EDA5A3599230DFA633BE57E1A3B6DAEDD75AECF120CCF55E95D2A834B42DB4ED50078DDE107855CB84949111CC1E9230861F23CC33450E2428F0961720FF8F2D4F3A34F993B153552E44D52425458A7C7A7954DF48A0F57F6A4CD5171BA8AD524F8821B4A484EFB5845AC49881BF91E89D9FEC7CD94A4999873421DC3BDA963BF8C38919762D5533D570EE4DA806B715A39AE9143E79ACEA56C3ECAEB514A1EF152AFBB42CAF80F12BA14C6D7371EB8EC99476792908030BC4A02AC198598EFA6BD280C4FE172013402B9D5531A834AB5A87DD0C75E750EBACD16FD7BF515EAA86698B68427842678FC2600D87BA062EB23245CA4251264103CD893ADA874E4EE3533527B2D216C14B0A70EE69B1621EBE3D62AACFB53BA1C4968948209510A241E200FBB7F2F7462DD90F673118824CE2A961E9C5B6B41AD830E6FC9599934BCBD8CA214FB537A0BE962DB83CABECC351BAE182BEA6EAF5226E2C0F95E2D8BE60FB3699443CCE2F02C7C2DBFF0D573250490C1B42CE6EFD6C4D76A5E910DADCDD6E470B920C830AE978DEC7E43C862DB84CBE54A041097A0A8BDB7BFE7C62730F24380C5A95B3EE3DF5D5E2235F98BE6DC6522F2662C3CB909F3E76224E26E461E426A780780E5B0D89AFD627E4CB40482000534059DABB6E74F1DC4465DCC9C3FD44949224107E22FBCED8713B2CC3E350C3853B148A55B40D6B757EB1208C009A54501ADA6CCD5FC4335557B841324037BEDF3888E9CE7E1ACAECDA10070CD34B86ADFABF95442A32E54B7E21A8615DAB6229B5872AD5B055ADC2B009514C4917DE46F7BDCF5C494ACBE6618057116A358380CE19E8D4E96A5A164604B3F091ADAA6BB5ADE81EB085FA9B9922FBCD88E563BC8B79FBB0E06231086F914AF3A6BB73FC3DE1C0C3B1143535F0A0E7A1A68C79B205D5A927C2241BDCC7E22F63373870AC2E1B31923F56B4208144AD41243BEAA21E9A535DDE24B0613294788B6940ECDAF20CDF6D0C6C69398559029E92A1F9B70B2D38EA8F580DA56A3E71F28C44623B3F93212B51C74892054ABBE4D80D7E70283916D5E1D4CC5C8428A52A4BB56C35A5F517FB1898E9FECEF59EA4714C659A77347AA8A929612ED154B485294760B71909BDAE2C23CED48CE3B4390E43C6A939B61A7AA557804D43BEA080B27CD9EACE2194ECCA4CB524AD6025479114205081F9D83DE3B1FA33D823DA6B5829AA8A8D24DE5F93B852A354E56D105A5B55C9EED4B42E40E5636E471C7B35FEA7728C8B10A9070DFA8992CB06248537309203B1673E7584F159E6065CB4893344C24328BB70B36F42FD37D03C76AB4B7D18342E37DE6AAED03F83D43010A7E8D1446A038A31C480B69C8B796F6EA46396F6CBFA9CC776904B9595E58A9281C41644E32D9EA09701EDC9BC62B38EED62A505044C03621890297BBEBF715A76234B7B0C7B3A69A6D0D66D4BFE2CAB4402B57D6A8F8C88BD94A001E7726FF001E653FE26F697304F0A27CDC0F15E6199DE316BB13FE69688299DAB985FBC99C6F70297E8D5D5A8DCDE2F1D37D897635A24B8E696ECC6932E53DC25C79DAD35A1E0DC701087D2BE1E1E805EF388239FF006967A97FA9CF66E212A6F9423848FF00C4DCE9CB486533B461638904855C7CDE7AE8DD7D4C58ADE6EBCB1B0C65596E5542DA4404A72AA25280116E3EE38BD6FD245F1018ACAE7E366F7B3313882B26FDF4C0097B9653005C0B5F5BB207B4734D02CD5C1D7E9D46A2352B35CCEA7C4FAD3FE90C3696072990D848239C11E58565E117824A93889A663B7EF256D5A312FB8B7E62BF9AE753D750B21C9700967028F5D2A77F368D2A7EA957E37D20C41EF17CB7E7EB6EBBE1C24E1D54E140F2FC52FE3E110A3339E47EF556ACE58BFB0EF189A779D952DE748039B8B813D25437F9ED6C3D96990406425B56001E868EF7E9A5A31FEA9882ED315E2F4F33F6869A969D6C9875C302DFCC549173D7D3E7E787C89120904048D9C0DABB7BF53FD4E79A7117143534E8FC9FD3AC3154BC040A975D41FE8BAC91783B137E5EB1698385D381C2CCAA9085686836E4FBFD615959A620280E3350C2A59F5D77E5A5EB0D8E54BE3FF97CC9F644DBFE27431CFEE9C67FD270CA344A48D030B9F3FE6FC83E4669884D96A0372496BF3FF3053E619E33C6E0CE9C5017871B2B00F48595020F39C2BFE888A04A824AA80A5203D2EE08E5F6112387CE31003898ADB5BDADEBD6DAC6AADD4A9CDA9D596EA2C872ECFE81D05B794ED1D2B2BE056F0BEE4AE483BA4838513D9854A2A5C9C64C96B50A1E252803D38A97B35EB1252F3EC48293DE2C503976A35598B8F27A523AFBDA07B24FB3376A34AE53D16408D199ED5059773D6DDA9A914AEAEE1429414B6A9262DB74DB1B6165F68F245CCC4A272F1C5052A912BBCEEC283BA83BD29A11BD8C5FFB2DDAD9786501899C4059657117E837EB56D63CC6EDAFD81FB44EC9456661A5595768FA71216EA33AA608A27A9DB00A84D224A9E547D93693C338EE1D90F89E8C5A256071F2460F14964AC2D4286CE16400697A86A08EC9957697018A530527829C21C11CDDBCDBA523CF9AA7336A5AEAACBF36A3768DDA359406DE694D380DC292AE24851E1B8F10EB78C77CC9BB43230C12B13C6202C0243BD1AD42DE3E517644FC3622524A4A4F10B023A585CF854D79469EFD179880379B7A13C8FF00B6F8B81C761339960238252D983303B3E84B9EB4BC4163B0E2BC15B503F5BB36BE1A93A6C53E821245C1D8F5B5C5BA1DE074DB9C4FE8E76114F31F8093C24B904540D0B7E5F788C1294160A9F57A31A386234D1A30EF93FB9FCB193300A91EBFC42BC0373E9F88DCD3DF6B87CB9FE630779CBD7F883806E7D3F10B1B789F23B1FC2D1F3FD70779CBD7F883BB1B98C9EA854A60FC083F1B5FF1E671A2E630AD01E62BD76FE6374C9777A0D1DDFEA3DEFA728A93C8DBEEF740DFAC1BE11131C5C3D039B5EC694D07DED09CD906AC016A74DF7776E7B0877A0AA502A8369111E51BDB73BF2F2C678EA694A372DF4AC45CD90E750350C0D3EA7C34BC77CF51E5EB71C5051932AF0404F3200046F7FDED8432B12183292C19EA090F570FD3D63CC9817E2041A0D2F4B963420877F2A4545A859772E085200A5EF42A54921F2E70FA4F0C6D1F9E2DF839586C43844C042400414B33DAE35B6DE517DCB9822C1880C7AF2F2ADEF152672FD528A8877BD1CFC011689E83CB7F5DB18C5E512149078D2C7567B9DDF5736FF371C194B25CF2DC8A91F7E6CF6B456F9A07090A75239806C67AEDB7A7A4DB7849B21182A022AEC436AF7B74FA1BC5C32F21201497E4C777E57AED5884D70001B08DE3901FEF73CA715FC7244E428F0D4824017A1B791F0A6D175C11331043162C1B660FE15F758977649AF33CECFF005EE459FE56FA99629EA52DD692B012A6DF5A5BF182608095288F7F4C735CE32B528F1000A49571029D85C93B35CF8436CD728958AC0E213351C5340FF60B1F95CFCD4A03AD76018C7BED91EAAA6CDB2ECB731A65A2A29336A661C438D11C3DE25B4174786D3DE133D31CEF1D8732C2A581F32497B549B7A5ECE2F1C073FCA15855AC80C1CB162373E9CDDDB58B9F24AFA4A9A07B25CDD947F0ACE98729EA9D7877A965250A42086D5C533C53E1162271CEB3ECDC6553A44E49289D20A8A568F96F7729BBF32D70221F2699311315FEE94A4104F83DABA1D1C6D1D4EEC5FD9A33FECFBDAC296AB4A65CEE69A1F3172B2A1CAD282C329EF2956BDD60D92E2C8104440DA6D50CE7E2262716854B2E02B84125454DC2AF3AFAED61161CFB389588CB061D5891DECA4A8218D55C40BDB6A7531EBE64793653A529EA5FACAA6DDAC078D146B4825854CC49242A77988B4EDB55B179C62335526570144920052AE5541E219ABAF8011E67CCB2B2BC72A709DC40ADEAE3FB9C6AE06A01BD05E23F9F6B5ACCE10F34BE1629590784A385B1C2245B8426F6F5117D8E25328CA6520FCB24952AA5C955FF00F559DFA56D589718713B0DDCF7CC4A48DB403536DF4E44B375A7546B1656FA99A373BC5D39525DF119BED249BF2F2B7588EB1D9EC9A58964AE5A52E450A406F120120FF8E6CB2CC84C99B316495125C5BA915A7BD6F1486A0D50A056A2A04DFA488E62DE9E98E8784C0E1E4814492350D635A90187E6AFBCCAF00A4B324834AB1F2E75714BB549D6A1CEF527D65B2B5BE5A53615C12779F2E5B01F0C5A72F12D3312132854B6E5AFD0EFBF898504AC4A0060AA52943F47AD87561147E6DAA1E53EB6CFF310A2249D94394DAF07998EBD063A265987C34D4874A5058559EBB917AE95A3738591331628EA013A69FE0DB6ADDA2279C67C9643243E58EF02B89253C7C7CA24ED1C84CE2CD84CB82D4B200570B70914636D285C1D4D1D856B12983953B140F1254403525C9E6C0D9F666D5E21D579AD1B92A7495F9DD03DC200F5F85A31312F2E5AC072CC5A877E96A6B5DF78969381525884B39A505EDCB4AF97278D556654C920D22E5641E23C53C3D01067AFDD322D8772B2F41238E604116255FCB8E571B077893958650E1E305AE094B38B0667FBD9C07BB1D43F5AB9716F828BCA2104C45C5AF7F41720F39C2BFA1C3BB1C5A470FF00DC001B33A8EDA8A57568934F0A40484B1FF95459C825E95BEA46E2195758B0A8A5A4A82B9873BB65D7E49D884A52A22FD3A6DCB0B7EBF23CA10AFD66632934FEF58727C4D39FF989EC0A4A05D04914248F3A9D43FF00910FB94697D5BAA1D45365390E6B5EEB842508FE1B54CA5449B7F30B010073927E57C41E3BE21766B02852A5E658770FF2F7A8A9E4EA716F52D0EE6E265CA6134A43E80A4DBA758BAF4EFB1DFB456A250FE13A25CA3A77F83BD79EAA6124A55B1097824A60192239DF96396E7DF1FB26CB57C266226F0F170942F8830AFF00692396B7B3C68730C1A038989516622CDCAA3AFE2B1DA1D19F45CEBECD908ADD65AA5BD3E084A9D6BB962A7867ED0FE5BA0DAE3913CA39F3BC6FF565270C95FE9307FA8526C97297BD1CA5B415BDBC5BCCCD7082C108AB12EEEF6A55B7B45FDA73E8DFEC8723528EA8D53FE27523861A148FD206787EDA7890BF1F19040998F8E395F68BFA9CCF7B41C49C3E5F3B0411FB4A2612EE4D7E516E6C0F48AC66FDA456087FF293434CBD02883E20FA5FC5A3B0DA47D9DFD9F340703990E8C65EAE6C828A879C79E0549FEA28792B499B7236C73B9BF127B639B288566B899725414152FE6143A3B83EC86357A64FED1CE9B314B5A895A8D482C36D282DB8BB98B869AA58A64A5A6724CB1B61B1C34E96F2EA442909800CA92C711311751B462117271D8854C9EAC7E20AA6D55C53A6904F205675A9A798863373EC4AC01C67CDEAE343EC55E1CD2FD4D4A78471B083601B529A17E894948827947DD66B338E516989EFC821CA839FFC8824FD81D4C47AF339EA720A8F16B51BB8DB9D3F98D468452294A538A25DDF8D5C5B7BEF37DBCF1A771FADA22477406A05075A026DEED0C311899F32E49376726DABD7C347784AA4324C828F23001E5D0CEFB637FF004DC423F602A6152E453CFED5D79B41326AA951E20BF58E50A4A66556E84CFC24DBF19F2C06662B0F4EE896E4F50C7C793EBD68ACA335C072491AEE082E599BC6B4DE352D6CDE4A63F7E53BFECE105E718B92DFFCBA88AB104F3DB978C39E09859A85AAC01E5A9D2DF88C5A75A4856C7C847E53E9FB8798654ECDD1C53126504EE2EE48B167F1F08CFE9153182FE63573D6B6EBBD9F68D6AA865332073E6246FE40DBE1F761FCBCA59BE634B6E7ECC7CE3539730D0B1D6FD286A7C18BBBDA105454B728BCEFB1E7EEBFC236E987B2F2D20B124333B936AF3D34D7CA31FE9ED7040D75F1753F46F65B9CA84110543C849FDC7CF0F51810CDC64B5F95DB5AF3DF58DBFD39C58685EDE05DFEA7470CF0D954A6D7C3E14922FF003E5B9005FF0008C3D9187E1242AA92E1C6C00BDEFF00687787CB9249A07D8536D7A8F2AD21B1E423FB42444FA5FA81B7E1BE1F22525CB38E8FE546F53F7872701C24961D0D7C3A569F567742B284F100A067748833CF9C7FBFCB798274B0148048AD0D08EB736D9B5E90230C906CCDEF7E9AF386CA85260CC08312204FC23CF7EB783862BCC71F2AA994A34B3134DEC76E9CEF0A09006AFC9BEEF7DA9E570DAF02D34F5624A5229C0E2480257C5B7BF6DA4C9F84BE5988C4E34844F4AA5F17ED7AD06F4A74FA968AEE7388C4E1969FD3F130AB87172294E67EB0647A9730CB4B9581487B2F78143CC54A50F36A6D52850E07828010790B1E9C94CDF03879C8017F22E59E274ABBB248A872962588F1B8BC4F7677B4F8EC3AD1C4B50346049DABD3C5AD1D6FEDE3D913B30EDD32BCC73ED0E8A7CA35EA9A5BCA2DB6509A87402A212DABBB641E104481E7CF09E4DDBACCB24C477338CC9B2414212A249090282DC44B6B5D23BF767BB5EA9C2524ACF0967756D70CCFA53C447833DA4765FAA3B34D4359A5B55D15465CED23EB4BAFB8857054A428A9252A808BA40FB24EE3D71EA2EC56732332972F153316996DC2A282B1F33B16151D08AD6B526BD6B059849C5042E5965AA9C1722D5AB3EF70D4E8212E555138D34C50345A6980A06655C449B9955CC993B9FBB1D4F1B9EC9C721126524112D207159DF9B68D6D77A51DE230E95A8AC91C440E2200A1B587859B972D1C6AEBF21F96233BD2400D416AFF0010DFB8FF00BFFF006FFF0054668708993F2FD318EF08B06F183B8FFBFF00F6FF00319F7C46CA23DDFA6326613704F53FC41DC7FDFF00FB7FFAA39EFF00A92A1F77EFD0E1099340D58ECEED7D1BCF997D614461C382EED7D1DDFAC6F6DEDA0CFA5BCFCC79C1C23DEDFE6F4E9CBD3C79C6B3648014F534F7D7C07850876A2A88E3BEF69FD8B6F06FD6D80CEAB1557A7BB36DAF945CF94CEC1A95F4377DEF4D758F7DB59FB27D26A443B5DA635EB4942C2968CBCD121244EC8EF56B493FDBFA63CBF947C4ECDA44D48C4E1A64A941899A492E05E806EDE7E11E55C0844BE22B0F41C20D385B67BF51D6F1D57D4FEC9BDAC65EA29A3C9139937E28A94D653A83813B28202D453D62FE9B01D3F2DF8BB8698024CD5255F2820829ABEE40BD6C7E916DCB6721012153122F471A8B73DB7A6978EB4EB7EC3FB48C982FEBDA7EAD8E1E204B2D29F802D6EE90A99E9F0E98B02FE26CA29ACE43B3B1983ABDC1FF000E368B860F1B87494954C0C0D9C397AFDC98EB8E75A4751D2A887B29CD94429524E5D569098EA7BA88EB3B615C2F6EB038E5813F152D1A00482DA9B97E9A79C5B7058CC3A923BB5252DFF70735A6AFA68CF4A59EB6CD686B698AC3F4952D116875871B20DADE2408DF9F9CED8B049CE32EC427E4C44B503A710D7C7D9F38BDE498A925B8949B860E0877EBEC79986BC1D70A9A69EEE8929936B292414C90445F698E5CC5A2B369D84282D310EC5CB86E46F4FA3F9C5ED69C2AF0EEA29720FCAC0D1B4A56D7E7AD48F5BBD897B40CC75664343D9C966A2B333D36427EB010B7439F5A73BC400A09527C298FEAEB2236E319EE3F012664D267A0281759E260C1D99CB5A9A39DEB1C4BB7B83C3C997DE808952E6F1F761C1248FDCE2E2A4DC748F63B4776415EFB8C661AB9C34F42D842A9A9140053F61C40F010A4418FB42083E58E19DA8CCB09984F54BC1ABBF525C4C20370F9D08D3D46B1C1262E5CA4620A2684A8711005C8D350DD69AD758EC054578CBE9A8B23D3342C656FD1021CAE86DF754DA882485A815094822CA3BDE6F8A0A32B5A97326CC26622614F025B878384D41A56B7E948E5D98E678C998832D2B581C443B96356B68D5D76DA2B5D4B5685E66A78B8BE3504F7AE952825E21104845922FD2D04C729B4E599710B4B49766B0766E751E773D69B4DC22D720CC2A3C5C2E473DE9A170DCBC22A8D619D56B4C2DAA5580D1042B848063A7AFAF39922F8E9F926024F1A4AE50E2A3063E2EDA534B73310984462BF50996A52B84A83925B5FA1BBD0C75A33DCE99CB96A595CBAF93DECA88BA45AE491E91D6F16C5B71B2C20CA12889628080DBDF7726CFEB58BDCC989CBA52149F9CA920921EB4D48DA8D14CEA4D5C885F0EFE216923A5F96FEBBEF7C5E7B3B9461315C2676252E786854075A936E9E109CACDD2B3F3CBF4AEC28D4D2D41E315257EA1A7AB2454B6F786780212E2A49B5C207BC75F863A748C83072C20CB5C8530A9336586B6EADBD626F0B889136E024D1DDB6AB747D08E7CE34BA2CD337738327CAEBDD5AA424A28EA0DE3707BB20FCC5B91061CCF46558297C5331D2249009ACD411E6547C6C37E526818472192E1BFE3ABF87F9AC3ED0F60DDB16A984E59A6AAEA9498E02F27EABC1C7B7FC54A42E6D244C75938A7665F1532AECC71204E938E4BFF6CD4929035F94A987D5EBA44B613F472C1F9D32FC8B33D81607D88B334FFB047B43EA2527F88E548CBA8D712A35348A294D8981C4156116B138A4637FA95CAB0AB5265C932C870C3896D70F6200E861FAA7E0D80EF25922A15C4915BD9F77BEF17264FF00462E6301CCFF005CA72050E12E205222AFBFE6A00A1CF0F0DC08DF79B629999FF519889EEBC061D734172BF9CA0827F6B710F5AD199E90D66E6928278664C42B87FE991C3F2B9E4EFCBFCC5E5A4FE8FEEC5721EED5A93509D44EA2EB47D5AA69C2C8DC781440980091B75077A2661F1E7B43382C4A91370EA2E1333BE2BE1E60354F2AF5111ABCD81042A7858D8003D6AFF6DC98BFF21F673F678D2602F24ECFD8AB7EDC750ED4BAB00A2784F76EA488277023998DF146CC3B5DDACED3F12B139DCF4A0542424A59E8CE0B9D2A5C44163F3C561DBB952ABA851F1B1DCFF116AE5E9A1C95A14FA7322CA72E69B84A5272EA275691C80716CF17BE7CE462BD88CBB34C414AB119A6216D60264C079D38ABA73110ABED16281A2967672487F115E9AC6E7EBF50BDE27D6CB68FE8EE5965B007A36123A7481B63323033258527F50B98E0385F128EBAA892DAB0FA0AB39DDA0C58F99D55BDDC78339161EEAD8A756E2CF7F993A49DDB8584CF9C1F2DC6D63118789CB4104AA5850ABD03DBF9F462F4664BED062839F9C93677FF003E7FE5400C34900B21C0B175973681209124F2F5E584E6A8E0182240505120808725B5766A79EE7409CAC7CEC7179814CD406BAEE696B59ACF4846E54D2B5E215694C4FF002FBA1FF4F144F51B448E5B61CCAC589A901182295D3E600D6B701836FF00430B842D475009342C6A3504D6B7BBD9C98E59D4540D85875B48200E05752378006C236F96D892460B133EA1250EF46DC3B37BD28CEEEA561C29B8AFE94A917DB97AC3755EA8609FE49092072DB6371CF7F31E98929393A830981FA8DFE81BD29A43D978246ACC4588E953A7A0F188F556A171EE1529E8093065439F493BEC2D6EBCF0B4EC327049F96495BDD8174B741FC36B4108E2B0E89600410A05C11F4A9FCED7A437AF3C8559D4C1DA143F1EB6F31CFCF59730AC809C32EC78810AF070C1EE7EED0CD329CF090E6E77615A57E9FC423775129023BC0799F15C419117F873DAD8949382135819079BA49BBF27F5E51212F0C9201E163D4DBCD872A747844BD50A124AD244990543CB789BF3E57EB87E32394B002A5027FF00450BECCDEA21FCBC1A76FE1F4ABEA39F852139D565327BC03D543AF9903CB95FE1855191CB402112B843D404F2E87AF4F386B8C906511C20D5F9F9381F8DE342F562C890E0F14FF5A7DFBFBA3CBDD8DCE5069C29A0E458DF952BCB4F38E75A07CE3EC6BCAA7F10997AA564FF00C498B18526DCFD0EF8426E533459246C5B6F277A73BD1E3624F0B849AD8ECDCAAEFCBCE12B9A95524F1DCFFA87C7F7F3C31565D8A07F693CB86F7A0A13B59DF94612166BA6B46F3A16FE232A5D46A5F79C6A1023723DDCFDD387584CBB12A727880D4116A9D1BCBADE1D61D6438343BB86D7D3EFE718D467920CA811BC7145E27E516E9D231248C04C961CA4977DF6F06B373A73858CD27FCFE07F88C292BD355DECAD29E1893C5BF900489F5BE362860077640DAA5EDB8FAC26A9AA49AA29CCFB6A59C470FAD2A0A097048DEE0907DC64DF7B5FCF18135083594E2CC53AF3A6BE1AC6AA9E4D58FD7A685CB5FA436BCF30DB0EAAA1D2536F009F1F4FB33B72B4F2C2F2A782A4944BE0BB909F2D3CDFC01895CB72C939A85F7C4258382A67A3B8140C69A42043F963ECCADC2DA018EEC0599336F2F7EC3CF096372D9D8E6505148AF11B167D6A36DBC75847199248C32D4652D2003466A51BC5EFBF8D23625C6A9174CFD2BA685F492BA2524921E832B4A84C7900B917F8B34E130F854AE5CC94261218A88B3B8A52FCE15CB7133B07352CA20021AA6D5D3F3E24D44417B70EC334B7B50690A9A5CC2829F2ED7795D3B8BA0AA6DB4F15529292AF1A9B084494A07DB260911E2DA3E4E3B1BD9F9885C89D31380E225402947B872080C0BA828DB6B5ADDAFB359F70A90A54C09581A970C4070C4800E869B697F9D5ED2F416A2ECD35766BA475150BD4B59963EA6C294DC36EA3895DDA9B5A5210B1C204F0931378B63D07D83EDACBCDC1913480A40002890EA70EF50E3CCF2ABC75BC1E324E2A54B988980F183C4970599C56A5AA79024F9D7DC6A98813D20CFC2671D6C294A4F184929677D199F6DA1FA51C5FB520F808C16E2936B03CC117F81FDFE0D978E9083C2A5805D807D75E7E958C29007EE4B7A75B461DF2FCBE18593392B0E9623707F88C25295164873B545FAC721E5733EFB7DD184E62CAC809E8C2BB6BF56E861712BBB0EB0C0DAA6EDD6BE0F0A5B7AE20F3369DFDE479EDCEDD708A8197520872F7A93CAB0DA601707D2FCFFCE90B98A92926F04C11703CFF000E9EFC69DE23FE43667E7B7AEFE71173504A8EDCDEB4E7E14F03611EEB687EDA28B56E4B4B5F415A52AE04F1D1A5E217C560411C4166E3A7DF38E6399F626461D6102527814FC2B0078B860C29A8ADE3CD998767A74BE2480525248A0B9AEA39EB56D5EB178E49AE334453F7F4CFA815892D38BEF0A78605FBCBDFC85CEE76C51332ECD2A51504A4109B70A5B5DC5C575761B55AAD3B0B8CC3AC8429418B0BD0EB7A1058D37DE1F59ED3F380A087E9289F44C12ED2D2B93E678DB50DAFCFD0F2A8E27239D5265CE26E005AF437007260CDD6C61C49C46310A1C530BD1BFC3FDC0BD4439AF5CE555D4CBA5CD34F64F5497C4718A2A26C343FAA5419FEA9EBBD84E18AF21C793DE495CE90031502A5176EA6940FF589019B62A5283CE551810ED723622BCFCF522B5CDFB3AF67DD66EAF2FCEFB396332AFAC2502A292A1C6C256BB02453A20415036FF66188CEB38C8D4923325CB9693F32141F880E64D2F423AD6AF7CC8BB5BDC00264D2486A9558EB63B8E756E515767DF44BE94D4D5943A8B24CC93A634DBEB53D9865EB4AAA14EB44828405B8E25C4102D298266F84317F16D6B0642E712A0024FCE471102DF9DDF5BC5D95F1144891FEDCE1C481FEDA8A8324EB427E606DCAFA477C7D9F7D9C7B1BF67AA34A342D0D3D5679C094D4D6B85456E38911C443E55B5C0124016C53B1B9B6233E0A016B9724BFCC16544BF315BF372F1C73B5BDB4C4666B9AB99882B5ADC10080070B8700161A3B00FD62F7ADA8AFCDEA1E79E7128503FF00080084A06C0003853B03748F9E236528E440AE72FBD44DB155C80DA924F5276E42397CACC66CC5CCF9C92EE43DEFABFF001D2C18EA1BA868C90EAD5B7F2DB52A40B72067D66230EE5769702A2C6580FF00F73B3F40C352CC35F14CAD255C4B40E2B82456A6FAB730C2B10ECEF2DCD336EE9BA1CADFAB7D1C501495D3DD5612A5800CF9EDEEC4CE03B5584C3AD5C012C59EAF41767E5CBC21533CB049FDA6800AFD056FFCC41ABFB1BED433849527206E8A9553FCE56614EB21276250A58579C73C5830FF001272BC3AC209698080592ABEB5667DB9962F184B03C4940079102D52C34F0D1A22CE7B251CFDC0E6A4D7BFE1F553994308CB855F7FC5F693C6D984949B1379C2B9976FF173C4B396E0063925F8D426897DDD9A8C1DF6687285A6682274DE103F682C767D3F1B58564D967B21F65D4252333CE7FC431F689A77A9B8E05F63691CBFDB11E9EDC768387E4C1AF0AA028A13DF84F47FA862CCCD192890141960B37F6B7D77A0F1B356279967B3CF6099382468C4BCEA88870D53EAE229333C278A2FE93E7B618E23B5FDAF517FF599D2907FB5DEFA163A57CB7AC6FDEA01749D2EE5B67FADFADDE27796697D21A7CA7FC35A6A8A9383ECF1B0D3A44411FF0015B331FBB620330ED06758E97C189CC31334310E16B49AEC42BAD346A88DD38B9A97216435AA4937FF0015E512919B57BC022B6928D086ACC062969D98B00412D213C5B5A648F2C43E0654C26628AE74C2B238B8E6AD5FFF00B288D74617BC4763731C59002669D59A877D4F3ABF23B4267EAAA9D1C2DA96849D82145239DBC307E189232491F384B06350090FFE79C468C6E3CFFF009AB67BBBFBAFF986E4D23EEF117DC70C1044B8A264CF99318CA70A14C18005F4034B53D4185C6231441798A7A52A75D9EAFE8D7D2368A669BFB4A048DA483B6F2663F59C6DFA142A9C219EE40E8297D2947A987099939BF7AAD73CC31D7E8083AE91B05752D28225002F918E533B9EBE62E37185E4E02683FED2481AD2DA6D62C0DF43768590954C204C2549A9AD3A5074D61A6AF39A61242D23EEF94FE53CBA494BCBF1258976D86DE36A5AFE26B0A77097A02C3D3C798A5B41D6182AF5353D3000BA0C93CFA6D173E5D6D6DF129272A5A8025245AADF7EBF4D69019090C421C7476D39EAE59BC223957ABA94FF00E6206F7B731F0E5BCF3DF9E2564E50B15009A6C69E8E29F7B464E1A5A88F9051E8CFF5B7DE9ADE3D57AD92D001B766667C5C899037807DF07D7793939089A1D480A6FF00B45DEA6CFF00CF9C2B2E44A03E54B3D28E35F23E1F5AC46EAF5D1332E024F981703EF9FDDF1292BB3A84B34B48662070F2E9F4F387224814E1B5BC798F1FF26AC4FEB8248F1C8BDA76EB3064CDA67DE30FD1912524809BEC9D69F9F43194A149B06ABDC7E61ADED6E20F8EFCFC5CFDDCC7C2C230F5191BB30B96B379BD6AFE1195778BABD0FDB772D7B6BE02AC559AD9C514F0AC889FEA22F3B7EE63ADF0FE4E412CF1712126C47187FAFBA1D2329413FBEBBD6FB6F0D8E6B47044B86C6F0A3CE23F73D7D0BD4E4328544B40D43247E2AFA53F30B2252410421B9D2BB52F5D77844EEB4709003863AF11D86DB9F8F9DFD554E4B2D364D79240FB31F77D1DA2593FDB4F23EE9AC37AF59AC190B3D278A40F7491BEDBFBF7C2C32996DFB6ECE784D5B4B034A6DD2B0E901496615AD684DB66F7531A15AB7BDB29DDB621506FEA47EF95F1B272C4A5DD001E97F21E479C273A5098C0A5C8D4E9C98B7D630FF13A3FE72BFEB1F9E37FF4E47FC47FE3FC421FA51FF11E9FFF0014649D581BFB2E154EF2A063E78D55964B3FD96D923EE3DFD33FA61B0B35403B6E746A465FE3157F7FCC634FF4A957EEEBBF0A7F119FD3E8C1B664FE63735AA43C4953844742448F71F9FBB1B0CAD228897E694DB5D3A437992BBB366E8CC3DF5610B11A89B3092E18F27279CF33F0F3C68BCB4D7FDB05A96B1E8072D0C26505AD4F03E90A46A244801C2044471013D363CBC81DEFBE1BAF2A0C78A58DEC34BB346BC25DDAF7706B4FA78690BD8D428FF9A4C46EA3B73B49F2F293E986D332A4176403425B8454F887376D3EF0265077E1A1E8FCEF57A5DE168CF1A72C482636DC1F98D8FE7E8DCE5A949FD95BD874B1A7807D79C6C999364D251297BB38A3FF0027FC085CC668C9220A2368205BCF632447ECEC9AB06A0EC2FB69B3D7ED5D1A144AE6ADF896FE0F777A9A9AEF7FA2A7ABA99D085B8A03BBFB306DE2E824903AED88CC5617852410EE0D5BE85B96AF6B6B0EE5CA4B8243AA846AED434D9ECF53E149365999E694291539324A82E0385253C410601B9BC44FAF5EB4DCC6429414921D2F620B7277D798B51A25254D9929B814436D4F67AC7567DB77B00A5ED4BB305EB6D394AD3BABF4BB2E5454B4C3294BCF0755FCC2E148057C2DA55048558408B636ECD664BCB3324238FBA4A96912D4E594010E341C83FE5BAB762731981610B52969510169528B125D88B90C6B71E0F1F3DEDF7C9CD169A9416EA90E3AD34D2814F0AA9CA90F02081B7091E21D0EF8F67E419B4BC5E5492A292A54A0D624D00249A55C53CAC63BCE1132C278480A5000AAA0B712411A36BCF4A4697EA454D5BF503C285C252208129B1811D762371BEC3140CD6562958CE296A57095D6A433B5AB6B0D00E909E290002430B0FBFBF5A911C71A7AFC8E2D7830B97853C6493C22BAD479577357A437C2F0AA635C3816DCD79D6B5D7AC1C49EBFBFDFC79616CAF1697982656B47D2FEB41B810F33340084100301BF2DBAD86BAEF0718DC18F49B7FB7AFC70E715884ADF84B372BD6CF67A723CE2118867DB6BF383BCB8857A933CB6DF104A2B33388289ADF66E4F50631C2083405AE453F98BEF4CEBFCDF43E794F9965D50E9485A78A88295DDF0D81BCF01B5F613E9389CCCA4CD4A54264B2DCDE9A333756AF955AB79A64B214E90122E5D87873771AB063A47A3FD9AF6B949AC680D577E18AC69B6BEB6C71EC4A61302449317E104C11D714FC523052810B2902A5891426A5C92FAB5FA54C72ACE32B420AFE502EC58E976D2A03FF88B92975032FF000B3DF1EF098060CA89DAD33F0B9C432E6E5C16489B24DE84A74A015D7F8AD6B41C609525441205D9B715BD06DADCD9EF6EE83ECAB5B768350EB793E5B50FE54D29BFE2754B96830DAC8285202C02E710E48E5638E73DBAED8651934B95204C947133828042784BF0817297E17D373D5A2BB8D5A964996E529BDEFCB566D0135AB011DD2D15D90E98ECEDB64D251AB34CE4F0F1B6F36E0097089238DD053B93B1B45BCBCFD9BE69333C33A825243F090A492A0C492CF4E76356880C4E65370CC10B50A907ABEA4034FCEB511720D1FA973CA74BB9850A68287861084D6B6070931F612B498883613BE3974EC1E18E294938898A585314894B22EFFBAD4E6CEDE4C27768319C247129B60AA6D6F13E8C740859ECF74CE5CE17559BFD55D0656D80B724F31C5C5CAF7DB7C59F058F9F94200448336591FB94B09B5CD7DF48623113712A75AD4E6ACE6BB8B6FCEBBC3A21DD1F9780DAB2B39D2C1FF8A2A1CA5EEE01B9008E3E2F88F4C6313FABED08025E23BA425DD213C44BE875A31E5E4D0E01EE482C41362E4F56A1F62140D434ACC8CAF276E8F7E12B58A883E7C6923E0394E3597D9D9B29242E6289D4915BB3D01F7A1BC67BF528D15E0DCF701FCA13BFA8733AEF0D656B14FC00865A6E89A05C9B1054840222DB98F538DD1912A5926592CAFDC5CB6F625FC9A3638936770391FB8A35A181F4E60F2A4D33CA6C99EF9352A02277EEC1F7F4F33857FD3141642940A8EBC21D853C8F5DA35EFD4C3E7A3D8D6DD6ADA7F9AEC66899701EF2A94542E5050A3C3D07113B5AE7975C4A6193370547252451AD4B9676A1D7913A43895378C92E5F4FA1DA9A7DAA615A72DA350BBC1405B927DD333F9728C3BFD54D5DB88B9A72A59890799858924B98E54DD2D00965C4A4B932080EC91B1B931FEF8D485CF0CA4A8105810E2EDA5AB5AF2B883894050B35BDDFD61AEA734A76E4ADD4C83C92904F98E1FBA2270A0C02D5429241D473B56CFADBC633C4ADFE90CEE6754A248524C03BAA260F9FA8DEDD2C2F2585CB5612921041D0B3D4F2A57F31812C4CA6A2D6D8D1CE90CF55AB69A9F9A401207881E66768998B7A5BAE256564EB99520925BFB4DFEBCBEB1B230FC26A1F6A8007853CEBBED11BABD74DABFE1B89404CCC280BF2267EFF00C0E2464E44416E124DC534D74BF91D21D4BC3D89A1602C5C9F7B6F4D622398F682B6C2A1D49DFF00AC1BF9F8BE44FC70F9390AD80EECBF215BF4AFD0E94687430C4A696D5F9D59BEA2B10DCC3B45714524BC00122EA03F1BEDD207BF161CB7B3A560BCB714041B8D057EBF6A8877230E5AC69A569EF96BB0BC56B3B4274CFF003C1B5C718B8E5CC1D8FBF13F2FB3290C020B3EC69C85EBE7BD9A1D7E9940174D2847A3B1BDFCF61AC6730D74EBDC20BC07093B2D27AD890445C72B5AC31212BB38D5087DC375D5B5BF846BFA6511FB5B4A9B79D2CFE0F117ABD66F4121E1EE5811B473EBF2F762491D9DA0FF006DCEB415BB3D3DED5739FD312E025FA9BBB8E9D3A8A9BC323FADD4D59C701076F18E80CEFE5BF2B7962570BD9F24370330B30F64756E75610A230AA0FF00280D7D19ED5F77861ABD7727C2E5AF238A47CFA7CBA8C49272229BA7A52956AF8B74610A8C3916FB7E7F9E70D0AD7624CAEFE6A03E127FDB9E1C232276250EDA37E038AD7EF19EE0A86A474B5C6FD6F081ED729BC3969DB8A62FCEE7F2DBD70F139250108236A7F07EB1A8C31146D5EAD7D45C53EBB504379D6E924852F6E7C5E7D247C7D30EA5E48E920A59D8BB6CDEBE5AB88DFB824BB12CECCDAF8EC368D0AD689932A9F5503F8FE1F0C384E4D5B59DD9F4BE83EBE70E65618809171B31153CCF975E621139AD1004057583C561F3F7EDD05A7191947201D9C37A5479D7C61CA70E77E800000DFEDAEB7842E6B34816548DCC1FD7CB01CA3E604A75676F1760FB9A9A51E9ABC9720A52294D69E22AEFCE91A0EAB2F9F02E387FD43F3B45EF323A8C64E535A203176A7D69AB56FB18D2761EE5B85EF47D2F7F1F516783FC48EFFCCFFF00DBFF00DF8C7FA47FD89F2FE21B771FF7FF00EDFF00EA8DECEAA2D1571B9BC478F8BE65780E51FF006A4780FBA4C67F4E7424F8375DF979F9EFFF001827FE60F889F778BEF23DF8C7FA3F21FF008A7D7E5FA03E107E9D85490741BFA46D6F54A9E0781C1E189850E768B98FDEF8C8CA7874A3DC8481E845FCFEC9AB0E4E8EDCF7E9E1710B1BD46E5817418F303EE36F79DB91C6ABCB05004B3BBB5AAFBDEE1CEA4D18C2470E496143AEDE2FBC2D6B50B8AB9581111E2927E6267DDCF0D26654521F87992C3EAC2DCDEF194E18B12407D28C79BB17FAC3A53E7EB1B391CCDC193D37F38B461A9CA8104B709DCA5F9D01AB6B5D89D2038751B06F33E9EFF0FD459E2D6482E4111CC5847AF4F8729B623F17960FEDB1D5ADBF43EADB420BC3312141C9361F663AEBD4C3EB19CAC443827D45EF1BCD8DFDF798C33565E59CA496A0A5FEBB3D7D4C604B22C9DB63B0F2B44932BCC52FAF8AA163BA6E244EF3B6D24C6E0EFB79E2171D97F08F950E482CCFE24BD36D3CEF0B252DB82E1CED5E741E9BD22CFC8335A8A358718521748A0016E526124729BEE79F3988C5231F8104A93C3BDC5413A1F1FADE1CB52F6DEE7A7DE2DCD26ACB975754BCC1097B2ACD695FA6AEA75A789BFE732B65B24104594B9102058CE39BF6851330CB42652CCA58585058151C2A04B6B5142CD422F16FECC6293879C1CB391AEBD1EBCFCAF48F9CEF6DCEC453D8FF006BB9B53E5AD1672ECD2A955793A82785B525D1F58A80826CAB2C8DE4131CA31E81F87DDA6188C261E5A965CA02189B94809FA82DA72B3FA03B3D8BEF25D54486A9357A5013A0157D7C0C74D2ABBB052EB3096DCE5FEA480164CDEEA9FC31DA6465C8C4A5331828DC1AD1EBE66C7A686B162C47CE9048A1BD7A75F01F50212F193CC7CBF76C2799A46164100B508352C4D19EEF6FB5A1BE192CB1460487B59EB7B35FC290059E4418F43E938AB60712A4AD556726AFF4EBE3614A43DC6A3890973A58E9CBCFEC39C1C6AEBF218915CD2A04855DA94FC6DA188CEE81BD4E94F6F1A9D5AAC449F203FDFE7F942492AE249507BDADB7F93A36CD1B265814BFA790DDF6FCC7A3BA43D897DA2F5C86BEA1D9DBACD2B9C3158FD630D2824C1E3EEDE0950B72DEF1CF109DACF8C391484CC42E6A105415C251F3B535E10DEEBABF38C7769704B92172B12998B1747ED3714E22DAD4D6B66B4771FB2EFA323B56CA2A9399EA1D78747210A6D6AA3144CD726A4020A9254DAE121039911D31E74CF7E22FEBE6CC565B8A54C492A74F094D9C8A96176F66B4ACEBB4B97CCC32E5CDC083359A54D137F6124B9617A373DCC7A1DA23D973B3BC89348F6A0CF3FC499951F0127EAEED2071698B424C47879881C81C732C7F6AB39985412A9A82EAA85135362C08D34F0D8C714CD7321C4A505F0D4B03B6D4D816F2B477032AD5941A7B2EA6CA74F640CE554F4E8E053A82859AA000092AF00360247112761E58A2E2E566799E2A6623173A64D248E10AE2F92F6AF47635110F85C72269520AC5ADBBD1BC3D2B4763086BF546655AA2A4B08926CA0DA02B9DE4241B75B5E7CC99BCBF0F2E401DF715AAEAB378FF0098658C099AA50490E2E68C3A6CCC7576A924C372179A66055F5879E42531C0038B00850B82124585BACFBC1C4DA27E0A50FF006D12B88B392949B5AAA07DEA62115825153BBD4B1A7A6C6DA7D6323953847896A51B9924998247351FD7717C41E6D2D58B1FED6D460D76DB5D6C2BD0C4AE1308997C2A533E808E76A6AFBC6D6B23EF02C13B478BD7900227F0C23914B9B9671778E78F7D2A4B6B776F3AE85C6324215C212CEC4B0E5CFF000DF58548C992D7DA337DCCCFEE3F199C58558EE2B067E8C3ABB3F85B48622411CB7D7EA60759669C02549E7731F2263AC1D87C30267297706BCD81FB7E203294081777DBF3FC6F081DCC1A6C11C4205809B5A7CE3A5BF495912B8FFB59DF57D7AFE2F18187481F352DA93D69E7E9CD9ADFCF295B1E25A0127910368F537BF3BE1E4AC04C9A3E54BA74E4EF57E5B887985C3BD402DA1AD6FCED5FA54C45331D494C0C77C241BC28DF9DB90FDDC9DA4E464AB5172953D1836BCF7A57E9A43A1865392E4826819BEE0EBB9FB443AB75AB742210F7171CCCAC9022D6931E640E9EB89CC3F678AC0FF6D8EED7DF4B8F2DAD1B0C22B899ED5B73D75B369BF2787E65DA1A47178C738B83CBF5E7CE713B85ECD129629A1E5BB9ABF41F5AD2344E14872493A746D9CF336A6C0C40733ED0B6876082AD97122D0441E5F3E66F89AC07674A685048E8F6DC6DD2876A43BC361CB9E77A5697F434A75BC436BBB41324F79BFF00ACDCFBC4C723FB8B0E1FB3A354576E1EA3969F4EACF93874BD4D4B39AE834AF95222959AE43F056F149127ED913B8037F5BFBF13123B3547EEE81B427E809B914B386B343A4618306147AD1CD6C6BE0DE43788CD5EB068C8EF8DFAAE6DCA6F6E7BDBE589797D9B4A98F7551CBD5ACFFE7A3A4E1EB56E5B9B6B5E7AC43B3AD58DAFBBEEDF20DEE167EE9E5E66D36C4FE5DD9FEE81FF006AA2AFC3F5035AEFD61E49C307B1D19C1D2EDEF4B86788B3BA9D2265E3046DC6ABCEE7AFC671369C981AF776D4A5CFBEBD44385E19EF47D83BD3607CBF8A36BBA8D0A36748893F6D573FF508FDDBAAE8C9D229DD9ADA9FC72D6BE71A7E9056A6AEC18DC7D5B7E669B35BFA844477AA02F3E3E7E4388EE3D371CF0E1395049AA6BA387E9B37DF5A46C30E052B7A50FF001573EA219AA73D42A25D3B1DD5CA36267F73877272C4A480C0A8DC331157DDBCCB42A891566BEB5A5DF586B5E78DFF00CC83CA144DBA993CFA6DF0C3D4E5A1D9491E403EBA9D3FC6F0B7E9B97BFF00CA10D4E7483C24382F3324C7DFF8CFBA30BA32D4D999ABA13E2CF18186219EA77615EB5D36B5F786B733947F79224CF888FCE3E1BFBB0E9397A00140DB307ADDB9529BBF8C67F4C1852BC8D3EB60DB8BF846AFE309360BDA6FC479FC3E736E470A0C1A122890185C00F7E46329C355A95DDBEA490FF583F8B0BFF337FF0054C0EB73BFEE6241D7F4C904B2789DDE81EBEFA7285D3866360DE05BA0AFDFC213D466893C1FCC169B4813F33EE3B0DA231A8C3006A900B9B81AF9FBD03C3A120B8AB0D680136D39EF6E468C98E66836E3DF9123EF07F0F86F8C0C280A761D7DFE2B0E8480C38BC472D371EF5B473FC5120D9C8DB65728F51CFC87BED07E94034008E601FC74A8FA97D6761C10E030D8D7EBEDDB678E7F8B27FE67CCFF00DF83F4C3FE29FF00C53F986DFA73B0F21F98066C9FF99F3FCD6707E987FC53FF008A7F30770761E43F31BD19BA37E31E627EFF0017DD1F2C1FA61FF14FFE29FCC67B826EDE207E617339B213C5E33B8D951F8FE76B4EF8467614355218DC507466277E909F72C482068C43535B3BD5F4E421623371FF003150623C64FAF3133F39E9BB7386410FC201EB50D62E4B1EA5CFD8EE52DABEFF00C3FE617359C246EE131FEA8F4B4C7EF6EAD2661527FF004BF5BF466F00DE91A1C3A740FCEC7CADEF943A339CA0442C836985DBCB63EBCC01E47082F0A91D342C7C6FCEFEB78CA64243D1BC4926FB1FE6D7879A6CE923FF0030F23F68F4E7F9FC45CE194EC185E8F76205B9B3F98B6D0DE6C904BA412750697A59FF00C33BC49A873A4C0FE64F985493F80F39F29C355E5CC91476D19B6BEECED61630D55254E5A9B8D9AFBDF661E1131CB73D6D2140B84484DC93FB267ACF3B5B10F8BCB8A83F0D3E6E6E7714A536D61352787C7935A2C1D399FA03E805C24150B719EA3913D6D7EBCE6714BCC72E67213BF42EEDA7F986C0BBF36B16A0FB7D1B678ECEE8ECC935D4EF3282081DD13D4410641991307EF3B938E37DB1CB140899C25C3F85BCFDED0E30D8BFD3E225B1A715DCDF57DC97AB52F7B8E9CFD269D90AB53F64592F68F48D71BBA51BA82FB884CAC8A9752D278D43C4AB279F981CA63FB199D4CC2E3BB92AE14A16800380F4D282C2FCE3BE763F302B44B4B965D0DB7F16F2FA57E759550EBA029C04252A5049DBEC98363CC4796DEB8F6BF65F3046272F96A7015C1524BE9F7FBDDE3AC292424275A1EA0D7EE235973CA790BFAFCBEEC466758B4CC5292142B46BEC7714F5EB1ACAA2D3617FA1FAC6C43A6FBF2E7B7EA7D047DF5D912560B83424F838D74A335372D0EE727BD606840A86F2F7EB1B0B806E23D4E2465A295DEB7F2F2B9FA86847B8AD154E8E7EDF7FC62AAF7996D4CB090A2F885180600E932458F2BE375A8A0505073DCFA6BBBC6532120D4B87A7E49AFD0D23EE58D7D7B87F90F334A23FF2295968091784A12916E623D31F37578BC5A49054B501AACA97471FF27AFBE51F3CA5769715303AA6101EA6B5FE43ED5118703AA5A7EBD9D2CA567C08EE54A9F78988DA670B48C74C2A0F6342C03823C295B785A3188CDE74D4105448152E6ADF515F10FBC0E648A52C3D4AEF7A94C12A29E19D8EDF3369DEF89FC362659FFA92DC8D697A7DF5262A7986266CC25B88062E01D5DAA4330DAEDD21C9344BAA4210D27854CD9CB44CF4DB6F89B5BAECAC44A94B981494B2998961D0DBD2D5A44223193A4AD8053137A83D2DABDFA750BDACB5F6CDC098B4904DAF17E9B11E82F88E9DC331F8080EEE069D1F43EBCA27F098A54D62A0DB56FE9B3824C6F51553C7188045A0031B7404EC3783BF4D9A270D338832B6607D75F21CAEF1348E129D1C742EFF009FA51E95D2BAB49025503DD3D3CA3979DEC77C4B49904252407FBF99DFAF3D8319F8954BF9520921D9A8E487A300D7606D5D286123F9C374401EF078A6F206D1D7A5AE7E785958454D0C0356E2BAE9A68CDFC467033666214789241AFEE24BDC5F41D7CED114CC358776094B891C878927A81E5FBEB87587C996B3AB86A36A58F3BFA44909243D0BA7C5DDF9EDCA21B5BAD14EFF00E6A470837E310679DCEE3E78B061FB3EB2CE14E74626F66BBF9BF278DFF4E5DF57DFF9BB546819B6880E6FAD9D6F8887B69D9423AF22479FE63160C376616A1FB554D83D6DB7B1CDE35EE00AB7A1F5AFD6F15B66BDA0BE88870DE40F1F48E73CB9C1FBB16FC9FB30025416973472CEDE5A7869A562470522A6C69A0DFAD36143CEA220D98F685502DC7133FD53B6F10636F8FCB16CC3F6725A588439E9F5A55F95F6DA48E1C1B25AF63FCBFD36882669DA3383878DCDE784957BBD2D7FDC625A4644840712BA8B0D0FDF5BED77C7E98EC697DB96BB11107CCBB458E2FE77C553F79B7EE71268C9D9889543AB6DE1AF2A6F48C7E90E80B68000DF5310FA9ED0A7ED390449BAAC7A9131BF947C313383C8D731C22512433B06F56DCFD2978DD187E0366A790F7B539C45EB7B40041873CECAE77F506F61B7289C4EC9C8668209924071A52F7A57C0727DCBA9529D541C46CF6F01EFEAD11B7F5BAEA15097002264F1011D0EFF000F76DCE7B0D9404FEE4682E3A7D747EB630F112663064B02D522FABDB956CF6863ACD5CFC121D83FFAB6E53CEFCBF6226246552001C400A6DE27D9A6D7A391216CE433D4BEB40CF6036A18607F54BEB8974D898BF2EB24EDF893E78929796C9154241702A18EFA7E5FEF0F24A1449F9438B7A787AF367AC34BDA99C5132B248B595BCF94C7AEF85060D2094A6583762DFC35B975DA1C194B37413D4084ECEA0717C72E447FAC5FE26E6DF75BA6A708D6433BB8E1767DEDE756615A083BA57FC3D04277B3F59305C1CEFC5BF3F21B0EBE9B6105618B91C0430D8ED4ADFC1BD088C2A5A9AA8F4FB8722DF686D733D75572E584DA473262D3E5BFCF69DD18750154B73E61AD6E553585A5485100A505F723C47DBDD92AF3C5DBF99E9D4EDCBF630B265115B9DA94F7D75858E1A610CC5FD3F9F2109159D3A77583D25447E9E97C2F2E492C40A92761ABBFA54F846061542A5FC74E77E637E509579CB9BF797F5FD679F2FD70E44903FB69B381F7FABC6DDCA989AB3EDE9CE386B365A8A871DF7BA8FE07CF9DFF001467A120064B72B8D3D3A529CA364E1946A01AEC0F81B10357B46EFE28BFEF3EE3F9ABF0C35602C1A1C2308B001677DEFD1C68E2135466AB1C32B3B923C407A49323E1F9E08769C32C81C496E9AF3B8F6E7AA6FE2CBDF8CDBFD53F120C0BF909D873C10BCBC3B100A4DF5177F1A3539E83683F8B2CECB3F1302DCCCF3371CE647492359D86528D05A9AD3F3E3D2907F165FF0078FF00ABFF00BB0423FA49BEC472335593F6C7FD5FA9FBB0460E1660D3D3F98528CDDCFEF1E6388FC7D2FE57C118386982A416E9FCBF942E673654125520C589DB698E636DFDD717C379E3F69F0FAF2FBF5168495865F11A1AB3163CFF0093C86CF0B119B2AF0BE9FD463CB788C335817173A6FF00CFD7EBA9C24CAD1C8B50FA7F10A7F8BB96F1CF520FE67F7EFC345A5DCB3034F2B5A82BECC6BFA69C2C83E00FE217319C2C412AF7C9F4E5E5CA7A473C362826E0EFAF4B535F1F078C9C2AEFFF00ED3CBCB43E476877A7CE5C9BAAC77BDFDD049B4F2B7ADB1B499449F9833EFA5F57D79C379D87527FB5DF6A03B59FEBA59E251439D2ADE3B48983C85AF33D798FBB0E4C8960114A5AB42EDD29F73630C66495281052433871D7AD76FB44958CED61248724881F6A08F74EFD7732047945E2F0C1493C29A54E9E3CFF008D618CD9132AE9248A06FA790D6B6A9AC4D34E6A073BF44B877B99116E9CA47979EFCE9998606612AE14B8360C49D795296E8F11CA9337662FB0FF00034E76A563B63D98EAE0CD7B54CB5857D64A123C52045BC5D2C7A8EB7C735ED464EB99865CC54B628428B9005FC2AD66FA35232795C99E8F9480541B4F57D999E96E663B0DDB9E9A4EB5F67FED074C5434568FE18D5435C49903810BA8F09DFF00A44C1B9F5C79C50A548CEE4F092026629C02CEC59E9F6DF68EE7D859A4F03BDD2D6A5B7A59B63A74F8FECF1B6E92B2AB2F4A4257499857B4A064484D4B891D62C2D6BDBD4FB1BB15989465C80B53012C30259E95E6DCFC6D1DE904AC7117AA535028C05E9E3F9864539E7246DF1EB1E5CF0F67CC99889C7841238B9B33F900DB42A94D416A7E1E3969DBA813111D7F7E677E589944B972E5A12B676ABFBE6478187A9040480CFAF37FBE9D2371713BF14FC6F6F3F2C39425240E1200D83726D7A46EA42920929206BEF58C1EAB4D35338F012B4A9BE131600A84DE236EBD461963D69952D550686A1AB606F570ED6E51893C33961093BFA036F7D23EEB90C0E9E222361023FDBDD8F9E53E52438291434F478F99099412E05069ABFAD2FF00C0A4284B29FEA48F7807ADBCA30C912439A3541D3C4BDC68E7CA3612D9FE6356A36CDF8F7AB830F25BB13007B848F3BF97BEC39E25654A25258508A5DD9EBE1CFD8D0E1D157653DCB6E051A91B1598B6CA499049E9E198DAFE9D77B5FA6C704A9C40A80EEF5BD49F0D3F986D3B0729D252800005C52BE766F76863ACD46D37BAC022CABF4DAF20CF2DB79C3B93922D740E75A7A786BD7A88D512C22890C34034AE9A9E9EC45ABF59B54E2CA0419B1503100DF63F77E789AC276754BB8552CE2D466F7AC3C94859B17D19B5A52B51E9CA2039A6BE80A01404743EBB7E6019BF2C5830BD962B22A5AAC081F6D7973BC39124283901BC86EC6C3F07AC40B32D78E389480E9313693FB8F58817C4EE1BB2490589D469CC9F1A7BA0791C1E193A21B7D34715A7DD8B96315F66DAE570A3C6AFFA8DA37DE48823F41CAC983EC8CB05249AB0D00DAEF4D7979C48270E4B101B4DEFE3AF28AEF36ED01C6403C6A13360A304027A411E738B7607B2B289B03C2DA313ED8FE09683F4F5B5CD00FA50FDA95A33C57D99768CE92A951833BA89DC1DEF37F3F741C5AF0BD974060C2806839834D5ABE02D19FD393702DB0D34707C07E2209996BF7564788C09B137E80EDCAFB6E6313F87ECECB940B84D59E8DBD0DEC5ABD76687125A43850BEE1FD3CAA4FDE2215BAF1EE4AEBBA8F4F5B49DFD791C49C9C964B03AD68431246F7A07BFD21E09C820820176D486D6ACE2B7BC43F30D542BF87896416E600279FBF9F4DBA4624E564D2D92C052E4B5791F1B56C3785D130711A38A11A38A6BEFD2B17AACE512789C37064F118206DFEDC879E24E564928814018D28FA07A73D6DE10E51310481C2C7CF73B1F3FE222F9866C1C4A421C208E52473BF3DE2779F4DF161CBB05270E829094EF6150FE22C346FC6B36499EB484D00B902F50DB1BEBE2F0C2FE647FE6CEDCFDDD6D73CFEEDA5D12E4B5427A33B7B1E1607487D85C190A0E9E56BEFEEEFE24A2566409252E12044413F70EBE9CA63094D9485060863FF2A02C1DB6E94360444F49C1800028046C5A8DCDB7A8B38A184CE660019E33111F68CFDFBF958FA02488E99809ABAA490C6A03DEDB6C5F5D6BBEF3A42024FCB5FF003AF2DFC7486D7F304DA1CE479F49E9FEF6E587B80C2CC90E26329CEAFBFF0022FE15B6F8292921C867715EA77AE9BFDE1B575C913E3B936379FBFA7C312BDDCBD852FF00CC487E9D1B0F2FE634FD787FCC3F13FF007633C12CD78475FE633DC27D83F984CE55CC8EF0DA48B9BFFEE1F2B7974C704BD93B697FCC63F4E8D8797F309555A0117F9917BD8DFCB0D67A521D9205054372F1B75BEC214972057852FD037D2B1A1CAE17857A7895CFEEF4C3585FF4B47E1A1D77BDFE6EB094D7264CAEFCFC4BC107E99A8CDCBDAA38FAF23FBFFF0072F1B71AB7F41F88C1C283700F5FFF00EA37355C91C442F988B9BC0EA48B0E64CEDCF094D2FC3B87F173EF4AD6B0F30F85490C523C869E6F4DE87CE395E62019E23FF58B7BFF000184A1D7E8D3B0F249FAFF008848BAE0621479F318236FD2816007BFFD5187D70FF71FFA8608CFE9B97BFF00CA33456024CA80FF00D4411849603D2F57F48C190137D793FDCC67F5B1FF00311F2C690774397FE23F307D707FCC46083BA4F2FF00C4473F5DFF00F553F1FD7041DD0E5FF88FCC29A7AE09E225C076D898F7C1C27334F18061D2AAB024720295F0BFF887046629DF8933B1BABEE9FBF09D3DEDAC67F4C9FF0088B6C9A7F3CC79C2D6B304413C493B4C927E026E45F6F8E352949B814BFF003FCC63F4A9FF008BF4F7F585A9AF4C8F1EF72388FE7FBE538C7026FBB6BEEFFE231FA245F847D835986C75BBF285CCE60949FB569E4ABDA76B8993EB68C359E0241005DABF51B7BDDA23F17252904049200AEA6FF6F7762FD4D99A2C02F94183FAF59F7FB8E1A4462F0E922CEF534F1EA6FD6DBD5F18CD5278471C7FF5449B4F3F9DA2E3D304021BD7686D330E0B70D80A8A1DF707CB9C4CF29CD5B8038C8E5B91173E73720F5C2664CB533A438D587E3E90D558740BA4575DFDEACCF174681D52AA1CD58097152A75B54955E10A06C6E248FBF9099ACF68B29973F053D6123E596B7617749FA3B57D68D5CCD70E04D96426AEEE1A80355AA2BE7C8DE3D7BCAEBDAD5BD87E78F00852AAF24AA055024F734CE8B98F2B836BDF1E16CD248C276AE4B025299EB013A1E25746714BD599A3A576397C0123F69F958B1D3C2FBF9EB4F8CFED532F465FAEF523688FFF0036AE040B01154EF2B44DAD138F4D64B30C9C2618874F1212487E40E8D4D5CD01DC18EFD964E3330F2C7EE00539B8721F7A1D686DA45798E83964C9665924076BD34A1BD47D5A2591281E9BECD6DB4BB6AC6353AA03867CFF000BFA61863713F3B0535695E6E050F869D61DA249E20402C2EE59C737D4F946BE31FDC46FD7F77C2B2316521B89F4676E4ECE3E97F087989522649EED0C54DBD453AF4673D19A1592D5552BB4AE186D650A52F6E1E054C5C03E2888F7DE711F99E238A54C7535CB3FE4F98E9CE2264489D267A2784964F13ED5BE8D4BBB7231F79E8692483607CFA4F33D3A7E78F0CCE0A2753F8D1879FB78F9A610E03D0D5F57DB5D2372DB40493C42C0F3F96E709A10789238581D5B6B7B3F78381B9F2B79D7488ED6D4A5A053C6011100902237E63F600C4D61E4BF0B8B81A5FC2DADBAF283839BBEBB7AD5ED10FCD3352DA13C2B07ED490409BF3BC413187C65AA531425478B46D34F3F37F209AE5DABBD5AD6E715467FA8D6DF170B8044ECA1CE3A1DA62C7AF95A7300A98E01944BB35DBD0780A8F18C26497B39A69E3D4DEDE622A9CDB58AD9FB6B242A62E6DC26F6E9B7BFC8E2FD96E144DE10A9646EA20FD00A5A9FE21DCB96524937D2C7D2B5EB4E45A2BBCDB5B92170B55CC889B83D36E5E5B46DCAEF80C9E5A824DA81DC74A0F1FF0030EC218543BDCE835EB53EE910E7F5B59414B226D04EFBCFC62F137C4D0C914E381015CECCC76A3DDEF7D054449E0D245746D859B969A575F288566DAD93713E97B7BED7F48E773890C364D3D0CE87E82BA519BCC5A8D41121107ABD522AAE49841E6779DA2667CBF238B0E172F9E900041F6E3F3AFD60F7D07B6888661A8132A957B819F5E401F77E589FC3E167243841A5A8CE5E9706E7D7AD4888D4E7685127909DCFDF079FC2313586C0CC9C3E6490ED52DF4BD7931AC67F4C673102A7F8E63C3F9788B57E70832479F1413F7C4DF78F98C4ACAC9144BF16C76B3685BC7A54C2C8CB961EE096621CED56356BD6DADE22F559B990524A4C192491F1DFCF68E9E92B2325208F999E868FCADCE9CF5687A9CBE651817D6FE0DE218FD1AF1FA8CE1641959581EA2F71CBD3E3CF0FE5E4CAE22126946FAFAECDD6B48772F004DD241E86B7DFECC7AEACCEE6AB51FB479D898B5FAF9C6FD23AE1C8C9E63808AEEC6A0BEB5FE3986896C260121412450B5C1B53FCFA8BC36BF992C09E226677F48E7CBF0BCEE4AA9CA2626A2B6DCEED4A9E9FE1A7A4E050006482C5C161AE97D35AF84256B3155F8D5BCC4F9CC70F5E5B5BA61C270252C5436FF17E56BEB1209C2B248E17DC8D2874171E2E7C2BC3B5CE411260FAF59DCF2FDC61CA30E84B3801AF41CAB47DBCFCE23E7E1493661BFB1B37896A351B2A6BD5E0B9B024816B1F78F2DA2FE77C36C5A65A47CA41248DBC79DB6FB554C0E1EAA090E297E67DB9D078C36AEBCDF7F2137F84DFDF862E6EE5F778933873FF0017BD5EDEDF9F8C70D57295C526C47F70DFD27F7EB8C3EAFCDFEF07707FE3EA7EFE5BEDBC60BAD11BF3B78B7F9CFEEF8CB9DCED7F483F4EAA7CBFFBAD6BD7E9CE13AAB48820F90B8F91F3F3239EFC9A4F533EAFA93AD3EFF8E8ACAC39049663E07D5FDD7C343958B04EE6666E39FE1FB3869C67610BF72ADFE9F9F7B084A6B960917F88FDCE0E33B080C957D36DBA8F7BDE31FAFA86E63DE3F3C1C6761EBF983B857B03F31926BD5E220DCDA26479EDE42D84D6B347ADFED6F661C4A94A4D086E647531A5CAF72E01168237F9FCFA634EF03B51EB47AEADF673D690B776378D62B9CBC903A6FF00AE0EF361EBF7F380CB1A13E35FC4726B564CF11F404C7BED8CF782BF2F42F6F483BBE7E919A6B14641519F7FE53F2C36985CDB73E7FE20EEF73F6FCC67F5A3FDC7E7FF006E138CF00DCFA7E20FAD1FEE3F3FFB7041C0373E9F883EB47FB8FCFF00EDC10700DCFA7E2334D6A93B1E7CC9F2E91F3B61399A78FBF7F783806E615A2B960DD56F53F7613804B7DCF41A7BD7D216315EABF885BCFAC7EF6C101975D41E63CF6D87942E6F31541F189D8127D39F5F33D7041DDDAF6F3E6397B78503317131E3F2DF9CD8F3BEC3973B9C359C6B4B1FB010D71320936B8EBCB507D1FC21DE8F335DBC44C45CC4CFC7A7C4F5B611861330EE9735D29D46DE0F73E7477FE28B0A49E3DBFD44EF1BC47CB6E7821A2F0B47776D36F51F7EBBCB329CD96384F1DBD76F9C8FC799C10D26615DDEC76BD1B57AFAED13FC9B54FF000DAC61D51528CDB8495472BC0B5CC826DD31AE324A6665B8B2A0ED2D4C06A58BFA3442E3B08A98A49093F2B9A3F96AE6EDBB7378F6CBD997355EA5F67BCFDE52A4D3E5758949245FBD4BE9304FDADF604FC71F3FFB649123B5982401FF005712B04805CF0A9EB4A6CDAD6D13591CDFD3A892A090180A736B6ADADCD5F78F93FF00685CA9CC9BB50D594EEA5499CCEA1490A052654FB8A98224CCFA73C77EC19E0C34804D3BA43518B848A7979DE958EFBD9C9C3138292C6CE14D5B9A3EDD628C2A80241133F2FDFBBA62D597E294994B00B16D4E95F5B5766DA2EF2E41090598F5D2FAB5FA5234B8B24A523ED5EC0C9B6FE1FD397C22A7628AE6AAAF5B57EB7B33B36BD61D4A944CA98487B51EDA6FAB4042CA0AC24C0DC81205E37023E3E784BF5CA42CD4802CC5DFC896D0B188C9638B1291A150B8B870198E97F1AC29CBE9DCCC5F6B2C485F1573CD348E0495ACACAC25094A520A89248989F3BE2371D987121614A77259CDB9FB6EAD169CD25CAC165CA9C0252B12CA9E95A55C9B3E9BF847DE977E9FD93F963CA8403711F2A7BBE7E9FCC24AA7C04D8C588DFEEDAFEA396E30BC997C4A7091422A7617F0A0D2FCE0EEC6F6B53F98AE73EA829E205467909D81F7DFAC98EB8B460240212785FA8B1D797234783BBE7E9FCC55B9BE6EAA44A932541C993C46D137079FC276B0DF16DC1E5B2E7FEE48A33D2FC853CDE977730A224F103A9341A6DD5BEBD04529A9B3509529C0FA9B324D8157EC7C3DC716ECBB219331490994058D5ADBD773E3CE90A8C314967EBC9BF3C9C7845379BEA072B141B455F129B24429B080667990072DF68E5D6F381C9B0F2582C25205CB8A7875F6EF0E932428DFDE9EFD451EBECD735CE5BE25165B0D5E1C0F34605EFC324C8FBBCAD8B5E12565C3E4EF0120541A35A84BDFD97870891A31A54923DEDA163B1A4429DCF5A794B4D4D690B444212D1B13BDD3BDCDB96F7DB0F26E6395E5F45CC9638AE4A817B73F7A521C0989902CFA0B7A38F74A52196AEA9E767EAD4F5954397754B50A99E9C2855FD2DEBB9CA3B5393CB0077F2ACF5501F53CA9A5B68C7EAC3BB73AD9F62D7D6C075786FA6D3DACF3F5AD19469CCCDDEE48EF09A5A96878BECC153402BA7C49EA17476E32094DC588C397D0CD40A8AEFCFEB4615C8C524B92083E9A569E74AFD62454FD8576D19B81F52D2554B04FF5B896E3D78C00236E5D779C253FE28F66B07FF56749177E15856BA70B92E2951E942ACB9A8501C4BD580614F7BD7D2AE87D927DA2F30095536892A09992AAFA54403B1852A779E56E7883C5FC77ECA61292E78249A32555AF20D6D5F95ED37815A12ECA490C18961A787516AB52EC81FF00637F692BCE8804117FFE25487E1E212379DB9ED84E57F507D98A033A9A517BBD68DE0C74E71312D72DCFED1677228C3E9E5118CD7D8FBDA329921751A114A4C1852330A7544033210553EF1F9626709FD40F67669E193312F40428A83FFE4297F57DA1E266C9B28A5EC198B1E4DE75FCC5539FF61BDAB69C4ABF8B68FAF63BB9E20DA16FC0E63F96850BF53BFDF6397F1B72650752E53901BFDE4F8EBFE3EAAA67C80400C40BB306DADA9315366990E774CB08AECA735A22991DEAF2EACE111BCCB2058F3DAD0716FECF7C51C97342522749413A77A9513CD9F7F4BD2CF244E0A53A025401F992E900DB52DC81AB1E42B11475550CB8505A1992447DB50A45373B82954131E9BF962D67B5997B3C89F2C837F9817D857573A69E313B875C9984F11EE82438480540F881EA28FE70D9993CC3686DC7AA0B0E89EEE9D282B0DFF702B13C53E77C2A7B41859A974AD249D5EFA52A29B5EC3C64A423BD05405750FA581BED5E9CE1BE9B397140A1CA9E200785250124F2898916EBB79E3538FEF090920BB1047A519E96FF00308CEC27CC4F0B39734A1E5B8A0A5DC51AAD182AAD6A2A2A6CB69DD04DF8BA9DAD7E57B72C379B356A2789C27A9248F3E7BBBC2B86C1A407721EE386CDCEEDB75BC2672A81BF17A99FC62DFAE10E24EFF587BFA54D9CBF43F47FBFF089DA9008E131D60FCEC09F960E34EFE8631FA54B7EE3D58FE6FEDA357D689DC93FBFFD3838D3BFA1FC41FA54FF00CBD0FF00FC51A9CAAB893BF5E71EEE56E5CF7C369EA1422ADE1AFB3E3A43997870E0B3F890CDBB937F6743AFEB3E7FBFFA70DBBCE5EBFC438EE07FC07A7E639EFC281926DCA3F41EFF008E0132A1D34D6BFC41DC03640F06FE613ADE4C89F76E07EA7DDF760332EC3A560EE07FC01F2E576A7BE75E5AA8826F3B474F41B981E9EFC379AAB134049F7EF58048E7C23A3D7C08FCC6FF00AD790F9E11E34EFE8633DC7FDFFF00B7FF00AA13545403C3CBD27FDFE5EFC1C69DFD0FE20EE3FEEF4FE6137D60753F13F960E34EFE87F10771FF007FFEDFFEA8DEC5481C5700F9C9B7BFF2F7E3459059B478C89203B906DFDBD79FDFF951F5AFF5A7E18D236EE872FF00C47E60FAD7FAD3F0C10774397FE23F307D6BFD69F86083BA1CBFF11F98D6BAA16950E7E5D3C8E119AAE16A3F8FBF6F183252756E80463F5BFF005FCFF4C23DE72F5FE231DC0FF91F211B1BABB9F1FADFF7E7CBDF83BCE5EBFC463B815F98DA94D6B7E56F58588AB103C5BC45FAFBC6FEA70779CBD7F88CF703FE45BDF9FA78C2E66AC492553EF9E9222D3EE048DF1A124DC93D6119B87245F8B9B337A9A7BD6AEB4F5A9170AB7979ED79313E7BFC318866B9203862DBFE43D3F8A43B335C991E2045AC4DFF003BCF58B804D8E0840CA150534BBE9EC6DE90FB4B9824404A88E978F3B79C580BFBB04365C8493C4CFBF3D37D4ED5F1AC4BB2ACF9346164C2839C299578A0191FD524738F90D8E179CA6CAF16583896B63B0E13A589AFE758426E042E5CC5D9858815EA6E0B79F808F71FD95EBCD0FB2ED5D6344949695DDC13FCC0E54282E4CC90248BCF4137C7843B48944EED9E012520A7BF9E56C43020B8DD81E4DE8229B3E7FE96690E032806D5BDB9E54A068F05FDBDF432A935AA356D3B60379C3CF297C090005320054C08B99DF73D648C7674C9270F87521354A45BA002F4B6BD3731DABE1D6681695CA597E3E16F326C7D1AA7D63A00E38971BA5B01F6828C7398FDF9DAFB626F0292A96AD29577EBEDCF5BC777932C2A47117AD46D5B57434ABD2FA3425A86DBA37DEAB026A14128A74DC821638551B83123E1CAD88F97294664D5317AF9543B7315A9778D258E14AC3BBD816771E7FF00768DD636D3A2B1861CCB1100D47F31E5282645BBC4DD5B589DA76B622F160C849AD43D0EA1F6205A86F5AF846CC42D13BBF2966502036C58BD346B335F778EF6FB03F600AED63B51A2D479CD314E97D1AE1AACC1F7507B8716A6CB8CFDAB28871B1B489B5C462A198E35499530A13DE2E89097624AFE5706F477A7E04557B71DAD4E1300AC31980152140A5C38614F3A07B1E51F58E1D3CB88FCFF001B63877007E5B7F37F778F9F9C01DF4DBF9BC25AB74847F548D8111F8DFEFF00961E48284B0A51B56BF96BBDDB918024026DC872F1BC5719F3AA2493369DCC1E87E3F23CA3169C04C92809798916B9D35F75FAC67853B7D62A5CF90A7DB5109714B483C21B6DC5933BC84824440DF165C366F83C1DE6254ECE1C353A6BD357DA364B4B2F50D7677D47DE2A6774EEAFCEEAFEAF96E455350951294A9C4A9A499302EB40817BEC79198387A7B6F83921A528248A30587A72A0AD7F9A43849E201D56E5E76B747BD8561E97ECAFDA4EA84B0E2E81BCA1944971D152C2D442AFC45016140813637B7B8C0E2BE2B4A94B3242D7C7503E55106B4AD4791EB487680901DC30B546BAB5CF2FF1132C8BD89F2547039A9B582D6E0238E9452BAA13CD2548570F94ED88BC5FC58CC65ADB0F8733127FBBBCE137D99EA74A1B5377085201254B02C01DFDEE6A7A98B4F2FF0065CEC474EA52ACCF4FFF00885C708EE5DFAC5453776A4EE4A41F1151E4623A9338ADE69DB3CEF3CE032E7AF03DDFEE1FBCCC7A5EC1B938BEB0C71B3004FC81FA503EDD39D3517BD8F92E82ECEB4F84FF0002D0F4AC70C7097541FDAE27BE428CEC7CEF88539AE70B491373198A7B8019E8D707D6FAC46778ABF057FF005505B4D1EC6BCEB411384559612114F95E5B95A2200465F48E97472921A0470F29BE21E6CC2B5154C9D3D4A15713A6001479057E5B771194CF9B60199EE7C4E8E437D2F48C175599387F969A65CC7D8A561991063ECB698FC3EE406214876338D35993162E373B7AECC20FD44FA1A5A96BB9E6F6F510980CD883DF2C5288F070A52AE3EB3C3B797320E14E29F8A002261436F523CEFB1B6F511A2B1D8894411C4C0E85B8ADB786AD4246D081F4D692AFF3EBB5FF00E198DBDDD6DCAE07A6F2F05892586206946035BD6D4DEF7B46C337C4B8002B954FD7D98E292AAAE9839C59824154471D325CE28F250300758BF2387A301895103BF2E3FE25AECF40CFA43C4E6F8A21DD7B357EFF0088455B995528101343524FFCCCBA9940DB9F1B4A3E9B1DEDB4C94BCAE69487C4CC06C7FDC56CDFF2F4737D459CA33AC5ECAA5CEA7616D2E77A3C42739A2CAB3E6CD1EA1D2F95E6748E712168451D1D31095483E36D90AB8B4CCFE2A4BCD330ECE2BBCC06227267AAD302D6BB16259448FB75D657079BE216405F130AB59EEDA8F0E7AC755FB47F61EF67CD76CBF579436746E78F0528290AAAA94F78648F0CA5BDCCEDCC88C5D725F897DA494A40C499B8E24D57C7DD700DDAC76E9EB76CAF3C521011DE84248658500A2DC8A99A9B75D23CF8ED5BE8FAED3B47D2AF36D26FA759654C079C77BB0C5338C34992986CA94EB9C491C8488913271DD3B2FF0014F033A748C2E3712A953E610132D615C20815759F97CCD7D0DD3058CC3CC40216971552C2C3AB88B8F968CDD181F38E8266B95D4E4F5CF65D9EE4F539457D3A96829A86DD6C1520AB8A0AD0849888B4CF58C7A4322CFF002AC44B96A5E3651700BF12542A0355D9F4DF7E73F28C9989052A0A49146A934AEE450727BC449DCDDFA975CA7247774D01B200D9513717DADF28C5AE74DC2E2403849A89CC3FB0BFD09ADF50FA6912299094212B02AA7A359BDFA084AE54AC78BC50373B7DE07E186852A4D155E6CD7AFBB429DDA9BF6D3C1BA6DCE113952A26C6C6F63EEE9EBFA6D848CD40B9EBEFDDE8F1A8049600B8A5ACFCFEBEB1A8D4AC0B98F327CFE1B5B18FD44A667AEEFF0068C9045FEA2353952AB024F316BF5F2F220F48F8B798B4ACBA4BFBD6A76DBF10B4A415548A6845FC287C7D79E935046F23D47FF6E112A22E9F5FE21C77279F98852C544855FE71F801F29F3C63BCE5EBFC41DC9E6DD45FAC62B7FA104EC2E3D4DA3D718EF92ED4715BFF001E9783B93EDBCA349A829224C1BC7C0F41FBF38C27326254086AE977BF4F7E31A2E480D4726FCB6AD1F583EB47FB8FCFFEDC2109F75FF6FAFF00307D649E7F13F98C10775FF6FAFF00307D60F51F11F96083BAFF00B7D7F984EFD491C3E2DFA1E9E83CF09CCD3C7ED1BA255E8478FE49F7D213FD68FF0071F9FF00DB84E14EE4F3F3107D68FF0071F9FF00DB820EE4F3F3107D68FF0071F9FF00DB820EE4F3F311B1156AB8E23F13F97EFE184E669E3F68D552942C09F23F4F7F6D9F5A57F71F9FFDB84E35EED7FF00131B9AA95C9FB5620DE7F21F0B7E4463815B7A8FCC2D455192788C7333B7CBF3C60902E5A0E056DEA3F31B455994C2ADD419DBADC45FF6318E34EFF5D6353254AD3AEAFA6F0B98AC54C71729E53EB1791F1913D2300524D8DFAC21370C412149F16EA199FAFD61C45728100199BEF7046FB0BF2F775B8C6D0C662129714BD7EC6F4A0FB43C51D63C2150AE198920DFF2837F7C8C10D7BBE3A243D68D424DB7A373D2241475CA75496388953EF30D260C905C702009E57311CE6DD433CCF172F0D96E2FBC584032D4CFA963E3AF4874890D2660586F94B02CF6EA3C74173B8FA1BEC932E1D9FF00B2B68FA5ABF0AEB692B56FA17214A2B778DA2524711FB408B1E51D71E199934E33B638F2E5430D3D3DD96268B25EA37B9DA38EF690044F4F0D52565C8B33EDCBCB7D0C7955ED5B912354691AE79C6F8DCCA3BF5B64265403EB2AB089DAD69F3C77CC34A98AC249F94FED0496A014F07D3CE3A3FC3AC54B44D9616B01D40124B061A07F7E11E28672E2A8A502789B75C1C306603846D048B7DD79DB137815CA08582B014CC4539D6F4D6F1EB0C1CD953B088E050AA400072035D35362D76DF3154DD453A2A160ADC6C0EE85E49912600331CFE06D8D1084A4AD4A2CEECADE9A7B6BD223CC89E678E142B81EEC5BC09D0EE2D7A54C4A74DE9FCEBB44D4791696D3ECBAEE699C54B6C90D24A9494A5C6C2AC0181C04CDFACE2A39E4E9638D226A52A6E27BB302F63B0B18DF3AC5E0F2EC0CCC4CDE1265CB2E95109F988212C4EC40FBD63E95FB2CECA72EEC1FB12CAF4165E86D8D5B995353BFA8AB1290871402D152DA54B1D1B5A9278546DBE2858291331F8F5620712B0F294D862D4512196E1AAC46A3CDA3C21F113B633715984F9689A5654B502534012F40002CC07896E91EA7B1926655447D58771C5B712527DFE2B981E43A1C70B9B89080E54C0D5C124FDDBCDB511C942944D0FD21D11A1B377071E6199B6C22070028412AEA0106C3DF73CAF88F566409694A5129FDD460281B91A335E90ED091424373BDF56D3C39F8F1FE09D3E811982D35A6E1512824F9413CB78FBB1AAF31C451A628307BDBA907C74BDE1596CE695F31BFE3E9B46EA5A0D0D917789A4C992AAAA93E15282DE128F25A4A52098B1B61AAB1D8CE204E295C25F8925DF956FA5FEF189AA008A577F0FE7AE919C67750E7F96A7A5A7A256C94D353A5413CBC41015EB27D26D8D44CF9F88F1926E4AD46ADA827E83F108F78BD090341B46EA8CBA128287DC2F19EFC254A0279020103D23DFC861F2677197500E2E4A413AB69F8680AE6A59C902BA8A37BFF0031C3542120711BDF71C511D49EBE67607AE1C8095A5C067A6BF4A46C0CD21C1247D2BAF46F5F2DCE5234EA47110422E2448E879DCDF6F28C289509746A35F66DFAF4A985E5A4AFF73923AB0DCF5F2BF38D7DCD3B444AD23681C201B7BC79636078DF8535DDCF5B102E3F30B7729DFD0FE61BAB6B29982D8E2499E21C8CFBC9FDFA61497825CD04A659D0D8F4ABECFBD3D20EE0173D1FEDA8FA4361CF295A925C47C0088F779FEC6153944C51A20DAC4747D2A280F5D20EE13EC1FCC6A7354D12225D47389208816B79FCF7E787523249E6BC0455E9B1DF6BFAD2B19EE65B5520EE5839F12E69A43255EAAA3330E3441F31F76DBC91B1F75C3F464588B842A94142399FB5CD39DA329932925F801F7EBEF48627756D1200971B93E693F8FE7E98728C93141B841D34660342F63EB7687689128BBA035281BF07C36844E6B1A1360E376EA40F59BFCBE6360F5392629A81637FF3F8A561D2654AB042481AF969D7900DCDE1239AAE85F04075B91E622FCE06C07E56E78752F239A0033251535DD2F72EF5E40BB3EBA34394CA40FED62350DB03E9CE8F57D9BDCA8A3AC061D4926F2089EBB83BFE3E58D66E5E24A4B4A0826B415A78529E7F58DC4AA6CA3F228A46843D3E82EDF9A533A677F8705BCCACA9C5005BA85ABBD698FEE0A6164A17C62D04731EF64B95396381C841FDCC9295F50B4B283105D8B6E43346F81CC7132D6089AA0C402EA2CC6FC8EEFE5A452BDAEFB3B7657ED079255B59D50D2E5BAA10D2FB8D40C301905D20904B0C25B42BEC84893326712B83CEB39CA1094E13113A6E178A924CC53CAADCA892A2EE0D7A6B1D4722CE56952146610B0DF31A82FA312D6D8163E9E0676FBECDFADFB00D4028EBE8AAB34C973175FF00E139BA1A3DD38D3249517036161B02401DE284F58DFD2BF0AFB726485271B89EF0A827E55A98A696625F5367B3C757CAF128CC51C4C94A92050597CF61E7D2ACDD7B66A2AABCA9879BEE129DDE490E4C4CCA40B481CEF3E631DFF0D9D61F30ACA5A40536AE6BD0D2BA6FD626BF4D2D29725A96B5ABF7F0AC37BEF369754C21125AB17B889EF49F2330009DADCAFC9FAF2B5CE485256EE2E3CF4EBAD3D61AAC4B42411FBAAF4A80F4B0AE82BF68C50A49DC7BB9FE136C4062B053B0EA3F329B986A7893F5864A4AAE09B583EEDEEFB721995A524F4311BCC01EF3BFDDF0CE04A8F1025DEEE76B6AD0E308EE41767FB8E9BDFF00883BE4F4FBFF002C3F2A01DC57FE3EDFEB121C09DBD4FE611D53B3C3C260DF6E9EFF003C319AB1500DB5A8D6AC6CDF88D880407167ABDFF10938D7FDC711EB98A7724977D4C60002C238E359DD44FC30AC82E76D59F67FE1E02906E1DAD071ABAFC87E587718E04EDEA7F3071AC6CA23E1820E04EDEA7F31CF78BFEE381AFF009F67CA0E04EDEA7F31C15ACEEA27D630D67000800333FDA3200161071ABAFC87E5846331B5B59BCDF6F238208DBDE797CFF4C10462A722397CE7E58D9258B9DBCF940C0DC3C63DEFFABE5FA6304B926D030B353683BDFF0057CBF4C20A5BD4D00F1FB46A5293A0FA7D20EF88D9447BBF4C325CD2C43D352C0F9341C09DBD4FE63626A426788CED1D6F31F71C21316695AB12696FB69A43BC3CA4283148DF9DCEB5E5D2B0AD15224907736BF436FBCDAFEB87324D5B6A75773E1EB08E250928500966B53EADB8E5D6E61522AA1485893C324DEDE5BFEEFE7187C491C2A0683CEBE86D6D0FA56E6C924AC17F9EB41E76BF36E557893D16A3294861D4A7822012120C5B9C1F2F4893CCE365E21294BB81F73C9C535D7C637C160F816EA0E97EADB6EE5C9F08B7BB19D22EF693DA4699D1D94053EFE6D9830FB81092A296E89D4542ED36F020F911CA71C5FE26F68060E5772998C262174E261C4052C59DECDE05E1BF69669C2483325A820A12C43548550F5A1AD3D5A3E84BB5B798A3CA72ED22CAD29A7C972BA569B0D98417051B45C848313C6920C0277C710EC5E07F5B3BFD426CB3DECF984CC2760A3C26DB0D686387E6D88EF2628514C5C171527AD407D457768F33BB46AAFAF52565129292AAB45434A4AA088485A504883262FF00AEDE9AC2E0D2AC0042501FBBA0A5DB571FC987FD9CC44E953A584ACA7E6B0E55A79D3C23C43ED37275E9BD63995238DC043EB294910077C4A840023FA8444EE4E39DE33098AC2E294A05411C44EAD7AD4B69F6A8B9F5F763B18676070CA5AF89540A725CD69D1B9B03B5A21AC9719535434A98AA52BF94BE1E3E10B32B49491078C2B844891BE169F998EE38388021245C39A6ADB3C74CC666585C160D454949570FEEA51C07A6AC0D7C1E3DB0FA3E3D9D329D17962BB79D754210F6608074750D4A095B0B48553D639C047178D452B1C690003E13071CB71EBC4E331F351256B51E2F9C970250351C94E1C3E9E71E4BF8BBDAD5CEC28C0E0A6148477826CD0AFF00ADC45D3F2BD022C1AE7531DE6D53AA2A6ADCA87AB1E0A6D4496140A6C89809B2A6C205EDF0117CECDE5AA011C49A06AB0A93ADAFD1C8E4F4F21284DC46314B9CA2B254EE5CD8FF0000B374D23D7253B5B5622980667688113F033EFF004C78E0CC67A927635FA822357ABF8C6AFE159A2FC558E29E1B23C6501039EC6FB5FF0063092945449DEA6DD2A5B9FAC3D41241E5AF2FE291B0656849016B29B192495F43D49C6841208767F7F785E5EBE1F785CC51A5B0A534845544151584A7BBF4E2DE77F59F5C22A965C104BEED41A59DABE118980167D5FED1CBD5F4AC8E17561A3B140492262F71D4F4E9B5C61CCA96B5800034F0A3EF6FC7842600028290DCBCC2848269CC9FEB93F0249DF9EDE677B893938659AA83026BCFA7DCFA40C0B3D48861ADCE12D9512B4003A293CBDFFAF2F5949382510004923EBE3A8AD1BC8C6CE588DEFE1115ACD56180425693C57FB43DFB19FBFADED898C2E5466B7125C8616B1BF8B75A38EB0E30E81A1BEF7BD6BAFBB3D6119AEBD534490B1239F17EA7FDEFD266B0D919268871FF00A7DF8EE75D9DF77CFD22019A7680E3BC27BD1E12A89501327E1E9CFEEC59F05D9B26AA96C0B386FB36D5FB6B0777CFD3F9881667DA2BEDF143FC37BC2A46D6B4FE9F218B1C8ECA099FB500D350DE1F814D2918E02FF7F7E1E7AB188357F69D52D903EB0428CCF8F7DFCE0CFE42062C380EC8238085201234E1B3DF9D7C0F331A9412086E5BF37A4466A3B53A8850EFCDC9895DC472DF7E973E589A95D9094A1FF4D9887A1623621ADA9B96A6B00429ACFAE9E2FEA4F588C661DAB55254909A832267C7681B400679C7EE43F4762D0A149628CEC923D5EBC853A42F2E5A941EAE7705E9AF4AF28655F6AF58524FD60DF9779B7AC91B9FDC9C3C47629240694073236E82BE5E5587694AC0DD46F6A372B7E00E708DCED76B1929E1A851E23FDD3B795EE4ED3CBDE70DB17D8D290C9941F9279DED51A96F4891C3C92B49D4B5697F77E4C5A1DA8BB6FAA640FE793B48E21C88DE7D7A479E20315D8A98A04F766D6E1B79529ADE94AD1996330A482403CC5CBEA473A5BAF3690B1ED06E32A4D3BAAEFDA7C8E2638A3BCE1823C60786373793B75C404EEC54D49E2EE94E2D43AF8066A306671A38786EE95296183925CEC5B5E6D5B7DE2CFD3DDB9E48E1698CCC269E956414D3059924EF2EA6151241B9B6D30311388EC8E2405AA5A4A2616E13C20B35689B568FD68627B058A992AAEE28E2BA1A31A1A369FE2E8CC72DD01DB3E93CC34BE7B47415B97D753F754B5AE1696FE50A5A49E26E65E59716A04C111104918A8636466BD9EC6C9C54954C4CC493DFC90E0625BF6D6825F00BB5DA3A9F65FB408929E098A6B1049763CF42093E25F9478ABDBDFD1F3DAAF65598667A83B3EA7735468AA95B8FA9D692842D968952C2528254F2A0950B09B6DB01D3BB1DF14254B9C893899865E210405495929035B9A59CF3A8A878BE8ED1616700998A09243F7AF5E4C91D408F36F3ACAB30C9730A8A7CC69AA696A92B297296A69DD616DA84820075292A122E403D27618F4A647F127013D2841C44B51200AA83027406AE39D6AD416890C2CF4E264A149140FF00EE38255D520BA4528F7E7A321AA29540B106F0608E7F1DBDC0F3838BBA332C2E6684F76B492B0E450DE86A37A781B8A3484AC22A790D507602E06CCC3CF581152553C46E37BCC721FBEA00368C4762E58C190A019CD2ACE3F8A7A9BC3A565EB9041524A5EDB10DD5AF5F0EADB03E39284F90B88E7FBF74618FEA945E8E0EC7CEAD5F6EF0770B735D9830A7AEB1A5D72786F3BDB6FC3F5C36993BFE5A5A967B79D2DCA306490E49B72FE79C69EF3CBE7FA6102B0BB69D75F01B465324AAC7D3F983BCF2F9FE98D90B2922AC3D9FAC68B41433977F7EFA41DE797CFF004C2BDEFF00DDE9FC4690779E5F3FD3077BFF0077A7F1041DE797CFF4C1DEFF00DDFF00B7F8820EF3CBE7FA61354EDFC2BF602364A789EACD0779E5F3FD31AF7C9F6FF88DBBBE7E9FCC6C439B88F9FEFEEFD4EF93B7D7F1EFE8777CFD3F98D9DE797CFF004C1DF27DBFE20EEF9FA7F31A1E74880047BFF7F77BF1BA5616682DD75DEDE1D3946C257158DB5D23477CAFDC7E584D6B147A0D2F58C19453737E5FCC1DF2BF71F961B4D582181A8F7D6DBFF9C777CFD3F983BE57EE3F2C342B0297DF97A467BA3CFF00F1FE63053E411336BDA3DDC87BF7F9DD25AC121D85FD9F7B987B87965AFA736E5ADECFA6C291BD1526264F283FAC18BDB96DD670EE5A81D6A40F41F6DA1ACF0CA524835A00DE1D7DD0DE1E32EAB090EA9C850013E76F416DB7999185E6CE4CB492685A8747E5E8C7C7A9232E1398F01351F5E54EA75B0DCB830EB398AFB9694942B69046E4C6FB72F4B1D84E2AB9866C25950E2B3EA69F5B830BCCC28C2A4A8A5D22E35D4BD3AB51A879C7AF1F46476448CBB506AAED873A60AE9F45B0C8A05BA8FE5BEACC987183DC2D4385CE051495168AB84DCF0918F2C7C5CCF138AC6617042710A9F32810496E1525DD999F623560E6392F6F730E14A422812E082DAB114D7D1AB1DC8ED0F3DA8CC01AA5A897C3D505D24C12DADD25B1E8106398F9E3A176170A0612495A43290928A6C056803BE963778E32B9C66CCBBD89AB35C6BA077F60C74B35CB08FAE665560F829928537D09524CDCF9CDA37F3C774CA25F1CB94959AA8B35ACD46B7BE7164C94913D079BF4ADAF5B1D9ED1E52FB4464FDFE7C3374B453F5D5A8A951013DCC004AA204EC27DD7225AF6B72A97230C6680012851240D838ADAD4D3C418F4B763330E094002FC3C20279F21CA9A56269EC6DECF755DB57692DE719BD3B8D688D34EB1519F5538DA836613DE52A5B240539C4E37C2AEECAB732236F36AF1789C4632749940A8A14A4F059DC900BEE967E64342DF123B649C932D01C0C4625244B5F13997C20713A6B705803F68F6FB5867B414D449A4D30DB6C65140CB3454397A385A6D80D212C38E0042412E1471EC08E66716DC932698A4A3BF509D36A56BE009245481A03C2081AF8C790B3BCED59A2D4A2A2788927E67A9F0346B68DBB88A7EBDFA948A6A075E2E97B8D5C615207F5904824089237D85F7C749CBB048C3CB0A609006C03F2E5E772358AB8C331E337B7315BF95A8FE74FA0166912C8492424889EA46DB7BBF1EB8F9E17600F100F4666EA7C5EF5F288500A8B0ADE8D7F1B53F8BC735110DF88CDE4498DCFF00BFC6C70BA1249568295677A7BD7A6B0F91FB46DAF99F7E3CE1BDCA869BB2943CC4EC3CF95F0E048E20DC26F7624BF4635E45AF4BC2D2F5F0FBC3555674C5288E3038A440316E460413F779E1EC8CB5534FED25ABE760CFA3F37B429107CDB52D3F8BF9824837B4CFC763F9E2730D92A8B320D69635E9A75EAF04416B75630DECE01320F8A36EB16F96DB6E062C586C8944370D9AC1BD9176822B7CEF5835E387881B59663DE27E079F4838B1617B3A5407FB64EBA8FC0D18736171522A9CE75F268882878A839C5278F6B7207CE2E2201F8DA32DECD93FD8C7667B6946D3C2EE758752120EC0EFE6FE240F467115A671DA72A15E3277FEAB917E9BDE79F2EA316AC1F66C3B775E36D6BA1FF3CA1D7766EF417A796BEFC62B2CDFB4B528A4059B49B28DE3AF98B1DBAFA0B7E03B3A97004B1B540E4581F7B883BBE7E9FCC40B31ED21609FE6AA6FCF96DB93B0F889B8E58B7617B372D828A45A800B026DF6A3F283BBD5EDCB7F1880E6BDA22D6A49E3322608519F7FC7D368B62C382ECECB485120076D07261EFCA1D4990662598902DB68EFD6D5B5DF588A54F682E03016444C9E237F74DEFE9CBAE25E5E4726AE0519E801D7EBF5BC3B4607899C585E94D2BCB93B1D285E2335FAFDC25242D5378854FE16F8F94C61F4ACA248E2F901B7BFB5A9CED0E118124B3160EC451FA5DDB5F1D5CC313DDA0BB1F6951E6B2239CF3E43EEE7B3E4E572831E00FD03F88F62BE6E9182A5BA51ECDA86EB4B6DAC256FB4170714AD5D6E6639DB7EBE97E507189995C851AA1236A8F1E5B5FF00C49613046A120B16D0D3C079DEBD6315F684B93C2A23A78B7882791F593D37C6BFE8586994084316D05CBF5FA91E10B4CCAD4BA10C3A16D8B57CC5DEED0A287B45524A8A89266DC47ADA0123E406D1CE70CB13D97C3AC1696914E87C75E5ABD9A239791A89A21C7420F236D1B6D46D49053F692E0825C36123C4444C6D1D3AF2F7C62BD8AECBC9493FED8A93A0B073BEFD234FF465A2E867DF939DBDF9C58DA1FB69CFF21CE69F30A3CC5C6F2F60CD7B4A76CE050F04052A41046C07AE39B76B3B12314852E54BA804D12FE4E29F810DE7E171185FFA61418559FC3E97F5DBD79F679EDE721ED4B4E2F2B5BB4EBAFA1427FCBD4703BDEF112A52781C0526C0C883B89F2F2C76BBB3188CA718BC4A50A12D45426F0F12598302E19DC81EA4BBC664637168042CA9C7ED279173E82A5FC6C6211ED05EC5FD8EF6F34B53A86A6869B27D62FB6E062B2999534961D424A01532C8432AE30126E39CDC9C55B29ED563F2E9B2A4714D0994AF91456A20825ECEF4A569B522F3907686761DD066B22614858531B17A136F4D2D1F3FBDBE7B16F69DD8B66B5B555197D4E6FA790E38B6736A740290D4920965A0B518102FE64ED8F55FC3EEDF2E709427CF73F2D0A80A0E4588B5DAFB4769C97B41829825FEC4B0058904F3E95DCEF7D7A8A288BEB7FBB2A6CD3102A4B80B6A76491C3C0B852784C8902FF7F72C56792B1F2E5F7530120025883B0D2FE4FD0459B1F8A938896832F84D3420B16E54BDB61CA836B596BEF254BA4506823ED490663A027D4C6E27E0C462D540FF00C5B9357CB66A444A4A6BC49E2F13F57A587AC25356DB84B1C10F3261D5DC8513B1DA3972DF0A8C4059E151A8F7A795F96B0290400480CAF6C418E7892398FBFEEC3842B436D3DF38D638E34FEFF7FBF8E09EAE1A055C69A8A751CAFBC2339C800549F4B17F4838D3D7E47F2C35756E7CCC36E156C63052A6209F3DC60E23B9F38D822EEE36A8FE63193D4FC4E073B9F331B700DCFA7E23893BCDFAE14429C313516AD5AFF98510002075BF898E64F53F138DE178D88544C920F52795B9E08233E3FF0057FEEFD70411A9C50312A077DCFA6364AB85E8EF046B91D47C4632A5B8666DF58C100D0C71C69EBF238653161CF0BB9B9FB0F7D231C097FB69F9F58389279FE1F7E1BA95C2D4778DA3153894F39BFEFD7EEF3C204804026A6D12B8295C52D4793F3D5AAFB6FE5025C4AA6F11D7A47FBF21E587D2940DCD2846BE1F6E4622B152DA6B58F139A795B7F1F1854CBCA553BECB07F9CE29A09DA7838877963D1336E97E8434CD279972CB280614DDF6D77F41B44FE57212521C3961CEFE96BF90DE2CAD11D9E56EB3D6BA7B4BE9569CAB733CA965B7D2D712BB94214D97CA8DF8470951B91B475C714ED3674B9054429E8B7AD281CF8916B78C42F69B132B05879B3967FE98A21DB89C5F9333B7F88FA71D1BA1F2EEC7BB2ED2DD9BE5DDD8464D445DAA7109E15D43B5A94542D2FA8789D2DB8A504F78A5445A0638263702ACFB30398CBE2577B31248539E012D4051D99DAA68EE5DE3CB9DA7CE5599E2169E30424B30346A016D19A95B13D280ED12B920BBC3037DADFB8E5F9E3D25D8BC29461A44B218A529141B51C7A73D0EB15A929E250043F3A8FE3AF5E74E9EEB4A9A9A961686CFF97593F58322641F04F337FDEF3DA3072132C21668CC40B6C4DBD0B3F8D22C980024A9045DEDD341A1DF5ADB9F5AB3EECC737ED773ACAF43E594AA76B5DA81F5D7D081C2DB0161C27880013FCA0660824CC620BB699949565D352A58480929248A82CD6A12E6836D869D3320ED18CBA6226B717082C97672CC5DDEDEB4A47A59A6F46699EC07B39A3D21A6BB953ED530FE24EB690971C7970E14B8BBA97C2A2A0029460898031C3723CA5588C54C9BDD90952DD2752E4FA1BB18E71F13B3D9D9BCD413314A751700BA458000025B4D2BE51535766C336A779E71C2D8E2528A42A2E144C5A01B827F738EAF80CAD322585283300EE0FDF6D869AC50B01835291C641552A1BC286A5CD6ADF688B5255E699857D0E539334E543F50E16D4B00A8A1054028F1198F099EBE9BE13CC7304619052080002545C0B57EFEC98DF1BFEC8370C0B1EA79EF1F44D599B06F8A1409B990403F01CBDC7A63C0F2704EDF2D3A1A7DF5BD3CED570160964B0B33B9D6EE6F5D0D623CFEA0201957853360A173EA7A749F81C49CACBF8BFB0BAA83A52A08FB3E95AC3A9648A58A7EEFEDE2119BEAA5B6550E0000330AF97BA44ED89595969424012DC9D83F37B86FA1BEA216439249E515C66DABDE723F9974F15F8C017FC081F941C59F28CA8A93C4B450B0A8634B796AC2FAB43897AD36FF001EFF00115D66BAA9CF12BBEB9FF501E5B4CE2E584CA40E1025D68CE9D5EDE15BB7A38522B7CE756BA8E187C5C13F6803378E7B9FBA05CED68CBF264A81E2410A1A33F859AD6E45B4822ABCF357BDE287A08B9F1CEFD2FF00BBF5BDBB059225212D2DC3683AD0FB7E71B702B6FA7BD62A9CE75629453C6ECFDAE63EE9B7BF7E569C5A72FC88DC4B6DA9CEA3EA2FB50438929A07A359E807F80DE25F578ACF39D5890170B060C9F1794DA0DA3AF2B62C786C9549209960100B16AF3EBF53AD1E1D3278801CDEB4B1D5F9457F5BAA42B7546FB99F5E73E5EE3CF13D83CA8A6BC35A0B0F7616D3D236128AB88814A01CBAD7CAB110CC352A49278FDD3B41161F1B462770F8166052DCF98661AD799D6D1B270D3174483D4317EB703EBADAD0FABD42924CAC9898FC7F193D3D6EF84B12EC9B5B407C7A537E91399760560FCE926C6FD5E8DF588ED4EA049264C0E809F95EC363E5EB8CFCC5E9C3E47EDB0F11B44E8C18FF00800598354B02FBB56F6EB0C5539EB64595224DCF53B6DFB163E8BCA510DCB51CEFF78729C0A890C9A0B8E5F4F426196A33C499124474371D2F3B1BF3FC70E78D2039142D473714FBDB9D2242565E6C12E59C6A1BD2DA1DBCA10AB3D42448541E927EFE7D7E1E9889CC3126590516AFBE836A6B68792302A4129281522A40617D06E7D884ABCFD06FC5D058FADBAFFB88383098E5310A074151D37D696894465E1403A59DF4E85DAAF4BF95291827512533E2DE2F226C67A72F8EFE5896FD5CB2E4ABC1DC96DFECFF00430F539525491F2D1F6E9A31F4DFC21C58D4C9060AC587F76FF1E436F7F9E186266CB268A07AD3DD8D1A8FCA345E512D4E38452C680FA5AAC34B9B80F0A1DD48B7CB6CB5545A2E1E2212AFB7C3732418100409DF60271B60B0586C64A9826F0BB7F7355DFE82953E1568565F6764E2524109046E2F76F5DDABB3B45E1D90F6D59AF65FAE74C674CD538DE5B515496AA9A4AC94A8712199589200054771CE4440C716EDF76330D8D973BBB48527866592E4163C24B6DBFE1A2BB99F65F825CE32D20AD0C50281F7A1342351A57768FA23D3FAEE8F50E52C67678174599D1D2B9421A70143CA0CA0BA12EA0C24A566E2649B6FB78D732ECC8C1CF5492C67485AFBF510C500A89438B971CA976D4728CD26E232F5A9402801448E86B5D1B5EB09F3BA4A0D4794D56599AD15366F4952853672D7D0D4A12A0413DFB8951E7C5BDEC0488C2580993707353370AB5226CB219692A2363F2DAC7D0F8B7C376DF1386F912B5914043B352CEEDA72D6D1E457B4D7B026579A22AB56F66B1455680FBF9A652CA09EE54428B612A5101CE2B93C22D231DCBB19DB1E2C47E9B315AA48584893314494CD61F35E8963E7E11DBFE1F76B55994B28C54E60867E321C397B93F6A18F1933ED3FA9346E775392EA262A68D54EE38D82E34B4F1C122764F9441FC31D7E4665865DA7A58B310417717BB01D2ED1D725E270B8948326625445569E214DB5AF3E66CD0C2BB2D4509841D9569579C1B89F3E989595325AFE64A817A82FD5CFDABADA14490A6E1ABBF266BDF6A3F3318952809260752001F18C48A1429C25C1201FF27AFE6374A16A0FC247DA39E251124C03B18DF69823A0336C693663060A7DC6EEFD5BA78D1A1B4F42812E0823F87FA3FBA16FEF3F03F9E1AF79CBD7F886D19A386F2E7C41FC4E0EF397AFF118248B07F168CFC1FDE3E1FAE0EF397AFF00118757FC7FF708E0C5A140CCFCB0ACB983E67F96D57EBF5F778712412412185697F17B681B9BED0614EF11FF00210EA30592220F5FC3005A4D8BC11871ABAFC87E58CF1A77F43F88235B8A55AFD790FCB194CC4837EB4351FC7DE0626C1E35F1ABAFC87E58D57352A71C4035BF1BE8C5E33C2AD8C1C6AEBF21F961B19A80402475766E55FBB46785550D7BD469071ABAFC87E586E66A058BF4FF00107028D924F484EFB91C337DE4C7E42DCE7D3E1ACBF98B8AB5CF33FE6F13B9620095338F67B59B938AB8F1BF5E1A58292A83C3C88048313E5FB8C3DC3AD0A04715B516D4D9FD4DB7DE131692A9C78773EA691CD3D6770F21C68F12B8836122EA5170F0080249B9B002FEEC577B418EC361A5AC4E9E94382CE41AED7A7589AC03C994A2B7400E5CD2EFE4C1EBF48F7A3E8E6F6776345699A8EDAF545377CBCD508569C66ADAE175954A997D496DC1C6012B064A40D88240BF99FB5D9B4BC662266130AB3314E4AD601646A2B6214C4339357BC719F8979E61D1226265CE495F0AC04822E6FAD68EDBDF471DECD635D54CCBEF39C6A7F89492140C22E52090792488BFA011675D8DC377C959989F9924740E59DB9D39EBBC799F2B9B37158A9EA98E47112092599F4DF537D183523A8DDA1E624878070126E52140F3F2248DE31D8F2859C36265A00F95C7CDA50694B8DF6F4B3484CB04592CFE049A5FED58EACE66E56E6598D3E5F4E14E3550B536F250389416AF0B648124788CC8F59C75D562F0E8C119A5680A12DDC903FB7AEFE3A43C54E4A40F983FAB83B0A57AD393476BBB3FD2947D96E987B31A869B5EB7CC9B0A69E570F1B6D90AE6652921856DCE23CB1C4738C5E2339C6224CB0A5E082D42600ED34834622A38540EB51084DCC57292784B91600DA8F7E7CEB7E462ACD4DABB8D150D3CF29FA97D64BFE22A83C44F224589D85A05B962FF009065089694AD6809A07040B01D03D1EBFE0454C4AF309892B06849AFF9F16D7A308AB4E64F543AD51D38528BEE04F0A012A32A8FB224989BDA7CF699EC7AB0F8794A485A41092087A58D05583EE49E82D137879587912C82B4A484EB4F4E7AFDEE3B71A0324CA7B39C85DD4D9C3487330A9642E8D2EC071B54113C06542E41F1016EA231C4BB478B998C98B9387515842889894870E5CA471015E6DCDF58A8E72A0E4CB75036367AD2951B1F0E71EA36659C3664717226EA36B409F3B728F80C79D70B8304FED776B8DB6AB0A3176A7A4457027D9B7BE6F107CCB3B4240FE6753BC7A73E53EEC58F099792DF2D000006A907EA6F190902C22B7CE73C412A973ACCA8C7BBAD86E39FA462CB85CBC10029034FEDBBF852E06BCF9662B7CD73B6FF00E6708BDF889B6FB6E4F945FE3369CBF2F649E14072DE7B6D7E5CBA64122D1566779F24154BA45CFF005284EFE7602FCA716FC1E0520A4140AB68C4B7416FE3785E2AACE73B4A88FE612255038CDA796FEF91E96DB170C065E9FF008245051ACDFE75FB42E00141158E739B83C443A7983E237F2EA4F5E5E9B62DF82C024B3A053560341EB6A783C390C34A569FE7D8D22B8CCB34E22005A8913FD47DFD63A927DD6C5A3078364FED1A5C0AEC341B523632F8806A1DF6AF8546B6B59E21398E668F102A207A93E47FDF9CDE263139230C90015005AE1AF571A3736B885A561D45882E353A9D0F97D1A2179866215C30AB09E7FBFBA0DC937C3F972E5D59228D6E4FF4899C3616CC1DFCC56C2F7BF880F678BD556A493E283CAE679F39E63D3A838708968AFCAECD7FC79FE22730F82040743125EBC98F2634B7DA2355B5A2D04F393227ADA39F2F59F5C131080C486BD757F7FCEB12F84C210E079816F5B753E42D1CAAAD4927C4444C5FCAC664721333CF081084A41201B87B52A3EECDAE9AC4A4BC3970C97DE82BF5D343AD7AB2B95A0920A8DB7827693EF883B911E778C375000B00DAEB57DE24E4E1C16743BEC2BF47DB7E621ADFAC499B9F333063CFE07CF7B73C36529CFD044949C20D45069F9FC56D48697AB120024DEFCC47BE08F3933C8F48C359C0177AB3372B7958F9F3112D86C1214DF2D587570D4E74E8FF00442E5724EE7AECAB7C41836F8C0DF0D432052A0BB301F514F7E4F0E0827467AFED3F47D377F268D06B5226E62FFD5D3ADBEE9FC7092A72C502BC341CBED00904101E96A066F0DF95631FAFA3FBA0F3F10FFB8619AA6AC9352DF5EBEF946E306B0EC0B1F3FA1F6F7731C8CC9C410A6CA890A489E29DCC6F262660C1F29BE1D499D3112661130A69A7FF00AB4E5BB7285E4C8293B2B6D4EAD7D6C29E178795E7EF32FD352125448E2124CA4C05483CAF04411E5388BC2AC4E4E204E50997FDC1C6BBB8BEBB6B18C6E0FBC94A253522A6DB8BEBAED6D35F7B3D853B48675CF616F69872A0AEBF43A9A04AD654F2BEBF54560152CF11802D72074DA3C87F16B048CBB3999899008566055DE84BB204A0424DDAA7616F5E19DB0CB9284CC1DD8643906D777D8EB4D43DC388EE73F53DD17521C238D2D917327853248827DF706200E58E7FD9A946609CA5FCC0115218D497FBB694B6B1C52661889A43317A0F1AE8CCCF7F5668462B5AA94BE92E250EBC9E14154149004282C2BC2AB75F4B5862CAA966594841E14A4BB815A9A310C7AB1357A6D3B976327E048EE96657135412051BD5998E9568E977B41FB33E8FED432FACA9551B0CEA1085A9AAC6DAEEC2DC8241212128E82E637DE3172CAB1B3414A16B570822BC44B5294EAD6148EA9D9BCEF1699A850C42810DC4E7881D0821EA2D7E54263C32ED47B1DD57D93E78E51E7D46F399754BAE8A2A94A49404B64CCF76088129E7BD84CE3A9E513E624242A605022F4A027ABF9B78D1FBC6579948C6C994A03BB9881F3077EF1D83F2D49FADE295A97EAC3C94A877F9783B240494FAC4AAC79CFE38B74B99C49705F7B78728B8E1A6CB5212A291C400047A3697BFB10B6A54A0D30524160825A47347F749DCC99DC635984D1CD4DC56BF6D3AFD90C7250B4860C79ED616F523D211779E5F3FD309C45F723979983BCF2F9FE9820EE472F330779E5F3FD3041DC8E5E660EF0F43F1FD3015F06F5E434EBD616932921DC0F5FADF783BCF2F9FE98C77C79F9085F813B7A9FCC6D6D60CCC8F98FF007C67BDE6DE03EC0C1C09DBD4FE636F1A7AFC8FE583BDFF00BBD3F883813B7A9FCC705606D7F97E18D173096657A7F1070276F5309DC5EF3D2E768F86FF00BDF6C20B5AC10CA6E97F1FB78C1C09DBD4FE6908DC73602FD3F7CBD39DCE1098B5503B3BBB787BFA343E4A10003C21EF563EF96B1A7BCF4DFAFCBD7F71867DE2FF00E461544B4D5C3F5F18C915612B4B0A00A5E07895BF08489B1DC7388F2EA313D96AD3DC4E2B2EC9BF817EBAF421A821C7767BA584001F9B6FCE8E5BCABCD653D638D52D496480C01146540492490F44DC93CA7D4621F058D299D89055F213F292435C92D7F5D7AC43BCA973E519A38A73FF00BA384B00FF002B814A0A3B51E3B8DEC2FECA99AFB41F699475F9952BAC68FC96A13575EFB895772BEEC77E80788A64171B22C48B99118E09F16331C415BCA9EA425D99277236BF4FF10876B73C9383CB664B90532D66529D8D5DAE37F5BB347D2566ACE459464747439486D8A2D3B4EDD232C3490DB4A84A5824348E149BA249E1266E2F3344ECDCB993CB4E05666A5C2D42CC28F7771D4D58E823C2FDA2CCF158DCCA6056215313DE2800E5AA4EE49F7B33F5DF54E6EB8AC696A5292903EA4493BA812E45CEC771CA04473EABD97C0F77317F2808243B01536FAD35DE25B0525326425412028A4540BBDDD869E1CEAF1D4BD4AA79CAD577854E3AEAF8384289B1302C081CC63A2CB97C3502BEA1ECDAD7946B3A62D36253F97DF5BDAD6BC4FF0046E87C974851D46AECDD095D654252BA143838B8080428F0F885ED123716DC6196267E2B153C60A54C5140FF00ACC4D033A40635714A7A43513660209516FEDBD77E5E3466F3AFB5BEBDABAAAB5B8AAA4F0BD2869A04029481C205B6111B798E47172C97279328213DD5989E20EFABD5CDFC9CC399438CBABE635777018FF9B7E628DA8CD5FA6A9A879F052144428F8F88AB6481B9E298117BCDB9DA31F3118390C964324D2CE4793EDE35AB449A0A254B53258B3123EA29A79DB578EC5F62FA169DA655DA1EA767B9A0482ACAA89E07894E5D1C7C2405D9CE1500A4911B5B1C6B3CCD2762710BC2C89C5D4A214A497084ED7209507E8F6D62B3996216569E0511C2EE428B2AA34D18D2C1C72BA5ED4B582AB2A4B752F0352DF185F01E068B51FC901B443638500030395E0EF25906070E129946582054F11E2249A92497275678DF2C96AC4CC1DEFCCEC2D7DA9A7BAB47A7398E70F193736EBBF9C733EA71C070F80424B82E36236A353EACF488A880E6F9CB8024827C455CEC4FEB6FC37B59705824A883D2B60343D6C7AF8411586759D3A4AE144EF107D79DBAFCB16591854A00702D717DB4E9FE5E8456B9A674F447113B9224FDFF00B988E718B3E57864872A0030F1F3DF716A1DA08ABF3CCED7E205666F249BC91B7975361E87168C2E141F9A805399B8F5FC5E1C0B0D22B4AFCDDC528CA8AB7BFCBA1E7BC7C3171CBF0A1D23CDC374EA36FB5E1C457B9CE6AE78BC44133CF9413E9713B47A8BE2E183C325213C4028D6835DFC052DA6F0E694F567AF2AFD6D5B30AC0AAF3270932A3B9B5F793E5B5C6DCBAEE6691204A161A786DF6AECDCE24B0B28299D2C28EE5F99DEFF00E221D99662ABC1379FDFEF97BB0BA789C7FC6AF67D1BE8DB8D1844E61F0A82E05D2CE5ACFB575B797488ABB5CB502788DBD4F9003CAFD473F52E258357B166F5FBBFA44E61B0813C2281CD9BD7F00F8F363AAAC549B9136206DF21E7D37E4230E25EBE1F789B918349BD5FDEFCBEBBD63B5B58A004DF7D89E73F8FBAFB6E71ACE7E17D1EBE9F8898C3E112970430A5BC1B9F2209D22355758A13722D37BF5F311BDFD6D866B24853F2AEFF008689195844BBD850F9FE34DACED76572B172649E7FED37EB1CAD6EB86EB511E3AD0337F1D22570F84492C19C5E9BF93D18E8DF46B7AAD706E4F99BFEEE778DE2791C332A7B519EAFEED5F331232B09562001FDC47E2A3D37F16A76B166209833FEFEF9E7C8FA0084F3ADDE9D29E147B5BAD624B0F87482DD34D6A7ECC2D4840BAC50E7E637FBF7FDDB0CD4585013BEDFC7AFD8B93246C0F8FE77FF00309CD5B9D499EBFBBE1B295C2D4778D3B87A801B4A0E9BC71F5959DC7C0C7E1FBDEF11868A5851F95C0AEA7A7DA36EE696F17FE5A394E6A9A675A6D6990E104C9FED20F4EBEFEB6B1CA56384D6A4100877F3B4389785E22549B25B89CEE5A9E76630B9FCF1B72AEAAA026F4C1A4A4F4E301260F381F08C3196BEED6B06EA2C696B8F56FE443D9B81FF00648201E204A74A01E8F53FC523D2BFA35BB42A9A3ED79DD089528D26B3656E38893C3396D2B8F24F0DFF00A86F1EFDB1E68F8D5FED6265B31EF2CCDA33B120DF61B3B35B91F6DB2CE3C0CB9894022571F78453767A024F87D80F65AA3345BC8A9784FF0025F2D4F203BC2D816E97001F2BE39B766E58972C922843B7A9DFABBD19E9531E75C5E1409CB61AB721EC6C776A421CD1EA7A65B2CD538A692B0141692641226D11249B7A62D2A962600B48D6A0D486A539D397DE22F184482962ED6E56A6B7BD296686CCCF35A814BF5653519790422B090547CF8638F7B46D3D4E24F0321226898872B49A2743B3E9D4B1D0522C790E3A624A4034357B7997B5AA0F8C50FDA2F679A635E64EF506A0A269E67BB7050D52920AC29625644026CA20448C5D7018B9D2672552C711769D29C86164D5E828FB73D23B6F67F305B25894B70B58B9E7F4FB3B478BDDB876059AF66B9B55D6E5090F644E38B500784008DC40512AE768131E713D0B0B39D20A4B12016726BB5437D368EA981C72D68055FB8332874D68E695AFDC47565F0E25454567854480DFF6116313D4CED874B2EC742EDE7FE2260CC33D22E08A13BFAF43FCC2793D4FC4E348D7BBE7E9FCC127A9F89C10777CFD3F9824F53F13820EEF9FA7F31CF12873FC7EFC11B253C2F577F7BC1C6AEBF21F9608DA3636A55EFD3A79E0823671ABAFC87E58208E0ACC1936E76FC8608212AD66E67D07EFCBF7CB092EE3A7BF6FFC9089D5ED373CC7B87945B084CD3C7ED0F93FB4468EF0F41FA7EF9FCB0CE1697AF87DE32EF9A292D287F39653DD1BEC3EDFA0E107F330061EC99A65C998016241A72A8FE3A9E6625B0D2C2A5AA81D85478B136D5A96FB5BBD8FF65B9C76D1AFF21D01A7C91F5EAA6C344708E26D252E544F14720A1731EF99A066B982B0489F3662F825A41516E4F76E61ACCE763152CDF1A8CB7BC9C5026CD5823859B85835D8D4695B8BD23EA3BB30ECA329F679D0995E89D354CD53E6E9A563F8F54A10038A52909704AA24C82B1E156C6D36C70ECDB1CBED04F5E317F3617888C356DC2785742C4B91AF3F0F35F6DFB5335026C9E3539E20456C5DBC0023C2ECC2346AFCD29DC5B6DE5CB3F554A54AABB93C4B899337FB5C5E5E800C5A3B35844210AF943900696736AD1ABE768E13865FEB71A56AD5679EFAFAEF4B168EBBEAFCECB74E16A324F1269CED24920CEFCF99EB8EAB91E1021D40073566F3FB8BDE3A409625E1D054588143BBB303D2E5AE2C6231A474F36E29FCFB3B4F1B490A71B045844C6DE839183169C486366AD2A1270DFF0055640E96777BB8B546B1173C025459C01FB7C3466A8FB08AC35EF69CA0FD665A904D123C14C018080278AC049B89369BF3C59727CA6505214AACD5B152CBD48D2BCE97AB54E911FF0032A610372E0B7E69C9C9D7668EB56679C3150B5666FD4AF89B51286A1504A8909E703CCC6F36C741C3E01329085B86E9771B796AF1278595354A1292975173C2E03B03F40C6CE79C5F9D88F6655FAFAA9DD5FA9804E89CA54D3956490429464538213FCC82F2520900FB86397FC46CF93972A4E0A59271789E21264DB88062B3C4681857573477A95F1330A2539D010B5731403F9E51716BCD5AE53D4AE9A8DB0CE5D4AD7759751A2020B696F84ACC40160177124C9DE71CEB08927854A24CC51F994CC5CD5BC2D7D3668A8E2141732D47A5F91B73B56DE71D1BD55AADEA9CC2B180F29D430A90E99F171924A6F061311E62F18BE64E966A1040AF31E5E0E6D5A6F7EECF6010532A610FC676B358D29F4B47CB3E3F3111F6BE0C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C1041820830411FFD9, '1', '2021-10-06 01:15:47', '1', '2021-10-06 01:15:47', b'0', 0); -INSERT INTO `inf_file` VALUES ('add5ec1891a7d97d2cc1d60847e16294.jpg', NULL, 0xFFD8FFE000104A46494600010101006400640000FFDB00840006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D302D283025282928010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC200110800EC00EC03012200021101031101FFC4001C0001000105010100000000000000000000000701020405060308FFDA0008010100000000FA14000707A3E3F659B5F2B3CB1B171B57BAFA2C000BE1ED8731AFC752DF3F2F2EF249DF79D0000A465CD59E5ACA5BE7B09BB71441BBB943DC0017447C95DB0D662E4FD0192237F3E17E8600039B8AF556E579647D0B60807A3DA49368003D7E7AC1A5B678CA3255081A4AEBC0007AFCF5834C6E8BA3DDF756902CE39200034908796C661E82C04073E003D755A4B2FC9F48A34CFA172404152C6F415C4E175B9BB879F8EAB41CEF792A807CF1B1903B7BADA5DC0737D47ADCB3CFCBCE3FD2CCBDB807CE35CAF5E8B3F0757D0FBF1BE7DD655B65965BF384B9397B80F9C6A2EDAF577F05A0F3D9499958BACF4E7F41D0654E168118657B59A8E2E43DD71B31FC73ED26EE33FB0E939E8FB135FEFBA9528007159783CAD981B8C5DDC9596A5231D6E17173476200BE26D8351AFCEB33FBED077DABE2FCFB6DB59CE463365A018B156E4A3CB7DDBC65CDE3EDF71259C945B3D7900725CFFB554C0EA3B769E32BEC92F794A4711EEE3BDEBAC0380C657CB7FD6E50F3D4E266EE0C2E2F9DE73CA6FD90237B7CB7FDB5F554B6911C8BB8A948CB039CE5E79E94230B3B6E98A82945453C225BB87D44E3DA158BB77DF56A00A1452DE6A2DB397D6FD5C562696B215002DAE1E4D29CCF8471C9DBF4E9EB03CF952A028A539DE8296E1C7DD3C2DABFA80BA3690760A5C28514A626A37F4A523DC2D7E9A772B1CC9B7733B2DA2828A2DB628EAFABA523DD1D29302BC6767EE88E46DB1414A29486A1A9CF8E99E2BD91303CF98ECE8897A9EC5428A294A70B04E5E279751D613038FECBD5485BA5911428A514530780D5E9B7B62930B93ED2D6A222EA64A28A514514ADB444FE56D7FFC4001B01000105010100000000000000000000000001020304050607FFDA0008010210000000F3600075E70AD558EA46005B9DCE33E1B7367000694AC32CD3CC00034E58A1A69A59A125A512766681ACD81C9A194D4F44E2B280D94750E8BD1383E7AE6F60E4D500BB0F4BB3CCEBAC540E7500BD5CB7D135B33E0E769342FA6DDE51AAADE56CD084D7DE780014F9CBF8EFEA2E800346D4CDC87F57654104628C38ED9DE6B841064EB5978DEAAEB155104115A7FFC4001A010002030101000000000000000000000000040102030506FFDA0008010310000000EB00043FBC939A35CE4003A76164A7AFC9800061CB22B8CAC0006EDA78C4B0B845F5B8C23981D3533A3CA742D7F0DDCD006A346783E07D9FA05BCFF7A92016EAF9EE0FABE6CE8DD4901AE84ADC1E8F5BCDE0CEC483FA72520BD62DE8D54E46B8F500019F429A318AC001259BEAF3215C8009BC1B5F4C55D2B5924B9560D55CB5AD2490B4EB3FFFC400451000010302020604090A050403010000000102030400110512061321314151203261711014222330425281D11524333440537291A1B116436292C16382E1F0357383A2FFDA0008010100013F01F4FC6B4931051908C2222ACB706690B1EAA397BE9E719811335B2B68D800AF9C4D735CB6D6A56E48036229BC3DF575B223BCDE861A84ED71E3F95AB53091D672FF00EEA270F1EA66FCE8C8863AB187F68A335A1D58C8FD2953F932DD2A628FF2DAFEDA3249FE5B5FD94F2D9BF94D3415FD236D4518C6ABE66D627A9E194AADF6047585622C3B866352E54C49533297E43C3684F61E54E105ACC946B788038D09B2E495063220A77802EAFD696EBF721C79DBF2BDABBC93DFD0346AF750424152D5B9291727DD587E8ACA9090B9EE888DFDDA76AFE02B0FC270FC3BEAB1939FEF17E52BF3AD62A9195C405B4B4B883B8A4DFEC0B4A1D694D3C80B6D42C526B12C39583FCE226672028F96DEF2DF68ECAC4594AB24A64EC3B7327876D22521D4E5988CDFEA246DA7A294A758C9D635CC784D1AC330F918A492D46B04A7E91D3B91F13D9585619170A6B2C74E678F59E575954493BFC3F25BB11CD6E1129C8CBF66FE49A8BA55221B89631D8BB0EC0F37C6A2BEC4C643B0DD4BAD9E47D38B1052B014856C20D488BF26622B84ADB11F1999278734D3CD969D520F034CBCB65576D56A25895BECCBDCFD534F34B65595C16FF346A0C473109CDC465594A815297ECA79D448CCC18A88D15395B4FEA799E88A75B43AD943A90B41DE0D3C1FD1F9499905CB344D8A4EEEEA0A0E34DB805B3A42BD3E92C432F075A9B1E7E3F9D47BAA7283A961F4FF00311E14485253915671BF655FE3952D0082B64E64F11C53DF583CD187630C495FD09F34E7603C6962C766E3D1462130904EA7F0E534EBB20A9A8F159D74B705F28DC91CCD46D185BEE25EC6A46B2DB7528DD4A3BAC2C06C03D3B7B4E53B8EC34B4EA98531F72FAD1E1357208209046E229C3981CC37EF238FBAB43315D73670D92BBBAD8BB2A3EB2797BBA3872017F32BAA819AB4559221393DC1E7652AE3B10370FB0B5D7152961C7A42C6E72438A1DD7B785C7128EB1DBC071350B02C5268CC969319BF69EDE7DD4DE8728FD63123DCDA2B0DD178906735284A7DC5B66E01B513737E824EAF0A98E0DE465FFBF9D436F5387C4680B656923F4FB0E3738C083E6B6CA7CEAD94F6F3F752C25166D06E940CA0F3EDF061B02462920B516C9423E91E56E4F6769AC2F0785860BB2DEB1FE2F39B5468A89DFD37ADF213DF8BFC8A1B59688DD907A20835227C18BF5898CA7B335E97A478524D92EBAE7E06C9AFE228C7A90A72FF00F9D0C7D9E302701FFAFF00E6938EE1C4F9C53CCF6BAD102A563586C58FAE3290E83D54B67328FBAA6CE7A64A54A90323A5391B6FEE91F13E04A1C79C6D9605DD7559103B6A2456A0446E2C74D9081B7B4F3F43193AF852637150B8AD1E942760CC281BB8D8D5AC768E9EFA992A3416F3CC7D0D0E00EF34EE9148977460F12C3EF9EDD4A87325FF00E47107560FA8DEC151F0B84C7518413CD5B68009EA803BA8D1A34F448EEAB32DA467F680B1FCEA4E1EA4254A64A9CE394EFF00CE92A0ADDDC472AD098E97A5CA9AB17D479A6FBCEF3E899714D38168DE2A338E33255270D7FC5DF59BADA5F51CA87A48CA9496B1465511FF006BD4FCE9BCAEA02D95A5C41E2937ACA7978522FDD5896901538A8B82A75AE8EB3C7AA9A630B0A735F3DC5497CEF2ADD49B0161B055EAF57A2689A346A7E30F78C29A8694D926C5445EF4EC85BEE053A84B723DB1D55F61F8D684048C04A13F4A1D59713C526FC7DDE910FAC2321F2DBF655B4530A61B5E646BE3AB9B2E5A9B9F3B66A31726DC1D40AF95B1C693B04391EEB1A5693632D9F3986B67B81A7B1BC5719CD0C3488ADFF3549BEEE550E3B71590DB42C07EB4FBEDC76CB8F2825239D3FA43B7E6D1CA87359B531A4842AD263651CD06A3496A4B41C616149357ABD5E8D71AC230886BD1790EBA91AE5A5C257C516BD4194BF18650B480D1010A17BDCF3A8921FC2DC131ABAB56723E8FBC4703DF51A435362B72A32B332E0B8F4C1453D524771A87AE7DD09D6B9946D3B69B425B4E540B0A52821254A3648173498F37185AA42595AA3A4F93C8549929662BEEB2DA17A95645051B1BD61AFB38A5D011AB780BE5E75143D86C82E37D5F593ED0A8B25B94C875955D06AF4FBEDB29CCF3894279A8D7CA71782D44730DAAD45F4C98EE884F20B994E5B1DC6B0275E6D9721C8D6A2DD64AB7281A7F4714257993E689BDEFBAA4C96A2CA4B6F1F36F2721ECEDAD1F9FF22622B8EF9F993EADBFD0AE7DD446E236A4EE3E813A1E7F9B89AFFDA9A4E8743DBAD99257EFB57F0861BF7D27FBA95A1F879EA48909F7D3FA21251730A685F24AC5AA6C79B86AAD3D8213EDA77560907E6F9DCD855B4FC29C8A35B649B0B5EB1D516F0C91CFABFAD600DB4CE09112DDB206C7FCD692869CD209EB67E8CBA77568FB4E7CA91CB69E3B7BAB1646469C58DA40D82B0D8A21450D5EEAEB28F6D3697E63C598405D3F48EABAADFC4F6541C1A24539D49D7C8E2EBBB4FBB97827E0F0A68BADA0DBBC1D6FC950AC423488032CE0A7A2DFC99281B53F8870EFAF9D048CA10F208D8A0ACA4D3985096A0E4C514AF8250760158AC44B91EE91D5163DD5A218C2B38C3272AE7F92BE7D94458FA4D2D7C96A261C9EB495E65F6213B6A23EDA59B28D88A724A8BAA523603B2B1B19B0C7EE6DB2FF00AD6172DF430194B8AD572A95804790F1790ACAA3BC54382C4004A7CA739D7D6E50B6D69A55D479AB9504392A408B1CD96A175AFEED3CFBF95458EDC5610CB09CADA770E8101408201076106BE4A5AF5AF610E06D21C524B0EED4120F03C29D5CA8DF5D82FB607AEDF9C4FE95F29C4E2EE5FC4922B15318A82E3C8403BD3955B8D68962C716C36CF2AF299D8AED1CFD1A05D429D77C771D9926F76DAF30DFBB7F87158AA99096CA1412A36DF50E0C88EC84A9E43847022DFAD66929D81827B42C56A243E7CFA836DF241BA8FBE965319901A6EFEAA109F589DC2B0F8660425EE724AAEB591EB2B977560788B8E4F991E5150505272E6EEF04B9CC450758BF2BD91BE9CD296028846AFF00326938FC89CBD461CC05BCA1D6DB64F693585C4F1282DB19B3A86D52B9A8ED27C0A48575803DE2B178EC2602C865B06E3720560EB30B4B5ACBB1124588A56C51F4531EF168129FE2DB648EFAC211920357DEBF2CFBFA4EB8865B52DD504A06F26B0684B71D4CD94828007996D5BC7F51EDF0694C53E3D16446506DE5052566DB176B581AF18C4BAB9503B75A6D5E28EBC6F31DCC9FBB46C1EFA4B6848B252903BAB01467C656B4F55A672ABBC9D9FB7431F72CDB4D73398D48F271BC29437EB2DFA8A77AE7D1697B9ABD1E75237BAA08A69391B4279003A3E3216EEA6321521EF61BDB6EF3C2B0DC1D7AE4C9C4B22DC4ED6D94ED4B7DBDA7C38AC3F1D8A50956475273215C8FC29D73C5DCD5CB4961CE4BDC7B8F1AD6200B95A2DCEF4D2D7255921365F5F31D51DE6B08802045C8559DD51CCE2FDA3D0C614A54F702BD5D83BAB16D6F8E40547FA54AC94F7D31A4B8CC43F3D8A1F6C6F396C7F31585E9161D889080B2C3E7D473E34A491DDE834CCDD186B1EDBD7E83257254530DB2F91BC8D891DEAA6B020ED8CF794E7FA4DF928F89A8EC351DB0DB0DA1B40F5522DD15A12E272B894A93C942E2BE4A819F3F8947CDCF2548C4998A754CB79B2F04EC02B0F9C8999C25252A45B37BFA12633525367537E4788A9FA3C1E19DA78EB1BBA9A047ADC298703CD058D97DE391E22B11C2DB76EB69365F2158563B3B082942FE710C6F4AB78EEAC33108B8AC7D7435DFDA41DE9E9E949CD8E618DFB282AB781D73265012A5AD46C94245CA8F6544C194F0CF89916E11D0760FC478FED484A5080942425237002C07A03B8D390714724A9866304241B78C38AF27BC0E3585406F0F881A412B513996E1DEB573E963917C46619681F357CD9DFE85FB5DC68D6251B617503F10A61C7F0F9224C0564706F1C0D6038DC7C659B27CDCA48F2DB3FB8ECE96909CDA551C704B17FDE9E73568D892B59395284EF51E558461BE2BE7E45973163CA57040F653FF0076FD89E6D0F34B6DD48536B16524F115219561B24457AFA93B1874FAC3D93DB46A5B3A978A7D5DE2BCE30FA64C45143E837045617A510254342E63896246E5A4F3ECE871AC636E972FFA628FDEB47E3090F2A7AF6A5376D81FBABFC7D931D85F2843530DB812F6F483B95DE3FCD403250B5C793B54DEC39B62D3D879F7D62A9F36857236F03B192B5E6B91D01BEB1F51563D2D2D6C756866324F6AAFF1A8ECA23B0DB2D0B21B4848FB03EFA59C80DCAD672A1237A8F431E694A845F66FAE8FE705B88E229C8AC6330997C9C8FDBC9751BD3F11D958C3722235AB9A80368CAEA7A8BF81ECE937D7AC3E5993A62DBE47997242F2F7E5B0FB0E1C7C664489AADC545A67B1037FE67A12D84C98EB6944A42B883623B6B47642E015E1F33638855BE07B8D62AB4BF065B4B48394849078D4A82B601531771AF638A7BB9D254142E9DA3A093635A4C9660CEC15D650869297944D85870BD4394DCC6CB8C056AAF64AC8B05768ECF4F2DCD54579C1BD0852BF4AC0148560B0CB7BB563F3E3D1D286836F44969EB156A17DA0EEFD69C92A5EB2FEBA520F78F03F874779C2B505051DF9556E86C00A9442509DA49E1410349E787568B6131890DF02F2B9F750000000B01E0C6F11F1169B4A7E95D5048ECEDAC35F5488895B9D6DA0FA4202810ADA0EC35A3B3061932561524D834B3AB27D9E0698D21C35F9DE2AD48BBB7CA0DBC951E40F434CDDB4161A1D653A93D2DE6B1B5AF11949C1A2A8A507CA94E0E09F6477D30CB71D9432CA421B40CA948E1E1D28CCAC563A6FB3589FDAF58565F106B29BECDBDFE974FE225296662363AA56AC914127665D878562DA4AE468AD371D00CB50DAB56D48EDA81A5188C792954B73C618BF969290081D94FE2D15A4660E67BEEB7C6B1A7D53A6C7521C4E6CF982378B749D7931A3BD217D56D2555A2ED2BC4972DEFA696B2E13D9C3A1A48ABCC2AF61D47C2B00776BAD1FC43D2E99435CBC1EED0BAD956B2DD9C6A1B49912DA6F7A6F750ECA95152C4D534D9590948B85F0A71BF20D3816E93AE56729397B36568FA72B4FEC1B17BFDDD2D2E51F929A8E8DF25E4B74CB619690DA3AA80123C24D85CEE158A2F5ADBCBE6ACDFF00EAB0755B104F6823D32224742CAD11D94ACF108158E600FC99CB950D6DDDCB67439B368E37A8BA332B5A15296C8037041BFBEBF86B1242F54DA1A5206E74AF7FBABC45386B288F9B3BBD65ABB4F4B1FDB3B0349DC645FA18B2CA2039978ECAC4C5E0BBB48D97D9583FD7D9FF00BC3EC4EAD4E3AA5ACDD4A37E87FFC40029100100010303030402030101000000000001110021314151611071812091A1B130C1D1E1F0F140FFDA0008010100013F10FCE0B032D36BD74B69C8F6137A56A00C92E87777A82C152709D05827769D2D7B9F63F9A46C9B00FBB58E2CDE53EC547DD0BE1FDB41C2099E4F34E5A46241F4524D856723E655FC52A491A36144F10CD40C4961A5C0BFF8103389AB0DE8E169ED3DA981205B99E90B6F348CE90978FE14B61C15F4914ABF205FBE8D3D0A94B3D0E3F81769770BD97397E02682183E43CB1E2294727B5459448C1F25223088FE782179644A756382AA57C9FE734AE1D0F0A701E6841A16200E50FD7B5470BDCBE9DFD05429E19C96DC9A7BA2ACC52D45BBE8705A90953D65F35AD3FEB99A590583939461F10F15A997264EE64F3F9E17411A4473255DDB9BE3538D3C6F578EB43B9A352612C991EE56128D1979DAA72568E4EC7A0FF3C04C5986AE87347DCF7BCBAC9AAEAFA548290C636AC7B65C8D3BACB3232B35930F151AC466D20FEFF3CC91C50966E4F24FB563C096344FFBF1D1A6C29CB58E56553F01BAFC6DB92D589215DF9F161A0910DE1309E91A4CDA29F33334A674442CB680DA8854C0743C2EDBC7BD0282100D0FCE0719341D4A99198FBCDA64FBA69E8D4598425190EC4041DDA3C5B82951A60E51DDAA3E3B52228E4F427CED4F18FF0071508A74B9647DCD673FF804D4A38B5059803F0D34D47E461BF60AD946AA06E1BD452466E708EEBFAAB2938A163582A6777A1B4417B4508404404130FF00C248277E82EF8177C57B207167C957A5BF1A24CFA0F83DE8309CD60E1D0E0A6EEF1EB825B909A199214F63F0E714B2520DDA2A51BE056E096A589D2F5DAD52A33D0919F769379F44C1EF4895CE0F71A1286E36727605FDE2A69EC7647BB3F36C7484A6721AF6095ED45888919D64EAADFF0009631BDD8FE42B946162DDFC47AC15012D0471C8F60CBE29652EC840344313C2BDAA752C85BC7FE2A0133A73F9A3E01C400FAA4EEFBD2A6A65A33146488BB82F4E5E9BB25DB53DE895948C8215B268D0F0109B429EF441E5A5555CBF85500DEC3C539B9C696FD37699342E895CEC3DCE6A18E24207DA93D5489913A5DE017574A0FEA8371DB47BE3BD33BB64287CE7EB8A02103004051428F502ABA8AEEEBD8331B14A11200C06CEFB7BA928269B796034B0FC8B944B27FF000F15DE8A43C9AD4025299D5E162529513F4BBBD642AC6592CDB6B71A6A54C1026E2FD19AD4FE9D56EF35A945965D8DDA621FED4050052E66C78735ACD18C8EC9A3D0D1A2A1B3BD4F34B5BCA10E9114E98389E470D4FF00E47B1F402D3C157ADC184DC4D11B27E1289EBDE9A95790A51C2F23B1B79A020917BAE5776A73848E819A57822058E3777A12C6DA4081E68776F0320E1A9FA41C6193BECD61BD6E422644D1A69C1E605290A6D53DD14EC582B905A4C9521224524A4A6F522922B4B3B54EE99E4108D4C94B898ECD23C8CFF544090121713F036F227061F745B95C4087DD76EDA1FC5679B4929F45446DA8786A51E4BC5E51984B7EF8A8C0B0846F3A781F3489EBB4DE198A24320B3903483C8D4C2A4A7CCD00A4B060A597DE69CE00BDD97A839230195B07BA5199B32B5613E2D1531C9029E2FD2F31449AC5B8EF06C780A2C416363151862F7BB7933D9A8BE618658C8659D948A121381A28DBD9A3492C7BB254BBC94292C0466187B944DCA59CBFE7DA9A24FC6498A56248B9542F760F7A04762C3ACBA525502026850E3C127540D1A046D2B454B42CA124F6A72E4227A1C5044809A72C1ECDDF053088498961EF606AF050512C64795755CAEAFA0CB140488E89519BAED8014AE5DB0516E50404E66EA9146859863DCA9B889A276AD83EA92922BEBA4BDA1FEFF1C1A9B1F9B6190EEFDF54A42870B38AB1438400D8FE454E3B10FF009A619765E0DAC03C5EA43892D4AA039573DDAB53A1BA0B0E1603F9ACD1C4C659243819B76A8767DAA22904D9477D03BD04082D2C5F21158C6E001E16580F35255E63C4C7DC3429853B50503EC0FDD36AD1A0667B50146DEACA90E39068C0E7F143BF432DF3152AC253754FA8CA2CAA029E88A344D93D1160C837BBD0AE5E121981C4B0E4A5489372FB2682C64C80ABCB2D1328C00A7B21306CD1EC9A8EA60376EC163E569366ABDE4FE684245BF12BC8C9E32CFEAA0500B670450FA1405C987F403BD4CF6F28F7AFBF834EB02C03C9074791669747BC1CD8C5A934A7A8C5065C622F3E1838A8357E2C4BB1B183D02C2003EC99F32D12B97A62200EB6D2B548D8B7163DCADBD6912F183F15756FB8FC196AC3F11FCD4CAF49A52B50B97C96F04B436BFA8F698F913B560E6C31FDFA1A6AD7922786818BB16A38A686076D63E8AC2D08B30CA09EC4F9A9A7A427A30DBB0D1B85CC0C6C5DA684C5487C95939192811733667B73C52E6B2309E593B62AF84360DB27EF1587D473B2270C3367E28A13D80DA61FBC1AD1449DD2ED0DDF047750AEB8181B018EB1D5E854861441DA94CA50A46CAEAB513914657E8D0F531347030F63D80F3DE8503721835E7F9A70B66248EA27EA99413CACFD9F4A4461B3E832536A2B57F4A8242424AF03BFC6684A9180FE006EE5758F5C7E078E92244C952415959E636E392F4444491B2351565ECD31F559963FDE6823CB5310D61A3E830A3321D4BA4FF4AB81AD22063BEA2381DFF2BE99A5A88064DF8934DB21BEF460EA448D0346C1868D8B794F09FD534A825C81AFA04939A2ED9229CC98E0978A80023E023FBE87E6C7179CC09B6C05D5B06685426CEA4D34B57E252E63F717EE14980B7EB539375AF53A83177B1BF23C539F4991382F4C8109B710E07708F7A3F24F468BB065A6BC089D4C23915EC14B4BD09FCC0E497026CC51B17AB362717045F4A0BA5FB81446803032E45CB4719A26D2613D17789DCA38AC640334FB538887699CCB7744DA7D735353D66A7A26084F09FD531AADD9CC899795A9E93D0F68921BA65DBED404EAF3B86FF153577EECA2BBC1AFA08B60AD002EAB57153A1D4B7060B7EDB1320400401B1D00ACA5ED58A4175E8081873E89A9A9A9E934B53445424371CD397D2CD97B1113FF006A2D52499E215FBD3ACD030B14386DFBA72F7A9F4020196808A198B6F7247C73446CF80054F4BB44F801C3EEA232129773254FA96A6A6A6A6A66A5FC86214473E2D5282BA08B43367DEA76ABB504090CAB36C77A304BC800B021331AD16000384BE2EB1506C402D1D5E0BDF55A5BFA6226592C4C18FD79A8F63DE31876CBE881F77D885F74D25600BE1FD749A9A5A9E9353D27AAA8B716502437B53C09D614035DAA5D36095370388A8ACDD20E56C548A3D3591858C050002B042E9063B7AAEFA600C4998F8286E0083608A9A9A1658095E299DC9DDD894C4D1AF69FD7A67A4D4F49F464C0062F98A8FF00F9260110139B5A9AB865D03BAD74D0A5F6D3000272E5344461216360FF006DD1A9EB6AA660E40FE6B4A73D1254306F0B0D43C7824E1B25081958925CB7F57AADFA36E8DBD0E29E8B03DAA75809A7AFFFC40032110002010204030506070100000000000001020300110412213105104113202232510630618191B11433425271A1C1F0FFDA0008010201013F00EFA005803589B860B6D0578F61615918EED5D98EA4D1897D2961075B576D147A5C9FE2BF0F14BF966C7D0D4913466CC3BF0CFA76726DF6AC96391BA55CAEF57BED4C5635CEF52CEF2EFB7A72EC581006F5886CB1647376F711B67456EA34E445B514F1F6C997A8DB996CAAEE3A69EE625C91853B9D68024D853CF147A6E6BF1A4795451249B9E4CA5A3751BEFDC8E1793CA2861E34FCC6B9F8566897CA9F5AED97F60FA50923BDCA0A570FE2AC4C9D9A651B9FB7776371BD3AA3EAEBAFA8A38788ECD6FE452E16306E5AE29E62DE14D052F02E20D1F682136FEFE9BD302A72B6879E178370F970CA81487B0F17C48F4DADFE5710C2BA390775D0FCBBA401BB0AF07EE1F5A319B5C548731D36AF66E34476C532E62B602FEA7AFF005A50C5BE6BB6D5ED7080CC9227988D7E3E9586C0BCE331D05370A005D5B5AC171AEC90418AF091B1E84563F1D1CF8C695366FF0005AB130766732EC7BD86F046D27CAAE6B807168B02AE92FEAB7CAD53F1BC3019CBDCFC2833F13C419A4F28FF00AD4B6B694580DEA444986561714FC2A33E52453E0F247949B8A6194907BAFE18517E7CF0D8379CFA0F5A862585422D30B1AD0520B0D79620D909352E14C84BC66F7A65286CC2DDCC568557D0561F0B24E7C234F5A8387C716ADA9AB5B99B2EC285EDAF2750E0A9A9E37C2CA452BA4EB6715340D11D76E428C071188C9D2911635CAA34F738BC3ACE963B8A40639321A5716B30B8E51AE670B58440333F527DC13D2AF47515361927B31D0D4913466CDCA30C5C64DEB0CAC175A26DDEBD1366157E43734543687970CC383E33D7EDC9F6A1CAF57ABF26B11AD48E249028DA9E219C2AD5AC4D5F9605408C7CB93EC6877C69A8ACCD7CD7D79FFFC4002E110002010302040503040300000000000001020300041121311012204105223251811330610614A1F02391C1FFDA0008010301013F00EB3B559AA88F2A7535A5647B566813524EB1FA8D3DC17D947CD3C3247B8C8A041EB5668CF325238750EBDEB7E13CE53C89BD63B9DF81914024ED52B2BBE536FB168D82C9F3C6EA3E53F507CF1BB3A2A7BFD9B55CB17F8A670832D4F72EDE8D053176F5371BC182ADD04814B148FB0C50B53DDA85A2FB9A365ECD4A81005153BF3BE3B0E9650C30C29AD31E83FEE8C128ED9AFA721D31515BAC63277A6F17B20FF4CCA33FDEFB50C30C8A0280AB8F16BF8AE1A4E60533A2FE33EFEF48EAEA255F4B6A3E7A4DDA7615FBB5F6349728DA6683A8D0D78FB3CAAB6A8DCA18124FE0634FE75A6B28D63F2EFEF5FA4DE6681D24F483A7FDA9EF121381A9A5F12D7CCBA55F7833BC867B3F306DC7706BC3EC1E1B25824DC7F1939AD54F2B6FD5127D4900A118049AFD41E152DF9478775CFCE6A0F04BD7C465703F34B1A786DB8863DCFF00734C083AD04276A46784E41C1A5F1271B8CD49389FCD8C11435E9B25C966E33DD2423DCD4B2B4ADCCD564904CBCB268C28086DD73A0AB997EB4A5C708572401455A3D185039DBA2C47F8F353DC2423CDBD4D7D249A0D07428E6DCD1C674E0AECA722A1916E2306A7B4C6A9BD03D8EFC6398416C1BBD3B973CCDBFD9B59DA17C8DAB21D79854F6E24D46FC09C0CD5C31C2A7B0FB0077E0A706A19DE1381A8A8E5590647038C6B5211A0EF4064E051D3A95720D6382EAA281236E12363845EAA61AF1C56382120E94A9CA849DE94F9799AB3A0C7190F08877A7DFAF359D318E3FFD9, '', '2021-01-13 17:15:36', '', '2021-03-12 20:30:44', b'1', 0); +INSERT INTO `infra_file` VALUES ('1c164a1d-5f2d-460b-a0bf-dfc33deeaab1', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F0000010402030101000000000000000000000405060702030108090A0BFFC400511000010302040305040804040404040309010203110421000506311241510713226171088191A1091432B1C1D1E1F015234252162462F1335392D20A4372A2253482E218356317192655648393A3B2FFC4001E0100010403010101000000000000000000000304050601020708090AFFC4004A1100010204040306050303030302030607010211000321310405415112617106138191A1F00722B1C1D11432E10842F115235233629272A20924E21617344382C2D225354463B2F2FFDA000C03010002110311003F00FCFF00F041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C10418208FD87B813D3E67F3C7788F3FC6E69363C22D6FDDF0411BB815D3E63F3C104286410153D460823760820C10418208E4027618208E7815D3E63F3C1041C0AE9F31F9E0820E0574F98FCF04119A10A936E5D479608525EBE1F78DBC0AE9F31F9E08520E0574F98FCF0410702BA7CC7E78208DADA0999B6DE7F8E08236F77E7F2FD70410777E7F2FD70410777E7F2FD704118A93C317999C10CF13AFBFF008C638219C72013B608232E03D47CFF002C1046694F0CCF38FDFCF094D4158006875877214CC4D4FD59E32C6132985EBAD1DBC7E9189A1DBE576B559DD9FA7DE0C2D0D1724AAA4545ABF8AC18553348A7AD1FC695F7ADF44E1946C9F53F76F5BC6C473F76174E33BB4F03024EB57AF9368DA3830E51803308511C2536ABBB6EC6FE9D1A366135E0FBF1DE92CDF335347DDEE075873FAB3873DD005AC29CB7F4D6B780E5F4D5A851A8FB2D5C6FCFDE363F973C309B988C092848E23661A353F0E1FEF1B1CBBF5AEA52806AD7954F9B1B391E70DFF567A9D7C397282190654A510010227ED1F523D3E3A0CBA7F68FE44CB50E2F95D8D8BEBB6EFE908AB3AC2766471AE623E4A8721E9CB4B73D7AC467586B5D2BA4A851555F54D2B3108594242AE1691B7849036DA2498EB6BC763FE0E62FBF335285B02145D07567AB3373E839C707F8B3F13F099FCB1290B41E0052E143F8D47E2EF1E7E769BDBC67DABAADECBA8415508529008E12384980678418B58EC46F7DFD51D8BEC1E2B2C54A331040053420A6D4D5DB4616EB78F1AF6AB1E8C5266709A17DA8E49ADFDF98A15D4F1A96E288FAC39726D6264FDE7974E5B63D138341C3C89686F942403B1259FA01BF3146BF11C561D4AC41535D46ACE2E3416D980B78C33F7B56CB87BCF13677208B0B58013EFE77E5BE1D4FC4E164A0103E602A5EA0F46E9EB5B45932826536F4DD9C352D4F3D2FB3D52AD755FC9CB69D6AA85405AE080831637111067A72BE2B38BCC82D570DD5DBF34FB545E26B329A26A101DC0DBCB6D7DF296D2692FAB2135D9FD5200FB41B252088822E08322C6FCFA5F112BC5898E259248B9B01B6DC8F3B5AF09DD10CA04B0BDBDDFCB5768E2B75F6579237F56CBC0EEC82952B8ACBE1B022790F58E57DB0B48C089EB97C60A9BF6D051CF2BDFD0738CF0B7ED2DBEBF58A8B526BFF00AE05C41924CCDE6E6F620C5C7A82011CBA064F952259494A49B3DC57AFD1875DE32C5EF4D9B4FE7E914E669A892E9971405D51B73DE4FF00B8169E78BD48CAC2C070C031353E0C4FBBD214960D6BEFA7D2AFD5CC57B9BE76C282A48264F31F388F2C5830A8561C0094150029CEB5B3D2FEE90B02458C5659CE748414107884AB8960CF0743CC103623167CBE79596EE94016DFA3DBC474D602A56FABFBB539443ABB50B652A4B55A16A0090D94F09932624F43E9E98B127284E3903893DDCB7625C9A1A3B5F7FB466F57751D1B9EF688457E7D9A212B536D0A74916295A5C2F728099244741BF4387185ECAE5929655FAC4F10A974B355CDDB63E2E7687F845F7038881A74156ADBD80C46AD1966479EEB3AE4D1D165F58FBCEAB852A34AFA112AB495A91C113E7F3C67138DCAB26429B1929D22A0A92096E4FAB69CD8690FD58B29038998F420ED607C5F4D23B15A53D8935667C935FA8EB5191D227816D347B97D758857DB061C0A68A45A08BCD8CC6397E79F18303226AB0982FF00E6785D2B354849D2A4172F5A13B46E9C6CB482490966E120BB1B9B1EB77F28EC2699F669EC9F45774E57D00ACCC1AB9A90F3A8950DD5C21445FEE0440C72CCEFE2063F16B2A9092949774049513D0B75BF4143185E669593C441239EA1F73A0A103520EF16DB35D9169D60B392A825A5A424B72A3C2102D75493EF323D310723033BB529EF714852384BB11551275D400DA3B93D22B79BC93982870034D75F00FD4921BF2C198EB9692092B4DE67C43A5C6D6B5B162C2F651583471CA4958005003E16BD3F310F2B2598925C103426F5F2B5B5BED15FE6DDA286F83B92823C5C478922236DCFC45EF893C360F1085702B09316C59FE617A060C77E40F51599C365533880AB01424569E5D6C4E8763F43BDDF9FCBF5C7C6A8FB131B1B6F7BF4E5EBE78208D9DD93B19F77EB8208CC20A6666FD44608239C1041820830410A1948215239E082377027A7CCFE782083813D3E67F3C1041C00EC27E38208D884004CA62DE7E5CFF0C10A4BD7C3EF1B3813D3E67F3C10A41C09E9F33F9E0820E04F4F99FCF0411B5B481303A608236E0820C10418208D0FEC98DA4CFEFD7E6704369C2A7937D0084D82108DEC6EAF4C10429C1046B7397BFF007FBEB85E454A81B375D768D54A2080CEFEDBE91AF1B2C0248D296E821DCA415F086277E956F0E9061B2BE57D5B6F7E71209C10500785CF3A0F37F1A6FAC7307A1F81C3757CA1EE7503D2B6E7CA36FD3357840DEBA79FE233458906C4EC0D89DF61CF1B494158E32A219CF0B78EFF0096D371A99A9927846B43A93CB95EBEAD1B0DAE6C3CEDF7E135E3E725624CB4A94FF28A3EDCB9F3DA31330B24CA33662920B7155B7D4927E9CB584B599BD1E4CC2EAAB9C42184A655C6A090A001DA489F389DBD316AC87B198ACF6721465AFE6503504B545C0B373357E4D1CCFB55DBEC2767E4CD4A26A78D20FF00700C40237D3EA6E0D23AA9DA97B41D332DBD41A6DC42570A471A162EA883736EBCFDF8F507633E14272F952E66270E1870A99419EAFAD5DC0D2F78F2376E3E2FCCCC8CD932672812541252A3F2935B0BEFA0E978E906A3D759BE6D50BFE3B50F2FBF512C00A5917BAAE9240B0E6664917DF1E89C8F23C248C3818591292500098FC2CA61435D983B0A9BED1E7CC7F6971666A973E72D426124024D35B39BBBD3C621A3307585FF002524A567ED106D3E666F7B01F118B1AE461928799C0929B0000E7561E7A97DAB0C5199FEACB1750258B9F017E6684EBCA14AA96B1F5B45995B951FDBE2E020C0E289E1BF5237EA31058BCD254B79682DC2E2EEEDD2B5D4EFE0DAAF0495BA8861A335EA46F41A915AE8226D94E87AE6529ABCCD680C7DA2952900F08BFD9E2927CCFEB8AD4FC7AB1130CBF9893D75ADFDB1A690DB80E1EA0B373BD036B4035BD3C21C333D4F91E46D0672361B554905350E18F09488175023D23F2930B96E2312B515F114D38433B5DDB5E437F28CCBC419CE92F6605DDC543DAFEDDA29BD41AE1350B50CCAA949249E16D1C5C23A094102DCF7F28C5830B904E5280E025C8AB352FCDFC7CEA215E015F6C3DEBE91546799EADC2D990191C45B5055C8E7304116DAF8BBE53D9A595259160E5C10CFEBE9E2D521962CF5DC5BDFD3C04573996A24B4140AED3D63EF31D07E62D8E9596E401013F2ECC1897A56BE356BFA1D420EA5BDF5F7F4AEF3AD4C1DE0E05C70F14DEDBF95BE1E78B561B23E2203300D417AB7974ABD342F0A2106AD5F2F7B8BC5719A67CE9E2217293B4131CF97E38B0E1F26C34A40330A53C357207DCEDE20C6C4117D62249CE6BAAD6696929AA2B5D7D5C284B2D2DD0924C429494A8226D1C513CAD384B1D8DCAB2F149D2828034701D86B5F76BC64214A4A940512CE5F7B7BE9168692F674ED1B5938DD5D4E5AACBB2E708597D6EB654942B9941215B6FCE76C737CE7E25CBCB5E5E194E5CB70D8B01A5B52CDE71AB6BB74BF4BEFEDE3B33A5FD98B4069B525ED515BFC7AB7C0A61A525D61348A4C158F0A8A1C0B3D640E9D39DE3FE2666999CD2995355864A5DC825D6F4AD886FB36D19FF74A552D2EA0BB8D49EB4AEBA336BADF946F643A6A8D34993D150D22109E14A8D3B0A58E1020F196F8A6013BDF7E78A86638BC7E6734CD54E9F3261FEE0A98906C2C0B1D80A51AE6012E7B01F3569BB72BD76AF4110FCDF581A4595F12AA03F370EF7496639A532019E805ADD4E12C0E439962A60E34288243B80E4022E59EC7DDA35EE26B5016AB0DF7E5EEB158675AE6951C6B7B312DEE4B6A4A9503A711BDFF00327963A7E4DD90594A0CCC389967240A1D74AD58C024CCAB8507D2B5E75F75EA22A8CF3B4FA36520533E85405719EF00EBB898103974B7AF47CAFB21C20BCB4CB048E1000DE9B5D80B1F4895C0C86204CBBD5F9BB0A8A50783F952FA8BB5C5242F81EE217809503693D2763EF1B5B95D309D9BC0E1C0FD44C9680003F3149D8D8989944992194DC99AF5D79BDF9161B0A9332ED3B38CC1C4B7468AC599321961D7449DB88A52A03CA6FE7189299FFD9DCBC12B992262AFFDA1DBA56A75F5893952E4FEEE14B269A0BF2A75D8C7D9F702BA7CC7E78FCE947D488CD00899E7820856D7F4FBFF001C1046C7397BFF000C1046BC10472013B0C10473C0AE9F31F9E0820E0574F98FCF0410702BA7CC7E78208CD00899C1042D47DA1EFF00B8E082327397BFF0C10A4BD7C3EF1AF04291B1BE7EEFC70411B304118A93C51788C10463DDF9FCBF5C1041DDF9FCBF5C1041DDF9FCBF5C1046C4366F0472DEDD7D7046AA4F13559A33E03D47CFF2C11AF77CFD3F98E0A4A6262F820EEF9FA7F318E083BBE7E9FCC6494F14DE2309AE7095AD4DC0F4D21ACC404AB702C767F7AFD9E32EEFCFE5F1E78C27121542AB50F46E9E17AD59E25B0880407143F624F87500F231AD41485A63633263D63979F581BDF0A0636ABFE7F36F48972BEED2598003A7ADE9785E97611E000AA2C009933E847E5EA6CA0C3950709AF536F63DB457B1D980960B1B3EBBF386F5A1F2E7795280D2904965C2425206EB27607C89983B637460B12B9A897250541440A026B4B5FCCE962D103333EC1C94AE64F9A947007F995AEFE837E758ACFB40ED7B49691A171BCCEA9BA8AF4A141A085414AD22D3DD9BEC3A73DAF8ECBD90F86188CD97266AE5514439526D57B37516FE787F6DFE2F4ACB53364C99C0B710042BCA8EFE1D0DA3A0BAE3B6DD45ABAB3EACEBAE3792A4B818E05F0C2153CD30A3CAEA9F863D51D9AEC160B2097C62524CC64F1929D980615D49D2BE71E43ED576FB17DA099302672D94A2ECA25DDF9DEF67D0E800A32B5C72AAB0A299C5960A8A9C5A964913E2B9513CE79F2F71E852E6CA54B1282412DC219852C2D7A6F60E3568E61370B880B3396A528383577AF89E7C8E9631ADEAC697C34AC8EF9C62CB4F0F1294544110482607979F3C44E331ABCA5887F9AE1D83D7F353E71159809B882020171471F6E648FE1A90F794E98CD7365871491474A2EB2E04DD063FBA08B4D801E5D442CFCF7138C3F2950068384925CEED785B01297214935040AB8B9D6F5D2BCF689839FC0F48B45197AD0F5554A4FD6D44F180A6C0E1E10A2A09BCDD3E569384F0F87C4E26612B4A88A312E5FD0BF8FF009B14BC406093C9CB83D2BD7A00FE759EA5D6AEB895A50E2D2992084A8C46DB0F4E9EEE58B9E5D9271315203D2AD5FE437D5C447E2809BC4003A7B715A5EBE42F151D76A72E71F78A22E4824C13D46F3E71B62FF95648944B0A080E68430E6DCCFADDB946B8190CA20861A1AD7C3EFD4968AF739D40D10A2B50B4F43BDA79F5F527618B8607260E9FF6C1377200BF20DB7F889054A0EA6340CDEF5D76F48ACB3ACF95C214D3A4F0C9E0130A9DAFB88FBF6C5AF078144A07BC481D40A6CDE9FCD635EEF9F5F7D22AFCC750D45495A16CFD58DE17DE7113CAC89E76DA7D4C624E4E270F852429495736614E47CF7D768C940A72F50F5AF9FF0010DF94E5B9FEA5A85D0657435598D4A9494B290D3ADA254620BBC3C2396E4623F31EDC65D93389810A55C7CC01A07D3ABB3788A4615F29A51DDC69E1E71D89D1BEC9FA82B8B199EBDCF13A5E8950BFA806915E5D418F09534AE24CED3CA76C732CF7E2B4EC68523289267AD2E95242FBB67E65810078F2302502BC5F28350757A93E7B1FB476974DF673A0BB3EA7713A6B25A6E3AA091579A3C43EAAE5343C2A4B2F051A7E13C93C24C99C73AC463738CD27CC9B889D312EDC3872A5349767F9C11C4F7A337AC60D0326BC5767AB1D9E9515A316F25D5DA83EAC9296F81A481012D8091FF4881B4DA3D061C48C9674FF009A6ACAAF42E6B5D5C9B5691A457D9CEADA068076B1CE052788A1C924A6638A403723A6E3EE7533B2B389419128A8387603FCF9D0E97896CB90851F98F2B0D3EB5DAA75BC5459FF0069542942D34E7EBCB4880B528D3F099B58C4FCE0FCAF5D9EEC84C982599C8E12083548275F3A00C452912E2549092431B0E74DDDEC35B750D14966FDA5D6BAB5F7CA53886C92D36DAA4B53361C175CEC378F22631D7705D95C24940527BB42884F12C81F330E76620B9153EB194CA9003900DEBBD1CD6ED53B3B18AF2A738D47AB5E34795B55656E12800D33C94C9B7FC45242779B93077E589350CAB2F9759D282807532D0F4D83DED6DF9C60C99360D7200602E4120BD9A950D123C9FD9B35B66E876AF50E6E720A65F0AD912DD49A94AAEA94A17C4D948EA39FC6859BF6DE5CB5AA5E58B338CB2CBE1052CF600B17F0AE81AD08CFE0C30534BE252838214CDD40FC01436689851760DD9DE429073DCCD39B3C800AC28AD90A2093221640B08F39BDB1589B9B67999A80968C4278AAE0A983F26B7DBC223CE2A7AA8A24241B52A0D59FEBE1A38896D1661A0345B6B190645423BD003CE3AE36F13C164901E4A888E7004DE7961493D96CEF1E52A9B889E90AB92165B4AFF86E4E408C9C54D724120D2C6FE1FCEF4DFEA0B813D3E67F3C7C448FAE1182C01103AFE18208DAD7F4FBFF001C1046C7397BFF000C1046BC10428640215239E082377027A7CCFE782083813D3E67F3C1041C09E9F33F9E082315262201E73B9E98208DC8FB43DFF71C10464E72F7FE1821497AF87DE35E08523637CFDDF8E08236608236B6099813B7E38208DBC0AE9F31F9E0820E0574F98FCF0410702BA7CC7E78208D8DA0C99B5BC8FE3851129730128492DB03F88D4A929604B3C6EEEFCFE5FAE345A552DF8C14B5DC41C69DFC9CC25A84414C49B1E584BBD976E34BECF1B42683D0FC0E144FCEDC3F33D9A08554E82AE29062D68F774F31EBB74223333973D2C532D5CA86EDEBC879C68B0E40F60381E3F6850503991EFF00F7BF2E9D79623E4CD5A3F7862DF6D6EFAFD62530A81F2922ADA1DDCE87DDB48E52D852D28304AE403C86D79B6D7FCB161C02D33F85D8BB3695ABEBE239F284F30C64B9328954C4861A9D9E8CFA74DF94346A0AFA5D334CBADA8A86509402AE15BCDA4D8490125533F38B5B173C164F8AC424193214BD5922AE76A55EC06DE11C833FED56030CA5F162D0821E8A50B8EA59AECE63A7DDAA7B49A94CA32BCA4A53671B79D6D4991FDA640133E47CFCB1DFFE1A7C3A39924E231D87E0EED890A4DDFA8ADBC9AFA793FE2AFC5299972C4ACBA7F7DC45415DDAF98A509A57968DCBA35A8B3BABCEEB5CACABAB72A8B8A2AE052D5099E504991E57E533338EFF0085CBE4F673865CA94084B00C1B7B9FCB6E1A91C067E718CED0054CC44C5A42854124924EDB30ADC784343D5A5B6437629779003C3C3BDC093BFEF9CBC9C7FEB4F0A93C06C4BF938A0B50EA79561A0C18C19EF0AF8F5F5DB7F0B7431BB2E4399B1197E5ADBA9754614E702F8403170A2909023CFD30E4C993844F7EB9A193F31147DC51DCD7D0E85842C31699E44BE10D40FE62A49A0DEDE57B0E934E64BA5984D4E62B43998B838D282AE2248BC5A529B5A481327AE2BF982E6672BE1C3C95144B35531170C0B1E96D7A42F2B2EC3A4778B5A49502458B36F5EB7FA9AC3B52768350EB6AA44C5234994A3BB29320587D88378EBE7732712195F67A6383310470B1729DCFD69F5EB0C7152E4CBE208502DA8F1D411BFDC08A6B36D4F5544438FB8A750F71142F8A763264090396F13B73C745CB324C31212402B4B3B80F514A11B8DF588552D6E785CBEDD357BF4D6A6915F663AC12EF1092679C9F988B753691E918B2272A5CB712A5B8A51987D4FAC48E152B985969246BD01A7566AF9440338D4895C70AC08E2913173F03CCED2475C59F27C2290969D2CA53A72BBF27F06A5A251587080080D6E54B5BA69BB12358AD735CFD6A514A572A13B193F0DC9BEE2E4CF2C584CE918541AA52DA9A9D3D2FD5BC635280D40C7993E30DF9465DAC351542A9F22CA6A2A9C5A9295BEA429286428D882B4049045EC63E2315ECC33F91282809E974BEA97D4DABA680758D084E8AB339DC9D3A5347BF28ECD683F65862AFBACEFB42CDC30530E0A20DF15EC4A4A9A544C45C8B1BF2C72CCEFB6B880A29C0A3F505D414CAE1E1AD0824D79B7F319FF6FF00B884DD892F6D4B6FE3CA3B2D97A748E8DA6396699CA695A0A486DCAA5212A5BBC0212415A0A916BDBE3CB154387C7E7E1588C56257420A52C7E4D48A5FD9B184D402E882585E80BEDD05B6E7AC36D7E7294A56BA806F24153A4848BFF4931EE03D7AE24F07947E9871A0998A0C48E121D9AA6E796E1ACE29A2A5AD3423F1AD36DCD7EF15E57EA96E902FFCC15A144C24130D81E7263E3CB98179895350A5241C39045096626C0559A8DF4D69191C61C90EF67A5BD9D2FE71516A3ED0D0C970072499E704C728EBCADBC8907170CB24C89A9038784B8D59AAD5F3EA06D4318214A366F114F7E315557EA3CE73E525ACB32FAAADAA04F70C06DC4B6E1302EE9414245C1249B832671699589C065724F7A25ACAAA1D497A6C2F60458D61591395248649A967AEFB1A59FEF1BF2FEC875667EE7D735BAD3A532F242843ADD515A39C869414391B89BDFCD15F6F24C99331380C195CC450000A5EAD761CDFCE1CCCC54C0A294925243B87E47E94E74BC4E99D15D94E97434B08467EF23ED54ADD718EED49DFF96A242A6368F80C404EED57687325A532C4DC1A4B8E04A78DC1D8B53AD2E23518D50354F15033ED7F1DEB47109732ED674CE4CC9A4CADBA3A100708E1A7694A03942CA267DF208DE775A56498FCCD5DE4D9D384C2039254012756240E54E8F185636610DC2A67E9A860ECFEF9C53D9FF6C152D9E2A3CD9FFE7717136D32B7A609800241088BDA00DAD8B764DD98C065EF33319885BD7E7604355DC972FF0047E6CFB0AB188A4C3C2D4F9B5AF33EC88AFDACDF5CEB3ABFABE51936659938B5405A9A7E992A2A3FDCB404C5F798138B0CCCFF00B3D948225A641290593C4870DD1CE9A3DC0D61E1C3C915E201BC6E2EFA0E55040701E27B45ECDDDB3E7C84395D90AB2AA65805152ACCD9594A5512A2D1701300EC47E00D6F17F19329C29549C3E152560904014D6AECCDE7472212386921CF186D6D576BD5CEE2DA120C7D69E3E0F47D6C80807700FAE0820C10460B49511161CCFE9EE8C1046D423E1F7FEFF41E4410A020FF00E91E9F8608232EEFCFE5FAE08237349E124CCED8D16680737F2FF3030370F1BB0946186C3C840403B807D719722C488180B0020C62061B0F28C929E29BC4608CC65DDF9FCBF5C1041DDF9FCBF5C1041DDF9FCBF5C1042AA64F09573C1042AC104182304034306081850B5ADEFDB4189CCAB32C3E102C4E0090000E1FC8B7D9B9C6ABC14CC5074288E1B73D3EC7C6FCCC218F9F2F18E25D097B36B61B59F5E95B335C89987352FC2EE0DDAA0F27B6F4F28E201DC03EEC5715964FE22A0A535C162037E0FD358C271A38B8483521EAEFE0C2DF6D9A081D07C06257053460C8EF403C2A04BD2BA8AFDEFEB137879667B0142C2C3A8B5396DADB44EFBD50C42984CA3FF32C3DDC89B1BDBD0DB12788CD70F8C09969949530201A6F714F0BEBB46D8CC30C2A4AD6A6D6BAF83F3AFB7E02D971B554D43818424712CA884EDB8F1116B1BFAF2C2723B353735534A96A1C4400C1E87A0ABEBB522A599F6B30B964A513312E906EA03C6FE26FA333C541DA0F6D7A674BD306289E6DECC21C4852553C2A168316E9626FD48231D2FB31F09B3099325CD54B99C2483549EA2FE3F5611C1FB61F14E4290B44A9E051428B048F5F31E0F531E78F68FDAB679ACEB5E1555CEA69829412843A4002F000491E86DF3C7A7FB21D809597A658C4C80B147E2480777A820E94FE44791FB63DA2CCB369B37F4F8B98905DB8546E6A2C5BFC6E0353ED39F5BEF50E71252DC0EF56A51E2264CDC99F75F1D824A30B95202644B4CB7150960ED7B0D3CF9C735C160B1656A56653173C9248E304D39151D5C3728D0D507D62A52CD3B6BA92A500549E2013B740A1B99E7CFAE23F1D8F95381709D6A6A75A134AD1AF577D8C4BA42650F91013C3FDB667D1FF001A88B432BD0D49414EACC3397D219090B0C2889E662C67CCD8F96F8AE9C61133BB9293C4AA822C9BD7C5DE9D21B6214A52439A0D1C543F3F4FE6AC79CEB3628D2BA4D28869829052A584A7888F252D3C5C8DEF688C4AE1302AC510AC5A9534E8092914E42F4A795223A62969712FE471A6A75D68DECC55199EA1A9796A5D538B150A278C95920ABFD227840B1FB3BF9E2F794E12522584942526C01001A35CEB4A353684D336711C2165B9DA8F4A07D5EF468AFB36CE5B85294E78AFCCC73EA6D6DCF962DD84C12569E14A472200A5431D3CFC7946122613572FA93720DEFA3914E422B1CEF3F70777DDD484B7E20E34471F780EC02BFA63A889D8733896C3E4F3259E304EE4B353C1CEBCE8FA448C8420BF100C3EC06FF715D62B1CD756B6959629E9781D5482B0E05993009E1F9E2C3231185C394F7E525290DC2435854BDB6F06A8B44B495CB9690C90EEEFA6BC8F2F58D794E88D73AE1E0C64740FBA0901EA93FCB45325C363E20028104CC6F1104E18675DB3C0602504E1D32C5083F30736F122D63CB91DE74F49D406B6B4F2DFD3A34766344FB30E4FA74379BEBFCED35B54385C145DD9042B7E096D445AD7237B75C726CDFB7B89C428A70B2C94A9C779C4C13CC03CFA7943454C4B925437602FE1717BEADCC98BF69DEA1A1A3728B4BE594F454CD25282F169A2B7922C93C4B4858889306E0ED338A82B133F19342E74F54C5BBA6A5210ECEE01634D08A784325CC592529A03D2B7F2D7EDCD9BF88D6D1F7AE57B854923ECF140883CA63FF6FC394E60F2B13C0E22492000C08776D75A7F8864B953947F716B9DDD8B337ABC40F35D4F4AA538A6DA085A64874AF842226E12A0019F5F518B5E132B97804242A604A1603A08A9AD43E9734F2890CBD1C0FC4E4D402742F5DF76F74A8339D7CC07974AE55BB5EE9202596DB5C09361C4806D31CEF1BE2CB839397280485A11C41CBA85FA13E5B3BECF28426EA0EDCDBD61137936AFD4AA6DBCBDB5E5197BD77EADCE17613C8842E15617107CB6C2B8B19561105969993B4484D49D03D58D817D34A46532788B80C3572C3D6BEBA7521DA97B3AD1F912BBED539BA351D427C61B334812B17E1250A20DEC6D163EB8ADCEC563D5296AC3619724A8FF00B6A0EA7008AF0B6BEBBC6552D095014551EFF7F5D59E8766FCE3B60A3D2FFE4720A0A4CB29D00A1A6B818A85D504F475482B411D4193898ECEF67CE7EBEF33698A42E5D415CC32C3171FB78922C36D9EA63454C42414801376D58F53CCF872678A633BED3B51EAAA834D4B479834F38A29406987DD696546DE24365B4836332201F762D98BCAF26C9C30C44998A483AA43EE1DEBB35FA930DCCC4A9D400246BB8B73B7873BC3B651D8F76C1A8D21CA8C8D54744F416EB975CD71F02B752A9F8829300FD95004F316B56E776E72FC14E54A46150B5208621373D598BB7A8DA324CB090428125C10D6F4B45A593FB2665A809ACD59AB0D42800A732F148B49EA51DF2147E37E4646D86B33E2662F8BBBC2E583855699C403529429B83A75148C254805D469A5363416B1D06FE962651D96F64BA5160D268D6EB2AA53354ED738A0B52765774E7104ED31104F2DB15BCCB36ED0668A4CC9B982D085391282384240AB3A59F6DEDE08E2B1219A586291A7D37A6F5F48B21AD48E65F4FF0057CBF2ACBF2BA303847053D22D684C58F106F8C9F7C8F9E20D7964CC44DEF67CD9AB59673C6A00B07FDBC5F4E9710C3F578866EF0B1DEBF588F3B9BAEBD6E29AAF5BCB0417525469D289D8004A527A1816F7E2464E5F2C30984166009009EA4FE5F78D3F513BFE6AF323E847E23DECC7C878FB35060820C104668483337DA3DF82085A845801CB73CBF7C86082378481B608239C104184E669E3F6820C27041820830410A69D20F1126361820855C23FBC7CBF3C10473C00ECA9F77EB82083BBF3F97EB8208C8009993BFBBAF9E0823991D47C46082091D47C46082091D47C46082091D47C4621F3113411DD922EED57D4F93B1D59E257018A972814AD9C8A39A16E5E2FB738CA0F43F0C38CBB106510269AD1C973776A73FC6B1A62A4271615DD01E06FE3CBDE91C7BBDFD316B463642D2CC38D8598EDA7DBFCC404DCA57294555046B5372FBF5B0E8638E24FF70F88C4762B013B141465A4925D9ABE81B4E9CA91B0CE64659F2CC58043072469BDDEDF7860CF3525269EA735D52F30186D2A53895BADA490279150240E606DCE3161EC8762B1D986251C52E61054E070A886B9FED6E9BD6AF143EDAFC44C24890C99C80A092C428072CE351D2BA79C7457B62F68A73375BF95E9474B4471216A6CDBA13361E97F4C7ABFB11F0F4618CA3889628C4BA7EFE75B08F2176EBE22CD9C26093394CCA145EEED626FBEBAD1E3A69996779ED6BEAFAC3EED43EF9256788A8B7B9BDCC4836F98C7A432BCAB2EC248484CB40EEC072120396AE9A757D3568F32667DA6C762B107FDC591C45AA58392E0BEACDD3D21BDA7F2FA154E64EA9550B8E1404A892A2622124F5DA06E3918C298DC44B961E5A512D20162C34B52F5229C9DF789EC8B13DF9499EA249209E2BF874ADABA6C048B2DD2F9FEA073EB4D27EAB9332429D5B812DF78DAAE3842A167C3BC4C03E726978FCC53326A65713A96EC12EAAA7FE4D673BB06B4587384C94CB49941367A36DECF5058D584E4E69A774A52F7394B68AAAD4A48754A9B2E3C5754F3FED36E62C30D6565F89C428F1A1610A6F95DDC3BBD2941E9D62AEB584D8F12AA09EBE60536FBC5699F6B673325254E3CA6FBAE2E2A70484906C048201B7FB5F169C0F67E61E17430A3121CDDB930AEA5C4205D4E4D46BC87BFCC54B9BE785D5A8B07EAEA932A9DFCC93113D245A7173C0F67C84A68C056C1D8F205B91F1A3C375CB7341A50FD8F5FBF5884E699FD5AD0DA1C8847142D2A04AA44CF86E23CF9F5C4A4DCA972787802985E9D35FF00378564C906F53A8A55AA3969BEFAD4D659C678E1529216A2ABF824924DF95C99F4F332379DCBA6A70AC66D367274B97366AF9738597213AB31140DB7F25FF10D195E9FD4BABDF5D365740FBAB94A0BAA4A9086B8F9A4A841041E46DE5CA4719DA5C1E1E51056805B7AF956A29467A79EAC6C68123414E5B54DBC394762344FB346459625BCDF5D66A0D4D9C6E93BA2AF172492DA88DE05E773D231CA33DED5E23133169C04854E9609E29817C3C2E59D8D09D4FD890C999852FC4A22EC2A6DF96FA0D62F7A3CCDBD2ED2F2DC9B2F62832F74043354036B5D4A50224829E3470EC66F27E15F91819B9B28CEC4297C52AA904A83137700D40E6E28C1A1133D75483C40B798DBCFEAD0C55F56D289A9A86D554E93214A754900998F0CC45EDC8C46155640FF003214E454802C006BD3ED194951503A9B87DBA52C1E83A8311C5EA4038C38FF007684CF7680809088E448DFCC9E7F0C208CB664999549D1F7A727F7D21E4A4BA8248626C5BCDBD9FCD51A8F54E7755589A5CB10E3E952A09424A80E57201DBA74F2C59F018D561E850CCC03FAD4DDFAB3D2241186E3B5199EFF009630A5DD179B6694F49519C560A1A532A711092A701024182088DB6C6732C562B31E197870A2514570DAAC45474EB5368274AEE1228C2C74D9B5356731B54AECFF0046B25CA6A0A7CCAB523894F2AA01525606E1B5151372791B817DC8C60B2AC62B87BD9CB96C352479D5F416DF9C240BFA1FC7F9EB102CFBB58CD7345A32AD314350F553C4A1BA56A95C4366E213DFF77C207424C74C58F0F829186509B3B16898A4B9659156DAA4D033DFC2360A2011E5CAAFEB1865BD8BF6A5AD9095EA0617A5D959E21506A5BA92A49933C09585260728BF2DCE1EA7B6B96E01250252710B45199813B71330E77E718D9CD0D5EFE3EEBCA27D967601D9E64C108D639B1D4158C90695052ED3C2EC5CBA150676932003D23142ED776CF34CD8A1394E19783624284924B8A307481CCD183F388FC6CC52280EC47E3C770FE348B8B2BA8D3DA5E9114BA7A86872EA74240495D3B358E2D226DC6E214B13EB23AD862B3864E6D8F081994C9F420875AC1AB12E1D8EF0C0629490C1C13D48600D395EFE50D953AA1AA8716AA665D65D905D79BE3E07093E129680E04C5AC1201993CA2E385461658509D350B0C004A800400198A8B957992D7D635FD612096AEAE5FD1B5ADBC5F44C9ACCEF30584B4A79D4AA3C3DCA933B40E22981EFDFE58D978FCB70C4944B4A9B6200240F07AF2FA467F52B7DFADB56E5D474D6B0A7FC2B9FD514ACE524857DA75750968A3A10851133CEDEFDCE23E767F2E6B2508091A1150DE1D18EEDABC67BC330D284D087BDBD34BF2EAE6D7672E389E3ACCDD3978DD48E10F01CB70A8F94EF86ABCDE6A52552D0A98480750F566D9C0DBC63520BDED42297F7EF7D4F68BD23430735CF3F882893DDA50CAE9F808FB576D438F8AD726D1206114E79892549549286622AFE83C7762488D8D855C540B0FBBFE0347B95C0AE9F31F9E3E55C7D9E8DADA0999B7CFF007FA608236F77E7F2FD70411B5A401337DB718208DF8208304106082324A78A6F1184E669E3F68232EEFCFE5FAE138236B68179BFCBF7FBE98208DBC09E9F33F9E0820E04F4F99FCF04107027A7CCFE78208514E002A8168C1042AC10425A80094C8B4608213F027A7CCFE782083813D3E67F3C1041C09E9F33F9E082324D10A93C72AFE544004DE76B741F8E1DC8C3A2783C407537A3B01BF37F37B44E3953D2B4997C4CE6D6DF4FA6BAEF0E0DB8FA07748488800C807CBA44F337DCF28388DC6E0D6853490E09A84835666A8EB7F1312F97E3C480F38B505C80E3CED4FBED1A5F7174692BA9521B61CE2EF14A2910123DDB091B73C3DCA329C5E226A3E4590486A12CE45A9CC72DF410CB3EED66070D87983BC9614124FEE48D0D3AF2AEB1D79ED47B63D37A5E9DE672DA943B570A078566CAE7CC8933CB6F863D15D8EEC1CCC70477D289A24D52FB568C18EBE2D5AC794BB6FF00113B954D32A707054C12A1CE9473F8B3D5CF40F5FF006A59CEAD71A43952F21849761A4BAA48712ADA4248DB9C83E5CC63D43D90EC4607289056A909E32126A914A54543F3B9A3758F2DF6A3B7D8CC7CD5253354415100859347B383E914C54BB534C4AD973BA0ABAB888515493375C1BDFCFDF8B96225C8C24AE3949482DA5096D8E8CDF6778A32F173F1A499855F31AB9A52BEFABD617646D56E64EB8D6574CB0FACA454542C1291FDAA01620082660F493D2A58CCFE6A55C090404D1C3D2E6A35FCDE3072897FBEE4B3E9FE2BD356DA2C8634C69DC890330D50E22A6B40E36C724AA398448F2BF2DCE231798633174758E226B52C05F4DB4FA464BE098A0971564914277F53E8F0C59FEB9398A1BA7A750632FA4E24D321B86CA81B10AE182AE51C409BF217C5A3B3B94A5466CF5CA2A9931B88A9D56B33D07A56F183984DC480164B25E8F67ABEF563D68DB1AA735CE91255C769EBF39264FDE791B63A160F2C007EC0E7968CE0FD3A728DD0AA9737667F7FE62BACE738010568584AC025299BABCA79C5FF002B62D183C081F2292C926AA6019B5E74F585C70A5882F77BD7F0DCEF155E67AA9F5AD6DBAB0CA45B912AE5B8BCDF95F9C6D13D25183C3B1510784B5D859DDBFC7842C9009259C8BDDCD051FCA18E91CD439E3E32FC832EA875D78F0AEA8A565082A220C389200BC83378DF0962F1F824216A98B425206A5209A56848B51D88D2F028F7601259DC74D7D6DEDE2FCD11ECFAE53A919CEBCA80F03C2EA59B022D37EECFA4D8F4C730CDFB49266AD72F2F52A628062405009BDBADBD7A616B143B8717AFA534A55BCE2FC6ABB4F644C228B4FD3329425212B525B485022C2545215E867EEC50B158DC5CF980ACA96A7F94D58576B12DCAF7686EFCEFE2FEF7861CCF3543AA2E3CBB7424C08E8240B7E96B9C4E65B2573B87BC04715E8C0ED41BF87E74324AEA5C9DDAF6D010F119AACEA9DE6D4A4284B1C50A5287849E8933EB6D8E2C404BC0002628049BA451C6CF7FE29BC09C3D406A93434661CF42DE3D4DE0EFE7199660FA9965E5D409212DA5B2916FF58106C2E6479CD8617958EC19708940391FDCEFCFD61C264A87EEAFDEFAE9E75BF5C93A7731AE5A6A334CC5BCAE8A98F12E957C0A35C954784AF88291C3039DE71B4E5CB5292997244C2B70482DC1B1E6CEFCEE6B0FA4C804B936A8D3952BEE94DDBF34ED0720D3ABFE17A572952F3357F2CBCDA1CAB0B7088064B6B489DCF8A3AC61EE1BB3FDE052F198A4774AAA65964B001C7CC0825835361489044C9690C181F37E5B5ED6DEC68DAAD2DDB06B30CD4552065F973D252FA9DA76E1B277EE8A924100DEC3D37C6ABCE72AC8A62E4E19231539D94C951029AA8022AFCAC39435C62CA920B7D093BFA379D21FF2DEC4BB3EC9168ADD539DBD9A6683C4AA64A2A0202FA12DA94D913D3CC6D1883C7F693178D98512B07DCA1569BC605D8FED6069615F2AC4705A48E251A8FEDF6DBBFA74B0A92BF2CC98219C972E672E60C065D1469AB71F8B4951694B6A37B91336E711189C0AE7A92A56348A12471D89157655486FBF4D04D2096B1B0A7E35F4E70F02B7516663FCBA1755C768314DE83C5C200E5B5B0D8C99787078E626601A8AD87224B7BE507784D002454F3DFF003BF28C17A1AB73458733C6DBCAD283FC950A843EA7A7ED4F0A8F0F0C73DEFE987D82ED0C8C220A25484CD5D944A4023A15276FA0A6B0CB1838882B0C3A8377D06FEE90E4D68BD2796A439559877CA489293C66E04DA146DE5E76F2D3119C62B1CAE14E15287A382353CBEBA4302DA17FF34F4BC64ACCB4750A0F754A97DC16061420898DD379E968DEDB61AFFA4637145C2D487B3F3BD29D5C884F84EA3886E28DB0D2FA0B08677B5CE60CA94DE5342DA132027F968317371C49E912461D48ECC82927118863A82E3D5F71EED19083606BA52D4EA012DBFDE1BEB351EA0CC0215983A5A0890D25B084833733C040F59F779CBE0F24C14A1FEDAC4C7A17D1BA9B97BBC38972D44BD9B9FE3DB8863A8CCEBCC8352E0106D0AE9E768BCFBFCB121FE8D216DF28045ED47FF1FC428401AB9E43DFB6D21ADD715557AA754BE01E13711CCEC47C67AE355E4320B1041BD185BEF6B51E8CD180CC5CF41CE3E827813D3E67F3C7C7F8FB3F1B5B481303A608236E0820C104182083041060821553278B88CC6C36C27334F18215777E7F2FD709C119A1004CA80F5FF7FDDB0411B3847F78F97E782083847F78F97E782083847F78F97E78208CD20098333FBEBE78208CB04118A93C51788C64249720381730463DDF9FCBF5C6AE096D76F7D63608529983BDBFC5E0EEFCFE5FAE1512A61B24F913F40605A4CBAAC30DFF003B41DDF9FCBF5C2334F73599F28DCD3C77AFE37AA299A859E14972341527C89B7B78534C9525445E1504988100733FBB4DF082317316B12F0A0CD0A2C420D9DB40E75AE96A562630F2F2E97256BC7CF97228E9EF080E79390FE1C9B788CEB0D5F41A5A8DCA875E6429092A20BA806403C8999DB91E5B418E89D9DECF63332988E3C32CB91562589E4CD476BB53998E3BDB7ED465D97226FE93192D7C214DC2A1663B135DEC6F56AC744BB53F698A9CC94D65794ACA427BE6DD5A0C8BC817FBAF8F48F64FE1AF109532661D8FCAAA81D59CED4D0D5F58F1AF6D3E27634CD992E54E5A9CA83824867A7D7C868D1D42CEF3E5D73CED4D7D4ADE75C5710495120711FF00EA039FE938F42E47D9A9397CB4012C7CA120BA59B9D458372B470CCC3B498DCCE61E352C827576AEEEDEDF788655B952E3EC968294F2CFF9742415711D8F144C0DBED45FE387B9D66E9CA6584259D42A686DE9BDB9C37C265E9C5152E62C39AD7C4EA77BE8D13BC974066F99A5198EA17052D23403810A521329F301493CB68B4CC75AB4CCE958B484A428A967E54D58BDDEE282F5E5D1E9C2A247ED62CDE8DCFF0005DF61128CC7566579553232BD38C349718053595090388923C264893CEE955BEF7182C82762662A6E25C216C509290C96B8A0A9DDC437562D95C201A5E8E7E87E8DA3EF54671A8D0B5A8D73E5F52893E2511C27DE6F1D7A7CEE380ECC4B29042028581671CF47D0F23D2009FD439340AB3F8374A6BB5B940B31CD5A4C2997070AE7C01511E9E5EE1B7A62DB97E59FA67404301C3A0F32E1FC7A50886B3F08B92C5150A3A07F56B6CCFAC40335CD9C4F100BF326401E46F1E9EA316294844A0EA4B3022A2D6FB7D6D1ACB1301AA4802D47AEBA6AE7ECD15DE69995556D4D35252A1E7AB5F2A4B01A6DC713C52012B294A929DC594403060E1862F389387491DE253BD406141B8A8D39DA1E4B06A542B4BFE2C0DADE9170E89EC0F36CD4359BEB157D5E96CE21B252494EF10D906E2D713F7628D8EED580B992A44C2B58B241372E3F75A8EFE778792F800F98F08AB9D69EFDBC76068FF80E9160506459730E180976A6101482810140AD24C9BCC751B462A1986698EC54D96662662D21D9292A003E8598173BDBCE23F30C414B7764177AD2FBD34FAC26A9CF5B7C2D352F29D4A859B014902DD45AC23F1B4E2532F94BC40654AEEF89AF5D28E5A97FB8BBC45A264D591C454403CF9EFCFEED588CB953474A8A87DA4C950920927840BFA83B7BB6DE313B23279666A42D21DEAED762E5C359ADF4899C3A09038B6A6FB721AEDE01A206E664FE6D59F56678F854A8309200927E7D24DBC8624274AC3E15C24A681C00DD69B695F21BCACA93C4C4DB6D9BA69FE3687E7B45505232D57E6F9A8A765292B5309256B77994F0A145423CC7A6F3881C662138C981082FC27E773C2C0D475B579B43A4E1A5862A2036FA9F37A368DBEF0C6BCCF35AD7865BD9FE9E5BC80425CAF765B027FAC77E913CF63CBD063051230C92A54E48091F33548A5A85FF008B18D4A253965060ECCE4539BFD4D1D8C3E9ECB9FAE432FEB5D48595BD25596328E22B3B9471D3AFC3130277D84E1A2FB45DD14FE9C7788018AE8967A588721F97F0D2694A49F99B60E45AF725DABB7D227FA6B4BE41A711DCE95C9425FB7F99A86CD471AAFE206A10AE199EB691888C6F69A64D2518A52E6CA49F965A54A9652F70E92FCC68F4869FA9E0A8FDC054DC17BDDFD37D61FABB4AE7B5EB69DCFB8282957C45A79B7D0070FF0051EE5A5262DFD247BA766927B6B2706152E4600AC1038B89D45BFF005281347F5EB0DE6624CD62A2F7602D7E839B7918E5BCB343E46DC9CE0668F0FB4C2E9D6140F3016AE2927A8E7EB25A623B513F18B213853281B10FAEE3847913A7584DD2F715E7AD21BC6ADC9E914E0C972B69852A05429C21D0E47D8E10EA484D85F86DBF4C2F84918AC6AC199314800B8BD1FA5E9BB585E91B8243B6B786AACD4EF541934AA120CF7083EEFF00869171CE2F8BA60B2247085CC9E8593A294000D615569FE37813C27FBB6D3DF99D8B88630F66398929A3A6AC2763C61F0049B01C6047BA67D7066392E1528044D948D7852A492B6E8AD07F26129F2EC01E2B3062C0BDEC3C284F58DECE8AD61527BD6E914B46F0E3C94C4DAFC4479741F2C44CACC70B97100AB8DA8C0120FE29CC4371289B1DBDFE37E50E88ECD757558E34D332D773757154D39E29E775CD874E91B61E1ED8E1A538EE540A87CB425F42580A78D77D633DD172C41B569FC736BD4B73854741EA36C774A0CB6A00ECE30AEBD0C0F7DFDE30D2767A8C602CA992C1D4254E1EAD40F5DFA467B956FE405FCFDEF18D3F673AA9EE33C54EFF0040AA8A747044EC14ABCF2E9F2C311DA03972BE554C98146DC0A16EA0EA5DDAD6DE3432D40396E61C13CADE31ADEECC756C1229E98EE20D5D34DBCB8E3A6DD646D7792FB6CE2A8586A97496AEE18743E71A80F6FA81F5863ACECF33DA28557B494850F0065C43C6DBCF764C6DCC5F962630DDB01378B8525811C44B8EB7B5EDE87508502035DF51A728F7531F24E3ECFC6C6F9FBBF1C1046CC1046494F14DE2304119777E7F2FD70411B5B40BCDFE5FBFDF4C1046DE04F4F99FCF0410A69C01C51E5F39FCB04288D7C214E085235B9CBDFF008608C100DC03D635E08186C3C8472013B0C1030D87908E7815D3E63F3C1030D87908D8DA157B74E63CF040C058011B3815D3E63F3C10307076B78C668044C8FDFEFF0076C6C2614B2407E2A01D2BEEDB3C359FC5C40006A6F4D05DBC2F5BB346785D385A778A21EF7E9A13A7D99A24E44B44897DE2CF152C6F4366A90DE16AC1C2AE12A4C42374F320D847A794EC6D8D6667327040A182D5616D5DC59CE9EA219CD98BC61328A4A454055A9AF8FA3D1AE212BAB65B6D550B712D21B054A2B206DBEF122DB7218CA32FC57699918696A495020F00DDDADF8262B79AAF0DD9D44CC5CDC5051038F8491FDB56A9B5361E4E2284ED37B7CCA34C5322872F79B72B569752A29503E24881C88E7D7A5F1DAFE1A7C1CC561CF7F8C42A677842871A0B5CEF414F3178F297C56F8BB88CD8FE972F9C70DDC128265AC8E236FED22ED53D4F21E74EBFED6732D575AEA33079F4B4E2D413C2EAC24024C084900F291BEF8F567677B1785C0703E193403FB6D4D4355F937DE3CEF8CED26678B2A13B17326715C9528D198EBEF6D62A879229525C2BE2454DD3C4789422E7724CDFD79C6F8EA38746130E84A1084CB54B152183BDBEBAF9B522BB89526629D63BC7724AAAE75F07EB42F7B99664398E67529552214585195A9426C62FE2DA2F61CBCED8431D9BA2524A1243B338D7C00BD9CD8BF488C561D0E78500381E0C5E963EA4DA2DCA4CA74F69BA32FD429B5E6CE241610BBF8C0B813206FEE33EFE7B99CCC466B8860925292DC4347EBD3F11A80A940949290A34BD750EEDE8FB8AB18AFF0039D4F9AD71719CD5459A3121AE05048206D6410761F9626F26CB1485238D1C5C2DA37D07DD8B6D7D54B529DCBBFF0098AD6A3306D0A78D2BDC2DA2EA59333EB26E3DF7E5E7D37098796108050EEC0066AF27B0FBEF184A52028ECCE2BE15F637DC57F9967F975538B69F05D7A4C2C15244DEE427A799F5107162C2C9320278260969B94B03CDF88DB9D7F11BF100CC1D85DDBAE95DE20D9AE6C9A3E04345556F5448A6691C454D907621326E0F38F888C482F1B85920AA64C4A5491F35871B3B16D0D05BEF0EA414AA93038A54BB0A6C74F3076898689EC7F5BEB379198662E9CBF29242D69742012DF41C5C2A88E979337E543CEBB628904C994388A9C24A6AFB59FD5857A8859425004200E26673D76FA3116F18EC9E53A6744E8869C672A6587B30E148AE79C4F7AA2B47D828EF02B809BC94113EB8A5946619C4C98B98552D0B6E1AD3CC1F4FE59152411F2B12474AECE35E7EC21CCB54B8E9534D921A1221321201E8040F2DAFD2F187527B30A92F38CD2B53394B17D2BBBC47AA5CD24A9C9074B54F4A5BA6E6230E6614892A52DE879C32DB241FE6904C82B261113CFCF98C4B610253FECAA504B515314038E6C4574FE630241511C639EF7DEBE875E5766AACD2ABBC08711F524A8C02DA7EB5C5B6E5B0787DE47BB94903849201252B53514070D7C286B6E8FCCA889291FDAC5C31A13AF5F752F1B5BA3754D97EADF729694C71250C29F5D6CEC0A100AD920F2816E5D62F1799F00A2824070EFE55EB4AD4F8C3A4100304D5B7BFB7261D6974C67999B61DC932D4E9BCBC5D79DAD48A979C4F350A273F9A9BC8E1099FC2B589CD0AE67019C78D40F0B3905AB734AB0D6B7D62465CE64BB0005FC6CFA9DE9D00892E4FA1320749152E556A7CDC91DD553A8A8A1692B06F2D2C06A395C006E7D21A662679F9C4C082788F0F10268FA82F56AB55F90A35C5CD247CA4B52A2D714B7B689F2321ACC9A9C9CE730A6CA68801C148C32C3EE2D16F0778C8E3498804933798C3246266E20A97294B98A059414E90347A96363E50C8CC58001554BF51E2E6EDD3C6191FCC743658A2FAF2071E7D5766B5558F2FBE527ED1EE1455C107900266061412316B981427F0CBB997C03415F17A6BE75867366926A493B1A37D6BE5D06ADAE76859DD52CD2E474EE32C1F0A51F538001DA5C53408B79F9CE1C7E8A42D7C5318AE80FCC2E07FC41EB7DED0D56B58D68795AD478C469BD61A865EA97954284DCB86A12B94A8CCF76560A607288EBC861F4A380C229A64A0A245B878812D6259BEFB5A149014A075B6B56D287EBF57785AD681A3A24F7B996A843AB172C7D5D33E63882C9E5D27A635FD58529A5E5E9087A2DC55F56E17047DC690B306BD7663F58D4F37A3E9212FE567315A6036EA5F71A8237242779E876BF5BE674DC4BBC8986504B12909041A6ED46B0F3E990A2976D7F98DADEA6CA6800FE1F9421881E12A577845EFF6C198C20BC562D48E05AE62C30B122BEAD56661F88C0252EC5ADB69E11B5DED033152404229DB4806006184904ED278413EFDADCF19C26055885BB4D26E5E62C8A6C0F8EF734A46C662CB39B72F7688C663ABF50D5CF7550100FF006F0276EB045C0E87160C3652400E8A0DEA7CEFCADAD76844A1C92F53CBD2F11A39FE76C294AABA97561CFB1C2E28011B93C26FE73EEC4B48CA9142A969F14026FD2C7E96178C701B7153DB307AC267351D6F279E33BAB8D667DE5437F8FBB133232E9691492936B20680727209F08CF07FDC7FC5B5EBE7E6DD51A96BC1003EFA45FECBAE0DEF78541D8753E98CE232993359E4A054D4A053500B03BD396D0DE70502DC47A837B6A0BFAEDA426FF1357EDF58A983FF00EB391FFF00DE18AB2295A4A4D1EC903EC5E1100837BB6F7D353E821C6875A673421C55357A9A0A8E34BC03DC7D000E93C31B1E1DFDD76537B3C95824CBE1356091C3BECC096F5F187D2DC3B726A3FBFAD63DF2C7C938FB371B1B04CC09DBF1C1046D83D0FC0E08214D3A24AA645872C1042AEEFCFE5FAE08233420099501EBFEFF00BB608236708FEF1F2FCF04119A4013041DBF1F3C10A4BD7C3EF19608523058262013BFE18208D707A1F81C1046E6904CCDB6DC608236F77E7F2FD70411B9A6F7B13B6C0FE1FBBE0823670A7A7CCFE782063B462B4C0040317F4E5CF12783C3226254A590E03B1D99CF4FBEF1B15A1287203D6A5B7E77E5E20F2D720EC715ACD7309D2667732C1370C1EA3766353CADBECC82D7C454B244B7724D9AE69AB72F1A3430E7B9CB792532B3075F69BA7610A53C95BA8471003601441277DA7A461FF66BB298EED06253C4898CA5025D24DC87D85B67B58C577B53DB7CAB20C24C509F2FBCE134E201884F22EDCEEDE31D13ED87DA357982DFCA74D3DC05054DAD4DAE4133133B6F3CCF3DB6C7B47E1C7C2C465E9933A7CB0AA24974D281ECDD5B6F28F10F6FBE2F62F37C54CC34998A12F8949052A2C41A587837956E7A559EEA3ACAF792F56BCE3B56A52D49F1120124F99178DBEF818F5065B94C8C3CB0992896942000484A68E3C398AFD8C70DCD312A528CF99338D4BA91B390F7353CB7F186A6AAA9EA15C35C897366C4493681B0FD70AE33BBC2A7E42900BD38478DF9FBDA253882A62E41A3EADCDC8736DFF1129C934557672B5D5BEB0CE5F49C2A6C3D08E34AA09E1E382A8E71276C52F1D9BA04D1292BF9A61200487A8A55AC5FA5BA43D94492EC40D79FDA9A743D224798EA7CB74ED31A1CB5082F2014A9420C9D89BFCAF78E57C272F018AC5BAC9514962915A0EAEEC40D7587899695330E44F9F9D5F97845319CEA4556540AA75D5F7CC9596D209892798109DA3E4479DBF22ECED38E6A6FA9FE7CBAF9C32C64A0804B8A55F7045075DFAF3222199A6A4AECCC776FA825B48804285E0C72BFEFAE2DB2B289723F6A40DEC29EC57C623A2135D9A06F853DF453890F80A92676100C9B9E585D4A124306A74FBF88A6D56104194E99CE75555213A6A996BA752A1E75C050009BDD71B78B9D8FA623F179BCBC3A0AA6CC609D4338D2C1DFEF4BC0C5DB972F4F0EAFA6AFD83D3DD96699D28DA731CE386B33480B534A0A506D62E76E24804FEED8E6FDA1CEF1989983F4A261924B05071C41C034D81E84D2052CCAB1A9049E5F987FCE353D45731F51CBD69CBD840E1086C253316004705F6DFAF5DE4B26C14B992C623128E298402AE22FA9D0F3E8EC291A4B9CB5900A80E47ADDEFABBF5D6B1057DAAD4142DD54C932E158973E26F1D3D39E2E127F4E10AEE40240B04D88FCF94498410905B47B83F48E5450F2785082A7369402A9923A0373F0BFBF090C5094B69DF225E8E740357341BDBA438952C077B6A3917B03F7685997E83CCB3B2B742D6865882E305B23BD0AD8070C14111CB103DA1CDB0D2912CC85A4294E15C2DE16D0DFA878526619203A6E0BD7C373FCDA2C3C9B485365E90DA1B144BB0571A7EB7C645CDD5C404F381CF7B038A87FACAA624852DC0DEFE8DCF4A8686531205856E096F13A0B023A72894B191A288AAA29D4CE5F605ECC9D4B6E848022452AFC37E612075386989C699E82953AC2AC904A49634750723EF6A3420B5F097E26167BB72A36BB7ABBC20ADCF322A074394F5DFC57334EF56DB2A65A4A87FF00D327F967680784C917C212D6A5A12E8EED350A415711FF00C9891E6618AF1252A3F3120D8F3E81F5BBD8D7AB4BFA8B5B67A453E4C94D2251E1A851A569B35A954F004A948496F807349133279E159587C3021641F92A3E6248772410E7D6DE91B4AC42E6FCA4BBD09B7986B071E7CE1C29346D406CD5EA6CC4E5CB2389414B35416664C2428813BC45B688C2E7109207E8E477CB7A86EED88717342D537F285CA080E4814EACE396AE6A368E10CE8FA55ADC34E3367198EEEA0A96D06CC5CF74652A98DA396FB61E0C3E2A709678BF4C43F12182C2B6E41BD2EE690CA6AAB51C6FB16B015BFBD21054F6888649A4A26996DAFB01B14CDF108E5DE16C1B0E7EFC38465120A84C582B9A2A5414A0FCDB88016FCDC43798B2C00A0AD3F9F1FBDDC98FD7E7AEB890B4B8AA253A09E14ACB9F58E920186E04F4EBCED33232E4CCE10A008A5581296A8EA793F28CC87AB12051F9EE39535F2D621B54F55AD7DE2E8DC75333DF7D6942DC8844CFBA3711CF1228CAF0FC410141E8FF002B5090FE7CE1CC694661510A4D354164A7EDA548E38E6002ADBA6F187A32492082A4A549558BD4EFF7ABDC068C804D8437D4E635C8E22B7839E7C294CFC36FDF538712F21C22D8AC01BFCA0D43B506DEAD625A33C2ADBD47E79C34AEB1FA8214E2CB6048179E299F75FA1F5DF1212B27C361FF00E90E27B800A6A7ADEA6FE42321075207AC6835A968FF00F33B5A26D7F203F7BE1F232F4B8694F4FE6FAE8EF4D2F19EEF9FA7F31A9CCE5B48852FBCE9CF879EF73FB89C3B46014689484B3D680927AB7BDF4C141D0BF266FBC373B9E20589BF9188F4117F3C3A4E015A3807C7E8FF00568D82030715D6BF83086A73C64F0F2DF73F98E71F2F3C64E14CA7E21C43A1F03A73F386F3D0281BA1FA7DE879C26FE36D7EFF00DB1B230E85D801BD0D3D457942299628D53F4E7B7D7CE1155E6297D4DAC37C696E4ABC653131161138728C14BAA480E450B061A6E77DF485D2909622E35FE0BED1F4AFDDF9FCBF5C7C3D8FB350A69D20154C1B6E47CB0410AA0741F018208E426761EB10304119702BA7CC7E78208D2EA488991EFF00C8FAE0823540F3F89FCF0411B5A493C51276DCFAF53821497AF87DE37702BA7CC7E78214850C8202A45E7F7F760823760823058262394E08230E0574F98FCF0410AE99E2C25C4981C7B6C76F7E08238642DC778B913E7F18FDDB98112100D0C10E75CE328A64B40A42DC163D001279FE9F3185A54C9C169972D2A5719E12DA3F423476F6D198E988920CE5CC094A0124380030D5EFB6B5DAD14F6ADED0324D134350BCC6A9B2FF000ACA47109E20091201F302637F763A9F657E1A4ECFE6CB9864F105104BA4D053537AF90DA388F6EFE2F60F29C34DC348988E209525D2AA82DF5372C36778F37FB52EDA730D5D990CBDB7DD4654A5BA16A43CA40E124DCF0907D24DBEFF0052765BE1AE1F2244B5AA4A1C00E38439FABD5BF378F11F69FB779B67D8A9AD3A6196A52BFB8904134A3B3331D5ECEF1D73AD71BA7AC2CD02D4B43A654A528A8C912492A9BDF69F21D71D6B0988952909932E58433024306601BAD3EFB456D05253C53140CCE65C83A53EF5EAD182692AEA1F6E9D8A75ADF74F85E825283CC9E569E640B61DE2330FD22490BBD4D852BA02C75F7687C526629557297B6EE6FF005DE2CBC9B4AE5F92B69AFD46B4BEEA405A1361C24DC02127D224408E4315AC5E613F1A0A6529552012D41E7B8EBADE13485020B11EF5DBDEB0DFAC7560AF6A8E9A99D0D52520743286886C90409E32D9055B082A07CBCF6CB3294AA719AA492B9853DE12E6DCAAD7D186FBC3C97354E012C2BA7E3715F6D14B66B9A13C5078B7B9373E649FDF3C752CB72D421090120160E48B5B97D34D9A1F4BC400003403526AF567FB115F5881E659C2DB5A5B0986AA09E35822101331F7CF9F438B1A244A928E3550A050333E9CBDF3108E366A6600010790343671A9FB38A188DF05754D4A58CB1876B3BD304A38A1324749EBD45BCEF88FC663A5A41248480EE5DBF0FF009ABBD21845CBA5BB17A6AA6C66BA81EE1202568A55133782A100824F3BA76F953331CE809C9952419855C4E412C9E6EF5EAFF48D92970E4B6DEF6FE768B6E9DDA5C9694D164686E97812132128055C22665404FC639ED0045AF0E714A0BC4BAB54A41347E94DB9BC0542A1346A3EBA1FC73F1778A5566B98A56EA89E22A27BC2A215DE003FA649023CA36DCE25F0D82C2A929EF509734402053E971CC5793426651984FAF878F2FCC46DF759AA5296E2BB87A6787C44ABDC0817BC5AE2679E159981E075CA514A459AA29BD75236D2309C32829CDC10C351E2FCF67B33C6DCBB21D4BA96A053E5D42EAE92988151532521295DD2785513D6C77107081CEF0D97527A93C6A1F28A39005B97E4F9484B2A0068C0737A1B036BEDD18068BDF4FF0066F4D94B287AB2A43EF708516D4DFD9205E4FBBE1EFC513B41DAC18A131121010CE1252A724D6CD6D2947E7787489812CF524073B7DBF1CA251515D4B9636942DF699660CD3252826A026D0A5A6EDC4089B99E56C51309371B8A5CC54D52C8D0173AD3F716F768C4EC40018AC33073E0EEC1EA3F976888661ACBBC7052E4B953944FA8F087D3C5549715D7EC94A77F75F78C49CB90B47EF5D4E85874B9F2A93EB0C66E252A040A91A35B7FA56BE4EF0997A775167686DDCFF34148C0054C84F04BC93B8521B50298062E01331C8E1DC941E258BA92DC418B07B56C4977FE61929455521817A7B25D8C6E4651A5F20477C809ABAB45C28A8F89436B1240F4B6DEEC3B4380AE24B59CDC1F2BEAEFB97B3C335CB2493663CCDECCFB7DEB0CB5FDA03ABE063BB4502192A0D77684A8B808DC94266D1B9263961C61A5212A2AE1AAD892A2FC4CE6C6829D1FC61690952487B569E0FF007F3A4476AB3CCC3300422A1E7A6E3C0A2083E57B795A399E92885A1218048E6004BFA0F6E6B0E88704421629B397B8BB969E215B80D2A075984FC663A6D8593894A58A949049A02A0391D9EF5DA1A2C5880799F76A7BD96A348EA7ADF137401C0AFEF521A37BFF005011F1E9B6379998C8921D4B0280923E61E2078D89F48414973415EB7E5D7C9F4736507B35D66E82AFA8B4C81713594EAE29F22AF0FA19F99C309BDA495288EE54B26AEE950D6A2A069EE90ACA414F13EE05F6FC74DE13AFB32D6A1265A6B9C4D5306DCFFACFC3D631B48ED6A9FE67045CF09FB06DFF008061686DA9ECCB5E0134CC30491E33F58A69B6DBA89E5BCF5E789893DB293F2F7814787604B1A5E9F53CDE320136D39C42B37D05DA432543F8621F1D5350C73DAC93CFD7A62730BDADC3AFF6A08D6C4539B80EFAF93504655C563FE6F5880E69956B1C9C4E71953F4C854F741A9A82E017325A49E083D627979CF60FB4322791C4532CBDCA833317E47CB58524A544579B167EBB72FAF38ADB33D5154DB8A61541534E663BD5B6EA408E67893005A7A40C4F49CC654C03854950701C11A16D0DE90B777CFD3DFDE3450EA4ABA54BCAE36EB52EC120B886D54D133209255363FBB4ACA5A2714926DA3DFAF21A8F1A46021E8EC45FECDD6BE4CD0DF53AA5A2E052B304A164925908E28B1B4881899932524710A00185CBEFFCEAF19EEF9FA7BF6758E06A34BD1C46020595F678A7CA6DF87C2313F00A981D20A8867715F0D3A8FC468A92E0907E63EFDB8F0DF7379EB53056224733CEDCE2DB73C248CB6705070BA5C70B7DEDD5B4F04BBB0356D5ED5DFF00970DCE36399D34AE14858F71BF5BDFA75DFD2D87C9C14C4B7C849E63D2DFC7D6125A824B5CF2000F478FAA9EEFCFE5FAE3E0C89885332856DA7D63ECDF02B6F51F98C80099922FD6DB7BFCF1BC60822E232C6C124D40F51188DCD0078A481B6FBF3C1C0A360FE519009B08DBC03FB87EFDF80A14039040E719E056DEA3F3182DB248893EEFD7CB1AC60822E230EE8F9FFD27F3C1188CD08899313D446DEA7CF046E8203BEB1B3801D953EEFD704280836AC66941131267CB1A95A45D43CE36E151D0FD3EB19411B823DD8C7788FF00908D84B59B249E958CDB4154F84988D813F763066CB01CAC010195305D0A1D4465C09E9F7FE784FF005521DBBC0EEDEF9467B998CFC26CF63F86F568DCCD1FD60D85926E7D6379F38C2C852564041E27DBDFBB5DA135BA012A0C05CB8A7BA7B11CD77065ECA96A504800995111600EE4C7EA4FBE42565B8C9DFF004E4A95AD219AF1F8496FC7392967B91A7F98EB476B7DB153E92A0094D436AAA7D2E86381D4A8A0A78B7292637B131F9F67F873F0FE766EAEF71521480820FCC9A1AF303AEBBD75F377C6BF8943B392D387C24CE3EFB8904A14CD60F404DD8F851A3CD6D53DA1675ADEBEA55985538A602D5C03BCB419E40C72B4F9EF79F54F66F274E46512D12010800060D6D682BEF48F1AE6ABC4F6856AC54CC4948592B292490C4BB5FD05EF15AF7DC4AA8654B01282384A884CC9E52798F2F8F3EA32387152871A780B3049D5FE9A73BC56A64D97820650471173F37A3D8D76D1C561E726D3AFE78529A00A2A4AA54E14F840DCF88C8137BCED26D338AF669265E05E677A01A9617BD07F97F1686D2A5CC9F30289294B82CFA03BD2EFA8AD4B88B5159964FA6281140F34DBB5E5252B7400A2D91CC403FBB7962030866E6B88A4D644BB23877B5F7D5BCE2566995C094801C0152CFF004D856DB6F150EA1CF2BDE5AD4DBCA758519093E1E117D81DBE5CEC062E383C9815255C3517A7959BF3EB0C968490F46FAECDFC6915D3F52B6CAD6A7788AFFA788908F7DFCFA4F4C5AF0F9726500B4A78599C357D456BD4D4EB0C660208AD9EBE5B7BBC44731AE5A8A9216093602428C911D66E64587CF12273097857723E5624BB6B66D7EFD61A4C9F32A00B8A372BD6FE2F4872D2DA2B36D60BA8525B5B34148506A9C790503856411C05613C5707EC123699C43E65DA790E995DE00A502129152E342D41E3D442B875A9555BB356BEDF4E757768BD727674AE85A72CE5F4E8AEADE185A8A54A8541132A0A1FBE5B629F9862B158E70A52A54B770805F883BBD08EAD57B43C0A480183B863EEB42FEDA1AAB353FD72A3BFEF14C3927829E0A5279401013B6E7CF09CA4CC4942425C02439AFAD75FC35DF5AA8EE4FAFE3DF266CADAC76B104BCA2CA87D9E19326D13C302F6F8F4BE2C384402DC4013D767DE9716AF8B46C25AD4EC934FE3F30C14ECE735CFA29DB438E2CAA28CB692BE393E2E220787CB8FA88E785F1624A071F7C9414876240A6947AB723E0454BCC2CB493FEE029E166D8F503F3CF78BD7487640F5425ACCF57114ED8E15A10A2078409B8491D472F238A4E69DB43210BC3E0BFDD98974958B0D19CB8F5B3F8AF31284915001A33EBB7E75AD79DB5519CE41A529914997A986587070385084AD4F706D300A9245BF7BF3DC5CFC4E6B34CD993162612E0D404BF205B5FA88426AD09E24A0B00C431BB53C3A52FD1ABCAECF755672EA98D33951553384872AD4EA510956EA09700279EC76E6409C187CA4E1D499D3E695A49FDBD2DA9F01CAA223D731492CEFCA94FA78B8077D192A34C657918359AA33A554D4D6F89597776B2029024A038824279C9116E9B62C38752E6BCB918701219A7050A3EA451F66B5219E226A8872A2FF00F115FCEFF4D2353DABFEA08EE34BE5CD503401497DC08A852845C80EA54A13C883387C32844DFF00F1534CF208524A7E4E12EE47CACFB3F2A43718850601241D5C3BF990D406B4B7288EAEBAB6B5C52FBAA87AB1E3FCC7077894715F8785221099F281D79E1DAA4CA4242414A5800EE1CB6875A59FAD21DCB3C572DD747DFC79D39011CB1A3B51D72C3B54E7D5E9946656E249E1DF6E20498FF6DF0D57325214521D6694009F221F7143B3C394CA04124D34A375D625D43A6345E5A92739A94D7D42C0E0400A4F7253F6AE92649FF6C349C9C62D40CB965080CCA05DC11701891EEF48DD4254A624B93BFDAB6DDC79C66EE6DA53290A19765887B876F11B40B5940FC79EC71B0958C23F7AAB764F9DBEDAD79424A992C9141C989FC81A359B4DA1B9CED26B18F065CC3396255FF10961A7FBE036FB48053C3E5136C61596F7E52A9C998BE1FDACA2867DD8B79DA1B4C9C12A74A80045880D66D8F95A962D467A9D6F9B56821CAA0B077E06D2D5FA0E100EFD0751B0C4861F06245449240B12EAA6E5DDFC4FAD61B4C9BC4CE5B71CB414AB36F0C1539C562883F597999076716BE23D202A047291D6713123264E3D24AD212CDFD8C6B6FF0088F7717856428105B96B777A8F7F58685E6F5C3C23317C0BF35106E660150F2DBCB0F13D96929D52C030A0D7D9EB587108DDCE733490A4662FA60D812BF17FEE3F327F2772BB3126951FF88DA87E95A1DE08554FAB7356665E5BC446E77BDE64FEBBF2C3E4767F0C3FB80074E11E9E3AD057782143BDA066EC94F030CF0ABFE221D69977BC03A7789570C738009E588DCCB23932F80A10B9A03F094A9496A87B1A8F7BC3DC37100588ADC10EC2A3DB11AF8A0ABD47A5F3F6CB1A934D53BC14005B88525926F04CB4DC8F71F7E12C261B31944A70F3978643060A495DABA97676FA43A4A52E4A92EE46BC87DC37214A88AC353F62DD9DEAC4A5CD1B50AD3158D859AA696E3D509AD5ACF8002E2C25AE0DA475BF95832FCCF35CB26138E7C64B531130327BA019CF0A7F7120BB35348DF825ABFED3B56BF41AF5D39C75EB56F60BDA26960E5751D02B35A16E562A1A79B512912A2AE04952AE22DBFDE7A0655DA9CAB14B4484E27866D1D2B4292DCB89403973F50EC29A2A42C00A6A6A5C1E761AB5F4B5A28B7F5156B6EB94954C3F49514AAE1710F36B6C12491652C242A083B480778C752C85781C4820CE96554003A6A497FC579EB68C77547D2BA8F02D7B5E95B8B18D88D44A3E12E0E5042C48DAD63F95F9C62D072C94A0E809376602BE156EA2908AE592E521DAE68F6F03B721E50E14F9EB8BE2FE6131037FBE26E6F724EDE78417964A480C815059CBB74DFF00311D365AAEC4B3BEF5ADAA63EC831F9C095839AE5C94B333823C0398FB38AC4CB510CCF5F1F21D6343DBA6F11CEFCE7CFCBD7CF1212A470DDCEC1F53D2E3EFA4604CE21FB5C0BBF875DE3142547727DE6607E7FBEB87F2C0003D8D4B6DA0FE3AB460254A2A60FC8066E9F9FBDD634024102794F9FEFA7973BE10C4E255254E84710E9CABE95D3988DD0A4CB07BC152D5351E819AF5F02446DC3318C5AE851D5F6D49A563071491F2A405528C697DDCB78C641D71BFB09E2264F5836827FD8FA1C2A898482E1F4D00FA7A69082E7CCAB21C1079D79DB71B5F48DC871F7265C089882426D7F4F891F3C2A99214FC47A06D2EE7DFDA1A2B158B144C9596772029F968C0F58CDC436803EB2A352493C3C1E1088899E106645EE46C71198FC4CDC2377492B7BB75E9CFA74710BE19626907123B903FE619EFAD350DE3AC6D645393C2867879F89447DF1B7C4619CA9D8CC45449587E4EF7BBB7430F26627052407C42001B2853F9FCC294B9C0084A1A8E654E206DCE144193CEE3E7897C2E498FC5B34B5D6C58B87FAB577E750D0CE676932CC3FEEC44B2D562A039EFECD0D210D566F9753A66AEA2999817979B047FEEE53EEF38C5870DD89C74D01C2C9BBF09200AF27B74F5864AEDE64F2B8BFF009892C3750BD3737F43B558B4AB5C69ACB829F39E5236C27FE38E26D731F641F11208EA089838964FC32CC316C89689C566C02155BBD746DABAF48AF66BF15F2BC17FD39929628E42D34F00F7E5CB9C305476AFD9F38E2AA17A96910DA264909827CC71016B8B7E786B3FE10E6F2CA4AA5CE06A482953EFD6A3C7AC42FF00F7D39714F0F1A050D5C1D1FD3760ED788F7FF882D0D48E3C8A0AD6F306CD9C711C490D948812448215D2D389AC97E1C63A4CD48992D65881F32496B55989EBBF368AA673F19B0BC0AE05205C82140BE87974AF2DA3ADFDB07B4AB6F52BD4990BA12A712A49295410152362266F8F41F63FE1FC996B44CC4CAEF08E160A4B01CACCC3C79C70BED1FC68524CC12A6F0B3D44C2D63A3F414DABCBCFFCEF3FCD7397AA2B739AE71D6DC512DB4A595589364C28913E5BF28BE3D1990F67F098342448C3A50081600585EC037D9F78E19DA2ED8AFB5530AA6CCEF382D5048E757A121FA446DB63EAE3EB617DCB0B3E14195151260EE64413CA712F88561B08E1494B8B9A0B7E39379C57933A620325440E4FF9891E53A1EB33CA962B2B12B6B2C2AE25386521494FFD244907E26F8879D9F4A48299412E91400F09D79FF24E8F08A997FBAAFAFBF38B0F31CF69B49D28CB321E05B65252E2C70C8B4925464CFBE397AC28C2E23362672F8B8DFE506A05480D56B35852F405A3604A1D293F2D35F3A0714B6A08D6292CD754B85F7B825750EAAE5478BAF5902DD395C8E96DECEF6695862A993430353A3E9FE29C8B184A612E9726A4DC935BF9DEB110ADCEDD434B35EB0804184FAFA5CFBEDE5B1C5C026560EB4E11577DBEDE0D5D85352A2431F7AFB6886D353E77A82BBEAFA769DDA94A963BF6FC412B04D8F78A10809DCF5DB0D713DA0C3006A904023D8170DAE8046840343EFF00117C699ECC74FE4C84669AC1D0FD7405A3282A50E1501201750608363703F3A263B158BCCE7AA5E1507BA3FF00F7014CDD13AB9A5EAE0BDE0EE65A43962A06DBBEAED421B6D5EF589466BAAA99A63EA8CA114F428494D3D13294A14DA62FC4EA1216E4DC8E2923118325C661A72A6F0AE6AA690EAA96B58924797D291A9412C123A803D77373BF9C578BCD09A82AA263BB0A2495384A84F33E3F3F772EA7167CBF07C491DFB020390696DF61B579428896430218DCBFA0FE34FAF0FB88AE537F5B6D55552927B84B28E1851201E22D0215CB7B731E52AB460E4310B42529152549714AD1DEEE000C6E3943A97C23E635E16A351F4DFC9A2CCD23D946A4D45C35956A19665A98510E841251B11E320FC2F7C52B38ED4E1702BEEE5AF8D6E78528048A740CFCDC561F4B5A58D0067AD3DD7DEA62D166AB44F674DBC8A453559982C27EB0BE12EA82D03C3C09855CFF00A76E722D8A74FCD7139CCD69AB5CA969B24122EEE0B16AEBE70D3173C24012C877AB6E0D3968FCFE91F7B38ED0FB415919165AA4652930BA871C45284B60DC8438104C01CBE7CD354CCBB0491DE7F796763314EF42400E2FAEDD623BBC98B3FBAB7BB7ADF7B56B4B8829F24C8F272EA733AE39AE6C882BA5571A514CB1BA439250B0A33245875BC61696EB5132E5F04A1C244CA7CCFCB46D7534B426EE4B9BD4B9277AB79C32661AD2B985FD4A887F0A4A894A03480F95721240913205E636C3E3292A6E3F99BCBA37DC3460DCEBCF78D74BA7758E7A7BF790A7583E245538529E049BCF02BE7F773C615899520F095849D921CF90B426B524508735A5A9AD6D1236B22D3F91242F3CCCD1595200229D0D91067ECCB648DCC5F975C2B2E6E266B8949212A3498E4335D81A9A381BDE13EF24A48AFCF5F958DC73B56953C9A0A8D5F4F449EEF2ECB9B6985C84AC84ACAC0D89E24120C7291CF0F519799BF3622615ABFB5BE5D2AE030F5AE86D185620243A52CF76D2AE3D75E8394305767B51988216A5B73C924A449F48E47A5CFC04DE1B052E526890ECD50EFE27C06BE702B16433DCF36BFBEA74148634D3A5B2A529C528B907C4A2A889E64902797AF4BE1EA6420B02905BC00F0B7A13F66988C4296C1D9AD57EB7D3ABFD63538844C48EB78FD9F761512258B2436C403FE39D3486DDEAFF00E47D863E7FE1A113E1B000253CE0C739F3FF006E5CB0E65C941A8961B9900D76A59C6BD631DE2DCB93B54BBEFD3FC6D0DEB2DC1F10E8449FDFAE1C8C3A4DE5B1AE83F0DA535AB41C6ADFD0437D43EDB407881E2917E51B6FC8003CFD30F644874B24330D8B1A9D87D07D1A1F609D8EDA7ADF43BEF414840AAE6047119236836FC7CA77FC30E53875357C6A47A53D6EC224211BD5CD9E102204FEC4CFCFCF0B4B9452E2DB6BEF5D6086F5D6A0837F75BF7E779F4C29C0DFDCD6B0FE75B4109975295F0C19DC99B812622DD630EA54A4A920A98DC5439F571D4DE1594A29762D6FBC2571D4926C24F97972E60FAC5F0B1932DAA81AD424026BEA7CCC2BC6ADFD07E211FF0011629DE6E9DC42BFCC980B42949E0E1BC9281CC91F9E18CC934B50BB16707CE81AB4EA233C6AA9E2AF415F187D4EAED47A78368CBD62AB2E77FE221D0878047310EF11DA7CFF00185C56592F10A4AA623E641252504A087D8A4A49F41F58D84D98971C47C61AB54E97ECC7B4EA7A56338A5628338752E019836853629DD588054868210BE251FEA369EB87582999D65E5588C32A64D91218A6471F0950D7E62788F09FC757D84026FEE5313AFAB01D7F160F1D27ED53D9D759766CF2F36A243B9CE975A8B89CD18BF76DEE3F92D95AAD2522676338EB1D8EF8872B19325E127AB827A084AE52D4C52FCD4CEE7F1AC3A9984E1142E0DB571A9FB5E28C7739532D06E83892572971C7014294A4DA0A1705252AF8F3E98EF3844E17152FF51316821829297147B9A1ABF36AF230DD58628F95497357D497059BD2AC07578FB7CC7E6CC4E4005806DE9E2D43E61ED1F5CE5E196E2E583391BB3D89F01EB189415DC49E1DE01547AC6D84578800B685FC391A3FA6FA343D44934228055B7F13B356362131629B799223F3FC30DCE2175E10E2A3416F0AF41E70F654B48AA9403914E7A3FADF468DE4445EE7974FDDFE18DE562012CB6E840F1041FAFF00889191946171B59D8844A61476AED7352DE4238F3E5D712386C32710C10872A346035F27EBEA4D21A63301966041271B2CF0D7F7245B9397B338D8E91C8AC66990B5B8F32DA40995B8DA66378E2509F77CF6C58A47661738A7E457CC47ED4151F161E1E02D57A8637B5B93E59C5C58892AE1B82A4876D9EDE1BE9101CFFB54D1790717F13AFA747083C5C2F24ED7BF02AF37FC2716AC17C33C7E2D295CB9334BEBC2A1434F6C7CB4A9E33E3664181E249321D3AF120BB5F715B6AF14EE7FED67A03254A5392BADD638B2A0F82B578236FB522FD131B62F9D9DF8178CCC4A8E264A900311C697E2D2C5A9CEE5EBA472FED77C6FC1E62C9CB9694B38265A83DF97DFD228FD4FED9B50AE2FE18C84CCC70A84011623C3CB6BF3E78E9584FE9F644A62A4A69FF60150068FCBED531C8B31F8AF8E524A53316EA06CA3A740E39741B98A473AF6B2D7B9BAD28A2A97691B4157111C278E6C394DADB7588316B4E0BE0C61B0801EED0786E784333BB1D0F98BF8473ACD7E25E6CBE2E19B32AECCA50B31F37AEE29D22BECD3B5DD679E89ABD4552C71CCF0855A6DFD2A1E405B6F3C4E23E1FE1B0A18C943501748E5C9E8056FF68E73987C45CFB895C3327D4B8F995D75A0FA72885D6EA6D4C1B729D8CFAA6BDBACBBFC4B71B0D04191BAAFC57DA448B8C5D7B3BD9BCAF0C952E7C89448A25D209D41D1DBD3D1F4CABB519CE68A3DFCD9A18B3A8ABA01567FAB6950CD543459FEA47539551D6562005CBAE77CEF0113C46545511CB78E90621E67392647264AA74C44A4B876E104D4D0301ABD9BF02D12F178E58613D6FBB9A9A69E7ADFC1EE845651E87C9D1943657519854208AA70BAA708524784924A80927918B6E314BC176770D8C9CB9F2E4A65C804143A402A72C6E90430A9603D6AD71A718A4979AA73D69ADDD9BADBA45479857ADFAA5AEA1D212B55815710B93CE6DBFB8822778B8E03249320829480C050003425A8C683D691CFF34CB71B3CA8A96A2E6A2A5A9422F46DC68613AB2B26A29AAD4FA9E4492DB224F1156D10542248E5CB61CE4A7636560E5AA5B04101B4D68EE7F36342C28865597CEC1A9466125CB80797234F5BF568B0B29D2CAA85B59AEA43F56CA5B1C4DB3CCC0B4A130BFB4049239913BCD1F34C67EA94A9723894B07F68762F5FDD7B7E0C5859EB615E6DEC96F3DA156A2D76A4538C9F2C4258CB784A68DD109242478CDC0572DC993CAF7C43E1B27C54D9FC650A01452E6AC7566B060F517D235AB004BB453798E7EF309729D0B53AF2EE5464D899373236B833E57DF1D4320CB5324244C484877A803C6BEDBC6088356E6FFCD652DB6B5D4051EF42413727C26D3F7C7AED8B6AE7C8C2A56164310024380CC2BE06CF616A54C68BE11C240735706DEF5D45625394F66D9D6B071AAFA9596689052B50721129064C85149881EFF7E2979E66B2427BB0B20A8909094953D6CE079D830D2130926C29BFDA2EAA2CC720D194472AC9E95B4D6B8808ADCC4242CD3140012784A55C7C664784CFBC629333078A9F3828A95C176F9AA0D6F46D3D01B4093C229E66FAD7AD621398E64E54BAA71D756F8513FF00C4AF6E63F9009B0FB3616126D8B5E592C4800ADA8C48A0714F76829B7F17E7F7D21A1B0D3ABEF944BE1933DE10525EE2D806CC404999B79DF13B331B879728A54B44B49FECA2B81BAD5CD2DD3ABFC3A41A90E5C317E97A9BFE0BDA24F9668DD41ABDF6D748C8A4A0491DEAD4128F04DFED7018201BEE663151CE339C2489265CB98CA51674B9E2B5481CC55FAC6F31254556029B507A036BF48B9F2F6BB3AD0AC34CB884E639FAC40470B8B097936B1852609B4EC27CCC731C6CFCC674C5913D6845D2789F8C747A30E571E30CE62F841653BDE8CDE1EDF9B346BAEA9D79AB941B654727C98447086D00B676B0E056D1D7CC1DB0D30B2972D45531E6951ABFCD5D4B976B9A5295864BC5292E09DD80F0B73AFDE358C8B4D643DC3950D7F15CD5525352B795C34EB024A968E25257C53B1B401D7124A0B2B4909EE9201E2481FBDEDA79F2686C310A5062E0AAF514AFD4F23A8F04399EB6CF549FE1EAAB0BA758E0698A669B67844C0054CA4131379DE2F33824616521456996EA56AA3C43C8B815D79C1C44EA7E9F48479668CCFF0032EF6ADE7BEAB42F14A9DA975490A693CC84AD416E7A2648F961E2E722594CBBAD60F0A52924121CB5289A8D5AFD6000973E25CFE624ADD1E90D38D9552AD3A9F3148BA57C54FDDAC5F759E130768B58FBB32A5E618A0AE296707C27E5B2FBC1F6A3539E91BFCA9B1E23E829A6FB7DE19EBF5A675512CB6AFE174A652AA642438427902B48936E7CF7BC62530F952070CC5278A6007E725C3B5684B0D98FA5223F15356976376DBEC75D2911879D0BE2719A4358F2AEA79C78A003BF17028FA98FD99697842861C2C1EA001F8B1F1B56EF0C7BE531AD740DEFEDE3686D7F316E80CD5BA1D53A3C2CC4060A6C405010AF5F899DA4A4E116A50253A9AEFB528370D077C40A54EC5BEBAEDE7686D7B3C61CE20D909E704C586C2E39FC4FBB12F270A6CC6D5A1EBF5DB954C6BDF2D550695029D43F5E74FB43554E7BDDF04B89E1331E20408FDC733EB787F2B02A2E58B8B8009A7D453E958511C531C9E55347F01FE3A4352F5118BAC4F5E2E43CFE64488C394E5EA70E9BDEC006F1A783F9D6151289B1F4FE61B2B752287042C73BF103F8E1DCBC0106897A75DB73F43E1780CA22E6F6B7E7F10D4BD48A9238C473F1263F48C38460554F9091B55ABD1FEFBF28C777CFD3F9844E678AA823F98070CFF5723D0DBA4F2B03D061E49C1949FDA45C9A337AEEDF6A54BEC2A7868EEF5DB7FC5FC2C61BDCCD557858B03FD42DBDB7F4BFCF0E061AA686843DD9BC7DF287D1C3599A94092B163FDC3F138C9C2BD8795BA51ABEDE08D6BCC094AAE08DB7079DBF0E5F0C63F4AE1A85C8D09E7BF9B7DA08C98AC0BE2E2500444091B5FF00630A264A903840A5F60078D61497AF87DE335D40EA09E5E216C1DC294A26E1FA7ABF41F4DE148D6DD5B6D05171016372AB029DE62449DBF59C0708667CACCFA5EA2D572DEF9C118A3306AA41432E48120A4836B9B5E0FBC6D37B63656042032920061517661CE96621B4EB1935EA6FEFDECC183E28140AE345424C120F024A9256A1B10A0653C27CF63B6C70C3172A648E032C128550B6828366D75894C0021DC6FD36B8E7F5893E59ACEBF2D6159457329CE74FBE3BB5E5AF849EED06D679C0A54DF885E6D88DC6E5183987F592268C2E392CA44F413FB83DD23E52F6A8DDE25E5CC09F9549E24D68CD53CFFCC513DAFF00B39E47AAE81CD53D9D14525536DBAFE679536254CA9409406F8882E711927BB4AA22F02D8B0F67FB7799E0F112B2ECC662D9C264E28D133C0607880608614009ADEB1B89095974D7705CB0A6FF006E76158FAAB14EF3A0A90E82D93F6004F101D36FC7CEDBE3E20C8913A610385441A00EC29F4E56ADDE91F59F118E9125DD490DAE86FF006B73715684CA72BE9969450321B4B9FF00CC2D7C30A236238C5A04ED3B1C4F617259D3880124BB12361D5B5F3615E55BC6769B0F21C7789003B90459BF3D5A346659A64F9630AAACD6B594388054A05C48D874040B11FBDCD8B0FD92C4CF1F24B596607E53AD99C0A3B781F2AC623E206130E5415350E9E62AECDA86BEC6295D51ED01A1F23B1A969E750141084AD5E28DC120981B419117DEF8B7E49F08F1B9C1E24CB5A58D5924BBDB9BD29CDFC389FC45F8DF8BC9001815A960BBF02C96B33B37AD772CC23AC3ACFDB12B96B769321A314A83294540712E0F230527D63CCDB6C746CAFE0AE2706B42D6851622852696E83DF28E1F8CF8F19E63C1733920B82CB51E5EFF002F1D76D4BDB8EBCCE8A5751A89F7D2A2BE065A6FBBEE42B70A53647174BDF9F3BF55C93B11272F20CD9292433F12013460E1EDE94D22A38FEDD6719985033E7278BFEE56BF9E81CD2B68A8EB739CEF3A714AAE456D5F19932F3C99044EC09DE76F49BE3AA65D272EC2CB4A3B99492033F08A11C9BDD6F150C4A332C7289563660E225DD458EDFDD61D7C43426469E72A882C650FB6AFFCC52AA1C571CF4E2F2E60F98F27389ED0C8CB292C2268D025012C756615E60B786ADA42E764C5466CF334A8BBA95FC91AB6AD48548D25999108A4EEFF00F538099F45183CE07C0DF0F307DAB4628006530AD1CFE3ADC3BD0087E8CFE5CD0C58BD49241F520B06FAF36852D692CC385C76A0329EEF8424171A4C9263FB8191F1BFAE24BFD6F0CA21012A49554B851E66C3D39439978BC34EFDC94101E85BA7D768CB30D179DB9429AAA32CC0FB49EFD904806F04A81EB6DF7EB8653F38C1AD6649242CEA50A6259EE4352D4859385C0CD1C4532EA4172C585AAFADEBE2690F5A734057E64D30AA94A5AA51C4730702D2AB054A6E93E1E60F0D8F989C406639D7E854132144A9764F86DAD6CF5D21B626661301592122CECD4622F46AD6BF7A43FE7799651A5DB396641C2B70A7856EA0788280BF8A09DC9D8EF6B622E463E76366056252A59249E024B002C0D9CF514AF323546768482134E747A57933D7C1DB56A8EAF37CC8D438AA90A71970F8D2A32A50E5C24CA844990244018B1C89F44B27800601A8D6F036D6B67DE1519DCB200501E2CC5EB6228CDEE91B586691C5216F952D959114E38B8812481712AFB5F95B7C490CC0CB04710068C68767D41B6946B0BB46A71F254A07840511BBD2F5F0D398B345A5A7B4E52E5684E6D99AE19580ACB185927BB800B9379B9FEEDE3D6299DA2CC2662E60952145453FBF841ABDABAFF815863889A998414A425EB4F1DB9FDD9A10E7DA95556FA90B3FC9448480610001174A77B81FB3891C872F993129529152410E2A3CC5295637F366CE6A37BF845339AD7F7F52F9AE7434DB5FFCA5E37FB51C246F6FC76C74C9197C844B96A44B4A94C4AC1A11B5E97F2DDED9E1E1153C3B58BEA7F930C748F56E6358DD1D1503952952827BF01400E222E4C5F97CFD31179A6351824B23852402D50FF8B35AD188BCF23D03956414DFC5B3BA865C7DF095B2C2928968A4788113CED756C67C8E2818BCE711899BC082A213422B6D6D4A0D7784E669E3F68E730D45F5D49A4CB406DA48290A6BC00804DE131BC7E00E25F299299A7BC9E1C83FDD5D3636E7AF22E634249A3D36FA7979727AC4442D4C970BAE2540901C4900A957EBBF53FB8C59952E4147CA8482D7A5B96963B0D2EF1903E663CDFC9E1C28281FCCD696F2CA25F093E271415C3732480A1C36DFA1E98A8E6D8C1872A12D40B39A1ADB6A9A07BFE4C6B164657A4725CA50BCC73A790EBE8095374A91F6940494F0A099320EE3CB738A54DCD264D532D642483F315370D767AD74ADDC42D2A6A50E09620382F5A93E57EA2F0B135FAA3533E9A1D3944ACAF2E42B816F1010148062656944D81BCF48C5731B8E9C14AE07984E9FBADEFD758DD7890A003EE6ECFB83A6AD489454645A5F4C334F5598BC8CC739502A5124ABBA7073201503276DAF7C34C3E231B3A6F0AA42F84D2C751CC396D6CD7B4305A8A892FD36F2F65A19731D675B99B2BA64B6453A13C2DA5A1C32361050013E7E7D77C742C9F2CC3293C4B484294CE144DAE4B28D2BA72B690D264B54C2017A390296E6435BC341B430E41936699EBF56A710ED253D2A9257DE9528B895CDD25571B5E397BB0E33DC26070E990254D4AA64C7F9501C820589492CD5A529CC424652921418B26E5C83E1FC52FE32DFABE9BC97C41BEF2BC5C2D456A057B4C1246F7F5F8E2224E0A628B5810E4004D08A3D6E45BD2350417176BD4B8E5B7A1F4864CDF3FCCF38EE997DC2CD352F10A7436AEEC10AB10AEEF878B6047145E4811898C26532A592B4CBAADB894AF9AD66E276F2B3D636330292E406D0DB7D2E756F015A4459C71B6892577EA5444D8F9DF6E7D7DC276560410DC3660EDBB696D81D4D810635AEA7AFBAC37B99BB4CFDA583C5CCF4079DEFEEB6E67A49C9CB8948012FB966D0335FD6F0DE7A0A8063E1D2D5FB75AC30D6EA1607142C2605A1511F0FF7B79E2464654A2DC487AB501A574BB8EB4AC35EE14C75B785DEC69A5493C8443731D44D150E250E70499F7DB90F3307CB13527292C192D4AD3EA7C3F98C890A1FB8172FEC445EAF50B4A9870081D773BF336D8DFAFA5E425654A7608A167A6C18354BEE3703CF412964870D5DF476D1FDBE95860A8D42D7FCDD89FEAFBA76E7B6C6D896C3E50A2E782BD356E5CB95BA3079213C3C4E18500ABEEF4AFBEB0D2FEA36D323BDEB7E2549BED161D7E76B6245193F100F2F95A8FADC1FCF5870DCBDFB3EB0D2EEA141301C9FFEA3637E5C5F2E5EFC381939000EEC9ADDB4DED7FC6B04225E7EDC1FE61F39511CFC893F324F3C3A464FC207FB6FE14B73A7BA410DEFE7CD9E11DE1E67ED91F71FDF9F25464C546881E1414B682B530E246B4A7E34F7E9AA6FE3ADFF00CC57FF00E457E78DBFD157FF001FFDC7F30E23919E36777543FF00EE1FFB8631FE8CA76E1ADEE6DD5E08528CF51B1709B5A547EEE21F2F7E30AC98D886B356C2D4A182370CE9300A5C2379851EB6B138426654514E177F06F16F75F1511AF87BF585EC6728FF009849E9C5D49F3B587BAF384C601418701A9156B3D39EEEC7561A39521C539B2146EAB73BF96DBFDF8D7F46520B259AD6F6FC818215B15EDF1020A44F21CED3D7F51842661D4456D63F6D7D5F94652A29FBC2DFADA5704116BC0249F4F2B0E76F761BAF0E0A5495241705BAB52A5F958DDFC5E49C404A48258BD0687C7F8FABC6F6EA87507FBAF7B100585EC3CBDC714BC664D8CEFB8DD5DD951219E82FE03DD2A21F4BC4A0D8B6FB1B31AF8D8DADAC3FE539A54D02955B40E115D4E4162482D142A03A1683FCB5CA0C0E206390E78595270F3A48C34F40285065814571519943E60C58B067E7123271001704380C09E6075AFF0036BC7BF3AC7B66D1FA494E135ACADD6F8BF969741937E84CF29B1906048C7CAECA7B258D5A920E196F7FDAA0FE83C4F531EF1CEBB7580085706312431FEE1F9DABB1B4757B5DFB5DBF5C86A9F4FA02035DE25C5226564D9264A790E9D37B63B1767BB0AEA4AE7492C4070DFB480696FB0D2C63887693B7EC17DDCF0407019635E43AEC7C2D1D5FD45DAAEBDD64FA9A554D4B2D3AA2375253076E968F3DC6E37C763CA3B1D9722524CC4A12C3E674876E76B695BB33C70ACF3E206378C844D5A81268146A1C9F7F48853F9054370F6719829D2FC90AEFB8CB7175484ACDC83CC7E38B7E06760B23491839299A411C4C86236D3D436BCA2A0BED5CCC7A9B1897FF00885973A58973F52E29C92BB4FA36851C7519B87D699259EE9627AA78879DA6D6E9CA6E5E6F89C6D25E0B80287EF6700F88DCDFC2AF1B8CCF0F313F2E1D24E8CC2B6D35B68D76D21A1CD6BA4E81696D8CAD2667C6A755FCC0911212A16117813F09C292F2CC66255FEECDE02BA049400D5A07363E760FCD2999868892C75BEDD2BBBB6F4168459876AF96D1B455474CC36A1BC14AF6B8DC6F613313E71189C93D869F8801E729955A24B7938ABE9ECB338CC52D8CB4A9AE4077DB4AFB1CE2BDAEEDFABDB52D287596D2926490D2605A2640F88EA22F3890C37C2C389502A9856D5FDA4B750E6BE7D1E1D61B28C5672E161496620170FCEF5B6ADAF843731F685A900977326DA039A4208DB62523CBDDD799B5603E142920140528D4905045056CDE3604D77874AEC74E92FF00EE1009A51886EB42E7AB8A369100CDBB7EFACB8C0FAFAAA5B1C657C2E16529B5AE08076DC0B0F22709E61D959395A4A66A9285D8829009E8EF4E5CEF1A8ECE62921452A5280AB0734EBCFEE41BC4F3B2DD59A9FB4BCE11419526A0E56D2D3DE3A9714A6B845CCAC9E1DC1FEADE6D7C736CF0230A0A829013BB25CB1664B3B9B7DC434998799875042A694AB4049A1A316704EDFC476FABB3CFF0F50AB4FE584A2A8B694D7B9DE71C92014F0A892266C4249DEF7DAB581C1CBCCF10578850013FF4C287EDA005EEEE2DA588A40AC14C989056A25DEF527CF5A1ABECD1515467148DBCAA62A2ED72D478944AB72646E623DF318B6C8C830F2C02569E1BBF981AFD2DD2B0DCE5938170694AB1A8D2A2DA3741D23706DCAF7A8A9A991DED792AEEDB4DC2A6E66011617B8D88F3C63112F05212409C800025DC1B03ABBE9AD74E9AFE82671001449E8C697D7AD0B7A87B7F28D3993E4544732CDD4DAF36E12A452954C2AF7B4A4181B102F8A5E3F138898B230C82A92927E70E3A535EAFD378789C1AD20294B246DA8A01A5EEDE0CE22BACEB573CF1ACFADA9490084D1308F106D3B1FB13B8BDF7F8C4CF65F2D56625467A3F6915533EBA9BB336EDAB340A32A4D0CC0496A3B9BF3AFA1881566A25B74A43A92A75C308812A99816BFAC799C5C96309971212B438FED76F20CF72DCBC28A04952428541D7E9E75FADAB0F9A7BB38ADD4494E699C2D4CE5E921684AFC1C693720494A8F2E477F3931B89ED194132A5B296A042529A8B6A459F991EA2123365A4B15007626F7FC74E7168A6A72ED374668F4CD232FBA94F0B8EA8A0293D482EDCDE763E5CE0577103118F5257892A72E529721AA2EC454EA2BF58732D132601DD825F502876D0B5EFAF237AD734A8ADABA89A9AA5ADC7092E3409086AE6C9E1F09B1B91E5BE25B2AC9A432A6CD02805E8ECEE0EE079BC253A52D052160A5ECE3F9DC74BD617656DA8A85252216A71C84850429504DA660F53CFE42C9E2F1185C1F1095312549B80A17D0BBD6D6D3EA8CC065D5747ABEF6E9E9F58B032DECDFEA4A39AEA1A8029DD85B2D12018173C412411331045E0E2A38BED5AA52952788D1C392D7722E2A0FE63596D33F655B6D3C36D983562734F9837DC8A1D3F40142380BE940213CA78949BEFD794623518A4E378A6AE6710350E77E4E6DB39A6B1998B4A4F091C2545AAD5A3B6C2A3434A3DE36D1E9AA3CBCBB9B67B541E7D10B6698A8DCF310959102C208BFC31178BCB06371084E1A61E00FC6A14096A8D6AF57A7833B33C515A0029716A8D7E9F5B0A8611AEBB58E6D9B32AA1CAE91BCB291A051DF24B60A9239FD94933C3313BEF899C064986C214CC9FFEE2B73AEF434AFDED0D133575150CCE29E429D2B70FE706A4C9B32CD2B1D6689D5D63C149FAD2DC909493241415CA4DB7E13EB737B14CC56598792FDC21C0D05475000724599FD21CA160B82A1BDFEA7CAFD22CBA0A1A0D254E1DCE50876A0890810BBDCC4A245AC36E700E2AD9863664E495E102920B874B87D03A41715FC720E5065A4FCC43806C41D8F4D79BD9CDA23F9CEB87AA5484D2D3A68E9FC4105011FCD02D0A80088E5C5EE1318C64985C5E2262953C2D4090DC4E48E94A5F47F178618C9B2C2992B751A000B123A7B6F07887D5E7A5C3C6F360CDCA94B13BEF1CF6E5F8DAE585C192689D589FA0B1BD6B5F0061B9933420AB84807521FF0087F17FA447EB73E652905A792557949504F0CF2127C899B49C5870997AD4C384814D2A4935FE6EEFA330D5089C43B384D8B1A3BBD1ABA9B52B101CDF5496F8A1C0627FA80B6FC8FA6E7EEB58246553385F80B51BE5D29E36BD34A42467252A62B0145831F16E5BFB3104A9D56A755FF140E136F10BEF1B917E53EEDEC6C183CB0949796F673F6A73D1FCAF0F25CB2B62490E1DD9DC54F833D2CEFB445EBB51B92A3DF0B72E31CFD081F9E2625654A2CD2AA6D4361BBDACCCEDCAD0B19029F35AEFA74888665A91C2A402EDAE6CB11F7824F3E7EFC4BE1F2B98C0196CC2B4D99F7F4F38D44820B3B0F7CDC9F088BD5EA35AB77A081FDE09336D81FDF5BDA465656A0C44B735D1A966B72F7AE5586AF102CF62DC98DCB69AE85E23D53A85DE4E026E7ED475E84CFEEF7C4DE172DBBCAA1D83FF00FB7F9AEB511B09640147275D76D74A35294B986A7F50BC2DDE4DCCF8891CED73E6791E5D70FD3966BC1E9BEEC0F3E7B178CF028E9EC7A7B1B874275039C4AF1CEDCC7CEFCF0E519726A0A1DB71F753728381434FA7E634AF3E7099EF08DCEF73E5BF2DB0E13972187C9C8D016F27F483815B7A884AACF56A375931CC2B693CFDFD3DF8C2F02948FDBC2D761A0A0A836F621442141C949D3EF1C7F1B56DC67AEF68EB311843F4D2FF00E5EBFCC1C497670FB4033C5F270DED3C604FE3F2F96373824B71105AF51F9A42810A21C0710A919DAEC7BC2473F10178E7CB9FE58D5385973094A594D46BB574D746A0FAC618BB6BE10A5ACED6A27F983FEA120499BCFEE309CECBF87E6200480C5C33BEEE2CEFB3C6E3E43F3538980F53EFAC3AB19D2A44B824EDE2DFE7E7F7CC6E19AF06548744BE2A35001EEE1F91703585C4B5A83A524F4F7EDE1F28F3852F8897072E7F2DCCDFDDF2C436324F700712784A8D396F435F2DEB1AA814FEE0DD61F98CCD500F18F5E21E5E639EC797CB117FA79AB2549415234228FD2952F52CF0977892581726C07376D46DBC3E51E653214A06C902E0FDA1E5BC193C845BD1A9C2198A0B52486771B1D76F7CE349A569524B108A574E7EC08764D428414AC137240222E041B7974EB718D664A49490A48200356B68FBBFF9E70B49C428D2DA6EED52DFCF833B43AD354ADCE249516E9AC5F7044A4FF48091E2326D6DB9CEE2B98ACA2522677A164A892A096D056F6A1E8FD686564CC55DE8343B86B54FB6DEBDD07F2A7EB966BB51E68B78995AD25D5113B9B0599BCEDB472E7E6F464597E1788CAC3A54117FF6DADD534E7FC3C6ABCDF3458FF7315354FA712ABB0725F4EB5DA1A2B750E92CA94D37474C2B1E1C414AE35A4A08D8DECA2623A8B47338778693C7300972C4B492001C352D46259EFB986ABC5E22692264C511FF00A8D5C5E95A7AC46F39ED12A92C292D25AA66384880947104C750028DFCFD2716FC176566E2D940A9054DA16ADF61B16FBC32323BD72A0E75700FD4D77B52298CD7B44A36D6A51CE9548A24F1A1495381DF20552940126E3FDAC69EC4E270252BEED5890B63FB2CC694A8FCF3786D332B54F520CB1C201B8DBA1E6CD5D62AFD41DAD65B468529354DBAB0492B2E804F9F093607CF963A3767BB2A7112D972532980705007D40AD35A08B5E579384201980A8D3A790D9DFC2B14E673DB930E3ECADB5B95350CA5D4B0594AD5DD29C0526528078A7948E56C48E65D93C1226C84F7D2E59E2A80D70A17636A72AEE6A5DE27052D2582343A01663EB5ABFDA2AD7BB48D5CB52BEAABAEA976A164A58348F2001C5207196E0083126398E78E9995765B2E19795AA6C952932C70A8CC4248201AF0F103FE1ECD19C1CB44B5FCD2D240342C0F3367B3E9D4421AB63B57CF9756E8C8D4D53381B97175CCB5208B1E12A4949EA2079F5C46644BC164B8D9DFAB216852FE43C25693C2589F95D88BF9178BB607F4C8427BB090A57EE0CCDA8AB7956ECEFAB4BBA27B48AAA734EE5336D33B92ACC1827726092E037B8DFD31D025768FB349E29AA2A134821291216C4B14D592C295F3F04F345A5212124352CA0DB55893ED891689B766DECFDDA4F6919DD26554CD2A8A868D73985621E6DF4069638941442884CA0280BE3CC1F17338929C4F7B257C1296A2C0382A721B84382CFB0B448E5C70EAC24E2A092A09BD284397D6C6F67A8AC7A7DA732DC97B11D3597E8CD2450BA9792539954777C4E3AA0429D8717C4A4DCB9B28C0F28C732C0652ACDD2AC5E632CF73874954849510FC42A48043EF5D758E17DA5CC38735484CD1598CA00528A037E571EAD0B17574798B952FF7AA6DA2106882B88A90E11FE638D47C4A0573F6CDA60784E18E132F3FA99812582154140E03D035D9BC46A6F12D9866024E1B0E65A5C902DD2A7AF3A6A6F11F6B2319957A5145C55554A5C2D494A884A64026448FB26E7CB7C587198708C1A953A67720268A26F7602BBE839C62566A66CB09EE6AD550D49AEDEB6D748BBE82874FE81A46B32013559F54B6A4788A8FD50A93DDDC2894F882B9C4103D31CA55226E231AB95326A9520AC10AE2FDCC5EC0D3437ADAD48C2E7CDE207BB2923400D1FC3A78F898ACB39CD5D6C56875E50AE9E342F8E5203B2B03864A620C6DD77C752C065B2A64AC3B04AA5AD2C4F0B31096AEB53F4BEE86231844B50E0341CEFB6D5FAC4332646679EACD1D0D2386A9A59FACD4AC12921C24A080B1C161CD24FADF1B2BB9CA933921494853948000239DDC97F6CD151527158AC424A4AC242EBE63A73FC345B796690D3D90B09AFD50A45555C05B68BC0526F109907E1D3DFCFB1737118BC4998952D48E3372AA5580772FBBBF95A2F5875265E184B27E7296A80F47D34EA35F44B9F6B2A8AE0C50D2B41BA06F8D14CB6CF006D077E2E10999B7DAB75DB13D95CBC261B8A7CC03BC980099C5524A4101817029A8BE9568AD4FC1E2A6CFE21C5C014E1BC4D34F77A9784B8E3C1F0DB6B72A9D70C70B7C52924F3299D846F3D622E5FCEC5485281484B519A81AD7F3A5045EB275CAC34B4A2704B902EC7424FE3E9BC58F90E81AF75BFE259BBA9A3CB602DE715C2A7109DE128FF88B9D8C030664E21339ED0A30F2D586904F785268976700EA0303AFF22233B438B44C9F27B9E1090A62D5A53C6F5DAEF6898399DE9FCA194D1E94A0EFDE309566DC2A52F8A409FABAD2A32488B72BE39F65AB9B8C9F34CE9C4A492482AB55C7CC4D3D3C19A1C66186C24EC24A2A9C996AE0A92D570FBD74AB0E5A339655A673BCD07D6F52D7C65EF0E26B8949417920DC774950537C361B49911B1C37CEF0CBC54F1230C851EEC8E352412002037CC28AB5DCF50042DD9CCAB2CE19AB9B8D965C5124A5F5A371120F2EA7585359A8E9B4F28E55903086A980E15D42871957532E5F73C8EDE78B4E51D9996AC27793D4AE34A5D280EEE41D9B9162348AF768A4C9938B47E9A7A540289201150FB8366A5F95223158F1CD1C52A9C3B53528238D0952F856A5ED00022D3CB7F29C3695227E0674C13414A41F9490051B525B98D2369C50B912C149058B3D74E61AA36B73A3C8B25D159916C667AA6A92C65691C69A2942145226CA285070C98DC6C79E1BCFCC4AE67712945531F404A438FF0090A1A6C74DE23BBA0012452C2F5AB3D6DEED78DF5FA8F26A40963226C36CB414145208593112A52BC44C89B9C38C3C99EB09131454A2CEE1C1F3F00F71F56137E42A2091B1777636F7D6D4101CDF55B8B90B5156FF0068CFDFB79EC36C5AF2FCB52B002E502555228CE395BF35B4305AA6EB3157BF9B0BD2FE3E1100AED4C9511C64240E28D87C36F9F4E98B7E0F2B4253C294840236AE8C6C37D0FDA23D52B1137198758528252A0540BB2AA3C3ABC42B35D4CD99977C239050006FB41FC39EE312B96646A52D4E93C2F4241E7607E9B3523A6E3F1386958194C8485F08726EEC1EFA9F0E9726BACD751B6784A5D2278A7C647A7300EC63D2D7C5CB099294948E0F9410E0A76B7BDCEF11996CF958B97380482A4A5836E41F33D0D6E62BECC73D016497491267C66E26799803A7511EFB449C0012EA803421BD34BEAF6715B452733C24E46352A4F184859A6843F56DDFAD2B10CAFCFD2A20A5E3CC471458ED3CCEF6368E932313380CB93F334B00534A8F4B8BEB16F12C0C34B2470AB87CFF00C9D1FCCB3C72AB3C041FE7122F038CFE727F1BD8DCE2764E5E0542075007833D3A8D28CD68D00510351B5BDBE86AD11DADCE92A2901C2626E556B8DB97DF389291800E494826971D3D4E9A52D0B212096D05C75B577E4F0C2FE6E9B8EF0C8907C47EFB8BD80FC30F9182096F901A12C45697723A3FD68C21CA659507B253B877360DD3D986E566817B393BF3B01BDED249F2E7F3752F08003F280C6D46E9BD3FCEA61544B4921C13BDF6E51A1CCC904005C1CC8827F318553866D007E87DFA9BC2DDD207F68FC7B6D6B081DCC900CF1C5C8E511F1BFEFDCB0C3A3500F4FF00023532050D4036603DFD3531ABF89A3FE67DDFF763612258B068D7B81FF23E5182F366D304AF6E7E667CE22206FBE37FD089E93F2920820330E7B6FAFDC08732D80EEF878B8A8E0506CFB0D2E3D04708CDDB5184ACDFA9B0F53F95C93388F3D9E0999DEA945DDD9B47D6A7C2EECD08E2BB3C427BF132AAF9C241AB01D76E6232733147085779F3B9F77CA6FCB71872BCB4CE0100708662406BD09D0FD39B5619E1A64C4FFB2A964B1E106951636DC55F42F66781ACDD04C0548039288BC5BF1EB6EB8424640308B334AD4A51735A00FA5F6B7D7589BFF4542657EA0CC0EDC412CE6AE483D3F9856C57000A8BA46DB133D7D48F5B8C6715844E29065A2E2F4B3353404BFAEB48ABE3A64D9B31294A58254D66074D28FE62B5B557B79924812B320F3511F1826E2C6E6FEF386D86C0F7482820716A2AE0396D2A3F1168C9CA12825601F946BAEE5FED7E6D0F9439A24260ACC7FEA3D6D6F758CDFD6062A1DADC02D430E65820F128A881CF561D7EAC62333A50AF754D4B56AD43F4F6D0FECE6D0532E1B40B289036FC87CC72C39C0604A7088F943B397DF4B83E15D75884CB92A5CC2555622E79EA2E7F160CCD25A4CD53F694E9D8589DBCEC418DE399EBBE19CDC2B4D989090D4F3AFABF96D58B062A48084828D9F57736FA1A75DE25F9766A92412EC8B58C1F84FE5F9E22F158321D9246DE7BEFEC0AB06A895F351343CF93EEFEEA369652D7B6A0003CC4DF7B8F744131BC7CB1018AC3109502284353DD8EC2BA8A43F961980B0B8B6EDCBA6DEA7B219EEAB6E95A5FD62B0F0806C571EBCEDF87AC1C72BC364431A383B8097A12C1ABB9603936E213329C38A0BFF817E7B34509AABB4FC8B2921C6EB5282AE3E200970A88D801E254CF48FBB13384EC54B94A0B52425AA03020D5CFA7D1ED1852284804DADA55AAFBFBD5A98CCBB5ACFF00523A6834D52D5D53CB3C083DCBA841262095291C31026E408DF7BDA70E8C0E5AC26A524A06AC2DB780E605232A94A007C8DC562EED67A7F35D233A0EC93B5CD48976AF515635A7A8442D9529DA6796F21775F842C2D25201DFDD87A3B7B9660D6654AC08C42D343721F467497A11AD76891C3144A523BC20F17200FA8FB574A3337E61D99766590A8AF54EAA566D5693E3A5E07D94A9437485A16537DA45B99B4E2532FED1E6F9DA972B2FCACC94AE9DEA48F945DD8A6BB7D22E9829B2152E8D50DC3EEE3E9F46AFF13F649A51B7579369168D414CA2A9CAE5BC5C52365869DE28F3040BE37C4762F3DC462A54EC4E2662F88BB04B04837143CEEE6C4C31CC70A99C7FDB04390CCF770EE6FD0559F68ADB3CF683CC909AC5E5E28E99B69486E998FA95328A78CF008516E7722E76BF58C5F51D91CB30180188C7198E99654B3DFCC40E24A5C538DAFCBAB5838CAB26C4CF530043B3029A9028EF5EB6FE7BE5D867B04FB587B54F665936BFD1144AABCBF35EFD65D69DA461BE14BA529E1515A4288023C33067AC63C6FF0012FF00A98EC8FC38CDE7652BC5A0622528A4CB215319AB555454784770EC87C1FCC7B4B2FBC9485814F980671E8D51FC459751F429FB6CD45452B4F65D54D31DEA4BE456529051C60AB67B98B48EBEFC5070BFD73F64BB95A573D05C3026517773AF07BA458B35FE9CF374AD053C6F6142D701D9F5ABFADE3D1DECBFE8BAEDDBB30D1D4995E4795AC6639B3406A2AB5BCC2DC694CDDA8EF16A32A25425044F4338E2BDB5FEAC7B399EE6527101626092B265B9525290A6770C0286DB1DAD133967F4E59AA3018842B8D948621AA684DDDE8F60F6D68F49EBBF649ED5F48769DA6742E7D95139CEB535634C294E324BAAA26B8EAE405148DEDC660D809938B8647FD47E418ACB674EE20512509EF439B90426C059BABBC79E7B4FFD3AE689CE25A5D65E691FB08FEE6707E9A3D445AB4BF46CFB42D49425ECA96D0A920BA0394E4348DD3052ABCA6F6F43B628B3BFA9BC9938B5CC1352895C44035B24B7ED6E46F78E8723FA6ACCD78592172D7314100D53472295FA9BB7888B7B25FA3E7B5BD1D4119564FF005DCD5D480B2B5B03855104F8C916079100C5F0AE69FD4A767333C2A513310489696484F125C9A87600383BD2D4D636C2FF004F58FC3CE32D724872CDC20B8D03D7DF9C573AB7E8FAF68259733472856DD3298A9AACDA5C615DCA699B53AD0482A9B84C7839D8CF3A8E5DF1E32C9D984A0AC50095CC4A5142CE4802CF476BB5EBAB4BE3BE044FC2E11734C83F2A492E8B53EBAF2B39B4744F2EECD7501A8CCAAB523BDDD0D3551A7714A292AFF2EF29920A428AF7411CFD71EBBECEF6E138BC04AE01C4B9B2819600DD2FC4ED4F2D3908F3F768BB1C8C04F54B5B009514970D50762E7CC7D627398E63419027EA790D334964A10972A470852884813E283636DF9623B1B8FC5E2672153D478CACFCA280026D60F436BE94D6B53728918596B52784FCAEEC36BBDCEFE1B56203579AA5F59FAD2D55255B24491799802474D8751B5B173C065F2D7850B253C5C37200D9CBF56DCEFAC51B138952311C01C241621C806A1ABF7AB6BBC2FC9B4A6739FA9C396B4A6B2F4149AD5BA9EEC2127EC96FBD00AC58CF0131BF4C54B37C48C24E1282C3AC901296502C6AE4394D09201009D00B45C30064AE4B9090403767B0E5F48B532B4767BA3592D102BB3822E9521D514B906627893BF4076F53886188C66266097DEF75243712A84A86A286E6A09B51E915DCE731FD33940248240009607951BA73E6D1853516A1D615AA7D2E2B2FCBA9552DAD5C21086D7BFF002CF0F78142C2C626D18639B63158541938792672A6063303922E2AC091D7AEF15CC3663331934959258B81A07D68D600D0FA3B89AF0698D2D4E56C5334FE6FC278F3499471C183F5720A01E5B743BC1C4365D819C95F7D3B8932D45D726A14AD5B881A35ED53A6CEF33C262B3195DDE1E72D2A01833967ADC569ADEFB88ACF33CE2B3317D6E5456283DC47EA8A49E04BE09F100DA4A528E110088E5318B4CACFE46101C3CACBC84964925D4A0DAB94B91AD7C394060FB2F9CC8529671B3B84D59D41C07A5FC8D3D5A0A5C83526A501971AEE196E097C70994820CC88B408DE60C1F39FC267B83C220CE501C4A0590FA9B86D0BEE2FA343B3956324CD42E6CE5AD94092A2FAD6E59B975E5135A77B2BD254EDB3488455E6CD24F79C5B2957224AA5361F740E78AFE27319B9CCE99C492251344F0B1AE8EDCAE0DFAD2CE71495C9972825949001377207F1B7E62079FEADACCD5E2ED5552997D3B5189088B08E2042222E3A89C39C1654785294228F43725DCDEEE1FEB5308124B925CF3E7B69CE20799EA4A5612820043EA90FA7886FC8CDC13CB9F9EF8B7E03252A524A935A55BC0D5C3FF30D4827881AD68F773FCF8DEF15FE6DAB1A1C44293BC0F101B9F2B8FC63D062F797E48470B259AF4FAD74F65A1232DC07152FD1BAB50DFCAF48AD33DD521CEEC36EA418513E21279D8137B6F63E6631273302A9588C3A384B2D55A74BB35C1D3A8112D9765C898854D203A6ACDB68F6F0B6A62B2CD753B8B2A0974285C1215BC7483CBE5E7B63A461B2F9186972D53120384DC35C36ACF43CBAD0C46666B9B3C2D087570529CAD61BF3FBC40EB351BA54415CC722BDA3AF3FDFA9167C365F2972C2D0010402384392FD1F573F8A46BD9533533D52D692C540317B3DAB7BB50DF42C222798EA074951EF02A761C516DF91DF636E9B6109582519CB41140450587B6FF348B567995210A93338402AAD03EDA003DDD8C44DFCF5D244AF7079DA7EE9371FB8C5AB0780EE9344B95004783BBD0BEF7109AE4714B4252C03063C837D3D5A186B33C74AACA2520112153EE1D27D2F7E5B4ACBC1AADC229C8F4D05858EF51D124E1406E2A91AF95181E5E3CA19979BB8A90A5445C5FC8F9C74E62DD36C3C460CA4B101EF4FAB51A95DFAD4C3A97877341437A7F3EB0DF519BAA6CB85007FAB7B7AC7422FD075C3B4614901869F96D7DEFAC3A12000346BDF573BF88AFD2A959CD5C5154ACC0E40FE33E44EE4018752F0459CD01F60D6BE1D616461F4097D6B46E752F4FBD0462E664AFEE5DA62F1F8DFDDBE161826B26D46625C697FA53D046E70E59CA03757F1BD3C5A123B9829444A95F133CF19FD116A20F93FD49BFA368F5C770FFD8EDE2DEB1A85728FF52EDB9981F3FCF18FD1285D247FFA47DC08C19005E581D7FCC62AAA539CC9888337F7F23B7C2FCE709CCC44BC1944A586E270E457F1AB75A68D0BCB4265A492900914047A83A50EE2F7BC02ACA08014491B9076E77106F1D63EFC48A1099C90A0C41A8E6799A6E2FAE9681299D354000A52491462CDD756F61E35BB982D447888BC448BF49DB9F90DF0D1139026141961206B7048FA0D776F387F3B2E912A57794E221D98120F9BD6DB73856C3EA4A544ABC46F79F8F9EF617116E9853152D465ABBB62520B10D40472F7AC442FBC532524948705B67EB407939FB70ACD5482471F0DC820AA0D89E46E3DFF007401179361A64C9738CD4170A277B13E54FCB40BCB810998104F139701F913B52CE2D0EACE66B21104C9DA3981B91E97F3B79E1A6608561710084FEE34DCB03777D3C29A3C3544B5E1C28005B7D00DBC2961E20830EAD666E20825563E640B4F537F873BCE1BE232F4E3D09F95DAACCF5FAE9CFD68C710833ECE6C4DCBF81A79EDD19EA97355909E254CF98DE663CFD26DF18D3F41DC4B292914140DBD35D687CFC94C1604A5567259CF2AB1A8B575A8DDA2434D9A2B652FED6C26F6EB11163B5BE2710EBC110B52B86A76A86B0B1B736DC6B594C4C970070B90CD5FBB816160695A0897E599A2E5202FA589DFE307F1C4662B04A20921CB5473D77E85F9814868249492FF002BB102FEB6F7B3458393E64A58582AB2787FAC1FBFDF7E5CE3158C661BFEC2F5F99ADE15D7A575AC2A896439BD9852AC4BEB1AA95BED3BB4FABEEA8D87E8E8DC5417950070C6F0A026C3CEF3BE2898C9F86CAD049280946819C54B52EFF61E6A892AA0B3EDA791A7E62C7A0EC034D64094661DA0E6C9AD7C80E53305C20A08BAC10DAC83E844748B6206676B26E2499584415D6ABAA7836A1BBDAFD79EE24F0A5492C4534AD399AD1ADFE21C337D75A5B4C512E8B48B5474CA690529714CB6A5981B853A8E29F7CDC1C3CC364F8DCDC714E0B592494B3A58DAC3E9D7A46BC0EE52E0747B5ABA30D472B475AF51F6C59AA96F2330A9714B54FD58A1E5251CC2A1283C207AF96F8BFE43D84537793A4F11A28F121CD37D69D4EDD59CFC3CF5AD250E438AFA5B93781A36FD6DD55AFABAB5E73EB4D2DF4A8F857DE1B0246F17239C4F43EBDA7B23904AC2A4A512932CBFEE2069C8B52F5163CAD6DCA708B0904A8956A2BA695A3F5A54ED15C6639A3CD394D58BCD3B84A43850C4779F68006402608F39BF96D7D3819331425094028302A34E27346068D7A5A2DB86C38580172DC9E16511FB18EC68417F30D488857EA6CB154F507EB1F58AC514F842549248513204401CE7D7A62A7DBDECC77F92E289C40C30EE54CAE2BFCA6A5886F16F48EB9D92C9F0D3D72C280D2AC391A5F60DA72B47E80DF413E62DE61F47FF0064E92D04BED8CEBBD709971415992C2428993610624F4B5B1F9B9FEA872F9B967C4CCF659C519E81353C0B27E5A26C1C90EFE7A47B93E15E5F87C160125084A8D2C91CF46DB773473B47B3A0212121490BDE2C3CBCA4F203D27738F33489C661583352E08A3B372BFB6DE3A6E63DD95A099009E497722CF46DADBEF53AEB94534C5688111E1005EF1BF972B73C45E284C9988969188FEE70CDB8D8DFCAB611218432C4951320370A87084835E122AC3CDED48F25BDAB2B6BBFFC5E7B3204B24203FA9803C3B4D322796F020FC71DE3B31842BC927A913C02657CC2F50926B6E82D51CABC1FB50A9433843E0C319AE0B3595436D77FABC7AB54E7868284A129054C3455E1927C099E53F198F2DF1C2F379B8C958F98254C51489847083407888D7DDC476BC8F0D859D97CA54C9284932D2C0A43DB524736AEBBC2E14EC8325092B804D85CC5BC85B903EE8C4A499D3D5201571061B9A96F0D796BA188E9D81C01C67089681534606CE76DCFE221FAF1B791A6B3BA86929E16B26CD14E3600F19144F70DE0C41BC5C6263229AF8AC3A66A8F12B1128A0D411FEE0241B1F173F730DDB6C1E1B0F934F9D2A5241125668904512696DDFC0C7C74EAAD78F54E7BA8E85D2AA7E0CE730484892920573C36063D3A5B9463EB17C2DC189F9560F8940FFB32D9D8FF006063BFDC9A88F8FF00F15FB55FA4CE3112C0349CB000A37CDEEDE1486BA4CA737D595F4F4F44DB8780F0F72A96D3565C8BF784009E1113E2C745CE30586C1CA56257313FED8E23C243F9024B1D5A9CC473BC1E74BCD148929155B301FF00736BF6E717552765234BD3B75F9DE4B505D653C6DB050EAD92A5899FAD2525B3C8DCF5F7F3F5FC43C221472F958D4495717013C40A85588E17DAACC0EB68B3CFEC362E64838B3216470F1F10496B3D4FD47942456619FE7B52D653434DF51A7A7E24B25A42528602A64ADC484A5E9E8A51E1B6D189B09C0FE8E6637BD0B9B39214B593C5C647ED29492787C39C73A9D8D9F84C5FE94B8659480EC4176F176B7D3495E4DA0E93295A733CE72F7350D7892EA69D2E28B4A3211C4194AC1DC6F698B6397E6FDAC95809CA9499E996A0AB93A38DF96B70E6F17DC0F62B159EE1FBD44952F892FF00B5EFD0381C9FC18D63BAA6BB33A52F36285DCB929FF84C10A6D6DA0C9F1029413E188E2FBB1D0BB199A65F9C4BE35AE59596FDC52A0A7A30AD35A6B15ECCFB233F20528CF94521C9A829147D2FF626FAC41D9CE93528465C285FCC2BEB894B496CB8A51524F2080A1CC4DFE76C5833C9596E5E8562A6E224C99680E949524F16BFF2046F60748D3229189C4CDE091215398B3004DF981A0EB4A0DA27F94F6579952B4C669AB296A68D2EA92ACA2816CB8555414A1DE0052906DE1DC1EBB639D27B7B93E2272F092FB92CE933810784876241BBB72D758B566395E6D864248CBA77090C7E45077F0BD28D485FAF2B339D26C50D3D2D3D569CA5AA491DFB94AE3A1C4881214E204483D441331CF1BE1E6E0313350B463E54CE253F0256950AE84051DDAA2DA4404ECBB16A92B33B08B96C29C40D05DEA01B7F9ABC52BA87508CB5483F5AFAD3AF24A9CA82384AD452083C3B02276E73B6D8EB192659271B2E5F772D20331501C54F01CBDD445352489D312F54A99A8FE1AF3F08A773CD646566403C8CF999D8833CAFE7B62F597F66CF106451C3A9835F636DD85DE1624E9E5BFBF22D5D08ABB36D53F598E2708E19BF15CF3BDC7588C5F703D9E4CB0974D5AA1AB50CFD4302F4D61CA5254453AB69D3D748AF735D4083C52E1EB1C4479723BDBA7E0459F0B94A5000096AD9AAF46A9F51E5A0859325C907A3EAFC86BA7BBC12B73F68B88594778A01690F178A031C40832926153CB7239DB1B4CCA0CCC5E1D610084A9DAE28DB126BF8D5A27F0004AC1CF0402AE1B9069422C76A5BC225DD957613DAE76E4C6A66BB23D3CEEA9AFD32AA75D586AA50CF748AC2A578B8C904700306F611BE28DF1A7E20657D8691949C7CF460A6630284A429871776520B10D5F017D5A935F0FF00B213BB4D371E65CA54D12880CC4E86DE5A7A5E2A0ED234A6A9ECCF5256E92D6B96AB28D4D96142731A353E1D5214E242D01412400384F2DCC1BC63A07C21ED3E1BB5F942F15879A99C829470A8317770C0FA59C6ADAE734ECA2F20CC528992CCB06654314D9B5F3E5A456157992493E2DC5AFF0018F5F2F3DA71D6F0D94A44D9930A5C1219EB6B7AD6A5B5BBC63B440A9186421AC28FC853DD7EEC6EE6095ECA262473B4F5E5D45883C84626E5609291448716E54DDFCBFC4472243CA4921E8ED5E5D1DF52417D4B59ADEAC02615D64933F21F77A83E4E9184A82534B966FB9AF56E70A230E285827A56DBD6FB3F5867A8AB4920F175D89B8163791E9704FB8CE1E4BC182430706E763CAE6E21D4BC33800077D68D47AB1B7BAC372EAC6FC4608224EDD391803D7E18708C154B80E19DCFF3434E7A43A1863F2B33694F47AB1A7836CD1ADBAC4A64F11B98DF90F79E7875FA5E160DE94A575377D7F98728C2392784BB6DCEBAD2BA6958E175A08038E7717206FBC926FEE8C6C9C3D4FCBEFC2BF6854E149B20BEAFB741BB743091CCC1488EEC933B9E5E5CCFE07CB0A8C3B8A8D742DF5F41A78C6461535E2A7D69E3CCEB78D5FC51FEB1EE18CFE993AA5FA91F983F4A8AB971D2B4B5493E8D0E1495DC6CBAF39501A5330024A67BC0B3004F2F5F7629FDA0C1A5536532C4B636B95390481A3F87DA18E230C7BD972D128CC4CC77502C11C350E357BB3E94A9A6972ADB5FD692D3A9A3701680A92A0E719598F0B64C6C48D8F2E58C62E72725C21C4E226F04A4A38895960400F724742DB30D00E83D9CC8862F0DC265712D88059F90637B30229BEC0595A6FB32D55A9F2ECCAB729CAB32ACA3C99943D5D99268AA4310E24AD04ABBBE048B45947DF0239D4AF8A7D9AC6E3D3814E3F0DDFA97C28477A80B2A70FC20A9CB78DCC2799F6233390B33132D66597247012002F5D74E86915A8CD2B5C72A51564D1AE956A69B70A78CACA1452A1C02F3298163E831D6A41972B069C54C295485238CA8AC335DC9A7F2D6D4B5C1F644CCF9420AD6A241604104E9677E4DB44F74B767FA9F57E5B579B655A7B33CD90C20BB595C9A5AA699A64B61452A24B45A5029178200FBB94E7BF18BB39946612B2EC2E370C674D982594098877E262C389DDDFC9EC4C4F0EC2E324CA066CB522500AE005069A9A8A914D6D5862A2AA4512E9DDA9571B8D2AA1B5B1B290A6CA9041024CA488BEF1E78E8786E1CEF069C62450A02D2A1FB4821CB69C874A450F39C957852A48B28906837FE6A07D840D6726ACAE4F025B24A5237B93631723DD699DF1A6580778B92AFDC0B01D1DE86956BB5DCDA2BE32C095213FB9CEDB11D79B72F0872A7AE91E9E67EEDF6B74E73D5FE2B0CE8259F930EB4F643E90F4E0061C0570D5AA6E3C5EC6E7D22434398250492A2640B93B46FBDF975FC0E20CE1DC9252C4934059BDFE68290C8A4CC253A0D2953B8AFDF9F496D06669041E2BDA21476F8EDF7EFE586389C30AD03D6AD4BFB6A168D152002771A558F377FBFDDA6995E6A94A95E3224833C47CB6BFE43CF6C55F1984624A8380E053EB4D39E90D94185410A0F4AD7A731EEB48EEFEA4D77479252AF2ED2EC314A96D250A791DD83000BF88024983B6C7CED8F2FE5F2B159ACEE2C5256A5ACFF00738034B160586A767021D9E15324103503DF58EAE6AED6A97D6971FCC5EACAD1C64B3C4B09428EF1E2298B721237E738EBBD9EEC22310D366A42258296200A825BC5A8C45EB58D84924EB7DABEFEBA0A18EBB6A8D522BD4B4BEE2E98A49809528CF99E1D86D73C84D8C476BC9BB2F84C0CB4A932D130001D4A6480DB0259DF97A429FA550A31074E7BF4D5B72F78A8736CCEB9D5B4C37DE55074A934EB6817140CC1909E2373D7CF718B94B5E53859478E74894784BA0A904D05831D0D1EBCDA2CF91E5986C413FA852659A37151DF968F4D236E4FD96F6B9A9DE42729A15AA85D23C6F06D9E14AA2E7BE00C409EA7A6D8A3665DB8C264EB599684CE0825B816C684B38483ADA8CD56117C9794E0A4CB79650A0055A8F461F5A569D69169D1FB2556B259CC3576AA6B2A091C4E5325B6EABBC9890436E1E189FEDBC8E98A663FE3263D73E5093819894F1101B88155280FCB6E76035BC45CCC74B9426489412A3C4385419C005C80CE4BFAD75A0794763DD87E9FCC5A7334A819C901417097D89213127849893B1DAE7A5A37B5BDB0CEB3DC8B1457266E18092A62144B82935A00CCCED4E82B16DECE674AC22E58528A7898026868DFC0A53CA3EE03E86DA1D2543EC5FA019D1F972B2EA39CD4477AE3A14057AE08EF0DAFD2C2DCB1F017FA8F38D9FDB8CD25E2F11DE244CFF6A802925892E412A3CB88B801C56B1EF1F837987EA700389355004A8B905C13FE45FABC7ACA84A9284C99266474B8EB279CC4FCF1E5D9397CF13261134A413B9AED7FAF5A476AC5CF4861C1C4776B0E8DAB7DEF0933104A50A0762094A60D8103AFDC0F4E738DA4E0569C54B0B98684B924D6ECD5DF61A7587B839D2CA1654001C35A5A87F9DDAEF48F33BDA9ABF2F4FB577B32B6E368EFBBDD4BC20800ABFCB372424DCC0E9CB7E98EF9D90C2CC392E604ACB2658E100D4D0DAAE7ADE388F6AB17874E71292A97FF00E630346FDC2A36F623D30A31C6CD3AA3C219660721FCA4C5B9CDBF1C7259B2509C6E256A524A8CC3C2EDFF00222DBFDFC23AEE5B342F2D9440E11DDF9B871F9F17E71B908714F49802E77E97F81DFE6061CAD52C4A60CE41A02CE1BFC7973AD6E5C9C4AB1C5452A090B2C482C2A77FF3D4888E6B2E3774AEA26511DF2F26CD12D091E22285F88E5BFC46F8DF2B9DC18FC299859A721A97216920817F5AD3AC3FED6611589C871A07EF4E1D756FFB0E9E6E7E8098F90FA6ECDA9EA7516A6CD357A90C3633BCC56D78924280AEA8200283D2279DCF4C7D2EF869DA6C5CACB30DC1296DDD203D69F2800DAAC757BC7C4BF8C792255DA1C50E2048C42C5F751D743F4D9EB0E8EE76D51D7B74FA66943CCE5EE35C4C349F155265370E04F123840B998DE77C755FF534E272EC7E2312A2B9E994BEEF8C90124A486E13436614A748AD64395230D9865E388042A6238CDC5D37D1A95D478D7DD6EC934769FED6FD96E82B337C929575AEE5B5AB7A987766A5B5529594F13E91DE8928B49079729C7CDDED676B731CABB6D394A339027E300487504B05B0205850B9661E71F47724EC46599C762A64DC22A5CF9C8C239084A5441E07A90E0171CCF311E2EEA7CFC653599E69EC969052A72EAAA969D4148EF29D21D73861C52429C2A026C48000EB18F76763710ACC7B392B309DC6168C2F15492144CB35634A31E6795447CD3EDD65389CB7B5E70AA92A42558C290188FF00F319B9F869ADE3D58FA3C3B28CA33AECE6BF5BEA2A76733467A406175C84A52834CF2DA50497A5224DADCE37B63C55F157B6389C3E73324E1714501135695B176F9A9A1F1711F48FE057C3CC366191CAC462B0E95F14A41495258074814D76AFD691D5CFA403B28CDF24ED3720A9D3540D51E4DA8BEB7F5B094B6DB4D2699A4849E22129209322201F3C760F81F9FCFCC30AA973318A54C40485A8124BA8D280DC78D7CA391FF531D8D9191F02F0B2C251F31570A40A029ABF4AD746B8887FB20F66D91D476B9A4F2FCC6859CD65756AA84A825C4A0A5A2B4F1C71A45C5A472816C4EFC699F9865D951C4A7319A014FCA975077206A473A8D2F1CD3E036024E6B9870CBC1A715C0B4F79404258D5FE53A0AD7AB5045D1EDE1DA9E96ECEBB5CEC972CA3A0A5A5CA74EBB5EAD48865B42B81B710D2E9F8D9420A956981C2666D8E19D83C266F9B23133CE266290B4A9D64A884B850DCDDDEF4A9348F58F6C256478491264FFA6C94AD80092948515001EE01BFE2D48EB97B607B5EF62DDA7685CBB28D06C37519BD2D3210E3832E76894D38037C652A718471EC762769E77EF3F073E1B6759A6638B9AAC74C9B2913905BBC2B48471925FE62D4E8ED68F3F7C431809981693804619625AC06481C6480DFDA34634DDAB68F22739D68BAB6D0E0A97EADC1DE175A4D33884B026C0391C2B1020F0CC45F79C7BFFB3D84C9F2597FA5C462E4255292848599882A5961C4384AFE562750E4C78F8767F375E3311311859AB965648012A00004EA017E474F28AAF35D4B59561468E96AAA409934EC3AF8B1DBF94857A72DA0F41D07099B767247089B99E1D0542814A46875756FD7CE26B0FD94CFA785775974F98CD6428EF7F969E3E1159E61A8AA0294D3A87699E132DBE95B2B3E5C0E2524C499F4BD862F395E2328C6B1C262E4CE701B8549376D028DDA8FE71BCFC8733C00FF00E6F0B370E752A490EDC940575D85DACF09CDF3DA8209E3299B03313E9B4CF31E91899C5FE932F94666216994801F894C186A5DC7D5B5D042984CBF1189253265296AA330249F2D0D869E31147EB2B5E6BBC3956695C82470FD5A96ADC41837975A6CA52204DD5D205A04049ED7764D13C22666D8497312AE101531018920070577EB4899576673DEED43F433D12D49AABBA5916A5386DCFF0088FA24FF00C3F34FFC4F38F69DEF288501A4A6D32426A521C5A78A9DE3F65E128248E8279EC4E3E6C7F5FBDA5C0E3335EC649C163538D4C95E278D522604865AA5900842AADB97F3B7AD7FA5DECB9948CD5799A4A030215365F0E8AA7CC0077F2EAE23C90FA4F9F799F6D1ED756B1C2555196A65238504229624204045A2605EE4E3D39FD1162A7627213278569C3A254A290B51506A93F329F9EAD63AC56BE39E5584959AA7F4265CC5198A7086705E96BD741EA1A3CFB62A6AAA96B14ECBF544D9229D972A15249E4D25667CA3F1C7BB3199FE43810462730C348EEDF8B8E621268F4AA9361E6F1C1734C9F3198A93C7849C525B80842D4EE06C08D75DA123D499CD2F78E55E5799D2B523C5534354C220EC789D6D222F3BFBCCDE1307F11BB1588C51C3CBCF708B9A5410940992C9772187CFE6DE10F53D97CDD3290AFD0CF08E176521428C1B4766360073B4332EA9D75410D256B52E7850D852D4A22660264FC26224C62ED3331CBF0D253899B88968C3A805A6628865248705C9666E7E17847FD1F1B2D410AC3AD2A51FDBC25DDF52DE97F186EAA5D43062A1B758528F843C85B73D63BC026046D244EF8532ACF327CD57DDE5F8C953D4925C2169241ABBB13F4B36D0FD792E370C90A9D8698806A92524537A86DAAFBD748481C71E3C0CA5C79667C2DA14B51F720127A9306D7EB896C663307974B13719391211565AC8F17A8F74D61F61320CCF1C954CC361664D4A3F7292951677BB258D053ED78D2E9A964F0B8CBAD2B925D6D4857C160131CEC7E186D97E7D93666B28C163E4CF502C52852491D589FA427FE9D8996A32D72D499828A0526EE69B0F7CE13A5558F71772D3EEF0DD61A69C584FFEAE049299E40C4F2C3AC666795E585031B8A9520ACB242D690F6B3900D4EC5EB5348772F25C74D415A30D316848752824F08BD7F6BB53F98D68A9712EF74A4385E5FD96D2DAD4E123786E0A8FB87CB0D319DA3C87052933B139848932D41C294B400433EFEDE12939662F1333BA91216A5A4F094A52A517766A5AADD7CA1CCD2E6E96FBE5E519AA59DFBD396D586E3AF7859E1F3DF11586EDD76471733BAC3E75849B3096094CD412EEDA178959FD8FCFF0D2FBD9D97CF972D9F8952D6CCCEF61A08D2DD653394D52D5532424800B8A25B2D284C4A6CAB9226622DB8B61CE6B81C3E3A4A71D22705F7693351C350A08054E5A961476DB788FC160CAB12996B4578825448B0763D3A781E7ED87D1C5F46D7651ED01A2D1DAD76D5AE32BCAF4AD3B89A84D1D656314EA7514EF10524FD65A7374581078B90BC1F9A5FD527F5419DE4017D9AC9B289F8A9C53364A972F8C04708677082F67BBD3C63D37F0FBB2194A9289D331929165709625CB96297D6DD23E8A352763BECDDA0BD8D7B435762D94652FE4C9C86A1A7B3A453B6F2AA1746D3EDA16DBCF214A212E20DDB70C8E626FF363B07DBCED3E63F12726CC733C5E310538A9B351853366A59D5C452A4F1071703886CC184764CCBB37835E5AB972F08853240337841715AD459B5F5BC7CE37D1D3EC0BD9C7B4E506AAED5FB5CED2B2BC9F4A6439EE60E1A2AE14F4A5D6D19A54A3BB014FB4E2802D40213B444E3E907C52FEABFB4DD9AECAE5D91E4DD9EC4E3F159AE0E64B13E5A9694CBEE258E251504101C56A43E95B50324EC4E469C619B89C6C99650B1FEDAB841249B00F4AF237D9E3E9B321F67CF66FD2BEC9FAAEAFB23C9F24CE3237B4D66ED8CE986987455B941495282B4B8A42D40A5D41921773D6063E6164DF157B5DDA0F899819B9862317215FEA282252D7308495CE4F121A80B3B07A8F37E87DA3ECCE00E4CB99859289A132DF8D207CAD7AB5776DF5A47E7EB99553CAD5DA81FA670AD946A3CF5A4B53E14A5BCCAA5B09126200004011D06C31FA51F85AB389EC06553B17F2CC9D8294A73534969F534A3B11D23C5FDB3C261E54F9C94949505101340CC5BCB4D3ADDD61A9E179C360A20152428409120743783F3DF0D64CE50CDA62250E24998C4836A9B36F5F50D578E6D2240E30E011FDA4EB537A68DF4BC2EA5AD22C5422473E91B19FDF3DF17B9D870653B7F66CE6CFCABE5BBDE15CC30EA4C8701C0069D28F4FCDAD687715CA44428136BCC6DB72B72B73B46D18ABC896A993660092C341AFDC59ACC1BC62B3224BAD4EF7DBDFB2D787EA0CC9700C9E5CF6E5204D8F4F913CCC46195574B06EB7AB81AF8E9CC18DD72D9C1A8FA3F5BDEE225B419A2E6EBFEDD95B79DBDE3DFD6715AC7619469C06AE280F4FF01C5BAB329A9B38FF00D5CEB4B794762B54E6C071A83A41333E237F58DBA5EF7DE71C7A565D225E253C12921883448152281C6D51B4339649559857C6F7DAAD7D6281CFF365B6EB4FB0A9711DE44999E4678A6C7AF58C769ECFE110BC1842C3215C2EC360E2CDE21CED13786AF8375E9EBD1B5178A7EBB33ABCC332397B6477F5B534F4EA240801D712824721014762248DF125DA5E2C2E54461D4A4044B515106AC2B73CAA7D889895278A6254A4FC86C79B0E5A901AC3AD63BE792F641A23B2BCAB2CA9CD69855E76ED326AB89D4AD694ADD6D2E8B282907EDCF3DA48031E5F38ECCB35C73E1B1737F4FDEA90085AABF310AA39208E7F888CCD676264CE0B0B29516A804381414040EA79B934AC573AED1B387EA1C6A90B34797A014A034869A21116FB294AB94FAEF8EB196F667032A44B99350A9B3D41255C4B591C4C0BB17162697DAD161C063316BC1CC2A9A543828EEE457C6CEFCBA5285CF359E62BAEA86E81D76A5E724A94BA8500929499E14AD445FC85E3DD8B22B29CBD6A92956165A96183809716636ADA9EDA23275CD5E3546628A92A5901DCB876677E74F3A98AD6B350D7BB46E2EAEA453BEEBED0727857094BC018BF4990236DB1359E76764CCECFE365230E90A561A6540AA7E451156AD3DE9178C405CBC5E0FBB0CEA4B80F40E9A96F36F311F6FF00F44CFB487627A07D8CBB31C8339D5749499930D6646A43A8292A5AEB0AC0054A093626627CF1F9D6FEA4BB1B9D49F8859DCF5C92705371044859500ECE08FF0095F4E4C358F7CFC27CD64E5B92E1C14FFB9DD8E335776A58789FE5A3D3C67DAE7B07A893FE35A0513B789223FF00783D368C79E667657311C24E1C8059994039DE86DC8C75D91DAA91312B2A092C39967F06F7CDA305FB55F624AA86186B5AD125D7C90DA000E070CC09F19E1DC7BB6DB0CF19D97C6257294B42A5A9C355DF97F9BBDAB0CD1DAE90913425600D6F5607D456DBBBB831D07F690ED5FB27CD3DA6FB08D495F9AB0EFF0085179EAFBE43842426B29D00294942B8556BDC1B74138EDDD8FECCE3E6F67B1C6493DFF749E04B0D01E2BB5EB7B4705ED876C24FFAEE140AA0CE72412EFC405B9791FAF7968BDAE3B1147749FF001C51381D6DB4A29F8384B2A420050278A4C9EB1B5A0638D637B25982F1B3D2B796B4CC5380417254FEA5FA73AC77197DBBC2E0B2FC12952C282E527889A30090C0536D47DA256DFB4AF63B52D17D3AB290242642B626D22DC40CEFBFA7A88ECCE612CA122515B9B920077D9CF21B35ED12D84EDCE027CA331284B84972D504F36372E5C0A39BC42754FB4E7636E64F9B32CEADA572BD596662C52B009056E3D4AEA001E21CD437F8EC70FD190E2B0D9860538895DDF14D965831765A6ED43B78D4456B3BEDA8C46539A32C1692B09029FDAA05CD3DDA823E726BB4D6A1D439C662AAA74D2E46E667983E97C29278D976A9E701001076563E90760D587C2E43841DC85CC3212C1AAAF94063E8FE11F1E3E27E67FA8ED1E2C951FF00F10B377BA8F3DEE1F76D1D5A15A4F42B81592559CCF34752A43E56C2D2195A92522EE05257C526FC8EFE53B2E4E2B3454D95DCAA44A7AA41278C39B6C035999AB668AC23303225CA5057FB80122B66622BE9EAD1EA67D1C3DA356E6B4DAD74267D5014D965A4E5ECACA600A843AB73BB40B0B284C0DA77E5E47FEA07B392F2DCC32FC7C99211DDCCE359081F310A4DC9036AB9FCC7D02FE947B5666659986131F33BE4CD95C284CC53B5160F08579EBA691E6DFB57D02F43FB446ADD2F48CA826B336CAD9A6436D1850AE711DE59293301D2609B795E3D03F0CBB5D82C6F60569529089D2706B4A8135044B291B3500F0E748E49F1ABB1E319DB5C26270F2190BC5B92948ABAC56800F46D9DDE3D63D679EB5ECDDECA7A4B4FD3D70A0AFA85E55514DC09EE9C70565753543E0410612975415CA3717B785F3FC9A7769F3FCCE76154A9A11885BB025BE657E29A1AF87B5BB159B49EC8F6772F913C0940E1D00020020F025DF7B86F1140219FDB652DEBAF673CB7B42A1A84D65465397D0AA9DF6520281A92C21F3C683E466F3F3C74CF833982BB31DA219762014AA7CC9685A9668CED650DCEDA5ACFC77E3BC8576AB239936534E2A9534A384026B4D37B80C28D778A1FE8BBD38ACC751F6A7AE3362A552E434B4151953EE712D3E0A675555C04CC41410A8FBA23A6FF005398DF9BB3D83C3AF8D3981095049A2788CB0280B7F73D5E28DFD1B7674E447B478BCCE571197F34B334587FB960A0478383D2F1D00EDF3B4DCB3B5FF6D6CC1CAD6C57698AECE692810DF787BAFF002FC34CE0481B12B490A81EA2F8BA7647E1F4EECC760A7E2952D4A5E2704660590470BCB2A0C5BFEEA6BE04449FC40ED2C8CE7B5D2F0B8629E04E2420A50A0430500D4F3A6D631D85FA4C7B09ECFBB23ECBF446A9D0990B397BF5B42DBB59DDA882F71A29E49E202D0B5796E76C3CFE9073EC42737ED665B8C9866210660725C83FEF70B29CF0B10051ACC6AC218FC68C99183C26453652693929E2012CF496EECE68EEFD6DADC5EC3BEC93D82F6D9ECCF95EAED55A69877387A87303535EA75C49A782E214E10980B800AAE6D1CB1CA7E2E7C43ED4766FB6F3F0F85C6CF121589504A12B57FB80AE8007A338D2FB88E87D81EC064D9BE469C5CDC1CA0A449054B29490E52EE695766F13E1D77CB7B55FA307D95F5337D966A5ADA5CE7575066CE50E74A5D0E6150D2DDCCAACA695B0EF03AD00D77A124A55102F187F2FFF00BD4ED5E0F119A617178CC26151251370C4052C21900AEC6BC446BBC5C3B2C9EC56598D56031587C199A66776C5281A90033737E8417878FA4D3D843B14CDBB0EA1F692EC3F29672E6F2DA36F31AB5D138E38DE60D661DDF7278388251DCA16491C2798306062D1F007E3B76A724ED88ECFF6AB319B3947132E5494CD74F02428853D4D081AB0B1B8880F8E1F0DB28CC72F46332AC24A948EECA94A9612D514B0B3EDCE3C95FA3EFD8CAB7DAFFB5072873D529AD09A51F4AB3B7B825B525C0A52525692950F1B651E156F36C7B53FAA0F8D583ECA76572F5659344DC6E61872112E5CDF996B2945B87626B7B4713F853F0CF0F88C7CC33D2172E52D24852416626EEE28CCD7F331ED076B5DA3FD17FEC44ED37657AB32FCAEA3324B69A5D4714B53982DA70B63B9529C6DB78B654553E150BEE4C63E7164B86F8B7DBDC662B32C1CFCCF0F216A13249489AA4A03BB3BB105FF00168F54CEC1F63B2E912F0B3F0B8452929E151504024D8D1BF8AEF1DBDF602D2BECA39865BDA876B9ECBD5AC3B9676954F42FE7397B02A1B5529CB5A712C0522A085A78C95010948E5046DC7FE30663DAFCB73DC932DED38C44D9A89FDD89B394A257F3201531729091A3F3ABD1DE5792E513F038E393AA5C80B40F96530268A37074F1A7311F2D9EDD9A0F5876C5F48CEABECE34B65EED466DAC334A1A4A4A169216B534C53A1352E955FBBEEDA25C85471011D4E3EBE7F4EFDAEC8FE1E7C239B9DE3B1B2A4ABFD3CCCEF145293C5C059342093C54E57358F3EE33E1D4DCC3B4015899AA9A9EF8B25609A055C13AB55A3DB2D21EC57EC31F474F627956BBF6A534555A86AA958AB7EB6A8543AF5454B8A42C34DD134A70ABBA5B81B3C283B49006DE1EED3FC50F89FF001AFB4999E1BB0F331872FC36226A672F0F314A010A52C24802B5636F08EDEBEC6F65F26C1E1978F93875AD284901410E4802E48247E5CD843AE8CED37E8AFF006F2AD1D8C694A4CA58D699834E31434BF52AACB54C843656DAD0FA9A612F153402880A244C1BEFCFE7E59F15FE1E6608CFF1F3F349F2B053113664B519C12A2140A81724338E90DE68ECAE3C8C2E1B0987750605212785A9B397B5DED68F1D7DACBD88321F60BF6BAEC9B33D4CDFF17EC2359674ED3525229B506128796C539429E1DE3A65EA800159F43C3B7B8BB2DFD48E3BE26FC3CC660A5625597E719560D689A9E22B521610A0826DC5C5C1D45758A2E73F0FF0D2F32C34D4E113DCAE62492122A388122DABBB73AB3476CBE995F611EC7B40F609A23B68EC4B4CA74F30DE5B435D9C2A9DC79F4D50CC51485A512BB2203AA22DD7D71CE3FA55FEA0FB519476C336C176971F331C9FD6777253314DC23BC58701C9A863A8F38DBE28F65B2EC365584560F06842D329D44243BB26EC0BEB61F58EB77D0CBEC69A0BDA2B5EEAECF3B48C9115DA5F4A379686DFA9714DD3B8BAE6149578EC9052E8B4F31B49C7A03FAD0FEA531B90766B2CC264188386C66310A226CB554B942943875A1ABD5E25BFA7ECBB2BC6E0B35958DC14B9CAEEF853C4134A2C3D41AFD77148CFE9C5F64DD15ECCDAABB21CCFB27D389CB322D4633E5E7556C294EB01146DA0B01448291C4498BFCB101FD0C7C4BCC3B6D8BCE26E7799ACAB02252D6664C241E30A51A1506B6C45F68E55F113B372324CE3113A5C905136728CA4705140ACD1EA035F9DDACFD87FA2DFD917D9F35B7B1EEBFF00682ED6B49359BFD7B23CC6A324CC2A5E7996D353963756DA8A00849979B48E524629DFD62FF501DA7C27C41C9F24EC7E70B9185C04E50C6CB90D30CC1F229292C5C380776D8BD7A9FC3CC8F2AC66478B18FC1CB13264A696A5330252AAFEDAFBA433FD16FF0047C7633ED01946B2F6A3ED7329198689CB736CF1CD319170BC80D51E519856D354789985B83829D2BF1209E84E3867C56FEA47B5D9965594653879D88C2E2B13284A5CFEF540A0808054524A5F8AA7C1F9C2BD81F875976133AC563674B973A4A269584148660A510CEE282EECE03C76133EF6D8FA209F5EAEEC8F37CAB2FC8AA72466B32CA247F07CC5C73EBADB6FB2905F14C140FD612920A951B99E78A9F6313F19666639763324CDF31C62A6E2242A68016A4AE5AA624CCA9240F95EDCAACC23B1F6C71BD9E9992CCC20CAA42572E4A92662529BF0900B04D5A80D5CF947CB7F6DD98682A9ED2754D0690A448D286B5E772AAC69C7385FA7756E38D1088E26F852A40009E77BC63EF5FC2D19AE27B2182979895FEAE6609099895D4998A9490B725EA0B9602C0DE3E7D66984C361F1F8E992F86B3144240FD9F329AD43EEA5DA204E7699DA05168C4E8ACBB50E6F43A64D7D10EE28B31A9A50106B10B221879060991D0DE6C4638DF6FBE086071B85CDB35C76024CF294CC9A17325A4AAA16A35209A0E679984BB3798E2E5E6F874CBC64CE033405490EC9AB0ABB1E63611F719ECCB4196577D12940C55079D6DCD299BA9CAA7DC75C71C5F0BCA256E2CF1AFC7B1528C998C7C5CCCB0B87C17C7E46130C844AC2231E89699290004D92599AE6E1BD23E876569953FB10B98B960CE18572BA12FC14D3CBEF1F1263B45D6195D26A5D1596EA0CCB2FD38ACFB37416286B9FA34A93FC52A5442FEAEF2146E49BDCDED8FB5123E10651987C3D938FC560244E9BFE9C572CAA524A83C804949524A83BD5887E758F9EFDA2C6E6327B52A12F1B350062FF00E902B0923BC6625C69C888FB62FA37436DFD10F45C0FD454A91A67582955352FBD50EB8A5AEB4925D794B70DC9FEA81E58F87FDB0C1E1B24F8E786C34A9489586959AA1299694A5213FEEA1DE81DCEEE7C9A3DDDD9793FAAEC4A97894F78B5610152C977F91C13B6E1B6E71F0D41E4FF0019D517B1D4F9FDE7AE6F567CB97A48DB6C7E8E7B00A188F879911C3B07CBA58615A8949B3035F060DAD63E7B76F113067F8C96147804E5F0DD802A3FC39F106F07D6386A5E954FD98127A6D791711D3117D9EC22E566589993417E371C557D4DFD3FCC56E4E19425CB2454025F5AF2BEBBF4D442B65F4A549F1117D8133B9DBF111118E9C7826CA5310DC2CD7D0FBB51F70D0EE6CB070EB0A0F42DCEF4F5ADDEA21DCD581C104806C04932237EA6F6F33E51882C348EEE6CCF9581347D1AE08A8FA3F28AAA241EF4B503D5875A537EBE46EED495890078A368BED3D3E23F29BE179A8490C589624F869F6DFCDA313648276D542BF9E477DED125A1AE4C99267C30677DAFB99FC09DE4E21B13265F1D520835622C4EC74F388C9F29945C5363CF5A1AFA9F38BB35566EB3C70BEBFD43CE36900188FC0922390232E2A9C9530A9AB077DFEC7D98889490A55ACD5AD7EBAEDA738A4F33AB7EA52E21A5C3A2E825406D1363E5CB68BCE3AAE4321387929EF43A05F50E5DB4B124B7B1161C248B52A0723BB1DBE9BC55D5D555F97D6B398A163BFA5ACA575C3292785A7D0B31FF00D2920C5AF8CF69B0C313835CB961C290B4816A28105EDBB1B78C5A70187965491387FB6012F5A16A73D06DA7231EC2D0E6343DB5F64794EA9C890DD4667945070670DA16953A8521096592A6EEA121063C33F7E3C9887ECA769A7E0318A29C3626705604A87CAE3E69B7A0209D6F0CB37C009C25CC4A6A824289A382ED4DF7DDF58F3FF55D53A8A8ACA6756ED33ACB8A429B295A4D94531C8F974DCDB1DD70D99499F230FC052470804820B8206BEBAC38C2614A306BA31092CFBB6C3D19BEC6A1CE2A1B6E94D552D6298A961412A012A529C0E2A0DA64409E7127A0C5AF0384EFE64A524D8855BF8A03AF2E710793A267EB485A010A98782AC181A8A16F0FA51E155F574F58EBB978796F3ED86D6E28A54890A0144126DB74F77417FCC241959262E7CC4A512BF4B31C382C532C87BEB52CEFD63A16225A9388C0CD029C69AB87A902B7D3AFD63ED77E88CF630EC27B6BF627ECBB55EB6D3F559D57BA33712D66B5F441A28AF536ABB0E212E714011702DEA7F365FD5776CF189F8939D6065CC12F0786C47FB44049E2E2249AD598BFD2CE23DE1F0CB234E3B22913520F11949E2150CE06A59F5FA3B523D456BE8DBF65AA623FFE03AE03911A9336303CA1FF0021D463CC333B578E584BE2980141C29D7EC2C1FA474DC3F64C244D704F10B329CDDF97AD18C3831F47AFB34D0BED3B4FA1EB42D0AE20E2B50666AEECA60A6389D26FE5CF0C31DDAB9E152C4F9C95936F9406F001E9EE86AC91D9204CE025100DEF5A3FB60199F58E8D7B457B34F63B90FB4CF611A5D9D2D50FB1AC1CCF9A52179BD60211434C9FEA53849B120472B0C769EC576BE6A3B3F8FE09E1333BA1C33784167E270DD287626D568E0BDB0EC71FF5FC277608499C1856EE1CF8F883AD8C776E9BE8F0F65F3DCD4AB485635565B6DCA8FF00E399990494050801E001E4607AE3924FED5E28E37124CD1326198A2E400D521C001B6A0B58EF1DE25FC3DFD5E5B81EF16C44A4B062744EA0E8DEBA6B2647B107B36D3B229C698AC526200FE31997DFDECDED68F3C03B439AAD49299818170191C9B41AF3A1B81489BC2FC3993230EB48554A7FEEE7CFF817D4B4373EF61DF66CCBA92B734674A568CC6932FCC2AA8E737CCD490B6695C7495254EF0C4A07DA91CE3A3E959C63B178EC1AF10B0A289F252FF2820296806D5B00ECF50FD28D9D7638E132ACD5810F26656BA254CF50FB7947831A8B5585D456D065B50728A0A5CC6BE999640FAC1E062ADC6805289E2D900DE37DE44E3EA4760F2892AC83033D127BE52F0F2CB92DC24A126D50F577AB97A5488F8E5F14303364F6931891C494A3113372FF00316D0FD39EB157E6DA919CBE1798BCDD436A5781D84A0C922E40F14926D72676BC0C746CBB234CB13172FE4580EA05360493737A1D08F431465F7E664841258D0726605EFBEAFBC7643D8BFB54CD727F689D274B96075594666E3E8AF5281699504D390D7138B0126E6DE2BEC271E5CFEA1B24978ACBA74D080A5484AD5C406C1E80835A3787311EA5F835DA09FD9DC760E54B9851FA85A1376FDC4021AAF43AD9EF1E95FB45F61995EA4F69BEC673E6F2B15CAD6AF57D4E6CA292A43472CA765CA72B51494DC8944C49B0DF1E36EC176EE6E5F2339C12A62A5CA96932C20A8BFCC169FDBC8B75BED1EEFCDBB132B3A9D94E63DD85AA6844D2784528824DBAEBD23AD7F4A7F69CC52E7FA1B413084A19D334CF273069A7C6FDC32BA7EF1B4AA525251299026245B7EFBFD3C761D3DA34E6F98CC1DE89EA2B0E976F9A61D47D7978729FEA2BB4733B289C9B0B2D7DDB0082104876E00CC36DABD358BFFD99EAA97B78F624ADC89D712FD65265798F7895381C752A654FAD80A049298E04F082013CAE71CD7E2CE0E7761BB62AC5A5E54BEF9250C0200E020166BEDA50C59BE17E151DB7C97867FF00BA7BB4B05391F303BF5AF86911CF672AC47B3A7B09EB3ED133C0296BDD6F51D1D4B8F8EE5C5835F5D474A49500612952786D7E538D519DCDF89DDADECBE0A6CC52E5CB9A8E034570F01965B672CD5B6D175C5F66657C3DECE677899284CA54C92A24A592F45D68DCD9BA574F9C3EC1F5EBDA8BB72D195B5B52A5B95FAC2BDE2932B5BA87736E26EC24C00A107EF8C7D53ED664186CA3E162B8E5A50519594824004B61C8A3B17A73158F017C3FCD67F68FE214E4AC952518FA3925819A7EC03E9A0BC7BC7F4D6D6FF09EC47B2F57D6453B4F652CA9692910A866948B58DBD31E0EFE93F15C19F76C8B904E215F35DBE79C2D7343E5E2DED0F8E39209B97767D93FB25A6800BB4B7F13AF808B4FE8FACFD549F477D567542FADA751A6B51A9350941242D2DD604A936894A8026098DE7149F8A586979A7C5BC1E1A604AE5CEC74B40492000EB4824D9A8790A1E7171EC14B184EC6631228A4E14F096B325479F3D0347C5C675A8733D4FAAB3FCF33FCC3F8B664F6AECCB82B9D400E2CB19DBC96B88993FC9094000AB940B1C7D81EC77C2AC9B29F86BDEC9912710B9D960592109F915DC71000B106A48A3171CDA3E7F67FDA7CEA4F6F92893366F7631E9494B90083380E8D5E5E31F657D9FBAF6A0FA23A8EA350D51CC1674DE661E5B80AD4E16DC70530264901AE1481702009C7C62CEB02B97F1C71B8192938799FEA00219C703289A33338A8A6FA47D19CCF2FC6633B0183C54C4A9415820B59209249402E6E472DF68A37E836D3D97D07B32F6959EB85B39ED70D46E553EDC38E452556666907123888284252902463A27F51133192734EC5E1E74D5CE9689B2C1E25BA4A4992FF00292798DA39F7C1CCB958939C1E13C487090C410471F206ED4FF11F2EFED8FA8F52EA1EDDFB4CAAAD79DA976B73A79AAA1564B8A4A296A1D431C21E24B7084A638627CC63EC27F4CF90F64717D89C395E030857FA1905733BB944BAE587513C3423E66249203D5DDF907C4D999B617365204D9B2E5F7AA0CE4502B7A7B2F4B1F7A3FF000DE663AA9DA2F69CA1CCAB9FAACA72CA6D37FC1A89C052CB21D69F35019512507888957081B7A63E5D7FF101ECDE4B9676EF245E562428CCC4CCE3EEC207012A433B683CE3ABFC229B889D8498A9B89513C0010493C4E0DDCB79D7ABD5E7B03CBF24D4DF4D0F68D575CD30CE6D9355D21CA92FF03A0177285F7E5A6DC94A89008514A4C4C9223152ED6CCC661FE0B49948C44D38695879616842D690BEF1496A820D09B30F1022F08C2E1FFD53884F471F192D4DBAEDCB77B88EB6FF00E230D59AD55DAE764D903A9A87749D28CE52CD0F7C5AA5AC52D868F1AAE107B8761694A8192200B63D3DFF00C34F22CA670ED22F30548EFE7770654C9B2D2B291F395278540BB8A170FA93148F8AF3A6C992832A72827849E04A8D580377A7361D291E2CFB2666FA9325EDFBB38CE748E72F2F57E539ED1B74CDD3346996EB15B52C35508213C29792DD3A949921462488C7B6BFA81EC7F65476273EC4FE93088C423093945932DC321452A0C9B967A5059C5E3987C369D8AC6E745D4BEE4CC40092A2A0083F31725EA6AC6D1F57DF4EE657923FEC8BD9F6ABCD99646A8D3949A7333CA1F79612F37501FCB6A6B0A4AA0C9524C83F2D87C73FE96F23C5768FB5BDACCB30EB52B0F3A7CF429491F2CB4A0CEA10ED50001401A8C418F5EF6865E0B0781C14D9851C72D095558392013737ABF56630F196E6C7DB87E89E6AB2BEA1ACCF3F3A7DBA6532036A768FF84389658909B9E2453A6091F2C42E6B879DF0CBE2F4FC3941978638827BCB267900A8D2A070977B3DCDE2A99F60F0FDA4C995DD11314896470A43905801B16D872B3563A8FD8A6643D877E8BDCF7B415D40CAF58EA9CE5867EB253DD55775976A834D716591DCC0936817B6273E21CDCC3E3576830D8096959C3E4921656A014A48EFA53A4B86A120B579D59E203E19E5E7B32719DE3A3F50B02B4601441E573BC5A9EDED95A7DAFF00E8B1D29DB250BE8CE35150399652D3543284BEF819967749435012A471281EED478C4DEF24628FF0CFB77987C09CEF3BCBD6B992A5CF284AE695143F0850173BABCA85C45C7B4FD94C1F69049528A14A7252C94921C826CC4D40BD5C3888E7B42D72BD89BE877D2FD9464B982323D579CE541540853694D43C330AE69FAC480B214B05150A077001DA76E91F09F21C57C6FF008BB8BCF66838BC1A274A33E6295DE252148F97E524EA3D0C547B5394CFEC764A9186E2E12820000B903722B6FA5447523E874FA4FBB34EC3F4D669ECE3DBA54B590E5B58B71AD3D993A953CCD5273971D7F350E36D2421BEF3EB0471BAAB4C836C76AFEA6BFA64CCCFFA6669D98C3AE64DC2A0AE6C99287131410909AA4109621D9AA4EF7A87C34EDF19B3F1387C4A08257C20A9554804824BEF5F5D6DDE1F694FA20BD9A7DA6B2BCE7B5BF657D4395E4F9BE694B559BE6147401399AB3AA82D395094ADC53AA142A2E1544849515584838E71F07BFA83CE3E0866986ECE76F7B389981731121189C4F04B32471048290A96EB0C45886AC7A0D59060BB4592E3F112260E3EE4A82407E27492D7DFDEA7E40BB5DD09AABB12ED0354766FAE3277329CFB22AE55355D33AEF7CE04F78A0C3BC424C3CD04B800FB33048DF1F6F7E1276EB2CED864F97E6D8032C61B19290B9694149487487629A50D3ECD48F9F3DA8CAB1180CE71D875850509AB090411FB496A9B50F5E948AED154DADD6D0EBB14C2AE8545266E3BF6CC72E639EC3963A6F6F932A5764B3498B4A7FF00C24EAB80DFED2EB434A79F9BC7767B0CD98E1D64007BC0E7982057DD5AD78FBEAF662AFA773E880CB14869229BFC279D8EF645E3EB039827DDBF524DB1F9A1CDF855FD47AE7713FF00FCDD2424D984D1AB81A5E84599CC7BDF23C6A7FF00B26B95C54FD310472E02E763B7324B5A3E04330A827526A39794298EA1CDC8DFFF00E6753EFF008FC36C7E8DF26C560D5F09F08BE14850CA4A4D451E4000EB73CEF7B4789FB418642FB4AA25001562814ADFFF00F23F9D3EBB53EF17E8DD7C39F43DD125091C08D2FAB036A172AF1D6CF29989FD6C4FE6E3E364B549F8F1317254ED9BCA5708714EF52687A104FA55C1F727663853D8DE07001C29DADC157B0153CB7BC7C2A3EFAD39C6A42018FF0013EA08FF005019BD64C7327AFA5F991FA25F8098838CF87D9226657830328126A6B292DEFEA2DE09EDCE042F3EC41480C672DE9CCF5DD9CFD5A3172A549A9709901411C2677B5E27E605E3974BA63F049C14C9B36581525541AD7DB6BADA22315970932A5F086A3B806D4A0A69E1A6AECA115465266E0F23C87DE7D63718322C51C52E625CB75B1AF93D01F5D221D587E397303513A1F16EAFB6FABC38AEB4422157326D73E9633F3208F291890C534951090C4D9BCEBE1B79BC41230CCA5921874DC9BB37BB42DA5AB55A5506DFD5E963EF3F872C45AE6BD5FC5ADBDEEFE95DE119B2039A3020B86DB9EDF5F52FD4D5EA491E2E917E91EF13F0DB0CE6A8AFE660143C7EA3D988D9F86AA986CFEE9EF5D22ECD40F90557B78B993D4DA3E47FDB15AC1E5E95B16A534B3B78FF00377AC5670C82E3776B3DCFE4D8DDADB54D9ABE12410A20C988B4753337E5636FBF172C149125212C006A8BF4D34B9DAF16BC149E2670E77AFA86E5E0E4BC56D9CBF2570A3799BF39B5A4733D49336318DB1B244E42924536D2C34E7BF268B6E1B0E0814D7CEB563D43D69D2B1D8BF644EDD6AFB31D768C86AEA4A74EEA7710DE69DF2B89942584F80042E42788A88F0804DB7DB1E5BF8C3932D58BC3CC972495A78CCB524170A2285FCBFC5DF62300674A2AA0E023E56078838366269B36FE3DF7EDCFB25C8F5C255AF34025A348DD38A8ABA36133F5A2A6813C3CC4104F8419918A6F65B3DC7E5C24603385A84F0A3C0A51A293C4E1C82C960C189A9E704CC20460A6AD2070941AD058359F4A9FBE91E5F6ABA775AAE7D54B4EBA179B70A1CA2752429B521453243804F111C42C37168838F4C765F3CC24F5490262492120A5DC681F57BE9A6BA8A165ABE1C4995310584C265CC7BFCC49D34B171D62B87DFAD69FAA7AB82509013E201209B47282771698B5A717AEDC62049EC8662BC3034C2CC345137428F366735DB58BCCCFF73138201F88AD0C1C9145245AD6E576ADDBF421FA081E6DFF00A3B3B225A2C952B3DF173319ABA0C1F224F5122DCB1F971FEA4D53719F10B3D52C9E3562893BD14A16D396B4AD23E8D7C2099DCE47210A179483E40793687A78FB2AA6CAA07148163F2F3B7FBDA31E7E998351E021668C08F2AB7A4760958896A0B205007A5BD3C357B469ABE15367FD31045B9ED68B7EE310F9AE5B3166594CC371AB00DC3CE96F6E211978D9604C5300100BB867B8B5796ECFE5E4C7B5B1AA57B657B27D400AEEE95FD58091B0E3A56C5CEE0F4BFBE6D8EDDD83C0CC464D8B2B55049AD2DF2A99C6FA0361D2384F6BF3195FEB7840502B3C696F9921FA5391FB7AAC8610A436F95C7794F4E08BC59A02F11EFDB718E62AC0A978EC4CC0A202A6ACB7451A75D5F6F08EED2B3A95232FC17124377496AE9C290CE7F834E8601429510B0AD89277B0F5E717B7AC61E04AA5293C35B8A9DD85A96FBC3D939E499929443304D7A0B576EAC79C326AC729DAD3B9F07109FF00F25CD477840F07F917E4F513E58525E24C8CC72F05C257390493AF0AD275A1B0677FCD373ECCE5E2729CD014848EE576BD9557DEDEB678F8E1D4F9E32D6A0D474542DAAB1F5E7799A51C00F8146BDF1B00A8B9927CADB463EAC7C2DED370E418342905411225B56CC8079DC0D46978F8CBF15A44A9DDA3C629D81C4CCADDC7191BFBF48D794F66398E69568AFD5EF16329716DB8DB6B570C2525248F0A82809EBE40E3ABC9ED34C9B87C42654BE29841E1029BD5D9A9A3ECD72639BE27092654DC312404B83D76AF93459D996B0A7D019AE42EE8D2D3797D2D7D025EAA6C252B4A45432167BC23886CA04F15C18338E4BDAEC9F17DA2C973097390553CCB99F2B3E8AE10DC9C5FCA3A764989461734CAA6CB53211325970E416282F73AD58FDEBF499A435D685D45A334A6BCCCB39CA9FAACA32353D48A5D4D377CCBA28501EE195F182A5A609B4F3136C7CE35F62736CAB3DCC72F460E7AD789C4A124A652F8529332AC5883451B6EF1F4DFB3BDB3C12F22C04E9F8894572A424104A5252C90DCDA805BED1F2C5ED9BDAD37DA37B40F69BA9D7998550D53F4AC51C39DE3605334A60F7601294C9489E10279E3EA77F4CFD805E41924E070CA2664996A09292EEA492AA915624D0DFCDFC45FD50F6A65F68733CB8489A0895318F097A0296D756D6B1DD9FA1DFB66CA5BCE3B40ECF33FCE986F2FCCBEA21A159528A7692840716E06C3CE2130A04F170EFCE71E78FEADBE1E4FC595E3E4E1967B8528F0CB4173C6A6FED0F7FA0B08ED5FD3776B70F96E1B0F879F31290B4CB492A22C000E1D85377E7179FD33BDAF694D0DECA2F765BD9F5565CFBBAC5C4AA918CBABE9C70FD533043D530197140F1852CA85A7A1338E73FD28FC32CC734ED4A71188C34E4A72A9D2D40CC94B0E165E8480D6B579DEBD7FFA81ED86053D9A9D2B0F350158890A4D140BFC9B3DCE9B79B7CD77B2766A32EEDEFB3072AE9196D0BCCDB577CED5B61A6141C68B8A5052826E649E23F9E3EA97C69CAB118EEC0CDC26124949C3E5F302B80151534922C072FE77F017C0B92995DADC4E3262811FA90B750666593ADC6ADCA8ED5F79BE9D9D6196E73D877654CE4F99E5F9A5553E5A84BAC52D7532948E24520095069D2AB0041045A27CF1F3E7FA49EC8E367E73DB554CC34E92133C8495A1697F9A6B91C4002D705ED48F717C4EED06171F82CAA585A0996800B10744DAAC35D3CAAD78FB04EB9CA32BFA322972CA8CCB2BA4CC9BD33A992ED23B5D489794A79157C03856E05137B5A6F618E61F14FB219E9F8C32E5E1A4625CE3A41429329652405209F9827845AA01ABDCE88E51DAEC265DD9DC44954C9602A5147015024B8237AD4BFB68F8D0FE20A6B3ACCF2DFE18DFD61ED599B283E2A91C1C2E674FAD2AB9E002140CCDC791C7DC6F8739663F07F0B70CAC5952972F2A53CA5A492B6C3D2A41208DACFE31E4BCC065F3FB6386C72928E0FD5A56A371598087F324EEDBC7D8F76739E65591FD132CE50EEA5CAD19A2F4F578550AABA914EA438E2C941417B8A549510044DE7A63E2DE2B2AC6F683FA929A065D364CB9F992A5999C0A0901CA1DF85855F56D3578FA378CEDA64EBF87F230B24C92B4E0D2821D2E0F00167A35EA0757631E6A7D081EDA3A43B2BCFF005CF619DA03AC65B926ABCCAB98C86B2B2B521A612BA9AC5D61256A4821D2EDB8D4041F0F2C7A13FABDFE9E33ACAB2BECD67D96CC993E64A93FA832132C924F0CB5247102598D5ABAD63897C24EDBE5B95E6799CBC419694CF9A52975003F72858B543EC2978EC3FB64FD0D190FB42769B98F69FD9176C990698D3DAA5F6EBB34A76CE5D5296DB442D6A05CAB04132A5129005E3AE285F08BFAACED47C30C966F67F1992E3D589EEBF4EE654E676294B132882E1ADA758B476F7B2B96F6BD68C5E1E74A4852B89D251576367B0B55ED6611E837D1D3D8EFB387B29E95D73D9668FED4723D49AEF2AA2A56F5F66685D3D297DF71A71745655429B5F772A4FF002C9B092463CE1F18F37EDE7C4AED2E5F9EE3F27C7A30D331266A25944D99C492B4963F238D0E8E29710E7B1FD8D9393E1712138E4105150E915093AB862ECECFB6F1F33DDB8FB4F663ECD1F4C46A1ED372CCD5BCC34FE4B9C50375B554EB40A5758CC28934CB529C6CADB5F76971517544198C7BA7B13F07715F11BE14FE8B1597CEC3A4E0E92A6216145728129FDC12A1F307F3022A824A64E76427304BA67317208AAAA2AAA96A5C37D7E813DAF7D9B3B11FA59BB1ED21AA346F68F91649AB74ED122A28EA7EB14AE3E8A8AE4B2AA805A72A5B5288525408502236F2F337617B67DBEFE98BB4B9A6066E4B8E9D2319394995365CB9BC0844A2BE1AA65905D245F7EB16DED7F6270B9D60A4CD46310A5997549E162E03D4AA800FCC7527D943E861D25ECD1DAA50F6E7DB776CD926A3CB3479555E59973AD515021A0868A544ADAAA01E3E04AA540C102379C5CBB6BFD55F6E3E20E538BECEE0F2BC623179924CA0A2998C94AA8B042900170A34E434022A1D98EC9E0BB278A13D7390A757168EE1CE84F202BCC563CF9FA747E900D37ED2FAAF48F62BD926629A8D1FD9B0ABA2D52E53387B9CFF00BE6DAFA88412477628D6D7FE52941405C441C7A5FF00A01F80398E588ED467F9E15C939A2113128992AA85A9331F849A9752812D67AEB087C4DEDA77B2F0F2F0EA2C804712554228D4D080EF7FB9EDDFFE1ECEDF34C6A4D2FDA67B3F6BAA9A5FE1540D658D51A730AF45335C351DF3CE06D0F389063651493245C1C79FBFAD5F8659CF677B468CD7012A6CD97227CD5F14B9449214A0CFC214751BB5A8224BE14F6865E2E4CE958A57CAB486E2340C0BD0DCE8FCEB5BB37D3F5DA4E8BD03A1FB2AF67DECD1CA0A9CA73A733E5E6AD50660CB8CD3943E8AB68AD2D2D6992B24A4820CDE4E247FA39EC5E6FDB0C6E7B3730C24C4CBC6A30C897DE4AF993C09525552028B9706CD6899ED6E7185CB1483865A400A51E20407ABBB3DB414B02EC0D6F2FA0EFB42D17DB1FB2AEADF66DD739965CCE55A0AA327AA0335AF6025C5D4E647304708A97533C2B6D2004930400231CD7FADBF81D8BEC8E6B968C2C99C3FD51538CC99264CC3C265F090FC009ABD1FA0687BD91ED29C74A99356B0132785454542805682DA1F0AF28E96FF00E221F684C973ED77D94762FA3FEAB5D93F67F4999B59A2B2ECC1B5538EF6959728F8D34EB2DAFC4D88DE3CAE07A6FF00F875FC20FF004DC873AED2E3662C4C9F252B9726721495BC94AD2C38AAE586973C8423DB1EDE6599C4B565AF2D7DDA4A388917218BF3A6D7E51487B197D12992FB6E7B2EE8CED8727ED3F2DD13AFB33399A33AA652E99CAB4269AB174B47C295D534B47F25008E048277B9BE257E2DFF005739D7C30ED563B23C4F646766982953C4B933940A92A4053121E52DA9CEC361150EC9F6224625189C6E16600A53A884B50FCC6CFCAAF4F08F793E8ECF653CCBE8CDD13DA8D576BFDBE516B1D33995031534197E67534ECAA8450B4FB8B6DA53D5AEB87EB0A2010902D682231E11F8FF00DA8C5FF513DA8ECE4FC83239D95AE54EFF007C4A90B481DE197FB9425201E1FF00D4760D1D0BB35DA49BD97938B918C2552D614900AAECE0D34636B5C3968F907FA447B67D33ED09ED73DADF6A7A792C3391E695F46C65686214CFFF000F42A91E712520254165B2AB822FB99BFD73FE9B324CC3B0BD8AECD649889F3711330F2815CC585024CC29531724D1DB661E5E67F89599E1F33CD66E230C94A553564A929E1726ACC40F4E82F1D247948AD71B69A3C6EBB574490B1002385F6C12784DC01733F7463DB1DB544EC6F617310924A95825B0B9FF00A65869AB59F7BB98AAE538632E7C998CCC41219C82FCF4FE35B7DDBFB336A1D3793FD1114D91661A9B2B7EAA9F4B66FC544BAEA565F42DC2F2908E00F070CAA364C9DF1F9D5C776733199FD434B9630338056684F7E25CC2857CFC553C2C963401EEF736F5164F99A11D9F989EF83995C25259C3EC77607E952F1F0AF98B15CFD56A6AFF00A9341273DCDFBA685437E20732A80DA80998363E933338FBBF869388C2FC36C361895059CBD824920FFD216075B53D77F336793258CFD2B04F0F7C4F78C4DD428C2F6F1E8F1F709F468EA4A2C9BE879C99BCD33DCB28F323A7758A2AB2A76B690D4203AED6A590A429D0E7892411E1988B63E137C46C8B198EFEA09787999662168566329489E25CD32CB14A89E2E129A1A5CB178F5A6419AA47645C4D48E1C3906A1CFCAC19CB8EA3A5EFF1079D56A9DD479CD0B47EA85AD47A8D65EB2D2B0EE6956B491C8820C8B9B75B8C7DEAF8272BFD27B2F95E166829030D253C268DFEDA685EF6B0E81AB1E46CEA60C566F3E61629338B1707FBC8AD6951E62102EA1F436DB6FD4FD6384A8254121300A8EE2D3F0F48E7D23B4B365994549775A48A6C03DDA9B787268C6712929C2A1807E116704061E2E6A3EF1922AA23C441F5F9441DA3DF883EC8A0F14F51258177DAF4B57EDB45630D85EF44C0D41A5FC5B6BF4DA17B3540F3E7613EFB1B0FD8DED1218FC4254B2904120D791D1FAFF88613F0641248D5B6BBF4D7EEDBC39B15299BDCFADE00F3BF31FBBE23FBDA0A38EB4F0F188E9987242810054736D4B915F1F5AC3E51D5004CAA768E7CEF73B794DB96136F5FF10C26E16F4E7EFCFAEE445EF9FBCA495C99916BEDE5E63E7317C37CB7BB3C3F3247450F3F06F5B450309C248A8D4B1D694F37766F4200A9B337AF24C133CF7822DCE08F95F6C5816B961988B5C355B5F0B922EFCA2E99690C12EC59AB4FE2B7A45739CBA47149067CED07A12768E7E98CA172C9F988FBEA6DCF98B45CB0286006B4B80C1AF77AFA6F102A9AAA8688729DC534B6DC43BDEA55C2B49696958008330A88B13D3683880ED276670B9ECB4A804AF8056D4B6A3A6BE4F13D265204D42D49E24B1052752A70E79EB6E5AC7B09EC69DBAD16A3C859CB7357D0E56E4ED064513AE052AA82C14990A3C809BA4FE5E61F899D9E565A0FE9A590563E65A41E24F0331A5473AD87384330C0CD93869E94A14B0524A5816AA5C5F50E0121CFAC4E3DA13D9FA83B45A1ACED1744308A4CC5092EE7B97B0907838070B0520402560711EED26F20CEC28DD8CED5E272BCC70D81C629687584CA98A27FDC018977A066662C4EED1C7B0699E8C7AC4D744B42CB248019D4E59D89FC1A691E516A5C933664E654556DADA76994A4292E24B6B3C2483E15709361331B796FECA9D9AE5F99F64B152578A97DE4CC22AEA492FC0A162AABB8FF00069D070D353331B8128F9F8549B312038BDDBEB406B1F7FF00F40754328FA39FB1E678871B6ACFC2E08327F8A3BB7C7AC74DF1F9ABFEA9B013301F14BB412E5874FEA125019A85C92799BF851C47D21F84F8633F219135350258141B74A6F6B5CD047B573C37170AEBCA3D3CCFCA31E7054C50E1FF006EA6F5B3791DFD6E0C752958644A4AD2A50254F7D3933DDEB5A53484756DFF0029464057862FB99E40C72BFB879E22F1F899A0CA4A65120104B5AF6B3C30384470CD26684EB56B56BA3DB4DB9C7997ED4C8A65FB4C7B3BBAA092ED2BD9F84A8C594B6100F39F90C769EC5E38232AC64B5A7878E5A68D664976D79B6FAD9F85F6B7088999F61BBB980844D1516FDC0E84801C7F916F48A8549FA95229C215C4C35179FF00CB06C07E679FBF9ACE5CFF00D6E238657CA16A6A8DCE9E57E7BD3B9E1729958CC0615256DC32D249A97A07EB60FD042D4BD07812D9E13304DA39449E9E71CE2708CC54D0A41E0B9AD411F57DABA9A56F0F5394C8C3C99893307EDE4052BB8FA9FBC43B5AF0AB4EE774EA8E0A8C9F354B8B240E0FF24FED7E60F97BF0E25619789CCB2DF91E5A27202C805EAB481CBAF4E91CF73DFD3C8CAB3596710973297C2E039649E7F47FB47C9CFF0087F4FE94CDB52E62C96AB6A579C664B21C50250AFAF3E47DB2779DA01FBB1F53FE18646064797CBE220CD92876154FCA08A354D5A9F48F8F1F144E2FFF00B438D54B96B52062165C02D45162FA8F1D6BBC55DAEB5E546669750ED48629297C3DD214059560070C1E42605A2F6DFB5C8ECE1C0C852E5A4A8CC0E0849B8D7CEB7F38E479AE2B1AA5E1C194B0C468695076E5E3A87B50F9EEB658CB5CCB43D14CF1E24BA560A92A6D457224CCF1446DF0DE7FB23D98563D73D18A90485FCB504382FA16AF879B45D329CC2711216A7E29401B331706FEFED1006BB78ED1F2C6574547AF330A6CA2950B67EA816EA92A4BA14DF081DE6C27A72F7E2771DF05B2D44F9589978290A54D515294654B7D2E4A5DEA48E62D48E98BF88D98E1B06A9285CD010801202D4D404559BCB4D0475D352EA97DD5BA0E60E5754BCE975E754A502B2B595192499DC9373EA39F77EC7F6364E4B82EEE5C84A4290DFB40B03A369CF5AEA1B926699EE63DA1C5099890B3C0B3C04B9D5F4B5BEC08D23B4DDA8E75A5EB5CACD3B995569FCD69D1097A95E741A80B4C2B88B6B483C0098924FA1DE9FDA8F85F27B4B8BEE276192B97316428AA58500E402E0A483726FF0066BE7663B5B98E46B9264159092976590CC41D19C035F28856A2ED63567696ED2D0EB3D4B98666CE9F53C72FFACBEFAD3FE6BC6F405B847BC9DE23A62FDD8EF82992F6170FDF60B0B25733149056A42128293A12007353AD9A8D171EDEF6EF34CEF05874954C502901438891A0E7737D2FA562BCA9D40FE459A65998E4B5AEB2F30E38B62A10E2C2DA5248B8F103722C7A581B62E0AEC761F1384C56131081313884291C2A0084F102050D3534A0D2D669D809F332E13B1330702D4CA36492589E553FCD8D1F75576A9ABBB412A6B5A6ADCC337A4A06826969EA6A1F5A112DC0094A9C2081C291EEF2C503B27F0872FEC763B19330F879481984C75704A4A48724D4015FDCF5D9F58B2E69DB1C7E2E6A10A2B28413C2EA2CD57AB9E60DB4D2B0DBA7FB70ED3322D34AD3997EB0CCA8B4E5225F65BCBDA7DD0D38D3E56140A43804428D883BE2C78DF81D90E3B33C3E3A661244DC4718985664A38A9C2AAAAA46C6B5A42A736C5E2E5A13DF2D0966238942A7714A5ED7E45E29276B87091C6E77AEBEB74D4F12B88B8E3A5C2B3B1278953EFDE71DA26E5B2B2CCA1196CA940C8549324200040053C26C0EEF42F6B34426264CD97884CD1338940951AB12407605FEEDBF3B353DAF76A54BA75CD08D6B3CD1DD38FB62687EB6F25969B47F34A0254F0042CC8B00224918F3F49FE9D322476865F69132E4CB9C7102795F7238828A8170581A1B6BA691D4FB239EE2F31C0CEC2E227AD12D29290952CB0670CEFD0FA91AC55D97E635EE553D9A503D5394D530E05A2B29EA9D69D6561478969536B428971424C2A6E649C768EDDFC3FC0F6970795E5D8C28C4A70C9084A972D2414B2284104580F3DE29598CDC564B9909D869CB525530FC892415392FF303A383E1B34596D7B5EF6FDA7285DC928BB50CF5BA1E014ED527D62A57DE34B942C77A5E253C2826FCEFEEE57DA2FE9DFB213A660572B29C112E0AD430F29C905372106B4D4E84C751C176C33395839404C5AFE573F39245050172FD473888E53DBA7695A1AAB37CD74AEBECEB2CCE75496959C569ABAAAA55616E40E24ADF3C3C016A48BCEDE98B2627E09F63F0323087FD1B09356809242A44B64D059D3BF4AF844BE13B7D987E8F1038E602A490071177A8FAE9A6A6B117D41A9EAB52D43F9CEAB7DCCFAAAAF8559966AF3CA4D4D5A80F0124953814D936214622C462E384C8F2DC9300A9383C049932B807CA89684866A8094A40028C4806BEBCCC769B34399098274D333BDE2EEBE6660A7AA8D2D5AF41A448342FB40769FD9636F27B25D5B9DE421B5346980CC6B1E69238A5CFE53CFF00040BC023CAD8A64FF86BD95ED9A7128C7E45835CC50204C99265A8B977214A43F3A9BD6BAF4CC4FC40C68C3C896B9EB432085312402C1A81C1D9EDF7996BAF6BEF6A7ED1A84651AC7B64CDEA74F3C80D869B0B614C881C485165D4B8E0717E12A3B5ED6C73EC37F4A1D99C2667FAC9383C2B77817C2244B00317350351E075BC452BB7388C4A529257C697A959215B720DA0D49A5E3AE55D4AFB4A7731ABAB71DA9E24ADBAA71D53EE38A599597256B52CAF97193C3336838F487677B3780EC9E5DFA6CBB0C894020256109E00AE1D580F17A8AD1ED10B8ACCE6664E272B881A1048B68C6A030E5666ABC4B3477693AB3B3DAF567DA1752D6696CF5F6C8AF4D1ADD6FBEE0414B454A42DB49F092773B9F29A4769BE1764BF12153139A61249AB1EF65A5770C28A05F97D350FB25CEA764AA3DCAC94A8FCA453AFD5BD2D0CFA9BB4AD6DDA356B59AF68F9F57EA4CC925EFE1AE555438A2C820A5CE02A717C05405CDA6DE470C3B29F0B724F845881FE998594B18958E2084252031352C1A8ED4E82D0BE79DA4C56629497514268B3C4494BB0B7D5BC636E94ED33B4DECE686BDBECFF0055E63A4559CB8D2B325D13EE95560A75CB417DDB8829E00624F5B7385BE27FC25CA3E24A7073F192A415243A44C968594BB1A150A3F215F5898ECFF693FD3B018A40593DE2181763622CFBF9DA36679A9F3ED6F9A576A0D5B9C556A5CD4B6C8CC6A6B2A1C2B57F2C210525C7167ECD884CF520EF8DBB15F09B03D85C3AB09829E89689C9632E5CB084B005D82193635A728A5CA5E2F1B33118C33152C05A9481C4FC45CB6B46A3D35B6D38ECDBDA27B6CEC7D8699ECA35DE67A5B2A60AD4DD0B0FBAED3A5C512AB32A7782EE19FB20199E6629DDB7F813D98ED8AD788C5E59869D393C44CC5CA4151513772924D75BD2B6ADFBB11F11B1B904D9B82C4A55312BF941366B5D8BB8A7A5ECE7AE7DACBB7CED8A94E51DADF69B9D6A1FE2922A285A7EA32E4308A732DA4AE95E42561D4813D3AC99315D88FE99FB33839A56BCB70C9EE8828224202878B39F7766893ED0F6867E67C5364932CADC800D01FF0026E47211D79A9CCF2D06BA99346E51B34FC011C6F2EA14E71FDA59714789449F11BA8DE099938F42E1BE1865F95E1E5CC91C3DDCA1F227858D00A017A352C34B4727C7E0B187172A6AA615AE693C40D804B6B6FB0D8986AA253ED24D45112A6DC50214A3050526410150A9E7D248F73AC4ABBFCBB1197CC4912D52D52FA8208B1D34F037AC4FC932A470778A4A66242788022B6D8E9D5ECC77B799EDC7B60469F6F43653AE7356B260DAD2BCA9350F374FDD9F1B8982F25B3226C419F2DB1E6FC2FC0CC8979F9CE152B0FDF77E66059948E3078B8BF71F9BE96B35AED83CEA52705350270AA18004D4D59C3DBD8058456B4E8A377EB05552B156B5713882B594A9C995AA4909F12A547D63963B2E7787949C261B2B92014A502529A80064A45052C00D3A544727CCF118B56350B12C2A49987E7A1FEED989A9B5ACFCA2DCCA3B77ED9748E937F4A69BED0732CB34CB882CA7256DC7154E50E921C484F7A1290A2A26C800CFC38FE7FF000772AFF51C366430B865CF52F8CCDEE659980B823E729E22D472F5B728EB595670A95932E5A9652F29B85C80696634F1F48A997589A4A751CCFF00CC562D4E3CB741BADC7945C52894F52B24FBCC0DF1D672D9672AC36170E80C1090030D801BEDD1E968E42A44CC4663326C90425535CA49B7CC6C4DDDA837A5A120AF55434C9EE032DA4ABBB571F115C9BCF3116B9E7BF9CB6653D73A5A454FCA34DC375F3E9511379980BC3CB48A900B80795F402D460C4794642A215008B7E5BEC3DE01EBB8C3DECDA3B9918A333E5252E09D686C2C746B5ED588CC04B4852828555AD2BCACC5B9F95995B5504CC72E5B7E1F84F9EE3103DE4C5E2A6853F0F116F07E41FECFD0C6B98E1857853C54E54F2F7CAD0EAC54A85E6E39C8B18F78F4FD92E3D6212661D4011C377E5FC74D1DC5EB0EAC55A81B2A662DCA39FA4DF7F8E1C4454D90B0E18815F467BD7CBD63B31A83FF0030F9729F3FDF5C5772ACAB109E1FF714DD5EC0023C58BB56F1C87064FCBCF5237BD9FDF8454B9AEFFF00501BFE1FBF23B62EF2329594FEF248BF27D37D7F2748BBE560F9DFC3C0D9B56AD9A2B8CE261572771BF33B7A4795B9DA30DB13964C40A2D887A8D46947F7CF5BC6096A6000B063CECDA06EB5F1115F660B2961D00F8942537BC03B73FC7737387196CA54942C2D7C65ACE76B6B4BDEE1E2D3804898A4BA4900B7A87B3378FD1C44F3B1CD74E7669AB726CED2F2D2AAEA80D5537C6A094A0A92D789174FD9513F64091B49C72EEDC61246213338A5853F1338043814A1D4B57A88BAAA4495E0D49525259140D770E5F7B8B92F5762447BBBD9F6BC0E06B32CAEB52BCA6AE9D872A11C21E6EA389A056DC2B885D4549909244CEE31E5DCEF2C4712FE4E15851E152404941770411B30B50EF78F3E76CA58C3E216A909EED890C000FC8351CFE34AC535ED49D82A35A6529ED5740E4E9A7AB6997D59BE9DA75A54A76525A0F155B7014F42516DBA623B2ACF335C3ABFD3B178F9AA2974A165D299A935E16FDA3803246F7DE1976471844EFF0076BF3A0A5CD5241AF9FDEB5871F656FA6A3B60F628EC4B24EC374A766CF6754BA42A2B02AA5CCC9144A52AB6B5750B4F74EB6543854A5241BC81320638FF006E3FA61CB3E296738DCFCCBE2C6E2780A94093FB53C3B905C72A0F38F72F60BE2CCBECC65430D310172C20339B33B3537F6E4C770B49FF00E240F69CD7DA86974E649D911454BAF52A12DA73AA5592952925C20A99E4992795AFE7C5F34FE89A46094B64148960924836A126FE941B6F0DF3FF008FABC3A138B4A949134AC896096649203902869B56A23D6CCB7E946EDBB32C8727CCF30D00AA3AB553A5754C8CCD874B8A7109264049038493CAF18E793FFA5BCBA54E992C4E49282C42914046C7463A87A5F78E6B9B7F54D8891296944A293C24385549B6DADC0E61A299ED17DB175FEB9D65A375E55E96FF0039A3D756B651F5E689FF003894A1710009001BC19E587184FE9EB0F830A40C425282188018116FF9023E9CE38ECEFEA5313331C27AE5296EB772A22C6E28CC5B4DA2E36BE93BED716BA5A2CB745B8E14252DA17F5C6E13090904CB7113CE4EFE7784CDBE03E4B800A5290272E6D4B121D89ADEB4F623B1645FD5CCC95874CB9A42025200E2581A731FE0B062D13CFF00F78C76CB45979ACCD74D251E00A4B66B2941822C2C276B0B6D1B6C6051F02B01895BE1F0EA4826CEA557A380F5F3B3E8669FD59AA705844D0285C85E8D4B6BF93BD693CFFE94CED32B5EAACB2A749A99A3A9A6ABA45BBF5D6D40F7ECB8D6E102078B91F23D7177C87FA70913264B5AE5174A90B49E134620EAEF51B8D2D58E4B9E7F5278EC6098133490A0A0C0D3E67BD18B83B1AED1E5CE7FAD2B97FC56A2B1A5533B9AD53F54A417F8E3BC79C7AD06DF6EFF00083B63DA3D83EC09CAA4C994A5525A5090E9A06006A4BF3D8EB68E099DFC44958F9CB9B3308959592492D5737A03D6DBC5199DEB069D0950A8E2E2E20B4F111B5AE49826DCF9FC477AC16449290854B414A406FDB5B3863E477BC404ACD70D9B14BE1C21ACFA7FEDD2CF435F18A7B506A469C04A5C22247085189322C41E66D63E51B62D797E4D230DF34B9684ACB5001E069B0FA18939494380848036B742FA3015D5AF58A8F33CE0155DC8E22A27C5B983B8B4FA1E67CA716C912A67CA9324CCE166A3F326C69E874261F224226065241069BD01E777B58E910BCC3356C93E3937BF15ED6E93D39CFB8E27646267A180C228B5D81B55A8DE7CE159396C90414CA1D5A8DCE84EBD1BC221B9A66685442828F8A4CC98F599300733D05AF13382C50278A7617BB240624786C0914DE9A4484AC24B42920A1D542CCDCF46A90DCF4AD6227515C8415149009DC8B4EFE9CC7BFE18B1C8C52267082C4358DACFAB8B9DBC6257825CD480B47101448B81666A7A8E9BC30D4D625704A8929B013D77E7E5D2FF002C4B4AC1A26BA811F3352D517634FAB57C21F485A657CA80C9147FDA080395EA1BC690C4FD741549227A137378DBF641F5C3A392CA9DC2ABA81B9F114F7AEF1212D32D4C4A58D093AF23F7F5D6120A90A0AB9BC5A48B74236F3103F1C18D9A8CA25A4A93C6E0806AFA3E9AE8FB43D4CA3352D2DC70D9BAD4D7670046A55401D2D7F4F5B1B8F761B4BCF70D3C1E342411404B1AD742F4EBFCC2FF00A25CCA4C25540CC0D35AF263E35D4437D655B29E1529E5A0DEE0124817E578063CB68E85EA71689A03106DC2011EF53EB6687B8595330A0894B28B384D1DFF003E957B086F73336F84B6CD42D40FF470290099EB11BF3369EBB61BCCC4E2CA9908330A59A9E9507969B0787ABC389ACA9ACB2352C589A8343420DBEE61B8D0BB592EAA95252824951793C4679804D8EFCBD712381C4255FF00F50099007ED330815DEBF9D4522470D3E5C84B2C150B003A369CBFC5C9C0AE812420D32BBC1027894B00C5E3700C748BFAE36C766794CB0D3319294002C389346E60E85BF9B4384E3E5A50A12D290821D55677AEAD7A873A36E63356599AD78032ECA6AF306D32169650F2BBBE232094212ADFCC72DF618A466BDAACAA43B4F94B4A6FF324003667D8DBEACF11E3159782B5AD6896AD0B713F27D08A0D2ADE12BD3BD9B6BDCF9E4D3657A5F365B8B20049A1A94A2FB4AD6C817E4662FBF2C52E6FC4CC9302A509788912D44D077881BFFDCF47A8A6CCF0CE766523898AF89239368F5F3B5B5EB7F647EC4FED1BA9592EE5FD9E2EB1901254A7F33A7A5EEC2EE0F0BAA4933D22C79E29B9EFF51585C866265CB2311DE71550AE266009A876D9F5BF3868ACD70284ACCCC426514D5296B96347A7D757B18B5322FA373B79CD78467196B7908541505D6D255F08F4EF8EDE5EEC5626FF0054D85980032542EE0A54DE3F2F56B5E1827B4985492EA0A4BE8A29FCB03FE22CCA6FA2AF523A38F3DD7AD50A94077484D132E1FF00571290E72F3E57E830D07F536B72AC1E14CC209E26251C3CEA9AE85EC393B05876B30E1242425059A8429DB91D5EDA58D61DE9FE8AE0820ABB4B440DBFF86A26FBC78EDB9BC09C34C57F5238FC494AA6E5A66105C1E3A83E29E42B082FB53289FDE189DFF173AB46EAAFA2DA9C371FFED6114EA13C08394A55DE1F52E7863AF5E76C43E3BFA94CD019694E0A64B4D4169855C351A70F2AF4DCD7795DA9C3A1DD6140DC7133F5B575AFA6B5FE75F45E6BC4073FC3FAADACE42BEC90D314A1C8DA429C1E42F204DB78C2F23FA93C50E156225AC002EE49F06497F4F4787D23B5387B258053BFCD4F0F3B33EDCE9ED4BF4777B43E996C2E9B224D734EF19EF1BAEA425B0904C96D2B24F15E39C99F2C5CF25FEA37018C5894A05C517C4952589E7C3A837DA8EC224A467B85042C043F25025F5737DF5703778EAA6B6EC6FB44D0150B6F55E4398875054389AA479C4A00B9FE6B2DA926D17E288E918EA7967C70CB25A4292B94870EAF9C135B386241DEB534262770DDA3953662509295710600A9AA2B525BC45FC1E2AA5BE5B5C3CDAC380C354EEB65B24C90788AC03311B89DC62DD84F8AB96E6B294A18847180591C4002FA00E2B436E578773D5331E4F0A824A59CA485B3EC5DFC34D8E9A066C95BA9A761BE3A8BCD37D8481B9872C36BC49F5C472BB55FEA738CA968E1492DC4CDADDC063BDCBFAC269C9E7A921E62B84F11EF1C93CA8FAD9CF8467515AD28B694B85156DF107D909527B90A8E1874001CE213B1F0EC45AEE8E4F3023BE91892B2594521A85BD59FCA1C232AC4489615C4BE136507636A91D2F4D6D5847DF892413277B9927CCC74EBD7094B54E0A6C42485248F995AB6CFD3CF5A5779721082954C4F1105C3D811C9A8FE7E158E7EB12209558D81262DCFF2FC3125326A26A50090B2072F201B4FAF487188C41527810A5252CCC090C3D3CBF980BE15F68957A927EF18D5D2400500B6E7F888D12824B82C6B6045FC63732F4C80600B6FB03BC08B72DB029408AA016B57FC5BDB465482AA1538B5BAE9D7DD21636F264C44DA4733F2B72F5B7963744E280C9A0B30342D4AB01E3184CAE0FDA5B5760EF1BFBF09E1BEF78FD8936EB1F2B37514051213525F66A79746D21708E200AABB121DFC1E961F6852DD4A6D06D17DE4738FBBCE7973C63BCE41C73F6D4FAC379B2900314860FB33574BEB6878CBEA412B24DAD37F75B616E971CF960331F4F5FE222E749410484802A6C36FADEAD7F08EDB6A0040701045BF3C31CB7304BA7FDB2FA579BFA3F378F3BE0813C15616661576D74F22D78A97340544F0DE27693D3A6DF2C5AA5E6A5293C2082756FF001A37BAC5E72C07C68E3A83CC7DE2B8CE5278556379E477822FEFF909279989C7672B03F6B9666DFA9D41BEDE16B9E0DE83D1EE29AE971E7B08AC734596EA29D441E0495950E5E11B73DF973F7C028E5D98AA695F10201DFC81D18EF4A79C5D3286A92C188B8DEFCADA9E95B98655D7AD550FD7107BA2A40A640994A93092A02D1E200ED1067152ED203384CB9A1E571B51E2EC84F1C9E009A81F317A105F6E434B691EA87B17F6AD539AE96AED10F362B73FA1EE0D0075F08516D6B538EAC15595DD340280327C3000918E059E610A662D4B5129413C619DCA8B245011AD0ED1C7FB6F9605A953254BFF006A603C079A5B8DC1A8A83B69B47A5DA2B519C9DD65D72BCE6B475414D66C1D6781B6A41406FB95CA48BA91294C18E2DAE68F98658713254152FBB5A6B2A60357049D1B50E4127504B472CC0A97976238D880F50E5AFE43C3C63A43EDADECD20297DAAF674B41A0AF4AAA33BC9A9A9D24502909096C95004AC3CAE25C25238660ED8E87F0A73F4489F3F29CD4044F96129C34F5B0FD55092364F7618126A6E23AEE4D9C4A9D2901DDD8104FEDDDC1F3371E05A3ABFEC4344731EDD326555708144E540A9429B0A054195252786265244D872F5C4C7C40C6CA380C47E9CA44DA061C24873A91B8A3BF8C3BED14AC3FE88CE511C2A4121D80703CEB4B5483A08FA26A3AE6695960B550AA86D68285A12DA95C240E14400098D87B8EDB63CB39B058E352A50410494A9C55EA4FD7634AEB1E54CFB339471CB94140A7BC29E170D73B694F26DC9892643A5DDAAA866BAB6A0B742B2E29E6DC470020FD910A20F316F973C73CC51C4AD6A329454F4F94BB7BAD4EDA5A3599230DFA633BE57E1A3B6DAEDD75AECF120CCF55E95D2A834B42DB4ED50078DDE107855CB84949111CC1E9230861F23CC33450E2428F0961720FF8F2D4F3A34F993B153552E44D52425458A7C7A7954DF48A0F57F6A4CD5171BA8AD524F8821B4A484EFB5845AC49881BF91E89D9FEC7CD94A4999873421DC3BDA963BF8C38919762D5533D570EE4DA806B715A39AE9143E79ACEA56C3ECAEB514A1EF152AFBB42CAF80F12BA14C6D7371EB8EC99476792908030BC4A02AC198598EFA6BD280C4FE172013402B9D5531A834AB5A87DD0C75E750EBACD16FD7BF515EAA86698B68427842678FC2600D87BA062EB23245CA4251264103CD893ADA874E4EE3533527B2D216C14B0A70EE69B1621EBE3D62AACFB53BA1C4968948209510A241E200FBB7F2F7462DD90F673118824CE2A961E9C5B6B41AD830E6FC9599934BCBD8CA214FB537A0BE962DB83CABECC351BAE182BEA6EAF5226E2C0F95E2D8BE60FB3699443CCE2F02C7C2DBFF0D573250490C1B42CE6EFD6C4D76A5E910DADCDD6E470B920C830AE978DEC7E43C862DB84CBE54A041097A0A8BDB7BFE7C62730F24380C5A95B3EE3DF5D5E2235F98BE6DC6522F2662C3CB909F3E76224E26E461E426A780780E5B0D89AFD627E4CB40482000534059DABB6E74F1DC4465DCC9C3FD44949224107E22FBCED8713B2CC3E350C3853B148A55B40D6B757EB1208C009A54501ADA6CCD5FC4335557B841324037BEDF3888E9CE7E1ACAECDA10070CD34B86ADFABF95442A32E54B7E21A8615DAB6229B5872AD5B055ADC2B009514C4917DE46F7BDCF5C494ACBE6618057116A358380CE19E8D4E96A5A164604B3F091ADAA6BB5ADE81EB085FA9B9922FBCD88E563BC8B79FBB0E06231086F914AF3A6BB73FC3DE1C0C3B1143535F0A0E7A1A68C79B205D5A927C2241BDCC7E22F63373870AC2E1B31923F56B4208144AD41243BEAA21E9A535DDE24B0613294788B6940ECDAF20CDF6D0C6C69398559029E92A1F9B70B2D38EA8F580DA56A3E71F28C44623B3F93212B51C74892054ABBE4D80D7E70283916D5E1D4CC5C8428A52A4BB56C35A5F517FB1898E9FECEF59EA4714C659A77347AA8A929612ED154B485294760B71909BDAE2C23CED48CE3B4390E43C6A939B61A7AA557804D43BEA080B27CD9EACE2194ECCA4CB524AD6025479114205081F9D83DE3B1FA33D823DA6B5829AA8A8D24DE5F93B852A354E56D105A5B55C9EED4B42E40E5636E471C7B35FEA7728C8B10A9070DFA8992CB06248537309203B1673E7584F159E6065CB4893344C24328BB70B36F42FD37D03C76AB4B7D18342E37DE6AAED03F83D43010A7E8D1446A038A31C480B69C8B796F6EA46396F6CBFA9CC776904B9595E58A9281C41644E32D9EA09701EDC9BC62B38EED62A505044C03621890297BBEBF715A76234B7B0C7B3A69A6D0D66D4BFE2CAB4402B57D6A8F8C88BD94A001E7726FF001E653FE26F697304F0A27CDC0F15E6199DE316BB13FE69688299DAB985FBC99C6F70297E8D5D5A8DCDE2F1D37D897635A24B8E696ECC6932E53DC25C79DAD35A1E0DC701087D2BE1E1E805EF388239FF006967A97FA9CF66E212A6F9423848FF00C4DCE9CB486533B461638904855C7CDE7AE8DD7D4C58ADE6EBCB1B0C65596E5542DA4404A72AA25280116E3EE38BD6FD245F1018ACAE7E366F7B3313882B26FDF4C0097B9653005C0B5F5BB207B4734D02CD5C1D7E9D46A2352B35CCEA7C4FAD3FE90C3696072990D848239C11E58565E117824A93889A663B7EF256D5A312FB8B7E62BF9AE753D750B21C9700967028F5D2A77F368D2A7EA957E37D20C41EF17CB7E7EB6EBBE1C24E1D54E140F2FC52FE3E110A3339E47EF556ACE58BFB0EF189A779D952DE748039B8B813D25437F9ED6C3D96990406425B56001E868EF7E9A5A31FEA9882ED315E2F4F33F6869A969D6C9875C302DFCC549173D7D3E7E787C89120904048D9C0DABB7BF53FD4E79A7117143534E8FC9FD3AC3154BC040A975D41FE8BAC91783B137E5EB1698385D381C2CCAA9085686836E4FBFD615959A620280E3350C2A59F5D77E5A5EB0D8E54BE3FF97CC9F644DBFE27431CFEE9C67FD270CA344A48D030B9F3FE6FC83E4669884D96A0372496BF3FF3053E619E33C6E0CE9C5017871B2B00F48595020F39C2BFE888A04A824AA80A5203D2EE08E5F6112387CE31003898ADB5BDADEBD6DAC6AADD4A9CDA9D596EA2C872ECFE81D05B794ED1D2B2BE056F0BEE4AE483BA4838513D9854A2A5C9C64C96B50A1E252803D38A97B35EB1252F3EC48293DE2C503976A35598B8F27A523AFBDA07B24FB3376A34AE53D16408D199ED5059773D6DDA9A914AEAEE1429414B6A9262DB74DB1B6165F68F245CCC4A272F1C5052A912BBCEEC283BA83BD29A11BD8C5FFB2DDAD9786501899C4059657117E837EB56D63CC6EDAFD81FB44EC9456661A5595768FA71216EA33AA608A27A9DB00A84D224A9E547D93693C338EE1D90F89E8C5A256071F2460F14964AC2D4286CE16400697A86A08EC9957697018A530527829C21C11CDDBCDBA523CF9AA7336A5AEAACBF36A3768DDA359406DE694D380DC292AE24851E1B8F10EB78C77CC9BB43230C12B13C6202C0243BD1AD42DE3E517644FC3622524A4A4F10B023A585CF854D79469EFD179880379B7A13C8FF00B6F8B81C761339960238252D983303B3E84B9EB4BC4163B0E2BC15B503F5BB36BE1A93A6C53E821245C1D8F5B5C5BA1DE074DB9C4FE8E76114F31F8093C24B904540D0B7E5F788C1294160A9F57A31A386234D1A30EF93FB9FCB193300A91EBFC42BC0373E9F88DCD3DF6B87CB9FE630779CBD7F883806E7D3F10B1B789F23B1FC2D1F3FD70779CBD7F883BB1B98C9EA854A60FC083F1B5FF1E671A2E630AD01E62BD76FE6374C9777A0D1DDFEA3DEFA728A93C8DBEEF740DFAC1BE11131C5C3D039B5EC694D07DED09CD906AC016A74DF7776E7B0877A0AA502A8369111E51BDB73BF2F2C678EA694A372DF4AC45CD90E750350C0D3EA7C34BC77CF51E5EB71C5051932AF0404F3200046F7FDED8432B12183292C19EA090F570FD3D63CC9817E2041A0D2F4B963420877F2A4545A859772E085200A5EF42A54921F2E70FA4F0C6D1F9E2DF839586C43844C042400414B33DAE35B6DE517DCB9822C1880C7AF2F2ADEF152672FD528A8877BD1CFC011689E83CB7F5DB18C5E512149078D2C7567B9DDF5736FF371C194B25CF2DC8A91F7E6CF6B456F9A07090A75239806C67AEDB7A7A4DB7849B21182A022AEC436AF7B74FA1BC5C32F21201497E4C777E57AED5884D70001B08DE3901FEF73CA715FC7244E428F0D4824017A1B791F0A6D175C11331043162C1B660FE15F758977649AF33CECFF005EE459FE56FA99629EA52DD692B012A6DF5A5BF182608095288F7F4C735CE32B528F1000A49571029D85C93B35CF8436CD728958AC0E213351C5340FF60B1F95CFCD4A03AD76018C7BED91EAAA6CDB2ECB731A65A2A29336A661C438D11C3DE25B4174786D3DE133D31CEF1D8732C2A581F32497B549B7A5ECE2F1C073FCA15855AC80C1CB162373E9CDDDB58B9F24AFA4A9A07B25CDD947F0ACE98729EA9D7877A965250A42086D5C533C53E1162271CEB3ECDC6553A44E49289D20A8A568F96F7729BBF32D70221F2699311315FEE94A4104F83DABA1D1C6D1D4EEC5FD9A33FECFBDAC296AB4A65CEE69A1F3172B2A1CAD282C329EF2956BDD60D92E2C8104440DA6D50CE7E2262716854B2E02B84125454DC2AF3AFAED61161CFB389588CB061D5891DECA4A8218D55C40BDB6A7531EBE64793653A529EA5FACAA6DDAC078D146B4825854CC49242A77988B4EDB55B179C62335526570144920052AE5541E219ABAF8011E67CCB2B2BC72A709DC40ADEAE3FB9C6AE06A01BD05E23F9F6B5ACCE10F34BE1629590784A385B1C2245B8426F6F5117D8E25328CA6520FCB24952AA5C955FF00F559DFA56D589718713B0DDCF7CC4A48DB403536DF4E44B375A7546B1656FA99A373BC5D39525DF119BED249BF2F2B7588EB1D9EC9A58964AE5A52E450A406F120120FF8E6CB2CC84C99B316495125C5BA915A7BD6F1486A0D50A056A2A04DFA488E62DE9E98E8784C0E1E4814492350D635A90187E6AFBCCAF00A4B324834AB1F2E75714BB549D6A1CEF527D65B2B5BE5A53615C12779F2E5B01F0C5A72F12D3312132854B6E5AFD0EFBF898504AC4A0060AA52943F47AD87561147E6DAA1E53EB6CFF310A2249D94394DAF07998EBD063A265987C34D4874A5058559EBB917AE95A3738591331628EA013A69FE0DB6ADDA2279C67C9643243E58EF02B89253C7C7CA24ED1C84CE2CD84CB82D4B200570B70914636D285C1D4D1D856B12983953B140F1254403525C9E6C0D9F666D5E21D579AD1B92A7495F9DD03DC200F5F85A31312F2E5AC072CC5A877E96A6B5DF78969381525884B39A505EDCB4AF97278D556654C920D22E5641E23C53C3D01067AFDD322D8772B2F41238E604116255FCB8E571B077893958650E1E305AE094B38B0667FBD9C07BB1D43F5AB9716F828BCA2104C45C5AF7F41720F39C2BFA1C3BB1C5A470FF00DC001B33A8EDA8A57568934F0A40484B1FF95459C825E95BEA46E2195758B0A8A5A4A82B9873BB65D7E49D884A52A22FD3A6DCB0B7EBF23CA10AFD66632934FEF58727C4D39FF989EC0A4A05D04914248F3A9D43FF00910FB94697D5BAA1D45365390E6B5EEB842508FE1B54CA5449B7F30B010073927E57C41E3BE21766B02852A5E658770FF2F7A8A9E4EA716F52D0EE6E265CA6134A43E80A4DBA758BAF4EFB1DFB456A250FE13A25CA3A77F83BD79EAA6124A55B1097824A60192239DF96396E7DF1FB26CB57C266226F0F170942F8830AFF00692396B7B3C68730C1A038989516622CDCAA3AFE2B1DA1D19F45CEBECD908ADD65AA5BD3E084A9D6BB962A7867ED0FE5BA0DAE3913CA39F3BC6FF565270C95FE9307FA8526C97297BD1CA5B415BDBC5BCCCD7082C108AB12EEEF6A55B7B45FDA73E8DFEC8723528EA8D53FE27523861A148FD206787EDA7890BF1F19040998F8E395F68BFA9CCF7B41C49C3E5F3B0411FB4A2612EE4D7E516E6C0F48AC66FDA456087FF293434CBD02883E20FA5FC5A3B0DA47D9DFD9F340703990E8C65EAE6C828A879C79E0549FEA28792B499B7236C73B9BF127B639B288566B899725414152FE6143A3B83EC86357A64FED1CE9B314B5A895A8D482C36D282DB8BB98B869AA58A64A5A6724CB1B61B1C34E96F2EA442909800CA92C711311751B462117271D8854C9EAC7E20AA6D55C53A6904F205675A9A798863373EC4AC01C67CDEAE343EC55E1CD2FD4D4A78471B083601B529A17E894948827947DD66B338E516989EFC821CA839FFC8824FD81D4C47AF339EA720A8F16B51BB8DB9D3F98D468452294A538A25DDF8D5C5B7BEF37DBCF1A771FADA22477406A05075A026DEED0C311899F32E49376726DABD7C347784AA4324C828F23001E5D0CEFB637FF004DC423F602A6152E453CFED5D79B41326AA951E20BF58E50A4A66556E84CFC24DBF19F2C06662B0F4EE896E4F50C7C793EBD68ACA335C072491AEE082E599BC6B4DE352D6CDE4A63F7E53BFECE105E718B92DFFCBA88AB104F3DB978C39E09859A85AAC01E5A9D2DF88C5A75A4856C7C847E53E9FB8798654ECDD1C53126504EE2EE48B167F1F08CFE9153182FE63573D6B6EBBD9F68D6AA865332073E6246FE40DBE1F761FCBCA59BE634B6E7ECC7CE3539730D0B1D6FD286A7C18BBBDA105454B728BCEFB1E7EEBFC236E987B2F2D20B124333B936AF3D34D7CA31FE9ED7040D75F1753F46F65B9CA84110543C849FDC7CF0F51810CDC64B5F95DB5AF3DF58DBFD39C58685EDE05DFEA7470CF0D954A6D7C3E14922FF003E5B9005FF0008C3D9187E1242AA92E1C6C00BDEFF00687787CB9249A07D8536D7A8F2AD21B1E423FB42444FA5FA81B7E1BE1F22525CB38E8FE546F53F7872701C24961D0D7C3A569F567742B284F100A067748833CF9C7FBFCB798274B0148048AD0D08EB736D9B5E90230C906CCDEF7E9AF386CA85260CC08312204FC23CF7EB783862BCC71F2AA994A34B3134DEC76E9CEF0A09006AFC9BEEF7DA9E570DAF02D34F5624A5229C0E2480257C5B7BF6DA4C9F84BE5988C4E34844F4AA5F17ED7AD06F4A74FA968AEE7388C4E1969FD3F130AB87172294E67EB0647A9730CB4B9581487B2F78143CC54A50F36A6D52850E07828010790B1E9C94CDF03879C8017F22E59E274ABBB248A872962588F1B8BC4F7677B4F8EC3AD1C4B50346049DABD3C5AD1D6FEDE3D913B30EDD32BCC73ED0E8A7CA35EA9A5BCA2DB6509A87402A212DABBB641E104481E7CF09E4DDBACCB24C477338CC9B2414212A249090282DC44B6B5D23BF767BB5EA9C2524ACF0967756D70CCFA53C447833DA4765FAA3B34D4359A5B55D15465CED23EB4BAFB8857054A428A9252A808BA40FB24EE3D71EA2EC56732332972F153316996DC2A282B1F33B16151D08AD6B526BD6B059849C5042E5965AA9C1722D5AB3EF70D4E8212E555138D34C50345A6980A06655C449B9955CC993B9FBB1D4F1B9EC9C721126524112D207159DF9B68D6D77A51DE230E95A8AC91C440E2200A1B587859B972D1C6AEBF21F96233BD2400D416AFF0010DFB8FF00BFFF006FFF0054668708993F2FD318EF08B06F183B8FFBFF00F6FF00319F7C46CA23DDFA6326613704F53FC41DC7FDFF00FB7FFAA39EFF00A92A1F77EFD0E1099340D58ECEED7D1BCF997D614461C382EED7D1DDFAC6F6DEDA0CFA5BCFCC79C1C23DEDFE6F4E9CBD3C79C6B3648014F534F7D7C07850876A2A88E3BEF69FD8B6F06FD6D80CEAB1557A7BB36DAF945CF94CEC1A95F4377DEF4D758F7DB59FB27D26A443B5DA635EB4942C2968CBCD121244EC8EF56B493FDBFA63CBF947C4ECDA44D48C4E1A64A941899A492E05E806EDE7E11E55C0844BE22B0F41C20D385B67BF51D6F1D57D4FEC9BDAC65EA29A3C9139937E28A94D653A83813B28202D453D62FE9B01D3F2DF8BB8698024CD5255F2820829ABEE40BD6C7E916DCB6721012153122F471A8B73DB7A6978EB4EB7EC3FB48C982FEBDA7EAD8E1E204B2D29F802D6EE90A99E9F0E98B02FE26CA29ACE43B3B1983ABDC1FF000E368B860F1B87494954C0C0D9C397AFDC98EB8E75A4751D2A887B29CD94429524E5D569098EA7BA88EB3B615C2F6EB038E5813F152D1A00482DA9B97E9A79C5B7058CC3A923BB5252DFF70735A6AFA68CF4A59EB6CD686B698AC3F4952D116875871B20DADE2408DF9F9CED8B049CE32EC427E4C44B503A710D7C7D9F38BDE498A925B8949B860E0877EBEC79986BC1D70A9A69EEE8929936B292414C90445F698E5CC5A2B369D84282D310EC5CB86E46F4FA3F9C5ED69C2AF0EEA29720FCAC0D1B4A56D7E7AD48F5BBD897B40CC75664343D9C966A2B333D36427EB010B7439F5A73BC400A09527C298FEAEB2236E319EE3F012664D267A0281759E260C1D99CB5A9A39DEB1C4BB7B83C3C997DE808952E6F1F761C1248FDCE2E2A4DC748F63B4776415EFB8C661AB9C34F42D842A9A9140053F61C40F010A4418FB42083E58E19DA8CCB09984F54BC1ABBF525C4C20370F9D08D3D46B1C1262E5CA4620A2684A8711005C8D350DD69AD758EC054578CBE9A8B23D3342C656FD1021CAE86DF754DA882485A815094822CA3BDE6F8A0A32B5A97326CC26622614F025B878384D41A56B7E948E5D98E678C998832D2B581C443B96356B68D5D76DA2B5D4B5685E66A78B8BE3504F7AE952825E21104845922FD2D04C729B4E599710B4B49766B0766E751E773D69B4DC22D720CC2A3C5C2E473DE9A170DCBC22A8D619D56B4C2DAA5580D1042B848063A7AFAF39922F8E9F926024F1A4AE50E2A3063E2EDA534B73310984462BF50996A52B84A83925B5FA1BBD0C75A33DCE99CB96A595CBAF93DECA88BA45AE491E91D6F16C5B71B2C20CA12889628080DBDF7726CFEB58BDCC989CBA52149F9CA920921EB4D48DA8D14CEA4D5C885F0EFE216923A5F96FEBBEF7C5E7B3B9461315C2676252E786854075A936E9E109CACDD2B3F3CBF4AEC28D4D2D41E315257EA1A7AB2454B6F786780212E2A49B5C207BC75F863A748C83072C20CB5C8530A9336586B6EADBD626F0B889136E024D1DDB6AB747D08E7CE34BA2CD337738327CAEBDD5AA424A28EA0DE3707BB20FCC5B91061CCF46558297C5331D2249009ACD411E6547C6C37E526818472192E1BFE3ABF87F9AC3ED0F60DDB16A984E59A6AAEA9498E02F27EABC1C7B7FC54A42E6D244C75938A7665F1532AECC71204E938E4BFF6CD4929035F94A987D5EBA44B613F472C1F9D32FC8B33D81607D88B334FFB047B43EA2527F88E548CBA8D712A35348A294D8981C4156116B138A4637FA95CAB0AB5265C932C870C3896D70F6200E861FAA7E0D80EF25922A15C4915BD9F77BEF17264FF00462E6301CCFF005CA72050E12E205222AFBFE6A00A1CF0F0DC08DF79B629999FF519889EEBC061D734172BF9CA0827F6B710F5AD199E90D66E6928278664C42B87FE991C3F2B9E4EFCBFCC5E5A4FE8FEEC5721EED5A93509D44EA2EB47D5AA69C2C8DC781440980091B75077A2661F1E7B43382C4A91370EA2E1333BE2BE1E60354F2AF5111ABCD81042A7858D8003D6AFF6DC98BFF21F673F678D2602F24ECFD8AB7EDC750ED4BAB00A2784F76EA488277023998DF146CC3B5DDACED3F12B139DCF4A0542424A59E8CE0B9D2A5C44163F3C561DBB952ABA851F1B1DCFF116AE5E9A1C95A14FA7322CA72E69B84A5272EA275691C80716CF17BE7CE462BD88CBB34C414AB119A6216D60264C079D38ABA73110ABED16281A2967672487F115E9AC6E7EBF50BDE27D6CB68FE8EE5965B007A36123A7481B63323033258527F50B98E0385F128EBAA892DAB0FA0AB39DDA0C58F99D55BDDC78339161EEAD8A756E2CF7F993A49DDB8584CF9C1F2DC6D63118789CB4104AA5850ABD03DBF9F462F4664BED062839F9C93677FF003E7FE5400C34900B21C0B175973681209124F2F5E584E6A8E0182240505120808725B5766A79EE7409CAC7CEC7179814CD406BAEE696B59ACF4846E54D2B5E215694C4FF002FBA1FF4F144F51B448E5B61CCAC589A901182295D3E600D6B701836FF00430B842D475009342C6A3504D6B7BBD9C98E59D4540D85875B48200E05752378006C236F96D892460B133EA1250EF46DC3B37BD28CEEEA561C29B8AFE94A917DB97AC3755EA8609FE49092072DB6371CF7F31E98929393A830981FA8DFE81BD29A43D978246ACC4588E953A7A0F188F556A171EE1529E8093065439F493BEC2D6EBCF0B4EC327049F96495BDD8174B741FC36B4108E2B0E89600410A05C11F4A9FCED7A437AF3C8559D4C1DA143F1EB6F31CFCF59730AC809C32EC78810AF070C1EE7EED0CD329CF090E6E77615A57E9FC423775129023BC0799F15C419117F873DAD8949382135819079BA49BBF27F5E51212F0C9201E163D4DBCD872A747844BD50A124AD244990543CB789BF3E57EB87E32394B002A5027FF00450BECCDEA21FCBC1A76FE1F4ABEA39F852139D565327BC03D543AF9903CB95FE1855191CB402112B843D404F2E87AF4F386B8C906511C20D5F9F9381F8DE342F562C890E0F14FF5A7DFBFBA3CBDD8DCE5069C29A0E458DF952BCB4F38E75A07CE3EC6BCAA7F10997AA564FF00C498B18526DCFD0EF8426E533459246C5B6F277A73BD1E3624F0B849AD8ECDCAAEFCBCE12B9A95524F1DCFFA87C7F7F3C31565D8A07F693CB86F7A0A13B59DF94612166BA6B46F3A16FE232A5D46A5F79C6A1023723DDCFDD387584CBB12A727880D4116A9D1BCBADE1D61D6438343BB86D7D3EFE718D467920CA811BC7145E27E516E9D231248C04C961CA4977DF6F06B373A73858CD27FCFE07F88C292BD355DECAD29E1893C5BF900489F5BE362860077640DAA5EDB8FAC26A9AA49AA29CCFB6A59C470FAD2A0A097048DEE0907DC64DF7B5FCF18135083594E2CC53AF3A6BE1AC6AA9E4D58FD7A685CB5FA436BCF30DB0EAAA1D2536F009F1F4FB33B72B4F2C2F2A782A4944BE0BB909F2D3CDFC01895CB72C939A85F7C4258382A67A3B8140C69A42043F963ECCADC2DA018EEC0599336F2F7EC3CF096372D9D8E6505148AF11B167D6A36DBC75847199248C32D4652D2003466A51BC5EFBF8D23625C6A9174CFD2BA685F492BA2524921E832B4A84C7900B917F8B34E130F854AE5CC94261218A88B3B8A52FCE15CB7133B07352CA20021AA6D5D3F3E24D44417B70EC334B7B50690A9A5CC2829F2ED7795D3B8BA0AA6DB4F15529292AF1A9B084494A07DB260911E2DA3E4E3B1BD9F9885C89D31380E225402947B872080C0BA828DB6B5ADDAFB359F70A90A54C09581A970C4070C4800E869B697F9D5ED2F416A2ECD35766BA475150BD4B59963EA6C294DC36EA3895DDA9B5A5210B1C204F0931378B63D07D83EDACBCDC1913480A40002890EA70EF50E3CCF2ABC75BC1E324E2A54B988980F183C4970599C56A5AA79024F9D7DC6A98813D20CFC2671D6C294A4F184929677D199F6DA1FA51C5FB520F808C16E2936B03CC117F81FDFE0D978E9083C2A5805D807D75E7E958C29007EE4B7A75B461DF2FCBE18593392B0E9623707F88C25295164873B545FAC721E5733EFB7DD184E62CAC809E8C2BB6BF56E861712BBB0EB0C0DAA6EDD6BE0F0A5B7AE20F3369DFDE479EDCEDD708A8197520872F7A93CAB0DA601707D2FCFFCE90B98A92926F04C11703CFF000E9EFC69DE23FE43667E7B7AEFE71173504A8EDCDEB4E7E14F03611EEB687EDA28B56E4B4B5F415A52AE04F1D1A5E217C560411C4166E3A7DF38E6399F626461D6102527814FC2B0078B860C29A8ADE3CD998767A74BE2480525248A0B9AEA39EB56D5EB178E49AE334453F7F4CFA815892D38BEF0A78605FBCBDFC85CEE76C51332ECD2A51504A4109B70A5B5DC5C575761B55AAD3B0B8CC3AC8429418B0BD0EB7A1058D37DE1F59ED3F380A087E9289F44C12ED2D2B93E678DB50DAFCFD0F2A8E27239D5265CE26E005AF437007260CDD6C61C49C46310A1C530BD1BFC3FDC0BD4439AF5CE555D4CBA5CD34F64F5497C4718A2A26C343FAA5419FEA9EBBD84E18AF21C793DE495CE90031502A5176EA6940FF589019B62A5283CE551810ED723622BCFCF522B5CDFB3AF67DD66EAF2FCEFB396332AFAC2502A292A1C6C256BB02453A20415036FF66188CEB38C8D4923325CB9693F32141F880E64D2F423AD6AF7CC8BB5BDC00264D2486A9558EB63B8E756E515767DF44BE94D4D5943A8B24CC93A634DBEB53D9865EB4AAA14EB44828405B8E25C4102D298266F84317F16D6B0642E712A0024FCE471102DF9DDF5BC5D95F1144891FEDCE1C481FEDA8A8324EB427E606DCAFA477C7D9F7D9C7B1BF67AA34A342D0D3D5679C094D4D6B85456E38911C443E55B5C0124016C53B1B9B6233E0A016B9724BFCC16544BF315BF372F1C73B5BDB4C4666B9AB99882B5ADC10080070B8700161A3B00FD62F7ADA8AFCDEA1E79E7128503FF00080084A06C0003853B03748F9E236528E440AE72FBD44DB155C80DA924F5276E42397CACC66CC5CCF9C92EE43DEFABFF001D2C18EA1BA868C90EAD5B7F2DB52A40B72067D66230EE5769702A2C6580FF00F73B3F40C352CC35F14CAD255C4B40E2B82456A6FAB730C2B10ECEF2DCD336EE9BA1CADFAB7D1C501495D3DD5612A5800CF9EDEEC4CE03B5584C3AD5C012C59EAF41767E5CBC21533CB049FDA6800AFD056FFCC41ABFB1BED433849527206E8A9553FCE56614EB21276250A58579C73C5830FF001272BC3AC209698080592ABEB5667DB9962F184B03C4940079102D52C34F0D1A22CE7B251CFDC0E6A4D7BFE1F553994308CB855F7FC5F693C6D984949B1379C2B9976FF173C4B396E0063925F8D426897DDD9A8C1DF6687285A6682274DE103F682C767D3F1B58564D967B21F65D4252333CE7FC431F689A77A9B8E05F63691CBFDB11E9EDC768387E4C1AF0AA028A13DF84F47FA862CCCD192890141960B37F6B7D77A0F1B356279967B3CF6099382468C4BCEA88870D53EAE229333C278A2FE93E7B618E23B5FDAF517FF599D2907FB5DEFA163A57CB7AC6FDEA01749D2EE5B67FADFADDE27796697D21A7CA7FC35A6A8A9383ECF1B0D3A44411FF0015B331FBB620330ED06758E97C189CC31334310E16B49AEC42BAD346A88DD38B9A97216435AA4937FF0015E512919B57BC022B6928D086ACC062969D98B00412D213C5B5A648F2C43E0654C26628AE74C2B238B8E6AD5FFF00B288D74617BC4763731C59002669D59A877D4F3ABF23B4267EAAA9D1C2DA96849D82145239DBC307E189232491F384B06350090FFE79C468C6E3CFFF009AB67BBBFBAFF986E4D23EEF117DC70C1044B8A264CF99318CA70A14C18005F4034B53D4185C6231441798A7A52A75D9EAFE8D7D2368A669BFB4A048DA483B6F2663F59C6DFA142A9C219EE40E8297D2947A987099939BF7AAD73CC31D7E8083AE91B05752D28225002F918E533B9EBE62E37185E4E02683FED2481AD2DA6D62C0DF43768590954C204C2549A9AD3A5074D61A6AF39A61242D23EEF94FE53CBA494BCBF1258976D86DE36A5AFE26B0A77097A02C3D3C798A5B41D6182AF5353D3000BA0C93CFA6D173E5D6D6DF129272A5A8025245AADF7EBF4D69019090C421C7476D39EAE59BC223957ABA94FF00E6206F7B731F0E5BCF3DF9E2564E50B15009A6C69E8E29F7B464E1A5A88F9051E8CFF5B7DE9ADE3D57AD92D001B766667C5C899037807DF07D7793939089A1D480A6FF00B45DEA6CFF00CF9C2B2E44A03E54B3D28E35F23E1F5AC46EAF5D1332E024F981703EF9FDDF1292BB3A84B34B48662070F2E9F4F387224814E1B5BC798F1FF26AC4FEB8248F1C8BDA76EB3064CDA67DE30FD1912524809BEC9D69F9F43194A149B06ABDC7E61ADED6E20F8EFCFC5CFDDCC7C2C230F5191BB30B96B379BD6AFE1195778BABD0FDB772D7B6BE02AC559AD9C514F0AC889FEA22F3B7EE63ADF0FE4E412CF1712126C47187FAFBA1D2329413FBEBBD6FB6F0D8E6B47044B86C6F0A3CE23F73D7D0BD4E4328544B40D43247E2AFA53F30B2252410421B9D2BB52F5D77844EEB4709003863AF11D86DB9F8F9DFD554E4B2D364D79240FB31F77D1DA2593FDB4F23EE9AC37AF59AC190B3D278A40F7491BEDBFBF7C2C32996DFB6ECE784D5B4B034A6DD2B0E901496615AD684DB66F7531A15AB7BDB29DDB621506FEA47EF95F1B272C4A5DD001E97F21E479C273A5098C0A5C8D4E9C98B7D630FF13A3FE72BFEB1F9E37FF4E47FC47FE3FC421FA51FF11E9FFF0014649D581BFB2E154EF2A063E78D55964B3FD96D923EE3DFD33FA61B0B35403B6E746A465FE3157F7FCC634FF4A957EEEBBF0A7F119FD3E8C1B664FE63735AA43C4953844742448F71F9FBB1B0CAD228897E694DB5D3A437992BBB366E8CC3DF5610B11A89B3092E18F27279CF33F0F3C68BCB4D7FDB05A96B1E8072D0C26505AD4F03E90A46A244801C2044471013D363CBC81DEFBE1BAF2A0C78A58DEC34BB346BC25DDAF7706B4FA78690BD8D428FF9A4C46EA3B73B49F2F293E986D332A4176403425B8454F887376D3EF0265077E1A1E8FCEF57A5DE168CF1A72C482636DC1F98D8FE7E8DCE5A949FD95BD874B1A7807D79C6C999364D251297BB38A3FF0027FC085CC668C9220A2368205BCF632447ECEC9AB06A0EC2FB69B3D7ED5D1A144AE6ADF896FE0F777A9A9AEF7FA2A7ABA99D085B8A03BBFB306DE2E824903AED88CC5617852410EE0D5BE85B96AF6B6B0EE5CA4B8243AA846AED434D9ECF53E149365999E694291539324A82E0385253C410601B9BC44FAF5EB4DCC6429414921D2F620B7277D798B51A25254D9929B814436D4F67AC7567DB77B00A5ED4BB305EB6D394AD3BABF4BB2E5454B4C3294BCF0755FCC2E148057C2DA55048558408B636ECD664BCB3324238FBA4A96912D4E594010E341C83FE5BAB762731981610B52969510169528B125D88B90C6B71E0F1F3DEDF7C9CD169A9416EA90E3AD34D2814F0AA9CA90F02081B7091E21D0EF8F67E419B4BC5E5492A292A54A0D624D00249A55C53CAC63BCE1132C278480A5000AAA0B712411A36BCF4A4697EA454D5BF503C285C252208129B1811D762371BEC3140CD6562958CE296A57095D6A433B5AB6B0D00E909E290002430B0FBFBF5A911C71A7AFC8E2D7830B97853C6493C22BAD479577357A437C2F0AA635C3816DCD79D6B5D7AC1C49EBFBFDFC79616CAF1697982656B47D2FEB41B810F33340084100301BF2DBAD86BAEF0718DC18F49B7FB7AFC70E715884ADF84B372BD6CF67A723CE2118867DB6BF383BCB8857A933CB6DF104A2B33388289ADF66E4F50631C2083405AE453F98BEF4CEBFCDF43E794F9965D50E9485A78A88295DDF0D81BCF01B5F613E9389CCCA4CD4A54264B2DCDE9A333756AF955AB79A64B214E90122E5D87873771AB063A47A3FD9AF6B949AC680D577E18AC69B6BEB6C71EC4A61302449317E104C11D714FC523052810B2902A5891426A5C92FAB5FA54C72ACE32B420AFE502EC58E976D2A03FF88B92975032FF000B3DF1EF098060CA89DAD33F0B9C432E6E5C16489B24DE84A74A015D7F8AD6B41C609525441205D9B715BD06DADCD9EF6EE83ECAB5B768350EB793E5B50FE54D29BFE2754B96830DAC8285202C02E710E48E5638E73DBAED8651934B95204C947133828042784BF0817297E17D373D5A2BB8D5A964996E529BDEFCB566D0135AB011DD2D15D90E98ECEDB64D251AB34CE4F0F1B6F36E0097089238DD053B93B1B45BCBCFD9BE69333C33A825243F090A492A0C492CF4E76356880C4E65370CC10B50A907ABEA4034FCEB511720D1FA973CA74BB9850A68287861084D6B6070931F612B498883613BE3974EC1E18E294938898A585314894B22EFFBAD4E6CEDE4C27768319C247129B60AA6D6F13E8C740859ECF74CE5CE17559BFD55D0656D80B724F31C5C5CAF7DB7C59F058F9F94200448336591FB94B09B5CD7DF48623113712A75AD4E6ACE6BB8B6FCEBBC3A21DD1F9780DAB2B39D2C1FF8A2A1CA5EEE01B9008E3E2F88F4C6313FABED08025E23BA425DD213C44BE875A31E5E4D0E01EE482C41362E4F56A1F62140D434ACC8CAF276E8F7E12B58A883E7C6923E0394E3597D9D9B29242E6289D4915BB3D01F7A1BC67BF528D15E0DCF701FCA13BFA8733AEF0D656B14FC00865A6E89A05C9B1054840222DB98F538DD1912A5926592CAFDC5CB6F625FC9A3638936770391FB8A35A181F4E60F2A4D33CA6C99EF9352A02277EEC1F7F4F33857FD3141642940A8EBC21D853C8F5DA35EFD4C3E7A3D8D6DD6ADA7F9AEC66899701EF2A94542E5050A3C3D07113B5AE7975C4A6193370547252451AD4B9676A1D7913A43895378C92E5F4FA1DA9A7DAA615A72DA350BBC1405B927DD333F9728C3BFD54D5DB88B9A72A59890799858924B98E54DD2D00965C4A4B932080EC91B1B931FEF8D485CF0CA4A8105810E2EDA5AB5AF2B883894050B35BDDFD61AEA734A76E4ADD4C83C92904F98E1FBA2270A0C02D5429241D473B56CFADBC633C4ADFE90CEE6754A248524C03BAA260F9FA8DEDD2C2F2585CB5612921041D0B3D4F2A57F31812C4CA6A2D6D8D1CE90CF55AB69A9F9A401207881E66768998B7A5BAE256564EB99520925BFB4DFEBCBEB1B230FC26A1F6A8007853CEBBED11BABD74DABFE1B89404CCC280BF2267EFF00C0E2464E44416E124DC534D74BF91D21D4BC3D89A1602C5C9F7B6F4D622398F682B6C2A1D49DFF00AC1BF9F8BE44FC70F9390AD80EECBF215BF4AFD0E94687430C4A696D5F9D59BEA2B10DCC3B45714524BC00122EA03F1BEDD207BF161CB7B3A560BCB714041B8D057EBF6A8877230E5AC69A569EF96BB0BC56B3B4274CFF003C1B5C718B8E5CC1D8FBF13F2FB3290C020B3EC69C85EBE7BD9A1D7E9940174D2847A3B1BDFCF61AC6730D74EBDC20BC07093B2D27AD890445C72B5AC31212BB38D5087DC375D5B5BF846BFA6511FB5B4A9B79D2CFE0F117ABD66F4121E1EE5811B473EBF2F762491D9DA0FF006DCEB415BB3D3DED5739FD312E025FA9BBB8E9D3A8A9BC323FADD4D59C701076F18E80CEFE5BF2B7962570BD9F24370330B30F64756E75610A230AA0FF00280D7D19ED5F77861ABD7727C2E5AF238A47CFA7CBA8C49272229BA7A52956AF8B74610A8C3916FB7E7F9E70D0AD7624CAEFE6A03E127FDB9E1C232276250EDA37E038AD7EF19EE0A86A474B5C6FD6F081ED729BC3969DB8A62FCEE7F2DBD70F139250108236A7F07EB1A8C31146D5EAD7D45C53EBB504379D6E924852F6E7C5E7D247C7D30EA5E48E920A59D8BB6CDEBE5AB88DFB824BB12CECCDAF8EC368D0AD689932A9F5503F8FE1F0C384E4D5B59DD9F4BE83EBE70E65618809171B31153CCF975E621139AD1004057583C561F3F7EDD05A7191947201D9C37A5479D7C61CA70E77E800000DFEDAEB7842E6B34816548DCC1FD7CB01CA3E604A75676F1760FB9A9A51E9ABC9720A52294D69E22AEFCE91A0EAB2F9F02E387FD43F3B45EF323A8C64E535A203176A7D69AB56FB18D2761EE5B85EF47D2F7F1F516783FC48EFFCCFFF00DBFF00DF8C7FA47FD89F2FE21B771FF7FF00EDFF00EA8DECEAA2D1571B9BC478F8BE65780E51FF006A4780FBA4C67F4E7424F8375DF979F9EFFF001827FE60F889F778BEF23DF8C7FA3F21FF008A7D7E5FA03E107E9D85490741BFA46D6F54A9E0781C1E189850E768B98FDEF8C8CA7874A3DC8481E845FCFEC9AB0E4E8EDCF7E9E1710B1BD46E5817418F303EE36F79DB91C6ABCB05004B3BBB5AAFBDEE1CEA4D18C2470E496143AEDE2FBC2D6B50B8AB9581111E2927E6267DDCF0D26654521F87992C3EAC2DCDEF194E18B12407D28C79BB17FAC3A53E7EB1B391CCDC193D37F38B461A9CA8104B709DCA5F9D01AB6B5D89D2038751B06F33E9EFF0FD459E2D6482E4111CC5847AF4F8729B623F17960FEDB1D5ADBF43EADB420BC3312141C9361F663AEBD4C3EB19CAC443827D45EF1BCD8DFDF798C33565E59CA496A0A5FEBB3D7D4C604B22C9DB63B0F2B44932BCC52FAF8AA163BA6E244EF3B6D24C6E0EFB79E2171D97F08F950E482CCFE24BD36D3CEF0B252DB82E1CED5E741E9BD22CFC8335A8A358718521748A0016E526124729BEE79F3988C5231F8104A93C3BDC5413A1F1FADE1CB52F6DEE7A7DE2DCD26ACB975754BCC1097B2ACD695FA6AEA75A789BFE732B65B24104594B9102058CE39BF6851330CB42652CCA58585058151C2A04B6B5142CD422F16FECC6293879C1CB391AEBD1EBCFCAF48F9CEF6DCEC453D8FF006BB9B53E5AD1672ECD2A955793A82785B525D1F58A80826CAB2C8DE4131CA31E81F87DDA6188C261E5A965CA02189B94809FA82DA72B3FA03B3D8BEF25D54486A9357A5013A0157D7C0C74D2ABBB052EB3096DCE5FEA480164CDEEA9FC31DA6465C8C4A5331828DC1AD1EBE66C7A686B162C47CE9048A1BD7A75F01F50212F193CC7CBF76C2799A46164100B508352C4D19EEF6FB5A1BE192CB1460487B59EB7B35FC290059E4418F43E938AB60712A4AD556726AFF4EBE3614A43DC6A3890973A58E9CBCFEC39C1C6AEBF218915CD2A04855DA94FC6DA188CEE81BD4E94F6F1A9D5AAC449F203FDFE7F942492AE249507BDADB7F93A36CD1B265814BFA790DDF6FCC7A3BA43D897DA2F5C86BEA1D9DBACD2B9C3158FD630D2824C1E3EEDE0950B72DEF1CF109DACF8C391484CC42E6A105415C251F3B535E10DEEBABF38C7769704B92172B12998B1747ED3714E22DAD4D6B66B4771FB2EFA323B56CA2A9399EA1D78747210A6D6AA3144CD726A4020A9254DAE121039911D31E74CF7E22FEBE6CC565B8A54C492A74F094D9C8A96176F66B4ACEBB4B97CCC32E5CDC083359A54D137F6124B9617A373DCC7A1DA23D973B3BC89348F6A0CF3FC499951F0127EAEED2071698B424C47879881C81C732C7F6AB39985412A9A82EAA85135362C08D34F0D8C714CD7321C4A505F0D4B03B6D4D816F2B477032AD5941A7B2EA6CA74F640CE554F4E8E053A82859AA000092AF00360247112761E58A2E2E566799E2A6623173A64D248E10AE2F92F6AF47635110F85C72269520AC5ADBBD1BC3D2B4763086BF546655AA2A4B08926CA0DA02B9DE4241B75B5E7CC99BCBF0F2E401DF715AAEAB378FF0098658C099AA50490E2E68C3A6CCC7576A924C372179A66055F5879E42531C0038B00850B82124585BACFBC1C4DA27E0A50FF006D12B88B392949B5AAA07DEA62115825153BBD4B1A7A6C6DA7D6323953847896A51B9924998247351FD7717C41E6D2D58B1FED6D460D76DB5D6C2BD0C4AE1308997C2A533E808E76A6AFBC6D6B23EF02C13B478BD7900227F0C23914B9B9671778E78F7D2A4B6B776F3AE85C6324215C212CEC4B0E5CFF000DF58548C992D7DA337DCCCFEE3F199C58558EE2B067E8C3ABB3F85B48622411CB7D7EA60759669C02549E7731F2263AC1D87C30267297706BCD81FB7E203294081777DBF3FC6F081DCC1A6C11C4205809B5A7CE3A5BF495912B8FFB59DF57D7AFE2F18187481F352DA93D69E7E9CD9ADFCF295B1E25A0127910368F537BF3BE1E4AC04C9A3E54BA74E4EF57E5B887985C3BD402DA1AD6FCED5FA54C45331D494C0C77C241BC28DF9DB90FDDC9DA4E464AB5172953D1836BCF7A57E9A43A1865392E4826819BEE0EBB9FB443AB75AB742210F7171CCCAC9022D6931E640E9EB89CC3F678AC0FF6D8EED7DF4B8F2DAD1B0C22B899ED5B73D75B369BF2787E65DA1A47178C738B83CBF5E7CE713B85ECD129629A1E5BB9ABF41F5AD2344E14872493A746D9CF336A6C0C40733ED0B6876082AD97122D0441E5F3E66F89AC07674A685048E8F6DC6DD2876A43BC361CB9E77A5697F434A75BC436BBB41324F79BFF00ACDCFBC4C723FB8B0E1FB3A354576E1EA3969F4EACF93874BD4D4B39AE834AF95222959AE43F056F149127ED913B8037F5BFBF13123B3547EEE81B427E809B914B386B343A4618306147AD1CD6C6BE0DE43788CD5EB068C8EF8DFAAE6DCA6F6E7BDBE589797D9B4A98F7551CBD5ACFFE7A3A4E1EB56E5B9B6B5E7AC43B3AD58DAFBBEEDF20DEE167EE9E5E66D36C4FE5DD9FEE81FF006AA2AFC3F5035AEFD61E49C307B1D19C1D2EDEF4B86788B3BA9D2265E3046DC6ABCEE7AFC671369C981AF776D4A5CFBEBD44385E19EF47D83BD3607CBF8A36BBA8D0A36748893F6D573FF508FDDBAAE8C9D229DD9ADA9FC72D6BE71A7E9056A6AEC18DC7D5B7E669B35BFA844477AA02F3E3E7E4388EE3D371CF0E1395049AA6BA387E9B37DF5A46C30E052B7A50FF001573EA219AA73D42A25D3B1DD5CA36267F73877272C4A480C0A8DC331157DDBCCB42A891566BEB5A5DF586B5E78DFF00CC83CA144DBA993CFA6DF0C3D4E5A1D9491E403EBA9D3FC6F0B7E9B97BFF00CA10D4E7483C24382F3324C7DFF8CFBA30BA32D4D999ABA13E2CF18186219EA77615EB5D36B5F786B733947F79224CF888FCE3E1BFBB0E9397A00140DB307ADDB9529BBF8C67F4C1852BC8D3EB60DB8BF846AFE309360BDA6FC479FC3E736E470A0C1A122890185C00F7E46329C355A95DDBEA490FF583F8B0BFF337FF0054C0EB73BFEE6241D7F4C904B2789DDE81EBEFA7285D3866360DE05BA0AFDFC213D466893C1FCC169B4813F33EE3B0DA231A8C3006A900B9B81AF9FBD03C3A120B8AB0D680136D39EF6E468C98E66836E3DF9123EF07F0F86F8C0C280A761D7DFE2B0E8480C38BC472D371EF5B473FC5120D9C8DB65728F51CFC87BED07E94034008E601FC74A8FA97D6761C10E030D8D7EBEDDB678E7F8B27FE67CCFF00DF83F4C3FE29FF00C53F986DFA73B0F21F98066C9FF99F3FCD6707E987FC53FF008A7F30770761E43F31BD19BA37E31E627EFF0017DD1F2C1FA61FF14FFE29FCC67B826EDE207E617339B213C5E33B8D951F8FE76B4EF8467614355218DC507466277E909F72C482068C43535B3BD5F4E421623371FF003150623C64FAF3133F39E9BB7386410FC201EB50D62E4B1EA5CFD8EE52DABEFF00C3FE617359C246EE131FEA8F4B4C7EF6EAD2661527FF004BF5BF466F00DE91A1C3A740FCEC7CADEF943A339CA0442C836985DBCB63EBCC01E47082F0A91D342C7C6FCEFEB78CA64243D1BC4926FB1FE6D7879A6CE923FF0030F23F68F4E7F9FC45CE194EC185E8F76205B9B3F98B6D0DE6C904BA412750697A59FF00C33BC49A873A4C0FE64F985493F80F39F29C355E5CC91476D19B6BEECED61630D55254E5A9B8D9AFBDF661E1131CB73D6D2140B84484DC93FB267ACF3B5B10F8BCB8A83F0D3E6E6E7714A536D61352787C7935A2C1D399FA03E805C24150B719EA3913D6D7EBCE6714BCC72E67213BF42EEDA7F986C0BBF36B16A0FB7D1B678ECEE8ECC935D4EF3282081DD13D4410641991307EF3B938E37DB1CB140899C25C3F85BCFDED0E30D8BFD3E225B1A715DCDF57DC97AB52F7B8E9CFD269D90AB53F64592F68F48D71BBA51BA82FB884CAC8A9752D278D43C4AB279F981CA63FB199D4CC2E3BB92AE14A16800380F4D282C2FCE3BE763F302B44B4B965D0DB7F16F2FA57E759550EBA029C04252A5049DBEC98363CC4796DEB8F6BF65F3046272F96A7015C1524BE9F7FBDDE3AC292424275A1EA0D7EE235973CA790BFAFCBEEC466758B4CC5292142B46BEC7714F5EB1ACAA2D3617FA1FAC6C43A6FBF2E7B7EA7D047DF5D912560B83424F838D74A335372D0EE727BD606840A86F2F7EB1B0B806E23D4E2465A295DEB7F2F2B9FA86847B8AD154E8E7EDF7FC62AAF7996D4CB090A2F885180600E932458F2BE375A8A0505073DCFA6BBBC6532120D4B87A7E49AFD0D23EE58D7D7B87F90F334A23FF2295968091784A12916E623D31F37578BC5A49054B501AACA97471FF27AFBE51F3CA5769715303AA6101EA6B5FE43ED5118703AA5A7EBD9D2CA567C08EE54A9F78988DA670B48C74C2A0F6342C03823C295B785A3188CDE74D4105448152E6ADF515F10FBC0E648A52C3D4AEF7A94C12A29E19D8EDF3369DEF89FC362659FFA92DC8D697A7DF5262A7986266CC25B88062E01D5DAA4330DAEDD21C9344BAA4210D27854CD9CB44CF4DB6F89B5BAECAC44A94B981494B2998961D0DBD2D5A44223193A4AD8053137A83D2DABDFA750BDACB5F6CDC098B4904DAF17E9B11E82F88E9DC331F8080EEE069D1F43EBCA27F098A54D62A0DB56FE9B3824C6F51553C7188045A0031B7404EC3783BF4D9A270D338832B6607D75F21CAEF1348E129D1C742EFF009FA51E95D2BAB49025503DD3D3CA3979DEC77C4B49904252407FBF99DFAF3D8319F8954BF9520921D9A8E487A300D7606D5D286123F9C374401EF078A6F206D1D7A5AE7E785958454D0C0356E2BAE9A68CDFC467033666214789241AFEE24BDC5F41D7CED114CC358776094B891C878927A81E5FBEB87587C996B3AB86A36A58F3BFA44909243D0BA7C5DDF9EDCA21B5BAD14EFF00E6A470837E310679DCEE3E78B061FB3EB2CE14E74626F66BBF9BF278DFF4E5DF57DFF9BB546819B6880E6FAD9D6F8887B69D9423AF22479FE63160C376616A1FB554D83D6DB7B1CDE35EE00AB7A1F5AFD6F15B66BDA0BE88870DE40F1F48E73CB9C1FBB16FC9FB30025416973472CEDE5A7869A562470522A6C69A0DFAD36143CEA220D98F685502DC7133FD53B6F10636F8FCB16CC3F6725A588439E9F5A55F95F6DA48E1C1B25AF63FCBFD36882669DA3383878DCDE784957BBD2D7FDC625A4644840712BA8B0D0FDF5BED77C7E98EC697DB96BB11107CCBB458E2FE77C553F79B7EE71268C9D9889543AB6DE1AF2A6F48C7E90E80B68000DF5310FA9ED0A7ED390449BAAC7A9131BF947C313383C8D731C22512433B06F56DCFD2978DD187E0366A790F7B539C45EB7B40041873CECAE77F506F61B7289C4EC9C8668209924071A52F7A57C0727DCBA9529D541C46CF6F01EFEAD11B7F5BAEA15097002264F1011D0EFF000F76DCE7B0D9404FEE4682E3A7D747EB630F112663064B02D522FABDB956CF6863ACD5CFC121D83FFAB6E53CEFCBF6226246552001C400A6DE27D9A6D7A391216CE433D4BEB40CF6036A18607F54BEB8974D898BF2EB24EDF893E78929796C9154241702A18EFA7E5FEF0F24A1449F9438B7A787AF367AC34BDA99C5132B248B595BCF94C7AEF85060D2094A6583762DFC35B975DA1C194B37413D4084ECEA0717C72E447FAC5FE26E6DF75BA6A708D6433BB8E1767DEDE756615A083BA57FC3D04277B3F59305C1CEFC5BF3F21B0EBE9B6105618B91C0430D8ED4ADFC1BD088C2A5A9AA8F4FB8722DF686D733D75572E584DA473262D3E5BFCF69DD18750154B73E61AD6E553585A5485100A505F723C47DBDD92AF3C5DBF99E9D4EDCBF630B265115B9DA94F7D75858E1A610CC5FD3F9F2109159D3A77583D25447E9E97C2F2E492C40A92761ABBFA54F846061542A5FC74E77E637E509579CB9BF797F5FD679F2FD70E44903FB69B381F7FABC6DDCA989AB3EDE9CE386B365A8A871DF7BA8FE07CF9DFF001467A120064B72B8D3D3A529CA364E1946A01AEC0F81B10357B46EFE28BFEF3EE3F9ABF0C35602C1A1C2308B001677DEFD1C68E2135466AB1C32B3B923C407A49323E1F9E08769C32C81C496E9AF3B8F6E7AA6FE2CBDF8CDBFD53F120C0BF909D873C10BCBC3B100A4DF5177F1A3539E83683F8B2CECB3F1302DCCCF3371CE647492359D86528D05A9AD3F3E3D2907F165FF0078FF00ABFF00BB0423FA49BEC472335593F6C7FD5FA9FBB0460E1660D3D3F98528CDDCFEF1E6388FC7D2FE57C118386982A416E9FCBF942E673654125520C589DB698E636DFDD717C379E3F69F0FAF2FBF5168495865F11A1AB3163CFF0093C86CF0B119B2AF0BE9FD463CB788C335817173A6FF00CFD7EBA9C24CAD1C8B50FA7F10A7F8BB96F1CF520FE67F7EFC345A5DCB3034F2B5A82BECC6BFA69C2C83E00FE217319C2C412AF7C9F4E5E5CA7A473C362826E0EFAF4B535F1F078C9C2AEFFF00ED3CBCB43E476877A7CE5C9BAAC77BDFDD049B4F2B7ADB1B499449F9833EFA5F57D79C379D87527FB5DF6A03B59FEBA59E251439D2ADE3B48983C85AF33D798FBB0E4C8960114A5AB42EDD29F73630C66495281052433871D7AD76FB44958CED61248724881F6A08F74EFD7732047945E2F0C1493C29A54E9E3CFF008D618CD9132AE9248A06FA790D6B6A9AC4D34E6A073BF44B877B99116E9CA47979EFCE9998606612AE14B8360C49D795296E8F11CA9337662FB0FF00034E76A563B63D98EAE0CD7B54CB5857D64A123C52045BC5D2C7A8EB7C735ED464EB99865CC54B628428B9005FC2AD66FA35232795C99E8F9480541B4F57D999E96E663B0DDB9E9A4EB5F67FED074C5434568FE18D5435C49903810BA8F09DFF00A44C1B9F5C79C50A548CEE4F092026629C02CEC59E9F6DF68EE7D859A4F03BDD2D6A5B7A59B63A74F8FECF1B6E92B2AB2F4A4257499857B4A064484D4B891D62C2D6BDBD4FB1BB15989465C80B53012C30259E95E6DCFC6D1DE904AC7117AA535028C05E9E3F9864539E7246DF1EB1E5CF0F67CC99889C7841238B9B33F900DB42A94D416A7E1E3969DBA813111D7F7E677E589944B972E5A12B676ABFBE6478187A9040480CFAF37FBE9D2371713BF14FC6F6F3F2C39425240E1200D83726D7A46EA42920929206BEF58C1EAB4D35338F012B4A9BE131600A84DE236EBD461963D69952D550686A1AB606F570ED6E51893C33961093BFA036F7D23EEB90C0E9E222361023FDBDD8F9E53E52438291434F478F99099412E05069ABFAD2FF00C0A4284B29FEA48F7807ADBCA30C912439A3541D3C4BDC68E7CA3612D9FE6356A36CDF8F7AB830F25BB13007B848F3BF97BEC39E25654A25258508A5DD9EBE1CFD8D0E1D157653DCB6E051A91B1598B6CA499049E9E198DAFE9D77B5FA6C704A9C40A80EEF5BD49F0D3F986D3B0729D252800005C52BE766F76863ACD46D37BAC022CABF4DAF20CF2DB79C3B93922D740E75A7A786BD7A88D512C22890C34034AE9A9E9EC45ABF59B54E2CA0419B1503100DF63F77E789AC276754BB8552CE2D466F7AC3C94859B17D19B5A52B51E9CA2039A6BE80A01404743EBB7E6019BF2C5830BD962B22A5AAC081F6D7973BC39124283901BC86EC6C3F07AC40B32D78E389480E9313693FB8F58817C4EE1BB2490589D469CC9F1A7BA0791C1E193A21B7D34715A7DD8B96315F66DAE570A3C6AFFA8DA37DE48823F41CAC983EC8CB05249AB0D00DAEF4D7979C48270E4B101B4DEFE3AF28AEF36ED01C6403C6A13360A304027A411E738B7607B2B289B03C2DA313ED8FE09683F4F5B5CD00FA50FDA95A33C57D99768CE92A951833BA89DC1DEF37F3F741C5AF0BD974060C2806839834D5ABE02D19FD393702DB0D34707C07E2209996BF7564788C09B137E80EDCAFB6E6313F87ECECB940B84D59E8DBD0DEC5ABD76687125A43850BEE1FD3CAA4FDE2215BAF1EE4AEBBA8F4F5B49DFD791C49C9C964B03AD68431246F7A07BFD21E09C820820176D486D6ACE2B7BC43F30D542BF87896416E600279FBF9F4DBA4624E564D2D92C052E4B5791F1B56C3785D130711A38A11A38A6BEFD2B17AACE512789C37064F118206DFEDC879E24E564928814018D28FA07A73D6DE10E51310481C2C7CF73B1F3FE222F9866C1C4A421C208E52473BF3DE2779F4DF161CBB05270E829094EF6150FE22C346FC6B36499EB484D00B902F50DB1BEBE2F0C2FE647FE6CEDCFDDD6D73CFEEDA5D12E4B5427A33B7B1E1607487D85C190A0E9E56BEFEEEFE24A2566409252E12044413F70EBE9CA63094D9485060863FF2A02C1DB6E94360444F49C1800028046C5A8DCDB7A8B38A184CE660019E33111F68CFDFBF958FA02488E99809ABAA490C6A03DEDB6C5F5D6BBEF3A42024FCB5FF003AF2DFC7486D7F304DA1CE479F49E9FEF6E587B80C2CC90E26329CEAFBFF0022FE15B6F8292921C867715EA77AE9BFDE1B575C913E3B936379FBFA7C312BDDCBD852FF00CC487E9D1B0F2FE634FD787FCC3F13FF007633C12CD78475FE633DC27D83F984CE55CC8EF0DA48B9BFFEE1F2B7974C704BD93B697FCC63F4E8D8797F309555A0117F9917BD8DFCB0D67A521D9205054372F1B75BEC214972057852FD037D2B1A1CAE17857A7895CFEEF4C3585FF4B47E1A1D77BDFE6EB094D7264CAEFCFC4BC107E99A8CDCBDAA38FAF23FBFFF0072F1B71AB7F41F88C1C283700F5FFF00EA37355C91C442F988B9BC0EA48B0E64CEDCF094D2FC3B87F173EF4AD6B0F30F85490C523C869E6F4DE87CE395E62019E23FF58B7BFF000184A1D7E8D3B0F249FAFF008848BAE0621479F318236FD2816007BFFD5187D70FF71FFA8608CFE9B97BFF00CA33456024CA80FF00D4411849603D2F57F48C190137D793FDCC67F5B1FF00311F2C690774397FE23F307D707FCC46083BA4F2FF00C4473F5DFF00F553F1FD7041DD0E5FF88FCC29A7AE09E225C076D898F7C1C27334F18061D2AAB024720295F0BFF887046629DF8933B1BABEE9FBF09D3DEDAC67F4C9FF0088B6C9A7F3CC79C2D6B304413C493B4C927E026E45F6F8E352949B814BFF003FCC63F4A9FF008BF4F7F585A9AF4C8F1EF72388FE7FBE538C7026FBB6BEEFFE231FA245F847D835986C75BBF285CCE60949FB569E4ABDA76B8993EB68C359E0241005DABF51B7BDDA23F17252904049200AEA6FF6F7762FD4D99A2C02F94183FAF59F7FB8E1A4462F0E922CEF534F1EA6FD6DBD5F18CD5278471C7FF5449B4F3F9DA2E3D304021BD7686D330E0B70D80A8A1DF707CB9C4CF29CD5B8038C8E5B91173E73720F5C2664CB533A438D587E3E90D558740BA4575DFDEACCF174681D52AA1CD58097152A75B54955E10A06C6E248FBF9099ACF68B29973F053D6123E596B7617749FA3B57D68D5CCD70E04D96426AEEE1A80355AA2BE7C8DE3D7BCAEBDAD5BD87E78F00852AAF24AA055024F734CE8B98F2B836BDF1E16CD248C276AE4B025299EB013A1E25746714BD599A3A576397C0123F69F958B1D3C2FBF9EB4F8CFED532F465FAEF523688FFF0036AE040B01154EF2B44DAD138F4D64B30C9C2618874F1212487E40E8D4D5CD01DC18EFD964E3330F2C7EE00539B8721F7A1D686DA45798E83964C9665924076BD34A1BD47D5A2591281E9BECD6DB4BB6AC6353AA03867CFF000BFA61863713F3B0535695E6E050F869D61DA249E20402C2EE59C737D4F946BE31FDC46FD7F77C2B2316521B89F4676E4ECE3E97F087989522649EED0C54DBD453AF4673D19A1592D5552BB4AE186D650A52F6E1E054C5C03E2888F7DE711F99E238A54C7535CB3FE4F98E9CE2264489D267A2784964F13ED5BE8D4BBB7231F79E8692483607CFA4F33D3A7E78F0CCE0A2753F8D1879FB78F9A610E03D0D5F57DB5D2372DB40493C42C0F3F96E709A10789238581D5B6B7B3F78381B9F2B79D7488ED6D4A5A053C6011100902237E63F600C4D61E4BF0B8B81A5FC2DADBAF283839BBEBB7AD5ED10FCD3352DA13C2B07ED490409BF3BC413187C65AA531425478B46D34F3F37F209AE5DABBD5AD6E715467FA8D6DF170B8044ECA1CE3A1DA62C7AF95A7300A98E01944BB35DBD0780A8F18C26497B39A69E3D4DEDE622A9CDB58AD9FB6B242A62E6DC26F6E9B7BFC8E2FD96E144DE10A9646EA20FD00A5A9FE21DCB96524937D2C7D2B5EB4E45A2BBCDB5B92170B55CC889B83D36E5E5B46DCAEF80C9E5A824DA81DC74A0F1FF0030EC218543BDCE835EB53EE910E7F5B59414B226D04EFBCFC62F137C4D0C914E381015CECCC76A3DDEF7D054449E0D245746D859B969A575F288566DAD93713E97B7BED7F48E773890C364D3D0CE87E82BA519BCC5A8D41121107ABD522AAE49841E6779DA2667CBF238B0E172F9E900041F6E3F3AFD60F7D07B6888661A8132A957B819F5E401F77E589FC3E167243841A5A8CE5E9706E7D7AD4888D4E7685127909DCFDF079FC2313586C0CC9C3E6490ED52DF4BD7931AC67F4C673102A7F8E63C3F9788B57E70832479F1413F7C4DF78F98C4ACAC9144BF16C76B3685BC7A54C2C8CB961EE096621CED56356BD6DADE22F559B990524A4C192491F1DFCF68E9E92B2325208F999E868FCADCE9CF5687A9CBE651817D6FE0DE218FD1AF1FA8CE1641959581EA2F71CBD3E3CF0FE5E4CAE22126946FAFAECDD6B48772F004DD241E86B7DFECC7AEACCEE6AB51FB479D898B5FAF9C6FD23AE1C8C9E63808AEEC6A0BEB5FE3986896C260121412450B5C1B53FCFA8BC36BF992C09E226677F48E7CBF0BCEE4AA9CA2626A2B6DCEED4A9E9FE1A7A4E050006482C5C161AE97D35AF84256B3155F8D5BCC4F9CC70F5E5B5BA61C270252C5436FF17E56BEB1209C2B248E17DC8D2874171E2E7C2BC3B5CE411260FAF59DCF2FDC61CA30E84B3801AF41CAB47DBCFCE23E7E1493661BFB1B37896A351B2A6BD5E0B9B024816B1F78F2DA2FE77C36C5A65A47CA41248DBC79DB6FB554C0E1EAA090E297E67DB9D078C36AEBCDF7F2137F84DFDF862E6EE5F778933873FF0017BD5EDEDF9F8C70D57295C526C47F70DFD27F7EB8C3EAFCDFEF07707FE3EA7EFE5BEDBC60BAD11BF3B78B7F9CFEEF8CB9DCED7F483F4EAA7CBFFBAD6BD7E9CE13AAB48820F90B8F91F3F3239EFC9A4F533EAFA93AD3EFF8E8ACAC39049663E07D5FDD7C343958B04EE6666E39FE1FB3869C67610BF72ADFE9F9F7B084A6B960917F88FDCE0E33B080C957D36DBA8F7BDE31FAFA86E63DE3F3C1C6761EBF983B857B03F31926BD5E220DCDA26479EDE42D84D6B347ADFED6F661C4A94A4D086E647531A5CAF72E01168237F9FCFA634EF03B51EB47AEADF673D690B776378D62B9CBC903A6FF00AE0EF361EBF7F380CB1A13E35FC4726B564CF11F404C7BED8CF782BF2F42F6F483BBE7E919A6B14641519F7FE53F2C36985CDB73E7FE20EEF73F6FCC67F5A3FDC7E7FF006E138CF00DCFA7E20FAD1FEE3F3FFB7041C0373E9F883EB47FB8FCFF00EDC10700DCFA7E2334D6A93B1E7CC9F2E91F3B61399A78FBF7F783806E615A2B960DD56F53F7613804B7DCF41A7BD7D216315EABF885BCFAC7EF6C101975D41E63CF6D87942E6F31541F189D8127D39F5F33D7041DDDAF6F3E6397B78503317131E3F2DF9CD8F3BEC3973B9C359C6B4B1FB010D71320936B8EBCB507D1FC21DE8F335DBC44C45CC4CFC7A7C4F5B611861330EE9735D29D46DE0F73E7477FE28B0A49E3DBFD44EF1BC47CB6E7821A2F0B47776D36F51F7EBBCB329CD96384F1DBD76F9C8FC799C10D26615DDEC76BD1B57AFAED13FC9B54FF000DAC61D51528CDB8495472BC0B5CC826DD31AE324A6665B8B2A0ED2D4C06A58BFA3442E3B08A98A49093F2B9A3F96AE6EDBB7378F6CBD997355EA5F67BCFDE52A4D3E5758949245FBD4BE9304FDADF604FC71F3FFB649123B5982401FF005712B04805CF0A9EB4A6CDAD6D13591CDFD3A892A090180A736B6ADADCD5F78F93FF00685CA9CC9BB50D594EEA5499CCEA1490A052654FB8A98224CCFA73C77EC19E0C34804D3BA43518B848A7979DE958EFBD9C9C3138292C6CE14D5B9A3EDD628C2A80241133F2FDFBBA62D597E294994B00B16D4E95F5B5766DA2EF2E41090598F5D2FAB5FA5234B8B24A523ED5EC0C9B6FE1FD397C22A7628AE6AAAF5B57EB7B33B36BD61D4A944CA98487B51EDA6FAB4042CA0AC24C0DC81205E37023E3E784BF5CA42CD4802CC5DFC896D0B188C9638B1291A150B8B870198E97F1AC29CBE9DCCC5F6B2C485F1573CD348E0495ACACAC25094A520A89248989F3BE2371D987121614A77259CDB9FB6EAD169CD25CAC165CA9C0252B12CA9E95A55C9B3E9BF847DE977E9FD93F963CA8403711F2A7BBE7E9FCC24AA7C04D8C588DFEEDAFEA396E30BC997C4A7091422A7617F0A0D2FCE0EEC6F6B53F98AE73EA829E205467909D81F7DFAC98EB8B460240212785FA8B1D797234783BBE7E9FCC55B9BE6EAA44A932541C993C46D137079FC276B0DF16DC1E5B2E7FEE48A33D2FC853CDE977730A224F103A9341A6DD5BEBD04529A9B3509529C0FA9B324D8157EC7C3DC716ECBB219331490994058D5ADBD773E3CE90A8C314967EBC9BF3C9C7845379BEA072B141B455F129B24429B080667990072DF68E5D6F381C9B0F2582C25205CB8A7875F6EF0E932428DFDE9EFD451EBECD735CE5BE25165B0D5E1C0F34605EFC324C8FBBCAD8B5E12565C3E4EF0120541A35A84BDFD97870891A31A54923DEDA163B1A4429DCF5A794B4D4D690B444212D1B13BDD3BDCDB96F7DB0F26E6395E5F45CC9638AE4A817B73F7A521C0989902CFA0B7A38F74A52196AEA9E767EAD4F5954397754B50A99E9C2855FD2DEBB9CA3B5393CB0077F2ACF5501F53CA9A5B68C7EAC3BB73AD9F62D7D6C075786FA6D3DACF3F5AD19469CCCDDEE48EF09A5A96878BECC153402BA7C49EA17476E32094DC588C397D0CD40A8AEFCFEB4615C8C524B92083E9A569E74AFD62454FD8576D19B81F52D2554B04FF5B896E3D78C00236E5D779C253FE28F66B07FF56749177E15856BA70B92E2951E942ACB9A8501C4BD580614F7BD7D2AE87D927DA2F30095536892A09992AAFA54403B1852A779E56E7883C5FC77ECA61292E78249A32555AF20D6D5F95ED37815A12ECA490C18961A787516AB52EC81FF00637F692BCE8804117FFE25487E1E212379DB9ED84E57F507D98A033A9A517BBD68DE0C74E71312D72DCFED1677228C3E9E5118CD7D8FBDA329921751A114A4C1852330A7544033210553EF1F9626709FD40F67669E193312F40428A83FFE4297F57DA1E266C9B28A5EC198B1E4DE75FCC5539FF61BDAB69C4ABF8B68FAF63BB9E20DA16FC0E63F96850BF53BFDF6397F1B72650752E53901BFDE4F8EBFE3EAAA67C80400C40BB306DADA9315366990E774CB08AECA735A22991DEAF2EACE111BCCB2058F3DAD0716FECF7C51C97342522749413A77A9513CD9F7F4BD2CF244E0A53A025401F992E900DB52DC81AB1E42B11475550CB8505A1992447DB50A45373B82954131E9BF962D67B5997B3C89F2C837F9817D857573A69E313B875C9984F11EE82438480540F881EA28FE70D9993CC3686DC7AA0B0E89EEE9D282B0DFF702B13C53E77C2A7B41859A974AD249D5EFA52A29B5EC3C64A423BD05405750FA581BED5E9CE1BE9B397140A1CA9E200785250124F2898916EBB79E3538FEF090920BB1047A519E96FF00308CEC27CC4F0B39734A1E5B8A0A5DC51AAD182AAD6A2A2A6CB69DD04DF8BA9DAD7E57B72C379B356A2789C27A9248F3E7BBBC2B86C1A407721EE386CDCEEDB75BC2672A81BF17A99FC62DFAE10E24EFF587BFA54D9CBF43F47FBFF089DA9008E131D60FCEC09F960E34EFE8631FA54B7EE3D58FE6FEDA357D689DC93FBFFD3838D3BFA1FC41FA54FF00CBD0FF00FC51A9CAAB893BF5E71EEE56E5CF7C369EA1422ADE1AFB3E3A43997870E0B3F890CDBB937F6743AFEB3E7FBFFA70DBBCE5EBFC438EE07FC07A7E639EFC281926DCA3F41EFF008E0132A1D34D6BFC41DC03640F06FE613ADE4C89F76E07EA7DDF760332EC3A560EE07FC01F2E576A7BE75E5AA8826F3B474F41B981E9EFC379AAB134049F7EF58048E7C23A3D7C08FCC6FF00AD790F9E11E34EFE8633DC7FDFFF00B7FF00AA13545403C3CBD27FDFE5EFC1C69DFD0FE20EE3FEEF4FE6137D60753F13F960E34EFE87F10771FF007FFEDFFEA8DEC5481C5700F9C9B7BFF2F7E3459059B478C89203B906DFDBD79FDFF951F5AFF5A7E18D236EE872FF00C47E60FAD7FAD3F0C10774397FE23F307D6BFD69F86083BA1CBFF11F98D6BAA16950E7E5D3C8E119AAE16A3F8FBF6F183252756E80463F5BFF005FCFF4C23DE72F5FE231DC0FF91F211B1BABB9F1FADFF7E7CBDF83BCE5EBFC463B815F98DA94D6B7E56F58588AB103C5BC45FAFBC6FEA70779CBD7F88CF703FE45BDF9FA78C2E66AC492553EF9E9222D3EE048DF1A124DC93D6119B87245F8B9B337A9A7BD6AEB4F5A9170AB7979ED79313E7BFC318866B9203862DBFE43D3F8A43B335C991E2045AC4DFF003BCF58B804D8E0840CA150534BBE9EC6DE90FB4B9824404A88E978F3B79C580BFBB04365C8493C4CFBF3D37D4ED5F1AC4BB2ACF9346164C2839C299578A0191FD524738F90D8E179CA6CAF16583896B63B0E13A589AFE758426E042E5CC5D9858815EA6E0B79F808F71FD95EBCD0FB2ED5D6344949695DDC13FCC0E54282E4CC90248BCF4137C7843B48944EED9E012520A7BF9E56C43020B8DD81E4DE8229B3E7FE96690E032806D5BDB9E54A068F05FDBDF432A935AA356D3B60379C3CF297C090005320054C08B99DF73D648C7674C9270F87521354A45BA002F4B6BD3731DABE1D6681695CA597E3E16F326C7D1AA7D63A00E38971BA5B01F6828C7398FDF9DAFB626F0292A96AD29577EBEDCF5BC777932C2A47117AD46D5B57434ABD2FA3425A86DBA37DEAB026A14128A74DC821638551B83123E1CAD88F97294664D5317AF9543B7315A9778D258E14AC3BBD816771E7FF00768DD636D3A2B1861CCB1100D47F31E5282645BBC4DD5B589DA76B622F160C849AD43D0EA1F6205A86F5AF846CC42D13BBF2966502036C58BD346B335F778EF6FB03F600AED63B51A2D479CD314E97D1AE1AACC1F7507B8716A6CB8CFDAB28871B1B489B5C462A198E35499530A13DE2E89097624AFE5706F477A7E04557B71DAD4E1300AC31980152140A5C38614F3A07B1E51F58E1D3CB88FCFF001B63877007E5B7F37F778F9F9C01DF4DBF9BC25AB74847F548D8111F8DFEFF00961E48284B0A51B56BF96BBDDB918024026DC872F1BC5719F3AA2493369DCC1E87E3F23CA3169C04C92809798916B9D35F75FAC67853B7D62A5CF90A7DB5109714B483C21B6DC5933BC84824440DF165C366F83C1DE6254ECE1C353A6BD357DA364B4B2F50D7677D47DE2A6774EEAFCEEAFEAF96E455350951294A9C4A9A499302EB40817BEC79198387A7B6F83921A528248A30587A72A0AD7F9A43849E201D56E5E76B747BD8561E97ECAFDA4EA84B0E2E81BCA1944971D152C2D442AFC45016140813637B7B8C0E2BE2B4A94B3242D7C7503E55106B4AD4791EB487680901DC30B546BAB5CF2FF1132C8BD89F2547039A9B582D6E0238E9452BAA13CD2548570F94ED88BC5FC58CC65ADB0F8733127FBBBCE137D99EA74A1B5377085201254B02C01DFDEE6A7A98B4F2FF0065CEC474EA52ACCF4FFF00885C708EE5DFAC5453776A4EE4A41F1151E4623A9338ADE69DB3CEF3CE032E7AF03DDFEE1FBCCC7A5EC1B938BEB0C71B3004FC81FA503EDD39D3517BD8F92E82ECEB4F84FF0002D0F4AC70C7097541FDAE27BE428CEC7CEF88539AE70B491373198A7B8019E8D707D6FAC46778ABF057FF005505B4D1EC6BCEB411384559612114F95E5B95A2200465F48E97472921A0470F29BE21E6CC2B5154C9D3D4A15713A6001479057E5B771194CF9B60199EE7C4E8E437D2F48C175599387F969A65CC7D8A561991063ECB698FC3EE406214876338D35993162E373B7AECC20FD44FA1A5A96BB9E6F6F510980CD883DF2C5288F070A52AE3EB3C3B797320E14E29F8A002261436F523CEFB1B6F511A2B1D8894411C4C0E85B8ADB786AD4246D081F4D692AFF3EBB5FF00E198DBDDD6DCAE07A6F2F05892586206946035BD6D4DEF7B46C337C4B8002B954FD7D98E292AAAE9839C59824154471D325CE28F250300758BF2387A301895103BF2E3FE25AECF40CFA43C4E6F8A21DD7B357EFF0088455B995528101343524FFCCCBA9940DB9F1B4A3E9B1DEDB4C94BCAE69487C4CC06C7FDC56CDFF2F4737D459CA33AC5ECAA5CEA7616D2E77A3C42739A2CAB3E6CD1EA1D2F95E6748E712168451D1D31095483E36D90AB8B4CCFE2A4BCD330ECE2BBCC06227267AAD302D6BB16259448FB75D657079BE216405F130AB59EEDA8F0E7AC755FB47F61EF67CD76CBF579436746E78F0528290AAAA94F78648F0CA5BDCCEDCC88C5D725F897DA494A40C499B8E24D57C7DD700DDAC76E9EB76CAF3C521011DE84248658500A2DC8A99A9B75D23CF8ED5BE8FAED3B47D2AF36D26FA759654C079C77BB0C5338C34992986CA94EB9C491C8488913271DD3B2FF0014F033A748C2E3712A953E610132D615C20815759F97CCD7D0DD3058CC3CC40216971552C2C3AB88B8F968CDD181F38E8266B95D4E4F5CF65D9EE4F539457D3A96829A86DD6C1520AB8A0AD0849888B4CF58C7A4322CFF002AC44B96A5E3651700BF12542A0355D9F4DF7E73F28C9989052A0A49146A934AEE450727BC449DCDDFA975CA7247774D01B200D9513717DADF28C5AE74DC2E2403849A89CC3FB0BFD09ADF50FA6912299094212B02AA7A359BDFA084AE54AC78BC50373B7DE07E186852A4D155E6CD7AFBB429DDA9BF6D3C1BA6DCE113952A26C6C6F63EEE9EBFA6D848CD40B9EBEFDDE8F1A8049600B8A5ACFCFEBEB1A8D4AC0B98F327CFE1B5B18FD44A667AEEFF0068C9045FEA2353952AB024F316BF5F2F220F48F8B798B4ACBA4BFBD6A76DBF10B4A415548A6845FC287C7D79E935046F23D47FF6E112A22E9F5FE21C77279F98852C544855FE71F801F29F3C63BCE5EBFC41DC9E6DD45FAC62B7FA104EC2E3D4DA3D718EF92ED4715BFF001E9783B93EDBCA349A829224C1BC7C0F41FBF38C27326254086AE977BF4F7E31A2E480D4726FCB6AD1F583EB47FB8FCFFEDC2109F75FF6FAFF00307D649E7F13F98C10775FF6FAFF00307D60F51F11F96083BAFF00B7D7F984EFD491C3E2DFA1E9E83CF09CCD3C7ED1BA255E8478FE49F7D213FD68FF0071F9FF00DB84E14EE4F3F3107D68FF0071F9FF00DB820EE4F3F3107D68FF0071F9FF00DB820EE4F3F311B1156AB8E23F13F97EFE184E669E3F68D552942C09F23F4F7F6D9F5A57F71F9FFDB84E35EED7FF00131B9AA95C9FB5620DE7F21F0B7E4463815B7A8FCC2D455192788C7333B7CBF3C60902E5A0E056DEA3F31B455994C2ADD419DBADC45FF6318E34EFF5D6353254AD3AEAFA6F0B98AC54C71729E53EB1791F1913D2300524D8DFAC21370C412149F16EA199FAFD61C45728100199BEF7046FB0BF2F775B8C6D0C662129714BD7EC6F4A0FB43C51D63C2150AE198920DFF2837F7C8C10D7BBE3A243D68D424DB7A373D2241475CA75496388953EF30D260C905C702009E57311CE6DD433CCF172F0D96E2FBC584032D4CFA963E3AF4874890D2660586F94B02CF6EA3C74173B8FA1BEC932E1D9FF00B2B68FA5ABF0AEB692B56FA17214A2B778DA2524711FB408B1E51D71E199934E33B638F2E5430D3D3DD96268B25EA37B9DA38EF690044F4F0D52565C8B33EDCBCB7D0C7955ED5B912354691AE79C6F8DCCA3BF5B64265403EB2AB089DAD69F3C77CC34A98AC249F94FED0496A014F07D3CE3A3FC3AC54B44D9616B01D40124B061A07F7E11E28672E2A8A502789B75C1C306603846D048B7DD79DB137815CA08582B014CC4539D6F4D6F1EB0C1CD953B088E050AA400072035D35362D76DF3154DD453A2A160ADC6C0EE85E49912600331CFE06D8D1084A4AD4A2CEECADE9A7B6BD223CC89E678E142B81EEC5BC09D0EE2D7A54C4A74DE9FCEBB44D4791696D3ECBAEE699C54B6C90D24A9494A5C6C2AC0181C04CDFACE2A39E4E9638D226A52A6E27BB302F63B0B18DF3AC5E0F2EC0CCC4CDE1265CB2E95109F988212C4EC40FBD63E95FB2CECA72EEC1FB12CAF4165E86D8D5B995353BFA8AB1290871402D152DA54B1D1B5A9278546DBE2858291331F8F5620712B0F294D862D4512196E1AAC46A3CDA3C21F113B633715984F9689A5654B502534012F40002CC07896E91EA7B1926655447D58771C5B712527DFE2B981E43A1C70B9B89080E54C0D5C124FDDBCDB511C942944D0FD21D11A1B377071E6199B6C22070028412AEA0106C3DF73CAF88F566409694A5129FDD460281B91A335E90ED091424373BDF56D3C39F8F1FE09D3E811982D35A6E1512824F9413CB78FBB1AAF31C451A628307BDBA907C74BDE1596CE695F31BFE3E9B46EA5A0D0D917789A4C992AAAA93E15282DE128F25A4A52098B1B61AAB1D8CE204E295C25F8925DF956FA5FEF189AA008A577F0FE7AE919C67750E7F96A7A5A7A256C94D353A5413CBC41015EB27D26D8D44CF9F88F1926E4AD46ADA827E83F108F78BD090341B46EA8CBA128287DC2F19EFC254A0279020103D23DFC861F2677197500E2E4A413AB69F8680AE6A59C902BA8A37BFF0031C3542120711BDF71C511D49EBE67607AE1C8095A5C067A6BF4A46C0CD21C1247D2BAF46F5F2DCE5234EA47110422E2448E879DCDF6F28C289509746A35F66DFAF4A985E5A4AFF73923AB0DCF5F2BF38D7DCD3B444AD23681C201B7BC79636078DF8535DDCF5B102E3F30B7729DFD0FE61BAB6B29982D8E2499E21C8CFBC9FDFA61497825CD04A659D0D8F4ABECFBD3D20EE0173D1FEDA8FA4361CF295A925C47C0088F779FEC6153944C51A20DAC4747D2A280F5D20EE13EC1FCC6A7354D12225D47389208816B79FCF7E787523249E6BC0455E9B1DF6BFAD2B19EE65B5520EE5839F12E69A43255EAAA3330E3441F31F76DBC91B1F75C3F464588B842A94142399FB5CD39DA329932925F801F7EBEF48627756D1200971B93E693F8FE7E98728C93141B841D34660342F63EB7687689128BBA035281BF07C36844E6B1A1360E376EA40F59BFCBE6360F5392629A81637FF3F8A561D2654AB042481AF969D7900DCDE1239AAE85F04075B91E622FCE06C07E56E78752F239A0033251535DD2F72EF5E40BB3EBA34394CA40FED62350DB03E9CE8F57D9BDCA8A3AC061D4926F2089EBB83BFE3E58D66E5E24A4B4A0826B415A78529E7F58DC4AA6CA3F228A46843D3E82EDF9A533A677F8705BCCACA9C5005BA85ABBD698FEE0A6164A17C62D04731EF64B95396381C841FDCC9295F50B4B283105D8B6E43346F81CC7132D6089AA0C402EA2CC6FC8EEFE5A452BDAEFB3B7657ED079255B59D50D2E5BAA10D2FB8D40C301905D20904B0C25B42BEC84893326712B83CEB39CA1094E13113A6E178A924CC53CAADCA892A2EE0D7A6B1D4722CE56952146610B0DF31A82FA312D6D8163E9E0676FBECDFADFB00D4028EBE8AAB34C973175FF00E139BA1A3DD38D3249517036161B02401DE284F58DFD2BF0AFB726485271B89EF0A827E55A98A696625F5367B3C757CAF128CC51C4C94A92050597CF61E7D2ACDD7B66A2AABCA9879BEE129DDE490E4C4CCA40B481CEF3E631DFF0D9D61F30ACA5A40536AE6BD0D2BA6FD626BF4D2D29725A96B5ABF7F0AC37BEF369754C21125AB17B889EF49F2330009DADCAFC9FAF2B5CE485256EE2E3CF4EBAD3D61AAC4B42411FBAAF4A80F4B0AE82BF68C50A49DC7BB9FE136C4062B053B0EA3F329B986A7893F5864A4AAE09B583EEDEEFB721995A524F4311BCC01EF3BFDDF0CE04A8F1025DEEE76B6AD0E308EE41767FB8E9BDFF00883BE4F4FBFF002C3F2A01DC57FE3EDFEB121C09DBD4FE611D53B3C3C260DF6E9EFF003C319AB1500DB5A8D6AC6CDF88D880407167ABDFF10938D7FDC711EB98A7724977D4C60002C238E359DD44FC30AC82E76D59F67FE1E02906E1DAD071ABAFC87E587718E04EDEA7F3071AC6CA23E1820E04EDEA7F31CF78BFEE381AFF009F67CA0E04EDEA7F31C15ACEEA27D630D67000800333FDA3200161071ABAFC87E5846331B5B59BCDF6F238208DBDE797CFF4C10462A722397CE7E58D9258B9DBCF940C0DC3C63DEFFABE5FA6304B926D030B353683BDFF0057CBF4C20A5BD4D00F1FB46A5293A0FA7D20EF88D9447BBF4C325CD2C43D352C0F9341C09DBD4FE63626A426788CED1D6F31F71C21316695AB12696FB69A43BC3CA4283148DF9DCEB5E5D2B0AD15224907736BF436FBCDAFEB87324D5B6A75773E1EB08E250928500966B53EADB8E5D6E61522AA1485893C324DEDE5BFEEFE7187C491C2A0683CEBE86D6D0FA56E6C924AC17F9EB41E76BF36E557893D16A3294861D4A7822012120C5B9C1F2F4893CCE365E21294BB81F73C9C535D7C637C160F816EA0E97EADB6EE5C9F08B7BB19D22EF693DA4699D1D94053EFE6D9830FB81092A296E89D4542ED36F020F911CA71C5FE26F68060E5772998C262174E261C4052C59DECDE05E1BF69669C2483325A820A12C43548550F5A1AD3D5A3E84BB5B798A3CA72ED22CAD29A7C972BA569B0D98417051B45C848313C6920C0277C710EC5E07F5B3BFD426CB3DECF984CC2760A3C26DB0D686387E6D88EF2628514C5C171527AD407D457768F33BB46AAFAF52565129292AAB45434A4AA088485A504883262FF00AEDE9AC2E0D2AC0042501FBBA0A5DB571FC987FD9CC44E953A584ACA7E6B0E55A79D3C23C43ED37275E9BD63995238DC043EB294910077C4A840023FA8444EE4E39DE33098AC2E294A05411C44EAD7AD4B69F6A8B9F5F763B18676070CA5AF89540A725CD69D1B9B03B5A21AC9719535434A98AA52BF94BE1E3E10B32B49491078C2B844891BE169F998EE38388021245C39A6ADB3C74CC666585C160D454949570FEEA51C07A6AC0D7C1E3DB0FA3E3D9D329D17962BB79D754210F6608074750D4A095B0B48553D639C047178D452B1C690003E13071CB71EBC4E331F351256B51E2F9C970250351C94E1C3E9E71E4BF8BBDAD5CEC28C0E0A6148477826CD0AFF00ADC45D3F2BD022C1AE7531DE6D53AA2A6ADCA87AB1E0A6D4496140A6C89809B2A6C205EDF0117CECDE5AA011C49A06AB0A93ADAFD1C8E4F4F21284DC46314B9CA2B254EE5CD8FF0000B374D23D7253B5B5622980667688113F033EFF004C78E0CC67A927635FA822357ABF8C6AFE159A2FC558E29E1B23C6501039EC6FB5FF0063092945449DEA6DD2A5B9FAC3D41241E5AF2FE291B0656849016B29B192495F43D49C6841208767F7F785E5EBE1F785CC51A5B0A534845544151584A7BBF4E2DE77F59F5C22A965C104BEED41A59DABE118980167D5FED1CBD5F4AC8E17561A3B140492262F71D4F4E9B5C61CCA96B5800034F0A3EF6FC7842600028290DCBCC2848269CC9FEB93F0249DF9EDE677B893938659AA83026BCFA7DCFA40C0B3D48861ADCE12D9512B4003A293CBDFFAF2F5949382510004923EBE3A8AD1BC8C6CE588DEFE1115ACD56180425693C57FB43DFB19FBFADED898C2E5466B7125C8616B1BF8B75A38EB0E30E81A1BEF7BD6BAFBB3D6119AEBD534490B1239F17EA7FDEFD266B0D919268871FF00A7DF8EE75D9DF77CFD22019A7680E3BC27BD1E12A89501327E1E9CFEEC59F05D9B26AA96C0B386FB36D5FB6B0777CFD3F9881667DA2BEDF143FC37BC2A46D6B4FE9F218B1C8ECA099FB500D350DE1F814D2918E02FF7F7E1E7AB188357F69D52D903EB0428CCF8F7DFCE0CFE42062C380EC8238085201234E1B3DF9D7C0F331A9412086E5BF37A4466A3B53A8850EFCDC9895DC472DF7E973E589A95D9094A1FF4D9887A1623621ADA9B96A6B00429ACFAE9E2FEA4F588C661DAB55254909A832267C7681B400679C7EE43F4762D0A149628CEC923D5EBC853A42F2E5A941EAE7705E9AF4AF28655F6AF58524FD60DF9779B7AC91B9FDC9C3C47629240694073236E82BE5E5587694AC0DD46F6A372B7E00E708DCED76B1929E1A851E23FDD3B795EE4ED3CBDE70DB17D8D290C9941F9279DED51A96F4891C3C92B49D4B5697F77E4C5A1DA8BB6FAA640FE793B48E21C88DE7D7A479E20315D8A98A04F766D6E1B79529ADE94AD1996330A482403CC5CBEA473A5BAF3690B1ED06E32A4D3BAAEFDA7C8E2638A3BCE1823C60786373793B75C404EEC54D49E2EE94E2D43AF8066A306671A38786EE95296183925CEC5B5E6D5B7DE2CFD3DDB9E48E1698CCC269E956414D3059924EF2EA6151241B9B6D30311388EC8E2405AA5A4A2616E13C20B35689B568FD68627B058A992AAEE28E2BA1A31A1A369FE2E8CC72DD01DB3E93CC34BE7B47415B97D753F754B5AE1696FE50A5A49E26E65E59716A04C111104918A8636466BD9EC6C9C54954C4CC493DFC90E0625BF6D6825F00BB5DA3A9F65FB408929E098A6B1049763CF42093E25F9478ABDBDFD1F3DAAF65598667A83B3EA7735468AA95B8FA9D692842D968952C2528254F2A0950B09B6DB01D3BB1DF14254B9C893899865E210405495929035B9A59CF3A8A878BE8ED1616700998A09243F7AF5E4C91D408F36F3ACAB30C9730A8A7CC69AA696A92B297296A69DD616DA84820075292A122E403D27618F4A647F127013D2841C44B51200AA83027406AE39D6AD416890C2CF4E264A149140FF00EE38255D520BA4528F7E7A321AA29540B106F0608E7F1DBDC0F3838BBA332C2E6684F76B492B0E450DE86A37A781B8A3484AC22A790D507602E06CCC3CF581152553C46E37BCC721FBEA00368C4762E58C190A019CD2ACE3F8A7A9BC3A565EB9041524A5EDB10DD5AF5F0EADB03E39284F90B88E7FBF74618FEA945E8E0EC7CEAD5F6EF0770B735D9830A7AEB1A5D72786F3BDB6FC3F5C36993BFE5A5A967B79D2DCA306490E49B72FE79C69EF3CBE7FA6102B0BB69D75F01B465324AAC7D3F983BCF2F9FE98D90B2922AC3D9FAC68B41433977F7EFA41DE797CFF004C2BDEFF00DDE9FC4690779E5F3FD3077BFF0077A7F1041DE797CFF4C1DEFF00DDFF00B7F8820EF3CBE7FA61354EDFC2BF602364A789EACD0779E5F3FD31AF7C9F6FF88DBBBE7E9FCC6C439B88F9FEFEEFD4EF93B7D7F1EFE8777CFD3F98D9DE797CFF004C1DF27DBFE20EEF9FA7F31A1E74880047BFF7F77BF1BA5616682DD75DEDE1D3946C257158DB5D23477CAFDC7E584D6B147A0D2F58C19453737E5FCC1DF2BF71F961B4D582181A8F7D6DBFF9C777CFD3F983BE57EE3F2C342B0297DF97A467BA3CFF00F1FE63053E411336BDA3DDC87BF7F9DD25AC121D85FD9F7B987B87965AFA736E5ADECFA6C291BD1526264F283FAC18BDB96DD670EE5A81D6A40F41F6DA1ACF0CA524835A00DE1D7DD0DE1E32EAB090EA9C850013E76F416DB7999185E6CE4CB492685A8747E5E8C7C7A9232E1398F01351F5E54EA75B0DCB830EB398AFB9694942B69046E4C6FB72F4B1D84E2AB9866C25950E2B3EA69F5B830BCCC28C2A4A8A5D22E35D4BD3AB51A879C7AF1F46476448CBB506AAED873A60AE9F45B0C8A05BA8FE5BEACC987183DC2D4385CE051495168AB84DCF0918F2C7C5CCF138AC6617042710A9F32810496E1525DD999F623560E6392F6F730E14A422812E082DAB114D7D1AB1DC8ED0F3DA8CC01AA5A897C3D505D24C12DADD25B1E8106398F9E3A176170A0612495A43290928A6C056803BE963778E32B9C66CCBBD89AB35C6BA077F60C74B35CB08FAE665560F829928537D09524CDCF9CDA37F3C774CA25F1CB94959AA8B35ACD46B7BE7164C94913D079BF4ADAF5B1D9ED1E52FB4464FDFE7C3374B453F5D5A8A951013DCC004AA204EC27DD7225AF6B72A97230C6680012851240D838ADAD4D3C418F4B763330E094002FC3C20279F21CA9A56269EC6DECF755DB57692DE719BD3B8D688D34EB1519F5538DA836613DE52A5B240539C4E37C2AEECAB732236F36AF1789C4632749940A8A14A4F059DC900BEE967E64342DF123B649C932D01C0C4625244B5F13997C20713A6B705803F68F6FB5867B414D449A4D30DB6C65140CB3454397A385A6D80D212C38E0042412E1471EC08E66716DC932698A4A3BF509D36A56BE009245481A03C2081AF8C790B3BCED59A2D4A2A2788927E67A9F0346B68DBB88A7EBDFA948A6A075E2E97B8D5C615207F5904824089237D85F7C749CBB048C3CB0A609006C03F2E5E772358AB8C331E337B7315BF95A8FE74FA0166912C8492424889EA46DB7BBF1EB8F9E17600F100F4666EA7C5EF5F288500A8B0ADE8D7F1B53F8BC735110DF88CDE4498DCFF00BFC6C70BA1249568295677A7BD7A6B0F91FB46DAF99F7E3CE1BDCA869BB2943CC4EC3CF95F0E048E20DC26F7624BF4635E45AF4BC2D2F5F0FBC3555674C5288E3038A440316E460413F779E1EC8CB5534FED25ABE760CFA3F37B429107CDB52D3F8BF9824837B4CFC763F9E2730D92A8B320D69635E9A75EAF04416B75630DECE01320F8A36EB16F96DB6E062C586C8944370D9AC1BD9176822B7CEF5835E387881B59663DE27E079F4838B1617B3A5407FB64EBA8FC0D18736171522A9CE75F268882878A839C5278F6B7207CE2E2201F8DA32DECD93FD8C7667B6946D3C2EE758752120EC0EFE6FE240F467115A671DA72A15E3277FEAB917E9BDE79F2EA316AC1F66C3B775E36D6BA1FF3CA1D7766EF417A796BEFC62B2CDFB4B528A4059B49B28DE3AF98B1DBAFA0B7E03B3A97004B1B540E4581F7B883BBE7E9FCC40B31ED21609FE6AA6FCF96DB93B0F889B8E58B7617B372D828A45A800B026DF6A3F283BBD5EDCB7F1880E6BDA22D6A49E3322608519F7FC7D368B62C382ECECB485120076D07261EFCA1D4990662598902DB68EFD6D5B5DF588A54F682E03016444C9E237F74DEFE9CBAE25E5E4726AE0519E801D7EBF5BC3B4607899C585E94D2BCB93B1D285E2335FAFDC25242D5378854FE16F8F94C61F4ACA248E2F901B7BFB5A9CED0E118124B3160EC451FA5DDB5F1D5CC313DDA0BB1F6951E6B2239CF3E43EEE7B3E4E572831E00FD03F88F62BE6E9182A5BA51ECDA86EB4B6DAC256FB4170714AD5D6E6639DB7EBE97E507189995C851AA1236A8F1E5B5FF00C49613046A120B16D0D3C079DEBD6315F684B93C2A23A78B7882791F593D37C6BFE8586994084316D05CBF5FA91E10B4CCAD4BA10C3A16D8B57CC5DEED0A287B45524A8A89266DC47ADA0123E406D1CE70CB13D97C3AC1696914E87C75E5ABD9A239791A89A21C7420F236D1B6D46D49053F692E0825C36123C4444C6D1D3AF2F7C62BD8AECBC9493FED8A93A0B073BEFD234FF465A2E867DF939DBDF9C58DA1FB69CFF21CE69F30A3CC5C6F2F60CD7B4A76CE050F04052A41046C07AE39B76B3B12314852E54BA804D12FE4E29F810DE7E171185FFA61418559FC3E97F5DBD79F679EDE721ED4B4E2F2B5BB4EBAFA1427FCBD4703BDEF112A52781C0526C0C883B89F2F2C76BBB3188CA718BC4A50A12D45426F0F12598302E19DC81EA4BBC664637168042CA9C7ED279173E82A5FC6C6211ED05EC5FD8EF6F34B53A86A6869B27D62FB6E062B2999534961D424A01532C8432AE30126E39CDC9C55B29ED563F2E9B2A4714D0994AF91456A20825ECEF4A569B522F3907686761DD066B22614858531B17A136F4D2D1F3FBDBE7B16F69DD8B66B5B555197D4E6FA790E38B6736A740290D4920965A0B518102FE64ED8F55FC3EEDF2E709427CF73F2D0A80A0E4588B5DAFB4769C97B41829825FEC4B0058904F3E95DCEF7D7A8A288BEB7FBB2A6CD3102A4B80B6A76491C3C0B852784C8902FF7F72C56792B1F2E5F7530120025883B0D2FE4FD0459B1F8A938896832F84D3420B16E54BDB61CA836B596BEF254BA4506823ED490663A027D4C6E27E0C462D540FF00C5B9357CB66A444A4A6BC49E2F13F57A587AC25356DB84B1C10F3261D5DC8513B1DA3972DF0A8C4059E151A8F7A795F96B0290400480CAF6C418E7892398FBFEEC3842B436D3DF38D638E34FEFF7FBF8E09EAE1A055C69A8A751CAFBC2339C800549F4B17F4838D3D7E47F2C35756E7CCC36E156C63052A6209F3DC60E23B9F38D822EEE36A8FE63193D4FC4E073B9F331B700DCFA7E23893BCDFAE14429C313516AD5AFF98510002075BF898E64F53F138DE178D88544C920F52795B9E08233E3FF0057FEEFD70411A9C50312A077DCFA6364AB85E8EF046B91D47C4632A5B8666DF58C100D0C71C69EBF238653161CF0BB9B9FB0F7D231C097FB69F9F58389279FE1F7E1BA95C2D4778DA3153894F39BFEFD7EEF3C204804026A6D12B8295C52D4793F3D5AAFB6FE5025C4AA6F11D7A47FBF21E587D2940DCD2846BE1F6E4622B152DA6B58F139A795B7F1F1854CBCA553BECB07F9CE29A09DA7838877963D1336E97E8434CD279972CB280614DDF6D77F41B44FE57212521C3961CEFE96BF90DE2CAD11D9E56EB3D6BA7B4BE9569CAB733CA965B7D2D712BB94214D97CA8DF8470951B91B475C714ED3674B9054429E8B7AD281CF8916B78C42F69B132B05879B3967FE98A21DB89C5F9333B7F88FA71D1BA1F2EEC7BB2ED2DD9BE5DDD8464D445DAA7109E15D43B5A94542D2FA8789D2DB8A504F78A5445A0638263702ACFB30398CBE2577B31248539E012D4051D99DAA68EE5DE3CB9DA7CE5599E2169E30424B30346A016D19A95B13D280ED12B920BBC3037DADFB8E5F9E3D25D8BC29461A44B218A529141B51C7A73D0EB15A929E250043F3A8FE3AF5E74E9EEB4A9A9A961686CFF97593F58322641F04F337FDEF3DA3072132C21668CC40B6C4DBD0B3F8D22C980024A9045DEDD341A1DF5ADB9F5AB3EECC737ED773ACAF43E594AA76B5DA81F5D7D081C2DB0161C27880013FCA0660824CC620BB699949565D352A58480929248A82CD6A12E6836D869D3320ED18CBA6226B717082C97672CC5DDEDEB4A47A59A6F46699EC07B39A3D21A6BB953ED530FE24EB690971C7970E14B8BBA97C2A2A0029460898031C3723CA5588C54C9BDD90952DD2752E4FA1BB18E71F13B3D9D9BCD413314A751700BA458000025B4D2BE51535766C336A779E71C2D8E2528A42A2E144C5A01B827F738EAF80CAD322585283300EE0FDF6D869AC50B01835291C641552A1BC286A5CD6ADF688B5255E699857D0E539334E543F50E16D4B00A8A1054028F1198F099EBE9BE13CC7304619052080002545C0B57EFEC98DF1BFEC8370C0B1EA79EF1F44D599B06F8A1409B990403F01CBDC7A63C0F2704EDF2D3A1A7DF5BD3CED570160964B0B33B9D6EE6F5D0D623CFEA0201957853360A173EA7A749F81C49CACBF8BFB0BAA83A52A08FB3E95AC3A9648A58A7EEFEDE2119BEAA5B6550E0000330AF97BA44ED89595969424012DC9D83F37B86FA1BEA216439249E515C66DABDE723F9974F15F8C017FC081F941C59F28CA8A93C4B450B0A8634B796AC2FAB43897AD36FF001EFF00115D66BAA9CF12BBEB9FF501E5B4CE2E584CA40E1025D68CE9D5EDE15BB7A38522B7CE756BA8E187C5C13F6803378E7B9FBA05CED68CBF264A81E2410A1A33F859AD6E45B4822ABCF357BDE287A08B9F1CEFD2FF00BBF5BDBB059225212D2DC3683AD0FB7E71B702B6FA7BD62A9CE75629453C6ECFDAE63EE9B7BF7E569C5A72FC88DC4B6DA9CEA3EA2FB50438929A07A359E807F80DE25F578ACF39D5890170B060C9F1794DA0DA3AF2B62C786C9549209960100B16AF3EBF53AD1E1D3278801CDEB4B1D5F9457F5BAA42B7546FB99F5E73E5EE3CF13D83CA8A6BC35A0B0F7616D3D236128AB88814A01CBAD7CAB110CC352A49278FDD3B41161F1B462770F8166052DCF98661AD799D6D1B270D3174483D4317EB703EBADAD0FABD42924CAC9898FC7F193D3D6EF84B12EC9B5B407C7A537E91399760560FCE926C6FD5E8DF588ED4EA049264C0E809F95EC363E5EB8CFCC5E9C3E47EDB0F11B44E8C18FF00800598354B02FBB56F6EB0C5539EB64595224DCF53B6DFB163E8BCA510DCB51CEFF78729C0A890C9A0B8E5F4F426196A33C499124474371D2F3B1BF3FC70E78D2039142D473714FBDB9D2242565E6C12E59C6A1BD2DA1DBCA10AB3D42448541E927EFE7D7E1E9889CC3126590516AFBE836A6B68792302A4129281522A40617D06E7D884ABCFD06FC5D058FADBAFFB88383098E5310A074151D37D696894465E1403A59DF4E85DAAF4BF95291827512533E2DE2F226C67A72F8EFE5896FD5CB2E4ABC1DC96DFECFF00430F539525491F2D1F6E9A31F4DFC21C58D4C9060AC587F76FF1E436F7F9E186266CB268A07AD3DD8D1A8FCA345E512D4E38452C680FA5AAC34B9B80F0A1DD48B7CB6CB5545A2E1E2212AFB7C3732418100409DF60271B60B0586C64A9826F0BB7F7355DFE82953E1568565F6764E2524109046E2F76F5DDABB3B45E1D90F6D59AF65FAE74C674CD538DE5B515496AA9A4AC94A8712199589200054771CE4440C716EDF76330D8D973BBB48527866592E4163C24B6DBFE1A2BB99F65F825CE32D20AD0C50281F7A1342351A57768FA23D3FAEE8F50E52C67678174599D1D2B9421A70143CA0CA0BA12EA0C24A566E2649B6FB78D732ECC8C1CF5492C67485AFBF510C500A89438B971CA976D4728CD26E232F5A9402801448E86B5D1B5EB09F3BA4A0D4794D56599AD15366F4952853672D7D0D4A12A0413DFB8951E7C5BDEC0488C2580993707353370AB5226CB219692A2363F2DAC7D0F8B7C376DF1386F912B5914043B352CEEDA72D6D1E457B4D7B026579A22AB56F66B1455680FBF9A652CA09EE54428B612A5101CE2B93C22D231DCBB19DB1E2C47E9B315AA48584893314494CD61F35E8963E7E11DBFE1F76B55994B28C54E60867E321C397B93F6A18F1933ED3FA9346E775392EA262A68D54EE38D82E34B4F1C122764F9441FC31D7E4665865DA7A58B310417717BB01D2ED1D725E270B8948326625445569E214DB5AF3E66CD0C2BB2D4509841D9569579C1B89F3E989595325AFE64A817A82FD5CFDABADA14490A6E1ABBF266BDF6A3F3318952809260752001F18C48A1429C25C1201FF27AFE6374A16A0FC247DA39E251124C03B18DF69823A0336C693663060A7DC6EEFD5BA78D1A1B4F42812E0823F87FA3FBA16FEF3F03F9E1AF79CBD7F886D19A386F2E7C41FC4E0EF397AFF118248B07F168CFC1FDE3E1FAE0EF397AFF00118757FC7FF708E0C5A140CCFCB0ACB983E67F96D57EBF5F778712412412185697F17B681B9BED0614EF11FF00210EA30592220F5FC3005A4D8BC11871ABAFC87E58CF1A77F43F88235B8A55AFD790FCB194CC4837EB4351FC7DE0626C1E35F1ABAFC87E58D57352A71C4035BF1BE8C5E33C2AD8C1C6AEBF21F961B19A80402475766E55FBB46785550D7BD469071ABAFC87E586E66A058BF4FF00107028D924F484EFB91C337DE4C7E42DCE7D3E1ACBF98B8AB5CF33FE6F13B9620095338F67B59B938AB8F1BF5E1A58292A83C3C88048313E5FB8C3DC3AD0A04715B516D4D9FD4DB7DE131692A9C78773EA691CD3D6770F21C68F12B8836122EA5170F0080249B9B002FEEC577B418EC361A5AC4E9E94382CE41AED7A7589AC03C994A2B7400E5CD2EFE4C1EBF48F7A3E8E6F6776345699A8EDAF545377CBCD508569C66ADAE175954A997D496DC1C6012B064A40D88240BF99FB5D9B4BC662266130AB3314E4AD601646A2B6214C4339357BC719F8979E61D1226265CE495F0AC04822E6FAD68EDBDF471DECD635D54CCBEF39C6A7F89492140C22E52090792488BFA011675D8DC377C959989F9924740E59DB9D39EBBC799F2B9B37158A9EA98E47112092599F4DF537D183523A8DDA1E624878070126E52140F3F2248DE31D8F2859C36265A00F95C7CDA50694B8DF6F4B3484CB04592CFE049A5FED58EACE66E56E6598D3E5F4E14E3550B536F250389416AF0B648124788CC8F59C75D562F0E8C119A5680A12DDC903FB7AEFE3A43C54E4A40F983FAB83B0A57AD393476BBB3FD2947D96E987B31A869B5EB7CC9B0A69E570F1B6D90AE6652921856DCE23CB1C4738C5E2339C6224CB0A5E082D42600ED34834622A38540EB51084DCC57292784B91600DA8F7E7CEB7E462ACD4DABB8D150D3CF29FA97D64BFE22A83C44F224589D85A05B962FF009065089694AD6809A07040B01D03D1EBFE0454C4AF309892B06849AFF9F16D7A308AB4E64F543AD51D38528BEE04F0A012A32A8FB224989BDA7CF699EC7AB0F8794A485A41092087A58D05583EE49E82D137879587912C82B4A484EB4F4E7AFDEE3B71A0324CA7B39C85DD4D9C3487330A9642E8D2EC071B54113C06542E41F1016EA231C4BB478B998C98B9387515842889894870E5CA471015E6DCDF58A8E72A0E4CB75036367AD2951B1F0E71EA36659C3664717226EA36B409F3B728F80C79D70B8304FED776B8DB6AB0A3176A7A4457027D9B7BE6F107CCB3B4240FE6753BC7A73E53EEC58F099792DF2D000006A907EA6F190902C22B7CE73C412A973ACCA8C7BBAD86E39FA462CB85CBC10029034FEDBBF852E06BCF9662B7CD73B6FF00E6708BDF889B6FB6E4F945FE3369CBF2F649E14072DE7B6D7E5CBA64122D1566779F24154BA45CFF005284EFE7602FCA716FC1E0520A4140AB68C4B7416FE3785E2AACE73B4A88FE612255038CDA796FEF91E96DB170C065E9FF008245051ACDFE75FB42E00141158E739B83C443A7983E237F2EA4F5E5E9B62DF82C024B3A053560341EB6A783C390C34A569FE7D8D22B8CCB34E22005A8913FD47DFD63A927DD6C5A3078364FED1A5C0AEC341B523632F8806A1DF6AF8546B6B59E21398E668F102A207A93E47FDF9CDE263139230C90015005AE1AF571A3736B885A561D45882E353A9D0F97D1A2179866215C30AB09E7FBFBA0DC937C3F972E5D59228D6E4FF4899C3616CC1DFCC56C2F7BF880F678BD556A493E283CAE679F39E63D3A838708968AFCAECD7FC79FE22730F82040743125EBC98F2634B7DA2355B5A2D04F393227ADA39F2F59F5C131080C486BD757F7FCEB12F84C210E079816F5B753E42D1CAAAD4927C4444C5FCAC664721333CF081084A41201B87B52A3EECDAE9AC4A4BC3970C97DE82BF5D343AD7AB2B95A0920A8DB7827693EF883B911E778C375000B00DAEB57DE24E4E1C16743BEC2BF47DB7E621ADFAC499B9F333063CFE07CF7B73C36529CFD044949C20D45069F9FC56D48697AB120024DEFCC47BE08F3933C8F48C359C0177AB3372B7958F9F3112D86C1214DF2D587570D4E74E8FF00442E5724EE7AECAB7C41836F8C0DF0D432052A0BB301F514F7E4F0E0827467AFED3F47D377F268D06B5226E62FFD5D3ADBEE9FC7092A72C502BC341CBED00904101E96A066F0DF95631FAFA3FBA0F3F10FFB8619AA6AC9352DF5EBEF946E306B0EC0B1F3FA1F6F7731C8CC9C410A6CA890A489E29DCC6F262660C1F29BE1D499D3112661130A69A7FF00AB4E5BB7285E4C8293B2B6D4EAD7D6C29E178795E7EF32FD352125448E2124CA4C05483CAF04411E5388BC2AC4E4E204E50997FDC1C6BBB8BEBB6B18C6E0FBC94A253522A6DB8BEBAED6D35F7B3D853B48675CF616F69872A0AEBF43A9A04AD654F2BEBF54560152CF11802D72074DA3C87F16B048CBB3999899008566055DE84BB204A0424DDAA7616F5E19DB0CB9284CC1DD8643906D777D8EB4D43DC388EE73F53DD17521C238D2D917327853248827DF706200E58E7FD9A946609CA5FCC0115218D497FBB694B6B1C52661889A43317A0F1AE8CCCF7F5668462B5AA94BE92E250EBC9E14154149004282C2BC2AB75F4B5862CAA966594841E14A4BB815A9A310C7AB1357A6D3B976327E048EE96657135412051BD5998E9568E977B41FB33E8FED432FACA9551B0CEA1085A9AAC6DAEEC2DC8241212128E82E637DE3172CAB1B3414A16B570822BC44B5294EAD6148EA9D9BCEF1699A850C42810DC4E7881D0821EA2D7E54263C32ED47B1DD57D93E78E51E7D46F399754BAE8A2A94A49404B64CCF76088129E7BD84CE3A9E513E624242A605022F4A027ABF9B78D1FBC6579948C6C994A03BB9881F3077EF1D83F2D49FADE295A97EAC3C94A877F9783B240494FAC4AAC79CFE38B74B99C49705F7B78728B8E1A6CB5212A291C400047A3697BFB10B6A54A0D30524160825A47347F749DCC99DC635984D1CD4DC56BF6D3AFD90C7250B4860C79ED616F523D211779E5F3FD309C45F723979983BCF2F9FE9820EE472F330779E5F3FD3041DC8E5E660EF0F43F1FD3015F06F5E434EBD616932921DC0F5FADF783BCF2F9FE98C77C79F9085F813B7A9FCC6D6D60CCC8F98FF007C67BDE6DE03EC0C1C09DBD4FE636F1A7AFC8FE583BDFF00BBD3F883813B7A9FCC705606D7F97E18D173096657A7F1070276F5309DC5EF3D2E768F86FF00BDF6C20B5AC10CA6E97F1FB78C1C09DBD4FE6908DC73602FD3F7CBD39DCE1098B5503B3BBB787BFA343E4A10003C21EF563EF96B1A7BCF4DFAFCBD7F71867DE2FF00E461544B4D5C3F5F18C915612B4B0A00A5E07895BF08489B1DC7388F2EA313D96AD3DC4E2B2EC9BF817EBAF421A821C7767BA584001F9B6FCE8E5BCABCD653D638D52D496480C01146540492490F44DC93CA7D4621F058D299D89055F213F292435C92D7F5D7AC43BCA973E519A38A73FF00BA384B00FF002B814A0A3B51E3B8DEC2FECA99AFB41F699475F9952BAC68FC96A13575EFB895772BEEC77E80788A64171B22C48B99118E09F16331C415BCA9EA425D99277236BF4FF10876B73C9383CB664B90532D66529D8D5DAE37F5BB347D2566ACE459464747439486D8A2D3B4EDD232C3490DB4A84A5824348E149BA249E1266E2F3344ECDCB993CB4E05666A5C2D42CC28F7771D4D58E823C2FDA2CCF158DCCA6056215313DE2800E5AA4EE49F7B33F5DF54E6EB8AC696A5292903EA4493BA812E45CEC771CA04473EABD97C0F77317F2808243B01536FAD35DE25B0525326425412028A4540BBDDD869E1CEAF1D4BD4AA79CAD577854E3AEAF8384289B1302C081CC63A2CB97C3502BEA1ECDAD7946B3A62D36253F97DF5BDAD6BC4FF0046E87C974851D46AECDD095D654252BA143838B8080428F0F885ED123716DC6196267E2B153C60A54C5140FF00ACC4D033A40635714A7A43513660209516FEDBD77E5E3466F3AFB5BEBDABAAAB5B8AAA4F0BD2869A04029481C205B6111B798E47172C97279328213DD5989E20EFABD5CDFC9CC399438CBABE635777018FF9B7E628DA8CD5FA6A9A879F052144428F8F88AB6481B9E298117BCDB9DA31F3118390C964324D2CE4793EDE35AB449A0A254B53258B3123EA29A79DB578EC5F62FA169DA655DA1EA767B9A0482ACAA89E07894E5D1C7C2405D9CE1500A4911B5B1C6B3CCD2762710BC2C89C5D4A214A497084ED7209507E8F6D62B3996216569E0511C2EE428B2AA34D18D2C1C72BA5ED4B582AB2A4B752F0352DF185F01E068B51FC901B443638500030395E0EF25906070E129946582054F11E2249A92497275678DF2C96AC4CC1DEFCCEC2D7DA9A7BAB47A7398E70F193736EBBF9C733EA71C070F80424B82E36236A353EACF488A880E6F9CB8024827C455CEC4FEB6FC37B59705824A883D2B60343D6C7AF8411586759D3A4AE144EF107D79DBAFCB16591854A00702D717DB4E9FE5E8456B9A674F447113B9224FDFF00B988E718B3E57864872A0030F1F3DF716A1DA08ABF3CCED7E205666F249BC91B7975361E87168C2E141F9A805399B8F5FC5E1C0B0D22B4AFCDDC528CA8AB7BFCBA1E7BC7C3171CBF0A1D23CDC374EA36FB5E1C457B9CE6AE78BC44133CF9413E9713B47A8BE2E183C325213C4028D6835DFC052DA6F0E694F567AF2AFD6D5B30AC0AAF3270932A3B9B5F793E5B5C6DCBAEE6691204A161A786DF6AECDCE24B0B28299D2C28EE5F99DEFF00E221D99662ABC1379FDFEF97BB0BA789C7FC6AF67D1BE8DB8D1844E61F0A82E05D2CE5ACFB575B797488ABB5CB502788DBD4F9003CAFD473F52E258357B166F5FBBFA44E61B0813C2281CD9BD7F00F8F363AAAC549B9136206DF21E7D37E4230E25EBE1F789B918349BD5FDEFCBEBBD63B5B58A004DF7D89E73F8FBAFB6E71ACE7E17D1EBE9F8898C3E112970430A5BC1B9F2209D22355758A13722D37BF5F311BDFD6D866B24853F2AEFF008689195844BBD850F9FE34DACED76572B172649E7FED37EB1CAD6EB86EB511E3AD0337F1D22570F84492C19C5E9BF93D18E8DF46B7AAD706E4F99BFEEE778DE2791C332A7B519EAFEED5F331232B09562001FDC47E2A3D37F16A76B166209833FEFEF9E7C8FA0084F3ADDE9D29E147B5BAD624B0F87482DD34D6A7ECC2D4840BAC50E7E637FBF7FDDB0CD4585013BEDFC7AFD8B93246C0F8FE77FF00309CD5B9D499EBFBBE1B295C2D4778D3B87A801B4A0E9BC71F5959DC7C0C7E1FBDEF11868A5851F95C0AEA7A7DA36EE696F17FE5A394E6A9A675A6D6990E104C9FED20F4EBEFEB6B1CA56384D6A4100877F3B4389785E22549B25B89CEE5A9E76630B9FCF1B72AEAAA026F4C1A4A4F4E301260F381F08C3196BEED6B06EA2C696B8F56FE443D9B81FF00648201E204A74A01E8F53FC523D2BFA35BB42A9A3ED79DD089528D26B3656E38893C3396D2B8F24F0DFF00A86F1EFDB1E68F8D5FED6265B31EF2CCDA33B120DF61B3B35B91F6DB2CE3C0CB9894022571F78453767A024F87D80F65AA3345BC8A9784FF0025F2D4F203BC2D816E97001F2BE39B766E58972C922843B7A9DFABBD19E9531E75C5E1409CB61AB721EC6C776A421CD1EA7A65B2CD538A692B0141692641226D11249B7A62D2A962600B48D6A0D486A539D397DE22F184482962ED6E56A6B7BD296686CCCF35A814BF5653519790422B090547CF8638F7B46D3D4E24F0321226898872B49A2743B3E9D4B1D0522C790E3A624A4034357B7997B5AA0F8C50FDA2F679A635E64EF506A0A269E67BB7050D52920AC29625644026CA20448C5D7018B9D2672552C711769D29C86164D5E828FB73D23B6F67F305B25894B70B58B9E7F4FB3B478BDDB876059AF66B9B55D6E5090F644E38B500784008DC40512AE768131E713D0B0B39D20A4B12016726BB5437D368EA981C72D68055FB8332874D68E695AFDC47565F0E25454567854480DFF6116313D4CED874B2EC742EDE7FE2260CC33D22E08A13BFAF43FCC2793D4FC4E348D7BBE7E9FCC127A9F89C10777CFD3F9824F53F13820EEF9FA7F31CF12873FC7EFC11B253C2F577F7BC1C6AEBF21F9608DA3636A55EFD3A79E0823671ABAFC87E58208E0ACC1936E76FC8608212AD66E67D07EFCBF7CB092EE3A7BF6FFC9089D5ED373CC7B87945B084CD3C7ED0F93FB4468EF0F41FA7EF9FCB0CE1697AF87DE32EF9A292D287F39653DD1BEC3EDFA0E107F330061EC99A65C998016241A72A8FE3A9E6625B0D2C2A5AA81D85478B136D5A96FB5BBD8FF65B9C76D1AFF21D01A7C91F5EAA6C344708E26D252E544F14720A1731EF99A066B982B0489F3662F825A41516E4F76E61ACCE763152CDF1A8CB7BC9C5026CD5823859B85835D8D4695B8BD23EA3BB30ECA329F679D0995E89D354CD53E6E9A563F8F54A10038A52909704AA24C82B1E156C6D36C70ECDB1CBED04F5E317F3617888C356DC2785742C4B91AF3F0F35F6DFB5335026C9E3539E20456C5DBC0023C2ECC2346AFCD29DC5B6DE5CB3F554A54AABB93C4B899337FB5C5E5E800C5A3B35844210AF943900696736AD1ABE768E13865FEB71A56AD5679EFAFAEF4B168EBBEAFCECB74E16A324F1269CED24920CEFCF99EB8EAB91E1021D40073566F3FB8BDE3A409625E1D054588143BBB303D2E5AE2C6231A474F36E29FCFB3B4F1B490A71B045844C6DE839183169C486366AD2A1270DFF0055640E96777BB8B546B1173C025459C01FB7C3466A8FB08AC35EF69CA0FD665A904D123C14C018080278AC049B89369BF3C59727CA6505214AACD5B152CBD48D2BCE97AB54E911FF0032A610372E0B7E69C9C9D7668EB56679C3150B5666FD4AF89B51286A1504A8909E703CCC6F36C741C3E01329085B86E9771B796AF1278595354A1292975173C2E03B03F40C6CE79C5F9D88F6655FAFAA9DD5FA9804E89CA54D3956490429464538213FCC82F2520900FB86397FC46CF93972A4E0A59271789E21264DB88062B3C4681857573477A95F1330A2539D010B5731403F9E51716BCD5AE53D4AE9A8DB0CE5D4AD7759751A2020B696F84ACC40160177124C9DE71CEB08927854A24CC51F994CC5CD5BC2D7D3668A8E2141732D47A5F91B73B56DE71D1BD55AADEA9CC2B180F29D430A90E99F171924A6F061311E62F18BE64E966A1040AF31E5E0E6D5A6F7EECF6010532A610FC676B358D29F4B47CB3E3F3111F6BE0C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C1041820830411FFD9, '1', '2021-10-06 01:15:26', '1', '2021-10-06 01:15:26', b'0', 0); +INSERT INTO `infra_file` VALUES ('26193c15-afd3-469d-b55d-eb1aaa2a4b63', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F0000010305010101000000000000000000000304050206070809010A0BFFC400431000010302030603060406020104020203010203110004052131060712415161137181082291A1B1F01432C1D109152342E1F13352620A172472164325345392E2FFC4001E0100010403010101000000000000000000000304050601020708090AFFC4004311000102040306040602010303010803010102110003213104415105126171819106A1B1F0071322C1D1E132F114234252081562161833437292A2B2D224258234FFDA000C03010002110311003F00FBF8A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A0AC4C7CF97DFD89ACEE920903F71909243FB3CA2953A948260E5AE5FEFEFD29962312647F261DADAB54FBB46C10A2D60FA966E70826F595BA5941E25A7FE44A4825BE9C63513CA69A276A214A097A9E03D63265A85DBDF46841EC5AD187C5BBCE0696AFCA56A0904F2039FCAA524AC4D018D5BEDC3CFD886932709658834BD0F0E56F3CA1E22E10B820183A1EBF4CB9CD6B326196A29A1B6B623B74F38525AC2D20DB510B05054C4E5D684CC2A6602BAFF71BC7B4A07CD9F841149580633FBF5ACC11E832268823DA20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20840820C73A5029934B8D789F7DA140A64711AF13F87ED142BF29F4FA8A6D88C289E0920391507D9F66D0D558B097A0245BCA9D7FA363108D34DDAE2172E38BE137E13C0A0608F084104E5F43A193CEABD8AC18C3106D7A5E95AE76A59BCA1791395398105EC3ADBD39DB268B6B10C5F0D18A0C3577187A9E42B5B958372743EEF3D2069A4803AB0FFBC8C2AF777C066624B736FEDA9A44C4BD90B9D2BE7192B552C843AB3A97D1C7F717BDB3ADBC96D6D2925053970E900465CEA6F0B8A18B97F31DC9624FBCB4F60464E90642CA14929539704311C0F9FEA1FB7CFD3F5A9295FEDEBF784614A710422BFCC7D3E828821447E51EBF53441155104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104450C4D92F5D301B70BD6DC3C400FCFC63FF00D79E70067D09F4A6EB9E106B400E7C75F6348C33B8F21786AEE2AD254C254D3E90EA5D5AD6A4C2184B492A25E3FDA08120FE99D64ED09094B93500D33A3F0B521AAB05316680B121FBD3D8EC0C72B7DBCFF894EE97D96762F197705DA5C2369F6F9E6D6CDA6016578C5E5DE18F825B3F8AB54AC38CF1485A6332248D0D5476EED793F2D5BAB4835A3874E7EFFF00F422DDB1360CE99392152D6427759C12921BCDBD75AC7CA1ED6FF11EF696DBEDE6E03B7F6FB718AE0F64E634D1B8C0ECB11BB61B72DDEBB69086C5B85907FA440209233D2B8BEDADBCBF9A425550A167CCB3B50F6341D23B76C5D8084491BF2C01B85BE90D6ABBEB6BF4AC7DC57B266DF5CEF13721B0DB518825F17B89618D2DF55C4F88A5A5B6D2A528992789526739EDCBAF783710711B2E5AD4492522A79F1F7E51C6FC6385186DAF3D2121292430019837A46CFA7DD05474807EFE357795FEDEBF78A94548585A428640F5A710426BFCC7D3E828821447E51EBF5344115510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510478639C7AD10422B70699F61F0D47D34F5A208B57157D9B3B945F38EA6D8B48756950570B2E808952AE4999091F97A647ACC06D3C4090824E8FA3D2D7E1A1830A37E72505FEA2DCE9AF5F58F9FBFE279FC5A30ADC058E31BB6DCF5FDA6D46F5F1369CB0BDB5B3713796D84A5E4F85E2145BAC3CCAC5BB8A5C990148988CEB96EDCF150C2EF8DF096041AD9BFE35B1CFBB88EBDE16F09AB1CA4FCC969992BE9282DBCAADDFAB335358F90FC671FDA5DB2DACC7769F6E318BDDA5C5F137957CEDC5F3EBBB603AF953A5A42DC3C50C9596C24C70F0C72AE57B43C6431130A44C24926E4BF06A7E7817AC76FD9FE071225A54248140C426D9E94F3E2F0CF67F1042F1861576C16BC2C4B0F36E1A4F0A045D37A13D3224E7998D6A2D13978D58512540A852F73E5435F661C6230A9C0A199B752ABB0A80457F0D7B47E871FC3C2E9CBCF65BDD95C3AA2B5AB0F70499984A9B09D73FCB15E96F044BF97B265A48AEE8A9CDC9FD7947977C6F33E6ED89AA77049E548DF55FFC47FF00A8FD2AF72BFDBD7EF14C8A58FF00893F7D29C4102FF31F4FA0A208511F947AFD4D10455441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041A510435372388A40CBA99E5AFDFCEB2C7431B896A29DE0CD5A674E9F78592E020120FA7FBADB715C3BC25315F2802ACFD9ED0C9CBC487FC208717EE9515244A13099827404C7DC56E656EA0294E1DFAF271EFAC371880A56EA475D3FA7F53A3C4BB8AB49B755CA92E04A78CF01FCEA4B73C4B039848127A0A693268403C01BE747A7EE91252A42A6B338720727B3DEF46FC47CEE7F186FE29985EE1F652F3747BA1C4DAC4B79BB4E872D1D5DB3C975FC1036471F096161EB75B8CA95196640EE6B967893C4F2113D7841FC88604B642ADF97D6863A6787BE1A6D0C74B4ED10A1F2CEEA9206F6B906D0E5FA3F1FB79B578EED16358A6D56D05DBF7FB538A381FC4F16C61C5BB8A153C494A1A7D5EFF00080A28009FC99682B89788F0D89C7854C94A2CADE2E496725D8B06D341DCC77FF0A6CC97B1CCA4CF4A545346AE547660DCB3B0E1157CEBADB8943CF5C34C13C43F0AA8599CC95F2CC991D672D6B96AF63E3913C952D4C55A9B5333F961C834761978FC0CCC37D284856E8029C297E35CF389AB3C66D117B84E1B609E2BCBABDB4E07AFA080A6EE1B27888CE55FDBD7A9AE89E1DC0ACFCB4AC97053C474ED5766CE398F8A12662672A596A1208003D3FB7AE75A47E875FC353F1AAF643DD5BD7E86D1706C6E38C36084C071213139990273AF50785E42A5E025A5A8406F795ECDC9DE3C83E2C27FEE73526E925CDEF6F4CBAB1BF41B8C2D05398311DAADB2D2433E4F5AB574EF1578ADA494A003DE96820520924E5F63CA8822B488007DEB4411ED104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104332D00B2A264F41A67FE32FB9A0162595D1F4E1EB0AA57BA8AB801DD850D4F7EBCA14CB4F80A5C6A73F21A7BE4E5A23713382CEE876163D7D3BFE60B124DC36DB82DE42AE20054E69232D46920FCE75D50C4CFDC40054ECEC1C503D7FAE1CA16C061FE6A9DA97E4C4971CEBDC0A67CC3FE259EDBFB39EC5FB88C6714BEBFB556DCE2B66FDBECAE1FE2A3F1172E3A54C5CA92D1525D596D2EA55EE194EB19556F1B8D4A50BDE57D441662E406B1A38EBE917DD8FB24E2D7266CB42BE56F0F98141C100B0619E649D4F38F811DB3DE2E2FBE2DBEC477BBB68E5F5D6D0E23777772117854E5BB69714E78296C392B03C352444E59655E7BF124D3336B29408A28B9CD9B2CA9991C4C7AA7C307FC4D8E996DBA4245281FA50E5EE8F67DC630E3D69885E5DB1174EA901808465EE2B8444E7F9634FAE74D14BDE90D9B503BB8EB763566E8F1954F06728D2F5BFE9F2F530861F8C9BC69CFC69875AE1E20AD424E49CBEF43553C6319A684107D8D732EF607AC5870B3C26592AB1029ADC55B5C9BEEF10B6F77737FB71B3563624A9C7F6870461A08CCF0BB88DAB6E4013970A8CC0F955B3C3E80A2839EF0E771DB8F7CA29FE22DA0942561CD942EFADEE1BB3F08FD407D92F6311B15B82DDC60086FC216FB3D873E5311EF5D59DBBEA310352A24F53CEBD29E1D4B602506144E5EC97F2C8671E50F13CEF9DB5710B705D43EEFC3311B3496C01CC7C8F79CBE1FA54FC57615A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828821B3AB4A544150062403E5590905CD011E777E30DA62941C55893AD2A1BF5E50D9B7D2B497152809FEE5E49CF2CB49C87AD68A9852145C80900DE9C857B3422941597DDBDC900F9FEF9B461DDF76F3F04DD76C3E2FB658EE256B8761183E1F7777757172EA5A014CB2E38DA10A5909E35A90123AA8819CD56B68E37702885391966391F7CE2E7E1ED9E274EFA9255660D4AE4DD6DC5A3F385FE203EDABB55EDABED378B6338BE2574ADD8ECF623776FB0586B8EAFDF2CF131882AE995294C90B7590A64B5A82273AA06D0DACC6602B2581B9D41AD4F1AC776F0FEC69625A1210024350240BD4F0ADAD6F3D78731F17984B16E2C98B661B9485787C172424812AD358907A6715C7F6A6304DDA0B50373AB82E38687DB978E8F2D230F204A14614E1E61EE1B90E062C2C57690DBBA96D0C85DAA3881E24CAC98911CB23CE3E4269D024CABB535A6B6EB6CDEF586292A54F05A84E560F62C5BF3E916A0C4EEAED38A5DB07C312C809320E796401CBEE2273AE624154FB9626CFDEBE6F67D4889C4EF26428D430A87CEAFFDE71B1BEC8BB0979BC6F68FDD0ECC23C172E6FF001D6AE5697412829B2B862E3300124808300E522AF5E1B96EA41A0A8E6DEF8DAED1CA7C598B32BE692A20310CE6F4635E55E01F48FD46377F689C3B63F666C4A63F0B816156F0065C4CD85BB6AC8F29498AF456C30D8443061BA18767C838F7C4F9DF69ACCCC5CC59B93F97F26CFA45EE1415313975A9B88E8F68820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20886C47F0E9429D5BA50BE24C4A8246640239CD658B3B75E7EEB5F36704952C92029B32C481D7DB72A431C582DF612CDB381B6D0DA9C7DCE284A5284859248D321399023946551F8A5A82083762E03B3694CC8E76D042D2A484946F060E03666B4E6072CFA47C5B7FEA1FF00E2238D31B43B3FECA7BAAC7949FC4A710636E6F70FB950FC280843F68875C657EE789EF27FA91331D6681B6311F4AD5BEDB8F404125EED99E3766D0C749F0EE1C26624A430514F61A7A91CF4A7CB7EEEB0DBA432B6F197495DA3AA7B0DB85A8F1DCA9F70BB7478D43DFCCE64684E7CCD722DAFB40852F749CDC3DA829AE7C63D01B064A44A416B80030D296D5EC7D488C8D7D8C97EE5618052D70A5000D3DD10743A4899D0CCE46A80B9E6662F7AE5C0B335684D1BA718B1CF91BD4614A583D2A75FCF786A2D9BBA1FD4D79CFA4E7DC8D0E43B0CEAC7296AF9391A0D2BC3F6D5A7186987C2EF4C14203DEC0D4F98D3EF148B06ED78D981C374A4C003FE9F231E4395474C4EF4D14BDDB2B135AD0FEEB689B9D86DCC39A1B162C6BE753EBC6E3A93FC19B76771BC2F6F3D8252992EE1BB2CF5CB974A20A90D7E22C8A9AE230401C439F38F4E85E1B961E58FA6AC6B7E7C69F78E03E392A499C9245281AF7AF2CDCE7AC7E8C585B29B6B3B46131C2CB0DB690232086C240CBB0AEFFB1C3615219A9CB38E0B8B24CD24B3B914E0D7B5625DBE7E9FAD4BC358528820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A3C41C6524111FDC7435A15805AFAC11E2DD4A412015C65091268F98343FBF79F9410DD37D6E484A95C0B248285101498EA279F2A3E60D0C10BB8F36D23C45AA11CD59401D4924563E60D0DBCFF001C7CA08F5A79A7D01C656971B54C2D06526323047435B82E1E0852B3045256018CFEFD68823CE31D0FCBF7A208B571E6FC4F01A09754A5AB88140948E15030B1D3A538972BE64B52B78242323405C93D843DC24D4A5D0A6B356ACF50E39DB8D738E7DFF115F6C4D9AF637F67FDB4DE063772E1BBBAC1AE2DF03B2B2527F1CF5D38C396C9534DA882A0D3CB42DCE1CD284CF4AAAED9C64BC382F352E410CE32C9AEDCDB5689FD99B3558C50051541B9142E4EEB3D2DAF611F975EF2F7D5B63BEBDE46D36F3F6C7164E218DED5E3776FDD3AEBEB75C66D5178EA6C9BB752C952562DD4843892609C84015CA36EED295B8A295EF1ABB106D50E34CFBF38E95B2B644CC3142D6592902CF60CCFC18FF548CF1B05BB1DF0EDE26CC6C96C06D46D0D9A1294E197383E18FDD372EC078DC2DB0470C9CA0F2CCF4E1FB73C45829626A9588952D52DDC4C50750D031B9B679657E8381DB72B01BA161F75B7788AE763CFB0CA376B63BF8757B536D1DBDB963763B4ACADE1C454FE11789038BDE1242758C8E473CC93A57259BF123032316A48FA994438DD3D4135ABD357789C3E2BC2CD48514EEF16003B379B77D62736B7F8737B57EC6DA1BCB9DD86D2DEA1292A09B2C1EF1C591130014807FD55B303F11F67CF425090D40EE0573A375BD4BF087DB376F613133025050A0F5620B372377E753A18D3DDB3D91DABD8BC66C702DB3C0712D93C5ACD6E26F2D71CB65D93C82B82D8521C1C43887E59D4C413CED9B3F6B49DA0B4992B1BCA228E0BF519B699C5BA662A54DC2AB75988EA0B3963DEFCCDCC7D13FF00E9CDDDBDD5EEFA37D5B697765E1B7828D9DFC05FBE8E1688B861C4385A77A119647D729AEC7E1C401F2E8080CC59CF337A172D5AC79DFC7C903E6BBA9DC84A43A8B3D407AB67A0ABC7DB058A38D86D695A5423549904C09835DCF6497C3279379C701C511F394002189BD0D4E6D1209494CCC671FAD4AC368AA8820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A4AC0319FDFAD10479C63A1F97EF4410718E87E5FBD1041C63A1F97EF44115032268823DA20828820A20828820A20828820A20828820A20860F2149716EBAFF000319402A80206797CE9057F23CFDF7BC11666D2EDADBE06C1164D1BD7D2098653E249F4CF4CBEF2C41166E05BCBB7BCBA51C630B7EC9CB8570A1C71A0DA441E104151CA4C41EC2688232C5BC9654B5A85CDA3E029224AA124663A089F97C48224ECDB61A6108B7484340A884A4400493390CB5A591FC4756EF0439ADA08457F98FA7D051045344116D62CFDD61C9BABDF716D0485A52A24F021225D24682132673F4A8ADAFB59381C217207D24BE74239E55F3D61EE130FBF346B4E01F2AF0C88EA23E367F8C3EEF77F5FC42FDA8706DC2EEA2EEF2DB775B1572A6315BAB75DCA6C6E5388B4D3AE788B6789A5F84B43807101C24419AF2EF8CFE24CBC0CE9FBD3095249F96970519BEF54D9B22CF7B18E9BB025FC94277F777BFDEAFF713715CD99983F988D9AF63EFE047ECE7B90C1B0FBFDE660ADEF076990CB2F5E5A6256F6D8A61697D438C8436F36160024F1839C8AE05B57E2999C66113882778108564697269525F3F38BD7F9094C94EEAD237B2984351ACE5BB3D63B05B19ECE9B98DDC61CD33B2DBBBD93D9BB665294B16B85E176F68F909802108004981A6624F3135C43C4BE3138A54C57CC7DE2436F56A4F17A5CEBCE23B153C4C56E041537FF1121D2332C6C34F4148CB78761B6966E8559D93F6481012C7861B291119240301433F2D35AA12F18668F9EA2CF5AF0D78039641B3A4252E6808604115078F0A173C34D5A24317167736E59BE65C711C2414AC05020F9E5E5CF2E734BE0FC512B09352952EC46741AD29AF730EF67CE5CB9A3E42D285121EE120D09B7534C985E38F7FC473D89374BBF1DD4EDA6D3B3B38D61BB6384D91BB671CB7B4659B8B95B2953A0AAE024AD45296C2046931AD778F03F8BE4CF99282144311BCE456A2DABD6B9DF9741C16D4C42657C9C42E5B28109DD35B5779ED95ABF7B3FF00F4F9EEA319D90DD0EDC63D8922E16EED0DF8B5B75BE1456EA307BFB8B702559ABDC4011F488AF68782270C6C894A0E4A8249734B86BBFEBCE39478DF1BBF3378A80037C12E1C3D1F5173D6B58FA6FC25C53962CA94C9B739A7C2524A48E131307918915DFF00662372424337D3F88E233CBCD59077812483CEBC35FB448D4942505104144105104144105104144105104144105104144105104144105104144105104144105104144108AFF31F4FA0A208A68820A20828821647E51EBF53441155104144105104144105104144105104144109ADD4B7A83F7FEC51045958D5E3172EBD69E25CA1600109308CFA798FB148ABF91F77AC109605B396885975E6C5C2559C3E0288E7CF2E9DFA56B043EC6B6770BBCB77FC4B0687829E2654CB490E056B918EA069C851046161B6DB43B3B72E30AC3EE6EF0F61442129694B5F082604640E9CBFD10465CD8DDB6B2DA6C383E8B67AC9F6F272D1E4043A0CF240CF3D7BF6AD3E60058127562D5CBBEBEB045EA8B84ADA0E942900980958856B12474E7E559F9BC55EFAC11EA882B81993F2C86BD3E7419841673C6BD7FBB41082EE1A6D6B438A08298CD4400644E46B066D0D5563EEF19170FAC6B27B4DEF217BBFDDE6337B68BF1B14BE43769855B33EF3CE1BA5FE1DD52500F11084B9C448D0024E715C8FC7BB653230D3D1F308514AB76BFC6878E7DB57AC59F64618CD505252C10DF31EE4AACC1ABAD79651AAFB8ADD4586CBECB8C7EE6DED95B7D8FAD7758962A1224B6EBAA759487A3C42B6D973848568A112057CEFF89BB7277CE9FBB354594AA856A5D99F8E94B333C5FF00012CA081421830565A1F4A371E7B09636C6C4ADB45D5CBE98042DE5F12CAB55051FF00A857E5E511E47CF3376B6297356D316CFAB539D5B36F3AC4F7D6A4212B4CB3BAE086A0193529D33AC797AAC42ED4DA0A2CF810A9F1784F8E04823DECF3FBD29862264F9A1D44DEAD7BE7C6FE56B0D44909720A9943F893F4B8B3701A449B988ADBF75B425C504A4788E895929039F6323F5A55789F978420ACB806A491E76A0E19650C66CA284155537648A015CBC9F9B690DBF1A5FF0076EADD95248E4993DB5E9DC4F5E75CD7696D5988C428254582C3E6CE79B71FCC35953D52D745117A83DFEFEEF8A37C96F60FEEFB1F6EE2D9B364E5B969D4292381497429052444199C875AED1F0C36B4F9B8BC3A43B1525EFADF4EE474CAC92316A423E62D64A88A026D4AF916D3A45C3EC57B23826C66E3367ED365F09B5C3106EB1277FA4C21A5A94F5FB8E294BE0E64A8C1EE3AD7D51F84A93370787047D44249241E3566E57E4358E61E2A9E664C9CA2B5105BE924103CF37A664C6F95AF1F80DF88657C2388832248072F8D7A525A021200D07908E7A15BCFC0FBE5CA1C5291B414410510414410510414410510414410510414410510414410510414410510414410510414410510422BFCC7D3E944114FBBFF0064FCFF006A208A8249008220FDF4A208F780F51F3FDA88214488007DEB4411ED1041441051041441051041441051047848027E5D688222DF773E7EA72E5AE7F64FC48220578797AE4BFC392C8CCEA741E7AD22AFE4608B86C5AF0841CBAFC3B9ED5AC10929775F89B801014C80380998329CE3B7DE74410CADAD6C9DF1BF1366CA8CC9E3427424E79F59E9441186DD79EC1F780EB966DF87875C2D03C240842211072190939F39FAB259AB07073228FEFF0030466C2E2AE5F6024FF4D29E254130AE2483D391F856AE753DCC10A5C5C1B40FBEA9E11C013AF3CBEFEE300AB3513C6D04446216CEDFAEDDC4ACB49852DD5494C2520193D3219498AC2D442165CD12A373A18C8B86BB86E71CE5DE862973BC6DFEFF00212E7E236536023F1E12A2AB77DCBFB70A678A4F028A1D1CF307A9915E2DF8C1E334ECEDA33F0666B315021F813DC7987E71D4FC39840BC1A5652904E6CD6377A0F74BC66FB36DBB4C2587D88E06F8901034080AE14E404649033E990EDE20F16EDC4ED09B30EF05051373435B8C87DEF16642129510033588018937ADE95EDC22590A0E202D26028498D67CFF00DD51654B0BFA88CCDC31CFAD72D1ABA43C4AC001EA78DBAF0D0BFDD839289199E83D358E5D3AF5A6D8C9D2E425449A797E32CB9D32541053BB40C439D1CE5C7335147610D56E24B9075E632EFF007DF99CCD57B158EDF96B093420D34D2D5F778D9787DE946809AD49176F74E59BC535503825E2A7B004EF2AE7526A0B7E7ED158992CA66804B549616EADEF84620F68571D4EE9F1566D64DD5CDDE1AD3694FE6295DEB685E999C952794666BD1FF0AB602D38AC3929FF00720B805AE3D7EE7A494B5A84BC8848BF3D03E9D78D236AF725B3AD6CE6C060384840496ED10EA931C2429E4A5D5748F789CFE35F55BE1360BE460E43803E8431B56DC78646B58E6FE235154D9ADFC722F4F747AF2CA33D5BBA3C24F1647A65CB21CFA0AEF4A67A5987A7BE778A6243121C1E5D6FFDD216F151D7E63F7AD6378AC104023434411ED104144105104144105104144105104144105104144105104144105104505694983AFA7EF4411E78A8EBF31FBD1041E2A3AFCC7EF441078A8EBF31FBD1045054D289F7E09E522474D3CA882105DBA97F957944E4743CBEF9E74410E59429B6D295192264D1042B44105104144105104144105104144105104144109389242BDE0001CCE9FB4D1045B57B74865478B88C4CC73FF1209F5D288225B0E75B7ED1B7384E723319E47BFC7D6932824921BDFEE32013610B2D694C8022798EC7B47C72ED4990C723CA164CA0AAD85BAB642FDCF78667124A16EB5C6DFF004C0993EF264492AEDDB23DE88DFE466DD03EB9790C83968B3711DACB1C39C2D2EEED9F79F3C286587029D0498F7933AC91F5A23030E4BBB86E5EDF87E229C130379EC42EB13C490DA997FC35DA367FE46C47BC5615A7148E1035ED35ACDC12B70AF79AD406A59DDFECDC21BCC1F2D401B17E3EF236B18BEC2036DF0B412956504F200E9941D341A77E906711FEB7C904EFBB1739F063EB0A84A481561A8F67B656A44462D78D7862DDC9487149F7E3DD94107CF5C865AE50273B1E1B63CD9F2FE605BB07202AB5C855B8D78F08748C0AE60DE410DA532D6F56EFA462FDEFEF230DDDFEC5E278D5E5C22D12AB376DED7C4586C97DE41619E19227FAAA4E633CFCAA8FE2ADB523C3B266AA7AFF008CB5B82A1FF13C5A8C73CB38525ECE5CC514A6AA494BEE976E63D75EEFA05B91B0C75DD9DBCC5B1C478DB41B497770FE2D7484AD41DB745CB8BC3F816A1C4A86149078B2E432815F24FE39F8E93B43C518932261DDDF50001D2F47A5ADEC760F0F608CBC000A71F4FF00B8D0737A57FB8D87B5BFF0D3FCB1E65E408010B526100E5993CB3CE73E95E795ED799356E54482753AB96E678826260E11EA92E03B101FB51DCE629F68B92D0165A4B4B3C4A124A939A7324C4E50454B48DAA809DD20BB5E8C7F5EB09893AB5CDC90694AB7AFE21DA4CE71A9CBBE83EB95426D19D3315BC104806C051EF42C076D7ABE486247BF6D10B70EA19B8216415023DD1911F1D7FCF6A811F3503E52F7897E94AB74A7BBBF96B4AA5697BDEEF5E9D876878D02E20B8AFE93600256E7BA8CFBFA67DF49AB16C7C3854E4AA60012487F2B3D9ED71C6ED1058993BD314A4B3E82FA656E1D58C618DE4E3981DCE2182ECE5C62568E8BBBA415B61E49092CBA858E313919194E875CB4F587C3618695370E5D0900A6EC0BFDEF566A5A12FE32D60A4BEE9A0772CEC35A8B746168DD2D9CC5ACAD3F0564CBCD5D7896D6E96FF0EA0B0809653F9A208D07F800CFD0AF00ED5C14991210264BFE2960142EC2FD0DB5E158A26D2C24CC4C954E52552824A89F9819C12599E873CED1909CC52DDB70B706404E4223300F977F9D77594B913E58989C44A0E0382A0EEC38FE69DA2AD2F662948DE4A98126A74761D34E70A22FDA5E8950F3F5FDAB55AE52003F3659A904850CBDE709CCC1290F576CEDD6D6E6444A34F23813C326674923BCEB07C865A5335E325A4B0208D41E5D3386AA96A45F26E07D8CCC0AB9099046604F0C67E5AD23331E94644962C067FF00DB6F65A1B99890ADD37E7EF5B3C788BB4A92094A927A1107EFCF3ED5A2768EF16DD20D1DC0CF8D7D2174A0AC021AB50FFD7AC565FF00FA89F3CBE84D4A4A0A58DE2CC6DEC0F7D9F3F2D4ED4ADAB4E5CFFABC79E39FFA8F89A5770EA3CFF119F92BE1DE2B4BB2341E99451B8751E7F88D770F0F7D2140A07B1FBD3AD6A43163946A43163945548AD6524D0306E756E3188A0AC0EA7CBFDD227120121879FEE0838C743F2FDEB231209018579C1092AE1093041FBFF34F512D6B48506AF4848CC67666E37F231EFE21249804C7435932D42EC1F9FE23433C26EDCF2FFF002848DE278CA122549891CC489F877A426A8CB2D4347A024D9CE7FBBD28635389A80002F9BFE3D87EB09AF1065B5842D412546005644F909FD67E94C958F4255BAA0D56AD3ADF8C60E2802C401DFB33C7AE2D2525D198ED9CE5AEA7FC548C9DD9A84ADE8A7A8346F7C6F02A7ADDC27E9362DDF87115ADA1AFE2D80095389491FDA489F818A658BC6C9C3024AD34A9721DBDF0D03830E657CC9A5820BD1A9ADBFBB738B4368F78BB23B24C2EEB68F19B1C1ED500A8DCDFDC22DD8000CC95ACE83E755D9FE2BC2C956EA88E7A51DCFBCE26B0DB1717894BA10A3C0073D83FAE91A6BBD8FE257ECB5BA7656E621BC1C171E75BE20BB3C0713B3B9B90A4EA0A14AD7B76A64BF1C60104825D9EA18DBF7C62CF80F87DB631D284C4A02378D1330282868E32D7567D239FBB45FC797D98ED31FBD6AD30ADB7B9B7B72800DBB366B4AF2FED21C00F383A66075A8099F14B672715FE36ED49005BAE74EB6E313137E16ED3C3E1FE74E22953BBBCDAE9D39C7537D943DAB3653DA8F77184EF2F636C318B3C1B17F185B5BE2CDB68BB3E03A5959525B5149F7812209C88E8455EB656DC95B51095CAA6F65C3D7AE6C639FED4D953366A9495D4A0B1777ED973D637090EF124129209131D3E3156058280F43C8F2E1C620D13378B311A93D721CA2AE31D0FCBF7A13F53366FE4FF0088557F43BE515020891410D431AA54141C47B446D051041441051041441051041441142E214329313D4FEBA510441DD61FE31396B3A67F5FBE7144116EDC58E2ED38A45BBFE1B00FBA9E25089CCCC69D75FA524B51721E9EEFEF9DA1E61D28287500E4E6389F7588F5D9ED01822E675CF8D47D7335A43A094E4057AFAFB31430E5C38DDED93E034FA1290BBB57BA973881885E731FBF9D101166715CBFA3D85333990D706D8FC2BDDBEB809BABB0A2A4B8785680AE23A1226040D3A40E704614486622D576F6E7215B68F1925A49084050485240108D0002123E1197A695AE331625C929CCD88E4D41C751DA18CD413535009B8F3F261AF011497614467AFA76EBEB1FE6AA5225AE662F780533DCD337FA587BB57368AC48954CC137F74A9A30A5E18E236D6D76DF84B212E6AD9D0A888309D27400E7CE3A55F25E32660A56F95B0082F91A248CFC9F4E912180C7294A00541B8CDB3CCB665EA0718E597B6FBB8CEF0369B61B73F845CB96CFE2578B7AE54CAD4996EC1D6AEA1C89905082065067400D78CFE37F8C4A7FC994164B058A13620F117BBD0718E9BB0F65CA9F2862124013189529A841D73FBD3AE68C1997B05B7B2B266D90CDADAD95A5B97B87852A71A61B69C515692541473CABE5CF8C14ADA3B5E762007056A2146B43E77A791D22FF00224A30F2848241DD01F7454BD6A1D988E2ED17336DA5E22E3C443EB4E7C2D90A333066333D32CE67CAAB08D9EA2E40A92CCDCAD46EFC808C198949284A4A121C1DEE232F4EBAC4DDBCBCDA5650A6C1905247BC08CB31F4CCCF5A7A8C1AA8198B54E8F95B8356D0D17300A3D4E6FF007FEB38916DAFFAC18D32FD33F5FF0074E656CF35A10491522CFE8D5E5943698BDEFF00711A9B69FD311C231A6F0F0ADA2C5ECD769B397D84D95E70C071E756DDD024E454532476CF41CB28901B004C4098CE74B922D50DEEA79624CC095AC12B3BCC5CD5218656E02B7C8EB801BDC96F571869C631BDBCC5ED5974903F95624F200049309E21D08E5CA9038656115BCCDBACC2D6ADBCBED1BAD6925560750CF4008E397DE2DC77D8FF000A7AF6CEEEEF6EB789738C30B5AFC7388A576FC64CA4A5447140F9721573D81E2B56CD5A1456A1BA430701BCF26A1E1A1AC7CC595294459C5412E4B74D2FECE44C1F731BCDD97BD373856DF628B602006138B624F129012520980069198CF5EF5DCB60FC619D8308099EB1BBA28F0E34F40618CF4A672548504AD2F621C3F1D4E5700DE2FDC3B6977D9B1CD2157ED5BED132C294A5DD3097EE94F02660AC91309CBB1CB4ABCC8FFA81DA4852509C5CD01C0AACB3578E435111337092C277004A5811BA96043BD59BF558C93B37ED2EC17136DB4BB3D88583A212A58B50D3614041CD674CE672EF5D0B617C73C562952D33F124A54D5DE27CCAABA1CF38839FB28B1DC52C924B6F3B6B4D2FAE7D6335601BD0D8DC7941FB6C79AB37DC88B4B9B94204CE49080499EBD08EE4D773F0F7C42C163928F99392EA6FE4A0D5B9A97B674BE510D88C0CD4072016D3F96879F6ABF01191BC67EF5B4B8976DD76CE094BF6EA2551CD5C432939673E75D7765EDAD91884A54B992882D5DE490F9558F971A8688C560D2545D2CACF7A84B016CE8C5BD6CF5B6E069210DBA5D4670E2D4173D4714C64646556F9123093A5A66A11294156290922F46A3380CED9C2C896508B330ADC96FC5AD9C48B6E92331946503AFAC79D23895A70E92D714DD1DA83DDE82125ACB543317E3C21D0526341E801FAD468DA254A6097E3EC7BEF0D97308B5341FD7E5BEF5A4A4E994F2FF1A7C3D69F4A9E99A2B43D9E9E46F639776EA9CB0ECAAD3A67D7CEF0BA220693F3D4D616A4A5443B935157E37FECEB0A4B51525D5724FDA2BA44A4ADFF00AE83DF38DE102412634FDB2AD7FC71C3CBFF00D608F2B230E9F607EA086EE708566067CC810329FBEF4BFCEF94022CD4B1AB572311B389DF60F6C8FD87BBC15A1C600F9B5873BD1F58525CBF983EA4D746A5CEA0E82185F3B656ADA5E7DC5214A39F86614A8319CC4C1C8672396B934993D0B503BC1D4ED5CBA16032275A43D95B3D730EE84D732065760CF907A88B3B6AB6DF65765B0F5631B478BE1985E18D214A55C620FA185A40199E224267BEBEA29B4C9725492A2536A03F661EEB4687B2B62CC98BDD32D4496FA98EEE84BF06FEE3955BFDFE30BECABB8BBCC5B0D6B68713DB3C5EC12529B2D9BBAB3BF4F8A50A29496F8C2A01D408CB903542DB3E3093B2E62B0C998A0A4B8A1A6BA81AFA3DA3A36C5F00E37192913552A57C823EA0C77EA28D6F4E85A388DBECFE3CBBECDBBBEBAB7DD3ECF613B3D8195AD2D398EDB3F6D8B96E4F0AB89973878C8CE4643280245738DA9E3D54C27FD4357ABE5C6B9D2F46D6B16AC3FC3D129BFD206B761992DCACDDDDDA39D3B6FED7FED39BF5C5311B8DA3DE66276F86DD70F16096D8B5DA18680490B4B76EB51090A1DF3CA6A8B8CF15AE62C8DF24AAF527EFE4CDCDA2EDB23C1C990A4112D346B8C9EE28FE51AE78DE39676ADDDA71AFC6DFE22B0A3F88BA8778972493C4A20E67BF3CA342C7FEFAB50BDE97AD69E9E51D4B65EC544B4005291BA34A59CF6EFC811185B0E606278AF05B3AB37B8B62D85DA35689325297EF1A60C379900A57396A290C0C85E2F69267392EA15A117EFADC6B5884F154E461A42E582032482006B7E473CB468FD14FF8766E72DF72BECB3BB4C19C6CA2EEDB0D174F248851388F8770272CC8F167EF2F5578370DB9869273600EB517E793B5695BC7913C598BF9B8BC44B3FED53825994F577E047D9AE23A1A93C494ABA807E226AFF882529000A65C6CFE6DECC52B0F55BDCB9278302DE7CFD60041CC5664972068FE6F0E27D52DA8EB710B2343E7FA0AD95FC8F3F4A42328302346FBC57588560A20828820A20828820A2082882122851513208310348A208560741969DA8821A3D6C1C515152B38C81D0F68A457FC8FBFBE9CB942B2E66ED353E5EDF586CAB04ABFB9D1EA63F4CFBD6B0B7CEA30207FFEA9F6880C6F6751895A1B66DE76DD6A20975A5702D4279A867A081D46BD0119130D492492D9E598EDCF8C2D85E088C330F45936FBCE2923375C502B3273CF4D39FA5119F99CDBEF639B5BEF12008B5050AF154948F796BCC99EA7A74E7F5A467618CF0031700B3FE3DF2816A0A41248B331390B505B87DEB152805A4B8D9E21049CE4E43B4F4FBD4AB84C0224A82D4056B517A93C3AF663157C6EF952B75EFA114390A7363722ED68B7AFEE12DADBBEB8712D34C3370E34851E152FC36D456540C03F964768CC542F8A368CAC360E67D607D2A6FA99AE3CECF9D4D6253634A9C54860E094B8625DCB1CB4C9BCAFC45DB7F691D911ED23B53798B0BA7F15C11E6ADF675868A14AE37982D5C00951E3954641199244D7CE8F8C38D9D8A9F88521649758BD0D59A8C19B2B47A5BC298290AC1CB92B037581340E480F9687BE5568CBB84E39BDDDBE71972C1BB6C1B01BA585316F8925E63134B6A5492EA40291C5AA0E85275E55E47C46CE54D9A4A85779553EEAF52D121B5548978829960519D839A00D5152D4BF03C636D763765EFB02C350BC42E7F1576A4F12E1456DF144C0E283049F5035AC4BD937FA43BB00C41E449B0CBCEEF15F9B8A2A59417E2A0EDA70635ED98117AB16AFDC3697941A41512385220009240D27BCF7A7C8D904B7D15F27F2D7422838C3533C2014825441B90E7BBB43D459B89E69D3BCFDFCB4D29C276492A622DC1802296B1E6FCDE105621F3B59957E6FF88A6E703B2B8683A96909BC2656EC09510444919E42227A6B06A625E125CA921012A2B63BD620F07F7D2F088C5CC44C505281416DDB922D723956A5853587B6B87B4D33C0F296A580608323CB965AC79F28A86C5ECD4CEDE0DF5170187BFED9A8F189B899A4FD0CC4DCDDB872D3CE133873438D456E05E5C1044089D3991D79C54327C3938A8B254483F4BDABC72A5A03314A29DD2376CAD6DCB3E6C6D94242DDF7521170195849212482441EB3D80F86752786F0E63A852086B81A5FD321F78DBE9DD26CAE19F3A738F51645B5296979CE1207FF001B8A2D8408C91DF9FC69E0D97324ABFD451749FE24E79F115AB7A65A6EA492E91FFCC456B98BDBADE2DCC67671389A148FE578392ACBC47191C7E64C6BDC472EE2A57098F5E09492950013A65DAB95C1343586EAC3862417E7DA8C29EF40D8C712DCEE1D8CAD6CAEFD5835E364290E614E861614731275FDEAD381F8838BC090113961233DE37EED969DEB0CE6E0D2B2494D6AECDE85F864F9E822350FEF4F7560376589BB8FE12DCC26F9E7AE6E3806790100E444E9A4559F0DF1AF6AC8094A71539280400CB56B5CC0E43BC319BB39054E101CEA32BE84B7F6D431943607DA57673137D9C07692CAF301C552AE05DCDF368B6B0796A248F016A32ACC00ACBF3111DFD31E02FF00A81F9B80932313892576FAD7516E24F13DEAF1058BC1A82D4121806B51DF2F57A74A46D2DA6236D72C22E18790EB0B48521E4AB89B5057BC08568723967CF4CEBD0FB07C6B276F041F9A0EFB31DE70FA82E5F87488C9B2181A392E0822BCDAFCC5697687CBC4ADEDDA6D450B794A2470B602940CEA474CB289D0E95D43038144E4158DD60017C8BE64B1D73636BDE21E6A56926967C891CBD3BD9E1F255C680E04A803FDA47BC34D47DFC6955484CA528A4BB1CAC4559BBDA90C26129C8F4BBBD843A654481FF975D79C5472D6EB22AE0DC9B30CBB7087D20BCB079FDA14592001D67EFF004A7A9237732D702F5261588EB8BC0C29280CBAE951CFC34C84CF33F7D69CA64EF237F7D22B626A5DEDC9ABFAAE5AD6AF71CE2BB8B945BB5E32C1298931A8F3F2CE7A4674829494920A998B7AFE3DD1F1112DE356F72B73C169D5A1A897801C19CFF74F633D0014B8952E6A77C9497147A9A3BF2F4F386C70AA98A4B7FB89B7DF367E50C76876B304D9AC02F369318C42DAC308B0656F5D5E5C3A96D96508924ADC3EEA6025524FC63484C7997252A5EF064BB817BD1AAC28EE747B9896C1E109989941277CEB6D79E8DA18E0A7B647F1CEF672DCD59639836EF71DC376DF6B6C92F31F87B4B9B5C46D9BB8014801286DC0B052A1EF4E7293A72A26D3DBF2F0FBDBA40A666CC2E3D0E61FBDE3666C45AD43E67D24336E50915BE7406C3A068F93CF690FE27DED2DED3D8CE22FBDB71896CA6CB3AEB9E1E0985E217564A530A51848B7E2289E18303204F3CEA958CF1B1438334B00400154CF5E83BC5E70BB092129FA0BB8A33E62BC41D7D19E352F655AC731FC4978B5C620ABB2FAB897738B3CA73117540FBE5F5E739E692732233E75CAF6FED39FB4710A9A851AB9727D2B5E14A748EDFE1CC148938044B28E7415E56B1E3EB4CDE19526DA54DD895369F79C00F1E594827B0FBE74E9F2F12A7FA946A6AEFEC657CF8C4E2A4E140277464C186B5CFDD1A14C3F6999B26CA584DB32FE61C7D43856E6A004A844C4C08EDD2929180C44D58241041CDF3CE95EC38E51A7CF91203A4806BCCB52C33AE6D912F18537938DCADEC41CBCC482585202DA65CCD7C6A480509332003249D055830BB1672EAAE14A6BD73CB8D5E31FF7C932412E2C74A30CEB95697A56CD1D0DFE14FECC175ED3FBFCC3EE2DEDAE2F3677642F70FBCC5D7768E34BC55C0FB019500524A16DFBFC530418ED7CF0F6C55267CB74BD45817A5DB8654D699C722F1A6DE42BE6913004905892181A80E6CD501AEF5CA3F431D9BB0B7C1306C2B08B56C2AC6DAC2CAD136CD2415B26D5869A1EE400904A24EA20798AF49F8730624C8410186EB579598F1F5B078F2FEDCC519939656A054544BA5D98BEEB74A3BDB52232234A3E1254A82607E5F8019F3EB53D8B6000E7EA3F0623F0409054482C00A5AAEDE5F8E752223D73AD30EFBC092F42DFDFB6873882C87F7710E11A1F3FD052CAFE479FAD611945C13AB7DE2BAC42B0510414410510414410510414410510414410520A0CA3EF8FDE082B10422AFCC7EF9511973A9EF14D106F1D4F7860DF8CAB8BA4BE10AB684F8204951CA4F148826748F2E735A9C5A650751B02CEE7EF4E7A16778C09BBC580AE84063EEC6A6F9443629B4786601875DDF62453656B6E852CADD86D30013CFDDE5CCF6D74AE6D7F1548C14A51DE09DD06AFA5433177763D69430FB0FB3158B50F9680ADE672059B57CCD581E2F1CDFDE56FCB787BC1C6F12D9DDCD5ADB5CD98E3B5BDC5313438BB669B7125B51C35E6090161255C53202C0D6BCD7E36F89328A66CB137250A9B5C3DF507A3F38B860362FF008DB8A5218674B659B50DC509AE9168EEABD92F6236318BDDB2DA2B21B57B758E3CDBF7CFED0A1ABDFC1BC1D24FF2F2A4F88D8014A8933091E9E5CF106D795B5A6AD5BDBEE54595506E0E64D281B325A2ED85DA3FE1CB32FE61960060A0A62E1A879E7964CF1B9B63B1D86E1B6ACB8C3447B89290E2471A724FBA3A246881D001CEB9D62B664B52F7D018073614CAA3EEF4E108AB6B4DC54D50984153B1527302C78DB8005DC9891B64F128B440E10787CA63491A7AD272F67241FE2031B8041200E55E34EC0C6AB98A0EA2C5DCDC9E1C3BF9522585B86FDC48303CB9E7AE9F3A792F673D5A8C031D682DD1BF30C264E5283871AB0A9B0B547BEE785D95F0FF0014ED1B2C33EEB16CC1AF260DD4F7D10F9A599D479B7A8CA3D09E1CB3F5D6994EC0284C6018756BFBB423F3EBE66833D6BEF8C7B4A48D9C1C2D6064F47BD6AFAE5C7BC3844DDE00062D71E9D385E8D14139E5F993981C8CC4FCBECD4EC8D9F86491BC9191B015E7D87EACE12A041191BEB476EFCA1322091D3F6A974C9C24B05928A248A00F6CBEF0B82E1EC4E9CCC56940201CF3CBD7A695CBFC452A69C72CE1DFE5BB0DD2D95CF3F57845530A0EED2F753D7367D6A2CF9F5ABC2ECAF87F8A869783C44C0CA4AAA2D56E1771F9B88D7E6162412599EA73D397210C8E0F6C1F55F2DD5071504A240D073CA7A7E9DDEA36229406FA40725BE9E37CB3BB346BF31CB6EA8F162C6D639F56D213B976D5D4969DB64BE902389490A1D33F3D3F4CA96FFD3A08344922D720F4AD9C3F93C6C4004A98BF07E568B2368762764F69EC97677383376D7290A2DE24DB084396EB2642D0F1CD241CE6397A544213B4B66E387C952D3292A0480481A5851E95D7267845782DF3BE405050240CCE7A54B861E4D5318B707B4DE4EEAEF14EE0B8CBDB5FB3A544B96F7AFBB7CE5AB4924F0A12004208048E7A67CABD2BF0F7E224ED9864A67E216D2F75C1516AF33F8FC4362B6703FC5212EE2A08347B7EFD2367776BBE2D99DB05A70D52D16F8C3502E2D5CE04A90E1904044950CC73123E75ED1F097C58C163254A926783BC00502A1C19EAD6627D728ADE3302B1FC523743B8CEB9E56CE8391158CEC16A2DAA0057BA4A38648D32E5F0D632CABB16076A4ADA32C2A52810A17497EB47CFF262066E1EA686DA6432D0713C4F111E58ADCF0506E3DD72552279126358E47965D28988DD9B7725C9D052312D3BA902DC0C3C52D2A882329D48EDDE9FCB4921C0BFB17FB7DE3788F7D01FE34F8A5942735ADB3C2B3D33CF29D7D7AE44E9A99128953BB6593E5EEEEF187AFA9C873310B718B58D95A3A1E778AD5A0A2EDD5C94964093C456BD00027B0EF3548DA9B6C4B593BE46ED6FD43D6B5D736BB53748ABDF22E282A19B9F7BE4CDC7DF6F5FE2F5ECE3EC4D86E202E2FAEB6C36B196969B6D9ED9272D2FCA6E4A6129BEB6E30B0952C8200CE388C659D77FF5FE1E4A861953909995AA94C2E5DFCEE6D5368B56CED96AC44B44C4A014577C815625830B39B13C0B111F15FEDC3FC6A3DA8BDAF710BDC3F0AC7F1DDD06C3DE3AEB565846097379818BDB75A8A529C4184AD4DB9C42240CB356550FB43C609C4AD72E4CC1398FD664AB791517D0EA7AE6C22D5B3F634A97BBF4925FF92C7D4FABF0A7ADA395F84E078DDE622EE33893ABC531ABA597AF2EC294F5ABE552A0E070C2D4B20F12C9D5649E66A83B4F689C5297F2D4ADD36DEFE56620E82EDCFA8BF6CDD9E12120A4134AD08EA7FAD38C648C31FB5FC4A18BF47E19F1C291E100949E44C9CF21F03C8553B1180C5CF5B82ADD7767367D2FEA783C5BB0F864A775EC187D5567B90E07F4C4466CD96B816F72B6997896C04F01E29CF84731D3C8FD625709B2CA640F989753177048F57B171CF361163C2E21725210927746552D7FEE9F78C86E5F3C2D5E01D3F96667E1AC1EFA7956B330528120A6A08CA9D72E17ABD61EAB10B2C9049CCD781E6F4BDDCE6498C4B88E32BB40E3B7971E1B685136E4AA38D45449199CFDECB2F8D2B230B2CCC0C81CC0A3D05B3BD39C44E3A74C092A06CEC3837524FEA31DE39B4F717EB16CB42DFBABC7ED6CEC6D900A94FB974EA18494A355105C4E911CB4AB56170B2804B804532041AFDF2EFC22998EC64E439DE51BBD4B0FEAF957B1FBF2FE04FEC896DB81F662C136DB1FC33836D36C6D85D622A5B205D34D78CA72D64A93E20059746BC87202AFFB0B67A4AD13129B33306BD1B3399A76BC71DF166D19931464A95F4AB789075150D503DF48EEFD95BDBB3C4A67371E990A8CB52223489CF90E935D87038712B0E80C599C96BB0CDA81B839EB1C7F1B89F9B3D8549D7514AFB01CDA25D8694D3010A571112A999D4F144F3A6D8E98CB1734A0FBD876BB44A6046ECB2090E58D0713FAF6F0A224054093965EA6B6C2972391F407EF0A62BF80E7F88748D0F9FE829C29DCB97E36CA1293FC7B7A98AEB585A0A20828820A20828820A20828820A208283404E90426A58989223A18EDA73CF2D4532F9DF327096902B4734F7CCFEA36092438F7EEDFA8A38D3A052893DFA7953B54ADD04BDBDE43DE51A2F7902A070ABF93088C77114A2E0B1E138B331C604A64C6A67BC9903F5AAE62B6D4AC24C3294952C82CFCDDB3CF2BF384C6F28D378F04F36F7ECC2AE5DB698E24AF212A29CF834FCC7ECF6A98D9D306D097BE92CE1C0A7637F6F0BA70EB51DDDE21C3B17B67A03FDDE2DEC5B1FB3C3ADAE31572ED962C2C5B5B972FBEB096CA5292612AD388C10419CFA662A9DE2CC6AF65AD692ADD090A2429B9D5FCBABB185E56CC9BF3A51049269BA5DDBB5732281E39D9B7BBC0DADF687DA0B8D99D8470586C8D83AA6713C56E54B698B86C9215E0BED92DAA0A5691235307531E55F1E7C424C84CE97BE428053170C2F6FC9B9E317DD9721184402A439A1500DBC454D985B36343934664DDE6EC300D8AC0DAC330C75C200972FDA523F10F3AA3C4E9538912A4F19504C9FCA44F39F246DEF16CFDA78B5844C56E952AA0F13C69976062C93B169284FCA4A0518850147A061C5F57A5728C9E30D65B4B4D332EA1325C5BF9BB394709D067DE72CA29FEC3D978AC6292BDF25370E4BD6EFC2B50D4E358AFE2FE6CC7650E0C580CDECF7A1C83EB0ED4DDC7861A4B9C484880567DE8E84F6E5F0EF52F8AD97364CCDC25E81C1BBD6C19A86F0E30A7E5206F01BCEE5FF007EF46786ECD9B8DAB889124C920F3EBA09FF0011148A700C5C8F2ADED63966E4DEA61D2A7053B9150D70C29CF5FCF08921319EB4ED18548CB93DFD0FBE10D94B2682803DA84F33EC426A7529E44CF97EF4B09433096E03F50814A8DC8E4E5BD228E20A923E741C3CA374BF36FC424A9449AEF1E469D29482B53874D40602CD6B743E50B4A0524124B747A0A353D6E1F8414DE648985B74D9E9563A519BD5A1E226240AB5793F23584CA0924E59F9D47CEC1E35544CD2903FF2229470DC7CFAC2E89D2C2402AB727EB0BA084240CCFC2B28C3C84A00C44BDE99A90E686B535F2E1C6194F52A62DC1000E3F703EE62AE31D0FCBF7A5449C2972896906C1C0A33F0A75E9946A14A600914CC67A450596DC254B52E0C6423C8EBCFE548AB0C924EEFF10EDD790A6679E90A198A09A11BC727A0E2457850FEA02C3491FD3409FF00CB9F63CB23CFE1DD33849AFF004EF30E0587DE83EF78513369F536562D6A171DC8E6D10EFD95C5C38A0F381A6103DC4B248F132829781FCC397918D66965E0F0870FBB3100CD62E480E789CDAB6E22F487D2F1084A494BA89762AB26AC4A4D18B1B0CF85DAB9625F49B77382CAD888526C00429D11FF00ED1A2A7B81A9EB3542DA88C5E1967FC75196905C6E929B170E539DB33D2D0D66265B28A54A528D5D4D47B80EEC0BF105DAA5846BD6DF6EFF0013B1C5DCC6F76C9561F8F2B85C78DC4B56F745B0090C168712D5C20F10CFDE396822C7E11F1963F6762A4A66E21659401FA8B1008096CC9D72D6EF11388C2198414335406E3776D0D99B3E117EEE67DA770EBCC753BACDB65BB85EDCB29F089BC29658B85841582C970F88B052019E73CF9FD00F85FF001230F3244846217BCA5000B9A1714BD620315B266B19A94B807EA09FE4C7986A3871F88DCAB3BE57876C8BA520BCFF00190B41FE9848CD3AF2298CF31CE73AF4361F684ADA4533A5325243E42841E26BD74CAB159C4A55266143021E87D5DBD323A3C4938BE00550549001E2198331A7589135609612100EF2599C97146615BF6CEB1B4997F3684B1CF2D5A87F3EA230E6F3B7C5B2BBA7C32E718DA3BD69087504B5685C407AE1491010CA164712B888100EA467A550BC5BE26C26C991314B9A93BA0E632E9A8BC4A61F644D99BA405104DF235BF12CD4EACD6E6E6DB6F5F7E5ED28B7F01DDFE16BD87D81794B6EE318BF62E30EBEB8609502BB47DA25B59D609C80226BC87E34F8E7B3F674C9C962A3501B758F98EED46A71964786310A620B39760F605F95A3125A7F0C1F673C69C462FBC5C2DEDBFDA0716A7AEF10DA466D71271F7D47895C4E3A9E25210A242330427872E9C2B1DF154ED19AAC6C898B421C90016A0241602D6F4A5CC741D8FB31586C3225A92193725EBE55E74FCE16F685FE0B9ECADBE0D9C7ED304D9AB6D95C69B6949B17B0AB4B3B2610B2212A5292D9500204C09E94B6CBF8B0654C08F9AB05446F1DEB9763636A1AF4CA9328F9685329296A1147B54BD28F947C9E7B6CFF000F9DE87B186DE5CE0B7B762EF615E717FCA719B65BAE043613C4A4DD5C1425B1EF282120089D6BB3F87BC6183DA625283998AAAC16297C99ECF9F6033899C16365A5410C2AD6CA8D90FBDED1A02EB88B0B979448BC55B94153AB1C725794A5594C48E233D72E47AE6CE99849884A952D2491A034EA4F5A18B4E16626687B0CDC50F56C88CCD416ADA2ECC27690D9DDAD65695A161247826502139807491306329EB90AD316100ABE52581B5393861CE1D89E25CCE160722E2D5BD74EF172DCEF01BB7B7712B0F12A040800807389CF4FF0476859A852890189CAB53517BFBBE50E918E949014402CF7FC57BB4611DAADA6B9C6826C9A2E361A2B5B4B54849CF8B32390233D2233E54F307B3E6CC50AD1FB1F5AFDDF9C56D1DAD21285380287477ADC5AF9DA3AA7FC1DFD86B6EFDB13DA576371EC730A69EDD76C2DE1BADA2BDB961C55B5F29482E590B470A4B2E16DF6929702A20E99D5CB67F87F1535490154A67F4B1E5996A5F80731CDB6B788B0F21330A81234003F02DA0ED4BC7E93FB01B1D65B21B278760382DA37656F63676F66D5B9406DB422D9B43321090350991020FAD752D8BB25785968DE7269BD5156F2E39FDA38C6DDC71C74F5A83115DD29A5C017D403C8DE2EE4E1A5B750B4A885092449E193398112739CFD7CAEE89E94CB32C83BA02402C09D58EB9FF4E6291330330CD0B05AEF52280B0E41FCF8C4A21B73800594F144652447EFE597D2A33152CCC5BA012D6BF12D5FDB651338649948017FC99A99313CAF7AD7BC7A968A673067EFF7ACC80659FA816B5AB61A429387CC4B0A177ADBCBF10AA41020F5FDA9C13BC49D75ED09CB414062DD3A9FBC55588520A20828820A20828820A20828820A2082B06C73A1A6B04357092A910620C73F874D29B09252AF9C4589ED773A7E381261647F11D7D63DE11911023CB39FF13E5F0A5D33E5CC05233A000F31521EA74E7570F084EDEAB351AEF4B5BEF0D9684A5D04244281E3312721967F4CBD73A85C76C413D66600924D4D3215AD037BAB08DA4122C0F3AB7E351AF1CA20EEAE59B017F7D7AF34D61E96C952D6A00200499CC809198EDE672A8A3B5E46C1428CD584A520D5C0667E79BFA8689297294A28009330FF001EBAF0229F6BC6816DDE37B53BE6DA4BCD8DD8CBA5586C660EF70E23888716DA71343A78D6961D6E5B7BC35052083A695E6AF88BF12E562F1D3A5A673B3815A160455F419F48B860F0DBA8131613F31817D1A819EA1F3F3E394763B63B03D89C359C23006529B27004DF82948B953B3EF28F04020B854A93CB3CEBCAFE2BDA29DA6B9A42C2829F37B917B8E033B7030FC214CE48278753F8148C8ED5A316484DBDB28ADA4E609226559A81390C8935CC8ECCF95882A6DE0083BC03839973D79035B4094A941C8097CB870A690FDBE7E93F7F1E9F3CBA06C4C6A70410924815AD038617FB76D633B8751E7F8852A4F138BFF2166685120B541AE9C1ABEE820DC3A8F3FC414D44D39953F03FB8370EA3CFF108B8E70923E9AF2EF59F9BC55DFF0070141CABEF8C3271D83E5FE34CFE347CDFFE6E35FDF383715C3BDFDF1685DA3C4DA4F6F8E7AD1F37FF009BBFEE0DC5708528F9BC55DFF706E1D479FE20A3E6F1577FDC1B8751E7F8828F9BC55EFAC1B8751E7F88294FF10CE0666EBD9BD34A59E33F2D46CC7BFE20AD0E1021C6E8074A7DC463E5A8E9E7F88A82E0465975EF9F5A6EBFA32A644501F7CA32259259C41E2F74FC7FCD22AC484D013C2B4E8CFDED18F96751EB0D1D77357D807383DF5FA0CE9A2A7059D586AF5E27DFE5D252C18A401714D5DFA8B70866E3A0F383CE35D3CCFE9F3AACED762853598DF3A12FFA6D2B19DC4B73E6F4E74AF0885C55FB8B1B471F48438FDC148C3CAA55E004901DE23FD9C40F2CA35E754A933D3227A565552A1BB57DD635DE177E0F58D0A415802C9BB1707EE465FD574CB7FBB977B6B311B0DE56C95D2F0FDBBD970ABFBD5DAB85A4DE21094B81B940F11CFE8B452412012632D0FA3BE1EF88132848054CC520DAC14053A1F79EDBA4EF02DBA5D801A86AF2BFDF4CA7ECA3ED9580EF81DC4365B1B4230BDACC0128B4C42D710E06431F854A9B2E942945690E2195384919EBA1AF7DF8476DE1BFEC72F10A9B2C112E84A9896B76AD3D9A86D2D8E573153132D4402EC915AB87000635ADE9D1E28DF57B746CDE07B46E6ED776CEB7B59B5C54AB774618A45EB36CEA9328F13C1571A0093AE723C85517C63F1651B2513512E781BBBC1D2AF3BF00F916BDA37C16C73F4AD482294045B982F4EAD666B0C3381EEA76FB7938B33B59BE4BC7EED9B858B8B4D9F4ADD5DB59A490A48FC2BE084710E052A3533E55E57F15FC6156D33364AA7A95BCE03ADF5E3DC5338B461309B80580160010389CB8D73E31B8786E0D6186616C5934A4D859DAB6136D676E435200192DB040CE01CB339EB9D712DA32D1B794B9AB65397AD49AFF006FD2A1844DA48410000F99E7906F74D6B0AA5CF1471F006C49012040001C8C752209EB3355AC561938196A909002402E05B33E67DDE25E52B725303900C59DBF157CBA45550D253B93D243B3827A0E99FE61B2D2E4B8A5DFDE6FEDA39EFF00C4A7D97704F692F672DA8C1C5AB08DA0C3B0DB8BDB1BB0848B91F850BBA7385C82B1286B87DD1A6B3CFBD7823692652A424A9882C43B5A9A9B74C83DA16C0CB22728B9214CDA0028D90ADCF334D7F3D2DA1B16B66715BAC19E654F39657F8A58DDF12415715A3EEB08E2D39B79157975AF56F87B1699F2905C10522CF980DE6743ADDE2EB83514802AC59C727AF95A95B8D71F5962096C9466985AE12A1060A89032D321979CCD58A724A8D29C6CF4D58F935844899617F5172DDBDE66FDA14C4F1305B3067DD33DFD674CBFDCE68230CEA0A22B5BE872A0ABD33E30D27912D0541419BF8E46BA017E59579C3EC5ECD637BC4DB7C1361F044ADEC5F6A313B2B2C25A6B894A2872E1A6AE8F0A7DEF75B70A8C010019D60D8F676155BE9A549C85068F6E428FC294A36D9C7A50140920006FCBEFA77148FD383F8597B1BE13EC77ECE9B05B0C8B060ED462F8622FB687130DA7F101C7D28BC612E3BC216327783DFE4234AE95B2E514A529003D1DF2FD373BD9C57906D6DA2899355F52884BD07F153BBB9CC69CDA3AE167C66DDBF10242C0293C208100C0D7392209E5D2AE5202826B66D69937DF93C5594ADF2540B82491571D21D4099813D79D388D60A20828820A20828820A20828820A20828820A20828820263A9F2D68820A208681242C922049F9CFCFEF9D656DF254FA1EEE47DE164FF0011D7D4C567E3E550924B4D014480E737E3DDBBC22BFA9DB36F2688176E1F55EBD6ADA92D9F7787C6301C912A2D811300E7940F2CEAC7326E1E561D3316A0FB8A26A0E54DE7ECFAE90E64A52900A92E4359F8B3DE8DD41D234AFDA1B6F71CC5F6AF07DD46C4DD326E6E14E8DA4BAE35163096F843ADA6F548CD83728E24B1C63DF30398AF1E7C61F180C11C4A24CE228AA24B53BBFF0064F3B3ECBC3A66A1334A46F1D722096637D3B9CE2736476551B35875AE1F62B0CB366994BAD9097EF1E7614F9BB23FE44870A8B71A24E7CABE7EF883C6B88C4ED25FFAAA037D55735726E5FCE9468B44A9094824951DE1549341C86BC7F4D7BDBDA9171F8D7084BCAC94D23FE088E1E2819F16A74D49CA9CECFDA7FE531592A7D59BAFDC5BB88544B480C09E04D48FB7944BF0210785B2A299C8AE264EBA72074ED560DD9653BC012E1CE84578D630941DD01443825C8170F4F7E50F112013AF413D35CBE039D454FC52A52BE82522CC29AE9A91ED8C6CA4A697D037BE66292F2418827AE83FC7C2A57058B2A940A8DF2068393D89CF3F383743DBCB9D9F9E547F2F3C71FF0053F114F3FCA1A9FF00EA1F98CB0D07610D5E738946011A73CF4E51F7AD63FC9FFC8F71F9BF970818683B0868A4A892441E809F43C88158189FFCBCC77B8F7DE061A0EC21E30785B4854939CC79D60E24E4AF31FB818683B08578C743F2FDE8FF00255FF2FF00EE1F8818683B0838C743F2FDE8FF00255FF2FF00EE1F8818683B0838C743F2FDEB2312A71F5663307C9AB06E8D076838C743F2FDEADB809C9387493BA685F9F11ECB528C6022C0123967941C63A1F97EF49E216835052189766AF36CEF7FEF0520906CC5E99F384D464935018A9EC0A4101AC469F7AFE348374053F0B69C63CA839B88DDB9AE8F977AFBA5E009038F3860FBC12E2926728CB91CBCFB7DE74CD38B4998C0DC970FC082E01F3B5DCE65D210E12EC4077198734CA9C61929C2A39653AF2F84534C7A3E64B531269C686BAE66F67E758DCCA4BBE438777A57852FE69BC8B552136F745D26F012DAD59A590DE64B44FE52ACE48D4F3E55CE31E172E7024167B8B38201E1957D18423F2C6FB8FF0069B0A9BFFB9BA37DE2DABA4E1D86B57CFADD0E61CCB4BFC5BBC414E94290A1FD654C70415083309ABEF8576A2E4197F591BAC6F6CEE39726B17221432986E9DD0A361CAA47366CC671C32DB0DD66DAEF1FDADF15B9DC762EC6CAECD38FA5ADAAC4F0E7DCB26EF90E5B1427F00F5B8E071C6E5C4BBC792579098AF42E07E2A1C0ECC18233C83BAC06F3573ADF2D39BD225A4E065AA4EF280B5185DEEE286ECC0F6CE3A59B89F642DDFEE52EF15DA0B172EB6A76BF1816EEDE62DB49E15E3EC3C904BAAB67C00E264A9404C9223A5722F1778AB13B5D530A6728EF12CCA26F77AB7A733708CCC2A0252120005DC9A10D5191CEF9F1AD36DF8906D92C3656B0911E33F9BE0F31C407E549C9234E181A571BC527186715EFAF77789724EAE6E5A909A30CA4555BAE1FE94BB372233B9191B3188F71588A53E0B2CD93CD2A789DB9054F0067349D01CE0796719558F666D91839604C249CCE766677B758D172AA9980A86E9A007E93615705EBC7F6DD09FC3FF4497164192B3EF66ACE275806009E5E54DF17B4938CC4BA4BA4F4FB56BDE967021D4B5A94002430CB53FAAF46BBC2C0CCE4479D26A414B4C71676177A9AB5A1DCB4B800B91C74C872A7E22036A70D6B1EC1311C34AD4D97309C52D9C4A8C21C17166F37A664E4A8F3D62AD1E1CDB22462A5277C065005CD4641B9F57ED0FA56F61953269495209484253553D89577E62968FCE1FDBFF76D71B9BF68BDE16CFB1641AB45627717569E2B640578CA76E1D288024CAA7202799EBEC8F877B4062E549ABB800BB31CDD9F9FE22C52567752A0E1C02791AE5A3E59BC73C6C31238978778AE161370B7810A3C21AF09453EF8D13C6734C6B945762992525767A03C2DAD4D5B83C4E4B989F92096E2EC4F1035AFDE9085E622CBEF1B62F21840506D574EAB8584B8A84B4852F40A757086C7F728800666A470780F98A480379449167A0FE9FD3855F6B6304B0ADD20000876008F4AFBD5BE9CBF8057F0C3DA1DE9EF2309F68EDE9604E5A6C86CC3EDDDECDB57D6EA43B71E282DADD425D470293C694AD2A428120826ADF80D9AC5F70D19E99D074AFE9E3906DFDA43EA4EF92B3BDBA1D817E14F76A47DEC5B60F6966194DA39C2CFE1D86322250DDAB4969A4B519084A52083CB402AE184C304904023785CD05079380DDACC1F97E371049672497A641C9AD34FC708BAAD0CDBA0CF16A27AC18CFBF5A9C9619091A08D64282A586CBEE4C39ADAAE2CD9EBC1A1682B30414410510414410510414410510414410510414410510414410D1C5F0AC891AF3EFEA3FDCD65C2D1B82E72A645EB58DB786EEEE7FB78A3C5EE9F8FF9A8AC6CAF912CCDCC027B5ECD93FB35D635DB7FFBD7C3775BB3AAC75E702B1828718C1EC10525DBD7AE3FA1C48689973C25AD2A907DD1279E7C4FC69E3D3B2B0F365998A4965004A99E95B1BD7B7689AC1E1C4C60A70090F43AFA5188AE547B6ADEE7766718B5B0C5B793B5FC573B47B6AE21EC6D2E7129766D30E2861C1A0B1C6D9532A471956B1EE98AF0CFC42F162B6D4D9E04C2A0EA04825EAEDCB2C9BBC5E70125084A120252080523DF0BD5DEACD48D85B17416112A99923FFA926075C84039FCABCCB8DC2CC38B54C20D54E1F2AE629476353689854A19003570C7D2255B74189D0F2E533944FF008CEAC3B331064EE87634B919599A9D4D78D2032D346038D05BDF778ACDC42A24F91D7E67F71156D97B437D206F0B35EB600D34D73A5E0328640371BF90872DDCEB9EB1CF3FA8D7B99CBE0DA7054E2FBD7B1CEEFA311EF211A992ED60DA7F5142DEE2513273E93E5D7B67E7CE9FE154508DD2E1ACC7524BE46BFDB9AC6532D21C100B379BF28A7C5EEAF8FF009A75F378ABBFEE37F968FF00888A819CFAD1F378ABBFEE0F968FF88828F9BC55DFF707CB47FC447857C2624FA7FBA3E6F1577FDC1F2D1FF111E78BDD5F1FF347CDE2AEFF00B83E5A3FE220F17BABE3FE68F9BC55DFF707CB47FC441E2F757C7FCD1F378ABBFEE0F968FF00888F3C5EB3DF3FB9E7525276B7C997B80B76EAF6AE59346BF283D83720FE8D1EF8BDD5F1FF0035A4DDADBC18967766F7C6B7318F95C13DBF5078BDD5F7EB51B3717F308DD51CE8E1ABA0FB40658C92FA9200E4D9FB7178F3C533CFCE73FBF5A66B24A492493C4EA7EF1B09696A80FEFA53AC47BE789C51CFD7EFD2A00E20A71052E5277B2350DEEC05B5685E52185817EA5EAF97B109559D28F9D87A312D5269AF6A690AEE876DD0FA35619E2171EEDBD838827F16974B57490786CD2D82A70B8BD1B0A00E63588D73AA76D4C12B7882D7A70E5616393F1840A1017F31949DDBB00CA761AD5B96B1A75BD1DBABCDB0BC7773BBBA7DC7B115BC96B1FC6DB59534DB2A5074A7F10D9E20435C6885039E54B6CB92B97BA0687AB545B8BFBAC6FBA972B20BE5BD91AD9ED761FB78CD3BADDCE6C6EEBF0A69BC30B5797EA6C38FDF39E1B8F3B70E8E3789740055C2E1508E5E750FB57138B958F212A59008A034ED5039106B68728C5A952C2024A124B7D4E0E840AB7BA59865AB14F0979F5C80B981CB2072CF969E8672D2A6366CC1380F9C5DEEEDC0D457EFAF11BCD595EE84814A123B822BA8B9F2314820C919093F5A90C64AC39964A521C0B518BF072EDD2372779B80CEE48BB0FEB8E4C551F68485851129C81A3FDBAB7611A2A56F26A2952458B67D73F4A9A380C345A0E1002889E84C1E672FAFED4C367A9631010B777CF2B75A8E5AF2604AA5CDDD043037CD8543F1A1FDC435DDC30C922520C99394F6FBC855D6724270BBDA26ED4B015F6EE468F13D8594A98000EC4DF4FC9E432A45818FE36AB76EE5F6B34B4A6D2A03FB83A4214394829267B738154995B53E56D0090B23EB19DC38AFEBA0D0582448489441009ABEF0700E4D42DA6BE71F187FFA81B65B08C037E5B0D8F61CC36C0DA56F1255D38848485A99B46C09226482A233F809AF777C12C48C56137DCA8A44B097399A171CB5E22968D1531686046E9259920330B061CF2CA8098F9AFC6F16C3F01B753EA32CB6A507594C12A2EA88494A4E47878B889E5F2AF50A2415CE09A0700D4DFE9E5635A67D5A155E384B90EF522C1A94CC6A3871615AF4A7F8567F0FFDA8F6FADF5607B3C6CAE99DDB60988DADEED1634A6D69B7BB4A568BBB66937052A65C0975A2D2C2B39C84E756CD95842A29DDA1166B9BD68294F6F1CFF6E6D51BB30EF1000CCD0BB017273A796B1FA6EEE1B72783EE3776F816EE764F0DB2B0C2706B0B5B44AED594B4B70B0D3695AD65109254A44CF73ACD5E7098408028038161439FE4E669D0F25DA78AF9CB2B2A721D8136F6E3F119BDBBA6D572D59356EB86C1F15D08FE9A4C1391CF5333D0CFACAFC94A4DB26A5037403D88ADA91BE52A193820F1EFEDA272C8116E906322AD34D67D35D0D6C030034871292120A4351AD9DFDD6BAC3BACC2B051041441051041441051041441051041441092DC28272C873E9973CC51190926D5EB088BA9310358E79F97F98AD54ADDC8C2BF256CFF004F272FE622B55C25313AF6CC72FDFAF23956A99814486208B8BB7BE0EF0CA7CE124805DDF2EBA8E51EF8E989391E5D23E3FA8A5189200773661EC778DE42FE6B310E6DC39E5A373D18C44BD769F1C85B6B6D103FACA10D679895729981DE7589A692A72A5E2F70B14DB4B86D4FECF3A3954B09CC96B817E94108BF74DDBDB3B74A5071A6D0A7096C923810095A87284804AB3119926293F104E4CBD9F3959EE1672327CADC6FCA1597237949033A17CB9D9A85B4B738E66EF0312B5F684DF658E1F863C87704DDABEE1714EA81B2C4977AD85280E194BAA61C411C8A142BE76FC62DB13C4FC42113084EF29802697B6597A728B66CFD9EA202897766EE351CA9AC6CB216C5B617716EA6E5B52186B86253FD101032D2047BBA488E535E503B4953274C1314E5C80F9B12736CAEF61C62F385D9AADF9403020135BB90FA66F5F2E3E32E301094B4AE28049464548E70A1CBB4F2A8FC62A52D5BE12695B720D7BB77AB878DF120C89850BAA8163BBAB73CE9D4C4BD9A177297148040409F7A73D724F726047523D22D78B4CBA80435DAFECBD7D61B7CF4DC8507B53F2DC871E8ED4871C9250E36648287010A1048981391891FAE54AE1B6AA779AC468CF7E9D69C236131EA283DBF6AB5BB42C8511014A1EF0CF3CC40CC1CFE3C888AB361B1E998016A0E1AF31F717BD046DBE38FBCA02F804C127A9075FDFEFBC2F33692504B120E675D33FBB508D21C4B96575AFEFCFCBFBF3F11D95F1AD7FEE5FF00946FF238F9FEA1637ADB2C29D5C908CCA47E6CC9D073F39AD86D548A10934B92470EF1A192BDE0901DEC6ADD69FB8A9ABF6DEB537694381BCFDD508518E83E1FAC56DFF764FF00C5376B9F7CB58D7E590B0870E7476F4849171E3B62E129712DA89038801106338319F5A708C57CC1BC081D5BEFEF58D5437494921C33F0F7EF48F5B790EAC368701513192B2FAD6FF38FFC8773F98D49090E6D0E5C696DACA0AC122261479FCEB266A8162A1DCFE6308585A428380758F034E75CBFFB4FC2B1F38FFC8773F98D89604E91E96D43FBC7C48D7CA4FCA9BAD13261041735B1F5367A7BA460170E338F3C357FDFE07F723E9594CB980015F38CC78A42BFEC08F3FD33FA52884AF371A3BD3AFE3F3047810A9C881DE48FD294620124B8639935CBCE084D6CA8AA6419EF303F7EDF6602660662B1466B9625D2EE4039BEBA52B6BC2889BB818B56CF7F56F3D2F08A93C399223D7EFB0EB564918B461A5042EAC2EC3F67D3362F0B09C86722BD1FDF0AB6710B7D6B7AF337EC34E20377CD29AF1164F8B6E1485364B247E59073EB94F3A88C66364CC0A1BA93BCC5C8167A65D385EB684D6A96A5A16EA1BAEE9C94FA8A8A1BF522AD18CB77DBA7C0F60938B5D3015718B62AE788F622EF0AAEA38D4A203A3DE02145226721F0672368C9C3972C0E428001CB5F3E548D8A92A2086DDCD3404DC8D7AD3B168C9565656968CB6DCBAE25256A2550A24A8F119E5A939F6D2A1F1DB4708B9EA56EB92694A3F91D47E21352492E0539D7ABB76E668F14DFB8EAD4916BFD36D260A55209197E58CA72E7A914D65ED24053CB05366E87AB0C8DD898565CB5937625AEE3FBB5790A98A537896C04290E123290099394E67BD3A1B494AB971A1A5F32286D0FD1254F5151D5C6B407ED96B0A8BB6C988503DF2FBFDB3A5D18CC29ACC48720DC03916ADAF6D0E7A29F256C4D2D4D7B1F7EB0CAEF186DA429B1C5291C898CE35FF03E154AC66D49387DA7BC94B277B40C187B03288B9B839A6782092E680660D0FEF219877318EB17C5D6A51E02A19926662750797293FA54D4CF14E1A6618C929014450903833D726ED16AD9B86504A41760039CA8DC75CF964D1108E0C4ECAE0282B85BE05BEA50F7441E240933055103AAA0D57F01B326ED4DA09992CD0A9269A13C34EB4E6626CEE4B60A20153900B396E17A718F91BFFD484965388EE56F30F69C4DFDC1C7D29B72902E5496BC24A961033E10905733F973AFA0BF03B616270D22482BFA1613BCE7316C9FC9C6B1158A989492A72082F5BB68F6E6EDE91F3C7ECDDECBDB7DED69BD9C27775B05862F1ABBBBBEB165F79B69DB8B1B265C71B3726F94DA54507C2F10A0C47109D04D7B1F0BE1DC44D289A934212C43E8D96AC18778E7FB5BC4F270D315209D453859EC7EFCF2FD38FF00868FF0F9D8BF61EDC9ECD6C761163871DA4561ECBF8F6256ED37F8979F7909B8E15BA948510DA96B400A04A408EA6ADDB3F64CCC3EEEF176E39E7EE833CD850F69EDC978A0A42412FC3E927537272EB6A474F2D597C2C2CAA19CC04926739991E64558A58DD46E9150C05F2BF7FDF3AACE5198A26956FB7A0F4859D65F449B54B0952BF3150890489CC769FF0035B924E64F38412863514D29EFDD61DA13C0909D32CE349E7F3AC428000ED9C5744660A20828820A20828820A20828820A2082880D013A434715C4A52635D0733E63CBD27E49AC29DDCB7334F661295881F3B70B57A31032CDA95AF11C23D44A567581CB2D3E87CFCC4D2A847CCA6A1FC9FF00A76CE25D202D0CD5D6B9E99F4F285B252028721A4FD7EFCE68124A54EE1B4ABB6869E4FD62176949DD0140125EA720DAF13E7CCC789546474F8C44E9EB4B8486DE1BBD2F76F7C222F0D8A549582350F4A1F6E69AE90C71071E470A1D6C2ECDD3C2B28054B4E907A0F78FE99738A9C532E6198A6A55DECFCC9E6FF889F94BF9A37C66327ADEE3323DE51803DA237888DD8EEEB1272C9F6158ADF866CB04B15287E2AE1378E8B6BA286C4159690EC98D009CF3AE67E39F13CAC2E0E623E601BA82010781672FD68FCE24F0682A5070E5CEF3B90F6193D34CDAAD47C05B97DD6A760701FE6AA529DC471A3F8DB975C1C4E9372A2FF0A9591211E2409D220738F9C5F1476FA7178B9E12B25D4A72F7E5FACED9C5E36728CBDC2588D054BEB6FBBB068CD178DA3F97A51038D4412233FCD267ECE42473AE19860A9D341BD4B9A72E943C2B4CEB65C3633E5CDF9854E08615043D079794610DB6DF7EECB7758DE17B35B518BB785E278EAD4CB4E3AFB4CA029212139AC82278801AF4ED5633B344D96E949721CBB11E57E2E0EA75852626662262E6B2776E2953472E006E4E32A9D7256098D26CEF5AB36EE957B87620DA5DB3C410AF11A295B7E283E2881FDE008CA4D57B19B254146840BB8CF5CBD34AB648FC9332525425EE924FD2A152D43973B753175AEED0D82DB8E871D924A8281267302626239F41AE7510306A9531B74E795B9716A126CFC2BBCBC39502774803FDA6F4A50573D5F36A3C453CFAD6496C92274FD7B0CCFC226A670CAF96C19890720E0F6AF5E91B1C329C1602AE685ABC4D78BB13DE1CDBF1169257F98C935B4D2E413435FB43C929DD491CBEF0B5250B430712B2B7828C2145303EB94E7FECF6A208B6B6CF6C98D97C2D965281C4E880207500FEBF648ACBFD2DC5FDD29DF5D6114CA4998A9AA776FA41CB870E3F710AE17B533B396B88DDF0B4C5C8570717BA4C2883ACC796B3152F879BBA801A96EDEF586B3128528907EAB299A94A3FBCE25F0DBFB57D837364E05BABFCA2665427403F4A5FE71CC6990FD5FF00A68D4A524314823944ADADE5CADB0ABB1C2F999049100481127204474F5ACFCF3CF9FF007A7B178025200601B26B4493572404F1106796647CF39CFBF9C1AC89E331F6FB98C14036A1F2F7CA152F24924C4798FDFF005FF0E25CE4B5090323637E7194A400C403D3CA0F151D7E63F7A53E70FF0091EE3F31961A0EC20F151D7E63F7A3E70FF91EE3F3030D0761078A8EBF31FBD1F3926E49EA3F3030D07611429C041CC47CCFDFD9E75AAA62425DC87B1A558D58BF4841490EC6AC5F9FB7868E3A0CC68222749E7CFE1F731F889A14336ADEF6BE64B74EF0572BE5EC4365391C51FE32F5981CAA1672C31006B5A3716AD1F9B51AA21D224A99D4286E2F6B647DF286AE3C24E6679C0E5DBFCC1A8A98B735CAF7A353FBCAB0BCBC33D774F014739F3EEF9D042887DB0D80BE119F389CB2CE7E597EB4DD5212B75352EF7EB5BF1BF3192E641DE2C0B51D837273AE75FDC20E5CB1DA4E5060E5E597D99E54894A6596ED41E4DCE164619776A0AEF55FBB53DE70CDEBCB4420F1293C6359E1E7E6723DFF006A497884A33D5EB422C3D7A7AAF2E4CEDE66514D2A5C9A37936472AB6B6ADF630D209085091D3AF7CFBFCE9AAB1E0160CCF7AF2E3A694A3F19346154523E9BEB9B574BB7DDA2D6B8C67C452A55AE5DC7ACF61F66699CDC3CAC42CCD252E58BE619BB0FCEB69393B14CD4A66D068E0B93A00DC7A677788A7961F920C939907AAA32D675EDFB5446325FCA0C94801C55ACD666D6B5A6594487F8270C91705AA32FEA8E1C0AC050DD859397574F1651C2A36ECA54128BA201E22F24FE74B27DE911C31564F0862A6A3192C0DE62A02F4B8AF0A8B9D3AC41E3B152D0E4941520177FE497161A7106F78F928FE2DBB15B6DED89ED59BAADC4EE6AD2E76BB6DF0EBFC42DF197EC50E5F611815A5EA195B8A754C4B96EA5DA1599508E341E409AFA47F05C4E9D8594B52F744B0874070B99BC5BE815762CEFABF3A16D3DB484298AEEFF0053D05C39D1F27ED1F4C9FC2EFF008576E6BD89376782DD5861D698B6F62F2C5BB8C7B17BF69879D178E23C52869FE04BFF00D22E2DB857E588AF6E6C4DEFF111BEEFBBE807E7988E4BB6A789F8A5AC6B95ABEE83ED1D6FB662FEE9A530CBE2DEFEDD69FC482A29494F14A4240CE38040E511153310F17E3265A46609090091A1500028FA99A208528820A20828820A20828820A20828820A20828820A208288C1B1E4622C8517CE7209233E5D87C7EE056AA0E1A970EEFE5E5FDC4392BFF002D3A035367FB716BD5A1B5CA0859D60E606B3A0EBCB5D29EE1C2001FC5AAEF91033EFE9778B5C82F2D23302BD5CF7FEE1BDBDFA4DD2AC432F95A48E27787FA425322546234CCF5A6F3F109966AD9E57EAE1EDC84218C47CC96C0820E952E2DEF4E514DF620D589425495BAA5988687114E99ABA6BEB50988DB52643FD429FF001B80E72A07A57CD9A2125ECB9AB5021248268CEC2BCB437C8D0461ADE5EF9F03DDF2B8AE14BC556EA08770CB321EBC656530D7F48C14FBC413968272AA76DDF1548C3C8528CD48DE0AA0354B0A3D476761A45F3647867118A904A5135250DF510C95BDD8B55AC7DBE9F5AE0D8FEF976F6CF6D76C0BCC6CA60AB75DC0B07B8E24BA4BC8857E29872504A5CE152383311E83C75F123C72667CF9689C4825565790639D29DC45B65F870C94B6E80B2C58DE99915D7DE7B316172E26DDAB77D216DB01484A19023C31EEB6003CC2409EB90EF5E36DBD8CC4ED0C4CC53A8A4A8B3127339BDADC8BC492B64894031008CF98E356CB84463F77C57DC2E7134C9FC81DCA32F28F879F9A7B32419652542CC4D3AF535E43843799869B292087292E01E5A535CE9E51A4FED97ECB167BF1D8EB8C4301BA4DB6DEE1A855D6CE3ED2C2429D6541E752B5A4170921B4A404F3D6AFD864A1526803B51AE5FD2CD4D5B5899C24C0996D34EEB00EA55AA4B579D3AB523597D8B7DA8719B1B8B8F673DF42DBC33799B38EAAD6CEEF142A65ABC6C296E23F0EB7CF8AE2BF0E84010224E90669962B0B2D414126A75671A8F47BF1B43B5253499BCA56E7FB52685C67A8FC36B1BD7B41BDAB6D9FDA3C3B08C430EC542B14586D8B84B405B8881C4A5A8FE43C52939E5C849AAD62708122D517A7DBF1C758587CB6E62805DFF7CEA7331B1764D86D16CB788507DA43A8291301480B00FF00E50623AFCE2E62371553714DD2DC3CF843654D1310A084EE94962141B36714E1ED843E514A8952125291020E47A4C773A4524E4DDFAC0874B254C546A48B70D3F5CDE282A09899CE88521BBA871C2929809044CEA403FEFF00CD10459FB5FB228DA572C8FB810C281742F22A00A4FBA331263AD64D4B8EC32F79F18C25C0637D6FD7F4F16AEDC6CE62D88B186E0D8238CDB61F62521C0B5142D4094295C213910485418F3EB4E5134331240C9EDC73F6FA4202490EA212497B73B07CF5CEDC22F7C36CADF0EC36CD8B54B9F8A6529F156BFCAA3A9208CC89F803E55933D0003BCC4F4A060DC283AD235095BA814009664B03BC5EEED4D3DDAE125DBA5078C20A8004742911DE0F90D6B6F9C923F9163C47E632997BA18249BD48735E90B250E2755031A664FE9F7D7A644C49B1B71FC1F28CEE81FED6E8D0BA5C310449E79E9F5A5A54E00665F2714BB3706FD46DF2F827B7EA2AF13B7CFF00C52BF3C7FC4F7107CAE09EDFA83C4EDF3FF147CF1FF13DC41F2B827B7EA0F13B7CFF00C560CF190238D0C06550D13D2FE91515C266333C8EA343F7D41EF48AE79A249715619F1CF8BC3298965301CB534CF96AD488F75E0924198E5CA74D7E51E7CB5A653A7F501E86AFF7CEBA7185E4497FA8D746B821F877B886EA7651C5233981A4C1E7FA7975A899F39F9370AD0D33BFEF94A22582580D2B4E4C32CBCF4884BAC4D0D4950CA4C81D0643EF4D2A29588625DD8E4EDDDE9D00FDCA4AC1A942960010FE6FEBF9702206E31795A9495108E40C65027AFC32E7999D1EC99C9F95957BB8D3BDEFC1EF232B03BA03A4139DAE68CD4F588A7B1A09513C66675D63CBA4C72F2A61899A9A8D3A3D457B8ED0E65E042812D7E078FF005C8365160E2FB50F357CEA52B70A7DD1C20E60C673A7D2A071588704037666E1986249A9B0A521DCAC03390976BE560180ED7A8F588E671D174616A5372732E401EB398D2674FAD41CCC4A92E1F5A82DC3334AD8B748768C1512424BB8A351890D95799B3EB1E3F752E05347C74082E2992541A1C8ACF29F9812749A4A4ED598957CA724921D892D56A8A5F4CF2CA2C986972FE4849025A92974B800A8E6D77A74899B5B96C302E3882D8FEFB8041691060F88BD131D73CC559B09B3713B4C2404ACB8191B16E1EF566783DA98997265A9C804B8634373AB30F3F58D66DF56F5B69F69AEBFF66F73986AB1DDB3C4D4DDA5C62A965773678234F14F8AB2F307C4B7529852F84C66B4E7005764F027803153F1524FC951FA93FED26AF7B5BD968E3BB7F6AA10A98C4077FA8667D8143CB81DAAF63BF61FD85F67AB8BADACC630EB4DA2DEE6D1A1ABBC5F6BEF5A6EE6FECDDE12E169ABE290FA121B714C90A27DC0139E95F4D7E117810E0B092553A5B6EA5156FE2585B3CDB83306B4723DA9B495316A0EA00B80067CEA4657FD3746EDEC997DA4BF66861A751925C6212952A6145440CF31A7527A8AF470C327084C90929DC09A10D421C79373A1BC41151554925F587F6987F86E1BA7F87F14E7FCA5BC90A8109CF5303AFD2B68C449252103852207EF441155104144105104144105104144105104144105104144105101A823586FE1A788A89023B89F4039F9F3CE26886A24BAF7DABC5C79FDBF709388490547967E5CA474F9D2AE5292C0B80E73AB07D7D1A1EAB109901945A81C74ADAF6B4312EB09539E18487140F12801940804911A012263A8D045336E6D0F912D41D5BC012F663A70F31F7470F8A4CF98108FAAB6ED6E27D5852F1A87BFBF687D96DD558DC5A1BE6AE31A752A0D329710A712B33038642A012274F21AD714DBBE2A4E1CAC0987783B906CD7B33776AD23B4782BC173F6DAE4CD5CB2892E08431DE50E34ED9F131CB8C537B98C6D5638ADA27DD7957F78F151B774A8B484A15C2DC209E2128E139F5F879E3C63F10D7284F4FCF25E8DBDAB59EADABD69DFD2DB23E1EA30F2512C48012025BE8E21EE199DCF5BC5E789EF677876564CAAD2E5869B4A470B4DADD060680A4440813DF58AF2B7893C5B371F88581394CA51600D2B980FC5F56CE2CD27E1FE1A63138696A531BA4123967C7F30D6C3DA0F78B83B8CDF5F8F12D9C2014FF54C0490939129039AA7D7CD0D95819B8B48592A20D781E39FA7770F11B4FC07874214061900814012033E46C6BC34E11B87BB5DE7D9EDB58B5737A017E0150000209D75248E9DE222A57158718445824839DDF80D0802E2C738E59B6FC32BC30509481BA92E428304F26F5EB19B6D5D6195171284A9E792461C56250D650E8569C2160C403999ED4DB0BB5BE58352F61A5D8FE78D6958A062E5AA5CC4C956EEE827E62452D66A70E995A39E9ED2DEC6786EF431B5EF67636E0605BD2D9B52AFDCB8B250B66EFCA3DF4B7C6DA4BCE1F09B2889993C22662A465E2C4E0E2F9BBDCB585EBD7A460630A1411BA4A55449193382E7CB2D1B28BB372B7B8D6FA766F08C3B6C30C361B5FB2AB5DB5EA9D694D38A2C381A69C95CACF88DB3C5240041D291C420292A25CA8E99F40D419E798A88DFFCA4A52A2A2129E3463E8C7CBCE375DB43D6D8759B0E125DB5E16C99954248488D0E806A3E555AC5A4A4D18D7B9FE9EC7864C013D2EB3425405072F6DDCC4DB8506548238541111CC8038BE73F4A6B785641242492E6AFE6DE4D0D5CE5EBFA510E6112BE12467E9FEE8820F17BABE3FE683404E9041E0B4E1E356AACC8273F89EDFEF2A6CA5D6B53C3280AC8A04BB66DF7FD73AC38430D11904E7D333EB98FDAB099A967292E75CBBEBD21352C87A5B2B9F510938436A281200E9A67EBF1D73A4D53D8900103A8AF7F7CA14402B485503E45FF0071478BDD5F1FF358FF0020F1F3FF00F68DF70EA3CFF114071434FF003F28A7D2A712090790059BCCDFF0636DC1C7A7EDE3DF157D7E67F7A5BE69E3FF00D47F106E0D4F97E2144A8900C9F89AD0CE2FFC88E153DEF5F6D09A831223D93D4FC4D63E71FF0099F7D23115AD7C29224C88033F2E7DC7D2939B30DDDCD4D2BE432AE7C2B0C268DD981C8CEBD0444DC3D3232D79F4CBBE71D728F5A8E9F3CB5ECFAD4D9AAFDFA448E1D02990BB0E23CBF77888BABE0DA549900A41E7D758FA1FD8D45CE9E374B1249B575EE05ABC3289D9186DF214C58E57F7C8F908B1B11C4614A3C4009D391EE467A7F9F3889F3D89255C6940E791F79E462C984C216140DEEC7AF01C323665EE28E1716105412065073E7F2EB90EF49A71C65B0259DEFF006ADF477AC4BCBC206629760323EADDEA784405C62AF1260939F39FAF2E5F62939B8B13050826AE4F32F47A9BF43A98712F0AD641AD2DCB830F53EAD416543F1AF9E22B994920E9968ACCFF00AA8C98B7CEBC3EF5F57FC48A3083737774D83B8E7C2B57EB11CFE396A494B162E2D5D4340CE9A46BDBE798A68B93F309DDCF8350B0AB707D2164E082412EEE1BF0282A5871ADA18AB6A1385B4F5DA9567676F6A92BC47F19EE36DB7F9878F9C02A483E1CF3F3AB17873C2188DA78B96B420A92A21C106B66C98B65D6D68ABED6DA88C1A8CB538525D88B82D96601EF7A59F1AD86D2ED36FF00F1C5EC86E4038C5885F818EE3376169C11B4190A558DCB1202800E0055978804F3AF6AFC39F83537188905521CFD25F7356FFC7F0E5C8B98E5BB7FC48196EB7002B30E05988D5F2BB9063A21ECEFECBBB2BB93B3B8BBB5BC563DB6989250E5F6338B2D171705E00952597C2439C08952120E890065CBD75E15F84F2B650953178748524057F0FA49A1BD78FE35E3DB4F6BAF12A539210B25812EA0C6AE1DAB4ADBBC6D43185DC22D941453F8F70FF59CCE0A672E13993EE9220CC6990AF47F87A461F66E1D329490964D52D57028CCD9D49BBF68ACCC2A98492470CF9D7B0A51B2B35C7616EDDB5BA5B6C242049F774E227DE3EA7CBCAA466CE33E62E612E49D5D8643B40CD4666CA1E52704144105104144105104144105104144105104144105104144105104365082260013AF327A4E9D7BD6C775282A3C7A37BB5CF2B64A9094B921CBE76BB53F37D612582E2480600D3BE475FF005D73CAB28589A93BA6B9FBD3A5B37AC46E210BC492104824B66396BC6E7A4620DE56D55BEC16CC6D1ED0E23728658B7B7E161457C30E3885211993AF194819F481CEB8D7C45DA276561F13356580048F79FBB6564F0AF86E762B684A96141467281005427759DEECF46D7331C0FDBDFE6BB61B4571B5FB557173756B7F7370AC2D84A94B2D25B5A9214EA579252612531CB9578D36DF8D24637113A52544289500C4644834D19CF7BD63E807C2FF000A0C2C99026049A26A43DB9FBAD2916E365D0865C60B28790A21453207003088CCE7C3A939033D6BCD5E35DA3889D8D9B2D2B5339CF50F4CBEF933347A464EC69094A54100D01A0A71D1B3BDEB6CA6977F72EA5B2E5D3CA527229E33C1972CE72EFA6623957309784C41C4FCC9AB5105540496E2D417ADAACF5858E124C807FD2481FF002090E72BDBA0E377876FE266F2DD36AFC847090824C09F5EA73E73E55D4F61ED5C3E124A11312E406A3353AF6D38C5776861244D0B4A659753B9201EA7B5B367B88B9375BB7F77B31B516D8638EA4DB3CEA42425478632C8E91AE703CF3AC6D8C7A31AE24DCD0352967A1CFF0021A39BED8F089C5A26EE86742D42F5604D4FBF38EAD6CD6256F8B612D38F2212B6905975B03C46E5238B80F2E23AE432F855657839F25615BC4A545DAB48F29788B64AF0F8F9B292485A56A0A3504B1239D8370CE1CA2D14029B0E14A493FD50AFEBBA0FF6BC7FB872CB9181DA4B0F315258A9CE9A1AD73AB68E00F5833805FF00C88B905CD38D39661F942186E0F8260388DF63187D9376D8BE221B176586D286145B4F0A5498E124A84C93FDC4EBA177331E9615655883F6B97CCF1E9097FDB6729D2B585CA268332D5A86A5453BD22E86FC37ED1C2E03E33924F9C9397393CF9795454E5A66390E730C055DBAF5AD2038652549485303425ECDE5F8EB0D2DF883294AC10A05591CB9C0FA5317093BA1F2F3D3D817EAF50A12992A356229C33F2851492A888CA75F4AD9EAD5B3DBDB7585C2D2598DEDE9EB1157AE8B595AC920E813AC69D81CE39F6ED5B8965445C33E5771A671B0FA8B023BC376AE43A92A85B60735989F2CF3A57E41FF0090EC6141294A2C18F27FC4542EB3949246706411DCF3D72F2F5351B3F0E42CB114A3D72B7285912D2C413517D28FC0BF67B52D0ED17262012083A8FF007FBFD2992C949FA95FC72BBEB7E9E6F48D7E52544B3685E80B727B7317E31529B71490EC9E15732639C72D73F865DAB51302C920D7969A6B1A24A524CB7FA93957CB87BBC22E079082B0DB8E0027DC93D7F6F8674E65C852C12C726B7BFDD396E152DC852C06C9C0F7EF486A9B97145005BDC02B244149F7639ABA4EA3B53D97845EE0217D01B57F27F30A6F4B01DD2D5B90E5B9C3E7D06DD29538EA53C5CB8B31E734AFF84B607E65F2DEAF60FF00DB884D1350B24043366580E858BC2A56866DD0F29C4292AD384C91A6BF326B6FF0D4120EFA4DA999E37AF956ED0893F3262920335C9603A5AD6FC4541C6CB45E0B1C004EB9C67397C3E347F88B037B7837AEA066F76A4608216106E73CBBFBC8670D7F148B84788D9201919E625391883DB979646A3A782951483F57FB790BE9F6CC69094C904AC28D4532714A023AF9F5311CF0528CE507F4E5F7DBBD35549529998EA2FD6DC214978A97295F5659528ED5ED668B471552D0B7110490066273CB965E79F39075A8DC4615402B8580C9F2361D3F713985DAB2414A4025DADC756BFDC5DE8F60E245D528E444C9CE7E072E5AE7D3BC557B1095209DEA905B85E9663F8E0C22DB83C7CB580024DAE037126B5886280532A492ACF9778D39C7D00E5511377F78BD1AB47160EDC395AB13D2E727E5EF121FB3E43DD07578897DB46797CA39FF009E9AC79080C46DB1859C6493551604D47014AF58712714852824062726CBAEB51C4D189AC5B58ADD7816EFF085FF004009047BAA2AD3863948D39FAD58306BFF0026426730DDA9F36AE44D844E26592905354B5FDF9E9A4686EFE7DAAD5B9D71D63FF8D75888504DBE18CCB97F72A5100218641054ACC683CB3AE8BE0FF05E23C558B9385C390153160382C5C9039350B3B5A22B1FB6246CF4933121F74D28E5875FBD8F28BA7D987747BE4F6D8BF5ED96D7AF1ED80D85696CBBFCB1B2FE19758AB00E69BE65614DBED909F7338E05F306BDF3F0E3FE9D71B82C3E1E7E25285164A8920F3A022FAC79CBC5FE2F96BC6CCDD2456C0DC654A135D4BE71DDFDD46E8B77FBABD9DB7C236570DB2C20B084B770EDBB4D30F5DB89305CB852238D4544924E664F2AF6A7833C2383D858542264997F312901CA5390B03AD0371F3E5B8EDACBC4AAFF0042AB515001A5327E757B5632F33832DE74B8B5B6CB2D41B55DB1871523DF2E9D0C91A7C66AFB35723700932C390CB7008045B77C9F3ED58198B54C2EED983E808F76B44D38C5C298E149487B21C44E4403064E6648D6ABB8AC3E296A2652F72AF4240E541D188FCC6C929DD0142B9B01EB43F8878D24A1B4A5512358D279C4F539D4860E5CD44B1F34BAB5CCFB6F7531AA8824910A53C8C41441051041441051041441051041441051041441051041441051043777FBBD3F4A471333E5C93DEDD35B5B27BC20B964AB3ABB31A665AD7F7942493A8FFB65F234D3098848739004FAFE5F2D05EB99402660268F70C2946E9EAF4CE39FBED86FDFED726C375387BCB61FDA0B865DE3428A54A6EC5E6EE5D120660A010759935E74F8DBB4C7F8589054582486735E5D3CAA6F1D5FC133E5C89C99BBA3E63D145A84598B86278F9135D0ADFF006CCDF6CA33688C3ED54BC3F0FB661B5AD282471969B4B8A94C0CD609E526329CABE7AE236A23FEE93025542A56772E736D7879C7B1FC11E235270F23E61DD550148A067D29DC51DDE359AD31242EDD2A194F16B99993224E5967D3A41D4D3F6E2C4EC6296E0839641C3E76A35BFBF4F6C1C54AC761659DE0E52F767CB98EB9E90A9C5B8753F319F3E833E59546CB90952B402F6FC5A2C5FF006E4CD1FC778351DCDDB43F704520FE65F8B2D34DAB83C3E2E220C1CC488CF3D7FD53B4CA4A40001BD855EB4E3CFADE18E2763225A553141212C487A373BF067B1E622DEC39DC4EE36F70C66C1B71C487D216B40240D33919CEB9F78D32A732E554580A13AD3A5FAF58E7DB57132B0626B94064AEECF50410EF9F9DC651DB5DD95BBADECA61887C12EF809E30666613F219FF00AA7330BA500D4805EDC32E0DEB1E2CF19CF44CDB98B54A6092B70D620E7A3E5AD5AF1929B679F08E51F31D33F9D20A4B80D4BB69C62A0A98CEE49D74FC7E22972D87171AB28898CA3E3113FBD24A940BD95EAF6E367F6D194CEA6E834269EC1D79E4FC3CF1DB68788540348CD664447727E79FCEB41280C94C387EA1252014A812378BD694B6B4CB4F410A8BBB6BE1F88B45256C2B24A92414929C95047FE535B9C1EF10A09D34D33A1E77A9A9BC47A42925295AB7940A9CF3B4149AA46EB500E63F43DF287096DE0CEDC6F68C31BD5DE2DD6C5A2D0B1B378A63085A8A54BB3B42FA07BC9008339C4E67AD247E972F67A8AF63D7A670EA4286F900B917032A1BF7F6C627367B1356D7E15698A7E0313C33893C4AB475A2CAF3CA382627EE69B4CC490A0056D41571A3D05FABF287895251552F77424DEF7D5BA45CCE2508570A1B75A4803DC7870AE6332477EB4D274F0E58A8035367045E819BEF1AA5616905D2A2E7EA4D8D7DDFEF0E5BCA472CBF5A899D33E616666CF539C6628657893D70EB508166CE683EF051912648CB590279EBA56F86016424DC640DEF5A8D5A9F68D0EE20EF3328D1F32FA7BA6B568C07BD0DF0DEEC93AAB1C3EC2FAE569047130D1704FA1EA4CD5930F24EE86E3F8B53F19B98C942557482DAC5B9BA1DEC63DB518DDC318A61F8930DCA4A03AD29281209D09EFCA9862538B44C2995BFBAF42976156C99ECDC4DA1D8C2EFCA7615663A5855F95B2A38D365D65FBCB9F7D32DFBBC2179F207E3FB522DB43559EAAF3AE8F5A3660B884F7112D164B7035D7227CB2ED0FF00C1B77C26D9D5F0AD04F12504011CA06BA77C8D6A46D014066139DEB614A572CCB7A335A8804A7743E79D32A1B93DE97CA558B1B52D1638CE70224139EA3CF38FAEB9E5231E4FD456DAFD458E7A310465A90E619AF10B490FBA4F5719DFF1EB68E76D1162E2AD90494A0E5399F7B333F7A5650898EF33F95DD9DAE731A30CF8BC2E8C52264B0E589B870C18D4B1635E511EE72F5FBFBFDE9E2774074A6A28DF8CB9901F856135A50B2295D29D295E3083D60D3ADA9E54C919E9CBA48F872E71A532C5A0EE9A00F73E8DC287AE8D0F30B212952737D398B33726A7A8367E2187B526129F2CB967E5DC728806AA98D949FAB334AE479EB5ABF38B8604A52C1A8C38D455EBA3FEA2CBBCB54A5C5A529C8691A67A74D34CF3E9AD414F94A09533391424F034E15E00671654282A4834B57817CFA4415C5B44E51AF2F872D23E1D39572BDB00FF009C5245942A347AD5B964D951A35C2A93F3455CB8AB5BAD3BD62DFBB5B12BB77ED0108523FA8B6F27648260F381C8E42BA3EC89811B2901490E00AB0FF90BEAE34F58B6C80A520AD330B043143D03A481422D60733A473FBDAA775DB118DEF977418E5F60AA4A1DC45D379C56EDFE19D297184B61634502749D7313D3D3DF01673F8830AC187CC40614D1DC176B9F28E75E25DF1266098BDE9890BA82E03BDDF46F4A47D0FEEEB0AC3767B66F67B0AD9CC22CF0CB57B0CB30E8B660328E14DB3441844093339819F9D7D8AF0B2B7B66480C0112D16E43D3DF0F2A6DF2A38D98A52B79D4ACDC062437BBDC878C849C3B0B5BCB471053CDC2968041CE388C8F31F1CEACA43EBCB23CF588389CB55214CA4B69284094849C88831A72ACB0160D0438A20828820A20828820A20828820A20828820A20828820A20828820A20828820A2086EEFF0077A7E94D31DFFF00CE585AA4E7937BB46410A4E8439639FEE8CD0D3C4E151C8CA4F3C81F5FF15052A6142580513F5540EBC3C8BD21171BEE6CF9F2F7EB1CF0DE75F398E7B4961966C1877000F02173C31776A348CF4274D33E599F2A7C75C699782C48CB74B00399A9E1E5C4C5E3C3D3D52D52C8240075E3A75B679DE24B6F360ED76A2CDFC2AE116EE256DACB8A700519E12A1C24EB072F87A7CE39FB489DAA402C42D65CDB3F75B1E11DDF61EDD560C4B5952D40148FA4E64B59F5ABF2CE91CD4DBCDC56D2E09757D7B8532877094AD45843416A772278F2480089074D75D4452D3B1226282D4C6EEAA64295A67D5ED1E92F09F8DD1264CB96A9A02801F49559FAB80C476E91AF8F5AE2EDDD2AD5EC2AFDB5A55C256A6149464489072CBD339ED584CE483BC9E058795C9E7EDA3BB6C5F19E1674A1F3160D01AD43D5B3CF85F4192F6D84ED0BD76BB6B2C23115AD6501372185FE1CF10E4B1AC139F965953C97884A98960D7CB2F75AD6B9C6BB77C5B874E1D7B8B48FA496040A8CEEDC5B91D2374BD9FB73AFA1D4E25B43689376B5256D29683293075E2CC6A34FA654F113921F788B6445EACD5F5EF1E62F1978C49337E54CAD6E68CF5CF896FC88E8561086B09B166CD49953408940F7784FE5D633032397A9A693B1A90A670CF4663D4971F71A479EB6A62958DC52E7BB1597BE97A07A3FDE26D18A5BA6650AED034EBCB2F49AC231214097A86A1258BF3CB8FA188DDC59A3B8EBF8E10B3D78D299012485DCA541A3FDC9294E8BE62797A7ABB42D24124D4E941D7A3716A1B46802CAC245377B17A86A7ECD9A916CDEB372E6CCE296616945FBB6F70B616A24240690E2CC9D46432F2EA327294A72A9A367FD1B65DA30B44C0B0A25935DE7CEFC2CCFEC4637DC3ED1398B6C9B5875F2D6AC46C6EAF9370FA892D287E25DE0E151CF2488CEA570F286E0373A914AE5DB816E75289511308DD25DB2A8A1CF2B7171190F15DBAD92C11CF0B15C770EB120C13717286C083067888A6B899692E02439CDB917E3D7808708FE40B3F0E9CFEF0C13BC0D80C6DD6EC6CB68302C75E91C16B6F72D5CAC139C040CC2B39E711509884EEB860746AE5C6AEE3C99E1C4B4266391BF2DEE41670072A80D9DBBC4B3D8707407ECDDBBB22DA789BB76C86D939716481D7288D66634A819C95256480A15E34CC0B55AB778709292A017B8B4B67535D6835CEDA8362DC5CDD5BA6E2E140BE4A92A6C93E20083C2091DC099A69353354951357676BFE6D7785B79091F2D09DD4A6B664D5EDCC9FB3522A6EE21C2DA9A71074952606463F7C874A60A42F78D77781241B7DC8EBC60157D058EB6B7786D89DD3785A9973C4BA5AEE891E1B4A05ACA06635CFEF2A7D8374919BDCDF86553CFCA130779F7923E934A026AFD69C6DE9AA3ED21BDFC4F7718687F03DD5E25B5F893E825955AE0CABE4F1651C45242B98D34D672156FC2A920241602973AFDFF00340D19001208592C482E5C69F9AD7368E79621ED19ED878A20DDEC6EE5DBC0DE7CA821177805F5BBA8014784A92D92448CF29EDD2AE183C260A74A0A5896F9EF370CEBD34D22630FBA258DE3967E6F522E29C69711682F6EFF00891635748786CDB564D13252C5AE28DC2409C872CB97E94EBFC1D9E5D928366603ABF3E873BC258854A0E00481A1142EC3A9A1F748F1BDB9FE237638D3CD8D9D6DD6121BE071EB5C514E12539F11919493CB410234ADCE03670500D2F3776A534B3DBEE2B10D3C7D5F4D53C1FCF97F778BD6C36C7F88F39709B8FE478606A4152556D8A710C84889E5AE5131F04CE07679144A1C02723971A6A2A223662544BB727F5C8768EACEE131CDE3627BB6C05DDE961AE31B6AA1703154B0D3A8B710E90C94F8DFD4CDBCCCCE7A64455136AC8969C4912F76A5D85880F6B53FACA236619A85B07A16A3354D838BF2AD6335A995940594940E8A107C88CE0E597F9A6C25B07B3666FE9DADC2E61D4A9B368EE793BF07AFE1B9BC205D053E085A4AA0FBB3A6A6239CE910640E951F8C40DDCEDDAB9532EB9E8625F0F88989FAAA00C8DE872EE7A72882BFB27735171A42359528803EB1D7E3D22AA98B96778F603DDC8AFE6B12B276B0412198B86701F8B7F62869AC5917C508756994B9C310B6C820F69C87A89D2A2572F7D2A49B31AF2E4FD43EB174C0E24CE91BE48622A03925E9EB977362602E16933EE91A6BFB7F9CA7CAB93EDD93BBB4142C4285EEDD43D3A73AC2F869844C046ADC5AAC74FEA2031369BB96D0B295A45B927FA6002B9CC4CEBA4C8D055E36691FF6B4822A1AE38DB5CFDB45AF0CA280B62499A1C0A9DD2054707E6F68D62F6862D5FE19B378A5D34D24E1D8B5826D1C4262E1017885BA1C927498E434D729AF487C059BBBE21C2906826247BA35685B57CE285E28584A26805C90AE21C8F304BD357B523B89B076E977663671F42DC8FE51619AC82A8366CF3191EB98F9E55F657C1EADFD932142C65A07601F33AC79636F157F9B3028241049648A317AF5D22F46F0F6DA7D572CE6EAC0E32B882448AB5D5CD9B2D78BC41D5F867FAE3D624D09E148100750349E7598CC5544105104144105104265C4804C1CBCBF7A208A92A0A008FB34411556017D473BC105660828820A20828820A20828820A20828821B9CD6A9CC6500FAFEA3E95B2D01728A48B83D59E8F08AD7621C31FD3FEB8B4337340498FD74FF3F66ABE642C6FB07A1619B077B81DB410BE1E5A66104BAB3A75BDEB4CF5B4738769DD461DED4D7AEDD9E14624122DF8B20AF0ACE17C33E7CB96A6BC73F1FD1B983C5354EE2AA78D7AD79522F1B170EFB840A5AAFAFF006D4E45E325DF5CAD372EA8FF00D8883A94A89000D728C88D39659D7CC7C74E5276BCC00D02D4FA5CF76FD17CBAA6CE947712086A0F263C01E34CA978B6EFB0F6D68530E34CB96C4150428711CE54796799E7A0D69D4DC7A81DC2A2DA13437E5E5C1C459B0D8C9921695A54A4B3074D0D29F8A7ABC630C5360B66AF5D5ABF9532A70AA494B29CD47EC69AE62954ED0144B816D18FBAB3D5F9BC5D367F89F1D2032671090D42A3F917E7E861E615B2983E1A84348C1D91E19399613399EBF4CA220E5269ECADA29B10096AF1EDE5C1EC6338FDBD8FC5952CE32690A006E8592035D867F9B0353191F0B7F0FB3424218433000C921307A65E596A2333CC56CADA2EB3F532438A13C46BCCBF168A1ED44E2B144FD6A5139972FDB950EB43130ABE4B878D2A949D0C920C7791E5E9D6A2313B4089CDBC40A31A01D736D0657E310E9C1AE582142BFF0090FBF3A57411E7E2BBFCFA4FFE54BC8C7B8037C971AD2FE7A0E1CA364E15C394D4E8187663A738F1AC4494DD28A813645AE1139FF508E28813CBA7AF598C3E31D2FBD40CFC3CF2A071EB18548DD5210515980B280D3A6A6D719E70FF0013C45855962188A9C436D5AE1B76209E1054E5AB894CCC892AD273FA54CCBC5216410A601B3FB72F6F084DC229081288256B25414452EE413536A7E99F9A9BAADD46F776DDEC6319B7DAFC4300D97BFBEBCFC33585DF3F6D78DA1372F2547840E01C473491320D4EE1B10552DDCD05CE63CABEB11B88409738241B268466C1AFE7FB8D82C07D923661929C4368F6CB6E7682E78F89C6B18BF4DD5B13C52470A84F01E8796998CC5CF0B046E9AF6FCC6A824281A1E7EECCFE90DB6EBD9D6DB04B91B5FBB0BB7EDB14C3CB6EDD5936B0965696C26006DA01454A4A4954F5EB4C572828300F7A69E96BDDE838C3B94A00B29802FBBC75CAB57B7EA3316C0EF5AC31DC22D70FDA6BB6706C7ECC06556D72E25872E5685704210B3C4B242499FF00CBBE6CD783DF0429E868C2879963C837385A5CB085A949AA660FA83580058A5ED72FC6B6B65DB8BA61EB6FC438461F2907C673FA485240C9415CF88099E73CB96666CE64394B1ED91EBCF4AE51A00259500A33534A3EF10E73E3D22D6676A2D97722C6DF86F94494F8EDC3A91DCA81073CA0EB977A80C5E1771C94BB3D4873CB85BEF710E08702A43642DEFA45E2186EE59699B8653C4C7BC97169120A8F16455D34D3BD452677CB5005E97229FDE79757786DBDBAB528289DE23E97766A503DF9430C45AB5B80953A8B7B82CE6943802A39E999E5DB3D3AD4A49DA3BAC1EB70097176B3F47CEBC6164EE8496078D03D73D0B0ABE4211670966F909BD0D2592E65C0D27850383DDCA3213FAEB066B49DB7F13294532D4B6B80096F2F2F586FFE62649F9656481404B392F6AD1AFC9AC21E7E1DCB51EE072120444FC2639469DB3CB44BFF0052634577D63AAB97DE364E2933AE4115BDB4E3CCD0E9A3B806D968E271A74BE7252B8667391993CBBF291DEB7FFD478C5172B9A49A9A9E5EFBC2A12B2B2C65EE64FAB572BDADF984D572D5B49517929EF97DE9D67B01347FEA1C633954D1CC9D5BDE5C6154E1173582370ABBB926AF9BE94072AD22D1C6378585618E38CFE29849464438B01C075CC4C8F3D4CD4D60E79C523E62CEF28805CBB8E64FAF03689FC0783F138C489C6429454CEC974364CDABE678674B5BFF00763669C70A2EB16B76C4E85F48F3CA7598F2E5CEA4E54B4AD3F5915E7951B8D5BEF944B2FC118C949DE95852A2057E93E54248A8E59B52166B6B366B10B8371618DDB38B7238509B84418906409F2D7BD34C6E191BA4A5493CEE08BDBF711B33C338B961A661A605077210775F51A30ED487779883CFB7325F6CE60A254387288EC00E474CE7AD371A8DD51AEA2869A55E9534CAA5EF1098CD8F3A5AAC6EC41151A7DC1B8E516FAD0149242383FF00150F7A679888CFCE2A384A065920558DC3D2AEE6BF8CA2CBB35065604A4E8589C9AF7AF1B54D2B7888B86CE720F68F9F7E5A7948AE41E221FF00F60A615DE1956E1C76875865BCD038977A55F3D03D7CB586B7486936E841C94E8565CF2E994E93D7E02AD580504ECA4B962400E4B661AAFC34CDA2D38652F789BEE07A1B02C34CFBDAF58D58F680B05B981E156ED82A0317C39413131FFF0020C2A600EF3CC65F1F40FC079C3FF51E140723E627D79D85F93C50FC533184DD6B6072E55AF677CE91DBCDDC2148D8FD9D4AE4286156120EA3FF0088D083F7A57DA1F042F7B6361C1B89693E498F31EDE2FB426E5C0E51901BE7E9FAD5CA21A14A20828820A20828820A2086ABFCA7EF98A208A9B5A528009CE4F4FDE88214F151D7E63F7A208AC104023434411ED1041441051041441051041441051043424176648198C86B33AE7D4F2E9CEB72B0894544380FDAAF9D73F758D0C82A0082C9258BF0E9EFBB3779B511023EFAE63A547CB5267853101DED7CC00435BCA1DC8099742483C34E141C9F9DDA39BFED41835E607BE3DDA6D6B4EB6C61C1DC4538A3CA5148056DA1A652B50112A260126BC81FF509B3969C162D6038DD57A6597B7A068BF787A6A0A65A7526FCCB11D0F1F31190F12B9B775A17691EE2DA69606449F701927A1C88D2457CB9C760D5336C4C0DBBF5AAEF5B923F27CF5EB3B26515A5082012C4D4519B2AE9606B70D9C5A0AC45374B2E953C8493010080070E472D0091CA399EF50DB492A918829776A1BE8E34CB5B6978B0AB6792948CF403882E4DC71E368F5174EB47FA086951A07733E797AE82A3D33560BBBF7E99F2EDCDD05E12623F8A95517724654E068E3D6137311BC5288710C0573E10A803947783D065DE9D2316A0C5EF7735D5B2EA75ED04942D0485134E3CF2F7A9AD2103E2BDF9A00EA24651DB3F4FF30B7F9A3FE4D4362FDDCF4A3FA187E89D2401BC0122D6A7BB74891B674B6D21B3991327E7D4741F604B398264E9856282B9D6D6D5F5E995984F54A2B200FA4D8162EDF872C7D21E25D52A20FCCE5F3E54EB0F2660A9272A039D2E3803ADFA4372B969A048ADC365DFDE9155BB6A40BF796B4A9A5A99F1500CAF2309CBF42721CF3CE730C85B5DB9870C2CFAE9979D5099889614974D43B1614F3D784629DF6E3589E15B2D6B86E08D3EE3F8DDC30D071A0541B6C5C212E874A4C89415012623BCD4D4B0A29156398A86E9F9BEB099C54A24EF2052C5AD950B9CEFE958CE7B01B396FB31B3369875BA43695DB34E909007F51E425C72748256A56B9F51315352710508092EE00CD83E79F768AEE38A553B7921C39627B53F079D69177780855A29859515924833A664FCE69C22782C5CB96BE7CC72D1FA43505887EBEC7DB9437B4B336CD3ECA5280E5D0212A0202A27883A4EB0321D01D29F4B9C802D7B161C2EFEEF6CF72B0552D4C92106A186F558E5E75ED5235577DBB97631B617B4F845CBF8663F8105DEF0DAAFC2B4B82DFF0054A5600E257BA888E67999A5C4C964592E320C395AA29A3BC3B46252E096034F646BD838D2301EE877C9BC0DF862F7FB2B8AD85D61786600B4DA397A869D67F121AE26F890E1252AFF008B33949351D89DAF2252BE4A83D2854C683D7ED0FE561C4C47CC012806A4B004B9A51BA7946EBEC761385600828B6538F2930971DBE292BE29CCA5423E27B557315B4254E2C96009B5B56EEC6E358557825B10028D1DC697D3A68D9BBB5ED717816E908754A49009F0CFB9CB4CC75F2F4AAF4E214A56E9A1B75AFBBF0D2139781536F14B1D0B057BB71BE70DD6F2D078ADDB6564EBF884C83CA323CF3A4521492E083ABBD7CB9C657842A052EC750A63CEA29A5B5E061DB6FADC424BAE1B75FF007376CAE06939EA94F53CC9FF0034F913A40401365A49D583DF577CBAF48899FB216A5EF6FB816AB13AD73EF7CAD15A956FFDCFDD93CFDE1CF5E7CFEF9D6462304A1FFBA1FF00D21F857A5DFCE1B8C3AF0EC93522F99F3619F9DF449DBD62C9B539E2385B482417152729249CB972CB2E5DA4B0B2B0B394375294EB4039796A7CA27707865E2421294A4A945AD5B81CF51EB9BE9F6FB77D69C14AACB0CB974DC12A48F097212447E6820C67CB908CEA613B224CD62025AE73D2D567B768EC7E1AF8798DC7C895304B092A624B149BBD69516F2E31A5F7DB73B418B5CB97577885C7F5CCAB85D564341A9CA408333967CEA4A5600490C94848E54AEBE5FD8AFA07C3BE07183C32244E40DF005C71073BF967A88B2F16BAB9BB928C52F50A339F8D1107CB9E5D35A7024EE8259C0EA3A53DE516E1E0A9332A10914190CC64F5BBFB7885636AB1ED9CE1559629882DE6CC92B7945A235CA35CBEB03AD31C44BDFDEB56874193D1CD731ADCE510DB4FE1E7CC967712900E5EB460FE6EEF6BEC76E6BDA4715B9C598C131A7D0E71A90D85BAA247432547F49CF5EB5E9FB326CD5B83726EFA3035B37E291C9F6E7C369A9139611500ABE905FE90EC32A8B657B88DFD62F59C518372CB8D28702567C320A0F1267239E7F669AED7D98BD91B3D78C98A1BA12E4039364E19EB4EF58E358AC0CCC22BFC7285A194B1F58666398A366DC18EA623DE09530A7828702499139C831A1D73FA9E506B814EC4276CED4299043EF3026E58F0EB7616EB17295F2A682A0487BF7E0DDA2D8BB4BD78F5BB8CAC25A649E34A8905526047A83AE9E622AE188C1AF66ECE0998090006A386A3E6D5E80D1DA2DF859E9F944D015062F7E5D88B91768C67BD2C1BF98BFB3D874B7E2E25885AAEDF889294FE1AE995AF8F2241201881DF38AEEBFF004F928E2F6FE0D69240F9A1C500351C6AC337E51CF7C52779334BDC28E55615CBDE79C760F64C26DB01C2590326B0FB341F34DB360FCE4CF5EB5F68FC264E1B64C8704FFA48B0B505A8DA0D34A5BCD7B4D0A998A98A51FA8A8E766367ABFAC5D68706700998CF97EB5615ED1DCBA559D0073F6EF118A94CCC4679F2E1CE29FC5B61C2D190A1033D331220FDC73A25ED0130B00DA960D76BFEA115324B13DE9EEF15A9F4A53C460F9199F21F3D6A4E52D3303EF2453335B69EFB422B9BBB6AF1FEED9E45DA1A7F32689E11055CD23F30E922644F2A6B371699733E581BC750FEEB52D0D958E420EE962AD054F5B0EDF6857F1CCA44AD40189099851F2075CB3E54E64A8CDD136BD39E7942A9C4A5428CFA77E3EF431E26FDB5202E14892442C7BDF09EDCFF00DED35489555CC401997B35DFDF9D21ECA96B9A010186B966D0D5DBF69394923E9CF3D62753032F8D42E2F6E60B0C4838896FA6F0A7E7BF0E21DA706A2CF4A805ED5EDEB163E37BCFD8AD9E5BAC6278F61CC5F311E2D82AE5B4DD278B3482D28C891046B919D2ABDB53C73B3B6661158A993659003B05269A67CFCA1D4BD933A6A884A084E4A214C75620D5B3A44161BBE9D8DC52E536F6F72A1C4603AB52037F107F59F94D3B67FC65D918FC60C2A14872ADD774EADAF06FC52313364CE96E4D8396D00E95F7C5B2A5AE316370DDBAADDD43CD5C025B79B50534A2333EF75D0475AEAB86DAD2715864E225AD242802038CC75E76E05A23CE1D61DBFDB70D51CFDE9AC488B8495A91C2A1C312AFED33D0F3FBE944BDA895CC0862E6D415FD18D3E529897142C469ECD2D9650AA161C4852743313DAA550ADF4856BCFEF1AA925258DE2BADE35828820A20828820A2086123C4E1EE0FCCFD8F5ACCE1FF00F156AC8053F2F64FA43A425E50E6A3D89A428540850E9233E7F647D399AAF6CC9CF8B32ED555FA9E1A8E35D1A358D3FF006C4D89BADABDD4E309C212A38EDAAAD6F6C5C6C1F150DDADC26E2E380A4710E26DB2150340796BCDBE30F860ED6D8B895A51BE4CB2ED930A8B708B46C09AA1302033259DF4539FEFBC6B3EED36C5DDB5D82C3F145A8A6E380D9BCDA8C14AEC57F8658209247116C9CE67B57C89F887B2E6787B6B4F985051B8B5D5980ADCF3E9A976A76FD893D9090E1DA8721916CF83BEA06513CBBA0D2CA262232D27FC6A3E72753C6315B4FF00C99A5649356BD78B67A533F4BBCAFAD00D19AE6C47BA7AD6176EF4883C5A77E5A473D24F61CAB444D2A65025F424F2E1FDF9EAB97BB4BB54BDBB55BBBB370878973C44858D0E99F2FD29E4B9656C5C1D4E9FDFEDA192D3BC4901ABCADAB663FB7BC3E6F9FA73CF2F59E7AFCE9CA70FBC452D5200BBDB27D32F586CB96C5C9BE41C9F4A768593F986BDFF00CF6A7689252057A1EB70DDA13521245125CBB96AD3DD38087CD7F6FAFEB4FE4A294E14CEE7F64F610DD520B12417E0FE6E3216D6247F061865370A59E1BC30533A701811A46672CF974A9995294102A0939569D1BDF488D5813173129FE528FD593BE6D9BE79C4D3780E137D6ADA714690FF0081EFB256124833C530A079C69965E712B225050AB06A56B57CCE6D9BF9B888EC42E682844A40512FBC482586AF67A9D6D71130CDDA14D27C3F7509F71232FCA9012072C801FB73AC295B8B24F2D1E9E8F73FD420B94490141DAA684D4FA7AF2857F140F3E7CE72EFAFD3D2964CC0082F4C8034D6C4FAE67A468A934A22B4CAA7DFE8DE28BAB852916C5A265B52B8C89CB88C0075EB3AE7C8D3D44D06A08E5956C7B674849324EFA8A92C0E4CD6E6EF6B8A33C597BCCC758C0B6471DBF7D21C1E034D2F9FFCF2D899CB32AD3BF5A5FE6EEEF68D972D5FB3539C6C892920100DFA5FD9ABC61CDCDD8E0D856CDDBBF86E1CD337B89BB72E3CEA1A4A16B2A794A0544004C71644C6B3E74EDA7337B12480CFF6D3DDB47A58F092C19037CEE8171950E63A17E4632D3ED356CD169D584BAE0924182273E79F3CA7A79C45C3E94B2B53A58CB1404B105867F76B71315D9AD2865012E7880490BE2E23A9E7CFA72E9446CA439706BC7DFE624D2BE21A8FB3CB5F58F5A21BAD172C5F30D78F7C4299CE008D4F5F3CB2FBD6929A58022E3F223558019B378497759812353399CC7C40FACE79F3A6C92C41766F7E578869D27E6CE600D081ABBB0E6F7D2CCD420617DEFEDD1D98C02E4B6AE15B8DAC20E801823B733CBA4198CE7F674D4EF07BD1DB8364F6CC9EFC3A5F83B63267E224A948DEDD62011435A3DCFBAB54471EF6A77818A5EED0DC397CF2DE6DD795C3C4A24264E838A6047FBABC60A6A77413502835E75BB79B5338F69F823610F91246E00E91D18662B619674CAB139698A85DAB6A27358EBE5940048CBB4CE841069FAE68D69975D72FBD62F58BD9CB9135920D05486D1FD8D6DA9A1CC450264881CA673ED32232C865E7A4B45CF21C034550B5A8DC79EAF0909CB9640215A501A375F4FC442DF620C2D21B5000AC11CA67965D73924D3499358904BE6E3F2EDDB48C7CF5CCFA06F1D3CFDF73CB155F3B89E0D8EB18861EEADB8702814A8A465E519C1E7AF3EED953774850259E9A65C73CBCAB0CA6EC59D892B265A88502EE1F5B5EF9F28EA0FB3DEF06F719D9962DEF1F5BB7496F85C2A5126048124E790D0CF3ED3517E319FF0033C3F32593BC4A1541A3E94F6ED78F32F8F7C3E246D09BFE9EE904D8354BBB5FA9D2F58D8672FDE369E0824159EB1A9E59F9F502673AF37787E4997B5F79882262A9D7DDC8E2238FCDD9C5134FD2D66A3356F5D21F5836AE04A543DE57BDDF298F9199FAD74DDBDBD3F05BA1DC8038E55E3FAB343E4C8F9729E808157A0FEBD8BC634DAFBCF1F7A3BACC178A4DE5D5EC26419F08A17CB98CF96401F5EFDFF4E3B3CCADAF84514D3E62090464F5AB797A1A8E6FE279A1299AE4FF0015371A1717EF7FCF607086FC0C36C520C14DB30982607BAD2464272F8EBDEBECEF8551255B2E402104FCB450B3FF0011CB4FEAC3CCBB571E99589526BFC959B677D726B696313CDAF23319C4472E994F3A9C9B8390A2019690CF50900F2D0B7AE511A31C998FBA4022A75AE753AE55EB0CEE6CCB8A53ED28A5460C1ED965EBEBF1A6337032D03FD30D43EE9E63918CA4AE654B9734EBFBCCDF934276A9712541E54C64028F2CC69F0EFF00AD7F1188998759FA983EA476D457DE4BA2402FBC2FA5DC7EB514E358A14CDBB6FBCF209F117054A5C78420671CC77CF9F7353B85C6603FC713710B921412E4A88DF06AD77AD3FAB16EBD9614B2B4A4BB50354B9C83036AE7D59C595B51B6FB29B3D6EE3D8CE2D66CBCD4C34CBE80EE5FF8AB9E407EB54BF1178FB66EC996BDC9F2C14BD4292EE1F9578E6D9C49613642D44028209BBA73A3DBCEDE51AC5B43ED3570FDC5E615B01B3D8BDEDFA484B18B6296BE2604E28C66879B54A929D164686BCD9E2FF8ED2B0DBE9918A7237836FD2828CC781351168C2EC898AFA0B849008DD05E9AE8C6313E26D7B42EF0093B5FB59806CC60EE199D8EBDB9B3C4D0D13201E3F74382418D2418CABCD3E20F8F78F5CE9865E2E6B026D315BB7E05BD2968B061B6484A424A3798DC8ABDC3D9DDF99A42DB3BB9DD9AB4B858C471DDA3DA8B84C156258EDC22F2FAE179921D78895250470A33C911AD72FDB1FF005098AC4C95E0A662E66F12410566B51C74CADC749D93B31A57F1019E940DCBAE9190118260B875BBA9B6B271AF0D24216A692932260830232D620F3E951BE17F8AEB95B4E54E54F213BE2A554BB3DF4634CF9445E376728021208CCB8F5A1A643A4671DD163CCE2B84AF062E14DC614A511240510E2CA877D079F202BE85FC29F8928DBD230D86F9FBFBC121B7B80A55EDC8966B068A7E330E641528A497BD1DDADCFB53A1319B5DBB52ED0B4DF10B9040274300C1EF981F3F87ACB666CE44E948C4160E01AD19C6B6CF47E0D7AECD5942DD2D5720356D502CF7D2272C12B45AB6173C512675939E7FA768A94284CB2509B0B7BF7CE1B6FEF926BEEC07010F2B119828820A20828820A20861C12E13A1E674CA75EB39E5E75B4D27FC75268CC4D79B81C896A71870957FA613C4F2677EFF00685384F14E5DE3AF38F3EBE7EB5AC14A54AC5FCC66FA89D2845001DB2F2A425314C014914BD788BF9F3D0C59BB4B602E59BC66E528751736D716EC323DE243CCADA59E13A81C5273981D00AB26D1C148DA5B2E6C854BDE3B8ADF252E1CBB0E4F7B75B895D9F89DD5A595BA1D2E41B91A17AF2B7511CAFC2D86375FB7D8E6EFDF4A9168E5CAAE30B5A0016CE97D4ABAB84B44E4A502A85009FCD97535F26FFEA63C1ABC34FC6CE91288AA88094B50BE5C3981CB3EC1B0F1EF2A5A8029A0606ED9160FA96BB01D22FDBC68DDB8BBB62196571C2DBBEE39EEF320693A8D6441E95E024E166C8529131C292A21B2FE5C6B4BD348EB3B397F370E8A3EF5C9CB3BE74E34B81110C5D715C7E1C1293A059C9073F4CB4CF28A792533010E6CF42723CF89E7120A97424B74773CA95E462EC6141A425A52D2B52466A4990673CA796639D4D6186E9AB16CB5B96F3F2A888F54B5281205C921DDEFD7F30FD1708E60E71A67F4D73CBE93528898803439BB71F6DA57386E517240BB54549E14ADA1C25F4710C8C7A7FAF9F4F4DBE6A29F50739387F5F48DBE48527F890780D0F2CE1EB770811AE5DBAD3C9335096AD7C9BED7FD6A92A4960DC7A5EB4B509D4758A96F5DBE0A78D0184478024C833EF710E5273CA321E553322685331D5AD4BF13DAB5D3364BC3A0951090952BF9716B1A72B73AE9376AFDCFE1C21F7029432053311A419E80F3F9549CA98C28AA6A48ED66EB7AE70C57242545D00306A0727F35F28789B84B00340CC6A44C7BD04E874D35CF2A8F9F39A6286F501B8208B7F41AD0CA6E1C95380467D3806D5F8985C5C9390933D24FEB23E535AA278554AC86B0767BDC7F40469F208B247507F07D61CB2E10D5C051953BC3E11CC84C6B33A03EB4F25CF600DF4E1ABDFCBA36692A428A907E9003EF0CEA29C3C8C5A1B65B3EEED5ECAE2F81AD683717EE5A2995289F0D2961E0B7028E664A410235269E23140A4835245079675E3E5C630A9133E6CA28291283FCC16274A5AEFF007BC31C1F046367916366C2521BB26C2484819A9491C4469CC4CEBFA56B1CBDE9E55A9763C35F7E64C4C4840548521CB960F6039F9EBD225AE116F7772E3CFF0019414C2008907860C8D333D34F9533A126E3CFD4F9F942A842A5CA084B120E76A9AB7AD7AD629B3B12CB094215EEA492924E704CE7F1EDEB58850A80A1BE6D6F387801403C5CB90CE33A234242886A1ADFF4FA43776E005409D739D065A9E7C8F5CFCE91981CD5D8B5B87F5E70DA6A4EF312472D381E7D793C473B720716A75D20E639E5F12338D7B068A705B8B3FB7A9C9FD690A6170E14B0AFE4A7140F4FC5AFCA35ABDA06C9EC4765AE54D254B752D2CA12904A879C67CA7AC75A96C34D4A1282097CF362F9DDCE56E2C2D1D8FC0625A315BAA01814B3D32A803BEA79C7212E12E5BE2B72DE2E859525D5786003900A233E2D3CFE11955B30389010904D40E5CB91CF933691ED3F086270E8C3CB48DDDEDD00136AE65EAD66FDD66EDF1342521014AE119252341DA35D0C1ED9F39A915E212A1722B4C9FB9FBDBB474199814CE4FCC74AF785C5F2FBEBC3524BA5DFCA09D673C8E7AF5D3D3E3CA9A2E6E76BB1CB4BBD7A74AC4362364EF1748CCFE3B353AD4DA2DBC6F114B4D32E369754B24CF081C880200A69367B8209ADBE92FA5DFDE8E23383D8A4CC054906BD0374E56D7998B5B10C51779E1212E21B724407494F4D633D20F6CE9B99C4B24292C3F8BE45A963AE917BC26C992894EA4151DD3FC402598DCDAF993FBDEDF65D45DB2CAFF10B4389584F096C92233EA0E7A03976279D43EDB9DF3B04B94A2E7748615A1D070F4AC7923E2F61654AC76254801201A0CC6A1B91E0D1BBC9BB63C4432A42F8D24498CB91CFE73D74AE4B84C38918FDF0199449360DAD6ED5A37DA3CED89967F9298BB8059F9D4E608EE0C5CF66A0FDC80D25442000531AF126065CC08EF19F6ABC0969C604A12E4121F3BB120307F4BF3888C57D3208240556A6C1C66467A6BDA30A5DB2BC63DA7F74F84DBAD017833B8AB97E09C921DB74B8D822352065C519E5A44FAFFE026C6323178599BA2AA15E3439F3ADFCCC71DF15CEDD4CD17A299893ABB5A9AEBAD44764AC5D53EC5B0692B090DA119CFF0062129303331918EC62BE9C787538A4E1A4EE9DD0501ABF4D0545FDF91F2FEDB96B56354966FA8B1ED9BEBF6CE9131E21B74A54EA5652A895019274CC9390113FB55C7FCC44A40F9EADD201724D389EB7F4D21BC8C2CEA50D6E75F77E19EB0D6F7136ED185DD29E6D16A94951714A809004AA4E8204C98CAA0369F8BB65ECF96A5AE6A0EE8352A4B5B57F2BF78B260B08A528259D4726BDF5B0CDBF6DA81BCEF6B2DDFEC7DC3D63678BA31DC59BE248C2B067DBB8BF5AD23F2A590A0A2A9CA23E735C47C47F15F634854D1F3E51500AFF00724316A06CBDD2D16791B2B78A7E8AE6E2F67FBE5525AED18A99DF26F8F78D85A2F706C39AD98D9FBFE34B0C630D5C59ED1B484129529F4A4F08E28E264FFD08EB5E58F1A7C7FC461715324E1314532D2540042C806962C4D19A99F38B1613C3E850F98505D4CC08A060D4E3A33F286F83EEBD8BEBAFE67B578E6378A5D9505AEDDEB90FDA49CD4025C1307CB3115E72F14FC72DA38D331271733EA7702629EAF70F6D74E959895B11200013F50CC870391616D7F35C9EC5AE0B8484DBD85A069A68421A4B690D891AC72922550333F1AE3D8CF1EE2B684C56FCF242890C55EA0BE60B3F9089CC36C800074017CAFCAAEE39D3562F0E9788DB110AB5682644C204FCCC44763F2A7123112F1A9798A1BC41CC568F6F7DA2451B2806DDA13572EC73AE75D1E0172C3612E59B4842B4571244667B69ACCFC2B8D6DAD9D8A5F889A4AD46515644B014E9DDBA64B0C1A93BC998DF5301BB6A5C97F4F2CA29BB5BB7C10D9E042345F0E47399024F3E53AE5E553F324E2767CB4CC0A208DDB38146D19FF3A986B88D9E8520B3922FBCCEF6D2FF009B45AD866D07FF00816D93174DAD630EBC75B4DCA947DD4121284F88720389648483AC7781EB3FFA7AF1BCDC36D4C24B9D38A46FA036F367673A80C2BD328A16D9D9EA017F48200A86AD7FBAF08DE3B2B862F059E20CA7DC71A42DC1A95788D8292206866467E55F62BC27E24C3E3763C9226254F2D1621DE96ADFBD41BD0C72CC7CA5CA5949AB6F55249B96E1A75EC22EB654168E21224CC1D469AD5A02D333EA4D8D5A1ACA0426AF7CEF427DDCC2B598560A20828820A2082B06C791821B05242B965ACC41EDE79D42A3682A6633FC32490F548371715360F7E02F585424945297AF5CFA450B751060C1E922467FE321E952EB929952D5319886AE43573473AE7CDE184E594AB749607372DF80FF009EB6E5EDB3D77885BDDA4AB82C82D2100E4E0793C264660F083F426743A61B694B5A6648762BA298DC07760CF5F22F9C3BC1CDA906C0E5AF63C99FD446897B5AEEC2E7F96DB6F0F0041FC7ECC3BE290D025DB945CBA90E8570895042279E4267515E6BF8D3E0346DEC2E2A7225050285127774196AD47C9E8D78E8FB0F68D65214C145986603DC8A548B1A1D230CE01B5B6FB5383DA5EB2A0DBEB425B76DE785495B4036B0539C4A924C11A57C9CF1F7857FECFB6A761F7373756A04377CAED6CFBBC7A2FC3A913300958AD03837A8E0EC4B6B571138DD9A5E1C208438661472332799CFBF6F49AA22B06A975673477C8E6DF819923368975A0272040AD9DA81DD837F50FD9F12CC780EAF8968CF8A7AC75EDDA0E99CD3698B12AE403CFDBD5A90D16029F75B81ECFE90F9AB9194E7AE720F5CA333EB34DD5B458DDC73FBD9F4E8E2F0D148214D523337E8E58439173A67D39C65F1CBE1E95A0C7392A05EB4A870D539E661DA255052ED762C391AF3878DDD6B9FCFFCFEBFAD3E958E342540D01A9B599BB1B5A34561F41DBF43D44495BDC7BA9274CE7BFAFEB9F99A9AC3635C02145F47CC11F8A54654786536433D393367E9E96A65128DDD8C803E7A09CF31A7C797954AA31E4A4EEAAE2D4EAFCF817A3F0862B906A4D6CC19ED7EBD61D78B2AD411E93F2314DA6620A94589B9A3F3C837B7864B94E5ACDC7F47CE1CB6F0C88C8C41981F4394F6F2ACA67106E7AFE7BDE8D7D234F95BA2C0F9935E5587497A10003ACC91E7E83EBE95212A783572096EFE9A793BC226555C01D6E3CBCEFDA00F1D38943D4FE84D3A4CE049A654D7DFB6307CA1C3853DB432753C6E295EF13F1F8EB51B893BD3093776603261EF8BC399602502A2BD2C4DB9427E17657C3FC5378DDC6A3B887CC8E16D23CF5F3FDA8845441510F0939A2BCFF5A05481AC651FC875F4310376E70BAB13A46435FAF7AC4C04023DB3DF85A1E270E26241677AD785743DA2356E8D4188F3F8CFEC7D4D47CE21CD0E556A5B8F07F511ACB0252EC03721E963CFFBB5F1FC1DAC5AD5D6AE1295B6E2542089047DE9F104D29869E1EB514A71CAE0B71EE0D62DDB1B69AB0D325AE5962935D4E7DAFC1A39E7BEBDC83AD3AFE2B86DB10254A8424C19F200CF4CC7A4D5870D88DDF50E73E5CEF46E3468EFFE1BF1B7CB952C7CD3BC00DE0FDEFA79E6F411A717D8662B862541D6821482AE20B0A0A80729D397C2454989E4DCB9CF3FB8D3FBCBBE6C0F19C99D8742553379D981555B817F2E76A45BCDE3AF070B6E96C198304E506273396791F5CE915CF228E69535A7077E1F9E57EC26D2958A1BC374B805C31E9F887AAC6F0F527C2B9E052849311CC4E527EB4DD53C005CD4D8BFEFEEF6A343D9B889724198161219F260D42D4F7E96D59E10F6D26D35ADB5921D4B2A74090232C8F29190397C2A3CCF24FF002163AB654CE8787E220F15E38918013126686014012AD417A3F316EBAF55F727B14BD9BC36DDB525521B4A8920EA44EA40F3CE464072A87C5E20A94506A05186B9B823A37121A8D1E56F88FE2197B5B15366214FBC7573F80FD684E95D86B5B22FDCADC1C86B1D3F688F8E7CAAAF3E4EE2FE6002B91777EB98CAA3AC713C5E2D23FD304BD180234A9EB7CE2E54307C36DEB7716D2D869F72E14150901B42949923B2753F2AB3F8687F938B932C1FF700AA0A694EAE699935BC436227ACA666FB1410C9003A8DDE8F95BB691AE5EC70FA7783ED65BDCC72F9D7B10B6D947B086F0C57178ADA0BF6CB6DFF000E4103310A098D3CCD7D0AF835B351253859850E06E9A0B97D2C45B331C5FC64A56E4E29504BD89341C0F3B6763CA3B5789ED2E0DB3B64A7AFAF2CB0D65A4125574E2590001275204C011E9E75EE3C3789365ECED9D2D33A6CB42D08662520EA796AED1C706CA5E2A66FAA5AE639A2921D357CFF005ADA91A3FBD2F6EAD8FD97B97F66B63ADEEB6AB691D516996ED128BDB52E8C802942828827A6BAF9F16F1C7C5FD9F804CE12A7241485070A00F30694D6B9F289DC2786A615552425814900D35DEA368D4EED1AD8EE31ED33BE7BA2BDA67D7B15B2B78AE26ACB0455DE1F88A1854487DB54A01524F4820FC3C57E3BF8E789599F2B0F8A5D94C02C80C5F27CB3EE6B16BC16C192809594A41A312056ACC33A722DCE329ECBEE5B77FB20DA6E1786B78E63EA016BC571665BB8C483BA9525F8E3E29933E43BD79536FF00C4EDB98C9CB32F1338A544827E628EA00ECED7358B3E1F62860771CF10F40039A01F7E228D1976CAF2DAD2CDB65D0AE36C11FD503C4009F7475E102027B0C88AAEA36D6231C8F998A9855354FBC564953D75A677CBC8CC49C0001212C4021BEFD4371A5C0842E3681B40842608F42627A6BE7A6994655178BC22B100A92C49773D684D6A5C7A7187C8C0A52E48734A016167A5AC1D8171D61A0C40DC8F149E12A9CB498819C93AE5FE62A167603112BEA028330FDB27B96F505E1F4B90909DD0C40347B8A934CFD34D63C37103527B020F61F5E9972D2914ED5C66114005AE94352CCFA5FD87857E50C9B3FF006FBEB0ED9BA1C31391981D0CF4CF4927A6B9F4B56CC54A992C63A78057724EA1B335F3CAF1133E6A513B74F604E63306F6CA9A0AB8768BAE1E124E5A723D758F803CBE34DB6C6D2C2CF96654B6DEABB52C5B57FD8D03467E599A9DE48398A3BD19B91FE8E4F696DEE12BC6B66F116AD65376B4B772DBA9C96855A10F40234E22800E42454C78076FAB63ED492B0A665A58823506B466F7A9883DAB800B0A7191737AB68F97172348CEBECD9BC73B6BB0D87AAF9D42715C2D4FDAE2ACAD50B6C36EA99B62B495482A4360898CF3026057D6FF0081BE2F5EDBC1E0E4098A51DD4821DC0343C1C1ABBDF2668E3BB6B67FCB9AB601D4AFA435581ABF106D71A3398DADB6585B414233E9D394768FF55EC9C34B32E5A42AA77479811525A0CB5141B8F7EC8A438A711A414410510414410560D41E460862B695C648227F7FDA7FC72AADC9D958846D6FF309FF0049CD896A0CC7EF3E30E12AFF004F745EB539177B7A77E109780A05464124CF9F3E9973F972922CD8B989561D72C36F100303D5FDEBADE3A7C92B5022BCBF40DE1838CDE36FB6B6548F0D321C4A89CC1CB2F39EFD472269D230389978BF9A15F4B92439AD6BEE96EB1B4A1F2D41CD012E06B959DF96A6F169E3BB3CF63AFBB657A8B6770479A710F5BAC152965C6C89283EE9851907D6A5F68E0656D0C22E44C46F132D40821F22053ABFF6F162C26D64480192833014FD4431605DB514B59F5D390BBCED96C7370FBE1BBBEC45A5B3BB4C5EE9B187DEB69526CF0E52C00B4DEB86196FC57DC096C8D4E4649AF9B7F1B7E10E315B5F13B4E525A4EF2D4285B95B864D51DBD11E10F14C8998144B0C16000A4E85C5F893972BC64EC531469DBC63F95BA8711E1B4ECB64282D2EA12B49491120A4F5F3AF0FF89E51D8D889926602E85148E2DD069DFAC742C1E2062929B97772CEE0D998E86F5E10F7F18AB85788E4A565290A072208196BD62738EDA455490938D4EF21C82F703D1F2A67931D2243FEDFF4FD36353A0A03C0E674CC712E1A749C81CB399E594E79FCFA73AAD6D952F0153BCE34FB0EEFDE911F3B0C50A2925CD9CF0CC77AE5CCBC3A0F1CB3CE791CBACF3EB9EBFA536C0CF5626589801A9B171CCF2B5A9C328752253201567964039A5A1E36F19D4E99F7CB223EFAEB52B2D6A04006835B06AFB6AE42B4817298D183BFBB5FDF37CCDC840824C8CC4E9EBD4F6E644CD4AC9C49481EB6B65DFA529C58CE4D1C0BDE9F7F3EF126CDEB41241041904401033F97CA633315228C61490C6EC286CD6A397D79B5CDA3A6A1CD081C39B69516D224117CDAA08E20349CB5119CC79CE7EB4E3FCE4B80F56B92C6DC0E9CB943338770E01A92EF7AE7D3434E90E91760F2313D33D3B0FF0073DA9DC9C5A580A1275E15A55CB54EBA3011AAF0E4243379F637FC3F387ED3A1690648D753F7CA3BD49499C0B35CE6EC03396CF2E875A886A431208AE60C384852B457C499F9FEF520858A3B1247507367E7EDA34514A6E9F20DEFCE1276E034E14C4981A673D3EF29A426252A39823F5ECD23644BDF4024917E63837B2F0A25D2A12065E47F7A4FE582F7A5EDF88C19605DC3F11F8F75D0C2A1E200100C7A79567712C2A789F6FE4234F941DFB1B9FB7F51E195273D4E7F3AD0A085820D01D687DE543181F4AAB56D3945B778DA8DC2C83CF4E5EA0919F5A4A6CE480451C6B7B3BE6C226F0CA48949A3DEA00AF57AC462D0B920900721CC91D79FED51F35495367EF30E4728426618AD6A21EB5A1ABF7B71F286E0381D25C292DC0084A7946B97DE51AE7484B1B84B92CE2DC1D9E093226C92FBC79B906F4FBF631058DE1F638A214CBEC8532A10414827969397D3D0549C9C60401BC016A55ADCBD5BA67160C163A7482085356A145B36E35A07E3A55F5976EF719B338E3B746D5BB965C7408E04A12DA55C3CA0729EBF1A79FF00714121BE9A56C071E4F4E6747A742D89E319D83DD1366380DFC4D5C3F37F77A46B2621EC8370EDDADD62F8A5B5289095384119CE7EEC4F5E99D657B450522A2BDF3357AB7BE7D6763FC59C2E0D094CC51A001DEFA3D7BE94E30F2C7D929C438CF8D736EB4A0FBE56A25644F972D23E191A6AAC6855986957E1C39E5EA0C9E3BE32E0A7CA32E5BD410F41DAA4F3CEDC6362B633D9EB65F035DBDC780DAEE5B852961283EF01391039C6667B742115CF46E9622C5F869FBA1E51C9B6E78E66638CC32A6A92953B1DE6353570FCCFEA873E3569658682C30829E0425290008C9207FAE9D6A03138B44B9A4A8B819BD6B5AD0F3CDB368A64CC5E231690B98B2AE65D4C4E7534FEAC21EE1AFB6C073C549515FE58823312013991969FB53156225E2C89680429D83655B3D7D2AD4D0D7F152A615956F11C9C963A83C7DEB61EF676F86C86ECF6BB1568B366E61F62B4FE22E3DC2E9B86DC6D3E12841570A8C1D62BA3782F62AE5E225CF56E9485051B937D326D29E71133C94975294F50340E35F7DEFCFEF629F6ABC3F753B27B6F8A61FB3B88ED0EF1768EF880ED9DA8BAB7716DDE3C18F1085070A5285A44E6400790AF69F82BC6F81F0E61A5A6784BA11761906A3915E2FEB5E7BB7F64AF6829C12525DC3BA4E8E3576EA6368D9C2FDA37DA2F13FE77BC8C69DD8ED9FC45616CE0B82DC5D585E30C24884BF6EECA525C4F091C8C9390D281F103E37CE5E3662309885A6539000511FEDC803C433D468F0C703B1918597F2CA522F972D47EDEE1C18DB2D82DCA6C16EEACD0E1C370EC5B106D2957F37C4D969EC4BC4199587C0078A46473AF3178ABE256D2C7159FF226105DC95927851D9EF47EB5112F2F00898A094A149ADDBE9367761620EBD6ED78DCE34965F5B96B7B74A57BA1285B92CC0C824091EE819013CA04E83914FDBB3F1138AE74C5A8135DE24FBEA732F60D3B85D9492005212025DE9AE741DDF3ADA1156D23CE0F7D8B4E28C9C4A7FA82720788C67DA35F854CE071F805247CF92925AEC1C1BBF4D444A4BD88CA13113266ED7E97A11986AD2FC03666B0D5370BB9578AE2CA8AA4EB33197C8683975AAD6D19EA56349C2AB764B80C3EEC776D4CDE99461783F94ADD0000097767D437322FAD6249A6ED9413C62546072CC7D67CFE13562D95890129138953E46CD6E0FDE9E51A2E510E52D56BB9623F2FADC3C78B6C2544344840D04C7E9F0D2AC8B99859B2C83287D4340E3A3BEA1AB9C6C896581FA4645857DE77308159491999FD3EFF007E9558C7E064A945494A5817A8D33A574CEFC214DC2C6B5CB4E2F0A22E0275981D4F799E71150F88C79449560A4D1767B369667BF9718AFE27013264E2A06E5E9F6F60F3B05C5EA0260851D7BCF6F53DA3AD57D5B371F289C44C98A29772378DBAD8B11A3E4CF47F879265202564DAF535D3D8ED9C95A62B6FE33368E5B5C2D170875B52820147BC929053AE401CFA537C3ED9187C74948554298D58B83AD7AE5D03445ED259099891BAE59A976BF96675CA312EEFF1373751BFA7F67710BB6ADB6776E1D4ADB507382DAD956ACF8812B39252A71C54467C4A98CF3AFA77FF004BDE3593825E08E2541481BA0906E3277E2CE6BCAD1CCB6D23E6054C4CB1BE9A25C6B43D1AB5B1A56B1D4EC32E9A36CD80B4A894254983F99244A543A820820F39AFA7F83F1061F1F85978992C10509B35683DDFBC731C5A0FCE59C89A6B76F66CD5E53156186705104144105104144108A8428F9CFC73ADF786E367FB778502C2535CBDDF2D229A6B3524BF166E8DEB942714A913273CF9F2E43A5353F4D48A8EE3BFB31A2D05E82B98B1868E351390F3CE79761A79E9583894804B81467E85AAE6977FDC6A2528107773BB569E768E677F11CDB0C0F07DCC6D1E1D890B773107D36E709B25709BBBCBA43E92836ED932B0CBBC0A5F0E6919F979F3E2C4F9733033904228955DB31968FCBB476BF03E0819067EF2895EE9097A067BF03E7A472EFD94F7E3B59738633B17BD8B7B7C2F1A59745862AB4AD9F16D82CAD84F8CFF00BC4A58F0D10040564328AF953F13766CB99B467AC005D6A3AD09B5BD34B8CBBCEC492C25BEF53270C72A81AE95B51AF1BE7637A875A43ADBE5F6CF170BBC5C41624899C811A11CA32ED541D958444A400774024DEE2ED4BE5FA8BD26480809005402F571A64C694B0B989C6EEC04C0D7427940EB3946703D22AB9E2BD9E89A8580CED7E3477F4B6552222F17860AAB5791A65D2F51FDC546F805646349CC881CFB7FBF5AA7E100C3A0201AB97007134E4DE79BC252E584CBFA921C700FA0E95B707AC3B45F080273D73FD7B7EA741CA45130383E791CB2B7A084A64B241296B8A5B5D2997E9EB0F9ABB0A0924CEBCF9E9A6A7B7FBA7489A1C54B771F815FEE23A6C925C1A0E1EACDEEB687A8BA190904E59C9E646BAFEBA74A7B2D6E1F7806B3963D7D3F55868AC31277999B571CB85EF539DDA241BBA1C2923E1F0C867FBCFA5644C014E1C936A023A5B5E6611128824D9F5D2F461687EDDCE5F9BEFBE79794F5CA9EC99C090D716D43DC53D7F508CC94452A470E9DDBF312B6F78021327AE5273E5A7FBA9A913451E8783E76E3EF50D0D26C81739817BE7C06991E31248BD498D27439E60FA1E7CA2A5513ECCD4B3D1C77D3AC3432C66FD7FA8A16B4B8B9009273CFAC7A74EFD666B2A9E1CD09E34F7D237480031CACDF77E3A43969412224E713DBB4749CFF007AD7E790F4BDE9FB84964166637F7EB0E909073398E5FE7EFE5419CF93721FB86CB98C0B676D7DF1FBC2B5AFCCFF00E6F7D61A9984162F5D2DD33FBF3881BDFF00FB0BF4FA547CE72A249046447DFAFEEF13D842F253C00EAF58897397AFE948C3E979F4FBC377397AFE9442910F73CFEFFEB4411EB6CDB2DA05680A590413009E713F71442A852C00C12D567EBC5E115DB594FE448CB2C81F9E5F4A216DF570F388F73094B8E179A4008511000E913CE338144604C228E09E37AF5F7DA1445BF8060888E7C8F231D873EF44677CB3325B46A5DE195C3216EA960483107D35C872FBCAA1B1D24A86F11ADA84BBDDDBEFC1A24E44D1B9420062E2A03F4C859891D2156ED867967A8E7A89888CF5D341DAA1F08F2E7821AEFA675AB59FEEF0DE74CDE71955CE7C75ABD6343BDBEADF686FB61B67300C21D72D2CB17BFB7B7C49E6D4A6C2DB5DF32D80B52722085100284679F4AECFE1ADA2254B960AB404BD2EE3B72A9882C5A86EA998DB893CB8F95BAEDB6E13D983763BA3D91C1EE5BC399BFC5EE6C2D2F1C75D6997125F7196DE278B841FCEA3CFE3CEDF8DDB72E54B24CC724506F123A720F4D78D22B6B5CE9D34A10909961F7CAA8AAD8A69DCB3F3778CF78A63F6CC214E9B7658B8094A421A484A4250385B006A3DD007D00CCD71BDBF8E189C42A606AD28294B5F53CEB7D21CE1B00508A954D00BBA9CD497356B062FC39B4639BDC7B12C4D6A6DB754941910091F08F2E5DFCEA838E1BE556A963C789E2E6E35B5225A4E0C862D42CC0587BAE6F720521807EE6DE1A714A52D2249CC9839F3FDB23CF5150A6532AC75ABB6AE78FB689AC3E0F7402E920D9854FB2F9BDA3DFC6BA3593F2CBAF3D396835CEA4244BA501B1BE7719FA6A748999787DD4821346E8697B7AC5DB85BA576CD2944E7C53D400A3A0EA0F5EA6293561C99AE1D9C06722AD9E5ABFF00422BB8E4EECD239D0FB6D28E4C5C4C3A32391E93CBE7A8F4CA3BD58307240DDA0B5989D7954B573FB3121C343A99CFAE75341C000E50000504325EA3CBF534CF14CC5ECD5E5F4C6628FBFBF8D5357249C715815715FCF0EBA3EB1B265A58BA5B98D79E7F98F2419CC65AD48ED29DB982292C193471FA61CCBD60549770C082E2CC69D2E215C26FEE9DC41E64320B5625210B293EF78B32674C8FCFCC57199F8829DA454E28B198A07700D5FF004080F5881DA1856A549503571CFBB659D7478C5FED13B2371B41B2831CC19D533B47B3AFDADEA5E68F0BDE125F6DE7405247147828502274E55ED9F81FE269782183056032902A585C020F534FB6747C7E08AB788723EA7A38A70F77B3D6378B707B7B6BBC7DD86CDED8DA5C05B86DFF000772D85494BB645368B2A03FECA6D473CC99F2AFAF5F0EB6AA369787E42C4C0A2A407AD7A8E1D1F23AF24DAB855231AB94414073BA45055CE9D5867AC6CD57A062BD05104144105104141A0274821051924FD690DFFA9812E6AD90CD8FDBBD2352A0FBA7CEDAC794BA405B0362EFD1FF0010A01F533F51C9E1A2AFDA4AD6C702CA9B8E22008CF3C8CE7F7DE9962C7CB04873EE8F5E1E6D95551294B248200701EB9D3F1EE90DD58836A4DC1085245BA14E28AB294A50546328D07330488AAA62B13B8953920A4289198B97BF3D3CD8AE65A9050ECADE20063992DE5DF83C70DFDA0308C53DA3BDA57F97DEBAB6363B6096EA2C6D41294DF2EFADA1C55D20CB6B2CBC9E268A47BA60EBAF8E7E2DF8C932F1589C31994015F4EF3B1008B3DB5FB08EF5E0AC37C8D9F2F7C0DE6AD8BB97626E6A6A1F8F18C3FB47ECDD6D87ED134AB8C47107459B9386BAD3A14E24982A43AA2326C1848098F7644D7807C73B6133B1335654F551777ADC1BF0FD523AF6CC98997BB5A8636A6552CD9B9C890CFC364366F07BFC2708B4B2BB536A7D8441282A28293920E9255C31C5AE7AD72E46DE4CA252179977229DEBCB99D62E122724A4070C33353C1F5EB5E81A2E24F1A44127976FD07EDA74A8DDA1B6538896AFAD2487A3BBD5AC09CA8D946D37FD4FFC7461EFB3B738F0B2E2A1D0A002B91999F211AFD67388AAB9C4BA94AA33DFC9CB1A3C315000D81072FCFA884D771E0E4A24C69C267FC73D7B1E74A2279A90A26D6B31F75AC69B81BF8D356E3AE55890B6BE416D27333ACEBE7039FD9A7A8C4501053C43FB670D952BC631FE3A540BB31E845F36ABC48B77A88E6077313F3F874F853A4CE71424BDD89667FD7B1091C0D281C7176E7D1BCF263128CDD254849139839120C41F879473E94A267310C4BDEB979E6DC5E194CC2906D6E4FD2943AB5B330F9BB94C6B19794FFBE733DCD3C953C13A72B1CAFC1C5FCB268A95914039DBF421F35789809F78F48EBF796524E7533879EC0390DA3F3F400E6C0D2F0D26C87FA5A9C8BE5E63D6B9C48B5700C448EBE7E7F1F873135288C40342486BB1A7BFEA1B2B0DBA93F4853DB5F327F5CE1E22ED2980788EA2674E739E5AF3CEB2B9EC7F950330259ED5E37E1AD2F0CA64920B817C9A9D19FBE6F0EDABC40000E2275D75ED964639FAEB5A0C439FE56737166AE74B65DF46EB9248219AEC452CFA57F6CFA44BB174D142409CE7F365D7B76F8D6558A2C18B1A66D72F91FD00781762B94A62E03E5FAA7A4394BC8509063EFF005F856AA9F675543D01704F17CA9701AF0D8CA5120EEA8B543547A5CF768B7EFDF425F58E6408EF20E7A9D23EF3AD8AF7EC4E4EC4B70A74ADE2C1844BC9045F3ADFDF488972E10391CA7E197DC510F100877CDBDFBF3868BBA41204191FAC511BC34710A767872F3F4FDBD28821C356E80DA78BF3738CBE7F7E7440E0355B480E1E16A8C8039F2D75FBCE32F2A23054407A9CEFE7124C36DB2C2595092999F5D2328D3EC5109B2D4ADE0A2125E84FE2BEF8C475C59A9D27878403D49FF7A7C0E9D688583EBFB6B5BCB288E368A6D5C2AE1319C8F975EBD49CB91ADB13212AC31555DAEC694CDEC4DFCAAF0B0C46EA00722B716377E197DA164A1291A09E754F520CB9C9235AF0D1C3F2E0E2958426621C3024358D3F7C757C9A310FB40EEE0EDE6EDAE1092D0BBB2BAB1BAB22278D28B7BC6DF7818132A4A2044F43578D97354896921541DBEFA6BC223664DDF514545CEF1700F7C99835ABCA32EEC86D17F37D8DC1136CD949366DDB25C7C43893628432EF11131250784822728A4B6A6D39A842920B8B67AF46E8C2199900CC0B0A502FFC41649B0A8F4CBD623B107AD6E5C5E6E2F382A519929C95E920FCAA9B331866A89726E35CEF7E5167C0615E50243F1CEBC8699E67388A6908615C4D0CE79F4FBEB1E94DD52CCE340EF4A5D9CDE85BA5A25E5C80C10121BFF217F6D5ABC2CA40721C580547398CC41E607D018EDD7518204EF29245F8335B2A55DBD1CD17004BFA40492D9FAE7E86AFC63CF01BE9F4F2E9D2B7124203311C68077B6B9C29F315C29CFAE79E7133689E06D0907213CCF53F79C69CB2ADD321D4E41A376CC598D73115DDA65E6D1201AF2341DBDB9A44F5B93A8F21D0CF3F9FD6A670B26A29A92C3D3BDFCA23A24D1A791A7AA4800D1886FC7BEF7821AB90083A0EFF00BFAD4562177702C79585FCA99C108ACC0D0CF2EB974EFD2A0D52809A565BD2B933166CF9C3A4A5CBE432D6FF00DC362E01208206533239FC39F5F86B50BB63103E5290E5D8D7CA96BF1E42D0BA50A5073BA34D7EF15B37EE5AAD2B65290858578E63DF24084441CF339CF2E432AE458C49FF0024AD2186F397B9ADF46074D4E50CF15864A812A033624DB50347B5B2D6B14D9B571892B106AF54971AC4187985A3320A5C6D4DA723AC050991EB39575EF03F88666CD5E1C15EEFD686A961F50F4AB7E1E2AD8CC227EAFA458D8703A52AF90CF568B0FD9331EBCDDA6F276F373B8A5D04E0E8B9B67F669BF10F02BF13C77777E18510930A589E0CC1F39AFAFF00F00BC668C56C0C24B54D752928497232C8BE742F71DDE394EDDC0033D4B523EA0EC5BFAF2D63AEF5F41A394C144105104144105609604E81E086C5414A206467A743A799EDDCD343FF00BC6A0FB8673F878457FC8E56FCFEA3C518498FBCE9F4914E9EA4FE217921C025E9F9311EA6D2975C75510A02644CC40EBF1FD269AE3801289CAA48FC1D783BE74021F8A25290EE6F7677A76E2CE6DC2CFDB4BF1856018D5EB64A549B37CE52238585F4E7979EBD66B98EDC9E5089CC48FA1449E878E59F0A350BC8E090662E525601DD26B424B90731AB5F83691CCCDD4356588AB17DAC712955F5F5E5CA5D5C02A2597DD6D3EF6A0C0CB58E5957CD5F8CBB4272FC47899695AB777D4C0167A1CAE6AF4E7725E3B8787E684609296C870ABD331703A8222F5C470DB7C495F895B214E2566094CC4188EBF4CA72EBE57F11E1E74F4AD6497A972795EADA67D62E586C604B7D4CCD98AB57ED61ABEB0DDFC1028173878652204690398CBEFB5719DA089D2A6299C313AB54F1274C998F08B2E17690A00A532A8EED40D634FD45B17964193040100F4E5DFEBA76EED70F2E6CE35A825F8FB2F406DCA827E562C2C0726BC7866FEDAA62354BE06C27A75F4CC0EBE7DB3E55ACF0A92B292F562C03D40ECE33F485400B5125C0A7A33F4881BC7413CA679F4FBE7977CE45665CD63987B81E4783F1D0BDA1CCB96EA029BBA9B5AFF9FBC356AF3812124E63F7D4F5F334F11345DD8E9996F5E196A61DA70E0B101DF3D32CADDC3DE8F0FDBBD0AFCCA811A93F300E59C098CFB9D69DCB98406714B17FD8B37BCDC9C28091BA05726FB5B958359A82262DAF416D2388F38CF3991C81EB3F38EA326794B3392EC4EBC49776E3DE223172B72636E8A52835F4E36E3122DDF640A8E5A139E44C67CBEE29FC99CC41C8DA9CC6AD5E1E511D324850702A323FD39E50E917C018E2CB9EB23319EA6A630F3892C72ABE5CF5F6EEF0CD72B781A116C980CA262DEFB2199E5AF78FA8CA474A939739E9F503E6071AEACCF943654B20B338399B7A7DA1637C028C100E53999F4C8C4E7D7AD0B985C392F5B7DEBEFBC64E0C285535EBA51EEF91BBF1061D377C081EF721A93FA7D6739D2693336F550A8ABF2BD7A7286D3304E480917A86B7603D4D75CA45AC440481C5A6B9E539763F31FE76F9F5B06F3ECFF7867336706074ECDCFCBD987EDE240089F8931E79447DEBCB22702CD57FF8F0C8DFF3C4086EAC00161D48A7EBAD32CE185D3E1C714BE67498CBAF79CFE7CF9C8C82E9F7DB4CF81E79292E58969DD1D6235C744E7F7E67A9FBEEBC291EB69E3015966796BE9E7E74410ED0D1CB98FB39988CBEFB9042A4418A21BA955739F97EA1CA3F30F5FA1A235F9838D32F6605FE63E9F4144642C6448F2FD4534463E6F151F7CE105B3C6A2A024E4797974D7F7E666A41697C29A3B8A9D397E6ACCD0D5734905CB0CAAD4BB77F79C79F86FF00C7D23FC7DF5AA74D40F9E684D49715E9F807C9E35130A894B8C9ABCADA583FE690A8B14DEDBBF6AECA982CB8953660825685465A183F09CAAD1B3641296C886E4DEDCDEAF7AC6AE5F526952EF97703CE30CEC4E38DD95EED1EC6A8F05C6CF3ADF829D14A17CB53878473C959F6A63B5F0CB014F6BD3DE95A178D92927871EB945E7F855B1FD3590A503C52733EFF00BDDF406A80B5FCB9C47F17E87DFB348B66CEFA64241CA84B71A574D32E791E1764FC3FC54CE1415B31622A479BE61AB4CFD0C86F8073705A90A04802201F4A9712A868321F904B5FAC60CC466A0F7ADFCE00848E533D62994D9612FA1D453D83EC504682725CEF100017CBD7D9F29063F2A2639C41C8EBAFD08EB4EB0F237D20DDD89A56BF815B31ED1018C98664E5682DD7A0313D6DCBCB4E833E8627976D2A664C90801C574EE0D087AF38690F0B9C23873D351D67F6CBE149E24356CFE6037DCBC10C9C7323973FD797A49FF5355EC49604D33FB7BFC410DD4E8EA66633F8F7FDAA2A79694559B2892D9BD2DC5A0FF2025410E6F52E5FB701C74EAD5C7233275EF33AE79C7D39552368CE2A252EE1CF50ED7ABE46F0FE54F490C7DD6F7B71B7DA85105B047AF4D4663AFD63D2ABCAD9C66FD6CF9E55604E4281D9CB5E9CB49CB1BA4920BB3035035234D49BD32CA6F04FF953E71F08F9FF00AE5580A5E0D48209494A833508ABE5E5C1AD15DC496DE21D4E7E902E336D3AF9346A6FB495CE2BBB9DE26C0EF5F034ADBB7C26FC338F968101D45EBACDAB25DE18E2090B2654401A7427E82FFD3DF8C97270D8390A9845500D7FF21DFD98A2ED8C37CCDF3A822D62416D73D1F32F947786BEDF479FE0A20828820A2082B04382350D0423E17BD20FC7BFA521F24EFEFBEA18FAD3DEB09A90492411580B64822467E7FB5390BDDDE24528CDC183DF8F0B7185659DD0C47B73F6310F7E16A6DD436616D14024E878950207FAD79C0A678D5FCC945097048CE8CE5B2357FB71877267A10BDE5B9B51BD72A458DB75875C5DECB6376DC4853AE61D74A46A724DBB8A39C4FA0F2F3E79B5F63E23132E7310C50B26A43063D4D1A85A99449E1F1D2654C4AD2183B119124B0E0E0F91E71CC7DC03CDB78662D6B700B86CB10BB45C30982E33E2DE3A10A713FDA15C8F31074135F32FE366097B3FC49893313BC42D5E635AB3EBE6CE4759D838C97330882924067EBF8E71B14E58DAB0FA2DB80C3852A4AC0050A044FBB9004A4644472CC579A76A6D5C2CC2A925237AA0D85EDF7BDEC0DA2D322715A4A81293902F6B56D434A5BCC45388336E0A9B42488033CBA7F831975CBAD4713E1DFF00B8952E58649ABB55BDFE844CE0D730A52B529DC9601C677FCB77D31BE3764A3C4A052224C73044E9F5D7302321155BC4E1E4EC452BE724109D450BD0655AF0D38C5C301342C01F507FF769970D39B73118DEF1F0CAD6D282894C024091FEB9FE99CD53F1B8A463310664A1BA1CB3160CC464387BB0B4C895BE9DE01C3E59F3E16CF567310370AE324E639E7E83989E5FA69AA2896A772483AD7D93E50F25C95381666636B0AFBCF867185B738894A81132333EA0F7FA75269E4A965C1736CED5CF3BD80FD987F2A5D1B93D7304DB8BF68593C7FDC72E93CFB7CFF6A7299643D546B93FBF5F387E84B07D4797BE9A4485BDC708824FBA3B9D7D7EFAD2C990A507DF23AF5D38F11D1A22717277E61666B55F83D439F489469D2B88240E84FEDE5CF97C9E4A429000FE4033387CEB71AFBBC46AF0E6AC017D0575191BEB0F1B5AE75240EE7FCF4F49EC2A4A4952581CF9BB072D7F2CBD192F0C5D8BA6DAD7DD0F0C8E92F6EA591AFC7FC6911D27D2A5252C30A87A3D6FC03D6D4B521AAE42F7EC00193776B663B8BC39257248574CA4FCFCBCE7E94AB2D44AFD1DC9D7A37EF285D32C0480454660DEA2FE74ED0B0714343F7DF38AD0DAC08CC1F7F68D572C2ACC3EDCA86164DCAC0E73D79FD72F81D3CE912B50140E732F5EE7EDFDE9FE383763CCFE0085917BC3C8F2FBC8E83CBBF334899DBAC2C43BEB93035D350D784578601CD0835A0FD71E10F5ABB42D299E2988D3A73CF954DE17100A035F314278BD7D1A9D622E761F754D501DDCB8BE56BB5FA457E1970FBAA10399C819FD75FB9A72678D5BB76BFEF8C246436BE9DA9F8891B76F85213AA87EBD33FF005F183FC814FBB57CC7BBBC24A400D56E7D7417A5A251A64902018E53E7F4CFB0AC89FA8FD757D783C375CC4A417E36FB711083EDA90E28149F203B0CBA65F79E547CF72CCDCF2E758899D8D42565390D6F09FE2380C9428913901E87AF5A772D3BE01D74CB57F7EA23418C41661424F1FBFE383C02E02D51C0A493FF006FF5DBA7952FFE31DD7ABE999F2BB369F78748585B0B12F7B7DE1DA1A52E22339F9524A94437DF3E4C215DD6FE4F5B337DFDFD9EA1809480A20913A41E87FD7FB9DD58A4A257CB2EC5DC5B577EF91A68623E7255BCC0B0F798E87DD28586D133FA75EB3CB9F2390CAA1BE519B38A85002087676E2C3FA2337AEA90C039248776F2A97CF3F21482CA6CAE8DEDC00BB27213E1A3374920A678498804C933A0F302D3B3D69414A480C5C16C88033073CEFD291A4D5AD52CA65969818825DEEFE63B738D24DBEDB9C0377DED43B33835F3FC09DE2FE2835C0A486D2AC3ED429297E620CA804EB988E8697C66CF998B973264B49284B6F100D09B7986AF28565624EE21DC29EC431A5E9CF8756AC6D25DAD0D043AEBAD2D4E0E24A50A95709CD32239A4F7CF9F3AE678FD913118A2681CB90470CACCFDEDC4C5A701894996135B0EAEECD5A8EFC018669BA64F17BA470827DE033D7439CFE952182C27CB29DE5001AE4B00D6AE9A30E62D12C10660040234CAF47D1B5D3BC3138A32501C436EAE54470240E210634FBEF15253664B427743161C0F2AFBE1902A9C028D4A9406AEDD731D61C33749791C7E1B8D8E8E260EBDA6A0F138A4A7FDAEC6C050F0B5ADF624C36560940D161455672EC03D7AFBA449D9BA16522149CF22AD3C869DFCB4D69FE071682907779BF17FCF688D9F832164A957B36A19F5A56F9F289F69D6DB4F115A4F380738CE7EB91F954F4B99BC90ADD773A39F57F7C5A18AA510696199B7714FDEB0E53C2FB7E236EA013AB64FF504728F4FF3AD23889732623E942BE907CDAE2BA5883CA90D953128594281E7979B7BEACD16D393EF24A0680AF248D39E9F7D6ABB8AC36254584A5B1E05AE19F8D3B5612389402DBC003627D7FB0DE6611530A0A212B43875F70CE7AFCB9C7A659D456270D8A5A0A132261CA8836CEFC1AE7CE3230867B4C133753715A7076E5E9788FB9429912E10913A9C819E7E9CFA4D55A7EC4C74C98E30F38392EE93577B8A802DE54021CA6589742B0C9E3A59A9EF9C38B6426E5A406DD6C83202A72272E7E9EBF0A5E56C6C52505270D3778D2893DB8BFBAC213E724024AC07C89146D3A8725F95E2EDC1F09750B0A2EB5CA73EDF64FAC9CAA2B1DE1BC7E20B891343116496350CD42F5D7FA82C4E20027EA0A73FED6D5A96D4D3FB8B6F7C1BBFB4DB6D8AC5B087956A0AAD977AE2EE2238AC10AB96F8091AF13606712623335DEBE11A71FB1F13864CC9733712B41208E233CA95D32A8885C60F99254776956A57335B90CD901DE3A7F5FA248F3641441051041441051041441056ABFE27A7A882193EDA65797FC8524C8FFAC1EBD7A7AC9A6337FDCFC3D4379460F0152439FCDB2E3C9A22311B5172EA6DD79B2FB2FB6E03D16D9466398F7B3EB4CA700A95301762936E51906BC88E5F9F28E4818DCFFB4D6D5EC662292D605B7EF32BC1D6E7BACA1766C179DF0C9F7412E2B329933A8D4D7CFDF8EDE145E336962B13B942546D900C2BC29C9BB751F0F4E57F8682972D47009CDF96B4A5D9E3688DC5AA516CDA96953B61C456B541E20F105B20F4E129D7B467957CF4F15ECF3B3F1CBFA4277546ACCF5E6E5AEDA5EF5B8E1674C04925442B22FCA9CD8BB80DAC33B94A16F39CD27848F513F0A4F66ED02256EEF55B95B8BFA16D22CF849E7752924B55B2A1E2EFF63DA2C8DA048085102241FBFDFAD527C5A83890B533F27AF17B39E5578B161B1664EEDCE64E57D491E6F4D2310DF31C6FAD406A731969DF239CF49CFBD50F0F8764B171C7F5EFD04742D9988F99870ADE3567626E5B566A56E395A229CB52675075CF2F49EF3F5CA9F210ED635A119717A3F5E59C4BA660480A772FC185756FBF0A0864A678544427D7A67D2453C9729DB2CEF7A57D294E5AC3B97352D40C0B683576D7CA29F0BB27EFD29EA25B5198E65ADE97872165550A3DFDFE22B4359E83D34F5CA94F9645037BE548673D637D8DC69C75B57FACA262DDACB4F86BCF4D7F7D4F3A70843007B7ABFBF5864B5B3EA7ECD7AC390214B1D08D3D69CA406043977A8A80C7EEDEA1E192CBA8D5F4CF2896B6E5F7FF006A7D2D0C904DEEC3BD61AAD63789A97F76C9EF0F29E243243FBAC60170F0526BFE47DE519829B1A13CCC1053199FCD5CE0855B742541249044E7CB49FDBE039E54B4B9E515A002F5AF419817BEBD5BCD92958AD40A8D47937189961C491131FBCF5D233CFF004A9097377F3A6751A52BD3CE2371092806AED6E00E67ED6E222E9B0B42EB285C4CF4E601EBDE239FEF272249981296724D1F2A9AF3FC1C8C40E2715B856E5865ABB726157AF9C4FB162604A7A1CA472063D7EA7BD490C0934DD069907CB835B5D2B77020E763807482EEED50E2AEEE69C69AD844B23096D684AD60151C8F5CB9E79FC63BE7AC7CD93F2E69435F30DA3B7E3AB06110F366898B726996ACCFE8CE7AF086AE60CCE5EEF6E5D27D0CE5FEAA5B0E96003529EA6BF9E3485253D1C9AB9ABE9FA7885B8C3421F52909F76004C0EDDE7A7CE9FABE9431CDF7BD6E3366F3D22770F301483C18EB9559BBB79C3450F0647965988C867F4E9CA34A8A9F340A02ECE031AE4FCABF7BBC48865243D7F3CFEFA455E3712667D0647EFCBA9E548FC9F992CCC203F70C3BDC7A738653D20ABE9CB8BDDB9FB162EF0D9C741CB2806013A1FDF4A889D3C492524B35F76FF8E57A563544A2A06EFD5AFC32D7A5A1CB0B6EE91E0A9400642811944AA639E7C8C771CAAC9B1569C64C4246EDEB93B8E635E3530AAE40975DD2EB66A529D01CB8C7CC77F14CDF9E27BB9F69CD81BFC2EFD617B118B205CF86E194B589AEDD242A22006E467CA7B477DF0B786938FC0E2F086582B9E84AA5AC8000DC054412C58E90EA5ECDF981134A084E8433F3C9DED51C23BADBABDAAB6DE8EEBB65F783865DA2E19C470AB452836BE21E236C32873249227881273D7BEBC3FC73B226ECBDA139003142883A79778929527E54C1282482681EC5B4E2332D4E4F192090EE182E90402252AD44C1E13D3420FC338AE4D8EDB0AC3120120A6843BBE4FABBE5DA26A44D32D5BAA72E29720357F41B37B88696D6A9504BCB2A434A909520C75060F98EF9FC9BE0B6A2B1AB4A12B2497CC16E9E553D21CCDC6EE4B2CA049B05337170F4F2B4480B1B8B53F8AB4745C253EF78774A2B4FC04F5F98EE2BA1ECAF0CCEDA094CC082ACD88705CE74EFAE4E5A20B15B551BAA4EF096A3729A372CABDCD6E6E9BFB5FB376AD78B8E5F5AE10FA5243BC4EA18B64C12014851CA4013AC98EF13E9F066293382132949723F8A481E9C34E4F1569BB6D3281419AA5EE9242965D44939B73A35338B77FF0077B77CD2D4D5AE28DE3CE03019C1DE6AE5E39CC7083A9CC0D64D744D85F0FB153F70190A24B0FE3DB9F3E111D37C409208DF14ADF5D756FB5ACD01886F796BB95A3677775BC3BB7CF086DDFE55C76AB3191050734FCA39E75D5F66FC1D9D88097C37F201C14126B6A31A0EA5A910F88DBE92A7DF0791C8D296CFECD488C5ED17B4A6D09E1C03774FDB30ACD0717C2AE90424E93C32272CFAE7356D93FF004FD3310949FF0012EC7F8137E9D9C6778889DE25912D442E72535A396B86A9A5BD9AD5EA775DED7F8BDAA2FD8676570E75F9E2B47137CD38D41812D819150CC6798AB76CFF00FA6DC2CC94F370690B0CE4A0022D67193B75B8A3B997E324225309A9292285DC16E2F51D351530DEDBD987DAF76956538A6D36CCE1ED4C7B9777AD40503966201D34D7AD3FFF00D9AB03BC01C1CB482D532C7FFAD5C3F5F26589F1B2508514ACAC8FF6A4BBF4773C47DC45FF0084FB126FC5BB768DDEF0E2E332E0B3C56E3F0F9CC16E53232D7F5CAB63FF004CF8100B616496ABEE25B90FA6BA655D33819BE37132BBD3522B42C08D2E696B5ACF998BBED7D8EB7CCC883BC6BA911A628FE79C83F9479721DF5AC7FECD18225BFC29433ACB19016A1AE79E5C1E317E2E249AA8825EFF0082CFF9EA6D6C4BD8B77DF89626F0777A37EDD884F86EB2318B808536EA7856387860852499D35E82ACBB13FE9B64C85A66A30B2928490412802D95B80FC55A1F7FEAC4AB0E874CC515BD80B87BFEB9DDE3AFB5EEA8E530510414410510414410510415AAFF0089E9EA2086B7124122252329EFF3FBF8B19BFEEE9F682231C5388B76C28053CA2785799004F3233CC72E94CE6BEE299AC6FEF568C8B87D6388FF00C52F7ABB3BBBEDAADD6B96AC5D39B6CBBDBAFC2BD6012432D8758FC42AE543FA890599E18E8794D79B3E2CE1B0AAC3CFDF03E66EA892C1F5CF4E9D5ABD9FC15B2E6E2704A9CC0C93BBF281077854EF026D5398E7AC65CDDEEF16C36EB6630CC6F0AB8FC4A95676DFCCD09585B81C4B484E406842C2B881CC19915F2DBE2761D29C7CF12C06DF351C4D45299E95BE51D065EC6DD5268F7BDEADE7622DADAD95FF009EB0D5B25F752E7094E6A104242722147411967AEA7ACF32D9B2267D34AB9CAEFF006F47B189991B294E027701A3839F6E3EB5D22C8C476B306C41F559DBDD34B7F4E04AD255C51A44833F18D09A4F6CE0B7904A810C0966A1FC37BD625E46CC57FBC2695041E5ED985E2DFB9B55A417142352126263B8E91A76D73C8D2578620B252284D142A75B8E00F23163C12C4A40402C2C374D388ABF0AFB10E4B6E15240854C72CF3F972EDCAB797870186EF30453830E1C1F8C49A2752A5F997E3C85EDAD6193D6F0E2840032D4769FAF96BE74F65C9DE4D1249A01981CE8DC8F387889E08A966E37AB52A1FA7F690B73CF847A034E938726C03EA5DCF973B08748C4351C97CEA416D0B8E7A7185516AB1052011DB9FEB97C8D60CB656E903B38AFE5B85A109CB04EF6F73D5FA72F6D4906D250334EBD35C8E91918EDDB48AD9282E1D8F0BBFBA43652BE92A0687337E9E77E25E160C29C25620054403AE5391D3CA9FC990017501C9A834CAFD290C674DDD0C286CD9BF11A0D3D6D0F5A49447167D87AF5E84D3A4A2B5AE9FD4332B2471CCFA43D4A4A9214220FC72CAB785E5AC04805DF5EBDE91413026915FF0023D3D042D14F18EFF7EB4D8DF3772FDF2820E34F7A6333F9AB9C10DCAD5F886D0028F8AA30672000CF8BA65E9F11496EA8AC685CDE9419F514EF1B9004B51A029A134715F3D22E8B0B65BE0F014FBA7324E5EF699F3FBCF5A90C2A14A50487617239BF60F5EED15ADA53D32D248CC540671CE8733195306C25E6EC99E25227DE397427AC7FAEA60D5BF67CA2C97A91600D07EDC76D68DCFB1D8F24AAAD90E19BB7A718B81AB55208E2E123E711967AEBF4AB3C99296714D5A9A8F36AD44434CC4A8B3E6ECC752097FEA1E1B67D49050501267224E711F7CB954262E48FF20B00C097A0CC163E8FAD6B09A66282805D9D8101F5CEFA72CE18BCCBC38812920EB1DF58F2E7D0C75C95932E9A6BAE7EB125266924390C2D50F415E86D119728096CF101C40667D632CA7BF3F5ADB10B094901ECFE97E0C6BC0F0892933095259C02406B5BCF5E5C1A2CEC4042A412069976C81D33F3FD0D5771130826CCF400D6FAB53A69C226654C06854406E9C8F319D43C44A6FDA6DF6AC940F88E85A92A3F97DC049063AC65F5D6A730E12AC0B9DD7637A9E47953D3842CB93BDF58766CBA926AE7DB5EED98C41ABB75E690140B0A09254323248047C33D34AE6FB5E62C4F5A52400F91625EFDAA2D47AC3B9528001D2406CDB4A75CBD28C621F1EC64E03678BE24B2536F8759BCF5C70FE672195AD01BD24A4A7DE274F4136AF07625B132C2D4FF005076342E685FB6BC8343D421139280DF5289DD24000006B5C9DB99CB26F8AAF6EBDB4BCDF06FFF007838A9755F84FC420308B852BC40BB36D4942923300F1B6082328AF6EF808C8FF1E4AD4582836F5890C7798926E07763589D932E504EEB0A52845D801CEB7CEBD23B37FC15F7CB8CED86E6AFB777B417EAB9BBD902B656971D52816EEAE1D2C8682C9221B48072E523491CE7E29EC1C2E2B6962276113FE8A80202D8A8A825CBF026C29C4B52313E5032BE61037D2A0CC03873EFD873D8B6AE1413738580A0A6D633232214A2A11A99EC34AF17F8B3654CC3CE58DD206F1A686D53AFEAF0AAE58090B60481FEDCF5D1EE6BDE13C5EFF196703C51BC0ACDBFE6584301C4A31042BC2BB2B495816BC32A594C7BC32CC8D75A6DE12D98B998B96ECCE9705DEB40D6D056D4269159DA139482400A21408DE4B306C89FBC6BCEEB5BDFAEFD715C4B0D5DF60BB2F6D62F29B76CD2EDC59E24B4F12802DB79CE499131911CABDE5F0D7C2523132646F212B2424071C017ADB3E0383C5036BE38E1A5AE62C929059DEBF51005C9CF8E71B8BB27EC2FB3B89B76F8A6D9ED7ED1E297AE2C9B9B07AF90F5982930021A7133C2A2339D743AD7A67667C1D938D08C40908292C689B934E3C3DB18E6BB4F6EA913968485D0515FED2E1D835CD6B9BD2367765FD99F74DB1CEB16D866C761EBB929917AED833C4484CCA9C0264E7399931D44753D83F086448521F0EE035D2185726D397EABE76F621614B52D2056809DE1C6ED52FC79659CF0CD8AC0B0D65B0C61564D38DE9E1B290948E5A0CBD79FC2BAEEC9F0260F0A9015252E007DE48C8532E178869DB56729759C5292ECCAC83BB87B7AF089D18724A4B72584447F408491D00D3BFA73AB6C9D818294001290198064836CEDAE54D4B988C9BB4C12CA56F914FA9CF5D32C8D3BC7AC614CDBA83BE33CEA89FF00F6AA67CC67E5FEE2909B83968594CA410336D45AB972FC42C3173152C268126A00C859868E21FA909223810465A8F39E823427CA915E1C9AFCB7A55DB203ABD3DB984CAD4EE951A8ABFA694EBCE17693C08E1002626001909E9FA8EB5812D219D0464E406A6B7E9AF184D454413FEE3ECFBBF584D4DB866081D3F5FB3D7E3B7CB4A88FA7300903234A9E3DE19AA54D2E778EE8AB3B1A7BA65DA18BD64B716D289013EF78C53F98FF00D6391E433E5E662D1853265482C9A32775C060D77F366D7842D2F18A928092E487A1B8E219D896E55346789EA46310510414410510414410510415AAFF0089E9EA2086970471251FF79F8A472FBFDA98CDFF00774F3682239E50532FCC715BB657DC0009FF007F6299CD2D2D674493025DC3B5C5B9F1EC3F6C3807BCFDDF2F7D7EDB7B518DE3A97719D98D83532D7F2CB9FEBD9B6AC4AC4B40B6CAA5293E280A3FF909D419F137C6AF14A70B8AC4614AC823783386B1D1ECCDFBBFA3FC1189972363CB4B805AD402EE4906ADA64FA3455B57BA8DE46C0E23885C6EA4AD9B7B3522E1581A83C1A7D025C0D22D99038E402003919F8FCF2F1763063F1F34BEF6F2CD2F57A357F74ABB45E13B430CC085A083BC1DC528D4E2FC5FCDA9D99DA9F69EDF0D862F82DC6C4B7B1F6CD2516E9BD770FBBB274F00285B8870120F1147171644C8275AD363EC733A585897401E81AF9FE6BA662A61F68E0F07BA9993F794B2774CD507357A13CF2E91963769B92C6B6230C38A6D3631758AE36A70AD4871F53CDA55E21C805C2C08239CF789A8BF116004996BB16A65462D7C9BBDE8F58954ED992A2109A519E8C5C6473F224114CCE60BF4BAEDBF1BE84B6E70C14A072190813398D67227E7CC66A01986F760070A6638E5911AC3DC34E48427754A50A9BBD0F1B3D6E3F5169B6D7F54C8124E51209D7A99EC738AD928208FA41E14CE9FBA7AC3D97354A2EF50C5BF23B7A8872F5B4AC98D6232FD60FDCD3F9325C5807A923ADF2F7CE1E89EC5BEAB5C56B736FB0A425F85EDF2FF00FE4D3912C3B96E82ADCF28792E6D01766C9DAE3C8F0CA1C22D55C2397CBA763D64F4D05349D2885BD0699655E7DBAC60CC4851049232A8CEF7F64E96854DA280399F847E95B4B95BA5CDF2ABB72F7A9A420B9A6C1BA1F5D7CA1C36C10800EA3969FA7ED34F522828C746FB4315A8B924BF2FEFEF48AFC0EFF3FF0014E25A094824004703EACFFA221BAA687D1AD7CF979D042C84F0A427A4FCC93492BF91F7943D45520FBBC375FE53E9F514DD7FC8F4F410EA11A6CAB9E67D608298CCFE6AE704327314B4B7B945B38A48B8585A5906388983300E663B4763AC4961F0A66201670D76E26E5A8789A0E2F0DF133D32D0A1BC58EA6EDC3EF78BDB656DEE4DAB9E28595A9692041260AC11944E635CE0F6A929185DD50200BE966C8356C598B5E968E79B6B68B0500482C43F77E347A072285DE33BDAB45AB76904442465A119099F53CAA7E47D1BA416CB466B79DF2ED1CF66628AE6106A4A9989E3ECD4085C9813F2EB53327115634D06BC2F56A97F4891932B7C0DE0FA021FEFC3830B887CDE6CA08C8906077EBF1FD32A6F352262C9157B51F953BBE9084E64CD2906CC468EC096F271CF488EB911247F8CE073EA273D73ED584A08A873AB0A67F91ECD1590B3BD514E1AB54FBEB10576725CCC4465CC41FBF3F8534C67D20BE6E3D07A889A90BAA493FC5E838EBC05F5AC59D7C499E433CB94683D4E507FD554B1AA62483C4D6C497FC8112B2945D24D5CD46B58C15BD0DA74ECA2B09BF52F8038E96A6624BAE25B83A4FE61CF3CA7954A61B1891830924D4103880F56B0CF21CE2D9819489B2DF7492DD32F315B74317BE1CEA5B63F1474B86EDDD0A3FF009A52AD4CEB320E939F9543694933662940E74E3C0F4C83D21499282544E45DBD1D9BB5F5E30AE2CCE138D377982E22A5A19C4592CB8B948042D0A4E5C4623DE396B9EBD5DEC7C47F87392B3A82E2F43ADFBD7BC3254D9921237777792E6BCEC39DFDB8E72ED4FF000B7DD16D66D5E298E0B92A77135ADD5A7899D5695183EE480788EB333A4E55DF7C39E3C184972E509E400000EAA076167F4FC46A36B848DE2EE0B1029997A598D6B9000B0CF9AF87DCE0DFC3CBDA9B6B764307BA2F6178F5CE18866C50B4A8FBACA4A816925293EF3B23203E157FC76D71B63672B1213F313291F5CC4FD5FC9DB78F90CF3E1166D9D3938C9414A3F4AC58B034D327AEA03738EEA6C5ED939B7F81E17B476166BB4188B2DB854A6FC39F7539C82275D395797BC6EA94A9D34B3073609A5E8CDA9BF7687DF291293BA15605B78FD5516EC4339E7AC648462372D5E165F6C2DCB64A4359122EBC44C2C1FF00BF00C8467E99554BC398E9585C6CB4A887DFC9812E68EF5A7BA44162F0895A14B4A4B170C4684D40B7DAFCA2C3C69FC736336A6C76D764AD0B4FA9D4AB14B1610A090D88412A691D51C4A12635F4F6CFC39F1961F0A8C3A77C02371AAD987E15FD8E341DA9B344D1312B4A54820D161C1BB16ABB1AE7C23A61BACDBAC076FF006558C5F0FB86BF98786D0BAB60B4788DBC984AC29092482A5856A79F6AFA6BF0CB6B6CFDA1B0A4E20EE1514A5CD08AB371CB36B5737E09E20913B0D8F3200795F5329AA033B1C8B74A335A336D9BD70F34D2DC6D293C2A0490414F0E4338E63EB1CABADE1E7618A3E86049B00199FD05FA031569A908DE0E09241BD6EFF9F6D1236E14B68294482641CF9490397A7CBAD3933124FD3514B446E2012694F633E3F68F1693A491DFAFDF9D369AB510C0916B58DB8D5B8F7A088E54B2E6BDCD7D214524FBA00CE0FE9D7CE95972D3BA3786F1D4D49CBD479F3894C3CC9611BAA351976E514F0A872FD7E95BFCB47FC476873F32528DEBCC57B9F48F0156A01E9A4E9F1158F952BFE09EC232F2FF00E447323ECF154AFF00F2F851F265FF00C13DA31FE987216FA073F7A7A47A41E11A73264FAE7F1E7CFC8D44E30CF4129964849B0141C853AFA110D664A04BB528F4A060D4E3CF5EEF2A4A330510414410510414410525F346F6EB1F7F76AE9C608F098127956E7EA4D33D79C10CEE13EFB5713EE3721439FBD9081E7AD359B294C585FECDEFD3382216F3FA0CE30EA892916370E003586EDD6A503DF281DFA5466255BB2A627FDC50BF43D2364075241B150B73A5FA472A372F7D69B4DBC6DEB5F1B0368CDDDEDA072F52D06EEDD368B7529F19CCF8A0A21327F29AF9A7F1E70B8A9FB7F13B8B213BCA60E6943F7D28C23B278713393B39265A8540606BDC7B6EE23653F9433785CC58B858B8414A0149E12E04C2071E5272034823977F1C6D0C1CC93882B9877B7555AB9BF2D687ED5116057CD9450877DE04B582732696E022B76C2F1A2A53178F31C6078ADB4E292DA80038613CF5939913234322CFB276C48C3C912E83E96233F3CE9CEB1B842A784AD602CCB3F4BD59E9467FC660BC327180E366DEE5A696D907FADC32F4F33C46739D7CB2CE6AB5E23DA32F13F3371218D2D4E24B52A6BD75787A84E2490A0B395892C45079675CE8E231DE3584C3AEB76EB25B0014970FBFEA4469CB98CAB9FA702A9BF586152C34737E072EF170D9B8A526484CC724D88A695E009F6CF161BB62E5BB854E70100C426675331D065AF6D7232A0C0947D4A0EF974C9FA92FCB48B0C89A16414921C3DF81197BD0985525B500A854C4729ED9F91F2F9D2BF2CA064C3BFA0896952C901414F7BD7CC73FB410DF43F015B25612DF4B9AD6872A3FB685144A033960D416E0D685836952530400064244FAE46905CBDE53D1858396F4B7B31877ABBF1850201D483E46B2943172DC2355390C3AF28A0A903224C8D634F4A581000A026BCC0E3EED0D56EFBB964D9B7AFF0051E05A39854FA476EFE797A56E2790C1879F330D57FC8FBC8452563903EBF7F7D4F30A029D4FA7E3FBAC494921494A7302BD3DF0786EB39475FD08A67301770D5D780FEBCE1E478D34B796A6D00929FCC6321D3BE7A691396B48250A5D69535FBFB2D094D9A9942B736E9091212EA9B70F841295A94E2F242781254428F2240CBAD653B3A64D5E75209ECE40FBD435E9947CDDA6896EE199DDC76ABF38C0EC398C6DBEF430C6B016DD461D83DC2C5EBCE85062E02C40F00A642A083C53CF95593058612E504AB87F63234198B1BC57F1FB553312A4A6EC5B8532AD33BDB578DFCC330765BBA60A4250D969B0B6FF00B8A92D804C72958273C8EB5226407253FEE6F629EEA1A2878D54C9B2D4564935B59AADD80BD2FC22EB7D3C2E148C8240CBD3CFE3D6B7F94B0C1A9CC96D32310B2B045453343DF4D0DF23EF330CDC4A95319CC46B94452E994A4B39A6A1C1CF3FEA9133280400E0E6F4AE62D7E3D6251949F051A640CE7D634EFF00AD3A4495302492F9BD8E61EFDB5BC47CF46F4D2CE0EA3F35D1A22EE96912241CE08E7E9A1E5DBB8AC4C589798A3DAB6D2DF885A4A0A540105DDED4D0FEBF316FE26F22D98F19638D2B07DD466A11AFD75EFCB2150D8C9A54F50F561E879BD4F0CA25A44B24A83170DC882F6D695CAD163DE5EB0B4832532600244F2898F2922797C6A78B49528872378DEA1AA0E6FD386994BCA410AA82D421813A9FDE87AC692FB5D6309B6B5D8EC259722F716BF49B6208E1E162ED953BC4467F9721DFD6A5A5ECF9A8C1266BFD206F1BEB47A53339DAE22E1B2E7265A260291F500C4F3B3836AF1ED7D9CB6291B3D67C4485B56160544FE551F05A2634E608131CA44D57A74C0B5996DF55452F9BDEBD472AC667ACB9600825C11C6AD9674666A56977C87DBBA6987FC2B6E063842CAC0F155C442473839CFA18D4D4263F19FE1B38600936626BAB0F5883C4052D4A3BC72A3D052B5BE7179A509C3D1F8F425A9F08AF879A5294492A19408CFCA62622A5BC3A9C5EDA9D2E561D4A495AC0A920D1474A1E5F7262255226294523799E86AD7CB857EDC63E5EFDA3C6C46F5FF8945ED85EE2B6D8B2EC6E6DD6EE1D66FB6FF82A670F4AC05347F292519E998E5AD7AE767F85B6DECDF074C33004C9C4CB054B5056F9DC538DD2455B3AD8D23A6F86B66A9787960A8EF245413624D7F5C4E423B41BB6DB1699B3C2F67B09B54DAE1F66C8650852381D012809C827DDD4035E5CF14E07153F18BC3209DE2A50705EDD6BD1F37D22E6BD82B9725539442830B9A8F20039EF6AD4C677B5C4829696C32EDCDF5AC96148405FFC827FAA75809C81D469558C2F84B6A22709A12B2C527783B1AEB99B695B88A76D532F09BC4A9225A87D6972E96A3A45B8FA69101B49BD4D8FD8FB7B9736871EC159C5EE9050BC29DB96D372A1051C0D30A3C45C283A7581CB2EEBE0AF0F6DB9D3244B419C3EA43BEF80CE3B5BD961144C5E3B0B30A93BC9176B3D439E6DD48A868CE9EC4EB6F1BC4F69F15C2ADF11B7C06F956EBC351788E148238FC75003DCE1528CA4A41F7609D32FAB9F077C37B5A4786B0C95CC50225A6E540D783717E46D48F3C78BF1D286D198037F22CCCF6A9D0F2E1DFA34DBF72B7D564D16C2D9FF00954660A48900467200CC4448E46BBB60F6763E4801531AC6E69C81D5F818A42A74A24CC6249C95566D07EF3E7170DB0FE8A40293DF3826615D32E9F3AB14842D29014A7A5483FD9075FDC339877944DC7BA7BF48A94839E52272E7F2D69D5086207322BEFA43428AEF1079353957EE6F09A9B5932263A67972D07DE758750A034CAA47D8FDB8C26A94A2CA49DD15BD6F971B7B68F381CEA7E7FA8AC12B218100EA493E4C2309973011F50E4CCFE515065CFF00B01DA4FED5A7FAAEFBE1DB43F985BE5CDFF926DA9F4DD68AC36A004904FAFED434D37507A56B956DFBE7A0DC2161AA1C73FC74E3092DB5CE4091CA34F9FDF2E54B0DD23EB1BC75F67DD21CA160065024EA0DBBDFAC3BAD613828820A20828820A208299FFF0013DFFC608A57F94FA7D453A47F11D7D4C10DDF8F060F323E4AAD5740A26D422BA0AB0FEA088CBB48B8B7C4D09125766F3601E7C6C2D1CB3F4F4EF5078D6DC5EBB8AFFF0012CF96BFD46E8A282B20473D3EF1CA8DD0DE59E13BDBDEEEEFDC4A2DF11B7BCC3DCB79012A712FA9CB85708D4FBAAD3FC47CF8F8D5289DAF8A2C1DD437855A86E74B3DF9D5E3AF787676EE0E4AB7C2420170F7E0D9FE6F48D9FB860F8E70F6D6129414124640C00A39F3333023ACE75E2BF10A77710B0E5B7A9A71E8DC6EEF16613F7C024558DF3F3152CD5E54115DEAC2565214141294891D426398D41CA399A819001994766CC039676D21C61C28252E0877B86A0A0FB7BBC03EEE7CBD3C865D796BA79CD36C7C8242980AB3B7953B0D29D21F4B99B94670E3B67EBA18B5F1148515AB2931A73119F7190F5F9D454A4196189001B83F6D6BFD44EE08EF252470BE57B83CC748C7F89B79AA67231979E7D7282477CF9450A5B549059D865D3F35C9E2D582965C51EDA3369E62FD2AF10215C038721CF3D73F514D262C176CDBC9AFDA2C9291F487A0F3E0DD83BC7BE2F74FDFAFD29AAD443005B3FEFDFDA139D2CD58B92DEA3200E86154BC024684E73198D7CC7D4FA51F30015F2B7AC611299357A7DCFE72FDB2A1D498EFE5FBD67E624D8BF01EDBCE02821CD0B778A090492343FB50169363D7286A45C5473A18F2B1F3124EAD9D0B79BC325214E49CF32EFE9053C97FFBB3D3FF00C8C3E904248245DEDD7DF48A1424A472CE7E54CE665D7ED0F45B2E968AADB1145ADF3768B489BC0BE124681A4C9CE39FAE47B56924172055FD06776FC5DDA23B184298B91B8ECD6CBBDDF3AF9E2FDEAED03F68DE178261DC49C476A9C5B36A10616916EE252EC419CD249C8491153F8697BC037F2B8E44E7F76F3CAAF8D55C062C1CBD45BB0F75148D98DCF6C261BB2781DB317ECB6AC64341DB979491E2294FFF005132A2388C255913A659F3A9995242432DE80114CEF6BE74ADDB8C5231F8A593FE92D3BA4B1292F66703B7AF33911A65E17EE3A82434954889394738E63C84F5D2B64A4A560D48EE0303964F0899E160214A0C457B5DD87BA50DA57C5F18970EA7231D801FA67DE69625CBFA70A46A1625A025352E74A76FC7482B216406A7BEB07CF660C4BBD5BD6B0A17B81A827A83DBA4651A7C7CE905E328500B3676E2D99BF3CA3225A96A7E447137AFAF017881BBB9009EA0664F7FA93DB4A6D327EF87D6E33A65C07AE50FE46195BD7714ED5F77F4316A5D5DF8CEDC34B3EE3404011C24913D73FD35CB3A63392A99517ADCD00C8367E5CE26E4481402E68E34177A587B61164A8B2EADE79F70356ECC9E251E1481AE73CA44E83A8EB4C7FC3330871987CB3A1E397DF211232A45992546C031A353DD7D639EBBD67D7BD2F686D8ED99C39E4DC613B26F5D3976E36AE26D25E652EA388891F99394F7E75318A5093B30CB269BA7D9CA83A71BB58F0D861F29D41880D6A662E4E678F2D63720E265F09C1DA02586DA68919710690903DEE7F96464749AA061C0998A2D72A24127BD85F2ABD68F0BAB084A416372D471C0B1B0D7FB89862CDD5A5B6C2C84AC852C4C0FE99E2D07FF0058F5D4532DB98054D4D03DADCE9906EE486B58C309D8437200A97A53B37AF36A4618F6AFDFD617B8CDCC6D1EDA5E5E21ABA187BD6F66CADC016A71C42ED814A4C12429409E1E7DEBA97C27D80A5E330EADD72E0B0150C7D915A986C30DF5292A0404B17670496B393668F92CF61ADACC5778DEDABB61B778FDCE1AE5C5DDE5C3DF8ABA5137696DCB77FC3971449108238794089022BDA7E295FF0087E0ED9F8647CEDE5CB9817BDFC28437CBCCD039E56BC593646397855A92E404B3659676E22DE71DC63BEDD9BDDA63785DA5B3D8A6D1ED0E2AF3E8B4C3B0F28BB0B712AE14B686810A3F98447EE2BCD5B3FC21336C6D641F96565732859DDF8FDAA6BCE2D98AF10FCBC210A5D02490E4B0605DEB90AD5C0B3E51BB7B0DB01ED2DBEAC3ACDCB2B3B0DDC6177A125C7F1B6EEB0AC7576EB208532A48292B2D994F2823BD7A63C3FF0003A66270B295330CC5490A7523AE61F87615A479EFC5FE33960CE32A689894A98896A06A49F537E2D6A08DE0DD77B0D6EE36510DE23B6C85EDCED428216F5D6D986B11B7F189926C94E242F873FEEE5C23CBBBF817E0A4AC362251561D0374B90A486A31D3A6768E398AF16CD52D43E6292836282CB15A3B71D33D408DE9D8ED91D9ED8FC391618261587616BE1E1FC3D830965A427904A52343EB9D7AD761EC846C6C1A30B2C04A4240205A8CCD4B0FC52299B5315FE5E21530A8A80620A8FD5C4E557A1034AE917531861656E3A552E3BA9CC9D343CF29FF007532E3511191276AC96194B64C90499F333400C19DF89821C5660828820A20828820A20828820A20828820A20828820A208299FF00F13DFF00C608A57F94FA7D453A47F11D7D4C10D5F696E363848100CCF998F9C7F8AC2E893EFDEB0432B5656D25E0EA924B808CB311075E472311E95078C1F4A8FF00E25FB1B7711BA54032732A04770FE91C96DFFE0EFEE7FDA7B01DE7BEA4DB6CEED638F358938825202D8B616F6FE31C91FF0022870CC939011957883E2FEC75CFDA1889A949DD724122E19CB71CEEFD63A3F87E624E1D290A04A5810E433D2CF99D286E7439AF13DAE690966F6D1C172E3C8438A6D83C6E04BC9050A201C804AA5463313A45786FC5D81323133090D53C29506F9B7957845FB0528CD6A64F517BBB6B4391EB4312D698BB6BB76CBCE78AE11C4A5A0F124CE704F54E87A10455264A82166A58DDED4A6BA1A166BEA5AC12F04B290A20D03B35BA70E459F9452E3E8733492274931965E5E5DF9E959C4CD4A839209019870E1C58E56E158D178662000CC6BAE64FE053B3C46DE2D01044891A9FA77AAFCC50249A804D2F6E96D5B9DE25F674B526EE4351EA471D453D78463EC56E5B0B5403AAB2006599E874CF974CF4A66B5BB8D7434CBCE8C7D88BAE0124848CDBB706777E9D9E2D371E0A515007BCE5A08EFD3F51AD3598B2976C98E8F6BFE338B0A65D057CBDF4BC781C49CC4C7A7EF4D973BEA05A87F593FDFD6135A0BB38A7DF8F6CA2A0F84E59769D7EA2B099848CB3BDEE6F58DD082C069ABD5EB483F129E7A7689FA9AC85105F5B8C8C6AB946FAF6F4A43943E8E111244EBD0796BCF4D7E228DF21C814BB54F6E6619CC940925883981D1B23C7FA8582B8A72D22B50A20867AF0A7584552D2A0D6EE59B3F7D697A4BA90A2933232F3A7D256A32C9B31BB90CC7DF484012956E0C9EAF5D7AF68590952F4103A9D3E5349AFF91E9E82174CC648FA8F427DE70DAE2DD01E6545A5AAE42FFA0E04CA120C05C9D47126440D29E61653A8646C0581777A59C5002C6ADC218E296774800126FC1DDA9F739906315ED8DBB877BDBBDBF7F0DBCB8C2F0372EC2D2D34572BB96D2949483EE901C92A3D3A9AB6E0F0C9012C32CF3C83EB91E19D22A58D9AC561C824170FA8B59AD4195728DEC43F6649716871370A6580A00001292DA7802A73900E731CC015349C2950752686D72D6E05BFB0E050D0312A4A17BA8AA5C977A5DCD8000BBF1AD9A1D7E2AD30EB72B79F6DD53D9210D2829633FEE1946B947CB2A49586A12D5D1980CAED4F2E1942682564862199C91F4D43D0C37174CB5EE292B4EAA055119FBD999E9E5E54CD69081BBBB9D0D39E5E94CF8C3C4CA5101ADA9D3B01F98A17895B2464B4ACFF00D5264FD3FDD24A2C0D5A85A1CA70EADDFE2E722D7AD5E8FEEB11CE62D6EB511C7C2AFF00A28C1196597CF49E7CAA1A7A8FCC56E96395487FCD3311272708B094967A685EE323CAC6910189620A6415FE1DF753AF1368919F33DB4131972CF5D10951D4826A732D5B86E54C9F4893912536DE4EF13FC49FAB27719EBA3748B22E71A4B2E29E55B5CBA2EA652DA24B013A97C4FBA2093DC024C53996904A5F3C856D77F22F1332F0C58170929AFD428AE01AE72FEE347BDA7BDA2B05D99B17B617642E5DC576BB14429969AC2D697BF04EAB206EC3678D0005C9C8C70ABA5384A10087506704B102859DBA44BE1F0EA5201DD6A5998E41F969AE9AE2BF65CD92DAED986714C6B6E6E2DAFB6AF1A71A798BA654B7434D15A95C2E2DCF7D2B0CAC2607F703CB2A8EF10CE929C3CC4E1BE67CB0004EFDC16FA9DAD5B3338E158B361B0FFE8A42B74BFF002045D886CB2E7EB1BCED5A06169BD1FF0022932B3A12633F9F3CB21D32AA16CD56F62DDDDCB8CCF16CF874348D9694B948CA8D91D1AEDA8F289CB472E9C4ADD688525F292C273E24041FEA8580722A12131AC8D79DBA7E193325870093BAC746350EF5A3B74AC46E211BAA2EC0203A9EC7787D246AC4579B8B3C7CF67F197DA3DE4E2988609B2F82E078FB9B16DB776E62AF5BDBBC6D4786DA5D4A9653FD3E10E26655D2626BD15F06F64E156B54D24A674BDCF928240DE2AFE54B939BB539C35972945082B295124B949A370EF6C8F111C3BF62BDFBEC56E9F7DB8BE33B4ECBB74C5E38DB4E2D80DAD2C061A5B4E0794B50093A83DC1ED3E93F15EC3C462F64E0E59412890956E8DD3FEF634147AFAEA61E61B08F34AD2D5ABE82C1E9DB4D1E3B84E6F77723B578BEEEF7B1B15895A3AE6CE623E2E2B62875855C137172CA130DB64E498515711194D33F875E0E48DAF2BE74820A56090A48D5C30B39E19B35210DB52CFF0089312E2A8527E922C4350D0BD69561CE3EBAF70DB7DB3BBD5DD7ECB6D8E149B276DEF70E61B6CAF855C0AB765B655C1C2602814E647388E95EFED93B1B052364CA5AA523784B00D038602D6637BDDB998F21F8A70937098DC44942E7195BE548517624B921474766190193C671B1B1612F2D2F22E2E9700B6ABA85B2D889FE9481034F38E74EF038CC1E1E794206E92CCCC18E6DCF955ED1CFF7267CC2A25543406DD0519B5FB44FB16A8528DC84F0B8AC80E402728E67B0CFE5562F9A99B5497196B5BF9E94EF1BA8104BDFDF285822E94A2A2A401C86632CE86CF4FBC6B0ED1C7C23C4E1E2E7C3A7CE8822AA20828820A20828820A20828820A20828820A20828820A2082738CF499E5FEE993FFA963DB837EF95608A57F94FA7D453B47F11D7D4C1142085028E9FBCFD7F5A260FA6B627DF2BDFA406BFA888C52E45937E202233EC3213CBEF5F481C6D88176367AB81FB1F6AC640048700D45F9C73BBDB4ED2D76F361312B25A02AE70961DBBB479A00BCD3AC82FB6904E69E371091035903BD79EFE20EC438944E9A52080959A8B9A8BEBD2DE7D23C37210501690EA5338B545DB3B3BF5E11CF0F65CDF33BBC0D8E7303BFC4D08DE661576F5A5DE0B70E91722D98BB5B2C28B0545DCED11C7310419D32AF9FF00F10F667CA9F3CEED5D54B70007DB3716B4762D8D854B254BFA521AAAB559AFA9B10E46A1A37AEDF13FC234DDBA894A9284F10320F1912A93D02A63E51A57009D30C85900589BDC70E8ECC43C5EE56CA0A961696622FA3B56F63DAA4C3F6F1B03FBB9EB3FB18E93A475A88C663C00CFFCAF534EE78548C9D9E911989D9E12545B30F6737E163C352D0CEEB1A4F1292173DE40F3E47BC6BF4A8F4CEF9A1C1770F7C8FBCFCE34C3CADD56EF2D72B657D0708B6EEEE7C624E5FAEB98F4F4E9A655A2945D81A70378B460259041160CF6FB50535AB3E7588570FBC40D01E53D8E7D629ACD986EE082FAB9E7C88EC45A2793603DE7F77FEE2A49040D3CBA5335ACB105DDE872CBED90A40A43D6C72391841C71295904E7974E9E63CAB644D094D5C9A75A9D7BFA438972FE9059DF5E19D6AC7AC51E2A3AFD3F7A0CD0C18ADF3ADBFB8C2E580E2E74BF937BE50FD820B608D0FAF4FBED419D57AF26A767AFAC32584B97EE687BF38916F9FA7EB58F9B5BAB3AE96D3DD28346AB4328B1E795C70F385916FE2282A241E71D32D63B659E5CEA4E4A8FCB0F6604F1D399D34615AD2227ACA66001F7AA4E8FE5EED12ECDB42047088D35FD8C759EFDAB604296F91D796919F9A1850726A8F3E5CFA43830DADA538DFB88564B23212759D6331FA8EB378196EA4B338F322F9E9C75CCC30C42C1DE2145D8167E1D6E1FAEB688DDE46CCE358A6CE9C5B654B4AC52D9A2B67F371F191970F067A8E46AF78291BC90401950799CB872BC5431B38296524907EAAD82AF50D7CDFF004D1687B3EEF2AEB11BCBBD97DE45EAF0FDA4B05F8776EDD385AB65A5454A60254EFBE47860033A9F4A9A4E1C10067AB301C1F83EADC338A96310A415AE5A4AC82084A43EF7D81E2236BAFC60CA6DB6ED1DB7BF4C8297ED141D20CCCF109D3B1FA5359F204B191E4C417B64DA9EA2F785306954E482A96B96CEE169637A900FA7586D70E36C8287997D694A07BEA124822609CE6328F86794C362250756F05240B1B71A5B2BE8EEFA4C61E46F91F2D52DC64554E1974CF4A345A78862D60C13E030F29CCFFB5249F841CFBC729E42A2672909A872D42FABB06E1C866F13987D9D38B29625EE8018241721858E8796BD2CF771F75DB85F8B6E80CC8CDB49FC5360092A76623ACF20338A40E18AD214452E08AE6F7AE7601F311292F03BAEADE50B50FF001391CDC83634F26318E76BF7B3B2DB2695AEE76C30D5BADE6AC1CDF2157EA3FF00F8D2C1CCAB4CBB839D6ABC3942410A1C52FEC53F1CE1DE170D28CC2932085021E62922B4A6E9CDBC9818D42DB3DFFED66F2EFAF365761AC6EF66F0F30DDCE2D7AD2ED6F2E90B0655873CD9217971054820020999CDB297B82A1AC090EEC5BFBD72A0113F87C1209AB2C38A1A80C459F8DF5F4B4367B7236585DDA717BC69FC6B14795E2DC6217094DC62EDB84F1152DC202928049009FEC1234A6EAC60466E32B3DABA9A1E1CC5DA611874A52280301A07D1A9973EB9C6CDECCE002D50C3885A5E48193A832328F74AB4949C95AC28543ED99BBF835281350DF8772C7B985C2D2964B860EE721A71EED1950A816020EA040FA4F2F38EDDEA9FB266286281BB28DCD454737ADDF8EB0D96B01C8AB8C83935E2DC2BF731459BB76A6DCB603F0ECB6A4C5C0949826550AE51A65196B15799939909FA98060EE003D79387EBC6184E5209DF512A77649AB90294A694BF3CE354BDB797816CFEE17783B4589E1D85E35F87C21C16CF620D26E0A16B6968570A9511EF473E5E95E8CF83B881FE66180A82A4872F67F66BF686A89DBC80427E58ABA2C29C2F6A9CCBC7E7F8AC6AD1EC4F69B1A699B7C314FE2B7B9211E0B251F8C7920339E7EECC8313957BE676C74E236326629D6528428331624034CEF4B5380A43A91B4A54A3BA4849CEC32E0C18937FB18CA1B078EED65FB89D9DD85B8C7D6BB94A9C5358629654E2DB05D48692DC924A802246B9F4A6FE1190946D64A9406F6FA5FA503FA35F94436DDDAF2BFC7584B541B1A73AE7ADAE35A7DC9FF00ADBEDEEE33B8CB0D89DE760BB45636D80A9E4E1F79B40C3EDBEF876E5C59E35BB214042424A63223AD7A802D6BD98128A3A0333F2E9E4794798BC61B411326CD015F5025CBB8EBC03F4BF3FA3AE1B90095A9B4A523DCE1273026049D328F2E5CE6A387C1E326E306EEF1651AF992E0706E79E714594A41BA779F2D3AFEAD5E5258738B72D92A7014AA4E4441D48CFE15D0F052E64B94913410B6ABBEBC7AC37C5A5299CA092E29D283F70FA9EC35828820A20828820A20828820A20828820A20828820A20828820A2084CAC82440807BFDFCBE349264952DF4B9CAD953D9E461354D4A5A84FAF4E5D22A90A919FDFC694002433DB33190B72CCD0D5B205C3A24C2635EE272F3A4674E64B641CBF5EDCB90B429761FD9FCC5ABB605430B79F4E41B4924692049CBEFAF3D61F1002D254E33E341CB4F5BDE8A22592450BB8B57BD3EF1CEDDEE5EBB77846D23B6D2E855A3C5E6DDCC02D34B29E103FB721C4491974CEB8F78C76A61F766E14A7EA00A5D403BEBEEC63AF7857045587429EA5AEEFA51C69C8691F3C9B1382EF176237B1B5DED03B349B9B809C4102E70BB1F11568A61A7576CE16D94C7BC1BE252A4FE6D6BC61E3FF000C2B68AA72E4AF7492A2082CF5E0E0F91CB9F6ED838340094CC01480CE15504BD3414636CF8C759F76BBFDD97DE66048C5EDEF9BB5C4DB4368BCC22E1C422F9A7A78172C0515005614AE7EE8122457963C43E119D83F9AA54D1F4924806B716B67714E0D48BFCA969420237286C52030622EF67A65967966BB0BF37C62D945D4A512A5A33427DD98528686328EBDB3AE2BB64CEC32D49DD2589A81C59B2A8BB67E51198E9297A86166199B1CF26F748A54F38B5A97242742093323DDD3BC1D33D33A4B03895995549078821C1BBBFA8E1C618CAD9E662B7D2C00A97762723CDAF5F48A937FC1F99975644E89D667CA7BFD73152482A591603B5C53DFAD22670F8732CEE82EFF006DEB30E3A08F42FC585A5B5A02B92844465E9DBAF2CA96183F98C4A921C9600B538E7F8E01E24501207D44150CB5E747CF4A1A9BC29C4842415109EC624EBE53DA951B18ACB99A91A024E94D05C545E8748092737F4E828DDA239E5A54EAA0C8E4797E9CF2E79D466270870E482A496D0BF7E2C7979C6C9C4EE108524B3163AB0E7AE659EB68F024AB3047DFDFDE751AB9A11A77A77F5FBC6DF337FEA0925F874E3A44B5A7FC694F3060FC7E3F4AD133F7D411BADAE473B1ECDCE8D9339EAFE4A6140ECDCAFA9F7AC4FDBD9B8E890A4671A98F3D7E35272B0A66241DE009C9C3679F6D6F58899D8E4A09705C8B916C867CB56CDE24D9B752141A50E229FEE198D0739F8FC0F3A723FD3FA0924E82C5B4B3FBCDE22E6CF4CC5EFB64398A7DFDBC4DB164E2C26074EDF1D79E87A9F83B9127E62812EC0E4FE6D97A437998842695D5EC73B71A44EB5847E2994B6F04F87A029FCD139E664663EE6ADBB3F0CC52EED537771C05F3047A8887C462D0EADD249346366E0D973CF4CA5B0FC25FB058432F2CDBA89E26D6A24C7602AE5833F2C00C28D931A67C7AF18839F342CA8AB76954DA8E00F32D66A8886DABDCF6C9ED9B4FBEE34BC2311B8482EE278725B62F5C291014E3B1C4AE180019D32E74F95B424CB05252E450167EE4DF4E0CE620A64DDC5804037DE0CD7B1B79E8D7731AFD8BEEEB7A7BB8E0FF00F02DA36F1465B595706D25D3CF4A78A4001B006432F9654CA66325CC2490CF9022957CF8FBCE1F499B2D49092CE4977E3A96D1F3D2CF0C93BC3F6810FA8E3183E0570C242415E1EC5CAD0B84804A4930731E951B3D6A9B41D2ED4356E9A6B5D626B048C3211BA120977DE663772C7ADAB4D22C4DB4DE3EF70B0B182ECF30D5C807DE7ED5E08E239CFBB2489988CA39D464CC395134B9C9DB5D072A7E62CB2264B003173CF875A575A4609BDC3FDA2B6F1A8C5F17B4D9AB57894A9CC11EBAB4C40A78A21C2A904C6424E4093AEB90B4C90CAE9DAB9B1A534787416822961951EFA7BD625365BD9C7F0D709BCDA0BBB8DA0BB510A55E62AB17373275295AC4CE7F28E8698E227CBB0FB70360DA5AAFA98732E720067D19D9FB0F76D699FB08DDE6138516D2CD9B4A2D8050EB8DA7C46CE521063204E59C6550F8898E5F4D73ED5341EEB12B271728252D7CC585697B3FBD62F746CC593A80A4ADDB77844AD82105E11925C3FDC00CBA807A45442D678BE4F6F51FBA1D0C3B5E3DE8908296FA8915D2963A69DE1FB762CDB302DD2CB4C944C2191C2DC927DE8EA7F32BA9EF4DF14AFF00230EB9207D6CCD9307C81EBC223D58E44B5EE83BC2EE6A4B9B7E05B5E292587418253C33966491FEF2E5FBD5691255B3E6FCE58700BBD09E5DF40FCE1413153599DCF1605F9B59BFAB4561DB8B45A96521FB55A7FA8D89516C9109244C244E797298CE9F61F6B1DA1351874214E54002DC6E3D96CE80422B94A2E09AE47DD072D0D59E386DFC4F76F36B37A5896CEFB2DEEDF137862FB4EEBF6F8E3985BCE78762CF1377091745A254D9532A504050FCDDB2AF6E7C06F076D09F3F0B8C4A52A09295044D7293CC58B33F2E05CC5E217B8E0A9DBEDAD1DF2A519E30C7B3C7F02DDCDECCBB61B4BBCFDA6DA8C79C7FC1BC7F0655DDBDD61E5E570BAE2576EEB67DC5384C89CC124E75EF79C572B00304B4A65CE284A775144D0370AF5376D229F8EDA0B913944294D56AD752D4E36CEEE5A3B3BBA7F635F65CD91C53086F03DD2ECA5B5C58F036D5E0C12CD172E848482A79C48F79440CF2CE67AC34F0FEC49F2F1E99EACD4EE4EB9171CB4B1AC53F6CEDB2A92A00AAC4104FE38971A67668ED0EEBF63F65F66F00B5B0D99D9DC1F03B4286FC3FE5D6A8B67084C157104E473F5835E88D9C52AC2225101F75A9996CFD4EB4B51F8A6D913311326CC0A356706C2AE19F8B8CF8465F72D564A0F88B2129FCA1592A00FCD3A904476FACB6130B2652B7CA06F5C1233D1C7B073886C295214525CB6649D2CDEFCA246C82C329E3E1933F97439EB9E7D7A5389C5256775F893C87BFBE9B4F52553094E801ED0F2928460A20828820A20828820A20828820A20828820A20828820A20828821056A7CCFD694979F4FBC3399975FB4548D4F97EA2915FF13D3D442C8FE43AFA1847861D7951AC69AE5D7F4A633BFDD425DB27A37EA16171971D22D9DB04716097794C20E5E87E3E54CA60FA59A8CAB0D787B787B21492A507AFD239D5E9E75CAFA472EB7B6BBE385ED5B587AC2568C3AFFC4CD420AAD9EE09033C8C46933A19AE35E35D94162762022A012EC3425FA51A3B078627844896934219A9EFC99AB1CC8F676DA96362771B8E63BB5364C62BC18BDE5A5F5B38DF8CE94DEE2EFDB347857D0382267B682BC51F11B6EE23662E7A5256129DE176D6B43D7A5C10F1D8B63E24290900B12DC496E1AD3D6CF0E778DB8CC1300C291BC4D86DA156C762375E15CDC5AE27749B1C3AE9774525A43086C4AF3720A4CFBC40D4D795F69788317B4F12A940AD414A20DCDDED56D795ED176978BDD4B29C8206EB64DABB172386958C6569ED8988EE871CC3776BBC9C3F16B5771542B87692C9A28B171B6DB0E871376EAB3494119E9D349A9BD8FF000E311E2097F35525DEBBA524294EF402C7CFEF11B8BC4826F40ED63CCB0D5E835E51B3FB31ED35BA5C4F0AB6759DE560092EF11F0B10C559178933987532633C93CB21DEB5C7FC1FC7E16614CB90A005BE9200A3E94E361A18464ED34246EEF3330A1153F67AD5BA5232059EF9362EFC8559EDAE07700E858C41B50D01E44E4476CFE134EDA3E01DAB8376953A8F6490E43816FEBBC48C8DA2852AA439156F215FDB9D1AB78611B4985E2EB439678CBF76E3874B57D2B615063DC00C9D33E53CCD50B696CDDB382DE644EFA49228A661CAE683AB718939535332C5ECC4D0FE7F65B38BC6E6CDE5301C7AE2E186C8FCEEAB875EA488FAE5F1AA4E2B696DB90B2DF3C373671A0ADF5A01D2AF658429802951B109A90E730DF6B68F0CEDDE436DA52DBFF8842491E2F105CE706543A69A11232AC61F6963A78FF5FE6151615243EAE3CF3F485BFC32A62D4C81E37F2CC919DA245BBAEE4E9CE09F5EB0465D674A9EC2A04D00AE845F79A94CC1737E40E9AB84E10243333D8E5F625FD4F794B5B900A3B4FC01FB8FAE469DCC952A5A77814BD2BA7B6B0A528D688EC561D92A2D4670DFBAF0F4BC5E36174084EBDFD7EFAE91D05444EDA8B904849342C188D3F54AE7567AD3F1D288DE167E67F75356191AD691775921B79285989333A671CBEFA73CEA5B073D7894256A241CCD8F3AF4BF9443952852C479FBD738BB6C996C464339EFDB3FAEBD39558F06A4A4D4D465626B4ABBE9F9CA22B153164DCB0A96E56ADCD7D22E4610D04241E181F18D403E67D0FA656BC1CE09DDBDBB3FE69CB8C424D52C28FF003FAADC3BDAFAFAD651A4B320C8111AE8341A8D3F69E756191884EE9750B52CEF9BB1B574E10C56A5870778B7FB8DEAC6F415B5DBBC392B4B44919B640D73072198ED9FF98A8FC56206FBBD0DD9AB4D7AD75A50445CD2A54C04B5097E595EAF5AFB30C2EACAD710052BE132208CBB46BF0133CFA014DD3880A7751072AF4D791BEBC21CC85949FAADC457DF4AD9D9E229DC26D6DDA36E8F0804CE47501464E5DC9903ECE4CF2186F31ADC9EBE599EF4898C3E24029290ABE55CF4FBF18B2F11D9DB77D4726733DA3BEB1ACFF9CE813C1A953E95D1F537D183DD844D49C45C8DECB831D73D2B9768861B3987B29085B6D29C4CCC0067B826397A10353A963397BEAF7DBA655A5A1F2318C0024B97AFB6A37EA1B39845B2092DB423B247307EF99CB28A6335EA2A79E97CAD5CB4AB34394625D4050BEB56E373DA1839837192EA5B0907310348EA0FEC7E951F312E906A497A135D0E55E5487D2F12919E54073E601CBDBC47396FE04C1397FDA728F5CC69CBD3234CD5289C800E5AEF77CC77870310F7722C5BCF33DA235D471B8489F41F03FBF79A48A04A49530E3A9F21D6374C833485901813C9C9662C1EBEEA4C51E17FF6EF97DC5203069DA0B1299CA8814142E6D636CF31CDDA464832C0A800543D2ADED87DAF83B7FF00BD5C3774BBBAC7B1CB87026FD4CA6D70EB30522EAFEEAEC9B767F0ADC85381A75C429C23348CF235D93C05F0A4E3B112270C3B82524326CC41AFBF3610DB178C4A105EE1D99FFA1F637223497D93F702E5AE258A6F877ACDAB13DE06DCBFF8CB87AE41791B34C30B51C3D36EA7878B686EED56DA5609FEA1194F3FA23F0C7C2C3C3F8792A52370212059AC2971426FEE951C76D015FA99DFB54D39C74556D2BF0EC052022324A522070A7241CCC6691396B3975AE9B8D299D8B0B4DB53A5AEFAEAF9DF3A76D09E263A81241A35C9C9DAFE77AB9CEECD8E6BFF00E6ECE468E0D27A8CB2E79FCC9CEAD3B2100292482F4AD0E9735D08E3D4C50F6AAC90A25D8851F7D2F4A9B523A5FB12230CB11C837A8CF90CBE1F1F4AE95B3EC19C30CE85EBE9AC51316B652C3D1ADAF21958916BC64958800F248F5FBFBF2B0A1B74019522292A1BCFA1A8E632852D7FE14FAFD6933736E96E9082FF0091E9E821C56235828820A20828820A20828820A20828820A20828820A20828820A208415A9F33F5A525E7D3EF0CE665D7ED152353E5FA8A457FC4F4F510B23F90EBE863D52638CC0CE3CF2EB4CA6921EB666E0ED0B45B1B440DD61D7368810B75042547F28273127E1CE99CC202483983E4CF0E2424858551A94ABD639E5B7FB2EE5AE2D8E5AE22522CDF4F8772A689CD0F20A722A81A28820CF58D6A87E244A67E1E6CA672A0459FA51F3D2F5238F43D858AF96948DE619134CEDFB23CA3827ED7B816F1B703B67865DECC5AAF1ADCE63B89B3738A58D925DB8BA67C1B969D256DA21848F1D4A32AE93135E40F1F7C3CC46D9993B76593BE4D4268D5CF4EB7E21E3ABEC6C76E9402A3955CD6FC38BFEAD6D7B69FB55619B63B05B0581EEE302C7717C6DF5E181EC2F0BB64BE2D976CF5A150BA65A3C48E20954C89C89E55C9367FC12C4271816BC3D029C9DDAE76A5B2E758BCA71DF403BC59867C087F3F2A868DA1D97DC15EEFAB0CD99DE76F4367DA699B2B0B3186E0AF5A94AC45B32CBE9BD61E04428A791191322BD25E0DF87B87D9E895F3248FA4016AF1CB8B7F548DC563F75249512E0D9B8919BF71C5818C9B8B7B296E5F1B2BBB1B178260EFAD08416F09B0B761A4290908E3402990E28895AB9A89922BA54EF046C89E9DE992251240A1482C4B5DE9E561C43D7266D35A6690925B30D46B57DD39C623C6FD88B622ECACE1BB47B4F8324CC270DBB6984A7A00026321EBD339AA5ED7F865B271214061E4D41B203D7855DFDE913184DA0490E4D6FD18F43AF78C4989FB136F1709BB7AE7767BEADB5C3EED9016C338FED03AD614A58121280CA41827256999EE2B926DBF82DB3F129294E1651A963B81F3BD2A38D7C8BDB3058F620EF03931CDC67D2D50DD22DE6F799ED7FECF771C1BC7C393BC6D9DB7242AE7056AFB15716D27995BC420A881993D0F399E5FB4BFE9EF0F396B50C2A2D40101ADA6EBBD0B70B459B0D8A964B8201615058D879DFB50B5636DB735ED6FBBEDEB5BB0C3C95EC863A6517382E301BB1B86169240058E22A495C710CB30418AE29E27F8313365CD98518764A49A25059874ABBBF37E0D60C2CF46EA4156FB13FC8826B9BBBBFE9E3692C71766F57C2CF8859569723FE050D4292B920883D79FA8E11E22D9188D8AA9837149092C0976001ABD9F5AF9801DF2A64B525C0045C01573DBCB2A6B5996F14B761E0CF18700221C410A6D5397BA474D3B9D473AE74BDB334CEF92545AD7FB3DDF952D686388489B294424A5C588EBD2AFA54D327BE30ABD6DEE11C611A415981F1CB9EBCF2CF5A9FD9FB317B4589058FD5514399E2E48B53F351C7E15552524EACEE6F61C2FA3B6822F9B47168E101E41E8127AF31F2CC48F2E73E30A7027E530200C8D2B5D3F37D1A2AF3E490B2C9525EAC47BE1EC345D56778E048F789D34267F5D3B4C65E54F30F34EF3B86A3DA94E957074D2D11B3A4B92E90C5AEEDA65ADB43CDE25D1882A47BC124E441CA23D7591AF79ED53D87C504DCF177FDBF0639758879F214092C487C85B43C3F1E724DDEAD4212B132273F2CC73F3CA338A94958C02E68D9E8C0E9E54600C464C96A3BCC09CB80A6B4E1971B44AAF106CDAA5A85174482A0070FA199F3CF5E8669ACEC63AC8717CECDD48BEBC4F3860708B528A98805D8313D5C0F2FB4465BDCDC34E95A9529998075F4E5F2A47FCCD19C35496EDECB768593875020949A7FE26BCE9FD4387EF90E38A570E662720740074FAFCA8FF2CD5CD7A7A5CF06E7587D26514A47D2435836AEEF4E3C3B34352FB2AD5B9F41F3F8655918C04583E7FA76F46CA1D252B702A3913E4DE7C2211F682EE56BE121063DD034CB9448F43D474A513337C02146B93FB7F487282ACC1E7CB81FB6799BC2CDAAC513E234E11CE123303CC83F5D73E95BFD2D577CD9ADF9FEF846CA3382BE921F8BD2DCEED71F8641E530EF1065B2949D0A840F5EBAF98AD7E48517B067EA74BF11C98B6AF6419C024AC826B6726E496F2ED945A18A5A49E3F11B4E44813CCF58CC72E9D6B070C9AD3CF37D1B23AF0AE920998B7018876EBC98D47166BF216AB64ADE79A8E14B31C4F1C9A3C59A615CCFEB505B424CCAA520B0D38B66D9E9956D13D879A99720155D87D39E76F77EF1686DAEDBE05B01805EED1ED2DC270FC3ECDB538953EB4B46E826470DB9564B512008EA40A9FF0006EC79F8AC7C92A42F777C646B517FDF0E2219E231E84950DF7DD150F6719F6AE9A8CF99780BBB4BED81BF2B0DAF7AD9DB6DD2EC7DC3BFFE3F8462485A138AF8882DDCBB88319B0F165F6FC5B4524E47849AFA4DF09FC3587978590A99280FA126A90F4029E85B2F28AA63F6928957D74AD03FEC6BA1CDEF1D14B6C26D10B7B05C3385AC3184B097DFBD01372F78094942429320A1A52785B06084848CF5AEDFB4D48C048DD943758300037B033F5CA2AD89C5AA6A8BABB1E7D746E05E913CFB8D396AD3AC92B687B80EA4F8709398E597EC2B5D91BD8A4852C0E04DCD79B53F0E2A223D73094A9E8189B9F6FD9FAC5F3BBEC31FC4715B6798294A50B1C5C5209CC1E5AE433D4E626BA36CAC391BA7938E0F677E40DABC6299B594EA5358D40AD181E1EC115B08E92EC8D83ACE1966B52870844473919139FDF99ABDE0E584A4166E038801AEC6D4D2DC2287895A4A94337A12ECCF97AD59B8C5F0A525488FEE20CF4D7CFE952454539D2AE333A74D7D888D0A2093AE4D4F7EF575ADC10D007A9D3CEB20B807580972E7385AB318828820A20828820A20828820A20828820A20828820A20828820A208415A9F33F5A525E7D3EF0CE665D7ED152353E5FA8A457FC4F4F510B23F90EBE862971D482519CFC3F63EB4C66FF00BA9A7DABEF585D201501AD7A0BC473F6A5E049E9CF33F7F4F432CE6074B9205C578C3A42802C680B5B87BBEB1AEBBD3D8543E9BEBF21C7137A905411986BC311247298D67F4AAB63702B9B38923E9341D8DE97E97A50B189AC0E33717BA19810D4E5A3BD4D7F348D16DA5D90C1F16B6BBD9FDA2C16C31CC31055EEDDDBA6E5C4024A8F0858E1064444E446424547AB64E15559A849A33103D68C7EDD0C74DD8D8B2A4A54E7A1E77007DAE6312ECE6E8F74183624F5CE1BBBAC35772957126F2E30B6086D59E6870094F0E83908D795339FB3B65C9FA932D00B6807F4E7C9B48BC4AC613280DE34B826C3977CB5B464271F7025586E1E52A62021BB56B3619198090819240CB4D48911A88F5AA44B27E5002E404B060D60DCB534AD5DC4663316A7FE4C2AC41B5E9CF216111CAC39FB64969F480E0FCC120C0E2322273D0E63581E555BC66D0C50584A0AC26AF520355BBD7CC4478529642AA756CEDF7CEBC6E5A21FB6F7A232CFD3E47D3A7C61B2319895FF0032B2FCEE6F4E27A7189492B54B00B9CEF7716EB51E9AC4270076E96CDD24861A23C328D64E66493D73F29E722B6F98A5B15A49702E0DA9CE822670B8FDCFF71F3670CC2D473EAF156321BBCB33875CD9E1D7387A870A85CA389CE1E73CBAE67D295DC94B4D51C983BBE5D470E71352B6CEE007798F0E81A97CAC5F9C68B6FBBD92361B6FD6BC4F64F13BFD92DAA92EB177B36F3763FD64C293F8F5A015F04800091913A646A8FE23F0DE13684B984CB495149674826D6B711C6F13185DBF91517CB30CD5D0F1B75AB4604C037DFBE5F664BE636237A9855F6D8ECB29618636970365FBE5DB320E4E62376EC368805324468ACA6BC7BF113E144CC67CF5489143BCCC9E6E5EB4AC59F05B5B7C004BBD5C105DEBDDF5E79D3A49B9FDE0EC4EF4B08B6BDC03686C3104B88E316F6F72DB974DA880A5B6E25130B42A52A1C8823B5793F6CFC2BC5E027AA6192432892774E5C481C75AB919C4F8C4054A71A33F6D3F7CB5CC76EFDBB37AA6D97DEF1983932FAB2544689D4E4397999CA9AE0D32B633226B0DDA1DE6D08FC30343965092F0C569214012450E8E28D90A0BBEB58B818DA3BB5DC00FA030B100B69052948190201D02B224EBDE69AE37152F1538AD0CC49B72F6FAD2948ACE236780ADD04AC027EA2C7D916AF570232560D8C21C424A97079927FD03D23CA3A53742B749AB3E7EFDBC4462B6791FC53958D5F4F36BF578B9D2EB6F283895E47BC67E59F6C892234D69EA66669533DEB7F38879B8577494D4065532E596773969126C148CC39E8159E9D20C680FFAA709C492C0A83F7EAEEF9F4B8B4464CC1A41FE1C5EC2FC73E34AE50AAEF434A28E398CCE7073EF041A426E21492594FF00D0A7BF468DD18305208043EA1FEDA367D228FE663A9FFF00D87ED487F94BD4F61F98DBFC2F7BBFA8ABF19C598224EA0AA08F9FC7215B7F9254010A19BBB7979F58CFF86902A97D4D07D87BBC1F8A13AE7A73FACE959FF2A9BA5EA6E0866F2039D5B9C63FC66760903437F207D4748709B849410A201391279687F5FF00753585585CBE2337F64E55D73C86BFE3A82AD4C9AA3ADCBE7C21A3972D0D60CF5F58D481F5E5D2A4A4A42981E6065D69AFAE90AA30EA51277496CDAE03707CDA20EF318650A5B08202D319E5CC48CB3CFF005D69F252281B8659F67F2A5290FA561CA40510CF4622D5CADA58D62D5BCBC6A49B8B94A1339852C800753F0EB9D394480B60A0CDFEE6615B548ABF67A43F461CD4B127219EBA7A03C1EB18C76DF791B21B1F85DE6338AE316D6CCE0CD974599B8421EC51C5025B6DA41203C50B0124488E2EF3574D89E085ED7095097BC090FF004B923B7DBCA19E2B1424A424BBFD5AB27CF2BD29EB1CFF0052F6E3DB476A8DFE32DDE6CC6EB706B8219B05872D177ED255C33E1AA597015B61407454F6AEFDE0EF849364AE54F121AC689FA4336A38393E6CF153C5E3021240512493BCA37CDB78FE7AC6F66CCECDECB6C16CF58601B1986B768D59365B2E25A4216B5180A52CA009E23267299AF54F86F672F644A952CA5B7404D29976E1DDC18AE4DC495AEAA2CF99ABB73FD680677731656D7366B75C3E0BCA12E1C84EA79E672D663F5AB6CFD9EBDA83751BCA243E6F9643C867935A044A2B2491AB7B66B0605EFC8C37B5B668B0DDA30A2B6D2A30A104925524C9EB9919FD26A5766ECB3834A65AD0410F96BA599EC2FE6D0C718D2DD35000A92EFF0070FC5B5A0631B29BA6D9C21E65C08C8A92743D729F203F6ABCECD96C94D2A72CC8143CFDD6B145DAAB7DE2E5FA7A5FCAFC6379F0867F0F87B0D10470A743DE0F3E5570C3A5887B1D2F62FC2F147C5CC725AEECF7D0FA5B2CB9C9D2B3087352DC72F3E5EE911BF32AC547B96F7AE435876CFE41E66B32CDEB4A379C2E92E906FC7AC2B4A46D0510414410510414410510414410510414410510414410510414410929064C6739D6E9504BBBD5BEF0D972D459859F5E1C22A4248249F2A4D41C11EEF0A24177666D61B2D8714E958238491A93947DE7F72D664A529D9FFAB37BFD2C181048B438E0CB5CFE5FBD22AC312962F93D3AE61BCE3255F56F0E8FDA2D3C76DEE31143F60865A29527878DD4CFE607F29194C76CA0674CE7210414EE90A66A8B355DFF00BABE4D0F30E374098A5115B3DF2B75B3DF48D29DE7EE81EC25F7313B2BDBC05C5296FB2870F8644CC25206801391CF3CEAA3B4B0F88FAF71442AC0825DAE486D1DB3B6B7BEEC9DA0896849B80CE3CA9FAE51AF97187B56F76B45BBD7EC37925C4BEAE149207BD09034267A73354DC4E0F686FD56A524E44927370030E2ED7ED17295B5D0B48029C2DBDA1E35E0DC6AF093682CBC1AC398694167FAAFF0FF0057A92950E799D40A4D3266A48DFD5944F503476E35BC626CF135254D52CEF6B86D5FBD7842F7987AC2D50A5A814A4F13C6564902412390CE04E4075A96C3E0B0CB4BAD0144DAC7B07FBE79D214958A44A001EF7B5455F9BE82916EDCD9A9274D394FFACB9E91D795666E1306827FD31FFD23ECF9D3DD1C231C951228C0F56767F23DDD806868E58DB78056DA26E553C5C63DC1D2329D2751F2A8D9D2A42086450568056CC2EFDFC9E1EA26850749619B96ECC6BCFCAB4B3EFF000643CA2A76E6E1067F2B4A1C1E5A1F8CEA08A62B54AC9200B3066B655A7439584384A966DDEAFE54F2D22199C2D9B275D5B4DA145407BEB48F117023DF235E824F59E95193247CD984DD2694B75F36CB430FB0F2E71008530D41208FB65E94D6CFDB0D93C236B70CB8C2717C2AC1FB6B84942C964294A4AA66788473F3C8F794311B0B098992A1364824E7BA33E80B3EA79E462D380C61925017500D49B65573FA191168D19DB3F664DBFDD29736E7D9B719698C5D6A5DCDF6CCE22FB89C2D0106786D2CED42540B89E22A0755281CF2AE29E32F86F83C7CB9BB92424A829B71201CFB777148B8E1F6E484240500695736CC5DBB6515EEC3DB771CB1C5D8D94DFCEC662FB2DB40DAC30EED13160BB2C0F891092EAAEAE55C45110AE2CCF9675E33F1B7C0ADB7899D357835AD287247F3720540A03A6B1292FC418520B8B86000147A1CECCFA3BDF4E87ECB6F036476B9B6DFD9CDA2B1DA16D684B89BBC3EE9174DBB29E2284AD33C4A6F342C7250E935C3319E12DABB0712AC0E2513173525B7D94451FD68DCDB81504F933C6FA0009360CDC0F2AF5CF9647C331B5292A952AD4A084FFF0022513248919E607603CF952A36362C23795296903FE40D7859FA13F686CB4058CB872396777E2F1778C6EF2D582B0A53EDA38214DF110BE331EEE70424913032F95436254BC2A94952542D71A6648E1D6D9444CDC1A4A8FD22AE48D3BB68F9B70222455B4D756C9694B0E2D4E09094495088D472F21D472AD64CD334B82C4317D35AB9B4305ECF0A2E052EF60EE7DDFBC4BDBED236FB4DADD65EF19C305B09F78198CC6713FE69962B1E64CD2820AAA6B46F7A9D78C339929129450A42891983FB1A8A5EF12C9BE44A78DB75949FEE713C20749E629346D12A3541166B55FA1B76E302512D401092736724F6730E1FBE6ED9A0E825E4A808F07DE27CCCFF00A83953C9334AD8258BDA9DEC5DE3099466160821B23CEC18D73FCC26CE32DBA9E2216D000E4E0E1518EC7F61F0A9093835CC75070EE4795EB5E59F3853FC298EC03926A2EC28ED5157340417F2886BBDA74A2E0B6DA1F7018014D00A403CE6397FB3AD49499A70E7E5EE289CC81D3BF377A55E1F4AD90552C15EE8A5CDFABE61F9579C20F63C86C02E3E1B075E3504F0889CE63A7CBD44D6096B9AB4B2147A6668E7FAA1CA30766194EE46EB3029A3D5BCEB9FDE31DED7EF0B67F6612710C4710694CB82438DBA928102082547AC0D27D6AF9B23C3789C79425093BCA6BF16CAFC0FE03422BDC94EF5E7FD30CEBEC6986F43DA1DAC5AF11846C65CBD7F7B70781A4D9AFC585188E2E054E848FBCBA76CCF851B4F18942805004A49B8A38B822A1E1B2B69C9942A0588BB3B38BE64F4BDF45F6437138D6F1D386637BDABEBC6ED2CD65FB0C2AD5C5254F052B8E31261E1EF24C24B607F6933CABD3DE01F86E76761651C4A0129097701E9AB8AD341776CC45076C6DB96310A4805AAC435DAEF903C637170BC1B07C22D6DACF0CB0670CB5B3425B6AD6C5B4B2C3C94A42429E424C29440E23A1E23AC57A2B65E070182C3A50A949DE48000DD1F8C9F26EB157C4635539F7598DFBF3E4FAC5C4EB4979A42AC98436B392894F0A0C18CA3393CCE93DA92C64844D98552C6E8B06B3741DBEC6B08494294A05F788B3126EEC39D756BC0F5BA516E52B0B0A508514446B999CFB919139CE862AC7B0F1387C26EFCF402F4767A5466D6FC67589CC3A928B9761504D6DC789CB8D5CD54D9FB12ABB6DA652B5238F20449CC826791F9F7CAAD8AC08DA2A4CF900250A62C030B72F75393C5736B632589AABD99BA72A37168DE9DD6E0AB432C2D480880932444E5241FDF3ED52985D9AB92A00D599F5176D03DCF1245EF147DA0B4A8296429839005CBD3D7CB2358D9069B21090001023A72FF00433A99972F728A72DA9AFA51F93DF58A5E2120BA83821C56BAF2A7B1A429C0AEC3EFB4D0B46F5B30C7DD623D72F7AD9DEBC5E1CB7926398D7F4F80115B253B800E17D7DFEF38712C86DD1FED1EFC88852B68520A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828821A3EE34D92A2015467D48F989F81A6B324EF0248008CF5EDA5EB61942885FF00B4AA8198136BF6EBD22D6C5B0BB5C6D05B7DA42873E248394F2907A673FA9062713852A72433D2999B657F76A9895C262BE4021C90C0DECF90CDB80F28D76DE1EE5517CCDC5CE16D842CA491C020C81D00EBD0EB2222A0F13B394E0B2800EF43404D9F2B795227F09B5104805401C876A5EDCDB5AC6B35AECF5EECFDF2ED2F6DD6485405291F3CC8F3923E7509336792A50DD37BB54BE4697E7A44E236900032AFFED2E74ADAB9D9B5176892BFC33C5714B4A40040CA34C88F4F88CF5CE95460FE5A40666A3B1EA3856E087B16A557FF00304C6DD37CC963636AD9F969AC5AB79849930939EB9798CBAC4D369D215BA4B07197AB73EC61DC89C01363625EF4A9A9A38D74B59C413F61C1C49888EB9779EDDB3EF50F89C392E4675E56B7323C985E26E4CF70327B686EFF00AE15E56D5E589E239489CB43CF97AF3FD62A24C9625C647A6B968CCF7E31252A7848157D2A19C5387463E8D10AEE1DC4147864C667E323423EF2D49A66A5EE2C0341A350DA8783FDEB133879E0241DE07870B3533FC86CA21DFC3553A13E59FC2048CFFCE993B4AF7D208343D9F90F7A43D4625259E95701E8E3813A674842D2D9D6DF5B686020019BCB494A5723FEDA98CBAC75E9178DC399885101DC663EC6E3FA6178749C502A636C8022A5AAFEA22C5DB5DD5EC06D9A56CED7ECD5AE22873253CDD9B6EB99F3E258D4E93D7AE7547C76C654D52814BBB801A95A58FBEB50EC62B46073770C39E7C9B5D2358769BD8D5FC18DEED1EE5B6E719D92D176381BF889B2C2D970020A516D6E9C92E2C4AA224CE872AE7F8DF84382DAF89562A74894B98A2FF5A6A5854971D6834ADA2C982C7A53280DE6200706C5ED9F5357E04C60C637ABEDA5B98C69CC3F783B1B866D6EC55BF1A9CC6707B0BEBEBF36EDA54BF13C77086F88849CC889CF28AAEEDDF83982C3E194538745029BE9E1614AD39D2B7A449C9C626630B3B333E75FC3FDE919A775DFC477737B73776DB34E626E6038A61EA71AC52C318798B7B9B67944801D6B8A5292B04A246600033AF2A78F3E1A623040E213865224CC2AF953770842F74B16362D6247F6FE5044C53392736233B5FF0059E85B6C70DDFE6EE31265E36BB6DB3EAB87024DAA1EC41A0662600067211315C50F8731B266EE2028024D81D73A73CFCEB1228C0254086C9ACE03F215EF9D844B61BBD1C2AF8AD4D63D87B970DE65DB7B90A61433238153C80131A6A3A53F95E1433803350EB3A8E3FDD2EE6174F86D33C0594824D4E9E60FBB6717261BBCC43C1DF1F1266EDB6B3E169E0BC87627B453A1E0EA809964D724BB771EEB01F0DA10092814B960FED8449FFEE8E10E5AB6E1BB2C34A2A002969470C18248073CFBE94FA4783E72082892A615FE2FDAD715E26819A103B225A0BEE80012C5AEC73B8D323CA23717DEAECDD8E1EBB84E2C2E16904F84D3E9528F6893AE63B7ACD494BF0D62890912D49721C37767EF9706784FFC244B56FB208A31A6F646BE74AF58C4B79ED47B2B84D8285CA5EF1D5E22521213E285490264F32411D6262BA56C6F86EBC6E1D334C92544554525CB90F56EA78E60444E2F172A42C85123402A939D6AD4CF2B5B2C2D896FF76C31E7DC6B64306C43145BE48652F30B7904AA40808327CBE9575D9BF0B5689809901A87F8E8796A2B1098BDA89DD2029935B1F79BD9DF5156A309DC7EF7F7C0EA5FDE25F39B2981CF1A2DEDDC7ACDC08992149765209232EB273CCD764F0D7C3F32572CFC948008B2780D00C868DEB157C5ED10EE54C0BBD682E00CAF616A9E91B47BBADC2EEFF621808C3B0CFE6F7AC0138BDD32D3EB0B4C92B0FA6089339E672CC577ED87E14F952D2E9600682ACD4B5816FB457311B40289216F53C5891EDB96869995A64786385C0B0320419000C824764881A888F4AB72657F88D2AC2D4A12C3A31A55FF005159C54BF9EB52C3D3B8D6A59EDCA14F00F5F4E7F18229CA092A152473A5453843032FE5922BD7F1D7F1136D5E356B668429292A1324F39396BAEA0F202A4E4E154B1715A37AB5383119D3284FFCA1243B81773A5FCECFFDB1685CC4D7C2DB5C5240809D2644EBA9E43A72815252B66294A02C4B1A5AF5E43A8A645E3076ACBFF9E55AF36CAC3A3F08D8CDDB6EE55768B5BC799E10A2492A4F43DFF4CEBA1EC89224E1820DC5B4BD5C9D39E715CC6E3133662D64B019937BB8A3DCF1E91B8582E0B6D84DA2128400A4A7A69FAE675F96553491BA092CEDD3DDACFC0D62A98BC52A7ACA45100B30CF9F0F662E2617C6DF144493F414992E49D622E7A774A83BD8F7685AB10C141945BDD21540CBCCFDFEB446C8CFA7BF48AE88520A20828820A20828820A20828820A208FFD9, '1', '2021-10-06 01:13:39', '1', '2021-10-06 01:13:39', b'0', 0); +INSERT INTO `infra_file` VALUES ('427.jpg', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFDB00430006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D302D283025282928FFDB0043010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC0001108017F038403012200021101031101FFC4001C0001000203010101000000000000000000000607010405020308FFC40051100001030301040507060A08030803000000010203040511060712213113415161811422357191A1B115233242C1D1161752545572749394B2242536537392E1F0264362083334374482A2F163C2E2FFC4001C0101000203010101000000000000000000000102030405060807FFC4003811010002010204030507030402030000000001020304110512213113415114223371B13235617281A1D11552C1233454910642B2E1F1FFDA000C03010002110311003F00E5000D57E96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001832600905ABD1F0F8FC4DA356D5E8F87C7E26D1EA307C3AFCA1F35F1DFBCB51F9EDF564006572800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000115001E49F5480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060C9802416AF47C3E3F136CD4B57A3E1F1F89B67A8C1F0EBF287CD7C77EF2D47E7B7D400195CA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454007927D5200000000000000000000000000000000000000000002407DA9692A6B24E8E8E9E6A893F26262B97DC84928B67BA9EB1A8E6DBD206F6D44AD67BB8A931599ECC3933E2C5F6ED11FAA2A09D26CC6E8C44F2AB9DAA05EC74AABF6184D9B55AFF00DDDF2CEE5EC4949E4960FEA1A6FEFF00AA0C09AD46CCF51C6D5740CA4AA6A7F753267DF823B73B05DED795B85B6AE06A7D758F2DF6A6508989865A6AB0E49DA968997301E517D5ED3D10CE000000000000000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF500065728000000000000000000000000000004BF41E9EB75E9B54DAD95ED9E3C2358D5C70EDC7ACE4EA7B14F62AF5865F3A27718DFF948638CB59B7279B6EDA2CB5C11A8DBDD96BE9FA165CEF549472395AD95F8554E7C957EC3ABAE6C94F63B945152B9EB1C91EF6EBBA9727334ED4BE86F14D58CA7927481DBCE6B13B950EAEBAB9BEEF7064E9473D3C71337732B719E3EE2B336F1636EDB3631D717B15B78F7F7E9F24681B16CA29EE3591D352B15F2BF97777AF7131D47A4286CFA7BCA24A87F96B5513B9EAABC5A89D98CF12D7CD5ADA2B3DDAF8347973D2D92B1EED7BCA060032350000000000000000000000000000000000000000000000000000000000000000115001E49F54800000000000000000000000000000000000063217FDFAC9D58F4A525B6DECBD6B391D4D46BC61A245F9C9D7AB29CD3D5ED2621873E7AE18DEDDFCA3CE51FD37A6AEBA8A454B6D32AC2D5F3A793CD8DBEB5EDEE4C9275B7E8FD2EDC5D677DFEE2C5E34F0E12362F7AF2F6AAAF71C8D49AD6B6EF079150B3E4DB4B3CD65343C329FF0052A7C1381172DBC4766BC62CFA8EB967963D23BFEB3FC2695BB47B9A46B4F63A5A3B452FD56C51239D8F5AF0F71DFB1E89D41A9EDD4F71BBEA3A88E2A96F48D8BCE55C2F2CF144F7155390FD41A178E8EB3FECB1FF002A16ACEEE7F1498D0E2ACE0888999EFDE50A8B63B6A545E9AE55B23D79AA6EA7D87D1763B65C79B5B5C8BDBBCDFB8B0EE956DB7DB6AEADCD57A4113A556A2E15D84CE08F684D6516AC6563A2A39297C995A8BBEE45DEDE4CF0C16DA1C5AEB75D6A4E48B748EFD9127EC966A3C3AD3A82AA07A72DE454C7F95508954EADD53A5EED516DA9B836ADD4EFDD7B676A488E4E6985E0B83F43751F9B369E99D7977FF11BFC8D22D1111BBA3C2F516D6649C79E22D1B7A43AC97FD29A85772FD69F936A9FC3CAE8F967BD138E3D68A685E341D5C34C95F60A98EF16D5E28F8573237D6DEBF0E3DC43B0746C97AB8D8EA92A2D754F81FD6DE6C77EB379298F789EEED7B2E4C5D705BF49EB1FCC39EA8A8E5454C2A73EE058A8FB1ED09158F6C369D4CD4E0A9FF7752BF7FBFD641EED6CABB457CB457185D0D446B8545E28A9D4A8BD68A44C32E1D4C649E4B46D78F2FE3D5A40021B00000000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF5000657280000000000000000000000003260EB586C35B7C9256D0B1AEE89115EAE76319CE3E0A45AD158DE593162BE5B72638DE5A343593D05547534B22B2662E5153E0BDC4F6D90566BAA886A6E6D6C5434996E234FF00BC770CF1F611ABC693B9DA6916A6AE362C48B85563B7950B0AE73A69ED0ACF2576EC9D135AC7638EF3B9AFC54D3CD7ACED34EB32EF70DD364C7CF5D4EF14AC6F35F5F462B750D8B4DA3A929A26BA46705644DE4BDEBDA6AD1EBAB3DCB14F5F4EB0A3D513E7111CDF12A9739CF7AB9EE5739572AABD664B7B1D7BCCF562B71FCFCDEE5622BE9B2D1BC58D6C73A5F34EB58A8C4557C38CB55ABD68402FF7CADBE552CD56F446A7D18DBF45A84F765D717D5DB6B282A155ED871BAABD4D5EAF72911FC19ACB85EEE14B6E63563A7915155CEC22679214C3314BCC64F2F367D752D9B0D2DA5E95BF7AC7AA38090DDF48DD6D544FAAA98D8B133E92B5E8B823C6E56F178DEB2E0E6C19304F2E5AED2006CD0D1D457D4360A385F34AEFAAD4F8F61699888DE58AB59B4C56B1BCB58FB535354554891D2C124CFF00C96372A593A7F67F0C2C6CB7A547BF19E898B86A7AD799D0AED5561B1B560A18D923DBC1594ED4C7B791AB6D56F3B638DDDBC5C1B92B1935778A47A79A1743A0EF550D47491C74ED5FEF1DC7D8874D9B36AD5CEFD7409EA62A9F1B9ED0EE3322B68A28E99BD4ABE73BDE71E5D5F7C91DBCB5CF4EE6A22215DB5168DFA42D36E138E79622D6FC5DE9366D588DCC75D0B97B158A872EBF42DE695AAE8E2654353FBB771F628B7EACD473CCC8296774F33B9377117259F6375CDB48F7DF1606BF1BC891FD54EBCA98F265CD87ED4C4B7749A3D06BFA62A5ABF8F928CA8A79E9A45654C3244F4E0A8F6E307C4BF116D77E8248D3A1AB8D8AAD72A71445EE5217A8B67B86BA6B2BF971E8645F82FDE64C7ACACCED78D9A9ABE01931D7C4C16E7AFEEADC1F4A8864A699F0CF1BA3958B8735C98543E66E38131313B4C00008000000000000000000000000000000000000454007927D5200000000000000000000000000000000180A4CB67F65A693CA7505ED11B68B779F85E3D2C89C51B8EB44E1C3B704C43167CD18693796FE9FB551695B3C7A9351C6AEAA7F9D6FA17261CE7753D53DFDDCF99C1D58DBE5C60A6BFDEDAE6C558E5640DEA6A226530DFAA8BED534B545F6AB51DD64AEABCB73E6C5167846CEA4FBFBCB6E66FE1BEC9DAE6377EBA18B7B7539F4B1F344F5A27BD0BC46FD1CBCB6BE9AD4CF9BACDA7699FED8F48FF2816CEB453756256495334B052C0A8C6BA2C2ABDCA99C71ECE1ED4265F8A0B5F5DE6A53FC86E56AA685D96A45F42E13B373873E95FCFF00CA9F028E491E9F5DFF00E6513111DD5C56D4EB6F7C98F272D62768E9BAE45D90DA7F4CD4FB23FB8B26C940CB659E8E8A29165653C4D89AF5E6E444C654FCA4B23FF2DFFE653F4FE85E3A3ACFFB2C7FCA85A9313D9CEE3183363C75F1727346FE9B205B50B3EA9AABBD4D65BA6959676D326FB12A3753088AAEF333D857DA3ED7A8EE6CAAFC189A46246AD499193F45955CE3DC7E93AFA58EB68A6A69F3D14CC58DD85C2E1530A7274B695B66996D425AA391893AB55FBEF57724C2732663AEEC5838B785A79C5CB1BF4DBA7D5D6B7325650D3B6A155666C6D47AAAE72B8E3EF3F3A6D3BFB7977FF11BFC8D3F49A1526AFD9A5D2F7A8EB6E1056D23239DC8E46C8D76530D44FB08B44CC6D0AF08D463C19ED7C93B46CA7CCB237CD345144D574923918D6A75AAAE110B1FF14179FD2141FE471E742E8DABA3DA2A535CE2456DB99E51D2373BAFCF0663C73FE531C527CDE92DC4F4FC96B52DBCC46EDCDA3E9AB4D9B4F58E28B14F7557B299B331708EE19739DEA5E39E79535A92AA3D4913B4B6B0CD35EA9FCDA5AC7A61CAEEA455EBCF0EE72779CFDB25DFE52D58EA58DD98685891FF00EF5E2EFB13C0DB9DD6CD59A1E965A8AEA6A4D4540DE8D1F2C88D59913922AAF6A630BD4B9267BB9F4ADE34F8EF977DE67BF9C6FDBF4F5416F16DAAB3DCA6A1AF8963A88970A9D4E4EA722F5A29A858D0B9BB42D32F8E4DD4D4F6B8F79ABD7511FDBCBDBEB2B84CA2AA2A6153A94ACC6CEB69B3CE589ADFA5A3BFF3F2964004364000000000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE5000000000000000000000000074ECB7CAEB2BA575BE548FA54447A2B51738CE39FAD4E6022622D1B4AF8F25F15A2F49DA5DCBAEAABADD697C9EB2663A1CA2AB5AC46E71CB9162DCA1FC21D0ACF244CC9D1B5CC6AF5AB7A8AA2DB433DC6AE3A6A462BE47AF57244ED52796D9EB3424D0D3DD5EC9E86A9729D1E556254E784F1434F3D2B1B453BC793BFC375192DCF6D56F34B46D33E8AEA46BA391CC91AAD7B570A8BCD0CA16FD65874FEA755ACA791A93393CE7C2EC2AFEB27DE7CE9744596DCADA8AB95D2A3173991E88DF12DED95F38EAC73FF008FE69B6F4B44D7D776AECBEDEFA4B5D4D7D43771B51F45179EE275FB7243DDA9AB28AF171A9B5CC8C65448AAA8AD4545C725C2F592FBDDF16F953F2069D5661ED54926CE1AD6A7344F7103D4164ACB1D524558C4563932D95BF45C570C45AD3393BCF933710BDB0E1A534BBF2D3BDA3D5F7BB6ABBB5D29169AAE76AC2E5CAA3588DCF71C3077748E9E96FD5E8C4CB69A35459644E58EC4EF3667930D77DB6871A3C7D6E58AEF36B4BC69BD395B7E9D1B4EDDCA6477CE4AF4E089DDDE5979B3689B5F9A89D22A72E7248BDFFEF81F2D437DA1D236E6D150318B528DF323EA6A7E5394A9AE15B3DC2ADF535723A495FCD57ABB93B8D488B6A3ADBA55DABE4C1C223931C45B2CF79F2876F51EADAFBC4AE62B960A6FEE5BD7EB5EB23CBC7060F46ED295A46D58707367C99EDCF927790D9B650D45CABA2A4A466FCB22E13B113B57B8F8451BE591B1C4D57C8E5C35A9CD57B0EBC4B73D29748A5960E8A656E51AFE2D722F34E1CC5E676DABDCC18E26D17BC4F246DBCC2C6B65B6D7A2AD4EABAC91AEA854C3A554E2E5FC96A7615FEA7D575B7A7AB379D051E5710B579FAD7ACD0BDDE6B2F556B3D6BD17098631A98462771CEC1AF8B4FB4F3E4EB2E8EB78A73C781A68E5C71FBFCD3AD93D6B9974A9A4CF9B2B37D3D69FFD9B57ED435DA6B55D4B51566A295525E89FD59E7BABD5C5148D6839961D5743BBF59CAD5F61DDDADC28DBAD2CC9CDF12B7D8BFEA63B52BE3ED31D261BB87519238673E39DAD4B24371B75AF5B5A1B5346E6B6A9A9E6BFEB357F25C9D855573A29EDB5B252D5B1592B170A8BD7DE9DC6D69DBD5458EE2CA9A755E8D78491F53D0B23525B29B56E9F657DBF756A9ADDE8D7AD7B5ABFEF9889B69EDB4CFBB2AE4AE3E2D86725236CB5EF1EAA8C1E958A8AA8BC15382A28C1BCF3BD9E40010000000000000000000000000000000008A800F24FAA400000000000000000000000000000004B62D9452DC6E14D474C999A77A46DF5AFFA71F0261B47B8436F8A874ADA9F8A3B73516754FF00992AA75FAB2ABEB5EE3DECBE28A821BC6A6AA6A2C76E85590F1E72393FFA4F138D43A5EF17EB5576A06A31D1A39EF915CEC3E454E2EC263AB897ED0E6E4C94B6A37C93B569FF00CA7F8847510B4F6157748EBEBACF22F99335278D157EB27077B787B0AB10DFD3F7296CD7AA4B8C0ABBF03F2ADFCA6AA61508A4ED2D8D6E9E35182D8FCFC933DB55F56BF51C76E89D9A7A06E17BE45E7EC4C215E9F4AB9E4AAA996A2672BA595EAF7B97AD5572A7CC5A7795B498234F86B8E3C83F49ECDAE34F5DA3ADBD048C57430B6291B9E2D72261514FCD87B8A5923CAC52491AAF5B1EAD5F7135B72B0710D0C6B6914DF6D9FAEB982B9D8EDCE066908A3ADAE8D6A5F50FC3669B2F5555E09C5724EEB2BE9691A8957510C0AECEEA48F46E7D5932EFD37789CD82D8B2CE2EFB361EF6B1AAE739A889D6AA7E7AD65AD6EB26A7B8FC9179AA650B64DC8D237E1BC111171E3922F74A999F70AE62554EE8D677E13A45DD54DE5E499C60D2C7798E6EF55A0E114C13CF79E6DE3D121A6D69A8E1A98A65BC55C9D1BD1DB8F765AE44EA54EC52F4A2D534357A424D4316EF46C815CF6AF36B9138B17C781F9A910DDA5B955D35A6B2DB14CA94954E6BA4677A2E787BB3EA222FEACFACE178B5115E4888989FFB8F36B54CEFA9ABA8A99955D2CEF591EABD6AAB93E58E27A05267774E2368D9BD60BB4F63BBD357D2AFCE44EE29F94D5E6D5F5A122DA65B608AB69AF96C6FF56DD5892B31C9B2638A77679FB4873932A84FB492FE10686BC58645DFABA2FE99479E689CD513BB394FFDC5A3B6CD2D57FA57AE78F94FCA7F894010C9843255BA000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF50006572800000000000000000000000000012DD0BA8686C3154F95C323E57AF9AE6222F0EC393A8EF93DF2E0EA89BCD8DBC2367E4A1C808638C558B73F9B6EFADCB7C31A799F761D4D394EFADBC52D2367921499DBAAE62F1443A7AF6D8EB3DC618A3AA9E68E466F7CEBB795173DA722C35CDB65E292B1EC57B617EF2B514E96B7BDC37EB94735344E6471B37115E985771E65662FE2C6DDB667C57C5EC56DE7DFDFA7C9C6A1AC9A82B22AAA57AB268D72D54F82932D47AC28EF1A696966A6779639132AA89BAD776A2906C054C96BE1ADED169EED7C1ADCB8296C749F76DDE188911CF4472EEA2AF15E782F4B23AD36AB5C105354D3B62DDCEF2C89972F69456015CF83C6888DF66D70DE25EC369B4577995BB5DA734DDCAA5F34956C59DEEDE7392A132B939170D9BE51CEB65723BB1923787B50AE5155392AA1D8B56A0B9DADED5A5AB9309CD8F5DE6AF82987C0C94EB4B36E78968B3DBFD7C3B6FE712F85DACB70B4CAACAEA67313A9E9C5AE4ED45439E5B162D61417C44A2BB431C72BF8223B8B245ECE3D671AF7A01EDBA40B6CF3A8A593CF6AF3893ED42F4D4ED3CB9636953370BADE9E2E8ADCF5F4F387D7669624CADDEADA88D66521DEE5DEE23FAF2F6DBCDDFE670B4F4F9631C9F5B9657D44D35EDCE2B269F8ADB46A8934CCE8DA89CDAC4E0ABF615314C11E25A72CFE8C9C4AF1A5C55D0E3F2EB6F9867ACC036DC077345AFF00C556CFF17EC251B5D5FE9741FAAEF891FD9DD3F4FAAE957FBBCBFDDFEA7536B336F5F29E2CF06439C7AD57EE352DFEE23E4EEE19E5E159267CEC84AA130D9C5FD2DB5CFA3AB911B493AF9AAE5E0C77FA90E43286CE5A464AF2CB95A5D45F4B9632D3C922D7B1D1B350CD2504AD91B2A23DFB9C511CBCF0BEFF00123A8B93BD45A5ABAB2C6FB9C4B1A46D457231578AA2673F038284629AEDCB13BECB6B2324E49CB7AF2F37587900191A8000000000000000000000000000000008A800F24FAA4000000000000000000000000000000C2B55EDC378AAAA22027A427B7DCDA365965A16A2B65B9CCEA9953FE945CE17FF00892DD9DAA7E28EE1C3AAA7E0A4476BAE4A7BA5A2DCCFA14544C6227AF87C1097ECEB09B23B8F0EAA9F829963ED6CF39A98DF495BCF7B5B7FFB95231AFCD33F550FA1DAD11A6AAF54D7B29699ED8A38D8D7CD33933B8DEEEF52D766C7ECDBA9BF595CAFC717239A99F7158A4CBABA9E25834B6E4BCF551E0BAABF63D6C5A7779157D5C7509F4164DD7373DE98429EBADBEA2D572A8A1AD66E5440EDD722725EC54EE5422D598EEBE975F8757BC629EB0D606327D994D52E6E5296A1517AD2272FD846CDB9B447796E69A6A2EA6B46533FD2E2FE742C4FFB40222D4D9F2D4779B273F02B7A1656D1D7535545493ABE091B2B5AE85D8556AE533C0ECEAED4577D54FA67D75BD635A747237A389FC5171CF29DC5B7E9B39B9B14DF578F2C6DCB113BA30864FA792D5FE6951FBA77DC3C96AFF34A8FDD3BEE29B3A5CF4F57C81F6F24ABFCD67FDD3BEE1E4957F9ACFF00BA77DC3639ABEAF883E8FA7A88DB9929E66A76B98E4F8A1F14767B3DA0DE27B4BD926D9AD7FC9DACEDEF72FCD4EE5A77A7739387BD108C9EE095D4F5104CC5547472B5E8A9DCB9FB0989DA58F3523263B527CE1D1D5543F25EA6B9D12261B14EE567EAB97793DCA72C9AED7E344D61D3B795452C7267B578A7D884285A369534979C982969EFB3000219C00000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE500000000000000000000000000000000000080005920000000AA1E8B1F456B58A2A54A3BD4D8731311CEE4CEF2762F7F795C031E5C55CB1B4B7345AECBA3BF3E39FD16F576AAD332488B53D1CEEE48E743BDEF53A13592C35F44CA9968E08E191A8E47AFCDF05F615269AB6FCAB7BA5A6C658AE473FB9A9CC9DED52E694F6FA7B6C0A89D2F9CE44FC94E4685F0456F14A4CEF2F4FA6E2339B4F9353A9A56623B74EF2F9DDB6750CAC74B68AB54EB48E5F39BEA472724F6901BA5AEB2D550B0D740E8DC9C979A2A76A293ED93C756E8EA279679168DA9B8C8D578679AAA7FBEB3BCDB8D9F533EAEDB2235EF89CADC3B9AE3EB34B57364C569ACF58861C9C3B4DADC35CB8E3C3B5BB47AA25B26A5E92E557549F4638D1A8BEBE3F61C3D7D56955AA2AD5AECB23546278271F7E4B3F4FD95BA6ED754C8DCB3B95CE7B7098554C7042A2AEB65C96592A2A68EA5AB2395EB98D79AAE54BE1BD6F966FBF46BF10D364D36871E9F6EBBEF2E6032A8E6B951ED56AA75298375E776D96BECB2A52A34FD452393290BD5BE0BC7EF2B4BA53AD25CEAE05FA92B913DA4CB6472B9B71AD853E8BA34763BD14E3ED0E9FC97534FFF00E54E93DAABF71A98BDDCF68F577B591E370DC593FB7A23200371E7C0000000000000000000000000000000115001E49F54800000000000000000000000000007DA878D7D237A9D33117FCC87C4FA533FA3A9824C7D0918EF63917EC08B7D994BF6C0F576BCAA6AF26431227B1549B6CE7FF292E3EAA9F8290BDB1468DD7123D39494D13BDCA9F6135D9C7FE525C7D553F0532D7EDCBCFEABFD8E2F9D51ED84DDA9686E1574352F464956C63A2739708AAD45F37D6A8B9F02F4CA769F91ADF4F3D64D4F4F4713E5A8911118C67355EE2C28748ED05226EED554B13A9AB5DC93DA296DA36D95E29A0C59337893922B33E52BD6491B1B1CF7B911AD4CAAAAF043F3F5EA2875B6D4960A273BC9267231D2C69CD8C6F9CE4FF7D67DAE5A3B5DCB472255BEA2AA1C79D0A566F6F78678FA8DAD8D5CE86DB7BA8B6D6D2AC771A95DC64F2734DDFF0094A8A9C3EDF61333CD310C5A6D357498B266C578BDB6DBA797E2B4AC1A46CD628D128A8A3E93AE591379EABFACA4811AD44C235113D4641936D9E7F265BE49DEF3BCB184EC4184EC432031B184EC4184EC43200C613B10613B10C803CAB1AEE0AD6AA77A114D4FA0ACB7E85CAFA665354F36CF0351AE45EF4E4BE24B4113113DD97166C98A79A93B4BF2DEAAD3D5BA66E7E495ED4563F8C5337E8C89F62F71C593E8397B1327E93DA5D823BF697A98D199A981AB3C0E4E68E6F578A653C4FCD8EE2D7276A60C36AED2F69C375BED78666DF6A3BA7BB57F3A4D3CFEB75B98AA40C9E6D7711DC6CD4D9E30DBD88BEDFF00420645FBB370EFF6D5FD7EA000AB7400000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE50000000000000000000000000000000000000002C00000000001F482274F3C7146997BDC8D44F5952B1369DA1636CA6D8E8E19EE52A265C9D1C6AA9D5D6A43B565C9D78BFCF33155EDDEE8E344EB44E09ED2C7D412B34D68A4A68977667B12262A73DE5E6BE0995207A06D6B71D4502B93E669FE75FE1CBDE68E3B44CDB34FE8F4DACC3315C3C3A9DE7ACFEA9DCCE4D27A11ADCA24E91E329D6F77595452D4CB4B591D540F564EC72391C9DA4DB6AF74496B21B6C6ECA429BEF44FCA5E5EECFB481A1934B49E49B5BCDA9C673FF00AF18B1CED18FA47CD65D2ED2A9FC9A34A8A2996A31E76EAA6157B8F69B4AA4FAF6F9BC1C8A56461C9927D9317A2238EEB3688E6FDA16FC17ED357F448AA5226C8BC9B3B3757C17B4E45FF67CC7C6E9AC92F7A42F5CB7C14AD53872243A7356D7D96446A3967A5EB85EBC113BBB0C7E05F1F5C53FA33D78A60D57B9ACA47E68EEEBECE20A8A1D552D354C4F8A5485779AE4C2F343E7B564FF008962E3CE99BFCCE2C5B3D4DB6F71C572A6463E66A6EE7939B9E6D52BADAB393F096344C2E29DBFCCE2986FCF9F798EBB3775DA5AE9B86F2D6DCD133BC4A16003A0F22000000000000000000000000000000008A800F24FAA4000000000000000000000000000030A64013CDA7E6B6834CDD5BC52A6912355FF00AD31F79AD69A9D676CB33ED9436FAB4A37EF6F316937B3BDCF8F89B14C897ED924D0A7FE2ACB51D22679F46BC797A957D86FD06D6AB696869E07DAE199F1C68C5916654572A26338C193A6FBCCB8B1E2462F0A948B72CCC6D3FF0071FB23D60A7D57A7EADD536DB3D5367737737E4A5DF544EEEC242BAAB68B95FE8753FC127DC7DD36C75A8A9FD4F022F674EBF719FC7257AF1F91E0FDF2FDC4ED5F553263D565B735F05667E6D776AADA2F0FE8753CFF00324FB88EDC29354D75E52EB35A2AD2B9AF6BFA48E9B772E6E30B84EBE084A976C75EAA9FD4D073FEF97EE0BB63AFE3FD4F073FEFD7EE1EEFA94C7AAC73BD30563F56AFE156D1BF33AAFE093EE33F853B465FFD1D57F049F71B3F8E2AC44E367833FE3AFDC6536C757FA1E0FDFAFDC3DDF563F66CFF00F1EBFB357F0A368DF9A557F0483F0A368DF9A557F0486D7E392AFF0043C1FBF5FB87E392AFF43C1FBF5FB87BBEA7B367FF008F5FD9ABF851B46FCD2ABF8241F851B46FCD2ABF82436BF1C957FA1E0FDFAFDC3F1C957FA1E0FDFAFDC3DDF53D9B3FFC7AFECD5FC28DA37E6955FC120FC28DA37E6955FC121B5F8E4ABFD0F07EFD7EE1F8E4ABFD0F07EFD7EE1EEFA9ECD9FF00E3D7F66AFE146D1BF34AAFE0907E146D1BF34AAFE090DAFC7255FE8783F7EBF718FC7256FE8883F7CBF70E9EA7B367FF008F5FD9A926A7DA33915AB4753854E3FD09086525A6AD75050D05652CF4F3544ECF32566EAE15DC571D9C3DC4F936C95B9F4441FBE5FB8F8E8FB83B54EBEA8D457089B0D3DBE9FA456A3B28C544546A7BDCBE0368F566C739B4F4BDAD8A2B1B7979CF9381B56AB4AAD735AD6AE590323853C1B95F7A9123EF70AB7DC2E3575B2AAEFD4CAE9573D48ABC0F818E6779DDD6D363F0F0D69E9000086500000000000000000000000000000C19300482D5E8F87C7E26D9A96AF47C3E3F136CF5183E1D7E50F9AF8EFDE5A8FCF6FA80032B94000000000000000000000000000000000000000B00000000012FD9A5B52BAFCB3BD33152B77D7F5BABED2225B9A3E99BA7F46BEB2A3849235677F7A7D5F763DA6AEAAFCB4DA3BCBABC1B4F1975117B7D9AF5945F6A1745AABCB68D8B98E99BE0AABCC92ECF28E3B5E9892E350DC3A66AC8ABD7BA9CBDDC4ADE9229EF97C6B132B2544B973B9E11578AF827C0B1768B5CCB669F8ADB4AA8C599123444E68C435F2D76AD30C7EAEA68F2F364CDC432768ECAC6EB58FAFB8D45548AAAE95EAEF51AC8A39837E3A4443CCDED37B4DA7BCBD000954306401D5D3D7EABB1D4BA5A554735C98746EE4BFEA6B5DEE53DD6B9F5554A8AF77244E4D4EC434C15E4AF3736DD59673649C718B9BDD8F27900191840000000000000000000000000000000115001E41F5480000000000000000000000000000000259B2FBAC741A93C8EB38D15C58B4D2B579657822AFB71E270F525AE5B1DF6B2DF322AF42FF31DF94C5E2D5F61CD5CA2A2A2AA2A7254EA2C5BF3135A68E86F50222DDED8DE8AB1889E7491FE5227BFDBD85BBC6CD1CBBE0CF197FF005B749F9F94FF008482AE9E24D87365E8A3E956919E7EE2678B9133929CC96E4772A6AED87D4454F222CB4B036195BD6D76F27B95389512136F263E17CDFEAF37F74B2002AEA8000000000000000058BB0F8A3935157B64635E9E4C8EC39329F490AE8B1361B2322D457292472358DA3455555E089BDC549A7768714998D2DF64675F2359AD2F0D6B5111B3E11113098C275120AACE97D99474DC1B72BF3B7E444E0E6C489CBD9C3FF729E6DB6EA6D59B40BADC5DE848245A89A57A61AAD444C357D7BAABEA381AD2FCED457D9AB1379B4ADF9BA762F0DD8D392E3A9578A9333B4CCB5EBBE6F0F079562267E7E51FE5C2001475C0004000000000000000000000000000000003BF6AF47C3E3F136CD4B57A3E1F1F89B67A8C1F0EBF287CD5C77EF2D47E7B7D400195C90000000000000000000000000000000000000196B55CB86A2AAF62264CB1AAF7B58D4CB9CB84253B4BC827743B38AE9988B55590C2BD8D6ABFEE3AF1ECEADB1373575D3B913B15AC4F81AD6D5E38F37571704D664EBCBB47E32AB816CB74BE94819F3B246FFD79F39F78F93F44B39F92F8C8EFBCAFB6567B44B63FA0E48FB592B1FAAB9D376E75D2F34D4C9F41CECBF8670DEB5279B53B8A52D053DB61546EFE1CE6B7A9A9C13FDF71D8B63F4ADBA7596DF352C52AA6EEF23B2B83DDCA9F4D5D67E9AB24A79A54444CACB8E1ED35AF9F9F245A6B3B43A98387F81A4BE1A64AF3DBCF7F245B6516BDEABA8B8CA986C69D1C7EBEB5F670381AF6E9F29EA19FA3766183E699D9C39A96B5B1B69A3A1F24A09E28E2E3F464455CAF5E72466A367543222F93574E8E55CAEFE1FF007134CF5F16725FF45753C3737B1534DA7989F39EAAB0137AED9D5CA1CAD2CD0D42272CF98ABF123770B15D2DEDDEAAA299ACEA722653DC6ED72D2D1D25E733683538637C9497300EE54C283234DE800480000F2002C0000000000000000000000000000000022A003C83EA8000000000000000000000000000000000ED692BFCFA76F11D5C397C2E4DC9E1EA919D7E29CCE2810AE4C75C959A5BB4A71AC6D4B6CA49AF1A72557E9DBBB375EC6F28D55728D54EAE3C97AB910545251A33543AC6E9E92B61F2CB355652A299533CF9B93BFB53AFD66C6ACD2294B49F2C69F93CBAC7226F2398997C3DCEEE4EDE69D65A7AB4B0E49D3DBC1CBE7DA7D7E7F8FD51107969E88744000480000000000007574CD35D2E35925AACF9DEAE674736170891A2E55557A93B7D878D3F64AFBF5C19496D855EE55F3E45E0C8D3B5CBD44C6ED78B7E8DA096C9A6A549AE9279B5B7044CAB57ADADEACFB93D64C7AB47559FAF838E37B4FEDF8CB5F5A5C68EC9676E93B0C88E631735F50DE0B2BFADBF7F821040AAAAAAAAAAAABC5557AC1599DD974F8630D36EF3E73EB2000360000000000000000000000000000000000001DFB57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6AE3BF796A3F3DBEA000CAE48000000000000000000000000000064C1D0B25AAA6F35CDA5A36E5EBC5CE5E4D6F5AA916B45637964C78AF96D14A46F32D4A6A79AAA66454F1BA491CB846B533927564D9E4D32364BACDD0B57FE5B78BBDA48E286CFA26D8D7CBE754BBEB632F91DDC9D49EE20B7FD6572BB6FC71C8EA5A65E4C8D70ABEB5E669F899337C3E91EAEF7B269387D62757EF5FFB63FCA6EEA9D33A61158CE85274E0A8D4DF7F8F6156DCEA23A8B954555347D147249BEC6A751A88864CF8B07873BCCEF2E76B388CEA62295AC56B1DB67726D5D7B9A1489F5AF4444C65A9BAABE27267AEABA8E3354CAFF5BD4F8221932463A57B4356FA8CD93ED5A65E40305B661DE59000D8DE59472A72554F529B305C6B29F1D0D54ECC7E4BD4D403963CD6ADEF5EB59949A835ADE6937512A3A5627D591339F1E649EDBB4785ED6B6E74CAC775BE3E29EC2B23260BE9B1DFC9D0C1C5F57827A5F7F9F55BCB43A6754C2AEA6585B3AA6731F98F4F5B48A5FF0041D75035F2D0392AE24E3BA9C1FEC21B13DD1C8D9237398F6F16B9AB8545269A6F5DD651B9B0DD57CAA9F96FE3CF6F8F598BC2CB8BE1CEF1E92DEAEB347AEF77534E4B7F747F984338A2AA39151C9C1517A816D5FEC16ED554495D6C7C5E538CA48DE4FEE7779555653CD4750F82A58AC958B87357A94CD8734648F4973F5FC3F268E627BD67B4C3E20C193339EF2002C0000000000000000000000000000000022A003C83EA8000000000000000000000000000000000000614EDE96D4B70D3952AFA2911F0BD7E769E4E31C89DE9D4BDE9EF38A60989D95C98EB92B34BC6F12B0DF66D3FAD58B3E9C9E2B4DE1C9E7D04FC237AF5EEE3B7BBD88436F565B8D96758AE7492C0BD4F54CB1DDE8E4E0A73D1551C8E6AAA3938A2A2E153BD17A949759F5F5DE8A04A4B824375A0C6162AB6EF3B1D9BDF7A293BC4F769C62D460E98A79ABE93DFF49FE51045C99276AED077B4CCACABB04EEE2AADCBA3DEF7A7B907E2F5954DDFB26A2B6D73179239DB8BEEC93C933D978D7E3AF4C9135F9C7F9EC82026B26CC75335331D3D34A9DADA84FB707C9366BAA57FF431277AD4331F1239656F6FD37F7C7FDA1E09D45B34BAB1BBF5F5F6DA38FAD5F36F63DD8F7994B0E8CB53B376BF4B719539C144D4C2AF670CFC49E59F356788619E94DED3F846E83451BE591B1C4C7C923D70D63132AABEA26B6BD06B0D3F97EADAC65A681A9BC8C5722CCFEEC757BD7B8FACBAF696D71BE1D2566A7A16AA63A79911F22FFBEF5521973B8D6DDAA9D5171A996A265EB7AF044EC44E4883DD5667519FA7D88FFB9FE23F74AEFBACA265B56D1A4E97E4DB5E30F97FE6CDDB95E69EDCFA8861E51307A2932D8C382986BB523F99600043280025600000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF5183E1D7E50F9AB8EFDE5A8FCF6FA80032B92000000000000000000000000120D1FA7D6FF005CF8DD32450C288E7AE32E5CF5211F3668AB6A68645928E77C322A63798B829939A6BB57BB369ED8E9922D9637AC792D6752E95D36DCCEDA7E99A9C77FE724FB4FA52EB4D3CC7E237244ABD69163E053F23DD2395D2395CF5E6E5EB3C9AFEC713F6A665D98E3D7C73FE8E3AD63E4B8AFBA7EDBAA99E554D53F3FBBBAD918EDE6A772A15EDDB49DDADB22A3E95F347D52429BCDC7D8722DF5F556F9D26A399F149DAD5E7EB26F6DDA44B1B11971A44957ADF1BB0ABE0A56299B0FD8EB0BDF51A0E213BE78E4BFAC7641DB4B52E7A3129E6572AE1137172AA496C3A1EE3707A3AADAB494DF595DF497BB04A1DB43B5747BC94753BFF93BAD4FB4E05E75FD6D5C6B1D04494AD5E1BD9DE77FA133933DFA56BB295D2F0DD3CF3DF273FE1094250696D36C449920595BD722EFBD54F2BAA34B54B7724647BBFF00541C0A9E59649A474933DD23DDCDCE5CA9E10B7B26FD6D699944F1C9A74C38EB15F92D8ABD2DA7AFD0F4B6D7C513978EFC18C78B79107BC690BB5B65545A774F0F54B12653C53A8E35256D4D04C92D1CCE8654FACD526F69DA44F1C691DCA95B32E31BF1AE157C0AC53362EB5EB09F1B41ADF8D5F0EDEB1D9075A4A8E93A3E825DFE5BA8C5CE491D8744DCEE32B5D551BA929FADCFE0E5EE44257F8C4B5247BCB4751BFF0093BADFBCE15DF6895752C732DD036991786FAAEF3B1F613E267BF4AD76234BC3B04F3E4C9CFF008424EDB6697D371A36A920E9719574D87397BF1F71E3F0AF4BCB1A325466EFFD54FC3E054D34D2CF2BA49A4748F771573972AABEB3C389F64DFADED33289E3B349E5C38EB15F92DAAAD37A72FECDFB6BE38A444FA54EA889E2DE441EF3A3EED6D7F9B02D4C5D524499F6A751C2A3AAA8A2A86CD4933A291BD6D5C139B5ED1AA216232E14AD9D7ADEC5C2AF811C997175ACF341ED1A1D6FC68F0EDEB1D908F23A8E9773A1951DD8AC5424363D1772B948D5A889D4B065155F2271C762212C4DA1DA5D1E5D4751BFF92AC6FDE71AEBB45AAA8639B6DA76D3B57948E76F2FB303C4CF7E95AEC9AE9387609E7BE5E6FC2212DA082CBA3E95D1AD5246E7E15EAF7E55EA9D78EAF035AA35669AA97AB6A3122F2557C394F815255544B5333A5A891D24AEE2E73972AAA7C488D1C77B4F55B271FB563C3C38E22BE92B764D3DA6B5042AB6E74314C9C51D02A22A7ADA56FA92D12D92E4B4B339AFCB51ED73792A2AAA7D8685354CD4B2A4B4F23A395BC9CD5C2A18A99E5A999D2CEF74923B9B9CB95532E2C56C73F6B7868EB35B83538E27C3E5BFAC767CC00677300000000000000000000000000000000115001E49F5480000000000000000000000000000000000000C003200212185C271C267A97AD0C804ED3DDF48AB2AE36EEC75752C4EC6CCE44F89F575C2B9CDC2D755AA75A2CCE545F79AB83284EEAF875F41EAB22E65739EBDAE72AFC42222270320895A221E4C80000000001200090000000000000000000000000000000000001DFB57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6AE3BF796A3F3DBEA000CAE4800000000000000000000000064DDB6DAAB6E7D279053BE758F1BC8DEACE7EE3E75F41536FA8582B617432A26775DD8579E37E5DFAAF38B2453C49AFBBEBE4D5001650000197183AF1E9DBBCB4EDA88E825753B9BBED9131C5BCF2724AC5EB6ED2C97C3929B73D6637650C9843AD6DD3B77B8D3A4F4B412BA25FA2E5C3729DA99C649B5E2B1BCC98F0E4CB3CB8EB33F27254C60E85DACD70B56EADC69A4811CB86AAAA2A2F8A2A9CF4E02B3168DE117A5B1CF2DE36914C19530595650F4793AD53A76EF4D4CEA89A865642D4DE572E38276F322D78AF795A98AF9379A5667672000140C9800003AD169CBBCB4EDA88E825753B9BBED9131C5BDA56D78AF7964A62C9937E4ACCEDE8E51930096260004A40000000000000000000000000000000115001E49F54800000000000000000000000000000185036AD9433DCEE34D454AD474F3BD23622F6A9743F4DE8FD196D864BE3595133FCD49266AC8E7AF5EEB392271F81586CF2B22A0D676AA8A876EC4D955AAABD5BCD56A7BDC5A5B5CD2B72D40943536A6A4EB4E8E6BA2DF46AAEF2A2E533C3ABB7B0C958DA3770B8966B7B4530DEDCB49EF30F355A4B4AEAEB33EAB4F24704A996B65851588D7A753D9C3B53AB257BA0B4749A86FF53495AAE869E8B854A27D2DECAA6E278A2F1EE2D0D9369BAFD3F67AB6DD11239EA25DEE851E8EDC6A261155538657BB3C3079D13554B0EB3D59429B8C9DD5093353ADC98E3EF5F796DB78DDA11ADC9863363C569B4476969D737679A7EBD2D7574B4A950DC6FF004913A5DDCA7D6771C29C0DA5E85A2A2B5FCB5624DDA76E166898BBCD56AAE11EDF154CA72C2E7860D6D61B3DBF55EA8AC9E8216D4D3554CE95B2ACAD4DD472E551D95CF0CE3867860B1AF141F27ECD2AEDF23925753DB1D1B97A955B1F34F14276E9B4A273469FC2C98B24DA67BC6FBABED9A684A4B8DBD2F17CF3A9D573143BDBA8A89CDCE5ECCA7B892DB23D9FDFEB1D6CA2A3A474D85C6EC4E8D5E9D6AD77055FF7D477FE467D468186D146F48DF251C70EFBB8E115111CABE1922745B30B22E528AF957E5B1F37C5333CD5EBE08994F69131B76567575CF6BDF2E49ACEFD36ED1F8CABEDA069A4D337C5A68A47C94B2B7A485EEC671C9517BD17E2871EC3047537DB6C33377A392A63639BD4A8AE445453775969FACD397875256B925DE4DF8E744E12A2AF3F5E79A1A9A6FF00B4B68FDB22FE7429E6F498ED33A5DF9B9BA775A3B55D2D67B46974A9B7514704EB3359BCD55CE1517B54E26CEB67A97BA76DCAF0E923A157622898BBAE971C15557A933E2BDDD735DB5FF6359FB4C7F071D8D46AFD3FA02A9287E69D4F4BD146A9F55708D47782AE4B4C46EF398F5D9ABA6AD2B6F7AD698DFF000E8E43AD7B3FA49FE4E99B6D64EDF3375F2F9CD5EC572AF05F1227B44D9DC16BB7C973B12BFC9E2F3A5A772EF2B5BF94D5E784EBC9583955CAAAAB955E7DE48A4D6D7E75A62B6A572B69591742A88C4DE73718C2AAA67970226636DA61D5A6835382F5BE3CBBFAEEB0B65FA52CB78D27155DC68239A7591EDDE555CE11787594FD6B1ADAC99AD4C35AF7227AB25F9B18E3A162FF001A4F89425C13FA7D47F88EFE6522D1D224E1D92F7D5668B4EFB4FF002B37641A6ED37BB657CB73A38EA1F1CC8C6ABB3C1319211AE28E0A1D5972A4A48922822930C6A2F044C21676C13D0F74FDA13F950AE3693C35CDDFFC6FB106DEEC234B92F3AFC94999DA23F84700055DC00000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9AB8EFDE5A8FCF6FA80032B920000037AC75CB6DBCD1D52265237A2B93B5ABC17DCA5A5B47A08EAB4ABEA226377A07B256AB53AB92FB973E060C99BC3BC5663BBA7A4E1FED583265ADBAD7C94F82D1D95D0363B4D555CCD45E9A4DDCBB8E5AD4EFEF55399B58A0486BE8AAA34444918B1AE3A95AB94FE62B1A989C9E1B2DB845EBA38D56FFA2020BAAC71C162D150C93469F334FD33D1C9C55CA9BCA9ED5C113D9F69E8AF12D45DAE8DE998B22A318E4F35EEEB72A75A71E5CB9911AA8DAD331D2192DC12F16C78EB6DED68DFE5081A31EE6AB9AD556B7E92A2706A76A9E50B86E1AD2CF6AAF7D0F412BBA25DC7AC4C4DC62F5A734E5D7833A9B4ED05FED0EADA16312A959D2C534698E93AF75DDB9E5C7914F6B98DB9ABB44B2DB8145A2D1832C5AD5EF0A74F4D6B9D9DD6AAE1155709C910B4F64B1B24B0D52BDAD77F497734CFD461BD2DE2C3A6EB27A573F153348E9665646AE54572E7CE5EECFB09B6AE62D34AD779571F04ACE1A66C9962B13EBFFEB81B1F5F9EBAFEAC7F171C8DA8AFFC56FF00F099F6926D9DD67CA3A82FD54888D64AAC73513879B9763DC7CF50E9B9EFFAD5EEC2C7451C6C49264EDE786F7FC33EDC3178AE79B5FA746F5B4D6CDC3298B0F5F7BFCCAB005C7A8EF16DD2F6E6D252C50BAA91BF350639762BBAF9F8AFBC8169CB14DAB6AABA69AB12196356AB9563DEDEDECF7A631836A9A8E6AF3DA36872753C2FC2C95C18EDCD927CBD3F5464162FE2CA4FD28CFDC7FF00D1CDD43A1DF66B44F5EB5E93245BBE6245BAAB972273CF793ED38A6768952FC1F598EB37B53A475EF0B0ACBFD8AA3FD85BFC88413416A3B5DA2D33C37255E95D3ABD311EF70DD6A7D84EACABFF000551FEC2DFE4423BB298209AC555D2451BB76A5C89BCD45C26EB4E7D6622B6DFD5EA7356F6CD8231CC44F2CF7EBE8835DE782EDAA24922CAD3544CD44CA6155382722DED4B5EB62D3D355D2C2C73A246B58C5E0D4CAA2272EAEE21F4178A3B2EB5BBC53C123FCA266471F46D4546AF7E553B509CDFAE505A6D72D65546F9216632D6222AAE571C9553B49CF69B4D6BB7462E198AB4C79EFCF116999DFA76DB7531A8F50D55FE581F56D8DBD1355A8D622E32ABC578AAF77B0E4265CE46B532ABC93AD549356AC3ABB5840DA06BE2867C22AAA615A8D4E2BC17B13813DB957DA345D143143499924CEEB1A89BCFC632E72A9B7E3785B52B5EBE8E25787DB596BE7CB97DD8FF00DBD7F4538F4731CAD7B55AE4EA54C28452DFB2DFADBABE3968AAE85AD95ADDE58A4C3DAA9CB28BDBCBB17895CEB1B2FC897C969D8AAB03DA9244ABCF757ABC1514C98B51CF6E4B46D2C1ADE19E0628CF8AFCF49F3ECE3977EADFEC857FF81F6147A17FD7B29E5B3CADAE544A5E8F32E796EA2657260D6CED6A4BA3FF008F579F1E7AFAC7F2A011AE56B9C8D556B79AA27043C97258356D9EBAB9B6EA589F4EBF463DE62358EF5617811DDA85860A564572A385B12B9FB93358984555E28EC7B7DA5E9AA99BF25ABB353370788C13A8C3922D11DD5E9F4E8A4E8FA458DE8CFCADD5C7B7916168BABD376AB52544D5113AE1BBBF22BD8AAE6AE3E8B729F0EB3A769D72CB95C9B4B0DAA7742AE46F48C5DE56E579B91138278936D45A26796BD20C3C270DEB59C99A226DDA2237FF00B54C5EB65FEC551FEC2DFE44227B4DB0524148CB95344D8A457A32646261AE45CE171DB9E1E24AECD84D1547CFFF0002DFE4435B519632D2B6875B8568ADA2CF9715A77F75461E991BDF9E8D8E7639EEA6495E824B1433CD517B9A2599AA8D8A2918AAD4EBDE5CA633D9D9825157AFA8E3AEF24B6D03EAD8C76EAB99C33FAA888B936AD9AD13B56BBECE2E9F8762C98E32E5CB11BF977955460B9B54D9A9AF9627D5793AC356D87A68D55BB923571F45DF035B65D1B1DA71CAE6B557A777154CF5214F6C8E49B6DD9B3FD06D1A88C336E931BC4EDFE151E1CBC1A995EA4EB55EC430B945547261C9CD3B0B62A2FDA7B4DDDAA69DB03DF52F955F3CAC622AA2B955DCFB133D474F5A5AE96EFA72A6658DAB2471ACB148DE7844CE33D8B823DAE62637AF4947F43ADA979C79626D5EF0A50F4D6B9D9DD6AAE132B84E484E3675A660B8A495F708FA48A37EEC71AFD1739138AAF6E3284AEEFABACF64ABF2148A47BE3C239208D1519DDCD3DC5EFAADADC948DE58B4FC222D8633E7C91489ECA73031DE5B1A9A8EC17DB3A55A54D2D34F237A48A773918AE5EA4777110D05A763BD5CA5756377A929B0AE445FA6EEA4F5732D5D4C4D66D31B6CC59B84E4A67AE1C768B7376945DB1BDF948DAAF544CE113A8F05BB7BD5D6DD3B55F27D2D1748F89137DAC446B19D78E5CF1DC6C4715A35B595D3A41BAFE2C47AB51248DDEBECE463F6B98DA6D5E8DBFE874BDAD8F1E589BC796DFE54D983ED594EFA4AC9E9A54C490BD58EF5A29F1373BF5702D59ACED20002A000000008A800F24FAA400000000000000000000000000000001B36DA292E15F4F4703A36CB33D236AC8EDD6E5782657D782CBB97E1DE90B440E4AC4ABA654566236F4AB172C6555B9F6E53815631CE639AE6395AF6AA2A39382A2A75A16659F6B55D4B44C82E56F8EB646A63A56CBD12B93BFCD5E25AB31E72E6EBF166BCD671D22F11DE27FF00B4D765EDBABAD75B75D4324AB5154E4DCE993755236A705DDC26EA655DD5DFD656D414373D59ACEE971B055454F347374AD91F22B17755551B8C22AAF04E29DE7AD59B49B95F28DD474B0328291FC246B5EAF73DBF92AEE1C3C08AD86F35B60B9C75D6E911B33515AA8E4CB5ED5EA54ECE05F9A22366AE9B459AB1932CC445ADD223CA13CBE5E75F5BEBBE4674D34B2B9C8D64F153B7E7117B177797BD09AEAC992C1B319E9AAE6E92A56952955D9CABE47261CBED5555F122ADDB34BD1A23EC91BA4FCA4A9544F66EFDA41B576ACB8EA99D8EAE56B208D731C11F06B7BFBD7BFD98226D11DA5829C3F3E7BD2B931C5223ACEDB755D50CD35F3661BD6C72AD5CD43B8D46AF1DF46E1CDCF6E5150ABB66D65BCB359D13D292AA9A381EAB3BA462B111B85CA2E7B7960D2D19ADAE1A5F7E281AD9E8E476F3A07AAA222F5AB57A95496546D8AA16354A5B3C5148BC9CFA857A7B11A9F12DCF129F63D569A3262C548B56DE6DADB4C1F29DD74FDB69918EAF9164C22BB1C155A888BEBC2FB08737485DB4FDE6CB51728A3646FAE8636E1E8B95DECF57A8E5B351D63F53C37BAD72D454C72A49BB9DD4C27D54EC4243A9B6892DF56DAAEB7320F23AA654A625DEDFDDCF9BCB8732B368DF796CE3D3EAB4F4AE0A444D769DE7E69F6DB3868C8FF698FE0A75AD7241AC342358E7E3CAA99617AA7D493185E1DCA992A8D69B419753DA1281F6E653A248D937D25DEE5DD84385A5F54DD34DCCE75BA66F46F545921913798FF0FB899B44CB4E9C2B34E9A2BDAF13BC3E957A2F50D35C92896D55524AAB847C6C5746BDFBFCB1EB542C5BA682B1DAF447945DA356575341BD24D048A8AE7AF1DD4EA5E2B84CA761A71ED8E548D3A4B2C6E913ADB51BA9ECDD5217ABB595CF53AB1957D1C548C76F369E34F373DAB9E6A47BB0D9E4D7EA2D4AE48E488EF313DD676C42BA39B4C4F468E6F4D4F33955B9E3BAEE28BEDDE4F02BCD5BA26F3417CAB482DF53534B2C8E7C32411ABD15157288B8E4BD5C71C8E0586F55D62AF6D5DB65E8E544DD722A65AF6F62A7616353ED8E7489A953668A495138B9950AD45F056AFC47344C6D28B69F55A5D45B2E9E39A2C956C974FD5E9FD3F3FCA2C58AA2A65593A35545DC6A222222F7F055F1294D5F5CDB9EA7B9D646A8B14B3B958A8B9CB51708BE2888A493546D2AEB79A57D2D346CA0A67A61FD1BB79EE4EB4DE5E48BDC840C8B5A3688867E1DA4CB4CB7D467FB56F2640055D900000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000171E8DA88EF9A35B4B33B7B76375349DB8C613FF8AA14E128D0FA9A3D3B254A54C52CB0CDBB848F0AA8E4CF6E3ABE06B6AB1CDE9EEF7875F836AEBA6CFB649F76D1B4A6775CE9DD9C369D331D43A148F08B8547BD7CEC75F5B94D8BC52FE13699B6CC89973A486454C752AA35DEE55F610BD6FAAE2D410D2C54B14B1471B9CE7A4889C57184C617D7ED37B496B6A6B3D962A2AC82A247C6AEC3A344C61573D6A9DAA6AF8178A45F6EBBBB71C4F4D7CF6C336FF4B96223E70EDED52E294D638A89AEC3AA9F877EAB70BF1DD36B6613324D2D1C6C5CAC723DAEF5E73F0542B9D637D4BF5D52A236BD903188C635D8CA76F2FF007C8F3A5F5154E9FAB7490B52585FC2485CB8476392E7A94C9ECD6F07963BF76A7F57C71C4A734CFB9B72FE8F86A7A6969350DC239D8AD72CCF7A653E922B95517D8A5C3A4A1928B4B5147548B1BDB0EF391C98DDEBC2F6703851ED06CD335AFA8A6A86C8DE288B1A3B1EA5C91FD55AE9F74A27D15BA17D3C12262491EA9BCE45E6984E09ED52B6AE4CD1159AEDB33E0C9A3E1F6C99E9979B9BB424DB2D9124B3D7C8D4546BEADEE4CA617E8B4AD75348B36A2B9BDDCFCA246F823951090E8AD594BA7EDD3D35553CF23E49964CC7BB8445444C715EE22972A86D5DCAB2A58D735B34CF9511DCD115CAB8532E1C76AE6B4CB9FAFD5E3CBA2C54A4F58EF09E6C753FA4DCFF00563F8B898DDB51D05AAE1494750F5E96A1C89C3EA22F255EECE3FDA159688D474DA79F58EA98A593A746A37A3C70C6739CAF79A5ABEF10DEEF4EACA7648C62C6D6EEBD133C33D9EB31DF4F39334EFD9B9A6E2F4D270FA56931CF13DBF54D3699A716A62F95A8D999634F9F44E6E6FE57AD3E1EA2B6A5ACA9A4DEF25A89A1DEFA5D1C8ADCE396704FAC1B40829ED51535CA9EA67958DDC57B11151C9D59CAA71209767D24B5F2C96F6C8CA67AEF35922222B73D5C15781974F17AC78778ECD0E2D7C196D5D569EDD67BC79C4BEDF2BDCB8FF58D6FF10FFBCF94D70ADA889D1545655491BB196BE6739171DCAA6A21E9BD66CF2D63C9C9F1B24F49B4AF1B327FC1547FB0B7F910E36C8D3FA8AB3F6A77F2B0E5506BBA1A7B0C16F75354AC91D3242AE4DDC2AA371DA73F43EACA3B0DB27A6AA86A1F23E65951636A2A222B5A9D6A9D873270DF96D1B79BD95788E9BC7C36E78DA2B313FB34B50FF6F65FDB19F61606D23FB1F55FAD1FF3A1575D2E50D5EA675C636C9D03A76CB8544DEC263298CF3E04A3566B5A0BC58E6A1A7A7AA64AF562A2BDADC70722F538CD7C5799A74ECE7E9F5986B8F5516B6DCDBEDF8F77336673321D55123F199237B5BEBE7F61616AEBD45656C12D4DBBCAA27AAA6FF0C317861173DBF614B413494F5114D0B959246EDE6B939A2963DB76894D25224577A47ABF1873A344735DDF85F871275386D378C911BA384710C74D3DB4F7BF2DB7DE276DE1B169D62CADA87A5B2C2F9256B72EE895A9C3D7822DAFEE53DCAB699F536FA8A27C6D73712A7D2E29CB87124EFD7B65A389CDB75148AF54CEEB6346267BD7FD14AFEFD77A9BD5C1F5556E4E3C18C4E4C6F6211831CF3F372ED0713D5D674DE178BCF33E91110E7A17B6A2824A9D3159140D57C8EA75DD6A75F9BC8A250B366DA3D1B6955B4D4D3F4CD44DDDF44C78F12FABC76BCD66B1BECC3C0F53830D32D735B6DE3F942F47D2CF57A9681B4E8ECB256C8F544CE1AD5455CF67678962ED4E546699E8DDF4A499A89EB4CAFD86BC3B40B4246B23E9A78A77226F31AC4CAAFAF3F120FAC752CBA86A63548FA2A58F8C6C55F39557EB2E3BB063E5C9972D6D35DB66CF8BA6D0E8B262C7939E6E9EDB34F5A74F587CBABE9A3A89A38D1F2BDEDDFE3D8D45E073E8F5B54DCEB62A1B2DB1B1ABDC88AE72E775BD6E5444E18F5A9F2B06BFA46DB23A5BB4122CAD62315CD6A39AF4C63976F69F2B9EBCA58617C760A148A477395EC46A7B13ED31C62C9369E6AEF3FB36FDB34D4C549C1922958EF111D6521DA871D2927F8ACF89D0B3FF0062A8FF00616FF22108D55ACE82F763928E3A6A9648F56B91CE46EEF05CF6E78F2E47DEDFAEE820B053DBDF4954B2C74C90AB911B8CA371DA57C1BF8711B79B2CF12D2FB55EFCF1B4D76FD5EB679A628AAEDE973AF8D27DF72A471BF8B511170AAA9D6B9F81F6ACD75494150EA4B2DAD1DBAEE8F7B1BA8AA9D8D44CAFB8E368BD60DB2D3BE8EBA37C94EAE57B1ECC658ABCD30BCD3ACEDD5EBBB3C2F74D436F592ADC8B87BA36B3DABCCC96C7926F3CF5E68FD9AB8353A6A69A9E0E48A4C77E9BCA5B13EAE4D3CE7DC11ADAA7D3ABA46B5308D5545E18EEE470F653C74BAE787CF3FEC39147B42A75B6F4374A7A87543D1C8F744898C2E708995EC5434B486B0A3B0DA568EA29EA647F48E7658D4C71F131F81922968DBCDB7FD534939B1DF9FA444FF8EE8AEA37B9DA86E7BCB9C554889FE654FB0B9D7FB1ABFB17FF00A147DD2A1B5773ACA9635CD6CD33E44477344572AF1F693FFC3CA04B22512D3D4EF793F45BD86E33BB8CF3363518ED7AD368ECE570AD6E1C3933DAF6DB9BB7EEEDECC26649A5D91B172E8E57A3BD6AB9F82A15A6ABA59E975157B6A5AE6B9F339ED554FA4D5555454F053EFA5B51D4E9FAA73E26A4B4EFFA712AE33D985EA5276CDA159A68DAB5305431E8B9DD7468B8F795E5BE1C93688DF764F1B4DC43494C3932725A88851E86BBD5504554C4818D91BBC8C7B951E89DE9824FB257B194972A6739AE959322AAB573BC8A98E1DD96AFB4E76A6D7E957472525AA17C69222B1F2BD51151392E113E2442C178AAB257B6A69153B1EC5E4F6F62FDE5FC3CB931CC5A1869A8D1683554B6199988EF2B2752EA9A7B2DD24A6AAB42CAB8CB64554C3D31D59416DD592D450F4F6ED3B52B4EAABC6356F15F51F06EBFB2D5C2D4B951488FC6775CC491117BBFDA1AF72DA1D2C54AE82D14922BB186BA4446B1BD8B84CE78FA8D78C56988AF27EEEB5B5F8E26D97DA2397CA2223741B51543EAAF95751240FA7748EDEE8A44C39BC3AFE3E2734FB544AFA89E49A672BE591DBCF72F5A9F3C1D4AC6D110F179AFE25ED6F59790012C4000000008A800F24FAA4000000000000000000000000000000000005800054000580005800000005400120002150001200094800090000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F4614C9850960C9801564C80580C29930A40C000AA59064043C8009480000000000000003D00025E40010000B0000000000000000AA193201000003C80091E8005800007900048000000022A003C83EA900000000000000000000000000000000000160000000000016000000000004A0000400000000000090000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F400097900040002C00000002A0000000000000000000000003D000240001E4005800000000000000010000A800000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B00000000000000000FFFD9, '1', '2021-03-13 13:10:28', '1', '2021-03-13 13:10:28', b'0', 0); +INSERT INTO `infra_file` VALUES ('5e8609290e915c4fa8b08e67.jpg', 'jpg', 0xFFD8FFE10DFA4578696600004D4D002A000000080007011200030000000100010000011A00050000000100000062011B0005000000010000006A012800030000000100020000013100020000001F000000720132000200000014000000918769000400000001000000A8000000D4000AFC8000002710000AFC800000271041646F62652050686F746F73686F702032312E30202857696E646F77732900323032303A30343A30322031373A32343A3135000000000003A001000300000001FFFF0000A00200040000000100000320A003000400000001000001C20000000000000006010300030000000100060000011A00050000000100000122011B0005000000010000012A012800030000000100020000020100040000000100000132020200040000000100000CC00000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD9FFED160050686F746F73686F7020332E30003842494D0425000000000010000000000000000000000000000000003842494D043A0000000000D7000000100000000100000000000B7072696E744F7574707574000000050000000050737453626F6F6C0100000000496E7465656E756D00000000496E746500000000496D67200000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D65544558540000000100000000000F7072696E7450726F6F6653657475704F626A6300000005682168378BBE7F6E00000000000A70726F6F6653657475700000000100000000426C746E656E756D0000000C6275696C74696E50726F6F660000000970726F6F66434D594B003842494D043B00000000022D00000010000000010000000000127072696E744F75747075744F7074696F6E7300000017000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40520000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000000000001063726F705768656E5072696E74696E67626F6F6C000000000E63726F7052656374426F74746F6D6C6F6E67000000000000000C63726F70526563744C6566746C6F6E67000000000000000D63726F705265637452696768746C6F6E67000000000000000B63726F7052656374546F706C6F6E6700000000003842494D03ED000000000010004800000001000200480000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000005A3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D040000000000000200093842494D040200000000001400000000000000000000000000000000000000003842494D043000000000000A010101010101010101013842494D042D00000000000600010000000A3842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000001C20000032000000005672A68079898002D0034000000010000000000000000000000000000000000000001000000000000000000000320000001C200000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E670000032000000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E67000003200000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D041100000000000101003842494D04140000000000040000000A3842494D040C000000000CDC00000001000000A00000005A000001E00000A8C000000CC000180001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD93842494D042100000000005700000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001400410064006F00620065002000500068006F0074006F00730068006F00700020003200300032003000000001003842494D04060000000000070006000000010100FFE10DD2687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E362D633134382037392E3136343033362C20323031392F30382F31332D30313A30363A35372020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F757263654576656E74232220786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F2220786D6C6E733A70686F746F73686F703D22687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F2220786D703A43726561746F72546F6F6C3D2241646F62652050686F746F73686F702032312E30202857696E646F7773292220786D703A437265617465446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D65746164617461446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D6F64696679446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D704D4D3A496E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D3232623834663439646366312220786D704D4D3A446F63756D656E7449443D2261646F62653A646F6369643A70686F746F73686F703A64633333616566382D343164372D343134372D626566652D3133623366363839326632642220786D704D4D3A4F726967696E616C446F63756D656E7449443D22786D702E6469643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222064633A666F726D61743D22696D6167652F6A706567222070686F746F73686F703A436F6C6F724D6F64653D2233223E203C786D704D4D3A486973746F72793E203C7264663A5365713E203C7264663A6C692073744576743A616374696F6E3D2263726561746564222073744576743A696E7374616E636549443D22786D702E6969643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222F3E203C7264663A6C692073744576743A616374696F6E3D227361766564222073744576743A696E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D323262383466343964636631222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222073744576743A6368616E6765643D222F222F3E203C2F7264663A5365713E203C2F786D704D4D3A486973746F72793E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203C3F787061636B657420656E643D2277223F3EFFEE000E41646F626500644000000001FFDB0084000202020202020202020203020202030403020203040504040404040506050505050505060607070807070609090A0A09090C0C0C0C0C0C0C0C0C0C0C0C0C0C0C01030303050405090606090D0A090A0D0F0E0E0E0E0F0F0C0C0C0C0C0F0F0C0C0C0C0C0C0F0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC000110801C2032003011100021101031101FFDD00040064FFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8E35D5BCC737C2D3C9BFBFF666A389DAABAAEB92D09964A9F7C78D5CFA56B736CD2C94EF538F1AA82F96F534916762EE10D78F8E112B54DEDED35BD3EEA09B45B992D25620CA14D3265239BD8EDBCD5E6BB286DA2B8BE79A375FDFA924D4D3205B0232DB5BD4EF199998E5459C58F6A9ABEA16F71CB9114EF9125B120B8F3A5CDA026573418AA583F34D616346AB5298A09A424FF98F2DD0F80D2BE18691C4925DEBD7DAB05B61522434CAF2C51C6FBA7FE7122F60D17CBBA84175B333D4D7E6329E172714DF5E6AFE7ED22CE1043865814FAAB5F118F0B9A26F8C7F30BF306DEE7549AE2C8889391A95FA71E1499BC4758F3D5037A77ACDEA0AB47CBAE4E30713366E12F35D43F302DA14901531CE7ECCA7C72C11718E7796EAFE6ED57516663AA12A0515431E99608B8F2D430D9A677E524F3FAA4F5A9AE5822D0750978B98B8D140D8E4C63B63F9843BDC13F64532431B1F1AD0C5DB916EE72D8E362656ACB7457BE4BC3606368A13F2553F7E5321BB5F0EEDD0B6F916C0141ADD0558F5385BE2690CC5536E98B682985A4527312ABF1A6F5C9F44527A6F5255114979C48EC4E424136EE70A2D2593E54CA2516432D265A76A6F6B5FAACACBE041E995F0B319DE9DE5BFCCBF37E8C54E9FE619A075E8A1C8FE18699F88FA4FC9FF00F395FE6ED08C0BACAB6A71A302D2BFC5B0F98C890D8323EA6F247FCE5769BE63B8449ECD62F50F5D875AE564360C8FA2EC3CC5A46B32DADF898514F2F4EBD72B21BF14F74FF4D7626F1F53F8A192BF5207B785320439FC4115A4693711DBDF5F5F12CE8C0D913D857B640865CD910BAFAE46A41FEE46F95909115A6CE4BB46B98FAC20D7214C643662170CF7323C858AFA27E2FA314452DD56DE2D4F4C9F94A6B1827AF862DF163FA65C8FD1C2C11EADCA80D716F09EC33DE42A6D1472A2824F861069AB502C331D3BCB3E55F3C412795FCE9A746D05DC6CB0CEEBBD4A9A6FF3399784BA4D445F8C9FF3931F9253FE507E61EA96B145E9F97B57919B426A6C402C4D3AF866C605D3E41BBE5BAFA5230FC32DB583B90724F865D8B930CC5BCB5A16375C55AC5578E98AB78AA8BFDA38AAA2F7C55A3D7156B155EADD315560D8ABFADEFF009C6EFF00D677FC84FF00CD73E56FFBA45AE5A39349E6F68C28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF917B754FE45FBB34FC2ED532A855A803C71E1551370C0E3C2AADF5A26361ED863155D0DC52840DFC72C2A39A6893B3D0124F8D7205B423E172F227A6C401D86D9516714AB5F0D52FD80A139193607916A21A49641526A722125825DE9F335C1F4C75ED96C434929D699A6C96C434DD0F639708B519B2F86D62F8446DC7EB1F0971B52990CB0D9871BE87FCB0F341D3236D0D5B8C6E3E2981A1FBF28E17231CD35F3479E9A06B8D356666080FC7CAA4D6BDF0F0B9919BE7FD5BCC7246F2B3BB10C4EC4E3C2994DE7979AD87666AFDAE9921171331B2C0F56D4F996EFF003CB045C5931D8EF2A483F765822E3C93012875EBB1C988B4108794A034D865910C68BA38D5CFDACB0048895EF171AE4C36479A0A470A7A6580362A4738A2F877CC49C775A4724E0D32149016B354935AD71A4A1DD6BD77C7853689173C4000D282981B835EBA75A0AF8D30316FEB00F53CBE780C5810510B7617A1A7CB21C2C68DA6FA7EA011872EBE39021BC16463520EBC791A11BF8640867128FB5D46EECDD26B2B9642A6A021A6408660BEA2FCB2FCFDD73CBED676DA8D64D3C301752BEE42FCCE56437639517E927903F33746F37E9D6F35B5CC6CC69C5188FE272B21CE195EF305FA4D63FBD6531AAF4047864086E8E4B486CAF94DD3C40F0427627A64086D8CD96A5DDCDA59B81C5A07EAC065720CA52B09035922C373792515250683B641116276C6D6D61BBE6F53302029E9BE2DF179F4113DAEA124A8F54249515DB16F0CA34926E2FE49AEE5291C6018F7A54F860465161EA22FDB4CB9B1BE11ABC42946201CC9C45D46A60F8AFF00E73E6C935ED07CAFE6151B69FEA733E1CB966C6127479A3BBF21B5802DEF21BB07F772A9A2F6CB896A8B7129F492423FBC15197E12C7338F7CBDA14FB8C555475C55CDD7156B156A98AB78AA8B1353BE2AB6A7C7155E3156EA7C7157F5CBFF0038D9FF00ACEBF907FF009AE3CABFF748B5CB472693CDED5850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91688D3E8CD770BB55732D29BED5C3C2AA125C2826831E155317408208D8E02155E1B85AF4C8951CD358A7AEC0640B684DB436F56492BD16B9596615B5884496D2F7DF6CAE41B2245BC82F22E370C08A6F82213221279612262C82A46E7E599100E3CCAE5B8127C2F41C732621C6949524D42354F4A234917A1AE47306A2535D3BCDEBA4425797FA536DCC1FEDCC76FC4509A9F9B4384B899EB24952C6B5FE38D39824C1F50F30477E480698D24CAD8EDC5C8D85474E95C9C766360A4574C1CF635E9EF930D6404B3D13EA5541F0229BD72C01A26023D4B200A41E5D969BFDD9688B498A9C8A643CC30A7422BD32241B4C601C9CD0D0D4622D78559E6DA85BE9CB031A4148391EBD7EFC95A3758ABD0572A31B6611B1823A838384A95415A9D8EDDA98F09415600537EFDB070962DFD589EDEE477CA8B782D7D5877207CCE16629B36E3C4570F267C214BD23C80EE4F4C2427802690DB9461BF5CA484009D470F214276A6FE232B21980A5CBD19290CC580EB4DE83DF2B660332D27535212DEE8FFA3C9B487DB20591D9EA7E53F3E7983CB371CF47BA75B588D42722361ED5CACD22322FADFF002DBFE729E486FECA3F324A5B4F43C6EB7AD6B403F6B2B2DF0917D9AFF997E53F30E976D75A2CF1C72CA0114615DFE9C8172A322F48F2E1BBD5F477844BCCF02EA6BE032B937028CD596783CBD6EAE486690291DF2A6C890F3BF35C434FB6B478C9AC8A0B530D37C4879A9BFB99670B1D41AED5EFF2C0DE0B228A4BA8602D3935603D3A78FD1912CE554CFF004DBBBDD461B5B6949F4D3BB6DFAF32313ABD48BE4F08FF009CBD8E0D47F29B5582DF79B4BF4C311B9F889E99B081D9D0E789B7E39EB9664FE87818D4B86E5F7E5A1C5029425A239806C20F8732B0726190DA1CF7CC86A531D462AAABD7157375C55AC55D8ABB15506FB47156B155E3A0C55BC55FD72FFCE367FEB3AFE417FE6B8F2AFF00DD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91745DBAE6B5DAA0270038DFBF4C557A007DF1B569937DBBE025217C042073DC654C931B4B9E50CA83AF638153ED2A660AE69F7614A367BA58ED6466DC57BE210497946B3748D33508EB930030322C65AED519B7A6D930C0A4B25EA976A1A6581AD2C9AE872FB4704D38D012DCEFD72B6D40CD37A94DCD07BE2CACA024DF7F0C56CA8140C8FF00BB32CBD8569F0F7CAB27369C922D18005B7B89916CE2B561340E5BAB2F4EB92C64B5D943DB5FDB89F5295B5385DAF559A094950D1CE7B04AEF99B8C2D95595FCC31E95FA5A2F2DEAB79369A4C971E6692CA54B64886DBBF1E1B7BE654698F1747A07953F25FF00357CD5E47B8FCC3F2CF921F5AF26DAC924BAB6B8AEDF686F20A01B713919D1482F2ED2EE9AFF0053F4EEAE9567B5774B4D35A8AB291B1591BF678F6AF5C85320537786D4C727D62D7D2746ACB0024AAB57E1A37BE16C1BA0A592333C1F5AB6956F6452D6B040A646283AFC2B8B2D91111FAC46DF5AD0357B7907FBCF3A594ADC97BBF4ED8D30F103505E5DC61A19341D524914F1B6B916725593FDF9C698D3094C2BC17577C9A69749D5DD17E004584A7930F1DB6C698198519259239ED629ECE48EE637F5EE6CEF94DAB7A0DF64D1E87010C6D165EFA492CFF437FCEC1AD7982636B06996E39B2843F0A8095272AE0B6424C9F59F2D79A3CADA9E9BA7F9E7C8D3686FAFA7FA33DD1786BC056A3985C85331262333C3A54F76F7BC648AB4B360D5AF80195D16C12513E60D2CD80917D45D661916331703F0A31DDBE818981642749BC3AE6906375955CC900F87512A429FE19594FE60222D35781D3EB68CAD1034926660015F9572B3129FCC840C7E65D1D24BEB4B581E196ED089EE402E021EE32070CAAD7F3211EFE61B4168AB6D299934E50F75301F184E8085EF90F02523417F34193E95ABBEB4AB7361A9FA4427EFD88A72403A53C6980E92498EA8047DBF9C7CB567070FAFC915C4CE561708580643F1127B54E0FCA49C886AA2CCF4DFCE48343113DBF98273C2842D0D36FA71FCA172A3AB8BE9FF00CBBFF9CDB4D1FD0B6D435C905A2AD18F0A9FF896425A434CA7AC14FAC348FF009CD2FC9CD42C53F4D798CACC46EA631D7FE0B043465C6FCE29EAFF00F393FF00939ABD91B3B0F33299266A44F22AA8527BD4B659F932D90D6EEC1B4AFF009C92FC948F548E1D6BCDBEB7D5488E20B10E0B20DAA581E9954B4843B0C5AC0FA4F4CF3168FABC116ADA4C424D0EE943D9DEF51231DCD3B653E018736EC9A8E21B326B4D5ED26FDD28E20EDB6D8D535DDBC63FE7231043F97F76F6EA5FD68D8B83BD681BAE646271B34453F1A350B93EBFD65BAC723023C3E239B1C54E8B53B294BF1309FB5C0E4332C38504337F1C2CD662AAABFC3155F8ABB15587AE2AD62AEE15DEB8ABB80F1C55DD36F0C55D8ABFAE5FF9C6CFFD675FC82FFCD71E55FF00BA45AE5A39349E6F6AC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90949CD3DF35AED52FB89CF2AF7C55B86E091D7E78AA21AE147461F7E02A39A924D50F534F0CA99A334E620B96D86F4AE054F2D6EFD2473D3C3154A750D59DAD254AF1F88648734179BDEDD33C8C49D8E4C302C72E27356DE9930C6492F362E77DB26D6A44FC66A69B7538CD38D42523B1FA72B6E435483D7156B155F63A7CDACEBBE57F2EC774BA6C5E65D66CF4A9755A8E708BA9021600F600D6B93C70123BB466354FD9DB4FF9F49FE51E9B35B5DF9C7FE725E596D2C19259EC276B48A07400311EA48EBB7C865808ADA838F7BBEA8D27FE704FFE70B7F2CBC93ADFE62EB5E4ED2FCFDA1F97AD1F53B8D68CE66458A1AB332885B893F4E5D007DEA4EFDC5F217E7E7FCFC07FE716353FC95F327E49FE4E7952E35AD3FCD1A73D92DB5DE9DF548AD1A421898DE956229B1CBE2A0D9B7BB7FCFBAED6DAEFFE7DEDABC11C097125CEA9E608E58A641C5CAD0F02C474D8EF91931E27CE5FF386BF901FF38ADFF3939F947F9A5E46D4AC20D13F3DE4D4AFA3D5B502693D8AA5C31B692CB911EA29FDBA74FA3229E2A7E6C7E75FE48FE62FE43F9FB55FCAFF003FD93DAC31B9934FF32509B7B8B752CD0949A9C492805403D7037465694FE5779EB49FCAEFCC9F267E62EBFA147E6CF2EE9F1490DDE9774291BF26A6F8B2E2EAFDABFC97FF009CC4FCA9FCF4F37697E48F21FF00CE3B5ADDCD7052DF51BD5B3AD9D9DB103D4066084034DC570B1E305EEDFF00393BF9B5F917FF0038B736896771F9223CD9E6AD663E3A258D869FF588BEAA48520BA275A9D862C38DF24AFF00CFC07F285102BFFCE28EA5A6B472F2BE54D1A4243F7A829818193E5CF2EEB1F945FF0039A1FF0039BFA5493F92469FE42D5B4CB5D2E7D04C660314D0D43332281435070B0326BF337F28BCA9F919FF003F16F267E5FF00E5ED82683A169F269B7D6F08FDE822E95988A3D41D80C89E4CE25EFF00FF003F7E5B6B6D7BF216FAED56EE1B8866F5D446B172F848FD803B9CAEB9B3069F945A4FF8720F3D7902F7CCBA4407CA305FC0757B66735684CAA5B90FF572BE8DAFDCAB4F397FCFACEEF5A9560F2669B26AD218AD25536AE12579540001F528C7B5460970F716278AB9BE8CF3FF00E497FCE0E7E5E7E5C69FE7AF387E5468DA6F90EF8441677470419BEC02858124FCF23C239D7E3E4E29B7CC49E6EFF9F50CE925A2F93B4A8B4E1113C84120527C38FAB5AFD3938C224F543E93FC95FC95FF009C13FCF1F2BEA3E60FCB0FCA9D1F52D0EC646D3EEEE9E378D870A93D5DBC32D18815DDE0B79E65FF009F5A683AA6B3A4DE792B4AB0D6B4B9A7D36FE25B7763CE0AAB0E5EA53AFB75C9C71041BA7E10595CE9716ADE686D3E258B449B5DD4A4D123AD185A191BD15A7871A65BC23AB5926F67DC5FF3827AD7FCE27E9FA779F3FE865346B2D425D52E61FF000CC570865F4A341FBDA85652A49A1EB8384364645FA0ADE64FF9F54F0E2FE56D1154776B7907FCCEC7843689C97DBEBFFF003EAD240B6F2B684EC4D14185C024F6AFAD80C026539232EB55FF009F5B229F5BCA9A1AB20ABA7A7202A3DFF7DB618E30D5C459F7E5FF0090FF00E7DF7F9C370BA2790BF2B6D35DE5F66FADEDE6FAB236FD67595941DBBE1300CE32931BFF009CC4FF009C6AFF009C4DFC9FFF009C73FCD3D534FF0021E85E59F375CE85247E5495A765BA92F792F130866DD857B0CA66221CAC5399237D9E1DFF0038E06E1FF24BC8D6FA85CDC48EB67037D52742BC18C62AC09DCD7357A900BB9C123D5F4B695A658ED26C48DC819824539F1281FCC5F2E5A79A3C9FAA5A7107EAF03F15EE7E16E99386CD59793F083CE5A73699AFEB5A5BC6D088677081C52B466E999F8CBA3D4C5283B5B59A9054AA1A5733226C38110866FE39364B315545FE18AAFC55BC554CF5C55D8AB5CE9B53157733E18AB7B9DE9D715750F862AFEB97FE71B3FF0059D7F20FFF0035C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EE4B96A57F0CD6BB54BEE6E4F2FD78AAE86E01502BB62AB1E41CC1F7C05211724A0FA7E1953247B5D0458CD771D302AC9756E0B4AE2AC5EFF0053332B28F1E9921CD058C5DDC9A1C98605209A72C684F7DB2618C96890713936B5093F7854786F8CD38DBF476F6CADB96AC542DF462ABFD318AAA691E55F3379E7CD9A1793FC99650DD799AF254BAD31DD8AC8AF1B7C3C69EF976201C4CE5F60F993FE70D3FE739BCCF6ED6FE636BAD4D0A7A0BA64974C55430141414FC72EA01A2CBF643F2F3F273CFDA2FF00CE0F79D3F27751D3560F3D6A7E56BAD3AD2D236678CCF22154058926A49DF7C9C764136FC52D1FFE701FFE72CB48B23A6C3E43D327E0C6E11A590B4CA587B532C0520D3F6A7FE70B3F25FF00307F2DBFE70CB52FCA9F37592691E78BBBFD6E6B3B02DD56EF8984D76EA01C892C0C9F94DF94FF00F389FF00F3995F93FF0099EDF98DE46F2ADA43ACF97B58B9B9BFF5A5741716D34DCA84568C0AD6981417AE7FCE7FAFFCE51FE6E79534AF35F9F3F2AB43D1FF002EBCAD1B32EA1612BCB7E1CA1F51AE118D5072AD074C590953F38FFE71DF41F23F993F327C9F61F9CBA9DDE9DF96FAE3B23DCB201688E1C22891CF40316CE27EE04FFF003953FF0038D3FF0038DF77A57E43FF00CE2AF97F45D77F31FCC37D67656F7518A6957724DF097B9BD427E3626800C58195B18FF9CAAFF9CCDFCF4FC80D7BCAFA67E687FCE3DF94F59BED56CC3691AFD83497715B5C16A2A4323861EA03B85271636FABFF002FFF0038507E40CFF9F1F9F7E46D13C8B05BDA9B9D3F4E4445935042AC10CEACBB48C69B0C5812FC5DFF009C15D5A2D67FE7381F58D3AD6DADAD7CCBAE5CEAD690D688B677723CB1C6941D830DB16264F56FF9CB6980FF009FA17962F26790A01A3C56CD08AFC512BA95FA2BBE25B81671FF003F8D92E6E35DFC86B458964B3FAB48F6A53790B537046408641F93B24769776F1C5A8D8BDC5E5005AA9AD32A21B8153B8D1ACADF59F24FD5E27B49CEB5640015A8FDE83B570034CB9BF793FE7E412ABFFCE01F962299A79644D5F458DA471425D6A77F6DF2C8C6A9818EE5F822DA1697A868B63A7E97A1869E3B413DF5D92F5F5075EF84367007EF97FCFA0C347FF38C9E7F8608E44B9FF10DDC61C0FDA11353EECB049AB806DF17E12F9AB47B1BAFCC0FCCEB8BA8DA7BDFF156A70A3396A02262C6BBF8938253D9B3806EB5E3B64FAAB416104933FC0DC4D7EC8CC7F14B1F0829A683A75C3FD616C230D727F7CA091B8F91C7C52918C27967E5AF2D4C04779A2A4DE22AFF00D71F14A784226DB4BF2FEA7AAD9F93BCA1F97771E62F34DF4C9FA3B4FB38E4964E75A091954D4283D4E4A323252007E937E427FCFA63CE7E6BD624F38FFCE42EA16DE50D126845CC1A268937AB24A08A94B9E6D5414EA2B970B69343DEFAFBF303FE72AFFE716BFE708FCA571F975F92DA2D9EB9E72107A561A1E8CA67B496FC01F15E4C0B1526A6B4C8CA7B338C093BF27E59F9CF5FFCCAFF009C81D6EDBF31FF003BB537D6EE21B8F5743FCBD8E42FA6D9467EC96E276A53BE60E6CF5C9D8E0C3B6E1F657E5BFE6369D731586871B246D63122D22A1B745A50468C07ECE61711939F5C2FA534DBE8E15925460EAE054D72328B7C24CC22D5AC61D12EA696CBEB7CA290B102BC7E13918AE4E4FC43FCFDBED3F5AF3EEAA2CE0F41D256DA94A6ED997093A7CE1E1FEA48CAB1C8FCFD01C57D8667623B3AF229D96A1D8ABB155CBDF15546ED8AAC1D3156F15770077AE2AEE03C7156B9D36A74DB157733E18ABFAE6FF9C6CDFF00E71D7F208F8FE5C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D34BC51D4D0F8E6BA9DAA5D757887900C2A71A55B6D7229BB0AE34A897909F881D877C041506914D7085128E2A32AA2CB88285DDE7100A372E23B634578825125F3B6DE3DB0526D0734E0296AD08C9008291DD5D541EF920C0A4C65777FB27E7930C485FCC81BFD3930585174720E677DA9824530148B0F5141BE41B2D48B91D8FCF15B6BD4C56D917917CEFE6DFCBCF3E68FE74F25D8DA4FADE8686E21BDBD1FBA4E07970AF89F0CC8C3C9C5CFCDF7349FF3F5EFF9CA09EC6E2F7F40F96EDEE2C9C5CDC4A63A3948C50D169EDE39750B71DFAE1E46FF009C8DF3C7997FE70D7CC7F9F77D6D65079CF43D126F318B287FDE7668D4B05229D0853DB26021F945E58FF9FADFFCE5A79B35516DE55F22681E62D56E938AD859DA9967DABFB0057B78614BF5BFFE7113F3E7F303F3EFFE71A6FF00F34BCD7656107E6269DAB6B5A78B38978242DA7FD8475A7C2DB1A8C04354DF9BBF941FF3F0CFF9CA9FCDFF00CFA87F28345D1BCB916A1ABEA975A7BCB321458A3B4765E4CD4EDC70522934FF009CF1FCF6FF009CA8FCBB54FC9DF3CC3E4CD4B45FCDAB77FABC1A0167BE8560F85BD6561F0D6B51F2C5987E547903C85E7FFCE1F31E95F90DA75CE97A4DCC5234B6925EBFA51B3F2E410B7892705864FD16F257FCFA23F3F26D7B44BFF33F987CB7E4EB2D2CACD0DEF97A57FAFA5C210D14B5634E4AC01AD70A0BF577CE1E75FC81FCA3FCB5D0BCB7F9F7E7DD07F32353F23411CEF26B7325C6AD737D0F499537AB531624BF32FF00E7323CE1F9DBFF00392DF975379D3CA7E4D9FCB9FF0038CFE50893559ED75188C37B3C51FDA96341406234F84E1A60FCCAFC9CF2BF9BFCFDF9CDE47F2C7E5B79864F2479AFCE0F1D9F917558E43088E40A5C7AAC3703883D31E140897EB27E5E7FCFB5BFE727B4DFCF1F24FE6C7E63FE61689E709343BC49F53B89E691E765414DAB4AD6B5C69B86CC2FFE7EF9AD68DFE37FC9DF2EE8BA9A4BE67F2DDBDCBEAF6D237C36EB22928CDE0180DB2259805F3C7FCE28FF00CE04F9B3FE7277C8B379FED3CEF2E942398C3C1E42073EA05011EF913BF26775CDF5A68BFF003E80F35DB6ADA36B1ABFE62B5E3E957F6F77F57E65AA20903D055BA9A5300891D14CC17E927FCE507FCE31CDFF003909F913A5FE4E5B6A8FA49B39ECEFCDFF00EC97B4D954EFDF2C0C0CC9DDF9B23FE7CF5E6CB5D3445A7FE68CD0DDBB5651EA3052BDD766A644829F10BF463FE710FF00E717AF3FE717FF002A75DF235E6BF36A771A95F4DA9497719F84348A568373BEF954C90A245F9F1E67FF009F44F98B5AF37F9975FB0FCC06B6B3D7B50B8D4C42F211F1DCC86460C037515C4094BA289D17C03FF393DFF38B1AC7FCE29F9FBC85A4EA5AE9D56D3CC32395915890415F72727E1D06CF11E5115ADBC0BC0ACCAD3B3189E9B75DE990E109E22AF02A25CA98A4775EE7B60A0C6CBEB5FF009F6E24C3FE73B742F456393FE752D5CC824EC9C7E265F714DB2E8061225F657FCFCFFF003C3F35FC97E6DFCBAFC96F2179A27F2BE93E74D264D47CC3E6289FD3B9611CDE998B9D3BA8E9965048912FC9FF002E796B4CF2F6A1746D8A5FCB75704DF6B7A99ADCBC86A4C8A6BD77CAB200DF025ECD06A30454B7B39648D29FBFB81D251E0C7C335D962E7E29109E69570F65730DF69E56CA20DF15B45B4751D5BE6731E31A72B8ADF587E5979ECDFABDB5F5C28E2005E47AFE18261BE05F56793754B6B9B7BDD2DD11E3BD8D979B741B532B00B39BF217FE726FCA5FE19FCC1D4EE238EAB732332D3A1A96E999100EAF5043E588DA30F351BE22DF1A9EA0E67E2D83AD9157A1F0CB98BB7F0C3452D12075C08B5CA46FBE2AA8C46DBE2AB01DB156EA3C715773A6D4C16134EE67C31B5A6F883BD7AE3687701E3855FD72FF00CE367FEB3AFE417FE6B8F2AFFDD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87A96FEF941ACBF8E623B3B0963DF5F16DA5AE34B611515DDF541F571A5D9318B53BD42A1E4AA7ED2E0931927706A3CC0E9BE52D61166E7638B38A5E6EBE33D4E2D8103717049C52833FBC23155616C42F21DF15434B1D3B62A868D7E36F0F0C5894746A3DBE8C582BB461BE43155168462AC93F2FBF2CFCE1F9BDE7FD1FF2EBC9776965A8EAF19905C4E6900A1A7C7976271B31DDFA2BA47FCF9FFF003D7597F43CC9F997E58B4B688049A0B3123CA57AD18AEDF7E640F268B7EC4F907F217CA1F937FF0038F179F955E75D6E26F23C1A335AF9A359B87280447FBCAB9AD12872616DF1CEABFF003963FF00381FFF0038BD6BA743F96BE5BD23CF9A8D847C5755F29411C972838D2B3CEC2B5DC8241C905B5BFF003EB4FCC58FCF1F979F9AFA45BDB470DBEA3E63D675CB68140E5026A2EC544B4EFF00150E4BA2F0DB17FF009F7DFF00CE324FF963E63FCDAFCFEFCCDB44B09FF4B6ACDE5AB8B8F84DBC31CECCF23927F6C74DB010CB81F96DF9DDF9D7FF002BE3FE7253CE9F98D6F74D045A7CCD65A2E9970D50A9033C3CA01414E4054E56436C616CDFFE712FF28FF257F327CF9E6FF31FE72FE7149F963AB796353B69BCBCB6F75F56B8942307356F0AE459786FD51F38F93BFE71CFCE8D7B3AFF00CE71F98B48B4344BB5D3B5DE01005028483E032A32A3CDA4E2277A79DF977FE7DABFF388BF9C724FA9681F9DFE67FCC6BB8EA6F35A1A8ADDB0A750CEC07864F8C745E0A7D95F97BE4CFC8BFC81F25FFD0B3F99FF0036D7CCFA7F9B4496BA47977CC577EBDF4905C8A0B58A951C00FB2B931913C07B9F1A79AFFE7DDDFF003895F947E615F32F9A7F3CF59FCB2D465BD7B8F29DF0D405ACB64ECC4AADAB863C4A5683DB26269AA1C932B9FC9FFF009C6DD4E4B4D31BFE73E3CEE249C520787CC4435C9EA55985795326770C385F15FF00CE607FCE3DFF00CE35793FC93A9FE677927FE722AEFF0035BF320CB15BDBE9DABEA02FAEAE854A30AD6A780ED95C837C075A7C55E4DF31FE71792B429EDFCA5F991ADF923465E12CD616174D00776151B2E634B6673887D0DFF38F9E6FFF009C92F3EFE7CFE58F92FF00E576F99F50875F9E3D66F2CA5BF77A5BD9C80C9148A76A3807614C8F38DD72712517E82FFCFD9BF3BBCF5E43D53F2BFC95E46F376ABE50D47CC9A7CBA8CF75A64ED0168E297830629BF6F1CB9B7146F67E4949F9B1FF0039096D688A9F9E7E6F8AD66FDFCB72DA8CA013ECD5AFE382DCA9C283F6FBFE7D73E78F3479EFFE71CBCEFAC79EBCD5AC79AEFB4CF30DDC2BA85EDC34F27A0B192A159EA695A9EB8251704737E2FF009DFF003E7FE720AFBF30FF003022B5FCE7F34697A7DAEBF7D69A7410DF3A2450C729F4D68294016836C31A05CD8E332890C035DD5BCF3E67D574EF30FE64F9EEFF00CECFA07C7647509CCECBCF614AE4E73586911714D00BE54BA9663752A97D3E2AFEEC022A6A3E5989293951D3D2B5AB7A48ED5FDAFE3862584B1BEBEFF9F69C9EA7FCE75684C3FEA4ED647FC933991170F2C69EDFFF003F6FDFF3EFF26475FF0070139A7FD1C60916A897C11A8C06541DF8C9CA998F22E5C0A7769767EA8B08FD9ED9448B971679A34DCA08E393ECD77C85B75DB34B4D4A5D2EE2196CBA0209A64245CAC6FA93F2F7F32121B8B35B9702BC565AFBD3DB220B64F93C6BFE7316D6CB516B1D6AC183B3AD5A9F4E64C0BAAD445F9DD35A43EA99631F13EF2FCF2FE275A614A6E782D075CBE05690E243D3DF2EE882BC0E79596B937C78ED819479378B2762AEC55ACC79736D1C9BC4312578CB43592EEB920C097F5CDFF38D9FFACE9F905FF9AE3CABFF00748B5CB87260F6AC2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF864BB048AACD51DB311CEB4BC2B147612EE01C56D17621DC0AC98ADA65E8307525EA2BB8C124129D5B45D38F4CA501306040229D716C8A58E28E49D862D88571C9F6DC629548E36A8DB154D235AAD08E9DB1541DC42687E1FA7154A1D5D0F43BE282A91C8E0F4C58F0A3519A9BEC3B62BC2B8891BA2938AF0B21F2279EFCFF00F94DE7DD13F323F2F2682DBCC7A3AFA3682ED3D5818B1AFC51F7CBB1CA9C4D40DDEF1F99FF00F39CFF00F3963F99305EDCF983CE163A19D22DDC48BE5D88D8BAB28AD1F89353F4E5DC40971E9FAFDF975AC7983CE1FF003EDFFCC2D67CC3ADCBADEAFAC793AF6692F6F5CCACAEC87A96F0C9476B5A7F387A7BE85A5F97E686F0C4B71A859A08A7863264776DF812A09AEFDF240AD3F707FE7D29F951F9A9E58D67F327CEFAF794AFFCB3F979E6FD06D2D74586F289F5A962209786B4A13D6A72D06C289D3D0FFE7EADF9D7E75FCBCFCB8F2D7E4FF95F4E9747D37F3126922D63CDB6EA5623146D510C6CA2AAC4FDADF7C494F1EEF91AF7FE70E3C83AA7FCE05F92BF3AEF2F5BC95F997E5B8A7B89B5A998AC37BEA48591645EA49A0A13EF9592D8323E2BFF009C7CFC90FCC1FF009C9CF3F6A1E5DF285F695A3F99A0478754D4EFA15781907C3CD50EF5A6F91B6632ECFD44F20FFCFAB7F26BF2AB40D53CD9FF003943F98B1EAF1E9122DD31D16E0D85B451A7C6C6757AB301DE83A60113F0419DBEF0F30F9D3F2CFF00297FE7157CDDF985FF0038E51E8F77A2E99A34D3E87AB584002CA507C25DB882FDF7A647C2A533B3BBF9ABD5FCC1E62BDBFD3BF38B52F3E1D5FF00332009E6CB79656692289588A59C486BC597C06110A62723F717F317CA1E4DFF009F8A7FCE1B683E61F29DEAA79DFC9B6E93C371250BAEACB12ADCC53746E24D763921162676F3AFF9C76FF9C4AFCACFF9C2AF256A3F9DDFF392BAF68DAC6BB25AC8348D2EEE1F56DE1050845489C37C66B4AE4B8D1C4FC98F3C683E4FF3F7E6A7987CE9A0F95AFF00CB7F97BAD5E493E91A34D227AD21690B17B72BF654D4103C32B3367E3523BCC3368DE5ED38437CCF631C29EAC4D72DCC48631544A0AD49A532A3BA7C6B7EAA7FCFAF3F21AF74CB6F31FF00CE577E62D9AE9F1EAD6D2BF93BD61C560D302B7AF32F2A5140527135F00C38ADF0C7FCE507E6BC1F9E5FF3923E60F3559336B1E4BF277ADA2792A590F34B9B5726B3475EC1AB91F136761A7C24EEF13D4A2B98216F556DEFED9374B08928CA3C0D76C7C47272E2D9FB2FFF003E9130C7FF0038CDF98534B0936D279BAFFD6B75D8AA08A9C7E8CB89DBE4EAB83D4FC42B8373FF002B0FF346E6C618E5B6B7F36EA8E7D75E4157D634041F0C864950761A68F34C66823B9FAC35E7A572978ABF0C0BC42537E99852CCEC052AAA97948E11B154E30923E3000EC721E2309CC24B3CE90432F3902146A3D4F427A65F09383972D3EC4FF9F65C7327FCE717971E44204FE4DD65E13D792F03BED9990E41D74F2713DD7FE7ED2449F9FF00F92E10F22FE5F9CA7B833E5732B10F862E5828B84A5655AD5331E45CBC6126D3AF59262937EEF7D81CC79172E2F55D2984B0523352AB5DB204B918E36C8F4C9E559024919604D2A72B949CA80A679663EAD494CBE9348414FA32024DB241F9EDEF35FB18ED9C35C431A101FA819938E4E0E585BE39D634AB9D26FEEA39A268D2662D096EE3DB2EE370E5898E354B6FF7E6463938D38D34D18D88FA73281D9C5915363C7A76C8940709053734381B03B9A78E2AB81077071575478E2ADD3C329237656EA1F0C900C495DD865803592DE4A9812FEB9BFE71B3FF0059D7F20BFF0035C7957FEE916B96057B562AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF86BB8802C67311CBE240DB460B32F63B1C57899159D94483A7CB15E25595139003AE465C97891F6DF00CA9215659878E2D914A669013D6A7B62D81411BE21E18A519137BE2A8C57A6F8AB52BD57DF154A6615A629014E35DFF008629A469140B8AD2262C5682DBA92EE182EA4897D5B636D227A6366F588F8581F6C944B46585BF40FF00E70A3FE70BFF0024FF00E723FF0029B5BF3279AFCCB2E85E6CD3F54FD1B7D1CF7CB1F2A8279716604E5FC449B718C2BA3F4B7F3B2EFF00283FE71B3FE7103CF7F9456BE72B18EF350F2ECFA4796A059D267BDB87144850231219B975392053E1DEEF8D7FE707F47FF9C0DF27FE58699F9D5E7A920D17CE3645F4EF33E9FE629BEBB0472C5F6A58ED983503B74A0C9DA38084AFFE7217FE7E75E7BF365C5E7907FE719F438FCB7A1D9BB245E63302FA77D68A6A9F554D84551B9A76C78E9A678492FBA3F267F36BF20BFE73B3F246D3F2E3CE2F6ADE69D3EDE14F3568B7AC8B7B693DB95E53432C86A3D4707ECFBE0333C988C469F327FCFCB3F353CABE53FCBAF26FFCE267E5CDFDA3C1E60317E9B4B77594D8C5624344ACC8763215A1191E3A663097E57797752F3AFE5FF9C6C7CCDF943A9C9A0F9CF47B37B69ADC3304BA5917E290814069EF94F8AD834F27D89FF38B3F927AAFFCE6FDA7E64798BF3E7F37350B297C93A92E973E8C3516B68AE39C65D8B46CE015A8A5732465003038E4FD4FB9B5FF009C5EFCACFC8DB6FC88F3D7E61E976FF96F73A61B09B4D8665F5F8B1DCB4D11635DFAD301CF148C322F85A05FF9F51FE534B65AAF9524BCF3E5F69779EB5A587D6E6BA592E54502399556AA41E94A644E701B069645F0D7E4CFE707E71FE4DFE6779E7F353F27ACA7B7F2BDEEB5777FAA7901F91B67D325959D04716C81E8C454657F9A8B68D148F47EAA587FCE5D7FCE207FCE64F97A0F277E7DD8CFE44D68148A2F29EA333219A56D898E455E2373B03F7E40E51F51E5E4C65A390DBABF3FBFE735BFE7193F2E7FE71D6EBCA4BF931E6B9F599BF306493F44F97BEB7F5C7B6892AE2854B05A8A0C81CA48B3C9A8E9A47A24BFF3851F919E41FCF8FCE08BCB7F9D5E708F47BEF273A5EE8BF97374C527BFF4784AEC676A2B2AF75EE36C1C6472EBD57F2E62FB7BFE738BFE730D64B5BBFF009C5CFF009C7DB8B4B9D4AE02D96BFAD6931886D349B68C7096D02A1E279A93BAED8F89E9B972FBDC8C7A49134FCD7F2F791E1F2BD8A68176E65963AD2F474AB6E687E67304EA2CBD060D36C9D5FF00962CDEC2E4C7290D6F197694577A7CB271CD6DB9F4FB3F537FE7D471DBC1FF0038CDF9836D79756F682FFCD9A8A47EB4F1C6DC425391566046FE39B033B1B793CF4F170CC03DE7EF7E383E88DABF9ABF332F6D2329158F9BF538A57471C64549295DBED5731F3CEA2ECB1E2B0B64B2FAB6DC295ED9A83959F8450935A7AA80863180EB571D695CB2191AE78497A47FCE3F7E527E5A7E66FF00CE4DE8BF97BF9B2B736BE4AF3858DC5D45789762D544B6F1928399200E4453E9CDB69C931BBE4EB73E120D53F757F207FE70C7FE718BFE71AFCE927E65F912FE4935C165716D61ACDEEB114F0C16970A04CA23671527C4666125C2188F73F2B3FE7E3BF9A5E4EFCDFF00F9C87FCBEB2FCB3F30C1E6A87C89E5FB8B0F31FD554D22B812972BEA74AD08CA67CADBF1E3DDF31DAC4D05A3A188C69337A8439E4E1BFD6CC69173A18924F4C0BA048EF98E4B950C4F51D01855631D5C01954E4E4C31D3D46DF46944493053B8AE63CA4DA229835ADEBC6A5222C22EBB64449245AB5B5C4A54C33C541EF9938E4C4C2DE59F9A3E5C4BCB14D4ADE3DED50AB53DF2D949A32627CC778E915B014A4B5A1CC8C527559E348462CA23AF565AE6C22EB25CDCA390DFB64CB3839A315C836114B7D35C50EA53618ABB155C1C014F0C8916825AF572403025BF532603025DEAE5822D64BFAEAFF9C6B35FF9C74FC823E3F971E55FFBA45AE0661ED78A5D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF881BC880420F5CC3E20E424B0A857A1EA4ED8F12B24B50B4218D31E20AA8F08670CBB9ED809B0A39AA03C41076395F0B604BE5662C6870F0B30504E1C9AD31E165C6D29E277FA7070B21205171354FC382928CF8A83E78D2B8D698D2A12406B8A625A8D0D7A6D8B2B45B23300145698AD85F1EDB1EB8ADAA4A225884FC4CD3AB045B6AD0153D5BE8C429A2868F47BB86133689E66D47465BDBA56BFD32CEE6585789FB529E0402465832531E005338FCBB6FA84CE751D4B53D461B17E766D79772CEAF20E8C15C9030F8BDE98E11D11F0795F499EFEDAF6F2C266B595F85D69026222007FBB997ECB57C30F8C19F83BDB33B782934292BC7E8C4ECB672C2823F4231B2D78815DB6CA67985B64710EA91EA7E5A437115F68D25EF97EEA32FFA4F52D3EE5EDCDE06FB3511914E390F1E9B3C081768DE5FD3ED8FD72E26BBD7F5E0DB6AB793BCAF427B1724ED909E7B671C1001E86B6EF2DC590922A49044CAFABA1E2483FB240DF7CA8E50DBE0C52883F2E6D4EB125EC771AA59E917959750B0B1BE96DBEB128E858C64549F7CAFF3738F271A7A404BD4B4AFCA0F20CF6D75A85CD86A90996129159DE6A12DD0527BD5C9CA726AF24F9B762D180ED0FC95E5FD05E19F4BD0603769271769155C18BC68475F7CC796693B0C7A50F52D3ED674B48A28163B4912E1A66754142ADFB0C0751EC72BF1A4E6474B163FABFE5BF943CCB3DC5D6B1A12EA3716A39D98B522DA49246EB491402299911D4D7544B4B1287F227E4F59E81AD5C7992EAE2F3EB112D346B2D46E1EF7EAA0FDA0A64AD36F0C9CB59C5CCB8FF901D143CF1F94BA579AAE96F74992E3CADE648DAA3CDF6933C721435E6948E8DF1034EB9286B047CC2FF2782ED17F2EB4DF2AD9BD969566F737F74419BCC533F3993F9B9330E4C5B213D582092E54745188D833187CB62EAD134DB88792A75D40F53FC73046716D98F152B4FE598AD6DD2D6CC85957EC5CB0A807C48EF96C753109CB8F886CF269BFE71FC4B7D793E99E62D5B4A17B5B899AC6F26B783EB2E7E26F4A3206F99B1ED1A157B3A89682E5C54CA34AFCA7D23CB5A63D9C76B2DDDC475996F4C86AD3B7DA771FB44FBE5597571946ADCAC7A7203CF75FD0E64998087A1F8B35E32370D384AE0D338C0E49F4DD47C2C45687B6646292CB00609E67F2EBEAF0D8DC5DC93DB6B36CFC6DEFEDA5689E28C9F8802BBEE336DA7CDC2E0E7D2C65CD8A6A3A0EA36B2B45A7F9B35FBC8C7C715BFE91B85141D57ED77CCD3A814EBB369611E5F794CB42B39B42944DA3DD8824D64F3D75661EACAA4ECCBEA1DCE512CE1A2189EBB1D84090ACF0C6C2D8AF0F58B16E4DF2CA279A2E6431A0534EF527AA2D77CA2598391114CF346D3E7867B762945E42B944B286FC71E3E4FA7F44D352F2C21089CCF115DBDB293305B0E0932587CBA3D27458E8CC3714FECC00B0F0A439B17D4FCA324619C2D3AF41FD99930986420C0753D0A76B1BCB59D39C12EE58F63965F1726196161F1E79A3CB8D63A8CFCA32B6FC8956CCBC669D26AB1960ECBCB91614543C53E599F09874D381054A46F4E95D81E872EE265034A4F2F1343D698096C26DAF52B8A1557703155C411D462A8377F888AE203592B79FBE48062EE7EF93B6041772F7C9713120BFAF7FF9C68FFD671FF9C7FF00FCD6FE54FF00BA45AE066393DB714BB15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8779E6690D0E6BDC86E0B62C55A9D0D6B8AA7B1454C555F8814C473508693A9CB59A5E480C49E98AB4CE9E18AA1A465236C05945742699536F1047092A078E2B61716DBF8E15B08391B7AD701482A9130DB026D16ADB1FD78ADADE4395715B5CC6A062A9859FD93912D914FACBEC37FAD95C9BA09CC1906F8A6B0A0645AF8E565124EE5B5E56640EE320531482C21F4EE0AFF29DF2B9330CEACE0F56829B9C8368E4CDAC6C8B24629D3205B22F49B3B43FA35969534C81722095DBD8BF3A50F5CA8B97065B6766FC7EC91909392190E9DA51E60F1A6F539510D822C94E9842EE2B4182922294BE9CBBFC3DF1A6D10413E9C95E9808D9918A3AD6C100A53AE505ABC3569B4C47A10BB8C57C3455AE9E00E9D714786EB9D2B9A3F14DE9B62830A0F10F35689708F3388C77C945800C0A1B0924B69D5D00DF7CCCC658CA2C43CC9A64B085600D3332127032879C5F44D1D651B3014CBB8DD6E68EC9569E93493D373BE4096BC707D0DE5ED224BCD3238D81217E2194CE4EC2186C27B0F95E4120223E9ED98F22CCE9CB2BB2D12485E12E869514DB2B3272F498082FA3BC976F1FA31C6CBD80C00B9B2C4F5CB6D22065A85FB5D72C12689E35F75E5C826423D304E4C16838DE5DE70F28FA16FCA18FE12A4B003FB332B0C9A270A0F913CE5E598A54B82F0FC42BDB33232B755A885BE51D7EC24D3EE1A3E344EA332A05D2E68531CB9903428D5E99931710841897950E5A98F25656C595ABAC805315B5479401F3C56D2F91FE33BE4C354B9ACE7EF8B1773F7C55DCFDF157F5FF00FF0038CFFF00ACE1FF0038FDFF009ADBCA9FF747B5C9ABDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88316FCCD45335EE42630C7C17891F11D862AAE55A3FB5F862AA7CC9751DB08E6A164BD4E58CD00D192493F67C71552654F1E98AA832AF6EB91290B797134C832564620D6BDB1557E551B1EBDB1542C8AC687016512BE3246C4E0656881228DBC715B5E11CEE294C56C2AD0D003D7B629B4CACC1A53B9C896D8B20B34655607B9A8CAE4DD04EA089F20DF14C63AA7153E3BE56512656AC0D9EFE1902CA2C7A01FE94CD4D89DB2B9320F44D1A22C54D36A641B43D174E882B0E4366E9902D917A259DB936C4506FD32B2E44175B598E7F677AEF95972E0CB2D2D502EE3225C90C86CA10A46DB6574E481B270E8A474ED8D360012CFAA73AF15EA71A6C0109258B03BAD3011B3202D523B609F6B314B2E04D22B3590034AD714702362B38D4D08A62BC08D92CE26864A0DC8D8E2C670D9E75E64D0627B39A4352789ED928B8A214F04F4608659A2058B96A71236EB97424C65040F9A34E89EC95C28AF1CC98CDC1CB17806B5108838E3DE800CB3C475D9216A7E5FD3A7B8B80238C31276180CD9E1C4FACFC9BA25D0B4F4DA1019539357C331E591DBE1C2F4FD1740FAEC9C12352E3AD76CC796473469D93DC796E24291B4604886A6991E2B6EC7800667E5DD3440E9F0D0786112672C6F5FB14B68E3024AD587C3B65824D13C69CA476CD41BFB6D9609B41C4A77FA1C17F6B22320208EF97E39B899A0F913F337CA4B6E2E0DBC436AD4D3E59970C8EB33E2B0F827CFDA605F55B851D76FD599B8E56E935189E113865050F8E66C0BAAC91A520A4003B66406B05554D3AFD38A6D706A1AF6C56C36D20A7738ADA14B124EF930D6D54E28754E2AEA9C55FD837FCE337FEB37FFCE3EFFE6B5F2A7FDD1ED726AF6EC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88EB5527A8EF9AF72138584000F862AB580622B8AAAAC0BC4B6D5188E6A1033851F3CB59A058A952062A876E3FD715506A74EF912BC90EDF6B2B5E254AD00A615E25367618AF129FAA5B6F0C0520ABC75207BE0648911B1236E98A11A88C314DB60126A7E8C59C135B35DC644B745925BAED95C9BE09EC0BF08C837C559C5181CACA24CA6DC7A9694F6C814C52DB7B73EBF4EF95C9987A5E876C788DBB641B4727A3E9B685DA314E832B2CE2F46B2B6263094C8172609D5AE983903E395972E0C8E1B001694C8C9C909A5A5A8AF4E9869B849363682831A6626BA2B44A7D9C69B04D42E2D12A76C8C86CCC4B74B4DA1AF4FA3304B7DA6F69684F1D8605B4CC590AD298ADA30598F4DB6ED8944B7093EA9610CB613A9515E27F5620B488BE60D5F4C486FA62ABD1F7FBF260B19063FE62F4CDA08EA2BC72624E0E58BC2354B0E572DC96A9434F9E4FC470B82CB37FCB4D05AEB534E70FC3CBA91F3C066E5E2C54FB7B4ED02D6DED144680394A1CA2537678A349BE91A6AD9CA5F852BDF2894DC8B013A36A269D98AEDDB0464D9020B26D2ECD232A4AF4CB049259A5BAC2FC435053A659C4D134E3D3B7420F2C989341451B988008879061BE4E33A71F246D83F9B7CB36BA8E997521505CA93FAB32F1C9C2CB8DF97BF9BDA0BD95D5CC623A0DC8FC336584BA6D563A7C937D66DEA91D2873658CBCEEA0520658FD26E077D81CC98F27094F0AB44818ADA8B362B6B7AE4C2BB15762AEC55FD837FCE337FEB377FCE3EFFE6B5F2A7FDD1ED726AF6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A0B7896BB6D9AEB72116C388EA3DF1B553E05BEC918DAAA51C2F1E43082A94DDF21DF25C4CAD2AA495D8E3C4B68696564D88C78D6D62B926A41380C946EAA2367351B0F7C8DB2F0D50055346618DAF86B1E30C2AA7AE36BE1A82A146F886C7A6048852696F172DE98A784A64B1AAF5EA7A62BC255982D0D06F8AF0950E209D87CF10120F0A696686A36C0436C66192DBA1DBA6552722124FEDE2240E9ED951939312AB340C29B8391E69E1B647A78ADBF1EF4C8908BA46DB5848CE1C5284E57209137A2E836CCC428A5477CACB744BD434BB378594BD083E1954A5BB7443D074EB477A11403DF21C4E5420591431716F8874DB225CA8C29378D4505075C8916DDC48BB65A374DB0ADA6C232C36A615E3A44288D054A934C5B233B509551C6C0D7232E4DC0A10C04B0D866010DE3284DED6DD956B4191B65E222429077180C93C48F8684712363913365CD21D4D084954746072226BC34F9E7CCF02C124EED4249DA9F3C98935C9E37AF34B2B829F647519306DC3C91B49ECB467D52EE2855284EE49C375CDA31E2B2FA6BC83E4C86CA38E568D79F723227239F0C74F6EB4B13EA0DA8A17A1CA897240A4E96C569F0819598B2E1255C5B46801A6E3AE08C59C2242716691BF414A78E4D914D2283E3156D97240B4C85A36508CB452464F8DA4C54EDA89255892064E32B6990A446A33A3DABC22B475A0CC9C73A699C6C3E1FFCF3F2C7A51C978C8ACA63AFC3D7B66D304DD46AB1ECFCEAF30DB98DE4923015549DBBE6DB16EF2FAB86EC2259FD56E46B502999575B3AEE02A7CC7BE4830229631A9F6C242A91563DF224D32112570141BF6C226B54B4B81E3878969776AD7256B4B4B01D8E2B4FEC23FE71977FF9C6EFF9C7C3E3F96BE53FFBA3DAE4D0F6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A889788DF6CD7539086B99B8D6871A5538666618D2A20C8C0548E98D2A0E6FDE0A8FBB1A54BC2D1E871A540DC805F7F1C6954F9704AD37E98D3387344464BAEC298D37F120A6B794B7C24E34BC48A855900E5DBC71A5E257DA62140DD37271A5E24C625E031A5E256049231A5E2452AF2071A5E25F1435AEDF4E4834CF74CAD63A1F6C816706456895207BE51272E0CAADE1A2034E994C9CA8F25EE9C8D298C4ECD80A75A5C7521299125AA4CB9221146AB4F880DF2A2562CC7CAEB59D790DAB9025CB845EC16F10E4B45DBC731E5CDC880671A58A28DB22E6E309C2A0E75A77C5CB099451A918B021116F1FC74F1C5253A48A806D8B54954A2D3F8E2D9050E0B5A78E097272A28848158F4E9984425191A0414CAC8641A6A02476CAC86C0BD245515F0C810CC1A63DADCE1629187864405E37CFDE636699A6205687A64C313BB03B7D224BFB9E012A2B97458F876F5CF2D792A38E786478A8DC7C32333B2638A8BDE749D320B481005008194B7009FC50C75D862D8023046A0785316C010F20500E29A57B324134C2A426292B066C0D642A3CAD4A62D6421C5C145624EF5DB2C816B942D0525F173C589A65F02C0E379AFE66E996FAAE8570B40CE10D3F0CD9603BBACD5637E4D7E6158C9A7DFDCC0148018FF000CDE603B3CA6B31EEF25039027DF326F7757214D85F965D171A4E2BF2C99601BE3D3A65127231A9323576E9910C64A0C8D920C56A96AD0E58155D0035AE495FD83FF00CE337FEB37FF00CE3EFF00E6B6F2A7FDD1ED72618BDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A8F54702DC7305BD2695FD57E9424E2A898542F520E2A887914A15F11D71542A9AD452A7C7154BA7942494A6F8AA5D31323020D2B8AA22180135770569B8C5944EE8E411D28B8B6A1979198A114DBAE2AAF28F4D775E55F0C556DA71E4E7895A8C551EEEA829D7C062ABA08DA46240A0C55341198D6A472F962ADC13A92CBE99153D7161229DC101A06AFD19596704DECFED57C0F4CA24E5C198DB30740A053DF2993971E4ABE8947A7DAF7195B34F74A819650FD457A64496B3CD99C712CF2569C41A6C72B25B718671A0D9849148A139025CD84767AD58C01D5052847539496E8C7765768521A2952D4F0C0E66308812564340684EC3172404CE1734AF86282138B70052A7AEF4C5849368D948F0F6C5AA4B1C507DADB16D8286E7BF4380B9314744D4ED98A42551989208046F9590C8284C5BEEC810D810AEEDC0F6C8109972633AD4B5B765A9269D7234E3C4BCC24D39EE5DAA6B53D31AA72602D3FF2DE80AB74ACEA0EF5A530F139508BD86DECA389A3E294A0C04B394682747E08C7C3906B015ADA60E7885208DEB8B301184D462CC0404A18EDCA9E18B346D8802B5607160423FD440C7DB162434F32018B59096CD729E1B6374988492EAED549A0CB2326528B1CD465FADA3C4DF65D78D0E6CB049D5EAA2FCECFCE9D1E2B4D6AE233462E49047BD3377824F2BAB86EF96678C452C89D402733E06DD0E6145439004ED991170A4B8508AD29932C03741E19449C8C6DF25029C77C8863258789FD9C218A1D901AD053BE5A154591BB1A6495FD84FF00CE32FF00EB377FCE3E57AFFCAB5F29FF00DD1ED72618BDBF15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF89F0E3D33BE6370B90957306400773B63C2A893C9057A531A5414B39AF107738D2A6360038353D31E154BB508584E08FB23BE34A81F41BAF8634ADD1B74AFBE3C2A0A32D41F9E0E14F1353B32CAA4277A63C2BC49B7C0D082CBBE3C2BC484A537514C785789A1148F22D477C78578995C16E91C4848DC8EB8F0AF122B8464531E15E2524B74120A0EB919041DD3B55548C6525BA2BAD1AAF41E3BE5127320CD6CD78C60D329939514DA35E681B8D77CA645927FA70008DBE79592C3AB2FB280C8E1E9B1E99025CAC4377A3E8500E6A4FD39592EC71C5EA7A75B5694E990655453A11716DB172F105648A86A7BE2E5008C8F614C58108849CD7AF4C5A64994539D8E2D5269AE0B122BF2C5B20A911248AF42712E5453D8A9435CA2412BCD011E195C83243CCCBE34AE564360404C418A403C36C8D32E618B5E219BE06DFC31A6B1043DBE9C88EAC57E795C9BE019569D6D142438503DF2A2E4C4D0653115722831059C8D84C245063E98B00142301771D7BE2CC05766DB16C010ACA64AD0D08C595226D548A8AE2C486D890C77C5AC8519588077C2C084B26734EB954CA46C92DC826BBED8C249914B48F8C0FA7365824EAB54762F867F3DA0FF738E69DBFA66EF049E5B56777C797AA05CCBB53739B5C6E833F34BD97AE65479B8325C3651932C02ECA24E441AA0C88632688184315608BC47CB2D0AA4C8BE1D724AFEBEFFE719F6FF9C70FF9C7E1E1F96DE54FFBA3DAE4C317B6E2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88C69196127AED9570B9096DAC8649D09D80618F0AB26963050B571E15484A8697C287070AA610308CD41AF88C3C2ADCF2ACBFB1F11C78556B47C63E5C7B74C78552891B91200E27C7052A6FA64609DCD70213292D95E4A70A537AE0295CF6C586DB64789544DBB12AA13EC9DCF8E08CAD53386D49A129C6992B545CC68AA03538F6F1C6D54EDCB4A695C6D5368AD893CB9F4ED913BA2DB9A42B48C0DBC72A945BA324C34BB33248007EA6A4D328945CB8167013EAEA13EDD7BE5243951927DA622C90056D8D4E52609326436500120402BEF95CA34DB0C76F41D3AD38471ED94C8539B8F15335D2217F500029EF95172E269EA9A7A88E38EA2A69BE066237BA6E6207E2AEDE18B91134E238D3BF862DE26AF1C7CE9BF1C549B5AABF11F638B4C8A3D361F2C585371C7CBE2AD37C52364CED5796DE180B7C7226491D3F6EBF4640B3E25B27C3DEB4CAC864248095B96F5A65526D0508CFB78E479320503E887979D694ED9599B6844B5B86150DC699519338A6F6E802019592D802776D1D5280EFE3823CD289766E3403A65BC2B6A28581A15A0F1C7859892282961B1DCE3C2DA0A998985487EBD4E3C2C81B5D1A322B1E75A63C2B24BE49DCB9DBA63C2D6A4CEEFDE871E16B2859A1928183D699465145318DA477AF242A0D0B1390894CA0878F9B3A9A54115AE6C7049D4EAE3B3E30FCFBB7923D45AE78F2AEDC7EECDCE1C941E53571DDF1B6A16ACB3C8EC69CB7E3F3CDBE09ECE8B34774918D0D3C333625C1986E95EF97736B6CAD3BE5320DD02B9412064445245AF1193DF080BC2B0AB02464C15E1586363DF1B5E17F5F3FF38D029FF38E3FF38FE3C3F2DBCA9FF747B5CB03597B6E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D98A8B7639072125B39544C3E78AB27797F75F462A948156A62A88A30C554E163F584E5F67154E27E0D0D075A62AC7648CA82701546E95381285F7C8143339230D1864153DF2252A0A08201195211D0C695078D7C718F34A39A48047C76072C548AEC8E69C0D41EB8AA63A7C144E647CF154CE175AB8F7C082B1A1F524141D4E466CE2CA34AB6F488246F98F37331B2066569157282E4C59269F6CC5D4A8F848D865726639B34D32D97EB09C865322E6620F41855508551B28DB289976100C974992928A8DF2825917A04120E2A7C70B743927B6EDEA003B62D88958F93118B64516917100E2CC287A7F113E2716B3156040F9628E144C4B45DF7C578530B55EB812228A1CA83205B5425E546C8499452E7E54CA4B70429EA3C32259072FDA39410CC146A005699021B01B4CD015400E4086C0532B7978AD46301452792351CB76CBD00A2163E54DB61BE2CC145A41B74A571660AC922A0DB6C5B6254516BC875C5050BF54E4EE695C581287961E1DBA62D64A02694468478E63E50CE058FEA24BAA9032B8865296CA5C9A28E33C7AED99D846EEAB57C9F257FCE4246D0C493B2ECDDE9F2CDCE11B3CAEAB9BE25D56759642C050140299B6C01D0E61BB139012C69F4667E37026BD010287AE5E1A951BF865726C8AE465005722DA15D5D7EEC2AA9453BD3AE2AEE2BE18ABFAEAFF009C6BFF00D674FC82FF00CD71E55FFBA45AE5A39349E6F6BC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EBA9D962318514F1CA2DBD2086568E74237E4DBE36ACCE37F5223DB1B543A8E2F5EB4C6D51AC57D3E58DAA5F50581AD0D76C6D5305E4C8057E9C6D5053A108C08DBC71B5405BAFA73F20DBD712ACF6C6E8AA54A06DA943912944170E6BC403E195A15D2E022BD5474DB0412C76F2F19A4214D07B658AA96FCD8835E7E3ED8AB258A65861DE9B8E98AA5E977C653C68C09A9C5053DB39C33A92A0E426CE2CC6DD8351BA517A663CDCCC689854B5CA6F9417262F56D06C8488A37F63944CB7445A791C0F0DE2A28A8AF5CA497371067F6567249C7634A7DACC79173E316496561E8C80F224E524B221964638A281BED930D914DECE765A7C35C2CD3B81F93569D4E2D91473B6DD3166146353254D29BE285850F2229B62AAE8EE9B7018AA6768F4EA3AE2551ECCA83C72B2C908F286AED909328A11C8A74CA4B7041484006942476C052A51824824532B21368F8EB5DF61E390219829824818053B656436028F80A82141AD71884996C9BC4AAA011BE588053355AA29A52A77C5B01560CAA37C5982879248DC30AF4C59C4A0165547206F5C524A3519284FF375C5AC940DDAA052791C5812C62F1BE02C054A9E994E4512A414BC1EDD5C8A1F0C8C53C4E6712A20540420AE66E1165D76A4ECF9B3FE724B4F79FCBB1DD2C615947D91ED4CDCE10F35AA7E736A49E9BD1CD0F1155CDA61E4E833F349C0A0E43E23E199D8DD7CDD52DF115A13DB2F0D4D9A93D32B93645408F888AD37C8B6856403BB6154482B403962AA8154FED9C55FD75FFCE35FFEB3A7E417FE6B8F2AFF00DD22D72D1C9A4F37B5E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF876BBE87315C8485CF160DE06B8AB2DD364F561FA31555941018E2A88452D01F962A955584943E3B0C5538B771C77FBB156AE1D1D4A8EA70C552A02928F9E48A197589AAD3DB22528D63C72A4202EA7288287AE304B1A7959E5A7BE58A9D5BCAD12123BD3156E5D4491C4B6F8AA8C37039160D5A9C50591E9B745A5515EF909B38BD1ED5FECFB8CC79B998D3AB14E57287DF282E4C5ED7E598D43A46DE198D939B918D92DD411A5DA35075DB289173F10675A5BC7E94629BD331E45CF804DE8CCD551B786524B221388549550763DF2D8F2484DA24E00649926D6DDB16C8A3DFA62CC23ADE35E35F6C59D34235E67DF15A44FD5C374C569AF4590EDB602B4BDB91C8162A251B7ED909328A83A353AE525B8210A357A6053C9B58DC6FC71402AA0B1143B7BE408660AF5661DF2B219828BB695BD51BF6C88E6C89D936FAE84E35392620B23B5BB8E48802462D81AB89929B362D80A5227ABB0E58B3057AA826BE38A928D8CA804571604A1AEDD781DF16B258E3CF17C5191CB91A8CAE41ACC964482E3946A9B0ED8C42789A82CE732B2AA1E20666E1145C4D472795FE7CE96F2792E591A3FB009CDC610F39A97E4E6BCE5EF64A6C17E1A7CB3658DD06A39A5F08063DF3371BAF9B7407A65E393535C4572B9364541E262C48E9916D0B789185555436D8AABAAB53157F5DFF00F38D5FFACE7F903FF9AE3CABFF00748B5CB472693CDED7850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87BBB5531935DF31E9C863A543921B61ED8D2A6FA4DD324A200070AD2A7AE1A54E75173071F4C0656FB44E0A54C34F904B0716006DB61A54B2E222B72A00AA93D7052A342468952C41231A543955506452491B50F4C2020A1A83D415385871325D3E4F8B8F6E38299DA6373444E4BD7DF0708674C7EE1E4956941B1C1C20208A4BE38BF780B57E8C076502D386904501E00134E87236C8458C4B2C92CA6A00DFB640C99885A3AC80F4E466635076C788B194190E94DFBE06BDF2066CE117A759CCC4AF4D865129B9708B35F2E446F2ED44BB007F67283272A317B669F69F5495668EA76037E998F236E4420C87D2378E1CECC3F972B21CA86CCC749B3A471835AF7CA65172A136530C25187C35CAF80368926D1C2397235A9ED92029B446D328E20C37AFB6165C29A4302A01427E9C590D915C1586F5C520A362015401DF167C4E650096A9AE2BC48A85CED418AF1225959874FA3015E25AB6EFD5853293265C2E3180694EBB642526622AA2C95C7C24D72A25B4042B69D3A49CB882A0EF91E25217B5A3FECA60E363C28792D66542C62F8475A6478923642B46C3A46D8136B6349C3AF08CF23DCF4C40DD0648EB9B19446B21A863D874C953113455A7AB1A0E47638D33135D7771E9AFDADFDF1A6CE341C127AA58D7A0C04536C668E499D76FC7032E26A5BBE20107AE2C52A9EFA490F1DA98A0C6DD691722CF4E4D5D864A301269C9B328D32131373F4D4D7AD4648630A192470DBC70BCC8A0DC336E87A53333144071353C982FE6C68306B9E45BF515F552363C53C7369843CDEAA443F147CC3A4CB6DAC5F5B5C03188A4603E55CD96301D2651658DB22C5550DF2CCB8389382C415515CB9A0C5771CA6452154283414C900D814E445180AA9C6C4B71A6C3224A53058C507BE438D5FD727FCE36EDFF0038EBF9063C3F2E7CADFF00748B5CCA8F20D079BDA70A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8749E4AC447B652DE9347F131A77DB1557B6AC3386E9BE2AC8AE5C5C427F9A9B62AABA7B98D4027154C4C625607BF6C550579CA31C7BE2ABA08CC916E31415268087C5AD34B4E51B03F462D8134B97E51FD18B68415AA076901F0C05126A5B602A5464648097CC484653D32B6C4A963A927C7BE565B62B91FD30E3C4E218493CD1A4E532FCF2126507A969FBBA8F1198E5CB83D5FC9B6D5BAE9DF292E541ED92A18ADD683282E54026BA2C2EC39B0D8644B7443D0F4C8D782E5527222190C71AF31B641BC04C52104834EBD316F8A67142076F9E2C9305B72698AAB0B638AA323B7341B62C9CF6C7154C2DAD136DF154E560840F703014851692255F88019410DA95CF7766A08E601F1C810C9049AA5BC469EA8DBDF2B21B0228EAD1488C88E3938F872045325B15C4951591720C11C2E55455DD597B8C55DF5AB56EC98AAEF5ED88FD95F7184319206EAF2071C3D41926210735CC7140A43D77ED8B20C62FB52E4E141F6C5B137D2C92189E8C36C05B2298CAC1109C8B3B486F2EC28DCECB8ADB1A7D7218A5E25FA75C56D33B7F355A5BD393800E5B02C08B4DD3CFDA7A2D0381F4E49908D2D5F3FDB199B8C808E1B0AF7CBB1C9C6CF0B4A0F9D67BAB6BFB49B7826560A0FBE6CB14DD0EA30597E74FE7368325B6B97B7B04748A51C811E273638A7B3A2D462E12F9DA60F1BA07EE73371C9D76514887015A83C065D6E21E6B7204A40554FE1841D99A9C9D701296E28F7AF8E564AA37A0CAED5FD707FCE36FFEB3AFE41FFE6B9F2B7FDD22D733A1F48683CDED39243B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8739D15050D6994B7A56838C8A53A72DEB8AAACCDFBCF87C7154E2DE86024FDA036C551B6EBB6E37C551F1CA237523B763EF8AADBF40F1FA83ED1DF156ACE5E30D0D3962828D58E3937A5716B5748B7A1FB23A62D817CA6A287718B68528488CB15EF80A24AE5CB0C8C9012BBB4F877CADB12C8C1DC0CACB6C50EC84B1E58B0927DA3C6038206F5C849941EA7A38F526507AD36CC72E5C1EDFE4F83D39B95329939507AE9ACD1A2D3E119417371F2659A55BFA70F151DB225BE219469B190429D88CAA4E44427D6EAED3053F6720DE032686D01A6C698B604D52D1788A038A5328ED8F15DB6C5518966081B7CF1555312203418B2433E2ABE3623BD3155579F82925BA024E2AC5AFF5A8F81A380720437304BEBDB89598A49F09CAC8641266B8946E646FBF2B21B436BAB4F1FC21CFCF2B904AE3ADDCAF499BEF394B05875FBCA504E7E938AAD5F30DE29DE7A62A887F32DC471971354F4A610C648287CCB712CB4692B9260190C1AB4D31285AB45A818B30EB6E7753FC7B8AF6C5B1E81A7C451197A055DB0499DD35773908DB8DB22BC4F3ED56EE5A482BB0AE2BC4F2DBFBB732B166A11E18AF124536A2EE4297240E94CB20CE25080DECB25217600F8EF8934D9619058E9FA9F2462599BB1DE9928CF76899B67B67A56AB7118528294EC3336191C2C98ADE51F9ABE4D9A5D3EF649E127D0879A353BD333F164D9D06B70D17E7FDFAC4CD70B30FDF40E4474D86C7BE67E2C8F3DA914972492301EA50B77CCC8C9D613BABAEF4AE025B61BAB2004D3240ECCCB6F12D2A7224AAC0FC7E8CAC9558F3B76A7CB236AFEBAFFE71A8D7FE71CFF2049EA7F2E3CAA4FF00DC22D73610FA47B9A0F37B5E490EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87FBA8BD4048194B7B1D95BD16A1EB8AAAC3FBC353F3C553112FA6A476C553AB12255A8EF8AAF9E321AA3B74C5549AE015F4D8EF8AAC4AD76E871414E6D7B138B5A6C801E9E18B6042DC6DF3C5B52DF50A927C701449176CFEA353B646480985DD972841A74195B63152BC1C8EC0E565B62A4D4635F0C430927FA42FEF07EBC849941EA7A0445AE51BB0EB98F272E0F7DF2E22D40194C9CA83D12CB99611F5DF6CA0B9F886CCEB4D0C38AD3E8C89E4E44597E9F0FF00A415237DB2A939116530DA8F5850641BC06490460103C31649B2C6B4C551491B6D41B62A8D446A0F871569EDCD09A6E7164817B73BED8AA1243C176ED8AA4379764065AD6A08C55874D652DCEC95381B9520D0AE08355241C890C9171F961E43464A8F97F66565B0233FC191B293C7E2ED954F932E88197C9A00E998CC12CB8F2B8B78DA5E05F8761DF156297F6621AD206DBBD31563176EC6328B0B29AF5C218C90964D289B743D724C0335D3999E52A548F8716619DE89680B863D716C6573968D2918DFF6A980A4A4924C4F20FB7BE4516C475754653C37AD6B8ADBCDEE74C92791A83A9C56D42CFCB5732CDC1622E09EB4CB22764893D3347F216E924D1F1EFB8FECC848A99BD2EC7CA9630AA82AAC7AE40163C4CA6DF4AB5800E2829F2CCA84940619F99FE5A1A8F937549EDE1065F4986C3C01CCFC52D9D36BA1BBF1A35FD2CD96A5A84338E327ACDC54FF00AC7363864F27AD0C6648CC52943D466C205D213BAF4C9B978BBD156E393D0E36CA489BB4E2A3B57204A1219A52B5C892A8749F91A57A6564A1FD7F7FCE346FFF0038E3FF0038FE7C7F2DBCA9FF00747B5CD9E3FA47B9A4F37B6E4D0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88FE09E89206F986265C86217D18790FE1928CAD5640FE91DF2684C42ACA093B8C2A9DE95F01A1FB3E18AA6578547D8D81EB91B4A41229E7CB2064847C0EA29CB718612B2829FC7E888EAA37F1CBA835A26DDD016277DB225B0284E19CD17A65664DA103242114B30EBD30192D5AAE9FFDE644C9908B241CE489D4EE00E982D980C4F50B52AC59453DF06CD8024EBC91B89EF9125B238C1E6C93493FBD51DB2B914F000F5FD094ACC9C45052A731E45B601EE3E5621A401B7AE504B9B08BD5ECA14AAB22D189EB98B3951765860299FE9502D15996AD90E22DE22199E9F6D1FA9EA71F8CD2A7236DB10C9E1894B82474EF8B626B144ACE7E793114A611464B713D3C325C2153A8E3000DBA0D8E0E10AAAC0A8DBEFC7842AAB0F86BED8F085B40BF5C7842DA577708E2DC0531E15B62F3E9EF2B13C490712026D1765A5246DFDDED9512BC4C892DE355A7015A656496C125C88A29F08CAC96F8C95C01D29D72B2CEDC638DBED2D722634B4A0F676EC0D23049ED9548522987EABA7C6C5FF74BF2A0CA49626DE75A8E99C8B462314AF4A61848DEE903BD278F4708F511EF5CBEC32E109FDA69C435553E223AE3B278598E9903C34EC3BE1B09A4E652163241F88F5C8C9B211058B5DFED6FD6B9149800C6258DA4675AD47718B510A967A6C4CFF147518B512CE74AD3ECADD59961018904138AC4B2B49232B420500F9603BA69689A388D176AEFD71A452256FA9FB59206992716CF16A9A65E69B3012452C6FCA33DFE1399FA736EA759B97E31FE70E94BA6FE656B564578DAA3B3431781A939B9D3879AD6403C655A49EB34E794A5882DD36068336511B3A1C9000AA00074DB2B9158121176E55483DFBE52665CB8C6C29DF5C301B361E22A62C6E6766AF235C9B02104B38434069878583FB10FF9C653CBFE71BBFE71F1BC7F2D7CA67FEE4F6B9B087D23DCD079BDBF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8DAB09F719801BD8DDC8A4849EC77CB2294B5C736AA9CB1531B69285636FDADB0A19143FBB5AD7A60554F53D45627B602942BA77F0CA8A143D4DC01E38C0D154FE02C621E19719288A362069F3CACC9B045308E2046FF007E5664D822A7731064000E991253C2A7A7DB7EF3A64789908B2BB5B6AF30456B8F1331143EA7A627A65A831E26C1160A6CF94D41DB6C04B6C62CA746D3099936AF8E5722A43DA746D302F134DC65132CE01E9BE5C88ADC5076398F22E7630F63D1A20F22A1F1CC69F376388507A3D9C3C19401F4641B87366D610D29B6F8B6C53A4401C7862CD31B789CB123A65A392A610C3273C2AC8228C71507AD3155EF18A53BE2AD32EDFC715413AEF8AA19A307AFD38AB696D19EC36C0555BD140360065549010B22D180F7C810C8158401F3CAC86624B3991B9391E16C8C9DEB0C4C5B4168DC8405ABD3299452C72F6F1199878E6398A6AD875ECAA5C90054E400A4F0D2053E371B77C3C48643656C6B5A6D4DB1E254E12260BB63C4AB5A195C30F0C902DB89239AD253CBF56499C9237B57491B6A16C5A24995AC0C083DF16892730C8D1EC72405A225182E881D70F0B2B51376A49E477C7856D512ED36DFDB1E15B649A15D1127C3FEEC0CB4FA0E6660D9D6EAB72FCAFF00F9C90B196DBF342F66238A4AC493F7E6E74E5E73561F394A156460BF66B9B2076745946EA7FC72A996B886BD42A72AE6E643925D7331634C980892493DCFDA51DB6C980C4A56CE49D8E4C06A7F645FF38C1FFACD3FF38F1FF9ACFCA5FF00746B4CCD8F20D079BDCF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D880E040E87B66006F492FA2F88803AE5914A1C5B7186BC7E2F1CB108781585C46CDBAA9C2ACB15E3684803738154955A35663F6476C05285594BC9C6B55AF4CA8A157D052E2837C8F567109CDB3AA808D8993688A6B0C44B0A7D93DB2064D8229EFA01635A2D09CACC9B0456081581F86A720649E15D6F6AC1C7A6BC71E26422C9AC6D242D535A63C4CC4532BFD3CBC068B534C789988B036D34C731F82849C789B04597E8765C654257204B121EB9648B18400509198F32CE019C688A82652A286BB9CA497371F27B068CA81D582D0F8E5122E7E3E4CF6CCF29D2BD3C322DA39B36B4AF3F84D17B62DB14D56A5B03364368E811011BD284E5D1E4A9B200402A389F1C2A8F49102AEDBD3738AAE3221EA31543927715DBB62A82949036C550F473FB471556457A801A82BB9F6C555E458A31549BD4F639021925B35DB80CA2DD189E8DE190216D45EFA38AD889621EA53EDF7C810C4C92A4BB8DA29A46958B28F8129D72206EB19A0D2EA607D53C9D3F9299618B68CADB5ECB7069E87A71D3E2343944E0DB1C9691DD7EF83F01C58577198F28B609B1B78A560C492483F6B299C68365DA2ACEDDCC82BBE55C28675676A0AA80BF1531E154D52C588E98F0AAE5B1707A75D8E4A21B71A12EF4F2A84AAD0F8E58CE4C4E6B26939A96E2F5F84E2D1256787D2B16319E52C42AD20F018B449E6F79F9A5E52B099ACF51BD4B6B984F16151BE5916B2692D93F387C822A1B5B2BF223254BC4BED3F363F2FAE24A0D6D9B7DEB4C697899345E73F28DE11F53D5D2A7A02C31A5E2665E5DD574C9264F4F555256A428208DF2FC45C2D46EF833FE7278423F31E36DA482653507A13439B7D39741AB8BE3F6565BCB84635556345EC01CD903B3A2CA374422214625457B65536B8849677605E86832500E4C521B8B97527E3CB00625262EEECC791DCD7260312B94E4C06A7F64DFF0038C1FF00ACD3FF0038F1FF009ACFCA5FF746B4CCA8F2683CDEE7850EC55D8ABB155AE683E9C554F97B62AEE5ED8ABB97B62AEE5ED8ABB97B62AEE5ED8ABB97B62ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88BB53C866006F5971082E0D3BE5914A16E00488FCB2C42550D19E83AD76C2A98DBC844BC3DFA6054E2E29F56603BD3014A4515564CA8F3423C5C0420F7A65726DC7CD745704B8232B25C9AB6490DEA22A6E2B5CAC96C8C593433ACB1AEF9025B04535B4B70E188A1DB20649E14FAC6C55985464789970B281A7848C328C3C4D9108EB6D3DA78DAA2BB63C4CC063B71A3137205325129AA4EACB4A68DD6829824C4866305B32B2023B663C8B38B35D1A03EAA6D9492E6630F56B106109951E6E6C59D69DF100D81B073673A6FC4AA69D7BE2DB14E917E3C59A7D6B6C48461D0EF96C792A751A711BE155C57DF157703E38AB5F4E2A849BA62A82798462BBD71541B6A616B5AE2AC7F51F31D9C1192CC63A77C910D8C02F7F30F4BB763CB520A57AA93FD99590C0B179FF003C3CB167270BABC593DABFD99590D04A47A97FCE48793ED2A91852C47C27DFEEC111BB59953CAB56FF009CAA82DEE78DAC21A3AD1401FD99710C2390DA5F27FCE4A6BFA821FA8D89E0C09E407F665120DF1C858D45FF00391BAEDAFAED776C556BDC7F6663C839519BE91FC9EF3EBFE61426231805D4B961ED954837C256FA2AC7437AA9E3F4655C0DCC9EDB4C78CD48C3C0A9DC160481515C1C2AACFA79A834EF8914DD8D0379A79E1F7E06526177962A03963C585787BE2D1248D61963B1D453ABCB1B08FE74DB16893F32BF313F293CFDA8F9AB50BE8209A5B79A4668F8F402A7DF32314801C9A64C462FCACF385B6D73A4CF2D3BF13FD725B215D7F2EBCDF34CB1D9E893C751BB713D7EFC7657A0F977F243F30A7991E4967B343BD09A7F1C695F5FFE597E526B1A5DBC6DA96A0F34CAF5662D5D89E9D7251E6D1946CF1DFF009CCDF253680DA3EB11356474EBDFA1CDAE9CBA0D587E7F593C9373965D9DBAD73640ECE8B28DD16A7E07F1ED954DAE218BDCDC0124895E8694CBB1F26F88D9239EAE4E5A031921F8D065803595226876EB9301ADFD94FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A0F37BA6143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8294F845330037B52D4B29AF7CB2294AAF6BB8CB152D8D5830A547CB0B13C930854870DBD7C72122C2253953585ABBE54496C4A1BFBC6F9E441552641238567283AD7F86322299E306D98F967CADABF98AEE2B5B3B62C8C69EA01DB31CC9D8E385BEDAF227FCE2EC17515B5D6B32155900A293FB5BFBE5129B9F8F102F43D57FE716EDA2B988E9CF5403EC76FF89663CA65BBC10F25F35FE476B9E5FB932C687D193E1555ED4FA72066C7C10F3E5D0750B0B8F4E5571C4D0D7009A462A6616D632491014AF11BE59C4CFC20BCD9DC4428B551ED931309F0D012DB49CD59C50F8E094BB94C02636B1134F1C8711699C53368A452A791E9B60B6BA65DA0C94750C706CE442DEA763229E15DF289F3765879334D35C55476F0C8B7B3EB023E103618AA7D18AB0DB02DB27B16F8554F6197479330980DDC006A3C30A551862AAB18046E31545718986C82B4C585A57716ACD5E228322B691CDA75D716F8493BD32B2516F3FD674BD4DCBA4523A73040A1E99124A5E3BAE7E4DF9C35F467835BBB8977AAABD3F8E4F88A402F1CD4BFE71BFCE6F3D06AD732B576ABF5F9EF82D9D16357DFF38C5E757A97919DFF0098FF00B78B218D8A5C7FCE3179D43F22BCCAF4AFFB78F2639310E1427FD0B379CC48ACF6EBB1EE3FB720723891C459FF00973F203CD715C436F39F4A0604391B536F9E4253722185E97A27FCE37581BC59757B812AF2ABC2C6A0EFE15CA8CDCA8627D4BE51F22F97BCA10C49A3D9C5048ABC4B462808EFDF2A9CB67271E3A2F52B68AA828287C72102DE629D5BD9B4AA07877CB835909BC569E9815CAE4C0AAB428C0D08F837CA81B402424B733060D18415E95C2DC0B0ED474F6A973B835A0F0C5B0C424F1C216A196B4C5A6710105736314EDCC205E1B103BE0B21C59C2F9249756B69103CE352464F88B5F865298A6B78A5A450278D699602BE19661653F35154070DAF8659369F7D0DA144745FF4821547BE46CDACA1B6EC37FE7263C99179DFF2D64586D926BCB088C826A55C0E2C7AD7365A693A4D5C03F119A136BA9CF6922F131C8D191EEA48FE19B8C727439318B5194888DD21D890787B6DDB26402B080616EB44AB6EE6BC98F5C9844A21047ED1CB034C821DBBFD3930D12438DC9AE58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4F37B9E143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B535CC00DEAF28EF9645528BA1C8E58AA10C60B8AE2A5181789C045B590982FF7669E191314829431FDE36532D9BE22D52D2C9F52BE82D233467351F466365C941CCC18ACBF49BF21FC950E9D6105EDCDB2BD003C88F9E611CAEDB1617D71FE2ED0B4B8E21385E286813C0E512C8EC71E057B7FCCAD0EF6EE386270A76037CA2591BCE165F7369A4EAD6CF2CC527122FC209AD32BF111E03C475DFCB0B2D424966B78946E69B63E22F80F329BF2DEE609654856A17ED532D195071525571E49BB86BCD0ED93191071A437BE567442CEB4206DB6113B6AC90628BA7345395F7E98789C5945329ADB8462BD69D71B6BE156D224E33818F137462F48B49887515EC32B917618850679A4C84B2FBE06D7A3E9CDBAD76C5594DB8E4C3154E6D5C89197C32D1C9984DE13571852886FE38AAAC7D3154C228BBF638A6959A21DC74C82D21999882380CAD692C9ECFD53BA0A9DABE1919288EEE8ADE6B65F4924EA29838DC8F0D092DACA8793C8013D1BC31E36631A5773F003CAF01FA4E3C4D831B1E96F2047DEE86DEE72139ECCBC2B496EF568492A9722A7E798A7228D3282B5C489EAC373561D1413959C8DD1D3A274EB7964B80D2C859ABB2E40E46E1829E8D6914CC1226B6E117FBF48C8F1DB2963A65B6D6E11176AED96C0B5109D4238A82075CBAD810ACFCB8E5732D6425CED22568763D72B896043A38A39012454F8E49B6297DC5AF21257A0FB38B7249FA3958B6DF4E2D3916C1A423ACBCBB1DB22538B1F131ED53CBE8FCA87AE20B6F82C364D0258A60231C93A93938C97C047C505C5BAF43B6596BE026B6B0C976D645BED452127E583AB899B1D3D3AD2DC6ABA76B1A6CC39ACF6C63507DD48FE399D84D3A3D5C2DF87DF9F7E50FF0003F9EB50B20BC6970CF4A7F3B31CDB6296CE872E3A2F1CD4855D641FB4BBE650DDC7E4C4AE362C3C32C6322969FB67241A64876EFF004E581C7921C753963497F655FF0038BFFF00ACD1FF0038EFFF009ACBCA5FF746B4CBC72692F73C28762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B360BD730037A3E4A1E9DB2C8A529BB42C76CB10A50AF165A8A625211B55C622D8494E52786C77A8C998ECD60EE83BCF8AE9388A506F4CC2CFB39F845BD1FF2CB493A96BD68047CB8CAA6B4ED5CD5E59DBB7D3E3DDFA93A3D8B69DA6DABA0F4D1211555D8663176D8A2F2BD72D751D7353962B3321084B1504D32893B1C71D952DBCBBABE9EA26657046F5EF98F26FE009EE8DE78D5B41BD1CCC9344D45911892001DE99595107B868DE79D1B5B31AC92FA5310014069BE36930658D6A8E1DD40E128F81BC72C69945299F4A421AAA0D7C46581A0B0DD574359012117A1ED9312A6A9C5E51A9E83C2524201BF618789C69C58F5D69DC410476C789AB85274B5E126DF0D0F518F137C22CBB4752028356DFA9C376E5C0507A4E974053B7F98C2C9E83A6CA15803DA98AB288E7008A62A9AC2E480C3BF5CB63C998E49A42E69D4E14A395BA62AACADEFB62A9BDA5D536206D8B35F7373CA945A5720B4840ACDD09CACAD221232BD6BF3C84CA62375D2AF53D0E637139A12B9622FF0D49E5B6F8789B404A2EB492CA69DB071338B1A9BCBCCEE47106BED919CB66D88DD47FC2E3FDF43EECC4B6F115787CB8D1C8A40200ED902590A661A6E841543155A8F6CA8A788271E97A478D6A3C3082899B08E801D854E5F02E3109AA82A0153990C4869A471EF954CB590A2D2B32B0200C840DB54C25A4B89050903C32D6714C963F5A3DCD0A8DB16E4B64B295492010B5C5A72289825D8455A7ED655334DDA734BBEA32CA28687E782DC9E2583494460B201C9B71F2CB014F10448D060906EA3EEC9028E25F1796914F258FE9196C5C4CC2D36B6B45B53B2B03DC8EF97E39EEE9F518DF9A7FF0039C1E5223518FCCD15B8F4EE295217F9797539B2C32743A8C6FCE1BE9B8832EE55968066CF13AB9ECC50124B549CB4B594249D4E48354940F4CB038F2511D4E58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88089A86B9801BD338CD40F1CB22969E30C32C420D8713B6291CD6D4E4A00B1C8B58D46E69979AA681CD40FC7331F019ABD4BB4D353E9EFF009C74D21751D692A952B535A78669C9DDDDE101FA397F6CB6DA3D360563A01DF2120ECB0B7F96FE5B8F503777862ABD08AB0EDBF88CA661D96309BF99F4A3043246918E9D8663C8373C0752D0F50796436F096321A37C35DBEECAE99458DCB65AAF96E48EF4A4B50C0D02B78FCB101127D05E48F375D6BB6612E418CDA850BCB626B4F1CB0071E6CFEE66658C7BE594E34C149A525D1AA3AE46450030AD4EC83B31A6F91DDAA51613A958D0F4A6DD71DDA845864B6A56423EFC6CB7C629EE92854283D6B9747937067DA79A32E4959BE9FBB8FA31564A83718153C85A8A9F2DB2D076660A6B136DBE1B4A354EC3F1C2AAEA4D3154742E148AF862DC119556C8324C6DE256A74DB2B28559630B95CF92421D979661B900A87A7BF4C0CE25B30F2ED8B60696C4160481B74C05B224DAAFD487F2D7E8CACC5B812EFA90F0032042D9575FDD0E23E9CAC861C454DE124FA9D7DB214CA3225673F4CF4CB62C885C353111AB6E3A65CD65506A91C9DB2120C0B6F771D36DABD7238F9B44D0E675AD69972628BB797D571C7609D716F64B58A587871DE98B4CC162B7F21D31F8769872194E45C7612F87519A46A274F6C886EE229B44E646066D9874F96482F116416C22E23A64D788A756F2AAC4151030AF5CC989D98917BAA344D37488610E0E78BE6AFF009C9CFCBF4F347E5EEA73BC5FBCD3E2661B54FD963E199D824E83541F83FAA5A1856F216D9ADA5650A7AECC7B66EB09D9D0E6D8B0FEA58E5E5AC1D9072F7DF2516B9287ECF5ED96071E4A2A773963490FECABFE717FFF0059A3FE71DFFF00359794BFEE8D69978E4D279BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EB35F7CC572138A74DB2415A634196054B67900E44E487355B1CE38D2B96EC8282B9AB74F1CA665880A912F22CBDE99ABCE5CCC5B3EEAFF9C4EB113DD988815E25AB4DF6CD69767A626DF647999435D5A5BAB1D880403FC32B93BDD3F37B97962CD6D34832280ACD0EF414CA245DC621B30AD5A77B849A302A6A77CA2459494B4AD209812478C115DC951FD32316A1CD3AD5F49D15B4D91DCC3EAAA134655EB4F964993E64BFF300D235631DB30085C8F82806C7DB1453D5F45D7E4D52D54D6A683F56147084DE0BB3C9C4B4DB619645A728A49EE7799DFB1E992A68A627A944199EBD4EF8D2D30A9AD944BF3C6928AB440B28A61566BA79A30C559A58BFC43E8AE2A9F46FF10C55388EE00551E191BDD04A3A3BAA8EB8414A363B91B6FF003CB1B02312E47CE993661328DEB43E3DB16E099C4E38FF000C82A2606A656528D2A5C0A75C84D5BF4CE6310DA1A2877C890DB169537E99590E405754DC572239B656C98C511A74AE4E419C10D7111A1F7CA64E4001085780DFE9CC793090097CD7263A953F17860873681CD26B8D4E58EB5A6F97AC92A7BD9A405877E9938B4C9AB7BC9D09CB29A095433DDC8E4AD7010D68F82EEE0515D6BEF819C5368272159E9C69DF16F82223F307A4425457A62DD1016DF39D5F871FB4A28299092C804A6386EB4B928C84A9EE722C53D86EA3640CFF0068E2A98DBCF0D462A9EC13D221C3ECD76CCBC5C94A6B67744115CB1C2CE16F9AB4B1E63F2E6A1A4900FD7A090014FF00248CC9C45D06AE0FE76FF3A3CA4FE54FCC6D7347652AA9348C05283AB1F6CD96293CFE68EEF03BA6FDE483A10732E25A2B648E7152773BE5C1C69F35315000AE6445A96E5A036C407F661FF38BBFFACCFF00F38EDFF9AC7CA3FF00746B4CB43833FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B31D2B98AE426E47C3920A8694EDB6F9605482ED982BD01AF864952E86670D435F961B414D50730396D909A0370370B8907B7539AECCE5637DD7FF388F76A359642E05617A0AF7CD74C53B4D3737DAD359B5DEB30730410C280E63C9DEE9F9BD5EE3513A558B2745F4F8E5327718B9304B6D4629D679188EA69BE63C99496DDF9DEDB46B231B952D355547707C72316A1CDE15E63F38EA77F2C896933047A8A2939364C22DF48D42E6669E7E72173553D7157A56853DCE9A1622080682A715672D70DE9A3AB862FB900D72D838F991729E56E186EC7A81D726D2905FC25CA9FF277C558B5CDA9049A6D8AA95AA71931565567B32EF8AB2BB37A11BEDDCE2A9E46FF0010A9C55358CD40DF21D58946C792641191E58D811B1D6993661368998003C316F4D6273415E990423918D4532B294EED8065DF6F0C849513C465242789A2828720437464B553C7AE4087263255A002B4E9910376CB454520E3D69ED864DD0536219C0EA3C7289736F082BB1C50D3AF8E63C98C986DE4AC3950EE0E087368EAC3758BA99281493F2CBD125897130B346FDA66A11938B4C9111C92B15A6FEC32C0E396596B6D298D0AA924F51896B45C92C36A959402E3AAF7C8B6458E5FF99A0A18E21E9F0AF3AED8B7C5875C7984090BF30057662716F8A79A379A8C328726A95EBDB2052433C9FCC16DA94694515EE46458F0B514913505413E0315E14EED0C408E5F0FCF6C53C29D2CD1A2715229D46F97E33B302AD6F78A1BA81F4E4F89AA70B09B5AEA9CAE91030658C153FECB327149D36AF13F22FF00E7387C9B168FE686F3446800BE6259C0DAA6BDF3618E4F37A8C745F9A7786B7136D4F8B3638DD7C85256E09ED9787167CD408A66445A9665A1BA2FECC3FE7177FF00599FFE71DBFF00358F947FEE8D6996B813FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B33D37AE62B909B337C24788C2150E57E1396854A665FDE0C4AA4F29A4D5F7C802828E0F545DFC36C24A02E97EDB53C33132072B13EABFF009C5AD5E3B7F345BC6ED40411BF8D735F986CED34BCDFA88F12B6A36578375E20D730A4EF74FCD11E719DCE8F2CD16E6BC49CA64EE317278326AB710C14E5BF2E998F26526317AF79AA5F3210480A29918F36A1CD97683E45BBB86599E33C4D0D48C9B27A641E5FB0D360637340C47C18AB1BBFB6B494B7A43A74C550FA4A869DA222841A0CB60E3E6667058D09A8EBBE4DA503358061257F9B154A27D257D36FE98AA4034E546229DFAE2A9D5B5B22815C5536854290A3A0A62A9E47D302A2524A151E191EAC4A670CC7EFC90649847374CB1B022D26AE4D984E6396A06FB5316F098C6D5A64109A44C2A32B294D216A50D76AE4648298FAAA76C890805BE55CAC86D896F9656439112E26A322DD12A65C0EFF003C8C9C9C6D7D657A65126F086BA9818CF8E63C98C983EA32F10EC3C7A6087368EAC1AF2F19A4A7865E8936B7C562A1DF261A648ED37518849CA4DA996071E48ED7BF31F4AF2D69F25D4AEA0A834AFB62583E6AD6FF00E7226C2732CF030660C40A1FECC8B38A3BCB7E7A8FCCF6F73717527A224A7A5BD2B8B7C53237D1CC5E2AF348F7AE2DF1627A87E63C76529B0869198F6A0EF902D8032DF2B79D6FEEDC0E478B7BE4534F6FD0F5096499096DCE2B4F4225E5E1F175C5691261936A4DC76E95C9034D13E6EF425FF968FC71E26C10B08CB698D9D02B739240791AE64E29381AAC3B3E3CFF009CDAD163D5FF002CA3BF02B25A30634EBB54E6C71CDE57578F77E2BCF2195DE43FB44FE1B66DB0F27479051428EA3E79921C39A1E41B9F9E6445A90A577CB83745FD98FF00CE2EFF00EB337FCE3B7FE6B1F28FFDD1AD32C7027F51F7BDD7162EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87DB371502A2B98B4DF69C13D01C90554E3B7D19312094A275F8FF005609482B1EB8DA6F964225055E3625900049F0C9A014D110167327C238EC4FCB31F240B938E41EA3F935A8FE8AF31DB4AB2846332802BD413D7303340D3B3D2C85BF5FF4FBEFAC6876376AC1C7A43E319AF90A77DA722D34B906FF00CB573DDC3120663C8BB9C4367CFB35ACCF70B0202CDCF751D466392999A7A8E81E5AB7F53D69286408A48F0C62D319025EA16D3456B0085221D280E499DA4B7BA7C9A99268691EF418DA5E5DE60BA83439191E550D5FB24EF82D52DD0754FAE6A30B28E20FE396C0868CA1EC8564540C632011B31193B684ADC1624914DF738ADA94F1A985A8C09A614816C6CDB92C4D3BE282295046CBD01C55150EC77FC7154F22208EB8AAB2005AB9162533840A75C21923E351B64DB0146C69B64EC3208A89CF2A5698DB784EA17D86F90B54D616AD28722529AC6F414272242AA2CC01153898B0E0368F4DC546FF002C818B6C415F46F7CACC4B9116B953A9A7CF20634D91284B89000486195483978C84A4DC7C62AD4F7CA241C805B966AA1DFB65120C64C33569F843235413D86463CDA3917973DEF2BA615AEFD32FB6264159AF9A12ECC85815D864E2D5229249E6048924DC230AD01EB9686821F337E6C6A3ADEBF6F1D8D8A4A07A8DCD97B838086145E59E5AFCABD62E21ADDBBAF26E546FA0F8E459C43E91F2CF96E2D234B68AE18C92C207A2ABB9F7C69BA3B2AEA725EDB594AF65138918100537C5B8178FE9DE5BD66FF547BABE57ABBD547B64241B4483E92F2CE8A6CE18A886A06E70527883D934189F9AB73E86871A5E20F4069278F8904D3C7052F105C6ED89AB392DED80DB44B9B5F5BFF29B23BB91090554BE113C4C5AAA55AB5EDF3CC9C4D3A88D8D9E47F9E9A41F30FE5579801AC92C51B32C23AD02935A66C71BCAEB31905F8377711867B8848A18A46047FB239BAC3F4BCCE7152418076DBBE65C5C19858EBB9DB2F8B4A1580CB04806E8BFB2CFF9C5EFFD667FF9C76FFCD63E51FF00BA35A65A393813FA8FBDEE9858BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF874B265328CA593246507853C72259C513C07139596D0935D28562721D5279311BC929375CBA1C9A24BE0B90268E872F8F26013B9650F1EE72126FC68DD12FDAC351B5B98DB8B472015F6CC2CE36761A73BBF5CBF267CCA9AFF966D6D24903148C0A66AB287A1D2C9EF3A5AA3C9FA30AF10FBD735D91E8714B6615AEF96C695E6084C43E0998548F7CA29A739B7B3E89E598CC6B3247EA19D0034DE996403878B9B2EFF095959C5F5ABB70AA054A9C910E482F39F3AF9B340D26C192C028B85560E57B900D32B21982F8EB53D425F345F4CD2A91463C09F9E565B014C740B2D46CEEC39AF18D870F964E0C66FA4B4DB8379651ACB27C400D8E5B17166956A21E262886AA456B9634F54B2332383B6581C8835E9301B8DF0144D690475C0C694FF6CE2B48F85C01F2C569188D520D698AD2650B50628A4D633D314D23636DBE58A8B6D1C73A62E60E49A44FD37EF8A53BB6906D8AA64241B6298F36CB0241CB9C9149B5ACC1471AD2BB656BB2600823AE40ADA1A7038B37865534DA493C828731CB740A4B3C94AD3AE51272E054DAE1BD322BDB2892C8B17BEFDE73E7D32B71E658826968D7264A7535C21A2D327D2BD40401D475CC88AA42FE528A69099146F99015747E43B157E7243EA03D0787E38C92194DAF9574C8900FAA8DBDB20C9CFE5AD3CCA812D40F1DB154F57C91A75C45536C3953C3FB714A4375F9736C2559628F804EBFE75C8948445AF97520223A74C0A9FDBE962CF7036AD4E2A9DA32BC746C550727A49B03912CFA2025B845DAA3DB20D40EE827B9574702868466463E4E55EC93F9C6E3D6F27F986253F11B4947FC21CD962745AE2377E0879810C7ADEAA87AACEFFF001239B6C3C9E3B55F594A17F8E67637026B24077FD796171D02EBBE5526E0FECABFE717BFF599FF00E71DBFF358F947FEE8D6999D0FA47B9D7E4FA8FBDEE99260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF861D3DE432034DBC72964CB565278537DF2259C51C6600152C2BE19516D093DDB13CBDF23D5279308D403ACA3623C32E8726892193D65742548F039911E4C03258F9B415E276CAE4DF8D49039755A94A1AD7E5989945873B0BEE7FF9C71F39AD95CC3652DE0EC3893F3CD7658BBAD34E8BF49F4D9C4C12F512944AAC9E39AEC90779872A6B75045AA442EA420CF17D95EFB653C2CF24AD9FF94B596B3B6953D1FAC49C6853BA8F1C9014D111458679F7CD173E94886630F20691FDF890DC0BE62BB6B9D42E984E8E6366F858F7A9C810CC1645A779360216644E04EF9510CC1640DA298978C49CDA9BD30C42C98F1D46F6C2F56DDB946A4F4CB22E3CDE84B492C83BB0666DF2D69EA81876276DB261C88372321620900D3A602C8A0E414DFB604521F73B8FBF15A5652C3A0C5691F1F2A2FEBC56933849A5295C569348C9D85715A46AB506FF004E290162960DD3E9C5BC724C627A002B4F1C529DDB38DA8698AA6AA4F615C5239ABA1EE72E6DB541280CA396F5DB2056D324B903E127E2CAD6D7CF23189FC29D72A9A82C7AE255E81B7F0CC72DF0293DC39505A9D3289B95028069DE9D0D3C7289A494AAE999D08A6F5DF2B699157B5B55600D37C21A93AB6B3ABD38D76DF3222AAB3D8AEC547CF3202A360B3429B10580F881C64C8223EAE9F6792FCB20C913069A240EC08057ECE2AEE735BBF02E062A8EE64C4C18862DD32254242E8166AB0A6F812A978C161AFE38AA412DD98E062AD52062AC4DB54B862C0D46E72126CE88492FE43B16A6443472288B5B8E714A7957A664636F32F4A035894C9A16BEA4D57EAD257FE04E6CB13A0D74DF86DE6D503CCFAE85DC0B96A7DE736D8793C9EA0DC98F053E199D8DC19B9CAD3AEF96171D06E2A76CAA4DC1FD92FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD333A1F48F73AFC9F51F7BDCF24C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85DD35C96DF2964CB6023E1F9E44B20BA47FDE1DFBE5526E081BC7A2935E8323D527930FD45CB4887BE5D0E4D1253673CE1073223C9806516854C237CAE4DF8D12618E343336FDB31E4E66366BE45D767D175482E623455606BF7E61E58BB1C137EB17E5579EA1D734AB485E60D23280457E7EF9ADC917738723DF2D678ECAE638E75062946C7B6F94F0B9B1DD1535D496978CF6BF0C53281B63C283B21750D223D6007B800D7C7224282803E4ED387A4428AAE4086C05192E8F15BC5C621B814C810CC1632F697AB3858A22EA7A90322366576C7353F2BDE5CDCA4E632287241A26C820B0921B658DF7232D691CD4A5B431C6C476C9872209210DC8961BE02D94A72313B605E15200814C5695D6BBE2B48D4278A8F6C578531B76E9B62BC29B420938AD261E9B1FA714D2F119FA462D815D63DE98A53680D0818AA6F149414EB8AAE6980D89CB99F12D5605948EC6B5CACAF12A7D6292EE77C815E245CD755888F11954D416352CE7D43ED98E5BA086B89B92F1F1CA66E5C4A5D24C146E731E4A4A57713165F8776AE56D5229B69DCDA95C218B2AB5421AA4F514CC88AA37EAE5F71D33202A8C917A2373C6BB63264103FBB06A64A78E4192610DD451A37192BE3BE2A96DC319E4E4B21A0C551714AF1B202D514C894847CBE93A87D8918158F6AB72681074A74C55894D73C636538AB16B9999559972326D1F4A4C2EE477A1AD322E393BA716F70638580EAC4664636523B286BB2341E5FD79D8F10D6B21DFFD439B1C4F39AF93F11BCC8E24F30EB0E0D435C3107E939B5C3C9E6729B293667637126A2CB5AE5A5C7502BBE5526E0FEC8BFE7183FF0059A7FE71E3FF00359794BFEE8D6999D0FA47B9D7E4FA8FBDEE79260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85EB109D5771E394B24EE19497451D3950E44B208D724C840F1CAA4DC1037B50A4378647AA4F263B7B18AC6C72E872689206EC51A2653D32F8F26B08F82E48A440FEF295E39093918D3FB23F595759AA225EA7FCAED94172E299412FD5A2223FB75F8328C9172B1CA9F48FE507E663685756D0DE5D985C90B1A13B577F7CD7648D3B4C3983F4F342F325A6BDA35B5C3DC235D7006300824FE398C767698B202C860D46692358E54A18B704E0B05BA62D35B6BD77DBA0C890C63128A79D8107964086D102AC932B00246DBB9C898ADD2296EE2B643E8C425E5BB31ED95914CE3BA167D4A2991B946108F6C431940B13BCBC049111AD32624D3E19B4ABEB13382AC2993130DD114974E3892186F8DDB6092041DCD46D8AF12E6EA4D36F1C57897091456A715E2565993615C578C2656CEA69EF8AF104EEDA4407738A6C27B132151BE295540189A62CD1023351B7D38AA24232D0914C55148DD29D31559373AEC32DB544DB9A0F8BE9C812869C7C7C874F1CAC94B6F229000395CCDA84AA68DB996A6DDCE63B7C36414CE95A577CA66E540A45792D09DEA331E6C88B41C2FCE4006E7C32B6B9448DD9259C81283A64C45AF8939FAD3715E0475DF2E0BC4135B7BD2A9566CBC49788295C6A1137DA3CA9D4612CE26D8F5F6A9044A5AAAB4DF761FD723C2CE982EA5E7AB3B105566524D796E36FC71E15A63C9F9AB6B1D47A8A5BE63FAE34B4A4DF9AE92238128592BFBB507AFE39190544695F99324B308EE25A027615FEDC8D26DE956DA8C1A8C0662D56E831A5B63BA93FC7C23A927B531A543456723C3FBD4A313F86464D8262A90ADA70462426F91693024ECB5ADCAA0929448D8733E19763906194F0879FFE736BA343F26EA571EA7A69776AE96EDFCCC54803EFCD86298797D76404BF1AE617524D2CB74BC6791D9A415AFED1CDBE290AD9D1CE24EEA7C18F419990C81C498A5AE8C06E2872EE305C7A52E058ECB5CACEEDC1FD8DFF00CE308A7FCE35FF00CE3C8F0FCB3F290FFB935AE67C3E91EE75D93EA3EF7B964983B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BD3BEC652C938B6FEF53FD6C89641399500ABE5526E090DF3B32B11D40C8F549E4C7AFDE4E31FE397439344905217668C78E644793584C2C406BA27F9475CAE4E4637A6796B49FAFD95DBA0E455AB94D5B951E4C7EF266B5BC6B775A50D304A2CC4D7C26EBD7496194C7E97C48D5EF985931B918B23EA0FCA5FCDFD5B48BEB6B6D4EF19AD9481F131A537F139833C4EDB06601FA51E59F3FF9775DB2B764950C8CA3910457F5E53C1C2EC6192DE8D0C7672422789AA08AED91B72E050F34C84A88C74FB59025BC6ED2C8DF3F0C899354A289496A8CBD2BDB21236CF0C50922D011E390A6E314BA4B22416A634D44255246633BF638D3021033905B7F0E996C5ACA0682B5C92AC734247E18AA8337BFCF1572B74FD78B594CEDA6A0A62D914EADE652462CC325B6605462D89B4282A3BD71668EE031558ED8AB68DD3C3155772A77C9AD2989950100E56534A46707A9C84969A1254D474CA8A40DD648F5539516D8A4B350354E5126F821258048390DC0CA26DF14B638945C71E5C4D3AE463CD728B8A6358E05E4641B75DF2C70F850ADAC5B16E0660BC4D6B5C9C53C0D4FE71D2ACA2224B95A8F7FEDCB578581EB3F9B1A3DAC4FC640C4D42D3C7EFC945B2029F38F9ABF379DE597D19DD63A9E95FEB926C7906A1F99CD71EA52E9AABD4127FAE2AC557F301DE46ADD356BE3FDB8AA656BE75BD915E4B79CB2A1A36FDFEFC8C9059D7947CED24B7F18BB6661C803D7FAE455F61F973CE960B68891EE0EED5F1C559347E6182E6752B106A9C55939B95940658F8823A64486A3CD0CEF5AFC19590E4C64A2FE9B2FA4C2866EDF2C9C22E0EAA5B3E40FF9CA7F308B7D046911BFC71A9F86BF3CCEC71793D61DDF9A864E681D8FC4D527375861E975929521B91AEDE399020E26492E33A13C5B7236CB40A68B4D2CE28A4EAB9600DA0BFB03FF009C6A017FE71CBF2000E83F2DFCAA07FDC22D73363C83AFC9F51F7BDB324C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85CD3C715A1EB94B24E228DC303B75A8C896514F44323C058D3EFCA8B70499EDCB24B5A647AA4F2492F638CAAFF91F6B2E87268925A5E07F8D2B48F63F4E6447935854B3E4B73327ED15247DD95C9C8C6FA0BF26AC66D5D2F6D22512486A287A6541C8E8C6FCFDA1A586A5710950B75093EA0ED936B32A79F192E1220A4D2A39291954A1698CD562D4A485158BB2C8A762329389CFC59DEF9E40FCD2BDD0960334F2B46E42F52694FA7313538A83B3D36A1F767917F3C6C350B782092EC06A00431A78660183B5C595F44693E60D3F558D7D39939103BF8E53214E7C260B295B66E21832303D286B94CB666775DE8488EA781A1F6C31DD944D35246EC6A23603B922992A64648A11A98B8820B569418D06B24062FABC2D683D4996887A531A6B25884B751B92C84D0F8E16050F57FB5514C285BEA57BEF8AA9B9F7F962AEE42837C5ACA2612716C8A3A17756152298B30CB2CE71C455B16C64115C28A55A9418B3470B943D0E2AE3206E877C55B57A0F7C5548CFC07C677C9B6D20649CB37C26801CACAAAC659B71D32125562DC76AEE72A2AB7983515DF2A2CA2955F3D15941F88D29944B937C1A8A4021F8CEF4CA26DF1631A9DD7A3C9D1A86B4C8C39B29724A9EEE49E3203354E58D54C4758B3D4562F5226DCB5363BE4E2B4C2A5D0754BE722494F1EF56396AD05A7C8B6654FD61CBB1EC7A64A2B4935E7E5C79767564907C4C3C324AC0F51FC93D2262CF6E7883526BB62A935B7E45D8FA9B9A927AE2ACCB4AFC83B510CCFEA705E42A323241677A0FE53E83A5C81A62A597C722AF51B0F2BE90CEA96BB1514A2F4C55153583E99708A895DF638AB2386FDFD3459051FC3034CB9A2D6E19876C8F0AF1D34D342CF1CA4F1FAA2B35D7CBAED9918A3BB81AAC9B3F327FE7257CD967AF79AEF2D74D9DA48E0E4AEAFB6E2BD33638F1BCDEA4D97C82C5D763D3B66E30C7D2EA66511000C4572DE4E24CA356D6126BFB44EF86D880C92C2CE20061E26F8C5FD757FCE3780BFF0038EFF90AA3A2FE5D79580FA349B5CCE87D21D764FA8FBDED19260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BB6F848AE52C9904352B5F0C896514D3D7E36C77CA8B704AE3943AC9BEF91EA93C921BBFB2FF004E5D0E4D124854D2198FF94BFAF2F8F2601358471B966F18FF0086424DF8DF5BFF00CE24D8A6A7E63B9B6715564634F7198F234E544585BF9F9E5A934FD775396342055B7FBB1136B9C1F3100C614E4370B96036D06C20E54F8078D72756DB09334D247FA1C629B9EF9467C761CCC597853D827BFD3254B8B6BE642A6A141CC09E27698350F58F2A7E73EBFA4DC470CF3B988951CABE14CC49E276F872BECDF23FE7858DD476EB3DD8694815527E5ED9893839A26FA16D3F306DEFE28A55911380A28AF5FC32318A99D2723CCC6F10233A229FDAC970A0E54AEEB5C834C9030BD578C8E4C6BDF1E16A395E4DE74FCD485A64B586753DB63FD98F0B039103A66BAD7D124BCEBCBC30726C89B4F45EB1A2F2DCE2CD1092357AE2A88F888EB8AA834850D3C31605562B923BE2CE2895B86AD6BD716613AB4BB7000AF5C5B03238AF8FC3BEF4C59A651DD934DFAE2A9925C57BE2A89593E1FA314C79A065763BD726DF4A22BD7E9CACAF0AAACC13BE424BC2E6B8AFC43B6545045209AFB8BF5CA8AC50571741DAA4F5CA64DF04BE7D43802AA731E6DF148E59BD77A3FD9AD4E461CD390D04F6CCD998C291BD32C71B8D4EE6D2240640BCD5B6E3FC72617898FB58A732E4045EF962F1A51A8CB688AA88FF001D77C9C59C656C3A7748E4E6D27C35AE49938EB9A728547DC8C55522D734F520C7154FCB154C63F30B49F0C44411FED29DAB91920A5375AAF2B9553217A9ED9157A77945B99568C1E05A8D5F1C559B798AC80B713AA0E406F8ABCDE3D44F221CD181A53080E3CCA6D1EA238F5C20346495060DF999E7087CAFE5C17AB2859EED1C15AEFD08CCCC31757A89D87E54F99EE6EB5CF30EA3A93312B2B311F4939B5C50D9D266365881B52546D999195075F38DABDB5A9EC3194DA2504F60B08D8AF8F7CACE4651C4CBAC3490C071E9E190395CA8627F58BFF38EE9E9FF00CE3F7E45C7FEFBFCBDF2C2FDDA55B0CDCE23708FB83A3CC2B24BDE5EC59635BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85884F361C76CAF8536C96DC111904D6A301816424D4A58C5C075A65462CC6441C41E1560CA5C9E80654765394525D76A423B31095ECD96E336D12CA18F05E69242AC0B484107B6C733230348134E0FC0EA6849910814F964278C86F84DF60FF00CE1AFA8BE6C997890CB5427B6F98594539D8657B3DBBFE720B44F56E352AA8320526BF40CC7E2A679214FCFAD422F413895A713C4E591CAE14F6485D8351286B5CCA84C14464F40D0A20D0C709A127BE3964006F88E264377A544A16AC797E19892C81CEC008418B78D5951D6BE04662642EDF164A099E9E2EED2E565B29CA1435A1398920E58D500F50B0FCCBD6A0F4E192770F0ECBC4ED4F7DB2996CCBF3024CDED7F37358E01259E4E245363FD991B41CAA7A97E61EA7771FA705CCD461B963FD98DB0F1187DA6A375A8DFA09E4919F97DAED8DB1337D27E58965B5B3854B971D70F0DB958A7419A457ACD2AB576F0C781B78D90C37CB51F153E79122990926B15CABAECE3E9C090B6491493DCF8E282143D555F1F962C86C8859EB4A57DB1640A696D24840DF167C4C82094556B5C53E204EA09169DF14F1A3A19949FB58A414DE27523ED8F962C816DD4788A0C9B68CA165630A41EB4D8E40848CA12C9E4E3FB5F3C810CB8D086E9551AB5395485053249E694B3F2076F0CA0C911507B8526B5E998F2986E8EC954D3879295CA8FA999CA229B69D6F1CF22ABF422A708853564D4090A6616FA65804AFC5CA985C7F1107776E2353E99A8EC3240AF88C3AFC4EA181A508E8327C6BE2306BCB3672F20635EA41CB319B6DC79186DFC7292CA49A65DC2DBE284858411732558B1E95C7857C5097FE9178643C5453DF1E14F8A11BF5DFAF71E6CD13A0A2F1E87E795CC5309660CAF42B41EAA34BFBDDF6AE52649196DEDBA3AC91C6A21554A374C1E2065C69DEB17D722C9A3908269D7263763E2878E3CB28B89030DEB52C3A53261C7C99022CDF47042D34AFC238FED13964604B87972BE3AFCEAF345C799357B8D2F4F98FD4ECA80723B1AD6B4CD861C6EAB3650F99E6B7BA8AF3882BE99D9877CD9E3141D5E49A0EE2DC076006C3265C594952DA2A76CAE450236CA34DB28E591405353D7316526F8637AF68BA242630596BB6527239718BFA78FC884117E47FE4D443611F91BCBAA07B0D32DC674FA7FEEE3EE1F73CBEA3FBD97BCFDEF56CB9A5D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF858B4FB432AE36EF0D94C1F6457A77C789061488210F4C89DD81539220637E0C15E9F0B7865660C244524D756F13A52693D47F019761C6E31905B67E5ABED43F756D68EAAFB89E9B0A66C61065198B425DE8B7BA7DD4114CFD036D95640E66220BEC4FF9C378DD7CE37019830E62A335D99D8E10017D63F9B7A7A6A3AB6A7005E47D36DBE8198526DCA6DF997E77B23A6EAD25AB0E2A0D7200D38138B07922A10C33271C9AC459B79526E573E9B7602992CC6C3958B67A75E5A7308CA3A8CC493B0C692359B89375DF28C8E6C792BD9C6E26238E63C925131C00CEC5C5083B644C6D946549998D5694C1C0CB8D1B1395E31815AEF8F02F1BD5FCABE5F49D16764F8BAE3C0BC4F5AD3A16810474D94ED86A9CAC4764E919B983F7E25B814DE201A8CCD4272A93644A690F1029C8E41B0146FAD40003B0C5928B4FEF8A559273F0D4F862A9A5B5DD286B8109DC57CA08DF0B105358F50403ED7CF16C051297B08228F8B3051E9A8A01B3F4E98B3B6CEAC4FED64896622B7F4913DF205988A067BD249F8B204B608A0FEB47725B6CAA6526282B8BC201A1CC599445269AF5FB5731E4DBD17DAFA93480F63928868996716303222B74DB2E1071AF74EA3770295230F84B6A53B32AF23BD71F097898EDED5C1F871F096D8D4F0121885EBD72CC71A6C81B63B77A6990310BB9AE5CDAC12FF4AB80CDC50D0F4C558EC9A3DE3BEC877F6C551B65A2DE8956B1B52BB653910636F54D134C962319910E6290D9183D46C42C7C05295DE980067253D7A655B76DFB665422E34CBC8AE2ED959C0FB3FCD968838939879279F7CD7E8594D630B9591C1008F7AE5F8E0E1E49BE6986D2E66B998CE4C8EC49673EF99D8F675D96492EA9A6709AA13BE65C4B8336373E9D234AD45EF84968E04759E8D2B015427299C9B61167BA2E84EAF1931F5CC6939110F67D1F4BE318F87B65326F8BFA35FC955E1F937F94A9FCBE4CD047DDA7419D5E9BFBA87B87DCF29A9FEF67EF3F7BD372E69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF855B670AC2A330CB984B2785D5A23C4EE46C300938D3C8037146EC0D640A57B1EA73271C6DC59E7013FD17CBB7FAEB98A106353D588EB9991D3B85A8D50112F59D1BF2CACE1557BF01993724E5F8F03A39768B3EB2B0D26C08B45317A454D401F16C3C732BC3D971F68BE7EFCC1D3E117D1DCDBB5631C8041D7BE60E78D3B9D2EB789F437FCE1B5928F37DC48C4A6FCAADEDDB35595DFE973F117D6DE76B8853CCBA848F19742AC38FDD98530EC4EEFCF4FCE7D0AE26D50DF5BC263889E5D3AF4DB292D5283C3230655657431B275AF7CB612A6A31A651E578C9BE1C5A94A65933619E30F7148792460EFB653273F1AF4B1ABB029C89E87C3289B9B16EDB4CFF004A3F0F5F6CC7924A3C6845A6E741D7A530C5814DA3F2DB4D4A2D3DE99246E9B59F955DAE230141A7B62BBBD7748D35ACA255DABE00615B2C9238C83C9969ED95973709D912B1FC4081F31912E48298C7C788D8E552660A2D08A743EF90660AA7A95D80E9D31656EE05BF6A98A6D772A7C35E9B62B6898A4E3D4D7145A244DDF9D315B442DD11D1B1640A3E1B84A8AB6F8B65A6D1DC42109A9E98B3077524BA534DFE5809724144FAE0A9A1A6DB6449660A02595BFDF832A25B0150FAD71DB9572B994CCEC8692E958D28731A4D112BE38BD42083D7B656D97B325D36D5415240F965D8E2D332CC15408C00287C732E107189B2B7E207ED5465BC010A95E638B0AE3C0150B2DB07E8B8F00543A699CF9D453C32328D3762431D138B54D18785320DE8693CBF0CE45502D3C7156E2F295B83560A47CB154CE0F2E598707D351C4F865536704CA6D16085032D001945365A47724C33A90A7805EA3C7271834E4C94C63CC5A8C0B6EDC9E840DF3371E375B9333C3755D61A4574B67F1ABE640C4E064CFBBC875ED367D4A61297F881DC9C988538F3C96A56DA488630CD1737237232D8871A52B492FF00449A798BAC3B78658254D2425FFE1E666DE2A1F9644CD90C6C86C3CBDC40AC5DBC321C4D831B38D3F468D387EEF7A6F9592D822CEAD2C5234038819596603F7D7F27871FCA4FCAD5F0F286883FE9C21CEAB4FF00DD47DC3EE792D4FF007B3F79FBDE8D9734BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF84F5A9238F5CAA50699EA135805C2D19413C7A0F1CA841D7E5D4BD77C9FE4C9F5955BAB9531A36FB8A7F0CDAE9B15BABCBABA7B25BC363E568B8428AD2D3E13B75CDC474FE975F9B54642929D43CD1733551578D7C3251C4EA660B1C79EEA4E530908600D30CE1B231715A437D65F5A82269F76DFAE6A75317A5D04097D2BFF38A5603FC513C69B50F519A5C8F59A4818BDF3F32C8B6D7EE550D4EF503E8CC4C8EDA06DE35E6CD274ED634C8E1745F5C2F2DC6FDB31645BC45F0F79C3499F4CD4E482088842DD40C6326A9C55BCB703DBDDC25B66722B97036C22FA334EB45963889EE06093998D91DB69F1FA87E1AE5191CD8F245DB5845F5ADD46512E6929EC1A746D253877F0C8DD2631B66365A3C2101283071B2E0641A7E9B6AB2F22A0536C7897813496D944AA517E11D71E35E0463C28C415E94186DB63B2E580602DA0AA88B88F6F0CAA4DA0B74A641902A65A84D3164D09A9D7155F50686BD77C55DCC0DB90C554DA6A54F2C516A26EE9D1B16C06D552F883F6B0330518BA937F37E3859834AE97F4FDACAC96C1345AEA15523976C812CC4D4DAF474E5BE544B671A88B82CD4E5D72124CA7B2AAB0E42A7BE504B18B23B331FC3B8C039B6B27B39A35A6F9978A2D190A73F5D8F8D2BBF6CCBAA71495CB728DB636BC4ACB301B8F9636BC498DB3ABF518DAF126255154103AE4265C8C25AA467ED0CADC97048491B0C5556910EE31550692256A823DF2B9ADD216EEF23E34AE5643194D846AFA82420B33058E952C72EC637703365781F99FCDF662678397A8A4D0919B2C7074D9B3BCEE7D5EC0C9584D10EFF004E6588389E2DAFB7F4AF4811906B80C11C68897479C39A3D01E8BE19514A9FE8B71F69B204A695974DA007803EF4CA8C9CA84764C6DED78EDC0636CF85905B45180BF08069BE368213650028A0FA3157EEEFE50FFE4A6FCAFF00FC04B44FFA80873A8D3FF771F70FB9E4753FDECFFAC7EF7A265CD0EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85F8ECA6827585979C84FD919084FC474B9674F6CF29F906F35036D773218A18D833A95FB437DB719B1C3A1E274FA8D43DA2E0C763686D6D2216DC06CE3BE6D30E8F81D5CF2F11610F34D76CEB212EC8767CCC3300535006ED2AB986E56455F4CB03FB54CC7F1699CB7539675B32AB335030DEBB532B9E76EC1877633ABEBD05BC4817E3095DEBE39AFCDEA7A8D0E301F49FFCE3379B34BD275C3753CAABF58466DC81C4F875CD5E6C342DE931914F72F3ADEC17BACC9A94171F5A4B9DFD21FB35CD7CE36E44254F2DD5E40F74AC253188D3E28FDB31A78CB951C8F3BD4BCA69E67B826C23334CBD471FEC395F0D322049E6DA8F93752D03518E4BC89E28D5BEC95207DF4C2254C6389EA9A33F3B58E48979851B8C4CDC884699569EEACE6BD5FF000CA652722324EBD158255940E61BB6545927D6AB1D43EDBEE47865728DB644D32A8A7884600F0C1C0CC4ADAFAC952283BE3C0DD18DB27B39964B73CA3DE9F6B1E06C186DD1A90A6A77A9C9C62D528515707AED84848D950380A2A37CAA41902A4CC7B0FA3214CC490EC549353438190921A42AB53CB14F1297390814AD3B62B6A2C66F7EB8ADA8BCAE2B5E98AD201E46AFDBA62C97FAE07FBB2A7BE2CB89DF5C03ABD0F8E02CB8DB5BFE34F8ABF4E506569051B1DF7203E2C896C89561755FDBC8D3305556E7810FCAB4ED8382D24A252ECBB57A7D39138523252716B7C626525B901DB11869978CC9ACEFD64A7C5C72F87A5AE53B4DE394935E5B53AE5BC77B35108B8EE82903957DF229114CEDEE62E5566E43C3DF1663127705DC0A2B8B3181305D460208A74F7C05B618F854A4BF87C46001B2D06DA8C6BBF2FA3088ADA1A4D622029CFF001C9702DA17F4AC4C681BE23D05729CB1A5AB405CDD731BBF0F01918C2DC7C9B3C4BF35FCCF268FA60B6B78DEE2F27158E34AF434DEA332F1E3751A8C8AFF00959F947A8F9D3433AAEA90B5BFAA2A3983B75F119B1C717499A565BD67FE71E6F9B549EC74CD4B9F04E6005EE7B74CCC842C38E254C2A7FCA7F39795E57730C9731C7D5829FE991941B23240C3785A76B4BD06DEE22DA507B6634E0E4455269E35902A2FAA9DE40731CC5B8056F5410027D9FD939518B9319505E8CE36AE222C84938B13CC8A8E9D708091BA7885760570A781FBABF947FF0092A3F2C7FF00013D17FEA061CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8797343B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D2F23F91A57BA4BFD6D6BC0D68D99B874D4F199B556F6FBFF00315959471D8E9F1AA0A7024019B9C18F85D466CD6C59E49EF25615E4332A52A0D50DCB2DF2D6856B70C52551CE43DF31324DCEC38B88D3D353C81A7CB0F32AB551E03FA663193B0FCA3E7DFCCDF2B2E9FEABC7B2C7E1F4E53293938B4F4F9C6F56297D485DF7198E64EDB4F0E146E83AFDC797196E2DE46AA9A00091D7E9CC6CDB876719D3DDBCB3F9BD24F2C31DE0DA94AB1FEA7308C1B0667B4D94D69ACB0BD12208D97E3151D3289636F8657A07911B4F7D723B3D2E146909A39DB7CC738DBE395EB1F997F96F6BAE687305B355D42DA332D55454D47B0C8F03938A76F86AD6E6EFCB17173A65F42C9F1955E429DF0183920B2BB7BC4616F2C5B16DDC65660CC165F14EB3463B9032071B30532B566E2C3B83B65538D1499526D019BBD6990E16719A6917C5DBA63C2DF19A6D6F7CB1008C7E8C785BE395344BA420107AE061396E881329C892A0DAD663C8D0ED9592CC054571DF2BB6C017F2B7FDA1BF7C2A8599ADE876DBBE2A82372A361D3A0C5541AE7155295D4AD477C52934EC6BB6D8AA0C87F138AA8307DB7380A43AAD502BB7865062DA0A3E1269D7A60A6C0510A5BF98E34D80ABA3316515F98C69369846687AE16B4C2075322A96D8F7C55328A7F498156AD31564767AA23108EDDB08544B5EC55DA4FC724C81444378A5A9EA7BF5C2CC14C92F401F6F6F9E06C1277E9458EB593AEC37C84CB6715A849AC27412F4F7C8829421D6A25AF292BE1BE580AA026D6226DC3FE39602A841AA52B2C64B329A0032AC82DC5CF9B81E8FA0797EFF00CC36DF582AC8AA3AD30C62E064D45B23D2FF002E746D666FABEB1682EAEE27FDDB915A27874CCCC61C0CB2B7BEC5E5C8B43F2FBD969AA96E889B050053F01997034E0CE16C3BC93A446D35E6A37975CAECB32853E03A665C25B38C63BA6F3C3CEDB526BEB5496201B83151EFED82526710F942FF00F2B62F34EABAAEA1631FA2F393450294A57DB31E45C8807897983488FC97713E9FA8CA1A624844277CA0B7C52BB760F0C4E05030A819590C81A45AF5C14CC14D74F6F888F0C7859829D237C58D3305FBB9F945FF0092A3F2C3FF00012D17FEA021CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8796B43B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF911B5D4CA4450905BBAE74F1C603E6D3B48AE67FACCEA900FDE16A6D9682038A626D9EF97B49957795D99CFEC9195CE6E660C6F47B1B58EC87AAF540BB961D4661CE4EE74B87D4191C5AFAAC65616692836E5B65066EFC600F1FF3E4D71AB45708F1045607E21F4E5329B64703E3BD62C6EECB539792FEE8B1F88FCF31CCDB04292D9AE9C158E18C484915AE57C56C8DA31A49596358E416F21EA54E44840059C68FE69D574B44824D51BD24151F16E7D8E63C837C6DEEDF96BF9A30697AC437F733A5B98C8A9E5D7E798F272216FBDBC9DF9E9E4FD7AF7EAF7B7111F56309212474C003978362F14FCFAD33C9F3EA31DFE8572B34929E46314A54D7C301736DE23636377C39471820F5F6C8101B0499559B2DBA8F59E847619590CC14FAC751B37996105CB374DB6CA671B613932D59618940988453D0F7C8F0A04D136CD6F2352390BA9FDA1BEFE18385B064A593E9D74D30689498C9DD8E3C2CC66461E76A80354A81BB65538EE9F15B87528DDB846416F0272B316C8E54DE3BC454025A06EF4CACC5C98E45296FE05DD4B37B5321C0DE24BA2BC570095007BF5C8B0326E59EDE9BB004E28B4B5E48F7A1A8C56D41A44DF7C56D45A4DB167C482797AEC315E24135C76A62BC4A06E0D7A75C4A89287AB43D72921B414545734A53E9C785B01B45ADC8F1C785982AE2E42D0D7A74C14C89D95D2EEA2B5DF035DAAADD92C17953DF15B4CE0BB006EDCBDF15B44BCE78F247A3FB6109050E2EEE01FB44FD392664A69697B329A93DB147123FF4A3014240FA71533A434FA846D148EF394310AA81DF018DB28654A6E3518B9DBAC324B2198D1CD3A60106CF142A299A4BC92D622F2040086237DF2622BE28651A77947CC5A9C4F35BD83945E8C4102996082F881EB3E4EFCA9BD9D44FA8388EA7918FE5898BAAD7E4DDF4559E9967A26872A40024C828A0EC09C9083AFE3280F24DBDEACF7535F5BA2C8EC5A075DFE1DE997C4522ED966AD33DA5A4934D2963312A213D299785E152D23CBF696D62D3ABB191FF007A2BDCB76CB449A670DD4BCD4C2CF402DC4249715529F3DAB80C944698D7953405B5B06BB9A61140D1C923CDFB5D2BD32B25980FCBFF003D4B379FFF003D6EF4486FCC7A769D39ACAA7ED509EB9021982FA1F54FC9D96DF4DB7BFD27525BB9258C39B52C28BB0D85322907778AEA52AE8F70D677C443780D046761F7E2C814CEC599516534A30AEDD30365A6515E425FE26A7B61676FDE9FCA021BF297F2B997756F28E8841F63610E74783FBB8FB87DCF21A9FEF67FD63F7BD172D68762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EF578F9B5C06FDDBF4CE9B8DE267A6651E54D1967BAFADC9BA72AAE552C8E29C1BBD62DE25826E4AB45AE56656E6E0C28FB8B9068427241F697C72B9F276F871F0EE94C97B4256184257314C9D96395B10D522BB9CC8D23058687965129399116F07F30E857BACDF35B58446572D4F8728949651A4E34BFC8DF335FC6918B3912693756A76FBF2B126118D966FA67FCE2079E3569D2425E28DBA7F9F2C4C9C918596BFF00CE13F9AA29D1E5BD255853896E9FF0D944A4DD0C4CC2CBFE706B5A9E359DB5858C2EECBCFF00E6ECA2526F8E265563FF0038CDA7E8171691DF7994594A8F4F50494E4476EB91126D11E17A95A7E487956EAE62177E6E597881D6407F8E032660A7179F957E4CD35D2DE1F32C444A28C798DA995993602A69F929E539E932F9A6293BF0120C812D82491F987F2C348D2EDBEB1A7EAA048836F886E7EFC46ED3964C33FE55FF009A2FECCDDDAAFD7517A01BFF001C970B57131F6D13CF3A6481DB4B6B5B68FED02A454F8E3C28F11136DE77BCB598417D6E4229A31A634BE2338B4D6B48D6A25442179EC6BE380C2D81CD45BBAF28385F5EC65A93B8A1C81C6DF0CC92CBA4EB91A13E9B3D3BE40E37331E54BCCDA9DAB7EF6D0923DB2BF0DCA8CD53F48A85E722346C7ED2F8661CC516CBB516D4ED5BED311F3C82AFFAEC741C5B63D3E58AA8B5E27F362AA2FA82F4AEC3BE2D96817BF5AF5DBBE29B59F5A88FED62B6DFAF19EF8A82A2648EBF6BAE45B42BC6CB4FB5BE1640AB2B8DB7C0D815B92D3AD70164AD1B0A75CA9AD7F2DC50EF8551D0135A5715477A8513956BBD310CA3CD6FD61BAD324CCA9BDF49F663EB8B548A3ED2C750BFA705635F0C5ACC99E795BF2D359D7F538AD591845506507C0FD396E38DB0964A7D476DF933A0D959033C4867812AEC7B6DF3CBBC363E2A47A4F937C9BA5DEDDEABA95DC29145BF027AF1FF006B2C18D7C5629E7CFF009C98F23796F4ABBD13CB56714B76A0A0950577029E1ED93F0D7C57937E5BFE746B779ACC375AC4AD0E9CC4B70EDC6BF2C84E14E3E63C6FAAB53FCD9F25F9AEDA0D1F43981BDA8590AF5AF7ED80069E07B5E83A3AD8E9B6019FD4927456E47B03DB260278588F9D0BDE6AB67A65BF660580C902ACD043E8C3A7C1D2A02B8F96264C4861FF00987FE997DA7E996FD178F35191E2470A335A8DA0F265F5869B66D3EA4B6CCA0815DD908C921F9C3F96FE439FCB3E7ED77CC1E77D224852EE6768DCA6F424FB9C3487D831793349D5EC21D5BCBBADB441E3E6D64ED4E1ED4C348B7E587FCE45F9ADF47F3B0D3667A346FC5A64F6A60E1660A1FCA5F98F1DD086D6693F771A84563DC78E34D80D3DA2CEEF4FBD50F1CC391F7C69982FE81FF26E83F287F2A829A81E4FD0E87DBF47C19D061FEEE3EE0F25A9FEF67EF3F7BD232C69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8BED12FA6D457F46FA12ADBC7F626A7C47E6736E72BCD5193DAFCA1772C114D67796EF4894FD51E31D5BB72F6C899A63A6B6609AB5DA32C37B6E2DD587C2E452BF2C78DCDC5A4012093CFBA5D95C5C4123AA9B7157693A7EAC13C9B39630D30CD5FF003318397B28A39E2ECD18AFF0CC4326D863A62B73E79D575085C4517A61F6F886DFAB29949CC807D51FF38D7F96B36BF24BE60D7A33C62F8E30BF64F43BEF98F29378C40BEE7D22C74E69E9269D0C76D07C10CB1AD18BF45AFB655C4CBC1E1DD9E8BFB58ED1ED0C421BF857933462881478E266DF8E16F93FCD9F9B3A89F3543E5DD06E92E5E7904370EC6BC2BD48DB2894DCD86114C9FCEFA4EB5E4DF2D0D6EE7CD33CD77749CA3B3864DAA7B5331A536C38E9E45E5CFCBEF30F9C746D43CE7E64D66E20B0B2532DB425E858FB0C89C94C463B64BF967F973179E359223BABDB6D26DEBEBDD31A6CBE06A32072527C17977E75585B796FCC53E81E54B9BBD4A68BE15773C8F2DC640E56DC7A7B286FCAFF002B79ECCC351D62C6F9A0421B801F0F1EB959CAEC31767F13E9997F303F2DADECC68BE67D3A6B4BB20707028DB6C4E1198863A8ECDA28BB3F307935EDBD0F2EEBB25AA1FB2B2BD313A92D3FC9A82D7B509BF41DC2C9AADB5F475256456ABFCB251CE4B4E4ECFE17805ADC68374F7306A7693F224F0940D8E644276EB3361314A5FCB71DB96BED36F0C31F22521734232F0C2386C59661A17994D9010DE5D212BB75C90882931A7AE681AF68FAB442DD6E22172B5E418ED919419C7210C953CBDA4EA2A566A7ADFB253ECE63CB6726398B18D47F2CE695A4789223131AA377A7DF98192365CC86434C1755FCB7B8B552CB1866F0EDFAF2A316CE379BDEE87A8DB170B6D29E269D36FA3234C81481A3BD462258245A7B645210F34BE98F8C1030B7525C6F2035058838B3115212F03591CFB53148802A6DA8C6845198E2C8E20022A1BB59A95241F6C5AC48A3967229C6B4F138B30510B73D37E98B74510B703ECD7AE03BA65B045070AB50D91E171BC42AA92EC64AEEB9131489A36DAEC3380DB0F118084892266BD759111006889DEBD71886C81DD1F0992E18C50C4657A7C210572CE16D243D3BC97F957AF798E482792310C524A1645E8426FBF5EB8F0B8D393EB1D1FF002374CD2AD24B8FACC8B2409CBF7A76247D38F0B8D29A0B4DF33689E5E3793CF730C571A7D79F134A8197618B10789E11F993FF003955A5E97697F6FA0A9BABC98323B49BA8EA36F87325AE669F188F3B7E6079FAF9ADAD2F561B59FD46B94534201A9006C3C70DB8E7290C5B4AD3E1D275392DB592F717334A03C8FBF53DB27C69194BEACF2AF93E2D6E1161A2A492974A3B36FC411DB2B99B6C8CDED5F941F9172796BCC4FA84AD2CE8CFCA6F537E277E9BE56CF8EDF74C691C2A8109E1025501F6C3652082F3BB1AEA1E6A7BCA739223C78FECED8DA683D06F1115A198578A312DEC72F8C0485A90180C006AFE6C9243F14708DA982500189A66B1C4F1488518AA4B5E5F25CAA52A6069E4DE67B48BCC7E67B6D2DADD25B585C7AEC07C54077CABC621AF64279ABF2B6EF4DD2B5AD5741BE6B484216823534A0A0EBBE4865B6C1005F879F9B02E6E7CD9A80D61E3BA9E1958073B9DB26269E00F3089B568627BAD3D12358E4A1E636E3ED960368D83D2B43F3C4F63259C11C9CE5968272DF641EF4DB274178807F551F9093B5D7E45FE4BDD350B5CF913CB92B11D2AFA65BB7F1CDEE1FA23EE0F2DA8DF2CBDE7EF7ACE58D2EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90FF00CB7F20CFABEB70F9784FE9BBB0569CD76FA727E3B8A3474FD1DD03F23BF2F3C93A589BCC5E60B79AEDE3E4119F707EFF007C7C76C8E969F1C7FCE4679DBCA97925BE9BE5331C6DA651649E3E8DC698F8EDF1C34F985743D435AB73A95C5AB244568B514F57DBDF01CEC8E34D74AFCB3F36EB344B1B65B6B63FB4C074FBF29395022CB74FFC91D5CEA169646F0CB792B82B02D6868457299657271C5FAB7F90DF96FA8695E588AC2E2331968C027E81941CAE6460F7693CA361A1E8F705C896E5DC145EFCBB1CA8E46E10BD9F397E76FE60587923CA7269D6404DE66D67F72186EC81E9BE0395C8861A60BF911F93BA0E956D75E74F38EA0B3DC5CC06ED8B36E8C6BB75CC79657371E36216F637DF9B9F9A52D868F792CBE5AD35E9287354A2FDDE198F2CACE589ED7E70F2C5C6B0963E42F2E5C1B68B4F939DEBC6688E0F63959CAD4715259E7AF3EE89F933F97B37956C5565F325C2141243F6F930237A57227236E3C5C4F19FC99FC9EF3579E357B2F3B7982E85BDACF299409BAB2F20DEDE390395DBE97476FA57F323F30348FCBD8C68F62F6D3B88F837115DC0A7BF8656723D0E9B40F813CDFACB79A75A6BE9E0145242328E80E0F11CC9F65F131F9AC2248F925F4B6EDE08D4C81CAC4F6481D1434AB8BFB2BB8A73AACD71A746F59A177AD4F7C9C32BAFD4F66D07D412F9D7C87AC79623B2D3ECA38F5644A34B415E599B8F23CE6A7414F0F3A6EAF7777248B3B95AD16253B53E599D8E6E8F2E1E03499E9BE5C56BD53AB192DE2247276DB2F127127165D7FA0E8F0317F2EEA85EF1002C8ADB93E18CA4D6229B7953F33A6D26F5346D6AD65424F1FACB0FA3AD330E72722117D2D63AAD9DEDB42F6B79CD5D4155AE634B9B971E48AF5AD89E372BCD7C72B219A1DACF4FB9E4A6C57813B371EA3C72B21B2293DE792B49BB25BD08D49F6FEDC810CC3CE75CFCAFB296390C4A2B534A7FB78B787916A1F965240EFC54D05698B6061D7DE50D42353FBB240E9F462CC31B974CB8B7E4B25B9AF8D31672E4848D2584EE87171AB74D61B9A8E25295D89C5B150951DF1640B4B28A80A773DB14CCEC9AC658A0DF22E2A3ED62326C7A1AE34B68D58A15824653F18E831E15B645E43F296A9E67D5E1B75899A194D2B966385948C9C2FB83CAFF0092FA779295353D5A2170654E410EF4AFD3991E1A0E77A4E82DA4699F5ED6AE255B3D3ADE3630C55A55C7418F86D32CCF3DD5BF33AE7CE574749D20496F6ECDE9B4E36047CE98F84E34B23CEBCF1A3792FCA7A1EA926BBAA97BEBD80FA4BCF7E743D725185328647E5DEBFA8C32EA57C2CE212DA991B8B91534AE4A98E4928F9735ABDD1EF0DD69B251CAB7A918F9634E29927A350BBF32B5ACB1DBB3DFB5C207A0DFED634CA2FD64FC8CF29C1E5EF2B0D66F63A5CC9081F17662A3010D8F77F23D85DCB6FA9DE5CC815667261AF8646922D3CD6EEC69D62189A168F8D7DF1A6C8DA43E4EB4FAB9B9D4661B4D5E24FBE34CF74E755BCFABE8B3C8C68ECEDC7E9E9878E934520F29DB1B2824D4E71BDC92149F7CAE5918905956A139B4B19A73B7D514927FD615CA253B6B312C23C8F6AD35FDFEB972B54B824424FBE5129313128BFCC0FD23079435716F2B969636A460F4DB2D8DD391189E17E06F9FFCB7AE0F34EA9A85FD94CD01998F220D2996C4B0902C7749D26F7CCD7834686136494AA9229C865824E348909B47E4F86CB506D288E57711A09325C6E399C83FAA2FF9C7E80DB7E437E495B375B7F20F96E33F34D2ED87F0CE9307F771F70FB9D2E5DE67DE5EBB96B0762AEC55D8AAC7DC7D38AA9D0E2AEA1C55D438ABA8715750E2AEA1C55D438AAFC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF233CB9FF0038C3E4DF2ADCBEB13B133D0B1911C0CC3B2E7ECFCE5FF9C95D5A6B1F346A1A7E95AB4E6C625612C5CC96E229B03DB1B29A0F89DEDDEF00926B97974FF5394909AFAA47BB63653C2FA87CC9AF797F56F2279774DD25D34B4D3A86707FBD6A0A751BE365061B337FC8DF2C5E79C752B7D26D6F2E0CAEEA11B937122A32B258460FD2CD3FF27FCBDE569F47B4B9B432EAF28065BC6DF8F427299172618DF40456B6BA6D9C16FA4C4102A51E4661D69EE72891A732106272C4F737978F79C94DADBC970B272AA1F4C578D077395D972B1E3DDF9E76B6317E6E7E6FDCDAEA08F69636B318F8CA7ED509FB35F96425272B829F42FE69F927CBDF977E4FBCB5B1FAE896F63315A4924C4A7A8694A0F0DF28916D8079F7E5DDB5EF907C986636E96B7BAC9ACD7DC6878B03D0E512939118A6307E6459E97A6DCD968086FF00CD3316F4EE07C67936DBD2A72B2594B0DBCCBCB9F94BE65F327999FCDDE78B1B8BA4327A932C95E0141AEC08DB2264E4E9F4FBBD4FCFBF9ABE57F2AE8F0E81E52E7677F0A18E242F550D420EC32B26DE8F498007C75AEDF5D6B378B7DADDCB4D7B292CBBEDD7C32B327A0C31012DFADC21FEAF343EABAED118C5283DF07139825174B3C0842B583B13D2B91254CE285BAB580C5EAADAB41714FB1FB253C699289759AA31AD93BF21FE5BF997CF5AA25B7942D9E390B52E6465257DE9B6676393CB6AA9FA0BF97DFF0038C4BE5FB186E7CD3299AF1497996BFC33618E5B3CA6B620CB646F9AFF0025F45F3497D3AC6330A8F843A6C7C3AE64893AE9C5E7FE59FF009C4B6F2E6BEFA88BA9E78B90608EE5878F4C12935883D1FCE5F91FA16B366919822B5BC450A27550A6B4CC49CB7722317CD97FE5DF30FE5DDECA90C72EAB696CD44F4EA683000D8F40F2E79AEC35E884733AD9DD746B7907C55FA7010CD983EA0F1AFA3C1404F85180EB9590D812B7FADCADCBD6F84F4036C810C834F248AB406BDB7CADBD21BA53293CD41C5B42552E936F221AA038B20C2B54F2BC3217A44BB83DB16C3BBCCF54F2A4B17F751803E58B5F0B13B9D1E5B706AB4FA314243346F1FDA53BF4C50A5146DC838041076C0589927F096E03236C0A6F6C582FC3D7FCEB931BB548A3A0D2A6BABC820B40CC2660251D7AE5A22D7C4FD0BFC98F24E95A1E9D6B7A2D985F08F90673515A7865F8A3BB4CF23D4FCD9E6780AC36D247CE78E3ACC3F6683AED99341C7F11F21DDF9E17CF3E61BCF275ADF243A7D94865BB8D0856A0EA2B5F6C691E25BD5935BFCBEF2569062B7A34F0A7266EADCBFD6C683025F9C1F9BBF987A879ABCC37C25AAE903E1B5727627C0602144A9E07E85AB1755670AC4D77C1C2C2791D64B67A6DC898BB2CBB8849355DFAD463C2D5C56FA7FF00203CAB16AFAF433BBC73C664570817DC1C785BE127EA25D4634ED0934E0BC04DC5828DBA0ED9121CDC401E6CF7CB6D0268F089CBAB2814A1A7DF829BC4425FE6C65BF8AD6D636E3561C877E38D331009F689666F74B92DE195614B215766F6C69B0462C1FCF9AFE876D2C3A341AA4308545370ECC0EE7AF7CC79C776C1008D7F39FE5FDA687656D77E64B5630D0944700D7DF7CACC14C22C4BCD5F9C5E4792D27B1D3F5980FD6C2ADC55813F08A0A6FB640E32D6718653E49F37F93EEB4286C1756817D221A3F8C035EBBEF90F08B0F0C273AE79A34C3A7CF099619CCBB2B5410C3DB7CC8863A0E44202980CDF92FE44F3BE963EBBA72FD6AF3ED3A902B5C3C0C258C3E78F3E7FCE23685A523EB9E5EBAFAB6A963FBB823076A2F4040EB83869C69E10F9423FC92F3C4BE66FAC49A6CB33C8D46B8553C4FE18971CE9EDFD0E7E5058CFA67E52FE5769B72A52E74EF28E896D7087A8786C21461F78CE9F4FFDD47DC3EE797D40AC921E67EF7A2E5CD4EC55D8ABB1568FBE2AD547862AEA8F0C55D51E18ABAA3C3157547862AEA8F0C55D51E18AADC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF30EE7FE3932FFBDDF60FF7998EE4BF25BF357FE537D53FE39BFB5FEF6F5EDD716D0F1497FDDBFF001C5EA7FB9E98B745253FDFDAFF00BC7FDE0FEFBFB9EBDF23264793F4DFFE7143FE3BBA67FC707A2FFBC7FDE74194B18BF42B56FF0094853EC7D8FF0077F5E9FB194CDCA83C8BCEFF0061BFE521FB5FF1E7F63A9E9ED98F272E09DF927FDE49BEDFFBCB27FBDFFDEFFB2FE3953938DF1A59FF00E4EBB4FB1FEF50FF00783FBAEA7EDE464DF27D01FF00395FFF001CEF2EFDAFEF63FF008C1DBAFBE53258F3625F985FF92AB47EBFDCAFFBCDF6BA663C9CDC6F00FF009C69FF0094FA7FEE7ED0FF008EAFCFB65679B9717EA37997FE51BD43FDE3FF00799BFDE4E9F64F4C94F936E93EB7E3179D7FE531BAEBFEF43FF7DFEB9E998E5E9B4FC921BDFF008EDDB74E9FEEEFB1959E4EC23C936D3BFE3A375FEF1FDB1D3E5DB029F8ABEB3FDF27D8FF009E790973627E2AB17FBD717F75FDC8FF007A7EC7D39383AFD47C5FA1DFF389BD2EBFE385D0FF00BC3FDF77EB99F89E675DC8F37D49AFFF007D71FDF743F6FECE6645D066E6C5344FF7A24FEE3AFECFDBEB99117124CCAD3FBE7FB5FECFA60C9C9AC3CD3CF1F69BEDF5FF0075FD398736F8BCA74FFF00A587FBC7DFFE3A19747E9497CB7AEFFCA552FF00BCDF6FFE95B80A43D7A1FF00792DFF00BCFEEC7F7DD722DB1504FB67EDFD1959641565E9DF2A2DE12997ED606D0843F4E2C825571D5BED7D38B6B12BFF00DAFB3FECB14179F6ADF6BFDD78B51611A8F5FF00757D18B192017FBB3F67A603C9804543FDD8C805926D69DF2E8B44F9BD2FC89FF1D6B7FEEBED8FEF7E797C5A25CDFA15E5BFF8E6DA75EA9FDD7D1F865F071F27262BE69FF8EB6A5F6BFDE47EBFC32E71DF97FE4FFF00C995E66FF7BFFDEC93FBBFB7F4FF00938ABEC7BDFF00943F52FF008E77F70DFEF47F7FF47BE2AFCCCD7FFDEDBBFF007A3FBF7FB7F63FD8E1632E4C6A3FB4DF6FE8C0D3245C3FDD5C74EDFDEF5FF638583EDFFF009C50FF008E9C5FDCFDA5FB5D7A8C0E4C1FA41E6DFEFB48FB3FDCF7FB3909399064D63FF1CF8BFBBE9FB3D320DC3E2C67CC5FF1D0B0FB7F647F77FC71671F8A62DFF28CEB5FEF67F74DFEF07F7BF4E167F37E67FE65FF00C746F7FE526E9FEEDFB5903CDBA3F178737D97FF008EDFFCF6EB8127E2952FF7FF00F4B5EBDFAE2D72F8BD3FCA9F6D7FE526E9FF001EFF006708607E2FA3EDBFDE1D1FFE523E8BFDFF004FF65930DD1E5D5F5BF977FDE0D27FDEFF00B2BFDD7DAFA72054A7FE6EFF007960FF007B3A8EBF47DAC816324FB4DFF8E7D97FC733A0FB5FDEF4EF902C1F62796FFE51ED07ECFF00C73AD7ECFD9FEE57A7B674DA7FEEE3EE1F73C7EABFBD9FF58FDE9D65AD0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD9, '1', '2021-03-13 12:45:48', '1', '2021-03-13 12:45:48', b'0', 0); +INSERT INTO `infra_file` VALUES ('6edb3893-8ec8-4bf9-aa64-c04f1c7ad98e', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F0000010305010101000000000000000000000304050206070809010A0BFFC400431000010302030603060406020104020203010203110004052131060712415161137181082291A1B1F01432C1D109152342E1F13352620A172472164325345392E2FFC4001E0100010403010101000000000000000000000304050601020708090AFFC4004311000102040306040602010303010803010102110003213104415105126171819106A1B1F0071322C1D1E132F114234252081562161833437292A2B2D224258234FFDA000C03010002110311003F00FBF8A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A0AC4C7CF97DFD89ACEE920903F71909243FB3CA2953A948260E5AE5FEFEFD29962312647F261DADAB54FBB46C10A2D60FA966E70826F595BA5941E25A7FE44A4825BE9C63513CA69A276A214A097A9E03D63265A85DBDF46841EC5AD187C5BBCE0696AFCA56A0904F2039FCAA524AC4D018D5BEDC3CFD886932709658834BD0F0E56F3CA1E22E10B820183A1EBF4CB9CD6B326196A29A1B6B623B74F38525AC2D20DB510B05054C4E5D684CC2A6602BAFF71BC7B4A07CD9F841149580633FBF5ACC11E832268823DA20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20840820C73A5029934B8D789F7DA140A64711AF13F87ED142BF29F4FA8A6D88C289E0920391507D9F66D0D558B097A0245BCA9D7FA363108D34DDAE2172E38BE137E13C0A0608F084104E5F43A193CEABD8AC18C3106D7A5E95AE76A59BCA1791395398105EC3ADBD39DB268B6B10C5F0D18A0C3577187A9E42B5B958372743EEF3D2069A4803AB0FFBC8C2AF777C066624B736FEDA9A44C4BD90B9D2BE7192B552C843AB3A97D1C7F717BDB3ADBC96D6D2925053970E900465CEA6F0B8A18B97F31DC9624FBCB4F60464E90642CA14929539704311C0F9FEA1FB7CFD3F5A9295FEDEBF784614A710422BFCC7D3E828821447E51EBF53441155104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104450C4D92F5D301B70BD6DC3C400FCFC63FF00D79E70067D09F4A6EB9E106B400E7C75F6348C33B8F21786AEE2AD254C254D3E90EA5D5AD6A4C2184B492A25E3FDA08120FE99D64ED09094B93500D33A3F0B521AAB05316680B121FBD3D8EC0C72B7DBCFF894EE97D96762F197705DA5C2369F6F9E6D6CDA6016578C5E5DE18F825B3F8AB54AC38CF1485A6332248D0D5476EED793F2D5BAB4835A3874E7EFFF00F422DDB1360CE99392152D6427759C12921BCDBD75AC7CA1ED6FF11EF696DBEDE6E03B7F6FB718AE0F64E634D1B8C0ECB11BB61B72DDEBB69086C5B85907FA440209233D2B8BEDADBCBF9A425550A167CCB3B50F6341D23B76C5D8084491BF2C01B85BE90D6ABBEB6BF4AC7DC57B266DF5CEF13721B0DB518825F17B89618D2DF55C4F88A5A5B6D2A528992789526739EDCBAF783710711B2E5AD4492522A79F1F7E51C6FC6385186DAF3D2121292430019837A46CFA7DD05474807EFE357795FEDEBF78A94548585A428640F5A710426BFCC7D3E828821447E51EBF5344115510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510414410510478639C7AD10422B70699F61F0D47D34F5A208B57157D9B3B945F38EA6D8B48756950570B2E808952AE4999091F97A647ACC06D3C4090824E8FA3D2D7E1A1830A37E72505FEA2DCE9AF5F58F9FBFE279FC5A30ADC058E31BB6DCF5FDA6D46F5F1369CB0BDB5B3713796D84A5E4F85E2145BAC3CCAC5BB8A5C990148988CEB96EDCF150C2EF8DF096041AD9BFE35B1CFBB88EBDE16F09AB1CA4FCC969992BE9282DBCAADDFAB335358F90FC671FDA5DB2DACC7769F6E318BDDA5C5F137957CEDC5F3EBBB603AF953A5A42DC3C50C9596C24C70F0C72AE57B43C6431130A44C24926E4BF06A7E7817AC76FD9FE071225A54248140C426D9E94F3E2F0CF67F1042F1861576C16BC2C4B0F36E1A4F0A045D37A13D3224E7998D6A2D13978D58512540A852F73E5435F661C6230A9C0A199B752ABB0A80457F0D7B47E871FC3C2E9CBCF65BDD95C3AA2B5AB0F70499984A9B09D73FCB15E96F044BF97B265A48AEE8A9CDC9FD7947977C6F33E6ED89AA77049E548DF55FFC47FF00A8FD2AF72BFDBD7EF14C8A58FF00893F7D29C4102FF31F4FA0A208511F947AFD4D10455441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041441051041A510435372388A40CBA99E5AFDFCEB2C7431B896A29DE0CD5A674E9F78592E020120FA7FBADB715C3BC25315F2802ACFD9ED0C9CBC487FC208717EE9515244A13099827404C7DC56E656EA0294E1DFAF271EFAC371880A56EA475D3FA7F53A3C4BB8AB49B755CA92E04A78CF01FCEA4B73C4B039848127A0A693268403C01BE747A7EE91252A42A6B338720727B3DEF46FC47CEE7F186FE29985EE1F652F3747BA1C4DAC4B79BB4E872D1D5DB3C975FC1036471F096161EB75B8CA95196640EE6B967893C4F2113D7841FC88604B642ADF97D6863A6787BE1A6D0C74B4ED10A1F2CEEA9206F6B906D0E5FA3F1FB79B578EED16358A6D56D05DBF7FB538A381FC4F16C61C5BB8A153C494A1A7D5EFF00080A28009FC99682B89788F0D89C7854C94A2CADE2E496725D8B06D341DCC77FF0A6CC97B1CCA4CF4A545346AE547660DCB3B0E1157CEBADB8943CF5C34C13C43F0AA8599CC95F2CC991D672D6B96AF63E3913C952D4C55A9B5333F961C834761978FC0CCC37D284856E8029C297E35CF389AB3C66D117B84E1B609E2BCBABDB4E07AFA080A6EE1B27888CE55FDBD7A9AE89E1DC0ACFCB4AC97053C474ED5766CE398F8A12662672A596A1208003D3FB7AE75A47E875FC353F1AAF643DD5BD7E86D1706C6E38C36084C071213139990273AF50785E42A5E025A5A8406F795ECDC9DE3C83E2C27FEE73526E925CDEF6F4CBAB1BF41B8C2D05398311DAADB2D2433E4F5AB574EF1578ADA494A003DE96820520924E5F63CA8822B488007DEB4411ED104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104144105104332D00B2A264F41A67FE32FB9A0162595D1F4E1EB0AA57BA8AB801DD850D4F7EBCA14CB4F80A5C6A73F21A7BE4E5A23713382CEE876163D7D3BFE60B124DC36DB82DE42AE20054E69232D46920FCE75D50C4CFDC40054ECEC1C503D7FAE1CA16C061FE6A9DA97E4C4971CEBDC0A67CC3FE259EDBFB39EC5FB88C6714BEBFB556DCE2B66FDBECAE1FE2A3F1172E3A54C5CA92D1525D596D2EA55EE194EB19556F1B8D4A50BDE57D441662E406B1A38EBE917DD8FB24E2D7266CB42BE56F0F98141C100B0619E649D4F38F811DB3DE2E2FBE2DBEC477BBB68E5F5D6D0E23777772117854E5BB69714E78296C392B03C352444E59655E7BF124D3336B29408A28B9CD9B2CA9991C4C7AA7C307FC4D8E996DBA4245281FA50E5EE8F67DC630E3D69885E5DB1174EA901808465EE2B8444E7F9634FAE74D14BDE90D9B503BB8EB763566E8F1954F06728D2F5BFE9F2F530861F8C9BC69CFC69875AE1E20AD424E49CBEF43553C6319A684107D8D732EF607AC5870B3C26592AB1029ADC55B5C9BEEF10B6F77737FB71B3563624A9C7F6870461A08CCF0BB88DAB6E4013970A8CC0F955B3C3E80A2839EF0E771DB8F7CA29FE22DA0942561CD942EFADEE1BB3F08FD407D92F6311B15B82DDC60086FC216FB3D873E5311EF5D59DBBEA310352A24F53CEBD29E1D4B602506144E5EC97F2C8671E50F13CEF9DB5710B705D43EEFC3311B3496C01CC7C8F79CBE1FA54FC57615A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828821B3AB4A544150062403E5590905CD011E777E30DA62941C55893AD2A1BF5E50D9B7D2B497152809FEE5E49CF2CB49C87AD68A9852145C80900DE9C857B3422941597DDBDC900F9FEF9B461DDF76F3F04DD76C3E2FB658EE256B8761183E1F7777757172EA5A014CB2E38DA10A5909E35A90123AA8819CD56B68E37702885391966391F7CE2E7E1ED9E274EFA9255660D4AE4DD6DC5A3F385FE203EDABB55EDABED378B6338BE2574ADD8ECF623776FB0586B8EAFDF2CF131882AE995294C90B7590A64B5A82273AA06D0DACC6602B2581B9D41AD4F1AC776F0FEC69625A1210024350240BD4F0ADAD6F3D78731F17984B16E2C98B661B9485787C172424812AD358907A6715C7F6A6304DDA0B50373AB82E38687DB978E8F2D230F204A14614E1E61EE1B90E062C2C57690DBBA96D0C85DAA3881E24CAC98911CB23CE3E4269D024CABB535A6B6EB6CDEF586292A54F05A84E560F62C5BF3E916A0C4EEAED38A5DB07C312C809320E796401CBEE2273AE624154FB9626CFDEBE6F67D4889C4EF26428D430A87CEAFFDE71B1BEC8BB0979BC6F68FDD0ECC23C172E6FF001D6AE5697412829B2B862E3300124808300E522AF5E1B96EA41A0A8E6DEF8DAED1CA7C598B32BE692A20310CE6F4635E55E01F48FD46377F689C3B63F666C4A63F0B816156F0065C4CD85BB6AC8F29498AF456C30D8443061BA18767C838F7C4F9DF69ACCCC5CC59B93F97F26CFA45EE1415313975A9B88E8F68820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20886C47F0E9429D5BA50BE24C4A8246640239CD658B3B75E7EEB5F36704952C92029B32C481D7DB72A431C582DF612CDB381B6D0DA9C7DCE284A5284859248D321399023946551F8A5A82083762E03B3694CC8E76D042D2A484946F060E03666B4E6072CFA47C5B7FEA1FF00E2238D31B43B3FECA7BAAC7949FC4A710636E6F70FB950FC280843F68875C657EE789EF27FA91331D6681B6311F4AD5BEDB8F404125EED99E3766D0C749F0EE1C26624A430514F61A7A91CF4A7CB7EEEB0DBA432B6F197495DA3AA7B0DB85A8F1DCA9F70BB7478D43DFCCE64684E7CCD722DAFB40852F749CDC3DA829AE7C63D01B064A44A416B80030D296D5EC7D488C8D7D8C97EE5618052D70A5000D3DD10743A4899D0CCE46A80B9E6662F7AE5C0B335684D1BA718B1CF91BD4614A583D2A75FCF786A2D9BBA1FD4D79CFA4E7DC8D0E43B0CEAC7296AF9391A0D2BC3F6D5A7186987C2EF4C14203DEC0D4F98D3EF148B06ED78D981C374A4C003FE9F231E4395474C4EF4D14BDDB2B135AD0FEEB689B9D86DCC39A1B162C6BE753EBC6E3A93FC19B76771BC2F6F3D8252992EE1BB2CF5CB974A20A90D7E22C8A9AE230401C439F38F4E85E1B961E58FA6AC6B7E7C69F78E03E392A499C9245281AF7AF2CDCE7AC7E8C585B29B6B3B46131C2CB0DB690232086C240CBB0AEFFB1C3615219A9CB38E0B8B24CD24B3B914E0D7B5625DBE7E9FAD4BC358528820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A3C41C6524111FDC7435A15805AFAC11E2DD4A412015C65091268F98343FBF79F9410DD37D6E484A95C0B248285101498EA279F2A3E60D0C10BB8F36D23C45AA11CD59401D4924563E60D0DBCFF001C7CA08F5A79A7D01C656971B54C2D06526323047435B82E1E0852B3045256018CFEFD68823CE31D0FCBF7A208B571E6FC4F01A09754A5AB88140948E15030B1D3A538972BE64B52B78242323405C93D843DC24D4A5D0A6B356ACF50E39DB8D738E7DFF115F6C4D9AF637F67FDB4DE063772E1BBBAC1AE2DF03B2B2527F1CF5D38C396C9534DA882A0D3CB42DCE1CD284CF4AAAED9C64BC382F352E410CE32C9AEDCDB5689FD99B3558C50051541B9142E4EEB3D2DAF611F975EF2F7D5B63BEBDE46D36F3F6C7164E218DED5E3776FDD3AEBEB75C66D5178EA6C9BB752C952562DD4843892609C84015CA36EED295B8A295EF1ABB106D50E34CFBF38E95B2B644CC3142D6592902CF60CCFC18FF548CF1B05BB1DF0EDE26CC6C96C06D46D0D9A1294E197383E18FDD372EC078DC2DB0470C9CA0F2CCF4E1FB73C45829626A9588952D52DDC4C50750D031B9B679657E8381DB72B01BA161F75B7788AE763CFB0CA376B63BF8757B536D1DBDB963763B4ACADE1C454FE11789038BDE1242758C8E473CC93A57259BF123032316A48FA994438DD3D4135ABD357789C3E2BC2CD48514EEF16003B379B77D62736B7F8737B57EC6DA1BCB9DD86D2DEA1292A09B2C1EF1C591130014807FD55B303F11F67CF425090D40EE0573A375BD4BF087DB376F613133025050A0F5620B372377E753A18D3DDB3D91DABD8BC66C702DB3C0712D93C5ACD6E26F2D71CB65D93C82B82D8521C1C43887E59D4C413CED9B3F6B49DA0B4992B1BCA228E0BF519B699C5BA662A54DC2AB75988EA0B3963DEFCCDCC7D13FF00E9CDDDBDD5EEFA37D5B697765E1B7828D9DFC05FBE8E1688B861C4385A77A119647D729AEC7E1C401F2E8080CC59CF337A172D5AC79DFC7C903E6BBA9DC84A43A8B3D407AB67A0ABC7DB058A38D86D695A5423549904C09835DCF6497C3279379C701C511F394002189BD0D4E6D1209494CCC671FAD4AC368AA8820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828820A208A4AC0319FDFAD10479C63A1F97EF4410718E87E5FBD1041C63A1F97EF44115032268823DA20828820A20828820A20828820A20828820A20860F2149716EBAFF000319402A80206797CE9057F23CFDF7BC11666D2EDADBE06C1164D1BD7D2098653E249F4CF4CBEF2C41166E05BCBB7BCBA51C630B7EC9CB8570A1C71A0DA441E104151CA4C41EC2688232C5BC9654B5A85CDA3E029224AA124663A089F97C48224ECDB61A6108B7484340A884A4400493390CB5A591FC4756EF0439ADA08457F98FA7D051045344116D62CFDD61C9BABDF716D0485A52A24F021225D24682132673F4A8ADAFB59381C217207D24BE74239E55F3D61EE130FBF346B4E01F2AF0C88EA23E367F8C3EEF77F5FC42FDA8706DC2EEA2EEF2DB775B1572A6315BAB75DCA6C6E5388B4D3AE788B6789A5F84B43807101C24419AF2EF8CFE24CBC0CE9FBD3095249F96970519BEF54D9B22CF7B18E9BB025FC94277F777BFDEAFF713715CD99983F988D9AF63EFE047ECE7B90C1B0FBFDE660ADEF076990CB2F5E5A6256F6D8A61697D438C8436F36160024F1839C8AE05B57E2999C66113882778108564697269525F3F38BD7F9094C94EEAD237B2984351ACE5BB3D63B05B19ECE9B98DDC61CD33B2DBBBD93D9BB665294B16B85E176F68F909802108004981A6624F3135C43C4BE3138A54C57CC7DE2436F56A4F17A5CEBCE23B153C4C56E041537FF1121D2332C6C34F4148CB78761B6966E8559D93F6481012C7861B291119240301433F2D35AA12F18668F9EA2CF5AF0D78039641B3A4252E6808604115078F0A173C34D5A24317167736E59BE65C711C2414AC05020F9E5E5CF2E734BE0FC512B09352952EC46741AD29AF730EF67CE5CB9A3E42D285121EE120D09B7534C985E38F7FC473D89374BBF1DD4EDA6D3B3B38D61BB6384D91BB671CB7B4659B8B95B2953A0AAE024AD45296C2046931AD778F03F8BE4CF99282144311BCE456A2DABD6B9DF9741C16D4C42657C9C42E5B28109DD35B5779ED95ABF7B3FF00F4F9EEA319D90DD0EDC63D8922E16EED0DF8B5B75BE1456EA307BFB8B702559ABDC4011F488AF68782270C6C894A0E4A8249734B86BBFEBCE39478DF1BBF3378A80037C12E1C3D1F5173D6B58FA6FC25C53962CA94C9B739A7C2524A48E131307918915DFF00662372424337D3F88E233CBCD59077812483CEBC35FB448D4942505104144105104144105104144105104144105104144105104144105104144105104144105104144108AFF31F4FA0A208A68820A20828821647E51EBF53441155104144105104144105104144105104144109ADD4B7A83F7FEC51045958D5E3172EBD69E25CA1600109308CFA798FB148ABF91F77AC109605B396885975E6C5C2559C3E0288E7CF2E9DFA56B043EC6B6770BBCB77FC4B0687829E2654CB490E056B918EA069C851046161B6DB43B3B72E30AC3EE6EF0F61442129694B5F082604640E9CBFD10465CD8DDB6B2DA6C383E8B67AC9F6F272D1E4043A0CF240CF3D7BF6AD3E60058127562D5CBBEBEB045EA8B84ADA0E942900980958856B12474E7E559F9BC55EFAC11EA882B81993F2C86BD3E7419841673C6BD7FBB41082EE1A6D6B438A08298CD4400644E46B066D0D5563EEF19170FAC6B27B4DEF217BBFDDE6337B68BF1B14BE43769855B33EF3CE1BA5FE1DD52500F11084B9C448D0024E715C8FC7BB653230D3D1F308514AB76BFC6878E7DB57AC59F64618CD505252C10DF31EE4AACC1ABAD79651AAFB8ADD4586CBECB8C7EE6DED95B7D8FAD7758962A1224B6EBAA759487A3C42B6D973848568A112057CEFF89BB7277CE9FBB354594AA856A5D99F8E94B333C5FF00012CA081421830565A1F4A371E7B09636C6C4ADB45D5CBE98042DE5F12CAB55051FF00A857E5E511E47CF3376B6297356D316CFAB539D5B36F3AC4F7D6A4212B4CB3BAE086A0193529D33AC797AAC42ED4DA0A2CF810A9F1784F8E04823DECF3FBD29862264F9A1D44DEAD7BE7C6FE56B0D44909720A9943F893F4B8B3701A449B988ADBF75B425C504A4788E895929039F6323F5A55789F978420ACB806A491E76A0E19650C66CA284155537648A015CBC9F9B690DBF1A5FF0076EADD95248E4993DB5E9DC4F5E75CD7696D5988C428254582C3E6CE79B71FCC35953D52D745117A83DFEFEEF8A37C96F60FEEFB1F6EE2D9B364E5B969D4292381497429052444199C875AED1F0C36B4F9B8BC3A43B1525EFADF4EE474CAC92316A423E62D64A88A026D4AF916D3A45C3EC57B23826C66E3367ED365F09B5C3106EB1277FA4C21A5A94F5FB8E294BE0E64A8C1EE3AD7D51F84A93370787047D44249241E3566E57E4358E61E2A9E664C9CA2B5105BE924103CF37A664C6F95AF1F80DF88657C2388832248072F8D7A525A021200D07908E7A15BCFC0FBE5CA1C5291B414410510414410510414410510414410510414410510414410510414410510414410510414410510422BFCC7D3E944114FBBFF0064FCFF006A208A8249008220FDF4A208F780F51F3FDA88214488007DEB4411ED1041441051041441051041441051047848027E5D688222DF773E7EA72E5AE7F64FC48220578797AE4BFC392C8CCEA741E7AD22AFE4608B86C5AF0841CBAFC3B9ED5AC10929775F89B801014C80380998329CE3B7DE74410CADAD6C9DF1BF1366CA8CC9E3427424E79F59E9441186DD79EC1F780EB966DF87875C2D03C240842211072190939F39FAB259AB07073228FEFF0030466C2E2AE5F6024FF4D29E254130AE2483D391F856AE753DCC10A5C5C1B40FBEA9E11C013AF3CBEFEE300AB3513C6D04446216CEDFAEDDC4ACB49852DD5494C2520193D3219498AC2D442165CD12A373A18C8B86BB86E71CE5DE862973BC6DFEFF00212E7E236536023F1E12A2AB77DCBFB70A678A4F028A1D1CF307A9915E2DF8C1E334ECEDA33F0666B315021F813DC7987E71D4FC39840BC1A5652904E6CD6377A0F74BC66FB36DBB4C2587D88E06F8901034080AE14E404649033E990EDE20F16EDC4ED09B30EF05051373435B8C87DEF16642129510033588018937ADE95EDC22590A0E202D26028498D67CFF00DD51654B0BFA88CCDC31CFAD72D1ABA43C4AC001EA78DBAF0D0BFDD839289199E83D358E5D3AF5A6D8C9D2E425449A797E32CB9D32541053BB40C439D1CE5C7335147610D56E24B9075E632EFF007DF99CCD57B158EDF96B093420D34D2D5F778D9787DE946809AD49176F74E59BC535503825E2A7B004EF2AE7526A0B7E7ED158992CA66804B549616EADEF84620F68571D4EE9F1566D64DD5CDDE1AD3694FE6295DEB685E999C952794666BD1FF0AB602D38AC3929FF00720B805AE3D7EE7A494B5A84BC8848BF3D03E9D78D236AF725B3AD6CE6C060384840496ED10EA931C2429E4A5D5748F789CFE35F55BE1360BE460E43803E8431B56DC78646B58E6FE235154D9ADFC722F4F747AF2CA33D5BBA3C24F1647A65CB21CFA0AEF4A67A5987A7BE778A6243121C1E5D6FFDD216F151D7E63F7AD6378AC104023434411ED104144105104144105104144105104144105104144105104144105104505694983AFA7EF4411E78A8EBF31FBD1041E2A3AFCC7EF441078A8EBF31FBD1045054D289F7E09E522474D3CA882105DBA97F957944E4743CBEF9E74410E59429B6D295192264D1042B44105104144105104144105104144105104144109389242BDE0001CCE9FB4D1045B57B74865478B88C4CC73FF1209F5D288225B0E75B7ED1B7384E723319E47BFC7D6932824921BDFEE32013610B2D694C8022798EC7B47C72ED4990C723CA164CA0AAD85BAB642FDCF78667124A16EB5C6DFF004C0993EF264492AEDDB23DE88DFE466DD03EB9790C83968B3711DACB1C39C2D2EEED9F79F3C286587029D0498F7933AC91F5A23030E4BBB86E5EDF87E229C130379EC42EB13C490DA997FC35DA367FE46C47BC5615A7148E1035ED35ACDC12B70AF79AD406A59DDFECDC21BCC1F2D401B17E3EF236B18BEC2036DF0B412956504F200E9941D341A77E906711FEB7C904EFBB1739F063EB0A84A481561A8F67B656A44462D78D7862DDC9487149F7E3DD94107CF5C865AE50273B1E1B63CD9F2FE605BB07202AB5C855B8D78F08748C0AE60DE410DA532D6F56EFA462FDEFEF230DDDFEC5E278D5E5C22D12AB376DED7C4586C97DE41619E19227FAAA4E633CFCAA8FE2ADB523C3B266AA7AFF008CB5B82A1FF13C5A8C73CB38525ECE5CC514A6AA494BEE976E63D75EEFA05B91B0C75DD9DBCC5B1C478DB41B497770FE2D7484AD41DB745CB8BC3F816A1C4A86149078B2E432815F24FE39F8E93B43C518932261DDDF50001D2F47A5ADEC760F0F608CBC000A71F4FF00B8D0737A57FB8D87B5BFF0D3FCB1E65E408010B526100E5993CB3CE73E95E795ED799356E54482753AB96E678826260E11EA92E03B101FB51DCE629F68B92D0165A4B4B3C4A124A939A7324C4E50454B48DAA809DD20BB5E8C7F5EB09893AB5CDC90694AB7AFE21DA4CE71A9CBBE83EB95426D19D3315BC104806C051EF42C076D7ABE486247BF6D10B70EA19B8216415023DD1911F1D7FCF6A811F3503E52F7897E94AB74A7BBBF96B4AA5697BDEEF5E9D876878D02E20B8AFE93600256E7BA8CFBFA67DF49AB16C7C3854E4AA60012487F2B3D9ED71C6ED1058993BD314A4B3E82FA656E1D58C618DE4E3981DCE2182ECE5C62568E8BBBA415B61E49092CBA858E313919194E875CB4F587C3618695370E5D0900A6EC0BFDEF566A5A12FE32D60A4BEE9A0772CEC35A8B746168DD2D9CC5ACAD3F0564CBCD5D7896D6E96FF0EA0B0809653F9A208D07F800CFD0AF00ED5C14991210264BFE2960142EC2FD0DB5E158A26D2C24CC4C954E52552824A89F9819C12599E873CED1909CC52DDB70B706404E4223300F977F9D77594B913E58989C44A0E0382A0EEC38FE69DA2AD2F662948DE4A98126A74761D34E70A22FDA5E8950F3F5FDAB55AE52003F3659A904850CBDE709CCC1290F576CEDD6D6E6444A34F23813C326674923BCEB07C865A5335E325A4B0208D41E5D3386AA96A45F26E07D8CCC0AB9099046604F0C67E5AD23331E94644962C067FF00DB6F65A1B99890ADD37E7EF5B3C788BB4A92094A927A1107EFCF3ED5A2768EF16DD20D1DC0CF8D7D2174A0AC021AB50FFD7AC565FF00FA89F3CBE84D4A4A0A58DE2CC6DEC0F7D9F3F2D4ED4ADAB4E5CFFABC79E39FFA8F89A5770EA3CFF119F92BE1DE2B4BB2341E99451B8751E7F88D770F0F7D2140A07B1FBD3AD6A43163946A43163945548AD6524D0306E756E3188A0AC0EA7CBFDD227120121879FEE0838C743F2FDEB231209018579C1092AE1093041FBFF34F512D6B48506AF4848CC67666E37F231EFE21249804C7435932D42EC1F9FE23433C26EDCF2FFF002848DE278CA122549891CC489F877A426A8CB2D4347A024D9CE7FBBD28635389A80002F9BFE3D87EB09AF1065B5842D412546005644F909FD67E94C958F4255BAA0D56AD3ADF8C60E2802C401DFB33C7AE2D2525D198ED9CE5AEA7FC548C9DD9A84ADE8A7A8346F7C6F02A7ADDC27E9362DDF87115ADA1AFE2D80095389491FDA489F818A658BC6C9C3024AD34A9721DBDF0D03830E657CC9A5820BD1A9ADBFBB738B4368F78BB23B24C2EEB68F19B1C1ED500A8DCDFDC22DD8000CC95ACE83E755D9FE2BC2C956EA88E7A51DCFBCE26B0DB1717894BA10A3C0073D83FAE91A6BBD8FE257ECB5BA7656E621BC1C171E75BE20BB3C0713B3B9B90A4EA0A14AD7B76A64BF1C60104825D9EA18DBF7C62CF80F87DB631D284C4A02378D1330282868E32D7567D239FBB45FC797D98ED31FBD6AD30ADB7B9B7B72800DBB366B4AF2FED21C00F383A66075A8099F14B672715FE36ED49005BAE74EB6E313137E16ED3C3E1FE74E22953BBBCDAE9D39C7537D943DAB3653DA8F77184EF2F636C318B3C1B17F185B5BE2CDB68BB3E03A5959525B5149F7812209C88E8455EB656DC95B51095CAA6F65C3D7AE6C639FED4D953366A9495D4A0B1777ED973D637090EF124129209131D3E3156058280F43C8F2E1C620D13378B311A93D721CA2AE31D0FCBF7A13F53366FE4FF0088557F43BE515020891410D431AA54141C47B446D051041441051041441051041441142E214329313D4FEBA510441DD61FE31396B3A67F5FBE7144116EDC58E2ED38A45BBFE1B00FBA9E25089CCCC69D75FA524B51721E9EEFEF9DA1E61D28287500E4E6389F7588F5D9ED01822E675CF8D47D7335A43A094E4057AFAFB31430E5C38DDED93E034FA1290BBB57BA973881885E731FBF9D101166715CBFA3D85333990D706D8FC2BDDBEB809BABB0A2A4B8785680AE23A1226040D3A40E704614486622D576F6E7215B68F1925A49084050485240108D0002123E1197A695AE331625C929CCD88E4D41C751DA18CD413535009B8F3F261AF011497614467AFA76EBEB1FE6AA5225AE662F780533DCD337FA587BB57368AC48954CC137F74A9A30A5E18E236D6D76DF84B212E6AD9D0A888309D27400E7CE3A55F25E32660A56F95B0082F91A248CFC9F4E912180C7294A00541B8CDB3CCB665EA0718E597B6FBB8CEF0369B61B73F845CB96CFE2578B7AE54CAD4996EC1D6AEA1C89905082065067400D78CFE37F8C4A7FC994164B058A13620F117BBD0718E9BB0F65CA9F2862124013189529A841D73FBD3AE68C1997B05B7B2B266D90CDADAD95A5B97B87852A71A61B69C515692541473CABE5CF8C14ADA3B5E762007056A2146B43E77A791D22FF00224A30F2848241DD01F7454BD6A1D988E2ED17336DA5E22E3C443EB4E7C2D90A333066333D32CE67CAAB08D9EA2E40A92CCDCAD46EFC808C198949284A4A121C1DEE232F4EBAC4DDBCBCDA5650A6C1905247BC08CB31F4CCCF5A7A8C1AA8198B54E8F95B8356D0D17300A3D4E6FF007FEB38916DAFFAC18D32FD33F5FF0074E656CF35A10491522CFE8D5E5943698BDEFF00711A9B69FD311C231A6F0F0ADA2C5ECD769B397D84D95E70C071E756DDD024E454532476CF41CB28901B004C4098CE74B922D50DEEA79624CC095AC12B3BCC5CD5218656E02B7C8EB801BDC96F571869C631BDBCC5ED5974903F95624F200049309E21D08E5CA9038656115BCCDBACC2D6ADBCBED1BAD6925560750CF4008E397DE2DC77D8FF000A7AF6CEEEEF6EB789738C30B5AFC7388A576FC64CA4A5447140F9721573D81E2B56CD5A1456A1BA430701BCF26A1E1A1AC7CC595294459C5412E4B74D2FECE44C1F731BCDD97BD373856DF628B602006138B624F129012520980069198CF5EF5DCB60FC619D8308099EB1BBA28F0E34F40618CF4A672548504AD2F621C3F1D4E5700DE2FDC3B6977D9B1CD2157ED5BED132C294A5DD3097EE94F02660AC91309CBB1CB4ABCC8FFA81DA4852509C5CD01C0AACB3578E435111337092C277004A5811BA96043BD59BF558C93B37ED2EC17136DB4BB3D88583A212A58B50D3614041CD674CE672EF5D0B617C73C562952D33F124A54D5DE27CCAABA1CF38839FB28B1DC52C924B6F3B6B4D2FAE7D6335601BD0D8DC7941FB6C79AB37DC88B4B9B94204CE49080499EBD08EE4D773F0F7C42C163928F99392EA6FE4A0D5B9A97B674BE510D88C0CD4072016D3F96879F6ABF01191BC67EF5B4B8976DD76CE094BF6EA2551CD5C432939673E75D7765EDAD91884A54B992882D5DE490F9558F971A8688C560D2545D2CACF7A84B016CE8C5BD6CF5B6E069210DBA5D4670E2D4173D4714C64646556F9123093A5A66A11294156290922F46A3380CED9C2C896508B330ADC96FC5AD9C48B6E92331946503AFAC79D23895A70E92D714DD1DA83DDE82125ACB543317E3C21D0526341E801FAD468DA254A6097E3EC7BEF0D97308B5341FD7E5BEF5A4A4E994F2FF1A7C3D69F4A9E99A2B43D9E9E46F639776EA9CB0ECAAD3A67D7CEF0BA220693F3D4D616A4A5443B935157E37FECEB0A4B51525D5724FDA2BA44A4ADFF00AE83DF38DE102412634FDB2AD7FC71C3CBFF00D608F2B230E9F607EA086EE708566067CC810329FBEF4BFCEF94022CD4B1AB572311B389DF60F6C8FD87BBC15A1C600F9B5873BD1F58525CBF983EA4D746A5CEA0E82185F3B656ADA5E7DC5214A39F86614A8319CC4C1C8672396B934993D0B503BC1D4ED5CBA16032275A43D95B3D730EE84D732065760CF907A88B3B6AB6DF65765B0F5631B478BE1985E18D214A55C620FA185A40199E224267BEBEA29B4C9725492A2536A03F661EEB4687B2B62CC98BDD32D4496FA98EEE84BF06FEE3955BFDFE30BECABB8BBCC5B0D6B68713DB3C5EC12529B2D9BBAB3BF4F8A50A29496F8C2A01D408CB903542DB3E3093B2E62B0C998A0A4B8A1A6BA81AFA3DA3A36C5F00E37192913552A57C823EA0C77EA28D6F4E85A388DBECFE3CBBECDBBBEBAB7DD3ECF613B3D8195AD2D398EDB3F6D8B96E4F0AB89973878C8CE4643280245738DA9E3D54C27FD4357ABE5C6B9D2F46D6B16AC3FC3D129BFD206B761992DCACDDDDDA39D3B6FED7FED39BF5C5311B8DA3DE66276F86DD70F16096D8B5DA18680490B4B76EB51090A1DF3CA6A8B8CF15AE62C8DF24AAF527EFE4CDCDA2EDB23C1C990A4112D346B8C9EE28FE51AE78DE39676ADDDA71AFC6DFE22B0A3F88BA8778972493C4A20E67BF3CA342C7FEFAB50BDE97AD69E9E51D4B65EC544B4005291BA34A59CF6EFC811185B0E606278AF05B3AB37B8B62D85DA35689325297EF1A60C379900A57396A290C0C85E2F69267392EA15A117EFADC6B5884F154E461A42E582032482006B7E473CB468FD14FF8766E72DF72BECB3BB4C19C6CA2EEDB0D174F248851388F8770272CC8F167EF2F5578370DB9869273600EB517E793B5695BC7913C598BF9B8BC44B3FED53825994F577E047D9AE23A1A93C494ABA807E226AFF882529000A65C6CFE6DECC52B0F55BDCB9278302DE7CFD60041CC5664972068FE6F0E27D52DA8EB710B2343E7FA0AD95FC8F3F4A42328302346FBC57588560A20828820A20828820A2082882122851513208310348A208560741969DA8821A3D6C1C515152B38C81D0F68A457FC8FBFBE9CB942B2E66ED353E5EDF586CAB04ABFB9D1EA63F4CFBD6B0B7CEA30207FFEA9F6880C6F6751895A1B66DE76DD6A20975A5702D4279A867A081D46BD0119130D492492D9E598EDCF8C2D85E088C330F45936FBCE2923375C502B3273CF4D39FA5119F99CDBEF639B5BEF12008B5050AF154948F796BCC99EA7A74E7F5A467618CF0031700B3FE3DF2816A0A41248B331390B505B87DEB152805A4B8D9E21049CE4E43B4F4FBD4AB84C0224A82D4056B517A93C3AF663157C6EF952B75EFA114390A7363722ED68B7AFEE12DADBBEB8712D34C3370E34851E152FC36D456540C03F964768CC542F8A368CAC360E67D607D2A6FA99AE3CECF9D4D6253634A9C54860E094B8625DCB1CB4C9BCAFC45DB7F691D911ED23B53798B0BA7F15C11E6ADF675868A14AE37982D5C00951E3954641199244D7CE8F8C38D9D8A9F88521649758BD0D59A8C19B2B47A5BC298290AC1CB92B037581340E480F9687BE5568CBB84E39BDDDBE71972C1BB6C1B01BA585316F8925E63134B6A5492EA40291C5AA0E85275E55E47C46CE54D9A4A85779553EEAF52D121B5548978829960519D839A00D5152D4BF03C636D763765EFB02C350BC42E7F1576A4F12E1456DF144C0E283049F5035AC4BD937FA43BB00C41E449B0CBCEEF15F9B8A2A59417E2A0EDA70635ED98117AB16AFDC3697941A41512385220009240D27BCF7A7C8D904B7D15F27F2D7422838C3533C2014825441B90E7BBB43D459B89E69D3BCFDFCB4D29C276492A622DC1802296B1E6FCDE105621F3B59957E6FF88A6E703B2B8683A96909BC2656EC09510444919E42227A6B06A625E125CA921012A2B63BD620F07F7D2F088C5CC44C505281416DDB922D723956A5853587B6B87B4D33C0F296A580608323CB965AC79F28A86C5ECD4CEDE0DF5170187BFED9A8F189B899A4FD0CC4DCDDB872D3CE133873438D456E05E5C1044089D3991D79C54327C3938A8B254483F4BDABC72A5A03314A29DD2376CAD6DCB3E6C6D94242DDF7521170195849212482441EB3D80F86752786F0E63A852086B81A5FD321F78DBE9DD26CAE19F3A738F51645B5296979CE1207FF001B8A2D8408C91DF9FC69E0D97324ABFD451749FE24E79F115AB7A65A6EA492E91FFCC456B98BDBADE2DCC67671389A148FE578392ACBC47191C7E64C6BDC472EE2A57098F5E09492950013A65DAB95C1343586EAC3862417E7DA8C29EF40D8C712DCEE1D8CAD6CAEFD5835E364290E614E861614731275FDEAD381F8838BC090113961233DE37EED969DEB0CE6E0D2B2494D6AECDE85F864F9E822350FEF4F7560376589BB8FE12DCC26F9E7AE6E3806790100E444E9A4559F0DF1AF6AC8094A71539280400CB56B5CC0E43BC319BB39054E101CEA32BE84B7F6D431943607DA57673137D9C07692CAF301C552AE05DCDF368B6B0796A248F016A32ACC00ACBF3111DFD31E02FF00A81F9B80932313892576FAD7516E24F13DEAF1058BC1A82D4121806B51DF2F57A74A46D2DA6236D72C22E18790EB0B48521E4AB89B5057BC08568723967CF4CEBD0FB07C6B276F041F9A0EFB31DE70FA82E5F87488C9B2181A392E0822BCDAFCC5697687CBC4ADEDDA6D450B794A2470B602940CEA474CB289D0E95D43038144E4158DD60017C8BE64B1D73636BDE21E6A56926967C891CBD3BD9E1F255C680E04A803FDA47BC34D47DFC6955484CA528A4BB1CAC4559BBDA90C26129C8F4BBBD843A654481FF975D79C5472D6EB22AE0DC9B30CBB7087D20BCB079FDA14592001D67EFF004A7A9237732D702F5261588EB8BC0C29280CBAE951CFC34C84CF33F7D69CA64EF237F7D22B626A5DEDC9ABFAAE5AD6AF71CE2BB8B945BB5E32C1298931A8F3F2CE7A4674829494920A998B7AFE3DD1F1112DE356F72B73C169D5A1A897801C19CFF74F633D0014B8952E6A77C9497147A9A3BF2F4F386C70AA98A4B7FB89B7DF367E50C76876B304D9AC02F369318C42DAC308B0656F5D5E5C3A96D96508924ADC3EEA6025524FC63484C7997252A5EF064BB817BD1AAC28EE747B9896C1E109989941277CEB6D79E8DA18E0A7B647F1CEF672DCD59639836EF71DC376DF6B6C92F31F87B4B9B5C46D9BB8014801286DC0B052A1EF4E7293A72A26D3DBF2F0FBDBA40A666CC2E3D0E61FBDE3666C45AD43E67D24336E50915BE7406C3A068F93CF690FE27DED2DED3D8CE22FBDB71896CA6CB3AEB9E1E0985E217564A530A51848B7E2289E18303204F3CEA958CF1B1438334B00400154CF5E83BC5E70BB092129FA0BB8A33E62BC41D7D19E352F655AC731FC4978B5C620ABB2FAB897738B3CA73117540FBE5F5E739E692732233E75CAF6FED39FB4710A9A851AB9727D2B5E14A748EDFE1CC148938044B28E7415E56B1E3EB4CDE19526DA54DD895369F79C00F1E594827B0FBE74E9F2F12A7FA946A6AEFEC657CF8C4E2A4E140277464C186B5CFDD1A14C3F6999B26CA584DB32FE61C7D43856E6A004A844C4C08EDD2929180C44D58241041CDF3CE95EC38E51A7CF91203A4806BCCB52C33AE6D912F18537938DCADEC41CBCC482585202DA65CCD7C6A480509332003249D055830BB1672EAAE14A6BD73CB8D5E31FF7C932412E2C74A30CEB95697A56CD1D0DFE14FECC175ED3FBFCC3EE2DEDAE2F3677642F70FBCC5D7768E34BC55C0FB019500524A16DFBFC530418ED7CF0F6C55267CB74BD45817A5DB8654D699C722F1A6DE42BE6913004905892181A80E6CD501AEF5CA3F431D9BB0B7C1306C2B08B56C2AC6DAC2CAD136CD2415B26D5869A1EE400904A24EA20798AF49F8730624C8410186EB579598F1F5B078F2FEDCC519939656A054544BA5D98BEEB74A3BDB52232234A3E1254A82607E5F8019F3EB53D8B6000E7EA3F0623F0409054482C00A5AAEDE5F8E752223D73AD30EFBC092F42DFDFB6873882C87F7710E11A1F3FD052CAFE479FAD611945C13AB7DE2BAC42B0510414410510414410510414410510414410520A0CA3EF8FDE082B10422AFCC7EF9511973A9EF14D106F1D4F7860DF8CAB8BA4BE10AB684F8204951CA4F148826748F2E735A9C5A650751B02CEE7EF4E7A16778C09BBC580AE84063EEC6A6F9443629B4786601875DDF62453656B6E852CADD86D30013CFDDE5CCF6D74AE6D7F1548C14A51DE09DD06AFA5433177763D69430FB0FB3158B50F9680ADE672059B57CCD581E2F1CDFDE56FCB787BC1C6F12D9DDCD5ADB5CD98E3B5BDC5313438BB669B7125B51C35E6090161255C53202C0D6BCD7E36F89328A66CB137250A9B5C3DF507A3F38B860362FF008DB8A5218674B659B50DC509AE9168EEABD92F6236318BDDB2DA2B21B57B758E3CDBF7CFED0A1ABDFC1BC1D24FF2F2A4F88D8014A8933091E9E5CF106D795B5A6AD5BDBEE54595506E0E64D281B325A2ED85DA3FE1CB32FE61960060A0A62E1A879E7964CF1B9B63B1D86E1B6ACB8C3447B89290E2471A724FBA3A246881D001CEB9D62B664B52F7D018073614CAA3EEF4E108AB6B4DC54D50984153B1527302C78DB8005DC9891B64F128B440E10787CA63491A7AD272F67241FE2031B8041200E55E34EC0C6AB98A0EA2C5DCDC9E1C3BF9522585B86FDC48303CB9E7AE9F3A792F673D5A8C031D682DD1BF30C264E5283871AB0A9B0B547BEE785D95F0FF0014ED1B2C33EEB16CC1AF260DD4F7D10F9A599D479B7A8CA3D09E1CB3F5D6994EC0284C6018756BFBB423F3EBE66833D6BEF8C7B4A48D9C1C2D6064F47BD6AFAE5C7BC3844DDE00062D71E9D385E8D14139E5F993981C8CC4FCBECD4EC8D9F86491BC9191B015E7D87EACE12A041191BEB476EFCA1322091D3F6A974C9C24B05928A248A00F6CBEF0B82E1EC4E9CCC56940201CF3CBD7A695CBFC452A69C72CE1DFE5BB0DD2D95CF3F57845530A0EED2F753D7367D6A2CF9F5ABC2ECAF87F8A869783C44C0CA4AAA2D56E1771F9B88D7E6162412599EA73D397210C8E0F6C1F55F2DD5071504A240D073CA7A7E9DDEA36229406FA40725BE9E37CB3BB346BF31CB6EA8F162C6D639F56D213B976D5D4969DB64BE902389490A1D33F3D3F4CA96FFD3A08344922D720F4AD9C3F93C6C4004A98BF07E568B2368762764F69EC97677383376D7290A2DE24DB084396EB2642D0F1CD241CE6397A544213B4B66E387C952D3292A0480481A5851E95D7267845782DF3BE405050240CCE7A54B861E4D5318B707B4DE4EEAEF14EE0B8CBDB5FB3A544B96F7AFBB7CE5AB4924F0A12004208048E7A67CABD2BF0F7E224ED9864A67E216D2F75C1516AF33F8FC4362B6703FC5212EE2A08347B7EFD2367776BBE2D99DB05A70D52D16F8C3502E2D5CE04A90E1904044950CC73123E75ED1F097C58C163254A926783BC00502A1C19EAD6627D728ADE3302B1FC523743B8CEB9E56CE8391158CEC16A2DAA0057BA4A38648D32E5F0D632CABB16076A4ADA32C2A52810A17497EB47CFF262066E1EA686DA6432D0713C4F111E58ADCF0506E3DD72552279126358E47965D28988DD9B7725C9D052312D3BA902DC0C3C52D2A882329D48EDDE9FCB4921C0BFB17FB7DE3788F7D01FE34F8A5942735ADB3C2B3D33CF29D7D7AE44E9A99128953BB6593E5EEEEF187AFA9C873310B718B58D95A3A1E778AD5A0A2EDD5C94964093C456BD00027B0EF3548DA9B6C4B593BE46ED6FD43D6B5D736BB53748ABDF22E282A19B9F7BE4CDC7DF6F5FE2F5ECE3EC4D86E202E2FAEB6C36B196969B6D9ED9272D2FCA6E4A6129BEB6E30B0952C8200CE388C659D77FF5FE1E4A861953909995AA94C2E5DFCEE6D5368B56CED96AC44B44C4A014577C815625830B39B13C0B111F15FEDC3FC6A3DA8BDAF710BDC3F0AC7F1DDD06C3DE3AEB565846097379818BDB75A8A529C4184AD4DB9C42240CB356550FB43C609C4AD72E4CC1398FD664AB791517D0EA7AE6C22D5B3F634A97BBF4925FF92C7D4FABF0A7ADA395F84E078DDE622EE33893ABC531ABA597AF2EC294F5ABE552A0E070C2D4B20F12C9D5649E66A83B4F689C5297F2D4ADD36DEFE56620E82EDCFA8BF6CDD9E12120A4134AD08EA7FAD38C648C31FB5FC4A18BF47E19F1C291E100949E44C9CF21F03C8553B1180C5CF5B82ADD7767367D2FEA783C5BB0F864A775EC187D5567B90E07F4C4466CD96B816F72B6997896C04F01E29CF84731D3C8FD625709B2CA640F989753177048F57B171CF361163C2E21725210927746552D7FEE9F78C86E5F3C2D5E01D3F96667E1AC1EFA7956B330528120A6A08CA9D72E17ABD61EAB10B2C9049CCD781E6F4BDDCE6498C4B88E32BB40E3B7971E1B685136E4AA38D45449199CFDECB2F8D2B230B2CCC0C81CC0A3D05B3BD39C44E3A74C092A06CEC3837524FEA31DE39B4F717EB16CB42DFBABC7ED6CEC6D900A94FB974EA18494A355105C4E911CB4AB56170B2804B804532041AFDF2EFC22998EC64E439DE51BBD4B0FEAF957B1FBF2FE04FEC896DB81F662C136DB1FC33836D36C6D85D622A5B205D34D78CA72D64A93E20059746BC87202AFFB0B67A4AD13129B33306BD1B3399A76BC71DF166D19931464A95F4AB789075150D503DF48EEFD95BDBB3C4A67371E990A8CB52223489CF90E935D87038712B0E80C599C96BB0CDA81B839EB1C7F1B89F9B3D8549D7514AFB01CDA25D8694D3010A571112A999D4F144F3A6D8E98CB1734A0FBD876BB44A6046ECB2090E58D0713FAF6F0A224054093965EA6B6C2972391F407EF0A62BF80E7F88748D0F9FE829C29DCB97E36CA1293FC7B7A98AEB585A0A20828820A20828820A20828820A208283404E90426A58989223A18EDA73CF2D4532F9DF327096902B4734F7CCFEA36092438F7EEDFA8A38D3A052893DFA7953B54ADD04BDBDE43DE51A2F7902A070ABF93088C77114A2E0B1E138B331C604A64C6A67BC9903F5AAE62B6D4AC24C3294952C82CFCDDB3CF2BF384C6F28D378F04F36F7ECC2AE5DB698E24AF212A29CF834FCC7ECF6A98D9D306D097BE92CE1C0A7637F6F0BA70EB51DDDE21C3B17B67A03FDDE2DEC5B1FB3C3ADAE31572ED962C2C5B5B972FBEB096CA5292612AD388C10419CFA662A9DE2CC6AF65AD692ADD090A2429B9D5FCBABB185E56CC9BF3A51049269BA5DDBB5732281E39D9B7BBC0DADF687DA0B8D99D8470586C8D83AA6713C56E54B698B86C9215E0BED92DAA0A5691235307531E55F1E7C424C84CE97BE428053170C2F6FC9B9E317DD9721184402A439A1500DBC454D985B36343934664DDE6EC300D8AC0DAC330C75C200972FDA523F10F3AA3C4E9538912A4F19504C9FCA44F39F246DEF16CFDA78B5844C56E952AA0F13C69976062C93B169284FCA4A0518850147A061C5F57A5728C9E30D65B4B4D332EA1325C5BF9BB394709D067DE72CA29FEC3D978AC6292BDF25370E4BD6EFC2B50D4E358AFE2FE6CC7650E0C580CDECF7A1C83EB0ED4DDC7861A4B9C484880567DE8E84F6E5F0EF52F8AD97364CCDC25E81C1BBD6C19A86F0E30A7E5206F01BCEE5FF007EF46786ECD9B8DAB889124C920F3EBA09FF0011148A700C5C8F2ADED63966E4DEA61D2A7053B9150D70C29CF5FCF08921319EB4ED18548CB93DFD0FBE10D94B2682803DA84F33EC426A7529E44CF97EF4B09433096E03F50814A8DC8E4E5BD228E20A923E741C3CA374BF36FC424A9449AEF1E469D29482B53874D40602CD6B743E50B4A0524124B747A0A353D6E1F8414DE648985B74D9E9563A519BD5A1E226240AB5793F23584CA0924E59F9D47CEC1E35544CD2903FF2229470DC7CFAC2E89D2C2402AB727EB0BA084240CCFC2B28C3C84A00C44BDE99A90E686B535F2E1C6194F52A62DC1000E3F703EE62AE31D0FCBF7A5449C2972896906C1C0A33F0A75E9946A14A600914CC67A450596DC254B52E0C6423C8EBCFE548AB0C924EEFF10EDD790A6679E90A198A09A11BC727A0E2457850FEA02C3491FD3409FF00CB9F63CB23CFE1DD33849AFF004EF30E0587DE83EF78513369F536562D6A171DC8E6D10EFD95C5C38A0F381A6103DC4B248F132829781FCC397918D66965E0F0870FBB3100CD62E480E789CDAB6E22F487D2F1084A494BA89762AB26AC4A4D18B1B0CF85DAB9625F49B77382CAD888526C00429D11FF00ED1A2A7B81A9EB3542DA88C5E1967FC75196905C6E929B170E539DB33D2D0D66265B28A54A528D5D4D47B80EEC0BF105DAA5846BD6DF6EFF0013B1C5DCC6F76C9561F8F2B85C78DC4B56F745B0090C168712D5C20F10CFDE396822C7E11F1963F6762A4A66E21659401FA8B1008096CC9D72D6EF11388C2198414335406E3776D0D99B3E117EEE67DA770EBCC753BACDB65BB85EDCB29F089BC29658B85841582C970F88B052019E73CF9FD00F85FF001230F3244846217BCA5000B9A1714BD620315B266B19A94B807EA09FE4C7986A3871F88DCAB3BE57876C8BA520BCFF00190B41FE9848CD3AF2298CF31CE73AF4361F684ADA4533A5325243E42841E26BD74CAB159C4A55266143021E87D5DBD323A3C4938BE00550549001E2198331A7589135609612100EF2599C97146615BF6CEB1B4997F3684B1CF2D5A87F3EA230E6F3B7C5B2BBA7C32E718DA3BD69087504B5685C407AE1491010CA164712B888100EA467A550BC5BE26C26C991314B9A93BA0E632E9A8BC4A61F644D99BA405104DF235BF12CD4EACD6E6E6DB6F5F7E5ED28B7F01DDFE16BD87D81794B6EE318BF62E30EBEB8609502BB47DA25B59D609C80226BC87E34F8E7B3F674C9C962A3501B758F98EED46A71964786310A620B39760F605F95A3125A7F0C1F673C69C462FBC5C2DEDBFDA0716A7AEF10DA466D71271F7D47895C4E3A9E25210A242330427872E9C2B1DF154ED19AAC6C898B421C90016A0241602D6F4A5CC741D8FB31586C3225A92193725EBE55E74FCE16F685FE0B9ECADBE0D9C7ED304D9AB6D95C69B6949B17B0AB4B3B2610B2212A5292D9500204C09E94B6CBF8B0654C08F9AB05446F1DEB9763636A1AF4CA9328F9685329296A1147B54BD28F947C9E7B6CFF000F9DE87B186DE5CE0B7B762EF615E717FCA719B65BAE043613C4A4DD5C1425B1EF282120089D6BB3F87BC6183DA625283998AAAC16297C99ECF9F6033899C16365A5410C2AD6CA8D90FBDED1A02EB88B0B979448BC55B94153AB1C725794A5594C48E233D72E47AE6CE99849884A952D2491A034EA4F5A18B4E16626687B0CDC50F56C88CCD416ADA2ECC27690D9DDAD65695A161247826502139807491306329EB90AD316100ABE52581B5393861CE1D89E25CCE160722E2D5BD74EF172DCEF01BB7B7712B0F12A040800807389CF4FF0476859A852890189CAB53517BFBBE50E918E949014402CF7FC57BB4611DAADA6B9C6826C9A2E361A2B5B4B54849CF8B32390233D2233E54F307B3E6CC50AD1FB1F5AFDDF9C56D1DAD21285380287477ADC5AF9DA3AA7FC1DFD86B6EFDB13DA576371EC730A69EDD76C2DE1BADA2BDB961C55B5F29482E590B470A4B2E16DF6929702A20E99D5CB67F87F1535490154A67F4B1E5996A5F80731CDB6B788B0F21330A81234003F02DA0ED4BC7E93FB01B1D65B21B278760382DA37656F63676F66D5B9406DB422D9B43321090350991020FAD752D8BB25785968DE7269BD5156F2E39FDA38C6DDC71C74F5A83115DD29A5C017D403C8DE2EE4E1A5B750B4A885092449E193398112739CFD7CAEE89E94CB32C83BA02402C09D58EB9FF4E6291330330CD0B05AEF52280B0E41FCF8C4A21B73800594F144652447EFE597D2A33152CCC5BA012D6BF12D5FDB651338649948017FC99A99313CAF7AD7BC7A968A673067EFF7ACC80659FA816B5AB61A429387CC4B0A177ADBCBF10AA41020F5FDA9C13BC49D75ED09CB414062DD3A9FBC55588520A20828820A20828820A20828820A2082B06C73A1A6B04357092A910620C73F874D29B09252AF9C4589ED773A7E381261647F11D7D63DE11911023CB39FF13E5F0A5D33E5CC05233A000F31521EA74E7570F084EDEAB351AEF4B5BEF0D9684A5D04244281E3312721967F4CBD73A85C76C413D66600924D4D3215AD037BAB08DA4122C0F3AB7E351AF1CA20EEAE59B017F7D7AF34D61E96C952D6A00200499CC809198EDE672A8A3B5E46C1428CD584A520D5C0667E79BFA8689297294A28009330FF001EBAF0229F6BC6816DDE37B53BE6DA4BCD8DD8CBA5586C660EF70E23888716DA71343A78D6961D6E5B7BC35052083A695E6AF88BF12E562F1D3A5A673B3815A160455F419F48B860F0DBA8131613F31817D1A819EA1F3F3E394763B63B03D89C359C23006529B27004DF82948B953B3EF28F04020B854A93CB3CEBCAFE2BDA29DA6B9A42C2829F37B917B8E033B7030FC214CE48278753F8148C8ED5A316484DBDB28ADA4E609226559A81390C8935CC8ECCF95882A6DE0083BC03839973D79035B4094A941C8097CB870A690FDBE7E93F7F1E9F3CBA06C4C6A70410924815AD038617FB76D633B8751E7F8852A4F138BFF2166685120B541AE9C1ABEE820DC3A8F3FC414D44D39953F03FB8370EA3CFF108B8E70923E9AF2EF59F9BC55DFF0070141CABEF8C3271D83E5FE34CFE347CDFFE6E35FDF383715C3BDFDF1685DA3C4DA4F6F8E7AD1F37FF009BBFEE0DC5708528F9BC55DFF706E1D479FE20A3E6F1577FDC1B8751E7F8828F9BC55EFAC1B8751E7F88294FF10CE0666EBD9BD34A59E33F2D46CC7BFE20AD0E1021C6E8074A7DC463E5A8E9E7F88A82E0465975EF9F5A6EBFA32A644501F7CA32259259C41E2F74FC7FCD22AC484D013C2B4E8CFDED18F96751EB0D1D77357D807383DF5FA0CE9A2A7059D586AF5E27DFE5D252C18A401714D5DFA8B70866E3A0F383CE35D3CCFE9F3AACED762853598DF3A12FFA6D2B19DC4B73E6F4E74AF0885C55FB8B1B471F48438FDC148C3CAA55E004901DE23FD9C40F2CA35E754A933D3227A565552A1BB57DD635DE177E0F58D0A415802C9BB1707EE465FD574CB7FBB977B6B311B0DE56C95D2F0FDBBD970ABFBD5DAB85A4DE21094B81B940F11CFE8B452412012632D0FA3BE1EF88132848054CC520DAC14053A1F79EDBA4EF02DBA5D801A86AF2BFDF4CA7ECA3ED9580EF81DC4365B1B4230BDACC0128B4C42D710E06431F854A9B2E942945690E2195384919EBA1AF7DF8476DE1BFEC72F10A9B2C112E84A9896B76AD3D9A86D2D8E573153132D4402EC915AB87000635ADE9D1E28DF57B746CDE07B46E6ED776CEB7B59B5C54AB774618A45EB36CEA9328F13C1571A0093AE723C85517C63F1651B2513512E781BBBC1D2AF3BF00F916BDA37C16C73F4AD482294045B982F4EAD666B0C3381EEA76FB7938B33B59BE4BC7EED9B858B8B4D9F4ADD5DB59A490A48FC2BE084710E052A3533E55E57F15FC6156D33364AA7A95BCE03ADF5E3DC5338B461309B80580160010389CB8D73E31B8786E0D6186616C5934A4D859DAB6136D676E435200192DB040CE01CB339EB9D712DA32D1B794B9AB65397AD49AFF006FD2A1844DA48410000F99E7906F74D6B0AA5CF1471F006C49012040001C8C752209EB3355AC561938196A909002402E05B33E67DDE25E52B725303900C59DBF157CBA45550D253B93D243B3827A0E99FE61B2D2E4B8A5DFDE6FEDA39EFF00C4A7D97704F692F672DA8C1C5AB08DA0C3B0DB8BDB1BB0848B91F850BBA7385C82B1286B87DD1A6B3CFBD7823692652A424A9882C43B5A9A9B74C83DA16C0CB22728B9214CDA0028D90ADCF334D7F3D2DA1B16B66715BAC19E654F39657F8A58DDF12415715A3EEB08E2D39B79157975AF56F87B1699F2905C10522CF980DE6743ADDE2EB83514802AC59C727AF95A95B8D71F5962096C9466985AE12A1060A89032D321979CCD58A724A8D29C6CF4D58F935844899617F5172DDBDE66FDA14C4F1305B3067DD33DFD674CBFDCE68230CEA0A22B5BE872A0ABD33E30D27912D0541419BF8E46BA017E59579C3EC5ECD637BC4DB7C1361F044ADEC5F6A313B2B2C25A6B894A2872E1A6AE8F0A7DEF75B70A8C010019D60D8F676155BE9A549C85068F6E428FC294A36D9C7A50140920006FCBEFA77148FD383F8597B1BE13EC77ECE9B05B0C8B060ED462F8622FB687130DA7F101C7D28BC612E3BC216327783DFE4234AE95B2E514A529003D1DF2FD373BD9C57906D6DA2899355F52884BD07F153BBB9CC69CDA3AE167C66DDBF10242C0293C208100C0D7392209E5D2AE5202826B66D69937DF93C5594ADF2540B82491571D21D4099813D79D388D60A20828820A20828820A20828820A20828820A20828820263A9F2D68820A208681242C922049F9CFCFEF9D656DF254FA1EEE47DE164FF0011D7D4C567E3E550924B4D014480E737E3DDBBC22BFA9DB36F2688176E1F55EBD6ADA92D9F7787C6301C912A2D811300E7940F2CEAC7326E1E561D3316A0FB8A26A0E54DE7ECFAE90E64A52900A92E4359F8B3DE8DD41D234AFDA1B6F71CC5F6AF07DD46C4DD326E6E14E8DA4BAE35163096F843ADA6F548CD83728E24B1C63DF30398AF1E7C61F180C11C4A24CE228AA24B53BBFF0064F3B3ECBC3A66A1334A46F1D722096637D3B9CE2736476551B35875AE1F62B0CB366994BAD9097EF1E7614F9BB23FE44870A8B71A24E7CABE7EF883C6B88C4ED25FFAAA037D55735726E5FCE9468B44A9094824951DE1549341C86BC7F4D7BDBDA9171F8D7084BCAC94D23FE088E1E2819F16A74D49CA9CECFDA7FE531592A7D59BAFDC5BB88544B480C09E04D48FB7944BF0210785B2A299C8AE264EBA72074ED560DD9653BC012E1CE84578D630941DD01443825C8170F4F7E50F112013AF413D35CBE039D454FC52A52BE82522CC29AE9A91ED8C6CA4A697D037BE66292F2418827AE83FC7C2A57058B2A940A8DF2068393D89CF3F383743DBCB9D9F9E547F2F3C71FF0053F114F3FCA1A9FF00EA1F98CB0D07610D5E738946011A73CF4E51F7AD63FC9FFC8F71F9BF970818683B0868A4A892441E809F43C88158189FFCBCC77B8F7DE061A0EC21E30785B4854939CC79D60E24E4AF31FB818683B08578C743F2FDE8FF00255FF2FF00EE1F8818683B0838C743F2FDE8FF00255FF2FF00EE1F8818683B0838C743F2FDEB2312A71F5663307C9AB06E8D076838C743F2FDEADB809C9387493BA685F9F11ECB528C6022C0123967941C63A1F97EF49E216835052189766AF36CEF7FEF0520906CC5E99F384D464935018A9EC0A4101AC469F7AFE348374053F0B69C63CA839B88DDB9AE8F977AFBA5E009038F3860FBC12E2926728CB91CBCFB7DE74CD38B4998C0DC970FC082E01F3B5DCE65D210E12EC4077198734CA9C61929C2A39653AF2F84534C7A3E64B531269C686BAE66F67E758DCCA4BBE438777A57852FE69BC8B552136F745D26F012DAD59A590DE64B44FE52ACE48D4F3E55CE31E172E7024167B8B38201E1957D18423F2C6FB8FF0069B0A9BFFB9BA37DE2DABA4E1D86B57CFADD0E61CCB4BFC5BBC414E94290A1FD654C70415083309ABEF8576A2E4197F591BAC6F6CEE39726B17221432986E9DD0A361CAA47366CC671C32DB0DD66DAEF1FDADF15B9DC762EC6CAECD38FA5ADAAC4F0E7DCB26EF90E5B1427F00F5B8E071C6E5C4BBC792579098AF42E07E2A1C0ECC18233C83BAC06F3573ADF2D39BD225A4E065AA4EF280B5185DEEE286ECC0F6CE3A59B89F642DDFEE52EF15DA0B172EB6A76BF1816EEDE62DB49E15E3EC3C904BAAB67C00E264A9404C9223A5722F1778AB13B5D530A6728EF12CCA26F77AB7A733708CCC2A0252120005DC9A10D5191CEF9F1AD36DF8906D92C3656B0911E33F9BE0F31C407E549C9234E181A571BC527186715EFAF77789724EAE6E5A909A30CA4555BAE1FE94BB372233B9191B3188F71588A53E0B2CD93CD2A789DB9054F0067349D01CE0796719558F666D91839604C249CCE766677B758D172AA9980A86E9A007E93615705EBC7F6DD09FC3FF4497164192B3EF66ACE275806009E5E54DF17B4938CC4BA4BA4F4FB56BDE967021D4B5A94002430CB53FAAF46BBC2C0CCE4479D26A414B4C71676177A9AB5A1DCB4B800B91C74C872A7E22036A70D6B1EC1311C34AD4D97309C52D9C4A8C21C17166F37A664E4A8F3D62AD1E1CDB22462A5277C065005CD4641B9F57ED0FA56F61953269495209484253553D89577E62968FCE1FDBFF76D71B9BF68BDE16CFB1641AB45627717569E2B640578CA76E1D288024CAA7202799EBEC8F877B4062E549ABB800BB31CDD9F9FE22C52567752A0E1C02791AE5A3E59BC73C6C31238978778AE161370B7810A3C21AF09453EF8D13C6734C6B945762992525767A03C2DAD4D5B83C4E4B989F92096E2EC4F1035AFDE9085E622CBEF1B62F21840506D574EAB8584B8A84B4852F40A757086C7F728800666A470780F98A480379449167A0FE9FD3855F6B6304B0ADD20000876008F4AFBD5BE9CBF8057F0C3DA1DE9EF2309F68EDE9604E5A6C86CC3EDDDECDB57D6EA43B71E282DADD425D470293C694AD2A428120826ADF80D9AC5F70D19E99D074AFE9E3906DFDA43EA4EF92B3BDBA1D817E14F76A47DEC5B60F6966194DA39C2CFE1D86322250DDAB4969A4B519084A52083CB402AE184C304904023785CD05079380DDACC1F97E371049672497A641C9AD34FC708BAAD0CDBA0CF16A27AC18CFBF5A9C9619091A08D64282A586CBEE4C39ADAAE2CD9EBC1A1682B30414410510414410510414410510414410510414410510414410D1C5F0AC891AF3EFEA3FDCD65C2D1B82E72A645EB58DB786EEEE7FB78A3C5EE9F8FF9A8AC6CAF912CCDCC027B5ECD93FB35D635DB7FFBD7C3775BB3AAC75E702B1828718C1EC10525DBD7AE3FA1C48689973C25AD2A907DD1279E7C4FC69E3D3B2B0F365998A4965004A99E95B1BD7B7689AC1E1C4C60A70090F43AFA5188AE547B6ADEE7766718B5B0C5B793B5FC573B47B6AE21EC6D2E7129766D30E2861C1A0B1C6D9532A471956B1EE98AF0CFC42F162B6D4D9E04C2A0EA04825EAEDCB2C9BBC5E70125084A120252080523DF0BD5DEACD48D85B17416112A99923FFA926075C84039FCABCCB8DC2CC38B54C20D54E1F2AE629476353689854A19003570C7D2255B74189D0F2E533944FF008CEAC3B331064EE87634B919599A9D4D78D2032D346038D05BDF778ACDC42A24F91D7E67F71156D97B437D206F0B35EB600D34D73A5E0328640371BF90872DDCEB9EB1CF3FA8D7B99CBE0DA7054E2FBD7B1CEEFA311EF211A992ED60DA7F5142DEE2513273E93E5D7B67E7CE9FE154508DD2E1ACC7524BE46BFDB9AC6532D21C100B379BF28A7C5EEAF8FF009A75F378ABBFEE37F968FF00888A819CFAD1F378ABBFEE0F968FF88828F9BC55DFF707CB47FC447857C2624FA7FBA3E6F1577FDC1F2D1FF111E78BDD5F1FF347CDE2AEFF00B83E5A3FE220F17BABE3FE68F9BC55DFF707CB47FC441E2F757C7FCD1F378ABBFEE0F968FF00888F3C5EB3DF3FB9E7525276B7C997B80B76EAF6AE59346BF283D83720FE8D1EF8BDD5F1FF0035A4DDADBC18967766F7C6B7318F95C13DBF5078BDD5F7EB51B3717F308DD51CE8E1ABA0FB40658C92FA9200E4D9FB7178F3C533CFCE73FBF5A66B24A492493C4EA7EF1B09696A80FEFA53AC47BE789C51CFD7EFD2A00E20A71052E5277B2350DEEC05B5685E52185817EA5EAF97B109559D28F9D87A312D5269AF6A690AEE876DD0FA35619E2171EEDBD838827F16974B57490786CD2D82A70B8BD1B0A00E63588D73AA76D4C12B7882D7A70E5616393F1840A1017F31949DDBB00CA761AD5B96B1A75BD1DBABCDB0BC7773BBBA7DC7B115BC96B1FC6DB59534DB2A5074A7F10D9E20435C6885039E54B6CB92B97BA0687AB545B8BFBAC6FBA972B20BE5BD91AD9ED761FB78CD3BADDCE6C6EEBF0A69BC30B5797EA6C38FDF39E1B8F3B70E8E3789740055C2E1508E5E750FB57138B958F212A59008A034ED5039106B68728C5A952C2024A124B7D4E0E840AB7BA59865AB14F0979F5C80B981CB2072CF969E8672D2A6366CC1380F9C5DEEEDC0D457EFAF11BCD595EE84814A123B822BA8B9F2314820C919093F5A90C64AC39964A521C0B518BF072EDD2372779B80CEE48BB0FEB8E4C551F68485851129C81A3FDBAB7611A2A56F26A2952458B67D73F4A9A380C345A0E1002889E84C1E672FAFED4C367A9631010B777CF2B75A8E5AF2604AA5CDDD043037CD8543F1A1FDC435DDC30C922520C99394F6FBC855D6724270BBDA26ED4B015F6EE468F13D8594A98000EC4DF4FC9E432A45818FE36AB76EE5F6B34B4A6D2A03FB83A4214394829267B738154995B53E56D0090B23EB19DC38AFEBA0D0582448489441009ABEF0700E4D42DA6BE71F187FFA81B65B08C037E5B0D8F61CC36C0DA56F1255D38848485A99B46C09226482A233F809AF777C12C48C56137DCA8A44B097399A171CB5E22968D1531686046E9259920330B061CF2CA8098F9AFC6F16C3F01B753EA32CB6A507594C12A2EA88494A4E47878B889E5F2AF50A2415CE09A0700D4DFE9E5635A67D5A155E384B90EF522C1A94CC6A3871615AF4A7F8567F0FFDA8F6FADF5607B3C6CAE99DDB60988DADEED1634A6D69B7BB4A568BBB66937052A65C0975A2D2C2B39C84E756CD95842A29DDA1166B9BD68294F6F1CFF6E6D51BB30EF1000CCD0BB017273A796B1FA6EEE1B72783EE3776F816EE764F0DB2B0C2706B0B5B44AED594B4B70B0D3695AD65109254A44CF73ACD5E7098408028038161439FE4E669D0F25DA78AF9CB2B2A721D8136F6E3F119BDBBA6D572D59356EB86C1F15D08FE9A4C1391CF5333D0CFACAFC94A4DB26A5037403D88ADA91BE52A193820F1EFEDA272C8116E906322AD34D67D35D0D6C030034871292120A4351AD9DFDD6BAC3BACC2B051041441051041441051041441051041441092DC28272C873E9973CC51190926D5EB088BA9310358E79F97F98AD54ADDC8C2BF256CFF004F272FE622B55C25313AF6CC72FDFAF23956A99814486208B8BB7BE0EF0CA7CE124805DDF2EBA8E51EF8E989391E5D23E3FA8A5189200773661EC778DE42FE6B310E6DC39E5A373D18C44BD769F1C85B6B6D103FACA10D679895729981DE7589A692A72A5E2F70B14DB4B86D4FECF3A3954B09CC96B817E94108BF74DDBDB3B74A5071A6D0A7096C923810095A87284804AB3119926293F104E4CBD9F3959EE1672327CADC6FCA1597237949033A17CB9D9A85B4B738E66EF0312B5F684DF658E1F863C87704DDABEE1714EA81B2C4977AD85280E194BAA61C411C8A142BE76FC62DB13C4FC42113084EF29802697B6597A728B66CFD9EA202897766EE351CA9AC6CB216C5B617716EA6E5B52186B86253FD101032D2047BBA488E535E503B4953274C1314E5C80F9B12736CAEF61C62F385D9AADF9403020135BB90FA66F5F2E3E32E301094B4AE28049464548E70A1CBB4F2A8FC62A52D5BE12695B720D7BB77AB878DF120C89850BAA8163BBAB73CE9D4C4BD9A177297148040409F7A73D724F726047523D22D78B4CBA80435DAFECBD7D61B7CF4DC8507B53F2DC871E8ED4871C9250E36648287010A1048981391891FAE54AE1B6AA779AC468CF7E9D69C236131EA283DBF6AB5BB42C8511014A1EF0CF3CC40CC1CFE3C888AB361B1E998016A0E1AF31F717BD046DBE38FBCA02F804C127A9075FDFEFBC2F33692504B120E675D33FBB508D21C4B96575AFEFCFCBFBF3F11D95F1AD7FEE5FF00946FF238F9FEA1637ADB2C29D5C908CCA47E6CC9D073F39AD86D548A10934B92470EF1A192BDE0901DEC6ADD69FB8A9ABF6DEB537694381BCFDD508518E83E1FAC56DFF764FF00C5376B9F7CB58D7E590B0870E7476F4849171E3B62E129712DA89038801106338319F5A708C57CC1BC081D5BEFEF58D5437494921C33F0F7EF48F5B790EAC368701513192B2FAD6FF38FFC8773F98D49090E6D0E5C696DACA0AC122261479FCEB266A8162A1DCFE6308585A428380758F034E75CBFFB4FC2B1F38FFC8773F98D89604E91E96D43FBC7C48D7CA4FCA9BAD13261041735B1F5367A7BA460170E338F3C357FDFE07F723E9594CB980015F38CC78A42BFEC08F3FD33FA52884AF371A3BD3AFE3F3047810A9C881DE48FD294620124B8639935CBCE084D6CA8AA6419EF303F7EDF6602660662B1466B9625D2EE4039BEBA52B6BC2889BB818B56CF7F56F3D2F08A93C399223D7EFB0EB564918B461A5042EAC2EC3F67D3362F0B09C86722BD1FDF0AB6710B7D6B7AF337EC34E20377CD29AF1164F8B6E1485364B247E59073EB94F3A88C66364CC0A1BA93BCC5C8167A65D385EB684D6A96A5A16EA1BAEE9C94FA8A8A1BF522AD18CB77DBA7C0F60938B5D3015718B62AE788F622EF0AAEA38D4A203A3DE02145226721F0672368C9C3972C0E428001CB5F3E548D8A92A2086DDCD3404DC8D7AD3B168C9565656968CB6DCBAE25256A2550A24A8F119E5A939F6D2A1F1DB4708B9EA56EB92694A3F91D47E21352492E0539D7ABB76E668F14DFB8EAD4916BFD36D260A55209197E58CA72E7A914D65ED24053CB05366E87AB0C8DD898565CB5937625AEE3FBB5790A98A537896C04290E123290099394E67BD3A1B494AB971A1A5F32286D0FD1254F5151D5C6B407ED96B0A8BB6C988503DF2FBFDB3A5D18CC29ACC48720DC03916ADAF6D0E7A29F256C4D2D4D7B1F7EB0CAEF186DA429B1C5291C898CE35FF03E154AC66D49387DA7BC94B277B40C187B03288B9B839A6782092E680660D0FEF219877318EB17C5D6A51E02A19926662750797293FA54D4CF14E1A6618C929014450903833D726ED16AD9B86504A41760039CA8DC75CF964D1108E0C4ECAE0282B85BE05BEA50F7441E240933055103AAA0D57F01B326ED4DA09992CD0A9269A13C34EB4E6626CEE4B60A20153900B396E17A718F91BFFD484965388EE56F30F69C4DFDC1C7D29B72902E5496BC24A961033E10905733F973AFA0BF03B616270D22482BFA1613BCE7316C9FC9C6B1158A989492A72082F5BB68F6E6EDE91F3C7ECDDECBDB7DED69BD9C27775B05862F1ABBBBBEB165F79B69DB8B1B265C71B3726F94DA54507C2F10A0C47109D04D7B1F0BE1DC44D289A934212C43E8D96AC18778E7FB5BC4F270D315209D453859EC7EFCF2FD38FF00868FF0F9D8BF61EDC9ECD6C761163871DA4561ECBF8F6256ED37F8979F7909B8E15BA948510DA96B400A04A408EA6ADDB3F64CCC3EEEF176E39E7EE833CD850F69EDC978A0A42412FC3E927537272EB6A474F2D597C2C2CAA19CC04926739991E64558A58DD46E9150C05F2BF7FDF3AACE5198A26956FB7A0F4859D65F449B54B0952BF3150890489CC769FF0035B924E64F38412863514D29EFDD61DA13C0909D32CE349E7F3AC428000ED9C5744660A20828820A20828820A20828820A2082880D013A434715C4A52635D0733E63CBD27E49AC29DDCB7334F661295881F3B70B57A31032CDA95AF11C23D44A567581CB2D3E87CFCC4D2A847CCA6A1FC9FF00A76CE25D202D0CD5D6B9E99F4F285B252028721A4FD7EFCE68124A54EE1B4ABB6869E4FD62176949DD0140125EA720DAF13E7CCC789546474F8C44E9EB4B8486DE1BBD2F76F7C222F0D8A549582350F4A1F6E69AE90C71071E470A1D6C2ECDD3C2B28054B4E907A0F78FE99738A9C532E6198A6A55DECFCC9E6FF889F94BF9A37C66327ADEE3323DE51803DA237888DD8EEEB1272C9F6158ADF866CB04B15287E2AE1378E8B6BA286C4159690EC98D009CF3AE67E39F13CAC2E0E623E601BA82010781672FD68FCE24F0682A5070E5CEF3B90F6193D34CDAAD47C05B97DD6A760701FE6AA529DC471A3F8DB975C1C4E9372A2FF0A9591211E2409D220738F9C5F1476FA7178B9E12B25D4A72F7E5FACED9C5E36728CBDC2588D054BEB6FBBB068CD178DA3F97A51038D4412233FCD267ECE42473AE19860A9D341BD4B9A72E943C2B4CEB65C3633E5CDF9854E08615043D079794610DB6DF7EECB7758DE17B35B518BB785E278EAD4CB4E3AFB4CA029212139AC82278801AF4ED5633B344D96E949721CBB11E57E2E0EA75852626662262E6B2776E2953472E006E4E32A9D7256098D26CEF5AB36EE957B87620DA5DB3C410AF11A295B7E283E2881FDE008CA4D57B19B254146840BB8CF5CBD34AB648FC9332525425EE924FD2A152D43973B753175AEED0D82DB8E871D924A8281267302626239F41AE7510306A9531B74E795B9716A126CFC2BBCBC39502774803FDA6F4A50573D5F36A3C453CFAD6496C92274FD7B0CCFC226A670CAF96C19890720E0F6AF5E91B1C329C1602AE685ABC4D78BB13DE1CDBF1169257F98C935B4D2E413435FB43C929DD491CBEF0B5250B430712B2B7828C2145303EB94E7FECF6A208B6B6CF6C98D97C2D965281C4E880207500FEBF648ACBFD2DC5FDD29DF5D6114CA4998A9AA776FA41CB870E3F710AE17B533B396B88DDF0B4C5C8570717BA4C2883ACC796B3152F879BBA801A96EDEF586B3128528907EAB299A94A3FBCE25F0DBFB57D837364E05BABFCA2665427403F4A5FE71CC6990FD5FF00A68D4A524314823944ADADE5CADB0ABB1C2F999049100481127204474F5ACFCF3CF9FF007A7B178025200601B26B4493572404F1106796647CF39CFBF9C1AC89E331F6FB98C14036A1F2F7CA152F24924C4798FDFF005FF0E25CE4B5090323637E7194A400C403D3CA0F151D7E63F7A53E70FF0091EE3F31961A0EC20F151D7E63F7A3E70FF91EE3F3030D0761078A8EBF31FBD1F3926E49EA3F3030D07611429C041CC47CCFDFD9E75AAA62425DC87B1A558D58BF4841490EC6AC5F9FB7868E3A0CC68222749E7CFE1F731F889A14336ADEF6BE64B74EF0572BE5EC4365391C51FE32F5981CAA1672C31006B5A3716AD1F9B51AA21D224A99D4286E2F6B647DF286AE3C24E6679C0E5DBFCC1A8A98B735CAF7A353FBCAB0BCBC33D774F014739F3EEF9D042887DB0D80BE119F389CB2CE7E597EB4DD5212B75352EF7EB5BF1BF3192E641DE2C0B51D837273AE75FDC20E5CB1DA4E5060E5E597D99E54894A6596ED41E4DCE164619776A0AEF55FBB53DE70CDEBCB4420F1293C6359E1E7E6723DFF006A497884A33D5EB422C3D7A7AAF2E4CEDE66514D2A5C9A37936472AB6B6ADF630D209085091D3AF7CFBFCE9AAB1E0160CCF7AF2E3A694A3F19346154523E9BEB9B574BB7DDA2D6B8C67C452A55AE5DC7ACF61F66699CDC3CAC42CCD252E58BE619BB0FCEB69393B14CD4A66D068E0B93A00DC7A677788A7961F920C939907AAA32D675EDFB5446325FCA0C94801C55ACD666D6B5A6594487F8270C91705AA32FEA8E1C0AC050DD859397574F1651C2A36ECA54128BA201E22F24FE74B27DE911C31564F0862A6A3192C0DE62A02F4B8AF0A8B9D3AC41E3B152D0E4941520177FE497161A7106F78F928FE2DBB15B6DED89ED59BAADC4EE6AD2E76BB6DF0EBFC42DF197EC50E5F611815A5EA195B8A754C4B96EA5DA1599508E341E409AFA47F05C4E9D8594B52F744B0874070B99BC5BE815762CEFABF3A16D3DB484298AEEFF0053D05C39D1F27ED1F4C9FC2EFF008576E6BD89376782DD5861D698B6F62F2C5BB8C7B17BF69879D178E23C52869FE04BFF00D22E2DB857E588AF6E6C4DEFF111BEEFBBE807E7988E4BB6A789F8A5AC6B95ABEE83ED1D6FB662FEE9A530CBE2DEFEDD69FC482A29494F14A4240CE38040E511153310F17E3265A46609090091A1500028FA99A208528820A20828820A20828820A20828820A20828820A208288C1B1E4622C8517CE7209233E5D87C7EE056AA0E1A970EEFE5E5FDC4392BFF002D3A035367FB716BD5A1B5CA0859D60E606B3A0EBCB5D29EE1C2001FC5AAEF91033EFE9778B5C82F2D23302BD5CF7FEE1BDBDFA4DD2AC432F95A48E27787FA425322546234CCF5A6F3F109966AD9E57EAE1EDC84218C47CC96C0820E952E2DEF4E514DF620D589425495BAA5988687114E99ABA6BEB50988DB52643FD429FF001B80E72A07A57CD9A2125ECB9AB5021248268CEC2BCB437C8D0461ADE5EF9F03DDF2B8AE14BC556EA08770CB321EBC656530D7F48C14FBC413968272AA76DDF1548C3C8528CD48DE0AA0354B0A3D476761A45F3647867118A904A5135250DF510C95BDD8B55AC7DBE9F5AE0D8FEF976F6CF6D76C0BCC6CA60AB75DC0B07B8E24BA4BC8857E29872504A5CE152383311E83C75F123C72667CF9689C4825565790639D29DC45B65F870C94B6E80B2C58DE99915D7DE7B316172E26DDAB77D216DB01484A19023C31EEB6003CC2409EB90EF5E36DBD8CC4ED0C4CC53A8A4A8B3127339BDADC8BC492B64894031008CF98E356CB84463F77C57DC2E7134C9FC81DCA32F28F879F9A7B32419652542CC4D3AF535E43843799869B292087292E01E5A535CE9E51A4FED97ECB167BF1D8EB8C4301BA4DB6DEE1A855D6CE3ED2C2429D6541E752B5A4170921B4A404F3D6AFD864A1526803B51AE5FD2CD4D5B5899C24C0996D34EEB00EA55AA4B579D3AB523597D8B7DA8719B1B8B8F673DF42DBC33799B38EAAD6CEEF142A65ABC6C296E23F0EB7CF8AE2BF0E84010224E90669962B0B2D414126A75671A8F47BF1B43B5253499BCA56E7FB52685C67A8FC36B1BD7B41BDAB6D9FDA3C3B08C430EC542B14586D8B84B405B8881C4A5A8FE43C52939E5C849AAD62708122D517A7DBF1C758587CB6E62805DFF7CEA7331B1764D86D16CB788507DA43A8291301480B00FF00E50623AFCE2E62371553714DD2DC3CF843654D1310A084EE94962141B36714E1ED843E514A8952125291020E47A4C773A4524E4DDFAC0874B254C546A48B70D3F5CDE282A09899CE88521BBA871C2929809044CEA403FEFF00CD10459FB5FB228DA572C8FB810C281742F22A00A4FBA331263AD64D4B8EC32F79F18C25C0637D6FD7F4F16AEDC6CE62D88B186E0D8238CDB61F62521C0B5142D4094295C213910485418F3EB4E5134331240C9EDC73F6FA4202490EA212497B73B07CF5CEDC22F7C36CADF0EC36CD8B54B9F8A6529F156BFCAA3A9208CC89F803E55933D0003BCC4F4A060DC283AD235095BA814009664B03BC5EEED4D3DDAE125DBA5078C20A8004742911DE0F90D6B6F9C923F9163C47E632997BA18249BD48735E90B250E2755031A664FE9F7D7A644C49B1B71FC1F28CEE81FED6E8D0BA5C310449E79E9F5A5A54E00665F2714BB3706FD46DF2F827B7EA2AF13B7CFF00C52BF3C7FC4F7107CAE09EDFA83C4EDF3FF147CF1FF13DC41F2B827B7EA0F13B7CFF00C560CF190238D0C06550D13D2FE91515C266333C8EA343F7D41EF48AE79A249715619F1CF8BC3298965301CB534CF96AD488F75E0924198E5CA74D7E51E7CB5A653A7F501E86AFF7CEBA7185E4497FA8D746B821F877B886EA7651C5233981A4C1E7FA7975A899F39F9370AD0D33BFEF94A22582580D2B4E4C32CBCF4884BAC4D0D4950CA4C81D0643EF4D2A29588625DD8E4EDDDE9D00FDCA4AC1A942960010FE6FEBF9702206E31795A9495108E40C65027AFC32E7999D1EC99C9F95957BB8D3BDEFC1EF232B03BA03A4139DAE68CD4F588A7B1A09513C66675D63CBA4C72F2A61899A9A8D3A3D457B8ED0E65E042812D7E078FF005C8365160E2FB50F357CEA52B70A7DD1C20E60C673A7D2A071588704037666E1986249A9B0A521DCAC03390976BE560180ED7A8F588E671D174616A5372732E401EB398D2674FAD41CCC4A92E1F5A82DC3334AD8B748768C1512424BB8A351890D95799B3EB1E3F752E05347C74082E2992541A1C8ACF29F9812749A4A4ED598957CA724921D892D56A8A5F4CF2CA2C986972FE4849025A92974B800A8E6D77A74899B5B96C302E3882D8FEFB8041691060F88BD131D73CC559B09B3713B4C2404ACB8191B16E1EF566783DA98997265A9C804B8634373AB30F3F58D66DF56F5B69F69AEBFF66F73986AB1DDB3C4D4DDA5C62A965773678234F14F8AB2F307C4B7529852F84C66B4E7005764F027803153F1524FC951FA93FED26AF7B5BD968E3BB7F6AA10A98C4077FA8667D8143CB81DAAF63BF61FD85F67AB8BADACC630EB4DA2DEE6D1A1ABBC5F6BEF5A6EE6FECDDE12E169ABE290FA121B714C90A27DC0139E95F4D7E117810E0B092553A5B6EA5156FE2585B3CDB83306B4723DA9B495316A0EA00B80067CEA4657FD3746EDEC997DA4BF66861A751925C6212952A6145440CF31A7527A8AF470C327084C90929DC09A10D421C79373A1BC41151554925F587F6987F86E1BA7F87F14E7FCA5BC90A8109CF5303AFD2B68C449252103852207EF441155104144105104144105104144105104144105104144105101A823586FE1A788A89023B89F4039F9F3CE26886A24BAF7DABC5C79FDBF709388490547967E5CA474F9D2AE5292C0B80E73AB07D7D1A1EAB109901945A81C74ADAF6B4312EB09539E18487140F12801940804911A012263A8D045336E6D0F912D41D5BC012F663A70F31F7470F8A4CF98108FAAB6ED6E27D5852F1A87BFBF687D96DD558DC5A1BE6AE31A752A0D329710A712B33038642A012274F21AD714DBBE2A4E1CAC0987783B906CD7B33776AD23B4782BC173F6DAE4CD5CB2892E08431DE50E34ED9F131CB8C537B98C6D5638ADA27DD7957F78F151B774A8B484A15C2DC209E2128E139F5F879E3C63F10D7284F4FCF25E8DBDAB59EADABD69DFD2DB23E1EA30F2512C48012025BE8E21EE199DCF5BC5E789EF677876564CAAD2E5869B4A470B4DADD060680A4440813DF58AF2B7893C5B371F88581394CA51600D2B980FC5F56CE2CD27E1FE1A63138696A531BA4123967C7F30D6C3DA0F78B83B8CDF5F8F12D9C2014FF54C0490939129039AA7D7CD0D95819B8B48592A20D781E39FA7770F11B4FC07874214061900814012033E46C6BC34E11B87BB5DE7D9EDB58B5737A017E0150000209D75248E9DE222A57158718445824839DDF80D0802E2C738E59B6FC32BC30509481BA92E428304F26F5EB19B6D5D6195171284A9E792461C56250D650E8569C2160C403999ED4DB0BB5BE58352F61A5D8FE78D6958A062E5AA5CC4C956EEE827E62452D66A70E995A39E9ED2DEC6786EF431B5EF67636E0605BD2D9B52AFDCB8B250B66EFCA3DF4B7C6DA4BCE1F09B2889993C22662A465E2C4E0E2F9BBDCB585EBD7A460630A1411BA4A55449193382E7CB2D1B28BB372B7B8D6FA766F08C3B6C30C361B5FB2AB5DB5EA9D694D38A2C381A69C95CACF88DB3C5240041D291C420292A25CA8E99F40D419E798A88DFFCA4A52A2A2129E3463E8C7CBCE375DB43D6D8759B0E125DB5E16C99954248488D0E806A3E555AC5A4A4D18D7B9FE9EC7864C013D2EB3425405072F6DDCC4DB8506548238541111CC8038BE73F4A6B785641242492E6AFE6DE4D0D5CE5EBFA510E6112BE12467E9FEE8820F17BABE3FE683404E9041E0B4E1E356AACC8273F89EDFEF2A6CA5D6B53C3280AC8A04BB66DF7FD73AC38430D11904E7D333EB98FDAB099A967292E75CBBEBD21352C87A5B2B9F510938436A281200E9A67EBF1D73A4D53D8900103A8AF7F7CA14402B485503E45FF0071478BDD5F1FF358FF0020F1F3FF00F68DF70EA3CFF114071434FF003F28A7D2A712090790059BCCDFF0636DC1C7A7EDE3DF157D7E67F7A5BE69E3FF00D47F106E0D4F97E2144A8900C9F89AD0CE2FFC88E153DEF5F6D09A831223D93D4FC4D63E71FF0099F7D23115AD7C29224C88033F2E7DC7D2939B30DDDCD4D2BE432AE7C2B0C268DD981C8CEBD0444DC3D3232D79F4CBBE71D728F5A8E9F3CB5ECFAD4D9AAFDFA448E1D02990BB0E23CBF77888BABE0DA549900A41E7D758FA1FD8D45CE9E374B1249B575EE05ABC3289D9186DF214C58E57F7C8F908B1B11C4614A3C4009D391EE467A7F9F3889F3D89255C6940E791F79E462C984C216140DEEC7AF01C323665EE28E1716105412065073E7F2EB90EF49A71C65B0259DEFF006ADF477AC4BCBC206629760323EADDEA784405C62AF1260939F39FAF2E5F62939B8B13050826AE4F32F47A9BF43A98712F0AD641AD2DCB830F53EAD416543F1AF9E22B994920E9968ACCFF00AA8C98B7CEBC3EF5F57FC48A3083737774D83B8E7C2B57EB11CFE396A494B162E2D5D4340CE9A46BDBE798A68B93F309DDCF8350B0AB707D2164E082412EEE1BF0282A5871ADA18AB6A1385B4F5DA9567676F6A92BC47F19EE36DB7F9878F9C02A483E1CF3F3AB17873C2188DA78B96B420A92A21C106B66C98B65D6D68ABED6DA88C1A8CB538525D88B82D96601EF7A59F1AD86D2ED36FF00F1C5EC86E4038C5885F818EE3376169C11B4190A558DCB1202800E0055978804F3AF6AFC39F83537188905521CFD25F7356FFC7F0E5C8B98E5BB7FC48196EB7002B30E05988D5F2BB9063A21ECEFECBBB2BB93B3B8BBB5BC563DB6989250E5F6338B2D171705E00952597C2439C08952120E890065CBD75E15F84F2B650953178748524057F0FA49A1BD78FE35E3DB4F6BAF12A539210B25812EA0C6AE1DAB4ADBBC6D43185DC22D941453F8F70FF59CCE0A672E13993EE9220CC6990AF47F87A461F66E1D329490964D52D57028CCD9D49BBF68ACCC2A98492470CF9D7B0A51B2B35C7616EDDB5BA5B6C242049F774E227DE3EA7CBCAA466CE33E62E612E49D5D8643B40CD4666CA1E52704144105104144105104144105104144105104144105104144105104365082260013AF327A4E9D7BD6C775282A3C7A37BB5CF2B64A9094B921CBE76BB53F37D612582E2480600D3BE475FF005D73CAB28589A93BA6B9FBD3A5B37AC46E210BC492104824B66396BC6E7A4620DE56D55BEC16CC6D1ED0E23728658B7B7E161457C30E3885211993AF194819F481CEB8D7C45DA276561F13356580048F79FBB6564F0AF86E762B684A96141467281005427759DEECF46D7331C0FDBDFE6BB61B4571B5FB557173756B7F7370AC2D84A94B2D25B5A9214EA579252612531CB9578D36DF8D24637113A52544289500C4644834D19CF7BD63E807C2FF000A0C2C99026049A26A43DB9FBAD2916E365D0865C60B28790A21453207003088CCE7C3A939033D6BCD5E35DA3889D8D9B2D2B5339CF50F4CBEF933347A464EC69094A54100D01A0A71D1B3BDEB6CA6977F72EA5B2E5D3CA527229E33C1972CE72EFA6623957309784C41C4FCC9AB5105540496E2D417ADAACF5858E124C807FD2481FF002090E72BDBA0E377876FE266F2DD36AFC847090824C09F5EA73E73E55D4F61ED5C3E124A11312E406A3353AF6D38C5776861244D0B4A659753B9201EA7B5B367B88B9375BB7F77B31B516D8638EA4DB3CEA42425478632C8E91AE703CF3AC6D8C7A31AE24DCD0352967A1CFF0021A39BED8F089C5A26EE86742D42F5604D4FBF38EAD6CD6256F8B612D38F2212B6905975B03C46E5238B80F2E23AE432F855657839F25615BC4A545DAB48F29788B64AF0F8F9B292485A56A0A3504B1239D8370CE1CA2D14029B0E14A493FD50AFEBBA0FF6BC7FB872CB9181DA4B0F315258A9CE9A1AD73AB68E00F5833805FF00C88B905CD38D39661F942186E0F8260388DF63187D9376D8BE221B176586D286145B4F0A5498E124A84C93FDC4EBA177331E9615655883F6B97CCF1E9097FDB6729D2B585CA268332D5A86A5453BD22E86FC37ED1C2E03E33924F9C9397393CF9795454E5A66390E730C055DBAF5AD2038652549485303425ECDE5F8EB0D2DF883294AC10A05591CB9C0FA5317093BA1F2F3D3D817EAF50A12992A356229C33F2851492A888CA75F4AD9EAD5B3DBDB7585C2D2598DEDE9EB1157AE8B595AC920E813AC69D81CE39F6ED5B8965445C33E5771A671B0FA8B023BC376AE43A92A85B60735989F2CF3A57E41FF0090EC6141294A2C18F27FC4542EB3949246706411DCF3D72F2F5351B3F0E42CB114A3D72B7285912D2C413517D28FC0BF67B52D0ED17262012083A8FF007FBFD2992C949FA95FC72BBEB7E9E6F48D7E52544B3685E80B727B7317E31529B71490EC9E15732639C72D73F865DAB51302C920D7969A6B1A24A524CB7FA93957CB87BBC22E079082B0DB8E0027DC93D7F6F8674E65C852C12C726B7BFDD396E152DC852C06C9C0F7EF486A9B97145005BDC02B244149F7639ABA4EA3B53D97845EE0217D01B57F27F30A6F4B01DD2D5B90E5B9C3E7D06DD29538EA53C5CB8B31E734AFF84B607E65F2DEAF60FF00DB884D1350B24043366580E858BC2A56866DD0F29C4292AD384C91A6BF326B6FF0D4120EFA4DA999E37AF956ED0893F3262920335C9603A5AD6FC4541C6CB45E0B1C004EB9C67397C3E347F88B037B7837AEA066F76A4608216106E73CBBFBC8670D7F148B84788D9201919E625391883DB979646A3A782951483F57FB790BE9F6CC69094C904AC28D4532714A023AF9F5311CF0528CE507F4E5F7DBBD35549529998EA2FD6DC214978A97295F5659528ED5ED668B471552D0B7110490066273CB965E79F39075A8DC4615402B8580C9F2361D3F713985DAB2414A4025DADC756BFDC5DE8F60E245D528E444C9CE7E072E5AE7D3BC557B1095209DEA905B85E9663F8E0C22DB83C7CB580024DAE037126B5886280532A492ACF9778D39C7D00E5511377F78BD1AB47160EDC395AB13D2E727E5EF121FB3E43DD07578897DB46797CA39FF009E9AC79080C46DB1859C6493551604D47014AF58712714852824062726CBAEB51C4D189AC5B58ADD7816EFF085FF004009047BAA2AD3863948D39FAD58306BFF0026426730DDA9F36AE44D844E26592905354B5FDF9E9A4686EFE7DAAD5B9D71D63FF8D75888504DBE18CCB97F72A5100218641054ACC683CB3AE8BE0FF05E23C558B9385C390153160382C5C9039350B3B5A22B1FB6246CF4933121F74D28E5875FBD8F28BA7D987747BE4F6D8BF5ED96D7AF1ED80D85696CBBFCB1B2FE19758AB00E69BE65614DBED909F7338E05F306BDF3F0E3FE9D71B82C3E1E7E25285164A8920F3A022FAC79CBC5FE2F96BC6CCDD2456C0DC654A135D4BE71DDFDD46E8B77FBABD9DB7C236570DB2C20B084B770EDBB4D30F5DB89305CB852238D4544924E664F2AF6A7833C2383D858542264997F312901CA5390B03AD0371F3E5B8EDACBC4AAFF0042AB515001A5327E757B5632F33832DE74B8B5B6CB2D41B55DB1871523DF2E9D0C91A7C66AFB35723700932C390CB7008045B77C9F3ED58198B54C2EED983E808F76B44D38C5C298E149487B21C44E4403064E6648D6ABB8AC3E296A2652F72AF4240E541D188FCC6C929DD0142B9B01EB43F8878D24A1B4A5512358D279C4F539D4860E5CD44B1F34BAB5CCFB6F7531AA8824910A53C8C41441051041441051041441051041441051041441051041441051043777FBBD3F4A471333E5C93DEDD35B5B27BC20B964AB3ABB31A665AD7F7942493A8FFB65F234D3098848739004FAFE5F2D05EB99402660268F70C2946E9EAF4CE39FBED86FDFED726C375387BCB61FDA0B865DE3428A54A6EC5E6EE5D120660A010759935E74F8DBB4C7F8589054582486735E5D3CAA6F1D5FC133E5C89C99BBA3E63D145A84598B86278F9135D0ADFF006CCDF6CA33688C3ED54BC3F0FB661B5AD282471969B4B8A94C0CD609E526329CABE7AE236A23FEE93025542A56772E736D7879C7B1FC11E235270F23E61DD550148A067D29DC51DDE359AD31242EDD2A194F16B99993224E5967D3A41D4D3F6E2C4EC6296E0839641C3E76A35BFBF4F6C1C54AC761659DE0E52F767CB98EB9E90A9C5B8753F319F3E833E59546CB90952B402F6FC5A2C5FF006E4CD1FC778351DCDDB43F704520FE65F8B2D34DAB83C3E2E220C1CC488CF3D7FD53B4CA4A40001BD855EB4E3CFADE18E2763225A553141212C487A373BF067B1E622DEC39DC4EE36F70C66C1B71C487D216B40240D33919CEB9F78D32A732E554580A13AD3A5FAF58E7DB57132B0626B94064AEECF50410EF9F9DC651DB5DD95BBADECA61887C12EF809E30666613F219FF00AA7330BA500D4805EDC32E0DEB1E2CF19CF44CDB98B54A6092B70D620E7A3E5AD5AF1929B679F08E51F31D33F9D20A4B80D4BB69C62A0A98CEE49D74FC7E22972D87171AB28898CA3E3113FBD24A940BD95EAF6E367F6D194CEA6E834269EC1D79E4FC3CF1DB68788540348CD664447727E79FCEB41280C94C387EA1252014A812378BD694B6B4CB4F410A8BBB6BE1F88B45256C2B24A92414929C95047FE535B9C1EF10A09D34D33A1E77A9A9BC47A42925295AB7940A9CF3B4149AA46EB500E63F43DF287096DE0CEDC6F68C31BD5DE2DD6C5A2D0B1B378A63085A8A54BB3B42FA07BC9008339C4E67AD247E972F67A8AF63D7A670EA4286F900B917032A1BF7F6C627367B1356D7E15698A7E0313C33893C4AB475A2CAF3CA382627EE69B4CC490A0056D41571A3D05FABF287895251552F77424DEF7D5BA45CCE2508570A1B75A4803DC7870AE6332477EB4D274F0E58A8035367045E819BEF1AA5616905D2A2E7EA4D8D7DDFEF0E5BCA472CBF5A899D33E616666CF539C6628657893D70EB508166CE683EF051912648CB590279EBA56F86016424DC640DEF5A8D5A9F68D0EE20EF3328D1F32FA7BA6B568C07BD0DF0DEEC93AAB1C3EC2FAE569047130D1704FA1EA4CD5930F24EE86E3F8B53F19B98C942557482DAC5B9BA1DEC63DB518DDC318A61F8930DCA4A03AD29281209D09EFCA9862538B44C2995BFBAF42976156C99ECDC4DA1D8C2EFCA7615663A5855F95B2A38D365D65FBCB9F7D32DFBBC2179F207E3FB522DB43559EAAF3AE8F5A3660B884F7112D164B7035D7227CB2ED0FF00C1B77C26D9D5F0AD04F12504011CA06BA77C8D6A46D014066139DEB614A572CCB7A335A8804A7743E79D32A1B93DE97CA558B1B52D1638CE70224139EA3CF38FAEB9E5231E4FD456DAFD458E7A310465A90E619AF10B490FBA4F5719DFF1EB68E76D1162E2AD90494A0E5399F7B333F7A5650898EF33F95DD9DAE731A30CF8BC2E8C52264B0E589B870C18D4B1635E511EE72F5FBFBFDE9E2774074A6A28DF8CB9901F856135A50B2295D29D295E3083D60D3ADA9E54C919E9CBA48F872E71A532C5A0EE9A00F73E8DC287AE8D0F30B212952737D398B33726A7A8367E2187B526129F2CB967E5DC728806AA98D949FAB334AE479EB5ABF38B8604A52C1A8C38D455EBA3FEA2CBBCB54A5C5A529C8691A67A74D34CF3E9AD414F94A09533391424F034E15E00671654282A4834B57817CFA4415C5B44E51AF2F872D23E1D39572BDB00FF009C5245942A347AD5B964D951A35C2A93F3455CB8AB5BAD3BD62DFBB5B12BB77ED0108523FA8B6F27648260F381C8E42BA3EC89811B2901490E00AB0FF90BEAE34F58B6C80A520AD330B043143D03A481422D60733A473FBDAA775DB118DEF977418E5F60AA4A1DC45D379C56EDFE19D297184B61634502749D7313D3D3DF01673F8830AC187CC40614D1DC176B9F28E75E25DF1266098BDE9890BA82E03BDDF46F4A47D0FEEEB0AC3767B66F67B0AD9CC22CF0CB57B0CB30E8B660328E14DB3441844093339819F9D7D8AF0B2B7B66480C0112D16E43D3DF0F2A6DF2A38D98A52B79D4ACDC062437BBDC878C849C3B0B5BCB471053CDC2968041CE388C8F31F1CEACA43EBCB23CF588389CB55214CA4B69284094849C88831A72ACB0160D0438A20828820A20828820A20828820A20828820A20828820A20828820A20828820A2086EEFF0077A7E94D31DFFF00CE585AA4E7937BB46410A4E8439639FEE8CD0D3C4E151C8CA4F3C81F5FF15052A6142580513F5540EBC3C8BD21171BEE6CF9F2F7EB1CF0DE75F398E7B4961966C1877000F02173C31776A348CF4274D33E599F2A7C75C699782C48CB74B00399A9E1E5C4C5E3C3D3D52D52C8240075E3A75B679DE24B6F360ED76A2CDFC2AE116EE256DACB8A700519E12A1C24EB072F87A7CE39FB489DAA402C42D65CDB3F75B1E11DDF61EDD560C4B5952D40148FA4E64B59F5ABF2CE91CD4DBCDC56D2E09757D7B8532877094AD45843416A772278F2480089074D75D4452D3B1226282D4C6EEAA64295A67D5ED1E92F09F8DD1264CB96A9A02801F49559FAB80C476E91AF8F5AE2EDDD2AD5EC2AFDB5A55C256A6149464489072CBD339ED584CE483BC9E058795C9E7EDA3BB6C5F19E1674A1F3160D01AD43D5B3CF85F4192F6D84ED0BD76BB6B2C23115AD6501372185FE1CF10E4B1AC139F965953C97884A98960D7CB2F75AD6B9C6BB77C5B874E1D7B8B48FA496040A8CEEDC5B91D2374BD9FB73AFA1D4E25B43689376B5256D29683293075E2CC6A34FA654F113921F788B6445EACD5F5EF1E62F1978C49337E54CAD6E68CF5CF896FC88E8561086B09B166CD49953408940F7784FE5D633032397A9A693B1A90A670CF4663D4971F71A479EB6A62958DC52E7BB1597BE97A07A3FDE26D18A5BA6650AED034EBCB2F49AC231214097A86A1258BF3CB8FA188DDC59A3B8EBF8E10B3D78D299012485DCA541A3FDC9294E8BE62797A7ABB42D24124D4E941D7A3716A1B46802CAC245377B17A86A7ECD9A916CDEB372E6CCE296616945FBB6F70B616A24240690E2CC9D46432F2EA327294A72A9A367FD1B65DA30B44C0B0A25935DE7CEFC2CCFEC4637DC3ED1398B6C9B5875F2D6AC46C6EAF9370FA892D287E25DE0E151CF2488CEA570F286E0373A914AE5DB816E75289511308DD25DB2A8A1CF2B7171190F15DBAD92C11CF0B15C770EB120C13717286C083067888A6B899692E02439CDB917E3D7808708FE40B3F0E9CFEF0C13BC0D80C6DD6EC6CB68302C75E91C16B6F72D5CAC139C040CC2B39E711509884EEB860746AE5C6AEE3C99E1C4B4266391BF2DEE41670072A80D9DBBC4B3D8707407ECDDBBB22DA789BB76C86D939716481D7288D66634A819C95256480A15E34CC0B55AB778709292A017B8B4B67535D6835CEDA8362DC5CDD5BA6E2E140BE4A92A6C93E20083C2091DC099A69353354951357676BFE6D7785B79091F2D09DD4A6B664D5EDCC9FB3522A6EE21C2DA9A71074952606463F7C874A60A42F78D77781241B7DC8EBC60157D058EB6B7786D89DD3785A9973C4BA5AEE891E1B4A05ACA06635CFEF2A7D8374919BDCDF86553CFCA130779F7923E934A026AFD69C6DE9AA3ED21BDFC4F7718687F03DD5E25B5F893E825955AE0CABE4F1651C45242B98D34D672156FC2A920241602973AFDFF00340D19001208592C482E5C69F9AD7368E79621ED19ED878A20DDEC6EE5DBC0DE7CA821177805F5BBA8014784A92D92448CF29EDD2AE183C260A74A0A5896F9EF370CEBD34D22630FBA258DE3967E6F522E29C69711682F6EFF00891635748786CDB564D13252C5AE28DC2409C872CB97E94EBFC1D9E5D928366603ABF3E873BC258854A0E00481A1142EC3A9A1F748F1BDB9FE237638D3CD8D9D6DD6121BE071EB5C514E12539F11919493CB410234ADCE03670500D2F3776A534B3DBEE2B10D3C7D5F4D53C1FCF97F778BD6C36C7F88F39709B8FE478606A4152556D8A710C84889E5AE5131F04CE07679144A1C02723971A6A2A223662544BB727F5C8768EACEE131CDE3627BB6C05DDE961AE31B6AA1703154B0D3A8B710E90C94F8DFD4CDBCCCCE7A64455136AC8969C4912F76A5D85880F6B53FACA236619A85B07A16A3354D838BF2AD6335A995940594940E8A107C88CE0E597F9A6C25B07B3666FE9DADC2E61D4A9B368EE793BF07AFE1B9BC205D053E085A4AA0FBB3A6A6239CE910640E951F8C40DDCEDDAB9532EB9E8625F0F88989FAAA00C8DE872EE7A72882BFB27735171A42359528803EB1D7E3D22AA98B96778F603DDC8AFE6B12B276B0412198B86701F8B7F62869AC5917C508756994B9C310B6C820F69C87A89D2A2572F7D2A49B31AF2E4FD43EB174C0E24CE91BE48622A03925E9EB977362602E16933EE91A6BFB7F9CA7CAB93EDD93BBB4142C4285EEDD43D3A73AC2F869844C046ADC5AAC74FEA2031369BB96D0B295A45B927FA6002B9CC4CEBA4C8D055E36691FF6B4822A1AE38DB5CFDB45AF0CA280B62499A1C0A9DD2054707E6F68D62F6862D5FE19B378A5D34D24E1D8B5826D1C4262E1017885BA1C927498E434D729AF487C059BBBE21C2906826247BA35685B57CE285E28584A26805C90AE21C8F304BD357B523B89B076E977663671F42DC8FE51619AC82A8366CF3191EB98F9E55F657C1EADFD932142C65A07601F33AC79636F157F9B3028241049648A317AF5D22F46F0F6DA7D572CE6EAC0E32B882448AB5D5CD9B2D78BC41D5F867FAE3D624D09E148100750349E7598CC5544105104144105104265C4804C1CBCBF7A208A92A0A008FB34411556017D473BC105660828820A20828820A20828820A20828821B9CD6A9CC6500FAFEA3E95B2D01728A48B83D59E8F08AD7621C31FD3FEB8B4337340498FD74FF3F66ABE642C6FB07A1619B077B81DB410BE1E5A66104BAB3A75BDEB4CF5B4738769DD461DED4D7AEDD9E14624122DF8B20AF0ACE17C33E7CB96A6BC73F1FD1B983C5354EE2AA78D7AD79522F1B170EFB840A5AAFAFF006D4E45E325DF5CAD372EA8FF00D8883A94A89000D728C88D39659D7CC7C74E5276BCC00D02D4FA5CF76FD17CBAA6CE947712086A0F263C01E34CA978B6EFB0F6D68530E34CB96C4150428711CE54796799E7A0D69D4DC7A81DC2A2DA13437E5E5C1C459B0D8C9921695A54A4B3074D0D29F8A7ABC630C5360B66AF5D5ABF9532A70AA494B29CD47EC69AE62954ED0144B816D18FBAB3D5F9BC5D367F89F1D2032671090D42A3F917E7E861E615B2983E1A84348C1D91E19399613399EBF4CA220E5269ECADA29B10096AF1EDE5C1EC6338FDBD8FC5952CE32690A006E8592035D867F9B0353191F0B7F0FB3424218433000C921307A65E596A2333CC56CADA2EB3F532438A13C46BCCBF168A1ED44E2B144FD6A5139972FDB950EB43130ABE4B878D2A949D0C920C7791E5E9D6A2313B4089CDBC40A31A01D736D0657E310E9C1AE582142BFF0090FBF3A57411E7E2BBFCFA4FFE54BC8C7B8037C971AD2FE7A0E1CA364E15C394D4E8187663A738F1AC4494DD28A813645AE1139FF508E28813CBA7AF598C3E31D2FBD40CFC3CF2A071EB18548DD5210515980B280D3A6A6D719E70FF0013C45855962188A9C436D5AE1B76209E1054E5AB894CCC892AD273FA54CCBC5216410A601B3FB72F6F084DC229081288256B25414452EE413536A7E99F9A9BAADD46F776DDEC6319B7DAFC4300D97BFBEBCFC33585DF3F6D78DA1372F2547840E01C473491320D4EE1B10552DDCD05CE63CABEB11B88409738241B268466C1AFE7FB8D82C07D923661929C4368F6CB6E7682E78F89C6B18BF4DD5B13C52470A84F01E8796998CC5CF0B046E9AF6FCC6A824281A1E7EECCFE90DB6EBD9D6DB04B91B5FBB0BB7EDB14C3CB6EDD5936B0965696C26006DA01454A4A4954F5EB4C572828300F7A69E96BDDE838C3B94A00B29802FBBC75CAB57B7EA3316C0EF5AC31DC22D70FDA6BB6706C7ECC06556D72E25872E5685704210B3C4B242499FF00CBBE6CD783DF0429E868C2879963C837385A5CB085A949AA660FA83580058A5ED72FC6B6B65DB8BA61EB6FC438461F2907C673FA485240C9415CF88099E73CB96666CE64394B1ED91EBCF4AE51A00259500A33534A3EF10E73E3D22D6676A2D97722C6DF86F94494F8EDC3A91DCA81073CA0EB977A80C5E1771C94BB3D4873CB85BEF710E08702A43642DEFA45E2186EE59699B8653C4C7BC97169120A8F16455D34D3BD452677CB5005E97229FDE79757786DBDBAB528289DE23E97766A503DF9430C45AB5B80953A8B7B82CE6943802A39E999E5DB3D3AD4A49DA3BAC1EB70097176B3F47CEBC6164EE8496078D03D73D0B0ABE4211670966F909BD0D2592E65C0D27850383DDCA3213FAEB066B49DB7F13294532D4B6B80096F2F2F586FFE62649F9656481404B392F6AD1AFC9AC21E7E1DCB51EE072120444FC2639469DB3CB44BFF0052634577D63AAB97DE364E2933AE4115BDB4E3CCD0E9A3B806D968E271A74BE7252B8667391993CBBF291DEB7FFD478C5172B9A49A9A9E5EFBC2A12B2B2C65EE64FAB572BDADF984D572D5B49517929EF97DE9D67B01347FEA1C633954D1CC9D5BDE5C6154E1173582370ABBB926AF9BE94072AD22D1C6378585618E38CFE29849464438B01C075CC4C8F3D4CD4D60E79C523E62CEF28805CBB8E64FAF03689FC0783F138C489C6429454CEC974364CDABE678674B5BFF00763669C70A2EB16B76C4E85F48F3CA7598F2E5CEA4E54B4AD3F5915E7951B8D5BEF944B2FC118C949DE95852A2057E93E54248A8E59B52166B6B366B10B8371618DDB38B7238509B84418906409F2D7BD34C6E191BA4A5493CEE08BDBF711B33C338B961A661A605077210775F51A30ED487779883CFB7325F6CE60A254387288EC00E474CE7AD371A8DD51AEA2869A55E9534CAA5EF1098CD8F3A5AAC6EC41151A7DC1B8E516FAD0149242383FF00150F7A679888CFCE2A384A065920558DC3D2AEE6BF8CA2CBB35065604A4E8589C9AF7AF1B54D2B7888B86CE720F68F9F7E5A7948AE41E221FF00F60A615DE1956E1C76875865BCD038977A55F3D03D7CB586B7486936E841C94E8565CF2E994E93D7E02AD580504ECA4B962400E4B661AAFC34CDA2D38652F789BEE07A1B02C34CFBDAF58D58F680B05B981E156ED82A0317C39413131FFF0020C2A600EF3CC65F1F40FC079C3FF51E140723E627D79D85F93C50FC533184DD6B6072E55AF677CE91DBCDDC2148D8FD9D4AE4286156120EA3FF0088D083F7A57DA1F042F7B6361C1B89693E498F31EDE2FB426E5C0E51901BE7E9FAD5CA21A14A20828820A20828820A2086ABFCA7EF98A208A9B5A528009CE4F4FDE88214F151D7E63F7A208AC104023434411ED1041441051041441051041441051043424176648198C86B33AE7D4F2E9CEB72B0894544380FDAAF9D73F758D0C82A0082C9258BF0E9EFBB3779B511023EFAE63A547CB5267853101DED7CC00435BCA1DC8099742483C34E141C9F9DDA39BFED41835E607BE3DDA6D6B4EB6C61C1DC4538A3CA5148056DA1A652B50112A260126BC81FF509B3969C162D6038DD57A6597B7A068BF787A6A0A65A7526FCCB11D0F1F31190F12B9B775A17691EE2DA69606449F701927A1C88D2457CB9C760D5336C4C0DBBF5AAEF5B923F27CF5EB3B26515A5082012C4D4519B2AE9606B70D9C5A0AC45374B2E953C8493010080070E472D0091CA399EF50DB492A918829776A1BE8E34CB5B6978B0AB6792948CF403882E4DC71E368F5174EB47FA086951A07733E797AE82A3D33560BBBF7E99F2EDCDD05E12623F8A95517724654E068E3D6137311BC5288710C0573E10A803947783D065DE9D2316A0C5EF7735D5B2EA75ED04942D0485134E3CF2F7A9AD2103E2BDF9A00EA24651DB3F4FF30B7F9A3FE4D4362FDDCF4A3FA187E89D2401BC0122D6A7BB74891B674B6D21B3991327E7D4741F604B398264E9856282B9D6D6D5F5E995984F54A2B200FA4D8162EDF872C7D21E25D52A20FCCE5F3E54EB0F2660A9272A039D2E3803ADFA4372B969A048ADC365DFDE9155BB6A40BF796B4A9A5A99F1500CAF2309CBF42721CF3CE730C85B5DB9870C2CFAE9979D5099889614974D43B1614F3D784629DF6E3589E15B2D6B86E08D3EE3F8DDC30D071A0541B6C5C212E874A4C89415012623BCD4D4B0A29156398A86E9F9BEB099C54A24EF2052C5AD950B9CEFE958CE7B01B396FB31B3369875BA43695DB34E909007F51E425C72748256A56B9F51315352710508092EE00CD83E79F768AEE38A553B7921C39627B53F079D69177780855A29859515924833A664FCE69C22782C5CB96BE7CC72D1FA43505887EBEC7DB9437B4B336CD3ECA5280E5D0212A0202A27883A4EB0321D01D29F4B9C802D7B161C2EFEEF6CF72B0552D4C92106A186F558E5E75ED5235577DBB97631B617B4F845CBF8663F8105DEF0DAAFC2B4B82DFF0054A5600E257BA888E67999A5C4C964592E320C395AA29A3BC3B46252E096034F646BD838D2301EE877C9BC0DF862F7FB2B8AD85D61786600B4DA397A869D67F121AE26F890E1252AFF008B33949351D89DAF2252BE4A83D2854C683D7ED0FE561C4C47CC012806A4B004B9A51BA7946EBEC761385600828B6538F2930971DBE292BE29CCA5423E27B557315B4254E2C96009B5B56EEC6E358557825B10028D1DC697D3A68D9BBB5ED717816E908754A49009F0CFB9CB4CC75F2F4AAF4E214A56E9A1B75AFBBF0D2139781536F14B1D0B057BB71BE70DD6F2D078ADDB6564EBF884C83CA323CF3A4521492E083ABBD7CB9C657842A052EC750A63CEA29A5B5E061DB6FADC424BAE1B75FF007376CAE06939EA94F53CC9FF0034F913A40401365A49D583DF577CBAF48899FB216A5EF6FB816AB13AD73EF7CAD15A956FFDCFDD93CFDE1CF5E7CFEF9D6462304A1FFBA1FF00D21F857A5DFCE1B8C3AF0EC93522F99F3619F9DF449DBD62C9B539E2385B482417152729249CB972CB2E5DA4B0B2B0B394375294EB4039796A7CA27707865E2421294A4A945AD5B81CF51EB9BE9F6FB77D69C14AACB0CB974DC12A48F097212447E6820C67CB908CEA613B224CD62025AE73D2D567B768EC7E1AF8798DC7C895304B092A624B149BBD69516F2E31A5F7DB73B418B5CB97577885C7F5CCAB85D564341A9CA408333967CEA4A5600490C94848E54AEBE5FD8AFA07C3BE07183C32244E40DF005C71073BF967A88B2F16BAB9BB928C52F50A339F8D1107CB9E5D35A7024EE8259C0EA3A53DE516E1E0A9332A10914190CC64F5BBFB7885636AB1ED9CE1559629882DE6CC92B7945A235CA35CBEB03AD31C44BDFDEB56874193D1CD731ADCE510DB4FE1E7CC967712900E5EB460FE6EEF6BEC76E6BDA4715B9C598C131A7D0E71A90D85BAA247432547F49CF5EB5E9FB326CD5B83726EFA3035B37E291C9F6E7C369A9139611500ABE905FE90EC32A8B657B88DFD62F59C518372CB8D28702567C320A0F1267239E7F669AED7D98BD91B3D78C98A1BA12E4039364E19EB4EF58E358AC0CCC22BFC7285A194B1F58666398A366DC18EA623DE09530A7828702499139C831A1D73FA9E506B814EC4276CED4299043EF3026E58F0EB7616EB17295F2A682A0487BF7E0DDA2D8BB4BD78F5BB8CAC25A649E34A8905526047A83AE9E622AE188C1AF66ECE0998090006A386A3E6D5E80D1DA2DF859E9F944D015062F7E5D88B91768C67BD2C1BF98BFB3D874B7E2E25885AAEDF889294FE1AE995AF8F2241201881DF38AEEBFF004F928E2F6FE0D69240F9A1C500351C6AC337E51CF7C52779334BDC28E55615CBDE79C760F64C26DB01C2590326B0FB341F34DB360FCE4CF5EB5F68FC264E1B64C8704FFA48B0B505A8DA0D34A5BCD7B4D0A998A98A51FA8A8E766367ABFAC5D68706700998CF97EB5615ED1DCBA559D0073F6EF118A94CCC4679F2E1CE29FC5B61C2D190A1033D331220FDC73A25ED0130B00DA960D76BFEA115324B13DE9EEF15A9F4A53C460F9199F21F3D6A4E52D3303EF2453335B69EFB422B9BBB6AF1FEED9E45DA1A7F32689E11055CD23F30E922644F2A6B371699733E581BC750FEEB52D0D958E420EE962AD054F5B0EDF6857F1CCA44AD40189099851F2075CB3E54E64A8CDD136BD39E7942A9C4A5428CFA77E3EF431E26FDB5202E14892442C7BDF09EDCFF00DED35489555CC401997B35DFDF9D21ECA96B9A010186B966D0D5DBF69394923E9CF3D62753032F8D42E2F6E60B0C4838896FA6F0A7E7BF0E21DA706A2CF4A805ED5EDEB163E37BCFD8AD9E5BAC6278F61CC5F311E2D82AE5B4DD278B3482D28C891046B919D2ABDB53C73B3B6661158A993659003B05269A67CFCA1D4BD933A6A884A084E4A214C75620D5B3A44161BBE9D8DC52E536F6F72A1C4603AB52037F107F59F94D3B67FC65D918FC60C2A14872ADD774EADAF06FC52313364CE96E4D8396D00E95F7C5B2A5AE316370DDBAADDD43CD5C025B79B50534A2333EF75D0475AEAB86DAD2715864E225AD242802038CC75E76E05A23CE1D61DBFDB70D51CFDE9AC488B8495A91C2A1C312AFED33D0F3FBE944BDA895CC0862E6D415FD18D3E529897142C469ECD2D9650AA161C4852743313DAA550ADF4856BCFEF1AA925258DE2BADE35828820A20828820A2086123C4E1EE0FCCFD8F5ACCE1FF00F156AC8053F2F64FA43A425E50E6A3D89A428540850E9233E7F647D399AAF6CC9CF8B32ED555FA9E1A8E35D1A358D3FF006C4D89BADABDD4E309C212A38EDAAAD6F6C5C6C1F150DDADC26E2E380A4710E26DB2150340796BCDBE30F860ED6D8B895A51BE4CB2ED930A8B708B46C09AA1302033259DF4539FEFBC6B3EED36C5DDB5D82C3F145A8A6E380D9BCDA8C14AEC57F8658209247116C9CE67B57C89F887B2E6787B6B4F985051B8B5D5980ADCF3E9A976A76FD893D9090E1DA8721916CF83BEA06513CBBA0D2CA262232D27FC6A3E72753C6315B4FF00C99A5649356BD78B67A533F4BBCAFAD00D19AE6C47BA7AD6176EF4883C5A77E5A473D24F61CAB444D2A65025F424F2E1FDF9EAB97BB4BB54BDBB55BBBB370878973C44858D0E99F2FD29E4B9656C5C1D4E9FDFEDA192D3BC4901ABCADAB663FB7BC3E6F9FA73CF2F59E7AFCE9CA70FBC452D5200BBDB27D32F586CB96C5C9BE41C9F4A768593F986BDFF00CF6A7689252057A1EB70DDA13521245125CBB96AD3DD38087CD7F6FAFEB4FE4A294E14CEE7F64F610DD520B12417E0FE6E3216D6247F061865370A59E1BC30533A701811A46672CF974A9995294102A0939569D1BDF488D5813173129FE528FD593BE6D9BE79C4D3780E137D6ADA714690FF0081EFB256124833C530A079C69965E712B225050AB06A56B57CCE6D9BF9B888EC42E682844A40512FBC482586AF67A9D6D71130CDDA14D27C3F7509F71232FCA9012072C801FB73AC295B8B24F2D1E9E8F73FD420B94490141DAA684D4FA7AF2857F140F3E7CE72EFAFD3D2964CC0082F4C8034D6C4FAE67A468A934A22B4CAA7DFE8DE28BAB852916C5A265B52B8C89CB88C0075EB3AE7C8D3D44D06A08E5956C7B674849324EFA8A92C0E4CD6E6EF6B8A33C597BCCC758C0B6471DBF7D21C1E034D2F9FFCF2D899CB32AD3BF5A5FE6EEEF68D972D5FB3539C6C892920100DFA5FD9ABC61CDCDD8E0D856CDDBBF86E1CD337B89BB72E3CEA1A4A16B2A794A0544004C71644C6B3E74EDA7337B12480CFF6D3DDB47A58F092C19037CEE8171950E63A17E4632D3ED356CD169D584BAE0924182273E79F3CA7A79C45C3E94B2B53A58CB1404B105867F76B71315D9AD2865012E7880490BE2E23A9E7CFA72E9446CA439706BC7DFE624D2BE21A8FB3CB5F58F5A21BAD172C5F30D78F7C4299CE008D4F5F3CB2FBD6929A58022E3F223558019B378497759812353399CC7C40FACE79F3A6C92C41766F7E578869D27E6CE600D081ABBB0E6F7D2CCD420617DEFEDD1D98C02E4B6AE15B8DAC20E801823B733CBA4198CE7F674D4EF07BD1DB8364F6CC9EFC3A5F83B63267E224A948DEDD62011435A3DCFBAB54471EF6A77818A5EED0DC397CF2DE6DD795C3C4A24264E838A6047FBABC60A6A77413502835E75BB79B5338F69F823610F91246E00E91D18662B619674CAB139698A85DAB6A27358EBE5940048CBB4CE841069FAE68D69975D72FBD62F58BD9CB9135920D05486D1FD8D6DA9A1CC450264881CA673ED32232C865E7A4B45CF21C034550B5A8DC79EAF0909CB9640215A501A375F4FC442DF620C2D21B5000AC11CA67965D73924D3499358904BE6E3F2EDDB48C7CF5CCFA06F1D3CFDF73CB155F3B89E0D8EB18861EEADB8702814A8A465E519C1E7AF3EED953774850259E9A65C73CBCAB0CA6EC59D892B265A88502EE1F5B5EF9F28EA0FB3DEF06F719D9962DEF1F5BB7496F85C2A5126048124E790D0CF3ED3517E319FF0033C3F32593BC4A1541A3E94F6ED78F32F8F7C3E246D09BFE9EE904D8354BBB5FA9D2F58D8672FDE369E0824159EB1A9E59F9F502673AF37787E4997B5F79882262A9D7DDC8E2238FCDD9C5134FD2D66A3356F5D21F5836AE04A543DE57BDDF298F9199FAD74DDBDBD3F05BA1DC8038E55E3FAB343E4C8F9729E808157A0FEBD8BC634DAFBCF1F7A3BACC178A4DE5D5EC26419F08A17CB98CF96401F5EFDFF4E3B3CCADAF84514D3E62090464F5AB797A1A8E6FE279A1299AE4FF0015371A1717EF7FCF607086FC0C36C520C14DB30982607BAD2464272F8EBDEBECEF8551255B2E402104FCB450B3FF0011CB4FEAC3CCBB571E99589526BFC959B677D726B696313CDAF23319C4472E994F3A9C9B8390A2019690CF50900F2D0B7AE511A31C998FBA4022A75AE753AE55EB0CEE6CCB8A53ED28A5460C1ED965EBEBF1A6337032D03FD30D43EE9E63918CA4AE654B9734EBFBCCDF934276A9712541E54C64028F2CC69F0EFF00AD7F1188998759FA983EA476D457DE4BA2402FBC2FA5DC7EB514E358A14CDBB6FBCF209F117054A5C78420671CC77CF9F7353B85C6603FC713710B921412E4A88DF06AD77AD3FAB16EBD9614B2B4A4BB50354B9C83036AE7D59C595B51B6FB29B3D6EE3D8CE2D66CBCD4C34CBE80EE5FF8AB9E407EB54BF1178FB66EC996BDC9F2C14BD4292EE1F9578E6D9C49613642D44028209BBA73A3DBCEDE51AC5B43ED3570FDC5E615B01B3D8BDEDFA484B18B6296BE2604E28C66879B54A929D164686BCD9E2FF8ED2B0DBE9918A7237836FD2828CC781351168C2EC898AFA0B849008DD05E9AE8C6313E26D7B42EF0093B5FB59806CC60EE199D8EBDB9B3C4D0D13201E3F74382418D2418CABCD3E20F8F78F5CE9865E2E6B026D315BB7E05BD2968B061B6484A424A3798DC8ABDC3D9DDF99A42DB3BB9DD9AB4B858C471DDA3DA8B84C156258EDC22F2FAE179921D78895250470A33C911AD72FDB1FF005098AC4C95E0A662E66F12410566B51C74CADC749D93B31A57F1019E940DCBAE9190118260B875BBA9B6B271AF0D24216A692932260830232D620F3E951BE17F8AEB95B4E54E54F213BE2A554BB3DF4634CF9445E376728021208CCB8F5A1A643A4671DD163CCE2B84AF062E14DC614A511240510E2CA877D079F202BE85FC29F8928DBD230D86F9FBFBC121B7B80A55EDC8966B068A7E330E641528A497BD1DDADCFB53A1319B5DBB52ED0B4DF10B9040274300C1EF981F3F87ACB666CE44E948C4160E01AD19C6B6CF47E0D7AECD5942DD2D5720356D502CF7D2272C12B45AB6173C512675939E7FA768A94284CB2509B0B7BF7CE1B6FEF926BEEC07010F2B119828820A20828820A20861C12E13A1E674CA75EB39E5E75B4D27FC75268CC4D79B81C896A71870957FA613C4F2677EFF00685384F14E5DE3AF38F3EBE7EB5AC14A54AC5FCC66FA89D2845001DB2F2A425314C014914BD788BF9F3D0C59BB4B602E59BC66E528751736D716EC323DE243CCADA59E13A81C5273981D00AB26D1C148DA5B2E6C854BDE3B8ADF252E1CBB0E4F7B75B895D9F89DD5A595BA1D2E41B91A17AF2B7511CAFC2D86375FB7D8E6EFDF4A9168E5CAAE30B5A0016CE97D4ABAB84B44E4A502A85009FCD97535F26FFEA63C1ABC34FC6CE91288AA88094B50BE5C3981CB3EC1B0F1EF2A5A8029A0606ED9160FA96BB01D22FDBC68DDB8BBB62196571C2DBBEE39EEF320693A8D6441E95E024E166C8529131C292A21B2FE5C6B4BD348EB3B397F370E8A3EF5C9CB3BE74E34B81110C5D715C7E1C1293A059C9073F4CB4CF28A792533010E6CF42723CF89E7120A97424B74773CA95E462EC6141A425A52D2B52466A4990673CA796639D4D6186E9AB16CB5B96F3F2A888F54B5281205C921DDEFD7F30FD1708E60E71A67F4D73CBE93528898803439BB71F6DA57386E517240BB54549E14ADA1C25F4710C8C7A7FAF9F4F4DBE6A29F50739387F5F48DBE48527F890780D0F2CE1EB770811AE5DBAD3C9335096AD7C9BED7FD6A92A4960DC7A5EB4B509D4758A96F5DBE0A78D0184478024C833EF710E5273CA321E553322685331D5AD4BF13DAB5D3364BC3A0951090952BF9716B1A72B73AE9376AFDCFE1C21F7029432053311A419E80F3F9549CA98C28AA6A48ED66EB7AE70C57242545D00306A0727F35F28789B84B00340CC6A44C7BD04E874D35CF2A8F9F39A6286F501B8208B7F41AD0CA6E1C95380467D3806D5F8985C5C9390933D24FEB23E535AA278554AC86B0767BDC7F40469F208B247507F07D61CB2E10D5C051953BC3E11CC84C6B33A03EB4F25CF600DF4E1ABDFCBA36692A428A907E9003EF0CEA29C3C8C5A1B65B3EEED5ECAE2F81AD683717EE5A2995289F0D2961E0B7028E664A410235269E23140A4835245079675E3E5C630A9133E6CA28291283FCC16274A5AEFF007BC31C1F046367916366C2521BB26C2484819A9491C4469CC4CEBFA56B1CBDE9E55A9763C35F7E64C4C4840548521CB960F6039F9EBD225AE116F7772E3CFF0019414C2008907860C8D333D34F9533A126E3CFD4F9F942A842A5CA084B120E76A9AB7AD7AD629B3B12CB094215EEA492924E704CE7F1EDEB58850A80A1BE6D6F387801403C5CB90CE33A234242886A1ADFF4FA43776E005409D739D065A9E7C8F5CFCE91981CD5D8B5B87F5E70DA6A4EF312472D381E7D793C473B720716A75D20E639E5F12338D7B068A705B8B3FB7A9C9FD690A6170E14B0AFE4A7140F4FC5AFCA35ABDA06C9EC4765AE54D254B752D2CA12904A879C67CA7AC75A96C34D4A1282097CF362F9DDCE56E2C2D1D8FC0625A315BAA01814B3D32A803BEA79C7212E12E5BE2B72DE2E859525D5786003900A233E2D3CFE11955B30389010904D40E5CB91CF933691ED3F086270E8C3CB48DDDEDD00136AE65EAD66FDD66EDF1342521014AE119252341DA35D0C1ED9F39A915E212A1722B4C9FB9FBDBB474199814CE4FCC74AF785C5F2FBEBC3524BA5DFCA09D673C8E7AF5D3D3E3CA9A2E6E76BB1CB4BBD7A74AC4362364EF1748CCFE3B353AD4DA2DBC6F114B4D32E369754B24CF081C880200A69367B8209ADBE92FA5DFDE8E23383D8A4CC054906BD0374E56D7998B5B10C51779E1212E21B724407494F4D633D20F6CE9B99C4B24292C3F8BE45A963AE917BC26C992894EA4151DD3FC402598DCDAF993FBDEDF65D45DB2CAFF10B4389584F096C92233EA0E7A03976279D43EDB9DF3B04B94A2E7748615A1D070F4AC7923E2F61654AC76254801201A0CC6A1B91E0D1BBC9BB63C4432A42F8D24498CB91CFE73D74AE4B84C38918FDF0199449360DAD6ED5A37DA3CED89967F9298BB8059F9D4E608EE0C5CF66A0FDC80D25442000531AF126065CC08EF19F6ABC0969C604A12E4121F3BB120307F4BF3888C57D3208240556A6C1C66467A6BDA30A5DB2BC63DA7F74F84DBAD017833B8AB97E09C921DB74B8D822352065C519E5A44FAFFE026C6323178599BA2AA15E3439F3ADFCCC71DF15CEDD4CD17A299893ABB5A9AEBAD44764AC5D53EC5B0692B090DA119CFF0062129303331918EC62BE9C787538A4E1A4EE9DD0501ABF4D0545FDF91F2FEDB96B56354966FA8B1ED9BEBF6CE9131E21B74A54EA5652A895019274CC9390113FB55C7FCC44A40F9EADD201724D389EB7F4D21BC8C2CEA50D6E75F77E19EB0D6F7136ED185DD29E6D16A94951714A809004AA4E8204C98CAA0369F8BB65ECF96A5AE6A0EE8352A4B5B57F2BF78B260B08A528259D4726BDF5B0CDBF6DA81BCEF6B2DDFEC7DC3D63678BA31DC59BE248C2B067DBB8BF5AD23F2A590A0A2A9CA23E735C47C47F15F634854D1F3E51500AFF00724316A06CBDD2D16791B2B78A7E8AE6E2F67FBE5525AED18A99DF26F8F78D85A2F706C39AD98D9FBFE34B0C630D5C59ED1B484129529F4A4F08E28E264FFD08EB5E58F1A7C7FC461715324E1314532D2540042C806962C4D19A99F38B1613C3E850F98505D4CC08A060D4E3A33F286F83EEBD8BEBAFE67B578E6378A5D9505AEDDEB90FDA49CD4025C1307CB3115E72F14FC72DA38D331271733EA7702629EAF70F6D74E959895B11200013F50CC870391616D7F35C9EC5AE0B8484DBD85A069A68421A4B690D891AC72922550333F1AE3D8CF1EE2B684C56FCF242890C55EA0BE60B3F9089CC36C800074017CAFCAAEE39D3562F0E9788DB110AB5682644C204FCCC44763F2A7123112F1A9798A1BC41CC568F6F7DA2451B2806DDA13572EC73AE75D1E0172C3612E59B4842B4571244667B69ACCFC2B8D6DAD9D8A5F889A4AD46515644B014E9DDBA64B0C1A93BC998DF5301BB6A5C97F4F2CA29BB5BB7C10D9E042345F0E47399024F3E53AE5E553F324E2767CB4CC0A208DDB38146D19FF3A986B88D9E8520B3922FBCCEF6D2FF009B45AD866D07FF00816D93174DAD630EBC75B4DCA947DD4121284F88720389648483AC7781EB3FFA7AF1BCDC36D4C24B9D38A46FA036F367673A80C2BD328A16D9D9EA017F48200A86AD7FBAF08DE3B2B862F059E20CA7DC71A42DC1A95788D8292206866467E55F62BC27E24C3E3763C9226254F2D1621DE96ADFBD41BD0C72CC7CA5CA5949AB6F55249B96E1A75EC22EB654168E21224CC1D469AD5A02D333EA4D8D5A1ACA0426AF7CEF427DDCC2B598560A20828820A2082B06C791821B05242B965ACC41EDE79D42A3682A6633FC32490F548371715360F7E02F585424945297AF5CFA450B751060C1E922467FE321E952EB929952D5319886AE43573473AE7CDE184E594AB749607372DF80FF009EB6E5EDB3D77885BDDA4AB82C82D2100E4E0793C264660F083F426743A61B694B5A6648762BA298DC07760CF5F22F9C3BC1CDA906C0E5AF63C99FD446897B5AEEC2E7F96DB6F0F0041FC7ECC3BE290D025DB945CBA90E8570895042279E4267515E6BF8D3E0346DEC2E2A7225050285127774196AD47C9E8D78E8FB0F68D65214C145986603DC8A548B1A1D230CE01B5B6FB5383DA5EB2A0DBEB425B76DE785495B4036B0539C4A924C11A57C9CF1F7857FECFB6A761F7373756A04377CAED6CFBBC7A2FC3A913300958AD03837A8E0EC4B6B571138DD9A5E1C208438661472332799CFBF6F49AA22B06A975673477C8E6DF819923368975A0272040AD9DA81DD837F50FD9F12CC780EAF8968CF8A7AC75EDDA0E99CD3698B12AE403CFDBD5A90D16029F75B81ECFE90F9AB9194E7AE720F5CA333EB34DD5B458DDC73FBD9F4E8E2F0D148214D523337E8E58439173A67D39C65F1CBE1E95A0C7392A05EB4A870D539E661DA255052ED762C391AF3878DDD6B9FCFFCFEBFAD3E958E342540D01A9B599BB1B5A34561F41DBF43D44495BDC7BA9274CE7BFAFEB9F99A9AC3635C02145F47CC11F8A54654786536433D393367E9E96A65128DDD8C803E7A09CF31A7C797954AA31E4A4EEAAE2D4EAFCF817A3F0862B906A4D6CC19ED7EBD61D78B2AD411E93F2314DA6620A94589B9A3F3C837B7864B94E5ACDC7F47CE1CB6F0C88C8C41981F4394F6F2ACA67106E7AFE7BDE8D7D234F95BA2C0F9935E5587497A10003ACC91E7E83EBE95212A783572096EFE9A793BC226555C01D6E3CBCEFDA00F1D38943D4FE84D3A4CE049A654D7DFB6307CA1C3853DB432753C6E295EF13F1F8EB51B893BD3093776603261EF8BC399602502A2BD2C4DB9427E17657C3FC5378DDC6A3B887CC8E16D23CF5F3FDA8845441510F0939A2BCFF5A05481AC651FC875F4310376E70BAB13A46435FAF7AC4C04023DB3DF85A1E270E26241677AD785743DA2356E8D4188F3F8CFEC7D4D47CE21CD0E556A5B8F07F511ACB0252EC03721E963CFFBB5F1FC1DAC5AD5D6AE1295B6E2542089047DE9F104D29869E1EB514A71CAE0B71EE0D62DDB1B69AB0D325AE5962935D4E7DAFC1A39E7BEBDC83AD3AFE2B86DB10254A8424C19F200CF4CC7A4D5870D88DDF50E73E5CEF46E3468EFFE1BF1B7CB952C7CD3BC00DE0FDEFA79E6F411A717D8662B862541D6821482AE20B0A0A80729D397C2454989E4DCB9CF3FB8D3FBCBBE6C0F19C99D8742553379D981555B817F2E76A45BCDE3AF070B6E96C198304E506273396791F5CE915CF228E69535A7077E1F9E57EC26D2958A1BC374B805C31E9F887AAC6F0F527C2B9E052849311CC4E527EB4DD53C005CD4D8BFEFEEF6A343D9B889724198161219F260D42D4F7E96D59E10F6D26D35ADB5921D4B2A74090232C8F29190397C2A3CCF24FF002163AB654CE8787E220F15E38918013126686014012AD417A3F316EBAF55F727B14BD9BC36DDB525521B4A8920EA44EA40F3CE464072A87C5E20A94506A05186B9B823A37121A8D1E56F88FE2197B5B15366214FBC7573F80FD684E95D86B5B22FDCADC1C86B1D3F688F8E7CAAAF3E4EE2FE6002B91777EB98CAA3AC713C5E2D23FD304BD180234A9EB7CE2E54307C36DEB7716D2D869F72E14150901B42949923B2753F2AB3F8687F938B932C1FF700AA0A694EAE699935BC436227ACA666FB1410C9003A8DDE8F95BB691AE5EC70FA7783ED65BDCC72F9D7B10B6D947B086F0C57178ADA0BF6CB6DFF000E4103310A098D3CCD7D0AF835B351253859850E06E9A0B97D2C45B331C5FC64A56E4E29504BD89341C0F3B6763CA3B5789ED2E0DB3B64A7AFAF2CB0D65A4125574E2590001275204C011E9E75EE3C3789365ECED9D2D33A6CB42D08662520EA796AED1C706CA5E2A66FAA5AE639A2921D357CFF005ADA91A3FBD2F6EAD8FD97B97F66B63ADEEB6AB691D516996ED128BDB52E8C802942828827A6BAF9F16F1C7C5FD9F804CE12A7241485070A00F30694D6B9F289DC2786A615552425814900D35DEA368D4EED1AD8EE31ED33BE7BA2BDA67D7B15B2B78AE26ACB0455DE1F88A1854487DB54A01524F4820FC3C57E3BF8E789599F2B0F8A5D94C02C80C5F27CB3EE6B16BC16C192809594A41A312056ACC33A722DCE329ECBEE5B77FB20DA6E1786B78E63EA016BC571665BB8C483BA9525F8E3E29933E43BD79536FF00C4EDB98C9CB32F1338A544827E628EA00ECED7358B3E1F62860771CF10F40039A01F7E228D1976CAF2DAD2CDB65D0AE36C11FD503C4009F7475E102027B0C88AAEA36D6231C8F998A9855354FBC564953D75A677CBC8CC49C0001212C4021BEFD4371A5C0842E3681B40842608F42627A6BE7A6994655178BC22B100A92C49773D684D6A5C7A7187C8C0A52E48734A016167A5AC1D8171D61A0C40DC8F149E12A9CB498819C93AE5FE62A167603112BEA028330FDB27B96F505E1F4B90909DD0C40347B8A934CFD34D63C37103527B020F61F5E9972D2914ED5C66114005AE94352CCFA5FD87857E50C9B3FF006FBEB0ED9BA1C31391981D0CF4CF4927A6B9F4B56CC54A992C63A78057724EA1B335F3CAF1133E6A513B74F604E63306F6CA9A0AB8768BAE1E124E5A723D758F803CBE34DB6C6D2C2CF96654B6DEABB52C5B57FD8D03467E599A9DE48398A3BD19B91FE8E4F696DEE12BC6B66F116AD65376B4B772DBA9C96855A10F40234E22800E42454C78076FAB63ED492B0A665A58823506B466F7A9883DAB800B0A7191737AB68F97172348CEBECD9BC73B6BB0D87AAF9D42715C2D4FDAE2ACAD50B6C36EA99B62B495482A4360898CF3026057D6FF0081BE2F5EDBC1E0E4098A51DD4821DC0343C1C1ABBDF2668E3BB6B67FCB9AB601D4AFA435581ABF106D71A3398DADB6585B414233E9D394768FF55EC9C34B32E5A42AA77479811525A0CB5141B8F7EC8A438A711A414410510414410560D41E460862B695C648227F7FDA7FC72AADC9D958846D6FF309FF0049CD896A0CC7EF3E30E12AFF004F745EB539177B7A77E109780A05464124CF9F3E9973F972922CD8B989561D72C36F100303D5FDEBADE3A7C92B5022BCBF40DE1838CDE36FB6B6548F0D321C4A89CC1CB2F39EFD472269D230389978BF9A15F4B92439AD6BEE96EB1B4A1F2D41CD012E06B959DF96A6F169E3BB3CF63AFBB657A8B6770479A710F5BAC152965C6C89283EE9851907D6A5F68E0656D0C22E44C46F132D40821F22053ABFF6F162C26D64480192833014FD4431605DB514B59F5D390BBCED96C7370FBE1BBBEC45A5B3BB4C5EE9B187DEB69526CF0E52C00B4DEB86196FC57DC096C8D4E4649AF9B7F1B7E10E315B5F13B4E525A4EF2D4285B95B864D51DBD11E10F14C8998144B0C16000A4E85C5F893972BC64EC531469DBC63F95BA8711E1B4ECB64282D2EA12B49491120A4F5F3AF0FF89E51D8D889926602E85148E2DD069DFAC742C1E2062929B97772CEE0D998E86F5E10F7F18AB85788E4A565290A072208196BD62738EDA455490938D4EF21C82F703D1F2A67931D2243FEDFF4FD36353A0A03C0E674CC712E1A749C81CB399E594E79FCFA73AAD6D952F0153BCE34FB0EEFDE911F3B0C50A2925CD9CF0CC77AE5CCBC3A0F1CB3CE791CBACF3EB9EBFA536C0CF5626589801A9B171CCF2B5A9C328752253201567964039A5A1E36F19D4E99F7CB223EFAEB52B2D6A04006835B06AFB6AE42B4817298D183BFBB5FDF37CCDC840824C8CC4E9EBD4F6E644CD4AC9C49481EB6B65DFA529C58CE4D1C0BDE9F7F3EF126CDEB41241041904401033F97CA633315228C61490C6EC286CD6A397D79B5CDA3A6A1CD081C39B69516D224117CDAA08E20349CB5119CC79CE7EB4E3FCE4B80F56B92C6DC0E9CB943338770E01A92EF7AE7D3434E90E91760F2313D33D3B0FF0073DA9DC9C5A580A1275E15A55CB54EBA3011AAF0E4243379F637FC3F387ED3A1690648D753F7CA3BD49499C0B35CE6EC03396CF2E875A886A431208AE60C384852B457C499F9FEF520858A3B1247507367E7EDA34514A6E9F20DEFCE1276E034E14C4981A673D3EF29A426252A39823F5ECD23644BDF4024917E63837B2F0A25D2A12065E47F7A4FE582F7A5EDF88C19605DC3F11F8F75D0C2A1E200100C7A79567712C2A789F6FE4234F941DFB1B9FB7F51E195273D4E7F3AD0A085820D01D687DE543181F4AAB56D3945B778DA8DC2C83CF4E5EA0919F5A4A6CE480451C6B7B3BE6C226F0CA48949A3DEA00AF57AC462D0B920900721CC91D79FED51F35495367EF30E4728426618AD6A21EB5A1ABF7B71F286E0381D25C292DC0084A7946B97DE51AE7484B1B84B92CE2DC1D9E093226C92FBC79B906F4FBF631058DE1F638A214CBEC8532A10414827969397D3D0549C9C60401BC016A55ADCBD5BA67160C163A7482085356A145B36E35A07E3A55F5976EF719B338E3B746D5BB965C7408E04A12DA55C3CA0729EBF1A79FF00714121BE9A56C071E4F4E6747A742D89E319D83DD1366380DFC4D5C3F37F77A46B2621EC8370EDDADD62F8A5B5289095384119CE7EEC4F5E99D657B450522A2BDF3357AB7BE7D6763FC59C2E0D094CC51A001DEFA3D7BE94E30F2C7D929C438CF8D736EB4A0FBE56A25644F972D23E191A6AAC6855986957E1C39E5EA0C9E3BE32E0A7CA32E5BD410F41DAA4F3CEDC6362B633D9EB65F035DBDC780DAEE5B852961283EF01391039C6667B742115CF46E9622C5F869FBA1E51C9B6E78E66638CC32A6A92953B1DE6353570FCCFEA873E3569658682C30829E0425290008C9207FAE9D6A03138B44B9A4A8B819BD6B5AD0F3CDB368A64CC5E231690B98B2AE65D4C4E7534FEAC21EE1AFB6C073C549515FE58823312013991969FB53156225E2C89680429D83655B3D7D2AD4D0D7F152A615956F11C9C963A83C7DEB61EF676F86C86ECF6BB1568B366E61F62B4FE22E3DC2E9B86DC6D3E12841570A8C1D62BA3782F62AE5E225CF56E9485051B937D326D29E71133C94975294F50340E35F7DEFCFEF629F6ABC3F753B27B6F8A61FB3B88ED0EF1768EF880ED9DA8BAB7716DDE3C18F1085070A5285A44E6400790AF69F82BC6F81F0E61A5A6784BA11761906A3915E2FEB5E7BB7F64AF6829C12525DC3BA4E8E3576EA6368D9C2FDA37DA2F13FE77BC8C69DD8ED9FC45616CE0B82DC5D585E30C24884BF6EECA525C4F091C8C9390D281F103E37CE5E3662309885A6539000511FEDC803C433D468F0C703B1918597F2CA522F972D47EDEE1C18DB2D82DCA6C16EEACD0E1C370EC5B106D2957F37C4D969EC4BC4199587C0078A46473AF3178ABE256D2C7159FF226105DC95927851D9EF47EB5112F2F00898A094A149ADDBE9367761620EBD6ED78DCE34965F5B96B7B74A57BA1285B92CC0C824091EE819013CA04E83914FDBB3F1138AE74C5A8135DE24FBEA732F60D3B85D9492005212025DE9AE741DDF3ADA1156D23CE0F7D8B4E28C9C4A7FA82720788C67DA35F854CE071F805247CF92925AEC1C1BBF4D444A4BD88CA13113266ED7E97A11986AD2FC03666B0D5370BB9578AE2CA8AA4EB33197C8683975AAD6D19EA56349C2AB764B80C3EEC776D4CDE99461783F94ADD0000097767D437322FAD6249A6ED9413C62546072CC7D67CFE13562D95890129138953E46CD6E0FDE9E51A2E510E52D56BB9623F2FADC3C78B6C2544344840D04C7E9F0D2AC8B99859B2C83287D4340E3A3BEA1AB9C6C896581FA4645857DE77308159491999FD3EFF007E9558C7E064A945494A5817A8D33A574CEFC214DC2C6B5CB4E2F0A22E0275981D4F799E71150F88C79449560A4D1767B369667BF9718AFE27013264E2A06E5E9F6F60F3B05C5EA0260851D7BCF6F53DA3AD57D5B371F289C44C98A29772378DBAD8B11A3E4CF47F879265202564DAF535D3D8ED9C95A62B6FE33368E5B5C2D170875B52820147BC929053AE401CFA537C3ED9187C74948554298D58B83AD7AE5D03445ED259099891BAE59A976BF96675CA312EEFF1373751BFA7F67710BB6ADB6776E1D4ADB507382DAD956ACF8812B39252A71C54467C4A98CF3AFA77FF004BDE3593825E08E2541481BA0906E3277E2CE6BCAD1CCB6D23E6054C4CB1BE9A25C6B43D1AB5B1A56B1D4EC32E9A36CD80B4A894254983F99244A543A820820F39AFA7F83F1061F1F85978992C10509B35683DDFBC731C5A0FCE59C89A6B76F66CD5E53156186705104144105104144108A8428F9CFC73ADF786E367FB778502C2535CBDDF2D229A6B3524BF166E8DEB942714A913273CF9F2E43A5353F4D48A8EE3BFB31A2D05E82B98B1868E351390F3CE79761A79E9583894804B81467E85AAE6977FDC6A2528107773BB569E768E677F11CDB0C0F07DCC6D1E1D890B773107D36E709B25709BBBCBA43E92836ED932B0CBBC0A5F0E6919F979F3E2C4F9733033904228955DB31968FCBB476BF03E0819067EF2895EE9097A067BF03E7A472EFD94F7E3B59738633B17BD8B7B7C2F1A59745862AB4AD9F16D82CAD84F8CFF00BC4A58F0D10040564328AF953F13766CB99B467AC005D6A3AD09B5BD34B8CBBCEC492C25BEF53270C72A81AE95B51AF1BE7637A875A43ADBE5F6CF170BBC5C41624899C811A11CA32ED541D958444A400774024DEE2ED4BE5FA8BD26480809005402F571A64C694B0B989C6EEC04C0D7427940EB3946703D22AB9E2BD9E89A8580CED7E3477F4B6552222F17860AAB5791A65D2F51FDC546F805646349CC881CFB7FBF5AA7E100C3A0201AB97007134E4DE79BC252E584CBFA921C700FA0E95B707AC3B45F080273D73FD7B7EA741CA45130383E791CB2B7A084A64B241296B8A5B5D2997E9EB0F9ABB0A0924CEBCF9E9A6A7B7FBA7489A1C54B771F815FEE23A6C925C1A0E1EACDEEB687A8BA190904E59C9E646BAFEBA74A7B2D6E1F7806B3963D7D3F55868AC31277999B571CB85EF539DDA241BBA1C2923E1F0C867FBCFA5644C014E1C936A023A5B5E6611128824D9F5D2F461687EDDCE5F9BEFBE79794F5CA9EC99C090D716D43DC53D7F508CC94452A470E9DDBF312B6F78021327AE5273E5A7FBA9A913451E8783E76E3EF50D0D26C81739817BE7C06991E31248BD498D27439E60FA1E7CA2A5513ECCD4B3D1C77D3AC3432C66FD7FA8A16B4B8B9009273CFAC7A74EFD666B2A9E1CD09E34F7D237480031CACDF77E3A43969412224E713DBB4749CFF007AD7E790F4BDE9FB84964166637F7EB0E909073398E5FE7EFE5419CF93721FB86CB98C0B676D7DF1FBC2B5AFCCFF00E6F7D61A9984162F5D2DD33FBF3881BDFF00FB0BF4FA547CE72A249046447DFAFEEF13D842F253C00EAF58897397AFE948C3E979F4FBC377397AFE9442910F73CFEFFEB4411EB6CDB2DA05680A590413009E713F71442A852C00C12D567EBC5E115DB594FE448CB2C81F9E5F4A216DF570F388F73094B8E179A4008511000E913CE338144604C228E09E37AF5F7DA1445BF8060888E7C8F231D873EF44677CB3325B46A5DE195C3216EA960483107D35C872FBCAA1B1D24A86F11ADA84BBDDDBEFC1A24E44D1B9420062E2A03F4C859891D2156ED867967A8E7A89888CF5D341DAA1F08F2E7821AEFA675AB59FEEF0DE74CDE71955CE7C75ABD6343BDBEADF686FB61B67300C21D72D2CB17BFB7B7C49E6D4A6C2DB5DF32D80B52722085100284679F4AECFE1ADA2254B960AB404BD2EE3B72A9882C5A86EA998DB893CB8F95BAEDB6E13D983763BA3D91C1EE5BC399BFC5EE6C2D2F1C75D6997125F7196DE278B841FCEA3CFE3CEDF8DDB72E54B24CC724506F123A720F4D78D22B6B5CE9D34A10909961F7CAA8AAD8A69DCB3F3778CF78A63F6CC214E9B7658B8094A421A484A4250385B006A3DD007D00CCD71BDBF8E189C42A606AD28294B5F53CEB7D21CE1B00508A954D00BBA9CD497356B062FC39B4639BDC7B12C4D6A6DB754941910091F08F2E5DFCEA838E1BE556A963C789E2E6E35B5225A4E0C862D42CC0587BAE6F720521807EE6DE1A714A52D2249CC9839F3FDB23CF5150A6532AC75ABB6AE78FB689AC3E0F7402E920D9854FB2F9BDA3DFC6BA3593F2CBAF3D396835CEA4244BA501B1BE7719FA6A748999787DD4821346E8697B7AC5DB85BA576CD2944E7C53D400A3A0EA0F5EA6293561C99AE1D9C06722AD9E5ABFF00422BB8E4EECD239D0FB6D28E4C5C4C3A32391E93CBE7A8F4CA3BD58307240DDA0B5989D7954B573FB3121C343A99CFAE75341C000E50000504325EA3CBF534CF14CC5ECD5E5F4C6628FBFBF8D5357249C715815715FCF0EBA3EB1B265A58BA5B98D79E7F98F2419CC65AD48ED29DB982292C193471FA61CCBD60549770C082E2CC69D2E215C26FEE9DC41E64320B5625210B293EF78B32674C8FCFCC57199F8829DA454E28B198A07700D5FF004080F5881DA1856A549503571CFBB659D7478C5FED13B2371B41B2831CC19D533B47B3AFDADEA5E68F0BDE125F6DE7405247147828502274E55ED9F81FE269782183056032902A585C020F534FB6747C7E08AB788723EA7A38A70F77B3D6378B707B7B6BBC7DD86CDED8DA5C05B86DFF000772D85494BB645368B2A03FECA6D473CC99F2AFAF5F0EB6AA369787E42C4C0A2A407AD7A8E1D1F23AF24DAB855231AB94414073BA45055CE9D5867AC6CD57A062BD05104144105104141A0274821051924FD690DFFA9812E6AD90CD8FDBBD2352A0FBA7CEDAC794BA405B0362EFD1FF0010A01F533F51C9E1A2AFDA4AD6C702CA9B8E22008CF3C8CE7F7DE9962C7CB04873EE8F5E1E6D95551294B248200701EB9D3F1EE90DD58836A4DC1085245BA14E28AB294A50546328D07330488AAA62B13B8953920A4289198B97BF3D3CD8AE65A9050ECADE20063992DE5DF83C70DFDA0308C53DA3BDA57F97DEBAB6363B6096EA2C6D41294DF2EFADA1C55D20CB6B2CBC9E268A47BA60EBAF8E7E2DF8C932F1589C31994015F4EF3B1008B3DB5FB08EF5E0AC37C8D9F2F7C0DE6AD8BB97626E6A6A1F8F18C3FB47ECDD6D87ED134AB8C47107459B9386BAD3A14E24982A43AA2326C1848098F7644D7807C73B6133B1335654F551777ADC1BF0FD523AF6CC98997BB5A8636A6552CD9B9C890CFC364366F07BFC2708B4B2BB536A7D8441282A28293920E9255C31C5AE7AD72E46DE4CA252179977229DEBCB99D62E122724A4070C33353C1F5EB5E81A2E24F1A44127976FD07EDA74A8DDA1B6538896AFAD2487A3BBD5AC09CA8D946D37FD4FFC7461EFB3B738F0B2E2A1D0A002B91999F211AFD67388AAB9C4BA94AA33DFC9CB1A3C315000D81072FCFA884D771E0E4A24C69C267FC73D7B1E74A2279A90A26D6B31F75AC69B81BF8D356E3AE55890B6BE416D27333ACEBE7039FD9A7A8C4501053C43FB670D952BC631FE3A540BB31E845F36ABC48B77A88E6077313F3F874F853A4CE71424BDD89667FD7B1091C0D281C7176E7D1BCF263128CDD254849139839120C41F879473E94A267310C4BDEB979E6DC5E194CC2906D6E4FD2943AB5B330F9BB94C6B19794FFBE733DCD3C953C13A72B1CAFC1C5FCB268A95914039DBF421F35789809F78F48EBF796524E7533879EC0390DA3F3F400E6C0D2F0D26C87FA5A9C8BE5E63D6B9C48B5700C448EBE7E7F1F873135288C40342486BB1A7BFEA1B2B0DBA93F4853DB5F327F5CE1E22ED2980788EA2674E739E5AF3CEB2B9EC7F950330259ED5E37E1AD2F0CA64920B817C9A9D19FBE6F0EDABC40000E2275D75ED964639FAEB5A0C439FE56737166AE74B65DF46EB9248219AEC452CFA57F6CFA44BB174D142409CE7F365D7B76F8D6558A2C18B1A66D72F91FD00781762B94A62E03E5FAA7A4394BC8509063EFF005F856AA9F675543D01704F17CA9701AF0D8CA5120EEA8B543547A5CF768B7EFDF425F58E6408EF20E7A9D23EF3AD8AF7EC4E4EC4B70A74ADE2C1844BC9045F3ADFDF488972E10391CA7E197DC510F100877CDBDFBF3868BBA41204191FAC511BC34710A767872F3F4FDBD28821C356E80DA78BF3738CBE7F7E7440E0355B480E1E16A8C8039F2D75FBCE32F2A23054407A9CEFE7124C36DB2C2595092999F5D2328D3EC5109B2D4ADE0A2125E84FE2BEF8C475C59A9D27878403D49FF7A7C0E9D688583EBFB6B5BCB288E368A6D5C2AE1319C8F975EBD49CB91ADB13212AC31555DAEC694CDEC4DFCAAF0B0C46EA00722B716377E197DA164A1291A09E754F520CB9C9235AF0D1C3F2E0E2958426621C3024358D3F7C757C9A310FB40EEE0EDE6EDAE1092D0BBB2BAB1BAB22278D28B7BC6DF7818132A4A2044F43578D97354896921541DBEFA6BC223664DDF514545CEF1700F7C99835ABCA32EEC86D17F37D8DC1136CD949366DDB25C7C43893628432EF11131250784822728A4B6A6D39A842920B8B67AF46E8C2199900CC0B0A502FFC41649B0A8F4CBD623B107AD6E5C5E6E2F382A519929C95E920FCAA9B331866A89726E35CEF7E5167C0615E50243F1CEBC8699E67388A6908615C4D0CE79F4FBEB1E94DD52CCE340EF4A5D9CDE85BA5A25E5C80C10121BFF217F6D5ABC2CA40721C580547398CC41E607D018EDD7518204EF29245F8335B2A55DBD1CD17004BFA40492D9FAE7E86AFC63CF01BE9F4F2E9D2B7124203311C68077B6B9C29F315C29CFAE79E7133689E06D0907213CCF53F79C69CB2ADD321D4E41A376CC598D73115DDA65E6D1201AF2341DBDB9A44F5B93A8F21D0CF3F9FD6A670B26A29A92C3D3BDFCA23A24D1A791A7AA4800D1886FC7BEF7821AB90083A0EFF00BFAD4562177702C79585FCA99C108ACC0D0CF2EB974EFD2A0D52809A565BD2B933166CF9C3A4A5CBE432D6FF00DC362E01208206533239FC39F5F86B50BB63103E5290E5D8D7CA96BF1E42D0BA50A5073BA34D7EF15B37EE5AAD2B65290858578E63DF24084441CF339CF2E432AE458C49FF0024AD2186F397B9ADF46074D4E50CF15864A812A033624DB50347B5B2D6B14D9B571892B106AF54971AC4187985A3320A5C6D4DA723AC050991EB39575EF03F88666CD5E1C15EEFD686A961F50F4AB7E1E2AD8CC227EAFA458D8703A52AF90CF568B0FD9331EBCDDA6F276F373B8A5D04E0E8B9B67F669BF10F02BF13C77777E18510930A589E0CC1F39AFAFF00F00BC668C56C0C24B54D752928497232C8BE742F71DDE394EDDC0033D4B523EA0EC5BFAF2D63AEF5F41A394C144105104144105609604E81E086C5414A206467A743A799EDDCD343FF00BC6A0FB8673F878457FC8E56FCFEA3C518498FBCE9F4914E9EA4FE217921C025E9F9311EA6D2975C75510A02644CC40EBF1FD269AE3801289CAA48FC1D783BE74021F8A25290EE6F7677A76E2CE6DC2CFDB4BF1856018D5EB64A549B37CE52238585F4E7979EBD66B98EDC9E5089CC48FA1449E878E59F0A350BC8E090662E525601DD26B424B90731AB5F83691CCCDD4356588AB17DAC712955F5F5E5CA5D5C02A2597DD6D3EF6A0C0CB58E5957CD5F8CBB4272FC47899695AB777D4C0167A1CAE6AF4E7725E3B8787E684609296C870ABD331703A8222F5C470DB7C495F895B214E2566094CC4188EBF4CA72EBE57F11E1E74F4AD6497A972795EADA67D62E586C604B7D4CCD98AB57ED61ABEB0DDFC1028173878652204690398CBEFB5719DA089D2A6299C313AB54F1274C998F08B2E17690A00A532A8EED40D634FD45B17964193040100F4E5DFEBA76EED70F2E6CE35A825F8FB2F406DCA827E562C2C0726BC7866FEDAA62354BE06C27A75F4CC0EBE7DB3E55ACF0A92B292F562C03D40ECE33F485400B5125C0A7A33F4881BC7413CA679F4FBE7977CE45665CD63987B81E4783F1D0BDA1CCB96EA029BBA9B5AFF9FBC356AF3812124E63F7D4F5F334F11345DD8E9996F5E196A61DA70E0B101DF3D32CADDC3DE8F0FDBBD0AFCCA811A93F300E59C098CFB9D69DCB98406714B17FD8B37BCDC9C28091BA05726FB5B958359A82262DAF416D2388F38CF3991C81EB3F38EA326794B3392EC4EBC49776E3DE223172B72636E8A52835F4E36E3122DDF640A8E5A139E44C67CBEE29FC99CC41C8DA9CC6AD5E1E511D324850702A323FD39E50E917C018E2CB9EB23319EA6A630F3892C72ABE5CF5F6EEF0CD72B781A116C980CA262DEFB2199E5AF78FA8CA474A939739E9F503E6071AEACCF943654B20B338399B7A7DA1637C028C100E53999F4C8C4E7D7AD0B985C392F5B7DEBEFBC64E0C285535EBA51EEF91BBF1061D377C081EF721A93FA7D6739D2693336F550A8ABF2BD7A7286D3304E480917A86B7603D4D75CA45AC440481C5A6B9E539763F31FE76F9F5B06F3ECFF7867336706074ECDCFCBD987EDE240089F8931E79447DEBCB22702CD57FF8F0C8DFF3C4086EAC00161D48A7EBAD32CE185D3E1C714BE67498CBAF79CFE7CF9C8C82E9F7DB4CF81E79292E58969DD1D6235C744E7F7E67A9FBEEBC291EB69E3015966796BE9E7E74410ED0D1CB98FB39988CBEFB9042A4418A21BA955739F97EA1CA3F30F5FA1A235F9838D32F6605FE63E9F4144642C6448F2FD4534463E6F151F7CE105B3C6A2A024E4797974D7F7E666A41697C29A3B8A9D397E6ACCD0D5734905CB0CAAD4BB77F79C79F86FF00C7D23FC7DF5AA74D40F9E684D49715E9F807C9E35130A894B8C9ABCADA583FE690A8B14DEDBBF6AECA982CB8953660825685465A183F09CAAD1B3641296C886E4DEDCDEAF7AC6AE5F526952EF97703CE30CEC4E38DD95EED1EC6A8F05C6CF3ADF829D14A17CB53878473C959F6A63B5F0CB014F6BD3DE95A178D92927871EB945E7F855B1FD3590A503C52733EFF00BDDF406A80B5FCB9C47F17E87DFB348B66CEFA64241CA84B71A574D32E791E1764FC3FC54CE1415B31622A479BE61AB4CFD0C86F8073705A90A04802201F4A9712A868321F904B5FAC60CC466A0F7ADFCE00848E533D62994D9612FA1D453D83EC504682725CEF100017CBD7D9F29063F2A2639C41C8EBAFD08EB4EB0F237D20DDD89A56BF815B31ED1018C98664E5682DD7A0313D6DCBCB4E833E8627976D2A664C90801C574EE0D087AF38690F0B9C23873D351D67F6CBE149E24356CFE6037DCBC10C9C7323973FD797A49FF5355EC49604D33FB7BFC410DD4E8EA66633F8F7FDAA2A79694559B2892D9BD2DC5A0FF2025410E6F52E5FB701C74EAD5C7233275EF33AE79C7D39552368CE2A252EE1CF50ED7ABE46F0FE54F490C7DD6F7B71B7DA85105B047AF4D4663AFD63D2ABCAD9C66FD6CF9E55604E4281D9CB5E9CB49CB1BA4920BB3035035234D49BD32CA6F04FF953E71F08F9FF00AE5580A5E0D48209494A833508ABE5E5C1AD15DC496DE21D4E7E902E336D3AF9346A6FB495CE2BBB9DE26C0EF5F034ADBB7C26FC338F968101D45EBACDAB25DE18E2090B2654401A7427E82FFD3DF8C97270D8390A9845500D7FF21DFD98A2ED8C37CCDF3A822D62416D73D1F32F947786BEDF479FE0A20828820A2082B04382350D0423E17BD20FC7BFA521F24EFEFBEA18FAD3DEB09A90492411580B64822467E7FB5390BDDDE24528CDC183DF8F0B7185659DD0C47B73F6310F7E16A6DD436616D14024E878950207FAD79C0A678D5FCC945097048CE8CE5B2357FB71877267A10BDE5B9B51BD72A458DB75875C5DECB6376DC4853AE61D74A46A724DBB8A39C4FA0F2F3E79B5F63E23132E7310C50B26A43063D4D1A85A99449E1F1D2654C4AD2183B119124B0E0E0F91E71CC7DC03CDB78662D6B700B86CB10BB45C30982E33E2DE3A10A713FDA15C8F31074135F32FE366097B3FC49893313BC42D5E635AB3EBE6CE4759D838C97330882924067EBF8E71B14E58DAB0FA2DB80C3852A4AC0050A044FBB9004A4644472CC579A76A6D5C2CC2A925237AA0D85EDF7BDEC0DA2D322715A4A81293902F6B56D434A5BCC45388336E0A9B42488033CBA7F831975CBAD4713E1DFF00B8952E58649ABB55BDFE844CE0D730A52B529DC9601C677FCB77D31BE3764A3C4A052224C73044E9F5D7302321155BC4E1E4EC452BE724109D450BD0655AF0D38C5C301342C01F507FF769970D39B73118DEF1F0CAD6D282894C024091FEB9FE99CD53F1B8A463310664A1BA1CB3160CC464387BB0B4C895BE9DE01C3E59F3E16CF567310370AE324E639E7E83989E5FA69AA2896A772483AD7D93E50F25C95381666636B0AFBCF867185B738894A81132333EA0F7FA75269E4A965C1736CED5CF3BD80FD987F2A5D1B93D7304DB8BF68593C7FDC72E93CFB7CFF6A7299643D546B93FBF5F387E84B07D4797BE9A4485BDC708824FBA3B9D7D7EFAD2C990A507DF23AF5D38F11D1A22717277E61666B55F83D439F489469D2B88240E84FEDE5CF97C9E4A429000FE4033387CEB71AFBBC46AF0E6AC017D0575191BEB0F1B5AE75240EE7FCF4F49EC2A4A4952581CF9BB072D7F2CBD192F0C5D8BA6DAD7DD0F0C8E92F6EA591AFC7FC6911D27D2A5252C30A87A3D6FC03D6D4B521AAE42F7EC00193776B663B8BC39257248574CA4FCFCBCE7E94AB2D44AFD1DC9D7A37EF285D32C0480454660DEA2FE74ED0B0714343F7DF38AD0DAC08CC1F7F68D572C2ACC3EDCA86164DCAC0E73D79FD72F81D3CE912B50140E732F5EE7EDFDE9FE383763CCFE0085917BC3C8F2FBC8E83CBBF334899DBAC2C43BEB93035D350D784578601CD0835A0FD71E10F5ABB42D299E2988D3A73CF954DE17100A035F314278BD7D1A9D622E761F754D501DDCB8BE56BB5FA457E1970FBAA10399C819FD75FB9A72678D5BB76BFEF8C246436BE9DA9F8891B76F85213AA87EBD33FF005F183FC814FBB57CC7BBBC24A400D56E7D7417A5A251A64902018E53E7F4CFB0AC89FA8FD757D783C375CC4A417E36FB711083EDA90E28149F203B0CBA65F79E547CF72CCDCF2E758899D8D42565390D6F09FE2380C9428913901E87AF5A772D3BE01D74CB57F7EA23418C41661424F1FBFE383C02E02D51C0A493FF006FF5DBA7952FFE31DD7ABE999F2BB369F78748585B0B12F7B7DE1DA1A52E22339F9524A94437DF3E4C215DD6FE4F5B337DFDFD9EA1809480A20913A41E87FD7FB9DD58A4A257CB2EC5DC5B577EF91A68623E7255BCC0B0F798E87DD28586D133FA75EB3CB9F2390CAA1BE519B38A85002087676E2C3FA2337AEA90C039248776F2A97CF3F21482CA6CAE8DEDC00BB27213E1A3374920A678498804C933A0F302D3B3D69414A480C5C16C88033073CEFD291A4D5AD52CA65969818825DEEFE63B738D24DBEDB9C0377DED43B33835F3FC09DE2FE2835C0A486D2AC3ED429297E620CA804EB988E8697C66CF998B973264B49284B6F100D09B7986AF28565624EE21DC29EC431A5E9CF8756AC6D25DAD0D043AEBAD2D4E0E24A50A95709CD32239A4F7CF9F3AE678FD913118A2681CB90470CACCFDEDC4C5A701894996135B0EAEECD5A8EFC018669BA64F17BA470827DE033D7439CFE952182C27CB29DE5001AE4B00D6AE9A30E62D12C10660040234CAF47D1B5D3BC3138A32501C436EAE54470240E210634FBEF15253664B427743161C0F2AFBE1902A9C028D4A9406AEDD731D61C33749791C7E1B8D8E8E260EBDA6A0F138A4A7FDAEC6C050F0B5ADF624C36560940D161455672EC03D7AFBA449D9BA16522149CF22AD3C869DFCB4D69FE071682907779BF17FCF688D9F832164A957B36A19F5A56F9F289F69D6DB4F115A4F380738CE7EB91F954F4B99BC90ADD773A39F57F7C5A18AA510696199B7714FDEB0E53C2FB7E236EA013AB64FF504728F4FF3AD23889732623E942BE907CDAE2BA5883CA90D953128594281E7979B7BEACD16D393EF24A0680AF248D39E9F7D6ABB8AC36254584A5B1E05AE19F8D3B5612389402DBC003627D7FB0DE6611530A0A212B43875F70CE7AFCB9C7A659D456270D8A5A0A132261CA8836CEFC1AE7CE3230867B4C133753715A7076E5E9788FB9429912E10913A9C819E7E9CFA4D55A7EC4C74C98E30F38392EE93577B8A802DE54021CA6589742B0C9E3A59A9EF9C38B6426E5A406DD6C83202A72272E7E9EBF0A5E56C6C52505270D3778D2893DB8BFBAC213E724024AC07C89146D3A8725F95E2EDC1F09750B0A2EB5CA73EDF64FAC9CAA2B1DE1BC7E20B891343116496350CD42F5D7FA82C4E20027EA0A73FED6D5A96D4D3FB8B6F7C1BBFB4DB6D8AC5B087956A0AAD977AE2EE2238AC10AB96F8091AF13606712623335DEBE11A71FB1F13864CC9733712B41208E233CA95D32A8885C60F99254776956A57335B90CD901DE3A7F5FA248F3641441051041441051041441056ABFE27A7A882193EDA65797FC8524C8FFAC1EBD7A7AC9A6337FDCFC3D4379460F0152439FCDB2E3C9A22311B5172EA6DD79B2FB2FB6E03D16D9466398F7B3EB4CA700A95301762936E51906BC88E5F9F28E4818DCFFB4D6D5EC662292D605B7EF32BC1D6E7BACA1766C179DF0C9F7412E2B329933A8D4D7CFDF8EDE145E336962B13B942546D900C2BC29C9BB751F0F4E57F8682972D47009CDF96B4A5D9E3688DC5AA516CDA96953B61C456B541E20F105B20F4E129D7B467957CF4F15ECF3B3F1CBFA4277546ACCF5E6E5AEDA5EF5B8E1674C04925442B22FCA9CD8BB80DAC33B94A16F39CD27848F513F0A4F66ED02256EEF55B95B8BFA16D22CF849E7752924B55B2A1E2EFF63DA2C8DA048085102241FBFDFAD527C5A83890B533F27AF17B39E5578B161B1664EEDCE64E57D491E6F4D2310DF31C6FAD406A731969DF239CF49CFBD50F0F8764B171C7F5EFD04742D9988F99870ADE3567626E5B566A56E395A229CB52675075CF2F49EF3F5CA9F210ED635A119717A3F5E59C4BA660480A772FC185756FBF0A0864A678544427D7A67D2453C9729DB2CEF7A57D294E5AC3B97352D40C0B683576D7CA29F0BB27EFD29EA25B5198E65ADE97872165550A3DFDFE22B4359E83D34F5CA94F9645037BE548673D637D8DC69C75B57FACA262DDACB4F86BCF4D7F7D4F3A70843007B7ABFBF5864B5B3EA7ECD7AC390214B1D08D3D69CA406043977A8A80C7EEDEA1E192CBA8D5F4CF2896B6E5F7FF006A7D2D0C904DEEC3BD61AAD63789A97F76C9EF0F29E243243FBAC60170F0526BFE47DE519829B1A13CCC1053199FCD5CE0855B742541249044E7CB49FDBE039E54B4B9E515A002F5AF419817BEBD5BCD92958AD40A8D47937189961C491131FBCF5D233CFF004A9097377F3A6751A52BD3CE2371092806AED6E00E67ED6E222E9B0B42EB285C4CF4E601EBDE239FEF272249981296724D1F2A9AF3FC1C8C40E2715B856E5865ABB726157AF9C4FB162604A7A1CA472063D7EA7BD490C0934DD069907CB835B5D2B77020E763807482EEED50E2AEEE69C69AD844B23096D684AD60151C8F5CB9E79FC63BE7AC7CD93F2E69435F30DA3B7E3AB06110F366898B726996ACCFE8CE7AF086AE60CCE5EEF6E5D27D0CE5FEAA5B0E96003529EA6BF9E3485253D1C9AB9ABE9FA7885B8C3421F52909F76004C0EDDE7A7CE9FABE9431CDF7BD6E3366F3D22770F301483C18EB9559BBB79C3450F0647965988C867F4E9CA34A8A9F340A02ECE031AE4FCABF7BBC48865243D7F3CFEFA455E3712667D0647EFCBA9E548FC9F992CCC203F70C3BDC7A738653D20ABE9CB8BDDB9FB162EF0D9C741CB2806013A1FDF4A889D3C492524B35F76FF8E57A563544A2A06EFD5AFC32D7A5A1CB0B6EE91E0A9400642811944AA639E7C8C771CAAC9B1569C64C4246EDEB93B8E635E3530AAE40975DD2EB66A529D01CB8C7CC77F14CDF9E27BB9F69CD81BFC2EFD617B118B205CF86E194B589AEDD242A22006E467CA7B477DF0B786938FC0E2F086582B9E84AA5AC8000DC054412C58E90EA5ECDF981134A084E8433F3C9DED51C23BADBABDAAB6DE8EEBB65F783865DA2E19C470AB452836BE21E236C32873249227881273D7BEBC3FC73B226ECBDA139003142883A79778929527E54C1282482681EC5B4E2332D4E4F192090EE182E90402252AD44C1E13D3420FC338AE4D8EDB0AC3120120A6843BBE4FABBE5DA26A44D32D5BAA72E29720357F41B37B88696D6A9504BCB2A434A909520C75060F98EF9FC9BE0B6A2B1AB4A12B2497CC16E9E553D21CCDC6EE4B2CA049B05337170F4F2B4480B1B8B53F8AB4745C253EF78774A2B4FC04F5F98EE2BA1ECAF0CCEDA094CC082ACD88705CE74EFAE4E5A20B15B551BAA4EF096A3729A372CABDCD6E6E9BFB5FB376AD78B8E5F5AE10FA5243BC4EA18B64C12014851CA4013AC98EF13E9F066293382132949723F8A481E9C34E4F1569BB6D3281419AA5EE9242965D44939B73A35338B77FF0077B77CD2D4D5AE28DE3CE03019C1DE6AE5E39CC7083A9CC0D64D744D85F0FB153F70190A24B0FE3DB9F3E111D37C409208DF14ADF5D756FB5ACD01886F796BB95A3677775BC3BB7CF086DDFE55C76AB3191050734FCA39E75D5F66FC1D9D88097C37F201C14126B6A31A0EA5A910F88DBE92A7DF0791C8D296CFECD488C5ED17B4A6D09E1C03774FDB30ACD0717C2AE90424E93C32272CFAE7356D93FF004FD3310949FF0012EC7F8137E9D9C6778889DE25912D442E72535A396B86A9A5BD9AD5EA775DED7F8BDAA2FD8676570E75F9E2B47137CD38D41812D819150CC6798AB76CFF00FA6DC2CC94F370690B0CE4A0022D67193B75B8A3B997E324225309A9292285DC16E2F51D351530DEDBD987DAF76956538A6D36CCE1ED4C7B9777AD40503966201D34D7AD3FFF00D9AB03BC01C1CB482D532C7FFAD5C3F5F26589F1B2508514ACAC8FF6A4BBF4773C47DC45FF0084FB126FC5BB768DDEF0E2E332E0B3C56E3F0F9CC16E53232D7F5CAB63FF004CF8100B616496ABEE25B90FA6BA655D33819BE37132BBD3522B42C08D2E696B5ACF998BBED7D8EB7CCC883BC6BA911A628FE79C83F9479721DF5AC7FECD18225BFC29433ACB19016A1AE79E5C1E317E2E249AA8825EFF0082CFF9EA6D6C4BD8B77DF89626F0777A37EDD884F86EB2318B808536EA7856387860852499D35E82ACBB13FE9B64C85A66A30B2928490412802D95B80FC55A1F7FEAC4AB0E874CC515BD80B87BFEB9DDE3AFB5EEA8E530510414410510414410510415AAFF0089E9EA2086B7124122252329EFF3FBF8B19BFEEE9F682231C5388B76C28053CA2785799004F3233CC72E94CE6BEE299AC6FEF568C8B87D6388FF00C52F7ABB3BBBEDAADD6B96AC5D39B6CBBDBAFC2BD6012432D8758FC42AE543FA890599E18E8794D79B3E2CE1B0AAC3CFDF03E66EA892C1F5CF4E9D5ABD9FC15B2E6E2704A9CC0C93BBF281077854EF026D5398E7AC65CDDEEF16C36EB6630CC6F0AB8FC4A95676DFCCD09585B81C4B484E406842C2B881CC19915F2DBE2761D29C7CF12C06DF351C4D45299E95BE51D065EC6DD5268F7BDEADE7622DADAD95FF009EB0D5B25F752E7094E6A104242722147411967AEA7ACF32D9B2267D34AB9CAEFF006F47B189991B294E027701A3839F6E3EB5D22C8C476B306C41F559DBDD34B7F4E04AD255C51A44833F18D09A4F6CE0B7904A810C0966A1FC37BD625E46CC57FBC2695041E5ED985E2DFB9B55A417142352126263B8E91A76D73C8D2578620B252284D142A75B8E00F23163C12C4A40402C2C374D388ABF0AFB10E4B6E15240854C72CF3F972EDCAB797870186EF30453830E1C1F8C49A2752A5F997E3C85EDAD6193D6F0E2840032D4769FAF96BE74F65C9DE4D1249A01981CE8DC8F387889E08A966E37AB52A1FA7F690B73CF847A034E938726C03EA5DCF973B08748C4351C97CEA416D0B8E7A7185516AB1052011DB9FEB97C8D60CB656E903B38AFE5B85A109CB04EF6F73D5FA72F6D4906D250334EBD35C8E91918EDDB48AD9282E1D8F0BBFBA43652BE92A0687337E9E77E25E160C29C25620054403AE5391D3CA9FC990017501C9A834CAFD290C674DDD0C286CD9BF11A0D3D6D0F5A49447167D87AF5E84D3A4A2B5AE9FD4332B2471CCFA43D4A4A9214220FC72CAB785E5AC04805DF5EBDE91413026915FF0023D3D042D14F18EFF7EB4D8DF3772FDF2820E34F7A6333F9AB9C10DCAD5F886D0028F8AA30672000CF8BA65E9F11496EA8AC685CDE9419F514EF1B9004B51A029A134715F3D22E8B0B65BE0F014FBA7324E5EF699F3FBCF5A90C2A14A50487617239BF60F5EED15ADA53D32D248CC540671CE8733195306C25E6EC99E25227DE397427AC7FAEA60D5BF67CA2C97A91600D07EDC76D68DCFB1D8F24AAAD90E19BB7A718B81AB55208E2E123E711967AEBF4AB3C99296714D5A9A8F36AD44434CC4A8B3E6ECC752097FEA1E1B67D49050501267224E711F7CB954262E48FF20B00C097A0CC163E8FAD6B09A66282805D9D8101F5CEFA72CE18BCCBC38812920EB1DF58F2E7D0C75C95932E9A6BAE7EB125266924390C2D50F415E86D119728096CF101C40667D632CA7BF3F5ADB10B094901ECFE97E0C6BC0F0892933095259C02406B5BCF5E5C1A2CEC4042A412069976C81D33F3FD0D5771130826CCF400D6FAB53A69C226654C06854406E9C8F319D43C44A6FDA6DF6AC940F88E85A92A3F97DC049063AC65F5D6A730E12AC0B9DD7637A9E47953D3842CB93BDF58766CBA926AE7DB5EED98C41ABB75E690140B0A09254323248047C33D34AE6FB5E62C4F5A52400F91625EFDAA2D47AC3B9528001D2406CDB4A75CBD28C621F1EC64E03678BE24B2536F8759BCF5C70FE672195AD01BD24A4A7DE274F4136AF07625B132C2D4FF005076342E685FB6BC8343D421139280DF5289DD24000006B5C9DB99CB26F8AAF6EBDB4BCDF06FFF007838A9755F84FC420308B852BC40BB36D4942923300F1B6082328AF6EF808C8FF1E4AD4582836F5890C7798926E07763589D932E504EEB0A52845D801CEB7CEBD23B37FC15F7CB8CED86E6AFB777B417EAB9BBD902B656971D52816EEAE1D2C8682C9221B48072E523491CE7E29EC1C2E2B6962276113FE8A80202D8A8A825CBF026C29C4B52313E5032BE61037D2A0CC03873EFD873D8B6AE1413738580A0A6D633232214A2A11A99EC34AF17F8B3654CC3CE58DD206F1A686D53AFEAF0AAE58090B60481FEDCF5D1EE6BDE13C5EFF196703C51BC0ACDBFE6584301C4A31042BC2BB2B495816BC32A594C7BC32CC8D75A6DE12D98B998B96ECCE9705DEB40D6D056D4269159DA139482400A21408DE4B306C89FBC6BCEEB5BDFAEFD715C4B0D5DF60BB2F6D62F29B76CD2EDC59E24B4F12802DB79CE499131911CABDE5F0D7C2523132646F212B2424071C017ADB3E0383C5036BE38E1A5AE62C929059DEBF51005C9CF8E71B8BB27EC2FB3B89B76F8A6D9ED7ED1E297AE2C9B9B07AF90F5982930021A7133C2A2339D743AD7A67667C1D938D08C40908292C689B934E3C3DB18E6BB4F6EA913968485D0515FED2E1D835CD6B9BD2367765FD99F74DB1CEB16D866C761EBB929917AED833C4484CCA9C0264E7399931D44753D83F086448521F0EE035D2185726D397EABE76F621614B52D2056809DE1C6ED52FC79659CF0CD8AC0B0D65B0C61564D38DE9E1B290948E5A0CBD79FC2BAEEC9F0260F0A9015252E007DE48C8532E178869DB56729759C5292ECCAC83BB87B7AF089D18724A4B72584447F408491D00D3BFA73AB6C9D818294001290198064836CEDAE54D4B988C9BB4C12CA56F914FA9CF5D32C8D3BC7AC614CDBA83BE33CEA89FF00F6AA67CC67E5FEE2909B83968594CA410336D45AB972FC42C3173152C268126A00C859868E21FA909223810465A8F39E823427CA915E1C9AFCB7A55DB203ABD3DB984CAD4EE951A8ABFA694EBCE17693C08E1002626001909E9FA8EB5812D219D0464E406A6B7E9AF184D454413FEE3ECFBBF584D4DB866081D3F5FB3D7E3B7CB4A88FA7300903234A9E3DE19AA54D2E778EE8AB3B1A7BA65DA18BD64B716D289013EF78C53F98FF00D6391E433E5E662D1853265482C9A32775C060D77F366D7842D2F18A928092E487A1B8E219D896E55346789EA46310510414410510414410510415AAFF0089E9EA2086970471251FF79F8A472FBFDA98CDFF00774F3682239E50532FCC715BB657DC0009FF007F6299CD2D2D674493025DC3B5C5B9F1EC3F6C3807BCFDDF2F7D7EDB7B518DE3A97719D98D83532D7F2CB9FEBD9B6AC4AC4B40B6CAA5293E280A3FF909D419F137C6AF14A70B8AC4614AC823783386B1D1ECCDFBBFA3FC1189972363CB4B805AD402EE4906ADA64FA3455B57BA8DE46C0E23885C6EA4AD9B7B3522E1581A83C1A7D025C0D22D99038E402003919F8FCF2F1763063F1F34BEF6F2CD2F57A357F74ABB45E13B430CC085A083BC1DC528D4E2FC5FCDA9D99DA9F69EDF0D862F82DC6C4B7B1F6CD2516E9BD770FBBB274F00285B8870120F1147171644C8275AD363EC733A585897401E81AF9FE6BA662A61F68E0F07BA9993F794B2774CD507357A13CF2E91963769B92C6B6230C38A6D3631758AE36A70AD4871F53CDA55E21C805C2C08239CF789A8BF116004996BB16A65462D7C9BBDE8F58954ED992A2109A519E8C5C6473F224114CCE60BF4BAEDBF1BE84B6E70C14A072190813398D67227E7CC66A01986F760070A6638E5911AC3DC34E48427754A50A9BBD0F1B3D6E3F5169B6D7F54C8124E51209D7A99EC738AD928208FA41E14CE9FBA7AC3D97354A2EF50C5BF23B7A8872F5B4AC98D6232FD60FDCD3F9325C5807A923ADF2F7CE1E89EC5BEAB5C56B736FB0A425F85EDF2FF00FE4D3912C3B96E82ADCF28792E6D01766C9DAE3C8F0CA1C22D55C2397CBA763D64F4D05349D2885BD0699655E7DBAC60CC4851049232A8CEF7F64E96854DA280399F847E95B4B95BA5CDF2ABB72F7A9A420B9A6C1BA1F5D7CA1C36C10800EA3969FA7ED34F522828C746FB4315A8B924BF2FEFEF48AFC0EFF3FF0014E25A094824004703EACFFA221BAA687D1AD7CF979D042C84F0A427A4FCC93492BF91F7943D45520FBBC375FE53E9F514DD7FC8F4F410EA11A6CAB9E67D608298CCFE6AE704327314B4B7B945B38A48B8585A5906388983300E663B4763AC4961F0A66201670D76E26E5A8789A0E2F0DF133D32D0A1BC58EA6EDC3EF78BDB656DEE4DAB9E28595A9692041260AC11944E635CE0F6A929185DD50200BE966C8356C598B5E968E79B6B68B0500482C43F77E347A072285DE33BDAB45AB76904442465A119099F53CAA7E47D1BA416CB466B79DF2ED1CF66628AE6106A4A9989E3ECD4085C9813F2EB53327115634D06BC2F56A97F4891932B7C0DE0FA021FEFC3830B887CDE6CA08C8906077EBF1FD32A6F352262C9157B51F953BBE9084E64CD2906CC468EC096F271CF488EB911247F8CE073EA273D73ED584A08A873AB0A67F91ECD1590B3BD514E1AB54FBEB10576725CCC4465CC41FBF3F8534C67D20BE6E3D07A889A90BAA493FC5E838EBC05F5AC59D7C499E433CB94683D4E507FD554B1AA62483C4D6C497FC8112B2945D24D5CD46B58C15BD0DA74ECA2B09BF52F8038E96A6624BAE25B83A4FE61CF3CA7954A61B1891830924D4103880F56B0CF21CE2D9819489B2DF7492DD32F315B74317BE1CEA5B63F1474B86EDDD0A3FF009A52AD4CEB320E939F9543694933662940E74E3C0F4C83D21499282544E45DBD1D9BB5F5E30AE2CCE138D377982E22A5A19C4592CB8B948042D0A4E5C4623DE396B9EBD5DEC7C47F87392B3A82E2F43ADFBD7BC3254D9921237777792E6BCEC39DFDB8E72ED4FF000B7DD16D66D5E298E0B92A77135ADD5A7899D5695183EE480788EB333A4E55DF7C39E3C184972E509E400000EAA076167F4FC46A36B848DE2EE0B1029997A598D6B9000B0CF9AF87DCE0DFC3CBDA9B6B764307BA2F6178F5CE18866C50B4A8FBACA4A816925293EF3B23203E157FC76D71B63672B1213F313291F5CC4FD5FC9DB78F90CF3E1166D9D3938C9414A3F4AC58B034D327AEA03738EEA6C5ED939B7F81E17B476166BB4188B2DB854A6FC39F7539C82275D395797BC6EA94A9D34B3073609A5E8CDA9BF7687DF291293BA15605B78FD5516EC4339E7AC648462372D5E165F6C2DCB64A4359122EBC44C2C1FF00BF00C8467E99554BC398E9585C6CB4A887DFC9812E68EF5A7BA44162F0895A14B4A4B170C4684D40B7DAFCA2C3C69FC736336A6C76D764AD0B4FA9D4AB14B1610A090D88412A691D51C4A12635F4F6CFC39F1961F0A8C3A77C02371AAD987E15FD8E341DA9B344D1312B4A54820D161C1BB16ABB1AE7C23A61BACDBAC076FF006558C5F0FB86BF98786D0BAB60B4788DBC984AC29092482A5856A79F6AFA6BF0CB6B6CFDA1B0A4E20EE1514A5CD08AB371CB36B5737E09E20913B0D8F3200795F5329AA033B1C8B74A335A336D9BD70F34D2DC6D293C2A0490414F0E4338E63EB1CABADE1E7618A3E86049B00199FD05FA031569A908DE0E09241BD6EFF9F6D1236E14B68294482641CF9490397A7CBAD3933124FD3514B446E2012694F633E3F68F1693A491DFAFDF9D369AB510C0916B58DB8D5B8F7A088E54B2E6BDCD7D214524FBA00CE0FE9D7CE95972D3BA3786F1D4D49CBD479F3894C3CC9611BAA351976E514F0A872FD7E95BFCB47FC476873F32528DEBCC57B9F48F0156A01E9A4E9F1158F952BFE09EC232F2FF00E447323ECF154AFF00F2F851F265FF00C13DA31FE987216FA073F7A7A47A41E11A73264FAE7F1E7CFC8D44E30CF4129964849B0141C853AFA110D664A04BB528F4A060D4E3CF5EEF2A4A330510414410510414410525F346F6EB1F7F76AE9C608F098127956E7EA4D33D79C10CEE13EFB5713EE3721439FBD9081E7AD359B294C585FECDEFD3382216F3FA0CE30EA892916370E003586EDD6A503DF281DFA5466255BB2A627FDC50BF43D2364075241B150B73A5FA472A372F7D69B4DBC6DEB5F1B0368CDDDEDA072F52D06EEDD368B7529F19CCF8A0A21327F29AF9A7F1E70B8A9FB7F13B8B213BCA60E6943F7D28C23B278713393B39265A8540606BDC7B6EE23653F9433785CC58B858B8414A0149E12E04C2071E5272034823977F1C6D0C1CC93882B9877B7555AB9BF2D687ED5116057CD9450877DE04B582732696E022B76C2F1A2A53178F31C6078ADB4E292DA80038613CF5939913234322CFB276C48C3C912E83E96233F3CE9CEB1B842A784AD602CCB3F4BD59E9467FC660BC327180E366DEE5A696D907FADC32F4F33C46739D7CB2CE6AB5E23DA32F13F3371218D2D4E24B52A6BD75787A84E2490A0B395892C45079675CE8E231DE3584C3AEB76EB25B0014970FBFEA4469CB98CAB9FA702A9BF586152C34737E072EF170D9B8A526484CC724D88A695E009F6CF161BB62E5BB854E70100C426675331D065AF6D7232A0C0947D4A0EF974C9FA92FCB48B0C89A16414921C3DF81197BD0985525B500A854C4729ED9F91F2F9D2BF2CA064C3BFA0896952C901414F7BD7CC73FB410DF43F015B25612DF4B9AD6872A3FB685144A033960D416E0D685836952530400064244FAE46905CBDE53D1858396F4B7B31877ABBF1850201D483E46B2943172DC2355390C3AF28A0A903224C8D634F4A581000A026BCC0E3EED0D56EFBB964D9B7AFF0051E05A39854FA476EFE797A56E2790C1879F330D57FC8FBC8452563903EBF7F7D4F30A029D4FA7E3FBAC494921494A7302BD3DF0786EB39475FD08A67301770D5D780FEBCE1E478D34B796A6D00929FCC6321D3BE7A691396B48250A5D69535FBFB2D094D9A9942B736E9091212EA9B70F841295A94E2F242781254428F2240CBAD653B3A64D5E75209ECE40FBD435E9947CDDA6896EE199DDC76ABF38C0EC398C6DBEF430C6B016DD461D83DC2C5EBCE85062E02C40F00A642A083C53CF95593058612E504AB87F63234198B1BC57F1FB553312A4A6EC5B8532AD33BDB578DFCC330765BBA60A4250D969B0B6FF00B8A92D804C72958273C8EB5226407253FEE6F629EEA1A2878D54C9B2D4564935B59AADD80BD2FC22EB7D3C2E148C8240CBD3CFE3D6B7F94B0C1A9CC96D32310B2B045453343DF4D0DF23EF330CDC4A95319CC46B94452E994A4B39A6A1C1CF3FEA9133280400E0E6F4AE62D7E3D6251949F051A640CE7D634EFF00AD3A4495302492F9BD8E61EFDB5BC47CF46F4D2CE0EA3F35D1A22EE96912241CE08E7E9A1E5DBB8AC4C589798A3DAB6D2DF885A4A0A540105DDED4D0FEBF316FE26F22D98F19638D2B07DD466A11AFD75EFCB2150D8C9A54F50F561E879BD4F0CA25A44B24A83170DC882F6D695CAD163DE5EB0B4832532600244F2898F2922797C6A78B49528872378DEA1AA0E6FD386994BCA410AA82D421813A9FDE87AC692FB5D6309B6B5D8EC259722F716BF49B6208E1E162ED953BC4467F9721DFD6A5A5ECF9A8C1266BFD206F1BEB47A53339DAE22E1B2E7265A260291F500C4F3B3836AF1ED7D9CB6291B3D67C4485B56160544FE551F05A2634E608131CA44D57A74C0B5996DF55452F9BDEBD472AC667ACB9600825C11C6AD9674666A56977C87DBBA6987FC2B6E063842CAC0F155C442473839CFA18D4D4263F19FE1B38600936626BAB0F5883C4052D4A3BC72A3D052B5BE7179A509C3D1F8F425A9F08AF879A5294492A19408CFCA62622A5BC3A9C5EDA9D2E561D4A495AC0A920D1474A1E5F7262255226294523799E86AD7CB857EDC63E5EFDA3C6C46F5FF8945ED85EE2B6D8B2EC6E6DD6EE1D66FB6FF82A670F4AC05347F292519E998E5AD7AE767F85B6DECDF074C33004C9C4CB054B5056F9DC538DD2455B3AD8D23A6F86B66A9787960A8EF245413624D7F5C4E423B41BB6DB1699B3C2F67B09B54DAE1F66C8650852381D012809C827DDD4035E5CF14E07153F18BC3209DE2A50705EDD6BD1F37D22E6BD82B9725539442830B9A8F20039EF6AD4C677B5C4829696C32EDCDF5AC96148405FFC827FAA75809C81D469558C2F84B6A22709A12B2C527783B1AEB99B695B88A76D532F09BC4A9225A87D6972E96A3A45B8FA69101B49BD4D8FD8FB7B9736871EC159C5EE9050BC29DB96D372A1051C0D30A3C45C283A7581CB2EEBE0AF0F6DB9D3244B419C3EA43BEF80CE3B5BD961144C5E3B0B30A93BC9176B3D439E6DD48A868CE9EC4EB6F1BC4F69F15C2ADF11B7C06F956EBC351788E148238FC75003DCE1528CA4A41F7609D32FAB9F077C37B5A4786B0C95CC50225A6E540D783717E46D48F3C78BF1D286D198037F22CCCF6A9D0F2E1DFA34DBF72B7D564D16C2D9FF00954660A48900467200CC4448E46BBB60F6763E4801531AC6E69C81D5F818A42A74A24CC6249C95566D07EF3E7170DB0FE8A40293DF3826615D32E9F3AB14842D29014A7A5483FD9075FDC339877944DC7BA7BF48A94839E52272E7F2D69D5086207322BEFA43428AEF1079353957EE6F09A9B5932263A67972D07DE758750A034CAA47D8FDB8C26A94A2CA49DD15BD6F971B7B68F381CEA7E7FA8AC12B218100EA493E4C2309973011F50E4CCFE515065CFF00B01DA4FED5A7FAAEFBE1DB43F985BE5CDFF926DA9F4DD68AC36A004904FAFED434D37507A56B956DFBE7A0DC2161AA1C73FC74E3092DB5CE4091CA34F9FDF2E54B0DD23EB1BC75F67DD21CA160065024EA0DBBDFAC3BAD613828820A20828820A208299FFF0013DFFC608A57F94FA7D453A47F11D7D4C10DDF8F060F323E4AAD5740A26D422BA0AB0FEA088CBB48B8B7C4D09125766F3601E7C6C2D1CB3F4F4EF5078D6DC5EBB8AFFF0012CF96BFD46E8A282B20473D3EF1CA8DD0DE59E13BDBDEEEEFDC4A2DF11B7BCC3DCB79012A712FA9CB85708D4FBAAD3FC47CF8F8D5289DAF8A2C1DD437855A86E74B3DF9D5E3AF787676EE0E4AB7C2420170F7E0D9FE6F48D9FB860F8E70F6D6129414124640C00A39F3333023ACE75E2BF10A77710B0E5B7A9A71E8DC6EEF16613F7C024558DF3F3152CD5E54115DEAC2565214141294891D426398D41CA399A819001994766CC039676D21C61C28252E0877B86A0A0FB7BBC03EEE7CBD3C865D796BA79CD36C7C8242980AB3B7953B0D29D21F4B99B94670E3B67EBA18B5F1148515AB2931A73119F7190F5F9D454A4196189001B83F6D6BFD44EE08EF252470BE57B83CC748C7F89B79AA67231979E7D7282477CF9450A5B549059D865D3F35C9E2D582965C51EDA3369E62FD2AF10215C038721CF3D73F514D262C176CDBC9AFDA2C9291F487A0F3E0DD83BC7BE2F74FDFAFD29AAD443005B3FEFDFDA139D2CD58B92DEA3200E86154BC024684E73198D7CC7D4FA51F30015F2B7AC611299357A7DCFE72FDB2A1D498EFE5FBD67E624D8BF01EDBCE02821CD0B778A090492343FB50169363D7286A45C5473A18F2B1F3124EAD9D0B79BC325214E49CF32EFE9053C97FFBB3D3FF00C8C3E904248245DEDD7DF48A1424A472CE7E54CE665D7ED0F45B2E968AADB1145ADF3768B489BC0BE124681A4C9CE39FAE47B56924172055FD06776FC5DDA23B184298B91B8ECD6CBBDDF3AF9E2FDEAED03F68DE178261DC49C476A9C5B36A10616916EE252EC419CD249C8491153F8697BC037F2B8E44E7F76F3CAAF8D55C062C1CBD45BB0F75148D98DCF6C261BB2781DB317ECB6AC64341DB979491E2294FFF005132A2388C255913A659F3A9995242432DE80114CEF6BE74ADDB8C5231F8A593FE92D3BA4B1292F66703B7AF33911A65E17EE3A82434954889394738E63C84F5D2B64A4A560D48EE0303964F0899E160214A0C457B5DD87BA50DA57C5F18970EA7231D801FA67DE69625CBFA70A46A1625A025352E74A76FC7482B216406A7BEB07CF660C4BBD5BD6B0A17B81A827A83DBA4651A7C7CE905E328500B3676E2D99BF3CA3225A96A7E447137AFAF017881BBB9009EA0664F7FA93DB4A6D327EF87D6E33A65C07AE50FE46195BD7714ED5F77F4316A5D5DF8CEDC34B3EE3404011C24913D73FD35CB3A63392A99517ADCD00C8367E5CE26E4481402E68E34177A587B61164A8B2EADE79F70356ECC9E251E1481AE73CA44E83A8EB4C7FC3330871987CB3A1E397DF211232A45992546C031A353DD7D639EBBD67D7BD2F686D8ED99C39E4DC613B26F5D3976E36AE26D25E652EA388891F99394F7E75318A5093B30CB269BA7D9CA83A71BB58F0D861F29D41880D6A662E4E678F2D63720E265F09C1DA02586DA68919710690903DEE7F96464749AA061C0998A2D72A24127BD85F2ABD68F0BAB084A416372D471C0B1B0D7FB89862CDD5A5B6C2C84AC852C4C0FE99E2D07FF0058F5D4532DB98054D4D03DADCE9906EE486B58C309D8437200A97A53B37AF36A4618F6AFDFD617B8CDCC6D1EDA5E5E21ABA187BD6F66CADC016A71C42ED814A4C12429409E1E7DEBA97C27D80A5E330EADD72E0B0150C7D915A986C30DF5292A0404B17670496B393668F92CF61ADACC5778DEDABB61B778FDCE1AE5C5DDE5C3DF8ABA5137696DCB77FC3971449108238794089022BDA7E295FF0087E0ED9F8647CEDE5CB9817BDFC28437CBCCD039E56BC593646397855A92E404B3659676E22DE71DC63BEDD9BDDA63785DA5B3D8A6D1ED0E2AF3E8B4C3B0F28BB0B712AE14B686810A3F98447EE2BCD5B3FC21336C6D641F96565732859DDF8FDAA6BCE2D98AF10FCBC210A5D02490E4B0605DEB90AD5C0B3E51BB7B0DB01ED2DBEAC3ACDCB2B3B0DDC6177A125C7F1B6EEB0AC7576EB208532A48292B2D994F2823BD7A63C3FF0003A66270B295330CC5490A7523AE61F87615A479EFC5FE33960CE32A689894A98896A06A49F537E2D6A08DE0DD77B0D6EE36510DE23B6C85EDCED428216F5D6D986B11B7F189926C94E242F873FEEE5C23CBBBF817E0A4AC362251561D0374B90A486A31D3A6768E398AF16CD52D43E6292836282CB15A3B71D33D408DE9D8ED91D9ED8FC391618261587616BE1E1FC3D830965A427904A52343EB9D7AD761EC846C6C1A30B2C04A4240205A8CCD4B0FC52299B5315FE5E21530A8A80620A8FD5C4E557A1034AE917531861656E3A552E3BA9CC9D343CF29FF007532E3511191276AC96194B64C90499F333400C19DF89821C5660828820A20828820A20828820A20828820A20828820A208299FF00F13DFF00C608A57F94FA7D453A47F11D7D4C10D5F696E363848100CCF998F9C7F8AC2E893EFDEB0432B5656D25E0EA924B808CB311075E472311E95078C1F4A8FF00E25FB1B7711BA54032732A04770FE91C96DFFE0EFEE7FDA7B01DE7BEA4DB6CEED638F358938825202D8B616F6FE31C91FF0022870CC939011957883E2FEC75CFDA1889A949DD724122E19CB71CEEFD63A3F87E624E1D290A04A5810E433D2CF99D286E7439AF13DAE690966F6D1C172E3C8438A6D83C6E04BC9050A201C804AA5463313A45786FC5D81323133090D53C29506F9B7957845FB0528CD6A64F517BBB6B4391EB4312D698BB6BB76CBCE78AE11C4A5A0F124CE704F54E87A10455264A82166A58DDED4A6BA1A166BEA5AC12F04B290A20D03B35BA70E459F9452E3E8733492274931965E5E5DF9E959C4CD4A839209019870E1C58E56E158D178662000CC6BAE64FE053B3C46DE2D01044891A9FA77AAFCC50249A804D2F6E96D5B9DE25F674B526EE4351EA471D453D78463EC56E5B0B5403AAB2006599E874CF974CF4A66B5BB8D7434CBCE8C7D88BAE0124848CDBB706777E9D9E2D371E0A515007BCE5A08EFD3F51AD3598B2976C98E8F6BFE338B0A65D057CBDF4BC781C49CC4C7A7EF4D973BEA05A87F593FDFD6135A0BB38A7DF8F6CA2A0F84E59769D7EA2B099848CB3BDEE6F58DD082C069ABD5EB483F129E7A7689FA9AC85105F5B8C8C6AB946FAF6F4A43943E8E111244EBD0796BCF4D7E228DF21C814BB54F6E6619CC940925883981D1B23C7FA8582B8A72D22B50A20867AF0A7584552D2A0D6EE59B3F7D697A4BA90A2933232F3A7D256A32C9B31BB90CC7DF484012956E0C9EAF5D7AF68590952F4103A9D3E5349AFF91E9E82174CC648FA8F427DE70DAE2DD01E6545A5AAE42FFA0E04CA120C05C9D47126440D29E61653A8646C0581777A59C5002C6ADC218E296774800126FC1DDA9F739906315ED8DBB877BDBBDBF7F0DBCB8C2F0372EC2D2D34572BB96D2949483EE901C92A3D3A9AB6E0F0C9012C32CF3C83EB91E19D22A58D9AC561C824170FA8B59AD4195728DEC43F6649716871370A6580A00001292DA7802A73900E731CC015349C2950752686D72D6E05BFB0E050D0312A4A17BA8AA5C977A5DCD8000BBF1AD9A1D7E2AD30EB72B79F6DD53D9210D2829633FEE1946B947CB2A49586A12D5D1980CAED4F2E1942682564862199C91F4D43D0C37174CB5EE292B4EAA055119FBD999E9E5E54CD69081BBBB9D0D39E5E94CF8C3C4CA5101ADA9D3B01F98A17895B2464B4ACFF00D5264FD3FDD24A2C0D5A85A1CA70EADDFE2E722D7AD5E8FEEB11CE62D6EB511C7C2AFF00A28C1196597CF49E7CAA1A7A8FCC56E96395487FCD3311272708B094967A685EE323CAC6910189620A6415FE1DF753AF1368919F33DB4131972CF5D10951D4826A732D5B86E54C9F4893912536DE4EF13FC49FAB27719EBA3748B22E71A4B2E29E55B5CBA2EA652DA24B013A97C4FBA2093DC024C53996904A5F3C856D77F22F1332F0C58170929AFD428AE01AE72FEE347BDA7BDA2B05D99B17B617642E5DC576BB14429969AC2D697BF04EAB206EC3678D0005C9C8C70ABA5384A10087506704B102859DBA44BE1F0EA5201DD6A5998E41F969AE9AE2BF65CD92DAED986714C6B6E6E2DAFB6AF1A71A798BA654B7434D15A95C2E2DCF7D2B0CAC2607F703CB2A8EF10CE929C3CC4E1BE67CB0004EFDC16FA9DAD5B3338E158B361B0FFE8A42B74BFF002045D886CB2E7EB1BCED5A06169BD1FF0022932B3A12633F9F3CB21D32AA16CD56F62DDDDCB8CCF16CF874348D9694B948CA8D91D1AEDA8F289CB472E9C4ADD688525F292C273E24041FEA8580722A12131AC8D79DBA7E193325870093BAC746350EF5A3B74AC46E211BAA2EC0203A9EC7787D246AC4579B8B3C7CF67F197DA3DE4E2988609B2F82E078FB9B16DB776E62AF5BDBBC6D4786DA5D4A9653FD3E10E26655D2626BD15F06F64E156B54D24A674BDCF928240DE2AFE54B939BB539C35972945082B295124B949A370EF6C8F111C3BF62BDFBEC56E9F7DB8BE33B4ECBB74C5E38DB4E2D80DAD2C061A5B4E0794B50093A83DC1ED3E93F15EC3C462F64E0E59412890956E8DD3FEF634147AFAEA61E61B08F34AD2D5ABE82C1E9DB4D1E3B84E6F77723B578BEEEF7B1B15895A3AE6CE623E2E2B62875855C137172CA130DB64E498515711194D33F875E0E48DAF2BE74820A56090A48D5C30B39E19B35210DB52CFF0089312E2A8527E922C4350D0BD69561CE3EBAF70DB7DB3BBD5DD7ECB6D8E149B276DEF70E61B6CAF855C0AB765B655C1C2602814E647388E95EFED93B1B052364CA5AA523784B00D038602D6637BDDB998F21F8A70937098DC44942E7195BE548517624B921474766190193C671B1B1612F2D2F22E2E9700B6ABA85B2D889FE9481034F38E74EF038CC1E1E794206E92CCCC18E6DCF955ED1CFF7267CC2A25543406DD0519B5FB44FB16A8528DC84F0B8AC80E402728E67B0CFE5562F9A99B5497196B5BF9E94EF1BA8104BDFDF285822E94A2A2A401C86632CE86CF4FBC6B0ED1C7C23C4E1E2E7C3A7CE8822AA20828820A20828820A20828820A20828820A20828820A2082738CF499E5FEE993FFA963DB837EF95608A57F94FA7D453B47F11D7D4C1142085028E9FBCFD7F5A260FA6B627DF2BDFA406BFA888C52E45937E202233EC3213CBEF5F481C6D88176367AB81FB1F6AC640048700D45F9C73BBDB4ED2D76F361312B25A02AE70961DBBB479A00BCD3AC82FB6904E69E371091035903BD79EFE20EC438944E9A52080959A8B9A8BEBD2DE7D23C37210501690EA5338B545DB3B3BF5E11CF0F65CDF33BBC0D8E7303BFC4D08DE661576F5A5DE0B70E91722D98BB5B2C28B0545DCED11C7310419D32AF9FF00F10F667CA9F3CEED5D54B70007DB3716B4762D8D854B254BFA521AAAB559AFA9B10E46A1A37AEDF13FC234DDBA894A9284F10320F1912A93D02A63E51A57009D30C85900589BDC70E8ECC43C5EE56CA0A961696622FA3B56F63DAA4C3F6F1B03FBB9EB3FB18E93A475A88C663C00CFFCAF534EE78548C9D9E911989D9E12545B30F6737E163C352D0CEEB1A4F1292173DE40F3E47BC6BF4A8F4CEF9A1C1770F7C8FBCFCE34C3CADD56EF2D72B657D0708B6EEEE7C624E5FAEB98F4F4E9A655A2945D81A70378B460259041160CF6FB50535AB3E7588570FBC40D01E53D8E7D629ACD986EE082FAB9E7C88EC45A2793603DE7F77FEE2A49040D3CBA5335ACB105DDE872CBED90A40A43D6C72391841C71295904E7974E9E63CAB644D094D5C9A75A9D7BFA438972FE9059DF5E19D6AC7AC51E2A3AFD3F7A0CD0C18ADF3ADBFB8C2E580E2E74BF937BE50FD820B608D0FAF4FBED419D57AF26A767AFAC32584B97EE687BF38916F9FA7EB58F9B5BAB3AE96D3DD28346AB4328B1E795C70F385916FE2282A241E71D32D63B659E5CEA4E4A8FCB0F6604F1D399D34615AD2227ACA66001F7AA4E8FE5EED12ECDB42047088D35FD8C759EFDAB604296F91D796919F9A1850726A8F3E5CFA43830DADA538DFB88564B23212759D6331FA8EB378196EA4B338F322F9E9C75CCC30C42C1DE2145D8167E1D6E1FAEB688DDE46CCE358A6CE9C5B654B4AC52D9A2B67F371F191970F067A8E46AF78291BC90401950799CB872BC5431B38296524907EAAD82AF50D7CDFF004D1687B3EEF2AEB11BCBBD97DE45EAF0FDA4B05F8776EDD385AB65A5454A60254EFBE47860033A9F4A9A4E1C10067AB301C1F83EADC338A96310A415AE5A4AC82084A43EF7D81E2236BAFC60CA6DB6ED1DB7BF4C8297ED141D20CCCF109D3B1FA5359F204B191E4C417B64DA9EA2F785306954E482A96B96CEE169637A900FA7586D70E36C8287997D694A07BEA124822609CE6328F86794C362250756F05240B1B71A5B2BE8EEFA4C61E46F91F2D52DC64554E1974CF4A345A78862D60C13E030F29CCFFB5249F841CFBC729E42A2672909A872D42FABB06E1C866F13987D9D38B29625EE8018241721858E8796BD2CF771F75DB85F8B6E80CC8CDB49FC5360092A76623ACF20338A40E18AD214452E08AE6F7AE7601F311292F03BAEADE50B50FF001391CDC83634F26318E76BF7B3B2DB2695AEE76C30D5BADE6AC1CDF2157EA3FF00F8D2C1CCAB4CBB839D6ABC3942410A1C52FEC53F1CE1DE170D28CC2932085021E62922B4A6E9CDBC9818D42DB3DFFED66F2EFAF365761AC6EF66F0F30DDCE2D7AD2ED6F2E90B0655873CD9217971054820020999CDB297B82A1AC090EEC5BFBD72A0113F87C1209AB2C38A1A80C459F8DF5F4B4367B7236585DDA717BC69FC6B14795E2DC6217094DC62EDB84F1152DC202928049009FEC1234A6EAC60466E32B3DABA9A1E1CC5DA611874A52280301A07D1A9973EB9C6CDECCE002D50C3885A5E48193A832328F74AB4949C95AC28543ED99BBF835281350DF8772C7B985C2D2964B860EE721A71EED1950A816020EA040FA4F2F38EDDEA9FB266286281BB28DCD454737ADDF8EB0D96B01C8AB8C83935E2DC2BF731459BB76A6DCB603F0ECB6A4C5C0949826550AE51A65196B15799939909FA98060EE003D79387EBC6184E5209DF512A77649AB90294A694BF3CE354BDB797816CFEE17783B4589E1D85E35F87C21C16CF620D26E0A16B6968570A9511EF473E5E95E8CF83B881FE66180A82A4872F67F66BF686A89DBC80427E58ABA2C29C2F6A9CCBC7E7F8AC6AD1EC4F69B1A699B7C314FE2B7B9211E0B251F8C7920339E7EECC8313957BE676C74E236326629D6528428331624034CEF4B5380A43A91B4A54A3BA4849CEC32E0C18937FB18CA1B078EED65FB89D9DD85B8C7D6BB94A9C5358629654E2DB05D48692DC924A802246B9F4A6FE1190946D64A9406F6FA5FA503FA35F94436DDDAF2BFC7584B541B1A73AE7ADAE35A7DC9FF00ADBEDEEE33B8CB0D89DE760BB45636D80A9E4E1F79B40C3EDBEF876E5C59E35BB214042424A63223AD7A802D6BD98128A3A0333F2E9E4794798BC61B411326CD015F5025CBB8EBC03F4BF3FA3AE1B90095A9B4A523DCE1273026049D328F2E5CE6A387C1E326E306EEF1651AF992E0706E79E714594A41BA779F2D3AFEAD5E5258738B72D92A7014AA4E4441D48CFE15D0F052E64B94913410B6ABBEBC7AC37C5A5299CA092E29D283F70FA9EC35828820A20828820A20828820A20828820A20828820A20828820A2084CAC82440807BFDFCBE349264952DF4B9CAD953D9E461354D4A5A84FAF4E5D22A90A919FDFC694002433DB33190B72CCD0D5B205C3A24C2635EE272F3A4674E64B641CBF5EDCB90B429761FD9FCC5ABB605430B79F4E41B4924692049CBEFAF3D61F1002D254E33E341CB4F5BDE8A22592450BB8B57BD3EF1CEDDEE5EBB77846D23B6D2E855A3C5E6DDCC02D34B29E103FB721C4491974CEB8F78C76A61F766E14A7EA00A5D403BEBEEC63AF7857045587429EA5AEEFA51C69C8691F3C9B1382EF176237B1B5DED03B349B9B809C4102E70BB1F11568A61A7576CE16D94C7BC1BE252A4FE6D6BC61E3FF000C2B68AA72E4AF7492A2082CF5E0E0F91CB9F6ED838340094CC01480CE15504BD3414636CF8C759F76BBFDD97DE66048C5EDEF9BB5C4DB4368BCC22E1C422F9A7A78172C0515005614AE7EE8122457963C43E119D83F9AA54D1F4924806B716B67714E0D48BFCA969420237286C52030622EF67A65967966BB0BF37C62D945D4A512A5A33427DD98528686328EBDB3AE2BB64CEC32D49DD2589A81C59B2A8BB67E51198E9297A86166199B1CF26F748A54F38B5A97242742093323DDD3BC1D33D33A4B03895995549078821C1BBBFA8E1C618CAD9E662B7D2C00A97762723CDAF5F48A937FC1F99975644E89D667CA7BFD73152482A591603B5C53DFAD22670F8732CEE82EFF006DEB30E3A08F42FC585A5B5A02B92844465E9DBAF2CA96183F98C4A921C9600B538E7F8E01E24501207D44150CB5E747CF4A1A9BC29C4842415109EC624EBE53DA951B18ACB99A91A024E94D05C545E8748092737F4E828DDA239E5A54EAA0C8E4797E9CF2E79D466270870E482A496D0BF7E2C7979C6C9C4EE108524B3163AB0E7AE659EB68F024AB3047DFDFDE751AB9A11A77A77F5FBC6DF337FEA0925F874E3A44B5A7FC694F3060FC7E3F4AD133F7D411BADAE473B1ECDCE8D9339EAFE4A6140ECDCAFA9F7AC4FDBD9B8E890A4671A98F3D7E35272B0A66241DE009C9C3679F6D6F58899D8E4A09705C8B916C867CB56CDE24D9B752141A50E229FEE198D0739F8FC0F3A723FD3FA0924E82C5B4B3FBCDE22E6CF4CC5EFB64398A7DFDBC4DB164E2C26074EDF1D79E87A9F83B9127E62812EC0E4FE6D97A437998842695D5EC73B71A44EB5847E2994B6F04F87A029FCD139E664663EE6ADBB3F0CC52EED537771C05F3047A8887C462D0EADD249346366E0D973CF4CA5B0FC25FB058432F2CDBA89E26D6A24C7602AE5833F2C00C28D931A67C7AF18839F342CA8AB76954DA8E00F32D66A8886DABDCF6C9ED9B4FBEE34BC2311B8482EE278725B62F5C291014E3B1C4AE180019D32E74F95B424CB05252E450167EE4DF4E0CE620A64DDC5804037DE0CD7B1B79E8D7731AFD8BEEEB7A7BB8E0FF00F02DA36F1465B595706D25D3CF4A78A4001B006432F9654CA66325CC2490CF9022957CF8FBCE1F499B2D49092CE4977E3A96D1F3D2CF0C93BC3F6810FA8E3183E0570C242415E1EC5CAD0B84804A4930731E951B3D6A9B41D2ED4356E9A6B5D626B048C3211BA120977DE663772C7ADAB4D22C4DB4DE3EF70B0B182ECF30D5C807DE7ED5E08E239CFBB2489988CA39D464CC395134B9C9DB5D072A7E62CB2264B003173CF875A575A4609BDC3FDA2B6F1A8C5F17B4D9AB57894A9CC11EBAB4C40A78A21C2A904C6424E4093AEB90B4C90CAE9DAB9B1A534787416822961951EFA7BD625365BD9C7F0D709BCDA0BBB8DA0BB510A55E62AB17373275295AC4CE7F28E8698E227CBB0FB70360DA5AAFA98732E720067D19D9FB0F76D699FB08DDE6138516D2CD9B4A2D8050EB8DA7C46CE521063204E59C6550F8898E5F4D73ED5341EEB12B271728252D7CC585697B3FBD62F746CC593A80A4ADDB77844AD82105E11925C3FDC00CBA807A45442D678BE4F6F51FBA1D0C3B5E3DE8908296FA8915D2963A69DE1FB762CDB302DD2CB4C944C2191C2DC927DE8EA7F32BA9EF4DF14AFF00230EB9207D6CCD9307C81EBC223D58E44B5EE83BC2EE6A4B9B7E05B5E292587418253C33966491FEF2E5FBD5691255B3E6FCE58700BBD09E5DF40FCE1413153599DCF1605F9B59BFAB4561DB8B45A96521FB55A7FA8D89516C9109244C244E797298CE9F61F6B1DA1351874214E54002DC6E3D96CE80422B94A2E09AE47DD072D0D59E386DFC4F76F36B37A5896CEFB2DEEDF137862FB4EEBF6F8E3985BCE78762CF1377091745A254D9532A504050FCDDB2AF6E7C06F076D09F3F0B8C4A52A09295044D7293CC58B33F2E05CC5E217B8E0A9DBEDAD1DF2A519E30C7B3C7F02DDCDECCBB61B4BBCFDA6DA8C79C7FC1BC7F0655DDBDD61E5E570BAE2576EEB67DC5384C89CC124E75EF79C572B00304B4A65CE284A775144D0370AF5376D229F8EDA0B913944294D56AD752D4E36CEEE5A3B3BBA7F635F65CD91C53086F03DD2ECA5B5C58F036D5E0C12CD172E848482A79C48F79440CF2CE67AC34F0FEC49F2F1E99EACD4EE4EB9171CB4B1AC53F6CEDB2A92A00AAC4104FE38971A67668ED0EEBF63F65F66F00B5B0D99D9DC1F03B4286FC3FE5D6A8B67084C157104E473F5835E88D9C52AC2225101F75A9996CFD4EB4B51F8A6D913311326CC0A356706C2AE19F8B8CF8465F72D564A0F88B2129FCA1592A00FCD3A904476FACB6130B2652B7CA06F5C1233D1C7B073886C295214525CB6649D2CDEFCA246C82C329E3E1933F97439EB9E7D7A5389C5256775F893C87BFBE9B4F52553094E801ED0F2928460A20828820A20828820A20828820A20828820A20828820A20828821056A7CCFD694979F4FBC3399975FB4548D4F97EA2915FF13D3D442C8FE43AFA1847861D7951AC69AE5D7F4A633BFDD425DB27A37EA16171971D22D9DB04716097794C20E5E87E3E54CA60FA59A8CAB0D787B787B21492A507AFD239D5E9E75CAFA472EB7B6BBE385ED5B587AC2568C3AFFC4CD420AAD9EE09033C8C46933A19AE35E35D94162762022A012EC3425FA51A3B078627844896934219A9EFC99AB1CC8F676DA96362771B8E63BB5364C62BC18BDE5A5F5B38DF8CE94DEE2EFDB347857D0382267B682BC51F11B6EE23662E7A5256129DE176D6B43D7A5C10F1D8B63E24290900B12DC496E1AD3D6CF0E778DB8CC1300C291BC4D86DA156C762375E15CDC5AE27749B1C3AE9774525A43086C4AF3720A4CFBC40D4D795F69788317B4F12A940AD414A20DCDDED56D795ED176978BDD4B29C8206EB64DABB172386958C6569ED8988EE871CC3776BBC9C3F16B5771542B87692C9A28B171B6DB0E871376EAB3494119E9D349A9BD8FF000E311E2097F35525DEBBA524294EF402C7CFEF11B8BC4826F40ED63CCB0D5E835E51B3FB31ED35BA5C4F0AB6759DE560092EF11F0B10C559178933987532633C93CB21DEB5C7FC1FC7E16614CB90A005BE9200A3E94E361A18464ED34246EEF3330A1153F67AD5BA5232059EF9362EFC8559EDAE07700E858C41B50D01E44E4476CFE134EDA3E01DAB8376953A8F6490E43816FEBBC48C8DA2852AA439156F215FDB9D1AB78611B4985E2EB439678CBF76E3874B57D2B615063DC00C9D33E53CCD50B696CDDB382DE644EFA49228A661CAE683AB718939535332C5ECC4D0FE7F65B38BC6E6CDE5301C7AE2E186C8FCEEAB875EA488FAE5F1AA4E2B696DB90B2DF3C373671A0ADF5A01D2AF658429802951B109A90E730DF6B68F0CEDDE436DA52DBFF8842491E2F105CE706543A69A11232AC61F6963A78FF5FE6151615243EAE3CF3F485BFC32A62D4C81E37F2CC919DA245BBAEE4E9CE09F5EB0465D674A9EC2A04D00AE845F79A94CC1737E40E9AB84E10243333D8E5F625FD4F794B5B900A3B4FC01FB8FAE469DCC952A5A77814BD2BA7B6B0A528D688EC561D92A2D4670DFBAF0F4BC5E36174084EBDFD7EFAE91D05444EDA8B904849342C188D3F54AE7567AD3F1D288DE167E67F75356191AD691775921B79285989333A671CBEFA73CEA5B073D7894256A241CCD8F3AF4BF9443952852C479FBD738BB6C996C464339EFDB3FAEBD39558F06A4A4D4D465626B4ABBE9F9CA22B153164DCB0A96E56ADCD7D22E4610D04241E181F18D403E67D0FA656BC1CE09DDBDBB3FE69CB8C424D52C28FF003FAADC3BDAFAFAD651A4B320C8111AE8341A8D3F69E756191884EE9750B52CEF9BB1B574E10C56A5870778B7FB8DEAC6F415B5DBBC392B4B44919B640D73072198ED9FF98A8FC56206FBBD0DD9AB4D7AD75A50445CD2A54C04B5097E595EAF5AFB30C2EACAD710052BE132208CBB46BF0133CFA014DD3880A7751072AF4D791BEBC21CC85949FAADC457DF4AD9D9E229DC26D6DDA36E8F0804CE47501464E5DC9903ECE4CF2186F31ADC9EBE599EF4898C3E24029290ABE55CF4FBF18B2F11D9DB77D4726733DA3BEB1ACFF9CE813C1A953E95D1F537D183DD844D49C45C8DECB831D73D2B9768861B3987B29085B6D29C4CCC0067B826397A10353A963397BEAF7DBA655A5A1F2318C0024B97AFB6A37EA1B39845B2092DB423B247307EF99CB28A6335EA2A79E97CAD5CB4AB34394625D4050BEB56E373DA1839837192EA5B0907310348EA0FEC7E951F312E906A497A135D0E55E5487D2F12919E54073E601CBDBC47396FE04C1397FDA728F5CC69CBD3234CD5289C800E5AEF77CC77870310F7722C5BCF33DA235D471B8489F41F03FBF79A48A04A49530E3A9F21D6374C833485901813C9C9662C1EBEEA4C51E17FF6EF97DC5203069DA0B1299CA8814142E6D636CF31CDDA464832C0A800543D2ADED87DAF83B7FF00BD5C3774BBBAC7B1CB87026FD4CA6D70EB30522EAFEEAEC9B767F0ADC85381A75C429C23348CF235D93C05F0A4E3B112270C3B82524326CC41AFBF3610DB178C4A105EE1D99FFA1F637223497D93F702E5AE258A6F877ACDAB13DE06DCBFF8CB87AE41791B34C30B51C3D36EA7878B686EED56DA5609FEA1194F3FA23F0C7C2C3C3F8792A52370212059AC2971426FEE951C76D015FA99DFB54D39C74556D2BF0EC052022324A522070A7241CCC6691396B3975AE9B8D299D8B0B4DB53A5AEFAEAF9DF3A76D09E263A81241A35C9C9DAFE77AB9CEECD8E6BFF00E6ECE468E0D27A8CB2E79FCC9CEAD3B2100292482F4AD0E9735D08E3D4C50F6AAC90A25D8851F7D2F4A9B523A5FB12230CB11C837A8CF90CBE1F1F4AE95B3EC19C30CE85EBE9AC51316B652C3D1ADAF21958916BC64958800F248F5FBFBF2B0A1B74019522292A1BCFA1A8E632852D7FE14FAFD6933736E96E9082FF0091E9E821C56235828820A20828820A20828820A20828820A20828820A20828820A208415A9F33F5A525E7D3EF0CE665D7ED152353E5FA8A457FC4F4F510B23F90EBE863D52638CC0CE3CF2EB4CA6921EB666E0ED0B45B1B440DD61D7368810B75042547F28273127E1CE99CC202483983E4CF0E2424858551A94ABD639E5B7FB2EE5AE2D8E5AE22522CDF4F8772A689CD0F20A722A81A28820CF58D6A87E244A67E1E6CA672A0459FA51F3D2F5238F43D858AF96948DE619134CEDFB23CA3827ED7B816F1B703B67865DECC5AAF1ADCE63B89B3738A58D925DB8BA67C1B969D256DA21848F1D4A32AE93135E40F1F7C3CC46D9993B76593BE4D4268D5CF4EB7E21E3ABEC6C76E9402A3955CD6FC38BFEAD6D7B69FB55619B63B05B0581EEE302C7717C6DF5E181EC2F0BB64BE2D976CF5A150BA65A3C48E20954C89C89E55C9367FC12C4271816BC3D029C9DDAE76A5B2E758BCA71DF403BC59867C087F3F2A868DA1D97DC15EEFAB0CD99DE76F4367DA699B2B0B3186E0AF5A94AC45B32CBE9BD61E04428A791191322BD25E0DF87B87D9E895F3248FA4016AF1CB8B7F548DC563F75249512E0D9B8919BF71C5818C9B8B7B296E5F1B2BBB1B178260EFAD08416F09B0B761A4290908E3402990E28895AB9A89922BA54EF046C89E9DE992251240A1482C4B5DE9E561C43D7266D35A6690925B30D46B57DD39C623C6FD88B622ECACE1BB47B4F8324CC270DBB6984A7A00026321EBD339AA5ED7F865B271214061E4D41B203D7855DFDE913184DA0490E4D6FD18F43AF78C4989FB136F1709BB7AE7767BEADB5C3EED9016C338FED03AD614A58121280CA41827256999EE2B926DBF82DB3F129294E1651A963B81F3BD2A38D7C8BDB3058F620EF03931CDC67D2D50DD22DE6F799ED7FECF771C1BC7C393BC6D9DB7242AE7056AFB15716D27995BC420A881993D0F399E5FB4BFE9EF0F396B50C2A2D40101ADA6EBBD0B70B459B0D8A964B8201615058D879DFB50B5636DB735ED6FBBEDEB5BB0C3C95EC863A6517382E301BB1B86169240058E22A495C710CB30418AE29E27F8313365CD98518764A49A25059874ABBBF37E0D60C2CF46EA4156FB13FC8826B9BBBBFE9E3692C71766F57C2CF8859569723FE050D4292B920883D79FA8E11E22D9188D8AA9837149092C0976001ABD9F5AF9801DF2A64B525C0045C01573DBCB2A6B5996F14B761E0CF18700221C410A6D5397BA474D3B9D473AE74BDB334CEF92545AD7FB3DDF952D686388489B294424A5C588EBD2AFA54D327BE30ABD6DEE11C611A415981F1CB9EBCF2CF5A9FD9FB317B4589058FD5514399E2E48B53F351C7E15552524EACEE6F61C2FA3B6822F9B47168E101E41E8127AF31F2CC48F2E73E30A7027E530200C8D2B5D3F37D1A2AF3E490B2C9525EAC47BE1EC345D56778E048F789D34267F5D3B4C65E54F30F34EF3B86A3DA94E957074D2D11B3A4B92E90C5AEEDA65ADB43CDE25D1882A47BC124E441CA23D7591AF79ED53D87C504DCF177FDBF0639758879F214092C487C85B43C3F1E724DDEAD4212B132273F2CC73F3CA338A94958C02E68D9E8C0E9E54600C464C96A3BCC09CB80A6B4E1971B44AAF106CDAA5A85174482A0070FA199F3CF5E8669ACEC63AC8717CECDD48BEBC4F3860708B528A98805D8313D5C0F2FB4465BDCDC34E95A9529998075F4E5F2A47FCCD19C35496EDECB768593875020949A7FE26BCE9FD4387EF90E38A570E662720740074FAFCA8FF2CD5CD7A7A5CF06E7587D26514A47D2435836AEEF4E3C3B34352FB2AD5B9F41F3F8655918C04583E7FA76F46CA1D252B702A3913E4DE7C2211F682EE56BE121063DD034CB9448F43D474A513337C02146B93FB7F487282ACC1E7CB81FB6799BC2CDAAC513E234E11CE123303CC83F5D73E95BFD2D577CD9ADF9FEF846CA3382BE921F8BD2DCEED71F8641E530EF1065B2949D0A840F5EBAF98AD7E48517B067EA74BF11C98B6AF6419C024AC826B6726E496F2ED945A18A5A49E3F11B4E44813CCF58CC72E9D6B070C9AD3CF37D1B23AF0AE920998B7018876EBC98D47166BF216AB64ADE79A8E14B31C4F1C9A3C59A615CCFEB505B424CCAA520B0D38B66D9E9956D13D879A99720155D87D39E76F77EF1686DAEDBE05B01805EED1ED2DC270FC3ECDB538953EB4B46E826470DB9564B512008EA40A9FF0006EC79F8AC7C92A42F777C646B517FDF0E2219E231E84950DF7DD150F6719F6AE9A8CF99780BBB4BED81BF2B0DAF7AD9DB6DD2EC7DC3BFFE3F8462485A138AF8882DDCBB88319B0F165F6FC5B4524E47849AFA4DF09FC3587978590A99280FA126A90F4029E85B2F28AA63F6928957D74AD03FEC6BA1CDEF1D14B6C26D10B7B05C3385AC3184B097DFBD01372F78094942429320A1A52785B06084848CF5AEDFB4D48C048DD943758300037B033F5CA2AD89C5AA6A8BABB1E7D746E05E913CFB8D396AD3AC92B687B80EA4F8709398E597EC2B5D91BD8A4852C0E04DCD79B53F0E2A223D73094A9E8189B9F6FD9FAC5F3BBEC31FC4715B6798294A50B1C5C5209CC1E5AE433D4E626BA36CAC391BA7938E0F677E40DABC6299B594EA5358D40AD181E1EC115B08E92EC8D83ACE1966B52870844473919139FDF99ABDE0E584A4166E038801AEC6D4D2DC2287895A4A94337A12ECCF97AD59B8C5F0A525488FEE20CF4D7CFE952454539D2AE333A74D7D888D0A2093AE4D4F7EF575ADC10D007A9D3CEB20B807580972E7385AB318828820A20828820A20828820A20828820A20828820A20828820A208415A9F33F5A525E7D3EF0CE665D7ED152353E5FA8A457FC4F4F510B23F90EBE862971D482519CFC3F63EB4C66FF00BA9A7DABEF585D201501AD7A0BC473F6A5E049E9CF33F7F4F432CE6074B9205C578C3A42802C680B5B87BBEB1AEBBD3D8543E9BEBF21C7137A905411986BC311247298D67F4AAB63702B9B38923E9341D8DE97E97A50B189AC0E33717BA19810D4E5A3BD4D7F348D16DA5D90C1F16B6BBD9FDA2C16C31CC31055EEDDDBA6E5C4024A8F0858E1064444E446424547AB64E15559A849A33103D68C7EDD0C74DD8D8B2A4A54E7A1E77007DAE6312ECE6E8F74183624F5CE1BBBAC35772957126F2E30B6086D59E6870094F0E83908D795339FB3B65C9FA932D00B6807F4E7C9B48BC4AC613280DE34B826C3977CB5B464271F7025586E1E52A62021BB56B3619198090819240CB4D48911A88F5AA44B27E5002E404B060D60DCB534AD5DC4663316A7FE4C2AC41B5E9CF216111CAC39FB64969F480E0FCC120C0E2322273D0E63581E555BC66D0C50584A0AC26AF520355BBD7CC4478529642AA756CEDF7CEBC6E5A21FB6F7A232CFD3E47D3A7C61B2319895FF0032B2FCEE6F4E27A7189492B54B00B9CEF7716EB51E9AC4270076E96CDD24861A23C328D64E66493D73F29E722B6F98A5B15A49702E0DA9CE822670B8FDCFF71F3670CC2D473EAF156321BBCB33875CD9E1D7387A870A85CA389CE1E73CBAE67D295DC94B4D51C983BBE5D470E71352B6CEE007798F0E81A97CAC5F9C68B6FBBD92361B6FD6BC4F64F13BFD92DAA92EB177B36F3763FD64C293F8F5A015F04800091913A646A8FE23F0DE13684B984CB495149674826D6B711C6F13185DBF91517CB30CD5D0F1B75AB4604C037DFBE5F664BE636237A9855F6D8ECB29618636970365FBE5DB320E4E62376EC368805324468ACA6BC7BF113E144CC67CF5489143BCCC9E6E5EB4AC59F05B5B7C004BBD5C105DEBDDF5E79D3A49B9FDE0EC4EF4B08B6BDC03686C3104B88E316F6F72DB974DA880A5B6E25130B42A52A1C8823B5793F6CFC2BC5E027AA6192432892774E5C481C75AB919C4F8C4054A71A33F6D3F7CB5CC76EFDBB37AA6D97DEF1983932FAB2544689D4E4397999CA9AE0D32B633226B0DDA1DE6D08FC30343965092F0C569214012450E8E28D90A0BBEB58B818DA3BB5DC00FA030B100B69052948190201D02B224EBDE69AE37152F1538AD0CC49B72F6FAD2948ACE236780ADD04AC027EA2C7D916AF570232560D8C21C424A97079927FD03D23CA3A53742B749AB3E7EFDBC4462B6791FC53958D5F4F36BF578B9D2EB6F283895E47BC67E59F6C892234D69EA66669533DEB7F38879B8577494D4065532E596773969126C148CC39E8159E9D20C680FFAA709C492C0A83F7EAEEF9F4B8B4464CC1A41FE1C5EC2FC73E34AE50AAEF434A28E398CCE7073EF041A426E21492594FF00D0A7BF468DD18305208043EA1FEDA367D228FE663A9FFF00D87ED487F94BD4F61F98DBFC2F7BBFA8ABF19C598224EA0AA08F9FC7215B7F9254010A19BBB7979F58CFF86902A97D4D07D87BBC1F8A13AE7A73FACE959FF2A9BA5EA6E0866F2039D5B9C63FC66760903437F207D4748709B849410A201391279687F5FF00753585585CBE2337F64E55D73C86BFE3A82AD4C9AA3ADCBE7C21A3972D0D60CF5F58D481F5E5D2A4A4A42981E6065D69AFAE90AA30EA51277496CDAE03707CDA20EF318650A5B08202D319E5CC48CB3CFF005D69F252281B8659F67F2A5290FA561CA40510CF4622D5CADA58D62D5BCBC6A49B8B94A1339852C800753F0EB9D394480B60A0CDFEE6615B548ABF67A43F461CD4B127219EBA7A03C1EB18C76DF791B21B1F85DE6338AE316D6CCE0CD974599B8421EC51C5025B6DA41203C50B0124488E2EF3574D89E085ED7095097BC090FF004B923B7DBCA19E2B1424A424BBFD5AB27CF2BD29EB1CFF0052F6E3DB476A8DFE32DDE6CC6EB706B8219B05872D177ED255C33E1AA597015B61407454F6AEFDE0EF849364AE54F121AC689FA4336A38393E6CF153C5E3021240512493BCA37CDB78FE7AC6F66CCECDECB6C16CF58601B1986B768D59365B2E25A4216B5180A52CA009E23267299AF54F86F672F644A952CA5B7404D29976E1DDC18AE4DC495AEAA2CF99ABB73FD680677731656D7366B75C3E0BCA12E1C84EA79E672D663F5AB6CFD9EBDA83751BCA243E6F9643C867935A044A2B2491AB7B66B0605EFC8C37B5B668B0DDA30A2B6D2A30A104925524C9EB9919FD26A5766ECB3834A65AD0410F96BA599EC2FE6D0C718D2DD35000A92EFF0070FC5B5A0631B29BA6D9C21E65C08C8A92743D729F203F6ABCECD96C94D2A72CC8143CFDD6B145DAAB7DE2E5FA7A5FCAFC6379F0867F0F87B0D10470A743DE0F3E5570C3A5887B1D2F62FC2F147C5CC725AEECF7D0FA5B2CB9C9D2B3087352DC72F3E5EE911BF32AC547B96F7AE435876CFE41E66B32CDEB4A379C2E92E906FC7AC2B4A46D0510414410510414410510414410510414410510414410510414410929064C6739D6E9504BBBD5BEF0D972D459859F5E1C22A4248249F2A4D41C11EEF0A24177666D61B2D8714E958238491A93947DE7F72D664A529D9FFAB37BFD2C181048B438E0CB5CFE5FBD22AC312962F93D3AE61BCE3255F56F0E8FDA2D3C76DEE31143F60865A29527878DD4CFE607F29194C76CA0674CE7210414EE90A66A8B355DFF00BABE4D0F30E374098A5115B3DF2B75B3DF48D29DE7EE81EC25F7313B2BDBC05C5296FB2870F8644CC25206801391CF3CEAA3B4B0F88FAF71442AC0825DAE486D1DB3B6B7BEEC9DA0896849B80CE3CA9FAE51AF97187B56F76B45BBD7EC37925C4BEAE149207BD09034267A73354DC4E0F686FD56A524E44927370030E2ED7ED17295B5D0B48029C2DBDA1E35E0DC6AF093682CBC1AC398694167FAAFF0FF0057A92950E799D40A4D3266A48DFD5944F503476E35BC626CF135254D52CEF6B86D5FBD7842F7987AC2D50A5A814A4F13C6564902412390CE04E4075A96C3E0B0CB4BAD0144DAC7B07FBE79D214958A44A001EF7B5455F9BE82916EDCD9A9274D394FFACB9E91D795666E1306827FD31FFD23ECF9D3DD1C231C951228C0F56767F23DDD806868E58DB78056DA26E553C5C63DC1D2329D2751F2A8D9D2A42086450568056CC2EFDFC9E1EA26850749619B96ECC6BCFCAB4B3EFF000643CA2A76E6E1067F2B4A1C1E5A1F8CEA08A62B54AC9200B3066B655A7439584384A966DDEAFE54F2D22199C2D9B275D5B4DA145407BEB48F117023DF235E824F59E95193247CD984DD2694B75F36CB430FB0F2E71008530D41208FB65E94D6CFDB0D93C236B70CB8C2717C2AC1FB6B84942C964294A4AA66788473F3C8F794311B0B098992A1364824E7BA33E80B3EA79E462D380C61925017500D49B65573FA191168D19DB3F664DBFDD29736E7D9B719698C5D6A5DCDF6CCE22FB89C2D0106786D2CED42540B89E22A0755281CF2AE29E32F86F83C7CB9BB92424A829B71201CFB777148B8E1F6E484240500695736CC5DBB6515EEC3DB771CB1C5D8D94DFCEC662FB2DB40DAC30EED13160BB2C0F891092EAAEAE55C45110AE2CCF9675E33F1B7C0ADB7899D357835AD287247F3720540A03A6B1292FC418520B8B86000147A1CECCFA3BDF4E87ECB6F036476B9B6DFD9CDA2B1DA16D684B89BBC3EE9174DBB29E2284AD33C4A6F342C7250E935C3319E12DABB0712AC0E2513173525B7D94451FD68DCDB81504F933C6FA0009360CDC0F2AF5CF9647C331B5292A952AD4A084FFF0022513248919E607603CF952A36362C23795296903FE40D7859FA13F686CB4058CB872396777E2F1778C6EF2D582B0A53EDA38214DF110BE331EEE70424913032F95436254BC2A94952542D71A6648E1D6D9444CDC1A4A8FD22AE48D3BB68F9B70222455B4D756C9694B0E2D4E09094495088D472F21D472AD64CD334B82C4317D35AB9B4305ECF0A2E052EF60EE7DDFBC4BDBED236FB4DADD65EF19C305B09F78198CC6713FE69962B1E64CD2820AAA6B46F7A9D78C339929129450A42891983FB1A8A5EF12C9BE44A78DB75949FEE713C20749E629346D12A3541166B55FA1B76E302512D401092736724F6730E1FBE6ED9A0E825E4A808F07DE27CCCFF00A83953C9334AD8258BDA9DEC5DE3099466160821B23CEC18D73FCC26CE32DBA9E2216D000E4E0E1518EC7F61F0A9093835CC75070EE4795EB5E59F3853FC298EC03926A2EC28ED5157340417F2886BBDA74A2E0B6DA1F7018014D00A403CE6397FB3AD49499A70E7E5EE289CC81D3BF377A55E1F4AD90552C15EE8A5CDFABE61F9579C20F63C86C02E3E1B075E3504F0889CE63A7CBD44D6096B9AB4B2147A6668E7FAA1CA30766194EE46EB3029A3D5BCEB9FDE31DED7EF0B67F6612710C4710694CB82438DBA928102082547AC0D27D6AF9B23C3789C79425093BCA6BF16CAFC0FE03422BDC94EF5E7FD30CEBEC6986F43DA1DAC5AF11846C65CBD7F7B70781A4D9AFC585188E2E054E848FBCBA76CCF851B4F18942805004A49B8A38B822A1E1B2B69C9942A0588BB3B38BE64F4BDF45F6437138D6F1D386637BDABEBC6ED2CD65FB0C2AD5C5254F052B8E31261E1EF24C24B607F6933CABD3DE01F86E76761651C4A0129097701E9AB8AD341776CC45076C6DB96310A4805AAC435DAEF903C637170BC1B07C22D6DACF0CB0670CB5B3425B6AD6C5B4B2C3C94A42429E424C29440E23A1E23AC57A2B65E070182C3A50A949DE48000DD1F8C9F26EB157C4635539F7598DFBF3E4FAC5C4EB4979A42AC98436B392894F0A0C18CA3393CCE93DA92C64844D98552C6E8B06B3741DBEC6B08494294A05F788B3126EEC39D756BC0F5BA516E52B0B0A508514446B999CFB919139CE862AC7B0F1387C26EFCF402F4767A5466D6FC67589CC3A928B9761504D6DC789CB8D5CD54D9FB12ABB6DA652B5238F20449CC826791F9F7CAAD8AC08DA2A4CF900250A62C030B72F75393C5736B632589AABD99BA72A37168DE9DD6E0AB432C2D480880932444E5241FDF3ED52985D9AB92A00D599F5176D03DCF1245EF147DA0B4A8296429839005CBD3D7CB2358D9069B21090001023A72FF00433A99972F728A72DA9AFA51F93DF58A5E2120BA83821C56BAF2A7B1A429C0AEC3EFB4D0B46F5B30C7DD623D72F7AD9DEBC5E1CB7926398D7F4F80115B253B800E17D7DFEF38712C86DD1FED1EFC88852B68520A20828820A20828820A20828820A20828820A20828820A20828820A20828820A20828821A3EE34D92A2015467D48F989F81A6B324EF0248008CF5EDA5EB61942885FF00B4AA8198136BF6EBD22D6C5B0BB5C6D05B7DA42873E248394F2907A673FA9062713852A72433D2999B657F76A9895C262BE4021C90C0DECF90CDB80F28D76DE1EE5517CCDC5CE16D842CA491C020C81D00EBD0EB2222A0F13B394E0B2800EF43404D9F2B795227F09B5104805401C876A5EDCDB5AC6B35AECF5EECFDF2ED2F6DD6485405291F3CC8F3923E7509336792A50DD37BB54BE4697E7A44E236900032AFFED2E74ADAB9D9B5176892BFC33C5714B4A40040CA34C88F4F88CF5CE95460FE5A40666A3B1EA3856E087B16A557FF00304C6DD37CC963636AD9F969AC5AB79849930939EB9798CBAC4D369D215BA4B07197AB73EC61DC89C01363625EF4A9A9A38D74B59C413F61C1C49888EB9779EDDB3EF50F89C392E4675E56B7323C985E26E4CF70327B686EFF00AE15E56D5E589E239489CB43CF97AF3FD62A24C9625C647A6B968CCF7E31252A7848157D2A19C5387463E8D10AEE1DC4147864C667E323423EF2D49A66A5EE2C0341A350DA8783FDEB133879E0241DE07870B3533FC86CA21DFC3553A13E59FC2048CFFCE993B4AF7D208343D9F90F7A43D4625259E95701E8E3813A674842D2D9D6DF5B686020019BCB494A5723FEDA98CBAC75E9178DC399885101DC663EC6E3FA6178749C502A636C8022A5AAFEA22C5DB5DD5EC06D9A56CED7ECD5AE22873253CDD9B6EB99F3E258D4E93D7AE7547C76C654D52814BBB801A95A58FBEB50EC62B46073770C39E7C9B5D2358769BD8D5FC18DEED1EE5B6E719D92D176381BF889B2C2D970020A516D6E9C92E2C4AA224CE872AE7F8DF84382DAF89562A74894B98A2FF5A6A5854971D6834ADA2C982C7A53280DE6200706C5ED9F5357E04C60C637ABEDA5B98C69CC3F783B1B866D6EC55BF1A9CC6707B0BEBEBF36EDA54BF13C77086F88849CC889CF28AAEEDDF83982C3E194538745029BE9E1614AD39D2B7A449C9C626630B3B333E75FC3FDE919A775DFC477737B73776DB34E626E6038A61EA71AC52C318798B7B9B67944801D6B8A5292B04A246600033AF2A78F3E1A623040E213865224CC2AF953770842F74B16362D6247F6FE5044C53392736233B5FF0059E85B6C70DDFE6EE31265E36BB6DB3EAB87024DAA1EC41A0662600067211315C50F8731B266EE2028024D81D73A73CFCEB1228C0254086C9ACE03F215EF9D844B61BBD1C2AF8AD4D63D87B970DE65DB7B90A61433238153C80131A6A3A53F95E1433803350EB3A8E3FDD2EE6174F86D33C0594824D4E9E60FBB6717261BBCC43C1DF1F1266EDB6B3E169E0BC87627B453A1E0EA809964D724BB771EEB01F0DA10092814B960FED8449FFEE8E10E5AB6E1BB2C34A2A002969470C18248073CFBE94FA4783E72082892A615FE2FDAD715E26819A103B225A0BEE80012C5AEC73B8D323CA23717DEAECDD8E1EBB84E2C2E16904F84D3E9528F6893AE63B7ACD494BF0D62890912D49721C37767EF9706784FFC244B56FB208A31A6F646BE74AF58C4B79ED47B2B84D8285CA5EF1D5E22521213E285490264F32411D6262BA56C6F86EBC6E1D334C92544554525CB90F56EA78E60444E2F172A42C85123402A939D6AD4CF2B5B2C2D896FF76C31E7DC6B64306C43145BE48652F30B7904AA40808327CBE9575D9BF0B5689809901A87F8E8796A2B1098BDA89DD2029935B1F79BD9DF5156A309DC7EF7F7C0EA5FDE25F39B2981CF1A2DEDDC7ACDC08992149765209232EB273CCD764F0D7C3F32572CFC948008B2780D00C868DEB157C5ED10EE54C0BBD682E00CAF616A9E91B47BBADC2EEFF621808C3B0CFE6F7AC0138BDD32D3EB0B4C92B0FA6089339E672CC577ED87E14F952D2E9600682ACD4B5816FB457311B40289216F53C5891EDB96869995A64786385C0B0320419000C824764881A888F4AB72657F88D2AC2D4A12C3A31A55FF005159C54BF9EB52C3D3B8D6A59EDCA14F00F5F4E7F18229CA092A152473A5453843032FE5922BD7F1D7F1136D5E356B668429292A1324F39396BAEA0F202A4E4E154B1715A37AB5383119D3284FFCA1243B81773A5FCECFFDB1685CC4D7C2DB5C5240809D2644EBA9E43A72815252B66294A02C4B1A5AF5E43A8A645E3076ACBFF9E55AF36CAC3A3F08D8CDDB6EE55768B5BC799E10A2492A4F43DFF4CEBA1EC89224E1820DC5B4BD5C9D39E715CC6E3133662D64B019937BB8A3DCF1E91B8582E0B6D84DA2128400A4A7A69FAE675F96553491BA092CEDD3DDACFC0D62A98BC52A7ACA45100B30CF9F0F662E2617C6DF144493F414992E49D622E7A774A83BD8F7685AB10C141945BDD21540CBCCFDFEB446C8CFA7BF48AE88520A20828820A20828820A20828820A208FFD9, '1', '2021-10-06 01:13:41', '1', '2021-10-06 01:13:41', b'0', 0); +INSERT INTO `infra_file` VALUES ('7e7ed694-2242-46cf-9ac9-0709debcc22f', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F00010000060301010000000000000000000001020308090A040607050BFFC40045100001020404040403060503030401050101020300040511060712210813314109225161147181233291A1B1F00A1542C1D116E1F1175262243363723443538292A3D3FFC4001E0101000006030100000000000000000000000203040506080107090AFFC4004A1100010204040306040405030304000309010211000304210512314106516107132271819108A1B1F01432C1D1234252E1F1091516243362435372923482A23654636473B2C2D2E2FFDA000C03010002110311003F00DB823E07E37221084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210844495A905D25BFB690844CEFE6FF54210EFE6FF00542112497249D4DCC2108421084210842108421084210842113E5CA72E5EDA37F8E5FDF584409B0BEFF48A832DD291CEC0EBEFCDF5EBBF28640BB163C9FEF589085292544591EA6D6BF4B5FDCFAC56D3E0CA9E9CC27213C81D4F958F9F571A341E5CB3721C380059B673BDD8731CDE2A458E1084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084211508960904681AF7BF95B5F4B1E5084574B4598062DBF27FBFD6112AB569240240DD76363A07DE20FE115B2A91552AEEE525D4740399D2DCBF6688173132C6656D70DCF9F266FB31F22AD52A5C8539D9BA9D45BA4531A429C5CDD4679A9461B084A965C3CE7921494252547D85ADB98EC7E10EC7B8DF896A648A0A3A899296B4F892859195D9EC92E6D6203EBD40B1565707565CA14A172C3C5E659F91DEEEC39FD98E958C8210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108472091A184239CEAE7F21FB4210CEAE7F21FB42110EB08421088E5E5CC3300431B1BFCB78437F97CADFDC7E9134CB0A3E005BA581FBF7F46844FE403CC77F99B6FBED6FDF5ED15D4B4D2759E82C7F5D3CB99312D4B63A86EBCDD9BEDA2522C76B588B8B7FBDE2EABC0E9EA249A893574F2128194CA5A996A624B817377673A989130CF529265964EF672FECDF4FDC0A13BAFEE807DB7EDD3DE28A51A1A75777328E6D5312EA96090AF23981B36DFB444813ED995ABB9B586CFAFD3D1E38DCF4955924F5B76DFEBDC7CBB7CE2399F839A3F8586D424AB474A8B7CCE9BBDB57D22AD92078943477D80E6E186D6FA189984B85603EA521A58F23F76CA49F42D825EB74370DF4E9DE2AE9F06A994B428D24FA94AD8A51282944B9B067B1DB4167E514B595D4D210E148CC0789209043EE087048D8027778F8188F155030AD2E72B38A71261DC3148A7A14E3F57AA54E5E9926B6D00A9612AAC392E5E7DB4A6EE352A9715E64D93B8BF7AF0376478971B4D954D478355C85CDCA04C9925612E6C1C91A97B73E4631556373D738A10A704E50C3AE8ED71D4FAF4C39713FE377C39E4E551FC17936AA8E7D63D712B97629F83A9D35352289A1E5287D6E332CE3AC078A10A7257982E53A5442AE77BBB25F80DA8C3ABD18F7194EA5460DDDA54135933F0E896B70439577799446621292A2ACB605A23AD99895553A134A16A5B87094662C5DCB316F3B6DA8D719189A77C48FC465A54DE65E269BE1B328DF70392385A96890A4D626245C3A4214B956CE255AD72CA50B3CAE595101C36B93B99832FB1CEC9E49A5C369B0EC42A24200354ACC24A272032932A5CDCBDE202B79A82EC08B1262EF81F0AE29882906AD0B0951B86B94B81A8D3676208763CA36E98F9A48BC42108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084220ABD8DAF7F6EBD601F6F942223EE8BDF57E5FEE7FE7AC5DB0E97DECC424B124E8767D2FA683CDFE72E62F20F9F3E71F16AF5594A6A983393723241D9E6245A13B50919353CB783250B65132FB4A7802EE9D0C852D4A0404F48ED2C1781AB3184A7F0D254B2AE492439DBCAD168A8AC6258F5D85AE370C6FD1C87F38FACCB9CFD2194F32CAD0A285254026FB39706CA041B84A4951162010445B389BB38C7B08AF932BF0B51967202F284A9D9CE819B661F48952F19932C142AEA0EC437E96D45D9FD220EA994874CC3C9939669402A6A710B956FA9B9097C36B2D8FEA780E5207996B4A45E333E12E08C4AB952E427876BA6A94C9EF3B898AD6DAB1F3E5789533192A0720241D033160CEFE4FE66DAC5A3673F1C1C2D70FB2B393398F9C182A4E6A4C2AF49A657A9D5BAB3853736453E93313D361574E9D2590ABED6E91B25C33F0ADC67C52BA7551E11554F256B96164D2AB280E09CCA32C8486DC9B5EFCA8D58954CCB0CE33F84000B6BF3D6FA90DAB5A30DB9A5E3998DB332A33185B820E1F31563DA8B5AE5CE39C4F4F7A428A92B5684BD2F2D507241364D8AC1725C822DB7511BCBC1FF00073C17C272696AF8CF15C32494A10A992066AA9CA5243AC034E998841D001372DF5D0C5C11C3788D600A4CA9AA0A4821C9D4FF00F262413BFB88B53ACF0A5C6D718B5194C49C5F67CD4F0FE1C9D77E28E5960B9B5C9372D2AA21486DF320C8A682E216B6D6A6DDF883A41755F723B0AAF8EBB24ECAA9552B85B04A2995F2E5A909ACAD44A9EB4AC064AA5497325C1018AE5121FCDB28C2BB37AA9EA419C9233105920816D9DF30DF768BF0C8EE0BF20F8799368605C074772A9A5297B11D7E5FF9DE2075570A594CFD50CE3AC05AD216A32EB6D414949490018D6CE39F8A3C7F1C136827D49FC1296549968968952F30709509729284000288484A40625AD68ED9C13812550E55CC940A7280330727A9D49767BBBF9978BA179B43EE36E3A5C77960250DA96A406D23601B79B29984240E890E04F416D3B46B571071662FC43316B935535282E4E559763B6A412F6BDC876BC671498452D390532D296DC02038D7A9F5043EA2D196B8F39A359E10842108472C59D8B736B4211C42108E1C0D481EB08E424A8B00E758383A107D6111776BFE931CC221208B1041E4434211C421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210844FA64A1535216404B13736D3CC6CF68422EB488EEEB652DC89799249B652971FCCDA33D9C68363149521652A604EA18027CB47EAFD4C625BC5C723736F34723E9B8F3237165728998792932D6366E9347985A65F12B5499D1565C8CC36DA4F3C99664B6B6C282F962CAB01B7AB3F06F3F82D788AA931B46175B2314A29B874F4D57773275209F2D72D3574B98B267C852FBC43A54E5094B125A30AC5513D63324AE5996B4A859401662525C12411B0EBCA30FF971E355C7267261D96C0D923C35E1EC458FB0B48B185F16E209F76B084532B72290C3D3EEF2AB92D4F4321A532A53B32CA91F109790547416D3E8AE3FD8076514C8A7C671E453FE025C84CC975264CC5A97241514B8949695308BF8C0D4280CACF434D4D555F34264CB54D597040D417DAF717F4D1C398E3629CBDF168E294A3FEAFF001308CAFC3D308D350C3F8585065FE124661453CB96769B2AE551D23ED1A438265C46A410E950044758278E3B01E0D99512704E15A4C5AA24A9A5CD9D3545495CBD1D14F325F81447882939D9F48EC8C2B81714A8085CEA69D2D0C03E420176772A04380C5DEFBC7A4657F850E436199D93ABE6AD471667463169497E4EA789EBCFCDD2A6A6894AD7F1EC535C937DA6CB801B3EB6FCAA56E77B6198F7C54CC41A9918149A6C1E42D16A4A7A7932D29CB982405AD0A9C40D0BCD2ED7711D9185F673256941328A9682E4A9C9DB51A1E5616776D6322984F2FF000565F4A269383F0A50B0E372C005FF002FA7CB043A027484879A4A94AB04DBFF0070A8DEE4C6AD711FC41714E25327A27D5CD9C95AD6C01CB636E439FD3AB763D260326484215283CB64B650C7EF41B8BBEC63B8216B492541B0A2AB8E5EA29D2474F3A945245B74936171B474A62DC5F598B2D73271984A8A9F34C2F76D03F5DB5BF98CA6969A9E404E5969040B823CDC8DC17D0F2F5894BAF29C21441458FA1DEFB1EFEFFAFA88C726AD53D254A5BEAC1459B721CB3916BBF9022D1799425D4112C808BBB1D1B40C771EBD62205FB81F389B49884CA4494A40507E6003EFAFDDEF1CAE86503AA6E4DAD66B336A2FADFDEC632CF1A4B1A6708E589D013E9084710844495149D6DA11B31D7EC5E114352AF72771D08FF1FF003138CC9440694C7CCEDD0F3D75D5E2320100A41F262DEFF7D22AA557B5ED7F98DFF3FF001F8440552BFF006CEFB9F931F38965209B8BEFB7BFDBFD22722D6DC6FD81BFE5FDC7D7B47227207E49794F32EC47BEBED10A501249737B31D9BF7D6211C9A8984310961D0FEF11C220F14D50B5DAE76B6E790FBBC21101052483A88423884210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210881DC1B6C6108A69D8D8DC9D477DEDB03E9DCFBF51192D34AEFA95CD94948B96723A73DBD75E9C10E18EF1C09E93969C42E548626989B4028947920B73AABF2A6E9F300A86A4CC3295A2D704A5D0047737635C62384F1F913D73D484A26A4FF00DC22C08D7C4346BBBBC63D88CA5942B32772E4E87FA4860DA37507D23536E2E328EA5E183C7949E7E61C6A651C387129539695C6549916D69A7E0FAD545628F55176C28309698E4D49B2EDFED5E51B9B587BA7D9DF68749DB5765D3B8724D449FF0075C2E8E6990AEF1E655D2212A9AB92015052E7CB26628285F294218B5ED78056270DC6A48984649B352EE2C9512003C8025BD5DE32C9469A97AA5269F52909895A8CBD49845429D392CB438DBD2334C34EB485290A29296DA216371F68B73BDC0D02ED3785EAFB3DC4AA27CC1353DECC5AC851533936D49362082C6C760E6377B87E6C8ACC2E5652851EED2EC13FD20B160E0B333FEB1F40A9B6946E4B6E7F572FF4D81E87A743D7AC74C1AC388054FCC6EE3522E5DBE5CFA5B78989989A39A52964DD8369736BB30D85C72BEA623D62C539CA9D4DA93A726BDC9DB7B4579493E2045C3FCBD8BF3B42282697BF33FA1FB31104060EEFBE9FB4224C4FA74B2887760E3DC06DED08456465A234DE34BE11594E9CC85076F11DB98108828E917B5F7B4552684CE3605F4F08E6D7207203F71BC20B75252404807D77B7B837B6DFDEDBDA27A7079997BCC8A294DC862E5AE47DF58840626E4F20768E2B6F357F3B8DB9D7642C3205ADB12BE67E37EA378ACA31214BCA680962416D75DDC1F2160C3AC40BAA484B25402858E6208F326DBDADF28E40765C2482D2D02F70EFC730B491DEE0320DC74B5FF48BA4FA7A612DD386AB3358EEFB91E1161BFE9146AAC5851CCB9447FE285076D812A53F9DEDD6D12A17AD4742D2B6EDB1093A811616D7A8A4FAEC05FAFCACC8A34572E64B974A65292097B9075DD868FA8D34F3994F52272D412DA17DF4D0FCF660DCA2AC5AEB30F9B4AB21414403CAE3F7DED63E7BD6C220A340528BEAE1873637BFDBB421126A401396DD3E8DFA4211221084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084211C80E586F1C12C09E512936FF001D6FBF61EBEF7DFD3A45DA9EBD32A5E460469B8366BFB0F6E45C4722EDD79DA264A1B5202B40D41E4CC03DC3CD690DB80FAA4211B7DD36F3024989332AEA25CC13A4A88162081A39BE9766362F147572028124396B7273762795DF4BEC748B3EE3A3860A2F17FC38E60E5454E4E51EAE4C51EAB55C2F54994053F4DC452322A9AA10957016F4AA76A8C312EE137BA0D9206E637EFE0CFB61A9E15E21A5A6ACAA250AA900852D82D07205A0B9365A5D2A61B9F21865652AA4D4A6A00395252EC086209BBF4B68469CA3009E19D9C589A66878DF871CCD7669BCD3C8D9C5D326252A0A29A84FD05B9A9812DF64B09594B6865F20A517E529B2491631E8DFC4B703CBE34C06471060B244CA3AEA54D4489B2D04A338493325E6BF892A752AE2CA1A3DFBDFB39E374A932A8A64C7520996B054091A0B0DADBF327CE32B096103CF2EB53CA7505EB38012D1171CB02DEA075F5F5BC799C696661B513A8677826233272F54921DB727A359F431DED329FF00192913A5BA92482481CDB71D074D0ECD14FF007E91669EE165DF5DEF7DEE0795CDA2ED2E532120A4B8006FB795A114131DAFABDECDB188FBB1FD27E708931325A7293621C75E639C2113632D2B1A5370413E96DBF1BFB88D384256BBA50A239B758D2D4AB3683F57F28A682A735E84EB2D8D4E2527CE11DB968DCB8A363E5041E9BEF715B48898A5096949CCA25831726CEE1EDB35BFBF330F760155B35927519B928FF2EA39BED12BB32CCAB5CE7D4DB6DA81239CE064A103EF178A81E4B82D7436AB972CA008D378EE7E0EECF719C7A6CA44AA49A3BC20056451FCCD7D3AF97D0582B71C452139924B1E6D71A8EBCF5F4D231CBC50F8AC7063C27CD2E8B8F332256AD8D2CBD18270FAA5E72B6A52076652FAD691AB62A2C900EFA760237D7B32F817E23E32A597884C9B364D2CAEECCE3DC152121434592A4B3E52CFA81E71609DC6D2659CA24B920B0CCC6DAD9AF7B4611334FF008A23084AD4E764329F878AC56E5A5E6552AC54EB98A996913001584BC8926B0EA14A4D93A8A7E26E01EA7AC6E6F0E7FA75F0E144935D3A9E44C54A4AC04D389AB52AD69802D3DD12FBB8D7CCD895C6414559242AC4B1D12CFB162F76622C5CE81E3CBF0AFF0014762C72AC246BDC39526ACD36FAD335274AC4AA93A832C972C95042E933A5C7143709084D8EDDE332AEFF004E6E11452A946A6466C80A40A6042944071FF70650347F10205AF6347338C5811DCB925FF36E6FAB3BB746F28CA670E9E3F5C256714FD3E898FA9988724AAD3BCB495E2E986D74665C71C4B60B93EE485312DA14B58B38524588DAC45B5B7B4CF808FF006AA2993387A4A664E965456BA593DE3A4256A2494D982439E57B98ADC2B8D25A66ABBC9590286AB55F5661E762CFA9D088CDCE1BC5748C6147A7622C2F3B255FC395B61A9AA1E20A54E373B47AA4B3E90E34E313CC853575A085048D66FB5FBC799DDAA7633C41C233A6A6652CE5A25A94EB32D490C017B5C90C2DD3CA337A5E219152C026E58BBD86E0DACDA797D3B1A545574E85A5C6D650F21692808B7F521476753EE026DF2DE35C44A5D34D299A322C29563AEA41243588B5BF7117E95384D19980490E920E672CECC006F47BDA220DFD3A91B1B8D891D47EC748B7549067288B8B7D2277F6D6D11891084459490FF6DBFDFD94221842108421084210842108421084210842108421084210842108421084210842108421084211C80352E12F72DA08440DC7417B75EDFDBE71528954EA01E7804BDADA738020BDFEFAEE3D8BC4BACF4D26FE9FB1F388674B9281E09BDE13C886FA7ED1CB00097B8D86FAE9E81FD62A00A209234DBD4C5366161ABF2BC40A5650E0666B16DA21B800916045F7FDFEF6F58AA912E44C0AEF270411602DAFAEBC8F2F680513B36FAFF6F6E6D10B82091BDBF7F389ABA7A64FE5A90BF261F7F41CE228883700FA8BC51A800A20170343F7CB47DE10886108E41620F28E08704738811716FD88E23901801C834453E516EB7D8F6FDFE715D22AA5CB9650B979B563EAE03EBD3CA38580B7CD7E56D2CCFF00AEDB44A90D05A12FA8995E6954DA124256439A532802883D6606D706DD6C40B9CE7B3AC46752F12D2CEA72A90942D2B241B780E620DC3381E57B03A45A311A54CC90B940A42969396EC6D7530BE83DC0D63555F13BCB9A8F05FC7565171858692AA560ECE7AA230C660265D854BC8A669130CCA3CF3EEA565A587E42725D2942D092DB8971C2A5870253EF5FC3A71E5376A1D9AE29C3F52906AB09A7993A95130E72B08927F1465B870D2E5A5459C17EB18FF0E53CEC271697384E2B42960283B017748373A9376219A32734CA9355191A555D975B5C954D69AB4ABCCAB5A6764DB969579F690011A0252E03CCBAD24AFEE009223CFDED2307550714E27396932E5A674E4A506DFCC599B61CF56F68DD4E15C7D153432E52A51CC94B024B87CA003A0D5F9DAD1CC26E49F537FC7F0FD23A926D4BA8802C145B968DABBF4FDCC6582A125D927DEFF40CFB6BF2884532A666770CEDBF289A8585E9089711C2108CB24D3A86D2A2A5001B5A5B593BE97156D293B920AB526DEB7B5EF1AC7493A9414C9080E47874D09D7401DEDFE234991532D049D589BE9A5AFAD8730F770C23A0E3CCCAC1D957862B18CB306B9218630A61E61C9EAD5627A6512CECB32D214E284AA9CB25C7D484A8A504A4FDDDCDE364BB1BEC5EB38E712A6AC9348B5C83350804214A49398170183BB80C5F6E822C18D6372E428212A00643A96D6DCBCEECFF0048D287C517C77B32B36F13E23CA4E186AD3B82B2BDA5AA9950C4CC3CA35AC46C6B799717A99E52132AF3772B297147CC9DF68F78BE1FFE10B02C370EA2AFC630F973EA3BB44C452F761225901242A728A4B31FFD3CB71A2E3AAF16C5D73A6108532492EA7B9F27F2F97531AD6572BB5BAF4F38FD42B5529A54C3AB989B9D9A79C9E9A989859D44E9756149495137FB5B017D8F7F41F06E0AC1B094211365C9414CB44B4CB9684CB9694A410004BDB61BFD41C745490080E6CDAD9F7D9C3EFCFD8C64C7C2FF00C32737FC47F3819C1D8710FC8E5D61F769CF66AE36984AD12B457E78AD729234A7D29E5A9D9E665AA0B652B582532AA246D1912B06A1A2654B4A4380583311ABBF2B0F668B6CCAA5DD24DD8EA5AD6B336FB10469611FA207099E0C7C0AF0A78768F4BA264AE15C6F8A25D86DB9CC5F8C2892D51A9BB34020BB3A667524596EA0A994149D29510567A981A9EA3C0A0188003B68DEBCF47DAED78A29B52A21C96670A00DBABDBA5AD7D7CEF8B197063C3363CA42A8F8B72672EEBD4D6DB29665E670DC9B4C36396A67C8940D63430B712DAF59D2A29558DAD1455FC17836292BBBA992950591A01770437270090DE9CE29C622BA72E9043DDC9361CCB0B7EB189CCD2E0F717702B3F53CD7E0D8D6AB593F3532F4E664F0F9539C76A529274D0E17EB55BC245B69B14F4D325D0FD46525CCA3C34B4941753BAA34DBE24FE18B87F17E1FAEADA6A296A9A69D6A49125254C997E101BFA58061B87F2CAF05E21525694A97A91A1606E0EE4F91B7CB4BB9CB4CC7C379BF822838EF05D55550A35728A5CA712A4A8D2A6A554B979EA6D54A55F673D28FB0FCB4C3640521D42C5B68F9B5ED93B25AEE19E24AC948A65CA9299EB0C94948090ABE83567E77B98EE9C0B1513D092EEEC1405C90D62EFCF53C847A2304F29A0A012BD09D601B8D7A415A8136BA54A2549FFC4FB46B857D02A454AE5A81494923996D6EE05F5F96968CC01CC01777BBE9AFEDA457208EA2D16F992B2E8180B33FDDF7E4768E621122108421084210842108421084210842108421084210842108421084210842108421084211015804DB4DDDBF4845449959C82438D4BFDDF9F26D621EF433B5BCFF00B3C2F6DFD378AF142A9A932D232BB31DB9E9E8C4BB9DA057983331569763F7CE097D2A04A54921240277D89F5E9126660F3901F338BBB0D1B5D7EFAC4B34AB07F3A8137607D76F9444DCDEE3AEFF0043FDBB44CA7C34158135795208DB5F5058F5F5D221EEE60F0855FAFCC92FF43AC4AB0A08240569FEA3DADFBF6B6FEF179381D34F4BC9580503C4C41E7E5AB723689D27F332C872EC34274E5CB71D6FA344A9D66E6C6D6BDCF44F7BF7B0DFFB768A19D82A500E59C333B070E3DDC7E9CC44E3945B3026D6D1F5B0E677F28AC90B02E1371DCDBAEC3F7F58903029F32E9989200D5881D776BFE9AC40540753CBF7E51245AA74A54898B94BFCC82527AB59E2205C03CC3C225C21084210842114B58F886DB5A0A9B1CB5382D70E05B9A1BDEFB09758E728906C937B0EF97F0E4DFC1257581B3A7300C6F74FCC870E1F66D629AA4781F2924050059C0B5DCB86CCE0462C3C65724D19D3C0DE67CB3A944DD5F01CB3D8BF0E16D1AE624DCA234AA8CCBCD28F9D097D0C34D5D3FD4C9DCEC23D36FF004F9E3A9838A1587CE9AC99B3E63A0A892B42800A4905DD2A4B823A9058968C76988154DE27705FCCEBA16BF4B74044590F87B6613B995C2565156A69D5CD56E8B26F618AA4E3CBD69667245D409D0FA89BA54A957A502924DEC81DAD6EC8F8BCE19A7E1DC76AA6524B299752B339194312263A880CDB96E6D62F1B1FC1554D22592C090010DCB53A33F2EB7D418BCB3D4F4EA7A74FA7B7A468F041201259C3DC73F58ED244D3AE80805CEFD086B7BF3E5108777D7E5FDE2B654C09DC17DFA9E8F6D3D37E88E148CA1DF5E8DCFF0068AB4AC2B4E57F97EF0882228CABCE16DBFF00D73B32DC8B0861C616F4C2ACCC9A582B7A66A13248F2A1965C4AF5764B67CC3B751F643D9D5671A6334F462495A7BF77082A073252004B0D2CF73AB9D75D0AAF9A64B9CCE6F62430040D36EBD75F2D0FFC707C52710F10398F5CE1D7292BAE7FD1BC1B55758C413B4F9A534711D592A0C541F438D2B42E496DCB32C2028AACB43BB0EDF46DF08DF0E949C13C35455F5F448556CD22A2953364248944A53926AB33292A494920338B17731D57C4156A9B50A4A56486655C39E637B0E6E5892DD75CC0E294DA92A6FE1895950972BE6ACA36D2B71CB24DF75586937F58F4CB0BA69384D025084244C291994078896F5F5FD230D9CA52CB3800D85AC06970FB7DE9695282E292817256A0800752544016F7DE2D53A8AB2BA699A952B2A1454C1F4776B72DFEB13A54ACC924DB28E409FF001E47773BC7EA6FFC3FDC2C61CE1DBC39B256A32B20C3788B38B0C51334B115614CA5152985D769A99DA7D39F5DB5AC53933B34DA35AFC9CC20246A317112A655242092484949BE9B6B7E5BF5D358B74D925CAB53C8727D75E6436FADA339127284B2D2DC74AD6A4056E9B286C2C93B9B691B5FEB6BC4B4E16A924AC28050D6E46F716B9BD87DB514C96924D806E8DB96BFDDA3E838D5D011AF4EAB017EFB5ED6BF5B7CE26A8D42C77685293DDDC90ECC39DC587CA28A653898921EE3700797A8766FDA3AF54687233327372932CB532998977DB5CB3E84A99984BADA92A65D06E9E5BA096D7706E851041E865D7D18C7B0E9D87D534C4290A490A16636D0BF9D8BB599C08829C2A9E6A402480C4598F4B8361766FA6B1ADFE526246F86BF10FCF8E0ED15112B8533265A5738B2BA9732AD2891AFD525A9F51C534BA7B57D09A73530E56E6101AD23426E509DC8F1AFE377B12A2E1FA2ACC6D146801A62FBC44A17CC933029652FCEC4E9A79F7070C5794776E45D817360469D75B1F6DE32B1A349B9042AE42EE2C39A9252E948EC953816A47FE047BC7815C47290BC4AA9494B253354966FE82DA1BD88F23CDE3B9E8661994E8512E4871B3FB6DB73F9435EAF2FFDBEDD7EBEDFBBC6213D000D1ED63A9163FAE9156033F5DB61E508B54730842108421084210842108421084210842108421084210842108421084210842108422242731676FF00205BADFDA28272C8594B5B5F573D2117DA296094B00A1A03A03BBB31DF9BF5E465779D3E7FDA20A525092A528A529054A501A8A401724276D440DC0B8B9DA332C3B099B5F36548A74A95327282101092A24A8848B80589275D1E38554A6482B53654392E761ABDADA6BB34790668678E5464DD25755CD2C7587308D292D17C3F55A9B01F521214A24C89525C3B0FBBACFE368D91E03F869E28E2B5CB4A696A5417909FE12D4121577D183F561637D445B26F13D32092932C120A5C3055AD6BE9D6DC9C02D18FAC4BE365E1DF85A6DD929CCE2929F536E9639D214A6D52C4A7FA9A26747937201B0B9BED1B172BFD3DF8D2BA9C4CA6C3EA56A290ACA896DB6CEDE7CAF7D18D9AA78BA9E5803BD272BB15A9CBBBB390E481ABD847AB65478A670339C35993A5611CF5C38AAB4D8024E4EAE19A6A02DD2004A9F334E849510906E9EDE9B46118CFC0EF1CF0DCA9AA9D4159E2709CB256A2181D9398BDEFCF48974DC5F2EA4AC256924725358D8824DC686ECCFE76BF192AED32A94F6EB3489DA3D425E7480CCE532A08AA3136950D490C3CD2121BD5D6E76B6C235478FBB18E29E1A9B34CEA6AA09959BF32169208BB9B3B80EE0B737D1AF94D8BF7A52010F66BF26B31D5DF979B3C7D7438B99681374150DEE6DBEFD0EDFEFEB1D1B35389504C5217F884149218BBB827672C0B5CB73EB17D94B331399811D2EFA6C3CFD3AC5609D2026E55A45AE7A9B77FAC5B264C5CD5AA62C92A5172FAFAF5E71562C03F288C411CC21084210842291F2BE8737B04DBF32477BFE47F18BB505412052B3898A6D1EC4DF96D667F944339FB85B6CE4DFA06D8E8770DEB1E3BC43D065B15E48E6F50E698130DD572E317C886880A05D98A34DB4DAAC76D94B041B5C6FDAF1BB5F09956BE17ED270BCAA2913932D44681D6A20821FF005E83A61C89853582C7F3366EAF7DDC020BBEFBD846B2DE11D5C99392398B84C927FD2B99B5861A6093E444E38C35603A0FFF0017A7B778DF8F8C897F8FC428122FDF6134D5414392FBC1AF4CAEFB9B35ADDF1C17519A4CBD1DC020EFE5D5F43CF668CB4479E4A9241286163940276E96376DADE71DC32A6121373A0F22390F4D2DD6110F766E19C0E7A6FA3F9B721A5A2BA5AF301AEE41DF58449A84B240218A4E80D8DD9E2E14CA398A6CECC4F36DC422922B23E178D9F17935C2AF0818965F0AD4E624B32B3464A6B0BE1D98979A32CFB54D9D6BE0AAF5261E4283A8765A5A65443890157652014E916DDEFF004FBECE287159B49595F432E69CC95998B9799921293943A48CC6E120903335DDE3CD9C72B6727334C22E580243EA6FC9831BF9911F9C25467266A939393530753930B5A5D55C90E85BAECC28F4DD0A7E61E5D8F55AD67A9263E82387B0D451514B19085327C4ABAD59400092752C00E6C00168EB4AC9EB5CD27312391F7D01EA5FE778E1A1050A51161AEC16475568BE9076DF4DCD876B9F58C8CA94AB124DB4276F2DE284924B9F362E7EA7CFDF68E632E8967E56634EAE4BCD3A53FF00772DC42C8FADAC2262274C96190ACA34616F3D1BEC472662C2540288041702C0EBA8DE3F5C8F081CD2C3B9ADE1DBC2862DA14CA1128CE51E13A0D4E4C283C69F896528F248AAD397A2FC84C93E80D213B69D4404A7A454CB190029B12351D768B4AA6ADD5E32C4DC3D8B738C9FCB1525B4A1D480E2494AACABEB29362A27ADD46E6C45C5E261512083BFEEF1095920825C6CFA81B0D741CB6D2394E1BA536483E636EBE5D8D8FB1DEC7F5B4429480261DCA093D5AEC59B4D6FCA244D52865092C5C6DE7AF43F6FA470E614BD0BB69B86D5E43B6A2524E920F5076041DBAC51519589732623F302AF1004E5653A481B335BA81D627A91FC30A03C4DAB39E66E072258C6893E22DC4BD3E5BC7F32127B0756D2FA7071C3D80B10BAC39CB765CD7692D48CFD2F9A8513C83FCC9D65E6494A4A4AD2A4D898D69F89CC1A8B17ECDB1E56272454A95433D402C02954C492467CCE6CCE1DEE1ACD19370B4C9A6A129CCE01F26736B3D83FE84738DAC03A5EE9A8730735209B90DB9F68D26F73E54B6A4848EC9000B585BE4DFB56C29143C438AA6911DD4B1513825080C01EF09D9ACCC06DBC6C3E1CA50A79409D833ED67B68DD03EE2C2D11D3A763D7B9F5F7BF58E97A70B54C2959516D5CBB312ECFF4DC6D175413B926DF3FD37B44A2F7B7604837EB6B6DFAFF009EF795501215E1003BBD80BB9F7F3E7E7132268A7842108421084210842108421084210842108421084210842108421084210842108124036F436DBDBF7FDA2A6453CCA929972802A7B9DEE6DA5CF5897952661240717DB90D7F7DA292DCE5A52544DD6A0D25294DCEB7886DB51B90129694A0B593D12937BF7ED0E19E12ACC6572282992A3513141072824E626C2C2E58B7937A52D6AE5CB92A3605AECCFB0FAFB07D630B9C78788DE37C298EE83C25F071456F3138A9C7336DD2AF28E0345C16C3EFF21BAACF3AD3730A945CB235CCCCB818D61B45F736B7B05F08FF0009F22A25D1E37C5583CB9D4D29529495D4484CC99316485044A42C329B3254B24A4049719882074F71062D52852E5CB9EB009219C84D9FF31E476B5CED1E8FC3F780DE12C72993CD7F119C7D8A7890CD4AD25BAC4E526AD589D7B07E149878077F94CACAD41E7D13ACB0B245BE0D841BE92848DE3D8BE0DECC3867014A1386E0D4D440C944A5FE1E54B946621398B4D08480B3E220E627D8475CCDAEAA512553944B96BA8E537FCBEC2F6B6B17F156F042F0CEABE1F3499AE16B2F9B61682D2E72430ED1A995DD3A059C62A6CCA1782ECAF2AB5A4DF73EDDC48C170F93232269A58480080122DB36835636B3FCE286655D428879AA2483B9361AB07EB76D635CFF0013EFE196A4E12C27883383821AAD453354677E2EA1957594AE75C7295A1E79EFE52F075E6FE2590D14A161B68A750B1DE2D8BE1AC2E7A66AD54A0651FCBE1777D1872D47BEED558755AA5F7854B2F6377363FCBBF93927D235DFE12FC4FF008C2E04B158C2B278B6BB3384A97555CB55B2DB16CECEA69B28CCABA1A7E45EA7BC5F625665F4EA4B2032A2C7248DB546B4769DF0E5C1FC7D4F5B2D180C89752B4AC99F269E5AD73164165CC0420BBB9529C936B168BCD3633552E7272D428070C92A622FFCAC6EEFD00667777DE63808F124C92E3BB2F64EA981E6DDC3F99547916062DCB9ABBAC2E66993250034F353C5F52E7DA9CD330B963F0E8E6A1A5393225DC4B4DB9E15FC547C22E39D9F55D5575350934C5739525726593296259F180C12465702E901EE1EF1DBDC3F8D2A621089939401482A25442812465601F5DFC5D37719109399334842D29284A9295241595948236054A082AB0EAA2013D6DBD879BF5342AA3993A4CF9051325A8A541408292090400C7FB1E519FA2A25AE5856619983920024D9C8D407F38FAA84690751D5F3DEC07B9FCCC6315292262B224848D407B12778E33B90C6C5B6D5F96BFA7478A04DDC3626D73B76E9E90414849CC1D4D62FADAFFB83ABE913C0F0126E5DDF95D9A2788220842110006B0A201005AC7FC743FBE9175C2552D3500A920A8174A88D2DFBB1F488165C141FCA41717EA7C88B79C7C5C4F229A961DC432602344CD0EA4C2D0A48295A5C96712A4AD3B85055EC41DADB5A3643B1EC4AAD3C65844E97394858ABA6961492CC9135362D77B9E5AC6258A23BA9AE9606C5C58EA7705F560DB316D63524F0A843D2353E25E981C586E433567D4A6428F2D094CD3C52023A0D3BE9DB627DF7F5B3E26A8915381F0DD62E5833D5C39440CD6B96EF8DCF477B9B5DAF78EDCECF14A5E40A512925995B9E9AF4BF94663BAEFEBF48F34B12795316124BE6587D086FBF48EFE4212508B3002C3E9D1C7368459BBC5FF51E7AFDFB6917196125CB0D06C377844D98B52A5241BDF5E419FF005DF94562404FE5B6DA98453C45994773CB58D74FF89873BA7313711F95D935293EAFE4981B2F25E6A765D0E12A454AB55AAEA6610EB62C017251B9548513AB4E9DB611EE47FA7C70148A3E0D935EB97E2A89F2E524140007712E54E5282B7244D01B4D0F48F30B8867113160100A42947AE674BF2D9B5B1B6ED1AC53056865AE6274152494B5727949D6A4A51A8EEAD93AEE6C6EA23B47A8D3A522494CB400025212C2CCDCF4BDFF00BC6066667274606FE77789D4AD42D6B6F7EBFED126110510A001B8006F63BDB6BFE90810E08E61A36B4FE1E1F18AC39C25D55FE13B3E2BAE48651632A99AA612C513CF38E53F0954A69E48765E70ACFD8A2643E82A08D69499717E80C578D07908B71483A8DEFB7BEF1FA0EE12C7D84F18D1E5712612AD5371361FAB2133F2558A14FB351927E5E6ECEB4FA48712FA50B4282820B29D17D361DB9F46FBD638CBAB004B921C580FECD1DAA6EB52D28CA9D7961080DA9E0E00E14F293F7493A079964A4580B00A3BED1CB7F0E6916210A62CE1F7F97D625CD466CA00D54010031DCB8BFDDBA88C417895F8B1E49702593788ABF5CC4B213F9A73F4FA9C960EC094F9F969AABBF539995986693507D8967DC7A5E5197D4CCCBCB7101686C28F2CD8034D87247E126A9475CEE79DCE836E7EFE95C6514CA7B3117D7C9BD4307E863F39EE1AF31F317895F11ACBBCCBC635176BB8BF3033BA8B8B6649042993395965C769CD383CCE4B53244A9D6DD524297F0C905B48248D70F893C424C8ECD3880949294E1B5054B0CE8374A4B13FCEB64D8D8289170D17EE1796915492080730B36A4060E4793E81F9EB1FA7053D85CB25942D5AD6D4ACAB2AD5BF99A966907724DC8D36B9E9E91F29BDA75548A9C57129BE1635338D88DA6AC3316E5B01D3731B05463F832C0B30FE57BDBCC3E9FB5AD1CE70DD57B761F8EFFAC74225483357959DF6D72937D1F6E9E80697397A9D45B7F3DFE71407DE55B6E9DBE57FC7F3EBE916CAAFFBA5B460DCB53136278A6842108421084210842108421084210842108421084210842108421084210842108993A54AD0490AE52962C2F7D24DEFEC122F7F6B7A45CB099FF87AB44C37495841D6CE017D3CFDE244D59439B245AFCC373B6F6D74E66D1615E23DC5B49F075C2AE3FCD6626A5DBC4F3126E61FC172B30A08F8DACD50269C9750E00A71B5C999BF89416D0A512D0074DEE3D20F841ECC6A38DB8D30C5FE1953A9BF152664C640565928295CD5B16072A12B56AE74E4630BC771212A5AD94C729CA3472CC2CC2CEDE641F38C7F7F0CA70E4ACC9C2F9BBC7B66DCBAF10E6766B63FAFD1B0DD62B0CFC43F254095A748FC5B94F997F5BA96DD7662A124129D0121AD43CC6C3E9C383781306E1EE1FC2E9A4D3CB94A972501084A06601878CF86EB5125CDF4CB7023A6715AEEF262813E2510E59C5CED72036B6BB5D89D36E51470E34D32FAD33086957487D943AD6806E94A585DDB4A80000700BF4BF6B67E8912245929003B8B00A7F30FD3CA31E5E562029C10406705C6A1FD9F48FAA25006424E97AC494F38056956C2E8041081600694D8003A5A2298A0B0A01094B800336BD6DF3B9FAC52CC3A1F3D874DB48F873F467E698790660B4B7016398D80AD32CF022612126C2EA096C2556051BE9EA6244A94405CB2582C8DCDD9C33076D7D7CF5972CAD2E017059BAB3907D3AFD05BF372FE270E0AF0EF0F5C624866EE10A44BD270867A4A556BD59A636D2053958B6526251C9FA8CBB2072922ABFCC82CCA0436D491964F2357315A66CBA9A5C1A5F7EA405E662A0525F7B1046A092CEF1512D531335C9B6847EC6FE567D3578C0C70D3C48663F0A79A18533432D310D5E9556A3CFA5CA9309A84D2E4EB34D0B42BE0AACD15944DB2A4A2CA2F36E95AACB502A488E9CED13B3BC17B5DA2ADA1AAC3E9A689D22684AE64A4AA64B59493990A5A5C3DC162C4B1D4465F87629324196D30A7291BD95B31BB68CDEB60E1BF4A5E0238CDC0DC6A70F58433770CCC49B35B72972F2D8EA84CB9E7A262465A422A32F2A8202DC9144D22650D3CB432484B7F6635587CDB7C4FFC35D7701F18712F7744A95492EAE72E4A8206554952D6A429243A4023290E5D88700C76A6118D77E99633853B0D6C08DB9E85DDB5B45EECB3E5D970FDFECDE515360D82C364F90AD276495274A8004FB6DBC79E35F469A7A99B2169CAA4A8820F47BF3BB68DA18CF698F789045ADA6CE43BDBDAE2FAF58AA079B55F7DFF000E83FB7CE31FA8484CC2069EDA74FBF95EA492C0727F7789E2447108420ADDB206C6E77FA7EFDBD62AA842BF152C8D2CFEE7EFCDB918814EFD0254FD1C16F7FD23E7D4965BA3D4544836937CA947FED2D2811F203A8B7AF5DC1D8AEC61C7166119BFFDF69F7FFF008A1CFB35F95B68C4F15FFBC860C1DC3EACE34E572F668D487C2E2FFEBBE2CD03CECCC667CF00BE9A15F113009481B13BF7E84C7B2DF11CA95FF15E1B040FFF0067A8D86A481DE9773CEC0E9666BC76BF6761CA741767035D1FA79FF88CC3A93A075BD81ED6E9FBF48F2EB1663394DA15ADADD7972E9CA36165FE44F94489248B9F5FF11645000B0E5FBC57CBDFD3F589A2357FDB479FFF00E222B2112A11A86F8FA2A61EF116CD7F8A4287C3D3F0DCAB416A0A0CB7F0DAE5C36029574BAFB8E005174A557D453631F461F01E8454766B87CEA719A4CA9B366A94001734D4EFB87B252EDD23CB4E270B4CC9A4921C33E8D73AB585F5D4FEB852056E152C8D94ABA45C6C90026C37E9704FB5ED1B9F2ABA4D5CC9DDDAF3144C2820BB82ECDA6DE7BC60F48ACC955DCE67F4D3EC40A48DC88AC4CB5AEE90F157108196A4EA3DBEFE908A8A5A9296594A9B5CBAD84A9F66CA423E2125252B52C23587507514A9BD4012AF36E22789C860EF61CA38EE147407E4797DFB7AE453859F156E37B84593628F94B9E98B9BC3AC329699C338994C5768B26DA7492CC90A8AE7D68641012D37CA6D2DA0694A520DA1DF23AFCFF687E1D77B1E9616F9FDFCA2EDF31BF889FC4C330A82F501DCD795C3D24F4B99375541A0D1A4279D4A9050B509F95916266512412B4BB2CEA5E4B81200092A22A64A84C4CE4A43954B20381AB8DCE9AC4999216921405C313B3A6FAED63BEBEF186ECC2CCBC7D9AD89A7319665E2FAE63DC415175C7DFAEE21AD54EAB5F9571D24AE5E4AA35079D7DB92255CB54BA6650DFC39E572CA7CB16B33E5D052CD97395956A0B012937054AB5C7D91CAD1397365AA5F77FCC5218368C2EDA5BDB95E3315FC3FF9033F9C7C79615C58F49BCEE1FCAEA05671954A6CA52A949279B949FA5D34BA4AAC56E4EBF2A86DB692E3A0AD2EA921B05C4E8AFC61717D3E07D95E3A99F552E5FE2A44F904120AD484CB54D4A5201CC06748753072E1F6395F0B51CCFC44B594380336D72E3D1C0E6413D748FD0EA58ABEFA9455A8ABCD7D942FB6DF976B5AC7A6DF2C3C538DFF00B955D6AE4954C0AA9A8208D6F315CEFF00DFA391DE7492D4254BF0B0B72D585BD79FED1C85904EDE96FCCC6094C99A998553028073A91A72B16317048235163F5FBFBD629D8EABF6B9BFE000FCE21A90E429F98F3B9D3C837CCC4713452C2108421084210842108440903A9B4210041E97FC0FEB68316762DCF6844610888049B08E0902E610208EB0041D21108E610842108421084210842108440AD4D942D2D9513CE6B620795C975807A816D6A03CD6DF71B6E2FF004B228A68A144A98F55327212B961C162A606E189361AF40F1435CB08965FF294E63B1CC0B01EC1DF6F38D3C3F8A0F3927D998C94C91929C537212B2A8C5351924A9612F4F4FD46724980F1166CFC3A5B6267515142529BDEE081F473FE9C3C0387D3E094B8A55CA972EA57202BBC29752410A0438048EF12E92E7425CB061D41C4756095B1163A6BA69736D6E4BD86CF1B007F0D366050719786565452688B9555430756F1461BAFCBCA2521F91ADB7569BAB3827084A4EB7E9751905A57A94DADB75094A8A8148F5F2A27833E549A7F14B9210124386012FA300C19F9FD63AAAAA62953924E85403826C1F90BDF9799D4131B0C34FA145B0370B0AD2373AB47DE3D3600DC6FD77B036B45610B37CA03B3B9DC8DEDCCF96D6DA5AB29D1F9F4275DCFE91C852D035592A2ABDEC3E5EE40E9EFF58890145EE9037D4F3D989FDFE929692A660ED7D5B9347CC7275925C0B250A6D362DAD41255AAF7500090426C2E6F617173B8B4D989C892B749510E3A14870C4B6BC816717244474F2AE41B01A1E7A92CE03B5BA1EAD7D18FF8BBB1961D5D5786FC0CEADB7EB32CCE259D532563E2A5D970D092DBCB4121C2CA88202C02D9B1B288B18B752CA975B5193123DD49CDA90F606EE2FD18EFE6F15F2E5CB6770FA12D6035D1B5F73A794693201698E7B6EA14F3CAE5AE59492A536D9FEB2549D1B586C95157A6D1578CAB0FC16405E05304E9A43148046BAB93E77B9D40F3E16E2E0D9DBFBF97F8BDE33AFE045C6D4E70DDC51D172971254D3FF4D7399E56139E71F7969A66199E9971BA849559C973E65393B35229930B9665E712A9DBBA10DEB58D0BF8BAECB29F8AB822BF1AA697295898C3D73E7CB5A56A99316A081DDA08429399398B66284324DC1201CBB87B114226CA4155F380AB8649626E753A36E5D88B1263F429712C89979A61485A109974256DA8299529B68257CA522E85252A05374F955D52542C63E587B4BC1EBF01E2BAEA3A89264A935335013A394AD419AE188040E40477DE1539132421492E08076E5B0D869CB7B36B505C24156D6B0BFE9D3DAD1D775685A56952C315005BF5F5E5B45C0AAE07325FE67E67EF9453E6E9BFE5FAC524090358748473AC414404D8F53AADF808BCE132D3DE77930003F95D892DBB7420EACF66EB094952AC1CE520F47763F51BC7C1C4EFA65F0CD79C2A09535489E741BD800DCBB8A2A247A0DEC0827B46C376254D3311E36C26928D39E68AA9134A458E513439B1E874E42313C70192B0B5B0043004E97BBF262395F58D4B7C2957F113FC4D546C541FCD09E710E69235B6B9B994B6A04F40A536B1BEFE5DC0045FD71F89AAA12304E1DA252DA7CBE1DA24AD1C940CD7D35235B58FA34769F6673133CA3BA72CA0E0EDA077E4E35D6CC63316B3A80037363EDB903E91E6AE2293366A8A468B53FA98D8947E50FAFF0078A69040DFD7FC459A62160DD26C1B6D6F15C8DFD3EFE713417F9123706FEC3F68AD009D2112A39C8AE5F31FBC6B5BFC4959293D8578B9C0D9A4C53DD670FE62606A731519C505043B59A1D5AB2E3CA2A2AB95094764C7C82447BD9FE9C5C6D4B51D9DC8C297350152D4165C87509B2254B091AB5D0E7A5F58F3278BE95CACB06208D18D8A8D980F61FB46B57CEE5A83695EB4A755943B8E62BE43F1FD23D0B451A28A7CEC8434D98A592E2E4DDFCAC1BD6DA475A53CBC8953867516E7EEE77FF11CA26E807D6DFBFC445F29D7952E1BCDF99E9F7789F14E219AB37D1DFE675F6E5A73D842114D1CFE2903FA8741A7D6F0843F168E6BF6FEF1239D07CFFB18953A6AE5CB59964F785242403725C37CFEF588913133C94A7313637E4FE71C995A6CF4F3CCB124C97DF9871B6589746EB79E7561B69A4FA95AD4948EF73D7BC627553A6D252555762CB32A54B94B5669849484A743A9D0072C09DFCA3958795CD0A4A4963A1536AF63A077B6BD5A3F41CF012E08A7F864E1B99CC6C6545FE538E739C1AC4C2669A099C93A126589A7C8254429486A69A95969CD09504A8BBA88B931E0CFC7976F52B12C46AF86E96A52BA294A54840490C52A27328B7E6CC492333A8021240668ED7E1AA254B420E5736B5AD70C2F63943FA69B88CF280802C84942412024DEE3737EBBD89B91EC4478D756A93DF4C54850295A94B600B3A9449FAF93EF1D9D252532D20F9FD3E87D62316F9AAB126CFAB72FB689B08A098B0A7DF603975FF10844984210842108421084535024FDDBFBEAF4EFD47E1EF1588952B2A54A372013AB071F7FA4226009B5D23F1B9FD0FEB102BB80E01162C0B39FA5C75F9BC227D27FED3F844A3325B6A0F4FBB420411D411F3820CA53955883B39047A3B75D3A6F088454265D3AC7B86757D0DF4842E4F5378A79A84CB5654B33025B997FD1A108970842108421084210842108422520907D01246FE88BDFD8DFFE7AC5DF0341FF0075C396C1BF132EE6F70AFF00163E6D141884B0A92A24EC4F930219FADB6D4346887FC4CAFCEAF8AEC0ACAD0F3E0E07A5069B48251C81569CF8ED7E84CA73436AB850558820EF1F50FF00008B4FFC0E926BA33212942C921C20CB4E501CBB39BB753B3C748F1120898B4904D981D77E5D430058ED73AC73FF00877BC50F0FF0499C95BC98CE1AFBD49C96CE6A8D3A625EB69716E5170C632D4CD365E726DC1AD1292932CC9D2A56717A741E5BA5C17D4A3E97D1A02E6A948B8CAEE1DC11772FB696D35F4EBA9D2CE77BB82EDB10496F3DC1BFCAF1FA44E18C6341C634762B3862A74FA9D067A465A6E995B9175B7A5E7989C4F312A977104821614149D2075F58BA051D4BEBA13A91B9BF9368FE912F22B97CC7EF1D9DAA830F21B080A4AAC752549F30B6C4281DF7EBEB623D601B7246F6E63471BF9432AB97D22DD3886E21F2A7874CBEC519A19B18A6898530AE19A7CC4D4F4D55A65B61E9D421B71C3234F0ABA9C987F9605900281D3BEFBF1356E05D8DEDCF466DF6B368DEB13A58660D7724DFC98F46F9C7E54FE2ABC74563C4178B8C5B9CAE4C4E1C2F4F666F0F604919A52912B4DC274F9A3F04B6D92797F15556D4DA92BB29C713284956D78A39A3327762E0B6CEDABE8F7EB6E6D13D80B0167D99BCFEEF18D98B7AE4289203100D8E96F93F56F9168E79F97DEB1DB702E239CC278AB0EE2191506EA940AE48D4E5A6E59CD0F32A62690FB3A948526CA4B2850513E9B82230FE3AC1C62DC3B5D4EA405A0D3CC95312D981CD2D41208B970BCA459EDAC5561072553B16CCE1DEEC6DD3426F1FA9670479B433BB85CC94CC433089B7EB781E88A9E792A0B71CA8374E956E78BAA1725C3321C2A5124924F61B7CB97C597670AC1F8EB1298B9441975B54E5807095AC39B6B6B0DFD9F60700A90A9090EF9909239BEA396D6B72D62EC9E074FB0EBF88B468662E3255996E5921803B36B19425CA8747FBF7312B3D07C8FEB16B8897A0F3FD0C15D4FCCFEB08893A0F21F48A6BE83E7FBFDFB45DA816020A7FF26EBCFDAFF3B17885133F8D979DB7D4027C8EBF28F38CD99844965C63A9D53A5A12583710CD05DED65314F98706E3A5C8F7B7422F1B65F0B346A99DA9614B667EEBAFF391B06BFCF5D34C538AAE84BF2D1CF3BDC7A9E46FCE3564F08C6D7319759C5592D8D355CD5AC4B7340009129301D1BDAE47FEAEFEA3574F5F4DBE2CD229EBF0B4920146074A0BB6A0CD2DE77F33B4769763F2DF2962F98DDDCB59DF51D7E96B465F7A479C33D6A54E98C4B672D761AEB72DE87CA362C060072845BA6AD4545F4FD9C7BC57A3F2F9FF008FD21125C91724FADB7FBF78AD46A7CBF5108E226C7C1F19DE0B4F18BC29D79FC3B26A99CC0CA8969FC4185A4DA6C7C74EAE5A5933B51969274243F3C27A5D86E5D896438EA4BFCC096C294ABEE1FC0D76D5FF0012C5E870C9F53929E64C44B9C1D4A025AB2A145AE73252E52C1C1D2E43F9CDC4F499D2BD0EA43D8EBA1716723A0D06B1F9C756E9351A2562A547A94B38C4DD2661EE636F4B19679A75A714C3B2B30D290D943CDB8C28A9B52526CB0A293AAE7E8338771F18DD248A90B42C1968216852568525690A0A4A92485020D8E8085070416EA1AA94254D291D4EE2DB38B7A7468F9BAD164137E6BE0ACA7A048476D3DAFABD3AFC84675217E1D5BCF4D8EA7D3974114D118826ADCB69B39B020BB5CDAF77E50D611144A34A765003910EDD1DE293854748483E5209B5B7BFEBD7A7D7B4239FC29FEBF94576D066661A4061B702BC802DE2CA12A282038541C6C158EA946A3AD5646837D3168C571397858913E6A4A922602A00151290E48600DB726CC05CB457E1F4C04E2E41195EE05AE2FB7DED1B217826F852D57883C6949E2033A69150A6654E079E6E76834DABC9AE5063AA8CA4C85CA2D2C3ED365C939598487C2ACDB534D4B00A53C976CBD09F8C6F8A6C1386B876AF0AC26B244BAD4C832E68913524A49967C2A54B252E34201707C2A014E233AC2F0E4CCC85B706E350DABB3EDD5F7DA37B6A733234A97A653A932865A974F9344B4AB01BD12F2ADB4D169A6A598B06996DA42434DA1A4A52840094009000F99DED47B40A8E38C5EAEAE6CF54D98B9F3157249578CB00EEE436D6DA3B3F0CA04CB976172035C83622F6B8B73D343ABC72DB37403A8AAE546E7DD6A36DFD2F6FA475685AD28F182936B10C6C00B69A90EDD7945F48CB6E407D044F14D3261248D411BFCBD5BEBCA38844984210842108421084210844D4C89AABA65A8BF263FAC482AB9015BD839DEFA74FF0F103A7FA9447A5B56FF86DB7E31552F0CAC9BF92513CB5BF93031095582893AB0777B7CC40AD29BA82D4A237B1D76E9EE7FCEF157FF1DC448FFB0CFD2EDCF43B7AC449582A00A89726D7EBE8D1444E952F416C01EB6FC2FF00BEA773D224AF01AE95732D7A12E34F7D74E6044C0800B827CB6DFF00B7B47209BF603E5B451AE8EA2590152D449BFDD8446CDCFD4BFD62112549524B28107AC2110C210842108421084210842108A0F95843AA4B6A559971B4DBA5D6855D42DBDD3AB6575DAC3A45D30EA8EE6B284BB659F2D4DB125635B7D878A7AB4A4C85DC151492C5EC0386E4C777E76BC69B1FC509960ED371AE46E67C934EA64AA987BFD34FCDE93A04E07A7D7A1C73BA87392121449E9DA3E913E0031C54EE13FC30983FFC24B9A849672651CD30870EFDDA4826D61B474BF11A1A6662C0BA92E0B7E6240172DA9BB967363A46A4295292CA5B6DD1F60F1967E592E061B525243EA7004A9096DC1CC2B4BA08536AF3852542F1EB360159DF216730FF00B761ADDBAF37FEF1D753D0339F50390626C3561A12DE4F1980E0BFC7038EBE09E52570F609CC16730B064AF290CE0CC7D2D51C45252D2ACE94A25E5AA3CA7A6E59B4A404A3913C8E5DBCA5317DCE797F9FF3B3696BC53F76798E9F7B7CE32A158FE2DBE2DA7B0F3F4AA4E45E50D0F104D36A73FD4F21FEAE985D39E29D3732957AC4D49385253CCD2655C45CD88B6C78CEAE9ED1CF7679C60AB8BEF123E2C78DDABBF53CEECC7A857686E2E615298629B309A761A6CBE525E0F50E404B493E404B496D5372CEA9002B96A054BD52E62CB82C1DBEF7B7EBE91125395F7FBFBF68B0848242B5F976404A13B22CDEA0D809161A5B0B5040B79352B4D813112015B01FCCCFAB72EACCEC62284550A64B1B3900DEC03B1D3FC984519770B538D36CB652E38A75C538AD92B215B7FF0061BD937B800D858136B1932E761F8BCB9803242C39E63333685C73F23D62A685C4E770CFCBAB17B6ADE6F1FA2C7804623A9E20F0EEC0E8A8AD6E2A8789314484B2944A9425FF009ED40B6D82493CB69284A1A47DC6D090940005A3E75FE3EA5D1D0718574B960054C4A66B96752A6CACEA249BB924EB772EE63B77872A9D0904B949200B80CE40D98581DFDA336C5DE6300AB651036B5AFBFF00C9B5FDFAC78F58DCB51AC3340F0177D2CF73F63AEDAF66493992140100A47B80C47AEADB72788B3D07C8FEB16688D7A0F3FD0C15D4FCCFEB08893A0F21F488100F500FCE2A695653350068542DD4106FBE8229262F254A03B38B0EB71F53AF9DE2DC78BBAF35863863CF4ADB8B4B224B2C7182D2E93A0A15FC9274A4A542C52AB8D88208EA237BBE12E93BCED27095650A51128804ED98ECFC8FCF4DE31AE23567C8356171D4960EFADF7D9F5168D797C2429625385F9FAF21BF357331F13CFB64A767105BA579F71650BEE09B9BEFD0C6FF007C60854AC4E8C2CBB61D212E48B001561FFC4BB0BEBC8BC774763D2925034040BF9B06D762CCC341B464F96D940D4E5C4ADEE1409D7A8F6B83ABFCFE51E7F4CA0CE55307F3171AB17F3BD83F9F222D1DF4410483CFCADB6F04951173D2FE53B6E9EC76EA4F7277F58A199879672837D1F5E5CADCCBBEDB3456205B5BEEC5DBD34F567FA09A2827D1F732F3170A1ABE87C86DD7945721DF6D3E4E3D8C228226C656D72C971B5B4E279894AD2B94D684AC4994D890842925B98429775A913699842B5149051E58E9EECF38EF12E13C564E274C90264A525410EA09749CCE7C43981AB5AF1A1F5D86CBAEFCE5409724872E79B696E8DA078D5BFC5D7C0FDCCE198C499F1C29521893C67301754C5196B2A24E4E4AB0EB616F3D37410F250F9A8CE9D4876584CBADEA4325A9649592BF71FE167E35E92AB06A4C2B8AE64BA6026A2409A939D7265B240999495A94847894A968198870963AF5963DC348913C99254A195C0F2727A924EDA731BC69B79959499899495B9EC3D989846B784ABB26E29B76955BA45464A765032A521C4BAE3ECB4CBC1D5001A7194E83A092557047ACBC0BDA3708F14534B9B271591512D60144E92B4B292A1E152904954B2774CC0141AE2E63119D86CC960F8482350AB106FA73F47EBD3CD94A2969978B6B6D95FDE71652BF9E94A3CC3BECABC65B8AD5D32539B0F9F26706F0E69A87E8E1C5BA86D6E7959A626A50E421EE6CD701C5FE7FAC5343E975CD0DA54A07A1510DABD0F917659DC8D80FCE2D5438AD4075622AA7952C6AA0B48B737CC76BE9AC4E96BAB5003BA6B13A3EFD2FE5E7EB1EB796B9399A19AB5B630FE5E607C438C6A736FB12C893A2D16A53AEA153074A16EBB2EC38D4B361446A71FD2D907EF01BC63DC5BDA870870CD2AE7D562D4B4E10852D4B9F3A5A41081E2EED24854D2F6640262E12A4CE59F12147664A6F7BBBB3245AEFCB9C6D27E1C5FC3CF8A5AAE61CCDAE31E5D990A7D3DC62B74ACAA6A6A5549AA21452A63FD4EF4BADC9944AB4DB81D725A56664A67E2D2CA564B21E6D5E697C47FC71D151E0B3F0FE0D9D22AEA565520D4294A44C424B85CC9212A4292E4300B05412A215768CB700C113573C89E0A424666001DC1651BF319ACCE1D9AD1B75618C1786B085028F84306D26468986282869990A4D2A59A96939697611A589546848714DB36400E2D6A7DCD00BCEBAA52CABC38ED67B4CC738CABEAEAB10AEA851A852D4A4898A520151777255D45C926F1D8B478549A420A545446CD61AB5F5B0D198748EEC6E41049B137B580B77B0DBA6DDEF1AEB242535499A19665CC0A214FE23989F2D4B10DA7CAF92E7996059D830F2F705FEF7B40000580007A0E9BEE7F3DE2662154AA8A954CC89960B78123C36003B6DA3DB9C56CB59989CC753F7B5A2316F25EE6238421084210842108828D813FBEB08453D67D07E7FE610370473895D984B496DCD2A754EB886D1288F2CD285F438E8D434F2839BA55A6DA48B92482737E1DA2ABAD9F224A64A0A56A4A4A9419C1DC5C10DBB8726EFB45B27AA6A3358101D947460AB037D483AE8FE60463EF8B5F13AE153835A8AF0DE6A62C9D99C70C3466DEC1F44A3D526E78CABA9E6CA244F33293324CCC2D97192B43CAF315A9484845ADE84F62DF09D89768D488AD934ABEE1D295CE05089409DB3AFC36D0906C436B18AE23C41328D5972A09B96D4B790FD7CDF718A299FE270E1755509C9597C9FCCA6E9EDCCB8C4BCE3FA01525B274B8F5A4529425D2362528B056E7BC6D9A3FD3831A5D30994C844E51979D91514F30B11A242145CD81B5C69B30C7BFE71588999532527501D2751D490C1DEFCDB945E2F0E1E39FC1671158970F608957B16E0EC5F89A759A3D1A8D55A44F4E2AA15498712CB01AA84AD3448B52CA7149054F39E54855D63631D15DA5FC10716F06E1B5B8A4CA296BA3A09626542D351216A92145921684ACA8172032803BC5DE8B8C2AAA16997324A1256AF0B2560DB5B92D762DA8EAE1E333C8750B65B75B55C38D21C483D6CB485209037DC11D3DFE51E747196152B87AA66D3D4251992A524D8120E80009BB3B73E42FA677433D7529CCB0DB962086B3DF66F4BC4CDA8A9373D6FE96FED1D4B5D3A54E980CA0C2E5FCFD2DE515CB00161CBDF5BC4F14510C2108421084210842108421100A5A15AC28D82569D040D275A0A2E76B929D5A86FD40BDC6D173C364A674E419812132CA54145C174DC5C96B90367B96DE2867294B0A9792FFD43467B0D6F76B1F48C1F78F5F0EF3B9DFC06E28ADD225BE3ABF93B5293C692879497669FA722A52A6AADD929E616E5A41334F0E4849484DDC2537BFB3BF00BDAB228F1AC3B87A764FC3CDFFA2CC1694AD26A11DC8512A2C120AC28822E1F78C131FC1E5CC96B9854429F336E18B91A1366DB4F211F9DCBAC242E612A09979D9598026549492DB93330CB40B684B8569525B975B24A55AACFF302AE9F20F7DE9D72B0EA5A09D44BEFA5D4651395981091676236D4BF50C747EA1C425A244E0906D99CBED7F204B69BFED1B9E625CB90A08D04364B49575DCA5BD29BEE7A01197C9553CE9456898ACCC6C49D586BEADC9FD2F4E0CBBF8AFB6972C3CDDEDECD122920B61B0549B1F2AC13A80B92527512160DFF00AC28FBC5A26D55489FDCCB4B8248CDEAD7BBFAEFCE39083C99CFCF77E5BFB7510D3A55ADB3CB2400BD0000BB5EC4A6DA41DCDCA40BF7BC5C66CAA944B96BCA08502544DEC1BAF2EBF38854876771CA2A95950B102FFF00777F7DBA0FA0113A9E7A12DDE1CAC43BB59B4170DEEF10641CCC4915E2BA9588497B101D880E376D7D7EB0C82FAE85B4D768AB2D2F35373B66D242255B6420E9014E3AFA9012C8240BA8F994948DF42557B9DE302C4EB2761B4F88CC9A909935256524D9D25CBDCB3B746773A3C4FA04E79AC4DED61700F98040F2D79E91FA49F823E5954B2BFC3F32A29959977A5EA388BF9A62979B79010932B5B9F7EA54E7191A52A2DBB2738DAC296544820831F389FEA0F8C48ACE28AEACA69C954D44C327202480992F2D25401B2B2A466BB66D0691DB3C3F4BDDA50D7719893CF52C5F9D9AEDB978CB7BC84EA42526C13E9FD574926F7EFBFF009B9E9E541AB9955493953929CE836B3120B7CB571EB1D8D4F3660484148621DCEB6D0EDAE9EA2228251D3DC0BFA1B1FD62D315840218C0EE49F584722C00E501BAAD6DB6DFF5FDDBD62A29C01325AB56580DB17205F7DF6222DB5672CF42F7091F57F2D631DDE2B5881FC33C077105506356B5E0CAA4928A090AE5CE484DB2BB58EC3492493716EA0DE3D1AF833A3FC4769FC3632002754D1CB3624655CD0920F201F5F78C6F1D39D2A51B1082433D9873DBD75D9A30BBC26E63CB70EDE1A985B3326685375896A1D0F106329C969242DC79C2A69B5143896415F2B4C9750028951F30DADE9A76C9C0187768DC65418355D4AA52E7CB954D4E73A1092B2B284E752C654A493724861BDA3B3FB3BC5E6E154FDE225A4E59654429CD807B3107E7A39E8395C39F8B470DB9F330CE1AADCF1CBEC6ABE4BA9A3D7E61B91A24E33A948725E42B73896E9EED41E213C867E35C537A55CD695AD24F4F71B7C1DF1070F522AB30F9532B29C67C93259CEACB2C02573252495C9410A012A5848532B29394B64D23B52A85D59933A5CB969CF95C8617533667B91A101C8B68E2326D4D9D91AAC93753A54EB352A63EB52999B61412C960E92DE9796794E2403FFBC825A58DD048063543887B3FC730054C159453529964824CB2EE97D181049FB78EECE1FC670DC569D33573D285901C0367DDC392D71CC5F4E7CC2928365EAD4BF3B45B42DE60B7DCAA71B0A96E66E9B36161646A201D2AB75657896A4AE5AD25265AC2559ACA7215A03729196E4020167D445FD13654EA85CAA7216424A831770E3EC060E1DB94422D49A5A32F9D6A4F2BB39B5B61BDA296A17884A2ACB252520EFC9DBAF22D73FA1CB602803E9B9B1FD8FA46A6D64D452CB79440531218F4D2DCD83031A7250A7D07BE9D03F94533A4297B208294801C24DAC4EA2C1494943C41B15B85C6EDA6C8D8DF20E14E29ACC347E2115B364290B7C89594E801D0697DCF2BBDE282AF0E4D49CC407367B3867B925DC17D031FA45B2E737077C35F10D28FB39B394584714B9308D2B9FA9C9BA8AB85EFA5D13F497E43594151524381609FBC15B46D8702FC6063BC1A6549958A546594438EF96C72B657014C77D45BD62C955C3F2D600CA0A8001C0B3BE9CFFB0DF58C5E639FE1DFE00714CFFC7D2A4F30F09A9D5A9C72530ED7294892694A37B36D5628D545948EC0B86DEA7BED0E0FFEA498E224A51515899C84801495860C35BA0853F47663CDA2C53B85252941425B39008FA1BEADB802DBB473B017F0F9787EE089A95AACF61BC758EAA52EB4AF4629C414CF82514907ED19A452692B50240B84B80DAFB826E22C73FD4B2BEAA96653535404050621014496046A4957931E479454CAE1496E3F86E43ED6D8900581F36F48CA364FF0AB9059094D12994795183704BA9535CC99A6D3D7333F369B12E73A76A8F4FB892955ADCA2DF4BA6C363A8FDA1FC59F1071AAE6CA4E275094AF3040EF941290A3A32944070C76BEBB45C6470DCB46881A07B0D5EDA7AFF68B802D2FEDD209534FAD243456A3CB1637B2D454A091D02104277164EDB6AF625C4D8ACC9F32AEAABE6CF4CDCC42153338751241035D3A168BB52E168A45664245C312CCEC1B7E6DF3F6AEDA1B6980CB292D0B82AE8A277B904EDB1DFDF7EB7DE310AEC56755921CB1249725F4D413CCECDA5B945C04BD741E9AF589A2D928B2C1FAEFA3F2EA6F0C8798DDFA72F3F942139414B2445520327D6DF21FA4225C47084210842108421105024103F7BC2114B42BD3F31FE61083ACB730565C4A94E725B61050AD0E369BA1C5AD2A208079884F404907E5191617C4157854E91340CA996458A487095066D1DD3A9B802C766A59F2CA9252DE139945408B924F858F42EFA3DB78C50788D7856E54F1F5444D5A6E69583B37A954D759A256E4DC684B54912439524DD590A4296F3AF21B64175B7594A13E45242AE63D45F857F8B64F079A7A2A89C9974CA64CF91312F2D76CA490AFCA46A086F173DFAF71BA0330AD4525D2ECC2EDA9D3E9FB469FD8E7C0AF8F9C258F5FC2329978CD729F3B53989495C4D4F54C2A98242EB4B737373A669E91616E369490970A097141B480B526DEC2601F1DFD99D360495AAA64C89F2E9100CB992BBE54C9A000532CCB0960A21C12E52EE7478C1E561D52AAA00CBCC1C80C72867B6A7ABB0DF4DE3646F0AFF050C37C244DD1F3A73C5F5E31CDC4B0918770D38BA72F0EE169871252DD4DD522594F4CCCCB2DC53C1B44EA14548000B98F3ABE27FE37F0FE25A2ADA0C365CA954F39535FBBCE833DC14A7BD656553302D9585890EE6332C3F0E29521653704036040075037F5DB7E51B0BA5A7D26CE0474B59B1645EE41D092A25290774824D93606F1E2F717F14CFE2CC5275490C17354A4A459DDC8275007A8FD23B0A8101094A5CB300AE570496D76D6F7BC5740201BFAFF0088C4A7D3AE9CA44CD4876E9B7AEAFE91725104DB60DFAFEB13453C43084210842108421084210844149252481B7FBC5DCABB8A24292D9D60070EFB820FD7E7B44195198BBB9171E96FDCF9931D4B17E12A563AC2F88F05D769ED5528D8BA8D52C3352937101D4993AFCA3D4A98982D5895FC1B336B9A510086C37AD5B24DB607E1C78FAA784B8C28EA3BF989949A992ACD988CACA4D9DD9833F4B748B1E37202E4A99394906E45896DCEC1474B74D63F324F11FE103177075C4AE60E02A9D366938597589BA9E0F9F32CA2C55E8F3CF2A68CD4BBC8406DC4C9256ECB39A54794995B28274C7D47F621DA8E1DC75C21413855A274F14E844F42541A52C20250487CCD3192CA2594B2402EE0741E39473133D6A53B0248E44B9D0B5F6075B73DF1FE494B41F5A56860EC1E5A4A5B27D02CD9255EC0DFA6DB8BED0E01202E43953BBD891A37E9ABED7BC63D24ACA838043E8075F7F4D87A4127500AB11717B28107EA0EE3FC6F1C57CF9545519D5600B12A673E7EDA69660F17695977019C00FA91E56B866D1C4462E1271DA5A99252328290407617E9B33F43E711D56564B10E5C103A35C97DDFFB59E204D85C02AF6482547E406E62CB5089B5330094EC5F4EBA7D1F52DCAF14512ADC4A0849D4A511750424ACB63D5D09BF2C0E84AAD6317BC33009D33C539797437394902E6C4FCECDC85E1F7F6378BE2F0FAE183147167C4F658E55D229D3935439EABCBCCE2BA9B2D2BF97D268ACA933E2A53B3A50A979748430991650F2D3CDF8CBA3514DE3A13E297B44C1F81F826AE749ABA693574943313290B502BA8A82912CA72A5416C94A96A54C072A16129241501176C36816A9C8284AC85AC6637602E75D1EC3ADC98FD3DF2EF03D172D303E14C038740146C214692A053BECF9444A52D8664E593A6C9D484B2C2436E81A5D400E2494A847CA476E1DA2CDE32E22AFEFE7F7AF5339CA959B55AB5724BF33A3B1B5E3BAB04A40844BCE360FCB42FA33BEFAF21667EE2A5152C13D0DFB5B7DFF007D7E5B46B55584C9742000958771AE876EA7F5EAD97A5294A48000200039FBDB4601F95A2316E8E610844A080E01DC807E809BFE83E71532A5A8A52BD122624BE80870087FD22DB565A7241D0A43742E6E796C1F67E518E7F16AA62AA9C02710EC042D7A304556642504851F87A74E2EFB5CD811626DD2FF005F4F7E0895295DA0F0FCD74832E752AC28EA32CC05FA806E47B5DE2C38A4BCE93ABE52006D77F3DBC8C629F80EA3D1F327801CBEC2755690BA5E22C195BC355965E097528E66A42404281BA8A660957A022E3711BD3DB9712AF867B48C2F24D3965AA9D454090E0CD2A2C431B696B87B68F1D8BC1D4A55484B0BCAF3FE50E35D4B7AF9C599F864704BC31E786767125E1CFC4FE194D3F15D36AB338DF26F3370EBCE51B1CCA2EA4B9B96A8D3999E78CC5366A59AF83A53B4FD14D002CCC84A965474FA6BD9CF13E17C71C3F830553C9577D4C9919D490A2B992908CF9C29C2923BD162092FD63A2F8F311A9C22A67996149289854A0C6C924DFA3B10F66234DA2E5B357C377C4FFC37AA350C53C36632A871479234775D989AC215895157C40C52412A217214F32F516ECC35A50EA59436A372DA41168B0F695F0D9C318FD1CD51A3972D73659095C84A03ACDCAA6A4A54480ECD2F2EB6BC41C13DAC56534D4CA993D40121242892DD1DEDC9C9D5ADB470387FF151C99CC6AAAF04E6F49CE641665B73424A670963075548A6393E85969D4306B0D30FB331CDD9A69734ABA0B9E4569BA7CE8ED4FE0DD5414B515B83D2CCA9525456A549979B2CA2EEB58427C21C8776CA4DF68DA0E11ED5A9A4D4226D54E43A9012332AE49666D01203BB12D1946959C969F625E6A45D4CE49CDB297E52765487E4E6D95A42D2ECB4CB454CBED9410A0A6D4A0526F78D17E32EC531EC0F391226808249050A60068E1AFE7BEC63BF708E34C1F18400552D456029C1BF2D7770496F72D196F56A005C5813637EA2FEFF002B75E97F78F2FF00BF993484AD5981617B8B9E5D4DBF78D4488800D8A813D3A9B1FAF5FAFCE26FE0EA08FE1E86CEE75D1AD6279743711C15006FF7F7F7A44E48B580B6FF005FDFD7DA241A59E8254BDAC6F61EC7A72F9C4A52C906CFC9F5E8DA37CFCCC4B157227CA9285A095124105859CF2FA17D625162A00A5EC5891A736B7907B4352D3600FCEE3A0DB6FF001140996262980B9DDFE6747FB3157E511BDCF9AE6FD6DB7EFF007BC542A8E721214901B517B8DEE1DC5F43F28E09035DE224240D893F3FF88905537F2CC2583100927D6E7605A380A074E46DBEDE9102A27A988529E43EFD62288421084210842108421084210842108401620F22F08858837DAC45AFB8BEFF0081F9C5DE7D7D3CFA79728CA01684A428817B0E7E8393B728E087B1D220A783435590413A4828FB4EFB2564DD23AF4045C13EC6F5C3D5829495C998B96A076535F9DF62CFCB5EB14D32825D4A8E61B38F5B173AEB76FD045129426CB4B8A652E11A94A75A78EE7A8694DEB27B5C2869EB6DB7CB6571EE2341572CCCAA9CB9290429099854406203A6F616B91ABB6D16D9983D3A1D484AB324DD59084F26CDA0B6FBF48E616C294DB6D15B8950F34CCC6C117EA520040001B91DAC7F1C7788B8B24E34145656493FCCF9B9105246DD46910CBA54A41394EE410356B81A073EFCDB58908D248B836245C743636B8EBB18C2513128585CB05C5C3FD6DA5BD045D25BA40F0B307F7177EBE83D2D1088EA6A1550A0A50660DABBF58A849704B35FF4108A688A10842108421084210842108AA366EE6F7FE9F7215F5BDBAC459D73552E493E104240BFF35AFEF1689954B4D6196904861AF367F70FF62380B4AB5071B5AD971BD7F6C9170DB4B494CC03B0DDD675B6826D65A8102E008ECFA3A218261B2713933009F90AC31F1020B330F1176E9C9CB98AB9D2FBF940292E48FCBB96B821B4BECFB5B48C5FF8A07876E1CE3DF261747A77C251F3430C494F4CE01C5AE30D26EF3685CCB5419F5108E70A94E7325D37710A099B09483617F4BBE0BFE21EA306AC914788554B553852254FA69F34A04D94FE20925432CC00932D45C05105493A475DE3B8289889C424E662A0407BB72BDB63CC0239C7E773C4170E9999C3AE61D7F02666E15AAD0ABB419B5CA06A75975BA655D08511F1D241C69BBA1763A4A5C5825205C902FEF0F673DA4E1D8D5352CFA0C4A454C89E80A5C91302A6D292E04B9A42AF6D159520DEDBC7594DA0992CA82E5292468426CA0D7205B936A19A3C2086C121A56B6C7DD56C6FEBD36D8DC0B6D611DCF5144316969992D59B3872411F2D5AF700DB7E71679EB9921C242AC1CD8F32FAEFB9F4F388458EB7089D864C91E2244E511AF222E46C2FBEBA69789722A0CE2A05DD237DFA8FDB5815251E6585148DCE8FBDF4D8F7FCBD3AC6474F3A451D377F3572D3912E5C806C073D469A6CCDAC5531E47DA2E5F86BE14739F8A6C7D48C0394584676B188AA6F21137596D879EA5536556A4A54ECEF2D3A129495249529D6FEE9EB1D51C69DB4E19C274F3E754D7C8921085F75244C4A66CF0917297242522DE229507291C8C7294CC2B0132D6A63E2212484E9AB0D6FFDC47E82BE17DE1B181B80CCA992A6CECBCBD7339F1253E5959858950CB6A975CF3896E6DFA3D1D612B532CC93C85B49D2FBAAE5336263C06F8AAF8A5AFE3CE22E20C264D514D153CF9D4B4B284C272CA4A949054A7654D504833141294A9574A520B0EE7C07089628A9E6AD394A900ACA92CC54D662F606D72FF58CAACA25E537A9F5A14B5BAF14253FFE8CAF315F08CAF7BEB6A5CA1B513624A6E6C498F27B1FA95AF139D5014A2A5A8A9C97759FCC5F912F66701B522D9CC893DC2084A4F8776B1762E07CAEF7D2E62B9EA7D8F716FAFE7FAC5A14B54E4952B54806C6D72079EFAF95F6888542BBC09205F93B37CEFF007A4224C5642108A4BD9615E89B5BEA7BFE517E95252707993AC1489B6D5D985EDD4DCC59EB0955420000800BB6BA1F36DB945B1F19185D18F3862CF4C26E341D156CB3C5B2EDA0DD5F6AAA2CE2506D6EA952AE36B9ED78DD7F82EC7D5238FB0E42E677413918A8E50E09667F77162FEB141529485241205C063B13E6DBDBAC6BF7E129585CFF000C350C273CE10EE1BCC7C534596BDEED30F4BD21A964007A69710F10361B9B46FF007C53CA988E2DC36BD39CCAFC152CF3318E44925648CDA380906E37D2EC7B6B80A5CA994E5208538524656760030D4D8BB07FF1E3FC7B7FA8784FE27F873E3FF2E82E59DC2D8A6428F986994D4DB550C3689C9479972683646AE6FF00EBAEA5EA074F4EB1B55F08FDA952564B93844E9C094210BA74A882A13A58032203B933C14E66FF00DB1A18EAFED5F84FBE4CE9C99533553A80B105DB316360C598DFADA3786CAEC798573AB2D709668E1826B386F3070CD2711D01A6D697C34C54A5B9BADD61A482E22CA4825D2A6CEE0245C83E9A54572B18A394241CC952100AC1722DB9761724E839EC23557FDBA661F50B57E42144B17177D1B9DAFD4B726B33E2F3C26F84AE32E99333198F9754DA763454B39F0B8F30B4A4AD1B13484E68296C1718967251C6895171C4AE4FE216E36DE99845961568A8E0FA7AA90A156A4AB30BA4D8286FD141C5C69177A0C6AB04D080B5A128B2495101B40731E5BDF7D7531AD966FF00855F89B78794D4FE2CE157164D712591F2CFB9333197F58979C62B52122D953E52E48B9393752AABAD3295A12E538C83257650674A82474871DF6118363B267A974F2DE6053CC4CA493F9491E1486624016008B1360D1D9FC3FDA1D6616B423BF24A4A6C261360402D7B816E81DA36970B0E0BF51736B811F19270C548398A81662C1CDF63E91DAD348A44E6512A0C4F88B9B726B74D479444003A472B98B7001600306DFEFF00789126AC55DF500D9FA0E85B5D79FBC22DF316A50B926ED7DEC7DF58AC47E61D5C1F68A5A95AFA9FBDEBEF1262730E5D3D394558E4122E0907982D0844466CC362B57B984220D75842108421084210842108421084210842108421121413FD47ADEDE9F9C4CEECB02FAF4DF71AFDDE11384A48DEDB6DD3F41BD81EFF00217BED11266AE592125BFF008F87F7D6205120DB46E9ADFA444B681B8293ED6FD05FAFD077809AA9C72292A24B33BEA3A8F5DDB94490A529652AB824020682C35D351CFD22112949292410C444FC89E5F33FBC22296C1697EBF43114226545D6080DE116F530844884210842108421084210842108AD9011950A23C40920DF991E9F2880CB41254521CEA5AFA37D2115C6AA6A91DDAA6ACA013E17253A9DB4BC4712AD295A14DAD3ADB50214DDF485023717EC4F4BDAE3AC5C309C7AB303A9975745553A4194B4A8892A52335C5AC3789532521695664A4B8BB87FBDFD7CCC5947157C0B70E9C6261B98C339D18229F539E2D2DAA4D6E96CB5275CA629C49087199B53531CE71B590B49537D411BDE37D3B07F8B6C5783AB69E6CDC5AAA494E5412A9C4E64064A810A0DA58BEA395E31DC470B953A5A80932D9812C9D3AB83AF9EF68D7133C7F862B11CBD66766320F34DB768CF38E392B48C6549E5CDC9B0BB14B0FD49AA830D4C2D2755DC4C9B234148E5DEE4FAA9C19FEA19814BA4922A6A64A96A48CC944C4A19400723366673720EE491AC75E627C36A9A099681BECE0F506DD5AC40DEC62D5695FC357C5EBF5032F3F8EF02C8529974DE716E19E6DA0A22EAE5227258A0D920F99D5EAFFC74DCE59897FA84F074C4833F3CD50BA422B65200D95632176D34237E6D168A4E0AA89EB51019AF74B3B6BCB5E7BDEC4EB7F7C3B7F0CFE04A55529F50E21333EA38CE5E5E61A79CA260B658A6CA4E2104A972AF3D30BAB1085EC09B0D81D85E3A578DBFD43B095C89F230BA844A2B4A9328998264F4280B14AD265A7375C85AF6D232391C14A9490B9CC1203A89B002D7BE83A1E91B1C70F3C2FE4270C186E5B0BE47E5A5130651E4DB44BCC54694D34E57A7A61A4848555269C654A528D9657A10D0D46F616B0F353B5EF8B3C4F8B6B67CD18AD4CC5CE2B7577A5FC44DD810003C872D498C969B85E44801265A524070E3563AF9680E8CEF7BC5C6151528ACECA512B3616F32AF73F3DC827AC694E298DCFC56AAA2BA64D98A5542CCC2A52892EA24DC9B9D5B5668CC69E9D12252258481912000341603991B442317AB5672E4BBAAC7D0DBADCEBBC544228E21C8905D838D0C21114210882BA1F91FD22ED4931E47764B8CDF94E9721891BD87F78A09C926A90C01F0871FFDAE7CCEF1D76BF4D6EB545ACD21D46B6AA74D9D91712521414899616D2C106E370A3D7EBDE3613B1CAD386F13618A92B5495F7F21D48394B158B588F913A9BE8F8DF1385A120A14126CED622F7BEF6DEDEB1A9578653FFE93CD0E2E326DF0A61CC1D981375644B2C90B0AA83B361D2949B69D2DC9B4761717BF78F667E2150715EC9302C6972D0AA89B83D1AFBF09F190813014855F70097E7E463B03B259C42BBB5ACADA6B10A3700E523FCF4E8E3235C4C64DD233D724F1B65B55A579CDE25A04CBD2EC5925725354C61D32AB4950514EA54DAAC12124E9EA2D78D5BF878E3D9F87713D11A7A8549994D548292936252B48D2DAB1F7023B8F8D30F935186ACF72839A592CA482E00279037D2FAB8023D9BF86DB8A7ABE37C82C67C27E625650732786AC4FFC929F2332B299C730791352CCB2969D70BA532469ED24AB748E700529BEFF00429D976374F896092CA18CBA99089B212ABAD085A5D2E5F662E402778F3D78E69D54789CC514948EF08530213626EC2C1DCB72BF58D9B585256FB847475287594FA200B2EF6FFB4A9209B75247A46535F3A7CCA83292B5654B10D67CBD7AD8F90DA31B54D4D452A132D92A6399ACA72C468C49B9DC0F9888D4A5C4DB0A61690E36A4292B428056A0A4904588293704EC458DC003789B2A9973100AC92EC195A581B9BFBF5E9A71210A96CE49BB927F6B5C96E4FF004B076CA5E965CD4BAD0B96274A5E3E5E5286DA9C479AE0F5FBDB01D63E182AB05C5686B5722B644D4A50A527328283B1B10E069CB9DDE36997562B1211A12CE1F7D6C741BE9F2888BE94EA02FA479926E95FFE69D8581E96DFA137B1116EC464A64CD480CF943B33177E5F63AC4DA5A714E328DC9F4B3B6A403118B1AF4F5FD0C5727F3067DFAEDE4228FF005FFF00CBFBC4A89D15A108421084210842108421084210842108421084210842108A7A4A8DEE46E40DBA5891EBED78BB22585213C9817363A02D673BB7ED088A8816BDC5FB8D81F98BFF00BFBC7270F9934E6426CF7B173FBFC8F5BC4B5EA34D3D7FC72F58980E9B923DFF00E2FF008C4D93854C4AC2D40E5BD98B86E4C7C869F5890807BCBEC41F76B7D81118A7AD9195CB5C5EC3CEDF7D186D15708B60201BE977F50D0844C9AA0A50234CA3EA4C2112A10842108421084210842108422A25AC84001B7FA9EB084479CF21F3FDE1102010411707620C47292674C4CB2400A203DEC5C3177D8DF430D62555D7E5754A7D0149D2DBD65368FF00EA00045B6E87B8115F5186CCA701521613943854B2C4BEA1F427C99BCDA257732C6660C55A9058FA1895652A520A9A41084E90920DADB917DFB5FF006220918AE2F4AA025D54F484801B39CB6E5CB972710FC2CA55C84DF9B38DAC1ADCC0EB11BA9684A3514A5B24B606DA0ABA9474B5EC2F7BDED7EB15753C478BAE5841AC9C366CE4B0EB71F4B9F9F224C9A775A52919C312000E0680EC45CF2239C54712979296DF25F426D6E61BDADD2D603A7FB0DA2CB36BEBEA16262EA271580400144FA6AD7DF5B973B3419E521F225201FCD96C15AEBABEBEF133A43A517480DB62C86922CD8B5AC748FEADBADCFEB79F4B453660FE24CCA48BA8975907F95DAC2D7D5F6222904CEEF314A57997F9892EA517B5DAEDC80163E512C499B33B952A4A194941CA0BEA06966B1B070F170428A92090C5BEC8E86114AA515973E8360222844308421084220AFBAAF91FD227D3AD499A801D8A8023CCC5296FC64B27560DD75FA6BF28E3CB3A96DF4AD490A00F99245C595D491DC5BAFB5F78EDEE09C40D0F12613E260A9D2092E5FF00EE076B80DB38275F58B4713C90BA70A6B80F6DCB9E86FEDF38D49F0A497FD25F199E28B00147C349663B0711D31A02C8996DE666186F4D800521D65CB2424D9448BEE23DE9E2892AE25F878C0E694E6FC3D34CA22C5FC32E449988510DAA8CE501B16706F177ECD6709357F99C152576E65C33B87D074DBAC65E8A88494AD44A5F41679A36581B029D66FB2BA280EA0017006FE73702CA3C37C4AA9D3159128AA605F2E8B24687FCBBD8DE3676B29856503315669563A9663A3DB7D4E818B461D6978D67FC3C7C5DB2CF885651FCAB2A78800FE15CC4665D2A6E8ED4ED5AA14E7DE9E6DA050D4B38858D2C9714F14A5C705CDC98F74FE1ABB48A2C4308A4A254F49992928CA02813908014557BA524240166CDCCC69076B1C36B97553E6041B955C6FAE8E186F7B7CA37D7A4D4246A4D89BA73E89C959A4FC5CBCDB442995313365A1B6CA4904253A415056E2DB5AD1BBD324C99B265D582921400077530FCCEFA93ECF1D0D492264852D2B4948D1B4208D39BFD35E91F7D09558F537B74ED7FD3F3FAC0148486D5BC56B391D1CB5AFE9152B219873279F3D7AF90DB48D6E3C3AFC4630071CB960A9B137274ACDEA138C48634C02B2DCABD6434CA5E9F90610A5A9E6564BCB24B4D1414280D5A6E7E6A7E283E19E7F08D3D6E2B494F28D3FF001264A9B2D0405A43A8149CBAD803C99AE18C6C5E2926AF87B189945552A6A56898525494B243167DBCDC73F5393F9697286D494A91CA0B219B2CA872F4A4D81291D14542D6001BC791B8D19B22AE7A66CB20CA9AA9641703C25AC08F2EA1E2FF002E7898942C5810EC7D5C96D2C75E9A6D0D6359459408EE46DFAFF6DFE862DD2A997532D4B43008B973CBEB6FBE7572C85170E7562DB6E5F944A410A07D4DC5BE7D3E71488495A8247EEC2278F6F38AB109B1239421084440BF703E70BEC09F20F0881B0EA458753DBE7F211514F4CB9EACA011670E1A2052C25DDEDF7CE21A91B9D69B72D2E8373E64A9E0C009DB756B22E3B0DC9BED114EA49923F3149B9006E5839B7400EF76B3C495554B4AB297EA4683CECFADB4D623FD45241491FF0076DEFF00DC7E2220FC34EEE84E12D4A96A240290FA6BECD1CFE210CEC5BFBB7D6D03B5B706F6DC6E37E9FBF7110224CD985932D6EED74900799E510FE290ED9544DF41CA04D813E913C51ACA824A909511A13BF2D45E2722605B3021CB78ADFA449CC1D2C77F688A650CD9775293A39FB7313B2FFE49F788950001DF7892241568A1F61FD3D5A21172438B75B7DF9B44A1D4136DFF000FDFEC426485A081F99F93903FC6FCBDDA5CE9A8920152817D81BFDFF688958092AB1207602E7A81B01F389D228664F4E60A4201D029C12FA6ADA9E4FCE241AD940397F4F5E9D3E6368A80595A1652D2F4EA097080543D82756FF3B4433A8E6C9D4A577605377F2897F8F97FFB737CF28FD4FD22915200090A0B5AD47ECD3BAC77D4A49B59361B9BF4F73191E078362D89CF9326970DAB9C56400A449514B682E35D6F6168986B65306CC4B02CC1DBDF5DBA6F1E119B5C48E45E4A31F1D9A39A584304CAB4921C5D66AAD34A0B0AB72B94C879FE65C5824B605C7511B6DC0FF0ABDA1F16D322AA8E87BB42D29532E54C07C40102C921C1E676F41493F11080FDC4D533E89D87AB1E7E4368F95937C5CF0DD9F8B7E5F28B38B05E399B95514CCC9D1EA61536C116DD6C4C2185906E1434255B107A74BAF187C2CF681C2D46B557E1EA40487CC25CC6209704282198B6C7DB48A1918CCA9B51DD2A44E483FCC410970C5957E5D75F48B8F5A92D9097569694A1A9B4ACF99C49170501214540FAED1AB1C51C198B609DE7E3A59494BB92921C39DC81A7A6FE717C1532CF36E7AB35E27092A1704475A4A90B9D37BA436676009EB688FBD06C2FE45FF4BF908914A09363BED7DB71FDA2A2AE867D3292169FE517BEB7B69F3B47226021D88FBD6201609B6FBC5114A81620BF94460821C40A80BDFB5BF3F489C9A65A939B3253CC13711CC4358F7FCBFCC53C21AC7A1FCBFCC21110A04D85E390092C211340820B184238842272242A60CC086F9EA47E9D6108E554EB4872437AFE80C211241292082411B8D443CA1F97CA2726A67243672407D6FF006F1032F98FBF487CE38993E62C0BB11B8717F3D5BEFCF8567D3A1D016E8E7EA2263A7B037F4F7F5277FDFA77A719FF009883D7A72DBECEF10A12B2FDE17BF859DDBABFDFA4523AF7B7A9F4B91DADFBBC54A26E51762599C8BB1F771CF43134250CC43FB7ABBC4A4ACFAFD0111C2A7CC517CC53D136100948B0000DAC1FEF9C5517205FADB7F9C4225A941C317EBF58E47B7972DA110149496208FBD8E87D2111B6D7B8207F9B74EB1082E598BF97EA2DFDE382583FCB9C2DFF001BDCFE5688995FD27CDBECFCA20EF3FF001F9FF68844689531659293E6C5BDDBA471DE8E5FB7BB31F4BBC414A484906FA88D88E83F7BF6313E9A9672EAE549092159816BDDAFA8D00E85F668851295327A67380940662353AF42FCFF0048E1A11A1C41529210A7129794A3D1951B2EC08B12104D877E9B465F4555F80E22C30CCCC3BB9B20961C96D7F507CACC5F5A0C7DA7D389680EA0EC791BFB8E76D7DE356AF10BA2AF283C5BB85ECCD45A5E473129145C2F539B274A9E9A4D7A743E1C16092D0627D8F31709DC8281604FD09F6555F278CBB0DAAC3A914A33692928E7E55FE41FC35F78A05CDD41091A5D872022DFC31592F0AAB9289D98199359C3F3480E6DD79EA6326E410C32DB83ECC1E65C6CA3AF705293B1DAE7A8B7D63CD7E3B9F36831CAB934CE9992EA9697B06217776D87EF68DC5C08A6AA9255DF3CB04036B116F3DBE6F161DE22F91073A786DC58BA3B1CCC5F80D52D8D30ACD281438B9DA625E51A7879095BAD87B5A1C3A12B376126C4EE36D3E187B48A9E1EC6B0E9589D42FF000B50B97226F7633A84B5A92E5282A4025F29624003E7D39DAA707CEA8933A74B421C02A4BDB62581DB9728CDF78197174EF15DC0D601AA57A795318EF2DD8465F63561F20CF1A9509A6A4533F3092B5384CF2E5A61DD4E04A8E924DF7B7BC5C29553712E189155DEA664B04242C1241CA0DD3B104DC1D08DF63A3BC474FF00EDCB58525941459C31172E34D1F67D5ADAC6695B75B04A350D4908B806E77BDADFDE2E69AD4217DD29F33B7307D6DE44EDE6F18D216A98E54A0580243F366B74F7BEF1F94FE03CC8C61C15E7D619E27B29D0BA67C03D2EF633A54BA94997ADD0D97899F0EB6CA4A1C52D83328216855EDB98D27ED1384697B49E19A9E1CAE9699FF8996B1874C58FFF000F5931391092A374C99CA12D331B448258E91ED076EFD86D2E1B4F538ECAA7485B2A628E4FCC8FCC7A9209B3E86F1BEAF0D59FB84B896C9AC119C782679A9AA4E31A4CBCF3D2ED38852E9F52294A66E9EE21B5AF96E36B0165074AFED41D3BC7CFCFC53760B53C058AD577148509CD326AB2A48055995605838395DEF63A468A4996CB9E803289731480144EDAB8DFEDF68B8043885F4B127A2AFABA7517F5DC5C1E9F58D29A01325CB9D2C5B50A0C76E963BB1B45C25A598DAC1981F9B69EBABC5428242546DB137EE2DB5BAF7FD3DAD16DA63FC7525AE12AE9F5E56D7589D0890AD4F99FAC211C4220A3617F7DA2E1413E9E42D6AA849527296000249F523EDA39177B816DE2620817B5F6D87AEDD36F5E9F5F9C564BC4A5CC9E8972E5E54A9411C8DCB31B93BB5BD768A0AC504249BB9D003C8721AEB7B697F3B4AE2378BACA4E16060D5E6FE205E1F97C5D5C4D2E49D12E5C4308752E3ED38E2CADB096D2EA079890011EBB1DB6EC93E1D6BBB520A551531A9EEA48A89C10CF2E5384296C58901F4014A6DB961B5989F70AF12C872C0DD9DF9FA30D99BAB7BD65FE66605CD6A348D7B01E2EA6E2CA454184CD4A5464A6A59D71D6964DC3CCB4F3AE34A65614CD9CB1B36147B0893DA37C3C718703D55448A4C2E74CA1909052B4C95A836404FF0020BF3BEA7C8C5761D8CCA56444C55CAB52DB917B91D7D74731DE1C69D6D5A53BE9EA46E2C49DF6BEDF306DF4B4740CC55550CC5D1D6619512A68252A2649003B022FEE741D748CBA54CA75A33029BB9D6ECCDFA1F38982B6B037BEDD7724F6B8F9F4FC36DA31F9FC3B533E77E269CA6585282B2AC94906C6C18B1D01D2C6FCE28E7D4CB27B896A0998B60FA0176D411CECFF002D621A80EE0FB77DF6E9D6E3F6224CEC17137399724D9803339D99B21B73F5B4527FB7D5A9DA7A6F67CEAD07A379F99BDE2A2834517DEE36501BEF6EBED6FEFD768912787B1352ECB90CEFF9C93E43C3D753F588461D58EDDF274D7311EC59C6B7FEF1C05841559BB9BDF6EBB03D40173FB1F5BCC9C32AE8D065CF942A153834BEED256C5B42C1C3BF2720F50D39385AC826A2A07966398736243726E76B17B7235043616A5BED824E95CBDB9F71D43375A015DBFF0031B137368BFE07D97F16712D64A14587CF32D6BD04A510012CC400C59F7E45A389A8934A950494CC22CCEE011B12C5B6D8973D5E2D3F884E327874E18A9351C439AD98B43C39332CCAD68A14BCD4BCFE26A8948BE94B0D3C032E9B5C85BE2C7A98DC6ECDBE0AB89F88534CBACA498CB28395485B25CB9BE560EE4396D4F4894719952BC0A913161D92C8B172427C3A10924747BB0600EB2FC5578EEE7FE78D5E7B037065855DC0586029F9098CCDAEA8B3899C924A94D266E412C36F940986C075005410424807DFD53ECA3E12780B83282817C494F26656499328F712A5A14E72273A67CE56432D41CBF76263A983B391D95C1BD9C631C473E4D40A499F86A9505852905803E2052188539637239011884ADE55627CCAC46EE39CF0C7589332F12CF3EB9B9A98ABCECCBB79875456E3DADE987D4C25B59504B6DA5614005122F68D9552F86B862985070ED3C8A0A7CA10B1492A5CB9931219BBD9A8654D2D62542F6B6D1B7BC3FF000D726AE8E5CEABA50B564492148B68E4B1059DFCFDAFCEA765B620CAEC4725991C3F620A9E0FC754371138CCCCB4ECC06E6C349297DA71E4AD9712812BCC4A921A58584941165189D594DC2BC5F81AB06C5129AC33124269E729254826E4CB2A2AC8B05D4E90E6E1C3BC63BC7DF0EF4D86E0D5551434A13549BA4A10012EC18B0F201CF22CCF1B30786AF8CC612CDB99A5645F146FFF00A0B37A4D0DD2A8F8DAA0E215218B396036CB5A9D530B9771E09E56B701170157F4F393E227E128D6D155E23C3F4F2EAA89944F7414A9D4C4964CB9E908604120254852C2925254C49034D388784719C11444D91310A46A329018594A05B97CDEE446C2CC5498530DBF2B3099B959942572F34D2D2E32F36B00B6E21C41536A0A41B801446FD77BC7927C57D8E633C1F884E5D4D24C4225CC56A850B02CEE46C5CFA728C6282B952A61454E600116367FFE409B1B36FF00B7251720A892493737ED7B5877B7CBD63AAF17AE952EA9326620BA5012C0683335C1B816F58BFCCA89534A55254E32DC82E09DDF6D2F7EA6EE22AA3A83EBD0FBF5EBF2FD628D629A6CBCE900167039DB537EAD73EEC226217616EA7F61D6DF3115929D573ABD80EDFF003B75FCA31B9EB698A06E1C807A06D3AFDBF29F14741F51FBFA44308683EA3F3FF10844C94906E6DD3FC42113C21084211C85280B2881D090211314902E7FE3E7013546D98FADDFDFF5844B1304BCC82B7B8737E407BBDA108950842108421084210844CEEA6650B00B588236EBD3CE202B487D6DBD9BEB11B1B5EC6DEBDA2AE44F916133F3331D0DF980C796C1EFD6CCE391F97EF04EE76B1F5DAFF908AEA8552A69F3C800CEB101AE6E0060C587F7BEE5992AB73E7FD8C415A6C6C6FD41BEC2DDF71D3F0FC22D899956AFE43CEC8FD19BCD8D8C71DD21DD9B7B13FA923E510B8F51F888A84D456CA07C0592D7C9E9EBB6D6DE3932D279DAFEBCFCE29AF7371BD8589F4DFA13DBA8DA2B70DC465CBAF44FAB4FE549482DA723CDBE9CF945DE265A72EE5C87FAFBEA3DBA5332E99A28975A8203CB4A028EC12546C1449E8124DC9B802DB98B84CACA7ACC729274BD04C9602816FE7703EF43A6E62D9569050A2CEC0AAF7E6E7993FBFB6B8FE3F9861DA5D03860CFC914F2A7302E64BF2AECC36921C436F3D4232A85AD23CBE765E524288BDCE9BEF1EEBFC20E30AC47846BF0794A4915582D4CB20FF5CA91FC324877014A36F38C726A4CAAAA6984B34F956D0865073AE86D6076768BC5C3F566B1061AC395C6CA4B53D4E91714A053A4F325DA5059502459449B126C6C403B18D33ED870B9B87F11562CA487AA985C8D4859BB3FCDC3BDE3703846ADE9E952083FC2961B5D83F26D76F3E91CC9A944CDB3354A7825E66A1CD6D52EE00A69682DA91A5772414A90E2EF716B81BF48ADECF71D34588512CAC0089B28E6722CE1DBDBCEECFA45C78CE90D650AC241BA083BD883ABF9BB93B92072C69F862E70D47C3E7C5531EF0DD5698765724F8A244F62AC20C2D65A9394C40E4FB5314B69842CA590A549D4E7B99CB56A4A9B4800DE3DFCF879ED065E3DC1D4346A9A950A695229D41ED69644AB3DDD295393D35B18D08ED2387174EA9930A2CA9AB20B1DDDCE8CEFA39F68DE269CA4CB961C51F887DD9653856157BDDD6929055736584A8920EE4037EE6364914885B4D09DC14DB4704F3B7ADF58E95549EE1DF62C4B75D34BB333F3263F2EDAC52DAAD5367A97382F28FB0E52DA4900FD9CDA085A803FD377957F61ED68D2DE1BC72529424CE2953324BB6A0B5DC6F1F4FDDB26088C638766D226582A54A218873F96ED63A0FAB6D7C8F780AF1315ECADCE9CC6E0CB16CF095A362443989F2B1730E00D375B936DC138D344F45CF2534E690123CC5AB6D611AD1F18DD9AD07137085471152C92B992652E5D41284F814539A52C2EE7F88A252C34C849D418F1E78DF8557C378D54524D42529993264C65020142890B0465F168C361CF511B7E30A6B98B6991A5B421B7D361E5D4F8295A47522C5ABDAF6F30DEF1F3CF8B60A9C3F15AE921232A26CE0DCD8B331FDF7D368C28BA45FF0037E52A1A16D0866D8DACE2FA472E3ADE70126A561980CD6F307EFF00BD8D399A01B82C4B3F3DC7B9108A43724F3262AD3A0F21F484711CC408BDBBEFFD8FEFBC5D70B93473A64C4D5A825390E52EDE2B37C9FDBD9056EDA92A27494A82ACB295004106CB362936E8A16D37BDF688CD1D3CBA942E44CCC10B075BBBB87E7CFAFA5E86B102624A5B6E572E2DD0750FB758F08CF1E1DF277890C2F318233A70661CC5B48764D6CD3276B54E62A157A628A0843B4E9F7A59D71A79A3E669487DB2156B2876DB6EC7FB78C5FB385499B41553E9662100154898B94B29DD2A28209041F107218DC308C46B30BEF94ACC84ABA116E840BE9AB7AEF182FC5DE109C4870E15F9EC77E1F9C45E23C30C3536A9A465BE28C4B88A5A973835070C889364D429330C38B2436DCE29968365285694A6C3D1EE16F8BCECF78DF09A4C378EB0EA7A99B3902554D4535352CAAA2A032256579A599AA2027395AC3924DC9BD96AB02AAA69667C85948D424A890CF7DEDBE9A5C691D42BDE291E247C19CA3EAE31785699AFE1DA3A1A62631CE167E8F2D4F99612BD2B987052DE6DB5A94DF9FEDCA54A27CC01E99AD3FC3C761FDAA8975BC3F8AD1F7F5AA7452564B54AA842A616423F8099D2C92A21215DE6B736722DD478CD7226F71312A0C425D24105ED776370DA73EA63D632FBF88DF841C492927FEB0C2D99B822666396FADC670ED16A1268208D65732AAE2660B6920952D0CAD76048415581EBEE2AFF004FB4CC33D383090082528226A42731B0B10F974DB425D9C81D9541825756D37E2A505158014078BD08201723403736D1E2E8289E38FE1D15A9613151CE96686923516AA741AC4ACFA7627755324274820FA397BF43DCF554CFF4ECE3052880B907312C04C397CC1CB9599F70D111C378843E544C21FF00A0866F30E1EEFF003678F8189BC797C39F0DA1E14FCCFABE274A412DB547A3D6D4F4C100D8736A52F2015A8ED77160F5E8378AFA5FF4E5E3072553694004BBCF4BB6F60E5DB90D03DA1FEDBC427495301B90421434DC06F263D2FA88B37CCAFE23ECA490977464BE4A63DC5B3E9E6B32D3156448CA4AAB9800696843554992EA5C29D4BE736829012003A956ED5E0AF8009787CECFC4359878653A3BC339494310EE51214092C00671ADDAD110E0CE37C726253414D52B4CB2D30A10A624B00EC1F477773ADA31A79C3E2F5E235C44373B87F05352992185275B5A5BA8525C4C8E249069C50FB6A6D4A4D869F959A4A6ED975136D2B438B1AECA20EE1F047601D9C705D3CB33254AA9AA94C4897290990B290CC262CA668D3512DCD835E3BAB82BB05E28C5152D388D2AC216C162621449720E8537E834E5160EE64F56B19E217319675E35C4398F8AA6965E9899C475299ABA9C7566EA2B5CDCCCC1515289B951F58ECBA9C469F089229F04A4934B2539411224A12548486F1AD202961BFA8B7AC6DC70B7C24E195B2E54DAD900AC0492163A826C74BB5C0778F69A652A4A8F21F034AA749C8B6D80DA529421212DA3CA12121160024580E805EDD228F19C729F16A2954F48B4A2AD32C2668496505E8A162E2E2FFD9E36C3867B25C1386A96929D34F2C0A642500E44DF2B00E5B50DAFEA23E824A74B6805B2509B2CA0586A2ABDC8207A9F6B7D231FC3F0A44B42D5884D254EA21D4588D9829AD76366F3678ECB952E8A9E4FE1E4A136013648E46C5BA1F944B30B28B10875C2568404B1FF00B835D90542EA48B2028A942FBA41B5ED68B4CDA3A9C3B11978952ACF712C90405288624D8EBCFA5AC378B256F0DC9C4F3A2A25255256E4829052C5DB5D9AE45B53BC79D63ACB3A2E36489879A96A5D769494BD4EC5524909A9CAAD3F688FB44043BA90A3FD2B3DF7B476FE018A5062B48BA7AC29299C8CB352A62998CC405A0B05234705C1E578D75ED3BB17C3710A69D324D2A02B2A99901C1637058BFCFA18BE9E0D7C5EF3FB8339A91CBAE224D6337324D97D9966313CC2D7395DC272C421A6DD69C9C525750F876836EB74FF008A54886C212A712EA9E6DBD78ED9FE1C301ED0A8EA95824AA79388290A12E90A42533E63951EEE6B650E08CA165202814B8178F37BB46ECA2B306A99D3254921014A399208B681C30D35B6CC5DD846D9DC37F14D91DC4E61A91C5D9458F6958A64AAB28977F97313C86AB2C4C68D6EA26A9332B65C6CB495250A4286E50A08D4DE859F1F3B5CF83FE20E1DC5E729747325302A3E1510C14AFCAA01887043A491B0DC474E48A39F400CA9CE083A17058733F7CE2E72E1D4A14E3EC1532A520B68B4B38DEA2059D96484A1C3E8E0D7A4DF7EF1A85C4BC115BC373A6C99C829C9624853F85DDDC793DE2BE52D88B900BA8825C722126EC34B585CB0DA260957DE69608B1DC1276F96D7FF003181FE0913733EA9725D81B6FF005B1D75DE2B92B2C5AD76E7EC7F589E2D2A195447224470E06A40F58471071CC7B8888569DFE90C856424737F4FB311A08CCC082E36302F03B036F7DFFC6D1592689C87F5BDF42DCC8EADFE2665725C9239683EFDA29DBFF941FA9FEE445E2461AECC90469CC93EC2FEBA7388BD0FCBF788A5DD2746A0AF43D7A807E7B13DFDF6B08ABA8C049906604876BEC5B577F3E9FBC70DBB317BF3E5AFB69FA98AE55E5BFAEDFAFEFF00778C426C85499AA41D125C1E8FCA3800051E7B5B6D1ED6BFA1D6D78A515727FECCCF3FDA22845242108421084210842264A5B49D4A22EAB9DCFE3EA2FDB71D62EFDECA5D32100788000E81ED6B6B7727D378A05CC01445CB7C8FBDFF00BC454F25C525B6D4137493CC5ABECD3637D2A46FA89DFB1F9C4CC3B87AB71099924A02B3285C0755EE03B383E5D625158377568CDF6468035CB696D6386ECF312EBD2EB85942012E4C265A5D894B006E56EBAB6BDF7D26EAFADFB4B05EC7B88AB96855353CF9F30A4144B085CC7E76234677F3D5E384CCCAAB3149D4A945C101C3062036EC4167D5E3A6D433372E29AE2DA9EC6D85A45682A0E89EADCA4A149BD8956970EFF80FEFD9941D8171C2807C1AA48673FF004EA22F73AA5C5DD9B9BBBC4FFC500921C3B0660FD3702DF64DA2AD2B3032DEA8A70D2F1DE0FA93AD275866571049CD2946D700214E8FBDD877B822DD224E27D83F1CCA0A2306A9B7FF00CBA98D9F74DC36AF7F3310FE301003283B82AB0DFA1245998802EFCA3BB3132D3D2EDCCB6C25D9479254152AF4B2AEAB901D0965E3A85ADE7B5F6B102D1D6B8F7639C59434F32B2AA8A653CC47842664A524103A1019AD6D9FCCC514DA9FE384A54543F99CA9EFA312D6E81C3B748A4E7297A9BF2A995254A5AD5B38DA77D60936EA2F7DFA1B5AC0C6094FC3389534D4CF9F2CA44A98330482DE1625C300F7D9FCC931744CB0B959CB91A313725B47B91F3B9F6C43F8DBE004634F0FACD0A9B2C29CA8E0376858FD8094DC84D255517E695B0E896A5182A36D811BED1EB27C0BF15E6C6F0DC1973804D54E450AC1538289E44A5803A8D74E718D622324D0A507CB31240D4062E0924F51CC5B4BBC5B6706B8C1CC75C34656560BC1D150C35212335656AD1FCA1B05415DAE3E36C6D6237262E9F139C3A30DC5672C2322C4D529C3862546DEA1B47B680C6C87065566954C972FDDA45FFF0021EBFB39F211754F10E4D2F9674B610E31A8F4E59D3CBEFDECAB6DF2E91AA987D5AE8BB998925253312435EDB7A68E7E71DC73E9455D2310540A7771AE9BE9A8F94623BC5472BAB6DE13C03C4DE5D19893CC8E1F2BF45AD4B4E4B0703CDD1987019F4A14DF9B4BE5997655DB4B8AD5600C7A89F081DA54E4E292F0F9F356A9332480A979C801496099B95DB3A5D49075651BB1BEB076BFC3D2E4613DF6548577A729CA792ADE4790BD83C6DF9C00F14D8778C1E17F28B3C291C966671461CA23F8869ECA90554DC64AA4A5588696EA5BBA52891A819A61247955CB16001DBD8BE1EAF15D852673A41EE926EAE809D3572373F38D2AC6E47E1E64C04B9398860080970C93C8B339B92CF6DFF3CC74A1252E2C5CA08527FEDB83B12916048B0DEDD8479EF427B99B9D04A540BEA6DF5D5CBC7D4CF12A0D4226257E24B33301ADCBEDA5B4E51E4E9C7B3F905C46E4571154575C95730BE2FA7A2A6F3675FF00E96467652696971B59E596DD4BAB4BA9234BA9484B80816195E3D86FFCB382B18C12B65AAA115149395265A6C573654B2509009482A5288CA096BDD81BF9B7F1358052534E562B26584CF96929CCD6009274008F32C7CC98FD0BB01E2796C6186A838969EE21D90AF51A9B559771B092922725D2B5D943AA0904A517D2937D00152A3E6FFE247023C1FC5F59230E9464CA54F9B9810EC4AD4087DD9883CADBC690E17553EAC4FEFCB9429936DAF71B061C87D23BC46B8574894695352524CF5148274170492CF7D6EE3D348A797326CCABC8FE00A729E40117E9B80D7F7877F6DFFB5BFBC5862FE9D0790FA4211CC2F6FF00807F5833FF00923E9081B1EA010762080524770474208D8822C7BC4485AA5A8292482342E4FF007F9C4250953B8D7CE0424941286C86C5908E5A3969EDE545B4823D401FA4578C4EA8060A6B3756F3D7E712BF0E8FA6DCB6B98A48515AFCC014B7FD040E52C2AE4875AFB8E8DC81CC0AB0000B694DABA8B17AE93365CC973E62148650CAB29B8208D1AFD795B4B452E2694A2880097CE4BBDD85C326DE10D764B0CC49372631CDE2AB838636E05B3F68DCB25B6708542A886D9529A2CBD232CF4D36B972D14A98F3B292E06F485A014AEE98F4DFE0AB8EF16A8E2DC264D755AA6C8935D46AEED6B2A49089A85314A89494822E92188DB68B2D3E078714227AA59EF14E4973AF4BEBE7E9B3690F92942C2F88F2BF0CAAA743A54FBF2489F917E69F909671E53C89A79094B8EA9A2E28805362A55FA5FD63DB7E26AC9D874942E95926714AE602C5BBC425619DD8806CC036CDA47A13F0EBD9DF0D712E140D7D3F7A512D252FABB7555F9171F58EF6F64FE5BBEE735784E91CCFFBD126C21571DEE96C1BC6314B8FE26B490AA89A10FF00973AC0DB676B58FE8FA6CD1EC2F82D2A6386A4BED9525AEE4EAEC7EEE447258CACCBB9316670BD2D6E1B5FE225599817EBE50F216136F4481D368AA5E3D5524029587EA735DB997D86BEEDBD653F623C009244EC3413BFF2FAB020302FA16D04768A7E1CA3D21015234BA549A05AC18A7CA34A5586C41434920A77B11BEE7DE2D555C5D8ACD69614022ECC9161D4EBD403EF768C8A87B2BE1BC309FF008FE1F2D092419F9D01648D99C2B997DAFBEDF6EEE2DA52544A9A705ACE28A936241B106E34D8741D361BC5AD5515F5ABCCA59B93A1203901C5AC4F3371E5AC67987E11826152C2AA6553CB5001C14A12CDB9B0E7E6E22B0425D40D2DA5A2D8B731AB27A6DEA371D7D76EB72045C69E9B160190090A4B1252EC0F521C0D362D7EB136A78AB07A0B53CE9290CD6500C363AD8B0BF568E3B885AD449F3D8DB56B686A1B8BAAEBB927AEFB923DC916691C3B5F4B573AAE522609B3661985DC872492C925B7B16D36E74353C53267CB0A18853A7380E0A815005B76B3DBAFCC4412D2812406507A1054028903EF59AD436B6E546E4FB457555062D557989586203E5034DBAF227945AE9F1DA71349FC7D3B937FE2585F7B07B0F2B4456AD249E610AE9F601C2E74B10924246FB8209B1171731CA28B124485489A85992E02BC3770430059C681D881A748CCA8789284809A8ADA632D8582D37605D9802FC8D9C1BEF13210928166CB57DD4B79160BBF5D6370AF7D5788512E7D25E5A66208B8B9E6F70E7CFADE2A6B310C0ABA4AD099B28BA6C92A0766D013A8736FD8470AAB4E91ADB069F5494949CA7A9B5204BCC30D4D4BA42AF7D2CBC853480492AB0401A94A2003D6EB2789313A41E02F9430CE80A7E56502C458FEBCBA3B8BFB39C0F1E2B2B928999DCD80B8366B5F9FBB5F48F24C2983B32F21F169CC8E1BB32711E5F6276A604E2E952D529E97A3545E6D41602DB69E5213CD484B0A6B93CA08424742445D6A1780718616AA4E29A1A6A99880512A6A64CA97532E5BB8099A94A56A014490852B2392E2EA7D4DE3FF00873A75AE6D56174CB0A095164E629700EC1C68DB3C6693866FE203C5585D54EC0BC67E56D459999528904E6461995905234D92DA2727794FCABF320A815B80B2F3C46C94289B46A876A9F079C11C5F4D5557C3D26554D4CC4A94294A972AA41209621792458DC94CD5007C9A34878DBB3DE34C02AA6A64D3CC4494A8F884A246504B5C2496F41AD9E3620C88E32B86AE2128F2B52CA5CE3C15880969B5BF23395372915D4B8B483C9FE5355664A61C58274EA9769D4956C951DA3CB8ED27E0F78D302ACAA46198655D3C894B5E6065288397F3044C4852140001D964024462141575F489527114294A66D082FCD880435EFA1D3AC5D4B6F29C49702DA71C50BA6525D130E246D7F2CD1684B9D8EDADF03BF4BC6B0E29D927116153549AAC3AA54505963BA50B8F200FD9EAD72A3C464AF309E0A1C929529214C01B020BEBCF9831C31353A546F2732DD8EE952E45640F62D4C2C58F604EB1FD401DA287FE12B4CA515E195598027F21046B637DBCFE515A716C2D0C95642AFF00C5EE39B103C881A5B9C7256EBC96C38B69E209094A12658F9EC482E59D2A4A36372904DF600C5B28784AAEB2B26C895455128A104A0AD0C09716724EC766D3568A9955B44B0F29525DAE4939824EE0333F9D9B5DE2AB575B7775D946DD501F620CD234057F538ECC32DB7A503EF1438AEF6BED7BFE13D9471AE275B2A4D0E1959390A580B58924A5B3072181B5CB3B16D6E62CF8862A64664CB58704B28017F41B72040DA2C1B8B8F10DE1CB847A2CFCE634C614DAA62C9469C94A565BE199D15CC4588EA6A05B9708128B758A7B6B7085A91393724E048292DEA3A237E7B20F83CAEE24952558CD04C92E94AA74D9E9549952923F3CC98B2400948F110E4EA12924B1C697C455A92495800961BBF20C4172FA722768F09F0F1E2BF8B3E2AEB38F333334B29BFE9B6443CA43797F25392D28CE27B296C30CCCADA179E9B4BCA2B7D45F71C682147944B6124C3F111D8F7655D9960F2F0DC0EBD38A6392A91733119F21C524A9C4A8225CA5CC285AD61190A884146ACA26C6E1418BD7CF733192927C0E3C4A7DD5661D1EF71AC65E4582020283A9D2DAD0F0B0252B6D24A1D48B043C95156A45B606F7ED1E5A570CF5F3729397BC521B29B82A2414FF00E395AF6F1022F19552CD5CC0EAFE90E3705CB1D1D88D03B5DD9DE25F5F9FE1B0FF009FAC71393DCA425048CD753EFE11CF7B1FA08A95120A5B737F9422922284211037B8B74BEF11272B10412A2D95B63777B8FD6113DD02F706DFBF7FC3FCC44696A8242CCB504B12F95C16E4403FB7A453A7BD3308259235077EA352D7DC8895C42DA046A0B5A85D0803CC01E97B6DE9D7D62BE80D1CCCA89B294B59B060352586E1EDAF5DECF104EAFA6901E610920905CFE66676BBB79B6BD23A8621C5941C2B47A9D7717D6E9D85A874C47C44D566AF34CCA4AA5948D4B4239CA1A5691B153E8434BD24B0B73CB7D82ECF3B16ACE35AAA6974987D4E59CA4B2B22FC44B00C90E18BEC39078B657D7489D207FB79CF38A400004BE63A952B5B1D0077B93CE300DC6478FA651E50D72A980786BC28E679634483292F5261130DE1E909F410D170CD3E584BC12BD4A216DA987083C9538DE951F53FB16F80744C954D88639293494682954D9935330A859CCB084A55333382012909041721DA20E1FE14E35C62A9225C89932529418250D6240D580B0D595CCB4613333B8F4F127E25669C7316E6B4D65AD027895270FE0F5CBE1F5CA4A2C85B52C87A8ADCA09B5B634256B79D52884A964EA11BA3807629D937074E44B9783AA6D6C82512E7CE2522614B8CC519C801C022C1F70ED1B5FC31D82565751A2657D1CC33549495008218B5C936737DDECFCA2D7EBF96998B5E74BD8AB3E73527DD9A56B9A2E627ADCD6B5A8DD4415D455A413D00B0B5B6EA63B329E470B5304A65E1985B200033E1F46B36B788AA512A2DB97BDF611D9141F0C941387F128A71275BCC07AFF330F31FBC51A3E5963CA1BC66B09E7DE6761D9B4D8279D886B8CA1DE58013654BCEB8A015606E6C77E978E67D3F09D524A2A708C2A624F2C3E925A83FFE4896147A0760C06822756FC30D04A4954BA49E0B59D4B51B6AC3391E5BFB5AEC72AB8F6F108E1867242770F661CD66D61B90790EBD43C43308ACBF3ED36425D9044CD792B99964A9948502CB8DA12B74AD2AD6551D65C43D8CF66DC6B30D2D5E152E5AA6864CD401DDCB725F32259761D10A2DF96E008E98E32EC427E0F37FE969673A525403172C0E9B35B9EC7CE3609E073C6C724389E9C6B2FF0037A4939319A336B44A3F46AD3825E9534F25294BA86AA6971D4B4ECD15290C043881AC84829EB1A1BF11BF07ABC130DA8ACE0DC355329B2A97DF5382B0A1AE6C87F8C848DCAD09667360F1AF38E609C51854E5A132972E5A4964AD07406CE4A48BFF00E24DC4646F8C5C0CDE6D70AD9DF81995333CE632CA8AF48D2D128A13087DA9DA7CEB4D2E59D41521E52814941D45C49B900289BF407C38E078C766DC57455189CA99227C8AE92A945492005266022CA0016BEA1BA3458654F417189ABC62C46977F47D6C7F578D7EBC24B13BB5DE19061C7DD52E6F01E35C41409C2AB24CBC8389916E5D9527B2B5CABDF6A46BBDFCC488DBFF008C0C30149AD4A58D44897509527465A1C11CEEF63A5F9BC77676778822A3BA4E77CAC94E8580E7A9240D1BADF9E542725C30A2DDEE0A10A041EA945CA0DF637F31D47FAB6BDED1E78E032D3579D154490851DD8D8B7401835B57BC6C19A99D2E4812CBA5AEE1C37933EBB80F1D4B1DE1CA6E3AC178A309D765A5E6A9588E8B3949A834EB28D2A6A699536DAF64DD2A6E60B2E85A46B1A763B98EF8EC578CEB385F8DA422967897241406597719D162E08B8D459B71A18C1F8C706958E61332555CBCC120A835988046BABDDD83D86F16EFFC3B59E551C84CFBE203C39F30AAAEBB3183E66A989B2DA66716196EB126D56D997986A442B4AE61F986AA089AE72921D2DB2E0D7652C1FA0CEC7B8A24F1170DD3552BBA4AAA643AA5214E94CD48026109FE54A9449969B009D0001C79DFDA260F3A83129B264A5425A1647E50E41360E46A1AF7D6F7D63010E8494D94350B7E207FCFA7B46A3D3338B3B93AED6FDA3EA131A9399040E40F2DF7D35DFDC74F09E22A942A19515C7255239D4E4AE79214095361B46A529045F495684D8FAA77204766F0DCC9444992B3FF00AC951E81C66B5C976B82588D846907C48E062A302AB9D949694BD47306CDEE435EE7A36EFDE1738F9798BC0770F18B1F75D999C7703D3E9B5171C525C7153B201416A2A493B143C80012163492A16B13E15FC73F094BC338BF14CA8044AA898CA218975A94E6CEF7FA72BF993409EE265420021E62CF3BA5C01B9E6DA0DB78C81056A492011B13BD8FF7F4F68F38AB96F4E10FF954DE400B020F91BD8F58868521557354412A48370F7399886F3F7789C1B807D45E2C517B8421084210842108E287036A374A8951005BF01DFE7DBFC45752804DF64EBCAD14389826953BB28017BB9572F2368F15E22B07378FF24336308BCD87515DC0589E450C9495175F7E8F3ADCBA52122FBBAA4F4B1DEC37B46E47C28F10FF00B6F19D123BC293F8991BB1BA92799661F65A24A7F874B2D4C6C92EED6E8D6D7D9C8B1DBF3DDC85BD1D7989825F4AD28C378CAA52ACA15605B5FF003279A08B13A868280A5277D88DAE63E89B139A6BF0CA2A8242C4EA2A69E14096FF00B084B83B8F06FBEF78DFEF855C6325225015B04949209D49B02FAB8DB7B9B08B842AD2AD2411DB576FF36FA461A85642400CC6D7DC59EDEBCF40EF1E8561EA456119C0620172074BB5EDB5C0F4110710DA6CAE6581DCA82566D737B00137236FE906E76EA2262A4CC9C52C09CDA79E8C4681833E97D4DC4565650D2210A5AA64B41F3034D7CBE47503A70AB13D214F91339549D669F4F646A5CF4C2CA1A401651BB2019859B58F91A55BBDAF68AFC3F86EA2AD655DDAD85BF2FCEEC2D71AFE91D6FC43DA2E11C1326677D512734F4AB2A4AC12E06CFC9EEDA45AD63FE2DF06E1B77E070A73F12CCCB9500F30C96A4798905239899C4B0EA91F7BEEA54490362378EC7C0F82D6ACB9E50008B022E4BF20EC741761EB1A55DA77C4BA65CD988A2A8252EB6C8A0CC0D9C86E970FB08B4AC43C56E62D75E996E4A7114A61C52CB4C4AB2EB6EA413B0D6A64377E83659DC8ED1DAD85F034AC89CF28330CC598BB166D0F3F3F58D63AAF88FC66A26ACA674E20122CAD3AEB702CC06BCA3A02B3CF345360713D4AE46E04ECB0B1F4DDC0458ED620456AF81640516942C4B02069E46EFB69186D47C4971A99F311295546585B26CAB279D9FD2FA73D23992B9F39A88F3338B670006EA0E3F20E1B8ED65294AE9FF68B03EE6203C0D20FFE881C88047B38617F4B74823E22B8E124280ACE764286A3958728EC725C4B66ACAB8D97312A9D4A41F23B249285AAC426EF372DA6E5440075D89B24122385F004A9A8EEFB91C8300EFC8F97D22E523E26B8CE9D48FC42AAD32DF749B6BFCDF527AEC5A3BBD378BFCD094F254E5E953AC9FB88703697562C371E54F5B9B5EDB7A6F165ACECC920102597035CA37D1B53C8B3467D807C55E2895A44F9D358104B953DDB571A83CBD7AFAFE1AE34692F34A96AFE1C9E69E4E90E3924A91424036D452B79F426C2CA360AD561B0DA311ADECD569CCC87B924005EC3AFBF2F9C77B605F143267213DF4EBB004A9406A3CC5FA6DABC5C6613CE6CB5C5CD3029189528A94D00D2642A41C69F97709EA0BE84C8AD1E616710B55C8201200B61B8870157D35485CB42932C241206603ABEDA6874FAC76F603DBFE01894B126A66492A51BE628D4EBA9FD36DCC7A55428B42AE492A52B14B91AE32A41E6CD4D7C3BC1095742C2A5D4A652B1D504E9712ADD1624C5CE969E5E1A902A90429296CCECA1EA082C5AEE59B980F19BD4613C1FC6F48569148A5CE4900B21C9201B0B7F516FD23C1E77217F97D43FD419638D311E01AECBACAA566E8956AA5203642B50D53928F3334024D88D0E103D2FBC713712E1DA9229AAA453CF44C390A6A254A9E03900B77C159736F9407B3EC0F41716FC31D26253A64DA1928CAF9FF86185DC8BA40701AFEE06A0DD365871B7E253C3DCAB149C279E752CC0A0CBA92A3298994D57A7E6128160DAA7310CB3EE5940149D33009BF7B4605C6DD82765F8CA26547FB651C99B56D373D390C82A724E42ACA181B0096E4356E88E24F873C4F0F4A932A4AFC2EDE156C6D7624B73B836BBC5DCD17C7978EDC38D3E9C4991D83EAEE4AB52ED29F0DB6C4C4D17028257CAA7B8D498594A16B51165100EBDEC23AA47C1F767D5B97F09916A98095AA62129968B064B0014E6E2C0DF68EA1C57B12C6E925CC9EB92B4A520ECB7B6B76B681CB87F38F50CA1F1ACF102E22710D7304E4BF0D186313E24A52968A8B72532DB4696D25E0C1995BB509E9794490FADB404B8E5BCF7B5818C5F1BF83EECD387D02BB13AB9186CA01C4E01241524BE520824D81B80D6F28E92C5A86BB03A85CBB950514949517E5CEF6BFAB6A045CE4C64EF8E0714EDA6999818D70CF0E18426D2029C94AA619555C4A3A2CB434FE115546A087792A572D4E2D2B0E006E1636C3E67167615D932552E5A2562D53252596A120495286A52C5135C1E801DEC62810AACAA63303025D83A94DD366B86D7F58BA2E1A3C15322F2A31149665674D7AB39FB9AD2EF226DCAEE339D9EACD20CDA55A8BC69D54714C4D2C1174B93926E39AACBB858046B4F6C3F1A61786CFC2B8366270AA6CCA6451CB95256A252A19664D9404D988BDD2B5949DDC08AE97869CD9D4824B7F33D8F406C2F7B01A6D199AA7D2A9549625252914C93A3CAC9A10897629AD89797974B32FC865B62510132A9692129FB3E584A06CD8012911E6871AF6B78DF15CC9E712A9993A6CCCF98B9B872C9B3000DBD185ECD9251519094B8B387491AECEE390D1BA748E5A414048164950529F02C12E3EA75479C06C428B452952459208F28B111D554C65AD7DEA92E58F8945D4D7B33A80009241673B9D4C64B265F760B905D826C1C240162753773E4DBBC5403ADED7ED6EFF3F7DBF48A4AE5E69C024B8018EC06A74DCDF5F7D6DCA9473B316041B9D9B6BEE47F6845244E898A4817DADB7E708842812D77BFCA29856AB80924FADC6DEF6EE7DBA6DBFBC490A0A0A0E42487001BFAEDFABC4A99332CC422E01373CF4B37BFE912252A5072EA03CBE50A36DC7624D80E9D49F9464F33134D552CAA1A7965535404B0C87249605CB6A3FC447553532649502C403770FD3CCFBD85FADBF7127C4B654F0AF96B89B35336312CAD06994D90755489379D49A857E6C254A4CA5325FCCB2F2C20E92F25B6F71E71D236CBE1F3E19718ED0EB29264CA49A65CC992C84996B01944396093A072543401DD8DB045D1D763152A45385AF32AD95CB8277D1F6E67EB1A46715FC7B7119E2338D2A4D3759C41963904CBEE4BD170CB2FAA9F3F5DA136BD34D7EAE698A2CCE3EF4A250E388987DC690E2945A02C0C7BC3D9BF615C1DD92E0B425345435D8C53489495CE500B97296103BC0944CFCF3133129F1E5524B1214418D98ECB7B03C5F169B455357226A64CD285F8926F998B9B75E86FA08F30C138170F6069644A61FA4CA32CF2D0D4CCC4E4BB5393D36B4A4054C99F984BD361CBDF4279E10D83A50024003B465F6A66850BA214E90951214A125001528DD49CA9600BECD7BB47A7FD9BF60F8461541226D4524AEF132D1F990926C90FA8279B1B6BEFDEAFA6ED052DF964DD4C87EC879A5ABEF6971AF369DD400D7D2C0F78C7314ACA2C625AEB10B4A6A49CC10157B9B8606FA97DF6B1B4771FFC7308C39A5A244B01366084B5B4B003E4E6C4BBDA29A523FAB58B74D2F3CAB7FF00DD67FE778C58C99EDF99577DC8B3B6DA74700758BAD2C9C2E580F2A5863A6506CFE4F7366DEC62294A5BBE90A59249D4F28BC45C1E8970AD2074B0000DA0254FE6BD0EEA3A07E77B44CA99585CC040948B8762801FDC7D3A7945441085978A96EBC41400A4A1965A411F79B431A0176E4F9D49B90120A88168BA51624AC2489D349241D49B84EB772FFE1CEF187627C0585710AFBC54997E1052F952ECE5EE436A6FCAD1E5798595987B1B044FB3CCC3D8865D6DAA42B74A5B92532CCD257A9A9D7E6A554DCC9725DCB38820A8123CFE58EC6C1B8A308C7252A96A65C9529485CB5A66CB44C44C42865295CB582852540905D26CF1AEFDA8761D86AA8A7CD974C824214414A0588720BB3D8EFCEC1CC665FC2AFC52F12A2B14CE0A78A3AA99533ADAA9597D9A15971A2E3CC280966E4A7675E2661ED4AE5F2D242C7995722FBF41768BD8161D886232318C0E9E5CA49A997326CA96923BA566CCE3F94A14FE101D4194140067F27FB5AE07C4706AF9C99125484216A2E80C960A3AECE06AC1CBF5BF4CF0CC9B4E08CEDE3532550A5372D4ACC0959FA3CAEB4DDC944CC56D4FCEB090A3F62FA56C94A810494EE00B475F7C4F70AA95C2F8695054C5CAC365D3AD4A0A242E424BA0950CC549CC3310E18863CA6F64F5733F1224920A92B620FE67703FF8EC6E2FEB78CCBB8E2DE4214B275140B057DE40DB4A15FF00926D6245C7707B4793735030AAD9F2C9CAEB5063ADC97B0B58EF61BBC6E24896154E92AB9CAEE06CDCDAEF72F7F91891482A69C4041755A524363A2CA549D940F54804A88FFC45B788B0EC597418B53D64B24293312E46ACE2E79E9F51ADA2555CA973A9D72AC4A9243303B6DF472E7A68230CFC7326B5C27F169C38F1EF800BD2030D63790C298F154B4ADB6E6A8D3AD3B27353152242187582863984BCA279BCB576247B45F089DA9A6BA8E4E1132A539FBB44C9685286799312529EED2F7FC8A5AC8B2591CDA3503B56E110F36A932588529CE5D2CE0E83911B104E8EE4E3C9C20A7637363E87B7B77F9464B4E3C5761E271F41ADC0F6D9E3E8371212D48CC1419B5777D43D8ED7FAD8C797E6EA3565B62F4A6C14BA1D4398576094A112EB29DD5B0372AF73D3D6D92603513D78B2244A42A624655A9280A2C01B9B07E7A6BAECD1AB7DBE53495F09562BC2491300F3CA34776E4C7CC5E36D2F0299C72A1E1C9938B5AC96D8AC629A7F989B16E4A5A80B60A49B5D054FBA1253749B2AC4DA3CA8FF00504453A38A31594A5244F5CE52BBB2597F97FA75F96DE71E422D915D572D2E0254B214C59CA94000742435C0B8717D23314E0425A3A4A6FB0DAC7A03B7FCFEB1E47D7CA32D0A4CC4A90EA240208E5B9D7D35FA718581DE4D2EE49D5B6720FCDB76D209FBA3F7DE2C11733A9034BFC8DA26842108421084211414D8D48F4D5D7D3F771EB1574B62B3A3A0805AC4DF7D39450D72553652512C673DE02000ECD73A740D731338D30EF31A7501E69681CD6F4EB4AD03771040BDD2B4DD36EFD3DA3BC3B0AAD9D86719D0CF9CA32A4FE2A493356E940016904B9606C0B9F5B452D613268529596514A86570EE5ADAF5DB73A388FCF2B3BF2F26F21F8FFE26B29E642D99238D26AB94C4389E525E96A9C8CAD55B725F504971A4BD30E36168D48D6DAD37D48508FA61E06C464F127675C375D453D35AB4617F859F325284C79B255326292ACA480B12E62014D884907420C6E17C2C57C9955D2E966CE4CA33662322545B56167D5CF983A58BC76A0E25F1A0900D8DD4748001EE49B7B7E178A04CB9899C5131241CCC0301ABBF2DAFF663D2EAAC630DC12994B99592652908D54B0901D2EC6FBF9318F10CD6CF5C2B95AC1949A9A6E7B1025B53723232AA1349D400B7C5219E614A82880438526DB91BC763F0E70DD5D700B452AE625B3254104DB90700374E86DAB6A776AFDBFD26088A8452627254B405B251303D9D9803AF2EA7DF1A398B9C98E332AA2E0A94F4E352BADC12D4FA74D225DB6D2EA87D9B92E95A4BCB5D93A1252A234A86C5568EF6E13E0F404CC13A53109BE64B1CDC85BEB71BBC79DBDA176DF8E71956CB934F327CC44852C128528BE62395FF0097968FCAD709C37F0139F3C46AA5A76998666F0CE1C69E417310E26939BA6CA2985DC739A4B8961FA80360409343EB370AB69D463B129F87A453B6596905C1609BEE753A00D6D3E66313C3300C6388D693512E7AC2F52A0A6BDCBF9EFA6B199ECA7F066C96C3F2F273D9A75FC538D6A8A4A0BF49A7CC49D3A85AEC35203CCB327544B60EC0AA642ADD49317D914A89432A52C036A007F205CD887FB11DAB83F62FDEA52B9B24826E428286ACEDCFF47BEF17668F0D2E0DE5E5DB97193D4C5686D0D0E6566BCEB8342401CC70D5D456BDBCEB2A5151B924EE638553B92420B126ED673736D3D3A467345D92612854B97369505401CC480059C392E01E5A75EB1F2E6BC2D78339F4153B95B2B2CA37015275DAE36B4DEFBE9356FBC36DCA7BF4BC71DC16CB90B7908C8D3D94E00101E9E4861CC6BA3B0E77B3B6A2C18479F55FC21383E9F43A24E8F8BA94FAC82DB92588669C6DA37049089F9D7A5943A821C6D440DD365011C042A4B14CB512F6B3EAFD1BAB5BE516AADEC7305AF49A64C9952CAF45D8007567760CDBB9DB78F01C69E08B94B502A770666B627A24FA8DD96AA6C53A7986C760A70539F6F6DAF757B7B0856B5AC5E41EA72F46D00F96F6BEE7AE71BEC2A55085AA9594521BC04923AD89776F41CF58B32CCBF06DCFDC332CECC60EAED0330649AE6A954C2EC9D2669686CA885075D553CA96B4A41294AFA9D29481B4502E94ADC9907723C3BB3E8CFD0B6FF2EB1AAE05C630D98B4C99352A009CB942890D70EE2CE77EB7B698CCCC3C9CCDFC9CABAA471DE0AC5584E6651C28957D74CA84BD33E192AB216D56C32649D1CD0E6FF18B36B1E8413455382A27C9528D382A20B0CAE599998DC5F90373B45BC2F1EC1E7A4FFD44B5D94124281B68EEC3C87EAC0F66CB4E2331BE067FE0A767175AA529D46B94997C3E6D7B25499852C92E27728643A54B36484AA3A7789783E7CF337BB9331249533A54524B59367676BAAC39C772F0476DB8A70FCF932AAEA264A40287EF14C19D8FE7B10DB5EFE91928CB7CE3C1B99D2ECB1213EC8A9A5B1F1143985A24A602AC2FA5B74B0F2D37B8BA49F99237EADACECF27A533679514AA5A4AC02E0E64DF6E6D601FF58DFF00ECD3B6EC231B954D2A75753AD533225454B41605B57B8FD39EB1EA09429E2B4869C25B27981B59496FA8BA885274DAC77558758EA6A8AFC5A9EA552EA67AE54A9530A1E63846549D8AAD71E91B335585E13C432E54CA29726A814254A32C256012C751AB83701CFD23AEE26AAA28744AA5414E252DD2E51CAC3A87969742912EDA98014E12A0752A69361AFCBA76B6F1D8B8157D64EA1CF433BF10C2EA96CB6722E40B59DEC34D43474CF6ADC3D82E0B80D62EA132244E1296425602540E55598DEFE568CEEFF0E5E4C2A4727B367887AC34A1399998B0D3A90FB92CC95990957E7DD9A32C669A3CC964BCD4B8756C6AD2E1681502A00E857C7776A58B70FE072F07C2B1614B574EB909A81DEA4295304A589AE012CEBB91B1B168F16F8AA7AF14E2EAD909967F0C85CD29580027F3B000F95CEBA0631B28AC9B04852260FF00DCDA10D293BF7E72529DBFF0B937D85EC078918EF68F8EE2555306235951521DCAF32C82B7D3C3CEFA5B6D35B850E172D0332C2410400540A8162C1B2927D3C9EDA4028136B11E97FDEDEDEB187D6628BAF9658AE5ACBBE75A89BDDEE4ECDE9EF174551CA67006FB973EEC469AC4D165974E0A9E6AC6BBA85EFA92E75EBE4F09729282592401F3BFB11E43DDE2900A2A1D45CF522DB7D6E361F3FC6209EA32D652953A406195EF6D8D81E8396A22A89194017E67D496E7AF97CE2A902E45EE36FD07A7BC49432828ACB1670E6E4BEEF7761C8BF2668A59A14569CA0B39CC46E001EFFDAE358404B5ABF2A4ABC81FD408A88A848D16BEF61B77ED1C042C9CB94E6E5BF4F7E5FB44AD167D4F2DBFB811C7407374A6C0ACA50906D75ACDF4A137EA5563602E4F6117BA2A450A6A8336594929F095037716F37B30F360E628EB0A84C94B03C28512B3D010E4B359B998F24CE9CD8C2B91196D8BB36B302A3274EC2782E9EFCFD4D7393ACC921F75A6DC5B34F6DD79C6C2A7664A4966552AE7B896DD2DA0842C8D99F86EEC5311ED0789A8C7FB65454D389D2C664CA5A900155CD937B073AEFE716AC52AD754052D203366AADDDCBFCEFA3B00F6D0EBADEEE63447E2BF8A0CCAF120CE5AA663632A9D4E87925862AF312383303A1130CD3AA6D25E52589C12E127E2872591776EB4FDA7DEB2A3E893B30ECDB02EC9B86E96548A6A64E24BA694B9B352077B2BF8779284BB254491DE2C8CC0A404900A9F68BE1EBB29C471CAA913F12C2E7A6515A559A6C92124020B9253A17B03625CB6E38F232125232AD536565DA9495966D0CB2997683494B4D00940012058040000B6DB7A4438862757595B3D6A5A84A5AD65291A24124E56602DCFCC728F5DF87381706C0F09A212A5494CC95252E909402E129D99B51ADDDFDF9FE40021054423CB75022FDEFB817EDBEE3E5145328E96A85C34C21B36971ABDF7D747BF998C90623364B499682258B066667173A7D058DB66450A30A5522CCF44E0509D519EE43EC1C9BF5DACDA472AA7156EB54C097D89E5EF7E9EBCA1159F8B2FF94B7917FF00FB629CD025258AD2DD08B9F66FBE508E3F16A7FCA5BCBFFF009FD3D638142925B3A4827A3E96DB6FA69AB422867A7F1B384A59C8950D4F8400347D2FD791E8C4264EA09C9972939D0A05CA466B93D1C69D039D440A0B88711E5D0A6D61DD4403C9D2799A3704B9A6FA129BA8AB648262BA46132F0B29A8A7AA429563952BB9B9E449275BC48C6A4FFB9514C9532513990A0CA4DBC42F66BEBA6FCA3C6F38701BD89284FD5F0E2DC90C5D86529C4B842B92CA53151977E4C29C326148B39CC5AE5DB2869492B55F61BC76870DF119504CBAA49521442559C020A5EE6E3F35EDB837B6B1A51DA9F6492315A7C46A3F0256B12272832092EC4836DC723A9B35A3DB7C2433BB11E29E31F185471838E0C4B8EB0AD569F3C1D05B53935465CB204D388504DD4AF8E2398A1BF63D63AE7E22F0BFC770AAE74A42574F213326E6431093529B249D8A7BA720B9BE9A13E6EF05E1D3301E24AC93894A3421357312813C6474A5458F89AC5CF2008F28DA854A2B529450A4124EA0A4A9373D3500AFE93D88D8F68F0B78E259463753DC8252998B0549BFF35DC00D650F4B46D9CB9B2E6D0A2648509882900290414D803B166D7DDEF13CBB8A6DF6D482906E41B916B14906F7DBA9118FD0E498334C504A8390542E48F6D6CDE7168975673E558290A39731B82492EC58D8D85ADADC18F00E287282899DD91198196D549444DCACFD0A61726AD05C996EB72E9130C4C4B5AEE151710B48522E4EBB026F63B5BF0E3C7B3B87B8AB0FCD5429822A258495AC049739487D829248E80FAC629C7F831ADC1E7CC44A2B2A4288616279B8F773BC6BA31E9D800681BCAD1EC44C91FF00464907401EE4585F4BF31CBD84792678CFA2999638B661C017CEA4CD4B21B3DD4E32E276B6F72542DD2334E026918E2A7A9208553A920A998A8BD9CEE5FCBE66351BE216BD349C3B5925445D332CE6CE9D9CEBA9B6B1B82782C61898C29E1D19032B30D299357A6CF6206D0A494DD350448B7700F507E17A81D6F1E2EFC7EE289AFED57144CB5E74A56A49F1020F88D9816F5FA5A3CA1967F115152B0011DE2D4E43D892EC762DA1E57DE32BC36474FF00B761F231E697134C1327CB4A5AC038075CBB9676B37AB9F2978620A274D17BBEBB37D9D39738E427A0F90FD23128B9C46108421084210845258B91F21FA9B456CC4997229D406555CEBAEA7DCB7BB44129250B528BB7EADB3DB604B31E7BBF0661C719E6724FDA5D84F426E92E8E674EC13ABADADED736CFF8671C12574A33E556648052C08B84B82CFC88E7B9B03160C7164E4CA49637B697258F2FAF5B5F4E5F1DECA87B2BF8CFCA2CF89060314ACD192A661FAECFB80265DAA926A53326E17DD3A509D12AFCB295AD42C83726C447D10FC09E3A317E06FF006498BEF589AA92952B31EF274A44B9AC4920782520816172EF1D9DD96F17CBE1EC5F0FAB5CDEEC4A5CB330E6CAC12B0A0F71E8E3D0C613B3BF897A661C969DC35835499EA93C971B9BA8344B89975105254CB893A094EE76BF4F7BC6ED55767AA9D5826E42139AE02497166660CE5CB38201BEE23BF7B41EDDA5E214CB952EA9C2A594B2661727281B17B33F9EFA08B10C278571CE77E3C91A0D025EB38CF11D65F4896A2CACBBEE3DCE797A7F983F38D34392C24900A16EA1002493B5E3BD7847034E1F4A842A4A50128B3A41623405C13763E47A346A462ABA9E2DAC9995732685A8FF003A943C5C8BB6D7EA0F48D8FF00836F0A0C2D964AA5E37CF26E5F1A6345A6566D187925B552E8E1214B5313C862C875C529490398E1559A50DB7BE634F2932D730A400E6F66D5F6B75BB74D1A328E19ECC27D22CCD99289EF082E52ECF7704DB77B78AE7A36686429F4BA34B0A7D269F4FA65365DA0894A5D31A4B52B2413609B252A55C84F97751DBB455C6C570B6009C3E5A54A94900009FC818BB390E19AC18ECC7998ADCE1EDF818476326A5126584A5297018D8338DF4D39F3B79C4A5A2AF30EFBF6EFBEDD2D6F78AE487487BB80403B79756D75DFCE382A0BF1B839AF60DAFA34020A363D4FEFDE3961C87B08E2260402094858EE93D0FE9D3AFD20C390F611CA4949046D13F31BDBFF004E8FCBEBFD5F85EF6830E43D847135A6865006CD700FD45FD629FC858761E9EDF48651C87B08B54EC165CF2559125F7291F2B6FE7F48E9B8DF01E0FC7D449AA3E33C2F47C494C7DA5B45AA8D3D1373002C14AD32AE29256858041484EE146F6DE28EA27F74A0819763700EF66007D6E446238A767527149E26AA5A49660C1AF7D2D6F6D6FE5838E2C7C20256AD2F55C6FC38BF372134969D9EA8E05A9B6D3466DB405B930AA6179965D43CDA3FFC74B4E951510129518B7554B15082084E8760E4373B7F88E89ED07B2B9D225AE6C896A0CE5D014347D0A6DADB4D630253F4EC759478A1E939FA55730BE26A1CC2982ECE33312AB94536E589982F213F1282A49D37D62C0DBDF03C5307EF73A4A432810C007B91B6E3A36A4F3B75D70CE318970955A10A5CF025AD3AA9603037BB8B59FCA322390DC4253B1F3030F6259A149C4520121D7B572935255826C0AFCABBA813E53FD5B4744F1C766C9ACA69825A594A51629706EE5AC7A06BF998F473B12F886A5A4912A5D45427326584A84C98F719458294480DD06D61B77BCF29AAA4FD128D81A94102B78F6B323469096974EB9A7A49F7343A8084EA5282CAD876C13BE8BDFADB09C030FF00F8461758BA8392549A79D3A62964654CB407CC4AF62ACA39B961165F880ED569B89A9A7269AA1CAD246542F5716663A5C5C3E91BDEF01591F25C3AF09F93994922D3685E1EC17457EB5E4D0F8C4537212CBAC29CD81BBD3A5D5AEE012A17EDBFCFFF00C66F685378BB8E31239C844CA99F34A10A3DDA4AA66664BA8B84DC3B9B3C79F8A923F1932733B95788B392E2EFBBB5FF004DAEEE5D5CD5A937DD249F6D8F4FD3F3DFBC68B4C524B82012E0BB8BB5C3FAEE4EA22B51A06245EEDCFF00C369BC72748BDFBC51AD7CB5D2C2C1BEDBE5AB4554462917F98FDED08443087484224045CF626C6C4F7B9BFE3B7BC5C697C0852B98EBB6CCF6EBA7E908A9636BF6BDBEB14E89E4542576FCC2C40259D83EBE5CBEB121572AF33CF57F7D629ACCAA4176694B436C254F9712A290D06C02A789B5B53771A6FD8AB63BDBB4B87B0B9FC478A61985C996A5FE2262107225CF88A6E7280F627A1BBBEB16FA9A8C88327C39A73A58B9373CDEC093E679BEBA6778DA71935EE26F3E91C1F656565F94CBFCB99875799D334E7F5D3311E2075E6D971130EA35B4EA29E996994B21B50004E39F7AFB7D047C24764323B38E0DA6E20AFA74FE2ABC20512548095CA12D20CCA898E0121D6912F44ABC565338ECDECA3B3BA9C631BA7A8EE14B97DE254A514E677513941219AC5EC768B0FA451E9944A53147A4B09669F4A9666564194EC1C742425D7937EA3C89248DBCD73B18D96E28AF4CE6A94ABC201243DAFB30B103DF9878F60FB32E194E0D85D3A0C844B5265201025A42AC058B241DBD01F37FA4949425282A2A29012544DCA881626FDEFD630B9733BE4899665DC375BFEB1DB19945C1240BB072CDD06DE513446E468488E21073A3DB941CE8F6E508E18721ED08418721EC2108A69A82EEC6EFA79DB4BBF3FDA2A242920B167770ED7E63CE207FB8FD444996179D8AB30D85C903DF76D3EAD15134A5495048B80790DBED8E9A8E713B96D02FFF00691F881195E1D332041258020B39058EADEDF58C2F1BA74CEA7AA494A4854A58BA5ECA4B3D83962368F21E174AF2A7C4332AA6F4A69F46C5B306940A7CA959AA4DCB09AF9ECDB5A80DF707D0C5E3B4447FB876638A84273A9292A700139532D6EE7903FA8DA3C8DEDD785E652713AE6A11DDE69E48284E424A967FA5AF6F96D1B8207D2B1A52A2A09011A95D490077DAFD47D0F7EB1E0FF17C8553E25896701FBF9ECE1ED9B6E619F4319B70B4BEEB87658513648D6E7F28D497D87AFAC12DEE55D0107D3AF7EFB7F68EB2739105CD94D6E56DB97EADEB45312B989003F86606661B9D180FB0F0B15794004AB600F424EC01F63D0FB476070ECC34757435E145065CC96B24129200BBBEEED737370CD17DC5D299B82CC944329528B0604BE536F1737F23CA3558DB9BA7FA74DEDF4F5FF78F6EA3D51C5670A6A13A0F0F36D05EE7993E71E01C43BCA9EC2F43C2120853957C5D8858A54AA1B1A9C710552E85A023CC08587C0E9717B8B11197607365D0D2D462534E59349227D44D568909929CE5C8167BEF7DAE63CE4F8A1E2029A1A992951F1A5490DA02410EDD19FCB6E7BFAF09596FFF0049786DC94CBC5321B4E14CBDA153D0D22E94B2EB8D38F4C24024A8956B413AC9370371BC7CFCFC4EF10CCE21ED1B159CB9BDEAD5327A8ACDDDA62D8F8586846DA7520C79E782AFBE4D42C6866285AEEFADDCE8C0F41D22E554004F96D627E63FE2F1A5D3CAAA7139A955DA5A8005F549D58EFD34B45753CBEEEA66302C413A36E6D1507416F48B12832943400903C9ED1510886108421084210FD221A4137F4B6FBEDDC03F3FEF15336685CB932C5D49DADEDF3F939D624D44DEEA59274B96EBF5E46C768A4BE436A4ADC4254A51290557BA428596E26CA02EDA2EBDC11B6E22E32E44FA697267074DC29C07D0BD987CFD48778B70A5358952F6059CEE4E9D1C9200D7908C16F8FE70F5FF0058B826C498D68D21373B5AC9EAA0C5ED2D085DC61F9144ACED6A78B8CA50EA25DB9494779AE21C4F2D2D29695A092A8F68BFD3D3B4D4D2E2585E12A58986A952E8D28528D9738F7692CE0BA49D1F958DA30BC6E7D46164896548502E0076617F7FD3CC46899905C3E66371199852380F2F69B393EE226597AAD599F65D5495224DE5D966AB3366D0DA025B5960A9D68909515297DBE85786174989CA96B5842959520B0058B3173AB92E0E9E71C6054B8BE3F39092A9AA0A206E581DC83672F6B0763D5F6D2E13782ACABE1730D372349A3A2AB981392ACA6B589E725C2E69539A0F396CBDCB09650547CA997D0916040B98CB272654821080371BEA3A3EFCC1F902636BFB3DECFA6538953AA25160CA254921DB5D5F7DDFD8C5E6B6DF2584C828A55C824AD68528ADC5396075B9ACAD76D161756D7D80B9110AA5E54A56C40568E3D75B7DB98D87385D14893292132D052003F945DBAFDBEF154129472C5823A580173F355B51FA9882385264212532F282030D353E807DB449A53E9F9910FBFBF68A1988528009F6F6EBFA1FDA7B9F53F8C5722E94EF6F99BC554B494A1293A800442E4F53788A238100EC6108974A7ADBF0247F784251FCA4F57F98FB313422ED226CA00020397F220071A68DEC6CD03BE8FF00C15AD3BF456DBFBF41D6E22D555256B9E0A4961A803404972E41BEDCB42ED1495D5C6956854A032E52F671A9B5F7F6FAC48E210E294E38B792544296F36B5F31B03FAD22E4109BDCA4A4A08FBC920455A299920ADEFD011B5B4D6DB6A7918A2EE6971E94B933509515BB381E5E640B7ED78B01E363814C11C5261676A9254C97A0E6B53D0E1C3D5691684BBB5AF26A0279A40128E9E604FDE6524EB3BEF169AB928217A39B0D2E5CD8837046F7DEF1D29C75D9953225D44E932929594A88200DBEF78D4DB1CE06C7591F98754C2B89A4A7F0F62BC2337CA4AA71A32EA9F966DD52553F2FAD080F0D4D26E4071BB2C6D620460588489C679973A5B245EE36E65EDC8D87EADA9F2A7631C2F533CA664E4A5135762E2C2E05B6671EA4B8DB353E10F9538978D7E34F2F6A95F924CEE0DC97A17FABAB95275B52E4173722ED3E5292D3CAD9A1315413333325BBF9952A421B4A52A11A6BF14DC6145C1BC198A284E122A2B50BA4968B34CA7095AAA54A3FCAA4CC4C801C87049019E2BC71855E2B35289F356B0F7CC492953DAE4E8C4BDAD1BFAD3A5D6C2A642921B2A2DF312940424AD492A5202400901A23400903E51F33BDAF631271AC66AABD3342F34F5827303BAB4E8C2DF2D62F400EEC16B9482FA9D8F9FBECDEBF45084364A9090926E49F5BF5EB78E8B9931EEF6FDDEC2FA5F488D3A0F2882D5D87D7F7FBFF0034E56E2D63A7D93F5D7DAF531327EE8FDF788211342108E53F993E63EB0892E35107ADC11F80B7F78B816EE5597928684177F778454241D449D086D049D879D5636DC8BFE16BDA29A8E42A74F4200CCA52D2C43B80FA00FA17F78A758214482FAB0B33F5F26DC83AF368C7F788D7144CF0A5C27666667CCCE891ADB720F533093414D87E7AB9372D3024E5986DC0AE6AD453F74215727A5AC47A55F065D8C4CE39E29A3A954B1DD51555395AE625E5CB75392A51601232104B8DAFCEDC29575588D02002477A3304B93AA59EDA5B96C3D747DC96A454E6A9751CC6C505D9EC519933B315FAA552714E393EB72657CE5CABCB2404961531BD908579EC7B5BDECAB461B4780CAC2F0E328228248A695DD1053DDCA4848CA1C92E43BB9BEBA5FD4EF87AE06A69786D254CD9290B2896B25490E0900FA970DF3F3F7148092D148B16505B6FBE942AD71BDEF7B0DD5757A1EB1D47895515CA994CA3E32E058DD8EF7EA2FF00E23766448972650952801943727EB6D44000901205801603DBEB10D2A4A644B4AB54A403E8037CA22D2231510842108421084226894172DF773E763A8D9DBA7BE91019813310922EAB8F4FF1103FDC7EA3F48B6CC010B012E3437F9BF42C475DA2E2856619B9F46D3689946EB427FA4A46DF33FE3E5174A69B910492C12F61ADB7DEFCB99B0EB66AD9266255AB3106DB3962DFDB61A3C7806369D99A0F107C386280B2C1A6633257349B0D2C998A616D249053A5252E5B55C9D4A24DB68CE028623D9C6352D5E27A7AA0010E73196962399B7A1667DFCEBF896C32448C550B6621614E181D4EFF00B39671A3BEE312AEF3909787DC74A1C6EDB0D0B420A6DEA23C32ED729BF078C62094A425E7CC66DD9675D083773A5DAD1D7782D4A060A84A7461E171C8BEE4F41BBD8E91F517E51E5DBA0FCB7FCFEBEF1D312E44C9B4C5694B842CB90341CC9E56D39B9DAD5B454C2749CC41233662DCDF4EBB368CF726290495102FA751B0574B5F6BDFDBAFB45DE8710264A2981F1A40209B1B036BEBE9B72789D3099E9553B38008EB6B5FA5FA7AEB1AAC32971E76E96C8503A4A09DC236BB9D3A0DF6F63BC7BE270F74A0A266752D0951401E2049D23D25E3AC5BFDBF0F99372156541D0B06DC8B1EA3576BF26ED9C0CE4C3FC5A7885E52E119168CF60CCAB9F94C5B8DDD5CAAE6651A664E792F196734A92DB2B9D4493ADA1D70A820A35142ED162ED478864F02F6678C55D48266D5A5726427433109964CE04EC0A5696D8DC0D2DE48FC4471DA315C5D785892A4AB2975E63B921258805C10799DCB46FAF2EC34DD3E9F2D2C90DB32ED6845AD608421B690CD9205B9296C1BDB7D605869DFE737B43E2395C41C5B89D72432553270CB9B9A9446A6C1FF00C46B5E08F4889885DFBC538243102F7B9DC73E562C5A390A074848B9FEF6FDF4FC3B4746AE77E17119B34A3BC042D838DCF36F724078BEA027BC52DC5DC3359FA9F5D5A271B003D22D130E65A8E8EA3F5842208421084210842237DAD6F9D8F5F4F51F94729B292A3B1076B5EFB38D3EED143588EF90C9246DE6EFF7FA4525B6B5EC8290B295A2EA49500971250AB0B8B129245FAF7F411971C4E4D5514BA64CA095A036721F51626EEC5FEDA26522D1225842F31CAA4AC652C4941CC97770403B3F3D8C740CD1CBEA6663E01C6D9775D6C4FD2B1CE16A9E0F9B95710172C6995A9398919E69D6C82A754F3532E0052A494DC5AE378D8FF869ED066703F1AE089505AA5AEBA4070B2023F88972E9D2C6CC4336BA08B0637868C4E6A67785194B90198B13721C5C8670C34768D347C3D6952DC3FE7A712BC2756E872B258CF09E2B7F10D16A330C8667B1150279C996C48294E0E6258A5B521AD2104EB1384796DA8FD5C7623C592F88F02A2C66410A45452CB5CC96924844E42121484804A9B2E455C972A277B76476672A8A8EAE54B9929335495A43EEC0F90B93661B30B4660E59D134D36FADC7D6DADAB001694AEF722E545B24DAD61EC07B18D84A4A638A2D534AC4A28BE53B82FA0B172DF60346EF615F83386A66499212AC83C235072EA6D7F60081D04546D21B6D2DF5D254759DD4AD447DE3DED6DB61D4C1338CF9D3699B28A72539B5CDD760DA7AED16454D993E7CC4A9C25077079ED766DC7C9B489A27F702FE2DED6D05EDAFDB472259DD6FFF00E503F58443DC17D587D7CAF6F5D3AC4F95910E54028B59C6FBB6BCACFA73844F4A42430828E6512030274844510C21084210841CF38453AEA132A600A482E0DD9F721CF4689CA948A8A55A161D409651D406D05C7BEAE7D4445AE2E14A171709205C7706E0EC7D2D15A9526621D2351AF43A7B1D0DBF58B45109B864ECE0660492120E9C88B11F460CF72F112A32C87C34B71C53D6E5A94417A58FFF000A824048371D527A01D22CF3E532F338B282B29B3826E357BB16B375B455E2B33FDD505053DD852487203380410FE7BF26F2386BF177C85CBEC4395A8CE49C9B92A4662E1B9C96A2529D12C958C48E4E25C52E9AE25B5B4A5BED1956CAE60A8A525C00B63588B57132A91183CFC61494CA14F295E0258928049676B6960E7918D51ED7702A4C350B32CA0A94092430209F223F73A18CCBF8117098BE1EB84F94C6B5DA6B5298AB3A5DA6E289A57C1AE5A718C34DCBBEF5165398EA9C5143A8A895AAC9093C949091B11F3C5F1D5DB92389311C4787281264FE1A64D97DFA26E742CA0A905486B04ADB30E82E7431D19C3B822EA0AA7998122E48208200D2C7524F2EA3A4678F65A52EA762A2B2E83D54EB842D4BED61706C37B0223C55C4EAEA4544EA79D30CD698A5E7279936D0F3E7B79465C0A913D74A2E5091E21A102DA5EF7E6FAFA22D0A566E822AD12C801C81E9E7AE9102904DCFA5A2189D11E908421081DC11EB112139D694870E407173025813C83C4A40D9449DB6FC37DF68A9130A14A94A199992FD6FAE8352036DBDA384AB307D2FF7E514DC0B582424AD2CADA3A41B6BE6150D20D8D8A74DC937EBD22EFC332BBDC6692982331A89C25EA7C374804B6A0BD874778A2AAA8124124155980BF524160FBDB4B5EF1A8FFF00110672BF8DF38720F85AA34FDE469B3CEE3BC54969D0B614E3AEC8B149919993410ABCB1959E2B5ADCD2E07800846824FD0EFC0BF03A384B82F887179ECB562926969E4132D94833D13F3290AD42A5B249DC66171BE5BD9AE1A78931EA6949053DCCE49510C4594080DC8F37BB6F78C65C832DC9C84853194A52CB689C9C6DB426C2588F864ADBB5FEEB87484EC9D3A08DC9DB6B254A9D453AA1532699B294A2528D59DFCF9DF5672FB47B3DD9570B9C2B8729A61502D25076D426DA752FA6BB6F1CA8C4EBE466AD35215E0752B233EA438E6C3E5611D954539536A4CA50600817D1B671CB5E7B75308A804100A6C0871EB15D3D1926AD2E0B28DC75BC23989508421084210844D4CF12D3948724BFA1DFFB037894B9256A4CC76CAC1BD5F9F51F3F288117FC41FC0DE29168EF0E70A6706CDA5CB0EB7D4FB454A67776026CD726C49FAB6DF7AC44EEB0BF4036F523F41F8C4EEE8A65AC380C82DE7D58DF6FD3468A49B3C4C761ADB930F6D62D67890989A9398CB5AB34B095C8E2391082904281332C1242B5796F6B74BEDE9D33CE0F989A8E13C4B0D98970B454F8F98C8CCEFB75FF003E7EFC55C95CBAE42D25FF00210C2E439B6A2FA6C402DA6B1B9360D9933F8570E4F120999A3C83C6DD8AE5D048BDFCC41EFD0FA0B5A3C59EDF28453F1157C94973DFCD503ADB39716FA6D1D21C3C4AF0C4254480E05EC74D03E9D2E6FF003EDAB3700FCBF21B6DF2FD3DEF1D038656A64266D32E5E74CD4A803A10A37EACCE7FB3467F86D32655266CD99C396D1CB0F5DD859EF6B44AB56B01247416F2F537F4F43D6DEE6286995F86AA42D57CAABEFA38D06BD7C85F9DBC5319150A9AA5829727297D09E96623A38DDE3510CD4C7A9C0587A7279C2815C7241F97A7B28365AE69C42C3480804A94B256DEC900EE9B1DC47D14601864C5A054CF7082B0949525C212E0E625C0CA01751E578D90EDBBB56A0C2E8EA24AA72065429BC61983DC0B7A46D09E093C1156B872C9B9FCDFC774F5C8E69E752A5EA3501509632F3D49C3C194BB212CEB6EFDAB6A7BE3669D054405256921201B9F353E363B6FA71495582D05524C9A797329CA10A1942925495120382490CFAB011E5A719E372B89F18995F28E748252E03D8924DDF500FA3D8C673396038B5A084B4B71C521BB58A01081B8B9EA4122DEFE82FE2A4BC4E6D4D7D4CE512A1354B984E61AA89720DBA6DC858463F4F28A05F99670C0FD4BDBC85EC4454B6E0FCC7E9FED168CFDFD52C936F11B7276F99F3FD62E487CA3E5E5F7F28451AB53E67EB114238842108421084210F3892A4DCB24B797DDA222E08B758AE91318A46A9B007A0F6EA7CC9884A1C3652C3A18A6E38A6C17EE12E320B8D85DB4EB48BA6FED7B77EBD2E778C9F01C6D7846274B5F2CF8E9A6A569209242828283105DCF41122A907B898424B849D0176D36DF97ED1A9878C9657CCF09FC66E4771B387DB729F8131BD54610CC45368E572A7256624DE70CEBA9B25B4CECBD542190E24EB2CB96240207D30FFA79F6B52789F8729F0FAB9EA5CC4C8945282B0425811354410E424049D587B43867153495D2C394B2C06B3862C36E6E35DF9DE2F5E8F5393ABD164AB72251FCBA6E42527DB710A0A6912F36D95B2B2B1B695E95E93DF4ABD23D4E5624292A92990AF04C50622E4ED76E5AB5ECFA068DDCE0AC6115987CB04E6F0071625DACE0FB9D5EDD23E99BA56A42B65A2DA927A8BDED71EF68C9534B925A2A4243D407246FB8FAF58BFCE94997314B01B33663EA59FCFF00B42388970842108421084210842108422827A5E68EA3F527E86D1CA67041C84FE60F60FD19F6B3C4C9246B55AE10852D67B250917528FA048DC9ED1552D795236663BE8799B0B3070D6EAF15669730700105CF202CE3C88DBCE283E5B6D21C0B0A0A5349D8DFCCF6AE50BF62BD0BD3EA126DD22D7555012B3999B5049D03B1B1F968DA1D5C58F11A99547267289014942882580F0DCB3F30FA6CDA5E31278D30A57BC41BC4032DF863C2E5E98CA0C9D9E6EBB98D55944AA669CF4C3D392A99E727261043082E1910994E66BBA4CC017DEDAB3F123DABD2F06707D723F129939E54E972867C8A5CCC873100BE64CB1942D9AEA4871BE96F693C44AC527CD94951584AC8201CCC0120025FAF237D2373EA1D029587A934FC3B45A7A69745A24A334BA44925096912B4F92406A5594A4252025B6D21205ADDEC9B6DF2C1DBCF1EAF1CE29C42A5330AD1326CE20E6FEA516B8B7CBDDC4621C373552A5906C140B06B97DF5B79B5BD447DE536842414A813B020107B1DCD8FB0F6FC493AB55134CE9EB986F9AFCD89BB3E8D72C390BC5FD2826A5537FA92475D8FB3066FED1244A8AA84210842108422649B4D437F50810E08E61A236F2DFDEDF97A44E969CD5A124FF3EED72EDD3FCB69BC219367D39FBEBA79791EAD514AB21006C1016FB84F72D849426FDB51B81D7A7A88EE3ECCF87535DC5986787313532F51AF893CB771A7BB5A2DD549330A85DD49661B59AFA3EBF7A0D0178CCC66BCE4F124CF9C5734F7C5C860899461FA6BC17CC976D72B313AA6996D77290B5952AC91B929BDA3E943B21C24F0EF661C394C94A659AA136A96C194A42A5538944976B10B6B6E6363BE19B877F1F8D575414B8926581E1704BADF4E6C1EEDB738F8081A753C9DCAF96D04F5296DC0B2E9B0EC0A51ABB0B88CBAAA715055F6201D7A5F97405F6EB1EC9707524B95824A90C3FED2037A680E9B39B6C3D2A463D509CC5CB59FC8B74FF3FAC433650A3A852D80014D676D776D5C6BBF43A9440341E42271567257FD57F784731C42108421084211297A8F2FD4C463F22BCFF684469FCA3D7EA629D7A8F2FD4C22B121F3067F09B7B45245AF7148162818450DA0971389A9810026EA3CD7D1CBB773AF96AD236DC11DA3B038469D12B08A82A0C324F5124B0CB903EACC367E8DAB468A7C57292BA99697B84A188D3771F3B746DDC1DC5F2E99533807062177E62B0D525D5A542CA0A5CAA09B8EA3A478AFF1013E5CCE2DAF45AD366BB1B0F196176B5FD341D35FF0305386A19C7892400D6605EFCB6B6C3CE3B99047516BC6B52D3DD4F2A018105B737D48D07E82D68CDB0EAA269F2A9D57B6D61BF2E9F7686FDBAF6F9C48D66B820B904EECFEDC989EBD6229ABCF99CF436D80F26FDCED1808F0AAF0FF00C55C6067052389ECF1A04ED3B24F2F2A7295BC19846A2CACFF00AB8D31D44E48B6FA1E4843B2F31516DD6E60A5B72EC102D78F693E243B75C3BB30E1A9FC3B8654A1788D4D22915B528983F86A99DE217224105CA4CB090B5784E6252DE073A9FDAD71C625C498BD4C81397DDF7AA09439D1DC1234B29FD9FCB751A5C94BD36974EA6CA30CCB49C84A372B26CB2004372AD957251600005B49E5F4D82001B08F01FB5EE32C4389EA2A27D44E5CC44E9EA5F89449295289DC9D1CF9F2D0C60982514DA7A7509E5E62A6155DC9661637BBEE39302F1CF26E49F58EA8C1E84AE92A27B0052950049D6CE5BEC6ACD17A12C06BE97666DDFAC4CAFBA9EFEFF4E9FBF48C7652FBB9AA503A15021EE799BF5BDC7AC44A5652CCF67D7FB4491C12E49E65E22842108421084210894A6F7B123EBB44C4A4100DFF004D7CA1104ABB1EBD8DFEBD7F4B402B2D8EC751E7088A9C2871B5E9E614292A083BEB2157D3DFADBBEDEB1365679F311293AAC8487BDC9034B3F417BFAC70B47792E625C070CFC9DFEDB7F91C7F789AF0B948E2BF843CC8CAF97944D4711B346A8E27C3932E361D9866BF48957661A44A020A83B32B32ED8D27512D0EB1E9AFC0EF6A957C1FC5B87613DF94A0D4C84141514A48CE014A838F09DC369678C22A54AA3AC490420858CA5CDC38D6CEEEFA90DD63017E1BB9C3378DF247FD0B889D73FD5F9433731836BD273AA2671D96A71D326F4C2576585051984DD40D80B031F4DFC3759FEF583E1F5E14266794898562E0F8505C5FA9D431F48DA3ECC71952A44A4297A849673CB467371F2772FB6431297D3A79E4294A69B5158E856756B4FCD1E51F5F717EDF97342E8A9A58FE4431BE9A6CD6D39DFA1B46C0AA689A84286E1FF60D7B5ED789E25C4B841C6E7CBAC2108421084210842108422927A5D614FA59BCC738A5593F8848D4302C35D7F6DB7D220AD2015292A58482A0DA05CB8A4EE1B23B85DAC477110AD4132F523C21DB5008FBB383190CD5F754C565DBBB3A5F627F563EC1CC5A671B3C43C8F0F19295DAD34B44E62EC4F2EAA1E0CA530A1F13313F526D4DF39B4EEA2BA7AC327CA094FC40E9717C271CACFC3D354CE52F2F752662CB9032E51F4E5A5FCA35E78E7890D3A6A519F2E64AC0F16F71F4DBEA22F9FC1338327787DC80566BE60C9B9399C19EEE9C49896A5506FF00F5D44912D97E5A454B7017521C5CF3BF78A2E5AD85C08F9E9FF501EDDAB958B546114552A4C890B5489684A880C0A8198B0090662C0198821D83C6AC842ABA7D4CC582A2A98545F525C161CD9EFB8B98CD9A15A9A64A9252E7291CE04DC87ADF69D86DABA6D1E42621366E2F4D32B66A8AC95924B9B9625FEAFCFE952995F842325B448036F32DEFFA5A268C31ACFD5BF7FD22ED4CB52CA546FA8274D8B5B6F9EEF7847115D0842108421087489B203CE962F750D3586B004690013604FE837FEDF8DB68A8929CB5E010CCB4FA31737FBF23A44A9C7282E40607E42DA6FAF5D7778E0D59458A7CF4CA1CD21320EA7D2CF0438A17F53BA4EE36F5BC6D276252E5CCE2DC252A00BD4C92188BF8D04EC7F6DA24C8489A5208198A8BBEC39F9F98FA88FCE5B0D569CC479DDC446259D3CD9BABE624FAD6A26E796D4D4DA5BDEF73D556EDE9EB1F4774129345C0FC252C32569C2E4A54058384825FCC11FAB5A374FE1629E5CB9B8B4D2920E6490FFF00E673AE875243EDE9EC65C7145166EC92773BED7DCF6FC77F6116A54C7B383B81B7CB7FB31E9BF0857E7948927602DF4F7663D793C548A399737BBBF41FE5F56E9A45FF001D941092B4B30662D72ECC7AEF7F43088348B64824C996497748BF384226C2108421084211297A8F2FD4C46E04B5396BFA6DBBC2234FE51F7BC53AEE43721F5308AD46A7CBF5114330E542CF204DFA45B7E774A3F8AB15E4EE0C934972A98971A25C6A545CABE1255FA7096361BE9BBEF5BBDEFEF19AD0552A8B85F14A963964D2543EC33A903207E658EB6B7988F3B3E27311EFB134CB2B21D4904022E013B74275B7B878DC870FCA894A6D324D07ECE56424D86876421B65294A3BD80B1DB63D7B4785BDB9622B9DC675E12A71DE4C26F727BC3AE9F521E3ADB8765A66612826E4B5F46B06BF93DBFB47DB73B7D7FB474E544C4CC4CB601DB5DDBF4EA09F48C964CBEE29CAF51A3DC5DF9FAB86E514E24CA0EBFBF3FD2212B706DA8E7CFD2325781706E1CCBDC3F46C2783A912587A8187E511214AA653586E565A4A5D0D86CA1A69A09424A8005CD22CA56A3D0C639DB0F6BD8A717625513313C4D75A55314D9D6A55CA891AA94C1DDDFE7B68ECE94BAAA9335473AD4B2EB2EEE7FB9B39BDF6D3BD21094202136000205BA00493B7B5C93F324F78D6AC4B129B5CBBAC9960061D43EFBBD9FA003577BBC84AD08CAB249B6AFF00AC4FD22965D6D44A96654B985282194012C793DF5F3F389F0F6EDE91486E49DC973D4C70C0EA01F4842398421084210842108472091A130880481B811C4220B52920AD3BAD035209DECA1B823AF422F7ED159875AAE49019960DAD1C1B850E6086E6E343D0C715D9495130D9754E34DB8C292DA59074B4B55C95213701249209F5EE768EEEECDB1D9F81F17D155C89E64AD35129614924310A4BDC37986FD62C988534B989CEA402522CA3724B6B7F3B9DB511A72E78E049DE067C57AB54B0CB749C9EE2B15F174C4348F85A3D2EB9539B71993FB01F6085B4A75D5CC292A04731074F98C7D497C237698788F8430DA4C42AC54CEA7912E58CEABA92B48C818A8F892412A2362036B190F02635328B129728CF5265674F85DDAF76BB071A1BDDB9B464F12E05A5294DC36948E56F70B695BA1E57ABAE804BA77BD931BD48CE9F102A0850F0F21A6876707CF5BDA37530AAC978861F2152085282015A8751EAC6C1B73D0E9344CCCA2CEA25B99FB7F58E664B9D98F8940B8D5FE9987DD8738433A9FF003126C2E74E5AE9E67AC56D2D8B2CE81AE5EFCBA9FD7D1D15892E073163D4B5FD3E711AC82A24583BB337A11F77844510C2108421084227F2A51AD7B2756907BDEDDBD7E5F3BF68A5AFAD91229172B20EFD45C2B522C2FF002DAFCA38FC14E9AA13C12109074B7BED6B6C74F6E24FCFA28928F55A69D6A569B4F6953B3B3CF381A4CB4AB092E3CE95A8F4420151E9FE2D58555A65226D456B2E5A412CA701989DF4605B4F90618FF117114AA2A499294B01484900067B0B8D6F7EAFAF58C5870B795359F13DE3ACE2EAEC8CCBBC2D70FF003AB7E48CC053F47AB622726C2D99032CB0259CF8A4D36D3977095252C6A49B46897C5676E143C1F846232A82BC5356D4C99A8972D2B0932A46523BD5328399C49082D6EED5ABC69BF1BE2F515D5EA4CA9A4CBCECACBB927477361B8DC7946E2D44956E9F288A749A12C4936CB4C265DA1A19E530928693A00B04A53B253616FCE3E69BB56E309FC598A621598AD5AAB661A99CA44C9AA73F98B0B956DA3683517734D229A4A5083DD8CD95DC8B8767F7611DA6EA3BA892A26EA27A93EA635B2A2AA62153244998A448CDF901203DECDA35FDC9F49A644A2CE816D180B422DF11265A505D21BD9BD035A1088E10842108421089F4ADF8894E1C670E34E708748A99A526BC14DC7789D39BD9BE512A6876E773E65ACFEF1F22B6426993E4B61C6D328F2D4D1170B7396BF314DAC49000FA7B08D9BEC1D4A1C6384E73635528E52DB2D2CFB38E4CF77722F13289290B0E900B827C81D1ACCE3DACE1C47E711976D191CD2CFF00A3CC20375092CC19D49D40071083393C426FE801DAC3E5E83E9196B13B82384A64A0DDE504A5E9B14A3A93B6BEFAC6F7FC294BA69871B0B969CC3BB60A6DB3E9A3EA6E35F28F7E52CF90051D3A74903A155875F736EBBF78C6EE94DEE79F2FDCBFD79078F40B87A9A64B98952414A2C459835D98F2D3AF48453CC98A50092A2E3DB910D68CC6BD426490959248E7B103463EBB7D211126C963AE9E57FDADE516B94C25A43378436CD77B7DEF08E623842108421084221EE56A0A98F64D9B61E7EFFE4C43303CB3D0A8FC87DFCA264A50A365A8A4589B8EB71D07BDFA44B9753290A12D4D98170FBEEDF767DE2A70B97DEAFF008802824BDCDADB6FD77B9F489F415DC200B01D48B5CFE67F3F5ED19261D48AAC9D2B2273256B4A4DB5048D6C6DE7C9DF48B6F1654D2D150D4A90D2D48913141ACCC937E7D49372EFB4752E13F06CD67C71F78224512E66E9595D4F355AAB83ED25645C919A694B4366DA50A7801ABA151685FEE889BDB26274DC19C115C3BD4D32AB0494CB95A674CA44D338962C582E5F4BE8C03F933DA763231FC6EA52B589CB953E6049D48F17840F624B1D985E36D169B665F4A65C290D048E528F5522D64AB6BDC11D06E01FAC783FDA46209C5F892AAAA511312B5CC04A6EFE2B3FB9B45470952CE974C1131CA2C4077000E846A4124ECC20493D493F38C49669D144996B4033C29DEC0E971E96D75F568C927CE42A61903401C87DCEAE3AF3E761108B7A662125C24FCBF40225E54F21ED195F4B0194F9544DAC06A24AAC361756E49E97277BDCF78D40A933EA27296B249517724971D2D7EBD59DA34B68E50482A5067B6F7B33BBBBD8388AE8FBBF58A59B2C4B2066CCFF00DBF7F94561001B1789A254710842108421084210842108421084210DBB8B8EE3D47A44FA698254E42D5A24BF4B11F7F281D0ED6D794012140EA06C7CA08BDBE5BFCAFF00DA328A1AE5C9AD97572CFE5585120960CD705B6D472DA29EA650992169087394B293D41DBFC6BE7182CF1DFE1BA733638617B3B707D352EE3BC84A88C5527312C926A535245B4BF3F2A852105C976E5853D8534E365C254F39E54E9055ED07C0BF6C424E3384E115557DD49A85CAA65AD4B3FC2CE40EF402D9B28D03877D4461D4D3A6D0D726600A395692002CE017617771E76EB68B5EE1633969F9D59138171F22650F4E54645A90AA34DACBAECAD6A4D96454A5A6490952032A71A0DA943CF75929469DFE85703C4E562783D0CE42B32FBA057CC1CA9D6E5DFF005DDA371BB28C7054D1CF44E5B8CA9CAF76E4039B33DFADF668B8C01614E2169014937480490A6B7FB4B902DFD3B0046E7CD1746E7E9D3FBFDF9F702A64B9E1810C1807372FCAF7D39FBEC8453A93DDE8E4E97EB7F6FBB6908AC941903ADFF61E8D1182E01E61E11321084210842108896D6E84357437AC3CEB2E4CACB5284CB212E4C071D407168286F42B669448FBB73B463D5B23BEAE4052990C1C1660C777FBBB795CCE234D4784CE131694AC956A766DDC5BD3F58C5A71E79B18CF30B10E13E0E720C4DD7334735DF91A7D6514A79C43141A2D466554F53130F4B85AC3CF813066D2A6D0897974CBB816E29D525BEAFED638E309E0CC02B26CFAB44844992B5AD49290B510939509B8754C6200FCA08B90D1A71DA37144C5554E972A61233166516D4B13E5EB7F71B2F702FC20607E0E787CC2994186996D7504B0D56B1BD610D36CBF5DC5936C3226261C436562CD96B4241715A49276D463E69FE2DBB72ACE2BC72BD326BD739014A952C09855965A54A09426E5807366677E91D4F4895D72BBC98147C40B92FA8724B976766717B8E422F219934B26E14543AD8A401FA98F37710C5A7D42D7994ACCA249B960FD7578C8C0603C9A39A4DCF4B6D61162BDDC924926FD60030FAF53CE211CB866DDDFD1BFBC7308E2108421084210813604FA0BC47295966215C943E767F477812C09E5135C045CF404FE62DE9D444F90AEF2B90543550373A653FDAFEFB440F99C37AB3B6BD7969D5F68A2EB48986B4BAA6D2C2DA7DB98D44DD0909BA5562083AF5286E401A7AEE63613B25C565D0715E16A2A0922A653DC6CB4DF5B6E3CC126E625A96A9398005D2C42AC013BA497B00C1CDD9C6BA47E7B79D181E632A38F0E26B08D41025CD5316B957A33253CB33326E3D39A5CD3601215736292A1707DEFF48DC058A48E20ECEF8566CA751914269E692036794994A2DCC34CD0B1E40C6DA7C30F12A68312C4644C98009CA94C093A12B1A1B91AD8EBECFF0057ECC2580959517105C7469B729D16B35B1370756EA363B0B88E3104892ACBBDF4274BF51A6C5CBDC748F57786172EA30E97516FFB60E9A0B6ACFF00ABDDDB589E2D929A61629D03B6B7F4DF58A99930CD9C65BE6D773ABB173F7ED08A8D22023296E56F6B421084210842108440F436F48AB97325A299695119944B02402CC7EBFB6B11E42A412CE1F4D8EDABEDFB36B14CAC124B89B348BADC55F70840BA881B6E05F62403D2E3AC634AA69F36A9D092C556376D7FBBFCA394D40A294B5964B026E40B00FB5EFBB74DB4F38CD6C7F2F80F09CC55CA4AAA01A7D9929242C844E549B405A2552E8BB810F07590D3A1B5152CBA9D00201576F70AC812C4B33328292082A19420002E4B5920DC9B30B9208BEB076B7DA2C9C3E9EB64F7E12552A6A00CDB949660FA9E8C766DA32E5E117C303D94D94F58CE0C6D4E98463ECDB71B9853F329297E9F2812E38A95438ABB8E36FF00C5A752D41B23942C937DB49BE313B4B4621493B0FC32A8CC954C1725012ACB701944A42884A94D7D49000E51E7660A9A8C5B17AA9D312A226542D6E5CB82A7DEEDD47B46608795B61BB11C9650CEEA2AFB808D89EDBEDFDFAC795D4733BEA89F327A89CD99409F76EBD7AF3B4776D2A25D0D2A5360A09B82C58B338E7C9F7E42CD1B0B5EFBDFA7F78B7559CD3D65F761E4098B5A65AD55467310823AB3BF5F23ED108A68AD8CB446A04DA82A709B0E9ADB6FEEE5FA469A29D23C2186EDF2FF003E5787D6FF008FF70229CA94ABA89F53FB130412439D5FA7E908E223842108421084210842108421084210874EBD3BC22098F94E5D7F4895685DC2C03A46FD7DF6FF001D37FA08BEE1B324A69E609AA00876245F4D46BA5F97D23994B4776CA201637201F6DBD2D1D4B1760EA4E37C358A309D6E525EA14DC594A7E95352CFA02E5C4B969E439CF6D6929597BE200FBAAD91BDB6BED17C3671B49C178C2833D4AA5A13532B7292C16346D7AB9EB18D55D2854F0B480466D53BF5F2FBE91A6CF0BF2B53E0F78CCCFBE09B190E4D26A9587B1860371F0A0CFC1BB373AD3CED3FCAA484BFCC94BA11A5C1CB4EB40B08FAAFF87CE33A3E27E0FA2A8935499F964094A577816BEF25206652C139815661E7721D8C770767989A6915369D331944A583B1B92C3605B70010CC232D4D21D265D6A515699275A716374A96DAD91A491717373626C15625254018D874CC428120D87DDA36530B33E6484CD5B94B03989B333EBD1F7B93B0BC4F1CE649DFE47F68BD2549AA5044A7528580B33BEF7B69AC22E32D0AC89B6C371FBC44A4141C8AD5363E908856B08B11A6BD3D9E388136EB12CD4203B916D6FF00DA382424392C39F9C46C6C0F631C0A9964B0209F33FB40282AE92E39889524293A93BA6FA49B1001F7BDADEC4EC6E2C77113173512D1DE28B27AEB6DDBEFD238529290E48116ADC5FF0012742E1AF29AAB8A670B351C4D32448612C34E1E63B56ACCDD98972CCB2438A765D9794CAAA20367992C5286D2FA816C61BC4588FE0A966E2692934F292A4A979C27C4C6C4A88000704924243B92D78E9EED0389FF00013BF0D2E690954A0A64BD9C1B9018936D399D768F77F05BE0731261192C47C6A67F48BF3F9E399EB7AA785E8B536D2F3F8530FADB4B92936DADD2B6587EB2A79D9795432BD6D7F2ED4EF242904F873F1C5F11F49514F5D826098A899512FBE96A44A98B75AC3A4BA8B16B3253A02090D98BEAE63552AAEAC5AD799492336627C24927C29BBB8675386F10626E6360E6E518974A3E19B75284A532ED36E2829C6DC04AD538E1D4429254BB0B2D4BB20F9378F0B313C5B12C4B119F57892D644C3317996B511E251CA082E0285EC2C5C39378AFC384B44ACA03314957E51993BCB497724F3206A09B3373631559904924A497D4E5FD58C57C229A6F77A219DCBB0FB1EC6108930842108421084210881E87E46394EA3CC7D638502410358893F6647537BF43B8B6FF005F6F5899295DDD4A56A0C124BFB9DADCE21969297CD7F26BDCF5B7BDA25E59710B4292D212B43683AF51D7A54B2A26C93D01036EBF3BC661C33894CA7C7E86A65A94254A9C852D4EC0242817B31275EB6893529510AC84AB3289E89748013FA82CEF6D2F1A6B78F4E4F5432678AECAAE2464248B387F33A48E1DA9CDB08024E5EAD479965D5B530536D2EBC8AAA4A4A93A5C083655D26DF463F06BC694BC6BC095584D1554BA89983A69E6CC964B2A5AA6CB5266972D66948B03E4EED19FF64D89CEC1F8864F7AA3284E988487536665161E5767B1B69162ACBACBAD735AD2E2668B732CAD04292595A54A2B045C58DC5B7055B9403636EF1C752D5464A1CAD24860E030B1198116F76DC73F69FB37C4454F0D485A5798AE44B3A83FCBBDEE3AFEE62AC5253D1CD949EF6686494B0653BFB1DDADF5074CA2814A35AA330784921C860CEEF7F21FDDA110ACA41241B5B5F61FA3F58AEA85CB4CD580A0CE75F3308862505A54582813C84204B6B13532D4BFCA1FE5F7F7C8C2210A49B3FD626FE1677F4FCC42228817266203A936DEE0B79C06EA427BAC94A7DC8173BF4D81BEE445B278AA5D54B972925482DCB9BDB7B06F5EB12D388514950A69B31A7AEE9433F84B3B97B6FC8C70EA33B4E94A7BD3B3936DCAC9212EF3E69E0B4B0D36C80A7D4B5D88D2DA3CC40B950D9214768CF705C3A5CF5A25AD2F394058A7F5235F3F326F6C038FF8BB09E19C36754621569908085104EAD94B69EAED6717678E1F07390D39C6FF0010CD57EACE25192194F3B25509EA729414D56A724DF71F94A7A5A04F3DC714CB85D52829A2DBED02E120A5359C678A2383B87F145CE4F753E7D1CE9689A09265A0A09CA948DE6BB1558A02410F1E5776B1DA0C8E29C58CAC12B7F148138E6092012A2AD4936F0D980B12E368DACA4A5A56954DA752A4E55A94A7CBC9A65A9B4E603653225B4A5082A435A90D92128B5CA774EFDE3C52E30E22ACC6B13C54E26668926AA70415A54A74951219FA3EB6BBEB17CE11A1934B265CD9B91331684A95A13988E7A83B5AFA6FAF2D9E6165AE60B2D09E5AC92012B46CA3D771B8DF707B131D23882108A82287C4093F96C6E77FCBAF95B9C5F3129B30CE0658796E1CA4E9772587CF7D468F135FCC5237B024900D86E075B5BBFAF689D4F854F54B33E6CB16198EE48DF98D4F4BE9D6E5F8DC3D34494F789EFDC166255A1B3EA4B6E6C1BD627D0AB6AB1B7AFF00B753D228D53A91337BB09BBB5922C4EDA8E607BF28932A626636453967DC1FBF27D632CD1A451A75084210842108421084210842108421084210842D7DBD76FC606C09E51C2BF29F2310D5BF2EF7F63EBE87F5F43BF78BB61D2D33654E05883D5B401B5DDFF4EB14CB43A416005EED66BBD86BA6FD622B6961B65B6C9F8879C992D01F7B4212D6C091BEEAE97B13EA378CA383ABD38263922A9F2844D45C69E151209F3DF901D628262194AB5C0B3960E5F7D187B7D6358DF1DDC86AE60BC4F93BC79E57D3172D5DCB4AB9A463E725501B54DD26A8E4ACC21D9D527675A964D32600E6936E71B0DCC7D097C01F6CB22BF0EC470A5D4A14EAA70119866CE91312026F6D4B80C15BDC089F86E2BFED788531272E755C8274047DFB69631EA396998341CD3C038771DE169B6D549C4F234CAB34C0375B4C392CB5A257A1D2B96E7044C0077529172A22E3D9AE1D992B12A04D424A559C036B9BB1F95DC9E76B46E7706E292B12C36520AC2894246CE430049D2F6D1B7F28EF315E6481332021B301A5BD3A731BEDB465F2650A39D99AC4920FECDD08DEDF545CC4C094A5214C121B293AFAECDA86B741098BEF16A5732FF7F584524CF1153117BF4DA20881FEE3F5114736966CE494CA4F8CB161B804126D7FDFDE25CD495232B3B90EFD086B6F7D3A889D5FFB60FA6AFEFEC7D3FD8C5D6824D0CA1DD541489C468AD41FF222BA969E58944AAD6246FE977BB373E7B474ACC1C7B8672DB0657317E2DAA3146A4D0255CACCEB8FA8A135497936B9A65A5AC0DD6AE496AC020951B5FBC635C5153FEDB295349690DCCF89CD983172458003CA3AD38C78965E12898D312E87736BA6D6661ADF5DC13B98B1AE04385AC6FE24DC4F4BF1539EF439A94E1AB2C2B68395586670E993C46FCA3A8984CF4C4A2545A9861D99E520A9FD4086D4922C2D1E687C58FC51E19C1986CFE17C3ABBFEA2AE9E62AA929210253A549125ECA135D24CC6190A549F11B81ABDC47C49FEF95A6785B840284DDC177625ACCFA1D45CB6B1B74D3A4E5694D49D2A9F2ED53E4241932129292ACA199532928847C3B4D25B4A5004BEB51B048FBF78F9CDED538E67F14F1055D58529626CD5A9DC9FCCA537305B99FA308C6C4AEF941C056C76F23E97BB5F478FAA5606DDFE5FF1DBA474C6293E729294A828279836EAF7D9F95B66B98BBC8A6EED1CCEAFFA00DA0E4D7BEE584D16289F0842108421084210842108423905883C883ED08409724DEE77B98452712E9E9D2C6DBF61D00F7FF6B45EB05599738298366BF26DDED77D8B9EBA3873F9FB0FD1A31DDE267C204A7197C2A63CCB6128DAF1652649EC53822A6520CCC8E21A5CBBA65589776C56D09D53890E041D2B2CA35821223D16F83CEDDC7657C512E8A69CD498C54D3A6AA4953266CA4A94952482406F19B10CD160C4F12AFC2EBE86A6973012D4E4A1C310525C91E5ABB3DE34A4CA5AB54E9ADD7F2BF1AC94C51B1D60C9D4536A3233A0A6652DD08BD2C89720951E621530BF880482496F5151008F77E4D0E17C43C37FEFB864D975027C81554D312E153254D4674299412AB81A1D8691EA07C3376CB4D88D1D1E175F5094CCC92A5A90B5B97218EA4805D9CECEEE58C7B0C74D61F5F892B1799455695A64216A4877D012036D60F7200F3DF7CB119085D2A2B70F2159D216E82082F7DB5F2D356636846473901331413A662C072E9D3A6D1229A42A6CA4296019840CEE40BFDEBD6112B2AB91F689A640478B2A411A31FBE9AF9EA211C290588367B3FF00831455556B91297DD139810183BD9B421EEFAF4B1BC225143071B3EB7B0D35773CDE20A2AAAF9E74985C0737D2DCCB6FE606A39225952DED7F33FA388AF9A8AA2851567B6CFEA4B02DCEFE770D1337AD2E21D6DB0B0D2AEE29EF2CB21B558294A51F28504EABFA0B45E30854B4CF96A9D2C1255F9887013B925886D5F76E767B6621270FA1C32A71AAB98844D9095105643B24022E5F57B5F5E8C63CE72FF2831FF1D39F546E1AF2A915046156EA32CFE3AAEC9179AA6C8539B750ED450A9B97F373D72C1619654034EB83438AD37233CE34E3AE11ECFF00860E3558BA7A7A9EE262A982D28CF31494F854125C99614F99475B84B9063CB5F88EEDA2462CBABC1A9A7A660495CA2016D1C063CEE188D2DE719B2CC1F054CF6E13E992B98BC0867A54DCABD229ADD42AB97F8955332D2D5DA84A239CEB68937587B0FCEA0A8680671E0A21442AC0DA34C387FE2AF8278FF18A9C0B8A853CDA31366265CFCED36582A09F0824226060084AC9483A6A634164E2988D056AEAA485A42965434CA6FA16248FAB36B1E5B817C4A330B2C310BD96FC6B64E57B2B71207112F318C29B8704961FA8104B456D4D4B34CB213A81714B6DB03CC08247495C5FD8AF0771B61D3712E08AAC3F134CF54D50A692B952F1090C017994EA282A01F59066070DC9FB4F03ED3EAC2E5C9A8CC8203397297B3B2AEC5F57637DA32BB80F31703E6361C97C4382715E1DC5524FCAB4E308909C6E6265964A6E96E605814CC3608E6A49D4091F38D22E30F87AE2AC126CDA9934D53DDA4956421492C1C8053F9800016B01ECD1DEB81F14C8AE952CCD9A9399237075D5FADFAEDADA3B8E9496D971A7C6879056B95BF992B007986DB04824582BBDF7EB1D4758713C03FE9EBE926A43E425692DA9704E86ED7D1F4D233DA09785D52DD2B9654012580D0B1B7936EDA5A25D5A4137500373A0E95586E6C6E2C76D8DC58D8DC4712F87518B844DA1428CF9846542527F317374E8FCC9B1BEBBD5D65561D874951CF2EDA170DBF3772790B0763D32D11E7D469B42108421084210842108421084210842108421111B11F3889092B5040D54587D986B14EDA9C161736DF6DEFBF53EDFAFCA2B25D42A90A917D9D835F6B5BE4F7DC98100A43E9703A01B8E4D7FB789DE5594829242DBBE9503E64DC0074AAFA85EC01B5AF6DFA4402A26AD59905414F60EDBEF71CBD229168046815E7707CF359C5B5B8F68F15CF7C9AC2F9F99319939518C65513944C6186E7E9E65D4D21C519F71A58935B214094BE85A8E871165A01558D8AAFB9FF099DADD5702713A29D550B962AEA656519D4904A56C5218B87CC46BA167B458713A25CC99267A411DC92480D616F16C1836B7E9D351BE01B10E21C84CCFCD4E05B359D5338A32DAB1547F08A674ABE2A7E41A9D5CB4EA25661D1AD72EEA8492E55B42B969690BE5A529B88FAB0EC2B8E2571270BD2E212EC9AA912E78961B2CA529214A96350C876B38362F1DBFD9A7189A59B268E64C7282941753BB167673D4DEDA3EF1961654EB92AB99290801DE5B92CA1F68122E09077576EB7DEF1DC526B1332B169170547C2198DCE8DD0F4B6DCF6B65D50ADA54CC43789292082E74727FB5F52C778AA34FF45F41DD3A892AD27EEEA277BDAD7F78B81980AC8666B11B803A8616B5A2343E50E19801E6D63ADFDE11390339617B121ACFEACCFCF7E71142C4824148D0953B655ACAE502E1458EC4B813A123D488BBE1D369A8E78A8A864CB0820E6B80A2922DADEFCDB4E71C804E9FAF9ED1F231055E9B46A33F5CAB4DB7214490617539FA8BCF2586E99C8056A4CD28A9376FECEFA141492955883731D5DC49555E9C5975D499C5225454E9242425CBBE836D9F48C5F1EE2497854A58EF02084ABC4766041F97CCEF18B8C3383B333C5B788890CAFC0CB9AA470BB96B5043F8CB14239B232F88912132A999F9365F486D736CBC1B534191A90B4ACA4A6C483AA5F129F11D85F0670BD4C9FC4A25E26890B12A5E609989535A6AAF99241F14B7F166014C12413AA9C6FC4F331754D972E6382A21C10C45F7DDDFC8731B6DFF0094796984327F2F30A65AE04A54A5270B613A4CB52A9B2D2928C49A1F44BA945734F34CB6D85BCEBEA7097560ACD937276B7CC9F6E5DAE62BC77C5759593AAE74D42A62C24A96540BAD4CC4923D4475C61B493C662A0A2EB203DDC1E84D9B6F2EB1E8AE2825494800841514816B20A800AD23FA4AAC35586F6009368D779B56942CAE6A8951399CBEB7D83EDE6C3934657229932D24E8AB392EC7A3EA40E8E1C9DE298428EFD8EF7BEE6FFBEF11AAAA92AA5A86AACAA60C07D6FE4DD5E2A0CD4203393C9FE436B7B6ECF15A3175B675368E5A21D6110C210842108421084210842108405C81CE108BAD29EE806706C5FD5EE3A107EC423813626F5244B381B4AC10E056E959360949491624EF6041EB19FF000A62429B12A6AF3332AE926052482C5DC1E6FB6B607CE23CB48B953135284A8A8320A99C58BB1377D34E578D63BC627C31F1139885DE32B869A73BFEAAA448CE54732708D325137AE35AD97E6DC97A536D166727E61414A5BBCA53EE04799674C7B87F09DF131475D87D3708E395485534C97264489F3540AA9969192512ABACC86242903300729086048B5F0BF1262DC1FC4126BA8E6CD448973731C8A21050140F301F5BEFB98C0F607CC6A36336A62594B99A4622A2ABE16B7876A61123544CEA0A92EB6D4ABDCB73CAE2169B2136BDAFEB1BED8A609435325188512259993E5F7C89924A5489885004292B4B820821C3BA5D9401D7D69EC5BE23F09C570CA6A3C4AAA599A94210A13141CA998820D817605F959C88F4E96507937425ED42C552F38DFC32D83FFED17084070A142DA82DCBDAF7B461AA92B428A569F10B1701FE778D8DA4E2AA6AF9C6753293DD4C53CBCAD97293A803417B10D106D4495837BA480410748FFEAA3F787D4DBEB10F767FA47CA329155DF49CD620877166FA5F5D3DC69139BDBCA424EDBAAD61BEF7B823A5FB758953D39259565166D81672DFDF711434F3651AA409E5D0A512ACC036E40E4EEDA74DE2575D4B68BB8359EE5AB8F97DDB5AFDF7B9BFCA25534BEF94D7655B41F57B7F862F1929C5707A196A566941924DD80040E418BE83A920BB470A72AB212095393938DB326DB45D5CFCE699269A013A8B639819E6949F2DC255A88B826F739252E0267E564FC897DC0E57F5F3DE3A878C7B5FC0B0644C06A24208736205873D1DC8DEFD045BAD4734B13E7262FA46446445127B1462CC715495C30E26410E02E22A7329923352D3492D89212497D534A9C438C9294E92EA928091949A0C1787703ABC5F189F2A90522264D42A6A414AD72D0552E584A92ACD9D40219B28CC0A992498D1BED9FE26933A8E7E118554B89E85214996B6B97049B82000CCD760400748DD9BC357C3E30CF03D935272210CCF66D6299392AC663629504BB30F4CCC8D12B4692985DDD6154C2D2D536A6395CF130038B740007899F16BDBDD4713F11D4617478977741207E1A4D3C89AD2A4CA0B5BA42416F11529449049CCC0B0481E6CD54CC4B1DC6A6D6D4CC99313327A96A2B5120E625CB682C583DB76DE326012E1692D3C0BCD04900384B880166CAB25774A42AC350005FE40479F5C458CD4E12A955984E253A5CF52D2A599530A48048243A487B92C1EDB81A467A30EA25C84CB54B4B80C54CE4960FF004F3D79BC793E7470F793FC43E199CC2D9B397B44C794F98656CB626E9F206AF21AD0525D66A4F25B9B469B829D135D53D6F1DF3D9CFC49E3BC193E8E7CCC4EA7BC421014B4D44D973012438CC95A54412015006EC1C6D16C9B8653D382A42120E64F8941D2A377CADA1B3F898FA4600B3BBC14F34F25EAEFE6470179C952C36A95599D772CF12D627CD2E62613A9D7A5241A992FD2C38E14A1B3FCCDD6E5D5A501A590176F47BB35F8C1E0FE3E91230DE31A5A6A82A9790564A4CA97579D59528EF49EEC4C4206624AB329C837BC432715ABA153534C52427C3949B16B950D5896E9D62DCB097889E6A644E27195BC72E49E24C01895B59A749E3B94A4293409808710D99898769BCCA6ADB78243BF172885B080082EA75A35773711F639D9D7695839A9E1CAEC36BA75A71952CC9975603789A42F24C9A428A434A4AC9D52088CBB05E3DAFA29A5750A5CB0A494BBA8A4DC0D744D811723E71E9DC447891601C3349A0E0EE1C1B98CEACE1CC36912D87B0F617945D5D2DAE65B0944CAC21050D8975B8D38EA4A810014949B9116BECE3E1584AC6A52A6CA54AA4973419AA9D2D40A4024E528292B054D94272D8DC86062D7C4BDA455CC9330226A8B83940535DF5770EE1EE09B3878DAA23E6E1484E89F9BEBC8BC731017DEFD6FDA25104163088C710842108421084210842108421084210844C9530CA98958BE53F2DE112A53A541409D85AC7DFF007F3F784E98672D4A2E33379DB4F28E49CCC0EDF3F3E7052428DCFE5F33F3F58E25ACCB50500EDB1DDB73F7E712F20D1CEFF36FDA205486C1B3A5B71B22652A090A500CECAE50292953C4AD2109505248D5E526D6CA3863139F458DD16212990AA39A898002C090A06EECECDB3EBE514D56724A3674A8292A21DEECCECC000DE77B59CC6B2DE395C2B624C038B301F884E4D51A698C4F81A765DBCCF93A43579C9BA2B8024CED465D905F536148597D61213AD482A209023E8A3E087E23EA714A4C3F8671034D4F2D5225C9913D6B48489C027289854A64A14949BD86609B80631CC2A72A831144F94A3FF7038E8E2E367BEBCADD4768C8ECD4A0E73E57618CC4C3F38D4F313B45A7B936F30E25C976EA0EB2C999979A48515B6EB6B2E0208490A49076B88F60F0412EBE9515F4EA2A9931209965C113080482351BB8B5FC9E375381388057524995348094A12905C5EDD3AF3EA76B7AD1569559640055E429E8A1D7DC5C8F4DBD22F32697169B30A8C9484B9BE64BEB62412145DB4E477DBB1512973147BB054924B6CE398BF5F573AB08996140A0213AF56FA6E12A5DBFA504903513D01ED7BC5F2452544A0153D21200670DBEAEC4DDAE186E0E978E67C89F210EA45C5DECC433DAF72DB7EB68A13CFCAD3A5A6AA1529E92A7C949B0E4D3C671CE5AA5D0CA0B85532E85061A4129D3AD6A4B690A0A5909BC50E312E555512E9BBF325765128241F0905DC0043B5FCE319C471FFF006E933261CB992198E999BE5BEF768C4566062ACD7F11DCF36F84FE180542432E642A12B2D9AB98F24879AA74C4AEB6D557956679E1F00844B4BEB6D16485CD94044A9756E35AB56BB68EDE70AECC785EB24CE34B327F773254A33168EF4B258CC2EA04A0974929B950235B46AF768BC715752A989932D0524104A4EE49B58866D58EB6F5DAE3855E1832D7848CA3A1653E5D509994453D9955566B886908A95667D0D3499D7669E404A5C6DF9842D4010094AAC7AC7CD4FC4FF6FF008D71DE3D5C69EA1465CC9CB00266950604EAEA3E10001CC0B08E9EC22B2A6BAADEA12C92AD1890972FE8EFE9A45D532A2E82B5DD2000128B0484A401B0005C026E4F7249373B468B56D7D52E795CE49CEBF13390FD5AEE7F68CE952912BBB4A2F6D459DF41B8B6BB3EE22991A9640B8DCEE7723F76FD22D7366AA6A8A893E44DBDA26BF8401E65EED7B6BCF7FEE5EB93D3A0B0B44B4A9482E9241F3E7B7F8D2242E5E720BE9D59CF5617FBDA211C44C01801C801ED08473084210842108421084210842390588235041F6842270A858E5E8E3F58441448091CB4AECE21CF36A162D9240F291D751B8FC22ED874D98B44E23C2A005C12E4B1205C917BDBCA2DD59878AC9929667AE577649CA824050B72E440D7A0E6FC09B9454E2669332A438CCDB856E36F32D3CC68B2D0A614C2D0B43AD2D2B21416955EE3A758ECEECFBB49C5B84315933A4A8FF0E6209254468417370012CDD3DA1574E8553894C1C25B396CD6003BEA79B102CFB8023029C7FF00820E57F1035B9ECE4C849A95C9FCD7B3B32BA55367572946AFCEB87985F999671D70216A746AD2D29A4F9D564EDB7AFBD88FC66CE9586D2E1D8D193514A132A5A93314833102C93DCA964997BD810924070A64C5061188E23C3D522751D5CD19561565902C5F40C08D1DC1E91AE6E6CE4A71B7C2D56A66899DF91D8A714E1FA638F4A318C70DD2A6EAD499B62557CB4CFAA7E841F61844C213CD4A67DC4BC02ACE2750508DF4C0F8B381F8B24C9C46871DA742AB25A2A154B55365CA54ACF9546589A4A24AD482ACA72A8BB12924398DB5E0DF8ADA8C2A968A82AE4CB5AE9D0896A985D4A2520024DDF63736F3B378B35C49E0A07955893AFE1F7D1B2A5EA544A904376D941A75B93FB54A48095A8AD6A0ADAF78CF918160D3E489B4F5D2A79525DA4544A9B725C3896A514B8B8701C36C6362303F8B4A09F29299DF874822EF6E6FCAC08D069E61E2A3DC4AE592104313551AA3842425993A6541BD6A51B04F31E954A13A4EE75293709291E62045A6A787095293FF00A16254A9B2D0A0967B254A04B5DEC6DA39BC5EEB3E25F079B4E55227C8134870124B72D73374671B5CC73A878D7363346A4D50F26723B3171A54262C1A7E4309D7E7A9E8BF42E3F2726522C06FA5CEA7A98A79BFF11C0291559896314B2912DBC09ACA75CE7701BB996B52DC394974B0BE9AC74D7177C4DD5CA93365D3290A2A49CA7311E999C0D1EF61B6BAF77E223813E2372B7271ACD6E2EB1527010C44A44965FE4F61B7E4AA58CABD529D713F07CE92A47C7BEC48C934F3731506664333E52C4CC9B67E3D21A191601C59C31884854CC0EAD152A41004C9E04B403943952A72532D09771996C9DC1168D34E3BEDA788B88A64C659961454004A8B92E5B424F2D3CB6B6C07E085E17ABC83C1349E2373568725FF0053316CAB8FD1A8D555CA3F3384687372A934A7ECD2CCD4AD61E6DD35408995F39B6E625D0EA1252511E6E7C67FC41E2986E2133843089F2C50AA410BA8A79A41993485778B202F28292320CA908294029725CF50D18AFC5271ACAF9F37BC0A3E052890403A02FADF35C963CAF1B23B6DB5A1B482A5A92A2B71E24799452902E364D9253B103512772768F11F8C2A6A2BB11A8AC9D5D3A6CC9D35531CAD4540AAE475FA6EE2ED9F502C212121203A024160483772EDB8D6E430B738AAB4A0D936B7B8B6D7B77DEFB74B763D7D311A7130A8CC9B3573521C842D448DF63A7B45C3BA5175198B06E4016BFD4B9F96F78A4A6D2A02FA82D26FCC6D6B6966DD012DA9208F9DFBC51A55397309CCAB962E90A480E5AC458750410378A79C0CD4E42490189B9670EFCEDCBCA24710E2C04A74DB6D576DB5F33AD8381695051049B2882AF31DEF19970ED6D5E153513A9EAA74952492C85948049F37B1E5E5A452268D21947C4FCF9B8D89725BA5BE63C7B3532172973A28B3987B3570061EC7149A88532F335BA7B53536C8536E36932B533A6A526DA02CFD94A4D30D15045D04A53A767BB39EDEF8DF84711915785D655552A504832D73D4C94B87219693B024BED7E711CFA644D97DDB64E643BEFABBBBBEFE7CA35EFCE5F02EC7993598F219FDE1FB996DE0AC6B86E7A66A345C335D144AA536443854EFF2E935D6A5672652D9B2186B9B306C2C56AD898F563B10F8F3A15264527194AA4953A6E44CC9E0A3BECC01B925452544EAA5824DEEED18662F8610850495298E84580BDB4F20361BC6CEC06DD49BFA98F9D14AD4ECEE0D8BEBAF3D63B273A79FC8FED118E6665CC32970DAFA98E4106E2112E3984210842108421084210842108421084210842108471E650A710C8427ED19996A6526E06AE4858E5A8122E85F32EAED740BF68BB61B3049EF265B310C92A7B0D490C6C6D677F4895365098CE4B00A1976254CC7D08D1D8BF48EB18E30450B3270C624C258C64E5EAF47C514C9CA1D665A6DB0F4B5469F506CEA5160A4A5A5CA38DB6A428042ACA5104D8C6D6760BDAE54F09E3945FF0050A96897365E8583670C5FA337AB6B18EAE9552A6B84304F5D1AE1D9C9B3EFF511A6A664609C7DE10DC4D55703D75BAA55B84ACD9A938AC275B71976A14BA24FCE4D26652DA1F934132C196D6F2421F55AC9B5B6B47D30FC3176F787716E094A9A8AB9736AE5D34B3365A94332D094A52169B8056EA1DE26EA24E60004931D91C33C4EBC2C4B41514249005F42E1D2AFA0BD886D5A32A542C4987315D1E46B187EAD2D55A3CD4ACB4C4A54A5DC4AE596CBAD256CF31D49D0D3EA6CA75B0E292EA17A90A40525406D950710E31595B30D3C84AE91730992B1E20524821989B00CE743B46C970E71E512A549EF569CD9124BA83070C75B7316EB156B15CA451E913D55AE4E374FA4D3DA5B93550997D1252B26D3682EAA6953AFA9B612025212105775055D208208CAF10C657494A5758132C250495125274724BAB636B807ABDA2FB8FF001C61A8A39850B438960FE600D8727BFBF3DEF189AC518EB3CBC49F3493C35709626A9196B4EA922999979B8DB4B6E9D354B92704CD45A66AB37FFA3743CDB46500925975ED450C1E6AD263583B57EDAF08E08C1ABB119F552A5AD1256512D53521473248428A5C29214E169CCD9810402088D4BE33ED09550A9F4F4F30B296CE97D943CDF5637E6D711B4D7059C17E59F05594D8632F32D68B26ED7DB6173B8D71B4EA10E54F15555EE63CE22696AD2FA1A69C2DB722590CA501A64CD17D21DE67CE1FC5CFC4CE23C698E5451D1621344898A988CD2D6B530CCACA02525432BDC802E5EEE63AE25CC9B891CEBCCB7006439728F15D6490E4E5240BB30B0DE2F1DD6DC74EB0B09528EA5A6D6B2AE491702C4024F403A6DEFA188A9AA9922657D7CC5CC24A9414BB953DB7BE8C18B1F9C5C138722907788D478ADA1D35E9A69EEDA5768143642D40A9573B0EDD00D875EBEDFDF19ADABFC5CDCD942427C23A8D47C88FD86F5B4B315345DCE55105CE9707C8EBA8F68A61275DEDB5CFA77BC51C574548421084210842108421084210842108421084210888BF617B7CF6F7FF0098ADA4AB14C160B32C8D4F27BB6EDFAC7043FDEDB8F5E9136B581E4294280D94A4EA483EA53DC7A8DFD62B92153BF892CDF5B33B1DEF6BB7202DAF3A79A82A0A04383A3DB7B5C68E3D46D6B450F86635175B69B5BCAFFDC33214E15F75724A540366E76B8D811E9B4EA7E21C670C5B4AABA8920365285B04906C483F987449B45B66D29538CA2EE016D41E4E6E7E5D39F5BAC52A9D57957A4AAD4D95ABC9BCE2D2F536A72F253ED2DA24FD9A5136CBD2A5B009D9D6D6E5AC4A89BDFB9B867B70ED0B0A453CAA6C527AA9E58012BEF9603002D94A811B3101A2D69E0ECF34D477EB41984AB2A54C120DDAD77DB7B00F16F188B82DE13B1ABEFCC625C84CB89A75F374392F4454B3EAD7E673E2B92FB729CC52EFA4CAB4CB6537BA09E9B01807C52F685492108562B549530702AA6A5F401F2CC0EC0B0D80B33697793814DA74909A99A02400095020EB76D75D7CC3F38F874AF0F9E0CE86EB5354EC84C01285B710B0EBF4E43FA55A81DD332F3AD104F96EB4102F7002AC466749F13DC71894DFC3CEC6ABD2952144135D3AC425D9CCDDF97563637A79B2EBE4A95DDD52946EC92A0C6E5AD636D40D437A4778C653D913C2AE5E631CC97E838372FB0BE0EA62A6E69325274AC38E4C25B42396C49CECC36D7C54ECD6A4265256596E3F34E38D36C36E2D6906E1D92F1EF693DA4F6812703AF15F3F0A5D5A91DEA7BE999A5A4A8E677585064824DECEA360F188E273F1251266CE5A9249D4E8072DB561E7EB1804E1532DF1EF8ADF16B53E2E33C68AEC9F0E194B5B7D193B84AA867E9F295DA953DE54BC8555D54C3CD30B6D87D4DD49728F8D53932D38D290ECBBC9615BD9DB9F68D85F621C013B07E1DABCFC4788D34B15F37349989A79250850A79672B89E56099B3104E54AFBB74CC4A9A8E8294CF9A89935CA125C02EE54E4124368CECF6B66B8D767490A43122DB4CCBA39328C21B6A5A450DB4CA659865B436DB4A5348421FD9014DB975E864B6CDC06C253E20F687DA5E3BC4B8B4EACC627AD7356A52A592BCCC87569989D4BB005AFB80D19AD3D2242032580B66B5C37EBA1B8368FB3A5211E4F2116011D6FEA493E9F38E99ACC466D52C925C6EFB972E472D98F48B9C99252058BB8DDADB35EFF003893ED3F768E69CB0502F724BBF3B1B746F9BDCC5C10E05FAB3BDBEFDA2A44E099697673D3F416B0F2FDA259412E19C79B7EB1305102C00FCFFCC3F14502CA0E2E05C1F47864568C18797DF972E9112B24822C2C6FB8D57D88B7B75FCBAC5CB0FE28A8C3A62E64B485A94928BECFB8B8059B9DE19093716D0E9A7CFCE387CA086A60B2843732E2B63756DE624AC5CE90A02C537DB6DC18A5FF0077C62AAB454A2A6A650CC54D2A619601D406B59EC482E6EC629EA28913CB1B0E76E5A335FE623936B6DE9B7E116020A5446E0B7B189998FF004A9FCBF5FED088A686500429272870A0C4173E51365A83310DE7FDFE5FBC225C4D84210842108421084210842108421084210842108448BBDB6B7D7B1EC46E3F589F215E308760A2DC989FED68446E556425412A23EF1B5874BDCD80B11717E9BED6BDE32292A9B86AA5D54A98525042832803B11EB7D2FD7489536521692543AB8373B5B9EB76D3CE3C1F881E1CF2E7899CB9AFE5AE68E17A6620A0D52594CD3DC9C693F13419A524A533D459A16704D22EAD162E8DCF93D3707B0DF897C67832A69908AE992448992DBF8852084AC12F70E0E5BA48D39DA2D73C194AF0E636BB073616CD6F091ABD8EFA9BEB558C3C1CB8FCE1C2BB3E8E0CF3A64717E017E7665F6B016399A92627A992AB796B9770BF3D312AAB308525255CA08DEF609B01EDAF66BFEA3DC128C170EA2C4E7CA15C990844E9EC184D281994B400EA75386490CEF76112D38D575125265CC5E500B3925C3116218379BF5BC56C29E0F1E221C4255A495C5B67B51F0C65DB4FB4E55B0860CAF50678D669A85875F9579CA53AF3B2CE25C1F0FCA76EEA9009BDAF141DAA7C7E70F4FC26A666155122A27AA4ABBA59590896A0C52B4A12B492A0C1B39286B292444A9BC4F89578EE15326A41B13E2B8DC13CBA8B03E71B1970CFC2F64CF0B397F47C0394D84A9B86E8F272ED3535352EC876A75A9C424F3E6EA936E6A78A9D7829E162DDD5A469B794F8BFDB6FC58713F1C4FC428135D36626A27282D7DE2806CCD60141200D02521800E368A74E08BAA9A26CC2A66CCDCEC092E41277DDDEEEF172FCA50792B07C840B0B1B7D3DFF001DBB5ED1A755D366D6CCFC656CC33567C5E239B52E5F7B824F9B0117BA5A4974A82946CEEFAB9041F4760FA9772758811A4950DCDC8EBE877DF6E9FDBE716CABC495552D34684B2010033A5EECC5C9B59BF78AD2D312DA8D34BDF6EBAFCCB40282F71FBF975DBD3F2DA2DD3A9A6D314A66800A838B8258F36FBE710CB92248291B9727993A91E7FA0B3888C488990842108421084210842108421084210842108421089828A6F6B6FEB0C857A025B937DED10A9452CCD77D7D225B12401FDB7FC7FE7AC55D3D5AA9BAB16662772EEC762037D60E950B91A7B1DFDBEED1026DB6E4F703B5FBF4B5F6E8627CCAD953537961CEB6FA173E9CB68E320E67D58FE913F250AB13626DD48DF7DCDC8EA3F6045322B6A81099648009602C2CF60799F3FED466A2B53372A12E8059CB80D7E805B9BFB448436CA4DC0B1BDC8EA0F7F5EA7D80F5DBA64D83D1E3B5D31024B84A8D8AD441236DC339B31DBADE2298AAB5A5DC07E45AE46BADEDC85CDDF58E8198798582F2CF08D7B1D634AFD3F0E61BC3124BA9D62AB5479B6A52564DA5252B1A9C5B6954D3EA5265A45AD44BD3CEB0DA50E29610761FB3FEC6B8DF8CB14A2C3F0F9530CC9F3104CC40504848214A054EDA2487D376722316C4675461C17573561694120A52ACC6F6D01F5B79DD9E357FC695FCE7F1ACE2065F0765E9A8E12E0CF2A71507EB555756FB4D633939098B4F054C28B489B9F9F529C4B52884A8D3C2D0A53204B18F61F85B0BE0DF871E01973B1E9743278B461899A145283534B3662000B55C9CF35044C4850BA1692C5DE30D9DC4F2ABD650259C854012124051DF57E4DD407711B3C657E5A60DCA1C0587B2F70650A4E8D85B0D48C8CB52E8F2CDA5B654E48CBB2D227E7DD480B75F794D098754A5242D6A248F35A3C83EDCBB6AA8E37E25AF12EAA7544B35534A02D44A194B25C9D1893A25801A002330C0A4A6ACA484A92E960C9BF422DB0D1DC93CC47A134E25D53AEEA529C75616E8B7D9256129404B1FFC410947F52BCDAB7EA06ADE34AA99D5095D410094BA424B86BF5373716B466829BBA4E53F94593719998139C6A144BD88059B9C56E91681254E1D9BA1D3CEDF4F78E42002F72DCDBF40211C99850A641D0DDEFF0030DEADE4F052882000FF005D624F3027CA373DB6BFE6638EFE61373AEA05BF788E205449B276F9FF007F9443989362CF7BDDCEFABB6E7FCC2264A74DF7BFD3F7EB1514EB95216F3466074B726F5B6BF77E0902E62622FF0050444732AD4A59120650E58871EC1FCB5F268E33A79FC8C525BA1D2082494800956CA24775000589B5C8B017B8B5B68BE0E1E9F4A8993EA82913A54C53CB506F10BB317245D872D758B7D2D52159430B68E5C74D39BEE3F78A8D8BA53FFDB4F6E9B6F6FAEFF43DE2C15F5B36B6705CC96841420212109CA1924B66726F7BDC08A998BCCA0CC3E9D1F523C873D7488C51C4C43BEBE7D628A42AE08E97DFF7F2F68E4027627CBFC44D8AD1C6908421084210842108421084210842108421080241716221089866CC5062B510CDAED088DCFA984B9B325282A5AD4953BBA490621284A9DD20BEBD621CC52D646FA8A74157F52923A02AB0245BDEDB0BC64F4F8D564A423BBAA9B2C8672998C7AEE7DBDA203224905D093D0A411E637F4EB6E9C654903F746906F700800DFD8587F7BEFD62A66710E2335395788542D25C10A985AFE8621122402E252411FF0081FDBEBFB41B94E5282B6B0BEC4FA8B6C3EBF80F94592B27A66214B242A613656AA73A5DBECFCE782D64B81D0103E968E4DCFAFECF58B499B30820AD441D43984220D348422252D6B6CCA2A60C1F6108443084210842108421084210842108421084210842108422346705D009E7671F77896B4A94D96DAF2E9CE11592909981A62402747B6D73E7D0FB44210A60E2FBDC42277FB785DD0480C4B5806E9AFEDC9A2624102E6E4BFDFDF947157392CC2CA1735CA037097125C0B776F2A402836BED6BFCCDFAC745864CAC9C6521255350404B6A482000C01B9DF9B7568A69D572E5A4BA5266074E60E0A53CC8721EF73D46D1E419D99FD96B905806B998F99D8AA8586A854D975FC43530E264EA552F21537254E44CCCA82A69F521210A4B2E5B71CB51371B77D86F623C5BC6B8AD253CEA09B2A88CC4242D32D614B482E0A544313670CE59F9462D5F58B7294CD98400493998E846C19F95AC1EC358D6C2AB5CE233C6CF353FD3F4592AD650F04F802B613579F6DA9A62AB8C69D2531A65855671CE54B4E4BCFD404B1684BCA31A0ADA5EA58410AF58A911C19F0D3C26AAB59A2C4B89C513675AA5CD461226000A9591B355B2B2292A5012CA94152C94BC628535188D4090B5AFB951202560BCD5072C39A433DB96AD1B25E44E4765E70F196B43CB1CAFC2F2F86B0ED0E565E9E1E94436B99A84D14244CD567DD43485294F3AB71D5158EFF7AC2F1E51FC40FC40D6F1C62B529915F31699AB5A94933592A049536BD58274660031022F74B804B925CC84306B6516D2E395F5D753CA3D99C68A53A0AF99A4692BE9AEDB6AB5FA2F622DEDD846AE77A9ACA75CF5A477A412546CA763A68E6FC9B93465D4320D325252026D6CA000DD6EFD3D2FAD8C0D2142D6F37A7B0E9EA3E5B7E7187CE528AC82A516275512753BFB45DB395804973A6BD7E515E251528862A24722491ED08471084210B0BDEC2FEBDE10842108423199C01788D655F189845AA63EE8C1B9C78793F098D32F2B0F225EAB2F36C2432F3F2D2EEA5B986E454F36F25130B6960A90E26C4B7757AAFF0011DF0B588F0FE26BC47069099F84D6AD5369AAE97F894D3D2A39CA513100254BC8A4E64804A49CA79C758E1F8ABAC0CD71AA6E080E5FC3721EE3E978C95A5D0871D966D95CCCC855B9216197595292950E73652E11B28280B8B8F35FCDB68971676733707A94CA32569564CCA7053E224E81AFB682FD358CCE967F7D29330286505CD9C948D46BF3313A1C0496CAC29E6EE1E4A4795B26C52926FD7AF6E96F58EA7AEC3A6522C8292C3576B731FDAC5B68BA4B2E5D98338BEBAECDEBFADA273701207A81F48A7956B74F320FD98A94805DF6493EB134532B53E67EB10C238842108421084210842108421084210842108421084216B7EB073CCC210836BD75842108421084210842108421084210842108421084210842108421084210881B9D877BEF6BFA7E7BFE5D2321C1A9D13D1382DBC2035D9DDFCFEFD184800924001B52DABDFD396EED688DB4A929B02544582961B4926DB6B215A7A1B581F90B88933E8664C9C25C8CDF9AF9415313A68C6C1EE1DF9BC534EA8421248371B0D6CF6D472FA18A6B71286CA89B39AAC5873ECDF401B15B6D9D466120DBA68BDC6E2E2334C0380F88311C9DCD34C58514FF002A8B0537B937243ECD16F9B88A424F47653BFB9E8DADC6F668C6C71B7E24990DC18532625AAD567314668541B725F08E0BC31CA9EADCE579DF2219A853505D7E5DB438487516529B2424A8DAF1E837609F0915BC4955438B56484C9A5909454D7D4D5112A969E524256A5CE9AB494A40D81D4900177118756627FC55E656AA20252495172400C0172F6B75318B6C9DE0DF8B6F135C6F4BE2178DCA954F0264E4BCCFC7E10CA54B8F482AB14D98744E4A2EA0C4C0B065284B687580C15ACAC6975001076FB8EFB6BECC3B18C02770C709CFA3A8C7A4CA34E31497265A0A66CB4196BFC2A92B5158510A026B90A9649C833068A4CA9952139D395240010E4926C407DC0D40D4100398D8E32EB2FB0B657E12A260DC1540A661FC3B429514F92A3D3659B9690618658530DCCA5A48E6AE69C1A56E38E3CE24B8B5A8206D6F2A3B50ED8F8838BA757C9AAAA98B9559356B04CC51042D454F72C2E5DB42CF17DC2F0BC9532E6AD395282081A10400E2EF63B8E4EC4477566ECA4A5B0528524A1C03AB8140EAE61DC1363DADB7CAF1ABB594535530AE6AF3072B0A55D40820D8BEAFD0A58C654B932945C806E160386045BC3BDDB99DF47115927524036B74F90D80F71B0BDBBEC7B889132B152A51952BF99EE090EFF7A732FA0BF0500F4F26688E909D81BF7EB7FDF48B5BBB9622FB868241018F3FDA11CC450842108421084210842304DC77785854ABF8951C52F06D597F2C3894A23BFCE1F92A4ACD3E4B17BF20AE7312FCA95D0B54C3A1B0C2A6541DD49281C8F212AF727B07F88EC2F8830095C25C7EA4E2B854D012A95302664DA45A8009A8A45AC9C93259016031CC521C8D4750D4E0D572672A7232A569DC12C43E8AD9BDBA3E87E9F049E295298D71149F0EBC5D5393947C40D25C4D1CCE54AF252588E6DBD2C30ECABF3296545530F25615AB502A55C28EAB0A6EDABE1E66714A57C57C0D3A9711C01526CB9601A894B56650973A5273649A9053E10A20862F7B5CF0FC7E9E807E12AD2B4CE26C19D376B876705EC1839E8C233712D312F32961722A6DF6020F3E6658A5D65E2B092DBDCF0402909B924022C6F722C63CB4ED1783B15C06B6748AAC3E7CAEED4A056652822C58EBE435B7AC669435F4F5233A54CED941D9C7E57EBAB163A3C72C1D64E904A1241E6EDCA57A84AFBDBBEC23A5A70FC3AC80524B90425CF99B0F2FF117513000E3F981B6EDEFE5EF13C521B927993114238842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842234CB5292540800733AF940D813CA11044B33072F7B7EF08E402A2024124E800731019E90D6372DEBED08AE9787CE5A5CA908B3B2CB1FD2F118980EA08F9EDF62CF7894AAD7B855877B6D688E561553366776907FF009149CBEA5FCE26800E8A4FA98A8D3ADD96B52AC940054AEC8BDEDA88E9DED6B8B83BED19451F0A62E854B4D3CC9530CFFE594B248361E26E9B6FD22DD88D4A69528CDFCC4B7566B8DB7BBFD63CD734734700653E16A9634CC4C5948C2986A9726ECECDD4EAB30DB4D372CC805C5B6D2D6DA9D50D413A42937241BF68D99ECB3E1FF8B7896AE966FE0CCD96B5218774A2F988D2DA800B0D3C8C61D578D480E0B80FAF32DBFAE8C1DFDE35FF00CF5F141CF9E2B7174CE44F86B60BAB57BF99BAE52B15E6C54A4DE44A50A58AF92BA85326A5B98969B0A25C428BB7D2949DCF4F513813B12E0CECE70A9589F68732970F299299F2280A659ABAC32C0250A4AF2F72862332FC641397217262CEAC45554A52648510EC56E72807CBF3173A37AF2BA0E0CFC23707654575BCF0E25AB7339F3C45CEA113CEE26ADBC154DA54FCDD9F9D6A5D8994CF2A64A1E3A5133CC972B09D5CA4EAD23A37B71F8B0C368696B384F8100C2F07A5993109A1A4697214B1993DE2D4829EF16C5402FC36528B5C34DA5C26715F7C7C6B533AD57241BB0E439F974BE65E464C49CA3728D36CCB30D1429A61A482DB41008084582004A76B5922C36B1B47979C55C6231EC426D7D655542EAD7316B482A25249249B1D05EE1CF521C4667875114175A45EEFAFB6C4F33BB691CC1BBCA7144A94A1A6E760902D6D237EC2DD46C7DB7C46B7109B369573497989004B62CC2D7E6EC357E9D632232D9032F808E8E0BF3D1B7F5F48AA6C6FB0DC58FBED68C567564F9C085A8B1E4EE6EFABFDE9BC4BF181B2BEFEF99EB055881A45AC2DBF436F503D7A1FDDE950188CE6D9812D761BEBF4FAC471017EE00FDF7F78AAAA3209477249F0F8BCFF0043D3FB422314B084210842108421084211C47913328968CB8750C4B952E4DD49BCF493AA3A96E050EAD9579800B174DFE9DA3C11DA0D6E055B2809C432C7892A2DA0DEC5C6F60D16399462A01CE904104104302EF666E5A863AEF68C74F1AFE1D1929C68619997F125265305E64B0CAD34FCCFA1C9B3FCE5B54BEA7641DAC041967A6651A9871E5A00992A6545E5252B2BB47A0FD8C7C5654F0E63347475B524E1AB484CE97399729626F86605CB52824BA40177B3EF161C4B8724AC77CA4174A6C45988F7D1DC3EE47531891CBBE3038C9F0B6C592592DC65E17A967170FA2643184336E9AF4E4CBF4FA5B6E06A510ECCCC4AAD7372E96815BC87DD9412D61A39FCD568DDBE38E06ECC3E20B84E7CDE14187C8C7A6D399A285E4A1539450A33552143F2972908964312497043C62DFEE5370C9C2592A0805B37F4F225AECFBFCA3634CA1CE6CBFCF2C1745CCACB5ACAEB783EBD2CDBB4E79080DB726E388438587901C5EA5A0287436163F4F1C7B4AEC1AA7B3DC531295892532FB99939D0BFCC9524B04ABCB4DEC488EC0C26B8D64B42C28310EEE6E96D2FCDF6E4D68F5B8D5E9A90898B48B84A881E86323844B84210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084226194B0813329C877F523DAD12D44E6CAF62C3DFFCC41448B585C9207F9FCBE5F38E64AD2850CC1C1B5B67B13F7A6B1CE44F33EE3F6890389248BF4EA6FB8DBB81198D2A29914E6A654B0B992D39C24072543460C5EE2F7E9B3C4464240CC4E96F736B91ABF3F789B526E13A93A8F417173F217BC500A2ACC6A7664C99895384A529490080761CC9B3EFB691473A6A653B906CFCB4D40D5EDE51F0310E22C338529D355AC4F5B6A814D946DD7A6A6DE98659A6252848257522FBAC1B917D4108780401B9E83BF3B3BEC838BF8AA6CAA0A7C3E777538A1026192A03C459CA802598817DB578B054631DD29C076248516B36E356D1DAC35D58BE13F89DF19FCBAC2D517B2AF848C1B3FC42E774DCC4C48CAD3288DDB0C51DD41434CCC19D6DB9B0E19A75C56A0A9768012DB2957DBD19EC7FE0770FC0A9E6E3FC755D2682966290A4CC9CA493298152B2CB9990AD6014B27C20BEA0C58AB7165D60CA1D653B6AE058126ED7D4B13A88B74CB9F0E9E2E38EFC4F279ADE20F9975AA1E03538DCFD2F263093F34E229E95A83A6467D97DF919671AD1A5A713CADC249DFBF62F1276FF00D9976234DFEC3C2B8709F3E9A59953718AA1295553968F0A574D4E14A146CC4828A89A4BDC0CAC6D29C3EA6A56A54C6D4E49693E1CBD567F306E639467BF23F21B29B876C1B2B80F29705E1AC2986A5586DA5A24251A945549D69012998989C665C3AE4F2815296853453A96AFB5D813A13DB17C47D776933679A4AD548EF0ACA8AA6A92F9897B827561E768C8E8F0A12825410A50703C2916EACFA37577DA3DA5A012DA004AD20252025CB7300B6C17627CC3FAB73BDFBC69FE2B8CCC9885266CD3366DF32CAB3662355137776DF5E717F9549959830DB60FB8D2CFB0F9F3A96DAF6DBA7B7CA3AF27D419B34A89D0923ADF5FDA2EB25052DB65166B7ADB73AF40DCE292479BA6F6DC1E82D6DC75FEDF388BF12B328CB7D6DA91ECDEEC5BE422A8AACC4DC9D39EE7A003D6FCA2AC52C4308421084210842108421084210842113BAAF2DAF7163DC9E9B7E1FE2F096F2A692FF914CEDEEDD40D2258225F88EA2E06BA72E87AB72BC71904367981C2176D211BF41720EDDC93D37E9F867D47552154C85AE6995392A0CACCC59837F306B92EDA1B011CCC9A898854BC9A85329C6AAB337462FE7A18F3BCCDCB3C1B9B584EB583F3070A53F15E19ABCB2D9A852EA4DB4E30E0295243E10E36EA4BAD85AB46D7F39E9DFBBB803B6CE20E0908387574F3DC9065A9139799053F94A483622EC6C7CAD1855770EF7F37BCCA9F11D3505CB369B5EEDB5C8168E0E4F650E09C94C0D47C059714090C2F8469EB53B4F94906DB6D2CAB4A124292DA1B09F281F87A6F189F6AFDB5F11F1F54CE99884C9B366CE5297366CD2A54D9CA57E652945F328BEA4BB8DCC5750D28C3C22581A30CACC03E8396BA5981676B47AC47401254493A92E7D63294E83C87D211C47308421084210842108421084210842108421084210842108421084210842108421084210842108421084210842110B8BDBBFF009FF91F8C5D04F942844A206700EBBD987BF57E8DB7052DE3BE86E5DBEED112AB581D49480ABB884EB2DDC1015A091A86FD36EDB88A9C1387EAF1BAA97229D0A65A901403926E2EC059FCD9E28E7D4894012013A804FCBD48F47D5A3CCF1FE6765D658D15EAD63FC618770C5259D7333153A95499A63A89666EB79C7651056E4CA5B4A56A5326FCD00A3FAA3723B3FF00875C67189748A4514C9C1443A1085294B16364E52F62D7FDDECD558D265CB5BCC60907C2AF107D035EC473B16DE30ADC4178CEE0497A94E606E10303D7B3F731DE7CD3A9F352529312986D99E715CA65D66B0CB73B3CE10B5255C87298D4B90024BE94A894EEF702FC20F0EE1A6462DC6664E0F4A8089CB338CBEFCCB06EA449CC1CD8F856A473D098C6D58E0A9514A3C6A0481B07E4F71BD8DC73DDBC1287C0EF88D78804D358A78DDCD2AA650E5BCC38DCCB194B427E610FBD4A78EA32F3F2528ECBC8A57CB1A6C1C7414A8155945494F65F13F6D3D8F761F44AC338528E46255F4F2823FDDA726529299E9CDE2914EEB194029216548538578583980514FAD2EA394125902E6ED62417DD9B9728CD1F0CDC0D70CFC26D0A4E9B93D9798765EA09659FE618D2A146957AB15B99612AD0669DE4B8F20CAAD4E2D3A9E5DCCCAED6B6FA17DB37C62F1771904A70BC4268968CE14D354159491940CA4B000358FE9171A4C10CB273900280094E9CDC8767F2D8F5BC5E24AB8DAE5820F9DF43C56B5309F8765091FF00C408053E82DB5B6EF1A4D8D71CE358FD42A6E293264D52D454E56A51503AEC58B91EAF7378C92930D4A00CF97460DBAB66234B3DFA33C7201B8BC62758B9AAFE2254A4277492C4921C1FAF41CE2E0A969942E0300C6C068DE978815806D7B7B83D0FF9BFCFB45377AA54B4A4924D9DF7FBF2E7D227A65029045DC0B1B7B5FED9BCE00A8DEC41FC41FDFD6298A083A6E7D3CDDBEB111494D99BEFA44403705477B5ADE9F5FF0068823889A108421084210842108421084210842108137163D3A7A7E906B93B9B9884A52751D3EF6880007402FEA4027F1209FA472A5294C14A510340E40F605A20EE92F986BCF53FA441490A26F7B1EA9BF94FB11D08EC47423AC56D26213A8AF24DFF00F2621BC883CA273D9986843B5EFD75FBF26821B4212B4A4592BFE9FE94FF00F44F44FD04735788CFAC20CD090435D203BEE4DB778A7994E89A41512E342F7F27D5BEDE278A089E2C00E50842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842200006F607DFBFA6DE9B77FCA2AE6514E453A2A5BF86A2C0EEFAEDB73BE8FE90AF33166D37E7F6C79C757C6D2B88E7F0B57E430AD45BA3D76728B5597A555DC473134FA9AE45F4D31E2D04AF5A4CE9642C6955937241170765BB05C5383A8EB654CE219456A428720ECAEAA008218B3F2B3C58AB65CD9815CEC2C3A680B7CC06D4F9EBFD46F070CD7E21F14D4F1AF1C3C42626C74C22BB34A93CB4C3755AA2692FD294FDE51E9B982F48A29EDF2882F312CDB9F6683642CAC83E96CDF8B4ECE3817064D1703E134743894AA608A6ACA89722A2ABBF324256AEF179CCBFE2662928538043170D18B4EC30CECE26A94A049747E54E5D2E3551D2C407E66331BC3CF099C3CF0CB4B92A664FE5AE1CC2D51926132EED7D1489399ADCC2123492AAC3ACFC6A96413670BDAAF63EE34F7B45F8A4E32E2CEF8D6E223F899EF297914C49203A5ACC4331E6F6788A9706952C8CA9372E06D7E7CDBAC5CF25600250B75CD4490F4C2D4ECCD8F54F39C25C08BDEC80426C7A46A1F11718D562EB986AAA664C2B2A72A98A51199D83391D59C6A3CA32AA1A308661A6AE2CA67B5DECCC2FD7CE217290436A5320FDE4B0A2D2576BFDF4A2C14773B917DFAC60536A44A2A3209FE2865025C59F673CFE97B45D932501B3252ACA4949233104B3DC8B683488292951048008EE3627A7DE3D4F4EF14D2EAE64B5660947FF00502FB7389E92521869B3B96F2736D9DB560F0000161FBFF3F38E27D54DA86EF08B17B5874B696DBCE25CC40981947CFAE9C88E510D293BDBDFB8FD2DF9C494ACA746F6BFDFDED13124A4000E9110903A088BBE5331093E63FBB4092753118964B973BC7108E2108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210842108421084535056A041200B7A5AC76FEF7F7E9D378BBAABF3D0CBA562C93A90399E8FA9B1FA4460A72DC686DD6DEFFA69105A14BD212AD04282839A52B520A4829D285DD0BB94F982FA03B0BC5FF85D545226154F9E25E623F9CA496018B8206B6376E46242D0142CC0F222C75D77EAE2F1054BB6E73358534A7B77DD93519571E5A40085B8582DEB02C9D4DA896D56B1052488C97169585CE42AAA556A4CD4254520CD2A72A052E03900DED94383705F5A4994485019521C105C9E5CDF9E9BB6DA5C19012940756023A2804EB3FF00D8F7BFCFF531834D9B51500A4CC245C02492080EC7AF993A9B1111CBA508BB26DB1BFE8C474E7F3989205AE4DB62483F874B74EF707D2289787CC5172497BDDFC8FD3668AB094822CC398D40D3A96B691147426DD7F7F87FBC524FA73200248249D8FCBE87CB7888B6DF57FD05F57F489E29638842108421084210842108421084210842108421084210842108421084210842108421084210842108421084210843584223EED7FD26110B8F51F8C4041058D888381A9685C7A8FC639092AB00E79405F4BF95FE90B8F51F8888BBB5FF00498E58F23EC6171EA3F110EED7FD260C791F63118776BFE931C421DDAFFA4C211C142C072920084221842108418B3B16E7B470E06A40F584221EF11FD4211104288700B444083A1784431CC21084210842108422248CC425C804B18A65CC5A56C2E2EFD03D986FC9FD2220DBB03F317899369CA40226036764A9881D7CB7FF0011185A8D803EA2F112AEBE548FA6F13514730CA54E33D29C833652B2EA6BD99C1EA1ED13337FE2AF68962648AD5A080A621C5FF52EFF0064C705476497EA211553B133972A05F9BB81CB76F367E512CAD61DAE46B61FDBE4FCACF11DBB580DFE9EDF4FDFB5B26CF5CE3E3DB937D46BCB5FD23994B52CA9DDB676E9D4E9BE83944224C4E84210842108421070352D0841C1D08308421707A1BC21084210842108421084210842108421084210842108421084210842108421084210D2E3686B13E83EA9FC7FDA22FC42F62A7FFE29FDA0E06A5A2422C41251D6E09B7E7B83B5BAF4F94121738B252A528D980BFA75BBEF12D492BD3463FDF47035DD8FA44C12DAC12B525241EC7ADFEBD3D37B6E6DEA669A5AA96CA0850246FA8D7CBD5EFE76694EBA624E55282BA0B72DB7F206D7816D9B1D2B04F617EBF9C3BBABDD25B7FB31CFE2D674429FC81FD229E84FA7E67FCC45DDD4FF004AFE50FC54CFFDB57FF588DC0DAE36DBAC70D502D9556B7E51FB4540CCA00B1B8736DCC2E3D47E221FF51FD2AFFEA3F68E58F23EC6171EA3F18E1427904292A6DFC23F40F06235047A44625645FF004ABFFA9FDA3884322FFA55FF00D4FED088DB6BDF7BF4F68E1D693958806E2C7576D1BFB6B12165615F95F6040B3FCDF51F3BC44E816B2AE6D73DBA5FD6DFDFEB1C3CC55CA6C4BBF3D9ECE0B336DE71284959B9045EF720FB6FEBEB12EC3706F7B13F3FEFD07B44C4CD9A9041B0FCB70EE3DB7F7B4542539370CCC1EDE9F2F3844B89908421084210842108470C390F6842396034004239CCA6672DC9CB7B4211C42108E18721ED08472C06800842108421084210842205E83CFF004308E5AE1ECE1DF5B449412C0B97BDDF5BC4AA4DFA75DBBEC47BDBE7172934489D97C612ECF7D398B9DFEDA27A4A7C24B16E658E8C7AC100806FEBFD8453D6530A699902B303BFE9B1FBD6232413E1D36FBF389A29238842108421084210842108421084210842108421084210842108421084210882BA1F91FD2264A4E79884FF00516E5AF5DBCF68E46A1F988E3B6B595805571F4EC3E87A6FFDAFB8B97E0E4A54332C0F50C766BF96FD4C4150024A5BC232BF57B39BBFA73E51D2F30CD72568B313587DE4B13AD214B48490B71764937D0E1580761D1207B0119B70F61F87CC9D2FBD4A549CC3307B9D34FB23A9313A813DEACA5F5209B682EC1D98FCCEA7CACE9ECE9C7F4E7552CF4F95CCB6B50986D6DCB24A2C404923969209B2AFB58DBE71DA88E13C2AA80525196528032C84BBEE7507A137EA778EC0C27875388A0952012860599C72F4B6BBDB9C73D8E20316B607316C2963A29694E927D48414AADEC2251E08A004325C3DFC21C8E574B0E6EC79345EBFE13288632BDDFF0042639E8E223168B0E553DDF936FDFF00277FCFE10FF85503969674E482C5ACE320FA7CE38FF83C8FFDA1FF00EA8E627889AF1DDCA74993FD44158DFB91774DAFBD81E9DFA448570252E62404B13A143B7470CE7CAD120F052038EE880346517FAE9C9C9DA2A0E22AAD6DE42541F659DFFF00F431C7FC1246C847FF00450FDE38FF008523742FFF00B3FED1599E22AA41C4F3241829DEE10A5157D005DCFBFE30FF0081D390C5097246892033877245B778826705A424912D479B927E435DA3E99E240B4805CA5DCD8136E60B7E040F7B778E7FE03487FF004D3ECDF48A43C18F709581C8001AF7D4751F2D62238932403FC993D3FEE73FFF00A888BFE0549FFB52FF00FAFF007887FE17FF00F57FFD1FFF00AC4E9E24D0010AA484A8F4B1748B7AFDF3BF5F95C7BC51CDECF24CC9998494948B064FEEFCC1D6DB3344A5706AC28069BCF2B0D35170966F26F9C54638919353C84CC534A50B296F512BB24AB607EF5B63EE2D6EE3A97C012E5A484C84120153006FCDAEEEDF3BEB12EA3850C896544CC0078B41D5C7E50599BD5EF68F69C038D67717373534ED37E12525EC65DC56B027011B58A9442AC00FB85277F9475DE3F81D2D01CA152D6ACA4A909FFD3531F09D5CEE6305C4902996A4070C7A3060D677F9F3BDC47A5475DA9B3298300486F23100B81E42110C7308421084210842108421084210842108421084210842108421157452D136A1085B6520BDDB6D5F9F9D9E21507077E508A8ACA60951EEBC403B005CB7521DD80E9E8F14EA396E4E8F6240E4E2FD43FCA267026CAD21C0509D487824AA51D5752DA976B85249293658B11D46D6E6870CC4A7A8193266292A2D649CC9E4416CAE7935B523734AA9E527503762C4B73F26DF4D75DE06C52855D254A4DD6947DC42AE4593724D8A4026EA26E7D223C430EADA29894564B989528050CE18B17BE809B86E51554B34CD4924D815002DB11BFABF918845BFBB1FD27E7155087763FA4FCE108910842108421084210842108421084210842108421084210842108422045C103B8222396485A48D5EDE66DFE6391620F2222921AD26E55723F4DBEB7DA2A26098BDEEEF63A740FA036D39441500CDFCAE1C3176FBBFC9B483EC34FDCB8D2564A74D9449163EC763F845CF0BC427D04C0B5A8AC0FE51EFCFCB6D5E14D9A4060A29721F736BFB5F93EE3945A7672E5586F5E27A63284B639AAA925B4294B2494A99B252ADB60EDC80476ED63DD3C25C4E2B91329CE6409646472C94E6706E43DD835F68EC8E1FE2F95403BA992332940242C162AF7B5983DB7D22D45D65A404120A54EACA1011F7C1EBB83A823616BA9247A08ECBA7CD34FF00DC16B904DBD7426EDA476A6178B4AC492081DDB80439DC8DF987B5B7222A27992E2E97DE4D86E0F2557B0DF7E5DAE3D07D2F13E64A50BD9CE803936DF5F367F2B08BE2A58480A05C38B1DC7B6FF6F1497A1775595A95B95123727A920003DFA7D00885339831290536B9EBE7B6FB08A895534EA013DC051000243DD981E7777DDA29A5094DC6906E6FBDCDBF388BF1096B94D9C0BFDB8F5E6C62A15329C24114E492EC329F9B3DA26BDB74A520F6363FE7F7D6099CE43104EAC35FD6E366F38A7554485FF0C53B120DD988E841BEB6BB74D6F15A94E0B288B6DDBA81EBEF7BC4D336633B11B5C0FD2204CB945DE501E96FA7588210857F52C01DC116DBD361FE3DE39CE0302468EE406F73A7AF9445DDD3339091EDFA0814A41002B5A55B022CA5155FEEE9EBB5C1077049DBAC45F8C44A494E54A88199DD80E6E4301A73B5F62628EAE6D1D302B64121DDD81602F67D75DAE3CA3DC72EF27EA1891E96A9551BE4D212A0B5A16DA838EE92952528374DAFD0900DAF18763BC532644B5A5082149046641D1C31D8FB9F56263AD38878B68E509B2134C92B214CE7CD8916240D480C5CF38BDEA451E4E9920CC84B369665E59094CB06C6952481625761E706C2DD3B93D76D7EE21C515553A629198249B826F73CF5773C8474C620B35F31531242492EA6701DDD92092CDD5F6F28FB31886B016007202108E6108421084210842108421084210842108421084210842108422A2950A9934252ACA482DD6DF284401BAB49DBA6FF0087E978BAD32849AD952668EF5C82A3EA4FB3E859ED7768A69D604B681C7A97BFADBCBA45897890F1278C784EE15F1BE7360612B315DC3EBA1B32F293AD972415FCEAB92746428B616DB9AD954C97964BB6581A40178F41BE18BB20C1FB4DC628686B262A9A9D6B69CB42506714243A84BCE952412CC145045C13B88C7EB2A4CB4ACA402A00B3BB13737662C46A07CA3D5B838CD6C419E7C33E4DE6BE286E5D188F1EE15556EA6894416E544C26AD5291FB24A96E14A4B7248362B5106FBF68EA4F8A4ECFE9B8538D5585E1AE645299B25248016B44A9935292A648198801C8003DC0022AF0FAB5092E50E4B1243B3903CCEB6009DF6D4DCC8075142BCAA1DB620FD446A5544A994E48520D8B69FB6E3F43A45C056390326BADF4EADC8FEE35113F2FDFF2FF0078A235045F2BFA1F5FBE5E713D33D2A0F6EA1EE3D37FD629FCE24C4CCE7FA4FDFA42E3625491BFA8BDBD6DE91C3EA18E8FD3C9E22049D9BEBECD113A7B2813E900FB86F507E43488988D411E9108E6388FFFD9, '1', '2021-10-06 01:19:11', '1', '2021-10-06 01:19:11', b'0', 0); +INSERT INTO `infra_file` VALUES ('8448cada8c714e4ab61f521c8da21990', 'jpg', 0xFFD8FFE10DFA4578696600004D4D002A000000080007011200030000000100010000011A00050000000100000062011B0005000000010000006A012800030000000100020000013100020000001F000000720132000200000014000000918769000400000001000000A8000000D4000AFC8000002710000AFC800000271041646F62652050686F746F73686F702032312E30202857696E646F77732900323032303A30343A30322031373A32343A3135000000000003A001000300000001FFFF0000A00200040000000100000320A003000400000001000001C20000000000000006010300030000000100060000011A00050000000100000122011B0005000000010000012A012800030000000100020000020100040000000100000132020200040000000100000CC00000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD9FFED160050686F746F73686F7020332E30003842494D0425000000000010000000000000000000000000000000003842494D043A0000000000D7000000100000000100000000000B7072696E744F7574707574000000050000000050737453626F6F6C0100000000496E7465656E756D00000000496E746500000000496D67200000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D65544558540000000100000000000F7072696E7450726F6F6653657475704F626A6300000005682168378BBE7F6E00000000000A70726F6F6653657475700000000100000000426C746E656E756D0000000C6275696C74696E50726F6F660000000970726F6F66434D594B003842494D043B00000000022D00000010000000010000000000127072696E744F75747075744F7074696F6E7300000017000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40520000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000000000001063726F705768656E5072696E74696E67626F6F6C000000000E63726F7052656374426F74746F6D6C6F6E67000000000000000C63726F70526563744C6566746C6F6E67000000000000000D63726F705265637452696768746C6F6E67000000000000000B63726F7052656374546F706C6F6E6700000000003842494D03ED000000000010004800000001000200480000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000005A3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D040000000000000200093842494D040200000000001400000000000000000000000000000000000000003842494D043000000000000A010101010101010101013842494D042D00000000000600010000000A3842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000001C20000032000000005672A68079898002D0034000000010000000000000000000000000000000000000001000000000000000000000320000001C200000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E670000032000000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E67000003200000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D041100000000000101003842494D04140000000000040000000A3842494D040C000000000CDC00000001000000A00000005A000001E00000A8C000000CC000180001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD93842494D042100000000005700000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001400410064006F00620065002000500068006F0074006F00730068006F00700020003200300032003000000001003842494D04060000000000070006000000010100FFE10DD2687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E362D633134382037392E3136343033362C20323031392F30382F31332D30313A30363A35372020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F757263654576656E74232220786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F2220786D6C6E733A70686F746F73686F703D22687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F2220786D703A43726561746F72546F6F6C3D2241646F62652050686F746F73686F702032312E30202857696E646F7773292220786D703A437265617465446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D65746164617461446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D6F64696679446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D704D4D3A496E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D3232623834663439646366312220786D704D4D3A446F63756D656E7449443D2261646F62653A646F6369643A70686F746F73686F703A64633333616566382D343164372D343134372D626566652D3133623366363839326632642220786D704D4D3A4F726967696E616C446F63756D656E7449443D22786D702E6469643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222064633A666F726D61743D22696D6167652F6A706567222070686F746F73686F703A436F6C6F724D6F64653D2233223E203C786D704D4D3A486973746F72793E203C7264663A5365713E203C7264663A6C692073744576743A616374696F6E3D2263726561746564222073744576743A696E7374616E636549443D22786D702E6969643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222F3E203C7264663A6C692073744576743A616374696F6E3D227361766564222073744576743A696E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D323262383466343964636631222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222073744576743A6368616E6765643D222F222F3E203C2F7264663A5365713E203C2F786D704D4D3A486973746F72793E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203C3F787061636B657420656E643D2277223F3EFFEE000E41646F626500644000000001FFDB0084000202020202020202020203020202030403020203040504040404040506050505050505060607070807070609090A0A09090C0C0C0C0C0C0C0C0C0C0C0C0C0C0C01030303050405090606090D0A090A0D0F0E0E0E0E0F0F0C0C0C0C0C0F0F0C0C0C0C0C0C0F0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC000110801C2032003011100021101031101FFDD00040064FFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8E35D5BCC737C2D3C9BFBFF666A389DAABAAEB92D09964A9F7C78D5CFA56B736CD2C94EF538F1AA82F96F534916762EE10D78F8E112B54DEDED35BD3EEA09B45B992D25620CA14D3265239BD8EDBCD5E6BB286DA2B8BE79A375FDFA924D4D3205B0232DB5BD4EF199998E5459C58F6A9ABEA16F71CB9114EF9125B120B8F3A5CDA026573418AA583F34D616346AB5298A09A424FF98F2DD0F80D2BE18691C4925DEBD7DAB05B61522434CAF2C51C6FBA7FE7122F60D17CBBA84175B333D4D7E6329E172714DF5E6AFE7ED22CE1043865814FAAB5F118F0B9A26F8C7F30BF306DEE7549AE2C8889391A95FA71E1499BC4758F3D5037A77ACDEA0AB47CBAE4E30713366E12F35D43F302DA14901531CE7ECCA7C72C11718E7796EAFE6ED57516663AA12A0515431E99608B8F2D430D9A677E524F3FAA4F5A9AE5822D0750978B98B8D140D8E4C63B63F9843BDC13F64532431B1F1AD0C5DB916EE72D8E362656ACB7457BE4BC3606368A13F2553F7E5321BB5F0EEDD0B6F916C0141ADD0558F5385BE2690CC5536E98B682985A4527312ABF1A6F5C9F44527A6F5255114979C48EC4E424136EE70A2D2593E54CA2516432D265A76A6F6B5FAACACBE041E995F0B319DE9DE5BFCCBF37E8C54E9FE619A075E8A1C8FE18699F88FA4FC9FF00F395FE6ED08C0BACAB6A71A302D2BFC5B0F98C890D8323EA6F247FCE5769BE63B8449ECD62F50F5D875AE564360C8FA2EC3CC5A46B32DADF898514F2F4EBD72B21BF14F74FF4D7626F1F53F8A192BF5207B785320439FC4115A4693711DBDF5F5F12CE8C0D913D857B640865CD910BAFAE46A41FEE46F95909115A6CE4BB46B98FAC20D7214C643662170CF7323C858AFA27E2FA314452DD56DE2D4F4C9F94A6B1827AF862DF163FA65C8FD1C2C11EADCA80D716F09EC33DE42A6D1472A2824F861069AB502C331D3BCB3E55F3C412795FCE9A746D05DC6CB0CEEBBD4A9A6FF3399784BA4D445F8C9FF3931F9253FE507E61EA96B145E9F97B57919B426A6C402C4D3AF866C605D3E41BBE5BAFA5230FC32DB583B90724F865D8B930CC5BCB5A16375C55AC5578E98AB78AA8BFDA38AAA2F7C55A3D7156B155EADD315560D8ABFADEFF009C6EFF00D677FC84FF00CD73E56FFBA45AE5A39349E6F68C28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF917B754FE45FBB34FC2ED532A855A803C71E1551370C0E3C2AADF5A26361ED863155D0DC52840DFC72C2A39A6893B3D0124F8D7205B423E172F227A6C401D86D9516714AB5F0D52FD80A139193607916A21A49641526A722125825DE9F335C1F4C75ED96C434929D699A6C96C434DD0F639708B519B2F86D62F8446DC7EB1F0971B52990CB0D9871BE87FCB0F341D3236D0D5B8C6E3E2981A1FBF28E17231CD35F3479E9A06B8D356666080FC7CAA4D6BDF0F0B9919BE7FD5BCC7246F2B3BB10C4EC4E3C2994DE7979AD87666AFDAE9921171331B2C0F56D4F996EFF003CB045C5931D8EF2A483F765822E3C93012875EBB1C988B4108794A034D865910C68BA38D5CFDACB0048895EF171AE4C36479A0A470A7A6580362A4738A2F877CC49C775A4724E0D32149016B354935AD71A4A1DD6BD77C7853689173C4000D282981B835EBA75A0AF8D30316FEB00F53CBE780C5810510B7617A1A7CB21C2C68DA6FA7EA011872EBE39021BC16463520EBC791A11BF8640867128FB5D46EECDD26B2B9642A6A021A6408660BEA2FCB2FCFDD73CBED676DA8D64D3C301752BEE42FCCE56437639517E927903F33746F37E9D6F35B5CC6CC69C5188FE272B21CE195EF305FA4D63FBD6531AAF4047864086E8E4B486CAF94DD3C40F0427627A64086D8CD96A5DDCDA59B81C5A07EAC065720CA52B09035922C373792515250683B641116276C6D6D61BBE6F53302029E9BE2DF179F4113DAEA124A8F54249515DB16F0CA34926E2FE49AEE5291C6018F7A54F860465161EA22FDB4CB9B1BE11ABC42946201CC9C45D46A60F8AFF00E73E6C935ED07CAFE6151B69FEA733E1CB966C6127479A3BBF21B5802DEF21BB07F772A9A2F6CB896A8B7129F492423FBC15197E12C7338F7CBDA14FB8C555475C55CDD7156B156A98AB78AA8B1353BE2AB6A7C7155E3156EA7C7157F5CBFF0038D9FF00ACEBF907FF009AE3CABFF748B5CB472693CDED5850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91688D3E8CD770BB55732D29BED5C3C2AA125C2826831E155317408208D8E02155E1B85AF4C8951CD358A7AEC0640B684DB436F56492BD16B9596615B5884496D2F7DF6CAE41B2245BC82F22E370C08A6F82213221279612262C82A46E7E599100E3CCAE5B8127C2F41C732621C6949524D42354F4A234917A1AE47306A2535D3BCDEBA4425797FA536DCC1FEDCC76FC4509A9F9B4384B899EB24952C6B5FE38D39824C1F50F30477E480698D24CAD8EDC5C8D85474E95C9C766360A4574C1CF635E9EF930D6404B3D13EA5541F0229BD72C01A26023D4B200A41E5D969BFDD9688B498A9C8A643CC30A7422BD32241B4C601C9CD0D0D4622D78559E6DA85BE9CB031A4148391EBD7EFC95A3758ABD0572A31B6611B1823A838384A95415A9D8EDDA98F09415600537EFDB070962DFD589EDEE477CA8B782D7D5877207CCE16629B36E3C4570F267C214BD23C80EE4F4C2427802690DB9461BF5CA484009D470F214276A6FE232B21980A5CBD19290CC580EB4DE83DF2B660332D27535212DEE8FFA3C9B487DB20591D9EA7E53F3E7983CB371CF47BA75B588D42722361ED5CACD22322FADFF002DBFE729E486FECA3F324A5B4F43C6EB7AD6B403F6B2B2DF0917D9AFF997E53F30E976D75A2CF1C72CA0114615DFE9C8172A322F48F2E1BBD5F477844BCCF02EA6BE032B937028CD596783CBD6EAE486690291DF2A6C890F3BF35C434FB6B478C9AC8A0B530D37C4879A9BFB99670B1D41AED5EFF2C0DE0B228A4BA8602D3935603D3A78FD1912CE554CFF004DBBBDD461B5B6949F4D3BB6DFAF32313ABD48BE4F08FF009CBD8E0D47F29B5582DF79B4BF4C311B9F889E99B081D9D0E789B7E39EB9664FE87818D4B86E5F7E5A1C5029425A239806C20F8732B0726190DA1CF7CC86A531D462AAABD7157375C55AC55D8ABB15506FB47156B155E3A0C55BC55FD72FFCE367FEB3AFE417FE6B8F2AFF00DD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91745DBAE6B5DAA0270038DFBF4C557A007DF1B569937DBBE025217C042073DC654C931B4B9E50CA83AF638153ED2A660AE69F7614A367BA58ED6466DC57BE210497946B3748D33508EB930030322C65AED519B7A6D930C0A4B25EA976A1A6581AD2C9AE872FB4704D38D012DCEFD72B6D40CD37A94DCD07BE2CACA024DF7F0C56CA8140C8FF00BB32CBD8569F0F7CAB27369C922D18005B7B89916CE2B561340E5BAB2F4EB92C64B5D943DB5FDB89F5295B5385DAF559A094950D1CE7B04AEF99B8C2D95595FCC31E95FA5A2F2DEAB79369A4C971E6692CA54B64886DBBF1E1B7BE654698F1747A07953F25FF00357CD5E47B8FCC3F2CF921F5AF26DAC924BAB6B8AEDF686F20A01B713919D1482F2ED2EE9AFF0053F4EEAE9567B5774B4D35A8AB291B1591BF678F6AF5C85320537786D4C727D62D7D2746ACB0024AAB57E1A37BE16C1BA0A592333C1F5AB6956F6452D6B040A646283AFC2B8B2D91111FAC46DF5AD0357B7907FBCF3A594ADC97BBF4ED8D30F103505E5DC61A19341D524914F1B6B916725593FDF9C698D3094C2BC17577C9A69749D5DD17E004584A7930F1DB6C698198519259239ED629ECE48EE637F5EE6CEF94DAB7A0DF64D1E87010C6D165EFA492CFF437FCEC1AD7982636B06996E39B2843F0A8095272AE0B6424C9F59F2D79A3CADA9E9BA7F9E7C8D3686FAFA7FA33DD1786BC056A3985C85331262333C3A54F76F7BC648AB4B360D5AF80195D16C12513E60D2CD80917D45D661916331703F0A31DDBE818981642749BC3AE6906375955CC900F87512A429FE19594FE60222D35781D3EB68CAD1034926660015F9572B3129FCC840C7E65D1D24BEB4B581E196ED089EE402E021EE32070CAAD7F3211EFE61B4168AB6D299934E50F75301F184E8085EF90F02523417F34193E95ABBEB4AB7361A9FA4427EFD88A72403A53C6980E92498EA8047DBF9C7CB567070FAFC915C4CE561708580643F1127B54E0FCA49C886AA2CCF4DFCE48343113DBF98273C2842D0D36FA71FCA172A3AB8BE9FF00CBBFF9CDB4D1FD0B6D435C905A2AD18F0A9FF896425A434CA7AC14FAC348FF009CD2FC9CD42C53F4D798CACC46EA631D7FE0B043465C6FCE29EAFF00F393FF00939ABD91B3B0F33299266A44F22AA8527BD4B659F932D90D6EEC1B4AFF009C92FC948F548E1D6BCDBEB7D5488E20B10E0B20DAA581E9954B4843B0C5AC0FA4F4CF3168FABC116ADA4C424D0EE943D9DEF51231DCD3B653E018736EC9A8E21B326B4D5ED26FDD28E20EDB6D8D535DDBC63FE7231043F97F76F6EA5FD68D8B83BD681BAE646271B34453F1A350B93EBFD65BAC723023C3E239B1C54E8B53B294BF1309FB5C0E4332C38504337F1C2CD662AAABFC3155F8ABB15587AE2AD62AEE15DEB8ABB80F1C55DD36F0C55D8ABFAE5FF9C6CFFD675FC82FFCD71E55FF00BA45AE5A39349E6F6AC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90949CD3DF35AED52FB89CF2AF7C55B86E091D7E78AA21AE147461F7E02A39A924D50F534F0CA99A334E620B96D86F4AE054F2D6EFD2473D3C3154A750D59DAD254AF1F88648734179BDEDD33C8C49D8E4C302C72E27356DE9930C6492F362E77DB26D6A44FC66A69B7538CD38D42523B1FA72B6E435483D7156B155F63A7CDACEBBE57F2EC774BA6C5E65D66CF4A9755A8E708BA9021600F600D6B93C70123BB466354FD9DB4FF9F49FE51E9B35B5DF9C7FE725E596D2C19259EC276B48A07400311EA48EBB7C865808ADA838F7BBEA8D27FE704FFE70B7F2CBC93ADFE62EB5E4ED2FCFDA1F97AD1F53B8D68CE66458A1AB332885B893F4E5D007DEA4EFDC5F217E7E7FCFC07FE716353FC95F327E49FE4E7952E35AD3FCD1A73D92DB5DE9DF548AD1A421898DE956229B1CBE2A0D9B7BB7FCFBAED6DAEFFE7DEDABC11C097125CEA9E608E58A641C5CAD0F02C474D8EF91931E27CE5FF386BF901FF38ADFF3939F947F9A5E46D4AC20D13F3DE4D4AFA3D5B502693D8AA5C31B692CB911EA29FDBA74FA3229E2A7E6C7E75FE48FE62FE43F9FB55FCAFF003FD93DAC31B9934FF32509B7B8B752CD0949A9C492805403D7037465694FE5779EB49FCAEFCC9F267E62EBFA147E6CF2EE9F1490DDE9774291BF26A6F8B2E2EAFDABFC97FF009CC4FCA9FCF4F37697E48F21FF00CE3B5ADDCD7052DF51BD5B3AD9D9DB103D4066084034DC570B1E305EEDFF00393BF9B5F917FF0038B736896771F9223CD9E6AD663E3A258D869FF588BEAA48520BA275A9D862C38DF24AFF00CFC07F285102BFFCE28EA5A6B472F2BE54D1A4243F7A829818193E5CF2EEB1F945FF0039A1FF0039BFA5493F92469FE42D5B4CB5D2E7D04C660314D0D43332281435070B0326BF337F28BCA9F919FF003F16F267E5FF00E5ED82683A169F269B7D6F08FDE822E95988A3D41D80C89E4CE25EFF00FF003F7E5B6B6D7BF216FAED56EE1B8866F5D446B172F848FD803B9CAEB9B3069F945A4FF8720F3D7902F7CCBA4407CA305FC0757B66735684CAA5B90FF572BE8DAFDCAB4F397FCFACEEF5A9560F2669B26AD218AD25536AE12579540001F528C7B5460970F716278AB9BE8CF3FF00E497FCE0E7E5E7E5C69FE7AF387E5468DA6F90EF8441677470419BEC02858124FCF23C239D7E3E4E29B7CC49E6EFF9F50CE925A2F93B4A8B4E1113C84120527C38FAB5AFD3938C224F543E93FC95FC95FF009C13FCF1F2BEA3E60FCB0FCA9D1F52D0EC646D3EEEE9E378D870A93D5DBC32D18815DDE0B79E65FF009F5A683AA6B3A4DE792B4AB0D6B4B9A7D36FE25B7763CE0AAB0E5EA53AFB75C9C71041BA7E10595CE9716ADE686D3E258B449B5DD4A4D123AD185A191BD15A7871A65BC23AB5926F67DC5FF3827AD7FCE27E9FA779F3FE865346B2D425D52E61FF000CC570865F4A341FBDA85652A49A1EB8384364645FA0ADE64FF9F54F0E2FE56D1154776B7907FCCEC7843689C97DBEBFFF003EAD240B6F2B684EC4D14185C024F6AFAD80C026539232EB55FF009F5B229F5BCA9A1AB20ABA7A7202A3DFF7DB618E30D5C459F7E5FF0090FF00E7DF7F9C370BA2790BF2B6D35DE5F66FADEDE6FAB236FD67595941DBBE1300CE32931BFF009CC4FF009C6AFF009C4DFC9FFF009C73FCD3D534FF0021E85E59F375CE85247E5495A765BA92F792F130866DD857B0CA66221CAC5399237D9E1DFF0038E06E1FF24BC8D6FA85CDC48EB67037D52742BC18C62AC09DCD7357A900BB9C123D5F4B695A658ED26C48DC819824539F1281FCC5F2E5A79A3C9FAA5A7107EAF03F15EE7E16E99386CD59793F083CE5A73699AFEB5A5BC6D088677081C52B466E999F8CBA3D4C5283B5B59A9054AA1A5733226C38110866FE39364B315545FE18AAFC55BC554CF5C55D8AB5CE9B53157733E18AB7B9DE9D715750F862AFEB97FE71B3FF0059D7F20FFF0035C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EE4B96A57F0CD6BB54BEE6E4F2FD78AAE86E01502BB62AB1E41CC1F7C05211724A0FA7E1953247B5D0458CD771D302AC9756E0B4AE2AC5EFF0053332B28F1E9921CD058C5DDC9A1C98605209A72C684F7DB2618C96890713936B5093F7854786F8CD38DBF476F6CADB96AC542DF462ABFD318AAA691E55F3379E7CD9A1793FC99650DD799AF254BAD31DD8AC8AF1B7C3C69EF976201C4CE5F60F993FE70D3FE739BCCF6ED6FE636BAD4D0A7A0BA64974C55430141414FC72EA01A2CBF643F2F3F273CFDA2FF00CE0F79D3F27751D3560F3D6A7E56BAD3AD2D236678CCF22154058926A49DF7C9C764136FC52D1FFE701FFE72CB48B23A6C3E43D327E0C6E11A590B4CA587B532C0520D3F6A7FE70B3F25FF00307F2DBFE70CB52FCA9F37592691E78BBBFD6E6B3B02DD56EF8984D76EA01C892C0C9F94DF94FF00F389FF00F3995F93FF0099EDF98DE46F2ADA43ACF97B58B9B9BFF5A5741716D34DCA84568C0AD6981417AE7FCE7FAFFCE51FE6E79534AF35F9F3F2AB43D1FF002EBCAD1B32EA1612BCB7E1CA1F51AE118D5072AD074C590953F38FFE71DF41F23F993F327C9F61F9CBA9DDE9DF96FAE3B23DCB201688E1C22891CF40316CE27EE04FFF003953FF0038D3FF0038DF77A57E43FF00CE2AF97F45D77F31FCC37D67656F7518A6957724DF097B9BD427E3626800C58195B18FF9CAAFF9CCDFCF4FC80D7BCAFA67E687FCE3DF94F59BED56CC3691AFD83497715B5C16A2A4323861EA03B85271636FABFF002FFF0038507E40CFF9F1F9F7E46D13C8B05BDA9B9D3F4E4445935042AC10CEACBB48C69B0C5812FC5DFF009C15D5A2D67FE7381F58D3AD6DADAD7CCBAE5CEAD690D688B677723CB1C6941D830DB16264F56FF9CB6980FF009FA17962F26790A01A3C56CD08AFC512BA95FA2BBE25B81671FF003F8D92E6E35DFC86B458964B3FAB48F6A53790B537046408641F93B24769776F1C5A8D8BDC5E5005AA9AD32A21B8153B8D1ACADF59F24FD5E27B49CEB5640015A8FDE83B570034CB9BF793FE7E412ABFFCE01F962299A79644D5F458DA471425D6A77F6DF2C8C6A9818EE5F822DA1697A868B63A7E97A1869E3B413DF5D92F5F5075EF84367007EF97FCFA0C347FF38C9E7F8608E44B9FF10DDC61C0FDA11353EECB049AB806DF17E12F9AB47B1BAFCC0FCCEB8BA8DA7BDFF156A70A3396A02262C6BBF8938253D9B3806EB5E3B64FAAB416104933FC0DC4D7EC8CC7F14B1F0829A683A75C3FD616C230D727F7CA091B8F91C7C52918C27967E5AF2D4C04779A2A4DE22AFF00D71F14A784226DB4BF2FEA7AAD9F93BCA1F97771E62F34DF4C9FA3B4FB38E4964E75A091954D4283D4E4A323252007E937E427FCFA63CE7E6BD624F38FFCE42EA16DE50D126845CC1A268937AB24A08A94B9E6D5414EA2B970B69343DEFAFBF303FE72AFFE716BFE708FCA571F975F92DA2D9EB9E72107A561A1E8CA67B496FC01F15E4C0B1526A6B4C8CA7B338C093BF27E59F9CF5FFCCAFF009C81D6EDBF31FF003BB537D6EE21B8F5743FCBD8E42FA6D9467EC96E276A53BE60E6CF5C9D8E0C3B6E1F657E5BFE6369D731586871B246D63122D22A1B745A50468C07ECE61711939F5C2FA534DBE8E15925460EAE054D72328B7C24CC22D5AC61D12EA696CBEB7CA290B102BC7E13918AE4E4FC43FCFDBED3F5AF3EEAA2CE0F41D256DA94A6ED997093A7CE1E1FEA48CAB1C8FCFD01C57D8667623B3AF229D96A1D8ABB155CBDF15546ED8AAC1D3156F15770077AE2AEE03C7156B9D36A74DB157733E18ABFAE6FF9C6CDFF00E71D7F208F8FE5C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D34BC51D4D0F8E6BA9DAA5D757887900C2A71A55B6D7229BB0AE34A897909F881D877C041506914D7085128E2A32AA2CB88285DDE7100A372E23B634578825125F3B6DE3DB0526D0734E0296AD08C9008291DD5D541EF920C0A4C65777FB27E7930C485FCC81BFD3930585174720E677DA9824530148B0F5141BE41B2D48B91D8FCF15B6BD4C56D917917CEFE6DFCBCF3E68FE74F25D8DA4FADE8686E21BDBD1FBA4E07970AF89F0CC8C3C9C5CFCDF7349FF3F5EFF9CA09EC6E2F7F40F96EDEE2C9C5CDC4A63A3948C50D169EDE39750B71DFAE1E46FF009C8DF3C7997FE70D7CC7F9F77D6D65079CF43D126F318B287FDE7668D4B05229D0853DB26021F945E58FF9FADFFCE5A79B35516DE55F22681E62D56E938AD859DA9967DABFB0057B78614BF5BFFE7113F3E7F303F3EFFE71A6FF00F34BCD7656107E6269DAB6B5A78B38978242DA7FD8475A7C2DB1A8C04354DF9BBF941FF3F0CFF9CA9FCDFF00CFA87F28345D1BCB916A1ABEA975A7BCB321458A3B4765E4CD4EDC70522934FF009CF1FCF6FF009CA8FCBB54FC9DF3CC3E4CD4B45FCDAB77FABC1A0167BE8560F85BD6561F0D6B51F2C5987E547903C85E7FFCE1F31E95F90DA75CE97A4DCC5234B6925EBFA51B3F2E410B7892705864FD16F257FCFA23F3F26D7B44BFF33F987CB7E4EB2D2CACD0DEF97A57FAFA5C210D14B5634E4AC01AD70A0BF577CE1E75FC81FCA3FCB5D0BCB7F9F7E7DD07F32353F23411CEF26B7325C6AD737D0F499537AB531624BF32FF00E7323CE1F9DBFF00392DF975379D3CA7E4D9FCB9FF0038CFE50893559ED75188C37B3C51FDA96341406234F84E1A60FCCAFC9CF2BF9BFCFDF9CDE47F2C7E5B79864F2479AFCE0F1D9F917558E43088E40A5C7AAC3703883D31E140897EB27E5E7FCFB5BFE727B4DFCF1F24FE6C7E63FE61689E709343BC49F53B89E691E765414DAB4AD6B5C69B86CC2FFE7EF9AD68DFE37FC9DF2EE8BA9A4BE67F2DDBDCBEAF6D237C36EB22928CDE0180DB2259805F3C7FCE28FF00CE04F9B3FE7277C8B379FED3CEF2E942398C3C1E42073EA05011EF913BF26775CDF5A68BFF003E80F35DB6ADA36B1ABFE62B5E3E957F6F77F57E65AA20903D055BA9A5300891D14CC17E927FCE507FCE31CDFF003909F913A5FE4E5B6A8FA49B39ECEFCDFF00EC97B4D954EFDF2C0C0CC9DDF9B23FE7CF5E6CB5D3445A7FE68CD0DDBB5651EA3052BDD766A644829F10BF463FE710FF00E717AF3FE717FF002A75DF235E6BF36A771A95F4DA9497719F84348A568373BEF954C90A245F9F1E67FF009F44F98B5AF37F9975FB0FCC06B6B3D7B50B8D4C42F211F1DCC86460C037515C4094BA289D17C03FF393DFF38B1AC7FCE29F9FBC85A4EA5AE9D56D3CC32395915890415F72727E1D06CF11E5115ADBC0BC0ACCAD3B3189E9B75DE990E109E22AF02A25CA98A4775EE7B60A0C6CBEB5FF009F6E24C3FE73B742F456393FE752D5CC824EC9C7E265F714DB2E8061225F657FCFCFFF003C3F35FC97E6DFCBAFC96F2179A27F2BE93E74D264D47CC3E6289FD3B9611CDE998B9D3BA8E9965048912FC9FF002E796B4CF2F6A1746D8A5FCB75704DF6B7A99ADCBC86A4C8A6BD77CAB200DF025ECD06A30454B7B39648D29FBFB81D251E0C7C335D962E7E29109E69570F65730DF69E56CA20DF15B45B4751D5BE6731E31A72B8ADF587E5979ECDFABDB5F5C28E2005E47AFE18261BE05F56793754B6B9B7BDD2DD11E3BD8D979B741B532B00B39BF217FE726FCA5FE19FCC1D4EE238EAB732332D3A1A96E999100EAF5043E588DA30F351BE22DF1A9EA0E67E2D83AD9157A1F0CB98BB7F0C3452D12075C08B5CA46FBE2AA8C46DBE2AB01DB156EA3C715773A6D4C16134EE67C31B5A6F883BD7AE3687701E3855FD72FF00CE367FEB3AFE417FE6B8F2AFFDD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87A96FEF941ACBF8E623B3B0963DF5F16DA5AE34B611515DDF541F571A5D9318B53BD42A1E4AA7ED2E0931927706A3CC0E9BE52D61166E7638B38A5E6EBE33D4E2D8103717049C52833FBC23155616C42F21DF15434B1D3B62A868D7E36F0F0C5894746A3DBE8C582BB461BE43155168462AC93F2FBF2CFCE1F9BDE7FD1FF2EBC9776965A8EAF19905C4E6900A1A7C7976271B31DDFA2BA47FCF9FFF003D7597F43CC9F997E58B4B688049A0B3123CA57AD18AEDF7E640F268B7EC4F907F217CA1F937FF0038F179F955E75D6E26F23C1A335AF9A359B87280447FBCAB9AD12872616DF1CEABFF003963FF00381FFF0038BD6BA743F96BE5BD23CF9A8D847C5755F29411C972838D2B3CEC2B5DC8241C905B5BFF003EB4FCC58FCF1F979F9AFA45BDB470DBEA3E63D675CB68140E5026A2EC544B4EFF00150E4BA2F0DB17FF009F7DFF00CE324FF963E63FCDAFCFEFCCDB44B09FF4B6ACDE5AB8B8F84DBC31CECCF23927F6C74DB010CB81F96DF9DDF9D7FF002BE3FE7253CE9F98D6F74D045A7CCD65A2E9970D50A9033C3CA01414E4054E56436C616CDFFE712FF28FF257F327CF9E6FF31FE72FE7149F963AB796353B69BCBCB6F75F56B8942307356F0AE459786FD51F38F93BFE71CFCE8D7B3AFF00CE71F98B48B4344BB5D3B5DE01005028483E032A32A3CDA4E2277A79DF977FE7DABFF388BF9C724FA9681F9DFE67FCC6BB8EA6F35A1A8ADDB0A750CEC07864F8C745E0A7D95F97BE4CFC8BFC81F25FFD0B3F99FF0036D7CCFA7F9B4496BA47977CC577EBDF4905C8A0B58A951C00FB2B931913C07B9F1A79AFFE7DDDFF003895F947E615F32F9A7F3CF59FCB2D465BD7B8F29DF0D405ACB64ECC4AADAB863C4A5683DB26269AA1C932B9FC9FFF009C6DD4E4B4D31BFE73E3CEE249C520787CC4435C9EA55985795326770C385F15FF00CE607FCE3DFF00CE35793FC93A9FE677927FE722AEFF0035BF320CB15BDBE9DABEA02FAEAE854A30AD6A780ED95C837C075A7C55E4DF31FE71792B429EDFCA5F991ADF923465E12CD616174D00776151B2E634B6673887D0DFF38F9E6FFF009C92F3EFE7CFE58F92FF00E576F99F50875F9E3D66F2CA5BF77A5BD9C80C9148A76A3807614C8F38DD72712517E82FFCFD9BF3BBCF5E43D53F2BFC95E46F376ABE50D47CC9A7CBA8CF75A64ED0168E297830629BF6F1CB9B7146F67E4949F9B1FF0039096D688A9F9E7E6F8AD66FDFCB72DA8CA013ECD5AFE382DCA9C283F6FBFE7D73E78F3479EFFE71CBCEFAC79EBCD5AC79AEFB4CF30DDC2BA85EDC34F27A0B192A159EA695A9EB8251704737E2FF009DFF003E7FE720AFBF30FF003022B5FCE7F34697A7DAEBF7D69A7410DF3A2450C729F4D68294016836C31A05CD8E332890C035DD5BCF3E67D574EF30FE64F9EEFF00CECFA07C7647509CCECBCF614AE4E73586911714D00BE54BA9663752A97D3E2AFEEC022A6A3E5989293951D3D2B5AB7A48ED5FDAFE3862584B1BEBEFF9F69C9EA7FCE75684C3FEA4ED647FC933991170F2C69EDFFF003F6FDFF3EFF26475FF0070139A7FD1C60916A897C11A8C06541DF8C9CA998F22E5C0A7769767EA8B08FD9ED9448B971679A34DCA08E393ECD77C85B75DB34B4D4A5D2EE2196CBA0209A64245CAC6FA93F2F7F32121B8B35B9702BC565AFBD3DB220B64F93C6BFE7316D6CB516B1D6AC183B3AD5A9F4E64C0BAAD445F9DD35A43EA99631F13EF2FCF2FE275A614A6E782D075CBE05690E243D3DF2EE882BC0E79596B937C78ED819479378B2762AEC55ACC79736D1C9BC4312578CB43592EEB920C097F5CDFF38D9FFACE9F905FF9AE3CABFF00748B5CB87260F6AC2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF864BB048AACD51DB311CEB4BC2B147612EE01C56D17621DC0AC98ADA65E8307525EA2BB8C124129D5B45D38F4CA501306040229D716C8A58E28E49D862D88571C9F6DC629548E36A8DB154D235AAD08E9DB1541DC42687E1FA7154A1D5D0F43BE282A91C8E0F4C58F0A3519A9BEC3B62BC2B8891BA2938AF0B21F2279EFCFF00F94DE7DD13F323F2F2682DBCC7A3AFA3682ED3D5818B1AFC51F7CBB1CA9C4D40DDEF1F99FF00F39CFF00F3963F99305EDCF983CE163A19D22DDC48BE5D88D8BAB28AD1F89353F4E5DC40971E9FAFDF975AC7983CE1FF003EDFFCC2D67CC3ADCBADEAFAC793AF6692F6F5CCACAEC87A96F0C9476B5A7F387A7BE85A5F97E686F0C4B71A859A08A7863264776DF812A09AEFDF240AD3F707FE7D29F951F9A9E58D67F327CEFAF794AFFCB3F979E6FD06D2D74586F289F5A962209786B4A13D6A72D06C289D3D0FFE7EADF9D7E75FCBCFCB8F2D7E4FF95F4E9747D37F3126922D63CDB6EA5623146D510C6CA2AAC4FDADF7C494F1EEF91AF7FE70E3C83AA7FCE05F92BF3AEF2F5BC95F997E5B8A7B89B5A998AC37BEA48591645EA49A0A13EF9592D8323E2BFF009C7CFC90FCC1FF009C9CF3F6A1E5DF285F695A3F99A0478754D4EFA15781907C3CD50EF5A6F91B6632ECFD44F20FFCFAB7F26BF2AB40D53CD9FF003943F98B1EAF1E9122DD31D16E0D85B451A7C6C6757AB301DE83A60113F0419DBEF0F30F9D3F2CFF00297FE7157CDDF985FF0038E51E8F77A2E99A34D3E87AB584002CA507C25DB882FDF7A647C2A533B3BBF9ABD5FCC1E62BDBFD3BF38B52F3E1D5FF00332009E6CB79656692289588A59C486BC597C06110A62723F717F317CA1E4DFF009F8A7FCE1B683E61F29DEAA79DFC9B6E93C371250BAEACB12ADCC53746E24D763921162676F3AFF9C76FF9C4AFCACFF9C2AF256A3F9DDFF392BAF68DAC6BB25AC8348D2EEE1F56DE1050845489C37C66B4AE4B8D1C4FC98F3C683E4FF3F7E6A7987CE9A0F95AFF00CB7F97BAD5E493E91A34D227AD21690B17B72BF654D4103C32B3367E3523BCC3368DE5ED38437CCF631C29EAC4D72DCC48631544A0AD49A532A3BA7C6B7EAA7FCFAF3F21AF74CB6F31FF00CE577E62D9AE9F1EAD6D2BF93BD61C560D302B7AF32F2A5140527135F00C38ADF0C7FCE507E6BC1F9E5FF3923E60F3559336B1E4BF277ADA2792A590F34B9B5726B3475EC1AB91F136761A7C24EEF13D4A2B98216F556DEFED9374B08928CA3C0D76C7C47272E2D9FB2FFF003E9130C7FF0038CDF98534B0936D279BAFFD6B75D8AA08A9C7E8CB89DBE4EAB83D4FC42B8373FF002B0FF346E6C618E5B6B7F36EA8E7D75E4157D634041F0C864950761A68F34C66823B9FAC35E7A572978ABF0C0BC42537E99852CCEC052AAA97948E11B154E30923E3000EC721E2309CC24B3CE90432F3902146A3D4F427A65F09383972D3EC4FF9F65C7327FCE717971E44204FE4DD65E13D792F03BED9990E41D74F2713DD7FE7ED2449F9FF00F92E10F22FE5F9CA7B833E5732B10F862E5828B84A5655AD5331E45CBC6126D3AF59262937EEF7D81CC79172E2F55D2984B0523352AB5DB204B918E36C8F4C9E559024919604D2A72B949CA80A679663EAD494CBE9348414FA32024DB241F9EDEF35FB18ED9C35C431A101FA819938E4E0E585BE39D634AB9D26FEEA39A268D2662D096EE3DB2EE370E5898E354B6FF7E6463938D38D34D18D88FA73281D9C5915363C7A76C8940709053734381B03B9A78E2AB81077071575478E2ADD3C329237656EA1F0C900C495DD865803592DE4A9812FEB9BFE71B3FF0059D7F20BFF0035C7957FEE916B96057B562AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF86BB8802C67311CBE240DB460B32F63B1C57899159D94483A7CB15E25595139003AE465C97891F6DF00CA9215659878E2D914A669013D6A7B62D81411BE21E18A519137BE2A8C57A6F8AB52BD57DF154A6615A629014E35DFF008629A469140B8AD2262C5682DBA92EE182EA4897D5B636D227A6366F588F8581F6C944B46585BF40FF00E70A3FE70BFF0024FF00E723FF0029B5BF3279AFCCB2E85E6CD3F54FD1B7D1CF7CB1F2A8279716604E5FC449B718C2BA3F4B7F3B2EFF00283FE71B3FE7103CF7F9456BE72B18EF350F2ECFA4796A059D267BDB87144850231219B975392053E1DEEF8D7FE707F47FF9C0DF27FE58699F9D5E7A920D17CE3645F4EF33E9FE629BEBB0472C5F6A58ED983503B74A0C9DA38084AFFE7217FE7E75E7BF365C5E7907FE719F438FCB7A1D9BB245E63302FA77D68A6A9F554D84551B9A76C78E9A678492FBA3F267F36BF20BFE73B3F246D3F2E3CE2F6ADE69D3EDE14F3568B7AC8B7B693DB95E53432C86A3D4707ECFBE0333C988C469F327FCFCB3F353CABE53FCBAF26FFCE267E5CDFDA3C1E60317E9B4B77594D8C5624344ACC8763215A1191E3A663097E57797752F3AFE5FF9C6C7CCDF943A9C9A0F9CF47B37B69ADC3304BA5917E290814069EF94F8AD834F27D89FF38B3F927AAFFCE6FDA7E64798BF3E7F37350B297C93A92E973E8C3516B68AE39C65D8B46CE015A8A5732465003038E4FD4FB9B5FF009C5EFCACFC8DB6FC88F3D7E61E976FF96F73A61B09B4D8665F5F8B1DCB4D11635DFAD301CF148C322F85A05FF9F51FE534B65AAF9524BCF3E5F69779EB5A587D6E6BA592E54502399556AA41E94A644E701B069645F0D7E4CFE707E71FE4DFE6779E7F353F27ACA7B7F2BDEEB5777FAA7901F91B67D325959D04716C81E8C454657F9A8B68D148F47EAA587FCE5D7FCE207FCE64F97A0F277E7DD8CFE44D68148A2F29EA333219A56D898E455E2373B03F7E40E51F51E5E4C65A390DBABF3FBFE735BFE7193F2E7FE71D6EBCA4BF931E6B9F599BF306493F44F97BEB7F5C7B6892AE2854B05A8A0C81CA48B3C9A8E9A47A24BFF3851F919E41FCF8FCE08BCB7F9D5E708F47BEF273A5EE8BF97374C527BFF4784AEC676A2B2AF75EE36C1C6472EBD57F2E62FB7BFE738BFE730D64B5BBFF009C5CFF009C7DB8B4B9D4AE02D96BFAD6931886D349B68C7096D02A1E279A93BAED8F89E9B972FBDC8C7A49134FCD7F2F791E1F2BD8A68176E65963AD2F474AB6E687E67304EA2CBD060D36C9D5FF00962CDEC2E4C7290D6F197694577A7CB271CD6DB9F4FB3F537FE7D471DBC1FF0038CDF9836D79756F682FFCD9A8A47EB4F1C6DC425391566046FE39B033B1B793CF4F170CC03DE7EF7E383E88DABF9ABF332F6D2329158F9BF538A57471C64549295DBED5731F3CEA2ECB1E2B0B64B2FAB6DC295ED9A83959F8450935A7AA80863180EB571D695CB2191AE78497A47FCE3F7E527E5A7E66FF00CE4DE8BF97BF9B2B736BE4AF3858DC5D45789762D544B6F1928399200E4453E9CDB69C931BBE4EB73E120D53F757F207FE70C7FE718BFE71AFCE927E65F912FE4935C165716D61ACDEEB114F0C16970A04CA23671527C4666125C2188F73F2B3FE7E3BF9A5E4EFCDFF00F9C87FCBEB2FCB3F30C1E6A87C89E5FB8B0F31FD554D22B812972BEA74AD08CA67CADBF1E3DDF31DAC4D05A3A188C69337A8439E4E1BFD6CC69173A18924F4C0BA048EF98E4B950C4F51D01855631D5C01954E4E4C31D3D46DF46944493053B8AE63CA4DA229835ADEBC6A5222C22EBB64449245AB5B5C4A54C33C541EF9938E4C4C2DE59F9A3E5C4BCB14D4ADE3DED50AB53DF2D949A32627CC778E915B014A4B5A1CC8C527559E348462CA23AF565AE6C22EB25CDCA390DFB64CB3839A315C836114B7D35C50EA53618ABB155C1C014F0C8916825AF572403025BF532603025DEAE5822D64BFAEAFF9C6B35FF9C74FC823E3F971E55FFBA45AE0661ED78A5D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF881BC880420F5CC3E20E424B0A857A1EA4ED8F12B24B50B4218D31E20AA8F08670CBB9ED809B0A39AA03C41076395F0B604BE5662C6870F0B30504E1C9AD31E165C6D29E277FA7070B21205171354FC382928CF8A83E78D2B8D698D2A12406B8A625A8D0D7A6D8B2B45B23300145698AD85F1EDB1EB8ADAA4A225884FC4CD3AB045B6AD0153D5BE8C429A2868F47BB86133689E66D47465BDBA56BFD32CEE6585789FB529E0402465832531E005338FCBB6FA84CE751D4B53D461B17E766D79772CEAF20E8C15C9030F8BDE98E11D11F0795F499EFEDAF6F2C266B595F85D69026222007FBB997ECB57C30F8C19F83BDB33B782934292BC7E8C4ECB672C2823F4231B2D78815DB6CA67985B64710EA91EA7E5A437115F68D25EF97EEA32FFA4F52D3EE5EDCDE06FB3511914E390F1E9B3C081768DE5FD3ED8FD72E26BBD7F5E0DB6AB793BCAF427B1724ED909E7B671C1001E86B6EF2DC590922A49044CAFABA1E2483FB240DF7CA8E50DBE0C52883F2E6D4EB125EC771AA59E917959750B0B1BE96DBEB128E858C64549F7CAFF3738F271A7A404BD4B4AFCA0F20CF6D75A85CD86A90996129159DE6A12DD0527BD5C9CA726AF24F9B762D180ED0FC95E5FD05E19F4BD0603769271769155C18BC68475F7CC796693B0C7A50F52D3ED674B48A28163B4912E1A66754142ADFB0C0751EC72BF1A4E6474B163FABFE5BF943CCB3DC5D6B1A12EA3716A39D98B522DA49246EB491402299911D4D7544B4B1287F227E4F59E81AD5C7992EAE2F3EB112D346B2D46E1EF7EAA0FDA0A64AD36F0C9CB59C5CCB8FF901D143CF1F94BA579AAE96F74992E3CADE648DAA3CDF6933C721435E6948E8DF1034EB9286B047CC2FF2782ED17F2EB4DF2AD9BD969566F737F74419BCC533F3993F9B9330E4C5B213D582092E54745188D833187CB62EAD134DB88792A75D40F53FC73046716D98F152B4FE598AD6DD2D6CC85957EC5CB0A807C48EF96C753109CB8F886CF269BFE71FC4B7D793E99E62D5B4A17B5B899AC6F26B783EB2E7E26F4A3206F99B1ED1A157B3A89682E5C54CA34AFCA7D23CB5A63D9C76B2DDDC475996F4C86AD3B7DA771FB44FBE5597571946ADCAC7A7203CF75FD0E64998087A1F8B35E32370D384AE0D338C0E49F4DD47C2C45687B6646292CB00609E67F2EBEAF0D8DC5DC93DB6B36CFC6DEFEDA5689E28C9F8802BBEE336DA7CDC2E0E7D2C65CD8A6A3A0EA36B2B45A7F9B35FBC8C7C715BFE91B85141D57ED77CCD3A814EBB369611E5F794CB42B39B42944DA3DD8824D64F3D75661EACAA4ECCBEA1DCE512CE1A2189EBB1D84090ACF0C6C2D8AF0F58B16E4DF2CA279A2E6431A0534EF527AA2D77CA2598391114CF346D3E7867B762945E42B944B286FC71E3E4FA7F44D352F2C21089CCF115DBDB293305B0E0932587CBA3D27458E8CC3714FECC00B0F0A439B17D4FCA324619C2D3AF41FD99930986420C0753D0A76B1BCB59D39C12EE58F63965F1726196161F1E79A3CB8D63A8CFCA32B6FC8956CCBC669D26AB1960ECBCB91614543C53E599F09874D381054A46F4E95D81E872EE265034A4F2F1343D698096C26DAF52B8A1557703155C411D462A8377F888AE203592B79FBE48062EE7EF93B6041772F7C9713120BFAF7FF9C68FFD671FF9C7FF00FCD6FE54FF00BA45AE066393DB714BB15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8779E6690D0E6BDC86E0B62C55A9D0D6B8AA7B1454C555F8814C473508693A9CB59A5E480C49E98AB4CE9E18AA1A465236C05945742699536F1047092A078E2B61716DBF8E15B08391B7AD701482A9130DB026D16ADB1FD78ADADE4395715B5CC6A062A9859FD93912D914FACBEC37FAD95C9BA09CC1906F8A6B0A0645AF8E565124EE5B5E56640EE320531482C21F4EE0AFF29DF2B9330CEACE0F56829B9C8368E4CDAC6C8B24629D3205B22F49B3B43FA35969534C81722095DBD8BF3A50F5CA8B97065B6766FC7EC91909392190E9DA51E60F1A6F539510D822C94E9842EE2B4182922294BE9CBBFC3DF1A6D10413E9C95E9808D9918A3AD6C100A53AE505ABC3569B4C47A10BB8C57C3455AE9E00E9D714786EB9D2B9A3F14DE9B62830A0F10F35689708F3388C77C945800C0A1B0924B69D5D00DF7CCCC658CA2C43CC9A64B085600D3332127032879C5F44D1D651B3014CBB8DD6E68EC9569E93493D373BE4096BC707D0DE5ED224BCD3238D81217E2194CE4EC2186C27B0F95E4120223E9ED98F22CCE9CB2BB2D12485E12E869514DB2B3272F498082FA3BC976F1FA31C6CBD80C00B9B2C4F5CB6D22065A85FB5D72C12689E35F75E5C826423D304E4C16838DE5DE70F28FA16FCA18FE12A4B003FB332B0C9A270A0F913CE5E598A54B82F0FC42BDB33232B755A885BE51D7EC24D3EE1A3E344EA332A05D2E68531CB9903428D5E99931710841897950E5A98F25656C595ABAC805315B5479401F3C56D2F91FE33BE4C354B9ACE7EF8B1773F7C55DCFDF157F5FF00FF0038CFFF00ACE1FF0038FDFF009ADBCA9FF747B5C9ABDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88316FCCD45335EE42630C7C17891F11D862AAE55A3FB5F862AA7CC9751DB08E6A164BD4E58CD00D192493F67C71552654F1E98AA832AF6EB91290B797134C832564620D6BDB1557E551B1EBDB1542C8AC687016512BE3246C4E0656881228DBC715B5E11CEE294C56C2AD0D003D7B629B4CACC1A53B9C896D8B20B34655607B9A8CAE4DD04EA089F20DF14C63AA7153E3BE56512656AC0D9EFE1902CA2C7A01FE94CD4D89DB2B9320F44D1A22C54D36A641B43D174E882B0E4366E9902D917A259DB936C4506FD32B2E44175B598E7F677AEF95972E0CB2D2D502EE3225C90C86CA10A46DB6574E481B270E8A474ED8D360012CFAA73AF15EA71A6C0109258B03BAD3011B3202D523B609F6B314B2E04D22B3590034AD714702362B38D4D08A62BC08D92CE26864A0DC8D8E2C670D9E75E64D0627B39A4352789ED928B8A214F04F4608659A2058B96A71236EB97424C65040F9A34E89EC95C28AF1CC98CDC1CB17806B5108838E3DE800CB3C475D9216A7E5FD3A7B8B80238C31276180CD9E1C4FACFC9BA25D0B4F4DA1019539357C331E591DBE1C2F4FD1740FAEC9C12352E3AD76CC796473469D93DC796E24291B4604886A6991E2B6EC7800667E5DD3440E9F0D0786112672C6F5FB14B68E3024AD587C3B65824D13C69CA476CD41BFB6D9609B41C4A77FA1C17F6B22320208EF97E39B899A0F913F337CA4B6E2E0DBC436AD4D3E59970C8EB33E2B0F827CFDA605F55B851D76FD599B8E56E935189E113865050F8E66C0BAAC91A520A4003B66406B05554D3AFD38A6D706A1AF6C56C36D20A7738ADA14B124EF930D6D54E28754E2AEA9C55FD837FCE337FEB37FFCE3EFFE6B5F2A7FDD1ED726AF6EC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88EB5527A8EF9AF72138584000F862AB580622B8AAAAC0BC4B6D5188E6A1033851F3CB59A058A952062A876E3FD715506A74EF912BC90EDF6B2B5E254AD00A615E25367618AF129FAA5B6F0C0520ABC75207BE0648911B1236E98A11A88C314DB60126A7E8C59C135B35DC644B745925BAED95C9BE09EC0BF08C837C559C5181CACA24CA6DC7A9694F6C814C52DB7B73EBF4EF95C9987A5E876C788DBB641B4727A3E9B685DA314E832B2CE2F46B2B6263094C8172609D5AE983903E395972E0C8E1B001694C8C9C909A5A5A8AF4E9869B849363682831A6626BA2B44A7D9C69B04D42E2D12A76C8C86CCC4B74B4DA1AF4FA3304B7DA6F69684F1D8605B4CC590AD298ADA30598F4DB6ED8944B7093EA9610CB613A9515E27F5620B488BE60D5F4C486FA62ABD1F7FBF260B19063FE62F4CDA08EA2BC72624E0E58BC2354B0E572DC96A9434F9E4FC470B82CB37FCB4D05AEB534E70FC3CBA91F3C066E5E2C54FB7B4ED02D6DED144680394A1CA2537678A349BE91A6AD9CA5F852BDF2894DC8B013A36A269D98AEDDB0464D9020B26D2ECD232A4AF4CB049259A5BAC2FC435053A659C4D134E3D3B7420F2C989341451B988008879061BE4E33A71F246D83F9B7CB36BA8E997521505CA93FAB32F1C9C2CB8DF97BF9BDA0BD95D5CC623A0DC8FC336584BA6D563A7C937D66DEA91D2873658CBCEEA0520658FD26E077D81CC98F27094F0AB44818ADA8B362B6B7AE4C2BB15762AEC55FD837FCE337FEB377FCE3EFFE6B5F2A7FDD1ED726AF6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A0B7896BB6D9AEB72116C388EA3DF1B553E05BEC918DAAA51C2F1E43082A94DDF21DF25C4CAD2AA495D8E3C4B68696564D88C78D6D62B926A41380C946EAA2367351B0F7C8DB2F0D50055346618DAF86B1E30C2AA7AE36BE1A82A146F886C7A6048852696F172DE98A784A64B1AAF5EA7A62BC255982D0D06F8AF0950E209D87CF10120F0A696686A36C0436C66192DBA1DBA6552722124FEDE2240E9ED951939312AB340C29B8391E69E1B647A78ADBF1EF4C8908BA46DB5848CE1C5284E57209137A2E836CCC428A5477CACB744BD434BB378594BD083E1954A5BB7443D074EB477A11403DF21C4E5420591431716F8874DB225CA8C29378D4505075C8916DDC48BB65A374DB0ADA6C232C36A615E3A44288D054A934C5B233B509551C6C0D7232E4DC0A10C04B0D866010DE3284DED6DD956B4191B65E222429077180C93C48F8684712363913365CD21D4D084954746072226BC34F9E7CCF02C124EED4249DA9F3C98935C9E37AF34B2B829F647519306DC3C91B49ECB467D52EE2855284EE49C375CDA31E2B2FA6BC83E4C86CA38E568D79F723227239F0C74F6EB4B13EA0DA8A17A1CA897240A4E96C569F0819598B2E1255C5B46801A6E3AE08C59C2242716691BF414A78E4D914D2283E3156D97240B4C85A36508CB452464F8DA4C54EDA89255892064E32B6990A446A33A3DABC22B475A0CC9C73A699C6C3E1FFCF3F2C7A51C978C8ACA63AFC3D7B66D304DD46AB1ECFCEAF30DB98DE4923015549DBBE6DB16EF2FAB86EC2259FD56E46B502999575B3AEE02A7CC7BE4830229631A9F6C242A91563DF224D32112570141BF6C226B54B4B81E3878969776AD7256B4B4B01D8E2B4FEC23FE71977FF9C6EFF9C7C3E3F96BE53FFBA3DAE4D0F6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A889788DF6CD7539086B99B8D6871A5538666618D2A20C8C0548E98D2A0E6FDE0A8FBB1A54BC2D1E871A540DC805F7F1C6954F9704AD37E98D3387344464BAEC298D37F120A6B794B7C24E34BC48A855900E5DBC71A5E257DA62140DD37271A5E24C625E031A5E256049231A5E2452AF2071A5E25F1435AEDF4E4834CF74CAD63A1F6C816706456895207BE51272E0CAADE1A2034E994C9CA8F25EE9C8D298C4ECD80A75A5C7521299125AA4CB9221146AB4F880DF2A2562CC7CAEB59D790DAB9025CB845EC16F10E4B45DBC731E5CDC880671A58A28DB22E6E309C2A0E75A77C5CB099451A918B021116F1FC74F1C5253A48A806D8B54954A2D3F8E2D9050E0B5A78E097272A28848158F4E9984425191A0414CAC8641A6A02476CAC86C0BD245515F0C810CC1A63DADCE1629187864405E37CFDE636699A6205687A64C313BB03B7D224BFB9E012A2B97458F876F5CF2D792A38E786478A8DC7C32333B2638A8BDE749D320B481005008194B7009FC50C75D862D8023046A0785316C010F20500E29A57B324134C2A426292B066C0D642A3CAD4A62D6421C5C145624EF5DB2C816B942D0525F173C589A65F02C0E379AFE66E996FAAE8570B40CE10D3F0CD9603BBACD5637E4D7E6158C9A7DFDCC0148018FF000CDE603B3CA6B31EEF25039027DF326F7757214D85F965D171A4E2BF2C99601BE3D3A65127231A9323576E9910C64A0C8D920C56A96AD0E58155D0035AE495FD83FF00CE337FEB37FF00CE3EFF00E6B6F2A7FDD1ED72618BDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A8F54702DC7305BD2695FD57E9424E2A898542F520E2A887914A15F11D71542A9AD452A7C7154BA7942494A6F8AA5D31323020D2B8AA22180135770569B8C5944EE8E411D28B8B6A1979198A114DBAE2AAF28F4D775E55F0C556DA71E4E7895A8C551EEEA829D7C062ABA08DA46240A0C55341198D6A472F962ADC13A92CBE99153D7161229DC101A06AFD19596704DECFED57C0F4CA24E5C198DB30740A053DF2993971E4ABE8947A7DAF7195B34F74A819650FD457A64496B3CD99C712CF2569C41A6C72B25B718671A0D9849148A139025CD84767AD58C01D5052847539496E8C7765768521A2952D4F0C0E66308812564340684EC3172404CE1734AF86282138B70052A7AEF4C5849368D948F0F6C5AA4B1C507DADB16D8286E7BF4380B9314744D4ED98A42551989208046F9590C8284C5BEEC810D810AEEDC0F6C8109972633AD4B5B765A9269D7234E3C4BCC24D39EE5DAA6B53D31AA72602D3FF2DE80AB74ACEA0EF5A530F139508BD86DECA389A3E294A0C04B394682747E08C7C3906B015ADA60E7885208DEB8B301184D462CC0404A18EDCA9E18B346D8802B5607160423FD440C7DB162434F32018B59096CD729E1B6374988492EAED549A0CB2326528B1CD465FADA3C4DF65D78D0E6CB049D5EAA2FCECFCE9D1E2B4D6AE233462E49047BD3377824F2BAB86EF96678C452C89D402733E06DD0E6145439004ED991170A4B8508AD29932C03741E19449C8C6DF25029C77C8863258789FD9C218A1D901AD053BE5A154591BB1A6495FD84FF00CE32FF00EB377FCE3E57AFFCAB5F29FF00DD1ED72618BDBF15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF89F0E3D33BE6370B90957306400773B63C2A893C9057A531A5414B39AF107738D2A6360038353D31E154BB508584E08FB23BE34A81F41BAF8634ADD1B74AFBE3C2A0A32D41F9E0E14F1353B32CAA4277A63C2BC49B7C0D082CBBE3C2BC484A537514C785789A1148F22D477C78578995C16E91C4848DC8EB8F0AF122B8464531E15E2524B74120A0EB919041DD3B55548C6525BA2BAD1AAF41E3BE5127320CD6CD78C60D329939514DA35E681B8D77CA645927FA70008DBE79592C3AB2FB280C8E1E9B1E99025CAC4377A3E8500E6A4FD39592EC71C5EA7A75B5694E990655453A11716DB172F105648A86A7BE2E5008C8F614C58108849CD7AF4C5A64994539D8E2D5269AE0B122BF2C5B20A911248AF42712E5453D8A9435CA2412BCD011E195C83243CCCBE34AE564360404C418A403C36C8D32E618B5E219BE06DFC31A6B1043DBE9C88EAC57E795C9BE019569D6D142438503DF2A2E4C4D0653115722831059C8D84C245063E98B00142301771D7BE2CC05766DB16C010ACA64AD0D08C595226D548A8AE2C486D890C77C5AC8519588077C2C084B26734EB954CA46C92DC826BBED8C249914B48F8C0FA7365824EAB54762F867F3DA0FF738E69DBFA66EF049E5B56777C797AA05CCBB53739B5C6E833F34BD97AE65479B8325C3651932C02ECA24E441AA0C88632688184315608BC47CB2D0AA4C8BE1D724AFEBEFFE719F6FF9C70FF9C7E1E1F96DE54FFBA3DAE4C317B6E2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88C69196127AED9570B9096DAC8649D09D80618F0AB26963050B571E15484A8697C287070AA610308CD41AF88C3C2ADCF2ACBFB1F11C78556B47C63E5C7B74C78552891B91200E27C7052A6FA64609DCD70213292D95E4A70A537AE0295CF6C586DB64789544DBB12AA13EC9DCF8E08CAD53386D49A129C6992B545CC68AA03538F6F1C6D54EDCB4A695C6D5368AD893CB9F4ED913BA2DB9A42B48C0DBC72A945BA324C34BB33248007EA6A4D328945CB8167013EAEA13EDD7BE5243951927DA622C90056D8D4E52609326436500120402BEF95CA34DB0C76F41D3AD38471ED94C8539B8F15335D2217F500029EF95172E269EA9A7A88E38EA2A69BE066237BA6E6207E2AEDE18B91134E238D3BF862DE26AF1C7CE9BF1C549B5AABF11F638B4C8A3D361F2C585371C7CBE2AD37C52364CED5796DE180B7C7226491D3F6EBF4640B3E25B27C3DEB4CAC864248095B96F5A65526D0508CFB78E479320503E887979D694ED9599B6844B5B86150DC699519338A6F6E802019592D802776D1D5280EFE3823CD289766E3403A65BC2B6A28581A15A0F1C7859892282961B1DCE3C2DA0A998985487EBD4E3C2C81B5D1A322B1E75A63C2B24BE49DCB9DBA63C2D6A4CEEFDE871E16B2859A1928183D699465145318DA477AF242A0D0B1390894CA0878F9B3A9A54115AE6C7049D4EAE3B3E30FCFBB7923D45AE78F2AEDC7EECDCE1C941E53571DDF1B6A16ACB3C8EC69CB7E3F3CDBE09ECE8B34774918D0D3C333625C1986E95EF97736B6CAD3BE5320DD02B9412064445245AF1193DF080BC2B0AB02464C15E1586363DF1B5E17F5F3FF38D029FF38E3FF38FE3C3F2DBCA9FF747B5CB03597B6E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D98A8B7639072125B39544C3E78AB27797F75F462A948156A62A88A30C554E163F584E5F67154E27E0D0D075A62AC7648CA82701546E95381285F7C8143339230D1864153DF2252A0A08201195211D0C695078D7C718F34A39A48047C76072C548AEC8E69C0D41EB8AA63A7C144E647CF154CE175AB8F7C082B1A1F524141D4E466CE2CA34AB6F488246F98F37331B2066569157282E4C59269F6CC5D4A8F848D865726639B34D32D97EB09C865322E6620F41855508551B28DB289976100C974992928A8DF2825917A04120E2A7C70B743927B6EDEA003B62D88958F93118B64516917100E2CC287A7F113E2716B3156040F9628E144C4B45DF7C578530B55EB812228A1CA83205B5425E546C8499452E7E54CA4B70429EA3C32259072FDA39410CC146A005699021B01B4CD015400E4086C0532B7978AD46301452792351CB76CBD00A2163E54DB61BE2CC145A41B74A571660AC922A0DB6C5B6254516BC875C5050BF54E4EE695C581287961E1DBA62D64A02694468478E63E50CE058FEA24BAA9032B8865296CA5C9A28E33C7AED99D846EEAB57C9F257FCE4246D0C493B2ECDDE9F2CDCE11B3CAEAB9BE25D56759642C050140299B6C01D0E61BB139012C69F4667E37026BD010287AE5E1A951BF865726C8AE465005722DA15D5D7EEC2AA9453BD3AE2AEE2BE18ABFAEAFF009C6BFF00D674FC82FF00CD71E55FFBA45AE5A39349E6F6BC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EBA9D962318514F1CA2DBD2086568E74237E4DBE36ACCE37F5223DB1B543A8E2F5EB4C6D51AC57D3E58DAA5F50581AD0D76C6D5305E4C8057E9C6D5053A108C08DBC71B5405BAFA73F20DBD712ACF6C6E8AA54A06DA943912944170E6BC403E195A15D2E022BD5474DB0412C76F2F19A4214D07B658AA96FCD8835E7E3ED8AB258A65861DE9B8E98AA5E977C653C68C09A9C5053DB39C33A92A0E426CE2CC6DD8351BA517A663CDCCC689854B5CA6F9417262F56D06C8488A37F63944CB7445A791C0F0DE2A28A8AF5CA497371067F6567249C7634A7DACC79173E316496561E8C80F224E524B221964638A281BED930D914DECE765A7C35C2CD3B81F93569D4E2D91473B6DD3166146353254D29BE285850F2229B62AAE8EE9B7018AA6768F4EA3AE2551ECCA83C72B2C908F286AED909328A11C8A74CA4B7041484006942476C052A51824824532B21368F8EB5DF61E390219829824818053B656436028F80A82141AD71884996C9BC4AAA011BE588053355AA29A52A77C5B01560CAA37C5982879248DC30AF4C59C4A0165547206F5C524A3519284FF375C5AC940DDAA052791C5812C62F1BE02C054A9E994E4512A414BC1EDD5C8A1F0C8C53C4E6712A20540420AE66E1165D76A4ECF9B3FE724B4F79FCBB1DD2C615947D91ED4CDCE10F35AA7E736A49E9BD1CD0F1155CDA61E4E833F349C0A0E43E23E199D8DD7CDD52DF115A13DB2F0D4D9A93D32B93645408F888AD37C8B6856403BB6154482B403962AA8154FED9C55FD75FFCE35FFEB3A7E417FE6B8F2AFF00DD22D72D1C9A4F37B5E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF876BBE87315C8485CF160DE06B8AB2DD364F561FA31555941018E2A88452D01F962A955584943E3B0C5538B771C77FBB156AE1D1D4A8EA70C552A02928F9E48A197589AAD3DB22528D63C72A4202EA7288287AE304B1A7959E5A7BE58A9D5BCAD12123BD3156E5D4491C4B6F8AA8C37039160D5A9C50591E9B745A5515EF909B38BD1ED5FECFB8CC79B998D3AB14E57287DF282E4C5ED7E598D43A46DE198D939B918D92DD411A5DA35075DB289173F10675A5BC7E94629BD331E45CF804DE8CCD551B786524B221388549550763DF2D8F2484DA24E00649926D6DDB16C8A3DFA62CC23ADE35E35F6C59D34235E67DF15A44FD5C374C569AF4590EDB602B4BDB91C8162A251B7ED909328A83A353AE525B8210A357A6053C9B58DC6FC71402AA0B1143B7BE408660AF5661DF2B219828BB695BD51BF6C88E6C89D936FAE84E35392620B23B5BB8E48802462D81AB89929B362D80A5227ABB0E58B3057AA826BE38A928D8CA804571604A1AEDD781DF16B258E3CF17C5191CB91A8CAE41ACC964482E3946A9B0ED8C42789A82CE732B2AA1E20666E1145C4D472795FE7CE96F2792E591A3FB009CDC610F39A97E4E6BCE5EF64A6C17E1A7CB3658DD06A39A5F08063DF3371BAF9B7407A65E393535C4572B9364541E262C48E9916D0B789185555436D8AABAAB53157F5DFF00F38D5FFACE7F903FF9AE3CABFF00748B5CB472693CDED7850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87BBB5531935DF31E9C863A543921B61ED8D2A6FA4DD324A200070AD2A7AE1A54E75173071F4C0656FB44E0A54C34F904B0716006DB61A54B2E222B72A00AA93D7052A342468952C41231A543955506452491B50F4C2020A1A83D415385871325D3E4F8B8F6E38299DA6373444E4BD7DF0708674C7EE1E4956941B1C1C20208A4BE38BF780B57E8C076502D386904501E00134E87236C8458C4B2C92CA6A00DFB640C99885A3AC80F4E466635076C788B194190E94DFBE06BDF2066CE117A759CCC4AF4D865129B9708B35F2E446F2ED44BB007F67283272A317B669F69F5495668EA76037E998F236E4420C87D2378E1CECC3F972B21CA86CCC749B3A471835AF7CA65172A136530C25187C35CAF80368926D1C2397235A9ED92029B446D328E20C37AFB6165C29A4302A01427E9C590D915C1586F5C520A362015401DF167C4E650096A9AE2BC48A85CED418AF1225959874FA3015E25AB6EFD5853293265C2E3180694EBB642526622AA2C95C7C24D72A25B4042B69D3A49CB882A0EF91E25217B5A3FECA60E363C28792D66542C62F8475A6478923642B46C3A46D8136B6349C3AF08CF23DCF4C40DD0648EB9B19446B21A863D874C953113455A7AB1A0E47638D33135D7771E9AFDADFDF1A6CE341C127AA58D7A0C04536C668E499D76FC7032E26A5BBE20107AE2C52A9EFA490F1DA98A0C6DD691722CF4E4D5D864A301269C9B328D32131373F4D4D7AD4648630A192470DBC70BCC8A0DC336E87A53333144071353C982FE6C68306B9E45BF515F552363C53C7369843CDEAA443F147CC3A4CB6DAC5F5B5C03188A4603E55CD96301D2651658DB22C5550DF2CCB8389382C415515CB9A0C5771CA6452154283414C900D814E445180AA9C6C4B71A6C3224A53058C507BE438D5FD727FCE36EDFF0038EBF9063C3F2E7CADFF00748B5CCA8F20D079BDA70A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8749E4AC447B652DE9347F131A77DB1557B6AC3386E9BE2AC8AE5C5C427F9A9B62AABA7B98D4027154C4C625607BF6C550579CA31C7BE2ABA08CC916E31415268087C5AD34B4E51B03F462D8134B97E51FD18B68415AA076901F0C05126A5B602A5464648097CC484653D32B6C4A963A927C7BE565B62B91FD30E3C4E218493CD1A4E532FCF2126507A969FBBA8F1198E5CB83D5FC9B6D5BAE9DF292E541ED92A18ADD683282E54026BA2C2EC39B0D8644B7443D0F4C8D782E5527222190C71AF31B641BC04C52104834EBD316F8A67142076F9E2C9305B72698AAB0B638AA323B7341B62C9CF6C7154C2DAD136DF154E560840F703014851692255F88019410DA95CF7766A08E601F1C810C9049AA5BC469EA8DBDF2B21B0228EAD1488C88E3938F872045325B15C4951591720C11C2E55455DD597B8C55DF5AB56EC98AAEF5ED88FD95F7184319206EAF2071C3D41926210735CC7140A43D77ED8B20C62FB52E4E141F6C5B137D2C92189E8C36C05B2298CAC1109C8B3B486F2EC28DCECB8ADB1A7D7218A5E25FA75C56D33B7F355A5BD393800E5B02C08B4DD3CFDA7A2D0381F4E49908D2D5F3FDB199B8C808E1B0AF7CBB1C9C6CF0B4A0F9D67BAB6BFB49B7826560A0FBE6CB14DD0EA30597E74FE7368325B6B97B7B04748A51C811E273638A7B3A2D462E12F9DA60F1BA07EE73371C9D76514887015A83C065D6E21E6B7204A40554FE1841D99A9C9D701296E28F7AF8E564AA37A0CAED5FD707FCE36FFEB3AFE41FFE6B9F2B7FDD22D733A1F48683CDED39243B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8739D15050D6994B7A56838C8A53A72DEB8AAACCDFBCF87C7154E2DE86024FDA036C551B6EBB6E37C551F1CA237523B763EF8AADBF40F1FA83ED1DF156ACE5E30D0D3962828D58E3937A5716B5748B7A1FB23A62D817CA6A287718B68528488CB15EF80A24AE5CB0C8C9012BBB4F877CADB12C8C1DC0CACB6C50EC84B1E58B0927DA3C6038206F5C849941EA7A38F526507AD36CC72E5C1EDFE4F83D39B95329939507AE9ACD1A2D3E119417371F2659A55BFA70F151DB225BE219469B190429D88CAA4E44427D6EAED3053F6720DE032686D01A6C698B604D52D1788A038A5328ED8F15DB6C5518966081B7CF1555312203418B2433E2ABE3623BD3155579F82925BA024E2AC5AFF5A8F81A380720437304BEBDB89598A49F09CAC8641266B8946E646FBF2B21B436BAB4F1FC21CFCF2B904AE3ADDCAF499BEF394B05875FBCA504E7E938AAD5F30DE29DE7A62A887F32DC471971354F4A610C648287CCB712CB4692B9260190C1AB4D31285AB45A818B30EB6E7753FC7B8AF6C5B1E81A7C451197A055DB0499DD35773908DB8DB22BC4F3ED56EE5A482BB0AE2BC4F2DBFBB732B166A11E18AF124536A2EE4297240E94CB20CE25080DECB25217600F8EF8934D9619058E9FA9F2462599BB1DE9928CF76899B67B67A56AB7118528294EC3336191C2C98ADE51F9ABE4D9A5D3EF649E127D0879A353BD333F164D9D06B70D17E7FDFAC4CD70B30FDF40E4474D86C7BE67E2C8F3DA914972492301EA50B77CCC8C9D613BABAEF4AE025B61BAB2004D3240ECCCB6F12D2A7224AAC0FC7E8CAC9558F3B76A7CB236AFEBAFFE71A8D7FE71CFF2049EA7F2E3CAA4FF00DC22D73610FA47B9A0F37B5E490EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87FBA8BD4048194B7B1D95BD16A1EB8AAAC3FBC353F3C553112FA6A476C553AB12255A8EF8AAF9E321AA3B74C5549AE015F4D8EF8AAC4AD76E871414E6D7B138B5A6C801E9E18B6042DC6DF3C5B52DF50A927C701449176CFEA353B646480985DD972841A74195B63152BC1C8EC0E565B62A4D4635F0C430927FA42FEF07EBC849941EA7A0445AE51BB0EB98F272E0F7DF2E22D40194C9CA83D12CB99611F5DF6CA0B9F886CCEB4D0C38AD3E8C89E4E44597E9F0FF00A415237DB2A939116530DA8F5850641BC06490460103C31649B2C6B4C551491B6D41B62A8D446A0F871569EDCD09A6E7164817B73BED8AA1243C176ED8AA4379764065AD6A08C55874D652DCEC95381B9520D0AE08355241C890C9171F961E43464A8F97F66565B0233FC191B293C7E2ED954F932E88197C9A00E998CC12CB8F2B8B78DA5E05F8761DF156297F6621AD206DBBD31563176EC6328B0B29AF5C218C90964D289B743D724C0335D3999E52A548F8716619DE89680B863D716C6573968D2918DFF6A980A4A4924C4F20FB7BE4516C475754653C37AD6B8ADBCDEE74C92791A83A9C56D42CFCB5732CDC1622E09EB4CB22764893D3347F216E924D1F1EFB8FECC848A99BD2EC7CA9630AA82AAC7AE40163C4CA6DF4AB5800E2829F2CCA84940619F99FE5A1A8F937549EDE1065F4986C3C01CCFC52D9D36BA1BBF1A35FD2CD96A5A84338E327ACDC54FF00AC7363864F27AD0C6648CC52943D466C205D213BAF4C9B978BBD156E393D0E36CA489BB4E2A3B57204A1219A52B5C892A8749F91A57A6564A1FD7F7FCE346FFF0038E3FF0038FE7C7F2DBCA9FF00747B5CD9E3FA47B9A4F37B6E4D0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88FE09E89206F986265C86217D18790FE1928CAD5640FE91DF2684C42ACA093B8C2A9DE95F01A1FB3E18AA6578547D8D81EB91B4A41229E7CB2064847C0EA29CB718612B2829FC7E888EAA37F1CBA835A26DDD016277DB225B0284E19CD17A65664DA103242114B30EBD30192D5AAE9FFDE644C9908B241CE489D4EE00E982D980C4F50B52AC59453DF06CD8024EBC91B89EF9125B238C1E6C93493FBD51DB2B914F000F5FD094ACC9C45052A731E45B601EE3E5621A401B7AE504B9B08BD5ECA14AAB22D189EB98B3951765860299FE9502D15996AD90E22DE22199E9F6D1FA9EA71F8CD2A7236DB10C9E1894B82474EF8B626B144ACE7E793114A611464B713D3C325C2153A8E3000DBA0D8E0E10AAAC0A8DBEFC7842AAB0F86BED8F085B40BF5C7842DA577708E2DC0531E15B62F3E9EF2B13C490712026D1765A5246DFDDED9512BC4C892DE355A7015A656496C125C88A29F08CAC96F8C95C01D29D72B2CEDC638DBED2D722634B4A0F676EC0D23049ED9548522987EABA7C6C5FF74BF2A0CA49626DE75A8E99C8B462314AF4A61848DEE903BD278F4708F511EF5CBEC32E109FDA69C435553E223AE3B278598E9903C34EC3BE1B09A4E652163241F88F5C8C9B211058B5DFED6FD6B9149800C6258DA4675AD47718B510A967A6C4CFF147518B512CE74AD3ECADD59961018904138AC4B2B49232B420500F9603BA69689A388D176AEFD71A452256FA9FB59206992716CF16A9A65E69B3012452C6FCA33DFE1399FA736EA759B97E31FE70E94BA6FE656B564578DAA3B3431781A939B9D3879AD6403C655A49EB34E794A5882DD36068336511B3A1C9000AA00074DB2B9158121176E55483DFBE52665CB8C6C29DF5C301B361E22A62C6E6766AF235C9B02104B38434069878583FB10FF9C653CBFE71BBFE71F1BC7F2D7CA67FEE4F6B9B087D23DCD079BDBF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8DAB09F719801BD8DDC8A4849EC77CB2294B5C736AA9CB1531B69285636FDADB0A19143FBB5AD7A60554F53D45627B602942BA77F0CA8A143D4DC01E38C0D154FE02C621E19719288A362069F3CACC9B045308E2046FF007E5664D822A7731064000E991253C2A7A7DB7EF3A64789908B2BB5B6AF30456B8F1331143EA7A627A65A831E26C1160A6CF94D41DB6C04B6C62CA746D3099936AF8E5722A43DA746D302F134DC65132CE01E9BE5C88ADC5076398F22E7630F63D1A20F22A1F1CC69F376388507A3D9C3C19401F4641B87366D610D29B6F8B6C53A4401C7862CD31B789CB123A65A392A610C3273C2AC8228C71507AD3155EF18A53BE2AD32EDFC715413AEF8AA19A307AFD38AB696D19EC36C0555BD140360065549010B22D180F7C810C8158401F3CAC86624B3991B9391E16C8C9DEB0C4C5B4168DC8405ABD3299452C72F6F1199878E6398A6AD875ECAA5C90054E400A4F0D2053E371B77C3C48643656C6B5A6D4DB1E254E12260BB63C4AB5A195C30F0C902DB89239AD253CBF56499C9237B57491B6A16C5A24995AC0C083DF16892730C8D1EC72405A225182E881D70F0B2B51376A49E477C7856D512ED36DFDB1E15B649A15D1127C3FEEC0CB4FA0E6660D9D6EAB72FCAFF00F9C90B196DBF342F66238A4AC493F7E6E74E5E73561F394A156460BF66B9B2076745946EA7FC72A996B886BD42A72AE6E643925D7331634C980892493DCFDA51DB6C980C4A56CE49D8E4C06A7F645FF38C1FFACD3FF38F1FF9ACFCA5FF00746B4CCD8F20D079BDCF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D880E040E87B66006F492FA2F88803AE5914A1C5B7186BC7E2F1CB108781585C46CDBAA9C2ACB15E3684803738154955A35663F6476C05285594BC9C6B55AF4CA8A157D052E2837C8F567109CDB3AA808D8993688A6B0C44B0A7D93DB2064D8229EFA01635A2D09CACC9B0456081581F86A720649E15D6F6AC1C7A6BC71E26422C9AC6D242D535A63C4CC4532BFD3CBC068B534C789988B036D34C731F82849C789B04597E8765C654257204B121EB9648B18400509198F32CE019C688A82652A286BB9CA497371F27B068CA81D582D0F8E5122E7E3E4CF6CCF29D2BD3C322DA39B36B4AF3F84D17B62DB14D56A5B03364368E811011BD284E5D1E4A9B200402A389F1C2A8F49102AEDBD3738AAE3221EA31543927715DBB62A82949036C550F473FB471556457A801A82BB9F6C555E458A31549BD4F639021925B35DB80CA2DD189E8DE190216D45EFA38AD889621EA53EDF7C810C4C92A4BB8DA29A46958B28F8129D72206EB19A0D2EA607D53C9D3F9299618B68CADB5ECB7069E87A71D3E2343944E0DB1C9691DD7EF83F01C58577198F28B609B1B78A560C492483F6B299C68365DA2ACEDDCC82BBE55C28675676A0AA80BF1531E154D52C588E98F0AAE5B1707A75D8E4A21B71A12EF4F2A84AAD0F8E58CE4C4E6B26939A96E2F5F84E2D1256787D2B16319E52C42AD20F018B449E6F79F9A5E52B099ACF51BD4B6B984F16151BE5916B2692D93F387C822A1B5B2BF223254BC4BED3F363F2FAE24A0D6D9B7DEB4C697899345E73F28DE11F53D5D2A7A02C31A5E2665E5DD574C9264F4F555256A428208DF2FC45C2D46EF833FE7278423F31E36DA482653507A13439B7D39741AB8BE3F6565BCB84635556345EC01CD903B3A2CA374422214625457B65536B8849677605E86832500E4C521B8B97527E3CB00625262EEECC791DCD7260312B94E4C06A7F64DFF0038C1FF00ACD3FF0038F1FF009ACFCA5FF746B4CCA8F2683CDEE7850EC55D8ABB155AE683E9C554F97B62AEE5ED8ABB97B62AEE5ED8ABB97B62AEE5ED8ABB97B62ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88BB53C866006F5971082E0D3BE5914A16E00488FCB2C42550D19E83AD76C2A98DBC844BC3DFA6054E2E29F56603BD3014A4515564CA8F3423C5C0420F7A65726DC7CD745704B8232B25C9AB6490DEA22A6E2B5CAC96C8C593433ACB1AEF9025B04535B4B70E188A1DB20649E14FAC6C55985464789970B281A7848C328C3C4D9108EB6D3DA78DAA2BB63C4CC063B71A3137205325129AA4EACB4A68DD6829824C4866305B32B2023B663C8B38B35D1A03EAA6D9492E6630F56B106109951E6E6C59D69DF100D81B073673A6FC4AA69D7BE2DB14E917E3C59A7D6B6C48461D0EF96C792A751A711BE155C57DF157703E38AB5F4E2A849BA62A82798462BBD71541B6A616B5AE2AC7F51F31D9C1192CC63A77C910D8C02F7F30F4BB763CB520A57AA93FD99590C0B179FF003C3CB167270BABC593DABFD99590D04A47A97FCE48793ED2A91852C47C27DFEEC111BB59953CAB56FF009CAA82DEE78DAC21A3AD1401FD99710C2390DA5F27FCE4A6BFA821FA8D89E0C09E407F665120DF1C858D45FF00391BAEDAFAED776C556BDC7F6663C839519BE91FC9EF3EBFE61426231805D4B961ED954837C256FA2AC7437AA9E3F4655C0DCC9EDB4C78CD48C3C0A9DC160481515C1C2AACFA79A834EF8914DD8D0379A79E1F7E06526177962A03963C585787BE2D1248D61963B1D453ABCB1B08FE74DB16893F32BF313F293CFDA8F9AB50BE8209A5B79A4668F8F402A7DF32314801C9A64C462FCACF385B6D73A4CF2D3BF13FD725B215D7F2EBCDF34CB1D9E893C751BB713D7EFC7657A0F977F243F30A7991E4967B343BD09A7F1C695F5FFE597E526B1A5DBC6DA96A0F34CAF5662D5D89E9D7251E6D1946CF1DFF009CCDF253680DA3EB11356474EBDFA1CDAE9CBA0D587E7F593C9373965D9DBAD73640ECE8B28DD16A7E07F1ED954DAE218BDCDC0124895E8694CBB1F26F88D9239EAE4E5A031921F8D065803595226876EB9301ADFD94FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A0F37BA6143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8294F845330037B52D4B29AF7CB2294AAF6BB8CB152D8D5830A547CB0B13C930854870DBD7C72122C2253953585ABBE54496C4A1BFBC6F9E441552641238567283AD7F86322299E306D98F967CADABF98AEE2B5B3B62C8C69EA01DB31CC9D8E385BEDAF227FCE2EC17515B5D6B32155900A293FB5BFBE5129B9F8F102F43D57FE716EDA2B988E9CF5403EC76FF89663CA65BBC10F25F35FE476B9E5FB932C687D193E1555ED4FA72066C7C10F3E5D0750B0B8F4E5571C4D0D7009A462A6616D632491014AF11BE59C4CFC20BCD9DC4428B551ED931309F0D012DB49CD59C50F8E094BB94C02636B1134F1C8711699C53368A452A791E9B60B6BA65DA0C94750C706CE442DEA763229E15DF289F3765879334D35C55476F0C8B7B3EB023E103618AA7D18AB0DB02DB27B16F8554F6197479330980DDC006A3C30A551862AAB18046E31545718986C82B4C585A57716ACD5E228322B691CDA75D716F8493BD32B2516F3FD674BD4DCBA4523A73040A1E99124A5E3BAE7E4DF9C35F467835BBB8977AAABD3F8E4F88A402F1CD4BFE71BFCE6F3D06AD732B576ABF5F9EF82D9D16357DFF38C5E757A97919DFF0098FF00B78B218D8A5C7FCE3179D43F22BCCAF4AFFB78F2639310E1427FD0B379CC48ACF6EBB1EE3FB720723891C459FF00973F203CD715C436F39F4A0604391B536F9E4253722185E97A27FCE37581BC59757B812AF2ABC2C6A0EFE15CA8CDCA8627D4BE51F22F97BCA10C49A3D9C5048ABC4B462808EFDF2A9CB67271E3A2F52B68AA828287C72102DE629D5BD9B4AA07877CB835909BC569E9815CAE4C0AAB428C0D08F837CA81B402424B733060D18415E95C2DC0B0ED474F6A973B835A0F0C5B0C424F1C216A196B4C5A6710105736314EDCC205E1B103BE0B21C59C2F9249756B69103CE352464F88B5F865298A6B78A5A450278D699602BE19661653F35154070DAF8659369F7D0DA144745FF4821547BE46CDACA1B6EC37FE7263C99179DFF2D64586D926BCB088C826A55C0E2C7AD7365A693A4D5C03F119A136BA9CF6922F131C8D191EEA48FE19B8C727439318B5194888DD21D890787B6DDB26402B080616EB44AB6EE6BC98F5C9844A21047ED1CB034C821DBBFD3930D12438DC9AE58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4F37B9E143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B535CC00DEAF28EF9645528BA1C8E58AA10C60B8AE2A5181789C045B590982FF7669E191314829431FDE36532D9BE22D52D2C9F52BE82D233467351F466365C941CCC18ACBF49BF21FC950E9D6105EDCDB2BD003C88F9E611CAEDB1617D71FE2ED0B4B8E21385E286813C0E512C8EC71E057B7FCCAD0EF6EE386270A76037CA2591BCE165F7369A4EAD6CF2CC527122FC209AD32BF111E03C475DFCB0B2D424966B78946E69B63E22F80F329BF2DEE609654856A17ED532D195071525571E49BB86BCD0ED93191071A437BE567442CEB4206DB6113B6AC90628BA7345395F7E98789C5945329ADB8462BD69D71B6BE156D224E33818F137462F48B49887515EC32B917618850679A4C84B2FBE06D7A3E9CDBAD76C5594DB8E4C3154E6D5C89197C32D1C9984DE13571852886FE38AAAC7D3154C228BBF638A6959A21DC74C82D21999882380CAD692C9ECFD53BA0A9DABE1919288EEE8ADE6B65F4924EA29838DC8F0D092DACA8793C8013D1BC31E36631A5773F003CAF01FA4E3C4D831B1E96F2047DEE86DEE72139ECCBC2B496EF568492A9722A7E798A7228D3282B5C489EAC373561D1413959C8DD1D3A274EB7964B80D2C859ABB2E40E46E1829E8D6914CC1226B6E117FBF48C8F1DB2963A65B6D6E11176AED96C0B5109D4238A82075CBAD810ACFCB8E5732D6425CED22568763D72B896043A38A39012454F8E49B6297DC5AF21257A0FB38B7249FA3958B6DF4E2D3916C1A423ACBCBB1DB22538B1F131ED53CBE8FCA87AE20B6F82C364D0258A60231C93A93938C97C047C505C5BAF43B6596BE026B6B0C976D645BED452127E583AB899B1D3D3AD2DC6ABA76B1A6CC39ACF6C63507DD48FE399D84D3A3D5C2DF87DF9F7E50FF0003F9EB50B20BC6970CF4A7F3B31CDB6296CE872E3A2F1CD4855D641FB4BBE650DDC7E4C4AE362C3C32C6322969FB67241A64876EFF004E581C7921C753963497F655FF0038BFFF00ACD1FF0038EFFF009ACBCA5FF746B4CBC72692F73C28762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B360BD730037A3E4A1E9DB2C8A529BB42C76CB10A50AF165A8A625211B55C622D8494E52786C77A8C998ECD60EE83BCF8AE9388A506F4CC2CFB39F845BD1FF2CB493A96BD68047CB8CAA6B4ED5CD5E59DBB7D3E3DDFA93A3D8B69DA6DABA0F4D1211555D8663176D8A2F2BD72D751D7353962B3321084B1504D32893B1C71D952DBCBBABE9EA26657046F5EF98F26FE009EE8DE78D5B41BD1CCC9344D45911892001DE99595107B868DE79D1B5B31AC92FA5310014069BE36930658D6A8E1DD40E128F81BC72C69945299F4A421AAA0D7C46581A0B0DD574359012117A1ED9312A6A9C5E51A9E83C2524201BF618789C69C58F5D69DC410476C789AB85274B5E126DF0D0F518F137C22CBB4752028356DFA9C376E5C0507A4E974053B7F98C2C9E83A6CA15803DA98AB288E7008A62A9AC2E480C3BF5CB63C998E49A42E69D4E14A395BA62AACADEFB62A9BDA5D536206D8B35F7373CA945A5720B4840ACDD09CACAD221232BD6BF3C84CA62375D2AF53D0E637139A12B9622FF0D49E5B6F8789B404A2EB492CA69DB071338B1A9BCBCCEE47106BED919CB66D88DD47FC2E3FDF43EECC4B6F115787CB8D1C8A40200ED902590A661A6E841543155A8F6CA8A788271E97A478D6A3C3082899B08E801D854E5F02E3109AA82A0153990C4869A471EF954CB590A2D2B32B0200C840DB54C25A4B89050903C32D6714C963F5A3DCD0A8DB16E4B64B295492010B5C5A72289825D8455A7ED655334DDA734BBEA32CA28687E782DC9E2583494460B201C9B71F2CB014F10448D060906EA3EEC9028E25F1796914F258FE9196C5C4CC2D36B6B45B53B2B03DC8EF97E39EEE9F518DF9A7FF0039C1E5223518FCCD15B8F4EE295217F9797539B2C32743A8C6FCE1BE9B8832EE55968066CF13AB9ECC50124B549CB4B594249D4E48354940F4CB038F2511D4E58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88089A86B9801BD338CD40F1CB22969E30C32C420D8713B6291CD6D4E4A00B1C8B58D46E69979AA681CD40FC7331F019ABD4BB4D353E9EFF009C74D21751D692A952B535A78669C9DDDDE101FA397F6CB6DA3D360563A01DF2120ECB0B7F96FE5B8F503777862ABD08AB0EDBF88CA661D96309BF99F4A3043246918E9D8663C8373C0752D0F50796436F096321A37C35DBEECAE99458DCB65AAF96E48EF4A4B50C0D02B78FCB101127D05E48F375D6BB6612E418CDA850BCB626B4F1CB0071E6CFEE66658C7BE594E34C149A525D1AA3AE46450030AD4EC83B31A6F91DDAA51613A958D0F4A6DD71DDA845864B6A56423EFC6CB7C629EE92854283D6B9747937067DA79A32E4959BE9FBB8FA31564A83718153C85A8A9F2DB2D076660A6B136DBE1B4A354EC3F1C2AAEA4D3154742E148AF862DC119556C8324C6DE256A74DB2B28559630B95CF92421D979661B900A87A7BF4C0CE25B30F2ED8B60696C4160481B74C05B224DAAFD487F2D7E8CACC5B812EFA90F0032042D9575FDD0E23E9CAC861C454DE124FA9D7DB214CA3225673F4CF4CB62C885C353111AB6E3A65CD65506A91C9DB2120C0B6F771D36DABD7238F9B44D0E675AD69972628BB797D571C7609D716F64B58A587871DE98B4CC162B7F21D31F8769872194E45C7612F87519A46A274F6C886EE229B44E646066D9874F96482F116416C22E23A64D788A756F2AAC4151030AF5CC989D98917BAA344D37488610E0E78BE6AFF009C9CFCBF4F347E5EEA73BC5FBCD3E2661B54FD963E199D824E83541F83FAA5A1856F216D9ADA5650A7AECC7B66EB09D9D0E6D8B0FEA58E5E5AC1D9072F7DF2516B9287ECF5ED96071E4A2A773963490FECABFE717FFF0059A3FE71DFFF00359794BFEE8D69978E4D279BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EB35F7CC572138A74DB2415A634196054B67900E44E487355B1CE38D2B96EC8282B9AB74F1CA665880A912F22CBDE99ABCE5CCC5B3EEAFF9C4EB113DD988815E25AB4DF6CD69767A626DF647999435D5A5BAB1D880403FC32B93BDD3F37B97962CD6D34832280ACD0EF414CA245DC621B30AD5A77B849A302A6A77CA2459494B4AD209812478C115DC951FD32316A1CD3AD5F49D15B4D91DCC3EAAA134655EB4F964993E64BFF300D235631DB30085C8F82806C7DB1453D5F45D7E4D52D54D6A683F56147084DE0BB3C9C4B4DB619645A728A49EE7799DFB1E992A68A627A944199EBD4EF8D2D30A9AD944BF3C6928AB440B28A61566BA79A30C559A58BFC43E8AE2A9F46FF10C55388EE00551E191BDD04A3A3BAA8EB8414A363B91B6FF003CB1B02312E47CE993661328DEB43E3DB16E099C4E38FF000C82A2606A656528D2A5C0A75C84D5BF4CE6310DA1A2877C890DB169537E99590E405754DC572239B656C98C511A74AE4E419C10D7111A1F7CA64E4001085780DFE9CC793090097CD7263A953F17860873681CD26B8D4E58EB5A6F97AC92A7BD9A405877E9938B4C9AB7BC9D09CB29A095433DDC8E4AD7010D68F82EEE0515D6BEF819C5368272159E9C69DF16F82223F307A4425457A62DD1016DF39D5F871FB4A28299092C804A6386EB4B928C84A9EE722C53D86EA3640CFF0068E2A98DBCF0D462A9EC13D221C3ECD76CCBC5C94A6B67744115CB1C2CE16F9AB4B1E63F2E6A1A4900FD7A090014FF00248CC9C45D06AE0FE76FF3A3CA4FE54FCC6D7347652AA9348C05283AB1F6CD96293CFE68EEF03BA6FDE483A10732E25A2B648E7152773BE5C1C69F35315000AE6445A96E5A036C407F661FF38BBFFACCFF00F38EDFF9AC7CA3FF00746B4CB43833FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B31D2B98AE426E47C3920A8694EDB6F9605482ED982BD01AF864952E86670D435F961B414D50730396D909A0370370B8907B7539AECCE5637DD7FF388F76A359642E05617A0AF7CD74C53B4D3737DAD359B5DEB30730410C280E63C9DEE9F9BD5EE3513A558B2745F4F8E5327718B9304B6D4629D679188EA69BE63C99496DDF9DEDB46B231B952D355547707C72316A1CDE15E63F38EA77F2C896933047A8A2939364C22DF48D42E6669E7E72173553D7157A56853DCE9A1622080682A715672D70DE9A3AB862FB900D72D838F991729E56E186EC7A81D726D2905FC25CA9FF277C558B5CDA9049A6D8AA95AA71931565567B32EF8AB2BB37A11BEDDCE2A9E46FF0010A9C55358CD40DF21D58946C792641191E58D811B1D6993661368998003C316F4D6273415E990423918D4532B294EED8065DF6F0C849513C465242789A2828720437464B553C7AE4087263255A002B4E9910376CB454520E3D69ED864DD0536219C0EA3C7289736F082BB1C50D3AF8E63C98C986DE4AC3950EE0E087368EAC3758BA99281493F2CBD125897130B346FDA66A11938B4C9111C92B15A6FEC32C0E396596B6D298D0AA924F51896B45C92C36A959402E3AAF7C8B6458E5FF99A0A18E21E9F0AF3AED8B7C5875C7984090BF30057662716F8A79A379A8C328726A95EBDB2052433C9FCC16DA94694515EE46458F0B514913505413E0315E14EED0C408E5F0FCF6C53C29D2CD1A2715229D46F97E33B302AD6F78A1BA81F4E4F89AA70B09B5AEA9CAE91030658C153FECB327149D36AF13F22FF00E7387C9B168FE686F3446800BE6259C0DAA6BDF3618E4F37A8C745F9A7786B7136D4F8B3638DD7C85256E09ED9787167CD408A66445A9665A1BA2FECC3FE7177FF00599FFE71DBFF00358F947FEE8D6996B813FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B33D37AE62B909B337C24788C2150E57E1396854A665FDE0C4AA4F29A4D5F7C802828E0F545DFC36C24A02E97EDB53C33132072B13EABFF009C5AD5E3B7F345BC6ED40411BF8D735F986CED34BCDFA88F12B6A36578375E20D730A4EF74FCD11E719DCE8F2CD16E6BC49CA64EE317278326AB710C14E5BF2E998F26526317AF79AA5F3210480A29918F36A1CD97683E45BBB86599E33C4D0D48C9B27A641E5FB0D360637340C47C18AB1BBFB6B494B7A43A74C550FA4A869DA222841A0CB60E3E6667058D09A8EBBE4DA503358061257F9B154A27D257D36FE98AA4034E546229DFAE2A9D5B5B22815C5536854290A3A0A62A9E47D302A2524A151E191EAC4A670CC7EFC90649847374CB1B022D26AE4D984E6396A06FB5316F098C6D5A64109A44C2A32B294D216A50D76AE4648298FAAA76C890805BE55CAC86D896F9656439112E26A322DD12A65C0EFF003C8C9C9C6D7D657A65126F086BA9818CF8E63C98C983EA32F10EC3C7A6087368EAC1AF2F19A4A7865E8936B7C562A1DF261A648ED37518849CA4DA996071E48ED7BF31F4AF2D69F25D4AEA0A834AFB62583E6AD6FF00E7226C2732CF030660C40A1FECC8B38A3BCB7E7A8FCCF6F73717527A224A7A5BD2B8B7C53237D1CC5E2AF348F7AE2DF1627A87E63C76529B0869198F6A0EF902D8032DF2B79D6FEEDC0E478B7BE4534F6FD0F5096499096DCE2B4F4225E5E1F175C5691261936A4DC76E95C9034D13E6EF425FF968FC71E26C10B08CB698D9D02B739240791AE64E29381AAC3B3E3CFF009CDAD163D5FF002CA3BF02B25A30634EBB54E6C71CDE57578F77E2BCF2195DE43FB44FE1B66DB0F27479051428EA3E79921C39A1E41B9F9E6445A90A577CB83745FD98FF00CE2EFF00EB337FCE3B7FE6B1F28FFDD1AD32C7027F51F7BDD7162EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87DB371502A2B98B4DF69C13D01C90554E3B7D19312094A275F8FF005609482B1EB8DA6F964225055E3625900049F0C9A014D110167327C238EC4FCB31F240B938E41EA3F935A8FE8AF31DB4AB2846332802BD413D7303340D3B3D2C85BF5FF4FBEFAC6876376AC1C7A43E319AF90A77DA722D34B906FF00CB573DDC3120663C8BB9C4367CFB35ACCF70B0202CDCF751D466392999A7A8E81E5AB7F53D69286408A48F0C62D319025EA16D3456B0085221D280E499DA4B7BA7C9A99268691EF418DA5E5DE60BA83439191E550D5FB24EF82D52DD0754FAE6A30B28E20FE396C0868CA1EC8564540C632011B31193B684ADC1624914DF738ADA94F1A985A8C09A614816C6CDB92C4D3BE282295046CBD01C55150EC77FC7154F22208EB8AAB2005AB9162533840A75C21923E351B64DB0146C69B64EC3208A89CF2A5698DB784EA17D86F90B54D616AD28722529AC6F414272242AA2CC01153898B0E0368F4DC546FF002C818B6C415F46F7CACC4B9116B953A9A7CF20634D91284B89000486195483978C84A4DC7C62AD4F7CA241C805B966AA1DFB65120C64C33569F843235413D86463CDA3917973DEF2BA615AEFD32FB6264159AF9A12ECC85815D864E2D5229249E6048924DC230AD01EB9686821F337E6C6A3ADEBF6F1D8D8A4A07A8DCD97B838086145E59E5AFCABD62E21ADDBBAF26E546FA0F8E459C43E91F2CF96E2D234B68AE18C92C207A2ABB9F7C69BA3B2AEA725EDB594AF65138918100537C5B8178FE9DE5BD66FF547BABE57ABBD547B64241B4483E92F2CE8A6CE18A886A06E70527883D934189F9AB73E86871A5E20F4069278F8904D3C7052F105C6ED89AB392DED80DB44B9B5F5BFF29B23BB91090554BE113C4C5AAA55AB5EDF3CC9C4D3A88D8D9E47F9E9A41F30FE5579801AC92C51B32C23AD02935A66C71BCAEB31905F8377711867B8848A18A46047FB239BAC3F4BCCE7152418076DBBE65C5C19858EBB9DB2F8B4A1580CB04806E8BFB2CFF9C5EFFD667FF9C76FFCD63E51FF00BA35A65A393813FA8FBDEE9858BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF874B265328CA593246507853C72259C513C07139596D0935D28562721D5279311BC929375CBA1C9A24BE0B90268E872F8F26013B9650F1EE72126FC68DD12FDAC351B5B98DB8B472015F6CC2CE36761A73BBF5CBF267CCA9AFF966D6D24903148C0A66AB287A1D2C9EF3A5AA3C9FA30AF10FBD735D91E8714B6615AEF96C695E6084C43E0998548F7CA29A739B7B3E89E598CC6B3247EA19D0034DE996403878B9B2EFF095959C5F5ABB70AA054A9C910E482F39F3AF9B340D26C192C028B85560E57B900D32B21982F8EB53D425F345F4CD2A91463C09F9E565B014C740B2D46CEEC39AF18D870F964E0C66FA4B4DB8379651ACB27C400D8E5B17166956A21E262886AA456B9634F54B2332383B6581C8835E9301B8DF0144D690475C0C694FF6CE2B48F85C01F2C569188D520D698AD2650B50628A4D633D314D23636DBE58A8B6D1C73A62E60E49A44FD37EF8A53BB6906D8AA64241B6298F36CB0241CB9C9149B5ACC1471AD2BB656BB2600823AE40ADA1A7038B37865534DA493C828731CB740A4B3C94AD3AE51272E054DAE1BD322BDB2892C8B17BEFDE73E7D32B71E658826968D7264A7535C21A2D327D2BD40401D475CC88AA42FE528A69099146F99015747E43B157E7243EA03D0787E38C92194DAF9574C8900FAA8DBDB20C9CFE5AD3CCA812D40F1DB154F57C91A75C45536C3953C3FB714A4375F9736C2559628F804EBFE75C8948445AF97520223A74C0A9FDBE962CF7036AD4E2A9DA32BC746C550727A49B03912CFA2025B845DAA3DB20D40EE827B9574702868466463E4E55EC93F9C6E3D6F27F986253F11B4947FC21CD962745AE2377E0879810C7ADEAA87AACEFFF001239B6C3C9E3B55F594A17F8E67637026B24077FD796171D02EBBE5526E0FECABFE717BFF599FF00E71DBFF358F947FEE8D6999D0FA47B9D7E4FA8FBDEE99260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF861D3DE432034DBC72964CB565278537DF2259C51C6600152C2BE19516D093DDB13CBDF23D5279308D403ACA3623C32E8726892193D65742548F039911E4C03258F9B415E276CAE4DF8D49039755A94A1AD7E5989945873B0BEE7FF9C71F39AD95CC3652DE0EC3893F3CD7658BBAD34E8BF49F4D9C4C12F512944AAC9E39AEC90779872A6B75045AA442EA420CF17D95EFB653C2CF24AD9FF94B596B3B6953D1FAC49C6853BA8F1C9014D111458679F7CD173E94886630F20691FDF890DC0BE62BB6B9D42E984E8E6366F858F7A9C810CC1645A779360216644E04EF9510CC1640DA298978C49CDA9BD30C42C98F1D46F6C2F56DDB946A4F4CB22E3CDE84B492C83BB0666DF2D69EA81876276DB261C88372321620900D3A602C8A0E414DFB604521F73B8FBF15A5652C3A0C5691F1F2A2FEBC56933849A5295C569348C9D85715A46AB506FF004E290162960DD3E9C5BC724C627A002B4F1C529DDB38DA8698AA6AA4F615C5239ABA1EE72E6DB541280CA396F5DB2056D324B903E127E2CAD6D7CF23189FC29D72A9A82C7AE255E81B7F0CC72DF0293DC39505A9D3289B95028069DE9D0D3C7289A494AAE999D08A6F5DF2B699157B5B55600D37C21A93AB6B3ABD38D76DF3222AAB3D8AEC547CF3202A360B3429B10580F881C64C8223EAE9F6792FCB20C913069A240EC08057ECE2AEE735BBF02E062A8EE64C4C18862DD32254242E8166AB0A6F812A978C161AFE38AA412DD98E062AD52062AC4DB54B862C0D46E72126CE88492FE43B16A6443472288B5B8E714A7957A664636F32F4A035894C9A16BEA4D57EAD257FE04E6CB13A0D74DF86DE6D503CCFAE85DC0B96A7DE736D8793C9EA0DC98F053E199D8DC19B9CAD3AEF96171D06E2A76CAA4DC1FD92FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD333A1F48F73AFC9F51F7BDCF24C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85DD35C96DF2964CB6023E1F9E44B20BA47FDE1DFBE5526E081BC7A2935E8323D527930FD45CB4887BE5D0E4D1253673CE1073223C9806516854C237CAE4DF8D12618E343336FDB31E4E66366BE45D767D175482E623455606BF7E61E58BB1C137EB17E5579EA1D734AB485E60D23280457E7EF9ADC917738723DF2D678ECAE638E75062946C7B6F94F0B9B1DD1535D496978CF6BF0C53281B63C283B21750D223D6007B800D7C7224282803E4ED387A4428AAE4086C05192E8F15BC5C621B814C810CC1632F697AB3858A22EA7A90322366576C7353F2BDE5CDCA4E632287241A26C820B0921B658DF7232D691CD4A5B431C6C476C9872209210DC8961BE02D94A72313B605E15200814C5695D6BBE2B48D4278A8F6C578531B76E9B62BC29B420938AD261E9B1FA714D2F119FA462D815D63DE98A53680D0818AA6F149414EB8AAE6980D89CB99F12D5605948EC6B5CACAF12A7D6292EE77C815E245CD755888F11954D416352CE7D43ED98E5BA086B89B92F1F1CA66E5C4A5D24C146E731E4A4A57713165F8776AE56D5229B69DCDA95C218B2AB5421AA4F514CC88AA37EAE5F71D33202A8C917A2373C6BB63264103FBB06A64A78E4192610DD451A37192BE3BE2A96DC319E4E4B21A0C551714AF1B202D514C894847CBE93A87D8918158F6AB72681074A74C55894D73C636538AB16B9999559972326D1F4A4C2EE477A1AD322E393BA716F70638580EAC4664636523B286BB2341E5FD79D8F10D6B21DFFD439B1C4F39AF93F11BCC8E24F30EB0E0D435C3107E939B5C3C9E6729B293667637126A2CB5AE5A5C7502BBE5526E0FEC8BFE7183FF0059A7FE71E3FF00359794BFEE8D6999D0FA47B9D7E4FA8FBDEE79260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85EB109D5771E394B24EE19497451D3950E44B208D724C840F1CAA4DC1037B50A4378647AA4F263B7B18AC6C72E872689206EC51A2653D32F8F26B08F82E48A440FEF295E39093918D3FB23F595759AA225EA7FCAED94172E299412FD5A2223FB75F8328C9172B1CA9F48FE507E663685756D0DE5D985C90B1A13B577F7CD7648D3B4C3983F4F342F325A6BDA35B5C3DC235D7006300824FE398C767698B202C860D46692358E54A18B704E0B05BA62D35B6BD77DBA0C890C63128A79D8107964086D102AC932B00246DBB9C898ADD2296EE2B643E8C425E5BB31ED95914CE3BA167D4A2991B946108F6C431940B13BCBC049111AD32624D3E19B4ABEB13382AC2993130DD114974E3892186F8DDB6092041DCD46D8AF12E6EA4D36F1C57897091456A715E2565993615C578C2656CEA69EF8AF104EEDA4407738A6C27B132151BE295540189A62CD1023351B7D38AA24232D0914C55148DD29D31559373AEC32DB544DB9A0F8BE9C812869C7C7C874F1CAC94B6F229000395CCDA84AA68DB996A6DDCE63B7C36414CE95A577CA66E540A45792D09DEA331E6C88B41C2FCE4006E7C32B6B9448DD9259C81283A64C45AF8939FAD3715E0475DF2E0BC4135B7BD2A9566CBC49788295C6A1137DA3CA9D4612CE26D8F5F6A9044A5AAAB4DF761FD723C2CE982EA5E7AB3B105566524D796E36FC71E15A63C9F9AB6B1D47A8A5BE63FAE34B4A4DF9AE92238128592BFBB507AFE39190544695F99324B308EE25A027615FEDC8D26DE956DA8C1A8C0662D56E831A5B63BA93FC7C23A927B531A543456723C3FBD4A313F86464D8262A90ADA70462426F91693024ECB5ADCAA0929448D8733E19763906194F0879FFE736BA343F26EA571EA7A69776AE96EDFCCC54803EFCD86298797D76404BF1AE617524D2CB74BC6791D9A415AFED1CDBE290AD9D1CE24EEA7C18F419990C81C498A5AE8C06E2872EE305C7A52E058ECB5CACEEDC1FD8DFF00CE308A7FCE35FF00CE3C8F0FCB3F290FFB935AE67C3E91EE75D93EA3EF7B964983B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BD3BEC652C938B6FEF53FD6C89641399500ABE5526E090DF3B32B11D40C8F549E4C7AFDE4E31FE397439344905217668C78E644793584C2C406BA27F9475CAE4E4637A6796B49FAFD95DBA0E455AB94D5B951E4C7EF266B5BC6B775A50D304A2CC4D7C26EBD7496194C7E97C48D5EF985931B918B23EA0FCA5FCDFD5B48BEB6B6D4EF19AD9481F131A537F139833C4EDB06601FA51E59F3FF9775DB2B764950C8CA3910457F5E53C1C2EC6192DE8D0C7672422789AA08AED91B72E050F34C84A88C74FB59025BC6ED2C8DF3F0C899354A289496A8CBD2BDB21236CF0C50922D011E390A6E314BA4B22416A634D44255246633BF638D3021033905B7F0E996C5ACA0682B5C92AC734247E18AA8337BFCF1572B74FD78B594CEDA6A0A62D914EADE652462CC325B6605462D89B4282A3BD71668EE031558ED8AB68DD3C3155772A77C9AD2989950100E56534A46707A9C84969A1254D474CA8A40DD648F5539516D8A4B350354E5126F821258048390DC0CA26DF14B638945C71E5C4D3AE463CD728B8A6358E05E4641B75DF2C70F850ADAC5B16E0660BC4D6B5C9C53C0D4FE71D2ACA2224B95A8F7FEDCB578581EB3F9B1A3DAC4FC640C4D42D3C7EFC945B2029F38F9ABF379DE597D19DD63A9E95FEB926C7906A1F99CD71EA52E9AABD4127FAE2AC557F301DE46ADD356BE3FDB8AA656BE75BD915E4B79CB2A1A36FDFEFC8C9059D7947CED24B7F18BB6661C803D7FAE455F61F973CE960B68891EE0EED5F1C559347E6182E6752B106A9C55939B95940658F8823A64486A3CD0CEF5AFC19590E4C64A2FE9B2FA4C2866EDF2C9C22E0EAA5B3E40FF9CA7F308B7D046911BFC71A9F86BF3CCEC71793D61DDF9A864E681D8FC4D527375861E975929521B91AEDE399020E26492E33A13C5B7236CB40A68B4D2CE28A4EAB9600DA0BFB03FF009C6A017FE71CBF2000E83F2DFCAA07FDC22D73363C83AFC9F51F7BDB324C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85CD3C715A1EB94B24E228DC303B75A8C896514F44323C058D3EFCA8B70499EDCB24B5A647AA4F2492F638CAAFF91F6B2E87268925A5E07F8D2B48F63F4E6447935854B3E4B73327ED15247DD95C9C8C6FA0BF26AC66D5D2F6D22512486A287A6541C8E8C6FCFDA1A586A5710950B75093EA0ED936B32A79F192E1220A4D2A39291954A1698CD562D4A485158BB2C8A762329389CFC59DEF9E40FCD2BDD0960334F2B46E42F52694FA7313538A83B3D36A1F767917F3C6C350B782092EC06A00431A78660183B5C595F44693E60D3F558D7D39939103BF8E53214E7C260B295B66E21832303D286B94CB666775DE8488EA781A1F6C31DD944D35246EC6A23603B922992A64648A11A98B8820B569418D06B24062FABC2D683D4996887A531A6B25884B751B92C84D0F8E16050F57FB5514C285BEA57BEF8AA9B9F7F962AEE42837C5ACA2612716C8A3A17756152298B30CB2CE71C455B16C64115C28A55A9418B3470B943D0E2AE3206E877C55B57A0F7C5548CFC07C677C9B6D20649CB37C26801CACAAAC659B71D32125562DC76AEE72A2AB7983515DF2A2CA2955F3D15941F88D29944B937C1A8A4021F8CEF4CA26DF1631A9DD7A3C9D1A86B4C8C39B29724A9EEE49E3203354E58D54C4758B3D4562F5226DCB5363BE4E2B4C2A5D0754BE722494F1EF56396AD05A7C8B6654FD61CBB1EC7A64A2B4935E7E5C79767564907C4C3C324AC0F51FC93D2262CF6E7883526BB62A935B7E45D8FA9B9A927AE2ACCB4AFC83B510CCFEA705E42A323241677A0FE53E83A5C81A62A597C722AF51B0F2BE90CEA96BB1514A2F4C55153583E99708A895DF638AB2386FDFD3459051FC3034CB9A2D6E19876C8F0AF1D34D342CF1CA4F1FAA2B35D7CBAED9918A3BB81AAC9B3F327FE7257CD967AF79AEF2D74D9DA48E0E4AEAFB6E2BD33638F1BCDEA4D97C82C5D763D3B66E30C7D2EA66511000C4572DE4E24CA356D6126BFB44EF86D880C92C2CE20061E26F8C5FD757FCE3780BFF0038EFF90AA3A2FE5D79580FA349B5CCE87D21D764FA8FBDED19260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BB6F848AE52C9904352B5F0C896514D3D7E36C77CA8B704AE3943AC9BEF91EA93C921BBFB2FF004E5D0E4D124854D2198FF94BFAF2F8F2601358471B966F18FF0086424DF8DF5BFF00CE24D8A6A7E63B9B6715564634F7198F234E544585BF9F9E5A934FD775396342055B7FBB1136B9C1F3100C614E4370B96036D06C20E54F8078D72756DB09334D247FA1C629B9EF9467C761CCC597853D827BFD3254B8B6BE642A6A141CC09E27698350F58F2A7E73EBFA4DC470CF3B988951CABE14CC49E276F872BECDF23FE7858DD476EB3DD8694815527E5ED9893839A26FA16D3F306DEFE28A55911380A28AF5FC32318A99D2723CCC6F10233A229FDAC970A0E54AEEB5C834C9030BD578C8E4C6BDF1E16A395E4DE74FCD485A64B586753DB63FD98F0B039103A66BAD7D124BCEBCBC30726C89B4F45EB1A2F2DCE2CD1092357AE2A88F888EB8AA834850D3C31605562B923BE2CE2895B86AD6BD716613AB4BB7000AF5C5B03238AF8FC3BEF4C59A651DD934DFAE2A9925C57BE2A89593E1FA314C79A065763BD726DF4A22BD7E9CACAF0AAACC13BE424BC2E6B8AFC43B6545045209AFB8BF5CA8AC50571741DAA4F5CA64DF04BE7D43802AA731E6DF148E59BD77A3FD9AD4E461CD390D04F6CCD998C291BD32C71B8D4EE6D2240640BCD5B6E3FC72617898FB58A732E4045EF962F1A51A8CB688AA88FF001D77C9C59C656C3A7748E4E6D27C35AE49938EB9A728547DC8C55522D734F520C7154FCB154C63F30B49F0C44411FED29DAB91920A5375AAF2B9553217A9ED9157A77945B99568C1E05A8D5F1C559B798AC80B713AA0E406F8ABCDE3D44F221CD181A53080E3CCA6D1EA238F5C20346495060DF999E7087CAFE5C17AB2859EED1C15AEFD08CCCC31757A89D87E54F99EE6EB5CF30EA3A93312B2B311F4939B5C50D9D266365881B52546D999195075F38DABDB5A9EC3194DA2504F60B08D8AF8F7CACE4651C4CBAC3490C071E9E190395CA8627F58BFF38EE9E9FF00CE3F7E45C7FEFBFCBDF2C2FDDA55B0CDCE23708FB83A3CC2B24BDE5EC59635BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85884F361C76CAF8536C96DC111904D6A301816424D4A58C5C075A65462CC6441C41E1560CA5C9E80654765394525D76A423B31095ECD96E336D12CA18F05E69242AC0B484107B6C733230348134E0FC0EA6849910814F964278C86F84DF60FF00CE1AFA8BE6C997890CB5427B6F98594539D8657B3DBBFE720B44F56E352AA8320526BF40CC7E2A679214FCFAD422F413895A713C4E591CAE14F6485D8351286B5CCA84C14464F40D0A20D0C709A127BE3964006F88E264377A544A16AC797E19892C81CEC008418B78D5951D6BE04662642EDF164A099E9E2EED2E565B29CA1435A1398920E58D500F50B0FCCBD6A0F4E192770F0ECBC4ED4F7DB2996CCBF3024CDED7F37358E01259E4E245363FD991B41CAA7A97E61EA7771FA705CCD461B963FD98DB0F1187DA6A375A8DFA09E4919F97DAED8DB1337D27E58965B5B3854B971D70F0DB958A7419A457ACD2AB576F0C781B78D90C37CB51F153E79122990926B15CABAECE3E9C090B6491493DCF8E282143D555F1F962C86C8859EB4A57DB1640A696D24840DF167C4C82094556B5C53E204EA09169DF14F1A3A19949FB58A414DE27523ED8F962C816DD4788A0C9B68CA165630A41EB4D8E40848CA12C9E4E3FB5F3C810CB8D086E9551AB5395485053249E694B3F2076F0CA0C911507B8526B5E998F2986E8EC954D3879295CA8FA999CA229B69D6F1CF22ABF422A708853564D4090A6616FA65804AFC5CA985C7F1107776E2353E99A8EC3240AF88C3AFC4EA181A508E8327C6BE2306BCB3672F20635EA41CB319B6DC79186DFC7292CA49A65DC2DBE284858411732558B1E95C7857C5097FE9178643C5453DF1E14F8A11BF5DFAF71E6CD13A0A2F1E87E795CC5309660CAF42B41EAA34BFBDDF6AE52649196DEDBA3AC91C6A21554A374C1E2065C69DEB17D722C9A3908269D7263763E2878E3CB28B89030DEB52C3A53261C7C99022CDF47042D34AFC238FED13964604B87972BE3AFCEAF345C799357B8D2F4F98FD4ECA80723B1AD6B4CD861C6EAB3650F99E6B7BA8AF3882BE99D9877CD9E3141D5E49A0EE2DC076006C3265C594952DA2A76CAE450236CA34DB28E591405353D7316526F8637AF68BA242630596BB6527239718BFA78FC884117E47FE4D443611F91BCBAA07B0D32DC674FA7FEEE3EE1F73CBEA3FBD97BCFDEF56CB9A5D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF858B4FB432AE36EF0D94C1F6457A77C789061488210F4C89DD81539220637E0C15E9F0B7865660C244524D756F13A52693D47F019761C6E31905B67E5ABED43F756D68EAAFB89E9B0A66C61065198B425DE8B7BA7DD4114CFD036D95640E66220BEC4FF9C378DD7CE37019830E62A335D99D8E10017D63F9B7A7A6A3AB6A7005E47D36DBE8198526DCA6DF997E77B23A6EAD25AB0E2A0D7200D38138B07922A10C33271C9AC459B79526E573E9B7602992CC6C3958B67A75E5A7308CA3A8CC493B0C692359B89375DF28C8E6C792BD9C6E26238E63C925131C00CEC5C5083B644C6D946549998D5694C1C0CB8D1B1395E31815AEF8F02F1BD5FCABE5F49D16764F8BAE3C0BC4F5AD3A16810474D94ED86A9CAC4764E919B983F7E25B814DE201A8CCD4272A93644A690F1029C8E41B0146FAD40003B0C5928B4FEF8A559273F0D4F862A9A5B5DD286B8109DC57CA08DF0B105358F50403ED7CF16C051297B08228F8B3051E9A8A01B3F4E98B3B6CEAC4FED64896622B7F4913DF205988A067BD249F8B204B608A0FEB47725B6CAA6526282B8BC201A1CC599445269AF5FB5731E4DBD17DAFA93480F63928868996716303222B74DB2E1071AF74EA3770295230F84B6A53B32AF23BD71F097898EDED5C1F871F096D8D4F0121885EBD72CC71A6C81B63B77A6990310BB9AE5CDAC12FF4AB80CDC50D0F4C558EC9A3DE3BEC877F6C551B65A2DE8956B1B52BB653910636F54D134C962319910E6290D9183D46C42C7C05295DE980067253D7A655B76DFB665422E34CBC8AE2ED959C0FB3FCD968838939879279F7CD7E8594D630B9591C1008F7AE5F8E0E1E49BE6986D2E66B998CE4C8EC49673EF99D8F675D96492EA9A6709AA13BE65C4B8336373E9D234AD45EF84968E04759E8D2B015427299C9B61167BA2E84EAF1931F5CC6939110F67D1F4BE318F87B65326F8BFA35FC955E1F937F94A9FCBE4CD047DDA7419D5E9BFBA87B87DCF29A9FEF67EF3F7BD372E69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF855B670AC2A330CB984B2785D5A23C4EE46C300938D3C8037146EC0D640A57B1EA73271C6DC59E7013FD17CBB7FAEB98A106353D588EB9991D3B85A8D50112F59D1BF2CACE1557BF01993724E5F8F03A39768B3EB2B0D26C08B45317A454D401F16C3C732BC3D971F68BE7EFCC1D3E117D1DCDBB5631C8041D7BE60E78D3B9D2EB789F437FCE1B5928F37DC48C4A6FCAADEDDB35595DFE973F117D6DE76B8853CCBA848F19742AC38FDD98530EC4EEFCF4FCE7D0AE26D50DF5BC263889E5D3AF4DB292D5283C3230655657431B275AF7CB612A6A31A651E578C9BE1C5A94A65933619E30F7148792460EFB653273F1AF4B1ABB029C89E87C3289B9B16EDB4CFF004A3F0F5F6CC7924A3C6845A6E741D7A530C5814DA3F2DB4D4A2D3DE99246E9B59F955DAE230141A7B62BBBD7748D35ACA255DABE00615B2C9238C83C9969ED95973709D912B1FC4081F31912E48298C7C788D8E552660A2D08A743EF90660AA7A95D80E9D31656EE05BF6A98A6D772A7C35E9B62B6898A4E3D4D7145A244DDF9D315B442DD11D1B1640A3E1B84A8AB6F8B65A6D1DC42109A9E98B3077524BA534DFE5809724144FAE0A9A1A6DB6449660A02595BFDF832A25B0150FAD71DB9572B994CCEC8692E958D28731A4D112BE38BD42083D7B656D97B325D36D5415240F965D8E2D332CC15408C00287C732E107189B2B7E207ED5465BC010A95E638B0AE3C0150B2DB07E8B8F00543A699CF9D453C32328D3762431D138B54D18785320DE8693CBF0CE45502D3C7156E2F295B83560A47CB154CE0F2E598707D351C4F865536704CA6D16085032D001945365A47724C33A90A7805EA3C7271834E4C94C63CC5A8C0B6EDC9E840DF3371E375B9333C3755D61A4574B67F1ABE640C4E064CFBBC875ED367D4A61297F881DC9C988538F3C96A56DA488630CD1737237232D8871A52B492FF00449A798BAC3B78658254D2425FFE1E666DE2A1F9644CD90C6C86C3CBDC40AC5DBC321C4D831B38D3F468D387EEF7A6F9592D822CEAD2C5234038819596603F7D7F27871FCA4FCAD5F0F286883FE9C21CEAB4FF00DD47DC3EE792D4FF007B3F79FBDE8D9734BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF84F5A9238F5CAA50699EA135805C2D19413C7A0F1CA841D7E5D4BD77C9FE4C9F5955BAB9531A36FB8A7F0CDAE9B15BABCBABA7B25BC363E568B8428AD2D3E13B75CDC474FE975F9B54642929D43CD1733551578D7C3251C4EA660B1C79EEA4E530908600D30CE1B231715A437D65F5A82269F76DFAE6A75317A5D04097D2BFF38A5603FC513C69B50F519A5C8F59A4818BDF3F32C8B6D7EE550D4EF503E8CC4C8EDA06DE35E6CD274ED634C8E1745F5C2F2DC6FDB31645BC45F0F79C3499F4CD4E482088842DD40C6326A9C55BCB703DBDDC25B66722B97036C22FA334EB45963889EE06093998D91DB69F1FA87E1AE5191CD8F245DB5845F5ADD46512E6929EC1A746D253877F0C8DD2631B66365A3C2101283071B2E0641A7E9B6AB2F22A0536C7897813496D944AA517E11D71E35E0463C28C415E94186DB63B2E580602DA0AA88B88F6F0CAA4DA0B74A641902A65A84D3164D09A9D7155F50686BD77C55DCC0DB90C554DA6A54F2C516A26EE9D1B16C06D552F883F6B0330518BA937F37E3859834AE97F4FDACAC96C1345AEA15523976C812CC4D4DAF474E5BE544B671A88B82CD4E5D72124CA7B2AAB0E42A7BE504B18B23B331FC3B8C039B6B27B39A35A6F9978A2D190A73F5D8F8D2BBF6CCBAA71495CB728DB636BC4ACB301B8F9636BC498DB3ABF518DAF126255154103AE4265C8C25AA467ED0CADC97048491B0C5556910EE31550692256A823DF2B9ADD216EEF23E34AE5643194D846AFA82420B33058E952C72EC637703365781F99FCDF662678397A8A4D0919B2C7074D9B3BCEE7D5EC0C9584D10EFF004E6588389E2DAFB7F4AF4811906B80C11C68897479C39A3D01E8BE19514A9FE8B71F69B204A695974DA007803EF4CA8C9CA84764C6DED78EDC0636CF85905B45180BF08069BE368213650028A0FA3157EEEFE50FFE4A6FCAFF00FC04B44FFA80873A8D3FF771F70FB9E4753FDECFFAC7EF7A265CD0EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85F8ECA6827585979C84FD919084FC474B9674F6CF29F906F35036D773218A18D833A95FB437DB719B1C3A1E274FA8D43DA2E0C763686D6D2216DC06CE3BE6D30E8F81D5CF2F11610F34D76CEB212EC8767CCC3300535006ED2AB986E56455F4CB03FB54CC7F1699CB7539675B32AB335030DEBB532B9E76EC1877633ABEBD05BC4817E3095DEBE39AFCDEA7A8D0E301F49FFCE3379B34BD275C3753CAABF58466DC81C4F875CD5E6C342DE931914F72F3ADEC17BACC9A94171F5A4B9DFD21FB35CD7CE36E44254F2DD5E40F74AC253188D3E28FDB31A78CB951C8F3BD4BCA69E67B826C23334CBD471FEC395F0D322049E6DA8F93752D03518E4BC89E28D5BEC95207DF4C2254C6389EA9A33F3B58E48979851B8C4CDC884699569EEACE6BD5FF000CA652722324EBD158255940E61BB6545927D6AB1D43EDBEE47865728DB644D32A8A7884600F0C1C0CC4ADAFAC952283BE3C0DD18DB27B39964B73CA3DE9F6B1E06C186DD1A90A6A77A9C9C62D528515707AED84848D950380A2A37CAA41902A4CC7B0FA3214CC490EC549353438190921A42AB53CB14F1297390814AD3B62B6A2C66F7EB8ADA8BCAE2B5E98AD201E46AFDBA62C97FAE07FBB2A7BE2CB89DF5C03ABD0F8E02CB8DB5BFE34F8ABF4E506569051B1DF7203E2C896C89561755FDBC8D3305556E7810FCAB4ED8382D24A252ECBB57A7D39138523252716B7C626525B901DB11869978CC9ACEFD64A7C5C72F87A5AE53B4DE394935E5B53AE5BC77B35108B8EE82903957DF229114CEDEE62E5566E43C3DF1663127705DC0A2B8B3181305D460208A74F7C05B618F854A4BF87C46001B2D06DA8C6BBF2FA3088ADA1A4D622029CFF001C9702DA17F4AC4C681BE23D05729CB1A5AB405CDD731BBF0F01918C2DC7C9B3C4BF35FCCF268FA60B6B78DEE2F27158E34AF434DEA332F1E3751A8C8AFF00959F947A8F9D3433AAEA90B5BFAA2A3983B75F119B1C717499A565BD67FE71E6F9B549EC74CD4B9F04E6005EE7B74CCC842C38E254C2A7FCA7F39795E57730C9731C7D5829FE991941B23240C3785A76B4BD06DEE22DA507B6634E0E4455269E35902A2FAA9DE40731CC5B8056F5410027D9FD939518B9319505E8CE36AE222C84938B13CC8A8E9D708091BA7885760570A781FBABF947FF0092A3F2C7FF00013D17FEA061CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8797343B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D2F23F91A57BA4BFD6D6BC0D68D99B874D4F199B556F6FBFF00315959471D8E9F1AA0A7024019B9C18F85D466CD6C59E49EF25615E4332A52A0D50DCB2DF2D6856B70C52551CE43DF31324DCEC38B88D3D353C81A7CB0F32AB551E03FA663193B0FCA3E7DFCCDF2B2E9FEABC7B2C7E1F4E53293938B4F4F9C6F56297D485DF7198E64EDB4F0E146E83AFDC797196E2DE46AA9A00091D7E9CC6CDB876719D3DDBCB3F9BD24F2C31DE0DA94AB1FEA7308C1B0667B4D94D69ACB0BD12208D97E3151D3289636F8657A07911B4F7D723B3D2E146909A39DB7CC738DBE395EB1F997F96F6BAE687305B355D42DA332D55454D47B0C8F03938A76F86AD6E6EFCB17173A65F42C9F1955E429DF0183920B2BB7BC4616F2C5B16DDC65660CC165F14EB3463B9032071B30532B566E2C3B83B65538D1499526D019BBD6990E16719A6917C5DBA63C2DF19A6D6F7CB1008C7E8C785BE395344BA420107AE061396E881329C892A0DAD663C8D0ED9592CC054571DF2BB6C017F2B7FDA1BF7C2A8599ADE876DBBE2A82372A361D3A0C5541AE7155295D4AD477C52934EC6BB6D8AA0C87F138AA8307DB7380A43AAD502BB7865062DA0A3E1269D7A60A6C0510A5BF98E34D80ABA3316515F98C69369846687AE16B4C2075322A96D8F7C55328A7F498156AD31564767AA23108EDDB08544B5EC55DA4FC724C81444378A5A9EA7BF5C2CC14C92F401F6F6F9E06C1277E9458EB593AEC37C84CB6715A849AC27412F4F7C8829421D6A25AF292BE1BE580AA026D6226DC3FE39602A841AA52B2C64B329A0032AC82DC5CF9B81E8FA0797EFF00CC36DF582AC8AA3AD30C62E064D45B23D2FF002E746D666FABEB1682EAEE27FDDB915A27874CCCC61C0CB2B7BEC5E5C8B43F2FBD969AA96E889B050053F01997034E0CE16C3BC93A446D35E6A37975CAECB32853E03A665C25B38C63BA6F3C3CEDB526BEB5496201B83151EFED82526710F942FF00F2B62F34EABAAEA1631FA2F393450294A57DB31E45C8807897983488FC97713E9FA8CA1A624844277CA0B7C52BB760F0C4E05030A819590C81A45AF5C14CC14D74F6F888F0C7859829D237C58D3305FBB9F945FF0092A3F2C3FF00012D17FEA021CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8796B43B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF911B5D4CA4450905BBAE74F1C603E6D3B48AE67FACCEA900FDE16A6D9682038A626D9EF97B49957795D99CFEC9195CE6E660C6F47B1B58EC87AAF540BB961D4661CE4EE74B87D4191C5AFAAC65616692836E5B65066EFC600F1FF3E4D71AB45708F1045607E21F4E5329B64703E3BD62C6EECB539792FEE8B1F88FCF31CCDB04292D9AE9C158E18C484915AE57C56C8DA31A49596358E416F21EA54E44840059C68FE69D574B44824D51BD24151F16E7D8E63C837C6DEEDF96BF9A30697AC437F733A5B98C8A9E5D7E798F272216FBDBC9DF9E9E4FD7AF7EAF7B7111F56309212474C003978362F14FCFAD33C9F3EA31DFE8572B34929E46314A54D7C301736DE23636377C39471820F5F6C8101B0499559B2DBA8F59E847619590CC14FAC751B37996105CB374DB6CA671B613932D59618940988453D0F7C8F0A04D136CD6F2352390BA9FDA1BEFE18385B064A593E9D74D30689498C9DD8E3C2CC66461E76A80354A81BB65538EE9F15B87528DDB846416F0272B316C8E54DE3BC454025A06EF4CACC5C98E45296FE05DD4B37B5321C0DE24BA2BC570095007BF5C8B0326E59EDE9BB004E28B4B5E48F7A1A8C56D41A44DF7C56D45A4DB167C482797AEC315E24135C76A62BC4A06E0D7A75C4A89287AB43D72921B414545734A53E9C785B01B45ADC8F1C785982AE2E42D0D7A74C14C89D95D2EEA2B5DF035DAAADD92C17953DF15B4CE0BB006EDCBDF15B44BCE78F247A3FB6109050E2EEE01FB44FD392664A69697B329A93DB147123FF4A3014240FA71533A434FA846D148EF394310AA81DF018DB28654A6E3518B9DBAC324B2198D1CD3A60106CF142A299A4BC92D622F2040086237DF2622BE28651A77947CC5A9C4F35BD83945E8C4102996082F881EB3E4EFCA9BD9D44FA8388EA7918FE5898BAAD7E4DDF4559E9967A26872A40024C828A0EC09C9083AFE3280F24DBDEACF7535F5BA2C8EC5A075DFE1DE997C4522ED966AD33DA5A4934D2963312A213D299785E152D23CBF696D62D3ABB191FF007A2BDCB76CB449A670DD4BCD4C2CF402DC4249715529F3DAB80C944698D7953405B5B06BB9A61140D1C923CDFB5D2BD32B25980FCBFF003D4B379FFF003D6EF4486FCC7A769D39ACAA7ED509EB9021982FA1F54FC9D96DF4DB7BFD27525BB9258C39B52C28BB0D85322907778AEA52AE8F70D677C443780D046761F7E2C814CEC599516534A30AEDD30365A6515E425FE26A7B61676FDE9FCA021BF297F2B997756F28E8841F63610E74783FBB8FB87DCF21A9FEF67FD63F7BD172D68762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EF578F9B5C06FDDBF4CE9B8DE267A6651E54D1967BAFADC9BA72AAE552C8E29C1BBD62DE25826E4AB45AE56656E6E0C28FB8B9068427241F697C72B9F276F871F0EE94C97B4256184257314C9D96395B10D522BB9CC8D23058687965129399116F07F30E857BACDF35B58446572D4F8728949651A4E34BFC8DF335FC6918B3912693756A76FBF2B126118D966FA67FCE2079E3569D2425E28DBA7F9F2C4C9C918596BFF00CE13F9AA29D1E5BD255853896E9FF0D944A4DD0C4CC2CBFE706B5A9E359DB5858C2EECBCFF00E6ECA2526F8E265563FF0038CDA7E8171691DF7994594A8F4F50494E4476EB91126D11E17A95A7E487956EAE62177E6E597881D6407F8E032660A7179F957E4CD35D2DE1F32C444A28C798DA995993602A69F929E539E932F9A6293BF0120C812D82491F987F2C348D2EDBEB1A7EAA048836F886E7EFC46ED3964C33FE55FF009A2FECCDDDAAFD7517A01BFF001C970B57131F6D13CF3A6481DB4B6B5B68FED02A454F8E3C28F11136DE77BCB598417D6E4229A31A634BE2338B4D6B48D6A25442179EC6BE380C2D81CD45BBAF28385F5EC65A93B8A1C81C6DF0CC92CBA4EB91A13E9B3D3BE40E37331E54BCCDA9DAB7EF6D0923DB2BF0DCA8CD53F48A85E722346C7ED2F8661CC516CBB516D4ED5BED311F3C82AFFAEC741C5B63D3E58AA8B5E27F362AA2FA82F4AEC3BE2D96817BF5AF5DBBE29B59F5A88FED62B6DFAF19EF8A82A2648EBF6BAE45B42BC6CB4FB5BE1640AB2B8DB7C0D815B92D3AD70164AD1B0A75CA9AD7F2DC50EF8551D0135A5715477A8513956BBD310CA3CD6FD61BAD324CCA9BDF49F663EB8B548A3ED2C750BFA705635F0C5ACC99E795BF2D359D7F538AD591845506507C0FD396E38DB0964A7D476DF933A0D959033C4867812AEC7B6DF3CBBC363E2A47A4F937C9BA5DEDDEABA95DC29145BF027AF1FF006B2C18D7C5629E7CFF009C98F23796F4ABBD13CB56714B76A0A0950577029E1ED93F0D7C57937E5BFE746B779ACC375AC4AD0E9CC4B70EDC6BF2C84E14E3E63C6FAAB53FCD9F25F9AEDA0D1F43981BDA8590AF5AF7ED80069E07B5E83A3AD8E9B6019FD4927456E47B03DB260278588F9D0BDE6AB67A65BF660580C902ACD043E8C3A7C1D2A02B8F96264C4861FF00987FE997DA7E996FD178F35191E2470A335A8DA0F265F5869B66D3EA4B6CCA0815DD908C921F9C3F96FE439FCB3E7ED77CC1E77D224852EE6768DCA6F424FB9C3487D831793349D5EC21D5BCBBADB441E3E6D64ED4E1ED4C348B7E587FCE45F9ADF47F3B0D3667A346FC5A64F6A60E1660A1FCA5F98F1DD086D6693F771A84563DC78E34D80D3DA2CEEF4FBD50F1CC391F7C69982FE81FF26E83F287F2A829A81E4FD0E87DBF47C19D061FEEE3EE0F25A9FEF67EF3F7BD232C69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8BED12FA6D457F46FA12ADBC7F626A7C47E6736E72BCD5193DAFCA1772C114D67796EF4894FD51E31D5BB72F6C899A63A6B6609AB5DA32C37B6E2DD587C2E452BF2C78DCDC5A4012093CFBA5D95C5C4123AA9B7157693A7EAC13C9B39630D30CD5FF003318397B28A39E2ECD18AFF0CC4326D863A62B73E79D575085C4517A61F6F886DFAB29949CC807D51FF38D7F96B36BF24BE60D7A33C62F8E30BF64F43BEF98F29378C40BEE7D22C74E69E9269D0C76D07C10CB1AD18BF45AFB655C4CBC1E1DD9E8BFB58ED1ED0C421BF857933462881478E266DF8E16F93FCD9F9B3A89F3543E5DD06E92E5E7904370EC6BC2BD48DB2894DCD86114C9FCEFA4EB5E4DF2D0D6EE7CD33CD77749CA3B3864DAA7B5331A536C38E9E45E5CFCBEF30F9C746D43CE7E64D66E20B0B2532DB425E858FB0C89C94C463B64BF967F973179E359223BABDB6D26DEBEBDD31A6CBE06A32072527C17977E75585B796FCC53E81E54B9BBD4A68BE15773C8F2DC640E56DC7A7B286FCAFF002B79ECCC351D62C6F9A0421B801F0F1EB959CAEC31767F13E9997F303F2DADECC68BE67D3A6B4BB20707028DB6C4E1198863A8ECDA28BB3F307935EDBD0F2EEBB25AA1FB2B2BD313A92D3FC9A82D7B509BF41DC2C9AADB5F475256456ABFCB251CE4B4E4ECFE17805ADC68374F7306A7693F224F0940D8E644276EB3361314A5FCB71DB96BED36F0C31F22521734232F0C2386C59661A17994D9010DE5D212BB75C90882931A7AE681AF68FAB442DD6E22172B5E418ED919419C7210C953CBDA4EA2A566A7ADFB253ECE63CB6726398B18D47F2CE695A4789223131AA377A7DF98192365CC86434C1755FCB7B8B552CB1866F0EDFAF2A316CE379BDEE87A8DB170B6D29E269D36FA3234C81481A3BD462258245A7B645210F34BE98F8C1030B7525C6F2035058838B3115212F03591CFB53148802A6DA8C6845198E2C8E20022A1BB59A95241F6C5AC48A3967229C6B4F138B30510B73D37E98B74510B703ECD7AE03BA65B045070AB50D91E171BC42AA92EC64AEEB9131489A36DAEC3380DB0F118084892266BD759111006889DEBD71886C81DD1F0992E18C50C4657A7C210572CE16D243D3BC97F957AF798E482792310C524A1645E8426FBF5EB8F0B8D393EB1D1FF002374CD2AD24B8FACC8B2409CBF7A76247D38F0B8D29A0B4DF33689E5E3793CF730C571A7D79F134A8197618B10789E11F993FF003955A5E97697F6FA0A9BABC98323B49BA8EA36F87325AE669F188F3B7E6079FAF9ADAD2F561B59FD46B94534201A9006C3C70DB8E7290C5B4AD3E1D275392DB592F717334A03C8FBF53DB27C69194BEACF2AF93E2D6E1161A2A492974A3B36FC411DB2B99B6C8CDED5F941F9172796BCC4FA84AD2CE8CFCA6F537E277E9BE56CF8EDF74C691C2A8109E1025501F6C3652082F3BB1AEA1E6A7BCA739223C78FECED8DA683D06F1115A198578A312DEC72F8C0485A90180C006AFE6C9243F14708DA982500189A66B1C4F1488518AA4B5E5F25CAA52A6069E4DE67B48BCC7E67B6D2DADD25B585C7AEC07C54077CABC621AF64279ABF2B6EF4DD2B5AD5741BE6B484216823534A0A0EBBE4865B6C1005F879F9B02E6E7CD9A80D61E3BA9E1958073B9DB26269E00F3089B568627BAD3D12358E4A1E636E3ED960368D83D2B43F3C4F63259C11C9CE5968272DF641EF4DB274178807F551F9093B5D7E45FE4BDD350B5CF913CB92B11D2AFA65BB7F1CDEE1FA23EE0F2DA8DF2CBDE7EF7ACE58D2EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90FF00CB7F20CFABEB70F9784FE9BBB0569CD76FA727E3B8A3474FD1DD03F23BF2F3C93A589BCC5E60B79AEDE3E4119F707EFF007C7C76C8E969F1C7FCE4679DBCA97925BE9BE5331C6DA651649E3E8DC698F8EDF1C34F985743D435AB73A95C5AB244568B514F57DBDF01CEC8E34D74AFCB3F36EB344B1B65B6B63FB4C074FBF29395022CB74FFC91D5CEA169646F0CB792B82B02D6868457299657271C5FAB7F90DF96FA8695E588AC2E2331968C027E81941CAE6460F7693CA361A1E8F705C896E5DC145EFCBB1CA8E46E10BD9F397E76FE60587923CA7269D6404DE66D67F72186EC81E9BE0395C8861A60BF911F93BA0E956D75E74F38EA0B3DC5CC06ED8B36E8C6BB75CC79657371E36216F637DF9B9F9A52D868F792CBE5AD35E9287354A2FDDE198F2CACE589ED7E70F2C5C6B0963E42F2E5C1B68B4F939DEBC6688E0F63959CAD4715259E7AF3EE89F933F97B37956C5565F325C2141243F6F930237A57227236E3C5C4F19FC99FC9EF3579E357B2F3B7982E85BDACF299409BAB2F20DEDE390395DBE97476FA57F323F30348FCBD8C68F62F6D3B88F837115DC0A7BF8656723D0E9B40F813CDFACB79A75A6BE9E0145242328E80E0F11CC9F65F131F9AC2248F925F4B6EDE08D4C81CAC4F6481D1434AB8BFB2BB8A73AACD71A746F59A177AD4F7C9C32BAFD4F66D07D412F9D7C87AC79623B2D3ECA38F5644A34B415E599B8F23CE6A7414F0F3A6EAF7777248B3B95AD16253B53E599D8E6E8F2E1E03499E9BE5C56BD53AB192DE2247276DB2F127127165D7FA0E8F0317F2EEA85EF1002C8ADB93E18CA4D6229B7953F33A6D26F5346D6AD65424F1FACB0FA3AD330E72722117D2D63AAD9DEDB42F6B79CD5D4155AE634B9B971E48AF5AD89E372BCD7C72B219A1DACF4FB9E4A6C57813B371EA3C72B21B2293DE792B49BB25BD08D49F6FEDC810CC3CE75CFCAFB296390C4A2B534A7FB78B787916A1F965240EFC54D05698B6061D7DE50D42353FBB240E9F462CC31B974CB8B7E4B25B9AF8D31672E4848D2584EE87171AB74D61B9A8E25295D89C5B150951DF1640B4B28A80A773DB14CCEC9AC658A0DF22E2A3ED62326C7A1AE34B68D58A15824653F18E831E15B645E43F296A9E67D5E1B75899A194D2B966385948C9C2FB83CAFF0092FA779295353D5A2170654E410EF4AFD3991E1A0E77A4E82DA4699F5ED6AE255B3D3ADE3630C55A55C7418F86D32CCF3DD5BF33AE7CE574749D20496F6ECDE9B4E36047CE98F84E34B23CEBCF1A3792FCA7A1EA926BBAA97BEBD80FA4BCF7E743D725185328647E5DEBFA8C32EA57C2CE212DA991B8B91534AE4A98E4928F9735ABDD1EF0DD69B251CAB7A918F9634E29927A350BBF32B5ACB1DBB3DFB5C207A0DFED634CA2FD64FC8CF29C1E5EF2B0D66F63A5CC9081F17662A3010D8F77F23D85DCB6FA9DE5CC815667261AF8646922D3CD6EEC69D62189A168F8D7DF1A6C8DA43E4EB4FAB9B9D4661B4D5E24FBE34CF74E755BCFABE8B3C8C68ECEDC7E9E9878E934520F29DB1B2824D4E71BDC92149F7CAE5918905956A139B4B19A73B7D514927FD615CA253B6B312C23C8F6AD35FDFEB972B54B824424FBE5129313128BFCC0FD23079435716F2B969636A460F4DB2D8DD391189E17E06F9FFCB7AE0F34EA9A85FD94CD01998F220D2996C4B0902C7749D26F7CCD7834686136494AA9229C865824E348909B47E4F86CB506D288E57711A09325C6E399C83FAA2FF9C7E80DB7E437E495B375B7F20F96E33F34D2ED87F0CE9307F771F70FB9D2E5DE67DE5EBB96B0762AEC55D8AAC7DC7D38AA9D0E2AEA1C55D438ABA8715750E2AEA1C55D438AAFC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF233CB9FF0038C3E4DF2ADCBEB13B133D0B1911C0CC3B2E7ECFCE5FF9C95D5A6B1F346A1A7E95AB4E6C625612C5CC96E229B03DB1B29A0F89DEDDEF00926B97974FF5394909AFAA47BB63653C2FA87CC9AF797F56F2279774DD25D34B4D3A86707FBD6A0A751BE365061B337FC8DF2C5E79C752B7D26D6F2E0CAEEA11B937122A32B258460FD2CD3FF27FCBDE569F47B4B9B432EAF28065BC6DF8F427299172618DF40456B6BA6D9C16FA4C4102A51E4661D69EE72891A732106272C4F737978F79C94DADBC970B272AA1F4C578D077395D972B1E3DDF9E76B6317E6E7E6FDCDAEA08F69636B318F8CA7ED509FB35F96425272B829F42FE69F927CBDF977E4FBCB5B1FAE896F63315A4924C4A7A8694A0F0DF28916D8079F7E5DDB5EF907C986636E96B7BAC9ACD7DC6878B03D0E512939118A6307E6459E97A6DCD968086FF00CD3316F4EE07C67936DBD2A72B2594B0DBCCBCB9F94BE65F327999FCDDE78B1B8BA4327A932C95E0141AEC08DB2264E4E9F4FBBD4FCFBF9ABE57F2AE8F0E81E52E7677F0A18E242F550D420EC32B26DE8F498007C75AEDF5D6B378B7DADDCB4D7B292CBBEDD7C32B327A0C31012DFADC21FEAF343EABAED118C5283DF07139825174B3C0842B583B13D2B91254CE285BAB580C5EAADAB41714FB1FB253C699289759AA31AD93BF21FE5BF997CF5AA25B7942D9E390B52E6465257DE9B6676393CB6AA9FA0BF97DFF0038C4BE5FB186E7CD3299AF1497996BFC33618E5B3CA6B620CB646F9AFF0025F45F3497D3AC6330A8F843A6C7C3AE64893AE9C5E7FE59FF009C4B6F2E6BEFA88BA9E78B90608EE5878F4C12935883D1FCE5F91FA16B366919822B5BC450A27550A6B4CC49CB7722317CD97FE5DF30FE5DDECA90C72EAB696CD44F4EA683000D8F40F2E79AEC35E884733AD9DD746B7907C55FA7010CD983EA0F1AFA3C1404F85180EB9590D812B7FADCADCBD6F84F4036C810C834F248AB406BDB7CADBD21BA53293CD41C5B42552E936F221AA038B20C2B54F2BC3217A44BB83DB16C3BBCCF54F2A4B17F751803E58B5F0B13B9D1E5B706AB4FA314243346F1FDA53BF4C50A5146DC838041076C0589927F096E03236C0A6F6C582FC3D7FCEB931BB548A3A0D2A6BABC820B40CC2660251D7AE5A22D7C4FD0BFC98F24E95A1E9D6B7A2D985F08F90673515A7865F8A3BB4CF23D4FCD9E6780AC36D247CE78E3ACC3F6683AED99341C7F11F21DDF9E17CF3E61BCF275ADF243A7D94865BB8D0856A0EA2B5F6C691E25BD5935BFCBEF2569062B7A34F0A7266EADCBFD6C683025F9C1F9BBF987A879ABCC37C25AAE903E1B5727627C0602144A9E07E85AB1755670AC4D77C1C2C2791D64B67A6DC898BB2CBB8849355DFAD463C2D5C56FA7FF00203CAB16AFAF433BBC73C664570817DC1C785BE127EA25D4634ED0934E0BC04DC5828DBA0ED9121CDC401E6CF7CB6D0268F089CBAB2814A1A7DF829BC4425FE6C65BF8AD6D636E3561C877E38D331009F689666F74B92DE195614B215766F6C69B0462C1FCF9AFE876D2C3A341AA4308545370ECC0EE7AF7CC79C776C1008D7F39FE5FDA687656D77E64B5630D0944700D7DF7CACC14C22C4BCD5F9C5E4792D27B1D3F5980FD6C2ADC55813F08A0A6FB640E32D6718653E49F37F93EEB4286C1756817D221A3F8C035EBBEF90F08B0F0C273AE79A34C3A7CF099619CCBB2B5410C3DB7CC8863A0E44202980CDF92FE44F3BE963EBBA72FD6AF3ED3A902B5C3C0C258C3E78F3E7FCE23685A523EB9E5EBAFAB6A963FBB823076A2F4040EB83869C69E10F9423FC92F3C4BE66FAC49A6CB33C8D46B8553C4FE18971CE9EDFD0E7E5058CFA67E52FE5769B72A52E74EF28E896D7087A8786C21461F78CE9F4FFDD47DC3EE797D40AC921E67EF7A2E5CD4EC55D8ABB1568FBE2AD547862AEA8F0C55D51E18ABAA3C3157547862AEA8F0C55D51E18AADC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF30EE7FE3932FFBDDF60FF7998EE4BF25BF357FE537D53FE39BFB5FEF6F5EDD716D0F1497FDDBFF001C5EA7FB9E98B745253FDFDAFF00BC7FDE0FEFBFB9EBDF23264793F4DFFE7143FE3BBA67FC707A2FFBC7FDE74194B18BF42B56FF0094853EC7D8FF0077F5E9FB194CDCA83C8BCEFF0061BFE521FB5FF1E7F63A9E9ED98F272E09DF927FDE49BEDFFBCB27FBDFFDEFFB2FE3953938DF1A59FF00E4EBB4FB1FEF50FF00783FBAEA7EDE464DF27D01FF00395FFF001CEF2EFDAFEF63FF008C1DBAFBE53258F3625F985FF92AB47EBFDCAFFBCDF6BA663C9CDC6F00FF009C69FF0094FA7FEE7ED0FF008EAFCFB65679B9717EA37997FE51BD43FDE3FF00799BFDE4E9F64F4C94F936E93EB7E3179D7FE531BAEBFEF43FF7DFEB9E998E5E9B4FC921BDFF008EDDB74E9FEEEFB1959E4EC23C936D3BFE3A375FEF1FDB1D3E5DB029F8ABEB3FDF27D8FF009E790973627E2AB17FBD717F75FDC8FF007A7EC7D39383AFD47C5FA1DFF389BD2EBFE385D0FF00BC3FDF77EB99F89E675DC8F37D49AFFF007D71FDF743F6FECE6645D066E6C5344FF7A24FEE3AFECFDBEB99117124CCAD3FBE7FB5FECFA60C9C9AC3CD3CF1F69BEDF5FF0075FD398736F8BCA74FFF00A587FBC7DFFE3A19747E9497CB7AEFFCA552FF00BCDF6FFE95B80A43D7A1FF00792DFF00BCFEEC7F7DD722DB1504FB67EDFD1959641565E9DF2A2DE12997ED606D0843F4E2C825571D5BED7D38B6B12BFF00DAFB3FECB14179F6ADF6BFDD78B51611A8F5FF00757D18B192017FBB3F67A603C9804543FDD8C805926D69DF2E8B44F9BD2FC89FF1D6B7FEEBED8FEF7E797C5A25CDFA15E5BFF8E6DA75EA9FDD7D1F865F071F27262BE69FF8EB6A5F6BFDE47EBFC32E71DF97FE4FFF00C995E66FF7BFFDEC93FBBFB7F4FF00938ABEC7BDFF00943F52FF008E77F70DFEF47F7FF47BE2AFCCCD7FFDEDBBFF007A3FBF7FB7F63FD8E1632E4C6A3FB4DF6FE8C0D3245C3FDD5C74EDFDEF5FF638583EDFFF009C50FF008E9C5FDCFDA5FB5D7A8C0E4C1FA41E6DFEFB48FB3FDCF7FB3909399064D63FF1CF8BFBBE9FB3D320DC3E2C67CC5FF1D0B0FB7F647F77FC71671F8A62DFF28CEB5FEF67F74DFEF07F7BF4E167F37E67FE65FF00C746F7FE526E9FEEDFB5903CDBA3F178737D97FF008EDFFCF6EB8127E2952FF7FF00F4B5EBDFAE2D72F8BD3FCA9F6D7FE526E9FF001EFF006708607E2FA3EDBFDE1D1FFE523E8BFDFF004FF65930DD1E5D5F5BF977FDE0D27FDEFF00B2BFDD7DAFA72054A7FE6EFF007960FF007B3A8EBF47DAC816324FB4DFF8E7D97FC733A0FB5FDEF4EF902C1F62796FFE51ED07ECFF00C73AD7ECFD9FEE57A7B674DA7FEEE3EE1F73C7EABFBD9FF58FDE9D65AD0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD9, '1', '2021-03-13 12:29:10', '1', '2021-03-13 12:29:10', b'0', 0); +INSERT INTO `infra_file` VALUES ('9a2317ba-fa4c-4f77-84b4-7cc537d382df', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFE202284943435F50524F46494C450001010000021800000000021000006D6E74725247422058595A2000000000000000000000000061637370000000000000000000000000000000000000000000000000000000010000F6D6000100000000D32D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000F0000000747258595A00000164000000146758595A00000178000000146258595A0000018C0000001472545243000001A00000002867545243000001A00000002862545243000001A00000002877747074000001C80000001463707274000001DC0000003C6D6C756300000000000000010000000C656E5553000000580000001C0073005200470042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A200000000000006FA2000038F50000039058595A2000000000000062990000B785000018DA58595A2000000000000024A000000F840000B6CF706172610000000000040000000266660000F2A700000D59000013D000000A5B000000000000000058595A20000000000000F6D6000100000000D32D6D6C756300000000000000010000000C656E5553000000200000001C0047006F006F0067006C006500200049006E0063002E00200032003000310036FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFC00011080190019003011100021101031101FFC4001F0000010402030101000000000000000000000405060702030108090A0BFFC400511000010302040305040804040404040309010203110421000506311241510713226171088191A1091432B1C1D1E1F015234252162462F1335392D20A4372A2253482E218356317192655648393A3B2FFC4001E0100010403010101000000000000000000000304050601020708090AFFC4004A1100010204040306050303030302030607010211000321310405415112617106138191A1F00722B1C1D11432E10842F115235233629272A20924E21617344382C2D225354463B2F2FFDA000C03010002110311003F00FCFF00F041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C10418208FD87B813D3E67F3C7788F3FC6E69363C22D6FDDF0411BB815D3E63F3C104286410153D460823760820C10418208E4027618208E7815D3E63F3C1041C0AE9F31F9E0820E0574F98FCF04119A10A936E5D479608525EBE1F78DBC0AE9F31F9E08520E0574F98FCF0410702BA7CC7E78208DADA0999B6DE7F8E08236F77E7F2FD70410777E7F2FD70410777E7F2FD704118A93C317999C10CF13AFBFF008C638219C72013B608232E03D47CFF002C1046694F0CCF38FDFCF094D4158006875877214CC4D4FD59E32C6132985EBAD1DBC7E9189A1DBE576B559DD9FA7DE0C2D0D1724AAA4545ABF8AC18553348A7AD1FC695F7ADF44E1946C9F53F76F5BC6C473F76174E33BB4F03024EB57AF9368DA3830E51803308511C2536ABBB6EC6FE9D1A366135E0FBF1DE92CDF335347DDEE075873FAB3873DD005AC29CB7F4D6B780E5F4D5A851A8FB2D5C6FCFDE363F973C309B988C092848E23661A353F0E1FEF1B1CBBF5AEA52806AD7954F9B1B391E70DFF567A9D7C397282190654A510010227ED1F523D3E3A0CBA7F68FE44CB50E2F95D8D8BEBB6EFE908AB3AC2766471AE623E4A8721E9CB4B73D7AC467586B5D2BA4A851555F54D2B3108594242AE1691B7849036DA2498EB6BC763FE0E62FBF335285B02145D07567AB3373E839C707F8B3F13F099FCB1290B41E0052E143F8D47E2EF1E7E769BDBC67DABAADECBA8415508529008E12384980678418B58EC46F7DFD51D8BEC1E2B2C54A331040053420A6D4D5DB4616EB78F1AF6AB1E8C5266709A17DA8E49ADFDF98A15D4F1A96E288FAC39726D6264FDE7974E5B63D138341C3C89686F942403B1259FA01BF3146BF11C561D4AC41535D46ACE2E3416D980B78C33F7B56CB87BCF13677208B0B58013EFE77E5BE1D4FC4E164A0103E602A5EA0F46E9EB5B45932826536F4DD9C352D4F3D2FB3D52AD755FC9CB69D6AA85405AE080831637111067A72BE2B38BCC82D570DD5DBF34FB545E26B329A26A101DC0DBCB6D7DF296D2692FAB2135D9FD5200FB41B252088822E08322C6FCFA5F112BC5898E259248B9B01B6DC8F3B5AF09DD10CA04B0BDBDDFCB5768E2B75F6579237F56CBC0EEC82952B8ACBE1B022790F58E57DB0B48C089EB97C60A9BF6D051CF2BDFD0738CF0B7ED2DBEBF58A8B526BFF00AE05C41924CCDE6E6F620C5C7A82011CBA064F952259494A49B3DC57AFD1875DE32C5EF4D9B4FE7E914E669A892E9971405D51B73DE4FF00B8169E78BD48CAC2C070C031353E0C4FBBD214960D6BEFA7D2AFD5CC57B9BE76C282A48264F31F388F2C5830A8561C0094150029CEB5B3D2FEE90B02458C5659CE748414107884AB8960CF0743CC103623167CBE79596EE94016DFA3DBC474D602A56FABFBB539443ABB50B652A4B55A16A0090D94F09932624F43E9E98B127284E3903893DDCB7625C9A1A3B5F7FB466F57751D1B9EF688457E7D9A212B536D0A74916295A5C2F728099244741BF4387185ECAE5929655FAC4F10A974B355CDDB63E2E7687F845F7038881A74156ADBD80C46AD1966479EEB3AE4D1D165F58FBCEAB852A34AFA112AB495A91C113E7F3C67138DCAB26429B1929D22A0A92096E4FAB69CD8690FD58B29038998F420ED607C5F4D23B15A53D8935667C935FA8EB5191D227816D347B97D758857DB061C0A68A45A08BCD8CC6397E79F18303226AB0982FF00E6785D2B354849D2A4172F5A13B46E9C6CB482490966E120BB1B9B1EB77F28EC2699F669EC9F45774E57D00ACCC1AB9A90F3A8950DD5C21445FEE0440C72CCEFE2063F16B2A9092949774049513D0B75BF4143185E669593C441239EA1F73A0A103520EF16DB35D9169D60B392A825A5A424B72A3C2102D75493EF323D310723033BB529EF714852384BB11551275D400DA3B93D22B79BC93982870034D75F00FD4921BF2C198EB9692092B4DE67C43A5C6D6B5B162C2F651583471CA4958005003E16BD3F310F2B2598925C103426F5F2B5B5BED15FE6DDA286F83B92823C5C478922236DCFC45EF893C360F1085702B09316C59FE617A060C77E40F51599C365533880AB01424569E5D6C4E8763F43BDDF9FCBF5C7C6A8FB131B1B6F7BF4E5EBE78208D9DD93B19F77EB8208CC20A6666FD44608239C1041820830410A1948215239E082377027A7CCFE782083813D3E67F3C1041C00EC27E38208D884004CA62DE7E5CFF0C10A4BD7C3EF1B3813D3E67F3C10A41C09E9F33F9E0820E04F4F99FCF0411B5B481303A608236E0820C10418208D0FEC98DA4CFEFD7E6704369C2A7937D0084D82108DEC6EAF4C10429C1046B7397BFF007FBEB85E454A81B375D768D54A2080CEFEDBE91AF1B2C0248D296E821DCA415F086277E956F0E9061B2BE57D5B6F7E71209C10500785CF3A0F37F1A6FAC7307A1F81C3757CA1EE7503D2B6E7CA36FD3357840DEBA79FE233458906C4EC0D89DF61CF1B494158E32A219CF0B78EFF0096D371A99A9927846B43A93CB95EBEAD1B0DAE6C3CEDF7E135E3E725624CB4A94FF28A3EDCB9F3DA31330B24CA33662920B7155B7D4927E9CB584B599BD1E4CC2EAAB9C42184A655C6A090A001DA489F389DBD316AC87B198ACF6721465AFE6503504B545C0B373357E4D1CCFB55DBEC2767E4CD4A26A78D20FF00700C40237D3EA6E0D23AA9DA97B41D332DBD41A6DC42570A471A162EA883736EBCFDF8F507633E14272F952E66270E1870A99419EAFAD5DC0D2F78F2376E3E2FCCCC8CD932672812541252A3F2935B0BEFA0E978E906A3D759BE6D50BFE3B50F2FBF512C00A5917BAAE9240B0E6664917DF1E89C8F23C248C3818591292500098FC2CA61435D983B0A9BED1E7CC7F6971666A973E72D426124024D35B39BBBD3C621A3307585FF002524A567ED106D3E666F7B01F118B1AE461928799C0929B0000E7561E7A97DAB0C5199FEACB1750258B9F017E6684EBCA14AA96B1F5B45995B951FDBE2E020C0E289E1BF5237EA31058BCD254B79682DC2E2EEEDD2B5D4EFE0DAAF0495BA8861A335EA46F41A915AE8226D94E87AE6529ABCCD680C7DA2952900F08BFD9E2927CCFEB8AD4FC7AB1130CBF9893D75ADFDB1A690DB80E1EA0B373BD036B4035BD3C21C333D4F91E46D0672361B554905350E18F09488175023D23F2930B96E2312B515F114D38433B5DDB5E437F28CCBC419CE92F6605DDC543DAFEDDA29BD41AE1350B50CCAA949249E16D1C5C23A094102DCF7F28C5830B904E5280E025C8AB352FCDFC7CEA215E015F6C3DEBE91546799EADC2D990191C45B5055C8E7304116DAF8BBE53D9A595259160E5C10CFEBE9E2D521962CF5DC5BDFD3C04573996A24B4140AED3D63EF31D07E62D8E9596E401013F2ECC1897A56BE356BFA1D420EA5BDF5F7F4AEF3AD4C1DE0E05C70F14DEDBF95BE1E78B561B23E2203300D417AB7974ABD342F0A2106AD5F2F7B8BC5719A67CE9E2217293B4131CF97E38B0E1F26C34A40330A53C357207DCEDE20C6C4117D62249CE6BAAD6696929AA2B5D7D5C284B2D2DD0924C429494A8226D1C513CAD384B1D8DCAB2F149D2828034701D86B5F76BC64214A4A940512CE5F7B7BE9168692F674ED1B5938DD5D4E5AACBB2E708597D6EB654942B9941215B6FCE76C737CE7E25CBCB5E5E194E5CB70D8B01A5B52CDE71AB6BB74BF4BEFEDE3B33A5FD98B4069B525ED515BFC7AB7C0A61A525D61348A4C158F0A8A1C0B3D640E9D39DE3FE2666999CD2995355864A5DC825D6F4AD886FB36D19FF74A552D2EA0BB8D49EB4AEBA336BADF946F643A6A8D34993D150D22109E14A8D3B0A58E1020F196F8A6013BDF7E78A86638BC7E6734CD54E9F3261FEE0A98906C2C0B1D80A51AE6012E7B01F3569BB72BD76AF4110FCDF581A4595F12AA03F370EF7496639A532019E805ADD4E12C0E439962A60E34288243B80E4022E59EC7DDA35EE26B5016AB0DF7E5EEB158675AE6951C6B7B312DEE4B6A4A9503A711BDFF00327963A7E4DD90594A0CCC389967240A1D74AD58C024CCAB8507D2B5E75F75EA22A8CF3B4FA36520533E85405719EF00EBB898103974B7AF47CAFB21C20BCB4CB048E1000DE9B5D80B1F4895C0C86204CBBD5F9BB0A8A50783F952FA8BB5C5242F81EE217809503693D2763EF1B5B95D309D9BC0E1C0FD44C9680003F3149D8D8989944992194DC99AF5D79BDF9161B0A9332ED3B38CC1C4B7468AC599321961D7449DB88A52A03CA6FE7189299FFD9DCBC12B992262AFFDA1DBA56A75F5893952E4FEEE14B269A0BF2A75D8C7D9F702BA7CC7E78FCE947D488CD00899E7820856D7F4FBFF001C1046C7397BFF000C1046BC10472013B0C10473C0AE9F31F9E0820E0574F98FCF0410702BA7CC7E78208CD00899C1042D47DA1EFF00B8E082327397BFF0C10A4BD7C3EF1AF04291B1BE7EEFC70411B304118A93C51788C10463DDF9FCBF5C1041DDF9FCBF5C1041DDF9FCBF5C1046C4366F0472DEDD7D7046AA4F13559A33E03D47CFF2C11AF77CFD3F98E0A4A6262F820EEF9FA7F318E083BBE7E9FCC6494F14DE2309AE7095AD4DC0F4D21ACC404AB702C767F7AFD9E32EEFCFE5F1E78C27121542AB50F46E9E17AD59E25B0880407143F624F87500F231AD41485A63633263D63979F581BDF0A0636ABFE7F36F48972BEED2598003A7ADE9785E97611E000AA2C009933E847E5EA6CA0C3950709AF536F63DB457B1D980960B1B3EBBF386F5A1F2E7795280D2904965C2425206EB27607C89983B637460B12B9A897250541440A026B4B5FCCE962D103333EC1C94AE64F9A947007F995AEFE837E758ACFB40ED7B49691A171BCCEA9BA8AF4A141A085414AD22D3DD9BEC3A73DAF8ECBD90F86188CD97266AE5514439526D57B37516FE787F6DFE2F4ACB53364C99C0B710042BCA8EFE1D0DA3A0BAE3B6DD45ABAB3EACEBAE3792A4B818E05F0C2153CD30A3CAEA9F863D51D9AEC160B2097C62524CC64F1929D980615D49D2BE71E43ED576FB17DA099302672D94A2ECA25DDF9DEF67D0E800A32B5C72AAB0A299C5960A8A9C5A964913E2B9513CE79F2F71E852E6CA54B1282412DC219852C2D7A6F60E3568E61370B880B3396A528383577AF89E7C8E9631ADEAC697C34AC8EF9C62CB4F0F1294544110482607979F3C44E331ABCA5887F9AE1D83D7F353E71159809B882020171471F6E648FE1A90F794E98CD7365871491474A2EB2E04DD063FBA08B4D801E5D442CFCF7138C3F2950068384925CEED785B01297214935040AB8B9D6F5D2BCF689839FC0F48B45197AD0F5554A4FD6D44F180A6C0E1E10A2A09BCDD3E569384F0F87C4E26612B4A88A312E5FD0BF8FF009B14BC406093C9CB83D2BD7A00FE759EA5D6AEB895A50E2D2992084A8C46DB0F4E9EEE58B9E5D9271315203D2AD5FE437D5C447E2809BC4003A7B715A5EBE42F151D76A72E71F78A22E4824C13D46F3E71B62FF95648944B0A080E68430E6DCCFADDB946B8190CA20861A1AD7C3EFD4968AF739D40D10A2B50B4F43BDA79F5F527618B8607260E9FF6C1377200BF20DB7F889054A0EA6340CDEF5D76F48ACB3ACF95C214D3A4F0C9E0130A9DAFB88FBF6C5AF078144A07BC481D40A6CDE9FCD635EEF9F5F7D22AFCC750D45495A16CFD58DE17DE7113CAC89E76DA7D4C624E4E270F852429495736614E47CF7D768C940A72F50F5AF9FF0010DF94E5B9FEA5A85D0657435598D4A9494B290D3ADA254620BBC3C2396E4623F31EDC65D93389810A55C7CC01A07D3ABB3788A4615F29A51DDC69E1E71D89D1BEC9FA82B8B199EBDCF13A5E8950BFA806915E5D418F09534AE24CED3CA76C732CF7E2B4EC68523289267AD2E95242FBB67E65810078F2302502BC5F28350757A93E7B1FB476974DF673A0BB3EA7713A6B25A6E3AA091579A3C43EAAE5343C2A4B2F051A7E13C93C24C99C73AC463738CD27CC9B889D312EDC3872A5349767F9C11C4F7A337AC60D0326BC5767AB1D9E9515A316F25D5DA83EAC9296F81A481012D8091FF4881B4DA3D061C48C9674FF009A6ACAAF42E6B5D5C9B5691A457D9CEADA068076B1CE052788A1C924A6638A403723A6E3EE7533B2B389419128A8387603FCF9D0E97896CB90851F98F2B0D3EB5DAA75BC5459FF0069542942D34E7EBCB4880B528D3F099B58C4FCE0FCAF5D9EEC84C982599C8E12083548275F3A00C452912E2549092431B0E74DDDEC35B750D14966FDA5D6BAB5F7CA53886C92D36DAA4B53361C175CEC378F22631D7705D95C24940527BB42884F12C81F330E76620B9153EB194CA9003900DEBBD1CD6ED53B3B18AF2A738D47AB5E34795B55656E12800D33C94C9B7FC45242779B93077E589350CAB2F9759D282807532D0F4D83DED6DF9C60C99360D7200602E4120BD9A950D123C9FD9B35B66E876AF50E6E720A65F0AD912DD49A94AAEA94A17C4D948EA39FC6859BF6DE5CB5AA5E58B338CB2CBE1052CF600B17F0AE81AD08CFE0C30534BE252838214CDD40FC01436689851760DD9DE429073DCCD39B3C800AC28AD90A2093221640B08F39BDB1589B9B67999A80968C4278AAE0A983F26B7DBC223CE2A7AA8A24241B52A0D59FEBE1A38896D1661A0345B6B190645423BD003CE3AE36F13C164901E4A888E7004DE7961493D96CEF1E52A9B889E90AB92165B4AFF86E4E408C9C54D724120D2C6FE1FCEF4DFEA0B813D3E67F3C7C448FAE1182C01103AFE18208DAD7F4FBFF001C1046C7397BFF000C1046BC10428640215239E082377027A7CCFE782083813D3E67F3C1041C09E9F33F9E082315262201E73B9E98208DC8FB43DFF71C10464E72F7FE1821497AF87DE35E08523637CFDDF8E08236608236B6099813B7E38208DBC0AE9F31F9E0820E0574F98FCF0410702BA7CC7E78208D8DA0C99B5BC8FE3851129730128492DB03F88D4A929604B3C6EEEFCFE5FAE345A552DF8C14B5DC41C69DFC9CC25A84414C49B1E584BBD976E34BECF1B42683D0FC0E144FCEDC3F33D9A08554E82AE29062D68F774F31EBB74223333973D2C532D5CA86EDEBC879C68B0E40F60381E3F6850503991EFF00F7BF2E9D79623E4CD5A3F7862DF6D6EFAFD62530A81F2922ADA1DDCE87DDB48E52D852D28304AE403C86D79B6D7FCB161C02D33F85D8BB3695ABEBE239F284F30C64B9328954C4861A9D9E8CFA74DF94346A0AFA5D334CBADA8A86509402AE15BCDA4D8490125533F38B5B173C164F8AC424193214BD5922AE76A55EC06DE11C833FED56030CA5F162D0821E8A50B8EA59AECE63A7DDAA7B49A94CA32BCA4A53671B79D6D4991FDA640133E47CFCB1DFFE1A7C3A39924E231D87E0EED890A4DDFA8ADBC9AFA793FE2AFC5299972C4ACBA7F7DC45415DDAF98A509A57968DCBA35A8B3BABCEEB5CACABAB72A8B8A2AE052D5099E504991E57E533338EFF0085CBE4F673865CA94084B00C1B7B9FCB6E1A91C067E718CED0054CC44C5A42854124924EDB30ADC784343D5A5B6437629779003C3C3BDC093BFEF9CBC9C7FEB4F0A93C06C4BF938A0B50EA79561A0C18C19EF0AF8F5F5DB7F0B7431BB2E4399B1197E5ADBA9754614E702F8403170A2909023CFD30E4C993844F7EB9A193F31147DC51DCD7D0E85842C31699E44BE10D40FE62A49A0DEDE57B0E934E64BA5984D4E62B43998B838D282AE2248BC5A529B5A481327AE2BF982E6672BE1C3C95144B35531170C0B1E96D7A42F2B2EC3A4778B5A49502458B36F5EB7FA9AC3B52768350EB6AA44C5234994A3BB29320587D88378EBE7732712195F67A6383310470B1729DCFD69F5EB0C7152E4CBE208502DA8F1D411BFDC08A6B36D4F5544438FB8A750F71142F8A763264090396F13B73C745CB324C31212402B4B3B80F514A11B8DF588552D6E785CBEDD357BF4D6A6915F663AC12EF1092679C9F988B753691E918B2272A5CB712A5B8A51987D4FAC48E152B985969246BD01A7566AF9440338D4895C70AC08E2913173F03CCED2475C59F27C2290969D2CA53A72BBF27F06A5A251587080080D6E54B5BA69BB12358AD735CFD6A514A572A13B193F0DC9BEE2E4CF2C584CE918541AA52DA9A9D3D2FD5BC635280D40C7993E30DF9465DAC351542A9F22CA6A2A9C5A9295BEA429286428D882B4049045EC63E2315ECC33F91282809E974BEA97D4DABA680758D084E8AB339DC9D3A5347BF28ECD683F65862AFBACEFB42CDC30530E0A20DF15EC4A4A9A544C45C8B1BF2C72CCEFB6B880A29C0A3F505D414CAE1E1AD0824D79B7F319FF6FF00B884DD892F6D4B6FE3CA3B2D97A748E8DA6396699CA695A0A486DCAA5212A5BBC0212415A0A916BDBE3CB154387C7E7E1588C56257420A52C7E4D48A5FD9B184D402E882585E80BEDD05B6E7AC36D7E7294A56BA806F24153A4848BFF4931EE03D7AE24F07947E9871A0998A0C48E121D9AA6E796E1ACE29A2A5AD3423F1AD36DCD7EF15E57EA96E902FFCC15A144C24130D81E7263E3CB98179895350A5241C39045096626C0559A8DF4D69191C61C90EF67A5BD9D2FE71516A3ED0D0C970072499E704C728EBCADBC8907170CB24C89A9038784B8D59AAD5F3EA06D4318214A366F114F7E315557EA3CE73E525ACB32FAAADAA04F70C06DC4B6E1302EE9414245C1249B832671699589C065724F7A25ACAAA1D497A6C2F60458D61591395248649A967AEFB1A59FEF1BF2FEC875667EE7D735BAD3A532F242843ADD515A39C869414391B89BDFCD15F6F24C99331380C195CC450000A5EAD761CDFCE1CCCC54C0A294925243B87E47E94E74BC4E99D15D94E97434B08467EF23ED54ADD718EED49DFF96A242A6368F80C404EED57687325A532C4DC1A4B8E04A78DC1D8B53AD2E23518D50354F15033ED7F1DEB47109732ED674CE4CC9A4CADBA3A100708E1A7694A03942CA267DF208DE775A56498FCCD5DE4D9D384C2039254012756240E54E8F185636610DC2A67E9A860ECFEF9C53D9FF6C152D9E2A3CD9FFE7717136D32B7A609800241088BDA00DAD8B764DD98C065EF33319885BD7E7604355DC972FF0047E6CFB0AB188A4C3C2D4F9B5AF33EC88AFDACDF5CEB3ABFABE51936659938B5405A9A7E992A2A3FDCB404C5F798138B0CCCFF00B3D948225A641290593C4870DD1CE9A3DC0D61E1C3C915E201BC6E2EFA0E55040701E27B45ECDDDB3E7C84395D90AB2AA65805152ACCD9594A5512A2D1701300EC47E00D6F17F19329C29549C3E152560904014D6AECCDE7472212386921CF186D6D576BD5CEE2DA120C7D69E3E0F47D6C80807700FAE0820C10460B49511161CCFE9EE8C1046D423E1F7FEFF41E4410A020FF00E91E9F8608232EEFCFE5FAE08237349E124CCED8D16680737F2FF3030370F1BB0946186C3C840403B807D719722C488180B0020C62061B0F28C929E29BC4608CC65DDF9FCBF5C1041DDF9FCBF5C1041DDF9FCBF5C1042AA64F09573C1042AC104182304034306081850B5ADEFDB4189CCAB32C3E102C4E0090000E1FC8B7D9B9C6ABC14CC5074288E1B73D3EC7C6FCCC218F9F2F18E25D097B36B61B59F5E95B335C89987352FC2EE0DDAA0F27B6F4F28E201DC03EEC5715964FE22A0A535C162037E0FD358C271A38B8483521EAEFE0C2DF6D9A081D07C06257053460C8EF403C2A04BD2BA8AFDEFEB137879667B0142C2C3A8B5396DADB44EFBD50C42984CA3FF32C3DDC89B1BDBD0DB12788CD70F8C09969949530201A6F714F0BEBB46D8CC30C2A4AD6A6D6BAF83F3AFB7E02D971B554D43818424712CA884EDB8F1116B1BFAF2C2723B353735534A96A1C4400C1E87A0ABEBB522A599F6B30B964A513312E906EA03C6FE26FA333C541DA0F6D7A674BD306289E6DECC21C4852553C2A168316E9626FD48231D2FB31F09B3099325CD54B99C2483549EA2FE3F5611C1FB61F14E4290B44A9E051428B048F5F31E0F531E78F68FDAB679ACEB5E1555CEA69829412843A4002F000491E86DF3C7A7FB21D809597A658C4C80B147E2480777A820E94FE44791FB63DA2CCB369B37F4F8B98905DB8546E6A2C5BFC6E0353ED39F5BEF50E71252DC0EF56A51E2264CDC99F75F1D824A30B95202644B4CB7150960ED7B0D3CF9C735C160B1656A56653173C9248E304D39151D5C3728D0D507D62A52CD3B6BA92A500549E2013B740A1B99E7CFAE23F1D8F95381709D6A6A75A134AD1AF577D8C4BA42650F91013C3FDB667D1FF001A88B432BD0D49414EACC3397D219090B0C2889E662C67CCD8F96F8AE9C61133BB9293C4AA822C9BD7C5DE9D21B6214A52439A0D1C543F3F4FE6AC79CEB3628D2BA4D28869829052A584A7888F252D3C5C8DEF688C4AE1302AC510AC5A9534E8092914E42F4A795223A62969712FE471A6A75D68DECC55199EA1A9796A5D538B150A278C95920ABFD227840B1FB3BF9E2F794E12522584942526C01001A35CEB4A353684D336711C2165B9DA8F4A07D5EF468AFB36CE5B85294E78AFCCC73EA6D6DCF962DD84C12569E14A472200A5431D3CFC7946122613572FA93720DEFA3914E422B1CEF3F70777DDD484B7E20E34471F780EC02BFA63A889D8733896C3E4F3259E304EE4B353C1CEBCE8FA448C8420BF100C3EC06FF715D62B1CD756B6959629E9781D5482B0E05993009E1F9E2C3231185C394F7E525290DC2435854BDB6F06A8B44B495CB9690C90EEEFA6BC8F2F58D794E88D73AE1E0C64740FBA0901EA93FCB45325C363E20028104CC6F1104E18675DB3C0602504E1D32C5083F30736F122D63CB91DE74F49D406B6B4F2DFD3A34766344FB30E4FA74379BEBFCED35B54385C145DD9042B7E096D445AD7237B75C726CDFB7B89C428A70B2C94A9C779C4C13CC03CFA7943454C4B925437602FE1717BEADCC98BF69DEA1A1A3728B4BE594F454CD25282F169A2B7922C93C4B4858889306E0ED338A82B133F19342E74F54C5BBA6A5210ECEE01634D08A784325CC592529A03D2B7F2D7EDCD9BF88D6D1F7AE57B854923ECF140883CA63FF6FC394E60F2B13C0E22492000C08776D75A7F8864B953947F716B9DDD8B337ABC40F35D4F4AA538A6DA085A64874AF842226E12A0019F5F518B5E132B97804242A604A1603A08A9AD43E9734F2890CBD1C0FC4E4D402742F5DF76F74A8339D7CC07974AE55BB5EE9202596DB5C09361C4806D31CEF1BE2CB839397280485A11C41CBA85FA13E5B3BECF28426EA0EDCDBD61137936AFD4AA6DBCBDB5E5197BD77EADCE17613C8842E15617107CB6C2B8B19561105969993B4484D49D03D58D817D34A46532788B80C3572C3D6BEBA7521DA97B3AD1F912BBED539BA351D427C61B334812B17E1250A20DEC6D163EB8ADCEC563D5296AC3619724A8FF00B6A0EA7008AF0B6BEBBC6552D095014551EFF7F5D59E8766FCE3B60A3D2FFE4720A0A4CB29D00A1A6B818A85D504F475482B411D4193898ECEF67CE7EBEF33698A42E5D415CC32C3171FB78922C36D9EA63454C42414801376D58F53CCF872678A633BED3B51EAAA834D4B479834F38A29406987DD696546DE24365B4836332201F762D98BCAF26C9C30C44998A483AA43EE1DEBB35FA930DCCC4A9D400246BB8B73B7873BC3B651D8F76C1A8D21CA8C8D54744F416EB975CD71F02B752A9F8829300FD95004F316B56E776E72FC14E54A46150B5208621373D598BB7A8DA324CB090428125C10D6F4B45A593FB2665A809ACD59AB0D42800A732F148B49EA51DF2147E37E4646D86B33E2662F8BBBC2E583855699C403529429B83A75148C254805D469A5363416B1D06FE962651D96F64BA5160D268D6EB2AA53354ED738A0B52765774E7104ED31104F2DB15BCCB36ED0668A4CC9B982D085391282384240AB3A59F6DEDE08E2B1219A586291A7D37A6F5F48B21AD48E65F4FF0057CBF2ACBF2BA303847053D22D684C58F106F8C9F7C8F9E20D7964CC44DEF67CD9AB59673C6A00B07FDBC5F4E9710C3F578866EF0B1DEBF588F3B9BAEBD6E29AAF5BCB0417525469D289D8004A527A1816F7E2464E5F2C30984166009009EA4FE5F78D3F513BFE6AF323E847E23DECC7C878FB35060820C104668483337DA3DF82085A845801CB73CBF7C86082378481B608239C104184E669E3F6820C27041820830410A69D20F1126361820855C23FBC7CBF3C10473C00ECA9F77EB82083BBF3F97EB8208C8009993BFBBAF9E0823991D47C46082091D47C46082091D47C46082091D47C4621F3113411DD922EED57D4F93B1D59E257018A972814AD9C8A39A16E5E2FB738CA0F43F0C38CBB106510269AD1C973776A73FC6B1A62A4271615DD01E06FE3CBDE91C7BBDFD316B463642D2CC38D8598EDA7DBFCC404DCA57294555046B5372FBF5B0E8638E24FF70F88C4762B013B141465A4925D9ABE81B4E9CA91B0CE64659F2CC58043072469BDDEDF7860CF3525269EA735D52F30186D2A53895BADA490279150240E606DCE3161EC8762B1D986251C52E61054E070A886B9FED6E9BD6AF143EDAFC44C24890C99C80A092C428072CE351D2BA79C7457B62F68A73375BF95E9474B4471216A6CDBA13361E97F4C7ABFB11F0F4618CA3889628C4BA7EFE75B08F2176EBE22CD9C26093394CCA145EEED626FBEBAD1E3A69996779ED6BEAFAC3EED43EF9256788A8B7B9BDCC4836F98C7A432BCAB2EC248484CB40EEC072120396AE9A757D3568F32667DA6C762B107FDC591C45AA58392E0BEACDD3D21BDA7F2FA154E64EA9550B8E1404A892A2622124F5DA06E3918C298DC44B961E5A512D20162C34B52F5229C9DF789EC8B13DF9499EA249209E2BF874ADABA6C048B2DD2F9FEA073EB4D27EAB9332429D5B812DF78DAAE3842A167C3BC4C03E726978FCC53326A65713A96EC12EAAA7FE4D673BB06B4587384C94CB49941367A36DECF5058D584E4E69A774A52F7394B68AAAD4A48754A9B2E3C5754F3FED36E62C30D6565F89C428F1A1610A6F95DDC3BBD2941E9D62AEB584D8F12AA09EBE60536FBC5699F6B673325254E3CA6FBAE2E2A70484906C048201B7FB5F169C0F67E61E17430A3121CDDB930AEA5C4205D4E4D46BC87BFCC54B9BE785D5A8B07EAEA932A9DFCC93113D245A7173C0F67C84A68C056C1D8F205B91F1A3C375CB7341A50FD8F5FBF5884E699FD5AD0DA1C8847142D2A04AA44CF86E23CF9F5C4A4DCA972787802985E9D35FF00378564C906F53A8A55AA3969BEFAD4D659C678E1529216A2ABF824924DF95C99F4F332379DCBA6A70AC66D367274B97366AF9738597213AB31140DB7F25FF10D195E9FD4BABDF5D365740FBAB94A0BAA4A9086B8F9A4A841041E46DE5CA4719DA5C1E1E51056805B7AF956A29467A79EAC6C68123414E5B54DBC394762344FB346459625BCDF5D66A0D4D9C6E93BA2AF172492DA88DE05E773D231CA33DED5E23133169C04854E9609E29817C3C2E59D8D09D4FD890C999852FC4A22EC2A6DF96FA0D62F7A3CCDBD2ED2F2DC9B2F62832F74043354036B5D4A50224829E3470EC66F27E15F91819B9B28CEC4297C52AA904A83137700D40E6E28C1A1133D75483C40B798DBCFEAD0C55F56D289A9A86D554E93214A754900998F0CC45EDC8C46155640FF003214E454802C006BD3ED194951503A9B87DBA52C1E83A8311C5EA4038C38FF007684CF7680809088E448DFCC9E7F0C208CB664999549D1F7A727F7D21E4A4BA8248626C5BCDBD9FCD51A8F54E7755589A5CB10E3E952A09424A80E57201DBA74F2C59F018D561E850CCC03FAD4DDFAB3D2241186E3B5199EFF009630A5DD179B6694F49519C560A1A532A711092A701024182088DB6C6732C562B31E197870A2514570DAAC45474EB5368274AEE1228C2C74D9B5356731B54AECFF0046B25CA6A0A7CCAB523894F2AA01525606E1B5151372791B817DC8C60B2AC62B87BD9CB96C352479D5F416DF9C240BFA1FC7F9EB102CFBB58CD7345A32AD314350F553C4A1BA56A95C4366E213DFF77C207424C74C58F0F829186509B3B16898A4B9659156DAA4D033DFC2360A2011E5CAAFEB1865BD8BF6A5AD9095EA0617A5D959E21506A5BA92A49933C09585260728BF2DCE1EA7B6B96E01250252710B45199813B71330E77E718D9CD0D5EFE3EEBCA27D967601D9E64C108D639B1D4158C90695052ED3C2EC5CBA150676932003D23142ED776CF34CD8A1394E19783624284924B8A307481CCD183F388FC6CC52280EC47E3C770FE348B8B2BA8D3DA5E9114BA7A86872EA74240495D3B358E2D226DC6E214B13EB23AD862B3864E6D8F081994C9F420875AC1AB12E1D8EF0C0629490C1C13D48600D395EFE50D953AA1AA8716AA665D65D905D79BE3E07093E129680E04C5AC1201993CA2E385461658509D350B0C004A800400198A8B957992D7D635FD612096AEAE5FD1B5ADBC5F44C9ACCEF30584B4A79D4AA3C3DCA933B40E22981EFDFE58D978FCB70C4944B4A9B6200240F07AF2FA467F52B7DFADB56E5D474D6B0A7FC2B9FD514ACE524857DA75750968A3A10851133CEDEFDCE23E767F2E6B2508091A1150DE1D18EEDABC67BC330D284D087BDBD34BF2EAE6D7672E389E3ACCDD3978DD48E10F01CB70A8F94EF86ABCDE6A52552D0A98480750F566D9C0DBC63520BDED42297F7EF7D4F68BD23430735CF3F882893DDA50CAE9F808FB576D438F8AD726D1206114E79892549549286622AFE83C7762488D8D855C540B0FBBFE0347B95C0AE9F31F9E3E55C7D9E8DADA0999B7CFF007FA608236F77E7F2FD70411B5A401337DB718208DF8208304106082324A78A6F1184E669E3F68232EEFCFE5FAE138236B68179BFCBF7FBE98208DBC09E9F33F9E0820E04F4F99FCF04107027A7CCFE78208514E002A8168C1042AC10425A80094C8B4608213F027A7CCFE782083813D3E67F3C1041C09E9F33F9E082324D10A93C72AFE544004DE76B741F8E1DC8C3A2783C407537A3B01BF37F37B44E3953D2B4997C4CE6D6DF4FA6BAEF0E0DB8FA07748488800C807CBA44F337DCF28388DC6E0D6853490E09A84835666A8EB7F1312F97E3C480F38B505C80E3CED4FBED1A5F7174692BA9521B61CE2EF14A2910123DDB091B73C3DCA329C5E226A3E4590486A12CE45A9CC72DF410CB3EED66070D87983BC9614124FEE48D0D3AF2AEB1D79ED47B63D37A5E9DE672DA943B570A078566CAE7CC8933CB6F863D15D8EEC1CCC70477D289A24D52FB568C18EBE2D5AC794BB6FF00113B954D32A707054C12A1CE9473F8B3D5CF40F5FF006A59CEAD71A43952F21849761A4BAA48712ADA4248DB9C83E5CC63D43D90EC4607289056A909E32126A914A54543F3B9A3758F2DF6A3B7D8CC7CD5253354415100859347B383E914C54BB534C4AD973BA0ABAB888515493375C1BDFCFDF8B96225C8C24AE3949482DA5096D8E8CDF6778A32F173F1A499855F31AB9A52BEFABD617646D56E64EB8D6574CB0FACA454542C1291FDAA01620082660F493D2A58CCFE6A55C090404D1C3D2E6A35FCDE3072897FBEE4B3E9FE2BD356DA2C8634C69DC890330D50E22A6B40E36C724AA398448F2BF2DCE231798633174758E226B52C05F4DB4FA464BE098A0971564914277F53E8F0C59FEB9398A1BA7A750632FA4E24D321B86CA81B10AE182AE51C409BF217C5A3B3B94A5466CF5CA2A9931B88A9D56B33D07A56F183984DC480164B25E8F67ABEF563D68DB1AA735CE91255C769EBF39264FDE791B63A160F2C007EC0E7968CE0FD3A728DD0AA9737667F7FE62BACE738010568584AC025299BABCA79C5FF002B62D183C081F2292C926AA6019B5E74F585C70A5882F77BD7F0DCEF155E67AA9F5AD6DBAB0CA45B912AE5B8BCDF95F9C6D13D25183C3B1510784B5D859DDBFC7842C9009259C8BDDCD051FCA18E91CD439E3E32FC832EA875D78F0AEA8A565082A220C389200BC83378DF0962F1F824216A98B425206A5209A56848B51D88D2F028F7601259DC74D7D6DEDE2FCD11ECFAE53A919CEBCA80F03C2EA59B022D37EECFA4D8F4C730CDFB49266AD72F2F52A628062405009BDBADBD7A616B143B8717AFA534A55BCE2FC6ABB4F644C228B4FD3329425212B525B485022C2545215E867EEC50B158DC5CF980ACA96A7F94D58576B12DCAF7686EFCEFE2FEF7861CCF3543AA2E3CBB7424C08E8240B7E96B9C4E65B2573B87BC04715E8C0ED41BF87E74324AEA5C9DDAF6D010F119AACEA9DE6D4A4284B1C50A5287849E8933EB6D8E2C404BC0002628049BA451C6CF7FE29BC09C3D406A93434661CF42DE3D4DE0EFE7199660FA9965E5D409212DA5B2916FF58106C2E6479CD8617958EC19708940391FDCEFCFD61C264A87EEAFDEFAE9E75BF5C93A7731AE5A6A334CC5BCAE8A98F12E957C0A35C954784AF88291C3039DE71B4E5CB5292997244C2B70482DC1B1E6CEFCEE6B0FA4C804B936A8D3952BEE94DDBF34ED0720D3ABFE17A572952F3357F2CBCDA1CAB0B7088064B6B489DCF8A3AC61EE1BB3FDE052F198A4774AAA65964B001C7CC0825835361489044C9690C181F37E5B5ED6DEC68DAAD2DDB06B30CD4552065F973D252FA9DA76E1B277EE8A924100DEC3D37C6ABCE72AC8A62E4E19231539D94C951029AA8022AFCAC39435C62CA920B7D093BFA379D21FF2DEC4BB3EC9168ADD539DBD9A6683C4AA64A2A0202FA12DA94D913D3CC6D1883C7F693178D98512B07DCA1569BC605D8FED6069615F2AC4705A48E251A8FEDF6DBBFA74B0A92BF2CC98219C972E672E60C065D1469AB71F8B4951694B6A37B91336E711189C0AE7A92A56348A12471D89157655486FBF4D04D2096B1B0A7E35F4E70F02B7516663FCBA1755C768314DE83C5C200E5B5B0D8C99787078E626601A8AD87224B7BE507784D002454F3DFF003BF28C17A1AB73458733C6DBCAD283FC950A843EA7A7ED4F0A8F0F0C73DEFE987D82ED0C8C220A25484CD5D944A4023A15276FA0A6B0CB1838882B0C3A8377D06FEE90E4D68BD2796A439559877CA489293C66E04DA146DE5E76F2D3119C62B1CAE14E15287A382353CBEBA4302DA17FF34F4BC64ACCB4750A0F754A97DC16061420898DD379E968DEDB61AFFA4637145C2D487B3F3BD29D5C884F84EA3886E28DB0D2FA0B08677B5CE60CA94DE5342DA132027F968317371C49E912461D48ECC82927118863A82E3D5F71EED19083606BA52D4EA012DBFDE1BEB351EA0CC0215983A5A0890D25B084833733C040F59F779CBE0F24C14A1FEDAC4C7A17D1BA9B97BBC38972D44BD9B9FE3DB8863A8CCEBCC8352E0106D0AE9E768BCFBFCB121FE8D216DF28045ED47FF1FC428401AB9E43DFB6D21ADD715557AA754BE01E13711CCEC47C67AE355E4320B1041BD185BEF6B51E8CD180CC5CF41CE3E827813D3E67F3C7C7F8FB3F1B5B481303A608236E0820C104182083041060821553278B88CC6C36C27334F18215777E7F2FD709C119A1004CA80F5FF7FDDB0411B3847F78F97E782083847F78F97E782083847F78F97E78208CD20098333FBEBE78208CB04118A93C51788C64249720381730463DDF9FCBF5C6AE096D76F7D63608529983BDBFC5E0EEFCFE5FAE1512A61B24F913F40605A4CBAAC30DFF003B41DDF9FCBF5C2334F73599F28DCD3C77AFE37AA299A859E14972341527C89B7B78534C9525445E1504988100733FBB4DF082317316B12F0A0CD0A2C420D9DB40E75AE96A562630F2F2E97256BC7CF97228E9EF080E79390FE1C9B788CEB0D5F41A5A8DCA875E6429092A20BA806403C8999DB91E5B418E89D9DECF63332988E3C32CB91562589E4CD476BB53998E3BDB7ED465D97226FE93192D7C214DC2A1663B135DEC6F56AC744BB53F698A9CC94D65794ACA427BE6DD5A0C8BC817FBAF8F48F64FE1AF109532661D8FCAAA81D59CED4D0D5F58F1AF6D3E27634CD992E54E5A9CA83824867A7D7C868D1D42CEF3E5D73CED4D7D4ADE75C5710495120711FF00EA039FE938F42E47D9A9397CB4012C7CA120BA59B9D458372B470CCC3B498DCCE61E352C827576AEEEDEDF788655B952E3EC968294F2CFF9742415711D8F144C0DBED45FE387B9D66E9CA6584259D42A686DE9BDB9C37C265E9C5152E62C39AD7C4EA77BE8D13BC974066F99A5198EA17052D23403810A521329F301493CB68B4CC75AB4CCE958B484A428A967E54D58BDDEE282F5E5D1E9C2A247ED62CDE8DCFF0005DF61128CC7566579553232BD38C349718053595090388923C264893CEE955BEF7182C82762662A6E25C216C509290C96B8A0A9DDC437562D95C201A5E8E7E87E8DA3EF54671A8D0B5A8D73E5F52893E2511C27DE6F1D7A7CEE380ECC4B29042028581671CF47D0F23D2009FD439340AB3F8374A6BB5B940B31CD5A4C2997070AE7C01511E9E5EE1B7A62DB97E59FA67404301C3A0F32E1FC7A50886B3F08B92C5150A3A07F56B6CCFAC40335CD9C4F100BF326401E46F1E9EA316294844A0EA4B3022A2D6FB7D6D1ACB1301AA4802D47AEBA6AE7ECD15DE69995556D4D35252A1E7AB5F2A4B01A6DC713C52012B294A929DC594403060E1862F389387491DE253BD406141B8A8D39DA1E4B06A542B4BFE2C0DADE9170E89EC0F36CD4359BEB157D5E96CE21B252494EF10D906E2D713F7628D8EED580B992A44C2B58B241372E3F75A8EFE778792F800F98F08AB9D69EFDBC76068FF80E9160506459730E180976A6101482810140AD24C9BCC751B462A1986698EC54D96662662D21D9292A003E8598173BDBCE23F30C414B7764177AD2FBD34FAC26A9CF5B7C2D352F29D4A859B014902DD45AC23F1B4E2532F94BC40654AEEF89AF5D28E5A97FB8BBC45A264D591C454403CF9EFCFEED588CB953474A8A87DA4C950920927840BFA83B7BB6DE313B23279666A42D21DEAED762E5C359ADF4899C3A09038B6A6FB721AEDE01A206E664FE6D59F56678F854A8309200927E7D24DBC8624274AC3E15C24A681C00DD69B695F21BCACA93C4C4DB6D9BA69FE3687E7B45505232D57E6F9A8A765292B5309256B77994F0A145423CC7A6F3881C662138C981082FC27E773C2C0D475B579B43A4E1A5862A2036FA9F37A368DBEF0C6BCCF35AD7865BD9FE9E5BC80425CAF765B027FAC77E913CF63CBD063051230C92A54E48091F33548A5A85FF008B18D4A253965060ECCE4539BFD4D1D8C3E9ECB9FAE432FEB5D48595BD25596328E22B3B9471D3AFC3130277D84E1A2FB45DD14FE9C7788018AE8967A588721F97F0D2694A49F99B60E45AF725DABB7D227FA6B4BE41A711DCE95C9425FB7F99A86CD471AAFE206A10AE199EB691888C6F69A64D2518A52E6CA49F965A54A9652F70E92FCC68F4869FA9E0A8FDC054DC17BDDFD37D61FABB4AE7B5EB69DCFB8282957C45A79B7D0070FF0051EE5A5262DFD247BA766927B6B2706152E4600AC1038B89D45BFF005281347F5EB0DE6624CD62A2F7602D7E839B7918E5BCB343E46DC9CE0668F0FB4C2E9D6140F3016AE2927A8E7EB25A623B513F18B213853281B10FAEE3847913A7584DD2F715E7AD21BC6ADC9E914E0C972B69852A05429C21D0E47D8E10EA484D85F86DBF4C2F84918AC6AC199314800B8BD1FA5E9BB585E91B8243B6B786AACD4EF541934AA120CF7083EEFF00869171CE2F8BA60B2247085CC9E8593A294000D615569FE37813C27FBB6D3DF99D8B88630F66398929A3A6AC2763C61F0049B01C6047BA67D7066392E1528044D948D7852A492B6E8AD07F26129F2EC01E2B3062C0BDEC3C284F58DECE8AD61527BD6E914B46F0E3C94C4DAFC4479741F2C44CACC70B97100AB8DA8C0120FE29CC4371289B1DBDFE37E50E88ECD757558E34D332D773757154D39E29E775CD874E91B61E1ED8E1A538EE540A87CB425F42580A78D77D633DD172C41B569FC736BD4B73854741EA36C774A0CB6A00ECE30AEBD0C0F7DFDE30D2767A8C602CA992C1D4254E1EAD40F5DFA467B956FE405FCFDEF18D3F673AA9EE33C54EFF0040AA8A747044EC14ABCF2E9F2C311DA03972BE554C98146DC0A16EA0EA5DDAD6DE3432D40396E61C13CADE31ADEECC756C1229E98EE20D5D34DBCB8E3A6DD646D7792FB6CE2A8586A97496AEE18743E71A80F6FA81F5863ACECF33DA28557B494850F0065C43C6DBCF764C6DCC5F962630DDB01378B8525811C44B8EB7B5EDE87508502035DF51A728F7531F24E3ECFC6C6F9FBBF1C1046CC1046494F14DE2304119777E7F2FD70411B5B40BCDFE5FBFDF4C1046DE04F4F99FCF0410A69C01C51E5F39FCB04288D7C214E085235B9CBDFF008608C100DC03D635E08186C3C8472013B0C1030D87908E7815D3E63F3C1030D87908D8DA157B74E63CF040C058011B3815D3E63F3C10307076B78C668044C8FDFEFF0076C6C2614B2407E2A01D2BEEDB3C359FC5C40006A6F4D05DBC2F5BB346785D385A778A21EF7E9A13A7D99A24E44B44897DE2CF152C6F4366A90DE16AC1C2AE12A4C42374F320D847A794EC6D8D6667327040A182D5616D5DC59CE9EA219CD98BC61328A4A454055A9AF8FA3D1AE212BAB65B6D550B712D21B054A2B206DBEF122DB7218CA32FC57699918696A495020F00DDDADF8262B79AAF0DD9D44CC5CDC5051038F8491FDB56A9B5361E4E2284ED37B7CCA34C5322872F79B72B569752A29503E24881C88E7D7A5F1DAFE1A7C1CC561CF7F8C42A677842871A0B5CEF414F3178F297C56F8BB88CD8FE972F9C70DDC128265AC8E236FED22ED53D4F21E74EBFED6732D575AEA33079F4B4E2D413C2EAC24024C084900F291BEF8F567677B1785C0703E193403FB6D4D4355F937DE3CEF8CED26678B2A13B17326715C9528D198EBEF6D62A879229525C2BE2454DD3C4789422E7724CDFD79C6F8EA38746130E84A1084CB54B152183BDBEBAF9B522BB89526629D63BC7724AAAE75F07EB42F7B99664398E67529552214585195A9426C62FE2DA2F61CBCED8431D9BA2524A1243B338D7C00BD9CD8BF488C561D0E78500381E0C5E963EA4DA2DCA4CA74F69BA32FD429B5E6CE241610BBF8C0B813206FEE33EFE7B99CCC466B8860925292DC4347EBD3F11A80A940949290A34BD750EEDE8FB8AB18AFF0039D4F9AD71719CD5459A3121AE05048206D6410761F9626F26CB1485238D1C5C2DA37D07DD8B6D7D54B529DCBBFF0098AD6A3306D0A78D2BDC2DA2EA59333EB26E3DF7E5E7D37098796108050EEC0066AF27B0FBEF184A52028ECCE2BE15F637DC57F9967F975538B69F05D7A4C2C15244DEE427A799F5107162C2C9320278260969B94B03CDF88DB9D7F11BF100CC1D85DDBAE95DE20D9AE6C9A3E04345556F5448A6691C454D907621326E0F38F888C482F1B85920AA64C4A5491F35871B3B16D0D05BEF0EA414AA93038A54BB0A6C74F3076898689EC7F5BEB379198662E9CBF29242D69742012DF41C5C2A88E979337E543CEBB628904C994388A9C24A6AFB59FD5857A8859425004200E26673D76FA3116F18EC9E53A6744E8869C672A6587B30E148AE79C4F7AA2B47D828EF02B809BC94113EB8A5946619C4C98B98552D0B6E1AD3CC1F4FE59152411F2B12474AECE35E7EC21CCB54B8E9534D921A1221321201E8040F2DAFD2F187527B30A92F38CD2B53394B17D2BBBC47AA5CD24A9C9074B54F4A5BA6E6230E6614892A52DE879C32DB241FE6904C82B261113CFCF98C4B610253FECAA504B515314038E6C4574FE630241511C639EF7DEBE875E5766AACD2ABBC08711F524A8C02DA7EB5C5B6E5B0787DE47BB94903849201252B53514070D7C286B6E8FCCA889291FDAC5C31A13AF5F752F1B5BA3754D97EADF729694C71250C29F5D6CEC0A100AD920F2816E5D62F1799F00A2824070EFE55EB4AD4F8C3A4100304D5B7BFB7261D6974C67999B61DC932D4E9BCBC5D79DAD48A979C4F350A273F9A9BC8E1099FC2B589CD0AE67019C78D40F0B3905AB734AB0D6B7D62465CE64BB0005FC6CFA9DE9D00892E4FA1320749152E556A7CDC91DD553A8A8A1692B06F2D2C06A395C006E7D21A662679F9C4C082788F0F10268FA82F56AB55F90A35C5CD247CA4B52A2D714B7B689F2321ACC9A9C9CE730A6CA68801C148C32C3EE2D16F0778C8E3498804933798C3246266E20A97294B98A059414E90347A96363E50C8CC58001554BF51E2E6EDD3C6191FCC743658A2FAF2071E7D5766B5558F2FBE527ED1EE1455C107900266061412316B981427F0CBB997C03415F17A6BE75867366926A493B1A37D6BE5D06ADAE76859DD52CD2E474EE32C1F0A51F538001DA5C53408B79F9CE1C7E8A42D7C5318AE80FCC2E07FC41EB7DED0D56B58D68795AD478C469BD61A865EA97954284DCB86A12B94A8CCF76560A607288EBC861F4A380C229A64A0A245B878812D6259BEFB5A149014A075B6B56D287EBF57785AD681A3A24F7B996A843AB172C7D5D33E63882C9E5D27A635FD58529A5E5E9087A2DC55F56E17047DC690B306BD7663F58D4F37A3E9212FE567315A6036EA5F71A8237242779E876BF5BE674DC4BBC8986504B12909041A6ED46B0F3E990A2976D7F98DADEA6CA6800FE1F9421881E12A577845EFF6C198C20BC562D48E05AE62C30B122BEAD56661F88C0252EC5ADB69E11B5DED033152404229DB4806006184904ED278413EFDADCF19C26055885BB4D26E5E62C8A6C0F8EF734A46C662CB39B72F7688C663ABF50D5CF7550100FF006F0276EB045C0E87160C3652400E8A0DEA7CEFCADAD76844A1C92F53CBD2F11A39FE76C294AABA97561CFB1C2E28011B93C26FE73EEC4B48CA9142A969F14026FD2C7E96178C701B7153DB307AC267351D6F279E33BAB8D667DE5437F8FBB133232E9691492936B20680727209F08CF07FDC7FC5B5EBE7E6DD51A96BC1003EFA45FECBAE0DEF78541D8753E98CE232993359E4A054D4A053500B03BD396D0DE70502DC47A837B6A0BFAEDA426FF1357EDF58A983FF00EB391FFF00DE18AB2295A4A4D1EC903EC5E1100837BB6F7D353E821C6875A673421C55357A9A0A8E34BC03DC7D000E93C31B1E1DFDD76537B3C95824CBE1356091C3BECC096F5F187D2DC3B726A3FBFAD63DF2C7C938FB371B1B04CC09DBF1C1046D83D0FC0E08214D3A24AA645872C1042AEEFCFE5FAE08233420099501EBFEFF00BB608236708FEF1F2FCF04119A4013041DBF1F3C10A4BD7C3EF19608523058262013BFE18208D707A1F81C1046E6904CCDB6DC608236F77E7F2FD70411B9A6F7B13B6C0FE1FBBE0823670A7A7CCFE782063B462B4C0040317F4E5CF12783C3226254A590E03B1D99CF4FBEF1B15A1287203D6A5B7E77E5E20F2D720EC715ACD7309D2667732C1370C1EA3766353CADBECC82D7C454B244B7724D9AE69AB72F1A3430E7B9CB792532B3075F69BA7610A53C95BA8471003601441277DA7A461FF66BB298EED06253C4898CA5025D24DC87D85B67B58C577B53DB7CAB20C24C509F2FBCE134E201884F22EDCEEDE31D13ED87DA357982DFCA74D3DC05054DAD4DAE4133133B6F3CCF3DB6C7B47E1C7C2C465E9933A7CB0AA24974D281ECDD5B6F28F10F6FBE2F62F37C54CC34998A12F8949052A2C41A587837956E7A559EEA3ACAF792F56BCE3B56A52D49F1120124F99178DBEF818F5065B94C8C3CB0992896942000484A68E3C398AFD8C70DCD312A528CF99338D4BA91B390F7353CB7F186A6AAA9EA15C35C897366C4493681B0FD70AE33BBC2A7E42900BD38478DF9FBDA253882A62E41A3EADCDC8736DFF1129C934557672B5D5BEB0CE5F49C2A6C3D08E34AA09E1E382A8E71276C52F1D9BA04D1292BF9A61200487A8A55AC5FA5BA43D94492EC40D79FDA9A743D224798EA7CB74ED31A1CB5082F2014A9420C9D89BFCAF78E57C272F018AC5BAC9514962915A0EAEEC40D7587899695330E44F9F9D5F97845319CEA4556540AA75D5F7CC9596D209892798109DA3E4479DBF22ECED38E6A6FA9FE7CBAF9C32C64A0804B8A55F7045075DFAF3222199A6A4AECCC776FA825B48804285E0C72BFEFAE2DB2B289723F6A40DEC29EC57C623A2135D9A06F853DF453890F80A92676100C9B9E585D4A124306A74FBF88A6D56104194E99CE75555213A6A996BA752A1E75C050009BDD71B78B9D8FA623F179BCBC3A0AA6CC609D4338D2C1DFEF4BC0C5DB972F4F0EAFA6AFD83D3DD96699D28DA731CE386B33480B534A0A506D62E76E24804FEED8E6FDA1CEF1989983F4A261924B05071C41C034D81E84D2052CCAB1A9049E5F987FCE353D45731F51CBD69CBD840E1086C253316004705F6DFAF5DE4B26C14B992C623128E298402AE22FA9D0F3E8EC291A4B9CB5900A80E47ADDEFABBF5D6B1057DAAD4142DD54C932E158973E26F1D3D39E2E127F4E10AEE40240B04D88FCF94498410905B47B83F48E5450F2785082A7369402A9923A0373F0BFBF090C5094B69DF225E8E740357341BDBA438952C077B6A3917B03F7685997E83CCB3B2B742D6865882E305B23BD0AD8070C14111CB103DA1CDB0D2912CC85A4294E15C2DE16D0DFA878526619203A6E0BD7C373FCDA2C3C9B485365E90DA1B144BB0571A7EB7C645CDD5C404F381CF7B038A87FACAA624852DC0DEFE8DCF4A8686531205856E096F13A0B023A72894B191A288AAA29D4CE5F605ECC9D4B6E848022452AFC37E612075386989C699E82953AC2AC904A49634750723EF6A3420B5F097E26167BB72A36BB7ABBC20ADCF322A074394F5DFC57334EF56DB2A65A4A87FF00D327F967680784C917C212D6A5A12E8EED350A415711FF00C9891E6618AF1252A3F3120D8F3E81F5BBD8D7AB4BFA8B5B67A453E4C94D2251E1A851A569B35A954F004A948496F807349133279E159587C3021641F92A3E6248772410E7D6DE91B4AC42E6FCA4BBD09B7986B071E7CE1C29346D406CD5EA6CC4E5CB2389414B35416664C2428813BC45B688C2E7109207E8E477CB7A86EED88717342D537F285CA080E4814EACE396AE6A368E10CE8FA55ADC34E3367198EEEA0A96D06CC5CF74652A98DA396FB61E0C3E2A709678BF4C43F12182C2B6E41BD2EE690CA6AAB51C6FB16B015BFBD21054F6888649A4A26996DAFB01B14CDF108E5DE16C1B0E7EFC38465120A84C582B9A2A5414A0FCDB88016FCDC43798B2C00A0AD3F9F1FBDDC98FD7E7AEB890B4B8AA253A09E14ACB9F58E920186E04F4EBCED33232E4CCE10A008A5581296A8EA793F28CC87AB12051F9EE39535F2D621B54F55AD7DE2E8DC75333DF7D6942DC8844CFBA3711CF1228CAF0FC410141E8FF002B5090FE7CE1CC694661510A4D354164A7EDA548E38E6002ADBA6F187A32492082A4A549558BD4EFF7ABDC068C804D8437D4E635C8E22B7839E7C294CFC36FDF538712F21C22D8AC01BFCA0D43B506DEAD625A33C2ADBD47E79C34AEB1FA8214E2CB6048179E299F75FA1F5DF1212B27C361FF00E90E27B800A6A7ADEA6FE42321075207AC6835A968FF00F33B5A26D7F203F7BE1F232F4B8694F4FE6FAE8EF4D2F19EEF9FA7F31A9CCE5B48852FBCE9CF879EF73FB89C3B46014689484B3D680927AB7BDF4C141D0BF266FBC373B9E20589BF9188F4117F3C3A4E015A3807C7E8FF00568D82030715D6BF83086A73C64F0F2DF73F98E71F2F3C64E14CA7E21C43A1F03A73F386F3D0281BA1FA7DE879C26FE36D7EFF00DB1B230E85D801BD0D3D457942299628D53F4E7B7D7CE1155E6297D4DAC37C696E4ABC653131161138728C14BAA480E450B061A6E77DF485D2909622E35FE0BED1F4AFDDF9FCBF5C7C3D8FB350A69D20154C1B6E47CB0410AA0741F018208E426761EB10304119702BA7CC7E78208D2EA488991EFF00C8FAE0823540F3F89FCF0411B5A493C51276DCFAF53821497AF87DE37702BA7CC7E78214850C8202A45E7F7F760823760823058262394E08230E0574F98FCF0410AE99E2C25C4981C7B6C76F7E08238642DC778B913E7F18FDDB98112100D0C10E75CE328A64B40A42DC163D001279FE9F3185A54C9C169972D2A5719E12DA3F423476F6D198E988920CE5CC094A0124380030D5EFB6B5DAD14F6ADED0324D134350BCC6A9B2FF000ACA47109E20091201F302637F763A9F657E1A4ECFE6CB9864F105104BA4D053537AF90DA388F6EFE2F60F29C34DC348988E209525D2AA82DF5372C36778F37FB52EDA730D5D990CBDB7DD4654A5BA16A43CA40E124DCF0907D24DBEFF0052765BE1AE1F2244B5AA4A1C00E38439FABD5BF378F11F69FB779B67D8A9AD3A6196A52BFB8904134A3B3331D5ECEF1D73AD71BA7AC2CD02D4B43A654A528A8C912492A9BDF69F21D71D6B0988952909932E58433024306601BAD3EFB456D05253C53140CCE65C83A53EF5EAD182692AEA1F6E9D8A75ADF74F85E825283CC9E569E640B61DE2330FD22490BBD4D852BA02C75F7687C526629557297B6EE6FF005DE2CBC9B4AE5F92B69AFD46B4BEEA405A1361C24DC02127D224408E4315AC5E613F1A0A6529552012D41E7B8EBADE13485020B11EF5DBDEB0DFAC7560AF6A8E9A99D0D52520743286886C90409E32D9055B082A07CBCF6CB3294AA719AA492B9853DE12E6DCAAD7D186FBC3C97354E012C2BA7E3715F6D14B66B9A13C5078B7B9373E649FDF3C752CB72D421090120160E48B5B97D34D9A1F4BC400003403526AF567FB115F5881E659C2DB5A5B0986AA09E35822101331F7CF9F438B1A244A928E3550A050333E9CBDF3108E366A6600010790343671A9FB38A188DF05754D4A58CB1876B3BD304A38A1324749EBD45BCEF88FC663A5A41248480EE5DBF0FF009ABBD21845CBA5BB17A6AA6C66BA81EE1202568A55133782A100824F3BA76F953331CE809C9952419855C4E412C9E6EF5EAFF48D92970E4B6DEF6FE768B6E9DDA5C9694D164686E97812132128055C22665404FC639ED0045AF0E714A0BC4BAB54A41347E94DB9BC0542A1346A3EBA1FC73F1778A5566B98A56EA89E22A27BC2A215DE003FA649023CA36DCE25F0D82C2A929EF509734402053E971CC5793426651984FAF878F2FCC46DF759AA5296E2BB87A6787C44ABDC0817BC5AE2679E159981E075CA514A459AA29BD75236D2309C32829CDC10C351E2FCF67B33C6DCBB21D4BA96A053E5D42EAE92988151532521295DD2785513D6C77107081CEF0D97527A93C6A1F28A39005B97E4F9484B2A0068C0737A1B036BEDD18068BDF4FF0066F4D94B287AB2A43EF708516D4DFD9205E4FBBE1EFC513B41DAC18A131121010CE1252A724D6CD6D2947E7787489812CF524073B7DBF1CA251515D4B9636942DF699660CD3252826A026D0A5A6EDC4089B99E56C51309371B8A5CC54D52C8D0173AD3F716F768C4EC40018AC33073E0EEC1EA3F976888661ACBBC7052E4B953944FA8F087D3C5549715D7EC94A77F75F78C49CB90B47EF5D4E85874B9F2A93EB0C66E252A040A91A35B7FA56BE4EF0997A775167686DDCFF34148C0054C84F04BC93B8521B50298062E01331C8E1DC941E258BA92DC418B07B56C4977FE61929455521817A7B25D8C6E4651A5F20477C809ABAB45C28A8F89436B1240F4B6DEEC3B4380AE24B59CDC1F2BEAEFB97B3C335CB2493663CCDECCFB7DEB0CB5FDA03ABE063BB4502192A0D77684A8B808DC94266D1B9263961C61A5212A2AE1AAD892A2FC4CE6C6829D1FC61690952487B569E0FF007F3A4476AB3CCC3300422A1E7A6E3C0A2083E57B795A399E92885A1218048E6004BFA0F6E6B0E88704421629B397B8BB969E215B80D2A075984FC663A6D8593894A58A949049A02A0391D9EF5DA1A2C5880799F76A7BD96A348EA7ADF137401C0AFEF521A37BFF005011F1E9B6379998C8921D4B0280923E61E2078D89F48414973415EB7E5D7C9F4736507B35D66E82AFA8B4C81713594EAE29F22AF0FA19F99C309BDA495288EE54B26AEE950D6A2A069EE90ACA414F13EE05F6FC74DE13AFB32D6A1265A6B9C4D5306DCFFACFC3D631B48ED6A9FE67045CF09FB06DFF008061686DA9ECCB5E0134CC30491E33F58A69B6DBA89E5BCF5E789893DB293F2F7814787604B1A5E9F53CDE320136D39C42B37D05DA432543F8621F1D5350C73DAC93CFD7A62730BDADC3AFF6A08D6C4539B80EFAF93504655C563FE6F5880E69956B1C9C4E71953F4C854F741A9A82E017325A49E083D627979CF60FB4322791C4532CBDCA833317E47CB58524A544579B167EBB72FAF38ADB33D5154DB8A61541534E663BD5B6EA408E67893005A7A40C4F49CC654C03854950701C11A16D0DE90B777CFD3DFDE3450EA4ABA54BCAE36EB52EC120B886D54D133209255363FBB4ACA5A2714926DA3DFAF21A8F1A46021E8EC45FECDD6BE4CD0DF53AA5A2E052B304A164925908E28B1B4881899932524710A00185CBEFFCEAF19EEF9FA7BF6758E06A34BD1C46020595F678A7CA6DF87C2313F00A981D20A8867715F0D3A8FC468A92E0907E63EFDB8F0DF7379EB53056224733CEDCE2DB73C248CB6705070BA5C70B7DEDD5B4F04BBB0356D5ED5DFF00970DCE36399D34AE14858F71BF5BDFA75DFD2D87C9C14C4B7C849E63D2DFC7D6125A824B5CF2000F478FAA9EEFCFE5FAE3E0C89885332856DA7D63ECDF02B6F51F98C80099922FD6DB7BFCF1BC60822E232C6C124D40F51188DCD0078A481B6FBF3C1C0A360FE519009B08DBC03FB87EFDF80A14039040E719E056DEA3F3182DB248893EEFD7CB1AC60822E230EE8F9FFD27F3C1188CD08899313D446DEA7CF046E8203BEB1B3801D953EEFD704280836AC66941131267CB1A95A45D43CE36E151D0FD3EB19411B823DD8C7788FF00908D84B59B249E958CDB4154F84988D813F763066CB01CAC010195305D0A1D4465C09E9F7FE784FF005521DBBC0EEDEF9467B998CFC26CF63F86F568DCCD1FD60D85926E7D6379F38C2C852564041E27DBDFBB5DA135BA012A0C05CB8A7BA7B11CD77065ECA96A504800995111600EE4C7EA4FBE42565B8C9DFF004E4A95AD219AF1F8496FC7392967B91A7F98EB476B7DB153E92A0094D436AAA7D2E86381D4A8A0A78B7292637B131F9F67F873F0FE766EAEF71521480820FCC9A1AF303AEBBD75F377C6BF8943B392D387C24CE3EFB8904A14CD60F404DD8F851A3CD6D53DA1675ADEBEA55985538A602D5C03BCB419E40C72B4F9EF79F54F66F274E46512D12010800060D6D682BEF48F1AE6ABC4F6856AC54CC4948592B292490C4BB5FD05EF15AF7DC4AA8654B01282384A884CC9E52798F2F8F3EA32387152871A780B3049D5FE9A73BC56A64D97820650471173F37A3D8D76D1C561E726D3AFE78529A00A2A4AA54E14F840DCF88C8137BCED26D338AF669265E05E677A01A9617BD07F97F1686D2A5CC9F30289294B82CFA03BD2EFA8AD4B88B5159964FA6281140F34DBB5E5252B7400A2D91CC403FBB7962030866E6B88A4D644BB23877B5F7D5BCE2566995C094801C0152CFF004D856DB6F150EA1CF2BDE5AD4DBCA758519093E1E117D81DBE5CEC062E383C9815255C3517A7959BF3EB0C968490F46FAECDFC6915D3F52B6CAD6A7788AFFA788908F7DFCFA4F4C5AF0F9726500B4A78599C357D456BD4D4EB0C660208AD9EBE5B7BBC44731AE5A8A9216093602428C911D66E64587CF12273097857723E5624BB6B66D7EFD61A4C9F32A00B8A372BD6FE2F4872D2DA2B36D60BA8525B5B34148506A9C790503856411C05613C5707EC123699C43E65DA790E995DE00A502129152E342D41E3D442B875A9555BB356BEDF4E757768BD727674AE85A72CE5F4E8AEADE185A8A54A8541132A0A1FBE5B629F9862B158E70A52A54B770805F883BBD08EAD57B43C0A480183B863EEB42FEDA1AAB353FD72A3BFEF14C3927829E0A5279401013B6E7CF09CA4CC4942425C02439AFAD75FC35DF5AA8EE4FAFE3DF266CADAC76B104BCA2CA87D9E19326D13C302F6F8F4BE2C384402DC4013D767DE9716AF8B46C25AD4EC934FE3F30C14ECE735CFA29DB438E2CAA28CB692BE393E2E220787CB8FA88E785F1624A071F7C9414876240A6947AB723E0454BCC2CB493FEE029E166D8F503F3CF78BD7487640F5425ACCF57114ED8E15A10A2078409B8491D472F238A4E69DB43210BC3E0BFDD98974958B0D19CB8F5B3F8AF31284915001A33EBB7E75AD79DB5519CE41A529914997A986587070385084AD4F706D300A9245BF7BF3DC5CFC4E6B34CD993162612E0D404BF205B5FA88426AD09E24A0B00C431BB53C3A52FD1ABCAECF755672EA98D33951553384872AD4EA510956EA09700279EC76E6409C187CA4E1D499D3E695A49FDBD2DA9F01CAA223D731492CEFCA94FA78B8077D192A34C657918359AA33A554D4D6F89597776B2029024A038824279C9116E9B62C38752E6BCB918701219A7050A3EA451F66B5219E226A8872A2FF00F115FCEFF4D2353DABFEA08EE34BE5CD503401497DC08A852845C80EA54A13C883387C32844DFF00F1534CF208524A7E4E12EE47CACFB3F2A43718850601241D5C3BF990D406B4B7288EAEBAB6B5C52FBAA87AB1E3FCC7077894715F8785221099F281D79E1DAA4CA4242414A5800EE1CB6875A59FAD21DCB3C572DD747DFC79D39011CB1A3B51D72C3B54E7D5E9946656E249E1DF6E20498FF6DF0D57325214521D6694009F221F7143B3C394CA04124D34A375D625D43A6345E5A92739A94D7D42C0E0400A4F7253F6AE92649FF6C349C9C62D40CB965080CCA05DC11701891EEF48DD4254A624B93BFDAB6DDC79C66EE6DA53290A19765887B876F11B40B5940FC79EC71B0958C23F7AAB764F9DBEDAD79424A992C9141C989FC81A359B4DA1B9CED26B18F065CC3396255FF10961A7FBE036FB48053C3E5136C61596F7E52A9C998BE1FDACA2867DD8B79DA1B4C9C12A74A80045880D66D8F95A962D467A9D6F9B56821CAA0B077E06D2D5FA0E100EFD0751B0C4861F06245449240B12EAA6E5DDFC4FAD61B4C9BC4CE5B71CB414AB36F0C1539C562883F597999076716BE23D202A047291D6713123264E3D24AD212CDFD8C6B6FF0088F7717856428105B96B777A8F7F58685E6F5C3C23317C0BF35106E660150F2DBCB0F13D96929D52C030A0D7D9EB587108DDCE733490A4662FA60D812BF17FEE3F327F2772BB3126951FF88DA87E95A1DE08554FAB7356665E5BC446E77BDE64FEBBF2C3E4767F0C3FB80074E11E9E3AD057782143BDA066EC94F030CF0ABFE221D69977BC03A7789570C738009E588DCCB23932F80A10B9A03F094A9496A87B1A8F7BC3DC37100588ADC10EC2A3DB11AF8A0ABD47A5F3F6CB1A934D53BC14005B88525926F04CB4DC8F71F7E12C261B31944A70F3978643060A495DABA97676FA43A4A52E4A92EE46BC87DC37214A88AC353F62DD9DEAC4A5CD1B50AD3158D859AA696E3D509AD5ACF8002E2C25AE0DA475BF95832FCCF35CB26138E7C64B531130327BA019CF0A7F7120BB35348DF825ABFED3B56BF41AF5D39C75EB56F60BDA26960E5751D02B35A16E562A1A79B512912A2AE04952AE22DBFDE7A0655DA9CAB14B4484E27866D1D2B4292DCB89403973F50EC29A2A42C00A6A6A5C1E761AB5F4B5A28B7F5156B6EB94954C3F49514AAE1710F36B6C12491652C242A083B480778C752C85781C4820CE96554003A6A497FC579EB68C77547D2BA8F02D7B5E95B8B18D88D44A3E12E0E5042C48DAD63F95F9C62D072C94A0E809376602BE156EA2908AE592E521DAE68F6F03B721E50E14F9EB8BE2FE6131037FBE26E6F724EDE78417964A480C815059CBB74DFF00311D365AAEC4B3BEF5ADAA63EC831F9C095839AE5C94B333823C0398FB38AC4CB510CCF5F1F21D6343DBA6F11CEFCE7CFCBD7CF1212A470DDCEC1F53D2E3EFA4604CE21FB5C0BBF875DE3142547727DE6607E7FBEB87F2C0003D8D4B6DA0FE3AB460254A2A60FC8066E9F9FBDD634024102794F9FEFA7973BE10C4E255254E84710E9CABE95D3988DD0A4CB07BC152D5351E819AF5F02446DC3318C5AE851D5F6D49A563071491F2A405528C697DDCB78C641D71BFB09E2264F5836827FD8FA1C2A898482E1F4D00FA7A69082E7CCAB21C1079D79DB71B5F48DC871F7265C089882426D7F4F891F3C2A99214FC47A06D2EE7DFDA1A2B158B144C9596772029F968C0F58CDC436803EB2A352493C3C1E1088899E106645EE46C71198FC4CDC2377492B7BB75E9CFA74710BE19626907123B903FE619EFAD350DE3AC6D645393C2867879F89447DF1B7C4619CA9D8CC45449587E4EF7BBB7430F26627052407C42001B2853F9FCC294B9C0084A1A8E654E206DCE144193CEE3E7897C2E498FC5B34B5D6C58B87FAB577E750D0CE676932CC3FEEC44B2D562A039EFECD0D210D566F9753A66AEA2999817979B047FEEE53EEF38C5870DD89C74D01C2C9BBF09200AF27B74F5864AEDE64F2B8BFF009892C3750BD3737F43B558B4AB5C69ACB829F39E5236C27FE38E26D731F641F11208EA089838964FC32CC316C89689C566C02155BBD746DABAF48AF66BF15F2BC17FD39929628E42D34F00F7E5CB9C305476AFD9F38E2AA17A96910DA264909827CC71016B8B7E786B3FE10E6F2CA4AA5CE06A482953EFD6A3C7AC42FF00F7D39714F0F1A050D5C1D1FD3760ED788F7FF882D0D48E3C8A0AD6F306CD9C711C490D948812448215D2D389AC97E1C63A4CD48992D65881F32496B55989EBBF368AA673F19B0BC0AE05205C82140BE87974AF2DA3ADFDB07B4AB6F52BD4990BA12A712A49295410152362266F8F41F63FE1FC996B44CC4CAEF08E160A4B01CACCC3C79C70BED1FC68524CC12A6F0B3D44C2D63A3F414DABCBCFFCEF3FCD7397AA2B739AE71D6DC512DB4A595589364C28913E5BF28BE3D1990F67F098342448C3A50081600585EC037D9F78E19DA2ED8AFB5530AA6CCEF382D5048E757A121FA446DB63EAE3EB617DCB0B3E14195151260EE64413CA712F88561B08E1494B8B9A0B7E39379C57933A620325440E4FF9891E53A1EB33CA962B2B12B6B2C2AE25386521494FFD244907E26F8879D9F4A48299412E91400F09D79FF24E8F08A997FBAAFAFBF38B0F31CF69B49D28CB321E05B65252E2C70C8B4925464CFBE397AC28C2E23362672F8B8DFE506A05480D56B35852F405A3604A1D293F2D35F3A0714B6A08D6292CD754B85F7B825750EAAE5478BAF5902DD395C8E96DECEF6695862A993430353A3E9FE29C8B184A612E9726A4DC935BF9DEB110ADCEDD434B35EB0804184FAFA5CFBEDE5B1C5C026560EB4E11577DBEDE0D5D85352A2431F7AFB6886D353E77A82BBEAFA769DDA94A963BF6FC412B04D8F78A10809DCF5DB0D713DA0C3006A904023D8170DAE8046840343EFF00117C699ECC74FE4C84669AC1D0FD7405A3282A50E1501201750608363703F3A263B158BCCE7AA5E1507BA3FF00F7014CDD13AB9A5EAE0BDE0EE65A43962A06DBBEAED421B6D5EF589466BAAA99A63EA8CA114F428494D3D13294A14DA62FC4EA1216E4DC8E2923118325C661A72A6F0AE6AA690EAA96B58924797D291A9412C123A803D77373BF9C578BCD09A82AA263BB0A2495384A84F33E3F3F772EA7167CBF07C491DFB020390696DF61B579428896430218DCBFA0FE34FAF0FB88AE537F5B6D55552927B84B28E1851201E22D0215CB7B731E52AB460E4310B42529152549714AD1DEEE000C6E3943A97C23E635E16A351F4DFC9A2CCD23D946A4D45C35956A19665A98510E841251B11E320FC2F7C52B38ED4E1702BEEE5AF8D6E78528048A740CFCDC561F4B5A58D0067AD3DD7DEA62D166AB44F674DBC8A453559982C27EB0BE12EA82D03C3C09855CFF00A76E722D8A74FCD7139CCD69AB5CA969B24122EEE0B16AEBE70D3173C24012C877AB6E0D3968FCFE91F7B38ED0FB415919165AA4652930BA871C45284B60DC8438104C01CBE7CD354CCBB0491DE7F796763314EF42400E2FAEDD623BBC98B3FBAB7BB7ADF7B56B4B8829F24C8F272EA733AE39AE6C882BA5571A514CB1BA439250B0A33245875BC61696EB5132E5F04A1C244CA7CCFCB46D7534B426EE4B9BD4B9277AB79C32661AD2B985FD4A887F0A4A894A03480F95721240913205E636C3E3292A6E3F99BCBA37DC3460DCEBCF78D74BA7758E7A7BF790A7583E245538529E049BCF02BE7F773C615899520F095849D921CF90B426B524508735A5A9AD6D1236B22D3F91242F3CCCD1595200229D0D91067ECCB648DCC5F975C2B2E6E266B8949212A3498E4335D81A9A381BDE13EF24A48AFCF5F958DC73B56953C9A0A8D5F4F449EEF2ECB9B6985C84AC84ACAC0D89E24120C7291CF0F519799BF3622615ABFB5BE5D2AE030F5AE86D185620243A52CF76D2AE3D75E8394305767B51988216A5B73C924A449F48E47A5CFC04DE1B052E526890ECD50EFE27C06BE702B16433DCF36BFBEA74148634D3A5B2A529C528B907C4A2A889E64902797AF4BE1EA6420B02905BC00F0B7A13F66988C4296C1D9AD57EB7D3ABFD63538844C48EB78FD9F761512258B2436C403FE39D3486DDEAFF00E47D863E7FE1A113E1B000253CE0C739F3FF006E5CB0E65C941A8961B9900D76A59C6BD631DE2DCB93B54BBEFD3FC6D0DEB2DC1F10E8449FDFAE1C8C3A4DE5B1AE83F0DA535AB41C6ADFD0437D43EDB407881E2917E51B6FC8003CFD30F644874B24330D8B1A9D87D07D1A1F609D8EDA7ADF43BEF414840AAE6047119236836FC7CA77FC30E53875357C6A47A53D6EC224211BD5CD9E102204FEC4CFCFCF0B4B9452E2DB6BEF5D6086F5D6A0837F75BF7E779F4C29C0DFDCD6B0FE75B4109975295F0C19DC99B812622DD630EA54A4A920A98DC5439F571D4DE1594A29762D6FBC2571D4926C24F97972E60FAC5F0B1932DAA81AD424026BEA7CCC2BC6ADFD07E211FF0011629DE6E9DC42BFCC980B42949E0E1BC9281CC91F9E18CC934B50BB16707CE81AB4EA233C6AA9E2AF415F187D4EAED47A78368CBD62AB2E77FE221D0878047310EF11DA7CFF00185C56592F10A4AA623E641252504A087D8A4A49F41F58D84D98971C47C61AB54E97ECC7B4EA7A56338A5628338752E019836853629DD588054868210BE251FEA369EB87582999D65E5588C32A64D91218A6471F0950D7E62788F09FC757D84026FEE5313AFAB01D7F160F1D27ED53D9D759766CF2F36A243B9CE975A8B89CD18BF76DEE3F92D95AAD2522676338EB1D8EF8872B19325E127AB827A084AE52D4C52FCD4CEE7F1AC3A9984E1142E0DB571A9FB5E28C7739532D06E83892572971C7014294A4DA0A1705252AF8F3E98EF3844E17152FF51316821829297147B9A1ABF36AF230DD58628F95497357D497059BD2AC07578FB7CC7E6CC4E4005806DE9E2D43E61ED1F5CE5E196E2E583391BB3D89F01EB189415DC49E1DE01547AC6D84578800B685FC391A3FA6FA343D44934228055B7F13B356362131629B799223F3FC30DCE2175E10E2A3416F0AF41E70F654B48AA9403914E7A3FADF468DE4445EE7974FDDFE18DE562012CB6E840F1041FAFF00889191946171B59D8844A61476AED7352DE4238F3E5D712386C32710C10872A346035F27EBEA4D21A63301966041271B2CF0D7F7245B9397B338D8E91C8AC66990B5B8F32DA40995B8DA66378E2509F77CF6C58A47661738A7E457CC47ED4151F161E1E02D57A8637B5B93E59C5C58892AE1B82A4876D9EDE1BE9101CFFB54D1790717F13AFA747083C5C2F24ED7BF02AF37FC2716AC17C33C7E2D295CB9334BEBC2A1434F6C7CB4A9E33E3664181E249321D3AF120BB5F715B6AF14EE7FED67A03254A5392BADD638B2A0F82B578236FB522FD131B62F9D9DF8178CCC4A8E264A900311C697E2D2C5A9CEE5EBA472FED77C6FC1E62C9CB9694B38265A83DF97DFD228FD4FED9B50AE2FE18C84CCC70A84011623C3CB6BF3E78E9584FE9F644A62A4A69FF60150068FCBED531C8B31F8AF8E524A53316EA06CA3A740E39741B98A473AF6B2D7B9BAD28A2A97691B4157111C278E6C394DADB7588316B4E0BE0C61B0801EED0786E784333BB1D0F98BF8473ACD7E25E6CBE2E19B32AECCA50B31F37AEE29D22BECD3B5DD679E89ABD4552C71CCF0855A6DFD2A1E405B6F3C4E23E1FE1B0A18C943501748E5C9E8056FF68E73987C45CFB895C3327D4B8F995D75A0FA72885D6EA6D4C1B729D8CFAA6BDBACBBFC4B71B0D04191BAAFC57DA448B8C5D7B3BD9BCAF0C952E7C89448A25D209D41D1DBD3D1F4CABB519CE68A3DFCD9A18B3A8ABA01567FAB6950CD543459FEA47539551D6562005CBAE77CEF0113C46545511CB78E90621E67392647264AA74C44A4B876E104D4D0301ABD9BF02D12F178E58613D6FBB9A9A69E7ADFC1EE845651E87C9D1943657519854208AA70BAA708524784924A80927918B6E314BC176770D8C9CB9F2E4A65C804143A402A72C6E90430A9603D6AD71A718A4979AA73D69ADDD9BADBA45479857ADFAA5AEA1D212B55815710B93CE6DBFB8822778B8E03249320829480C050003425A8C683D691CFF34CB71B3CA8A96A2E6A2A5A9422F46DC68613AB2B26A29AAD4FA9E4492DB224F1156D10542248E5CB61CE4A7636560E5AA5B04101B4D68EE7F36342C28865597CEC1A9466125CB80797234F5BF568B0B29D2CAA85B59AEA43F56CA5B1C4DB3CCC0B4A130BFB4049239913BCD1F34C67EA94A9723894B07F68762F5FDD7B7E0C5859EB615E6DEC96F3DA156A2D76A4538C9F2C4258CB784A68DD109242478CDC0572DC993CAF7C43E1B27C54D9FC650A01452E6AC7566B060F517D235AB004BB453798E7EF309729D0B53AF2EE5464D899373236B833E57DF1D4320CB5324244C484877A803C6BEDBC6088356E6FFCD652DB6B5D4051EF42413727C26D3F7C7AED8B6AE7C8C2A56164310024380CC2BE06CF616A54C68BE11C240735706DEF5D45625394F66D9D6B071AAFA9596689052B50721129064C85149881EFF7E2979E66B2427BB0B20A8909094953D6CE079D830D2130926C29BFDA2EAA2CC720D194472AC9E95B4D6B8808ADCC4242CD3140012784A55C7C664784CFBC629333078A9F3828A95C176F9AA0D6F46D3D01B4093C229E66FAD7AD621398E64E54BAA71D756F8513FF00C4AF6E63F9009B0FB3616126D8B5E592C4800ADA8C48A0714F76829B7F17E7F7D21A1B0D3ABEF944BE1933DE10525EE2D806CC404999B79DF13B331B879728A54B44B49FECA2B81BAD5CD2DD3ABFC3A41A90E5C317E97A9BFE0BDA24F9668DD41ABDF6D748C8A4A0491DEAD4128F04DFED7018201BEE663151CE339C2489265CB98CA51674B9E2B5481CC55FAC6F31254556029B507A036BF48B9F2F6BB3AD0AC34CB884E639FAC40470B8B097936B1852609B4EC27CCC731C6CFCC674C5913D6845D2789F8C747A30E571E30CE62F841653BDE8CDE1EDF9B346BAEA9D79AB941B654727C98447086D00B676B0E056D1D7CC1DB0D30B2972D45531E6951ABFCD5D4B976B9A5295864BC5292E09DD80F0B73AFDE358C8B4D643DC3950D7F15CD5525352B795C34EB024A968E25257C53B1B401D7124A0B2B4909EE9201E2481FBDEDA79F2686C310A5062E0AAF514AFD4F23A8F04399EB6CF549FE1EAAB0BA758E0698A669B67844C0054CA4131379DE2F33824616521456996EA56AA3C43C8B815D79C1C44EA7E9F48479668CCFF0032EF6ADE7BEAB42F14A9DA975490A693CC84AD416E7A2648F961E2E722594CBBAD60F0A52924121CB5289A8D5AFD6000973E25CFE624ADD1E90D38D9552AD3A9F3148BA57C54FDDAC5F759E130768B58FBB32A5E618A0AE296707C27E5B2FBC1F6A3539E91BFCA9B1E23E829A6FB7DE19EBF5A675512CB6AFE174A652AA642438427902B48936E7CF7BC62530F952070CC5278A6007E725C3B5684B0D98FA5223F15356976376DBEC75D2911879D0BE2719A4358F2AEA79C78A003BF17028FA98FD99697842861C2C1EA001F8B1F1B56EF0C7BE531AD740DEFEDE3686D7F316E80CD5BA1D53A3C2CC4060A6C405010AF5F899DA4A4E116A50253A9AEFB528370D077C40A54EC5BEBAEDE7686D7B3C61CE20D909E704C586C2E39FC4FBB12F270A6CC6D5A1EBF5DB954C6BDF2D550695029D43F5E74FB43554E7BDDF04B89E1331E20408FDC733EB787F2B02A2E58B8B8009A7D453E958511C531C9E55347F01FE3A4352F5118BAC4F5E2E43CFE64488C394E5EA70E9BDEC006F1A783F9D6151289B1F4FE61B2B752287042C73BF103F8E1DCBC0106897A75DB73F43E1780CA22E6F6B7E7F10D4BD48A9238C473F1263F48C38460554F9091B55ABD1FEFBF28C777CFD3F9844E678AA823F98070CFF5723D0DBA4F2B03D061E49C1949FDA45C9A337AEEDF6A54BEC2A7868EEF5DB7FC5FC2C61BDCCD557858B03FD42DBDB7F4BFCF0E061AA686843DD9BC7DF287D1C3599A94092B163FDC3F138C9C2BD8795BA51ABEDE08D6BCC094AAE08DB7079DBF0E5F0C63F4AE1A85C8D09E7BF9B7DA08C98AC0BE2E2500444091B5FF00630A264A903840A5F60078D61497AF87DE335D40EA09E5E216C1DC294A26E1FA7ABF41F4DE148D6DD5B6D05171016372AB029DE62449DBF59C0708667CACCFA5EA2D572DEF9C118A3306AA41432E48120A4836B9B5E0FBC6D37B63656042032920061517661CE96621B4EB1935EA6FEFDECC183E28140AE345424C120F024A9256A1B10A0653C27CF63B6C70C3172A648E032C128550B6828366D75894C0021DC6FD36B8E7F5893E59ACEBF2D6159457329CE74FBE3BB5E5AF849EED06D679C0A54DF885E6D88DC6E5183987F592268C2E392CA44F413FB83DD23E52F6A8DDE25E5CC09F9549E24D68CD53CFFCC513DAFF00B39E47AAE81CD53D9D14525536DBAFE679536254CA9409406F8882E711927BB4AA22F02D8B0F67FB7799E0F112B2ECC662D9C264E28D133C0607880608614009ADEB1B89095974D7705CB0A6FF006E76158FAAB14EF3A0A90E82D93F6004F101D36FC7CEDBE3E20C8913A610385441A00EC29F4E56ADDE91F59F118E9125DD490DAE86FF006B73715684CA72BE9969450321B4B9FF00CC2D7C30A236238C5A04ED3B1C4F617259D3880124BB12361D5B5F3615E55BC6769B0F21C7789003B90459BF3D5A346659A64F9630AAACD6B594388054A05C48D874040B11FBDCD8B0FD92C4CF1F24B596607E53AD99C0A3B781F2AC623E206130E5415350E9E62AECDA86BEC6295D51ED01A1F23B1A969E750141084AD5E28DC120981B419117DEF8B7E49F08F1B9C1E24CB5A58D5924BBDB9BD29CDFC389FC45F8DF8BC9001815A960BBF02C96B33B37AD772CC23AC3ACFDB12B96B769321A314A83294540712E0F230527D63CCDB6C746CAFE0AE2706B42D6851622852696E83DF28E1F8CF8F19E63C1733920B82CB51E5EFF002F1D76D4BDB8EBCCE8A5751A89F7D2A2BE065A6FBBEE42B70A53647174BDF9F3BF55C93B11272F20CD9292433F12013460E1EDE94D22A38FEDD6719985033E7278BFEE56BF9E81CD2B68A8EB739CEF3A714AAE456D5F19932F3C99044EC09DE76F49BE3AA65D272EC2CB4A3B99492033F08A11C9BDD6F150C4A332C7289563660E225DD458EDFDD61D7C43426469E72A882C650FB6AFFCC52AA1C571CF4E2F2E60F98F27389ED0C8CB292C2268D025012C756615E60B786ADA42E764C5466CF334A8BBA95FC91AB6AD48548D25999108A4EEFF00F538099F45183CE07C0DF0F307DAB4628006530AD1CFE3ADC3BD0087E8CFE5CD0C58BD49241F520B06FAF36852D692CC385C76A0329EEF8424171A4C9263FB8191F1BFAE24BFD6F0CA21012A49554B851E66C3D39439978BC34EFDC94101E85BA7D768CB30D179DB9429AAA32CC0FB49EFD904806F04A81EB6DF7EB8653F38C1AD6649242CEA50A6259EE4352D4859385C0CD1C4532EA4172C585AAFADEBE2690F5A734057E64D30AA94A5AA51C4730702D2AB054A6E93E1E60F0D8F989C406639D7E854132144A9764F86DAD6CF5D21B626661301592122CECD4622F46AD6BF7A43FE7799651A5DB396641C2B70A7856EA0788280BF8A09DC9D8EF6B622E463E76366056252A59249E024B002C0D9CF514AF323546768482134E747A57933D7C1DB56A8EAF37CC8D438AA90A71970F8D2A32A50E5C24CA844990244018B1C89F44B27800601A8D6F036D6B67DE1519DCB200501E2CC5EB6228CDEE91B586691C5216F952D959114E38B8812481712AFB5F95B7C490CC0CB04710068C68767D41B6946B0BB46A71F254A07840511BBD2F5F0D398B345A5A7B4E52E5684E6D99AE19580ACB185927BB800B9379B9FEEDE3D6299DA2CC2662E60952145453FBF841ABDABAFF815863889A998414A425EB4F1DB9FDD9A10E7DA95556FA90B3FC9448480610001174A77B81FB3891C872F993129529152410E2A3CC5295637F366CE6A37BF845339AD7F7F52F9AE7434DB5FFCA5E37FB51C246F6FC76C74C9197C844B96A44B4A94C4AC1A11B5E97F2DDED9E1E1153C3B58BEA7F930C748F56E6358DD1D1503952952827BF01400E222E4C5F97CFD31179A6351824B23852402D50FF8B35AD188BCF23D03956414DFC5B3BA865C7DF095B2C2928968A4788113CED756C67C8E2818BCE711899BC082A213422B6D6D4A0D7784E669E3F68E730D45F5D49A4CB406DA48290A6BC00804DE131BC7E00E25F299299A7BC9E1C83FDD5D3636E7AF22E634249A3D36FA7979727AC4442D4C970BAE2540901C4900A957EBBF53FB8C59952E4147CA8482D7A5B96963B0D2EF1903E663CDFC9E1C28281FCCD696F2CA25F093E271415C3732480A1C36DFA1E98A8E6D8C1872A12D40B39A1ADB6A9A07BFE4C6B164657A4725CA50BCC73A790EBE8095374A91F6940494F0A099320EE3CB738A54DCD264D532D642483F315370D767AD74ADDC42D2A6A50E09620382F5A93E57EA2F0B135FAA3533E9A1D3944ACAF2E42B816F1010148062656944D81BCF48C5731B8E9C14AE07984E9FBADEFD758DD7890A003EE6ECFB83A6AD489454645A5F4C334F5598BC8CC739502A5124ABBA7073201503276DAF7C34C3E231B3A6F0AA42F84D2C751CC396D6CD7B4305A8A892FD36F2F65A19731D675B99B2BA64B6453A13C2DA5A1C32361050013E7E7D77C742C9F2CC3293C4B484294CE144DAE4B28D2BA72B690D264B54C2017A390296E6435BC341B430E41936699EBF56A710ED253D2A9257DE9528B895CDD25571B5E397BB0E33DC26070E990254D4AA64C7F9501C820589492CD5A529CC424652921418B26E5C83E1FC52FE32DFABE9BC97C41BEF2BC5C2D456A057B4C1246F7F5F8E2224E0A628B5810E4004D08A3D6E45BD2350417176BD4B8E5B7A1F4864CDF3FCCF38EE997DC2CD352F10A7436AEEC10AB10AEEF878B6047145E4811898C26532A592B4CBAADB894AF9AD66E276F2B3D636330292E406D0DB7D2E756F015A4459C71B6892577EA5444D8F9DF6E7D7DC276560410DC3660EDBB696D81D4D810635AEA7AFBAC37B99BB4CFDA583C5CCF4079DEFEEB6E67A49C9CB8948012FB966D0335FD6F0DE7A0A8063E1D2D5FB75AC30D6EA1607142C2605A1511F0FF7B79E2464654A2DC487AB501A574BB8EB4AC35EE14C75B785DEC69A5493C8443731D44D150E250E70499F7DB90F3307CB13527292C192D4AD3EA7C3F98C890A1FB8172FEC445EAF50B4A9870081D773BF336D8DFAFA5E425654A7608A167A6C18354BEE3703CF412964870D5DF476D1FDBE95860A8D42D7FCDD89FEAFBA76E7B6C6D896C3E50A2E782BD356E5CB95BA3079213C3C4E18500ABEEF4AFBEB0D2FEA36D323BDEB7E2549BED161D7E76B6245193F100F2F95A8FADC1FCF5870DCBDFB3EB0D2EEA141301C9FFEA3637E5C5F2E5EFC381939000EEC9ADDB4DED7FC6B04225E7EDC1FE61F39511CFC893F324F3C3A464FC207FB6FE14B73A7BA410DEFE7CD9E11DE1E67ED91F71FDF9F25464C546881E1414B682B530E246B4A7E34F7E9AA6FE3ADFF00CC57FF00E457E78DBFD157FF001FFDC7F30E23919E36777543FF00EE1FFB8631FE8CA76E1ADEE6DD5E08528CF51B1709B5A547EEE21F2F7E30AC98D886B356C2D4A182370CE9300A5C2379851EB6B138426654514E177F06F16F75F1511AF87BF585EC6728FF009849E9C5D49F3B587BAF384C601418701A9156B3D39EEEC7561A39521C539B2146EAB73BF96DBFDF8D7F46520B259AD6F6FC818215B15EDF1020A44F21CED3D7F51842661D4456D63F6D7D5F94652A29FBC2DFADA5704116BC0249F4F2B0E76F761BAF0E0A5495241705BAB52A5F958DDFC5E49C404A48258BD0687C7F8FABC6F6EA87507FBAF7B100585EC3CBDC714BC664D8CEFB8DD5DD951219E82FE03DD2A21F4BC4A0D8B6FB1B31AF8D8DADAC3FE539A54D02955B40E115D4E4162482D142A03A1683FCB5CA0C0E206390E78595270F3A48C34F40285065814571519943E60C58B067E7123271001704380C09E6075AFF0036BC7BF3AC7B66D1FA494E135ACADD6F8BF969741937E84CF29B1906048C7CAECA7B258D5A920E196F7FDAA0FE83C4F531EF1CEBB7580085706312431FEE1F9DABB1B4757B5DFB5DBF5C86A9F4FA02035DE25C5226564D9264A790E9D37B63B1767BB0AEA4AE7492C4070DFB480696FB0D2C63887693B7EC17DDCF0407019635E43AEC7C2D1D5FD45DAAEBDD64FA9A554D4B2D3AA2375253076E968F3DC6E37C763CA3B1D9722524CC4A12C3E674876E76B695BB33C70ACF3E206378C844D5A81268146A1C9F7F48853F9054370F6719829D2FC90AEFB8CB7175484ACDC83CC7E38B7E06760B23491839299A411C4C86236D3D436BCA2A0BED5CCC7A9B1897FF00885973A58973F52E29C92BB4FA36851C7519B87D699259EE9627AA78879DA6D6E9CA6E5E6F89C6D25E0B80287EF6700F88DCDFC2AF1B8CCF0F313F2E1D24E8CC2B6D35B68D76D21A1CD6BA4E81696D8CAD2667C6A755FCC0911212A16117813F09C292F2CC66255FEECDE02BA049400D5A07363E760FCD2999868892C75BEDD2BBBB6F4168459876AF96D1B455474CC36A1BC14AF6B8DC6F613313E71189C93D869F8801E729955A24B7938ABE9ECB338CC52D8CB4A9AE4077DB4AFB1CE2BDAEEDFABDB52D287596D2926490D2605A2640F88EA22F3890C37C2C389502A9856D5FDA4B750E6BE7D1E1D61B28C5672E161496620170FCEF5B6ADAF843731F685A900977326DA039A4208DB62523CBDDD799B5603E142920140528D4905045056CDE3604D77874AEC74E92FF00EE1009A51886EB42E7AB8A369100CDBB7EFACB8C0FAFAAA5B1C657C2E16529B5AE08076DC0B0F22709E61D959395A4A66A9285D8829009E8EF4E5CEF1A8ECE62921452A5280AB0734EBCFEE41BC4F3B2DD59A9FB4BCE11419526A0E56D2D3DE3A9714A6B845CCAC9E1DC1FEADE6D7C736CF0230A0A829013BB25CB1664B3B9B7DC434998799875042A694AB4049A1A316704EDFC476FABB3CFF0F50AB4FE584A2A8B694D7B9DE71C92014F0A892266C4249DEF7DAB581C1CBCCF10578850013FF4C287EDA005EEEE2DA588A40AC14C989056A25DEF527CF5A1ABECD1515467148DBCAA62A2ED72D478944AB72646E623DF318B6C8C830F2C02569E1BBF981AFD2DD2B0DCE5938170694AB1A8D2A2DA3741D23706DCAF7A8A9A991DED792AEEDB4DC2A6E66011617B8D88F3C63112F05212409C800025DC1B03ABBE9AD74E9AFE82671001449E8C697D7AD0B7A87B7F28D3993E4544732CDD4DAF36E12A452954C2AF7B4A4181B102F8A5E3F138898B230C82A92927E70E3A535EAFD378789C1AD20294B246DA8A01A5EEDE0CE22BACEB573CF1ACFADA9490084D1308F106D3B1FB13B8BDF7F8C4CF65F2D56625467A3F6915533EBA9BB336EDAB340A32A4D0CC0496A3B9BF3AFA1881566A25B74A43A92A75C308812A99816BFAC799C5C96309971212B438FED76F20CF72DCBC28A04952428541D7E9E75FADAB0F9A7BB38ADD4494E699C2D4CE5E921684AFC1C693720494A8F2E477F3931B89ED194132A5B296A042529A8B6A459F991EA2123365A4B15007626F7FC74E7168A6A72ED374668F4CD232FBA94F0B8EA8A0293D482EDCDE763E5CE0577103118F5257892A72E529721AA2EC454EA2BF58732D132601DD825F502876D0B5EFAF237AD734A8ADABA89A9AA5ADC7092E3409086AE6C9E1F09B1B91E5BE25B2AC9A432A6CD02805E8ECEE0EE079BC253A52D052160A5ECE3F9DC74BD617656DA8A85252216A71C84850429504DA660F53CFE42C9E2F1185C1F1095312549B80A17D0BBD6D6D3EA8CC065D5747ABEF6E9E9F58B032DECDFEA4A39AEA1A8029DD85B2D12018173C412411331045E0E2A38BED5AA52952788D1C392D7722E2A0FE63596D33F655B6D3C36D983562734F9837DC8A1D3F40142380BE940213CA78949BEFD794623518A4E378A6AE6710350E77E4E6DB39A6B1998B4A4F091C2545AAD5A3B6C2A3434A3DE36D1E9AA3CBCBB9B67B541E7D10B6698A8DCF310959102C208BFC31178BCB06371084E1A61E00FC6A14096A8D6AF57A7833B33C515A0029716A8D7E9F5B0A8611AEBB58E6D9B32AA1CAE91BCB291A051DF24B60A9239FD94933C3313BEF899C064986C214CC9FFEE2B73AEF434AFDED0D133575150CCE29E429D2B70FE706A4C9B32CD2B1D6689D5D63C149FAD2DC909493241415CA4DB7E13EB737B14CC56598792FDC21C0D05475000724599FD21CA160B82A1BDFEA7CAFD22CBA0A1A0D254E1DCE50876A0890810BBDCC4A245AC36E700E2AD9863664E495E102920B874B87D03A41715FC720E5065A4FCC43806C41D8F4D79BD9CDA23F9CEB87AA5484D2D3A68E9FC4105011FCD02D0A80088E5C5EE1318C64985C5E2262953C2D4090DC4E48E94A5F47F178618C9B2C2992B751A000B123A7B6F07887D5E7A5C3C6F360CDCA94B13BEF1CF6E5F8DAE585C192689D589FA0B1BD6B5F0061B9933420AB84807521FF0087F17FA447EB73E652905A792557949504F0CF2127C899B49C5870997AD4C384814D2A4935FE6EEFA330D5089C43B384D8B1A3BBD1ABA9B52B101CDF5496F8A1C0627FA80B6FC8FA6E7EEB58246553385F80B51BE5D29E36BD34A42467252A62B0145831F16E5BFB3104A9D56A755FF140E136F10BEF1B917E53EEDEC6C183CB0949796F673F6A73D1FCAF0F25CB2B62490E1DD9DC54F833D2CEFB445EBB51B92A3DF0B72E31CFD081F9E2625654A2CD2AA6D4361BBDACCCEDCAD0B19029F35AEFA74888665A91C2A402EDAE6CB11F7824F3E7EFC4BE1F2B98C0196CC2B4D99F7F4F38D44820B3B0F7CDC9F088BD5EA35AB77A081FDE09336D81FDF5BDA465656A0C44B735D1A966B72F7AE5586AF102CF62DC98DCB69AE85E23D53A85DE4E026E7ED475E84CFEEF7C4DE172DBBCAA1D83FF00FB7F9AEB511B09640147275D76D74A35294B986A7F50BC2DDE4DCCF8891CED73E6791E5D70FD3966BC1E9BEEC0F3E7B178CF028E9EC7A7B1B874275039C4AF1CEDCC7CEFCF0E519726A0A1DB71F753728381434FA7E634AF3E7099EF08DCEF73E5BF2DB0E13972187C9C8D016F27F483815B7A884AACF56A375931CC2B693CFDFD3DF8C2F02948FDBC2D761A0A0A836F621442141C949D3EF1C7F1B56DC67AEF68EB311843F4D2FF00E5EBFCC1C497670FB4033C5F270DED3C604FE3F2F96373824B71105AF51F9A42810A21C0710A919DAEC7BC2473F10178E7CB9FE58D5385973094A594D46BB574D746A0FAC618BB6BE10A5ACED6A27F983FEA120499BCFEE309CECBF87E6200480C5C33BEEE2CEFB3C6E3E43F3538980F53EFAC3AB19D2A44B824EDE2DFE7E7F7CC6E19AF06548744BE2A35001EEE1F91703585C4B5A83A524F4F7EDE1F28F3852F8897072E7F2DCCDFDDF2C436324F700712784A8D396F435F2DEB1AA814FEE0DD61F98CCD500F18F5E21E5E639EC797CB117FA79AB2549415234228FD2952F52CF0977892581726C07376D46DBC3E51E653214A06C902E0FDA1E5BC193C845BD1A9C2198A0B52486771B1D76F7CE349A569524B108A574E7EC08764D428414AC137240222E041B7974EB718D664A49490A48200356B68FBBFF9E70B49C428D2DA6EED52DFCF833B43AD354ADCE249516E9AC5F7044A4FF48091E2326D6DB9CEE2B98ACA2522677A164A892A096D056F6A1E8FD686564CC55DE8343B86B54FB6DEBDD07F2A7EB966BB51E68B78995AD25D5113B9B0599BCEDB472E7E6F464597E1788CAC3A54117FF6DADD534E7FC3C6ABCDF3458FF7315354FA712ABB0725F4EB5DA1A2B750E92CA94D37474C2B1E1C414AE35A4A08D8DECA2623A8B47338778693C7300972C4B492001C352D46259EFB986ABC5E22692264C511FF00A8D5C5E95A7AC46F39ED12A92C292D25AA66384880947104C750028DFCFD2716FC176566E2D940A9054DA16ADF61B16FBC32323BD72A0E75700FD4D77B52298CD7B44A36D6A51CE9548A24F1A1495381DF20552940126E3FDAC69EC4E270252BEED5890B63FB2CC694A8FCF3786D332B54F520CB1C201B8DBA1E6CD5D62AFD41DAD65B468529354DBAB0492B2E804F9F093607CF963A3767BB2A7112D972532980705007D40AD35A08B5E579384201980A8D3A790D9DFC2B14E673DB930E3ECADB5B95350CA5D4B0594AD5DD29C0526528078A7948E56C48E65D93C1226C84F7D2E59E2A80D70A17636A72AEE6A5DE27052D2582343A01663EB5ABFDA2AD7BB48D5CB52BEAABAEA976A164A58348F2001C5207196E0083126398E78E9995765B2E19795AA6C952932C70A8CC4248201AF0F103FE1ECD19C1CB44B5FCD2D240342C0F3367B3E9D4421AB63B57CF9756E8C8D4D53381B97175CCB5208B1E12A4949EA2079F5C46644BC164B8D9DFAB216852FE43C25693C2589F95D88BF9178BB607F4C8427BB090A57EE0CCDA8AB7956ECEFAB4BBA27B48AAA734EE5336D33B92ACC1827726092E037B8DFD31D025768FB349E29AA2A134821291216C4B14D592C295F3F04F345A5212124352CA0DB55893ED891689B766DECFDDA4F6919DD26554CD2A8A868D73985621E6DF4069638941442884CA0280BE3CC1F17338929C4F7B257C1296A2C0382A721B84382CFB0B448E5C70EAC24E2A092A09BD284397D6C6F67A8AC7A7DA732DC97B11D3597E8CD2450BA9792539954777C4E3AA0429D8717C4A4DCB9B28C0F28C732C0652ACDD2AC5E632CF73874954849510FC42A48043EF5D758E17DA5CC38735484CD1598CA00528A037E571EAD0B17574798B952FF7AA6DA2106882B88A90E11FE638D47C4A0573F6CDA60784E18E132F3FA99812582154140E03D035D9BC46A6F12D9866024E1B0E65A5C902DD2A7AF3A6A6F11F6B2319957A5145C55554A5C2D494A884A64026448FB26E7CB7C587198708C1A953A67720268A26F7602BBE839C62566A66CB09EE6AD550D49AEDEB6D748BBE82874FE81A46B32013559F54B6A4788A8FD50A93DDDC2894F882B9C4103D31CA55226E231AB95326A9520AC10AE2FDCC5EC0D3437ADAD48C2E7CDE207BB2923400D1FC3A78F898ACB39CD5D6C56875E50AE9E342F8E5203B2B03864A620C6DD77C752C065B2A64AC3B04AA5AD2C4F0B31096AEB53F4BEE86231844B50E0341CEFB6D5FAC4332646679EACD1D0D2386A9A59FACD4AC12921C24A080B1C161CD24FADF1B2BB9CA933921494853948000239DDC97F6CD151527158AC424A4AC242EBE63A73FC345B796690D3D90B09AFD50A45555C05B68BC0526F109907E1D3DFCFB1737118BC4998952D48E3372AA5580772FBBBF95A2F5875265E184B27E7296A80F47D34EA35F44B9F6B2A8AE0C50D2B41BA06F8D14CB6CF006D077E2E10999B7DAB75DB13D95CBC261B8A7CC03BC980099C5524A4101817029A8BE9568AD4FC1E2A6CFE21C5C014E1BC4D34F77A9784B8E3C1F0DB6B72A9D70C70B7C52924F3299D846F3D622E5FCEC5485281484B519A81AD7F3A5045EB275CAC34B4A2704B902EC7424FE3E9BC58F90E81AF75BFE259BBA9A3CB602DE715C2A7109DE128FF88B9D8C030664E21339ED0A30F2D586904F785268976700EA0303AFF22233B438B44C9F27B9E1090A62D5A53C6F5DAEF6898399DE9FCA194D1E94A0EFDE309566DC2A52F8A409FABAD2A32488B72BE39F65AB9B8C9F34CE9C4A492482AB55C7CC4D3D3C19A1C66186C24EC24A2A9C996AE0A92D570FBD74AB0E5A339655A673BCD07D6F52D7C65EF0E26B8949417920DC774950537C361B49911B1C37CEF0CBC54F1230C851EEC8E352412002037CC28AB5DCF50042DD9CCAB2CE19AB9B8D965C5124A5F5A371120F2EA7585359A8E9B4F28E55903086A980E15D42871957532E5F73C8EDE78B4E51D9996AC27793D4AE34A5D280EEE41D9B9162348AF768A4C9938B47E9A7A540289201150FB8366A5F95223158F1CD1C52A9C3B53528238D0952F856A5ED00022D3CB7F29C3695227E0674C13414A41F9490051B525B98D2369C50B912C149058B3D74E61AA36B73A3C8B25D159916C667AA6A92C65691C69A2942145226CA285070C98DC6C79E1BCFCC4AE67712945531F404A438FF0090A1A6C74DE23BBA0012452C2F5AB3D6DEED78DF5FA8F26A40963226C36CB414145208593112A52BC44C89B9C38C3C99EB09131454A2CEE1C1F3F00F71F56137E42A2091B1777636F7D6D4101CDF55B8B90B5156FF0068CFDFB79EC36C5AF2FCB52B002E502555228CE395BF35B4305AA6EB3157BF9B0BD2FE3E1100AED4C9511C64240E28D87C36F9F4E98B7E0F2B4253C294840236AE8C6C37D0FDA23D52B1137198758528252A0540BB2AA3C3ABC42B35D4CD99977C239050006FB41FC39EE312B96646A52D4E93C2F4241E7607E9B3523A6E3F1386958194C8485F08726EEC1EFA9F0E9726BACD751B6784A5D2278A7C647A7300EC63D2D7C5CB099294948E0F9410E0A76B7BDCEF11996CF958B97380482A4A5836E41F33D0D6E62BECC73D016497491267C66E26799803A7511EFB449C0012EA803421BD34BEAF6715B452733C24E46352A4F184859A6843F56DDFAD2B10CAFCFD2A20A5E3CC471458ED3CCEF6368E932313380CB93F334B00534A8F4B8BEB16F12C0C34B2470AB87CFF00C9D1FCCB3C72AB3C041FE7122F038CFE727F1BD8DCE2764E5E0542075007833D3A8D28CD68D00510351B5BDBE86AD11DADCE92A2901C2626E556B8DB97DF389291800E494826971D3D4E9A52D0B212096D05C75B577E4F0C2FE6E9B8EF0C8907C47EFB8BD80FC30F9182096F901A12C45697723A3FD68C21CA659507B253B877360DD3D986E566817B393BF3B01BDED249F2E7F3752F08003F280C6D46E9BD3FCEA61544B4921C13BDF6E51A1CCC904005C1CC8827F318553866D007E87DFA9BC2DDD207F68FC7B6D6B081DCC900CF1C5C8E511F1BFEFDCB0C3A3500F4FF00023532050D4036603DFD3531ABF89A3FE67DDFF763612258B068D7B81FF23E5182F366D304AF6E7E667CE22206FBE37FD089E93F2920820330E7B6FAFDC08732D80EEF878B8A8E0506CFB0D2E3D04708CDDB5184ACDFA9B0F53F95C93388F3D9E0999DEA945DDD9B47D6A7C2EECD08E2BB3C427BF132AAF9C241AB01D76E6232733147085779F3B9F77CA6FCB71872BCB4CE0100708662406BD09D0FD39B5619E1A64C4FFB2A964B1E106951636DC55F42F66781ACDD04C0548039288BC5BF1EB6EB8424640308B334AD4A51735A00FA5F6B7D7589BFF4542657EA0CC0EDC412CE6AE483D3F9856C57000A8BA46DB133D7D48F5B8C6715844E29065A2E2F4B3353404BFAEB48ABE3A64D9B31294A58254D66074D28FE62B5B557B79924812B320F3511F1826E2C6E6FEF386D86C0F7482820716A2AE0396D2A3F1168C9CA12825601F946BAEE5FED7E6D0F9439A24260ACC7FEA3D6D6F758CDFD6062A1DADC02D430E65820F128A881CF561D7EAC62333A50AF754D4B56AD43F4F6D0FECE6D0532E1B40B289036FC87CC72C39C0604A7088F943B397DF4B83E15D75884CB92A5CC2555622E79EA2E7F160CCD25A4CD53F694E9D8589DBCEC418DE399EBBE19CDC2B4D989090D4F3AFABF96D58B062A48084828D9F57736FA1A75DE25F9766A92412EC8B58C1F84FE5F9E22F158321D9246DE7BEFEC0AB06A895F351343CF93EEFEEA369652D7B6A0003CC4DF7B8F744131BC7CB1018AC3109502284353DD8EC2BA8A43F961980B0B8B6EDCBA6DEA7B219EEAB6E95A5FD62B0F0806C571EBCEDF87AC1C72BC364431A383B8097A12C1ABB9603936E213329C38A0BFF817E7B34509AABB4FC8B2921C6EB5282AE3E200970A88D801E254CF48FBB13384EC54B94A0B52425AA03020D5CFA7D1ED1852284804DADA55AAFBFBD5A98CCBB5ACFF00523A6834D52D5D53CB3C083DCBA841262095291C31026E408DF7BDA70E8C0E5AC26A524A06AC2DB780E605232A94A007C8DC562EED67A7F35D233A0EC93B5CD48976AF515635A7A8442D9529DA6796F21775F842C2D25201DFDD87A3B7B9660D6654AC08C42D343721F467497A11AD76891C3144A523BC20F17200FA8FB574A3337E61D99766590A8AF54EAA566D5693E3A5E07D94A9437485A16537DA45B99B4E2532FED1E6F9DA972B2FCACC94AE9DEA48F945DD8A6BB7D22E9829B2152E8D50DC3EEE3E9F46AFF13F649A51B7579369168D414CA2A9CAE5BC5C52365869DE28F3040BE37C4762F3DC462A54EC4E2662F88BB04B04837143CEEE6C4C31CC70A99C7FDB04390CCF770EE6FD0559F68ADB3CF683CC909AC5E5E28E99B69486E998FA95328A78CF008516E7722E76BF58C5F51D91CB30180188C7198E99654B3DFCC40E24A5C538DAFCBAB5838CAB26C4CF530043B3029A9028EF5EB6FE7BE5D867B04FB587B54F665936BFD1144AABCBF35EFD65D69DA461BE14BA529E1515A4288023C33067AC63C6FF0012FF00A98EC8FC38CDE7652BC5A0622528A4CB215319AB555454784770EC87C1FCC7B4B2FBC9485814F980671E8D51FC459751F429FB6CD45452B4F65D54D31DEA4BE456529051C60AB67B98B48EBEFC5070BFD73F64BB95A573D05C3026517773AF07BA458B35FE9CF374AD053C6F6142D701D9F5ABFADE3D1DECBFE8BAEDDBB30D1D4995E4795AC6639B3406A2AB5BCC2DC694CDDA8EF16A32A25425044F4338E2BDB5FEAC7B399EE6527101626092B265B9525290A6770C0286DB1DAD133967F4E59AA3018842B8D948621AA684DDDE8F60F6D68F49EBBF649ED5F48769DA6742E7D95139CEB535634C294E324BAAA26B8EAE405148DEDC660D809938B8647FD47E418ACB674EE20512509EF439B90426C059BABBC79E7B4FFD3AE689CE25A5D65E691FB08FEE6707E9A3D445AB4BF46CFB42D49425ECA96D0A920BA0394E4348DD3052ABCA6F6F43B628B3BFA9BC9938B5CC1352895C44035B24B7ED6E46F78E8723FA6ACCD78592172D7314100D53472295FA9BB7888B7B25FA3E7B5BD1D4119564FF005DCD5D480B2B5B03855104F8C916079100C5F0AE69FD4A767333C2A513310489696484F125C9A87600383BD2D4D636C2FF004F58FC3CE32D724872CDC20B8D03D7DF9C573AB7E8FAF68259733472856DD3298A9AACDA5C615DCA699B53AD0482A9B84C7839D8CF3A8E5DF1E32C9D984A0AC50095CC4A5142CE4802CF476BB5EBAB4BE3BE044FC2E11734C83F2A492E8B53EBAF2B39B4744F2EECD7501A8CCAAB523BDDD0D3551A7714A292AFF2EF29920A428AF7411CFD71EBBECEF6E138BC04AE01C4B9B2819600DD2FC4ED4F2D3908F3F768BB1C8C04F54B5B009514970D50762E7CC7D627398E63419027EA790D334964A10972A470852884813E283636DF9623B1B8FC5E2672153D478CACFCA280026D60F436BE94D6B53728918596B52784FCAEEC36BBDCEFE1B56203579AA5F59FAD2D55255B24491799802474D8751B5B173C065F2D7850B253C5C37200D9CBF56DCEFAC51B138952311C01C241621C806A1ABF7AB6BBC2FC9B4A6739FA9C396B4A6B2F4149AD5BA9EEC2127EC96FBD00AC58CF0131BF4C54B37C48C24E1282C3AC901296502C6AE4394D09201009D00B45C30064AE4B9090403767B0E5F48B532B4767BA3592D102BB3822E9521D514B906627893BF4076F53886188C66266097DEF75243712A84A86A286E6A09B51E915DCE731FD33940248240009607951BA73E6D1853516A1D615AA7D2E2B2FCBA9552DAD5C21086D7BFF002CF0F78142C2C626D18639B63158541938792672A6063303922E2AC091D7AEF15CC3663331934959258B81A07D68D600D0FA3B89AF0698D2D4E56C5334FE6FC278F3499471C183F5720A01E5B743BC1C4365D819C95F7D3B8932D45D726A14AD5B881A35ED53A6CEF33C262B3195DDE1E72D2A01833967ADC569ADEFB88ACF33CE2B3317D6E5456283DC47EA8A49E04BE09F100DA4A528E110088E5318B4CACFE46101C3CACBC84964925D4A0DAB94B91AD7C394060FB2F9CC8529671B3B84D59D41C07A5FC8D3D5A0A5C83526A501971AEE196E097C70994820CC88B408DE60C1F39FC267B83C220CE501C4A0590FA9B86D0BEE2FA343B3956324CD42E6CE5AD94092A2FAD6E59B975E5135A77B2BD254EDB3488455E6CD24F79C5B2957224AA5361F740E78AFE27319B9CCE99C492251344F0B1AE8EDCAE0DFAD2CE71495C9972825949001377207F1B7E62079FEADACCD5E2ED5552997D3B5189088B08E2042222E3A89C39C1654785294228F43725DCDEEE1FEB5308124B925CF3E7B69CE20799EA4A5612820043EA90FA7886FC8CDC13CB9F9EF8B7E03252A524A935A55BC0D5C3FF30D4827881AD68F773FCF8DEF15FE6DAB1A1C44293BC0F101B9F2B8FC63D062F797E48470B259AF4FAD74F65A1232DC07152FD1BAB50DFCAF48AD33DD521CEEC36EA418513E21279D8137B6F63E6631273302A9588C3A384B2D55A74BB35C1D3A8112D9765C898854D203A6ACDB68F6F0B6A62B2CD753B8B2A0974285C1215BC7483CBE5E7B63A461B2F9186972D53120384DC35C36ACF43CBAD0C46666B9B3C2D087570529CAD61BF3FBC40EB351BA54415CC722BDA3AF3FDFA9167C365F2972C2D0010402384392FD1F573F8A46BD9533533D52D692C540317B3DAB7BB50DF42C222798EA074951EF02A761C516DF91DF636E9B6109582519CB41140450587B6FF348B567995210A93338402AAD03EDA003DDD8C44DFCF5D244AF7079DA7EE9371FB8C5AB0780EE9344B95004783BBD0BEF7109AE4714B4252C03063C837D3D5A186B33C74AACA2520112153EE1D27D2F7E5B4ACBC1AADC229C8F4D05858EF51D124E1406E2A91AF95181E5E3CA19979BB8A90A5445C5FC8F9C74E62DD36C3C460CA4B101EF4FAB51A95DFAD4C3A97877341437A7F3EB0DF519BAA6CB85007FAB7B7AC7422FD075C3B4614901869F96D7DEFAC3A12000346BDF573BF88AFD2A959CD5C5154ACC0E40FE33E44EE4018752F0459CD01F60D6BE1D616461F4097D6B46E752F4FBD0462E664AFEE5DA62F1F8DFDDBE161826B26D46625C697FA53D046E70E59CA03757F1BD3C5A123B9829444A95F133CF19FD116A20F93FD49BFA368F5C770FFD8EDE2DEB1A85728FF52EDB9981F3FCF18FD1285D247FFA47DC08C19005E581D7FCC62AAA539CC9888337F7F23B7C2FCE709CCC44BC1944A586E270E457F1AB75A68D0BCB4265A492900914047A83A50EE2F7BC02ACA08014491B9076E77106F1D63EFC48A1099C90A0C41A8E6799A6E2FAE9681299D354000A52491462CDD756F61E35BB982D447888BC448BF49DB9F90DF0D1139026141961206B7048FA0D776F387F3B2E912A57794E221D98120F9BD6DB73856C3EA4A544ABC46F79F8F9EF617116E9853152D465ABBB62520B10D40472F7AC442FBC532524948705B67EB407939FB70ACD5482471F0DC820AA0D89E46E3DFF007401179361A64C9738CD4170A277B13E54FCB40BCB810998104F139701F913B52CE2D0EACE66B21104C9DA3981B91E97F3B79E1A6608561710084FEE34DCB03777D3C29A3C3544B5E1C28005B7D00DBC2961E20830EAD666E20825563E640B4F537F873BCE1BE232F4E3D09F95DAACCF5FAE9CFD68C710833ECE6C4DCBF81A79EDD19EA97355909E254CF98DE663CFD26DF18D3F41DC4B292914140DBD35D687CFC94C1604A5567259CF2AB1A8B575A8DDA2434D9A2B652FED6C26F6EB11163B5BE2710EBC110B52B86A76A86B0B1B736DC6B594C4C970070B90CD5FBB816160695A0897E599A2E5202FA589DFE307F1C4662B04A20921CB5473D77E85F9814868249492FF002BB102FEB6F7B3458393E64A58582AB2787FAC1FBFDF7E5CE3158C661BFEC2F5F99ADE15D7A575AC2A896439BD9852AC4BEB1AA95BED3BB4FABEEA8D87E8E8DC5417950070C6F0A026C3CEF3BE2898C9F86CAD049280946819C54B52EFF61E6A892AA0B3EDA791A7E62C7A0EC034D64094661DA0E6C9AD7C80E53305C20A08BAC10DAC83E844748B6206676B26E2499584415D6ABAA7836A1BBDAFD79EE24F0A5492C4534AD399AD1ADFE21C337D75A5B4C512E8B48B5474CA690529714CB6A5981B853A8E29F7CDC1C3CC364F8DCDC714E0B592494B3A58DAC3E9D7A46BC0EE52E0747B5ABA30D472B475AF51F6C59AA96F2330A9714B54FD58A1E5251CC2A1283C207AF96F8BFE43D84537793A4F11A28F121CD37D69D4EDD59CFC3CF5AD250E438AFA5B93781A36FD6DD55AFABAB5E73EB4D2DF4A8F857DE1B0246F17239C4F43EBDA7B23904AC2A4A512932CBFEE2069C8B52F5163CAD6DCA708B0904A8956A2BA695A3F5A54ED15C6639A3CD394D58BCD3B84A43850C4779F68006402608F39BF96D7D3819331425094028302A34E27346068D7A5A2DB86C38580172DC9E16511FB18EC68417F30D488857EA6CB154F507EB1F58AC514F842549248513204401CE7D7A62A7DBDECC77F92E289C40C30EE54CAE2BFCA6A5886F16F48EB9D92C9F0D3D72C280D2AC391A5F60DA72B47E80DF413E62DE61F47FF0064E92D04BED8CEBBD709971415992C2428993610624F4B5B1F9B9FEA872F9B967C4CCF659C519E81353C0B27E5A26C1C90EFE7A47B93E15E5F87C160125084A8D2C91CF46DB773473B47B3A0212121490BDE2C3CBCA4F203D27738F33489C661583352E08A3B372BFB6DE3A6E63DD95A099009E497722CF46DADBEF53AEB94534C5688111E1005EF1BF972B73C45E284C9988969188FEE70CDB8D8DFCAB611218432C4951320370A87084835E122AC3CDED48F25BDAB2B6BBFFC5E7B3204B24203FA9803C3B4D322796F020FC71DE3B31842BC927A913C02657CC2F50926B6E82D51CABC1FB50A9433843E0C319AE0B3595436D77FABC7AB54E7868284A129054C3455E1927C099E53F198F2DF1C2F379B8C958F98254C51489847083407888D7DDC476BC8F0D859D97CA54C9284932D2C0A43DB524736AEBBC2E14EC8325092B804D85CC5BC85B903EE8C4A499D3D5201571061B9A96F0D796BA188E9D81C01C67089681534606CE76DCFE221FAF1B791A6B3BA86929E16B26CD14E3600F19144F70DE0C41BC5C6263229AF8AC3A66A8F12B1128A0D411FEE0241B1F173F730DDB6C1E1B0F934F9D2A5241125668904512696DDFC0C7C74EAAD78F54E7BA8E85D2AA7E0CE730484892920573C36063D3A5B9463EB17C2DC189F9560F8940FFB32D9D8FF006063BFDC9A88F8FF00F15FB55FA4CE3112C0349CB000A37CDEEDE1486BA4CA737D595F4F4F44DB8780F0F72A96D3565C8BF784009E1113E2C745CE30586C1CA56257313FED8E23C243F9024B1D5A9CC473BC1E74BCD148929155B301FF00736BF6E717552765234BD3B75F9DE4B505D653C6DB050EAD92A5899FAD2525B3C8DCF5F7F3F5FC43C221472F958D4495717013C40A85588E17DAACC0EB68B3CFEC362E64838B3216470F1F10496B3D4FD47942456619FE7B52D653434DF51A7A7E24B25A42528602A64ADC484A5E9E8A51E1B6D189B09C0FE8E6637BD0B9B39214B593C5C647ED29492787C39C73A9D8D9F84C5FE94B8659480EC4176F176B7D3495E4DA0E93295A733CE72F7350D7892EA69D2E28B4A3211C4194AC1DC6F698B6397E6FDAC95809CA9499E996A0AB93A38DF96B70E6F17DC0F62B159EE1FBD44952F892FF00B5EFD0381C9FC18D63BAA6BB33A52F36285DCB929FF84C10A6D6DA0C9F1029413E188E2FBB1D0BB199A65F9C4BE35AE59596FDC52A0A7A30AD35A6B15ECCFB233F20528CF94521C9A829147D2FF626FAC41D9CE93528465C285FCC2BEB894B496CB8A51524F2080A1CC4DFE76C5833C9596E5E8562A6E224C99680E949524F16BFF2046F60748D3229189C4CDE091215398B3004DF981A0EB4A0DA27F94F6579952B4C669AB296A68D2EA92ACA2816CB8555414A1DE0052906DE1DC1EBB639D27B7B93E2272F092FB92CE933810784876241BBB72D758B566395E6D864248CBA77090C7E45077F0BD28D485FAF2B339D26C50D3D2D3D569CA5AA491DFB94AE3A1C4881214E204483D441331CF1BE1E6E0313350B463E54CE253F0256950AE84051DDAA2DA4404ECBB16A92B33B08B96C29C40D05DEA01B7F9ABC52BA87508CB5483F5AFAD3AF24A9CA82384AD452083C3B02276E73B6D8EB192659271B2E5F772D20331501C54F01CBDD445352489D312F54A99A8FE1AF3F08A773CD646566403C8CF999D8833CAFE7B62F597F66CF106451C3A9835F636DD85DE1624E9E5BFBF22D5D08ABB36D53F598E2708E19BF15CF3BDC7588C5F703D9E4CB0974D5AA1AB50CFD4302F4D61CA5254453AB69D3D748AF735D4083C52E1EB1C4479723BDBA7E0459F0B94A5000096AD9AAF46A9F51E5A0859325C907A3EAFC86BA7BBC12B73F68B88594778A01690F178A031C40832926153CB7239DB1B4CCA0CCC5E1D610084A9DAE28DB126BF8D5A27F0004AC1CF0402AE1B9069422C76A5BC225DD957613DAE76E4C6A66BB23D3CEEA9AFD32AA75D586AA50CF748AC2A578B8C904700306F611BE28DF1A7E20657D8691949C7CF460A6630284A429871776520B10D5F017D5A935F0FF00B213BB4D371E65CA54D12880CC4E86DE5A7A5E2A0ED234A6A9ECCF5256E92D6B96AB28D4D96142731A353E1D5214E242D01412400384F2DCC1BC63A07C21ED3E1BB5F942F15879A99C829470A8317770C0FA59C6ADAE734ECA2F20CC528992CCB06654314D9B5F3E5A456157992493E2DC5AFF0018F5F2F3DA71D6F0D94A44D9930A5C1219EB6B7AD6A5B5BBC63B440A9186421AC28FC853DD7EEC6EE6095ECA262473B4F5E5D45883C84626E5609291448716E54DDFCBFC4472243CA4921E8ED5E5D1DF52417D4B59ADEAC02615D64933F21F77A83E4E9184A82534B966FB9AF56E70A230E285827A56DBD6FB3F5867A8AB4920F175D89B8163791E9704FB8CE1E4BC182430706E763CAE6E21D4BC33800077D68D47AB1B7BAC372EAC6FC4608224EDD391803D7E18708C154B80E19DCFF3434E7A43A1863F2B33694F47AB1A7836CD1ADBAC4A64F11B98DF90F79E7875FA5E160DE94A575377D7F98728C2392784BB6DCEBAD2BA6958E175A08038E7717206FBC926FEE8C6C9C3D4FCBEFC2BF6854E149B20BEAFB741BB743091CCC1488EEC933B9E5E5CCFE07CB0A8C3B8A8D742DF5F41A78C6461535E2A7D69E3CCEB78D5FC51FEB1EE18CFE993AA5FA91F983F4A8AB971D2B4B5493E8D0E1495DC6CBAF39501A5330024A67BC0B3004F2F5F7629FDA0C1A5536532C4B636B95390481A3F87DA18E230C7BD972D128CC4CC77502C11C350E357BB3E94A9A6972ADB5FD692D3A9A3701680A92A0E719598F0B64C6C48D8F2E58C62E72725C21C4E226F04A4A38895960400F724742DB30D00E83D9CC8862F0DC265712D88059F90637B30229BEC0595A6FB32D55A9F2ECCAB729CAB32ACA3C99943D5D99268AA4310E24AD04ABBBE048B45947DF0239D4AF8A7D9AC6E3D3814E3F0DDFA97C28477A80B2A70FC20A9CB78DCC2799F6233390B33132D66597247012002F5D74E86915A8CD2B5C72A51564D1AE956A69B70A78CACA1452A1C02F3298163E831D6A41972B069C54C295485238CA8AC335DC9A7F2D6D4B5C1F644CCF9420AD6A241604104E9677E4DB44F74B767FA9F57E5B579B655A7B33CD90C20BB595C9A5AA699A64B61452A24B45A5029178200FBB94E7BF18BB39946612B2EC2E370C674D982594098877E262C389DDDFC9EC4C4F0EC2E324CA066CB522500AE005069A9A8A914D6D5862A2AA4512E9DDA9571B8D2AA1B5B1B290A6CA9041024CA488BEF1E78E8786E1CEF069C62450A02D2A1FB4821CB69C874A450F39C957852A48B28906837FE6A07D840D6726ACAE4F025B24A5237B93631723DD699DF1A6580778B92AFDC0B01D1DE86956BB5DCDA2BE32C095213FB9CEDB11D79B72F0872A7AE91E9E67EEDF6B74E73D5FE2B0CE8259F930EB4F643E90F4E0061C0570D5AA6E3C5EC6E7D22434398250492A2640B93B46FBDF975FC0E20CE1DC9252C4934059BDFE68290C8A4CC253A0D2953B8AFDF9F496D06669041E2BDA21476F8EDF7EFE586389C30AD03D6AD4BFB6A168D152002771A558F377FBFDDA6995E6A94A95E3224833C47CB6BFE43CF6C55F1984624A8380E053EB4D39E90D94185410A0F4AD7A731EEB48EEFEA4D77479252AF2ED2EC314A96D250A791DD83000BF88024983B6C7CED8F2FE5F2B159ACEE2C5256A5ACFF00738034B160586A767021D9E15324103503DF58EAE6AED6A97D6971FCC5EACAD1C64B3C4B09428EF1E2298B721237E738EBBD9EEC22310D366A42258296200A825BC5A8C45EB58D84924EB7DABEFEBA0A18EBB6A8D522BD4B4BEE2E98A49809528CF99E1D86D73C84D8C476BC9BB2F84C0CB4A932D130001D4A6480DB0259DF97A429FA550A31074E7BF4D5B72F78A8736CCEB9D5B4C37DE55074A934EB6817140CC1909E2373D7CF718B94B5E53859478E74894784BA0A904D05831D0D1EBCDA2CF91E5986C413FA852659A37151DF968F4D236E4FD96F6B9A9DE42729A15AA85D23C6F06D9E14AA2E7BE00C409EA7A6D8A3665DB8C264EB599684CE0825B816C684B38483ADA8CD56117C9794E0A4CB79650A0055A8F461F5A569D69169D1FB2556B259CC3576AA6B2A091C4E5325B6EABBC9890436E1E189FEDBC8E98A663FE3263D73E5093819894F1101B88155280FCB6E76035BC45CCC74B9426489412A3C4385419C005C80CE4BFAD75A0794763DD87E9FCC5A7334A819C901417097D89213127849893B1DAE7A5A37B5BDB0CEB3DC8B1457266E18092A62144B82935A00CCCED4E82B16DECE674AC22E58528A7898026868DFC0A53CA3EE03E86DA1D2543EC5FA019D1F972B2EA39CD4477AE3A14057AE08EF0DAFD2C2DCB1F017FA8F38D9FDB8CD25E2F11DE244CFF6A802925892E412A3CB88B801C56B1EF1F837987EA700389355004A8B905C13FE45FABC7ACA84A9284C99266474B8EB279CC4FCF1E5D9397CF13261134A413B9AED7FAF5A476AC5CF4861C1C4776B0E8DAB7DEF0933104A50A0762094A60D8103AFDC0F4E738DA4E0569C54B0B98684B924D6ECD5DF61A7587B839D2CA1654001C35A5A87F9DDAEF48F33BDA9ABF2F4FB577B32B6E368EFBBDD4BC20800ABFCB372424DCC0E9CB7E98EF9D90C2CC392E604ACB2658E100D4D0DAAE7ADE388F6AB17874E71292A97FF00E630346FDC2A36F623D30A31C6CD3AA3C219660721FCA4C5B9CDBF1C7259B2509C6E256A524A8CC3C2EDFF00222DBFDFC23AEE5B342F2D9440E11DDF9B871F9F17E71B908714F49802E77E97F81DFE6061CAD52C4A60CE41A02CE1BFC7973AD6E5C9C4AB1C5452A090B2C482C2A77FF3D4888E6B2E3774AEA26511DF2F26CD12D091E22285F88E5BFC46F8DF2B9DC18FC299859A721A97216920817F5AD3AC3FED6611589C871A07EF4E1D756FFB0E9E6E7E8098F90FA6ECDA9EA7516A6CD357A90C3633BCC56D78924280AEA8200283D2279DCF4C7D2EF869DA6C5CACB30DC1296DDD203D69F2800DAAC757BC7C4BF8C792255DA1C50E2048C42C5F751D743F4D9EB0E8EE76D51D7B74FA66943CCE5EE35C4C349F155265370E04F123840B998DE77C755FF534E272EC7E2312A2B9E994BEEF8C90124A486E13436614A748AD64395230D9865E388042A6238CDC5D37D1A95D478D7DD6EC934769FED6FD96E82B337C929575AEE5B5AB7A987766A5B5529594F13E91DE8928B49079729C7CDDED676B731CABB6D394A339027E300487504B05B0205850B9661E71F47724EC46599C762A64DC22A5CF9C8C239084A5441E07A90E0171CCF311E2EEA7CFC653599E69EC969052A72EAAA969D4148EF29D21D73861C52429C2A026C48000EB18F76763710ACC7B392B309DC6168C2F15492144CB35634A31E6795447CD3EDD65389CB7B5E70AA92A42558C290188FF00F319B9F869ADE3D58FA3C3B28CA33AECE6BF5BEA2A76733467A406175C84A52834CF2DA50497A5224DADCE37B63C55F157B6389C3E73324E1714501135695B176F9A9A1F1711F48FE057C3CC366191CAC462B0E95F14A41495258074814D76AFD691D5CFA403B28CDF24ED3720A9D3540D51E4DA8BEB7F5B094B6DB4D2699A4849E22129209322201F3C760F81F9FCFCC30AA973318A54C40485A8124BA8D280DC78D7CA391FF531D8D9191F02F0B2C251F31570A40A029ABF4AD746B8887FB20F66D91D476B9A4F2FCC6859CD65756AA84A825C4A0A5A2B4F1C71A45C5A472816C4EFC699F9865D951C4A7319A014FCA975077206A473A8D2F1CD3E036024E6B9870CBC1A715C0B4F79404258D5FE53A0AD7AB5045D1EDE1DA9E96ECEBB5CEC972CA3A0A5A5CA74EBB5EAD48865B42B81B710D2E9F8D9420A956981C2666D8E19D83C266F9B23133CE266290B4A9D64A884B850DCDDDEF4A9348F58F6C256478491264FFA6C94AD80092948515001EE01BFE2D48EB97B607B5EF62DDA7685CBB28D06C37519BD2D3210E3832E76894D38037C652A718471EC762769E77EF3F073E1B6759A6638B9AAC74C9B2913905BBC2B48471925FE62D4E8ED68F3F7C431809981693804619625AC06481C6480DFDA34634DDAB68F22739D68BAB6D0E0A97EADC1DE175A4D33884B026C0391C2B1020F0CC45F79C7BFFB3D84C9F2597FA5C462E4255292848599882A5961C4384AFE562750E4C78F8767F375E3311311859AB965648012A00004EA017E474F28AAF35D4B59561468E96AAA409934EC3AF8B1DBF94857A72DA0F41D07099B767247089B99E1D0542814A46875756FD7CE26B0FD94CFA785775974F98CD6428EF7F969E3E1159E61A8AA0294D3A87699E132DBE95B2B3E5C0E2524C499F4BD862F395E2328C6B1C262E4CE701B8549376D028DDA8FE71BCFC8733C00FF00E6F0B370E752A490EDC940575D85DACF09CDF3DA8209E3299B03313E9B4CF31E91899C5FE932F94666216994801F894C186A5DC7D5B5D042984CBF1189253265296AA330249F2D0D869E31147EB2B5E6BBC3956695C82470FD5A96ADC41837975A6CA52204DD5D205A04049ED7764D13C22666D8497312AE101531018920070577EB4899576673DEED43F433D12D49AABBA5916A5386DCFF0088FA24FF00C3F34FFC4F38F69DEF288501A4A6D32426A521C5A78A9DE3F65E128248E8279EC4E3E6C7F5FBDA5C0E3335EC649C163538D4C95E278D522604865AA5900842AADB97F3B7AD7FA5DECB9948CD5799A4A030215365F0E8AA7CC0077F2EAE23C90FA4F9F799F6D1ED756B1C2555196A65238504229624204045A2605EE4E3D39FD1162A7627213278569C3A254A290B51506A93F329F9EAD63AC56BE39E5584959AA7F4265CC5198A7086705E96BD741EA1A3CFB62A6AAA96B14ECBF544D9229D972A15249E4D25667CA3F1C7BB3199FE43810462730C348EEDF8B8E621268F4AA9361E6F1C1734C9F3198A93C7849C525B80842D4EE06C08D75DA123D499CD2F78E55E5799D2B523C5534354C220EC789D6D222F3BFBCCDE1307F11BB1588C51C3CBCF708B9A5410940992C9772187CFE6DE10F53D97CDD3290AFD0CF08E176521428C1B4766360073B4332EA9D75410D256B52E7850D852D4A22660264FC26224C62ED3331CBF0D253899B88968C3A805A6628865248705C9666E7E17847FD1F1B2D410AC3AD2A51FDBC25DDF52DE97F186EAA5D43062A1B758528F843C85B73D63BC026046D244EF8532ACF327CD57DDE5F8C953D4925C2169241ABBB13F4B36D0FD792E370C90A9D8698806A92524537A86DAAFBD748481C71E3C0CA5C79667C2DA14B51F720127A9306D7EB896C663307974B13719391211565AC8F17A8F74D61F61320CCF1C954CC361664D4A3F7292951677BB258D053ED78D2E9A964F0B8CBAD2B925D6D4857C160131CEC7E186D97E7D93666B28C163E4CF502C52852491D589FA427FE9D8996A32D72D499828A0526EE69B0F7CE13A5558F71772D3EEF0DD61A69C584FFEAE049299E40C4F2C3AC666795E585031B8A9520ACB242D690F6B3900D4EC5EB5348772F25C74D415A30D316848752824F08BD7F6BB53F98D68A9712EF74A4385E5FD96D2DAD4E123786E0A8FB87CB0D319DA3C87052933B139848932D41C294B400433EFEDE12939662F1333BA91216A5A4F094A52A517766A5AADD7CA1CCD2E6E96FBE5E519AA59DFBD396D586E3AF7859E1F3DF11586EDD76471733BAC3E75849B3096094CD412EEDA178959FD8FCFF0D2FBD9D97CF972D9F8952D6CCCEF61A08D2DD653394D52D5532424800B8A25B2D284C4A6CAB9226622DB8B61CE6B81C3E3A4A71D22705F7693351C350A08054E5A961476DB788FC160CAB12996B4578825448B0763D3A781E7ED87D1C5F46D7651ED01A2D1DAD76D5AE32BCAF4AD3B89A84D1D656314EA7514EF10524FD65A7374581078B90BC1F9A5FD527F5419DE4017D9AC9B289F8A9C53364A972F8C04708677082F67BBD3C63D37F0FBB2194A9289D331929165709625CB96297D6DD23E8A352763BECDDA0BD8D7B435762D94652FE4C9C86A1A7B3A453B6F2AA1746D3EDA16DBCF214A212E20DDB70C8E626FF363B07DBCED3E63F12726CC733C5E310538A9B351853366A59D5C452A4F1071703886CC184764CCBB37835E5AB972F08853240337841715AD459B5F5BC7CE37D1D3EC0BD9C7B4E506AAED5FB5CED2B2BC9F4A6439EE60E1A2AE14F4A5D6D19A54A3BB014FB4E2802D40213B444E3E907C52FEABFB4DD9AECAE5D91E4DD9EC4E3F159AE0E64B13E5A9694CBEE258E251504101C56A43E95B50324EC4E469C619B89C6C99650B1FEDAB841249B00F4AF237D9E3E9B321F67CF66FD2BEC9FAAEAFB23C9F24CE3237B4D66ED8CE986987455B941495282B4B8A42D40A5D41921773D6063E6164DF157B5DDA0F899819B9862317215FEA282252D7308495CE4F121A80B3B07A8F37E87DA3ECCE00E4CB99859289A132DF8D207CAD7AB5776DF5A47E7EB99553CAD5DA81FA670AD946A3CF5A4B53E14A5BCCAA5B09126200004011D06C31FA51F85AB389EC06553B17F2CC9D8294A73534969F534A3B11D23C5FDB3C261E54F9C94949505101340CC5BCB4D3ADDD61A9E179C360A20152428409120743783F3DF0D64CE50CDA62250E24998C4836A9B36F5F50D578E6D2240E30E011FDA4EB537A68DF4BC2EA5AD22C5422473E91B19FDF3DF17B9D870653B7F66CE6CFCABE5BBDE15CC30EA4C8701C0069D28F4FCDAD687715CA44428136BCC6DB72B72B73B46D18ABC896A993660092C341AFDC59ACC1BC62B3224BAD4EF7DBDFB2D787EA0CC9700C9E5CF6E5204D8F4F913CCC46195574B06EB7AB81AF8E9CC18DD72D9C1A8FA3F5BDEE225B419A2E6EBFEDD95B79DBDE3DFD6715AC7619469C06AE280F4FF01C5BAB329A9B38FF00D5CEB4B794762B54E6C071A83A41333E237F58DBA5EF7DE71C7A565D225E253C12921883448152281C6D51B4339649559857C6F7DAAD7D6281CFF365B6EB4FB0A9711DE44999E4678A6C7AF58C769ECFE110BC1842C3215C2EC360E2CDE21CED13786AF8375E9EBD1B5178A7EBB33ABCC332397B6477F5B534F4EA240801D712824721014762248DF125DA5E2C2E54461D4A4044B515106AC2B73CAA7D889895278A6254A4FC86C79B0E5A901AC3AD63BE792F641A23B2BCAB2CA9CD69855E76ED326AB89D4AD694ADD6D2E8B282907EDCF3DA48031E5F38ECCB35C73E1B1737F4FDEA90085AABF310AA39208E7F888CCD676264CE0B0B29516A804381414040EA79B934AC573AED1B387EA1C6A90B34797A014A034869A21116FB294AB94FAEF8EB196F667032A44B99350A9B3D41255C4B591C4C0BB17162697DAD161C063316BC1CC2A9A543828EEE457C6CEFCBA5285CF359E62BAEA86E81D76A5E724A94BA8500929499E14AD445FC85E3DD8B22B29CBD6A92956165A96183809716636ADA9EDA23275CD5E3546628A92A5901DCB876677E74F3A98AD6B350D7BB46E2EAEA453BEEBED0727857094BC018BF4990236DB1359E76764CCECFE365230E90A561A6540AA7E451156AD3DE9178C405CBC5E0FBB0CEA4B80F40E9A96F36F311F6FF00F44CFB487627A07D8CBB31C8339D5749499930D6646A43A8292A5AEB0AC0054A093626627CF1F9D6FEA4BB1B9D49F8859DCF5C92705371044859500ECE08FF0095F4E4C358F7CFC27CD64E5B92E1C14FFB9DD8E335776A58789FE5A3D3C67DAE7B07A893FE35A0513B789223FF00783D368C79E667657311C24E1C8059994039DE86DC8C75D91DAA91312B2A092C39967F06F7CDA305FB55F624AA86186B5AD125D7C90DA000E070CC09F19E1DC7BB6DB0CF19D97C6257294B42A5A9C355DF97F9BBDAB0CD1DAE90913425600D6F5607D456DBBBB831D07F690ED5FB27CD3DA6FB08D495F9AB0EFF0085179EAFBE43842426B29D00294942B8556BDC1B74138EDDD8FECCE3E6F67B1C6493DFF749E04B0D01E2BB5EB7B4705ED876C24FFAEE140AA0CE72412EFC405B9791FAF7968BDAE3B1147749FF001C51381D6DB4A29F8384B2A420050278A4C9EB1B5A0638D637B25982F1B3D2B796B4CC5380417254FEA5FA73AC77197DBBC2E0B2FC12952C282E527889A30090C0536D47DA256DFB4AF63B52D17D3AB290242642B626D22DC40CEFBFA7A88ECCE612CA122515B9B920077D9CF21B35ED12D84EDCE027CA331284B84972D504F36372E5C0A39BC42754FB4E7636E64F9B32CEADA572BD596662C52B009056E3D4AEA001E21CD437F8EC70FD190E2B0D9860538895DDF14D965831765A6ED43B78D4456B3BEDA8C46539A32C1692B09029FDAA05CD3DDA823E726BB4D6A1D439C662AAA74D2E46E667983E97C29278D976A9E701001076563E90760D587C2E43841DC85CC3212C1AAAF94063E8FE11F1E3E27E67FA8ED1E2C951FF00F10B377BA8F3DEE1F76D1D5A15A4F42B81592559CCF34752A43E56C2D2195A92522EE05257C526FC8EFE53B2E4E2B3454D95DCAA44A7AA41278C39B6C035999AB668AC23303225CA5057FB80122B66622BE9EAD1EA67D1C3DA356E6B4DAD74267D5014D965A4E5ECACA600A843AB73BB40B0B284C0DA77E5E47FEA07B392F2DCC32FC7C99211DDCCE359081F310A4DC9036AB9FCC7D02FE947B5666659986131F33BE4CD95C284CC53B5160F08579EBA691E6DFB57D02F43FB446ADD2F48CA826B336CAD9A6436D1850AE711DE59293301D2609B795E3D03F0CBB5D82C6F60569529089D2706B4A8135044B291B3500F0E748E49F1ABB1E319DB5C26270F2190BC5B92948ABAC56800F46D9DDE3D63D679EB5ECDDECA7A4B4FD3D70A0AFA85E55514DC09EE9C70565753543E0410612975415CA3717B785F3FC9A7769F3FCCE76154A9A11885BB025BE657E29A1AF87B5BB159B49EC8F6772F913C0940E1D00020020F025DF7B86F1140219FDB652DEBAF673CB7B42A1A84D65465397D0AA9DF6520281A92C21F3C683E466F3F3C74CF833982BB31DA219762014AA7CC9685A9668CED650DCEDA5ACFC77E3BC8576AB239936534E2A9534A384026B4D37B80C28D778A1FE8BBD38ACC751F6A7AE3362A552E434B4151953EE712D3E0A675555C04CC41410A8FBA23A6FF005398DF9BB3D83C3AF8D3981095049A2788CB0280B7F73D5E28DFD1B7674E447B478BCCE571197F34B334587FB960A0478383D2F1D00EDF3B4DCB3B5FF6D6CC1CAD6C57698AECE692810DF787BAFF002FC34CE0481B12B490A81EA2F8BA7647E1F4EECC760A7E2952D4A5E2704660590470BCB2A0C5BFEEA6BE04449FC40ED2C8CE7B5D2F0B8629E04E2420A50A0430500D4F3A6D631D85FA4C7B09ECFBB23ECBF446A9D0990B397BF5B42DBB59DDA882F71A29E49E202D0B5796E76C3CFE9073EC42737ED665B8C9866210660725C83FEF70B29CF0B10051ACC6AC218FC68C99183C26453652693929E2012CF496EECE68EEFD6DADC5EC3BEC93D82F6D9ECCF95EAED55A69877387A87303535EA75C49A782E214E10980B800AAE6D1CB1CA7E2E7C43ED4766FB6F3F0F85C6CF121589504A12B57FB80AE8007A338D2FB88E87D81EC064D9BE469C5CDC1CA0A449054B29490E52EE695766F13E1D77CB7B55FA307D95F5337D966A5ADA5CE7575066CE50E74A5D0E6150D2DDCCAACA695B0EF03AD00D77A124A55102F187F2FFF00BD4ED5E0F119A617178CC26151251370C4052C21900AEC6BC446BBC5C3B2C9EC56598D56031587C199A66776C5281A90033737E8417878FA4D3D843B14CDBB0EA1F692EC3F29672E6F2DA36F31AB5D138E38DE60D661DDF7278388251DCA16491C2798306062D1F007E3B76A724ED88ECFF6AB319B3947132E5494CD74F02428853D4D081AB0B1B8880F8E1F0DB28CC72F46332AC24A948EECA94A9612D514B0B3EDCE3C95FA3EFD8CAB7DAFFB5072873D529AD09A51F4AB3B7B825B525C0A52525692950F1B651E156F36C7B53FAA0F8D583ECA76572F5659344DC6E61872112E5CDF996B2945B87626B7B4713F853F0CF0F88C7CC33D2172E52D24852416626EEE28CCD7F331ED076B5DA3FD17FEC44ED37657AB32FCAEA3324B69A5D4714B53982DA70B63B9529C6DB78B654553E150BEE4C63E7164B86F8B7DBDC662B32C1CFCCF0F216A13249489AA4A03BB3BB105FF00168F54CEC1F63B2E912F0B3F0B8452929E151504024D8D1BF8AEF1DBDF602D2BECA39865BDA876B9ECBD5AC3B9676954F42FE7397B02A1B5529CB5A712C0522A085A78C95010948E5046DC7FE30663DAFCB73DC932DED38C44D9A89FDD89B394A257F3201531729091A3F3ABD1DE5792E513F038E393AA5C80B40F96530268A37074F1A7311F2D9EDD9A0F5876C5F48CEABECE34B65EED466DAC334A1A4A4A169216B534C53A1352E955FBBEEDA25C85471011D4E3EBE7F4EFDAEC8FE1E7C239B9DE3B1B2A4ABFD3CCCEF145293C5C059342093C54E57358F3EE33E1D4DCC3B4015899AA9A9EF8B25609A055C13AB55A3DB2D21EC57EC31F474F627956BBF6A534555A86AA958AB7EB6A8543AF5454B8A42C34DD134A70ABBA5B81B3C283B49006DE1EED3FC50F89FF001AFB4999E1BB0F331872FC36226A672F0F314A010A52C24802B5636F08EDEBEC6F65F26C1E1978F93875AD284901410E4802E48247E5CD843AE8CED37E8AFF006F2AD1D8C694A4CA58D699834E31434BF52AACB54C843656DAD0FA9A612F153402880A244C1BEFCFE7E59F15FE1E6608CFF1F3F349F2B053113664B519C12A2140A81724338E90DE68ECAE3C8C2E1B0987750605212785A9B397B5DED68F1D7DACBD88321F60BF6BAEC9B33D4CDFF17EC2359674ED3525229B506128796C539429E1DE3A65EA800159F43C3B7B8BB2DFD48E3BE26FC3CC660A5625597E719560D689A9E22B521610A0826DC5C5C1D45758A2E73F0FF0D2F32C34D4E113DCAE62492122A388122DABBB73AB3476CBE995F611EC7B40F609A23B68EC4B4CA74F30DE5B435D9C2A9DC79F4D50CC51485A512BB2203AA22DD7D71CE3FA55FEA0FB519476C336C176971F331C9FD6777253314DC23BC58701C9A863A8F38DBE28F65B2EC365584560F06842D329D44243BB26EC0BEB61F58EB77D0CBEC69A0BDA2B5EEAECF3B48C9115DA5F4A379686DFA9714DD3B8BAE6149578EC9052E8B4F31B49C7A03FAD0FEA531B90766B2CC264188386C66310A226CB554B942943875A1ABD5E25BFA7ECBB2BC6E0B35958DC14B9CAEEF853C4134A2C3D41AFD77148CFE9C5F64DD15ECCDAABB21CCFB27D389CB322D4633E5E7556C294EB01146DA0B01448291C4498BFCB101FD0C7C4BCC3B6D8BCE26E7799ACAB02252D6664C241E30A51A1506B6C45F68E55F113B372324CE3113A5C905136728CA4705140ACD1EA035F9DDACFD87FA2DFD917D9F35B7B1EEBFF00682ED6B49359BFD7B23CC6A324CC2A5E7996D353963756DA8A00849979B48E524629DFD62FF501DA7C27C41C9F24EC7E70B9185C04E50C6CB90D30CC1F229292C5C380776D8BD7A9FC3CC8F2AC66478B18FC1CB13264A696A5330252AAFEDAFBA433FD16FF0047C7633ED01946B2F6A3ED7329198689CB736CF1CD319170BC80D51E519856D354789985B83829D2BF1209E84E3867C56FEA47B5D9965594653879D88C2E2B13284A5CFEF540A0808054524A5F8AA7C1F9C2BD81F875976133AC563674B973A4A269584148660A510CEE282EECE03C76133EF6D8FA209F5EAEEC8F37CAB2FC8AA72466B32CA247F07CC5C73EBADB6FB2905F14C140FD612920A951B99E78A9F6313F19666639763324CDF31C62A6E2242A68016A4AE5AA624CCA9240F95EDCAACC23B1F6C71BD9E9992CCC20CAA42572E4A92662529BF0900B04D5A80D5CF947CB7F6DD98682A9ED2754D0690A448D286B5E772AAC69C7385FA7756E38D1088E26F852A40009E77BC63EF5FC2D19AE27B2182979895FEAE6609099895D4998A9490B725EA0B9602C0DE3E7D66984C361F1F8E992F86B3144240FD9F329AD43EEA5DA204E7699DA05168C4E8ACBB50E6F43A64D7D10EE28B31A9A50106B10B221879060991D0DE6C4638DF6FBE086071B85CDB35C76024CF294CC9A17325A4AAA16A35209A0E679984BB3798E2E5E6F874CBC64CE033405490EC9AB0ABB1E63611F719ECCB4196577D12940C55079D6DCD299BA9CAA7DC75C71C5F0BCA256E2CF1AFC7B1528C998C7C5CCCB0B87C17C7E46130C844AC2231E89699290004D92599AE6E1BD23E876569953FB10B98B960CE18572BA12FC14D3CBEF1F1263B45D6195D26A5D1596EA0CCB2FD38ACFB37416286B9FA34A93FC52A5442FEAEF2146E49BDCDED8FB5123E10651987C3D938FC560244E9BFE9C572CAA524A83C804949524A83BD5887E758F9EFDA2C6E6327B52A12F1B350062FF00E902B0923BC6625C69C888FB62FA37436DFD10F45C0FD454A91A67582955352FBD50EB8A5AEB4925D794B70DC9FEA81E58F87FDB0C1E1B24F8E786C34A9489586959AA1299694A5213FEEA1DE81DCEEE7C9A3DDDD9793FAAEC4A97894F78B5610152C977F91C13B6E1B6E71F0D41E4FF0019D517B1D4F9FDE7AE6F567CB97A48DB6C7E8E7B00A188F879911C3B07CBA58615A8949B3035F060DAD63E7B76F113067F8C96147804E5F0DD802A3FC39F106F07D6386A5E954FD98127A6D791711D3117D9EC22E566589993417E371C557D4DFD3FCC56E4E19425CB2454025F5AF2BEBBF4D442B65F4A549F1117D8133B9DBF111118E9C7826CA5310DC2CD7D0FBB51F70D0EE6CB070EB0A0F42DCEF4F5ADDEA21DCD581C104806C04932237EA6F6F33E51882C348EEE6CCF9581347D1AE08A8FA3F28AAA241EF4B503D5875A537EBE46EED495890078A368BED3D3E23F29BE179A8490C589624F869F6DFCDA313648276D542BF9E477DED125A1AE4C99267C30677DAFB99FC09DE4E21B13265F1D520835622C4EC74F388C9F29945C5363CF5A1AFA9F38BB35566EB3C70BEBFD43CE36900188FC0922390232E2A9C9530A9AB077DFEC7D98889490A55ACD5AD7EBAEDA738A4F33AB7EA52E21A5C3A2E825406D1363E5CB68BCE3AAE4321387929EF43A05F50E5DB4B124B7B1161C248B52A0723BB1DBE9BC55D5D555F97D6B398A163BFA5ACA575C3292785A7D0B31FF00D2920C5AF8CF69B0C313835CB961C290B4816A28105EDBB1B78C5A70187965491387FB6012F5A16A73D06DA7231EC2D0E6343DB5F64794EA9C890DD4667945070670DA16953A8521096592A6EEA121063C33F7E3C9887ECA769A7E0318A29C3626705604A87CAE3E69B7A0209D6F0CB37C009C25CC4A6A824289A382ED4DF7DDF58F3FF55D53A8A8ACA6756ED33ACB8A429B295A4D94531C8F974DCDB1DD70D99499F230FC052470804820B8206BEBAC38C2614A306BA31092CFBB6C3D19BEC6A1CE2A1B6E94D552D6298A961412A012A529C0E2A0DA64409E7127A0C5AF0384EFE64A524D8855BF8A03AF2E710793A267EB485A010A98782AC181A8A16F0FA51E155F574F58EBB978796F3ED86D6E28A54890A0144126DB74F77417FCC241959262E7CC4A512BF4B31C382C532C87BEB52CEFD63A16225A9388C0CD029C69AB87A902B7D3AFD63ED77E88CF630EC27B6BF627ECBB55EB6D3F559D57BA33712D66B5F441A28AF536ABB0E212E714011702DEA7F365FD5776CF189F8939D6065CC12F0786C47FB44049E2E2249AD598BFD2CE23DE1F0CB234E3B22913520F11949E2150CE06A59F5FA3B523D456BE8DBF65AA623FFE03AE03911A9336303CA1FF0021D463CC333B578E584BE2980141C29D7EC2C1FA474DC3F64C244D704F10B329CDDF97AD18C3831F47AFB34D0BED3B4FA1EB42D0AE20E2B50666AEECA60A6389D26FE5CF0C31DDAB9E152C4F9C95936F9406F001E9EE86AC91D9204CE025100DEF5A3FB60199F58E8D7B457B34F63B90FB4CF611A5D9D2D50FB1AC1CCF9A52179BD60211434C9FEA53849B120472B0C769EC576BE6A3B3F8FE09E1333BA1C33784167E270DD287626D568E0BDB0EC71FF5FC277608499C1856EE1CF8F883AD8C776E9BE8F0F65F3DCD4AB485635565B6DCA8FF00E399990494050801E001E4607AE3924FED5E28E37124CD1326198A2E400D521C001B6A0B58EF1DE25FC3DFD5E5B81EF16C44A4B062744EA0E8DEBA6B2647B107B36D3B229C698AC526200FE31997DFDECDED68F3C03B439AAD49299818170191C9B41AF3A1B81489BC2FC3993230EB48554A7FEEE7CFF817D4B4373EF61DF66CCBA92B734674A568CC6932FCC2AA8E737CCD490B6695C7495254EF0C4A07DA91CE3A3E959C63B178EC1AF10B0A289F252FF2820296806D5B00ECF50FD28D9D7638E132ACD5810F26656BA254CF50FB7947831A8B5585D456D065B50728A0A5CC6BE999640FAC1E062ADC6805289E2D900DE37DE44E3EA4760F2892AC83033D127BE52F0F2CB92DC24A126D50F577AB97A5488F8E5F14303364F6931891C494A3113372FF00316D0FD39EB157E6DA919CBE1798BCDD436A5781D84A0C922E40F14926D72676BC0C746CBB234CB13172FE4580EA05360493737A1D08F431465F7E664841258D0726605EFBEAFBC7643D8BFB54CD727F689D274B96075594666E3E8AF5281699504D390D7138B0126E6DE2BEC271E5CFEA1B24978ACBA74D080A5484AD5C406C1E80835A3787311EA5F835DA09FD9DC760E54B9851FA85A1376FDC4021AAF43AD9EF1E95FB45F61995EA4F69BEC673E6F2B15CAD6AF57D4E6CA292A43472CA765CA72B51494DC8944C49B0DF1E36EC176EE6E5F2339C12A62A5CA96932C20A8BFCC169FDBC8B75BED1EEFCDBB132B3A9D94E63DD85AA6844D2784528824DBAEBD23AD7F4A7F69CC52E7FA1B413084A19D334CF273069A7C6FDC32BA7EF1B4AA525251299026245B7EFBFD3C761D3DA34E6F98CC1DE89EA2B0E976F9A61D47D7978729FEA2BB4733B289C9B0B2D7DDB0082104876E00CC36DABD358BFFD99EAA97B78F624ADC89D712FD65265798F7895381C752A654FAD80A049298E04F082013CAE71CD7E2CE0E7761BB62AC5A5E54BEF9250C0200E020166BEDA50C59BE17E151DB7C97867FF00BA7BB4B05391F303BF5AF86911CF672AC47B3A7B09EB3ED133C0296BDD6F51D1D4B8F8EE5C5835F5D474A49500612952786D7E538D519DCDF89DDADECBE0A6CC52E5CB9A8E034570F01965B672CD5B6D175C5F66657C3DECE677899284CA54C92A24A592F45D68DCD9BA574F9C3EC1F5EBDA8BB72D195B5B52A5B95FAC2BDE2932B5BA87736E26EC24C00A107EF8C7D53ED664186CA3E162B8E5A50519594824004B61C8A3B17A73158F017C3FCD67F68FE214E4AC952518FA3925819A7EC03E9A0BC7BC7F4D6D6FF09EC47B2F57D6453B4F652CA9692910A866948B58DBD31E0EFE93F15C19F76C8B904E215F35DBE79C2D7343E5E2DED0F8E39209B97767D93FB25A6800BB4B7F13AF808B4FE8FACFD549F477D567542FADA751A6B51A9350941242D2DD604A936894A8026098DE7149F8A586979A7C5BC1E1A604AE5CEC74B40492000EB4824D9A8790A1E7171EC14B184EC6631228A4E14F096B325479F3D0347C5C675A8733D4FAAB3FCF33FCC3F8B664F6AECCB82B9D400E2CB19DBC96B88993FC9094000AB940B1C7D81EC77C2AC9B29F86BDEC9912710B9D960592109F915DC71000B106A48A3171CDA3E7F67FDA7CEA4F6F92893366F7631E9494B90083380E8D5E5E31F657D9FBAF6A0FA23A8EA350D51CC1674DE661E5B80AD4E16DC70530264901AE1481702009C7C62CEB02B97F1C71B8192938799FEA00219C703289A33338A8A6FA47D19CCF2FC6633B0183C54C4A9415820B59209249402E6E472DF68A37E836D3D97D07B32F6959EB85B39ED70D46E553EDC38E452556666907123888284252902463A27F51133192734EC5E1E74D5CE9689B2C1E25BA4A4992FF00292798DA39F7C1CCB958939C1E13C487090C410471F206ED4FF11F2EFED8FA8F52EA1EDDFB4CAAAD79DA976B73A79AAA1564B8A4A296A1D431C21E24B7084A638627CC63EC27F4CF90F64717D89C395E030857FA1905733BB944BAE587513C3423E66249203D5DDF907C4D999B617365204D9B2E5F7AA0CE4502B7A7B2F4B1F7A3FF000DE663AA9DA2F69CA1CCAB9FAACA72CA6D37FC1A89C052CB21D69F35019512507888957081B7A63E5D7FF101ECDE4B9676EF245E562428CCC4CCE3EEC207012A433B683CE3ABFC229B889D8498A9B89513C0010493C4E0DDCB79D7ABD5E7B03CBF24D4DF4D0F68D575CD30CE6D9355D21CA92FF03A0177285F7E5A6DC94A89008514A4C4C9223152ED6CCC661FE0B49948C44D38695879616842D690BEF1496A820D09B30F1022F08C2E1FFD53884F471F192D4DBAEDCB77B88EB6FF00E230D59AD55DAE764D903A9A87749D28CE52CD0F7C5AA5AC52D868F1AAE107B8761694A8192200B63D3DFF00C34F22CA670ED22F30548EFE7770654C9B2D2B291F395278540BB8A170FA93148F8AF3A6C992832A72827849E04A8D580377A7361D291E2CFB2666FA9325EDFBB38CE748E72F2F57E539ED1B74CDD3346996EB15B52C35508213C29792DD3A949921462488C7B6BFA81EC7F65476273EC4FE93088C423093945932DC321452A0C9B967A5059C5E3987C369D8AC6E745D4BEE4CC40092A2A0083F31725EA6AC6D1F57DF4EE657923FEC8BD9F6ABCD99646A8D3949A7333CA1F79612F37501FCB6A6B0A4AA0C9524C83F2D87C73FE96F23C5768FB5BDACCB30EB52B0F3A7CF429491F2CB4A0CEA10ED50001401A8C418F5EF6865E0B0781C14D9851C72D095558392013737ABF56630F196E6C7DB87E89E6AB2BEA1ACCF3F3A7DBA6532036A768FF84389658909B9E2453A6091F2C42E6B879DF0CBE2F4FC3941978638827BCB267900A8D2A070977B3DCDE2A99F60F0FDA4C995DD11314896470A43905801B16D872B3563A8FD8A6643D877E8BDCF7B415D40CAF58EA9CE5867EB253DD55775976A834D716591DCC0936817B6273E21CDCC3E3576830D8096959C3E4921656A014A48EFA53A4B86A120B579D59E203E19E5E7B32719DE3A3F50B02B4601441E573BC5A9EDED95A7DAFF00E8B1D29DB250BE8CE35150399652D3543284BEF819967749435012A471281EED478C4DEF24628FF0CFB77987C09CEF3BCBD6B992A5CF284AE695143F0850173BABCA85C45C7B4FD94C1F69049528A14A7252C94921C826CC4D40BD5C3888E7B42D72BD89BE877D2FD9464B982323D579CE541540853694D43C330AE69FAC480B214B05150A077001DA76E91F09F21C57C6FF008BB8BCF66838BC1A274A33E6295DE252148F97E524EA3D0C547B5394CFEC764A9186E2E12820000B903722B6FA5447523E874FA4FBB34EC3F4D669ECE3DBA54B590E5B58B71AD3D993A953CCD5273971D7F350E36D2421BEF3EB0471BAAB4C836C76AFEA6BFA64CCCFFA6669D98C3AE64DC2A0AE6C99287131410909AA4109621D9AA4EF7A87C34EDF19B3F1387C4A08257C20A9554804824BEF5F5D6DDE1F694FA20BD9A7DA6B2BCE7B5BF657D4395E4F9BE694B559BE6147401399AB3AA82D395094ADC53AA142A2E1544849515584838E71F07BFA83CE3E0866986ECE76F7B389981731121189C4F04B32471048290A96EB0C45886AC7A0D59060BB4592E3F112260E3EE4A82407E27492D7DFDEA7E40BB5DD09AABB12ED0354766FAE3277329CFB22AE55355D33AEF7CE04F78A0C3BC424C3CD04B800FB33048DF1F6F7E1276EB2CED864F97E6D8032C61B19290B9694149487487629A50D3ECD48F9F3DA8CAB1180CE71D875850509AB090411FB496A9B50F5E948AED154DADD6D0EBB14C2AE8545266E3BF6CC72E639EC3963A6F6F932A5764B3498B4A7FF00C24EAB80DFED2EB434A79F9BC7767B0CD98E1D64007BC0E7982057DD5AD78FBEAF662AFA773E880CB14869229BFC279D8EF645E3EB039827DDBF524DB1F9A1CDF855FD47AE7713FF00FCDD2424D984D1AB81A5E84599CC7BDF23C6A7FF00B26B95C54FD310472E02E763B7324B5A3E04330A827526A39794298EA1CDC8DFFF00E6753EFF008FC36C7E8DF26C560D5F09F08BE14850CA4A4D451E4000EB73CEF7B4789FB418642FB4AA25001562814ADFFF00F23F9D3EBB53EF17E8DD7C39F43DD125091C08D2FAB036A172AF1D6CF29989FD6C4FE6E3E364B549F8F1317254ED9BCA5708714EF52687A104FA55C1F727663853D8DE07001C29DADC157B0153CB7BC7C2A3EFAD39C6A42018FF0013EA08FF005019BD64C7327AFA5F991FA25F8098838CF87D9226657830328126A6B292DEFEA2DE09EDCE042F3EC41480C672DE9CCF5DD9CFD5A3172A549A9709901411C2677B5E27E605E3974BA63F049C14C9B36581525541AD7DB6BADA22315970932A5F086A3B806D4A0A69E1A6AECA115465266E0F23C87DE7D63718322C51C52E625CB75B1AF93D01F5D221D587E397303513A1F16EAFB6FABC38AEB4422157326D73E9633F3208F291890C534951090C4D9BCEBE1B79BC41230CCA5921874DC9BB37BB42DA5AB55A5506DFD5E963EF3F872C45AE6BD5FC5ADBDEEFE95DE119B2039A3020B86DB9EDF5F52FD4D5EA491E2E917E91EF13F0DB0CE6A8AFE660143C7EA3D988D9F86AA986CFEE9EF5D22ECD40F90557B78B993D4DA3E47FDB15AC1E5E95B16A534B3B78FF00377AC5670C82E3776B3DCFE4D8DDADB54D9ABE12410A20C988B4753337E5636FBF172C149125212C006A8BF4D34B9DAF16BC149E2670E77AFA86E5E0E4BC56D9CBF2570A3799BF39B5A4733D49336318DB1B244E42924536D2C34E7BF268B6E1B0E0814D7CEB563D43D69D2B1D8BF644EDD6AFB31D768C86AEA4A74EEA7710DE69DF2B89942584F80042E42788A88F0804DB7DB1E5BF8C3932D58BC3CC972495A78CCB524170A2285FCBFC5DF62300674A2AA0E023E56078838366269B36FE3DF7EDCFB25C8F5C255AF34025A348DD38A8ABA36133F5A2A6813C3CC4104F8419918A6F65B3DC7E5C24603385A84F0A3C0A51A293C4E1C82C960C189A9E704CC20460A6AD2070941AD058359F4A9FBE91E5F6ABA775AAE7D54B4EBA179B70A1CA2752429B521453243804F111C42C37168838F4C765F3CC24F5490262492120A5DC681F57BE9A6BA8A165ABE1C4995310584C265CC7BFCC49D34B171D62B87DFAD69FAA7AB82509013E201209B47282771698B5A717AEDC62049EC8662BC3034C2CC345137428F366735DB58BCCCFF73138201F88AD0C1C9145245AD6E576ADDBF421FA081E6DFF00A3B3B225A2C952B3DF173319ABA0C1F224F5122DCB1F971FEA4D53719F10B3D52C9E3562893BD14A16D396B4AD23E8D7C2099DCE47210A179483E40793687A78FB2AA6CAA07148163F2F3B7FBDA31E7E998351E021668C08F2AB7A4760958896A0B205007A5BD3C357B469ABE15367FD31045B9ED68B7EE310F9AE5B3166594CC371AB00DC3CE96F6E211978D9604C5300100BB867B8B5796ECFE5E4C7B5B1AA57B657B27D400AEEE95FD58091B0E3A56C5CEE0F4BFBE6D8EDDD83C0CC464D8B2B55049AD2DF2A99C6FA0361D2384F6BF3195FEB7840502B3C696F9921FA5391FB7AAC8610A436F95C7794F4E08BC59A02F11EFDB718E62AC0A978EC4CC0A202A6ACB7451A75D5F6F08EED2B3A95232FC17124377496AE9C290CE7F834E8601429510B0AD89277B0F5E717B7AC61E04AA5293C35B8A9DD85A96FBC3D939E499929443304D7A0B576EAC79C326AC729DAD3B9F07109FF00F25CD477840F07F917E4F513E58525E24C8CC72F05C257390493AF0AD275A1B0677FCD373ECCE5E2729CD014848EE576BD9557DEDEB678F8E1D4F9E32D6A0D474542DAAB1F5E7799A51C00F8146BDF1B00A8B9927CADB463EAC7C2DED370E418342905411225B56CC8079DC0D46978F8CBF15A44A9DDA3C629D81C4CCADDC7191BFBF48D794F66398E69568AFD5EF16329716DB8DB6B570C2525248F0A82809EBE40E3ABC9ED34C9B87C42654BE29841E1029BD5D9A9A3ECD72639BE27092654DC312404B83D76AF93459D996B0A7D019AE42EE8D2D3797D2D7D025EAA6C252B4A45432167BC23886CA04F15C18338E4BDAEC9F17DA2C973097390553CCB99F2B3E8AE10DC9C5FCA3A764989461734CAA6CB53211325970E416282F73AD58FDEBF499A435D685D45A334A6BCCCB39CA9FAACA32353D48A5D4D377CCBA28501EE195F182A5A609B4F3136C7CE35F62736CAB3DCC72F460E7AD789C4A124A652F8529332AC5883451B6EF1F4DFB3BDB3C12F22C04E9F8894572A424104A5252C90DCDA805BED1F2C5ED9BDAD37DA37B40F69BA9D7998550D53F4AC51C39DE3605334A60F7601294C9489E10279E3EA77F4CFD805E41924E070CA2664996A09292EEA492AA915624D0DFCDFC45FD50F6A65F68733CB8489A0895318F097A0296D756D6B1DD9FA1DFB66CA5BCE3B40ECF33FCE986F2FCCBEA21A159528A7692840716E06C3CE2130A04F170EFCE71E78FEADBE1E4FC595E3E4E1967B8528F0CB4173C6A6FED0F7FA0B08ED5FD3776B70F96E1B0F879F31290B4CB492A22C000E1D85377E7179FD33BDAF694D0DECA2F765BD9F5565CFBBAC5C4AA918CBABE9C70FD533043D530197140F1852CA85A7A1338E73FD28FC32CC734ED4A71188C34E4A72A9D2D40CC94B0E165E8480D6B579DEBD7FFA81ED86053D9A9D2B0F350158890A4D140BFC9B3DCE9B79B7CD77B2766A32EEDEFB3072AE9196D0BCCDB577CED5B61A6141C68B8A5052826E649E23F9E3EA97C69CAB118EEC0CDC26124949C3E5F302B80151534922C072FE77F017C0B92995DADC4E3262811FA90B750666593ADC6ADCA8ED5F79BE9D9D6196E73D877654CE4F99E5F9A5553E5A84BAC52D7532948E24520095069D2AB0041045A27CF1F3E7FA49EC8E367E73DB554CC34E92133C8495A1697F9A6B91C4002D705ED48F717C4EED06171F82CAA585A0996800B10744DAAC35D3CAAD78FB04EB9CA32BFA322972CA8CCB2BA4CC9BD33A992ED23B5D489794A79157C03856E05137B5A6F618E61F14FB219E9F8C32E5E1A4625CE3A41429329652405209F9827845AA01ABDCE88E51DAEC265DD9DC44954C9602A5147015024B8237AD4BFB68F8D0FE20A6B3ACCF2DFE18DFD61ED599B283E2A91C1C2E674FAD2AB9E002140CCDC791C7DC6F8739663F07F0B70CAC5952972F2A53CA5A492B6C3D2A41208DACFE31E4BCC065F3FB6386C72928E0FD5A56A371598087F324EEDBC7D8F76739E65591FD132CE50EEA5CAD19A2F4F578550AABA914EA438E2C941417B8A549510044DE7A63E2DE2B2AC6F683FA929A065D364CB9F992A5999C0A0901CA1DF85855F56D3578FA378CEDA64EBF87F230B24C92B4E0D2821D2E0F00167A35EA0757631E6A7D081EDA3A43B2BCFF005CF619DA03AC65B926ABCCAB98C86B2B2B521A612BA9AC5D61256A4821D2EDB8D4041F0F2C7A13FABDFE9E33ACAB2BECD67D96CC993E64A93FA832132C924F0CB5247102598D5ABAD63897C24EDBE5B95E6799CBC419694CF9A52975003F72858B543EC2978EC3FB64FD0D190FB42769B98F69FD9176C990698D3DAA5F6EBB34A76CE5D5296DB442D6A05CAB04132A5129005E3AE285F08BFAACED47C30C966F67F1992E3D589EEBF4EE654E676294B132882E1ADA758B476F7B2B96F6BD68C5E1E74A4852B89D251576367B0B55ED6611E837D1D3D8EFB387B29E95D73D9668FED4723D49AEF2AA2A56F5F66685D3D297DF71A71745655429B5F772A4FF002C9B092463CE1F18F37EDE7C4AED2E5F9EE3F27C7A30D331266A25944D99C492B4963F238D0E8E29710E7B1FD8D9393E1712138E4105150E915093AB862ECECFB6F1F33DDB8FB4F663ECD1F4C46A1ED372CCD5BCC34FE4B9C50375B554EB40A5758CC28934CB529C6CADB5F76971517544198C7BA7B13F07715F11BE14FE8B1597CEC3A4E0E92A6216145728129FDC12A1F307F3022A824A64E76427304BA67317208AAAA2AAA96A5C37D7E813DAF7D9B3B11FA59BB1ED21AA346F68F91649AB74ED122A28EA7EB14AE3E8A8AE4B2AA805A72A5B5288525408502236F2F337617B67DBEFE98BB4B9A6066E4B8E9D2319394995365CB9BC0844A2BE1AA65905D245F7EB16DED7F6270B9D60A4CD46310A5997549E162E03D4AA800FCC7527D943E861D25ECD1DAA50F6E7DB776CD926A3CB3479555E59973AD515021A0868A544ADAAA01E3E04AA540C102379C5CBB6BFD55F6E3E20E538BECEE0F2BC623179924CA0A2998C94AA8B042900170A34E434022A1D98EC9E0BB278A13D7390A757168EE1CE84F202BCC563CF9FA747E900D37ED2FAAF48F62BD926629A8D1FD9B0ABA2D52E53387B9CFF00BE6DAFA88412477628D6D7FE52941405C441C7A5FF00A01F80398E588ED467F9E15C939A2113128992AA85A9331F849A9752812D67AEB087C4DEDA77B2F0F2F0EA2C804712554228D4D080EF7FB9EDDFFE1ECEDF34C6A4D2FDA67B3F6BAA9A5FE1540D658D51A730AF45335C351DF3CE06D0F389063651493245C1C79FBFAD5F8659CF677B468CD7012A6CD97227CD5F14B9449214A0CFC214751BB5A8224BE14F6865E2E4CE958A57CAB486E2340C0BD0DCE8FCEB5BB37D3F5DA4E8BD03A1FB2AF67DECD1CA0A9CA73A733E5E6AD50660CB8CD3943E8AB68AD2D2D6992B24A4820CDE4E247FA39EC5E6FDB0C6E7B3730C24C4CBC6A30C897DE4AF993C09525552028B9706CD6899ED6E7185CB1483865A400A51E20407ABBB3DB414B02EC0D6F2FA0EFB42D17DB1FB2AEADF66DD739965CCE55A0AA327AA0335AF6025C5D4E647304708A97533C2B6D2004930400231CD7FADBF81D8BEC8E6B968C2C99C3FD51538CC99264CC3C265F090FC009ABD1FA0687BD91ED29C74A99356B0132785454542805682DA1F0AF28E96FF00E221F684C973ED77D94762FA3FEAB5D93F67F4999B59A2B2ECC1B5538EF6959728F8D34EB2DAFC4D88DE3CAE07A6FF00F875FC20FF004DC873AED2E3662C4C9F252B9726721495BC94AD2C38AAE586973C8423DB1EDE6599C4B565AF2D7DDA4A388917218BF3A6D7E51487B197D12992FB6E7B2EE8CED8727ED3F2DD13AFB33399A33AA652E99CAB4269AB174B47C295D534B47F25008E048277B9BE257E2DFF005739D7C30ED563B23C4F646766982953C4B933940A92A4053121E52DA9CEC361150EC9F6224625189C6E16600A53A884B50FCC6CFCAAF4F08F793E8ECF653CCBE8CDD13DA8D576BFDBE516B1D33995031534197E67534ECAA8450B4FB8B6DA53D5AEB87EB0A2010902D682231E11F8FF00DA8C5FF513DA8ECE4FC83239D95AE54EFF007C4A90B481DE197FB9425201E1FF00D4760D1D0BB35DA49BD97938B918C2552D614900AAECE0D34636B5C3968F907FA447B67D33ED09ED73DADF6A7A792C3391E695F46C65686214CFFF000F42A91E712520254165B2AB822FB99BFD73FE9B324CC3B0BD8AECD649889F3711330F2815CC585024CC29531724D1DB661E5E67F89599E1F33CD66E230C94A553564A929E1726ACC40F4E82F1D247948AD71B69A3C6EBB574490B1002385F6C12784DC01733F7463DB1DB544EC6F617310924A95825B0B9FF00A65869AB59F7BB98AAE538632E7C998CCC41219C82FCF4FE35B7DDBFB336A1D3793FD1114D91661A9B2B7EAA9F4B66FC544BAEA565F42DC2F2908E00F070CAA364C9DF1F9D5C776733199FD434B9630338056684F7E25CC2857CFC553C2C963401EEF736F5164F99A11D9F989EF83995C25259C3EC77607E952F1F0AF98B15CFD56A6AFF00A9341273DCDFBA685437E20732A80DA80998363E933338FBBF869388C2FC36C361895059CBD824920FFD216075B53D77F336793258CFD2B04F0F7C4F78C4DD428C2F6F1E8F1F709F468EA4A2C9BE879C99BCD33DCB28F323A7758A2AB2A76B690D4203AED6A590A429D0E7892411E1988B63E137C46C8B198EFEA09787999662168566329489E25CD32CB14A89E2E129A1A5CB178F5A6419AA47645C4D48E1C3906A1CFCAC19CB8EA3A5EFF1079D56A9DD479CD0B47EA85AD47A8D65EB2D2B0EE6956B491C8820C8B9B75B8C7DEAF8272BFD27B2F95E166829030D253C268DFEDA685EF6B0E81AB1E46CEA60C566F3E61629338B1707FBC8AD6951E62102EA1F436DB6FD4FD6384A8254121300A8EE2D3F0F48E7D23B4B365994549775A48A6C03DDA9B787268C6712929C2A1807E116704061E2E6A3EF1922AA23C441F5F9441DA3DF883EC8A0F14F51258177DAF4B57EDB45630D85EF44C0D41A5FC5B6BF4DA17B3540F3E7613EFB1B0FD8DED1218FC4254B2904120D791D1FAFF88613F0641248D5B6BBF4D7EEDBC39B15299BDCFADE00F3BF31FBBE23FBDA0A38EB4F0F188E9987242810054736D4B915F1F5AC3E51D5004CAA768E7CEF73B794DB96136F5FF10C26E16F4E7EFCFAEE445EF9FBCA495C99916BEDE5E63E7317C37CB7BB3C3F3247450F3F06F5B450309C248A8D4B1D694F37766F4200A9B337AF24C133CF7822DCE08F95F6C5816B961988B5C355B5F0B922EFCA2E99690C12EC59AB4FE2B7A45739CBA47149067CED07A12768E7E98CA172C9F988FBEA6DCF98B45CB0286006B4B80C1AF77AFA6F102A9AAA8688729DC534B6DC43BDEA55C2B49696958008330A88B13D3683880ED276670B9ECB4A804AF8056D4B6A3A6BE4F13D265204D42D49E24B1052752A70E79EB6E5AC7B09EC69DBAD16A3C859CB7357D0E56E4ED064513AE052AA82C14990A3C809BA4FE5E61F899D9E565A0FE9A590563E65A41E24F0331A5473AD87384330C0CD93869E94A14B0524A5816AA5C5F50E0121CFAC4E3DA13D9FA83B45A1ACED1744308A4CC5092EE7B97B0907838070B0520402560711EED26F20CEC28DD8CED5E272BCC70D81C629687584CA98A27FDC018977A066662C4EED1C7B0699E8C7AC4D744B42CB248019D4E59D89FC1A691E516A5C933664E654556DADA76994A4292E24B6B3C2483E15709361331B796FECA9D9AE5F99F64B152578A97DE4CC22AEA492FC0A162AABB8FF00069D070D353331B8128F9F8549B312038BDDBEB406B1F7FF00F40754328FA39FB1E678871B6ACFC2E08327F8A3BB7C7AC74DF1F9ABFEA9B013301F14BB412E5874FEA125019A85C92799BF851C47D21F84F8633F219135350258141B74A6F6B5CD047B573C37170AEBCA3D3CCFCA31E7054C50E1FF006EA6F5B3791DFD6E0C752958644A4AD2A50254F7D3933DDEB5A53484756DFF0029464057862FB99E40C72BFB879E22F1F899A0CA4A65120104B5AF6B3C30384470CD26684EB56B56BA3DB4DB9C7997ED4C8A65FB4C7B3BBAA092ED2BD9F84A8C594B6100F39F90C769EC5E38232AC64B5A7878E5A68D664976D79B6FAD9F85F6B7088999F61BBB980844D1516FDC0E84801C7F916F48A8549FA95229C215C4C35179FF00CB06C07E679FBF9ACE5CFF00D6E238657CA16A6A8DCE9E57E7BD3B9E1729958CC0615256DC32D249A97A07EB60FD042D4BD07812D9E13304DA39449E9E71CE2708CC54D0A41E0B9AD411F57DABA9A56F0F5394C8C3C99893307EDE4052BB8FA9FBC43B5AF0AB4EE774EA8E0A8C9F354B8B240E0FF24FED7E60F97BF0E25619789CCB2DF91E5A27202C805EAB481CBAF4E91CF73DFD3C8CAB3596710973297C2E039649E7F47FB47C9CFF0087F4FE94CDB52E62C96AB6A579C664B21C50250AFAF3E47DB2779DA01FBB1F53FE18646064797CBE220CD92876154FCA08A354D5A9F48F8F1F144E2FFF00B438D54B96B52062165C02D45162FA8F1D6BBC55DAEB5E546669750ED48629297C3DD214059560070C1E42605A2F6DFB5C8ECE1C0C852E5A4A8CC0E0849B8D7CEB7F38E479AE2B1AA5E1C194B0C468695076E5E3A87B50F9EEB658CB5CCB43D14CF1E24BA560A92A6D457224CCF1446DF0DE7FB23D98563D73D18A90485FCB504382FA16AF879B45D329CC2711216A7E29401B331706FEFED1006BB78ED1F2C6574547AF330A6CA2950B67EA816EA92A4BA14DF081DE6C27A72F7E2771DF05B2D44F9589978290A54D515294654B7D2E4A5DEA48E62D48E98BF88D98E1B06A9285CD010801202D4D404559BCB4D0475D352EA97DD5BA0E60E5754BCE975E754A502B2B595192499DC9373EA39F77EC7F6364E4B82EEE5C84A4290DFB40B03A369CF5AEA1B926699EE63DA1C5099890B3C0B3C04B9D5F4B5BEC08D23B4DDA8E75A5EB5CACD3B995569FCD69D1097A95E741A80B4C2B88B6B483C0098924FA1DE9FDA8F85F27B4B8BEE276192B97316428AA58500E402E0A483726FF0066BE7663B5B98E46B9264159092976590CC41D19C035F28856A2ED63567696ED2D0EB3D4B98666CE9F53C72FFACBEFAD3FE6BC6F405B847BC9DE23A62FDD8EF82992F6170FDF60B0B25733149056A42128293A12007353AD9A8D171EDEF6EF34CEF05874954C502901438891A0E7737D2FA562BCA9D40FE459A65998E4B5AEB2F30E38B62A10E2C2DA5248B8F103722C7A581B62E0AEC761F1384C56131081313884291C2A0084F102050D3534A0D2D669D809F332E13B1330702D4CA36492589E553FCD8D1F75576A9ABBB412A6B5A6ADCC337A4A06826969EA6A1F5A112DC0094A9C2081C291EEF2C503B27F0872FEC763B19330F879481984C75704A4A48724D4015FDCF5D9F58B2E69DB1C7E2E6A10A2B28413C2EA2CD57AB9E60DB4D2B0DBA7FB70ED3322D34AD3997EB0CCA8B4E5225F65BCBDA7DD0D38D3E56140A43804428D883BE2C78DF81D90E3B33C3E3A661244DC4718985664A38A9C2AAAAA46C6B5A42A736C5E2E5A13DF2D0966238942A7714A5ED7E45E29276B87091C6E77AEBEB74D4F12B88B8E3A5C2B3B1278953EFDE71DA26E5B2B2CCA1196CA940C8549324200040053C26C0EEF42F6B34426264CD97884CD1338940951AB12407605FEEDBF3B353DAF76A54BA75CD08D6B3CD1DD38FB62687EB6F25969B47F34A0254F0042CC8B00224918F3F49FE9D322476865F69132E4CB9C7102795F7238828A8170581A1B6BA691D4FB239EE2F31C0CEC2E227AD12D29290952CB0670CEFD0FA91AC55D97E635EE553D9A503D5394D530E05A2B29EA9D69D6561478969536B428971424C2A6E649C768EDDFC3FC0F6970795E5D8C28C4A70C9084A972D2414B2284104580F3DE29598CDC564B9909D869CB525530FC892415392FF303A383E1B34596D7B5EF6FDA7285DC928BB50CF5BA1E014ED527D62A57DE34B942C77A5E253C2826FCEFEEE57DA2FE9DFB213A660572B29C112E0AD430F29C905372106B4D4E84C751C176C33395839404C5AFE573F39245050172FD473888E53DBA7695A1AAB37CD74AEBECEB2CCE75496959C569ABAAAA55616E40E24ADF3C3C016A48BCEDE98B2627E09F63F0323087FD1B09356809242A44B64D059D3BF4AF844BE13B7D987E8F1038E602A490071177A8FAE9A6A6B117D41A9EAB52D43F9CEAB7DCCFAAAAF8559966AF3CA4D4D5A80F0124953814D936214622C462E384C8F2DC9300A9383C049932B807CA89684866A8094A40028C4806BEBCCC769B34399098274D333BDE2EEBE6660A7AA8D2D5AF41A448342FB40769FD9636F27B25D5B9DE421B5346980CC6B1E69238A5CFE53CFF00040BC023CAD8A64FF86BD95ED9A7128C7E45835CC50204C99265A8B977214A43F3A9BD6BAF4CC4FC40C68C3C896B9EB432085312402C1A81C1D9EDF7996BAF6BEF6A7ED1A84651AC7B64CDEA74F3C80D869B0B614C881C485165D4B8E0717E12A3B5ED6C73EC37F4A1D99C2667FAC9383C2B77817C2244B00317350351E075BC452BB7388C4A529257C697A959215B720DA0D49A5E3AE55D4AFB4A7731ABAB71DA9E24ADBAA71D53EE38A599597256B52CAF97193C3336838F487677B3780EC9E5DFA6CBB0C894020256109E00AE1D580F17A8AD1ED10B8ACCE6664E272B881A1048B68C6A030E5666ABC4B3477693AB3B3DAF567DA1752D6696CF5F6C8AF4D1ADD6FBEE0414B454A42DB49F092773B9F29A4769BE1764BF12153139A61249AB1EF65A5770C28A05F97D350FB25CEA764AA3DCAC94A8FCA453AFD5BD2D0CFA9BB4AD6DDA356B59AF68F9F57EA4CC925EFE1AE555438A2C820A5CE02A717C05405CDA6DE470C3B29F0B724F845881FE998594B18958E2084252031352C1A8ED4E82D0BE79DA4C56629497514268B3C4494BB0B7D5BC636E94ED33B4DECE686BDBECFF0055E63A4559CB8D2B325D13EE95560A75CB417DDB8829E00624F5B7385BE27FC25CA3E24A7073F192A415243A44C968594BB1A150A3F215F5898ECFF693FD3B018A40593DE2181763622CFBF9DA36679A9F3ED6F9A576A0D5B9C556A5CD4B6C8CC6A6B2A1C2B57F2C210525C7167ECD884CF520EF8DBB15F09B03D85C3AB09829E89689C9632E5CB084B005D82193635A728A5CA5E2F1B33118C33152C05A9481C4FC45CB6B46A3D35B6D38ECDBDA27B6CEC7D8699ECA35DE67A5B2A60AD4DD0B0FBAED3A5C512AB32A7782EE19FB20199E6629DDB7F813D98ED8AD788C5E59869D393C44CC5CA4151513772924D75BD2B6ADFBB11F11B1B904D9B82C4A55312BF941366B5D8BB8A7A5ECE7AE7DACBB7CED8A94E51DADF69B9D6A1FE2922A285A7EA32E4308A732DA4AE95E42561D4813D3AC99315D88FE99FB33839A56BCB70C9EE8828224202878B39F7766893ED0F6867E67C5364932CADC800D01FF0026E47211D79A9CCF2D06BA99346E51B34FC011C6F2EA14E71FDA59714789449F11BA8DE099938F42E1BE1865F95E1E5CC91C3DDCA1F227858D00A017A352C34B4727C7E0B187172A6AA615AE693C40D804B6B6FB0D8986AA253ED24D45112A6DC50214A3050526410150A9E7D248F73AC4ABBFCBB1197CC4912D52D52FA8208B1D34F037AC4FC932A470778A4A66242788022B6D8E9D5ECC77B799EDC7B60469F6F43653AE7356B260DAD2BCA9350F374FDD9F1B8982F25B3226C419F2DB1E6FC2FC0CC8979F9CE152B0FDF77E66059948E3078B8BF71F9BE96B35AED83CEA52705350270AA18004D4D59C3DBD8058456B4E8A377EB05552B156B5713882B594A9C995AA4909F12A547D63963B2E7787949C261B2B92014A502529A80064A45052C00D3A544727CCF118B56350B12C2A49987E7A1FEED989A9B5ACFCA2DCCA3B77ED9748E937F4A69BED0732CB34CB882CA7256DC7154E50E921C484F7A1290A2A26C800CFC38FE7FF000772AFF51C366430B865CF52F8CCDEE659980B823E729E22D472F5B728EB595670A95932E5A9652F29B85C80696634F1F48A997589A4A751CCFF00CC562D4E3CB741BADC7945C52894F52B24FBCC0DF1D672D9672AC36170E80C1090030D801BEDD1E968E42A44CC4663326C90425535CA49B7CC6C4DDDA837A5A120AF55434C9EE032DA4ABBB571F115C9BCF3116B9E7BF9CB6653D73A5A454FCA34DC375F3E9511379980BC3CB48A900B80795F402D460C4794642A215008B7E5BEC3DE01EBB8C3DECDA3B9918A333E5252E09D686C2C746B5ED588CC04B4852828555AD2BCACC5B9F95995B5504CC72E5B7E1F84F9EE3103DE4C5E2A6853F0F116F07E41FECFD0C6B98E1857853C54E54F2F7CAD0EAC54A85E6E39C8B18F78F4FD92E3D6212661D4011C377E5FC74D1DC5EB0EAC55A81B2A662DCA39FA4DF7F8E1C4454D90B0E18815F467BD7CBD63B31A83FF0030F9729F3FDF5C5772ACAB109E1FF714DD5EC0023C58BB56F1C87064FCBCF5237BD9FDF8454B9AEFFF00501BFE1FBF23B62EF2329594FEF248BF27D37D7F2748BBE560F9DFC3C0D9B56AD9A2B8CE261572771BF33B7A4795B9DA30DB13964C40A2D887A8D46947F7CF5BC6096A6000B063CECDA06EB5F1115F660B2961D00F8942537BC03B73FC7737387196CA54942C2D7C65ACE76B6B4BDEE1E2D3804898A4BA4900B7A87B3378FD1C44F3B1CD74E7669AB726CED2F2D2AAEA80D5537C6A094A0A92D789174FD9513F64091B49C72EEDC61246213338A5853F1338043814A1D4B57A88BAAA4495E0D49525259140D770E5F7B8B92F5762447BBBD9F6BC0E06B32CAEB52BCA6AE9D872A11C21E6EA389A056DC2B885D4549909244CEE31E5DCEF2C4712FE4E15851E152404941770411B30B50EF78F3E76CA58C3E216A909EED890C000FC8351CFE34AC535ED49D82A35A6529ED5740E4E9A7AB6997D59BE9DA75A54A76525A0F155B7014F42516DBA623B2ACF335C3ABFD3B178F9AA2974A165D299A935E16FDA3803246F7DE1976471844EFF0076BF3A0A5CD5241AF9FDEB5871F656FA6A3B60F628EC4B24EC374A766CF6754BA42A2B02AA5CCC9144A52AB6B5750B4F74EB6543854A5241BC81320638FF006E3FA61CB3E296738DCFCCBE2C6E2780A94093FB53C3B905C72A0F38F72F60BE2CCBECC65430D310172C20339B33B3537F6E4C770B49FF00E240F69CD7DA86974E649D911454BAF52A12DA73AA5592952925C20A99E4992795AFE7C5F34FE89A46094B64148960924836A126FE941B6F0DF3FF008FABC3A138B4A949134AC896096649203902869B56A23D6CCB7E946EDBB32C8727CCF30D00AA3AB553A5754C8CCD874B8A7109264049038493CAF18E793FFA5BCBA54E992C4E49282C42914046C7463A87A5F78E6B9B7F54D8891296944A293C24385549B6DADC0E61A299ED17DB175FEB9D65A375E55E96FF0039A3D756B651F5E689FF003894A1710009001BC19E587184FE9EB0F830A40C425282188018116FF9023E9CE38ECEFEA5313331C27AE5296EB772A22C6E28CC5B4DA2E36BE93BED716BA5A2CB745B8E14252DA17F5C6E13090904CB7113CE4EFE7784CDBE03E4B800A5290272E6D4B121D89ADEB4F623B1645FD5CCC95874CB9A42025200E2581A731FE0B062D13CFF00F78C76CB45979ACCD74D251E00A4B66B2941822C2C276B0B6D1B6C6051F02B01895BE1F0EA4826CEA557A380F5F3B3E8669FD59AA705844D0285C85E8D4B6BF93BD693CFFE94CED32B5EAACB2A749A99A3A9A6ABA45BBF5D6D40F7ECB8D6E102078B91F23D7177C87FA70913264B5AE5174A90B49E134620EAEF51B8D2D58E4B9E7F5278EC6098133490A0A0C0D3E67BD18B83B1AED1E5CE7FAD2B97FC56A2B1A5533B9AD53F54A417F8E3BC79C7AD06DF6EFF00083B63DA3D83EC09CAA4C994A5525A5090E9A06006A4BF3D8EB68E099DFC44958F9CB9B3308959592492D5737A03D6DBC5199DEB069D0950A8E2E2E20B4F111B5AE49826DCF9FC477AC16449290854B414A406FDB5B3863E477BC404ACD70D9B14BE1C21ACFA7FEDD2CF435F18A7B506A469C04A5C22247085189322C41E66D63E51B62D797E4D230DF34B9684ACB5001E069B0FA18939494380848036B742FA3015D5AF58A8F33CE0155DC8E22A27C5B983B8B4FA1E67CA716C912A67CA9324CCE166A3F326C69E874261F224226065241069BD01E777B58E910BCC3356C93E3937BF15ED6E93D39CFB8E27646267A180C228B5D81B55A8DE7CE159396C90414CA1D5A8DCE84EBD1BC221B9A66685442828F8A4CC98F599300733D05AF13382C50278A7617BB240624786C0914DE9A4484AC24B42920A1D542CCDCF46A90DCF4AD6227515C8415149009DC8B4EFE9CC7BFE18B1C8C52267082C4358DACFAB8B9DBC6257825CD480B47101448B81666A7A8E9BC30D4D625704A8929B013D77E7E5D2FF002C4B4AC1A26BA811F3352D517634FAB57C21F485A657CA80C9147FDA080395EA1BC690C4FD741549227A137378DBF641F5C3A392CA9DC2ABA81B9F114F7AEF1212D32D4C4A58D093AF23F7F5D6120A90A0AB9BC5A48B74236F3103F1C18D9A8CA25A4A93C6E0806AFA3E9AE8FB43D4CA3352D2DC70D9BAD4D7670046A55401D2D7F4F5B1B8F761B4BCF70D3C1E342411404B1AD742F4EBFCC2FF00A25CCA4C25540CC0D35AF263E35D4437D655B29E1529E5A0DEE0124817E578063CB68E85EA71689A03106DC2011EF53EB6687B8595330A0894B28B384D1DFF003E957B086F73336F84B6CD42D40FF470290099EB11BF3369EBB61BCCC4E2CA9908330A59A9E9507969B0787ABC389ACA9ACB2352C589A8343420DBEE61B8D0BB592EAA95252824951793C4679804D8EFCBD712381C4255FF00F50099007ED330815DEBF9D4522470D3E5C84B2C150B003A369CBFC5C9C0AE812420D32BBC1027894B00C5E3700C748BFAE36C766794CB0D3319294002C389346E60E85BF9B4384E3E5A50A12D290821D55677AEAD7A873A36E63356599AD78032ECA6AF306D32169650F2BBBE232094212ADFCC72DF618A466BDAACAA43B4F94B4A6FF324003667D8DBEACF11E3159782B5AD6896AD0B713F27D08A0D2ADE12BD3BD9B6BDCF9E4D3657A5F365B8B20049A1A94A2FB4AD6C817E4662FBF2C52E6FC4CC9302A509788912D44D077881BFFDCF47A8A6CCF0CE766523898AF89239368F5F3B5B5EB7F647EC4FED1BA9592EE5FD9E2EB1901254A7F33A7A5EEC2EE0F0BAA4933D22C79E29B9EFF51585C866265CB2311DE71550AE266009A876D9F5BF3868ACD70284ACCCC426514D5296B96347A7D757B18B5322FA373B79CD78467196B7908541505D6D255F08F4EF8EDE5EEC5626FF0054D85980032542EE0A54DE3F2F56B5E1827B4985492EA0A4BE8A29FCB03FE22CCA6FA2AF523A38F3DD7AD50A94077484D132E1FF00571290E72F3E57E830D07F536B72AC1E14CC209E26251C3CEA9AE85EC393B05876B30E1242425059A8429DB91D5EDA58D61DE9FE8AE0820ABB4B440DBFF86A26FBC78EDB9BC09C34C57F5238FC494AA6E5A66105C1E3A83E29E42B082FB53289FDE189DFF173AB46EAAFA2DA9C371FFED6114EA13C08394A55DE1F52E7863AF5E76C43E3BFA94CD019694E0A64B4D4169855C351A70F2AF4DCD7795DA9C3A1DD6140DC7133F5B575AFA6B5FE75F45E6BC4073FC3FAADACE42BEC90D314A1C8DA429C1E42F204DB78C2F23FA93C50E156225AC002EE49F06497F4F4787D23B5387B258053BFCD4F0F3B33EDCE9ED4BF4777B43E996C2E9B224D734EF19EF1BAEA425B0904C96D2B24F15E39C99F2C5CF25FEA37018C5894A05C517C4952589E7C3A837DA8EC224A467B85042C043F25025F5737DF5703778EAA6B6EC6FB44D0150B6F55E4398875054389AA479C4A00B9FE6B2DA926D17E288E918EA7967C70CB25A4292B94870EAF9C135B386241DEB534262770DDA3953662509295710600A9AA2B525BC45FC1E2AA5BE5B5C3CDAC380C354EEB65B24C90788AC03311B89DC62DD84F8AB96E6B294A18847180591C4002FA00E2B436E578773D5331E4F0A824A59CA485B3EC5DFC34D8E9A066C95BA9A761BE3A8BCD37D8481B9872C36BC49F5C472BB55FEA738CA968E1492DC4CDADDC063BDCBFAC269C9E7A921E62B84F11EF1C93CA8FAD9CF8467515AD28B694B85156DF107D909527B90A8E1874001CE213B1F0EC45AEE8E4F3023BE91892B2594521A85BD59FCA1C232AC4489615C4BE136507636A91D2F4D6D5847DF892413277B9927CCC74EBD7094B54E0A6C42485248F995AB6CFD3CF5A5779721082954C4F1105C3D811C9A8FE7E158E7EB12209558D81262DCFF2FC3125326A26A50090B2072F201B4FAF487188C41527810A5252CCC090C3D3CBF980BE15F68957A927EF18D5D2400500B6E7F888D12824B82C6B6045FC63732F4C80600B6FB03BC08B72DB029408AA016B57FC5BDB465482AA1538B5BAE9D7DD21636F264C44DA4733F2B72F5B7963744E280C9A0B30342D4AB01E3184CAE0FDA5B5760EF1BFBF09E1BEF78FD8936EB1F2B37514051213525F66A79746D21708E200AABB121DFC1E961F6852DD4A6D06D17DE4738FBBCE7973C63BCE41C73F6D4FAC379B2900314860FB33574BEB6878CBEA412B24DAD37F75B616E971CF960331F4F5FE222E749410484802A6C36FADEAD7F08EDB6A0040701045BF3C31CB7304BA7FDB2FA579BFA3F378F3BE0813C15616661576D74F22D78A97340544F0DE27693D3A6DF2C5AA5E6A5293C2082756FF001A37BAC5E72C07C68E3A83CC7DE2B8CE5278556379E477822FEFF909279989C7672B03F6B9666DFA9D41BEDE16B9E0DE83D1EE29AE971E7B08AC734596EA29D441E0495950E5E11B73DF973F7C028E5D98AA695F10201DFC81D18EF4A79C5D3286A92C188B8DEFCADA9E95B98655D7AD550FD7107BA2A40A640994A93092A02D1E200ED1067152ED203384CB9A1E571B51E2EC84F1C9E009A81F317A105F6E434B691EA87B17F6AD539AE96AED10F362B73FA1EE0D0075F08516D6B538EAC15595DD340280327C3000918E059E610A662D4B5129413C619DCA8B245011AD0ED1C7FB6F9605A953254BFF006A603C079A5B8DC1A8A83B69B47A5DA2B519C9DD65D72BCE6B475414D66C1D6781B6A41406FB95CA48BA91294C18E2DAE68F98658713254152FBB5A6B2A60357049D1B50E4127504B472CC0A97976238D880F50E5AFE43C3C63A43EDADECD20297DAAF674B41A0AF4AAA33BC9A9A9D24502909096C95004AC3CAE25C25238660ED8E87F0A73F4489F3F29CD4044F96129C34F5B0FD55092364F7618126A6E23AEE4D9C4A9D2901DDD8104FEDDDC1F3371E05A3ABFEC4344731EDD326555708144E540A9429B0A054195252786265244D872F5C4C7C40C6CA380C47E9CA44DA061C24873A91B8A3BF8C3BED14AC3FE88CE511C2A4121D80703CEB4B5483A08FA26A3AE6695960B550AA86D68285A12DA95C240E14400098D87B8EDB63CB39B058E352A50410494A9C55EA4FD7634AEB1E54CFB339471CB94140A7BC29E170D73B694F26DC9892643A5DDAAA866BAB6A0B742B2E29E6DC470020FD910A20F316F973C73CC51C4AD6A329454F4F94BB7BAD4EDA5A3599230DFA633BE57E1A3B6DAEDD75AECF120CCF55E95D2A834B42DB4ED50078DDE107855CB84949111CC1E9230861F23CC33450E2428F0961720FF8F2D4F3A34F993B153552E44D52425458A7C7A7954DF48A0F57F6A4CD5171BA8AD524F8821B4A484EFB5845AC49881BF91E89D9FEC7CD94A4999873421DC3BDA963BF8C38919762D5533D570EE4DA806B715A39AE9143E79ACEA56C3ECAEB514A1EF152AFBB42CAF80F12BA14C6D7371EB8EC99476792908030BC4A02AC198598EFA6BD280C4FE172013402B9D5531A834AB5A87DD0C75E750EBACD16FD7BF515EAA86698B68427842678FC2600D87BA062EB23245CA4251264103CD893ADA874E4EE3533527B2D216C14B0A70EE69B1621EBE3D62AACFB53BA1C4968948209510A241E200FBB7F2F7462DD90F673118824CE2A961E9C5B6B41AD830E6FC9599934BCBD8CA214FB537A0BE962DB83CABECC351BAE182BEA6EAF5226E2C0F95E2D8BE60FB3699443CCE2F02C7C2DBFF0D573250490C1B42CE6EFD6C4D76A5E910DADCDD6E470B920C830AE978DEC7E43C862DB84CBE54A041097A0A8BDB7BFE7C62730F24380C5A95B3EE3DF5D5E2235F98BE6DC6522F2662C3CB909F3E76224E26E461E426A780780E5B0D89AFD627E4CB40482000534059DABB6E74F1DC4465DCC9C3FD44949224107E22FBCED8713B2CC3E350C3853B148A55B40D6B757EB1208C009A54501ADA6CCD5FC4335557B841324037BEDF3888E9CE7E1ACAECDA10070CD34B86ADFABF95442A32E54B7E21A8615DAB6229B5872AD5B055ADC2B009514C4917DE46F7BDCF5C494ACBE6618057116A358380CE19E8D4E96A5A164604B3F091ADAA6BB5ADE81EB085FA9B9922FBCD88E563BC8B79FBB0E06231086F914AF3A6BB73FC3DE1C0C3B1143535F0A0E7A1A68C79B205D5A927C2241BDCC7E22F63373870AC2E1B31923F56B4208144AD41243BEAA21E9A535DDE24B0613294788B6940ECDAF20CDF6D0C6C69398559029E92A1F9B70B2D38EA8F580DA56A3E71F28C44623B3F93212B51C74892054ABBE4D80D7E70283916D5E1D4CC5C8428A52A4BB56C35A5F517FB1898E9FECEF59EA4714C659A77347AA8A929612ED154B485294760B71909BDAE2C23CED48CE3B4390E43C6A939B61A7AA557804D43BEA080B27CD9EACE2194ECCA4CB524AD6025479114205081F9D83DE3B1FA33D823DA6B5829AA8A8D24DE5F93B852A354E56D105A5B55C9EED4B42E40E5636E471C7B35FEA7728C8B10A9070DFA8992CB06248537309203B1673E7584F159E6065CB4893344C24328BB70B36F42FD37D03C76AB4B7D18342E37DE6AAED03F83D43010A7E8D1446A038A31C480B69C8B796F6EA46396F6CBFA9CC776904B9595E58A9281C41644E32D9EA09701EDC9BC62B38EED62A505044C03621890297BBEBF715A76234B7B0C7B3A69A6D0D66D4BFE2CAB4402B57D6A8F8C88BD94A001E7726FF001E653FE26F697304F0A27CDC0F15E6199DE316BB13FE69688299DAB985FBC99C6F70297E8D5D5A8DCDE2F1D37D897635A24B8E696ECC6932E53DC25C79DAD35A1E0DC701087D2BE1E1E805EF388239FF006967A97FA9CF66E212A6F9423848FF00C4DCE9CB486533B461638904855C7CDE7AE8DD7D4C58ADE6EBCB1B0C65596E5542DA4404A72AA25280116E3EE38BD6FD245F1018ACAE7E366F7B3313882B26FDF4C0097B9653005C0B5F5BB207B4734D02CD5C1D7E9D46A2352B35CCEA7C4FAD3FE90C3696072990D848239C11E58565E117824A93889A663B7EF256D5A312FB8B7E62BF9AE753D750B21C9700967028F5D2A77F368D2A7EA957E37D20C41EF17CB7E7EB6EBBE1C24E1D54E140F2FC52FE3E110A3339E47EF556ACE58BFB0EF189A779D952DE748039B8B813D25437F9ED6C3D96990406425B56001E868EF7E9A5A31FEA9882ED315E2F4F33F6869A969D6C9875C302DFCC549173D7D3E7E787C89120904048D9C0DABB7BF53FD4E79A7117143534E8FC9FD3AC3154BC040A975D41FE8BAC91783B137E5EB1698385D381C2CCAA9085686836E4FBFD615959A620280E3350C2A59F5D77E5A5EB0D8E54BE3FF97CC9F644DBFE27431CFEE9C67FD270CA344A48D030B9F3FE6FC83E4669884D96A0372496BF3FF3053E619E33C6E0CE9C5017871B2B00F48595020F39C2BFE888A04A824AA80A5203D2EE08E5F6112387CE31003898ADB5BDADEBD6DAC6AADD4A9CDA9D596EA2C872ECFE81D05B794ED1D2B2BE056F0BEE4AE483BA4838513D9854A2A5C9C64C96B50A1E252803D38A97B35EB1252F3EC48293DE2C503976A35598B8F27A523AFBDA07B24FB3376A34AE53D16408D199ED5059773D6DDA9A914AEAEE1429414B6A9262DB74DB1B6165F68F245CCC4A272F1C5052A912BBCEEC283BA83BD29A11BD8C5FFB2DDAD9786501899C4059657117E837EB56D63CC6EDAFD81FB44EC9456661A5595768FA71216EA33AA608A27A9DB00A84D224A9E547D93693C338EE1D90F89E8C5A256071F2460F14964AC2D4286CE16400697A86A08EC9957697018A530527829C21C11CDDBCDBA523CF9AA7336A5AEAACBF36A3768DDA359406DE694D380DC292AE24851E1B8F10EB78C77CC9BB43230C12B13C6202C0243BD1AD42DE3E517644FC3622524A4A4F10B023A585CF854D79469EFD179880379B7A13C8FF00B6F8B81C761339960238252D983303B3E84B9EB4BC4163B0E2BC15B503F5BB36BE1A93A6C53E821245C1D8F5B5C5BA1DE074DB9C4FE8E76114F31F8093C24B904540D0B7E5F788C1294160A9F57A31A386234D1A30EF93FB9FCB193300A91EBFC42BC0373E9F88DCD3DF6B87CB9FE630779CBD7F883806E7D3F10B1B789F23B1FC2D1F3FD70779CBD7F883BB1B98C9EA854A60FC083F1B5FF1E671A2E630AD01E62BD76FE6374C9777A0D1DDFEA3DEFA728A93C8DBEEF740DFAC1BE11131C5C3D039B5EC694D07DED09CD906AC016A74DF7776E7B0877A0AA502A8369111E51BDB73BF2F2C678EA694A372DF4AC45CD90E750350C0D3EA7C34BC77CF51E5EB71C5051932AF0404F3200046F7FDED8432B12183292C19EA090F570FD3D63CC9817E2041A0D2F4B963420877F2A4545A859772E085200A5EF42A54921F2E70FA4F0C6D1F9E2DF839586C43844C042400414B33DAE35B6DE517DCB9822C1880C7AF2F2ADEF152672FD528A8877BD1CFC011689E83CB7F5DB18C5E512149078D2C7567B9DDF5736FF371C194B25CF2DC8A91F7E6CF6B456F9A07090A75239806C67AEDB7A7A4DB7849B21182A022AEC436AF7B74FA1BC5C32F21201497E4C777E57AED5884D70001B08DE3901FEF73CA715FC7244E428F0D4824017A1B791F0A6D175C11331043162C1B660FE15F758977649AF33CECFF005EE459FE56FA99629EA52DD692B012A6DF5A5BF182608095288F7F4C735CE32B528F1000A49571029D85C93B35CF8436CD728958AC0E213351C5340FF60B1F95CFCD4A03AD76018C7BED91EAAA6CDB2ECB731A65A2A29336A661C438D11C3DE25B4174786D3DE133D31CEF1D8732C2A581F32497B549B7A5ECE2F1C073FCA15855AC80C1CB162373E9CDDDB58B9F24AFA4A9A07B25CDD947F0ACE98729EA9D7877A965250A42086D5C533C53E1162271CEB3ECDC6553A44E49289D20A8A568F96F7729BBF32D70221F2699311315FEE94A4104F83DABA1D1C6D1D4EEC5FD9A33FECFBDAC296AB4A65CEE69A1F3172B2A1CAD282C329EF2956BDD60D92E2C8104440DA6D50CE7E2262716854B2E02B84125454DC2AF3AFAED61161CFB389588CB061D5891DECA4A8218D55C40BDB6A7531EBE64793653A529EA5FACAA6DDAC078D146B4825854CC49242A77988B4EDB55B179C62335526570144920052AE5541E219ABAF8011E67CCB2B2BC72A709DC40ADEAE3FB9C6AE06A01BD05E23F9F6B5ACCE10F34BE1629590784A385B1C2245B8426F6F5117D8E25328CA6520FCB24952AA5C955FF00F559DFA56D589718713B0DDCF7CC4A48DB403536DF4E44B375A7546B1656FA99A373BC5D39525DF119BED249BF2F2B7588EB1D9EC9A58964AE5A52E450A406F120120FF8E6CB2CC84C99B316495125C5BA915A7BD6F1486A0D50A056A2A04DFA488E62DE9E98E8784C0E1E4814492350D635A90187E6AFBCCAF00A4B324834AB1F2E75714BB549D6A1CEF527D65B2B5BE5A53615C12779F2E5B01F0C5A72F12D3312132854B6E5AFD0EFBF898504AC4A0060AA52943F47AD87561147E6DAA1E53EB6CFF310A2249D94394DAF07998EBD063A265987C34D4874A5058559EBB917AE95A3738591331628EA013A69FE0DB6ADDA2279C67C9643243E58EF02B89253C7C7CA24ED1C84CE2CD84CB82D4B200570B70914636D285C1D4D1D856B12983953B140F1254403525C9E6C0D9F666D5E21D579AD1B92A7495F9DD03DC200F5F85A31312F2E5AC072CC5A877E96A6B5DF78969381525884B39A505EDCB4AF97278D556654C920D22E5641E23C53C3D01067AFDD322D8772B2F41238E604116255FCB8E571B077893958650E1E305AE094B38B0667FBD9C07BB1D43F5AB9716F828BCA2104C45C5AF7F41720F39C2BFA1C3BB1C5A470FF00DC001B33A8EDA8A57568934F0A40484B1FF95459C825E95BEA46E2195758B0A8A5A4A82B9873BB65D7E49D884A52A22FD3A6DCB0B7EBF23CA10AFD66632934FEF58727C4D39FF989EC0A4A05D04914248F3A9D43FF00910FB94697D5BAA1D45365390E6B5EEB842508FE1B54CA5449B7F30B010073927E57C41E3BE21766B02852A5E658770FF2F7A8A9E4EA716F52D0EE6E265CA6134A43E80A4DBA758BAF4EFB1DFB456A250FE13A25CA3A77F83BD79EAA6124A55B1097824A60192239DF96396E7DF1FB26CB57C266226F0F170942F8830AFF00692396B7B3C68730C1A038989516622CDCAA3AFE2B1DA1D19F45CEBECD908ADD65AA5BD3E084A9D6BB962A7867ED0FE5BA0DAE3913CA39F3BC6FF565270C95FE9307FA8526C97297BD1CA5B415BDBC5BCCCD7082C108AB12EEEF6A55B7B45FDA73E8DFEC8723528EA8D53FE27523861A148FD206787EDA7890BF1F19040998F8E395F68BFA9CCF7B41C49C3E5F3B0411FB4A2612EE4D7E516E6C0F48AC66FDA456087FF293434CBD02883E20FA5FC5A3B0DA47D9DFD9F340703990E8C65EAE6C828A879C79E0549FEA28792B499B7236C73B9BF127B639B288566B899725414152FE6143A3B83EC86357A64FED1CE9B314B5A895A8D482C36D282DB8BB98B869AA58A64A5A6724CB1B61B1C34E96F2EA442909800CA92C711311751B462117271D8854C9EAC7E20AA6D55C53A6904F205675A9A798863373EC4AC01C67CDEAE343EC55E1CD2FD4D4A78471B083601B529A17E894948827947DD66B338E516989EFC821CA839FFC8824FD81D4C47AF339EA720A8F16B51BB8DB9D3F98D468452294A538A25DDF8D5C5B7BEF37DBCF1A771FADA22477406A05075A026DEED0C311899F32E49376726DABD7C347784AA4324C828F23001E5D0CEFB637FF004DC423F602A6152E453CFED5D79B41326AA951E20BF58E50A4A66556E84CFC24DBF19F2C06662B0F4EE896E4F50C7C793EBD68ACA335C072491AEE082E599BC6B4DE352D6CDE4A63F7E53BFECE105E718B92DFFCBA88AB104F3DB978C39E09859A85AAC01E5A9D2DF88C5A75A4856C7C847E53E9FB8798654ECDD1C53126504EE2EE48B167F1F08CFE9153182FE63573D6B6EBBD9F68D6AA865332073E6246FE40DBE1F761FCBCA59BE634B6E7ECC7CE3539730D0B1D6FD286A7C18BBBDA105454B728BCEFB1E7EEBFC236E987B2F2D20B124333B936AF3D34D7CA31FE9ED7040D75F1753F46F65B9CA84110543C849FDC7CF0F51810CDC64B5F95DB5AF3DF58DBFD39C58685EDE05DFEA7470CF0D954A6D7C3E14922FF003E5B9005FF0008C3D9187E1242AA92E1C6C00BDEFF00687787CB9249A07D8536D7A8F2AD21B1E423FB42444FA5FA81B7E1BE1F22525CB38E8FE546F53F7872701C24961D0D7C3A569F567742B284F100A067748833CF9C7FBFCB798274B0148048AD0D08EB736D9B5E90230C906CCDEF7E9AF386CA85260CC08312204FC23CF7EB783862BCC71F2AA994A34B3134DEC76E9CEF0A09006AFC9BEEF7DA9E570DAF02D34F5624A5229C0E2480257C5B7BF6DA4C9F84BE5988C4E34844F4AA5F17ED7AD06F4A74FA968AEE7388C4E1969FD3F130AB87172294E67EB0647A9730CB4B9581487B2F78143CC54A50F36A6D52850E07828010790B1E9C94CDF03879C8017F22E59E274ABBB248A872962588F1B8BC4F7677B4F8EC3AD1C4B50346049DABD3C5AD1D6FEDE3D913B30EDD32BCC73ED0E8A7CA35EA9A5BCA2DB6509A87402A212DABBB641E104481E7CF09E4DDBACCB24C477338CC9B2414212A249090282DC44B6B5D23BF767BB5EA9C2524ACF0967756D70CCFA53C447833DA4765FAA3B34D4359A5B55D15465CED23EB4BAFB8857054A428A9252A808BA40FB24EE3D71EA2EC56732332972F153316996DC2A282B1F33B16151D08AD6B526BD6B059849C5042E5965AA9C1722D5AB3EF70D4E8212E555138D34C50345A6980A06655C449B9955CC993B9FBB1D4F1B9EC9C721126524112D207159DF9B68D6D77A51DE230E95A8AC91C440E2200A1B587859B972D1C6AEBF21F96233BD2400D416AFF0010DFB8FF00BFFF006FFF0054668708993F2FD318EF08B06F183B8FFBFF00F6FF00319F7C46CA23DDFA6326613704F53FC41DC7FDFF00FB7FFAA39EFF00A92A1F77EFD0E1099340D58ECEED7D1BCF997D614461C382EED7D1DDFAC6F6DEDA0CFA5BCFCC79C1C23DEDFE6F4E9CBD3C79C6B3648014F534F7D7C07850876A2A88E3BEF69FD8B6F06FD6D80CEAB1557A7BB36DAF945CF94CEC1A95F4377DEF4D758F7DB59FB27D26A443B5DA635EB4942C2968CBCD121244EC8EF56B493FDBFA63CBF947C4ECDA44D48C4E1A64A941899A492E05E806EDE7E11E55C0844BE22B0F41C20D385B67BF51D6F1D57D4FEC9BDAC65EA29A3C9139937E28A94D653A83813B28202D453D62FE9B01D3F2DF8BB8698024CD5255F2820829ABEE40BD6C7E916DCB6721012153122F471A8B73DB7A6978EB4EB7EC3FB48C982FEBDA7EAD8E1E204B2D29F802D6EE90A99E9F0E98B02FE26CA29ACE43B3B1983ABDC1FF000E368B860F1B87494954C0C0D9C397AFDC98EB8E75A4751D2A887B29CD94429524E5D569098EA7BA88EB3B615C2F6EB038E5813F152D1A00482DA9B97E9A79C5B7058CC3A923BB5252DFF70735A6AFA68CF4A59EB6CD686B698AC3F4952D116875871B20DADE2408DF9F9CED8B049CE32EC427E4C44B503A710D7C7D9F38BDE498A925B8949B860E0877EBEC79986BC1D70A9A69EEE8929936B292414C90445F698E5CC5A2B369D84282D310EC5CB86E46F4FA3F9C5ED69C2AF0EEA29720FCAC0D1B4A56D7E7AD48F5BBD897B40CC75664343D9C966A2B333D36427EB010B7439F5A73BC400A09527C298FEAEB2236E319EE3F012664D267A0281759E260C1D99CB5A9A39DEB1C4BB7B83C3C997DE808952E6F1F761C1248FDCE2E2A4DC748F63B4776415EFB8C661AB9C34F42D842A9A9140053F61C40F010A4418FB42083E58E19DA8CCB09984F54BC1ABBF525C4C20370F9D08D3D46B1C1262E5CA4620A2684A8711005C8D350DD69AD758EC054578CBE9A8B23D3342C656FD1021CAE86DF754DA882485A815094822CA3BDE6F8A0A32B5A97326CC26622614F025B878384D41A56B7E948E5D98E678C998832D2B581C443B96356B68D5D76DA2B5D4B5685E66A78B8BE3504F7AE952825E21104845922FD2D04C729B4E599710B4B49766B0766E751E773D69B4DC22D720CC2A3C5C2E473DE9A170DCBC22A8D619D56B4C2DAA5580D1042B848063A7AFAF39922F8E9F926024F1A4AE50E2A3063E2EDA534B73310984462BF50996A52B84A83925B5FA1BBD0C75A33DCE99CB96A595CBAF93DECA88BA45AE491E91D6F16C5B71B2C20CA12889628080DBDF7726CFEB58BDCC989CBA52149F9CA920921EB4D48DA8D14CEA4D5C885F0EFE216923A5F96FEBBEF7C5E7B3B9461315C2676252E786854075A936E9E109CACDD2B3F3CBF4AEC28D4D2D41E315257EA1A7AB2454B6F786780212E2A49B5C207BC75F863A748C83072C20CB5C8530A9336586B6EADBD626F0B889136E024D1DDB6AB747D08E7CE34BA2CD337738327CAEBDD5AA424A28EA0DE3707BB20FCC5B91061CCF46558297C5331D2249009ACD411E6547C6C37E526818472192E1BFE3ABF87F9AC3ED0F60DDB16A984E59A6AAEA9498E02F27EABC1C7B7FC54A42E6D244C75938A7665F1532AECC71204E938E4BFF6CD4929035F94A987D5EBA44B613F472C1F9D32FC8B33D81607D88B334FFB047B43EA2527F88E548CBA8D712A35348A294D8981C4156116B138A4637FA95CAB0AB5265C932C870C3896D70F6200E861FAA7E0D80EF25922A15C4915BD9F77BEF17264FF00462E6301CCFF005CA72050E12E205222AFBFE6A00A1CF0F0DC08DF79B629999FF519889EEBC061D734172BF9CA0827F6B710F5AD199E90D66E6928278664C42B87FE991C3F2B9E4EFCBFCC5E5A4FE8FEEC5721EED5A93509D44EA2EB47D5AA69C2C8DC781440980091B75077A2661F1E7B43382C4A91370EA2E1333BE2BE1E60354F2AF5111ABCD81042A7858D8003D6AFF6DC98BFF21F673F678D2602F24ECFD8AB7EDC750ED4BAB00A2784F76EA488277023998DF146CC3B5DDACED3F12B139DCF4A0542424A59E8CE0B9D2A5C44163F3C561DBB952ABA851F1B1DCFF116AE5E9A1C95A14FA7322CA72E69B84A5272EA275691C80716CF17BE7CE462BD88CBB34C414AB119A6216D60264C079D38ABA73110ABED16281A2967672487F115E9AC6E7EBF50BDE27D6CB68FE8EE5965B007A36123A7481B63323033258527F50B98E0385F128EBAA892DAB0FA0AB39DDA0C58F99D55BDDC78339161EEAD8A756E2CF7F993A49DDB8584CF9C1F2DC6D63118789CB4104AA5850ABD03DBF9F462F4664BED062839F9C93677FF003E7FE5400C34900B21C0B175973681209124F2F5E584E6A8E0182240505120808725B5766A79EE7409CAC7CEC7179814CD406BAEE696B59ACF4846E54D2B5E215694C4FF002FBA1FF4F144F51B448E5B61CCAC589A901182295D3E600D6B701836FF00430B842D475009342C6A3504D6B7BBD9C98E59D4540D85875B48200E05752378006C236F96D892460B133EA1250EF46DC3B37BD28CEEEA561C29B8AFE94A917DB97AC3755EA8609FE49092072DB6371CF7F31E98929393A830981FA8DFE81BD29A43D978246ACC4588E953A7A0F188F556A171EE1529E8093065439F493BEC2D6EBCF0B4EC327049F96495BDD8174B741FC36B4108E2B0E89600410A05C11F4A9FCED7A437AF3C8559D4C1DA143F1EB6F31CFCF59730AC809C32EC78810AF070C1EE7EED0CD329CF090E6E77615A57E9FC423775129023BC0799F15C419117F873DAD8949382135819079BA49BBF27F5E51212F0C9201E163D4DBCD872A747844BD50A124AD244990543CB789BF3E57EB87E32394B002A5027FF00450BECCDEA21FCBC1A76FE1F4ABEA39F852139D565327BC03D543AF9903CB95FE1855191CB402112B843D404F2E87AF4F386B8C906511C20D5F9F9381F8DE342F562C890E0F14FF5A7DFBFBA3CBDD8DCE5069C29A0E458DF952BCB4F38E75A07CE3EC6BCAA7F10997AA564FF00C498B18526DCFD0EF8426E533459246C5B6F277A73BD1E3624F0B849AD8ECDCAAEFCBCE12B9A95524F1DCFFA87C7F7F3C31565D8A07F693CB86F7A0A13B59DF94612166BA6B46F3A16FE232A5D46A5F79C6A1023723DDCFDD387584CBB12A727880D4116A9D1BCBADE1D61D6438343BB86D7D3EFE718D467920CA811BC7145E27E516E9D231248C04C961CA4977DF6F06B373A73858CD27FCFE07F88C292BD355DECAD29E1893C5BF900489F5BE362860077640DAA5EDB8FAC26A9AA49AA29CCFB6A59C470FAD2A0A097048DEE0907DC64DF7B5FCF18135083594E2CC53AF3A6BE1AC6AA9E4D58FD7A685CB5FA436BCF30DB0EAAA1D2536F009F1F4FB33B72B4F2C2F2A782A4944BE0BB909F2D3CDFC01895CB72C939A85F7C4258382A67A3B8140C69A42043F963ECCADC2DA018EEC0599336F2F7EC3CF096372D9D8E6505148AF11B167D6A36DBC75847199248C32D4652D2003466A51BC5EFBF8D23625C6A9174CFD2BA685F492BA2524921E832B4A84C7900B917F8B34E130F854AE5CC94261218A88B3B8A52FCE15CB7133B07352CA20021AA6D5D3F3E24D44417B70EC334B7B50690A9A5CC2829F2ED7795D3B8BA0AA6DB4F15529292AF1A9B084494A07DB260911E2DA3E4E3B1BD9F9885C89D31380E225402947B872080C0BA828DB6B5ADDAFB359F70A90A54C09581A970C4070C4800E869B697F9D5ED2F416A2ECD35766BA475150BD4B59963EA6C294DC36EA3895DDA9B5A5210B1C204F0931378B63D07D83EDACBCDC1913480A40002890EA70EF50E3CCF2ABC75BC1E324E2A54B988980F183C4970599C56A5AA79024F9D7DC6A98813D20CFC2671D6C294A4F184929677D199F6DA1FA51C5FB520F808C16E2936B03CC117F81FDFE0D978E9083C2A5805D807D75E7E958C29007EE4B7A75B461DF2FCBE18593392B0E9623707F88C25295164873B545FAC721E5733EFB7DD184E62CAC809E8C2BB6BF56E861712BBB0EB0C0DAA6EDD6BE0F0A5B7AE20F3369DFDE479EDCEDD708A8197520872F7A93CAB0DA601707D2FCFFCE90B98A92926F04C11703CFF000E9EFC69DE23FE43667E7B7AEFE71173504A8EDCDEB4E7E14F03611EEB687EDA28B56E4B4B5F415A52AE04F1D1A5E217C560411C4166E3A7DF38E6399F626461D6102527814FC2B0078B860C29A8ADE3CD998767A74BE2480525248A0B9AEA39EB56D5EB178E49AE334453F7F4CFA815892D38BEF0A78605FBCBDFC85CEE76C51332ECD2A51504A4109B70A5B5DC5C575761B55AAD3B0B8CC3AC8429418B0BD0EB7A1058D37DE1F59ED3F380A087E9289F44C12ED2D2B93E678DB50DAFCFD0F2A8E27239D5265CE26E005AF437007260CDD6C61C49C46310A1C530BD1BFC3FDC0BD4439AF5CE555D4CBA5CD34F64F5497C4718A2A26C343FAA5419FEA9EBBD84E18AF21C793DE495CE90031502A5176EA6940FF589019B62A5283CE551810ED723622BCFCF522B5CDFB3AF67DD66EAF2FCEFB396332AFAC2502A292A1C6C256BB02453A20415036FF66188CEB38C8D4923325CB9693F32141F880E64D2F423AD6AF7CC8BB5BDC00264D2486A9558EB63B8E756E515767DF44BE94D4D5943A8B24CC93A634DBEB53D9865EB4AAA14EB44828405B8E25C4102D298266F84317F16D6B0642E712A0024FCE471102DF9DDF5BC5D95F1144891FEDCE1C481FEDA8A8324EB427E606DCAFA477C7D9F7D9C7B1BF67AA34A342D0D3D5679C094D4D6B85456E38911C443E55B5C0124016C53B1B9B6233E0A016B9724BFCC16544BF315BF372F1C73B5BDB4C4666B9AB99882B5ADC10080070B8700161A3B00FD62F7ADA8AFCDEA1E79E7128503FF00080084A06C0003853B03748F9E236528E440AE72FBD44DB155C80DA924F5276E42397CACC66CC5CCF9C92EE43DEFABFF001D2C18EA1BA868C90EAD5B7F2DB52A40B72067D66230EE5769702A2C6580FF00F73B3F40C352CC35F14CAD255C4B40E2B82456A6FAB730C2B10ECEF2DCD336EE9BA1CADFAB7D1C501495D3DD5612A5800CF9EDEEC4CE03B5584C3AD5C012C59EAF41767E5CBC21533CB049FDA6800AFD056FFCC41ABFB1BED433849527206E8A9553FCE56614EB21276250A58579C73C5830FF001272BC3AC209698080592ABEB5667DB9962F184B03C4940079102D52C34F0D1A22CE7B251CFDC0E6A4D7BFE1F553994308CB855F7FC5F693C6D984949B1379C2B9976FF173C4B396E0063925F8D426897DDD9A8C1DF6687285A6682274DE103F682C767D3F1B58564D967B21F65D4252333CE7FC431F689A77A9B8E05F63691CBFDB11E9EDC768387E4C1AF0AA028A13DF84F47FA862CCCD192890141960B37F6B7D77A0F1B356279967B3CF6099382468C4BCEA88870D53EAE229333C278A2FE93E7B618E23B5FDAF517FF599D2907FB5DEFA163A57CB7AC6FDEA01749D2EE5B67FADFADDE27796697D21A7CA7FC35A6A8A9383ECF1B0D3A44411FF0015B331FBB620330ED06758E97C189CC31334310E16B49AEC42BAD346A88DD38B9A97216435AA4937FF0015E512919B57BC022B6928D086ACC062969D98B00412D213C5B5A648F2C43E0654C26628AE74C2B238B8E6AD5FFF00B288D74617BC4763731C59002669D59A877D4F3ABF23B4267EAAA9D1C2DA96849D82145239DBC307E189232491F384B06350090FFE79C468C6E3CFFF009AB67BBBFBAFF986E4D23EEF117DC70C1044B8A264CF99318CA70A14C18005F4034B53D4185C6231441798A7A52A75D9EAFE8D7D2368A669BFB4A048DA483B6F2663F59C6DFA142A9C219EE40E8297D2947A987099939BF7AAD73CC31D7E8083AE91B05752D28225002F918E533B9EBE62E37185E4E02683FED2481AD2DA6D62C0DF43768590954C204C2549A9AD3A5074D61A6AF39A61242D23EEF94FE53CBA494BCBF1258976D86DE36A5AFE26B0A77097A02C3D3C798A5B41D6182AF5353D3000BA0C93CFA6D173E5D6D6DF129272A5A8025245AADF7EBF4D69019090C421C7476D39EAE59BC223957ABA94FF00E6206F7B731F0E5BCF3DF9E2564E50B15009A6C69E8E29F7B464E1A5A88F9051E8CFF5B7DE9ADE3D57AD92D001B766667C5C899037807DF07D7793939089A1D480A6FF00B45DEA6CFF00CF9C2B2E44A03E54B3D28E35F23E1F5AC46EAF5D1332E024F981703EF9FDDF1292BB3A84B34B48662070F2E9F4F387224814E1B5BC798F1FF26AC4FEB8248F1C8BDA76EB3064CDA67DE30FD1912524809BEC9D69F9F43194A149B06ABDC7E61ADED6E20F8EFCFC5CFDDCC7C2C230F5191BB30B96B379BD6AFE1195778BABD0FDB772D7B6BE02AC559AD9C514F0AC889FEA22F3B7EE63ADF0FE4E412CF1712126C47187FAFBA1D2329413FBEBBD6FB6F0D8E6B47044B86C6F0A3CE23F73D7D0BD4E4328544B40D43247E2AFA53F30B2252410421B9D2BB52F5D77844EEB4709003863AF11D86DB9F8F9DFD554E4B2D364D79240FB31F77D1DA2593FDB4F23EE9AC37AF59AC190B3D278A40F7491BEDBFBF7C2C32996DFB6ECE784D5B4B034A6DD2B0E901496615AD684DB66F7531A15AB7BDB29DDB621506FEA47EF95F1B272C4A5DD001E97F21E479C273A5098C0A5C8D4E9C98B7D630FF13A3FE72BFEB1F9E37FF4E47FC47FE3FC421FA51FF11E9FFF0014649D581BFB2E154EF2A063E78D55964B3FD96D923EE3DFD33FA61B0B35403B6E746A465FE3157F7FCC634FF4A957EEEBBF0A7F119FD3E8C1B664FE63735AA43C4953844742448F71F9FBB1B0CAD228897E694DB5D3A437992BBB366E8CC3DF5610B11A89B3092E18F27279CF33F0F3C68BCB4D7FDB05A96B1E8072D0C26505AD4F03E90A46A244801C2044471013D363CBC81DEFBE1BAF2A0C78A58DEC34BB346BC25DDAF7706B4FA78690BD8D428FF9A4C46EA3B73B49F2F293E986D332A4176403425B8454F887376D3EF0265077E1A1E8FCEF57A5DE168CF1A72C482636DC1F98D8FE7E8DCE5A949FD95BD874B1A7807D79C6C999364D251297BB38A3FF0027FC085CC668C9220A2368205BCF632447ECEC9AB06A0EC2FB69B3D7ED5D1A144AE6ADF896FE0F777A9A9AEF7FA2A7ABA99D085B8A03BBFB306DE2E824903AED88CC5617852410EE0D5BE85B96AF6B6B0EE5CA4B8243AA846AED434D9ECF53E149365999E694291539324A82E0385253C410601B9BC44FAF5EB4DCC6429414921D2F620B7277D798B51A25254D9929B814436D4F67AC7567DB77B00A5ED4BB305EB6D394AD3BABF4BB2E5454B4C3294BCF0755FCC2E148057C2DA55048558408B636ECD664BCB3324238FBA4A96912D4E594010E341C83FE5BAB762731981610B52969510169528B125D88B90C6B71E0F1F3DEDF7C9CD169A9416EA90E3AD34D2814F0AA9CA90F02081B7091E21D0EF8F67E419B4BC5E5492A292A54A0D624D00249A55C53CAC63BCE1132C278480A5000AAA0B712411A36BCF4A4697EA454D5BF503C285C252208129B1811D762371BEC3140CD6562958CE296A57095D6A433B5AB6B0D00E909E290002430B0FBFBF5A911C71A7AFC8E2D7830B97853C6493C22BAD479577357A437C2F0AA635C3816DCD79D6B5D7AC1C49EBFBFDFC79616CAF1697982656B47D2FEB41B810F33340084100301BF2DBAD86BAEF0718DC18F49B7FB7AFC70E715884ADF84B372BD6CF67A723CE2118867DB6BF383BCB8857A933CB6DF104A2B33388289ADF66E4F50631C2083405AE453F98BEF4CEBFCDF43E794F9965D50E9485A78A88295DDF0D81BCF01B5F613E9389CCCA4CD4A54264B2DCDE9A333756AF955AB79A64B214E90122E5D87873771AB063A47A3FD9AF6B949AC680D577E18AC69B6BEB6C71EC4A61302449317E104C11D714FC523052810B2902A5891426A5C92FAB5FA54C72ACE32B420AFE502EC58E976D2A03FF88B92975032FF000B3DF1EF098060CA89DAD33F0B9C432E6E5C16489B24DE84A74A015D7F8AD6B41C609525441205D9B715BD06DADCD9EF6EE83ECAB5B768350EB793E5B50FE54D29BFE2754B96830DAC8285202C02E710E48E5638E73DBAED8651934B95204C947133828042784BF0817297E17D373D5A2BB8D5A964996E529BDEFCB566D0135AB011DD2D15D90E98ECEDB64D251AB34CE4F0F1B6F36E0097089238DD053B93B1B45BCBCFD9BE69333C33A825243F090A492A0C492CF4E76356880C4E65370CC10B50A907ABEA4034FCEB511720D1FA973CA74BB9850A68287861084D6B6070931F612B498883613BE3974EC1E18E294938898A585314894B22EFFBAD4E6CEDE4C27768319C247129B60AA6D6F13E8C740859ECF74CE5CE17559BFD55D0656D80B724F31C5C5CAF7DB7C59F058F9F94200448336591FB94B09B5CD7DF48623113712A75AD4E6ACE6BB8B6FCEBBC3A21DD1F9780DAB2B39D2C1FF8A2A1CA5EEE01B9008E3E2F88F4C6313FABED08025E23BA425DD213C44BE875A31E5E4D0E01EE482C41362E4F56A1F62140D434ACC8CAF276E8F7E12B58A883E7C6923E0394E3597D9D9B29242E6289D4915BB3D01F7A1BC67BF528D15E0DCF701FCA13BFA8733AEF0D656B14FC00865A6E89A05C9B1054840222DB98F538DD1912A5926592CAFDC5CB6F625FC9A3638936770391FB8A35A181F4E60F2A4D33CA6C99EF9352A02277EEC1F7F4F33857FD3141642940A8EBC21D853C8F5DA35EFD4C3E7A3D8D6DD6ADA7F9AEC66899701EF2A94542E5050A3C3D07113B5AE7975C4A6193370547252451AD4B9676A1D7913A43895378C92E5F4FA1DA9A7DAA615A72DA350BBC1405B927DD333F9728C3BFD54D5DB88B9A72A59890799858924B98E54DD2D00965C4A4B932080EC91B1B931FEF8D485CF0CA4A8105810E2EDA5AB5AF2B883894050B35BDDFD61AEA734A76E4ADD4C83C92904F98E1FBA2270A0C02D5429241D473B56CFADBC633C4ADFE90CEE6754A248524C03BAA260F9FA8DEDD2C2F2585CB5612921041D0B3D4F2A57F31812C4CA6A2D6D8D1CE90CF55AB69A9F9A401207881E66768998B7A5BAE256564EB99520925BFB4DFEBCBEB1B230FC26A1F6A8007853CEBBED11BABD74DABFE1B89404CCC280BF2267EFF00C0E2464E44416E124DC534D74BF91D21D4BC3D89A1602C5C9F7B6F4D622398F682B6C2A1D49DFF00AC1BF9F8BE44FC70F9390AD80EECBF215BF4AFD0E94687430C4A696D5F9D59BEA2B10DCC3B45714524BC00122EA03F1BEDD207BF161CB7B3A560BCB714041B8D057EBF6A8877230E5AC69A569EF96BB0BC56B3B4274CFF003C1B5C718B8E5CC1D8FBF13F2FB3290C020B3EC69C85EBE7BD9A1D7E9940174D2847A3B1BDFCF61AC6730D74EBDC20BC07093B2D27AD890445C72B5AC31212BB38D5087DC375D5B5BF846BFA6511FB5B4A9B79D2CFE0F117ABD66F4121E1EE5811B473EBF2F762491D9DA0FF006DCEB415BB3D3DED5739FD312E025FA9BBB8E9D3A8A9BC323FADD4D59C701076F18E80CEFE5BF2B7962570BD9F24370330B30F64756E75610A230AA0FF00280D7D19ED5F77861ABD7727C2E5AF238A47CFA7CBA8C49272229BA7A52956AF8B74610A8C3916FB7E7F9E70D0AD7624CAEFE6A03E127FDB9E1C232276250EDA37E038AD7EF19EE0A86A474B5C6FD6F081ED729BC3969DB8A62FCEE7F2DBD70F139250108236A7F07EB1A8C31146D5EAD7D45C53EBB504379D6E924852F6E7C5E7D247C7D30EA5E48E920A59D8BB6CDEBE5AB88DFB824BB12CECCDAF8EC368D0AD689932A9F5503F8FE1F0C384E4D5B59DD9F4BE83EBE70E65618809171B31153CCF975E621139AD1004057583C561F3F7EDD05A7191947201D9C37A5479D7C61CA70E77E800000DFEDAEB7842E6B34816548DCC1FD7CB01CA3E604A75676F1760FB9A9A51E9ABC9720A52294D69E22AEFCE91A0EAB2F9F02E387FD43F3B45EF323A8C64E535A203176A7D69AB56FB18D2761EE5B85EF47D2F7F1F516783FC48EFFCCFFF00DBFF00DF8C7FA47FD89F2FE21B771FF7FF00EDFF00EA8DECEAA2D1571B9BC478F8BE65780E51FF006A4780FBA4C67F4E7424F8375DF979F9EFFF001827FE60F889F778BEF23DF8C7FA3F21FF008A7D7E5FA03E107E9D85490741BFA46D6F54A9E0781C1E189850E768B98FDEF8C8CA7874A3DC8481E845FCFEC9AB0E4E8EDCF7E9E1710B1BD46E5817418F303EE36F79DB91C6ABCB05004B3BBB5AAFBDEE1CEA4D18C2470E496143AEDE2FBC2D6B50B8AB9581111E2927E6267DDCF0D26654521F87992C3EAC2DCDEF194E18B12407D28C79BB17FAC3A53E7EB1B391CCDC193D37F38B461A9CA8104B709DCA5F9D01AB6B5D89D2038751B06F33E9EFF0FD459E2D6482E4111CC5847AF4F8729B623F17960FEDB1D5ADBF43EADB420BC3312141C9361F663AEBD4C3EB19CAC443827D45EF1BCD8DFDF798C33565E59CA496A0A5FEBB3D7D4C604B22C9DB63B0F2B44932BCC52FAF8AA163BA6E244EF3B6D24C6E0EFB79E2171D97F08F950E482CCFE24BD36D3CEF0B252DB82E1CED5E741E9BD22CFC8335A8A358718521748A0016E526124729BEE79F3988C5231F8104A93C3BDC5413A1F1FADE1CB52F6DEE7A7DE2DCD26ACB975754BCC1097B2ACD695FA6AEA75A789BFE732B65B24104594B9102058CE39BF6851330CB42652CCA58585058151C2A04B6B5142CD422F16FECC6293879C1CB391AEBD1EBCFCAF48F9CEF6DCEC453D8FF006BB9B53E5AD1672ECD2A955793A82785B525D1F58A80826CAB2C8DE4131CA31E81F87DDA6188C261E5A965CA02189B94809FA82DA72B3FA03B3D8BEF25D54486A9357A5013A0157D7C0C74D2ABBB052EB3096DCE5FEA480164CDEEA9FC31DA6465C8C4A5331828DC1AD1EBE66C7A686B162C47CE9048A1BD7A75F01F50212F193CC7CBF76C2799A46164100B508352C4D19EEF6FB5A1BE192CB1460487B59EB7B35FC290059E4418F43E938AB60712A4AD556726AFF4EBE3614A43DC6A3890973A58E9CBCFEC39C1C6AEBF218915CD2A04855DA94FC6DA188CEE81BD4E94F6F1A9D5AAC449F203FDFE7F942492AE249507BDADB7F93A36CD1B265814BFA790DDF6FCC7A3BA43D897DA2F5C86BEA1D9DBACD2B9C3158FD630D2824C1E3EEDE0950B72DEF1CF109DACF8C391484CC42E6A105415C251F3B535E10DEEBABF38C7769704B92172B12998B1747ED3714E22DAD4D6B66B4771FB2EFA323B56CA2A9399EA1D78747210A6D6AA3144CD726A4020A9254DAE121039911D31E74CF7E22FEBE6CC565B8A54C492A74F094D9C8A96176F66B4ACEBB4B97CCC32E5CDC083359A54D137F6124B9617A373DCC7A1DA23D973B3BC89348F6A0CF3FC499951F0127EAEED2071698B424C47879881C81C732C7F6AB39985412A9A82EAA85135362C08D34F0D8C714CD7321C4A505F0D4B03B6D4D816F2B477032AD5941A7B2EA6CA74F640CE554F4E8E053A82859AA000092AF00360247112761E58A2E2E566799E2A6623173A64D248E10AE2F92F6AF47635110F85C72269520AC5ADBBD1BC3D2B4763086BF546655AA2A4B08926CA0DA02B9DE4241B75B5E7CC99BCBF0F2E401DF715AAEAB378FF0098658C099AA50490E2E68C3A6CCC7576A924C372179A66055F5879E42531C0038B00850B82124585BACFBC1C4DA27E0A50FF006D12B88B392949B5AAA07DEA62115825153BBD4B1A7A6C6DA7D6323953847896A51B9924998247351FD7717C41E6D2D58B1FED6D460D76DB5D6C2BD0C4AE1308997C2A533E808E76A6AFBC6D6B23EF02C13B478BD7900227F0C23914B9B9671778E78F7D2A4B6B776F3AE85C6324215C212CEC4B0E5CFF000DF58548C992D7DA337DCCCFEE3F199C58558EE2B067E8C3ABB3F85B48622411CB7D7EA60759669C02549E7731F2263AC1D87C30267297706BCD81FB7E203294081777DBF3FC6F081DCC1A6C11C4205809B5A7CE3A5BF495912B8FFB59DF57D7AFE2F18187481F352DA93D69E7E9CD9ADFCF295B1E25A0127910368F537BF3BE1E4AC04C9A3E54BA74E4EF57E5B887985C3BD402DA1AD6FCED5FA54C45331D494C0C77C241BC28DF9DB90FDDC9DA4E464AB5172953D1836BCF7A57E9A43A1865392E4826819BEE0EBB9FB443AB75AB742210F7171CCCAC9022D6931E640E9EB89CC3F678AC0FF6D8EED7DF4B8F2DAD1B0C22B899ED5B73D75B369BF2787E65DA1A47178C738B83CBF5E7CE713B85ECD129629A1E5BB9ABF41F5AD2344E14872493A746D9CF336A6C0C40733ED0B6876082AD97122D0441E5F3E66F89AC07674A685048E8F6DC6DD2876A43BC361CB9E77A5697F434A75BC436BBB41324F79BFF00ACDCFBC4C723FB8B0E1FB3A354576E1EA3969F4EACF93874BD4D4B39AE834AF95222959AE43F056F149127ED913B8037F5BFBF13123B3547EEE81B427E809B914B386B343A4618306147AD1CD6C6BE0DE43788CD5EB068C8EF8DFAAE6DCA6F6E7BDBE589797D9B4A98F7551CBD5ACFFE7A3A4E1EB56E5B9B6B5E7AC43B3AD58DAFBBEEDF20DEE167EE9E5E66D36C4FE5DD9FEE81FF006AA2AFC3F5035AEFD61E49C307B1D19C1D2EDEF4B86788B3BA9D2265E3046DC6ABCEE7AFC671369C981AF776D4A5CFBEBD44385E19EF47D83BD3607CBF8A36BBA8D0A36748893F6D573FF508FDDBAAE8C9D229DD9ADA9FC72D6BE71A7E9056A6AEC18DC7D5B7E669B35BFA844477AA02F3E3E7E4388EE3D371CF0E1395049AA6BA387E9B37DF5A46C30E052B7A50FF001573EA219AA73D42A25D3B1DD5CA36267F73877272C4A480C0A8DC331157DDBCCB42A891566BEB5A5DF586B5E78DFF00CC83CA144DBA993CFA6DF0C3D4E5A1D9491E403EBA9D3FC6F0B7E9B97BFF00CA10D4E7483C24382F3324C7DFF8CFBA30BA32D4D999ABA13E2CF18186219EA77615EB5D36B5F786B733947F79224CF888FCE3E1BFBB0E9397A00140DB307ADDB9529BBF8C67F4C1852BC8D3EB60DB8BF846AFE309360BDA6FC479FC3E736E470A0C1A122890185C00F7E46329C355A95DDBEA490FF583F8B0BFF337FF0054C0EB73BFEE6241D7F4C904B2789DDE81EBEFA7285D3866360DE05BA0AFDFC213D466893C1FCC169B4813F33EE3B0DA231A8C3006A900B9B81AF9FBD03C3A120B8AB0D680136D39EF6E468C98E66836E3DF9123EF07F0F86F8C0C280A761D7DFE2B0E8480C38BC472D371EF5B473FC5120D9C8DB65728F51CFC87BED07E94034008E601FC74A8FA97D6761C10E030D8D7EBEDDB678E7F8B27FE67CCFF00DF83F4C3FE29FF00C53F986DFA73B0F21F98066C9FF99F3FCD6707E987FC53FF008A7F30770761E43F31BD19BA37E31E627EFF0017DD1F2C1FA61FF14FFE29FCC67B826EDE207E617339B213C5E33B8D951F8FE76B4EF8467614355218DC507466277E909F72C482068C43535B3BD5F4E421623371FF003150623C64FAF3133F39E9BB7386410FC201EB50D62E4B1EA5CFD8EE52DABEFF00C3FE617359C246EE131FEA8F4B4C7EF6EAD2661527FF004BF5BF466F00DE91A1C3A740FCEC7CADEF943A339CA0442C836985DBCB63EBCC01E47082F0A91D342C7C6FCEFEB78CA64243D1BC4926FB1FE6D7879A6CE923FF0030F23F68F4E7F9FC45CE194EC185E8F76205B9B3F98B6D0DE6C904BA412750697A59FF00C33BC49A873A4C0FE64F985493F80F39F29C355E5CC91476D19B6BEECED61630D55254E5A9B8D9AFBDF661E1131CB73D6D2140B84484DC93FB267ACF3B5B10F8BCB8A83F0D3E6E6E7714A536D61352787C7935A2C1D399FA03E805C24150B719EA3913D6D7EBCE6714BCC72E67213BF42EEDA7F986C0BBF36B16A0FB7D1B678ECEE8ECC935D4EF3282081DD13D4410641991307EF3B938E37DB1CB140899C25C3F85BCFDED0E30D8BFD3E225B1A715DCDF57DC97AB52F7B8E9CFD269D90AB53F64592F68F48D71BBA51BA82FB884CAC8A9752D278D43C4AB279F981CA63FB199D4CC2E3BB92AE14A16800380F4D282C2FCE3BE763F302B44B4B965D0DB7F16F2FA57E759550EBA029C04252A5049DBEC98363CC4796DEB8F6BF65F3046272F96A7015C1524BE9F7FBDDE3AC292424275A1EA0D7EE235973CA790BFAFCBEEC466758B4CC5292142B46BEC7714F5EB1ACAA2D3617FA1FAC6C43A6FBF2E7B7EA7D047DF5D912560B83424F838D74A335372D0EE727BD606840A86F2F7EB1B0B806E23D4E2465A295DEB7F2F2B9FA86847B8AD154E8E7EDF7FC62AAF7996D4CB090A2F885180600E932458F2BE375A8A0505073DCFA6BBBC6532120D4B87A7E49AFD0D23EE58D7D7B87F90F334A23FF2295968091784A12916E623D31F37578BC5A49054B501AACA97471FF27AFBE51F3CA5769715303AA6101EA6B5FE43ED5118703AA5A7EBD9D2CA567C08EE54A9F78988DA670B48C74C2A0F6342C03823C295B785A3188CDE74D4105448152E6ADF515F10FBC0E648A52C3D4AEF7A94C12A29E19D8EDF3369DEF89FC362659FFA92DC8D697A7DF5262A7986266CC25B88062E01D5DAA4330DAEDD21C9344BAA4210D27854CD9CB44CF4DB6F89B5BAECAC44A94B981494B2998961D0DBD2D5A44223193A4AD8053137A83D2DABDFA750BDACB5F6CDC098B4904DAF17E9B11E82F88E9DC331F8080EEE069D1F43EBCA27F098A54D62A0DB56FE9B3824C6F51553C7188045A0031B7404EC3783BF4D9A270D338832B6607D75F21CAEF1348E129D1C742EFF009FA51E95D2BAB49025503DD3D3CA3979DEC77C4B49904252407FBF99DFAF3D8319F8954BF9520921D9A8E487A300D7606D5D286123F9C374401EF078A6F206D1D7A5AE7E785958454D0C0356E2BAE9A68CDFC467033666214789241AFEE24BDC5F41D7CED114CC358776094B891C878927A81E5FBEB87587C996B3AB86A36A58F3BFA44909243D0BA7C5DDF9EDCA21B5BAD14EFF00E6A470837E310679DCEE3E78B061FB3EB2CE14E74626F66BBF9BF278DFF4E5DF57DFF9BB546819B6880E6FAD9D6F8887B69D9423AF22479FE63160C376616A1FB554D83D6DB7B1CDE35EE00AB7A1F5AFD6F15B66BDA0BE88870DE40F1F48E73CB9C1FBB16FC9FB30025416973472CEDE5A7869A562470522A6C69A0DFAD36143CEA220D98F685502DC7133FD53B6F10636F8FCB16CC3F6725A588439E9F5A55F95F6DA48E1C1B25AF63FCBFD36882669DA3383878DCDE784957BBD2D7FDC625A4644840712BA8B0D0FDF5BED77C7E98EC697DB96BB11107CCBB458E2FE77C553F79B7EE71268C9D9889543AB6DE1AF2A6F48C7E90E80B68000DF5310FA9ED0A7ED390449BAAC7A9131BF947C313383C8D731C22512433B06F56DCFD2978DD187E0366A790F7B539C45EB7B40041873CECAE77F506F61B7289C4EC9C8668209924071A52F7A57C0727DCBA9529D541C46CF6F01EFEAD11B7F5BAEA15097002264F1011D0EFF000F76DCE7B0D9404FEE4682E3A7D747EB630F112663064B02D522FABDB956CF6863ACD5CFC121D83FFAB6E53CEFCBF6226246552001C400A6DE27D9A6D7A391216CE433D4BEB40CF6036A18607F54BEB8974D898BF2EB24EDF893E78929796C9154241702A18EFA7E5FEF0F24A1449F9438B7A787AF367AC34BDA99C5132B248B595BCF94C7AEF85060D2094A6583762DFC35B975DA1C194B37413D4084ECEA0717C72E447FAC5FE26E6DF75BA6A708D6433BB8E1767DEDE756615A083BA57FC3D04277B3F59305C1CEFC5BF3F21B0EBE9B6105618B91C0430D8ED4ADFC1BD088C2A5A9AA8F4FB8722DF686D733D75572E584DA473262D3E5BFCF69DD18750154B73E61AD6E553585A5485100A505F723C47DBDD92AF3C5DBF99E9D4EDCBF630B265115B9DA94F7D75858E1A610CC5FD3F9F2109159D3A77583D25447E9E97C2F2E492C40A92761ABBFA54F846061542A5FC74E77E637E509579CB9BF797F5FD679F2FD70E44903FB69B381F7FABC6DDCA989AB3EDE9CE386B365A8A871DF7BA8FE07CF9DFF001467A120064B72B8D3D3A529CA364E1946A01AEC0F81B10357B46EFE28BFEF3EE3F9ABF0C35602C1A1C2308B001677DEFD1C68E2135466AB1C32B3B923C407A49323E1F9E08769C32C81C496E9AF3B8F6E7AA6FE2CBDF8CDBFD53F120C0BF909D873C10BCBC3B100A4DF5177F1A3539E83683F8B2CECB3F1302DCCCF3371CE647492359D86528D05A9AD3F3E3D2907F165FF0078FF00ABFF00BB0423FA49BEC472335593F6C7FD5FA9FBB0460E1660D3D3F98528CDDCFEF1E6388FC7D2FE57C118386982A416E9FCBF942E673654125520C589DB698E636DFDD717C379E3F69F0FAF2FBF5168495865F11A1AB3163CFF0093C86CF0B119B2AF0BE9FD463CB788C335817173A6FF00CFD7EBA9C24CAD1C8B50FA7F10A7F8BB96F1CF520FE67F7EFC345A5DCB3034F2B5A82BECC6BFA69C2C83E00FE217319C2C412AF7C9F4E5E5CA7A473C362826E0EFAF4B535F1F078C9C2AEFFF00ED3CBCB43E476877A7CE5C9BAAC77BDFDD049B4F2B7ADB1B499449F9833EFA5F57D79C379D87527FB5DF6A03B59FEBA59E251439D2ADE3B48983C85AF33D798FBB0E4C8960114A5AB42EDD29F73630C66495281052433871D7AD76FB44958CED61248724881F6A08F74EFD7732047945E2F0C1493C29A54E9E3CFF008D618CD9132AE9248A06FA790D6B6A9AC4D34E6A073BF44B877B99116E9CA47979EFCE9998606612AE14B8360C49D795296E8F11CA9337662FB0FF00034E76A563B63D98EAE0CD7B54CB5857D64A123C52045BC5D2C7A8EB7C735ED464EB99865CC54B628428B9005FC2AD66FA35232795C99E8F9480541B4F57D999E96E663B0DDB9E9A4EB5F67FED074C5434568FE18D5435C49903810BA8F09DFF00A44C1B9F5C79C50A548CEE4F092026629C02CEC59E9F6DF68EE7D859A4F03BDD2D6A5B7A59B63A74F8FECF1B6E92B2AB2F4A4257499857B4A064484D4B891D62C2D6BDBD4FB1BB15989465C80B53012C30259E95E6DCFC6D1DE904AC7117AA535028C05E9E3F9864539E7246DF1EB1E5CF0F67CC99889C7841238B9B33F900DB42A94D416A7E1E3969DBA813111D7F7E677E589944B972E5A12B676ABFBE6478187A9040480CFAF37FBE9D2371713BF14FC6F6F3F2C39425240E1200D83726D7A46EA42920929206BEF58C1EAB4D35338F012B4A9BE131600A84DE236EBD461963D69952D550686A1AB606F570ED6E51893C33961093BFA036F7D23EEB90C0E9E222361023FDBDD8F9E53E52438291434F478F99099412E05069ABFAD2FF00C0A4284B29FEA48F7807ADBCA30C912439A3541D3C4BDC68E7CA3612D9FE6356A36CDF8F7AB830F25BB13007B848F3BF97BEC39E25654A25258508A5DD9EBE1CFD8D0E1D157653DCB6E051A91B1598B6CA499049E9E198DAFE9D77B5FA6C704A9C40A80EEF5BD49F0D3F986D3B0729D252800005C52BE766F76863ACD46D37BAC022CABF4DAF20CF2DB79C3B93922D740E75A7A786BD7A88D512C22890C34034AE9A9E9EC45ABF59B54E2CA0419B1503100DF63F77E789AC276754BB8552CE2D466F7AC3C94859B17D19B5A52B51E9CA2039A6BE80A01404743EBB7E6019BF2C5830BD962B22A5AAC081F6D7973BC39124283901BC86EC6C3F07AC40B32D78E389480E9313693FB8F58817C4EE1BB2490589D469CC9F1A7BA0791C1E193A21B7D34715A7DD8B96315F66DAE570A3C6AFFA8DA37DE48823F41CAC983EC8CB05249AB0D00DAEF4D7979C48270E4B101B4DEFE3AF28AEF36ED01C6403C6A13360A304027A411E738B7607B2B289B03C2DA313ED8FE09683F4F5B5CD00FA50FDA95A33C57D99768CE92A951833BA89DC1DEF37F3F741C5AF0BD974060C2806839834D5ABE02D19FD393702DB0D34707C07E2209996BF7564788C09B137E80EDCAFB6E6313F87ECECB940B84D59E8DBD0DEC5ABD76687125A43850BEE1FD3CAA4FDE2215BAF1EE4AEBBA8F4F5B49DFD791C49C9C964B03AD68431246F7A07BFD21E09C820820176D486D6ACE2B7BC43F30D542BF87896416E600279FBF9F4DBA4624E564D2D92C052E4B5791F1B56C3785D130711A38A11A38A6BEFD2B17AACE512789C37064F118206DFEDC879E24E564928814018D28FA07A73D6DE10E51310481C2C7CF73B1F3FE222F9866C1C4A421C208E52473BF3DE2779F4DF161CBB05270E829094EF6150FE22C346FC6B36499EB484D00B902F50DB1BEBE2F0C2FE647FE6CEDCFDDD6D73CFEEDA5D12E4B5427A33B7B1E1607487D85C190A0E9E56BEFEEEFE24A2566409252E12044413F70EBE9CA63094D9485060863FF2A02C1DB6E94360444F49C1800028046C5A8DCDB7A8B38A184CE660019E33111F68CFDFBF958FA02488E99809ABAA490C6A03DEDB6C5F5D6BBEF3A42024FCB5FF003AF2DFC7486D7F304DA1CE479F49E9FEF6E587B80C2CC90E26329CEAFBFF0022FE15B6F8292921C867715EA77AE9BFDE1B575C913E3B936379FBFA7C312BDDCBD852FF00CC487E9D1B0F2FE634FD787FCC3F13FF007633C12CD78475FE633DC27D83F984CE55CC8EF0DA48B9BFFEE1F2B7974C704BD93B697FCC63F4E8D8797F309555A0117F9917BD8DFCB0D67A521D9205054372F1B75BEC214972057852FD037D2B1A1CAE17857A7895CFEEF4C3585FF4B47E1A1D77BDFE6EB094D7264CAEFCFC4BC107E99A8CDCBDAA38FAF23FBFFF0072F1B71AB7F41F88C1C283700F5FFF00EA37355C91C442F988B9BC0EA48B0E64CEDCF094D2FC3B87F173EF4AD6B0F30F85490C523C869E6F4DE87CE395E62019E23FF58B7BFF000184A1D7E8D3B0F249FAFF008848BAE0621479F318236FD2816007BFFD5187D70FF71FFA8608CFE9B97BFF00CA33456024CA80FF00D4411849603D2F57F48C190137D793FDCC67F5B1FF00311F2C690774397FE23F307D707FCC46083BA4F2FF00C4473F5DFF00F553F1FD7041DD0E5FF88FCC29A7AE09E225C076D898F7C1C27334F18061D2AAB024720295F0BFF887046629DF8933B1BABEE9FBF09D3DEDAC67F4C9FF0088B6C9A7F3CC79C2D6B304413C493B4C927E026E45F6F8E352949B814BFF003FCC63F4A9FF008BF4F7F585A9AF4C8F1EF72388FE7FBE538C7026FBB6BEEFFE231FA245F847D835986C75BBF285CCE60949FB569E4ABDA76B8993EB68C359E0241005DABF51B7BDDA23F17252904049200AEA6FF6F7762FD4D99A2C02F94183FAF59F7FB8E1A4462F0E922CEF534F1EA6FD6DBD5F18CD5278471C7FF5449B4F3F9DA2E3D304021BD7686D330E0B70D80A8A1DF707CB9C4CF29CD5B8038C8E5B91173E73720F5C2664CB533A438D587E3E90D558740BA4575DFDEACCF174681D52AA1CD58097152A75B54955E10A06C6E248FBF9099ACF68B29973F053D6123E596B7617749FA3B57D68D5CCD70E04D96426AEEE1A80355AA2BE7C8DE3D7BCAEBDAD5BD87E78F00852AAF24AA055024F734CE8B98F2B836BDF1E16CD248C276AE4B025299EB013A1E25746714BD599A3A576397C0123F69F958B1D3C2FBF9EB4F8CFED532F465FAEF523688FFF0036AE040B01154EF2B44DAD138F4D64B30C9C2618874F1212487E40E8D4D5CD01DC18EFD964E3330F2C7EE00539B8721F7A1D686DA45798E83964C9665924076BD34A1BD47D5A2591281E9BECD6DB4BB6AC6353AA03867CFF000BFA61863713F3B0535695E6E050F869D61DA249E20402C2EE59C737D4F946BE31FDC46FD7F77C2B2316521B89F4676E4ECE3E97F087989522649EED0C54DBD453AF4673D19A1592D5552BB4AE186D650A52F6E1E054C5C03E2888F7DE711F99E238A54C7535CB3FE4F98E9CE2264489D267A2784964F13ED5BE8D4BBB7231F79E8692483607CFA4F33D3A7E78F0CCE0A2753F8D1879FB78F9A610E03D0D5F57DB5D2372DB40493C42C0F3F96E709A10789238581D5B6B7B3F78381B9F2B79D7488ED6D4A5A053C6011100902237E63F600C4D61E4BF0B8B81A5FC2DADBAF283839BBEBB7AD5ED10FCD3352DA13C2B07ED490409BF3BC413187C65AA531425478B46D34F3F37F209AE5DABBD5AD6E715467FA8D6DF170B8044ECA1CE3A1DA62C7AF95A7300A98E01944BB35DBD0780A8F18C26497B39A69E3D4DEDE622A9CDB58AD9FB6B242A62E6DC26F6E9B7BFC8E2FD96E144DE10A9646EA20FD00A5A9FE21DCB96524937D2C7D2B5EB4E45A2BBCDB5B92170B55CC889B83D36E5E5B46DCAEF80C9E5A824DA81DC74A0F1FF0030EC218543BDCE835EB53EE910E7F5B59414B226D04EFBCFC62F137C4D0C914E381015CECCC76A3DDEF7D054449E0D245746D859B969A575F288566DAD93713E97B7BED7F48E773890C364D3D0CE87E82BA519BCC5A8D41121107ABD522AAE49841E6779DA2667CBF238B0E172F9E900041F6E3F3AFD60F7D07B6888661A8132A957B819F5E401F77E589FC3E167243841A5A8CE5E9706E7D7AD4888D4E7685127909DCFDF079FC2313586C0CC9C3E6490ED52DF4BD7931AC67F4C673102A7F8E63C3F9788B57E70832479F1413F7C4DF78F98C4ACAC9144BF16C76B3685BC7A54C2C8CB961EE096621CED56356BD6DADE22F559B990524A4C192491F1DFCF68E9E92B2325208F999E868FCADCE9CF5687A9CBE651817D6FE0DE218FD1AF1FA8CE1641959581EA2F71CBD3E3CF0FE5E4CAE22126946FAFAECDD6B48772F004DD241E86B7DFECC7AEACCEE6AB51FB479D898B5FAF9C6FD23AE1C8C9E63808AEEC6A0BEB5FE3986896C260121412450B5C1B53FCFA8BC36BF992C09E226677F48E7CBF0BCEE4AA9CA2626A2B6DCEED4A9E9FE1A7A4E050006482C5C161AE97D35AF84256B3155F8D5BCC4F9CC70F5E5B5BA61C270252C5436FF17E56BEB1209C2B248E17DC8D2874171E2E7C2BC3B5CE411260FAF59DCF2FDC61CA30E84B3801AF41CAB47DBCFCE23E7E1493661BFB1B37896A351B2A6BD5E0B9B024816B1F78F2DA2FE77C36C5A65A47CA41248DBC79DB6FB554C0E1EAA090E297E67DB9D078C36AEBCDF7F2137F84DFDF862E6EE5F778933873FF0017BD5EDEDF9F8C70D57295C526C47F70DFD27F7EB8C3EAFCDFEF07707FE3EA7EFE5BEDBC60BAD11BF3B78B7F9CFEEF8CB9DCED7F483F4EAA7CBFFBAD6BD7E9CE13AAB48820F90B8F91F3F3239EFC9A4F533EAFA93AD3EFF8E8ACAC39049663E07D5FDD7C343958B04EE6666E39FE1FB3869C67610BF72ADFE9F9F7B084A6B960917F88FDCE0E33B080C957D36DBA8F7BDE31FAFA86E63DE3F3C1C6761EBF983B857B03F31926BD5E220DCDA26479EDE42D84D6B347ADFED6F661C4A94A4D086E647531A5CAF72E01168237F9FCFA634EF03B51EB47AEADF673D690B776378D62B9CBC903A6FF00AE0EF361EBF7F380CB1A13E35FC4726B564CF11F404C7BED8CF782BF2F42F6F483BBE7E919A6B14641519F7FE53F2C36985CDB73E7FE20EEF73F6FCC67F5A3FDC7E7FF006E138CF00DCFA7E20FAD1FEE3F3FFB7041C0373E9F883EB47FB8FCFF00EDC10700DCFA7E2334D6A93B1E7CC9F2E91F3B61399A78FBF7F783806E615A2B960DD56F53F7613804B7DCF41A7BD7D216315EABF885BCFAC7EF6C101975D41E63CF6D87942E6F31541F189D8127D39F5F33D7041DDDAF6F3E6397B78503317131E3F2DF9CD8F3BEC3973B9C359C6B4B1FB010D71320936B8EBCB507D1FC21DE8F335DBC44C45CC4CFC7A7C4F5B611861330EE9735D29D46DE0F73E7477FE28B0A49E3DBFD44EF1BC47CB6E7821A2F0B47776D36F51F7EBBCB329CD96384F1DBD76F9C8FC799C10D26615DDEC76BD1B57AFAED13FC9B54FF000DAC61D51528CDB8495472BC0B5CC826DD31AE324A6665B8B2A0ED2D4C06A58BFA3442E3B08A98A49093F2B9A3F96AE6EDBB7378F6CBD997355EA5F67BCFDE52A4D3E5758949245FBD4BE9304FDADF604FC71F3FFB649123B5982401FF005712B04805CF0A9EB4A6CDAD6D13591CDFD3A892A090180A736B6ADADCD5F78F93FF00685CA9CC9BB50D594EEA5499CCEA1490A052654FB8A98224CCFA73C77EC19E0C34804D3BA43518B848A7979DE958EFBD9C9C3138292C6CE14D5B9A3EDD628C2A80241133F2FDFBBA62D597E294994B00B16D4E95F5B5766DA2EF2E41090598F5D2FAB5FA5234B8B24A523ED5EC0C9B6FE1FD397C22A7628AE6AAAF5B57EB7B33B36BD61D4A944CA98487B51EDA6FAB4042CA0AC24C0DC81205E37023E3E784BF5CA42CD4802CC5DFC896D0B188C9638B1291A150B8B870198E97F1AC29CBE9DCCC5F6B2C485F1573CD348E0495ACACAC25094A520A89248989F3BE2371D987121614A77259CDB9FB6EAD169CD25CAC165CA9C0252B12CA9E95A55C9B3E9BF847DE977E9FD93F963CA8403711F2A7BBE7E9FCC24AA7C04D8C588DFEEDAFEA396E30BC997C4A7091422A7617F0A0D2FCE0EEC6F6B53F98AE73EA829E205467909D81F7DFAC98EB8B460240212785FA8B1D797234783BBE7E9FCC55B9BE6EAA44A932541C993C46D137079FC276B0DF16DC1E5B2E7FEE48A33D2FC853CDE977730A224F103A9341A6DD5BEBD04529A9B3509529C0FA9B324D8157EC7C3DC716ECBB219331490994058D5ADBD773E3CE90A8C314967EBC9BF3C9C7845379BEA072B141B455F129B24429B080667990072DF68E5D6F381C9B0F2582C25205CB8A7875F6EF0E932428DFDE9EFD451EBECD735CE5BE25165B0D5E1C0F34605EFC324C8FBBCAD8B5E12565C3E4EF0120541A35A84BDFD97870891A31A54923DEDA163B1A4429DCF5A794B4D4D690B444212D1B13BDD3BDCDB96F7DB0F26E6395E5F45CC9638AE4A817B73F7A521C0989902CFA0B7A38F74A52196AEA9E767EAD4F5954397754B50A99E9C2855FD2DEBB9CA3B5393CB0077F2ACF5501F53CA9A5B68C7EAC3BB73AD9F62D7D6C075786FA6D3DACF3F5AD19469CCCDDEE48EF09A5A96878BECC153402BA7C49EA17476E32094DC588C397D0CD40A8AEFCFEB4615C8C524B92083E9A569E74AFD62454FD8576D19B81F52D2554B04FF5B896E3D78C00236E5D779C253FE28F66B07FF56749177E15856BA70B92E2951E942ACB9A8501C4BD580614F7BD7D2AE87D927DA2F30095536892A09992AAFA54403B1852A779E56E7883C5FC77ECA61292E78249A32555AF20D6D5F95ED37815A12ECA490C18961A787516AB52EC81FF00637F692BCE8804117FFE25487E1E212379DB9ED84E57F507D98A033A9A517BBD68DE0C74E71312D72DCFED1677228C3E9E5118CD7D8FBDA329921751A114A4C1852330A7544033210553EF1F9626709FD40F67669E193312F40428A83FFE4297F57DA1E266C9B28A5EC198B1E4DE75FCC5539FF61BDAB69C4ABF8B68FAF63BB9E20DA16FC0E63F96850BF53BFDF6397F1B72650752E53901BFDE4F8EBFE3EAAA67C80400C40BB306DADA9315366990E774CB08AECA735A22991DEAF2EACE111BCCB2058F3DAD0716FECF7C51C97342522749413A77A9513CD9F7F4BD2CF244E0A53A025401F992E900DB52DC81AB1E42B11475550CB8505A1992447DB50A45373B82954131E9BF962D67B5997B3C89F2C837F9817D857573A69E313B875C9984F11EE82438480540F881EA28FE70D9993CC3686DC7AA0B0E89EEE9D282B0DFF702B13C53E77C2A7B41859A974AD249D5EFA52A29B5EC3C64A423BD05405750FA581BED5E9CE1BE9B397140A1CA9E200785250124F2898916EBB79E3538FEF090920BB1047A519E96FF00308CEC27CC4F0B39734A1E5B8A0A5DC51AAD182AAD6A2A2A6CB69DD04DF8BA9DAD7E57B72C379B356A2789C27A9248F3E7BBBC2B86C1A407721EE386CDCEEDB75BC2672A81BF17A99FC62DFAE10E24EFF587BFA54D9CBF43F47FBFF089DA9008E131D60FCEC09F960E34EFE8631FA54B7EE3D58FE6FEDA357D689DC93FBFFD3838D3BFA1FC41FA54FF00CBD0FF00FC51A9CAAB893BF5E71EEE56E5CF7C369EA1422ADE1AFB3E3A43997870E0B3F890CDBB937F6743AFEB3E7FBFFA70DBBCE5EBFC438EE07FC07A7E639EFC281926DCA3F41EFF008E0132A1D34D6BFC41DC03640F06FE613ADE4C89F76E07EA7DDF760332EC3A560EE07FC01F2E576A7BE75E5AA8826F3B474F41B981E9EFC379AAB134049F7EF58048E7C23A3D7C08FCC6FF00AD790F9E11E34EFE8633DC7FDFFF00B7FF00AA13545403C3CBD27FDFE5EFC1C69DFD0FE20EE3FEEF4FE6137D60753F13F960E34EFE87F10771FF007FFEDFFEA8DEC5481C5700F9C9B7BFF2F7E3459059B478C89203B906DFDBD79FDFF951F5AFF5A7E18D236EE872FF00C47E60FAD7FAD3F0C10774397FE23F307D6BFD69F86083BA1CBFF11F98D6BAA16950E7E5D3C8E119AAE16A3F8FBF6F183252756E80463F5BFF005FCFF4C23DE72F5FE231DC0FF91F211B1BABB9F1FADFF7E7CBDF83BCE5EBFC463B815F98DA94D6B7E56F58588AB103C5BC45FAFBC6FEA70779CBD7F88CF703FE45BDF9FA78C2E66AC492553EF9E9222D3EE048DF1A124DC93D6119B87245F8B9B337A9A7BD6AEB4F5A9170AB7979ED79313E7BFC318866B9203862DBFE43D3F8A43B335C991E2045AC4DFF003BCF58B804D8E0840CA150534BBE9EC6DE90FB4B9824404A88E978F3B79C580BFBB04365C8493C4CFBF3D37D4ED5F1AC4BB2ACF9346164C2839C299578A0191FD524738F90D8E179CA6CAF16583896B63B0E13A589AFE758426E042E5CC5D9858815EA6E0B79F808F71FD95EBCD0FB2ED5D6344949695DDC13FCC0E54282E4CC90248BCF4137C7843B48944EED9E012520A7BF9E56C43020B8DD81E4DE8229B3E7FE96690E032806D5BDB9E54A068F05FDBDF432A935AA356D3B60379C3CF297C090005320054C08B99DF73D648C7674C9270F87521354A45BA002F4B6BD3731DABE1D6681695CA597E3E16F326C7D1AA7D63A00E38971BA5B01F6828C7398FDF9DAFB626F0292A96AD29577EBEDCF5BC777932C2A47117AD46D5B57434ABD2FA3425A86DBA37DEAB026A14128A74DC821638551B83123E1CAD88F97294664D5317AF9543B7315A9778D258E14AC3BBD816771E7FF00768DD636D3A2B1861CCB1100D47F31E5282645BBC4DD5B589DA76B622F160C849AD43D0EA1F6205A86F5AF846CC42D13BBF2966502036C58BD346B335F778EF6FB03F600AED63B51A2D479CD314E97D1AE1AACC1F7507B8716A6CB8CFDAB28871B1B489B5C462A198E35499530A13DE2E89097624AFE5706F477A7E04557B71DAD4E1300AC31980152140A5C38614F3A07B1E51F58E1D3CB88FCFF001B63877007E5B7F37F778F9F9C01DF4DBF9BC25AB74847F548D8111F8DFEFF00961E48284B0A51B56BF96BBDDB918024026DC872F1BC5719F3AA2493369DCC1E87E3F23CA3169C04C92809798916B9D35F75FAC67853B7D62A5CF90A7DB5109714B483C21B6DC5933BC84824440DF165C366F83C1DE6254ECE1C353A6BD357DA364B4B2F50D7677D47DE2A6774EEAFCEEAFEAF96E455350951294A9C4A9A499302EB40817BEC79198387A7B6F83921A528248A30587A72A0AD7F9A43849E201D56E5E76B747BD8561E97ECAFDA4EA84B0E2E81BCA1944971D152C2D442AFC45016140813637B7B8C0E2BE2B4A94B3242D7C7503E55106B4AD4791EB487680901DC30B546BAB5CF2FF1132C8BD89F2547039A9B582D6E0238E9452BAA13CD2548570F94ED88BC5FC58CC65ADB0F8733127FBBBCE137D99EA74A1B5377085201254B02C01DFDEE6A7A98B4F2FF0065CEC474EA52ACCF4FFF00885C708EE5DFAC5453776A4EE4A41F1151E4623A9338ADE69DB3CEF3CE032E7AF03DDFEE1FBCCC7A5EC1B938BEB0C71B3004FC81FA503EDD39D3517BD8F92E82ECEB4F84FF0002D0F4AC70C7097541FDAE27BE428CEC7CEF88539AE70B491373198A7B8019E8D707D6FAC46778ABF057FF005505B4D1EC6BCEB411384559612114F95E5B95A2200465F48E97472921A0470F29BE21E6CC2B5154C9D3D4A15713A6001479057E5B771194CF9B60199EE7C4E8E437D2F48C175599387F969A65CC7D8A561991063ECB698FC3EE406214876338D35993162E373B7AECC20FD44FA1A5A96BB9E6F6F510980CD883DF2C5288F070A52AE3EB3C3B797320E14E29F8A002261436F523CEFB1B6F511A2B1D8894411C4C0E85B8ADB786AD4246D081F4D692AFF3EBB5FF00E198DBDDD6DCAE07A6F2F05892586206946035BD6D4DEF7B46C337C4B8002B954FD7D98E292AAAE9839C59824154471D325CE28F250300758BF2387A301895103BF2E3FE25AECF40CFA43C4E6F8A21DD7B357EFF0088455B995528101343524FFCCCBA9940DB9F1B4A3E9B1DEDB4C94BCAE69487C4CC06C7FDC56CDFF2F4737D459CA33AC5ECAA5CEA7616D2E77A3C42739A2CAB3E6CD1EA1D2F95E6748E712168451D1D31095483E36D90AB8B4CCFE2A4BCD330ECE2BBCC06227267AAD302D6BB16259448FB75D657079BE216405F130AB59EEDA8F0E7AC755FB47F61EF67CD76CBF579436746E78F0528290AAAA94F78648F0CA5BDCCEDCC88C5D725F897DA494A40C499B8E24D57C7DD700DDAC76E9EB76CAF3C521011DE84248658500A2DC8A99A9B75D23CF8ED5BE8FAED3B47D2AF36D26FA759654C079C77BB0C5338C34992986CA94EB9C491C8488913271DD3B2FF0014F033A748C2E3712A953E610132D615C20815759F97CCD7D0DD3058CC3CC40216971552C2C3AB88B8F968CDD181F38E8266B95D4E4F5CF65D9EE4F539457D3A96829A86DD6C1520AB8A0AD0849888B4CF58C7A4322CFF002AC44B96A5E3651700BF12542A0355D9F4DF7E73F28C9989052A0A49146A934AEE450727BC449DCDDFA975CA7247774D01B200D9513717DADF28C5AE74DC2E2403849A89CC3FB0BFD09ADF50FA6912299094212B02AA7A359BDFA084AE54AC78BC50373B7DE07E186852A4D155E6CD7AFBB429DDA9BF6D3C1BA6DCE113952A26C6C6F63EEE9EBFA6D848CD40B9EBEFDDE8F1A8049600B8A5ACFCFEBEB1A8D4AC0B98F327CFE1B5B18FD44A667AEEFF0068C9045FEA2353952AB024F316BF5F2F220F48F8B798B4ACBA4BFBD6A76DBF10B4A415548A6845FC287C7D79E935046F23D47FF6E112A22E9F5FE21C77279F98852C544855FE71F801F29F3C63BCE5EBFC41DC9E6DD45FAC62B7FA104EC2E3D4DA3D718EF92ED4715BFF001E9783B93EDBCA349A829224C1BC7C0F41FBF38C27326254086AE977BF4F7E31A2E480D4726FCB6AD1F583EB47FB8FCFFEDC2109F75FF6FAFF00307D649E7F13F98C10775FF6FAFF00307D60F51F11F96083BAFF00B7D7F984EFD491C3E2DFA1E9E83CF09CCD3C7ED1BA255E8478FE49F7D213FD68FF0071F9FF00DB84E14EE4F3F3107D68FF0071F9FF00DB820EE4F3F3107D68FF0071F9FF00DB820EE4F3F311B1156AB8E23F13F97EFE184E669E3F68D552942C09F23F4F7F6D9F5A57F71F9FFDB84E35EED7FF00131B9AA95C9FB5620DE7F21F0B7E4463815B7A8FCC2D455192788C7333B7CBF3C60902E5A0E056DEA3F31B455994C2ADD419DBADC45FF6318E34EFF5D6353254AD3AEAFA6F0B98AC54C71729E53EB1791F1913D2300524D8DFAC21370C412149F16EA199FAFD61C45728100199BEF7046FB0BF2F775B8C6D0C662129714BD7EC6F4A0FB43C51D63C2150AE198920DFF2837F7C8C10D7BBE3A243D68D424DB7A373D2241475CA75496388953EF30D260C905C702009E57311CE6DD433CCF172F0D96E2FBC584032D4CFA963E3AF4874890D2660586F94B02CF6EA3C74173B8FA1BEC932E1D9FF00B2B68FA5ABF0AEB692B56FA17214A2B778DA2524711FB408B1E51D71E199934E33B638F2E5430D3D3DD96268B25EA37B9DA38EF690044F4F0D52565C8B33EDCBCB7D0C7955ED5B912354691AE79C6F8DCCA3BF5B64265403EB2AB089DAD69F3C77CC34A98AC249F94FED0496A014F07D3CE3A3FC3AC54B44D9616B01D40124B061A07F7E11E28672E2A8A502789B75C1C306603846D048B7DD79DB137815CA08582B014CC4539D6F4D6F1EB0C1CD953B088E050AA400072035D35362D76DF3154DD453A2A160ADC6C0EE85E49912600331CFE06D8D1084A4AD4A2CEECADE9A7B6BD223CC89E678E142B81EEC5BC09D0EE2D7A54C4A74DE9FCEBB44D4791696D3ECBAEE699C54B6C90D24A9494A5C6C2AC0181C04CDFACE2A39E4E9638D226A52A6E27BB302F63B0B18DF3AC5E0F2EC0CCC4CDE1265CB2E95109F988212C4EC40FBD63E95FB2CECA72EEC1FB12CAF4165E86D8D5B995353BFA8AB1290871402D152DA54B1D1B5A9278546DBE2858291331F8F5620712B0F294D862D4512196E1AAC46A3CDA3C21F113B633715984F9689A5654B502534012F40002CC07896E91EA7B1926655447D58771C5B712527DFE2B981E43A1C70B9B89080E54C0D5C124FDDBCDB511C942944D0FD21D11A1B377071E6199B6C22070028412AEA0106C3DF73CAF88F566409694A5129FDD460281B91A335E90ED091424373BDF56D3C39F8F1FE09D3E811982D35A6E1512824F9413CB78FBB1AAF31C451A628307BDBA907C74BDE1596CE695F31BFE3E9B46EA5A0D0D917789A4C992AAAA93E15282DE128F25A4A52098B1B61AAB1D8CE204E295C25F8925DF956FA5FEF189AA008A577F0FE7AE919C67750E7F96A7A5A7A256C94D353A5413CBC41015EB27D26D8D44CF9F88F1926E4AD46ADA827E83F108F78BD090341B46EA8CBA128287DC2F19EFC254A0279020103D23DFC861F2677197500E2E4A413AB69F8680AE6A59C902BA8A37BFF0031C3542120711BDF71C511D49EBE67607AE1C8095A5C067A6BF4A46C0CD21C1247D2BAF46F5F2DCE5234EA47110422E2448E879DCDF6F28C289509746A35F66DFAF4A985E5A4AFF73923AB0DCF5F2BF38D7DCD3B444AD23681C201B7BC79636078DF8535DDCF5B102E3F30B7729DFD0FE61BAB6B29982D8E2499E21C8CFBC9FDFA61497825CD04A659D0D8F4ABECFBD3D20EE0173D1FEDA8FA4361CF295A925C47C0088F779FEC6153944C51A20DAC4747D2A280F5D20EE13EC1FCC6A7354D12225D47389208816B79FCF7E787523249E6BC0455E9B1DF6BFAD2B19EE65B5520EE5839F12E69A43255EAAA3330E3441F31F76DBC91B1F75C3F464588B842A94142399FB5CD39DA329932925F801F7EBEF48627756D1200971B93E693F8FE7E98728C93141B841D34660342F63EB7687689128BBA035281BF07C36844E6B1A1360E376EA40F59BFCBE6360F5392629A81637FF3F8A561D2654AB042481AF969D7900DCDE1239AAE85F04075B91E622FCE06C07E56E78752F239A0033251535DD2F72EF5E40BB3EBA34394CA40FED62350DB03E9CE8F57D9BDCA8A3AC061D4926F2089EBB83BFE3E58D66E5E24A4B4A0826B415A78529E7F58DC4AA6CA3F228A46843D3E82EDF9A533A677F8705BCCACA9C5005BA85ABBD698FEE0A6164A17C62D04731EF64B95396381C841FDCC9295F50B4B283105D8B6E43346F81CC7132D6089AA0C402EA2CC6FC8EEFE5A452BDAEFB3B7657ED079255B59D50D2E5BAA10D2FB8D40C301905D20904B0C25B42BEC84893326712B83CEB39CA1094E13113A6E178A924CC53CAADCA892A2EE0D7A6B1D4722CE56952146610B0DF31A82FA312D6D8163E9E0676FBECDFADFB00D4028EBE8AAB34C973175FF00E139BA1A3DD38D3249517036161B02401DE284F58DFD2BF0AFB726485271B89EF0A827E55A98A696625F5367B3C757CAF128CC51C4C94A92050597CF61E7D2ACDD7B66A2AABCA9879BEE129DDE490E4C4CCA40B481CEF3E631DFF0D9D61F30ACA5A40536AE6BD0D2BA6FD626BF4D2D29725A96B5ABF7F0AC37BEF369754C21125AB17B889EF49F2330009DADCAFC9FAF2B5CE485256EE2E3CF4EBAD3D61AAC4B42411FBAAF4A80F4B0AE82BF68C50A49DC7BB9FE136C4062B053B0EA3F329B986A7893F5864A4AAE09B583EEDEEFB721995A524F4311BCC01EF3BFDDF0CE04A8F1025DEEE76B6AD0E308EE41767FB8E9BDFF00883BE4F4FBFF002C3F2A01DC57FE3EDFEB121C09DBD4FE611D53B3C3C260DF6E9EFF003C319AB1500DB5A8D6AC6CDF88D880407167ABDFF10938D7FDC711EB98A7724977D4C60002C238E359DD44FC30AC82E76D59F67FE1E02906E1DAD071ABAFC87E587718E04EDEA7F3071AC6CA23E1820E04EDEA7F31CF78BFEE381AFF009F67CA0E04EDEA7F31C15ACEEA27D630D67000800333FDA3200161071ABAFC87E5846331B5B59BCDF6F238208DBDE797CFF4C10462A722397CE7E58D9258B9DBCF940C0DC3C63DEFFABE5FA6304B926D030B353683BDFF0057CBF4C20A5BD4D00F1FB46A5293A0FA7D20EF88D9447BBF4C325CD2C43D352C0F9341C09DBD4FE63626A426788CED1D6F31F71C21316695AB12696FB69A43BC3CA4283148DF9DCEB5E5D2B0AD15224907736BF436FBCDAFEB87324D5B6A75773E1EB08E250928500966B53EADB8E5D6E61522AA1485893C324DEDE5BFEEFE7187C491C2A0683CEBE86D6D0FA56E6C924AC17F9EB41E76BF36E557893D16A3294861D4A7822012120C5B9C1F2F4893CCE365E21294BB81F73C9C535D7C637C160F816EA0E97EADB6EE5C9F08B7BB19D22EF693DA4699D1D94053EFE6D9830FB81092A296E89D4542ED36F020F911CA71C5FE26F68060E5772998C262174E261C4052C59DECDE05E1BF69669C2483325A820A12C43548550F5A1AD3D5A3E84BB5B798A3CA72ED22CAD29A7C972BA569B0D98417051B45C848313C6920C0277C710EC5E07F5B3BFD426CB3DECF984CC2760A3C26DB0D686387E6D88EF2628514C5C171527AD407D457768F33BB46AAFAF52565129292AAB45434A4AA088485A504883262FF00AEDE9AC2E0D2AC0042501FBBA0A5DB571FC987FD9CC44E953A584ACA7E6B0E55A79D3C23C43ED37275E9BD63995238DC043EB294910077C4A840023FA8444EE4E39DE33098AC2E294A05411C44EAD7AD4B69F6A8B9F5F763B18676070CA5AF89540A725CD69D1B9B03B5A21AC9719535434A98AA52BF94BE1E3E10B32B49491078C2B844891BE169F998EE38388021245C39A6ADB3C74CC666585C160D454949570FEEA51C07A6AC0D7C1E3DB0FA3E3D9D329D17962BB79D754210F6608074750D4A095B0B48553D639C047178D452B1C690003E13071CB71EBC4E331F351256B51E2F9C970250351C94E1C3E9E71E4BF8BBDAD5CEC28C0E0A6148477826CD0AFF00ADC45D3F2BD022C1AE7531DE6D53AA2A6ADCA87AB1E0A6D4496140A6C89809B2A6C205EDF0117CECDE5AA011C49A06AB0A93ADAFD1C8E4F4F21284DC46314B9CA2B254EE5CD8FF0000B374D23D7253B5B5622980667688113F033EFF004C78E0CC67A927635FA822357ABF8C6AFE159A2FC558E29E1B23C6501039EC6FB5FF0063092945449DEA6DD2A5B9FAC3D41241E5AF2FE291B0656849016B29B192495F43D49C6841208767F7F785E5EBE1F785CC51A5B0A534845544151584A7BBF4E2DE77F59F5C22A965C104BEED41A59DABE118980167D5FED1CBD5F4AC8E17561A3B140492262F71D4F4E9B5C61CCA96B5800034F0A3EF6FC7842600028290DCBCC2848269CC9FEB93F0249DF9EDE677B893938659AA83026BCFA7DCFA40C0B3D48861ADCE12D9512B4003A293CBDFFAF2F5949382510004923EBE3A8AD1BC8C6CE588DEFE1115ACD56180425693C57FB43DFB19FBFADED898C2E5466B7125C8616B1BF8B75A38EB0E30E81A1BEF7BD6BAFBB3D6119AEBD534490B1239F17EA7FDEFD266B0D919268871FF00A7DF8EE75D9DF77CFD22019A7680E3BC27BD1E12A89501327E1E9CFEEC59F05D9B26AA96C0B386FB36D5FB6B0777CFD3F9881667DA2BEDF143FC37BC2A46D6B4FE9F218B1C8ECA099FB500D350DE1F814D2918E02FF7F7E1E7AB188357F69D52D903EB0428CCF8F7DFCE0CFE42062C380EC8238085201234E1B3DF9D7C0F331A9412086E5BF37A4466A3B53A8850EFCDC9895DC472DF7E973E589A95D9094A1FF4D9887A1623621ADA9B96A6B00429ACFAE9E2FEA4F588C661DAB55254909A832267C7681B400679C7EE43F4762D0A149628CEC923D5EBC853A42F2E5A941EAE7705E9AF4AF28655F6AF58524FD60DF9779B7AC91B9FDC9C3C47629240694073236E82BE5E5587694AC0DD46F6A372B7E00E708DCED76B1929E1A851E23FDD3B795EE4ED3CBDE70DB17D8D290C9941F9279DED51A96F4891C3C92B49D4B5697F77E4C5A1DA8BB6FAA640FE793B48E21C88DE7D7A479E20315D8A98A04F766D6E1B79529ADE94AD1996330A482403CC5CBEA473A5BAF3690B1ED06E32A4D3BAAEFDA7C8E2638A3BCE1823C60786373793B75C404EEC54D49E2EE94E2D43AF8066A306671A38786EE95296183925CEC5B5E6D5B7DE2CFD3DDB9E48E1698CCC269E956414D3059924EF2EA6151241B9B6D30311388EC8E2405AA5A4A2616E13C20B35689B568FD68627B058A992AAEE28E2BA1A31A1A369FE2E8CC72DD01DB3E93CC34BE7B47415B97D753F754B5AE1696FE50A5A49E26E65E59716A04C111104918A8636466BD9EC6C9C54954C4CC493DFC90E0625BF6D6825F00BB5DA3A9F65FB408929E098A6B1049763CF42093E25F9478ABDBDFD1F3DAAF65598667A83B3EA7735468AA95B8FA9D692842D968952C2528254F2A0950B09B6DB01D3BB1DF14254B9C893899865E210405495929035B9A59CF3A8A878BE8ED1616700998A09243F7AF5E4C91D408F36F3ACAB30C9730A8A7CC69AA696A92B297296A69DD616DA84820075292A122E403D27618F4A647F127013D2841C44B51200AA83027406AE39D6AD416890C2CF4E264A149140FF00EE38255D520BA4528F7E7A321AA29540B106F0608E7F1DBDC0F3838BBA332C2E6684F76B492B0E450DE86A37A781B8A3484AC22A790D507602E06CCC3CF581152553C46E37BCC721FBEA00368C4762E58C190A019CD2ACE3F8A7A9BC3A565EB9041524A5EDB10DD5AF5F0EADB03E39284F90B88E7FBF74618FEA945E8E0EC7CEAD5F6EF0770B735D9830A7AEB1A5D72786F3BDB6FC3F5C36993BFE5A5A967B79D2DCA306490E49B72FE79C69EF3CBE7FA6102B0BB69D75F01B465324AAC7D3F983BCF2F9FE98D90B2922AC3D9FAC68B41433977F7EFA41DE797CFF004C2BDEFF00DDE9FC4690779E5F3FD3077BFF0077A7F1041DE797CFF4C1DEFF00DDFF00B7F8820EF3CBE7FA61354EDFC2BF602364A789EACD0779E5F3FD31AF7C9F6FF88DBBBE7E9FCC6C439B88F9FEFEEFD4EF93B7D7F1EFE8777CFD3F98D9DE797CFF004C1DF27DBFE20EEF9FA7F31A1E74880047BFF7F77BF1BA5616682DD75DEDE1D3946C257158DB5D23477CAFDC7E584D6B147A0D2F58C19453737E5FCC1DF2BF71F961B4D582181A8F7D6DBFF9C777CFD3F983BE57EE3F2C342B0297DF97A467BA3CFF00F1FE63053E411336BDA3DDC87BF7F9DD25AC121D85FD9F7B987B87965AFA736E5ADECFA6C291BD1526264F283FAC18BDB96DD670EE5A81D6A40F41F6DA1ACF0CA524835A00DE1D7DD0DE1E32EAB090EA9C850013E76F416DB7999185E6CE4CB492685A8747E5E8C7C7A9232E1398F01351F5E54EA75B0DCB830EB398AFB9694942B69046E4C6FB72F4B1D84E2AB9866C25950E2B3EA69F5B830BCCC28C2A4A8A5D22E35D4BD3AB51A879C7AF1F46476448CBB506AAED873A60AE9F45B0C8A05BA8FE5BEACC987183DC2D4385CE051495168AB84DCF0918F2C7C5CCF138AC6617042710A9F32810496E1525DD999F623560E6392F6F730E14A422812E082DAB114D7D1AB1DC8ED0F3DA8CC01AA5A897C3D505D24C12DADD25B1E8106398F9E3A176170A0612495A43290928A6C056803BE963778E32B9C66CCBBD89AB35C6BA077F60C74B35CB08FAE665560F829928537D09524CDCF9CDA37F3C774CA25F1CB94959AA8B35ACD46B7BE7164C94913D079BF4ADAF5B1D9ED1E52FB4464FDFE7C3374B453F5D5A8A951013DCC004AA204EC27DD7225AF6B72A97230C6680012851240D838ADAD4D3C418F4B763330E094002FC3C20279F21CA9A56269EC6DECF755DB57692DE719BD3B8D688D34EB1519F5538DA836613DE52A5B240539C4E37C2AEECAB732236F36AF1789C4632749940A8A14A4F059DC900BEE967E64342DF123B649C932D01C0C4625244B5F13997C20713A6B705803F68F6FB5867B414D449A4D30DB6C65140CB3454397A385A6D80D212C38E0042412E1471EC08E66716DC932698A4A3BF509D36A56BE009245481A03C2081AF8C790B3BCED59A2D4A2A2788927E67A9F0346B68DBB88A7EBDFA948A6A075E2E97B8D5C615207F5904824089237D85F7C749CBB048C3CB0A609006C03F2E5E772358AB8C331E337B7315BF95A8FE74FA0166912C8492424889EA46DB7BBF1EB8F9E17600F100F4666EA7C5EF5F288500A8B0ADE8D7F1B53F8BC735110DF88CDE4498DCFF00BFC6C70BA1249568295677A7BD7A6B0F91FB46DAF99F7E3CE1BDCA869BB2943CC4EC3CF95F0E048E20DC26F7624BF4635E45AF4BC2D2F5F0FBC3555674C5288E3038A440316E460413F779E1EC8CB5534FED25ABE760CFA3F37B429107CDB52D3F8BF9824837B4CFC763F9E2730D92A8B320D69635E9A75EAF04416B75630DECE01320F8A36EB16F96DB6E062C586C8944370D9AC1BD9176822B7CEF5835E387881B59663DE27E079F4838B1617B3A5407FB64EBA8FC0D18736171522A9CE75F268882878A839C5278F6B7207CE2E2201F8DA32DECD93FD8C7667B6946D3C2EE758752120EC0EFE6FE240F467115A671DA72A15E3277FEAB917E9BDE79F2EA316AC1F66C3B775E36D6BA1FF3CA1D7766EF417A796BEFC62B2CDFB4B528A4059B49B28DE3AF98B1DBAFA0B7E03B3A97004B1B540E4581F7B883BBE7E9FCC40B31ED21609FE6AA6FCF96DB93B0F889B8E58B7617B372D828A45A800B026DF6A3F283BBD5EDCB7F1880E6BDA22D6A49E3322608519F7FC7D368B62C382ECECB485120076D07261EFCA1D4990662598902DB68EFD6D5B5DF588A54F682E03016444C9E237F74DEFE9CBAE25E5E4726AE0519E801D7EBF5BC3B4607899C585E94D2BCB93B1D285E2335FAFDC25242D5378854FE16F8F94C61F4ACA248E2F901B7BFB5A9CED0E118124B3160EC451FA5DDB5F1D5CC313DDA0BB1F6951E6B2239CF3E43EEE7B3E4E572831E00FD03F88F62BE6E9182A5BA51ECDA86EB4B6DAC256FB4170714AD5D6E6639DB7EBE97E507189995C851AA1236A8F1E5B5FF00C49613046A120B16D0D3C079DEBD6315F684B93C2A23A78B7882791F593D37C6BFE8586994084316D05CBF5FA91E10B4CCAD4BA10C3A16D8B57CC5DEED0A287B45524A8A89266DC47ADA0123E406D1CE70CB13D97C3AC1696914E87C75E5ABD9A239791A89A21C7420F236D1B6D46D49053F692E0825C36123C4444C6D1D3AF2F7C62BD8AECBC9493FED8A93A0B073BEFD234FF465A2E867DF939DBDF9C58DA1FB69CFF21CE69F30A3CC5C6F2F60CD7B4A76CE050F04052A41046C07AE39B76B3B12314852E54BA804D12FE4E29F810DE7E171185FFA61418559FC3E97F5DBD79F679EDE721ED4B4E2F2B5BB4EBAFA1427FCBD4703BDEF112A52781C0526C0C883B89F2F2C76BBB3188CA718BC4A50A12D45426F0F12598302E19DC81EA4BBC664637168042CA9C7ED279173E82A5FC6C6211ED05EC5FD8EF6F34B53A86A6869B27D62FB6E062B2999534961D424A01532C8432AE30126E39CDC9C55B29ED563F2E9B2A4714D0994AF91456A20825ECEF4A569B522F3907686761DD066B22614858531B17A136F4D2D1F3FBDBE7B16F69DD8B66B5B555197D4E6FA790E38B6736A740290D4920965A0B518102FE64ED8F55FC3EEDF2E709427CF73F2D0A80A0E4588B5DAFB4769C97B41829825FEC4B0058904F3E95DCEF7D7A8A288BEB7FBB2A6CD3102A4B80B6A76491C3C0B852784C8902FF7F72C56792B1F2E5F7530120025883B0D2FE4FD0459B1F8A938896832F84D3420B16E54BDB61CA836B596BEF254BA4506823ED490663A027D4C6E27E0C462D540FF00C5B9357CB66A444A4A6BC49E2F13F57A587AC25356DB84B1C10F3261D5DC8513B1DA3972DF0A8C4059E151A8F7A795F96B0290400480CAF6C418E7892398FBFEEC3842B436D3DF38D638E34FEFF7FBF8E09EAE1A055C69A8A751CAFBC2339C800549F4B17F4838D3D7E47F2C35756E7CCC36E156C63052A6209F3DC60E23B9F38D822EEE36A8FE63193D4FC4E073B9F331B700DCFA7E23893BCDFAE14429C313516AD5AFF98510002075BF898E64F53F138DE178D88544C920F52795B9E08233E3FF0057FEEFD70411A9C50312A077DCFA6364AB85E8EF046B91D47C4632A5B8666DF58C100D0C71C69EBF238653161CF0BB9B9FB0F7D231C097FB69F9F58389279FE1F7E1BA95C2D4778DA3153894F39BFEFD7EEF3C204804026A6D12B8295C52D4793F3D5AAFB6FE5025C4AA6F11D7A47FBF21E587D2940DCD2846BE1F6E4622B152DA6B58F139A795B7F1F1854CBCA553BECB07F9CE29A09DA7838877963D1336E97E8434CD279972CB280614DDF6D77F41B44FE57212521C3961CEFE96BF90DE2CAD11D9E56EB3D6BA7B4BE9569CAB733CA965B7D2D712BB94214D97CA8DF8470951B91B475C714ED3674B9054429E8B7AD281CF8916B78C42F69B132B05879B3967FE98A21DB89C5F9333B7F88FA71D1BA1F2EEC7BB2ED2DD9BE5DDD8464D445DAA7109E15D43B5A94542D2FA8789D2DB8A504F78A5445A0638263702ACFB30398CBE2577B31248539E012D4051D99DAA68EE5DE3CB9DA7CE5599E2169E30424B30346A016D19A95B13D280ED12B920BBC3037DADFB8E5F9E3D25D8BC29461A44B218A529141B51C7A73D0EB15A929E250043F3A8FE3AF5E74E9EEB4A9A9A961686CFF97593F58322641F04F337FDEF3DA3072132C21668CC40B6C4DBD0B3F8D22C980024A9045DEDD341A1DF5ADB9F5AB3EECC737ED773ACAF43E594AA76B5DA81F5D7D081C2DB0161C27880013FCA0660824CC620BB699949565D352A58480929248A82CD6A12E6836D869D3320ED18CBA6226B717082C97672CC5DDEDEB4A47A59A6F46699EC07B39A3D21A6BB953ED530FE24EB690971C7970E14B8BBA97C2A2A0029460898031C3723CA5588C54C9BDD90952DD2752E4FA1BB18E71F13B3D9D9BCD413314A751700BA458000025B4D2BE51535766C336A779E71C2D8E2528A42A2E144C5A01B827F738EAF80CAD322585283300EE0FDF6D869AC50B01835291C641552A1BC286A5CD6ADF688B5255E699857D0E539334E543F50E16D4B00A8A1054028F1198F099EBE9BE13CC7304619052080002545C0B57EFEC98DF1BFEC8370C0B1EA79EF1F44D599B06F8A1409B990403F01CBDC7A63C0F2704EDF2D3A1A7DF5BD3CED570160964B0B33B9D6EE6F5D0D623CFEA0201957853360A173EA7A749F81C49CACBF8BFB0BAA83A52A08FB3E95AC3A9648A58A7EEFEDE2119BEAA5B6550E0000330AF97BA44ED89595969424012DC9D83F37B86FA1BEA216439249E515C66DABDE723F9974F15F8C017FC081F941C59F28CA8A93C4B450B0A8634B796AC2FAB43897AD36FF001EFF00115D66BAA9CF12BBEB9FF501E5B4CE2E584CA40E1025D68CE9D5EDE15BB7A38522B7CE756BA8E187C5C13F6803378E7B9FBA05CED68CBF264A81E2410A1A33F859AD6E45B4822ABCF357BDE287A08B9F1CEFD2FF00BBF5BDBB059225212D2DC3683AD0FB7E71B702B6FA7BD62A9CE75629453C6ECFDAE63EE9B7BF7E569C5A72FC88DC4B6DA9CEA3EA2FB50438929A07A359E807F80DE25F578ACF39D5890170B060C9F1794DA0DA3AF2B62C786C9549209960100B16AF3EBF53AD1E1D3278801CDEB4B1D5F9457F5BAA42B7546FB99F5E73E5EE3CF13D83CA8A6BC35A0B0F7616D3D236128AB88814A01CBAD7CAB110CC352A49278FDD3B41161F1B462770F8166052DCF98661AD799D6D1B270D3174483D4317EB703EBADAD0FABD42924CAC9898FC7F193D3D6EF84B12EC9B5B407C7A537E91399760560FCE926C6FD5E8DF588ED4EA049264C0E809F95EC363E5EB8CFCC5E9C3E47EDB0F11B44E8C18FF00800598354B02FBB56F6EB0C5539EB64595224DCF53B6DFB163E8BCA510DCB51CEFF78729C0A890C9A0B8E5F4F426196A33C499124474371D2F3B1BF3FC70E78D2039142D473714FBDB9D2242565E6C12E59C6A1BD2DA1DBCA10AB3D42448541E927EFE7D7E1E9889CC3126590516AFBE836A6B68792302A4129281522A40617D06E7D884ABCFD06FC5D058FADBAFFB88383098E5310A074151D37D696894465E1403A59DF4E85DAAF4BF95291827512533E2DE2F226C67A72F8EFE5896FD5CB2E4ABC1DC96DFECFF00430F539525491F2D1F6E9A31F4DFC21C58D4C9060AC587F76FF1E436F7F9E186266CB268A07AD3DD8D1A8FCA345E512D4E38452C680FA5AAC34B9B80F0A1DD48B7CB6CB5545A2E1E2212AFB7C3732418100409DF60271B60B0586C64A9826F0BB7F7355DFE82953E1568565F6764E2524109046E2F76F5DDABB3B45E1D90F6D59AF65FAE74C674CD538DE5B515496AA9A4AC94A8712199589200054771CE4440C716EDF76330D8D973BBB48527866592E4163C24B6DBFE1A2BB99F65F825CE32D20AD0C50281F7A1342351A57768FA23D3FAEE8F50E52C67678174599D1D2B9421A70143CA0CA0BA12EA0C24A566E2649B6FB78D732ECC8C1CF5492C67485AFBF510C500A89438B971CA976D4728CD26E232F5A9402801448E86B5D1B5EB09F3BA4A0D4794D56599AD15366F4952853672D7D0D4A12A0413DFB8951E7C5BDEC0488C2580993707353370AB5226CB219692A2363F2DAC7D0F8B7C376DF1386F912B5914043B352CEEDA72D6D1E457B4D7B026579A22AB56F66B1455680FBF9A652CA09EE54428B612A5101CE2B93C22D231DCBB19DB1E2C47E9B315AA48584893314494CD61F35E8963E7E11DBFE1F76B55994B28C54E60867E321C397B93F6A18F1933ED3FA9346E775392EA262A68D54EE38D82E34B4F1C122764F9441FC31D7E4665865DA7A58B310417717BB01D2ED1D725E270B8948326625445569E214DB5AF3E66CD0C2BB2D4509841D9569579C1B89F3E989595325AFE64A817A82FD5CFDABADA14490A6E1ABBF266BDF6A3F3318952809260752001F18C48A1429C25C1201FF27AFE6374A16A0FC247DA39E251124C03B18DF69823A0336C693663060A7DC6EEFD5BA78D1A1B4F42812E0823F87FA3FBA16FEF3F03F9E1AF79CBD7F886D19A386F2E7C41FC4E0EF397AFF118248B07F168CFC1FDE3E1FAE0EF397AFF00118757FC7FF708E0C5A140CCFCB0ACB983E67F96D57EBF5F778712412412185697F17B681B9BED0614EF11FF00210EA30592220F5FC3005A4D8BC11871ABAFC87E58CF1A77F43F88235B8A55AFD790FCB194CC4837EB4351FC7DE0626C1E35F1ABAFC87E58D57352A71C4035BF1BE8C5E33C2AD8C1C6AEBF21F961B19A80402475766E55FBB46785550D7BD469071ABAFC87E586E66A058BF4FF00107028D924F484EFB91C337DE4C7E42DCE7D3E1ACBF98B8AB5CF33FE6F13B9620095338F67B59B938AB8F1BF5E1A58292A83C3C88048313E5FB8C3DC3AD0A04715B516D4D9FD4DB7DE131692A9C78773EA691CD3D6770F21C68F12B8836122EA5170F0080249B9B002FEEC577B418EC361A5AC4E9E94382CE41AED7A7589AC03C994A2B7400E5CD2EFE4C1EBF48F7A3E8E6F6776345699A8EDAF545377CBCD508569C66ADAE175954A997D496DC1C6012B064A40D88240BF99FB5D9B4BC662266130AB3314E4AD601646A2B6214C4339357BC719F8979E61D1226265CE495F0AC04822E6FAD68EDBDF471DECD635D54CCBEF39C6A7F89492140C22E52090792488BFA011675D8DC377C959989F9924740E59DB9D39EBBC799F2B9B37158A9EA98E47112092599F4DF537D183523A8DDA1E624878070126E52140F3F2248DE31D8F2859C36265A00F95C7CDA50694B8DF6F4B3484CB04592CFE049A5FED58EACE66E56E6598D3E5F4E14E3550B536F250389416AF0B648124788CC8F59C75D562F0E8C119A5680A12DDC903FB7AEFE3A43C54E4A40F983FAB83B0A57AD393476BBB3FD2947D96E987B31A869B5EB7CC9B0A69E570F1B6D90AE6652921856DCE23CB1C4738C5E2339C6224CB0A5E082D42600ED34834622A38540EB51084DCC57292784B91600DA8F7E7CEB7E462ACD4DABB8D150D3CF29FA97D64BFE22A83C44F224589D85A05B962FF009065089694AD6809A07040B01D03D1EBFE0454C4AF309892B06849AFF9F16D7A308AB4E64F543AD51D38528BEE04F0A012A32A8FB224989BDA7CF699EC7AB0F8794A485A41092087A58D05583EE49E82D137879587912C82B4A484EB4F4E7AFDEE3B71A0324CA7B39C85DD4D9C3487330A9642E8D2EC071B54113C06542E41F1016EA231C4BB478B998C98B9387515842889894870E5CA471015E6DCDF58A8E72A0E4CB75036367AD2951B1F0E71EA36659C3664717226EA36B409F3B728F80C79D70B8304FED776B8DB6AB0A3176A7A4457027D9B7BE6F107CCB3B4240FE6753BC7A73E53EEC58F099792DF2D000006A907EA6F190902C22B7CE73C412A973ACCA8C7BBAD86E39FA462CB85CBC10029034FEDBBF852E06BCF9662B7CD73B6FF00E6708BDF889B6FB6E4F945FE3369CBF2F649E14072DE7B6D7E5CBA64122D1566779F24154BA45CFF005284EFE7602FCA716FC1E0520A4140AB68C4B7416FE3785E2AACE73B4A88FE612255038CDA796FEF91E96DB170C065E9FF008245051ACDFE75FB42E00141158E739B83C443A7983E237F2EA4F5E5E9B62DF82C024B3A053560341EB6A783C390C34A569FE7D8D22B8CCB34E22005A8913FD47DFD63A927DD6C5A3078364FED1A5C0AEC341B523632F8806A1DF6AF8546B6B59E21398E668F102A207A93E47FDF9CDE263139230C90015005AE1AF571A3736B885A561D45882E353A9D0F97D1A2179866215C30AB09E7FBFBA0DC937C3F972E5D59228D6E4FF4899C3616CC1DFCC56C2F7BF880F678BD556A493E283CAE679F39E63D3A838708968AFCAECD7FC79FE22730F82040743125EBC98F2634B7DA2355B5A2D04F393227ADA39F2F59F5C131080C486BD757F7FCEB12F84C210E079816F5B753E42D1CAAAD4927C4444C5FCAC664721333CF081084A41201B87B52A3EECDAE9AC4A4BC3970C97DE82BF5D343AD7AB2B95A0920A8DB7827693EF883B911E778C375000B00DAEB57DE24E4E1C16743BEC2BF47DB7E621ADFAC499B9F333063CFE07CF7B73C36529CFD044949C20D45069F9FC56D48697AB120024DEFCC47BE08F3933C8F48C359C0177AB3372B7958F9F3112D86C1214DF2D587570D4E74E8FF00442E5724EE7AECAB7C41836F8C0DF0D432052A0BB301F514F7E4F0E0827467AFED3F47D377F268D06B5226E62FFD5D3ADBEE9FC7092A72C502BC341CBED00904101E96A066F0DF95631FAFA3FBA0F3F10FFB8619AA6AC9352DF5EBEF946E306B0EC0B1F3FA1F6F7731C8CC9C410A6CA890A489E29DCC6F262660C1F29BE1D499D3112661130A69A7FF00AB4E5BB7285E4C8293B2B6D4EAD7D6C29E178795E7EF32FD352125448E2124CA4C05483CAF04411E5388BC2AC4E4E204E50997FDC1C6BBB8BEBB6B18C6E0FBC94A253522A6DB8BEBAED6D35F7B3D853B48675CF616F69872A0AEBF43A9A04AD654F2BEBF54560152CF11802D72074DA3C87F16B048CBB3999899008566055DE84BB204A0424DDAA7616F5E19DB0CB9284CC1DD8643906D777D8EB4D43DC388EE73F53DD17521C238D2D917327853248827DF706200E58E7FD9A946609CA5FCC0115218D497FBB694B6B1C52661889A43317A0F1AE8CCCF7F5668462B5AA94BE92E250EBC9E14154149004282C2BC2AB75F4B5862CAA966594841E14A4BB815A9A310C7AB1357A6D3B976327E048EE96657135412051BD5998E9568E977B41FB33E8FED432FACA9551B0CEA1085A9AAC6DAEEC2DC8241212128E82E637DE3172CAB1B3414A16B570822BC44B5294EAD6148EA9D9BCEF1699A850C42810DC4E7881D0821EA2D7E54263C32ED47B1DD57D93E78E51E7D46F399754BAE8A2A94A49404B64CCF76088129E7BD84CE3A9E513E624242A605022F4A027ABF9B78D1FBC6579948C6C994A03BB9881F3077EF1D83F2D49FADE295A97EAC3C94A877F9783B240494FAC4AAC79CFE38B74B99C49705F7B78728B8E1A6CB5212A291C400047A3697BFB10B6A54A0D30524160825A47347F749DCC99DC635984D1CD4DC56BF6D3AFD90C7250B4860C79ED616F523D211779E5F3FD309C45F723979983BCF2F9FE9820EE472F330779E5F3FD3041DC8E5E660EF0F43F1FD3015F06F5E434EBD616932921DC0F5FADF783BCF2F9FE98C77C79F9085F813B7A9FCC6D6D60CCC8F98FF007C67BDE6DE03EC0C1C09DBD4FE636F1A7AFC8FE583BDFF00BBD3F883813B7A9FCC705606D7F97E18D173096657A7F1070276F5309DC5EF3D2E768F86FF00BDF6C20B5AC10CA6E97F1FB78C1C09DBD4FE6908DC73602FD3F7CBD39DCE1098B5503B3BBB787BFA343E4A10003C21EF563EF96B1A7BCF4DFAFCBD7F71867DE2FF00E461544B4D5C3F5F18C915612B4B0A00A5E07895BF08489B1DC7388F2EA313D96AD3DC4E2B2EC9BF817EBAF421A821C7767BA584001F9B6FCE8E5BCABCD653D638D52D496480C01146540492490F44DC93CA7D4621F058D299D89055F213F292435C92D7F5D7AC43BCA973E519A38A73FF00BA384B00FF002B814A0A3B51E3B8DEC2FECA99AFB41F699475F9952BAC68FC96A13575EFB895772BEEC77E80788A64171B22C48B99118E09F16331C415BCA9EA425D99277236BF4FF10876B73C9383CB664B90532D66529D8D5DAE37F5BB347D2566ACE459464747439486D8A2D3B4EDD232C3490DB4A84A5824348E149BA249E1266E2F3344ECDCB993CB4E05666A5C2D42CC28F7771D4D58E823C2FDA2CCF158DCCA6056215313DE2800E5AA4EE49F7B33F5DF54E6EB8AC696A5292903EA4493BA812E45CEC771CA04473EABD97C0F77317F2808243B01536FAD35DE25B0525326425412028A4540BBDDD869E1CEAF1D4BD4AA79CAD577854E3AEAF8384289B1302C081CC63A2CB97C3502BEA1ECDAD7946B3A62D36253F97DF5BDAD6BC4FF0046E87C974851D46AECDD095D654252BA143838B8080428F0F885ED123716DC6196267E2B153C60A54C5140FF00ACC4D033A40635714A7A43513660209516FEDBD77E5E3466F3AFB5BEBDABAAAB5B8AAA4F0BD2869A04029481C205B6111B798E47172C97279328213DD5989E20EFABD5CDFC9CC399438CBABE635777018FF9B7E628DA8CD5FA6A9A879F052144428F8F88AB6481B9E298117BCDB9DA31F3118390C964324D2CE4793EDE35AB449A0A254B53258B3123EA29A79DB578EC5F62FA169DA655DA1EA767B9A0482ACAA89E07894E5D1C7C2405D9CE1500A4911B5B1C6B3CCD2762710BC2C89C5D4A214A497084ED7209507E8F6D62B3996216569E0511C2EE428B2AA34D18D2C1C72BA5ED4B582AB2A4B752F0352DF185F01E068B51FC901B443638500030395E0EF25906070E129946582054F11E2249A92497275678DF2C96AC4CC1DEFCCEC2D7DA9A7BAB47A7398E70F193736EBBF9C733EA71C070F80424B82E36236A353EACF488A880E6F9CB8024827C455CEC4FEB6FC37B59705824A883D2B60343D6C7AF8411586759D3A4AE144EF107D79DBAFCB16591854A00702D717DB4E9FE5E8456B9A674F447113B9224FDFF00B988E718B3E57864872A0030F1F3DF716A1DA08ABF3CCED7E205666F249BC91B7975361E87168C2E141F9A805399B8F5FC5E1C0B0D22B4AFCDDC528CA8AB7BFCBA1E7BC7C3171CBF0A1D23CDC374EA36FB5E1C457B9CE6AE78BC44133CF9413E9713B47A8BE2E183C325213C4028D6835DFC052DA6F0E694F567AF2AFD6D5B30AC0AAF3270932A3B9B5F793E5B5C6DCBAEE6691204A161A786DF6AECDCE24B0B28299D2C28EE5F99DEFF00E221D99662ABC1379FDFEF97BB0BA789C7FC6AF67D1BE8DB8D1844E61F0A82E05D2CE5ACFB575B797488ABB5CB502788DBD4F9003CAFD473F52E258357B166F5FBBFA44E61B0813C2281CD9BD7F00F8F363AAAC549B9136206DF21E7D37E4230E25EBE1F789B918349BD5FDEFCBEBBD63B5B58A004DF7D89E73F8FBAFB6E71ACE7E17D1EBE9F8898C3E112970430A5BC1B9F2209D22355758A13722D37BF5F311BDFD6D866B24853F2AEFF008689195844BBD850F9FE34DACED76572B172649E7FED37EB1CAD6EB86EB511E3AD0337F1D22570F84492C19C5E9BF93D18E8DF46B7AAD706E4F99BFEEE778DE2791C332A7B519EAFEED5F331232B09562001FDC47E2A3D37F16A76B166209833FEFEF9E7C8FA0084F3ADDE9D29E147B5BAD624B0F87482DD34D6A7ECC2D4840BAC50E7E637FBF7FDDB0CD4585013BEDFC7AFD8B93246C0F8FE77FF00309CD5B9D499EBFBBE1B295C2D4778D3B87A801B4A0E9BC71F5959DC7C0C7E1FBDEF11868A5851F95C0AEA7A7DA36EE696F17FE5A394E6A9A675A6D6990E104C9FED20F4EBEFEB6B1CA56384D6A4100877F3B4389785E22549B25B89CEE5A9E76630B9FCF1B72AEAAA026F4C1A4A4F4E301260F381F08C3196BEED6B06EA2C696B8F56FE443D9B81FF00648201E204A74A01E8F53FC523D2BFA35BB42A9A3ED79DD089528D26B3656E38893C3396D2B8F24F0DFF00A86F1EFDB1E68F8D5FED6265B31EF2CCDA33B120DF61B3B35B91F6DB2CE3C0CB9894022571F78453767A024F87D80F65AA3345BC8A9784FF0025F2D4F203BC2D816E97001F2BE39B766E58972C922843B7A9DFABBD19E9531E75C5E1409CB61AB721EC6C776A421CD1EA7A65B2CD538A692B0141692641226D11249B7A62D2A962600B48D6A0D486A539D397DE22F184482962ED6E56A6B7BD296686CCCF35A814BF5653519790422B090547CF8638F7B46D3D4E24F0321226898872B49A2743B3E9D4B1D0522C790E3A624A4034357B7997B5AA0F8C50FDA2F679A635E64EF506A0A269E67BB7050D52920AC29625644026CA20448C5D7018B9D2672552C711769D29C86164D5E828FB73D23B6F67F305B25894B70B58B9E7F4FB3B478BDDB876059AF66B9B55D6E5090F644E38B500784008DC40512AE768131E713D0B0B39D20A4B12016726BB5437D368EA981C72D68055FB8332874D68E695AFDC47565F0E25454567854480DFF6116313D4CED874B2EC742EDE7FE2260CC33D22E08A13BFAF43FCC2793D4FC4E348D7BBE7E9FCC127A9F89C10777CFD3F9824F53F13820EEF9FA7F31CF12873FC7EFC11B253C2F577F7BC1C6AEBF21F9608DA3636A55EFD3A79E0823671ABAFC87E58208E0ACC1936E76FC8608212AD66E67D07EFCBF7CB092EE3A7BF6FFC9089D5ED373CC7B87945B084CD3C7ED0F93FB4468EF0F41FA7EF9FCB0CE1697AF87DE32EF9A292D287F39653DD1BEC3EDFA0E107F330061EC99A65C998016241A72A8FE3A9E6625B0D2C2A5AA81D85478B136D5A96FB5BBD8FF65B9C76D1AFF21D01A7C91F5EAA6C344708E26D252E544F14720A1731EF99A066B982B0489F3662F825A41516E4F76E61ACCE763152CDF1A8CB7BC9C5026CD5823859B85835D8D4695B8BD23EA3BB30ECA329F679D0995E89D354CD53E6E9A563F8F54A10038A52909704AA24C82B1E156C6D36C70ECDB1CBED04F5E317F3617888C356DC2785742C4B91AF3F0F35F6DFB5335026C9E3539E20456C5DBC0023C2ECC2346AFCD29DC5B6DE5CB3F554A54AABB93C4B899337FB5C5E5E800C5A3B35844210AF943900696736AD1ABE768E13865FEB71A56AD5679EFAFAEF4B168EBBEAFCECB74E16A324F1269CED24920CEFCF99EB8EAB91E1021D40073566F3FB8BDE3A409625E1D054588143BBB303D2E5AE2C6231A474F36E29FCFB3B4F1B490A71B045844C6DE839183169C486366AD2A1270DFF0055640E96777BB8B546B1173C025459C01FB7C3466A8FB08AC35EF69CA0FD665A904D123C14C018080278AC049B89369BF3C59727CA6505214AACD5B152CBD48D2BCE97AB54E911FF0032A610372E0B7E69C9C9D7668EB56679C3150B5666FD4AF89B51286A1504A8909E703CCC6F36C741C3E01329085B86E9771B796AF1278595354A1292975173C2E03B03F40C6CE79C5F9D88F6655FAFAA9DD5FA9804E89CA54D3956490429464538213FCC82F2520900FB86397FC46CF93972A4E0A59271789E21264DB88062B3C4681857573477A95F1330A2539D010B5731403F9E51716BCD5AE53D4AE9A8DB0CE5D4AD7759751A2020B696F84ACC40160177124C9DE71CEB08927854A24CC51F994CC5CD5BC2D7D3668A8E2141732D47A5F91B73B56DE71D1BD55AADEA9CC2B180F29D430A90E99F171924A6F061311E62F18BE64E966A1040AF31E5E0E6D5A6F7EECF6010532A610FC676B358D29F4B47CB3E3F3111F6BE0C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C104182083041060820C1041820830411FFD9, '1', '2021-10-06 01:15:47', '1', '2021-10-06 01:15:47', b'0', 0); +INSERT INTO `infra_file` VALUES ('add5ec1891a7d97d2cc1d60847e16294.jpg', NULL, 0xFFD8FFE000104A46494600010101006400640000FFDB00840006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D302D283025282928010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC200110800EC00EC03012200021101031101FFC4001C0001000105010100000000000000000000000701020405060308FFDA0008010100000000FA14000707A3E3F659B5F2B3CB1B171B57BAFA2C000BE1ED8731AFC752DF3F2F2EF249DF79D0000A465CD59E5ACA5BE7B09BB71441BBB943DC0017447C95DB0D662E4FD0192237F3E17E8600039B8AF556E579647D0B60807A3DA49368003D7E7AC1A5B678CA3255081A4AEBC0007AFCF5834C6E8BA3DDF756902CE39200034908796C661E82C04073E003D755A4B2FC9F48A34CFA172404152C6F415C4E175B9BB879F8EAB41CEF792A807CF1B1903B7BADA5DC0737D47ADCB3CFCBCE3FD2CCBDB807CE35CAF5E8B3F0757D0FBF1BE7DD655B65965BF384B9397B80F9C6A2EDAF577F05A0F3D9499958BACF4E7F41D0654E168118657B59A8E2E43DD71B31FC73ED26EE33FB0E939E8FB135FEFBA9528007159783CAD981B8C5DDC9596A5231D6E17173476200BE26D8351AFCEB33FBED077DABE2FCFB6DB59CE463365A018B156E4A3CB7DDBC65CDE3EDF71259C945B3D7900725CFFB554C0EA3B769E32BEC92F794A4711EEE3BDEBAC0380C657CB7FD6E50F3D4E266EE0C2E2F9DE73CA6FD90237B7CB7FDB5F554B6911C8BB8A948CB039CE5E79E94230B3B6E98A82945453C225BB87D44E3DA158BB77DF56A00A1452DE6A2DB397D6FD5C562696B215002DAE1E4D29CCF8471C9DBF4E9EB03CF952A028A539DE8296E1C7DD3C2DABFA80BA3690760A5C28514A626A37F4A523DC2D7E9A772B1CC9B7733B2DA2828A2DB628EAFABA523DD1D29302BC6767EE88E46DB1414A29486A1A9CF8E99E2BD91303CF98ECE8897A9EC5428A294A70B04E5E279751D613038FECBD5485BA5911428A514530780D5E9B7B62930B93ED2D6A222EA64A28A514514ADB444FE56D7FFC4001B01000105010100000000000000000000000001020304050607FFDA0008010210000000F3600075E70AD558EA46005B9DCE33E1B7367000694AC32CD3CC00034E58A1A69A59A125A512766681ACD81C9A194D4F44E2B280D94750E8BD1383E7AE6F60E4D500BB0F4BB3CCEBAC540E7500BD5CB7D135B33E0E769342FA6DDE51AAADE56CD084D7DE780014F9CBF8EFEA2E800346D4CDC87F57654104628C38ED9DE6B841064EB5978DEAAEB155104115A7FFC4001A010002030101000000000000000000000000040102030506FFDA0008010310000000EB00043FBC939A35CE4003A76164A7AFC9800061CB22B8CAC0006EDA78C4B0B845F5B8C23981D3533A3CA742D7F0DDCD006A346783E07D9FA05BCFF7A92016EAF9EE0FABE6CE8DD4901AE84ADC1E8F5BCDE0CEC483FA72520BD62DE8D54E46B8F500019F429A318AC001259BEAF3215C8009BC1B5F4C55D2B5924B9560D55CB5AD2490B4EB3FFFC400451000010302020604090A050403010000000102030400110512061321314151203261711014222330425281D11524333440537291A1B116436292C16382E1F0357383A2FFDA0008010100013F01F4FC6B4931051908C2222ACB706690B1EAA397BE9E719811335B2B68D800AF9C4D735CB6D6A56E48036229BC3DF575B223BCDE861A84ED71E3F95AB53091D672FF00EEA270F1EA66FCE8C8863AB187F68A335A1D58C8FD2953F932DD2A628FF2DAFEDA3249FE5B5FD94F2D9BF94D3415FD236D4518C6ABE66D627A9E194AADF6047585622C3B866352E54C49533297E43C3684F61E54E105ACC946B788038D09B2E495063220A77802EAFD696EBF721C79DBF2BDABBC93DFD0346AF750424152D5B9291727DD587E8ACA9090B9EE888DFDDA76AFE02B0FC270FC3BEAB1939FEF17E52BF3AD62A9195C405B4B4B883B8A4DFEC0B4A1D694D3C80B6D42C526B12C39583FCE226672028F96DEF2DF68ECAC4594AB24A64EC3B7327876D22521D4E5988CDFEA246DA7A294A758C9D635CC784D1AC330F918A492D46B04A7E91D3B91F13D9585619170A6B2C74E678F59E575954493BFC3F25BB11CD6E1129C8CBF66FE49A8BA55221B89631D8BB0EC0F37C6A2BEC4C643B0DD4BAD9E47D38B1052B014856C20D488BF26622B84ADB11F1999278734D3CD969D520F034CBCB65576D56A25895BECCBDCFD534F34B65595C16FF346A0C473109CDC465594A815297ECA79D448CCC18A88D15395B4FEA799E88A75B43AD943A90B41DE0D3C1FD1F9499905CB344D8A4EEEEA0A0E34DB805B3A42BD3E92C432F075A9B1E7E3F9D47BAA7283A961F4FF00311E14485253915671BF655FE3952D0082B64E64F11C53DF583CD187630C495FD09F34E7603C6962C766E3D1462130904EA7F0E534EBB20A9A8F159D74B705F28DC91CCD46D185BEE25EC6A46B2DB7528DD4A3BAC2C06C03D3B7B4E53B8EC34B4EA98531F72FAD1E1357208209046E229C3981CC37EF238FBAB43315D73670D92BBBAD8BB2A3EB2797BBA3872017F32BAA819AB4559221393DC1E7652AE3B10370FB0B5D7152961C7A42C6E72438A1DD7B785C7128EB1DBC071350B02C5268CC969319BF69EDE7DD4DE8728FD63123DCDA2B0DD178906735284A7DC5B66E01B513737E824EAF0A98E0DE465FFBF9D436F5387C4680B656923F4FB0E3738C083E6B6CA7CEAD94F6F3F752C25166D06E940CA0F3EDF061B02462920B516C9423E91E56E4F6769AC2F0785860BB2DEB1FE2F39B5468A89DFD37ADF213DF8BFC8A1B59688DD907A20835227C18BF5898CA7B335E97A478524D92EBAE7E06C9AFE228C7A90A72FF00F9D0C7D9E302701FFAFF00E6938EE1C4F9C53CCF6BAD102A563586C58FAE3290E83D54B67328FBAA6CE7A64A54A90323A5391B6FEE91F13E04A1C79C6D9605DD7559103B6A2456A0446E2C74D9081B7B4F3F43193AF852637150B8AD1E942760CC281BB8D8D5AC768E9EFA992A3416F3CC7D0D0E00EF34EE9148977460F12C3EF9EDD4A87325FF00E47107560FA8DEC151F0B84C7518413CD5B68009EA803BA8D1A34F448EEAB32DA467F680B1FCEA4E1EA4254A64A9CE394EFF00CE92A0ADDDC472AD098E97A5CA9AB17D479A6FBCEF3E899714D38168DE2A338E33255270D7FC5DF59BADA5F51CA87A48CA9496B1465511FF006BD4FCE9BCAEA02D95A5C41E2937ACA7978522FDD5896901538A8B82A75AE8EB3C7AA9A630B0A735F3DC5497CEF2ADD49B0161B055EAF57A2689A346A7E30F78C29A8694D926C5445EF4EC85BEE053A84B723DB1D55F61F8D684048C04A13F4A1D59713C526FC7DDE910FAC2321F2DBF655B4530A61B5E646BE3AB9B2E5A9B9F3B66A31726DC1D40AF95B1C693B04391EEB1A5693632D9F3986B67B81A7B1BC5719CD0C3488ADFF3549BEEE550E3B71590DB42C07EB4FBEDC76CB8F2825239D3FA43B7E6D1CA87359B531A4842AD263651CD06A3496A4B41C616149357ABD5E8D71AC230886BD1790EBA91AE5A5C257C516BD4194BF18650B480D1010A17BDCF3A8921FC2DC131ABAB56723E8FBC4703DF51A435362B72A32B332E0B8F4C1453D524771A87AE7DD09D6B9946D3B69B425B4E540B0A52821254A3648173498F37185AA42595AA3A4F93C8549929662BEEB2DA17A95645051B1BD61AFB38A5D011AB780BE5E75143D86C82E37D5F593ED0A8B25B94C875955D06AF4FBEDB29CCF3894279A8D7CA71782D44730DAAD45F4C98EE884F20B994E5B1DC6B0275E6D9721C8D6A2DD64AB7281A7F4714257993E689BDEFBAA4C96A2CA4B6F1F36F2721ECEDAD1F9FF22622B8EF9F993EADBFD0AE7DD446E236A4EE3E813A1E7F9B89AFFDA9A4E8743DBAD99257EFB57F0861BF7D27FBA95A1F879EA48909F7D3FA21251730A685F24AC5AA6C79B86AAD3D8213EDA77560907E6F9DCD855B4FC29C8A35B649B0B5EB1D516F0C91CFABFAD600DB4CE09112DDB206C7FCD692869CD209EB67E8CBA77568FB4E7CA91CB69E3B7BAB1646469C58DA40D82B0D8A21450D5EEAEB28F6D3697E63C598405D3F48EABAADFC4F6541C1A24539D49D7C8E2EBBB4FBB97827E0F0A68BADA0DBBC1D6FC950AC423488032CE0A7A2DFC99281B53F8870EFAF9D048CA10F208D8A0ACA4D3985096A0E4C514AF8250760158AC44B91EE91D5163DD5A218C2B38C3272AE7F92BE7D94458FA4D2D7C96A261C9EB495E65F6213B6A23EDA59B28D88A724A8BAA523603B2B1B19B0C7EE6DB2FF00AD6172DF430194B8AD572A95804790F1790ACAA3BC54382C4004A7CA739D7D6E50B6D69A55D479AB9504392A408B1CD96A175AFEED3CFBF95458EDC5610CB09CADA770E8101408201076106BE4A5AF5AF610E06D21C524B0EED4120F03C29D5CA8DF5D82FB607AEDF9C4FE95F29C4E2EE5FC4922B15318A82E3C8403BD3955B8D68962C716C36CF2AF299D8AED1CFD1A05D429D77C771D9926F76DAF30DFBB7F87158AA99096CA1412A36DF50E0C88EC84A9E43847022DFAD66929D81827B42C56A243E7CFA836DF241BA8FBE965319901A6EFEAA109F589DC2B0F8660425EE724AAEB591EB2B977560788B8E4F991E5150505272E6EEF04B9CC450758BF2BD91BE9CD296028846AFF00326938FC89CBD461CC05BCA1D6DB64F693585C4F1282DB19B3A86D52B9A8ED27C0A48575803DE2B178EC2602C865B06E3720560EB30B4B5ACBB1124588A56C51F4531EF168129FE2DB648EFAC211920357DEBF2CFBFA4EB8865B52DD504A06F26B0684B71D4CD94828007996D5BC7F51EDF0694C53E3D16446506DE5052566DB176B581AF18C4BAB9503B75A6D5E28EBC6F31DCC9FBB46C1EFA4B6848B252903BAB01467C656B4F55A672ABBC9D9FB7431F72CDB4D73398D48F271BC29437EB2DFA8A77AE7D1697B9ABD1E75237BAA08A69391B4279003A3E3216EEA6321521EF61BDB6EF3C2B0DC1D7AE4C9C4B22DC4ED6D94ED4B7DBDA7C38AC3F1D8A50956475273215C8FC29D73C5DCD5CB4961CE4BDC7B8F1AD6200B95A2DCEF4D2D7255921365F5F31D51DE6B08802045C8559DD51CCE2FDA3D0C614A54F702BD5D83BAB16D6F8E40547FA54AC94F7D31A4B8CC43F3D8A1F6C6F396C7F31585E9161D889080B2C3E7D473E34A491DDE834CCDD186B1EDBD7E83257254530DB2F91BC8D891DEAA6B020ED8CF794E7FA4DF928F89A8EC351DB0DB0DA1B40F5522DD15A12E272B894A93C942E2BE4A819F3F8947CDCF2548C4998A754CB79B2F04EC02B0F9C8999C25252A45B37BFA12633525367537E4788A9FA3C1E19DA78EB1BBA9A047ADC298703CD058D97DE391E22B11C2DB76EB69365F2158563B3B082942FE710C6F4AB78EEAC33108B8AC7D7435DFDA41DE9E9E949CD8E618DFB282AB781D73265012A5AD46C94245CA8F6544C194F0CF89916E11D0760FC478FED484A5080942425237002C07A03B8D390714724A9866304241B78C38AF27BC0E3585406F0F881A412B513996E1DEB573E963917C46619681F357CD9DFE85FB5DC68D6251B617503F10A61C7F0F9224C0564706F1C0D6038DC7C659B27CDCA48F2DB3FB8ECE96909CDA551C704B17FDE9E73568D892B59395284EF51E558461BE2BE7E45973163CA57040F653FF0076FD89E6D0F34B6DD48536B16524F115219561B24457AFA93B1874FAC3D93DB46A5B3A978A7D5DE2BCE30FA64C45143E837045617A510254342E63896246E5A4F3ECE871AC636E972FFA628FDEB47E3090F2A7AF6A5376D81FBABFC7D931D85F2843530DB812F6F483B95DE3FCD403250B5C793B54DEC39B62D3D879F7D62A9F36857236F03B192B5E6B91D01BEB1F51563D2D2D6C756866324F6AAFF1A8ECA23B0DB2D0B21B4848FB03EFA59C80DCAD672A1237A8F431E694A845F66FAE8FE705B88E229C8AC6330997C9C8FDBC9751BD3F11D958C3722235AB9A80368CAEA7A8BF81ECE937D7AC3E5993A62DBE47997242F2F7E5B0FB0E1C7C664489AADC545A67B1037FE67A12D84C98EB6944A42B883623B6B47642E015E1F33638855BE07B8D62AB4BF065B4B48394849078D4A82B601531771AF638A7BB9D254142E9DA3A093635A4C9660CEC15D650869297944D85870BD4394DCC6CB8C056AAF64AC8B05768ECF4F2DCD54579C1BD0852BF4AC0148560B0CB7BB563F3E3D1D286836F44969EB156A17DA0EEFD69C92A5EB2FEBA520F78F03F874779C2B505051DF9556E86C00A9442509DA49E1410349E787568B6131890DF02F2B9F750000000B01E0C6F11F1169B4A7E95D5048ECEDAC35F5488895B9D6DA0FA4202810ADA0EC35A3B3061932561524D834B3AB27D9E0698D21C35F9DE2AD48BBB7CA0DBC951E40F434CDDB4161A1D653A93D2DE6B1B5AF11949C1A2A8A507CA94E0E09F6477D30CB71D9432CA421B40CA948E1E1D28CCAC563A6FB3589FDAF58565F106B29BECDBDFE974FE225296662363AA56AC914127665D878562DA4AE468AD371D00CB50DAB56D48EDA81A5188C792954B73C618BF969290081D94FE2D15A4660E67BEEB7C6B1A7D53A6C7521C4E6CF982378B749D7931A3BD217D56D2555A2ED2BC4972DEFA696B2E13D9C3A1A48ABCC2AF61D47C2B00776BAD1FC43D2E99435CBC1EED0BAD956B2DD9C6A1B49912DA6F7A6F750ECA95152C4D534D9590948B85F0A71BF20D3816E93AE56729397B36568FA72B4FEC1B17BFDDD2D2E51F929A8E8DF25E4B74CB619690DA3AA80123C24D85CEE158A2F5ADBCBE6ACDFF00EAB0755B104F6823D32224742CAD11D94ACF108158E600FC99CB950D6DDDCB67439B368E37A8BA332B5A15296C8037041BFBEBF86B1242F54DA1A5206E74AF7FBABC45386B288F9B3BBD65ABB4F4B1FDB3B0349DC645FA18B2CA2039978ECAC4C5E0BBB48D97D9583FD7D9FF00BC3EC4EAD4E3AA5ACDD4A37E87FFC40029100100010303030402030101000000000001110021314151611071812091A1B130C1D1E1F0F140FFDA0008010100013F10FCE0B032D36BD74B69C8F6137A56A00C92E87777A82C152709D05827769D2D7B9F63F9A46C9B00FBB58E2CDE53EC547DD0BE1FDB41C2099E4F34E5A46241F4524D856723E655FC52A491A36144F10CD40C4961A5C0BFF8103389AB0DE8E169ED3DA981205B99E90B6F348CE90978FE14B61C15F4914ABF205FBE8D3D0A94B3D0E3F81769770BD97397E02682183E43CB1E2294727B5459448C1F25223088FE782179644A756382AA57C9FE734AE1D0F0A701E6841A16200E50FD7B5470BDCBE9DFD05429E19C96DC9A7BA2ACC52D45BBE8705A90953D65F35AD3FEB99A590583939461F10F15A997264EE64F3F9E17411A4473255DDB9BE3538D3C6F578EB43B9A352612C991EE56128D1979DAA72568E4EC7A0FF3C04C5986AE87347DCF7BCBAC9AAEAFA548290C636AC7B65C8D3BACB3232B35930F151AC466D20FEFF3CC91C50966E4F24FB563C096344FFBF1D1A6C29CB58E56553F01BAFC6DB92D589215DF9F161A0910DE1309E91A4CDA29F33334A674442CB680DA8854C0743C2EDBC7BD0282100D0FCE0719341D4A99198FBCDA64FBA69E8D4598425190EC4041DDA3C5B82951A60E51DDAA3E3B52228E4F427CED4F18FF0071508A74B9647DCD673FF804D4A38B5059803F0D34D47E461BF60AD946AA06E1BD452466E708EEBFAAB2938A163582A6777A1B4417B4508404404130FF00C248277E82EF8177C57B207167C957A5BF1A24CFA0F83DE8309CD60E1D0E0A6EEF1EB825B909A199214F63F0E714B2520DDA2A51BE056E096A589D2F5DAD52A33D0919F769379F44C1EF4895CE0F71A1286E36727605FDE2A69EC7647BB3F36C7484A6721AF6095ED45888919D64EAADFF0009631BDD8FE42B946162DDFC47AC15012D0471C8F60CBE29652EC840344313C2BDAA752C85BC7FE2A0133A73F9A3E01C400FAA4EEFBD2A6A65A33146488BB82F4E5E9BB25DB53DE895948C8215B268D0F0109B429EF441E5A5555CBF85500DEC3C539B9C696FD37699342E895CEC3DCE6A18E24207DA93D5489913A5DE017574A0FEA8371DB47BE3BD33BB64287CE7EB8A02103004051428F502ABA8AEEEBD8331B14A11200C06CEFB7BA928269B796034B0FC8B944B27FF000F15DE8A43C9AD4025299D5E162529513F4BBBD642AC6592CDB6B71A6A54C1026E2FD19AD4FE9D56EF35A945965D8DDA621FED4050052E66C78735ACD18C8EC9A3D0D1A2A1B3BD4F34B5BCA10E9114E98389E470D4FF00E47B1F402D3C157ADC184DC4D11B27E1289EBDE9A95790A51C2F23B1B79A020917BAE5776A73848E819A57822058E3777A12C6DA4081E68776F0320E1A9FA41C6193BECD61BD6E422644D1A69C1E605290A6D53DD14EC582B905A4C9521224524A4A6F522922B4B3B54EE99E4108D4C94B898ECD23C8CFF544090121713F036F227061F745B95C4087DD76EDA1FC5679B4929F45446DA8786A51E4BC5E51984B7EF8A8C0B0846F3A781F3489EBB4DE198A24320B3903483C8D4C2A4A7CCD00A4B060A597DE69CE00BDD97A839230195B07BA5199B32B5613E2D1531C9029E2FD2F31449AC5B8EF06C780A2C416363151862F7BB7933D9A8BE618658C8659D948A121381A28DBD9A3492C7BB254BBC94292C0466187B944DCA59CBFE7DA9A24FC6498A56248B9542F760F7A04762C3ACBA525502026850E3C127540D1A046D2B454B42CA124F6A72E4227A1C5044809A72C1ECDDF053088498961EF606AF050512C64795755CAEAFA0CB140488E89519BAED8014AE5DB0516E50404E66EA9146859863DCA9B889A276AD83EA92922BEBA4BDA1FEFF1C1A9B1F9B6190EEFDF54A42870B38AB1438400D8FE454E3B10FF009A619765E0DAC03C5EA43892D4AA039573DDAB53A1BA0B0E1603F9ACD1C4C659243819B76A8767DAA22904D9477D03BD04082D2C5F21158C6E001E16580F35255E63C4C7DC3429853B50503EC0FDD36AD1A0667B50146DEACA90E39068C0E7F143BF432DF3152AC253754FA8CA2CAA029E88A344D93D1160C837BBD0AE5E121981C4B0E4A5489372FB2682C64C80ABCB2D1328C00A7B21306CD1EC9A8EA60376EC163E569366ABDE4FE684245BF12BC8C9E32CFEAA0500B670450FA1405C987F403BD4CF6F28F7AFBF834EB02C03C9074791669747BC1CD8C5A934A7A8C5065C622F3E1838A8357E2C4BB1B183D02C2003EC99F32D12B97A62200EB6D2B548D8B7163DCADBD6912F183F15756FB8FC196AC3F11FCD4CAF49A52B50B97C96F04B436BFA8F698F913B560E6C31FDFA1A6AD7922786818BB16A38A686076D63E8AC2D08B30CA09EC4F9A9A7A427A30DBB0D1B85CC0C6C5DA684C5487C95939192811733667B73C52E6B2309E593B62AF84360DB27EF1587D473B2270C3367E28A13D80DA61FBC1AD1449DD2ED0DDF047750AEB8181B018EB1D5E854861441DA94CA50A46CAEAB513914657E8D0F531347030F63D80F3DE8503721835E7F9A70B66248EA27EA99413CACFD9F4A4461B3E832536A2B57F4A8242424AF03BFC6684A9180FE006EE5758F5C7E078E92244C952415959E636E392F4444491B2351565ECD31F559963FDE6823CB5310D61A3E830A3321D4BA4FF4AB81AD22063BEA2381DFF2BE99A5A88064DF8934DB21BEF460EA448D0346C1868D8B794F09FD534A825C81AFA04939A2ED9229CC98E0978A80023E023FBE87E6C7179CC09B6C05D5B06685426CEA4D34B57E252E63F717EE14980B7EB539375AF53A83177B1BF23C539F4991382F4C8109B710E07708F7A3F24F468BB065A6BC089D4C23915EC14B4BD09FCC0E497026CC51B17AB362717045F4A0BA5FB81446803032E45CB4719A26D2613D17789DCA38AC640334FB538887699CCB7744DA7D735353D66A7A26084F09FD531AADD9CC899795A9E93D0F68921BA65DBED404EAF3B86FF153577EECA2BBC1AFA08B60AD002EAB57153A1D4B7060B7EDB1320400401B1D00ACA5ED58A4175E8081873E89A9A9A9E934B53445424371CD397D2CD97B1113FF006A2D52499E215FBD3ACD030B14386DFBA72F7A9F4020196808A198B6F7247C73446CF80054F4BB44F801C3EEA232129773254FA96A6A6A6A6A66A5FC86214473E2D5282BA08B43367DEA76ABB504090CAB36C77A304BC800B021331AD16000384BE2EB1506C402D1D5E0BDF55A5BFA6226592C4C18FD79A8F63DE31876CBE881F77D885F74D25600BE1FD749A9A5A9E9353D27AAA8B716502437B53C09D614035DAA5D36095370388A8ACDD20E56C548A3D3591858C050002B042E9063B7AAEFA600C4998F8286E0083608A9A9A1658095E299DC9DDD894C4D1AF69FD7A67A4D4F49F464C0062F98A8FF00F9260110139B5A9AB865D03BAD74D0A5F6D3000272E5344461216360FF006DD1A9EB6AA660E40FE6B4A73D1254306F0B0D43C7824E1B25081958925CB7F57AADFA36E8DBD0E29E8B03DAA75809A7AFFFC40032110002010204030506070100000000000001020300110412213105104113202232510630618191B11433425271A1C1F0FFDA0008010201013F00EFA005803589B860B6D0578F61615918EED5D98EA4D1897D2961075B576D147A5C9FE2BF0F14BF966C7D0D4913466CC3BF0CFA76726DF6AC96391BA55CAEF57BED4C5635CEF52CEF2EFB7A72EC581006F5886CB1647376F711B67456EA34E445B514F1F6C997A8DB996CAAEE3A69EE625C91853B9D68024D853CF147A6E6BF1A4795451249B9E4CA5A3751BEFDC8E1793CA2861E34FCC6B9F8566897CA9F5AED97F60FA50923BDCA0A570FE2AC4C9D9A651B9FB7776371BD3AA3EAEBAFA8A38788ECD6FE452E16306E5AE29E62DE14D052F02E20D1F682136FEFE9BD302A72B6879E178370F970CA81487B0F17C48F4DADFE5710C2BA390775D0FCBBA401BB0AF07EE1F5A319B5C548731D36AF66E34476C532E62B602FEA7AFF005A50C5BE6BB6D5ED7080CC9227988D7E3E9586C0BCE331D05370A005D5B5AC171AEC90418AF091B1E84563F1D1CF8C695366FF0005AB130766732EC7BD86F046D27CAAE6B807168B02AE92FEAB7CAD53F1BC3019CBDCFC2833F13C419A4F28FF00AD4B6B694580DEA444986561714FC2A33E52453E0F247949B8A6194907BAFE18517E7CF0D8379CFA0F5A862585422D30B1AD0520B0D79620D909352E14C84BC66F7A65286CC2DDCC568557D0561F0B24E7C234F5A8387C716ADA9AB5B99B2EC285EDAF2750E0A9A9E37C2CA452BA4EB6715340D11D76E428C071188C9D2911635CAA34F738BC3ACE963B8A40639321A5716B30B8E51AE670B58440333F527DC13D2AF47515361927B31D0D4913466CDCA30C5C64DEB0CAC175A26DDEBD1366157E43734543687970CC383E33D7EDC9F6A1CAF57ABF26B11AD48E249028DA9E219C2AD5AC4D5F9605408C7CB93EC6877C69A8ACCD7CD7D79FFFC4002E110002010302040503040300000000000001020300041121311012204105223251811330610614A1F02391C1FFDA0008010301013F00EB3B559AA88F2A7535A5647B566813524EB1FA8D3DC17D947CD3C3247B8C8A041EB5668CF325238750EBDEB7E13CE53C89BD63B9DF81914024ED52B2BBE536FB168D82C9F3C6EA3E53F507CF1BB3A2A7BFD9B55CB17F8A670832D4F72EDE8D053176F5371BC182ADD04814B148FB0C50B53DDA85A2FB9A365ECD4A81005153BF3BE3B0E9650C30C29AD31E83FEE8C128ED9AFA721D31515BAC63277A6F17B20FF4CCA33FDEFB50C30C8A0280AB8F16BF8AE1A4E60533A2FE33EFEF48EAEA255F4B6A3E7A4DDA7615FBB5F6349728DA6683A8D0D78FB3CAAB6A8DCA18124FE0634FE75A6B28D63F2EFEF5FA4DE6681D24F483A7FDA9EF121381A9A5F12D7CCBA55F7833BC867B3F306DC7706BC3EC1E1B25824DC7F1939AD54F2B6FD5127D4900A118049AFD41E152DF9478775CFCE6A0F04BD7C465703F34B1A786DB8863DCFF00734C083AD04276A46784E41C1A5F1271B8CD49389FCD8C11435E9B25C966E33DD2423DCD4B2B4ADCCD564904CBCB268C28086DD73A0AB997EB4A5C708572401455A3D185039DBA2C47F8F353DC2423CDBD4D7D249A0D07428E6DCD1C674E0AECA722A1916E2306A7B4C6A9BD03D8EFC6398416C1BBD3B973CCDBFD9B59DA17C8DAB21D79854F6E24D46FC09C0CD5C31C2A7B0FB0077E0A706A19DE1381A8A8E5590647038C6B5211A0EF4064E051D3A95720D6382EAA281236E12363845EAA61AF1C56382120E94A9CA849DE94F9799AB3A0C7190F08877A7DFAF359D318E3FFD9, '', '2021-01-13 17:15:36', '', '2021-03-12 20:30:44', b'1', 0); COMMIT; -- ---------------------------- --- Table structure for inf_job +-- Table structure for infra_job -- ---------------------------- -DROP TABLE IF EXISTS `inf_job`; -CREATE TABLE `inf_job` ( +DROP TABLE IF EXISTS `infra_job`; +CREATE TABLE `infra_job` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务编号', - `name` varchar(32) NOT NULL COMMENT '任务名称', + `name` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', `status` tinyint NOT NULL COMMENT '任务状态', - `handler_name` varchar(64) NOT NULL COMMENT '处理器的名字', - `handler_param` varchar(255) DEFAULT NULL COMMENT '处理器的参数', - `cron_expression` varchar(32) NOT NULL COMMENT 'CRON 表达式', + `handler_name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '处理器的名字', + `handler_param` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '处理器的参数', + `cron_expression` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'CRON 表达式', `retry_count` int NOT NULL DEFAULT '0' COMMENT '重试次数', `retry_interval` int NOT NULL DEFAULT '0' COMMENT '重试间隔', `monitor_timeout` int NOT NULL DEFAULT '0' COMMENT '监控超时时间', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='定时任务表'; -- ---------------------------- --- Records of inf_job +-- Records of infra_job -- ---------------------------- BEGIN; -INSERT INTO `inf_job` VALUES (2, '用户 Session 超时 Job', 3, 'sysUserSessionTimeoutJob', 'aoteman', '0/5 * * * * ? *', 0, 0, 10, '', '2021-02-07 10:15:09', '', '2021-02-07 12:57:44', b'1'); -INSERT INTO `inf_job` VALUES (3, '用户 Session 超时 Job', 1, 'sysUserSessionTimeoutJob', NULL, '0 * * * * ? *', 3, 2000, 0, '', '2021-02-07 13:07:32', '', '2021-02-08 04:44:58', b'0'); -INSERT INTO `inf_job` VALUES (4, 'payNotifyJob', 1, '支付通知 Job', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:33:35', '1', '2021-10-27 00:34:14', b'1'); -INSERT INTO `inf_job` VALUES (5, '支付通知 Job', 1, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', '2021-10-27 08:34:42', b'0'); +INSERT INTO `infra_job` VALUES (2, '用户 Session 超时 Job', 3, 'sysUserSessionTimeoutJob', 'aoteman', '0/5 * * * * ? *', 0, 0, 10, '', '2021-02-07 10:15:09', '', '2021-02-07 12:57:44', b'1'); +INSERT INTO `infra_job` VALUES (3, '用户 Session 超时 Job', 1, 'sysUserSessionTimeoutJob', NULL, '0 * * * * ? *', 3, 2000, 0, '', '2021-02-07 13:07:32', '1', '2022-02-02 01:00:11', b'0'); +INSERT INTO `infra_job` VALUES (4, 'payNotifyJob', 1, '支付通知 Job', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:33:35', '1', '2021-10-27 00:34:14', b'1'); +INSERT INTO `infra_job` VALUES (5, '支付通知 Job', 1, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', '2021-10-27 08:34:42', b'0'); COMMIT; -- ---------------------------- --- Table structure for inf_job_log +-- Table structure for infra_job_log -- ---------------------------- -DROP TABLE IF EXISTS `inf_job_log`; -CREATE TABLE `inf_job_log` ( +DROP TABLE IF EXISTS `infra_job_log`; +CREATE TABLE `infra_job_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志编号', `job_id` bigint NOT NULL COMMENT '任务编号', `handler_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '处理器的名字', @@ -892,16 +1315,16 @@ CREATE TABLE `inf_job_log` ( ) ENGINE=InnoDB AUTO_INCREMENT=25274 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='定时任务日志表'; -- ---------------------------- --- Records of inf_job_log +-- Records of infra_job_log -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- --- Table structure for mbr_user +-- Table structure for member_user -- ---------------------------- -DROP TABLE IF EXISTS `mbr_user`; -CREATE TABLE `mbr_user` ( +DROP TABLE IF EXISTS `member_user`; +CREATE TABLE `member_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', `nickname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称', `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '头像', @@ -922,11 +1345,11 @@ CREATE TABLE `mbr_user` ( ) ENGINE=InnoDB AUTO_INCREMENT=247 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户'; -- ---------------------------- --- Records of mbr_user +-- Records of member_user -- ---------------------------- BEGIN; -INSERT INTO `mbr_user` VALUES (245, '芋艿', 'http://pic.616pic.com/ys_b_img/00/06/20/novPzrqvE3.jpg', 0, '15601691300', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '127.0.0.1', '127.0.0.1', '2021-11-28 20:47:51', '', '2021-10-10 08:51:38', '245', '2021-11-28 20:47:51', b'0', 0); -INSERT INTO `mbr_user` VALUES (246, '', '', 0, '15601691301', '$2a$10$KLvmwoU.bvjU2u/MeWa1iOX2GDRJ2P9YqaCad10bYQCiyOaPexGwW', '127.0.0.1', '127.0.0.1', '2021-10-10 22:36:27', NULL, '2021-10-10 22:36:27', NULL, '2021-10-10 22:36:27', b'0', 0); +INSERT INTO `member_user` VALUES (245, '芋艿', 'http://pic.616pic.com/ys_b_img/00/06/20/novPzrqvE3.jpg', 0, '15601691300', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '127.0.0.1', '127.0.0.1', '2022-01-29 13:58:04', '', '2021-10-10 08:51:38', NULL, '2022-01-29 13:58:04', b'0', 1); +INSERT INTO `member_user` VALUES (246, '', '', 0, '15601691301', '$2a$10$KLvmwoU.bvjU2u/MeWa1iOX2GDRJ2P9YqaCad10bYQCiyOaPexGwW', '127.0.0.1', '127.0.0.1', '2021-10-10 22:36:27', NULL, '2021-10-10 22:36:27', NULL, '2021-10-10 22:36:27', b'0', 0); COMMIT; -- ---------------------------- @@ -937,13 +1360,13 @@ CREATE TABLE `pay_app` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '应用编号', `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', `status` tinyint NOT NULL COMMENT '开启状态', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - `pay_notify_url` varchar(1024) NOT NULL COMMENT '支付结果的回调地址', + `remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `pay_notify_url` varchar(1024) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '支付结果的回调地址', `refund_notify_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退款结果的回调地址', `merchant_id` bigint NOT NULL COMMENT '商户编号', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -964,18 +1387,18 @@ CREATE TABLE `pay_channel` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '商户编号', `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '渠道编码', `status` tinyint NOT NULL COMMENT '开启状态', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', + `remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', `fee_rate` double NOT NULL DEFAULT '0' COMMENT '渠道费率,单位:百分比', `merchant_id` bigint NOT NULL COMMENT '商户编号', `app_id` bigint NOT NULL COMMENT '应用编号', `config` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '支付渠道配置', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付渠道\n'; +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付渠道\n'; -- ---------------------------- -- Records of pay_channel @@ -988,6 +1411,8 @@ INSERT INTO `pay_channel` VALUES (12, 'wx_pub', 0, NULL, 1, 1, 6, '{\"@class\":\ INSERT INTO `pay_channel` VALUES (13, 'wx_pub', 0, NULL, 1, 1, 6, '{\"@class\":\"cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig\",\"appId\":\"wx041349c6f39b268b\",\"mchId\":\"1545083881\",\"apiVersion\":\"v2\",\"mchKey\":\"0alL64UDQdlCwiKZ73ib7ypaIjMns06p\",\"privateKeyContent\":\"-----BEGIN PRIVATE KEY-----\\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\\nfyjG3eLWBrtrsI9YX6zeAA==\\n-----END PRIVATE KEY-----\\n\",\"privateCertContent\":\"-----BEGIN CERTIFICATE-----\\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\\n-----END CERTIFICATE-----\\n\",\"apiV3Key\":\"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase\"}', NULL, '2021-12-14 22:09:39', NULL, '2021-12-14 22:09:39', b'0'); INSERT INTO `pay_channel` VALUES (14, 'wx_pub', 0, NULL, 1, 1, 6, '{\"@class\":\"cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig\",\"appId\":\"wx041349c6f39b268b\",\"mchId\":\"1545083881\",\"apiVersion\":\"v2\",\"mchKey\":\"0alL64UDQdlCwiKZ73ib7ypaIjMns06p\",\"privateKeyContent\":\"-----BEGIN PRIVATE KEY-----\\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\\nfyjG3eLWBrtrsI9YX6zeAA==\\n-----END PRIVATE KEY-----\\n\",\"privateCertContent\":\"-----BEGIN CERTIFICATE-----\\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\\n-----END CERTIFICATE-----\\n\",\"apiV3Key\":\"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase\"}', NULL, '2021-12-14 22:38:49', NULL, '2021-12-14 22:38:49', b'0'); INSERT INTO `pay_channel` VALUES (15, 'wx_pub', 0, NULL, 1, 1, 6, '{\"@class\":\"cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig\",\"appId\":\"wx041349c6f39b268b\",\"mchId\":\"1545083881\",\"apiVersion\":\"v2\",\"mchKey\":\"0alL64UDQdlCwiKZ73ib7ypaIjMns06p\",\"privateKeyContent\":\"-----BEGIN PRIVATE KEY-----\\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\\nfyjG3eLWBrtrsI9YX6zeAA==\\n-----END PRIVATE KEY-----\\n\",\"privateCertContent\":\"-----BEGIN CERTIFICATE-----\\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\\n-----END CERTIFICATE-----\\n\",\"apiV3Key\":\"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase\"}', NULL, '2021-12-15 09:32:26', NULL, '2021-12-15 09:32:26', b'0'); +INSERT INTO `pay_channel` VALUES (16, 'wx_pub', 0, NULL, 1, 1, 6, '{\"@class\":\"cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig\",\"appId\":\"wx041349c6f39b268b\",\"mchId\":\"1545083881\",\"apiVersion\":\"v2\",\"mchKey\":\"0alL64UDQdlCwiKZ73ib7ypaIjMns06p\",\"privateKeyContent\":\"-----BEGIN PRIVATE KEY-----\\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\\nfyjG3eLWBrtrsI9YX6zeAA==\\n-----END PRIVATE KEY-----\\n\",\"privateCertContent\":\"-----BEGIN CERTIFICATE-----\\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\\n-----END CERTIFICATE-----\\n\",\"apiV3Key\":\"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase\"}', NULL, '2022-01-31 22:13:25', NULL, '2022-01-31 22:13:25', b'0'); +INSERT INTO `pay_channel` VALUES (17, 'alipay_qr', 0, NULL, 1, 1, 6, '{\"@class\":\"cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig\",\"serverUrl\":\"https://openapi.alipaydev.com/gateway.do\",\"appId\":\"2021000118634035\",\"signType\":\"RSA2\",\"mode\":null,\"privateKey\":\"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=\",\"alipayPublicKey\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB\",\"appCertContent\":null,\"alipayPublicCertContent\":null,\"rootCertContent\":null}', NULL, '2022-01-31 22:13:25', NULL, '2022-01-31 22:13:25', b'0'); COMMIT; -- ---------------------------- @@ -1000,10 +1425,10 @@ CREATE TABLE `pay_merchant` ( `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户全称', `short_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户简称', `status` tinyint NOT NULL COMMENT '开启状态', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -1024,11 +1449,11 @@ CREATE TABLE `pay_notify_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志编号', `task_id` bigint NOT NULL COMMENT '通知任务编号', `notify_times` tinyint NOT NULL COMMENT '第几次被通知', - `response` varchar(2048) NOT NULL COMMENT '请求参数', + `response` varchar(2048) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求参数', `status` tinyint NOT NULL COMMENT '通知状态', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -1057,9 +1482,9 @@ CREATE TABLE `pay_notify_task` ( `notify_times` tinyint NOT NULL COMMENT '当前通知次数', `max_notify_times` tinyint NOT NULL COMMENT '最大可通知次数', `notify_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异步通知地址', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -1097,7 +1522,7 @@ CREATE TABLE `pay_order` ( `app_id` bigint NOT NULL COMMENT '应用编号', `channel_id` bigint DEFAULT NULL COMMENT '渠道编号', `channel_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '渠道编码', - `merchant_order_id` varchar(64) NOT NULL COMMENT '商户订单编号', + `merchant_order_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户订单编号', `subject` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品标题', `body` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品描述', `notify_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异步通知地址', @@ -1115,10 +1540,10 @@ CREATE TABLE `pay_order` ( `refund_times` tinyint NOT NULL COMMENT '退款次数', `refund_amount` bigint NOT NULL COMMENT '退款总金额,单位:分', `channel_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '渠道用户编号', - `channel_order_no` varchar(64) DEFAULT NULL COMMENT '渠道订单号', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `channel_order_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '渠道订单号', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -1248,7 +1673,7 @@ COMMIT; DROP TABLE IF EXISTS `pay_order_extension`; CREATE TABLE `pay_order_extension` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '支付订单编号', - `no` varchar(64) NOT NULL COMMENT '支付订单号', + `no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '支付订单号', `order_id` bigint NOT NULL COMMENT '支付订单编号', `channel_id` bigint NOT NULL COMMENT '渠道编号', `channel_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '渠道编码', @@ -1256,9 +1681,9 @@ CREATE TABLE `pay_order_extension` ( `status` tinyint NOT NULL COMMENT '支付状态', `channel_extras` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '支付渠道的额外参数', `channel_notify_data` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '支付渠道异步通知的内容', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -1373,28 +1798,28 @@ CREATE TABLE `pay_refund` ( `channel_id` bigint NOT NULL COMMENT '渠道编号', `channel_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '渠道编码', `order_id` bigint NOT NULL COMMENT '支付订单编号 pay_order 表id', - `trade_no` varchar(64) NOT NULL COMMENT '交易订单号 pay_extension 表no 字段', - `merchant_order_id` varchar(64) NOT NULL COMMENT '商户订单编号(商户系统生成)', - `merchant_refund_no` varchar(64) NOT NULL COMMENT '商户退款订单号(商户系统生成)', + `trade_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '交易订单号 pay_extension 表no 字段', + `merchant_order_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户订单编号(商户系统生成)', + `merchant_refund_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户退款订单号(商户系统生成)', `notify_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异步通知商户地址', `notify_status` tinyint NOT NULL COMMENT '通知商户退款结果的回调状态', `status` tinyint NOT NULL COMMENT '退款状态', `type` tinyint NOT NULL COMMENT '退款类型(部分退款,全部退款)', `pay_amount` bigint NOT NULL COMMENT '支付金额,单位分', `refund_amount` bigint NOT NULL COMMENT '退款金额,单位分', - `reason` varchar(256) NOT NULL COMMENT '退款原因', + `reason` varchar(256) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退款原因', `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户 IP', - `channel_order_no` varchar(64) NOT NULL COMMENT '渠道订单号,pay_order 中的channel_order_no 对应', - `channel_refund_no` varchar(64) DEFAULT NULL COMMENT '渠道退款单号,渠道返回', - `channel_error_code` varchar(128) DEFAULT NULL COMMENT '渠道调用报错时,错误码', - `channel_error_msg` varchar(256) DEFAULT NULL COMMENT '渠道调用报错时,错误信息', + `channel_order_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '渠道订单号,pay_order 中的channel_order_no 对应', + `channel_refund_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '渠道退款单号,渠道返回', + `channel_error_code` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '渠道调用报错时,错误码', + `channel_error_msg` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '渠道调用报错时,错误信息', `channel_extras` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '支付渠道的额外参数', `expire_time` datetime DEFAULT NULL COMMENT '退款失效时间', `success_time` datetime DEFAULT NULL COMMENT '退款成功时间', `notify_time` datetime DEFAULT NULL COMMENT '退款通知时间', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -1407,10 +1832,10 @@ BEGIN; COMMIT; -- ---------------------------- --- Table structure for sys_dept +-- Table structure for system_dept -- ---------------------------- -DROP TABLE IF EXISTS `sys_dept`; -CREATE TABLE `sys_dept` ( +DROP TABLE IF EXISTS `system_dept`; +CREATE TABLE `system_dept` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门id', `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '部门名称', `parent_id` bigint NOT NULL DEFAULT '0' COMMENT '父部门id', @@ -1429,26 +1854,26 @@ CREATE TABLE `sys_dept` ( ) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门表'; -- ---------------------------- --- Records of sys_dept +-- Records of system_dept -- ---------------------------- BEGIN; -INSERT INTO `sys_dept` VALUES (100, '芋道源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-14 01:04:05', b'0', 1); -INSERT INTO `sys_dept` VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:28', b'0', 1); -INSERT INTO `sys_dept` VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:40', b'0', 1); -INSERT INTO `sys_dept` VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-14 01:04:14', b'0', 1); -INSERT INTO `sys_dept` VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:38', b'0', 1); -INSERT INTO `sys_dept` VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:37', b'0', 1); -INSERT INTO `sys_dept` VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:22', b'0', 1); -INSERT INTO `sys_dept` VALUES (107, '运维部门', 101, 5, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:33', b'0', 1); -INSERT INTO `sys_dept` VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:31', b'0', 1); -INSERT INTO `sys_dept` VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:29', b'0', 1); +INSERT INTO `system_dept` VALUES (100, '芋道源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-14 01:04:05', b'0', 1); +INSERT INTO `system_dept` VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:28', b'0', 1); +INSERT INTO `system_dept` VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:40', b'0', 1); +INSERT INTO `system_dept` VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-14 01:04:14', b'0', 1); +INSERT INTO `system_dept` VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:38', b'0', 1); +INSERT INTO `system_dept` VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:37', b'0', 1); +INSERT INTO `system_dept` VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:22', b'0', 1); +INSERT INTO `system_dept` VALUES (107, '运维部门', 101, 5, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:33', b'0', 1); +INSERT INTO `system_dept` VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:31', b'0', 1); +INSERT INTO `system_dept` VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:29', b'0', 1); COMMIT; -- ---------------------------- --- Table structure for sys_dict_data +-- Table structure for system_dict_data -- ---------------------------- -DROP TABLE IF EXISTS `sys_dict_data`; -CREATE TABLE `sys_dict_data` ( +DROP TABLE IF EXISTS `system_dict_data`; +CREATE TABLE `system_dict_data` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码', `sort` int NOT NULL DEFAULT '0' COMMENT '字典排序', `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典标签', @@ -1465,148 +1890,141 @@ CREATE TABLE `sys_dict_data` ( ) ENGINE=InnoDB AUTO_INCREMENT=1145 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典数据表'; -- ---------------------------- --- Records of sys_dict_data +-- Records of system_dict_data -- ---------------------------- BEGIN; -INSERT INTO `sys_dict_data` VALUES (1, 1, '男', '1', 'sys_user_sex', 0, '性别男', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:53', b'0'); -INSERT INTO `sys_dict_data` VALUES (2, 2, '女', '2', 'sys_user_sex', 0, '性别女', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:55', b'0'); -INSERT INTO `sys_dict_data` VALUES (8, 1, '正常', '0', 'sys_job_status', 0, '正常状态', 'admin', '2021-01-05 17:03:48', '', '2021-02-07 07:43:57', b'1'); -INSERT INTO `sys_dict_data` VALUES (9, 2, '暂停', '1', 'sys_job_status', 0, '停用状态', 'admin', '2021-01-05 17:03:48', '', '2021-02-07 07:43:59', b'1'); -INSERT INTO `sys_dict_data` VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', 0, '默认分组', 'admin', '2021-01-05 17:03:48', '', '2021-02-07 07:43:44', b'1'); -INSERT INTO `sys_dict_data` VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', 0, '系统分组', 'admin', '2021-01-05 17:03:48', '', '2021-02-07 07:43:45', b'1'); -INSERT INTO `sys_dict_data` VALUES (12, 1, '系统内置', '1', 'sys_config_type', 0, '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:59', b'0'); -INSERT INTO `sys_dict_data` VALUES (13, 2, '自定义', '2', 'sys_config_type', 0, '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:51', b'0'); -INSERT INTO `sys_dict_data` VALUES (14, 1, '通知', '1', 'sys_notice_type', 0, '通知', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `sys_dict_data` VALUES (15, 2, '公告', '2', 'sys_notice_type', 0, '公告', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `sys_dict_data` VALUES (16, 0, '其它', '0', 'sys_operate_type', 0, '其它操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:12', b'0'); -INSERT INTO `sys_dict_data` VALUES (17, 1, '查询', '1', 'sys_operate_type', 0, '查询操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:10', b'0'); -INSERT INTO `sys_dict_data` VALUES (18, 2, '新增', '2', 'sys_operate_type', 0, '新增操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:17', b'0'); -INSERT INTO `sys_dict_data` VALUES (19, 3, '修改', '3', 'sys_operate_type', 0, '修改操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:20', b'0'); -INSERT INTO `sys_dict_data` VALUES (20, 4, '删除', '4', 'sys_operate_type', 0, '删除操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:24', b'0'); -INSERT INTO `sys_dict_data` VALUES (22, 5, '导出', '5', 'sys_operate_type', 0, '导出操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:20', b'0'); -INSERT INTO `sys_dict_data` VALUES (23, 6, '导入', '6', 'sys_operate_type', 0, '导入操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:24', b'0'); -INSERT INTO `sys_dict_data` VALUES (27, 1, '开启', '0', 'sys_common_status', 0, '开启状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 02:57:12', b'0'); -INSERT INTO `sys_dict_data` VALUES (28, 2, '关闭', '1', 'sys_common_status', 0, '关闭状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:32', b'0'); -INSERT INTO `sys_dict_data` VALUES (29, 1, '目录', '1', 'sys_menu_type', 0, '目录', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:30', b'0'); -INSERT INTO `sys_dict_data` VALUES (30, 2, '菜单', '2', 'sys_menu_type', 0, '菜单', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:35', b'0'); -INSERT INTO `sys_dict_data` VALUES (31, 3, '按钮', '3', 'sys_menu_type', 0, '按钮', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:38', b'0'); -INSERT INTO `sys_dict_data` VALUES (32, 1, '内置', '1', 'sys_role_type', 0, '内置角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:22', b'0'); -INSERT INTO `sys_dict_data` VALUES (33, 2, '自定义', '2', 'sys_role_type', 0, '自定义角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:26', b'0'); -INSERT INTO `sys_dict_data` VALUES (34, 1, '全部数据权限', '1', 'sys_data_scope', 0, '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:02', b'0'); -INSERT INTO `sys_dict_data` VALUES (35, 2, '指定部门数据权限', '2', 'sys_data_scope', 0, '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:20', b'0'); -INSERT INTO `sys_dict_data` VALUES (36, 3, '本部门数据权限', '3', 'sys_data_scope', 0, '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:29', b'0'); -INSERT INTO `sys_dict_data` VALUES (37, 4, '本部门及以下数据权限', '4', 'sys_data_scope', 0, '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:32', b'0'); -INSERT INTO `sys_dict_data` VALUES (38, 5, '仅本人数据权限', '5', 'sys_data_scope', 0, '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:38', b'0'); -INSERT INTO `sys_dict_data` VALUES (39, 0, '成功', '0', 'sys_login_result', 0, '登陆结果 - 成功', '', '2021-01-18 06:17:36', '', '2021-01-18 06:17:36', b'0'); -INSERT INTO `sys_dict_data` VALUES (40, 10, '账号或密码不正确', '10', 'sys_login_result', 0, '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '', '2021-01-18 06:17:54', b'0'); -INSERT INTO `sys_dict_data` VALUES (41, 20, '用户被禁用', '20', 'sys_login_result', 0, '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:02', b'0'); -INSERT INTO `sys_dict_data` VALUES (42, 30, '验证码不存在', '30', 'sys_login_result', 0, '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:24', b'0'); -INSERT INTO `sys_dict_data` VALUES (43, 31, '验证码不正确', '31', 'sys_login_result', 0, '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:33', b'0'); -INSERT INTO `sys_dict_data` VALUES (44, 100, '未知异常', '100', 'sys_login_result', 0, '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:57', b'0'); -INSERT INTO `sys_dict_data` VALUES (45, 1, '是', 'true', 'sys_boolean_string', 0, 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '', '2021-01-19 03:21:08', b'0'); -INSERT INTO `sys_dict_data` VALUES (46, 1, '否', 'false', 'sys_boolean_string', 0, 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '', '2021-01-19 03:21:39', b'0'); -INSERT INTO `sys_dict_data` VALUES (47, 1, '永不超时', '1', 'inf_redis_timeout_type', 0, 'Redis 未设置超时的情况', '', '2021-01-26 00:53:17', '', '2021-01-26 00:53:17', b'0'); -INSERT INTO `sys_dict_data` VALUES (48, 1, '动态超时', '2', 'inf_redis_timeout_type', 0, '程序里动态传入超时时间,无法固定', '', '2021-01-26 00:55:00', '', '2021-01-26 00:55:00', b'0'); -INSERT INTO `sys_dict_data` VALUES (49, 3, '固定超时', '3', 'inf_redis_timeout_type', 0, 'Redis 设置了过期时间', '', '2021-01-26 00:55:26', '', '2021-01-26 00:55:26', b'0'); -INSERT INTO `sys_dict_data` VALUES (50, 1, '单表(增删改查)', '1', 'tool_codegen_template_type', 0, NULL, '', '2021-02-05 07:09:06', '', '2021-02-05 07:21:52', b'0'); -INSERT INTO `sys_dict_data` VALUES (51, 2, '树表(增删改查)', '2', 'tool_codegen_template_type', 0, NULL, '', '2021-02-05 07:14:46', '', '2021-02-05 07:21:49', b'0'); -INSERT INTO `sys_dict_data` VALUES (52, 3, '主子表(增删改查)', '3', 'tool_codegen_template_type', 0, NULL, '', '2021-02-05 07:21:45', '', '2021-02-06 18:54:26', b'1'); -INSERT INTO `sys_dict_data` VALUES (53, 0, '初始化中', '0', 'inf_job_status', 0, NULL, '', '2021-02-07 07:46:49', '', '2021-02-07 07:46:49', b'0'); -INSERT INTO `sys_dict_data` VALUES (54, 1, '开启', '1', 'inf_job_status', 0, NULL, '', '2021-02-07 07:46:57', '', '2021-02-07 11:54:09', b'0'); -INSERT INTO `sys_dict_data` VALUES (56, 3, '暂停', '2', 'inf_job_status', 0, NULL, '', '2021-02-07 07:47:16', '', '2021-02-08 04:54:11', b'0'); -INSERT INTO `sys_dict_data` VALUES (57, 0, '运行中', '0', 'inf_job_log_status', 0, 'RUNNING', '', '2021-02-08 10:04:24', '', '2021-02-08 10:04:24', b'0'); -INSERT INTO `sys_dict_data` VALUES (58, 1, '成功', '1', 'inf_job_log_status', 0, NULL, '', '2021-02-08 10:06:57', '', '2021-02-08 10:06:57', b'0'); -INSERT INTO `sys_dict_data` VALUES (59, 2, '失败', '2', 'inf_job_log_status', 0, '失败', '', '2021-02-08 10:07:38', '', '2021-02-08 10:07:38', b'0'); -INSERT INTO `sys_dict_data` VALUES (60, 1, '会员', '1', 'user_type', 0, NULL, '', '2021-02-26 00:16:27', '', '2021-02-26 00:16:27', b'0'); -INSERT INTO `sys_dict_data` VALUES (61, 2, '管理员', '2', 'user_type', 0, NULL, '', '2021-02-26 00:16:34', '', '2021-02-26 00:16:34', b'0'); -INSERT INTO `sys_dict_data` VALUES (62, 0, '未处理', '0', 'inf_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:19', '', '2021-02-26 08:11:23', b'0'); -INSERT INTO `sys_dict_data` VALUES (63, 1, '已处理', '1', 'inf_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:26', '', '2021-02-26 08:11:29', b'0'); -INSERT INTO `sys_dict_data` VALUES (64, 2, '已忽略', '2', 'inf_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:34', '', '2021-02-26 08:11:34', b'0'); -INSERT INTO `sys_dict_data` VALUES (65, 1, '云片', 'YUN_PIAN', 'sys_sms_channel_code', 0, NULL, '1', '2021-04-05 01:05:14', '1', '2021-04-13 00:20:13', b'0'); -INSERT INTO `sys_dict_data` VALUES (66, 2, '阿里云', 'ALIYUN', 'sys_sms_channel_code', 0, NULL, '1', '2021-04-05 01:05:26', '1', '2021-04-13 00:20:16', b'0'); -INSERT INTO `sys_dict_data` VALUES (67, 1, '验证码', '1', 'sys_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:57', '1', '2021-04-05 21:50:57', b'0'); -INSERT INTO `sys_dict_data` VALUES (68, 2, '通知', '2', 'sys_sms_template_type', 0, NULL, '1', '2021-04-05 21:51:08', '1', '2021-04-05 21:51:08', b'0'); -INSERT INTO `sys_dict_data` VALUES (69, 0, '营销', '3', 'sys_sms_template_type', 0, NULL, '1', '2021-04-05 21:51:15', '1', '2021-04-05 21:51:15', b'0'); -INSERT INTO `sys_dict_data` VALUES (70, 0, '初始化', '0', 'sys_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:33', '1', '2021-04-11 09:30:18', b'0'); -INSERT INTO `sys_dict_data` VALUES (71, 1, '发送成功', '10', 'sys_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:43', '1', '2021-04-11 09:30:20', b'0'); -INSERT INTO `sys_dict_data` VALUES (72, 2, '发送失败', '20', 'sys_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:49', '1', '2021-04-11 09:30:22', b'0'); -INSERT INTO `sys_dict_data` VALUES (73, 3, '不发送', '30', 'sys_sms_send_status', 0, NULL, '1', '2021-04-11 20:19:44', '1', '2021-04-11 09:30:23', b'0'); -INSERT INTO `sys_dict_data` VALUES (74, 0, '等待结果', '0', 'sys_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:43', '1', '2021-04-17 23:05:19', b'0'); -INSERT INTO `sys_dict_data` VALUES (75, 1, '接收成功', '10', 'sys_sms_receive_status', 0, NULL, '1', '2021-04-11 20:29:25', '1', '2021-04-11 20:29:35', b'0'); -INSERT INTO `sys_dict_data` VALUES (76, 2, '接收失败', '20', 'sys_sms_receive_status', 0, NULL, '1', '2021-04-11 20:29:31', '1', '2021-04-11 20:29:39', b'0'); -INSERT INTO `sys_dict_data` VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'sys_sms_channel_code', 0, NULL, '1', '2021-04-13 00:20:37', '1', '2021-04-13 00:20:37', b'0'); -INSERT INTO `sys_dict_data` VALUES (78, 1, '自动生成', '1', 'sys_error_code_type', 0, NULL, '1', '2021-04-21 00:06:48', '1', '2021-04-13 22:06:44', b'0'); -INSERT INTO `sys_dict_data` VALUES (79, 2, '手动编辑', '2', 'sys_error_code_type', 0, NULL, '1', '2021-04-21 00:07:14', '1', '2021-04-13 22:06:49', b'0'); -INSERT INTO `sys_dict_data` VALUES (80, 100, '账号登录', '100', 'sys_login_type', 0, '账号登录', '1', '2021-10-06 00:52:02', '1', '2021-10-06 00:52:43', b'0'); -INSERT INTO `sys_dict_data` VALUES (81, 101, '社交登录', '101', 'sys_login_type', 0, '社交登录', '1', '2021-10-06 00:52:17', '1', '2021-10-06 00:52:17', b'0'); -INSERT INTO `sys_dict_data` VALUES (82, 102, 'Mock 登录', '102', 'sys_login_type', 0, 'Mock 登录', '1', '2021-10-06 00:52:32', '1', '2021-10-06 00:52:39', b'0'); -INSERT INTO `sys_dict_data` VALUES (83, 200, '主动登出', '200', 'sys_login_type', 0, '主动登出', '1', '2021-10-06 00:52:58', '1', '2021-10-06 00:52:58', b'0'); -INSERT INTO `sys_dict_data` VALUES (84, 201, '超时登出', '201', 'sys_login_type', 0, '超时登出', '1', '2021-10-06 00:53:17', '1', '2021-10-06 00:53:17', b'0'); -INSERT INTO `sys_dict_data` VALUES (85, 202, '强制登出', '202', 'sys_login_type', 0, '强制退出', '1', '2021-10-06 00:53:41', '1', '2021-10-06 00:53:41', b'0'); -INSERT INTO `sys_dict_data` VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:35:28', '1', '2022-01-22 10:42:08', b'0'); -INSERT INTO `sys_dict_data` VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:36:11', '1', '2022-01-22 10:42:11', b'0'); -INSERT INTO `sys_dict_data` VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:36:38', '1', '2022-01-22 10:42:16', b'0'); -INSERT INTO `sys_dict_data` VALUES (89, 0, '处理中', '1', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:46:46', '1', '2022-01-22 10:40:38', b'1'); -INSERT INTO `sys_dict_data` VALUES (90, 1, '流程结束', '2', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:47:03', '1', '2022-01-22 10:40:37', b'1'); -INSERT INTO `sys_dict_data` VALUES (91, 2, '完成', '3', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:47:25', '1', '2021-10-12 14:13:06', b'1'); -INSERT INTO `sys_dict_data` VALUES (98, 1, 'v2', 'v2', 'pay_channel_wechat_version', 0, 'v2版本', '1', '2021-11-08 17:00:58', '1', '2021-11-08 17:00:58', b'0'); -INSERT INTO `sys_dict_data` VALUES (99, 2, 'v3', 'v3', 'pay_channel_wechat_version', 0, 'v3版本', '1', '2021-11-08 17:01:07', '1', '2021-11-08 17:01:07', b'0'); -INSERT INTO `sys_dict_data` VALUES (108, 1, 'RSA2', 'RSA2', 'pay_channel_alipay_sign_type', 0, 'RSA2', '1', '2021-11-18 15:39:29', '1', '2021-11-18 15:39:29', b'0'); -INSERT INTO `sys_dict_data` VALUES (109, 1, '公钥模式', '1', 'pay_channel_alipay_mode', 0, '公钥模式:privateKey + alipayPublicKey', '1', '2021-11-18 15:45:23', '1', '2021-11-18 15:45:23', b'0'); -INSERT INTO `sys_dict_data` VALUES (110, 2, '证书模式', '2', 'pay_channel_alipay_mode', 0, '证书模式:appCertContent + alipayPublicCertContent + rootCertContent', '1', '2021-11-18 15:45:40', '1', '2021-11-18 15:45:40', b'0'); -INSERT INTO `sys_dict_data` VALUES (111, 1, '线上', 'https://openapi.alipay.com/gateway.do', 'pay_channel_alipay_server_type', 0, '网关地址 - 线上', '1', '2021-11-18 16:59:32', '1', '2021-11-21 17:37:29', b'0'); -INSERT INTO `sys_dict_data` VALUES (112, 2, '沙箱', 'https://openapi.alipaydev.com/gateway.do', 'pay_channel_alipay_server_type', 0, '网关地址 - 沙箱', '1', '2021-11-18 16:59:48', '1', '2021-11-21 17:37:39', b'0'); -INSERT INTO `sys_dict_data` VALUES (113, 1, '微信 JSAPI 支付', 'wx_pub', 'pay_channel_code_type', 0, '微信 JSAPI(公众号) 支付', '1', '2021-12-03 10:40:24', '1', '2021-12-04 16:41:00', b'0'); -INSERT INTO `sys_dict_data` VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code_type', 0, '微信小程序支付', '1', '2021-12-03 10:41:06', '1', '2021-12-03 10:41:06', b'0'); -INSERT INTO `sys_dict_data` VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code_type', 0, '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2021-12-03 10:41:20', b'0'); -INSERT INTO `sys_dict_data` VALUES (116, 4, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code_type', 0, '支付宝 PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2021-12-03 10:42:09', b'0'); -INSERT INTO `sys_dict_data` VALUES (117, 5, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code_type', 0, '支付宝 Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2021-12-03 10:42:26', b'0'); -INSERT INTO `sys_dict_data` VALUES (118, 6, '支付宝App 支付', 'alipay_app', 'pay_channel_code_type', 0, '支付宝App 支付', '1', '2021-12-03 10:42:55', '1', '2021-12-03 10:42:55', b'0'); -INSERT INTO `sys_dict_data` VALUES (119, 7, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code_type', 0, '支付宝扫码支付', '1', '2021-12-03 10:43:10', '1', '2021-12-03 10:43:10', b'0'); -INSERT INTO `sys_dict_data` VALUES (120, 1, '通知成功', '10', 'pay_order_notify_status', 0, '通知成功', '1', '2021-12-03 11:02:41', '1', '2021-12-03 11:02:41', b'0'); -INSERT INTO `sys_dict_data` VALUES (121, 2, '通知失败', '20', 'pay_order_notify_status', 0, '通知失败', '1', '2021-12-03 11:02:59', '1', '2021-12-03 11:02:59', b'0'); -INSERT INTO `sys_dict_data` VALUES (122, 3, '未通知', '0', 'pay_order_notify_status', 0, '未通知', '1', '2021-12-03 11:03:10', '1', '2021-12-03 11:03:10', b'0'); -INSERT INTO `sys_dict_data` VALUES (123, 1, '支付成功', '10', 'pay_order_status', 0, '支付成功', '1', '2021-12-03 11:18:29', '1', '2021-12-03 11:28:32', b'0'); -INSERT INTO `sys_dict_data` VALUES (124, 2, '支付关闭', '20', 'pay_order_status', 0, '支付关闭', '1', '2021-12-03 11:18:42', '1', '2021-12-03 11:28:34', b'0'); -INSERT INTO `sys_dict_data` VALUES (125, 3, '未支付', '0', 'pay_order_status', 0, '未支付', '1', '2021-12-03 11:18:18', '1', '2021-12-03 11:28:36', b'0'); -INSERT INTO `sys_dict_data` VALUES (126, 1, '未退款', '0', 'pay_order_refund_status', 0, '未退款', '1', '2021-12-03 11:30:35', '1', '2021-12-03 11:34:05', b'0'); -INSERT INTO `sys_dict_data` VALUES (127, 2, '部分退款', '10', 'pay_order_refund_status', 0, '部分退款', '1', '2021-12-03 11:30:44', '1', '2021-12-03 11:34:10', b'0'); -INSERT INTO `sys_dict_data` VALUES (128, 3, '全部退款', '20', 'pay_order_refund_status', 0, '全部退款', '1', '2021-12-03 11:30:52', '1', '2021-12-03 11:34:14', b'0'); -INSERT INTO `sys_dict_data` VALUES (1117, 1, '退款订单生成', '0', 'pay_refund_order_status', 0, '退款订单生成', '1', '2021-12-10 16:44:44', '1', '2021-12-10 16:44:44', b'0'); -INSERT INTO `sys_dict_data` VALUES (1118, 2, '退款成功', '1', 'pay_refund_order_status', 0, '退款成功', '1', '2021-12-10 16:44:59', '1', '2021-12-10 16:44:59', b'0'); -INSERT INTO `sys_dict_data` VALUES (1119, 3, '退款失败', '2', 'pay_refund_order_status', 0, '退款失败', '1', '2021-12-10 16:45:10', '1', '2021-12-10 16:45:10', b'0'); -INSERT INTO `sys_dict_data` VALUES (1120, 4, '退款中, 渠道通知结果', '3', 'pay_refund_order_status', 0, '退款中, 渠道通知结果', '1', '2021-12-10 16:45:32', '1', '2021-12-10 16:45:32', b'0'); -INSERT INTO `sys_dict_data` VALUES (1121, 5, '退款中, 系统查询结果', '4', 'pay_refund_order_status', 0, '退款中, 系统查询结果', '1', '2021-12-10 16:45:48', '1', '2021-12-10 16:45:48', b'0'); -INSERT INTO `sys_dict_data` VALUES (1122, 6, '状态未知,需要重试', '5', 'pay_refund_order_status', 0, '状态未知,需要重试', '1', '2021-12-10 16:46:03', '1', '2021-12-10 16:46:03', b'0'); -INSERT INTO `sys_dict_data` VALUES (1123, 7, '状态未知,系统查询结果', '6', 'pay_refund_order_status', 0, '状态未知,系统查询结果', '1', '2021-12-10 16:46:13', '1', '2021-12-10 16:46:13', b'0'); -INSERT INTO `sys_dict_data` VALUES (1124, 8, '退款关闭', '99', 'pay_refund_order_status', 0, '退款关闭', '1', '2021-12-10 16:46:26', '1', '2021-12-10 16:46:26', b'0'); -INSERT INTO `sys_dict_data` VALUES (1125, 0, '默认', '1', 'bpm_model_category', 0, '流程分类 - 默认', '1', '2022-01-02 08:41:11', '1', '2022-01-02 08:41:11', b'0'); -INSERT INTO `sys_dict_data` VALUES (1126, 0, 'OA', '2', 'bpm_model_category', 0, '流程分类 - OA', '1', '2022-01-02 08:41:22', '1', '2022-01-02 08:41:22', b'0'); -INSERT INTO `sys_dict_data` VALUES (1127, 0, '进行中', '1', 'bpm_process_instance_status', 0, '流程实例的状态 - 进行中', '1', '2022-01-07 23:47:22', '1', '2022-01-09 08:59:34', b'0'); -INSERT INTO `sys_dict_data` VALUES (1128, 2, '已完成', '2', 'bpm_process_instance_status', 0, '流程实例的状态 - 已完成', '1', '2022-01-07 23:47:49', '1', '2022-01-07 23:47:49', b'0'); -INSERT INTO `sys_dict_data` VALUES (1129, 1, '处理中', '1', 'bpm_process_instance_result', 0, '流程实例的结果 - 处理中', '1', '2022-01-07 23:48:32', '1', '2022-01-07 23:48:32', b'0'); -INSERT INTO `sys_dict_data` VALUES (1130, 2, '通过', '2', 'bpm_process_instance_result', 0, '流程实例的结果 - 通过', '1', '2022-01-07 23:48:45', '1', '2022-01-07 23:48:45', b'0'); -INSERT INTO `sys_dict_data` VALUES (1131, 3, '不通过', '3', 'bpm_process_instance_result', 0, '流程实例的结果 - 不通过', '1', '2022-01-07 23:48:55', '1', '2022-01-07 23:48:55', b'0'); -INSERT INTO `sys_dict_data` VALUES (1132, 4, '已取消', '4', 'bpm_process_instance_result', 0, '流程实例的结果 - 撤销', '1', '2022-01-07 23:49:06', '1', '2022-01-08 13:21:14', b'0'); -INSERT INTO `sys_dict_data` VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '流程的表单类型 - 流程表单', '103', '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', b'0'); -INSERT INTO `sys_dict_data` VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '流程的表单类型 - 业务表单', '103', '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', b'0'); -INSERT INTO `sys_dict_data` VALUES (1135, 10, '角色', '10', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 角色', '103', '2022-01-12 23:21:22', '103', '2022-01-12 15:46:30', b'0'); -INSERT INTO `sys_dict_data` VALUES (1136, 20, '部门的成员', '20', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 部门的成员', '103', '2022-01-12 23:21:47', '103', '2022-01-12 15:46:26', b'0'); -INSERT INTO `sys_dict_data` VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '103', '2022-01-12 15:46:24', b'0'); -INSERT INTO `sys_dict_data` VALUES (1138, 30, '用户', '30', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 用户', '103', '2022-01-12 23:34:02', '103', '2022-01-12 15:46:22', b'0'); -INSERT INTO `sys_dict_data` VALUES (1139, 40, '用户组', '40', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 用户组', '103', '2022-01-12 23:34:21', '103', '2022-01-12 15:46:21', b'0'); -INSERT INTO `sys_dict_data` VALUES (1140, 50, '自定义脚本', '50', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 自定义脚本', '103', '2022-01-12 23:34:43', '103', '2022-01-12 15:46:19', b'0'); -INSERT INTO `sys_dict_data` VALUES (1141, 22, '岗位', '22', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 岗位', '103', '2022-01-14 18:41:55', '103', '2022-01-14 18:42:31', b'0'); -INSERT INTO `sys_dict_data` VALUES (1142, 10, '流程发起人', '10', 'bpm_task_assign_script', 0, '任务分配自定义脚本 - 流程发起人', '103', '2022-01-15 00:10:57', '103', '2022-01-15 21:24:10', b'0'); -INSERT INTO `sys_dict_data` VALUES (1143, 20, '流程发起人的一级领导', '20', 'bpm_task_assign_script', 0, '任务分配自定义脚本 - 流程发起人的一级领导', '103', '2022-01-15 21:24:31', '103', '2022-01-15 21:24:31', b'0'); -INSERT INTO `sys_dict_data` VALUES (1144, 21, '流程发起人的二级领导', '21', 'bpm_task_assign_script', 0, '任务分配自定义脚本 - 流程发起人的二级领导', '103', '2022-01-15 21:24:46', '103', '2022-01-15 21:24:57', b'0'); +INSERT INTO `system_dict_data` VALUES (1, 1, '男', '1', 'system_user_sex', 0, '性别男', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:30:38', b'0'); +INSERT INTO `system_dict_data` VALUES (2, 2, '女', '2', 'system_user_sex', 0, '性别女', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:30:41', b'0'); +INSERT INTO `system_dict_data` VALUES (8, 1, '正常', '1', 'infra_job_status', 0, '正常状态', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:59:07', b'0'); +INSERT INTO `system_dict_data` VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, '停用状态', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:57:08', b'0'); +INSERT INTO `system_dict_data` VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:30', b'0'); +INSERT INTO `system_dict_data` VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:28', b'0'); +INSERT INTO `system_dict_data` VALUES (14, 1, '通知', '1', 'system_notice_type', 0, '通知', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:32', b'0'); +INSERT INTO `system_dict_data` VALUES (15, 2, '公告', '2', 'system_notice_type', 0, '公告', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:25', b'0'); +INSERT INTO `system_dict_data` VALUES (16, 0, '其它', '0', 'system_operate_type', 0, '其它操作', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:13', b'0'); +INSERT INTO `system_dict_data` VALUES (17, 1, '查询', '1', 'system_operate_type', 0, '查询操作', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:16', b'0'); +INSERT INTO `system_dict_data` VALUES (18, 2, '新增', '2', 'system_operate_type', 0, '新增操作', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:18', b'0'); +INSERT INTO `system_dict_data` VALUES (19, 3, '修改', '3', 'system_operate_type', 0, '修改操作', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:19', b'0'); +INSERT INTO `system_dict_data` VALUES (20, 4, '删除', '4', 'system_operate_type', 0, '删除操作', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:21', b'0'); +INSERT INTO `system_dict_data` VALUES (22, 5, '导出', '5', 'system_operate_type', 0, '导出操作', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:22', b'0'); +INSERT INTO `system_dict_data` VALUES (23, 6, '导入', '6', 'system_operate_type', 0, '导入操作', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:10', b'0'); +INSERT INTO `system_dict_data` VALUES (27, 1, '开启', '0', 'common_status', 0, '开启状态', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:04', b'0'); +INSERT INTO `system_dict_data` VALUES (28, 2, '关闭', '1', 'common_status', 0, '关闭状态', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:08', b'0'); +INSERT INTO `system_dict_data` VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '目录', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:45', b'0'); +INSERT INTO `system_dict_data` VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '菜单', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:41', b'0'); +INSERT INTO `system_dict_data` VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '按钮', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:39', b'0'); +INSERT INTO `system_dict_data` VALUES (32, 1, '内置', '1', 'system_role_type', 0, '内置角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:03', b'0'); +INSERT INTO `system_dict_data` VALUES (33, 2, '自定义', '2', 'system_role_type', 0, '自定义角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:06', b'0'); +INSERT INTO `system_dict_data` VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:17', b'0'); +INSERT INTO `system_dict_data` VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:18', b'0'); +INSERT INTO `system_dict_data` VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:16', b'0'); +INSERT INTO `system_dict_data` VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:21', b'0'); +INSERT INTO `system_dict_data` VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:23', b'0'); +INSERT INTO `system_dict_data` VALUES (39, 0, '成功', '0', 'system_login_result', 0, '登陆结果 - 成功', '', '2021-01-18 06:17:36', '', '2022-02-01 16:44:30', b'0'); +INSERT INTO `system_dict_data` VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '', '2022-02-01 16:44:26', b'0'); +INSERT INTO `system_dict_data` VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '', '2022-02-01 16:44:24', b'0'); +INSERT INTO `system_dict_data` VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '', '2022-02-01 16:44:23', b'0'); +INSERT INTO `system_dict_data` VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '', '2022-02-01 16:44:19', b'0'); +INSERT INTO `system_dict_data` VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '', '2022-02-01 16:44:17', b'0'); +INSERT INTO `system_dict_data` VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '', '2022-02-01 16:47:38', b'0'); +INSERT INTO `system_dict_data` VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '', '2022-02-01 16:47:35', b'0'); +INSERT INTO `system_dict_data` VALUES (47, 1, '永不超时', '1', 'infra_redis_timeout_type', 0, 'Redis 未设置超时的情况', '', '2021-01-26 00:53:17', '', '2022-02-01 16:48:09', b'0'); +INSERT INTO `system_dict_data` VALUES (48, 1, '动态超时', '2', 'infra_redis_timeout_type', 0, '程序里动态传入超时时间,无法固定', '', '2021-01-26 00:55:00', '', '2022-02-01 16:48:06', b'0'); +INSERT INTO `system_dict_data` VALUES (49, 3, '固定超时', '3', 'infra_redis_timeout_type', 0, 'Redis 设置了过期时间', '', '2021-01-26 00:55:26', '', '2022-02-01 16:48:01', b'0'); +INSERT INTO `system_dict_data` VALUES (50, 1, '单表(增删改查)', '1', 'tool_codegen_template_type', 0, NULL, '', '2021-02-05 07:09:06', '', '2021-02-05 07:21:52', b'0'); +INSERT INTO `system_dict_data` VALUES (51, 2, '树表(增删改查)', '2', 'tool_codegen_template_type', 0, NULL, '', '2021-02-05 07:14:46', '', '2021-02-05 07:21:49', b'0'); +INSERT INTO `system_dict_data` VALUES (52, 3, '主子表(增删改查)', '3', 'tool_codegen_template_type', 0, NULL, '', '2021-02-05 07:21:45', '', '2021-02-06 18:54:26', b'1'); +INSERT INTO `system_dict_data` VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, NULL, '', '2021-02-07 07:46:49', '', '2022-02-01 16:47:57', b'0'); +INSERT INTO `system_dict_data` VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'RUNNING', '', '2021-02-08 10:04:24', '', '2022-02-01 16:48:54', b'0'); +INSERT INTO `system_dict_data` VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:06:57', '', '2022-02-01 16:48:58', b'0'); +INSERT INTO `system_dict_data` VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, '失败', '', '2021-02-08 10:07:38', '', '2022-02-01 16:49:02', b'0'); +INSERT INTO `system_dict_data` VALUES (60, 1, '会员', '1', 'user_type', 0, NULL, '', '2021-02-26 00:16:27', '', '2021-02-26 00:16:27', b'0'); +INSERT INTO `system_dict_data` VALUES (61, 2, '管理员', '2', 'user_type', 0, NULL, '', '2021-02-26 00:16:34', '', '2021-02-26 00:16:34', b'0'); +INSERT INTO `system_dict_data` VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:19', '', '2022-02-01 16:49:05', b'0'); +INSERT INTO `system_dict_data` VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:26', '', '2022-02-01 16:49:09', b'0'); +INSERT INTO `system_dict_data` VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:34', '', '2022-02-01 16:49:12', b'0'); +INSERT INTO `system_dict_data` VALUES (65, 1, '云片', 'YUN_PIAN', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:05:14', '1', '2022-02-01 16:39:36', b'0'); +INSERT INTO `system_dict_data` VALUES (66, 2, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:05:26', '1', '2022-02-01 16:39:41', b'0'); +INSERT INTO `system_dict_data` VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-01 16:37:27', b'0'); +INSERT INTO `system_dict_data` VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-01 16:37:33', b'0'); +INSERT INTO `system_dict_data` VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-01 16:37:40', b'0'); +INSERT INTO `system_dict_data` VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:33', '1', '2022-02-01 16:38:58', b'0'); +INSERT INTO `system_dict_data` VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:43', '1', '2022-02-01 16:39:02', b'0'); +INSERT INTO `system_dict_data` VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:49', '1', '2022-02-01 16:39:07', b'0'); +INSERT INTO `system_dict_data` VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:19:44', '1', '2022-02-01 16:39:13', b'0'); +INSERT INTO `system_dict_data` VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:43', '1', '2022-02-01 16:39:19', b'0'); +INSERT INTO `system_dict_data` VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:29:25', '1', '2022-02-01 16:39:23', b'0'); +INSERT INTO `system_dict_data` VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:29:31', '1', '2022-02-01 16:39:29', b'0'); +INSERT INTO `system_dict_data` VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, NULL, '1', '2021-04-13 00:20:37', '1', '2022-02-01 16:39:47', b'0'); +INSERT INTO `system_dict_data` VALUES (78, 1, '自动生成', '1', 'system_error_code_type', 0, NULL, '1', '2021-04-21 00:06:48', '1', '2022-02-01 16:47:11', b'0'); +INSERT INTO `system_dict_data` VALUES (79, 2, '手动编辑', '2', 'system_error_code_type', 0, NULL, '1', '2021-04-21 00:07:14', '1', '2022-02-01 16:47:10', b'0'); +INSERT INTO `system_dict_data` VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, '账号登录', '1', '2021-10-06 00:52:02', '1', '2022-02-01 16:43:50', b'0'); +INSERT INTO `system_dict_data` VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, '社交登录', '1', '2021-10-06 00:52:17', '1', '2022-02-01 16:43:51', b'0'); +INSERT INTO `system_dict_data` VALUES (82, 102, 'Mock 登录', '102', 'system_login_type', 0, 'Mock 登录', '1', '2021-10-06 00:52:32', '1', '2022-02-01 16:43:54', b'0'); +INSERT INTO `system_dict_data` VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, '主动登出', '1', '2021-10-06 00:52:58', '1', '2022-02-01 16:43:55', b'0'); +INSERT INTO `system_dict_data` VALUES (84, 201, '超时登出', '201', 'system_login_type', 0, '超时登出', '1', '2021-10-06 00:53:17', '1', '2022-02-01 16:43:56', b'0'); +INSERT INTO `system_dict_data` VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, '强制退出', '1', '2021-10-06 00:53:41', '1', '2022-02-01 16:43:58', b'0'); +INSERT INTO `system_dict_data` VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:35:28', '1', '2022-01-22 10:42:08', b'0'); +INSERT INTO `system_dict_data` VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:36:11', '1', '2022-01-22 10:42:11', b'0'); +INSERT INTO `system_dict_data` VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:36:38', '1', '2022-01-22 10:42:16', b'0'); +INSERT INTO `system_dict_data` VALUES (98, 1, 'v2', 'v2', 'pay_channel_wechat_version', 0, 'v2版本', '1', '2021-11-08 17:00:58', '1', '2021-11-08 17:00:58', b'0'); +INSERT INTO `system_dict_data` VALUES (99, 2, 'v3', 'v3', 'pay_channel_wechat_version', 0, 'v3版本', '1', '2021-11-08 17:01:07', '1', '2021-11-08 17:01:07', b'0'); +INSERT INTO `system_dict_data` VALUES (108, 1, 'RSA2', 'RSA2', 'pay_channel_alipay_sign_type', 0, 'RSA2', '1', '2021-11-18 15:39:29', '1', '2021-11-18 15:39:29', b'0'); +INSERT INTO `system_dict_data` VALUES (109, 1, '公钥模式', '1', 'pay_channel_alipay_mode', 0, '公钥模式:privateKey + alipayPublicKey', '1', '2021-11-18 15:45:23', '1', '2021-11-18 15:45:23', b'0'); +INSERT INTO `system_dict_data` VALUES (110, 2, '证书模式', '2', 'pay_channel_alipay_mode', 0, '证书模式:appCertContent + alipayPublicCertContent + rootCertContent', '1', '2021-11-18 15:45:40', '1', '2021-11-18 15:45:40', b'0'); +INSERT INTO `system_dict_data` VALUES (111, 1, '线上', 'https://openapi.alipay.com/gateway.do', 'pay_channel_alipay_server_type', 0, '网关地址 - 线上', '1', '2021-11-18 16:59:32', '1', '2021-11-21 17:37:29', b'0'); +INSERT INTO `system_dict_data` VALUES (112, 2, '沙箱', 'https://openapi.alipaydev.com/gateway.do', 'pay_channel_alipay_server_type', 0, '网关地址 - 沙箱', '1', '2021-11-18 16:59:48', '1', '2021-11-21 17:37:39', b'0'); +INSERT INTO `system_dict_data` VALUES (113, 1, '微信 JSAPI 支付', 'wx_pub', 'pay_channel_code_type', 0, '微信 JSAPI(公众号) 支付', '1', '2021-12-03 10:40:24', '1', '2021-12-04 16:41:00', b'0'); +INSERT INTO `system_dict_data` VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code_type', 0, '微信小程序支付', '1', '2021-12-03 10:41:06', '1', '2021-12-03 10:41:06', b'0'); +INSERT INTO `system_dict_data` VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code_type', 0, '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2021-12-03 10:41:20', b'0'); +INSERT INTO `system_dict_data` VALUES (116, 4, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code_type', 0, '支付宝 PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2021-12-03 10:42:09', b'0'); +INSERT INTO `system_dict_data` VALUES (117, 5, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code_type', 0, '支付宝 Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2021-12-03 10:42:26', b'0'); +INSERT INTO `system_dict_data` VALUES (118, 6, '支付宝App 支付', 'alipay_app', 'pay_channel_code_type', 0, '支付宝App 支付', '1', '2021-12-03 10:42:55', '1', '2021-12-03 10:42:55', b'0'); +INSERT INTO `system_dict_data` VALUES (119, 7, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code_type', 0, '支付宝扫码支付', '1', '2021-12-03 10:43:10', '1', '2021-12-03 10:43:10', b'0'); +INSERT INTO `system_dict_data` VALUES (120, 1, '通知成功', '10', 'pay_order_notify_status', 0, '通知成功', '1', '2021-12-03 11:02:41', '1', '2021-12-03 11:02:41', b'0'); +INSERT INTO `system_dict_data` VALUES (121, 2, '通知失败', '20', 'pay_order_notify_status', 0, '通知失败', '1', '2021-12-03 11:02:59', '1', '2021-12-03 11:02:59', b'0'); +INSERT INTO `system_dict_data` VALUES (122, 3, '未通知', '0', 'pay_order_notify_status', 0, '未通知', '1', '2021-12-03 11:03:10', '1', '2021-12-03 11:03:10', b'0'); +INSERT INTO `system_dict_data` VALUES (123, 1, '支付成功', '10', 'pay_order_status', 0, '支付成功', '1', '2021-12-03 11:18:29', '1', '2021-12-03 11:28:32', b'0'); +INSERT INTO `system_dict_data` VALUES (124, 2, '支付关闭', '20', 'pay_order_status', 0, '支付关闭', '1', '2021-12-03 11:18:42', '1', '2021-12-03 11:28:34', b'0'); +INSERT INTO `system_dict_data` VALUES (125, 3, '未支付', '0', 'pay_order_status', 0, '未支付', '1', '2021-12-03 11:18:18', '1', '2021-12-03 11:28:36', b'0'); +INSERT INTO `system_dict_data` VALUES (126, 1, '未退款', '0', 'pay_order_refund_status', 0, '未退款', '1', '2021-12-03 11:30:35', '1', '2021-12-03 11:34:05', b'0'); +INSERT INTO `system_dict_data` VALUES (127, 2, '部分退款', '10', 'pay_order_refund_status', 0, '部分退款', '1', '2021-12-03 11:30:44', '1', '2021-12-03 11:34:10', b'0'); +INSERT INTO `system_dict_data` VALUES (128, 3, '全部退款', '20', 'pay_order_refund_status', 0, '全部退款', '1', '2021-12-03 11:30:52', '1', '2021-12-03 11:34:14', b'0'); +INSERT INTO `system_dict_data` VALUES (1117, 1, '退款订单生成', '0', 'pay_refund_order_status', 0, '退款订单生成', '1', '2021-12-10 16:44:44', '1', '2021-12-10 16:44:44', b'0'); +INSERT INTO `system_dict_data` VALUES (1118, 2, '退款成功', '1', 'pay_refund_order_status', 0, '退款成功', '1', '2021-12-10 16:44:59', '1', '2021-12-10 16:44:59', b'0'); +INSERT INTO `system_dict_data` VALUES (1119, 3, '退款失败', '2', 'pay_refund_order_status', 0, '退款失败', '1', '2021-12-10 16:45:10', '1', '2021-12-10 16:45:10', b'0'); +INSERT INTO `system_dict_data` VALUES (1120, 4, '退款中, 渠道通知结果', '3', 'pay_refund_order_status', 0, '退款中, 渠道通知结果', '1', '2021-12-10 16:45:32', '1', '2021-12-10 16:45:32', b'0'); +INSERT INTO `system_dict_data` VALUES (1121, 5, '退款中, 系统查询结果', '4', 'pay_refund_order_status', 0, '退款中, 系统查询结果', '1', '2021-12-10 16:45:48', '1', '2021-12-10 16:45:48', b'0'); +INSERT INTO `system_dict_data` VALUES (1122, 6, '状态未知,需要重试', '5', 'pay_refund_order_status', 0, '状态未知,需要重试', '1', '2021-12-10 16:46:03', '1', '2021-12-10 16:46:03', b'0'); +INSERT INTO `system_dict_data` VALUES (1123, 7, '状态未知,系统查询结果', '6', 'pay_refund_order_status', 0, '状态未知,系统查询结果', '1', '2021-12-10 16:46:13', '1', '2021-12-10 16:46:13', b'0'); +INSERT INTO `system_dict_data` VALUES (1124, 8, '退款关闭', '99', 'pay_refund_order_status', 0, '退款关闭', '1', '2021-12-10 16:46:26', '1', '2021-12-10 16:46:26', b'0'); +INSERT INTO `system_dict_data` VALUES (1125, 0, '默认', '1', 'bpm_model_category', 0, '流程分类 - 默认', '1', '2022-01-02 08:41:11', '1', '2022-01-02 08:41:11', b'0'); +INSERT INTO `system_dict_data` VALUES (1126, 0, 'OA', '2', 'bpm_model_category', 0, '流程分类 - OA', '1', '2022-01-02 08:41:22', '1', '2022-01-02 08:41:22', b'0'); +INSERT INTO `system_dict_data` VALUES (1127, 0, '进行中', '1', 'bpm_process_instance_status', 0, '流程实例的状态 - 进行中', '1', '2022-01-07 23:47:22', '1', '2022-01-09 08:59:34', b'0'); +INSERT INTO `system_dict_data` VALUES (1128, 2, '已完成', '2', 'bpm_process_instance_status', 0, '流程实例的状态 - 已完成', '1', '2022-01-07 23:47:49', '1', '2022-01-07 23:47:49', b'0'); +INSERT INTO `system_dict_data` VALUES (1129, 1, '处理中', '1', 'bpm_process_instance_result', 0, '流程实例的结果 - 处理中', '1', '2022-01-07 23:48:32', '1', '2022-01-07 23:48:32', b'0'); +INSERT INTO `system_dict_data` VALUES (1130, 2, '通过', '2', 'bpm_process_instance_result', 0, '流程实例的结果 - 通过', '1', '2022-01-07 23:48:45', '1', '2022-01-07 23:48:45', b'0'); +INSERT INTO `system_dict_data` VALUES (1131, 3, '不通过', '3', 'bpm_process_instance_result', 0, '流程实例的结果 - 不通过', '1', '2022-01-07 23:48:55', '1', '2022-01-07 23:48:55', b'0'); +INSERT INTO `system_dict_data` VALUES (1132, 4, '已取消', '4', 'bpm_process_instance_result', 0, '流程实例的结果 - 撤销', '1', '2022-01-07 23:49:06', '1', '2022-01-08 13:21:14', b'0'); +INSERT INTO `system_dict_data` VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '流程的表单类型 - 流程表单', '103', '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', b'0'); +INSERT INTO `system_dict_data` VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '流程的表单类型 - 业务表单', '103', '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', b'0'); +INSERT INTO `system_dict_data` VALUES (1135, 10, '角色', '10', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 角色', '103', '2022-01-12 23:21:22', '103', '2022-01-12 15:46:30', b'0'); +INSERT INTO `system_dict_data` VALUES (1136, 20, '部门的成员', '20', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 部门的成员', '103', '2022-01-12 23:21:47', '103', '2022-01-12 15:46:26', b'0'); +INSERT INTO `system_dict_data` VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '103', '2022-01-12 15:46:24', b'0'); +INSERT INTO `system_dict_data` VALUES (1138, 30, '用户', '30', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 用户', '103', '2022-01-12 23:34:02', '103', '2022-01-12 15:46:22', b'0'); +INSERT INTO `system_dict_data` VALUES (1139, 40, '用户组', '40', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 用户组', '103', '2022-01-12 23:34:21', '103', '2022-01-12 15:46:21', b'0'); +INSERT INTO `system_dict_data` VALUES (1140, 50, '自定义脚本', '50', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 自定义脚本', '103', '2022-01-12 23:34:43', '103', '2022-01-12 15:46:19', b'0'); +INSERT INTO `system_dict_data` VALUES (1141, 22, '岗位', '22', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型 - 岗位', '103', '2022-01-14 18:41:55', '103', '2022-01-14 18:42:31', b'0'); +INSERT INTO `system_dict_data` VALUES (1142, 10, '流程发起人', '10', 'bpm_task_assign_script', 0, '任务分配自定义脚本 - 流程发起人', '103', '2022-01-15 00:10:57', '103', '2022-01-15 21:24:10', b'0'); +INSERT INTO `system_dict_data` VALUES (1143, 20, '流程发起人的一级领导', '20', 'bpm_task_assign_script', 0, '任务分配自定义脚本 - 流程发起人的一级领导', '103', '2022-01-15 21:24:31', '103', '2022-01-15 21:24:31', b'0'); +INSERT INTO `system_dict_data` VALUES (1144, 21, '流程发起人的二级领导', '21', 'bpm_task_assign_script', 0, '任务分配自定义脚本 - 流程发起人的二级领导', '103', '2022-01-15 21:24:46', '103', '2022-01-15 21:24:57', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_dict_type +-- Table structure for system_dict_type -- ---------------------------- -DROP TABLE IF EXISTS `sys_dict_type`; -CREATE TABLE `sys_dict_type` ( +DROP TABLE IF EXISTS `system_dict_type`; +CREATE TABLE `system_dict_type` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键', `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典名称', `type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典类型', @@ -1622,58 +2040,52 @@ CREATE TABLE `sys_dict_type` ( ) ENGINE=InnoDB AUTO_INCREMENT=144 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典类型表'; -- ---------------------------- --- Records of sys_dict_type +-- Records of system_dict_type -- ---------------------------- BEGIN; -INSERT INTO `sys_dict_type` VALUES (1, '用户性别', 'sys_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type` VALUES (3, '系统开关', 'sys_normal_disable', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-07 19:47:48', b'1'); -INSERT INTO `sys_dict_type` VALUES (4, '任务状态的枚举', 'sys_job_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 07:44:06', b'1'); -INSERT INTO `sys_dict_type` VALUES (5, '任务分组', 'sys_job_group', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 07:43:52', b'1'); -INSERT INTO `sys_dict_type` VALUES (6, '参数类型', 'sys_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:04', b'0'); -INSERT INTO `sys_dict_type` VALUES (7, '通知类型', 'sys_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type` VALUES (11, 'Boolean 是否类型', 'sys_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2021-01-19 03:20:08', b'0'); -INSERT INTO `sys_dict_type` VALUES (104, '登陆结果', 'sys_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2021-01-18 06:17:11', b'0'); -INSERT INTO `sys_dict_type` VALUES (105, 'Redis 超时类型', 'inf_redis_timeout_type', 0, 'RedisKeyDefine.TimeoutTypeEnum', '', '2021-01-26 00:52:50', '', '2021-01-26 00:52:50', b'0'); -INSERT INTO `sys_dict_type` VALUES (106, '代码生成模板类型', 'tool_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '', '2021-02-05 07:08:06', b'0'); -INSERT INTO `sys_dict_type` VALUES (107, '定时任务状态', 'inf_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2021-02-07 07:44:16', b'0'); -INSERT INTO `sys_dict_type` VALUES (108, '定时任务日志状态', 'inf_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2021-02-08 10:03:51', b'0'); -INSERT INTO `sys_dict_type` VALUES (109, '用户类型', 'user_type', 0, NULL, '', '2021-02-26 00:15:51', '', '2021-02-26 00:15:51', b'0'); -INSERT INTO `sys_dict_type` VALUES (110, 'API 异常数据的处理状态', 'inf_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2021-02-26 07:07:01', b'0'); -INSERT INTO `sys_dict_type` VALUES (111, '短信渠道编码', 'sys_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2021-04-05 01:04:50', b'0'); -INSERT INTO `sys_dict_type` VALUES (112, '短信模板的类型', 'sys_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2021-04-05 21:50:43', b'0'); -INSERT INTO `sys_dict_type` VALUES (113, '短信发送状态', 'sys_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2021-04-11 09:30:02', b'0'); -INSERT INTO `sys_dict_type` VALUES (114, '短信接收状态', 'sys_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2021-04-11 20:27:14', b'0'); -INSERT INTO `sys_dict_type` VALUES (115, '错误码的类型', 'sys_error_code_type', 0, NULL, '1', '2021-04-21 00:06:30', '1', '2021-04-13 22:07:12', b'0'); -INSERT INTO `sys_dict_type` VALUES (116, '登陆日志的类型', 'sys_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2021-10-06 00:50:46', b'0'); -INSERT INTO `sys_dict_type` VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', b'0'); -INSERT INTO `sys_dict_type` VALUES (118, '请假流程状态', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:46:04', '1', '2022-01-22 10:40:46', b'1'); -INSERT INTO `sys_dict_type` VALUES (122, '支付渠道微信版本', 'pay_channel_wechat_version', 0, '支付渠道微信版本', '1', '2021-11-08 17:00:26', '1', '2021-11-08 17:00:26', b'0'); -INSERT INTO `sys_dict_type` VALUES (127, '支付渠道支付宝算法类型', 'pay_channel_alipay_sign_type', 0, '支付渠道支付宝算法类型', '1', '2021-11-18 15:39:09', '1', '2021-11-18 15:39:09', b'0'); -INSERT INTO `sys_dict_type` VALUES (128, '支付渠道支付宝公钥类型', 'pay_channel_alipay_mode', 0, '支付渠道支付宝公钥类型', '1', '2021-11-18 15:44:28', '1', '2021-11-18 15:44:28', b'0'); -INSERT INTO `sys_dict_type` VALUES (129, '支付宝网关地址', 'pay_channel_alipay_server_type', 0, '支付宝网关地址', '1', '2021-11-18 16:58:55', '1', '2021-11-18 17:01:34', b'0'); -INSERT INTO `sys_dict_type` VALUES (130, '支付渠道编码类型', 'pay_channel_code_type', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', '2021-12-03 10:35:08', b'0'); -INSERT INTO `sys_dict_type` VALUES (131, '支付订单回调状态', 'pay_order_notify_status', 0, '支付订单回调状态', '1', '2021-12-03 10:53:29', '1', '2021-12-03 10:53:29', b'0'); -INSERT INTO `sys_dict_type` VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', b'0'); -INSERT INTO `sys_dict_type` VALUES (133, '支付订单退款状态', 'pay_order_refund_status', 0, '支付订单退款状态', '1', '2021-12-03 11:27:31', '1', '2021-12-03 11:27:31', b'0'); -INSERT INTO `sys_dict_type` VALUES (134, '退款订单状态', 'pay_refund_order_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', '2021-12-10 16:42:50', b'0'); -INSERT INTO `sys_dict_type` VALUES (135, '退款订单类别', 'pay_refund_order_type', 0, '退款订单类别', '1', '2021-12-10 17:14:53', '1', '2021-12-10 17:14:53', b'0'); -INSERT INTO `sys_dict_type` VALUES (137, '流程分类', '流程分类', 0, '流程分类', '1', '2022-01-02 08:40:17', '1', '2022-01-02 00:40:34', b'1'); -INSERT INTO `sys_dict_type` VALUES (138, '流程分类', 'bpm_model_category', 0, '流程分类', '1', '2022-01-02 08:40:45', '1', '2022-01-02 08:40:45', b'0'); -INSERT INTO `sys_dict_type` VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', '2022-01-07 23:46:42', b'0'); -INSERT INTO `sys_dict_type` VALUES (140, '流程实例的结果', 'bpm_process_instance_result', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', '2022-01-07 23:48:10', b'0'); -INSERT INTO `sys_dict_type` VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', '2022-01-11 23:50:45', b'0'); -INSERT INTO `sys_dict_type` VALUES (142, '任务分配规则的类型', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型', '103', '2022-01-12 23:21:04', '103', '2022-01-12 15:46:10', b'0'); -INSERT INTO `sys_dict_type` VALUES (143, '任务分配自定义脚本', 'bpm_task_assign_script', 0, '任务分配自定义脚本', '103', '2022-01-15 00:10:35', '103', '2022-01-15 00:10:35', b'0'); +INSERT INTO `system_dict_type` VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:30:31', b'0'); +INSERT INTO `system_dict_type` VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:36:54', b'0'); +INSERT INTO `system_dict_type` VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:26', b'0'); +INSERT INTO `system_dict_type` VALUES (9, '操作类型', 'system_oper_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:22', b'0'); +INSERT INTO `system_dict_type` VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:28', b'0'); +INSERT INTO `system_dict_type` VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2022-02-01 16:37:10', b'0'); +INSERT INTO `system_dict_type` VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2022-02-01 16:36:00', b'0'); +INSERT INTO `system_dict_type` VALUES (105, 'Redis 超时类型', 'infra_redis_timeout_type', 0, 'RedisKeyDefine.TimeoutTypeEnum', '', '2021-01-26 00:52:50', '', '2022-02-01 16:50:29', b'0'); +INSERT INTO `system_dict_type` VALUES (106, '代码生成模板类型', 'tool_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '', '2021-02-05 07:08:06', b'0'); +INSERT INTO `system_dict_type` VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2022-02-01 16:51:11', b'0'); +INSERT INTO `system_dict_type` VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2022-02-01 16:50:43', b'0'); +INSERT INTO `system_dict_type` VALUES (109, '用户类型', 'user_type', 0, NULL, '', '2021-02-26 00:15:51', '', '2021-02-26 00:15:51', b'0'); +INSERT INTO `system_dict_type` VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2022-02-01 16:50:53', b'0'); +INSERT INTO `system_dict_type` VALUES (111, '短信渠道编码', 'sytems_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2022-02-01 16:35:18', b'0'); +INSERT INTO `system_dict_type` VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2022-02-01 16:35:06', b'0'); +INSERT INTO `system_dict_type` VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2022-02-01 16:35:09', b'0'); +INSERT INTO `system_dict_type` VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2022-02-01 16:35:14', b'0'); +INSERT INTO `system_dict_type` VALUES (115, '错误码的类型', 'system_error_code_type', 0, NULL, '1', '2021-04-21 00:06:30', '1', '2022-02-01 16:36:49', b'0'); +INSERT INTO `system_dict_type` VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2022-02-01 16:35:56', b'0'); +INSERT INTO `system_dict_type` VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', b'0'); +INSERT INTO `system_dict_type` VALUES (122, '支付渠道微信版本', 'pay_channel_wechat_version', 0, '支付渠道微信版本', '1', '2021-11-08 17:00:26', '1', '2021-11-08 17:00:26', b'0'); +INSERT INTO `system_dict_type` VALUES (127, '支付渠道支付宝算法类型', 'pay_channel_alipay_sign_type', 0, '支付渠道支付宝算法类型', '1', '2021-11-18 15:39:09', '1', '2021-11-18 15:39:09', b'0'); +INSERT INTO `system_dict_type` VALUES (128, '支付渠道支付宝公钥类型', 'pay_channel_alipay_mode', 0, '支付渠道支付宝公钥类型', '1', '2021-11-18 15:44:28', '1', '2021-11-18 15:44:28', b'0'); +INSERT INTO `system_dict_type` VALUES (129, '支付宝网关地址', 'pay_channel_alipay_server_type', 0, '支付宝网关地址', '1', '2021-11-18 16:58:55', '1', '2021-11-18 17:01:34', b'0'); +INSERT INTO `system_dict_type` VALUES (130, '支付渠道编码类型', 'pay_channel_code_type', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', '2021-12-03 10:35:08', b'0'); +INSERT INTO `system_dict_type` VALUES (131, '支付订单回调状态', 'pay_order_notify_status', 0, '支付订单回调状态', '1', '2021-12-03 10:53:29', '1', '2021-12-03 10:53:29', b'0'); +INSERT INTO `system_dict_type` VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', b'0'); +INSERT INTO `system_dict_type` VALUES (133, '支付订单退款状态', 'pay_order_refund_status', 0, '支付订单退款状态', '1', '2021-12-03 11:27:31', '1', '2021-12-03 11:27:31', b'0'); +INSERT INTO `system_dict_type` VALUES (134, '退款订单状态', 'pay_refund_order_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', '2021-12-10 16:42:50', b'0'); +INSERT INTO `system_dict_type` VALUES (135, '退款订单类别', 'pay_refund_order_type', 0, '退款订单类别', '1', '2021-12-10 17:14:53', '1', '2021-12-10 17:14:53', b'0'); +INSERT INTO `system_dict_type` VALUES (138, '流程分类', 'bpm_model_category', 0, '流程分类', '1', '2022-01-02 08:40:45', '1', '2022-01-02 08:40:45', b'0'); +INSERT INTO `system_dict_type` VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', '2022-01-07 23:46:42', b'0'); +INSERT INTO `system_dict_type` VALUES (140, '流程实例的结果', 'bpm_process_instance_result', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', '2022-01-07 23:48:10', b'0'); +INSERT INTO `system_dict_type` VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', '2022-01-11 23:50:45', b'0'); +INSERT INTO `system_dict_type` VALUES (142, '任务分配规则的类型', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型', '103', '2022-01-12 23:21:04', '103', '2022-01-12 15:46:10', b'0'); +INSERT INTO `system_dict_type` VALUES (143, '任务分配自定义脚本', 'bpm_task_assign_script', 0, '任务分配自定义脚本', '103', '2022-01-15 00:10:35', '103', '2022-01-15 00:10:35', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_error_code +-- Table structure for system_error_code -- ---------------------------- -DROP TABLE IF EXISTS `sys_error_code`; -CREATE TABLE `sys_error_code` ( +DROP TABLE IF EXISTS `system_error_code`; +CREATE TABLE `system_error_code` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '错误码编号', `type` tinyint NOT NULL DEFAULT '0' COMMENT '错误码类型', `application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', @@ -1686,121 +2098,180 @@ CREATE TABLE `sys_error_code` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=4696 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='错误码表'; +) ENGINE=InnoDB AUTO_INCREMENT=4755 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='错误码表'; -- ---------------------------- --- Records of sys_error_code +-- Records of system_error_code -- ---------------------------- BEGIN; -INSERT INTO `sys_error_code` VALUES (4594, 1, 'yudao-admin-server', 1001000001, '参数配置不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4595, 1, 'yudao-admin-server', 1001000002, '参数配置 key 重复', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4596, 1, 'yudao-admin-server', 1001000003, '不能删除类型为系统内置的参数配置', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4597, 1, 'yudao-admin-server', 1001000004, '不允许获取敏感配置到前端', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4598, 1, 'yudao-admin-server', 1001001000, '定时任务不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4599, 1, 'yudao-admin-server', 1001001001, '定时任务的处理器已经存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4600, 1, 'yudao-admin-server', 1001001002, '只允许修改为开启或者关闭状态', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4601, 1, 'yudao-admin-server', 1001001003, '定时任务已经处于该状态,无需修改', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4602, 1, 'yudao-admin-server', 1001001004, '只有开启状态的任务,才可以修改', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4603, 1, 'yudao-admin-server', 1001001005, 'CRON 表达式不正确', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4604, 1, 'yudao-admin-server', 1001002000, 'API 错误日志不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4605, 1, 'yudao-admin-server', 1001002001, 'API 错误日志已处理', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4606, 1, 'yudao-admin-server', 1002000000, '登录失败,账号密码不正确', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4607, 1, 'yudao-admin-server', 1002000001, '登录失败,账号被禁用', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4608, 1, 'yudao-admin-server', 1002000002, '登录失败', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4609, 1, 'yudao-admin-server', 1002000003, '验证码不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4610, 1, 'yudao-admin-server', 1002000004, '验证码不正确', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4611, 1, 'yudao-admin-server', 1002000005, '未绑定账号,需要进行绑定', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4612, 1, 'yudao-admin-server', 1002000006, 'Token 已经过期', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4613, 1, 'yudao-admin-server', 1002002000, '已经存在该名字的菜单', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4614, 1, 'yudao-admin-server', 1002002001, '父菜单不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4615, 1, 'yudao-admin-server', 1002002002, '不能设置自己为父菜单', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); -INSERT INTO `sys_error_code` VALUES (4616, 1, 'yudao-admin-server', 1002002003, '菜单不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4617, 1, 'yudao-admin-server', 1002002004, '存在子菜单,无法删除', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4618, 1, 'yudao-admin-server', 1002002005, '父菜单的类型必须是目录或者菜单', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4619, 1, 'yudao-admin-server', 1002003000, '角色不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4620, 1, 'yudao-admin-server', 1002003001, '已经存在名为【{}】的角色', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4621, 1, 'yudao-admin-server', 1002003002, '已经存在编码为【{}】的角色', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4622, 1, 'yudao-admin-server', 1002003004, '不能操作类型为系统内置的角色', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4623, 1, 'yudao-admin-server', 1002003004, '名字为【{}】的角色已被禁用', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4624, 1, 'yudao-admin-server', 1002004000, '用户账号已经存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4625, 1, 'yudao-admin-server', 1002004001, '手机号已经存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4626, 1, 'yudao-admin-server', 1002004002, '邮箱已经存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4627, 1, 'yudao-admin-server', 1002004003, '用户不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4628, 1, 'yudao-admin-server', 1002004004, '导入用户数据不能为空!', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4629, 1, 'yudao-admin-server', 1002004005, '用户密码校验失败', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4630, 1, 'yudao-admin-server', 1002003004, '名字为【{}】的用户已被禁用', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4631, 1, 'yudao-admin-server', 1002004001, '已经存在该名字的部门', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4632, 1, 'yudao-admin-server', 1002004002, '父级部门不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4633, 1, 'yudao-admin-server', 1002004003, '当前部门不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4634, 1, 'yudao-admin-server', 1002004004, '存在子部门,无法删除', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4635, 1, 'yudao-admin-server', 1002004005, '不能设置自己为父部门', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4636, 1, 'yudao-admin-server', 1002004006, '部门中存在员工,无法删除', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4637, 1, 'yudao-admin-server', 1002004007, '部门不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4638, 1, 'yudao-admin-server', 1002004008, '不能设置自己的子部门为父部门', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4639, 1, 'yudao-admin-server', 1002005001, '当前岗位不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4640, 1, 'yudao-admin-server', 1002005002, '岗位({}) 不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4641, 1, 'yudao-admin-server', 1002005001, '已经存在该名字的岗位', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4642, 1, 'yudao-admin-server', 1002005001, '已经存在该标识的岗位', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4643, 1, 'yudao-admin-server', 1002006001, '当前字典类型不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4644, 1, 'yudao-admin-server', 1002006002, '字典类型不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4645, 1, 'yudao-admin-server', 1002006003, '已经存在该名字的字典类型', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4646, 1, 'yudao-admin-server', 1002006004, '已经存在该类型的字典类型', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4647, 1, 'yudao-admin-server', 1002006004, '无法删除,该字典类型还有字典数据', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4648, 1, 'yudao-admin-server', 1002007001, '当前字典数据不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4649, 1, 'yudao-admin-server', 1002007002, '字典数据({})不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4650, 1, 'yudao-admin-server', 1002007003, '已经存在该值的字典数据', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4651, 1, 'yudao-admin-server', 1002008001, '当前通知公告不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4652, 1, 'yudao-admin-server', 1002009001, '文件路径已经存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4653, 1, 'yudao-admin-server', 1002009002, '文件上传失败', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4654, 1, 'yudao-admin-server', 1002009003, '文件为空', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4655, 1, 'yudao-admin-server', 1002011000, '短信渠道不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4656, 1, 'yudao-admin-server', 1002011001, '短信渠道不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4657, 1, 'yudao-admin-server', 1002011002, '无法删除,该短信渠道还有短信模板', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4658, 1, 'yudao-admin-server', 1002011000, '短信模板不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4659, 1, 'yudao-admin-server', 1002011001, '已经存在编码为【{}】的短信模板', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4660, 1, 'yudao-admin-server', 1002012000, '租户不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4661, 1, 'yudao-admin-server', 1002013000, '错误码不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4662, 1, 'yudao-admin-server', 1002013001, '已经存在编码为【{}】的错误码', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4663, 1, 'yudao-admin-server', 1009000002, '获取高亮流程图异常', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4664, 1, 'yudao-admin-server', 1009001001, '请假申请不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4665, 1, 'yudao-admin-server', 1009001002, '项目经理岗位未设置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4666, 1, 'yudao-admin-server', 1009001009, '部门的项目经理不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4667, 1, 'yudao-admin-server', 1009001004, '部门经理岗位未设置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4668, 1, 'yudao-admin-server', 1009001005, '部门的部门经理不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4669, 1, 'yudao-admin-server', 1009001006, 'HR岗位未设置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4670, 1, 'yudao-admin-server', 1009001007, '请假天数必须>=1', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4671, 1, 'yudao-admin-server', 1009002000, '已经存在流程标识为【{}】的流程', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4672, 1, 'yudao-admin-server', 1009002001, '流程模型不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4673, 1, 'yudao-admin-server', 1009002002, '流程标识格式不正确,需要以字母或下划线开头,后接任意字母、数字、中划线、下划线、句点!', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4674, 1, 'yudao-admin-server', 1009002003, '部署流程失败,原因:流程表单未配置,请点击【修改流程】按钮进行配置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4675, 1, 'yudao-admin-server', 1009002004, '部署流程失败,原因:用户任务({})未配置分配规则,请点击【修改流程】按钮进行配置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4676, 1, 'yudao-admin-server', 1009003005, '流程定义部署失败,原因:信息未发生变化', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4677, 1, 'yudao-admin-server', 1009003000, '流程定义的标识期望是({}),当前是({}),请修改 BPMN 流程图', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4678, 1, 'yudao-admin-server', 1009003001, '流程定义的名字期望是({}),当前是({}),请修改 BPMN 流程图', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4679, 1, 'yudao-admin-server', 1009003002, '流程定义不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4680, 1, 'yudao-admin-server', 1009003003, '流程定义处于挂起状态', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4681, 1, 'yudao-admin-server', 1009003004, '流程定义的模型不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4682, 1, 'yudao-admin-server', 1009004000, '流程实例不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4683, 1, 'yudao-admin-server', 1009004001, '流程取消失败,流程不处于运行中', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4684, 1, 'yudao-admin-server', 1009004002, '流程取消失败,该流程不是你发起的', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4685, 1, 'yudao-admin-server', 1009004000, '审批任务失败,原因:该任务不处于未审批', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4686, 1, 'yudao-admin-server', 1009004001, '审批任务失败,原因:该任务的审批人不是你', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4687, 1, 'yudao-admin-server', 1009006000, '流程({}) 的任务({}) 已经存在分配规则', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4688, 1, 'yudao-admin-server', 1009006001, '流程任务分配规则不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4689, 1, 'yudao-admin-server', 1009006002, '只有流程模型的任务分配规则,才允许被修改', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4690, 1, 'yudao-admin-server', 1009006003, '操作失败,原因:找不到任务的审批人!', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4691, 1, 'yudao-admin-server', 1009006004, '操作失败,原因:任务分配脚本({}) 不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4692, 1, 'yudao-admin-server', 1009010000, '动态表单不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4693, 1, 'yudao-admin-server', 1009010000, '表单项({}) 和 ({}) 使用了相同的字段名({})', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4694, 1, 'yudao-admin-server', 1009011000, '用户组不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); -INSERT INTO `sys_error_code` VALUES (4695, 1, 'yudao-admin-server', 1009011001, '名字为【{}】的用户组已被禁用', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4594, 1, 'yudao-admin-server', 1001000001, '参数配置不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4595, 1, 'yudao-admin-server', 1001000002, '参数配置 key 重复', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4596, 1, 'yudao-admin-server', 1001000003, '不能删除类型为系统内置的参数配置', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4597, 1, 'yudao-admin-server', 1001000004, '不允许获取敏感配置到前端', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4598, 1, 'yudao-admin-server', 1001001000, '定时任务不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4599, 1, 'yudao-admin-server', 1001001001, '定时任务的处理器已经存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4600, 1, 'yudao-admin-server', 1001001002, '只允许修改为开启或者关闭状态', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4601, 1, 'yudao-admin-server', 1001001003, '定时任务已经处于该状态,无需修改', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4602, 1, 'yudao-admin-server', 1001001004, '只有开启状态的任务,才可以修改', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4603, 1, 'yudao-admin-server', 1001001005, 'CRON 表达式不正确', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4604, 1, 'yudao-admin-server', 1001002000, 'API 错误日志不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4605, 1, 'yudao-admin-server', 1001002001, 'API 错误日志已处理', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4606, 1, 'yudao-admin-server', 1002000000, '登录失败,账号密码不正确', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4607, 1, 'yudao-admin-server', 1002000001, '登录失败,账号被禁用', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4608, 1, 'yudao-admin-server', 1002000002, '登录失败', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4609, 1, 'yudao-admin-server', 1002000003, '验证码不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4610, 1, 'yudao-admin-server', 1002000004, '验证码不正确', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4611, 1, 'yudao-admin-server', 1002000005, '未绑定账号,需要进行绑定', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4612, 1, 'yudao-admin-server', 1002000006, 'Token 已经过期', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4613, 1, 'yudao-admin-server', 1002002000, '已经存在该名字的菜单', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4614, 1, 'yudao-admin-server', 1002002001, '父菜单不存在', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4615, 1, 'yudao-admin-server', 1002002002, '不能设置自己为父菜单', '', NULL, '2022-01-23 01:38:31', NULL, '2022-01-23 01:38:31', b'0'); +INSERT INTO `system_error_code` VALUES (4616, 1, 'yudao-admin-server', 1002002003, '菜单不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4617, 1, 'yudao-admin-server', 1002002004, '存在子菜单,无法删除', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4618, 1, 'yudao-admin-server', 1002002005, '父菜单的类型必须是目录或者菜单', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4619, 1, 'yudao-admin-server', 1002003000, '角色不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4620, 1, 'yudao-admin-server', 1002003001, '已经存在名为【{}】的角色', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4621, 1, 'yudao-admin-server', 1002003002, '已经存在编码为【{}】的角色', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4622, 1, 'yudao-admin-server', 1002003004, '名字为【{}】的角色已被禁用', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4623, 1, 'yudao-admin-server', 1002003004, '名字为【{}】的角色已被禁用', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4624, 1, 'yudao-admin-server', 1002004000, '用户账号已经存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4625, 1, 'yudao-admin-server', 1002004001, '手机号已经存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4626, 1, 'yudao-admin-server', 1002004002, '邮箱已经存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4627, 1, 'yudao-admin-server', 1002004003, '用户不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4628, 1, 'yudao-admin-server', 1002004004, '导入用户数据不能为空!', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4629, 1, 'yudao-admin-server', 1002004005, '用户密码校验失败', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4630, 1, 'yudao-admin-server', 1002003004, '名字为【{}】的用户已被禁用', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4631, 1, 'yudao-admin-server', 1002004001, '已经存在该名字的部门', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4632, 1, 'yudao-admin-server', 1002004002, '父级部门不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4633, 1, 'yudao-admin-server', 1002004003, '当前部门不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4634, 1, 'yudao-admin-server', 1002004004, '存在子部门,无法删除', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4635, 1, 'yudao-admin-server', 1002004005, '不能设置自己为父部门', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4636, 1, 'yudao-admin-server', 1002004006, '部门中存在员工,无法删除', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4637, 1, 'yudao-admin-server', 1002004007, '部门不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4638, 1, 'yudao-admin-server', 1002004008, '不能设置自己的子部门为父部门', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4639, 1, 'yudao-admin-server', 1002005001, '已经存在该名字的岗位', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4640, 1, 'yudao-admin-server', 1002005002, '岗位({}) 不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4641, 1, 'yudao-admin-server', 1002005001, '已经存在该名字的岗位', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4642, 1, 'yudao-admin-server', 1002005001, '已经存在该标识的岗位', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4643, 1, 'yudao-admin-server', 1002006001, '当前字典类型不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4644, 1, 'yudao-admin-server', 1002006002, '字典类型不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4645, 1, 'yudao-admin-server', 1002006003, '已经存在该名字的字典类型', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4646, 1, 'yudao-admin-server', 1002006004, '已经存在该类型的字典类型', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4647, 1, 'yudao-admin-server', 1002006004, '无法删除,该字典类型还有字典数据', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4648, 1, 'yudao-admin-server', 1002007001, '当前字典数据不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4649, 1, 'yudao-admin-server', 1002007002, '字典数据({})不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4650, 1, 'yudao-admin-server', 1002007003, '已经存在该值的字典数据', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4651, 1, 'yudao-admin-server', 1002008001, '当前通知公告不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4652, 1, 'yudao-admin-server', 1002009001, '文件路径已经存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4653, 1, 'yudao-admin-server', 1002009002, '文件上传失败', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4654, 1, 'yudao-admin-server', 1002009003, '文件为空', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4655, 1, 'yudao-admin-server', 1002011000, '短信渠道不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4656, 1, 'yudao-admin-server', 1002011001, '短信渠道不处于开启状态,不允许选择', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4657, 1, 'yudao-admin-server', 1002011002, '无法删除,该短信渠道还有短信模板', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4658, 1, 'yudao-admin-server', 1002011000, '短信模板不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4659, 1, 'yudao-admin-server', 1002011001, '已经存在编码为【{}】的短信模板', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4660, 1, 'yudao-admin-server', 1002012000, '手机号不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4661, 1, 'yudao-admin-server', 1002013000, '验证码不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4662, 1, 'yudao-admin-server', 1002013001, '验证码已过期', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4663, 1, 'yudao-admin-server', 1009000002, '获取高亮流程图异常', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4664, 1, 'yudao-admin-server', 1009001001, '请假申请不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4665, 1, 'yudao-admin-server', 1009001002, '项目经理岗位未设置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4666, 1, 'yudao-admin-server', 1009001009, '部门的项目经理不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4667, 1, 'yudao-admin-server', 1009001004, '部门经理岗位未设置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4668, 1, 'yudao-admin-server', 1009001005, '部门的部门经理不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4669, 1, 'yudao-admin-server', 1009001006, 'HR岗位未设置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4670, 1, 'yudao-admin-server', 1009001007, '请假天数必须>=1', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4671, 1, 'yudao-admin-server', 1009002000, '已经存在流程标识为【{}】的流程', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4672, 1, 'yudao-admin-server', 1009002001, '流程模型不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4673, 1, 'yudao-admin-server', 1009002002, '流程标识格式不正确,需要以字母或下划线开头,后接任意字母、数字、中划线、下划线、句点!', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4674, 1, 'yudao-admin-server', 1009002003, '部署流程失败,原因:流程表单未配置,请点击【修改流程】按钮进行配置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4675, 1, 'yudao-admin-server', 1009002004, '部署流程失败,原因:用户任务({})未配置分配规则,请点击【修改流程】按钮进行配置', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4676, 1, 'yudao-admin-server', 1009003005, '流程定义部署失败,原因:信息未发生变化', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4677, 1, 'yudao-admin-server', 1009003000, '流程定义的标识期望是({}),当前是({}),请修改 BPMN 流程图', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4678, 1, 'yudao-admin-server', 1009003001, '流程定义的名字期望是({}),当前是({}),请修改 BPMN 流程图', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4679, 1, 'yudao-admin-server', 1009003002, '流程定义不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4680, 1, 'yudao-admin-server', 1009003003, '流程定义处于挂起状态', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4681, 1, 'yudao-admin-server', 1009003004, '流程定义的模型不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4682, 1, 'yudao-admin-server', 1009004000, '流程实例不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4683, 1, 'yudao-admin-server', 1009004001, '流程取消失败,流程不处于运行中', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4684, 1, 'yudao-admin-server', 1009004002, '流程取消失败,该流程不是你发起的', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4685, 1, 'yudao-admin-server', 1009004000, '审批任务失败,原因:该任务不处于未审批', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4686, 1, 'yudao-admin-server', 1009004001, '审批任务失败,原因:该任务的审批人不是你', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4687, 1, 'yudao-admin-server', 1009006000, '流程({}) 的任务({}) 已经存在分配规则', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4688, 1, 'yudao-admin-server', 1009006001, '流程任务分配规则不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4689, 1, 'yudao-admin-server', 1009006002, '只有流程模型的任务分配规则,才允许被修改', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4690, 1, 'yudao-admin-server', 1009006003, '操作失败,原因:找不到任务的审批人!', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4691, 1, 'yudao-admin-server', 1009006004, '操作失败,原因:任务分配脚本({}) 不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4692, 1, 'yudao-admin-server', 1009010000, '动态表单不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4693, 1, 'yudao-admin-server', 1009010000, '表单项({}) 和 ({}) 使用了相同的字段名({})', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4694, 1, 'yudao-admin-server', 1009011000, '用户组不存在', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4695, 1, 'yudao-admin-server', 1009011001, '名字为【{}】的用户组已被禁用', '', NULL, '2022-01-23 01:38:32', NULL, '2022-01-23 01:38:32', b'0'); +INSERT INTO `system_error_code` VALUES (4696, 1, 'yudao-admin-server', 1001003000, '文件路径已存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4697, 1, 'yudao-admin-server', 1001003001, '文件不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4698, 1, 'yudao-admin-server', 1004001000, '用户不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4699, 1, 'yudao-admin-server', 1004001001, '密码校验失败', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4700, 1, 'yudao-admin-server', 1004002000, '文件为空', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4701, 1, 'yudao-admin-server', 1004003000, '登录失败,账号密码不正确', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4702, 1, 'yudao-admin-server', 1004003001, '登录失败,账号被禁用', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4703, 1, 'yudao-admin-server', 1004003002, '登录失败', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4704, 1, 'yudao-admin-server', 1004003004, 'Token 已经过期', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4705, 1, 'yudao-admin-server', 1004003005, '未绑定账号,需要进行绑定', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4706, 1, 'yudao-admin-server', 1007000000, 'App 不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4707, 1, 'yudao-admin-server', 1007000002, 'App 已经被禁用', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4708, 1, 'yudao-admin-server', 1007000003, '支付应用存在交易中的订单,无法删除', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4709, 1, 'yudao-admin-server', 1007001000, '支付渠道的配置不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4710, 1, 'yudao-admin-server', 1007001001, '支付渠道已经禁用', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4711, 1, 'yudao-admin-server', 1007001002, '支付渠道的客户端不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4712, 1, 'yudao-admin-server', 1007001003, '支付渠道不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4713, 1, 'yudao-admin-server', 1007001005, '已存在相同的渠道', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4714, 1, 'yudao-admin-server', 1007001006, '微信渠道v2版本中商户密钥不可为空', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4715, 1, 'yudao-admin-server', 1007001007, '微信渠道v3版本apiclient_key.pem不可为空', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4716, 1, 'yudao-admin-server', 1007001008, '微信渠道v3版本中apiclient_cert.pem不可为空', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4717, 1, 'yudao-admin-server', 1007001009, '渠道通知校验失败', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4718, 1, 'yudao-admin-server', 1007002000, '支付订单不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4719, 1, 'yudao-admin-server', 1007002001, '支付订单不处于待支付', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4720, 1, 'yudao-admin-server', 1007002002, '支付订单不处于已支付', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4721, 1, 'yudao-admin-server', 1007002003, '支付订单用户不正确', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4722, 1, 'yudao-admin-server', 1007003000, '支付交易拓展单不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4723, 1, 'yudao-admin-server', 1007003001, '支付交易拓展单不处于待支付', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4724, 1, 'yudao-admin-server', 1007003002, '支付订单不处于已支付', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4725, 1, 'yudao-admin-server', 1007006000, '退款金额超过订单可退款金额', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4726, 1, 'yudao-admin-server', 1007006001, '订单已经全额退款', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4727, 1, 'yudao-admin-server', 1007006002, '该订单的渠道订单为空', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4728, 1, 'yudao-admin-server', 1007006003, '已经退款成功', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4729, 1, 'yudao-admin-server', 1007006004, '支付退款单不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4730, 1, 'yudao-admin-server', 1007004000, '支付商户信息不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4731, 1, 'yudao-admin-server', 1007004001, '支付商户存在支付应用,无法删除', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4732, 1, 'yudao-admin-server', 1002012001, '模板参数({})缺失', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4733, 1, 'yudao-admin-server', 1002012002, '短信模板不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4734, 1, 'yudao-admin-server', 1002013002, '验证码已使用', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4735, 1, 'yudao-admin-server', 1002013004, '验证码不正确', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4736, 1, 'yudao-admin-server', 1002013005, '超过每日短信发送数量', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4737, 1, 'yudao-admin-server', 1002013006, '短信发送过于频率', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4738, 1, 'yudao-admin-server', 1002013007, '手机号已被使用', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4739, 1, 'yudao-admin-server', 1002013008, '验证码未被使用', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4740, 1, 'yudao-admin-server', 1002014000, '租户不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4741, 1, 'yudao-admin-server', 1002015000, '错误码不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4742, 1, 'yudao-admin-server', 1002015001, '社交解绑失败,非当前用户绑定', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:20:38', b'0'); +INSERT INTO `system_error_code` VALUES (4743, 1, 'yudao-admin-server', 1002015000, '社交授权失败,原因是:{}', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4744, 1, 'yudao-admin-server', 1002015001, '社交解绑失败,非当前用户绑定', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4745, 1, 'yudao-admin-server', 1002015001, '社交授权失败,找不到对应的用户', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4746, 1, 'yudao-admin-server', 1003000000, '测试示例不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4747, 1, 'yudao-admin-server', 1003001000, '表定义已经存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4748, 1, 'yudao-admin-server', 1003001001, '导入的表不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4749, 1, 'yudao-admin-server', 1003001002, '导入的字段不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4750, 1, 'yudao-admin-server', 1003001003, '解析 SQL 失败,请检查', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4751, 1, 'yudao-admin-server', 1003001004, '表定义不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4752, 1, 'yudao-admin-server', 1003001005, '字段义不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4753, 1, 'yudao-admin-server', 1003001006, '同步的字段不存在', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); +INSERT INTO `system_error_code` VALUES (4754, 1, 'yudao-admin-server', 1003001007, '同步失败,不存在改变', '', NULL, '2022-02-02 01:11:46', NULL, '2022-02-02 01:11:46', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_login_log +-- Table structure for system_login_log -- ---------------------------- -DROP TABLE IF EXISTS `sys_login_log`; -CREATE TABLE `sys_login_log` ( +DROP TABLE IF EXISTS `system_login_log`; +CREATE TABLE `system_login_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID', `log_type` bigint NOT NULL COMMENT '日志类型', `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', @@ -1817,19 +2288,70 @@ CREATE TABLE `sys_login_log` ( `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=764 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统访问记录'; +) ENGINE=InnoDB AUTO_INCREMENT=815 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统访问记录'; -- ---------------------------- --- Records of sys_login_log +-- Records of system_login_log -- ---------------------------- BEGIN; +INSERT INTO `system_login_log` VALUES (764, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 01:42:39', NULL, '2022-01-23 01:42:39', b'0', 0); +INSERT INTO `system_login_log` VALUES (765, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 03:21:32', NULL, '2022-01-23 03:21:32', b'0', 0); +INSERT INTO `system_login_log` VALUES (766, 200, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 04:10:38', NULL, '2022-01-23 04:10:38', b'0', 0); +INSERT INTO `system_login_log` VALUES (767, 200, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 04:10:38', NULL, '2022-01-23 04:10:38', b'0', 0); +INSERT INTO `system_login_log` VALUES (768, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 04:19:53', NULL, '2022-01-23 04:19:53', b'0', 0); +INSERT INTO `system_login_log` VALUES (769, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 12:40:59', NULL, '2022-01-23 12:40:59', b'0', 0); +INSERT INTO `system_login_log` VALUES (770, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 13:24:43', NULL, '2022-01-23 13:24:43', b'0', 0); +INSERT INTO `system_login_log` VALUES (771, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-24 07:50:09', NULL, '2022-01-24 07:50:09', b'0', 0); +INSERT INTO `system_login_log` VALUES (772, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 09:49:07', NULL, '2022-01-28 09:49:07', b'0', 0); +INSERT INTO `system_login_log` VALUES (773, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 20:39:33', NULL, '2022-01-28 20:39:33', b'0', 0); +INSERT INTO `system_login_log` VALUES (774, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:22:31', NULL, '2022-01-28 21:22:31', b'0', 0); +INSERT INTO `system_login_log` VALUES (775, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:22:44', NULL, '2022-01-28 21:22:44', b'0', 0); +INSERT INTO `system_login_log` VALUES (776, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:23:20', NULL, '2022-01-28 21:23:20', b'0', 0); +INSERT INTO `system_login_log` VALUES (777, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:23:22', NULL, '2022-01-28 21:23:22', b'0', 0); +INSERT INTO `system_login_log` VALUES (778, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:23:35', NULL, '2022-01-28 21:23:35', b'0', 0); +INSERT INTO `system_login_log` VALUES (779, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:24:02', NULL, '2022-01-28 21:24:02', b'0', 0); +INSERT INTO `system_login_log` VALUES (780, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:25:00', NULL, '2022-01-28 21:25:00', b'0', 0); +INSERT INTO `system_login_log` VALUES (781, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:25:14', NULL, '2022-01-28 21:25:14', b'0', 0); +INSERT INTO `system_login_log` VALUES (782, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:26:46', NULL, '2022-01-28 21:26:46', b'0', 0); +INSERT INTO `system_login_log` VALUES (783, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:26:47', NULL, '2022-01-28 21:26:47', b'0', 0); +INSERT INTO `system_login_log` VALUES (784, 100, '', 1, 2, 'admin', 10, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:26:57', NULL, '2022-01-28 21:26:57', b'0', 0); +INSERT INTO `system_login_log` VALUES (785, 100, '', 1, 2, 'admin', 10, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:27:28', NULL, '2022-01-28 21:27:28', b'0', 0); +INSERT INTO `system_login_log` VALUES (786, 100, '', 1, 2, 'admin', 10, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:40:29', NULL, '2022-01-28 21:40:29', b'0', 0); +INSERT INTO `system_login_log` VALUES (787, 100, '', 1, 2, 'admin', 10, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:42:30', NULL, '2022-01-28 21:42:30', b'0', 0); +INSERT INTO `system_login_log` VALUES (788, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:42:41', NULL, '2022-01-28 21:42:41', b'0', 0); +INSERT INTO `system_login_log` VALUES (789, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 23:21:07', NULL, '2022-01-28 23:21:07', b'0', 0); +INSERT INTO `system_login_log` VALUES (790, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 23:21:10', NULL, '2022-01-28 23:21:10', b'0', 0); +INSERT INTO `system_login_log` VALUES (791, 100, '', 0, 0, '15601691300', 10, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 00:37:24', NULL, '2022-01-29 00:37:24', b'0', 0); +INSERT INTO `system_login_log` VALUES (792, 100, '', 245, 0, '15601691300', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 00:37:51', NULL, '2022-01-29 00:37:51', b'0', 0); +INSERT INTO `system_login_log` VALUES (793, 100, '', 245, 0, '15601691300', 10, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 00:37:59', NULL, '2022-01-29 00:37:59', b'0', 0); +INSERT INTO `system_login_log` VALUES (794, 100, '', 245, 0, '15601691300', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 11:50:08', NULL, '2022-01-29 11:50:08', b'0', 0); +INSERT INTO `system_login_log` VALUES (795, 100, '', 245, 0, '15601691300', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 13:58:04', NULL, '2022-01-29 13:58:04', b'0', 0); +INSERT INTO `system_login_log` VALUES (796, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 16:34:19', NULL, '2022-01-29 16:34:19', b'0', 0); +INSERT INTO `system_login_log` VALUES (797, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 16:47:54', NULL, '2022-01-29 16:47:54', b'0', 0); +INSERT INTO `system_login_log` VALUES (798, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 16:48:14', NULL, '2022-01-29 16:48:14', b'0', 0); +INSERT INTO `system_login_log` VALUES (799, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-30 23:30:54', NULL, '2022-01-30 23:30:54', b'0', 0); +INSERT INTO `system_login_log` VALUES (800, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 13:30:40', NULL, '2022-01-31 13:30:40', b'0', 0); +INSERT INTO `system_login_log` VALUES (801, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:12:35', NULL, '2022-01-31 17:12:35', b'0', 0); +INSERT INTO `system_login_log` VALUES (802, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:12:51', NULL, '2022-01-31 17:12:51', b'0', 0); +INSERT INTO `system_login_log` VALUES (803, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:15:38', NULL, '2022-01-31 17:15:38', b'0', 0); +INSERT INTO `system_login_log` VALUES (804, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:36:10', NULL, '2022-01-31 17:36:10', b'0', 0); +INSERT INTO `system_login_log` VALUES (805, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:45:45', NULL, '2022-01-31 17:45:45', b'0', 0); +INSERT INTO `system_login_log` VALUES (806, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:45:53', NULL, '2022-01-31 17:45:53', b'0', 0); +INSERT INTO `system_login_log` VALUES (807, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:47:25', NULL, '2022-01-31 17:47:25', b'0', 0); +INSERT INTO `system_login_log` VALUES (808, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-02-01 21:46:34', NULL, '2022-02-01 21:46:34', b'0', 0); +INSERT INTO `system_login_log` VALUES (809, 102, '', 1, 2, 'admin', 0, '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-02-01 21:56:07', NULL, '2022-02-01 21:56:07', b'0', 0); +INSERT INTO `system_login_log` VALUES (810, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-01 22:57:32', NULL, '2022-02-01 22:57:32', b'0', 0); +INSERT INTO `system_login_log` VALUES (811, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-02 00:24:35', NULL, '2022-02-02 00:24:35', b'0', 0); +INSERT INTO `system_login_log` VALUES (812, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-02 00:25:21', NULL, '2022-02-02 00:25:21', b'0', 0); +INSERT INTO `system_login_log` VALUES (813, 200, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-02 00:26:41', NULL, '2022-02-02 00:26:41', b'0', 0); +INSERT INTO `system_login_log` VALUES (814, 100, '', 1, 2, 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-02 00:27:55', NULL, '2022-02-02 00:27:55', b'0', 0); COMMIT; -- ---------------------------- --- Table structure for sys_menu +-- Table structure for system_menu -- ---------------------------- -DROP TABLE IF EXISTS `sys_menu`; -CREATE TABLE `sys_menu` ( +DROP TABLE IF EXISTS `system_menu`; +CREATE TABLE `system_menu` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID', `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单名称', `permission` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限标识', @@ -1850,244 +2372,244 @@ CREATE TABLE `sys_menu` ( ) ENGINE=InnoDB AUTO_INCREMENT=1223 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='菜单权限表'; -- ---------------------------- --- Records of sys_menu +-- Records of system_menu -- ---------------------------- BEGIN; -INSERT INTO `sys_menu` VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'system', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:08', b'0', 0); -INSERT INTO `sys_menu` VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'monitor', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:18', b'0', 0); -INSERT INTO `sys_menu` VALUES (3, '研发工具', '', 1, 30, 0, '/tool', 'tool', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:13', b'0', 0); -INSERT INTO `sys_menu` VALUES (4, '若依官网', '', 1, 4, 0, 'http://ruoyi.vip', 'guide', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 21:54:28', b'1', 0); -INSERT INTO `sys_menu` VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'people', NULL, 0, 'admin', '2021-09-20 16:26:19', '1', '2022-01-22 18:32:50', b'0', 0); -INSERT INTO `sys_menu` VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0', 0); -INSERT INTO `sys_menu` VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'peoples', 'system/role/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:49', b'0', 0); -INSERT INTO `sys_menu` VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:28', b'0', 0); -INSERT INTO `sys_menu` VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'tree', 'system/dept/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:19', b'0', 0); -INSERT INTO `sys_menu` VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'post', 'system/post/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:23', b'0', 0); -INSERT INTO `sys_menu` VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'dict', 'system/dict/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:16:58', b'0', 0); -INSERT INTO `sys_menu` VALUES (106, '配置管理', '', 2, 1, 2, 'config', 'edit', 'infra/config/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:10', b'0', 0); -INSERT INTO `sys_menu` VALUES (107, '通知公告', '', 2, 8, 1, 'notice', 'message', 'system/notice/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:39', b'0', 0); -INSERT INTO `sys_menu` VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'log', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-04-26 22:34:58', b'0', 0); -INSERT INTO `sys_menu` VALUES (109, '在线用户', 'system:user-session:list', 2, 10, 1, 'user-session', 'online', 'system/session/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (110, '定时任务', '', 2, 2, 2, 'job', 'job', 'infra/job/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:25:51', b'0', 0); -INSERT INTO `sys_menu` VALUES (111, 'MySQL 监控', '', 2, 4, 2, 'druid', 'druid', 'infra/druid/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:32', b'0', 0); -INSERT INTO `sys_menu` VALUES (112, 'Java 监控', '', 2, 6, 2, 'admin-server', 'server', 'infra/server', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (113, 'Redis 监控', '', 2, 5, 2, 'redis', 'redis', 'infra/redis/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:37', b'0', 0); -INSERT INTO `sys_menu` VALUES (114, '表单构建', 'tool:build:list', 2, 1, 3, 'build', 'build', 'tool/build/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0', 0); -INSERT INTO `sys_menu` VALUES (115, '代码生成', 'tool:codegen:query', 2, 0, 3, 'codegen', 'code', 'tool/codegen/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-06 03:43:14', b'0', 0); -INSERT INTO `sys_menu` VALUES (116, '系统接口', 'tool:swagger:list', 2, 3, 3, 'swagger', 'swagger', 'tool/swagger/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0', 0); -INSERT INTO `sys_menu` VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'form', 'system/operatelog/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:42:56', b'0', 0); -INSERT INTO `sys_menu` VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'logininfor', 'system/loginlog/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:39:23', b'0', 0); -INSERT INTO `sys_menu` VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:21:47', b'0', 0); -INSERT INTO `sys_menu` VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:21:54', b'0', 0); -INSERT INTO `sys_menu` VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:22:03', b'0', 0); -INSERT INTO `sys_menu` VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:20:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:24', b'0', 0); -INSERT INTO `sys_menu` VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:14', b'0', 0); -INSERT INTO `sys_menu` VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:05', b'0', 0); -INSERT INTO `sys_menu` VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:36', b'0', 0); -INSERT INTO `sys_menu` VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:30', b'0', 0); -INSERT INTO `sys_menu` VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:45', b'0', 0); -INSERT INTO `sys_menu` VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:30', b'0', 0); -INSERT INTO `sys_menu` VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:37', b'0', 0); -INSERT INTO `sys_menu` VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:34', b'0', 0); -INSERT INTO `sys_menu` VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:48', b'0', 0); -INSERT INTO `sys_menu` VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:29', b'0', 0); -INSERT INTO `sys_menu` VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:36', b'0', 0); -INSERT INTO `sys_menu` VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:45', b'0', 0); -INSERT INTO `sys_menu` VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:00', b'0', 0); -INSERT INTO `sys_menu` VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:18', b'0', 0); -INSERT INTO `sys_menu` VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:30', b'0', 0); -INSERT INTO `sys_menu` VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:36', b'0', 0); -INSERT INTO `sys_menu` VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:19', b'0', 0); -INSERT INTO `sys_menu` VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:48', b'0', 0); -INSERT INTO `sys_menu` VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:52:01', b'0', 0); -INSERT INTO `sys_menu` VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:10', b'0', 0); -INSERT INTO `sys_menu` VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:23', b'0', 0); -INSERT INTO `sys_menu` VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:26', b'0', 0); -INSERT INTO `sys_menu` VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:30', b'0', 0); -INSERT INTO `sys_menu` VALUES (1046, '在线查询', 'system:user-session:list', 3, 1, 109, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:22:37', b'0', 0); -INSERT INTO `sys_menu` VALUES (1047, '批量强退', 'monitor:online:batchLogout', 3, 2, 109, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:46', b'1', 0); -INSERT INTO `sys_menu` VALUES (1048, '单条强退', 'system:user-session:delete', 3, 3, 109, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:22:54', b'0', 0); -INSERT INTO `sys_menu` VALUES (1049, '任务查询', 'monitor:job:query', 3, 1, 110, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:01:42', b'1', 0); -INSERT INTO `sys_menu` VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:01:58', b'0', 0); -INSERT INTO `sys_menu` VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:02:10', b'0', 0); -INSERT INTO `sys_menu` VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:02:22', b'0', 0); -INSERT INTO `sys_menu` VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:02:38', b'0', 0); -INSERT INTO `sys_menu` VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:02:51', b'0', 0); -INSERT INTO `sys_menu` VALUES (1055, '生成查询', 'tool:gen:query', 3, 1, 115, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:23:25', b'1', 0); -INSERT INTO `sys_menu` VALUES (1056, '生成修改', 'tool:codegen:update', 3, 2, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:23:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1057, '生成删除', 'tool:codegen:delete', 3, 3, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:24:02', b'0', 0); -INSERT INTO `sys_menu` VALUES (1058, '导入代码', 'tool:codegen:create', 3, 2, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:23:50', b'0', 0); -INSERT INTO `sys_menu` VALUES (1059, '预览代码', 'tool:codegen:preview', 3, 4, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:24:10', b'0', 0); -INSERT INTO `sys_menu` VALUES (1060, '生成代码', 'tool:codegen:download', 3, 5, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:24:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', 0, '', '2021-01-06 17:53:44', '', '2021-01-06 17:55:23', b'0', 0); -INSERT INTO `sys_menu` VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', 0, '', '2021-01-06 17:56:31', '', '2021-01-06 17:56:31', b'0', 0); -INSERT INTO `sys_menu` VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', 0, '', '2021-01-07 10:23:28', '', '2021-01-07 10:23:28', b'0', 0); -INSERT INTO `sys_menu` VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', 0, '', '2021-01-26 01:02:31', '', '2021-01-26 01:02:31', b'0', 0); -INSERT INTO `sys_menu` VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', 0, '', '2021-01-26 01:02:52', '', '2021-01-26 01:02:52', b'0', 0); -INSERT INTO `sys_menu` VALUES (1070, '代码生成示例', 'tool:test-demo:query', 2, 0, 3, 'test-demo', 'validCode', 'tool/testDemo/index', 0, '', '2021-02-06 12:42:49', '', '2021-03-06 03:45:22', b'0', 0); -INSERT INTO `sys_menu` VALUES (1071, '测试示例表创建', 'tool:test-demo:create', 3, 1, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:47', b'0', 0); -INSERT INTO `sys_menu` VALUES (1072, '测试示例表更新', 'tool:test-demo:update', 3, 2, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:51', b'0', 0); -INSERT INTO `sys_menu` VALUES (1073, '测试示例表删除', 'tool:test-demo:delete', 3, 3, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:58', b'0', 0); -INSERT INTO `sys_menu` VALUES (1074, '测试示例表导出', 'tool:test-demo:export', 3, 4, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:54:01', b'0', 0); -INSERT INTO `sys_menu` VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', 0, '', '2021-02-07 13:03:10', '', '2021-02-07 13:03:10', b'0', 0); -INSERT INTO `sys_menu` VALUES (1076, '数据库文档', '', 2, 5, 3, 'db-doc', 'table', 'tool/dbDoc/index', 0, '', '2021-02-08 01:41:47', '', '2021-02-08 01:49:00', b'0', 0); -INSERT INTO `sys_menu` VALUES (1077, '链路追踪', '', 2, 7, 2, 'skywalking', 'eye-open', 'infra/skywalking', 0, '', '2021-02-08 20:41:31', '', '2021-02-26 02:18:45', b'0', 0); -INSERT INTO `sys_menu` VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'log', 'infra/apiAccessLog/index', 0, '', '2021-02-26 01:32:59', '1', '2021-03-10 01:28:09', b'0', 0); -INSERT INTO `sys_menu` VALUES (1079, 'API 访问日志表创建', 'system:api-access-log:create', 3, 1, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:00', b'1', 0); -INSERT INTO `sys_menu` VALUES (1080, 'API 访问日志表更新', 'system:api-access-log:update', 3, 2, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:08', b'1', 0); -INSERT INTO `sys_menu` VALUES (1081, 'API 访问日志表删除', 'system:api-access-log:delete', 3, 3, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:27', b'1', 0); -INSERT INTO `sys_menu` VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', 0, '', '2021-02-26 01:32:59', '1', '2021-03-10 01:28:13', b'0', 0); -INSERT INTO `sys_menu` VALUES (1083, 'API 日志', '', 2, 3, 2, 'log', 'log', NULL, 0, '', '2021-02-26 02:18:24', '', '2021-02-26 02:20:17', b'0', 0); -INSERT INTO `sys_menu` VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'log', 'infra/apiErrorLog/index', 0, '', '2021-02-26 07:53:20', '', '2021-02-26 07:54:40', b'0', 0); -INSERT INTO `sys_menu` VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', 0, '', '2021-02-26 07:53:20', '1', '2021-03-10 01:28:18', b'0', 0); -INSERT INTO `sys_menu` VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', 0, '', '2021-02-26 07:53:20', '1', '2021-03-10 01:28:21', b'0', 0); -INSERT INTO `sys_menu` VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', 0, '1', '2021-03-10 01:26:19', '1', '2021-03-10 01:26:19', b'0', 0); -INSERT INTO `sys_menu` VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', 0, '1', '2021-03-10 01:28:04', '1', '2021-03-10 01:29:38', b'0', 0); -INSERT INTO `sys_menu` VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', 0, '1', '2021-03-10 01:29:09', '1', '2021-03-10 01:29:09', b'0', 0); -INSERT INTO `sys_menu` VALUES (1090, '文件管理', '', 2, 0, 2, 'file', 'upload', 'infra/file/index', 0, '', '2021-03-12 20:16:20', '1', '2021-03-13 11:07:05', b'0', 0); -INSERT INTO `sys_menu` VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', 0, '', '2021-03-12 20:16:20', '', '2021-03-12 20:16:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', 0, '', '2021-03-12 20:16:20', '', '2021-03-12 20:16:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (1093, '短信管理', '', 1, 11, 1, 'sms', 'validCode', NULL, 0, '1', '2021-04-05 01:10:16', '1', '2021-04-05 01:11:38', b'0', 0); -INSERT INTO `sys_menu` VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'phone', 'system/sms/smsChannel', 0, '', '2021-04-01 11:07:15', '1', '2021-04-09 23:44:07', b'0', 0); -INSERT INTO `sys_menu` VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', 0, '', '2021-04-01 11:07:15', '', '2021-04-01 11:07:15', b'0', 0); -INSERT INTO `sys_menu` VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', 0, '', '2021-04-01 11:07:15', '', '2021-04-01 11:07:15', b'0', 0); -INSERT INTO `sys_menu` VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', 0, '', '2021-04-01 11:07:15', '', '2021-04-01 11:07:15', b'0', 0); -INSERT INTO `sys_menu` VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', 0, '', '2021-04-01 11:07:15', '', '2021-04-01 11:07:15', b'0', 0); -INSERT INTO `sys_menu` VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'phone', 'system/sms/smsTemplate', 0, '', '2021-04-01 17:35:17', '1', '2021-04-11 19:34:21', b'0', 0); -INSERT INTO `sys_menu` VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); -INSERT INTO `sys_menu` VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); -INSERT INTO `sys_menu` VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); -INSERT INTO `sys_menu` VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); -INSERT INTO `sys_menu` VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); -INSERT INTO `sys_menu` VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', 0, '1', '2021-04-11 00:26:40', '1', '2021-04-11 00:26:40', b'0', 0); -INSERT INTO `sys_menu` VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'phone', 'system/sms/smsLog', 0, '', '2021-04-11 08:37:05', '1', '2021-04-11 19:34:25', b'0', 0); -INSERT INTO `sys_menu` VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', 0, '', '2021-04-11 08:37:05', '', '2021-04-11 08:37:05', b'0', 0); -INSERT INTO `sys_menu` VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', 0, '', '2021-04-11 08:37:05', '', '2021-04-11 08:37:05', b'0', 0); -INSERT INTO `sys_menu` VALUES (1110, '错误码管理', '', 2, 12, 1, 'error-code', 'code', 'system/errorCode/index', 0, '', '2021-04-13 21:46:42', '1', '2021-04-22 00:04:35', b'0', 0); -INSERT INTO `sys_menu` VALUES (1111, '错误码查询', 'system:error-code:query', 3, 1, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:37', b'0', 0); -INSERT INTO `sys_menu` VALUES (1112, '错误码创建', 'system:error-code:create', 3, 2, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1113, '错误码更新', 'system:error-code:update', 3, 3, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:47', b'0', 0); -INSERT INTO `sys_menu` VALUES (1114, '错误码删除', 'system:error-code:delete', 3, 4, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:51', b'0', 0); -INSERT INTO `sys_menu` VALUES (1115, '错误码导出', 'system:error-code:export', 3, 5, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:55', b'0', 0); -INSERT INTO `sys_menu` VALUES (1116, '日志中心', '', 2, 8, 2, 'log-center', 'log', 'infra/skywalking/log', 0, '1', '2021-04-26 22:35:45', '1', '2021-04-26 22:37:25', b'0', 0); -INSERT INTO `sys_menu` VALUES (1117, '支付管理', '', 1, 11, 0, '/pay', 'money', NULL, 0, '1', '2021-12-25 16:43:41', '1', '2021-12-25 16:46:40', b'0', 0); -INSERT INTO `sys_menu` VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'user', 'bpm/oa/leave/index', 0, '', '2021-09-20 08:51:03', '1', '2022-01-22 21:36:06', b'0', 0); -INSERT INTO `sys_menu` VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '1', '2022-01-23 00:14:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '1', '2022-01-23 00:14:49', b'0', 0); -INSERT INTO `sys_menu` VALUES (1121, '请假申请更新', 'oa:leave:update', 3, 3, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2022-01-22 16:14:26', b'1', 0); -INSERT INTO `sys_menu` VALUES (1122, '请假申请删除', 'oa:leave:delete', 3, 4, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2022-01-22 16:14:28', b'1', 0); -INSERT INTO `sys_menu` VALUES (1123, '请假申请导出', 'oa:leave:export', 3, 5, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2022-01-22 16:14:30', b'1', 0); -INSERT INTO `sys_menu` VALUES (1124, '待办任务', '', 2, 2, 5, 'todo', 'edit', 'oa/todo/index', 0, '1', '2021-09-20 22:10:09', '1', '2022-01-22 10:33:01', b'1', 0); -INSERT INTO `sys_menu` VALUES (1125, '流程申请', '', 2, 3, 5, 'flow', 'form', 'oa/flow/index', 0, '1', '2021-10-23 22:10:09', '1', '2022-01-22 10:33:03', b'1', 0); -INSERT INTO `sys_menu` VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'table', 'pay/app/index', 0, '', '2021-11-10 01:13:30', '1', '2021-12-25 16:56:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); -INSERT INTO `sys_menu` VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); -INSERT INTO `sys_menu` VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); -INSERT INTO `sys_menu` VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); -INSERT INTO `sys_menu` VALUES (1131, '支付应用信息导出', 'pay:app:export', 3, 5, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); -INSERT INTO `sys_menu` VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', 0, '1', '2021-11-08 15:15:47', '1', '2021-11-08 15:15:47', b'0', 0); -INSERT INTO `sys_menu` VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1138, '租户管理', '', 2, 0, 1, 'tenant', 'peoples', 'system/tenant/index', 0, '', '2021-12-14 12:31:43', '1', '2021-12-14 20:32:32', b'0', 0); -INSERT INTO `sys_menu` VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1144, '支付应用信息管理', '', 2, 0, 1117, 'app', '', 'pay/app/index', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:48:05', b'1', 0); -INSERT INTO `sys_menu` VALUES (1145, '支付应用信息查询', 'pay:app:query', 3, 1, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:53', b'1', 0); -INSERT INTO `sys_menu` VALUES (1146, '支付应用信息创建', 'pay:app:create', 3, 2, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:51', b'1', 0); -INSERT INTO `sys_menu` VALUES (1147, '支付应用信息更新', 'pay:app:update', 3, 3, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:48', b'1', 0); -INSERT INTO `sys_menu` VALUES (1148, '支付应用信息删除', 'pay:app:delete', 3, 4, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:46', b'1', 0); -INSERT INTO `sys_menu` VALUES (1149, '支付应用信息导出', 'pay:app:export', 3, 5, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:43', b'1', 0); -INSERT INTO `sys_menu` VALUES (1150, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', 0, '1', '2021-11-08 15:15:47', '1', '2021-11-08 15:15:47', b'0', 0); -INSERT INTO `sys_menu` VALUES (1156, '支付订单查询', 'pay:order:query', 3, 1, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); -INSERT INTO `sys_menu` VALUES (1157, '支付订单创建', 'pay:order:create', 3, 2, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); -INSERT INTO `sys_menu` VALUES (1158, '支付订单更新', 'pay:order:update', 3, 3, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); -INSERT INTO `sys_menu` VALUES (1159, '支付订单删除', 'pay:order:delete', 3, 4, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); -INSERT INTO `sys_menu` VALUES (1160, '支付订单导出', 'pay:order:export', 3, 5, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); -INSERT INTO `sys_menu` VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'order', 'pay/refund/index', 0, '', '2021-12-25 08:29:07', '1', '2021-12-25 19:30:22', b'0', 0); -INSERT INTO `sys_menu` VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); -INSERT INTO `sys_menu` VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); -INSERT INTO `sys_menu` VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); -INSERT INTO `sys_menu` VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); -INSERT INTO `sys_menu` VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); -INSERT INTO `sys_menu` VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'pay', 'pay/order/index', 0, '', '2021-12-25 08:49:43', '1', '2021-12-25 19:29:54', b'0', 0); -INSERT INTO `sys_menu` VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1179, '商户信息', '', 2, 0, 1117, 'merchant', 'merchant', 'pay/merchant/index', 0, '', '2021-12-25 09:01:44', '1', '2021-12-25 17:02:13', b'0', 0); -INSERT INTO `sys_menu` VALUES (1180, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1181, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1182, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1183, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1184, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); -INSERT INTO `sys_menu` VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'tool', NULL, 0, '1', '2021-12-30 20:26:36', '103', '2022-01-14 18:44:00', b'0', 0); -INSERT INTO `sys_menu` VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'nested', NULL, 0, '1', '2021-12-30 20:28:30', '1', '2021-12-30 20:28:57', b'0', 0); -INSERT INTO `sys_menu` VALUES (1187, '流程表单', '', 2, 0, 1186, 'form', 'form', 'bpm/form/index', 0, '', '2021-12-30 12:38:22', '1', '2021-12-31 23:20:38', b'0', 0); -INSERT INTO `sys_menu` VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 18:59:53', b'0', 0); -INSERT INTO `sys_menu` VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 18:59:59', b'0', 0); -INSERT INTO `sys_menu` VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 19:00:21', b'0', 0); -INSERT INTO `sys_menu` VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 19:00:26', b'0', 0); -INSERT INTO `sys_menu` VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 19:00:33', b'0', 0); -INSERT INTO `sys_menu` VALUES (1193, '流程模型', '', 2, 5, 1186, 'model', 'guide', 'bpm/model/index', 0, '1', '2021-12-31 23:24:58', '103', '2022-01-14 10:14:38', b'0', 0); -INSERT INTO `sys_menu` VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', 0, '1', '2022-01-03 19:01:10', '1', '2022-01-03 19:01:10', b'0', 0); -INSERT INTO `sys_menu` VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', 0, '1', '2022-01-03 19:01:24', '1', '2022-01-03 19:02:02', b'0', 0); -INSERT INTO `sys_menu` VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', 0, '1', '2022-01-03 19:01:35', '1', '2022-01-03 19:02:11', b'0', 0); -INSERT INTO `sys_menu` VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', 0, '1', '2022-01-03 19:02:28', '1', '2022-01-03 19:02:28', b'0', 0); -INSERT INTO `sys_menu` VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', 0, '1', '2022-01-03 19:02:43', '1', '2022-01-03 19:02:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', 0, '1', '2022-01-03 19:03:24', '1', '2022-01-03 19:03:24', b'0', 0); -INSERT INTO `sys_menu` VALUES (1200, '任务管理', '', 1, 20, 1185, 'task', 'cascader', NULL, 0, '1', '2022-01-07 23:51:48', '1', '2022-01-07 23:51:48', b'0', 0); -INSERT INTO `sys_menu` VALUES (1201, '我的流程', '', 2, 0, 1200, 'my', 'people', 'bpm/processInstance/index', 0, '', '2022-01-07 15:53:44', '1', '2022-01-08 16:44:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '1', '2022-01-07 23:56:29', b'0', 0); -INSERT INTO `sys_menu` VALUES (1203, '工作流的流程实例的拓展创建', 'bpm:process-instance-ext:create', 3, 2, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '', '2022-01-07 15:56:08', b'1', 0); -INSERT INTO `sys_menu` VALUES (1204, '工作流的流程实例的拓展更新', 'bpm:process-instance-ext:update', 3, 3, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '', '2022-01-07 15:56:00', b'1', 0); -INSERT INTO `sys_menu` VALUES (1205, '工作流的流程实例的拓展删除', 'bpm:process-instance-ext:delete', 3, 4, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '', '2022-01-07 15:55:56', b'1', 0); -INSERT INTO `sys_menu` VALUES (1206, '工作流的流程实例的拓展导出', 'bpm:process-instance-ext:export', 3, 5, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '', '2022-01-07 15:55:51', b'1', 0); -INSERT INTO `sys_menu` VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'eye-open', 'bpm/task/todo', 0, '1', '2022-01-08 10:33:37', '1', '2022-01-08 10:33:48', b'0', 0); -INSERT INTO `sys_menu` VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'eye', 'bpm/task/done', 0, '1', '2022-01-08 10:34:13', '1', '2022-01-08 10:34:13', b'0', 0); -INSERT INTO `sys_menu` VALUES (1209, '用户分组', '', 2, 2, 1186, 'user-group', 'people', 'bpm/group/index', 0, '', '2022-01-14 02:14:20', '103', '2022-01-14 10:15:43', b'0', 0); -INSERT INTO `sys_menu` VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:20', b'0', 0); -INSERT INTO `sys_menu` VALUES (1214, '用户组导出', 'bpm:user-group:export', 3, 5, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:58', b'1', 0); -INSERT INTO `sys_menu` VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', 0, '1', '2022-01-23 00:21:43', '1', '2022-01-23 00:26:30', b'0', 0); -INSERT INTO `sys_menu` VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', 0, '1', '2022-01-23 00:26:53', '1', '2022-01-23 00:26:53', b'0', 0); -INSERT INTO `sys_menu` VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', 0, '1', '2022-01-23 00:28:15', '1', '2022-01-23 00:28:15', b'0', 0); -INSERT INTO `sys_menu` VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', 0, '1', '2022-01-23 00:28:41', '1', '2022-01-23 00:28:41', b'0', 0); -INSERT INTO `sys_menu` VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', 0, '1', '2022-01-23 00:36:15', '1', '2022-01-23 00:36:15', b'0', 0); -INSERT INTO `sys_menu` VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', 0, '1', '2022-01-23 00:36:33', '1', '2022-01-23 00:36:33', b'0', 0); -INSERT INTO `sys_menu` VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', 0, '1', '2022-01-23 00:38:52', '1', '2022-01-23 00:38:52', b'0', 0); -INSERT INTO `sys_menu` VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', 0, '1', '2022-01-23 00:39:24', '1', '2022-01-23 00:39:30', b'0', 0); +INSERT INTO `system_menu` VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'system', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:08', b'0', 0); +INSERT INTO `system_menu` VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'monitor', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:18', b'0', 0); +INSERT INTO `system_menu` VALUES (3, '研发工具', '', 1, 30, 0, '/tool', 'tool', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:13', b'0', 0); +INSERT INTO `system_menu` VALUES (4, '若依官网', '', 1, 4, 0, 'http://ruoyi.vip', 'guide', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 21:54:28', b'1', 0); +INSERT INTO `system_menu` VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'people', NULL, 0, 'admin', '2021-09-20 16:26:19', '1', '2022-01-22 18:32:50', b'0', 0); +INSERT INTO `system_menu` VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0', 0); +INSERT INTO `system_menu` VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'peoples', 'system/role/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:49', b'0', 0); +INSERT INTO `system_menu` VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:28', b'0', 0); +INSERT INTO `system_menu` VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'tree', 'system/dept/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:19', b'0', 0); +INSERT INTO `system_menu` VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'post', 'system/post/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:23', b'0', 0); +INSERT INTO `system_menu` VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'dict', 'system/dict/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:16:58', b'0', 0); +INSERT INTO `system_menu` VALUES (106, '配置管理', '', 2, 1, 2, 'config', 'edit', 'infra/config/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:10', b'0', 0); +INSERT INTO `system_menu` VALUES (107, '通知公告', '', 2, 8, 1, 'notice', 'message', 'system/notice/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:39', b'0', 0); +INSERT INTO `system_menu` VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'log', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-04-26 22:34:58', b'0', 0); +INSERT INTO `system_menu` VALUES (109, '在线用户', 'system:user-session:list', 2, 10, 1, 'user-session', 'online', 'system/session/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:20', b'0', 0); +INSERT INTO `system_menu` VALUES (110, '定时任务', '', 2, 2, 2, 'job', 'job', 'infra/job/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:25:51', b'0', 0); +INSERT INTO `system_menu` VALUES (111, 'MySQL 监控', '', 2, 4, 2, 'druid', 'druid', 'infra/druid/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:32', b'0', 0); +INSERT INTO `system_menu` VALUES (112, 'Java 监控', '', 2, 6, 2, 'admin-server', 'server', 'infra/server', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:41', b'0', 0); +INSERT INTO `system_menu` VALUES (113, 'Redis 监控', '', 2, 5, 2, 'redis', 'redis', 'infra/redis/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:37', b'0', 0); +INSERT INTO `system_menu` VALUES (114, '表单构建', 'tool:build:list', 2, 1, 3, 'build', 'build', 'tool/build/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0', 0); +INSERT INTO `system_menu` VALUES (115, '代码生成', 'tool:codegen:query', 2, 0, 3, 'codegen', 'code', 'tool/codegen/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-06 03:43:14', b'0', 0); +INSERT INTO `system_menu` VALUES (116, '系统接口', 'tool:swagger:list', 2, 3, 3, 'swagger', 'swagger', 'tool/swagger/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0', 0); +INSERT INTO `system_menu` VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'form', 'system/operatelog/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:42:56', b'0', 0); +INSERT INTO `system_menu` VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'logininfor', 'system/loginlog/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:39:23', b'0', 0); +INSERT INTO `system_menu` VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:21:47', b'0', 0); +INSERT INTO `system_menu` VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:21:54', b'0', 0); +INSERT INTO `system_menu` VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:22:03', b'0', 0); +INSERT INTO `system_menu` VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:20:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:24', b'0', 0); +INSERT INTO `system_menu` VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:14', b'0', 0); +INSERT INTO `system_menu` VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:05', b'0', 0); +INSERT INTO `system_menu` VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:36', b'0', 0); +INSERT INTO `system_menu` VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:30', b'0', 0); +INSERT INTO `system_menu` VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:45', b'0', 0); +INSERT INTO `system_menu` VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:30', b'0', 0); +INSERT INTO `system_menu` VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:37', b'0', 0); +INSERT INTO `system_menu` VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:34', b'0', 0); +INSERT INTO `system_menu` VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:48', b'0', 0); +INSERT INTO `system_menu` VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:29', b'0', 0); +INSERT INTO `system_menu` VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:36', b'0', 0); +INSERT INTO `system_menu` VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:45', b'0', 0); +INSERT INTO `system_menu` VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:00', b'0', 0); +INSERT INTO `system_menu` VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:18', b'0', 0); +INSERT INTO `system_menu` VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:30', b'0', 0); +INSERT INTO `system_menu` VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:36', b'0', 0); +INSERT INTO `system_menu` VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:19', b'0', 0); +INSERT INTO `system_menu` VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:48', b'0', 0); +INSERT INTO `system_menu` VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:52:01', b'0', 0); +INSERT INTO `system_menu` VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:10', b'0', 0); +INSERT INTO `system_menu` VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:23', b'0', 0); +INSERT INTO `system_menu` VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:26', b'0', 0); +INSERT INTO `system_menu` VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:30', b'0', 0); +INSERT INTO `system_menu` VALUES (1046, '在线查询', 'system:user-session:list', 3, 1, 109, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:22:37', b'0', 0); +INSERT INTO `system_menu` VALUES (1047, '批量强退', 'monitor:online:batchLogout', 3, 2, 109, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:46', b'1', 0); +INSERT INTO `system_menu` VALUES (1048, '单条强退', 'system:user-session:delete', 3, 3, 109, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:22:54', b'0', 0); +INSERT INTO `system_menu` VALUES (1049, '任务查询', 'monitor:job:query', 3, 1, 110, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:01:42', b'1', 0); +INSERT INTO `system_menu` VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:01:58', b'0', 0); +INSERT INTO `system_menu` VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:02:10', b'0', 0); +INSERT INTO `system_menu` VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:02:22', b'0', 0); +INSERT INTO `system_menu` VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:02:38', b'0', 0); +INSERT INTO `system_menu` VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:02:51', b'0', 0); +INSERT INTO `system_menu` VALUES (1055, '生成查询', 'tool:gen:query', 3, 1, 115, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:23:25', b'1', 0); +INSERT INTO `system_menu` VALUES (1056, '生成修改', 'tool:codegen:update', 3, 2, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:23:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1057, '生成删除', 'tool:codegen:delete', 3, 3, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:24:02', b'0', 0); +INSERT INTO `system_menu` VALUES (1058, '导入代码', 'tool:codegen:create', 3, 2, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:23:50', b'0', 0); +INSERT INTO `system_menu` VALUES (1059, '预览代码', 'tool:codegen:preview', 3, 4, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:24:10', b'0', 0); +INSERT INTO `system_menu` VALUES (1060, '生成代码', 'tool:codegen:download', 3, 5, 115, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 21:24:20', b'0', 0); +INSERT INTO `system_menu` VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', 0, '', '2021-01-06 17:53:44', '', '2021-01-06 17:55:23', b'0', 0); +INSERT INTO `system_menu` VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', 0, '', '2021-01-06 17:56:31', '', '2021-01-06 17:56:31', b'0', 0); +INSERT INTO `system_menu` VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', 0, '', '2021-01-07 10:23:28', '', '2021-01-07 10:23:28', b'0', 0); +INSERT INTO `system_menu` VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', 0, '', '2021-01-26 01:02:31', '', '2021-01-26 01:02:31', b'0', 0); +INSERT INTO `system_menu` VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', 0, '', '2021-01-26 01:02:52', '', '2021-01-26 01:02:52', b'0', 0); +INSERT INTO `system_menu` VALUES (1070, '代码生成示例', 'tool:test-demo:query', 2, 0, 3, 'test-demo', 'validCode', 'tool/testDemo/index', 0, '', '2021-02-06 12:42:49', '', '2021-03-06 03:45:22', b'0', 0); +INSERT INTO `system_menu` VALUES (1071, '测试示例表创建', 'tool:test-demo:create', 3, 1, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:47', b'0', 0); +INSERT INTO `system_menu` VALUES (1072, '测试示例表更新', 'tool:test-demo:update', 3, 2, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:51', b'0', 0); +INSERT INTO `system_menu` VALUES (1073, '测试示例表删除', 'tool:test-demo:delete', 3, 3, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:58', b'0', 0); +INSERT INTO `system_menu` VALUES (1074, '测试示例表导出', 'tool:test-demo:export', 3, 4, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:54:01', b'0', 0); +INSERT INTO `system_menu` VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', 0, '', '2021-02-07 13:03:10', '', '2021-02-07 13:03:10', b'0', 0); +INSERT INTO `system_menu` VALUES (1076, '数据库文档', '', 2, 5, 3, 'db-doc', 'table', 'tool/dbDoc/index', 0, '', '2021-02-08 01:41:47', '', '2021-02-08 01:49:00', b'0', 0); +INSERT INTO `system_menu` VALUES (1077, '链路追踪', '', 2, 7, 2, 'skywalking', 'eye-open', 'infra/skywalking', 0, '', '2021-02-08 20:41:31', '', '2021-02-26 02:18:45', b'0', 0); +INSERT INTO `system_menu` VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'log', 'infra/apiAccessLog/index', 0, '', '2021-02-26 01:32:59', '1', '2021-03-10 01:28:09', b'0', 0); +INSERT INTO `system_menu` VALUES (1079, 'API 访问日志表创建', 'system:api-access-log:create', 3, 1, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:00', b'1', 0); +INSERT INTO `system_menu` VALUES (1080, 'API 访问日志表更新', 'system:api-access-log:update', 3, 2, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:08', b'1', 0); +INSERT INTO `system_menu` VALUES (1081, 'API 访问日志表删除', 'system:api-access-log:delete', 3, 3, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:27', b'1', 0); +INSERT INTO `system_menu` VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', 0, '', '2021-02-26 01:32:59', '1', '2021-03-10 01:28:13', b'0', 0); +INSERT INTO `system_menu` VALUES (1083, 'API 日志', '', 2, 3, 2, 'log', 'log', NULL, 0, '', '2021-02-26 02:18:24', '', '2021-02-26 02:20:17', b'0', 0); +INSERT INTO `system_menu` VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'log', 'infra/apiErrorLog/index', 0, '', '2021-02-26 07:53:20', '', '2021-02-26 07:54:40', b'0', 0); +INSERT INTO `system_menu` VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', 0, '', '2021-02-26 07:53:20', '1', '2021-03-10 01:28:18', b'0', 0); +INSERT INTO `system_menu` VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', 0, '', '2021-02-26 07:53:20', '1', '2021-03-10 01:28:21', b'0', 0); +INSERT INTO `system_menu` VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', 0, '1', '2021-03-10 01:26:19', '1', '2021-03-10 01:26:19', b'0', 0); +INSERT INTO `system_menu` VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', 0, '1', '2021-03-10 01:28:04', '1', '2021-03-10 01:29:38', b'0', 0); +INSERT INTO `system_menu` VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', 0, '1', '2021-03-10 01:29:09', '1', '2021-03-10 01:29:09', b'0', 0); +INSERT INTO `system_menu` VALUES (1090, '文件管理', '', 2, 0, 2, 'file', 'upload', 'infra/file/index', 0, '', '2021-03-12 20:16:20', '1', '2021-03-13 11:07:05', b'0', 0); +INSERT INTO `system_menu` VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', 0, '', '2021-03-12 20:16:20', '', '2021-03-12 20:16:20', b'0', 0); +INSERT INTO `system_menu` VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', 0, '', '2021-03-12 20:16:20', '', '2021-03-12 20:16:20', b'0', 0); +INSERT INTO `system_menu` VALUES (1093, '短信管理', '', 1, 11, 1, 'sms', 'validCode', NULL, 0, '1', '2021-04-05 01:10:16', '1', '2021-04-05 01:11:38', b'0', 0); +INSERT INTO `system_menu` VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'phone', 'system/sms/smsChannel', 0, '', '2021-04-01 11:07:15', '1', '2021-04-09 23:44:07', b'0', 0); +INSERT INTO `system_menu` VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', 0, '', '2021-04-01 11:07:15', '', '2021-04-01 11:07:15', b'0', 0); +INSERT INTO `system_menu` VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', 0, '', '2021-04-01 11:07:15', '', '2021-04-01 11:07:15', b'0', 0); +INSERT INTO `system_menu` VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', 0, '', '2021-04-01 11:07:15', '', '2021-04-01 11:07:15', b'0', 0); +INSERT INTO `system_menu` VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', 0, '', '2021-04-01 11:07:15', '', '2021-04-01 11:07:15', b'0', 0); +INSERT INTO `system_menu` VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'phone', 'system/sms/smsTemplate', 0, '', '2021-04-01 17:35:17', '1', '2021-04-11 19:34:21', b'0', 0); +INSERT INTO `system_menu` VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); +INSERT INTO `system_menu` VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); +INSERT INTO `system_menu` VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); +INSERT INTO `system_menu` VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); +INSERT INTO `system_menu` VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', 0, '', '2021-04-01 17:35:17', '', '2021-04-01 17:35:17', b'0', 0); +INSERT INTO `system_menu` VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', 0, '1', '2021-04-11 00:26:40', '1', '2021-04-11 00:26:40', b'0', 0); +INSERT INTO `system_menu` VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'phone', 'system/sms/smsLog', 0, '', '2021-04-11 08:37:05', '1', '2021-04-11 19:34:25', b'0', 0); +INSERT INTO `system_menu` VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', 0, '', '2021-04-11 08:37:05', '', '2021-04-11 08:37:05', b'0', 0); +INSERT INTO `system_menu` VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', 0, '', '2021-04-11 08:37:05', '', '2021-04-11 08:37:05', b'0', 0); +INSERT INTO `system_menu` VALUES (1110, '错误码管理', '', 2, 12, 1, 'error-code', 'code', 'system/errorCode/index', 0, '', '2021-04-13 21:46:42', '1', '2021-04-22 00:04:35', b'0', 0); +INSERT INTO `system_menu` VALUES (1111, '错误码查询', 'system:error-code:query', 3, 1, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:37', b'0', 0); +INSERT INTO `system_menu` VALUES (1112, '错误码创建', 'system:error-code:create', 3, 2, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1113, '错误码更新', 'system:error-code:update', 3, 3, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:47', b'0', 0); +INSERT INTO `system_menu` VALUES (1114, '错误码删除', 'system:error-code:delete', 3, 4, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:51', b'0', 0); +INSERT INTO `system_menu` VALUES (1115, '错误码导出', 'system:error-code:export', 3, 5, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:55', b'0', 0); +INSERT INTO `system_menu` VALUES (1116, '日志中心', '', 2, 8, 2, 'log-center', 'log', 'infra/skywalking/log', 0, '1', '2021-04-26 22:35:45', '1', '2021-04-26 22:37:25', b'0', 0); +INSERT INTO `system_menu` VALUES (1117, '支付管理', '', 1, 11, 0, '/pay', 'money', NULL, 0, '1', '2021-12-25 16:43:41', '1', '2021-12-25 16:46:40', b'0', 0); +INSERT INTO `system_menu` VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'user', 'bpm/oa/leave/index', 0, '', '2021-09-20 08:51:03', '1', '2022-01-22 21:36:06', b'0', 0); +INSERT INTO `system_menu` VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '1', '2022-01-23 00:14:20', b'0', 0); +INSERT INTO `system_menu` VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '1', '2022-01-23 00:14:49', b'0', 0); +INSERT INTO `system_menu` VALUES (1121, '请假申请更新', 'oa:leave:update', 3, 3, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2022-01-22 16:14:26', b'1', 0); +INSERT INTO `system_menu` VALUES (1122, '请假申请删除', 'oa:leave:delete', 3, 4, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2022-01-22 16:14:28', b'1', 0); +INSERT INTO `system_menu` VALUES (1123, '请假申请导出', 'oa:leave:export', 3, 5, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2022-01-22 16:14:30', b'1', 0); +INSERT INTO `system_menu` VALUES (1124, '待办任务', '', 2, 2, 5, 'todo', 'edit', 'oa/todo/index', 0, '1', '2021-09-20 22:10:09', '1', '2022-01-22 10:33:01', b'1', 0); +INSERT INTO `system_menu` VALUES (1125, '流程申请', '', 2, 3, 5, 'flow', 'form', 'oa/flow/index', 0, '1', '2021-10-23 22:10:09', '1', '2022-01-22 10:33:03', b'1', 0); +INSERT INTO `system_menu` VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'table', 'pay/app/index', 0, '', '2021-11-10 01:13:30', '1', '2021-12-25 16:56:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); +INSERT INTO `system_menu` VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); +INSERT INTO `system_menu` VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); +INSERT INTO `system_menu` VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); +INSERT INTO `system_menu` VALUES (1131, '支付应用信息导出', 'pay:app:export', 3, 5, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); +INSERT INTO `system_menu` VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', 0, '1', '2021-11-08 15:15:47', '1', '2021-11-08 15:15:47', b'0', 0); +INSERT INTO `system_menu` VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', 0, '', '2021-11-10 01:13:41', '', '2021-11-10 01:13:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1138, '租户管理', '', 2, 0, 1, 'tenant', 'peoples', 'system/tenant/index', 0, '', '2021-12-14 12:31:43', '1', '2021-12-14 20:32:32', b'0', 0); +INSERT INTO `system_menu` VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1144, '支付应用信息管理', '', 2, 0, 1117, 'app', '', 'pay/app/index', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:48:05', b'1', 0); +INSERT INTO `system_menu` VALUES (1145, '支付应用信息查询', 'pay:app:query', 3, 1, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:53', b'1', 0); +INSERT INTO `system_menu` VALUES (1146, '支付应用信息创建', 'pay:app:create', 3, 2, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:51', b'1', 0); +INSERT INTO `system_menu` VALUES (1147, '支付应用信息更新', 'pay:app:update', 3, 3, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:48', b'1', 0); +INSERT INTO `system_menu` VALUES (1148, '支付应用信息删除', 'pay:app:delete', 3, 4, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:46', b'1', 0); +INSERT INTO `system_menu` VALUES (1149, '支付应用信息导出', 'pay:app:export', 3, 5, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:43', b'1', 0); +INSERT INTO `system_menu` VALUES (1150, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', 0, '1', '2021-11-08 15:15:47', '1', '2021-11-08 15:15:47', b'0', 0); +INSERT INTO `system_menu` VALUES (1156, '支付订单查询', 'pay:order:query', 3, 1, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); +INSERT INTO `system_menu` VALUES (1157, '支付订单创建', 'pay:order:create', 3, 2, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); +INSERT INTO `system_menu` VALUES (1158, '支付订单更新', 'pay:order:update', 3, 3, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); +INSERT INTO `system_menu` VALUES (1159, '支付订单删除', 'pay:order:delete', 3, 4, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); +INSERT INTO `system_menu` VALUES (1160, '支付订单导出', 'pay:order:export', 3, 5, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0); +INSERT INTO `system_menu` VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'order', 'pay/refund/index', 0, '', '2021-12-25 08:29:07', '1', '2021-12-25 19:30:22', b'0', 0); +INSERT INTO `system_menu` VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); +INSERT INTO `system_menu` VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); +INSERT INTO `system_menu` VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); +INSERT INTO `system_menu` VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); +INSERT INTO `system_menu` VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0); +INSERT INTO `system_menu` VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'pay', 'pay/order/index', 0, '', '2021-12-25 08:49:43', '1', '2021-12-25 19:29:54', b'0', 0); +INSERT INTO `system_menu` VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1179, '商户信息', '', 2, 0, 1117, 'merchant', 'merchant', 'pay/merchant/index', 0, '', '2021-12-25 09:01:44', '1', '2021-12-25 17:02:13', b'0', 0); +INSERT INTO `system_menu` VALUES (1180, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1181, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1182, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1183, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1184, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0); +INSERT INTO `system_menu` VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'tool', NULL, 0, '1', '2021-12-30 20:26:36', '103', '2022-01-14 18:44:00', b'0', 0); +INSERT INTO `system_menu` VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'nested', NULL, 0, '1', '2021-12-30 20:28:30', '1', '2021-12-30 20:28:57', b'0', 0); +INSERT INTO `system_menu` VALUES (1187, '流程表单', '', 2, 0, 1186, 'form', 'form', 'bpm/form/index', 0, '', '2021-12-30 12:38:22', '1', '2021-12-31 23:20:38', b'0', 0); +INSERT INTO `system_menu` VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 18:59:53', b'0', 0); +INSERT INTO `system_menu` VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 18:59:59', b'0', 0); +INSERT INTO `system_menu` VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 19:00:21', b'0', 0); +INSERT INTO `system_menu` VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 19:00:26', b'0', 0); +INSERT INTO `system_menu` VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2022-01-03 19:00:33', b'0', 0); +INSERT INTO `system_menu` VALUES (1193, '流程模型', '', 2, 5, 1186, 'model', 'guide', 'bpm/model/index', 0, '1', '2021-12-31 23:24:58', '103', '2022-01-14 10:14:38', b'0', 0); +INSERT INTO `system_menu` VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', 0, '1', '2022-01-03 19:01:10', '1', '2022-01-03 19:01:10', b'0', 0); +INSERT INTO `system_menu` VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', 0, '1', '2022-01-03 19:01:24', '1', '2022-01-03 19:02:02', b'0', 0); +INSERT INTO `system_menu` VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', 0, '1', '2022-01-03 19:01:35', '1', '2022-01-03 19:02:11', b'0', 0); +INSERT INTO `system_menu` VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', 0, '1', '2022-01-03 19:02:28', '1', '2022-01-03 19:02:28', b'0', 0); +INSERT INTO `system_menu` VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', 0, '1', '2022-01-03 19:02:43', '1', '2022-01-03 19:02:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', 0, '1', '2022-01-03 19:03:24', '1', '2022-01-03 19:03:24', b'0', 0); +INSERT INTO `system_menu` VALUES (1200, '任务管理', '', 1, 20, 1185, 'task', 'cascader', NULL, 0, '1', '2022-01-07 23:51:48', '1', '2022-01-07 23:51:48', b'0', 0); +INSERT INTO `system_menu` VALUES (1201, '我的流程', '', 2, 0, 1200, 'my', 'people', 'bpm/processInstance/index', 0, '', '2022-01-07 15:53:44', '1', '2022-01-08 16:44:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '1', '2022-01-07 23:56:29', b'0', 0); +INSERT INTO `system_menu` VALUES (1203, '工作流的流程实例的拓展创建', 'bpm:process-instance-ext:create', 3, 2, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '', '2022-01-07 15:56:08', b'1', 0); +INSERT INTO `system_menu` VALUES (1204, '工作流的流程实例的拓展更新', 'bpm:process-instance-ext:update', 3, 3, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '', '2022-01-07 15:56:00', b'1', 0); +INSERT INTO `system_menu` VALUES (1205, '工作流的流程实例的拓展删除', 'bpm:process-instance-ext:delete', 3, 4, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '', '2022-01-07 15:55:56', b'1', 0); +INSERT INTO `system_menu` VALUES (1206, '工作流的流程实例的拓展导出', 'bpm:process-instance-ext:export', 3, 5, 1201, '', '', '', 0, '', '2022-01-07 15:53:44', '', '2022-01-07 15:55:51', b'1', 0); +INSERT INTO `system_menu` VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'eye-open', 'bpm/task/todo', 0, '1', '2022-01-08 10:33:37', '1', '2022-01-08 10:33:48', b'0', 0); +INSERT INTO `system_menu` VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'eye', 'bpm/task/done', 0, '1', '2022-01-08 10:34:13', '1', '2022-01-08 10:34:13', b'0', 0); +INSERT INTO `system_menu` VALUES (1209, '用户分组', '', 2, 2, 1186, 'user-group', 'people', 'bpm/group/index', 0, '', '2022-01-14 02:14:20', '103', '2022-01-14 10:15:43', b'0', 0); +INSERT INTO `system_menu` VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:20', b'0', 0); +INSERT INTO `system_menu` VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:20', b'0', 0); +INSERT INTO `system_menu` VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:20', b'0', 0); +INSERT INTO `system_menu` VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:20', b'0', 0); +INSERT INTO `system_menu` VALUES (1214, '用户组导出', 'bpm:user-group:export', 3, 5, 1209, '', '', '', 0, '', '2022-01-14 02:14:20', '', '2022-01-14 02:14:58', b'1', 0); +INSERT INTO `system_menu` VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', 0, '1', '2022-01-23 00:21:43', '1', '2022-01-23 00:26:30', b'0', 0); +INSERT INTO `system_menu` VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', 0, '1', '2022-01-23 00:26:53', '1', '2022-01-23 00:26:53', b'0', 0); +INSERT INTO `system_menu` VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', 0, '1', '2022-01-23 00:28:15', '1', '2022-01-23 00:28:15', b'0', 0); +INSERT INTO `system_menu` VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', 0, '1', '2022-01-23 00:28:41', '1', '2022-01-23 00:28:41', b'0', 0); +INSERT INTO `system_menu` VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', 0, '1', '2022-01-23 00:36:15', '1', '2022-01-23 00:36:15', b'0', 0); +INSERT INTO `system_menu` VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', 0, '1', '2022-01-23 00:36:33', '1', '2022-01-23 00:36:33', b'0', 0); +INSERT INTO `system_menu` VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', 0, '1', '2022-01-23 00:38:52', '1', '2022-01-23 00:38:52', b'0', 0); +INSERT INTO `system_menu` VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', 0, '1', '2022-01-23 00:39:24', '1', '2022-01-23 00:39:30', b'0', 0); COMMIT; -- ---------------------------- --- Table structure for sys_notice +-- Table structure for system_notice -- ---------------------------- -DROP TABLE IF EXISTS `sys_notice`; -CREATE TABLE `sys_notice` ( +DROP TABLE IF EXISTS `system_notice`; +CREATE TABLE `system_notice` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '公告ID', `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '公告标题', `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '公告内容', @@ -2103,22 +2625,23 @@ CREATE TABLE `sys_notice` ( ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知公告表'; -- ---------------------------- --- Records of sys_notice +-- Records of system_notice -- ---------------------------- BEGIN; -INSERT INTO `sys_notice` VALUES (1, '温馨提醒:2018-07-01 若依新版本发布啦', '新版本内容', 2, 0, 'admin', '2021-01-05 17:03:48', '', '2021-12-15 05:02:23', b'0', 1); -INSERT INTO `sys_notice` VALUES (2, '维护通知:2018-07-01 若依系统凌晨维护', '维护内容', 1, 0, 'admin', '2021-01-05 17:03:48', '', '2021-12-15 05:02:22', b'0', 1); -INSERT INTO `sys_notice` VALUES (3, '1133', '

222333

', 1, 0, '', '2021-01-13 05:24:52', '', '2021-12-15 05:02:21', b'1', 1); +INSERT INTO `system_notice` VALUES (1, '温馨提醒:2018-07-01 若依新版本发布啦', '新版本内容', 2, 0, 'admin', '2021-01-05 17:03:48', '', '2021-12-15 05:02:23', b'0', 1); +INSERT INTO `system_notice` VALUES (2, '维护通知:2018-07-01 若依系统凌晨维护', '维护内容', 1, 0, 'admin', '2021-01-05 17:03:48', '', '2021-12-15 05:02:22', b'0', 1); +INSERT INTO `system_notice` VALUES (3, '1133', '

222333

', 1, 0, '', '2021-01-13 05:24:52', '', '2021-12-15 05:02:21', b'1', 1); COMMIT; -- ---------------------------- --- Table structure for sys_operate_log +-- Table structure for system_operate_log -- ---------------------------- -DROP TABLE IF EXISTS `sys_operate_log`; -CREATE TABLE `sys_operate_log` ( +DROP TABLE IF EXISTS `system_operate_log`; +CREATE TABLE `system_operate_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', `user_id` bigint NOT NULL COMMENT '用户编号', + `user_type` tinyint NOT NULL DEFAULT '0' COMMENT '用户类型', `module` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模块标题', `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作名', `operate_type` bigint NOT NULL DEFAULT '0' COMMENT '操作分类', @@ -2142,28 +2665,37 @@ CREATE TABLE `sys_operate_log` ( `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1099 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志记录'; +) ENGINE=InnoDB AUTO_INCREMENT=1108 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志记录'; -- ---------------------------- --- Records of sys_operate_log +-- Records of system_operate_log -- ---------------------------- BEGIN; +INSERT INTO `system_operate_log` VALUES (1099, '', 1, 0, '流程实例', '新建流程实例', 2, '', '', 'POST', '/api/bpm/process-instance/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', 'CommonResult cn.iocoder.yudao.adminserver.modules.bpm.controller.task.BpmProcessInstanceController.createProcessInstance(BpmProcessInstanceCreateReqVO)', '{\"createReqVO\":{\"processDefinitionId\":\"eee:17:f3aad03b-7ae5-11ec-a69c-a2380e71991a\",\"variables\":{\"field121\":\"AAA\",\"field122\":[1]}}}', '2022-01-23 12:41:14', 4959, 0, '', '\"b243fa82-7c06-11ec-9110-acde48001122\"', NULL, '2022-01-23 12:41:19', NULL, '2022-01-23 12:41:19', b'0', 1); +INSERT INTO `system_operate_log` VALUES (1100, '', 1, 0, '流程实例', '新建流程实例', 2, '', '', 'POST', '/api/bpm/process-instance/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', 'CommonResult cn.iocoder.yudao.adminserver.modules.bpm.controller.task.BpmProcessInstanceController.createProcessInstance(BpmProcessInstanceCreateReqVO)', '{\"createReqVO\":{\"processDefinitionId\":\"test_001:4:3dbe6714-76b1-11ec-9c66-a2380e71991a\",\"variables\":{\"field121\":\"AAA\",\"field122\":[1]}}}', '2022-01-23 12:50:02', 4130, 0, '', '\"ecddb286-7c07-11ec-a41d-acde48001122\"', NULL, '2022-01-23 12:50:06', NULL, '2022-01-23 12:50:06', b'0', 1); +INSERT INTO `system_operate_log` VALUES (1101, '', 1, 0, '流程实例', '新建流程实例', 2, '', '', 'POST', '/api/bpm/process-instance/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', 'CommonResult cn.iocoder.yudao.adminserver.modules.bpm.controller.task.BpmProcessInstanceController.createProcessInstance(BpmProcessInstanceCreateReqVO)', '{\"createReqVO\":{\"processDefinitionId\":\"self:2:3a5a065e-76b1-11ec-9c66-a2380e71991a\",\"variables\":{\"field121\":\"aaa\",\"field122\":[1]}}}', '2022-01-23 12:50:46', 202, 500, 'RuntimeException: 123', 'null', NULL, '2022-01-23 12:50:46', NULL, '2022-01-23 12:50:46', b'0', 1); +INSERT INTO `system_operate_log` VALUES (1102, '', 1, 0, '流程实例', '取消流程实例', 4, '', '', 'DELETE', '/api/bpm/process-instance/cancel', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', 'CommonResult cn.iocoder.yudao.adminserver.modules.bpm.controller.task.BpmProcessInstanceController.cancelProcessInstance(BpmProcessInstanceCancelReqVO)', '{\"cancelReqVO\":{\"id\":\"ecddb286-7c07-11ec-a41d-acde48001122\",\"reason\":\"aaa\"}}', '2022-01-23 12:59:40', 395, 0, '', 'true', NULL, '2022-01-23 12:59:41', NULL, '2022-01-23 12:59:41', b'0', 1); +INSERT INTO `system_operate_log` VALUES (1103, '', 1, 0, '流程实例', '新建流程实例', 2, '', '', 'POST', '/api/bpm/process-instance/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', 'CommonResult cn.iocoder.yudao.adminserver.modules.bpm.controller.task.BpmProcessInstanceController.createProcessInstance(BpmProcessInstanceCreateReqVO)', '{\"createReqVO\":{\"processDefinitionId\":\"test:21:c2cd44b0-79b0-11ec-b2b8-a2380e71991a\",\"variables\":{\"field121\":\"aaa\",\"field122\":[1]}}}', '2022-01-23 12:59:57', 384, 0, '', '\"4f676a08-7c09-11ec-b8a1-acde48001122\"', NULL, '2022-01-23 12:59:57', NULL, '2022-01-23 12:59:57', b'0', 1); +INSERT INTO `system_operate_log` VALUES (1104, '', 1, 0, '管理后台 - 用户', '修改用户', 3, '', '', 'PUT', '/admin-api/system/user/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', 'CommonResult cn.iocoder.yudao.module.system.controller.admin.user.UserController.updateUser(UserUpdateReqVO)', '{\"reqVO\":{\"username\":\"admin\",\"nickname\":\"芋道源码\",\"remark\":\"管理员\",\"deptId\":103,\"postIds\":[1],\"email\":\"aoteman@126.com\",\"mobile\":\"15612345678\",\"sex\":1,\"avatar\":\"http://127.0.0.1:48080/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f\",\"id\":1}}', '2022-02-01 22:58:45', 112, 0, '', 'true', NULL, '2022-02-01 22:58:45', NULL, '2022-02-01 22:58:45', b'0', 1); +INSERT INTO `system_operate_log` VALUES (1105, '', 1, 0, '管理后台 - 认证', '取消社交绑定', 4, '', '', 'DELETE', '/admin-api/system/social-unbind', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', 'CommonResult cn.iocoder.yudao.module.system.controller.admin.auth.AuthController.socialUnbind(AuthSocialUnbindReqVO)', '{\"reqVO\":{\"type\":20,\"unionId\":\"IPRmJ0wvBptiPIlGEZiPewGwiEiE\"}}', '2022-02-01 23:00:30', 24, 0, '', 'true', NULL, '2022-02-01 23:00:30', NULL, '2022-02-01 23:00:30', b'0', 1); +INSERT INTO `system_operate_log` VALUES (1106, '', 1, 0, '管理后台 - 定时任务', '更新定时任务的状态', 3, '', '', 'PUT', '/admin-api/infra/job/update-status', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', 'CommonResult cn.iocoder.yudao.module.infra.controller.admin.job.JobController.updateJobStatus(Long,Integer)', '{\"id\":3,\"status\":2}', '2022-02-02 01:00:08', 106, 0, '', 'true', NULL, '2022-02-02 01:00:08', NULL, '2022-02-02 01:00:08', b'0', 1); +INSERT INTO `system_operate_log` VALUES (1107, '', 1, 0, '管理后台 - 定时任务', '更新定时任务的状态', 3, '', '', 'PUT', '/admin-api/infra/job/update-status', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', 'CommonResult cn.iocoder.yudao.module.infra.controller.admin.job.JobController.updateJobStatus(Long,Integer)', '{\"id\":3,\"status\":1}', '2022-02-02 01:00:11', 58, 0, '', 'true', NULL, '2022-02-02 01:00:11', NULL, '2022-02-02 01:00:11', b'0', 1); COMMIT; -- ---------------------------- --- Table structure for sys_post +-- Table structure for system_post -- ---------------------------- -DROP TABLE IF EXISTS `sys_post`; -CREATE TABLE `sys_post` ( +DROP TABLE IF EXISTS `system_post`; +CREATE TABLE `system_post` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID', - `code` varchar(64) NOT NULL COMMENT '岗位编码', - `name` varchar(50) NOT NULL COMMENT '岗位名称', + `code` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位编码', + `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位名称', `sort` int NOT NULL COMMENT '显示顺序', `status` tinyint NOT NULL COMMENT '状态(0正常 1停用)', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', @@ -2171,362 +2703,374 @@ CREATE TABLE `sys_post` ( ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='岗位信息表'; -- ---------------------------- --- Records of sys_post +-- Records of system_post -- ---------------------------- BEGIN; -INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-12-12 10:47:45', b'0', 1); -INSERT INTO `sys_post` VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-12-12 10:47:47', b'0', 1); -INSERT INTO `sys_post` VALUES (3, 'hr', '人力资源', 3, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-12-12 10:47:50', b'0', 1); -INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-12-12 10:47:51', b'0', 1); -INSERT INTO `sys_post` VALUES (5, 'test', '测试岗位', 0, 1, '132', '', '2021-01-07 15:07:44', '', '2021-12-12 10:47:53', b'1', 1); +INSERT INTO `system_post` VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-12-12 10:47:45', b'0', 1); +INSERT INTO `system_post` VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-12-12 10:47:47', b'0', 1); +INSERT INTO `system_post` VALUES (3, 'hr', '人力资源', 3, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-12-12 10:47:50', b'0', 1); +INSERT INTO `system_post` VALUES (4, 'user', '普通员工', 4, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-12-12 10:47:51', b'0', 1); +INSERT INTO `system_post` VALUES (5, 'test', '测试岗位', 0, 1, '132', '', '2021-01-07 15:07:44', '', '2021-12-12 10:47:53', b'1', 1); COMMIT; -- ---------------------------- --- Table structure for sys_role +-- Table structure for system_role -- ---------------------------- -DROP TABLE IF EXISTS `sys_role`; -CREATE TABLE `sys_role` ( +DROP TABLE IF EXISTS `system_role`; +CREATE TABLE `system_role` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID', - `name` varchar(30) NOT NULL COMMENT '角色名称', - `code` varchar(100) NOT NULL COMMENT '角色权限字符串', + `name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名称', + `code` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色权限字符串', `sort` int NOT NULL COMMENT '显示顺序', `data_scope` tinyint NOT NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', - `data_scope_dept_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '数据范围(指定部门数组)', + `data_scope_dept_ids` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '数据范围(指定部门数组)', `status` tinyint NOT NULL COMMENT '角色状态(0正常 1停用)', `type` tinyint NOT NULL COMMENT '角色类型', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色信息表'; -- ---------------------------- --- Records of sys_role +-- Records of system_role -- ---------------------------- BEGIN; -INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2021-12-15 04:52:44', b'0'); -INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 11:46:58', b'0'); -INSERT INTO `sys_role` VALUES (101, '测试账号', 'test', 0, 2, '[102,108,109]', 0, 2, '132', '', '2021-01-06 13:49:35', '1', '2021-12-16 09:27:01', b'0'); +INSERT INTO `system_role` VALUES (1, '超级管理员', 'admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2021-12-15 04:52:44', b'0'); +INSERT INTO `system_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 11:46:58', b'0'); +INSERT INTO `system_role` VALUES (101, '测试账号', 'test', 0, 2, '[102,108,109]', 0, 2, '132', '', '2021-01-06 13:49:35', '1', '2021-12-16 09:27:01', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_role_menu +-- Table structure for system_role_menu -- ---------------------------- -DROP TABLE IF EXISTS `sys_role_menu`; -CREATE TABLE `sys_role_menu` ( +DROP TABLE IF EXISTS `system_role_menu`; +CREATE TABLE `system_role_menu` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增编号', `role_id` bigint NOT NULL COMMENT '角色ID', `menu_id` bigint NOT NULL COMMENT '菜单ID', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=253 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色和菜单关联表'; -- ---------------------------- --- Records of sys_role_menu +-- Records of system_role_menu -- ---------------------------- BEGIN; -INSERT INTO `sys_role_menu` VALUES (1, 2, 1, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (2, 2, 2, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (3, 2, 3, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (4, 2, 4, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (5, 2, 100, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (6, 2, 101, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (7, 2, 102, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (8, 2, 103, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (9, 2, 104, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (10, 2, 105, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (11, 2, 106, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (12, 2, 107, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (13, 2, 108, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (14, 2, 109, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (15, 2, 110, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (16, 2, 111, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (17, 2, 112, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (18, 2, 113, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (19, 2, 114, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (20, 2, 115, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (21, 2, 116, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (22, 2, 500, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (23, 2, 501, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (24, 2, 1000, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (25, 2, 1001, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (26, 2, 1002, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (27, 2, 1003, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (28, 2, 1004, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (29, 2, 1005, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (30, 2, 1006, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (31, 2, 1007, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (32, 2, 1008, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (33, 2, 1009, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (34, 2, 1010, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (35, 2, 1011, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (36, 2, 1012, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (37, 2, 1013, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (38, 2, 1014, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (39, 2, 1015, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (40, 2, 1016, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (41, 2, 1017, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (42, 2, 1018, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (43, 2, 1019, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (44, 2, 1020, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (45, 2, 1021, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (46, 2, 1022, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (47, 2, 1023, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (48, 2, 1024, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (49, 2, 1025, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (50, 2, 1026, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (51, 2, 1027, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (52, 2, 1028, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (53, 2, 1029, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (54, 2, 1030, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (55, 2, 1031, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (56, 2, 1032, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (57, 2, 1033, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (58, 2, 1034, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (59, 2, 1035, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (60, 2, 1036, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (61, 2, 1037, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (62, 2, 1038, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (63, 2, 1039, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (64, 2, 1040, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (65, 2, 1041, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (66, 2, 1042, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (67, 2, 1043, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (68, 2, 1044, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (69, 2, 1045, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (70, 2, 1046, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (71, 2, 1047, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (72, 2, 1048, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (73, 2, 1049, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (74, 2, 1050, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (75, 2, 1051, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (76, 2, 1052, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (77, 2, 1053, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (78, 2, 1054, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (79, 2, 1055, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); -INSERT INTO `sys_role_menu` VALUES (80, 2, 1056, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (81, 2, 1057, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (82, 2, 1058, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (83, 2, 1059, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (84, 2, 1060, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (169, 101, 1001, '', '2021-01-21 02:15:01', '', '2021-01-21 03:04:50', b'1'); -INSERT INTO `sys_role_menu` VALUES (170, 101, 1, '', '2021-01-21 02:39:45', '', '2021-01-21 03:13:11', b'1'); -INSERT INTO `sys_role_menu` VALUES (171, 101, 100, '', '2021-01-21 02:39:45', '', '2021-01-21 03:13:11', b'1'); -INSERT INTO `sys_role_menu` VALUES (172, 101, 1024, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (173, 101, 1025, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (174, 101, 1026, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (175, 101, 1027, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (176, 101, 1028, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (177, 101, 1029, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (178, 101, 1030, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (179, 101, 1036, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (180, 101, 1037, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (181, 101, 1038, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (182, 101, 1039, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (183, 101, 1040, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (184, 101, 1042, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (185, 101, 1043, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (186, 101, 1045, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (187, 101, 1063, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (188, 101, 1064, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (189, 101, 1065, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (190, 101, 1007, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (191, 101, 1008, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (192, 101, 1009, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (193, 101, 1010, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (194, 101, 1011, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (195, 101, 1012, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (196, 101, 1013, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (197, 101, 1014, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (198, 101, 1015, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (199, 101, 1016, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (200, 101, 1017, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (201, 101, 1018, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (202, 101, 1019, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (203, 101, 1020, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (204, 101, 1021, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (205, 101, 1022, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (206, 101, 1023, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); -INSERT INTO `sys_role_menu` VALUES (207, 101, 1001, '', '2021-01-21 03:07:43', '', '2021-01-21 03:13:11', b'1'); -INSERT INTO `sys_role_menu` VALUES (208, 101, 1002, '', '2021-01-21 03:07:43', '', '2021-01-21 03:10:08', b'1'); -INSERT INTO `sys_role_menu` VALUES (209, 101, 1002, '', '2021-01-21 03:11:17', '', '2021-01-21 03:13:11', b'1'); -INSERT INTO `sys_role_menu` VALUES (210, 101, 1, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:21', b'0'); -INSERT INTO `sys_role_menu` VALUES (211, 101, 1001, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:40', b'1'); -INSERT INTO `sys_role_menu` VALUES (212, 101, 100, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:40', b'1'); -INSERT INTO `sys_role_menu` VALUES (213, 101, 1008, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (214, 101, 1009, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (215, 101, 1010, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (216, 101, 1011, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (217, 101, 1012, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (218, 101, 101, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (219, 101, 1063, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (220, 101, 1064, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (221, 101, 1065, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); -INSERT INTO `sys_role_menu` VALUES (222, 101, 100, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); -INSERT INTO `sys_role_menu` VALUES (223, 101, 1001, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); -INSERT INTO `sys_role_menu` VALUES (224, 101, 1002, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); -INSERT INTO `sys_role_menu` VALUES (225, 101, 1003, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); -INSERT INTO `sys_role_menu` VALUES (226, 101, 1004, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); -INSERT INTO `sys_role_menu` VALUES (227, 101, 1005, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); -INSERT INTO `sys_role_menu` VALUES (228, 101, 1006, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); -INSERT INTO `sys_role_menu` VALUES (229, 101, 1007, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); -INSERT INTO `sys_role_menu` VALUES (230, 101, 1008, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (231, 101, 1009, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (232, 101, 1010, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (233, 101, 1011, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (234, 101, 1012, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (235, 101, 101, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (236, 101, 1063, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (237, 101, 1064, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (238, 101, 1065, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); -INSERT INTO `sys_role_menu` VALUES (239, 101, 100, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (240, 101, 1001, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (241, 101, 1002, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (242, 101, 1003, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (243, 101, 1004, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (244, 101, 1005, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (245, 101, 1006, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (246, 101, 1007, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (247, 101, 1138, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (248, 101, 1139, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (249, 101, 1140, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (250, 101, 1141, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (251, 101, 1142, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); -INSERT INTO `sys_role_menu` VALUES (252, 101, 1143, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (1, 2, 1, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (2, 2, 2, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (3, 2, 3, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (4, 2, 4, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (5, 2, 100, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (6, 2, 101, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (7, 2, 102, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (8, 2, 103, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (9, 2, 104, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (10, 2, 105, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (11, 2, 106, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (12, 2, 107, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (13, 2, 108, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (14, 2, 109, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (15, 2, 110, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (16, 2, 111, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (17, 2, 112, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (18, 2, 113, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (19, 2, 114, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (20, 2, 115, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (21, 2, 116, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (22, 2, 500, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (23, 2, 501, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (24, 2, 1000, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (25, 2, 1001, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (26, 2, 1002, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (27, 2, 1003, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (28, 2, 1004, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (29, 2, 1005, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (30, 2, 1006, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (31, 2, 1007, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (32, 2, 1008, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (33, 2, 1009, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (34, 2, 1010, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (35, 2, 1011, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (36, 2, 1012, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (37, 2, 1013, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (38, 2, 1014, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (39, 2, 1015, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (40, 2, 1016, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (41, 2, 1017, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (42, 2, 1018, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (43, 2, 1019, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (44, 2, 1020, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (45, 2, 1021, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (46, 2, 1022, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (47, 2, 1023, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (48, 2, 1024, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (49, 2, 1025, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (50, 2, 1026, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (51, 2, 1027, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (52, 2, 1028, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (53, 2, 1029, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (54, 2, 1030, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (55, 2, 1031, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (56, 2, 1032, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (57, 2, 1033, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (58, 2, 1034, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (59, 2, 1035, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (60, 2, 1036, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (61, 2, 1037, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (62, 2, 1038, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (63, 2, 1039, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (64, 2, 1040, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (65, 2, 1041, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (66, 2, 1042, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (67, 2, 1043, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (68, 2, 1044, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (69, 2, 1045, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (70, 2, 1046, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (71, 2, 1047, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (72, 2, 1048, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (73, 2, 1049, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (74, 2, 1050, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (75, 2, 1051, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (76, 2, 1052, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (77, 2, 1053, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (78, 2, 1054, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (79, 2, 1055, '', '2021-01-06 17:28:04', '', '2021-01-06 17:48:51', b'1'); +INSERT INTO `system_role_menu` VALUES (80, 2, 1056, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (81, 2, 1057, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (82, 2, 1058, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (83, 2, 1059, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (84, 2, 1060, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); +INSERT INTO `system_role_menu` VALUES (169, 101, 1001, '', '2021-01-21 02:15:01', '', '2021-01-21 03:04:50', b'1'); +INSERT INTO `system_role_menu` VALUES (170, 101, 1, '', '2021-01-21 02:39:45', '', '2021-01-21 03:13:11', b'1'); +INSERT INTO `system_role_menu` VALUES (171, 101, 100, '', '2021-01-21 02:39:45', '', '2021-01-21 03:13:11', b'1'); +INSERT INTO `system_role_menu` VALUES (172, 101, 1024, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (173, 101, 1025, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (174, 101, 1026, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (175, 101, 1027, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (176, 101, 1028, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (177, 101, 1029, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (178, 101, 1030, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (179, 101, 1036, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (180, 101, 1037, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (181, 101, 1038, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (182, 101, 1039, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (183, 101, 1040, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (184, 101, 1042, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (185, 101, 1043, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (186, 101, 1045, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (187, 101, 1063, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (188, 101, 1064, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (189, 101, 1065, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (190, 101, 1007, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (191, 101, 1008, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (192, 101, 1009, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (193, 101, 1010, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (194, 101, 1011, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (195, 101, 1012, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (196, 101, 1013, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (197, 101, 1014, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (198, 101, 1015, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (199, 101, 1016, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (200, 101, 1017, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (201, 101, 1018, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (202, 101, 1019, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (203, 101, 1020, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (204, 101, 1021, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (205, 101, 1022, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (206, 101, 1023, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `system_role_menu` VALUES (207, 101, 1001, '', '2021-01-21 03:07:43', '', '2021-01-21 03:13:11', b'1'); +INSERT INTO `system_role_menu` VALUES (208, 101, 1002, '', '2021-01-21 03:07:43', '', '2021-01-21 03:10:08', b'1'); +INSERT INTO `system_role_menu` VALUES (209, 101, 1002, '', '2021-01-21 03:11:17', '', '2021-01-21 03:13:11', b'1'); +INSERT INTO `system_role_menu` VALUES (210, 101, 1, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:21', b'0'); +INSERT INTO `system_role_menu` VALUES (211, 101, 1001, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:40', b'1'); +INSERT INTO `system_role_menu` VALUES (212, 101, 100, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:40', b'1'); +INSERT INTO `system_role_menu` VALUES (213, 101, 1008, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (214, 101, 1009, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (215, 101, 1010, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (216, 101, 1011, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (217, 101, 1012, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (218, 101, 101, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (219, 101, 1063, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (220, 101, 1064, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (221, 101, 1065, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `system_role_menu` VALUES (222, 101, 100, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `system_role_menu` VALUES (223, 101, 1001, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `system_role_menu` VALUES (224, 101, 1002, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `system_role_menu` VALUES (225, 101, 1003, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `system_role_menu` VALUES (226, 101, 1004, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `system_role_menu` VALUES (227, 101, 1005, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `system_role_menu` VALUES (228, 101, 1006, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `system_role_menu` VALUES (229, 101, 1007, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `system_role_menu` VALUES (230, 101, 1008, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (231, 101, 1009, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (232, 101, 1010, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (233, 101, 1011, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (234, 101, 1012, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (235, 101, 101, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (236, 101, 1063, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (237, 101, 1064, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (238, 101, 1065, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `system_role_menu` VALUES (239, 101, 100, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (240, 101, 1001, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (241, 101, 1002, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (242, 101, 1003, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (243, 101, 1004, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (244, 101, 1005, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (245, 101, 1006, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (246, 101, 1007, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (247, 101, 1138, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (248, 101, 1139, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (249, 101, 1140, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (250, 101, 1141, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (251, 101, 1142, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); +INSERT INTO `system_role_menu` VALUES (252, 101, 1143, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_sms_channel +-- Table structure for system_sms_channel -- ---------------------------- -DROP TABLE IF EXISTS `sys_sms_channel`; -CREATE TABLE `sys_sms_channel` ( +DROP TABLE IF EXISTS `system_sms_channel`; +CREATE TABLE `system_sms_channel` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `signature` varchar(10) NOT NULL COMMENT '短信签名', - `code` varchar(63) NOT NULL COMMENT '渠道编码', + `signature` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信签名', + `code` varchar(63) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '渠道编码', `status` tinyint NOT NULL COMMENT '开启状态', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - `api_key` varchar(128) NOT NULL COMMENT '短信 API 的账号', - `api_secret` varchar(128) DEFAULT NULL COMMENT '短信 API 的秘钥', - `callback_url` varchar(255) DEFAULT NULL COMMENT '短信发送回调 URL', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `api_key` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信 API 的账号', + `api_secret` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '短信 API 的秘钥', + `callback_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '短信发送回调 URL', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='短信渠道'; -- ---------------------------- --- Records of sys_sms_channel +-- Records of system_sms_channel -- ---------------------------- BEGIN; -INSERT INTO `sys_sms_channel` VALUES (1, '芋道', 'YUN_PIAN', 0, '呵呵呵哒', '1555a14277cb8a608cf45a9e6a80d510', NULL, 'http://java.nat300.top/api/system/sms/callback/sms/yunpian', '', '2021-03-31 06:12:20', '1', '2021-04-13 01:03:19', b'0'); -INSERT INTO `sys_sms_channel` VALUES (2, 'Ballcat', 'ALIYUN', 0, '啦啦啦', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2021-04-14 00:08:37', b'0'); -INSERT INTO `sys_sms_channel` VALUES (3, '测试', 'YUN_PIAN', 0, '哈哈哈', '23132', NULL, 'http://www.baidu.com', '1', '2021-04-05 21:10:34', '1', '2021-04-11 16:21:58', b'1'); -INSERT INTO `sys_sms_channel` VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2021-04-14 00:07:10', b'0'); +INSERT INTO `system_sms_channel` VALUES (1, '芋道', 'YUN_PIAN', 0, '呵呵呵哒', '1555a14277cb8a608cf45a9e6a80d510', NULL, 'http://java.nat300.top/api/system/sms/callback/sms/yunpian', '', '2021-03-31 06:12:20', '1', '2021-04-13 01:03:19', b'0'); +INSERT INTO `system_sms_channel` VALUES (2, 'Ballcat', 'ALIYUN', 0, '啦啦啦', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2021-04-14 00:08:37', b'0'); +INSERT INTO `system_sms_channel` VALUES (3, '测试', 'YUN_PIAN', 0, '哈哈哈', '23132', NULL, 'http://www.baidu.com', '1', '2021-04-05 21:10:34', '1', '2021-04-11 16:21:58', b'1'); +INSERT INTO `system_sms_channel` VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2021-04-14 00:07:10', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_sms_code +-- Table structure for system_sms_code -- ---------------------------- -DROP TABLE IF EXISTS `sys_sms_code`; -CREATE TABLE `sys_sms_code` ( +DROP TABLE IF EXISTS `system_sms_code`; +CREATE TABLE `system_sms_code` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `mobile` varchar(11) NOT NULL COMMENT '手机号', - `code` varchar(6) NOT NULL COMMENT '验证码', - `create_ip` varchar(15) NOT NULL COMMENT '创建 IP', + `mobile` varchar(11) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手机号', + `code` varchar(6) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '验证码', + `create_ip` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '创建 IP', `scene` tinyint NOT NULL COMMENT '发送场景', `today_index` tinyint NOT NULL COMMENT '今日发送的第几条', `used` tinyint NOT NULL COMMENT '是否使用', `used_time` datetime DEFAULT NULL COMMENT '使用时间', - `used_ip` varchar(255) DEFAULT NULL COMMENT '使用 IP', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `used_ip` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '使用 IP', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE, KEY `idx_mobile` (`mobile`) USING BTREE COMMENT '手机号' -) ENGINE=InnoDB AUTO_INCREMENT=462 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='手机验证码'; +) ENGINE=InnoDB AUTO_INCREMENT=464 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='手机验证码'; -- ---------------------------- --- Records of sys_sms_code +-- Records of system_sms_code -- ---------------------------- BEGIN; -INSERT INTO `sys_sms_code` VALUES (445, '15601691300', '9999', '127.0.0.1', 1, 1, 0, NULL, NULL, NULL, '2021-10-10 21:46:49', NULL, '2021-10-10 21:46:49', b'0'); -INSERT INTO `sys_sms_code` VALUES (446, '15601691300', '9999', '127.0.0.1', 1, 2, 0, NULL, NULL, NULL, '2021-10-10 21:47:51', NULL, '2021-10-10 21:47:51', b'0'); -INSERT INTO `sys_sms_code` VALUES (447, '15601691300', '9999', '127.0.0.1', 1, 3, 0, NULL, NULL, NULL, '2021-10-10 21:48:55', NULL, '2021-10-10 21:48:55', b'0'); -INSERT INTO `sys_sms_code` VALUES (448, '15601691300', '9999', '127.0.0.1', 1, 4, 1, '2021-10-10 22:32:52', '127.0.0.1', NULL, '2021-10-10 22:32:49', NULL, '2021-10-10 22:32:52', b'0'); -INSERT INTO `sys_sms_code` VALUES (449, '15601691300', '9999', '127.0.0.1', 1, 5, 1, '2021-10-10 22:34:03', '127.0.0.1', NULL, '2021-10-10 22:34:01', NULL, '2021-10-10 22:34:03', b'0'); -INSERT INTO `sys_sms_code` VALUES (450, '15601691301', '9999', '127.0.0.1', 1, 1, 1, '2021-10-10 22:36:27', '127.0.0.1', NULL, '2021-10-10 22:34:12', NULL, '2021-10-10 22:36:27', b'0'); -INSERT INTO `sys_sms_code` VALUES (451, '15601691399', '9999', '127.0.0.1', 1, 1, 0, NULL, NULL, NULL, '2021-10-12 08:29:09', NULL, '2021-10-12 08:29:09', b'0'); -INSERT INTO `sys_sms_code` VALUES (452, '15601691399', '9999', '127.0.0.1', 1, 2, 0, NULL, NULL, NULL, '2021-10-12 08:42:16', NULL, '2021-10-12 08:42:16', b'0'); -INSERT INTO `sys_sms_code` VALUES (453, '15601691300', '9999', '127.0.0.1', 1, 6, 0, NULL, NULL, NULL, '2021-11-28 20:29:24', NULL, '2021-11-28 20:29:24', b'0'); -INSERT INTO `sys_sms_code` VALUES (454, '15601691300', '9999', '127.0.0.1', 1, 7, 0, NULL, NULL, NULL, '2021-11-28 20:30:33', NULL, '2021-11-28 20:30:33', b'0'); -INSERT INTO `sys_sms_code` VALUES (455, '15601691300', '9999', '127.0.0.1', 1, 8, 0, NULL, NULL, NULL, '2021-11-28 20:31:49', NULL, '2021-11-28 20:31:49', b'0'); -INSERT INTO `sys_sms_code` VALUES (456, '15601691301', '9999', '127.0.0.1', 1, 2, 0, NULL, NULL, NULL, '2021-11-28 20:32:22', NULL, '2021-11-28 20:32:22', b'0'); -INSERT INTO `sys_sms_code` VALUES (457, '15601691302', '9999', '127.0.0.1', 1, 1, 0, NULL, NULL, NULL, '2021-11-28 20:33:04', NULL, '2021-11-28 20:33:04', b'0'); -INSERT INTO `sys_sms_code` VALUES (458, '15601691322', '9999', '127.0.0.1', 1, 1, 0, NULL, NULL, NULL, '2021-11-28 20:33:24', NULL, '2021-11-28 20:33:24', b'0'); -INSERT INTO `sys_sms_code` VALUES (459, '15601691322', '9999', '127.0.0.1', 1, 2, 0, NULL, NULL, NULL, '2021-11-28 20:34:48', NULL, '2021-11-28 20:34:48', b'0'); -INSERT INTO `sys_sms_code` VALUES (460, '15601691300', '9999', '127.0.0.1', 1, 9, 1, '2021-11-28 20:37:02', '127.0.0.1', NULL, '2021-11-28 20:36:59', NULL, '2021-11-28 20:37:02', b'0'); -INSERT INTO `sys_sms_code` VALUES (461, '15601691300', '9999', '127.0.0.1', 1, 10, 1, '2021-11-28 20:47:51', '127.0.0.1', '245', '2021-11-28 20:47:49', '245', '2021-11-28 20:47:51', b'0'); +INSERT INTO `system_sms_code` VALUES (445, '15601691300', '9999', '127.0.0.1', 1, 1, 0, NULL, NULL, NULL, '2021-10-10 21:46:49', NULL, '2021-10-10 21:46:49', b'0'); +INSERT INTO `system_sms_code` VALUES (446, '15601691300', '9999', '127.0.0.1', 1, 2, 0, NULL, NULL, NULL, '2021-10-10 21:47:51', NULL, '2021-10-10 21:47:51', b'0'); +INSERT INTO `system_sms_code` VALUES (447, '15601691300', '9999', '127.0.0.1', 1, 3, 0, NULL, NULL, NULL, '2021-10-10 21:48:55', NULL, '2021-10-10 21:48:55', b'0'); +INSERT INTO `system_sms_code` VALUES (448, '15601691300', '9999', '127.0.0.1', 1, 4, 1, '2021-10-10 22:32:52', '127.0.0.1', NULL, '2021-10-10 22:32:49', NULL, '2021-10-10 22:32:52', b'0'); +INSERT INTO `system_sms_code` VALUES (449, '15601691300', '9999', '127.0.0.1', 1, 5, 1, '2021-10-10 22:34:03', '127.0.0.1', NULL, '2021-10-10 22:34:01', NULL, '2021-10-10 22:34:03', b'0'); +INSERT INTO `system_sms_code` VALUES (450, '15601691301', '9999', '127.0.0.1', 1, 1, 1, '2021-10-10 22:36:27', '127.0.0.1', NULL, '2021-10-10 22:34:12', NULL, '2021-10-10 22:36:27', b'0'); +INSERT INTO `system_sms_code` VALUES (451, '15601691399', '9999', '127.0.0.1', 1, 1, 0, NULL, NULL, NULL, '2021-10-12 08:29:09', NULL, '2021-10-12 08:29:09', b'0'); +INSERT INTO `system_sms_code` VALUES (452, '15601691399', '9999', '127.0.0.1', 1, 2, 0, NULL, NULL, NULL, '2021-10-12 08:42:16', NULL, '2021-10-12 08:42:16', b'0'); +INSERT INTO `system_sms_code` VALUES (453, '15601691300', '9999', '127.0.0.1', 1, 6, 0, NULL, NULL, NULL, '2021-11-28 20:29:24', NULL, '2021-11-28 20:29:24', b'0'); +INSERT INTO `system_sms_code` VALUES (454, '15601691300', '9999', '127.0.0.1', 1, 7, 0, NULL, NULL, NULL, '2021-11-28 20:30:33', NULL, '2021-11-28 20:30:33', b'0'); +INSERT INTO `system_sms_code` VALUES (455, '15601691300', '9999', '127.0.0.1', 1, 8, 0, NULL, NULL, NULL, '2021-11-28 20:31:49', NULL, '2021-11-28 20:31:49', b'0'); +INSERT INTO `system_sms_code` VALUES (456, '15601691301', '9999', '127.0.0.1', 1, 2, 0, NULL, NULL, NULL, '2021-11-28 20:32:22', NULL, '2021-11-28 20:32:22', b'0'); +INSERT INTO `system_sms_code` VALUES (457, '15601691302', '9999', '127.0.0.1', 1, 1, 0, NULL, NULL, NULL, '2021-11-28 20:33:04', NULL, '2021-11-28 20:33:04', b'0'); +INSERT INTO `system_sms_code` VALUES (458, '15601691322', '9999', '127.0.0.1', 1, 1, 0, NULL, NULL, NULL, '2021-11-28 20:33:24', NULL, '2021-11-28 20:33:24', b'0'); +INSERT INTO `system_sms_code` VALUES (459, '15601691322', '9999', '127.0.0.1', 1, 2, 0, NULL, NULL, NULL, '2021-11-28 20:34:48', NULL, '2021-11-28 20:34:48', b'0'); +INSERT INTO `system_sms_code` VALUES (460, '15601691300', '9999', '127.0.0.1', 1, 9, 1, '2021-11-28 20:37:02', '127.0.0.1', NULL, '2021-11-28 20:36:59', NULL, '2021-11-28 20:37:02', b'0'); +INSERT INTO `system_sms_code` VALUES (461, '15601691300', '9999', '127.0.0.1', 1, 10, 1, '2021-11-28 20:47:51', '127.0.0.1', '245', '2021-11-28 20:47:49', '245', '2021-11-28 20:47:51', b'0'); +INSERT INTO `system_sms_code` VALUES (462, '15601691399', '9999', '127.0.0.1', 1, 3, 0, NULL, NULL, NULL, '2022-01-29 11:50:26', NULL, '2022-01-29 11:50:26', b'0'); +INSERT INTO `system_sms_code` VALUES (463, '15601691399', '9999', '127.0.0.1', 1, 4, 0, NULL, NULL, NULL, '2022-01-29 13:58:06', NULL, '2022-01-29 13:58:06', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_sms_log +-- Table structure for system_sms_log -- ---------------------------- -DROP TABLE IF EXISTS `sys_sms_log`; -CREATE TABLE `sys_sms_log` ( +DROP TABLE IF EXISTS `system_sms_log`; +CREATE TABLE `system_sms_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', `channel_id` bigint NOT NULL COMMENT '短信渠道编号', - `channel_code` varchar(63) NOT NULL COMMENT '短信渠道编码', + `channel_code` varchar(63) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信渠道编码', `template_id` bigint NOT NULL COMMENT '模板编号', - `template_code` varchar(63) NOT NULL COMMENT '模板编码', + `template_code` varchar(63) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', `template_type` tinyint NOT NULL COMMENT '短信类型', - `template_content` varchar(255) NOT NULL COMMENT '短信内容', - `template_params` varchar(255) NOT NULL COMMENT '短信参数', - `api_template_id` varchar(63) NOT NULL COMMENT '短信 API 的模板编号', - `mobile` varchar(11) NOT NULL COMMENT '手机号', + `template_content` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信内容', + `template_params` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信参数', + `api_template_id` varchar(63) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信 API 的模板编号', + `mobile` varchar(11) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手机号', `user_id` bigint DEFAULT NULL COMMENT '用户编号', `user_type` tinyint DEFAULT NULL COMMENT '用户类型', `send_status` tinyint NOT NULL DEFAULT '0' COMMENT '发送状态', `send_time` datetime DEFAULT NULL COMMENT '发送时间', `send_code` int DEFAULT NULL COMMENT '发送结果的编码', - `send_msg` varchar(255) DEFAULT NULL COMMENT '发送结果的提示', - `api_send_code` varchar(63) DEFAULT NULL COMMENT '短信 API 发送结果的编码', - `api_send_msg` varchar(255) DEFAULT NULL COMMENT '短信 API 发送失败的提示', - `api_request_id` varchar(255) DEFAULT NULL COMMENT '短信 API 发送返回的唯一请求 ID', - `api_serial_no` varchar(255) DEFAULT NULL COMMENT '短信 API 发送返回的序号', + `send_msg` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发送结果的提示', + `api_send_code` varchar(63) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '短信 API 发送结果的编码', + `api_send_msg` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '短信 API 发送失败的提示', + `api_request_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '短信 API 发送返回的唯一请求 ID', + `api_serial_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '短信 API 发送返回的序号', `receive_status` tinyint NOT NULL DEFAULT '0' COMMENT '接收状态', `receive_time` datetime DEFAULT NULL COMMENT '接收时间', - `api_receive_code` varchar(63) DEFAULT NULL COMMENT 'API 接收结果的编码', - `api_receive_msg` varchar(255) DEFAULT NULL COMMENT 'API 接收结果的说明', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `api_receive_code` varchar(63) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'API 接收结果的编码', + `api_receive_msg` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'API 接收结果的说明', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=116 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='短信日志'; +) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='短信日志'; -- ---------------------------- --- Records of sys_sms_log +-- Records of system_sms_log -- ---------------------------- BEGIN; +INSERT INTO `system_sms_log` VALUES (116, 4, 'DEBUG_DING_TALK', 9, 'bpm_task_assigned', 2, '您收到了一条新的待办任务:eeee-申请,申请人:芋道源码,处理链接:http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=b243fa82-7c06-11ec-9110-acde48001122', '{\"startUserNickname\":\"芋道源码\",\"taskName\":\"申请\",\"detailUrl\":\"http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=b243fa82-7c06-11ec-9110-acde48001122\",\"processInstanceName\":\"eeee\"}', 'suibian', '15612345678', 1, 2, 10, '2022-01-23 12:41:21', 0, '成功', '0', NULL, NULL, 'b8b77315-6e6f-46a4-82e7-8610d198bef8', 0, NULL, NULL, NULL, '1', '2022-01-23 12:41:19', NULL, '2022-01-23 12:41:21', b'0'); +INSERT INTO `system_sms_log` VALUES (117, 4, 'DEBUG_DING_TALK', 9, 'bpm_task_assigned', 2, '您收到了一条新的待办任务:eeee-申请,申请人:芋道源码,处理链接:http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=b243fa82-7c06-11ec-9110-acde48001122', '{\"startUserNickname\":\"芋道源码\",\"taskName\":\"申请\",\"detailUrl\":\"http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=b243fa82-7c06-11ec-9110-acde48001122\",\"processInstanceName\":\"eeee\"}', 'suibian', '15612345678', 1, 2, 10, '2022-01-23 12:41:21', 0, '成功', '0', NULL, NULL, 'b06bbd9b-912b-4d61-9dc2-a7f7e336ebe2', 0, NULL, NULL, NULL, '1', '2022-01-23 12:41:19', NULL, '2022-01-23 12:41:21', b'0'); +INSERT INTO `system_sms_log` VALUES (118, 4, 'DEBUG_DING_TALK', 9, 'bpm_task_assigned', 2, '您收到了一条新的待办任务:测试多审批人-1.1,申请人:芋道源码,处理链接:http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=ecddb286-7c07-11ec-a41d-acde48001122', '{\"startUserNickname\":\"芋道源码\",\"taskName\":\"1.1\",\"detailUrl\":\"http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=ecddb286-7c07-11ec-a41d-acde48001122\",\"processInstanceName\":\"测试多审批人\"}', 'suibian', '15612345678', 1, 2, 10, '2022-01-23 12:50:08', 0, '成功', '0', NULL, NULL, '97c8032c-e159-4e96-8d4a-c087a780f390', 0, NULL, NULL, NULL, '1', '2022-01-23 12:50:06', NULL, '2022-01-23 12:50:08', b'0'); +INSERT INTO `system_sms_log` VALUES (119, 4, 'DEBUG_DING_TALK', 9, 'bpm_task_assigned', 2, '您收到了一条新的待办任务:测试多审批人-1.2,申请人:芋道源码,处理链接:http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=ecddb286-7c07-11ec-a41d-acde48001122', '{\"startUserNickname\":\"芋道源码\",\"taskName\":\"1.2\",\"detailUrl\":\"http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=ecddb286-7c07-11ec-a41d-acde48001122\",\"processInstanceName\":\"测试多审批人\"}', 'suibian', '15612345678', 1, 2, 10, '2022-01-23 12:50:08', 0, '成功', '0', NULL, NULL, '880a1432-2de0-409d-9e72-0e9ecbe073fb', 0, NULL, NULL, NULL, '1', '2022-01-23 12:50:06', NULL, '2022-01-23 12:50:08', b'0'); +INSERT INTO `system_sms_log` VALUES (120, 4, 'DEBUG_DING_TALK', 9, 'bpm_task_assigned', 2, '您收到了一条新的待办任务:测试多审批人-1.2,申请人:芋道源码,处理链接:http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=ecddb286-7c07-11ec-a41d-acde48001122', '{\"startUserNickname\":\"芋道源码\",\"taskName\":\"1.2\",\"detailUrl\":\"http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=ecddb286-7c07-11ec-a41d-acde48001122\",\"processInstanceName\":\"测试多审批人\"}', 'suibian', '15612345678', 1, 2, 10, '2022-01-23 12:50:08', 0, '成功', '0', NULL, NULL, 'de12a261-fc48-4a0c-8b9d-8628f6697ca8', 0, NULL, NULL, NULL, '1', '2022-01-23 12:50:06', NULL, '2022-01-23 12:50:08', b'0'); +INSERT INTO `system_sms_log` VALUES (121, 4, 'DEBUG_DING_TALK', 9, 'bpm_task_assigned', 2, '您收到了一条新的待办任务:测试多审批人-1.1,申请人:芋道源码,处理链接:http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=ecddb286-7c07-11ec-a41d-acde48001122', '{\"startUserNickname\":\"芋道源码\",\"taskName\":\"1.1\",\"detailUrl\":\"http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=ecddb286-7c07-11ec-a41d-acde48001122\",\"processInstanceName\":\"测试多审批人\"}', 'suibian', '15612345678', 1, 2, 10, '2022-01-23 12:50:08', 0, '成功', '0', NULL, NULL, '0d482592-56c2-4855-b846-b218fafa8b2f', 0, NULL, NULL, NULL, '1', '2022-01-23 12:50:06', NULL, '2022-01-23 12:50:08', b'0'); +INSERT INTO `system_sms_log` VALUES (122, 4, 'DEBUG_DING_TALK', 9, 'bpm_task_assigned', 2, '您收到了一条新的待办任务:滔博-任务一,申请人:芋道源码,处理链接:http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=4f676a08-7c09-11ec-b8a1-acde48001122', '{\"startUserNickname\":\"芋道源码\",\"taskName\":\"任务一\",\"detailUrl\":\"http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=4f676a08-7c09-11ec-b8a1-acde48001122\",\"processInstanceName\":\"滔博\"}', 'suibian', '15612345678', 1, 2, 10, '2022-01-23 12:59:58', 0, '成功', '0', NULL, NULL, '792d966f-a5ab-43bb-9a33-706688e1550b', 0, NULL, NULL, NULL, '1', '2022-01-23 12:59:57', NULL, '2022-01-23 12:59:58', b'0'); +INSERT INTO `system_sms_log` VALUES (123, 4, 'DEBUG_DING_TALK', 9, 'bpm_task_assigned', 2, '您收到了一条新的待办任务:滔博-任务一,申请人:芋道源码,处理链接:http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=4f676a08-7c09-11ec-b8a1-acde48001122', '{\"startUserNickname\":\"芋道源码\",\"taskName\":\"任务一\",\"detailUrl\":\"http://dashboard.yudao.iocoder.cnbpm/process-instance/detail?id=4f676a08-7c09-11ec-b8a1-acde48001122\",\"processInstanceName\":\"滔博\"}', 'suibian', '15612345678', 1, 2, 10, '2022-01-23 12:59:58', 0, '成功', '0', NULL, NULL, '54cdaa92-8d2c-4c53-826f-70397eb29531', 0, NULL, NULL, NULL, '1', '2022-01-23 12:59:57', NULL, '2022-01-23 12:59:58', b'0'); +INSERT INTO `system_sms_log` VALUES (124, 1, 'YUN_PIAN', 8, 'user-sms-login', 1, '您的验证码是9999', '{\"code\":\"9999\"}', '4372216', '15601691399', NULL, 1, 20, '2022-01-29 11:50:27', 2001000100, 'IP 不允许发送短信', '-3', 'IP没有权限 => IP 101.82.59.182 未加入白名单,可在后台‘系统设置->IP白名单设置’里添加', NULL, NULL, 0, NULL, NULL, NULL, NULL, '2022-01-29 11:50:26', NULL, '2022-01-29 11:50:27', b'0'); +INSERT INTO `system_sms_log` VALUES (125, 1, 'YUN_PIAN', 8, 'user-sms-login', 1, '您的验证码是9999', '{\"code\":\"9999\"}', '4372216', '15601691399', NULL, 1, 20, '2022-01-29 13:58:07', 2001000100, 'IP 不允许发送短信', '-3', 'IP没有权限 => IP 101.82.80.210 未加入白名单,可在后台‘系统设置->IP白名单设置’里添加', NULL, NULL, 0, NULL, NULL, NULL, NULL, '2022-01-29 13:58:07', NULL, '2022-01-29 13:58:07', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_sms_template +-- Table structure for system_sms_template -- ---------------------------- -DROP TABLE IF EXISTS `sys_sms_template`; -CREATE TABLE `sys_sms_template` ( +DROP TABLE IF EXISTS `system_sms_template`; +CREATE TABLE `system_sms_template` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', `type` tinyint NOT NULL COMMENT '短信签名', `status` tinyint NOT NULL COMMENT '开启状态', @@ -2547,26 +3091,26 @@ CREATE TABLE `sys_sms_template` ( ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='短信模板'; -- ---------------------------- --- Records of sys_sms_template +-- Records of system_sms_template -- ---------------------------- BEGIN; -INSERT INTO `sys_sms_template` VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '[\"operation\",\"code\"]', NULL, '4383920', 1, 'YUN_PIAN', '', '2021-03-31 10:49:38', '1', '2021-04-10 01:22:00', b'0'); -INSERT INTO `sys_sms_template` VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '[\"code\"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', b'0'); -INSERT INTO `sys_sms_template` VALUES (4, 3, 0, 'test-ooxx', '测试模板', 'biubiubiu', '[]', '1111', '110', 1, 'YUN_PIAN', '1', '2021-04-09 23:58:42', '1', '2021-04-02 07:47:12', b'1'); -INSERT INTO `sys_sms_template` VALUES (5, 3, 0, 'test-ooxx', '测试模板', 'biubiubiu', '[]', '1111', '110', 1, 'YUN_PIAN', '1', '2021-04-09 23:58:42', '1', '2021-04-02 08:32:22', b'1'); -INSERT INTO `sys_sms_template` VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '[\"name\"]', 'f哈哈哈', '4383920', 1, 'YUN_PIAN', '1', '2021-04-10 01:07:21', '1', '2021-04-10 01:22:05', b'0'); -INSERT INTO `sys_sms_template` VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '[\"name\",\"code\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2021-04-14 00:30:38', b'0'); -INSERT INTO `sys_sms_template` VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '[\"code\"]', NULL, '4372216', 1, 'YUN_PIAN', '1', '2021-10-11 08:10:00', '1', '2021-10-11 08:10:00', b'0'); -INSERT INTO `sys_sms_template` VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '[\"processInstanceName\",\"taskName\",\"startUserNickname\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', b'0'); -INSERT INTO `sys_sms_template` VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{comment},查看链接:{detailUrl}', '[\"processInstanceName\",\"comment\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-01-22 00:24:31', b'0'); -INSERT INTO `sys_sms_template` VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '[\"processInstanceName\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-01-22 00:24:23', b'0'); +INSERT INTO `system_sms_template` VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '[\"operation\",\"code\"]', NULL, '4383920', 1, 'YUN_PIAN', '', '2021-03-31 10:49:38', '1', '2021-04-10 01:22:00', b'0'); +INSERT INTO `system_sms_template` VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '[\"code\"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', b'0'); +INSERT INTO `system_sms_template` VALUES (4, 3, 0, 'test-ooxx', '测试模板', 'biubiubiu', '[]', '1111', '110', 1, 'YUN_PIAN', '1', '2021-04-09 23:58:42', '1', '2021-04-02 07:47:12', b'1'); +INSERT INTO `system_sms_template` VALUES (5, 3, 0, 'test-ooxx', '测试模板', 'biubiubiu', '[]', '1111', '110', 1, 'YUN_PIAN', '1', '2021-04-09 23:58:42', '1', '2021-04-02 08:32:22', b'1'); +INSERT INTO `system_sms_template` VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '[\"name\"]', 'f哈哈哈', '4383920', 1, 'YUN_PIAN', '1', '2021-04-10 01:07:21', '1', '2021-04-10 01:22:05', b'0'); +INSERT INTO `system_sms_template` VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '[\"name\",\"code\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2021-04-14 00:30:38', b'0'); +INSERT INTO `system_sms_template` VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '[\"code\"]', NULL, '4372216', 1, 'YUN_PIAN', '1', '2021-10-11 08:10:00', '1', '2021-10-11 08:10:00', b'0'); +INSERT INTO `system_sms_template` VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '[\"processInstanceName\",\"taskName\",\"startUserNickname\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', b'0'); +INSERT INTO `system_sms_template` VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{comment},查看链接:{detailUrl}', '[\"processInstanceName\",\"comment\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-01-22 00:24:31', b'0'); +INSERT INTO `system_sms_template` VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '[\"processInstanceName\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-01-22 00:24:23', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_social_user +-- Table structure for system_social_user -- ---------------------------- -DROP TABLE IF EXISTS `sys_social_user`; -CREATE TABLE `sys_social_user` ( +DROP TABLE IF EXISTS `system_social_user`; +CREATE TABLE `system_social_user` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键(自增策略)', `user_id` bigint NOT NULL COMMENT '关联的用户编号', `user_type` tinyint NOT NULL DEFAULT '0' COMMENT '用户类型', @@ -2587,62 +3131,62 @@ CREATE TABLE `sys_social_user` ( ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='社交用户'; -- ---------------------------- --- Records of sys_social_user +-- Records of system_social_user -- ---------------------------- BEGIN; -INSERT INTO `sys_social_user` VALUES (4, 1, 2, 20, 'IPRmJ0wvBptiPIlGEZiPewGwiEiE', NULL, 'IPRmJ0wvBptiPIlGEZiPewGwiEiE', '{\"accessToken\":null,\"expireIn\":0,\"refreshToken\":null,\"refreshTokenExpireIn\":0,\"uid\":null,\"openId\":\"0TvabQWZs9g6UedEWZKSegiEiE\",\"accessCode\":null,\"unionId\":\"IPRmJ0wvBptiPIlGEZiPewGwiEiE\",\"scope\":null,\"tokenType\":null,\"idToken\":null,\"macAlgorithm\":null,\"macKey\":null,\"code\":null,\"oauthToken\":null,\"oauthTokenSecret\":null,\"userId\":null,\"screenName\":null,\"oauthCallbackConfirmed\":null}', '王文斌(芋艿)(正在输出)', NULL, '{\"nick\":\"王文斌(芋艿)(正在输出)\",\"unionid\":\"IPRmJ0wvBptiPIlGEZiPewGwiEiE\",\"dingId\":\"$:LWCP_v1:$r28ct/waSBPp5Gk7a6kDXA==\",\"openid\":\"0TvabQWZs9g6UedEWZKSegiEiE\",\"main_org_auth_high_level\":false}', NULL, '2021-10-06 00:43:17', NULL, '2021-10-06 00:43:34', b'0'); -INSERT INTO `sys_social_user` VALUES (5, 245, 1, 33, 'osFZg6JVT_mbOOXfeCSxmRv-Cs_4', NULL, 'osFZg6JVT_mbOOXfeCSxmRv-Cs_4', '{\"accessToken\":null,\"expireIn\":0,\"refreshToken\":null,\"refreshTokenExpireIn\":0,\"uid\":null,\"openId\":\"osFZg6JVT_mbOOXfeCSxmRv-Cs_4\",\"accessCode\":null,\"unionId\":null,\"scope\":null,\"tokenType\":null,\"idToken\":null,\"macAlgorithm\":null,\"macKey\":null,\"code\":null,\"oauthToken\":null,\"oauthTokenSecret\":null,\"userId\":null,\"screenName\":null,\"oauthCallbackConfirmed\":null,\"miniSessionKey\":\"7BK7xtyJleOWEXTHhW6eDg==\"}', '', '', 'null', NULL, '2021-10-30 10:08:42', NULL, '2021-10-30 10:08:42', b'0'); +INSERT INTO `system_social_user` VALUES (4, 1, 2, 20, 'IPRmJ0wvBptiPIlGEZiPewGwiEiE', NULL, 'IPRmJ0wvBptiPIlGEZiPewGwiEiE', '{\"accessToken\":null,\"expireIn\":0,\"refreshToken\":null,\"refreshTokenExpireIn\":0,\"uid\":null,\"openId\":\"0TvabQWZs9g6UedEWZKSegiEiE\",\"accessCode\":null,\"unionId\":\"IPRmJ0wvBptiPIlGEZiPewGwiEiE\",\"scope\":null,\"tokenType\":null,\"idToken\":null,\"macAlgorithm\":null,\"macKey\":null,\"code\":null,\"oauthToken\":null,\"oauthTokenSecret\":null,\"userId\":null,\"screenName\":null,\"oauthCallbackConfirmed\":null}', '王文斌(芋艿)(正在输出)', NULL, '{\"nick\":\"王文斌(芋艿)(正在输出)\",\"unionid\":\"IPRmJ0wvBptiPIlGEZiPewGwiEiE\",\"dingId\":\"$:LWCP_v1:$r28ct/waSBPp5Gk7a6kDXA==\",\"openid\":\"0TvabQWZs9g6UedEWZKSegiEiE\",\"main_org_auth_high_level\":false}', NULL, '2021-10-06 00:43:17', NULL, '2022-02-01 15:00:30', b'1'); +INSERT INTO `system_social_user` VALUES (5, 245, 1, 33, 'osFZg6JVT_mbOOXfeCSxmRv-Cs_4', NULL, 'osFZg6JVT_mbOOXfeCSxmRv-Cs_4', '{\"accessToken\":null,\"expireIn\":0,\"refreshToken\":null,\"refreshTokenExpireIn\":0,\"uid\":null,\"openId\":\"osFZg6JVT_mbOOXfeCSxmRv-Cs_4\",\"accessCode\":null,\"unionId\":null,\"scope\":null,\"tokenType\":null,\"idToken\":null,\"macAlgorithm\":null,\"macKey\":null,\"code\":null,\"oauthToken\":null,\"oauthTokenSecret\":null,\"userId\":null,\"screenName\":null,\"oauthCallbackConfirmed\":null,\"miniSessionKey\":\"7BK7xtyJleOWEXTHhW6eDg==\"}', '', '', 'null', NULL, '2021-10-30 10:08:42', NULL, '2021-10-30 10:08:42', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_tenant +-- Table structure for system_tenant -- ---------------------------- -DROP TABLE IF EXISTS `sys_tenant`; -CREATE TABLE `sys_tenant` ( +DROP TABLE IF EXISTS `system_tenant`; +CREATE TABLE `system_tenant` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '租户编号', `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '租户名', `contact_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系人', `contact_mobile` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系手机', `status` tinyint NOT NULL DEFAULT '0' COMMENT '租户状态(0正常 1停用)', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租户表'; -- ---------------------------- --- Records of sys_tenant +-- Records of system_tenant -- ---------------------------- BEGIN; -INSERT INTO `sys_tenant` VALUES (1, '芋道源码', '芋艿', '17321315478', 0, 'admin', '2021-01-05 17:03:47', NULL, '2021-12-05 02:22:26', b'0'); -INSERT INTO `sys_tenant` VALUES (107, '测试租户', '秃头', '15601691300', 1, '1', '2021-12-14 20:49:44', '1', '2021-12-14 20:49:49', b'0'); -INSERT INTO `sys_tenant` VALUES (108, '测试', '测试', '15601691300', 1, '1', '2021-12-14 21:02:09', '1', '2021-12-14 21:02:09', b'0'); +INSERT INTO `system_tenant` VALUES (1, '芋道源码', '芋艿', '17321315478', 0, 'admin', '2021-01-05 17:03:47', NULL, '2021-12-05 02:22:26', b'0'); +INSERT INTO `system_tenant` VALUES (107, '测试租户', '秃头', '15601691300', 1, '1', '2021-12-14 20:49:44', '1', '2021-12-14 20:49:49', b'0'); +INSERT INTO `system_tenant` VALUES (108, '测试', '测试', '15601691300', 1, '1', '2021-12-14 21:02:09', '1', '2021-12-14 21:02:09', b'0'); COMMIT; -- ---------------------------- --- Table structure for sys_user +-- Table structure for system_user -- ---------------------------- -DROP TABLE IF EXISTS `sys_user`; -CREATE TABLE `sys_user` ( +DROP TABLE IF EXISTS `system_user`; +CREATE TABLE `system_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', - `username` varchar(30) NOT NULL COMMENT '用户账号', - `password` varchar(100) NOT NULL DEFAULT '' COMMENT '密码', - `nickname` varchar(30) NOT NULL COMMENT '用户昵称', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `username` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户账号', + `password` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码', + `nickname` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户昵称', + `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', `dept_id` bigint DEFAULT NULL COMMENT '部门ID', - `post_ids` varchar(255) DEFAULT NULL COMMENT '岗位编号数组', - `email` varchar(50) DEFAULT '' COMMENT '用户邮箱', - `mobile` varchar(11) DEFAULT '' COMMENT '手机号码', + `post_ids` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '岗位编号数组', + `email` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '用户邮箱', + `mobile` varchar(11) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '手机号码', `sex` tinyint DEFAULT '0' COMMENT '用户性别', - `avatar` varchar(100) DEFAULT '' COMMENT '头像地址', + `avatar` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '头像地址', `status` tinyint NOT NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', - `login_ip` varchar(50) DEFAULT '' COMMENT '最后登录IP', + `login_ip` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '最后登录IP', `login_date` datetime DEFAULT NULL COMMENT '最后登录时间', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', @@ -2650,29 +3194,29 @@ CREATE TABLE `sys_user` ( ) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户信息表'; -- ---------------------------- --- Records of sys_user +-- Records of system_user -- ---------------------------- BEGIN; -INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '15612345678', 1, 'http://127.0.0.1:48080/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', 0, '127.0.0.1', '2022-01-22 23:30:35', 'admin', '2021-01-05 17:03:47', NULL, '2022-01-22 23:30:35', b'0', 1); -INSERT INTO `sys_user` VALUES (2, 'ry', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '若依', '测试员', 103, '[2]', 'ry@qq.com', '15666666666', 1, '', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '', '2021-12-13 01:26:34', b'1', 1); -INSERT INTO `sys_user` VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '', NULL, '', '2021-01-07 09:07:17', '104', '2021-12-16 09:26:10', b'0', 1); -INSERT INTO `sys_user` VALUES (103, 'yuanma', '$2a$10$wWoPT7sqriM2O1YXRL.je.GiL538OR6ZTN8aQZr9JAGdnpCH2tpYe', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '127.0.0.1', '2022-01-18 00:33:40', '', '2021-01-13 23:50:35', NULL, '2022-01-18 00:33:40', b'0', 1); -INSERT INTO `sys_user` VALUES (104, 'test', '$2a$10$CkyM2xvzUhSWsh.JqGcSju.KjlPsaX1A76wO8O/mYtkpQvcp2jWTW', '测试号', NULL, 107, '[]', '', '15601691200', 1, '', 0, '127.0.0.1', '2021-12-16 09:27:08', '', '2021-01-21 02:13:53', NULL, '2021-12-16 09:27:08', b'0', 1); -INSERT INTO `sys_user` VALUES (105, 'hradmin', '$2a$10$JEhJOL25X1eMnFfR3PILo.MoAljf29YukpL2w6H9GvVGjmqOCuh.O', 'hr-mgr', 'hr 管理员', 109, '[3]', '', '18818260000', 1, '', 0, '127.0.0.1', '2021-10-30 21:19:36', '1', '2021-09-25 16:50:41', '1', '2021-12-16 09:26:41', b'0', 1); -INSERT INTO `sys_user` VALUES (106, 'zhijiantianya', '$2a$10$Y0hSfV2udA8quqMeWukhTuHEoKpQ5tDhclG8WUWSOH7o/MGw185Ti', '芋道源码', '', NULL, NULL, '', '', 3, 'https://portrait.gitee.com/uploads/avatars/user/0/176_zhijiantianya_1578913741.png', 0, '', NULL, NULL, '2021-09-28 09:40:59', NULL, '2021-12-15 14:44:47', b'1', 1); +INSERT INTO `system_user` VALUES (1, 'admin', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '15612345678', 1, 'http://127.0.0.1:48080/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', 0, '127.0.0.1', '2022-02-02 00:27:55', 'admin', '2021-01-05 17:03:47', NULL, '2022-02-02 00:27:55', b'0', 1); +INSERT INTO `system_user` VALUES (2, 'ry', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '若依', '测试员', 103, '[2]', 'ry@qq.com', '15666666666', 1, '', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '', '2021-12-13 01:26:34', b'1', 1); +INSERT INTO `system_user` VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '', NULL, '', '2021-01-07 09:07:17', '104', '2021-12-16 09:26:10', b'0', 1); +INSERT INTO `system_user` VALUES (103, 'yuanma', '$2a$10$wWoPT7sqriM2O1YXRL.je.GiL538OR6ZTN8aQZr9JAGdnpCH2tpYe', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '127.0.0.1', '2022-01-18 00:33:40', '', '2021-01-13 23:50:35', NULL, '2022-01-18 00:33:40', b'0', 1); +INSERT INTO `system_user` VALUES (104, 'test', '$2a$10$CkyM2xvzUhSWsh.JqGcSju.KjlPsaX1A76wO8O/mYtkpQvcp2jWTW', '测试号', NULL, 107, '[]', '', '15601691200', 1, '', 0, '127.0.0.1', '2021-12-16 09:27:08', '', '2021-01-21 02:13:53', NULL, '2021-12-16 09:27:08', b'0', 1); +INSERT INTO `system_user` VALUES (105, 'hradmin', '$2a$10$JEhJOL25X1eMnFfR3PILo.MoAljf29YukpL2w6H9GvVGjmqOCuh.O', 'hr-mgr', 'hr 管理员', 109, '[3]', '', '18818260000', 1, '', 0, '127.0.0.1', '2021-10-30 21:19:36', '1', '2021-09-25 16:50:41', '1', '2021-12-16 09:26:41', b'0', 1); +INSERT INTO `system_user` VALUES (106, 'zhijiantianya', '$2a$10$Y0hSfV2udA8quqMeWukhTuHEoKpQ5tDhclG8WUWSOH7o/MGw185Ti', '芋道源码', '', NULL, NULL, '', '', 3, 'https://portrait.gitee.com/uploads/avatars/user/0/176_zhijiantianya_1578913741.png', 0, '', NULL, NULL, '2021-09-28 09:40:59', NULL, '2021-12-15 14:44:47', b'1', 1); COMMIT; -- ---------------------------- --- Table structure for sys_user_role +-- Table structure for system_user_role -- ---------------------------- -DROP TABLE IF EXISTS `sys_user_role`; -CREATE TABLE `sys_user_role` ( +DROP TABLE IF EXISTS `system_user_role`; +CREATE TABLE `system_user_role` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增编号', `user_id` bigint NOT NULL COMMENT '用户ID', `role_id` bigint NOT NULL COMMENT '角色ID', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', @@ -2680,26 +3224,26 @@ CREATE TABLE `sys_user_role` ( ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户和角色关联表'; -- ---------------------------- --- Records of sys_user_role +-- Records of system_user_role -- ---------------------------- BEGIN; -INSERT INTO `sys_user_role` VALUES (1, 1, 1, '', NULL, '', NULL, b'0', 0); -INSERT INTO `sys_user_role` VALUES (2, 2, 2, '', NULL, '', NULL, b'0', 0); -INSERT INTO `sys_user_role` VALUES (3, 100, 1, '', NULL, '', NULL, b'1', 0); -INSERT INTO `sys_user_role` VALUES (4, 100, 101, '', NULL, '', NULL, b'0', 0); -INSERT INTO `sys_user_role` VALUES (5, 100, 1, '', NULL, '', NULL, b'0', 0); -INSERT INTO `sys_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0', 0); -INSERT INTO `sys_user_role` VALUES (7, 104, 101, '', NULL, '', NULL, b'0', 0); -INSERT INTO `sys_user_role` VALUES (8, 106, 1, NULL, '2021-09-28 09:40:59', NULL, '2021-09-28 09:40:59', b'1', 0); -INSERT INTO `sys_user_role` VALUES (9, 105, 1, '1', '2021-10-30 13:40:48', '1', '2021-10-30 13:40:48', b'0', 0); -INSERT INTO `sys_user_role` VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', b'0', 0); +INSERT INTO `system_user_role` VALUES (1, 1, 1, '', NULL, '', NULL, b'0', 0); +INSERT INTO `system_user_role` VALUES (2, 2, 2, '', NULL, '', NULL, b'0', 0); +INSERT INTO `system_user_role` VALUES (3, 100, 1, '', NULL, '', NULL, b'1', 0); +INSERT INTO `system_user_role` VALUES (4, 100, 101, '', NULL, '', NULL, b'0', 0); +INSERT INTO `system_user_role` VALUES (5, 100, 1, '', NULL, '', NULL, b'0', 0); +INSERT INTO `system_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0', 0); +INSERT INTO `system_user_role` VALUES (7, 104, 101, '', NULL, '', NULL, b'0', 0); +INSERT INTO `system_user_role` VALUES (8, 106, 1, NULL, '2021-09-28 09:40:59', NULL, '2021-09-28 09:40:59', b'1', 0); +INSERT INTO `system_user_role` VALUES (9, 105, 1, '1', '2021-10-30 13:40:48', '1', '2021-10-30 13:40:48', b'0', 0); +INSERT INTO `system_user_role` VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', b'0', 0); COMMIT; -- ---------------------------- --- Table structure for sys_user_session +-- Table structure for system_user_session -- ---------------------------- -DROP TABLE IF EXISTS `sys_user_session`; -CREATE TABLE `sys_user_session` ( +DROP TABLE IF EXISTS `system_user_session`; +CREATE TABLE `system_user_session` ( `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '会话编号', `user_id` bigint NOT NULL COMMENT '用户编号', `user_type` tinyint NOT NULL DEFAULT '0' COMMENT '用户类型', @@ -2717,158 +3261,191 @@ CREATE TABLE `sys_user_session` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户在线 Session'; -- ---------------------------- --- Records of sys_user_session +-- Records of system_user_session -- ---------------------------- BEGIN; -INSERT INTO `sys_user_session` VALUES ('0180929bb4b244b891253885e86ad9d1', 1, 2, '2021-12-16 09:37:48', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:07:48', NULL, '2021-12-16 09:07:48', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('01b7469337864db7a9b65747f38fa928', 1, 2, '2021-12-31 14:29:42', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 13:49:05', NULL, '2021-12-31 13:59:42', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('01f68d27b18b414ebfa7f417ffbbe185', 103, 2, '2022-01-15 21:53:10', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 21:23:10', NULL, '2022-01-15 13:31:15', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('04abd513bbee4a51973780f93cca16c2', 1, 2, '2022-01-03 05:59:14', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 05:29:14', NULL, '2022-01-03 05:29:14', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('04b9f6b2480c48deb3ea9d67c3db8cfe', 1, 2, '2022-01-16 02:47:08', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 01:37:56', NULL, '2022-01-16 02:17:08', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('0558f1e97ff044609ccb7c6e7ead6a6b', 1, 2, '2022-01-19 14:07:46', 'admin', '127.0.0.1', '', NULL, '2022-01-19 12:38:45', NULL, '2022-01-19 13:37:46', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('07b0c58cd92449319522a998cf883a37', 1, 2, '2022-01-08 11:07:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 10:37:28', NULL, '2022-01-08 10:37:28', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('0806e3aa2c0b446eb9b3496d9b63e51f', 103, 2, '2022-01-13 21:51:47', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 21:21:47', NULL, '2022-01-13 21:21:47', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('09c26e452a6c44129a2d495478b40d27', 1, 2, '2022-01-02 13:25:15', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 12:06:51', NULL, '2022-01-02 12:55:15', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('0b03400e80544594b7e766d48b9d8aed', 1, 2, '2022-01-17 02:44:00', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 02:14:00', NULL, '2022-01-17 02:14:00', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('0b8545465544481da4d162a3a74a552e', 1, 2, '2021-12-15 23:48:37', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:44:07', NULL, '2021-12-15 23:18:37', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('0bf9cd592168451aad7b546ff085df58', 1, 2, '2022-01-03 00:00:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 23:30:30', NULL, '2022-01-02 15:39:40', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('0c5e3db754714de38ed163c3ef53fb19', 1, 2, '2022-01-17 01:20:21', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 21:33:06', NULL, '2022-01-17 00:50:21', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('0c8f02172a894f11a3d054a5811e1c5b', 1, 2, '2022-01-03 09:25:54', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 08:32:07', NULL, '2022-01-03 01:17:42', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('0fef9f0bc17047008bef199f1682dce0', 1, 2, '2022-01-21 23:22:20', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-21 22:29:19', NULL, '2022-01-21 22:52:20', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('1645cee3484248929f406fccf8772e67', 1, 2, '2022-01-18 08:43:25', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 08:01:22', NULL, '2022-01-18 08:13:25', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('166cea69fca846c985c62dd365994561', 1, 2, '2022-01-03 11:36:12', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 09:17:50', NULL, '2022-01-03 11:06:12', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('1893bfb924174e3c82f02f18be0606fd', 1, 2, '2022-01-04 00:05:19', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 23:35:19', NULL, '2022-01-03 23:35:19', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('1995595036aa4652bb887c43cfd35ba8', 1, 2, '2022-01-01 00:18:24', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 22:57:57', NULL, '2021-12-31 23:48:24', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('19fdd80f6ba3491b8a5cd934694a2ddc', 103, 2, '2022-01-11 22:40:28', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 22:10:28', NULL, '2022-01-11 22:10:28', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('1b6154299e1a470ebf80d2eaef72b0e2', 1, 2, '2022-01-02 11:59:52', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 09:30:29', NULL, '2022-01-02 11:29:52', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('1b7c79d9d8b04b4fb826564fce41f77c', 1, 2, '2022-01-03 22:42:07', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 22:12:07', NULL, '2022-01-03 22:12:07', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('1b848d99cde6448097dcedc83fda4c0a', 1, 2, '2021-12-31 10:45:09', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 08:35:36', NULL, '2021-12-31 10:15:09', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('1bc6ad0827fe48099bcbdb9a206818ac', 104, 2, '2021-12-15 23:48:59', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 23:18:59', NULL, '2021-12-15 23:18:59', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('1bfa6a2ed10741fbb03996a48656f0d2', 1, 2, '2022-01-14 10:48:14', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 10:18:14', NULL, '2022-01-14 10:18:14', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('2150cb32189f4ccdba60a7209dac1e0d', 1, 2, '2022-01-15 22:49:10', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:19:10', NULL, '2022-01-15 14:20:19', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('234b1084a5574ffc920669d4d230a18b', 1, 2, '2022-01-19 00:08:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 23:38:56', NULL, '2022-01-18 23:38:56', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('251bab4618b644faa2c54083ac8b1902', 1, 2, '2022-01-08 01:34:39', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 00:37:26', NULL, '2022-01-07 17:10:10', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('27052d883f1047e68b0841429d234b6b', 1, 2, '2022-01-08 10:25:42', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 09:55:42', NULL, '2022-01-08 09:55:42', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('27d8ed14a6394e1f8be6fad865d8355a', 1, 2, '2022-01-11 12:58:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 12:28:28', NULL, '2022-01-11 12:28:28', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('28d90f7da308407296fface4ca68d732', 1, 2, '2022-01-01 21:54:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 21:01:18', NULL, '2022-01-01 21:24:30', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('291f36ffc1da483981845efd20e8eae4', 1, 2, '2022-01-08 00:23:49', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-07 23:42:43', NULL, '2022-01-07 23:53:49', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('2b49a2e3f5494cebb4a3f19080853355', 103, 2, '2022-01-17 01:26:54', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 00:56:54', NULL, '2022-01-17 00:56:54', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('2d920ad234a442cd98f5f517d50d6b60', 1, 2, '2022-01-02 16:47:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 14:34:30', NULL, '2022-01-02 16:17:41', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('2ec1ca2d0053415599fa18e6bddf710e', 104, 2, '2021-12-16 10:08:04', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:27:08', NULL, '2021-12-16 09:38:04', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('303e29836f3540c79188c835466318b2', 1, 2, '2022-01-19 10:40:31', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-19 08:35:23', NULL, '2022-01-19 10:10:31', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('32a043324c7541d191cdf6a8b667ad6c', 103, 2, '2022-01-15 22:44:58', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:00:56', NULL, '2022-01-15 14:19:00', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('32c405074a3b462681bca9afd26fdfe9', 103, 2, '2022-01-13 13:43:30', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 13:03:29', NULL, '2022-01-13 13:13:30', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('345ad9af8d0c46c8ad285b57cabfd060', 1, 2, '2021-12-25 19:57:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 19:15:06', NULL, '2021-12-25 19:27:51', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('355c57509a5643519107ec132bd85ba6', 103, 2, '2022-01-14 00:49:12', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 23:12:26', NULL, '2022-01-14 00:19:12', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('367c9c23eb4e4539be4ecc737af8fbf6', 103, 2, '2022-01-14 20:39:07', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 18:39:31', NULL, '2022-01-14 20:09:07', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('374d99e8a41b464c98f73ddbc5aa4d29', 1, 2, '2022-01-03 04:04:14', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 23:39:46', NULL, '2022-01-03 03:34:14', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('39647615e860424ebcc9b3f598f135be', 103, 2, '2022-01-18 01:03:40', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 00:33:40', NULL, '2022-01-17 16:33:44', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('3cc54b8687504a388b5b8c7457d16382', 1, 2, '2022-01-10 21:01:18', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-10 20:18:15', NULL, '2022-01-10 20:31:18', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('3d9a4ffee19c47dfbc3c807adccf4c23', 1, 2, '2022-01-20 01:43:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-20 00:32:48', NULL, '2022-01-20 01:13:32', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('3ec1ce407e8a4accab0b51e756ab74be', 1, 2, '2022-01-20 14:01:25', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-20 12:46:56', NULL, '2022-01-20 13:31:25', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('42c1711b9b6448c18b0cd621b20bd9e2', 1, 2, '2022-01-16 00:23:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 23:53:32', NULL, '2022-01-15 23:53:32', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('439e30be513e42c094a0a0296b761cc5', 1, 2, '2022-01-13 01:24:38', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 00:33:14', NULL, '2022-01-13 00:54:38', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('47949a90a88d4c49823d70995d980ee9', 1, 2, '2021-12-16 10:04:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:20:41', NULL, '2021-12-16 09:34:30', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('488438fbac1e490aba5fadbc5aef18c8', 1, 2, '2022-01-09 00:45:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 23:07:53', NULL, '2022-01-09 00:15:11', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('495da339c78846609991d9bc66e17dcf', 1, 2, '2021-12-31 22:54:24', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 21:47:55', NULL, '2021-12-31 22:24:24', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('4e00d142b22e4826938de31c221b6b32', 104, 2, '2021-12-16 09:54:24', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:24:24', NULL, '2021-12-16 01:27:04', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('4f18d2a257bb45148f64b5dd8a895fad', 1, 2, '2022-01-08 23:37:52', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 23:07:52', NULL, '2022-01-08 23:07:52', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('51b1fc7d18264e7e97b1992b4994551a', 1, 2, '2022-01-22 20:11:04', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 18:37:19', NULL, '2022-01-22 19:41:04', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('55d703899dc74e6881e2a52d11e155dc', 1, 2, '2022-01-16 19:10:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 17:38:41', NULL, '2022-01-16 18:40:11', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('569063f65eb24fcc92df57779ea671d5', 1, 2, '2022-01-14 23:10:22', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 22:23:55', NULL, '2022-01-14 22:40:22', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('5921e2838860430b80d02c2dc5bc9b14', 1, 2, '2022-01-01 18:38:17', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 17:19:06', NULL, '2022-01-01 18:08:17', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('5c8b305b180648c4919384c2204262f1', 1, 2, '2022-01-18 00:20:50', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 23:50:50', NULL, '2022-01-17 15:50:58', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('5cb75ff3873b4ee99c54ca8126b6a239', 103, 2, '2022-01-18 00:21:08', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 23:51:08', NULL, '2022-01-17 23:51:08', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('5d65f92a84b5497787686e513289372f', 1, 2, '2022-01-16 00:16:18', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 23:46:18', NULL, '2022-01-15 15:47:33', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('5e8984281b354935b422c95a06ac9ff8', 1, 2, '2022-01-20 14:21:17', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-20 13:31:17', NULL, '2022-01-20 13:51:17', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('604d98299b7243ddafa3ee0350f6edce', 1, 2, '2022-01-22 01:00:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 00:00:28', NULL, '2022-01-22 00:30:30', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('63d50b8b7e4448f98bd4ab2c084ac18f', 103, 2, '2022-01-17 13:18:45', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 12:48:45', NULL, '2022-01-17 12:48:45', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('63ea8e8249cb4089b4b0d10256f39ba4', 1, 2, '2022-01-11 13:52:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 13:22:44', NULL, '2022-01-11 05:23:14', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('64f51e60527349d6b4a0a74f3d8eca97', 104, 2, '2021-12-16 07:37:54', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:07:54', NULL, '2021-12-16 07:07:54', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('6b7d55bad59e401cb1f8d6c418bf552e', 103, 2, '2022-01-14 10:43:59', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 09:49:52', NULL, '2022-01-14 10:13:59', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('6d554dd8e0724ff9907bc1186119280c', 1, 2, '2022-01-23 01:22:38', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 23:30:35', NULL, '2022-01-23 00:52:38', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('6f0e4f523b13484c94d0dfe49d505d41', 103, 2, '2022-01-13 10:46:00', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 09:51:45', NULL, '2022-01-13 10:16:00', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('725e3f1407844ffebbaf02ba0673e0a4', 103, 2, '2022-01-16 12:23:58', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 11:53:58', NULL, '2022-01-16 11:53:58', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('729362aa59ed43cf9606a163883f2f2a', 103, 2, '2022-01-15 22:27:50', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 21:32:02', NULL, '2022-01-15 13:58:33', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('79924bcc8d594452a8ee8406d312b2c2', 1, 2, '2022-01-01 23:37:34', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 22:02:06', NULL, '2022-01-01 23:07:34', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('7aa8d8f930f34aba857c14db311a9a02', 1, 2, '2022-01-11 10:44:50', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 09:58:54', NULL, '2022-01-11 10:14:50', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('7b60ae1b30734903a34b9c7f8723d5e2', 103, 2, '2022-01-14 01:33:42', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 00:51:03', NULL, '2022-01-14 01:03:42', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('7bc4dca653954475b05cf233c08f783e', 103, 2, '2022-01-15 13:23:54', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 11:56:10', NULL, '2022-01-15 12:53:54', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('7d55dfdc996d4d24a0c4c6aad6065ca4', 103, 2, '2022-01-12 01:00:08', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 23:33:26', NULL, '2022-01-12 00:30:08', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('83c9839e34454f0eba630f29002d0ee3', 1, 2, '2022-01-09 23:00:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 20:59:49', NULL, '2022-01-09 22:30:41', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('845e9e7778a64200a87993db0fe6872d', 1, 2, '2022-01-21 00:12:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-20 23:42:44', NULL, '2022-01-20 23:42:44', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('84cc13aee41d473c987c1c0381cc05b1', 1, 2, '2022-01-09 02:01:10', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 01:03:29', NULL, '2022-01-09 01:31:10', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('882e89a623154797ac2a213c78da1f69', 1, 2, '2022-01-18 00:13:23', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 23:33:03', NULL, '2022-01-17 23:43:23', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('89bd23481c9a4b598ebea524679441b3', 103, 2, '2022-01-15 00:57:03', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 23:51:41', NULL, '2022-01-15 00:27:03', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('89cc980ca0d941109b3933c82d01d9c3', 103, 2, '2022-01-15 22:30:17', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:00:17', NULL, '2022-01-15 14:00:35', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('8c49cc6f52154dca9da6a2632985aa35', 1, 2, '2022-01-08 09:05:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 07:10:02', NULL, '2022-01-08 08:35:55', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('8e9599699f5141d2b041b855c7b34181', 1, 2, '2022-01-16 13:45:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 13:15:56', NULL, '2022-01-16 13:15:56', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('9122b55409a94388a7b277ad808a127c', 1, 2, '2022-01-01 17:18:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 16:20:04', NULL, '2022-01-01 16:48:53', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('91b94971b7f044c8b68420e6ef7377af', 1, 2, '2022-01-02 17:32:50', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 17:02:50', NULL, '2022-01-02 17:02:50', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('93ada27b50d24c1a9b476c7fd4fef2ce', 1, 2, '2022-01-11 13:49:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 13:09:10', NULL, '2022-01-11 05:22:27', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('93caa65dbd9d480299850552067a031a', 1, 2, '2022-01-15 22:01:33', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 21:31:33', NULL, '2022-01-15 13:31:53', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('945e4bb19f4d4c28ba7135218ee3abe3', 1, 2, '2021-12-16 08:28:54', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:42:25', NULL, '2021-12-16 07:58:54', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('9526809b303f489b8aab0c05e6b483dd', 1, 2, '2022-01-01 00:51:19', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 00:21:19', NULL, '2022-01-01 00:21:19', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('9655c170353849dfadfdc810c6c5ca61', 1, 2, '2022-01-03 12:50:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 11:56:55', NULL, '2022-01-03 12:20:55', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('9a84339c3c594140b0c3a9bfe95f7919', 1, 2, '2022-01-18 01:03:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 00:33:28', NULL, '2022-01-18 00:33:28', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('9ee1349d7d3043759cb742a0fa5a3163', 1, 2, '2021-12-25 19:08:33', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 18:38:33', NULL, '2021-12-25 18:38:33', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('9f3266f59b8746c3bfe143361d86f6e8', 1, 2, '2022-01-08 22:31:37', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 22:01:37', NULL, '2022-01-08 22:01:37', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('a09624232ed94b44a846023790e6282f', 1, 2, '2022-01-09 13:45:26', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 12:59:15', NULL, '2022-01-09 13:15:26', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('a155e6dfe4b74fbaa69fcca239facc40', 1, 2, '2021-12-16 07:37:39', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:07:39', NULL, '2021-12-16 07:07:39', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('a17d02a7c4264f7489728f510e40e823', 1, 2, '2022-01-17 13:18:31', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 12:48:31', NULL, '2022-01-17 04:48:37', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('a30e807e5db640feb92bb1eeb4ae89d0', 1, 2, '2022-01-16 12:23:10', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 11:53:10', NULL, '2022-01-16 11:53:10', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('a4688af426e342a69c814d07bb8f7d3b', 1, 2, '2022-01-08 17:21:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 16:25:34', NULL, '2022-01-08 16:51:11', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('a49e304816e0477998592c76caa9546d', 1, 2, '2022-01-16 01:20:18', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 00:30:18', NULL, '2022-01-16 00:50:18', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('a55b31ff9e6a41fcb931d2244b4240a8', 1, 2, '2021-12-30 22:32:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-30 20:04:02', NULL, '2021-12-30 22:02:56', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('a88e404ba71e41b0a16c75a8ce44bb9d', 1, 2, '2022-01-09 11:57:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 11:27:51', NULL, '2022-01-09 11:27:51', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('a9b27f95517d4ef9ae15c68bd4365d1b', 103, 2, '2022-01-11 20:37:20', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 19:35:41', NULL, '2022-01-11 20:07:20', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('ab449ce8f2ea456591d23515c188c242', 1, 2, '2021-12-25 17:55:45', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 16:42:42', NULL, '2021-12-25 17:25:45', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('ac730d1c96be41e5821a6de24b23bf7b', 103, 2, '2022-01-11 20:05:41', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 19:35:41', NULL, '2022-01-11 19:35:41', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('ac88c6d1cb184979a015e9a8b50e21f0', 1, 2, '2022-01-03 04:59:36', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 03:39:08', NULL, '2022-01-03 04:29:36', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('ae2a8c4a7df64271b0e7a2b702c378f8', 1, 2, '2022-01-18 02:18:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 00:58:20', NULL, '2022-01-18 01:48:53', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('b12325b8930245c09b75aa100dc1124d', 1, 2, '2022-01-01 09:12:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 08:09:05', NULL, '2022-01-01 08:42:53', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('b523e3add6e74587b247b467de677325', 1, 2, '2022-01-18 01:15:31', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 00:33:47', NULL, '2022-01-18 00:45:31', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('b6a02289210b4861b71a363b11b6b919', 1, 2, '2022-01-09 11:23:22', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 10:39:49', NULL, '2022-01-09 10:53:22', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('b883ba1582f54826b42fa073276c85cb', 1, 2, '2022-01-08 01:40:34', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 01:10:34', NULL, '2022-01-08 01:10:34', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('ba1658c24b78442fb39062e31d902a5f', 1, 2, '2022-01-10 20:12:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-10 19:21:24', NULL, '2022-01-10 19:42:44', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('bb14f39f65ca41cc8ef915ad7f0c25d6', 1, 2, '2022-01-09 09:40:48', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 08:48:56', NULL, '2022-01-09 09:10:48', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('bd2b51a53b8d4046b024f43406985caf', 103, 2, '2022-01-15 23:31:38', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:20:30', NULL, '2022-01-15 23:01:38', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('bd52c43710274cd8bd888b1737cd939d', 1, 2, '2022-01-22 23:09:46', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 20:45:15', NULL, '2022-01-22 22:39:46', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('bd655254904748f79c0ad47dfb49d457', 1, 2, '2022-01-01 08:05:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 07:35:32', NULL, '2022-01-01 07:35:32', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('be98e2f02a444a4092d1cea3dc6e3073', 1, 2, '2022-01-17 13:34:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 12:26:04', NULL, '2022-01-17 13:04:51', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('c09baa895d79468db63417f60c65573c', 1, 2, '2022-01-01 11:33:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 10:13:48', NULL, '2022-01-01 11:03:44', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('c1797274297f4cd7b859c6c482d06005', 1, 2, '2022-01-09 10:26:00', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 09:44:24', NULL, '2022-01-09 09:56:00', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('c7c4d30623c84d3e88aab2f0b742e7c3', 1, 2, '2022-01-21 01:14:47', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-21 00:24:00', NULL, '2022-01-20 16:54:39', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('c7fc3e37d927405ebbe66df3dd5fd77e', 103, 2, '2022-01-13 01:01:29', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-12 22:57:04', NULL, '2022-01-13 00:31:29', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('cbd09ba52ccc47b2a639a6e28e92894f', 103, 2, '2022-01-12 01:34:01', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-12 01:04:01', NULL, '2022-01-12 01:04:01', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('ccc85a8ee5a7407c97012b755cde979e', 1, 2, '2022-01-16 18:08:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 17:38:41', NULL, '2022-01-16 17:38:41', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('d229b8f8ef4d4df4afd05209acc87446', 1, 2, '2022-01-08 11:02:36', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 10:32:36', NULL, '2022-01-08 02:37:12', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('d46d26f08f624eb28eb665b6515587bd', 1, 2, '2022-01-16 00:19:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 23:49:32', NULL, '2022-01-15 23:49:32', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('d4aeab42d1934197865ce72ffe244009', 1, 2, '2022-01-16 03:11:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 02:41:56', NULL, '2022-01-16 02:41:56', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('d8550bde3c8b43a194e592b49c856c71', 1, 2, '2022-01-09 21:26:38', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 19:38:12', NULL, '2022-01-09 20:56:38', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('d8ebbe89793f4a829a108c4f1badbb11', 103, 2, '2022-01-13 21:18:56', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 20:38:43', NULL, '2022-01-13 20:48:56', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('da04f99dc14a4f28a8a77178861cb3ed', 104, 2, '2021-12-15 23:37:58', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:47:31', NULL, '2021-12-15 15:11:55', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('daec82cc885849a7bbab76eb9f0a4b32', 1, 2, '2022-01-15 23:31:35', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:00:43', NULL, '2022-01-15 23:01:35', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('dbaaa89e1659488c9693317454fe6ae2', 1, 2, '2022-01-14 22:53:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 22:23:55', NULL, '2022-01-14 22:23:55', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('dbe0f27930244ae38e0322226d6ecdbb', 1, 2, '2022-01-21 01:46:31', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-21 00:54:45', NULL, '2022-01-21 01:16:31', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('dd2e53ccf8c44b3e8556571687d4825d', 103, 2, '2022-01-12 01:34:01', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-12 01:04:01', NULL, '2022-01-12 01:04:01', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('ddb9d3c65ee14c4a8ff1a3cf0e10e69a', 1, 2, '2022-01-19 00:52:57', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-19 00:22:57', NULL, '2022-01-19 00:22:57', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('ddd32e0a43d644ca95ba10e4e5b19416', 1, 2, '2022-01-03 19:28:22', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 17:22:27', NULL, '2022-01-03 18:58:22', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('df12a50eb8814317bb8e1003e098cbe7', 1, 2, '2022-01-09 19:04:00', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 16:26:16', NULL, '2022-01-09 18:34:00', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('e198f4f04da243d5b80caa0c8336d6a0', 103, 2, '2022-01-14 19:09:16', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 18:39:16', NULL, '2022-01-14 10:39:24', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('e290aebda5f34c379d0cf3e013cbcc8b', 1, 2, '2022-01-02 09:27:23', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 08:32:23', NULL, '2022-01-02 08:57:23', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('e2efa96cacbb47b580096193244a3739', 1, 2, '2022-01-14 14:24:13', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 13:44:04', NULL, '2022-01-14 13:54:13', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('e3c0319f639a481999bac6fa250af552', 1, 2, '2022-01-03 16:56:06', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 16:14:34', NULL, '2022-01-03 16:26:06', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('e42efabb61af4f5eaeea3b84693871da', 1, 2, '2022-01-15 22:28:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 21:58:55', NULL, '2022-01-15 14:00:08', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('e75c264df71342a59a85a6512a5a1fb7', 1, 2, '2022-01-22 19:18:46', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 18:30:58', NULL, '2022-01-22 18:48:46', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('f10cabf849b245ebbaa5284b540c0bb2', 103, 2, '2022-01-11 21:51:14', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 20:54:19', NULL, '2022-01-11 21:21:14', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('f49ade9038d24a73832e64efcc30b205', 103, 2, '2022-01-11 13:53:26', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 13:23:26', NULL, '2022-01-11 13:23:26', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('f562fd12a7bb41f19ca1bf4aa5e3c9d1', 1, 2, '2022-01-22 02:42:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 01:20:59', NULL, '2022-01-22 02:12:51', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('f76c8610a7e5461aac8972e21f14e734', 1, 2, '2022-01-22 21:52:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 20:29:53', NULL, '2022-01-22 21:22:44', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('f974a40ea70941cdb9e04cb63bf5e557', 1, 2, '2022-01-16 02:00:25', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 01:30:25', NULL, '2022-01-16 01:30:25', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('f9f257cf09e640f2904696f2de35d3f6', 1, 2, '2022-01-03 21:42:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 20:59:23', NULL, '2022-01-03 21:12:44', b'0', 1); -INSERT INTO `sys_user_session` VALUES ('fe82f6ecb17449b595c7d6bd4bc1d371', 1, 2, '2021-12-15 23:16:49', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:46:49', NULL, '2021-12-15 14:46:53', b'1', 1); -INSERT INTO `sys_user_session` VALUES ('ffeae9ee4b8649b6b9ececaa502a934d', 1, 2, '2022-01-01 19:56:49', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 18:47:31', NULL, '2022-01-01 19:26:49', b'0', 1); +INSERT INTO `system_user_session` VALUES ('0180929bb4b244b891253885e86ad9d1', 1, 2, '2021-12-16 09:37:48', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:07:48', NULL, '2021-12-16 09:07:48', b'0', 1); +INSERT INTO `system_user_session` VALUES ('01b7469337864db7a9b65747f38fa928', 1, 2, '2021-12-31 14:29:42', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 13:49:05', NULL, '2021-12-31 13:59:42', b'0', 1); +INSERT INTO `system_user_session` VALUES ('01f68d27b18b414ebfa7f417ffbbe185', 103, 2, '2022-01-15 21:53:10', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 21:23:10', NULL, '2022-01-15 13:31:15', b'1', 1); +INSERT INTO `system_user_session` VALUES ('04abd513bbee4a51973780f93cca16c2', 1, 2, '2022-01-03 05:59:14', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 05:29:14', NULL, '2022-01-03 05:29:14', b'0', 1); +INSERT INTO `system_user_session` VALUES ('04b9f6b2480c48deb3ea9d67c3db8cfe', 1, 2, '2022-01-16 02:47:08', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 01:37:56', NULL, '2022-01-16 02:17:08', b'0', 1); +INSERT INTO `system_user_session` VALUES ('0558f1e97ff044609ccb7c6e7ead6a6b', 1, 2, '2022-01-19 14:07:46', 'admin', '127.0.0.1', '', NULL, '2022-01-19 12:38:45', NULL, '2022-01-19 13:37:46', b'0', 1); +INSERT INTO `system_user_session` VALUES ('07b0c58cd92449319522a998cf883a37', 1, 2, '2022-01-08 11:07:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 10:37:28', NULL, '2022-01-08 10:37:28', b'0', 1); +INSERT INTO `system_user_session` VALUES ('0806e3aa2c0b446eb9b3496d9b63e51f', 103, 2, '2022-01-13 21:51:47', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 21:21:47', NULL, '2022-01-13 21:21:47', b'0', 1); +INSERT INTO `system_user_session` VALUES ('09c26e452a6c44129a2d495478b40d27', 1, 2, '2022-01-02 13:25:15', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 12:06:51', NULL, '2022-01-02 12:55:15', b'0', 1); +INSERT INTO `system_user_session` VALUES ('0b03400e80544594b7e766d48b9d8aed', 1, 2, '2022-01-17 02:44:00', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 02:14:00', NULL, '2022-01-17 02:14:00', b'0', 1); +INSERT INTO `system_user_session` VALUES ('0b8545465544481da4d162a3a74a552e', 1, 2, '2021-12-15 23:48:37', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:44:07', NULL, '2021-12-15 23:18:37', b'0', 1); +INSERT INTO `system_user_session` VALUES ('0bf9cd592168451aad7b546ff085df58', 1, 2, '2022-01-03 00:00:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 23:30:30', NULL, '2022-01-02 15:39:40', b'1', 1); +INSERT INTO `system_user_session` VALUES ('0c5e3db754714de38ed163c3ef53fb19', 1, 2, '2022-01-17 01:20:21', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 21:33:06', NULL, '2022-01-17 00:50:21', b'0', 1); +INSERT INTO `system_user_session` VALUES ('0c8f02172a894f11a3d054a5811e1c5b', 1, 2, '2022-01-03 09:25:54', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 08:32:07', NULL, '2022-01-03 01:17:42', b'1', 1); +INSERT INTO `system_user_session` VALUES ('0fef9f0bc17047008bef199f1682dce0', 1, 2, '2022-01-21 23:22:20', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-21 22:29:19', NULL, '2022-01-21 22:52:20', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1168ac997c354e68a9c9a97b3ee3e621', 1, 2, '2022-02-01 23:37:40', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-01 22:57:32', NULL, '2022-02-01 23:07:40', b'0', 1); +INSERT INTO `system_user_session` VALUES ('121a386aef284bbd903188b9b6e72fe0', 1, 2, '2022-01-31 18:15:53', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:45:53', NULL, '2022-01-31 17:45:53', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1645cee3484248929f406fccf8772e67', 1, 2, '2022-01-18 08:43:25', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 08:01:22', NULL, '2022-01-18 08:13:25', b'0', 1); +INSERT INTO `system_user_session` VALUES ('166cea69fca846c985c62dd365994561', 1, 2, '2022-01-03 11:36:12', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 09:17:50', NULL, '2022-01-03 11:06:12', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1893bfb924174e3c82f02f18be0606fd', 1, 2, '2022-01-04 00:05:19', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 23:35:19', NULL, '2022-01-03 23:35:19', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1995595036aa4652bb887c43cfd35ba8', 1, 2, '2022-01-01 00:18:24', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 22:57:57', NULL, '2021-12-31 23:48:24', b'0', 1); +INSERT INTO `system_user_session` VALUES ('19fdd80f6ba3491b8a5cd934694a2ddc', 103, 2, '2022-01-11 22:40:28', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 22:10:28', NULL, '2022-01-11 22:10:28', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1b6154299e1a470ebf80d2eaef72b0e2', 1, 2, '2022-01-02 11:59:52', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 09:30:29', NULL, '2022-01-02 11:29:52', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1b7c79d9d8b04b4fb826564fce41f77c', 1, 2, '2022-01-03 22:42:07', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 22:12:07', NULL, '2022-01-03 22:12:07', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1b848d99cde6448097dcedc83fda4c0a', 1, 2, '2021-12-31 10:45:09', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 08:35:36', NULL, '2021-12-31 10:15:09', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1bc6ad0827fe48099bcbdb9a206818ac', 104, 2, '2021-12-15 23:48:59', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 23:18:59', NULL, '2021-12-15 23:18:59', b'0', 1); +INSERT INTO `system_user_session` VALUES ('1bfa6a2ed10741fbb03996a48656f0d2', 1, 2, '2022-01-14 10:48:14', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 10:18:14', NULL, '2022-01-14 10:18:14', b'0', 1); +INSERT INTO `system_user_session` VALUES ('2150cb32189f4ccdba60a7209dac1e0d', 1, 2, '2022-01-15 22:49:10', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:19:10', NULL, '2022-01-15 14:20:19', b'1', 1); +INSERT INTO `system_user_session` VALUES ('22adcacad96647bfb8c86fcd7d563be6', 1, 2, '2022-01-28 22:12:41', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:42:41', NULL, '2022-01-28 21:42:41', b'0', 1); +INSERT INTO `system_user_session` VALUES ('234b1084a5574ffc920669d4d230a18b', 1, 2, '2022-01-19 00:08:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 23:38:56', NULL, '2022-01-18 23:38:56', b'0', 1); +INSERT INTO `system_user_session` VALUES ('251bab4618b644faa2c54083ac8b1902', 1, 2, '2022-01-08 01:34:39', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 00:37:26', NULL, '2022-01-07 17:10:10', b'1', 1); +INSERT INTO `system_user_session` VALUES ('27052d883f1047e68b0841429d234b6b', 1, 2, '2022-01-08 10:25:42', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 09:55:42', NULL, '2022-01-08 09:55:42', b'0', 1); +INSERT INTO `system_user_session` VALUES ('27d8ed14a6394e1f8be6fad865d8355a', 1, 2, '2022-01-11 12:58:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 12:28:28', NULL, '2022-01-11 12:28:28', b'0', 1); +INSERT INTO `system_user_session` VALUES ('28c9235b81474020931acc876d054f9b', 1, 2, '2022-01-31 00:00:54', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-30 23:30:54', NULL, '2022-01-30 23:30:54', b'0', 1); +INSERT INTO `system_user_session` VALUES ('28d90f7da308407296fface4ca68d732', 1, 2, '2022-01-01 21:54:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 21:01:18', NULL, '2022-01-01 21:24:30', b'0', 1); +INSERT INTO `system_user_session` VALUES ('291f36ffc1da483981845efd20e8eae4', 1, 2, '2022-01-08 00:23:49', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-07 23:42:43', NULL, '2022-01-07 23:53:49', b'0', 1); +INSERT INTO `system_user_session` VALUES ('29737038cd76429cb60a279cbeb802ea', 1, 2, '2022-01-28 21:53:22', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:23:22', NULL, '2022-01-28 21:23:22', b'0', 1); +INSERT INTO `system_user_session` VALUES ('2b49a2e3f5494cebb4a3f19080853355', 103, 2, '2022-01-17 01:26:54', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 00:56:54', NULL, '2022-01-17 00:56:54', b'0', 1); +INSERT INTO `system_user_session` VALUES ('2d920ad234a442cd98f5f517d50d6b60', 1, 2, '2022-01-02 16:47:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 14:34:30', NULL, '2022-01-02 16:17:41', b'0', 1); +INSERT INTO `system_user_session` VALUES ('2db67457fb474cfc8a7b7099515ae2aa', 1, 2, '2022-01-23 13:54:43', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 13:24:43', NULL, '2022-01-23 13:24:43', b'0', 1); +INSERT INTO `system_user_session` VALUES ('2ec1ca2d0053415599fa18e6bddf710e', 104, 2, '2021-12-16 10:08:04', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:27:08', NULL, '2021-12-16 09:38:04', b'0', 1); +INSERT INTO `system_user_session` VALUES ('303e29836f3540c79188c835466318b2', 1, 2, '2022-01-19 10:40:31', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-19 08:35:23', NULL, '2022-01-19 10:10:31', b'0', 1); +INSERT INTO `system_user_session` VALUES ('32a043324c7541d191cdf6a8b667ad6c', 103, 2, '2022-01-15 22:44:58', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:00:56', NULL, '2022-01-15 14:19:00', b'1', 1); +INSERT INTO `system_user_session` VALUES ('32c405074a3b462681bca9afd26fdfe9', 103, 2, '2022-01-13 13:43:30', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 13:03:29', NULL, '2022-01-13 13:13:30', b'0', 1); +INSERT INTO `system_user_session` VALUES ('345ad9af8d0c46c8ad285b57cabfd060', 1, 2, '2021-12-25 19:57:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 19:15:06', NULL, '2021-12-25 19:27:51', b'0', 1); +INSERT INTO `system_user_session` VALUES ('355c57509a5643519107ec132bd85ba6', 103, 2, '2022-01-14 00:49:12', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 23:12:26', NULL, '2022-01-14 00:19:12', b'0', 1); +INSERT INTO `system_user_session` VALUES ('367c9c23eb4e4539be4ecc737af8fbf6', 103, 2, '2022-01-14 20:39:07', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 18:39:31', NULL, '2022-01-14 20:09:07', b'0', 1); +INSERT INTO `system_user_session` VALUES ('374d99e8a41b464c98f73ddbc5aa4d29', 1, 2, '2022-01-03 04:04:14', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 23:39:46', NULL, '2022-01-03 03:34:14', b'0', 1); +INSERT INTO `system_user_session` VALUES ('38535319952f41f9b3d94aaf71f42de6', 1, 2, '2022-01-29 17:17:54', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 16:47:54', NULL, '2022-01-29 16:47:54', b'0', 1); +INSERT INTO `system_user_session` VALUES ('39647615e860424ebcc9b3f598f135be', 103, 2, '2022-01-18 01:03:40', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 00:33:40', NULL, '2022-01-17 16:33:44', b'1', 1); +INSERT INTO `system_user_session` VALUES ('3cc54b8687504a388b5b8c7457d16382', 1, 2, '2022-01-10 21:01:18', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-10 20:18:15', NULL, '2022-01-10 20:31:18', b'0', 1); +INSERT INTO `system_user_session` VALUES ('3d9a4ffee19c47dfbc3c807adccf4c23', 1, 2, '2022-01-20 01:43:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-20 00:32:48', NULL, '2022-01-20 01:13:32', b'0', 1); +INSERT INTO `system_user_session` VALUES ('3ec1ce407e8a4accab0b51e756ab74be', 1, 2, '2022-01-20 14:01:25', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-20 12:46:56', NULL, '2022-01-20 13:31:25', b'0', 1); +INSERT INTO `system_user_session` VALUES ('3ecf0bc3d9b94cd28f0499bbeb0584b4', 1, 2, '2022-01-28 21:56:46', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:26:46', NULL, '2022-01-28 21:26:46', b'0', 1); +INSERT INTO `system_user_session` VALUES ('3fee3a4e10714d9c9df62b845db37f63', 245, 1, '2022-01-29 14:28:04', '15601691300', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 13:58:04', NULL, '2022-01-29 13:58:04', b'0', 1); +INSERT INTO `system_user_session` VALUES ('42c1711b9b6448c18b0cd621b20bd9e2', 1, 2, '2022-01-16 00:23:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 23:53:32', NULL, '2022-01-15 23:53:32', b'0', 1); +INSERT INTO `system_user_session` VALUES ('439e30be513e42c094a0a0296b761cc5', 1, 2, '2022-01-13 01:24:38', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 00:33:14', NULL, '2022-01-13 00:54:38', b'0', 1); +INSERT INTO `system_user_session` VALUES ('47949a90a88d4c49823d70995d980ee9', 1, 2, '2021-12-16 10:04:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:20:41', NULL, '2021-12-16 09:34:30', b'0', 1); +INSERT INTO `system_user_session` VALUES ('488438fbac1e490aba5fadbc5aef18c8', 1, 2, '2022-01-09 00:45:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 23:07:53', NULL, '2022-01-09 00:15:11', b'0', 1); +INSERT INTO `system_user_session` VALUES ('495da339c78846609991d9bc66e17dcf', 1, 2, '2021-12-31 22:54:24', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 21:47:55', NULL, '2021-12-31 22:24:24', b'0', 1); +INSERT INTO `system_user_session` VALUES ('4c92facae3a74e6bb714d2a2ce931c6b', 1, 2, '2022-01-31 18:17:25', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:47:25', NULL, '2022-01-31 17:47:25', b'0', 1); +INSERT INTO `system_user_session` VALUES ('4e00d142b22e4826938de31c221b6b32', 104, 2, '2021-12-16 09:54:24', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:24:24', NULL, '2021-12-16 01:27:04', b'1', 1); +INSERT INTO `system_user_session` VALUES ('4eb828d1ce434dbea637f0f6f75872bb', 1, 2, '2022-01-28 21:09:33', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 20:39:33', NULL, '2022-01-28 20:39:33', b'0', 1); +INSERT INTO `system_user_session` VALUES ('4f18d2a257bb45148f64b5dd8a895fad', 1, 2, '2022-01-08 23:37:52', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 23:07:52', NULL, '2022-01-08 23:07:52', b'0', 1); +INSERT INTO `system_user_session` VALUES ('51b1fc7d18264e7e97b1992b4994551a', 1, 2, '2022-01-22 20:11:04', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 18:37:19', NULL, '2022-01-22 19:41:04', b'0', 1); +INSERT INTO `system_user_session` VALUES ('55d703899dc74e6881e2a52d11e155dc', 1, 2, '2022-01-16 19:10:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 17:38:41', NULL, '2022-01-16 18:40:11', b'0', 1); +INSERT INTO `system_user_session` VALUES ('569063f65eb24fcc92df57779ea671d5', 1, 2, '2022-01-14 23:10:22', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 22:23:55', NULL, '2022-01-14 22:40:22', b'0', 1); +INSERT INTO `system_user_session` VALUES ('5921e2838860430b80d02c2dc5bc9b14', 1, 2, '2022-01-01 18:38:17', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 17:19:06', NULL, '2022-01-01 18:08:17', b'0', 1); +INSERT INTO `system_user_session` VALUES ('5c8b305b180648c4919384c2204262f1', 1, 2, '2022-01-18 00:20:50', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 23:50:50', NULL, '2022-01-17 15:50:58', b'1', 1); +INSERT INTO `system_user_session` VALUES ('5cb75ff3873b4ee99c54ca8126b6a239', 103, 2, '2022-01-18 00:21:08', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 23:51:08', NULL, '2022-01-17 23:51:08', b'0', 1); +INSERT INTO `system_user_session` VALUES ('5d65f92a84b5497787686e513289372f', 1, 2, '2022-01-16 00:16:18', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 23:46:18', NULL, '2022-01-15 15:47:33', b'1', 1); +INSERT INTO `system_user_session` VALUES ('5e6bd35bd4c24f1fb717d59256b937b0', 1, 2, '2022-01-23 04:14:45', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 03:21:32', NULL, '2022-01-22 20:10:37', b'1', 1); +INSERT INTO `system_user_session` VALUES ('5e8984281b354935b422c95a06ac9ff8', 1, 2, '2022-01-20 14:21:17', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-20 13:31:17', NULL, '2022-01-20 13:51:17', b'0', 1); +INSERT INTO `system_user_session` VALUES ('604d98299b7243ddafa3ee0350f6edce', 1, 2, '2022-01-22 01:00:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 00:00:28', NULL, '2022-01-22 00:30:30', b'0', 1); +INSERT INTO `system_user_session` VALUES ('6308a8a2833d4570a56cd8af3cd13367', 1, 2, '2022-01-31 14:00:40', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 13:30:40', NULL, '2022-01-31 13:30:40', b'0', 1); +INSERT INTO `system_user_session` VALUES ('63d50b8b7e4448f98bd4ab2c084ac18f', 103, 2, '2022-01-17 13:18:45', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 12:48:45', NULL, '2022-01-17 12:48:45', b'0', 1); +INSERT INTO `system_user_session` VALUES ('63ea8e8249cb4089b4b0d10256f39ba4', 1, 2, '2022-01-11 13:52:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 13:22:44', NULL, '2022-01-11 05:23:14', b'1', 1); +INSERT INTO `system_user_session` VALUES ('64f51e60527349d6b4a0a74f3d8eca97', 104, 2, '2021-12-16 07:37:54', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:07:54', NULL, '2021-12-16 07:07:54', b'0', 1); +INSERT INTO `system_user_session` VALUES ('671e9e7d2be541efa538d337f4e7752d', 1, 2, '2022-02-02 00:54:35', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-02 00:24:35', NULL, '2022-02-02 00:24:35', b'0', 1); +INSERT INTO `system_user_session` VALUES ('690be3aeef894ec3b3cef553b76082fa', 1, 2, '2022-01-28 21:54:02', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:24:02', NULL, '2022-01-28 21:24:02', b'0', 1); +INSERT INTO `system_user_session` VALUES ('6b7d55bad59e401cb1f8d6c418bf552e', 103, 2, '2022-01-14 10:43:59', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 09:49:52', NULL, '2022-01-14 10:13:59', b'0', 1); +INSERT INTO `system_user_session` VALUES ('6d554dd8e0724ff9907bc1186119280c', 1, 2, '2022-01-23 01:22:38', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 23:30:35', NULL, '2022-01-23 00:52:38', b'0', 1); +INSERT INTO `system_user_session` VALUES ('6f0e4f523b13484c94d0dfe49d505d41', 103, 2, '2022-01-13 10:46:00', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 09:51:45', NULL, '2022-01-13 10:16:00', b'0', 1); +INSERT INTO `system_user_session` VALUES ('725e3f1407844ffebbaf02ba0673e0a4', 103, 2, '2022-01-16 12:23:58', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 11:53:58', NULL, '2022-01-16 11:53:58', b'0', 1); +INSERT INTO `system_user_session` VALUES ('729362aa59ed43cf9606a163883f2f2a', 103, 2, '2022-01-15 22:27:50', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 21:32:02', NULL, '2022-01-15 13:58:33', b'1', 1); +INSERT INTO `system_user_session` VALUES ('798b6db869fb4a77802824df2811be31', 1, 2, '2022-01-28 21:55:00', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:25:00', NULL, '2022-01-28 21:25:00', b'0', 1); +INSERT INTO `system_user_session` VALUES ('79924bcc8d594452a8ee8406d312b2c2', 1, 2, '2022-01-01 23:37:34', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 22:02:06', NULL, '2022-01-01 23:07:34', b'0', 1); +INSERT INTO `system_user_session` VALUES ('7aa8d8f930f34aba857c14db311a9a02', 1, 2, '2022-01-11 10:44:50', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 09:58:54', NULL, '2022-01-11 10:14:50', b'0', 1); +INSERT INTO `system_user_session` VALUES ('7b60ae1b30734903a34b9c7f8723d5e2', 103, 2, '2022-01-14 01:33:42', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 00:51:03', NULL, '2022-01-14 01:03:42', b'0', 1); +INSERT INTO `system_user_session` VALUES ('7bc4dca653954475b05cf233c08f783e', 103, 2, '2022-01-15 13:23:54', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 11:56:10', NULL, '2022-01-15 12:53:54', b'0', 1); +INSERT INTO `system_user_session` VALUES ('7be6aecdb9d340609c87e29e608b886d', 1, 2, '2022-01-28 21:56:48', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:26:48', NULL, '2022-01-28 21:26:48', b'0', 1); +INSERT INTO `system_user_session` VALUES ('7d55dfdc996d4d24a0c4c6aad6065ca4', 103, 2, '2022-01-12 01:00:08', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 23:33:26', NULL, '2022-01-12 00:30:08', b'0', 1); +INSERT INTO `system_user_session` VALUES ('83b5043f08e34cd8aad97c2c798a8f00', 1, 2, '2022-01-23 02:12:39', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 01:42:39', NULL, '2022-01-23 01:42:39', b'0', 1); +INSERT INTO `system_user_session` VALUES ('83c9839e34454f0eba630f29002d0ee3', 1, 2, '2022-01-09 23:00:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 20:59:49', NULL, '2022-01-09 22:30:41', b'0', 1); +INSERT INTO `system_user_session` VALUES ('845e9e7778a64200a87993db0fe6872d', 1, 2, '2022-01-21 00:12:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-20 23:42:44', NULL, '2022-01-20 23:42:44', b'0', 1); +INSERT INTO `system_user_session` VALUES ('84cc13aee41d473c987c1c0381cc05b1', 1, 2, '2022-01-09 02:01:10', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 01:03:29', NULL, '2022-01-09 01:31:10', b'0', 1); +INSERT INTO `system_user_session` VALUES ('882e89a623154797ac2a213c78da1f69', 1, 2, '2022-01-18 00:13:23', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 23:33:03', NULL, '2022-01-17 23:43:23', b'0', 1); +INSERT INTO `system_user_session` VALUES ('89bd23481c9a4b598ebea524679441b3', 103, 2, '2022-01-15 00:57:03', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 23:51:41', NULL, '2022-01-15 00:27:03', b'0', 1); +INSERT INTO `system_user_session` VALUES ('89cc980ca0d941109b3933c82d01d9c3', 103, 2, '2022-01-15 22:30:17', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:00:17', NULL, '2022-01-15 14:00:35', b'1', 1); +INSERT INTO `system_user_session` VALUES ('8c49cc6f52154dca9da6a2632985aa35', 1, 2, '2022-01-08 09:05:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 07:10:02', NULL, '2022-01-08 08:35:55', b'0', 1); +INSERT INTO `system_user_session` VALUES ('8dfa794cc43840f99b2cc7ba287356ab', 1, 2, '2022-01-28 23:51:07', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 23:21:07', NULL, '2022-01-28 23:21:07', b'0', 1); +INSERT INTO `system_user_session` VALUES ('8e9599699f5141d2b041b855c7b34181', 1, 2, '2022-01-16 13:45:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 13:15:56', NULL, '2022-01-16 13:15:56', b'0', 1); +INSERT INTO `system_user_session` VALUES ('9122b55409a94388a7b277ad808a127c', 1, 2, '2022-01-01 17:18:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 16:20:04', NULL, '2022-01-01 16:48:53', b'0', 1); +INSERT INTO `system_user_session` VALUES ('91b94971b7f044c8b68420e6ef7377af', 1, 2, '2022-01-02 17:32:50', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 17:02:50', NULL, '2022-01-02 17:02:50', b'0', 1); +INSERT INTO `system_user_session` VALUES ('93ada27b50d24c1a9b476c7fd4fef2ce', 1, 2, '2022-01-11 13:49:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 13:09:10', NULL, '2022-01-11 05:22:27', b'1', 1); +INSERT INTO `system_user_session` VALUES ('93caa65dbd9d480299850552067a031a', 1, 2, '2022-01-15 22:01:33', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 21:31:33', NULL, '2022-01-15 13:31:53', b'1', 1); +INSERT INTO `system_user_session` VALUES ('945e4bb19f4d4c28ba7135218ee3abe3', 1, 2, '2021-12-16 08:28:54', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:42:25', NULL, '2021-12-16 07:58:54', b'0', 1); +INSERT INTO `system_user_session` VALUES ('9526809b303f489b8aab0c05e6b483dd', 1, 2, '2022-01-01 00:51:19', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 00:21:19', NULL, '2022-01-01 00:21:19', b'0', 1); +INSERT INTO `system_user_session` VALUES ('9655c170353849dfadfdc810c6c5ca61', 1, 2, '2022-01-03 12:50:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 11:56:55', NULL, '2022-01-03 12:20:55', b'0', 1); +INSERT INTO `system_user_session` VALUES ('9a84339c3c594140b0c3a9bfe95f7919', 1, 2, '2022-01-18 01:03:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 00:33:28', NULL, '2022-01-18 00:33:28', b'0', 1); +INSERT INTO `system_user_session` VALUES ('9cb0aefe562d4332bd5a1188ca55552d', 1, 2, '2022-01-28 21:55:14', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:25:14', NULL, '2022-01-28 21:25:14', b'0', 1); +INSERT INTO `system_user_session` VALUES ('9ee1349d7d3043759cb742a0fa5a3163', 1, 2, '2021-12-25 19:08:33', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 18:38:33', NULL, '2021-12-25 18:38:33', b'0', 1); +INSERT INTO `system_user_session` VALUES ('9f24e48662764c6b8b3ba9b4dab24205', 1, 2, '2022-01-28 10:19:07', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 09:49:07', NULL, '2022-01-28 09:49:07', b'0', 1); +INSERT INTO `system_user_session` VALUES ('9f3266f59b8746c3bfe143361d86f6e8', 1, 2, '2022-01-08 22:31:37', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 22:01:37', NULL, '2022-01-08 22:01:37', b'0', 1); +INSERT INTO `system_user_session` VALUES ('a09624232ed94b44a846023790e6282f', 1, 2, '2022-01-09 13:45:26', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 12:59:15', NULL, '2022-01-09 13:15:26', b'0', 1); +INSERT INTO `system_user_session` VALUES ('a155e6dfe4b74fbaa69fcca239facc40', 1, 2, '2021-12-16 07:37:39', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:07:39', NULL, '2021-12-16 07:07:39', b'0', 1); +INSERT INTO `system_user_session` VALUES ('a17d02a7c4264f7489728f510e40e823', 1, 2, '2022-01-17 13:18:31', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 12:48:31', NULL, '2022-01-17 04:48:37', b'1', 1); +INSERT INTO `system_user_session` VALUES ('a30e807e5db640feb92bb1eeb4ae89d0', 1, 2, '2022-01-16 12:23:10', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 11:53:10', NULL, '2022-01-16 11:53:10', b'0', 1); +INSERT INTO `system_user_session` VALUES ('a4688af426e342a69c814d07bb8f7d3b', 1, 2, '2022-01-08 17:21:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 16:25:34', NULL, '2022-01-08 16:51:11', b'0', 1); +INSERT INTO `system_user_session` VALUES ('a49e304816e0477998592c76caa9546d', 1, 2, '2022-01-16 01:20:18', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 00:30:18', NULL, '2022-01-16 00:50:18', b'0', 1); +INSERT INTO `system_user_session` VALUES ('a55b31ff9e6a41fcb931d2244b4240a8', 1, 2, '2021-12-30 22:32:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-30 20:04:02', NULL, '2021-12-30 22:02:56', b'0', 1); +INSERT INTO `system_user_session` VALUES ('a88e404ba71e41b0a16c75a8ce44bb9d', 1, 2, '2022-01-09 11:57:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 11:27:51', NULL, '2022-01-09 11:27:51', b'0', 1); +INSERT INTO `system_user_session` VALUES ('a9b27f95517d4ef9ae15c68bd4365d1b', 103, 2, '2022-01-11 20:37:20', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 19:35:41', NULL, '2022-01-11 20:07:20', b'0', 1); +INSERT INTO `system_user_session` VALUES ('ab449ce8f2ea456591d23515c188c242', 1, 2, '2021-12-25 17:55:45', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 16:42:42', NULL, '2021-12-25 17:25:45', b'0', 1); +INSERT INTO `system_user_session` VALUES ('ac730d1c96be41e5821a6de24b23bf7b', 103, 2, '2022-01-11 20:05:41', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 19:35:41', NULL, '2022-01-11 19:35:41', b'0', 1); +INSERT INTO `system_user_session` VALUES ('ac88c6d1cb184979a015e9a8b50e21f0', 1, 2, '2022-01-03 04:59:36', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 03:39:08', NULL, '2022-01-03 04:29:36', b'0', 1); +INSERT INTO `system_user_session` VALUES ('ae2a8c4a7df64271b0e7a2b702c378f8', 1, 2, '2022-01-18 02:18:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 00:58:20', NULL, '2022-01-18 01:48:53', b'0', 1); +INSERT INTO `system_user_session` VALUES ('b12325b8930245c09b75aa100dc1124d', 1, 2, '2022-01-01 09:12:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 08:09:05', NULL, '2022-01-01 08:42:53', b'0', 1); +INSERT INTO `system_user_session` VALUES ('b25e2297fca14a5e843288df2aa59c12', 1, 2, '2022-01-23 04:49:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 04:19:53', NULL, '2022-01-23 04:19:53', b'0', 1); +INSERT INTO `system_user_session` VALUES ('b523e3add6e74587b247b467de677325', 1, 2, '2022-01-18 01:15:31', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-18 00:33:47', NULL, '2022-01-18 00:45:31', b'0', 1); +INSERT INTO `system_user_session` VALUES ('b64443d1c4bd4f8eabdff02c47f6ae26', 1, 2, '2022-01-28 21:53:20', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:23:20', NULL, '2022-01-28 21:23:20', b'0', 1); +INSERT INTO `system_user_session` VALUES ('b6a02289210b4861b71a363b11b6b919', 1, 2, '2022-01-09 11:23:22', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 10:39:49', NULL, '2022-01-09 10:53:22', b'0', 1); +INSERT INTO `system_user_session` VALUES ('b883ba1582f54826b42fa073276c85cb', 1, 2, '2022-01-08 01:40:34', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 01:10:34', NULL, '2022-01-08 01:10:34', b'0', 1); +INSERT INTO `system_user_session` VALUES ('ba1658c24b78442fb39062e31d902a5f', 1, 2, '2022-01-10 20:12:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-10 19:21:24', NULL, '2022-01-10 19:42:44', b'0', 1); +INSERT INTO `system_user_session` VALUES ('bb14f39f65ca41cc8ef915ad7f0c25d6', 1, 2, '2022-01-09 09:40:48', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 08:48:56', NULL, '2022-01-09 09:10:48', b'0', 1); +INSERT INTO `system_user_session` VALUES ('bcd449a215fd432e8154d883f954606b', 1, 2, '2022-01-28 21:52:31', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:22:31', NULL, '2022-01-28 21:22:31', b'0', 1); +INSERT INTO `system_user_session` VALUES ('bce9ee82f6f34159acfc26e5e994b892', 1, 2, '2022-01-23 13:42:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-23 12:40:59', NULL, '2022-01-23 13:12:55', b'0', 1); +INSERT INTO `system_user_session` VALUES ('bd2b51a53b8d4046b024f43406985caf', 103, 2, '2022-01-15 23:31:38', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:20:30', NULL, '2022-01-15 23:01:38', b'0', 1); +INSERT INTO `system_user_session` VALUES ('bd52c43710274cd8bd888b1737cd939d', 1, 2, '2022-01-22 23:09:46', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 20:45:15', NULL, '2022-01-22 22:39:46', b'0', 1); +INSERT INTO `system_user_session` VALUES ('bd655254904748f79c0ad47dfb49d457', 1, 2, '2022-01-01 08:05:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 07:35:32', NULL, '2022-01-01 07:35:32', b'0', 1); +INSERT INTO `system_user_session` VALUES ('be98e2f02a444a4092d1cea3dc6e3073', 1, 2, '2022-01-17 13:34:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-17 12:26:04', NULL, '2022-01-17 13:04:51', b'0', 1); +INSERT INTO `system_user_session` VALUES ('c09baa895d79468db63417f60c65573c', 1, 2, '2022-01-01 11:33:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 10:13:48', NULL, '2022-01-01 11:03:44', b'0', 1); +INSERT INTO `system_user_session` VALUES ('c0f2be79200f4f0b9c6304745742b468', 245, 1, '2022-01-29 01:07:51', '15601691300', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 00:37:51', NULL, '2022-01-29 00:37:51', b'0', 1); +INSERT INTO `system_user_session` VALUES ('c1797274297f4cd7b859c6c482d06005', 1, 2, '2022-01-09 10:26:00', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 09:44:24', NULL, '2022-01-09 09:56:00', b'0', 1); +INSERT INTO `system_user_session` VALUES ('c386c570da874af588fd4e64f86dadfc', 1, 2, '2022-01-31 17:45:38', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.13)', NULL, '2022-01-31 17:15:38', NULL, '2022-01-31 17:15:38', b'0', 1); +INSERT INTO `system_user_session` VALUES ('c425763ad38c471a9f6e572ee2fd85ae', 1, 2, '2022-01-24 08:20:09', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-24 07:50:09', NULL, '2022-01-24 07:50:09', b'0', 1); +INSERT INTO `system_user_session` VALUES ('c591d431be494e8c847a6b9ee4b0b3dc', 1, 2, '2022-02-02 01:41:58', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-02 00:27:55', NULL, '2022-02-02 01:11:58', b'0', 1); +INSERT INTO `system_user_session` VALUES ('c7c4d30623c84d3e88aab2f0b742e7c3', 1, 2, '2022-01-21 01:14:47', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-21 00:24:00', NULL, '2022-01-20 16:54:39', b'1', 1); +INSERT INTO `system_user_session` VALUES ('c7fc3e37d927405ebbe66df3dd5fd77e', 103, 2, '2022-01-13 01:01:29', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-12 22:57:04', NULL, '2022-01-13 00:31:29', b'0', 1); +INSERT INTO `system_user_session` VALUES ('cbd09ba52ccc47b2a639a6e28e92894f', 103, 2, '2022-01-12 01:34:01', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-12 01:04:01', NULL, '2022-01-12 01:04:01', b'0', 1); +INSERT INTO `system_user_session` VALUES ('ccc85a8ee5a7407c97012b755cde979e', 1, 2, '2022-01-16 18:08:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 17:38:41', NULL, '2022-01-16 17:38:41', b'0', 1); +INSERT INTO `system_user_session` VALUES ('d229b8f8ef4d4df4afd05209acc87446', 1, 2, '2022-01-08 11:02:36', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-08 10:32:36', NULL, '2022-01-08 02:37:12', b'1', 1); +INSERT INTO `system_user_session` VALUES ('d46d26f08f624eb28eb665b6515587bd', 1, 2, '2022-01-16 00:19:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 23:49:32', NULL, '2022-01-15 23:49:32', b'0', 1); +INSERT INTO `system_user_session` VALUES ('d4aeab42d1934197865ce72ffe244009', 1, 2, '2022-01-16 03:11:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 02:41:56', NULL, '2022-01-16 02:41:56', b'0', 1); +INSERT INTO `system_user_session` VALUES ('d8550bde3c8b43a194e592b49c856c71', 1, 2, '2022-01-09 21:26:38', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 19:38:12', NULL, '2022-01-09 20:56:38', b'0', 1); +INSERT INTO `system_user_session` VALUES ('d8ebbe89793f4a829a108c4f1badbb11', 103, 2, '2022-01-13 21:18:56', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-13 20:38:43', NULL, '2022-01-13 20:48:56', b'0', 1); +INSERT INTO `system_user_session` VALUES ('da04f99dc14a4f28a8a77178861cb3ed', 104, 2, '2021-12-15 23:37:58', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:47:31', NULL, '2021-12-15 15:11:55', b'1', 1); +INSERT INTO `system_user_session` VALUES ('daec82cc885849a7bbab76eb9f0a4b32', 1, 2, '2022-01-15 23:31:35', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 22:00:43', NULL, '2022-01-15 23:01:35', b'0', 1); +INSERT INTO `system_user_session` VALUES ('dbaaa89e1659488c9693317454fe6ae2', 1, 2, '2022-01-14 22:53:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 22:23:55', NULL, '2022-01-14 22:23:55', b'0', 1); +INSERT INTO `system_user_session` VALUES ('dbe0f27930244ae38e0322226d6ecdbb', 1, 2, '2022-01-21 01:46:31', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-21 00:54:45', NULL, '2022-01-21 01:16:31', b'0', 1); +INSERT INTO `system_user_session` VALUES ('dd2e53ccf8c44b3e8556571687d4825d', 103, 2, '2022-01-12 01:34:01', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-12 01:04:01', NULL, '2022-01-12 01:04:01', b'0', 1); +INSERT INTO `system_user_session` VALUES ('ddb9d3c65ee14c4a8ff1a3cf0e10e69a', 1, 2, '2022-01-19 00:52:57', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-19 00:22:57', NULL, '2022-01-19 00:22:57', b'0', 1); +INSERT INTO `system_user_session` VALUES ('ddd32e0a43d644ca95ba10e4e5b19416', 1, 2, '2022-01-03 19:28:22', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 17:22:27', NULL, '2022-01-03 18:58:22', b'0', 1); +INSERT INTO `system_user_session` VALUES ('df12a50eb8814317bb8e1003e098cbe7', 1, 2, '2022-01-09 19:04:00', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-09 16:26:16', NULL, '2022-01-09 18:34:00', b'0', 1); +INSERT INTO `system_user_session` VALUES ('e198f4f04da243d5b80caa0c8336d6a0', 103, 2, '2022-01-14 19:09:16', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 18:39:16', NULL, '2022-01-14 10:39:24', b'1', 1); +INSERT INTO `system_user_session` VALUES ('e290aebda5f34c379d0cf3e013cbcc8b', 1, 2, '2022-01-02 09:27:23', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 08:32:23', NULL, '2022-01-02 08:57:23', b'0', 1); +INSERT INTO `system_user_session` VALUES ('e2efa96cacbb47b580096193244a3739', 1, 2, '2022-01-14 14:24:13', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-14 13:44:04', NULL, '2022-01-14 13:54:13', b'0', 1); +INSERT INTO `system_user_session` VALUES ('e3c0319f639a481999bac6fa250af552', 1, 2, '2022-01-03 16:56:06', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 16:14:34', NULL, '2022-01-03 16:26:06', b'0', 1); +INSERT INTO `system_user_session` VALUES ('e42efabb61af4f5eaeea3b84693871da', 1, 2, '2022-01-15 22:28:55', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-15 21:58:55', NULL, '2022-01-15 14:00:08', b'1', 1); +INSERT INTO `system_user_session` VALUES ('e75c264df71342a59a85a6512a5a1fb7', 1, 2, '2022-01-22 19:18:46', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 18:30:58', NULL, '2022-01-22 18:48:46', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f0285533812349a9a6c548a9a9dda1b7', 245, 1, '2022-01-29 12:20:08', '15601691300', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-29 11:50:08', NULL, '2022-01-29 11:50:08', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f10cabf849b245ebbaa5284b540c0bb2', 103, 2, '2022-01-11 21:51:14', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 20:54:19', NULL, '2022-01-11 21:21:14', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f2dcbc8096b14903a5f66d01a8335d78', 1, 2, '2022-01-28 21:53:36', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:23:36', NULL, '2022-01-28 21:23:36', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f42ef6d30bd34349addf16b8a9edaf16', 1, 2, '2022-01-28 21:52:45', 'admin', '127.0.0.1', 'Apache-HttpClient/4.5.13 (Java/11.0.11)', NULL, '2022-01-28 21:22:45', NULL, '2022-01-28 21:22:45', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f49ade9038d24a73832e64efcc30b205', 103, 2, '2022-01-11 13:53:26', 'yuanma', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-11 13:23:26', NULL, '2022-01-11 13:23:26', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f562fd12a7bb41f19ca1bf4aa5e3c9d1', 1, 2, '2022-01-22 02:42:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 01:20:59', NULL, '2022-01-22 02:12:51', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f76c8610a7e5461aac8972e21f14e734', 1, 2, '2022-01-22 21:52:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-22 20:29:53', NULL, '2022-01-22 21:22:44', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f974a40ea70941cdb9e04cb63bf5e557', 1, 2, '2022-01-16 02:00:25', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', NULL, '2022-01-16 01:30:25', NULL, '2022-01-16 01:30:25', b'0', 1); +INSERT INTO `system_user_session` VALUES ('f9f257cf09e640f2904696f2de35d3f6', 1, 2, '2022-01-03 21:42:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-03 20:59:23', NULL, '2022-01-03 21:12:44', b'0', 1); +INSERT INTO `system_user_session` VALUES ('fcac1dd7161d46cbb60fd66b898a9503', 1, 2, '2022-02-02 00:55:21', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', NULL, '2022-02-02 00:25:21', NULL, '2022-02-01 16:26:40', b'1', 1); +INSERT INTO `system_user_session` VALUES ('fe82f6ecb17449b595c7d6bd4bc1d371', 1, 2, '2021-12-15 23:16:49', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:46:49', NULL, '2021-12-15 14:46:53', b'1', 1); +INSERT INTO `system_user_session` VALUES ('ffeae9ee4b8649b6b9ececaa502a934d', 1, 2, '2022-01-01 19:56:49', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 18:47:31', NULL, '2022-01-01 19:26:49', b'0', 1); COMMIT; -- ---------------------------- @@ -2878,26 +3455,26 @@ DROP TABLE IF EXISTS `tool_codegen_column`; CREATE TABLE `tool_codegen_column` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', `table_id` bigint NOT NULL COMMENT '表编号', - `column_name` varchar(200) NOT NULL COMMENT '字段名', - `column_type` varchar(100) NOT NULL COMMENT '字段类型', - `column_comment` varchar(500) NOT NULL COMMENT '字段描述', + `column_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段名', + `column_type` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段类型', + `column_comment` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段描述', `nullable` bit(1) NOT NULL COMMENT '是否允许为空', `primary_key` bit(1) NOT NULL COMMENT '是否主键', - `auto_Increment` char(1) NOT NULL COMMENT '是否自增', + `auto_Increment` char(1) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '是否自增', `ordinal_position` int NOT NULL COMMENT '排序', - `java_type` varchar(32) NOT NULL COMMENT 'Java 属性类型', - `java_field` varchar(64) NOT NULL COMMENT 'Java 属性名', - `dict_type` varchar(200) DEFAULT '' COMMENT '字典类型', - `example` varchar(64) DEFAULT NULL COMMENT '数据示例', + `java_type` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Java 属性类型', + `java_field` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Java 属性名', + `dict_type` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '字典类型', + `example` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '数据示例', `create_operation` bit(1) NOT NULL COMMENT '是否为 Create 创建操作的字段', `update_operation` bit(1) NOT NULL COMMENT '是否为 Update 更新操作的字段', `list_operation` bit(1) NOT NULL COMMENT '是否为 List 查询操作的字段', - `list_operation_condition` varchar(32) NOT NULL DEFAULT '=' COMMENT 'List 查询操作的条件类型', + `list_operation_condition` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '=' COMMENT 'List 查询操作的条件类型', `list_operation_result` bit(1) NOT NULL COMMENT '是否为 List 查询操作的返回字段', - `html_type` varchar(32) NOT NULL COMMENT '显示类型', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `html_type` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '显示类型', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -3162,19 +3739,19 @@ DROP TABLE IF EXISTS `tool_codegen_table`; CREATE TABLE `tool_codegen_table` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', `import_type` tinyint NOT NULL DEFAULT '1' COMMENT '导入类型', - `table_name` varchar(200) NOT NULL DEFAULT '' COMMENT '表名称', - `table_comment` varchar(500) NOT NULL DEFAULT '' COMMENT '表描述', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `module_name` varchar(30) NOT NULL COMMENT '模块名', - `business_name` varchar(30) NOT NULL COMMENT '业务名', - `class_name` varchar(100) NOT NULL DEFAULT '' COMMENT '类名称', - `class_comment` varchar(50) NOT NULL COMMENT '类描述', - `author` varchar(50) NOT NULL COMMENT '作者', + `table_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '表描述', + `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `module_name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模块名', + `business_name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '业务名', + `class_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '类名称', + `class_comment` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '类描述', + `author` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作者', `template_type` tinyint NOT NULL DEFAULT '1' COMMENT '模板类型', `parent_menu_id` bigint DEFAULT NULL COMMENT '父菜单编号', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE @@ -3210,14 +3787,14 @@ COMMIT; DROP TABLE IF EXISTS `tool_test_demo`; CREATE TABLE `tool_test_demo` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字', + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名字', `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态', `type` tinyint NOT NULL COMMENT '类型', `category` tinyint NOT NULL COMMENT '分类', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index e27f025d70..3c19531904 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -32,6 +32,11 @@ yudao-module-system-impl ${revision}
+ + cn.iocoder.boot + yudao-module-tool-impl + ${revision} + cn.iocoder.boot yudao-module-infra-impl diff --git a/yudao-admin-server/src/main/resources/application.yaml b/yudao-admin-server/src/main/resources/application.yaml index e5761d5d09..14c5025d24 100644 --- a/yudao-admin-server/src/main/resources/application.yaml +++ b/yudao-admin-server/src/main/resources/application.yaml @@ -74,9 +74,12 @@ yudao: db-schemas: ${spring.datasource.dynamic.datasource.master.name} error-code: # 错误码相关配置项 constants-class-list: - - cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants + - cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants + - cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants + - cn.iocoder.yudao.module.member.enums.ErrorCodeConstants + - cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants - cn.iocoder.yudao.module.system.enums.ErrorCodeConstants - - cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants + - cn.iocoder.yudao.module.tool.enums.ErrorCodeConstants tenant: # 多租户相关配置项 tables: # 配置需要开启多租户的表;如果实体已经继承 TenantBaseDO 类,则无需重复配置 sms-code: # 短信验证码相关的配置项 diff --git a/yudao-admin-ui/src/api/infra/dbDoc.js b/yudao-admin-ui/src/api/tool/dbDoc.js similarity index 75% rename from yudao-admin-ui/src/api/infra/dbDoc.js rename to yudao-admin-ui/src/api/tool/dbDoc.js index 015c6d71dc..19f91c3711 100644 --- a/yudao-admin-ui/src/api/infra/dbDoc.js +++ b/yudao-admin-ui/src/api/tool/dbDoc.js @@ -3,7 +3,7 @@ import request from "@/utils/request"; export function exportHtml() { return request({ - url: '/infra/db-doc/export-html', + url: '/tool/db-doc/export-html', method: 'get', responseType: 'blob' }) @@ -11,7 +11,7 @@ export function exportHtml() { export function exportWord() { return request({ - url: '/infra/db-doc/export-word', + url: '/tool/db-doc/export-word', method: 'get', responseType: 'blob' }) @@ -19,7 +19,7 @@ export function exportWord() { export function exportMarkdown() { return request({ - url: '/infra/db-doc/export-markdown', + url: '/tool/db-doc/export-markdown', method: 'get', responseType: 'blob' }) diff --git a/yudao-admin-ui/src/store/modules/dict.js b/yudao-admin-ui/src/store/modules/dict.js index 6d3984d677..62d84ec8ab 100644 --- a/yudao-admin-ui/src/store/modules/dict.js +++ b/yudao-admin-ui/src/store/modules/dict.js @@ -19,7 +19,7 @@ const actions = { loadDictDatas({ commit }) { listSimpleDictDatas().then(response => { // 如果未加载到数据,则直接返回 - if (!response.data) { + if (!response || !response.data) { return; } // 设置数据 diff --git a/yudao-admin-ui/src/utils/constants.js b/yudao-admin-ui/src/utils/constants.js index 87ca6e8ccc..912f90f2ad 100644 --- a/yudao-admin-ui/src/utils/constants.js +++ b/yudao-admin-ui/src/utils/constants.js @@ -7,7 +7,7 @@ /** * 全局通用状态枚举 */ -export const SysCommonStatusEnum = { +export const CommonStatusEnum = { ENABLE: 0, // 开启 DISABLE: 1 // 禁用 } @@ -15,7 +15,7 @@ export const SysCommonStatusEnum = { /** * 菜单的类型枚举 */ -export const SysMenuTypeEnum = { +export const SystemMenuTypeEnum = { DIR: 1, // 目录 MENU: 2, // 菜单 BUTTON: 3 // 按钮 @@ -24,7 +24,7 @@ export const SysMenuTypeEnum = { /** * 角色的类型枚举 */ -export const SysRoleTypeEnum = { +export const SystemRoleTypeEnum = { SYSTEM: 1, // 内置角色 CUSTOM: 2 // 自定义角色 } @@ -32,7 +32,7 @@ export const SysRoleTypeEnum = { /** * 数据权限的范围枚举 */ -export const SysDataScopeEnum = { +export const SystemDataScopeEnum = { ALL: 1, // 全部数据权限 DEPT_CUSTOM: 2, // 指定部门数据权限 DEPT_ONLY: 3, // 部门数据权限 @@ -52,7 +52,7 @@ export const ToolCodegenTemplateTypeEnum = { /** * 任务状态的枚举 */ -export const InfJobStatusEnum = { +export const InfraJobStatusEnum = { INIT: 0, // 初始化中 NORMAL: 1, // 运行中 STOP: 2, // 暂停运行 @@ -61,7 +61,7 @@ export const InfJobStatusEnum = { /** * API 异常数据的处理状态 */ -export const InfApiErrorLogProcessStatusEnum = { +export const InfraApiErrorLogProcessStatusEnum = { INIT: 0, // 未处理 DONE: 1, // 已处理 IGNORE: 2, // 已忽略 @@ -70,7 +70,7 @@ export const InfApiErrorLogProcessStatusEnum = { /** * 用户的社交平台的类型枚举 */ -export const SysUserSocialTypeEnum = { +export const SystemUserSocialTypeEnum = { // GITEE: { // title: "码云", // type: 10, @@ -136,7 +136,7 @@ export const PayType = { /** * 支付订单状态枚举 */ -export const payOrderStatusEnum = { +export const PayOrderStatusEnum = { WAITING: { status: 0, name: '未支付' @@ -154,7 +154,7 @@ export const payOrderStatusEnum = { /** * 支付订单回调状态枚举 */ -export const payOrderNotifyStatusEnum = { +export const PayOrderNotifyStatusEnum = { NO: { status: 0, name: '未通知' @@ -172,7 +172,7 @@ export const payOrderNotifyStatusEnum = { /** * 支付订单退款状态枚举 */ -export const payOrderRefundStatusEnum = { +export const PayOrderRefundStatusEnum = { NO: { status: 0, name: '未退款' @@ -190,7 +190,7 @@ export const payOrderRefundStatusEnum = { /** * 支付退款订单状态枚举 */ -export const payRefundStatusEnum = { +export const PayRefundStatusEnum = { CREATE:{ status:0, name: '退款订单生成' diff --git a/yudao-admin-ui/src/utils/dict.js b/yudao-admin-ui/src/utils/dict.js index e10414d405..c3813c31aa 100644 --- a/yudao-admin-ui/src/utils/dict.js +++ b/yudao-admin-ui/src/utils/dict.js @@ -7,34 +7,34 @@ import store from '@/store' export const DICT_TYPE = { USER_TYPE: 'user_type', + COMMON_STATUS: 'common_status', - // system - SYS_COMMON_STATUS: 'sys_common_status', - SYS_MENU_TYPE: 'sys_menu_type', - SYS_ROLE_TYPE: 'sys_role_type', - SYS_DATA_SCOPE: 'sys_data_scope', - SYS_USER_SEX: 'sys_user_sex', - SYS_NOTICE_TYPE: 'sys_notice_type', - SYS_OPERATE_TYPE: 'sys_operate_type', - SYS_LOGIN_TYPE: 'sys_login_type', - SYS_LOGIN_RESULT: 'sys_login_result', - SYS_CONFIG_TYPE: 'sys_config_type', - SYS_SMS_CHANNEL_CODE: 'sys_sms_channel_code', - SYS_SMS_TEMPLATE_TYPE: 'sys_sms_template_type', - SYS_SMS_SEND_STATUS: 'sys_sms_send_status', - SYS_SMS_RECEIVE_STATUS: 'sys_sms_receive_status', - SYS_ERROR_CODE_TYPE: 'sys_error_code_type', + // ========== SYSTEM 模块 ========== + SYSTEM_USER_SEX: 'system_user_sex', + SYSTEM_MENU_TYPE: 'system_menu_type', + SYSTEM_ROLE_TYPE: 'system_role_type', + SYSTEM_DATA_SCOPE: 'system_data_scope', + SYSTEM_NOTICE_TYPE: 'system_notice_type', + SYSTEM_OPERATE_TYPE: 'system_operate_type', + SYSTEM_LOGIN_TYPE: 'system_login_type', + SYSTEM_LOGIN_RESULT: 'system_login_result', + SYSTEM_SMS_CHANNEL_CODE: 'system_sms_channel_code', + SYSTEM_SMS_TEMPLATE_TYPE: 'system_sms_template_type', + SYSTEM_SMS_SEND_STATUS: 'system_sms_send_status', + SYSTEM_SMS_RECEIVE_STATUS: 'system_sms_receive_status', + SYSTEM_ERROR_CODE_TYPE: 'system_error_code_type', - // infra - INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type', - INF_JOB_STATUS: 'inf_job_status', - INF_JOB_LOG_STATUS: 'inf_job_log_status', - INF_API_ERROR_LOG_PROCESS_STATUS: 'inf_api_error_log_process_status', + // ========== INFRA 模块 ========== + INFRA_REDIS_TIMEOUT_TYPE: 'infra_redis_timeout_type', + INFRA_JOB_STATUS: 'infra_job_status', + INFRA_JOB_LOG_STATUS: 'infra_job_log_status', + INFRA_API_ERROR_LOG_PROCESS_STATUS: 'infra_api_error_log_process_status', + INFRA_CONFIG_TYPE: 'infra_config_type', - // tool + // ========== TOOL 模块 ========== TOOL_CODEGEN_TEMPLATE_TYPE: 'tool_codegen_template_type', - // bpm + // ========== BPM 模块 ========== BPM_MODEL_CATEGORY: 'bpm_model_category', BPM_MODEL_FORM_TYPE: 'bpm_model_form_type', BPM_TASK_ASSIGN_RULE_TYPE: 'bpm_task_assign_rule_type', @@ -43,27 +43,17 @@ export const DICT_TYPE = { BPM_TASK_ASSIGN_SCRIPT: 'bpm_task_assign_script', BPM_OA_LEAVE_TYPE: 'bpm_oa_leave_type', - // pay - // 微信渠道版本 - PAY_CHANNEL_WECHAT_VERSION:'pay_channel_wechat_version', - // 支付渠道支付宝算法类型 - PAY_CHANNEL_ALIPAY_SIGN_TYPE:'pay_channel_alipay_sign_type', - // 支付宝公钥类型 - PAY_CHANNEL_ALIPAY_MODE:'pay_channel_alipay_mode', - // 支付宝网关地址 - PAY_CHANNEL_ALIPAY_SERVER_TYPE:'pay_channel_alipay_server_type', - // 支付渠道编码类型 - PAY_CHANNEL_CODE_TYPE: 'pay_channel_code_type', - // 商户支付订单回调状态 - PAY_ORDER_NOTIFY_STATUS: 'pay_order_notify_status', - // 商户支付订单状态 - PAY_ORDER_STATUS: 'pay_order_status', - // 商户支付订单退款状态 - PAY_ORDER_REFUND_STATUS: 'pay_order_refund_status', - // 退款订单状态 - PAY_REFUND_ORDER_STATUS: 'pay_refund_order_status', - // 退款订单类别 - PAY_REFUND_ORDER_TYPE: 'pay_refund_order_type', + // ========== PAY 模块 ========== + PAY_CHANNEL_WECHAT_VERSION: 'pay_channel_wechat_version', // 微信渠道版本 + PAY_CHANNEL_ALIPAY_SIGN_TYPE: 'pay_channel_alipay_sign_type', // 支付渠道支付宝算法类型 + PAY_CHANNEL_ALIPAY_MODE: 'pay_channel_alipay_mode', // 支付宝公钥类型 + PAY_CHANNEL_ALIPAY_SERVER_TYPE: 'pay_channel_alipay_server_type', // 支付宝网关地址 + PAY_CHANNEL_CODE_TYPE: 'pay_channel_code_type', // 支付渠道编码类型 + PAY_ORDER_NOTIFY_STATUS: 'pay_order_notify_status', // 商户支付订单回调状态 + PAY_ORDER_STATUS: 'pay_order_status', // 商户支付订单状态 + PAY_ORDER_REFUND_STATUS: 'pay_order_refund_status', // 商户支付订单退款状态 + PAY_REFUND_ORDER_STATUS: 'pay_refund_order_status', // 退款订单状态 + PAY_REFUND_ORDER_TYPE: 'pay_refund_order_type', // 退款订单类别 } /** diff --git a/yudao-admin-ui/src/views/bpm/form/formEditor.vue b/yudao-admin-ui/src/views/bpm/form/formEditor.vue index b04ef694e4..c2ec15e32c 100644 --- a/yudao-admin-ui/src/views/bpm/form/formEditor.vue +++ b/yudao-admin-ui/src/views/bpm/form/formEditor.vue @@ -42,7 +42,7 @@ - {{dict.label}} @@ -167,7 +167,7 @@ import { getDrawingList, saveDrawingList, getIdGlobal, saveIdGlobal, getFormConf } from '@/utils/db' import loadBeautifier from '@/utils/loadBeautifier' -import {SysCommonStatusEnum} from "@/utils/constants"; +import {CommonStatusEnum} from "@/utils/constants"; import {createForm, getForm, updateForm} from "@/api/bpm/form"; import {decodeFields} from "@/utils/formGenerator"; @@ -232,7 +232,7 @@ export default { // 表单参数 form: { - status: SysCommonStatusEnum.ENABLE, + status: CommonStatusEnum.ENABLE, }, // 表单校验 rules: { diff --git a/yudao-admin-ui/src/views/bpm/form/index.vue b/yudao-admin-ui/src/views/bpm/form/index.vue index 15943b7cef..41be534d3d 100644 --- a/yudao-admin-ui/src/views/bpm/form/index.vue +++ b/yudao-admin-ui/src/views/bpm/form/index.vue @@ -27,7 +27,7 @@ diff --git a/yudao-admin-ui/src/views/bpm/group/index.vue b/yudao-admin-ui/src/views/bpm/group/index.vue index f0407270c0..9b2372c999 100644 --- a/yudao-admin-ui/src/views/bpm/group/index.vue +++ b/yudao-admin-ui/src/views/bpm/group/index.vue @@ -8,7 +8,7 @@ - @@ -45,7 +45,7 @@ @@ -82,7 +82,7 @@ - {{dict.label}} @@ -97,7 +97,7 @@ + diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/browser/ui/codicons/codicon/codicon.ttf b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/browser/ui/codicons/codicon/codicon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b546c0a9775d3a6eae370da888c20094986fc70a GIT binary patch literal 65176 zcmeFad3+nyy*_--j26q?*}(s zvSH7LKd633h;}|9jw`lZeAU)Z4!rvsA--z~`R-fWw`|y4`L!Qx$GN`*GTU)L`>*O8 z_Q!yl?U(GkviE815&8ik>g^Zr-n8NE;m^bgseGLf;iXG9T)9WMhI|X3SKuW7t__!L z2|P37Mna1CKB0Wi?#uRFI(KX>A-@|U#Fir{yZ9lyAA9}Be~Q0nN2dSKRmu?@wI2F% zY@NCDBckV5{A}g72H2T=`;T$)_u_Bywu}gq*W(&o{W5VY@7d9E{NiiQe~$M}Bu9k4 zS@V|>)5RP1?IK>Hn)dnheR}al+cx0-xUB+}awf$QN;FeP#ebuB5jEbK1=eDB@Gbo% zX{IQFK-40R{*#}9tur^1?&A8=t4i%wp)OPRoIINy{~!EM8~o20_@6QGKV#tkn=t@U z%Val`(a>p3zN;FzMiOgrl*#=#w$LItt`g4Ty-CqHn&QFY9mO|_-!3gIz4{MmnBw~4 z;o_0vw~OB^4Y2pqekiUPCL75Q$q(tfI4+WB$e+m{$?fFVG=*bk@-=EFZFC7$Q3KVJ zJtRs_k*(xm@*-)X&15w((Z%FyvYq^%e2=_NzDYaDr^wCZ2+dF**+Cnrn?`62t)Nlb zKV zC0Rw*khQ4wId$u6>+TuLq@`^e?w3bLPENvMz*XKL-yz>6C&~B8kI280 zACsSupOT-E_sGx5FTjF+MgEQahWtDEko=YuNs0W9oF;!D|3Usl&XAADU&vp{-^ky| zIFZReD4~=JRHRy3Ms>8D8mWm|sFm8NgF2~)dTAxCq7wDf01eSFt)=xePFrZ2W@#&J zqwTbVcF`Qo({4J0&ZM*H96FcIqx0zkx`+?KF(ER0+;nM*!P-Xv#f6M2W+Ni|eWen4I1UGhH3 z(S;;MzDh13_mG#!x5)>jio8wUBDJKBWNDK2(>~fmd&yz)pJalZAPYc&7(4m@`;UP& zfMpJE25?QxdJZN*iW@jEyGd~)2j)2`ZsNdOe#a$c}H7M@pfTSVCJsglZq_~#@ z(uWi;<$xR_#mhJ#kw|eL2V@f|Ud{n2MT%E&fL)W~ehx@3QoND_GK>_j;(#Mx^9FXXwcs~bZJ1Mfd0ZeNZAK+lx ztoR@YvnPrVaX<%<;s^(`Xo{@=0O$o$e1wB(x#FW7&=sWkX%1)&Qv3`D^am+E#sN)2 zijQ+Zr;y?k9MCSL_#_AP3@JXvLAtU1EC+NCDL%~sEkufJ&H&IyqY)fdiV36u-y;okxma;(+!e zMK-1Z;>Y$S4roMD{1*=BMpFDT2ec$9euV@2k`!O&faWB{Q4Z)(QXJ!eHYLTcazL+= z;wv1CffU)?2B2$6@l_6JT~hoy2lOu~zQzGfOp4#&fKDdG*Eyh_N%5N;(9@*&Ee>dG zQhb90x|gY=ir?daJ}1RDIiT4|@gxUyJSl#k1KOSx-{OGYC&eFdfB}%=4>`aE zNbyG;U`bdNb$EEU^Apx!Gt4;)}ir1(b;@Fr6H4-POWQv4GKxD+Y=nFFkf6wh#gUycMuz{p5(oCDm96#tV$sn=QT1K?|DSByxcDk&=o7{Ew8>9AJW^q~QQ3Bqc2e*dZxF#xZ~=l9G-C zjFFVeIlvuBNzVZmNlFF|@@Z_19AK8DWa0qFBqcKk*d{4iIKVqe$;tr+N=h~ka8XjS zbAXkSl7j>Ml$4wtV5+3#;s9qQB{v7yD=AfQfX9-OhXah3l)N0^wxm?a0hUWjRUF{E zq*ToT=1WRG4sc*nk~qMINy*OvUQ9{>4)Q9tK@MM09z-e zCJyj+QflS^gD0gV2e>>br8vOqNvVZ{{1V$V2bex7WjMh3Nh!+#_D@Q!9IyjOsf_~` z0V%a}z&0SI4h~oeq}0j526m~71C|3RV=KAf-MI*dL@clLM9rDb3=5O+reuIbfZT(i{%hDWo))0~QM@^>Z+vXlWh?CD_jA zpmIsY(6dLpeAewIVhV$D>$eX z+aV5W!*(SHbzr-SgR*(EnuB_mm-y#?%fD=Akd`fjfHDDDC_eA2W5SJ9S3E7emw_eeSQN6Wqp1l z2W5SJ69+6@Qo5M~wk|2%!U3z7ly2pK{Yy%>aljHLr2`zWiAm`o2draKI>Z4xnUoH5 zz+xt)+c{u6lhPd=gtf^hIABkc(w!WztV!tz2W)Iox{CwWHYt6Q19mql-OT|DoRse2 zfGti+_j0gEO6fih*yp5llmnJJDc#RO*s)J>z2VJD3P|Y*4)OzRpX7l5 zfRvu%fG2^J*mnc)DUj0B9Eh)w(lZ?JGmz3T4tN|$>2nSU*@3w*nWkBvT^k?2kpUjlmosIQeyoIz)M0(tUdtzC8YEU2RtXF^feCn zP)O-j4(3f!eqMv0sGhE&*V3c(IQ<^|HT|1l5^98;aE0&}aX`FD{5e8SeX5_UiTY~w z8O;gpQ)Q;IT-ma+$I8B3cCzd@WwOq%%jo)a+jU2Eub0QmSCv1Z59){XFX;bdFc>a1 z{MguHTxGn|_$^bdX}jqz(`%-;%){pIS(+?IEhjB!tR}19nzVLXhpgMJciLRG7TYn~ zt9F%riT$wsnEjXbafi>*>bTPJnB%0=;*2=QoPTopT-UlDah-6Tc2~J`?#=EI_gn72 zRn%4tRoqtb7talzmp$)#tGqXOPgdqCAF2FVRi^5AHK|@!J>o0#HTX9AZjo$KMp`9Z zEB(-K@b~z~0y_e)1j~Z=hT@@@Yqr)L3vUdcjl3QmjE+Q)*OJ=)+DmKSuFKWkQ1?PT zsoz>ZQhz2k5PKr_r+6fOU7|a2MdHJT!G;GL&Ng;8?r8jRt zV{N}_A8bF^{-=(?j^{e#oi}x!?kelbbsg+F(e**jk!#J3WZCbQ*Dqhc{Mo@>gAcB#U$K3~FNX|6 z{X-{L8deUj99j9ns-{&pt$KFV+0`|x2UlOZ`t3C>Yl>^*YjbM{)^1$8Z|%>AgTq^g zUl<-=w`<*F>;AU>h7H{t?%wd7ji!yeHom;cuqnA|aMRIE-`PBW^R6wkwmi7yLyTG# z!m0ldKSVqt2!GQ&=2M|9(MUAn*J`vHr^D@%sH@qH-x0DIpP*F-S&t~~ zmt-xb^pbc?n6Ym*HDp((Y3usSwsdQJe%-*;vs$+=iqVPZ7tH7mN2B5H84vX2BlyYp z2zSjcEYkRWny&SiZtPU2hTHVQ%u8ob8e6ozRbpp6aKSaKXwX?G-%gZIk2lVMHDnE> z1J;yP+$kT*$%p9voRG@1ZJzFz53wvX5A?m*U>%BHor+)1qg zs~B(w#KULbmhdASmn8r2M6+;uVzIEdz-}iV^N&gszr$w^X>_Dem^ew#$Oe4PRGE$l zpJiIq?$$=rS+_P2&AOf1Xm;$j#OP?^Hev4pwmm>!IuIX=kH&Ai4KHJHP>iYTH;Ox% z$IMPs2(_SE^qaIbPTS)0L|&etFUfBx`@$U)`xs%KYKJJhMu&hvmZBo`W9Nxc`Hi@I zB2L8|JhfBT1erH3j6i{wqR!MUq-d*rB0XW=^FWoZTvfguL#GLb9qZR18#bBWF)aoIfc%9IQDQH zmwoJ9rL|Cps8GdjCqF^gY!i-Oc=PzH80VF~*J<)X=YPPV5G!4Wq_ zd8xQ@sxk6Z{8*itj~(OWVvG|f^u8bMBc@a7P+ILwIYo_6NClEPfo82)j2mq>;1)Ok zIiHtLG!FL?ewf znaWTUE**0C1nMx+1}OQYkBW(Mb67fM4=0-4UZdT9N{SfNWges5>aCyEm^OHfT7#jn z&K}g+%Tz{>Fyzr21h?KIzg_OJl^1k24}CQ?xOFf^lgjH@KDIMf(NJU8mD_9$6|tR3 zPhH^fyrfj=_QV`^dr}Z|x;j(b-IzWUX{>6UIWsWZEXdz1w>eEFr>$Jro0_^;YH+gt z7m3fqI~rl0K^p0znFb*mF$r3y!%W>NREJe7l~rqkk#x$X4J+-D$>ylrC*mZD2E@J! zTDS0`j^4t?G_45xPT4~Z&5c3FDWCk3ttDKbcKNgJs(7S!OH0$zyq{LNC!V59=gu#5 z>{;2W)z+`Ps^{?hIlJmB8bWqlT2Vh}4|~1#owJq<9!_rv)dVz}#N3rl*R5C#;;;0X z@CPx0D1(c6a>G`r94HE{kK#2XI#bC^x+N4Z2O$M}!9Q&(H7lO~QxnT#atop?~M6H<*6XLUNk6EEaP z^JDnU;TJ{bdLx1HT*hKBN+ETaFJd&LwFX4v#7QZGaHf#Wzu)jaJp*Za_H8GX?I(ZY4OQz#vUz{Xvezz(BIYNs}hyE>zooS2|iH>7zsjjuZV zQ@?ydIweVB+&}T=_&7Z?E{*!f=}QIqjd5vA8W&CvOVY3;8_*7ChV!|mJ0!nfI+7U6 z<;LlZBQ8mD+$p~{sWX@?s6%XE6SE-@M@>!A0_eds8;CifK{Saz>UKI@ZfAp#p_&jz zK{S*MHG@iY(IC*0>7Yp$o2_<-7TcV_Cbvm&xj{7|IROJFYQmX0oaLl74Le%5u2`N- zXL;9ij!D!Di^CqFIHVu(!(_)-A5G1!{zlKX%3b z!Rk=LR;`+`Wpi#Tt!W7}h&v>ID!FWE%c47XdPT7^qVr#L!;Kfua#!_Va{aYi{5pG$ zQLK6DM_-?KTlcWhMpY`E@nM_cI&V1az0RPcP04y+NFyy>y(|z9_=omiQKzo)#dj=~ zf-BM#C#7)SA`^83MFWDL$!t>)`!t4=yNFtooZvi5SXw*ou2+F)aaR9 zVd@@FqTREI;Vea~r&}6m(1e78P*m$?6i}jUj5AT`&bm1XbY~$c^Ay55i^kvOTypWJ-Mw>{^+TXoC&&CT zw3!_2zpJr-*aw{1KF4U`mYE3GrGRzxvQv}@!!Ouu#gAfX$`?MOj!>0x< zhwujj%{GY2xuS-h&rW09p0Rh9?vUYj0H&79OiiNGhf(0eRk$f8u}_5o!5BY?7U*Nj zNkxk-Y&CftR)?qTKs0RB>!`8Zska-dY-U?s!c$xA4OeQwm0B0C+qtVPll4p9c&(?3 z3gxZ}Q>8&~s;lreL4NO89_z32TFe@?%Un}#)_9DPS8t(Z7M;s(q-Nu9O*LUlwZpEn z>9y`Eslr@tx0-?v%Rhe;L;^JBGg_+E+T1pipt~tjXEqx(dW+t!cl+$M)mFPRTv_Ff zB)pQpW%sU~>le3MEtG0Bl@U*MttC)ZX>{xLCiz1R>;;RreR+Jir77Lm?D07KmQcA> z?~zOu8hx3)+~$?6j*#iMCNnKFx}7?s#Vu94wI)^=x9}JFJ@nn1EM`27qv+tTf|m(g z3S2vsrcpP9AzD>*qb1QhQAS#(x&b>%CuQ6)6<|oYOe(ixDloGxCuTDu)H<81=dK6^ z!DTQ>F#;HQK^I0_l)GVE1n~*8&e$CwY!!=5sHVY_v@I|HJbtpay4+Z4s&MHkt@1?U zm6AW3Y0tE^q=)OGzADy62Cu_fSzTMvP#?5ZQKQ{uGgF=37>*t&^VscnkI8ED)dqad z@-khyvD$1f8nk+w&R$+2g=ow>T! zCRI3WHoeAZHrGXN(g`MXzg8>1t#?U|a+B6zG@7dodR>`OhXH9cqt`;wYOhUiE7NPd z2KJeamWRwiyT{YmoNh|3i!X2YTA+Zr-SZH*iWW>F#r&3_RANX>W$h56c`-$usdP&O z(+ifI)~QSl!KpQgpk3fE*(m0V6Ld5bY!F&NKk3`8ec$Q+c3=8(amh|-#UAH zY>r?+U+&2Vt<_Hb-atY!n|+DuNQeCvt7nb5D(bR&?d95XJ$>OG!8Gxwd#GRci(lw; zHu;kFKlja5X-sNum$RbWUE{T=9R64XMtUf4iAFR=+)>F|Zgp3Bbg)(?>+=KDM+57{ zz+(S88Wpo{oe+gGz%P3vz9m;AzTWsO{l4s{wz&MaeCS{>$&QHHiB|<`51bKdoMaf3u5Y2e${woK&wZ!P+`ia?#Xw>_>6dbD85FqBbhBZ4S$XA z#z*l>_$d$ZcfwmevHGF7Enk2HF68LSUGbq|GK0q0#IA{Wr3*Ty2jCyMTbQ@X@oHH?T1T6MVdS?Vf{Mms(+V1ko(cN9*V=SC>u|TfPuaCu0&P{@ z!fBmtZMQU&e~MjyUw2h&&|;gqx5BrWM`QBdY$k(EHmI2MOSyAL+n&cIi&WjQsd>*8 zdo~WVLk3rOY)tMEk6EP0_q1NQJGrr=T9VoaHtyNKyLl7#r`nO}=Xw_Vpb^MmcI##n zRiv;0@z9L2Lr#NlMWW4$<_77-S<}CMs#L;?rmao1v3_~d<26>!3NBl}Z5?}KphhD# zcsxNGtgCONuK!ZVD|qR}VVq~ING^}9+t#>#Rxs(U#2Z}Ew5<`ht;6*mk745FkJn_f zhP*$~52qnFSSBM0Cv%iDONWnUVKT!-$Qfglp6R=+xA(Gx?B(C%^M>Zdm6ylICy(KS z@%ZGy_`Dk?#|mpJC%gub0O$+oC`K{R%TS7n{hp$*5x{axq8f@#QG@gh^SgC)O#1zl z9XPBSVuB@m@W?G2)57V7*u)?CzIbfPKY0EEd0tN;C0H60+OCUkorC>}Kl1%^cGNM9 z-Zo@F&0|?I+-!uE6iBB)oTnN9_F@Pm2tBJDOvCD)`cR_{H86z_BPQu`zy=rjrX>@Y z+Ts2(k&(xfM@${P?ZIGsZ+l>@P^bz9uoo;SuQ=FYdd$=j5R&qtU|SG>qgCuRNblua z#U5ld^z5IfE)C*7!s)wkSLFibvc9%psIoGI`8IWVs5KaD4e?h@i*t2PC{~Ca`B{kK zgxwIzQ7(d+n+(%Epk^Bpcunkr0StUuQV5o(hg3Vu3Z4&5cZ@xEiRpLr{WBjUkU#>5HoscYy z_;b81bAFiU!nmVSYm#attKbUQCce-|7s_AkjbC*YZMrhiC%-@!_9f6hoEPkb?$To} z_*qUFRa6r*sIt(Z%xnuendO%45Zp}GxnX4pmGPBB@ge-JjIU%ej~M}wb5KL$`GVX( zF3+Pc(m%vk;$wauy*~#D$xH>bS{_FDm^|;C+)|5bCg&VC_&#J`#%W+p|z#rth8O*d|}O zgf5ex8-T}`jZdzlSY6s!KH{{x#ArJ8e^(n=KT2gp#rYY98}x$8Tzl<*Tb+>+RHw;U z<5{pqsm?HJ6TdBf;QvW&(noT&87r^N8%yNR)5Qbv0|%zprHbYGO{+^N?F@XZ`2)?mqgpr|M*aSg!pP)yl)W95as|OI!A~bi1^mcIUVAMc z-@7-iL|$+Pv`T?}Iwp-43JU#S}p-8e??^e_%yBEi zV+$<-&!`e{8cBbVKJCxTJ6yN^=rQ$#^OA z6)DUWUW@<@1T{{p#)U9NCT(q?ig#z{IggIbTSLQM;j|YX!FLJ;;Wz|02I85pSDxps zsqxa6JYi5-w3%WD3CAaSF-9_0l7NU6%w~0Muhg#h znAI+iSwmfoW~m{j3w=IZ8z0C8q=t|!xb)I%+r%wh>^5J%@YWM=R{3aSV&TBr#YZ+u z_1lj=dOQ7I{D9P3t7)FuYBTTF;;tsO(|dPgw5~JN(EX{t1?B*xC-&1|5Rk{| z(R50L*{Dv3p_}Q6tZ~`J%Z%Ch99=%IG7iLNdgctw@yv`57*+XP`J8b?PP0#_XC;%f z)Z@7(m{#{AS`daGG27D9)55OHdNWn#Iw<8cD#AEN;SKA zSZMXihg$w)-mA3hgDLLwbL1EBdUXHq)&s^bYGI8)ko>PIqRxH1BEmL#Io&w%>*`<= zeJPtlMOqWHb@`l1s+wLAb!T2TJE2r0Ia{rsom@-vE%G1xe@R!!S2)V)lauSpg+B{_ zR&1JTwtfIy2NY94Bm$EU(FyFkvaE9edQt0bSM}>U_ujI9URm4b$l9eXn)-#S7pFAQ z_gSz;BwwfeTngxED$1fjm;L54h_M&t z2fj0TAASyjKM0@72H~_kFm=5cpS1glT_>brGkg`!j;#Fc=bn3xe#GMB^0yB?_x$rX zebU#GP|hcqm1k(1{Dyo&Ot4pEWGXyE_>=G_^bv0}$UP9&dhQx*tHdF3BVS7=?Y?ejDqDtI=L}S60 zSEOB*w>#1o&rO71p= zc+f&G4Ntnn;1-)a7f-%ma^BC@5ryIXh1k~mgvs(HTD$9_#r5iB zeEw7Ze6~5TMQ}4g{l>hbOi)ja^#poKr}$T4x!ThKjTVFg$vTlJUSPvBM@0kdK#XxV zmsq(>0y@$MH9J!$F078o89Hpy$)n7m7anLEa*Mw98vJGxuLnQK3>)iHC1BX-WGCtf4&1sf*FwwP)m zX4}BN*G{z&Cb?MMw)KX>X77s7EuVe%;DYYUjy`<2X}Iy!erfA9SFMAr?AbR^>0i82q!2>g$G>^%KC{JT7(MXMa|gBE8m8rQnI~uNTDn(EMCBLY6p0GGvg0pk z8*YnVD_(w}aX&qXwCXsZ6<4jRDQYP&uRi%bCkjgrxnUd+=z5%j)-cwywK$U7P$Mt*`A{JhPTQAWWPU{IsGXR<~`>w)*-C4}DAY zUmrVgOa1lN*W;DGUyu8Wn|3&zVu!eGvFfh+L#lLpXGV=1s}^q-Iz^{*=Q(*Up{0%KXo>#5#Tr%FbmxvmGaMXDD;RqWSHtHK5(_v?tOk%RJ2r;DbGbMZ zN#XgzXnu5*<#h3KG5-m>CyRqkE0-FX6QT44Sv~X&GG#9;8{9aDklFL`dsUpj7t0U2 zKw?b0rF;k}gOg2luF5Dp>U?st!O@J92*aPBtUhhm2ARR7-Pl&YdMxO%mNp%BIb>akB?6JNsfVY@&4plJ@7v9 zB4rhCSUMD*Dj_qLfr3QaFuLE6@-Sz{v2Np>H)(uaH2Rf+1wR+8vB@zu@%uu7**#Qg z;H-E#TXk+%I2t6fPe9I!n?fils*DNh^eO4oBOUdZ?OQJSWAbQ%&deeK!oF+XoH_Hd zadGDIROUw4{tCzQrudQ z;>KKOETQh)&Uv|c45JP{AU0EB1GBzNiO{*2cxmOAP3CcBp5;c7{>HM&ful^m2&a_^ zc=k(l2>!U25H9ggEQSo89FGqpKeiH4k6yHmlKGq~_k=$A15QWONJ+0RnkH(Kq{fWoaA%FV7m-}b;<=P{)CbM2&6Wx8sgEL2#)J4v| zWA+DAnYMg>{++1}IaOJ+tFJaE6mHg+G zY&1dp!k@&9D|ae_piZPwfF5q7={yWEH)Obkai&F1pM=~lH*+wVnF*_bcZsD`vMt<; z=iDG}hyh{#ao>%F!TawYEZpe3DNy0E34*q%(6Y>N@4b#?Erq7){%X8kY7gtnSJhO0 zYOrv_{^$&&&#R6!1jI_W%}}4P%qk=<-#yfwu;Bti4wncWoVVYJZxV& z?PmAhtGv|;g3VPCxJkO9F!-57jlt%w6ax(rwby4^xT^j6sIzX(<-6xv>sDQQ@uqx! zlCwY9YwpNGh8=kkwJQ9lPVi^-GB^lCPc~9}4 znHVVmC82F7%o`|j+u6Z9ZDoJ?iN$Qi2K*)rI08q?v8l6I&;*Ga`&r68`@@;+1nk1i zGC7u*?zh4(&7Q$X5Fc@KM(ToZgG~!HypY(1gA%!9a84_(N+gkqJv= z2*SO0<`dhJ%P-k7giuJnvu)GXi63olYRM&Hhr-Q+E#dBpvDk!-`d^HM!2*zoR^C;Y zHyX;UErUsM=e&4Z3*snSl=yybxb5zRGp}kaG|os5HhU|cj|30#0Ts(;vrXrz*2F zGIQ0YRecdWajeRdUSXG9dSA<|g|pHoIP+cAH&(%K0;h)JABiM|RlA6;yqKP ziC$`Lowp)US=qd*FB+b?GF4fbSP@L2W$gWsH=WGL;gix)_IGc4!4OX%s!sLAp^>i7IRi3HBJpQME%!?}zQ?V z%p;Q4I^q2kndC=qILwL*PZ92W6It{F2vWT-cOko8ermA3VOhK()6?_DrrS%MuEKXcMO@z@l<7E+@VSIy|Url)Jg)8YE>I%E2y@+0*}^)csn7hb6x zAAI_p>|o_**>PUQBYdvp+LYoTgr7u&k?C~j5!%N*pH?!{7y|Ud-c!9UKixnOT3EP-+i+s`Zc@ETRQZFkfWBhN)6~EnF>%Q^Fb*S+I@K>9n%) z1K}tqXb4zzC!0>+hrD=OpCy6_PKo@~713~?iBQw{o#n&rmFCU(QJ!4fkptpGJO zIAT4a8b?LYVhR4tWTMGrPmd$A#Nnx-)QVL&w5$H&o-W}>sGa-_ZDlpZQjK#pgczi4 zW4TekugYdy)82l)sm9Te7^Oznej2Lq+O0G)XEfM|`f{DiAUSnw-ZE75Cu;j|4^M}x838DgGB zQN%0;Y1LJ^;_;IU zDU=KVcL+Cy;emx!?B2ppa9b=4qJQoDMs{q|rh;r3Ltr1Ch_+GjLwquEM`!0No%FAp zHo+j>E8o_chiISlzp*){<(8=8ZBHw<4910c48{pq%l-mw#S)mE+vRuJnnhZ_9cBy2 z46QetC-2dN@zuiO>)~idNrvaFUW*hmw(ObxA_0@{z~?P!SquWK9}X-SWg5o*wahOU zLFfm}CK81K$Zp}pM+neog^oa#K2#miHk4^?dVi?rqE?ZrHCQ|##cjw@w>s5oYkcOA z*Wos1D7-RZ|CRlPjLIj~2aVA#o7q@p%LiTczCP`3+C|kSs>(D=7RPYDsb+0;#f+Nn z)`mn?qRF`Qs$R3h>GMTGbzz&kA{eNxsSnmQ-|@s^SCty;L9SlaH&jl)=!q@yRj*H) zS|e>&wD_vku~pyd-*>pIcYdv(c3kA|?_YHh8|Iv^UWvBRaK6e?gi~Q9Q#d7FiLoFb ziqlW9zo}iZkYLj)Az$X2+L^k~EmQZgvxH-qvwV|}fnV;A%U8tZz2|lXZ=Bg}aeCL; zzfbK=-KPS6XI>tdFf@gGx!K)>(%=3br3U;>{Q4hqR6dPAap~Xw7GaWT0*`WyQk#65 z$-RF};ECfqp*?+EE;Dfq_oE{40xq}Wii1=>C;86VICd78LiQY!eAPkuiVPEY-5R3| zi3TAUy+HI$j{$%6zT}NdqDXQ^0*lMMk_o+lk7*^{3ySFb*#!aN({F@7Kci`IYEHg| zvKp2AL4s@+JJKDaOeSmLu|g@GC^p<|YWS|8IEIDieNXykOY%{a4aqUoka5A<{f#UA zdtXl2KXK3Y4_s-wqu{15MMwN;#*~ClW^@Hz+V$#ZXsa$W$&1hH13RRng`uNImlSUC zJQq37+zVAozN_#Ku3wTY#Bn=Zzr>E~r`_&XM;8}v_Ds9Q^U96o{`0(kJU3B8poI(BkO z3r-efz(iL^oe0)r6a_GPrXmf_sHPeV8xd^43Y|cDY+Nn>3e)<1*PA*|n9&DloKrb? zhLHf5SK>I&*b7+u3*}O1Q?o^Vx|8ll!!D0>3QK#(^U^pn*w~p!(+(!=o_yZsH)&rQ z8=I74!k?fYE7R&unS7e2Xpa!Z64R&w09QaxKf6#rWcs zAy?_`3RfAWf#~kWsNE6+~Ze|kC%0>x@c{;etcY|_he(6)_qW` z$AY@RtX#cD5NJibJ=f+`#5|LW@&%vJ`N5;cyrVA%2AA;`4b7R?LCSc=&?gEra@F`DU!-R>sZY*I>_OfPF7G#i@0;IE$VfsK52r_@c|C_IO32*B)Nj zghy*s&{^4R^b1wJjas{5W?~(}*)J=_@lE<1MTffyPBBYlF{ITVqF&(*|>Aqv)qmm}t=_`x(MWxnP4DR!tLtpT-J}NhM^u*+?R-?}6 z^0J=L)ihu*bH4r|#!&z^eI6@|;T>jNNQ*Q(wm?xCD3Dsy29(I6nfSv#3exNL0|dhJ@D{ zsVrA%(DxRTcuz%@H|`P4$|!RRkL0t_%O(d_<06|uV8IxKzP=Q-i)#4|O~@N<4EW+{ z+A@SjqPeNTm1y@jO`LXnZT>oE6^5(Z)gqWIm5CPYu~GK$@Z_jUENY2YOB1_U+$YD{ z26OD$b8WMMJz?~Jzis%uQxZM@>%?OXWrwBAT9GyE|6xNl1Y8xArqK+xnp%(V!e$G( zwKgjo6Z*1nL*oCq_1GMBwM)vtUpwTTHc2O&^E+-#XP2RtkL#&1_blYT0TPw3>4vq9 z6@Wabie)ugJm@8qg$qP<+p%1mW<%gnDV8n$%4h0+tEf4oAJbJshw1u;t*MqTwjF6Z z^2N)4CVy(j=K?SOaCzYY*orJd>X+Z$_3*^WpU~|)SFaDtCx+<$G5MZ9!Y82oPaKf8 zr^K(Zr@1PN;Wg|z1S}AO=WQTaM$y!4-8?!5Q^E`(kGu!i2$&T72}u$p0v>XpT%lp& zpRM^)elatcYKKFfZL;Y|7Khn`4VYz;Vh5on;8M-t4DsT&1syx=W{(x?t?jep?Y^3{ zwp`G;9X0jtgNIxzB08$qR#gXmZHc*Nt3|YVZ0+$HpUo>;%Zx^qN-c;Ez1wMYYMf>_ z5-8ObJ30s2bQ+UgYw<|+&9@(Js`q=WT6?u<>|1?wL5D4nc?fHJjSp2cSd%)tC)u%n zZiiIaUZv8Rd}1&trmH(VQsu1By7r{kp=-9q+>au-Yg}P4lvi4UqNB_ps>}4{1_KNs zy+>PZv}?-r=0v@#ec|1!`)U^l%_^!lNuf}{Y@jOh5{Tx>Sln+Ro44Z)ch@=?)p4GiBWaBlX4e@9z)}o3FTj`*b8*ACwQ$`dikB`uWF02M&d@CBE ze?GVmkBmyxKeWNBD~tFmT@Zm9Rk^9$psU7XUR-vwUgv9;f~v}`={YT0Dq{Vx$zD+v zNY3x*@mE*aO?sUNOt~^tosG>f>&mUx%?~aY*yFG85UifP`ws5hIQ)sApwsFHbt=(N zZqggdy>@&Fo*hF?@wQl?q9(yhZ_^BmUA4(aF)a6pEv>HKFnX0QjhMhYN-l}SoT0qcM1-(kCQQs1( ziy4f9I~g^=s>Y+iR2nr^>&ws=YC~&4uXh@C;-D$+tbu| zkIFcr`>Ck<4;3}Pr!8~0igvrs(CV6DtIutcDvZVvqv*Z2=DG!)*LV59;y)#IEiBZC z$1b?rd$@o0@9isGi-yK5=B9?4%6v}ptE#);knPU-Pi-0$C>`81w8*uhJ>RfC(bes( z8K1Szvb48<_3G6dms-}%nzDo0`j`r^dW1A7TiD_bnFNGmn9qy_nme$tC>)BiBwd!y z!BQPU2oKQxH{KQ>7>&)Yub&;0q$r5y=;8#;eKt>P;$t@Wv6$~_JU1p>abx^IVu04q zUOuNjpIMk)93RiyN8{`S`c7J2&$42sd=STwcc{-5zPlPh29jR##7)sA?7Ph~V|~t5sEUZ&fS3RlbHkCconK(w@o;^MVvp>oeqyln;hOwGzatDqFex#5` zs>YWJ)AMPB#ftlPFI&VaBqyFjVhFRSln^9Jf*;}dWd1D6E@5k-2%a4RM=FOB_n+LS zZEWch(lYo)OekACLXQ2gTb=jSUf2g|aQQCwp9|RCupk#afx<3i%c-L9(W|HJi_`X} z9ghj{?4nS^h2deOk{o6AmDuvjcc#`%o%*kb@~m9qG3G9XxhOxQw33uB@C8}$c`7~Y zM-MA2wD8aYJn)YD;EstGWBg!PF>|4TsXDWuC^nW9sKq1G;7fyGjb`vp2SW@oONj0y zgoLtT;vLLee5}mp_7AR!)%wM{I?-PnTQlfyFqcuY&rSEzy>7Ea=`4d^9+h9Vxb%9L zr6S*(uUNjkB8QE&+(p&GSA7{*AY`*vtLo}h)mB?55YPE??Ql08p?h7G>70K~3^$-N zEz$Z!ENZFndf5%|YH>spE_CPA9QqRSErOU61Pe_RwtqoFuL(v0ONY)d7Y}lw#ra*a z+RmPD{$#W@C!IP}fB4DAuj^CIyZOl{ZpB)Lul)SYPsCry>3*}|tFJ5?Tw~ZXd=&XL zbJtZh?0Vpt`?g0yTjy18y4E>#Z{mgDkGsy7;Zx#0n4QQcfoC&{smQ(xuT~^1BCA9h z5h-g_(8I%-#~Qc-kcYeT1GYAT&$h zjco%4gST8m%WZmxw_N{V%W6qizJ0sX?4%mq0v6w5uGGgLmk&Mu_!Amr23j08zei`) zi1ML_(yFVe$zEwOIOWeFXn#Jg!d6pvl5S-k6=neQi?Bve7Vj~42|OhDLlIfdH;W}B zI~)SRi4>8jMw`}Pr2~TE8IWrPV=kInQm*)ZbY z<9gxNP_k}ub=<#v^)mlIuvjIZho|X!sS6GJtm|m)7qNHHHM^|Z%5s6cmZ~!Ot7Gyf z%MM*%{!mRhEvxV){GpKl7(yCT`hodx@jNu!qm7lcx+?Y=`o+rF-y18x@C1DtQ`$>^?sCe_^1J?*7n&^#a+U=P z%>sRKvQMAEx;*B)X=eYIgIWHpzm%y6?b{&cU}Z4ogc-?3w&E4QbM&xMFdcHE`-O`B z11$?B$?2HYy=K*>EvtIAv}t223!m)w<#*L~TCHAhZ`Whb%vrobw|%hnx;nO0MSQw! zMrPrTZ5LgE?|HVG zWy;6;EMn}9h;bl=1JQYuEKga9O>E>fu%fc^q8bQ!uthU&Wf2B4QNv8oSz&C`cUBL~ zZ)g%a4WZDS{?|9G@1H+UU!KVx-?Cxls*ZTW?T_BOt2~L5jBVbqWZ6b4)W?^^dlu;OS3UShVHTx7S`vSEMdIQ-+-dSW zEcxfSk4CYFg|S2^f*v84q}rCqrAavfiMdENY%KfBGaY-G*K zfhAitm|?V@6!Rku3Tyx{Z$+T(7gD*d|S*?oJJ%CG=(%0F8!7wltL03Zj z0COU&4X|#BRMl&#UsHoe0y%E78l|HS zhoC99czft;*=nP!+~FuIub(OBa#oYQ{G5*3iGIR-2!noMre(uyR-hpu8!~xO4WE7p z^ASWR3%S9Dp0Xel>ECXwMf*^8Nh^JI4q9HT(Q3;qv4)tXOj|D2(sFmbZ{dC1=BP$#x6CU$xwOa7ROr2w8%~KWfdLR9?blLyK z+nd0*Rh{X>IrnPc7i+U*ZMG!alDx^byd+ZM?6I@&2{G{^CypK4c*zE)Ktk9C!qNhT zP?j!0C}pS9#!O*o3$z8g^Dm*(b~;nqX-nH_hZZ-!{hs$+$##IwbUMG^=S8}@y34uu zp7Wk}dEVz;sa9DG9-qnVHkeH-#{#$~@|-$=IdwJFBq0S7PYU{St%}rXEIB;MykKq42NM!z2qyfNG5^B#tNet%$6pwvn`LEI=v6vBB9we+{%9U#=4P z;o%!qIaFMD;BE+X7CJFItSW&&O)H9`#smTymC9zZ8VqU;R%msV=@P66dEh%_Dvdc1 zFl$sy@O!K_)Uqu}SL)ukpHap4gA5$AbJjeBUgCN(<+LZ~F<1gA7$Y;u4$4)WQHY^4L60 z{QyU$Ga?D@6uETqwaTT&Q3M715P0y=aE_g|}Gzl;uFj@)b+^ znwgSq(H0>9>n{t{p^T2uclt?3mS4d@y1XBETUsFhan4LJrOQ24LN242i0xY5Eor zA{SgySRvk;%Ww=}Cg;|gH}!6^XiN6LIO(2r3n{!zzPP_cYuT9FXwlA`c2rjyPaBlb zU$0*)wXbE@XD0g{H5JCwdNQ;CKbX$ew6xS@5#Kl5Q&)EnmB#W5{tyscCKkIjOT1o;nO?&P>YZSn6GH(m^PaYY7Apa}>RSO&bI47lp#R+xr&n zbxr6sJ2Y0csyAE{4wP3h7PHl7S4TVAKZGrko5q6I(ZtG~N#ULxlzG~=7r9Ac|yBkUF%r+FVtI$v$Fyz-# z*VrKZAW+J@F0-{aTwNL{Peu`PUL9S#WJx5(k`G<4*Ys-i?Cbsw@m_a@PW4w>(R&vf zsn6H?=KYoKC85`dTs*~Xcd|c03j#y5lX;NWoF$|g=r5&R3HBN38N`&yh?G9w1oB4o?$|3dz-%;J&~NZKgkT(1Lz4x1SmJ8rYZ! z_KaXpEB=wwHAh|{yhF&}X^hbIdlo++_L+Fc=wP9D)UT&i2)Ll z2UAJkfCd2D6V7f((o*XE^sSnpzydM%rX1X1D~}>_%5xkm_YD%}6@5|2mm0vJIpv8b zU2wi|ayblG{=QgH=oA{4(Qk5U#FU6AHC%;)LR4lan`3aGg3bYe0<+$3(u&Fy=*Z#T zR=}AknDv5^CRKP6g_K@tDstL2MzxaZMR9x4+3Rgem?dYk%qlA3$J4vDDwWQq#g{4t zYQ+M-Bj~g$<*IPv1yNzK>$EPdQl$f*r9spPN+t*jwN@jtazRvK?gkyR5+}2p)jGu1 zRYtwuW+vTn4u?$sBs^E(!DpXq7A}(4cs}i8GaD~_t_Ax|=FO9RB@3u8P{v&0AA+%z zXX-u9`SUpIA=JoZHVd#7OfG_4A-9A2iH2S<9_JsgkV}J!gH%<@{Ut~n8KniXMS7pd zRtvThAWA;)k2A_Nib(jC7xH@ZONf<_Pp^?@T@YghEbyq@K@b`tIRtw&4Xj+0It_Xg z6fN~EAO~G5&%GclT*%f-Pb_q=D{rkv5Ttc6&<$IUKd?34{_9^J*>Fe83jfk&t*h%U zdaJx^N24mav2$yqs(gdHr9P-Au5C_*M7MZUVwW%8lLI8WfcqI=6nuqVUwVV0RA=Lbs6X+=u}Y1_9n00Jbq3 z@OH~l2C>h4;NGY2Jz&n7vx_de`1==Mv?yy9Qaes<+<0oofo)rBYHMq@ZaW~~AK`c6 z4e(Ed;Fn9&(IC9IR$@=tc?OCr4Qt4$)|28QxS%@WeqjEdy+6XIOLx}^%SM-C4)}8T z%jH7s2TEn#76>f=efJ?6U%O?eGgYFG*Olll_bpo#RRo&bS|UoHxVSXNmX0o4wNSc* zom#l6Zg(|+8^EhKCZy-s(nMq3w)&H1zF$1mR-`OxUbZkIl%(5QXXO;(H7QSF0gYh_ zLSit>xZa2is4oGR1R+t9Sx#F4y#Sume5x4#ny$*k1 zL1TyWedrACk#7O9t1ZIW+5R){3pR&822YJ>J89q$e_$3JvEwzKy)@iSW(g;Z& zfnr$-@ZF8acPob5FA>F@KXt2N&AD^WK0ABe zZg_V&tCBqeA9#eUcS=5TA%+3nIvr73m6M`aSt%XY)~#GwZ_`~_{C$CyHB@P&w}h|F zGzv?;ADVeP)Kl6}WUF6U778EzhFasT(D;gPonl{mC2!-o#42zy0#_D+qeF#L0BTX- zmM7nbDux#XySM?@=yau1YVbN?E|S@L(L>-{O*_-B2xS?h8#x?HxGCOU*D|=dTp`x( zy?lAcqQzxVw|jHlGQkG8MmiCRCjBXmvAIsKa|Rj$m+srJc+oN@2HSR4@7ZLK{@7fW zHu<*(ie27+15ig%zUg4|@+-OIEEsVAJFpyi)-6eiSs3i4rJXE!@cJE+$ z?7Gd>JC}wOig@xD?JZ45JkB-w`}uSD81wT7sZE7sIPvG_-E;rK;}~D)+xdHA56L#85bhv5n=6b4O|0%91@Uqno+L8(cinSTXsO1SwXSnZZEL8aB0 zD&5uYsC$P_YqL})E5jfmUiw+R&TUp%DiW1en^w2e6?F?=J$W*@e6f$&?PZaovgYDC zPr5ChPAB4JA%Ci>x;_vt>s}_kqc?=3Hg~cr6`D=XyvegQm5jlpi z-GD0wXCl%EI6@HfQbWi^$_-#-yadCJ4D&dyz19JwreS7MIF9ThIo)Y8I1OYQdqy)^ zHL0CG+ZoLB?r@z{2d`5E$5&F{R02j2u`8_+NDF$k%dn^roK6IC3JGp@+*~6ala5uJ z*zsk^pLiJPe756o@~*oQz0!3(iM#Gj>|>XSXQtgVFBDHt7YkYU^vqX&$o}ixlTZCn zGW-jw@Wk&Cf^5*<1df_+eg^Qj|5 zILdX>!<;tm^d!+|vS-f!9s=_Z$oq|hO_&&k*NE36{?rZ@Ip8;7;N~&^L87*s&iA*^ zi1+ds9?T~@3_QdJ5FoG<$RD~8JdfxGghNfcIzRWj#>U@$F7Vs0e8qYCw6HgM@L+Oq zFhPI9>f67o3AKKB!L>u)QQQ z0PKaYS3QUAop-W1oG;MCUzJh5*~Rl=zM1^l2O4ygsDi0l+c*j48*Ss+2JQLp&bC4B zOJ{_q@Ej>~3ejA6T=HC6t|%sD)SYmWH4uxyAyyiK)7OFC6{-WILtLZ}fou8C`itH@{snb7_#z7-Ui7l4^$O^S3OQjfa%W2+(;3B+* zET8|o$`e#~Vl(3Yy9qOgXN@yn_)i8AA}^(6d{G9RtF)n2aFnLxMf#X>G^A*&REXBi zoBC-tS&av14)PI!ler%xgz%gY$_;^40K!842bVLt5sbk+Q6}E=x<0NPDWRB9&gOq< zJ&s3Nr1>9y2yRBc2GtIB3>+oIq&|u26u2dY`12g+Wj?EQzP_Tw1rSP?hBgwxW-X9O z91!*?Kd@v#@R;YS;+?Es`G=}y@Vpdm+sYS4E#pnV`SblyT!b6|;%wf7(SQjaK~-*j zKwBhDk|S0Cpn$R?S4EIfGU!ZmMZxPBGxN2J#HP^bzJgDH9 zjIK}r(HldKO7xH3XcW;U;c9Pb>mtUKO0z8h^be3g0h^gH(~DY5y&VJBtY01QdIPK1 zUo#+$YK)P}&4CuTU9DE&N3FKkWjDnms5@h8-q<|*m%lf^%*)ycaMV1j2^4%G?w=u= z3k0=*zd*bQHV7GE6xpCy2N6n=>vl?bEb9+RFRzeZhvcQsa&387@J3B~+ii*40;^Zn zI}FKCnI{A!ADq(-0B1VN;n$I#F(FZ9X2*)G0Gk*2yVnUtmilbgdu#He4y~tgYUW>o*knz?8;bvy?mUc2@YU ztPBt}_arvJAG20vm|B@rsxv9?ETW>qcMCTAsAq_2=^TJVYdJRdU*aUITq zDVrux$VLtt=I>;By5{*Y#3W?hDTqHVA0VvYT0(BDEZqz5NJYz@|1P9lg0ku8=lpgt zF$t9#O7%RMl0=Ur4np7xxCW_=kOoO)3R#R)Sa{Y5QgYP|LNVJ{;g+tHu5?9NpJ6)u z{i)WOCuy)Cj^A{7R!r_Kk#_m}`~B=QC3~|OV^f`78r{bBZQd+>d>iWv-*35>&MVuJ zHv?B3hEI1n&KhfA4OOB#3SAwgBQc?J%p+MdA}Z@~yg7Qb+73y@A*S_kz3^BRxeuW2 z-?&P8jhVcqwpinryxyN0tz~6aBdf0vRj6p=bEqV+i|CAMy(P0mp)%-I%74}Am>D@L zp@2zi`Yltvs9<&L?BQYxhD5({*0O^*y{~t7Kas|*3l#{v zHo-~~(tAe|Eco{jfv_co-Ov5KEFgvcC_DiwH6aoQD<<{gF0Ru}*o}Ohcy(xZ|KUE?`P>i)Vm|)(B!2GG7`-<)= z@*zE_SE&&P2_&ilH?wl@r?Eo%*&{{p#FP|0^14#3 zR=z&_{0Cs;`Ut;(EKkIwkcbSoJ`tHhz|up4C{EKeLT(x!68&1a-wk>#0Prqxz#3iR ze9BmnS{MkvlF7Uh473(E7C+@&91H4n7M(%*i`p14d+@N`9<$$s3Mz03TMTeytO@x` zszO#u=s~fNmXZ)#hF)*AA+x}!*D0kn3ccRwjXLZalaa=v9AEwg;#FyiL%?530-xGQ zknd_h=rTe&gwFxw38TgM4PiQkDF=O@ToGx&Z5l8qeMlJ-@_>TiA1!j(O(n&mx3b8l z#c8E)E0BI=cf^XRNvzps00w8;Y6&-^x!-lvq}(+tjB2%UMU6YZXsR&LJz4B}%IL5b z=`5Iz0%h!NAKJW6LRqFU1=a*i%iVr;5wn*^8E1@SFFlyKWJXxzgujdqa ze<))5cQgMe;kmY>OzYo8`*Wfe1dwmnW?%UGIe&!K;;H(x#cZJ@U77EHh?oK81;4%> zMlrgRmHny)452gU*g0{ac*a)D4%bU(grm}nbI&T z!Lh9AC-uv}zPM$xQe+C{CU(c|%Qw`-8e)OY)RXY0879$$dx9v? zd@Jaj?6WYysD74+)i^!J_sD-ScQ5hWXutQ_ucWA>97-t#`H8c4zWs{IR#0#Vl6oPF z9NLIXU9xI9PFRj-kRQs1ULlt187xmCsj#QKD00>y{Ocu|@zo1gKlw_aYUSdI-TogV zK7Cl~Vhz&oGp>iFe`fzEz2(a0#~Ri7bRe2RR<4}+1VtLZvoktamFH;MdBlWc-|dhN z04oVt5=I>E<6lj*_+smy$bu|K=Y0$ zn5|m9L0cAgnLWsURT!*VtKaA~6#K0e0aLNTYYIjy%cYk<4cpg-zDFP(pa^xIrTd)g#4-+Z;;)swV2PBOLgg4xF ztRf63%otdFMJhW`pBSAkT0;yhYP%YU%b2|iW;7f+NCiP50zOo$03%VSTo~SGS$%C1 zbX3jB+WIyYFHa&JBakSsWdA}-!DK8RuS(W7H1Lhy6YU!98_hM+XKI_@DAGIJWb1Wl z4GNV-YqaTXN^9ffmZqoE!VSwVuT3<6?Ea56Cu%NV*0e8{EZMkiqdyVb_m>5Uzy^77 zWFLDzS#$Zdm)G!3-wOLQDyhUXIOt(N1%;HU|>UMW2w@q4F7Q6IAUmTUK6k zV3DFecjBh2_9WF=-R8R=JzkNyxe36hNPXEo#jZpsToy{Wz4tJDrvE9pT_!WY`QwMj zc>g;u)B?uqTOh?3J~v+90#bw^LiA6bCyD`+iyf3ZDXI}njwN#a5}+}iUq;kxAnfJLzx1-|?^53n z&oKxH2ssA-E*`&pEZHP-u1N+=HbR%O0|WLwBw`-38($Bs84otNE%^lrKf(u zZVrbZJSjcdw)ExvPaEEsF1_J~)netT>h0d@hH7t{P}RP@y-L9D=N}9Sj&OM9mtpp8 z9A)O0p{4BGFaJVX-?nsV+fw1~r7tgiiM8cr?*#Os5chr)dMia!4;(n8ej?ofQw(q^ zBml{OiUwb_VJKcUaQF7z8`sx2`bvD6CEIPQ`m0?#uI^ZRY-hQ7Sy~Npp^VsGcH+TD zuI;ESU$y$_ZCkR7eXZ^TH{O198L)s?o*0X^AZa0g{vn)SX5$4t8xJ4gj>!=O@;nKn zi|(W7{C$h=3*3Ky;64e-`{KZh-A!FxP2Df%-=)`yi&U0PzYuSRT}=4}^~A$V4}yE@ zLJ;6URB>uyay4N%$U}qj&*j)SKu;97P`hH}$BQ+I>q7q0^S@`yLqX~Mi_%@8knq`+ zM^>yjawEO0XxP=zuu)xf-^|{I=OG3g8A?av- zAM7YKHS8Rqo$zveC-%#Qbd$+>PfbCF2-(2^A^p5delp+F0knw2h?DI#{0$ zr>ay%^EN#4wen(?)rZxvp;OqdA-`o~gR3sx0C;6R9FGmr(l8w$GS5RVFI$E0nQDst zZkIk10X=}*WOQjXOscxNBAY6^?KXq8wc;was=U=`HtL?Y-(p5|I%+m}W7P?1&wS7Mb-Y}hxTGWztEh9?-|b&+LJ8O+ zx4~qQrmwEZbe5&S(P}ev;+&5TbSOo2rM*O@srUGqztv!NF;vPGXQqnr(NnKc`HL!5 z+Kw>jI8f-AIjn1SNh9;slrUqprXg8g3l=LG9YM4p2pHf4Kpgmy^S;RTu%I8;funQ- zRZ+B~ORDh*2t-XV#h5aM*gQQSJOxaoRswPqbSJe5h>oZz-+#)7cF--xBvzMp%ti$v zr(U_~`uJj-@#2f4X|{|_Fl#81h?YiCbOJ6go5rlr=@k~OrKr(e)v#nmYq{O&^OuGF z#U7N6&c{J0ZYW4M-Vo3B8jFzF9qVm7U6QS@NtYd$zOmckD$%G-sQawZ`XqyiEp1r1 zlIb(n$l@|8(i|!9B zaYHF;Tf90gy$g4V;+5z(QouiW7=xEtgARMq%;!RBqb8%!Shd<9YPM<=muDz7hj^J`KDD1c+X>(b z@&_{+s0&R{7p}{I{F@;dN&QNeFT`mUCBIQ&ifZ7~6lp7{JUy@_L=N*>94B=N{({Bf$D z2DWbmxhOUWpL)>lV_CT69l|E;U}e&G632FbDt-jQ>qnQzKfCp^#1qs`ITkf24&#}% zK!*Wdg-WIZ2~VK{pqinELz*D(PhJJL2@G&9&ZCI7%OQw}TsgFgalQfi-~f)EG;xd! zaiFbxt+}yAt9kTMjgD0{7*=+!G&EFs-DhT(ANF`zMg7dFJQwpe=#9`QKQZg<6W*y^ zrCGFhlfF%BR_xlLu;|(h>-J=`d)67+yh+23O@?)ynM~(8!=|la(GH&KM6v0-DqMGXdT6vH|qYmJybkB@H z>Eu7`Pk1bc*{RFpPs}{iVVkmv*YC+lhI4qDOq}h1V*Y6s*&RXa%!}-sX5JH7FmWXN z5p)2lr4s~r^1Mv_E`qD8Lf>16>k1)t9z##gAyLt=t=~eetp^vMMR&{;WLu zAEsNKA3G%TD365KgyiEKrYJ-cuW=x@>7+)` z*gX|^5`_lgpm~e}*1?gJOp;#W?wJpqr;MH`9BUt_F^J9wM+DstZtHz$%|SSWPLoB( zT`xE*uRe&gQuRTU?KLcBhsf5OdoFZ+4xl9h7%O#P%9VX5fP_F2xN3n0N|Ud4?C!gzw>Ru8 zmhLXjc6@r(_tvjH*3ql`#C=CESvdvI7W+}KBhGg&JSXC^^TXd)58DDbbeRhkDW@V~ zWC1LWg6Iu892n(ZFs7xuQ&zOAjfH#j*!<*KbK<8yMGxbldHw{F2=>Jt=gMCBxV zNX;)sW)W1Wajh=#Z@40vR#m#gZNsCI4zXgt(>cp47%Cy2!N&joie!pac>O<*oDioD z1cMJ)-MGk^cmJmgl5J_Kv8F_CD@CNOw4n}Js}4C1LFC>%&X3RJufj*j0;qDZmM2H| z=T65H*}CdSN5((0W%bI6c$ToPQ}|L?pH0M1=k||XF+TEWb=`C}Ua@lZ77m9k#4gFd zC|93aU`OB$Tz`NeA(skRKGYJ)vU`*4-fudkF4yZQ%5l@q?|JcI?*E40a@GS5G&%CTOM&4UF8IRlO`cBd%kE2v4;Osm z4-3bn7t2m3_e-B;TlT?8C*K#U)kXev%Am-5)KRpK43^K;)+r_p{UGOwVH$gTQ0pFi`{`rnt@GfBNb!sO&^7Gvp@j)(uqcYD0$FHH@43tVz z)hVl9^zEI3^sv^YI$OC% z<0c`BLyR3%HxjFZllKI&GoQnj8B_}H#CIr& zvIqD$xoYqR zN{?5u4K1f`Io4rIbf0YRXv;=ou}HS<<4cg6hdjF_;?IY^@Jfetypmm36)xU#`K>n% zEt)wMjn3QT<89d}hG?N5J%zq0V*^WYkHLpQx)fO_c#>dnhvGtZNr++|)|3)`46!&G zQ)*;=@gJe}{E2mkbXJ#<9X2>^xM$>3@)3FG1_+K zwMpTz^WQ~zXKpLa^=ZP_Rv~h|bwMZk80IrsA4h+JI|(Je`9qJA-w1JPszwXfh?7vT zaE!#{Qcq#k-?$kCq%g8zQO8jv2~a)OY&Et9T12rW&}y<|EXLMgt0>~dXj$it`Ft@i zTZ@&2EzH@u4}~p!fMQAqP&WhW?&GH?XI@>V(uW(vR=N(oa`|$lo&=H=tMsa6r|oo1 zuk^8HDqV;+l2;dY$!}ETrE|~Ik=1+*rjY}>8TSY_7~vH0SV+$*{NpU}ALhT~^z{6( z&3<1>EJhI0Fj;8GUig0+f(WGb=g7{*FGy{&xJ7)O6wj}qZ`k+b6xAT#3@eaC?F*=@ruTCw%fN4rnm7XDiJwo~16i=X_=XIy(1o@xwl4mX}! zxYu>zN9mu-;;|*MCB3`K{hMq~e?_n^S!5P2eg9GT0j0Y>{2=*bzURh~QtOLqF7Eo6 zp#r>`I(IeZ2`$|K@nOvIRM(1fj4ApX13I*tB&`*IT0BZv5(O3@*~bkAdW_Qu>Lww) z1+X6`I*i(LfILpV?D4$pksjl3Z}R&Le<^$CC6DJN&uRV`!~yB$aHb@P7FJ=@xw;K~R!H8i+OW0`D4nce2DPeV1g zSeiPvcGgHAXTI8S>3Za~L?g-d%j&!^rh~z@X0zEBsH+Kh{h7rl7m)0AD0q^97 zlI)soJ?Yj(F9#I{5C|G=T9r+!w>S)n;LD3z)4khPXG?^CJX7DZJzBoZ?{T?2{$*=- z^wgh0rlu*PRhyJ*lg?%@2CU^jK{Hxe+16_OWMMA<9G;O2GcIX44Jb@RdX5zpcpLB# zXc3x^2w8=2y(6EZAv}=@z?_4GZz_K)ka^DWQ})cCr>9?FjnX%Ga)xl8Wo`^$Bwgkk z^k)J$W|8CXTR)TCEG*eF^Ck9~jGULjy9j@o-v);~jAz>ro7V<1W*{gb8~#cg*d5X< ztO19=J0YC!%8bo5;*#vm7c^oZ+Z+FQ@@}Z3d420?@hR>vjl<7JvofD{0f^%|dOBa1 znqawvaRoq*NF}*jC^EZ5*jI#c<#;b+UBCLyadZDy4~^~{IH6Y8)t}t_$}=OzT@U5D zckI4IrHUuMDu)<-m@5H&lv0AVa41wISKEGj9YZ4zxT#;N2 zIL6e}UAo#AAS2ICPRpf^ny?oEFwcUu?02gZANfcEE-A>xzewUB2IiNrs zh8k`z+=yx`<)OmCgEdwP3v)y?C6Xf;oDuRVk8tLNqqENe5n|b8Cl0XcbvsuE&8?M| zg{70>C7viJ-d(>euJN}f)aC+VolcU3A$>TO%+m;xEb(EJ`e@xm;_xWOkEw}T1A#y7;#2vp900lCGvgU|&;mBt^o!Frs574iYtZc(AB3$E%l z+ZuhP!m?72T7k@~I`TDy3O%Fh%OU zc2O@XRK}8UwSS>E?lY^k;9=CMJUX+<9JM)uN}Z!b6&3`C!XvfI5O8rR^T#&%j&!&~ zF1?y*BE=EA(GwE1B_UOEdDLKILbSa*wYo*?Hx&icfWa6Q>L7vv&8rti9SBe*BQ?bi zU8IrC+*wyrQ>=5B34vsr*rY~)OXVuo=nyhlp$>#s>_Pg1sIsgq4XPB*wf2etf^J%~ zH{r55+)B4jr3Qz*4&cy`GurOeRy0;uCL`>KT=10|ih);sM{lq67_;`F=(4Vl+0OrhSvPE`-z21^-$?I#w5sZ(N2-n-sS>)_ zYU%Uem7aXeOCHC`$E(0w|CyYXU`pU?gCzl&OPs(??1zZhr)hyHoO)s zws5qS7j3jh=+A`+JTToMc5`np+a$fyC%r4Z+lMsWXV9>ZR6 zd-?G~_y`gDOe@+10s42sB4BTP^6!B|2$xL%A5ahldyVD=;&LDqQPUydif@P)()w%`vZXyN$p+2KOYv|xV|U*h*_mcf_!J^p6?dEN<`Ntx;8 zd=`_nMAYBn$|7e2n`TJ)eCrV(=OpFi3hjDN2Ql0CX>^XiIu35y*c@r z&53aYPgT#APx4_$=JKfcS=gDYAwPF7=tVUA5c&jWF3?$L?LAdKzAhW zF1#c3NfK`krAP2knXzeZk}II1W|a=in3Qe<_JKcazyH#uOb7*bgi0@J69Zwr%Uu&a z)YsFpkns731q20|s5gdPuCS+VWt&IuH){v@=Qbq?Ejzxk9m)H`xD3UTYUFnokoBRA{PBB*P#N9p!g!YXGzf1+IB?FJA!n_I zfENa)oJTY$s_}=Jjj(_VAX4<*N%-Pmsv$xmZ&UCW&^R!_=R|eX!dwf6^$G4u8G8d2 ziNX@0w1}fe2z0|ENTeY>i*P$Y8?Z5OY?)4h!qDt>54jQG38EwzIYK`LbZTB9q6t0g zi6GApUlsb0+y<)iDz^c=vE*-rl15P$1hODxVrsb|R$kPa);RD_;scJDPs=G<)vtS6}_Ucui@~_YX)-tA4x73zmXcp!5OiH22&FaJ)R4 zmNKt#OO>ezG@eL65$1N}^(SC!@EroB zX(!g8Q}H8U7X-3Zu_!{1S(MXAJCOkoYlk0$%cfKvkZ|DBk3yKi3T7_`%YrR-r$Z3z zc3Y#rxV9*hQP)_DEPkC^5WG5ktw+VbVpKs3pi*gZS)JagF|DnMno&lj+!+mMwXL96 zvn2dNu_0h}T8u_-V6mVn308w=!XL4h8hnrvW)p~%d|o|Bw-;A=1i@L!7TFo|6(fN@ zu*l~MYndK_wv z@7tc*BCGBB@}R*4=DV2LB5F^A%*d@=RpewiYn3Z$vsi4F)d~yqrk0k5vhZURczno@ zF^343nOHE#aMKBLh-4ARaN?c8n@G5Js+R`y2#$S9)}163TzZ+1;E+G~0=hkVAT2>m z!IeSd5s)6xGo6LBm>WCPr~k^>u_}|y2vSzDgLBD|ml?UC@Yd1Dk^acQm?ix`j6{4A z-kF+el&)(ydlu|gGe3EVE&cc#Pd@p;j~-&1K2GP7``qI=mj=?%3OR(39InbqIooMh zObkV`aP?o{jHV%g^iRm#Ai^1$lPgL39v&<$9k{9X(1A8}L(ka$CF7zC}s2iE43uju@Iaq%n4+# z%Ke_^9sZwp%{D-L#6J)FK)eW#(~Lu$XZWEP5OvIcqWbVCBS>(|*|GHm^m96L9A47p zdCWXS8q9m5HA7(zXhkmI;(5Fsl`=ujjdP(5JRmfmG6HCM2u5(sz?(;AE94=s21KdJ z1h0M?C8LULPET1KGU8kzlh$BzI1S9?JTE;JXKR@)bI(1Q)2F4o62rrZ;i2U4aB}EH zT|5=nX%+5hJn9zHDub>_qYxDebCFJ^R4dpIaDksR1_6YL8ccPi#c`eSQiauN1A-p~ zjK=tZr3@W5b6IjoJ|+&%Cfq)syC`1jaFoWq29-jgQK)o9W(AI|Df&DK06Et75b}Dw z&`c<%SDHz0Qpfg`x$VbYLa4DK;fy@kiKHY0F(fwKXlZIRIib>P{H z5~IV3nQvXRGci1hoL{3|ddO%)87(8*VK<_}jYXIS`=wr?bvtLtu z_|tCRk5risxP+wxv-)xB(0oKx8^e3~{sqq^v{*KC`qI>RrfOJdwdXwnm6pP?C5xK)ad_pve zynj<4r+)}(AnJHJl4O8%2VXwAc%B^rU^OZZ%F~|d85ZUb*>)zJGO;i7Olm~E0q@3t zjA87+LgLu~g?9>fkg9nahSy_YZ2UcuNI;83)B&$FuMj;%aHftsc3umf|5zdRAiv|> z1x^S#2aBrawt~ZS_uSP%EwcVkC|s8e<*k*Wy|Hi%-XHWk8Pxkh1a1luPg(6o`03w1 z6j%G{NJNI@V&KVm+_x_P)k2@mmyw{{DbzuI{;y$W7Xf2SVA~YiV=X{!4_=6prTFAr zERJSyJ2bi=>2!9ClMswWnyb|mia=C`?tVjP{)hS3gSxCVVd3dcVWvd}#aTS=v!qwc zUtkuel_+|Zf1f=!#xU91axEpAS<#iC1LKw8p|X-sbr_W(dTvNZQVe!S8fZzxh18RX zAj29LjWESe2fuE%OK+E)Hrtt}M0$76p0Zuv-L>n@H^Ci3iEQYZgbPK6+f~K)_$K#w zPnS$e|I)O%sXpD=D81FaeJ}2ZELZ+r9Kk%#Bi}L?J;pQL0T-P0b{ELKXta{~>=%KW zRkLk1TfhGFLB*Qtt7@*QUMp_D`P1L4-TK0Vy~>W-A?j2osy7DJQC~EKOdYx#7}vYO$>~Q&mGS;o9W8TE*qk&)JpC zok4jWLEXF~SN*nD9MDP^C#0zxLTzKqEtVCR#cmq101oW9`oEOg%Mty#>Pvz3af>;% zIi)Ik8&HsfjZU}2{|EN2Zh z(vQdD*YD?LND6xCe#m7xhA7voCT?O7o%6pe!_~#06;KEr|6nXuiva#0Y$TSZg)fzz zFufMh{isZLUs=+6kHP#Sy%k`#8(iV#XP1X3P7U2t#F5#TV(_ zZRY)vw&JqA#bweL8=D(CKEC13_0nImY(Yl4N_y?NY1StF`47CS@Rx!wKaY(n1X3c1 zMdRw{ix4S(?p*v!bJNB7?@*Zj!Ni-5|K64hxJkjH#E zf(aEa@NeI?Ie24u>utMgYS|ZhU+Jp;c1^eRr56Jfzm``4d<;N!x_`zRcjwD}&k9h7P6e-98g908v zn%`3)WGNzh18T8~1}j$s&;z+Ng#iiZN}AW0N5VmfZS}f57UROtIb&{7H|o7jnx0*|_2AGD;w5)#EJ)tp0}2e?TRNVuSI}z)aSenbCMcd6iVECx zq{x(p2pdj060Ffq42ASd_BKVU5u*yLu}Cm?WI_nH(Iprb&AWt|Z{rf`%C@nCA9@99 z>16&2!~uQ*%u$xK|A}8g**Pes+nh6NH0s)(o%{k=rF;R>Cvh3)bX*sg=Q7GOEkm4g z4YcLm3&wCAB&^9+=cc|3w;nD>1kdCvfQ%3t8sWSE+>mQ=jcI&Gh)`TISL`xi;>UED z0@WOip=xFpD2WNQrD>NFk#K}wfKR|NoiL&xYs9;2PPAWXsEAi@3zkJ}FaDE56ugFj z&F@-%Y(GtwSzI$R%#hNR5>=Y=i)@X zQek>3Qm+^b-6Aa8!(OlaXOG9;;IZhx5`Pgq1$vbR^h%=1aJ=K1S`&+e!#leY&wsTz zT;?`{f4^wSvEf~|$g&+ZiJ4Cz=A%@C3}(s1;0}XJH_g6S)>cd&&)9)fxZXPvKXl1e z$;x=YZ$i-!`TX}UUU8drapgn5tQW{2iet zmwVXWRQ@=HZHPYylgC9EhT959D;x(ExA?gj5N|9sdjxsoLVM1L8+dLgM!9UJp@+!6 zBk20%L5iWHREdiaq~j(SMiIIWe!;^5^c5UdR7p+Um=@32lf|$Q0yWjgR;+GcePd?T z^-Y!S9*fo*4EP($9nnO@p;sCVDr2~E%l`UCQSjBaty$(-)SxRbX{;5_d#mjRLt}sK z@|LFcMKB`DHL*l_*yR;Ottwd48bCc=53-JuNtYuYTIxfebm*ds>wJE%As7Td9|-Yf znM;0_Iqxe8+I(0+1QJD#DtN)U%NI#urp3gVNKHC^O))D%Y z+5rO)?EorC`TX;WARTw`n{B*JOTRT3n6aS&Q)LH(T&JLo{*lRy&)6hg=x;PmmT&Nqf6Jl!F3MiX9#oageb85sch z5p~v3wWu>NFcLtWfPo(m;FXHfWT&Q}DTCP|J3a7gted0_Cj-Bx?*k(Pd~@OE%=8p_ z$Iw3u^A_1scFwln0I5e1WT;ztHL-!x9VyoZtt6sH2(u8vs2HX6*f+15|@l6vhRHn3nQagVA~ge{<+23JMPFX ze)gXhXYRZ+13wuxispW5PXXVQf)^u;+{l%b>uX2jI6gXU$D7%-RvrE5jPaHoUXDjGVPa-Er?hpTM&9njd0w_kZ00DAJ&_~%Ic>myg$RkJ8WXz(Y zSFGH*b+LJgWz*=Tz0ELH5qd!z$da2(u5U0GFN!bR6}PMyTy#Ougc28JAEbOgt+17d zdG5nFLNRRtE+7*ps7vWnV?B`rpu!hla=wo_^p;dj5;az$iJBCLgMj z@FHRZCRa{G+Ll1 z8T2NP9mo!Y*%C4tTxO%+jPfAX@cM1*!@-R^)`kNc_`-V^=dKeubiBiNCEY?f(_kA}fp;884tm?m!6rBQHE4Isk>9 zb&4R)I_n?#!(1#AblU(XbY`Zq^aegZIN`W6Zst`)9$ub?3uH|odv-D#M9s_$-IKq} zh`)wjWM2^E2!8~2XLI>6t|*sZ#`(d~&`9;rAfX9E?GF)jI_RIC0_n9-)^zgd8tp;= z;M+CL&wZ@!%1tpi2m-JoQI&V*)zsed46xCcNSAZ0{LwXCNTk&=%I<%2DJY}wdSPWumP|GMp|)b`xA6w2Xfc6mW5 za38S>ct5Pc59Rl{c5EqPQK{{{*mYaqwmSBsoyFMkbjAyQfx^5y*M5#-|G<6x>uvv= z+xx$2BX8GV{+xfl)yNn7@OIVtQLvrpbI6K;R|^IZq)wwN=J=3yg%>wfSv*FgCYe-Yff@H1LTSjj1kYzO>7 zXW4e18S@TKg*-->3DmJ>J_kC6**S-7Kgye;yn+Qt?t-2UPY-3SaR1W}((F#}`B%M2 z?7CZcMS2mH4$sW6sw%jNyD=NXU7eQ|WY?&GI6&qL@OI?Pg3%5+$~8GIWJ%MbLO!#} zf%0~Dnhz5aNNk}Y-I!i7v7N`YR$E>mRxIRhBalTI+19IzfQ8D2C}V`gNOhq z{N&QhJfo1KBj@|SDRx_m*wSk72X3W)0#_6cjJ^OoFHUV{JeUry04kS573HDd;8qY> z7Qg;jZA~pK8A{Ww<-U$OB7KflrB1h9t7&f0+q4FEnMb8+RU52! zi$O(iR-Ibm4d@YjxOa0UfY2Xi^%z3T=^1Z&fJu!Vi&hjgH-YRpOav5|iwh zXfdhvDg`Pc32j=iQWt3jv)ddD;OUr5&IjC){bs$+u2m}qjm~J$2nx2^5pgk-T6?#2 zsnx6$o#k$?&*OFmi*!tDcIZQ94_F$kKIwUs6VO;zDlpf?QhslBxCk`~n^ZbD`80|m zqXjAO5+=Os0#_!VNuVu-Xa0!zB>aaJR6&wCQ5RlK{vQCTafk7M)I1)CCrA%O#rXiz zTnLam8!_D9Dk|bkpOD^NbjO_^S*6ZQ+_LYkjiD+bT+nsHTDS=^e+rRVF zYGMD<%j>0g6HK3q`a7>XeM?{5yXzY1ig>wDzQ1X0A)O1kT9Mc^<;}p}mHTF)olp?| zwswjbdH;*{Z6<20|4s8SKhVgrEcmMIeZeb5(zquE@?4Eyd6}e&DZi}1vLnB&T%d<{ zQQk&{^|Ac24z_evewpG>J8=h?LW?z~1%vrz0n5ko%OaMq%`Ypke0zRb3Ek;a`DLm$ z{>A*V4&K0*^UL}LQReR%?(Odx9@>=KH!;{Xn*Wr4+m;(0>mMEp)>hTz*R0G94 zbG^atqrtI5`|8HW`+|L=!v}*ahKI&;gM-7tk9beFg&wV)7Fi@C5aBb1?XzM}z4r9#-|Ly?R^k99}g8h82 z5paZ5rYpYoet7UbV z=j%b@gv@&)>740yN+GYZeahwZe%yH zQwZ_g!fs`^v5&HkA@TkWb|?EdyNlh;PP2R1C)m9}_ubDPV4q~4VxMN8VGpv0*u(4$ zdxU+KJ<2}E9%GNQC)kthDfTpb22_}zXaC5)z`n@NvMKf)`zQ7#_B?xm{WE)!eVKiQ zeU-h$UIzH^YwYXn8|+o~8hf36lYI*;X5V4oW#41pXK%3o$9}-xWarph?1$`M*pJwc z*-t=*1m*e}_y*ss|;>^JPU?04)x+3(pO*nhEi*&o@T*n4c6 z{h6I-GfZNC5f-2noj?Wh1W;}ZYC$7t1)ZQ541y8<5wlg;m08VU5r(bO>vOb;5dKgRoK9By1M82wR11 z!ggVYuv6G2>|UVm>ggGt7#c6?>KX4pgmItj9?f+Pj12b=jgN_4y}fFPjQ#zGa=Nb3 z(c#0%?&0zM`NiJh!$bMS!Cc?CUfy7|f8YLbi@ZE`unXl_XuAtm(AL)ZTkw5M^Vdv_ zXylI*BdTt+CpW6;hU~$y#uc=n=pG*I#mn%3hF%VKjSgtLNBeVqJzZltEDd+{Vrg8B zrNd*nQL%espQfj4FgMiOHEP7dV6uM*;;MgWpZsZfVtgMid7p{)Pmbk=#`w!(%yf{=>np zBmD>akIjAVAL5@)`R_+_W8=f4Ib%=%XwP6S+1EcfnCrFYKS7-DE37NJU>&Y!uzx6L z%CF3SG~_>y4R(#~=ZBo=AIBr@8tv8M=v||9rK+C6{*jTRSb=8BmrhG2e4gm#mph2N zYmh%qjL-)q|DeDOk~8!S4-R&X$b0JWVR$ro5bM>r+udl94etkYL*vQb{;{5kF`9hn zD_W)R8O`;gJw0fSq8BaH(hF~$rnhUns~eBT+?&IrM61S=ymM)1KgZ;yx!#+^oQK2V z1YLv4iJ?Qe(f+>vT(9rH+b;NlFX_bd_I7;e24x>u+cz#e?A9~D_eyfWUPP8kUKas zel&Twe+UvrnS<~hRp*ZM3{Ldsbh#rVT|>QmuwoHU9Bal&X5o43a!2zbrdPzGrZ1Q4 zr8}pG=zwtVAL<%Cs^!ZxTy=a2?dtE+@WqkdJ`-OUo9M>XObq6n^2ehGAy5V|Y)8>! zhDVQDFIY_<Ll-oM_675gW;c@u_*=(zmT;J7)z*iZ5U14|`;R_+@d?#}7<4JXHk zNhasi`$oIEyV2qBKC(Ya^MH~s;tNRA+^BWm=Hv+%qlyD#!$YQlTz6M@lCGd1bDubnJ1P!#9aazacaNesSO;m!?w%OL^-qis z_w^sq&aN@?hfcj~6k=3CpY$~S(M4k&Hl*dju5klj8Xm=i%=Mc1hq2rsx(fQFyw&(< zE+>C6ff2*E(+%Q*C&%{Vp{Z#e!33-s9Pa6&ofKFYP#x^rHzjDYsfClzsaBWbCv%{SzePi;#|_3ufLlM zmLY3`M@d=?nnn)LvdG$y_H8{}sYVt|8F#Yd2x_;gvn5aQZRp90?CgAA5A?vQJ_D50 zOL`0=@Xv9{q{fqK_$J6spM_9h2>Kf)9fJ(m`?@QHY;W2MKu-HjKKUTo$_)1#Oi~eC zh9N?OFNKMO(H_M(`s!6GErVIq_R`)=cS(g71f9+N6J+g0k-t6*9#Hr-=Axk~Wt`QC z+NAB+y~xy29lt70xedfBk%1D@#&o$h;>vfUgBSJVHmR+`WBv9neJh}Rs zxmw<}1|Rst#z6BXlVJ_low{S_lLpF_BX=!eg;rTXocptAP0coOo)SmkBym>n3fM#j zQ7CoFm!^HLe7y4)p5md-Q|gwRi|H1uC%j+($^YEj2 z^2+yzdC-cTf3fT``ls@1GT`hPnF^jC9qxT#8aYy6z$%hCTHaM8%Liic>)xkJZB=0?!0:typeof process!="undefined"?process.platform==="win32":!1},p}();I.Environment=t})(X||(X={}));var X;(function(I){var t=function(){function E(u,d,l){this.type=u,this.detail=d,this.timestamp=l}return E}();I.LoaderEvent=t;var p=function(){function E(u){this._events=[new t(1,"",u)]}return E.prototype.record=function(u,d){this._events.push(new t(u,d,I.Utilities.getHighPerformanceTimestamp()))},E.prototype.getEvents=function(){return this._events},E}();I.LoaderEventRecorder=p;var P=function(){function E(){}return E.prototype.record=function(u,d){},E.prototype.getEvents=function(){return[]},E.INSTANCE=new E,E}();I.NullLoaderEventRecorder=P})(X||(X={}));var X;(function(I){var t=function(){function p(){}return p.fileUriToFilePath=function(P,E){if(E=decodeURI(E).replace(/%23/g,"#"),P){if(/^file:\/\/\//.test(E))return E.substr(8);if(/^file:\/\//.test(E))return E.substr(5)}else if(/^file:\/\//.test(E))return E.substr(7);return E},p.startsWith=function(P,E){return P.length>=E.length&&P.substr(0,E.length)===E},p.endsWith=function(P,E){return P.length>=E.length&&P.substr(P.length-E.length)===E},p.containsQueryString=function(P){return/^[^\#]*\?/gi.test(P)},p.isAbsolutePath=function(P){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(P)},p.forEachProperty=function(P,E){if(P){var u=void 0;for(u in P)P.hasOwnProperty(u)&&E(u,P[u])}},p.isEmpty=function(P){var E=!0;return p.forEachProperty(P,function(){E=!1}),E},p.recursiveClone=function(P){if(!P||typeof P!="object"||P instanceof RegExp||!Array.isArray(P)&&Object.getPrototypeOf(P)!==Object.prototype)return P;var E=Array.isArray(P)?[]:{};return p.forEachProperty(P,function(u,d){d&&typeof d=="object"?E[u]=p.recursiveClone(d):E[u]=d}),E},p.generateAnonymousModule=function(){return"===anonymous"+p.NEXT_ANONYMOUS_ID+++"==="},p.isAnonymousModule=function(P){return p.startsWith(P,"===anonymous")},p.getHighPerformanceTimestamp=function(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=I.global.performance&&typeof I.global.performance.now=="function"),this.HAS_PERFORMANCE_NOW?I.global.performance.now():Date.now()},p.NEXT_ANONYMOUS_ID=1,p.PERFORMANCE_NOW_PROBED=!1,p.HAS_PERFORMANCE_NOW=!1,p}();I.Utilities=t})(X||(X={}));var X;(function(I){function t(E){if(E instanceof Error)return E;var u=new Error(E.message||String(E)||"Unknown Error");return E.stack&&(u.stack=E.stack),u}I.ensureError=t;var p=function(){function E(){}return E.validateConfigurationOptions=function(u){function d(s){if(s.phase==="loading"){console.error('Loading "'+s.moduleId+'" failed'),console.error(s),console.error("Here are the modules that depend on it:"),console.error(s.neededBy);return}if(s.phase==="factory"){console.error('The factory method of "'+s.moduleId+'" has thrown an exception'),console.error(s);return}}if(u=u||{},typeof u.baseUrl!="string"&&(u.baseUrl=""),typeof u.isBuild!="boolean"&&(u.isBuild=!1),typeof u.paths!="object"&&(u.paths={}),typeof u.config!="object"&&(u.config={}),typeof u.catchError=="undefined"&&(u.catchError=!1),typeof u.recordStats=="undefined"&&(u.recordStats=!1),typeof u.urlArgs!="string"&&(u.urlArgs=""),typeof u.onError!="function"&&(u.onError=d),Array.isArray(u.ignoreDuplicateModules)||(u.ignoreDuplicateModules=[]),u.baseUrl.length>0&&(I.Utilities.endsWith(u.baseUrl,"/")||(u.baseUrl+="/")),typeof u.cspNonce!="string"&&(u.cspNonce=""),typeof u.preferScriptTags=="undefined"&&(u.preferScriptTags=!1),Array.isArray(u.nodeModules)||(u.nodeModules=[]),u.nodeCachedData&&typeof u.nodeCachedData=="object"&&(typeof u.nodeCachedData.seed!="string"&&(u.nodeCachedData.seed="seed"),(typeof u.nodeCachedData.writeDelay!="number"||u.nodeCachedData.writeDelay<0)&&(u.nodeCachedData.writeDelay=1e3*7),!u.nodeCachedData.path||typeof u.nodeCachedData.path!="string")){var l=t(new Error("INVALID cached data configuration, 'path' MUST be set"));l.phase="configuration",u.onError(l),u.nodeCachedData=void 0}return u},E.mergeConfigurationOptions=function(u,d){u===void 0&&(u=null),d===void 0&&(d=null);var l=I.Utilities.recursiveClone(d||{});return I.Utilities.forEachProperty(u,function(s,h){s==="ignoreDuplicateModules"&&typeof l.ignoreDuplicateModules!="undefined"?l.ignoreDuplicateModules=l.ignoreDuplicateModules.concat(h):s==="paths"&&typeof l.paths!="undefined"?I.Utilities.forEachProperty(h,function(w,a){return l.paths[w]=a}):s==="config"&&typeof l.config!="undefined"?I.Utilities.forEachProperty(h,function(w,a){return l.config[w]=a}):l[s]=I.Utilities.recursiveClone(h)}),E.validateConfigurationOptions(l)},E}();I.ConfigurationOptionsUtil=p;var P=function(){function E(u,d){if(this._env=u,this.options=p.mergeConfigurationOptions(d),this._createIgnoreDuplicateModulesMap(),this._createNodeModulesMap(),this._createSortedPathsRules(),this.options.baseUrl===""){if(this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){var l=this.options.nodeRequire.main.filename,s=Math.max(l.lastIndexOf("/"),l.lastIndexOf("\\"));this.options.baseUrl=l.substring(0,s+1)}if(this.options.nodeMain&&this._env.isNode){var l=this.options.nodeMain,s=Math.max(l.lastIndexOf("/"),l.lastIndexOf("\\"));this.options.baseUrl=l.substring(0,s+1)}}}return E.prototype._createIgnoreDuplicateModulesMap=function(){this.ignoreDuplicateModulesMap={};for(var u=0;u=5)){if(_.length0?(C=_.slice(0,16),v=_.slice(16),w.record(60,h)):w.record(61,h),r()})}},l.prototype._verifyCachedData=function(s,h,w,a,S){var v=this;!a||s.cachedDataRejected||setTimeout(function(){var C=v._crypto.createHash("md5").update(h,"utf8").digest();a.equals(C)||(S.getConfig().onError(new Error("FAILED TO VERIFY CACHED DATA, deleting stale '"+w+"' now, but a RESTART IS REQUIRED")),v._fs.unlink(w,function(n){n&&S.getConfig().onError(n)}))},Math.ceil(5e3*(1+Math.random())))},l._BOM=65279,l._PREFIX="(function (require, define, __filename, __dirname) { ",l._SUFFIX=` +});`,l}();function u(l,s){if(s.__$__isRecorded)return s;var h=function(a){l.record(33,a);try{return s(a)}finally{l.record(34,a)}};return h.__$__isRecorded=!0,h}I.ensureRecordedNodeRequire=u;function d(l){return new t(l)}I.createScriptLoader=d})(X||(X={}));var X;(function(I){var t=function(){function l(s){var h=s.lastIndexOf("/");h!==-1?this.fromModulePath=s.substr(0,h+1):this.fromModulePath=""}return l._normalizeModuleId=function(s){var h=s,w;for(w=/\/\.\//;w.test(h);)h=h.replace(w,"/");for(h=h.replace(/^\.\//g,""),w=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;w.test(h);)h=h.replace(w,"/");return h=h.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,""),h},l.prototype.resolveModule=function(s){var h=s;return I.Utilities.isAbsolutePath(h)||(I.Utilities.startsWith(h,"./")||I.Utilities.startsWith(h,"../"))&&(h=l._normalizeModuleId(this.fromModulePath+h)),h},l.ROOT=new l(""),l}();I.ModuleIdResolver=t;var p=function(){function l(s,h,w,a,S,v){this.id=s,this.strId=h,this.dependencies=w,this._callback=a,this._errorback=S,this.moduleIdResolver=v,this.exports={},this.error=null,this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}return l._safeInvokeFunction=function(s,h){try{return{returnedValue:s.apply(I.global,h),producedError:null}}catch(w){return{returnedValue:null,producedError:w}}},l._invokeFactory=function(s,h,w,a){return s.isBuild()&&!I.Utilities.isAnonymousModule(h)?{returnedValue:null,producedError:null}:s.shouldCatchError()?this._safeInvokeFunction(w,a):{returnedValue:w.apply(I.global,a),producedError:null}},l.prototype.complete=function(s,h,w){this._isComplete=!0;var a=null;if(this._callback)if(typeof this._callback=="function"){s.record(21,this.strId);var S=l._invokeFactory(h,this.strId,this._callback,w);a=S.producedError,s.record(22,this.strId),!a&&typeof S.returnedValue!="undefined"&&(!this.exportsPassedIn||I.Utilities.isEmpty(this.exports))&&(this.exports=S.returnedValue)}else this.exports=this._callback;if(a){var v=I.ensureError(a);v.phase="factory",v.moduleId=this.strId,this.error=v,h.onError(v)}this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null},l.prototype.onDependencyError=function(s){return this._isComplete=!0,this.error=s,this._errorback?(this._errorback(s),!0):!1},l.prototype.isComplete=function(){return this._isComplete},l}();I.Module=p;var P=function(){function l(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}return l.prototype.getMaxModuleId=function(){return this._nextId},l.prototype.getModuleId=function(s){var h=this._strModuleIdToIntModuleId.get(s);return typeof h=="undefined"&&(h=this._nextId++,this._strModuleIdToIntModuleId.set(s,h),this._intModuleIdToStrModuleId[h]=s),h},l.prototype.getStrModuleId=function(s){return this._intModuleIdToStrModuleId[s]},l}(),E=function(){function l(s){this.id=s}return l.EXPORTS=new l(0),l.MODULE=new l(1),l.REQUIRE=new l(2),l}();I.RegularDependency=E;var u=function(){function l(s,h,w){this.id=s,this.pluginId=h,this.pluginParam=w}return l}();I.PluginDependency=u;var d=function(){function l(s,h,w,a,S){S===void 0&&(S=0),this._env=s,this._scriptLoader=h,this._loaderAvailableTimestamp=S,this._defineFunc=w,this._requireFunc=a,this._moduleIdProvider=new P,this._config=new I.Configuration(this._env),this._hasDependencyCycle=!1,this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[]}return l.prototype.reset=function(){return new l(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)},l.prototype.getGlobalAMDDefineFunc=function(){return this._defineFunc},l.prototype.getGlobalAMDRequireFunc=function(){return this._requireFunc},l._findRelevantLocationInStack=function(s,h){for(var w=function(i){return i.replace(/\\/g,"/")},a=w(s),S=h.split(/\n/),v=0;v=0){var a=h.resolveModule(s.substr(0,w)),S=h.resolveModule(s.substr(w+1)),v=this._moduleIdProvider.getModuleId(a+"!"+S),C=this._moduleIdProvider.getModuleId(a);return new u(v,C,S)}return new E(this._moduleIdProvider.getModuleId(h.resolveModule(s)))},l.prototype._normalizeDependencies=function(s,h){for(var w=[],a=0,S=0,v=s.length;S0;){var r=n.shift(),m=this._modules2[r];m&&(C=m.onDependencyError(w)||C);var _=this._inverseDependencies2[r];if(_)for(var S=0,v=_.length;S0;){var n=C.shift(),r=n.dependencies;if(r)for(var S=0,v=r.length;S=a.length)h._onLoadError(s,n);else{var r=a[v],m=h.getRecorder();if(h._config.isBuild()&&r==="empty:"){h._buildInfoPath[s]=r,h.defineModule(h._moduleIdProvider.getStrModuleId(s),[],null,null,null),h._onLoad(s);return}m.record(10,r),h._scriptLoader.load(h,r,function(){h._config.isBuild()&&(h._buildInfoPath[s]=r),m.record(11,r),h._onLoad(s)},function(_){m.record(12,r),C(_)})}};C(null)}},l.prototype._loadPluginDependency=function(s,h){var w=this;if(!(this._modules2[h.id]||this._knownModules2[h.id])){this._knownModules2[h.id]=!0;var a=function(S){w.defineModule(w._moduleIdProvider.getStrModuleId(h.id),[],S,null,null)};a.error=function(S){w._config.onError(w._createLoadError(h.id,S))},s.load(h.pluginParam,this._createRequire(t.ROOT),a,this._config.getOptionsLiteral())}},l.prototype._resolve=function(s){var h=this,w=s.dependencies;if(w)for(var a=0,S=w.length;a +`)),s.unresolvedDependenciesCount--;continue}if(this._inverseDependencies2[v.id]=this._inverseDependencies2[v.id]||[],this._inverseDependencies2[v.id].push(s.id),v instanceof u){var r=this._modules2[v.pluginId];if(r&&r.isComplete()){this._loadPluginDependency(r.exports,v);continue}var m=this._inversePluginDependencies2.get(v.pluginId);m||(m=[],this._inversePluginDependencies2.set(v.pluginId,m)),m.push(v),this._loadModule(v.pluginId);continue}this._loadModule(v.id)}s.unresolvedDependenciesCount===0&&this._onModuleComplete(s)},l.prototype._onModuleComplete=function(s){var h=this,w=this.getRecorder();if(!s.isComplete()){var a=s.dependencies,S=[];if(a)for(var v=0,C=a.length;vA===M){if(c===g)return!0;if(!c||!g||c.length!==g.length)return!1;for(let A=0,M=c.length;A0)M=R-1;else return R}return-(A+1)}t.binarySearch=u;function d(c,g){let L=0,A=c.length;if(A===0)return 0;for(;L=g.length)throw new TypeError("invalid index");let A=g[Math.floor(g.length*Math.random())],M=[],R=[],D=[];for(let T of g){const $=L(T,A);$<0?M.push(T):$>0?R.push(T):D.push(T)}return cA?c[$]=R[T++]:T>M?c[$]=R[D++]:g(R[T],R[D])<0?c[$]=R[T++]:c[$]=R[D++]}function w(c,g,L,A,M){if(!(A<=L)){const R=L+(A-L)/2|0;w(c,g,L,R,M),w(c,g,R+1,A,M),!(g(c[R],c[R+1])<=0)&&h(c,g,L,R,A,M)}}function a(c,g){const L=[];let A;for(const M of s(c.slice(0),g))!A||g(A[0],M)!==0?(A=[M],L.push(A)):A.push(M);return L}t.groupBy=a;function S(c){return c.filter(g=>!!g)}t.coalesce=S;function v(c){return!Array.isArray(c)||c.length===0}t.isFalsyOrEmpty=v;function C(c){return Array.isArray(c)&&c.length>0}t.isNonEmptyArray=C;function n(c,g){if(!g)return c.filter((A,M)=>c.indexOf(A)===M);const L=Object.create(null);return c.filter(A=>{const M=g(A);return L[M]?!1:(L[M]=!0,!0)})}t.distinct=n;function r(c){const g=new Set;return c.filter(L=>g.has(L)?!1:(g.add(L),!0))}t.distinctES6=r;function m(c,g){return c.length>0?c[0]:g}t.firstOrDefault=m;function _(c){return[].concat(...c)}t.flatten=_;function o(c,g){let L=typeof g=="number"?c:0;typeof g=="number"?L=c:(L=0,g=c);const A=[];if(L<=g)for(let M=L;Mg;M--)A.push(M);return A}t.range=o;function i(c,g,L){const A=c.slice(0,g),M=c.slice(g);return A.concat(L,M)}t.arrayInsert=i;function f(c,g){const L=c.indexOf(g);L>-1&&(c.splice(L,1),c.unshift(g))}t.pushToStart=f;function b(c,g){const L=c.indexOf(g);L>-1&&(c.splice(L,1),c.push(g))}t.pushToEnd=b;function N(c){return Array.isArray(c)?c:[c]}t.asArray=N}),V(z[15],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DiffChange=void 0;class p{constructor(E,u,d,l){this.originalStart=E,this.originalLength=u,this.modifiedStart=d,this.modifiedLength=l}getOriginalEnd(){return this.originalStart+this.originalLength}getModifiedEnd(){return this.modifiedStart+this.modifiedLength}}t.DiffChange=p}),V(z[4],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.illegalState=t.illegalArgument=t.canceled=t.isPromiseCanceledError=t.transformErrorForSerialization=t.onUnexpectedExternalError=t.onUnexpectedError=t.errorHandler=t.ErrorHandler=void 0;class p{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(S){setTimeout(()=>{throw S.stack?new Error(S.message+` + +`+S.stack):S},0)}}emit(S){this.listeners.forEach(v=>{v(S)})}onUnexpectedError(S){this.unexpectedErrorHandler(S),this.emit(S)}onUnexpectedExternalError(S){this.unexpectedErrorHandler(S)}}t.ErrorHandler=p,t.errorHandler=new p;function P(a){l(a)||t.errorHandler.onUnexpectedError(a)}t.onUnexpectedError=P;function E(a){l(a)||t.errorHandler.onUnexpectedExternalError(a)}t.onUnexpectedExternalError=E;function u(a){if(a instanceof Error){let{name:S,message:v}=a;const C=a.stacktrace||a.stack;return{$isError:!0,name:S,message:v,stack:C}}return a}t.transformErrorForSerialization=u;const d="Canceled";function l(a){return a instanceof Error&&a.name===d&&a.message===d}t.isPromiseCanceledError=l;function s(){const a=new Error(d);return a.name=a.message,a}t.canceled=s;function h(a){return a?new Error(`Illegal argument: ${a}`):new Error("Illegal argument")}t.illegalArgument=h;function w(a){return a?new Error(`Illegal state: ${a}`):new Error("Illegal state")}t.illegalState=w}),V(z[16],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Iterable=void 0;var p;(function(P){function E(f){return f&&typeof f=="object"&&typeof f[Symbol.iterator]=="function"}P.is=E;const u=Object.freeze([]);function d(){return u}P.empty=d;function*l(f){yield f}P.single=l;function s(f){return f||u}P.from=s;function h(f){return!f||f[Symbol.iterator]().next().done===!0}P.isEmpty=h;function w(f){return f[Symbol.iterator]().next().value}P.first=w;function a(f,b){for(const N of f)if(b(N))return!0;return!1}P.some=a;function S(f,b){for(const N of f)if(b(N))return N}P.find=S;function*v(f,b){for(const N of f)b(N)&&(yield N)}P.filter=v;function*C(f,b){for(const N of f)yield b(N)}P.map=C;function*n(...f){for(const b of f)for(const N of b)yield N}P.concat=n;function*r(f){for(const b of f)for(const N of b)yield N}P.concatNested=r;function m(f,b,N){let c=N;for(const g of f)c=b(c,g);return c}P.reduce=m;function*_(f,b,N=f.length){for(b<0&&(b+=f.length),N<0?N+=f.length:N>f.length&&(N=f.length);bc===g){const c=f[Symbol.iterator](),g=b[Symbol.iterator]();for(;;){const L=c.next(),A=g.next();if(L.done!==A.done)return!1;if(L.done)return!0;if(!N(L.value,A.value))return!1}}P.equals=i})(p=t.Iterable||(t.Iterable={}))}),V(z[17],G([0,1,4]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ResolvedKeybinding=t.ResolvedKeybindingPart=t.ChordKeybinding=t.SimpleKeybinding=t.createSimpleKeybinding=t.createKeybinding=t.KeyChord=t.KeyCodeUtils=void 0;class P{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(r,m){this._keyCodeToStr[r]=m,this._strToKeyCode[m.toLowerCase()]=r}keyCodeToStr(r){return this._keyCodeToStr[r]}strToKeyCode(r){return this._strToKeyCode[r.toLowerCase()]||0}}const E=new P,u=new P,d=new P;(function(){function n(r,m,_=m,o=_){E.define(r,m),u.define(r,_),d.define(r,o)}n(0,"unknown"),n(1,"Backspace"),n(2,"Tab"),n(3,"Enter"),n(4,"Shift"),n(5,"Ctrl"),n(6,"Alt"),n(7,"PauseBreak"),n(8,"CapsLock"),n(9,"Escape"),n(10,"Space"),n(11,"PageUp"),n(12,"PageDown"),n(13,"End"),n(14,"Home"),n(15,"LeftArrow","Left"),n(16,"UpArrow","Up"),n(17,"RightArrow","Right"),n(18,"DownArrow","Down"),n(19,"Insert"),n(20,"Delete"),n(21,"0"),n(22,"1"),n(23,"2"),n(24,"3"),n(25,"4"),n(26,"5"),n(27,"6"),n(28,"7"),n(29,"8"),n(30,"9"),n(31,"A"),n(32,"B"),n(33,"C"),n(34,"D"),n(35,"E"),n(36,"F"),n(37,"G"),n(38,"H"),n(39,"I"),n(40,"J"),n(41,"K"),n(42,"L"),n(43,"M"),n(44,"N"),n(45,"O"),n(46,"P"),n(47,"Q"),n(48,"R"),n(49,"S"),n(50,"T"),n(51,"U"),n(52,"V"),n(53,"W"),n(54,"X"),n(55,"Y"),n(56,"Z"),n(57,"Meta"),n(58,"ContextMenu"),n(59,"F1"),n(60,"F2"),n(61,"F3"),n(62,"F4"),n(63,"F5"),n(64,"F6"),n(65,"F7"),n(66,"F8"),n(67,"F9"),n(68,"F10"),n(69,"F11"),n(70,"F12"),n(71,"F13"),n(72,"F14"),n(73,"F15"),n(74,"F16"),n(75,"F17"),n(76,"F18"),n(77,"F19"),n(78,"NumLock"),n(79,"ScrollLock"),n(80,";",";","OEM_1"),n(81,"=","=","OEM_PLUS"),n(82,",",",","OEM_COMMA"),n(83,"-","-","OEM_MINUS"),n(84,".",".","OEM_PERIOD"),n(85,"/","/","OEM_2"),n(86,"`","`","OEM_3"),n(110,"ABNT_C1"),n(111,"ABNT_C2"),n(87,"[","[","OEM_4"),n(88,"\\","\\","OEM_5"),n(89,"]","]","OEM_6"),n(90,"'","'","OEM_7"),n(91,"OEM_8"),n(92,"OEM_102"),n(93,"NumPad0"),n(94,"NumPad1"),n(95,"NumPad2"),n(96,"NumPad3"),n(97,"NumPad4"),n(98,"NumPad5"),n(99,"NumPad6"),n(100,"NumPad7"),n(101,"NumPad8"),n(102,"NumPad9"),n(103,"NumPad_Multiply"),n(104,"NumPad_Add"),n(105,"NumPad_Separator"),n(106,"NumPad_Subtract"),n(107,"NumPad_Decimal"),n(108,"NumPad_Divide")})();var l;(function(n){function r(f){return E.keyCodeToStr(f)}n.toString=r;function m(f){return E.strToKeyCode(f)}n.fromString=m;function _(f){return u.keyCodeToStr(f)}n.toUserSettingsUS=_;function o(f){return d.keyCodeToStr(f)}n.toUserSettingsGeneral=o;function i(f){return u.strToKeyCode(f)||d.strToKeyCode(f)}n.fromUserSettings=i})(l=t.KeyCodeUtils||(t.KeyCodeUtils={}));function s(n,r){const m=(r&65535)<<16>>>0;return(n|m)>>>0}t.KeyChord=s;function h(n,r){if(n===0)return null;const m=(n&65535)>>>0,_=(n&4294901760)>>>16;return _!==0?new S([w(m,r),w(_,r)]):new S([w(m,r)])}t.createKeybinding=h;function w(n,r){const m=!!(n&2048),_=!!(n&256),o=r===2?_:m,i=!!(n&1024),f=!!(n&512),b=r===2?m:_,N=n&255;return new a(o,i,f,b,N)}t.createSimpleKeybinding=w;class a{constructor(r,m,_,o,i){this.ctrlKey=r,this.shiftKey=m,this.altKey=_,this.metaKey=o,this.keyCode=i}equals(r){return this.ctrlKey===r.ctrlKey&&this.shiftKey===r.shiftKey&&this.altKey===r.altKey&&this.metaKey===r.metaKey&&this.keyCode===r.keyCode}isModifierKey(){return this.keyCode===0||this.keyCode===5||this.keyCode===57||this.keyCode===6||this.keyCode===4}toChord(){return new S([this])}isDuplicateModifierCase(){return this.ctrlKey&&this.keyCode===5||this.shiftKey&&this.keyCode===4||this.altKey&&this.keyCode===6||this.metaKey&&this.keyCode===57}}t.SimpleKeybinding=a;class S{constructor(r){if(r.length===0)throw p.illegalArgument("parts");this.parts=r}}t.ChordKeybinding=S;class v{constructor(r,m,_,o,i,f){this.ctrlKey=r,this.shiftKey=m,this.altKey=_,this.metaKey=o,this.keyLabel=i,this.keyAriaLabel=f}}t.ResolvedKeybindingPart=v;class C{}t.ResolvedKeybinding=C}),V(z[7],G([0,1,16]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ImmortalReference=t.MutableDisposable=t.Disposable=t.DisposableStore=t.toDisposable=t.combinedDisposable=t.dispose=t.isDisposable=t.MultiDisposeError=t.trackDisposable=void 0;const P=!1;let E=null;if(P){const r="__is_disposable_tracked__";E=new class{trackDisposable(m){const _=new Error("Potentially leaked disposable").stack;setTimeout(()=>{m[r]||console.log(_)},3e3)}markTracked(m){if(m&&m!==v.None)try{m[r]=!0}catch(_){}}}}function u(r){!E||E.markTracked(r)}function d(r){return E&&E.trackDisposable(r),r}t.trackDisposable=d;class l extends Error{constructor(m){super(`Encountered errors while disposing of store. Errors: [${m.join(", ")}]`);this.errors=m}}t.MultiDisposeError=l;function s(r){return typeof r.dispose=="function"&&r.dispose.length===0}t.isDisposable=s;function h(r){if(p.Iterable.is(r)){let m=[];for(const _ of r)if(_){u(_);try{_.dispose()}catch(o){m.push(o)}}if(m.length===1)throw m[0];if(m.length>1)throw new l(m);return Array.isArray(r)?[]:r}else if(r)return u(r),r.dispose(),r}t.dispose=h;function w(...r){return r.forEach(u),a(()=>h(r))}t.combinedDisposable=w;function a(r){const m=d({dispose:()=>{u(m),r()}});return m}t.toDisposable=a;class S{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(u(this),this._isDisposed=!0,this.clear())}clear(){try{h(this._toDispose.values())}finally{this._toDispose.clear()}}add(m){if(!m)return m;if(m===this)throw new Error("Cannot register a disposable on itself!");return u(m),this._isDisposed?S.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(m),m}}t.DisposableStore=S,S.DISABLE_DISPOSED_WARNING=!1;class v{constructor(){this._store=new S,d(this)}dispose(){u(this),this._store.dispose()}_register(m){if(m===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(m)}}t.Disposable=v,v.None=Object.freeze({dispose(){}});class C{constructor(){this._isDisposed=!1,d(this)}get value(){return this._isDisposed?void 0:this._value}set value(m){var _;this._isDisposed||m===this._value||((_=this._value)===null||_===void 0||_.dispose(),m&&u(m),this._value=m)}clear(){this.value=void 0}dispose(){var m;this._isDisposed=!0,u(this),(m=this._value)===null||m===void 0||m.dispose(),this._value=void 0}}t.MutableDisposable=C;class n{constructor(m){this.object=m}dispose(){}}t.ImmortalReference=n}),V(z[18],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LinkedList=void 0;class p{constructor(u){this.element=u,this.next=p.Undefined,this.prev=p.Undefined}}p.Undefined=new p(void 0);class P{constructor(){this._first=p.Undefined,this._last=p.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===p.Undefined}clear(){this._first=p.Undefined,this._last=p.Undefined,this._size=0}unshift(u){return this._insert(u,!1)}push(u){return this._insert(u,!0)}_insert(u,d){const l=new p(u);if(this._first===p.Undefined)this._first=l,this._last=l;else if(d){const h=this._last;this._last=l,l.prev=h,h.next=l}else{const h=this._first;this._first=l,l.next=h,h.prev=l}this._size+=1;let s=!1;return()=>{s||(s=!0,this._remove(l))}}shift(){if(this._first!==p.Undefined){const u=this._first.element;return this._remove(this._first),u}}pop(){if(this._last!==p.Undefined){const u=this._last.element;return this._remove(this._last),u}}_remove(u){if(u.prev!==p.Undefined&&u.next!==p.Undefined){const d=u.prev;d.next=u.next,u.next.prev=d}else u.prev===p.Undefined&&u.next===p.Undefined?(this._first=p.Undefined,this._last=p.Undefined):u.next===p.Undefined?(this._last=this._last.prev,this._last.next=p.Undefined):u.prev===p.Undefined&&(this._first=this._first.next,this._first.prev=p.Undefined);this._size-=1}*[Symbol.iterator](){let u=this._first;for(;u!==p.Undefined;)yield u.element,u=u.next}}t.LinkedList=P}),V(z[2],G([0,1]),function(I,t){"use strict";var p;Object.defineProperty(t,"__esModule",{value:!0}),t.isLittleEndian=t.OS=t.setImmediate=t.globals=t.userAgent=t.isIOS=t.isWeb=t.isNative=t.isLinux=t.isMacintosh=t.isWindows=t.isPreferringBrowserCodeLoad=t.browserCodeLoadingCacheStrategy=t.isElectronSandboxed=void 0;const P="en";let E=!1,u=!1,d=!1,l=!1,s=!1,h=!1,w=!1,a,S=P,v,C;const n=typeof self=="object"?self:typeof global=="object"?global:{};let r;typeof process!="undefined"?r=process:typeof n.vscode!="undefined"&&(r=n.vscode.process);const m=typeof((p=r==null?void 0:r.versions)===null||p===void 0?void 0:p.electron)=="string"&&r.type==="renderer";if(t.isElectronSandboxed=m&&(r==null?void 0:r.sandboxed),t.browserCodeLoadingCacheStrategy=(()=>{if(t.isElectronSandboxed)return"bypassHeatCheck";const b=r==null?void 0:r.env.ENABLE_VSCODE_BROWSER_CODE_LOADING;if(typeof b=="string")return b==="none"||b==="code"||b==="bypassHeatCheck"||b==="bypassHeatCheckAndEagerCompile"?b:"bypassHeatCheck"})(),t.isPreferringBrowserCodeLoad=typeof t.browserCodeLoadingCacheStrategy=="string",typeof navigator=="object"&&!m)C=navigator.userAgent,E=C.indexOf("Windows")>=0,u=C.indexOf("Macintosh")>=0,w=(C.indexOf("Macintosh")>=0||C.indexOf("iPad")>=0||C.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,d=C.indexOf("Linux")>=0,h=!0,a=navigator.language,S=a;else if(typeof r=="object"){E=r.platform==="win32",u=r.platform==="darwin",d=r.platform==="linux",l=d&&!!r.env.SNAP&&!!r.env.SNAP_REVISION,a=P,S=P;const b=r.env.VSCODE_NLS_CONFIG;if(b)try{const N=JSON.parse(b),c=N.availableLanguages["*"];a=N.locale,S=c||P,v=N._translationsConfigFile}catch(N){}s=!0}else console.error("Unable to resolve platform.");let _=0;u?_=1:E?_=3:d&&(_=2),t.isWindows=E,t.isMacintosh=u,t.isLinux=d,t.isNative=s,t.isWeb=h,t.isIOS=w,t.userAgent=C,t.globals=n,t.setImmediate=function(){if(t.globals.setImmediate)return t.globals.setImmediate.bind(t.globals);if(typeof t.globals.postMessage=="function"&&!t.globals.importScripts){let c=[];t.globals.addEventListener("message",L=>{if(L.data&&L.data.vscodeSetImmediateId)for(let A=0,M=c.length;A{const A=++g;c.push({id:A,callback:L}),t.globals.postMessage({vscodeSetImmediateId:A},"*")}}if(r&&typeof r.nextTick=="function")return r.nextTick.bind(r);const N=Promise.resolve();return c=>N.then(c)}(),t.OS=u||w?2:E?1:3;let o=!0,i=!1;function f(){if(!i){i=!0;const b=new Uint8Array(2);b[0]=1,b[1]=2,o=new Uint16Array(b.buffer)[0]===(2<<8)+1}return o}t.isLittleEndian=f}),V(z[19],G([0,1,2]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.platform=t.env=t.cwd=void 0;let P;typeof process!="undefined"?P=process:typeof p.globals.vscode!="undefined"?P={get platform(){return p.globals.vscode.process.platform},get env(){return p.globals.vscode.process.env},nextTick(E){return p.setImmediate(E)},cwd(){return p.globals.vscode.process.env.VSCODE_CWD||p.globals.vscode.process.execPath.substr(0,p.globals.vscode.process.execPath.lastIndexOf(p.globals.vscode.process.platform==="win32"?"\\":"/"))}}:P={get platform(){return p.isWindows?"win32":p.isMacintosh?"darwin":"linux"},nextTick(E){return p.setImmediate(E)},get env(){return Object.create(null)},cwd(){return"/"}},t.cwd=P.cwd,t.env=P.env,t.platform=P.platform}),V(z[20],G([0,1,19]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.sep=t.extname=t.basename=t.dirname=t.relative=t.resolve=t.normalize=t.posix=t.win32=void 0;const P=65,E=97,u=90,d=122,l=46,s=47,h=92,w=58,a=63;class S extends Error{constructor(i,f,b){let N;typeof f=="string"&&f.indexOf("not ")===0?(N="must not be",f=f.replace(/^not /,"")):N="must be";const c=i.indexOf(".")!==-1?"property":"argument";let g=`The "${i}" ${c} ${N} of type ${f}`;g+=`. Received type ${typeof b}`,super(g),this.code="ERR_INVALID_ARG_TYPE"}}function v(o,i){if(typeof o!="string")throw new S(i,"string",o)}function C(o){return o===s||o===h}function n(o){return o===s}function r(o){return o>=P&&o<=u||o>=E&&o<=d}function m(o,i,f,b){let N="",c=0,g=-1,L=0,A=0;for(let M=0;M<=o.length;++M){if(M2){const R=N.lastIndexOf(f);R===-1?(N="",c=0):(N=N.slice(0,R),c=N.length-1-N.lastIndexOf(f)),g=M,L=0;continue}else if(N.length!==0){N="",c=0,g=M,L=0;continue}}i&&(N+=N.length>0?`${f}..`:"..",c=2)}else N.length>0?N+=`${f}${o.slice(g+1,M)}`:N=o.slice(g+1,M),c=M-g-1;g=M,L=0}else A===l&&L!==-1?++L:L=-1}return N}function _(o,i){if(i===null||typeof i!="object")throw new S("pathObject","Object",i);const f=i.dir||i.root,b=i.base||`${i.name||""}${i.ext||""}`;return f?f===i.root?`${f}${b}`:`${f}${o}${b}`:b}t.win32={resolve(...o){let i="",f="",b=!1;for(let N=o.length-1;N>=-1;N--){let c;if(N>=0){if(c=o[N],v(c,"path"),c.length===0)continue}else i.length===0?c=p.cwd():(c=p.env[`=${i}`]||p.cwd(),(c===void 0||c.slice(0,2).toLowerCase()!==i.toLowerCase()&&c.charCodeAt(2)===h)&&(c=`${i}\\`));const g=c.length;let L=0,A="",M=!1;const R=c.charCodeAt(0);if(g===1)C(R)&&(L=1,M=!0);else if(C(R))if(M=!0,C(c.charCodeAt(1))){let D=2,T=D;for(;D2&&C(c.charCodeAt(2))&&(M=!0,L=3));if(A.length>0)if(i.length>0){if(A.toLowerCase()!==i.toLowerCase())continue}else i=A;if(b){if(i.length>0)break}else if(f=`${c.slice(L)}\\${f}`,b=M,M&&i.length>0)break}return f=m(f,!b,"\\",C),b?`${i}\\${f}`:`${i}${f}`||"."},normalize(o){v(o,"path");const i=o.length;if(i===0)return".";let f=0,b,N=!1;const c=o.charCodeAt(0);if(i===1)return n(c)?"\\":o;if(C(c))if(N=!0,C(o.charCodeAt(1))){let L=2,A=L;for(;L2&&C(o.charCodeAt(2))&&(N=!0,f=3));let g=f0&&C(o.charCodeAt(i-1))&&(g+="\\"),b===void 0?N?`\\${g}`:g:N?`${b}\\${g}`:`${b}${g}`},isAbsolute(o){v(o,"path");const i=o.length;if(i===0)return!1;const f=o.charCodeAt(0);return C(f)||i>2&&r(f)&&o.charCodeAt(1)===w&&C(o.charCodeAt(2))},join(...o){if(o.length===0)return".";let i,f;for(let c=0;c0&&(i===void 0?i=f=g:i+=`\\${g}`)}if(i===void 0)return".";let b=!0,N=0;if(typeof f=="string"&&C(f.charCodeAt(0))){++N;const c=f.length;c>1&&C(f.charCodeAt(1))&&(++N,c>2&&(C(f.charCodeAt(2))?++N:b=!1))}if(b){for(;N=2&&(i=`\\${i.slice(N)}`)}return t.win32.normalize(i)},relative(o,i){if(v(o,"from"),v(i,"to"),o===i)return"";const f=t.win32.resolve(o),b=t.win32.resolve(i);if(f===b||(o=f.toLowerCase(),i=b.toLowerCase(),o===i))return"";let N=0;for(;NN&&o.charCodeAt(c-1)===h;)c--;const g=c-N;let L=0;for(;LL&&i.charCodeAt(A-1)===h;)A--;const M=A-L,R=gR){if(i.charCodeAt(L+T)===h)return b.slice(L+T+1);if(T===2)return b.slice(L+T)}g>R&&(o.charCodeAt(N+T)===h?D=T:T===2&&(D=3)),D===-1&&(D=0)}let $="";for(T=N+D+1;T<=c;++T)(T===c||o.charCodeAt(T)===h)&&($+=$.length===0?"..":"\\..");return L+=D,$.length>0?`${$}${b.slice(L,A)}`:(b.charCodeAt(L)===h&&++L,b.slice(L,A))},toNamespacedPath(o){if(typeof o!="string")return o;if(o.length===0)return"";const i=t.win32.resolve(o);if(i.length<=2)return o;if(i.charCodeAt(0)===h){if(i.charCodeAt(1)===h){const f=i.charCodeAt(2);if(f!==a&&f!==l)return`\\\\?\\UNC\\${i.slice(2)}`}}else if(r(i.charCodeAt(0))&&i.charCodeAt(1)===w&&i.charCodeAt(2)===h)return`\\\\?\\${i}`;return o},dirname(o){v(o,"path");const i=o.length;if(i===0)return".";let f=-1,b=0;const N=o.charCodeAt(0);if(i===1)return C(N)?o:".";if(C(N)){if(f=b=1,C(o.charCodeAt(1))){let L=2,A=L;for(;L2&&C(o.charCodeAt(2))?3:2,b=f);let c=-1,g=!0;for(let L=i-1;L>=b;--L)if(C(o.charCodeAt(L))){if(!g){c=L;break}}else g=!1;if(c===-1){if(f===-1)return".";c=f}return o.slice(0,c)},basename(o,i){i!==void 0&&v(i,"ext"),v(o,"path");let f=0,b=-1,N=!0,c;if(o.length>=2&&r(o.charCodeAt(0))&&o.charCodeAt(1)===w&&(f=2),i!==void 0&&i.length>0&&i.length<=o.length){if(i===o)return"";let g=i.length-1,L=-1;for(c=o.length-1;c>=f;--c){const A=o.charCodeAt(c);if(C(A)){if(!N){f=c+1;break}}else L===-1&&(N=!1,L=c+1),g>=0&&(A===i.charCodeAt(g)?--g==-1&&(b=c):(g=-1,b=L))}return f===b?b=L:b===-1&&(b=o.length),o.slice(f,b)}for(c=o.length-1;c>=f;--c)if(C(o.charCodeAt(c))){if(!N){f=c+1;break}}else b===-1&&(N=!1,b=c+1);return b===-1?"":o.slice(f,b)},extname(o){v(o,"path");let i=0,f=-1,b=0,N=-1,c=!0,g=0;o.length>=2&&o.charCodeAt(1)===w&&r(o.charCodeAt(0))&&(i=b=2);for(let L=o.length-1;L>=i;--L){const A=o.charCodeAt(L);if(C(A)){if(!c){b=L+1;break}continue}N===-1&&(c=!1,N=L+1),A===l?f===-1?f=L:g!==1&&(g=1):f!==-1&&(g=-1)}return f===-1||N===-1||g===0||g===1&&f===N-1&&f===b+1?"":o.slice(f,N)},format:_.bind(null,"\\"),parse(o){v(o,"path");const i={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return i;const f=o.length;let b=0,N=o.charCodeAt(0);if(f===1)return C(N)?(i.root=i.dir=o,i):(i.base=i.name=o,i);if(C(N)){if(b=1,C(o.charCodeAt(1))){let D=2,T=D;for(;D0&&(i.root=o.slice(0,b));let c=-1,g=b,L=-1,A=!0,M=o.length-1,R=0;for(;M>=b;--M){if(N=o.charCodeAt(M),C(N)){if(!A){g=M+1;break}continue}L===-1&&(A=!1,L=M+1),N===l?c===-1?c=M:R!==1&&(R=1):c!==-1&&(R=-1)}return L!==-1&&(c===-1||R===0||R===1&&c===L-1&&c===g+1?i.base=i.name=o.slice(g,L):(i.name=o.slice(g,c),i.base=o.slice(g,L),i.ext=o.slice(c,L))),g>0&&g!==b?i.dir=o.slice(0,g-1):i.dir=i.root,i},sep:"\\",delimiter:";",win32:null,posix:null},t.posix={resolve(...o){let i="",f=!1;for(let b=o.length-1;b>=-1&&!f;b--){const N=b>=0?o[b]:p.cwd();v(N,"path"),N.length!==0&&(i=`${N}/${i}`,f=N.charCodeAt(0)===s)}return i=m(i,!f,"/",n),f?`/${i}`:i.length>0?i:"."},normalize(o){if(v(o,"path"),o.length===0)return".";const i=o.charCodeAt(0)===s,f=o.charCodeAt(o.length-1)===s;return o=m(o,!i,"/",n),o.length===0?i?"/":f?"./":".":(f&&(o+="/"),i?`/${o}`:o)},isAbsolute(o){return v(o,"path"),o.length>0&&o.charCodeAt(0)===s},join(...o){if(o.length===0)return".";let i;for(let f=0;f0&&(i===void 0?i=b:i+=`/${b}`)}return i===void 0?".":t.posix.normalize(i)},relative(o,i){if(v(o,"from"),v(i,"to"),o===i||(o=t.posix.resolve(o),i=t.posix.resolve(i),o===i))return"";const f=1,b=o.length,N=b-f,c=1,g=i.length-c,L=NL){if(i.charCodeAt(c+M)===s)return i.slice(c+M+1);if(M===0)return i.slice(c+M)}else N>L&&(o.charCodeAt(f+M)===s?A=M:M===0&&(A=0));let R="";for(M=f+A+1;M<=b;++M)(M===b||o.charCodeAt(M)===s)&&(R+=R.length===0?"..":"/..");return`${R}${i.slice(c+A)}`},toNamespacedPath(o){return o},dirname(o){if(v(o,"path"),o.length===0)return".";const i=o.charCodeAt(0)===s;let f=-1,b=!0;for(let N=o.length-1;N>=1;--N)if(o.charCodeAt(N)===s){if(!b){f=N;break}}else b=!1;return f===-1?i?"/":".":i&&f===1?"//":o.slice(0,f)},basename(o,i){i!==void 0&&v(i,"ext"),v(o,"path");let f=0,b=-1,N=!0,c;if(i!==void 0&&i.length>0&&i.length<=o.length){if(i===o)return"";let g=i.length-1,L=-1;for(c=o.length-1;c>=0;--c){const A=o.charCodeAt(c);if(A===s){if(!N){f=c+1;break}}else L===-1&&(N=!1,L=c+1),g>=0&&(A===i.charCodeAt(g)?--g==-1&&(b=c):(g=-1,b=L))}return f===b?b=L:b===-1&&(b=o.length),o.slice(f,b)}for(c=o.length-1;c>=0;--c)if(o.charCodeAt(c)===s){if(!N){f=c+1;break}}else b===-1&&(N=!1,b=c+1);return b===-1?"":o.slice(f,b)},extname(o){v(o,"path");let i=-1,f=0,b=-1,N=!0,c=0;for(let g=o.length-1;g>=0;--g){const L=o.charCodeAt(g);if(L===s){if(!N){f=g+1;break}continue}b===-1&&(N=!1,b=g+1),L===l?i===-1?i=g:c!==1&&(c=1):i!==-1&&(c=-1)}return i===-1||b===-1||c===0||c===1&&i===b-1&&i===f+1?"":o.slice(i,b)},format:_.bind(null,"/"),parse(o){v(o,"path");const i={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return i;const f=o.charCodeAt(0)===s;let b;f?(i.root="/",b=1):b=0;let N=-1,c=0,g=-1,L=!0,A=o.length-1,M=0;for(;A>=b;--A){const R=o.charCodeAt(A);if(R===s){if(!L){c=A+1;break}continue}g===-1&&(L=!1,g=A+1),R===l?N===-1?N=A:M!==1&&(M=1):N!==-1&&(M=-1)}if(g!==-1){const R=c===0&&f?1:c;N===-1||M===0||M===1&&N===g-1&&N===c+1?i.base=i.name=o.slice(R,g):(i.name=o.slice(R,N),i.base=o.slice(R,g),i.ext=o.slice(N,g))}return c>0?i.dir=o.slice(0,c-1):f&&(i.dir="/"),i},sep:"/",delimiter:":",win32:null,posix:null},t.posix.win32=t.win32.win32=t.win32,t.posix.posix=t.win32.posix=t.posix,t.normalize=p.platform==="win32"?t.win32.normalize:t.posix.normalize,t.resolve=p.platform==="win32"?t.win32.resolve:t.posix.resolve,t.relative=p.platform==="win32"?t.win32.relative:t.posix.relative,t.dirname=p.platform==="win32"?t.win32.dirname:t.posix.dirname,t.basename=p.platform==="win32"?t.win32.basename:t.posix.basename,t.extname=p.platform==="win32"?t.win32.extname:t.posix.extname,t.sep=p.platform==="win32"?t.win32.sep:t.posix.sep}),V(z[8],G([0,1,2]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StopWatch=void 0;const P=p.globals.performance&&typeof p.globals.performance.now=="function";class E{constructor(d){this._highResolution=P&&d,this._startTime=this._now(),this._stopTime=-1}static create(d=!0){return new E(d)}stop(){this._stopTime=this._now()}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}_now(){return this._highResolution?p.globals.performance.now():Date.now()}}t.StopWatch=E}),V(z[9],G([0,1,4,7,18,8]),function(I,t,p,P,E,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Relay=t.EventBufferer=t.PauseableEmitter=t.Emitter=t.Event=void 0;var d;(function(C){C.None=()=>P.Disposable.None;function n(k){return(F,O=null,e)=>{let H=!1,B;return B=k(Q=>{if(!H)return B?B.dispose():H=!0,F.call(O,Q)},null,e),H&&B.dispose(),B}}C.once=n;function r(k,F){return b((O,e=null,H)=>k(B=>O.call(e,F(B)),null,H))}C.map=r;function m(k,F){return b((O,e=null,H)=>k(B=>{F(B),O.call(e,B)},null,H))}C.forEach=m;function _(k,F){return b((O,e=null,H)=>k(B=>F(B)&&O.call(e,B),null,H))}C.filter=_;function o(k){return k}C.signal=o;function i(...k){return(F,O=null,e)=>P.combinedDisposable(...k.map(H=>H(B=>F.call(O,B),null,e)))}C.any=i;function f(k,F,O){let e=O;return r(k,H=>(e=F(e,H),e))}C.reduce=f;function b(k){let F;const O=new w({onFirstListenerAdd(){F=k(O.fire,O)},onLastListenerRemove(){F.dispose()}});return O.event}C.snapshot=b;function N(k,F,O=100,e=!1,H){let B,Q,Z,ie=0;const re=new w({leakWarningThreshold:H,onFirstListenerAdd(){B=k(se=>{ie++,Q=F(Q,se),e&&!Z&&(re.fire(Q),Q=void 0),clearTimeout(Z),Z=setTimeout(()=>{const le=Q;Q=void 0,Z=void 0,(!e||ie>1)&&re.fire(le),ie=0},O)})},onLastListenerRemove(){B.dispose()}});return re.event}C.debounce=N;function c(k){const F=new Date().getTime();return r(n(k),O=>new Date().getTime()-F)}C.stopwatch=c;function g(k){let F=!0,O;return _(k,e=>{const H=F||e!==O;return F=!1,O=e,H})}C.latch=g;function L(k,F=!1,O=[]){let e=O.slice(),H=k(Z=>{e?e.push(Z):Q.fire(Z)});const B=()=>{e&&e.forEach(Z=>Q.fire(Z)),e=null},Q=new w({onFirstListenerAdd(){H||(H=k(Z=>Q.fire(Z)))},onFirstListenerDidAdd(){e&&(F?setTimeout(B):B())},onLastListenerRemove(){H&&H.dispose(),H=null}});return Q.event}C.buffer=L;class A{constructor(F){this.event=F}map(F){return new A(r(this.event,F))}forEach(F){return new A(m(this.event,F))}filter(F){return new A(_(this.event,F))}reduce(F,O){return new A(f(this.event,F,O))}latch(){return new A(g(this.event))}debounce(F,O=100,e=!1,H){return new A(N(this.event,F,O,e,H))}on(F,O,e){return this.event(F,O,e)}once(F,O,e){return n(this.event)(F,O,e)}}function M(k){return new A(k)}C.chain=M;function R(k,F,O=e=>e){const e=(...Z)=>Q.fire(O(...Z)),H=()=>k.on(F,e),B=()=>k.removeListener(F,e),Q=new w({onFirstListenerAdd:H,onLastListenerRemove:B});return Q.event}C.fromNodeEventEmitter=R;function D(k,F,O=e=>e){const e=(...Z)=>Q.fire(O(...Z)),H=()=>k.addEventListener(F,e),B=()=>k.removeEventListener(F,e),Q=new w({onFirstListenerAdd:H,onLastListenerRemove:B});return Q.event}C.fromDOMEventEmitter=D;function T(k){const F=new w;let O=!1;return k.then(void 0,()=>null).then(()=>{O?F.fire(void 0):setTimeout(()=>F.fire(void 0),0)}),O=!0,F.event}C.fromPromise=T;function $(k){return new Promise(F=>n(k)(F))}C.toPromise=$})(d=t.Event||(t.Event={}));class l{constructor(n){this._listenerCount=0,this._invocationCount=0,this._elapsedOverall=0,this._name=`${n}_${l._idPool++}`}start(n){this._stopWatch=new u.StopWatch(!0),this._listenerCount=n}stop(){if(this._stopWatch){const n=this._stopWatch.elapsed();this._elapsedOverall+=n,this._invocationCount+=1,console.info(`did FIRE ${this._name}: elapsed_ms: ${n.toFixed(5)}, listener: ${this._listenerCount} (elapsed_overall: ${this._elapsedOverall.toFixed(2)}, invocations: ${this._invocationCount})`),this._stopWatch=void 0}}}l._idPool=0;let s=-1;class h{constructor(n,r=Math.random().toString(18).slice(2,5)){this.customThreshold=n,this.name=r,this._warnCountdown=0}dispose(){this._stacks&&this._stacks.clear()}check(n){let r=s;if(typeof this.customThreshold=="number"&&(r=this.customThreshold),!(r<=0||n{const o=this._stacks.get(m)||0;this._stacks.set(m,o-1)}}}}class w{constructor(n){var r;this._disposed=!1,this._options=n,this._leakageMon=s>0?new h(this._options&&this._options.leakWarningThreshold):void 0,this._perfMon=((r=this._options)===null||r===void 0?void 0:r._profName)?new l(this._options._profName):void 0}get event(){return this._event||(this._event=(n,r,m)=>{var _;this._listeners||(this._listeners=new E.LinkedList);const o=this._listeners.isEmpty();o&&this._options&&this._options.onFirstListenerAdd&&this._options.onFirstListenerAdd(this);const i=this._listeners.push(r?[n,r]:n);o&&this._options&&this._options.onFirstListenerDidAdd&&this._options.onFirstListenerDidAdd(this),this._options&&this._options.onListenerDidAdd&&this._options.onListenerDidAdd(this,n,r);const f=(_=this._leakageMon)===null||_===void 0?void 0:_.check(this._listeners.size);let b;return b={dispose:()=>{f&&f(),b.dispose=w._noop,this._disposed||(i(),this._options&&this._options.onLastListenerRemove&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this)))}},m instanceof P.DisposableStore?m.add(b):Array.isArray(m)&&m.push(b),b}),this._event}fire(n){var r,m;if(this._listeners){this._deliveryQueue||(this._deliveryQueue=new E.LinkedList);for(let _ of this._listeners)this._deliveryQueue.push([_,n]);for((r=this._perfMon)===null||r===void 0||r.start(this._deliveryQueue.size);this._deliveryQueue.size>0;){const[_,o]=this._deliveryQueue.shift();try{typeof _=="function"?_.call(void 0,o):_[0].call(_[1],o)}catch(i){p.onUnexpectedError(i)}}(m=this._perfMon)===null||m===void 0||m.stop()}}dispose(){var n,r,m;(n=this._listeners)===null||n===void 0||n.clear(),(r=this._deliveryQueue)===null||r===void 0||r.clear(),(m=this._leakageMon)===null||m===void 0||m.dispose(),this._disposed=!0}}t.Emitter=w,w._noop=function(){};class a extends w{constructor(n){super(n);this._isPaused=0,this._eventQueue=new E.LinkedList,this._mergeFn=n==null?void 0:n.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused==0)if(this._mergeFn){const n=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(n))}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(n){this._listeners&&(this._isPaused!==0?this._eventQueue.push(n):super.fire(n))}}t.PauseableEmitter=a;class S{constructor(){this.buffers=[]}wrapEvent(n){return(r,m,_)=>n(o=>{const i=this.buffers[this.buffers.length-1];i?i.push(()=>r.call(m,o)):r.call(m,o)},void 0,_)}bufferEvents(n){const r=[];this.buffers.push(r);const m=n();return this.buffers.pop(),r.forEach(_=>_()),m}}t.EventBufferer=S;class v{constructor(){this.listening=!1,this.inputEvent=d.None,this.inputEventListener=P.Disposable.None,this.emitter=new w({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(n){this.inputEvent=n,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=n(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}t.Relay=v}),V(z[21],G([0,1,9]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CancellationTokenSource=t.CancellationToken=void 0;const P=Object.freeze(function(l,s){const h=setTimeout(l.bind(s),0);return{dispose(){clearTimeout(h)}}});var E;(function(l){function s(h){return h===l.None||h===l.Cancelled||h instanceof u?!0:!h||typeof h!="object"?!1:typeof h.isCancellationRequested=="boolean"&&typeof h.onCancellationRequested=="function"}l.isCancellationToken=s,l.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:p.Event.None}),l.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:P})})(E=t.CancellationToken||(t.CancellationToken={}));class u{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?P:(this._emitter||(this._emitter=new p.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}}class d{constructor(s){this._token=void 0,this._parentListener=void 0,this._parentListener=s&&s.onCancellationRequested(this.cancel,this)}get token(){return this._token||(this._token=new u),this._token}cancel(){this._token?this._token instanceof u&&this._token.cancel():this._token=E.Cancelled}dispose(s=!1){s&&this.cancel(),this._parentListener&&this._parentListener.dispose(),this._token?this._token instanceof u&&this._token.dispose():this._token=E.None}}t.CancellationTokenSource=d}),V(z[5],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.breakBetweenGraphemeBreakType=t.getGraphemeBreakType=t.singleLetterHash=t.containsUppercaseCharacter=t.startsWithUTF8BOM=t.UTF8_BOM_CHARACTER=t.isEmojiImprecise=t.isFullWidthCharacter=t.containsFullWidthCharacter=t.containsUnusualLineTerminators=t.UNUSUAL_LINE_TERMINATORS=t.isBasicASCII=t.containsEmoji=t.containsRTL=t.decodeUTF8=t.prevCharLength=t.nextCharLength=t.getNextCodePoint=t.computeCodePoint=t.isLowSurrogate=t.isHighSurrogate=t.commonSuffixLength=t.commonPrefixLength=t.startsWithIgnoreCase=t.equalsIgnoreCase=t.isUpperAsciiLetter=t.isLowerAsciiLetter=t.compareSubstringIgnoreCase=t.compareIgnoreCase=t.compareSubstring=t.compare=t.lastNonWhitespaceIndex=t.getLeadingWhitespace=t.firstNonWhitespaceIndex=t.splitLines=t.regExpFlags=t.regExpLeadsToEndlessLoop=t.createRegExp=t.stripWildcards=t.convertSimple2RegExpPattern=t.rtrim=t.ltrim=t.trim=t.escapeRegExpCharacters=t.escape=t.format=t.isFalsyOrWhitespace=void 0;function p(y){return!y||typeof y!="string"?!0:y.trim().length===0}t.isFalsyOrWhitespace=p;const P=/{(\d+)}/g;function E(y,...U){return U.length===0?y:y.replace(P,function(W,q){const j=parseInt(q,10);return isNaN(j)||j<0||j>=U.length?W:U[j]})}t.format=E;function u(y){return y.replace(/[<>&]/g,function(U){switch(U){case"<":return"<";case">":return">";case"&":return"&";default:return U}})}t.escape=u;function d(y){return y.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}t.escapeRegExpCharacters=d;function l(y,U=" "){const W=s(y,U);return h(W,U)}t.trim=l;function s(y,U){if(!y||!U)return y;const W=U.length;if(W===0||y.length===0)return y;let q=0;for(;y.indexOf(U,q)===q;)q=q+W;return y.substring(q)}t.ltrim=s;function h(y,U){if(!y||!U)return y;const W=U.length,q=y.length;if(W===0||q===0)return y;let j=q,Y=-1;for(;Y=y.lastIndexOf(U,j-1),!(Y===-1||Y+W!==j);){if(Y===0)return"";j=Y}return y.substring(0,j)}t.rtrim=h;function w(y){return y.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")}t.convertSimple2RegExpPattern=w;function a(y){return y.replace(/\*/g,"")}t.stripWildcards=a;function S(y,U,W={}){if(!y)throw new Error("Cannot create regex from empty string");U||(y=d(y)),W.wholeWord&&(/\B/.test(y.charAt(0))||(y="\\b"+y),/\B/.test(y.charAt(y.length-1))||(y=y+"\\b"));let q="";return W.global&&(q+="g"),W.matchCase||(q+="i"),W.multiline&&(q+="m"),W.unicode&&(q+="u"),new RegExp(y,q)}t.createRegExp=S;function v(y){return y.source==="^"||y.source==="^$"||y.source==="$"||y.source==="^\\s*$"?!1:!!(y.exec("")&&y.lastIndex===0)}t.regExpLeadsToEndlessLoop=v;function C(y){return(y.global?"g":"")+(y.ignoreCase?"i":"")+(y.multiline?"m":"")+(y.unicode?"u":"")}t.regExpFlags=C;function n(y){return y.split(/\r\n|\r|\n/)}t.splitLines=n;function r(y){for(let U=0,W=y.length;U=0;W--){const q=y.charCodeAt(W);if(q!==32&&q!==9)return W}return-1}t.lastNonWhitespaceIndex=_;function o(y,U){return yU?1:0}t.compare=o;function i(y,U,W=0,q=y.length,j=0,Y=U.length){for(;Wte)return 1}const J=q-W,x=Y-j;return Jx?1:0}t.compareSubstring=i;function f(y,U){return b(y,U,0,y.length,0,U.length)}t.compareIgnoreCase=f;function b(y,U,W=0,q=y.length,j=0,Y=U.length){for(;Wx?1:0}t.compareSubstringIgnoreCase=b;function N(y){return y>=97&&y<=122}t.isLowerAsciiLetter=N;function c(y){return y>=65&&y<=90}t.isUpperAsciiLetter=c;function g(y){return N(y)||c(y)}function L(y,U){return y.length===U.length&&A(y,U)}t.equalsIgnoreCase=L;function A(y,U,W=y.length){for(let q=0;qy.length?!1:A(y,U,W)}t.startsWithIgnoreCase=M;function R(y,U){let W,q=Math.min(y.length,U.length);for(W=0;W1){const q=y.charCodeAt(U-2);if(T(q))return k(q,W)}return W}function e(y,U){const W=ee.getInstance(),q=U,j=y.length,Y=F(y,j,U);U+=Y>=65536?2:1;let J=W.getGraphemeBreakType(Y);for(;U=65536?2:1,J=K}return U-q}t.nextCharLength=e;function H(y,U){const W=ee.getInstance(),q=U,j=O(y,U);U-=j>=65536?2:1;let Y=W.getGraphemeBreakType(j);for(;U>0;){const J=O(y,U),x=W.getGraphemeBreakType(J);if(ue(x,Y))break;U-=J>=65536?2:1,Y=x}return q-U}t.prevCharLength=H;function B(y){const U=y.byteLength,W=[];let q=0;for(;q=240&&q+3>>0|(y[q++]&63)<<12>>>0|(y[q++]&63)<<6>>>0|(y[q++]&63)<<0>>>0:j>=224&&q+2>>0|(y[q++]&63)<<6>>>0|(y[q++]&63)<<0>>>0:j>=192&&q+1>>0|(y[q++]&63)<<0>>>0:Y=y[q++],Y>=0&&Y<=55295||Y>=57344&&Y<=65535)W.push(String.fromCharCode(Y));else if(Y>=65536&&Y<=1114111){const J=Y-65536,x=55296+((J&1047552)>>>10),K=56320+((J&1023)>>>0);W.push(String.fromCharCode(x)),W.push(String.fromCharCode(K))}else W.push(String.fromCharCode(65533))}return W.join("")}t.decodeUTF8=B;const Q=/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u08BD\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE33\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD50-\uDFFF]|\uD83B[\uDC00-\uDEBB])/;function Z(y){return Q.test(y)}t.containsRTL=Z;const ie=/(?:[\u231A\u231B\u23F0\u23F3\u2600-\u27BF\u2B50\u2B55]|\uD83C[\uDDE6-\uDDFF\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F\uDE80-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD00-\uDDFF\uDE70-\uDED6])/;function re(y){return ie.test(y)}t.containsEmoji=re;const se=/^[\t\n\r\x20-\x7E]*$/;function le(y){return se.test(y)}t.isBasicASCII=le,t.UNUSUAL_LINE_TERMINATORS=/[\u2028\u2029]/;function he(y){return t.UNUSUAL_LINE_TERMINATORS.test(y)}t.containsUnusualLineTerminators=he;function de(y){for(let U=0,W=y.length;U=11904&&y<=55215||y>=63744&&y<=64255||y>=65281&&y<=65374}t.isFullWidthCharacter=ae;function me(y){return y>=127462&&y<=127487||y===8986||y===8987||y===9200||y===9203||y>=9728&&y<=10175||y===11088||y===11093||y>=127744&&y<=128591||y>=128640&&y<=128764||y>=128992&&y<=129003||y>=129280&&y<=129535||y>=129648&&y<=129750}t.isEmojiImprecise=me,t.UTF8_BOM_CHARACTER=String.fromCharCode(65279);function ge(y){return!!(y&&y.length>0&&y.charCodeAt(0)===65279)}t.startsWithUTF8BOM=ge;function _e(y,U=!1){return y?(U&&(y=y.replace(/\\./g,"")),y.toLowerCase()!==y):!1}t.containsUppercaseCharacter=_e;function ve(y){const U=90-65+1;return y=y%(2*U),yW[3*j+1])j=2*j+1;else return W[3*j+2];return 0}}ee._INSTANCE=null;function be(){return JSON.parse("[0,0,0,51592,51592,11,44424,44424,11,72251,72254,5,7150,7150,7,48008,48008,11,55176,55176,11,128420,128420,14,3276,3277,5,9979,9980,14,46216,46216,11,49800,49800,11,53384,53384,11,70726,70726,5,122915,122916,5,129320,129327,14,2558,2558,5,5906,5908,5,9762,9763,14,43360,43388,8,45320,45320,11,47112,47112,11,48904,48904,11,50696,50696,11,52488,52488,11,54280,54280,11,70082,70083,1,71350,71350,7,73111,73111,5,127892,127893,14,128726,128727,14,129473,129474,14,2027,2035,5,2901,2902,5,3784,3789,5,6754,6754,5,8418,8420,5,9877,9877,14,11088,11088,14,44008,44008,5,44872,44872,11,45768,45768,11,46664,46664,11,47560,47560,11,48456,48456,11,49352,49352,11,50248,50248,11,51144,51144,11,52040,52040,11,52936,52936,11,53832,53832,11,54728,54728,11,69811,69814,5,70459,70460,5,71096,71099,7,71998,71998,5,72874,72880,5,119149,119149,7,127374,127374,14,128335,128335,14,128482,128482,14,128765,128767,14,129399,129400,14,129680,129685,14,1476,1477,5,2377,2380,7,2759,2760,5,3137,3140,7,3458,3459,7,4153,4154,5,6432,6434,5,6978,6978,5,7675,7679,5,9723,9726,14,9823,9823,14,9919,9923,14,10035,10036,14,42736,42737,5,43596,43596,5,44200,44200,11,44648,44648,11,45096,45096,11,45544,45544,11,45992,45992,11,46440,46440,11,46888,46888,11,47336,47336,11,47784,47784,11,48232,48232,11,48680,48680,11,49128,49128,11,49576,49576,11,50024,50024,11,50472,50472,11,50920,50920,11,51368,51368,11,51816,51816,11,52264,52264,11,52712,52712,11,53160,53160,11,53608,53608,11,54056,54056,11,54504,54504,11,54952,54952,11,68108,68111,5,69933,69940,5,70197,70197,7,70498,70499,7,70845,70845,5,71229,71229,5,71727,71735,5,72154,72155,5,72344,72345,5,73023,73029,5,94095,94098,5,121403,121452,5,126981,127182,14,127538,127546,14,127990,127990,14,128391,128391,14,128445,128449,14,128500,128505,14,128752,128752,14,129160,129167,14,129356,129356,14,129432,129442,14,129648,129651,14,129751,131069,14,173,173,4,1757,1757,1,2274,2274,1,2494,2494,5,2641,2641,5,2876,2876,5,3014,3016,7,3262,3262,7,3393,3396,5,3570,3571,7,3968,3972,5,4228,4228,7,6086,6086,5,6679,6680,5,6912,6915,5,7080,7081,5,7380,7392,5,8252,8252,14,9096,9096,14,9748,9749,14,9784,9786,14,9833,9850,14,9890,9894,14,9938,9938,14,9999,9999,14,10085,10087,14,12349,12349,14,43136,43137,7,43454,43456,7,43755,43755,7,44088,44088,11,44312,44312,11,44536,44536,11,44760,44760,11,44984,44984,11,45208,45208,11,45432,45432,11,45656,45656,11,45880,45880,11,46104,46104,11,46328,46328,11,46552,46552,11,46776,46776,11,47000,47000,11,47224,47224,11,47448,47448,11,47672,47672,11,47896,47896,11,48120,48120,11,48344,48344,11,48568,48568,11,48792,48792,11,49016,49016,11,49240,49240,11,49464,49464,11,49688,49688,11,49912,49912,11,50136,50136,11,50360,50360,11,50584,50584,11,50808,50808,11,51032,51032,11,51256,51256,11,51480,51480,11,51704,51704,11,51928,51928,11,52152,52152,11,52376,52376,11,52600,52600,11,52824,52824,11,53048,53048,11,53272,53272,11,53496,53496,11,53720,53720,11,53944,53944,11,54168,54168,11,54392,54392,11,54616,54616,11,54840,54840,11,55064,55064,11,65438,65439,5,69633,69633,5,69837,69837,1,70018,70018,7,70188,70190,7,70368,70370,7,70465,70468,7,70712,70719,5,70835,70840,5,70850,70851,5,71132,71133,5,71340,71340,7,71458,71461,5,71985,71989,7,72002,72002,7,72193,72202,5,72281,72283,5,72766,72766,7,72885,72886,5,73104,73105,5,92912,92916,5,113824,113827,4,119173,119179,5,121505,121519,5,125136,125142,5,127279,127279,14,127489,127490,14,127570,127743,14,127900,127901,14,128254,128254,14,128369,128370,14,128400,128400,14,128425,128432,14,128468,128475,14,128489,128494,14,128715,128720,14,128745,128745,14,128759,128760,14,129004,129023,14,129296,129304,14,129340,129342,14,129388,129392,14,129404,129407,14,129454,129455,14,129485,129487,14,129659,129663,14,129719,129727,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2363,2363,7,2402,2403,5,2507,2508,7,2622,2624,7,2691,2691,7,2786,2787,5,2881,2884,5,3006,3006,5,3072,3072,5,3170,3171,5,3267,3268,7,3330,3331,7,3406,3406,1,3538,3540,5,3655,3662,5,3897,3897,5,4038,4038,5,4184,4185,5,4352,4447,8,6068,6069,5,6155,6157,5,6448,6449,7,6742,6742,5,6783,6783,5,6966,6970,5,7042,7042,7,7143,7143,7,7212,7219,5,7412,7412,5,8206,8207,4,8294,8303,4,8596,8601,14,9410,9410,14,9742,9742,14,9757,9757,14,9770,9770,14,9794,9794,14,9828,9828,14,9855,9855,14,9882,9882,14,9900,9903,14,9929,9933,14,9963,9967,14,9987,9988,14,10006,10006,14,10062,10062,14,10175,10175,14,11744,11775,5,42607,42607,5,43043,43044,7,43263,43263,5,43444,43445,7,43569,43570,5,43698,43700,5,43766,43766,5,44032,44032,11,44144,44144,11,44256,44256,11,44368,44368,11,44480,44480,11,44592,44592,11,44704,44704,11,44816,44816,11,44928,44928,11,45040,45040,11,45152,45152,11,45264,45264,11,45376,45376,11,45488,45488,11,45600,45600,11,45712,45712,11,45824,45824,11,45936,45936,11,46048,46048,11,46160,46160,11,46272,46272,11,46384,46384,11,46496,46496,11,46608,46608,11,46720,46720,11,46832,46832,11,46944,46944,11,47056,47056,11,47168,47168,11,47280,47280,11,47392,47392,11,47504,47504,11,47616,47616,11,47728,47728,11,47840,47840,11,47952,47952,11,48064,48064,11,48176,48176,11,48288,48288,11,48400,48400,11,48512,48512,11,48624,48624,11,48736,48736,11,48848,48848,11,48960,48960,11,49072,49072,11,49184,49184,11,49296,49296,11,49408,49408,11,49520,49520,11,49632,49632,11,49744,49744,11,49856,49856,11,49968,49968,11,50080,50080,11,50192,50192,11,50304,50304,11,50416,50416,11,50528,50528,11,50640,50640,11,50752,50752,11,50864,50864,11,50976,50976,11,51088,51088,11,51200,51200,11,51312,51312,11,51424,51424,11,51536,51536,11,51648,51648,11,51760,51760,11,51872,51872,11,51984,51984,11,52096,52096,11,52208,52208,11,52320,52320,11,52432,52432,11,52544,52544,11,52656,52656,11,52768,52768,11,52880,52880,11,52992,52992,11,53104,53104,11,53216,53216,11,53328,53328,11,53440,53440,11,53552,53552,11,53664,53664,11,53776,53776,11,53888,53888,11,54000,54000,11,54112,54112,11,54224,54224,11,54336,54336,11,54448,54448,11,54560,54560,11,54672,54672,11,54784,54784,11,54896,54896,11,55008,55008,11,55120,55120,11,64286,64286,5,66272,66272,5,68900,68903,5,69762,69762,7,69817,69818,5,69927,69931,5,70003,70003,5,70070,70078,5,70094,70094,7,70194,70195,7,70206,70206,5,70400,70401,5,70463,70463,7,70475,70477,7,70512,70516,5,70722,70724,5,70832,70832,5,70842,70842,5,70847,70848,5,71088,71089,7,71102,71102,7,71219,71226,5,71231,71232,5,71342,71343,7,71453,71455,5,71463,71467,5,71737,71738,5,71995,71996,5,72000,72000,7,72145,72147,7,72160,72160,5,72249,72249,7,72273,72278,5,72330,72342,5,72752,72758,5,72850,72871,5,72882,72883,5,73018,73018,5,73031,73031,5,73109,73109,5,73461,73462,7,94031,94031,5,94192,94193,7,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,126976,126979,14,127184,127231,14,127344,127345,14,127405,127461,14,127514,127514,14,127561,127567,14,127778,127779,14,127896,127896,14,127985,127986,14,127995,127999,5,128326,128328,14,128360,128366,14,128378,128378,14,128394,128397,14,128405,128406,14,128422,128423,14,128435,128443,14,128453,128464,14,128479,128480,14,128484,128487,14,128496,128498,14,128640,128709,14,128723,128724,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129096,129103,14,129292,129292,14,129311,129311,14,129329,129330,14,129344,129349,14,129360,129374,14,129394,129394,14,129402,129402,14,129413,129425,14,129445,129450,14,129466,129471,14,129483,129483,14,129511,129535,14,129653,129655,14,129667,129670,14,129705,129711,14,129731,129743,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2307,2307,7,2366,2368,7,2382,2383,7,2434,2435,7,2497,2500,5,2519,2519,5,2563,2563,7,2631,2632,5,2677,2677,5,2750,2752,7,2763,2764,7,2817,2817,5,2879,2879,5,2891,2892,7,2914,2915,5,3008,3008,5,3021,3021,5,3076,3076,5,3146,3149,5,3202,3203,7,3264,3265,7,3271,3272,7,3298,3299,5,3390,3390,5,3402,3404,7,3426,3427,5,3535,3535,5,3544,3550,7,3635,3635,7,3763,3763,7,3893,3893,5,3953,3966,5,3981,3991,5,4145,4145,7,4157,4158,5,4209,4212,5,4237,4237,5,4520,4607,10,5970,5971,5,6071,6077,5,6089,6099,5,6277,6278,5,6439,6440,5,6451,6456,7,6683,6683,5,6744,6750,5,6765,6770,7,6846,6846,5,6964,6964,5,6972,6972,5,7019,7027,5,7074,7077,5,7083,7085,5,7146,7148,7,7154,7155,7,7222,7223,5,7394,7400,5,7416,7417,5,8204,8204,5,8233,8233,4,8288,8292,4,8413,8416,5,8482,8482,14,8986,8987,14,9193,9203,14,9654,9654,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9775,14,9792,9792,14,9800,9811,14,9825,9826,14,9831,9831,14,9852,9853,14,9872,9873,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9936,9936,14,9941,9960,14,9974,9974,14,9982,9985,14,9992,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10145,10145,14,11013,11015,14,11503,11505,5,12334,12335,5,12951,12951,14,42612,42621,5,43014,43014,5,43047,43047,7,43204,43205,5,43335,43345,5,43395,43395,7,43450,43451,7,43561,43566,5,43573,43574,5,43644,43644,5,43710,43711,5,43758,43759,7,44005,44005,5,44012,44012,7,44060,44060,11,44116,44116,11,44172,44172,11,44228,44228,11,44284,44284,11,44340,44340,11,44396,44396,11,44452,44452,11,44508,44508,11,44564,44564,11,44620,44620,11,44676,44676,11,44732,44732,11,44788,44788,11,44844,44844,11,44900,44900,11,44956,44956,11,45012,45012,11,45068,45068,11,45124,45124,11,45180,45180,11,45236,45236,11,45292,45292,11,45348,45348,11,45404,45404,11,45460,45460,11,45516,45516,11,45572,45572,11,45628,45628,11,45684,45684,11,45740,45740,11,45796,45796,11,45852,45852,11,45908,45908,11,45964,45964,11,46020,46020,11,46076,46076,11,46132,46132,11,46188,46188,11,46244,46244,11,46300,46300,11,46356,46356,11,46412,46412,11,46468,46468,11,46524,46524,11,46580,46580,11,46636,46636,11,46692,46692,11,46748,46748,11,46804,46804,11,46860,46860,11,46916,46916,11,46972,46972,11,47028,47028,11,47084,47084,11,47140,47140,11,47196,47196,11,47252,47252,11,47308,47308,11,47364,47364,11,47420,47420,11,47476,47476,11,47532,47532,11,47588,47588,11,47644,47644,11,47700,47700,11,47756,47756,11,47812,47812,11,47868,47868,11,47924,47924,11,47980,47980,11,48036,48036,11,48092,48092,11,48148,48148,11,48204,48204,11,48260,48260,11,48316,48316,11,48372,48372,11,48428,48428,11,48484,48484,11,48540,48540,11,48596,48596,11,48652,48652,11,48708,48708,11,48764,48764,11,48820,48820,11,48876,48876,11,48932,48932,11,48988,48988,11,49044,49044,11,49100,49100,11,49156,49156,11,49212,49212,11,49268,49268,11,49324,49324,11,49380,49380,11,49436,49436,11,49492,49492,11,49548,49548,11,49604,49604,11,49660,49660,11,49716,49716,11,49772,49772,11,49828,49828,11,49884,49884,11,49940,49940,11,49996,49996,11,50052,50052,11,50108,50108,11,50164,50164,11,50220,50220,11,50276,50276,11,50332,50332,11,50388,50388,11,50444,50444,11,50500,50500,11,50556,50556,11,50612,50612,11,50668,50668,11,50724,50724,11,50780,50780,11,50836,50836,11,50892,50892,11,50948,50948,11,51004,51004,11,51060,51060,11,51116,51116,11,51172,51172,11,51228,51228,11,51284,51284,11,51340,51340,11,51396,51396,11,51452,51452,11,51508,51508,11,51564,51564,11,51620,51620,11,51676,51676,11,51732,51732,11,51788,51788,11,51844,51844,11,51900,51900,11,51956,51956,11,52012,52012,11,52068,52068,11,52124,52124,11,52180,52180,11,52236,52236,11,52292,52292,11,52348,52348,11,52404,52404,11,52460,52460,11,52516,52516,11,52572,52572,11,52628,52628,11,52684,52684,11,52740,52740,11,52796,52796,11,52852,52852,11,52908,52908,11,52964,52964,11,53020,53020,11,53076,53076,11,53132,53132,11,53188,53188,11,53244,53244,11,53300,53300,11,53356,53356,11,53412,53412,11,53468,53468,11,53524,53524,11,53580,53580,11,53636,53636,11,53692,53692,11,53748,53748,11,53804,53804,11,53860,53860,11,53916,53916,11,53972,53972,11,54028,54028,11,54084,54084,11,54140,54140,11,54196,54196,11,54252,54252,11,54308,54308,11,54364,54364,11,54420,54420,11,54476,54476,11,54532,54532,11,54588,54588,11,54644,54644,11,54700,54700,11,54756,54756,11,54812,54812,11,54868,54868,11,54924,54924,11,54980,54980,11,55036,55036,11,55092,55092,11,55148,55148,11,55216,55238,9,65056,65071,5,65529,65531,4,68097,68099,5,68159,68159,5,69446,69456,5,69688,69702,5,69808,69810,7,69815,69816,7,69821,69821,1,69888,69890,5,69932,69932,7,69957,69958,7,70016,70017,5,70067,70069,7,70079,70080,7,70089,70092,5,70095,70095,5,70191,70193,5,70196,70196,5,70198,70199,5,70367,70367,5,70371,70378,5,70402,70403,7,70462,70462,5,70464,70464,5,70471,70472,7,70487,70487,5,70502,70508,5,70709,70711,7,70720,70721,7,70725,70725,7,70750,70750,5,70833,70834,7,70841,70841,7,70843,70844,7,70846,70846,7,70849,70849,7,71087,71087,5,71090,71093,5,71100,71101,5,71103,71104,5,71216,71218,7,71227,71228,7,71230,71230,7,71339,71339,5,71341,71341,5,71344,71349,5,71351,71351,5,71456,71457,7,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123628,123631,5,125252,125258,5,126980,126980,14,127183,127183,14,127245,127247,14,127340,127343,14,127358,127359,14,127377,127386,14,127462,127487,6,127491,127503,14,127535,127535,14,127548,127551,14,127568,127569,14,127744,127777,14,127780,127891,14,127894,127895,14,127897,127899,14,127902,127984,14,127987,127989,14,127991,127994,14,128000,128253,14,128255,128317,14,128329,128334,14,128336,128359,14,128367,128368,14,128371,128377,14,128379,128390,14,128392,128393,14,128398,128399,14,128401,128404,14,128407,128419,14,128421,128421,14,128424,128424,14,128433,128434,14,128444,128444,14,128450,128452,14,128465,128467,14,128476,128478,14,128481,128481,14,128483,128483,14,128488,128488,14,128495,128495,14,128499,128499,14,128506,128591,14,128710,128714,14,128721,128722,14,128725,128725,14,128728,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129664,129666,14,129671,129679,14,129686,129704,14,129712,129718,14,129728,129730,14,129744,129750,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2259,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3134,3136,5,3142,3144,5,3157,3158,5,3201,3201,5,3260,3260,5,3263,3263,5,3266,3266,5,3270,3270,5,3274,3275,7,3285,3286,5,3328,3329,5,3387,3388,5,3391,3392,7,3398,3400,7,3405,3405,5,3415,3415,5,3457,3457,5,3530,3530,5,3536,3537,7,3542,3542,5,3551,3551,5,3633,3633,5,3636,3642,5,3761,3761,5,3764,3772,5,3864,3865,5,3895,3895,5,3902,3903,7,3967,3967,7,3974,3975,5,3993,4028,5,4141,4144,5,4146,4151,5,4155,4156,7,4182,4183,7,4190,4192,5,4226,4226,5,4229,4230,5,4253,4253,5,4448,4519,9,4957,4959,5,5938,5940,5,6002,6003,5,6070,6070,7,6078,6085,7,6087,6088,7,6109,6109,5,6158,6158,4,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6848,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7673,5,8203,8203,4,8205,8205,13,8232,8232,4,8234,8238,4,8265,8265,14,8293,8293,4,8400,8412,5,8417,8417,5,8421,8432,5,8505,8505,14,8617,8618,14,9000,9000,14,9167,9167,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9776,9783,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9935,14,9937,9937,14,9939,9940,14,9961,9962,14,9968,9973,14,9975,9978,14,9981,9981,14,9986,9986,14,9989,9989,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10084,14,10133,10135,14,10160,10160,14,10548,10549,14,11035,11036,14,11093,11093,14,11647,11647,5,12330,12333,5,12336,12336,14,12441,12442,5,12953,12953,14,42608,42610,5,42654,42655,5,43010,43010,5,43019,43019,5,43045,43046,5,43052,43052,5,43188,43203,7,43232,43249,5,43302,43309,5,43346,43347,7,43392,43394,5,43443,43443,5,43446,43449,5,43452,43453,5,43493,43493,5,43567,43568,7,43571,43572,7,43587,43587,5,43597,43597,7,43696,43696,5,43703,43704,5,43713,43713,5,43756,43757,5,43765,43765,7,44003,44004,7,44006,44007,7,44009,44010,7,44013,44013,5,44033,44059,12,44061,44087,12,44089,44115,12,44117,44143,12,44145,44171,12,44173,44199,12,44201,44227,12,44229,44255,12,44257,44283,12,44285,44311,12,44313,44339,12,44341,44367,12,44369,44395,12,44397,44423,12,44425,44451,12,44453,44479,12,44481,44507,12,44509,44535,12,44537,44563,12,44565,44591,12,44593,44619,12,44621,44647,12,44649,44675,12,44677,44703,12,44705,44731,12,44733,44759,12,44761,44787,12,44789,44815,12,44817,44843,12,44845,44871,12,44873,44899,12,44901,44927,12,44929,44955,12,44957,44983,12,44985,45011,12,45013,45039,12,45041,45067,12,45069,45095,12,45097,45123,12,45125,45151,12,45153,45179,12,45181,45207,12,45209,45235,12,45237,45263,12,45265,45291,12,45293,45319,12,45321,45347,12,45349,45375,12,45377,45403,12,45405,45431,12,45433,45459,12,45461,45487,12,45489,45515,12,45517,45543,12,45545,45571,12,45573,45599,12,45601,45627,12,45629,45655,12,45657,45683,12,45685,45711,12,45713,45739,12,45741,45767,12,45769,45795,12,45797,45823,12,45825,45851,12,45853,45879,12,45881,45907,12,45909,45935,12,45937,45963,12,45965,45991,12,45993,46019,12,46021,46047,12,46049,46075,12,46077,46103,12,46105,46131,12,46133,46159,12,46161,46187,12,46189,46215,12,46217,46243,12,46245,46271,12,46273,46299,12,46301,46327,12,46329,46355,12,46357,46383,12,46385,46411,12,46413,46439,12,46441,46467,12,46469,46495,12,46497,46523,12,46525,46551,12,46553,46579,12,46581,46607,12,46609,46635,12,46637,46663,12,46665,46691,12,46693,46719,12,46721,46747,12,46749,46775,12,46777,46803,12,46805,46831,12,46833,46859,12,46861,46887,12,46889,46915,12,46917,46943,12,46945,46971,12,46973,46999,12,47001,47027,12,47029,47055,12,47057,47083,12,47085,47111,12,47113,47139,12,47141,47167,12,47169,47195,12,47197,47223,12,47225,47251,12,47253,47279,12,47281,47307,12,47309,47335,12,47337,47363,12,47365,47391,12,47393,47419,12,47421,47447,12,47449,47475,12,47477,47503,12,47505,47531,12,47533,47559,12,47561,47587,12,47589,47615,12,47617,47643,12,47645,47671,12,47673,47699,12,47701,47727,12,47729,47755,12,47757,47783,12,47785,47811,12,47813,47839,12,47841,47867,12,47869,47895,12,47897,47923,12,47925,47951,12,47953,47979,12,47981,48007,12,48009,48035,12,48037,48063,12,48065,48091,12,48093,48119,12,48121,48147,12,48149,48175,12,48177,48203,12,48205,48231,12,48233,48259,12,48261,48287,12,48289,48315,12,48317,48343,12,48345,48371,12,48373,48399,12,48401,48427,12,48429,48455,12,48457,48483,12,48485,48511,12,48513,48539,12,48541,48567,12,48569,48595,12,48597,48623,12,48625,48651,12,48653,48679,12,48681,48707,12,48709,48735,12,48737,48763,12,48765,48791,12,48793,48819,12,48821,48847,12,48849,48875,12,48877,48903,12,48905,48931,12,48933,48959,12,48961,48987,12,48989,49015,12,49017,49043,12,49045,49071,12,49073,49099,12,49101,49127,12,49129,49155,12,49157,49183,12,49185,49211,12,49213,49239,12,49241,49267,12,49269,49295,12,49297,49323,12,49325,49351,12,49353,49379,12,49381,49407,12,49409,49435,12,49437,49463,12,49465,49491,12,49493,49519,12,49521,49547,12,49549,49575,12,49577,49603,12,49605,49631,12,49633,49659,12,49661,49687,12,49689,49715,12,49717,49743,12,49745,49771,12,49773,49799,12,49801,49827,12,49829,49855,12,49857,49883,12,49885,49911,12,49913,49939,12,49941,49967,12,49969,49995,12,49997,50023,12,50025,50051,12,50053,50079,12,50081,50107,12,50109,50135,12,50137,50163,12,50165,50191,12,50193,50219,12,50221,50247,12,50249,50275,12,50277,50303,12,50305,50331,12,50333,50359,12,50361,50387,12,50389,50415,12,50417,50443,12,50445,50471,12,50473,50499,12,50501,50527,12,50529,50555,12,50557,50583,12,50585,50611,12,50613,50639,12,50641,50667,12,50669,50695,12,50697,50723,12,50725,50751,12,50753,50779,12,50781,50807,12,50809,50835,12,50837,50863,12,50865,50891,12,50893,50919,12,50921,50947,12,50949,50975,12,50977,51003,12,51005,51031,12,51033,51059,12,51061,51087,12,51089,51115,12,51117,51143,12,51145,51171,12,51173,51199,12,51201,51227,12,51229,51255,12,51257,51283,12,51285,51311,12,51313,51339,12,51341,51367,12,51369,51395,12,51397,51423,12,51425,51451,12,51453,51479,12,51481,51507,12,51509,51535,12,51537,51563,12,51565,51591,12,51593,51619,12,51621,51647,12,51649,51675,12,51677,51703,12,51705,51731,12,51733,51759,12,51761,51787,12,51789,51815,12,51817,51843,12,51845,51871,12,51873,51899,12,51901,51927,12,51929,51955,12,51957,51983,12,51985,52011,12,52013,52039,12,52041,52067,12,52069,52095,12,52097,52123,12,52125,52151,12,52153,52179,12,52181,52207,12,52209,52235,12,52237,52263,12,52265,52291,12,52293,52319,12,52321,52347,12,52349,52375,12,52377,52403,12,52405,52431,12,52433,52459,12,52461,52487,12,52489,52515,12,52517,52543,12,52545,52571,12,52573,52599,12,52601,52627,12,52629,52655,12,52657,52683,12,52685,52711,12,52713,52739,12,52741,52767,12,52769,52795,12,52797,52823,12,52825,52851,12,52853,52879,12,52881,52907,12,52909,52935,12,52937,52963,12,52965,52991,12,52993,53019,12,53021,53047,12,53049,53075,12,53077,53103,12,53105,53131,12,53133,53159,12,53161,53187,12,53189,53215,12,53217,53243,12,53245,53271,12,53273,53299,12,53301,53327,12,53329,53355,12,53357,53383,12,53385,53411,12,53413,53439,12,53441,53467,12,53469,53495,12,53497,53523,12,53525,53551,12,53553,53579,12,53581,53607,12,53609,53635,12,53637,53663,12,53665,53691,12,53693,53719,12,53721,53747,12,53749,53775,12,53777,53803,12,53805,53831,12,53833,53859,12,53861,53887,12,53889,53915,12,53917,53943,12,53945,53971,12,53973,53999,12,54001,54027,12,54029,54055,12,54057,54083,12,54085,54111,12,54113,54139,12,54141,54167,12,54169,54195,12,54197,54223,12,54225,54251,12,54253,54279,12,54281,54307,12,54309,54335,12,54337,54363,12,54365,54391,12,54393,54419,12,54421,54447,12,54449,54475,12,54477,54503,12,54505,54531,12,54533,54559,12,54561,54587,12,54589,54615,12,54617,54643,12,54645,54671,12,54673,54699,12,54701,54727,12,54729,54755,12,54757,54783,12,54785,54811,12,54813,54839,12,54841,54867,12,54869,54895,12,54897,54923,12,54925,54951,12,54953,54979,12,54981,55007,12,55009,55035,12,55037,55063,12,55065,55091,12,55093,55119,12,55121,55147,12,55149,55175,12,55177,55203,12,55243,55291,10,65024,65039,5,65279,65279,4,65520,65528,4,66045,66045,5,66422,66426,5,68101,68102,5,68152,68154,5,68325,68326,5,69291,69292,5,69632,69632,7,69634,69634,7,69759,69761,5]")}}),V(z[22],G([0,1,5]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StringSHA1=t.toHexString=t.stringHash=t.doHash=t.hash=void 0;function P(n){return E(n,0)}t.hash=P;function E(n,r){switch(typeof n){case"object":return n===null?u(349,r):Array.isArray(n)?s(n,r):h(n,r);case"string":return l(n,r);case"boolean":return d(n,r);case"number":return u(n,r);case"undefined":return u(937,r);default:return u(617,r)}}t.doHash=E;function u(n,r){return(r<<5)-r+n|0}function d(n,r){return u(n?433:863,r)}function l(n,r){r=u(149417,r);for(let m=0,_=n.length;m<_;m++)r=u(n.charCodeAt(m),r);return r}t.stringHash=l;function s(n,r){return r=u(104579,r),n.reduce((m,_)=>E(_,m),r)}function h(n,r){return r=u(181387,r),Object.keys(n).sort().reduce((m,_)=>(m=l(_,m),E(n[_],m)),r)}function w(n,r,m=32){const _=m-r,o=~((1<<_)-1);return(n<>>_)>>>0}function a(n,r=0,m=n.byteLength,_=0){for(let o=0;om.toString(16).padStart(2,"0")).join(""):S((n>>>0).toString(16),r/4)}t.toHexString=v;class C{constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(64+3),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(r){const m=r.length;if(m!==0){const _=this._buff;let o=this._buffLen,i=this._leftoverHighSurrogate,f,b;for(i!==0?(f=i,b=-1,i=0):(f=r.charCodeAt(0),b=0);;){let N=f;if(p.isHighSurrogate(f))if(b+1>>6,r[m++]=128|(_&63)>>>0):_<65536?(r[m++]=224|(_&61440)>>>12,r[m++]=128|(_&4032)>>>6,r[m++]=128|(_&63)>>>0):(r[m++]=240|(_&1835008)>>>18,r[m++]=128|(_&258048)>>>12,r[m++]=128|(_&4032)>>>6,r[m++]=128|(_&63)>>>0),m>=64&&(this._step(),m-=64,this._totalLen+=64,r[0]=r[64+0],r[1]=r[64+1],r[2]=r[64+2]),m}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),v(this._h0)+v(this._h1)+v(this._h2)+v(this._h3)+v(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,a(this._buff,this._buffLen),this._buffLen>56&&(this._step(),a(this._buff));const r=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(r/4294967296),!1),this._buffDV.setUint32(60,r%4294967296,!1),this._step()}_step(){const r=C._bigBlock32,m=this._buffDV;for(let L=0;L<64;L+=4)r.setUint32(L,m.getUint32(L,!1),!1);for(let L=64;L<320;L+=4)r.setUint32(L,w(r.getUint32(L-12,!1)^r.getUint32(L-32,!1)^r.getUint32(L-56,!1)^r.getUint32(L-64,!1),1),!1);let _=this._h0,o=this._h1,i=this._h2,f=this._h3,b=this._h4,N,c,g;for(let L=0;L<80;L++)L<20?(N=o&i|~o&f,c=1518500249):L<40?(N=o^i^f,c=1859775393):L<60?(N=o&i|o&f|i&f,c=2400959708):(N=o^i^f,c=3395469782),g=w(_,5)+N+b+c+r.getUint32(L*4,!1)&4294967295,b=f,f=i,i=w(o,30),o=_,_=g;this._h0=this._h0+_&4294967295,this._h1=this._h1+o&4294967295,this._h2=this._h2+i&4294967295,this._h3=this._h3+f&4294967295,this._h4=this._h4+b&4294967295}}t.StringSHA1=C,C._bigBlock32=new DataView(new ArrayBuffer(320))}),V(z[10],G([0,1,15,22]),function(I,t,p,P){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LcsDiff=t.MyArray=t.Debug=t.stringDiff=t.StringDiffSequence=void 0;class E{constructor(a){this.source=a}getElements(){const a=this.source,S=new Int32Array(a.length);for(let v=0,C=a.length;v0||this.m_modifiedCount>0)&&this.m_changes.push(new p.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(a,S){this.m_originalStart=Math.min(this.m_originalStart,a),this.m_modifiedStart=Math.min(this.m_modifiedStart,S),this.m_originalCount++}AddModifiedElement(a,S){this.m_originalStart=Math.min(this.m_originalStart,a),this.m_modifiedStart=Math.min(this.m_modifiedStart,S),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class h{constructor(a,S,v=null){this.ContinueProcessingPredicate=v;const[C,n,r]=h._getElements(a),[m,_,o]=h._getElements(S);this._hasStrings=r&&o,this._originalStringElements=C,this._originalElementsOrHash=n,this._modifiedStringElements=m,this._modifiedElementsOrHash=_,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(a){return a.length>0&&typeof a[0]=="string"}static _getElements(a){const S=a.getElements();if(h._isStringArray(S)){const v=new Int32Array(S.length);for(let C=0,n=S.length;C=a&&C>=v&&this.ElementsAreEqual(S,C);)S--,C--;if(a>S||v>C){let f;return v<=C?(d.Assert(a===S+1,"originalStart should only be one more than originalEnd"),f=[new p.DiffChange(a,0,v,C-v+1)]):a<=S?(d.Assert(v===C+1,"modifiedStart should only be one more than modifiedEnd"),f=[new p.DiffChange(a,S-a+1,v,0)]):(d.Assert(a===S+1,"originalStart should only be one more than originalEnd"),d.Assert(v===C+1,"modifiedStart should only be one more than modifiedEnd"),f=[]),f}const r=[0],m=[0],_=this.ComputeRecursionPoint(a,S,v,C,r,m,n),o=r[0],i=m[0];if(_!==null)return _;if(!n[0]){const f=this.ComputeDiffRecursive(a,o,v,i,n);let b=[];return n[0]?b=[new p.DiffChange(o+1,S-(o+1)+1,i+1,C-(i+1)+1)]:b=this.ComputeDiffRecursive(o+1,S,i+1,C,n),this.ConcatenateChanges(f,b)}return[new p.DiffChange(a,S-a+1,v,C-v+1)]}WALKTRACE(a,S,v,C,n,r,m,_,o,i,f,b,N,c,g,L,A,M){let R=null,D=null,T=new s,$=S,k=v,F=N[0]-L[0]-C,O=-1073741824,e=this.m_forwardHistory.length-1;do{const H=F+a;H===$||H=0&&(o=this.m_forwardHistory[e],a=o[0],$=1,k=o.length-1)}while(--e>=-1);if(R=T.getReverseChanges(),M[0]){let H=N[0]+1,B=L[0]+1;if(R!==null&&R.length>0){const Q=R[R.length-1];H=Math.max(H,Q.getOriginalEnd()),B=Math.max(B,Q.getModifiedEnd())}D=[new p.DiffChange(H,b-H+1,B,g-B+1)]}else{T=new s,$=r,k=m,F=N[0]-L[0]-_,O=1073741824,e=A?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const H=F+n;H===$||H=i[H+1]?(f=i[H+1]-1,c=f-F-_,f>O&&T.MarkNextChange(),O=f+1,T.AddOriginalElement(f+1,c+1),F=H+1-n):(f=i[H-1],c=f-F-_,f>O&&T.MarkNextChange(),O=f,T.AddModifiedElement(f+1,c+1),F=H-1-n),e>=0&&(i=this.m_reverseHistory[e],n=i[0],$=1,k=i.length-1)}while(--e>=-1);D=T.getChanges()}return this.ConcatenateChanges(R,D)}ComputeRecursionPoint(a,S,v,C,n,r,m){let _=0,o=0,i=0,f=0,b=0,N=0;a--,v--,n[0]=0,r[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const c=S-a+(C-v),g=c+1,L=new Int32Array(g),A=new Int32Array(g),M=C-v,R=S-a,D=a-v,T=S-C,k=(R-M)%2==0;L[M]=a,A[R]=S,m[0]=!1;for(let F=1;F<=c/2+1;F++){let O=0,e=0;i=this.ClipDiagonalBound(M-F,F,M,g),f=this.ClipDiagonalBound(M+F,F,M,g);for(let B=i;B<=f;B+=2){B===i||BO+e&&(O=_,e=o),!k&&Math.abs(B-R)<=F-1&&_>=A[B])return n[0]=_,r[0]=o,Q<=A[B]&&1447>0&&F<=1447+1?this.WALKTRACE(M,i,f,D,R,b,N,T,L,A,_,S,n,o,C,r,k,m):null}const H=(O-a+(e-v)-F)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(O,H))return m[0]=!0,n[0]=O,r[0]=e,H>0&&1447>0&&F<=1447+1?this.WALKTRACE(M,i,f,D,R,b,N,T,L,A,_,S,n,o,C,r,k,m):(a++,v++,[new p.DiffChange(a,S-a+1,v,C-v+1)]);b=this.ClipDiagonalBound(R-F,F,R,g),N=this.ClipDiagonalBound(R+F,F,R,g);for(let B=b;B<=N;B+=2){B===b||B=A[B+1]?_=A[B+1]-1:_=A[B-1],o=_-(B-R)-T;const Q=_;for(;_>a&&o>v&&this.ElementsAreEqual(_,o);)_--,o--;if(A[B]=_,k&&Math.abs(B-M)<=F&&_<=L[B])return n[0]=_,r[0]=o,Q>=L[B]&&1447>0&&F<=1447+1?this.WALKTRACE(M,i,f,D,R,b,N,T,L,A,_,S,n,o,C,r,k,m):null}if(F<=1447){let B=new Int32Array(f-i+2);B[0]=M-i+1,l.Copy2(L,i,B,1,f-i+1),this.m_forwardHistory.push(B),B=new Int32Array(N-b+2),B[0]=R-b+1,l.Copy2(A,b,B,1,N-b+1),this.m_reverseHistory.push(B)}}return this.WALKTRACE(M,i,f,D,R,b,N,T,L,A,_,S,n,o,C,r,k,m)}PrettifyChanges(a){for(let S=0;S0,m=v.modifiedLength>0;for(;v.originalStart+v.originalLength=0;S--){const v=a[S];let C=0,n=0;if(S>0){const i=a[S-1];i.originalLength>0&&(C=i.originalStart+i.originalLength),i.modifiedLength>0&&(n=i.modifiedStart+i.modifiedLength)}const r=v.originalLength>0,m=v.modifiedLength>0;let _=0,o=this._boundaryScore(v.originalStart,v.originalLength,v.modifiedStart,v.modifiedLength);for(let i=1;;i++){const f=v.originalStart-i,b=v.modifiedStart-i;if(fo&&(o=N,_=i)}v.originalStart-=_,v.modifiedStart-=_}if(this._hasStrings)for(let S=1,v=a.length;S0&&N>_&&(_=N,o=f,i=b)}return _>0?[o,i]:null}_contiguousSequenceScore(a,S,v){let C=0;for(let n=0;n=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._originalStringElements[a])}_OriginalRegionIsBoundary(a,S){if(this._OriginalIsBoundary(a)||this._OriginalIsBoundary(a-1))return!0;if(S>0){const v=a+S;if(this._OriginalIsBoundary(v-1)||this._OriginalIsBoundary(v))return!0}return!1}_ModifiedIsBoundary(a){return a<=0||a>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[a])}_ModifiedRegionIsBoundary(a,S){if(this._ModifiedIsBoundary(a)||this._ModifiedIsBoundary(a-1))return!0;if(S>0){const v=a+S;if(this._ModifiedIsBoundary(v-1)||this._ModifiedIsBoundary(v))return!0}return!1}_boundaryScore(a,S,v,C){const n=this._OriginalRegionIsBoundary(a,S)?1:0,r=this._ModifiedRegionIsBoundary(v,C)?1:0;return n+r}ConcatenateChanges(a,S){let v=[];if(a.length===0||S.length===0)return S.length>0?S:a;if(this.ChangesOverlap(a[a.length-1],S[0],v)){const C=new Array(a.length+S.length-1);return l.Copy(a,0,C,0,a.length-1),C[a.length-1]=v[0],l.Copy(S,1,C,a.length,S.length-1),C}else{const C=new Array(a.length+S.length);return l.Copy(a,0,C,0,a.length),l.Copy(S,0,C,a.length,S.length),C}}ChangesOverlap(a,S,v){if(d.Assert(a.originalStart<=S.originalStart,"Left change is not less than or equal to right change"),d.Assert(a.modifiedStart<=S.modifiedStart,"Left change is not less than or equal to right change"),a.originalStart+a.originalLength>=S.originalStart||a.modifiedStart+a.modifiedLength>=S.modifiedStart){const C=a.originalStart;let n=a.originalLength;const r=a.modifiedStart;let m=a.modifiedLength;return a.originalStart+a.originalLength>=S.originalStart&&(n=S.originalStart+S.originalLength-a.originalStart),a.modifiedStart+a.modifiedLength>=S.modifiedStart&&(m=S.modifiedStart+S.modifiedLength-a.modifiedStart),v[0]=new p.DiffChange(C,n,r,m),!0}else return v[0]=null,!1}ClipDiagonalBound(a,S,v,C){if(a>=0&&afunction(){const N=Array.prototype.slice.call(arguments,0);return o(b,N)};let f={};for(const b of _)f[b]=i(b);return f}t.createProxyObject=r;function m(_){return _===null?void 0:_}t.withNullAsUndefined=m}),V(z[12],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.toUint32=t.toUint8=void 0;function p(E){return E<0?0:E>255?255:E|0}t.toUint8=p;function P(E){return E<0?0:E>4294967295?4294967295:E|0}t.toUint32=P}),V(z[13],G([0,1,2,20]),function(I,t,p,P){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uriToFsPath=t.URI=void 0;const E=/^\w[\w\d+.-]*$/,u=/^\//,d=/^\/\//;function l(c,g){if(!c.scheme&&g)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${c.authority}", path: "${c.path}", query: "${c.query}", fragment: "${c.fragment}"}`);if(c.scheme&&!E.test(c.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(c.path){if(c.authority){if(!u.test(c.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(d.test(c.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}function s(c,g){return!c&&!g?"file":c}function h(c,g){switch(c){case"https":case"http":case"file":g?g[0]!==a&&(g=a+g):g=a;break}return g}const w="",a="/",S=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class v{constructor(g,L,A,M,R,D=!1){typeof g=="object"?(this.scheme=g.scheme||w,this.authority=g.authority||w,this.path=g.path||w,this.query=g.query||w,this.fragment=g.fragment||w):(this.scheme=s(g,D),this.authority=L||w,this.path=h(this.scheme,A||w),this.query=M||w,this.fragment=R||w,l(this,D))}static isUri(g){return g instanceof v?!0:g?typeof g.authority=="string"&&typeof g.fragment=="string"&&typeof g.path=="string"&&typeof g.query=="string"&&typeof g.scheme=="string"&&typeof g.fsPath=="string"&&typeof g.with=="function"&&typeof g.toString=="function":!1}get fsPath(){return o(this,!1)}with(g){if(!g)return this;let{scheme:L,authority:A,path:M,query:R,fragment:D}=g;return L===void 0?L=this.scheme:L===null&&(L=w),A===void 0?A=this.authority:A===null&&(A=w),M===void 0?M=this.path:M===null&&(M=w),R===void 0?R=this.query:R===null&&(R=w),D===void 0?D=this.fragment:D===null&&(D=w),L===this.scheme&&A===this.authority&&M===this.path&&R===this.query&&D===this.fragment?this:new n(L,A,M,R,D)}static parse(g,L=!1){const A=S.exec(g);return A?new n(A[2]||w,N(A[4]||w),N(A[5]||w),N(A[7]||w),N(A[9]||w),L):new n(w,w,w,w,w)}static file(g){let L=w;if(p.isWindows&&(g=g.replace(/\\/g,a)),g[0]===a&&g[1]===a){const A=g.indexOf(a,2);A===-1?(L=g.substring(2),g=a):(L=g.substring(2,A),g=g.substring(A)||a)}return new n("file",L,g,w,w)}static from(g){return new n(g.scheme,g.authority,g.path,g.query,g.fragment)}static joinPath(g,...L){if(!g.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let A;return p.isWindows&&g.scheme==="file"?A=v.file(P.win32.join(o(g,!0),...L)).path:A=P.posix.join(g.path,...L),g.with({path:A})}toString(g=!1){return i(this,g)}toJSON(){return this}static revive(g){if(g){if(g instanceof v)return g;{const L=new n(g);return L._formatted=g.external,L._fsPath=g._sep===C?g.fsPath:null,L}}else return g}}t.URI=v;const C=p.isWindows?1:void 0;class n extends v{constructor(){super(...arguments);this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=o(this,!1)),this._fsPath}toString(g=!1){return g?i(this,!0):(this._formatted||(this._formatted=i(this,!1)),this._formatted)}toJSON(){const g={$mid:1};return this._fsPath&&(g.fsPath=this._fsPath,g._sep=C),this._formatted&&(g.external=this._formatted),this.path&&(g.path=this.path),this.scheme&&(g.scheme=this.scheme),this.authority&&(g.authority=this.authority),this.query&&(g.query=this.query),this.fragment&&(g.fragment=this.fragment),g}}const r={[58]:"%3A",[47]:"%2F",[63]:"%3F",[35]:"%23",[91]:"%5B",[93]:"%5D",[64]:"%40",[33]:"%21",[36]:"%24",[38]:"%26",[39]:"%27",[40]:"%28",[41]:"%29",[42]:"%2A",[43]:"%2B",[44]:"%2C",[59]:"%3B",[61]:"%3D",[32]:"%20"};function m(c,g){let L,A=-1;for(let M=0;M=97&&R<=122||R>=65&&R<=90||R>=48&&R<=57||R===45||R===46||R===95||R===126||g&&R===47)A!==-1&&(L+=encodeURIComponent(c.substring(A,M)),A=-1),L!==void 0&&(L+=c.charAt(M));else{L===void 0&&(L=c.substr(0,M));const D=r[R];D!==void 0?(A!==-1&&(L+=encodeURIComponent(c.substring(A,M)),A=-1),L+=D):A===-1&&(A=M)}}return A!==-1&&(L+=encodeURIComponent(c.substring(A))),L!==void 0?L:c}function _(c){let g;for(let L=0;L1&&c.scheme==="file"?L=`//${c.authority}${c.path}`:c.path.charCodeAt(0)===47&&(c.path.charCodeAt(1)>=65&&c.path.charCodeAt(1)<=90||c.path.charCodeAt(1)>=97&&c.path.charCodeAt(1)<=122)&&c.path.charCodeAt(2)===58?g?L=c.path.substr(1):L=c.path[1].toLowerCase()+c.path.substr(2):L=c.path,p.isWindows&&(L=L.replace(/\//g,"\\")),L}t.uriToFsPath=o;function i(c,g){const L=g?_:m;let A="",{scheme:M,authority:R,path:D,query:T,fragment:$}=c;if(M&&(A+=M,A+=":"),(R||M==="file")&&(A+=a,A+=a),R){let k=R.indexOf("@");if(k!==-1){const F=R.substr(0,k);R=R.substr(k+1),k=F.indexOf(":"),k===-1?A+=L(F,!1):(A+=L(F.substr(0,k),!1),A+=":",A+=L(F.substr(k+1),!1)),A+="@"}R=R.toLowerCase(),k=R.indexOf(":"),k===-1?A+=L(R,!1):(A+=L(R.substr(0,k),!1),A+=R.substr(k))}if(D){if(D.length>=3&&D.charCodeAt(0)===47&&D.charCodeAt(2)===58){const k=D.charCodeAt(1);k>=65&&k<=90&&(D=`/${String.fromCharCode(k+32)}:${D.substr(3)}`)}else if(D.length>=2&&D.charCodeAt(1)===58){const k=D.charCodeAt(0);k>=65&&k<=90&&(D=`${String.fromCharCode(k+32)}:${D.substr(2)}`)}A+=L(D,!0)}return T&&(A+="?",A+=L(T,!1)),$&&(A+="#",A+=g?$:m($,!1)),A}function f(c){try{return decodeURIComponent(c)}catch(g){return c.length>3?c.substr(0,3)+f(c.substr(3)):c}}const b=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function N(c){return c.match(b)?c.replace(b,g=>f(g)):c}}),V(z[34],G([0,1,4,7,2,11]),function(I,t,p,P,E,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.create=t.SimpleWorkerServer=t.SimpleWorkerClient=t.logOnceWebWorkerWarning=void 0;const d="$initialize";let l=!1;function s(v){!E.isWeb||(l||(l=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")),console.warn(v.message))}t.logOnceWebWorkerWarning=s;class h{constructor(C){this._workerId=-1,this._handler=C,this._lastSentReq=0,this._pendingReplies=Object.create(null)}setWorkerId(C){this._workerId=C}sendMessage(C,n){let r=String(++this._lastSentReq);return new Promise((m,_)=>{this._pendingReplies[r]={resolve:m,reject:_},this._send({vsWorker:this._workerId,req:r,method:C,args:n})})}handleMessage(C){!C||!C.vsWorker||this._workerId!==-1&&C.vsWorker!==this._workerId||this._handleMessage(C)}_handleMessage(C){if(C.seq){let _=C;if(!this._pendingReplies[_.seq]){console.warn("Got reply to unknown seq");return}let o=this._pendingReplies[_.seq];if(delete this._pendingReplies[_.seq],_.err){let i=_.err;_.err.$isError&&(i=new Error,i.name=_.err.name,i.message=_.err.message,i.stack=_.err.stack),o.reject(i);return}o.resolve(_.res);return}let n=C,r=n.req;this._handler.handleMessage(n.method,n.args).then(_=>{this._send({vsWorker:this._workerId,seq:r,res:_,err:void 0})},_=>{_.detail instanceof Error&&(_.detail=p.transformErrorForSerialization(_.detail)),this._send({vsWorker:this._workerId,seq:r,res:void 0,err:p.transformErrorForSerialization(_)})})}_send(C){let n=[];if(C.req){const r=C;for(let m=0;m{this._protocol.handleMessage(f)},f=>{m&&m(f)})),this._protocol=new h({sendMessage:(f,b)=>{this._worker.postMessage(f,b)},handleMessage:(f,b)=>{if(typeof r[f]!="function")return Promise.reject(new Error("Missing method "+f+" on main thread host."));try{return Promise.resolve(r[f].apply(r,b))}catch(N){return Promise.reject(N)}}}),this._protocol.setWorkerId(this._worker.getId());let _=null;typeof self.require!="undefined"&&typeof self.require.getConfig=="function"?_=self.require.getConfig():typeof self.requirejs!="undefined"&&(_=self.requirejs.s.contexts._.config);const o=u.getAllMethodNames(r);this._onModuleLoaded=this._protocol.sendMessage(d,[this._worker.getId(),JSON.parse(JSON.stringify(_)),n,o]);const i=(f,b)=>this._request(f,b);this._lazyProxy=new Promise((f,b)=>{m=b,this._onModuleLoaded.then(N=>{f(u.createProxyObject(N,i))},N=>{b(N),this._onError("Worker failed to load "+n,N)})})}getProxyObject(){return this._lazyProxy}_request(C,n){return new Promise((r,m)=>{this._onModuleLoaded.then(()=>{this._protocol.sendMessage(C,n).then(r,m)},m)})}_onError(C,n){console.error(C),console.info(n)}}t.SimpleWorkerClient=w;class a{constructor(C,n){this._requestHandlerFactory=n,this._requestHandler=null,this._protocol=new h({sendMessage:(r,m)=>{C(r,m)},handleMessage:(r,m)=>this._handleMessage(r,m)})}onmessage(C){this._protocol.handleMessage(C)}_handleMessage(C,n){if(C===d)return this.initialize(n[0],n[1],n[2],n[3]);if(!this._requestHandler||typeof this._requestHandler[C]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+C));try{return Promise.resolve(this._requestHandler[C].apply(this._requestHandler,n))}catch(r){return Promise.reject(r)}}initialize(C,n,r,m){this._protocol.setWorkerId(C);const _=(i,f)=>this._protocol.sendMessage(i,f),o=u.createProxyObject(m,_);return this._requestHandlerFactory?(this._requestHandler=this._requestHandlerFactory(o),Promise.resolve(u.getAllMethodNames(this._requestHandler))):(n&&(typeof n.baseUrl!="undefined"&&delete n.baseUrl,typeof n.paths!="undefined"&&typeof n.paths.vs!="undefined"&&delete n.paths.vs,typeof n.trustedTypesPolicy!==void 0&&delete n.trustedTypesPolicy,n.catchError=!0,self.require.config(n)),new Promise((i,f)=>{self.require([r],b=>{if(this._requestHandler=b.create(o),!this._requestHandler){f(new Error("No RequestHandler!"));return}i(u.getAllMethodNames(this._requestHandler))},f)}))}}t.SimpleWorkerServer=a;function S(v){return new a(v,null)}t.create=S}),V(z[23],G([0,1,12]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CharacterSet=t.CharacterClassifier=void 0;class P{constructor(d){let l=p.toUint8(d);this._defaultValue=l,this._asciiMap=P._createAsciiMap(l),this._map=new Map}static _createAsciiMap(d){let l=new Uint8Array(256);for(let s=0;s<256;s++)l[s]=d;return l}set(d,l){let s=p.toUint8(l);d>=0&&d<256?this._asciiMap[d]=s:this._map.set(d,s)}get(d){return d>=0&&d<256?this._asciiMap[d]:this._map.get(d)||this._defaultValue}}t.CharacterClassifier=P;class E{constructor(){this._actual=new P(0)}add(d){this._actual.set(d,1)}has(d){return this._actual.get(d)===1}}t.CharacterSet=E}),V(z[3],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Position=void 0;class p{constructor(E,u){this.lineNumber=E,this.column=u}with(E=this.lineNumber,u=this.column){return E===this.lineNumber&&u===this.column?this:new p(E,u)}delta(E=0,u=0){return this.with(this.lineNumber+E,this.column+u)}equals(E){return p.equals(this,E)}static equals(E,u){return!E&&!u?!0:!!E&&!!u&&E.lineNumber===u.lineNumber&&E.column===u.column}isBefore(E){return p.isBefore(this,E)}static isBefore(E,u){return E.lineNumberl||u===l&&d>s?(this.startLineNumber=l,this.startColumn=s,this.endLineNumber=u,this.endColumn=d):(this.startLineNumber=u,this.startColumn=d,this.endLineNumber=l,this.endColumn=s)}isEmpty(){return P.isEmpty(this)}static isEmpty(u){return u.startLineNumber===u.endLineNumber&&u.startColumn===u.endColumn}containsPosition(u){return P.containsPosition(this,u)}static containsPosition(u,d){return!(d.lineNumberu.endLineNumber||d.lineNumber===u.startLineNumber&&d.columnu.endColumn)}containsRange(u){return P.containsRange(this,u)}static containsRange(u,d){return!(d.startLineNumberu.endLineNumber||d.endLineNumber>u.endLineNumber||d.startLineNumber===u.startLineNumber&&d.startColumnu.endColumn)}strictContainsRange(u){return P.strictContainsRange(this,u)}static strictContainsRange(u,d){return!(d.startLineNumberu.endLineNumber||d.endLineNumber>u.endLineNumber||d.startLineNumber===u.startLineNumber&&d.startColumn<=u.startColumn||d.endLineNumber===u.endLineNumber&&d.endColumn>=u.endColumn)}plusRange(u){return P.plusRange(this,u)}static plusRange(u,d){let l,s,h,w;return d.startLineNumberu.endLineNumber?(h=d.endLineNumber,w=d.endColumn):d.endLineNumber===u.endLineNumber?(h=d.endLineNumber,w=Math.max(d.endColumn,u.endColumn)):(h=u.endLineNumber,w=u.endColumn),new P(l,s,h,w)}intersectRanges(u){return P.intersectRanges(this,u)}static intersectRanges(u,d){let l=u.startLineNumber,s=u.startColumn,h=u.endLineNumber,w=u.endColumn,a=d.startLineNumber,S=d.startColumn,v=d.endLineNumber,C=d.endColumn;return lv?(h=v,w=C):h===v&&(w=Math.min(w,C)),l>h||l===h&&s>w?null:new P(l,s,h,w)}equalsRange(u){return P.equalsRange(this,u)}static equalsRange(u,d){return!!u&&!!d&&u.startLineNumber===d.startLineNumber&&u.startColumn===d.startColumn&&u.endLineNumber===d.endLineNumber&&u.endColumn===d.endColumn}getEndPosition(){return P.getEndPosition(this)}static getEndPosition(u){return new p.Position(u.endLineNumber,u.endColumn)}getStartPosition(){return P.getStartPosition(this)}static getStartPosition(u){return new p.Position(u.startLineNumber,u.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(u,d){return new P(this.startLineNumber,this.startColumn,u,d)}setStartPosition(u,d){return new P(u,d,this.endLineNumber,this.endColumn)}collapseToStart(){return P.collapseToStart(this)}static collapseToStart(u){return new P(u.startLineNumber,u.startColumn,u.startLineNumber,u.startColumn)}static fromPositions(u,d=u){return new P(u.lineNumber,u.column,d.lineNumber,d.column)}static lift(u){return u?new P(u.startLineNumber,u.startColumn,u.endLineNumber,u.endColumn):null}static isIRange(u){return u&&typeof u.startLineNumber=="number"&&typeof u.startColumn=="number"&&typeof u.endLineNumber=="number"&&typeof u.endColumn=="number"}static areIntersectingOrTouching(u,d){return!(u.endLineNumberu.startLineNumber}}t.Range=P}),V(z[24],G([0,1,3,6]),function(I,t,p,P){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Selection=void 0;class E extends P.Range{constructor(d,l,s,h){super(d,l,s,h);this.selectionStartLineNumber=d,this.selectionStartColumn=l,this.positionLineNumber=s,this.positionColumn=h}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(d){return E.selectionsEqual(this,d)}static selectionsEqual(d,l){return d.selectionStartLineNumber===l.selectionStartLineNumber&&d.selectionStartColumn===l.selectionStartColumn&&d.positionLineNumber===l.positionLineNumber&&d.positionColumn===l.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(d,l){return this.getDirection()===0?new E(this.startLineNumber,this.startColumn,d,l):new E(d,l,this.startLineNumber,this.startColumn)}getPosition(){return new p.Position(this.positionLineNumber,this.positionColumn)}setStartPosition(d,l){return this.getDirection()===0?new E(d,l,this.endLineNumber,this.endColumn):new E(this.endLineNumber,this.endColumn,d,l)}static fromPositions(d,l=d){return new E(d.lineNumber,d.column,l.lineNumber,l.column)}static liftSelection(d){return new E(d.selectionStartLineNumber,d.selectionStartColumn,d.positionLineNumber,d.positionColumn)}static selectionsArrEqual(d,l){if(d&&!l||!d&&l)return!1;if(!d&&!l)return!0;if(d.length!==l.length)return!1;for(let s=0,h=d.length;s0&&m.originalLength<20&&m.modifiedLength>0&&m.modifiedLength<20&&i()){const M=_.createCharSequence(r,m.originalStart,m.originalStart+m.originalLength-1),R=o.createCharSequence(r,m.modifiedStart,m.modifiedStart+m.modifiedLength-1);let D=u(M,R,i,!0).changes;b&&(D=h(D)),A=[];for(let T=0,$=D.length;T<$;T++)A.push(s.createFromDiffChange(D[T],M,R))}return new w(N,c,g,L,A)}}class a{constructor(r,m,_){this.shouldComputeCharChanges=_.shouldComputeCharChanges,this.shouldPostProcessCharChanges=_.shouldPostProcessCharChanges,this.shouldIgnoreTrimWhitespace=_.shouldIgnoreTrimWhitespace,this.shouldMakePrettyDiff=_.shouldMakePrettyDiff,this.originalLines=r,this.modifiedLines=m,this.original=new d(r),this.modified=new d(m),this.continueLineDiff=C(_.maxComputationTime),this.continueCharDiff=C(_.maxComputationTime===0?0:Math.min(_.maxComputationTime,5e3))}computeDiff(){if(this.original.lines.length===1&&this.original.lines[0].length===0)return this.modified.lines.length===1&&this.modified.lines[0].length===0?{quitEarly:!1,changes:[]}:{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:1,modifiedStartLineNumber:1,modifiedEndLineNumber:this.modified.lines.length,charChanges:[{modifiedEndColumn:0,modifiedEndLineNumber:0,modifiedStartColumn:0,modifiedStartLineNumber:0,originalEndColumn:0,originalEndLineNumber:0,originalStartColumn:0,originalStartLineNumber:0}]}]};if(this.modified.lines.length===1&&this.modified.lines[0].length===0)return{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:this.original.lines.length,modifiedStartLineNumber:1,modifiedEndLineNumber:1,charChanges:[{modifiedEndColumn:0,modifiedEndLineNumber:0,modifiedStartColumn:0,modifiedStartLineNumber:0,originalEndColumn:0,originalEndLineNumber:0,originalStartColumn:0,originalStartLineNumber:0}]}]};const r=u(this.original,this.modified,this.continueLineDiff,this.shouldMakePrettyDiff),m=r.changes,_=r.quitEarly;if(this.shouldIgnoreTrimWhitespace){const b=[];for(let N=0,c=m.length;N1&&D>1;){const T=A.charCodeAt(R-2),$=M.charCodeAt(D-2);if(T!==$)break;R--,D--}(R>1||D>1)&&this._pushTrimWhitespaceCharChange(o,i+1,1,R,f+1,1,D)}{let R=v(A,1),D=v(M,1);const T=A.length+1,$=M.length+1;for(;R!0;const r=Date.now();return()=>Date.now()-r/?";function p(l=""){let s="(-?\\d*\\.\\d\\w*)|([^";for(const h of t.USUAL_WORD_SEPARATORS)l.indexOf(h)>=0||(s+="\\"+h);return s+="\\s]+)",new RegExp(s,"g")}t.DEFAULT_WORD_REGEXP=p();function P(l){let s=t.DEFAULT_WORD_REGEXP;if(l&&l instanceof RegExp)if(l.global)s=l;else{let h="g";l.ignoreCase&&(h+="i"),l.multiline&&(h+="m"),l.unicode&&(h+="u"),s=new RegExp(l.source,h)}return s.lastIndex=0,s}t.ensureValidWordDefinition=P;const E={maxLen:1e3,windowSize:15,timeBudget:150};function u(l,s,h,w,a=E){if(h.length>a.maxLen){let r=l-a.maxLen/2;return r<0?r=0:w+=r,h=h.substring(r,l+a.maxLen/2),u(l,s,h,w,a)}const S=Date.now(),v=l-1-w;let C=-1,n=null;for(let r=1;!(Date.now()-S>=a.timeBudget);r++){const m=v-a.windowSize*r;s.lastIndex=Math.max(0,m);const _=d(s,h,v,C);if(!_&&n||(n=_,m<=0))break;C=m}if(n){let r={word:n[0],startColumn:w+1+n.index,endColumn:w+1+n.index+n[0].length};return s.lastIndex=0,r}return null}t.getWordAtText=u;function d(l,s,h,w){let a;for(;a=l.exec(s);){const S=a.index||0;if(S<=h&&l.lastIndex>=h)return a;if(w>0&&S>w)return null}return null}}),V(z[28],G([0,1,23]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.computeLinks=t.LinkComputer=t.StateMachine=t.Uint8Matrix=void 0;class P{constructor(S,v,C){const n=new Uint8Array(S*v);for(let r=0,m=S*v;rv&&(v=o),_>C&&(C=_),i>C&&(C=i)}v++,C++;let n=new P(C,v,0);for(let r=0,m=S.length;r=this._maxCharCode?0:this._states.get(S,v)}}t.StateMachine=E;let u=null;function d(){return u===null&&(u=new E([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),u}let l=null;function s(){if(l===null){l=new p.CharacterClassifier(0);const a=` <>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u3011\u300F\u300D\u300B\u3009\u201D\u2019\uFF40\uFF5E\u2026`;for(let v=0;vn);if(n>0){const _=v.charCodeAt(n-1),o=v.charCodeAt(m);(_===40&&o===41||_===91&&o===93||_===123&&o===125)&&m--}return{range:{startLineNumber:C,startColumn:n+1,endLineNumber:C,endColumn:m+2},url:v.substring(n,m+1)}}static computeLinks(S,v=d()){const C=s();let n=[];for(let r=1,m=S.getLineCount();r<=m;r++){const _=S.getLineContent(r),o=_.length;let i=0,f=0,b=0,N=1,c=!1,g=!1,L=!1,A=!1;for(;i=0?(l+=d?1:-1,l<0?l=E.length-1:l%=E.length,E[l]):null}}t.BasicInplaceReplace=p,p.INSTANCE=new p}),V(z[30],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WrappingIndent=t.TrackedRangeStickiness=t.TextEditorCursorStyle=t.TextEditorCursorBlinkingStyle=t.SymbolTag=t.SymbolKind=t.SignatureHelpTriggerKind=t.SelectionDirection=t.ScrollbarVisibility=t.ScrollType=t.RenderMinimap=t.RenderLineNumbersType=t.OverviewRulerLane=t.OverlayWidgetPositionPreference=t.MouseTargetType=t.MinimapPosition=t.MarkerTag=t.MarkerSeverity=t.KeyCode=t.InlineHintKind=t.IndentAction=t.EndOfLineSequence=t.EndOfLinePreference=t.EditorOption=t.EditorAutoIndentStrategy=t.DocumentHighlightKind=t.DefaultEndOfLine=t.CursorChangeReason=t.ContentWidgetPositionPreference=t.CompletionTriggerKind=t.CompletionItemTag=t.CompletionItemKind=t.CompletionItemInsertTextRule=t.AccessibilitySupport=void 0;var p;(function(e){e[e.Unknown=0]="Unknown",e[e.Disabled=1]="Disabled",e[e.Enabled=2]="Enabled"})(p=t.AccessibilitySupport||(t.AccessibilitySupport={}));var P;(function(e){e[e.KeepWhitespace=1]="KeepWhitespace",e[e.InsertAsSnippet=4]="InsertAsSnippet"})(P=t.CompletionItemInsertTextRule||(t.CompletionItemInsertTextRule={}));var E;(function(e){e[e.Method=0]="Method",e[e.Function=1]="Function",e[e.Constructor=2]="Constructor",e[e.Field=3]="Field",e[e.Variable=4]="Variable",e[e.Class=5]="Class",e[e.Struct=6]="Struct",e[e.Interface=7]="Interface",e[e.Module=8]="Module",e[e.Property=9]="Property",e[e.Event=10]="Event",e[e.Operator=11]="Operator",e[e.Unit=12]="Unit",e[e.Value=13]="Value",e[e.Constant=14]="Constant",e[e.Enum=15]="Enum",e[e.EnumMember=16]="EnumMember",e[e.Keyword=17]="Keyword",e[e.Text=18]="Text",e[e.Color=19]="Color",e[e.File=20]="File",e[e.Reference=21]="Reference",e[e.Customcolor=22]="Customcolor",e[e.Folder=23]="Folder",e[e.TypeParameter=24]="TypeParameter",e[e.User=25]="User",e[e.Issue=26]="Issue",e[e.Snippet=27]="Snippet"})(E=t.CompletionItemKind||(t.CompletionItemKind={}));var u;(function(e){e[e.Deprecated=1]="Deprecated"})(u=t.CompletionItemTag||(t.CompletionItemTag={}));var d;(function(e){e[e.Invoke=0]="Invoke",e[e.TriggerCharacter=1]="TriggerCharacter",e[e.TriggerForIncompleteCompletions=2]="TriggerForIncompleteCompletions"})(d=t.CompletionTriggerKind||(t.CompletionTriggerKind={}));var l;(function(e){e[e.EXACT=0]="EXACT",e[e.ABOVE=1]="ABOVE",e[e.BELOW=2]="BELOW"})(l=t.ContentWidgetPositionPreference||(t.ContentWidgetPositionPreference={}));var s;(function(e){e[e.NotSet=0]="NotSet",e[e.ContentFlush=1]="ContentFlush",e[e.RecoverFromMarkers=2]="RecoverFromMarkers",e[e.Explicit=3]="Explicit",e[e.Paste=4]="Paste",e[e.Undo=5]="Undo",e[e.Redo=6]="Redo"})(s=t.CursorChangeReason||(t.CursorChangeReason={}));var h;(function(e){e[e.LF=1]="LF",e[e.CRLF=2]="CRLF"})(h=t.DefaultEndOfLine||(t.DefaultEndOfLine={}));var w;(function(e){e[e.Text=0]="Text",e[e.Read=1]="Read",e[e.Write=2]="Write"})(w=t.DocumentHighlightKind||(t.DocumentHighlightKind={}));var a;(function(e){e[e.None=0]="None",e[e.Keep=1]="Keep",e[e.Brackets=2]="Brackets",e[e.Advanced=3]="Advanced",e[e.Full=4]="Full"})(a=t.EditorAutoIndentStrategy||(t.EditorAutoIndentStrategy={}));var S;(function(e){e[e.acceptSuggestionOnCommitCharacter=0]="acceptSuggestionOnCommitCharacter",e[e.acceptSuggestionOnEnter=1]="acceptSuggestionOnEnter",e[e.accessibilitySupport=2]="accessibilitySupport",e[e.accessibilityPageSize=3]="accessibilityPageSize",e[e.ariaLabel=4]="ariaLabel",e[e.autoClosingBrackets=5]="autoClosingBrackets",e[e.autoClosingOvertype=6]="autoClosingOvertype",e[e.autoClosingQuotes=7]="autoClosingQuotes",e[e.autoIndent=8]="autoIndent",e[e.automaticLayout=9]="automaticLayout",e[e.autoSurround=10]="autoSurround",e[e.codeLens=11]="codeLens",e[e.codeLensFontFamily=12]="codeLensFontFamily",e[e.codeLensFontSize=13]="codeLensFontSize",e[e.colorDecorators=14]="colorDecorators",e[e.columnSelection=15]="columnSelection",e[e.comments=16]="comments",e[e.contextmenu=17]="contextmenu",e[e.copyWithSyntaxHighlighting=18]="copyWithSyntaxHighlighting",e[e.cursorBlinking=19]="cursorBlinking",e[e.cursorSmoothCaretAnimation=20]="cursorSmoothCaretAnimation",e[e.cursorStyle=21]="cursorStyle",e[e.cursorSurroundingLines=22]="cursorSurroundingLines",e[e.cursorSurroundingLinesStyle=23]="cursorSurroundingLinesStyle",e[e.cursorWidth=24]="cursorWidth",e[e.disableLayerHinting=25]="disableLayerHinting",e[e.disableMonospaceOptimizations=26]="disableMonospaceOptimizations",e[e.dragAndDrop=27]="dragAndDrop",e[e.emptySelectionClipboard=28]="emptySelectionClipboard",e[e.extraEditorClassName=29]="extraEditorClassName",e[e.fastScrollSensitivity=30]="fastScrollSensitivity",e[e.find=31]="find",e[e.fixedOverflowWidgets=32]="fixedOverflowWidgets",e[e.folding=33]="folding",e[e.foldingStrategy=34]="foldingStrategy",e[e.foldingHighlight=35]="foldingHighlight",e[e.unfoldOnClickAfterEndOfLine=36]="unfoldOnClickAfterEndOfLine",e[e.fontFamily=37]="fontFamily",e[e.fontInfo=38]="fontInfo",e[e.fontLigatures=39]="fontLigatures",e[e.fontSize=40]="fontSize",e[e.fontWeight=41]="fontWeight",e[e.formatOnPaste=42]="formatOnPaste",e[e.formatOnType=43]="formatOnType",e[e.glyphMargin=44]="glyphMargin",e[e.gotoLocation=45]="gotoLocation",e[e.hideCursorInOverviewRuler=46]="hideCursorInOverviewRuler",e[e.highlightActiveIndentGuide=47]="highlightActiveIndentGuide",e[e.hover=48]="hover",e[e.inDiffEditor=49]="inDiffEditor",e[e.letterSpacing=50]="letterSpacing",e[e.lightbulb=51]="lightbulb",e[e.lineDecorationsWidth=52]="lineDecorationsWidth",e[e.lineHeight=53]="lineHeight",e[e.lineNumbers=54]="lineNumbers",e[e.lineNumbersMinChars=55]="lineNumbersMinChars",e[e.linkedEditing=56]="linkedEditing",e[e.links=57]="links",e[e.matchBrackets=58]="matchBrackets",e[e.minimap=59]="minimap",e[e.mouseStyle=60]="mouseStyle",e[e.mouseWheelScrollSensitivity=61]="mouseWheelScrollSensitivity",e[e.mouseWheelZoom=62]="mouseWheelZoom",e[e.multiCursorMergeOverlapping=63]="multiCursorMergeOverlapping",e[e.multiCursorModifier=64]="multiCursorModifier",e[e.multiCursorPaste=65]="multiCursorPaste",e[e.occurrencesHighlight=66]="occurrencesHighlight",e[e.overviewRulerBorder=67]="overviewRulerBorder",e[e.overviewRulerLanes=68]="overviewRulerLanes",e[e.padding=69]="padding",e[e.parameterHints=70]="parameterHints",e[e.peekWidgetDefaultFocus=71]="peekWidgetDefaultFocus",e[e.definitionLinkOpensInPeek=72]="definitionLinkOpensInPeek",e[e.quickSuggestions=73]="quickSuggestions",e[e.quickSuggestionsDelay=74]="quickSuggestionsDelay",e[e.readOnly=75]="readOnly",e[e.renameOnType=76]="renameOnType",e[e.renderControlCharacters=77]="renderControlCharacters",e[e.renderIndentGuides=78]="renderIndentGuides",e[e.renderFinalNewline=79]="renderFinalNewline",e[e.renderLineHighlight=80]="renderLineHighlight",e[e.renderLineHighlightOnlyWhenFocus=81]="renderLineHighlightOnlyWhenFocus",e[e.renderValidationDecorations=82]="renderValidationDecorations",e[e.renderWhitespace=83]="renderWhitespace",e[e.revealHorizontalRightPadding=84]="revealHorizontalRightPadding",e[e.roundedSelection=85]="roundedSelection",e[e.rulers=86]="rulers",e[e.scrollbar=87]="scrollbar",e[e.scrollBeyondLastColumn=88]="scrollBeyondLastColumn",e[e.scrollBeyondLastLine=89]="scrollBeyondLastLine",e[e.scrollPredominantAxis=90]="scrollPredominantAxis",e[e.selectionClipboard=91]="selectionClipboard",e[e.selectionHighlight=92]="selectionHighlight",e[e.selectOnLineNumbers=93]="selectOnLineNumbers",e[e.showFoldingControls=94]="showFoldingControls",e[e.showUnused=95]="showUnused",e[e.snippetSuggestions=96]="snippetSuggestions",e[e.smartSelect=97]="smartSelect",e[e.smoothScrolling=98]="smoothScrolling",e[e.stickyTabStops=99]="stickyTabStops",e[e.stopRenderingLineAfter=100]="stopRenderingLineAfter",e[e.suggest=101]="suggest",e[e.suggestFontSize=102]="suggestFontSize",e[e.suggestLineHeight=103]="suggestLineHeight",e[e.suggestOnTriggerCharacters=104]="suggestOnTriggerCharacters",e[e.suggestSelection=105]="suggestSelection",e[e.tabCompletion=106]="tabCompletion",e[e.tabIndex=107]="tabIndex",e[e.unusualLineTerminators=108]="unusualLineTerminators",e[e.useTabStops=109]="useTabStops",e[e.wordSeparators=110]="wordSeparators",e[e.wordWrap=111]="wordWrap",e[e.wordWrapBreakAfterCharacters=112]="wordWrapBreakAfterCharacters",e[e.wordWrapBreakBeforeCharacters=113]="wordWrapBreakBeforeCharacters",e[e.wordWrapColumn=114]="wordWrapColumn",e[e.wordWrapOverride1=115]="wordWrapOverride1",e[e.wordWrapOverride2=116]="wordWrapOverride2",e[e.wrappingIndent=117]="wrappingIndent",e[e.wrappingStrategy=118]="wrappingStrategy",e[e.showDeprecated=119]="showDeprecated",e[e.inlineHints=120]="inlineHints",e[e.editorClassName=121]="editorClassName",e[e.pixelRatio=122]="pixelRatio",e[e.tabFocusMode=123]="tabFocusMode",e[e.layoutInfo=124]="layoutInfo",e[e.wrappingInfo=125]="wrappingInfo"})(S=t.EditorOption||(t.EditorOption={}));var v;(function(e){e[e.TextDefined=0]="TextDefined",e[e.LF=1]="LF",e[e.CRLF=2]="CRLF"})(v=t.EndOfLinePreference||(t.EndOfLinePreference={}));var C;(function(e){e[e.LF=0]="LF",e[e.CRLF=1]="CRLF"})(C=t.EndOfLineSequence||(t.EndOfLineSequence={}));var n;(function(e){e[e.None=0]="None",e[e.Indent=1]="Indent",e[e.IndentOutdent=2]="IndentOutdent",e[e.Outdent=3]="Outdent"})(n=t.IndentAction||(t.IndentAction={}));var r;(function(e){e[e.Other=0]="Other",e[e.Type=1]="Type",e[e.Parameter=2]="Parameter"})(r=t.InlineHintKind||(t.InlineHintKind={}));var m;(function(e){e[e.Unknown=0]="Unknown",e[e.Backspace=1]="Backspace",e[e.Tab=2]="Tab",e[e.Enter=3]="Enter",e[e.Shift=4]="Shift",e[e.Ctrl=5]="Ctrl",e[e.Alt=6]="Alt",e[e.PauseBreak=7]="PauseBreak",e[e.CapsLock=8]="CapsLock",e[e.Escape=9]="Escape",e[e.Space=10]="Space",e[e.PageUp=11]="PageUp",e[e.PageDown=12]="PageDown",e[e.End=13]="End",e[e.Home=14]="Home",e[e.LeftArrow=15]="LeftArrow",e[e.UpArrow=16]="UpArrow",e[e.RightArrow=17]="RightArrow",e[e.DownArrow=18]="DownArrow",e[e.Insert=19]="Insert",e[e.Delete=20]="Delete",e[e.KEY_0=21]="KEY_0",e[e.KEY_1=22]="KEY_1",e[e.KEY_2=23]="KEY_2",e[e.KEY_3=24]="KEY_3",e[e.KEY_4=25]="KEY_4",e[e.KEY_5=26]="KEY_5",e[e.KEY_6=27]="KEY_6",e[e.KEY_7=28]="KEY_7",e[e.KEY_8=29]="KEY_8",e[e.KEY_9=30]="KEY_9",e[e.KEY_A=31]="KEY_A",e[e.KEY_B=32]="KEY_B",e[e.KEY_C=33]="KEY_C",e[e.KEY_D=34]="KEY_D",e[e.KEY_E=35]="KEY_E",e[e.KEY_F=36]="KEY_F",e[e.KEY_G=37]="KEY_G",e[e.KEY_H=38]="KEY_H",e[e.KEY_I=39]="KEY_I",e[e.KEY_J=40]="KEY_J",e[e.KEY_K=41]="KEY_K",e[e.KEY_L=42]="KEY_L",e[e.KEY_M=43]="KEY_M",e[e.KEY_N=44]="KEY_N",e[e.KEY_O=45]="KEY_O",e[e.KEY_P=46]="KEY_P",e[e.KEY_Q=47]="KEY_Q",e[e.KEY_R=48]="KEY_R",e[e.KEY_S=49]="KEY_S",e[e.KEY_T=50]="KEY_T",e[e.KEY_U=51]="KEY_U",e[e.KEY_V=52]="KEY_V",e[e.KEY_W=53]="KEY_W",e[e.KEY_X=54]="KEY_X",e[e.KEY_Y=55]="KEY_Y",e[e.KEY_Z=56]="KEY_Z",e[e.Meta=57]="Meta",e[e.ContextMenu=58]="ContextMenu",e[e.F1=59]="F1",e[e.F2=60]="F2",e[e.F3=61]="F3",e[e.F4=62]="F4",e[e.F5=63]="F5",e[e.F6=64]="F6",e[e.F7=65]="F7",e[e.F8=66]="F8",e[e.F9=67]="F9",e[e.F10=68]="F10",e[e.F11=69]="F11",e[e.F12=70]="F12",e[e.F13=71]="F13",e[e.F14=72]="F14",e[e.F15=73]="F15",e[e.F16=74]="F16",e[e.F17=75]="F17",e[e.F18=76]="F18",e[e.F19=77]="F19",e[e.NumLock=78]="NumLock",e[e.ScrollLock=79]="ScrollLock",e[e.US_SEMICOLON=80]="US_SEMICOLON",e[e.US_EQUAL=81]="US_EQUAL",e[e.US_COMMA=82]="US_COMMA",e[e.US_MINUS=83]="US_MINUS",e[e.US_DOT=84]="US_DOT",e[e.US_SLASH=85]="US_SLASH",e[e.US_BACKTICK=86]="US_BACKTICK",e[e.US_OPEN_SQUARE_BRACKET=87]="US_OPEN_SQUARE_BRACKET",e[e.US_BACKSLASH=88]="US_BACKSLASH",e[e.US_CLOSE_SQUARE_BRACKET=89]="US_CLOSE_SQUARE_BRACKET",e[e.US_QUOTE=90]="US_QUOTE",e[e.OEM_8=91]="OEM_8",e[e.OEM_102=92]="OEM_102",e[e.NUMPAD_0=93]="NUMPAD_0",e[e.NUMPAD_1=94]="NUMPAD_1",e[e.NUMPAD_2=95]="NUMPAD_2",e[e.NUMPAD_3=96]="NUMPAD_3",e[e.NUMPAD_4=97]="NUMPAD_4",e[e.NUMPAD_5=98]="NUMPAD_5",e[e.NUMPAD_6=99]="NUMPAD_6",e[e.NUMPAD_7=100]="NUMPAD_7",e[e.NUMPAD_8=101]="NUMPAD_8",e[e.NUMPAD_9=102]="NUMPAD_9",e[e.NUMPAD_MULTIPLY=103]="NUMPAD_MULTIPLY",e[e.NUMPAD_ADD=104]="NUMPAD_ADD",e[e.NUMPAD_SEPARATOR=105]="NUMPAD_SEPARATOR",e[e.NUMPAD_SUBTRACT=106]="NUMPAD_SUBTRACT",e[e.NUMPAD_DECIMAL=107]="NUMPAD_DECIMAL",e[e.NUMPAD_DIVIDE=108]="NUMPAD_DIVIDE",e[e.KEY_IN_COMPOSITION=109]="KEY_IN_COMPOSITION",e[e.ABNT_C1=110]="ABNT_C1",e[e.ABNT_C2=111]="ABNT_C2",e[e.MAX_VALUE=112]="MAX_VALUE"})(m=t.KeyCode||(t.KeyCode={}));var _;(function(e){e[e.Hint=1]="Hint",e[e.Info=2]="Info",e[e.Warning=4]="Warning",e[e.Error=8]="Error"})(_=t.MarkerSeverity||(t.MarkerSeverity={}));var o;(function(e){e[e.Unnecessary=1]="Unnecessary",e[e.Deprecated=2]="Deprecated"})(o=t.MarkerTag||(t.MarkerTag={}));var i;(function(e){e[e.Inline=1]="Inline",e[e.Gutter=2]="Gutter"})(i=t.MinimapPosition||(t.MinimapPosition={}));var f;(function(e){e[e.UNKNOWN=0]="UNKNOWN",e[e.TEXTAREA=1]="TEXTAREA",e[e.GUTTER_GLYPH_MARGIN=2]="GUTTER_GLYPH_MARGIN",e[e.GUTTER_LINE_NUMBERS=3]="GUTTER_LINE_NUMBERS",e[e.GUTTER_LINE_DECORATIONS=4]="GUTTER_LINE_DECORATIONS",e[e.GUTTER_VIEW_ZONE=5]="GUTTER_VIEW_ZONE",e[e.CONTENT_TEXT=6]="CONTENT_TEXT",e[e.CONTENT_EMPTY=7]="CONTENT_EMPTY",e[e.CONTENT_VIEW_ZONE=8]="CONTENT_VIEW_ZONE",e[e.CONTENT_WIDGET=9]="CONTENT_WIDGET",e[e.OVERVIEW_RULER=10]="OVERVIEW_RULER",e[e.SCROLLBAR=11]="SCROLLBAR",e[e.OVERLAY_WIDGET=12]="OVERLAY_WIDGET",e[e.OUTSIDE_EDITOR=13]="OUTSIDE_EDITOR"})(f=t.MouseTargetType||(t.MouseTargetType={}));var b;(function(e){e[e.TOP_RIGHT_CORNER=0]="TOP_RIGHT_CORNER",e[e.BOTTOM_RIGHT_CORNER=1]="BOTTOM_RIGHT_CORNER",e[e.TOP_CENTER=2]="TOP_CENTER"})(b=t.OverlayWidgetPositionPreference||(t.OverlayWidgetPositionPreference={}));var N;(function(e){e[e.Left=1]="Left",e[e.Center=2]="Center",e[e.Right=4]="Right",e[e.Full=7]="Full"})(N=t.OverviewRulerLane||(t.OverviewRulerLane={}));var c;(function(e){e[e.Off=0]="Off",e[e.On=1]="On",e[e.Relative=2]="Relative",e[e.Interval=3]="Interval",e[e.Custom=4]="Custom"})(c=t.RenderLineNumbersType||(t.RenderLineNumbersType={}));var g;(function(e){e[e.None=0]="None",e[e.Text=1]="Text",e[e.Blocks=2]="Blocks"})(g=t.RenderMinimap||(t.RenderMinimap={}));var L;(function(e){e[e.Smooth=0]="Smooth",e[e.Immediate=1]="Immediate"})(L=t.ScrollType||(t.ScrollType={}));var A;(function(e){e[e.Auto=1]="Auto",e[e.Hidden=2]="Hidden",e[e.Visible=3]="Visible"})(A=t.ScrollbarVisibility||(t.ScrollbarVisibility={}));var M;(function(e){e[e.LTR=0]="LTR",e[e.RTL=1]="RTL"})(M=t.SelectionDirection||(t.SelectionDirection={}));var R;(function(e){e[e.Invoke=1]="Invoke",e[e.TriggerCharacter=2]="TriggerCharacter",e[e.ContentChange=3]="ContentChange"})(R=t.SignatureHelpTriggerKind||(t.SignatureHelpTriggerKind={}));var D;(function(e){e[e.File=0]="File",e[e.Module=1]="Module",e[e.Namespace=2]="Namespace",e[e.Package=3]="Package",e[e.Class=4]="Class",e[e.Method=5]="Method",e[e.Property=6]="Property",e[e.Field=7]="Field",e[e.Constructor=8]="Constructor",e[e.Enum=9]="Enum",e[e.Interface=10]="Interface",e[e.Function=11]="Function",e[e.Variable=12]="Variable",e[e.Constant=13]="Constant",e[e.String=14]="String",e[e.Number=15]="Number",e[e.Boolean=16]="Boolean",e[e.Array=17]="Array",e[e.Object=18]="Object",e[e.Key=19]="Key",e[e.Null=20]="Null",e[e.EnumMember=21]="EnumMember",e[e.Struct=22]="Struct",e[e.Event=23]="Event",e[e.Operator=24]="Operator",e[e.TypeParameter=25]="TypeParameter"})(D=t.SymbolKind||(t.SymbolKind={}));var T;(function(e){e[e.Deprecated=1]="Deprecated"})(T=t.SymbolTag||(t.SymbolTag={}));var $;(function(e){e[e.Hidden=0]="Hidden",e[e.Blink=1]="Blink",e[e.Smooth=2]="Smooth",e[e.Phase=3]="Phase",e[e.Expand=4]="Expand",e[e.Solid=5]="Solid"})($=t.TextEditorCursorBlinkingStyle||(t.TextEditorCursorBlinkingStyle={}));var k;(function(e){e[e.Line=1]="Line",e[e.Block=2]="Block",e[e.Underline=3]="Underline",e[e.LineThin=4]="LineThin",e[e.BlockOutline=5]="BlockOutline",e[e.UnderlineThin=6]="UnderlineThin"})(k=t.TextEditorCursorStyle||(t.TextEditorCursorStyle={}));var F;(function(e){e[e.AlwaysGrowsWhenTypingAtEdges=0]="AlwaysGrowsWhenTypingAtEdges",e[e.NeverGrowsWhenTypingAtEdges=1]="NeverGrowsWhenTypingAtEdges",e[e.GrowsOnlyWhenTypingBefore=2]="GrowsOnlyWhenTypingBefore",e[e.GrowsOnlyWhenTypingAfter=3]="GrowsOnlyWhenTypingAfter"})(F=t.TrackedRangeStickiness||(t.TrackedRangeStickiness={}));var O;(function(e){e[e.None=0]="None",e[e.Same=1]="Same",e[e.Indent=2]="Indent",e[e.DeepIndent=3]="DeepIndent"})(O=t.WrappingIndent||(t.WrappingIndent={}))}),V(z[31],G([0,1,21,9,17,13,3,6,24,25,30]),function(I,t,p,P,E,u,d,l,s,h,w){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createMonacoBaseAPI=t.KeyMod=void 0;class a{static chord(C,n){return E.KeyChord(C,n)}}t.KeyMod=a,a.CtrlCmd=2048,a.Shift=1024,a.Alt=512,a.WinCtrl=256;function S(){return{editor:void 0,languages:void 0,CancellationTokenSource:p.CancellationTokenSource,Emitter:P.Emitter,KeyCode:w.KeyCode,KeyMod:a,Position:d.Position,Range:l.Range,Selection:s.Selection,SelectionDirection:w.SelectionDirection,MarkerSeverity:w.MarkerSeverity,MarkerTag:w.MarkerTag,Uri:u.URI,Token:h.Token}}t.createMonacoBaseAPI=S}),V(z[32],G([0,1,12]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PrefixSumComputer=t.PrefixSumIndexOfResult=void 0;class P{constructor(d,l){this.index=d,this.remainder=l}}t.PrefixSumIndexOfResult=P;class E{constructor(d){this.values=d,this.prefixSum=new Uint32Array(d.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(d,l){d=p.toUint32(d);const s=this.values,h=this.prefixSum,w=l.length;return w===0?!1:(this.values=new Uint32Array(s.length+w),this.values.set(s.subarray(0,d),0),this.values.set(s.subarray(d),d+w),this.values.set(l,d),d-1=0&&this.prefixSum.set(h.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}changeValue(d,l){return d=p.toUint32(d),l=p.toUint32(l),this.values[d]===l?!1:(this.values[d]=l,d-1=s.length)return!1;let w=s.length-d;return l>=w&&(l=w),l===0?!1:(this.values=new Uint32Array(s.length-l),this.values.set(s.subarray(0,d),0),this.values.set(s.subarray(d+l),d),this.prefixSum=new Uint32Array(this.values.length),d-1=0&&this.prefixSum.set(h.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalValue(){return this.values.length===0?0:this._getAccumulatedValue(this.values.length-1)}getAccumulatedValue(d){return d<0?0:(d=p.toUint32(d),this._getAccumulatedValue(d))}_getAccumulatedValue(d){if(d<=this.prefixSumValidIndex[0])return this.prefixSum[d];let l=this.prefixSumValidIndex[0]+1;l===0&&(this.prefixSum[0]=this.values[0],l++),d>=this.values.length&&(d=this.values.length-1);for(let s=l;s<=d;s++)this.prefixSum[s]=this.prefixSum[s-1]+this.values[s];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],d),this.prefixSum[d]}getIndexOf(d){d=Math.floor(d),this.getTotalValue();let l=0,s=this.values.length-1,h=0,w=0,a=0;for(;l<=s;)if(h=l+(s-l)/2|0,w=this.prefixSum[h],a=w-this.values[h],d=w)l=h+1;else break;return new P(h,d-a)}}t.PrefixSumComputer=E}),V(z[33],G([0,1,5,3,32]),function(I,t,p,P,E){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MirrorTextModel=void 0;class u{constructor(l,s,h,w){this._uri=l,this._lines=s,this._eol=h,this._versionId=w,this._lineStarts=null,this._cachedTextValue=null}dispose(){this._lines.length=0}getText(){return this._cachedTextValue===null&&(this._cachedTextValue=this._lines.join(this._eol)),this._cachedTextValue}onEvents(l){l.eol&&l.eol!==this._eol&&(this._eol=l.eol,this._lineStarts=null);const s=l.changes;for(const h of s)this._acceptDeleteRange(h.range),this._acceptInsertText(new P.Position(h.range.startLineNumber,h.range.startColumn),h.text);this._versionId=l.versionId,this._cachedTextValue=null}_ensureLineStarts(){if(!this._lineStarts){const l=this._eol.length,s=this._lines.length,h=new Uint32Array(s);for(let w=0;wthis._lines.length)f=this._lines.length,b=this._lines[f-1].length+1,N=!0;else{let c=this._lines[f-1].length+1;b<1?(b=1,N=!0):b>c&&(b=c,N=!0)}return N?{lineNumber:f,column:b}:i}}class m{constructor(i,f){this._host=i,this._models=Object.create(null),this._foreignModuleFactory=f,this._foreignModule=null}dispose(){this._models=Object.create(null)}_getModel(i){return this._models[i]}_getModels(){let i=[];return Object.keys(this._models).forEach(f=>i.push(this._models[f])),i}acceptNewModel(i){this._models[i.url]=new r(u.URI.parse(i.url),i.lines,i.EOL,i.versionId)}acceptModelChanged(i,f){!this._models[i]||this._models[i].onEvents(f)}acceptRemovedModel(i){!this._models[i]||delete this._models[i]}computeDiff(i,f,b,N){return ne(this,void 0,void 0,function*(){const c=this._getModel(i),g=this._getModel(f);if(!c||!g)return null;const L=c.getLinesContent(),A=g.getLinesContent(),R=new s.DiffComputer(L,A,{shouldComputeCharChanges:!0,shouldPostProcessCharChanges:!0,shouldIgnoreTrimWhitespace:b,shouldMakePrettyDiff:!0,maxComputationTime:N}).computeDiff(),D=R.changes.length>0?!1:this._modelsAreIdentical(c,g);return{quitEarly:R.quitEarly,identical:D,changes:R.changes}})}_modelsAreIdentical(i,f){const b=i.getLineCount(),N=f.getLineCount();if(b!==N)return!1;for(let c=1;c<=b;c++){const g=i.getLineContent(c),L=f.getLineContent(c);if(g!==L)return!1}return!0}computeMoreMinimalEdits(i,f){return ne(this,void 0,void 0,function*(){const b=this._getModel(i);if(!b)return f;const N=[];let c;f=p.mergeSort(f,(g,L)=>{if(g.range&&L.range)return l.Range.compareRangesUsingStarts(g.range,L.range);let A=g.range?0:1,M=L.range?0:1;return A-M});for(let{range:g,text:L,eol:A}of f)if(typeof A=="number"&&(c=A),!(l.Range.isEmpty(g)&&!L)){const M=b.getValueInRange(g);if(L=L.replace(/\r\n|\n|\r/g,b.eol),M!==L){if(Math.max(L.length,M.length)>m._diffLimit){N.push({range:g,text:L});continue}const R=P.stringDiff(M,L,!1),D=b.offsetAt(l.Range.lift(g).getStartPosition());for(const T of R){const $=b.positionAt(D+T.originalStart),k=b.positionAt(D+T.originalStart+T.originalLength),F={text:L.substr(T.modifiedStart,T.modifiedLength),range:{startLineNumber:$.lineNumber,startColumn:$.column,endLineNumber:k.lineNumber,endColumn:k.column}};b.getValueInRange(F.range)!==F.text&&N.push(F)}}}return typeof c=="number"&&N.push({eol:c,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),N})}computeLinks(i){return ne(this,void 0,void 0,function*(){let f=this._getModel(i);return f?a.computeLinks(f):null})}textualSuggest(i,f,b,N){return ne(this,void 0,void 0,function*(){const c=new n.StopWatch(!0),g=new RegExp(b,N),L=new Set;e:for(let A of i){const M=this._getModel(A);if(!!M){for(let R of M.words(g))if(!(R===f||!isNaN(Number(R)))&&(L.add(R),L.size>m._suggestionsLimit))break e}}return{words:Array.from(L),duration:c.elapsed()}})}computeWordRanges(i,f,b,N){return ne(this,void 0,void 0,function*(){let c=this._getModel(i);if(!c)return Object.create(null);const g=new RegExp(b,N),L=Object.create(null);for(let A=f.startLineNumber;Athis._host.fhr(L,A);let g={host:C.createProxyObject(b,N),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(g,f),Promise.resolve(C.getAllMethodNames(this._foreignModule))):new Promise((L,A)=>{I([i],M=>{this._foreignModule=M.create(g,f),L(C.getAllMethodNames(this._foreignModule))},A)})}fmr(i,f){if(!this._foreignModule||typeof this._foreignModule[i]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+i));try{return Promise.resolve(this._foreignModule[i].apply(this._foreignModule,f))}catch(b){return Promise.reject(b)}}}t.EditorSimpleWorker=m,m._diffLimit=1e5,m._suggestionsLimit=1e4;function _(o){return new m(o,null)}t.create=_,typeof importScripts=="function"&&(E.globals.monaco=v.createMonacoBaseAPI())});"use strict";(function(){var I,t;const p=self.MonacoEnvironment,P=p&&p.baseUrl?p.baseUrl:"../../../",E=typeof((I=self.trustedTypes)===null||I===void 0?void 0:I.createPolicy)=="function"?(t=self.trustedTypes)===null||t===void 0?void 0:t.createPolicy("amdLoader",{createScriptURL:s=>s}):void 0;if(typeof self.define!="function"||!self.define.amd){let s=P+"vs/loader.js";E&&(s=E.createScriptURL(s)),importScripts(s)}require.config({baseUrl:P,catchError:!0,trustedTypesPolicy:E});let u=function(s){require([s],function(h){setTimeout(function(){let w=h.create((a,S)=>{self.postMessage(a,S)},null);for(self.onmessage=a=>w.onmessage(a.data);l.length>0;)self.onmessage(l.shift())},0)})},d=!0,l=[];self.onmessage=s=>{if(!d){l.push(s);return}d=!1,u(s.data)}})()}).call(this); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js new file mode 100644 index 0000000000..efe87c5505 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/abap/abap",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"*"},brackets:[["[","]"],["(",")"]]};n.language={defaultToken:"invalid",ignoreCase:!0,tokenPostfix:".abap",keywords:["abap-source","abbreviated","abstract","accept","accepting","according","activation","actual","add","add-corresponding","adjacent","after","alias","aliases","align","all","allocate","alpha","analysis","analyzer","append","appendage","appending","application","archive","area","arithmetic","as","ascending","aspect","assert","assign","assigned","assigning","association","asynchronous","at","attributes","authority","authority-check","avg","back","background","backup","backward","badi","base","before","begin","big","binary","bintohex","bit","black","blank","blanks","blob","block","blocks","blue","bound","boundaries","bounds","boxed","break-point","buffer","by","bypassing","byte","byte-order","call","calling","case","cast","casting","catch","center","centered","chain","chain-input","chain-request","change","changing","channels","character","char-to-hex","check","checkbox","ci_","circular","class","class-coding","class-data","class-events","class-methods","class-pool","cleanup","clear","client","clob","clock","close","coalesce","code","coding","col_background","col_group","col_heading","col_key","col_negative","col_normal","col_positive","col_total","collect","color","column","columns","comment","comments","commit","common","communication","comparing","component","components","compression","compute","concat","concat_with_space","concatenate","cond","condition","connect","connection","constants","context","contexts","continue","control","controls","conv","conversion","convert","copies","copy","corresponding","country","cover","cpi","create","creating","critical","currency","currency_conversion","current","cursor","cursor-selection","customer","customer-function","dangerous","data","database","datainfo","dataset","date","dats_add_days","dats_add_months","dats_days_between","dats_is_valid","daylight","dd/mm/yy","dd/mm/yyyy","ddmmyy","deallocate","decimal_shift","decimals","declarations","deep","default","deferred","define","defining","definition","delete","deleting","demand","department","descending","describe","destination","detail","dialog","directory","disconnect","display","display-mode","distinct","divide","divide-corresponding","division","do","dummy","duplicate","duplicates","duration","during","dynamic","dynpro","edit","editor-call","else","elseif","empty","enabled","enabling","encoding","end","endat","endcase","endcatch","endchain","endclass","enddo","endenhancement","end-enhancement-section","endexec","endform","endfunction","endian","endif","ending","endinterface","end-lines","endloop","endmethod","endmodule","end-of-definition","end-of-editing","end-of-file","end-of-page","end-of-selection","endon","endprovide","endselect","end-test-injection","end-test-seam","endtry","endwhile","endwith","engineering","enhancement","enhancement-point","enhancements","enhancement-section","entries","entry","enum","environment","errormessage","errors","escaping","event","events","exact","except","exception","exceptions","exception-table","exclude","excluding","exec","execute","exists","exit","exit-command","expand","expanding","expiration","explicit","exponent","export","exporting","extend","extended","extension","extract","fail","fetch","field","field-groups","fields","field-symbol","field-symbols","file","filter","filters","filter-table","final","first","first-line","fixed-point","fkeq","fkge","flush","font","for","form","format","forward","found","frame","frames","free","friends","from","function","functionality","function-pool","further","gaps","generate","get","giving","gkeq","gkge","global","grant","green","group","groups","handle","handler","harmless","hashed","having","hdb","header","headers","heading","head-lines","help-id","help-request","hextobin","hide","high","hint","hold","hotspot","icon","id","identification","identifier","ids","if","ignore","ignoring","immediately","implementation","implementations","implemented","implicit","import","importing","inactive","incl","include","includes","including","increment","index","index-line","infotypes","inheriting","init","initial","initialization","inner","inout","input","instance","instances","instr","intensified","interface","interface-pool","interfaces","internal","intervals","into","inverse","inverted-date","is","iso","job","join","keep","keeping","kernel","key","keys","keywords","kind","language","last","late","layout","leading","leave","left","left-justified","leftplus","leftspace","legacy","length","let","level","levels","like","line","line-count","linefeed","line-selection","line-size","list","listbox","list-processing","little","llang","load","load-of-program","lob","local","locale","locator","logfile","logical","log-point","long","loop","low","lower","lpad","lpi","ltrim","mail","main","major-id","mapping","margin","mark","mask","matchcode","max","maximum","medium","members","memory","mesh","message","message-id","messages","messaging","method","methods","min","minimum","minor-id","mm/dd/yy","mm/dd/yyyy","mmddyy","mode","modif","modifier","modify","module","move","move-corresponding","multiply","multiply-corresponding","name","nametab","native","nested","nesting","new","new-line","new-page","new-section","next","no","node","nodes","no-display","no-extension","no-gap","no-gaps","no-grouping","no-heading","non-unicode","non-unique","no-scrolling","no-sign","no-title","no-topofpage","no-zero","null","number","object","objects","obligatory","occurrence","occurrences","occurs","of","off","offset","ole","on","only","open","option","optional","options","order","other","others","out","outer","output","output-length","overflow","overlay","pack","package","pad","padding","page","pages","parameter","parameters","parameter-table","part","partially","pattern","percentage","perform","performing","person","pf1","pf10","pf11","pf12","pf13","pf14","pf15","pf2","pf3","pf4","pf5","pf6","pf7","pf8","pf9","pf-status","pink","places","pool","pos_high","pos_low","position","pragmas","precompiled","preferred","preserving","primary","print","print-control","priority","private","procedure","process","program","property","protected","provide","public","push","pushbutton","put","queue-only","quickinfo","radiobutton","raise","raising","range","ranges","read","reader","read-only","receive","received","receiver","receiving","red","redefinition","reduce","reduced","ref","reference","refresh","regex","reject","remote","renaming","replacement","replacing","report","request","requested","reserve","reset","resolution","respecting","responsible","result","results","resumable","resume","retry","return","returncode","returning","returns","right","right-justified","rightplus","rightspace","risk","rmc_communication_failure","rmc_invalid_status","rmc_system_failure","role","rollback","rows","rpad","rtrim","run","sap","sap-spool","saving","scale_preserving","scale_preserving_scientific","scan","scientific","scientific_with_leading_zero","scroll","scroll-boundary","scrolling","search","secondary","seconds","section","select","selection","selections","selection-screen","selection-set","selection-sets","selection-table","select-options","send","separate","separated","set","shared","shift","short","shortdump-id","sign_as_postfix","single","size","skip","skipping","smart","some","sort","sortable","sorted","source","specified","split","spool","spots","sql","sqlscript","stable","stamp","standard","starting","start-of-editing","start-of-selection","state","statement","statements","static","statics","statusinfo","step-loop","stop","structure","structures","style","subkey","submatches","submit","subroutine","subscreen","subtract","subtract-corresponding","suffix","sum","summary","summing","supplied","supply","suppress","switch","switchstates","symbol","syncpoints","syntax","syntax-check","syntax-trace","system-call","system-exceptions","system-exit","tab","tabbed","tables","tableview","tabstrip","target","task","tasks","test","testing","test-injection","test-seam","text","textpool","then","throw","time","times","timestamp","timezone","tims_is_valid","title","titlebar","title-lines","to","tokenization","tokens","top-lines","top-of-page","trace-file","trace-table","trailing","transaction","transfer","transformation","transporting","trmac","truncate","truncation","try","tstmp_add_seconds","tstmp_current_utctimestamp","tstmp_is_valid","tstmp_seconds_between","type","type-pool","type-pools","types","uline","unassign","under","unicode","union","unique","unit_conversion","unix","unpack","until","unwind","up","update","upper","user","user-command","using","utf-8","valid","value","value-request","values","vary","varying","verification-message","version","via","view","visible","wait","warning","when","whenever","where","while","width","window","windows","with","with-heading","without","with-title","word","work","write","writer","xml","xsd","yellow","yes","yymmdd","zero","zone","abs","acos","asin","atan","bit-set","boolc","boolx","ceil","char_off","charlen","cmax","cmin","concat_lines_of","condense","contains","contains_any_not_of","contains_any_of","cos","cosh","count","count_any_not_of","count_any_of","dbmaxlen","distance","escape","exp","find","find_any_not_of","find_any_of","find_end","floor","frac","from_mixed","insert","ipow","line_exists","line_index","lines","log","log10","match","matches","nmax","nmin","numofchar","repeat","replace","rescale","reverse","round","segment","shift_left","shift_right","sign","sin","sinh","sqrt","strlen","substring","substring_after","substring_before","substring_from","substring_to","tan","tanh","to_lower","to_mixed","to_upper","translate","trunc","utclong_add","utclong_current","utclong_diff","xsdbool","xstrlen"],typeKeywords:["b","c","d","decfloat16","decfloat34","f","i","int8","n","p","s","string","t","utclong","x","xstring","any","clike","csequence","decfloat","numeric","simple","xsequence","table","hashed","index","sorted","standard","accp","char","clnt","cuky","curr","dats","dec","df16_dec","df16_raw","df34_dec","df34_raw","fltp","int1","int2","int4","lang","lchr","lraw","numc","quan","raw","rawstring","sstring","tims","unit","df16_scl","df34_scl","prec","varc","abap_bool","space","me","syst","sy","screen"],operators:[" +"," -","/","*","**","div","mod","=","#","@","&","&&","bit-and","bit-not","bit-or","bit-xor","m","o","z","and","equiv","not","or"," < "," > ","<=",">=","<>","><","=<","=>","between","bt","byte-ca","byte-cn","byte-co","byte-cs","byte-na","byte-ns","ca","cn","co","cp","cs","eq","ge","gt","in","le","lt","na","nb","ne","np","ns"],symbols:/[=>/,"identifier"],{include:"@whitespace"},[/[:,.]/,"delimiter"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/'/,{token:"string",bracket:"@open",next:"@stringquote"}],[/`/,{token:"string",bracket:"@open",next:"@stringping"}],[/\|/,{token:"string",bracket:"@open",next:"@stringtemplate"}],[/\d+/,"number"]],stringtemplate:[[/[^\\\|]+/,"string"],[/\\\|/,"string"],[/\|/,{token:"string",bracket:"@close",next:"@pop"}]],stringping:[[/[^\\`]+/,"string"],[/`/,{token:"string",bracket:"@close",next:"@pop"}]],stringquote:[[/[^\\']+/,"string"],[/'/,{token:"string",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/^\*.*$/,"comment"],[/\".*$/,"comment"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js new file mode 100644 index 0000000000..8c75f0254e --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/apex/apex",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}};var s=[];["abstract","activate","and","any","array","as","asc","assert","autonomous","begin","bigdecimal","blob","boolean","break","bulk","by","case","cast","catch","char","class","collect","commit","const","continue","convertcurrency","decimal","default","delete","desc","do","double","else","end","enum","exception","exit","export","extends","false","final","finally","float","for","from","future","get","global","goto","group","having","hint","if","implements","import","in","inner","insert","instanceof","int","interface","into","join","last_90_days","last_month","last_n_days","last_week","like","limit","list","long","loop","map","merge","native","new","next_90_days","next_month","next_n_days","next_week","not","null","nulls","number","object","of","on","or","outer","override","package","parallel","pragma","private","protected","public","retrieve","return","returning","rollback","savepoint","search","select","set","short","sort","stat","static","strictfp","super","switch","synchronized","system","testmethod","then","this","this_month","this_week","throw","throws","today","tolabel","tomorrow","transaction","transient","trigger","true","try","type","undelete","update","upsert","using","virtual","void","volatile","webservice","when","where","while","yesterday"].forEach((function(e){s.push(e),s.push(e.toUpperCase()),s.push(function(e){return e.charAt(0).toUpperCase()+e.substr(1)}(e))})),t.language={defaultToken:"",tokenPostfix:".apex",keywords:s,operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@apexdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],apexdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js new file mode 100644 index 0000000000..2ee40f67ef --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/azcli/azcli",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"#"}},t.language={defaultToken:"keyword",ignoreCase:!0,tokenPostfix:".azcli",str:/[^#\s]/,tokenizer:{root:[{include:"@comment"},[/\s-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}],[/^-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}]],type:[{include:"@comment"},[/-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":"key.identifier"}}],[/@str+\s*/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}]],comment:[[/#.*$/,{cases:{"@eos":{token:"comment",next:"@popall"}}}]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/bat/bat.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/bat/bat.js new file mode 100644 index 0000000000..b12e11b38e --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/bat/bat.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/bat/bat",["require","exports"],(function(e,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.language=s.conf=void 0,s.conf={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|REM\\s+)#region"),end:new RegExp("^\\s*(::\\s*|REM\\s+)#endregion")}}},s.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=>"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}]},o.language={defaultToken:"",tokenPostfix:".cameligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["abs","begin","Bytes","Crypto","Current","else","end","failwith","false","fun","if","in","let","let%entry","let%init","List","list","Map","map","match","match%nat","mod","not","operation","Operation","of","Set","set","sender","source","String","then","true","type","with"],typeKeywords:["int","unit","string","tz"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%","->","<-"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js new file mode 100644 index 0000000000..24e807dff7 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/clojure/clojure",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:";;"},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:"[",close:"]"},{open:'"',close:'"'},{open:"(",close:")"},{open:"{",close:"}"}],surroundingPairs:[{open:"[",close:"]"},{open:'"',close:'"'},{open:"(",close:")"},{open:"{",close:"}"}]},t.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".clj",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"}],constants:["true","false","nil"],numbers:/^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/,characters:/^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/,escapes:/^\\(?:["'\\bfnrt]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,qualifiedSymbols:/^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/,specialForms:[".","catch","def","do","if","monitor-enter","monitor-exit","new","quote","recur","set!","throw","try","var"],coreSymbols:["*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-namespace-maps*","*print-readably*","*read-eval*","*reader-resolver*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods","..","/","<","<=","=","==",">",">=","EMPTY-NODE","Inst","StackTraceElement->vec","Throwable->map","accessor","aclone","add-classpath","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","any?","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc","assoc!","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","boolean?","booleans","bound-fn","bound-fn*","bound?","bounded-count","butlast","byte","byte-array","bytes","bytes?","case","cast","cat","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","completing","concat","cond","cond->","cond->>","condp","conj","conj!","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","dedupe","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj","disj!","dissoc","dissoc!","distinct","distinct?","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","double?","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-data","ex-info","extend","extend-protocol","extend-type","extenders","extends?","false?","ffirst","file-seq","filter","filterv","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","halt-when","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","ident?","identical?","identity","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","indexed?","init-proxy","inst-ms","inst-ms*","inst?","instance?","int","int-array","int?","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","letfn","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-entry?","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","munge","name","namespace","namespace-munge","nat-int?","neg-int?","neg?","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop","pop!","pop-thread-bindings","pos-int?","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","qualified-ident?","qualified-keyword?","qualified-symbol?","quot","rand","rand-int","rand-nth","random-sample","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read-line","read-string","reader-conditional","reader-conditional?","realized?","record?","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-watch","repeat","repeatedly","replace","replicate","require","reset!","reset-meta!","reset-vals!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seqable?","seque","sequence","sequential?","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","simple-ident?","simple-keyword?","simple-symbol?","slurp","some","some->","some->>","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","swap-vals!","symbol","symbol?","sync","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","test","the-ns","thread-bound?","time","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true?","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","unreduced","unsigned-bit-shift-right","update","update-in","update-proxy","uri?","use","uuid?","val","vals","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","volatile!","volatile?","vreset!","vswap!","when","when-first","when-let","when-not","when-some","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"],tokenizer:{root:[{include:"@whitespace"},[/@numbers/,"number"],[/@characters/,"string"],{include:"@string"},[/[()\[\]{}]/,"@brackets"],[/\/#"(?:\.|(?:")|[^"\n])*"\/g/,"regexp"],[/[#'@^`~]/,"meta"],[/@qualifiedSymbols/,{cases:{"^:.+$":"constant","@specialForms":"keyword","@coreSymbols":"keyword","@constants":"constant","@default":"identifier"}}]],whitespace:[[/[\s,]+/,"white"],[/;.*$/,"comment"],[/\(comment\b/,"comment","@comment"]],comment:[[/\(/,"comment","@push"],[/\)/,"comment","@pop"],[/[^()]/,"comment"]],string:[[/"/,"string","@multiLineString"]],multiLineString:[[/"/,"string","@popall"],[/@escapes/,"string.escape"],[/./,"string"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/coffee/coffee.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/coffee/coffee.js new file mode 100644 index 0000000000..780942637b --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/coffee/coffee.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/coffee/coffee",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{blockComment:["###","###"],lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},n.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".coffee",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],regEx:/\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,keywords:["and","or","is","isnt","not","on","yes","@","no","off","true","false","null","this","new","delete","typeof","in","instanceof","return","throw","break","continue","debugger","if","else","switch","for","while","do","try","catch","finally","class","extends","super","undefined","then","unless","until","loop","of","by","when"],symbols:/[=>"}],keywords:["abstract","amp","array","auto","bool","break","case","catch","char","class","const","constexpr","const_cast","continue","cpu","decltype","default","delegate","delete","do","double","dynamic_cast","each","else","enum","event","explicit","export","extern","false","final","finally","float","for","friend","gcnew","generic","goto","if","in","initonly","inline","int","interface","interior_ptr","internal","literal","long","mutable","namespace","new","noexcept","nullptr","__nullptr","operator","override","partial","pascal","pin_ptr","private","property","protected","public","ref","register","reinterpret_cast","restrict","return","safe_cast","sealed","short","signed","sizeof","static","static_assert","static_cast","struct","switch","template","this","thread_local","throw","tile_static","true","try","typedef","typeid","typename","union","unsigned","using","virtual","void","volatile","wchar_t","where","while","_asm","_based","_cdecl","_declspec","_fastcall","_if_exists","_if_not_exists","_inline","_multiple_inheritance","_pascal","_single_inheritance","_stdcall","_virtual_inheritance","_w64","__abstract","__alignof","__asm","__assume","__based","__box","__builtin_alignof","__cdecl","__clrcall","__declspec","__delegate","__event","__except","__fastcall","__finally","__forceinline","__gc","__hook","__identifier","__if_exists","__if_not_exists","__inline","__int128","__int16","__int32","__int64","__int8","__interface","__leave","__m128","__m128d","__m128i","__m256","__m256d","__m256i","__m64","__multiple_inheritance","__newslot","__nogc","__noop","__nounwind","__novtordisp","__pascal","__pin","__pragma","__property","__ptr32","__ptr64","__raise","__restrict","__resume","__sealed","__single_inheritance","__stdcall","__super","__thiscall","__try","__try_cast","__typeof","__unaligned","__unhook","__uuidof","__value","__virtual_inheritance","__w64","__wchar_t"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],raw:[[/(.*)(\))(?:([^ ()\\\t"]*))(\")/,{cases:{"$3==$S2":["string.raw","string.raw.end","string.raw.end",{token:"string.raw.end",next:"@pop"}],"@default":["string.raw","string.raw","string.raw","string.raw"]}}],[/.*/,"string.raw"]],annotation:[{include:"@whitespace"},[/using|alignas/,"keyword"],[/[a-zA-Z0-9_]+/,"annotation"],[/[,:]/,"delimiter"],[/[()]/,"@brackets"],[/\]\s*\]/,{token:"annotation",next:"@pop"}]],include:[[/(\s*)(<)([^<>]*)(>)/,["","keyword.directive.include.begin","string.include.identifier",{token:"keyword.directive.include.end",next:"@pop"}]],[/(\s*)(")([^"]*)(")/,["","keyword.directive.include.begin","string.include.identifier",{token:"keyword.directive.include.end",next:"@pop"}]]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js new file mode 100644 index 0000000000..06b57d45f3 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/csharp/csharp",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},t.language={defaultToken:"",tokenPostfix:".cs",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["extern","alias","using","bool","decimal","sbyte","byte","short","ushort","int","uint","long","ulong","char","float","double","object","dynamic","string","assembly","is","as","ref","out","this","base","new","typeof","void","checked","unchecked","default","delegate","var","const","if","else","switch","case","while","do","for","foreach","in","break","continue","goto","return","throw","try","catch","finally","lock","yield","from","let","where","join","on","equals","into","orderby","ascending","descending","select","group","by","namespace","partial","class","field","event","method","param","public","protected","internal","private","abstract","sealed","static","struct","readonly","volatile","virtual","override","params","get","set","add","remove","operator","true","false","implicit","explicit","interface","enum","null","async","await","fixed","sizeof","stackalloc","unsafe","nameof","when"],namespaceFollows:["namespace","using"],parenFollows:["if","for","while","switch","foreach","using","catch","when"],operators:["=","??","||","&&","|","^","&","==","!=","<=",">=","<<","+","-","*","/","%","!","~","++","--","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=",">>","=>"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?[fFdD]?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01_]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",next:"@string"}],[/\$\@"/,{token:"string.quote",next:"@litinterpstring"}],[/\@"/,{token:"string.quote",next:"@litstring"}],[/\$"/,{token:"string.quote",next:"@interpolatedstring"}],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],qualified:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/\./,"delimiter"],["","","@pop"]],namespace:[{include:"@whitespace"},[/[A-Z]\w*/,"namespace"],[/[\.=]/,"delimiter"],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]],litinterpstring:[[/[^"{]+/,"string"],[/""/,"string.escape"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.litinterpstring"}],[/"/,{token:"string.quote",next:"@pop"}]],interpolatedstring:[[/[^\\"{]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.interpolatedstring"}],[/"/,{token:"string.quote",next:"@pop"}]],whitespace:[[/^[ \t\v\f]*#((r)|(load))(?=\s)/,"directive.csx"],[/^[ \t\v\f]*#\w.*$/,"namespace.cpp"],[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csp/csp.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csp/csp.js new file mode 100644 index 0000000000..05010bdd29 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csp/csp.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/csp/csp",["require","exports"],(function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.language=e.conf=void 0,e.conf={brackets:[],autoClosingPairs:[],surroundingPairs:[]},e.language={keywords:[],typeKeywords:[],tokenPostfix:".csp",operators:[],symbols:/[=>",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@strings"},["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@selectorname"},["[\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.bracket",next:"@selectorbody"}]],selectorbody:[{include:"@comments"},["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],["}",{token:"delimiter.bracket",next:"@pop"}]],selectorname:[["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@functioninvocation"},{include:"@numbers"},{include:"@name"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","delimiter"],[",","delimiter"]],rulevalue:[{include:"@comments"},{include:"@strings"},{include:"@term"},["!important","keyword"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[/[^*/]+/,"comment"],[/./,"comment"]],name:[["@identifier","attribute.value"]],numbers:[["-?(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],keyframedeclaration:[["@identifier","attribute.value"],["{",{token:"delimiter.bracket",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.bracket",next:"@selectorbody"}],["}",{token:"delimiter.bracket",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"attribute.value",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"attribute.value",next:"@pop"}]],strings:[['~?"',{token:"string",next:"@stringenddoublequote"}],["~?'",{token:"string",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string",next:"@pop"}],[/[^\\"]+/,"string"],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string",next:"@pop"}],[/[^\\']+/,"string"],[".","string"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js new file mode 100644 index 0000000000..6ad018a5d6 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/dart/dart",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:"(",close:")"},{open:'"',close:'"'},{open:"`",close:"`"}],folding:{markers:{start:/^\s*\s*#?region\b/,end:/^\s*\s*#?endregion\b/}}},n.language={defaultToken:"invalid",tokenPostfix:".dart",keywords:["abstract","dynamic","implements","show","as","else","import","static","assert","enum","in","super","async","export","interface","switch","await","extends","is","sync","break","external","library","this","case","factory","mixin","throw","catch","false","new","true","class","final","null","try","const","finally","on","typedef","continue","for","operator","var","covariant","Function","part","void","default","get","rethrow","while","deferred","hide","return","with","do","if","set","yield"],typeKeywords:["int","double","String","bool"],operators:["+","-","*","/","~/","%","++","--","==","!=",">","<",">=","<=","=","-=","/=","%=",">>=","^=","+=","*=","~/=","<<=","&=","!=","||","&&","&","|","^","~","<<",">>","!",">>>","??","?",":","|="],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/\/.*$/,"comment.doc"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([gimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"\$]+/,"string"],[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"],[/\$\w+/,"identifier"]],string_single:[[/[^\\'\$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"],[/\$\w+/,"identifier"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js new file mode 100644 index 0000000000..2dcc929db5 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/dockerfile/dockerfile",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},o.language={defaultToken:"",tokenPostfix:".dockerfile",variable:/\${?[\w]+}?/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/(ONBUILD)(\s+)/,["keyword",""]],[/(ENV)(\s+)([\w]+)/,["keyword","",{token:"variable",next:"@arguments"}]],[/(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|ARG|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|STOPSIGNAL|SHELL|HEALTHCHECK|ENTRYPOINT)/,{token:"keyword",next:"@arguments"}]],arguments:[{include:"@whitespace"},{include:"@strings"},[/(@variable)/,{cases:{"@eos":{token:"variable",next:"@popall"},"@default":"variable"}}],[/\\/,{cases:{"@eos":"","@default":""}}],[/./,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],whitespace:[[/\s+/,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],comment:[[/(^#.*$)/,"comment","@popall"]],strings:[[/\\'$/,"","@popall"],[/\\'/,""],[/'$/,"string","@popall"],[/'/,"string","@stringBody"],[/"$/,"string","@popall"],[/"/,"string","@dblStringBody"]],stringBody:[[/[^\\\$']/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/'$/,"string","@popall"],[/'/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]],dblStringBody:[[/[^\\\$"]/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/"$/,"string","@popall"],[/"/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js new file mode 100644 index 0000000000..c97e21cf5a --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/ecl/ecl",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}]},o.language={defaultToken:"",tokenPostfix:".ecl",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],pounds:["append","break","declare","demangle","end","for","getdatatype","if","inmodule","loop","mangle","onwarning","option","set","stored","uniquename"].join("|"),keywords:["__compressed__","after","all","and","any","as","atmost","before","beginc","best","between","case","cluster","compressed","compression","const","counter","csv","default","descend","embed","encoding","encrypt","end","endc","endembed","endmacro","enum","escape","except","exclusive","expire","export","extend","fail","few","fileposition","first","flat","forward","from","full","function","functionmacro","group","grouped","heading","hole","ifblock","import","in","inner","interface","internal","joined","keep","keyed","last","left","limit","linkcounted","literal","little_endian","load","local","locale","lookup","lzw","macro","many","maxcount","maxlength","min skew","module","mofn","multiple","named","namespace","nocase","noroot","noscan","nosort","not","noxpath","of","onfail","only","opt","or","outer","overwrite","packed","partition","penalty","physicallength","pipe","prefetch","quote","record","repeat","retry","return","right","right1","right2","rows","rowset","scan","scope","self","separator","service","shared","skew","skip","smart","soapaction","sql","stable","store","terminator","thor","threshold","timelimit","timeout","token","transform","trim","type","unicodeorder","unordered","unsorted","unstable","update","use","validate","virtual","whole","width","wild","within","wnotrim","xml","xpath"],functions:["abs","acos","aggregate","allnodes","apply","ascii","asin","assert","asstring","atan","atan2","ave","build","buildindex","case","catch","choose","choosen","choosesets","clustersize","combine","correlation","cos","cosh","count","covariance","cron","dataset","dedup","define","denormalize","dictionary","distribute","distributed","distribution","ebcdic","enth","error","evaluate","event","eventextra","eventname","exists","exp","fail","failcode","failmessage","fetch","fromunicode","fromxml","getenv","getisvalid","global","graph","group","hash","hash32","hash64","hashcrc","hashmd5","having","httpcall","httpheader","if","iff","index","intformat","isvalid","iterate","join","keydiff","keypatch","keyunicode","length","library","limit","ln","loadxml","local","log","loop","map","matched","matchlength","matchposition","matchtext","matchunicode","max","merge","mergejoin","min","nofold","nolocal","nonempty","normalize","nothor","notify","output","parallel","parse","pipe","power","preload","process","project","pull","random","range","rank","ranked","realformat","recordof","regexfind","regexreplace","regroup","rejected","rollup","round","roundup","row","rowdiff","sample","sequential","set","sin","sinh","sizeof","soapcall","sort","sorted","sqrt","stepped","stored","sum","table","tan","tanh","thisnode","topn","tounicode","toxml","transfer","transform","trim","truncate","typeof","ungroup","unicodeorder","variance","wait","which","workunit","xmldecode","xmlencode","xmltext","xmlunicode"],typesint:["integer","unsigned"].join("|"),typesnum:["data","qstring","string","unicode","utf8","varstring","varunicode"],typesone:["ascii","big_endian","boolean","data","decimal","ebcdic","grouped","integer","linkcounted","pattern","qstring","real","record","rule","set of","streamed","string","token","udecimal","unicode","unsigned","utf8","varstring","varunicode"].join("|"),operators:["+","-","/",":=","<","<>","=",">","\\","and","in","not","or"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js new file mode 100644 index 0000000000..b4cdd387be --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/fsharp/fsharp",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*//\\s*#region\\b|^\\s*\\(\\*\\s*#region(.*)\\*\\)"),end:new RegExp("^\\s*//\\s*#endregion\\b|^\\s*\\(\\*\\s*#endregion\\s*\\*\\)")}}},n.language={defaultToken:"",tokenPostfix:".fs",keywords:["abstract","and","atomic","as","assert","asr","base","begin","break","checked","component","const","constraint","constructor","continue","class","default","delegate","do","done","downcast","downto","elif","else","end","exception","eager","event","external","extern","false","finally","for","fun","function","fixed","functor","global","if","in","include","inherit","inline","interface","internal","land","lor","lsl","lsr","lxor","lazy","let","match","member","mod","module","mutable","namespace","method","mixin","new","not","null","of","open","or","object","override","private","parallel","process","protected","pure","public","rec","return","static","sealed","struct","sig","then","to","true","tailcall","trait","try","type","upcast","use","val","void","virtual","volatile","when","while","with","yield"],symbols:/[=>\]/,"annotation"],[/^#(if|else|endif)/,"keyword"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0x[0-9a-fA-F]+LF/,"number.float"],[/0x[0-9a-fA-F]+(@integersuffix)/,"number.hex"],[/0b[0-1]+(@integersuffix)/,"number.bin"],[/\d+(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string",'@string."""'],[/"/,"string",'@string."'],[/\@"/,{token:"string.quote",next:"@litstring"}],[/'[^\\']'B?/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\(\*(?!\))/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^*(]+/,"comment"],[/\*\)/,"comment","@pop"],[/\*/,"comment"],[/\(\*\)/,"comment"],[/\(/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/("""|"B?)/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js new file mode 100644 index 0000000000..bedb5beedb --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/go/go",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".go",keywords:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var","bool","true","false","uint8","uint16","uint32","uint64","int8","int16","int32","int64","float32","float64","complex64","complex128","byte","rune","uint","int","uintptr","string","nil"],operators:["+","-","*","/","%","&","|","^","<<",">>","&^","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=","&^=","&&","||","<-","++","--","==","<",">","=","!","!=","<=",">=",":=","...","(",")","","]","{","}",",",";",".",":"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex"],[/0[0-7']*[0-7]/,"number.octal"],[/0[bB][0-1']*[0-1]/,"number.binary"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/`/,"string","@rawstring"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],rawstring:[[/[^\`]/,"string"],[/`/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js new file mode 100644 index 0000000000..dfcd6d0c5d --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/graphql/graphql",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"""',close:'"""',notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"""',close:'"""'},{open:'"',close:'"'}],folding:{offSide:!0}},n.language={defaultToken:"invalid",tokenPostfix:".gql",keywords:["null","true","false","query","mutation","subscription","extend","schema","directive","scalar","type","interface","union","enum","input","implements","fragment","on"],typeKeywords:["Int","Float","String","Boolean","ID"],directiveLocations:["SCHEMA","SCALAR","OBJECT","FIELD_DEFINITION","ARGUMENT_DEFINITION","INTERFACE","UNION","ENUM","ENUM_VALUE","INPUT_OBJECT","INPUT_FIELD_DEFINITION","QUERY","MUTATION","SUBSCRIPTION","FIELD","FRAGMENT_DEFINITION","FRAGMENT_SPREAD","INLINE_FRAGMENT","VARIABLE_DEFINITION"],operators:["=","!","?",":","&","|"],symbols:/[=!?:&|]+/,escapes:/\\(?:["\\\/bfnrt]|u[0-9A-Fa-f]{4})/,tokenizer:{root:[[/[a-z_][\w$]*/,{cases:{"@keywords":"keyword","@default":"key.identifier"}}],[/[$][\w$]*/,{cases:{"@keywords":"keyword","@default":"argument.identifier"}}],[/[A-Z][\w\$]*/,{cases:{"@typeKeywords":"keyword","@default":"type.identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,{token:"annotation",log:"annotation token: $0"}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"""/,{token:"string",next:"@mlstring",nextEmbedded:"markdown"}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}]],mlstring:[[/[^"]+/,"string"],['"""',{token:"string",next:"@pop",nextEmbedded:"@pop"}]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/#.*$/,"comment"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js new file mode 100644 index 0000000000..3225fb97a6 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/handlebars/handlebars",["require","exports","../fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0;var a=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["{{!--","--}}"]},brackets:[["\x3c!--","--\x3e"],["<",">"],["{{","}}"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp("<(?!(?:"+a.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(?!(?:"+a.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:n.languages.IndentAction.Indent}}]},t.language={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/\{\{!--/,"comment.block.start.handlebars","@commentBlock"],[/\{\{!/,"comment.start.handlebars","@comment"],[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.root"}],[/)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)(\w+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/\}\}/,"comment.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentBlock:[[/--\}\}/,"comment.block.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentHtml:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],handlebarsInSimpleState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3"}],{include:"handlebarsRoot"}],handlebarsInEmbeddedState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"handlebarsRoot"}],handlebarsRoot:[[/"[^"]*"/,"string.handlebars"],[/[#/][^\s}]+/,"keyword.helper.handlebars"],[/else\b/,"keyword.helper.handlebars"],[/[\s]+/],[/[^}]/,"variable.parameter.handlebars"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js new file mode 100644 index 0000000000..4859378ffe --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/hcl/hcl",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},t.language={defaultToken:"",tokenPostfix:".hcl",keywords:["var","local","path","for_each","any","string","number","bool","true","false","null","if ","else ","endif ","for ","in","endfor"],operators:["=",">=","<=","==","!=","+","-","*","/","%","&&","||","!","<",">","?","...",":"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"/,"string","@string"],[/'/,"invalid"]],heredoc:[[/<<[-]*\s*["]?([\w\-]+)["]?/,{token:"string.heredoc.delimiter",next:"@heredocBody.$1"}]],heredocBody:[[/([\w\-]+)$/,{cases:{"$1==$S2":[{token:"string.heredoc.delimiter",next:"@popall"}],"@default":"string.heredoc"}}],[/./,"string.heredoc"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"],[/#.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/\$\{/,{token:"delimiter",next:"@stringExpression"}],[/[^\\"\$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@popall"]],stringInsideExpression:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],stringExpression:[[/\}/,{token:"delimiter",next:"@pop"}],[/"/,"string","@stringInsideExpression"],{include:"@terraform"}]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js new file mode 100644 index 0000000000..32ac8c8926 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/html/html",["require","exports","../fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0;var i=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["\x3c!--","--\x3e"]},brackets:[["\x3c!--","--\x3e"],["<",">"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],onEnterRules:[{beforeText:new RegExp("<(?!(?:"+i.join("|")+"))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(?!(?:"+i.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:n.languages.IndentAction.Indent}}],folding:{markers:{start:new RegExp("^\\s*\x3c!--\\s*#region\\b.*--\x3e"),end:new RegExp("^\\s*\x3c!--\\s*#endregion\\b.*--\x3e")}}},t.language={defaultToken:"",tokenPostfix:".html",ignoreCase:!0,tokenizer:{root:[[/)/,["delimiter","tag","","delimiter"]],[/(<)(script)/,["delimiter",{token:"tag",next:"@script"}]],[/(<)(style)/,["delimiter",{token:"tag",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/]+/,"metatag.content"],[/>/,"metatag","@pop"]],comment:[[/-->/,"comment","@pop"],[/[^-]+/,"comment.content"],[/./,"comment.content"]],otherTag:[[/\/?>/,"delimiter","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js new file mode 100644 index 0000000000..8f19f7e2eb --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/ini/ini",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js new file mode 100644 index 0000000000..83e516ea9d --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/java/java",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},t.language={defaultToken:"",tokenPostfix:".java",keywords:["abstract","continue","for","new","switch","assert","default","goto","package","synchronized","boolean","do","if","private","this","break","double","implements","protected","throw","byte","else","import","public","throws","case","enum","instanceof","return","transient","catch","extends","int","short","try","char","final","interface","static","void","class","finally","long","strictfp","volatile","const","float","native","super","while","true","false"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js new file mode 100644 index 0000000000..66dc825f7e --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/typescript/typescript",["require","exports","../fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:n.languages.IndentAction.IndentOutdent,appendText:" * "}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:n.languages.IndentAction.None,appendText:" * "}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:n.languages.IndentAction.None,appendText:"* "}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:n.languages.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],folding:{markers:{start:new RegExp("^\\s*//\\s*#?region\\b"),end:new RegExp("^\\s*//\\s*#?endregion\\b")}}},t.language={defaultToken:"invalid",tokenPostfix:".ts",keywords:["abstract","any","as","asserts","bigint","boolean","break","case","catch","class","continue","const","constructor","debugger","declare","default","delete","do","else","enum","export","extends","false","finally","for","from","function","get","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","null","number","object","package","private","protected","public","readonly","require","global","return","set","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield","async","await","of"],operators:["<=",">=","==","!=","===","!==","=>","+","-","**","*","/","%","++","--","<<",">",">>>","&","|","^","!","~","&&","||","??","?",":","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=","@"],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/`/,"string","@string_backtick"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([gimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],string_backtick:[[/\$\{/,{token:"delimiter.bracket",next:"@bracketCounting"}],[/[^\\`$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/`/,"string","@pop"]],bracketCounting:[[/\{/,"delimiter.bracket","@bracketCounting"],[/\}/,"delimiter.bracket","@pop"],{include:"common"}]}}})),define("vs/basic-languages/javascript/javascript",["require","exports","../typescript/typescript"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf=n.conf,t.language={defaultToken:"invalid",tokenPostfix:".js",keywords:["break","case","catch","class","continue","const","constructor","debugger","default","delete","do","else","export","extends","false","finally","for","from","function","get","if","import","in","instanceof","let","new","null","return","set","super","switch","symbol","this","throw","true","try","typeof","undefined","var","void","while","with","yield","async","await","of"],typeKeywords:[],operators:n.language.operators,symbols:n.language.symbols,escapes:n.language.escapes,digits:n.language.digits,octaldigits:n.language.octaldigits,binarydigits:n.language.binarydigits,hexdigits:n.language.hexdigits,regexpctl:n.language.regexpctl,regexpesc:n.language.regexpesc,tokenizer:n.language.tokenizer}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js new file mode 100644 index 0000000000..3d27f05d3c --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/julia/julia",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={tokenPostfix:".julia",keywords:["begin","while","if","for","try","return","break","continue","function","macro","quote","let","local","global","const","do","struct","module","baremodule","using","import","export","end","else","elseif","catch","finally","mutable","primitive","abstract","type","in","isa","where","new"],types:["LinRange","LineNumberNode","LinearIndices","LoadError","MIME","Matrix","Method","MethodError","Missing","MissingException","Module","NTuple","NamedTuple","Nothing","Number","OrdinalRange","OutOfMemoryError","OverflowError","Pair","PartialQuickSort","PermutedDimsArray","Pipe","Ptr","QuoteNode","Rational","RawFD","ReadOnlyMemoryError","Real","ReentrantLock","Ref","Regex","RegexMatch","RoundingMode","SegmentationFault","Set","Signed","Some","StackOverflowError","StepRange","StepRangeLen","StridedArray","StridedMatrix","StridedVecOrMat","StridedVector","String","StringIndexError","SubArray","SubString","SubstitutionString","Symbol","SystemError","Task","Text","TextDisplay","Timer","Tuple","Type","TypeError","TypeVar","UInt","UInt128","UInt16","UInt32","UInt64","UInt8","UndefInitializer","AbstractArray","UndefKeywordError","AbstractChannel","UndefRefError","AbstractChar","UndefVarError","AbstractDict","Union","AbstractDisplay","UnionAll","AbstractFloat","UnitRange","AbstractIrrational","Unsigned","AbstractMatrix","AbstractRange","Val","AbstractSet","Vararg","AbstractString","VecElement","AbstractUnitRange","VecOrMat","AbstractVecOrMat","Vector","AbstractVector","VersionNumber","Any","WeakKeyDict","ArgumentError","WeakRef","Array","AssertionError","BigFloat","BigInt","BitArray","BitMatrix","BitSet","BitVector","Bool","BoundsError","CapturedException","CartesianIndex","CartesianIndices","Cchar","Cdouble","Cfloat","Channel","Char","Cint","Cintmax_t","Clong","Clonglong","Cmd","Colon","Complex","ComplexF16","ComplexF32","ComplexF64","CompositeException","Condition","Cptrdiff_t","Cshort","Csize_t","Cssize_t","Cstring","Cuchar","Cuint","Cuintmax_t","Culong","Culonglong","Cushort","Cvoid","Cwchar_t","Cwstring","DataType","DenseArray","DenseMatrix","DenseVecOrMat","DenseVector","Dict","DimensionMismatch","Dims","DivideError","DomainError","EOFError","Enum","ErrorException","Exception","ExponentialBackOff","Expr","Float16","Float32","Float64","Function","GlobalRef","HTML","IO","IOBuffer","IOContext","IOStream","IdDict","IndexCartesian","IndexLinear","IndexStyle","InexactError","InitError","Int","Int128","Int16","Int32","Int64","Int8","Integer","InterruptException","InvalidStateException","Irrational","KeyError"],keywordops:["<:",">:",":","=>","...",".","->","?"],allops:/[^\w\d\s()\[\]{}"'#]+/,constants:["true","false","nothing","missing","undef","Inf","pi","NaN","π","ℯ","ans","PROGRAM_FILE","ARGS","C_NULL","VERSION","DEPOT_PATH","LOAD_PATH"],operators:["!","!=","!==","%","&","*","+","-","/","//","<","<<","<=","==","===","=>",">",">=",">>",">>>","\\","^","|","|>","~","÷","∈","∉","∋","∌","∘","√","∛","∩","∪","≈","≉","≠","≡","≢","≤","≥","⊆","⊇","⊈","⊉","⊊","⊋","⊻"],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],ident:/π|ℯ|\b(?!\d)\w+\b/,escape:/(?:[abefnrstv\\"'\n\r]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2}|u[0-9A-Fa-f]{4})/,escapes:/\\(?:C\-(@escape|.)|c(@escape|.)|@escape)/,tokenizer:{root:[[/(::)\s*|\b(isa)\s+/,"keyword","@typeanno"],[/\b(isa)(\s*\(@ident\s*,\s*)/,["keyword",{token:"",next:"@typeanno"}]],[/\b(type|struct)[ \t]+/,"keyword","@typeanno"],[/^\s*:@ident[!?]?/,"metatag"],[/(return)(\s*:@ident[!?]?)/,["keyword","metatag"]],[/(\(|\[|\{|@allops)(\s*:@ident[!?]?)/,["","metatag"]],[/:\(/,"metatag","@quote"],[/r"""/,"regexp.delim","@tregexp"],[/r"/,"regexp.delim","@sregexp"],[/raw"""/,"string.delim","@rtstring"],[/[bv]?"""/,"string.delim","@dtstring"],[/raw"/,"string.delim","@rsstring"],[/[bv]?"/,"string.delim","@dsstring"],[/(@ident)\{/,{cases:{"$1@types":{token:"type",next:"@gen"},"@default":{token:"type",next:"@gen"}}}],[/@ident[!?'']?(?=\.?\()/,{cases:{"@types":"type","@keywords":"keyword","@constants":"variable","@default":"keyword.flow"}}],[/@ident[!?']?/,{cases:{"@types":"type","@keywords":"keyword","@constants":"variable","@default":"identifier"}}],[/\$\w+/,"key"],[/\$\(/,"key","@paste"],[/@@ident/,"annotation"],{include:"@whitespace"},[/'(?:@escapes|.)'/,"string.character"],[/[()\[\]{}]/,"@brackets"],[/@allops/,{cases:{"@keywordops":"keyword","@operators":"operator"}}],[/[;,]/,"delimiter"],[/0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/,"number.hex"],[/0[_oO][0-7](_?[0-7])*/,"number.octal"],[/0[bB][01](_?[01])*/,"number.binary"],[/[+\-]?\d+(\.\d+)?(im?|[eE][+\-]?\d+(\.\d+)?)?/,"number"]],typeanno:[[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/,"type","@gen"],[/([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)(\s*<:\s*)/,["type","keyword"]],[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/,"type","@pop"],["","","@pop"]],gen:[[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/,"type","@push"],[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/,"type"],[/<:/,"keyword"],[/(\})(\s*<:\s*)/,["type",{token:"keyword",next:"@pop"}]],[/\}/,"type","@pop"],{include:"@root"}],quote:[[/\$\(/,"key","@paste"],[/\(/,"@brackets","@paren"],[/\)/,"metatag","@pop"],{include:"@root"}],paste:[[/:\(/,"metatag","@quote"],[/\(/,"@brackets","@paren"],[/\)/,"key","@pop"],{include:"@root"}],paren:[[/\$\(/,"key","@paste"],[/:\(/,"metatag","@quote"],[/\(/,"@brackets","@push"],[/\)/,"@brackets","@pop"],{include:"@root"}],sregexp:[[/^.*/,"invalid"],[/[^\\"()\[\]{}]/,"regexp"],[/[()\[\]{}]/,"@brackets"],[/\\./,"operator.scss"],[/"[imsx]*/,"regexp.delim","@pop"]],tregexp:[[/[^\\"()\[\]{}]/,"regexp"],[/[()\[\]{}]/,"@brackets"],[/\\./,"operator.scss"],[/"(?!"")/,"string"],[/"""[imsx]*/,"regexp.delim","@pop"]],rsstring:[[/^.*/,"invalid"],[/[^\\"]/,"string"],[/\\./,"string.escape"],[/"/,"string.delim","@pop"]],rtstring:[[/[^\\"]/,"string"],[/\\./,"string.escape"],[/"(?!"")/,"string"],[/"""/,"string.delim","@pop"]],dsstring:[[/^.*/,"invalid"],[/[^\\"\$]/,"string"],[/\$/,"","@interpolated"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string.delim","@pop"]],dtstring:[[/[^\\"\$]/,"string"],[/\$/,"","@interpolated"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"(?!"")/,"string"],[/"""/,"string.delim","@pop"]],interpolated:[[/\(/,{token:"",switchTo:"@interpolated_compound"}],[/[a-zA-Z_]\w*/,"identifier"],["","","@pop"]],interpolated_compound:[[/\)/,"","@pop"],{include:"@root"}],whitespace:[[/[ \t\r\n]+/,""],[/#=/,"comment","@multi_comment"],[/#.*$/,"comment"]],multi_comment:[[/#=/,"comment","@push"],[/=#/,"comment","@pop"],[/=(?!#)|#(?!=)/,"comment"],[/[^#=]+/,"comment"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js new file mode 100644 index 0000000000..f2568426e7 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/kotlin/kotlin",["require","exports"],(function(e,i){"use strict";Object.defineProperty(i,"__esModule",{value:!0}),i.language=i.conf=void 0,i.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},i.language={defaultToken:"",tokenPostfix:".kt",keywords:["as","as?","break","class","continue","do","else","false","for","fun","if","in","!in","interface","is","!is","null","object","package","return","super","this","throw","true","try","typealias","val","var","when","while","by","catch","constructor","delegate","dynamic","field","file","finally","get","import","init","param","property","receiver","set","setparam","where","actual","abstract","annotation","companion","const","crossinline","data","enum","expect","external","final","infix","inline","inner","internal","lateinit","noinline","open","operator","out","override","private","protected","public","reified","sealed","suspend","tailrec","vararg","field","it"],operators:["+","-","*","/","%","=","+=","-=","*=","/=","%=","++","--","&&","||","!","==","!=","===","!==",">","<","<=",">=","[","]","!!","?.","?:","::","..",":","?","->","@",";","$","_"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string","@multistring"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc","@push"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],multistring:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"""/,"string","@pop"],[/./,"string"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js new file mode 100644 index 0000000000..edcf04de3c --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/less/less",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(#?-?\d*\.\d\w*%?)|([@#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},t.language={defaultToken:"",tokenPostfix:".less",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",identifierPlus:"-?-?([a-zA-Z:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@nestedJSBegin"},["[ \\t\\r\\n]+",""],{include:"@comments"},{include:"@keyword"},{include:"@strings"},{include:"@numbers"},["[*_]?[a-zA-Z\\-\\s]+(?=:.*(;|(\\\\$)))","attribute.name","@attribute"],["url(\\-prefix)?\\(",{token:"tag",next:"@urldeclaration"}],["[{}()\\[\\]]","@brackets"],["[,:;]","delimiter"],["#@identifierPlus","tag.id"],["&","tag"],["\\.@identifierPlus(?=\\()","tag.class","@attribute"],["\\.@identifierPlus","tag.class"],["@identifierPlus","tag"],{include:"@operators"},["@(@identifier(?=[:,\\)]))","variable","@attribute"],["@(@identifier)","variable"],["@","key","@atRules"]],nestedJSBegin:[["``","delimiter.backtick"],["`",{token:"delimiter.backtick",next:"@nestedJSEnd",nextEmbedded:"text/javascript"}]],nestedJSEnd:[["`",{token:"delimiter.backtick",next:"@pop",nextEmbedded:"@pop"}]],operators:[["[<>=\\+\\-\\*\\/\\^\\|\\~]","operator"]],keyword:[["(@[\\s]*import|![\\s]*important|true|false|when|iscolor|isnumber|isstring|iskeyword|isurl|ispixel|ispercentage|isem|hue|saturation|lightness|alpha|lighten|darken|saturate|desaturate|fadein|fadeout|fade|spin|mix|round|ceil|floor|percentage)\\b","keyword"]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"tag",next:"@pop"}]],attribute:[{include:"@nestedJSBegin"},{include:"@comments"},{include:"@strings"},{include:"@numbers"},{include:"@keyword"},["[a-zA-Z\\-]+(?=\\()","attribute.value","@attribute"],[">","operator","@pop"],["@identifier","attribute.value"],{include:"@operators"},["@(@identifier)","variable"],["[)\\}]","@brackets","@pop"],["[{}()\\[\\]>]","@brackets"],["[;]","delimiter","@pop"],["[,=:]","delimiter"],["\\s",""],[".","attribute.value"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],strings:[['~?"',{token:"string.delimiter",next:"@stringsEndDoubleQuote"}],["~?'",{token:"string.delimiter",next:"@stringsEndQuote"}]],stringsEndDoubleQuote:[['\\\\"',"string"],['"',{token:"string.delimiter",next:"@popall"}],[".","string"]],stringsEndQuote:[["\\\\'","string"],["'",{token:"string.delimiter",next:"@popall"}],[".","string"]],atRules:[{include:"@comments"},{include:"@strings"},["[()]","delimiter"],["[\\{;]","delimiter","@pop"],[".","key"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js new file mode 100644 index 0000000000..f52f8ec387 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/lexon/lexon",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"COMMENT"},brackets:[["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:":",close:"."}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"},{open:":",close:"."}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|COMMENT\\s+)#region"),end:new RegExp("^\\s*(::\\s*|COMMENT\\s+)#endregion")}}},t.language={tokenPostfix:".lexon",ignoreCase:!0,keywords:["lexon","lex","clause","terms","contracts","may","pay","pays","appoints","into","to"],typeKeywords:["amount","person","key","time","date","asset","text"],operators:["less","greater","equal","le","gt","or","and","add","added","subtract","subtracted","multiply","multiplied","times","divide","divided","is","be","certified"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\.\d*\.\d*/,"number.semver"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"]],quoted_identifier:[[/[^\\"]+/,"identifier"],[/"/,{token:"identifier.quote",bracket:"@close",next:"@pop"}]],space_identifier_until_period:[[":","delimiter"],[" ",{token:"white",next:"@identifier_rest"}]],identifier_until_period:[{include:"@whitespace"},[":",{token:"delimiter",next:"@identifier_rest"}],[/[^\\.]+/,"identifier"],[/\./,{token:"delimiter",bracket:"@close",next:"@pop"}]],identifier_rest:[[/[^\\.]+/,"identifier"],[/\./,{token:"delimiter",bracket:"@close",next:"@pop"}]],semver:[{include:"@whitespace"},[":","delimiter"],[/\d*\.\d*\.\d*/,{token:"number.semver",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lua/lua.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lua/lua.js new file mode 100644 index 0000000000..da401990c7 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lua/lua.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/lua/lua",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"--",blockComment:["--[[","]]"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".lua",keywords:["and","break","do","else","elseif","end","false","for","function","goto","if","in","local","nil","not","or","repeat","return","then","true","until","while"],brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],operators:["+","-","*","/","%","^","#","==","~=","<=",">=","<",">","=",";",":",",",".","..","..."],symbols:/[=>"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}]},o.language={defaultToken:"",tokenPostfix:".m3",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["AND","ANY","ARRAY","AS","BEGIN","BITS","BRANDED","BY","CASE","CONST","DIV","DO","ELSE","ELSIF","END","EVAL","EXCEPT","EXCEPTION","EXIT","EXPORTS","FINALLY","FOR","FROM","GENERIC","IF","IMPORT","IN","INTERFACE","LOCK","LOOP","METHODS","MOD","MODULE","NOT","OBJECT","OF","OR","OVERRIDES","PROCEDURE","RAISE","RAISES","READONLY","RECORD","REF","REPEAT","RETURN","REVEAL","SET","THEN","TO","TRY","TYPE","TYPECASE","UNSAFE","UNTIL","UNTRACED","VALUE","VAR","WHILE","WITH"],reservedConstNames:["ABS","ADR","ADRSIZE","BITSIZE","BYTESIZE","CEILING","DEC","DISPOSE","FALSE","FIRST","FLOAT","FLOOR","INC","ISTYPE","LAST","LOOPHOLE","MAX","MIN","NARROW","NEW","NIL","NUMBER","ORD","ROUND","SUBARRAY","TRUE","TRUNC","TYPECODE","VAL"],reservedTypeNames:["ADDRESS","ANY","BOOLEAN","CARDINAL","CHAR","EXTENDED","INTEGER","LONGCARD","LONGINT","LONGREAL","MUTEX","NULL","REAL","REFANY","ROOT","TEXT"],operators:["+","-","*","/","&","^","."],relations:["=","#","<","<=",">",">=","<:",":"],delimiters:["|","..","=>",",",";",":="],symbols:/[>=<#.,:;+\-*/&^]+/,escapes:/\\(?:[\\fnrt"']|[0-7]{3})/,tokenizer:{root:[[/_\w*/,"invalid"],[/[a-zA-Z][a-zA-Z0-9_]*/,{cases:{"@keywords":{token:"keyword.$0"},"@reservedConstNames":{token:"constant.reserved.$0"},"@reservedTypeNames":{token:"type.reserved.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[0-9]+\.[0-9]+(?:[DdEeXx][\+\-]?[0-9]+)?/,"number.float"],[/[0-9]+(?:\_[0-9a-fA-F]+)?L?/,"number"],[/@symbols/,{cases:{"@operators":"operators","@relations":"operators","@delimiters":"delimiter","@default":"invalid"}}],[/'[^\\']'/,"string.char"],[/(')(@escapes)(')/,["string.char","string.escape","string.char"]],[/'/,"invalid"],[/"([^"\\]|\\.)*$/,"invalid"],[/"/,"string.text","@text"]],text:[[/[^\\"]+/,"string.text"],[/@escapes/,"string.escape"],[/\\./,"invalid"],[/"/,"string.text","@pop"]],comment:[[/\(\*/,"comment","@push"],[/\*\)/,"comment","@pop"],[/./,"comment"]],pragma:[[/<\*/,"keyword.pragma","@push"],[/\*>/,"keyword.pragma","@pop"],[/./,"keyword.pragma"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/<\*/,"keyword.pragma","@pragma"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/markdown/markdown.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/markdown/markdown.js new file mode 100644 index 0000000000..dc020eef6a --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/markdown/markdown.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/markdown/markdown",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{blockComment:["\x3c!--","--\x3e"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}],folding:{markers:{start:new RegExp("^\\s*\x3c!--\\s*#?region\\b.*--\x3e"),end:new RegExp("^\\s*\x3c!--\\s*#?endregion\\b.*--\x3e")}}},t.language={defaultToken:"",tokenPostfix:".md",control:/[\\`*_\[\]{}()#+\-\.!]/,noncontrol:/[^\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,jsescapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],tokenizer:{root:[[/^\s*\|/,"@rematch","@table_header"],[/^(\s{0,3})(#+)((?:[^\\#]|@escapes)+)((?:#+)?)/,["white","keyword","keyword","keyword"]],[/^\s*(=+|\-+)\s*$/,"keyword"],[/^\s*((\*[ ]?)+)\s*$/,"meta.separator"],[/^\s*>+/,"comment"],[/^\s*([\*\-+:]|\d+\.)\s/,"keyword"],[/^(\t|[ ]{4})[^ ].*$/,"string"],[/^\s*~~~\s*((?:\w|[\/\-#])+)?\s*$/,{token:"string",next:"@codeblock"}],[/^\s*```\s*((?:\w|[\/\-#])+).*$/,{token:"string",next:"@codeblockgh",nextEmbedded:"$1"}],[/^\s*```\s*$/,{token:"string",next:"@codeblock"}],{include:"@linecontent"}],table_header:[{include:"@table_common"},[/[^\|]+/,"keyword.table.header"]],table_body:[{include:"@table_common"},{include:"@linecontent"}],table_common:[[/\s*[\-:]+\s*/,{token:"keyword",switchTo:"table_body"}],[/^\s*\|/,"keyword.table.left"],[/^\s*[^\|]/,"@rematch","@pop"],[/^\s*$/,"@rematch","@pop"],[/\|/,{cases:{"@eos":"keyword.table.right","@default":"keyword.table.middle"}}]],codeblock:[[/^\s*~~~\s*$/,{token:"string",next:"@pop"}],[/^\s*```\s*$/,{token:"string",next:"@pop"}],[/.*$/,"variable.source"]],codeblockgh:[[/```\s*$/,{token:"variable.source",next:"@pop",nextEmbedded:"@pop"}],[/[^`]+/,"variable.source"]],linecontent:[[/&\w+;/,"string.escape"],[/@escapes/,"escape"],[/\b__([^\\_]|@escapes|_(?!_))+__\b/,"strong"],[/\*\*([^\\*]|@escapes|\*(?!\*))+\*\*/,"strong"],[/\b_[^_]+_\b/,"emphasis"],[/\*([^\\*]|@escapes)+\*/,"emphasis"],[/`([^\\`]|@escapes)+`/,"variable"],[/\{+[^}]+\}+/,"string.target"],[/(!?\[)((?:[^\]\\]|@escapes)*)(\]\([^\)]+\))/,["string.link","","string.link"]],[/(!?\[)((?:[^\]\\]|@escapes)*)(\])/,"string.link"],{include:"html"}],html:[[/<(\w+)\/>/,"tag"],[/<(\w+)/,{cases:{"@empty":{token:"tag",next:"@tag.$1"},"@default":{token:"tag",next:"@tag.$1"}}}],[/<\/(\w+)\s*>/,{token:"tag"}],[//,"comment","@pop"],[//,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],phpInSimpleState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3"}],{include:"phpRoot"}],phpInEmbeddedState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"phpRoot"}],phpRoot:[[/[a-zA-Z_]\w*/,{cases:{"@phpKeywords":{token:"keyword.php"},"@phpCompileTimeConstants":{token:"constant.php"},"@default":"identifier.php"}}],[/[$a-zA-Z_]\w*/,{cases:{"@phpPreDefinedVariables":{token:"variable.predefined.php"},"@default":"variable.php"}}],[/[{}]/,"delimiter.bracket.php"],[/[\[\]]/,"delimiter.array.php"],[/[()]/,"delimiter.parenthesis.php"],[/[ \t\r\n]+/],[/(#|\/\/)$/,"comment.php"],[/(#|\/\/)/,"comment.php","@phpLineComment"],[/\/\*/,"comment.php","@phpComment"],[/"/,"string.php","@phpDoubleQuoteString"],[/'/,"string.php","@phpSingleQuoteString"],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,\@]/,"delimiter.php"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.php"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.php"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.php"],[/0[0-7']*[0-7]/,"number.octal.php"],[/0[bB][0-1']*[0-1]/,"number.binary.php"],[/\d[\d']*/,"number.php"],[/\d/,"number.php"]],phpComment:[[/\*\//,"comment.php","@pop"],[/[^*]+/,"comment.php"],[/./,"comment.php"]],phpLineComment:[[/\?>/,{token:"@rematch",next:"@pop"}],[/.$/,"comment.php","@pop"],[/[^?]+$/,"comment.php","@pop"],[/[^?]+/,"comment.php"],[/./,"comment.php"]],phpDoubleQuoteString:[[/[^\\"]+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/"/,"string.php","@pop"]],phpSingleQuoteString:[[/[^\\']+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/'/,"string.php","@pop"]]},phpKeywords:["abstract","and","array","as","break","callable","case","catch","cfunction","class","clone","const","continue","declare","default","do","else","elseif","enddeclare","endfor","endforeach","endif","endswitch","endwhile","extends","false","final","for","foreach","function","global","goto","if","implements","interface","instanceof","insteadof","namespace","new","null","object","old_function","or","private","protected","public","resource","static","switch","throw","trait","try","true","use","var","while","xor","die","echo","empty","exit","eval","include","include_once","isset","list","require","require_once","return","print","unset","yield","__construct"],phpCompileTimeConstants:["__CLASS__","__DIR__","__FILE__","__LINE__","__NAMESPACE__","__METHOD__","__FUNCTION__","__TRAIT__"],phpPreDefinedVariables:["$GLOBALS","$_SERVER","$_GET","$_POST","$_FILES","$_REQUEST","$_SESSION","$_ENV","$_COOKIE","$php_errormsg","$HTTP_RAW_POST_DATA","$http_response_header","$argc","$argv"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js new file mode 100644 index 0000000000..df397c1cae --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/postiats/postiats",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},t.language={tokenPostfix:".pats",defaultToken:"invalid",keywords:["abstype","abst0ype","absprop","absview","absvtype","absviewtype","absvt0ype","absviewt0ype","as","and","assume","begin","classdec","datasort","datatype","dataprop","dataview","datavtype","dataviewtype","do","end","extern","extype","extvar","exception","fn","fnx","fun","prfn","prfun","praxi","castfn","if","then","else","ifcase","in","infix","infixl","infixr","prefix","postfix","implmnt","implement","primplmnt","primplement","import","let","local","macdef","macrodef","nonfix","symelim","symintr","overload","of","op","rec","sif","scase","sortdef","sta","stacst","stadef","static","staload","dynload","try","tkindef","typedef","propdef","viewdef","vtypedef","viewtypedef","prval","var","prvar","when","where","with","withtype","withprop","withview","withvtype","withviewtype"],keywords_dlr:["$delay","$ldelay","$arrpsz","$arrptrsize","$d2ctype","$effmask","$effmask_ntm","$effmask_exn","$effmask_ref","$effmask_wrt","$effmask_all","$extern","$extkind","$extype","$extype_struct","$extval","$extfcall","$extmcall","$literal","$myfilename","$mylocation","$myfunction","$lst","$lst_t","$lst_vt","$list","$list_t","$list_vt","$rec","$rec_t","$rec_vt","$record","$record_t","$record_vt","$tup","$tup_t","$tup_vt","$tuple","$tuple_t","$tuple_vt","$break","$continue","$raise","$showtype","$vcopyenv_v","$vcopyenv_vt","$tempenver","$solver_assert","$solver_verify"],keywords_srp:["#if","#ifdef","#ifndef","#then","#elif","#elifdef","#elifndef","#else","#endif","#error","#prerr","#print","#assert","#undef","#define","#include","#require","#pragma","#codegen2","#codegen3"],irregular_keyword_list:["val+","val-","val","case+","case-","case","addr@","addr","fold@","free@","fix@","fix","lam@","lam","llam@","llam","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","view+","view-","view@","view","type+","type-","type","vtype+","vtype-","vtype","vt@ype+","vt@ype-","vt@ype","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","prop+","prop-","prop","type+","type-","type","t@ype","t@ype+","t@ype-","abst@ype","abstype","absviewt@ype","absvt@ype","for*","for","while*","while"],keywords_types:["bool","double","byte","int","short","char","void","unit","long","float","string","strptr"],keywords_effects:["0","fun","clo","prf","funclo","cloptr","cloref","ref","ntm","1"],operators:["@","!","|","`",":","$",".","=","#","~","..","...","=>","=<>","=/=>","=>>","=/=>>","<",">","><",".<",">.",".<>.","->","-<>"],brackets:[{open:",(",close:")",token:"delimiter.parenthesis"},{open:"`(",close:")",token:"delimiter.parenthesis"},{open:"%(",close:")",token:"delimiter.parenthesis"},{open:"'(",close:")",token:"delimiter.parenthesis"},{open:"'{",close:"}",token:"delimiter.parenthesis"},{open:"@(",close:")",token:"delimiter.parenthesis"},{open:"@{",close:"}",token:"delimiter.brace"},{open:"@[",close:"]",token:"delimiter.square"},{open:"#[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],symbols:/[=>]/,digit:/[0-9]/,digitseq0:/@digit*/,xdigit:/[0-9A-Za-z]/,xdigitseq0:/@xdigit*/,INTSP:/[lLuU]/,FLOATSP:/[fFlL]/,fexponent:/[eE][+-]?[0-9]+/,fexponent_bin:/[pP][+-]?[0-9]+/,deciexp:/\.[0-9]*@fexponent?/,hexiexp:/\.[0-9a-zA-Z]*@fexponent_bin?/,irregular_keywords:/val[+-]?|case[+-]?|addr\@?|fold\@|free\@|fix\@?|lam\@?|llam\@?|prop[+-]?|type[+-]?|view[+-@]?|viewt@?ype[+-]?|t@?ype[+-]?|v(iew)?t@?ype[+-]?|abst@?ype|absv(iew)?t@?ype|for\*?|while\*?/,ESCHAR:/[ntvbrfa\\\?'"\(\[\{]/,start:"root",tokenizer:{root:[{regex:/[ \t\r\n]+/,action:{token:""}},{regex:/\(\*\)/,action:{token:"invalid"}},{regex:/\(\*/,action:{token:"comment",next:"lexing_COMMENT_block_ml"}},{regex:/\(/,action:"@brackets"},{regex:/\)/,action:"@brackets"},{regex:/\[/,action:"@brackets"},{regex:/\]/,action:"@brackets"},{regex:/\{/,action:"@brackets"},{regex:/\}/,action:"@brackets"},{regex:/,\(/,action:"@brackets"},{regex:/,/,action:{token:"delimiter.comma"}},{regex:/;/,action:{token:"delimiter.semicolon"}},{regex:/@\(/,action:"@brackets"},{regex:/@\[/,action:"@brackets"},{regex:/@\{/,action:"@brackets"},{regex:/:/,action:{token:"@rematch",next:"@pop"}}],lexing_EXTCODE:[{regex:/^%}/,action:{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}},{regex:/[^%]+/,action:""}],lexing_DQUOTE:[{regex:/"/,action:{token:"string.quote",next:"@pop"}},{regex:/(\{\$)(@IDENTFST@IDENTRST*)(\})/,action:[{token:"string.escape"},{token:"identifier"},{token:"string.escape"}]},{regex:/\\$/,action:{token:"string.escape"}},{regex:/\\(@ESCHAR|[xX]@xdigit+|@digit+)/,action:{token:"string.escape"}},{regex:/[^\\"]+/,action:{token:"string"}}]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js new file mode 100644 index 0000000000..eee02c521c --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/powerquery/powerquery",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment","identifier"]},{open:"[",close:"]",notIn:["string","comment","identifier"]},{open:"(",close:")",notIn:["string","comment","identifier"]},{open:"{",close:"}",notIn:["string","comment","identifier"]}]},t.language={defaultToken:"",tokenPostfix:".pq",ignoreCase:!1,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.brackets"},{open:"(",close:")",token:"delimiter.parenthesis"}],operatorKeywords:["and","not","or"],keywords:["as","each","else","error","false","if","in","is","let","meta","otherwise","section","shared","then","true","try","type"],constructors:["#binary","#date","#datetime","#datetimezone","#duration","#table","#time"],constants:["#infinity","#nan","#sections","#shared"],typeKeywords:["action","any","anynonnull","none","null","logical","number","time","date","datetime","datetimezone","duration","text","binary","list","record","table","function"],builtinFunctions:["Access.Database","Action.Return","Action.Sequence","Action.Try","ActiveDirectory.Domains","AdoDotNet.DataSource","AdoDotNet.Query","AdobeAnalytics.Cubes","AnalysisServices.Database","AnalysisServices.Databases","AzureStorage.BlobContents","AzureStorage.Blobs","AzureStorage.Tables","Binary.Buffer","Binary.Combine","Binary.Compress","Binary.Decompress","Binary.End","Binary.From","Binary.FromList","Binary.FromText","Binary.InferContentType","Binary.Length","Binary.ToList","Binary.ToText","BinaryFormat.7BitEncodedSignedInteger","BinaryFormat.7BitEncodedUnsignedInteger","BinaryFormat.Binary","BinaryFormat.Byte","BinaryFormat.ByteOrder","BinaryFormat.Choice","BinaryFormat.Decimal","BinaryFormat.Double","BinaryFormat.Group","BinaryFormat.Length","BinaryFormat.List","BinaryFormat.Null","BinaryFormat.Record","BinaryFormat.SignedInteger16","BinaryFormat.SignedInteger32","BinaryFormat.SignedInteger64","BinaryFormat.Single","BinaryFormat.Text","BinaryFormat.Transform","BinaryFormat.UnsignedInteger16","BinaryFormat.UnsignedInteger32","BinaryFormat.UnsignedInteger64","Byte.From","Character.FromNumber","Character.ToNumber","Combiner.CombineTextByDelimiter","Combiner.CombineTextByEachDelimiter","Combiner.CombineTextByLengths","Combiner.CombineTextByPositions","Combiner.CombineTextByRanges","Comparer.Equals","Comparer.FromCulture","Comparer.Ordinal","Comparer.OrdinalIgnoreCase","Csv.Document","Cube.AddAndExpandDimensionColumn","Cube.AddMeasureColumn","Cube.ApplyParameter","Cube.AttributeMemberId","Cube.AttributeMemberProperty","Cube.CollapseAndRemoveColumns","Cube.Dimensions","Cube.DisplayFolders","Cube.Measures","Cube.Parameters","Cube.Properties","Cube.PropertyKey","Cube.ReplaceDimensions","Cube.Transform","Currency.From","DB2.Database","Date.AddDays","Date.AddMonths","Date.AddQuarters","Date.AddWeeks","Date.AddYears","Date.Day","Date.DayOfWeek","Date.DayOfWeekName","Date.DayOfYear","Date.DaysInMonth","Date.EndOfDay","Date.EndOfMonth","Date.EndOfQuarter","Date.EndOfWeek","Date.EndOfYear","Date.From","Date.FromText","Date.IsInCurrentDay","Date.IsInCurrentMonth","Date.IsInCurrentQuarter","Date.IsInCurrentWeek","Date.IsInCurrentYear","Date.IsInNextDay","Date.IsInNextMonth","Date.IsInNextNDays","Date.IsInNextNMonths","Date.IsInNextNQuarters","Date.IsInNextNWeeks","Date.IsInNextNYears","Date.IsInNextQuarter","Date.IsInNextWeek","Date.IsInNextYear","Date.IsInPreviousDay","Date.IsInPreviousMonth","Date.IsInPreviousNDays","Date.IsInPreviousNMonths","Date.IsInPreviousNQuarters","Date.IsInPreviousNWeeks","Date.IsInPreviousNYears","Date.IsInPreviousQuarter","Date.IsInPreviousWeek","Date.IsInPreviousYear","Date.IsInYearToDate","Date.IsLeapYear","Date.Month","Date.MonthName","Date.QuarterOfYear","Date.StartOfDay","Date.StartOfMonth","Date.StartOfQuarter","Date.StartOfWeek","Date.StartOfYear","Date.ToRecord","Date.ToText","Date.WeekOfMonth","Date.WeekOfYear","Date.Year","DateTime.AddZone","DateTime.Date","DateTime.FixedLocalNow","DateTime.From","DateTime.FromFileTime","DateTime.FromText","DateTime.IsInCurrentHour","DateTime.IsInCurrentMinute","DateTime.IsInCurrentSecond","DateTime.IsInNextHour","DateTime.IsInNextMinute","DateTime.IsInNextNHours","DateTime.IsInNextNMinutes","DateTime.IsInNextNSeconds","DateTime.IsInNextSecond","DateTime.IsInPreviousHour","DateTime.IsInPreviousMinute","DateTime.IsInPreviousNHours","DateTime.IsInPreviousNMinutes","DateTime.IsInPreviousNSeconds","DateTime.IsInPreviousSecond","DateTime.LocalNow","DateTime.Time","DateTime.ToRecord","DateTime.ToText","DateTimeZone.FixedLocalNow","DateTimeZone.FixedUtcNow","DateTimeZone.From","DateTimeZone.FromFileTime","DateTimeZone.FromText","DateTimeZone.LocalNow","DateTimeZone.RemoveZone","DateTimeZone.SwitchZone","DateTimeZone.ToLocal","DateTimeZone.ToRecord","DateTimeZone.ToText","DateTimeZone.ToUtc","DateTimeZone.UtcNow","DateTimeZone.ZoneHours","DateTimeZone.ZoneMinutes","Decimal.From","Diagnostics.ActivityId","Diagnostics.Trace","DirectQueryCapabilities.From","Double.From","Duration.Days","Duration.From","Duration.FromText","Duration.Hours","Duration.Minutes","Duration.Seconds","Duration.ToRecord","Duration.ToText","Duration.TotalDays","Duration.TotalHours","Duration.TotalMinutes","Duration.TotalSeconds","Embedded.Value","Error.Record","Excel.CurrentWorkbook","Excel.Workbook","Exchange.Contents","Expression.Constant","Expression.Evaluate","Expression.Identifier","Facebook.Graph","File.Contents","Folder.Contents","Folder.Files","Function.From","Function.Invoke","Function.InvokeAfter","Function.IsDataSource","GoogleAnalytics.Accounts","Guid.From","HdInsight.Containers","HdInsight.Contents","HdInsight.Files","Hdfs.Contents","Hdfs.Files","Informix.Database","Int16.From","Int32.From","Int64.From","Int8.From","ItemExpression.From","Json.Document","Json.FromValue","Lines.FromBinary","Lines.FromText","Lines.ToBinary","Lines.ToText","List.Accumulate","List.AllTrue","List.Alternate","List.AnyTrue","List.Average","List.Buffer","List.Combine","List.Contains","List.ContainsAll","List.ContainsAny","List.Count","List.Covariance","List.DateTimeZones","List.DateTimes","List.Dates","List.Difference","List.Distinct","List.Durations","List.FindText","List.First","List.FirstN","List.Generate","List.InsertRange","List.Intersect","List.IsDistinct","List.IsEmpty","List.Last","List.LastN","List.MatchesAll","List.MatchesAny","List.Max","List.MaxN","List.Median","List.Min","List.MinN","List.Mode","List.Modes","List.NonNullCount","List.Numbers","List.PositionOf","List.PositionOfAny","List.Positions","List.Product","List.Random","List.Range","List.RemoveFirstN","List.RemoveItems","List.RemoveLastN","List.RemoveMatchingItems","List.RemoveNulls","List.RemoveRange","List.Repeat","List.ReplaceMatchingItems","List.ReplaceRange","List.ReplaceValue","List.Reverse","List.Select","List.Single","List.SingleOrDefault","List.Skip","List.Sort","List.StandardDeviation","List.Sum","List.Times","List.Transform","List.TransformMany","List.Union","List.Zip","Logical.From","Logical.FromText","Logical.ToText","MQ.Queue","MySQL.Database","Number.Abs","Number.Acos","Number.Asin","Number.Atan","Number.Atan2","Number.BitwiseAnd","Number.BitwiseNot","Number.BitwiseOr","Number.BitwiseShiftLeft","Number.BitwiseShiftRight","Number.BitwiseXor","Number.Combinations","Number.Cos","Number.Cosh","Number.Exp","Number.Factorial","Number.From","Number.FromText","Number.IntegerDivide","Number.IsEven","Number.IsNaN","Number.IsOdd","Number.Ln","Number.Log","Number.Log10","Number.Mod","Number.Permutations","Number.Power","Number.Random","Number.RandomBetween","Number.Round","Number.RoundAwayFromZero","Number.RoundDown","Number.RoundTowardZero","Number.RoundUp","Number.Sign","Number.Sin","Number.Sinh","Number.Sqrt","Number.Tan","Number.Tanh","Number.ToText","OData.Feed","Odbc.DataSource","Odbc.Query","OleDb.DataSource","OleDb.Query","Oracle.Database","Percentage.From","PostgreSQL.Database","RData.FromBinary","Record.AddField","Record.Combine","Record.Field","Record.FieldCount","Record.FieldNames","Record.FieldOrDefault","Record.FieldValues","Record.FromList","Record.FromTable","Record.HasFields","Record.RemoveFields","Record.RenameFields","Record.ReorderFields","Record.SelectFields","Record.ToList","Record.ToTable","Record.TransformFields","Replacer.ReplaceText","Replacer.ReplaceValue","RowExpression.Column","RowExpression.From","Salesforce.Data","Salesforce.Reports","SapBusinessWarehouse.Cubes","SapHana.Database","SharePoint.Contents","SharePoint.Files","SharePoint.Tables","Single.From","Soda.Feed","Splitter.SplitByNothing","Splitter.SplitTextByAnyDelimiter","Splitter.SplitTextByDelimiter","Splitter.SplitTextByEachDelimiter","Splitter.SplitTextByLengths","Splitter.SplitTextByPositions","Splitter.SplitTextByRanges","Splitter.SplitTextByRepeatedLengths","Splitter.SplitTextByWhitespace","Sql.Database","Sql.Databases","SqlExpression.SchemaFrom","SqlExpression.ToExpression","Sybase.Database","Table.AddColumn","Table.AddIndexColumn","Table.AddJoinColumn","Table.AddKey","Table.AggregateTableColumn","Table.AlternateRows","Table.Buffer","Table.Column","Table.ColumnCount","Table.ColumnNames","Table.ColumnsOfType","Table.Combine","Table.CombineColumns","Table.Contains","Table.ContainsAll","Table.ContainsAny","Table.DemoteHeaders","Table.Distinct","Table.DuplicateColumn","Table.ExpandListColumn","Table.ExpandRecordColumn","Table.ExpandTableColumn","Table.FillDown","Table.FillUp","Table.FilterWithDataTable","Table.FindText","Table.First","Table.FirstN","Table.FirstValue","Table.FromColumns","Table.FromList","Table.FromPartitions","Table.FromRecords","Table.FromRows","Table.FromValue","Table.Group","Table.HasColumns","Table.InsertRows","Table.IsDistinct","Table.IsEmpty","Table.Join","Table.Keys","Table.Last","Table.LastN","Table.MatchesAllRows","Table.MatchesAnyRows","Table.Max","Table.MaxN","Table.Min","Table.MinN","Table.NestedJoin","Table.Partition","Table.PartitionValues","Table.Pivot","Table.PositionOf","Table.PositionOfAny","Table.PrefixColumns","Table.Profile","Table.PromoteHeaders","Table.Range","Table.RemoveColumns","Table.RemoveFirstN","Table.RemoveLastN","Table.RemoveMatchingRows","Table.RemoveRows","Table.RemoveRowsWithErrors","Table.RenameColumns","Table.ReorderColumns","Table.Repeat","Table.ReplaceErrorValues","Table.ReplaceKeys","Table.ReplaceMatchingRows","Table.ReplaceRelationshipIdentity","Table.ReplaceRows","Table.ReplaceValue","Table.ReverseRows","Table.RowCount","Table.Schema","Table.SelectColumns","Table.SelectRows","Table.SelectRowsWithErrors","Table.SingleRow","Table.Skip","Table.Sort","Table.SplitColumn","Table.ToColumns","Table.ToList","Table.ToRecords","Table.ToRows","Table.TransformColumnNames","Table.TransformColumnTypes","Table.TransformColumns","Table.TransformRows","Table.Transpose","Table.Unpivot","Table.UnpivotOtherColumns","Table.View","Table.ViewFunction","TableAction.DeleteRows","TableAction.InsertRows","TableAction.UpdateRows","Tables.GetRelationships","Teradata.Database","Text.AfterDelimiter","Text.At","Text.BeforeDelimiter","Text.BetweenDelimiters","Text.Clean","Text.Combine","Text.Contains","Text.End","Text.EndsWith","Text.Format","Text.From","Text.FromBinary","Text.Insert","Text.Length","Text.Lower","Text.Middle","Text.NewGuid","Text.PadEnd","Text.PadStart","Text.PositionOf","Text.PositionOfAny","Text.Proper","Text.Range","Text.Remove","Text.RemoveRange","Text.Repeat","Text.Replace","Text.ReplaceRange","Text.Select","Text.Split","Text.SplitAny","Text.Start","Text.StartsWith","Text.ToBinary","Text.ToList","Text.Trim","Text.TrimEnd","Text.TrimStart","Text.Upper","Time.EndOfHour","Time.From","Time.FromText","Time.Hour","Time.Minute","Time.Second","Time.StartOfHour","Time.ToRecord","Time.ToText","Type.AddTableKey","Type.ClosedRecord","Type.Facets","Type.ForFunction","Type.ForRecord","Type.FunctionParameters","Type.FunctionRequiredParameters","Type.FunctionReturn","Type.Is","Type.IsNullable","Type.IsOpenRecord","Type.ListItem","Type.NonNullable","Type.OpenRecord","Type.RecordFields","Type.ReplaceFacets","Type.ReplaceTableKeys","Type.TableColumn","Type.TableKeys","Type.TableRow","Type.TableSchema","Type.Union","Uri.BuildQueryString","Uri.Combine","Uri.EscapeDataString","Uri.Parts","Value.Add","Value.As","Value.Compare","Value.Divide","Value.Equals","Value.Firewall","Value.FromText","Value.Is","Value.Metadata","Value.Multiply","Value.NativeQuery","Value.NullableEquals","Value.RemoveMetadata","Value.ReplaceMetadata","Value.ReplaceType","Value.Subtract","Value.Type","ValueAction.NativeStatement","ValueAction.Replace","Variable.Value","Web.Contents","Web.Page","WebAction.Request","Xml.Document","Xml.Tables"],builtinConstants:["BinaryEncoding.Base64","BinaryEncoding.Hex","BinaryOccurrence.Optional","BinaryOccurrence.Repeating","BinaryOccurrence.Required","ByteOrder.BigEndian","ByteOrder.LittleEndian","Compression.Deflate","Compression.GZip","CsvStyle.QuoteAfterDelimiter","CsvStyle.QuoteAlways","Culture.Current","Day.Friday","Day.Monday","Day.Saturday","Day.Sunday","Day.Thursday","Day.Tuesday","Day.Wednesday","ExtraValues.Error","ExtraValues.Ignore","ExtraValues.List","GroupKind.Global","GroupKind.Local","JoinAlgorithm.Dynamic","JoinAlgorithm.LeftHash","JoinAlgorithm.LeftIndex","JoinAlgorithm.PairwiseHash","JoinAlgorithm.RightHash","JoinAlgorithm.RightIndex","JoinAlgorithm.SortMerge","JoinKind.FullOuter","JoinKind.Inner","JoinKind.LeftAnti","JoinKind.LeftOuter","JoinKind.RightAnti","JoinKind.RightOuter","JoinSide.Left","JoinSide.Right","MissingField.Error","MissingField.Ignore","MissingField.UseNull","Number.E","Number.Epsilon","Number.NaN","Number.NegativeInfinity","Number.PI","Number.PositiveInfinity","Occurrence.All","Occurrence.First","Occurrence.Last","Occurrence.Optional","Occurrence.Repeating","Occurrence.Required","Order.Ascending","Order.Descending","Precision.Decimal","Precision.Double","QuoteStyle.Csv","QuoteStyle.None","RelativePosition.FromEnd","RelativePosition.FromStart","RoundingMode.AwayFromZero","RoundingMode.Down","RoundingMode.ToEven","RoundingMode.TowardZero","RoundingMode.Up","SapHanaDistribution.All","SapHanaDistribution.Connection","SapHanaDistribution.Off","SapHanaDistribution.Statement","SapHanaRangeOperator.Equals","SapHanaRangeOperator.GreaterThan","SapHanaRangeOperator.GreaterThanOrEquals","SapHanaRangeOperator.LessThan","SapHanaRangeOperator.LessThanOrEquals","SapHanaRangeOperator.NotEquals","TextEncoding.Ascii","TextEncoding.BigEndianUnicode","TextEncoding.Unicode","TextEncoding.Utf16","TextEncoding.Utf8","TextEncoding.Windows","TraceLevel.Critical","TraceLevel.Error","TraceLevel.Information","TraceLevel.Verbose","TraceLevel.Warning","WebMethod.Delete","WebMethod.Get","WebMethod.Head","WebMethod.Patch","WebMethod.Post","WebMethod.Put"],builtinTypes:["Action.Type","Any.Type","Binary.Type","BinaryEncoding.Type","BinaryOccurrence.Type","Byte.Type","ByteOrder.Type","Character.Type","Compression.Type","CsvStyle.Type","Currency.Type","Date.Type","DateTime.Type","DateTimeZone.Type","Day.Type","Decimal.Type","Double.Type","Duration.Type","ExtraValues.Type","Function.Type","GroupKind.Type","Guid.Type","Int16.Type","Int32.Type","Int64.Type","Int8.Type","JoinAlgorithm.Type","JoinKind.Type","JoinSide.Type","List.Type","Logical.Type","MissingField.Type","None.Type","Null.Type","Number.Type","Occurrence.Type","Order.Type","Password.Type","Percentage.Type","Precision.Type","QuoteStyle.Type","Record.Type","RelativePosition.Type","RoundingMode.Type","SapHanaDistribution.Type","SapHanaRangeOperator.Type","Single.Type","Table.Type","Text.Type","TextEncoding.Type","Time.Type","TraceLevel.Type","Type.Type","Uri.Type","WebMethod.Type"],tokenizer:{root:[[/#"[\w \.]+"/,"identifier.quote"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+([eE][\-+]?\d+)?/,"number"],[/(#?[a-z]+)\b/,{cases:{"@typeKeywords":"type","@keywords":"keyword","@constants":"constant","@constructors":"constructor","@operatorKeywords":"operators","@default":"identifier"}}],[/\b([A-Z][a-zA-Z0-9]+\.Type)\b/,{cases:{"@builtinTypes":"type","@default":"identifier"}}],[/\b([A-Z][a-zA-Z0-9]+\.[A-Z][a-zA-Z0-9]+)\b/,{cases:{"@builtinFunctions":"keyword.function","@builtinConstants":"constant","@default":"identifier"}}],[/\b([a-zA-Z_][\w\.]*)\b/,"identifier"],{include:"@whitespace"},{include:"@comments"},{include:"@strings"},[/[{}()\[\]]/,"@brackets"],[/([=\+<>\-\*&@\?\/!])|([<>]=)|(<>)|(=>)|(\.\.\.)|(\.\.)/,"operators"],[/[,;]/,"delimiter"]],whitespace:[[/\s+/,"white"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],strings:[['"',"string","@string"]],string:[['""',"string.escape"],['"',"string","@pop"],[".","string"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js new file mode 100644 index 0000000000..7505fc9005 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/powershell/powershell",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"#",blockComment:["<#","#>"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},n.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".ps1",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["begin","break","catch","class","continue","data","define","do","dynamicparam","else","elseif","end","exit","filter","finally","for","foreach","from","function","if","in","param","process","return","switch","throw","trap","try","until","using","var","while","workflow","parallel","sequence","inlinescript","configuration"],helpKeywords:/SYNOPSIS|DESCRIPTION|PARAMETER|EXAMPLE|INPUTS|OUTPUTS|NOTES|LINK|COMPONENT|ROLE|FUNCTIONALITY|FORWARDHELPTARGETNAME|FORWARDHELPCATEGORY|REMOTEHELPRUNSPACE|EXTERNALHELP/,symbols:/[=>/,"comment","@pop"],[/(\.)(@helpKeywords)(?!\w)/,{token:"comment.keyword.$2"}],[/[\.#]/,"comment"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/pug/pug.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/pug/pug.js new file mode 100644 index 0000000000..8212279294 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/pug/pug.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/pug/pug",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}],folding:{offSide:!0}},t.language={defaultToken:"",tokenPostfix:".pug",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["append","block","case","default","doctype","each","else","extends","for","if","in","include","mixin","typeof","unless","var","when"],tags:["a","abbr","acronym","address","area","article","aside","audio","b","base","basefont","bdi","bdo","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","tracks","tt","u","ul","video","wbr"],symbols:/[\+\-\*\%\&\|\!\=\/\.\,\:]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)([a-zA-Z_-][\w-]*)/,{cases:{"$2@tags":{cases:{"@eos":["","tag"],"@default":["",{token:"tag",next:"@tag.$1"}]}},"$2@keywords":["",{token:"keyword.$2"}],"@default":["",""]}}],[/^(\s*)(#[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.id"],"@default":["",{token:"tag.id",next:"@tag.$1"}]}}],[/^(\s*)(\.[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.class"],"@default":["",{token:"tag.class",next:"@tag.$1"}]}}],[/^(\s*)(\|.*)$/,""],{include:"@whitespace"},[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":""}}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d+/,"number"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],tag:[[/(\.)(\s*$)/,[{token:"delimiter",next:"@blockText.$S2."},""]],[/\s+/,{token:"",next:"@simpleText"}],[/#[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.id",next:"@pop"},"@default":"tag.id"}}],[/\.[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.class",next:"@pop"},"@default":"tag.class"}}],[/\(/,{token:"delimiter.parenthesis",next:"@attributeList"}]],simpleText:[[/[^#]+$/,{token:"",next:"@popall"}],[/[^#]+/,{token:""}],[/(#{)([^}]*)(})/,{cases:{"@eos":["interpolation.delimiter","interpolation",{token:"interpolation.delimiter",next:"@popall"}],"@default":["interpolation.delimiter","interpolation","interpolation.delimiter"]}}],[/#$/,{token:"",next:"@popall"}],[/#/,""]],attributeList:[[/\s+/,""],[/(\w+)(\s*=\s*)("|')/,["attribute.name","delimiter",{token:"attribute.value",next:"@value.$3"}]],[/\w+/,"attribute.name"],[/,/,{cases:{"@eos":{token:"attribute.delimiter",next:"@popall"},"@default":"attribute.delimiter"}}],[/\)$/,{token:"delimiter.parenthesis",next:"@popall"}],[/\)/,{token:"delimiter.parenthesis",next:"@pop"}]],whitespace:[[/^(\s*)(\/\/.*)$/,{token:"comment",next:"@blockText.$1.comment"}],[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[//,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],razorInSimpleState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3"}]],razorInEmbeddedState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],razorBlockCommentTopLevel:[[/\*@/,"@rematch","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorBlockComment:[[/\*@/,"comment.cs","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorRootTopLevel:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/[})]/,"@rematch","@pop"],{include:"razorCommon"}],razorRoot:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/\}/,"delimiter.bracket.cs","@pop"],[/\)/,"delimiter.parenthesis.cs","@pop"],{include:"razorCommon"}],razorCommon:[[/[a-zA-Z_]\w*/,{cases:{"@razorKeywords":{token:"keyword.cs"},"@default":"identifier.cs"}}],[/[\[\]]/,"delimiter.array.cs"],[/[ \t\r\n]+/],[/\/\/.*$/,"comment.cs"],[/@\*/,"comment.cs","@razorBlockComment"],[/"([^"]*)"/,"string.cs"],[/'([^']*)'/,"string.cs"],[/(<)(\w+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(\w+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<\/)(\w+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,]/,"delimiter.cs"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.cs"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.cs"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.cs"],[/0[0-7']*[0-7]/,"number.octal.cs"],[/0[bB][0-1']*[0-1]/,"number.binary.cs"],[/\d[\d']*/,"number.cs"],[/\d/,"number.cs"]]},razorKeywords:["abstract","as","async","await","base","bool","break","by","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","descending","explicit","event","extern","else","enum","false","finally","fixed","float","for","foreach","from","goto","group","if","implicit","in","int","interface","internal","into","is","lock","long","nameof","new","null","namespace","object","operator","out","override","orderby","params","private","protected","public","readonly","ref","return","switch","struct","sbyte","sealed","short","sizeof","stackalloc","static","string","select","this","throw","true","try","typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","volatile","void","when","while","where","yield","model","inject"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js new file mode 100644 index 0000000000..64b62ae93b --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/redis/redis",["require","exports"],(function(E,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.language=e.conf=void 0,e.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},e.language={defaultToken:"",tokenPostfix:".redis",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["APPEND","AUTH","BGREWRITEAOF","BGSAVE","BITCOUNT","BITFIELD","BITOP","BITPOS","BLPOP","BRPOP","BRPOPLPUSH","CLIENT","KILL","LIST","GETNAME","PAUSE","REPLY","SETNAME","CLUSTER","ADDSLOTS","COUNT-FAILURE-REPORTS","COUNTKEYSINSLOT","DELSLOTS","FAILOVER","FORGET","GETKEYSINSLOT","INFO","KEYSLOT","MEET","NODES","REPLICATE","RESET","SAVECONFIG","SET-CONFIG-EPOCH","SETSLOT","SLAVES","SLOTS","COMMAND","COUNT","GETKEYS","CONFIG","GET","REWRITE","SET","RESETSTAT","DBSIZE","DEBUG","OBJECT","SEGFAULT","DECR","DECRBY","DEL","DISCARD","DUMP","ECHO","EVAL","EVALSHA","EXEC","EXISTS","EXPIRE","EXPIREAT","FLUSHALL","FLUSHDB","GEOADD","GEOHASH","GEOPOS","GEODIST","GEORADIUS","GEORADIUSBYMEMBER","GETBIT","GETRANGE","GETSET","HDEL","HEXISTS","HGET","HGETALL","HINCRBY","HINCRBYFLOAT","HKEYS","HLEN","HMGET","HMSET","HSET","HSETNX","HSTRLEN","HVALS","INCR","INCRBY","INCRBYFLOAT","KEYS","LASTSAVE","LINDEX","LINSERT","LLEN","LPOP","LPUSH","LPUSHX","LRANGE","LREM","LSET","LTRIM","MGET","MIGRATE","MONITOR","MOVE","MSET","MSETNX","MULTI","PERSIST","PEXPIRE","PEXPIREAT","PFADD","PFCOUNT","PFMERGE","PING","PSETEX","PSUBSCRIBE","PUBSUB","PTTL","PUBLISH","PUNSUBSCRIBE","QUIT","RANDOMKEY","READONLY","READWRITE","RENAME","RENAMENX","RESTORE","ROLE","RPOP","RPOPLPUSH","RPUSH","RPUSHX","SADD","SAVE","SCARD","SCRIPT","FLUSH","LOAD","SDIFF","SDIFFSTORE","SELECT","SETBIT","SETEX","SETNX","SETRANGE","SHUTDOWN","SINTER","SINTERSTORE","SISMEMBER","SLAVEOF","SLOWLOG","SMEMBERS","SMOVE","SORT","SPOP","SRANDMEMBER","SREM","STRLEN","SUBSCRIBE","SUNION","SUNIONSTORE","SWAPDB","SYNC","TIME","TOUCH","TTL","TYPE","UNSUBSCRIBE","UNLINK","UNWATCH","WAIT","WATCH","ZADD","ZCARD","ZCOUNT","ZINCRBY","ZINTERSTORE","ZLEXCOUNT","ZRANGE","ZRANGEBYLEX","ZREVRANGEBYLEX","ZRANGEBYSCORE","ZRANK","ZREM","ZREMRANGEBYLEX","ZREMRANGEBYRANK","ZREMRANGEBYSCORE","ZREVRANGE","ZREVRANGEBYSCORE","ZREVRANK","ZSCORE","ZUNIONSTORE","SCAN","SSCAN","HSCAN","ZSCAN"],operators:[],builtinFunctions:[],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}],[/"/,{token:"string.double",next:"@stringDouble"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],stringDouble:[[/[^"]+/,"string.double"],[/""/,"string.double"],[/"/,{token:"string.double",next:"@pop"}]],scopes:[]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js new file mode 100644 index 0000000000..a9829cc2d8 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/redshift/redshift",["require","exports"],(function(e,_){"use strict";Object.defineProperty(_,"__esModule",{value:!0}),_.language=_.conf=void 0,_.conf={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},_.language={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["AES128","AES256","ALL","ALLOWOVERWRITE","ANALYSE","ANALYZE","AND","ANY","ARRAY","AS","ASC","AUTHORIZATION","BACKUP","BETWEEN","BINARY","BLANKSASNULL","BOTH","BY","BYTEDICT","BZIP2","CASE","CAST","CHECK","COLLATE","COLUMN","CONSTRAINT","CREATE","CREDENTIALS","CROSS","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURRENT_USER_ID","DEFAULT","DEFERRABLE","DEFLATE","DEFRAG","DELTA","DELTA32K","DESC","DISABLE","DISTINCT","DO","ELSE","EMPTYASNULL","ENABLE","ENCODE","ENCRYPT","ENCRYPTION","END","EXCEPT","EXPLICIT","FALSE","FOR","FOREIGN","FREEZE","FROM","FULL","GLOBALDICT256","GLOBALDICT64K","GRANT","GROUP","GZIP","HAVING","IDENTITY","IGNORE","ILIKE","IN","INITIALLY","INNER","INTERSECT","INTO","IS","ISNULL","JOIN","LEADING","LEFT","LIKE","LIMIT","LOCALTIME","LOCALTIMESTAMP","LUN","LUNS","LZO","LZOP","MINUS","MOSTLY13","MOSTLY32","MOSTLY8","NATURAL","NEW","NOT","NOTNULL","NULL","NULLS","OFF","OFFLINE","OFFSET","OID","OLD","ON","ONLY","OPEN","OR","ORDER","OUTER","OVERLAPS","PARALLEL","PARTITION","PERCENT","PERMISSIONS","PLACING","PRIMARY","RAW","READRATIO","RECOVER","REFERENCES","RESPECT","REJECTLOG","RESORT","RESTORE","RIGHT","SELECT","SESSION_USER","SIMILAR","SNAPSHOT","SOME","SYSDATE","SYSTEM","TABLE","TAG","TDES","TEXT255","TEXT32K","THEN","TIMESTAMP","TO","TOP","TRAILING","TRUE","TRUNCATECOLUMNS","UNION","UNIQUE","USER","USING","VERBOSE","WALLET","WHEN","WHERE","WITH","WITHOUT"],operators:["AND","BETWEEN","IN","LIKE","NOT","OR","IS","NULL","INTERSECT","UNION","INNER","JOIN","LEFT","OUTER","RIGHT"],builtinFunctions:["current_schema","current_schemas","has_database_privilege","has_schema_privilege","has_table_privilege","age","current_time","current_timestamp","localtime","isfinite","now","ascii","get_bit","get_byte","set_bit","set_byte","to_ascii","approximate percentile_disc","avg","count","listagg","max","median","min","percentile_cont","stddev_samp","stddev_pop","sum","var_samp","var_pop","bit_and","bit_or","bool_and","bool_or","cume_dist","first_value","lag","last_value","lead","nth_value","ratio_to_report","dense_rank","ntile","percent_rank","rank","row_number","case","coalesce","decode","greatest","least","nvl","nvl2","nullif","add_months","at time zone","convert_timezone","current_date","date_cmp","date_cmp_timestamp","date_cmp_timestamptz","date_part_year","dateadd","datediff","date_part","date_trunc","extract","getdate","interval_cmp","last_day","months_between","next_day","sysdate","timeofday","timestamp_cmp","timestamp_cmp_date","timestamp_cmp_timestamptz","timestamptz_cmp","timestamptz_cmp_date","timestamptz_cmp_timestamp","timezone","to_timestamp","trunc","abs","acos","asin","atan","atan2","cbrt","ceil","ceiling","checksum","cos","cot","degrees","dexp","dlog1","dlog10","exp","floor","ln","log","mod","pi","power","radians","random","round","sin","sign","sqrt","tan","to_hex","bpcharcmp","btrim","bttext_pattern_cmp","char_length","character_length","charindex","chr","concat","crc32","func_sha1","initcap","left and rights","len","length","lower","lpad and rpads","ltrim","md5","octet_length","position","quote_ident","quote_literal","regexp_count","regexp_instr","regexp_replace","regexp_substr","repeat","replace","replicate","reverse","rtrim","split_part","strpos","strtol","substring","textlen","translate","trim","upper","cast","convert","to_char","to_date","to_number","json_array_length","json_extract_array_element_text","json_extract_path_text","current_setting","pg_cancel_backend","pg_terminate_backend","set_config","current_database","current_user","current_user_id","pg_backend_pid","pg_last_copy_count","pg_last_copy_id","pg_last_query_id","pg_last_unload_count","session_user","slice_num","user","version","abbrev","acosd","any","area","array_agg","array_append","array_cat","array_dims","array_fill","array_length","array_lower","array_ndims","array_position","array_positions","array_prepend","array_remove","array_replace","array_to_json","array_to_string","array_to_tsvector","array_upper","asind","atan2d","atand","bit","bit_length","bound_box","box","brin_summarize_new_values","broadcast","cardinality","center","circle","clock_timestamp","col_description","concat_ws","convert_from","convert_to","corr","cosd","cotd","covar_pop","covar_samp","current_catalog","current_query","current_role","currval","cursor_to_xml","diameter","div","encode","enum_first","enum_last","enum_range","every","family","format","format_type","generate_series","generate_subscripts","get_current_ts_config","gin_clean_pending_list","grouping","has_any_column_privilege","has_column_privilege","has_foreign_data_wrapper_privilege","has_function_privilege","has_language_privilege","has_sequence_privilege","has_server_privilege","has_tablespace_privilege","has_type_privilege","height","host","hostmask","inet_client_addr","inet_client_port","inet_merge","inet_same_family","inet_server_addr","inet_server_port","isclosed","isempty","isopen","json_agg","json_object","json_object_agg","json_populate_record","json_populate_recordset","json_to_record","json_to_recordset","jsonb_agg","jsonb_object_agg","justify_days","justify_hours","justify_interval","lastval","left","line","localtimestamp","lower_inc","lower_inf","lpad","lseg","make_date","make_interval","make_time","make_timestamp","make_timestamptz","masklen","mode","netmask","network","nextval","npoints","num_nonnulls","num_nulls","numnode","obj_description","overlay","parse_ident","path","pclose","percentile_disc","pg_advisory_lock","pg_advisory_lock_shared","pg_advisory_unlock","pg_advisory_unlock_all","pg_advisory_unlock_shared","pg_advisory_xact_lock","pg_advisory_xact_lock_shared","pg_backup_start_time","pg_blocking_pids","pg_client_encoding","pg_collation_is_visible","pg_column_size","pg_conf_load_time","pg_control_checkpoint","pg_control_init","pg_control_recovery","pg_control_system","pg_conversion_is_visible","pg_create_logical_replication_slot","pg_create_physical_replication_slot","pg_create_restore_point","pg_current_xlog_flush_location","pg_current_xlog_insert_location","pg_current_xlog_location","pg_database_size","pg_describe_object","pg_drop_replication_slot","pg_export_snapshot","pg_filenode_relation","pg_function_is_visible","pg_get_constraintdef","pg_get_expr","pg_get_function_arguments","pg_get_function_identity_arguments","pg_get_function_result","pg_get_functiondef","pg_get_indexdef","pg_get_keywords","pg_get_object_address","pg_get_owned_sequence","pg_get_ruledef","pg_get_serial_sequence","pg_get_triggerdef","pg_get_userbyid","pg_get_viewdef","pg_has_role","pg_identify_object","pg_identify_object_as_address","pg_index_column_has_property","pg_index_has_property","pg_indexam_has_property","pg_indexes_size","pg_is_in_backup","pg_is_in_recovery","pg_is_other_temp_schema","pg_is_xlog_replay_paused","pg_last_committed_xact","pg_last_xact_replay_timestamp","pg_last_xlog_receive_location","pg_last_xlog_replay_location","pg_listening_channels","pg_logical_emit_message","pg_logical_slot_get_binary_changes","pg_logical_slot_get_changes","pg_logical_slot_peek_binary_changes","pg_logical_slot_peek_changes","pg_ls_dir","pg_my_temp_schema","pg_notification_queue_usage","pg_opclass_is_visible","pg_operator_is_visible","pg_opfamily_is_visible","pg_options_to_table","pg_postmaster_start_time","pg_read_binary_file","pg_read_file","pg_relation_filenode","pg_relation_filepath","pg_relation_size","pg_reload_conf","pg_replication_origin_create","pg_replication_origin_drop","pg_replication_origin_oid","pg_replication_origin_progress","pg_replication_origin_session_is_setup","pg_replication_origin_session_progress","pg_replication_origin_session_reset","pg_replication_origin_session_setup","pg_replication_origin_xact_reset","pg_replication_origin_xact_setup","pg_rotate_logfile","pg_size_bytes","pg_size_pretty","pg_sleep","pg_sleep_for","pg_sleep_until","pg_start_backup","pg_stat_file","pg_stop_backup","pg_switch_xlog","pg_table_is_visible","pg_table_size","pg_tablespace_databases","pg_tablespace_location","pg_tablespace_size","pg_total_relation_size","pg_trigger_depth","pg_try_advisory_lock","pg_try_advisory_lock_shared","pg_try_advisory_xact_lock","pg_try_advisory_xact_lock_shared","pg_ts_config_is_visible","pg_ts_dict_is_visible","pg_ts_parser_is_visible","pg_ts_template_is_visible","pg_type_is_visible","pg_typeof","pg_xact_commit_timestamp","pg_xlog_location_diff","pg_xlog_replay_pause","pg_xlog_replay_resume","pg_xlogfile_name","pg_xlogfile_name_offset","phraseto_tsquery","plainto_tsquery","point","polygon","popen","pqserverversion","query_to_xml","querytree","quote_nullable","radius","range_merge","regexp_matches","regexp_split_to_array","regexp_split_to_table","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","right","row_security_active","row_to_json","rpad","scale","set_masklen","setseed","setval","setweight","shobj_description","sind","sprintf","statement_timestamp","stddev","string_agg","string_to_array","strip","substr","table_to_xml","table_to_xml_and_xmlschema","tand","text","to_json","to_regclass","to_regnamespace","to_regoper","to_regoperator","to_regproc","to_regprocedure","to_regrole","to_regtype","to_tsquery","to_tsvector","transaction_timestamp","ts_debug","ts_delete","ts_filter","ts_headline","ts_lexize","ts_parse","ts_rank","ts_rank_cd","ts_rewrite","ts_stat","ts_token_type","tsquery_phrase","tsvector_to_array","tsvector_update_trigger","tsvector_update_trigger_column","txid_current","txid_current_snapshot","txid_snapshot_xip","txid_snapshot_xmax","txid_snapshot_xmin","txid_visible_in_snapshot","unnest","upper_inc","upper_inf","variance","width","width_bucket","xml_is_well_formed","xml_is_well_formed_content","xml_is_well_formed_document","xmlagg","xmlcomment","xmlconcat","xmlelement","xmlexists","xmlforest","xmlparse","xmlpi","xmlroot","xmlserialize","xpath","xpath_exists"],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js new file mode 100644 index 0000000000..694d9a232c --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/restructuredtext/restructuredtext",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}],folding:{markers:{start:new RegExp("^\\s*\x3c!--\\s*#?region\\b.*--\x3e"),end:new RegExp("^\\s*\x3c!--\\s*#?endregion\\b.*--\x3e")}}},n.language={defaultToken:"",tokenPostfix:".rst",control:/[\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],alphanumerics:/[A-Za-z0-9]/,alphanumericsplus:/[A-Za-z0-9-_+:.]/,simpleRefNameWithoutBq:/(?:@alphanumerics@alphanumericsplus*@alphanumerics)+|(?:@alphanumerics+)/,simpleRefName:/(?:`@simpleRefNameWithoutBq`|@simpleRefNameWithoutBq)/,phrase:/@simpleRefName(?:\s@simpleRefName)*/,citationName:/[A-Za-z][A-Za-z0-9-_.]*/,blockLiteralStart:/(?:[!"#$%&'()*+,-./:;<=>?@\[\]^_`{|}~]|[\s])/,precedingChars:/(?:[ -:/'"<([{])/,followingChars:/(?:[ -.,:;!?/'")\]}>]|$)/,punctuation:/(=|-|~|`|#|"|\^|\+|\*|:|\.|'|_|\+)/,tokenizer:{root:[[/^(@punctuation{3,}$){1,1}?/,"keyword"],[/^\s*([\*\-+‣•]|[a-zA-Z0-9]+\.|\([a-zA-Z0-9]+\)|[a-zA-Z0-9]+\))\s/,"keyword"],[/([ ]::)\s*$/,"keyword","@blankLineOfLiteralBlocks"],[/(::)\s*$/,"keyword","@blankLineOfLiteralBlocks"],{include:"@tables"},{include:"@explicitMarkupBlocks"},{include:"@inlineMarkup"}],explicitMarkupBlocks:[{include:"@citations"},{include:"@footnotes"},[/^(\.\.\s)(@simpleRefName)(::\s)(.*)$/,[{token:"",next:"subsequentLines"},"keyword","",""]],[/^(\.\.)(\s+)(_)(@simpleRefName)(:)(\s+)(.*)/,[{token:"",next:"hyperlinks"},"","","string.link","","","string.link"]],[/^((?:(?:\.\.)(?:\s+))?)(__)(:)(\s+)(.*)/,[{token:"",next:"subsequentLines"},"","","","string.link"]],[/^(__\s+)(.+)/,["","string.link"]],[/^(\.\.)( \|)([^| ]+[^|]*[^| ]*)(\| )(@simpleRefName)(:: .*)/,[{token:"",next:"subsequentLines"},"","string.link","","keyword",""],"@rawBlocks"],[/(\|)([^| ]+[^|]*[^| ]*)(\|_{0,2})/,["","string.link",""]],[/^(\.\.)([ ].*)$/,[{token:"",next:"@comments"},"comment"]]],inlineMarkup:[{include:"@citationsReference"},{include:"@footnotesReference"},[/(@simpleRefName)(_{1,2})/,["string.link",""]],[/(`)([^<`]+\s+)(<)(.*)(>)(`)(_)/,["","string.link","","string.link","","",""]],[/\*\*([^\\*]|\*(?!\*))+\*\*/,"strong"],[/\*[^*]+\*/,"emphasis"],[/(``)((?:[^`]|\`(?!`))+)(``)/,["","keyword",""]],[/(__\s+)(.+)/,["","keyword"]],[/(:)((?:@simpleRefNameWithoutBq)?)(:`)([^`]+)(`)/,["","keyword","","",""]],[/(`)([^`]+)(`:)((?:@simpleRefNameWithoutBq)?)(:)/,["","","","keyword",""]],[/(`)([^`]+)(`)/,""],[/(_`)(@phrase)(`)/,["","string.link",""]]],citations:[[/^(\.\.\s+\[)((?:@citationName))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]]],citationsReference:[[/(\[)(@citationName)(\]_)/,["","string.link",""]]],footnotes:[[/^(\.\.\s+\[)((?:[0-9]+))(\]\s+.*)/,[{token:"",next:"@subsequentLines"},"string.link",""]],[/^(\.\.\s+\[)((?:#@simpleRefName?))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]],[/^(\.\.\s+\[)((?:\*))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]]],footnotesReference:[[/(\[)([0-9]+)(\])(_)/,["","string.link","",""]],[/(\[)(#@simpleRefName?)(\])(_)/,["","string.link","",""]],[/(\[)(\*)(\])(_)/,["","string.link","",""]]],blankLineOfLiteralBlocks:[[/^$/,"","@subsequentLinesOfLiteralBlocks"],[/^.*$/,"","@pop"]],subsequentLinesOfLiteralBlocks:[[/(@blockLiteralStart+)(.*)/,["keyword",""]],[/^(?!blockLiteralStart)/,"","@popall"]],subsequentLines:[[/^[\s]+.*/,""],[/^(?!\s)/,"","@pop"]],hyperlinks:[[/^[\s]+.*/,"string.link"],[/^(?!\s)/,"","@pop"]],comments:[[/^[\s]+.*/,"comment"],[/^(?!\s)/,"","@pop"]],tables:[[/\+-[+-]+/,"keyword"],[/\+=[+=]+/,"keyword"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js new file mode 100644 index 0000000000..1ed764a4c2 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/ruby/ruby",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"#",blockComment:["=begin","=end"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],indentationRules:{increaseIndentPattern:new RegExp("^\\s*((begin|class|(private|protected)\\s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|while|case)|([^#]*\\sdo\\b)|([^#]*=\\s*(case|if|unless)))\\b([^#\\{;]|(\"|'|/).*\\4)*(#.*)?$"),decreaseIndentPattern:new RegExp("^\\s*([}\\]]([,)]?\\s*(#|$)|\\.[a-zA-Z_]\\w*\\b)|(end|rescue|ensure|else|elsif|when)\\b)")}},t.language={tokenPostfix:".ruby",keywords:["__LINE__","__ENCODING__","__FILE__","BEGIN","END","alias","and","begin","break","case","class","def","defined?","do","else","elsif","end","ensure","for","false","if","in","module","next","nil","not","or","redo","rescue","retry","return","self","super","then","true","undef","unless","until","when","while","yield"],keywordops:["::","..","...","?",":","=>"],builtins:["require","public","private","include","extend","attr_reader","protected","private_class_method","protected_class_method","new"],declarations:["module","class","def","case","do","begin","for","if","while","until","unless"],linedecls:["def","case","do","begin","for","if","while","until","unless"],operators:["^","&","|","<=>","==","===","!~","=~",">",">=","<","<=","<<",">>","+","-","*","/","%","**","~","+@","-@","[]","[]=","`","+=","-=","*=","**=","/=","^=","%=","<<=",">>=","&=","&&=","||=","|="],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],symbols:/[=>"}],[/%([qws])(@delim)/,{token:"string.$1.delim",switchTo:"@qstring.$1.$2.$2"}],[/%r\(/,{token:"regexp.delim",switchTo:"@pregexp.(.)"}],[/%r\[/,{token:"regexp.delim",switchTo:"@pregexp.[.]"}],[/%r\{/,{token:"regexp.delim",switchTo:"@pregexp.{.}"}],[/%r"}],[/%r(@delim)/,{token:"regexp.delim",switchTo:"@pregexp.$1.$1"}],[/%(x|W|Q?)\(/,{token:"string.$1.delim",switchTo:"@qqstring.$1.(.)"}],[/%(x|W|Q?)\[/,{token:"string.$1.delim",switchTo:"@qqstring.$1.[.]"}],[/%(x|W|Q?)\{/,{token:"string.$1.delim",switchTo:"@qqstring.$1.{.}"}],[/%(x|W|Q?)"}],[/%(x|W|Q?)(@delim)/,{token:"string.$1.delim",switchTo:"@qqstring.$1.$2.$2"}],[/%([rqwsxW]|Q?)./,{token:"invalid",next:"@pop"}],[/./,{token:"invalid",next:"@pop"}]],qstring:[[/\\$/,"string.$S2.escape"],[/\\./,"string.$S2.escape"],[/./,{cases:{"$#==$S4":{token:"string.$S2.delim",next:"@pop"},"$#==$S3":{token:"string.$S2.delim",next:"@push"},"@default":"string.$S2"}}]],qqstring:[[/#/,"string.$S2.escape","@interpolated"],{include:"@qstring"}],whitespace:[[/[ \t\r\n]+/,""],[/^\s*=begin\b/,"comment","@comment"],[/#.*$/,"comment"]],comment:[[/[^=]+/,"comment"],[/^\s*=begin\b/,"comment.invalid"],[/^\s*=end\b.*/,"comment","@pop"],[/[=]/,"comment"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js new file mode 100644 index 0000000000..c74e57ab3e --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/rust/rust",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},t.language={tokenPostfix:".rust",defaultToken:"invalid",keywords:["as","async","await","box","break","const","continue","crate","dyn","else","enum","extern","false","fn","for","if","impl","in","let","loop","match","mod","move","mut","pub","ref","return","self","static","struct","super","trait","true","try","type","unsafe","use","where","while","catch","default","union","static","abstract","alignof","become","do","final","macro","offsetof","override","priv","proc","pure","sizeof","typeof","unsized","virtual","yield"],typeKeywords:["Self","m32","m64","m128","f80","f16","f128","int","uint","float","char","bool","u8","u16","u32","u64","f32","f64","i8","i16","i32","i64","str","Option","Either","c_float","c_double","c_void","FILE","fpos_t","DIR","dirent","c_char","c_schar","c_uchar","c_short","c_ushort","c_int","c_uint","c_long","c_ulong","size_t","ptrdiff_t","clock_t","time_t","c_longlong","c_ulonglong","intptr_t","uintptr_t","off_t","dev_t","ino_t","pid_t","mode_t","ssize_t"],constants:["true","false","Some","None","Left","Right","Ok","Err"],supportConstants:["EXIT_FAILURE","EXIT_SUCCESS","RAND_MAX","EOF","SEEK_SET","SEEK_CUR","SEEK_END","_IOFBF","_IONBF","_IOLBF","BUFSIZ","FOPEN_MAX","FILENAME_MAX","L_tmpnam","TMP_MAX","O_RDONLY","O_WRONLY","O_RDWR","O_APPEND","O_CREAT","O_EXCL","O_TRUNC","S_IFIFO","S_IFCHR","S_IFBLK","S_IFDIR","S_IFREG","S_IFMT","S_IEXEC","S_IWRITE","S_IREAD","S_IRWXU","S_IXUSR","S_IWUSR","S_IRUSR","F_OK","R_OK","W_OK","X_OK","STDIN_FILENO","STDOUT_FILENO","STDERR_FILENO"],supportMacros:["format!","print!","println!","panic!","format_args!","unreachable!","write!","writeln!"],operators:["!","!=","%","%=","&","&=","&&","*","*=","+","+=","-","-=","->",".","..","...","/","/=",":",";","<<","<<=","<","<=","=","==","=>",">",">=",">>",">>=","@","^","^=","|","|=","||","_","?","#"],escapes:/\\([nrt0\"''\\]|x\h{2}|u\{\h{1,6}\})/,delimiters:/[,]/,symbols:/[\#\!\%\&\*\+\-\.\/\:\;\<\=\>\@\^\|_\?]+/,intSuffixes:/[iu](8|16|32|64|128|size)/,floatSuffixes:/f(32|64)/,tokenizer:{root:[[/[a-zA-Z][a-zA-Z0-9_]*!?|_[a-zA-Z0-9_]+/,{cases:{"@typeKeywords":"keyword.type","@keywords":"keyword","@supportConstants":"keyword","@supportMacros":"keyword","@constants":"keyword","@default":"identifier"}}],[/\$/,"identifier"],[/'[a-zA-Z_][a-zA-Z0-9_]*(?=[^\'])/,"identifier"],[/'\S'/,"string.byteliteral"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}],{include:"@numbers"},{include:"@whitespace"},[/@delimiters/,{cases:{"@keywords":"keyword","@default":"delimiter"}}],[/[{}()\[\]<>]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],numbers:[[/(0o[0-7_]+)(@intSuffixes)?/,{token:"number"}],[/(0b[0-1_]+)(@intSuffixes)?/,{token:"number"}],[/[\d][\d_]*(\.[\d][\d_]*)?[eE][+-][\d_]+(@floatSuffixes)?/,{token:"number"}],[/\b(\d\.?[\d_]*)(@floatSuffixes)?\b/,{token:"number"}],[/(0x[\da-fA-F]+)_?(@intSuffixes)?/,{token:"number"}],[/[\d][\d_]*(@intSuffixes?)?/,{token:"number"}]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js new file mode 100644 index 0000000000..5e2241e44a --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/sb/sb",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={comments:{lineComment:"'"},brackets:[["(",")"],["[","]"],["If","EndIf"],["While","EndWhile"],["For","EndFor"],["Sub","EndSub"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]}]},o.language={defaultToken:"",tokenPostfix:".sb",ignoreCase:!0,brackets:[{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"keyword.tag-if",open:"If",close:"EndIf"},{token:"keyword.tag-while",open:"While",close:"EndWhile"},{token:"keyword.tag-for",open:"For",close:"EndFor"},{token:"keyword.tag-sub",open:"Sub",close:"EndSub"}],keywords:["Else","ElseIf","EndFor","EndIf","EndSub","EndWhile","For","Goto","If","Step","Sub","Then","To","While"],tagwords:["If","Sub","While","For"],operators:[">","<","<>","<=",">=","And","Or","+","-","*","/","="],identifier:/[a-zA-Z_][\w]*/,symbols:/[=><:+\-*\/%\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/(@identifier)(?=[.])/,"type"],[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@operators":"operator","@default":"variable.name"}}],[/([.])(@identifier)/,{cases:{$2:["delimiter","type.member"],"@default":""}}],[/\d*\.\d+/,"number.float"],[/\d+/,"number"],[/[()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/(\').*$/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"C?/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js new file mode 100644 index 0000000000..b75d85f540 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/scala/scala",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(unary_[@~!#%^&*()\-=+\\|:<>\/?]+)|([a-zA-Z_$][\w$]*?_=)|(`[^`]+`)|([a-zA-Z_$][\w$]*)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},t.language={tokenPostfix:".scala",keywords:["asInstanceOf","catch","class","classOf","def","do","else","extends","finally","for","foreach","forSome","if","import","isInstanceOf","macro","match","new","object","package","return","throw","trait","try","type","until","val","var","while","with","yield","given","enum","then"],softKeywords:["as","export","extension","end","derives","on"],constants:["true","false","null","this","super"],modifiers:["abstract","final","implicit","lazy","override","private","protected","sealed"],softModifiers:["inline","opaque","open","transparent","using"],name:/(?:[a-z_$][\w$]*|`[^`]+`)/,type:/(?:[A-Z][\w$]*)/,symbols:/[=>))/,["@brackets","white","variable"]],[/@name/,{cases:{"@keywords":"keyword","@softKeywords":"keyword","@modifiers":"keyword.modifier","@softModifiers":"keyword.modifier","@constants":{token:"constant",next:"@allowMethod"},"@default":{token:"identifier",next:"@allowMethod"}}}],[/@type/,"type","@allowMethod"],{include:"@whitespace"},[/@[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*)*/,"annotation"],[/[{(]/,"@brackets"],[/[})]/,"@brackets","@allowMethod"],[/\[/,"operator.square"],[/](?!\s*(?:va[rl]|def|type)\b)/,"operator.square","@allowMethod"],[/]/,"operator.square"],[/([=-]>|<-|>:|<:|:>|<%)(?=[\s\w()[\]{},\."'`])/,"keyword"],[/@symbols/,"operator"],[/[;,\.]/,"delimiter"],[/'[a-zA-Z$][\w$]*(?!')/,"attribute.name"],[/'[^\\']'/,"string","@allowMethod"],[/(')(@escapes)(')/,["string","string.escape",{token:"string",next:"@allowMethod"}]],[/'/,"string.invalid"]],import:[[/;/,"delimiter","@pop"],[/^|$/,"","@pop"],[/[ \t]+/,"white"],[/[\n\r]+/,"white","@pop"],[/\/\*/,"comment","@comment"],[/@name|@type/,"type"],[/[(){}]/,"@brackets"],[/[[\]]/,"operator.square"],[/[\.,]/,"delimiter"]],allowMethod:[[/^|$/,"","@pop"],[/[ \t]+/,"white"],[/[\n\r]+/,"white","@pop"],[/\/\*/,"comment","@comment"],[/(?==>[\s\w([{])/,"keyword","@pop"],[/(@name|@symbols)(?=[ \t]*[[({"'`]|[ \t]+(?:[+-]?\.?\d|\w))/,{cases:{"@keywords":{token:"keyword",next:"@pop"},"->|<-|>:|<:|<%":{token:"keyword",next:"@pop"},"@default":{token:"@rematch",next:"@pop"}}}],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],case:[[/\b_\*/,"key"],[/\b(_|true|false|null|this|super)\b/,"keyword","@allowMethod"],[/\bif\b|=>/,"keyword","@pop"],[/`[^`]+`/,"identifier","@allowMethod"],[/@name/,"variable","@allowMethod"],[/:::?|\||@(?![a-z_$])/,"keyword"],{include:"@root"}],vardef:[[/\b_\*/,"key"],[/\b(_|true|false|null|this|super)\b/,"keyword"],[/@name/,"variable"],[/:::?|\||@(?![a-z_$])/,"keyword"],[/=|:(?!:)/,"operator","@pop"],[/$/,"white","@pop"],{include:"@root"}],string:[[/[^\\"\n\r]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}]],stringt:[[/[^\\"\n\r]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/"/,"string"]],fstring:[[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/%%/,"string"],[/(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","keyword.modifier","number","metatag"]],[/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","number","metatag"]],[/(%)([\-#+ 0,(])(@fstring_conv)/,["metatag","keyword.modifier","metatag"]],[/(%)(@fstring_conv)/,["metatag","metatag"]],[/./,"string"]],fstringt:[[/@escapes/,"string.escape"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/%%/,"string"],[/(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","keyword.modifier","number","metatag"]],[/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","number","metatag"]],[/(%)([\-#+ 0,(])(@fstring_conv)/,["metatag","keyword.modifier","metatag"]],[/(%)(@fstring_conv)/,["metatag","metatag"]],[/./,"string"]],sstring:[[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/./,"string"]],sstringt:[[/@escapes/,"string.escape"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/./,"string"]],interp:[[/{/,"operator","@push"],[/}/,"operator","@pop"],{include:"@root"}],rawstring:[[/[^"]/,"string"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}]],rawstringt:[[/[^"]/,"string"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/"/,"string"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js new file mode 100644 index 0000000000..c93fe952ae --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/scheme/scheme",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={comments:{lineComment:";",blockComment:["#|","|#"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},o.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".scheme",brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],keywords:["case","do","let","loop","if","else","when","cons","car","cdr","cond","lambda","lambda*","syntax-rules","format","set!","quote","eval","append","list","list?","member?","load"],constants:["#t","#f"],operators:["eq?","eqv?","equal?","and","or","not","null?"],tokenizer:{root:[[/#[xXoObB][0-9a-fA-F]+/,"number.hex"],[/[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?/,"number.float"],[/(?:\b(?:(define|define-syntax|define-macro))\b)(\s+)((?:\w|\-|\!|\?)*)/,["keyword","white","variable"]],{include:"@whitespace"},{include:"@strings"},[/[a-zA-Z_#][a-zA-Z0-9_\-\?\!\*]*/,{cases:{"@keywords":"keyword","@constants":"constant","@operators":"operators","@default":"identifier"}}]],comment:[[/[^\|#]+/,"comment"],[/#\|/,"comment","@push"],[/\|#/,"comment","@pop"],[/[\|#]/,"comment"]],whitespace:[[/[ \t\r\n]+/,"white"],[/#\|/,"comment","@comment"],[/;.*$/,"comment"]],strings:[[/"$/,"string","@popall"],[/"(?=.)/,"string","@multiLineString"]],multiLineString:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string.escape"],[/"/,"string","@popall"],[/\\$/,"string"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js new file mode 100644 index 0000000000..b8e8a5a910 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/scss/scss",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(#?-?\d*\.\d\w*%?)|([@$#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},t.language={defaultToken:"",tokenPostfix:".scss",ws:"[ \t\n\r\f]*",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@variabledeclaration"},{include:"@warndebug"},["[@](include)",{token:"keyword",next:"@includedeclaration"}],["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["[@](function)",{token:"keyword",next:"@functiondeclaration"}],["[@](mixin)",{token:"keyword",next:"@mixindeclaration"}],["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@controlstatement"},{include:"@selectorname"},["[&\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.curly",next:"@selectorbody"}]],selectorbody:[["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],{include:"@selector"},["[@](extend)",{token:"keyword",next:"@extendbody"}],["[@](return)",{token:"keyword",next:"@declarationbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],selectorname:[["#{",{token:"meta",next:"@variableinterpolation"}],["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@functioninvocation"},{include:"@numbers"},{include:"@strings"},{include:"@variablereference"},["(and\\b|or\\b|not\\b)","operator"],{include:"@name"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","operator"],[",","delimiter"],["!default","literal"],["\\(",{token:"delimiter.parenthesis",next:"@parenthizedterm"}]],rulevalue:[{include:"@term"},["!important","literal"],[";","delimiter","@pop"],["{",{token:"delimiter.curly",switchTo:"@nestedproperty"}],["(?=})",{token:"",next:"@pop"}]],nestedproperty:[["[*_]?@identifier@ws:","attribute.name","@rulevalue"],{include:"@comments"},["}",{token:"delimiter.curly",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],variabledeclaration:[["\\$@identifier@ws:","variable.decl","@declarationbody"]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"meta",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],extendbody:[{include:"@selectorname"},["!optional","literal"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],variablereference:[["\\$@identifier","variable.ref"],["\\.\\.\\.","operator"],["#{",{token:"meta",next:"@variableinterpolation"}]],variableinterpolation:[{include:"@variablereference"},["}",{token:"meta",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],name:[["@identifier","attribute.value"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","number.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","number","@pop"]],functiondeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["{",{token:"delimiter.curly",switchTo:"@functionbody"}]],mixindeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],parameterdeclaration:[["\\$@identifier@ws:","variable.decl"],["\\.\\.\\.","operator"],[",","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],includedeclaration:[{include:"@functioninvocation"},["@identifier","meta"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],keyframedeclaration:[["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.curly",next:"@selectorbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],controlstatement:[["[@](if|else|for|while|each|media)",{token:"keyword.flow",next:"@controlstatementdeclaration"}]],controlstatementdeclaration:[["(in|from|through|if|to)\\b",{token:"keyword.flow"}],{include:"@term"},["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],functionbody:[["[@](return)",{token:"keyword"}],{include:"@variabledeclaration"},{include:"@term"},{include:"@controlstatement"},[";","delimiter"],["}",{token:"delimiter.curly",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"meta",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],strings:[['~?"',{token:"string.delimiter",next:"@stringenddoublequote"}],["~?'",{token:"string.delimiter",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string.delimiter",next:"@pop"}],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string.delimiter",next:"@pop"}],[".","string"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/shell/shell.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/shell/shell.js new file mode 100644 index 0000000000..84f7362236 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/shell/shell.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/shell/shell",["require","exports"],(function(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.language=r.conf=void 0,r.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},r.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".shell",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["if","then","do","else","elif","while","until","for","in","esac","fi","fin","fil","done","exit","set","unset","export","function"],builtins:["ab","awk","bash","beep","cat","cc","cd","chown","chmod","chroot","clear","cp","curl","cut","diff","echo","find","gawk","gcc","get","git","grep","hg","kill","killall","ln","ls","make","mkdir","openssl","mv","nc","node","npm","ping","ps","restart","rm","rmdir","sed","service","sh","shopt","shred","source","sort","sleep","ssh","start","stop","su","sudo","svn","tee","telnet","top","touch","vi","vim","wall","wc","wget","who","write","yes","zsh"],symbols:/[=>"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},e.language={defaultToken:"",tokenPostfix:".sol",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["pragma","solidity","contract","library","using","struct","function","modifier","constructor","address","string","bool","Int","Uint","Byte","Fixed","Ufixed","int","int8","int16","int24","int32","int40","int48","int56","int64","int72","int80","int88","int96","int104","int112","int120","int128","int136","int144","int152","int160","int168","int176","int184","int192","int200","int208","int216","int224","int232","int240","int248","int256","uint","uint8","uint16","uint24","uint32","uint40","uint48","uint56","uint64","uint72","uint80","uint88","uint96","uint104","uint112","uint120","uint128","uint136","uint144","uint152","uint160","uint168","uint176","uint184","uint192","uint200","uint208","uint216","uint224","uint232","uint240","uint248","uint256","byte","bytes","bytes1","bytes2","bytes3","bytes4","bytes5","bytes6","bytes7","bytes8","bytes9","bytes10","bytes11","bytes12","bytes13","bytes14","bytes15","bytes16","bytes17","bytes18","bytes19","bytes20","bytes21","bytes22","bytes23","bytes24","bytes25","bytes26","bytes27","bytes28","bytes29","bytes30","bytes31","bytes32","fixed","fixed0x8","fixed0x16","fixed0x24","fixed0x32","fixed0x40","fixed0x48","fixed0x56","fixed0x64","fixed0x72","fixed0x80","fixed0x88","fixed0x96","fixed0x104","fixed0x112","fixed0x120","fixed0x128","fixed0x136","fixed0x144","fixed0x152","fixed0x160","fixed0x168","fixed0x176","fixed0x184","fixed0x192","fixed0x200","fixed0x208","fixed0x216","fixed0x224","fixed0x232","fixed0x240","fixed0x248","fixed0x256","fixed8x8","fixed8x16","fixed8x24","fixed8x32","fixed8x40","fixed8x48","fixed8x56","fixed8x64","fixed8x72","fixed8x80","fixed8x88","fixed8x96","fixed8x104","fixed8x112","fixed8x120","fixed8x128","fixed8x136","fixed8x144","fixed8x152","fixed8x160","fixed8x168","fixed8x176","fixed8x184","fixed8x192","fixed8x200","fixed8x208","fixed8x216","fixed8x224","fixed8x232","fixed8x240","fixed8x248","fixed16x8","fixed16x16","fixed16x24","fixed16x32","fixed16x40","fixed16x48","fixed16x56","fixed16x64","fixed16x72","fixed16x80","fixed16x88","fixed16x96","fixed16x104","fixed16x112","fixed16x120","fixed16x128","fixed16x136","fixed16x144","fixed16x152","fixed16x160","fixed16x168","fixed16x176","fixed16x184","fixed16x192","fixed16x200","fixed16x208","fixed16x216","fixed16x224","fixed16x232","fixed16x240","fixed24x8","fixed24x16","fixed24x24","fixed24x32","fixed24x40","fixed24x48","fixed24x56","fixed24x64","fixed24x72","fixed24x80","fixed24x88","fixed24x96","fixed24x104","fixed24x112","fixed24x120","fixed24x128","fixed24x136","fixed24x144","fixed24x152","fixed24x160","fixed24x168","fixed24x176","fixed24x184","fixed24x192","fixed24x200","fixed24x208","fixed24x216","fixed24x224","fixed24x232","fixed32x8","fixed32x16","fixed32x24","fixed32x32","fixed32x40","fixed32x48","fixed32x56","fixed32x64","fixed32x72","fixed32x80","fixed32x88","fixed32x96","fixed32x104","fixed32x112","fixed32x120","fixed32x128","fixed32x136","fixed32x144","fixed32x152","fixed32x160","fixed32x168","fixed32x176","fixed32x184","fixed32x192","fixed32x200","fixed32x208","fixed32x216","fixed32x224","fixed40x8","fixed40x16","fixed40x24","fixed40x32","fixed40x40","fixed40x48","fixed40x56","fixed40x64","fixed40x72","fixed40x80","fixed40x88","fixed40x96","fixed40x104","fixed40x112","fixed40x120","fixed40x128","fixed40x136","fixed40x144","fixed40x152","fixed40x160","fixed40x168","fixed40x176","fixed40x184","fixed40x192","fixed40x200","fixed40x208","fixed40x216","fixed48x8","fixed48x16","fixed48x24","fixed48x32","fixed48x40","fixed48x48","fixed48x56","fixed48x64","fixed48x72","fixed48x80","fixed48x88","fixed48x96","fixed48x104","fixed48x112","fixed48x120","fixed48x128","fixed48x136","fixed48x144","fixed48x152","fixed48x160","fixed48x168","fixed48x176","fixed48x184","fixed48x192","fixed48x200","fixed48x208","fixed56x8","fixed56x16","fixed56x24","fixed56x32","fixed56x40","fixed56x48","fixed56x56","fixed56x64","fixed56x72","fixed56x80","fixed56x88","fixed56x96","fixed56x104","fixed56x112","fixed56x120","fixed56x128","fixed56x136","fixed56x144","fixed56x152","fixed56x160","fixed56x168","fixed56x176","fixed56x184","fixed56x192","fixed56x200","fixed64x8","fixed64x16","fixed64x24","fixed64x32","fixed64x40","fixed64x48","fixed64x56","fixed64x64","fixed64x72","fixed64x80","fixed64x88","fixed64x96","fixed64x104","fixed64x112","fixed64x120","fixed64x128","fixed64x136","fixed64x144","fixed64x152","fixed64x160","fixed64x168","fixed64x176","fixed64x184","fixed64x192","fixed72x8","fixed72x16","fixed72x24","fixed72x32","fixed72x40","fixed72x48","fixed72x56","fixed72x64","fixed72x72","fixed72x80","fixed72x88","fixed72x96","fixed72x104","fixed72x112","fixed72x120","fixed72x128","fixed72x136","fixed72x144","fixed72x152","fixed72x160","fixed72x168","fixed72x176","fixed72x184","fixed80x8","fixed80x16","fixed80x24","fixed80x32","fixed80x40","fixed80x48","fixed80x56","fixed80x64","fixed80x72","fixed80x80","fixed80x88","fixed80x96","fixed80x104","fixed80x112","fixed80x120","fixed80x128","fixed80x136","fixed80x144","fixed80x152","fixed80x160","fixed80x168","fixed80x176","fixed88x8","fixed88x16","fixed88x24","fixed88x32","fixed88x40","fixed88x48","fixed88x56","fixed88x64","fixed88x72","fixed88x80","fixed88x88","fixed88x96","fixed88x104","fixed88x112","fixed88x120","fixed88x128","fixed88x136","fixed88x144","fixed88x152","fixed88x160","fixed88x168","fixed96x8","fixed96x16","fixed96x24","fixed96x32","fixed96x40","fixed96x48","fixed96x56","fixed96x64","fixed96x72","fixed96x80","fixed96x88","fixed96x96","fixed96x104","fixed96x112","fixed96x120","fixed96x128","fixed96x136","fixed96x144","fixed96x152","fixed96x160","fixed104x8","fixed104x16","fixed104x24","fixed104x32","fixed104x40","fixed104x48","fixed104x56","fixed104x64","fixed104x72","fixed104x80","fixed104x88","fixed104x96","fixed104x104","fixed104x112","fixed104x120","fixed104x128","fixed104x136","fixed104x144","fixed104x152","fixed112x8","fixed112x16","fixed112x24","fixed112x32","fixed112x40","fixed112x48","fixed112x56","fixed112x64","fixed112x72","fixed112x80","fixed112x88","fixed112x96","fixed112x104","fixed112x112","fixed112x120","fixed112x128","fixed112x136","fixed112x144","fixed120x8","fixed120x16","fixed120x24","fixed120x32","fixed120x40","fixed120x48","fixed120x56","fixed120x64","fixed120x72","fixed120x80","fixed120x88","fixed120x96","fixed120x104","fixed120x112","fixed120x120","fixed120x128","fixed120x136","fixed128x8","fixed128x16","fixed128x24","fixed128x32","fixed128x40","fixed128x48","fixed128x56","fixed128x64","fixed128x72","fixed128x80","fixed128x88","fixed128x96","fixed128x104","fixed128x112","fixed128x120","fixed128x128","fixed136x8","fixed136x16","fixed136x24","fixed136x32","fixed136x40","fixed136x48","fixed136x56","fixed136x64","fixed136x72","fixed136x80","fixed136x88","fixed136x96","fixed136x104","fixed136x112","fixed136x120","fixed144x8","fixed144x16","fixed144x24","fixed144x32","fixed144x40","fixed144x48","fixed144x56","fixed144x64","fixed144x72","fixed144x80","fixed144x88","fixed144x96","fixed144x104","fixed144x112","fixed152x8","fixed152x16","fixed152x24","fixed152x32","fixed152x40","fixed152x48","fixed152x56","fixed152x64","fixed152x72","fixed152x80","fixed152x88","fixed152x96","fixed152x104","fixed160x8","fixed160x16","fixed160x24","fixed160x32","fixed160x40","fixed160x48","fixed160x56","fixed160x64","fixed160x72","fixed160x80","fixed160x88","fixed160x96","fixed168x8","fixed168x16","fixed168x24","fixed168x32","fixed168x40","fixed168x48","fixed168x56","fixed168x64","fixed168x72","fixed168x80","fixed168x88","fixed176x8","fixed176x16","fixed176x24","fixed176x32","fixed176x40","fixed176x48","fixed176x56","fixed176x64","fixed176x72","fixed176x80","fixed184x8","fixed184x16","fixed184x24","fixed184x32","fixed184x40","fixed184x48","fixed184x56","fixed184x64","fixed184x72","fixed192x8","fixed192x16","fixed192x24","fixed192x32","fixed192x40","fixed192x48","fixed192x56","fixed192x64","fixed200x8","fixed200x16","fixed200x24","fixed200x32","fixed200x40","fixed200x48","fixed200x56","fixed208x8","fixed208x16","fixed208x24","fixed208x32","fixed208x40","fixed208x48","fixed216x8","fixed216x16","fixed216x24","fixed216x32","fixed216x40","fixed224x8","fixed224x16","fixed224x24","fixed224x32","fixed232x8","fixed232x16","fixed232x24","fixed240x8","fixed240x16","fixed248x8","ufixed","ufixed0x8","ufixed0x16","ufixed0x24","ufixed0x32","ufixed0x40","ufixed0x48","ufixed0x56","ufixed0x64","ufixed0x72","ufixed0x80","ufixed0x88","ufixed0x96","ufixed0x104","ufixed0x112","ufixed0x120","ufixed0x128","ufixed0x136","ufixed0x144","ufixed0x152","ufixed0x160","ufixed0x168","ufixed0x176","ufixed0x184","ufixed0x192","ufixed0x200","ufixed0x208","ufixed0x216","ufixed0x224","ufixed0x232","ufixed0x240","ufixed0x248","ufixed0x256","ufixed8x8","ufixed8x16","ufixed8x24","ufixed8x32","ufixed8x40","ufixed8x48","ufixed8x56","ufixed8x64","ufixed8x72","ufixed8x80","ufixed8x88","ufixed8x96","ufixed8x104","ufixed8x112","ufixed8x120","ufixed8x128","ufixed8x136","ufixed8x144","ufixed8x152","ufixed8x160","ufixed8x168","ufixed8x176","ufixed8x184","ufixed8x192","ufixed8x200","ufixed8x208","ufixed8x216","ufixed8x224","ufixed8x232","ufixed8x240","ufixed8x248","ufixed16x8","ufixed16x16","ufixed16x24","ufixed16x32","ufixed16x40","ufixed16x48","ufixed16x56","ufixed16x64","ufixed16x72","ufixed16x80","ufixed16x88","ufixed16x96","ufixed16x104","ufixed16x112","ufixed16x120","ufixed16x128","ufixed16x136","ufixed16x144","ufixed16x152","ufixed16x160","ufixed16x168","ufixed16x176","ufixed16x184","ufixed16x192","ufixed16x200","ufixed16x208","ufixed16x216","ufixed16x224","ufixed16x232","ufixed16x240","ufixed24x8","ufixed24x16","ufixed24x24","ufixed24x32","ufixed24x40","ufixed24x48","ufixed24x56","ufixed24x64","ufixed24x72","ufixed24x80","ufixed24x88","ufixed24x96","ufixed24x104","ufixed24x112","ufixed24x120","ufixed24x128","ufixed24x136","ufixed24x144","ufixed24x152","ufixed24x160","ufixed24x168","ufixed24x176","ufixed24x184","ufixed24x192","ufixed24x200","ufixed24x208","ufixed24x216","ufixed24x224","ufixed24x232","ufixed32x8","ufixed32x16","ufixed32x24","ufixed32x32","ufixed32x40","ufixed32x48","ufixed32x56","ufixed32x64","ufixed32x72","ufixed32x80","ufixed32x88","ufixed32x96","ufixed32x104","ufixed32x112","ufixed32x120","ufixed32x128","ufixed32x136","ufixed32x144","ufixed32x152","ufixed32x160","ufixed32x168","ufixed32x176","ufixed32x184","ufixed32x192","ufixed32x200","ufixed32x208","ufixed32x216","ufixed32x224","ufixed40x8","ufixed40x16","ufixed40x24","ufixed40x32","ufixed40x40","ufixed40x48","ufixed40x56","ufixed40x64","ufixed40x72","ufixed40x80","ufixed40x88","ufixed40x96","ufixed40x104","ufixed40x112","ufixed40x120","ufixed40x128","ufixed40x136","ufixed40x144","ufixed40x152","ufixed40x160","ufixed40x168","ufixed40x176","ufixed40x184","ufixed40x192","ufixed40x200","ufixed40x208","ufixed40x216","ufixed48x8","ufixed48x16","ufixed48x24","ufixed48x32","ufixed48x40","ufixed48x48","ufixed48x56","ufixed48x64","ufixed48x72","ufixed48x80","ufixed48x88","ufixed48x96","ufixed48x104","ufixed48x112","ufixed48x120","ufixed48x128","ufixed48x136","ufixed48x144","ufixed48x152","ufixed48x160","ufixed48x168","ufixed48x176","ufixed48x184","ufixed48x192","ufixed48x200","ufixed48x208","ufixed56x8","ufixed56x16","ufixed56x24","ufixed56x32","ufixed56x40","ufixed56x48","ufixed56x56","ufixed56x64","ufixed56x72","ufixed56x80","ufixed56x88","ufixed56x96","ufixed56x104","ufixed56x112","ufixed56x120","ufixed56x128","ufixed56x136","ufixed56x144","ufixed56x152","ufixed56x160","ufixed56x168","ufixed56x176","ufixed56x184","ufixed56x192","ufixed56x200","ufixed64x8","ufixed64x16","ufixed64x24","ufixed64x32","ufixed64x40","ufixed64x48","ufixed64x56","ufixed64x64","ufixed64x72","ufixed64x80","ufixed64x88","ufixed64x96","ufixed64x104","ufixed64x112","ufixed64x120","ufixed64x128","ufixed64x136","ufixed64x144","ufixed64x152","ufixed64x160","ufixed64x168","ufixed64x176","ufixed64x184","ufixed64x192","ufixed72x8","ufixed72x16","ufixed72x24","ufixed72x32","ufixed72x40","ufixed72x48","ufixed72x56","ufixed72x64","ufixed72x72","ufixed72x80","ufixed72x88","ufixed72x96","ufixed72x104","ufixed72x112","ufixed72x120","ufixed72x128","ufixed72x136","ufixed72x144","ufixed72x152","ufixed72x160","ufixed72x168","ufixed72x176","ufixed72x184","ufixed80x8","ufixed80x16","ufixed80x24","ufixed80x32","ufixed80x40","ufixed80x48","ufixed80x56","ufixed80x64","ufixed80x72","ufixed80x80","ufixed80x88","ufixed80x96","ufixed80x104","ufixed80x112","ufixed80x120","ufixed80x128","ufixed80x136","ufixed80x144","ufixed80x152","ufixed80x160","ufixed80x168","ufixed80x176","ufixed88x8","ufixed88x16","ufixed88x24","ufixed88x32","ufixed88x40","ufixed88x48","ufixed88x56","ufixed88x64","ufixed88x72","ufixed88x80","ufixed88x88","ufixed88x96","ufixed88x104","ufixed88x112","ufixed88x120","ufixed88x128","ufixed88x136","ufixed88x144","ufixed88x152","ufixed88x160","ufixed88x168","ufixed96x8","ufixed96x16","ufixed96x24","ufixed96x32","ufixed96x40","ufixed96x48","ufixed96x56","ufixed96x64","ufixed96x72","ufixed96x80","ufixed96x88","ufixed96x96","ufixed96x104","ufixed96x112","ufixed96x120","ufixed96x128","ufixed96x136","ufixed96x144","ufixed96x152","ufixed96x160","ufixed104x8","ufixed104x16","ufixed104x24","ufixed104x32","ufixed104x40","ufixed104x48","ufixed104x56","ufixed104x64","ufixed104x72","ufixed104x80","ufixed104x88","ufixed104x96","ufixed104x104","ufixed104x112","ufixed104x120","ufixed104x128","ufixed104x136","ufixed104x144","ufixed104x152","ufixed112x8","ufixed112x16","ufixed112x24","ufixed112x32","ufixed112x40","ufixed112x48","ufixed112x56","ufixed112x64","ufixed112x72","ufixed112x80","ufixed112x88","ufixed112x96","ufixed112x104","ufixed112x112","ufixed112x120","ufixed112x128","ufixed112x136","ufixed112x144","ufixed120x8","ufixed120x16","ufixed120x24","ufixed120x32","ufixed120x40","ufixed120x48","ufixed120x56","ufixed120x64","ufixed120x72","ufixed120x80","ufixed120x88","ufixed120x96","ufixed120x104","ufixed120x112","ufixed120x120","ufixed120x128","ufixed120x136","ufixed128x8","ufixed128x16","ufixed128x24","ufixed128x32","ufixed128x40","ufixed128x48","ufixed128x56","ufixed128x64","ufixed128x72","ufixed128x80","ufixed128x88","ufixed128x96","ufixed128x104","ufixed128x112","ufixed128x120","ufixed128x128","ufixed136x8","ufixed136x16","ufixed136x24","ufixed136x32","ufixed136x40","ufixed136x48","ufixed136x56","ufixed136x64","ufixed136x72","ufixed136x80","ufixed136x88","ufixed136x96","ufixed136x104","ufixed136x112","ufixed136x120","ufixed144x8","ufixed144x16","ufixed144x24","ufixed144x32","ufixed144x40","ufixed144x48","ufixed144x56","ufixed144x64","ufixed144x72","ufixed144x80","ufixed144x88","ufixed144x96","ufixed144x104","ufixed144x112","ufixed152x8","ufixed152x16","ufixed152x24","ufixed152x32","ufixed152x40","ufixed152x48","ufixed152x56","ufixed152x64","ufixed152x72","ufixed152x80","ufixed152x88","ufixed152x96","ufixed152x104","ufixed160x8","ufixed160x16","ufixed160x24","ufixed160x32","ufixed160x40","ufixed160x48","ufixed160x56","ufixed160x64","ufixed160x72","ufixed160x80","ufixed160x88","ufixed160x96","ufixed168x8","ufixed168x16","ufixed168x24","ufixed168x32","ufixed168x40","ufixed168x48","ufixed168x56","ufixed168x64","ufixed168x72","ufixed168x80","ufixed168x88","ufixed176x8","ufixed176x16","ufixed176x24","ufixed176x32","ufixed176x40","ufixed176x48","ufixed176x56","ufixed176x64","ufixed176x72","ufixed176x80","ufixed184x8","ufixed184x16","ufixed184x24","ufixed184x32","ufixed184x40","ufixed184x48","ufixed184x56","ufixed184x64","ufixed184x72","ufixed192x8","ufixed192x16","ufixed192x24","ufixed192x32","ufixed192x40","ufixed192x48","ufixed192x56","ufixed192x64","ufixed200x8","ufixed200x16","ufixed200x24","ufixed200x32","ufixed200x40","ufixed200x48","ufixed200x56","ufixed208x8","ufixed208x16","ufixed208x24","ufixed208x32","ufixed208x40","ufixed208x48","ufixed216x8","ufixed216x16","ufixed216x24","ufixed216x32","ufixed216x40","ufixed224x8","ufixed224x16","ufixed224x24","ufixed224x32","ufixed232x8","ufixed232x16","ufixed232x24","ufixed240x8","ufixed240x16","ufixed248x8","event","enum","let","mapping","private","public","external","inherited","payable","true","false","var","import","constant","if","else","for","else","for","while","do","break","continue","throw","returns","return","suicide","new","is","this","super"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js new file mode 100644 index 0000000000..1518e61aa3 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/sophia/sophia",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},t.language={defaultToken:"",tokenPostfix:".aes",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["contract","library","entrypoint","function","stateful","state","hash","signature","tuple","list","address","string","bool","int","record","datatype","type","option","oracle","oracle_query","Call","Bits","Bytes","Oracle","String","Crypto","Address","Auth","Chain","None","Some","bits","bytes","event","let","map","private","public","true","false","var","if","else","throw"],operators:["=",">","<","!","~","?","::",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js new file mode 100644 index 0000000000..06ccffc882 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/sql/sql",["require","exports"],(function(E,T){"use strict";Object.defineProperty(T,"__esModule",{value:!0}),T.language=T.conf=void 0,T.conf={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},T.language={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ABORT_AFTER_WAIT","ABSENT","ABSOLUTE","ACCENT_SENSITIVITY","ACTION","ACTIVATION","ACTIVE","ADD","ADDRESS","ADMIN","AES","AES_128","AES_192","AES_256","AFFINITY","AFTER","AGGREGATE","ALGORITHM","ALL_CONSTRAINTS","ALL_ERRORMSGS","ALL_INDEXES","ALL_LEVELS","ALL_SPARSE_COLUMNS","ALLOW_CONNECTIONS","ALLOW_MULTIPLE_EVENT_LOSS","ALLOW_PAGE_LOCKS","ALLOW_ROW_LOCKS","ALLOW_SINGLE_EVENT_LOSS","ALLOW_SNAPSHOT_ISOLATION","ALLOWED","ALTER","ANONYMOUS","ANSI_DEFAULTS","ANSI_NULL_DEFAULT","ANSI_NULL_DFLT_OFF","ANSI_NULL_DFLT_ON","ANSI_NULLS","ANSI_PADDING","ANSI_WARNINGS","APPEND","APPLICATION","APPLICATION_LOG","ARITHABORT","ARITHIGNORE","AS","ASC","ASSEMBLY","ASYMMETRIC","ASYNCHRONOUS_COMMIT","AT","ATOMIC","ATTACH","ATTACH_REBUILD_LOG","AUDIT","AUDIT_GUID","AUTHENTICATION","AUTHORIZATION","AUTO","AUTO_CLEANUP","AUTO_CLOSE","AUTO_CREATE_STATISTICS","AUTO_SHRINK","AUTO_UPDATE_STATISTICS","AUTO_UPDATE_STATISTICS_ASYNC","AUTOMATED_BACKUP_PREFERENCE","AUTOMATIC","AVAILABILITY","AVAILABILITY_MODE","BACKUP","BACKUP_PRIORITY","BASE64","BATCHSIZE","BEGIN","BEGIN_DIALOG","BIGINT","BINARY","BINDING","BIT","BLOCKERS","BLOCKSIZE","BOUNDING_BOX","BREAK","BROKER","BROKER_INSTANCE","BROWSE","BUCKET_COUNT","BUFFER","BUFFERCOUNT","BULK","BULK_LOGGED","BY","CACHE","CALL","CALLED","CALLER","CAP_CPU_PERCENT","CASCADE","CASE","CATALOG","CATCH","CELLS_PER_OBJECT","CERTIFICATE","CHANGE_RETENTION","CHANGE_TRACKING","CHANGES","CHAR","CHARACTER","CHECK","CHECK_CONSTRAINTS","CHECK_EXPIRATION","CHECK_POLICY","CHECKALLOC","CHECKCATALOG","CHECKCONSTRAINTS","CHECKDB","CHECKFILEGROUP","CHECKIDENT","CHECKPOINT","CHECKTABLE","CLASSIFIER_FUNCTION","CLEANTABLE","CLEANUP","CLEAR","CLOSE","CLUSTER","CLUSTERED","CODEPAGE","COLLATE","COLLECTION","COLUMN","COLUMN_SET","COLUMNS","COLUMNSTORE","COLUMNSTORE_ARCHIVE","COMMIT","COMMITTED","COMPATIBILITY_LEVEL","COMPRESSION","COMPUTE","CONCAT","CONCAT_NULL_YIELDS_NULL","CONFIGURATION","CONNECT","CONSTRAINT","CONTAINMENT","CONTENT","CONTEXT","CONTINUE","CONTINUE_AFTER_ERROR","CONTRACT","CONTRACT_NAME","CONTROL","CONVERSATION","COOKIE","COPY_ONLY","COUNTER","CPU","CREATE","CREATE_NEW","CREATION_DISPOSITION","CREDENTIAL","CRYPTOGRAPHIC","CUBE","CURRENT","CURRENT_DATE","CURSOR","CURSOR_CLOSE_ON_COMMIT","CURSOR_DEFAULT","CYCLE","DATA","DATA_COMPRESSION","DATA_PURITY","DATABASE","DATABASE_DEFAULT","DATABASE_MIRRORING","DATABASE_SNAPSHOT","DATAFILETYPE","DATE","DATE_CORRELATION_OPTIMIZATION","DATEFIRST","DATEFORMAT","DATETIME","DATETIME2","DATETIMEOFFSET","DAY","DAYOFYEAR","DAYS","DB_CHAINING","DBCC","DBREINDEX","DDL_DATABASE_LEVEL_EVENTS","DEADLOCK_PRIORITY","DEALLOCATE","DEC","DECIMAL","DECLARE","DECRYPTION","DEFAULT","DEFAULT_DATABASE","DEFAULT_FULLTEXT_LANGUAGE","DEFAULT_LANGUAGE","DEFAULT_SCHEMA","DEFINITION","DELAY","DELAYED_DURABILITY","DELETE","DELETED","DENSITY_VECTOR","DENY","DEPENDENTS","DES","DESC","DESCRIPTION","DESX","DHCP","DIAGNOSTICS","DIALOG","DIFFERENTIAL","DIRECTORY_NAME","DISABLE","DISABLE_BROKER","DISABLED","DISK","DISTINCT","DISTRIBUTED","DOCUMENT","DOUBLE","DROP","DROP_EXISTING","DROPCLEANBUFFERS","DUMP","DURABILITY","DYNAMIC","EDITION","ELEMENTS","ELSE","EMERGENCY","EMPTY","EMPTYFILE","ENABLE","ENABLE_BROKER","ENABLED","ENCRYPTION","END","ENDPOINT","ENDPOINT_URL","ERRLVL","ERROR","ERROR_BROKER_CONVERSATIONS","ERRORFILE","ESCAPE","ESTIMATEONLY","EVENT","EVENT_RETENTION_MODE","EXEC","EXECUTABLE","EXECUTE","EXIT","EXPAND","EXPIREDATE","EXPIRY_DATE","EXPLICIT","EXTENDED_LOGICAL_CHECKS","EXTENSION","EXTERNAL","EXTERNAL_ACCESS","FAIL_OPERATION","FAILOVER","FAILOVER_MODE","FAILURE_CONDITION_LEVEL","FALSE","FAN_IN","FAST","FAST_FORWARD","FETCH","FIELDTERMINATOR","FILE","FILEGROUP","FILEGROWTH","FILELISTONLY","FILENAME","FILEPATH","FILESTREAM","FILESTREAM_ON","FILETABLE_COLLATE_FILENAME","FILETABLE_DIRECTORY","FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME","FILETABLE_NAMESPACE","FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME","FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME","FILLFACTOR","FILTERING","FIRE_TRIGGERS","FIRST","FIRSTROW","FLOAT","FMTONLY","FOLLOWING","FOR","FORCE","FORCE_FAILOVER_ALLOW_DATA_LOSS","FORCE_SERVICE_ALLOW_DATA_LOSS","FORCED","FORCEPLAN","FORCESCAN","FORCESEEK","FOREIGN","FORMATFILE","FORMSOF","FORWARD_ONLY","FREE","FREEPROCCACHE","FREESESSIONCACHE","FREESYSTEMCACHE","FROM","FULL","FULLSCAN","FULLTEXT","FUNCTION","GB","GEOGRAPHY_AUTO_GRID","GEOGRAPHY_GRID","GEOMETRY_AUTO_GRID","GEOMETRY_GRID","GET","GLOBAL","GO","GOTO","GOVERNOR","GRANT","GRIDS","GROUP","GROUP_MAX_REQUESTS","HADR","HASH","HASHED","HAVING","HEADERONLY","HEALTH_CHECK_TIMEOUT","HELP","HIERARCHYID","HIGH","HINT","HISTOGRAM","HOLDLOCK","HONOR_BROKER_PRIORITY","HOUR","HOURS","IDENTITY","IDENTITY_INSERT","IDENTITY_VALUE","IDENTITYCOL","IF","IGNORE_CONSTRAINTS","IGNORE_DUP_KEY","IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX","IGNORE_TRIGGERS","IMAGE","IMMEDIATE","IMPERSONATE","IMPLICIT_TRANSACTIONS","IMPORTANCE","INCLUDE","INCREMENT","INCREMENTAL","INDEX","INDEXDEFRAG","INFINITE","INFLECTIONAL","INIT","INITIATOR","INPUT","INPUTBUFFER","INSENSITIVE","INSERT","INSERTED","INSTEAD","INT","INTEGER","INTO","IO","IP","ISABOUT","ISOLATION","JOB","KB","KEEP","KEEP_CDC","KEEP_NULLS","KEEP_REPLICATION","KEEPDEFAULTS","KEEPFIXED","KEEPIDENTITY","KEEPNULLS","KERBEROS","KEY","KEY_SOURCE","KEYS","KEYSET","KILL","KILOBYTES_PER_BATCH","LABELONLY","LANGUAGE","LAST","LASTROW","LEVEL","LEVEL_1","LEVEL_2","LEVEL_3","LEVEL_4","LIFETIME","LIMIT","LINENO","LIST","LISTENER","LISTENER_IP","LISTENER_PORT","LOAD","LOADHISTORY","LOB_COMPACTION","LOCAL","LOCAL_SERVICE_NAME","LOCK_ESCALATION","LOCK_TIMEOUT","LOGIN","LOGSPACE","LOOP","LOW","MANUAL","MARK","MARK_IN_USE_FOR_REMOVAL","MASTER","MAX_CPU_PERCENT","MAX_DISPATCH_LATENCY","MAX_DOP","MAX_DURATION","MAX_EVENT_SIZE","MAX_FILES","MAX_IOPS_PER_VOLUME","MAX_MEMORY","MAX_MEMORY_PERCENT","MAX_QUEUE_READERS","MAX_ROLLOVER_FILES","MAX_SIZE","MAXDOP","MAXERRORS","MAXLENGTH","MAXRECURSION","MAXSIZE","MAXTRANSFERSIZE","MAXVALUE","MB","MEDIADESCRIPTION","MEDIANAME","MEDIAPASSWORD","MEDIUM","MEMBER","MEMORY_OPTIMIZED","MEMORY_OPTIMIZED_DATA","MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT","MEMORY_PARTITION_MODE","MERGE","MESSAGE","MESSAGE_FORWARD_SIZE","MESSAGE_FORWARDING","MICROSECOND","MILLISECOND","MIN_CPU_PERCENT","MIN_IOPS_PER_VOLUME","MIN_MEMORY_PERCENT","MINUTE","MINUTES","MINVALUE","MIRROR","MIRROR_ADDRESS","MODIFY","MONEY","MONTH","MOVE","MULTI_USER","MUST_CHANGE","NAME","NANOSECOND","NATIONAL","NATIVE_COMPILATION","NCHAR","NEGOTIATE","NESTED_TRIGGERS","NEW_ACCOUNT","NEW_BROKER","NEW_PASSWORD","NEWNAME","NEXT","NO","NO_BROWSETABLE","NO_CHECKSUM","NO_COMPRESSION","NO_EVENT_LOSS","NO_INFOMSGS","NO_TRUNCATE","NO_WAIT","NOCHECK","NOCOUNT","NOEXEC","NOEXPAND","NOFORMAT","NOINDEX","NOINIT","NOLOCK","NON","NON_TRANSACTED_ACCESS","NONCLUSTERED","NONE","NORECOMPUTE","NORECOVERY","NORESEED","NORESET","NOREWIND","NORMAL","NOSKIP","NOTIFICATION","NOTRUNCATE","NOUNLOAD","NOWAIT","NTEXT","NTLM","NUMANODE","NUMERIC","NUMERIC_ROUNDABORT","NVARCHAR","OBJECT","OF","OFF","OFFLINE","OFFSET","OFFSETS","OLD_ACCOUNT","OLD_PASSWORD","ON","ON_FAILURE","ONLINE","ONLY","OPEN","OPEN_EXISTING","OPENTRAN","OPTIMISTIC","OPTIMIZE","OPTION","ORDER","OUT","OUTPUT","OUTPUTBUFFER","OVER","OVERRIDE","OWNER","OWNERSHIP","PAD_INDEX","PAGE","PAGE_VERIFY","PAGECOUNT","PAGLOCK","PARAMETERIZATION","PARSEONLY","PARTIAL","PARTITION","PARTITIONS","PARTNER","PASSWORD","PATH","PER_CPU","PER_NODE","PERCENT","PERMISSION_SET","PERSISTED","PHYSICAL_ONLY","PLAN","POISON_MESSAGE_HANDLING","POOL","POPULATION","PORT","PRECEDING","PRECISION","PRIMARY","PRIMARY_ROLE","PRINT","PRIOR","PRIORITY","PRIORITY_LEVEL","PRIVATE","PRIVILEGES","PROC","PROCCACHE","PROCEDURE","PROCEDURE_NAME","PROCESS","PROFILE","PROPERTY","PROPERTY_DESCRIPTION","PROPERTY_INT_ID","PROPERTY_SET_GUID","PROVIDER","PROVIDER_KEY_NAME","PUBLIC","PUT","QUARTER","QUERY","QUERY_GOVERNOR_COST_LIMIT","QUEUE","QUEUE_DELAY","QUOTED_IDENTIFIER","RAISERROR","RANGE","RAW","RC2","RC4","RC4_128","READ","READ_COMMITTED_SNAPSHOT","READ_ONLY","READ_ONLY_ROUTING_LIST","READ_ONLY_ROUTING_URL","READ_WRITE","READ_WRITE_FILEGROUPS","READCOMMITTED","READCOMMITTEDLOCK","READONLY","READPAST","READTEXT","READUNCOMMITTED","READWRITE","REAL","REBUILD","RECEIVE","RECOMPILE","RECONFIGURE","RECOVERY","RECURSIVE","RECURSIVE_TRIGGERS","REFERENCES","REGENERATE","RELATED_CONVERSATION","RELATED_CONVERSATION_GROUP","RELATIVE","REMOTE","REMOTE_PROC_TRANSACTIONS","REMOTE_SERVICE_NAME","REMOVE","REORGANIZE","REPAIR_ALLOW_DATA_LOSS","REPAIR_FAST","REPAIR_REBUILD","REPEATABLE","REPEATABLEREAD","REPLICA","REPLICATION","REQUEST_MAX_CPU_TIME_SEC","REQUEST_MAX_MEMORY_GRANT_PERCENT","REQUEST_MEMORY_GRANT_TIMEOUT_SEC","REQUIRED","RESAMPLE","RESEED","RESERVE_DISK_SPACE","RESET","RESOURCE","RESTART","RESTORE","RESTRICT","RESTRICTED_USER","RESULT","RESUME","RETAINDAYS","RETENTION","RETURN","RETURNS","REVERT","REVOKE","REWIND","REWINDONLY","ROBUST","ROLE","ROLLBACK","ROLLUP","ROOT","ROUTE","ROW","ROWCOUNT","ROWGUIDCOL","ROWLOCK","ROWS","ROWS_PER_BATCH","ROWTERMINATOR","ROWVERSION","RSA_1024","RSA_2048","RSA_512","RULE","SAFE","SAFETY","SAMPLE","SAVE","SCHEDULER","SCHEMA","SCHEMA_AND_DATA","SCHEMA_ONLY","SCHEMABINDING","SCHEME","SCROLL","SCROLL_LOCKS","SEARCH","SECOND","SECONDARY","SECONDARY_ONLY","SECONDARY_ROLE","SECONDS","SECRET","SECURITY_LOG","SECURITYAUDIT","SELECT","SELECTIVE","SELF","SEND","SENT","SEQUENCE","SERIALIZABLE","SERVER","SERVICE","SERVICE_BROKER","SERVICE_NAME","SESSION","SESSION_TIMEOUT","SET","SETS","SETUSER","SHOW_STATISTICS","SHOWCONTIG","SHOWPLAN","SHOWPLAN_ALL","SHOWPLAN_TEXT","SHOWPLAN_XML","SHRINKDATABASE","SHRINKFILE","SHUTDOWN","SID","SIGNATURE","SIMPLE","SINGLE_BLOB","SINGLE_CLOB","SINGLE_NCLOB","SINGLE_USER","SINGLETON","SIZE","SKIP","SMALLDATETIME","SMALLINT","SMALLMONEY","SNAPSHOT","SORT_IN_TEMPDB","SOURCE","SPARSE","SPATIAL","SPATIAL_WINDOW_MAX_CELLS","SPECIFICATION","SPLIT","SQL","SQL_VARIANT","SQLPERF","STANDBY","START","START_DATE","STARTED","STARTUP_STATE","STAT_HEADER","STATE","STATEMENT","STATIC","STATISTICAL_SEMANTICS","STATISTICS","STATISTICS_INCREMENTAL","STATISTICS_NORECOMPUTE","STATS","STATS_STREAM","STATUS","STATUSONLY","STOP","STOP_ON_ERROR","STOPAT","STOPATMARK","STOPBEFOREMARK","STOPLIST","STOPPED","SUBJECT","SUBSCRIPTION","SUPPORTED","SUSPEND","SWITCH","SYMMETRIC","SYNCHRONOUS_COMMIT","SYNONYM","SYSNAME","SYSTEM","TABLE","TABLERESULTS","TABLESAMPLE","TABLOCK","TABLOCKX","TAKE","TAPE","TARGET","TARGET_RECOVERY_TIME","TB","TCP","TEXT","TEXTIMAGE_ON","TEXTSIZE","THEN","THESAURUS","THROW","TIES","TIME","TIMEOUT","TIMER","TIMESTAMP","TINYINT","TO","TOP","TORN_PAGE_DETECTION","TRACEOFF","TRACEON","TRACESTATUS","TRACK_CAUSALITY","TRACK_COLUMNS_UPDATED","TRAN","TRANSACTION","TRANSFER","TRANSFORM_NOISE_WORDS","TRIGGER","TRIPLE_DES","TRIPLE_DES_3KEY","TRUE","TRUNCATE","TRUNCATEONLY","TRUSTWORTHY","TRY","TSQL","TWO_DIGIT_YEAR_CUTOFF","TYPE","TYPE_WARNING","UNBOUNDED","UNCHECKED","UNCOMMITTED","UNDEFINED","UNIQUE","UNIQUEIDENTIFIER","UNKNOWN","UNLIMITED","UNLOAD","UNSAFE","UPDATE","UPDATETEXT","UPDATEUSAGE","UPDLOCK","URL","USE","USED","USER","USEROPTIONS","USING","VALID_XML","VALIDATION","VALUE","VALUES","VARBINARY","VARCHAR","VARYING","VERIFYONLY","VERSION","VIEW","VIEW_METADATA","VIEWS","VISIBILITY","WAIT_AT_LOW_PRIORITY","WAITFOR","WEEK","WEIGHT","WELL_FORMED_XML","WHEN","WHERE","WHILE","WINDOWS","WITH","WITHIN","WITHOUT","WITNESS","WORK","WORKLOAD","WRITETEXT","XACT_ABORT","XLOCK","XMAX","XMIN","XML","XMLDATA","XMLNAMESPACES","XMLSCHEMA","XQUERY","XSINIL","YEAR","YMAX","YMIN"],operators:["ALL","AND","ANY","BETWEEN","EXISTS","IN","LIKE","NOT","OR","SOME","EXCEPT","INTERSECT","UNION","APPLY","CROSS","FULL","INNER","JOIN","LEFT","OUTER","RIGHT","CONTAINS","FREETEXT","IS","NULL","PIVOT","UNPIVOT","MATCHED"],builtinFunctions:["AVG","CHECKSUM_AGG","COUNT","COUNT_BIG","GROUPING","GROUPING_ID","MAX","MIN","SUM","STDEV","STDEVP","VAR","VARP","CUME_DIST","FIRST_VALUE","LAG","LAST_VALUE","LEAD","PERCENTILE_CONT","PERCENTILE_DISC","PERCENT_RANK","COLLATE","COLLATIONPROPERTY","TERTIARY_WEIGHTS","FEDERATION_FILTERING_VALUE","CAST","CONVERT","PARSE","TRY_CAST","TRY_CONVERT","TRY_PARSE","ASYMKEY_ID","ASYMKEYPROPERTY","CERTPROPERTY","CERT_ID","CRYPT_GEN_RANDOM","DECRYPTBYASYMKEY","DECRYPTBYCERT","DECRYPTBYKEY","DECRYPTBYKEYAUTOASYMKEY","DECRYPTBYKEYAUTOCERT","DECRYPTBYPASSPHRASE","ENCRYPTBYASYMKEY","ENCRYPTBYCERT","ENCRYPTBYKEY","ENCRYPTBYPASSPHRASE","HASHBYTES","IS_OBJECTSIGNED","KEY_GUID","KEY_ID","KEY_NAME","SIGNBYASYMKEY","SIGNBYCERT","SYMKEYPROPERTY","VERIFYSIGNEDBYCERT","VERIFYSIGNEDBYASYMKEY","CURSOR_STATUS","DATALENGTH","IDENT_CURRENT","IDENT_INCR","IDENT_SEED","IDENTITY","SQL_VARIANT_PROPERTY","CURRENT_TIMESTAMP","DATEADD","DATEDIFF","DATEFROMPARTS","DATENAME","DATEPART","DATETIME2FROMPARTS","DATETIMEFROMPARTS","DATETIMEOFFSETFROMPARTS","DAY","EOMONTH","GETDATE","GETUTCDATE","ISDATE","MONTH","SMALLDATETIMEFROMPARTS","SWITCHOFFSET","SYSDATETIME","SYSDATETIMEOFFSET","SYSUTCDATETIME","TIMEFROMPARTS","TODATETIMEOFFSET","YEAR","CHOOSE","COALESCE","IIF","NULLIF","ABS","ACOS","ASIN","ATAN","ATN2","CEILING","COS","COT","DEGREES","EXP","FLOOR","LOG","LOG10","PI","POWER","RADIANS","RAND","ROUND","SIGN","SIN","SQRT","SQUARE","TAN","APP_NAME","APPLOCK_MODE","APPLOCK_TEST","ASSEMBLYPROPERTY","COL_LENGTH","COL_NAME","COLUMNPROPERTY","DATABASE_PRINCIPAL_ID","DATABASEPROPERTYEX","DB_ID","DB_NAME","FILE_ID","FILE_IDEX","FILE_NAME","FILEGROUP_ID","FILEGROUP_NAME","FILEGROUPPROPERTY","FILEPROPERTY","FULLTEXTCATALOGPROPERTY","FULLTEXTSERVICEPROPERTY","INDEX_COL","INDEXKEY_PROPERTY","INDEXPROPERTY","OBJECT_DEFINITION","OBJECT_ID","OBJECT_NAME","OBJECT_SCHEMA_NAME","OBJECTPROPERTY","OBJECTPROPERTYEX","ORIGINAL_DB_NAME","PARSENAME","SCHEMA_ID","SCHEMA_NAME","SCOPE_IDENTITY","SERVERPROPERTY","STATS_DATE","TYPE_ID","TYPE_NAME","TYPEPROPERTY","DENSE_RANK","NTILE","RANK","ROW_NUMBER","PUBLISHINGSERVERNAME","OPENDATASOURCE","OPENQUERY","OPENROWSET","OPENXML","CERTENCODED","CERTPRIVATEKEY","CURRENT_USER","HAS_DBACCESS","HAS_PERMS_BY_NAME","IS_MEMBER","IS_ROLEMEMBER","IS_SRVROLEMEMBER","LOGINPROPERTY","ORIGINAL_LOGIN","PERMISSIONS","PWDENCRYPT","PWDCOMPARE","SESSION_USER","SESSIONPROPERTY","SUSER_ID","SUSER_NAME","SUSER_SID","SUSER_SNAME","SYSTEM_USER","USER","USER_ID","USER_NAME","ASCII","CHAR","CHARINDEX","CONCAT","DIFFERENCE","FORMAT","LEFT","LEN","LOWER","LTRIM","NCHAR","PATINDEX","QUOTENAME","REPLACE","REPLICATE","REVERSE","RIGHT","RTRIM","SOUNDEX","SPACE","STR","STUFF","SUBSTRING","UNICODE","UPPER","BINARY_CHECKSUM","CHECKSUM","CONNECTIONPROPERTY","CONTEXT_INFO","CURRENT_REQUEST_ID","ERROR_LINE","ERROR_NUMBER","ERROR_MESSAGE","ERROR_PROCEDURE","ERROR_SEVERITY","ERROR_STATE","FORMATMESSAGE","GETANSINULL","GET_FILESTREAM_TRANSACTION_CONTEXT","HOST_ID","HOST_NAME","ISNULL","ISNUMERIC","MIN_ACTIVE_ROWVERSION","NEWID","NEWSEQUENTIALID","ROWCOUNT_BIG","XACT_STATE","TEXTPTR","TEXTVALID","COLUMNS_UPDATED","EVENTDATA","TRIGGER_NESTLEVEL","UPDATE","CHANGETABLE","CHANGE_TRACKING_CONTEXT","CHANGE_TRACKING_CURRENT_VERSION","CHANGE_TRACKING_IS_COLUMN_IN_MASK","CHANGE_TRACKING_MIN_VALID_VERSION","CONTAINSTABLE","FREETEXTTABLE","SEMANTICKEYPHRASETABLE","SEMANTICSIMILARITYDETAILSTABLE","SEMANTICSIMILARITYTABLE","FILETABLEROOTPATH","GETFILENAMESPACEPATH","GETPATHLOCATOR","PATHNAME","GET_TRANSMISSION_STATUS"],builtinVariables:["@@DATEFIRST","@@DBTS","@@LANGID","@@LANGUAGE","@@LOCK_TIMEOUT","@@MAX_CONNECTIONS","@@MAX_PRECISION","@@NESTLEVEL","@@OPTIONS","@@REMSERVER","@@SERVERNAME","@@SERVICENAME","@@SPID","@@TEXTSIZE","@@VERSION","@@CURSOR_ROWS","@@FETCH_STATUS","@@DATEFIRST","@@PROCID","@@ERROR","@@IDENTITY","@@ROWCOUNT","@@TRANCOUNT","@@CONNECTIONS","@@CPU_BUSY","@@IDLE","@@IO_BUSY","@@PACKET_ERRORS","@@PACK_RECEIVED","@@PACK_SENT","@@TIMETICKS","@@TOTAL_ERRORS","@@TOTAL_READ","@@TOTAL_WRITE"],pseudoColumns:["$ACTION","$IDENTITY","$ROWGUID","$PARTITION"],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/N'/,{token:"string",next:"@string"}],[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/\[/,{token:"identifier.quote",next:"@bracketedIdentifier"}],[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],bracketedIdentifier:[[/[^\]]+/,"identifier"],[/]]/,"identifier"],[/]/,{token:"identifier.quote",next:"@pop"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[[/BEGIN\s+(DISTRIBUTED\s+)?TRAN(SACTION)?\b/i,"keyword"],[/BEGIN\s+TRY\b/i,{token:"keyword.try"}],[/END\s+TRY\b/i,{token:"keyword.try"}],[/BEGIN\s+CATCH\b/i,{token:"keyword.catch"}],[/END\s+CATCH\b/i,{token:"keyword.catch"}],[/(BEGIN|CASE)\b/i,{token:"keyword.block"}],[/END\b/i,{token:"keyword.block"}],[/WHEN\b/i,{token:"keyword.choice"}],[/THEN\b/i,{token:"keyword.choice"}]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/st/st.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/st/st.js new file mode 100644 index 0000000000..ffb986ffb9 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/st/st.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/st/st",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["var","end_var"],["var_input","end_var"],["var_output","end_var"],["var_in_out","end_var"],["var_temp","end_var"],["var_global","end_var"],["var_access","end_var"],["var_external","end_var"],["type","end_type"],["struct","end_struct"],["program","end_program"],["function","end_function"],["function_block","end_function_block"],["action","end_action"],["step","end_step"],["initial_step","end_step"],["transaction","end_transaction"],["configuration","end_configuration"],["tcp","end_tcp"],["recource","end_recource"],["channel","end_channel"],["library","end_library"],["folder","end_folder"],["binaries","end_binaries"],["includes","end_includes"],["sources","end_sources"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"/*",close:"*/"},{open:"'",close:"'",notIn:["string_sq"]},{open:'"',close:'"',notIn:["string_dq"]},{open:"var_input",close:"end_var"},{open:"var_output",close:"end_var"},{open:"var_in_out",close:"end_var"},{open:"var_temp",close:"end_var"},{open:"var_global",close:"end_var"},{open:"var_access",close:"end_var"},{open:"var_external",close:"end_var"},{open:"type",close:"end_type"},{open:"struct",close:"end_struct"},{open:"program",close:"end_program"},{open:"function",close:"end_function"},{open:"function_block",close:"end_function_block"},{open:"action",close:"end_action"},{open:"step",close:"end_step"},{open:"initial_step",close:"end_step"},{open:"transaction",close:"end_transaction"},{open:"configuration",close:"end_configuration"},{open:"tcp",close:"end_tcp"},{open:"recource",close:"end_recource"},{open:"channel",close:"end_channel"},{open:"library",close:"end_library"},{open:"folder",close:"end_folder"},{open:"binaries",close:"end_binaries"},{open:"includes",close:"end_includes"},{open:"sources",close:"end_sources"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"var",close:"end_var"},{open:"var_input",close:"end_var"},{open:"var_output",close:"end_var"},{open:"var_in_out",close:"end_var"},{open:"var_temp",close:"end_var"},{open:"var_global",close:"end_var"},{open:"var_access",close:"end_var"},{open:"var_external",close:"end_var"},{open:"type",close:"end_type"},{open:"struct",close:"end_struct"},{open:"program",close:"end_program"},{open:"function",close:"end_function"},{open:"function_block",close:"end_function_block"},{open:"action",close:"end_action"},{open:"step",close:"end_step"},{open:"initial_step",close:"end_step"},{open:"transaction",close:"end_transaction"},{open:"configuration",close:"end_configuration"},{open:"tcp",close:"end_tcp"},{open:"recource",close:"end_recource"},{open:"channel",close:"end_channel"},{open:"library",close:"end_library"},{open:"folder",close:"end_folder"},{open:"binaries",close:"end_binaries"},{open:"includes",close:"end_includes"},{open:"sources",close:"end_sources"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},n.language={defaultToken:"",tokenPostfix:".st",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["if","end_if","elsif","else","case","of","to","__try","__catch","__finally","do","with","by","while","repeat","end_while","end_repeat","end_case","for","end_for","task","retain","non_retain","constant","with","at","exit","return","interval","priority","address","port","on_channel","then","iec","file","uses","version","packagetype","displayname","copyright","summary","vendor","common_source","from","extends"],constant:["false","true","null"],defineKeywords:["var","var_input","var_output","var_in_out","var_temp","var_global","var_access","var_external","end_var","type","end_type","struct","end_struct","program","end_program","function","end_function","function_block","end_function_block","interface","end_interface","method","end_method","property","end_property","namespace","end_namespace","configuration","end_configuration","tcp","end_tcp","resource","end_resource","channel","end_channel","library","end_library","folder","end_folder","binaries","end_binaries","includes","end_includes","sources","end_sources","action","end_action","step","initial_step","end_step","transaction","end_transaction"],typeKeywords:["int","sint","dint","lint","usint","uint","udint","ulint","real","lreal","time","date","time_of_day","date_and_time","string","bool","byte","word","dword","array","pointer","lword"],operators:["=",">","<",":",":=","<=",">=","<>","&","+","-","*","**","MOD","^","or","and","not","xor","abs","acos","asin","atan","cos","exp","expt","ln","log","sin","sqrt","tan","sel","max","min","limit","mux","shl","shr","rol","ror","indexof","sizeof","adr","adrinst","bitadr","is_valid","ref","ref_to"],builtinVariables:[],builtinFunctions:["sr","rs","tp","ton","tof","eq","ge","le","lt","ne","round","trunc","ctd","сtu","ctud","r_trig","f_trig","move","concat","delete","find","insert","left","len","replace","right","rtc"],symbols:/[=>`?!+*\\\/]/,operatorstart:/[\/=\-+!*%<>&|^~?\u00A1-\u00A7\u00A9\u00AB\u00AC\u00AE\u00B0-\u00B1\u00B6\u00BB\u00BF\u00D7\u00F7\u2016-\u2017\u2020-\u2027\u2030-\u203E\u2041-\u2053\u2055-\u205E\u2190-\u23FF\u2500-\u2775\u2794-\u2BFF\u2E00-\u2E7F\u3001-\u3003\u3008-\u3030]/,operatorend:/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE00-\uFE0F\uFE20-\uFE2F\uE0100-\uE01EF]/,operators:/(@operatorstart)((@operatorstart)|(@operatorend))*/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},{include:"@attribute"},{include:"@literal"},{include:"@keyword"},{include:"@invokedmethod"},{include:"@symbol"}],whitespace:[[/\s+/,"white"],[/"""/,"string.quote","@endDblDocString"]],endDblDocString:[[/[^"]+/,"string"],[/\\"/,"string"],[/"""/,"string.quote","@popall"],[/"/,"string"]],symbol:[[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/[.]/,"delimiter"],[/@operators/,"operator"],[/@symbols/,"operator"]],comment:[[/\/\/\/.*$/,"comment.doc"],[/\/\*\*/,"comment.doc","@commentdocbody"],[/\/\/.*$/,"comment"],[/\/\*/,"comment","@commentbody"]],commentdocbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment.doc","@pop"],[/\:[a-zA-Z]+\:/,"comment.doc.param"],[/./,"comment.doc"]],commentbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment","@pop"],[/./,"comment"]],attribute:[[/\@@identifier/,{cases:{"@attributes":"keyword.control","@default":""}}]],literal:[[/"/,{token:"string.quote",next:"@stringlit"}],[/0[b]([01]_?)+/,"number.binary"],[/0[o]([0-7]_?)+/,"number.octal"],[/0[x]([0-9a-fA-F]_?)+([pP][\-+](\d_?)+)?/,"number.hex"],[/(\d_?)*\.(\d_?)+([eE][\-+]?(\d_?)+)?/,"number.float"],[/(\d_?)+/,"number"]],stringlit:[[/\\\(/,{token:"operator",next:"@interpolatedexpression"}],[/@escapes/,"string"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}],[/./,"string"]],interpolatedexpression:[[/\(/,{token:"operator",next:"@interpolatedexpression"}],[/\)/,{token:"operator",next:"@pop"}],{include:"@literal"},{include:"@keyword"},{include:"@symbol"}],keyword:[[/`/,{token:"operator",next:"@escapedkeyword"}],[/@identifier/,{cases:{"@keywords":"keyword","[A-Z][a-zA-Z0-9$]*":"type.identifier","@default":"identifier"}}]],escapedkeyword:[[/`/,{token:"operator",next:"@pop"}],[/./,"identifier"]],invokedmethod:[[/([.])(@identifier)/,{cases:{$2:["delimeter","type.identifier"],"@default":""}}]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js new file mode 100644 index 0000000000..1e107cd4ef --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/systemverilog/systemverilog",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["begin","end"],["case","endcase"],["casex","endcase"],["casez","endcase"],["checker","endchecker"],["class","endclass"],["clocking","endclocking"],["config","endconfig"],["function","endfunction"],["generate","endgenerate"],["group","endgroup"],["interface","endinterface"],["module","endmodule"],["package","endpackage"],["primitive","endprimitive"],["program","endprogram"],["property","endproperty"],["specify","endspecify"],["sequence","endsequence"],["table","endtable"],["task","endtask"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{offSide:!1,markers:{start:new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:begin|case(x|z)?|class|clocking|config|covergroup|function|generate|interface|module|package|primitive|property|program|sequence|specify|table|task)\\b"),end:new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:end|endcase|endclass|endclocking|endconfig|endgroup|endfunction|endgenerate|endinterface|endmodule|endpackage|endprimitive|endproperty|endprogram|endsequence|endspecify|endtable|endtask)\\b")}}},n.language={defaultToken:"",tokenPostfix:".sv",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["accept_on","alias","always","always_comb","always_ff","always_latch","and","assert","assign","assume","automatic","before","begin","bind","bins","binsof","bit","break","buf","bufif0","bufif1","byte","case","casex","casez","cell","chandle","checker","class","clocking","cmos","config","const","constraint","context","continue","cover","covergroup","coverpoint","cross","deassign","default","defparam","design","disable","dist","do","edge","else","end","endcase","endchecker","endclass","endclocking","endconfig","endfunction","endgenerate","endgroup","endinterface","endmodule","endpackage","endprimitive","endprogram","endproperty","endspecify","endsequence","endtable","endtask","enum","event","eventually","expect","export","extends","extern","final","first_match","for","force","foreach","forever","fork","forkjoin","function","generate","genvar","global","highz0","highz1","if","iff","ifnone","ignore_bins","illegal_bins","implements","implies","import","incdir","include","initial","inout","input","inside","instance","int","integer","interconnect","interface","intersect","join","join_any","join_none","large","let","liblist","library","local","localparam","logic","longint","macromodule","matches","medium","modport","module","nand","negedge","nettype","new","nexttime","nmos","nor","noshowcancelled","not","notif0","notif1","null","or","output","package","packed","parameter","pmos","posedge","primitive","priority","program","property","protected","pull0","pull1","pulldown","pullup","pulsestyle_ondetect","pulsestyle_onevent","pure","rand","randc","randcase","randsequence","rcmos","real","realtime","ref","reg","reject_on","release","repeat","restrict","return","rnmos","rpmos","rtran","rtranif0","rtranif1","s_always","s_eventually","s_nexttime","s_until","s_until_with","scalared","sequence","shortint","shortreal","showcancelled","signed","small","soft","solve","specify","specparam","static","string","strong","strong0","strong1","struct","super","supply0","supply1","sync_accept_on","sync_reject_on","table","tagged","task","this","throughout","time","timeprecision","timeunit","tran","tranif0","tranif1","tri","tri0","tri1","triand","trior","trireg","type","typedef","union","unique","unique0","unsigned","until","until_with","untyped","use","uwire","var","vectored","virtual","void","wait","wait_order","wand","weak","weak0","weak1","while","wildcard","wire","with","within","wor","xnor","xor"],builtin_gates:["and","nand","nor","or","xor","xnor","buf","not","bufif0","bufif1","notif1","notif0","cmos","nmos","pmos","rcmos","rnmos","rpmos","tran","tranif1","tranif0","rtran","rtranif1","rtranif0"],operators:["=","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>+","<<<=",">>>=","?",":","+","-","!","~","&","~&","|","~|","^","~^","^~","+","-","*","/","%","==","!=","===","!==","==?","!=?","&&","||","**","<","<=",">",">=","&","|","^",">>","<<",">>>","<<<","++","--","->","<->","inside","dist","::","+:","-:","*>","&&&","|->","|=>","#=#"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],{include:"@numbers"},[/[;,.]/,"delimiter"],{include:"@strings"}],identifier_or_keyword:[[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}]],numbers:[[/\d+?[\d_]*(?:\.[\d_]+)?[eE][\-+]?\d+/,"number.float"],[/\d+?[\d_]*\.[\d_]+(?:\s*@timeunits)?/,"number.float"],[/(?:\d+?[\d_]*\s*)?'[sS]?[dD]\s*[0-9xXzZ?]+?[0-9xXzZ?_]*/,"number"],[/(?:\d+?[\d_]*\s*)?'[sS]?[bB]\s*[0-1xXzZ?]+?[0-1xXzZ?_]*/,"number.binary"],[/(?:\d+?[\d_]*\s*)?'[sS]?[oO]\s*[0-7xXzZ?]+?[0-7xXzZ?_]*/,"number.octal"],[/(?:\d+?[\d_]*\s*)?'[sS]?[hH]\s*[0-9a-fA-FxXzZ?]+?[0-9a-fA-FxXzZ?_]*/,"number.hex"],[/1step/,"number"],[/[\dxXzZ]+?[\dxXzZ_]*(?:\s*@timeunits)?/,"number"],[/'[01xXzZ]+/,"number"]],module_instance:[{include:"@whitespace"},[/(#?)(\()/,["",{token:"@brackets",next:"@port_connection"}]],[/@identifier\s*[;={}\[\],]/,{token:"@rematch",next:"@pop"}],[/@symbols|[;={}\[\],]/,{token:"@rematch",next:"@pop"}],[/@identifier/,"type"],[/;/,"delimiter","@pop"]],port_connection:[{include:"@identifier_or_keyword"},{include:"@whitespace"},[/@systemcall/,"variable.predefined"],{include:"@numbers"},{include:"@strings"},[/[,]/,"delimiter"],[/\(/,"@brackets","@port_connection"],[/\)/,"@brackets","@pop"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],strings:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],include:[[/(\s*)(")([\w*\/*]*)(.\w*)(")/,["","string.include.identifier","string.include.identifier","string.include.identifier",{token:"string.include.identifier",next:"@pop"}]],[/(\s*)(<)([\w*\/*]*)(.\w*)(>)/,["","string.include.identifier","string.include.identifier","string.include.identifier",{token:"string.include.identifier",next:"@pop"}]]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/tcl/tcl.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/tcl/tcl.js new file mode 100644 index 0000000000..a00f67cdf8 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/tcl/tcl.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/tcl/tcl",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={tokenPostfix:".tcl",specialFunctions:["set","unset","rename","variable","proc","coroutine","foreach","incr","append","lappend","linsert","lreplace"],mainFunctions:["if","then","elseif","else","case","switch","while","for","break","continue","return","package","namespace","catch","exit","eval","expr","uplevel","upvar"],builtinFunctions:["file","info","concat","join","lindex","list","llength","lrange","lsearch","lsort","split","array","parray","binary","format","regexp","regsub","scan","string","subst","dict","cd","clock","exec","glob","pid","pwd","close","eof","fblocked","fconfigure","fcopy","fileevent","flush","gets","open","puts","read","seek","socket","tell","interp","after","auto_execok","auto_load","auto_mkindex","auto_reset","bgerror","error","global","history","load","source","time","trace","unknown","unset","update","vwait","winfo","wm","bind","event","pack","place","grid","font","bell","clipboard","destroy","focus","grab","lower","option","raise","selection","send","tk","tkwait","tk_bisque","tk_focusNext","tk_focusPrev","tk_focusFollowsMouse","tk_popup","tk_setPalette"],symbols:/[=>\/\s]+)/g,comments:{blockComment:["{#","#}"]},brackets:[["{#","#}"],["{%","%}"],["{{","}}"],["(",")"],["[","]"],["\x3c!--","--\x3e"],["<",">"]],autoClosingPairs:[{open:"{# ",close:" #}"},{open:"{% ",close:" %}"},{open:"{{ ",close:" }}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}]},e.language={defaultToken:"",tokenPostfix:"",ignoreCase:!0,keywords:["apply","autoescape","block","deprecated","do","embed","extends","flush","for","from","if","import","include","macro","sandbox","set","use","verbatim","with","endapply","endautoescape","endblock","endembed","endfor","endif","endmacro","endsandbox","endset","endwith","true","false"],tokenizer:{root:[[/\s+/],[/{#/,"comment.twig","@commentState"],[/{%[-~]?/,"delimiter.twig","@blockState"],[/{{[-~]?/,"delimiter.twig","@variableState"],[/)/,["delimiter.html","tag.html","","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/|>=|<=/,"operators.twig"],[/(starts with|ends with|matches)(\s+)/,["operators.twig",""]],[/(in)(\s+)/,["operators.twig",""]],[/(is)(\s+)/,["operators.twig",""]],[/\||~|:|\.{1,2}|\?{1,2}/,"operators.twig"],[/[^\W\d][\w]*/,{cases:{"@keywords":"keyword.twig","@default":"variable.twig"}}],[/\d+(\.\d+)?/,"number.twig"],[/\(|\)|\[|\]|{|}|,/,"delimiter.twig"],[/"([^#"\\]*(?:\\.[^#"\\]*)*)"|\'([^\'\\]*(?:\\.[^\'\\]*)*)\'/,"string.twig"],[/"/,"string.twig","@stringState"],[/=>/,"operators.twig"],[/=/,"operators.twig"]],doctype:[[/[^>]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name.html","@scriptAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter.html","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name.html","@styleAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter.html","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js new file mode 100644 index 0000000000..42ccd45cc0 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/typescript/typescript",["require","exports","../fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:n.languages.IndentAction.IndentOutdent,appendText:" * "}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:n.languages.IndentAction.None,appendText:" * "}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:n.languages.IndentAction.None,appendText:"* "}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:n.languages.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],folding:{markers:{start:new RegExp("^\\s*//\\s*#?region\\b"),end:new RegExp("^\\s*//\\s*#?endregion\\b")}}},t.language={defaultToken:"invalid",tokenPostfix:".ts",keywords:["abstract","any","as","asserts","bigint","boolean","break","case","catch","class","continue","const","constructor","debugger","declare","default","delete","do","else","enum","export","extends","false","finally","for","from","function","get","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","null","number","object","package","private","protected","public","readonly","require","global","return","set","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield","async","await","of"],operators:["<=",">=","==","!=","===","!==","=>","+","-","**","*","/","%","++","--","<<",">",">>>","&","|","^","!","~","&&","||","??","?",":","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=","@"],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/`/,"string","@string_backtick"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([gimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],string_backtick:[[/\$\{/,{token:"delimiter.bracket",next:"@bracketCounting"}],[/[^\\`$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/`/,"string","@pop"]],bracketCounting:[[/\{/,"delimiter.bracket","@bracketCounting"],[/\}/,"delimiter.bracket","@pop"],{include:"common"}]}}})); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/vb/vb.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/vb/vb.js new file mode 100644 index 0000000000..e09b2f80dc --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/vb/vb.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/vb/vb",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"'",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"],["addhandler","end addhandler"],["class","end class"],["enum","end enum"],["event","end event"],["function","end function"],["get","end get"],["if","end if"],["interface","end interface"],["module","end module"],["namespace","end namespace"],["operator","end operator"],["property","end property"],["raiseevent","end raiseevent"],["removehandler","end removehandler"],["select","end select"],["set","end set"],["structure","end structure"],["sub","end sub"],["synclock","end synclock"],["try","end try"],["while","end while"],["with","end with"],["using","end using"],["do","loop"],["for","next"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"<",close:">",notIn:["string","comment"]}],folding:{markers:{start:new RegExp("^\\s*#Region\\b"),end:new RegExp("^\\s*#End Region\\b")}}},n.language={defaultToken:"",tokenPostfix:".vb",ignoreCase:!0,brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.angle",open:"<",close:">"},{token:"keyword.tag-addhandler",open:"addhandler",close:"end addhandler"},{token:"keyword.tag-class",open:"class",close:"end class"},{token:"keyword.tag-enum",open:"enum",close:"end enum"},{token:"keyword.tag-event",open:"event",close:"end event"},{token:"keyword.tag-function",open:"function",close:"end function"},{token:"keyword.tag-get",open:"get",close:"end get"},{token:"keyword.tag-if",open:"if",close:"end if"},{token:"keyword.tag-interface",open:"interface",close:"end interface"},{token:"keyword.tag-module",open:"module",close:"end module"},{token:"keyword.tag-namespace",open:"namespace",close:"end namespace"},{token:"keyword.tag-operator",open:"operator",close:"end operator"},{token:"keyword.tag-property",open:"property",close:"end property"},{token:"keyword.tag-raiseevent",open:"raiseevent",close:"end raiseevent"},{token:"keyword.tag-removehandler",open:"removehandler",close:"end removehandler"},{token:"keyword.tag-select",open:"select",close:"end select"},{token:"keyword.tag-set",open:"set",close:"end set"},{token:"keyword.tag-structure",open:"structure",close:"end structure"},{token:"keyword.tag-sub",open:"sub",close:"end sub"},{token:"keyword.tag-synclock",open:"synclock",close:"end synclock"},{token:"keyword.tag-try",open:"try",close:"end try"},{token:"keyword.tag-while",open:"while",close:"end while"},{token:"keyword.tag-with",open:"with",close:"end with"},{token:"keyword.tag-using",open:"using",close:"end using"},{token:"keyword.tag-do",open:"do",close:"loop"},{token:"keyword.tag-for",open:"for",close:"next"}],keywords:["AddHandler","AddressOf","Alias","And","AndAlso","As","Async","Boolean","ByRef","Byte","ByVal","Call","Case","Catch","CBool","CByte","CChar","CDate","CDbl","CDec","Char","CInt","Class","CLng","CObj","Const","Continue","CSByte","CShort","CSng","CStr","CType","CUInt","CULng","CUShort","Date","Decimal","Declare","Default","Delegate","Dim","DirectCast","Do","Double","Each","Else","ElseIf","End","EndIf","Enum","Erase","Error","Event","Exit","False","Finally","For","Friend","Function","Get","GetType","GetXMLNamespace","Global","GoSub","GoTo","Handles","If","Implements","Imports","In","Inherits","Integer","Interface","Is","IsNot","Let","Lib","Like","Long","Loop","Me","Mod","Module","MustInherit","MustOverride","MyBase","MyClass","NameOf","Namespace","Narrowing","New","Next","Not","Nothing","NotInheritable","NotOverridable","Object","Of","On","Operator","Option","Optional","Or","OrElse","Out","Overloads","Overridable","Overrides","ParamArray","Partial","Private","Property","Protected","Public","RaiseEvent","ReadOnly","ReDim","RemoveHandler","Resume","Return","SByte","Select","Set","Shadows","Shared","Short","Single","Static","Step","Stop","String","Structure","Sub","SyncLock","Then","Throw","To","True","Try","TryCast","TypeOf","UInteger","ULong","UShort","Using","Variant","Wend","When","While","Widening","With","WithEvents","WriteOnly","Xor"],tagwords:["If","Sub","Select","Try","Class","Enum","Function","Get","Interface","Module","Namespace","Operator","Set","Structure","Using","While","With","Do","Loop","For","Next","Property","Continue","AddHandler","RemoveHandler","Event","RaiseEvent","SyncLock"],symbols:/[=>"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],onEnterRules:[{beforeText:new RegExp("<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:n.languages.IndentAction.Indent}}]},t.language={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[/");y>=0&&(u.comment&&u.comment(a.substring(4,y)),a=a.substring(y+3),n=!1)}function _(){if(!!n){var y,L=a.indexOf("<");L>=0?(y=a.substring(0,L),a=a.substring(L)):(y=a,a=""),u.chars&&u.chars(y)}}function f(y,L,I,k){var E={},T=M(L),O=S.voids[T]||!!k;I.replace(g,A),O||r.push(T),u.start&&u.start(T,E,O);function A(B,F,D,R,W){D===void 0&&R===void 0&&W===void 0?E[F]=void 0:E[F]=N.decode(D||R||W||"")}}function v(y,L){var I,k=0,E=M(L);if(E)for(k=r.length-1;k>=0&&r[k]!==E;k--);if(k>=0){for(I=r.length-1;I>=k;I--)u.end&&u.end(r[I]);r.length=k}}}e.exports=s},{"./attributes":1,"./elements":3,"./lowercase":5,he:9}],8:[function(q,e,b){"use strict";var N=q("he"),M=q("./lowercase"),w=q("./attributes"),S=q("./elements");function C(d,g){var p,c,o=g||{};return l(),{start:a,end:u,chars:i};function s(h){d.push(h)}function a(h,m,_){var f=M(h);if(c.ignoring){n(f);return}if((o.allowedTags||[]).indexOf(f)===-1){n(f);return}if(o.filter&&!o.filter({tag:f,attrs:m})){n(f);return}s("<"),s(f),Object.keys(m).forEach(v),s(_?"/>":">");function v(y){var L=m[y],I=(o.allowedClasses||{})[f]||[],k=(o.allowedAttributes||{})[f]||[];k=k.concat((o.allowedAttributes||{})["*"]||[]);var E,T=M(y);T==="class"&&k.indexOf(T)===-1?(L=L.split(" ").filter(O).join(" ").trim(),E=L.length):E=k.indexOf(T)!==-1&&(w.uris[T]!==!0||r(L)),E&&(s(" "),s(y),typeof L=="string"&&(s('="'),s(N.encode(L)),s('"')));function O(A){return I&&I.indexOf(A)!==-1}}}function u(h){var m=M(h),_=(o.allowedTags||[]).indexOf(m)!==-1;_&&c.ignoring===!1?(s("")):t(m)}function r(h){var m=h[0];if(m==="#"||m==="/")return!0;var _=h.indexOf(":");if(_===-1)return!0;var f=h.indexOf("?");if(f!==-1&&_>f)return!0;var v=h.indexOf("#");if(v!==-1&&_>v)return!0;return o.allowedSchemes.some(y);function y(L){return h.indexOf(L+":")===0}}function i(h){c.ignoring===!1&&s(o.transformText?o.transformText(h):h)}function n(h){S.voids[h]||(c.ignoring===!1?c={ignoring:h,depth:1}:c.ignoring===h&&c.depth++)}function t(h){c.ignoring===h&&--c.depth<=0&&l()}function l(){c={ignoring:!1,depth:0}}}e.exports=C},{"./attributes":1,"./elements":3,"./lowercase":5,he:9}],9:[function(q,e,b){"use strict";var N={"&":"&","<":"<",">":">",'"':""","'":"'"},M={"&":"&","<":"<",">":">",""":'"',"'":"'"},w=/(&|<|>|"|')/g,S=/[&<>"']/g;function C(c){return N[c]}function d(c){return M[c]}function g(c){return c==null?"":String(c).replace(S,C)}function p(c){return c==null?"":String(c).replace(w,d)}g.options=p.options={},e.exports={encode:g,escape:g,decode:p,unescape:p,version:"1.0.0-browser"}},{}],10:[function(q,e,b){"use strict";function N(w){return w.reduce(M,{})}function M(w,S){return w[S]=!0,w}e.exports=N},{}]},{},[4]),define("vs/base/common/insane/insane",function(){return{insane:kt}}),define(Q[54],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Iterable=void 0;var b;(function(N){function M(h){return h&&typeof h=="object"&&typeof h[Symbol.iterator]=="function"}N.is=M;const w=Object.freeze([]);function S(){return w}N.empty=S;function*C(h){yield h}N.single=C;function d(h){return h||w}N.from=d;function g(h){return!h||h[Symbol.iterator]().next().done===!0}N.isEmpty=g;function p(h){return h[Symbol.iterator]().next().value}N.first=p;function c(h,m){for(const _ of h)if(m(_))return!0;return!1}N.some=c;function o(h,m){for(const _ of h)if(m(_))return _}N.find=o;function*s(h,m){for(const _ of h)m(_)&&(yield _)}N.filter=s;function*a(h,m){for(const _ of h)yield m(_)}N.map=a;function*u(...h){for(const m of h)for(const _ of m)yield _}N.concat=u;function*r(h){for(const m of h)for(const _ of m)yield _}N.concatNested=r;function i(h,m,_){let f=_;for(const v of h)f=m(f,v);return f}N.reduce=i;function*n(h,m,_=h.length){for(m<0&&(m+=h.length),_<0?_+=h.length:_>h.length&&(_=h.length);m<_;m++)yield h[m]}N.slice=n;function t(h,m=Number.POSITIVE_INFINITY){const _=[];if(m===0)return[_,h];const f=h[Symbol.iterator]();for(let v=0;vf===v){const f=h[Symbol.iterator](),v=m[Symbol.iterator]();for(;;){const y=f.next(),L=v.next();if(y.done!==L.done)return!1;if(y.done)return!0;if(!_(y.value,L.value))return!1}}N.equals=l})(b=e.Iterable||(e.Iterable={}))}),define(Q[39],J([0,1,12]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResolvedKeybinding=e.ResolvedKeybindingPart=e.ChordKeybinding=e.SimpleKeybinding=e.createSimpleKeybinding=e.createKeybinding=e.KeyChord=e.KeyCodeUtils=void 0;class N{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(r,i){this._keyCodeToStr[r]=i,this._strToKeyCode[i.toLowerCase()]=r}keyCodeToStr(r){return this._keyCodeToStr[r]}strToKeyCode(r){return this._strToKeyCode[r.toLowerCase()]||0}}const M=new N,w=new N,S=new N;(function(){function u(r,i,n=i,t=n){M.define(r,i),w.define(r,n),S.define(r,t)}u(0,"unknown"),u(1,"Backspace"),u(2,"Tab"),u(3,"Enter"),u(4,"Shift"),u(5,"Ctrl"),u(6,"Alt"),u(7,"PauseBreak"),u(8,"CapsLock"),u(9,"Escape"),u(10,"Space"),u(11,"PageUp"),u(12,"PageDown"),u(13,"End"),u(14,"Home"),u(15,"LeftArrow","Left"),u(16,"UpArrow","Up"),u(17,"RightArrow","Right"),u(18,"DownArrow","Down"),u(19,"Insert"),u(20,"Delete"),u(21,"0"),u(22,"1"),u(23,"2"),u(24,"3"),u(25,"4"),u(26,"5"),u(27,"6"),u(28,"7"),u(29,"8"),u(30,"9"),u(31,"A"),u(32,"B"),u(33,"C"),u(34,"D"),u(35,"E"),u(36,"F"),u(37,"G"),u(38,"H"),u(39,"I"),u(40,"J"),u(41,"K"),u(42,"L"),u(43,"M"),u(44,"N"),u(45,"O"),u(46,"P"),u(47,"Q"),u(48,"R"),u(49,"S"),u(50,"T"),u(51,"U"),u(52,"V"),u(53,"W"),u(54,"X"),u(55,"Y"),u(56,"Z"),u(57,"Meta"),u(58,"ContextMenu"),u(59,"F1"),u(60,"F2"),u(61,"F3"),u(62,"F4"),u(63,"F5"),u(64,"F6"),u(65,"F7"),u(66,"F8"),u(67,"F9"),u(68,"F10"),u(69,"F11"),u(70,"F12"),u(71,"F13"),u(72,"F14"),u(73,"F15"),u(74,"F16"),u(75,"F17"),u(76,"F18"),u(77,"F19"),u(78,"NumLock"),u(79,"ScrollLock"),u(80,";",";","OEM_1"),u(81,"=","=","OEM_PLUS"),u(82,",",",","OEM_COMMA"),u(83,"-","-","OEM_MINUS"),u(84,".",".","OEM_PERIOD"),u(85,"/","/","OEM_2"),u(86,"`","`","OEM_3"),u(110,"ABNT_C1"),u(111,"ABNT_C2"),u(87,"[","[","OEM_4"),u(88,"\\","\\","OEM_5"),u(89,"]","]","OEM_6"),u(90,"'","'","OEM_7"),u(91,"OEM_8"),u(92,"OEM_102"),u(93,"NumPad0"),u(94,"NumPad1"),u(95,"NumPad2"),u(96,"NumPad3"),u(97,"NumPad4"),u(98,"NumPad5"),u(99,"NumPad6"),u(100,"NumPad7"),u(101,"NumPad8"),u(102,"NumPad9"),u(103,"NumPad_Multiply"),u(104,"NumPad_Add"),u(105,"NumPad_Separator"),u(106,"NumPad_Subtract"),u(107,"NumPad_Decimal"),u(108,"NumPad_Divide")})();var C;(function(u){function r(h){return M.keyCodeToStr(h)}u.toString=r;function i(h){return M.strToKeyCode(h)}u.fromString=i;function n(h){return w.keyCodeToStr(h)}u.toUserSettingsUS=n;function t(h){return S.keyCodeToStr(h)}u.toUserSettingsGeneral=t;function l(h){return w.strToKeyCode(h)||S.strToKeyCode(h)}u.fromUserSettings=l})(C=e.KeyCodeUtils||(e.KeyCodeUtils={}));function d(u,r){const i=(r&65535)<<16>>>0;return(u|i)>>>0}e.KeyChord=d;function g(u,r){if(u===0)return null;const i=(u&65535)>>>0,n=(u&4294901760)>>>16;return n!==0?new o([p(i,r),p(n,r)]):new o([p(i,r)])}e.createKeybinding=g;function p(u,r){const i=!!(u&2048),n=!!(u&256),t=r===2?n:i,l=!!(u&1024),h=!!(u&512),m=r===2?i:n,_=u&255;return new c(t,l,h,m,_)}e.createSimpleKeybinding=p;class c{constructor(r,i,n,t,l){this.ctrlKey=r,this.shiftKey=i,this.altKey=n,this.metaKey=t,this.keyCode=l}equals(r){return this.ctrlKey===r.ctrlKey&&this.shiftKey===r.shiftKey&&this.altKey===r.altKey&&this.metaKey===r.metaKey&&this.keyCode===r.keyCode}isModifierKey(){return this.keyCode===0||this.keyCode===5||this.keyCode===57||this.keyCode===6||this.keyCode===4}toChord(){return new o([this])}isDuplicateModifierCase(){return this.ctrlKey&&this.keyCode===5||this.shiftKey&&this.keyCode===4||this.altKey&&this.keyCode===6||this.metaKey&&this.keyCode===57}}e.SimpleKeybinding=c;class o{constructor(r){if(r.length===0)throw b.illegalArgument("parts");this.parts=r}}e.ChordKeybinding=o;class s{constructor(r,i,n,t,l,h){this.ctrlKey=r,this.shiftKey=i,this.altKey=n,this.metaKey=t,this.keyLabel=l,this.keyAriaLabel=h}}e.ResolvedKeybindingPart=s;class a{}e.ResolvedKeybinding=a}),define(Q[150],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Lazy=void 0;class b{constructor(M){this.executor=M,this._didRun=!1}getValue(){if(!this._didRun)try{this._value=this.executor()}catch(M){this._error=M}finally{this._didRun=!0}if(this._error)throw this._error;return this._value}get rawValue(){return this._value}}e.Lazy=b}),define(Q[2],J([0,1,54]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ImmortalReference=e.MutableDisposable=e.Disposable=e.DisposableStore=e.toDisposable=e.combinedDisposable=e.dispose=e.isDisposable=e.MultiDisposeError=e.trackDisposable=void 0;const N=!1;let M=null;if(N){const r="__is_disposable_tracked__";M=new class{trackDisposable(i){const n=new Error("Potentially leaked disposable").stack;setTimeout(()=>{i[r]||console.log(n)},3e3)}markTracked(i){if(i&&i!==s.None)try{i[r]=!0}catch(n){}}}}function w(r){!M||M.markTracked(r)}function S(r){return M&&M.trackDisposable(r),r}e.trackDisposable=S;class C extends Error{constructor(i){super(`Encountered errors while disposing of store. Errors: [${i.join(", ")}]`);this.errors=i}}e.MultiDisposeError=C;function d(r){return typeof r.dispose=="function"&&r.dispose.length===0}e.isDisposable=d;function g(r){if(b.Iterable.is(r)){let i=[];for(const n of r)if(n){w(n);try{n.dispose()}catch(t){i.push(t)}}if(i.length===1)throw i[0];if(i.length>1)throw new C(i);return Array.isArray(r)?[]:r}else if(r)return w(r),r.dispose(),r}e.dispose=g;function p(...r){return r.forEach(w),c(()=>g(r))}e.combinedDisposable=p;function c(r){const i=S({dispose:()=>{w(i),r()}});return i}e.toDisposable=c;class o{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(w(this),this._isDisposed=!0,this.clear())}clear(){try{g(this._toDispose.values())}finally{this._toDispose.clear()}}add(i){if(!i)return i;if(i===this)throw new Error("Cannot register a disposable on itself!");return w(i),this._isDisposed?o.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(i),i}}e.DisposableStore=o,o.DISABLE_DISPOSED_WARNING=!1;class s{constructor(){this._store=new o,S(this)}dispose(){w(this),this._store.dispose()}_register(i){if(i===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(i)}}e.Disposable=s,s.None=Object.freeze({dispose(){}});class a{constructor(){this._isDisposed=!1,S(this)}get value(){return this._isDisposed?void 0:this._value}set value(i){var n;this._isDisposed||i===this._value||((n=this._value)===null||n===void 0||n.dispose(),i&&w(i),this._value=i)}clear(){this.value=void 0}dispose(){var i;this._isDisposed=!0,w(this),(i=this._value)===null||i===void 0||i.dispose(),this._value=void 0}}e.MutableDisposable=a;class u{constructor(i){this.object=i}dispose(){}}e.ImmortalReference=u}),define(Q[71],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinkedList=void 0;class b{constructor(w){this.element=w,this.next=b.Undefined,this.prev=b.Undefined}}b.Undefined=new b(void 0);class N{constructor(){this._first=b.Undefined,this._last=b.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===b.Undefined}clear(){this._first=b.Undefined,this._last=b.Undefined,this._size=0}unshift(w){return this._insert(w,!1)}push(w){return this._insert(w,!0)}_insert(w,S){const C=new b(w);if(this._first===b.Undefined)this._first=C,this._last=C;else if(S){const g=this._last;this._last=C,C.prev=g,g.next=C}else{const g=this._first;this._first=C,C.next=g,g.prev=C}this._size+=1;let d=!1;return()=>{d||(d=!0,this._remove(C))}}shift(){if(this._first!==b.Undefined){const w=this._first.element;return this._remove(this._first),w}}pop(){if(this._last!==b.Undefined){const w=this._last.element;return this._remove(this._last),w}}_remove(w){if(w.prev!==b.Undefined&&w.next!==b.Undefined){const S=w.prev;S.next=w.next,w.next.prev=S}else w.prev===b.Undefined&&w.next===b.Undefined?(this._first=b.Undefined,this._last=b.Undefined):w.next===b.Undefined?(this._last=this._last.prev,this._last.next=b.Undefined):w.prev===b.Undefined&&(this._first=this._first.next,this._first.prev=b.Undefined);this._size-=1}*[Symbol.iterator](){let w=this._first;for(;w!==b.Undefined;)yield w.element,w=w.next}}e.LinkedList=N}),function(q,e){typeof exports=="object"&&typeof module!="undefined"?module.exports=e():typeof define=="function"&&define.amd?define("vs/base/common/marked/marked",e):(q=typeof globalThis!="undefined"?globalThis:q||self,q.marked=e())}(this,function(){"use strict";function q(Se,we){for(var ye=0;yeSe.length)&&(we=Se.length);for(var ye=0,fe=new Array(we);ye=Se.length?{done:!0}:{done:!1,value:Se[fe++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}return ye=Se[Symbol.iterator](),ye.next.bind(ye)}function w(Se){var we={exports:{}};return Se(we,we.exports),we.exports}var S=w(function(Se){function we(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}function ye(fe){Se.exports.defaults=fe}Se.exports={defaults:we(),getDefaults:we,changeDefaults:ye}}),C=/[&<>"']/,d=/[&<>"']/g,g=/[<>"']|&(?!#?\w+;)/,p=/[<>"']|&(?!#?\w+;)/g,c={"&":"&","<":"<",">":">",'"':""","'":"'"},o=function(we){return c[we]};function s(Se,we){if(we){if(C.test(Se))return Se.replace(d,o)}else if(g.test(Se))return Se.replace(p,o);return Se}var a=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function u(Se){return Se.replace(a,function(we,ye){return ye=ye.toLowerCase(),ye==="colon"?":":ye.charAt(0)==="#"?ye.charAt(1)==="x"?String.fromCharCode(parseInt(ye.substring(2),16)):String.fromCharCode(+ye.substring(1)):""})}var r=/(^|[^\[])\^/g;function i(Se,we){Se=Se.source||Se,we=we||"";var ye={replace:function(de,ge){return ge=ge.source||ge,ge=ge.replace(r,"$1"),Se=Se.replace(de,ge),ye},getRegex:function(){return new RegExp(Se,we)}};return ye}var n=/[^\w:]/g,t=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function l(Se,we,ye){if(Se){var fe;try{fe=decodeURIComponent(u(ye)).replace(n,"").toLowerCase()}catch(de){return null}if(fe.indexOf("javascript:")===0||fe.indexOf("vbscript:")===0||fe.indexOf("data:")===0)return null}we&&!t.test(ye)&&(ye=v(we,ye));try{ye=encodeURI(ye).replace(/%25/g,"%")}catch(de){return null}return ye}var h={},m=/^[^:]+:\/*[^/]*$/,_=/^([^:]+:)[\s\S]*$/,f=/^([^:]+:\/*[^/]*)[\s\S]*$/;function v(Se,we){h[" "+Se]||(m.test(Se)?h[" "+Se]=Se+"/":h[" "+Se]=k(Se,"/",!0)),Se=h[" "+Se];var ye=Se.indexOf(":")===-1;return we.substring(0,2)==="//"?ye?we:Se.replace(_,"$1")+we:we.charAt(0)==="/"?ye?we:Se.replace(f,"$1")+we:Se+we}var y={exec:function(){}};function L(Se){for(var we=1,ye,fe;we=0&&ve[Ne]==="\\";)ke=!ke;return ke?"|":" |"}),fe=ye.split(/ \|/),de=0;if(fe.length>we)fe.splice(we);else for(;fe.length1;)we&1&&(ye+=Se),we>>=1,Se+=Se;return ye+Se}var A={escape:s,unescape:u,edit:i,cleanUrl:l,resolveUrl:v,noopTest:y,merge:L,splitCells:I,rtrim:k,findClosingBracket:E,checkSanitizeDeprecation:T,repeatString:O},B=S.defaults,F=A.rtrim,D=A.splitCells,R=A.escape,W=A.findClosingBracket;function x(Se,we,ye){var fe=we.href,de=we.title?R(we.title):null,ge=Se[1].replace(/\\([\[\]])/g,"$1");return Se[0].charAt(0)!=="!"?{type:"link",raw:ye,href:fe,title:de,text:ge}:{type:"image",raw:ye,href:fe,title:de,text:R(ge)}}function K(Se,we){var ye=Se.match(/^(\s+)(?:```)/);if(ye===null)return we;var fe=ye[1];return we.split(` +`).map(function(de){var ge=de.match(/^\s+/);if(ge===null)return de;var pe=ge[0];return pe.length>=fe.length?de.slice(fe.length):de}).join(` +`)}var Y=function(){function Se(ye){this.options=ye||B}var we=Se.prototype;return we.space=function(fe){var de=this.rules.block.newline.exec(fe);if(de)return de[0].length>1?{type:"space",raw:de[0]}:{raw:` +`}},we.code=function(fe){var de=this.rules.block.code.exec(fe);if(de){var ge=de[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:de[0],codeBlockStyle:"indented",text:this.options.pedantic?ge:F(ge,` +`)}}},we.fences=function(fe){var de=this.rules.block.fences.exec(fe);if(de){var ge=de[0],pe=K(ge,de[3]||"");return{type:"code",raw:ge,lang:de[2]?de[2].trim():de[2],text:pe}}},we.heading=function(fe){var de=this.rules.block.heading.exec(fe);if(de){var ge=de[2].trim();if(/#$/.test(ge)){var pe=F(ge,"#");(this.options.pedantic||!pe||/ $/.test(pe))&&(ge=pe.trim())}return{type:"heading",raw:de[0],depth:de[1].length,text:ge}}},we.nptable=function(fe){var de=this.rules.block.nptable.exec(fe);if(de){var ge={type:"table",header:D(de[1].replace(/^ *| *\| *$/g,"")),align:de[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:de[3]?de[3].replace(/\n$/,"").split(` +`):[],raw:de[0]};if(ge.header.length===ge.align.length){var pe=ge.align.length,ve;for(ve=0;ve ?/gm,"");return{type:"blockquote",raw:de[0],text:ge}}},we.list=function(fe){var de=this.rules.block.list.exec(fe);if(de){var ge=de[0],pe=de[2],ve=pe.length>1,ke={type:"list",raw:ge,ordered:ve,start:ve?+pe.slice(0,-1):"",loose:!1,items:[]},Ne=de[0].match(this.rules.block.item),Te=!1,Oe,Fe,Pe,xe,We,ze,Ke,Be,He=Ne.length;Pe=this.rules.block.listItemStart.exec(Ne[0]);for(var Ve=0;VePe[1].length:xe[1].length>Pe[0].length||xe[1].length>3){Ne.splice(Ve,2,Ne[Ve]+` +`+Ne[Ve+1]),Ve--,He--;continue}else(!this.options.pedantic||this.options.smartLists?xe[2][xe[2].length-1]!==pe[pe.length-1]:ve===(xe[2].length===1))&&(We=Ne.slice(Ve+1).join(` +`),ke.raw=ke.raw.substring(0,ke.raw.length-We.length),Ve=He-1);Pe=xe}Fe=Oe.length,Oe=Oe.replace(/^ *([*+-]|\d+[.)]) ?/,""),~Oe.indexOf(` + `)&&(Fe-=Oe.length,Oe=this.options.pedantic?Oe.replace(/^ {1,4}/gm,""):Oe.replace(new RegExp("^ {1,"+Fe+"}","gm"),"")),ze=Te||/\n\n(?!\s*$)/.test(Oe),Ve!==He-1&&(Te=Oe.charAt(Oe.length-1)===` +`,ze||(ze=Te)),ze&&(ke.loose=!0),this.options.gfm&&(Ke=/^\[[ xX]\] /.test(Oe),Be=void 0,Ke&&(Be=Oe[1]!==" ",Oe=Oe.replace(/^\[[ xX]\] +/,""))),ke.items.push({type:"list_item",raw:ge,task:Ke,checked:Be,loose:ze,text:Oe})}return ke}},we.html=function(fe){var de=this.rules.block.html.exec(fe);if(de)return{type:this.options.sanitize?"paragraph":"html",raw:de[0],pre:!this.options.sanitizer&&(de[1]==="pre"||de[1]==="script"||de[1]==="style"),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(de[0]):R(de[0]):de[0]}},we.def=function(fe){var de=this.rules.block.def.exec(fe);if(de){de[3]&&(de[3]=de[3].substring(1,de[3].length-1));var ge=de[1].toLowerCase().replace(/\s+/g," ");return{tag:ge,raw:de[0],href:de[2],title:de[3]}}},we.table=function(fe){var de=this.rules.block.table.exec(fe);if(de){var ge={type:"table",header:D(de[1].replace(/^ *| *\| *$/g,"")),align:de[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:de[3]?de[3].replace(/\n$/,"").split(` +`):[]};if(ge.header.length===ge.align.length){ge.raw=de[0];var pe=ge.align.length,ve;for(ve=0;ve/i.test(pe[0])&&(de=!1),!ge&&/^<(pre|code|kbd|script)(\s|>)/i.test(pe[0])?ge=!0:ge&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(pe[0])&&(ge=!1),{type:this.options.sanitize?"text":"html",raw:pe[0],inLink:de,inRawBlock:ge,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(pe[0]):R(pe[0]):pe[0]}},we.link=function(fe){var de=this.rules.inline.link.exec(fe);if(de){var ge=de[2].trim();if(!this.options.pedantic&&/^$/.test(ge))return;var pe=F(ge.slice(0,-1),"\\");if((ge.length-pe.length)%2==0)return}else{var ve=W(de[2],"()");if(ve>-1){var ke=de[0].indexOf("!")===0?5:4,Ne=ke+de[1].length+ve;de[2]=de[2].substring(0,ve),de[0]=de[0].substring(0,Ne).trim(),de[3]=""}}var Te=de[2],Oe="";if(this.options.pedantic){var Fe=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(Te);Fe&&(Te=Fe[1],Oe=Fe[3])}else Oe=de[3]?de[3].slice(1,-1):"";return Te=Te.trim(),/^$/.test(ge)?Te=Te.slice(1):Te=Te.slice(1,-1)),x(de,{href:Te&&Te.replace(this.rules.inline._escapes,"$1"),title:Oe&&Oe.replace(this.rules.inline._escapes,"$1")},de[0])}},we.reflink=function(fe,de){var ge;if((ge=this.rules.inline.reflink.exec(fe))||(ge=this.rules.inline.nolink.exec(fe))){var pe=(ge[2]||ge[1]).replace(/\s+/g," ");if(pe=de[pe.toLowerCase()],!pe||!pe.href){var ve=ge[0].charAt(0);return{type:"text",raw:ve,text:ve}}return x(ge,pe,ge[0])}},we.emStrong=function(fe,de,ge){ge===void 0&&(ge="");var pe=this.rules.inline.emStrong.lDelim.exec(fe);if(!!pe&&!(pe[3]&&ge.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var ve=pe[1]||pe[2]||"";if(!ve||ve&&(ge===""||this.rules.inline.punctuation.exec(ge))){var ke=pe[0].length-1,Ne,Te,Oe=ke,Fe=0,Pe=pe[0][0]==="*"?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(Pe.lastIndex=0,de=de.slice(-1*fe.length+ke);(pe=Pe.exec(de))!=null;)if(Ne=pe[1]||pe[2]||pe[3]||pe[4]||pe[5]||pe[6],!!Ne){if(Te=Ne.length,pe[3]||pe[4]){Oe+=Te;continue}else if((pe[5]||pe[6])&&ke%3&&!((ke+Te)%3)){Fe+=Te;continue}if(Oe-=Te,!(Oe>0)){if(Oe+Fe-Te<=0&&!de.slice(Pe.lastIndex).match(Pe)&&(Te=Math.min(Te,Te+Oe+Fe)),Math.min(ke,Te)%2)return{type:"em",raw:fe.slice(0,ke+pe.index+Te+1),text:fe.slice(1,ke+pe.index+Te)};if(Math.min(ke,Te)%2==0)return{type:"strong",raw:fe.slice(0,ke+pe.index+Te+1),text:fe.slice(2,ke+pe.index+Te-1)}}}}}},we.codespan=function(fe){var de=this.rules.inline.code.exec(fe);if(de){var ge=de[2].replace(/\n/g," "),pe=/[^ ]/.test(ge),ve=/^ /.test(ge)&&/ $/.test(ge);return pe&&ve&&(ge=ge.substring(1,ge.length-1)),ge=R(ge,!0),{type:"codespan",raw:de[0],text:ge}}},we.br=function(fe){var de=this.rules.inline.br.exec(fe);if(de)return{type:"br",raw:de[0]}},we.del=function(fe){var de=this.rules.inline.del.exec(fe);if(de)return{type:"del",raw:de[0],text:de[2]}},we.autolink=function(fe,de){var ge=this.rules.inline.autolink.exec(fe);if(ge){var pe,ve;return ge[2]==="@"?(pe=R(this.options.mangle?de(ge[1]):ge[1]),ve="mailto:"+pe):(pe=R(ge[1]),ve=pe),{type:"link",raw:ge[0],text:pe,href:ve,tokens:[{type:"text",raw:pe,text:pe}]}}},we.url=function(fe,de){var ge;if(ge=this.rules.inline.url.exec(fe)){var pe,ve;if(ge[2]==="@")pe=R(this.options.mangle?de(ge[0]):ge[0]),ve="mailto:"+pe;else{var ke;do ke=ge[0],ge[0]=this.rules.inline._backpedal.exec(ge[0])[0];while(ke!==ge[0]);pe=R(ge[0]),ge[1]==="www."?ve="http://"+pe:ve=pe}return{type:"link",raw:ge[0],text:pe,href:ve,tokens:[{type:"text",raw:pe,text:pe}]}}},we.inlineText=function(fe,de,ge){var pe=this.rules.inline.text.exec(fe);if(pe){var ve;return de?ve=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(pe[0]):R(pe[0]):pe[0]:ve=R(this.options.smartypants?ge(pe[0]):pe[0]),{type:"text",raw:pe[0],text:ve}}},Se}(),ee=A.noopTest,se=A.edit,ne=A.merge,le={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:ee,table:ee,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/};le._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,le._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,le.def=se(le.def).replace("label",le._label).replace("title",le._title).getRegex(),le.bullet=/(?:[*+-]|\d{1,9}[.)])/,le.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,le.item=se(le.item,"gm").replace(/bull/g,le.bullet).getRegex(),le.listItemStart=se(/^( *)(bull)/).replace("bull",le.bullet).getRegex(),le.list=se(le.list).replace(/bull/g,le.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+le.def.source+")").getRegex(),le._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",le._comment=/|$)/,le.html=se(le.html,"i").replace("comment",le._comment).replace("tag",le._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),le.paragraph=se(le._paragraph).replace("hr",le.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",le._tag).getRegex(),le.blockquote=se(le.blockquote).replace("paragraph",le.paragraph).getRegex(),le.normal=ne({},le),le.gfm=ne({},le.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),le.gfm.nptable=se(le.gfm.nptable).replace("hr",le.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",le._tag).getRegex(),le.gfm.table=se(le.gfm.table).replace("hr",le.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",le._tag).getRegex(),le.pedantic=ne({},le.normal,{html:se(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",le._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:ee,paragraph:se(le.normal._paragraph).replace("hr",le.hr).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",le.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var X={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:ee,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/\_\_[^_]*?\*[^_]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/\*\*[^*]*?\_[^*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:ee,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~",X.punctuation=se(X.punctuation).replace(/punctuation/g,X._punctuation).getRegex(),X.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,X.escapedEmSt=/\\\*|\\_/g,X._comment=se(le._comment).replace("(?:-->|$)","-->").getRegex(),X.emStrong.lDelim=se(X.emStrong.lDelim).replace(/punct/g,X._punctuation).getRegex(),X.emStrong.rDelimAst=se(X.emStrong.rDelimAst,"g").replace(/punct/g,X._punctuation).getRegex(),X.emStrong.rDelimUnd=se(X.emStrong.rDelimUnd,"g").replace(/punct/g,X._punctuation).getRegex(),X._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,X._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,X._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,X.autolink=se(X.autolink).replace("scheme",X._scheme).replace("email",X._email).getRegex(),X._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,X.tag=se(X.tag).replace("comment",X._comment).replace("attribute",X._attribute).getRegex(),X._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,X._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,X._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,X.link=se(X.link).replace("label",X._label).replace("href",X._href).replace("title",X._title).getRegex(),X.reflink=se(X.reflink).replace("label",X._label).getRegex(),X.reflinkSearch=se(X.reflinkSearch,"g").replace("reflink",X.reflink).replace("nolink",X.nolink).getRegex(),X.normal=ne({},X),X.pedantic=ne({},X.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:se(/^!?\[(label)\]\((.*?)\)/).replace("label",X._label).getRegex(),reflink:se(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",X._label).getRegex()}),X.gfm=ne({},X.normal,{escape:se(X.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\.5&&(fe="x"+fe.toString(16)),we+="&#"+fe+";";return we}var oe=function(){function Se(ye){this.tokens=[],this.tokens.links=Object.create(null),this.options=ye||P,this.options.tokenizer=this.options.tokenizer||new Y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var fe={block:V.normal,inline:U.normal};this.options.pedantic?(fe.block=V.pedantic,fe.inline=U.pedantic):this.options.gfm&&(fe.block=V.gfm,this.options.breaks?fe.inline=U.breaks:fe.inline=U.gfm),this.tokenizer.rules=fe}Se.lex=function(fe,de){var ge=new Se(de);return ge.lex(fe)},Se.lexInline=function(fe,de){var ge=new Se(de);return ge.inlineTokens(fe)};var we=Se.prototype;return we.lex=function(fe){return fe=fe.replace(/\r\n|\r/g,` +`).replace(/\t/g," "),this.blockTokens(fe,this.tokens,!0),this.inline(this.tokens),this.tokens},we.blockTokens=function(fe,de,ge){de===void 0&&(de=[]),ge===void 0&&(ge=!0),this.options.pedantic&&(fe=fe.replace(/^ +$/gm,""));for(var pe,ve,ke,Ne;fe;){if(pe=this.tokenizer.space(fe)){fe=fe.substring(pe.raw.length),pe.type&&de.push(pe);continue}if(pe=this.tokenizer.code(fe)){fe=fe.substring(pe.raw.length),Ne=de[de.length-1],Ne&&Ne.type==="paragraph"?(Ne.raw+=` +`+pe.raw,Ne.text+=` +`+pe.text):de.push(pe);continue}if(pe=this.tokenizer.fences(fe)){fe=fe.substring(pe.raw.length),de.push(pe);continue}if(pe=this.tokenizer.heading(fe)){fe=fe.substring(pe.raw.length),de.push(pe);continue}if(pe=this.tokenizer.nptable(fe)){fe=fe.substring(pe.raw.length),de.push(pe);continue}if(pe=this.tokenizer.hr(fe)){fe=fe.substring(pe.raw.length),de.push(pe);continue}if(pe=this.tokenizer.blockquote(fe)){fe=fe.substring(pe.raw.length),pe.tokens=this.blockTokens(pe.text,[],ge),de.push(pe);continue}if(pe=this.tokenizer.list(fe)){for(fe=fe.substring(pe.raw.length),ke=pe.items.length,ve=0;ve0)for(;(Te=this.tokenizer.rules.inline.reflinkSearch.exec(Ne))!=null;)Pe.includes(Te[0].slice(Te[0].lastIndexOf("[")+1,-1))&&(Ne=Ne.slice(0,Te.index)+"["+H("a",Te[0].length-2)+"]"+Ne.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(Te=this.tokenizer.rules.inline.blockSkip.exec(Ne))!=null;)Ne=Ne.slice(0,Te.index)+"["+H("a",Te[0].length-2)+"]"+Ne.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(Te=this.tokenizer.rules.inline.escapedEmSt.exec(Ne))!=null;)Ne=Ne.slice(0,Te.index)+"++"+Ne.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);for(;fe;){if(Oe||(Fe=""),Oe=!1,ve=this.tokenizer.escape(fe)){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(ve=this.tokenizer.tag(fe,ge,pe)){fe=fe.substring(ve.raw.length),ge=ve.inLink,pe=ve.inRawBlock;var xe=de[de.length-1];xe&&ve.type==="text"&&xe.type==="text"?(xe.raw+=ve.raw,xe.text+=ve.text):de.push(ve);continue}if(ve=this.tokenizer.link(fe)){fe=fe.substring(ve.raw.length),ve.type==="link"&&(ve.tokens=this.inlineTokens(ve.text,[],!0,pe)),de.push(ve);continue}if(ve=this.tokenizer.reflink(fe,this.tokens.links)){fe=fe.substring(ve.raw.length);var We=de[de.length-1];ve.type==="link"?(ve.tokens=this.inlineTokens(ve.text,[],!0,pe),de.push(ve)):We&&ve.type==="text"&&We.type==="text"?(We.raw+=ve.raw,We.text+=ve.text):de.push(ve);continue}if(ve=this.tokenizer.emStrong(fe,Ne,Fe)){fe=fe.substring(ve.raw.length),ve.tokens=this.inlineTokens(ve.text,[],ge,pe),de.push(ve);continue}if(ve=this.tokenizer.codespan(fe)){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(ve=this.tokenizer.br(fe)){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(ve=this.tokenizer.del(fe)){fe=fe.substring(ve.raw.length),ve.tokens=this.inlineTokens(ve.text,[],ge,pe),de.push(ve);continue}if(ve=this.tokenizer.autolink(fe,ie)){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(!ge&&(ve=this.tokenizer.url(fe,ie))){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(ve=this.tokenizer.inlineText(fe,pe,$)){fe=fe.substring(ve.raw.length),ve.raw.slice(-1)!=="_"&&(Fe=ve.raw.slice(-1)),Oe=!0,ke=de[de.length-1],ke&&ke.type==="text"?(ke.raw+=ve.raw,ke.text+=ve.text):de.push(ve);continue}if(fe){var ze="Infinite loop on byte: "+fe.charCodeAt(0);if(this.options.silent){console.error(ze);break}else throw new Error(ze)}}return de},e(Se,null,[{key:"rules",get:function(){return{block:V,inline:U}}}]),Se}(),ae=S.defaults,G=A.cleanUrl,j=A.escape,te=function(){function Se(ye){this.options=ye||ae}var we=Se.prototype;return we.code=function(fe,de,ge){var pe=(de||"").match(/\S*/)[0];if(this.options.highlight){var ve=this.options.highlight(fe,pe);ve!=null&&ve!==fe&&(ge=!0,fe=ve)}return fe=fe.replace(/\n$/,"")+` +`,pe?'
'+(ge?fe:j(fe,!0))+`
+`:"
"+(ge?fe:j(fe,!0))+`
+`},we.blockquote=function(fe){return`
+`+fe+`
+`},we.html=function(fe){return fe},we.heading=function(fe,de,ge,pe){return this.options.headerIds?"'+fe+" +`:""+fe+" +`},we.hr=function(){return this.options.xhtml?`
+`:`
+`},we.list=function(fe,de,ge){var pe=de?"ol":"ul",ve=de&&ge!==1?' start="'+ge+'"':"";return"<"+pe+ve+`> +`+fe+" +`},we.listitem=function(fe){return"
  • "+fe+`
  • +`},we.checkbox=function(fe){return" "},we.paragraph=function(fe){return"

    "+fe+`

    +`},we.table=function(fe,de){return de&&(de=""+de+""),` + +`+fe+` +`+de+`
    +`},we.tablerow=function(fe){return` +`+fe+` +`},we.tablecell=function(fe,de){var ge=de.header?"th":"td",pe=de.align?"<"+ge+' align="'+de.align+'">':"<"+ge+">";return pe+fe+" +`},we.strong=function(fe){return""+fe+""},we.em=function(fe){return""+fe+""},we.codespan=function(fe){return""+fe+""},we.br=function(){return this.options.xhtml?"
    ":"
    "},we.del=function(fe){return""+fe+""},we.link=function(fe,de,ge){if(fe=G(this.options.sanitize,this.options.baseUrl,fe),fe===null)return ge;var pe='",pe},we.image=function(fe,de,ge){if(fe=G(this.options.sanitize,this.options.baseUrl,fe),fe===null)return ge;var pe=''+ge+'":">",pe},we.text=function(fe){return fe},Se}(),Z=function(){function Se(){}var we=Se.prototype;return we.strong=function(fe){return fe},we.em=function(fe){return fe},we.codespan=function(fe){return fe},we.del=function(fe){return fe},we.html=function(fe){return fe},we.text=function(fe){return fe},we.link=function(fe,de,ge){return""+ge},we.image=function(fe,de,ge){return""+ge},we.br=function(){return""},Se}(),ue=function(){function Se(){this.seen={}}var we=Se.prototype;return we.serialize=function(fe){return fe.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},we.getNextSafeSlug=function(fe,de){var ge=fe,pe=0;if(this.seen.hasOwnProperty(ge)){pe=this.seen[fe];do pe++,ge=fe+"-"+pe;while(this.seen.hasOwnProperty(ge))}return de||(this.seen[fe]=pe,this.seen[ge]=0),ge},we.slug=function(fe,de){de===void 0&&(de={});var ge=this.serialize(fe);return this.getNextSafeSlug(ge,de.dryrun)},Se}(),he=S.defaults,re=A.unescape,ce=function(){function Se(ye){this.options=ye||he,this.options.renderer=this.options.renderer||new te,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new Z,this.slugger=new ue}Se.parse=function(fe,de){var ge=new Se(de);return ge.parse(fe)},Se.parseInline=function(fe,de){var ge=new Se(de);return ge.parseInline(fe)};var we=Se.prototype;return we.parse=function(fe,de){de===void 0&&(de=!0);var ge="",pe,ve,ke,Ne,Te,Oe,Fe,Pe,xe,We,ze,Ke,Be,He,Ve,Ue,Ye,je,Xe=fe.length;for(pe=0;pe0&&Ve.tokens[0].type==="text"?(Ve.tokens[0].text=je+" "+Ve.tokens[0].text,Ve.tokens[0].tokens&&Ve.tokens[0].tokens.length>0&&Ve.tokens[0].tokens[0].type==="text"&&(Ve.tokens[0].tokens[0].text=je+" "+Ve.tokens[0].tokens[0].text)):Ve.tokens.unshift({type:"text",text:je}):He+=je),He+=this.parse(Ve.tokens,Be),xe+=this.renderer.listitem(He,Ye,Ue);ge+=this.renderer.list(xe,ze,Ke);continue}case"html":{ge+=this.renderer.html(We.text);continue}case"paragraph":{ge+=this.renderer.paragraph(this.parseInline(We.tokens));continue}case"text":{for(xe=We.tokens?this.parseInline(We.tokens):We.text;pe+1An error occurred:

    "+be(ke.message+"",!0)+"
    ";throw ke}}Ee.options=Ee.setOptions=function(Se){return me(Ee.defaults,Se),De(Ee.defaults),Ee},Ee.getDefaults=Le,Ee.defaults=Re,Ee.use=function(Se){var we=me({},Se);if(Se.renderer&&function(){var fe=Ee.defaults.renderer||new te,de=function(ve){var ke=fe[ve];fe[ve]=function(){for(var Ne=arguments.length,Te=new Array(Ne),Oe=0;OeAn error occurred:

    "+be(fe.message+"",!0)+"
    ";throw fe}},Ee.Parser=ce,Ee.parser=ce.parse,Ee.Renderer=te,Ee.TextRenderer=Z,Ee.Lexer=oe,Ee.lexer=oe.lex,Ee.Tokenizer=Y,Ee.Slugger=ue,Ee.parse=Ee;var Ae=Ee;return Ae}),define(Q[278],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ArrayNavigator=void 0;class b{constructor(M,w=0,S=M.length,C=w-1){this.items=M,this.start=w,this.end=S,this.index=C}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}next(){return this.index=Math.min(this.index+1,this.end),this.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}}e.ArrayNavigator=b}),define(Q[279],J([0,1,278]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HistoryNavigator=void 0;class N{constructor(w=[],S=10){this._initialize(w),this._limit=S,this._onChange()}add(w){this._history.delete(w),this._history.add(w),this._onChange()}next(){return this._currentPosition()!==this._elements.length-1?this._navigator.next():null}previous(){return this._currentPosition()!==0?this._navigator.previous():null}current(){return this._navigator.current()}first(){return this._navigator.first()}last(){return this._navigator.last()}has(w){return this._history.has(w)}_onChange(){this._reduceToLimit();const w=this._elements;this._navigator=new b.ArrayNavigator(w,0,w.length,w.length)}_reduceToLimit(){const w=this._elements;w.length>this._limit&&this._initialize(w.slice(w.length-this._limit))}_currentPosition(){const w=this._navigator.current();return w?this._elements.indexOf(w):-1}_initialize(w){this._history=new Set;for(const S of w)this._history.add(S)}get _elements(){const w=[];return this._history.forEach(S=>w.push(S)),w}}e.HistoryNavigator=N}),define(Q[100],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MovingAverage=e.clamp=void 0;function b(M,w,S){return Math.min(Math.max(M,w),S)}e.clamp=b;class N{constructor(){this._n=1,this._val=0}update(w){return this._val=this._val+(w-this._val)/this._n,this._n+=1,this}get value(){return this._val}}e.MovingAverage=N}),define(Q[17],J([0,1]),function(q,e){"use strict";var b;Object.defineProperty(e,"__esModule",{value:!0}),e.isLittleEndian=e.OS=e.setImmediate=e.globals=e.userAgent=e.isIOS=e.isWeb=e.isNative=e.isLinux=e.isMacintosh=e.isWindows=e.isPreferringBrowserCodeLoad=e.browserCodeLoadingCacheStrategy=e.isElectronSandboxed=void 0;const N="en";let M=!1,w=!1,S=!1,C=!1,d=!1,g=!1,p=!1,c,o=N,s,a;const u=typeof self=="object"?self:typeof global=="object"?global:{};let r;typeof process!="undefined"?r=process:typeof u.vscode!="undefined"&&(r=u.vscode.process);const i=typeof((b=r==null?void 0:r.versions)===null||b===void 0?void 0:b.electron)=="string"&&r.type==="renderer";if(e.isElectronSandboxed=i&&(r==null?void 0:r.sandboxed),e.browserCodeLoadingCacheStrategy=(()=>{if(e.isElectronSandboxed)return"bypassHeatCheck";const m=r==null?void 0:r.env.ENABLE_VSCODE_BROWSER_CODE_LOADING;if(typeof m=="string")return m==="none"||m==="code"||m==="bypassHeatCheck"||m==="bypassHeatCheckAndEagerCompile"?m:"bypassHeatCheck"})(),e.isPreferringBrowserCodeLoad=typeof e.browserCodeLoadingCacheStrategy=="string",typeof navigator=="object"&&!i)a=navigator.userAgent,M=a.indexOf("Windows")>=0,w=a.indexOf("Macintosh")>=0,p=(a.indexOf("Macintosh")>=0||a.indexOf("iPad")>=0||a.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,S=a.indexOf("Linux")>=0,g=!0,c=navigator.language,o=c;else if(typeof r=="object"){M=r.platform==="win32",w=r.platform==="darwin",S=r.platform==="linux",C=S&&!!r.env.SNAP&&!!r.env.SNAP_REVISION,c=N,o=N;const m=r.env.VSCODE_NLS_CONFIG;if(m)try{const _=JSON.parse(m),f=_.availableLanguages["*"];c=_.locale,o=f||N,s=_._translationsConfigFile}catch(_){}d=!0}else console.error("Unable to resolve platform.");let n=0;w?n=1:M?n=3:S&&(n=2),e.isWindows=M,e.isMacintosh=w,e.isLinux=S,e.isNative=d,e.isWeb=g,e.isIOS=p,e.userAgent=a,e.globals=u,e.setImmediate=function(){if(e.globals.setImmediate)return e.globals.setImmediate.bind(e.globals);if(typeof e.globals.postMessage=="function"&&!e.globals.importScripts){let f=[];e.globals.addEventListener("message",y=>{if(y.data&&y.data.vscodeSetImmediateId)for(let L=0,I=f.length;L{const L=++v;f.push({id:L,callback:y}),e.globals.postMessage({vscodeSetImmediateId:L},"*")}}if(r&&typeof r.nextTick=="function")return r.nextTick.bind(r);const _=Promise.resolve();return f=>_.then(f)}(),e.OS=w||p?2:M?1:3;let t=!0,l=!1;function h(){if(!l){l=!0;const m=new Uint8Array(2);m[0]=1,m[1]=2,t=new Uint16Array(m.buffer)[0]===(2<<8)+1}return t}e.isLittleEndian=h}),define(Q[280],J([0,1,17]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.platform=e.env=e.cwd=void 0;let N;typeof process!="undefined"?N=process:typeof b.globals.vscode!="undefined"?N={get platform(){return b.globals.vscode.process.platform},get env(){return b.globals.vscode.process.env},nextTick(M){return b.setImmediate(M)},cwd(){return b.globals.vscode.process.env.VSCODE_CWD||b.globals.vscode.process.execPath.substr(0,b.globals.vscode.process.execPath.lastIndexOf(b.globals.vscode.process.platform==="win32"?"\\":"/"))}}:N={get platform(){return b.isWindows?"win32":b.isMacintosh?"darwin":"linux"},nextTick(M){return b.setImmediate(M)},get env(){return Object.create(null)},cwd(){return"/"}},e.cwd=N.cwd,e.env=N.env,e.platform=N.platform}),define(Q[72],J([0,1,280]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sep=e.extname=e.basename=e.dirname=e.relative=e.resolve=e.normalize=e.posix=e.win32=void 0;const N=65,M=97,w=90,S=122,C=46,d=47,g=92,p=58,c=63;class o extends Error{constructor(l,h,m){let _;typeof h=="string"&&h.indexOf("not ")===0?(_="must not be",h=h.replace(/^not /,"")):_="must be";const f=l.indexOf(".")!==-1?"property":"argument";let v=`The "${l}" ${f} ${_} of type ${h}`;v+=`. Received type ${typeof m}`,super(v),this.code="ERR_INVALID_ARG_TYPE"}}function s(t,l){if(typeof t!="string")throw new o(l,"string",t)}function a(t){return t===d||t===g}function u(t){return t===d}function r(t){return t>=N&&t<=w||t>=M&&t<=S}function i(t,l,h,m){let _="",f=0,v=-1,y=0,L=0;for(let I=0;I<=t.length;++I){if(I2){const k=_.lastIndexOf(h);k===-1?(_="",f=0):(_=_.slice(0,k),f=_.length-1-_.lastIndexOf(h)),v=I,y=0;continue}else if(_.length!==0){_="",f=0,v=I,y=0;continue}}l&&(_+=_.length>0?`${h}..`:"..",f=2)}else _.length>0?_+=`${h}${t.slice(v+1,I)}`:_=t.slice(v+1,I),f=I-v-1;v=I,y=0}else L===C&&y!==-1?++y:y=-1}return _}function n(t,l){if(l===null||typeof l!="object")throw new o("pathObject","Object",l);const h=l.dir||l.root,m=l.base||`${l.name||""}${l.ext||""}`;return h?h===l.root?`${h}${m}`:`${h}${t}${m}`:m}e.win32={resolve(...t){let l="",h="",m=!1;for(let _=t.length-1;_>=-1;_--){let f;if(_>=0){if(f=t[_],s(f,"path"),f.length===0)continue}else l.length===0?f=b.cwd():(f=b.env[`=${l}`]||b.cwd(),(f===void 0||f.slice(0,2).toLowerCase()!==l.toLowerCase()&&f.charCodeAt(2)===g)&&(f=`${l}\\`));const v=f.length;let y=0,L="",I=!1;const k=f.charCodeAt(0);if(v===1)a(k)&&(y=1,I=!0);else if(a(k))if(I=!0,a(f.charCodeAt(1))){let E=2,T=E;for(;E2&&a(f.charCodeAt(2))&&(I=!0,y=3));if(L.length>0)if(l.length>0){if(L.toLowerCase()!==l.toLowerCase())continue}else l=L;if(m){if(l.length>0)break}else if(h=`${f.slice(y)}\\${h}`,m=I,I&&l.length>0)break}return h=i(h,!m,"\\",a),m?`${l}\\${h}`:`${l}${h}`||"."},normalize(t){s(t,"path");const l=t.length;if(l===0)return".";let h=0,m,_=!1;const f=t.charCodeAt(0);if(l===1)return u(f)?"\\":t;if(a(f))if(_=!0,a(t.charCodeAt(1))){let y=2,L=y;for(;y2&&a(t.charCodeAt(2))&&(_=!0,h=3));let v=h0&&a(t.charCodeAt(l-1))&&(v+="\\"),m===void 0?_?`\\${v}`:v:_?`${m}\\${v}`:`${m}${v}`},isAbsolute(t){s(t,"path");const l=t.length;if(l===0)return!1;const h=t.charCodeAt(0);return a(h)||l>2&&r(h)&&t.charCodeAt(1)===p&&a(t.charCodeAt(2))},join(...t){if(t.length===0)return".";let l,h;for(let f=0;f0&&(l===void 0?l=h=v:l+=`\\${v}`)}if(l===void 0)return".";let m=!0,_=0;if(typeof h=="string"&&a(h.charCodeAt(0))){++_;const f=h.length;f>1&&a(h.charCodeAt(1))&&(++_,f>2&&(a(h.charCodeAt(2))?++_:m=!1))}if(m){for(;_=2&&(l=`\\${l.slice(_)}`)}return e.win32.normalize(l)},relative(t,l){if(s(t,"from"),s(l,"to"),t===l)return"";const h=e.win32.resolve(t),m=e.win32.resolve(l);if(h===m||(t=h.toLowerCase(),l=m.toLowerCase(),t===l))return"";let _=0;for(;__&&t.charCodeAt(f-1)===g;)f--;const v=f-_;let y=0;for(;yy&&l.charCodeAt(L-1)===g;)L--;const I=L-y,k=vk){if(l.charCodeAt(y+T)===g)return m.slice(y+T+1);if(T===2)return m.slice(y+T)}v>k&&(t.charCodeAt(_+T)===g?E=T:T===2&&(E=3)),E===-1&&(E=0)}let O="";for(T=_+E+1;T<=f;++T)(T===f||t.charCodeAt(T)===g)&&(O+=O.length===0?"..":"\\..");return y+=E,O.length>0?`${O}${m.slice(y,L)}`:(m.charCodeAt(y)===g&&++y,m.slice(y,L))},toNamespacedPath(t){if(typeof t!="string")return t;if(t.length===0)return"";const l=e.win32.resolve(t);if(l.length<=2)return t;if(l.charCodeAt(0)===g){if(l.charCodeAt(1)===g){const h=l.charCodeAt(2);if(h!==c&&h!==C)return`\\\\?\\UNC\\${l.slice(2)}`}}else if(r(l.charCodeAt(0))&&l.charCodeAt(1)===p&&l.charCodeAt(2)===g)return`\\\\?\\${l}`;return t},dirname(t){s(t,"path");const l=t.length;if(l===0)return".";let h=-1,m=0;const _=t.charCodeAt(0);if(l===1)return a(_)?t:".";if(a(_)){if(h=m=1,a(t.charCodeAt(1))){let y=2,L=y;for(;y2&&a(t.charCodeAt(2))?3:2,m=h);let f=-1,v=!0;for(let y=l-1;y>=m;--y)if(a(t.charCodeAt(y))){if(!v){f=y;break}}else v=!1;if(f===-1){if(h===-1)return".";f=h}return t.slice(0,f)},basename(t,l){l!==void 0&&s(l,"ext"),s(t,"path");let h=0,m=-1,_=!0,f;if(t.length>=2&&r(t.charCodeAt(0))&&t.charCodeAt(1)===p&&(h=2),l!==void 0&&l.length>0&&l.length<=t.length){if(l===t)return"";let v=l.length-1,y=-1;for(f=t.length-1;f>=h;--f){const L=t.charCodeAt(f);if(a(L)){if(!_){h=f+1;break}}else y===-1&&(_=!1,y=f+1),v>=0&&(L===l.charCodeAt(v)?--v==-1&&(m=f):(v=-1,m=y))}return h===m?m=y:m===-1&&(m=t.length),t.slice(h,m)}for(f=t.length-1;f>=h;--f)if(a(t.charCodeAt(f))){if(!_){h=f+1;break}}else m===-1&&(_=!1,m=f+1);return m===-1?"":t.slice(h,m)},extname(t){s(t,"path");let l=0,h=-1,m=0,_=-1,f=!0,v=0;t.length>=2&&t.charCodeAt(1)===p&&r(t.charCodeAt(0))&&(l=m=2);for(let y=t.length-1;y>=l;--y){const L=t.charCodeAt(y);if(a(L)){if(!f){m=y+1;break}continue}_===-1&&(f=!1,_=y+1),L===C?h===-1?h=y:v!==1&&(v=1):h!==-1&&(v=-1)}return h===-1||_===-1||v===0||v===1&&h===_-1&&h===m+1?"":t.slice(h,_)},format:n.bind(null,"\\"),parse(t){s(t,"path");const l={root:"",dir:"",base:"",ext:"",name:""};if(t.length===0)return l;const h=t.length;let m=0,_=t.charCodeAt(0);if(h===1)return a(_)?(l.root=l.dir=t,l):(l.base=l.name=t,l);if(a(_)){if(m=1,a(t.charCodeAt(1))){let E=2,T=E;for(;E0&&(l.root=t.slice(0,m));let f=-1,v=m,y=-1,L=!0,I=t.length-1,k=0;for(;I>=m;--I){if(_=t.charCodeAt(I),a(_)){if(!L){v=I+1;break}continue}y===-1&&(L=!1,y=I+1),_===C?f===-1?f=I:k!==1&&(k=1):f!==-1&&(k=-1)}return y!==-1&&(f===-1||k===0||k===1&&f===y-1&&f===v+1?l.base=l.name=t.slice(v,y):(l.name=t.slice(v,f),l.base=t.slice(v,y),l.ext=t.slice(f,y))),v>0&&v!==m?l.dir=t.slice(0,v-1):l.dir=l.root,l},sep:"\\",delimiter:";",win32:null,posix:null},e.posix={resolve(...t){let l="",h=!1;for(let m=t.length-1;m>=-1&&!h;m--){const _=m>=0?t[m]:b.cwd();s(_,"path"),_.length!==0&&(l=`${_}/${l}`,h=_.charCodeAt(0)===d)}return l=i(l,!h,"/",u),h?`/${l}`:l.length>0?l:"."},normalize(t){if(s(t,"path"),t.length===0)return".";const l=t.charCodeAt(0)===d,h=t.charCodeAt(t.length-1)===d;return t=i(t,!l,"/",u),t.length===0?l?"/":h?"./":".":(h&&(t+="/"),l?`/${t}`:t)},isAbsolute(t){return s(t,"path"),t.length>0&&t.charCodeAt(0)===d},join(...t){if(t.length===0)return".";let l;for(let h=0;h0&&(l===void 0?l=m:l+=`/${m}`)}return l===void 0?".":e.posix.normalize(l)},relative(t,l){if(s(t,"from"),s(l,"to"),t===l||(t=e.posix.resolve(t),l=e.posix.resolve(l),t===l))return"";const h=1,m=t.length,_=m-h,f=1,v=l.length-f,y=_y){if(l.charCodeAt(f+I)===d)return l.slice(f+I+1);if(I===0)return l.slice(f+I)}else _>y&&(t.charCodeAt(h+I)===d?L=I:I===0&&(L=0));let k="";for(I=h+L+1;I<=m;++I)(I===m||t.charCodeAt(I)===d)&&(k+=k.length===0?"..":"/..");return`${k}${l.slice(f+L)}`},toNamespacedPath(t){return t},dirname(t){if(s(t,"path"),t.length===0)return".";const l=t.charCodeAt(0)===d;let h=-1,m=!0;for(let _=t.length-1;_>=1;--_)if(t.charCodeAt(_)===d){if(!m){h=_;break}}else m=!1;return h===-1?l?"/":".":l&&h===1?"//":t.slice(0,h)},basename(t,l){l!==void 0&&s(l,"ext"),s(t,"path");let h=0,m=-1,_=!0,f;if(l!==void 0&&l.length>0&&l.length<=t.length){if(l===t)return"";let v=l.length-1,y=-1;for(f=t.length-1;f>=0;--f){const L=t.charCodeAt(f);if(L===d){if(!_){h=f+1;break}}else y===-1&&(_=!1,y=f+1),v>=0&&(L===l.charCodeAt(v)?--v==-1&&(m=f):(v=-1,m=y))}return h===m?m=y:m===-1&&(m=t.length),t.slice(h,m)}for(f=t.length-1;f>=0;--f)if(t.charCodeAt(f)===d){if(!_){h=f+1;break}}else m===-1&&(_=!1,m=f+1);return m===-1?"":t.slice(h,m)},extname(t){s(t,"path");let l=-1,h=0,m=-1,_=!0,f=0;for(let v=t.length-1;v>=0;--v){const y=t.charCodeAt(v);if(y===d){if(!_){h=v+1;break}continue}m===-1&&(_=!1,m=v+1),y===C?l===-1?l=v:f!==1&&(f=1):l!==-1&&(f=-1)}return l===-1||m===-1||f===0||f===1&&l===m-1&&l===h+1?"":t.slice(l,m)},format:n.bind(null,"/"),parse(t){s(t,"path");const l={root:"",dir:"",base:"",ext:"",name:""};if(t.length===0)return l;const h=t.charCodeAt(0)===d;let m;h?(l.root="/",m=1):m=0;let _=-1,f=0,v=-1,y=!0,L=t.length-1,I=0;for(;L>=m;--L){const k=t.charCodeAt(L);if(k===d){if(!y){f=L+1;break}continue}v===-1&&(y=!1,v=L+1),k===C?_===-1?_=L:I!==1&&(I=1):_!==-1&&(I=-1)}if(v!==-1){const k=f===0&&h?1:f;_===-1||I===0||I===1&&_===v-1&&_===f+1?l.base=l.name=t.slice(k,v):(l.name=t.slice(k,_),l.base=t.slice(k,v),l.ext=t.slice(_,v))}return f>0?l.dir=t.slice(0,f-1):h&&(l.dir="/"),l},sep:"/",delimiter:":",win32:null,posix:null},e.posix.win32=e.win32.win32=e.win32,e.posix.posix=e.win32.posix=e.posix,e.normalize=b.platform==="win32"?e.win32.normalize:e.posix.normalize,e.resolve=b.platform==="win32"?e.win32.resolve:e.posix.resolve,e.relative=b.platform==="win32"?e.win32.relative:e.posix.relative,e.dirname=b.platform==="win32"?e.win32.dirname:e.posix.dirname,e.basename=b.platform==="win32"?e.win32.basename:e.posix.basename,e.extname=b.platform==="win32"?e.win32.extname:e.posix.extname,e.sep=b.platform==="win32"?e.win32.sep:e.posix.sep}),define(Q[120],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Range=void 0;var b;(function(N){function M(d,g){if(d.start>=g.end||g.start>=d.end)return{start:0,end:0};const p=Math.max(d.start,g.start),c=Math.min(d.end,g.end);return c-p<=0?{start:0,end:0}:{start:p,end:c}}N.intersect=M;function w(d){return d.end-d.start<=0}N.isEmpty=w;function S(d,g){return!w(M(d,g))}N.intersects=S;function C(d,g){const p=[],c={start:d.start,end:Math.min(g.start,d.end)},o={start:Math.max(g.end,d.start),end:d.end};return w(c)||p.push(c),w(o)||p.push(o),p}N.relativeComplement=C})(b=e.Range||(e.Range={}))}),define(Q[281],J([0,1,120]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeMap=e.consolidate=e.shift=e.groupIntersect=void 0;function N(d,g){const p=[];for(let c of g)if(!(d.start>=c.range.end)){if(d.endg.concat(p),[]))}class C{constructor(){this.groups=[],this._size=0}splice(g,p,c=[]){const o=c.length-p,s=N({start:0,end:g},this.groups),a=N({start:g+p,end:Number.POSITIVE_INFINITY},this.groups).map(r=>({range:M(r.range,o),size:r.size})),u=c.map((r,i)=>({range:{start:g+i,end:g+i+1},size:r.size}));this.groups=S(s,u,a),this._size=this.groups.reduce((r,i)=>r+i.size*(i.range.end-i.range.start),0)}get count(){const g=this.groups.length;return g?this.groups[g-1].range.end:0}get size(){return this._size}indexAt(g){if(g<0)return-1;let p=0,c=0;for(let o of this.groups){const s=o.range.end-o.range.start,a=c+s*o.size;if(gN.Disposable.None;function u(A){return(B,F=null,D)=>{let R=!1,W;return W=A(x=>{if(!R)return W?W.dispose():R=!0,B.call(F,x)},null,D),R&&W.dispose(),W}}a.once=u;function r(A,B){return m((F,D=null,R)=>A(W=>F.call(D,B(W)),null,R))}a.map=r;function i(A,B){return m((F,D=null,R)=>A(W=>{B(W),F.call(D,W)},null,R))}a.forEach=i;function n(A,B){return m((F,D=null,R)=>A(W=>B(W)&&F.call(D,W),null,R))}a.filter=n;function t(A){return A}a.signal=t;function l(...A){return(B,F=null,D)=>N.combinedDisposable(...A.map(R=>R(W=>B.call(F,W),null,D)))}a.any=l;function h(A,B,F){let D=F;return r(A,R=>(D=B(D,R),D))}a.reduce=h;function m(A){let B;const F=new p({onFirstListenerAdd(){B=A(F.fire,F)},onLastListenerRemove(){B.dispose()}});return F.event}a.snapshot=m;function _(A,B,F=100,D=!1,R){let W,x,K,Y=0;const ee=new p({leakWarningThreshold:R,onFirstListenerAdd(){W=A(se=>{Y++,x=B(x,se),D&&!K&&(ee.fire(x),x=void 0),clearTimeout(K),K=setTimeout(()=>{const ne=x;x=void 0,K=void 0,(!D||Y>1)&&ee.fire(ne),Y=0},F)})},onLastListenerRemove(){W.dispose()}});return ee.event}a.debounce=_;function f(A){const B=new Date().getTime();return r(u(A),F=>new Date().getTime()-B)}a.stopwatch=f;function v(A){let B=!0,F;return n(A,D=>{const R=B||D!==F;return B=!1,F=D,R})}a.latch=v;function y(A,B=!1,F=[]){let D=F.slice(),R=A(K=>{D?D.push(K):x.fire(K)});const W=()=>{D&&D.forEach(K=>x.fire(K)),D=null},x=new p({onFirstListenerAdd(){R||(R=A(K=>x.fire(K)))},onFirstListenerDidAdd(){D&&(B?setTimeout(W):W())},onLastListenerRemove(){R&&R.dispose(),R=null}});return x.event}a.buffer=y;class L{constructor(B){this.event=B}map(B){return new L(r(this.event,B))}forEach(B){return new L(i(this.event,B))}filter(B){return new L(n(this.event,B))}reduce(B,F){return new L(h(this.event,B,F))}latch(){return new L(v(this.event))}debounce(B,F=100,D=!1,R){return new L(_(this.event,B,F,D,R))}on(B,F,D){return this.event(B,F,D)}once(B,F,D){return u(this.event)(B,F,D)}}function I(A){return new L(A)}a.chain=I;function k(A,B,F=D=>D){const D=(...K)=>x.fire(F(...K)),R=()=>A.on(B,D),W=()=>A.removeListener(B,D),x=new p({onFirstListenerAdd:R,onLastListenerRemove:W});return x.event}a.fromNodeEventEmitter=k;function E(A,B,F=D=>D){const D=(...K)=>x.fire(F(...K)),R=()=>A.addEventListener(B,D),W=()=>A.removeEventListener(B,D),x=new p({onFirstListenerAdd:R,onLastListenerRemove:W});return x.event}a.fromDOMEventEmitter=E;function T(A){const B=new p;let F=!1;return A.then(void 0,()=>null).then(()=>{F?B.fire(void 0):setTimeout(()=>B.fire(void 0),0)}),F=!0,B.event}a.fromPromise=T;function O(A){return new Promise(B=>u(A)(B))}a.toPromise=O})(S=e.Event||(e.Event={}));class C{constructor(u){this._listenerCount=0,this._invocationCount=0,this._elapsedOverall=0,this._name=`${u}_${C._idPool++}`}start(u){this._stopWatch=new w.StopWatch(!0),this._listenerCount=u}stop(){if(this._stopWatch){const u=this._stopWatch.elapsed();this._elapsedOverall+=u,this._invocationCount+=1,console.info(`did FIRE ${this._name}: elapsed_ms: ${u.toFixed(5)}, listener: ${this._listenerCount} (elapsed_overall: ${this._elapsedOverall.toFixed(2)}, invocations: ${this._invocationCount})`),this._stopWatch=void 0}}}C._idPool=0;let d=-1;class g{constructor(u,r=Math.random().toString(18).slice(2,5)){this.customThreshold=u,this.name=r,this._warnCountdown=0}dispose(){this._stacks&&this._stacks.clear()}check(u){let r=d;if(typeof this.customThreshold=="number"&&(r=this.customThreshold),!(r<=0||u{const t=this._stacks.get(i)||0;this._stacks.set(i,t-1)}}}}class p{constructor(u){var r;this._disposed=!1,this._options=u,this._leakageMon=d>0?new g(this._options&&this._options.leakWarningThreshold):void 0,this._perfMon=((r=this._options)===null||r===void 0?void 0:r._profName)?new C(this._options._profName):void 0}get event(){return this._event||(this._event=(u,r,i)=>{var n;this._listeners||(this._listeners=new M.LinkedList);const t=this._listeners.isEmpty();t&&this._options&&this._options.onFirstListenerAdd&&this._options.onFirstListenerAdd(this);const l=this._listeners.push(r?[u,r]:u);t&&this._options&&this._options.onFirstListenerDidAdd&&this._options.onFirstListenerDidAdd(this),this._options&&this._options.onListenerDidAdd&&this._options.onListenerDidAdd(this,u,r);const h=(n=this._leakageMon)===null||n===void 0?void 0:n.check(this._listeners.size);let m;return m={dispose:()=>{h&&h(),m.dispose=p._noop,this._disposed||(l(),this._options&&this._options.onLastListenerRemove&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this)))}},i instanceof N.DisposableStore?i.add(m):Array.isArray(i)&&i.push(m),m}),this._event}fire(u){var r,i;if(this._listeners){this._deliveryQueue||(this._deliveryQueue=new M.LinkedList);for(let n of this._listeners)this._deliveryQueue.push([n,u]);for((r=this._perfMon)===null||r===void 0||r.start(this._deliveryQueue.size);this._deliveryQueue.size>0;){const[n,t]=this._deliveryQueue.shift();try{typeof n=="function"?n.call(void 0,t):n[0].call(n[1],t)}catch(l){b.onUnexpectedError(l)}}(i=this._perfMon)===null||i===void 0||i.stop()}}dispose(){var u,r,i;(u=this._listeners)===null||u===void 0||u.clear(),(r=this._deliveryQueue)===null||r===void 0||r.clear(),(i=this._leakageMon)===null||i===void 0||i.dispose(),this._disposed=!0}}e.Emitter=p,p._noop=function(){};class c extends p{constructor(u){super(u);this._isPaused=0,this._eventQueue=new M.LinkedList,this._mergeFn=u==null?void 0:u.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused==0)if(this._mergeFn){const u=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(u))}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(u){this._listeners&&(this._isPaused!==0?this._eventQueue.push(u):super.fire(u))}}e.PauseableEmitter=c;class o{constructor(){this.buffers=[]}wrapEvent(u){return(r,i,n)=>u(t=>{const l=this.buffers[this.buffers.length-1];l?l.push(()=>r.call(i,t)):r.call(i,t)},void 0,n)}bufferEvents(u){const r=[];this.buffers.push(r);const i=u();return this.buffers.pop(),r.forEach(n=>n()),i}}e.EventBufferer=o;class s{constructor(){this.listening=!1,this.inputEvent=S.None,this.inputEventListener=N.Disposable.None,this.emitter=new p({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(u){this.inputEvent=u,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=u(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}e.Relay=s}),define(Q[35],J([0,1,6]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isStandalone=e.isAndroid=e.isElectron=e.isEdgeLegacyWebView=e.isIPad=e.isWebkitWebView=e.isSafari=e.isChrome=e.isWebKit=e.isFirefox=e.getPixelRatio=e.getZoomFactor=e.onDidChangeZoomLevel=e.getTimeSinceLastZoomLevelChanged=e.getZoomLevel=void 0;class N{constructor(){this._zoomLevel=0,this._lastZoomLevelChangeTime=0,this._onDidChangeZoomLevel=new b.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this._zoomFactor=1}getZoomLevel(){return this._zoomLevel}getTimeSinceLastZoomLevelChanged(){return Date.now()-this._lastZoomLevelChangeTime}getZoomFactor(){return this._zoomFactor}getPixelRatio(){let c=document.createElement("canvas").getContext("2d"),o=window.devicePixelRatio||1,s=c.webkitBackingStorePixelRatio||c.mozBackingStorePixelRatio||c.msBackingStorePixelRatio||c.oBackingStorePixelRatio||c.backingStorePixelRatio||1;return o/s}}N.INSTANCE=new N;function M(){return N.INSTANCE.getZoomLevel()}e.getZoomLevel=M;function w(){return N.INSTANCE.getTimeSinceLastZoomLevelChanged()}e.getTimeSinceLastZoomLevelChanged=w;function S(p){return N.INSTANCE.onDidChangeZoomLevel(p)}e.onDidChangeZoomLevel=S;function C(){return N.INSTANCE.getZoomFactor()}e.getZoomFactor=C;function d(){return N.INSTANCE.getPixelRatio()}e.getPixelRatio=d;const g=navigator.userAgent;e.isFirefox=g.indexOf("Firefox")>=0,e.isWebKit=g.indexOf("AppleWebKit")>=0,e.isChrome=g.indexOf("Chrome")>=0,e.isSafari=!e.isChrome&&g.indexOf("Safari")>=0,e.isWebkitWebView=!e.isChrome&&!e.isSafari&&e.isWebKit,e.isIPad=g.indexOf("iPad")>=0||e.isSafari&&navigator.maxTouchPoints>0,e.isEdgeLegacyWebView=g.indexOf("Edge/")>=0&&g.indexOf("WebView/")>=0,e.isElectron=g.indexOf("Electron/")>=0,e.isAndroid=g.indexOf("Android")>=0,e.isStandalone=window.matchMedia&&window.matchMedia("(display-mode: standalone)").matches}),define(Q[151],J([0,1,35,17]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BrowserFeatures=void 0,e.BrowserFeatures={clipboard:{writeText:N.isNative||document.queryCommandSupported&&document.queryCommandSupported("copy")||!!(navigator&&navigator.clipboard&&navigator.clipboard.writeText),readText:N.isNative||!!(navigator&&navigator.clipboard&&navigator.clipboard.readText)},keyboard:(()=>N.isNative||b.isStandalone?0:navigator.keyboard||b.isSafari?1:2)(),touch:"ontouchstart"in window||navigator.maxTouchPoints>0||window.navigator.msMaxTouchPoints>0,pointerEvents:window.PointerEvent&&("ontouchstart"in window||window.navigator.maxTouchPoints>0||navigator.maxTouchPoints>0||window.navigator.msMaxTouchPoints>0)}}),define(Q[55],J([0,1,6]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.stop=e.stopEvent=e.domEvent=void 0;const N=(S,C,d)=>{const g=c=>p.fire(c),p=new b.Emitter({onFirstListenerAdd:()=>{S.addEventListener(C,g,d)},onLastListenerRemove:()=>{S.removeEventListener(C,g,d)}});return p.event};e.domEvent=N;function M(S){return S.preventDefault(),S.stopPropagation(),S}e.stopEvent=M;function w(S){return b.Event.map(S,M)}e.stop=w}),define(Q[56],J([0,1,35,39,17]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandardKeyboardEvent=void 0;let w=new Array(230),S=new Array(112);(function(){for(let a=0;a{l.token.onCancellationRequested(()=>{f(N.canceled())}),Promise.resolve(h).then(v=>{l.dispose(),_(v)},v=>{l.dispose(),f(v)})});return new class{cancel(){l.cancel()}then(_,f){return m.then(_,f)}catch(_){return this.then(void 0,_)}finally(_){return m.finally(_)}}}e.createCancelablePromise=S;function C(t,l,h){return Promise.race([t,new Promise(m=>l.onCancellationRequested(()=>m(h)))])}e.raceCancellation=C;class d{constructor(){this.activePromise=null,this.queuedPromise=null,this.queuedPromiseFactory=null}queue(l){if(this.activePromise){if(this.queuedPromiseFactory=l,!this.queuedPromise){const h=()=>{this.queuedPromise=null;const m=this.queue(this.queuedPromiseFactory);return this.queuedPromiseFactory=null,m};this.queuedPromise=new Promise(m=>{this.activePromise.then(h,h).then(m)})}return new Promise((h,m)=>{this.queuedPromise.then(h,m)})}return this.activePromise=l(),new Promise((h,m)=>{this.activePromise.then(_=>{this.activePromise=null,h(_)},_=>{this.activePromise=null,m(_)})})}}e.Throttler=d;class g{constructor(l){this.defaultDelay=l,this.timeout=null,this.completionPromise=null,this.doResolve=null,this.doReject=null,this.task=null}trigger(l,h=this.defaultDelay){return this.task=l,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new Promise((m,_)=>{this.doResolve=m,this.doReject=_}).then(()=>{if(this.completionPromise=null,this.doResolve=null,this.task){const m=this.task;return this.task=null,m()}})),this.timeout=setTimeout(()=>{this.timeout=null,this.doResolve&&this.doResolve(null)},h),this.completionPromise}isTriggered(){return this.timeout!==null}cancel(){this.cancelTimeout(),this.completionPromise&&(this.doReject&&this.doReject(N.canceled()),this.completionPromise=null)}cancelTimeout(){this.timeout!==null&&(clearTimeout(this.timeout),this.timeout=null)}dispose(){this.cancelTimeout()}}e.Delayer=g;class p{constructor(l){this.delayer=new g(l),this.throttler=new d}trigger(l,h){return this.delayer.trigger(()=>this.throttler.queue(l),h)}cancel(){this.delayer.cancel()}dispose(){this.delayer.dispose()}}e.ThrottledDelayer=p;function c(t,l){return l?new Promise((h,m)=>{const _=setTimeout(h,t);l.onCancellationRequested(()=>{clearTimeout(_),m(N.canceled())})}):S(h=>c(t,h))}e.timeout=c;function o(t,l=0){const h=setTimeout(t,l);return M.toDisposable(()=>clearTimeout(h))}e.disposableTimeout=o;function s(t,l=m=>!!m,h=null){let m=0;const _=t.length,f=()=>{if(m>=_)return Promise.resolve(h);const v=t[m++];return Promise.resolve(v()).then(L=>l(L)?Promise.resolve(L):f())};return f()}e.first=s;class a{constructor(l,h){this._token=-1,typeof l=="function"&&typeof h=="number"&&this.setIfNotSet(l,h)}dispose(){this.cancel()}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(l,h){this.cancel(),this._token=setTimeout(()=>{this._token=-1,l()},h)}setIfNotSet(l,h){this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,l()},h))}}e.TimeoutTimer=a;class u{constructor(){this._token=-1}dispose(){this.cancel()}cancel(){this._token!==-1&&(clearInterval(this._token),this._token=-1)}cancelAndSet(l,h){this.cancel(),this._token=setInterval(()=>{l()},h)}}e.IntervalTimer=u;class r{constructor(l,h){this.timeoutToken=-1,this.runner=l,this.timeout=h,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(l=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,l)}get delay(){return this.timeout}set delay(l){this.timeout=l}isScheduled(){return this.timeoutToken!==-1}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner&&this.runner()}}e.RunOnceScheduler=r,function(){if(typeof requestIdleCallback!="function"||typeof cancelIdleCallback!="function"){const t=Object.freeze({didTimeout:!0,timeRemaining(){return 15}});e.runWhenIdle=l=>{const h=setTimeout(()=>l(t));let m=!1;return{dispose(){m||(m=!0,clearTimeout(h))}}}}else e.runWhenIdle=(t,l)=>{const h=requestIdleCallback(t,typeof l=="number"?{timeout:l}:void 0);let m=!1;return{dispose(){m||(m=!0,cancelIdleCallback(h))}}}}();class i{constructor(l){this._didRun=!1,this._executor=()=>{try{this._value=l()}catch(h){this._error=h}finally{this._didRun=!0}},this._handle=e.runWhenIdle(()=>this._executor())}dispose(){this._handle.dispose()}get value(){if(this._didRun||(this._handle.dispose(),this._executor()),this._error)throw this._error;return this._value}}e.IdleValue=i;var n;(function(t){function l(f){return Ie(this,void 0,void 0,function*(){return typeof Promise.allSettled=="function"?h(f):m(f)})}t.allSettled=l;function h(f){return Ie(this,void 0,void 0,function*(){return Promise.allSettled(f)})}function m(f){return Ie(this,void 0,void 0,function*(){return Promise.all(f.map(v=>v.then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))})}function _(f){return Ie(this,void 0,void 0,function*(){let v;const y=yield Promise.all(f.map(L=>L.then(I=>I,I=>{v||(v=I)})));if(typeof v!="undefined")throw v;return y})}t.settled=_})(n=e.Promises||(e.Promises={}))}),define(Q[282],J([0,1,15,2]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarVisibilityController=void 0;class M extends N.Disposable{constructor(S,C,d){super();this._visibility=S,this._visibleClassName=C,this._invisibleClassName=d,this._domNode=null,this._isVisible=!1,this._isNeeded=!1,this._shouldBeVisible=!1,this._revealTimer=this._register(new b.TimeoutTimer)}applyVisibilitySetting(S){return this._visibility===2?!1:this._visibility===3?!0:S}setShouldBeVisible(S){const C=this.applyVisibilitySetting(S);this._shouldBeVisible!==C&&(this._shouldBeVisible=C,this.ensureVisibility())}setIsNeeded(S){this._isNeeded!==S&&(this._isNeeded=S,this.ensureVisibility())}setDomNode(S){this._domNode=S,this._domNode.setClassName(this._invisibleClassName),this.setShouldBeVisible(!1)}ensureVisibility(){if(!this._isNeeded){this._hide(!1);return}this._shouldBeVisible?this._reveal():this._hide(!0)}_reveal(){this._isVisible||(this._isVisible=!0,this._revealTimer.setIfNotSet(()=>{this._domNode&&this._domNode.setClassName(this._visibleClassName)},0))}_hide(S){this._revealTimer.cancel(),!!this._isVisible&&(this._isVisible=!1,this._domNode&&this._domNode.setClassName(this._invisibleClassName+(S?" fade":"")))}}e.ScrollbarVisibilityController=M}),define(Q[27],J([0,1,6]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CSSIcon=e.Codicon=e.registerCodicon=e.iconRegistry=void 0;class N{constructor(){this._icons=new Map,this._onDidRegister=new b.Emitter}add(g){const p=this._icons.get(g.id);p?g.description?p.description=g.description:console.error(`Duplicate registration of codicon ${g.id}`):(this._icons.set(g.id,g),this._onDidRegister.fire(g))}get(g){return this._icons.get(g)}get all(){return this._icons.values()}get onDidRegister(){return this._onDidRegister.event}}const M=new N;e.iconRegistry=M;function w(d,g){return new S(d,g)}e.registerCodicon=w;class S{constructor(g,p,c){this.id=g,this.definition=p,this.description=c,M.add(this)}get classNames(){return"codicon codicon-"+this.id}get classNamesArray(){return["codicon","codicon-"+this.id]}get cssSelector(){return".codicon.codicon-"+this.id}}e.Codicon=S;var C;(function(d){d.iconNameSegment="[A-Za-z0-9]+",d.iconNameExpression="[A-Za-z0-9\\-]+",d.iconModifierExpression="~[A-Za-z]+";const g=new RegExp(`^(${d.iconNameExpression})(${d.iconModifierExpression})?$`);function p(s){if(s instanceof S)return["codicon","codicon-"+s.id];const a=g.exec(s.id);if(!a)return p(S.error);let[,u,r]=a;const i=["codicon","codicon-"+u];return r&&i.push("codicon-modifier-"+r.substr(1)),i}d.asClassNameArray=p;function c(s){return p(s).join(" ")}d.asClassName=c;function o(s){return"."+p(s).join(".")}d.asCSSSelector=o})(C=e.CSSIcon||(e.CSSIcon={})),function(d){d.add=new d("add",{fontCharacter:"\\ea60"}),d.plus=new d("plus",{fontCharacter:"\\ea60"}),d.gistNew=new d("gist-new",{fontCharacter:"\\ea60"}),d.repoCreate=new d("repo-create",{fontCharacter:"\\ea60"}),d.lightbulb=new d("lightbulb",{fontCharacter:"\\ea61"}),d.lightBulb=new d("light-bulb",{fontCharacter:"\\ea61"}),d.repo=new d("repo",{fontCharacter:"\\ea62"}),d.repoDelete=new d("repo-delete",{fontCharacter:"\\ea62"}),d.gistFork=new d("gist-fork",{fontCharacter:"\\ea63"}),d.repoForked=new d("repo-forked",{fontCharacter:"\\ea63"}),d.gitPullRequest=new d("git-pull-request",{fontCharacter:"\\ea64"}),d.gitPullRequestAbandoned=new d("git-pull-request-abandoned",{fontCharacter:"\\ea64"}),d.recordKeys=new d("record-keys",{fontCharacter:"\\ea65"}),d.keyboard=new d("keyboard",{fontCharacter:"\\ea65"}),d.tag=new d("tag",{fontCharacter:"\\ea66"}),d.tagAdd=new d("tag-add",{fontCharacter:"\\ea66"}),d.tagRemove=new d("tag-remove",{fontCharacter:"\\ea66"}),d.person=new d("person",{fontCharacter:"\\ea67"}),d.personAdd=new d("person-add",{fontCharacter:"\\ea67"}),d.personFollow=new d("person-follow",{fontCharacter:"\\ea67"}),d.personOutline=new d("person-outline",{fontCharacter:"\\ea67"}),d.personFilled=new d("person-filled",{fontCharacter:"\\ea67"}),d.gitBranch=new d("git-branch",{fontCharacter:"\\ea68"}),d.gitBranchCreate=new d("git-branch-create",{fontCharacter:"\\ea68"}),d.gitBranchDelete=new d("git-branch-delete",{fontCharacter:"\\ea68"}),d.sourceControl=new d("source-control",{fontCharacter:"\\ea68"}),d.mirror=new d("mirror",{fontCharacter:"\\ea69"}),d.mirrorPublic=new d("mirror-public",{fontCharacter:"\\ea69"}),d.star=new d("star",{fontCharacter:"\\ea6a"}),d.starAdd=new d("star-add",{fontCharacter:"\\ea6a"}),d.starDelete=new d("star-delete",{fontCharacter:"\\ea6a"}),d.starEmpty=new d("star-empty",{fontCharacter:"\\ea6a"}),d.comment=new d("comment",{fontCharacter:"\\ea6b"}),d.commentAdd=new d("comment-add",{fontCharacter:"\\ea6b"}),d.alert=new d("alert",{fontCharacter:"\\ea6c"}),d.warning=new d("warning",{fontCharacter:"\\ea6c"}),d.search=new d("search",{fontCharacter:"\\ea6d"}),d.searchSave=new d("search-save",{fontCharacter:"\\ea6d"}),d.logOut=new d("log-out",{fontCharacter:"\\ea6e"}),d.signOut=new d("sign-out",{fontCharacter:"\\ea6e"}),d.logIn=new d("log-in",{fontCharacter:"\\ea6f"}),d.signIn=new d("sign-in",{fontCharacter:"\\ea6f"}),d.eye=new d("eye",{fontCharacter:"\\ea70"}),d.eyeUnwatch=new d("eye-unwatch",{fontCharacter:"\\ea70"}),d.eyeWatch=new d("eye-watch",{fontCharacter:"\\ea70"}),d.circleFilled=new d("circle-filled",{fontCharacter:"\\ea71"}),d.primitiveDot=new d("primitive-dot",{fontCharacter:"\\ea71"}),d.closeDirty=new d("close-dirty",{fontCharacter:"\\ea71"}),d.debugBreakpoint=new d("debug-breakpoint",{fontCharacter:"\\ea71"}),d.debugBreakpointDisabled=new d("debug-breakpoint-disabled",{fontCharacter:"\\ea71"}),d.debugHint=new d("debug-hint",{fontCharacter:"\\ea71"}),d.primitiveSquare=new d("primitive-square",{fontCharacter:"\\ea72"}),d.edit=new d("edit",{fontCharacter:"\\ea73"}),d.pencil=new d("pencil",{fontCharacter:"\\ea73"}),d.info=new d("info",{fontCharacter:"\\ea74"}),d.issueOpened=new d("issue-opened",{fontCharacter:"\\ea74"}),d.gistPrivate=new d("gist-private",{fontCharacter:"\\ea75"}),d.gitForkPrivate=new d("git-fork-private",{fontCharacter:"\\ea75"}),d.lock=new d("lock",{fontCharacter:"\\ea75"}),d.mirrorPrivate=new d("mirror-private",{fontCharacter:"\\ea75"}),d.close=new d("close",{fontCharacter:"\\ea76"}),d.removeClose=new d("remove-close",{fontCharacter:"\\ea76"}),d.x=new d("x",{fontCharacter:"\\ea76"}),d.repoSync=new d("repo-sync",{fontCharacter:"\\ea77"}),d.sync=new d("sync",{fontCharacter:"\\ea77"}),d.clone=new d("clone",{fontCharacter:"\\ea78"}),d.desktopDownload=new d("desktop-download",{fontCharacter:"\\ea78"}),d.beaker=new d("beaker",{fontCharacter:"\\ea79"}),d.microscope=new d("microscope",{fontCharacter:"\\ea79"}),d.vm=new d("vm",{fontCharacter:"\\ea7a"}),d.deviceDesktop=new d("device-desktop",{fontCharacter:"\\ea7a"}),d.file=new d("file",{fontCharacter:"\\ea7b"}),d.fileText=new d("file-text",{fontCharacter:"\\ea7b"}),d.more=new d("more",{fontCharacter:"\\ea7c"}),d.ellipsis=new d("ellipsis",{fontCharacter:"\\ea7c"}),d.kebabHorizontal=new d("kebab-horizontal",{fontCharacter:"\\ea7c"}),d.mailReply=new d("mail-reply",{fontCharacter:"\\ea7d"}),d.reply=new d("reply",{fontCharacter:"\\ea7d"}),d.organization=new d("organization",{fontCharacter:"\\ea7e"}),d.organizationFilled=new d("organization-filled",{fontCharacter:"\\ea7e"}),d.organizationOutline=new d("organization-outline",{fontCharacter:"\\ea7e"}),d.newFile=new d("new-file",{fontCharacter:"\\ea7f"}),d.fileAdd=new d("file-add",{fontCharacter:"\\ea7f"}),d.newFolder=new d("new-folder",{fontCharacter:"\\ea80"}),d.fileDirectoryCreate=new d("file-directory-create",{fontCharacter:"\\ea80"}),d.trash=new d("trash",{fontCharacter:"\\ea81"}),d.trashcan=new d("trashcan",{fontCharacter:"\\ea81"}),d.history=new d("history",{fontCharacter:"\\ea82"}),d.clock=new d("clock",{fontCharacter:"\\ea82"}),d.folder=new d("folder",{fontCharacter:"\\ea83"}),d.fileDirectory=new d("file-directory",{fontCharacter:"\\ea83"}),d.symbolFolder=new d("symbol-folder",{fontCharacter:"\\ea83"}),d.logoGithub=new d("logo-github",{fontCharacter:"\\ea84"}),d.markGithub=new d("mark-github",{fontCharacter:"\\ea84"}),d.github=new d("github",{fontCharacter:"\\ea84"}),d.terminal=new d("terminal",{fontCharacter:"\\ea85"}),d.console=new d("console",{fontCharacter:"\\ea85"}),d.repl=new d("repl",{fontCharacter:"\\ea85"}),d.zap=new d("zap",{fontCharacter:"\\ea86"}),d.symbolEvent=new d("symbol-event",{fontCharacter:"\\ea86"}),d.error=new d("error",{fontCharacter:"\\ea87"}),d.stop=new d("stop",{fontCharacter:"\\ea87"}),d.variable=new d("variable",{fontCharacter:"\\ea88"}),d.symbolVariable=new d("symbol-variable",{fontCharacter:"\\ea88"}),d.array=new d("array",{fontCharacter:"\\ea8a"}),d.symbolArray=new d("symbol-array",{fontCharacter:"\\ea8a"}),d.symbolModule=new d("symbol-module",{fontCharacter:"\\ea8b"}),d.symbolPackage=new d("symbol-package",{fontCharacter:"\\ea8b"}),d.symbolNamespace=new d("symbol-namespace",{fontCharacter:"\\ea8b"}),d.symbolObject=new d("symbol-object",{fontCharacter:"\\ea8b"}),d.symbolMethod=new d("symbol-method",{fontCharacter:"\\ea8c"}),d.symbolFunction=new d("symbol-function",{fontCharacter:"\\ea8c"}),d.symbolConstructor=new d("symbol-constructor",{fontCharacter:"\\ea8c"}),d.symbolBoolean=new d("symbol-boolean",{fontCharacter:"\\ea8f"}),d.symbolNull=new d("symbol-null",{fontCharacter:"\\ea8f"}),d.symbolNumeric=new d("symbol-numeric",{fontCharacter:"\\ea90"}),d.symbolNumber=new d("symbol-number",{fontCharacter:"\\ea90"}),d.symbolStructure=new d("symbol-structure",{fontCharacter:"\\ea91"}),d.symbolStruct=new d("symbol-struct",{fontCharacter:"\\ea91"}),d.symbolParameter=new d("symbol-parameter",{fontCharacter:"\\ea92"}),d.symbolTypeParameter=new d("symbol-type-parameter",{fontCharacter:"\\ea92"}),d.symbolKey=new d("symbol-key",{fontCharacter:"\\ea93"}),d.symbolText=new d("symbol-text",{fontCharacter:"\\ea93"}),d.symbolReference=new d("symbol-reference",{fontCharacter:"\\ea94"}),d.goToFile=new d("go-to-file",{fontCharacter:"\\ea94"}),d.symbolEnum=new d("symbol-enum",{fontCharacter:"\\ea95"}),d.symbolValue=new d("symbol-value",{fontCharacter:"\\ea95"}),d.symbolRuler=new d("symbol-ruler",{fontCharacter:"\\ea96"}),d.symbolUnit=new d("symbol-unit",{fontCharacter:"\\ea96"}),d.activateBreakpoints=new d("activate-breakpoints",{fontCharacter:"\\ea97"}),d.archive=new d("archive",{fontCharacter:"\\ea98"}),d.arrowBoth=new d("arrow-both",{fontCharacter:"\\ea99"}),d.arrowDown=new d("arrow-down",{fontCharacter:"\\ea9a"}),d.arrowLeft=new d("arrow-left",{fontCharacter:"\\ea9b"}),d.arrowRight=new d("arrow-right",{fontCharacter:"\\ea9c"}),d.arrowSmallDown=new d("arrow-small-down",{fontCharacter:"\\ea9d"}),d.arrowSmallLeft=new d("arrow-small-left",{fontCharacter:"\\ea9e"}),d.arrowSmallRight=new d("arrow-small-right",{fontCharacter:"\\ea9f"}),d.arrowSmallUp=new d("arrow-small-up",{fontCharacter:"\\eaa0"}),d.arrowUp=new d("arrow-up",{fontCharacter:"\\eaa1"}),d.bell=new d("bell",{fontCharacter:"\\eaa2"}),d.bold=new d("bold",{fontCharacter:"\\eaa3"}),d.book=new d("book",{fontCharacter:"\\eaa4"}),d.bookmark=new d("bookmark",{fontCharacter:"\\eaa5"}),d.debugBreakpointConditionalUnverified=new d("debug-breakpoint-conditional-unverified",{fontCharacter:"\\eaa6"}),d.debugBreakpointConditional=new d("debug-breakpoint-conditional",{fontCharacter:"\\eaa7"}),d.debugBreakpointConditionalDisabled=new d("debug-breakpoint-conditional-disabled",{fontCharacter:"\\eaa7"}),d.debugBreakpointDataUnverified=new d("debug-breakpoint-data-unverified",{fontCharacter:"\\eaa8"}),d.debugBreakpointData=new d("debug-breakpoint-data",{fontCharacter:"\\eaa9"}),d.debugBreakpointDataDisabled=new d("debug-breakpoint-data-disabled",{fontCharacter:"\\eaa9"}),d.debugBreakpointLogUnverified=new d("debug-breakpoint-log-unverified",{fontCharacter:"\\eaaa"}),d.debugBreakpointLog=new d("debug-breakpoint-log",{fontCharacter:"\\eaab"}),d.debugBreakpointLogDisabled=new d("debug-breakpoint-log-disabled",{fontCharacter:"\\eaab"}),d.briefcase=new d("briefcase",{fontCharacter:"\\eaac"}),d.broadcast=new d("broadcast",{fontCharacter:"\\eaad"}),d.browser=new d("browser",{fontCharacter:"\\eaae"}),d.bug=new d("bug",{fontCharacter:"\\eaaf"}),d.calendar=new d("calendar",{fontCharacter:"\\eab0"}),d.caseSensitive=new d("case-sensitive",{fontCharacter:"\\eab1"}),d.check=new d("check",{fontCharacter:"\\eab2"}),d.checklist=new d("checklist",{fontCharacter:"\\eab3"}),d.chevronDown=new d("chevron-down",{fontCharacter:"\\eab4"}),d.chevronLeft=new d("chevron-left",{fontCharacter:"\\eab5"}),d.chevronRight=new d("chevron-right",{fontCharacter:"\\eab6"}),d.chevronUp=new d("chevron-up",{fontCharacter:"\\eab7"}),d.chromeClose=new d("chrome-close",{fontCharacter:"\\eab8"}),d.chromeMaximize=new d("chrome-maximize",{fontCharacter:"\\eab9"}),d.chromeMinimize=new d("chrome-minimize",{fontCharacter:"\\eaba"}),d.chromeRestore=new d("chrome-restore",{fontCharacter:"\\eabb"}),d.circleOutline=new d("circle-outline",{fontCharacter:"\\eabc"}),d.debugBreakpointUnverified=new d("debug-breakpoint-unverified",{fontCharacter:"\\eabc"}),d.circleSlash=new d("circle-slash",{fontCharacter:"\\eabd"}),d.circuitBoard=new d("circuit-board",{fontCharacter:"\\eabe"}),d.clearAll=new d("clear-all",{fontCharacter:"\\eabf"}),d.clippy=new d("clippy",{fontCharacter:"\\eac0"}),d.closeAll=new d("close-all",{fontCharacter:"\\eac1"}),d.cloudDownload=new d("cloud-download",{fontCharacter:"\\eac2"}),d.cloudUpload=new d("cloud-upload",{fontCharacter:"\\eac3"}),d.code=new d("code",{fontCharacter:"\\eac4"}),d.collapseAll=new d("collapse-all",{fontCharacter:"\\eac5"}),d.colorMode=new d("color-mode",{fontCharacter:"\\eac6"}),d.commentDiscussion=new d("comment-discussion",{fontCharacter:"\\eac7"}),d.compareChanges=new d("compare-changes",{fontCharacter:"\\eafd"}),d.creditCard=new d("credit-card",{fontCharacter:"\\eac9"}),d.dash=new d("dash",{fontCharacter:"\\eacc"}),d.dashboard=new d("dashboard",{fontCharacter:"\\eacd"}),d.database=new d("database",{fontCharacter:"\\eace"}),d.debugContinue=new d("debug-continue",{fontCharacter:"\\eacf"}),d.debugDisconnect=new d("debug-disconnect",{fontCharacter:"\\ead0"}),d.debugPause=new d("debug-pause",{fontCharacter:"\\ead1"}),d.debugRestart=new d("debug-restart",{fontCharacter:"\\ead2"}),d.debugStart=new d("debug-start",{fontCharacter:"\\ead3"}),d.debugStepInto=new d("debug-step-into",{fontCharacter:"\\ead4"}),d.debugStepOut=new d("debug-step-out",{fontCharacter:"\\ead5"}),d.debugStepOver=new d("debug-step-over",{fontCharacter:"\\ead6"}),d.debugStop=new d("debug-stop",{fontCharacter:"\\ead7"}),d.debug=new d("debug",{fontCharacter:"\\ead8"}),d.deviceCameraVideo=new d("device-camera-video",{fontCharacter:"\\ead9"}),d.deviceCamera=new d("device-camera",{fontCharacter:"\\eada"}),d.deviceMobile=new d("device-mobile",{fontCharacter:"\\eadb"}),d.diffAdded=new d("diff-added",{fontCharacter:"\\eadc"}),d.diffIgnored=new d("diff-ignored",{fontCharacter:"\\eadd"}),d.diffModified=new d("diff-modified",{fontCharacter:"\\eade"}),d.diffRemoved=new d("diff-removed",{fontCharacter:"\\eadf"}),d.diffRenamed=new d("diff-renamed",{fontCharacter:"\\eae0"}),d.diff=new d("diff",{fontCharacter:"\\eae1"}),d.discard=new d("discard",{fontCharacter:"\\eae2"}),d.editorLayout=new d("editor-layout",{fontCharacter:"\\eae3"}),d.emptyWindow=new d("empty-window",{fontCharacter:"\\eae4"}),d.exclude=new d("exclude",{fontCharacter:"\\eae5"}),d.extensions=new d("extensions",{fontCharacter:"\\eae6"}),d.eyeClosed=new d("eye-closed",{fontCharacter:"\\eae7"}),d.fileBinary=new d("file-binary",{fontCharacter:"\\eae8"}),d.fileCode=new d("file-code",{fontCharacter:"\\eae9"}),d.fileMedia=new d("file-media",{fontCharacter:"\\eaea"}),d.filePdf=new d("file-pdf",{fontCharacter:"\\eaeb"}),d.fileSubmodule=new d("file-submodule",{fontCharacter:"\\eaec"}),d.fileSymlinkDirectory=new d("file-symlink-directory",{fontCharacter:"\\eaed"}),d.fileSymlinkFile=new d("file-symlink-file",{fontCharacter:"\\eaee"}),d.fileZip=new d("file-zip",{fontCharacter:"\\eaef"}),d.files=new d("files",{fontCharacter:"\\eaf0"}),d.filter=new d("filter",{fontCharacter:"\\eaf1"}),d.flame=new d("flame",{fontCharacter:"\\eaf2"}),d.foldDown=new d("fold-down",{fontCharacter:"\\eaf3"}),d.foldUp=new d("fold-up",{fontCharacter:"\\eaf4"}),d.fold=new d("fold",{fontCharacter:"\\eaf5"}),d.folderActive=new d("folder-active",{fontCharacter:"\\eaf6"}),d.folderOpened=new d("folder-opened",{fontCharacter:"\\eaf7"}),d.gear=new d("gear",{fontCharacter:"\\eaf8"}),d.gift=new d("gift",{fontCharacter:"\\eaf9"}),d.gistSecret=new d("gist-secret",{fontCharacter:"\\eafa"}),d.gist=new d("gist",{fontCharacter:"\\eafb"}),d.gitCommit=new d("git-commit",{fontCharacter:"\\eafc"}),d.gitCompare=new d("git-compare",{fontCharacter:"\\eafd"}),d.gitMerge=new d("git-merge",{fontCharacter:"\\eafe"}),d.githubAction=new d("github-action",{fontCharacter:"\\eaff"}),d.githubAlt=new d("github-alt",{fontCharacter:"\\eb00"}),d.globe=new d("globe",{fontCharacter:"\\eb01"}),d.grabber=new d("grabber",{fontCharacter:"\\eb02"}),d.graph=new d("graph",{fontCharacter:"\\eb03"}),d.gripper=new d("gripper",{fontCharacter:"\\eb04"}),d.heart=new d("heart",{fontCharacter:"\\eb05"}),d.home=new d("home",{fontCharacter:"\\eb06"}),d.horizontalRule=new d("horizontal-rule",{fontCharacter:"\\eb07"}),d.hubot=new d("hubot",{fontCharacter:"\\eb08"}),d.inbox=new d("inbox",{fontCharacter:"\\eb09"}),d.issueClosed=new d("issue-closed",{fontCharacter:"\\eb0a"}),d.issueReopened=new d("issue-reopened",{fontCharacter:"\\eb0b"}),d.issues=new d("issues",{fontCharacter:"\\eb0c"}),d.italic=new d("italic",{fontCharacter:"\\eb0d"}),d.jersey=new d("jersey",{fontCharacter:"\\eb0e"}),d.json=new d("json",{fontCharacter:"\\eb0f"}),d.kebabVertical=new d("kebab-vertical",{fontCharacter:"\\eb10"}),d.key=new d("key",{fontCharacter:"\\eb11"}),d.law=new d("law",{fontCharacter:"\\eb12"}),d.lightbulbAutofix=new d("lightbulb-autofix",{fontCharacter:"\\eb13"}),d.linkExternal=new d("link-external",{fontCharacter:"\\eb14"}),d.link=new d("link",{fontCharacter:"\\eb15"}),d.listOrdered=new d("list-ordered",{fontCharacter:"\\eb16"}),d.listUnordered=new d("list-unordered",{fontCharacter:"\\eb17"}),d.liveShare=new d("live-share",{fontCharacter:"\\eb18"}),d.loading=new d("loading",{fontCharacter:"\\eb19"}),d.location=new d("location",{fontCharacter:"\\eb1a"}),d.mailRead=new d("mail-read",{fontCharacter:"\\eb1b"}),d.mail=new d("mail",{fontCharacter:"\\eb1c"}),d.markdown=new d("markdown",{fontCharacter:"\\eb1d"}),d.megaphone=new d("megaphone",{fontCharacter:"\\eb1e"}),d.mention=new d("mention",{fontCharacter:"\\eb1f"}),d.milestone=new d("milestone",{fontCharacter:"\\eb20"}),d.mortarBoard=new d("mortar-board",{fontCharacter:"\\eb21"}),d.move=new d("move",{fontCharacter:"\\eb22"}),d.multipleWindows=new d("multiple-windows",{fontCharacter:"\\eb23"}),d.mute=new d("mute",{fontCharacter:"\\eb24"}),d.noNewline=new d("no-newline",{fontCharacter:"\\eb25"}),d.note=new d("note",{fontCharacter:"\\eb26"}),d.octoface=new d("octoface",{fontCharacter:"\\eb27"}),d.openPreview=new d("open-preview",{fontCharacter:"\\eb28"}),d.package_=new d("package",{fontCharacter:"\\eb29"}),d.paintcan=new d("paintcan",{fontCharacter:"\\eb2a"}),d.pin=new d("pin",{fontCharacter:"\\eb2b"}),d.play=new d("play",{fontCharacter:"\\eb2c"}),d.run=new d("run",{fontCharacter:"\\eb2c"}),d.plug=new d("plug",{fontCharacter:"\\eb2d"}),d.preserveCase=new d("preserve-case",{fontCharacter:"\\eb2e"}),d.preview=new d("preview",{fontCharacter:"\\eb2f"}),d.project=new d("project",{fontCharacter:"\\eb30"}),d.pulse=new d("pulse",{fontCharacter:"\\eb31"}),d.question=new d("question",{fontCharacter:"\\eb32"}),d.quote=new d("quote",{fontCharacter:"\\eb33"}),d.radioTower=new d("radio-tower",{fontCharacter:"\\eb34"}),d.reactions=new d("reactions",{fontCharacter:"\\eb35"}),d.references=new d("references",{fontCharacter:"\\eb36"}),d.refresh=new d("refresh",{fontCharacter:"\\eb37"}),d.regex=new d("regex",{fontCharacter:"\\eb38"}),d.remoteExplorer=new d("remote-explorer",{fontCharacter:"\\eb39"}),d.remote=new d("remote",{fontCharacter:"\\eb3a"}),d.remove=new d("remove",{fontCharacter:"\\eb3b"}),d.replaceAll=new d("replace-all",{fontCharacter:"\\eb3c"}),d.replace=new d("replace",{fontCharacter:"\\eb3d"}),d.repoClone=new d("repo-clone",{fontCharacter:"\\eb3e"}),d.repoForcePush=new d("repo-force-push",{fontCharacter:"\\eb3f"}),d.repoPull=new d("repo-pull",{fontCharacter:"\\eb40"}),d.repoPush=new d("repo-push",{fontCharacter:"\\eb41"}),d.report=new d("report",{fontCharacter:"\\eb42"}),d.requestChanges=new d("request-changes",{fontCharacter:"\\eb43"}),d.rocket=new d("rocket",{fontCharacter:"\\eb44"}),d.rootFolderOpened=new d("root-folder-opened",{fontCharacter:"\\eb45"}),d.rootFolder=new d("root-folder",{fontCharacter:"\\eb46"}),d.rss=new d("rss",{fontCharacter:"\\eb47"}),d.ruby=new d("ruby",{fontCharacter:"\\eb48"}),d.saveAll=new d("save-all",{fontCharacter:"\\eb49"}),d.saveAs=new d("save-as",{fontCharacter:"\\eb4a"}),d.save=new d("save",{fontCharacter:"\\eb4b"}),d.screenFull=new d("screen-full",{fontCharacter:"\\eb4c"}),d.screenNormal=new d("screen-normal",{fontCharacter:"\\eb4d"}),d.searchStop=new d("search-stop",{fontCharacter:"\\eb4e"}),d.server=new d("server",{fontCharacter:"\\eb50"}),d.settingsGear=new d("settings-gear",{fontCharacter:"\\eb51"}),d.settings=new d("settings",{fontCharacter:"\\eb52"}),d.shield=new d("shield",{fontCharacter:"\\eb53"}),d.smiley=new d("smiley",{fontCharacter:"\\eb54"}),d.sortPrecedence=new d("sort-precedence",{fontCharacter:"\\eb55"}),d.splitHorizontal=new d("split-horizontal",{fontCharacter:"\\eb56"}),d.splitVertical=new d("split-vertical",{fontCharacter:"\\eb57"}),d.squirrel=new d("squirrel",{fontCharacter:"\\eb58"}),d.starFull=new d("star-full",{fontCharacter:"\\eb59"}),d.starHalf=new d("star-half",{fontCharacter:"\\eb5a"}),d.symbolClass=new d("symbol-class",{fontCharacter:"\\eb5b"}),d.symbolColor=new d("symbol-color",{fontCharacter:"\\eb5c"}),d.symbolConstant=new d("symbol-constant",{fontCharacter:"\\eb5d"}),d.symbolEnumMember=new d("symbol-enum-member",{fontCharacter:"\\eb5e"}),d.symbolField=new d("symbol-field",{fontCharacter:"\\eb5f"}),d.symbolFile=new d("symbol-file",{fontCharacter:"\\eb60"}),d.symbolInterface=new d("symbol-interface",{fontCharacter:"\\eb61"}),d.symbolKeyword=new d("symbol-keyword",{fontCharacter:"\\eb62"}),d.symbolMisc=new d("symbol-misc",{fontCharacter:"\\eb63"}),d.symbolOperator=new d("symbol-operator",{fontCharacter:"\\eb64"}),d.symbolProperty=new d("symbol-property",{fontCharacter:"\\eb65"}),d.wrench=new d("wrench",{fontCharacter:"\\eb65"}),d.wrenchSubaction=new d("wrench-subaction",{fontCharacter:"\\eb65"}),d.symbolSnippet=new d("symbol-snippet",{fontCharacter:"\\eb66"}),d.tasklist=new d("tasklist",{fontCharacter:"\\eb67"}),d.telescope=new d("telescope",{fontCharacter:"\\eb68"}),d.textSize=new d("text-size",{fontCharacter:"\\eb69"}),d.threeBars=new d("three-bars",{fontCharacter:"\\eb6a"}),d.thumbsdown=new d("thumbsdown",{fontCharacter:"\\eb6b"}),d.thumbsup=new d("thumbsup",{fontCharacter:"\\eb6c"}),d.tools=new d("tools",{fontCharacter:"\\eb6d"}),d.triangleDown=new d("triangle-down",{fontCharacter:"\\eb6e"}),d.triangleLeft=new d("triangle-left",{fontCharacter:"\\eb6f"}),d.triangleRight=new d("triangle-right",{fontCharacter:"\\eb70"}),d.triangleUp=new d("triangle-up",{fontCharacter:"\\eb71"}),d.twitter=new d("twitter",{fontCharacter:"\\eb72"}),d.unfold=new d("unfold",{fontCharacter:"\\eb73"}),d.unlock=new d("unlock",{fontCharacter:"\\eb74"}),d.unmute=new d("unmute",{fontCharacter:"\\eb75"}),d.unverified=new d("unverified",{fontCharacter:"\\eb76"}),d.verified=new d("verified",{fontCharacter:"\\eb77"}),d.versions=new d("versions",{fontCharacter:"\\eb78"}),d.vmActive=new d("vm-active",{fontCharacter:"\\eb79"}),d.vmOutline=new d("vm-outline",{fontCharacter:"\\eb7a"}),d.vmRunning=new d("vm-running",{fontCharacter:"\\eb7b"}),d.watch=new d("watch",{fontCharacter:"\\eb7c"}),d.whitespace=new d("whitespace",{fontCharacter:"\\eb7d"}),d.wholeWord=new d("whole-word",{fontCharacter:"\\eb7e"}),d.window=new d("window",{fontCharacter:"\\eb7f"}),d.wordWrap=new d("word-wrap",{fontCharacter:"\\eb80"}),d.zoomIn=new d("zoom-in",{fontCharacter:"\\eb81"}),d.zoomOut=new d("zoom-out",{fontCharacter:"\\eb82"}),d.listFilter=new d("list-filter",{fontCharacter:"\\eb83"}),d.listFlat=new d("list-flat",{fontCharacter:"\\eb84"}),d.listSelection=new d("list-selection",{fontCharacter:"\\eb85"}),d.selection=new d("selection",{fontCharacter:"\\eb85"}),d.listTree=new d("list-tree",{fontCharacter:"\\eb86"}),d.debugBreakpointFunctionUnverified=new d("debug-breakpoint-function-unverified",{fontCharacter:"\\eb87"}),d.debugBreakpointFunction=new d("debug-breakpoint-function",{fontCharacter:"\\eb88"}),d.debugBreakpointFunctionDisabled=new d("debug-breakpoint-function-disabled",{fontCharacter:"\\eb88"}),d.debugStackframeActive=new d("debug-stackframe-active",{fontCharacter:"\\eb89"}),d.debugStackframeDot=new d("debug-stackframe-dot",{fontCharacter:"\\eb8a"}),d.debugStackframe=new d("debug-stackframe",{fontCharacter:"\\eb8b"}),d.debugStackframeFocused=new d("debug-stackframe-focused",{fontCharacter:"\\eb8b"}),d.debugBreakpointUnsupported=new d("debug-breakpoint-unsupported",{fontCharacter:"\\eb8c"}),d.symbolString=new d("symbol-string",{fontCharacter:"\\eb8d"}),d.debugReverseContinue=new d("debug-reverse-continue",{fontCharacter:"\\eb8e"}),d.debugStepBack=new d("debug-step-back",{fontCharacter:"\\eb8f"}),d.debugRestartFrame=new d("debug-restart-frame",{fontCharacter:"\\eb90"}),d.callIncoming=new d("call-incoming",{fontCharacter:"\\eb92"}),d.callOutgoing=new d("call-outgoing",{fontCharacter:"\\eb93"}),d.menu=new d("menu",{fontCharacter:"\\eb94"}),d.expandAll=new d("expand-all",{fontCharacter:"\\eb95"}),d.feedback=new d("feedback",{fontCharacter:"\\eb96"}),d.groupByRefType=new d("group-by-ref-type",{fontCharacter:"\\eb97"}),d.ungroupByRefType=new d("ungroup-by-ref-type",{fontCharacter:"\\eb98"}),d.account=new d("account",{fontCharacter:"\\eb99"}),d.bellDot=new d("bell-dot",{fontCharacter:"\\eb9a"}),d.debugConsole=new d("debug-console",{fontCharacter:"\\eb9b"}),d.library=new d("library",{fontCharacter:"\\eb9c"}),d.output=new d("output",{fontCharacter:"\\eb9d"}),d.runAll=new d("run-all",{fontCharacter:"\\eb9e"}),d.syncIgnored=new d("sync-ignored",{fontCharacter:"\\eb9f"}),d.pinned=new d("pinned",{fontCharacter:"\\eba0"}),d.githubInverted=new d("github-inverted",{fontCharacter:"\\eba1"}),d.debugAlt=new d("debug-alt",{fontCharacter:"\\eb91"}),d.serverProcess=new d("server-process",{fontCharacter:"\\eba2"}),d.serverEnvironment=new d("server-environment",{fontCharacter:"\\eba3"}),d.pass=new d("pass",{fontCharacter:"\\eba4"}),d.stopCircle=new d("stop-circle",{fontCharacter:"\\eba5"}),d.playCircle=new d("play-circle",{fontCharacter:"\\eba6"}),d.record=new d("record",{fontCharacter:"\\eba7"}),d.debugAltSmall=new d("debug-alt-small",{fontCharacter:"\\eba8"}),d.vmConnect=new d("vm-connect",{fontCharacter:"\\eba9"}),d.cloud=new d("cloud",{fontCharacter:"\\ebaa"}),d.merge=new d("merge",{fontCharacter:"\\ebab"}),d.exportIcon=new d("export",{fontCharacter:"\\ebac"}),d.graphLeft=new d("graph-left",{fontCharacter:"\\ebad"}),d.magnet=new d("magnet",{fontCharacter:"\\ebae"}),d.notebook=new d("notebook",{fontCharacter:"\\ebaf"}),d.redo=new d("redo",{fontCharacter:"\\ebb0"}),d.checkAll=new d("check-all",{fontCharacter:"\\ebb1"}),d.pinnedDirty=new d("pinned-dirty",{fontCharacter:"\\ebb2"}),d.passFilled=new d("pass-filled",{fontCharacter:"\\ebb3"}),d.circleLargeFilled=new d("circle-large-filled",{fontCharacter:"\\ebb4"}),d.circleLargeOutline=new d("circle-large-outline",{fontCharacter:"\\ebb5"}),d.combine=new d("combine",{fontCharacter:"\\ebb6"}),d.gather=new d("gather",{fontCharacter:"\\ebb6"}),d.table=new d("table",{fontCharacter:"\\ebb7"}),d.variableGroup=new d("variable-group",{fontCharacter:"\\ebb8"}),d.typeHierarchy=new d("type-hierarchy",{fontCharacter:"\\ebb9"}),d.typeHierarchySub=new d("type-hierarchy-sub",{fontCharacter:"\\ebba"}),d.typeHierarchySuper=new d("type-hierarchy-super",{fontCharacter:"\\ebbb"}),d.gitPullRequestCreate=new d("git-pull-request-create",{fontCharacter:"\\ebbc"}),d.runAbove=new d("run-above",{fontCharacter:"\\ebbd"}),d.runBelow=new d("run-below",{fontCharacter:"\\ebbe"}),d.notebookTemplate=new d("notebook-template",{fontCharacter:"\\ebbf"}),d.debugRerun=new d("debug-rerun",{fontCharacter:"\\ebc0"}),d.dropDownButton=new d("drop-down-button",d.chevronDown.definition)}(S=e.Codicon||(e.Codicon={}))}),define(Q[197],J([0,1,27]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.treeItemLoadingIcon=e.treeFilterClearIcon=e.treeFilterOnTypeOffIcon=e.treeFilterOnTypeOnIcon=e.treeItemExpandedIcon=void 0,e.treeItemExpandedIcon=b.registerCodicon("tree-item-expanded",b.Codicon.chevronDown),e.treeFilterOnTypeOnIcon=b.registerCodicon("tree-filter-on-type-on",b.Codicon.listFilter),e.treeFilterOnTypeOffIcon=b.registerCodicon("tree-filter-on-type-off",b.Codicon.listSelection),e.treeFilterClearIcon=b.registerCodicon("tree-filter-clear",b.Codicon.close),e.treeItemLoadingIcon=b.registerCodicon("tree-item-loading",b.Codicon.loading)}),define(Q[283],J([0,1,15]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compareByPrefix=e.compareAnything=e.compareFileNames=void 0;const N=new b.IdleValue(()=>{const C=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});return{collator:C,collatorIsNumeric:C.resolvedOptions().numeric}});function M(C,d,g=!1){const p=C||"",c=d||"",o=N.value.collator.compare(p,c);return N.value.collatorIsNumeric&&o===0&&p!==c?pc.length)return 1}return 0}e.compareByPrefix=S}),define(Q[121],J([0,1,6,2]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SmoothScrollingOperation=e.SmoothScrollingUpdate=e.Scrollable=e.ScrollState=void 0;class M{constructor(s,a,u,r,i,n){s=s|0,a=a|0,u=u|0,r=r|0,i=i|0,n=n|0,this.rawScrollLeft=u,this.rawScrollTop=n,s<0&&(s=0),u+s>a&&(u=a-s),u<0&&(u=0),r<0&&(r=0),n+r>i&&(n=i-r),n<0&&(n=0),this.width=s,this.scrollWidth=a,this.scrollLeft=u,this.height=r,this.scrollHeight=i,this.scrollTop=n}equals(s){return this.rawScrollLeft===s.rawScrollLeft&&this.rawScrollTop===s.rawScrollTop&&this.width===s.width&&this.scrollWidth===s.scrollWidth&&this.scrollLeft===s.scrollLeft&&this.height===s.height&&this.scrollHeight===s.scrollHeight&&this.scrollTop===s.scrollTop}withScrollDimensions(s,a){return new M(typeof s.width!="undefined"?s.width:this.width,typeof s.scrollWidth!="undefined"?s.scrollWidth:this.scrollWidth,a?this.rawScrollLeft:this.scrollLeft,typeof s.height!="undefined"?s.height:this.height,typeof s.scrollHeight!="undefined"?s.scrollHeight:this.scrollHeight,a?this.rawScrollTop:this.scrollTop)}withScrollPosition(s){return new M(this.width,this.scrollWidth,typeof s.scrollLeft!="undefined"?s.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof s.scrollTop!="undefined"?s.scrollTop:this.rawScrollTop)}createScrollEvent(s,a){const u=this.width!==s.width,r=this.scrollWidth!==s.scrollWidth,i=this.scrollLeft!==s.scrollLeft,n=this.height!==s.height,t=this.scrollHeight!==s.scrollHeight,l=this.scrollTop!==s.scrollTop;return{inSmoothScrolling:a,oldWidth:s.width,oldScrollWidth:s.scrollWidth,oldScrollLeft:s.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:s.height,oldScrollHeight:s.scrollHeight,oldScrollTop:s.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:u,scrollWidthChanged:r,scrollLeftChanged:i,heightChanged:n,scrollHeightChanged:t,scrollTopChanged:l}}}e.ScrollState=M;class w extends N.Disposable{constructor(s,a){super();this._onScroll=this._register(new b.Emitter),this.onScroll=this._onScroll.event,this._smoothScrollDuration=s,this._scheduleAtNextAnimationFrame=a,this._state=new M(0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(s){this._smoothScrollDuration=s}validateScrollPosition(s){return this._state.withScrollPosition(s)}getScrollDimensions(){return this._state}setScrollDimensions(s,a){const u=this._state.withScrollDimensions(s,a);this._setState(u,Boolean(this._smoothScrolling)),this._smoothScrolling&&this._smoothScrolling.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(s){const a=this._state.withScrollPosition(s);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(a,!1)}setScrollPositionSmooth(s,a){if(this._smoothScrollDuration===0)return this.setScrollPositionNow(s);if(this._smoothScrolling){s={scrollLeft:typeof s.scrollLeft=="undefined"?this._smoothScrolling.to.scrollLeft:s.scrollLeft,scrollTop:typeof s.scrollTop=="undefined"?this._smoothScrolling.to.scrollTop:s.scrollTop};const u=this._state.withScrollPosition(s);if(this._smoothScrolling.to.scrollLeft===u.scrollLeft&&this._smoothScrolling.to.scrollTop===u.scrollTop)return;let r;a?r=new g(this._smoothScrolling.from,u,this._smoothScrolling.startTime,this._smoothScrolling.duration):r=this._smoothScrolling.combine(this._state,u,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=r}else{const u=this._state.withScrollPosition(s);this._smoothScrolling=g.start(this._state,u,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{!this._smoothScrolling||(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}_performSmoothScrolling(){if(!!this._smoothScrolling){const s=this._smoothScrolling.tick(),a=this._state.withScrollPosition(s);if(this._setState(a,!0),!!this._smoothScrolling){if(s.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{!this._smoothScrolling||(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}}_setState(s,a){const u=this._state;u.equals(s)||(this._state=s,this._onScroll.fire(this._state.createScrollEvent(u,a)))}}e.Scrollable=w;class S{constructor(s,a,u){this.scrollLeft=s,this.scrollTop=a,this.isDone=u}}e.SmoothScrollingUpdate=S;function C(o,s){const a=s-o;return function(u){return o+a*c(u)}}function d(o,s,a){return function(u){return u2.5*u){let i,n;return s=j.length?te:j[ue]})}e.format=M;function w(G){return G.replace(/[<>&]/g,function(j){switch(j){case"<":return"<";case">":return">";case"&":return"&";default:return j}})}e.escape=w;function S(G){return G.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}e.escapeRegExpCharacters=S;function C(G,j=" "){const te=d(G,j);return g(te,j)}e.trim=C;function d(G,j){if(!G||!j)return G;const te=j.length;if(te===0||G.length===0)return G;let Z=0;for(;G.indexOf(j,Z)===Z;)Z=Z+te;return G.substring(Z)}e.ltrim=d;function g(G,j){if(!G||!j)return G;const te=j.length,Z=G.length;if(te===0||Z===0)return G;let ue=Z,he=-1;for(;he=G.lastIndexOf(j,ue-1),!(he===-1||he+te!==ue);){if(he===0)return"";ue=he}return G.substring(0,ue)}e.rtrim=g;function p(G){return G.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")}e.convertSimple2RegExpPattern=p;function c(G){return G.replace(/\*/g,"")}e.stripWildcards=c;function o(G,j,te={}){if(!G)throw new Error("Cannot create regex from empty string");j||(G=S(G)),te.wholeWord&&(/\B/.test(G.charAt(0))||(G="\\b"+G),/\B/.test(G.charAt(G.length-1))||(G=G+"\\b"));let Z="";return te.global&&(Z+="g"),te.matchCase||(Z+="i"),te.multiline&&(Z+="m"),te.unicode&&(Z+="u"),new RegExp(G,Z)}e.createRegExp=o;function s(G){return G.source==="^"||G.source==="^$"||G.source==="$"||G.source==="^\\s*$"?!1:!!(G.exec("")&&G.lastIndex===0)}e.regExpLeadsToEndlessLoop=s;function a(G){return(G.global?"g":"")+(G.ignoreCase?"i":"")+(G.multiline?"m":"")+(G.unicode?"u":"")}e.regExpFlags=a;function u(G){return G.split(/\r\n|\r|\n/)}e.splitLines=u;function r(G){for(let j=0,te=G.length;j=0;te--){const Z=G.charCodeAt(te);if(Z!==32&&Z!==9)return te}return-1}e.lastNonWhitespaceIndex=n;function t(G,j){return Gj?1:0}e.compare=t;function l(G,j,te=0,Z=G.length,ue=0,he=j.length){for(;teCe)return 1}const re=Z-te,ce=he-ue;return rece?1:0}e.compareSubstring=l;function h(G,j){return m(G,j,0,G.length,0,j.length)}e.compareIgnoreCase=h;function m(G,j,te=0,Z=G.length,ue=0,he=j.length){for(;tece?1:0}e.compareSubstringIgnoreCase=m;function _(G){return G>=97&&G<=122}e.isLowerAsciiLetter=_;function f(G){return G>=65&&G<=90}e.isUpperAsciiLetter=f;function v(G){return _(G)||f(G)}function y(G,j){return G.length===j.length&&L(G,j)}e.equalsIgnoreCase=y;function L(G,j,te=G.length){for(let Z=0;ZG.length?!1:L(G,j,te)}e.startsWithIgnoreCase=I;function k(G,j){let te,Z=Math.min(G.length,j.length);for(te=0;te1){const Z=G.charCodeAt(j-2);if(T(Z))return A(Z,te)}return te}function D(G,j){const te=oe.getInstance(),Z=j,ue=G.length,he=B(G,ue,j);j+=he>=65536?2:1;let re=te.getGraphemeBreakType(he);for(;j=65536?2:1,re=me}return j-Z}e.nextCharLength=D;function R(G,j){const te=oe.getInstance(),Z=j,ue=F(G,j);j-=ue>=65536?2:1;let he=te.getGraphemeBreakType(ue);for(;j>0;){const re=F(G,j),ce=te.getGraphemeBreakType(re);if(ie(ce,he))break;j-=re>=65536?2:1,he=ce}return Z-j}e.prevCharLength=R;function W(G){const j=G.byteLength,te=[];let Z=0;for(;Z=240&&Z+3>>0|(G[Z++]&63)<<12>>>0|(G[Z++]&63)<<6>>>0|(G[Z++]&63)<<0>>>0:ue>=224&&Z+2>>0|(G[Z++]&63)<<6>>>0|(G[Z++]&63)<<0>>>0:ue>=192&&Z+1>>0|(G[Z++]&63)<<0>>>0:he=G[Z++],he>=0&&he<=55295||he>=57344&&he<=65535)te.push(String.fromCharCode(he));else if(he>=65536&&he<=1114111){const re=he-65536,ce=55296+((re&1047552)>>>10),me=56320+((re&1023)>>>0);te.push(String.fromCharCode(ce)),te.push(String.fromCharCode(me))}else te.push(String.fromCharCode(65533))}return te.join("")}e.decodeUTF8=W;const x=/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u08BD\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE33\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD50-\uDFFF]|\uD83B[\uDC00-\uDEBB])/;function K(G){return x.test(G)}e.containsRTL=K;const Y=/(?:[\u231A\u231B\u23F0\u23F3\u2600-\u27BF\u2B50\u2B55]|\uD83C[\uDDE6-\uDDFF\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F\uDE80-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD00-\uDDFF\uDE70-\uDED6])/;function ee(G){return Y.test(G)}e.containsEmoji=ee;const se=/^[\t\n\r\x20-\x7E]*$/;function ne(G){return se.test(G)}e.isBasicASCII=ne,e.UNUSUAL_LINE_TERMINATORS=/[\u2028\u2029]/;function le(G){return e.UNUSUAL_LINE_TERMINATORS.test(G)}e.containsUnusualLineTerminators=le;function X(G){for(let j=0,te=G.length;j=11904&&G<=55215||G>=63744&&G<=64255||G>=65281&&G<=65374}e.isFullWidthCharacter=z;function P(G){return G>=127462&&G<=127487||G===8986||G===8987||G===9200||G===9203||G>=9728&&G<=10175||G===11088||G===11093||G>=127744&&G<=128591||G>=128640&&G<=128764||G>=128992&&G<=129003||G>=129280&&G<=129535||G>=129648&&G<=129750}e.isEmojiImprecise=P,e.UTF8_BOM_CHARACTER=String.fromCharCode(65279);function V(G){return!!(G&&G.length>0&&G.charCodeAt(0)===65279)}e.startsWithUTF8BOM=V;function U(G,j=!1){return G?(j&&(G=G.replace(/\\./g,"")),G.toLowerCase()!==G):!1}e.containsUppercaseCharacter=U;function H(G){const j=90-65+1;return G=G%(2*j),Gte[3*ue+1])ue=2*ue+1;else return te[3*ue+2];return 0}}oe._INSTANCE=null;function ae(){return JSON.parse("[0,0,0,51592,51592,11,44424,44424,11,72251,72254,5,7150,7150,7,48008,48008,11,55176,55176,11,128420,128420,14,3276,3277,5,9979,9980,14,46216,46216,11,49800,49800,11,53384,53384,11,70726,70726,5,122915,122916,5,129320,129327,14,2558,2558,5,5906,5908,5,9762,9763,14,43360,43388,8,45320,45320,11,47112,47112,11,48904,48904,11,50696,50696,11,52488,52488,11,54280,54280,11,70082,70083,1,71350,71350,7,73111,73111,5,127892,127893,14,128726,128727,14,129473,129474,14,2027,2035,5,2901,2902,5,3784,3789,5,6754,6754,5,8418,8420,5,9877,9877,14,11088,11088,14,44008,44008,5,44872,44872,11,45768,45768,11,46664,46664,11,47560,47560,11,48456,48456,11,49352,49352,11,50248,50248,11,51144,51144,11,52040,52040,11,52936,52936,11,53832,53832,11,54728,54728,11,69811,69814,5,70459,70460,5,71096,71099,7,71998,71998,5,72874,72880,5,119149,119149,7,127374,127374,14,128335,128335,14,128482,128482,14,128765,128767,14,129399,129400,14,129680,129685,14,1476,1477,5,2377,2380,7,2759,2760,5,3137,3140,7,3458,3459,7,4153,4154,5,6432,6434,5,6978,6978,5,7675,7679,5,9723,9726,14,9823,9823,14,9919,9923,14,10035,10036,14,42736,42737,5,43596,43596,5,44200,44200,11,44648,44648,11,45096,45096,11,45544,45544,11,45992,45992,11,46440,46440,11,46888,46888,11,47336,47336,11,47784,47784,11,48232,48232,11,48680,48680,11,49128,49128,11,49576,49576,11,50024,50024,11,50472,50472,11,50920,50920,11,51368,51368,11,51816,51816,11,52264,52264,11,52712,52712,11,53160,53160,11,53608,53608,11,54056,54056,11,54504,54504,11,54952,54952,11,68108,68111,5,69933,69940,5,70197,70197,7,70498,70499,7,70845,70845,5,71229,71229,5,71727,71735,5,72154,72155,5,72344,72345,5,73023,73029,5,94095,94098,5,121403,121452,5,126981,127182,14,127538,127546,14,127990,127990,14,128391,128391,14,128445,128449,14,128500,128505,14,128752,128752,14,129160,129167,14,129356,129356,14,129432,129442,14,129648,129651,14,129751,131069,14,173,173,4,1757,1757,1,2274,2274,1,2494,2494,5,2641,2641,5,2876,2876,5,3014,3016,7,3262,3262,7,3393,3396,5,3570,3571,7,3968,3972,5,4228,4228,7,6086,6086,5,6679,6680,5,6912,6915,5,7080,7081,5,7380,7392,5,8252,8252,14,9096,9096,14,9748,9749,14,9784,9786,14,9833,9850,14,9890,9894,14,9938,9938,14,9999,9999,14,10085,10087,14,12349,12349,14,43136,43137,7,43454,43456,7,43755,43755,7,44088,44088,11,44312,44312,11,44536,44536,11,44760,44760,11,44984,44984,11,45208,45208,11,45432,45432,11,45656,45656,11,45880,45880,11,46104,46104,11,46328,46328,11,46552,46552,11,46776,46776,11,47000,47000,11,47224,47224,11,47448,47448,11,47672,47672,11,47896,47896,11,48120,48120,11,48344,48344,11,48568,48568,11,48792,48792,11,49016,49016,11,49240,49240,11,49464,49464,11,49688,49688,11,49912,49912,11,50136,50136,11,50360,50360,11,50584,50584,11,50808,50808,11,51032,51032,11,51256,51256,11,51480,51480,11,51704,51704,11,51928,51928,11,52152,52152,11,52376,52376,11,52600,52600,11,52824,52824,11,53048,53048,11,53272,53272,11,53496,53496,11,53720,53720,11,53944,53944,11,54168,54168,11,54392,54392,11,54616,54616,11,54840,54840,11,55064,55064,11,65438,65439,5,69633,69633,5,69837,69837,1,70018,70018,7,70188,70190,7,70368,70370,7,70465,70468,7,70712,70719,5,70835,70840,5,70850,70851,5,71132,71133,5,71340,71340,7,71458,71461,5,71985,71989,7,72002,72002,7,72193,72202,5,72281,72283,5,72766,72766,7,72885,72886,5,73104,73105,5,92912,92916,5,113824,113827,4,119173,119179,5,121505,121519,5,125136,125142,5,127279,127279,14,127489,127490,14,127570,127743,14,127900,127901,14,128254,128254,14,128369,128370,14,128400,128400,14,128425,128432,14,128468,128475,14,128489,128494,14,128715,128720,14,128745,128745,14,128759,128760,14,129004,129023,14,129296,129304,14,129340,129342,14,129388,129392,14,129404,129407,14,129454,129455,14,129485,129487,14,129659,129663,14,129719,129727,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2363,2363,7,2402,2403,5,2507,2508,7,2622,2624,7,2691,2691,7,2786,2787,5,2881,2884,5,3006,3006,5,3072,3072,5,3170,3171,5,3267,3268,7,3330,3331,7,3406,3406,1,3538,3540,5,3655,3662,5,3897,3897,5,4038,4038,5,4184,4185,5,4352,4447,8,6068,6069,5,6155,6157,5,6448,6449,7,6742,6742,5,6783,6783,5,6966,6970,5,7042,7042,7,7143,7143,7,7212,7219,5,7412,7412,5,8206,8207,4,8294,8303,4,8596,8601,14,9410,9410,14,9742,9742,14,9757,9757,14,9770,9770,14,9794,9794,14,9828,9828,14,9855,9855,14,9882,9882,14,9900,9903,14,9929,9933,14,9963,9967,14,9987,9988,14,10006,10006,14,10062,10062,14,10175,10175,14,11744,11775,5,42607,42607,5,43043,43044,7,43263,43263,5,43444,43445,7,43569,43570,5,43698,43700,5,43766,43766,5,44032,44032,11,44144,44144,11,44256,44256,11,44368,44368,11,44480,44480,11,44592,44592,11,44704,44704,11,44816,44816,11,44928,44928,11,45040,45040,11,45152,45152,11,45264,45264,11,45376,45376,11,45488,45488,11,45600,45600,11,45712,45712,11,45824,45824,11,45936,45936,11,46048,46048,11,46160,46160,11,46272,46272,11,46384,46384,11,46496,46496,11,46608,46608,11,46720,46720,11,46832,46832,11,46944,46944,11,47056,47056,11,47168,47168,11,47280,47280,11,47392,47392,11,47504,47504,11,47616,47616,11,47728,47728,11,47840,47840,11,47952,47952,11,48064,48064,11,48176,48176,11,48288,48288,11,48400,48400,11,48512,48512,11,48624,48624,11,48736,48736,11,48848,48848,11,48960,48960,11,49072,49072,11,49184,49184,11,49296,49296,11,49408,49408,11,49520,49520,11,49632,49632,11,49744,49744,11,49856,49856,11,49968,49968,11,50080,50080,11,50192,50192,11,50304,50304,11,50416,50416,11,50528,50528,11,50640,50640,11,50752,50752,11,50864,50864,11,50976,50976,11,51088,51088,11,51200,51200,11,51312,51312,11,51424,51424,11,51536,51536,11,51648,51648,11,51760,51760,11,51872,51872,11,51984,51984,11,52096,52096,11,52208,52208,11,52320,52320,11,52432,52432,11,52544,52544,11,52656,52656,11,52768,52768,11,52880,52880,11,52992,52992,11,53104,53104,11,53216,53216,11,53328,53328,11,53440,53440,11,53552,53552,11,53664,53664,11,53776,53776,11,53888,53888,11,54000,54000,11,54112,54112,11,54224,54224,11,54336,54336,11,54448,54448,11,54560,54560,11,54672,54672,11,54784,54784,11,54896,54896,11,55008,55008,11,55120,55120,11,64286,64286,5,66272,66272,5,68900,68903,5,69762,69762,7,69817,69818,5,69927,69931,5,70003,70003,5,70070,70078,5,70094,70094,7,70194,70195,7,70206,70206,5,70400,70401,5,70463,70463,7,70475,70477,7,70512,70516,5,70722,70724,5,70832,70832,5,70842,70842,5,70847,70848,5,71088,71089,7,71102,71102,7,71219,71226,5,71231,71232,5,71342,71343,7,71453,71455,5,71463,71467,5,71737,71738,5,71995,71996,5,72000,72000,7,72145,72147,7,72160,72160,5,72249,72249,7,72273,72278,5,72330,72342,5,72752,72758,5,72850,72871,5,72882,72883,5,73018,73018,5,73031,73031,5,73109,73109,5,73461,73462,7,94031,94031,5,94192,94193,7,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,126976,126979,14,127184,127231,14,127344,127345,14,127405,127461,14,127514,127514,14,127561,127567,14,127778,127779,14,127896,127896,14,127985,127986,14,127995,127999,5,128326,128328,14,128360,128366,14,128378,128378,14,128394,128397,14,128405,128406,14,128422,128423,14,128435,128443,14,128453,128464,14,128479,128480,14,128484,128487,14,128496,128498,14,128640,128709,14,128723,128724,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129096,129103,14,129292,129292,14,129311,129311,14,129329,129330,14,129344,129349,14,129360,129374,14,129394,129394,14,129402,129402,14,129413,129425,14,129445,129450,14,129466,129471,14,129483,129483,14,129511,129535,14,129653,129655,14,129667,129670,14,129705,129711,14,129731,129743,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2307,2307,7,2366,2368,7,2382,2383,7,2434,2435,7,2497,2500,5,2519,2519,5,2563,2563,7,2631,2632,5,2677,2677,5,2750,2752,7,2763,2764,7,2817,2817,5,2879,2879,5,2891,2892,7,2914,2915,5,3008,3008,5,3021,3021,5,3076,3076,5,3146,3149,5,3202,3203,7,3264,3265,7,3271,3272,7,3298,3299,5,3390,3390,5,3402,3404,7,3426,3427,5,3535,3535,5,3544,3550,7,3635,3635,7,3763,3763,7,3893,3893,5,3953,3966,5,3981,3991,5,4145,4145,7,4157,4158,5,4209,4212,5,4237,4237,5,4520,4607,10,5970,5971,5,6071,6077,5,6089,6099,5,6277,6278,5,6439,6440,5,6451,6456,7,6683,6683,5,6744,6750,5,6765,6770,7,6846,6846,5,6964,6964,5,6972,6972,5,7019,7027,5,7074,7077,5,7083,7085,5,7146,7148,7,7154,7155,7,7222,7223,5,7394,7400,5,7416,7417,5,8204,8204,5,8233,8233,4,8288,8292,4,8413,8416,5,8482,8482,14,8986,8987,14,9193,9203,14,9654,9654,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9775,14,9792,9792,14,9800,9811,14,9825,9826,14,9831,9831,14,9852,9853,14,9872,9873,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9936,9936,14,9941,9960,14,9974,9974,14,9982,9985,14,9992,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10145,10145,14,11013,11015,14,11503,11505,5,12334,12335,5,12951,12951,14,42612,42621,5,43014,43014,5,43047,43047,7,43204,43205,5,43335,43345,5,43395,43395,7,43450,43451,7,43561,43566,5,43573,43574,5,43644,43644,5,43710,43711,5,43758,43759,7,44005,44005,5,44012,44012,7,44060,44060,11,44116,44116,11,44172,44172,11,44228,44228,11,44284,44284,11,44340,44340,11,44396,44396,11,44452,44452,11,44508,44508,11,44564,44564,11,44620,44620,11,44676,44676,11,44732,44732,11,44788,44788,11,44844,44844,11,44900,44900,11,44956,44956,11,45012,45012,11,45068,45068,11,45124,45124,11,45180,45180,11,45236,45236,11,45292,45292,11,45348,45348,11,45404,45404,11,45460,45460,11,45516,45516,11,45572,45572,11,45628,45628,11,45684,45684,11,45740,45740,11,45796,45796,11,45852,45852,11,45908,45908,11,45964,45964,11,46020,46020,11,46076,46076,11,46132,46132,11,46188,46188,11,46244,46244,11,46300,46300,11,46356,46356,11,46412,46412,11,46468,46468,11,46524,46524,11,46580,46580,11,46636,46636,11,46692,46692,11,46748,46748,11,46804,46804,11,46860,46860,11,46916,46916,11,46972,46972,11,47028,47028,11,47084,47084,11,47140,47140,11,47196,47196,11,47252,47252,11,47308,47308,11,47364,47364,11,47420,47420,11,47476,47476,11,47532,47532,11,47588,47588,11,47644,47644,11,47700,47700,11,47756,47756,11,47812,47812,11,47868,47868,11,47924,47924,11,47980,47980,11,48036,48036,11,48092,48092,11,48148,48148,11,48204,48204,11,48260,48260,11,48316,48316,11,48372,48372,11,48428,48428,11,48484,48484,11,48540,48540,11,48596,48596,11,48652,48652,11,48708,48708,11,48764,48764,11,48820,48820,11,48876,48876,11,48932,48932,11,48988,48988,11,49044,49044,11,49100,49100,11,49156,49156,11,49212,49212,11,49268,49268,11,49324,49324,11,49380,49380,11,49436,49436,11,49492,49492,11,49548,49548,11,49604,49604,11,49660,49660,11,49716,49716,11,49772,49772,11,49828,49828,11,49884,49884,11,49940,49940,11,49996,49996,11,50052,50052,11,50108,50108,11,50164,50164,11,50220,50220,11,50276,50276,11,50332,50332,11,50388,50388,11,50444,50444,11,50500,50500,11,50556,50556,11,50612,50612,11,50668,50668,11,50724,50724,11,50780,50780,11,50836,50836,11,50892,50892,11,50948,50948,11,51004,51004,11,51060,51060,11,51116,51116,11,51172,51172,11,51228,51228,11,51284,51284,11,51340,51340,11,51396,51396,11,51452,51452,11,51508,51508,11,51564,51564,11,51620,51620,11,51676,51676,11,51732,51732,11,51788,51788,11,51844,51844,11,51900,51900,11,51956,51956,11,52012,52012,11,52068,52068,11,52124,52124,11,52180,52180,11,52236,52236,11,52292,52292,11,52348,52348,11,52404,52404,11,52460,52460,11,52516,52516,11,52572,52572,11,52628,52628,11,52684,52684,11,52740,52740,11,52796,52796,11,52852,52852,11,52908,52908,11,52964,52964,11,53020,53020,11,53076,53076,11,53132,53132,11,53188,53188,11,53244,53244,11,53300,53300,11,53356,53356,11,53412,53412,11,53468,53468,11,53524,53524,11,53580,53580,11,53636,53636,11,53692,53692,11,53748,53748,11,53804,53804,11,53860,53860,11,53916,53916,11,53972,53972,11,54028,54028,11,54084,54084,11,54140,54140,11,54196,54196,11,54252,54252,11,54308,54308,11,54364,54364,11,54420,54420,11,54476,54476,11,54532,54532,11,54588,54588,11,54644,54644,11,54700,54700,11,54756,54756,11,54812,54812,11,54868,54868,11,54924,54924,11,54980,54980,11,55036,55036,11,55092,55092,11,55148,55148,11,55216,55238,9,65056,65071,5,65529,65531,4,68097,68099,5,68159,68159,5,69446,69456,5,69688,69702,5,69808,69810,7,69815,69816,7,69821,69821,1,69888,69890,5,69932,69932,7,69957,69958,7,70016,70017,5,70067,70069,7,70079,70080,7,70089,70092,5,70095,70095,5,70191,70193,5,70196,70196,5,70198,70199,5,70367,70367,5,70371,70378,5,70402,70403,7,70462,70462,5,70464,70464,5,70471,70472,7,70487,70487,5,70502,70508,5,70709,70711,7,70720,70721,7,70725,70725,7,70750,70750,5,70833,70834,7,70841,70841,7,70843,70844,7,70846,70846,7,70849,70849,7,71087,71087,5,71090,71093,5,71100,71101,5,71103,71104,5,71216,71218,7,71227,71228,7,71230,71230,7,71339,71339,5,71341,71341,5,71344,71349,5,71351,71351,5,71456,71457,7,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123628,123631,5,125252,125258,5,126980,126980,14,127183,127183,14,127245,127247,14,127340,127343,14,127358,127359,14,127377,127386,14,127462,127487,6,127491,127503,14,127535,127535,14,127548,127551,14,127568,127569,14,127744,127777,14,127780,127891,14,127894,127895,14,127897,127899,14,127902,127984,14,127987,127989,14,127991,127994,14,128000,128253,14,128255,128317,14,128329,128334,14,128336,128359,14,128367,128368,14,128371,128377,14,128379,128390,14,128392,128393,14,128398,128399,14,128401,128404,14,128407,128419,14,128421,128421,14,128424,128424,14,128433,128434,14,128444,128444,14,128450,128452,14,128465,128467,14,128476,128478,14,128481,128481,14,128483,128483,14,128488,128488,14,128495,128495,14,128499,128499,14,128506,128591,14,128710,128714,14,128721,128722,14,128725,128725,14,128728,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129664,129666,14,129671,129679,14,129686,129704,14,129712,129718,14,129728,129730,14,129744,129750,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2259,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3134,3136,5,3142,3144,5,3157,3158,5,3201,3201,5,3260,3260,5,3263,3263,5,3266,3266,5,3270,3270,5,3274,3275,7,3285,3286,5,3328,3329,5,3387,3388,5,3391,3392,7,3398,3400,7,3405,3405,5,3415,3415,5,3457,3457,5,3530,3530,5,3536,3537,7,3542,3542,5,3551,3551,5,3633,3633,5,3636,3642,5,3761,3761,5,3764,3772,5,3864,3865,5,3895,3895,5,3902,3903,7,3967,3967,7,3974,3975,5,3993,4028,5,4141,4144,5,4146,4151,5,4155,4156,7,4182,4183,7,4190,4192,5,4226,4226,5,4229,4230,5,4253,4253,5,4448,4519,9,4957,4959,5,5938,5940,5,6002,6003,5,6070,6070,7,6078,6085,7,6087,6088,7,6109,6109,5,6158,6158,4,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6848,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7673,5,8203,8203,4,8205,8205,13,8232,8232,4,8234,8238,4,8265,8265,14,8293,8293,4,8400,8412,5,8417,8417,5,8421,8432,5,8505,8505,14,8617,8618,14,9000,9000,14,9167,9167,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9776,9783,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9935,14,9937,9937,14,9939,9940,14,9961,9962,14,9968,9973,14,9975,9978,14,9981,9981,14,9986,9986,14,9989,9989,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10084,14,10133,10135,14,10160,10160,14,10548,10549,14,11035,11036,14,11093,11093,14,11647,11647,5,12330,12333,5,12336,12336,14,12441,12442,5,12953,12953,14,42608,42610,5,42654,42655,5,43010,43010,5,43019,43019,5,43045,43046,5,43052,43052,5,43188,43203,7,43232,43249,5,43302,43309,5,43346,43347,7,43392,43394,5,43443,43443,5,43446,43449,5,43452,43453,5,43493,43493,5,43567,43568,7,43571,43572,7,43587,43587,5,43597,43597,7,43696,43696,5,43703,43704,5,43713,43713,5,43756,43757,5,43765,43765,7,44003,44004,7,44006,44007,7,44009,44010,7,44013,44013,5,44033,44059,12,44061,44087,12,44089,44115,12,44117,44143,12,44145,44171,12,44173,44199,12,44201,44227,12,44229,44255,12,44257,44283,12,44285,44311,12,44313,44339,12,44341,44367,12,44369,44395,12,44397,44423,12,44425,44451,12,44453,44479,12,44481,44507,12,44509,44535,12,44537,44563,12,44565,44591,12,44593,44619,12,44621,44647,12,44649,44675,12,44677,44703,12,44705,44731,12,44733,44759,12,44761,44787,12,44789,44815,12,44817,44843,12,44845,44871,12,44873,44899,12,44901,44927,12,44929,44955,12,44957,44983,12,44985,45011,12,45013,45039,12,45041,45067,12,45069,45095,12,45097,45123,12,45125,45151,12,45153,45179,12,45181,45207,12,45209,45235,12,45237,45263,12,45265,45291,12,45293,45319,12,45321,45347,12,45349,45375,12,45377,45403,12,45405,45431,12,45433,45459,12,45461,45487,12,45489,45515,12,45517,45543,12,45545,45571,12,45573,45599,12,45601,45627,12,45629,45655,12,45657,45683,12,45685,45711,12,45713,45739,12,45741,45767,12,45769,45795,12,45797,45823,12,45825,45851,12,45853,45879,12,45881,45907,12,45909,45935,12,45937,45963,12,45965,45991,12,45993,46019,12,46021,46047,12,46049,46075,12,46077,46103,12,46105,46131,12,46133,46159,12,46161,46187,12,46189,46215,12,46217,46243,12,46245,46271,12,46273,46299,12,46301,46327,12,46329,46355,12,46357,46383,12,46385,46411,12,46413,46439,12,46441,46467,12,46469,46495,12,46497,46523,12,46525,46551,12,46553,46579,12,46581,46607,12,46609,46635,12,46637,46663,12,46665,46691,12,46693,46719,12,46721,46747,12,46749,46775,12,46777,46803,12,46805,46831,12,46833,46859,12,46861,46887,12,46889,46915,12,46917,46943,12,46945,46971,12,46973,46999,12,47001,47027,12,47029,47055,12,47057,47083,12,47085,47111,12,47113,47139,12,47141,47167,12,47169,47195,12,47197,47223,12,47225,47251,12,47253,47279,12,47281,47307,12,47309,47335,12,47337,47363,12,47365,47391,12,47393,47419,12,47421,47447,12,47449,47475,12,47477,47503,12,47505,47531,12,47533,47559,12,47561,47587,12,47589,47615,12,47617,47643,12,47645,47671,12,47673,47699,12,47701,47727,12,47729,47755,12,47757,47783,12,47785,47811,12,47813,47839,12,47841,47867,12,47869,47895,12,47897,47923,12,47925,47951,12,47953,47979,12,47981,48007,12,48009,48035,12,48037,48063,12,48065,48091,12,48093,48119,12,48121,48147,12,48149,48175,12,48177,48203,12,48205,48231,12,48233,48259,12,48261,48287,12,48289,48315,12,48317,48343,12,48345,48371,12,48373,48399,12,48401,48427,12,48429,48455,12,48457,48483,12,48485,48511,12,48513,48539,12,48541,48567,12,48569,48595,12,48597,48623,12,48625,48651,12,48653,48679,12,48681,48707,12,48709,48735,12,48737,48763,12,48765,48791,12,48793,48819,12,48821,48847,12,48849,48875,12,48877,48903,12,48905,48931,12,48933,48959,12,48961,48987,12,48989,49015,12,49017,49043,12,49045,49071,12,49073,49099,12,49101,49127,12,49129,49155,12,49157,49183,12,49185,49211,12,49213,49239,12,49241,49267,12,49269,49295,12,49297,49323,12,49325,49351,12,49353,49379,12,49381,49407,12,49409,49435,12,49437,49463,12,49465,49491,12,49493,49519,12,49521,49547,12,49549,49575,12,49577,49603,12,49605,49631,12,49633,49659,12,49661,49687,12,49689,49715,12,49717,49743,12,49745,49771,12,49773,49799,12,49801,49827,12,49829,49855,12,49857,49883,12,49885,49911,12,49913,49939,12,49941,49967,12,49969,49995,12,49997,50023,12,50025,50051,12,50053,50079,12,50081,50107,12,50109,50135,12,50137,50163,12,50165,50191,12,50193,50219,12,50221,50247,12,50249,50275,12,50277,50303,12,50305,50331,12,50333,50359,12,50361,50387,12,50389,50415,12,50417,50443,12,50445,50471,12,50473,50499,12,50501,50527,12,50529,50555,12,50557,50583,12,50585,50611,12,50613,50639,12,50641,50667,12,50669,50695,12,50697,50723,12,50725,50751,12,50753,50779,12,50781,50807,12,50809,50835,12,50837,50863,12,50865,50891,12,50893,50919,12,50921,50947,12,50949,50975,12,50977,51003,12,51005,51031,12,51033,51059,12,51061,51087,12,51089,51115,12,51117,51143,12,51145,51171,12,51173,51199,12,51201,51227,12,51229,51255,12,51257,51283,12,51285,51311,12,51313,51339,12,51341,51367,12,51369,51395,12,51397,51423,12,51425,51451,12,51453,51479,12,51481,51507,12,51509,51535,12,51537,51563,12,51565,51591,12,51593,51619,12,51621,51647,12,51649,51675,12,51677,51703,12,51705,51731,12,51733,51759,12,51761,51787,12,51789,51815,12,51817,51843,12,51845,51871,12,51873,51899,12,51901,51927,12,51929,51955,12,51957,51983,12,51985,52011,12,52013,52039,12,52041,52067,12,52069,52095,12,52097,52123,12,52125,52151,12,52153,52179,12,52181,52207,12,52209,52235,12,52237,52263,12,52265,52291,12,52293,52319,12,52321,52347,12,52349,52375,12,52377,52403,12,52405,52431,12,52433,52459,12,52461,52487,12,52489,52515,12,52517,52543,12,52545,52571,12,52573,52599,12,52601,52627,12,52629,52655,12,52657,52683,12,52685,52711,12,52713,52739,12,52741,52767,12,52769,52795,12,52797,52823,12,52825,52851,12,52853,52879,12,52881,52907,12,52909,52935,12,52937,52963,12,52965,52991,12,52993,53019,12,53021,53047,12,53049,53075,12,53077,53103,12,53105,53131,12,53133,53159,12,53161,53187,12,53189,53215,12,53217,53243,12,53245,53271,12,53273,53299,12,53301,53327,12,53329,53355,12,53357,53383,12,53385,53411,12,53413,53439,12,53441,53467,12,53469,53495,12,53497,53523,12,53525,53551,12,53553,53579,12,53581,53607,12,53609,53635,12,53637,53663,12,53665,53691,12,53693,53719,12,53721,53747,12,53749,53775,12,53777,53803,12,53805,53831,12,53833,53859,12,53861,53887,12,53889,53915,12,53917,53943,12,53945,53971,12,53973,53999,12,54001,54027,12,54029,54055,12,54057,54083,12,54085,54111,12,54113,54139,12,54141,54167,12,54169,54195,12,54197,54223,12,54225,54251,12,54253,54279,12,54281,54307,12,54309,54335,12,54337,54363,12,54365,54391,12,54393,54419,12,54421,54447,12,54449,54475,12,54477,54503,12,54505,54531,12,54533,54559,12,54561,54587,12,54589,54615,12,54617,54643,12,54645,54671,12,54673,54699,12,54701,54727,12,54729,54755,12,54757,54783,12,54785,54811,12,54813,54839,12,54841,54867,12,54869,54895,12,54897,54923,12,54925,54951,12,54953,54979,12,54981,55007,12,55009,55035,12,55037,55063,12,55065,55091,12,55093,55119,12,55121,55147,12,55149,55175,12,55177,55203,12,55243,55291,10,65024,65039,5,65279,65279,4,65520,65528,4,66045,66045,5,66422,66426,5,68101,68102,5,68152,68154,5,68325,68326,5,69291,69292,5,69632,69632,7,69634,69634,7,69759,69761,5]")}}),define(Q[101],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.writeUInt8=e.readUInt8=e.writeUInt32BE=e.readUInt32BE=e.writeUInt16LE=e.readUInt16LE=e.VSBuffer=void 0;const N=typeof Buffer!="undefined",M=typeof TextDecoder!="undefined";let w;class S{constructor(a){this.buffer=a,this.byteLength=this.buffer.byteLength}static wrap(a){return N&&!Buffer.isBuffer(a)&&(a=Buffer.from(a.buffer,a.byteOffset,a.byteLength)),new S(a)}toString(){return N?this.buffer.toString():M?(w||(w=new TextDecoder),w.decode(this.buffer)):b.decodeUTF8(this.buffer)}}e.VSBuffer=S;function C(s,a){return s[a+0]<<0>>>0|s[a+1]<<8>>>0}e.readUInt16LE=C;function d(s,a,u){s[u+0]=a&255,a=a>>>8,s[u+1]=a&255}e.writeUInt16LE=d;function g(s,a){return s[a]*Math.pow(2,24)+s[a+1]*Math.pow(2,16)+s[a+2]*Math.pow(2,8)+s[a+3]}e.readUInt32BE=g;function p(s,a,u){s[u+3]=a,a=a>>>8,s[u+2]=a,a=a>>>8,s[u+1]=a,a=a>>>8,s[u]=a}e.writeUInt32BE=p;function c(s,a){return s[a]}e.readUInt8=c;function o(s,a,u){s[u]=a}e.writeUInt8=o}),define(Q[152],J([0,1,17,8,72]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hasDriveLetter=e.isRootOrDriveLetter=e.isWindowsDriveLetter=e.isEqualOrParent=e.toSlashes=void 0;function w(p){return p.replace(/[\\/]/g,M.posix.sep)}e.toSlashes=w;function S(p,c,o,s=M.sep){if(p===c)return!0;if(!p||!c||c.length>p.length)return!1;if(o){if(!N.startsWithIgnoreCase(p,c))return!1;if(c.length===p.length)return!0;let u=c.length;return c.charAt(c.length-1)===s&&u--,p.charAt(u)===s}return c.charAt(c.length-1)!==s&&(c+=s),p.indexOf(c)===0}e.isEqualOrParent=S;function C(p){return p>=65&&p<=90||p>=97&&p<=122}e.isWindowsDriveLetter=C;function d(p){const c=M.normalize(p);return b.isWindows?p.length>3?!1:g(c)&&(p.length===2||c.charCodeAt(2)===92):c===M.posix.sep}e.isRootOrDriveLetter=d;function g(p){return b.isWindows?C(p.charCodeAt(0))&&p.charCodeAt(1)===58:!1}e.hasDriveLetter=g}),define(Q[89],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StringSHA1=e.toHexString=e.stringHash=e.doHash=e.hash=void 0;function N(u){return M(u,0)}e.hash=N;function M(u,r){switch(typeof u){case"object":return u===null?w(349,r):Array.isArray(u)?d(u,r):g(u,r);case"string":return C(u,r);case"boolean":return S(u,r);case"number":return w(u,r);case"undefined":return w(937,r);default:return w(617,r)}}e.doHash=M;function w(u,r){return(r<<5)-r+u|0}function S(u,r){return w(u?433:863,r)}function C(u,r){r=w(149417,r);for(let i=0,n=u.length;iM(n,i),r)}function g(u,r){return r=w(181387,r),Object.keys(u).sort().reduce((i,n)=>(i=C(n,i),M(u[n],i)),r)}function p(u,r,i=32){const n=i-r,t=~((1<>>n)>>>0}function c(u,r=0,i=u.byteLength,n=0){for(let t=0;ti.toString(16).padStart(2,"0")).join(""):o((u>>>0).toString(16),r/4)}e.toHexString=s;class a{constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(64+3),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(r){const i=r.length;if(i!==0){const n=this._buff;let t=this._buffLen,l=this._leftoverHighSurrogate,h,m;for(l!==0?(h=l,m=-1,l=0):(h=r.charCodeAt(0),m=0);;){let _=h;if(b.isHighSurrogate(h))if(m+1>>6,r[i++]=128|(n&63)>>>0):n<65536?(r[i++]=224|(n&61440)>>>12,r[i++]=128|(n&4032)>>>6,r[i++]=128|(n&63)>>>0):(r[i++]=240|(n&1835008)>>>18,r[i++]=128|(n&258048)>>>12,r[i++]=128|(n&4032)>>>6,r[i++]=128|(n&63)>>>0),i>=64&&(this._step(),i-=64,this._totalLen+=64,r[0]=r[64+0],r[1]=r[64+1],r[2]=r[64+2]),i}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),s(this._h0)+s(this._h1)+s(this._h2)+s(this._h3)+s(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,c(this._buff,this._buffLen),this._buffLen>56&&(this._step(),c(this._buff));const r=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(r/4294967296),!1),this._buffDV.setUint32(60,r%4294967296,!1),this._step()}_step(){const r=a._bigBlock32,i=this._buffDV;for(let y=0;y<64;y+=4)r.setUint32(y,i.getUint32(y,!1),!1);for(let y=64;y<320;y+=4)r.setUint32(y,p(r.getUint32(y-12,!1)^r.getUint32(y-32,!1)^r.getUint32(y-56,!1)^r.getUint32(y-64,!1),1),!1);let n=this._h0,t=this._h1,l=this._h2,h=this._h3,m=this._h4,_,f,v;for(let y=0;y<80;y++)y<20?(_=t&l|~t&h,f=1518500249):y<40?(_=t^l^h,f=1859775393):y<60?(_=t&l|t&h|l&h,f=2400959708):(_=t^l^h,f=3395469782),v=p(n,5)+_+m+f+r.getUint32(y*4,!1)&4294967295,m=h,h=l,l=p(t,30),t=n,n=v;this._h0=this._h0+n&4294967295,this._h1=this._h1+t&4294967295,this._h2=this._h2+l&4294967295,this._h3=this._h3+h&4294967295,this._h4=this._h4+m&4294967295}}e.StringSHA1=a,a._bigBlock32=new DataView(new ArrayBuffer(320))}),define(Q[153],J([0,1,277,89]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LcsDiff=e.MyArray=e.Debug=e.stringDiff=e.StringDiffSequence=void 0;class M{constructor(c){this.source=c}getElements(){const c=this.source,o=new Int32Array(c.length);for(let s=0,a=c.length;s0||this.m_modifiedCount>0)&&this.m_changes.push(new b.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(c,o){this.m_originalStart=Math.min(this.m_originalStart,c),this.m_modifiedStart=Math.min(this.m_modifiedStart,o),this.m_originalCount++}AddModifiedElement(c,o){this.m_originalStart=Math.min(this.m_originalStart,c),this.m_modifiedStart=Math.min(this.m_modifiedStart,o),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class g{constructor(c,o,s=null){this.ContinueProcessingPredicate=s;const[a,u,r]=g._getElements(c),[i,n,t]=g._getElements(o);this._hasStrings=r&&t,this._originalStringElements=a,this._originalElementsOrHash=u,this._modifiedStringElements=i,this._modifiedElementsOrHash=n,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(c){return c.length>0&&typeof c[0]=="string"}static _getElements(c){const o=c.getElements();if(g._isStringArray(o)){const s=new Int32Array(o.length);for(let a=0,u=o.length;a=c&&a>=s&&this.ElementsAreEqual(o,a);)o--,a--;if(c>o||s>a){let h;return s<=a?(S.Assert(c===o+1,"originalStart should only be one more than originalEnd"),h=[new b.DiffChange(c,0,s,a-s+1)]):c<=o?(S.Assert(s===a+1,"modifiedStart should only be one more than modifiedEnd"),h=[new b.DiffChange(c,o-c+1,s,0)]):(S.Assert(c===o+1,"originalStart should only be one more than originalEnd"),S.Assert(s===a+1,"modifiedStart should only be one more than modifiedEnd"),h=[]),h}const r=[0],i=[0],n=this.ComputeRecursionPoint(c,o,s,a,r,i,u),t=r[0],l=i[0];if(n!==null)return n;if(!u[0]){const h=this.ComputeDiffRecursive(c,t,s,l,u);let m=[];return u[0]?m=[new b.DiffChange(t+1,o-(t+1)+1,l+1,a-(l+1)+1)]:m=this.ComputeDiffRecursive(t+1,o,l+1,a,u),this.ConcatenateChanges(h,m)}return[new b.DiffChange(c,o-c+1,s,a-s+1)]}WALKTRACE(c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I){let k=null,E=null,T=new d,O=o,A=s,B=_[0]-y[0]-a,F=-1073741824,D=this.m_forwardHistory.length-1;do{const R=B+c;R===O||R=0&&(t=this.m_forwardHistory[D],c=t[0],O=1,A=t.length-1)}while(--D>=-1);if(k=T.getReverseChanges(),I[0]){let R=_[0]+1,W=y[0]+1;if(k!==null&&k.length>0){const x=k[k.length-1];R=Math.max(R,x.getOriginalEnd()),W=Math.max(W,x.getModifiedEnd())}E=[new b.DiffChange(R,m-R+1,W,v-W+1)]}else{T=new d,O=r,A=i,B=_[0]-y[0]-n,F=1073741824,D=L?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const R=B+u;R===O||R=l[R+1]?(h=l[R+1]-1,f=h-B-n,h>F&&T.MarkNextChange(),F=h+1,T.AddOriginalElement(h+1,f+1),B=R+1-u):(h=l[R-1],f=h-B-n,h>F&&T.MarkNextChange(),F=h,T.AddModifiedElement(h+1,f+1),B=R-1-u),D>=0&&(l=this.m_reverseHistory[D],u=l[0],O=1,A=l.length-1)}while(--D>=-1);E=T.getChanges()}return this.ConcatenateChanges(k,E)}ComputeRecursionPoint(c,o,s,a,u,r,i){let n=0,t=0,l=0,h=0,m=0,_=0;c--,s--,u[0]=0,r[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const f=o-c+(a-s),v=f+1,y=new Int32Array(v),L=new Int32Array(v),I=a-s,k=o-c,E=c-s,T=o-a,A=(k-I)%2==0;y[I]=c,L[k]=o,i[0]=!1;for(let B=1;B<=f/2+1;B++){let F=0,D=0;l=this.ClipDiagonalBound(I-B,B,I,v),h=this.ClipDiagonalBound(I+B,B,I,v);for(let W=l;W<=h;W+=2){W===l||WF+D&&(F=n,D=t),!A&&Math.abs(W-k)<=B-1&&n>=L[W])return u[0]=n,r[0]=t,x<=L[W]&&1447>0&&B<=1447+1?this.WALKTRACE(I,l,h,E,k,m,_,T,y,L,n,o,u,t,a,r,A,i):null}const R=(F-c+(D-s)-B)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(F,R))return i[0]=!0,u[0]=F,r[0]=D,R>0&&1447>0&&B<=1447+1?this.WALKTRACE(I,l,h,E,k,m,_,T,y,L,n,o,u,t,a,r,A,i):(c++,s++,[new b.DiffChange(c,o-c+1,s,a-s+1)]);m=this.ClipDiagonalBound(k-B,B,k,v),_=this.ClipDiagonalBound(k+B,B,k,v);for(let W=m;W<=_;W+=2){W===m||W<_&&L[W-1]>=L[W+1]?n=L[W+1]-1:n=L[W-1],t=n-(W-k)-T;const x=n;for(;n>c&&t>s&&this.ElementsAreEqual(n,t);)n--,t--;if(L[W]=n,A&&Math.abs(W-I)<=B&&n<=y[W])return u[0]=n,r[0]=t,x>=y[W]&&1447>0&&B<=1447+1?this.WALKTRACE(I,l,h,E,k,m,_,T,y,L,n,o,u,t,a,r,A,i):null}if(B<=1447){let W=new Int32Array(h-l+2);W[0]=I-l+1,C.Copy2(y,l,W,1,h-l+1),this.m_forwardHistory.push(W),W=new Int32Array(_-m+2),W[0]=k-m+1,C.Copy2(L,m,W,1,_-m+1),this.m_reverseHistory.push(W)}}return this.WALKTRACE(I,l,h,E,k,m,_,T,y,L,n,o,u,t,a,r,A,i)}PrettifyChanges(c){for(let o=0;o0,i=s.modifiedLength>0;for(;s.originalStart+s.originalLength=0;o--){const s=c[o];let a=0,u=0;if(o>0){const l=c[o-1];l.originalLength>0&&(a=l.originalStart+l.originalLength),l.modifiedLength>0&&(u=l.modifiedStart+l.modifiedLength)}const r=s.originalLength>0,i=s.modifiedLength>0;let n=0,t=this._boundaryScore(s.originalStart,s.originalLength,s.modifiedStart,s.modifiedLength);for(let l=1;;l++){const h=s.originalStart-l,m=s.modifiedStart-l;if(ht&&(t=_,n=l)}s.originalStart-=n,s.modifiedStart-=n}if(this._hasStrings)for(let o=1,s=c.length;o0&&_>n&&(n=_,t=h,l=m)}return n>0?[t,l]:null}_contiguousSequenceScore(c,o,s){let a=0;for(let u=0;u=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._originalStringElements[c])}_OriginalRegionIsBoundary(c,o){if(this._OriginalIsBoundary(c)||this._OriginalIsBoundary(c-1))return!0;if(o>0){const s=c+o;if(this._OriginalIsBoundary(s-1)||this._OriginalIsBoundary(s))return!0}return!1}_ModifiedIsBoundary(c){return c<=0||c>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[c])}_ModifiedRegionIsBoundary(c,o){if(this._ModifiedIsBoundary(c)||this._ModifiedIsBoundary(c-1))return!0;if(o>0){const s=c+o;if(this._ModifiedIsBoundary(s-1)||this._ModifiedIsBoundary(s))return!0}return!1}_boundaryScore(c,o,s,a){const u=this._OriginalRegionIsBoundary(c,o)?1:0,r=this._ModifiedRegionIsBoundary(s,a)?1:0;return u+r}ConcatenateChanges(c,o){let s=[];if(c.length===0||o.length===0)return o.length>0?o:c;if(this.ChangesOverlap(c[c.length-1],o[0],s)){const a=new Array(c.length+o.length-1);return C.Copy(c,0,a,0,c.length-1),a[c.length-1]=s[0],C.Copy(o,1,a,c.length,o.length-1),a}else{const a=new Array(c.length+o.length);return C.Copy(c,0,a,0,c.length),C.Copy(o,0,a,c.length,o.length),a}}ChangesOverlap(c,o,s){if(S.Assert(c.originalStart<=o.originalStart,"Left change is not less than or equal to right change"),S.Assert(c.modifiedStart<=o.modifiedStart,"Left change is not less than or equal to right change"),c.originalStart+c.originalLength>=o.originalStart||c.modifiedStart+c.modifiedLength>=o.modifiedStart){const a=c.originalStart;let u=c.originalLength;const r=c.modifiedStart;let i=c.modifiedLength;return c.originalStart+c.originalLength>=o.originalStart&&(u=o.originalStart+o.originalLength-c.originalStart),c.modifiedStart+c.modifiedLength>=o.modifiedStart&&(i=o.modifiedStart+o.modifiedLength-c.modifiedStart),s[0]=new b.DiffChange(a,u,r,i),!0}else return s[0]=null,!1}ClipDiagonalBound(c,o,s,a){if(c>=0&&ct.children.map(L=>o.getId(L.element).toString())},{getElements:()=>[...t.children.slice(0,h),...l,...t.children.slice(h+a)].map(L=>o.getId(L.element).toString())}).ComputeDiff(!1);if(m.quitEarly)return this.spliceSimple(s,a,l,r);const _=s.slice(0,-1),f=(L,I,k)=>{if(i>0)for(let E=0;Ek.originalStart-I.originalStart))f(v,y,v-(L.originalStart+L.originalLength)),v=L.originalStart,y=L.modifiedStart-h,this.spliceSimple([..._,v],L.originalLength,S.Iterable.slice(l,y,y+L.modifiedLength),r);f(v,y,v)}spliceSimple(o,s,a=S.Iterable.empty(),{onDidCreateNode:u,onDidDeleteNode:r}){const{parentNode:i,listIndex:n,revealed:t,visible:l}=this.getParentNodeWithListIndex(o),h=[],m=S.Iterable.map(a,A=>this.createTreeNode(A,i,i.visible?1:0,t,h,u)),_=o[o.length-1],f=i.children.length>0;let v=0;for(let A=_;A>=0&&AB+(F.visible?F.renderNodeCount:0),0);this._updateAncestorsRenderNodeCount(i,I-A),this.list.splice(n,A,h)}if(k.length>0&&r){const A=B=>{r(B),B.children.forEach(A)};k.forEach(A)}const T=i.children.length>0;f!==T&&this.setCollapsible(o.slice(0,-1),T),this._onDidSplice.fire({insertedNodes:y,deletedNodes:k});let O=i;for(;O;){if(O.visibility===2){this.refilter();break}O=O.parent}}rerender(o){if(o.length===0)throw new b.TreeError(this.user,"Invalid tree location");const{node:s,listIndex:a,revealed:u}=this.getTreeNodeWithListIndex(o);s.visible&&u&&this.list.splice(a,1,[s])}has(o){return this.hasTreeNode(o)}getListIndex(o){const{listIndex:s,visible:a,revealed:u}=this.getTreeNodeWithListIndex(o);return a&&u?s:-1}getListRenderCount(o){return this.getTreeNode(o).renderNodeCount}isCollapsible(o){return this.getTreeNode(o).collapsible}setCollapsible(o,s){const a=this.getTreeNode(o);typeof s=="undefined"&&(s=!a.collapsible);const u={collapsible:s};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(o,u))}isCollapsed(o){return this.getTreeNode(o).collapsed}setCollapsed(o,s,a){const u=this.getTreeNode(o);typeof s=="undefined"&&(s=!u.collapsed);const r={collapsed:s,recursive:a||!1};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(o,r))}_setCollapseState(o,s){const{node:a,listIndex:u,revealed:r}=this.getTreeNodeWithListIndex(o),i=this._setListNodeCollapseState(a,u,r,s);if(a!==this.root&&this.autoExpandSingleChildren&&i&&!g(s)&&a.collapsible&&!a.collapsed&&!s.recursive){let n=-1;for(let t=0;t-1){n=-1;break}else n=t;n>-1&&this._setCollapseState([...o,n],s)}return i}_setListNodeCollapseState(o,s,a,u){const r=this._setNodeCollapseState(o,u,!1);if(!a||!o.visible||!r)return r;const i=o.renderNodeCount,n=this.updateNodeAfterCollapseChange(o),t=i-(s===-1?0:1);return this.list.splice(s+1,t,n.slice(1)),r}_setNodeCollapseState(o,s,a){let u;if(o===this.root?u=!1:(g(s)?(u=o.collapsible!==s.collapsible,o.collapsible=s.collapsible):o.collapsible?(u=o.collapsed!==s.collapsed,o.collapsed=s.collapsed):u=!1,u&&this._onDidChangeCollapseState.fire({node:o,deep:a})),!g(s)&&s.recursive)for(const r of o.children)u=this._setNodeCollapseState(r,s,!0)||u;return u}expandTo(o){this.eventBufferer.bufferEvents(()=>{let s=this.getTreeNode(o);for(;s.parent;)s=s.parent,o=o.slice(0,o.length-1),s.collapsed&&this._setCollapseState(o,{collapsed:!1,recursive:!1})})}refilter(){const o=this.root.renderNodeCount,s=this.updateNodeAfterFilterChange(this.root);this.list.splice(0,o,s)}createTreeNode(o,s,a,u,r,i){const n={parent:s,element:o.element,children:[],depth:s.depth+1,visibleChildrenCount:0,visibleChildIndex:-1,collapsible:typeof o.collapsible=="boolean"?o.collapsible:typeof o.collapsed!="undefined",collapsed:typeof o.collapsed=="undefined"?this.collapseByDefault:o.collapsed,renderNodeCount:1,visibility:1,visible:!0,filterData:void 0},t=this._filterNode(n,a);n.visibility=t,u&&r.push(n);const l=o.children||S.Iterable.empty(),h=u&&t!==0&&!n.collapsed,m=S.Iterable.map(l,v=>this.createTreeNode(v,n,t,h,r,i));let _=0,f=1;for(const v of m)n.children.push(v),f+=v.renderNodeCount,v.visible&&(v.visibleChildIndex=_++);return n.collapsible=n.collapsible||n.children.length>0,n.visibleChildrenCount=_,n.visible=t===2?_>0:t===1,n.visible?n.collapsed||(n.renderNodeCount=f):(n.renderNodeCount=0,u&&r.pop()),i&&i(n),n}updateNodeAfterCollapseChange(o){const s=o.renderNodeCount,a=[];return this._updateNodeAfterCollapseChange(o,a),this._updateAncestorsRenderNodeCount(o.parent,a.length-s),a}_updateNodeAfterCollapseChange(o,s){if(o.visible===!1)return 0;if(s.push(o),o.renderNodeCount=1,!o.collapsed)for(const a of o.children)o.renderNodeCount+=this._updateNodeAfterCollapseChange(a,s);return this._onDidChangeRenderNodeCount.fire(o),o.renderNodeCount}updateNodeAfterFilterChange(o){const s=o.renderNodeCount,a=[];return this._updateNodeAfterFilterChange(o,o.visible?1:0,a),this._updateAncestorsRenderNodeCount(o.parent,a.length-s),a}_updateNodeAfterFilterChange(o,s,a,u=!0){let r;if(o!==this.root){if(r=this._filterNode(o,s),r===0)return o.visible=!1,o.renderNodeCount=0,!1;u&&a.push(o)}const i=a.length;o.renderNodeCount=o===this.root?0:1;let n=!1;if(!o.collapsed||r!==0){let t=0;for(const l of o.children)n=this._updateNodeAfterFilterChange(l,r,a,u&&!o.collapsed)||n,l.visible&&(l.visibleChildIndex=t++);o.visibleChildrenCount=t}else o.visibleChildrenCount=0;return o!==this.root&&(o.visible=r===2?n:r===1),o.visible?o.collapsed||(o.renderNodeCount+=a.length-i):(o.renderNodeCount=0,u&&a.pop()),this._onDidChangeRenderNodeCount.fire(o),o.visible}_updateAncestorsRenderNodeCount(o,s){if(s!==0)for(;o;)o.renderNodeCount+=s,this._onDidChangeRenderNodeCount.fire(o),o=o.parent}_filterNode(o,s){const a=this.filter?this.filter.filter(o.element,s):1;return typeof a=="boolean"?(o.filterData=void 0,a?1:0):C(a)?(o.filterData=a.data,d(a.visibility)):(o.filterData=void 0,d(a))}hasTreeNode(o,s=this.root){if(!o||o.length===0)return!0;const[a,...u]=o;return a<0||a>s.children.length?!1:this.hasTreeNode(u,s.children[a])}getTreeNode(o,s=this.root){if(!o||o.length===0)return s;const[a,...u]=o;if(a<0||a>s.children.length)throw new b.TreeError(this.user,"Invalid tree location");return this.getTreeNode(u,s.children[a])}getTreeNodeWithListIndex(o){if(o.length===0)return{node:this.root,listIndex:-1,revealed:!0,visible:!1};const{parentNode:s,listIndex:a,revealed:u,visible:r}=this.getParentNodeWithListIndex(o),i=o[o.length-1];if(i<0||i>s.children.length)throw new b.TreeError(this.user,"Invalid tree location");const n=s.children[i];return{node:n,listIndex:a,revealed:u,visible:r&&n.visible}}getParentNodeWithListIndex(o,s=this.root,a=0,u=!0,r=!0){const[i,...n]=o;if(i<0||i>s.children.length)throw new b.TreeError(this.user,"Invalid tree location");for(let t=0;t{var r;if(u.element!==null){const i=u;if(c.add(i.element),this.nodes.set(i.element,i),this.identityProvider){const n=this.identityProvider.getId(i.element).toString();o.add(n),this.nodesByIdentity.set(n,i)}(r=p.onDidCreateNode)===null||r===void 0||r.call(p,i)}},a=u=>{var r;if(u.element!==null){const i=u;if(c.has(i.element)||this.nodes.delete(i.element),this.identityProvider){const n=this.identityProvider.getId(i.element).toString();o.has(n)||this.nodesByIdentity.delete(n)}(r=p.onDidDeleteNode)===null||r===void 0||r.call(p,i)}};this.model.splice([...d,0],Number.MAX_VALUE,g,Object.assign(Object.assign({},p),{onDidCreateNode:s,onDidDeleteNode:a}))}preserveCollapseState(d=b.Iterable.empty()){return this.sorter&&(d=w.mergeSort([...d],this.sorter.compare.bind(this.sorter))),b.Iterable.map(d,g=>{let p=this.nodes.get(g.element);if(!p&&this.identityProvider){const s=this.identityProvider.getId(g.element).toString();p=this.nodesByIdentity.get(s)}if(!p)return Object.assign(Object.assign({},g),{children:this.preserveCollapseState(g.children)});const c=typeof g.collapsible=="boolean"?g.collapsible:p.collapsible,o=typeof g.collapsed!="undefined"?g.collapsed:p.collapsed;return Object.assign(Object.assign({},g),{collapsible:c,collapsed:o,children:this.preserveCollapseState(g.children)})})}rerender(d){const g=this.getElementLocation(d);this.model.rerender(g)}has(d){return this.nodes.has(d)}getListIndex(d){const g=this.getElementLocation(d);return this.model.getListIndex(g)}getListRenderCount(d){const g=this.getElementLocation(d);return this.model.getListRenderCount(g)}isCollapsible(d){const g=this.getElementLocation(d);return this.model.isCollapsible(g)}setCollapsible(d,g){const p=this.getElementLocation(d);return this.model.setCollapsible(p,g)}isCollapsed(d){const g=this.getElementLocation(d);return this.model.isCollapsed(g)}setCollapsed(d,g,p){const c=this.getElementLocation(d);return this.model.setCollapsed(c,g,p)}expandTo(d){const g=this.getElementLocation(d);this.model.expandTo(g)}refilter(){this.model.refilter()}getNode(d=null){if(d===null)return this.model.getNode(this.model.rootRef);const g=this.nodes.get(d);if(!g)throw new M.TreeError(this.user,`Tree element not found: ${d}`);return g}getNodeLocation(d){return d.element}getParentNodeLocation(d){if(d===null)throw new M.TreeError(this.user,"Invalid getParentNodeLocation call");const g=this.nodes.get(d);if(!g)throw new M.TreeError(this.user,`Tree element not found: ${d}`);const p=this.model.getNodeLocation(g),c=this.model.getParentNodeLocation(p);return this.model.getNode(c).element}getElementLocation(d){if(d===null)return[];const g=this.nodes.get(d);if(!g)throw new M.TreeError(this.user,`Tree element not found: ${d}`);return this.model.getNodeLocation(g)}}e.ObjectTreeModel=S}),define(Q[284],J([0,1,54,6,98,155]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleObjectTreeModel=e.DefaultElementMapper=e.CompressedObjectTreeModel=e.decompress=e.compress=void 0;function S(n){const t=[n.element],l=n.incompressible||!1;return{element:{elements:t,incompressible:l},children:b.Iterable.map(b.Iterable.from(n.children),S),collapsible:n.collapsible,collapsed:n.collapsed}}function C(n){const t=[n.element],l=n.incompressible||!1;let h,m;for(;[m,h]=b.Iterable.consume(b.Iterable.from(n.children),2),!(m.length!==1||m[0].incompressible);)n=m[0],t.push(n.element);return{element:{elements:t,incompressible:l},children:b.Iterable.map(b.Iterable.concat(m,h),C),collapsible:n.collapsible,collapsed:n.collapsed}}e.compress=C;function d(n,t=0){let l;return td(h,0)),t===0&&n.element.incompressible?{element:n.element.elements[t],children:l,incompressible:!0,collapsible:n.collapsible,collapsed:n.collapsed}:{element:n.element.elements[t],children:l,collapsible:n.collapsible,collapsed:n.collapsed}}function g(n){return d(n,0)}e.decompress=g;function p(n,t,l){return n.element===t?Object.assign(Object.assign({},n),{children:l}):Object.assign(Object.assign({},n),{children:b.Iterable.map(b.Iterable.from(n.children),h=>p(h,t,l))})}const c=n=>({getId(t){return t.elements.map(l=>n.getId(l).toString()).join("\0")}});class o{constructor(t,l,h={}){this.user=t,this.rootRef=null,this.nodes=new Map,this.model=new w.ObjectTreeModel(t,l,h),this.enabled=typeof h.compressionEnabled=="undefined"?!0:h.compressionEnabled,this.identityProvider=h.identityProvider}get onDidSplice(){return this.model.onDidSplice}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get onDidChangeRenderNodeCount(){return this.model.onDidChangeRenderNodeCount}setChildren(t,l=b.Iterable.empty(),h){const m=h.diffIdentityProvider&&c(h.diffIdentityProvider);if(t===null){const T=b.Iterable.map(l,this.enabled?C:S);this._setChildren(null,T,{diffIdentityProvider:m,diffDepth:Infinity});return}const _=this.nodes.get(t);if(!_)throw new Error("Unknown compressed tree node");const f=this.model.getNode(_),v=this.model.getParentNodeLocation(_),y=this.model.getNode(v),L=g(f),I=p(L,t,l),k=(this.enabled?C:S)(I),E=y.children.map(T=>T===f?k:T);this._setChildren(y.element,E,{diffIdentityProvider:m,diffDepth:f.depth-y.depth})}setCompressionEnabled(t){if(t!==this.enabled){this.enabled=t;const h=this.model.getNode().children,m=b.Iterable.map(h,g),_=b.Iterable.map(m,t?C:S);this._setChildren(null,_,{diffIdentityProvider:this.identityProvider,diffDepth:Infinity})}}_setChildren(t,l,h){const m=new Set,_=v=>{for(const y of v.element.elements)m.add(y),this.nodes.set(y,v.element)},f=v=>{for(const y of v.element.elements)m.has(y)||this.nodes.delete(y)};this.model.setChildren(t,l,Object.assign(Object.assign({},h),{onDidCreateNode:_,onDidDeleteNode:f}))}has(t){return this.nodes.has(t)}getListIndex(t){const l=this.getCompressedNode(t);return this.model.getListIndex(l)}getListRenderCount(t){const l=this.getCompressedNode(t);return this.model.getListRenderCount(l)}getNode(t){if(typeof t=="undefined")return this.model.getNode();const l=this.getCompressedNode(t);return this.model.getNode(l)}getNodeLocation(t){const l=this.model.getNodeLocation(t);return l===null?null:l.elements[l.elements.length-1]}getParentNodeLocation(t){const l=this.getCompressedNode(t),h=this.model.getParentNodeLocation(l);return h===null?null:h.elements[h.elements.length-1]}isCollapsible(t){const l=this.getCompressedNode(t);return this.model.isCollapsible(l)}setCollapsible(t,l){const h=this.getCompressedNode(t);return this.model.setCollapsible(h,l)}isCollapsed(t){const l=this.getCompressedNode(t);return this.model.isCollapsed(l)}setCollapsed(t,l,h){const m=this.getCompressedNode(t);return this.model.setCollapsed(m,l,h)}expandTo(t){const l=this.getCompressedNode(t);this.model.expandTo(l)}rerender(t){const l=this.getCompressedNode(t);this.model.rerender(l)}refilter(){this.model.refilter()}getCompressedNode(t){if(t===null)return null;const l=this.nodes.get(t);if(!l)throw new M.TreeError(this.user,`Tree element not found: ${t}`);return l}}e.CompressedObjectTreeModel=o;const s=n=>n[n.length-1];e.DefaultElementMapper=s;class a{constructor(t,l){this.unwrapper=t,this.node=l}get element(){return this.node.element===null?null:this.unwrapper(this.node.element)}get children(){return this.node.children.map(t=>new a(this.unwrapper,t))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}function u(n,t){return{splice(l,h,m){t.splice(l,h,m.map(_=>n.map(_)))},updateElementHeight(l,h){t.updateElementHeight(l,h)}}}function r(n,t){return Object.assign(Object.assign({},t),{identityProvider:t.identityProvider&&{getId(l){return t.identityProvider.getId(n(l))}},sorter:t.sorter&&{compare(l,h){return t.sorter.compare(l.elements[0],h.elements[0])}},filter:t.filter&&{filter(l,h){return t.filter.filter(n(l),h)}}})}class i{constructor(t,l,h={}){this.rootRef=null,this.elementMapper=h.elementMapper||e.DefaultElementMapper;const m=_=>this.elementMapper(_.elements);this.nodeMapper=new M.WeakMapper(_=>new a(m,_)),this.model=new o(t,u(this.nodeMapper,l),r(m,h))}get onDidSplice(){return N.Event.map(this.model.onDidSplice,({insertedNodes:t,deletedNodes:l})=>({insertedNodes:t.map(h=>this.nodeMapper.map(h)),deletedNodes:l.map(h=>this.nodeMapper.map(h))}))}get onDidChangeCollapseState(){return N.Event.map(this.model.onDidChangeCollapseState,({node:t,deep:l})=>({node:this.nodeMapper.map(t),deep:l}))}get onDidChangeRenderNodeCount(){return N.Event.map(this.model.onDidChangeRenderNodeCount,t=>this.nodeMapper.map(t))}setChildren(t,l=b.Iterable.empty(),h={}){this.model.setChildren(t,l,h)}setCompressionEnabled(t){this.model.setCompressionEnabled(t)}has(t){return this.model.has(t)}getListIndex(t){return this.model.getListIndex(t)}getListRenderCount(t){return this.model.getListRenderCount(t)}getNode(t){return this.nodeMapper.map(this.model.getNode(t))}getNodeLocation(t){return t.element}getParentNodeLocation(t){return this.model.getParentNodeLocation(t)}isCollapsible(t){return this.model.isCollapsible(t)}setCollapsible(t,l){return this.model.setCollapsible(t,l)}isCollapsed(t){return this.model.isCollapsed(t)}setCollapsed(t,l,h){return this.model.setCollapsed(t,l,h)}expandTo(t){return this.model.expandTo(t)}rerender(t){return this.model.rerender(t)}refilter(){return this.model.refilter()}getCompressedTreeNode(t=null){return this.model.getNode(t)}}e.CompressibleObjectTreeModel=i}),define(Q[285],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.buildReplaceStringWithCasePreserved=void 0;function N(S,C){if(S&&S[0]!==""){const d=M(S,C,"-"),g=M(S,C,"_");return d&&!g?w(S,C,"-"):!d&&g?w(S,C,"_"):S[0].toUpperCase()===S[0]?C.toUpperCase():S[0].toLowerCase()===S[0]?C.toLowerCase():b.containsUppercaseCharacter(S[0][0])&&C.length>0?C[0].toUpperCase()+C.substr(1):C}else return C}e.buildReplaceStringWithCasePreserved=N;function M(S,C,d){return S[0].indexOf(d)!==-1&&C.indexOf(d)!==-1&&S[0].split(d).length===C.split(d).length}function w(S,C,d){const g=C.split(d),p=S[0].split(d);let c="";return g.forEach((o,s)=>{c+=N([p[s]],o)+d}),c.slice(0,-1)}}),define(Q[82],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var N;(function(M){M[M.Ignore=0]="Ignore",M[M.Info=1]="Info",M[M.Warning=2]="Warning",M[M.Error=3]="Error"})(N||(N={})),function(M){const w="error",S="warning",C="warn",d="info";function g(p){return p?b.equalsIgnoreCase(w,p)?M.Error:b.equalsIgnoreCase(S,p)||b.equalsIgnoreCase(C,p)?M.Warning:b.equalsIgnoreCase(d,p)?M.Info:M.Ignore:M.Ignore}M.fromValue=g}(N||(N={})),e.default=N}),define(Q[20],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.withNullAsUndefined=e.createProxyObject=e.getAllMethodNames=e.getAllPropertyNames=e.validateConstraint=e.validateConstraints=e.isFunction=e.assertIsDefined=e.assertType=e.isUndefinedOrNull=e.isUndefined=e.isBoolean=e.isNumber=e.isObject=e.isString=e.isArray=void 0;function b(n){return Array.isArray(n)}e.isArray=b;function N(n){return typeof n=="string"}e.isString=N;function M(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)&&!(n instanceof RegExp)&&!(n instanceof Date)}e.isObject=M;function w(n){return typeof n=="number"&&!isNaN(n)}e.isNumber=w;function S(n){return n===!0||n===!1}e.isBoolean=S;function C(n){return typeof n=="undefined"}e.isUndefined=C;function d(n){return C(n)||n===null}e.isUndefinedOrNull=d;function g(n,t){if(!n)throw new Error(t?`Unexpected type, expected '${t}'`:"Unexpected type")}e.assertType=g;function p(n){if(d(n))throw new Error("Assertion Failed: argument is undefined or null");return n}e.assertIsDefined=p;function c(n){return typeof n=="function"}e.isFunction=c;function o(n,t){const l=Math.min(n.length,t.length);for(let h=0;hfunction(){const _=Array.prototype.slice.call(arguments,0);return t(m,_)};let h={};for(const m of n)h[m]=l(m);return h}e.createProxyObject=r;function i(n){return n===null?void 0:n}e.withNullAsUndefined=i}),define(Q[40],J([0,1,20]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getOrDefault=e.equals=e.mixin=e.cloneAndChange=e.deepFreeze=e.deepClone=void 0;function N(c){if(!c||typeof c!="object"||c instanceof RegExp)return c;const o=Array.isArray(c)?[]:{};return Object.keys(c).forEach(s=>{c[s]&&typeof c[s]=="object"?o[s]=N(c[s]):o[s]=c[s]}),o}e.deepClone=N;function M(c){if(!c||typeof c!="object")return c;const o=[c];for(;o.length>0;){const s=o.shift();Object.freeze(s);for(const a in s)if(w.call(s,a)){const u=s[a];typeof u=="object"&&!Object.isFrozen(u)&&o.push(u)}}return c}e.deepFreeze=M;const w=Object.prototype.hasOwnProperty;function S(c,o){return C(c,o,new Set)}e.cloneAndChange=S;function C(c,o,s){if(b.isUndefinedOrNull(c))return c;const a=o(c);if(typeof a!="undefined")return a;if(b.isArray(c)){const u=[];for(const r of c)u.push(C(r,o,s));return u}if(b.isObject(c)){if(s.has(c))throw new Error("Cannot clone recursive data-structure");s.add(c);const u={};for(let r in c)w.call(c,r)&&(u[r]=C(c[r],o,s));return s.delete(c),u}return c}function d(c,o,s=!0){return b.isObject(c)?(b.isObject(o)&&Object.keys(o).forEach(a=>{a in c?s&&(b.isObject(c[a])&&b.isObject(o[a])?d(c[a],o[a],s):c[a]=o[a]):c[a]=o[a]}),c):o}e.mixin=d;function g(c,o){if(c===o)return!0;if(c==null||o===null||o===void 0||typeof c!=typeof o||typeof c!="object"||Array.isArray(c)!==Array.isArray(o))return!1;let s,a;if(Array.isArray(c)){if(c.length!==o.length)return!1;for(s=0;s255?255:M|0}e.toUint8=b;function N(M){return M<0?0:M>4294967295?4294967295:M|0}e.toUint32=N}),define(Q[24],J([0,1,17,72]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.uriToFsPath=e.URI=void 0;const M=/^\w[\w\d+.-]*$/,w=/^\//,S=/^\/\//;function C(f,v){if(!f.scheme&&v)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${f.authority}", path: "${f.path}", query: "${f.query}", fragment: "${f.fragment}"}`);if(f.scheme&&!M.test(f.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(f.path){if(f.authority){if(!w.test(f.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(S.test(f.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}function d(f,v){return!f&&!v?"file":f}function g(f,v){switch(f){case"https":case"http":case"file":v?v[0]!==c&&(v=c+v):v=c;break}return v}const p="",c="/",o=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class s{constructor(v,y,L,I,k,E=!1){typeof v=="object"?(this.scheme=v.scheme||p,this.authority=v.authority||p,this.path=v.path||p,this.query=v.query||p,this.fragment=v.fragment||p):(this.scheme=d(v,E),this.authority=y||p,this.path=g(this.scheme,L||p),this.query=I||p,this.fragment=k||p,C(this,E))}static isUri(v){return v instanceof s?!0:v?typeof v.authority=="string"&&typeof v.fragment=="string"&&typeof v.path=="string"&&typeof v.query=="string"&&typeof v.scheme=="string"&&typeof v.fsPath=="string"&&typeof v.with=="function"&&typeof v.toString=="function":!1}get fsPath(){return t(this,!1)}with(v){if(!v)return this;let{scheme:y,authority:L,path:I,query:k,fragment:E}=v;return y===void 0?y=this.scheme:y===null&&(y=p),L===void 0?L=this.authority:L===null&&(L=p),I===void 0?I=this.path:I===null&&(I=p),k===void 0?k=this.query:k===null&&(k=p),E===void 0?E=this.fragment:E===null&&(E=p),y===this.scheme&&L===this.authority&&I===this.path&&k===this.query&&E===this.fragment?this:new u(y,L,I,k,E)}static parse(v,y=!1){const L=o.exec(v);return L?new u(L[2]||p,_(L[4]||p),_(L[5]||p),_(L[7]||p),_(L[9]||p),y):new u(p,p,p,p,p)}static file(v){let y=p;if(b.isWindows&&(v=v.replace(/\\/g,c)),v[0]===c&&v[1]===c){const L=v.indexOf(c,2);L===-1?(y=v.substring(2),v=c):(y=v.substring(2,L),v=v.substring(L)||c)}return new u("file",y,v,p,p)}static from(v){return new u(v.scheme,v.authority,v.path,v.query,v.fragment)}static joinPath(v,...y){if(!v.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let L;return b.isWindows&&v.scheme==="file"?L=s.file(N.win32.join(t(v,!0),...y)).path:L=N.posix.join(v.path,...y),v.with({path:L})}toString(v=!1){return l(this,v)}toJSON(){return this}static revive(v){if(v){if(v instanceof s)return v;{const y=new u(v);return y._formatted=v.external,y._fsPath=v._sep===a?v.fsPath:null,y}}else return v}}e.URI=s;const a=b.isWindows?1:void 0;class u extends s{constructor(){super(...arguments);this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=t(this,!1)),this._fsPath}toString(v=!1){return v?l(this,!0):(this._formatted||(this._formatted=l(this,!1)),this._formatted)}toJSON(){const v={$mid:1};return this._fsPath&&(v.fsPath=this._fsPath,v._sep=a),this._formatted&&(v.external=this._formatted),this.path&&(v.path=this.path),this.scheme&&(v.scheme=this.scheme),this.authority&&(v.authority=this.authority),this.query&&(v.query=this.query),this.fragment&&(v.fragment=this.fragment),v}}const r={[58]:"%3A",[47]:"%2F",[63]:"%3F",[35]:"%23",[91]:"%5B",[93]:"%5D",[64]:"%40",[33]:"%21",[36]:"%24",[38]:"%26",[39]:"%27",[40]:"%28",[41]:"%29",[42]:"%2A",[43]:"%2B",[44]:"%2C",[59]:"%3B",[61]:"%3D",[32]:"%20"};function i(f,v){let y,L=-1;for(let I=0;I=97&&k<=122||k>=65&&k<=90||k>=48&&k<=57||k===45||k===46||k===95||k===126||v&&k===47)L!==-1&&(y+=encodeURIComponent(f.substring(L,I)),L=-1),y!==void 0&&(y+=f.charAt(I));else{y===void 0&&(y=f.substr(0,I));const E=r[k];E!==void 0?(L!==-1&&(y+=encodeURIComponent(f.substring(L,I)),L=-1),y+=E):L===-1&&(L=I)}}return L!==-1&&(y+=encodeURIComponent(f.substring(L))),y!==void 0?y:f}function n(f){let v;for(let y=0;y1&&f.scheme==="file"?y=`//${f.authority}${f.path}`:f.path.charCodeAt(0)===47&&(f.path.charCodeAt(1)>=65&&f.path.charCodeAt(1)<=90||f.path.charCodeAt(1)>=97&&f.path.charCodeAt(1)<=122)&&f.path.charCodeAt(2)===58?v?y=f.path.substr(1):y=f.path[1].toLowerCase()+f.path.substr(2):y=f.path,b.isWindows&&(y=y.replace(/\//g,"\\")),y}e.uriToFsPath=t;function l(f,v){const y=v?n:i;let L="",{scheme:I,authority:k,path:E,query:T,fragment:O}=f;if(I&&(L+=I,L+=":"),(k||I==="file")&&(L+=c,L+=c),k){let A=k.indexOf("@");if(A!==-1){const B=k.substr(0,A);k=k.substr(A+1),A=B.indexOf(":"),A===-1?L+=y(B,!1):(L+=y(B.substr(0,A),!1),L+=":",L+=y(B.substr(A+1),!1)),L+="@"}k=k.toLowerCase(),A=k.indexOf(":"),A===-1?L+=y(k,!1):(L+=y(k.substr(0,A),!1),L+=k.substr(A))}if(E){if(E.length>=3&&E.charCodeAt(0)===47&&E.charCodeAt(2)===58){const A=E.charCodeAt(1);A>=65&&A<=90&&(E=`/${String.fromCharCode(A+32)}:${E.substr(3)}`)}else if(E.length>=2&&E.charCodeAt(1)===58){const A=E.charCodeAt(0);A>=65&&A<=90&&(E=`${String.fromCharCode(A+32)}:${E.substr(2)}`)}L+=y(E,!0)}return T&&(L+="?",L+=y(T,!1)),O&&(L+="#",L+=v?O:i(O,!1)),L}function h(f){try{return decodeURIComponent(f)}catch(v){return f.length>3?f.substr(0,3)+h(f.substr(3)):f}}const m=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function _(f){return f.match(m)?f.replace(m,v=>h(v)):f}}),define(Q[51],J([0,1,24,8]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LRUCache=e.LinkedMap=e.ResourceMap=e.TernarySearchTree=e.UriIterator=e.PathIterator=e.ConfigKeysIterator=e.StringIterator=void 0;class M{constructor(){this._value="",this._pos=0}reset(a){return this._value=a,this._pos=0,this}next(){return this._pos+=1,this}hasNext(){return this._pos!1){return new g(new C(a))}static forStrings(){return new g(new M)}static forConfigKeys(){return new g(new w)}clear(){this._root=void 0}set(a,u){const r=this._iter.reset(a);let i;for(this._root||(this._root=new d,this._root.segment=r.value()),i=this._root;;){const t=r.cmp(i.segment);if(t>0)i.left||(i.left=new d,i.left.segment=r.value()),i=i.left;else if(t<0)i.right||(i.right=new d,i.right.segment=r.value()),i=i.right;else if(r.hasNext())r.next(),i.mid||(i.mid=new d,i.mid.segment=r.value()),i=i.mid;else break}const n=i.value;return i.value=u,i.key=a,n}get(a){var u;return(u=this._getNode(a))===null||u===void 0?void 0:u.value}_getNode(a){const u=this._iter.reset(a);let r=this._root;for(;r;){const i=u.cmp(r.segment);if(i>0)r=r.left;else if(i<0)r=r.right;else if(u.hasNext())u.next(),r=r.mid;else break}return r}has(a){const u=this._getNode(a);return!((u==null?void 0:u.value)===void 0&&(u==null?void 0:u.mid)===void 0)}delete(a){return this._delete(a,!1)}deleteSuperstr(a){return this._delete(a,!0)}_delete(a,u){const r=this._iter.reset(a),i=[];let n=this._root;for(;n;){const t=r.cmp(n.segment);if(t>0)i.push([1,n]),n=n.left;else if(t<0)i.push([-1,n]),n=n.right;else if(r.hasNext())r.next(),i.push([0,n]),n=n.mid;else{for(u?(n.left=void 0,n.mid=void 0,n.right=void 0):n.value=void 0;i.length>0&&n.isEmpty();){let[l,h]=i.pop();switch(l){case 1:h.left=void 0;break;case 0:h.mid=void 0;break;case-1:h.right=void 0;break}n=h}break}}}findSubstr(a){const u=this._iter.reset(a);let r=this._root,i;for(;r;){const n=u.cmp(r.segment);if(n>0)r=r.left;else if(n<0)r=r.right;else if(u.hasNext())u.next(),i=r.value||i,r=r.mid;else break}return r&&r.value||i}findSuperstr(a){const u=this._iter.reset(a);let r=this._root;for(;r;){const i=u.cmp(r.segment);if(i>0)r=r.left;else if(i<0)r=r.right;else if(u.hasNext())u.next(),r=r.mid;else return r.mid?this._entries(r.mid):void 0}}forEach(a){for(const[u,r]of this)a(r,u)}*[Symbol.iterator](){yield*this._entries(this._root)}*_entries(a){a&&(yield*this._entries(a.left),a.value&&(yield[a.key,a.value]),yield*this._entries(a.mid),yield*this._entries(a.right))}}e.TernarySearchTree=g;class p{constructor(a,u){this[Symbol.toStringTag]="ResourceMap",a instanceof p?(this.map=new Map(a.map),this.toKey=u!=null?u:p.defaultToKey):(this.map=new Map,this.toKey=a!=null?a:p.defaultToKey)}set(a,u){return this.map.set(this.toKey(a),u),this}get(a){return this.map.get(this.toKey(a))}has(a){return this.map.has(this.toKey(a))}get size(){return this.map.size}clear(){this.map.clear()}delete(a){return this.map.delete(this.toKey(a))}forEach(a,u){typeof u!="undefined"&&(a=a.bind(u));for(let[r,i]of this.map)a(i,b.URI.parse(r),this)}values(){return this.map.values()}*keys(){for(let a of this.map.keys())yield b.URI.parse(a)}*entries(){for(let a of this.map.entries())yield[b.URI.parse(a[0]),a[1]]}*[Symbol.iterator](){for(let a of this.map)yield[b.URI.parse(a[0]),a[1]]}}e.ResourceMap=p,p.defaultToKey=s=>s.toString();class c{constructor(){this[Symbol.toStringTag]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){var a;return(a=this._head)===null||a===void 0?void 0:a.value}get last(){var a;return(a=this._tail)===null||a===void 0?void 0:a.value}has(a){return this._map.has(a)}get(a,u=0){const r=this._map.get(a);if(!!r)return u!==0&&this.touch(r,u),r.value}set(a,u,r=0){let i=this._map.get(a);if(i)i.value=u,r!==0&&this.touch(i,r);else{switch(i={key:a,value:u,next:void 0,previous:void 0},r){case 0:this.addItemLast(i);break;case 1:this.addItemFirst(i);break;case 2:this.addItemLast(i);break;default:this.addItemLast(i);break}this._map.set(a,i),this._size++}return this}delete(a){return!!this.remove(a)}remove(a){const u=this._map.get(a);if(!!u)return this._map.delete(a),this.removeItem(u),this._size--,u.value}shift(){if(!(!this._head&&!this._tail)){if(!this._head||!this._tail)throw new Error("Invalid list");const a=this._head;return this._map.delete(a.key),this.removeItem(a),this._size--,a.value}}forEach(a,u){const r=this._state;let i=this._head;for(;i;){if(u?a.bind(u)(i.value,i.key,this):a(i.value,i.key,this),this._state!==r)throw new Error("LinkedMap got modified during iteration.");i=i.next}}keys(){const a=this,u=this._state;let r=this._head;const i={[Symbol.iterator](){return i},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(r){const n={value:r.key,done:!1};return r=r.next,n}else return{value:void 0,done:!0}}};return i}values(){const a=this,u=this._state;let r=this._head;const i={[Symbol.iterator](){return i},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(r){const n={value:r.value,done:!1};return r=r.next,n}else return{value:void 0,done:!0}}};return i}entries(){const a=this,u=this._state;let r=this._head;const i={[Symbol.iterator](){return i},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(r){const n={value:[r.key,r.value],done:!1};return r=r.next,n}else return{value:void 0,done:!0}}};return i}[Symbol.iterator](){return this.entries()}trimOld(a){if(!(a>=this.size)){if(a===0){this.clear();return}let u=this._head,r=this.size;for(;u&&r>a;)this._map.delete(u.key),u=u.next,r--;this._head=u,this._size=r,u&&(u.previous=void 0),this._state++}}addItemFirst(a){if(!this._head&&!this._tail)this._tail=a;else if(this._head)a.next=this._head,this._head.previous=a;else throw new Error("Invalid list");this._head=a,this._state++}addItemLast(a){if(!this._head&&!this._tail)this._head=a;else if(this._tail)a.previous=this._tail,this._tail.next=a;else throw new Error("Invalid list");this._tail=a,this._state++}removeItem(a){if(a===this._head&&a===this._tail)this._head=void 0,this._tail=void 0;else if(a===this._head){if(!a.next)throw new Error("Invalid list");a.next.previous=void 0,this._head=a.next}else if(a===this._tail){if(!a.previous)throw new Error("Invalid list");a.previous.next=void 0,this._tail=a.previous}else{const u=a.next,r=a.previous;if(!u||!r)throw new Error("Invalid list");u.previous=r,r.next=u}a.next=void 0,a.previous=void 0,this._state++}touch(a,u){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(u!==1&&u!==2)){if(u===1){if(a===this._head)return;const r=a.next,i=a.previous;a===this._tail?(i.next=void 0,this._tail=i):(r.previous=i,i.next=r),a.previous=void 0,a.next=this._head,this._head.previous=a,this._head=a,this._state++}else if(u===2){if(a===this._tail)return;const r=a.next,i=a.previous;a===this._head?(r.previous=void 0,this._head=r):(r.previous=i,i.next=r),a.next=void 0,a.previous=this._tail,this._tail.next=a,this._tail=a,this._state++}}}toJSON(){const a=[];return this.forEach((u,r)=>{a.push([r,u])}),a}fromJSON(a){this.clear();for(const[u,r]of a)this.set(u,r)}}e.LinkedMap=c;class o extends c{constructor(a,u=1){super();this._limit=a,this._ratio=Math.min(Math.max(0,u),1)}get limit(){return this._limit}set limit(a){this._limit=a,this.checkTrim()}get(a,u=2){return super.get(a,u)}peek(a){return super.get(a,0)}set(a,u){return super.set(a,u,2),this.checkTrim(),this}checkTrim(){this.size>this._limit&&this.trimOld(Math.round(this._limit*this._ratio))}}e.LRUCache=o}),define(Q[66],J([0,1,51,8]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.fuzzyScoreGracefulAggressive=e.fuzzyScore=e.FuzzyScore=e.isPatternInWord=e.createMatches=e.anyScore=e.matchesFuzzy=e.matchesWords=e.matchesCamelCase=e.isUpper=e.matchesSubString=e.matchesContiguousSubString=e.matchesPrefix=e.or=void 0;function M(...G){return function(j,te){for(let Z=0,ue=G.length;Z0?[{start:0,end:j.length}]:[]:null}function S(G,j){const te=j.toLowerCase().indexOf(G.toLowerCase());return te===-1?null:[{start:te,end:te+G.length}]}e.matchesContiguousSubString=S;function C(G,j){return d(G.toLowerCase(),j.toLowerCase(),0,0)}e.matchesSubString=C;function d(G,j,te,Z){if(te===G.length)return[];if(Z===j.length)return null;if(G[te]===j[Z]){let ue=null;return(ue=d(G,j,te+1,Z+1))?i({start:Z,end:Z+1},ue):null}return d(G,j,te,Z+1)}function g(G){return 97<=G&&G<=122}function p(G){return 65<=G&&G<=90}e.isUpper=p;function c(G){return 48<=G&&G<=57}function o(G){return G===32||G===9||G===10||G===13}const s=new Set;"`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?".split("").forEach(G=>s.add(G.charCodeAt(0)));function a(G){return o(G)||s.has(G)}function u(G,j){return G===j||a(G)&&a(j)}function r(G){return g(G)||p(G)||c(G)}function i(G,j){return j.length===0?j=[G]:G.end===j[0].start?j[0].start=G.start:j.unshift(G),j}function n(G,j){for(let te=j;te0&&!r(G.charCodeAt(te-1)))return te}return G.length}function t(G,j,te,Z){if(te===G.length)return[];if(Z===j.length)return null;if(G[te]!==j[Z].toLowerCase())return null;{let ue=null,he=Z+1;for(ue=t(G,j,te+1,Z+1);!ue&&(he=n(j,he)).6}function m(G){const{upperPercent:j,lowerPercent:te,alphaPercent:Z,numericPercent:ue}=G;return te>.2&&j<.8&&Z>.6&&ue<.2}function _(G){let j=0,te=0,Z=0,ue=0;for(let he=0;he60)return null;const te=l(j);if(!m(te)){if(!h(te))return null;j=j.toLowerCase()}let Z=null,ue=0;for(G=G.toLowerCase();ue0&&a(G.charCodeAt(te-1)))return te;return G.length}const I=M(e.matchesPrefix,f,S),k=M(e.matchesPrefix,f,C),E=new b.LRUCache(1e4);function T(G,j,te=!1){if(typeof G!="string"||typeof j!="string")return null;let Z=E.get(G);Z||(Z=new RegExp(N.convertSimple2RegExpPattern(G),"i"),E.set(G,Z));const ue=Z.exec(j);return ue?[{start:ue.index,end:ue.index+ue[0].length}]:te?k(G,j):I(G,j)}e.matchesFuzzy=T;function O(G,j,te,Z,ue,he){const re=U(G,j,0,Z,ue,0,!0);if(re)return re;let ce=[],me=0,Ce=he;for(let be=0;be=0)me+=1,ce.unshift(Le),Ce=Le+1;else if(ce.length>0)break}return[me,he,...ce]}e.anyScore=O;function A(G){if(typeof G=="undefined")return[];const j=[],te=G[1];for(let Z=G.length-1;Z>1;Z--){const ue=G[Z]+te,he=j[j.length-1];he&&he.end===ue?he.end=ue+1:j.push({start:ue,end:ue+1})}return j}e.createMatches=A;const B=128;function F(){const G=[],j=[];for(let te=0;te<=B;te++)j[te]=0;for(let te=0;te<=B;te++)G.push(j.slice(0));return G}function D(G){const j=[];for(let te=0;te<=G;te++)j[te]=0;return j}const R=D(2*B),W=D(2*B),x=F(),K=F(),Y=F(),ee=!1;function se(G,j,te,Z,ue){function he(ce,me,Ce=" "){for(;ce.lengthhe(ce,3)).join("|")} +`;for(let ce=0;ce<=te;ce++)ce===0?re+=" |":re+=`${j[ce-1]}|`,re+=G[ce].slice(0,ue+1).map(me=>he(me.toString(),3)).join("|")+` +`;return re}function ne(G,j,te,Z){G=G.substr(j),te=te.substr(Z),console.log(se(K,G,G.length,te,te.length)),console.log(se(Y,G,G.length,te,te.length)),console.log(se(x,G,G.length,te,te.length))}function le(G,j){if(j<0||j>=G.length)return!1;const te=G.codePointAt(j);switch(te){case 95:case 45:case 46:case 32:case 47:case 92:case 39:case 34:case 58:case 36:case 60:case 40:case 91:return!0;case void 0:return!1;default:return!!N.isEmojiImprecise(te)}}function X(G,j){if(j<0||j>=G.length)return!1;switch(G.charCodeAt(j)){case 32:case 9:return!0;default:return!1}}function z(G,j,te){return j[G]!==te[G]}function P(G,j,te,Z,ue,he,re=!1){for(;jB?B:G.length,me=Z.length>B?B:Z.length;if(!(te>=ce||he>=me||ce-te>me-he)&&!!P(j,te,ce,ue,he,me,!0)){H(ce,me,te,he,j,ue);let Ce=1,be=1,Le=te,De=he;const Re=[!1];for(Ce=1,Le=te;Leye,Ne=ke?K[Ce][be-1]+(x[Ce][be-1]>0?-5:0):0,Te=De>ye+1&&x[Ce][be-1]>0,Oe=Te?K[Ce][be-2]+(x[Ce][be-2]>0?-5:0):0;if(Te&&(!ke||Oe>=Ne)&&(!pe||Oe>=ve))K[Ce][be]=Oe,Y[Ce][be]=3,x[Ce][be]=0;else if(ke&&(!pe||Ne>=ve))K[Ce][be]=Ne,Y[Ce][be]=2,x[Ce][be]=0;else if(pe)K[Ce][be]=ve,Y[Ce][be]=1,x[Ce][be]=x[Ce-1][be-1]+1;else throw new Error("not possible")}}if(ee&&ne(G,te,Z,he),!(!Re[0]&&!re)){Ce--,be--;const Ee=[K[Ce][be],he];let Ae=0,Se=0;for(;Ce>=1;){let ye=be;do{const fe=Y[Ce][ye];if(fe===3)ye=ye-2;else if(fe===2)ye=ye-1;else break}while(ye>=1);Ae>1&&j[te+Ce-1]===ue[he+be-1]&&!z(ye+he-1,Z,ue)&&Ae+1>x[Ce][ye]&&(ye=be),ye===be?Ae++:Ae=1,Se||(Se=ye),Ce--,be=ye-1,Ee.push(be)}me===ce&&(Ee[0]+=2);const we=Se-ce;return Ee[0]-=we,Ee}}}e.fuzzyScore=U;function H(G,j,te,Z,ue,he){let re=G-1,ce=j-1;for(;re>=te&&ce>=Z;)ue[re]===he[ce]&&(W[re]=ce,re--),ce--}function $(G,j,te,Z,ue,he,re,ce,me,Ce,be){if(j[te]!==he[re])return Number.MIN_SAFE_INTEGER;let Le=1,De=!1;return re===te-Z?Le=G[te]===ue[re]?7:5:z(re,ue,he)&&(re===0||!z(re-1,ue,he))?(Le=G[te]===ue[re]?7:5,De=!0):le(he,re)&&(re===0||!le(he,re-1))?Le=5:(le(he,re-1)||X(he,re-1))&&(Le=5,De=!0),Le>1&&te===Z&&(be[0]=!0),De||(De=z(re,ue,he)||le(he,re-1)||X(he,re-1)),te===Z?re>me&&(Le-=De?3:5):Ce?Le+=De?2:0:Le+=De?0:1,re+1===ce&&(Le-=De?3:5),Le}function ie(G,j,te,Z,ue,he,re){return oe(G,j,te,Z,ue,he,!0,re)}e.fuzzyScoreGracefulAggressive=ie;function oe(G,j,te,Z,ue,he,re,ce){let me=U(G,j,te,Z,ue,he,ce);if(me&&!re)return me;if(G.length>=3){const Ce=Math.min(7,G.length-1);for(let be=te+1;beme[0])&&(me=De))}}}return me}function ae(G,j){if(!(j+1>=G.length)){const te=G[j],Z=G[j+1];if(te!==Z)return G.slice(0,j)+Z+te+G.slice(j+2)}}}),define(Q[286],J([0,1,66,72,17,8]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.pieceToQuery=e.prepareQuery=e.scoreFuzzy2=void 0;const S=[void 0,[]];function C(r,i,n=0,t=0){const l=i;return l.values&&l.values.length>1?d(r,l.values,n,t):g(r,i,n,t)}e.scoreFuzzy2=C;function d(r,i,n,t){let l=0;const h=[];for(const m of i){const[_,f]=g(r,m,n,t);if(typeof _!="number")return S;l+=_,h.push(...f)}return[l,p(h)]}function g(r,i,n,t){const l=b.fuzzyScore(i.original,i.originalLowercase,n,r,r.toLowerCase(),t,!0);return l?[l[0],b.createMatches(l)]:S}function p(r){const i=r.sort((l,h)=>l.start-h.start),n=[];let t;for(const l of i)!t||!c(t,l)?(t=l,n.push(l)):(t.start=Math.min(t.start,l.start),t.end=Math.max(t.end,l.end));return n}function c(r,i){return!(r.end=0;let m;const _=r.split(o);if(_.length>1)for(const f of _){const{pathNormalized:v,normalized:y,normalizedLowercase:L}=a(f);y&&(m||(m=[]),m.push({original:f,originalLowercase:f.toLowerCase(),pathNormalized:v,normalized:y,normalizedLowercase:L}))}return{original:r,originalLowercase:i,pathNormalized:n,normalized:t,normalizedLowercase:l,values:m,containsPathSeparator:h}}e.prepareQuery=s;function a(r){let i;M.isWindows?i=r.replace(/\//g,N.sep):i=r.replace(/\\/g,N.sep);const n=w.stripWildcards(i).replace(/\s/g,"");return{pathNormalized:i,normalized:n,normalizedLowercase:n.toLowerCase()}}function u(r){return Array.isArray(r)?s(r.map(i=>i.original).join(o)):s(r.original)}e.pieceToQuery=u}),define(Q[198],J([0,1,8,152,72,51,15]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isRelativePattern=e.parse=e.match=e.splitGlobAware=void 0;const C="**",d="/",g="[/\\\\]",p="[^/\\\\]",c=/\//g;function o(R){switch(R){case 0:return"";case 1:return`${p}*?`;default:return`(?:${g}|${p}+${g}|${g}${p}+)*?`}}function s(R,W){if(!R)return[];const x=[];let K=!1,Y=!1,ee="";for(const se of R){switch(se){case W:if(!K&&!Y){x.push(ee),ee="";continue}break;case"{":K=!0;break;case"}":K=!1;break;case"[":Y=!0;break;case"]":Y=!1;break}ee+=se}return ee&&x.push(ee),x}e.splitGlobAware=s;function a(R){if(!R)return"";let W="";const x=s(R,d);if(x.every(K=>K===C))W=".*";else{let K=!1;x.forEach((Y,ee)=>{if(Y===C){K||(W+=o(2),K=!0);return}let se=!1,ne="",le=!1,X="";for(const z of Y){if(z!=="}"&&se){ne+=z;continue}if(le&&(z!=="]"||!X)){let P;z==="-"?P=z:(z==="^"||z==="!")&&!X?P="^":z===d?P="":P=b.escapeRegExpCharacters(z),X+=P;continue}switch(z){case"{":se=!0;continue;case"[":le=!0;continue;case"}":W+=`(?:${s(ne,",").map(U=>a(U)).join("|")})`,se=!1,ne="";break;case"]":W+="["+X+"]",le=!1,X="";break;case"?":W+=p;continue;case"*":W+=o(1);continue;default:W+=b.escapeRegExpCharacters(z)}}eef(ne,W)).filter(ne=>ne!==_),R),K=x.length;if(!K)return _;if(K===1)return x[0];const Y=function(ne,le){for(let X=0,z=x.length;X!!ne.allBasenames);ee&&(Y.allBasenames=ee.allBasenames);const se=x.reduce((ne,le)=>le.allPaths?ne.concat(le.allPaths):ne,[]);return se.length&&(Y.allPaths=se),Y}function k(R,W,x){const K=M.sep===M.posix.sep,Y=K?R:R.replace(c,M.sep),ee=M.sep+Y,se=M.posix.sep+R,ne=x?function(le,X){return typeof le=="string"&&(le===Y||le.endsWith(ee)||!K&&(le===R||le.endsWith(se)))?W:null}:function(le,X){return typeof le=="string"&&(le===Y||!K&&le===R)?W:null};return ne.allPaths=[(x?"*/":"./")+R],ne}function E(R){try{const W=new RegExp(`^${a(R)}$`);return function(x){return W.lastIndex=0,typeof x=="string"&&W.test(x)?R:null}}catch(W){return _}}function T(R,W,x){return!R||typeof W!="string"?!1:O(R)(W,void 0,x)}e.match=T;function O(R,W={}){if(!R)return m;if(typeof R=="string"||A(R)){const x=f(R,W);if(x===_)return m;const K=function(Y,ee){return!!x(Y,ee)};return x.allBasenames&&(K.allBasenames=x.allBasenames),x.allPaths&&(K.allPaths=x.allPaths),K}return B(R,W)}e.parse=O;function A(R){const W=R;return W&&typeof W.base=="string"&&typeof W.pattern=="string"}e.isRelativePattern=A;function B(R,W){const x=D(Object.getOwnPropertyNames(R).map(ne=>F(ne,R[ne],W)).filter(ne=>ne!==_)),K=x.length;if(!K)return _;if(!x.some(ne=>!!ne.requiresSiblings)){if(K===1)return x[0];const ne=function(z,P){for(let V=0,U=x.length;V!!z.allBasenames);le&&(ne.allBasenames=le.allBasenames);const X=x.reduce((z,P)=>P.allPaths?z.concat(P.allPaths):z,[]);return X.length&&(ne.allPaths=X),ne}const Y=function(ne,le,X){let z;for(let P=0,V=x.length;P!!ne.allBasenames);ee&&(Y.allBasenames=ee.allBasenames);const se=x.reduce((ne,le)=>le.allPaths?ne.concat(le.allPaths):ne,[]);return se.length&&(Y.allPaths=se),Y}function F(R,W,x){if(W===!1)return _;const K=f(R,x);if(K===_)return _;if(typeof W=="boolean")return K;if(W){const Y=W.when;if(typeof Y=="string"){const ee=(se,ne,le,X)=>{if(!X||!K(se,ne))return null;const z=Y.replace("$(basename)",le),P=X(z);return S.isThenable(P)?P.then(V=>V?R:null):P?R:null};return ee.requiresSiblings=!0,ee}}return K}function D(R,W){const x=R.filter(ne=>!!ne.basenames);if(x.length<2)return R;const K=x.reduce((ne,le)=>{const X=le.basenames;return X?ne.concat(X):ne},[]);let Y;if(W){Y=[];for(let ne=0,le=K.length;ne{const X=le.patterns;return X?ne.concat(X):ne},[]);const ee=function(ne,le){if(typeof ne!="string")return null;if(!le){let z;for(z=ne.length;z>0;z--){const P=ne.charCodeAt(z-1);if(P===47||P===92)break}le=ne.substr(z)}const X=K.indexOf(le);return X!==-1?Y[X]:null};ee.basenames=K,ee.patterns=Y,ee.allBasenames=K;const se=R.filter(ne=>!ne.basenames);return se.push(ee),se}}),define(Q[102],J([0,1,27,66,8]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.matchesFuzzyIconAware=e.parseLabelWithIcons=e.stripIcons=e.markdownEscapeEscapedIcons=e.escapeIcons=e.iconStartMarker=void 0,e.iconStartMarker="$(";const w=new RegExp(`\\$\\(${b.CSSIcon.iconNameExpression}(?:${b.CSSIcon.iconModifierExpression})?\\)`,"g"),S=new RegExp(`(\\\\)?${w.source}`,"g");function C(u){return u.replace(S,(r,i)=>i?r:`\\${r}`)}e.escapeIcons=C;const d=new RegExp(`\\\\${w.source}`,"g");function g(u){return u.replace(d,r=>`\\${r}`)}e.markdownEscapeEscapedIcons=g;const p=new RegExp(`(\\s)?(\\\\)?${w.source}(\\s)?`,"g");function c(u){return u.indexOf(e.iconStartMarker)===-1?u:u.replace(p,(r,i,n,t)=>n?r:i||t||"")}e.stripIcons=c;function o(u){const r=u.indexOf(e.iconStartMarker);return r===-1?{text:u}:s(u,r)}e.parseLabelWithIcons=o;function s(u,r){const i=[];let n="";function t(L){if(L){n+=L;for(const I of L)i.push(m)}}let l=-1,h="",m=0,_,f,v=r;const y=u.length;for(t(u.substr(0,r));v" ".repeat(i.length)).replace(/^>/gm,"\\>").replace(/\n/g,u===1?`\\ +`:` + +`),this}appendMarkdown(a){return this.value+=a,this}appendCodeblock(a,u){return this.value+="\n```",this.value+=a,this.value+=` +`,this.value+=u,this.value+="\n```\n",this}}e.MarkdownString=w;function S(s){return C(s)?!s.value:Array.isArray(s)?s.every(S):!0}e.isEmptyMarkdownString=S;function C(s){return s instanceof w?!0:s&&typeof s=="object"?typeof s.value=="string"&&(typeof s.isTrusted=="boolean"||s.isTrusted===void 0)&&(typeof s.supportThemeIcons=="boolean"||s.supportThemeIcons===void 0):!1}e.isMarkdownString=C;function d(s,a){return!s&&!a?!0:!s||!a?!1:Array.isArray(s)&&Array.isArray(a)?b.equals(s,a,g):C(s)&&C(a)?g(s,a):!1}e.markedStringsEquals=d;function g(s,a){return s===a?!0:!s||!a?!1:s.value===a.value&&s.isTrusted===a.isTrusted&&s.supportThemeIcons===a.supportThemeIcons}function p(s){return s.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.escapeMarkdownSyntaxTokens=p;function c(s){return s&&s.replace(/\\([\\`*_{}[\]()#+\-.!])/g,"$1")}e.removeMarkdownEscapes=c;function o(s){const a=[],u=s.split("|").map(i=>i.trim());s=u[0];const r=u[1];if(r){const i=/height=(\d+)/.exec(r),n=/width=(\d+)/.exec(r),t=i?i[1]:"",l=n?n[1]:"",h=isFinite(parseInt(l)),m=isFinite(parseInt(t));h&&a.push(`width="${l}"`),m&&a.push(`height="${t}"`)}return{href:s,dimensions:a}}e.parseHrefAndDimensions=o}),define(Q[199],J([0,1,101,24]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.revive=e.parse=void 0;function M(S){let C=JSON.parse(S);return C=w(C),C}e.parse=M;function w(S,C=0){if(!S||C>200)return S;if(typeof S=="object"){switch(S.$mid){case 1:return N.URI.revive(S);case 2:return new RegExp(S.source,S.flags)}if(S instanceof b.VSBuffer||S instanceof Uint8Array)return S;if(Array.isArray(S))for(let d=0;d{let ve=pe.relatedTarget;for(;ve&&ve!==de;)ve=ve.parentNode;ve!==de&&ge(pe)})}e.addDisposableNonBubblingMouseOutListener=_;function f(de,ge){return r(de,"pointerout",pe=>{let ve=pe.relatedTarget;for(;ve&&ve!==de;)ve=ve.parentNode;ve!==de&&ge(pe)})}e.addDisposableNonBubblingPointerOutListener=f;let v=null;function y(de){if(!v){const ge=pe=>setTimeout(()=>pe(new Date().getTime()),0);v=self.requestAnimationFrame||self.msRequestAnimationFrame||self.webkitRequestAnimationFrame||self.mozRequestAnimationFrame||self.oRequestAnimationFrame||ge}return v.call(self,de)}class L{constructor(ge,pe=0){this._runner=ge,this.priority=pe,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(ge){C.onUnexpectedError(ge)}}static sort(ge,pe){return pe.priority-ge.priority}}(function(){let de=[],ge=null,pe=!1,ve=!1,ke=()=>{for(pe=!1,ge=de,de=[],ve=!0;ge.length>0;)ge.sort(L.sort),ge.shift().execute();ve=!1};e.scheduleAtNextAnimationFrame=(Ne,Te=0)=>{let Oe=new L(Ne,Te);return de.push(Oe),pe||(pe=!0,y(ke)),Oe},e.runAtThisOrScheduleAtNextAnimationFrame=(Ne,Te)=>{if(ve){let Oe=new L(Ne,Te);return ge.push(Oe),Oe}else return e.scheduleAtNextAnimationFrame(Ne,Te)}})();const I=8,k=function(de,ge){return ge};class E extends g.Disposable{constructor(ge,pe,ve,ke=k,Ne=I){super();let Te=null,Oe=0,Fe=this._register(new S.TimeoutTimer),Pe=()=>{Oe=new Date().getTime(),ve(Te),Te=null};this._register(r(ge,pe,xe=>{Te=ke(Te,xe);let We=new Date().getTime()-Oe;We>=Ne?(Fe.cancel(),Pe()):Fe.setIfNotSet(Pe,Ne-We)}))}}function T(de,ge,pe,ve,ke){return new E(de,ge,pe,ve,ke)}e.addDisposableThrottledListener=T;function O(de){return document.defaultView.getComputedStyle(de,null)}e.getComputedStyle=O;function A(de){if(de!==document.body)return new F(de.clientWidth,de.clientHeight);if(p.isIOS&&window.visualViewport){const ge=window.visualViewport.width,pe=window.visualViewport.height-(b.isStandalone?20+4:0);return new F(ge,pe)}if(window.innerWidth&&window.innerHeight)return new F(window.innerWidth,window.innerHeight);if(document.body&&document.body.clientWidth&&document.body.clientHeight)return new F(document.body.clientWidth,document.body.clientHeight);if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientHeight)return new F(document.documentElement.clientWidth,document.documentElement.clientHeight);throw new Error("Unable to figure out browser width and height")}e.getClientArea=A;class B{static convertToPixels(ge,pe){return parseFloat(pe)||0}static getDimension(ge,pe,ve){let ke=O(ge),Ne="0";return ke&&(ke.getPropertyValue?Ne=ke.getPropertyValue(pe):Ne=ke.getAttribute(ve)),B.convertToPixels(ge,Ne)}static getBorderLeftWidth(ge){return B.getDimension(ge,"border-left-width","borderLeftWidth")}static getBorderRightWidth(ge){return B.getDimension(ge,"border-right-width","borderRightWidth")}static getBorderTopWidth(ge){return B.getDimension(ge,"border-top-width","borderTopWidth")}static getBorderBottomWidth(ge){return B.getDimension(ge,"border-bottom-width","borderBottomWidth")}static getPaddingLeft(ge){return B.getDimension(ge,"padding-left","paddingLeft")}static getPaddingRight(ge){return B.getDimension(ge,"padding-right","paddingRight")}static getPaddingTop(ge){return B.getDimension(ge,"padding-top","paddingTop")}static getPaddingBottom(ge){return B.getDimension(ge,"padding-bottom","paddingBottom")}static getMarginLeft(ge){return B.getDimension(ge,"margin-left","marginLeft")}static getMarginTop(ge){return B.getDimension(ge,"margin-top","marginTop")}static getMarginRight(ge){return B.getDimension(ge,"margin-right","marginRight")}static getMarginBottom(ge){return B.getDimension(ge,"margin-bottom","marginBottom")}}class F{constructor(ge,pe){this.width=ge,this.height=pe}with(ge=this.width,pe=this.height){return ge!==this.width||pe!==this.height?new F(ge,pe):this}static is(ge){return typeof ge=="object"&&typeof ge.height=="number"&&typeof ge.width=="number"}static lift(ge){return ge instanceof F?ge:new F(ge.width,ge.height)}static equals(ge,pe){return ge===pe?!0:!ge||!pe?!1:ge.width===pe.width&&ge.height===pe.height}}e.Dimension=F;function D(de){let ge=de.offsetParent,pe=de.offsetTop,ve=de.offsetLeft;for(;(de=de.parentNode)!==null&&de!==document.body&&de!==document.documentElement;){pe-=de.scrollTop;const ke=X(de)?null:O(de);ke&&(ve-=ke.direction!=="rtl"?de.scrollLeft:-de.scrollLeft),de===ge&&(ve+=B.getBorderLeftWidth(de),pe+=B.getBorderTopWidth(de),pe+=de.offsetTop,ve+=de.offsetLeft,ge=de.offsetParent)}return{left:ve,top:pe}}e.getTopLeftOffset=D;function R(de,ge,pe){typeof ge=="number"&&(de.style.width=`${ge}px`),typeof pe=="number"&&(de.style.height=`${pe}px`)}e.size=R;function W(de){let ge=de.getBoundingClientRect();return{left:ge.left+e.StandardWindow.scrollX,top:ge.top+e.StandardWindow.scrollY,width:ge.width,height:ge.height}}e.getDomNodePagePosition=W,e.StandardWindow=new class{get scrollX(){return typeof window.scrollX=="number"?window.scrollX:document.body.scrollLeft+document.documentElement.scrollLeft}get scrollY(){return typeof window.scrollY=="number"?window.scrollY:document.body.scrollTop+document.documentElement.scrollTop}};function x(de){let ge=B.getMarginLeft(de)+B.getMarginRight(de);return de.offsetWidth+ge}e.getTotalWidth=x;function K(de){let ge=B.getBorderLeftWidth(de)+B.getBorderRightWidth(de),pe=B.getPaddingLeft(de)+B.getPaddingRight(de);return de.offsetWidth-ge-pe}e.getContentWidth=K;function Y(de){let ge=B.getBorderTopWidth(de)+B.getBorderBottomWidth(de),pe=B.getPaddingTop(de)+B.getPaddingBottom(de);return de.offsetHeight-ge-pe}e.getContentHeight=Y;function ee(de){let ge=B.getMarginTop(de)+B.getMarginBottom(de);return de.offsetHeight+ge}e.getTotalHeight=ee;function se(de,ge){for(;de;){if(de===ge)return!0;de=de.parentNode}return!1}e.isAncestor=se;function ne(de,ge,pe){for(;de&&de.nodeType===de.ELEMENT_NODE;){if(de.classList.contains(ge))return de;if(pe){if(typeof pe=="string"){if(de.classList.contains(pe))return null}else if(de===pe)return null}de=de.parentNode}return null}e.findParentWithClass=ne;function le(de,ge,pe){return!!ne(de,ge,pe)}e.hasParentWithClass=le;function X(de){return de&&!!de.host&&!!de.mode}e.isShadowRoot=X;function z(de){return!!P(de)}e.isInShadowDOM=z;function P(de){for(;de.parentNode;){if(de===document.body)return null;de=de.parentNode}return X(de)?de:null}e.getShadowRoot=P;function V(){let de=document.activeElement;for(;de==null?void 0:de.shadowRoot;)de=de.shadowRoot.activeElement;return de}e.getActiveElement=V;function U(de=document.getElementsByTagName("head")[0]){let ge=document.createElement("style");return ge.type="text/css",ge.media="screen",de.appendChild(ge),ge}e.createStyleSheet=U;let H=null;function $(){return H||(H=U()),H}function ie(de){var ge,pe;return((ge=de==null?void 0:de.sheet)===null||ge===void 0?void 0:ge.rules)?de.sheet.rules:((pe=de==null?void 0:de.sheet)===null||pe===void 0?void 0:pe.cssRules)?de.sheet.cssRules:[]}function oe(de,ge,pe=$()){!pe||!ge||pe.sheet.insertRule(de+"{"+ge+"}",0)}e.createCSSRule=oe;function ae(de,ge=$()){if(!!ge){let pe=ie(ge),ve=[];for(let ke=0;ke=0;ke--)ge.sheet.deleteRule(ve[ke])}}e.removeCSSRulesContainingSelector=ae;function G(de){return typeof HTMLElement=="object"?de instanceof HTMLElement:de&&typeof de=="object"&&de.nodeType===1&&typeof de.nodeName=="string"}e.isHTMLElement=G,e.EventType={CLICK:"click",AUXCLICK:"auxclick",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",MOUSE_WHEEL:"wheel",POINTER_UP:"pointerup",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",BEFORE_UNLOAD:"beforeunload",UNLOAD:"unload",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",FULLSCREEN_CHANGE:"fullscreenchange",WK_FULLSCREEN_CHANGE:"webkitfullscreenchange",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:b.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:b.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:b.isWebKit?"webkitAnimationIteration":"animationiteration"},e.EventHelper={stop:function(de,ge){de.preventDefault?de.preventDefault():de.returnValue=!1,ge&&(de.stopPropagation?de.stopPropagation():de.cancelBubble=!0)}};function j(de){let ge=[];for(let pe=0;de&&de.nodeType===de.ELEMENT_NODE;pe++)ge[pe]=de.scrollTop,de=de.parentNode;return ge}e.saveParentsScrollTop=j;function te(de,ge){for(let pe=0;de&&de.nodeType===de.ELEMENT_NODE;pe++)de.scrollTop!==ge[pe]&&(de.scrollTop=ge[pe]),de=de.parentNode}e.restoreParentsScrollTop=te;class Z extends g.Disposable{constructor(ge){super();this._onDidFocus=this._register(new d.Emitter),this.onDidFocus=this._onDidFocus.event,this._onDidBlur=this._register(new d.Emitter),this.onDidBlur=this._onDidBlur.event;let pe=se(document.activeElement,ge),ve=!1;const ke=()=>{ve=!1,pe||(pe=!0,this._onDidFocus.fire())},Ne=()=>{pe&&(ve=!0,window.setTimeout(()=>{ve&&(ve=!1,pe=!1,this._onDidBlur.fire())},0))};this._refreshStateHandler=()=>{se(document.activeElement,ge)!==pe&&(pe?Ne():ke())},this._register(N.domEvent(ge,e.EventType.FOCUS,!0)(ke)),this._register(N.domEvent(ge,e.EventType.BLUR,!0)(Ne))}}function ue(de){return new Z(de)}e.trackFocus=ue;function he(de,...ge){if(de.append(...ge),ge.length===1&&typeof ge[0]!="string")return ge[0]}e.append=he;function re(de,...ge){de.innerText="",he(de,...ge)}e.reset=re;const ce=/([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/;var me;(function(de){de.HTML="http://www.w3.org/1999/xhtml",de.SVG="http://www.w3.org/2000/svg"})(me=e.Namespace||(e.Namespace={}));function Ce(de,ge,pe,...ve){let ke=ce.exec(ge);if(!ke)throw new Error("Bad use of emmet");pe=Object.assign({},pe||{});let Ne=ke[1]||"div",Te;return de!==me.HTML?Te=document.createElementNS(de,Ne):Te=document.createElement(Ne),ke[3]&&(Te.id=ke[3]),ke[4]&&(Te.className=ke[4].replace(/\./g," ").trim()),Object.keys(pe).forEach(Oe=>{const Fe=pe[Oe];typeof Fe!="undefined"&&(/^on\w+$/.test(Oe)?Te[Oe]=Fe:Oe==="selected"?Fe&&Te.setAttribute(Oe,"true"):Te.setAttribute(Oe,Fe))}),Te.append(...ve),Te}function be(de,ge,...pe){return Ce(me.HTML,de,ge,...pe)}e.$=be,be.SVG=function(de,ge,...pe){return Ce(me.SVG,de,ge,...pe)};function Le(...de){for(let ge of de)ge.style.display="",ge.removeAttribute("aria-hidden")}e.show=Le;function De(...de){for(let ge of de)ge.style.display="none",ge.setAttribute("aria-hidden","true")}e.hide=De;function Re(de){return Array.prototype.slice.call(document.getElementsByTagName(de),0)}e.getElementsByTagName=Re;function Ee(de){const ge=window.devicePixelRatio*de;return Math.max(1,Math.floor(ge))/window.devicePixelRatio}e.computeScreenAwareSize=Ee;function Ae(de){if(b.isElectron||b.isEdgeLegacyWebView)window.open(de);else{let ge=window.open();ge&&(ge.opener=null,ge.location.href=de)}}e.windowOpenNoOpener=Ae;function Se(de){const ge=()=>{de(),pe=e.scheduleAtNextAnimationFrame(ge)};let pe=e.scheduleAtNextAnimationFrame(ge);return g.toDisposable(()=>pe.dispose())}e.animate=Se,c.RemoteAuthorities.setPreferredWebSchema(/^https:/.test(window.location.href)?"https":"http");function we(de){return de?`url('${c.FileAccess.asBrowserUri(de).toString(!0).replace(/'/g,"%27")}')`:"url('')"}e.asCSSUrl=we;function ye(de){return`'${de.replace(/'/g,"%27")}'`}e.asCSSPropertyValue=ye;class fe extends d.Emitter{constructor(){super();this._subscriptions=new g.DisposableStore,this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1},this._subscriptions.add(N.domEvent(window,"keydown",!0)(ge=>{const pe=new M.StandardKeyboardEvent(ge);if(!(pe.keyCode===6&&ge.repeat)){if(ge.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed="alt";else if(ge.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed="ctrl";else if(ge.metaKey&&!this._keyStatus.metaKey)this._keyStatus.lastKeyPressed="meta";else if(ge.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed="shift";else if(pe.keyCode!==6)this._keyStatus.lastKeyPressed=void 0;else return;this._keyStatus.altKey=ge.altKey,this._keyStatus.ctrlKey=ge.ctrlKey,this._keyStatus.metaKey=ge.metaKey,this._keyStatus.shiftKey=ge.shiftKey,this._keyStatus.lastKeyPressed&&(this._keyStatus.event=ge,this.fire(this._keyStatus))}})),this._subscriptions.add(N.domEvent(window,"keyup",!0)(ge=>{!ge.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased="alt":!ge.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased="ctrl":!ge.metaKey&&this._keyStatus.metaKey?this._keyStatus.lastKeyReleased="meta":!ge.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased="shift":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=ge.altKey,this._keyStatus.ctrlKey=ge.ctrlKey,this._keyStatus.metaKey=ge.metaKey,this._keyStatus.shiftKey=ge.shiftKey,this._keyStatus.lastKeyReleased&&(this._keyStatus.event=ge,this.fire(this._keyStatus))})),this._subscriptions.add(N.domEvent(document.body,"mousedown",!0)(ge=>{this._keyStatus.lastKeyPressed=void 0})),this._subscriptions.add(N.domEvent(document.body,"mouseup",!0)(ge=>{this._keyStatus.lastKeyPressed=void 0})),this._subscriptions.add(N.domEvent(document.body,"mousemove",!0)(ge=>{ge.buttons&&(this._keyStatus.lastKeyPressed=void 0)})),this._subscriptions.add(N.domEvent(window,"blur")(ge=>{this.resetKeyStatus()}))}get keyStatus(){return this._keyStatus}resetKeyStatus(){this.doResetKeyStatus(),this.fire(this._keyStatus)}doResetKeyStatus(){this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1}}static getInstance(){return fe.instance||(fe.instance=new fe),fe.instance}dispose(){super.dispose(),this._subscriptions.dispose()}}e.ModifierKeyEmitter=fe}),define(Q[156],J([0,1,7]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createElement=e.renderFormattedText=e.renderText=void 0;function N(c,o={}){const s=w(o);return s.textContent=c,s}e.renderText=N;function M(c,o={}){const s=w(o);return C(s,d(c),o.actionHandler),s}e.renderFormattedText=M;function w(c){const o=c.inline?"span":"div",s=document.createElement(o);return c.className&&(s.className=c.className),s}e.createElement=w;class S{constructor(o){this.source=o,this.index=0}eos(){return this.index>=this.source.length}next(){const o=this.peek();return this.advance(),o}peek(){return this.source[this.index]}advance(){this.index++}}function C(c,o,s){let a;if(o.type===2)a=document.createTextNode(o.content||"");else if(o.type===3)a=document.createElement("b");else if(o.type===4)a=document.createElement("i");else if(o.type===5&&s){const u=document.createElement("a");u.href="#",s.disposeables.add(b.addStandardDisposableListener(u,"click",r=>{s.callback(String(o.index),r)})),a=u}else o.type===7?a=document.createElement("br"):o.type===1&&(a=c);a&&c!==a&&c.appendChild(a),a&&Array.isArray(o.children)&&o.children.forEach(u=>{C(a,u,s)})}function d(c){const o={type:1,children:[]};let s=0,a=o;const u=[],r=new S(c);for(;!r.eos();){let i=r.next();const n=i==="\\"&&p(r.peek())!==0;if(n&&(i=r.next()),!n&&g(i)&&i===r.peek()){r.advance(),a.type===2&&(a=u.pop());const t=p(i);if(a.type===t||a.type===5&&t===6)a=u.pop();else{const l={type:t,children:[]};t===5&&(l.index=s,s++),a.children.push(l),u.push(a),a=l}}else if(i===` +`)a.type===2&&(a=u.pop()),a.children.push({type:7});else if(a.type!==2){const t={type:2,content:i};a.children.push(t),u.push(a),a=t}else a.content+=i}return a.type===2&&(a=u.pop()),u.length,o}function g(c){return p(c)!==0}function p(c){switch(c){case"*":return 3;case"_":return 4;case"[":return 5;case"]":return 6;default:return 0}}}),define(Q[90],J([0,1,7,193,50,2]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlobalMouseMoveMonitor=e.standardMouseMoveMerger=void 0;function S(d,g){let p=new M.StandardMouseEvent(g);return p.preventDefault(),{leftButton:p.leftButton,buttons:p.buttons,posx:p.posx,posy:p.posy}}e.standardMouseMoveMerger=S;class C{constructor(){this._hooks=new w.DisposableStore,this._mouseMoveEventMerger=null,this._mouseMoveCallback=null,this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(g,p){if(!!this.isMonitoring()){this._hooks.clear(),this._mouseMoveEventMerger=null,this._mouseMoveCallback=null;const c=this._onStopCallback;this._onStopCallback=null,g&&c&&c(p)}}isMonitoring(){return!!this._mouseMoveEventMerger}startMonitoring(g,p,c,o,s){if(!this.isMonitoring()){this._mouseMoveEventMerger=c,this._mouseMoveCallback=o,this._onStopCallback=s;const a=N.IframeUtils.getSameOriginWindowChain(),u="mousemove",r="mouseup",i=a.map(t=>t.window.document),n=b.getShadowRoot(g);n&&i.unshift(n);for(const t of i)this._hooks.add(b.addDisposableThrottledListener(t,u,l=>{if(l.buttons!==p){this.stopMonitoring(!0);return}this._mouseMoveCallback(l)},(l,h)=>this._mouseMoveEventMerger(l,h))),this._hooks.add(b.addDisposableListener(t,r,l=>this.stopMonitoring(!0)));if(N.IframeUtils.hasDifferentOriginAncestor()){let t=a[a.length-1];this._hooks.add(b.addDisposableListener(t.window.document,"mouseout",l=>{new M.StandardMouseEvent(l).target.tagName.toLowerCase()==="html"&&this.stopMonitoring(!0)})),this._hooks.add(b.addDisposableListener(t.window.document,"mouseover",l=>{new M.StandardMouseEvent(l).target.tagName.toLowerCase()==="html"&&this.stopMonitoring(!0)})),this._hooks.add(b.addDisposableListener(t.window.document.body,"mouseleave",l=>{this.stopMonitoring(!0)}))}}}}e.GlobalMouseMoveMonitor=C});var Me=this&&this.__decorate||function(q,e,b,N){var M=arguments.length,w=M<3?e:N===null?N=Object.getOwnPropertyDescriptor(e,b):N,S;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")w=Reflect.decorate(q,e,b,N);else for(var C=q.length-1;C>=0;C--)(S=q[C])&&(w=(M<3?S(w):M>3?S(e,b,w):S(e,b))||w);return M>3&&w&&Object.defineProperty(e,b,w),w};define(Q[60],J([0,1,19,2,7,99]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Gesture=e.EventType=void 0;var S;(function(d){d.Tap="-monaco-gesturetap",d.Change="-monaco-gesturechange",d.Start="-monaco-gesturestart",d.End="-monaco-gesturesend",d.Contextmenu="-monaco-gesturecontextmenu"})(S=e.EventType||(e.EventType={}));class C extends N.Disposable{constructor(){super();this.dispatched=!1,this.activeTouches={},this.handle=null,this.targets=[],this.ignoreTargets=[],this._lastSetTapCountTime=0,this._register(M.addDisposableListener(document,"touchstart",g=>this.onTouchStart(g),{passive:!1})),this._register(M.addDisposableListener(document,"touchend",g=>this.onTouchEnd(g))),this._register(M.addDisposableListener(document,"touchmove",g=>this.onTouchMove(g),{passive:!1}))}static addTarget(g){return C.isTouchDevice()?(C.INSTANCE||(C.INSTANCE=new C),C.INSTANCE.targets.push(g),{dispose:()=>{C.INSTANCE.targets=C.INSTANCE.targets.filter(p=>p!==g)}}):N.Disposable.None}static ignoreTarget(g){return C.isTouchDevice()?(C.INSTANCE||(C.INSTANCE=new C),C.INSTANCE.ignoreTargets.push(g),{dispose:()=>{C.INSTANCE.ignoreTargets=C.INSTANCE.ignoreTargets.filter(p=>p!==g)}}):N.Disposable.None}static isTouchDevice(){return"ontouchstart"in window||navigator.maxTouchPoints>0||window.navigator.msMaxTouchPoints>0}dispose(){this.handle&&(this.handle.dispose(),this.handle=null),super.dispose()}onTouchStart(g){let p=Date.now();this.handle&&(this.handle.dispose(),this.handle=null);for(let c=0,o=g.targetTouches.length;c=C.HOLD_DELAY&&Math.abs(u.initialPageX-b.tail(u.rollingPageX))<30&&Math.abs(u.initialPageY-b.tail(u.rollingPageY))<30){let i=this.newGestureEvent(S.Contextmenu,u.initialTarget);i.pageX=b.tail(u.rollingPageX),i.pageY=b.tail(u.rollingPageY),this.dispatchEvent(i)}else if(c===1){let i=b.tail(u.rollingPageX),n=b.tail(u.rollingPageY),t=b.tail(u.rollingTimestamps)-u.rollingTimestamps[0],l=i-u.rollingPageX[0],h=n-u.rollingPageY[0];const m=this.targets.filter(_=>u.initialTarget instanceof Node&&_.contains(u.initialTarget));this.inertia(m,p,Math.abs(l)/t,l>0?1:-1,i,Math.abs(h)/t,h>0?1:-1,n)}this.dispatchEvent(this.newGestureEvent(S.End,u.initialTarget)),delete this.activeTouches[a.identifier]}this.dispatched&&(g.preventDefault(),g.stopPropagation(),this.dispatched=!1)}newGestureEvent(g,p){let c=document.createEvent("CustomEvent");return c.initEvent(g,!1,!0),c.initialTarget=p,c.tapCount=0,c}dispatchEvent(g){if(g.type===S.Tap){const p=new Date().getTime();let c=0;p-this._lastSetTapCountTime>C.CLEAR_TAP_COUNT_TIME?c=1:c=2,this._lastSetTapCountTime=p,g.tapCount=c}else(g.type===S.Change||g.type===S.Contextmenu)&&(this._lastSetTapCountTime=0);for(let p=0;p{g.initialTarget instanceof Node&&p.contains(g.initialTarget)&&(p.dispatchEvent(g),this.dispatched=!0)})}inertia(g,p,c,o,s,a,u,r){this.handle=M.scheduleAtNextAnimationFrame(()=>{let i=Date.now(),n=i-p,t=0,l=0,h=!0;c+=C.SCROLL_FRICTION*n,a+=C.SCROLL_FRICTION*n,c>0&&(h=!1,t=o*c*n),a>0&&(h=!1,l=u*a*n);let m=this.newGestureEvent(S.Change);m.translationX=t,m.translationY=l,g.forEach(_=>_.dispatchEvent(m)),h||this.inertia(g,i,c,o,s+t,a,u,r+l)})}onTouchMove(g){let p=Date.now();for(let c=0,o=g.changedTouches.length;c3&&(a.rollingPageX.shift(),a.rollingPageY.shift(),a.rollingTimestamps.shift()),a.rollingPageX.push(s.pageX),a.rollingPageY.push(s.pageY),a.rollingTimestamps.push(p)}this.dispatched&&(g.preventDefault(),g.stopPropagation(),this.dispatched=!1)}}C.SCROLL_FRICTION=-.005,C.HOLD_DELAY=700,C.CLEAR_TAP_COUNT_TIME=400,Me([w.memoize],C,"isTouchDevice",null),e.Gesture=C}),define(Q[103],J([0,1,7,27]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderIcon=e.renderLabelWithIcons=void 0;const M=new RegExp(`(\\\\)?\\$\\((${N.CSSIcon.iconNameExpression}(?:${N.CSSIcon.iconModifierExpression})?)\\)`,"g");function w(C){const d=new Array;let g,p=0,c=0;for(;(g=M.exec(C))!==null;){c=g.index||0,d.push(C.substring(p,c)),p=(g.index||0)+g[0].length;const[,o,s]=g;d.push(o?`$(${s})`:S({id:s}))}return p{p=c===`\r +`?-1:0,o+=g;for(const s of d)s.end<=o||(s.start>=o&&(s.start+=p),s.end>=o&&(s.end+=p));return g+=p,"\u23CE"})}}e.HighlightedLabel=w}),define(Q[287],J([0,1,7]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RowCache=void 0;function N(w){try{w.parentElement&&w.parentElement.removeChild(w)}catch(S){}}class M{constructor(S){this.renderers=S,this.cache=new Map}alloc(S){let C=this.getTemplateCache(S).pop();if(!C){const d=b.$(".monaco-list-row"),p=this.getRenderer(S).renderTemplate(d);C={domNode:d,templateId:S,templateData:p}}return C}release(S){!S||this.releaseRow(S)}releaseRow(S){const{domNode:C,templateId:d}=S;C&&(C.classList.remove("scrolling"),N(C)),this.getTemplateCache(d).push(S)}getTemplateCache(S){let C=this.cache.get(S);return C||(C=[],this.cache.set(S,C)),C}dispose(){this.cache.forEach((S,C)=>{for(const d of S)this.getRenderer(C).disposeTemplate(d.templateData),d.templateData=null}),this.cache.clear()}getRenderer(S){const C=this.renderers.get(S);if(!C)throw new Error(`No renderer found for ${S}`);return C}}e.RowCache=M}),define(Q[52],J([0,1,7,56,50,2,60]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Widget=void 0;class C extends w.Disposable{onclick(g,p){this._register(b.addDisposableListener(g,b.EventType.CLICK,c=>p(new M.StandardMouseEvent(c))))}onmousedown(g,p){this._register(b.addDisposableListener(g,b.EventType.MOUSE_DOWN,c=>p(new M.StandardMouseEvent(c))))}onmouseover(g,p){this._register(b.addDisposableListener(g,b.EventType.MOUSE_OVER,c=>p(new M.StandardMouseEvent(c))))}onnonbubblingmouseout(g,p){this._register(b.addDisposableNonBubblingMouseOutListener(g,c=>p(new M.StandardMouseEvent(c))))}onkeydown(g,p){this._register(b.addDisposableListener(g,b.EventType.KEY_DOWN,c=>p(new N.StandardKeyboardEvent(c))))}onkeyup(g,p){this._register(b.addDisposableListener(g,b.EventType.KEY_UP,c=>p(new N.StandardKeyboardEvent(c))))}oninput(g,p){this._register(b.addDisposableListener(g,b.EventType.INPUT,p))}onblur(g,p){this._register(b.addDisposableListener(g,b.EventType.BLUR,p))}onfocus(g,p){this._register(b.addDisposableListener(g,b.EventType.FOCUS,p))}ignoreGesture(g){S.Gesture.ignoreTarget(g)}}e.Widget=C}),define(Q[158],J([0,1,90,52,15]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarArrow=e.ARROW_IMG_SIZE=void 0,e.ARROW_IMG_SIZE=11;class w extends N.Widget{constructor(C){super();this._onActivate=C.onActivate,this.bgDomNode=document.createElement("div"),this.bgDomNode.className="arrow-background",this.bgDomNode.style.position="absolute",this.bgDomNode.style.width=C.bgWidth+"px",this.bgDomNode.style.height=C.bgHeight+"px",typeof C.top!="undefined"&&(this.bgDomNode.style.top="0px"),typeof C.left!="undefined"&&(this.bgDomNode.style.left="0px"),typeof C.bottom!="undefined"&&(this.bgDomNode.style.bottom="0px"),typeof C.right!="undefined"&&(this.bgDomNode.style.right="0px"),this.domNode=document.createElement("div"),this.domNode.className=C.className,this.domNode.classList.add(...C.icon.classNamesArray),this.domNode.style.position="absolute",this.domNode.style.width=e.ARROW_IMG_SIZE+"px",this.domNode.style.height=e.ARROW_IMG_SIZE+"px",typeof C.top!="undefined"&&(this.domNode.style.top=C.top+"px"),typeof C.left!="undefined"&&(this.domNode.style.left=C.left+"px"),typeof C.bottom!="undefined"&&(this.domNode.style.bottom=C.bottom+"px"),typeof C.right!="undefined"&&(this.domNode.style.right=C.right+"px"),this._mouseMoveMonitor=this._register(new b.GlobalMouseMoveMonitor),this.onmousedown(this.bgDomNode,d=>this._arrowMouseDown(d)),this.onmousedown(this.domNode,d=>this._arrowMouseDown(d)),this._mousedownRepeatTimer=this._register(new M.IntervalTimer),this._mousedownScheduleRepeatTimer=this._register(new M.TimeoutTimer)}_arrowMouseDown(C){const d=()=>{this._mousedownRepeatTimer.cancelAndSet(()=>this._onActivate(),1e3/24)};this._onActivate(),this._mousedownRepeatTimer.cancel(),this._mousedownScheduleRepeatTimer.cancelAndSet(d,200),this._mouseMoveMonitor.startMonitoring(C.target,C.buttons,b.standardMouseMoveMerger,g=>{},()=>{this._mousedownRepeatTimer.cancel(),this._mousedownScheduleRepeatTimer.cancel()}),C.preventDefault()}}e.ScrollbarArrow=w}),define(Q[200],J([0,1,7,30,90,158,282,52,17]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractScrollbar=void 0;const g=140;class p extends C.Widget{constructor(o){super();this._lazyRender=o.lazyRender,this._host=o.host,this._scrollable=o.scrollable,this._scrollByPage=o.scrollByPage,this._scrollbarState=o.scrollbarState,this._visibilityController=this._register(new S.ScrollbarVisibilityController(o.visibility,"visible scrollbar "+o.extraScrollbarClassName,"invisible scrollbar "+o.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._mouseMoveMonitor=this._register(new M.GlobalMouseMoveMonitor),this._shouldRender=!0,this.domNode=N.createFastDomNode(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition("absolute"),this.onmousedown(this.domNode.domNode,s=>this._domNodeMouseDown(s))}_createArrow(o){const s=this._register(new w.ScrollbarArrow(o));this.domNode.domNode.appendChild(s.bgDomNode),this.domNode.domNode.appendChild(s.domNode)}_createSlider(o,s,a,u){this.slider=N.createFastDomNode(document.createElement("div")),this.slider.setClassName("slider"),this.slider.setPosition("absolute"),this.slider.setTop(o),this.slider.setLeft(s),typeof a=="number"&&this.slider.setWidth(a),typeof u=="number"&&this.slider.setHeight(u),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this.onmousedown(this.slider.domNode,r=>{r.leftButton&&(r.preventDefault(),this._sliderMouseDown(r,()=>{}))}),this.onclick(this.slider.domNode,r=>{r.leftButton&&r.stopPropagation()})}_onElementSize(o){return this._scrollbarState.setVisibleSize(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollSize(o){return this._scrollbarState.setScrollSize(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollPosition(o){return this._scrollbarState.setScrollPosition(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){!this._shouldRender||(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodeMouseDown(o){o.target===this.domNode.domNode&&this._onMouseDown(o)}delegateMouseDown(o){const s=this.domNode.domNode.getClientRects()[0].top,a=s+this._scrollbarState.getSliderPosition(),u=s+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),r=this._sliderMousePosition(o);a<=r&&r<=u?o.leftButton&&(o.preventDefault(),this._sliderMouseDown(o,()=>{})):this._onMouseDown(o)}_onMouseDown(o){let s,a;if(o.target===this.domNode.domNode&&typeof o.browserEvent.offsetX=="number"&&typeof o.browserEvent.offsetY=="number")s=o.browserEvent.offsetX,a=o.browserEvent.offsetY;else{const r=b.getDomNodePagePosition(this.domNode.domNode);s=o.posx-r.left,a=o.posy-r.top}const u=this._mouseDownRelativePosition(s,a);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(u):this._scrollbarState.getDesiredScrollPositionFromOffset(u)),o.leftButton&&(o.preventDefault(),this._sliderMouseDown(o,()=>{}))}_sliderMouseDown(o,s){const a=this._sliderMousePosition(o),u=this._sliderOrthogonalMousePosition(o),r=this._scrollbarState.clone();this.slider.toggleClassName("active",!0),this._mouseMoveMonitor.startMonitoring(o.target,o.buttons,M.standardMouseMoveMerger,i=>{const n=this._sliderOrthogonalMousePosition(i),t=Math.abs(n-u);if(d.isWindows&&t>g){this._setDesiredScrollPositionNow(r.getScrollPosition());return}const h=this._sliderMousePosition(i)-a;this._setDesiredScrollPositionNow(r.getDesiredScrollPositionFromDelta(h))},()=>{this.slider.toggleClassName("active",!1),this._host.onDragEnd(),s()}),this._host.onDragStart()}_setDesiredScrollPositionNow(o){const s={};this.writeScrollPosition(s,o),this._scrollable.setScrollPositionNow(s)}updateScrollbarSize(o){this._updateScrollbarSize(o),this._scrollbarState.setScrollbarSize(o),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}e.AbstractScrollbar=p}),define(Q[288],J([0,1,50,200,158,194,27]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HorizontalScrollbar=void 0;const C=S.registerCodicon("scrollbar-button-left",S.Codicon.triangleLeft),d=S.registerCodicon("scrollbar-button-right",S.Codicon.triangleRight);class g extends N.AbstractScrollbar{constructor(c,o,s){const a=c.getScrollDimensions(),u=c.getCurrentScrollPosition();super({lazyRender:o.lazyRender,host:s,scrollbarState:new w.ScrollbarState(o.horizontalHasArrows?o.arrowSize:0,o.horizontal===2?0:o.horizontalScrollbarSize,o.vertical===2?0:o.verticalScrollbarSize,a.width,a.scrollWidth,u.scrollLeft),visibility:o.horizontal,extraScrollbarClassName:"horizontal",scrollable:c,scrollByPage:o.scrollByPage});if(o.horizontalHasArrows){const r=(o.arrowSize-M.ARROW_IMG_SIZE)/2,i=(o.horizontalScrollbarSize-M.ARROW_IMG_SIZE)/2;this._createArrow({className:"scra",icon:C,top:i,left:r,bottom:void 0,right:void 0,bgWidth:o.arrowSize,bgHeight:o.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new b.StandardWheelEvent(null,1,0))}),this._createArrow({className:"scra",icon:d,top:i,left:void 0,bottom:void 0,right:r,bgWidth:o.arrowSize,bgHeight:o.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new b.StandardWheelEvent(null,-1,0))})}this._createSlider(Math.floor((o.horizontalScrollbarSize-o.horizontalSliderSize)/2),0,void 0,o.horizontalSliderSize)}_updateSlider(c,o){this.slider.setWidth(c),this.slider.setLeft(o)}_renderDomNode(c,o){this.domNode.setWidth(c),this.domNode.setHeight(o),this.domNode.setLeft(0),this.domNode.setBottom(0)}onDidScroll(c){return this._shouldRender=this._onElementScrollSize(c.scrollWidth)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(c.scrollLeft)||this._shouldRender,this._shouldRender=this._onElementSize(c.width)||this._shouldRender,this._shouldRender}_mouseDownRelativePosition(c,o){return c}_sliderMousePosition(c){return c.posx}_sliderOrthogonalMousePosition(c){return c.posy}_updateScrollbarSize(c){this.slider.setHeight(c)}writeScrollPosition(c,o){c.scrollLeft=o}}e.HorizontalScrollbar=g}),define(Q[289],J([0,1,50,200,158,194,27]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VerticalScrollbar=void 0;const C=S.registerCodicon("scrollbar-button-up",S.Codicon.triangleUp),d=S.registerCodicon("scrollbar-button-down",S.Codicon.triangleDown);class g extends N.AbstractScrollbar{constructor(c,o,s){const a=c.getScrollDimensions(),u=c.getCurrentScrollPosition();super({lazyRender:o.lazyRender,host:s,scrollbarState:new w.ScrollbarState(o.verticalHasArrows?o.arrowSize:0,o.vertical===2?0:o.verticalScrollbarSize,0,a.height,a.scrollHeight,u.scrollTop),visibility:o.vertical,extraScrollbarClassName:"vertical",scrollable:c,scrollByPage:o.scrollByPage});if(o.verticalHasArrows){const r=(o.arrowSize-M.ARROW_IMG_SIZE)/2,i=(o.verticalScrollbarSize-M.ARROW_IMG_SIZE)/2;this._createArrow({className:"scra",icon:C,top:r,left:i,bottom:void 0,right:void 0,bgWidth:o.verticalScrollbarSize,bgHeight:o.arrowSize,onActivate:()=>this._host.onMouseWheel(new b.StandardWheelEvent(null,0,1))}),this._createArrow({className:"scra",icon:d,top:void 0,left:i,bottom:r,right:void 0,bgWidth:o.verticalScrollbarSize,bgHeight:o.arrowSize,onActivate:()=>this._host.onMouseWheel(new b.StandardWheelEvent(null,0,-1))})}this._createSlider(0,Math.floor((o.verticalScrollbarSize-o.verticalSliderSize)/2),o.verticalSliderSize,void 0)}_updateSlider(c,o){this.slider.setHeight(c),this.slider.setTop(o)}_renderDomNode(c,o){this.domNode.setWidth(o),this.domNode.setHeight(c),this.domNode.setRight(0),this.domNode.setTop(0)}onDidScroll(c){return this._shouldRender=this._onElementScrollSize(c.scrollHeight)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(c.scrollTop)||this._shouldRender,this._shouldRender=this._onElementSize(c.height)||this._shouldRender,this._shouldRender}_mouseDownRelativePosition(c,o){return o}_sliderMousePosition(c){return c.posy}_sliderOrthogonalMousePosition(c){return c.posx}_updateScrollbarSize(c){this.slider.setWidth(c)}writeScrollPosition(c,o){c.scrollTop=o}}e.VerticalScrollbar=g}),define(Q[44],J([0,1,152,72,24,8,43]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataUri=e.resolvePath=e.normalizePath=e.joinPath=e.dirname=e.basename=e.basenameOrAuthority=e.isEqual=e.extUri=e.ExtUri=e.originalFSPath=void 0;function C(p){return M.uriToFsPath(p,!0)}e.originalFSPath=C;class d{constructor(c){this._ignorePathCasing=c}compare(c,o,s=!1){return c===o?0:w.compare(this.getComparisonKey(c,s),this.getComparisonKey(o,s))}isEqual(c,o,s=!1){return c===o?!0:!c||!o?!1:this.getComparisonKey(c,s)===this.getComparisonKey(o,s)}getComparisonKey(c,o=!1){return c.with({path:this._ignorePathCasing(c)?c.path.toLowerCase():void 0,fragment:o?null:void 0}).toString()}joinPath(c,...o){return M.URI.joinPath(c,...o)}basenameOrAuthority(c){return e.basename(c)||c.authority}basename(c){return N.posix.basename(c.path)}dirname(c){if(c.path.length===0)return c;let o;return c.scheme===S.Schemas.file?o=M.URI.file(N.dirname(C(c))).path:(o=N.posix.dirname(c.path),c.authority&&o.length&&o.charCodeAt(0)!==47&&(console.error(`dirname("${c.toString})) resulted in a relative path`),o="/")),c.with({path:o})}normalizePath(c){if(!c.path.length)return c;let o;return c.scheme===S.Schemas.file?o=M.URI.file(N.normalize(C(c))).path:o=N.posix.normalize(c.path),c.with({path:o})}resolvePath(c,o){if(c.scheme===S.Schemas.file){const s=M.URI.file(N.resolve(C(c),o));return c.with({authority:s.authority,path:s.path})}return o.indexOf("/")===-1&&(o=b.toSlashes(o),/^[a-zA-Z]:(\/|$)/.test(o)&&(o="/"+o)),c.with({path:N.posix.resolve(c.path,o)})}}e.ExtUri=d,e.extUri=new d(()=>!1),e.isEqual=e.extUri.isEqual.bind(e.extUri),e.basenameOrAuthority=e.extUri.basenameOrAuthority.bind(e.extUri),e.basename=e.extUri.basename.bind(e.extUri),e.dirname=e.extUri.dirname.bind(e.extUri),e.joinPath=e.extUri.joinPath.bind(e.extUri),e.normalizePath=e.extUri.normalizePath.bind(e.extUri),e.resolvePath=e.extUri.resolvePath.bind(e.extUri);var g;(function(p){p.META_DATA_LABEL="label",p.META_DATA_DESCRIPTION="description",p.META_DATA_SIZE="size",p.META_DATA_MIME="mime";function c(o){const s=new Map;o.path.substring(o.path.indexOf(";")+1,o.path.lastIndexOf(";")).split(";").forEach(r=>{const[i,n]=r.split(":");i&&n&&s.set(i,n)});const u=o.path.substring(0,o.path.indexOf(";"));return u&&s.set(p.META_DATA_MIME,u),s}p.parseMetaData=c})(g=e.DataUri||(e.DataUri={}))}),define(Q[290],J([0,1,7,156,12,73,119,684,685,199,40,8,24,43,102,44,50,103,6,55]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t){"use strict";var l;Object.defineProperty(e,"__esModule",{value:!0}),e.renderMarkdown=void 0;const h=(l=window.trustedTypes)===null||l===void 0?void 0:l.createPolicy("insane",{createHTML(v,y){return d.insane(v,y)}});function m(v,y={},L={}){var I;const k=N.createElement(y),E=function(R){let W;try{W=g.parse(decodeURIComponent(R))}catch(x){}return W?(W=p.cloneAndChange(W,x=>{if(v.uris&&v.uris[x])return o.URI.revive(v.uris[x])}),encodeURIComponent(JSON.stringify(W))):R},T=function(R,W){const x=v.uris&&v.uris[R];if(!x)return R;let K=o.URI.revive(x);return o.URI.parse(R).toString()===K.toString()?R:W?s.FileAccess.asBrowserUri(K).toString(!0):(K.query&&(K=K.with({query:E(K.query)})),K.toString())};let O;const A=new Promise(R=>O=R),B=new C.Renderer;B.image=(R,W,x)=>{let K=[],Y=[];if(R){({href:R,dimensions:K}=w.parseHrefAndDimensions(R)),R=T(R,!0);try{const ee=o.URI.parse(R);y.baseUrl&&ee.scheme===s.Schemas.file&&(R=u.resolvePath(y.baseUrl,R).toString())}catch(ee){}Y.push(`src="${R}"`)}return x&&Y.push(`alt="${x}"`),W&&Y.push(`title="${W}"`),K.length&&(Y=Y.concat(K)),""},B.link=(R,W,x)=>(R===x&&(x=w.removeMarkdownEscapes(x)),R=T(R,!1),y.baseUrl&&(/^\w[\w\d+.-]*:/.test(R)||(R=u.resolvePath(y.baseUrl,R).toString())),W=w.removeMarkdownEscapes(W),R=w.removeMarkdownEscapes(R),!R||R.match(/^data:|javascript:/i)||R.match(/^command:/i)&&!v.isTrusted||R.match(/^command:(\/\/\/)?_workbench\.downloadResource/i)?x:(R=R.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"),`
    ${x}`)),B.paragraph=R=>(v.supportThemeIcons&&(R=i.renderLabelWithIcons(R).map(x=>typeof x=="string"?x:x.outerHTML).join("")),`

    ${R}

    `),y.codeBlockRenderer&&(B.code=(R,W)=>{const x=y.codeBlockRenderer(W,R),K=S.defaultGenerator.nextId(),Y=Promise.all([x,A]).then(ee=>{const se=k.querySelector(`div[data-code="${K}"]`);se&&b.reset(se,ee[0])}).catch(ee=>{});return y.asyncRenderCallback&&Y.then(y.asyncRenderCallback),`
    ${c.escape(R)}
    `}),y.actionHandler&&y.actionHandler.disposeables.add(n.Event.any(t.domEvent(k,"click"),t.domEvent(k,"auxclick"))(R=>{const W=new r.StandardMouseEvent(R);if(!(!W.leftButton&&!W.middleButton)){let x=W.target;if(!(x.tagName!=="A"&&(x=x.parentElement,!x||x.tagName!=="A")))try{const K=x.dataset.href;K&&y.actionHandler.callback(K,W)}catch(K){M.onUnexpectedError(K)}finally{W.preventDefault()}}})),L.sanitizer=R=>(v.isTrusted?R.match(/^(]+>)|(<\/\s*span>)$/):void 0)?R:"",L.sanitize=!0,L.silent=!0,L.renderer=B;let F=(I=v.value)!==null&&I!==void 0?I:"";F.length>1e5&&(F=`${F.substr(0,1e5)}\u2026`),v.supportThemeIcons&&(F=a.markdownEscapeEscapedIcons(F));const D=C.parse(F,L);if(k.innerHTML=_(v,D),O(),y.asyncRenderCallback)for(const R of k.getElementsByTagName("img")){const W=b.addDisposableListener(R,"load",()=>{W.dispose(),y.asyncRenderCallback()})}return k}e.renderMarkdown=m;function _(v,y){var L;const I=f(v);return(L=h==null?void 0:h.createHTML(y,I))!==null&&L!==void 0?L:d.insane(y,I)}function f(v){const y=[s.Schemas.http,s.Schemas.https,s.Schemas.mailto,s.Schemas.data,s.Schemas.file,s.Schemas.vscodeRemote,s.Schemas.vscodeRemoteResource];return v.isTrusted&&y.push(s.Schemas.command),{allowedSchemes:y,allowedTags:["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"],allowedAttributes:{a:["href","name","target","data-href"],img:["src","title","alt","width","height"],div:["class","data-code"],span:["class","style"],th:["align"],td:["align"]},filter(L){return L.tag==="span"&&v.isTrusted?L.attrs.style&&Object.keys(L.attrs).length===1?!!L.attrs.style.match(/^(color\:#[0-9a-fA-F]+;)?(background-color\:#[0-9a-fA-F]+;)?$/):L.attrs.class?!!L.attrs.class.match(/^codicon codicon-[a-z\-]+( codicon-modifier-[a-z\-]+)?$/):!1:!0}}}}),define(Q[159],J([0,1,24,43,17,44,152]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.normalizeDriveLetter=e.getBaseLabel=void 0;function C(g){if(!!g){typeof g=="string"&&(g=b.URI.file(g));const p=w.basename(g)||(g.scheme===N.Schemas.file?g.fsPath:g.path);return M.isWindows&&S.isRootOrDriveLetter(p)?d(p):p}}e.getBaseLabel=C;function d(g){return S.hasDriveLetter(g)?g.charAt(0).toUpperCase()+g.slice(1):g}e.normalizeDriveLetter=d}),define(Q[291],J([0,1,72,8,198,43,44]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.guessMimeTypes=e.registerTextMime=e.MIME_UNKNOWN=e.MIME_TEXT=void 0,e.MIME_TEXT="text/plain",e.MIME_UNKNOWN="application/unknown";let C=[],d=[],g=[];function p(u,r=!1){const i=c(u);C.push(i),i.userConfigured?g.push(i):d.push(i),r&&!i.userConfigured&&C.forEach(n=>{n.mime===i.mime||n.userConfigured||(i.extension&&n.extension===i.extension&&console.warn(`Overwriting extension <<${i.extension}>> to now point to mime <<${i.mime}>>`),i.filename&&n.filename===i.filename&&console.warn(`Overwriting filename <<${i.filename}>> to now point to mime <<${i.mime}>>`),i.filepattern&&n.filepattern===i.filepattern&&console.warn(`Overwriting filepattern <<${i.filepattern}>> to now point to mime <<${i.mime}>>`),i.firstline&&n.firstline===i.firstline&&console.warn(`Overwriting firstline <<${i.firstline}>> to now point to mime <<${i.mime}>>`))})}e.registerTextMime=p;function c(u){return{id:u.id,mime:u.mime,filename:u.filename,extension:u.extension,filepattern:u.filepattern,firstline:u.firstline,userConfigured:u.userConfigured,filenameLowercase:u.filename?u.filename.toLowerCase():void 0,extensionLowercase:u.extension?u.extension.toLowerCase():void 0,filepatternLowercase:u.filepattern?u.filepattern.toLowerCase():void 0,filepatternOnPath:u.filepattern?u.filepattern.indexOf(b.posix.sep)>=0:!1}}function o(u,r){let i;if(u)switch(u.scheme){case w.Schemas.file:i=u.fsPath;break;case w.Schemas.data:i=S.DataUri.parseMetaData(u).get(S.DataUri.META_DATA_LABEL);break;default:i=u.path}if(!i)return[e.MIME_UNKNOWN];i=i.toLowerCase();const n=b.basename(i),t=s(i,n,g);if(t)return[t,e.MIME_TEXT];const l=s(i,n,d);if(l)return[l,e.MIME_TEXT];if(r){const h=a(r);if(h)return[h,e.MIME_TEXT]}return[e.MIME_UNKNOWN]}e.guessMimeTypes=o;function s(u,r,i){let n=null,t=null,l=null;for(let h=i.length-1;h>=0;h--){const m=i[h];if(r===m.filenameLowercase){n=m;break}if(m.filepattern&&(!t||m.filepattern.length>t.filepattern.length)){const _=m.filepatternOnPath?u:r;M.match(m.filepatternLowercase,_)&&(t=m)}m.extension&&(!l||m.extension.length>l.extension.length)&&r.endsWith(m.extensionLowercase)&&(l=m)}return n?n.mime:t?t.mime:l?l.mime:null}function a(u){if(N.startsWithUTF8BOM(u)&&(u=u.substr(1)),u.length>0)for(let r=C.length-1;r>=0;r--){const i=C[r];if(!!i.firstline){const n=u.match(i.firstline);if(n&&n.length>0)return i.mime}}return null}}),define(Q[292],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateUuid=void 0;const b=new Uint8Array(16),N=[];for(let S=0;S<256;S++)N.push(S.toString(16).padStart(2,"0"));let M;typeof crypto=="object"&&typeof crypto.getRandomValues=="function"?M=crypto.getRandomValues.bind(crypto):M=function(S){for(let C=0;C{this._pendingReplies[r]={resolve:i,reject:n},this._send({vsWorker:this._workerId,req:r,method:a,args:u})})}handleMessage(a){!a||!a.vsWorker||this._workerId!==-1&&a.vsWorker!==this._workerId||this._handleMessage(a)}_handleMessage(a){if(a.seq){let n=a;if(!this._pendingReplies[n.seq]){console.warn("Got reply to unknown seq");return}let t=this._pendingReplies[n.seq];if(delete this._pendingReplies[n.seq],n.err){let l=n.err;n.err.$isError&&(l=new Error,l.name=n.err.name,l.message=n.err.message,l.stack=n.err.stack),t.reject(l);return}t.resolve(n.res);return}let u=a,r=u.req;this._handler.handleMessage(u.method,u.args).then(n=>{this._send({vsWorker:this._workerId,seq:r,res:n,err:void 0})},n=>{n.detail instanceof Error&&(n.detail=b.transformErrorForSerialization(n.detail)),this._send({vsWorker:this._workerId,seq:r,res:void 0,err:b.transformErrorForSerialization(n)})})}_send(a){let u=[];if(a.req){const r=a;for(let i=0;i{this._protocol.handleMessage(h)},h=>{i&&i(h)})),this._protocol=new g({sendMessage:(h,m)=>{this._worker.postMessage(h,m)},handleMessage:(h,m)=>{if(typeof r[h]!="function")return Promise.reject(new Error("Missing method "+h+" on main thread host."));try{return Promise.resolve(r[h].apply(r,m))}catch(_){return Promise.reject(_)}}}),this._protocol.setWorkerId(this._worker.getId());let n=null;typeof self.require!="undefined"&&typeof self.require.getConfig=="function"?n=self.require.getConfig():typeof self.requirejs!="undefined"&&(n=self.requirejs.s.contexts._.config);const t=w.getAllMethodNames(r);this._onModuleLoaded=this._protocol.sendMessage(S,[this._worker.getId(),JSON.parse(JSON.stringify(n)),u,t]);const l=(h,m)=>this._request(h,m);this._lazyProxy=new Promise((h,m)=>{i=m,this._onModuleLoaded.then(_=>{h(w.createProxyObject(_,l))},_=>{m(_),this._onError("Worker failed to load "+u,_)})})}getProxyObject(){return this._lazyProxy}_request(a,u){return new Promise((r,i)=>{this._onModuleLoaded.then(()=>{this._protocol.sendMessage(a,u).then(r,i)},i)})}_onError(a,u){console.error(a),console.info(u)}}e.SimpleWorkerClient=p;class c{constructor(a,u){this._requestHandlerFactory=u,this._requestHandler=null,this._protocol=new g({sendMessage:(r,i)=>{a(r,i)},handleMessage:(r,i)=>this._handleMessage(r,i)})}onmessage(a){this._protocol.handleMessage(a)}_handleMessage(a,u){if(a===S)return this.initialize(u[0],u[1],u[2],u[3]);if(!this._requestHandler||typeof this._requestHandler[a]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+a));try{return Promise.resolve(this._requestHandler[a].apply(this._requestHandler,u))}catch(r){return Promise.reject(r)}}initialize(a,u,r,i){this._protocol.setWorkerId(a);const n=(l,h)=>this._protocol.sendMessage(l,h),t=w.createProxyObject(i,n);return this._requestHandlerFactory?(this._requestHandler=this._requestHandlerFactory(t),Promise.resolve(w.getAllMethodNames(this._requestHandler))):(u&&(typeof u.baseUrl!="undefined"&&delete u.baseUrl,typeof u.paths!="undefined"&&typeof u.paths.vs!="undefined"&&delete u.paths.vs,typeof u.trustedTypesPolicy!==void 0&&delete u.trustedTypesPolicy,u.catchError=!0,self.require.config(u)),new Promise((l,h)=>{self.require([r],m=>{if(this._requestHandler=m.create(t),!this._requestHandler){h(new Error("No RequestHandler!"));return}l(w.getAllMethodNames(this._requestHandler))},h)}))}}e.SimpleWorkerServer=c;function o(s){return new c(s,null)}e.create=o}),define(Q[202],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ItemActivation=e.NO_KEY_MODS=void 0,e.NO_KEY_MODS={ctrlCmd:!1,alt:!1};var b;(function(N){N[N.NONE=0]="NONE",N[N.FIRST=1]="FIRST",N[N.SECOND=2]="SECOND",N[N.LAST=3]="LAST"})(b=e.ItemActivation||(e.ItemActivation={}))}),define(Q[293],J([0,1,2,6,15,20]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryStorageDatabase=e.Storage=void 0;var S;(function(g){g[g.None=0]="None",g[g.Initialized=1]="Initialized",g[g.Closed=2]="Closed"})(S||(S={}));class C extends b.Disposable{constructor(p,c=Object.create(null)){super();this.database=p,this.options=c,this._onDidChangeStorage=this._register(new N.Emitter),this.onDidChangeStorage=this._onDidChangeStorage.event,this.state=S.None,this.cache=new Map,this.flushDelayer=new M.ThrottledDelayer(C.DEFAULT_FLUSH_DELAY),this.pendingDeletes=new Set,this.pendingInserts=new Map,this.whenFlushedCallbacks=[],this.registerListeners()}registerListeners(){this._register(this.database.onDidChangeItemsExternal(p=>this.onDidChangeItemsExternal(p)))}onDidChangeItemsExternal(p){var c,o;(c=p.changed)===null||c===void 0||c.forEach((s,a)=>this.accept(a,s)),(o=p.deleted)===null||o===void 0||o.forEach(s=>this.accept(s,void 0))}accept(p,c){if(this.state!==S.Closed){let o=!1;w.isUndefinedOrNull(c)?o=this.cache.delete(p):this.cache.get(p)!==c&&(this.cache.set(p,c),o=!0),o&&this._onDidChangeStorage.fire(p)}}get(p,c){const o=this.cache.get(p);return w.isUndefinedOrNull(o)?c:o}getBoolean(p,c){const o=this.get(p);return w.isUndefinedOrNull(o)?c:o==="true"}getNumber(p,c){const o=this.get(p);return w.isUndefinedOrNull(o)?c:parseInt(o,10)}set(p,c){return Ie(this,void 0,void 0,function*(){if(this.state!==S.Closed){if(w.isUndefinedOrNull(c))return this.delete(p);const o=String(c);if(this.cache.get(p)!==o)return this.cache.set(p,o),this.pendingInserts.set(p,o),this.pendingDeletes.delete(p),this._onDidChangeStorage.fire(p),this.flushDelayer.trigger(()=>this.flushPending())}})}delete(p){return Ie(this,void 0,void 0,function*(){if(this.state!==S.Closed&&!!this.cache.delete(p))return this.pendingDeletes.has(p)||this.pendingDeletes.add(p),this.pendingInserts.delete(p),this._onDidChangeStorage.fire(p),this.flushDelayer.trigger(()=>this.flushPending())})}get hasPending(){return this.pendingInserts.size>0||this.pendingDeletes.size>0}flushPending(){return Ie(this,void 0,void 0,function*(){if(!!this.hasPending){const p={insert:this.pendingInserts,delete:this.pendingDeletes};return this.pendingDeletes=new Set,this.pendingInserts=new Map,this.database.updateItems(p).finally(()=>{var c;if(!this.hasPending)for(;this.whenFlushedCallbacks.length;)(c=this.whenFlushedCallbacks.pop())===null||c===void 0||c()})}})}dispose(){this.flushDelayer.cancel(),this.flushDelayer.dispose(),super.dispose()}}e.Storage=C,C.DEFAULT_FLUSH_DELAY=100;class d{constructor(){this.onDidChangeItemsExternal=N.Event.None,this.items=new Map}updateItems(p){return Ie(this,void 0,void 0,function*(){p.insert&&p.insert.forEach((c,o)=>this.items.set(o,c)),p.delete&&p.delete.forEach(c=>this.items.delete(c))})}}e.InMemoryStorageDatabase=d}),define(Q[294],J([0,1,17,201]),function(q,e,b,N){"use strict";var M;Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultWorkerFactory=e.getWorkerBootstrapUrl=void 0;const w=(M=window.trustedTypes)===null||M===void 0?void 0:M.createPolicy("defaultWorkerFactory",{createScriptURL:c=>c});function S(c,o){if(b.globals.MonacoEnvironment){if(typeof b.globals.MonacoEnvironment.getWorker=="function")return b.globals.MonacoEnvironment.getWorker(c,o);if(typeof b.globals.MonacoEnvironment.getWorkerUrl=="function"){const s=b.globals.MonacoEnvironment.getWorkerUrl(c,o);return new Worker(w?w.createScriptURL(s):s,{name:o})}}if(typeof q=="function"){const s=q.toUrl("./"+c),a=C(s,o);return new Worker(w?w.createScriptURL(a):a,{name:o})}throw new Error("You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker")}function C(c,o,s=!1){if(s||/^((http:)|(https:)|(file:))/.test(c)){const a=String(window.location),u=a.substr(0,a.length-window.location.hash.length-window.location.search.length-window.location.pathname.length);if(s||c.substring(0,u.length)!==u){const r="vs/base/worker/defaultWorkerFactory.js",i=q.toUrl(r).slice(0,-r.length),n=`/*${o}*/self.MonacoEnvironment={baseUrl: '${i}'};importScripts('${c}');/*${o}*/`;if(s)return`data:text/javascript;charset=utf-8,${encodeURIComponent(n)}`;const t=new Blob([n],{type:"application/javascript"});return URL.createObjectURL(t)}}return c+"#"+o}e.getWorkerBootstrapUrl=C;function d(c){return typeof c.then=="function"}class g{constructor(o,s,a,u,r){this.id=s;const i=S("workerMain.js",a);d(i)?this.worker=i:this.worker=Promise.resolve(i),this.postMessage(o,[]),this.worker.then(n=>{n.onmessage=function(t){u(t.data)},n.onmessageerror=r,typeof n.addEventListener=="function"&&n.addEventListener("error",r)})}getId(){return this.id}postMessage(o,s){this.worker&&this.worker.then(a=>a.postMessage(o,s))}dispose(){this.worker&&this.worker.then(o=>o.terminate()),this.worker=null}}class p{constructor(o){this._label=o,this._webWorkerFailedBeforeError=!1}create(o,s,a){let u=++p.LAST_WORKER_ID;if(this._webWorkerFailedBeforeError)throw this._webWorkerFailedBeforeError;return new g(o,u,this._label||"anonymous"+u,s,r=>{N.logOnceWebWorkerWarning(r),this._webWorkerFailedBeforeError=r,a(r)})}}e.DefaultWorkerFactory=p,p.LAST_WORKER_ID=0}),define(Q[203],J([10]),{}),define(Q[295],J([10]),{}),define(Q[47],J([0,1,17,7,295]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.status=e.alert=e.setARIAContainer=void 0;const M=2e4;let w,S,C,d,g;function p(a){w=document.createElement("div"),w.className="monaco-aria-container";const u=()=>{const i=document.createElement("div");return i.className="monaco-alert",i.setAttribute("role","alert"),i.setAttribute("aria-atomic","true"),w.appendChild(i),i};S=u(),C=u();const r=()=>{const i=document.createElement("div");return i.className="monaco-status",i.setAttribute("role","complementary"),i.setAttribute("aria-live","polite"),i.setAttribute("aria-atomic","true"),w.appendChild(i),i};d=r(),g=r(),a.appendChild(w)}e.setARIAContainer=p;function c(a){!w||(S.textContent!==a?(N.clearNode(C),s(S,a)):(N.clearNode(S),s(C,a)))}e.alert=c;function o(a){!w||(b.isMacintosh?c(a):d.textContent!==a?(N.clearNode(g),s(d,a)):(N.clearNode(d),s(g,a)))}e.status=o;function s(a,u){N.clearNode(a),u.length>M&&(u=u.substr(0,M)),a.textContent=u,a.style.visibility="hidden",a.style.visibility="visible"}}),define(Q[296],J([10]),{}),define(Q[297],J([0,1,56,29,40,6,2,60,103,7,296]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Button=void 0;const p={buttonBackground:N.Color.fromHex("#0E639C"),buttonHoverBackground:N.Color.fromHex("#006BB3"),buttonForeground:N.Color.white};class c extends S.Disposable{constructor(s,a){super();this._onDidClick=this._register(new w.Emitter),this.options=a||Object.create(null),M.mixin(this.options,p,!1),this.buttonForeground=this.options.buttonForeground,this.buttonBackground=this.options.buttonBackground,this.buttonHoverBackground=this.options.buttonHoverBackground,this.buttonSecondaryForeground=this.options.buttonSecondaryForeground,this.buttonSecondaryBackground=this.options.buttonSecondaryBackground,this.buttonSecondaryHoverBackground=this.options.buttonSecondaryHoverBackground,this.buttonBorder=this.options.buttonBorder,this._element=document.createElement("a"),this._element.classList.add("monaco-button"),this._element.tabIndex=0,this._element.setAttribute("role","button"),s.appendChild(this._element),this._register(C.Gesture.addTarget(this._element)),[g.EventType.CLICK,C.EventType.Tap].forEach(u=>{this._register(g.addDisposableListener(this._element,u,r=>{if(!this.enabled){g.EventHelper.stop(r);return}this._onDidClick.fire(r)}))}),this._register(g.addDisposableListener(this._element,g.EventType.KEY_DOWN,u=>{const r=new b.StandardKeyboardEvent(u);let i=!1;this.enabled&&(r.equals(3)||r.equals(10))?(this._onDidClick.fire(u),i=!0):r.equals(9)&&(this._element.blur(),i=!0),i&&g.EventHelper.stop(r,!0)})),this._register(g.addDisposableListener(this._element,g.EventType.MOUSE_OVER,u=>{this._element.classList.contains("disabled")||this.setHoverBackground()})),this._register(g.addDisposableListener(this._element,g.EventType.MOUSE_OUT,u=>{this.applyStyles()})),this.focusTracker=this._register(g.trackFocus(this._element)),this._register(this.focusTracker.onDidFocus(()=>this.setHoverBackground())),this._register(this.focusTracker.onDidBlur(()=>this.applyStyles())),this.applyStyles()}get onDidClick(){return this._onDidClick.event}setHoverBackground(){let s;this.options.secondary?s=this.buttonSecondaryHoverBackground?this.buttonSecondaryHoverBackground.toString():null:s=this.buttonHoverBackground?this.buttonHoverBackground.toString():null,s&&(this._element.style.backgroundColor=s)}style(s){this.buttonForeground=s.buttonForeground,this.buttonBackground=s.buttonBackground,this.buttonHoverBackground=s.buttonHoverBackground,this.buttonSecondaryForeground=s.buttonSecondaryForeground,this.buttonSecondaryBackground=s.buttonSecondaryBackground,this.buttonSecondaryHoverBackground=s.buttonSecondaryHoverBackground,this.buttonBorder=s.buttonBorder,this.applyStyles()}applyStyles(){if(this._element){let s,a;this.options.secondary?(a=this.buttonSecondaryForeground?this.buttonSecondaryForeground.toString():"",s=this.buttonSecondaryBackground?this.buttonSecondaryBackground.toString():""):(a=this.buttonForeground?this.buttonForeground.toString():"",s=this.buttonBackground?this.buttonBackground.toString():"");const u=this.buttonBorder?this.buttonBorder.toString():"";this._element.style.color=a,this._element.style.backgroundColor=s,this._element.style.borderWidth=u?"1px":"",this._element.style.borderStyle=u?"solid":"",this._element.style.borderColor=u}}get element(){return this._element}set label(s){this._element.classList.add("monaco-text-button"),this.options.supportIcons?g.reset(this._element,...d.renderLabelWithIcons(s)):this._element.textContent=s,typeof this.options.title=="string"?this._element.title=this.options.title:this.options.title&&(this._element.title=s)}set enabled(s){s?(this._element.classList.remove("disabled"),this._element.setAttribute("aria-disabled",String(!1)),this._element.tabIndex=0):(this._element.classList.add("disabled"),this._element.setAttribute("aria-disabled",String(!0)))}get enabled(){return!this._element.classList.contains("disabled")}}e.Button=c}),define(Q[298],J([10]),{}),define(Q[160],J([0,1,52,29,6,27,298]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Checkbox=void 0;const S={inputActiveOptionBorder:N.Color.fromHex("#007ACC00"),inputActiveOptionForeground:N.Color.fromHex("#FFFFFF"),inputActiveOptionBackground:N.Color.fromHex("#0E639C50")};class C extends b.Widget{constructor(g){super();this._onChange=this._register(new M.Emitter),this.onChange=this._onChange.event,this._onKeyDown=this._register(new M.Emitter),this.onKeyDown=this._onKeyDown.event,this._opts=Object.assign(Object.assign({},S),g),this._checked=this._opts.isChecked;const p=["monaco-custom-checkbox"];this._opts.icon&&p.push(...w.CSSIcon.asClassNameArray(this._opts.icon)),this._opts.actionClassName&&p.push(...this._opts.actionClassName.split(" ")),this._checked&&p.push("checked"),this.domNode=document.createElement("div"),this.domNode.title=this._opts.title,this.domNode.classList.add(...p),this._opts.notFocusable||(this.domNode.tabIndex=0),this.domNode.setAttribute("role","checkbox"),this.domNode.setAttribute("aria-checked",String(this._checked)),this.domNode.setAttribute("aria-label",this._opts.title),this.applyStyles(),this.onclick(this.domNode,c=>{this.checked=!this._checked,this._onChange.fire(!1),c.preventDefault()}),this.ignoreGesture(this.domNode),this.onkeydown(this.domNode,c=>{if(c.keyCode===10||c.keyCode===3){this.checked=!this._checked,this._onChange.fire(!0),c.preventDefault();return}this._onKeyDown.fire(c)})}get enabled(){return this.domNode.getAttribute("aria-disabled")!=="true"}focus(){this.domNode.focus()}get checked(){return this._checked}set checked(g){this._checked=g,this.domNode.setAttribute("aria-checked",String(this._checked)),this.domNode.classList.toggle("checked",this._checked),this.applyStyles()}width(){return 2+2+2+16}style(g){g.inputActiveOptionBorder&&(this._opts.inputActiveOptionBorder=g.inputActiveOptionBorder),g.inputActiveOptionForeground&&(this._opts.inputActiveOptionForeground=g.inputActiveOptionForeground),g.inputActiveOptionBackground&&(this._opts.inputActiveOptionBackground=g.inputActiveOptionBackground),this.applyStyles()}applyStyles(){this.domNode&&(this.domNode.style.borderColor=this._checked&&this._opts.inputActiveOptionBorder?this._opts.inputActiveOptionBorder.toString():"transparent",this.domNode.style.color=this._checked&&this._opts.inputActiveOptionForeground?this._opts.inputActiveOptionForeground.toString():"inherit",this.domNode.style.backgroundColor=this._checked&&this._opts.inputActiveOptionBackground?this._opts.inputActiveOptionBackground.toString():"transparent")}enable(){this.domNode.setAttribute("aria-disabled",String(!1))}disable(){this.domNode.setAttribute("aria-disabled",String(!0))}}e.Checkbox=C}),define(Q[299],J([10]),{}),define(Q[300],J([10]),{}),define(Q[123],J([0,1,27,299,300]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.formatRule=void 0;function N(M){let w=M.definition;for(;w instanceof b.Codicon;)w=w.definition;return`.codicon-${M.id}:before { content: '${w.fontCharacter}'; }`}e.formatRule=N}),define(Q[301],J([10]),{}),define(Q[204],J([0,1,7,17,2,120,151,301]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextView=e.layout=e.LayoutAnchorMode=void 0;var C;(function(c){c[c.AVOID=0]="AVOID",c[c.ALIGN=1]="ALIGN"})(C=e.LayoutAnchorMode||(e.LayoutAnchorMode={}));function d(c,o,s){const a=s.mode===C.ALIGN?s.offset:s.offset+s.size,u=s.mode===C.ALIGN?s.offset+s.size:s.offset;return s.position===0?o<=c-a?a:o<=u?u-o:Math.max(c-o,0):o<=u?u-o:o<=c-a?a:0}e.layout=d;class g extends M.Disposable{constructor(o,s){super();this.container=null,this.delegate=null,this.toDisposeOnClean=M.Disposable.None,this.toDisposeOnSetContainer=M.Disposable.None,this.shadowRoot=null,this.shadowRootHostElement=null,this.view=b.$(".context-view"),this.useFixedPosition=!1,this.useShadowDOM=!1,b.hide(this.view),this.setContainer(o,s),this._register(M.toDisposable(()=>this.setContainer(null,1)))}setContainer(o,s){var a;if(this.container&&(this.toDisposeOnSetContainer.dispose(),this.shadowRoot?(this.shadowRoot.removeChild(this.view),this.shadowRoot=null,(a=this.shadowRootHostElement)===null||a===void 0||a.remove(),this.shadowRootHostElement=null):this.container.removeChild(this.view),this.container=null),o){if(this.container=o,this.useFixedPosition=s!==1,this.useShadowDOM=s===3,this.useShadowDOM){this.shadowRootHostElement=b.$(".shadow-root-host"),this.container.appendChild(this.shadowRootHostElement),this.shadowRoot=this.shadowRootHostElement.attachShadow({mode:"open"});const r=document.createElement("style");r.textContent=p,this.shadowRoot.appendChild(r),this.shadowRoot.appendChild(this.view),this.shadowRoot.appendChild(b.$("slot"))}else this.container.appendChild(this.view);const u=new M.DisposableStore;g.BUBBLE_UP_EVENTS.forEach(r=>{u.add(b.addStandardDisposableListener(this.container,r,i=>{this.onDOMEvent(i,!1)}))}),g.BUBBLE_DOWN_EVENTS.forEach(r=>{u.add(b.addStandardDisposableListener(this.container,r,i=>{this.onDOMEvent(i,!0)},!0))}),this.toDisposeOnSetContainer=u}}show(o){this.isVisible()&&this.hide(),b.clearNode(this.view),this.view.className="context-view",this.view.style.top="0px",this.view.style.left="0px",this.view.style.zIndex="2500",this.view.style.position=this.useFixedPosition?"fixed":"absolute",b.show(this.view),this.toDisposeOnClean=o.render(this.view)||M.Disposable.None,this.delegate=o,this.doLayout(),this.delegate.focus&&this.delegate.focus()}getViewElement(){return this.view}layout(){if(!!this.isVisible()){if(this.delegate.canRelayout===!1&&!(N.isIOS&&S.BrowserFeatures.pointerEvents)){this.hide();return}this.delegate.layout&&this.delegate.layout(),this.doLayout()}}doLayout(){if(!!this.isVisible()){let o=this.delegate.getAnchor(),s;if(b.isHTMLElement(o)){let m=b.getDomNodePagePosition(o);s={top:m.top,left:m.left,width:m.width,height:m.height}}else s={top:o.y,left:o.x,width:o.width||1,height:o.height||2};const a=b.getTotalWidth(this.view),u=b.getTotalHeight(this.view),r=this.delegate.anchorPosition||0,i=this.delegate.anchorAlignment||0,n=this.delegate.anchorAxisAlignment||0;let t,l;if(n===0){const m={offset:s.top-window.pageYOffset,size:s.height,position:r===0?0:1},_={offset:s.left,size:s.width,position:i===0?0:1,mode:C.ALIGN};t=d(window.innerHeight,u,m)+window.pageYOffset,w.Range.intersects({start:t,end:t+u},{start:m.offset,end:m.offset+m.size})&&(_.mode=C.AVOID),l=d(window.innerWidth,a,_)}else{const m={offset:s.left,size:s.width,position:i===0?0:1},_={offset:s.top,size:s.height,position:r===0?0:1,mode:C.ALIGN};l=d(window.innerWidth,a,m),w.Range.intersects({start:l,end:l+a},{start:m.offset,end:m.offset+m.size})&&(_.mode=C.AVOID),t=d(window.innerHeight,u,_)+window.pageYOffset}this.view.classList.remove("top","bottom","left","right"),this.view.classList.add(r===0?"bottom":"top"),this.view.classList.add(i===0?"left":"right"),this.view.classList.toggle("fixed",this.useFixedPosition);const h=b.getDomNodePagePosition(this.container);this.view.style.top=`${t-(this.useFixedPosition?b.getDomNodePagePosition(this.view).top:h.top)}px`,this.view.style.left=`${l-(this.useFixedPosition?b.getDomNodePagePosition(this.view).left:h.left)}px`,this.view.style.width="initial"}}hide(o){const s=this.delegate;this.delegate=null,(s==null?void 0:s.onHide)&&s.onHide(o),this.toDisposeOnClean.dispose(),b.hide(this.view)}isVisible(){return!!this.delegate}onDOMEvent(o,s){this.delegate&&(this.delegate.onDOMEvent?this.delegate.onDOMEvent(o,document.activeElement):s&&!b.isAncestor(o.target,this.container)&&this.hide())}dispose(){this.hide(),super.dispose()}}e.ContextView=g,g.BUBBLE_UP_EVENTS=["click","keydown","focus","blur"],g.BUBBLE_DOWN_EVENTS=["click"];let p=` + :host { + all: initial; /* 1st rule so subsequent properties are reset. */ + } + + @font-face { + font-family: "codicon"; + src: url("./codicon.ttf?5d4d76ab2ce5108968ad644d591a16a6") format("truetype"); + } + + .codicon[class*='codicon-'] { + font: normal normal normal 16px/1 codicon; + display: inline-block; + text-decoration: none; + text-rendering: auto; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + } + + :host { + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", system-ui, "Ubuntu", "Droid Sans", sans-serif; + } + + :host-context(.mac) { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } + :host-context(.mac:lang(zh-Hans)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } + :host-context(.mac:lang(zh-Hant)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } + :host-context(.mac:lang(ja)) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } + :host-context(.mac:lang(ko)) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } + + :host-context(.windows) { font-family: "Segoe WPC", "Segoe UI", sans-serif; } + :host-context(.windows:lang(zh-Hans)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } + :host-context(.windows:lang(zh-Hant)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } + :host-context(.windows:lang(ja)) { font-family: "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; } + :host-context(.windows:lang(ko)) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } + + :host-context(.linux) { font-family: system-ui, "Ubuntu", "Droid Sans", sans-serif; } + :host-context(.linux:lang(zh-Hans)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(zh-Hant)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(ja)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(ko)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } +`}),define(Q[302],J([10]),{}),define(Q[205],J([0,1,7,8,29,40,302]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CountBadge=void 0;const S={badgeBackground:M.Color.fromHex("#4D4D4D"),badgeForeground:M.Color.fromHex("#FFFFFF")};class C{constructor(g,p){this.count=0,this.options=p||Object.create(null),w.mixin(this.options,S,!1),this.badgeBackground=this.options.badgeBackground,this.badgeForeground=this.options.badgeForeground,this.badgeBorder=this.options.badgeBorder,this.element=b.append(g,b.$(".monaco-count-badge")),this.countFormat=this.options.countFormat||"{0}",this.titleFormat=this.options.titleFormat||"",this.setCount(this.options.count||0)}setCount(g){this.count=g,this.render()}setTitleFormat(g){this.titleFormat=g,this.render()}render(){this.element.textContent=N.format(this.countFormat,this.count),this.element.title=N.format(this.titleFormat,this.count),this.applyStyles()}style(g){this.badgeBackground=g.badgeBackground,this.badgeForeground=g.badgeForeground,this.badgeBorder=g.badgeBorder,this.applyStyles()}applyStyles(){if(this.element){const g=this.badgeBackground?this.badgeBackground.toString():"",p=this.badgeForeground?this.badgeForeground.toString():"",c=this.badgeBorder?this.badgeBorder.toString():"";this.element.style.backgroundColor=g,this.element.style.color=p,this.element.style.borderWidth=c?"1px":"",this.element.style.borderStyle=c?"solid":"",this.element.style.borderColor=c}}}e.CountBadge=C}),define(Q[206],J([10]),{}),define(Q[207],J([10]),{}),define(Q[303],J([10]),{}),define(Q[304],J([10]),{}),define(Q[305],J([10]),{}),define(Q[306],J([10]),{}),define(Q[208],J([10]),{}),define(Q[307],J([10]),{}),define(Q[124],J([0,1,307]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME=void 0,e.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME="monaco-mouse-cursor-text"}),define(Q[308],J([10]),{}),define(Q[309],J([0,1,2,29,40,7,15,308]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ProgressBar=void 0;const C="done",d="active",g="infinite",p="discrete",c={progressBarBackground:N.Color.fromHex("#0E70C0")};class o extends b.Disposable{constructor(a,u){super();this.options=u||Object.create(null),M.mixin(this.options,c,!1),this.workedVal=0,this.progressBarBackground=this.options.progressBarBackground,this._register(this.showDelayedScheduler=new S.RunOnceScheduler(()=>w.show(this.element),0)),this.create(a)}create(a){this.element=document.createElement("div"),this.element.classList.add("monaco-progress-container"),this.element.setAttribute("role","progressbar"),this.element.setAttribute("aria-valuemin","0"),a.appendChild(this.element),this.bit=document.createElement("div"),this.bit.classList.add("progress-bit"),this.element.appendChild(this.bit),this.applyStyles()}off(){this.bit.style.width="inherit",this.bit.style.opacity="1",this.element.classList.remove(d,g,p),this.workedVal=0,this.totalWork=void 0}stop(){return this.doDone(!1)}doDone(a){return this.element.classList.add(C),this.element.classList.contains(g)?(this.bit.style.opacity="0",a?setTimeout(()=>this.off(),200):this.off()):(this.bit.style.width="inherit",a?setTimeout(()=>this.off(),200):this.off()),this}infinite(){return this.bit.style.width="2%",this.bit.style.opacity="1",this.element.classList.remove(p,C),this.element.classList.add(d,g),this}getContainer(){return this.element}style(a){this.progressBarBackground=a.progressBarBackground,this.applyStyles()}applyStyles(){if(this.bit){const a=this.progressBarBackground?this.progressBarBackground.toString():"";this.bit.style.backgroundColor=a}}}e.ProgressBar=o}),define(Q[310],J([10]),{}),define(Q[104],J([0,1,2,17,20,60,50,6,7,55,15,310]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Sash=e.OrthogonalEdge=void 0;let c=!1;var o;(function(r){r.North="north",r.South="south",r.East="east",r.West="west"})(o=e.OrthogonalEdge||(e.OrthogonalEdge={}));let s=4;const a=new C.Emitter;class u extends b.Disposable{constructor(i,n,t){super();this.hoverDelayer=this._register(new p.Delayer(300)),this._state=3,this._onDidEnablementChange=this._register(new C.Emitter),this.onDidEnablementChange=this._onDidEnablementChange.event,this._onDidStart=this._register(new C.Emitter),this.onDidStart=this._onDidStart.event,this._onDidChange=this._register(new C.Emitter),this.onDidChange=this._onDidChange.event,this._onDidReset=this._register(new C.Emitter),this.onDidReset=this._onDidReset.event,this._onDidEnd=this._register(new C.Emitter),this.onDidEnd=this._onDidEnd.event,this.linkedSash=void 0,this.orthogonalStartSashDisposables=this._register(new b.DisposableStore),this.orthogonalStartDragHandleDisposables=this._register(new b.DisposableStore),this.orthogonalEndSashDisposables=this._register(new b.DisposableStore),this.orthogonalEndDragHandleDisposables=this._register(new b.DisposableStore),this.el=d.append(i,d.$(".monaco-sash")),t.orthogonalEdge&&this.el.classList.add(`orthogonal-edge-${t.orthogonalEdge}`),N.isMacintosh&&this.el.classList.add("mac"),this._register(g.domEvent(this.el,"mousedown")(this.onMouseDown,this)),this._register(g.domEvent(this.el,"dblclick")(this.onMouseDoubleClick,this)),this._register(g.domEvent(this.el,"mouseenter")(()=>u.onMouseEnter(this))),this._register(g.domEvent(this.el,"mouseleave")(()=>u.onMouseLeave(this))),this._register(w.Gesture.addTarget(this.el)),this._register(g.domEvent(this.el,w.EventType.Start)(this.onTouchStart,this)),typeof t.size=="number"?(this.size=t.size,t.orientation===0?this.el.style.width=`${this.size}px`:this.el.style.height=`${this.size}px`):(this.size=s,this._register(a.event(l=>{this.size=l,this.layout()}))),this.hidden=!1,this.layoutProvider=n,this.orthogonalStartSash=t.orthogonalStartSash,this.orthogonalEndSash=t.orthogonalEndSash,this.orientation=t.orientation||0,this.orientation===1?(this.el.classList.add("horizontal"),this.el.classList.remove("vertical")):(this.el.classList.remove("horizontal"),this.el.classList.add("vertical")),this.el.classList.toggle("debug",c),this.layout()}get state(){return this._state}set state(i){this._state!==i&&(this.el.classList.toggle("disabled",i===0),this.el.classList.toggle("minimum",i===1),this.el.classList.toggle("maximum",i===2),this._state=i,this._onDidEnablementChange.fire(i))}get orthogonalStartSash(){return this._orthogonalStartSash}set orthogonalStartSash(i){if(this.orthogonalStartDragHandleDisposables.clear(),this.orthogonalStartSashDisposables.clear(),i){const n=t=>{this.orthogonalStartDragHandleDisposables.clear(),t!==0&&(this._orthogonalStartDragHandle=d.append(this.el,d.$(".orthogonal-drag-handle.start")),this.orthogonalStartDragHandleDisposables.add(b.toDisposable(()=>this._orthogonalStartDragHandle.remove())),g.domEvent(this._orthogonalStartDragHandle,"mouseenter")(()=>u.onMouseEnter(i),void 0,this.orthogonalStartDragHandleDisposables),g.domEvent(this._orthogonalStartDragHandle,"mouseleave")(()=>u.onMouseLeave(i),void 0,this.orthogonalStartDragHandleDisposables))};this.orthogonalStartSashDisposables.add(i.onDidEnablementChange(n,this)),n(i.state)}this._orthogonalStartSash=i}get orthogonalEndSash(){return this._orthogonalEndSash}set orthogonalEndSash(i){if(this.orthogonalEndDragHandleDisposables.clear(),this.orthogonalEndSashDisposables.clear(),i){const n=t=>{this.orthogonalEndDragHandleDisposables.clear(),t!==0&&(this._orthogonalEndDragHandle=d.append(this.el,d.$(".orthogonal-drag-handle.end")),this.orthogonalEndDragHandleDisposables.add(b.toDisposable(()=>this._orthogonalEndDragHandle.remove())),g.domEvent(this._orthogonalEndDragHandle,"mouseenter")(()=>u.onMouseEnter(i),void 0,this.orthogonalEndDragHandleDisposables),g.domEvent(this._orthogonalEndDragHandle,"mouseleave")(()=>u.onMouseLeave(i),void 0,this.orthogonalEndDragHandleDisposables))};this.orthogonalEndSashDisposables.add(i.onDidEnablementChange(n,this)),n(i.state)}this._orthogonalEndSash=i}onMouseDown(i){d.EventHelper.stop(i,!1);let n=!1;if(!i.__orthogonalSashEvent){const E=this.getOrthogonalSash(i);E&&(n=!0,i.__orthogonalSashEvent=!0,E.onMouseDown(i))}if(this.linkedSash&&!i.__linkedSashEvent&&(i.__linkedSashEvent=!0,this.linkedSash.onMouseDown(i)),!!this.state){const t=[...d.getElementsByTagName("iframe"),...d.getElementsByTagName("webview")];for(const E of t)E.style.pointerEvents="none";const l=new S.StandardMouseEvent(i),h=l.posx,m=l.posy,_=l.altKey,f={startX:h,currentX:h,startY:m,currentY:m,altKey:_};this.el.classList.add("active"),this._onDidStart.fire(f);const v=d.createStyleSheet(this.el),y=()=>{let E="";n?E="all-scroll":this.orientation===1?this.state===1?E="s-resize":this.state===2?E="n-resize":E=N.isMacintosh?"row-resize":"ns-resize":this.state===1?E="e-resize":this.state===2?E="w-resize":E=N.isMacintosh?"col-resize":"ew-resize",v.textContent=`* { cursor: ${E} !important; }`},L=new b.DisposableStore;y(),n||this.onDidEnablementChange(y,null,L);const I=E=>{d.EventHelper.stop(E,!1);const T=new S.StandardMouseEvent(E),O={startX:h,currentX:T.posx,startY:m,currentY:T.posy,altKey:_};this._onDidChange.fire(O)},k=E=>{d.EventHelper.stop(E,!1),this.el.removeChild(v),this.el.classList.remove("active"),this._onDidEnd.fire(),L.dispose();for(const T of t)T.style.pointerEvents="auto"};g.domEvent(window,"mousemove")(I,null,L),g.domEvent(window,"mouseup")(k,null,L)}}onMouseDoubleClick(i){const n=this.getOrthogonalSash(i);n&&n._onDidReset.fire(),this.linkedSash&&this.linkedSash._onDidReset.fire(),this._onDidReset.fire()}onTouchStart(i){d.EventHelper.stop(i);const n=[],t=i.pageX,l=i.pageY,h=i.altKey;this._onDidStart.fire({startX:t,currentX:t,startY:l,currentY:l,altKey:h}),n.push(d.addDisposableListener(this.el,w.EventType.Change,m=>{M.isNumber(m.pageX)&&M.isNumber(m.pageY)&&this._onDidChange.fire({startX:t,currentX:m.pageX,startY:l,currentY:m.pageY,altKey:h})})),n.push(d.addDisposableListener(this.el,w.EventType.End,()=>{this._onDidEnd.fire(),b.dispose(n)}))}static onMouseEnter(i,n=!1){i.el.classList.contains("active")?(i.hoverDelayer.cancel(),i.el.classList.add("hover")):i.hoverDelayer.trigger(()=>i.el.classList.add("hover")),!n&&i.linkedSash&&u.onMouseEnter(i.linkedSash,!0)}static onMouseLeave(i,n=!1){i.hoverDelayer.cancel(),i.el.classList.remove("hover"),!n&&i.linkedSash&&u.onMouseLeave(i.linkedSash,!0)}layout(){if(this.orientation===0){const i=this.layoutProvider;this.el.style.left=i.getVerticalSashLeft(this)-this.size/2+"px",i.getVerticalSashTop&&(this.el.style.top=i.getVerticalSashTop(this)+"px"),i.getVerticalSashHeight&&(this.el.style.height=i.getVerticalSashHeight(this)+"px")}else{const i=this.layoutProvider;this.el.style.top=i.getHorizontalSashTop(this)-this.size/2+"px",i.getHorizontalSashLeft&&(this.el.style.left=i.getHorizontalSashLeft(this)+"px"),i.getHorizontalSashWidth&&(this.el.style.width=i.getHorizontalSashWidth(this)+"px")}}hide(){this.hidden=!0,this.el.style.display="none",this.el.setAttribute("aria-hidden","true")}getOrthogonalSash(i){if(!(!i.target||!(i.target instanceof HTMLElement))&&i.target.classList.contains("orthogonal-drag-handle"))return i.target.classList.contains("start")?this.orthogonalStartSash:this.orthogonalEndSash}dispose(){super.dispose(),this.el.remove()}}e.Sash=u}),define(Q[311],J([10]),{}),define(Q[61],J([0,1,7,30,50,288,289,52,15,6,2,17,121,35,311]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DomScrollableElement=e.SmoothScrollableElement=e.ScrollableElement=e.AbstractScrollableElement=e.MouseWheelClassifier=void 0;const a=500,u=50,r=!0;class i{constructor(v,y,L){this.timestamp=v,this.deltaX=y,this.deltaY=L,this.score=0}}class n{constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let v=1,y=0,L=1,I=this._rear;do{const k=I===this._front?v:Math.pow(2,-L);if(v-=k,y+=this._memory[I].score*k,I===this._front)break;I=(this._capacity+I-1)%this._capacity,L++}while(!0);return y<=.5}accept(v,y,L){const I=new i(v,y,L);I.score=this._computeScore(I),this._front===-1&&this._rear===-1?(this._memory[0]=I,this._front=0,this._rear=0):(this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=I)}_computeScore(v){if(Math.abs(v.deltaX)>0&&Math.abs(v.deltaY)>0)return 1;let y=.5;const L=this._front===-1&&this._rear===-1?null:this._memory[this._rear];return(!this._isAlmostInt(v.deltaX)||!this._isAlmostInt(v.deltaY))&&(y+=.25),Math.min(Math.max(y,0),1)}_isAlmostInt(v){return Math.abs(Math.round(v)-v)<.01}}e.MouseWheelClassifier=n,n.INSTANCE=new n;class t extends C.Widget{constructor(v,y,L){super();this._onScroll=this._register(new g.Emitter),this.onScroll=this._onScroll.event,this._onWillScroll=this._register(new g.Emitter),v.style.overflow="hidden",this._options=_(y),this._scrollable=L,this._register(this._scrollable.onScroll(k=>{this._onWillScroll.fire(k),this._onDidScroll(k),this._onScroll.fire(k)}));const I={onMouseWheel:k=>this._onMouseWheel(k),onDragStart:()=>this._onDragStart(),onDragEnd:()=>this._onDragEnd()};this._verticalScrollbar=this._register(new S.VerticalScrollbar(this._scrollable,this._options,I)),this._horizontalScrollbar=this._register(new w.HorizontalScrollbar(this._scrollable,this._options,I)),this._domNode=document.createElement("div"),this._domNode.className="monaco-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.style.overflow="hidden",this._domNode.appendChild(v),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=N.createFastDomNode(document.createElement("div")),this._leftShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=N.createFastDomNode(document.createElement("div")),this._topShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=N.createFastDomNode(document.createElement("div")),this._topLeftShadowDomNode.setClassName("shadow top-left-corner"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode||this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this.onmouseover(this._listenOnDomNode,k=>this._onMouseOver(k)),this.onnonbubblingmouseout(this._listenOnDomNode,k=>this._onMouseOut(k)),this._hideTimeout=this._register(new d.TimeoutTimer),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}dispose(){this._mouseWheelToDispose=p.dispose(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getOverviewRulerLayoutInfo(){return{parent:this._domNode,insertBefore:this._verticalScrollbar.domNode.domNode}}delegateVerticalScrollbarMouseDown(v){this._verticalScrollbar.delegateMouseDown(v)}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(v){this._scrollable.setScrollDimensions(v,!1)}updateClassName(v){this._options.className=v,c.isMacintosh&&(this._options.className+=" mac"),this._domNode.className="monaco-scrollable-element "+this._options.className}updateOptions(v){typeof v.handleMouseWheel!="undefined"&&(this._options.handleMouseWheel=v.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof v.mouseWheelScrollSensitivity!="undefined"&&(this._options.mouseWheelScrollSensitivity=v.mouseWheelScrollSensitivity),typeof v.fastScrollSensitivity!="undefined"&&(this._options.fastScrollSensitivity=v.fastScrollSensitivity),typeof v.scrollPredominantAxis!="undefined"&&(this._options.scrollPredominantAxis=v.scrollPredominantAxis),typeof v.horizontalScrollbarSize!="undefined"&&this._horizontalScrollbar.updateScrollbarSize(v.horizontalScrollbarSize),this._options.lazyRender||this._render()}_setListeningToMouseWheel(v){if(this._mouseWheelToDispose.length>0!==v&&(this._mouseWheelToDispose=p.dispose(this._mouseWheelToDispose),v)){const L=I=>{this._onMouseWheel(new M.StandardWheelEvent(I))};this._mouseWheelToDispose.push(b.addDisposableListener(this._listenOnDomNode,b.EventType.MOUSE_WHEEL,L,{passive:!1}))}}_onMouseWheel(v){const y=n.INSTANCE;if(r){const k=window.devicePixelRatio/s.getZoomFactor();c.isWindows||c.isLinux?y.accept(Date.now(),v.deltaX/k,v.deltaY/k):y.accept(Date.now(),v.deltaX,v.deltaY)}let L=!1;if(v.deltaY||v.deltaX){let k=v.deltaY*this._options.mouseWheelScrollSensitivity,E=v.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(Math.abs(k)>=Math.abs(E)?E=0:k=0),this._options.flipAxes&&([k,E]=[E,k]);const T=!c.isMacintosh&&v.browserEvent&&v.browserEvent.shiftKey;(this._options.scrollYToX||T)&&!E&&(E=k,k=0),v.browserEvent&&v.browserEvent.altKey&&(E=E*this._options.fastScrollSensitivity,k=k*this._options.fastScrollSensitivity);const O=this._scrollable.getFutureScrollPosition();let A={};if(k){const B=O.scrollTop-u*k;this._verticalScrollbar.writeScrollPosition(A,B)}if(E){const B=O.scrollLeft-u*E;this._horizontalScrollbar.writeScrollPosition(A,B)}A=this._scrollable.validateScrollPosition(A),(O.scrollLeft!==A.scrollLeft||O.scrollTop!==A.scrollTop)&&(r&&this._options.mouseWheelSmoothScroll&&y.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(A):this._scrollable.setScrollPositionNow(A),L=!0)}let I=L;!I&&this._options.alwaysConsumeMouseWheel&&(I=!0),!I&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(I=!0),I&&(v.preventDefault(),v.stopPropagation())}_onDidScroll(v){this._shouldRender=this._horizontalScrollbar.onDidScroll(v)||this._shouldRender,this._shouldRender=this._verticalScrollbar.onDidScroll(v)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(!!this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const v=this._scrollable.getCurrentScrollPosition(),y=v.scrollTop>0,L=v.scrollLeft>0;this._leftShadowDomNode.setClassName("shadow"+(L?" left":"")),this._topShadowDomNode.setClassName("shadow"+(y?" top":"")),this._topLeftShadowDomNode.setClassName("shadow top-left-corner"+(y?" top":"")+(L?" left":""))}}_onDragStart(){this._isDragging=!0,this._reveal()}_onDragEnd(){this._isDragging=!1,this._hide()}_onMouseOut(v){this._mouseIsOver=!1,this._hide()}_onMouseOver(v){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),a)}}e.AbstractScrollableElement=t;class l extends t{constructor(v,y){y=y||{},y.mouseWheelSmoothScroll=!1;const L=new o.Scrollable(0,I=>b.scheduleAtNextAnimationFrame(I));super(v,y,L);this._register(L)}setScrollPosition(v){this._scrollable.setScrollPositionNow(v)}}e.ScrollableElement=l;class h extends t{constructor(v,y,L){super(v,y,L)}setScrollPosition(v){v.reuseAnimation?this._scrollable.setScrollPositionSmooth(v,v.reuseAnimation):this._scrollable.setScrollPositionNow(v)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}}e.SmoothScrollableElement=h;class m extends l{constructor(v,y){super(v,y);this._element=v,this.onScroll(L=>{L.scrollTopChanged&&(this._element.scrollTop=L.scrollTop),L.scrollLeftChanged&&(this._element.scrollLeft=L.scrollLeft)}),this.scanDomNode()}scanDomNode(){this.setScrollDimensions({width:this._element.clientWidth,scrollWidth:this._element.scrollWidth,height:this._element.clientHeight,scrollHeight:this._element.scrollHeight}),this.setScrollPosition({scrollLeft:this._element.scrollLeft,scrollTop:this._element.scrollTop})}}e.DomScrollableElement=m;function _(f){const v={lazyRender:typeof f.lazyRender!="undefined"?f.lazyRender:!1,className:typeof f.className!="undefined"?f.className:"",useShadows:typeof f.useShadows!="undefined"?f.useShadows:!0,handleMouseWheel:typeof f.handleMouseWheel!="undefined"?f.handleMouseWheel:!0,flipAxes:typeof f.flipAxes!="undefined"?f.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof f.consumeMouseWheelIfScrollbarIsNeeded!="undefined"?f.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof f.alwaysConsumeMouseWheel!="undefined"?f.alwaysConsumeMouseWheel:!1,scrollYToX:typeof f.scrollYToX!="undefined"?f.scrollYToX:!1,mouseWheelScrollSensitivity:typeof f.mouseWheelScrollSensitivity!="undefined"?f.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof f.fastScrollSensitivity!="undefined"?f.fastScrollSensitivity:5,scrollPredominantAxis:typeof f.scrollPredominantAxis!="undefined"?f.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof f.mouseWheelSmoothScroll!="undefined"?f.mouseWheelSmoothScroll:!0,arrowSize:typeof f.arrowSize!="undefined"?f.arrowSize:11,listenOnDomNode:typeof f.listenOnDomNode!="undefined"?f.listenOnDomNode:null,horizontal:typeof f.horizontal!="undefined"?f.horizontal:1,horizontalScrollbarSize:typeof f.horizontalScrollbarSize!="undefined"?f.horizontalScrollbarSize:10,horizontalSliderSize:typeof f.horizontalSliderSize!="undefined"?f.horizontalSliderSize:0,horizontalHasArrows:typeof f.horizontalHasArrows!="undefined"?f.horizontalHasArrows:!1,vertical:typeof f.vertical!="undefined"?f.vertical:1,verticalScrollbarSize:typeof f.verticalScrollbarSize!="undefined"?f.verticalScrollbarSize:10,verticalHasArrows:typeof f.verticalHasArrows!="undefined"?f.verticalHasArrows:!1,verticalSliderSize:typeof f.verticalSliderSize!="undefined"?f.verticalSliderSize:0,scrollByPage:typeof f.scrollByPage!="undefined"?f.scrollByPage:!1};return v.horizontalSliderSize=typeof f.horizontalSliderSize!="undefined"?f.horizontalSliderSize:v.horizontalScrollbarSize,v.verticalSliderSize=typeof f.verticalSliderSize!="undefined"?f.verticalSliderSize:v.verticalScrollbarSize,c.isMacintosh&&(v.className+=" mac"),v}}),define(Q[209],J([0,1,7,2,61,303]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderHoverAction=e.HoverWidget=void 0;const w=b.$;class S extends N.Disposable{constructor(){super();this.containerDomNode=document.createElement("div"),this.containerDomNode.className="monaco-hover",this.containerDomNode.tabIndex=0,this.containerDomNode.setAttribute("role","tooltip"),this.contentsDomNode=document.createElement("div"),this.contentsDomNode.className="monaco-hover-content",this._scrollbar=this._register(new M.DomScrollableElement(this.contentsDomNode,{consumeMouseWheelIfScrollbarIsNeeded:!0})),this.containerDomNode.appendChild(this._scrollbar.getDomNode())}onContentsChanged(){this._scrollbar.scanDomNode()}}e.HoverWidget=S;function C(d,g,p){const c=b.append(d,w("div.action-container")),o=b.append(c,w("a.action"));o.setAttribute("href","#"),o.setAttribute("role","button"),g.iconClass&&b.append(o,w(`span.icon.${g.iconClass}`));const s=b.append(o,w("span"));return s.textContent=p?`${g.label} (${p})`:g.label,b.addDisposableListener(c,b.EventType.CLICK,a=>{a.stopPropagation(),a.preventDefault(),g.run(c)})}e.renderHoverAction=C}),define(Q[161],J([0,1,40,2,60,6,55,61,121,281,287,99,120,19,149,15,35,7]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ListView=e.NativeDragAndDropData=e.ExternalElementsDragAndDropData=e.ElementsDragAndDropData=void 0;const n={useShadows:!0,verticalScrollMode:1,setRowLineHeight:!0,setRowHeight:!0,supportDynamicHeights:!1,dnd:{getDragElements(v){return[v]},getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){}},horizontalScrolling:!1,transformOptimization:!0,alwaysConsumeMouseWheel:!0};class t{constructor(y){this.elements=y}update(){}getData(){return this.elements}}e.ElementsDragAndDropData=t;class l{constructor(y){this.elements=y}update(){}getData(){return this.elements}}e.ExternalElementsDragAndDropData=l;class h{constructor(){this.types=[],this.files=[]}update(y){if(y.types&&this.types.splice(0,this.types.length,...y.types),y.files){this.files.splice(0,this.files.length);for(let L=0;Lk,(y==null?void 0:y.getPosInSet)?this.getPosInSet=y.getPosInSet.bind(y):this.getPosInSet=(L,I)=>I+1,(y==null?void 0:y.getRole)?this.getRole=y.getRole.bind(y):this.getRole=L=>"listitem",(y==null?void 0:y.isChecked)?this.isChecked=y.isChecked.bind(y):this.isChecked=L=>{}}}class f{constructor(y,L,I,k=n){if(this.virtualDelegate=L,this.domId=`list_id_${++f.InstanceCount}`,this.renderers=new Map,this.renderWidth=0,this._scrollHeight=0,this.scrollableElementUpdateDisposable=null,this.scrollableElementWidthDelayer=new u.Delayer(50),this.splicing=!1,this.dragOverAnimationStopDisposable=N.Disposable.None,this.dragOverMouseY=0,this.canDrop=!1,this.currentDragFeedbackDisposable=N.Disposable.None,this.onDragLeaveTimeout=N.Disposable.None,this.disposables=new N.DisposableStore,this._onDidChangeContentHeight=new w.Emitter,this._horizontalScrolling=!1,k.horizontalScrolling&&k.supportDynamicHeights)throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously");this.items=[],this.itemId=0,this.rangeMap=new g.RangeMap;for(const T of I)this.renderers.set(T.templateId,T);this.cache=this.disposables.add(new p.RowCache(this.renderers)),this.lastRenderTop=0,this.lastRenderHeight=0,this.domNode=document.createElement("div"),this.domNode.className="monaco-list",this.domNode.classList.add(this.domId),this.domNode.tabIndex=0,this.domNode.classList.toggle("mouse-support",typeof k.mouseSupport=="boolean"?k.mouseSupport:!0),this._horizontalScrolling=b.getOrDefault(k,T=>T.horizontalScrolling,n.horizontalScrolling),this.domNode.classList.toggle("horizontal-scrolling",this._horizontalScrolling),this.additionalScrollHeight=typeof k.additionalScrollHeight=="undefined"?0:k.additionalScrollHeight,this.accessibilityProvider=new _(k.accessibilityProvider),this.rowsContainer=document.createElement("div"),this.rowsContainer.className="monaco-list-rows",b.getOrDefault(k,T=>T.transformOptimization,n.transformOptimization)&&(this.rowsContainer.style.transform="translate3d(0px, 0px, 0px)"),this.disposables.add(M.Gesture.addTarget(this.rowsContainer)),this.scrollable=new d.Scrollable(b.getOrDefault(k,T=>T.smoothScrolling,!1)?125:0,T=>i.scheduleAtNextAnimationFrame(T)),this.scrollableElement=this.disposables.add(new C.SmoothScrollableElement(this.rowsContainer,{alwaysConsumeMouseWheel:b.getOrDefault(k,T=>T.alwaysConsumeMouseWheel,n.alwaysConsumeMouseWheel),horizontal:1,vertical:b.getOrDefault(k,T=>T.verticalScrollMode,n.verticalScrollMode),useShadows:b.getOrDefault(k,T=>T.useShadows,n.useShadows)},this.scrollable)),this.domNode.appendChild(this.scrollableElement.getDomNode()),y.appendChild(this.domNode),this.scrollableElement.onScroll(this.onScroll,this,this.disposables),S.domEvent(this.rowsContainer,M.EventType.Change)(this.onTouchChange,this,this.disposables),S.domEvent(this.scrollableElement.getDomNode(),"scroll")(T=>T.target.scrollTop=0,null,this.disposables),w.Event.map(S.domEvent(this.domNode,"dragover"),T=>this.toDragEvent(T))(this.onDragOver,this,this.disposables),w.Event.map(S.domEvent(this.domNode,"drop"),T=>this.toDragEvent(T))(this.onDrop,this,this.disposables),S.domEvent(this.domNode,"dragleave")(this.onDragLeave,this,this.disposables),S.domEvent(window,"dragend")(this.onDragEnd,this,this.disposables),this.setRowLineHeight=b.getOrDefault(k,T=>T.setRowLineHeight,n.setRowLineHeight),this.setRowHeight=b.getOrDefault(k,T=>T.setRowHeight,n.setRowHeight),this.supportDynamicHeights=b.getOrDefault(k,T=>T.supportDynamicHeights,n.supportDynamicHeights),this.dnd=b.getOrDefault(k,T=>T.dnd,n.dnd),this.layout()}get contentHeight(){return this.rangeMap.size}get horizontalScrolling(){return this._horizontalScrolling}set horizontalScrolling(y){if(y!==this._horizontalScrolling){if(y&&this.supportDynamicHeights)throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously");if(this._horizontalScrolling=y,this.domNode.classList.toggle("horizontal-scrolling",this._horizontalScrolling),this._horizontalScrolling){for(const L of this.items)this.measureItemWidth(L);this.updateScrollWidth(),this.scrollableElement.setScrollDimensions({width:i.getContentWidth(this.domNode)}),this.rowsContainer.style.width=`${Math.max(this.scrollWidth||0,this.renderWidth)}px`}else this.scrollableElementWidthDelayer.cancel(),this.scrollableElement.setScrollDimensions({width:this.renderWidth,scrollWidth:this.renderWidth}),this.rowsContainer.style.width=""}}updateOptions(y){y.additionalScrollHeight!==void 0&&(this.additionalScrollHeight=y.additionalScrollHeight),y.smoothScrolling!==void 0&&this.scrollable.setSmoothScrollDuration(y.smoothScrolling?125:0),y.horizontalScrolling!==void 0&&(this.horizontalScrolling=y.horizontalScrolling)}splice(y,L,I=[]){if(this.splicing)throw new Error("Can't run recursive splices.");this.splicing=!0;try{return this._splice(y,L,I)}finally{this.splicing=!1,this._onDidChangeContentHeight.fire(this.contentHeight)}}_splice(y,L,I=[]){const k=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),E={start:y,end:y+L},T=o.Range.intersect(k,E),O=new Map;for(let z=T.start;z({id:String(this.itemId++),element:z,templateId:this.virtualDelegate.getTemplateId(z),size:this.virtualDelegate.getHeight(z),width:void 0,hasDynamicHeight:!!this.virtualDelegate.hasDynamicHeight&&this.virtualDelegate.hasDynamicHeight(z),lastDynamicHeightWidth:void 0,row:null,uri:void 0,dropTarget:!1,dragStartDisposable:N.Disposable.None}));let R;y===0&&L>=this.items.length?(this.rangeMap=new g.RangeMap,this.rangeMap.splice(0,0,D),R=this.items,this.items=D):(this.rangeMap.splice(y,L,D),R=this.items.splice(y,L,...D));const W=I.length-L,x=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),K=g.shift(B,W),Y=o.Range.intersect(x,K);for(let z=Y.start;zg.shift(z,W)),le=[{start:y,end:y+I.length},...se].map(z=>o.Range.intersect(x,z)),X=this.getNextToLastElement(le);for(const z of le)for(let P=z.start;Pz.element)}eventuallyUpdateScrollDimensions(){this._scrollHeight=this.contentHeight,this.rowsContainer.style.height=`${this._scrollHeight}px`,this.scrollableElementUpdateDisposable||(this.scrollableElementUpdateDisposable=i.scheduleAtNextAnimationFrame(()=>{this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight}),this.updateScrollWidth(),this.scrollableElementUpdateDisposable=null}))}eventuallyUpdateScrollWidth(){if(!this.horizontalScrolling){this.scrollableElementWidthDelayer.cancel();return}this.scrollableElementWidthDelayer.trigger(()=>this.updateScrollWidth())}updateScrollWidth(){if(!!this.horizontalScrolling){let y=0;for(const L of this.items)typeof L.width!="undefined"&&(y=Math.max(y,L.width));this.scrollWidth=y,this.scrollableElement.setScrollDimensions({scrollWidth:y===0?0:y+10})}}rerender(){if(!!this.supportDynamicHeights){for(const y of this.items)y.lastDynamicHeightWidth=void 0;this._rerender(this.lastRenderTop,this.lastRenderHeight)}}get length(){return this.items.length}get renderHeight(){return this.scrollableElement.getScrollDimensions().height}element(y){return this.items[y].element}domElement(y){const L=this.items[y].row;return L&&L.domNode}elementHeight(y){return this.items[y].size}elementTop(y){return this.rangeMap.positionAt(y)}indexAt(y){return this.rangeMap.indexAt(y)}indexAfter(y){return this.rangeMap.indexAfter(y)}layout(y,L){let I={height:typeof y=="number"?y:i.getContentHeight(this.domNode)};this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,I.scrollHeight=this.scrollHeight),this.scrollableElement.setScrollDimensions(I),typeof L!="undefined"&&(this.renderWidth=L,this.supportDynamicHeights&&this._rerender(this.scrollTop,this.renderHeight),this.horizontalScrolling&&this.scrollableElement.setScrollDimensions({width:typeof L=="number"?L:i.getContentWidth(this.domNode)}))}render(y,L,I,k,E,T=!1){const O=this.getRenderRange(L,I),A=o.Range.relativeComplement(O,y),B=o.Range.relativeComplement(y,O),F=this.getNextToLastElement(A);if(T){const D=o.Range.intersect(y,O);for(let R=D.start;Rthis.onDragStart(k.element,A,F))}this.horizontalScrolling&&(this.measureItemWidth(k),this.eventuallyUpdateScrollWidth())}measureItemWidth(y){if(!(!y.row||!y.row.domNode)){y.row.domNode.style.width=r.isFirefox?"-moz-fit-content":"fit-content",y.width=i.getContentWidth(y.row.domNode);const L=window.getComputedStyle(y.row.domNode);L.paddingLeft&&(y.width+=parseFloat(L.paddingLeft)),L.paddingRight&&(y.width+=parseFloat(L.paddingRight)),y.row.domNode.style.width=""}}updateItemInDOM(y,L){y.row.domNode.style.top=`${this.elementTop(L)}px`,this.setRowHeight&&(y.row.domNode.style.height=`${y.size}px`),this.setRowLineHeight&&(y.row.domNode.style.lineHeight=`${y.size}px`),y.row.domNode.setAttribute("data-index",`${L}`),y.row.domNode.setAttribute("data-last-element",L===this.length-1?"true":"false"),y.row.domNode.setAttribute("aria-setsize",String(this.accessibilityProvider.getSetSize(y.element,L,this.length))),y.row.domNode.setAttribute("aria-posinset",String(this.accessibilityProvider.getPosInSet(y.element,L))),y.row.domNode.setAttribute("id",this.getElementDomId(L)),y.row.domNode.classList.toggle("drop-target",y.dropTarget)}removeItemFromDOM(y){const L=this.items[y];if(L.dragStartDisposable.dispose(),L.row){const I=this.renderers.get(L.templateId);I&&I.disposeElement&&I.disposeElement(L.element,y,L.row.templateData,L.size),this.cache.release(L.row),L.row=null}this.horizontalScrolling&&this.eventuallyUpdateScrollWidth()}getScrollTop(){return this.scrollableElement.getScrollPosition().scrollTop}setScrollTop(y,L){this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight})),this.scrollableElement.setScrollPosition({scrollTop:y,reuseAnimation:L})}get scrollTop(){return this.getScrollTop()}set scrollTop(y){this.setScrollTop(y)}get scrollHeight(){return this._scrollHeight+(this.horizontalScrolling?10:0)+this.additionalScrollHeight}get onMouseClick(){return w.Event.map(S.domEvent(this.domNode,"click"),y=>this.toMouseEvent(y))}get onMouseDblClick(){return w.Event.map(S.domEvent(this.domNode,"dblclick"),y=>this.toMouseEvent(y))}get onMouseMiddleClick(){return w.Event.filter(w.Event.map(S.domEvent(this.domNode,"auxclick"),y=>this.toMouseEvent(y)),y=>y.browserEvent.button===1)}get onMouseDown(){return w.Event.map(S.domEvent(this.domNode,"mousedown"),y=>this.toMouseEvent(y))}get onContextMenu(){return w.Event.map(S.domEvent(this.domNode,"contextmenu"),y=>this.toMouseEvent(y))}get onTouchStart(){return w.Event.map(S.domEvent(this.domNode,"touchstart"),y=>this.toTouchEvent(y))}get onTap(){return w.Event.map(S.domEvent(this.rowsContainer,M.EventType.Tap),y=>this.toGestureEvent(y))}toMouseEvent(y){const L=this.getItemIndexFromEventTarget(y.target||null),I=typeof L=="undefined"?void 0:this.items[L],k=I&&I.element;return{browserEvent:y,index:L,element:k}}toTouchEvent(y){const L=this.getItemIndexFromEventTarget(y.target||null),I=typeof L=="undefined"?void 0:this.items[L],k=I&&I.element;return{browserEvent:y,index:L,element:k}}toGestureEvent(y){const L=this.getItemIndexFromEventTarget(y.initialTarget||null),I=typeof L=="undefined"?void 0:this.items[L],k=I&&I.element;return{browserEvent:y,index:L,element:k}}toDragEvent(y){const L=this.getItemIndexFromEventTarget(y.target||null),I=typeof L=="undefined"?void 0:this.items[L],k=I&&I.element;return{browserEvent:y,index:L,element:k}}onScroll(y){try{const L=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight);this.render(L,y.scrollTop,y.height,y.scrollLeft,y.scrollWidth),this.supportDynamicHeights&&this._rerender(y.scrollTop,y.height,y.inSmoothScrolling)}catch(L){throw console.error("Got bad scroll event:",y),L}}onTouchChange(y){y.preventDefault(),y.stopPropagation(),this.scrollTop-=y.translationY}onDragStart(y,L,I){if(!!I.dataTransfer){const k=this.dnd.getDragElements(y);if(I.dataTransfer.effectAllowed="copyMove",I.dataTransfer.setData(a.DataTransfers.RESOURCES,JSON.stringify([L])),I.dataTransfer.setDragImage){let E;this.dnd.getDragLabel&&(E=this.dnd.getDragLabel(k,I)),typeof E=="undefined"&&(E=String(k.length));const T=i.$(".monaco-drag-image");T.textContent=E,document.body.appendChild(T),I.dataTransfer.setDragImage(T,-10,-10),setTimeout(()=>document.body.removeChild(T),0)}this.currentDragData=new t(k),a.StaticDND.CurrentDragAndDropData=new l(k),this.dnd.onDragStart&&this.dnd.onDragStart(this.currentDragData,I)}}onDragOver(y){if(y.browserEvent.preventDefault(),this.onDragLeaveTimeout.dispose(),a.StaticDND.CurrentDragAndDropData&&a.StaticDND.CurrentDragAndDropData.getData()==="vscode-ui"||(this.setupDragAndDropScrollTopAnimation(y.browserEvent),!y.browserEvent.dataTransfer))return!1;if(!this.currentDragData)if(a.StaticDND.CurrentDragAndDropData)this.currentDragData=a.StaticDND.CurrentDragAndDropData;else{if(!y.browserEvent.dataTransfer.types)return!1;this.currentDragData=new h}const L=this.dnd.onDragOver(this.currentDragData,y.element,y.index,y.browserEvent);if(this.canDrop=typeof L=="boolean"?L:L.accept,!this.canDrop)return this.currentDragFeedback=void 0,this.currentDragFeedbackDisposable.dispose(),!1;y.browserEvent.dataTransfer.dropEffect=typeof L!="boolean"&&L.effect===0?"copy":"move";let I;if(typeof L!="boolean"&&L.feedback?I=L.feedback:typeof y.index=="undefined"?I=[-1]:I=[y.index],I=s.distinct(I).filter(k=>k>=-1&&kk-E),I=I[0]===-1?[-1]:I,m(this.currentDragFeedback,I))return!0;if(this.currentDragFeedback=I,this.currentDragFeedbackDisposable.dispose(),I[0]===-1)this.domNode.classList.add("drop-target"),this.rowsContainer.classList.add("drop-target"),this.currentDragFeedbackDisposable=N.toDisposable(()=>{this.domNode.classList.remove("drop-target"),this.rowsContainer.classList.remove("drop-target")});else{for(const k of I){const E=this.items[k];E.dropTarget=!0,E.row&&E.row.domNode.classList.add("drop-target")}this.currentDragFeedbackDisposable=N.toDisposable(()=>{for(const k of I){const E=this.items[k];E.dropTarget=!1,E.row&&E.row.domNode.classList.remove("drop-target")}})}return!0}onDragLeave(){this.onDragLeaveTimeout.dispose(),this.onDragLeaveTimeout=u.disposableTimeout(()=>this.clearDragOverFeedback(),100)}onDrop(y){if(!!this.canDrop){const L=this.currentDragData;this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.currentDragData=void 0,a.StaticDND.CurrentDragAndDropData=void 0,!(!L||!y.browserEvent.dataTransfer)&&(y.browserEvent.preventDefault(),L.update(y.browserEvent.dataTransfer),this.dnd.drop(L,y.element,y.index,y.browserEvent))}}onDragEnd(y){this.canDrop=!1,this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.currentDragData=void 0,a.StaticDND.CurrentDragAndDropData=void 0,this.dnd.onDragEnd&&this.dnd.onDragEnd(y)}clearDragOverFeedback(){this.currentDragFeedback=void 0,this.currentDragFeedbackDisposable.dispose(),this.currentDragFeedbackDisposable=N.Disposable.None}setupDragAndDropScrollTopAnimation(y){if(!this.dragOverAnimationDisposable){const L=i.getTopLeftOffset(this.domNode).top;this.dragOverAnimationDisposable=i.animate(this.animateDragAndDropScrollTop.bind(this,L))}this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationStopDisposable=u.disposableTimeout(()=>{this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)},1e3),this.dragOverMouseY=y.pageY}animateDragAndDropScrollTop(y){if(this.dragOverMouseY!==void 0){const L=this.dragOverMouseY-y,I=this.renderHeight-35;L<35?this.scrollTop+=Math.max(-14,Math.floor(.3*(L-35))):L>I&&(this.scrollTop+=Math.min(14,Math.floor(.3*(L-I))))}}teardownDragAndDropScrollTopAnimation(){this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)}getItemIndexFromEventTarget(y){const L=this.scrollableElement.getDomNode();let I=y;for(;I instanceof HTMLElement&&I!==this.rowsContainer&&L.contains(I);){const k=I.getAttribute("data-index");if(k){const E=Number(k);if(!isNaN(E))return E}I=I.parentElement}}getRenderRange(y,L){return{start:this.rangeMap.indexAt(y),end:this.rangeMap.indexAfter(y+L-1)}}_rerender(y,L,I){const k=this.getRenderRange(y,L);let E,T;y===this.elementTop(k.start)?(E=k.start,T=0):k.end-k.start>1&&(E=k.start+1,T=this.elementTop(E)-y);let O=0;for(;;){const A=this.getRenderRange(y,L);let B=!1;for(let F=A.start;FH.templateData===V);if(U>=0){const H=this.renderedElements[U];this.trait.unrender(V),H.index=P}else{const H={index:P,templateData:V};this.renderedElements.push(H)}this.trait.renderIndex(P,V)}splice(z,P,V){const U=[];for(const H of this.renderedElements)H.index=z+P&&U.push({index:H.index+V-P,templateData:H.templateData});this.renderedElements=U}renderIndexes(z){for(const{index:P,templateData:V}of this.renderedElements)z.indexOf(P)>-1&&this.trait.renderIndex(P,V)}disposeTemplate(z){const P=this.renderedElements.findIndex(V=>V.templateData===z);P<0||this.renderedElements.splice(P,1)}}class h{constructor(z){this._trait=z,this.indexes=[],this.sortedIndexes=[],this._onChange=new g.Emitter,this.onChange=this._onChange.event}get trait(){return this._trait}get renderer(){return new l(this)}splice(z,P,V){const U=V.length-P,H=z+P,$=[...this.sortedIndexes.filter(ie=>ieie?oe+z:-1).filter(ie=>ie!==-1),...this.sortedIndexes.filter(ie=>ie>=H).map(ie=>ie+U)];this.renderer.splice(z,P,V.length),this._set($,$)}renderIndex(z,P){P.classList.toggle(this._trait,this.contains(z))}unrender(z){z.classList.remove(this._trait)}set(z,P){return this._set(z,[...z].sort(Y),P)}_set(z,P,V){const U=this.indexes,H=this.sortedIndexes;this.indexes=z,this.sortedIndexes=P;const $=x(H,z);return this.renderer.renderIndexes($),this._onChange.fire({indexes:z,browserEvent:V}),U}get(){return this.indexes}contains(z){return M.binarySearch(this.sortedIndexes,z,Y)>=0}dispose(){b.dispose(this._onChange)}}Me([w.memoize],h.prototype,"renderer",null);class m extends h{constructor(z){super("selected");this.setAriaSelected=z}renderIndex(z,P){super.renderIndex(z,P),this.setAriaSelected&&(this.contains(z)?P.setAttribute("aria-selected","true"):P.setAttribute("aria-selected","false"))}}class _{constructor(z,P,V){this.trait=z,this.view=P,this.identityProvider=V}splice(z,P,V){if(!this.identityProvider)return this.trait.splice(z,P,V.map(()=>!1));const U=this.trait.get().map($=>this.identityProvider.getId(this.view.element($)).toString()),H=V.map($=>U.indexOf(this.identityProvider.getId($).toString())>-1);this.trait.splice(z,P,H)}}function f(X){return X.tagName==="INPUT"||X.tagName==="TEXTAREA"}e.isInputElement=f;function v(X){return X.classList.contains("monaco-editor")?!0:X.classList.contains("monaco-list")||!X.parentElement?!1:v(X.parentElement)}e.isMonacoEditor=v;class y{constructor(z,P,V){this.list=z,this.view=P,this.disposables=new b.DisposableStore;const U=V.multipleSelectionSupport!==!1,H=g.Event.chain(p.domEvent(P.domNode,"keydown")).filter($=>!f($.target)).map($=>new d.StandardKeyboardEvent($));H.filter($=>$.keyCode===3).on(this.onEnter,this,this.disposables),H.filter($=>$.keyCode===16).on(this.onUpArrow,this,this.disposables),H.filter($=>$.keyCode===18).on(this.onDownArrow,this,this.disposables),H.filter($=>$.keyCode===11).on(this.onPageUpArrow,this,this.disposables),H.filter($=>$.keyCode===12).on(this.onPageDownArrow,this,this.disposables),H.filter($=>$.keyCode===9).on(this.onEscape,this,this.disposables),U&&H.filter($=>(S.isMacintosh?$.metaKey:$.ctrlKey)&&$.keyCode===31).on(this.onCtrlA,this,this.disposables)}onEnter(z){z.preventDefault(),z.stopPropagation(),this.list.setSelection(this.list.getFocus(),z.browserEvent)}onUpArrow(z){z.preventDefault(),z.stopPropagation(),this.list.focusPrevious(1,!1,z.browserEvent),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()}onDownArrow(z){z.preventDefault(),z.stopPropagation(),this.list.focusNext(1,!1,z.browserEvent),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()}onPageUpArrow(z){z.preventDefault(),z.stopPropagation(),this.list.focusPreviousPage(z.browserEvent),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()}onPageDownArrow(z){z.preventDefault(),z.stopPropagation(),this.list.focusNextPage(z.browserEvent),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()}onCtrlA(z){z.preventDefault(),z.stopPropagation(),this.list.setSelection(M.range(this.list.length),z.browserEvent),this.view.domNode.focus()}onEscape(z){this.list.getSelection().length&&(z.preventDefault(),z.stopPropagation(),this.list.setSelection([],z.browserEvent),this.view.domNode.focus())}dispose(){this.disposables.dispose()}}var L;(function(X){X[X.Idle=0]="Idle",X[X.Typing=1]="Typing"})(L||(L={})),e.DefaultKeyboardNavigationDelegate=new class{mightProducePrintableCharacter(X){return X.ctrlKey||X.metaKey||X.altKey?!1:X.keyCode>=31&&X.keyCode<=56||X.keyCode>=21&&X.keyCode<=30||X.keyCode>=93&&X.keyCode<=102||X.keyCode>=80&&X.keyCode<=90}};class I{constructor(z,P,V,U){this.list=z,this.view=P,this.keyboardNavigationLabelProvider=V,this.delegate=U,this.enabled=!1,this.state=L.Idle,this.automaticKeyboardNavigation=!0,this.triggered=!1,this.previouslyFocused=-1,this.enabledDisposables=new b.DisposableStore,this.disposables=new b.DisposableStore,this.updateOptions(z.options)}updateOptions(z){(typeof z.enableKeyboardNavigation=="undefined"?!0:!!z.enableKeyboardNavigation)?this.enable():this.disable(),typeof z.automaticKeyboardNavigation!="undefined"&&(this.automaticKeyboardNavigation=z.automaticKeyboardNavigation)}enable(){if(!this.enabled){const z=g.Event.chain(p.domEvent(this.view.domNode,"keydown")).filter(U=>!f(U.target)).filter(()=>this.automaticKeyboardNavigation||this.triggered).map(U=>new d.StandardKeyboardEvent(U)).filter(U=>this.delegate.mightProducePrintableCharacter(U)).forEach(U=>{U.stopPropagation(),U.preventDefault()}).map(U=>U.browserEvent.key).event,P=g.Event.debounce(z,()=>null,800);g.Event.reduce(g.Event.any(z,P),(U,H)=>H===null?null:(U||"")+H)(this.onInput,this,this.enabledDisposables),P(this.onClear,this,this.enabledDisposables),this.enabled=!0,this.triggered=!1}}disable(){!this.enabled||(this.enabledDisposables.clear(),this.enabled=!1,this.triggered=!1)}onClear(){var z;const P=this.list.getFocus();if(P.length>0&&P[0]===this.previouslyFocused){const V=(z=this.list.options.accessibilityProvider)===null||z===void 0?void 0:z.getAriaLabel(this.list.element(P[0]));V&&n.alert(V)}this.previouslyFocused=-1}onInput(z){if(!z){this.state=L.Idle,this.triggered=!1;return}const P=this.list.getFocus(),V=P.length>0?P[0]:0,U=this.state===L.Idle?1:0;this.state=L.Typing;for(let H=0;H!f(U.target)).map(U=>new d.StandardKeyboardEvent(U)).filter(U=>U.keyCode===2&&!U.ctrlKey&&!U.metaKey&&!U.shiftKey&&!U.altKey).on(this.onTab,this,this.disposables)}onTab(z){if(z.target===this.view.domNode){const P=this.list.getFocus();if(P.length!==0){const V=this.view.domElement(P[0]);if(!!V){const U=V.querySelector("[tabIndex]");if(!(!U||!(U instanceof HTMLElement)||U.tabIndex===-1)){const H=window.getComputedStyle(U);H.visibility==="hidden"||H.display==="none"||(z.preventDefault(),z.stopPropagation(),U.focus())}}}}}dispose(){this.disposables.dispose()}}function E(X){return S.isMacintosh?X.browserEvent.metaKey:X.browserEvent.ctrlKey}e.isSelectionSingleChangeEvent=E;function T(X){return X.browserEvent.shiftKey}e.isSelectionRangeChangeEvent=T;function O(X){return X instanceof MouseEvent&&X.button===2}const A={isSelectionSingleChangeEvent:E,isSelectionRangeChangeEvent:T};class B{constructor(z){this.list=z,this.disposables=new b.DisposableStore,this._onPointer=new g.Emitter,this.onPointer=this._onPointer.event,this.multipleSelectionSupport=z.options.multipleSelectionSupport!==!1,this.multipleSelectionSupport&&(this.multipleSelectionController=z.options.multipleSelectionController||A),this.mouseSupport=typeof z.options.mouseSupport=="undefined"||!!z.options.mouseSupport,this.mouseSupport&&(z.onMouseDown(this.onMouseDown,this,this.disposables),z.onContextMenu(this.onContextMenu,this,this.disposables),z.onMouseDblClick(this.onDoubleClick,this,this.disposables),z.onTouchStart(this.onMouseDown,this,this.disposables),this.disposables.add(C.Gesture.addTarget(z.getHTMLElement()))),g.Event.any(z.onMouseClick,z.onMouseMiddleClick,z.onTap)(this.onViewPointer,this,this.disposables)}isSelectionSingleChangeEvent(z){return this.multipleSelectionController?this.multipleSelectionController.isSelectionSingleChangeEvent(z):S.isMacintosh?z.browserEvent.metaKey:z.browserEvent.ctrlKey}isSelectionRangeChangeEvent(z){return this.multipleSelectionController?this.multipleSelectionController.isSelectionRangeChangeEvent(z):z.browserEvent.shiftKey}isSelectionChangeEvent(z){return this.isSelectionSingleChangeEvent(z)||this.isSelectionRangeChangeEvent(z)}onMouseDown(z){v(z.browserEvent.target)||document.activeElement!==z.browserEvent.target&&this.list.domFocus()}onContextMenu(z){if(!v(z.browserEvent.target)){const P=typeof z.index=="undefined"?[]:[z.index];this.list.setFocus(P,z.browserEvent)}}onViewPointer(z){if(!!this.mouseSupport&&!(f(z.browserEvent.target)||v(z.browserEvent.target))){let P=this.list.getFocus()[0];const V=this.list.getSelection();P=P===void 0?V[0]:P;const U=z.index;if(typeof U=="undefined"){this.list.setFocus([],z.browserEvent),this.list.setSelection([],z.browserEvent);return}if(this.multipleSelectionSupport&&this.isSelectionRangeChangeEvent(z))return this.changeSelection(z,P);if(this.multipleSelectionSupport&&this.isSelectionChangeEvent(z))return this.changeSelection(z,P);this.list.setFocus([U],z.browserEvent),O(z.browserEvent)||this.list.setSelection([U],z.browserEvent),this._onPointer.fire(z)}}onDoubleClick(z){if(!(f(z.browserEvent.target)||v(z.browserEvent.target))&&!(this.multipleSelectionSupport&&this.isSelectionChangeEvent(z))){const P=this.list.getFocus();this.list.setSelection(P,z.browserEvent)}}changeSelection(z,P){const V=z.index;if(this.isSelectionRangeChangeEvent(z)&&P!==void 0){const U=Math.min(P,V),H=Math.max(P,V),$=M.range(U,H+1),ie=this.list.getSelection(),oe=W(x(ie,[P]),P);if(oe.length===0)return;const ae=x($,K(ie,oe));this.list.setSelection(ae,z.browserEvent)}else if(this.isSelectionSingleChangeEvent(z)){const U=this.list.getSelection(),H=U.filter($=>$!==V);this.list.setFocus([V]),U.length===H.length?this.list.setSelection([...H,V],z.browserEvent):this.list.setSelection(H,z.browserEvent)}}dispose(){this.disposables.dispose()}}e.MouseController=B;class F{constructor(z,P){this.styleElement=z,this.selectorSuffix=P}style(z){const P=this.selectorSuffix&&`.${this.selectorSuffix}`,V=[];z.listBackground&&(z.listBackground.isOpaque()?V.push(`.monaco-list${P} .monaco-list-rows { background: ${z.listBackground}; }`):S.isMacintosh||console.warn(`List with id '${this.selectorSuffix}' was styled with a non-opaque background color. This will break sub-pixel antialiasing.`)),z.listFocusBackground&&(V.push(`.monaco-list${P}:focus .monaco-list-row.focused { background-color: ${z.listFocusBackground}; }`),V.push(`.monaco-list${P}:focus .monaco-list-row.focused:hover { background-color: ${z.listFocusBackground}; }`)),z.listFocusForeground&&V.push(`.monaco-list${P}:focus .monaco-list-row.focused { color: ${z.listFocusForeground}; }`),z.listActiveSelectionBackground&&(V.push(`.monaco-list${P}:focus .monaco-list-row.selected { background-color: ${z.listActiveSelectionBackground}; }`),V.push(`.monaco-list${P}:focus .monaco-list-row.selected:hover { background-color: ${z.listActiveSelectionBackground}; }`)),z.listActiveSelectionForeground&&V.push(`.monaco-list${P}:focus .monaco-list-row.selected { color: ${z.listActiveSelectionForeground}; }`),z.listFocusAndSelectionBackground&&V.push(` + .monaco-drag-image, + .monaco-list${P}:focus .monaco-list-row.selected.focused { background-color: ${z.listFocusAndSelectionBackground}; } + `),z.listFocusAndSelectionForeground&&V.push(` + .monaco-drag-image, + .monaco-list${P}:focus .monaco-list-row.selected.focused { color: ${z.listFocusAndSelectionForeground}; } + `),z.listInactiveFocusForeground&&(V.push(`.monaco-list${P} .monaco-list-row.focused { color: ${z.listInactiveFocusForeground}; }`),V.push(`.monaco-list${P} .monaco-list-row.focused:hover { color: ${z.listInactiveFocusForeground}; }`)),z.listInactiveFocusBackground&&(V.push(`.monaco-list${P} .monaco-list-row.focused { background-color: ${z.listInactiveFocusBackground}; }`),V.push(`.monaco-list${P} .monaco-list-row.focused:hover { background-color: ${z.listInactiveFocusBackground}; }`)),z.listInactiveSelectionBackground&&(V.push(`.monaco-list${P} .monaco-list-row.selected { background-color: ${z.listInactiveSelectionBackground}; }`),V.push(`.monaco-list${P} .monaco-list-row.selected:hover { background-color: ${z.listInactiveSelectionBackground}; }`)),z.listInactiveSelectionForeground&&V.push(`.monaco-list${P} .monaco-list-row.selected { color: ${z.listInactiveSelectionForeground}; }`),z.listHoverBackground&&V.push(`.monaco-list${P}:not(.drop-target) .monaco-list-row:hover:not(.selected):not(.focused) { background-color: ${z.listHoverBackground}; }`),z.listHoverForeground&&V.push(`.monaco-list${P} .monaco-list-row:hover:not(.selected):not(.focused) { color: ${z.listHoverForeground}; }`),z.listSelectionOutline&&V.push(`.monaco-list${P} .monaco-list-row.selected { outline: 1px dotted ${z.listSelectionOutline}; outline-offset: -1px; }`),z.listFocusOutline&&V.push(` + .monaco-drag-image, + .monaco-list${P}:focus .monaco-list-row.focused { outline: 1px solid ${z.listFocusOutline}; outline-offset: -1px; } + `),z.listInactiveFocusOutline&&V.push(`.monaco-list${P} .monaco-list-row.focused { outline: 1px dotted ${z.listInactiveFocusOutline}; outline-offset: -1px; }`),z.listHoverOutline&&V.push(`.monaco-list${P} .monaco-list-row:hover { outline: 1px dashed ${z.listHoverOutline}; outline-offset: -1px; }`),z.listDropBackground&&V.push(` + .monaco-list${P}.drop-target, + .monaco-list${P} .monaco-list-rows.drop-target, + .monaco-list${P} .monaco-list-row.drop-target { background-color: ${z.listDropBackground} !important; color: inherit !important; } + `),z.listFilterWidgetBackground&&V.push(`.monaco-list-type-filter { background-color: ${z.listFilterWidgetBackground} }`),z.listFilterWidgetOutline&&V.push(`.monaco-list-type-filter { border: 1px solid ${z.listFilterWidgetOutline}; }`),z.listFilterWidgetNoMatchesOutline&&V.push(`.monaco-list-type-filter.no-matches { border: 1px solid ${z.listFilterWidgetNoMatchesOutline}; }`),z.listMatchesShadow&&V.push(`.monaco-list-type-filter { box-shadow: 1px 1px 1px ${z.listMatchesShadow}; }`),z.tableColumnsBorder&&V.push(` + .monaco-table:hover > .monaco-split-view2, + .monaco-table:hover > .monaco-split-view2 .monaco-sash.vertical::before { + border-color: ${z.tableColumnsBorder}; + }`),this.styleElement.textContent=V.join(` +`)}}e.DefaultStyleController=F;const D={listFocusBackground:s.Color.fromHex("#7FB0D0"),listActiveSelectionBackground:s.Color.fromHex("#0E639C"),listActiveSelectionForeground:s.Color.fromHex("#FFFFFF"),listFocusAndSelectionBackground:s.Color.fromHex("#094771"),listFocusAndSelectionForeground:s.Color.fromHex("#FFFFFF"),listInactiveSelectionBackground:s.Color.fromHex("#3F3F46"),listHoverBackground:s.Color.fromHex("#2A2D2E"),listDropBackground:s.Color.fromHex("#383B3D"),treeIndentGuidesStroke:s.Color.fromHex("#a9a9a9"),tableColumnsBorder:s.Color.fromHex("#cccccc").transparent(.2)},R={keyboardSupport:!0,mouseSupport:!0,multipleSelectionSupport:!0,dnd:{getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){}}};function W(X,z){const P=X.indexOf(z);if(P===-1)return[];const V=[];let U=P-1;for(;U>=0&&X[U]===z-(P-U);)V.push(X[U--]);for(V.reverse(),U=P;U=X.length)P.push(z[U++]);else if(U>=z.length)P.push(X[V++]);else if(X[V]===z[U]){P.push(X[V]),V++,U++;continue}else X[V]=X.length)P.push(z[U++]);else if(U>=z.length)P.push(X[V++]);else if(X[V]===z[U]){V++,U++;continue}else X[V]X-z;class ee{constructor(z,P){this._templateId=z,this.renderers=P}get templateId(){return this._templateId}renderTemplate(z){return this.renderers.map(P=>P.renderTemplate(z))}renderElement(z,P,V,U){let H=0;for(const $ of this.renderers)$.renderElement(z,P,V[H++],U)}disposeElement(z,P,V,U){let H=0;for(const $ of this.renderers)$.disposeElement&&$.disposeElement(z,P,V[H],U),H+=1}disposeTemplate(z){let P=0;for(const V of this.renderers)V.disposeTemplate(z[P++])}}class se{constructor(z){this.accessibilityProvider=z,this.templateId="a18n"}renderTemplate(z){return z}renderElement(z,P,V){const U=this.accessibilityProvider.getAriaLabel(z);U?V.setAttribute("aria-label",U):V.removeAttribute("aria-label");const H=this.accessibilityProvider.getAriaLevel&&this.accessibilityProvider.getAriaLevel(z);typeof H=="number"?V.setAttribute("aria-level",`${H}`):V.removeAttribute("aria-level")}disposeTemplate(z){}}class ne{constructor(z,P){this.list=z,this.dnd=P}getDragElements(z){const P=this.list.getSelectedElements();return P.indexOf(z)>-1?P:[z]}getDragURI(z){return this.dnd.getDragURI(z)}getDragLabel(z,P){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(z,P)}onDragStart(z,P){this.dnd.onDragStart&&this.dnd.onDragStart(z,P)}onDragOver(z,P,V,U){return this.dnd.onDragOver(z,P,V,U)}onDragEnd(z){this.dnd.onDragEnd&&this.dnd.onDragEnd(z)}drop(z,P,V,U){this.dnd.drop(z,P,V,U)}}class le{constructor(z,P,V,U,H=R){var $;this.user=z,this._options=H,this.eventBufferer=new g.EventBufferer,this._ariaLabel="",this.disposables=new b.DisposableStore,this._onDidDispose=new g.Emitter,this.onDidDispose=this._onDidDispose.event;const ie=this._options.accessibilityProvider&&this._options.accessibilityProvider.getWidgetRole?($=this._options.accessibilityProvider)===null||$===void 0?void 0:$.getWidgetRole():"list";this.selection=new m(ie!=="listbox"),this.focus=new h("focused"),a.mixin(H,D,!1);const oe=[this.focus.renderer,this.selection.renderer];this.accessibilityProvider=H.accessibilityProvider,this.accessibilityProvider&&(oe.push(new se(this.accessibilityProvider)),this.accessibilityProvider.onDidChangeActiveDescendant&&this.accessibilityProvider.onDidChangeActiveDescendant(this.onDidChangeActiveDescendant,this,this.disposables)),U=U.map(G=>new ee(G.templateId,[...oe,G]));const ae=Object.assign(Object.assign({},H),{dnd:H.dnd&&new ne(this,H.dnd)});if(this.view=new o.ListView(P,V,U,ae),this.view.domNode.setAttribute("role",ie),H.styleController)this.styleController=H.styleController(this.view.domId);else{const G=t.createStyleSheet(this.view.domNode);this.styleController=new F(G,this.view.domId)}if(this.spliceable=new u.CombinedSpliceable([new _(this.focus,this.view,H.identityProvider),new _(this.selection,this.view,H.identityProvider),this.view]),this.disposables.add(this.focus),this.disposables.add(this.selection),this.disposables.add(this.view),this.disposables.add(this._onDidDispose),this.onDidFocus=g.Event.map(p.domEvent(this.view.domNode,"focus",!0),()=>null),this.onDidBlur=g.Event.map(p.domEvent(this.view.domNode,"blur",!0),()=>null),this.disposables.add(new k(this,this.view)),typeof H.keyboardSupport!="boolean"||H.keyboardSupport){const G=new y(this,this.view,H);this.disposables.add(G)}if(H.keyboardNavigationLabelProvider){const G=H.keyboardNavigationDelegate||e.DefaultKeyboardNavigationDelegate;this.typeLabelController=new I(this,this.view,H.keyboardNavigationLabelProvider,G),this.disposables.add(this.typeLabelController)}this.mouseController=this.createMouseController(H),this.disposables.add(this.mouseController),this.onDidChangeFocus(this._onFocusChange,this,this.disposables),this.onDidChangeSelection(this._onSelectionChange,this,this.disposables),this.accessibilityProvider&&(this.ariaLabel=this.accessibilityProvider.getWidgetAriaLabel()),H.multipleSelectionSupport&&this.view.domNode.setAttribute("aria-multiselectable","true")}get onDidChangeFocus(){return g.Event.map(this.eventBufferer.wrapEvent(this.focus.onChange),z=>this.toListEvent(z))}get onDidChangeSelection(){return g.Event.map(this.eventBufferer.wrapEvent(this.selection.onChange),z=>this.toListEvent(z))}get domId(){return this.view.domId}get onMouseClick(){return this.view.onMouseClick}get onMouseDblClick(){return this.view.onMouseDblClick}get onMouseMiddleClick(){return this.view.onMouseMiddleClick}get onPointer(){return this.mouseController.onPointer}get onMouseDown(){return this.view.onMouseDown}get onTouchStart(){return this.view.onTouchStart}get onTap(){return this.view.onTap}get onContextMenu(){let z=!1;const P=g.Event.chain(p.domEvent(this.view.domNode,"keydown")).map(H=>new d.StandardKeyboardEvent(H)).filter(H=>z=H.keyCode===58||H.shiftKey&&H.keyCode===68).map(p.stopEvent).filter(()=>!1).event,V=g.Event.chain(p.domEvent(this.view.domNode,"keyup")).forEach(()=>z=!1).map(H=>new d.StandardKeyboardEvent(H)).filter(H=>H.keyCode===58||H.shiftKey&&H.keyCode===68).map(p.stopEvent).map(({browserEvent:H})=>{const $=this.getFocus(),ie=$.length?$[0]:void 0,oe=typeof ie!="undefined"?this.view.element(ie):void 0,ae=typeof ie!="undefined"?this.view.domElement(ie):this.view.domNode;return{index:ie,element:oe,anchor:ae,browserEvent:H}}).event,U=g.Event.chain(this.view.onContextMenu).filter(H=>!z).map(({element:H,index:$,browserEvent:ie})=>({element:H,index:$,anchor:{x:ie.clientX+1,y:ie.clientY},browserEvent:ie})).event;return g.Event.any(P,V,U)}get onKeyDown(){return p.domEvent(this.view.domNode,"keydown")}createMouseController(z){return new B(this)}updateOptions(z={}){this._options=Object.assign(Object.assign({},this._options),z),this.typeLabelController&&this.typeLabelController.updateOptions(this._options),this.view.updateOptions(z)}get options(){return this._options}splice(z,P,V=[]){if(z<0||z>this.view.length)throw new c.ListError(this.user,`Invalid start index: ${z}`);if(P<0)throw new c.ListError(this.user,`Invalid delete count: ${P}`);P===0&&V.length===0||this.eventBufferer.bufferEvents(()=>this.spliceable.splice(z,P,V))}rerender(){this.view.rerender()}element(z){return this.view.element(z)}get length(){return this.view.length}get contentHeight(){return this.view.contentHeight}get scrollTop(){return this.view.getScrollTop()}set scrollTop(z){this.view.setScrollTop(z)}get ariaLabel(){return this._ariaLabel}set ariaLabel(z){this._ariaLabel=z,this.view.domNode.setAttribute("aria-label",z)}domFocus(){this.view.domNode.focus({preventScroll:!0})}layout(z,P){this.view.layout(z,P)}setSelection(z,P){for(const V of z)if(V<0||V>=this.length)throw new c.ListError(this.user,`Invalid index ${V}`);this.selection.set(z,P)}getSelection(){return this.selection.get()}getSelectedElements(){return this.getSelection().map(z=>this.view.element(z))}setFocus(z,P){for(const V of z)if(V<0||V>=this.length)throw new c.ListError(this.user,`Invalid index ${V}`);this.focus.set(z,P)}focusNext(z=1,P=!1,V,U){if(this.length!==0){const H=this.focus.get(),$=this.findNextIndex(H.length>0?H[0]+z:0,P,U);$>-1&&this.setFocus([$],V)}}focusPrevious(z=1,P=!1,V,U){if(this.length!==0){const H=this.focus.get(),$=this.findPreviousIndex(H.length>0?H[0]-z:0,P,U);$>-1&&this.setFocus([$],V)}}focusNextPage(z,P){let V=this.view.indexAt(this.view.getScrollTop()+this.view.renderHeight);V=V===0?0:V-1;const U=this.view.element(V),H=this.getFocusedElements()[0];if(H!==U){const $=this.findPreviousIndex(V,!1,P);$>-1&&H!==this.view.element($)?this.setFocus([$],z):this.setFocus([V],z)}else{const $=this.view.getScrollTop();this.view.setScrollTop($+this.view.renderHeight-this.view.elementHeight(V)),this.view.getScrollTop()!==$&&(this.setFocus([]),setTimeout(()=>this.focusNextPage(z,P),0))}}focusPreviousPage(z,P){let V;const U=this.view.getScrollTop();U===0?V=this.view.indexAt(U):V=this.view.indexAfter(U-1);const H=this.view.element(V),$=this.getFocusedElements()[0];if($!==H){const ie=this.findNextIndex(V,!1,P);ie>-1&&$!==this.view.element(ie)?this.setFocus([ie],z):this.setFocus([V],z)}else{const ie=U;this.view.setScrollTop(U-this.view.renderHeight),this.view.getScrollTop()!==ie&&(this.setFocus([]),setTimeout(()=>this.focusPreviousPage(z,P),0))}}focusLast(z,P){if(this.length!==0){const V=this.findPreviousIndex(this.length-1,!1,P);V>-1&&this.setFocus([V],z)}}focusFirst(z,P){this.focusNth(0,z,P)}focusNth(z,P,V){if(this.length!==0){const U=this.findNextIndex(z,!1,V);U>-1&&this.setFocus([U],P)}}findNextIndex(z,P=!1,V){for(let U=0;U=this.length&&!P)return-1;if(z=z%this.length,!V||V(this.element(z)))return z;z++}return-1}findPreviousIndex(z,P=!1,V){for(let U=0;Uthis.view.element(z))}reveal(z,P){if(z<0||z>=this.length)throw new c.ListError(this.user,`Invalid index ${z}`);const V=this.view.getScrollTop(),U=this.view.elementTop(z),H=this.view.elementHeight(z);if(N.isNumber(P)){const $=H-this.view.renderHeight;this.view.setScrollTop($*r.clamp(P,0,1)+U)}else{const $=U+H,ie=V+this.view.renderHeight;U=ie||(U=ie&&this.view.setScrollTop($-this.view.renderHeight))}}getRelativeTop(z){if(z<0||z>=this.length)throw new c.ListError(this.user,`Invalid index ${z}`);const P=this.view.getScrollTop(),V=this.view.elementTop(z),U=this.view.elementHeight(z);if(VP+this.view.renderHeight)return null;const H=U-this.view.renderHeight;return Math.abs((P-V)/H)}getHTMLElement(){return this.view.domNode}style(z){this.styleController.style(z)}toListEvent({indexes:z,browserEvent:P}){return{indexes:z,elements:z.map(V=>this.view.element(V)),browserEvent:P}}_onFocusChange(){const z=this.focus.get();this.view.domNode.classList.toggle("element-focused",z.length>0),this.onDidChangeActiveDescendant()}onDidChangeActiveDescendant(){var z;const P=this.focus.get();if(P.length>0){let V;((z=this.accessibilityProvider)===null||z===void 0?void 0:z.getActiveDescendantId)&&(V=this.accessibilityProvider.getActiveDescendantId(this.view.element(P[0]))),this.view.domNode.setAttribute("aria-activedescendant",V||this.view.getElementDomId(P[0]))}else this.view.domNode.removeAttribute("aria-activedescendant")}_onSelectionChange(){const z=this.selection.get();this.view.domNode.classList.toggle("selection-none",z.length===0),this.view.domNode.classList.toggle("selection-single",z.length===1),this.view.domNode.classList.toggle("selection-multiple",z.length>1)}dispose(){this._onDidDispose.fire(),this.disposables.dispose(),this._onDidDispose.dispose()}}Me([w.memoize],le.prototype,"onDidChangeFocus",null),Me([w.memoize],le.prototype,"onDidChangeSelection",null),Me([w.memoize],le.prototype,"onContextMenu",null),e.List=le}),define(Q[312],J([0,1,2,19,105,6,23,208]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PagedList=void 0;class C{constructor(o,s){this.renderer=o,this.modelProvider=s}get templateId(){return this.renderer.templateId}renderTemplate(o){return{data:this.renderer.renderTemplate(o),disposable:b.Disposable.None}}renderElement(o,s,a,u){if(a.disposable&&a.disposable.dispose(),!!a.data){const r=this.modelProvider();if(r.isResolved(o))return this.renderer.renderElement(r.get(o),o,a.data,u);const i=new S.CancellationTokenSource,n=r.resolve(o,i.token);a.disposable={dispose:()=>i.cancel()},this.renderer.renderPlaceholder(o,a.data),n.then(t=>this.renderer.renderElement(t,o,a.data,u))}}disposeTemplate(o){o.disposable&&(o.disposable.dispose(),o.disposable=void 0),o.data&&(this.renderer.disposeTemplate(o.data),o.data=void 0)}}class d{constructor(o,s){this.modelProvider=o,this.accessibilityProvider=s}getWidgetAriaLabel(){return this.accessibilityProvider.getWidgetAriaLabel()}getAriaLabel(o){const s=this.modelProvider();return s.isResolved(o)?this.accessibilityProvider.getAriaLabel(s.get(o)):null}}function g(c,o){return Object.assign(Object.assign({},o),{accessibilityProvider:o.accessibilityProvider&&new d(c,o.accessibilityProvider)})}class p{constructor(o,s,a,u,r={}){const i=()=>this.model,n=u.map(t=>new C(t,i));this.list=new M.List(o,s,a,n,g(i,r))}updateOptions(o){this.list.updateOptions(o)}getHTMLElement(){return this.list.getHTMLElement()}get onDidFocus(){return this.list.onDidFocus}get onDidDispose(){return this.list.onDidDispose}get onMouseDblClick(){return w.Event.map(this.list.onMouseDblClick,({element:o,index:s,browserEvent:a})=>({element:o===void 0?void 0:this._model.get(o),index:s,browserEvent:a}))}get onPointer(){return w.Event.map(this.list.onPointer,({element:o,index:s,browserEvent:a})=>({element:o===void 0?void 0:this._model.get(o),index:s,browserEvent:a}))}get onDidChangeFocus(){return w.Event.map(this.list.onDidChangeFocus,({elements:o,indexes:s,browserEvent:a})=>({elements:o.map(u=>this._model.get(u)),indexes:s,browserEvent:a}))}get onDidChangeSelection(){return w.Event.map(this.list.onDidChangeSelection,({elements:o,indexes:s,browserEvent:a})=>({elements:o.map(u=>this._model.get(u)),indexes:s,browserEvent:a}))}get model(){return this._model}set model(o){this._model=o,this.list.splice(0,this.list.length,N.range(o.length))}getFocus(){return this.list.getFocus()}setSelection(o,s){this.list.setSelection(o,s)}getSelection(){return this.list.getSelection()}getSelectedElements(){return this.getSelection().map(o=>this.model.get(o))}style(o){this.list.style(o)}dispose(){this.list.dispose()}}e.PagedList=p}),define(Q[313],J([10]),{}),define(Q[210],J([0,1,2,6,20,100,19,104,29,55,7,61,121,313]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SplitView=e.Sizing=void 0;const s={separatorBorder:d.Color.transparent};class a{constructor(h,m,_,f){this.container=h,this.view=m,this.disposable=f,this._cachedVisibleSize=void 0,typeof _=="number"?(this._size=_,this._cachedVisibleSize=void 0,h.classList.add("visible")):(this._size=0,this._cachedVisibleSize=_.cachedVisibleSize)}set size(h){this._size=h}get size(){return this._size}get visible(){return typeof this._cachedVisibleSize=="undefined"}setVisible(h,m){h!==this.visible&&(h?(this.size=w.clamp(this._cachedVisibleSize,this.viewMinimumSize,this.viewMaximumSize),this._cachedVisibleSize=void 0):(this._cachedVisibleSize=typeof m=="number"?m:this.size,this.size=0),this.container.classList.toggle("visible",h),this.view.setVisible&&this.view.setVisible(h))}get minimumSize(){return this.visible?this.view.minimumSize:0}get viewMinimumSize(){return this.view.minimumSize}get maximumSize(){return this.visible?this.view.maximumSize:0}get viewMaximumSize(){return this.view.maximumSize}get priority(){return this.view.priority}get snap(){return!!this.view.snap}set enabled(h){this.container.style.pointerEvents=h?"":"none"}layout(h,m){this.layoutContainer(h),this.view.layout(this.size,h,m)}dispose(){return this.disposable.dispose(),this.view}}class u extends a{layoutContainer(h){this.container.style.top=`${h}px`,this.container.style.height=`${this.size}px`}}class r extends a{layoutContainer(h){this.container.style.left=`${h}px`,this.container.style.width=`${this.size}px`}}var i;(function(l){l[l.Idle=0]="Idle",l[l.Busy=1]="Busy"})(i||(i={}));var n;(function(l){l.Distribute={type:"distribute"};function h(_){return{type:"split",index:_}}l.Split=h;function m(_){return{type:"invisible",cachedVisibleSize:_}}l.Invisible=m})(n=e.Sizing||(e.Sizing={}));class t extends b.Disposable{constructor(h,m={}){var _,f;super();this.size=0,this.contentSize=0,this.proportions=void 0,this.viewItems=[],this.sashItems=[],this.state=i.Idle,this._onDidSashChange=this._register(new N.Emitter),this.onDidSashChange=this._onDidSashChange.event,this._onDidSashReset=this._register(new N.Emitter),this._startSnappingEnabled=!0,this._endSnappingEnabled=!0,this.orientation=M.isUndefined(m.orientation)?0:m.orientation,this.inverseAltBehavior=!!m.inverseAltBehavior,this.proportionalLayout=M.isUndefined(m.proportionalLayout)?!0:!!m.proportionalLayout,this.getSashOrthogonalSize=m.getSashOrthogonalSize,this.el=document.createElement("div"),this.el.classList.add("monaco-split-view2"),this.el.classList.add(this.orientation===0?"vertical":"horizontal"),h.appendChild(this.el),this.sashContainer=p.append(this.el,p.$(".sash-container")),this.viewContainer=p.$(".split-view-container"),this.scrollable=new o.Scrollable(125,p.scheduleAtNextAnimationFrame),this.scrollableElement=this._register(new c.SmoothScrollableElement(this.viewContainer,{vertical:this.orientation===0?(_=m.scrollbarVisibility)!==null&&_!==void 0?_:1:2,horizontal:this.orientation===1?(f=m.scrollbarVisibility)!==null&&f!==void 0?f:1:2},this.scrollable)),this._register(this.scrollableElement.onScroll(v=>{this.viewContainer.scrollTop=v.scrollTop,this.viewContainer.scrollLeft=v.scrollLeft})),p.append(this.el,this.scrollableElement.getDomNode()),this.style(m.styles||s),m.descriptor&&(this.size=m.descriptor.size,m.descriptor.views.forEach((v,y)=>{const L=M.isUndefined(v.visible)||v.visible?v.size:{type:"invisible",cachedVisibleSize:v.size},I=v.view;this.doAddView(I,L,y,!0)}),this.contentSize=this.viewItems.reduce((v,y)=>v+y.size,0),this.saveProportions())}get orthogonalStartSash(){return this._orthogonalStartSash}set orthogonalStartSash(h){for(const m of this.sashItems)m.sash.orthogonalStartSash=h;this._orthogonalStartSash=h}get orthogonalEndSash(){return this._orthogonalEndSash}set orthogonalEndSash(h){for(const m of this.sashItems)m.sash.orthogonalEndSash=h;this._orthogonalEndSash=h}get startSnappingEnabled(){return this._startSnappingEnabled}set startSnappingEnabled(h){this._startSnappingEnabled!==h&&(this._startSnappingEnabled=h,this.updateSashEnablement())}get endSnappingEnabled(){return this._endSnappingEnabled}set endSnappingEnabled(h){this._endSnappingEnabled!==h&&(this._endSnappingEnabled=h,this.updateSashEnablement())}style(h){h.separatorBorder.isTransparent()?(this.el.classList.remove("separator-border"),this.el.style.removeProperty("--separator-border")):(this.el.classList.add("separator-border"),this.el.style.setProperty("--separator-border",h.separatorBorder.toString()))}addView(h,m,_=this.viewItems.length,f){this.doAddView(h,m,_,f)}layout(h,m){const _=Math.max(this.size,this.contentSize);if(this.size=h,this.layoutContext=m,this.proportions)for(let f=0;fthis.viewItems[L].priority===1),y=f.filter(L=>this.viewItems[L].priority===2);this.resize(this.viewItems.length-1,h-_,void 0,v,y)}this.distributeEmptySpace(),this.layoutViews()}saveProportions(){this.proportionalLayout&&this.contentSize>0&&(this.proportions=this.viewItems.map(h=>h.size/this.contentSize))}onSashStart({sash:h,start:m,alt:_}){for(const L of this.viewItems)L.enabled=!1;const f=this.sashItems.findIndex(L=>L.sash===h),v=b.combinedDisposable(g.domEvent(document.body,"keydown")(L=>y(this.sashDragState.current,L.altKey)),g.domEvent(document.body,"keyup")(()=>y(this.sashDragState.current,!1))),y=(L,I)=>{const k=this.viewItems.map(B=>B.size);let E=Number.NEGATIVE_INFINITY,T=Number.POSITIVE_INFINITY;if(this.inverseAltBehavior&&(I=!I),I)if(f===this.sashItems.length-1){const F=this.viewItems[f];E=(F.minimumSize-F.size)/2,T=(F.maximumSize-F.size)/2}else{const F=this.viewItems[f+1];E=(F.size-F.maximumSize)/2,T=(F.size-F.minimumSize)/2}let O,A;if(!I){const B=S.range(f,-1),F=S.range(f+1,this.viewItems.length),D=B.reduce((ne,le)=>ne+(this.viewItems[le].minimumSize-k[le]),0),R=B.reduce((ne,le)=>ne+(this.viewItems[le].viewMaximumSize-k[le]),0),W=F.length===0?Number.POSITIVE_INFINITY:F.reduce((ne,le)=>ne+(k[le]-this.viewItems[le].minimumSize),0),x=F.length===0?Number.NEGATIVE_INFINITY:F.reduce((ne,le)=>ne+(k[le]-this.viewItems[le].viewMaximumSize),0),K=Math.max(D,x),Y=Math.min(W,R),ee=this.findFirstSnapIndex(B),se=this.findFirstSnapIndex(F);if(typeof ee=="number"){const ne=this.viewItems[ee],le=Math.floor(ne.viewMinimumSize/2);O={index:ee,limitDelta:ne.visible?K-le:K+le,size:ne.size}}if(typeof se=="number"){const ne=this.viewItems[se],le=Math.floor(ne.viewMinimumSize/2);A={index:se,limitDelta:ne.visible?Y+le:Y-le,size:ne.size}}}this.sashDragState={start:L,current:L,index:f,sizes:k,minDelta:E,maxDelta:T,alt:I,snapBefore:O,snapAfter:A,disposable:v}};y(m,_)}onSashChange({current:h}){const{index:m,start:_,sizes:f,alt:v,minDelta:y,maxDelta:L,snapBefore:I,snapAfter:k}=this.sashDragState;this.sashDragState.current=h;const E=h-_,T=this.resize(m,E,f,void 0,void 0,y,L,I,k);if(v){const O=m===this.sashItems.length-1,A=this.viewItems.map(x=>x.size),B=O?m:m+1,F=this.viewItems[B],D=F.size-F.maximumSize,R=F.size-F.minimumSize,W=O?m-1:m+1;this.resize(W,-T,A,void 0,void 0,D,R)}this.distributeEmptySpace(),this.layoutViews()}onSashEnd(h){this._onDidSashChange.fire(h),this.sashDragState.disposable.dispose(),this.saveProportions();for(const m of this.viewItems)m.enabled=!0}onViewChange(h,m){const _=this.viewItems.indexOf(h);_<0||_>=this.viewItems.length||(m=typeof m=="number"?m:h.size,m=w.clamp(m,h.minimumSize,h.maximumSize),this.inverseAltBehavior&&_>0?(this.resize(_-1,Math.floor((h.size-m)/2)),this.distributeEmptySpace(),this.layoutViews()):(h.size=m,this.relayout([_],void 0)))}resizeView(h,m){if(this.state!==i.Idle)throw new Error("Cant modify splitview");if(this.state=i.Busy,!(h<0||h>=this.viewItems.length)){const _=S.range(this.viewItems.length).filter(L=>L!==h),f=[..._.filter(L=>this.viewItems[L].priority===1),h],v=_.filter(L=>this.viewItems[L].priority===2),y=this.viewItems[h];m=Math.round(m),m=w.clamp(m,y.minimumSize,Math.min(y.maximumSize,this.size)),y.size=m,this.relayout(f,v),this.state=i.Idle}}distributeViewSizes(){const h=[];let m=0;for(const L of this.viewItems)L.maximumSize-L.minimumSize>0&&(h.push(L),m+=L.size);const _=Math.floor(m/h.length);for(const L of h)L.size=w.clamp(_,L.minimumSize,L.maximumSize);const f=S.range(this.viewItems.length),v=f.filter(L=>this.viewItems[L].priority===1),y=f.filter(L=>this.viewItems[L].priority===2);this.relayout(v,y)}getViewSize(h){return h<0||h>=this.viewItems.length?-1:this.viewItems[h].size}doAddView(h,m,_=this.viewItems.length,f){if(this.state!==i.Idle)throw new Error("Cant modify splitview");this.state=i.Busy;const v=p.$(".split-view-view");_===this.viewItems.length?this.viewContainer.appendChild(v):this.viewContainer.insertBefore(v,this.viewContainer.children.item(_));const y=h.onDidChange(O=>this.onViewChange(E,O)),L=b.toDisposable(()=>this.viewContainer.removeChild(v)),I=b.combinedDisposable(y,L);let k;typeof m=="number"?k=m:m.type==="split"?k=this.getViewSize(m.index)/2:m.type==="invisible"?k={cachedVisibleSize:m.cachedVisibleSize}:k=h.minimumSize;const E=this.orientation===0?new u(v,h,k,I):new r(v,h,k,I);if(this.viewItems.splice(_,0,E),this.viewItems.length>1){let O={orthogonalStartSash:this.orthogonalStartSash,orthogonalEndSash:this.orthogonalEndSash};const A=this.orientation===0?new C.Sash(this.sashContainer,{getHorizontalSashTop:ne=>this.getSashPosition(ne),getHorizontalSashWidth:this.getSashOrthogonalSize},Object.assign(Object.assign({},O),{orientation:1})):new C.Sash(this.sashContainer,{getVerticalSashLeft:ne=>this.getSashPosition(ne),getVerticalSashHeight:this.getSashOrthogonalSize},Object.assign(Object.assign({},O),{orientation:0})),B=this.orientation===0?ne=>({sash:A,start:ne.startY,current:ne.currentY,alt:ne.altKey}):ne=>({sash:A,start:ne.startX,current:ne.currentX,alt:ne.altKey}),D=N.Event.map(A.onDidStart,B)(this.onSashStart,this),W=N.Event.map(A.onDidChange,B)(this.onSashChange,this),K=N.Event.map(A.onDidEnd,()=>this.sashItems.findIndex(ne=>ne.sash===A))(this.onSashEnd,this),Y=A.onDidReset(()=>{const ne=this.sashItems.findIndex(V=>V.sash===A),le=S.range(ne,-1),X=S.range(ne+1,this.viewItems.length),z=this.findFirstSnapIndex(le),P=this.findFirstSnapIndex(X);typeof z=="number"&&!this.viewItems[z].visible||typeof P=="number"&&!this.viewItems[P].visible||this._onDidSashReset.fire(ne)}),ee=b.combinedDisposable(D,W,K,Y,A),se={sash:A,disposable:ee};this.sashItems.splice(_-1,0,se)}v.appendChild(h.element);let T;typeof m!="number"&&m.type==="split"&&(T=[m.index]),f||this.relayout([_],T),this.state=i.Idle,!f&&typeof m!="number"&&m.type==="distribute"&&this.distributeViewSizes()}relayout(h,m){const _=this.viewItems.reduce((f,v)=>f+v.size,0);this.resize(this.viewItems.length-1,this.size-_,void 0,h,m),this.distributeEmptySpace(),this.layoutViews(),this.saveProportions()}resize(h,m,_=this.viewItems.map(E=>E.size),f,v,y=Number.NEGATIVE_INFINITY,L=Number.POSITIVE_INFINITY,I,k){if(h<0||h>=this.viewItems.length)return 0;const E=S.range(h,-1),T=S.range(h+1,this.viewItems.length);if(v)for(const se of v)S.pushToStart(E,se),S.pushToStart(T,se);if(f)for(const se of f)S.pushToEnd(E,se),S.pushToEnd(T,se);const O=E.map(se=>this.viewItems[se]),A=E.map(se=>_[se]),B=T.map(se=>this.viewItems[se]),F=T.map(se=>_[se]),D=E.reduce((se,ne)=>se+(this.viewItems[ne].minimumSize-_[ne]),0),R=E.reduce((se,ne)=>se+(this.viewItems[ne].maximumSize-_[ne]),0),W=T.length===0?Number.POSITIVE_INFINITY:T.reduce((se,ne)=>se+(_[ne]-this.viewItems[ne].minimumSize),0),x=T.length===0?Number.NEGATIVE_INFINITY:T.reduce((se,ne)=>se+(_[ne]-this.viewItems[ne].maximumSize),0),K=Math.max(D,x,y),Y=Math.min(W,R,L);let ee=!1;if(I){const se=this.viewItems[I.index],ne=m>=I.limitDelta;ee=ne!==se.visible,se.setVisible(ne,I.size)}if(!ee&&k){const se=this.viewItems[k.index],ne=mL+I.size,0);let _=this.size-m;const f=S.range(this.viewItems.length-1,-1),v=f.filter(L=>this.viewItems[L].priority===1),y=f.filter(L=>this.viewItems[L].priority===2);for(const L of y)S.pushToStart(f,L);for(const L of v)S.pushToEnd(f,L);typeof h=="number"&&S.pushToEnd(f,h);for(let L=0;_!==0&&Lm+_.size,0);let h=0;for(const m of this.viewItems)m.layout(h,this.layoutContext),h+=m.size;this.sashItems.forEach(m=>m.sash.layout()),this.updateSashEnablement(),this.updateScrollableElement()}updateScrollableElement(){this.orientation===0?this.scrollableElement.setScrollDimensions({height:this.size,scrollHeight:this.contentSize}):this.scrollableElement.setScrollDimensions({width:this.size,scrollWidth:this.contentSize})}updateSashEnablement(){let h=!1;const m=this.viewItems.map(I=>h=I.size-I.minimumSize>0||h);h=!1;const _=this.viewItems.map(I=>h=I.maximumSize-I.size>0||h),f=[...this.viewItems].reverse();h=!1;const v=f.map(I=>h=I.size-I.minimumSize>0||h).reverse();h=!1;const y=f.map(I=>h=I.maximumSize-I.size>0||h).reverse();let L=0;for(let I=0;I0||this.startSnappingEnabled)?k.state=1:W&&m[I]&&(L0)return;if(!_.visible&&_.snap)return m}}dispose(){super.dispose(),this.viewItems.forEach(h=>h.dispose()),this.viewItems=[],this.sashItems.forEach(h=>h.disposable.dispose()),this.sashItems=[]}}e.SplitView=t}),define(Q[314],J([10]),{}),define(Q[315],J([0,1,105,7,210,6,314]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Table=void 0;class S{constructor(c,o,s){this.columns=c,this.getColumnSize=s,this.templateId=S.TemplateId,this.renderedTemplates=new Set;const a=new Map(o.map(u=>[u.templateId,u]));this.renderers=[];for(const u of c){const r=a.get(u.templateId);if(!r)throw new Error(`Table cell renderer for template id ${u.templateId} not found.`);this.renderers.push(r)}}renderTemplate(c){const o=N.append(c,N.$(".monaco-table-tr")),s=[],a=[];for(let r=0;rnew d(l,h)),n={size:i.reduce((l,h)=>l+h.column.weight,0),views:i.map(l=>({size:l.column.weight,view:l}))};this.splitview=new M.SplitView(this.domNode,{orientation:1,scrollbarVisibility:2,getSashOrthogonalSize:()=>this.cachedHeight,descriptor:n}),this.splitview.el.style.height=`${s.headerRowHeight}px`,this.splitview.el.style.lineHeight=`${s.headerRowHeight}px`;const t=new S(a,u,l=>this.splitview.getViewSize(l));this.list=new b.List(c,this.domNode,C(s),[t],r),this.columnLayoutDisposable=w.Event.any(...i.map(l=>l.onDidLayout))(([l,h])=>t.layoutColumn(l,h)),this.styleElement=N.createStyleSheet(this.domNode),this.style({})}get onDidChangeFocus(){return this.list.onDidChangeFocus}get onDidChangeSelection(){return this.list.onDidChangeSelection}get onMouseDblClick(){return this.list.onMouseDblClick}get onPointer(){return this.list.onPointer}get onDidFocus(){return this.list.onDidFocus}get onDidDispose(){return this.list.onDidDispose}updateOptions(c){this.list.updateOptions(c)}splice(c,o,s=[]){this.list.splice(c,o,s)}getHTMLElement(){return this.domNode}style(c){const o=[];o.push(`.monaco-table.${this.domId} > .monaco-split-view2 .monaco-sash.vertical::before { + top: ${this.virtualDelegate.headerRowHeight+1}px; + height: calc(100% - ${this.virtualDelegate.headerRowHeight}px); + }`),this.styleElement.textContent=o.join(` +`),this.list.style(c)}getSelectedElements(){return this.list.getSelectedElements()}setSelection(c,o){this.list.setSelection(c,o)}getSelection(){return this.list.getSelection()}getFocus(){return this.list.getFocus()}dispose(){this.splitview.dispose(),this.list.dispose(),this.columnLayoutDisposable.dispose()}}e.Table=g,g.InstanceCount=0}),define(Q[316],J([10]),{}),define(Q[125],J([10]),{}),define(Q[211],J([0,1,7,119,125]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getIconClass=void 0;const M={},w=new N.IdGenerator("quick-input-button-icon-");function S(C){if(!!C){let d;const g=C.dark.toString();return M[g]?d=M[g]:(d=w.nextId(),b.createCSSRule(`.${d}`,`background-image: ${b.asCSSUrl(C.light||C.dark)}`),b.createCSSRule(`.vs-dark .${d}, .hc-black .${d}`,`background-image: ${b.asCSSUrl(C.dark)}`),M[g]=d),d}}e.getIconClass=S}),define(Q[317],J([10]),{}),define(Q[318],J([10]),{}),define(Q[319],J([10]),{}),define(Q[320],J([10]),{}),define(Q[321],J([10]),{}),define(Q[322],J([10]),{}),define(Q[323],J([10]),{}),define(Q[324],J([10]),{}),define(Q[325],J([10]),{}),define(Q[326],J([10]),{}),define(Q[327],J([10]),{}),define(Q[328],J([10]),{}),define(Q[329],J([10]),{}),define(Q[330],J([10]),{}),define(Q[331],J([10]),{}),define(Q[332],J([10]),{}),define(Q[333],J([10]),{}),define(Q[334],J([10]),{}),define(Q[335],J([10]),{}),define(Q[336],J([10]),{}),define(Q[337],J([10]),{}),define(Q[338],J([10]),{}),define(Q[339],J([10]),{}),define(Q[340],J([10]),{}),define(Q[341],J([10]),{}),define(Q[342],J([10]),{}),define(Q[343],J([10]),{}),define(Q[344],J([10]),{}),define(Q[345],J([10]),{}),define(Q[346],J([10]),{}),define(Q[347],J([10]),{}),define(Q[348],J([10]),{}),define(Q[349],J([10]),{}),define(Q[350],J([10]),{}),define(Q[351],J([10]),{}),define(Q[352],J([10]),{}),define(Q[353],J([10]),{}),define(Q[354],J([10]),{}),define(Q[355],J([10]),{}),define(Q[356],J([10]),{}),define(Q[357],J([10]),{}),define(Q[358],J([10]),{}),define(Q[359],J([10]),{}),define(Q[360],J([10]),{}),define(Q[361],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.readCharWidths=e.CharWidthRequest=void 0;class b{constructor(S,C){this.chr=S,this.type=C,this.width=0}fulfill(S){this.width=S}}e.CharWidthRequest=b;class N{constructor(S,C){this._bareFontInfo=S,this._requests=C,this._container=null,this._testElements=null}read(){this._createDomElements(),document.body.appendChild(this._container),this._readFromDomElements(),document.body.removeChild(this._container),this._container=null,this._testElements=null}_createDomElements(){const S=document.createElement("div");S.style.position="absolute",S.style.top="-50000px",S.style.width="50000px";const C=document.createElement("div");C.style.fontFamily=this._bareFontInfo.getMassagedFontFamily(),C.style.fontWeight=this._bareFontInfo.fontWeight,C.style.fontSize=this._bareFontInfo.fontSize+"px",C.style.fontFeatureSettings=this._bareFontInfo.fontFeatureSettings,C.style.lineHeight=this._bareFontInfo.lineHeight+"px",C.style.letterSpacing=this._bareFontInfo.letterSpacing+"px",S.appendChild(C);const d=document.createElement("div");d.style.fontFamily=this._bareFontInfo.getMassagedFontFamily(),d.style.fontWeight="bold",d.style.fontSize=this._bareFontInfo.fontSize+"px",d.style.fontFeatureSettings=this._bareFontInfo.fontFeatureSettings,d.style.lineHeight=this._bareFontInfo.lineHeight+"px",d.style.letterSpacing=this._bareFontInfo.letterSpacing+"px",S.appendChild(d);const g=document.createElement("div");g.style.fontFamily=this._bareFontInfo.getMassagedFontFamily(),g.style.fontWeight=this._bareFontInfo.fontWeight,g.style.fontSize=this._bareFontInfo.fontSize+"px",g.style.fontFeatureSettings=this._bareFontInfo.fontFeatureSettings,g.style.lineHeight=this._bareFontInfo.lineHeight+"px",g.style.letterSpacing=this._bareFontInfo.letterSpacing+"px",g.style.fontStyle="italic",S.appendChild(g);const p=[];for(const c of this._requests){let o;c.type===0&&(o=C),c.type===2&&(o=d),c.type===1&&(o=g),o.appendChild(document.createElement("br"));const s=document.createElement("span");N._render(s,c),o.appendChild(s),p.push(s)}this._container=S,this._testElements=p}static _render(S,C){if(C.chr===" "){let d="\xA0";for(let g=0;g<8;g++)d+=d;S.innerText=d}else{let d=C.chr;for(let g=0;g<8;g++)d+=d;S.textContent=d}}_readFromDomElements(){for(let S=0,C=this._requests.length;S{w&&w[0]&&w[0].contentRect?this.observe({width:w[0].contentRect.width,height:w[0].contentRect.height}):this.observe()}),this.resizeObserver.observe(this.referenceDomElement)):this.measureReferenceDomElementToken===-1&&(this.measureReferenceDomElementToken=setInterval(()=>this.observe(),100))}stopObserving(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.measureReferenceDomElementToken!==-1&&(clearInterval(this.measureReferenceDomElementToken),this.measureReferenceDomElementToken=-1)}observe(w){this.measureReferenceDomElement(!0,w)}measureReferenceDomElement(w,S){let C=0,d=0;S?(C=S.width,d=S.height):this.referenceDomElement&&(C=this.referenceDomElement.clientWidth,d=this.referenceDomElement.clientHeight),C=Math.max(5,C),d=Math.max(5,d),(this.width!==C||this.height!==d)&&(this.width=C,this.height=d,w&&this.changeCallback())}}e.ElementSizeObserver=N}),define(Q[162],J([0,1,7,90,50,2]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlobalEditorMouseMoveMonitor=e.EditorPointerEventFactory=e.EditorMouseEventFactory=e.EditorMouseEvent=e.createEditorPagePosition=e.EditorPagePosition=e.ClientCoordinates=e.PageCoordinates=void 0;class S{constructor(u,r){this.x=u,this.y=r}toClientCoordinates(){return new C(this.x-b.StandardWindow.scrollX,this.y-b.StandardWindow.scrollY)}}e.PageCoordinates=S;class C{constructor(u,r){this.clientX=u,this.clientY=r}toPageCoordinates(){return new S(this.clientX+b.StandardWindow.scrollX,this.clientY+b.StandardWindow.scrollY)}}e.ClientCoordinates=C;class d{constructor(u,r,i,n){this.x=u,this.y=r,this.width=i,this.height=n}}e.EditorPagePosition=d;function g(a){const u=b.getDomNodePagePosition(a);return new d(u.left,u.top,u.width,u.height)}e.createEditorPagePosition=g;class p extends M.StandardMouseEvent{constructor(u,r){super(u);this.pos=new S(this.posx,this.posy),this.editorPos=g(r)}}e.EditorMouseEvent=p;class c{constructor(u){this._editorViewDomNode=u}_create(u){return new p(u,this._editorViewDomNode)}onContextMenu(u,r){return b.addDisposableListener(u,"contextmenu",i=>{r(this._create(i))})}onMouseUp(u,r){return b.addDisposableListener(u,"mouseup",i=>{r(this._create(i))})}onMouseDown(u,r){return b.addDisposableListener(u,"mousedown",i=>{r(this._create(i))})}onMouseLeave(u,r){return b.addDisposableNonBubblingMouseOutListener(u,i=>{r(this._create(i))})}onMouseMoveThrottled(u,r,i,n){const t=(l,h)=>i(l,this._create(h));return b.addDisposableThrottledListener(u,"mousemove",r,t,n)}}e.EditorMouseEventFactory=c;class o{constructor(u){this._editorViewDomNode=u}_create(u){return new p(u,this._editorViewDomNode)}onPointerUp(u,r){return b.addDisposableListener(u,"pointerup",i=>{r(this._create(i))})}onPointerDown(u,r){return b.addDisposableListener(u,"pointerdown",i=>{r(this._create(i))})}onPointerLeave(u,r){return b.addDisposableNonBubblingPointerOutListener(u,i=>{r(this._create(i))})}onPointerMoveThrottled(u,r,i,n){const t=(l,h)=>i(l,this._create(h));return b.addDisposableThrottledListener(u,"pointermove",r,t,n)}}e.EditorPointerEventFactory=o;class s extends w.Disposable{constructor(u){super();this._editorViewDomNode=u,this._globalMouseMoveMonitor=this._register(new N.GlobalMouseMoveMonitor),this._keydownListener=null}startMonitoring(u,r,i,n,t){this._keydownListener=b.addStandardDisposableListener(document,"keydown",h=>{h.toKeybinding().isModifierKey()||this._globalMouseMoveMonitor.stopMonitoring(!0,h.browserEvent)},!0);const l=(h,m)=>i(h,new p(m,this._editorViewDomNode));this._globalMouseMoveMonitor.startMonitoring(u,r,l,n,h=>{this._keydownListener.dispose(),t(h)})}stopMonitoring(){this._globalMouseMoveMonitor.stopMonitoring(!0)}}e.GlobalEditorMouseMoveMonitor=s}),define(Q[362],J([0,1,6,2]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractCodeEditorService=void 0;class M extends N.Disposable{constructor(){super();this._onCodeEditorAdd=this._register(new b.Emitter),this.onCodeEditorAdd=this._onCodeEditorAdd.event,this._onCodeEditorRemove=this._register(new b.Emitter),this.onCodeEditorRemove=this._onCodeEditorRemove.event,this._onDiffEditorAdd=this._register(new b.Emitter),this._onDiffEditorRemove=this._register(new b.Emitter),this._onDecorationTypeRegistered=this._register(new b.Emitter),this._modelProperties=new Map,this._codeEditors=Object.create(null),this._diffEditors=Object.create(null)}addCodeEditor(S){this._codeEditors[S.getId()]=S,this._onCodeEditorAdd.fire(S)}removeCodeEditor(S){delete this._codeEditors[S.getId()]&&this._onCodeEditorRemove.fire(S)}listCodeEditors(){return Object.keys(this._codeEditors).map(S=>this._codeEditors[S])}addDiffEditor(S){this._diffEditors[S.getId()]=S,this._onDiffEditorAdd.fire(S)}removeDiffEditor(S){delete this._diffEditors[S.getId()]&&this._onDiffEditorRemove.fire(S)}listDiffEditors(){return Object.keys(this._diffEditors).map(S=>this._diffEditors[S])}getFocusedCodeEditor(){let S=null;const C=this.listCodeEditors();for(const d of C){if(d.hasTextFocus())return d;d.hasWidgetFocus()&&(S=d)}return S}setModelProperty(S,C,d){const g=S.toString();let p;this._modelProperties.has(g)?p=this._modelProperties.get(g):(p=new Map,this._modelProperties.set(g,p)),p.set(C,d)}getModelProperty(S,C){const d=S.toString();if(this._modelProperties.has(d))return this._modelProperties.get(d).get(C)}}e.AbstractCodeEditorService=M}),define(Q[213],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCharIndex=e.allCharCodes=void 0,e.allCharCodes=(()=>{const N=[];for(let M=32;M<=126;M++)N.push(M);return N.push(65533),N})();const b=(N,M)=>(N-=32,N<0||N>96?M<=2?(N+96)%96:96-1:N);e.getCharIndex=b}),define(Q[363],J([0,1,213,122]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapCharRenderer=void 0;class M{constructor(S,C){this.scale=C,this.charDataNormal=M.soften(S,12/15),this.charDataLight=M.soften(S,50/60)}static soften(S,C){let d=new Uint8ClampedArray(S.length);for(let g=0,p=S.length;gS.width||d+i>S.height){console.warn("bad render request outside image data");return}const n=s?this.charDataLight:this.charDataNormal,t=b.getCharIndex(g,o),l=S.width*4,h=c.r,m=c.g,_=c.b,f=p.r-h,v=p.g-m,y=p.b-_,L=S.data;let I=t*u*r,k=d*l+C*4;for(let E=0;ES.width||d+u>S.height){console.warn("bad render request outside image data");return}const r=S.width*4,i=.5,n=p.r,t=p.g,l=p.b,h=g.r-n,m=g.g-t,_=g.b-l,f=n+h*i,v=t+m*i,y=l+_*i,L=S.data;let I=d*r+C*4;for(let k=0;k{const S=new Uint8ClampedArray(w.length/2);for(let C=0;C>1]=N[w[C]]<<4|N[w[C+1]]&15;return S};e.prebakedMiniMaps={1:b.once(()=>M("0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792")),2:b.once(()=>M("000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126"))}}),define(Q[365],J([0,1,363,213,364,122]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapCharRendererFactory=void 0;class S{static create(d,g){if(this.lastCreated&&d===this.lastCreated.scale&&g===this.lastFontFamily)return this.lastCreated;let p;return M.prebakedMiniMaps[d]?p=new b.MinimapCharRenderer(M.prebakedMiniMaps[d](),d):p=S.createFromSampleData(S.createSampleData(g).data,d),this.lastFontFamily=g,this.lastCreated=p,p}static createSampleData(d){const g=document.createElement("canvas"),p=g.getContext("2d");g.style.height=`${16}px`,g.height=16,g.width=96*10,g.style.width=96*10+"px",p.fillStyle="#ffffff",p.font=`bold ${16}px ${d}`,p.textBaseline="middle";let c=0;for(const o of N.allCharCodes)p.fillText(String.fromCharCode(o),c,16/2),c+=10;return p.getImageData(0,0,96*10,16)}static createFromSampleData(d,g){const p=16*10*4*96;if(d.length!==p)throw new Error("Unexpected source in MinimapCharRenderer");let c=S._downsample(d,g);return new b.MinimapCharRenderer(c,g)}static _downsampleChar(d,g,p,c,o){const s=1*o,a=2*o;let u=c,r=0;for(let i=0;i0){const r=255/u;for(let i=0;i=0&&S<256?this._asciiMap[S]=d:this._map.set(S,d)}get(S){return S>=0&&S<256?this._asciiMap[S]:this._map.get(S)||this._defaultValue}}e.CharacterClassifier=N;class M{constructor(){this._actual=new N(0)}add(S){this._actual.set(S,1)}has(S){return this._actual.get(S)===1}}e.CharacterSet=M}),define(Q[106],J([0,1,91]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getMapForWordSeparators=e.WordCharacterClassifier=void 0;class N extends b.CharacterClassifier{constructor(S){super(0);for(let C=0,d=S.length;C(S.hasOwnProperty(C)||(S[C]=w(C)),S[C])}e.getMapForWordSeparators=M(w=>new N(w))}),define(Q[14],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Position=void 0;class b{constructor(M,w){this.lineNumber=M,this.column=w}with(M=this.lineNumber,w=this.column){return M===this.lineNumber&&w===this.column?this:new b(M,w)}delta(M=0,w=0){return this.with(this.lineNumber+M,this.column+w)}equals(M){return b.equals(this,M)}static equals(M,w){return!M&&!w?!0:!!M&&!!w&&M.lineNumber===w.lineNumber&&M.column===w.column}isBefore(M){return b.isBefore(this,M)}static isBefore(M,w){return M.lineNumberC||w===C&&S>d?(this.startLineNumber=C,this.startColumn=d,this.endLineNumber=w,this.endColumn=S):(this.startLineNumber=w,this.startColumn=S,this.endLineNumber=C,this.endColumn=d)}isEmpty(){return N.isEmpty(this)}static isEmpty(w){return w.startLineNumber===w.endLineNumber&&w.startColumn===w.endColumn}containsPosition(w){return N.containsPosition(this,w)}static containsPosition(w,S){return!(S.lineNumberw.endLineNumber||S.lineNumber===w.startLineNumber&&S.columnw.endColumn)}containsRange(w){return N.containsRange(this,w)}static containsRange(w,S){return!(S.startLineNumberw.endLineNumber||S.endLineNumber>w.endLineNumber||S.startLineNumber===w.startLineNumber&&S.startColumnw.endColumn)}strictContainsRange(w){return N.strictContainsRange(this,w)}static strictContainsRange(w,S){return!(S.startLineNumberw.endLineNumber||S.endLineNumber>w.endLineNumber||S.startLineNumber===w.startLineNumber&&S.startColumn<=w.startColumn||S.endLineNumber===w.endLineNumber&&S.endColumn>=w.endColumn)}plusRange(w){return N.plusRange(this,w)}static plusRange(w,S){let C,d,g,p;return S.startLineNumberw.endLineNumber?(g=S.endLineNumber,p=S.endColumn):S.endLineNumber===w.endLineNumber?(g=S.endLineNumber,p=Math.max(S.endColumn,w.endColumn)):(g=w.endLineNumber,p=w.endColumn),new N(C,d,g,p)}intersectRanges(w){return N.intersectRanges(this,w)}static intersectRanges(w,S){let C=w.startLineNumber,d=w.startColumn,g=w.endLineNumber,p=w.endColumn,c=S.startLineNumber,o=S.startColumn,s=S.endLineNumber,a=S.endColumn;return Cs?(g=s,p=a):g===s&&(p=Math.min(p,a)),C>g||C===g&&d>p?null:new N(C,d,g,p)}equalsRange(w){return N.equalsRange(this,w)}static equalsRange(w,S){return!!w&&!!S&&w.startLineNumber===S.startLineNumber&&w.startColumn===S.startColumn&&w.endLineNumber===S.endLineNumber&&w.endColumn===S.endColumn}getEndPosition(){return N.getEndPosition(this)}static getEndPosition(w){return new b.Position(w.endLineNumber,w.endColumn)}getStartPosition(){return N.getStartPosition(this)}static getStartPosition(w){return new b.Position(w.startLineNumber,w.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(w,S){return new N(this.startLineNumber,this.startColumn,w,S)}setStartPosition(w,S){return new N(w,S,this.endLineNumber,this.endColumn)}collapseToStart(){return N.collapseToStart(this)}static collapseToStart(w){return new N(w.startLineNumber,w.startColumn,w.startLineNumber,w.startColumn)}static fromPositions(w,S=w){return new N(w.lineNumber,w.column,S.lineNumber,S.column)}static lift(w){return w?new N(w.startLineNumber,w.startColumn,w.endLineNumber,w.endColumn):null}static isIRange(w){return w&&typeof w.startLineNumber=="number"&&typeof w.startColumn=="number"&&typeof w.endLineNumber=="number"&&typeof w.endColumn=="number"}static areIntersectingOrTouching(w,S){return!(w.endLineNumberw.startLineNumber}}e.Range=N}),define(Q[214],J([0,1,8,14,3]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PagedScreenReaderStrategy=e.TextAreaState=e._debugComposition=void 0,e._debugComposition=!1;class w{constructor(d,g,p,c,o){this.value=d,this.selectionStart=g,this.selectionEnd=p,this.selectionStartPosition=c,this.selectionEndPosition=o}toString(){return"[ <"+this.value+">, selectionStart: "+this.selectionStart+", selectionEnd: "+this.selectionEnd+"]"}static readFromTextArea(d){return new w(d.getValue(),d.getSelectionStart(),d.getSelectionEnd(),null,null)}collapseSelection(){return new w(this.value,this.value.length,this.value.length,null,null)}writeToTextArea(d,g,p){e._debugComposition&&console.log("writeToTextArea "+d+": "+this.toString()),g.setValue(d,this.value),p&&g.setSelectionRange(d,this.selectionStart,this.selectionEnd)}deduceEditorPosition(d){if(d<=this.selectionStart){const c=this.value.substring(d,this.selectionStart);return this._finishDeduceEditorPosition(this.selectionStartPosition,c,-1)}if(d>=this.selectionEnd){const c=this.value.substring(this.selectionEnd,d);return this._finishDeduceEditorPosition(this.selectionEndPosition,c,1)}const g=this.value.substring(this.selectionStart,d);if(g.indexOf(String.fromCharCode(8230))===-1)return this._finishDeduceEditorPosition(this.selectionStartPosition,g,1);const p=this.value.substring(d,this.selectionEnd);return this._finishDeduceEditorPosition(this.selectionEndPosition,p,-1)}_finishDeduceEditorPosition(d,g,p){let c=0,o=-1;for(;(o=g.indexOf(` +`,o+1))!==-1;)c++;return[d,p*g.length,c]}static selectedText(d){return new w(d,0,d.length,null,null)}static deduceInput(d,g,p){if(!d)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};e._debugComposition&&(console.log("------------------------deduceInput"),console.log("PREVIOUS STATE: "+d.toString()),console.log("CURRENT STATE: "+g.toString()));let c=d.value,o=d.selectionStart,s=d.selectionEnd,a=g.value,u=g.selectionStart,r=g.selectionEnd;const i=c.substring(s),n=a.substring(r),t=b.commonSuffixLength(i,n);a=a.substring(0,a.length-t),c=c.substring(0,c.length-t);const l=c.substring(0,o),h=a.substring(0,u),m=b.commonPrefixLength(l,h);if(a=a.substring(m),c=c.substring(m),u-=m,o-=m,r-=m,s-=m,e._debugComposition&&(console.log("AFTER DIFFING PREVIOUS STATE: <"+c+">, selectionStart: "+o+", selectionEnd: "+s),console.log("AFTER DIFFING CURRENT STATE: <"+a+">, selectionStart: "+u+", selectionEnd: "+r)),p&&u===r&&c.length>0){let f=null;if(u===a.length?a.startsWith(c)&&(f=a.substring(c.length)):a.endsWith(c)&&(f=a.substring(0,a.length-c.length)),f!==null&&f.length>0&&(/\uFE0F/.test(f)||b.containsEmoji(f)))return{text:f,replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0}}if(u===r){if(c===a&&o===0&&s===c.length&&u===a.length&&a.indexOf(` +`)===-1&&b.containsFullWidthCharacter(a))return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};const f=l.length-m;return e._debugComposition&&console.log("REMOVE PREVIOUS: "+(l.length-m)+" chars"),{text:a,replacePrevCharCnt:f,replaceNextCharCnt:0,positionDelta:0}}const _=s-o;return{text:a,replacePrevCharCnt:_,replaceNextCharCnt:0,positionDelta:0}}static deduceAndroidCompositionInput(d,g){if(!d)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};if(e._debugComposition&&(console.log("------------------------deduceAndroidCompositionInput"),console.log("PREVIOUS STATE: "+d.toString()),console.log("CURRENT STATE: "+g.toString())),d.value===g.value)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:g.selectionEnd-d.selectionEnd};const p=Math.min(b.commonPrefixLength(d.value,g.value),d.selectionEnd),c=Math.min(b.commonSuffixLength(d.value,g.value),d.value.length-d.selectionEnd),o=d.value.substring(p,d.value.length-c),s=g.value.substring(p,g.value.length-c),a=d.selectionStart-p,u=d.selectionEnd-p,r=g.selectionStart-p,i=g.selectionEnd-p;return e._debugComposition&&(console.log("AFTER DIFFING PREVIOUS STATE: <"+o+">, selectionStart: "+a+", selectionEnd: "+u),console.log("AFTER DIFFING CURRENT STATE: <"+s+">, selectionStart: "+r+", selectionEnd: "+i)),{text:s,replacePrevCharCnt:u,replaceNextCharCnt:o.length-u,positionDelta:i-s.length}}}e.TextAreaState=w,w.EMPTY=new w("",0,0,null,null);class S{static _getPageOfLine(d,g){return Math.floor((d-1)/g)}static _getRangeForPage(d,g){const p=d*g,c=p+1,o=p+g;return new M.Range(c,1,o+1,1)}static fromEditorSelection(d,g,p,c,o){const s=S._getPageOfLine(p.startLineNumber,c),a=S._getRangeForPage(s,c),u=S._getPageOfLine(p.endLineNumber,c),r=S._getRangeForPage(u,c),i=a.intersectRanges(new M.Range(1,1,p.startLineNumber,p.startColumn));let n=g.getValueInRange(i,1);const t=g.getLineCount(),l=g.getLineMaxColumn(t),h=r.intersectRanges(new M.Range(p.endLineNumber,p.endColumn,t,l));let m=g.getValueInRange(h,1),_;if(s===u||s+1===u)_=g.getValueInRange(p,1);else{const f=a.intersectRanges(p),v=r.intersectRanges(p);_=g.getValueInRange(f,1)+String.fromCharCode(8230)+g.getValueInRange(v,1)}if(o){const f=500;n.length>f&&(n=n.substring(n.length-f,n.length)),m.length>f&&(m=m.substring(0,f)),_.length>2*f&&(_=_.substring(0,f)+String.fromCharCode(8230)+_.substring(_.length-f,_.length))}return new w(n+_+m,n.length,n.length+_.length,new N.Position(p.startLineNumber,p.startColumn),new N.Position(p.endLineNumber,p.endColumn))}}e.PagedScreenReaderStrategy=S}),define(Q[215],J([0,1,195,6,2,40,3]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffNavigator=void 0;const C={followsCaret:!0,ignoreCharChanges:!0,alwaysRevealFirst:!0};class d extends M.Disposable{constructor(p,c={}){super();this._onDidUpdate=this._register(new N.Emitter),this._editor=p,this._options=w.mixin(c,C,!1),this.disposed=!1,this.nextIdx=-1,this.ranges=[],this.ignoreSelectionChange=!1,this.revealFirst=Boolean(this._options.alwaysRevealFirst),this._register(this._editor.onDidDispose(()=>this.dispose())),this._register(this._editor.onDidUpdateDiff(()=>this._onDiffUpdated())),this._options.followsCaret&&this._register(this._editor.getModifiedEditor().onDidChangeCursorPosition(o=>{this.ignoreSelectionChange||(this.nextIdx=-1)})),this._options.alwaysRevealFirst&&this._register(this._editor.getModifiedEditor().onDidChangeModel(o=>{this.revealFirst=!0})),this._init()}_init(){!!this._editor.getLineChanges()}_onDiffUpdated(){this._init(),this._compute(this._editor.getLineChanges()),this.revealFirst&&this._editor.getLineChanges()!==null&&(this.revealFirst=!1,this.nextIdx=-1,this.next(1))}_compute(p){this.ranges=[],p&&p.forEach(c=>{!this._options.ignoreCharChanges&&c.charChanges?c.charChanges.forEach(o=>{this.ranges.push({rhs:!0,range:new S.Range(o.modifiedStartLineNumber,o.modifiedStartColumn,o.modifiedEndLineNumber,o.modifiedEndColumn)})}):this.ranges.push({rhs:!0,range:new S.Range(c.modifiedStartLineNumber,1,c.modifiedStartLineNumber,1)})}),this.ranges.sort((c,o)=>c.range.getStartPosition().isBeforeOrEqual(o.range.getStartPosition())?-1:o.range.getStartPosition().isBeforeOrEqual(c.range.getStartPosition())?1:0),this._onDidUpdate.fire(this)}_initIdx(p){let c=!1,o=this._editor.getPosition();if(!o){this.nextIdx=0;return}for(let s=0,a=this.ranges.length;s=this.ranges.length&&(this.nextIdx=0)):(this.nextIdx-=1,this.nextIdx<0&&(this.nextIdx=this.ranges.length-1));let o=this.ranges[this.nextIdx];this.ignoreSelectionChange=!0;try{let s=o.range.getStartPosition();this._editor.setPosition(s),this._editor.revealPositionInCenter(s,c)}finally{this.ignoreSelectionChange=!1}}}canNavigate(){return this.ranges&&this.ranges.length>0}next(p=0){this._move(!0,p)}previous(p=0){this._move(!1,p)}dispose(){super.dispose(),this.ranges=[],this.disposed=!0}}e.DiffNavigator=d}),define(Q[62],J([0,1,3]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditOperation=void 0;class N{static insert(w,S){return{range:new b.Range(w.lineNumber,w.column,w.lineNumber,w.column),text:S,forceMoveMarkers:!0}}static delete(w){return{range:w,text:null}}static replace(w,S){return{range:w,text:S}}static replaceMove(w,S){return{range:w,text:S,forceMoveMarkers:!0}}}e.EditOperation=N}),define(Q[366],J([0,1,8,62,3]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.trimTrailingWhitespace=e.TrimTrailingWhitespaceCommand=void 0;class w{constructor(d,g){this._selection=d,this._cursors=g,this._selectionId=null}getEditOperations(d,g){let p=S(d,this._cursors);for(let c=0,o=p.length;cs.lineNumber===a.lineNumber?s.column-a.column:s.lineNumber-a.lineNumber);for(let s=d.length-2;s>=0;s--)d[s].lineNumber===d[s+1].lineNumber&&d.splice(s,1);let g=[],p=0,c=0,o=d.length;for(let s=1,a=C.getLineCount();s<=a;s++){let u=C.getLineContent(s),r=u.length+1,i=0;if(!(c255?255:M|0}}e.RGBA8=b,b.Empty=new b(0,0,0,0)}),define(Q[21],J([0,1,14,3]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Selection=void 0;class M extends N.Range{constructor(S,C,d,g){super(S,C,d,g);this.selectionStartLineNumber=S,this.selectionStartColumn=C,this.positionLineNumber=d,this.positionColumn=g}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(S){return M.selectionsEqual(this,S)}static selectionsEqual(S,C){return S.selectionStartLineNumber===C.selectionStartLineNumber&&S.selectionStartColumn===C.selectionStartColumn&&S.positionLineNumber===C.positionLineNumber&&S.positionColumn===C.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(S,C){return this.getDirection()===0?new M(this.startLineNumber,this.startColumn,S,C):new M(S,C,this.startLineNumber,this.startColumn)}getPosition(){return new b.Position(this.positionLineNumber,this.positionColumn)}setStartPosition(S,C){return this.getDirection()===0?new M(S,C,this.endLineNumber,this.endColumn):new M(this.endLineNumber,this.endColumn,S,C)}static fromPositions(S,C=S){return new M(S.lineNumber,S.column,C.lineNumber,C.column)}static liftSelection(S){return new M(S.selectionStartLineNumber,S.selectionStartColumn,S.positionLineNumber,S.positionColumn)}static selectionsArrEqual(S,C){if(S&&!C||!S&&C)return!1;if(!S&&!C)return!0;if(S.length!==C.length)return!1;for(let d=0,g=S.length;dthis._onCut.fire(),0)),this._asyncFocusGainWriteScreenReaderContent=this._register(new M.RunOnceScheduler(()=>this.writeScreenReaderContent("asyncFocusGain"),0)),this._textAreaState=g.TextAreaState.EMPTY,this._selectionChangeListener=null,this.writeScreenReaderContent("ctor"),this._hasFocus=!1,this._isDoingComposition=!1,this._nextCommand=0;let l=null;this._register(N.addStandardDisposableListener(t.domNode,"keydown",f=>{(f.keyCode===109||this._isDoingComposition&&f.keyCode===1)&&f.stopPropagation(),f.equals(9)&&f.preventDefault(),l=f,this._onKeyDown.fire(f)})),this._register(N.addStandardDisposableListener(t.domNode,"keyup",f=>{this._onKeyUp.fire(f)})),this._register(N.addDisposableListener(t.domNode,"compositionstart",f=>{if(g._debugComposition&&console.log("[compositionstart]",f),!this._isDoingComposition){if(this._isDoingComposition=!0,C.isMacintosh&&this._textAreaState.selectionStart===this._textAreaState.selectionEnd&&this._textAreaState.selectionStart>0&&this._textAreaState.value.substr(this._textAreaState.selectionStart-1,1)===f.data&&(l&&l.equals(109)&&(l.code==="ArrowRight"||l.code==="ArrowLeft")||b.isFirefox)){g._debugComposition&&console.log("[compositionstart] Handling long press case on macOS + arrow key or Firefox",f),this._textAreaState=new g.TextAreaState(this._textAreaState.value,this._textAreaState.selectionStart-1,this._textAreaState.selectionEnd,this._textAreaState.selectionStartPosition?new p.Position(this._textAreaState.selectionStartPosition.lineNumber,this._textAreaState.selectionStartPosition.column-1):null,this._textAreaState.selectionEndPosition),this._onCompositionStart.fire({revealDeltaColumns:-1});return}if(b.isAndroid){this._onCompositionStart.fire({revealDeltaColumns:-this._textAreaState.selectionStart});return}this._setAndWriteTextAreaState("compositionstart",g.TextAreaState.EMPTY),this._onCompositionStart.fire({revealDeltaColumns:0})}}));const h=f=>{const v=this._textAreaState,y=g.TextAreaState.readFromTextArea(this._textArea);return[y,g.TextAreaState.deduceInput(v,y,f)]},m=()=>{const f=this._textAreaState,v=g.TextAreaState.readFromTextArea(this._textArea);return[v,g.TextAreaState.deduceAndroidCompositionInput(f,v)]},_=f=>{const v=this._textAreaState,y=g.TextAreaState.selectedText(f),L={text:y.value,replacePrevCharCnt:v.selectionEnd-v.selectionStart,replaceNextCharCnt:0,positionDelta:0};return[y,L]};this._register(N.addDisposableListener(t.domNode,"compositionupdate",f=>{if(g._debugComposition&&console.log("[compositionupdate]",f),b.isAndroid){const[L,I]=m();this._textAreaState=L,this._onType.fire(I),this._onCompositionUpdate.fire(f);return}const[v,y]=_(f.data||"");this._textAreaState=v,this._onType.fire(y),this._onCompositionUpdate.fire(f)})),this._register(N.addDisposableListener(t.domNode,"compositionend",f=>{if(g._debugComposition&&console.log("[compositionend]",f),!!this._isDoingComposition){if(this._isDoingComposition=!1,b.isAndroid){const[L,I]=m();this._textAreaState=L,this._onType.fire(I),this._onCompositionEnd.fire();return}const[v,y]=_(f.data||"");this._textAreaState=v,this._onType.fire(y),(b.isChrome||b.isFirefox)&&(this._textAreaState=g.TextAreaState.readFromTextArea(this._textArea)),this._onCompositionEnd.fire()}})),this._register(N.addDisposableListener(t.domNode,"input",()=>{if(this._textArea.setIgnoreSelectionChangeTime("received input event"),!this._isDoingComposition){const[f,v]=h(C.isMacintosh);v.replacePrevCharCnt===0&&v.text.length===1&&d.isHighSurrogate(v.text.charCodeAt(0))||(this._textAreaState=f,this._nextCommand===0?(v.text!==""||v.replacePrevCharCnt!==0)&&this._onType.fire(v):((v.text!==""||v.replacePrevCharCnt!==0)&&this._firePaste(v.text,null),this._nextCommand=0))}})),this._register(N.addDisposableListener(t.domNode,"cut",f=>{this._textArea.setIgnoreSelectionChangeTime("received cut event"),this._ensureClipboardGetsEditorSelection(f),this._asyncTriggerCut.schedule()})),this._register(N.addDisposableListener(t.domNode,"copy",f=>{this._ensureClipboardGetsEditorSelection(f)})),this._register(N.addDisposableListener(t.domNode,"paste",f=>{if(this._textArea.setIgnoreSelectionChangeTime("received paste event"),u.canUseTextData(f)){const[v,y]=u.getTextData(f);v!==""&&this._firePaste(v,y)}else this._textArea.getSelectionStart()!==this._textArea.getSelectionEnd()&&this._setAndWriteTextAreaState("paste",g.TextAreaState.EMPTY),this._nextCommand=1})),this._register(N.addDisposableListener(t.domNode,"focus",()=>{const f=this._hasFocus;this._setHasFocus(!0),b.isSafari&&!f&&this._hasFocus&&this._asyncFocusGainWriteScreenReaderContent.schedule()})),this._register(N.addDisposableListener(t.domNode,"blur",()=>{this._isDoingComposition&&(this._isDoingComposition=!1,this.writeScreenReaderContent("blurWithoutCompositionEnd"),this._onCompositionEnd.fire()),this._setHasFocus(!1)})),this._register(N.addDisposableListener(t.domNode,o.Tap,()=>{b.isAndroid&&this._isDoingComposition&&(this._isDoingComposition=!1,this.writeScreenReaderContent("tapWithoutCompositionEnd"),this._onCompositionEnd.fire())}))}_installSelectionChangeListener(){let n=0;return N.addDisposableListener(document,"selectionchange",t=>{if(!!this._hasFocus&&!this._isDoingComposition&&!!b.isChrome){const l=Date.now(),h=l-n;if(n=l,!(h<5)){const m=l-this._textArea.getIgnoreSelectionChangeTime();if(this._textArea.resetSelectionChangeTime(),!(m<100)&&!(!this._textAreaState.selectionStartPosition||!this._textAreaState.selectionEndPosition)){const _=this._textArea.getValue();if(this._textAreaState.value===_){const f=this._textArea.getSelectionStart(),v=this._textArea.getSelectionEnd();if(!(this._textAreaState.selectionStart===f&&this._textAreaState.selectionEnd===v)){const y=this._textAreaState.deduceEditorPosition(f),L=this._host.deduceModelPosition(y[0],y[1],y[2]),I=this._textAreaState.deduceEditorPosition(v),k=this._host.deduceModelPosition(I[0],I[1],I[2]),E=new c.Selection(L.lineNumber,L.column,k.lineNumber,k.column);this._onSelectionChangeRequest.fire(E)}}}}}})}dispose(){super.dispose(),this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null)}focusTextArea(){this._setHasFocus(!0),this.refreshFocusState()}isFocused(){return this._hasFocus}refreshFocusState(){const n=N.getShadowRoot(this.textArea.domNode);n?this._setHasFocus(n.activeElement===this.textArea.domNode):N.isInDOM(this.textArea.domNode)?this._setHasFocus(document.activeElement===this.textArea.domNode):this._setHasFocus(!1)}_setHasFocus(n){this._hasFocus!==n&&(this._hasFocus=n,this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null),this._hasFocus&&(this._selectionChangeListener=this._installSelectionChangeListener()),this._hasFocus&&this.writeScreenReaderContent("focusgain"),this._hasFocus?this._onFocus.fire():this._onBlur.fire())}_setAndWriteTextAreaState(n,t){this._hasFocus||(t=t.collapseSelection()),t.writeToTextArea(n,this._textArea,this._hasFocus),this._textAreaState=t}writeScreenReaderContent(n){this._isDoingComposition||this._setAndWriteTextAreaState(n,this._host.getScreenReaderContent(this._textAreaState))}_ensureClipboardGetsEditorSelection(n){const t=this._host.getDataToCopy(u.canUseTextData(n)),l={version:1,isFromEmptySelection:t.isFromEmptySelection,multicursorText:t.multicursorText,mode:t.mode};if(s.INSTANCE.set(b.isFirefox?t.text.replace(/\r\n/g,` +`):t.text,l),!u.canUseTextData(n)){this._setAndWriteTextAreaState("copy or cut",g.TextAreaState.selectedText(t.text));return}u.setTextData(n,t.text,t.html,l)}_firePaste(n,t){t||(t=s.INSTANCE.get(n)),this._onPaste.fire({text:n,metadata:t})}}e.TextAreaInput=a;class u{static canUseTextData(n){return!!(n.clipboardData||window.clipboardData)}static getTextData(n){if(n.clipboardData){n.preventDefault();const t=n.clipboardData.getData("text/plain");let l=null;const h=n.clipboardData.getData("vscode-editor-data");if(typeof h=="string")try{l=JSON.parse(h),l.version!==1&&(l=null)}catch(m){}return[t,l]}if(window.clipboardData)return n.preventDefault(),[window.clipboardData.getData("Text"),null];throw new Error("ClipboardEventUtils.getTextData: Cannot use text data!")}static setTextData(n,t,l,h){if(n.clipboardData){n.clipboardData.setData("text/plain",t),typeof l=="string"&&n.clipboardData.setData("text/html",l),n.clipboardData.setData("vscode-editor-data",JSON.stringify(h)),n.preventDefault();return}if(window.clipboardData){window.clipboardData.setData("Text",t),n.preventDefault();return}throw new Error("ClipboardEventUtils.setTextData: Cannot use text data!")}}class r extends S.Disposable{constructor(n){super();this._actual=n,this._ignoreSelectionChangeTime=0}setIgnoreSelectionChangeTime(n){this._ignoreSelectionChangeTime=Date.now()}getIgnoreSelectionChangeTime(){return this._ignoreSelectionChangeTime}resetSelectionChangeTime(){this._ignoreSelectionChangeTime=0}getValue(){return this._actual.domNode.value}setValue(n,t){const l=this._actual.domNode;l.value!==t&&(this.setIgnoreSelectionChangeTime("setValue"),l.value=t)}getSelectionStart(){return this._actual.domNode.selectionDirection==="backward"?this._actual.domNode.selectionEnd:this._actual.domNode.selectionStart}getSelectionEnd(){return this._actual.domNode.selectionDirection==="backward"?this._actual.domNode.selectionStart:this._actual.domNode.selectionEnd}setSelectionRange(n,t,l){const h=this._actual.domNode;let m=null;const _=N.getShadowRoot(h);_?m=_.activeElement:m=document.activeElement;const f=m===h,v=h.selectionStart,y=h.selectionEnd;if(f&&v===t&&y===l){b.isFirefox&&window.parent!==window&&h.focus();return}if(f){this.setIgnoreSelectionChangeTime("setSelectionRange"),h.setSelectionRange(t,l),b.isFirefox&&window.parent!==window&&h.focus();return}try{const L=N.saveParentsScrollTop(h);this.setIgnoreSelectionChangeTime("setSelectionRange"),h.focus(),h.setSelectionRange(t,l),N.restoreParentsScrollTop(h,L)}catch(L){}}}}),define(Q[92],J([0,1,21]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceCommandThatPreservesSelection=e.ReplaceCommandWithOffsetCursorState=e.ReplaceCommandWithoutChangingPosition=e.ReplaceCommandThatSelectsText=e.ReplaceCommand=void 0;class N{constructor(g,p,c=!1){this._range=g,this._text=p,this.insertsAutoWhitespace=c}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(g,p){let o=p.getInverseEditOperations()[0].range;return new b.Selection(o.endLineNumber,o.endColumn,o.endLineNumber,o.endColumn)}}e.ReplaceCommand=N;class M{constructor(g,p){this._range=g,this._text=p}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(g,p){const o=p.getInverseEditOperations()[0].range;return new b.Selection(o.startLineNumber,o.startColumn,o.endLineNumber,o.endColumn)}}e.ReplaceCommandThatSelectsText=M;class w{constructor(g,p,c=!1){this._range=g,this._text=p,this.insertsAutoWhitespace=c}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(g,p){let o=p.getInverseEditOperations()[0].range;return new b.Selection(o.startLineNumber,o.startColumn,o.startLineNumber,o.startColumn)}}e.ReplaceCommandWithoutChangingPosition=w;class S{constructor(g,p,c,o,s=!1){this._range=g,this._text=p,this._columnDeltaOffset=o,this._lineNumberDeltaOffset=c,this.insertsAutoWhitespace=s}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(g,p){let o=p.getInverseEditOperations()[0].range;return new b.Selection(o.endLineNumber+this._lineNumberDeltaOffset,o.endColumn+this._columnDeltaOffset,o.endLineNumber+this._lineNumberDeltaOffset,o.endColumn+this._columnDeltaOffset)}}e.ReplaceCommandWithOffsetCursorState=S;class C{constructor(g,p,c,o=!1){this._range=g,this._text=p,this._initialSelection=c,this._forceMoveMarkers=o,this._selectionId=null}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text,this._forceMoveMarkers),this._selectionId=p.trackSelection(this._initialSelection)}computeCursorState(g,p){return p.getTrackedSelection(this._selectionId)}}e.ReplaceCommandThatPreservesSelection=C}),define(Q[367],J([0,1,3,21]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SurroundSelectionCommand=void 0;class M{constructor(S,C,d){this._range=S,this._charBeforeSelection=C,this._charAfterSelection=d}getEditOperations(S,C){C.addTrackedEditOperation(new b.Range(this._range.startLineNumber,this._range.startColumn,this._range.startLineNumber,this._range.startColumn),this._charBeforeSelection),C.addTrackedEditOperation(new b.Range(this._range.endLineNumber,this._range.endColumn,this._range.endLineNumber,this._range.endColumn),this._charAfterSelection)}computeCursorState(S,C){let d=C.getInverseEditOperations(),g=d[0].range,p=d[1].range;return new N.Selection(g.endLineNumber,g.endColumn,p.endLineNumber,p.endColumn-this._charAfterSelection.length)}}e.SurroundSelectionCommand=M}),define(Q[93],J([0,1,8,17,101]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decodeUTF16LE=e.createStringBuilder=e.hasTextDecoder=e.getPlatformTextDecoder=void 0;let w;function S(){return w||(w=new TextDecoder(N.isLittleEndian()?"UTF-16LE":"UTF-16BE")),w}e.getPlatformTextDecoder=S,e.hasTextDecoder=typeof TextDecoder!="undefined",e.hasTextDecoder?(e.createStringBuilder=c=>new g(c),e.decodeUTF16LE=C):(e.createStringBuilder=c=>new p,e.decodeUTF16LE=d);function C(c,o,s){const a=new Uint16Array(c.buffer,o,s);return S().decode(a)}function d(c,o,s){let a=[],u=0;for(let r=0;r=this._capacity){this._flushBuffer(),this._completedStrings[this._completedStrings.length]=o;return}for(let a=0;a=this._lines.length)throw new Error("Illegal value for lineNumber");return this._lines[p]}onLinesDeleted(g,p){if(this.getCount()===0)return null;const c=this.getStartLineNumber(),o=this.getEndLineNumber();if(po)return null;let s=0,a=0;for(let r=c;r<=o;r++){const i=r-this._rendLineNumberStart;g<=r&&r<=p&&(a===0?(s=i,a=1):a++)}if(g=c&&a<=o&&(this._lines[a-this._rendLineNumberStart].onContentChanged(),s=!0);return s}onLinesInserted(g,p){if(this.getCount()===0)return null;const c=p-g+1,o=this.getStartLineNumber(),s=this.getEndLineNumber();if(g<=o)return this._rendLineNumberStart+=c,null;if(g>s)return null;if(c+g>s)return this._lines.splice(g-this._rendLineNumberStart,s-g+1);const a=[];for(let t=0;tc)){const r=Math.max(p,u.fromLineNumber),i=Math.min(c,u.toLineNumber);for(let n=r;n<=i;n++){const t=n-this._rendLineNumberStart;this._lines[t].onTokensChanged(),o=!0}}}return o}}e.RenderedLinesCollection=w;class S{constructor(g){this._host=g,this.domNode=this._createDomNode(),this._linesCollection=new w(()=>this._host.createVisibleLine())}_createDomNode(){const g=b.createFastDomNode(document.createElement("div"));return g.setClassName("view-layer"),g.setPosition("absolute"),g.domNode.setAttribute("role","presentation"),g.domNode.setAttribute("aria-hidden","true"),g}onConfigurationChanged(g){return!!g.hasChanged(124)}onFlushed(g){return this._linesCollection.flush(),!0}onLinesChanged(g){return this._linesCollection.onLinesChanged(g.fromLineNumber,g.toLineNumber)}onLinesDeleted(g){const p=this._linesCollection.onLinesDeleted(g.fromLineNumber,g.toLineNumber);if(p)for(let c=0,o=p.length;cp){const a=p,u=Math.min(c,s.rendLineNumberStart-1);a<=u&&(this._insertLinesBefore(s,a,u,o,p),s.linesLength+=u-a+1)}else if(s.rendLineNumberStart0&&(this._removeLinesBefore(s,a),s.linesLength-=a)}if(s.rendLineNumberStart=p,s.rendLineNumberStart+s.linesLength-1c){const a=Math.max(0,c-s.rendLineNumberStart+1),r=s.linesLength-1-a+1;r>0&&(this._removeLinesAfter(s,r),s.linesLength-=r)}return this._finishRendering(s,!1,o),s}_renderUntouchedLines(g,p,c,o,s){const a=g.rendLineNumberStart,u=g.lines;for(let r=p;r<=c;r++){const i=a+r;u[r].layoutLine(i,o[i-s])}}_insertLinesBefore(g,p,c,o,s){const a=[];let u=0;for(let r=p;r<=c;r++)a[u++]=this.host.createVisibleLine();g.lines=a.concat(g.lines)}_removeLinesBefore(g,p){for(let c=0;c=0;u--){const r=g.lines[u];o[u]&&(r.setDomNode(a),a=a.previousSibling)}}_finishRenderingInvalidLines(g,p,c){const o=document.createElement("div");C._ttPolicy&&(p=C._ttPolicy.createHTML(p)),o.innerHTML=p;for(let s=0;sd}),C._sb=N.createStringBuilder(1e5)}),define(Q[127],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenizationResult2=e.TokenizationResult=e.Token=void 0;class b{constructor(S,C,d){this.offset=S|0,this.type=C,this.language=d}toString(){return"("+this.offset+", "+this.type+")"}}e.Token=b;class N{constructor(S,C){this.tokens=S,this.endState=C}}e.TokenizationResult=N;class M{constructor(S,C){this.tokens=S,this.endState=C}}e.TokenizationResult2=M}),define(Q[368],J([0,1,153,8]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffComputer=void 0;const M=3;function w(u,r,i,n){return new b.LcsDiff(u,r,i).ComputeDiff(n)}class S{constructor(r){const i=[],n=[];for(let t=0,l=r.length;t0&&i.originalLength<20&&i.modifiedLength>0&&i.modifiedLength<20&&l()){const I=n.createCharSequence(r,i.originalStart,i.originalStart+i.originalLength-1),k=t.createCharSequence(r,i.modifiedStart,i.modifiedStart+i.modifiedLength-1);let E=w(I,k,l,!0).changes;m&&(E=g(E)),L=[];for(let T=0,O=E.length;T1&&E>1;){const T=L.charCodeAt(k-2),O=I.charCodeAt(E-2);if(T!==O)break;k--,E--}(k>1||E>1)&&this._pushTrimWhitespaceCharChange(t,l+1,1,k,h+1,1,E)}{let k=s(L,1),E=s(I,1);const T=L.length+1,O=I.length+1;for(;k!0;const r=Date.now();return()=>Date.now()-r0&&o>0)&&!(s>0&&a>0)){let u=Math.abs(o-a),r=Math.abs(c-s);if(u===0){g.spacesDiff=r,r>0&&0<=s-1&&s-10?g++:v>1&&p++,N(c,o,h,f,r),!(r.looksLikeAlignment&&!(C&&S===r.spacesDiff)))){let L=r.spacesDiff;L<=a&&u[L]++,c=h,o=f}}let i=C;g!==p&&(i=g{let h=u[l];h>t&&(t=h,n=l)}),n===4&&u[4]>0&&u[2]>0&&u[2]>=u[4]/2&&(n=2)}return{insertSpaces:i,tabSize:n}}e.guessIndentation=M}),define(Q[370],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.intervalCompare=e.recomputeMaxEnd=e.nodeAcceptEdit=e.IntervalTree=e.SENTINEL=e.IntervalNode=e.getNodeIsInOverviewRuler=e.getNodeColor=void 0;function b(D){return(D.metadata&1)>>>0}e.getNodeColor=b;function N(D,R){D.metadata=D.metadata&254|R<<0}function M(D){return(D.metadata&2)>>>1==1}function w(D,R){D.metadata=D.metadata&253|(R?1:0)<<1}function S(D){return(D.metadata&4)>>>2==1}function C(D,R){D.metadata=D.metadata&251|(R?1:0)<<2}function d(D){return(D.metadata&8)>>>3==1}e.getNodeIsInOverviewRuler=d;function g(D,R){D.metadata=D.metadata&247|(R?1:0)<<3}function p(D){return(D.metadata&48)>>>4}function c(D,R){D.metadata=D.metadata&207|R<<4}function o(D){return(D.metadata&64)>>>6==1}function s(D,R){D.metadata=D.metadata&191|(R?1:0)<<6}class a{constructor(R,W,x){this.metadata=0,this.parent=this,this.left=this,this.right=this,N(this,1),this.start=W,this.end=x,this.delta=0,this.maxEnd=x,this.id=R,this.ownerId=0,this.options=null,C(this,!1),c(this,1),g(this,!1),s(this,!1),this.cachedVersionId=0,this.cachedAbsoluteStart=W,this.cachedAbsoluteEnd=x,this.range=null,w(this,!1)}reset(R,W,x,K){this.start=W,this.end=x,this.maxEnd=x,this.cachedVersionId=R,this.cachedAbsoluteStart=W,this.cachedAbsoluteEnd=x,this.range=K}setOptions(R){this.options=R;let W=this.options.className;C(this,W==="squiggly-error"||W==="squiggly-warning"||W==="squiggly-info"),c(this,this.options.stickiness),g(this,!!(this.options.overviewRuler&&this.options.overviewRuler.color)),s(this,this.options.collapseOnReplaceEdit)}setCachedOffsets(R,W,x){this.cachedVersionId!==x&&(this.range=null),this.cachedVersionId=x,this.cachedAbsoluteStart=R,this.cachedAbsoluteEnd=W}detach(){this.parent=null,this.left=null,this.right=null}}e.IntervalNode=a,e.SENTINEL=new a(null,0,0),e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.left=e.SENTINEL,e.SENTINEL.right=e.SENTINEL,N(e.SENTINEL,0);class u{constructor(){this.root=e.SENTINEL,this.requestNormalizeDelta=!1}intervalSearch(R,W,x,K,Y){return this.root===e.SENTINEL?[]:f(this,R,W,x,K,Y)}search(R,W,x){return this.root===e.SENTINEL?[]:_(this,R,W,x)}collectNodesFromOwner(R){return h(this,R)}collectNodesPostOrder(){return m(this)}insert(R){v(this,R),this._normalizeDeltaIfNecessary()}delete(R){L(this,R),this._normalizeDeltaIfNecessary()}resolveNode(R,W){const x=R;let K=0;for(;R!==this.root;)R===R.parent.right&&(K+=R.parent.delta),R=R.parent;const Y=x.start+K,ee=x.end+K;x.setCachedOffsets(Y,ee,W)}acceptReplace(R,W,x,K){const Y=t(this,R,R+W);for(let ee=0,se=Y.length;eeW||x===1?!1:x===2?!0:R}function n(D,R,W,x,K){const Y=p(D),ee=Y===0||Y===2,se=Y===1||Y===2,ne=W-R,le=x,X=Math.min(ne,le),z=D.start;let P=!1;const V=D.end;let U=!1;R<=z&&V<=W&&o(D)&&(D.start=R,P=!0,D.end=R,U=!0);{const $=K?1:ne>0?2:0;!P&&i(z,ee,R,$)&&(P=!0),!U&&i(V,se,R,$)&&(U=!0)}if(X>0&&!K){const $=ne>le?2:0;!P&&i(z,ee,R+X,$)&&(P=!0),!U&&i(V,se,R+X,$)&&(U=!0)}{const $=K?1:0;!P&&i(z,ee,W,$)&&(D.start=R+le,P=!0),!U&&i(V,se,W,$)&&(D.end=R+le,U=!0)}const H=le-ne;P||(D.start=Math.max(0,z+H)),U||(D.end=Math.max(0,V+H)),D.start>D.end&&(D.end=D.start)}e.nodeAcceptEdit=n;function t(D,R,W){let x=D.root,K=0,Y=0,ee=0,se=0,ne=[],le=0;for(;x!==e.SENTINEL;){if(M(x)){w(x.left,!1),w(x.right,!1),x===x.parent.right&&(K-=x.parent.delta),x=x.parent;continue}if(!M(x.left)){if(Y=K+x.maxEnd,YW){w(x,!0);continue}if(se=K+x.end,se>=R&&(x.setCachedOffsets(ee,se,0),ne[le++]=x),w(x,!0),x.right!==e.SENTINEL&&!M(x.right)){K+=x.delta,x=x.right;continue}}return w(D.root,!1),ne}function l(D,R,W,x){let K=D.root,Y=0,ee=0,se=0;const ne=x-(W-R);for(;K!==e.SENTINEL;){if(M(K)){w(K.left,!1),w(K.right,!1),K===K.parent.right&&(Y-=K.parent.delta),A(K),K=K.parent;continue}if(!M(K.left)){if(ee=Y+K.maxEnd,eeW){K.start+=ne,K.end+=ne,K.delta+=ne,(K.delta<-1073741824||K.delta>1073741824)&&(D.requestNormalizeDelta=!0),w(K,!0);continue}if(w(K,!0),K.right!==e.SENTINEL&&!M(K.right)){Y+=K.delta,K=K.right;continue}}w(D.root,!1)}function h(D,R){let W=D.root,x=[],K=0;for(;W!==e.SENTINEL;){if(M(W)){w(W.left,!1),w(W.right,!1),W=W.parent;continue}if(W.left!==e.SENTINEL&&!M(W.left)){W=W.left;continue}if(W.ownerId===R&&(x[K++]=W),w(W,!0),W.right!==e.SENTINEL&&!M(W.right)){W=W.right;continue}}return w(D.root,!1),x}function m(D){let R=D.root,W=[],x=0;for(;R!==e.SENTINEL;){if(M(R)){w(R.left,!1),w(R.right,!1),R=R.parent;continue}if(R.left!==e.SENTINEL&&!M(R.left)){R=R.left;continue}if(R.right!==e.SENTINEL&&!M(R.right)){R=R.right;continue}W[x++]=R,w(R,!0)}return w(D.root,!1),W}function _(D,R,W,x){let K=D.root,Y=0,ee=0,se=0,ne=[],le=0;for(;K!==e.SENTINEL;){if(M(K)){w(K.left,!1),w(K.right,!1),K===K.parent.right&&(Y-=K.parent.delta),K=K.parent;continue}if(K.left!==e.SENTINEL&&!M(K.left)){K=K.left;continue}ee=Y+K.start,se=Y+K.end,K.setCachedOffsets(ee,se,x);let X=!0;if(R&&K.ownerId&&K.ownerId!==R&&(X=!1),W&&S(K)&&(X=!1),X&&(ne[le++]=K),w(K,!0),K.right!==e.SENTINEL&&!M(K.right)){Y+=K.delta,K=K.right;continue}}return w(D.root,!1),ne}function f(D,R,W,x,K,Y){let ee=D.root,se=0,ne=0,le=0,X=0,z=[],P=0;for(;ee!==e.SENTINEL;){if(M(ee)){w(ee.left,!1),w(ee.right,!1),ee===ee.parent.right&&(se-=ee.parent.delta),ee=ee.parent;continue}if(!M(ee.left)){if(ne=se+ee.maxEnd,neW){w(ee,!0);continue}if(X=se+ee.end,X>=R){ee.setCachedOffsets(le,X,Y);let V=!0;x&&ee.ownerId&&ee.ownerId!==x&&(V=!1),K&&S(ee)&&(V=!1),V&&(z[P++]=ee)}if(w(ee,!0),ee.right!==e.SENTINEL&&!M(ee.right)){se+=ee.delta,ee=ee.right;continue}}return w(D.root,!1),z}function v(D,R){if(D.root===e.SENTINEL)return R.parent=e.SENTINEL,R.left=e.SENTINEL,R.right=e.SENTINEL,N(R,0),D.root=R,D.root;y(D,R),B(R.parent);let W=R;for(;W!==D.root&&b(W.parent)===1;)if(W.parent===W.parent.parent.left){const x=W.parent.parent.right;b(x)===1?(N(W.parent,0),N(x,0),N(W.parent.parent,1),W=W.parent.parent):(W===W.parent.right&&(W=W.parent,E(D,W)),N(W.parent,0),N(W.parent.parent,1),T(D,W.parent.parent))}else{const x=W.parent.parent.left;b(x)===1?(N(W.parent,0),N(x,0),N(W.parent.parent,1),W=W.parent.parent):(W===W.parent.left&&(W=W.parent,T(D,W)),N(W.parent,0),N(W.parent.parent,1),E(D,W.parent.parent))}return N(D.root,0),R}function y(D,R){let W=0,x=D.root;const K=R.start,Y=R.end;for(;;)if(F(K,Y,x.start+W,x.end+W)<0)if(x.left===e.SENTINEL){R.start-=W,R.end-=W,R.maxEnd-=W,x.left=R;break}else x=x.left;else if(x.right===e.SENTINEL){R.start-=W+x.delta,R.end-=W+x.delta,R.maxEnd-=W+x.delta,x.right=R;break}else W+=x.delta,x=x.right;R.parent=x,R.left=e.SENTINEL,R.right=e.SENTINEL,N(R,1)}function L(D,R){let W,x;if(R.left===e.SENTINEL?(W=R.right,x=R,W.delta+=R.delta,(W.delta<-1073741824||W.delta>1073741824)&&(D.requestNormalizeDelta=!0),W.start+=R.delta,W.end+=R.delta):R.right===e.SENTINEL?(W=R.left,x=R):(x=I(R.right),W=x.right,W.start+=x.delta,W.end+=x.delta,W.delta+=x.delta,(W.delta<-1073741824||W.delta>1073741824)&&(D.requestNormalizeDelta=!0),x.start+=R.delta,x.end+=R.delta,x.delta=R.delta,(x.delta<-1073741824||x.delta>1073741824)&&(D.requestNormalizeDelta=!0)),x===D.root){D.root=W,N(W,0),R.detach(),k(),A(W),D.root.parent=e.SENTINEL;return}let K=b(x)===1;if(x===x.parent.left?x.parent.left=W:x.parent.right=W,x===R?W.parent=x.parent:(x.parent===R?W.parent=x:W.parent=x.parent,x.left=R.left,x.right=R.right,x.parent=R.parent,N(x,b(R)),R===D.root?D.root=x:R===R.parent.left?R.parent.left=x:R.parent.right=x,x.left!==e.SENTINEL&&(x.left.parent=x),x.right!==e.SENTINEL&&(x.right.parent=x)),R.detach(),K){B(W.parent),x!==R&&(B(x),B(x.parent)),k();return}B(W),B(W.parent),x!==R&&(B(x),B(x.parent));let Y;for(;W!==D.root&&b(W)===0;)W===W.parent.left?(Y=W.parent.right,b(Y)===1&&(N(Y,0),N(W.parent,1),E(D,W.parent),Y=W.parent.right),b(Y.left)===0&&b(Y.right)===0?(N(Y,1),W=W.parent):(b(Y.right)===0&&(N(Y.left,0),N(Y,1),T(D,Y),Y=W.parent.right),N(Y,b(W.parent)),N(W.parent,0),N(Y.right,0),E(D,W.parent),W=D.root)):(Y=W.parent.left,b(Y)===1&&(N(Y,0),N(W.parent,1),T(D,W.parent),Y=W.parent.left),b(Y.left)===0&&b(Y.right)===0?(N(Y,1),W=W.parent):(b(Y.left)===0&&(N(Y.right,0),N(Y,1),E(D,Y),Y=W.parent.left),N(Y,b(W.parent)),N(W.parent,0),N(Y.left,0),T(D,W.parent),W=D.root));N(W,0),k()}function I(D){for(;D.left!==e.SENTINEL;)D=D.left;return D}function k(){e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.delta=0,e.SENTINEL.start=0,e.SENTINEL.end=0}function E(D,R){const W=R.right;W.delta+=R.delta,(W.delta<-1073741824||W.delta>1073741824)&&(D.requestNormalizeDelta=!0),W.start+=R.delta,W.end+=R.delta,R.right=W.left,W.left!==e.SENTINEL&&(W.left.parent=R),W.parent=R.parent,R.parent===e.SENTINEL?D.root=W:R===R.parent.left?R.parent.left=W:R.parent.right=W,W.left=R,R.parent=W,A(R),A(W)}function T(D,R){const W=R.left;R.delta-=W.delta,(R.delta<-1073741824||R.delta>1073741824)&&(D.requestNormalizeDelta=!0),R.start-=W.delta,R.end-=W.delta,R.left=W.right,W.right!==e.SENTINEL&&(W.right.parent=R),W.parent=R.parent,R.parent===e.SENTINEL?D.root=W:R===R.parent.right?R.parent.right=W:R.parent.left=W,W.right=R,R.parent=W,A(R),A(W)}function O(D){let R=D.end;if(D.left!==e.SENTINEL){const W=D.left.maxEnd;W>R&&(R=W)}if(D.right!==e.SENTINEL){const W=D.right.maxEnd+D.delta;W>R&&(R=W)}return R}function A(D){D.maxEnd=O(D)}e.recomputeMaxEnd=A;function B(D){for(;D!==e.SENTINEL;){const R=O(D);if(D.maxEnd===R)return;D.maxEnd=R,D=D.parent}}function F(D,R,W,x){return D===W?R-x:D-W}e.intervalCompare=F}),define(Q[371],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.recomputeTreeMetadata=e.updateTreeMetadata=e.fixInsert=e.rbDelete=e.rightRotate=e.leftRotate=e.resetSentinel=e.calculateLF=e.calculateSize=e.righttest=e.leftest=e.SENTINEL=e.TreeNode=void 0;class b{constructor(u,r){this.piece=u,this.color=r,this.size_left=0,this.lf_left=0,this.parent=this,this.left=this,this.right=this}next(){if(this.right!==e.SENTINEL)return N(this.right);let u=this;for(;u.parent!==e.SENTINEL&&u.parent.left!==u;)u=u.parent;return u.parent===e.SENTINEL?e.SENTINEL:u.parent}prev(){if(this.left!==e.SENTINEL)return M(this.left);let u=this;for(;u.parent!==e.SENTINEL&&u.parent.right!==u;)u=u.parent;return u.parent===e.SENTINEL?e.SENTINEL:u.parent}detach(){this.parent=null,this.left=null,this.right=null}}e.TreeNode=b,e.SENTINEL=new b(null,0),e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.left=e.SENTINEL,e.SENTINEL.right=e.SENTINEL,e.SENTINEL.color=0;function N(a){for(;a.left!==e.SENTINEL;)a=a.left;return a}e.leftest=N;function M(a){for(;a.right!==e.SENTINEL;)a=a.right;return a}e.righttest=M;function w(a){return a===e.SENTINEL?0:a.size_left+a.piece.length+w(a.right)}e.calculateSize=w;function S(a){return a===e.SENTINEL?0:a.lf_left+a.piece.lineFeedCnt+S(a.right)}e.calculateLF=S;function C(){e.SENTINEL.parent=e.SENTINEL}e.resetSentinel=C;function d(a,u){let r=u.right;r.size_left+=u.size_left+(u.piece?u.piece.length:0),r.lf_left+=u.lf_left+(u.piece?u.piece.lineFeedCnt:0),u.right=r.left,r.left!==e.SENTINEL&&(r.left.parent=u),r.parent=u.parent,u.parent===e.SENTINEL?a.root=r:u.parent.left===u?u.parent.left=r:u.parent.right=r,r.left=u,u.parent=r}e.leftRotate=d;function g(a,u){let r=u.left;u.left=r.right,r.right!==e.SENTINEL&&(r.right.parent=u),r.parent=u.parent,u.size_left-=r.size_left+(r.piece?r.piece.length:0),u.lf_left-=r.lf_left+(r.piece?r.piece.lineFeedCnt:0),u.parent===e.SENTINEL?a.root=r:u===u.parent.right?u.parent.right=r:u.parent.left=r,r.right=u,u.parent=r}e.rightRotate=g;function p(a,u){let r,i;if(u.left===e.SENTINEL?(i=u,r=i.right):u.right===e.SENTINEL?(i=u,r=i.left):(i=N(u.right),r=i.right),i===a.root){a.root=r,r.color=0,u.detach(),C(),a.root.parent=e.SENTINEL;return}let n=i.color===1;if(i===i.parent.left?i.parent.left=r:i.parent.right=r,i===u?(r.parent=i.parent,s(a,r)):(i.parent===u?r.parent=i:r.parent=i.parent,s(a,r),i.left=u.left,i.right=u.right,i.parent=u.parent,i.color=u.color,u===a.root?a.root=i:u===u.parent.left?u.parent.left=i:u.parent.right=i,i.left!==e.SENTINEL&&(i.left.parent=i),i.right!==e.SENTINEL&&(i.right.parent=i),i.size_left=u.size_left,i.lf_left=u.lf_left,s(a,i)),u.detach(),r.parent.left===r){let l=w(r),h=S(r);if(l!==r.parent.size_left||h!==r.parent.lf_left){let m=l-r.parent.size_left,_=h-r.parent.lf_left;r.parent.size_left=l,r.parent.lf_left=h,o(a,r.parent,m,_)}}if(s(a,r.parent),n){C();return}let t;for(;r!==a.root&&r.color===0;)r===r.parent.left?(t=r.parent.right,t.color===1&&(t.color=0,r.parent.color=1,d(a,r.parent),t=r.parent.right),t.left.color===0&&t.right.color===0?(t.color=1,r=r.parent):(t.right.color===0&&(t.left.color=0,t.color=1,g(a,t),t=r.parent.right),t.color=r.parent.color,r.parent.color=0,t.right.color=0,d(a,r.parent),r=a.root)):(t=r.parent.left,t.color===1&&(t.color=0,r.parent.color=1,g(a,r.parent),t=r.parent.left),t.left.color===0&&t.right.color===0?(t.color=1,r=r.parent):(t.left.color===0&&(t.right.color=0,t.color=1,d(a,t),t=r.parent.left),t.color=r.parent.color,r.parent.color=0,t.left.color=0,g(a,r.parent),r=a.root));r.color=0,C()}e.rbDelete=p;function c(a,u){for(s(a,u);u!==a.root&&u.parent.color===1;)if(u.parent===u.parent.parent.left){const r=u.parent.parent.right;r.color===1?(u.parent.color=0,r.color=0,u.parent.parent.color=1,u=u.parent.parent):(u===u.parent.right&&(u=u.parent,d(a,u)),u.parent.color=0,u.parent.parent.color=1,g(a,u.parent.parent))}else{const r=u.parent.parent.left;r.color===1?(u.parent.color=0,r.color=0,u.parent.parent.color=1,u=u.parent.parent):(u===u.parent.left&&(u=u.parent,g(a,u)),u.parent.color=0,u.parent.parent.color=1,d(a,u.parent.parent))}a.root.color=0}e.fixInsert=c;function o(a,u,r,i){for(;u!==a.root&&u!==e.SENTINEL;)u.parent.left===u&&(u.parent.size_left+=r,u.parent.lf_left+=i),u=u.parent}e.updateTreeMetadata=o;function s(a,u){let r=0,i=0;if(u!==a.root){if(r===0){for(;u!==a.root&&u===u.parent.right;)u=u.parent;if(u===a.root)return;u=u.parent,r=w(u.left)-u.size_left,i=S(u.left)-u.lf_left,u.size_left+=r,u.lf_left+=i}for(;u!==a.root&&(r!==0||i!==0);)u.parent.left===u&&(u.parent.size_left+=r,u.parent.lf_left+=i),u=u.parent}}e.recomputeTreeMetadata=s}),define(Q[218],J([0,1,101,93]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compressConsecutiveTextChanges=e.TextChange=void 0;function M(d){return d.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}class w{constructor(g,p,c,o){this.oldPosition=g,this.oldText=p,this.newPosition=c,this.newText=o}get oldLength(){return this.oldText.length}get oldEnd(){return this.oldPosition+this.oldText.length}get newLength(){return this.newText.length}get newEnd(){return this.newPosition+this.newText.length}toString(){return this.oldText.length===0?`(insert@${this.oldPosition} "${M(this.newText)}")`:this.newText.length===0?`(delete@${this.oldPosition} "${M(this.oldText)}")`:`(replace@${this.oldPosition} "${M(this.oldText)}" with "${M(this.newText)}")`}static _writeStringSize(g){return 4+2*g.length}static _writeString(g,p,c){const o=p.length;b.writeUInt32BE(g,o,c),c+=4;for(let s=0;s=0;let l=null;try{l=b.createRegExp(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:t,global:!0,unicode:!0})}catch(m){return null}if(!l)return null;let h=!this.isRegex&&!t;return h&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(h=this.matchCase),new p(l,this.wordSeparators?N.getMapForWordSeparators(this.wordSeparators):null,h?this.searchString:null)}}e.SearchParams=d;function g(n){if(!n||n.length===0)return!1;for(let t=0,l=n.length;t=l)break;const m=n.charCodeAt(t);if(m===110||m===114||m===87||m===119)return!0}return!1}e.isMultilineRegexSource=g;class p{constructor(t,l,h){this.regex=t,this.wordSeparators=l,this.simpleSearch=h}}e.SearchData=p;function c(n,t,l){if(!l)return new S.FindMatch(n,null);let h=[];for(let m=0,_=t.length;m<_;m++)h[m]=t[m];return new S.FindMatch(n,h)}e.createFindMatch=c;class o{constructor(t){let l=[],h=0;for(let m=0,_=t.length;m<_;m++)t.charCodeAt(m)===10&&(l[h++]=m);this._lineFeedsOffsets=l}findLineFeedCountBeforeOffset(t){const l=this._lineFeedsOffsets;let h=0,m=l.length-1;if(m===-1||t<=l[0])return 0;for(;h>0);l[_]>=t?m=_-1:l[_+1]>=t?(h=_,m=_):h=_+1}return h+1}}class s{static findMatches(t,l,h,m,_){const f=l.parseSearchRequest();return f?f.regex.multiline?this._doFindMatchesMultiline(t,h,new i(f.wordSeparators,f.regex),m,_):this._doFindMatchesLineByLine(t,h,f,m,_):[]}static _getMultilineMatchRange(t,l,h,m,_,f){let v,y=0;m?(y=m.findLineFeedCountBeforeOffset(_),v=l+_+y):v=l+_;let L;if(m){let T=m.findLineFeedCountBeforeOffset(_+f.length)-y;L=v+f.length+T}else L=v+f.length;const I=t.getPositionAt(v),k=t.getPositionAt(L);return new w.Range(I.lineNumber,I.column,k.lineNumber,k.column)}static _doFindMatchesMultiline(t,l,h,m,_){const f=t.getOffsetAt(l.getStartPosition()),v=t.getValueInRange(l,1),y=t.getEOL()===`\r +`?new o(v):null,L=[];let I=0,k;for(h.reset(0);k=h.next(v);)if(L[I++]=c(this._getMultilineMatchRange(t,f,v,y,k.index,k[0]),k,m),I>=_)return L;return L}static _doFindMatchesLineByLine(t,l,h,m,_){const f=[];let v=0;if(l.startLineNumber===l.endLineNumber){const L=t.getLineContent(l.startLineNumber).substring(l.startColumn-1,l.endColumn-1);return v=this._findMatchesInLine(h,L,l.startLineNumber,l.startColumn-1,v,f,m,_),f}const y=t.getLineContent(l.startLineNumber).substring(l.startColumn-1);v=this._findMatchesInLine(h,y,l.startLineNumber,l.startColumn-1,v,f,m,_);for(let L=l.startLineNumber+1;L=y))return _;return _}const I=new i(t.wordSeparators,t.regex);let k;I.reset(0);do if(k=I.next(l),k&&(f[_++]=c(new w.Range(h,k.index+1+m,h,k.index+1+k[0].length+m),k,v),_>=y))return _;while(k);return _}static findNextMatch(t,l,h,m){const _=l.parseSearchRequest();if(!_)return null;const f=new i(_.wordSeparators,_.regex);return _.regex.multiline?this._doFindNextMatchMultiline(t,h,f,m):this._doFindNextMatchLineByLine(t,h,f,m)}static _doFindNextMatchMultiline(t,l,h,m){const _=new M.Position(l.lineNumber,1),f=t.getOffsetAt(_),v=t.getLineCount(),y=t.getValueInRange(new w.Range(_.lineNumber,_.column,v,t.getLineMaxColumn(v)),1),L=t.getEOL()===`\r +`?new o(y):null;h.reset(l.column-1);let I=h.next(y);return I?c(this._getMultilineMatchRange(t,f,y,L,I.index,I[0]),I,m):l.lineNumber!==1||l.column!==1?this._doFindNextMatchMultiline(t,new M.Position(1,1),h,m):null}static _doFindNextMatchLineByLine(t,l,h,m){const _=t.getLineCount(),f=l.lineNumber,v=t.getLineContent(f),y=this._findFirstMatchInLine(h,v,f,l.column,m);if(y)return y;for(let L=1;L<=_;L++){const I=(f+L-1)%_,k=t.getLineContent(I+1),E=this._findFirstMatchInLine(h,k,I+1,1,m);if(E)return E}return null}static _findFirstMatchInLine(t,l,h,m,_){t.reset(m-1);const f=t.next(l);return f?c(new w.Range(h,f.index+1,h,f.index+1+f[0].length),f,_):null}static findPreviousMatch(t,l,h,m){const _=l.parseSearchRequest();if(!_)return null;const f=new i(_.wordSeparators,_.regex);return _.regex.multiline?this._doFindPreviousMatchMultiline(t,h,f,m):this._doFindPreviousMatchLineByLine(t,h,f,m)}static _doFindPreviousMatchMultiline(t,l,h,m){const _=this._doFindMatchesMultiline(t,new w.Range(1,1,l.lineNumber,l.column),h,m,10*C);if(_.length>0)return _[_.length-1];const f=t.getLineCount();return l.lineNumber!==f||l.column!==t.getLineMaxColumn(f)?this._doFindPreviousMatchMultiline(t,new M.Position(f,t.getLineMaxColumn(f)),h,m):null}static _doFindPreviousMatchLineByLine(t,l,h,m){const _=t.getLineCount(),f=l.lineNumber,v=t.getLineContent(f).substring(0,l.column-1),y=this._findLastMatchInLine(h,v,f,m);if(y)return y;for(let L=1;L<=_;L++){const I=(_+f-L-1)%_,k=t.getLineContent(I+1),E=this._findLastMatchInLine(h,k,I+1,m);if(E)return E}return null}static _findLastMatchInLine(t,l,h,m){let _=null,f;for(t.reset(0);f=t.next(l);)_=c(new w.Range(h,f.index+1,h,f.index+1+f[0].length),f,m);return _}}e.TextModelSearch=s;function a(n,t,l,h,m){if(h===0)return!0;const _=t.charCodeAt(h-1);if(n.get(_)!==0||_===13||_===10)return!0;if(m>0){const f=t.charCodeAt(h);if(n.get(f)!==0)return!0}return!1}function u(n,t,l,h,m){if(h+m===l)return!0;const _=t.charCodeAt(h+m);if(n.get(_)!==0||_===13||_===10)return!0;if(m>0){const f=t.charCodeAt(h+m-1);if(n.get(f)!==0)return!0}return!1}function r(n,t,l,h,m){return a(n,t,l,h,m)&&u(n,t,l,h,m)}e.isValidMatch=r;class i{constructor(t,l){this._wordSeparators=t,this._searchRegex=l,this._prevMatchStartIndex=-1,this._prevMatchLength=0}reset(t){this._searchRegex.lastIndex=t,this._prevMatchStartIndex=-1,this._prevMatchLength=0}next(t){const l=t.length;let h;do{if(this._prevMatchStartIndex+this._prevMatchLength===l||(h=this._searchRegex.exec(t),!h))return null;const m=h.index,_=h[0].length;if(m===this._prevMatchStartIndex&&_===this._prevMatchLength){if(_===0){b.getNextCodePoint(t,l,this._searchRegex.lastIndex)>65535?this._searchRegex.lastIndex+=2:this._searchRegex.lastIndex+=1;continue}return null}if(this._prevMatchStartIndex=m,this._prevMatchLength=_,!this._wordSeparators||r(this._wordSeparators,t,l,m,_))return h}while(h);return null}}e.Searcher=i}),define(Q[219],J([0,1,14,3,53,371,166]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeBase=e.StringBuffer=e.Piece=e.createLineStarts=e.createLineStartsFast=e.LineStarts=e.createUintArray=e.AverageBufferSize=void 0,e.AverageBufferSize=65535;function C(r){let i;return r[r.length-1]<65536?i=new Uint16Array(r.length):i=new Uint32Array(r.length),i.set(r,0),i}e.createUintArray=C;class d{constructor(i,n,t,l,h){this.lineStarts=i,this.cr=n,this.lf=t,this.crlf=l,this.isBasicASCII=h}}e.LineStarts=d;function g(r,i=!0){let n=[0],t=1;for(let l=0,h=r.length;l126)&&(m=!1)}const _=new d(C(r),t,l,h,m);return r.length=0,_}e.createLineStarts=p;class c{constructor(i,n,t,l,h){this.bufferIndex=i,this.start=n,this.end=t,this.lineFeedCnt=l,this.length=h}}e.Piece=c;class o{constructor(i,n){this.buffer=i,this.lineStarts=n}}e.StringBuffer=o;class s{constructor(i,n){this._pieces=[],this._tree=i,this._BOM=n,this._index=0,i.root!==w.SENTINEL&&i.iterate(i.root,t=>(t!==w.SENTINEL&&this._pieces.push(t.piece),!0))}read(){return this._pieces.length===0?this._index===0?(this._index++,this._BOM):null:this._index>this._pieces.length-1?null:this._index===0?this._BOM+this._tree.getPieceContent(this._pieces[this._index++]):this._tree.getPieceContent(this._pieces[this._index++])}}class a{constructor(i){this._limit=i,this._cache=[]}get(i){for(let n=this._cache.length-1;n>=0;n--){let t=this._cache[n];if(t.nodeStartOffset<=i&&t.nodeStartOffset+t.node.piece.length>=i)return t}return null}get2(i){for(let n=this._cache.length-1;n>=0;n--){let t=this._cache[n];if(t.nodeStartLineNumber&&t.nodeStartLineNumber=i)return t}return null}set(i){this._cache.length>=this._limit&&this._cache.shift(),this._cache.push(i)}validate(i){let n=!1,t=this._cache;for(let l=0;l=i){t[l]=null,n=!0;continue}}if(n){let l=[];for(const h of t)h!==null&&l.push(h);this._cache=l}}}class u{constructor(i,n,t){this.create(i,n,t)}create(i,n,t){this._buffers=[new o("",[0])],this._lastChangeBufferPos={line:0,column:0},this.root=w.SENTINEL,this._lineCnt=1,this._length=0,this._EOL=n,this._EOLLength=n.length,this._EOLNormalized=t;let l=null;for(let h=0,m=i.length;h0){i[h].lineStarts||(i[h].lineStarts=g(i[h].buffer));let _=new c(h+1,{line:0,column:0},{line:i[h].lineStarts.length-1,column:i[h].buffer.length-i[h].lineStarts[i[h].lineStarts.length-1]},i[h].lineStarts.length-1,i[h].buffer.length);this._buffers.push(i[h]),l=this.rbInsertRight(l,_)}this._searchCache=new a(1),this._lastVisitedLine={lineNumber:0,value:""},this.computeBufferMetadata()}normalizeEOL(i){let n=e.AverageBufferSize,t=n-Math.floor(n/3),l=t*2,h="",m=0,_=[];if(this.iterate(this.root,f=>{let v=this.getNodeContent(f),y=v.length;if(m<=t||m+y0){let f=h.replace(/\r\n|\r|\n/g,i);_.push(new o(f,g(f)))}this.create(_,i,!0)}getEOL(){return this._EOL}setEOL(i){this._EOL=i,this._EOLLength=this._EOL.length,this.normalizeEOL(i)}createSnapshot(i){return new s(this,i)}getOffsetAt(i,n){let t=0,l=this.root;for(;l!==w.SENTINEL;)if(l.left!==w.SENTINEL&&l.lf_left+1>=i)l=l.left;else{if(l.lf_left+l.piece.lineFeedCnt+1>=i)return t+=l.size_left,t+=this.getAccumulatedValue(l,i-l.lf_left-2)+n-1;i-=l.lf_left+l.piece.lineFeedCnt,t+=l.size_left+l.piece.length,l=l.right}return t}getPositionAt(i){i=Math.floor(i),i=Math.max(0,i);let n=this.root,t=0,l=i;for(;n!==w.SENTINEL;)if(n.size_left!==0&&n.size_left>=i)n=n.left;else if(n.size_left+n.piece.length>=i){let h=this.getIndexOf(n,i-n.size_left);if(t+=n.lf_left+h.index,h.index===0){let m=this.getOffsetAt(t+1,1),_=l-m;return new b.Position(t+1,_+1)}return new b.Position(t+1,h.remainder+1)}else if(i-=n.size_left+n.piece.length,t+=n.lf_left+n.piece.lineFeedCnt,n.right===w.SENTINEL){let h=this.getOffsetAt(t+1,1),m=l-i-h;return new b.Position(t+1,m+1)}else n=n.right;return new b.Position(1,1)}getValueInRange(i,n){if(i.startLineNumber===i.endLineNumber&&i.startColumn===i.endColumn)return"";let t=this.nodeAt2(i.startLineNumber,i.startColumn),l=this.nodeAt2(i.endLineNumber,i.endColumn),h=this.getValueInRange2(t,l);return n?n!==this._EOL||!this._EOLNormalized?h.replace(/\r\n|\r|\n/g,n):n===this.getEOL()&&this._EOLNormalized?h:h.replace(/\r\n|\r|\n/g,n):h}getValueInRange2(i,n){if(i.node===n.node){let _=i.node,f=this._buffers[_.piece.bufferIndex].buffer,v=this.offsetInBuffer(_.piece.bufferIndex,_.piece.start);return f.substring(v+i.remainder,v+n.remainder)}let t=i.node,l=this._buffers[t.piece.bufferIndex].buffer,h=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start),m=l.substring(h+i.remainder,h+t.piece.length);for(t=t.next();t!==w.SENTINEL;){let _=this._buffers[t.piece.bufferIndex].buffer,f=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);if(t===n.node){m+=_.substring(f,f+n.remainder);break}else m+=_.substr(f,t.piece.length);t=t.next()}return m}getLinesContent(){let i=[],n=0,t="",l=!1;return this.iterate(this.root,h=>{if(h===w.SENTINEL)return!0;const m=h.piece;let _=m.length;if(_===0)return!0;const f=this._buffers[m.bufferIndex].buffer,v=this._buffers[m.bufferIndex].lineStarts,y=m.start.line,L=m.end.line;let I=v[y]+m.start.column;if(l&&(f.charCodeAt(I)===10&&(I++,_--),i[n++]=t,t="",l=!1,_===0))return!0;if(y===L)return!this._EOLNormalized&&f.charCodeAt(I+_-1)===13?(l=!0,t+=f.substr(I,_-1)):t+=f.substr(I,_),!0;t+=this._EOLNormalized?f.substring(I,Math.max(I,v[y+1]-this._EOLLength)):f.substring(I,v[y+1]).replace(/(\r\n|\r|\n)$/,""),i[n++]=t;for(let k=y+1;kD+E,n.reset(0)):(B=I.buffer,F=D=>D,n.reset(E));do if(O=n.next(B),O){if(F(O.index)>=T)return y;this.positionInBuffer(i,F(O.index)-k,A);let D=this.getLineFeedCnt(i.piece.bufferIndex,h,A),R=A.line===h.line?A.column-h.column+l:A.column+1,W=R+O[0].length;if(L[y++]=S.createFindMatch(new N.Range(t+D,R,t+D,W),O,f),F(O.index)+O[0].length>=T||y>=v)return y}while(O);return y}findMatchesLineByLine(i,n,t,l){const h=[];let m=0;const _=new S.Searcher(n.wordSeparators,n.regex);let f=this.nodeAt2(i.startLineNumber,i.startColumn);if(f===null)return[];let v=this.nodeAt2(i.endLineNumber,i.endColumn);if(v===null)return[];let y=this.positionInBuffer(f.node,f.remainder),L=this.positionInBuffer(v.node,v.remainder);if(f.node===v.node)return this.findMatchesInNode(f.node,_,i.startLineNumber,i.startColumn,y,L,n,t,l,m,h),h;let I=i.startLineNumber,k=f.node;for(;k!==v.node;){let T=this.getLineFeedCnt(k.piece.bufferIndex,y,k.piece.end);if(T>=1){let A=this._buffers[k.piece.bufferIndex].lineStarts,B=this.offsetInBuffer(k.piece.bufferIndex,k.piece.start),F=A[y.line+T],D=I===i.startLineNumber?i.startColumn:1;if(m=this.findMatchesInNode(k,_,I,D,y,this.positionInBuffer(k,F-B),n,t,l,m,h),m>=l)return h;I+=T}let O=I===i.startLineNumber?i.startColumn-1:0;if(I===i.endLineNumber){const A=this.getLineContent(I).substring(O,i.endColumn-1);return m=this._findMatchesInLine(n,_,A,i.endLineNumber,O,m,h,t,l),h}if(m=this._findMatchesInLine(n,_,this.getLineContent(I).substr(O),I,O,m,h,t,l),m>=l)return h;I++,f=this.nodeAt2(I,1),k=f.node,y=this.positionInBuffer(f.node,f.remainder)}if(I===i.endLineNumber){let T=I===i.startLineNumber?i.startColumn-1:0;const O=this.getLineContent(I).substring(T,i.endColumn-1);return m=this._findMatchesInLine(n,_,O,i.endLineNumber,T,m,h,t,l),h}let E=I===i.startLineNumber?i.startColumn:1;return m=this.findMatchesInNode(v.node,_,I,E,y,L,n,t,l,m,h),h}_findMatchesInLine(i,n,t,l,h,m,_,f,v){const y=i.wordSeparators;if(!f&&i.simpleSearch){const I=i.simpleSearch,k=I.length,E=t.length;let T=-k;for(;(T=t.indexOf(I,T+k))!==-1;)if((!y||S.isValidMatch(y,t,E,T,k))&&(_[m++]=new M.FindMatch(new N.Range(l,T+1+h,l,T+1+k+h),null),m>=v))return m;return m}let L;n.reset(0);do if(L=n.next(t),L&&(_[m++]=S.createFindMatch(new N.Range(l,L.index+1+h,l,L.index+1+L[0].length+h),L,f),m>=v))return m;while(L);return m}insert(i,n,t=!1){if(this._EOLNormalized=this._EOLNormalized&&t,this._lastVisitedLine.lineNumber=0,this._lastVisitedLine.value="",this.root!==w.SENTINEL){let{node:l,remainder:h,nodeStartOffset:m}=this.nodeAt(i),_=l.piece,f=_.bufferIndex,v=this.positionInBuffer(l,h);if(l.piece.bufferIndex===0&&_.end.line===this._lastChangeBufferPos.line&&_.end.column===this._lastChangeBufferPos.column&&m+_.length===i&&n.lengthi){let y=[],L=new c(_.bufferIndex,v,_.end,this.getLineFeedCnt(_.bufferIndex,v,_.end),this.offsetInBuffer(f,_.end)-this.offsetInBuffer(f,v));if(this.shouldCheckCRLF()&&this.endWithCR(n)&&this.nodeCharCodeAt(l,h)===10){let T={line:L.start.line+1,column:0};L=new c(L.bufferIndex,T,L.end,this.getLineFeedCnt(L.bufferIndex,T,L.end),L.length-1),n+=` +`}if(this.shouldCheckCRLF()&&this.startWithLF(n))if(this.nodeCharCodeAt(l,h-1)===13){let T=this.positionInBuffer(l,h-1);this.deleteNodeTail(l,T),n="\r"+n,l.piece.length===0&&y.push(l)}else this.deleteNodeTail(l,v);else this.deleteNodeTail(l,v);let I=this.createNewPieces(n);L.length>0&&this.rbInsertRight(l,L);let k=l;for(let E=0;E=0;m--)h=this.rbInsertLeft(h,l[m]);this.validateCRLFWithPrevNode(h),this.deleteNodes(t)}insertContentToNodeRight(i,n){this.adjustCarriageReturnFromNext(i,n)&&(i+=` +`);let t=this.createNewPieces(i),l=this.rbInsertRight(n,t[0]),h=l;for(let m=1;m=I)v=L+1;else break;return t?(t.line=L,t.column=f-k,null):{line:L,column:f-k}}getLineFeedCnt(i,n,t){if(t.column===0)return t.line-n.line;let l=this._buffers[i].lineStarts;if(t.line===l.length-1)return t.line-n.line;let h=l[t.line+1],m=l[t.line]+t.column;if(h>m+1)return t.line-n.line;let _=m-1;return this._buffers[i].buffer.charCodeAt(_)===13?t.line-n.line+1:t.line-n.line}offsetInBuffer(i,n){return this._buffers[i].lineStarts[n.line]+n.column}deleteNodes(i){for(let n=0;ne.AverageBufferSize){let y=[];for(;i.length>e.AverageBufferSize;){const I=i.charCodeAt(e.AverageBufferSize-1);let k;I===13||I>=55296&&I<=56319?(k=i.substring(0,e.AverageBufferSize-1),i=i.substring(e.AverageBufferSize-1)):(k=i.substring(0,e.AverageBufferSize),i=i.substring(e.AverageBufferSize));let E=g(k);y.push(new c(this._buffers.length,{line:0,column:0},{line:E.length-1,column:k.length-E[E.length-1]},E.length-1,k.length)),this._buffers.push(new o(k,E))}let L=g(i);return y.push(new c(this._buffers.length,{line:0,column:0},{line:L.length-1,column:i.length-L[L.length-1]},L.length-1,i.length)),this._buffers.push(new o(i,L)),y}let n=this._buffers[0].buffer.length;const t=g(i,!1);let l=this._lastChangeBufferPos;if(this._buffers[0].lineStarts[this._buffers[0].lineStarts.length-1]===n&&n!==0&&this.startWithLF(i)&&this.endWithCR(this._buffers[0].buffer)){this._lastChangeBufferPos={line:this._lastChangeBufferPos.line,column:this._lastChangeBufferPos.column+1},l=this._lastChangeBufferPos;for(let y=0;y=i-1)t=t.left;else if(t.lf_left+t.piece.lineFeedCnt>i-1){let f=this.getAccumulatedValue(t,i-t.lf_left-2),v=this.getAccumulatedValue(t,i-t.lf_left-1),y=this._buffers[t.piece.bufferIndex].buffer,L=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);return m+=t.size_left,this._searchCache.set({node:t,nodeStartOffset:m,nodeStartLineNumber:_-(i-1-t.lf_left)}),y.substring(L+f,L+v-n)}else if(t.lf_left+t.piece.lineFeedCnt===i-1){let f=this.getAccumulatedValue(t,i-t.lf_left-2),v=this._buffers[t.piece.bufferIndex].buffer,y=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);l=v.substring(y+f,y+t.piece.length);break}else i-=t.lf_left+t.piece.lineFeedCnt,m+=t.size_left+t.piece.length,t=t.right}for(t=t.next();t!==w.SENTINEL;){let m=this._buffers[t.piece.bufferIndex].buffer;if(t.piece.lineFeedCnt>0){let _=this.getAccumulatedValue(t,0),f=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);return l+=m.substring(f,f+_-n),l}else{let _=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);l+=m.substr(_,t.piece.length)}t=t.next()}return l}computeBufferMetadata(){let i=this.root,n=1,t=0;for(;i!==w.SENTINEL;)n+=i.lf_left+i.piece.lineFeedCnt,t+=i.size_left+i.piece.length,i=i.right;this._lineCnt=n,this._length=t,this._searchCache.validate(this._length)}getIndexOf(i,n){let t=i.piece,l=this.positionInBuffer(i,n),h=l.line-t.start.line;if(this.offsetInBuffer(t.bufferIndex,t.end)-this.offsetInBuffer(t.bufferIndex,t.start)===n){let m=this.getLineFeedCnt(i.piece.bufferIndex,t.start,l);if(m!==h)return{index:m,remainder:0}}return{index:h,remainder:l.column}}getAccumulatedValue(i,n){if(n<0)return 0;let t=i.piece,l=this._buffers[t.bufferIndex].lineStarts,h=t.start.line+n+1;return h>t.end.line?l[t.end.line]+t.end.column-l[t.start.line]-t.start.column:l[h]-l[t.start.line]-t.start.column}deleteNodeTail(i,n){const t=i.piece,l=t.lineFeedCnt,h=this.offsetInBuffer(t.bufferIndex,t.end),m=n,_=this.offsetInBuffer(t.bufferIndex,m),f=this.getLineFeedCnt(t.bufferIndex,t.start,m),v=f-l,y=_-h,L=t.length+y;i.piece=new c(t.bufferIndex,t.start,m,f,L),w.updateTreeMetadata(this,i,y,v)}deleteNodeHead(i,n){const t=i.piece,l=t.lineFeedCnt,h=this.offsetInBuffer(t.bufferIndex,t.start),m=n,_=this.getLineFeedCnt(t.bufferIndex,m,t.end),f=this.offsetInBuffer(t.bufferIndex,m),v=_-l,y=h-f,L=t.length+y;i.piece=new c(t.bufferIndex,m,t.end,_,L),w.updateTreeMetadata(this,i,y,v)}shrinkNode(i,n,t){const l=i.piece,h=l.start,m=l.end,_=l.length,f=l.lineFeedCnt,v=n,y=this.getLineFeedCnt(l.bufferIndex,l.start,v),L=this.offsetInBuffer(l.bufferIndex,n)-this.offsetInBuffer(l.bufferIndex,h);i.piece=new c(l.bufferIndex,l.start,v,y,L),w.updateTreeMetadata(this,i,L-_,y-f);let I=new c(l.bufferIndex,t,m,this.getLineFeedCnt(l.bufferIndex,t,m),this.offsetInBuffer(l.bufferIndex,m)-this.offsetInBuffer(l.bufferIndex,t)),k=this.rbInsertRight(i,I);this.validateCRLFWithPrevNode(k)}appendToNode(i,n){this.adjustCarriageReturnFromNext(n,i)&&(n+=` +`);const t=this.shouldCheckCRLF()&&this.startWithLF(n)&&this.endWithCR(i),l=this._buffers[0].buffer.length;this._buffers[0].buffer+=n;const h=g(n,!1);for(let k=0;ki)n=n.left;else if(n.size_left+n.piece.length>=i){l+=n.size_left;let h={node:n,remainder:i-n.size_left,nodeStartOffset:l};return this._searchCache.set(h),h}else i-=n.size_left+n.piece.length,l+=n.size_left+n.piece.length,n=n.right;return null}nodeAt2(i,n){let t=this.root,l=0;for(;t!==w.SENTINEL;)if(t.left!==w.SENTINEL&&t.lf_left>=i-1)t=t.left;else if(t.lf_left+t.piece.lineFeedCnt>i-1){let h=this.getAccumulatedValue(t,i-t.lf_left-2),m=this.getAccumulatedValue(t,i-t.lf_left-1);return l+=t.size_left,{node:t,remainder:Math.min(h+n-1,m),nodeStartOffset:l}}else if(t.lf_left+t.piece.lineFeedCnt===i-1){let h=this.getAccumulatedValue(t,i-t.lf_left-2);if(h+n-1<=t.piece.length)return{node:t,remainder:h+n-1,nodeStartOffset:l};n-=t.piece.length-h;break}else i-=t.lf_left+t.piece.lineFeedCnt,l+=t.size_left+t.piece.length,t=t.right;for(t=t.next();t!==w.SENTINEL;){if(t.piece.lineFeedCnt>0){let h=this.getAccumulatedValue(t,0),m=this.offsetOfNode(t);return{node:t,remainder:Math.min(n-1,h),nodeStartOffset:m}}else if(t.piece.length>=n-1){let h=this.offsetOfNode(t);return{node:t,remainder:n-1,nodeStartOffset:h}}else n-=t.piece.length;t=t.next()}return null}nodeCharCodeAt(i,n){if(i.piece.lineFeedCnt<1)return-1;let t=this._buffers[i.piece.bufferIndex],l=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start)+n;return t.buffer.charCodeAt(l)}offsetOfNode(i){if(!i)return 0;let n=i.size_left;for(;i!==this.root;)i.parent.right===i&&(n+=i.parent.size_left+i.parent.piece.length),i=i.parent;return n}shouldCheckCRLF(){return!(this._EOLNormalized&&this._EOL===` +`)}startWithLF(i){if(typeof i=="string")return i.charCodeAt(0)===10;if(i===w.SENTINEL||i.piece.lineFeedCnt===0)return!1;let n=i.piece,t=this._buffers[n.bufferIndex].lineStarts,l=n.start.line,h=t[l]+n.start.column;return l===t.length-1||t[l+1]>h+1?!1:this._buffers[n.bufferIndex].buffer.charCodeAt(h)===10}endWithCR(i){return typeof i=="string"?i.charCodeAt(i.length-1)===13:i===w.SENTINEL||i.piece.lineFeedCnt===0?!1:this.nodeCharCodeAt(i,i.piece.length-1)===13}validateCRLFWithPrevNode(i){if(this.shouldCheckCRLF()&&this.startWithLF(i)){let n=i.prev();this.endWithCR(n)&&this.fixCRLF(n,i)}}validateCRLFWithNextNode(i){if(this.shouldCheckCRLF()&&this.endWithCR(i)){let n=i.next();this.startWithLF(n)&&this.fixCRLF(i,n)}}fixCRLF(i,n){let t=[],l=this._buffers[i.piece.bufferIndex].lineStarts,h;i.piece.end.column===0?h={line:i.piece.end.line-1,column:l[i.piece.end.line]-l[i.piece.end.line-1]-1}:h={line:i.piece.end.line,column:i.piece.end.column-1};const m=i.piece.length-1,_=i.piece.lineFeedCnt-1;i.piece=new c(i.piece.bufferIndex,i.piece.start,h,_,m),w.updateTreeMetadata(this,i,-1,-1),i.piece.length===0&&t.push(i);let f={line:n.piece.start.line+1,column:0};const v=n.piece.length-1,y=this.getLineFeedCnt(n.piece.bufferIndex,f,n.piece.end);n.piece=new c(n.piece.bufferIndex,f,n.piece.end,y,v),w.updateTreeMetadata(this,n,-1,-1),n.piece.length===0&&t.push(n);let L=this.createNewPieces(`\r +`);this.rbInsertRight(i,L[0]);for(let I=0;I/?";function b(C=""){let d="(-?\\d*\\.\\d\\w*)|([^";for(const g of e.USUAL_WORD_SEPARATORS)C.indexOf(g)>=0||(d+="\\"+g);return d+="\\s]+)",new RegExp(d,"g")}e.DEFAULT_WORD_REGEXP=b();function N(C){let d=e.DEFAULT_WORD_REGEXP;if(C&&C instanceof RegExp)if(C.global)d=C;else{let g="g";C.ignoreCase&&(g+="i"),C.multiline&&(g+="m"),C.unicode&&(g+="u"),d=new RegExp(C.source,g)}return d.lastIndex=0,d}e.ensureValidWordDefinition=N;const M={maxLen:1e3,windowSize:15,timeBudget:150};function w(C,d,g,p,c=M){if(g.length>c.maxLen){let r=C-c.maxLen/2;return r<0?r=0:p+=r,g=g.substring(r,C+c.maxLen/2),w(C,d,g,p,c)}const o=Date.now(),s=C-1-p;let a=-1,u=null;for(let r=1;!(Date.now()-o>=c.timeBudget);r++){const i=s-c.windowSize*r;d.lastIndex=Math.max(0,i);const n=S(d,g,s,a);if(!n&&u||(u=n,i<=0))break;a=i}if(u){let r={word:u[0],startColumn:p+1+u.index,endColumn:p+1+u.index+u[0].length};return d.lastIndex=0,r}return null}e.getWordAtText=w;function S(C,d,g,p){let c;for(;c=C.exec(d);){const o=c.index||0;if(o<=g&&C.lastIndex>=g)return c;if(p>0&&o>p)return null}return null}}),define(Q[373],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FrankensteinMode=void 0;class b{constructor(M){this._languageIdentifier=M}getId(){return this._languageIdentifier.language}}e.FrankensteinMode=b}),define(Q[109],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutoClosingPairs=e.StandardAutoClosingPairConditional=e.IndentAction=void 0;var b;(function(S){S[S.None=0]="None",S[S.Indent=1]="Indent",S[S.IndentOutdent=2]="IndentOutdent",S[S.Outdent=3]="Outdent"})(b=e.IndentAction||(e.IndentAction={}));class N{constructor(C){if(this.open=C.open,this.close=C.close,this._standardTokenMask=0,Array.isArray(C.notIn))for(let d=0,g=C.notIn.length;dg&&(g=c)}return g}else{if(typeof w=="string")return d?w==="*"?5:w===C?10:0:0;if(w){const{language:g,pattern:p,scheme:c,hasAccessToAllModels:o}=w;if(!d&&!o)return 0;let s=0;if(c)if(c===S.scheme)s=10;else if(c==="*")s=5;else return 0;if(g)if(g===C)s=10;else if(g==="*")s=Math.max(s,5);else return 0;if(p){let a;if(typeof p=="string"?a=p:a=Object.assign(Object.assign({},p),{base:N.normalize(p.base)}),a===S.fsPath||b.match(a,S.fsPath))s=10;else return 0}return s}else return 0}}e.score=M}),define(Q[375],J([0,1,91]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeLinks=e.LinkComputer=e.StateMachine=e.Uint8Matrix=void 0;class N{constructor(o,s,a){const u=new Uint8Array(o*s);for(let r=0,i=o*s;rs&&(s=t),n>a&&(a=n),l>a&&(a=l)}s++,a++;let u=new N(a,s,0);for(let r=0,i=o.length;r=this._maxCharCode?0:this._states.get(o,s)}}e.StateMachine=M;let w=null;function S(){return w===null&&(w=new M([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),w}let C=null;function d(){if(C===null){C=new b.CharacterClassifier(0);const c=` <>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u3011\u300F\u300D\u300B\u3009\u201D\u2019\uFF40\uFF5E\u2026`;for(let s=0;su);if(u>0){const n=s.charCodeAt(u-1),t=s.charCodeAt(i);(n===40&&t===41||n===91&&t===93||n===123&&t===125)&&i--}return{range:{startLineNumber:a,startColumn:u+1,endLineNumber:a,endColumn:i+2},url:s.substring(u,i+1)}}static computeLinks(o,s=S()){const a=d();let u=[];for(let r=1,i=o.getLineCount();r<=i;r++){const n=o.getLineContent(r),t=n.length;let l=0,h=0,m=0,_=1,f=!1,v=!1,y=!1,L=!1;for(;l0&&w.getLanguageId(c-1)===g;)c--;return new N(w,g,c,p+1,w.getStartOffset(c),w.getEndOffset(p))}e.createScopedLineTokens=b;class N{constructor(S,C,d,g,p,c){this._actual=S,this.languageId=C,this._firstTokenIndex=d,this._lastTokenIndex=g,this.firstCharOffset=p,this._lastCharOffset=c}getLineContent(){return this._actual.getLineContent().substring(this.firstCharOffset,this._lastCharOffset)}getActualLineContentBefore(S){return this._actual.getLineContent().substring(0,this.firstCharOffset+S)}getTokenCount(){return this._lastTokenIndex-this._firstTokenIndex}findTokenIndexAtOffset(S){return this._actual.findTokenIndexAtOffset(S+this.firstCharOffset)-this._firstTokenIndex}getStandardTokenType(S){return this._actual.getStandardTokenType(S+this._firstTokenIndex)}}e.ScopedLineTokens=N;function M(w){return(w&7)!=0}e.ignoreBracketsInToken=M}),define(Q[376],J([0,1,109]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CharacterPairSupport=void 0;class N{constructor(w){if(w.autoClosingPairs?this._autoClosingPairs=w.autoClosingPairs.map(S=>new b.StandardAutoClosingPairConditional(S)):w.brackets?this._autoClosingPairs=w.brackets.map(S=>new b.StandardAutoClosingPairConditional({open:S[0],close:S[1]})):this._autoClosingPairs=[],w.__electricCharacterSupport&&w.__electricCharacterSupport.docComment){const S=w.__electricCharacterSupport.docComment;this._autoClosingPairs.push(new b.StandardAutoClosingPairConditional({open:S.open,close:S.close||""}))}this._autoCloseBefore=typeof w.autoCloseBefore=="string"?w.autoCloseBefore:N.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED,this._surroundingPairs=w.surroundingPairs||this._autoClosingPairs}getAutoClosingPairs(){return this._autoClosingPairs}getAutoCloseBeforeSet(){return this._autoCloseBefore}static shouldAutoClosePair(w,S,C){if(S.getTokenCount()===0)return!0;const d=S.findTokenIndexAtOffset(C-2),g=S.getStandardTokenType(d);return w.isOK(g)}getSurroundingPairs(){return this._surroundingPairs}}e.CharacterPairSupport=N,N.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED=`;:.,=}])> + `}),define(Q[377],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentRulesSupport=void 0;function b(M){return M.global&&(M.lastIndex=0),!0}class N{constructor(w){this._indentationRules=w}shouldIncrease(w){return!!(this._indentationRules&&this._indentationRules.increaseIndentPattern&&b(this._indentationRules.increaseIndentPattern)&&this._indentationRules.increaseIndentPattern.test(w))}shouldDecrease(w){return!!(this._indentationRules&&this._indentationRules.decreaseIndentPattern&&b(this._indentationRules.decreaseIndentPattern)&&this._indentationRules.decreaseIndentPattern.test(w))}shouldIndentNextLine(w){return!!(this._indentationRules&&this._indentationRules.indentNextLinePattern&&b(this._indentationRules.indentNextLinePattern)&&this._indentationRules.indentNextLinePattern.test(w))}shouldIgnore(w){return!!(this._indentationRules&&this._indentationRules.unIndentedLinePattern&&b(this._indentationRules.unIndentedLinePattern)&&this._indentationRules.unIndentedLinePattern.test(w))}getIndentMetadata(w){let S=0;return this.shouldIncrease(w)&&(S+=1),this.shouldDecrease(w)&&(S+=2),this.shouldIndentNextLine(w)&&(S+=4),this.shouldIgnore(w)&&(S+=8),S}}e.IndentRulesSupport=N}),define(Q[378],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BasicInplaceReplace=void 0;class b{constructor(){this._defaultValueSet=[["true","false"],["True","False"],["Private","Public","Friend","ReadOnly","Partial","Protected","WriteOnly"],["public","protected","private"]]}navigateValueSet(M,w,S,C,d){if(M&&w){let g=this.doNavigateValueSet(w,d);if(g)return{range:M,value:g}}if(S&&C){let g=this.doNavigateValueSet(C,d);if(g)return{range:S,value:g}}return null}doNavigateValueSet(M,w){let S=this.numberReplace(M,w);return S!==null?S:this.textReplace(M,w)}numberReplace(M,w){let S=Math.pow(10,M.length-(M.lastIndexOf(".")+1)),C=Number(M),d=parseFloat(M);return!isNaN(C)&&!isNaN(d)&&C===d?C===0&&!w?null:(C=Math.floor(C*S),C+=w?S:-S,String(C/S)):null}textReplace(M,w){return this.valueSetsReplace(this._defaultValueSet,M,w)}valueSetsReplace(M,w,S){let C=null;for(let d=0,g=M.length;C===null&&d=0?(C+=S?1:-1,C<0?C=M.length-1:C%=M.length,M[C]):null}}e.BasicInplaceReplace=b,b.INSTANCE=new b}),define(Q[379],J([0,1,12,8,109]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OnEnterSupport=void 0;class w{constructor(C){C=C||{},C.brackets=C.brackets||[["(",")"],["{","}"],["[","]"]],this._brackets=[],C.brackets.forEach(d=>{const g=w._createOpenBracketRegExp(d[0]),p=w._createCloseBracketRegExp(d[1]);g&&p&&this._brackets.push({open:d[0],openRegExp:g,close:d[1],closeRegExp:p})}),this._regExpRules=C.onEnterRules||[]}onEnter(C,d,g,p){if(C>=3)for(let c=0,o=this._regExpRules.length;cu.reg?u.reg.test(u.text):!0))return s.action}if(C>=2&&g.length>0&&p.length>0)for(let c=0,o=this._brackets.length;c=2&&g.length>0){for(let c=0,o=this._brackets.length;c[v[0].toLowerCase(),v[1].toLowerCase()]);const h=[];for(let v=0;v{const[L,I]=v,[k,E]=y;return L===k||L===E||I===k||I===E},_=(v,y)=>{const L=Math.min(v,y),I=Math.max(v,y);for(let k=0;k0&&f.push({open:y,close:L})}return f}class C{constructor(l,h){const m=S(h);this.brackets=m.map((_,f)=>new w(l,f,_.open,_.close,c(_.open,_.close,m,f),o(_.open,_.close,m,f))),this.forwardRegex=s(this.brackets),this.reversedRegex=a(this.brackets),this.textIsBracket={},this.textIsOpenBracket={},this.maxBracketLength=0;for(const _ of this.brackets){for(const f of _.open)this.textIsBracket[f]=_,this.textIsOpenBracket[f]=!0,this.maxBracketLength=Math.max(this.maxBracketLength,f.length);for(const f of _.close)this.textIsBracket[f]=_,this.textIsOpenBracket[f]=!1,this.maxBracketLength=Math.max(this.maxBracketLength,f.length)}}}e.RichEditBrackets=C;function d(t,l,h,m){for(let _=0,f=l.length;_=0&&m.push(y);for(const y of v.close)y.indexOf(t)>=0&&m.push(y)}}function g(t,l){return t.length-l.length}function p(t){if(t.length<=1)return t;const l=[],h=new Set;for(const m of t)h.has(m)||(l.push(m),h.add(m));return l}function c(t,l,h,m){let _=[];_=_.concat(t),_=_.concat(l);for(let f=0,v=_.length;f=0;v--)_[f++]=m.charCodeAt(v);return N.getPlatformTextDecoder().decode(_)}else{let _=[],f=0;for(let v=m.length-1;v>=0;v--)_[f++]=m.charAt(v);return _.join("")}}let l=null,h=null;return function(_){return l!==_&&(l=_,h=t(l)),h}}();class n{static _findPrevBracketInText(l,h,m,_){let f=m.match(l);if(!f)return null;let v=m.length-(f.index||0),y=f[0].length,L=_+v;return new M.Range(h,L-y+1,h,L+1)}static findPrevBracketInRange(l,h,m,_,f){const y=i(m).substring(m.length-f,m.length-_);return this._findPrevBracketInText(l,h,y,_)}static findNextBracketInText(l,h,m,_){let f=m.match(l);if(!f)return null;let v=f.index||0,y=f[0].length;if(y===0)return null;let L=_+v;return new M.Range(h,L+1,h,L+1+y)}static findNextBracketInRange(l,h,m,_,f){const v=m.substring(_,f);return this.findNextBracketInText(l,h,v,_)}}e.BracketsUtils=n}),define(Q[380],J([0,1,167,168]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketElectricCharacterSupport=void 0;class M{constructor(S){this._richEditBrackets=S}getElectricCharacters(){let S=[];if(this._richEditBrackets)for(const C of this._richEditBrackets.brackets)for(const d of C.close){const g=d.charAt(d.length-1);S.push(g)}return S=S.filter((C,d,g)=>g.indexOf(C)===d),S}onElectricCharacter(S,C,d){if(!this._richEditBrackets||this._richEditBrackets.brackets.length===0)return null;const g=C.findTokenIndexAtOffset(d-1);if(b.ignoreBracketsInToken(C.getStandardTokenType(g)))return null;const p=this._richEditBrackets.reversedRegex,c=C.getLineContent().substring(0,d-1)+S,o=N.BracketsUtils.findPrevBracketInRange(p,1,c,0,c.length);if(!o)return null;const s=c.substring(o.startColumn-1,o.endColumn-1).toLowerCase();if(this._richEditBrackets.textIsOpenBracket[s])return null;const u=C.getActualLineContentBefore(o.startColumn-1);return/^\s*$/.test(u)?{matchOpenBracket:s}:null}}e.BracketElectricCharacterSupport=M}),define(Q[41],J([0,1,6,2,8,128,109,167,376,380,377,379,168]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageConfigurationRegistry=e.LanguageConfigurationRegistryImpl=e.LanguageConfigurationChangeEvent=e.RichEditSupport=void 0;class s{constructor(t,l){this._languageIdentifier=t,this._brackets=null,this._electricCharacter=null,this._conf=l,this._onEnterSupport=this._conf.brackets||this._conf.indentationRules||this._conf.onEnterRules?new c.OnEnterSupport(this._conf):null,this.comments=s._handleComments(this._conf),this.characterPair=new d.CharacterPairSupport(this._conf),this.wordDefinition=this._conf.wordPattern||w.DEFAULT_WORD_REGEXP,this.indentationRules=this._conf.indentationRules,this._conf.indentationRules?this.indentRulesSupport=new p.IndentRulesSupport(this._conf.indentationRules):this.indentRulesSupport=null,this.foldingRules=this._conf.folding||{}}get brackets(){return!this._brackets&&this._conf.brackets&&(this._brackets=new o.RichEditBrackets(this._languageIdentifier,this._conf.brackets)),this._brackets}get electricCharacter(){return this._electricCharacter||(this._electricCharacter=new g.BracketElectricCharacterSupport(this.brackets)),this._electricCharacter}onEnter(t,l,h,m){return this._onEnterSupport?this._onEnterSupport.onEnter(t,l,h,m):null}static _handleComments(t){let l=t.comments;if(!l)return null;let h={};if(l.lineComment&&(h.lineCommentToken=l.lineComment),l.blockComment){let[m,_]=l.blockComment;h.blockCommentStartToken=m,h.blockCommentEndToken=_}return h}}e.RichEditSupport=s;class a{constructor(t){this.languageIdentifier=t}}e.LanguageConfigurationChangeEvent=a;class u{constructor(t,l,h){this.configuration=t,this.priority=l,this.order=h}static cmp(t,l){return t.priority===l.priority?t.order-l.order:t.priority-l.priority}}class r{constructor(t){this.languageIdentifier=t,this._resolved=null,this._entries=[],this._order=0,this._resolved=null}register(t,l){const h=new u(t,l,++this._order);return this._entries.push(h),this._resolved=null,N.toDisposable(()=>{for(let m=0;m{_.dispose(),this._onDidChange.fire(new a(t))})}_getRichEditSupport(t){const l=this._entries2.get(t);return l?l.getRichEditSupport():null}getIndentationRules(t){const l=this._getRichEditSupport(t);return l&&l.indentationRules||null}_getElectricCharacterSupport(t){let l=this._getRichEditSupport(t);return l&&l.electricCharacter||null}getElectricCharacters(t){let l=this._getElectricCharacterSupport(t);return l?l.getElectricCharacters():[]}onElectricCharacter(t,l,h){let m=C.createScopedLineTokens(l,h-1),_=this._getElectricCharacterSupport(m.languageId);return _?_.onElectricCharacter(t,m,h-m.firstCharOffset):null}getComments(t){let l=this._getRichEditSupport(t);return l&&l.comments||null}_getCharacterPairSupport(t){let l=this._getRichEditSupport(t);return l&&l.characterPair||null}getAutoClosingPairs(t){const l=this._getCharacterPairSupport(t);return new S.AutoClosingPairs(l?l.getAutoClosingPairs():[])}getAutoCloseBeforeSet(t){let l=this._getCharacterPairSupport(t);return l?l.getAutoCloseBeforeSet():d.CharacterPairSupport.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED}getSurroundingPairs(t){let l=this._getCharacterPairSupport(t);return l?l.getSurroundingPairs():[]}shouldAutoClosePair(t,l,h){const m=C.createScopedLineTokens(l,h-1);return d.CharacterPairSupport.shouldAutoClosePair(t,m,h-m.firstCharOffset)}getWordDefinition(t){let l=this._getRichEditSupport(t);return l?w.ensureValidWordDefinition(l.wordDefinition||null):w.ensureValidWordDefinition(null)}getFoldingRules(t){let l=this._getRichEditSupport(t);return l?l.foldingRules:{}}getIndentRulesSupport(t){let l=this._getRichEditSupport(t);return l&&l.indentRulesSupport||null}getPrecedingValidLine(t,l,h){let m=t.getLanguageIdAtPosition(l,0);if(l>1){let _,f=-1;for(_=l-1;_>=1;_--){if(t.getLanguageIdAtPosition(_,0)!==m)return f;let v=t.getLineContent(_);if(h.shouldIgnore(v)||/^\s+$/.test(v)||v===""){f=_;continue}return _}}return-1}getInheritIndentForLine(t,l,h,m=!0){if(t<4)return null;const _=this.getIndentRulesSupport(l.getLanguageIdentifier().id);if(!_)return null;if(h<=1)return{indentation:"",action:null};const f=this.getPrecedingValidLine(l,h,_);if(f<0)return null;if(f<1)return{indentation:"",action:null};const v=l.getLineContent(f);if(_.shouldIncrease(v)||_.shouldIndentNextLine(v))return{indentation:M.getLeadingWhitespace(v),action:S.IndentAction.Indent,line:f};if(_.shouldDecrease(v))return{indentation:M.getLeadingWhitespace(v),action:null,line:f};{if(f===1)return{indentation:M.getLeadingWhitespace(l.getLineContent(f)),action:null,line:f};const y=f-1,L=_.getIndentMetadata(l.getLineContent(y));if(!(L&(1|2))&&L&4){let I=0;for(let k=y-1;k>0;k--)if(!_.shouldIndentNextLine(l.getLineContent(k))){I=k;break}return{indentation:M.getLeadingWhitespace(l.getLineContent(I+1)),action:null,line:I+1}}if(m)return{indentation:M.getLeadingWhitespace(l.getLineContent(f)),action:null,line:f};for(let I=f;I>0;I--){const k=l.getLineContent(I);if(_.shouldIncrease(k))return{indentation:M.getLeadingWhitespace(k),action:S.IndentAction.Indent,line:I};if(_.shouldIndentNextLine(k)){let E=0;for(let T=I-1;T>0;T--)if(!_.shouldIndentNextLine(l.getLineContent(I))){E=T;break}return{indentation:M.getLeadingWhitespace(l.getLineContent(E+1)),action:null,line:E+1}}else if(_.shouldDecrease(k))return{indentation:M.getLeadingWhitespace(k),action:null,line:I}}return{indentation:M.getLeadingWhitespace(l.getLineContent(1)),action:null,line:1}}}getGoodIndentForLine(t,l,h,m,_){if(t<4)return null;const f=this._getRichEditSupport(h);if(!f)return null;const v=this.getIndentRulesSupport(h);if(!v)return null;const y=this.getInheritIndentForLine(t,l,m),L=l.getLineContent(m);if(y){const I=y.line;if(I!==void 0){const k=f.onEnter(t,"",l.getLineContent(I),"");if(k){let E=M.getLeadingWhitespace(l.getLineContent(I));return k.removeText&&(E=E.substring(0,E.length-k.removeText)),k.indentAction===S.IndentAction.Indent||k.indentAction===S.IndentAction.IndentOutdent?E=_.shiftIndent(E):k.indentAction===S.IndentAction.Outdent&&(E=_.unshiftIndent(E)),v.shouldDecrease(L)&&(E=_.unshiftIndent(E)),k.appendText&&(E+=k.appendText),M.getLeadingWhitespace(E)}}return v.shouldDecrease(L)?y.action===S.IndentAction.Indent?y.indentation:_.unshiftIndent(y.indentation):y.action===S.IndentAction.Indent?_.shiftIndent(y.indentation):y.indentation}return null}getIndentForEnter(t,l,h,m){if(t<4)return null;l.forceTokenization(h.startLineNumber);const _=l.getLineTokens(h.startLineNumber),f=C.createScopedLineTokens(_,h.startColumn-1),v=f.getLineContent();let y=!1,L;f.firstCharOffset>0&&_.getLanguageId(0)!==f.languageId?(y=!0,L=v.substr(0,h.startColumn-1-f.firstCharOffset)):L=_.getLineContent().substring(0,h.startColumn-1);let I;h.isEmpty()?I=v.substr(h.startColumn-1-f.firstCharOffset):I=this.getScopedLineTokens(l,h.endLineNumber,h.endColumn).getLineContent().substr(h.endColumn-1-f.firstCharOffset);const k=this.getIndentRulesSupport(f.languageId);if(!k)return null;const E=L,T=M.getLeadingWhitespace(L),O={getLineTokens:D=>l.getLineTokens(D),getLanguageIdentifier:()=>l.getLanguageIdentifier(),getLanguageIdAtPosition:(D,R)=>l.getLanguageIdAtPosition(D,R),getLineContent:D=>D===h.startLineNumber?E:l.getLineContent(D)},A=M.getLeadingWhitespace(_.getLineContent()),B=this.getInheritIndentForLine(t,O,h.startLineNumber+1);if(!B){const D=y?A:T;return{beforeEnter:D,afterEnter:D}}let F=y?A:B.indentation;return B.action===S.IndentAction.Indent&&(F=m.shiftIndent(F)),k.shouldDecrease(I)&&(F=m.unshiftIndent(F)),{beforeEnter:y?A:T,afterEnter:F}}getIndentActionForType(t,l,h,m,_){if(t<4)return null;const f=this.getScopedLineTokens(l,h.startLineNumber,h.startColumn);if(f.firstCharOffset)return null;const v=this.getIndentRulesSupport(f.languageId);if(!v)return null;const y=f.getLineContent(),L=y.substr(0,h.startColumn-1-f.firstCharOffset);let I;if(h.isEmpty()?I=y.substr(h.startColumn-1-f.firstCharOffset):I=this.getScopedLineTokens(l,h.endLineNumber,h.endColumn).getLineContent().substr(h.endColumn-1-f.firstCharOffset),!v.shouldDecrease(L+I)&&v.shouldDecrease(L+m+I)){const k=this.getInheritIndentForLine(t,l,h.startLineNumber,!1);if(!k)return null;let E=k.indentation;return k.action!==S.IndentAction.Indent&&(E=_.unshiftIndent(E)),E}return null}getIndentMetadata(t,l){const h=this.getIndentRulesSupport(t.getLanguageIdentifier().id);return!h||l<1||l>t.getLineCount()?null:h.getIndentMetadata(t.getLineContent(l))}getEnterAction(t,l,h){const m=this.getScopedLineTokens(l,h.startLineNumber,h.startColumn),_=this._getRichEditSupport(m.languageId);if(!_)return null;const f=m.getLineContent(),v=f.substr(0,h.startColumn-1-m.firstCharOffset);let y;h.isEmpty()?y=f.substr(h.startColumn-1-m.firstCharOffset):y=this.getScopedLineTokens(l,h.endLineNumber,h.endColumn).getLineContent().substr(h.endColumn-1-m.firstCharOffset);let L="";if(h.startLineNumber>1&&m.firstCharOffset===0){const A=this.getScopedLineTokens(l,h.startLineNumber-1);A.languageId===m.languageId&&(L=A.getLineContent())}const I=_.onEnter(t,L,v,y);if(!I)return null;const k=I.indentAction;let E=I.appendText;const T=I.removeText||0;E?k===S.IndentAction.Indent&&(E=" "+E):k===S.IndentAction.Indent||k===S.IndentAction.IndentOutdent?E=" ":E="";let O=this.getIndentationAtPosition(l,h.startLineNumber,h.startColumn);return T&&(O=O.substring(0,O.length-T)),{indentAction:k,appendText:E,removeText:T,indentation:O}}getIndentationAtPosition(t,l,h){const m=t.getLineContent(l);let _=M.getLeadingWhitespace(m);return _.length>h-1&&(_=_.substring(0,h-1)),_}getScopedLineTokens(t,l,h){t.forceTokenization(l);const m=t.getLineTokens(l),_=typeof h=="undefined"?t.getLineMaxColumn(l)-1:h-1;return C.createScopedLineTokens(m,_)}getBracketsSupport(t){const l=this._getRichEditSupport(t);return l&&l.brackets||null}}e.LanguageConfigurationRegistryImpl=i,e.LanguageConfigurationRegistry=new i}),define(Q[381],J([0,1,29]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateTokensCSSForColorMap=e.ThemeTrieElement=e.ThemeTrieElementRule=e.strcmp=e.toStandardTokenType=e.TokenTheme=e.ColorMap=e.parseTokenTheme=e.ParsedTokenThemeRule=void 0;class N{constructor(r,i,n,t,l){this.token=r,this.index=i,this.fontStyle=n,this.foreground=t,this.background=l}}e.ParsedTokenThemeRule=N;function M(u){if(!u||!Array.isArray(u))return[];let r=[],i=0;for(let n=0,t=u.length;n{let L=c(v.token,y.token);return L!==0?L:v.index-y.index});let i=0,n="000000",t="ffffff";for(;u.length>=1&&u[0].token==="";){let v=u.shift();v.fontStyle!==-1&&(i=v.fontStyle),v.foreground!==null&&(n=v.foreground),v.background!==null&&(t=v.background)}let l=new C;for(let v of r)l.getId(v);let h=l.getId(n),m=l.getId(t),_=new o(i,h,m),f=new s(_);for(let v=0,y=u.length;v>>0,this._cache.set(i,n)}return(n|r<<0)>>>0}}e.TokenTheme=d;const g=/\b(comment|string|regex|regexp)\b/;function p(u){let r=u.match(g);if(!r)return 0;switch(r[1]){case"comment":return 1;case"string":return 2;case"regex":return 4;case"regexp":return 4}throw new Error("Unexpected match for standard token type!")}e.toStandardTokenType=p;function c(u,r){return ur?1:0}e.strcmp=c;class o{constructor(r,i,n){this._fontStyle=r,this._foreground=i,this._background=n,this.metadata=(this._fontStyle<<11|this._foreground<<14|this._background<<23)>>>0}clone(){return new o(this._fontStyle,this._foreground,this._background)}acceptOverwrite(r,i,n){r!==-1&&(this._fontStyle=r),i!==0&&(this._foreground=i),n!==0&&(this._background=n),this.metadata=(this._fontStyle<<11|this._foreground<<14|this._background<<23)>>>0}}e.ThemeTrieElementRule=o;class s{constructor(r){this._mainRule=r,this._children=new Map}match(r){if(r==="")return this._mainRule;let i=r.indexOf("."),n,t;i===-1?(n=r,t=""):(n=r.substring(0,i),t=r.substring(i+1));let l=this._children.get(n);return typeof l!="undefined"?l.match(t):this._mainRule}insert(r,i,n,t){if(r===""){this._mainRule.acceptOverwrite(i,n,t);return}let l=r.indexOf("."),h,m;l===-1?(h=r,m=""):(h=r.substring(0,l),m=r.substring(l+1));let _=this._children.get(h);typeof _=="undefined"&&(_=new s(this._mainRule.clone()),this._children.set(h,_)),_.insert(m,i,n,t)}}e.ThemeTrieElement=s;function a(u){let r=[];for(let i=1,n=u.length;i{this._map.get(S)===C&&(this._map.delete(S),this.fire([S]))})}registerPromise(S,C){let d=null,g=!1;return this._promises.set(S,C.then(p=>{this._promises.delete(S),!(g||!p)&&(d=this.register(S,p))})),N.toDisposable(()=>{g=!0,d&&d.dispose()})}getPromise(S){const C=this.get(S);if(C)return Promise.resolve(C);const d=this._promises.get(S);return d?d.then(g=>this.get(S)):null}get(S){return this._map.get(S)||null}setColorMap(S){this._colorMap=S,this._onDidChange.fire({changedLanguages:Array.from(this._map.keys()),changedColorMap:!0})}getColorMap(){return this._colorMap}getDefaultBackground(){return this._colorMap&&this._colorMap.length>2?this._colorMap[2]:null}}e.TokenizationRegistryImpl=M}),define(Q[383],J([0,1,101,17]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.encodeSemanticTokensDto=void 0;function M(d){for(let g=0,p=d.length;gd&&(n=d-t);const l=u.color;let h=this._color2Id[l];h||(h=++this._lastAssignedId,this._color2Id[l]=h,this._id2Color[h]=l);const m=new b(n-t,n+t,h);u.setColorZone(m),o.push(m)}return this._colorZonesInvalid=!1,o.sort(b.compare),o}}e.OverviewZoneManager=M}),define(Q[110],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VisibleRanges=e.HorizontalPosition=e.HorizontalRange=e.LineVisibleRanges=e.RenderingContext=e.RestrictedRenderingContext=void 0;class b{constructor(g,p){this._viewLayout=g,this.viewportData=p,this.scrollWidth=this._viewLayout.getScrollWidth(),this.scrollHeight=this._viewLayout.getScrollHeight(),this.visibleRange=this.viewportData.visibleRange,this.bigNumbersDelta=this.viewportData.bigNumbersDelta;const c=this._viewLayout.getCurrentViewport();this.scrollTop=c.top,this.scrollLeft=c.left,this.viewportWidth=c.width,this.viewportHeight=c.height}getScrolledTopFromAbsoluteTop(g){return g-this.scrollTop}getVerticalOffsetForLineNumber(g){return this._viewLayout.getVerticalOffsetForLineNumber(g)}getDecorationsInViewport(){return this.viewportData.getDecorationsInViewport()}}e.RestrictedRenderingContext=b;class N extends b{constructor(g,p,c){super(g,p);this._viewLines=c}linesVisibleRangesForRange(g,p){return this._viewLines.linesVisibleRangesForRange(g,p)}visibleRangeForPosition(g){return this._viewLines.visibleRangeForPosition(g)}}e.RenderingContext=N;class M{constructor(g,p,c){this.outsideRenderedLine=g,this.lineNumber=p,this.ranges=c}}e.LineVisibleRanges=M;class w{constructor(g,p){this.left=Math.round(g),this.width=Math.round(p)}toString(){return`[${this.left},${this.width}]`}}e.HorizontalRange=w;class S{constructor(g,p){this.outsideRenderedLine=g,this.left=Math.round(p)}}e.HorizontalPosition=S;class C{constructor(g,p){this.outsideRenderedLine=g,this.ranges=p}}e.VisibleRanges=C}),define(Q[384],J([0,1,110]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeUtil=void 0;class N{constructor(S,C){this.left=S,this.width=C}toString(){return`[${this.left},${this.width}]`}static compare(S,C){return S.left-C.left}}class M{static _createRange(){return this._handyReadyRange||(this._handyReadyRange=document.createRange()),this._handyReadyRange}static _detachRange(S,C){S.selectNodeContents(C)}static _readClientRects(S,C,d,g,p){const c=this._createRange();try{return c.setStart(S,C),c.setEnd(d,g),c.getClientRects()}catch(o){return null}finally{this._detachRange(c,p)}}static _mergeAdjacentRanges(S){if(S.length===1)return[new b.HorizontalRange(S[0].left,S[0].width)];S.sort(N.compare);let C=[],d=0,g=S[0].left,p=S[0].width;for(let c=1,o=S.length;c=a?p=Math.max(p,a+u-g):(C[d++]=new b.HorizontalRange(g,p),g=a,p=u)}return C[d++]=new b.HorizontalRange(g,p),C}static _createHorizontalRangesFromClientRects(S,C){if(!S||S.length===0)return null;const d=[];for(let g=0,p=S.length;ga)return null;if(C=Math.min(a,Math.max(s,C)),g=Math.min(a,Math.max(s,g)),C===g&&d===p&&d===0){const n=S.children[C].getClientRects();return this._createHorizontalRangesFromClientRects(n,c)}C!==g&&g>0&&p===0&&(g--,p=1073741824);let u=S.children[C].firstChild,r=S.children[g].firstChild;if((!u||!r)&&(!u&&d===0&&C>0&&(u=S.children[C-1].firstChild,d=1073741824),!r&&p===0&&g>0&&(r=S.children[g-1].firstChild,p=1073741824)),!u||!r)return null;d=Math.min(u.textContent.length,Math.max(0,d)),p=Math.min(r.textContent.length,Math.max(0,p));const i=this._readClientRects(u,d,r,p,o);return this._createHorizontalRangesFromClientRects(i,c)}}e.RangeUtil=M}),define(Q[385],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewContext=e.EditorTheme=void 0;class b{constructor(w){this._theme=w}get type(){return this._theme.type}update(w){this._theme=w}getColor(w){return this._theme.getColor(w)}}e.EditorTheme=b;class N{constructor(w,S,C){this.configuration=w,this.theme=new b(S),this.model=C,this.viewLayout=C.viewLayout}addEventHandler(w){this.model.addViewEventHandler(w)}removeEventHandler(w){this.model.removeViewEventHandler(w)}}e.ViewContext=N}),define(Q[170],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewZonesChangedEvent=e.ViewTokensColorsChangedEvent=e.ViewTokensChangedEvent=e.ViewThemeChangedEvent=e.ViewScrollChangedEvent=e.ViewRevealRangeRequestEvent=e.ViewLinesInsertedEvent=e.ViewLinesDeletedEvent=e.ViewLinesChangedEvent=e.ViewLineMappingChangedEvent=e.ViewLanguageConfigurationEvent=e.ViewFocusChangedEvent=e.ViewFlushedEvent=e.ViewDecorationsChangedEvent=e.ViewCursorStateChangedEvent=e.ViewConfigurationChangedEvent=e.ViewCompositionEndEvent=e.ViewCompositionStartEvent=void 0;class b{constructor(){this.type=0}}e.ViewCompositionStartEvent=b;class N{constructor(){this.type=1}}e.ViewCompositionEndEvent=N;class M{constructor(h){this.type=2,this._source=h}hasChanged(h){return this._source.hasChanged(h)}}e.ViewConfigurationChangedEvent=M;class w{constructor(h,m){this.type=3,this.selections=h,this.modelSelections=m}}e.ViewCursorStateChangedEvent=w;class S{constructor(h){this.type=4,h?(this.affectsMinimap=h.affectsMinimap,this.affectsOverviewRuler=h.affectsOverviewRuler):(this.affectsMinimap=!0,this.affectsOverviewRuler=!0)}}e.ViewDecorationsChangedEvent=S;class C{constructor(){this.type=5}}e.ViewFlushedEvent=C;class d{constructor(h){this.type=6,this.isFocused=h}}e.ViewFocusChangedEvent=d;class g{constructor(){this.type=7}}e.ViewLanguageConfigurationEvent=g;class p{constructor(){this.type=8}}e.ViewLineMappingChangedEvent=p;class c{constructor(h,m){this.type=9,this.fromLineNumber=h,this.toLineNumber=m}}e.ViewLinesChangedEvent=c;class o{constructor(h,m){this.type=10,this.fromLineNumber=h,this.toLineNumber=m}}e.ViewLinesDeletedEvent=o;class s{constructor(h,m){this.type=11,this.fromLineNumber=h,this.toLineNumber=m}}e.ViewLinesInsertedEvent=s;class a{constructor(h,m,_,f,v,y){this.type=12,this.source=h,this.range=m,this.selections=_,this.verticalType=f,this.revealHorizontal=v,this.scrollType=y}}e.ViewRevealRangeRequestEvent=a;class u{constructor(h){this.type=13,this.scrollWidth=h.scrollWidth,this.scrollLeft=h.scrollLeft,this.scrollHeight=h.scrollHeight,this.scrollTop=h.scrollTop,this.scrollWidthChanged=h.scrollWidthChanged,this.scrollLeftChanged=h.scrollLeftChanged,this.scrollHeightChanged=h.scrollHeightChanged,this.scrollTopChanged=h.scrollTopChanged}}e.ViewScrollChangedEvent=u;class r{constructor(){this.type=14}}e.ViewThemeChangedEvent=r;class i{constructor(h){this.type=15,this.ranges=h}}e.ViewTokensChangedEvent=i;class n{constructor(){this.type=16}}e.ViewTokensColorsChangedEvent=n;class t{constructor(){this.type=17}}e.ViewZonesChangedEvent=t}),define(Q[171],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineDecorationsNormalizer=e.DecorationSegment=e.LineDecoration=void 0;class N{constructor(d,g,p,c){this.startColumn=d,this.endColumn=g,this.className=p,this.type=c}static _equals(d,g){return d.startColumn===g.startColumn&&d.endColumn===g.endColumn&&d.className===g.className&&d.type===g.type}static equalsArr(d,g){const p=d.length,c=g.length;if(p!==c)return!1;for(let o=0;o=o||(a[u++]=new N(Math.max(1,r.startColumn-c+1),Math.min(s+1,r.endColumn-c+1),r.className,r.type));return a}static filter(d,g,p,c){if(d.length===0)return[];let o=[],s=0;for(let a=0,u=d.length;ag)&&!(i.isEmpty()&&(r.type===0||r.type===3))){const n=i.startLineNumber===g?i.startColumn:p,t=i.endLineNumber===g?i.endColumn:c;o[s++]=new N(n,t,r.inlineClassName,r.type)}}return o}static _typeCompare(d,g){const p=[2,0,1,3];return p[d]-p[g]}static compare(d,g){if(d.startColumn===g.startColumn){if(d.endColumn===g.endColumn){const p=N._typeCompare(d.type,g.type);return p===0?d.classNameg.className?1:0:p}return d.endColumn-g.endColumn}return d.startColumn-g.startColumn}}e.LineDecoration=N;class M{constructor(d,g,p,c){this.startOffset=d,this.endOffset=g,this.className=p,this.metadata=c}}e.DecorationSegment=M;class w{constructor(){this.stopOffsets=[],this.classNames=[],this.metadata=[],this.count=0}static _metadata(d){let g=0;for(let p=0,c=d.length;p0&&this.stopOffsets[0]0&&g=d){this.stopOffsets.splice(c,0,d),this.classNames.splice(c,0,g),this.metadata.splice(c,0,p);break}this.count++}}class S{static normalize(d,g){if(g.length===0)return[];let p=[];const c=new w;let o=0;for(let s=0,a=g.length;s1){const m=d.charCodeAt(r-2);b.isHighSurrogate(m)&&r--}if(i>1){const m=d.charCodeAt(i-2);b.isHighSurrogate(m)&&i--}const l=r-1,h=i-2;o=c.consumeLowerThan(l,o,p),c.count===0&&(o=l),c.insert(h,n,t)}return c.consumeLowerThan(1073741824,o,p),p}}e.LineDecorationsNormalizer=S}),define(Q[386],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesLayout=e.EditorWhitespace=void 0;class N{constructor(){this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[]}insert(C){this._hasPending=!0,this._inserts.push(C)}change(C){this._hasPending=!0,this._changes.push(C)}remove(C){this._hasPending=!0,this._removes.push(C)}mustCommit(){return this._hasPending}commit(C){if(!!this._hasPending){const d=this._inserts,g=this._changes,p=this._removes;this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[],C._commitPendingChanges(d,g,p)}}}class M{constructor(C,d,g,p,c){this.id=C,this.afterLineNumber=d,this.ordinal=g,this.height=p,this.minWidth=c,this.prefixSum=0}}e.EditorWhitespace=M;class w{constructor(C,d,g,p){this._instanceId=b.singleLetterHash(++w.INSTANCE_COUNT),this._pendingChanges=new N,this._lastWhitespaceId=0,this._arr=[],this._prefixSumValidIndex=-1,this._minWidth=-1,this._lineCount=C,this._lineHeight=d,this._paddingTop=g,this._paddingBottom=p}static findInsertionIndex(C,d,g){let p=0,c=C.length;for(;p>>1;d===C[o].afterLineNumber?g{d=!0,p=p|0,c=c|0,o=o|0,s=s|0;const a=this._instanceId+ ++this._lastWhitespaceId;return this._pendingChanges.insert(new M(a,p,c,o,s)),a},changeOneWhitespace:(p,c,o)=>{d=!0,c=c|0,o=o|0,this._pendingChanges.change({id:p,newAfterLineNumber:c,newHeight:o})},removeWhitespace:p=>{d=!0,this._pendingChanges.remove({id:p})}})}finally{this._pendingChanges.commit(this)}return d}_commitPendingChanges(C,d,g){if((C.length>0||g.length>0)&&(this._minWidth=-1),C.length+d.length+g.length<=1){for(const a of C)this._insertWhitespace(a);for(const a of d)this._changeOneWhitespace(a.id,a.newAfterLineNumber,a.newHeight);for(const a of g){const u=this._findWhitespaceIndex(a.id);u!==-1&&this._removeWhitespace(u)}return}const p=new Set;for(const a of g)p.add(a.id);const c=new Map;for(const a of d)c.set(a.id,a);const o=a=>{let u=[];for(const r of a)if(!p.has(r.id)){if(c.has(r.id)){const i=c.get(r.id);r.afterLineNumber=i.newAfterLineNumber,r.height=i.newHeight}u.push(r)}return u},s=o(this._arr).concat(o(C));s.sort((a,u)=>a.afterLineNumber===u.afterLineNumber?a.ordinal-u.ordinal:a.afterLineNumber-u.afterLineNumber),this._arr=s,this._prefixSumValidIndex=-1}_checkPendingChanges(){this._pendingChanges.mustCommit()&&this._pendingChanges.commit(this)}_insertWhitespace(C){const d=w.findInsertionIndex(this._arr,C.afterLineNumber,C.ordinal);this._arr.splice(d,0,C),this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,d-1)}_findWhitespaceIndex(C){const d=this._arr;for(let g=0,p=d.length;gd&&(this._arr[g].afterLineNumber-=d-C+1)}}onLinesInserted(C,d){this._checkPendingChanges(),C=C|0,d=d|0,this._lineCount+=d-C+1;for(let g=0,p=this._arr.length;g=d.length||d[s+1].afterLineNumber>=C)return s;g=s+1|0}else p=s-1|0}return-1}_findFirstWhitespaceAfterLineNumber(C){C=C|0;const g=this._findLastWhitespaceBeforeLineNumber(C)+1;return g1?d=this._lineHeight*(C-1):d=0;const g=this.getWhitespaceAccumulatedHeightBeforeLineNumber(C);return d+g+this._paddingTop}getWhitespaceMinWidth(){if(this._checkPendingChanges(),this._minWidth===-1){let C=0;for(let d=0,g=this._arr.length;dd}isInTopPadding(C){return this._paddingTop===0?!1:(this._checkPendingChanges(),C=d-this._paddingBottom}getLineNumberAtOrAfterVerticalOffset(C){if(this._checkPendingChanges(),C=C|0,C<0)return 1;const d=this._lineCount|0,g=this._lineHeight;let p=1,c=d;for(;p=s+g)p=o+1;else{if(C>=s)return o;c=o}}return p>d?d:p}getLinesViewportData(C,d){this._checkPendingChanges(),C=C|0,d=d|0;const g=this._lineHeight,p=this.getLineNumberAtOrAfterVerticalOffset(C)|0,c=this.getVerticalOffsetForLineNumber(p)|0;let o=this._lineCount|0,s=this.getFirstWhitespaceIndexAfterLineNumber(p)|0;const a=this.getWhitespacesCount()|0;let u,r;s===-1?(s=a,r=o+1,u=0):(r=this.getAfterLineNumberForWhitespaceIndex(s)|0,u=this.getHeightForWhitespaceIndex(s)|0);let i=c,n=i;const t=5e5;let l=0;c>=t&&(l=Math.floor(c/t)*t,l=Math.floor(l/g)*g,n-=l);const h=[],m=C+(d-C)/2;let _=-1;for(let L=p;L<=o;L++){if(_===-1){const I=i,k=i+g;(I<=m&&mm)&&(_=L)}for(i+=g,h[L-p]=n,n+=g;r===L;)n+=u,i+=u,s++,s>=a?r=o+1:(r=this.getAfterLineNumberForWhitespaceIndex(s)|0,u=this.getHeightForWhitespaceIndex(s)|0);if(i>=d){o=L;break}}_===-1&&(_=o);const f=this.getVerticalOffsetForLineNumber(o)|0;let v=p,y=o;return vd&&y--,{bigNumbersDelta:l,startLineNumber:p,endLineNumber:o,relativeVerticalOffset:h,centeredLineNumber:_,completelyVisibleStartLineNumber:v,completelyVisibleEndLineNumber:y}}getVerticalOffsetForWhitespaceIndex(C){this._checkPendingChanges(),C=C|0;const d=this.getAfterLineNumberForWhitespaceIndex(C);let g;d>=1?g=this._lineHeight*d:g=0;let p;return C>0?p=this.getWhitespacesAccumulatedHeight(C-1):p=0,g+p+this._paddingTop}getWhitespaceIndexAtOrAfterVerticallOffset(C){this._checkPendingChanges(),C=C|0;let d=0,g=this.getWhitespacesCount()-1;if(g<0)return-1;const p=this.getVerticalOffsetForWhitespaceIndex(g),c=this.getHeightForWhitespaceIndex(g);if(C>=p+c)return-1;for(;d=s+a)d=o+1;else{if(C>=s)return o;g=o}}return d}getWhitespaceAtVerticalOffset(C){this._checkPendingChanges(),C=C|0;const d=this.getWhitespaceIndexAtOrAfterVerticallOffset(C);if(d<0||d>=this.getWhitespacesCount())return null;const g=this.getVerticalOffsetForWhitespaceIndex(d);if(g>C)return null;const p=this.getHeightForWhitespaceIndex(d),c=this.getIdForWhitespaceIndex(d),o=this.getAfterLineNumberForWhitespaceIndex(d);return{id:c,afterLineNumber:o,verticalOffset:g,height:p}}getWhitespaceViewportData(C,d){this._checkPendingChanges(),C=C|0,d=d|0;const g=this.getWhitespaceIndexAtOrAfterVerticallOffset(C),p=this.getWhitespacesCount()-1;if(g<0)return[];let c=[];for(let o=g;o<=p;o++){const s=this.getVerticalOffsetForWhitespaceIndex(o),a=this.getHeightForWhitespaceIndex(o);if(s>=d)break;c.push({id:this.getIdForWhitespaceIndex(o),afterLineNumber:this.getAfterLineNumberForWhitespaceIndex(o),verticalOffset:s,height:a})}return c}getWhitespaces(){return this._checkPendingChanges(),this._arr.slice(0)}getWhitespacesCount(){return this._checkPendingChanges(),this._arr.length}getIdForWhitespaceIndex(C){return this._checkPendingChanges(),C=C|0,this._arr[C].id}getAfterLineNumberForWhitespaceIndex(C){return this._checkPendingChanges(),C=C|0,this._arr[C].afterLineNumber}getHeightForWhitespaceIndex(C){return this._checkPendingChanges(),C=C|0,this._arr[C].height}}e.LinesLayout=w,w.INSTANCE_COUNT=0}),define(Q[129],J([0,1,8,93,171]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderViewLine2=e.RenderLineOutput2=e.renderViewLine=e.RenderLineOutput=e.CharacterMapping=e.RenderLineInput=e.LineRange=void 0;class w{constructor(h,m,_){this.endIndex=h,this.type=m,this.metadata=_}isWhitespace(){return!!(this.metadata&1)}}class S{constructor(h,m){this.startOffset=h,this.endOffset=m}equals(h){return this.startOffset===h.startOffset&&this.endOffset===h.endOffset}}e.LineRange=S;class C{constructor(h,m,_,f,v,y,L,I,k,E,T,O,A,B,F,D,R,W,x){this.useMonospaceOptimizations=h,this.canUseHalfwidthRightwardsArrow=m,this.lineContent=_,this.continuesWithWrappedLine=f,this.isBasicASCII=v,this.containsRTL=y,this.fauxIndentLength=L,this.lineTokens=I,this.lineDecorations=k.sort(M.LineDecoration.compare),this.tabSize=E,this.startVisibleColumn=T,this.spaceWidth=O,this.stopRenderingLineAfter=F,this.renderWhitespace=D==="all"?4:D==="boundary"?1:D==="selection"?2:D==="trailing"?3:0,this.renderControlCharacters=R,this.fontLigatures=W,this.selectionsOnLine=x&&x.sort((ee,se)=>ee.startOffset>>16}static getCharIndex(h){return(h&65535)>>>0}setPartData(h,m,_,f){let v=(m<<16|_<<0)>>>0;this._data[h]=v,this._absoluteOffsets[h]=f+_}getAbsoluteOffsets(){return this._absoluteOffsets}charOffsetToPartData(h){return this.length===0?0:h<0?this._data[0]:h>=this.length?this._data[this.length-1]:this._data[h]}partDataToCharOffset(h,m,_){if(this.length===0)return 0;let f=(h<<16|_<<0)>>>0,v=0,y=this.length-1;for(;v+1>>1,D=this._data[F];if(D===f)return F;D>f?y=F:v=F}if(v===y)return v;let L=this._data[v],I=this._data[y];if(L===f)return v;if(I===f)return y;let k=d.getPartIndex(L),E=d.getCharIndex(L),T=d.getPartIndex(I),O;k!==T?O=m:O=d.getCharIndex(I);let A=_-E,B=O-_;return A<=B?v:y}}e.CharacterMapping=d;class g{constructor(h,m,_){this.characterMapping=h,this.containsRTL=m,this.containsForeignElements=_}}e.RenderLineOutput=g;function p(l,h){if(l.lineContent.length===0){let m=0,_="";if(l.lineDecorations.length>0){const f=[],v=[];for(let y=0,L=l.lineDecorations.length;y0?``:"",L=v.length>0?``:"";_=`${y}${L}`}}return h.appendASCIIString(_),new g(new d(0,0),!1,m)}return t(a(l),h)}e.renderViewLine=p;class c{constructor(h,m,_,f){this.characterMapping=h,this.html=m,this.containsRTL=_,this.containsForeignElements=f}}e.RenderLineOutput2=c;function o(l){let h=N.createStringBuilder(1e4),m=p(l,h);return new c(m.characterMapping,h.build(),m.containsRTL,m.containsForeignElements)}e.renderViewLine2=o;class s{constructor(h,m,_,f,v,y,L,I,k,E,T,O,A,B,F){this.fontIsMonospace=h,this.canUseHalfwidthRightwardsArrow=m,this.lineContent=_,this.len=f,this.isOverflowing=v,this.parts=y,this.containsForeignElements=L,this.fauxIndentLength=I,this.tabSize=k,this.startVisibleColumn=E,this.containsRTL=T,this.spaceWidth=O,this.renderSpaceCharCode=A,this.renderWhitespace=B,this.renderControlCharacters=F}}function a(l){const h=l.lineContent;let m,_;l.stopRenderingLineAfter!==-1&&l.stopRenderingLineAfter0){for(let y=0,L=l.lineDecorations.length;y0&&(_[f++]=new w(h,"",0));for(let v=0,y=l.getCount();v=m){_[f++]=new w(m,I,0);break}_[f++]=new w(L,I,0)}}return _}function r(l,h,m){let _=0,f=[],v=0;if(m)for(let y=0,L=h.length;y=50&&(f[v++]=new w(O+1,E,T),A=O+1,O=-1);A!==k&&(f[v++]=new w(k,E,T))}else f[v++]=I;_=k}else for(let y=0,L=h.length;y50){const T=I.type,O=I.metadata,A=Math.ceil(E/50);for(let B=1;B=ne.endOffset&&(se++,ne=k&&k[se]);let V;if(zY)V=!0;else if(P===9)V=!0;else if(P===32)if(E)if(ee)V=!0;else{const U=z+1z),V&&T&&(V=x||z>Y),ee){if(!V||!I&&le>=y){if(O){const U=B>0?A[B-1].endIndex:v;for(let H=U+1;H<=z;H++)A[B++]=new w(H,"mtkw",1)}else A[B++]=new w(z,"mtkw",1);le=le%y}}else(z===R||V&&z>v)&&(A[B++]=new w(z,D,0),le=le%y);for(P===9?le=y:b.isFullWidthCharacter(P)?le+=2:le++,ee=V;z===R;)F++,F0?h.charCodeAt(m-1):0,P=m>1?h.charCodeAt(m-2):0;z===32&&P!==32&&P!==9||(X=!0)}else X=!0;if(X)if(O){const z=B>0?A[B-1].endIndex:v;for(let P=z+1;P<=m;P++)A[B++]=new w(P,"mtkw",1)}else A[B++]=new w(m,"mtkw",1);else A[B++]=new w(m,D,0);return A}function n(l,h,m,_){_.sort(M.LineDecoration.compare);const f=M.LineDecorationsNormalizer.normalize(l,_),v=f.length;let y=0,L=[],I=0,k=0;for(let T=0,O=m.length;Tk&&(k=R.startOffset,L[I++]=new w(k,F,D)),R.endOffset+1<=B)k=R.endOffset+1,L[I++]=new w(k,F+" "+R.className,D|R.metadata),y++;else{k=B,L[I++]=new w(k,F+" "+R.className,D|R.metadata);break}}B>k&&(k=B,L[I++]=new w(k,F,D))}const E=m[m.length-1].endIndex;if(y'):h.appendASCIIString("");for(let ne=0,le=I.length;ne=k&&(oe+=G)}}for(U&&(h.appendASCIIString(' style="width:'),h.appendASCIIString(String(A*$)),h.appendASCIIString('px"')),h.appendASCII(62);W1?h.write1(8594):h.write1(65515);for(let ae=2;ae<=oe;ae++)h.write1(160)}else oe=1,h.write1(B);K+=oe,W>=k&&(x+=oe)}ee=$}else{let $=0;for(h.appendASCII(62);W=k&&(x+=ae)}ee=$}H?Y++:Y=0,h.appendASCIIString("")}return R.setPartData(y,I.length-1,K,se),L&&h.appendASCIIString(""),h.appendASCIIString(""),new g(R,O,f)}}),define(Q[387],J([0,1,3]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewportData=void 0;class N{constructor(w,S,C,d){this.selections=w,this.startLineNumber=S.startLineNumber|0,this.endLineNumber=S.endLineNumber|0,this.relativeVerticalOffset=S.relativeVerticalOffset,this.bigNumbersDelta=S.bigNumbersDelta|0,this.whitespaceViewportData=C,this._model=d,this.visibleRange=new b.Range(S.startLineNumber,this._model.getLineMinColumn(S.startLineNumber),S.endLineNumber,this._model.getLineMaxColumn(S.endLineNumber))}getViewLineRenderingData(w){return this._model.getViewLineRenderingData(this.visibleRange,w)}getDecorationsInViewport(){return this._model.getDecorationsInViewport(this.visibleRange)}}e.ViewportData=N}),define(Q[222],J([0,1,122]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PrefixSumComputer=e.PrefixSumIndexOfResult=void 0;class N{constructor(S,C){this.index=S,this.remainder=C}}e.PrefixSumIndexOfResult=N;class M{constructor(S){this.values=S,this.prefixSum=new Uint32Array(S.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(S,C){S=b.toUint32(S);const d=this.values,g=this.prefixSum,p=C.length;return p===0?!1:(this.values=new Uint32Array(d.length+p),this.values.set(d.subarray(0,S),0),this.values.set(d.subarray(S),S+p),this.values.set(C,S),S-1=0&&this.prefixSum.set(g.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}changeValue(S,C){return S=b.toUint32(S),C=b.toUint32(C),this.values[S]===C?!1:(this.values[S]=C,S-1=d.length)return!1;let p=d.length-S;return C>=p&&(C=p),C===0?!1:(this.values=new Uint32Array(d.length-C),this.values.set(d.subarray(0,S),0),this.values.set(d.subarray(S+C),S),this.prefixSum=new Uint32Array(this.values.length),S-1=0&&this.prefixSum.set(g.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalValue(){return this.values.length===0?0:this._getAccumulatedValue(this.values.length-1)}getAccumulatedValue(S){return S<0?0:(S=b.toUint32(S),this._getAccumulatedValue(S))}_getAccumulatedValue(S){if(S<=this.prefixSumValidIndex[0])return this.prefixSum[S];let C=this.prefixSumValidIndex[0]+1;C===0&&(this.prefixSum[0]=this.values[0],C++),S>=this.values.length&&(S=this.values.length-1);for(let d=C;d<=S;d++)this.prefixSum[d]=this.prefixSum[d-1]+this.values[d];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],S),this.prefixSum[S]}getIndexOf(S){S=Math.floor(S),this.getTotalValue();let C=0,d=this.values.length-1,g=0,p=0,c=0;for(;C<=d;)if(g=C+(d-C)/2|0,p=this.prefixSum[g],c=p-this.values[g],S=p)C=g+1;else break;return new N(g,S-c)}}e.PrefixSumComputer=M}),define(Q[388],J([0,1,8,14,222]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MirrorTextModel=void 0;class w{constructor(C,d,g,p){this._uri=C,this._lines=d,this._eol=g,this._versionId=p,this._lineStarts=null,this._cachedTextValue=null}dispose(){this._lines.length=0}getText(){return this._cachedTextValue===null&&(this._cachedTextValue=this._lines.join(this._eol)),this._cachedTextValue}onEvents(C){C.eol&&C.eol!==this._eol&&(this._eol=C.eol,this._lineStarts=null);const d=C.changes;for(const g of d)this._acceptDeleteRange(g.range),this._acceptInsertText(new N.Position(g.range.startLineNumber,g.range.startColumn),g.text);this._versionId=C.versionId,this._cachedTextValue=null}_ensureLineStarts(){if(!this._lineStarts){const C=this._eol.length,d=this._lines.length,g=new Uint32Array(d);for(let p=0;pthis._lines.length)h=this._lines.length,m=this._lines[h-1].length+1,_=!0;else{let f=this._lines[h-1].length+1;m<1?(m=1,_=!0):m>f&&(m=f,_=!0)}return _?{lineNumber:h,column:m}:l}}class i{constructor(l,h){this._host=l,this._models=Object.create(null),this._foreignModuleFactory=h,this._foreignModule=null}dispose(){this._models=Object.create(null)}_getModel(l){return this._models[l]}_getModels(){let l=[];return Object.keys(this._models).forEach(h=>l.push(this._models[h])),l}acceptNewModel(l){this._models[l.url]=new r(w.URI.parse(l.url),l.lines,l.EOL,l.versionId)}acceptModelChanged(l,h){!this._models[l]||this._models[l].onEvents(h)}acceptRemovedModel(l){!this._models[l]||delete this._models[l]}computeDiff(l,h,m,_){return Ie(this,void 0,void 0,function*(){const f=this._getModel(l),v=this._getModel(h);if(!f||!v)return null;const y=f.getLinesContent(),L=v.getLinesContent(),k=new d.DiffComputer(y,L,{shouldComputeCharChanges:!0,shouldPostProcessCharChanges:!0,shouldIgnoreTrimWhitespace:m,shouldMakePrettyDiff:!0,maxComputationTime:_}).computeDiff(),E=k.changes.length>0?!1:this._modelsAreIdentical(f,v);return{quitEarly:k.quitEarly,identical:E,changes:k.changes}})}_modelsAreIdentical(l,h){const m=l.getLineCount(),_=h.getLineCount();if(m!==_)return!1;for(let f=1;f<=m;f++){const v=l.getLineContent(f),y=h.getLineContent(f);if(v!==y)return!1}return!0}computeMoreMinimalEdits(l,h){return Ie(this,void 0,void 0,function*(){const m=this._getModel(l);if(!m)return h;const _=[];let f;h=b.mergeSort(h,(v,y)=>{if(v.range&&y.range)return C.Range.compareRangesUsingStarts(v.range,y.range);let L=v.range?0:1,I=y.range?0:1;return L-I});for(let{range:v,text:y,eol:L}of h)if(typeof L=="number"&&(f=L),!(C.Range.isEmpty(v)&&!y)){const I=m.getValueInRange(v);if(y=y.replace(/\r\n|\n|\r/g,m.eol),I!==y){if(Math.max(y.length,I.length)>i._diffLimit){_.push({range:v,text:y});continue}const k=N.stringDiff(I,y,!1),E=m.offsetAt(C.Range.lift(v).getStartPosition());for(const T of k){const O=m.positionAt(E+T.originalStart),A=m.positionAt(E+T.originalStart+T.originalLength),B={text:y.substr(T.modifiedStart,T.modifiedLength),range:{startLineNumber:O.lineNumber,startColumn:O.column,endLineNumber:A.lineNumber,endColumn:A.column}};m.getValueInRange(B.range)!==B.text&&_.push(B)}}}return typeof f=="number"&&_.push({eol:f,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),_})}computeLinks(l){return Ie(this,void 0,void 0,function*(){let h=this._getModel(l);return h?c.computeLinks(h):null})}textualSuggest(l,h,m,_){return Ie(this,void 0,void 0,function*(){const f=new u.StopWatch(!0),v=new RegExp(m,_),y=new Set;e:for(let L of l){const I=this._getModel(L);if(!!I){for(let k of I.words(v))if(!(k===h||!isNaN(Number(k)))&&(y.add(k),y.size>i._suggestionsLimit))break e}}return{words:Array.from(y),duration:f.elapsed()}})}computeWordRanges(l,h,m,_){return Ie(this,void 0,void 0,function*(){let f=this._getModel(l);if(!f)return Object.create(null);const v=new RegExp(m,_),y=Object.create(null);for(let L=h.startLineNumber;Lthis._host.fhr(y,L);let v={host:a.createProxyObject(m,_),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(v,h),Promise.resolve(a.getAllMethodNames(this._foreignModule))):new Promise((y,L)=>{q([l],I=>{this._foreignModule=I.create(v,h),y(a.getAllMethodNames(this._foreignModule))},L)})}fmr(l,h){if(!this._foreignModule||typeof this._foreignModule[l]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+l));try{return Promise.resolve(this._foreignModule[l].apply(this._foreignModule,h))}catch(m){return Promise.reject(m)}}}e.EditorSimpleWorker=i,i._diffLimit=1e5,i._suggestionsLimit=1e4;function n(t){return new i(t,null)}e.create=n,typeof importScripts=="function"&&(M.globals.monaco=s.createMonacoBaseAPI())}),define(Q[111],J([0,1,2]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewEventHandler=void 0;class N extends b.Disposable{constructor(){super();this._shouldRender=!0}shouldRender(){return this._shouldRender}forceShouldRender(){this._shouldRender=!0}setShouldRender(){this._shouldRender=!0}onDidRender(){this._shouldRender=!1}onCompositionStart(w){return!1}onCompositionEnd(w){return!1}onConfigurationChanged(w){return!1}onCursorStateChanged(w){return!1}onDecorationsChanged(w){return!1}onFlushed(w){return!1}onFocusChanged(w){return!1}onLanguageConfigurationChanged(w){return!1}onLineMappingChanged(w){return!1}onLinesChanged(w){return!1}onLinesDeleted(w){return!1}onLinesInserted(w){return!1}onRevealRangeRequest(w){return!1}onScrollChanged(w){return!1}onThemeChanged(w){return!1}onTokensChanged(w){return!1}onTokensColorsChanged(w){return!1}onZonesChanged(w){return!1}handleEvents(w){let S=!1;for(let C=0,d=w.length;C=s,h=i,m=n>=s;let _=p.left,f=c.left;return _+o>a.scrollLeft+a.viewportWidth&&(_=a.scrollLeft+a.viewportWidth-o),f+o>a.scrollLeft+a.viewportWidth&&(f=a.scrollLeft+a.viewportWidth-o),_u){const i=r-(u-s);r-=i,o-=i}if(r=v,I=t+s<=l.height-y;return this._fixedOverflowWidgets?{fitsAbove:L,aboveTop:Math.max(n,v),aboveLeft:m,fitsBelow:I,belowTop:t,belowLeft:f}:{fitsAbove:L,aboveTop:u,aboveLeft:h,fitsBelow:I,belowTop:r,belowLeft:_}}_prepareRenderWidgetAtExactPositionOverflowing(p){return new w(p.top,p.left+this._contentLeft)}_getTopAndBottomLeft(p){if(!this._viewRange)return[null,null];const c=p.linesVisibleRangesForRange(this._viewRange,!1);if(!c||c.length===0)return[null,null];let o=c[0],s=c[0];for(const l of c)l.lineNumbers.lineNumber&&(s=l);let a=1073741824;for(const l of o.ranges)l.leftp.endLineNumber||this.domNode.setMaxWidth(this._maxWidth)}prepareRender(p){this._renderData=this._prepareRenderWidget(p)}render(p){if(!this._renderData){this._isVisible&&(this.domNode.removeAttribute("monaco-visible-content-widget"),this._isVisible=!1,this.domNode.setVisibility("hidden")),typeof this._actual.afterRender=="function"&&d(this._actual.afterRender,this._actual,null);return}this.allowEditorOverflow?(this.domNode.setTop(this._renderData.coordinate.top),this.domNode.setLeft(this._renderData.coordinate.left)):(this.domNode.setTop(this._renderData.coordinate.top+p.scrollTop-p.bigNumbersDelta),this.domNode.setLeft(this._renderData.coordinate.left)),this._isVisible||(this.domNode.setVisibility("inherit"),this.domNode.setAttribute("monaco-visible-content-widget","true"),this._isVisible=!0),typeof this._actual.afterRender=="function"&&d(this._actual.afterRender,this._actual,this._renderData.position)}}function d(g,p,...c){try{return g.call(p,...c)}catch(o){return null}}}),define(Q[391],J([0,1,94,3,110,319]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationsOverlay=void 0;class w extends b.DynamicViewOverlay{constructor(C){super();this._context=C;const d=this._context.configuration.options;this._lineHeight=d.get(53),this._typicalHalfwidthCharacterWidth=d.get(38).typicalHalfwidthCharacterWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(C){const d=this._context.configuration.options;return this._lineHeight=d.get(53),this._typicalHalfwidthCharacterWidth=d.get(38).typicalHalfwidthCharacterWidth,!0}onDecorationsChanged(C){return!0}onFlushed(C){return!0}onLinesChanged(C){return!0}onLinesDeleted(C){return!0}onLinesInserted(C){return!0}onScrollChanged(C){return C.scrollTopChanged||C.scrollWidthChanged}onZonesChanged(C){return!0}prepareRender(C){const d=C.getDecorationsInViewport();let g=[],p=0;for(let a=0,u=d.length;a{if(a.options.zIndexu.options.zIndex)return 1;const r=a.options.className,i=u.options.className;return ri?1:N.Range.compareRangesUsingStarts(a.range,u.range)});const c=C.visibleRange.startLineNumber,o=C.visibleRange.endLineNumber,s=[];for(let a=c;a<=o;a++){const u=a-c;s[u]=""}this._renderWholeLineDecorations(C,g,s),this._renderNormalDecorations(C,g,s),this._renderResult=s}_renderWholeLineDecorations(C,d,g){const p=String(this._lineHeight),c=C.visibleRange.startLineNumber,o=C.visibleRange.endLineNumber;for(let s=0,a=d.length;s',i=Math.max(u.range.startLineNumber,c),n=Math.min(u.range.endLineNumber,o);for(let t=i;t<=n;t++){const l=t-c;g[l]+=r}}}}_renderNormalDecorations(C,d,g){const p=String(this._lineHeight),c=C.visibleRange.startLineNumber;let o=null,s=!1,a=null;for(let u=0,r=d.length;u';s[n]+=m}}}}render(C,d){if(!this._renderResult)return"";const g=d-C;return g<0||g>=this._renderResult.length?"":this._renderResult[g]}}e.DecorationsOverlay=w}),define(Q[172],J([0,1,94,320]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphMarginOverlay=e.DedupOverlay=e.DecorationToRender=void 0;class N{constructor(C,d,g){this.startLineNumber=+C,this.endLineNumber=+d,this.className=String(g)}}e.DecorationToRender=N;class M extends b.DynamicViewOverlay{_render(C,d,g){const p=[];for(let s=C;s<=d;s++){const a=s-C;p[a]=[]}if(g.length===0)return p;g.sort((s,a)=>s.className===a.className?s.startLineNumber===a.startLineNumber?s.endLineNumber-a.endLineNumber:s.startLineNumber-a.startLineNumber:s.className',u=[];for(let r=d;r<=g;r++){const i=r-d,n=p[i];n.length===0?u[i]="":u[i]='
    =this._renderResult.length?"":this._renderResult[g]}}e.GlyphMarginOverlay=w}),define(Q[392],J([0,1,172,324]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesDecorationsOverlay=void 0;class N extends b.DedupOverlay{constructor(w){super();this._context=w;const C=this._context.configuration.options.get(124);this._decorationsLeft=C.decorationsLeft,this._decorationsWidth=C.decorationsWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(w){const C=this._context.configuration.options.get(124);return this._decorationsLeft=C.decorationsLeft,this._decorationsWidth=C.decorationsWidth,!0}onDecorationsChanged(w){return!0}onFlushed(w){return!0}onLinesChanged(w){return!0}onLinesDeleted(w){return!0}onLinesInserted(w){return!0}onScrollChanged(w){return w.scrollTopChanged}onZonesChanged(w){return!0}_getDecorations(w){const S=w.getDecorationsInViewport();let C=[],d=0;for(let g=0,p=S.length;g
    ',o=[];for(let s=S;s<=C;s++){const a=s-S,u=d[a];let r="";for(let i=0,n=u.length;i';g[c]=s}this._renderResult=g}render(w,S){return this._renderResult?this._renderResult[S-w]:""}}e.MarginViewLineDecorationsOverlay=N}),define(Q[394],J([0,1,30,45,327]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewOverlayWidgets=void 0;class M extends N.ViewPart{constructor(S){super(S);const d=this._context.configuration.options.get(124);this._widgets={},this._verticalScrollbarWidth=d.verticalScrollbarWidth,this._minimapWidth=d.minimap.minimapWidth,this._horizontalScrollbarHeight=d.horizontalScrollbarHeight,this._editorHeight=d.height,this._editorWidth=d.width,this._domNode=b.createFastDomNode(document.createElement("div")),N.PartFingerprints.write(this._domNode,4),this._domNode.setClassName("overlayWidgets")}dispose(){super.dispose(),this._widgets={}}getDomNode(){return this._domNode}onConfigurationChanged(S){const d=this._context.configuration.options.get(124);return this._verticalScrollbarWidth=d.verticalScrollbarWidth,this._minimapWidth=d.minimap.minimapWidth,this._horizontalScrollbarHeight=d.horizontalScrollbarHeight,this._editorHeight=d.height,this._editorWidth=d.width,!0}addWidget(S){const C=b.createFastDomNode(S.getDomNode());this._widgets[S.getId()]={widget:S,preference:null,domNode:C},C.setPosition("absolute"),C.setAttribute("widgetId",S.getId()),this._domNode.appendChild(C),this.setShouldRender()}setWidgetPosition(S,C){const d=this._widgets[S.getId()];return d.preference===C?!1:(d.preference=C,this.setShouldRender(),!0)}removeWidget(S){const C=S.getId();if(this._widgets.hasOwnProperty(C)){const g=this._widgets[C].domNode.domNode;delete this._widgets[C],g.parentNode.removeChild(g),this.setShouldRender()}}_renderWidget(S){const C=S.domNode;if(S.preference===null){C.unsetTop();return}if(S.preference===0)C.setTop(0),C.setRight(2*this._verticalScrollbarWidth+this._minimapWidth);else if(S.preference===1){const d=C.domNode.clientHeight;C.setTop(this._editorHeight-d-2*this._horizontalScrollbarHeight),C.setRight(2*this._verticalScrollbarWidth+this._minimapWidth)}else S.preference===2&&(C.setTop(0),C.domNode.style.right="50%")}prepareRender(S){}render(S){this._domNode.setWidth(this._editorWidth);const C=Object.keys(this._widgets);for(let d=0,g=C.length;dthis._context.viewLayout.getVerticalOffsetForLineNumber(p)),this._zoneManager.setDOMWidth(0),this._zoneManager.setDOMHeight(0),this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight()),this._zoneManager.setLineHeight(g.get(53)),this._zoneManager.setPixelRatio(g.get(122)),this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}onConfigurationChanged(C){const d=this._context.configuration.options;return C.hasChanged(53)&&(this._zoneManager.setLineHeight(d.get(53)),this._render()),C.hasChanged(122)&&(this._zoneManager.setPixelRatio(d.get(122)),this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render()),!0}onFlushed(C){return this._render(),!0}onScrollChanged(C){return C.scrollHeightChanged&&(this._zoneManager.setOuterHeight(C.scrollHeight),this._render()),!0}onZonesChanged(C){return this._render(),!0}getDomNode(){return this._domNode.domNode}setLayout(C){this._domNode.setTop(C.top),this._domNode.setRight(C.right);let d=!1;d=this._zoneManager.setDOMWidth(C.width)||d,d=this._zoneManager.setDOMHeight(C.height)||d,d&&(this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render())}setZones(C){this._zoneManager.setZones(C),this._render()}_render(){if(this._zoneManager.getOuterHeight()===0)return!1;const C=this._zoneManager.getCanvasWidth(),d=this._zoneManager.getCanvasHeight(),g=this._zoneManager.resolveColorZones(),p=this._zoneManager.getId2Color(),c=this._domNode.domNode.getContext("2d");return c.clearRect(0,0,C,d),g.length>0&&this._renderOneLane(c,g,p,C),!0}_renderOneLane(C,d,g,p){let c=0,o=0,s=0;for(const a of d){const u=a.colorId,r=a.from,i=a.to;u!==c?(C.fillRect(0,o,p,s-o),c=u,C.fillStyle=g[c],o=r,s=i):s>=r?s=Math.max(s,i):(C.fillRect(0,o,p,s-o),o=r,s=i)}C.fillRect(0,o,p,s-o)}}e.OverviewRuler=w}),define(Q[396],J([0,1,30,12,45,14]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewZones=void 0;const S=()=>{throw new Error("Invalid change accessor")};class C extends M.ViewPart{constructor(p){super(p);const c=this._context.configuration.options,o=c.get(124);this._lineHeight=c.get(53),this._contentWidth=o.contentWidth,this._contentLeft=o.contentLeft,this.domNode=b.createFastDomNode(document.createElement("div")),this.domNode.setClassName("view-zones"),this.domNode.setPosition("absolute"),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.marginDomNode=b.createFastDomNode(document.createElement("div")),this.marginDomNode.setClassName("margin-view-zones"),this.marginDomNode.setPosition("absolute"),this.marginDomNode.setAttribute("role","presentation"),this.marginDomNode.setAttribute("aria-hidden","true"),this._zones={}}dispose(){super.dispose(),this._zones={}}_recomputeWhitespacesProps(){const p=this._context.viewLayout.getWhitespaces(),c=new Map;for(const s of p)c.set(s.id,s);let o=!1;return this._context.model.changeWhitespace(s=>{const a=Object.keys(this._zones);for(let u=0,r=a.length;u{const s={addZone:a=>(c=!0,this._addZone(o,a)),removeZone:a=>{!a||(c=this._removeZone(o,a)||c)},layoutZone:a=>{!a||(c=this._layoutZone(o,a)||c)}};d(p,s),s.addZone=S,s.removeZone=S,s.layoutZone=S}),c}_addZone(p,c){const o=this._computeWhitespaceProps(c),a={whitespaceId:p.insertWhitespace(o.afterViewLineNumber,this._getZoneOrdinal(c),o.heightInPx,o.minWidthInPx),delegate:c,isVisible:!1,domNode:b.createFastDomNode(c.domNode),marginDomNode:c.marginDomNode?b.createFastDomNode(c.marginDomNode):null};return this._safeCallOnComputedHeight(a.delegate,o.heightInPx),a.domNode.setPosition("absolute"),a.domNode.domNode.style.width="100%",a.domNode.setDisplay("none"),a.domNode.setAttribute("monaco-view-zone",a.whitespaceId),this.domNode.appendChild(a.domNode),a.marginDomNode&&(a.marginDomNode.setPosition("absolute"),a.marginDomNode.domNode.style.width="100%",a.marginDomNode.setDisplay("none"),a.marginDomNode.setAttribute("monaco-view-zone",a.whitespaceId),this.marginDomNode.appendChild(a.marginDomNode)),this._zones[a.whitespaceId]=a,this.setShouldRender(),a.whitespaceId}_removeZone(p,c){if(this._zones.hasOwnProperty(c)){const o=this._zones[c];return delete this._zones[c],p.removeWhitespace(o.whitespaceId),o.domNode.removeAttribute("monaco-visible-view-zone"),o.domNode.removeAttribute("monaco-view-zone"),o.domNode.domNode.parentNode.removeChild(o.domNode.domNode),o.marginDomNode&&(o.marginDomNode.removeAttribute("monaco-visible-view-zone"),o.marginDomNode.removeAttribute("monaco-view-zone"),o.marginDomNode.domNode.parentNode.removeChild(o.marginDomNode.domNode)),this.setShouldRender(),!0}return!1}_layoutZone(p,c){if(this._zones.hasOwnProperty(c)){const o=this._zones[c],s=this._computeWhitespaceProps(o.delegate);return p.changeOneWhitespace(o.whitespaceId,s.afterViewLineNumber,s.heightInPx),this._safeCallOnComputedHeight(o.delegate,s.heightInPx),this.setShouldRender(),!0}return!1}shouldSuppressMouseDownOnViewZone(p){if(this._zones.hasOwnProperty(p)){const c=this._zones[p];return Boolean(c.delegate.suppressMouseDown)}return!1}_heightInPixels(p){return typeof p.heightInPx=="number"?p.heightInPx:typeof p.heightInLines=="number"?this._lineHeight*p.heightInLines:this._lineHeight}_minWidthInPixels(p){return typeof p.minWidthInPx=="number"?p.minWidthInPx:0}_safeCallOnComputedHeight(p,c){if(typeof p.onComputedHeight=="function")try{p.onComputedHeight(c)}catch(o){N.onUnexpectedError(o)}}_safeCallOnDomNodeTop(p,c){if(typeof p.onDomNodeTop=="function")try{p.onDomNodeTop(c)}catch(o){N.onUnexpectedError(o)}}prepareRender(p){}render(p){const c=p.viewportData.whitespaceViewportData,o={};let s=!1;for(let u=0,r=c.length;u0?o[r-1]:0,s=n)a=r+1;else break}return new M(r,s-i)}}e.LineBreakData=w;class S{constructor(o,s){this.tabSize=o,this.data=s}}e.MinimapLinesRenderingData=S;class C{constructor(o,s,a,u,r,i){this.content=o,this.continuesWithWrappedLine=s,this.minColumn=a,this.maxColumn=u,this.startVisibleColumn=r,this.tokens=i}}e.ViewLineData=C;class d{constructor(o,s,a,u,r,i,n,t,l,h){this.minColumn=o,this.maxColumn=s,this.content=a,this.continuesWithWrappedLine=u,this.isBasicASCII=d.isBasicASCII(a,i),this.containsRTL=d.containsRTL(a,this.isBasicASCII,r),this.tokens=n,this.inlineDecorations=t,this.tabSize=l,this.startVisibleColumn=h}static isBasicASCII(o,s){return s?b.isBasicASCII(o):!0}static containsRTL(o,s,a){return!s&&a?b.containsRTL(o):!1}}e.ViewLineRenderingData=d;class g{constructor(o,s,a){this.range=o,this.inlineClassName=s,this.type=a}}e.InlineDecoration=g;class p{constructor(o,s){this.range=o,this.options=s}}e.ViewModelDecoration=p}),define(Q[397],J([0,1,8,91,63]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MonospaceLineBreaksComputerFactory=void 0;class w extends N.CharacterClassifier{constructor(r,i){super(0);for(let n=0;n=0&&r<256?this._asciiMap[r]:r>=12352&&r<=12543||r>=13312&&r<=19903||r>=19968&&r<=40959?3:this._map.get(r)||this._defaultValue}}let S=[],C=[];class d{constructor(r,i){this.classifier=new w(r,i)}static create(r){return new d(r.get(113),r.get(112))}createLineBreaksComputer(r,i,n,t){i=i|0,n=+n;let l=[],h=[];return{addRequest:(m,_)=>{l.push(m),h.push(_)},finalize:()=>{const m=r.typicalFullwidthCharacterWidth/r.typicalHalfwidthCharacterWidth;let _=[];for(let f=0,v=l.length;f=0){let F=Math.abs(f[B]-O);for(;B+1=F)break;F=D,B++}}for(;BF&&(F=E,D=T);let R=0,W=0,x=0,K=0;if(D<=O){let ee=D,se=F===0?0:i.charCodeAt(F-1),ne=F===0?0:u.get(se),le=!0;for(let X=F;XE&&s(se,ne,P,V)&&(R=z,W=ee),ee+=U,ee>O){z>E?(x=z,K=ee-U):(x=X+1,K=ee),ee-W>y&&(R=0),le=!1;break}se=P,ne=V}if(le){k>0&&(L[k]=_[_.length-1],I[k]=f[_.length-1],k++);break}}if(R===0){let ee=D,se=i.charCodeAt(F),ne=u.get(se),le=!1;for(let X=F-1;X>=E;X--){const z=X+1,P=i.charCodeAt(X);if(P===9){le=!0;break}let V,U;if(b.isLowSurrogate(P)?(X--,V=0,U=2):(V=u.get(P),U=b.isFullWidthCharacter(P)?l:1),ee<=O){if(x===0&&(x=z,K=ee),ee<=O-y)break;if(s(P,V,se,ne)){R=z,W=ee;break}}ee-=U,se=P,ne=V}if(R!==0){const X=y-(K-W);if(X<=n){const z=i.charCodeAt(x);let P;b.isHighSurrogate(z)?P=2:P=c(z,K,n,l),X-P<0&&(R=0)}}if(le){B--;continue}}if(R===0&&(R=x,W=K),R<=E){const ee=i.charCodeAt(E);b.isHighSurrogate(ee)?(R=E+2,W=T+2):(R=E+1,W=T+c(ee,T,n,l))}for(E=R,L[k]=R,T=W,I[k]=W,k++,O=W+y;B<0||B=Y)break;Y=ee,B++}}return k===0?null:(L.length=k,I.length=k,S=r.breakOffsets,C=r.breakOffsetsVisibleColumn,r.breakOffsets=L,r.breakOffsetsVisibleColumn=I,r.wrappedTextIndentLength=v,r)}function p(u,r,i,n,t,l){if(n===-1)return null;const h=r.length;if(h<=1)return null;const m=a(r,i,n,t,l),_=n-m;let f=[],v=[],y=0,L=0,I=0,k=n,E=r.charCodeAt(0),T=u.get(E),O=c(E,0,i,t),A=1;b.isHighSurrogate(E)&&(O+=1,E=r.charCodeAt(1),T=u.get(E),A++);for(let B=A;Bk&&((L===0||O-I>_)&&(L=F,I=O-W),f[y]=L,v[y]=I,y++,k=I+_,L=0),E=D,T=R}return y===0?null:(f[y]=h,v[y]=O,new M.LineBreakData(f,v,m))}function c(u,r,i,n){return u===9?i-r%i:b.isFullWidthCharacter(u)||u<32?n:1}function o(u,r){return r-u%r}function s(u,r,i,n){return i!==32&&(r===2||r===3&&n!==2||n===1||n===3&&r!==1)}function a(u,r,i,n,t){let l=0;if(t!==0){const h=b.firstNonWhitespaceIndex(u);if(h!==-1){for(let _=0;_i&&(l=0)}}return l}}),define(Q[173],J([0,1,6,2]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReadOnlyEditAttemptEvent=e.CursorStateChangedEvent=e.ViewZonesChangedEvent=e.ScrollChangedEvent=e.FocusChangedEvent=e.ContentSizeChangedEvent=e.ViewModelEventsCollector=e.ViewModelEventDispatcher=void 0;class M extends N.Disposable{constructor(){super();this._onEvent=this._register(new b.Emitter),this.onEvent=this._onEvent.event,this._eventHandlers=[],this._viewEventQueue=null,this._isConsumingViewEventQueue=!1,this._collector=null,this._collectorCnt=0,this._outgoingEvents=[]}emitOutgoingEvent(s){this._addOutgoingEvent(s),this._emitOugoingEvents()}_addOutgoingEvent(s){for(let a=0,u=this._outgoingEvents.length;a0;){if(this._collector||this._isConsumingViewEventQueue)return;const s=this._outgoingEvents.shift();s.isNoOp()||this._onEvent.fire(s)}}addViewEventHandler(s){for(let a=0,u=this._eventHandlers.length;a0&&this._emitMany(a)}this._emitOugoingEvents()}emitSingleViewEvent(s){try{this.beginEmitViewEvents().emitViewEvent(s)}finally{this.endEmitViewEvents()}}_emitMany(s){this._viewEventQueue?this._viewEventQueue=this._viewEventQueue.concat(s):this._viewEventQueue=s,this._isConsumingViewEventQueue||this._consumeViewEventQueue()}_consumeViewEventQueue(){try{this._isConsumingViewEventQueue=!0,this._doConsumeQueue()}finally{this._isConsumingViewEventQueue=!1}}_doConsumeQueue(){for(;this._viewEventQueue;){const s=this._viewEventQueue;this._viewEventQueue=null;const a=this._eventHandlers.slice(0);for(const u of a)u.handleEvents(s)}}}e.ViewModelEventDispatcher=M;class w{constructor(){this.viewEvents=[],this.outgoingEvents=[]}emitViewEvent(s){this.viewEvents.push(s)}emitOutgoingEvent(s){this.outgoingEvents.push(s)}}e.ViewModelEventsCollector=w;class S{constructor(s,a,u,r){this.kind=0,this._oldContentWidth=s,this._oldContentHeight=a,this.contentWidth=u,this.contentHeight=r,this.contentWidthChanged=this._oldContentWidth!==this.contentWidth,this.contentHeightChanged=this._oldContentHeight!==this.contentHeight}isNoOp(){return!this.contentWidthChanged&&!this.contentHeightChanged}merge(s){return s.kind!==0?this:new S(this._oldContentWidth,this._oldContentHeight,s.contentWidth,s.contentHeight)}}e.ContentSizeChangedEvent=S;class C{constructor(s,a){this.kind=1,this.oldHasFocus=s,this.hasFocus=a}isNoOp(){return this.oldHasFocus===this.hasFocus}merge(s){return s.kind!==1?this:new C(this.oldHasFocus,s.hasFocus)}}e.FocusChangedEvent=C;class d{constructor(s,a,u,r,i,n,t,l){this.kind=2,this._oldScrollWidth=s,this._oldScrollLeft=a,this._oldScrollHeight=u,this._oldScrollTop=r,this.scrollWidth=i,this.scrollLeft=n,this.scrollHeight=t,this.scrollTop=l,this.scrollWidthChanged=this._oldScrollWidth!==this.scrollWidth,this.scrollLeftChanged=this._oldScrollLeft!==this.scrollLeft,this.scrollHeightChanged=this._oldScrollHeight!==this.scrollHeight,this.scrollTopChanged=this._oldScrollTop!==this.scrollTop}isNoOp(){return!this.scrollWidthChanged&&!this.scrollLeftChanged&&!this.scrollHeightChanged&&!this.scrollTopChanged}merge(s){return s.kind!==2?this:new d(this._oldScrollWidth,this._oldScrollLeft,this._oldScrollHeight,this._oldScrollTop,s.scrollWidth,s.scrollLeft,s.scrollHeight,s.scrollTop)}}e.ScrollChangedEvent=d;class g{constructor(){this.kind=3}isNoOp(){return!1}merge(s){return this}}e.ViewZonesChangedEvent=g;class p{constructor(s,a,u,r,i,n,t){this.kind=5,this.oldSelections=s,this.selections=a,this.oldModelVersionId=u,this.modelVersionId=r,this.source=i,this.reason=n,this.reachedMaxCursorCount=t}static _selectionsAreEqual(s,a){if(!s&&!a)return!0;if(!s||!a)return!1;const u=s.length,r=a.length;if(u!==r)return!1;for(let i=0;i=a?0:r.horizontalScrollbarSize}_getContentHeight(s,a,u){const r=this._configuration.options;let i=this._linesLayout.getLinesTotalHeight();return r.get(89)?i+=Math.max(0,a-r.get(53)-r.get(69).bottom):i+=this._getHorizontalScrollbarHeight(s,u),i}_updateHeight(){const s=this._scrollable.getScrollDimensions(),a=s.width,u=s.height,r=s.contentWidth;this._scrollable.setScrollDimensions(new g(a,s.contentWidth,u,this._getContentHeight(a,u,r)))}getCurrentViewport(){const s=this._scrollable.getScrollDimensions(),a=this._scrollable.getCurrentScrollPosition();return new S.Viewport(a.scrollTop,a.scrollLeft,s.width,s.height)}getFutureViewport(){const s=this._scrollable.getScrollDimensions(),a=this._scrollable.getFutureScrollPosition();return new S.Viewport(a.scrollTop,a.scrollLeft,s.width,s.height)}_computeContentWidth(s){const a=this._configuration.options,u=a.get(125),r=a.get(38);if(u.isViewportWrapping){const i=a.get(124),n=a.get(59);return s>i.contentWidth+r.typicalHalfwidthCharacterWidth&&n.enabled&&n.side==="right"?s+i.verticalScrollbarWidth:s}else{const i=a.get(88)*r.typicalHalfwidthCharacterWidth,n=this._linesLayout.getWhitespaceMinWidth();return Math.max(s+i,n)}}setMaxLineWidth(s){const a=this._scrollable.getScrollDimensions();this._scrollable.setScrollDimensions(new g(a.width,this._computeContentWidth(s),a.height,a.contentHeight)),this._updateHeight()}saveState(){const s=this._scrollable.getFutureScrollPosition();let a=s.scrollTop,u=this._linesLayout.getLineNumberAtOrAfterVerticalOffset(a),r=this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(u);return{scrollTop:a,scrollTopWithoutViewZones:a-r,scrollLeft:s.scrollLeft}}changeWhitespace(s){const a=this._linesLayout.changeWhitespace(s);return a&&this.onHeightMaybeChanged(),a}getVerticalOffsetForLineNumber(s){return this._linesLayout.getVerticalOffsetForLineNumber(s)}isAfterLines(s){return this._linesLayout.isAfterLines(s)}isInTopPadding(s){return this._linesLayout.isInTopPadding(s)}isInBottomPadding(s){return this._linesLayout.isInBottomPadding(s)}getLineNumberAtVerticalOffset(s){return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(s)}getWhitespaceAtVerticalOffset(s){return this._linesLayout.getWhitespaceAtVerticalOffset(s)}getLinesViewportData(){const s=this.getCurrentViewport();return this._linesLayout.getLinesViewportData(s.top,s.top+s.height)}getLinesViewportDataAtScrollTop(s){const a=this._scrollable.getScrollDimensions();return s+a.height>a.scrollHeight&&(s=a.scrollHeight-a.height),s<0&&(s=0),this._linesLayout.getLinesViewportData(s,s+a.height)}getWhitespaceViewportData(){const s=this.getCurrentViewport();return this._linesLayout.getWhitespaceViewportData(s.top,s.top+s.height)}getWhitespaces(){return this._linesLayout.getWhitespaces()}getContentWidth(){return this._scrollable.getScrollDimensions().contentWidth}getScrollWidth(){return this._scrollable.getScrollDimensions().scrollWidth}getContentHeight(){return this._scrollable.getScrollDimensions().contentHeight}getScrollHeight(){return this._scrollable.getScrollDimensions().scrollHeight}getCurrentScrollLeft(){return this._scrollable.getCurrentScrollPosition().scrollLeft}getCurrentScrollTop(){return this._scrollable.getCurrentScrollPosition().scrollTop}validateScrollPosition(s){return this._scrollable.validateScrollPosition(s)}setScrollPosition(s,a){a===1?this._scrollable.setScrollPositionNow(s):this._scrollable.setScrollPositionSmooth(s)}deltaScrollNow(s,a){const u=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollLeft:u.scrollLeft+s,scrollTop:u.scrollTop+a})}}e.ViewLayout=c}),define(Q[399],J([0,1,3,21]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveCaretCommand=void 0;class M{constructor(S,C){this._selection=S,this._isMovingLeft=C}getEditOperations(S,C){if(!(this._selection.startLineNumber!==this._selection.endLineNumber||this._selection.isEmpty())){const d=this._selection.startLineNumber,g=this._selection.startColumn,p=this._selection.endColumn;if(!(this._isMovingLeft&&g===1)&&!(!this._isMovingLeft&&p===S.getLineMaxColumn(d)))if(this._isMovingLeft){const c=new b.Range(d,g-1,d,g),o=S.getValueInRange(c);C.addEditOperation(c,null),C.addEditOperation(new b.Range(d,p,d,p),o)}else{const c=new b.Range(d,p,d,p+1),o=S.getValueInRange(c);C.addEditOperation(c,null),C.addEditOperation(new b.Range(d,g,d,g),o)}}}computeCursorState(S,C){return this._isMovingLeft?new N.Selection(this._selection.startLineNumber,this._selection.startColumn-1,this._selection.endLineNumber,this._selection.endColumn-1):new N.Selection(this._selection.startLineNumber,this._selection.startColumn+1,this._selection.endLineNumber,this._selection.endColumn+1)}}e.MoveCaretCommand=M}),define(Q[130],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionCommandArgs=e.filtersAction=e.mayIncludeActionsOfKind=e.CodeActionKind=void 0;class b{constructor(d){this.value=d}equals(d){return this.value===d.value}contains(d){return this.equals(d)||this.value===""||d.value.startsWith(this.value+b.sep)}intersects(d){return this.contains(d)||d.contains(this)}append(d){return new b(this.value+b.sep+d)}}e.CodeActionKind=b,b.sep=".",b.None=new b("@@none@@"),b.Empty=new b(""),b.QuickFix=new b("quickfix"),b.Refactor=new b("refactor"),b.Source=new b("source"),b.SourceOrganizeImports=b.Source.append("organizeImports"),b.SourceFixAll=b.Source.append("fixAll");function N(C,d){return!(C.include&&!C.include.intersects(d)||C.excludes&&C.excludes.some(g=>w(d,g,C.include))||!C.includeSourceActions&&b.Source.contains(d))}e.mayIncludeActionsOfKind=N;function M(C,d){const g=d.kind?new b(d.kind):void 0;return!(C.include&&(!g||!C.include.contains(g))||C.excludes&&g&&C.excludes.some(p=>w(g,p,C.include))||!C.includeSourceActions&&g&&b.Source.contains(g)||C.onlyIncludePreferredActions&&!d.isPreferred)}e.filtersAction=M;function w(C,d,g){return!(!d.contains(C)||g&&d.contains(g))}class S{constructor(d,g,p){this.kind=d,this.apply=g,this.preferred=p}static fromUser(d,g){return!d||typeof d!="object"?new S(g.kind,g.apply,!1):new S(S.getKindFromUser(d,g.kind),S.getApplyFromUser(d,g.apply),S.getPreferredUser(d))}static getApplyFromUser(d,g){switch(typeof d.apply=="string"?d.apply.toLowerCase():""){case"first":return"first";case"never":return"never";case"ifsingle":return"ifSingle";default:return g}}static getKindFromUser(d,g){return typeof d.kind=="string"?new b(d.kind):g}static getPreferredUser(d){return typeof d.preferred=="boolean"?d.preferred:!1}}e.CodeActionCommandArgs=S}),define(Q[400],J([0,1,6]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorPickerModel=void 0;class N{constructor(w,S,C){this.presentationIndex=C,this._onColorFlushed=new b.Emitter,this.onColorFlushed=this._onColorFlushed.event,this._onDidChangeColor=new b.Emitter,this.onDidChangeColor=this._onDidChangeColor.event,this._onDidChangePresentation=new b.Emitter,this.onDidChangePresentation=this._onDidChangePresentation.event,this.originalColor=w,this._color=w,this._colorPresentations=S}get color(){return this._color}set color(w){this._color.equals(w)||(this._color=w,this._onDidChangeColor.fire(w))}get presentation(){return this.colorPresentations[this.presentationIndex]}get colorPresentations(){return this._colorPresentations}set colorPresentations(w){this._colorPresentations=w,this.presentationIndex>w.length-1&&(this.presentationIndex=0),this._onDidChangePresentation.fire(this.presentation)}selectNextColorPresentation(){this.presentationIndex=(this.presentationIndex+1)%this.colorPresentations.length,this.flushColor(),this._onDidChangePresentation.fire(this.presentation)}guessColorPresentation(w,S){for(let C=0;Cs)return!1;for(let a=0;a=65&&u<=90&&u+32===r)&&!(r>=65&&r<=90&&r+32===u))return!1}return!0}_createOperationsForBlockComment(g,p,c,o,s,a){const u=g.startLineNumber,r=g.startColumn,i=g.endLineNumber,n=g.endColumn,t=s.getLineContent(u),l=s.getLineContent(i);let h=t.lastIndexOf(p,r-1+p.length),m=l.indexOf(c,n-1-c.length);if(h!==-1&&m!==-1)if(u===i)t.substring(h+p.length,m).indexOf(c)>=0&&(h=-1,m=-1);else{const f=t.substring(h+p.length),v=l.substring(0,m);(f.indexOf(c)>=0||v.indexOf(c)>=0)&&(h=-1,m=-1)}let _;h!==-1&&m!==-1?(o&&h+p.length0&&l.charCodeAt(m-1)===32&&(c=" "+c,m-=1),_=C._createRemoveBlockCommentOperations(new M.Range(u,h+p.length+1,i,m+1),p,c)):(_=C._createAddBlockCommentOperations(g,p,c,this._insertSpace),this._usedEndToken=_.length===1?c:null);for(const f of _)a.addTrackedEditOperation(f.range,f.text)}static _createRemoveBlockCommentOperations(g,p,c){let o=[];return M.Range.isEmpty(g)?o.push(b.EditOperation.delete(new M.Range(g.startLineNumber,g.startColumn-p.length,g.endLineNumber,g.endColumn+c.length))):(o.push(b.EditOperation.delete(new M.Range(g.startLineNumber,g.startColumn-p.length,g.startLineNumber,g.startColumn))),o.push(b.EditOperation.delete(new M.Range(g.endLineNumber,g.endColumn,g.endLineNumber,g.endColumn+c.length)))),o}static _createAddBlockCommentOperations(g,p,c,o){let s=[];return M.Range.isEmpty(g)?s.push(b.EditOperation.replace(new M.Range(g.startLineNumber,g.startColumn,g.endLineNumber,g.endColumn),p+" "+c)):(s.push(b.EditOperation.insert(new N.Position(g.startLineNumber,g.startColumn),p+(o?" ":""))),s.push(b.EditOperation.insert(new N.Position(g.endLineNumber,g.endColumn),(o?" ":"")+c))),s}getEditOperations(g,p){const c=this._selection.startLineNumber,o=this._selection.startColumn;g.tokenizeIfCheap(c);const s=g.getLanguageIdAtPosition(c,o),a=S.LanguageConfigurationRegistry.getComments(s);!a||!a.blockCommentStartToken||!a.blockCommentEndToken||this._createOperationsForBlockComment(this._selection,a.blockCommentStartToken,a.blockCommentEndToken,this._insertSpace,g,p)}computeCursorState(g,p){const c=p.getInverseEditOperations();if(c.length===2){const o=c[0],s=c[1];return new w.Selection(o.range.endLineNumber,o.range.endColumn,s.range.startLineNumber,s.range.startColumn)}else{const o=c[0].range,s=this._usedEndToken?-this._usedEndToken.length-1:0;return new w.Selection(o.endLineNumber,o.endColumn+s,o.endLineNumber,o.endColumn+s)}}}e.BlockCommentCommand=C}),define(Q[401],J([0,1,8,62,14,3,21,41,224]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineCommentCommand=void 0;class g{constructor(c,o,s,a,u,r){this._selection=c,this._tabSize=o,this._type=s,this._insertSpace=a,this._selectionId=null,this._deltaColumn=0,this._moveEndPositionDown=!1,this._ignoreEmptyLines=u,this._ignoreFirstLine=r||!1}static _gatherPreflightCommentStrings(c,o,s){c.tokenizeIfCheap(o);const a=c.getLanguageIdAtPosition(o,1),u=C.LanguageConfigurationRegistry.getComments(a),r=u?u.lineCommentToken:null;if(!r)return null;let i=[];for(let n=0,t=s-o+1;nu?o[n].commentStrOffset=r-1:o[n].commentStrOffset=r}}}e.LineCommentCommand=g}),define(Q[402],J([0,1,21,3]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropCommand=void 0;class M{constructor(S,C,d){this.selection=S,this.targetPosition=C,this.copy=d,this.targetSelection=null}getEditOperations(S,C){let d=S.getValueInRange(this.selection);if(this.copy||C.addEditOperation(this.selection,null),C.addEditOperation(new N.Range(this.targetPosition.lineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.targetPosition.column),d),this.selection.containsPosition(this.targetPosition)&&!(this.copy&&(this.selection.getEndPosition().equals(this.targetPosition)||this.selection.getStartPosition().equals(this.targetPosition)))){this.targetSelection=this.selection;return}if(this.copy){this.targetSelection=new b.Selection(this.targetPosition.lineNumber,this.targetPosition.column,this.selection.endLineNumber-this.selection.startLineNumber+this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber>this.selection.endLineNumber){this.targetSelection=new b.Selection(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber0){let C=[];for(let p=0;pb.Range.compareRangesUsingStarts(p.range,c.range));let d=[],g=C[0];for(let p=1;p0){let i=[],n=u.caseOps.length,t=0;for(let l=0,h=r.length;l=n){i.push(r.slice(l));break}switch(u.caseOps[t]){case"U":i.push(r[l].toUpperCase());break;case"u":i.push(r[l].toUpperCase()),t++;break;case"L":i.push(r[l].toLowerCase());break;case"l":i.push(r[l].toLowerCase()),t++;break;default:i.push(r[l])}}r=i.join("")}o+=r}return o}static _substitute(p,c){if(c===null)return"";if(p===0)return c[0];let o="";for(;p>0;){if(p=s)break;let u=g.charCodeAt(o);switch(u){case 92:c.emitUnchanged(o-1),c.emitStatic("\\",o+1);break;case 110:c.emitUnchanged(o-1),c.emitStatic(` +`,o+1);break;case 116:c.emitUnchanged(o-1),c.emitStatic(" ",o+1);break;case 117:case 85:case 108:case 76:c.emitUnchanged(o-1),c.emitStatic("",o+1),p.push(String.fromCharCode(u));break}continue}if(a===36){if(o++,o>=s)break;let u=g.charCodeAt(o);if(u===36){c.emitUnchanged(o-1),c.emitStatic("$",o+1);continue}if(u===48||u===38){c.emitUnchanged(o-1),c.emitMatchIndex(0,o+1,p),p.length=0;continue}if(49<=u&&u<=57){let r=u-48;if(o+1e.MAX_FOLDING_REGIONS)throw new Error("invalid startIndexes or endIndexes size");this._startIndexes=S,this._endIndexes=C,this._collapseStates=new Uint32Array(Math.ceil(S.length/32)),this._types=d,this._parentsComputed=!1}ensureParentIndices(){if(!this._parentsComputed){this._parentsComputed=!0;let S=[],C=(d,g)=>{let p=S[S.length-1];return this.getStartLineNumber(p)<=d&&this.getEndLineNumber(p)>=g};for(let d=0,g=this._startIndexes.length;de.MAX_LINE_NUMBER||c>e.MAX_LINE_NUMBER)throw new Error("startLineNumber or endLineNumber must not exceed "+e.MAX_LINE_NUMBER);for(;S.length>0&&!C(p,c);)S.pop();let o=S.length>0?S[S.length-1]:-1;S.push(d),this._startIndexes[d]=p+((o&255)<<24),this._endIndexes[d]=c+((o&65280)<<16)}}}get length(){return this._startIndexes.length}getStartLineNumber(S){return this._startIndexes[S]&e.MAX_LINE_NUMBER}getEndLineNumber(S){return this._endIndexes[S]&e.MAX_LINE_NUMBER}getType(S){return this._types?this._types[S]:void 0}hasTypes(){return!!this._types}isCollapsed(S){let C=S/32|0,d=S%32;return(this._collapseStates[C]&1<>>24)+((this._endIndexes[S]&b)>>>16);return C===e.MAX_FOLDING_REGIONS?-1:C}contains(S,C){return this.getStartLineNumber(S)<=C&&this.getEndLineNumber(S)>=C}findIndex(S){let C=0,d=this._startIndexes.length;if(d===0)return-1;for(;C=0){if(this.getEndLineNumber(C)>=S)return C;for(C=this.getParentIndex(C);C!==-1;){if(this.contains(C,S))return C;C=this.getParentIndex(C)}}return-1}toString(){let S=[];for(let C=0;C=this.endLineNumber}containsLine(S){return this.startLineNumber<=S&&S<=this.endLineNumber}}e.FoldingRegion=M}),define(Q[405],J([0,1,6,174]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setCollapseStateForType=e.setCollapseStateForMatchingLines=e.setCollapseStateAtLevel=e.setCollapseStateUp=e.setCollapseStateLevelsUp=e.setCollapseStateLevelsDown=e.toggleCollapseState=e.FoldingModel=void 0;class M{constructor(s,a){this._updateEventEmitter=new b.Emitter,this.onDidChange=this._updateEventEmitter.event,this._textModel=s,this._decorationProvider=a,this._regions=new N.FoldingRegions(new Uint32Array(0),new Uint32Array(0)),this._editorDecorationIds=[],this._isInitialized=!1}get regions(){return this._regions}get textModel(){return this._textModel}get isInitialized(){return this._isInitialized}toggleCollapseState(s){if(!!s.length){s=s.sort((u,r)=>u.regionIndex-r.regionIndex);const a={};this._decorationProvider.changeDecorations(u=>{let r=0,i=-1,n=-1;const t=l=>{for(;rn&&(n=h),r++}};for(let l of s){let h=l.regionIndex,m=this._editorDecorationIds[h];if(m&&!a[m]){a[m]=!0,t(h);let _=!this._regions.isCollapsed(h);this._regions.setCollapsed(h,_),i=Math.max(i,this._regions.getEndLineNumber(h))}}t(this._regions.length)}),this._updateEventEmitter.fire({model:this,collapseStateChanged:s})}}update(s,a=[]){let u=[],r=(_,f)=>{for(let v of a)if(_{const v=s.getStartLineNumber(_),y=s.getEndLineNumber(_);f&&r(v,y)&&(f=!1),s.setCollapsed(_,f);const L=this._textModel.getLineMaxColumn(v),I={startLineNumber:v,startColumn:Math.max(L-1,1),endLineNumber:v,endColumn:L};u.push({range:I,options:this._decorationProvider.getDecorationOption(f,y<=i)}),f&&y>i&&(i=y)},t=0,l=()=>{for(;t=v)n(h,f===v),h++;else break}}m=l()}for(;h0)return s}applyMemento(s){if(!!Array.isArray(s)){let a=[];for(let u of s){let r=this.getRegionAtLine(u.startLineNumber);r&&!r.isCollapsed&&a.push(r)}this.toggleCollapseState(a)}}dispose(){this._decorationProvider.deltaDecorations(this._editorDecorationIds,[])}getAllRegionsAtLine(s,a){let u=[];if(this._regions){let r=this._regions.findRange(s),i=1;for(;r>=0;){let n=this._regions.toRegion(r);(!a||a(n,i))&&u.push(n),i++,r=n.parentIndex}}return u}getRegionAtLine(s){if(this._regions){let a=this._regions.findRange(s);if(a>=0)return this._regions.toRegion(a)}return null}getRegionsInside(s,a){let u=[],r=s?s.regionIndex+1:0,i=s?s.endLineNumber:Number.MAX_VALUE;if(a&&a.length===2){const n=[];for(let t=r,l=this._regions.length;t0&&!h.containedBy(n[n.length-1]);)n.pop();n.push(h),a(h,n.length)&&u.push(h)}else break}}else for(let n=r,t=this._regions.length;n1){let t=o.getRegionsInside(i,(l,h)=>l.isCollapsed!==n&&h0)for(let i of u){let n=o.getRegionAtLine(i);if(n&&(n.isCollapsed!==s&&r.push(n),a>1)){let t=o.getRegionsInside(n,(l,h)=>l.isCollapsed!==s&&hn.isCollapsed!==s&&tt.isCollapsed!==s&&l<=a);r.push(...n)}o.toggleCollapseState(r)}e.setCollapseStateLevelsUp=C;function d(o,s,a){let u=[];for(let r of a){let i=o.getAllRegionsAtLine(r,n=>n.isCollapsed!==s);i.length>0&&u.push(i[0])}o.toggleCollapseState(u)}e.setCollapseStateUp=d;function g(o,s,a,u){let r=(n,t)=>t===s&&n.isCollapsed!==a&&!u.some(l=>n.containsLine(l)),i=o.getRegionsInside(null,r);o.toggleCollapseState(i)}e.setCollapseStateAtLevel=g;function p(o,s,a){let u=o.textModel,r=o.regions,i=[];for(let n=r.length-1;n>=0;n--)if(a!==r.isCollapsed(n)){let t=r.getStartLineNumber(n);s.test(u.getLineContent(t))&&i.push(r.toRegion(n))}o.toggleCollapseState(i)}e.setCollapseStateForMatchingLines=p;function c(o,s,a){let u=o.regions,r=[];for(let i=u.length-1;i>=0;i--)a!==u.isCollapsed(i)&&s===u.getType(i)&&r.push(u.toRegion(i));o.toggleCollapseState(r)}e.setCollapseStateForType=c}),define(Q[406],J([0,1,6,3,19]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HiddenRangeModel=void 0;class w{constructor(g){this._updateEventEmitter=new b.Emitter,this._foldingModel=g,this._foldingModelListener=g.onDidChange(p=>this.updateHiddenRanges()),this._hiddenRanges=[],g.regions.length&&this.updateHiddenRanges()}get onDidChange(){return this._updateEventEmitter.event}get hiddenRanges(){return this._hiddenRanges}updateHiddenRanges(){let g=!1,p=[],c=0,o=0,s=Number.MAX_VALUE,a=-1,u=this._foldingModel.regions;for(;c({startLineNumber:g.startLineNumber-1,endLineNumber:g.endLineNumber}))}applyHiddenRanges(g){this._hiddenRanges=g,this._updateEventEmitter.fire(g)}hasRanges(){return this._hiddenRanges.length>0}isHidden(g){return C(this._hiddenRanges,g)!==null}adjustSelections(g){let p=!1,c=this._foldingModel.textModel,o=null,s=a=>((!o||!S(a,o))&&(o=C(this._hiddenRanges,a)),o?o.startLineNumber-1:null);for(let a=0,u=g.length;a0&&(this._hiddenRanges=[],this._updateEventEmitter.fire(this._hiddenRanges)),this._foldingModelListener&&(this._foldingModelListener.dispose(),this._foldingModelListener=null)}}e.HiddenRangeModel=w;function S(d,g){return d>=g.startLineNumber&&d<=g.endLineNumber}function C(d,g){let p=M.findFirstInSorted(d,c=>g=0&&d[p].endLineNumber>=g?d[p]:null}}),define(Q[225],J([0,1,12,174,2]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sanitizeRanges=e.RangesCollector=e.SyntaxRangeProvider=e.ID_SYNTAX_PROVIDER=void 0;const w=5e3,S={};e.ID_SYNTAX_PROVIDER="syntax";class C{constructor(o,s,a,u=w){this.editorModel=o,this.providers=s,this.limit=u,this.id=e.ID_SYNTAX_PROVIDER;for(const r of s)typeof r.onDidChange=="function"&&(this.disposables||(this.disposables=new M.DisposableStore),this.disposables.add(r.onDidChange(a)))}compute(o){return d(this.providers,this.editorModel,o).then(s=>s?p(s,this.limit):null)}dispose(){var o;(o=this.disposables)===null||o===void 0||o.dispose()}}e.SyntaxRangeProvider=C;function d(c,o,s){let a=null,u=c.map((r,i)=>Promise.resolve(r.provideFoldingRanges(o,S,s)).then(n=>{if(!s.isCancellationRequested&&Array.isArray(n)){Array.isArray(a)||(a=[]);let t=o.getLineCount();for(let l of n)l.start>0&&l.end>l.start&&l.end<=t&&a.push({start:l.start,end:l.end,rank:i,kind:l.kind})}},b.onUnexpectedExternalError));return Promise.all(u).then(r=>a)}class g{constructor(o){this._startIndexes=[],this._endIndexes=[],this._nestingLevels=[],this._nestingLevelCounts=[],this._types=[],this._length=0,this._foldingRangesLimit=o}add(o,s,a,u){if(!(o>N.MAX_LINE_NUMBER||s>N.MAX_LINE_NUMBER)){let r=this._length;this._startIndexes[r]=o,this._endIndexes[r]=s,this._nestingLevels[r]=u,this._types[r]=a,this._length++,u<30&&(this._nestingLevelCounts[u]=(this._nestingLevelCounts[u]||0)+1)}}toIndentRanges(){if(this._length<=this._foldingRangesLimit){let o=new Uint32Array(this._length),s=new Uint32Array(this._length);for(let a=0;athis._foldingRangesLimit){s=i;break}o+=n}}let a=new Uint32Array(this._foldingRangesLimit),u=new Uint32Array(this._foldingRangesLimit),r=[];for(let i=0,n=0;i{let t=i.start-n.start;return t===0&&(t=i.rank-n.rank),t}),a=new g(o),u,r=[];for(let i of s)if(!u)u=i,a.add(i.start,i.end,i.kind&&i.kind.value,r.length);else if(i.start>u.start)if(i.end<=u.end)r.push(u),u=i,a.add(i.start,i.end,i.kind&&i.kind.value,r.length);else{if(i.start>u.end){do u=r.pop();while(u&&i.start>u.end);u&&r.push(u),u=i}a.add(i.start,i.end,i.kind&&i.kind.value,r.length)}return a.toIndentRanges()}e.sanitizeRanges=p}),define(Q[407],J([0,1,225]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InitializingRangeProvider=e.ID_INIT_PROVIDER=void 0,e.ID_INIT_PROVIDER="init";class N{constructor(w,S,C,d){if(this.editorModel=w,this.id=e.ID_INIT_PROVIDER,S.length){let g=p=>({range:{startLineNumber:p.startLineNumber,startColumn:0,endLineNumber:p.endLineNumber,endColumn:w.getLineLength(p.endLineNumber)},options:{stickiness:1}});this.decorationIds=w.deltaDecorations([],S.map(g)),this.timeout=setTimeout(C,d)}}dispose(){this.decorationIds&&(this.editorModel.deltaDecorations(this.decorationIds,[]),this.decorationIds=void 0),typeof this.timeout=="number"&&(clearTimeout(this.timeout),this.timeout=void 0)}compute(w){let S=[];if(this.decorationIds)for(let C of this.decorationIds){let d=this.editorModel.getDecorationRange(C);d&&S.push({start:d.startLineNumber,end:d.endLineNumber,rank:1})}return Promise.resolve(b.sanitizeRanges(S,Number.MAX_VALUE))}}e.InitializingRangeProvider=N}),define(Q[226],J([0,1,62,3]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FormattingEdit=void 0;class M{static _handleEolEdits(S,C){let d,g=[];for(let p of C)typeof p.eol=="number"&&(d=p.eol),p.range&&typeof p.text=="string"&&g.push(p);return typeof d=="number"&&S.hasModel()&&S.getModel().pushEOL(d),g}static _isFullModelReplaceEdit(S,C){if(!S.hasModel())return!1;const d=S.getModel(),g=d.validateRange(C.range);return d.getFullModelRange().equalsRange(g)}static execute(S,C,d){d&&S.pushUndoStop();const g=M._handleEolEdits(S,C);g.length===1&&M._isFullModelReplaceEdit(S,g[0])?S.executeEdits("formatEditsCommand",g.map(p=>b.EditOperation.replace(N.Range.lift(p.range),p.text))):S.executeEdits("formatEditsCommand",g.map(p=>b.EditOperation.replaceMove(N.Range.lift(p.range),p.text))),d&&S.pushUndoStop()}}e.FormattingEdit=M}),define(Q[227],J([0,1,2,6,17]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ClickLinkGesture=e.ClickLinkOptions=e.ClickLinkKeyboardEvent=e.ClickLinkMouseEvent=void 0;function w(c,o){return!!c[o]}class S{constructor(o,s){this.target=o.target,this.hasTriggerModifier=w(o.event,s.triggerModifier),this.hasSideBySideModifier=w(o.event,s.triggerSideBySideModifier),this.isNoneOrSingleMouseDown=o.event.detail<=1}}e.ClickLinkMouseEvent=S;class C{constructor(o,s){this.keyCodeIsTriggerKey=o.keyCode===s.triggerKey,this.keyCodeIsSideBySideKey=o.keyCode===s.triggerSideBySideKey,this.hasTriggerModifier=w(o,s.triggerModifier)}}e.ClickLinkKeyboardEvent=C;class d{constructor(o,s,a,u){this.triggerKey=o,this.triggerModifier=s,this.triggerSideBySideKey=a,this.triggerSideBySideModifier=u}equals(o){return this.triggerKey===o.triggerKey&&this.triggerModifier===o.triggerModifier&&this.triggerSideBySideKey===o.triggerSideBySideKey&&this.triggerSideBySideModifier===o.triggerSideBySideModifier}}e.ClickLinkOptions=d;function g(c){return c==="altKey"?M.isMacintosh?new d(57,"metaKey",6,"altKey"):new d(5,"ctrlKey",6,"altKey"):M.isMacintosh?new d(6,"altKey",57,"metaKey"):new d(6,"altKey",5,"ctrlKey")}class p extends b.Disposable{constructor(o){super();this._onMouseMoveOrRelevantKeyDown=this._register(new N.Emitter),this.onMouseMoveOrRelevantKeyDown=this._onMouseMoveOrRelevantKeyDown.event,this._onExecute=this._register(new N.Emitter),this.onExecute=this._onExecute.event,this._onCancel=this._register(new N.Emitter),this.onCancel=this._onCancel.event,this._editor=o,this._opts=g(this._editor.getOption(64)),this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._register(this._editor.onDidChangeConfiguration(s=>{if(s.hasChanged(64)){const a=g(this._editor.getOption(64));if(this._opts.equals(a))return;this._opts=a,this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._onCancel.fire()}})),this._register(this._editor.onMouseMove(s=>this._onEditorMouseMove(new S(s,this._opts)))),this._register(this._editor.onMouseDown(s=>this._onEditorMouseDown(new S(s,this._opts)))),this._register(this._editor.onMouseUp(s=>this._onEditorMouseUp(new S(s,this._opts)))),this._register(this._editor.onKeyDown(s=>this._onEditorKeyDown(new C(s,this._opts)))),this._register(this._editor.onKeyUp(s=>this._onEditorKeyUp(new C(s,this._opts)))),this._register(this._editor.onMouseDrag(()=>this._resetHandler())),this._register(this._editor.onDidChangeCursorSelection(s=>this._onDidChangeCursorSelection(s))),this._register(this._editor.onDidChangeModel(s=>this._resetHandler())),this._register(this._editor.onDidChangeModelContent(()=>this._resetHandler())),this._register(this._editor.onDidScrollChange(s=>{(s.scrollTopChanged||s.scrollLeftChanged)&&this._resetHandler()}))}_onDidChangeCursorSelection(o){o.selection&&o.selection.startColumn!==o.selection.endColumn&&this._resetHandler()}_onEditorMouseMove(o){this._lastMouseMoveEvent=o,this._onMouseMoveOrRelevantKeyDown.fire([o,null])}_onEditorMouseDown(o){this._hasTriggerKeyOnMouseDown=o.hasTriggerModifier,this._lineNumberOnMouseDown=o.target.position?o.target.position.lineNumber:0}_onEditorMouseUp(o){const s=o.target.position?o.target.position.lineNumber:0;this._hasTriggerKeyOnMouseDown&&this._lineNumberOnMouseDown&&this._lineNumberOnMouseDown===s&&this._onExecute.fire(o)}_onEditorKeyDown(o){this._lastMouseMoveEvent&&(o.keyCodeIsTriggerKey||o.keyCodeIsSideBySideKey&&o.hasTriggerModifier)?this._onMouseMoveOrRelevantKeyDown.fire([this._lastMouseMoveEvent,o]):o.hasTriggerModifier&&this._onCancel.fire()}_onEditorKeyUp(o){o.keyCodeIsTriggerKey&&this._onCancel.fire()}_resetHandler(){this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._onCancel.fire()}}e.ClickLinkGesture=p}),define(Q[228],J([0,1,15,12]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverOperation=void 0;class M{constructor(S,C,d,g,p){this._computer=S,this._state=0,this._hoverTime=p,this._firstWaitScheduler=new b.RunOnceScheduler(()=>this._triggerAsyncComputation(),0),this._secondWaitScheduler=new b.RunOnceScheduler(()=>this._triggerSyncComputation(),0),this._loadingMessageScheduler=new b.RunOnceScheduler(()=>this._showLoadingMessage(),0),this._asyncComputationPromise=null,this._asyncComputationPromiseDone=!1,this._completeCallback=C,this._errorCallback=d,this._progressCallback=g}setHoverTime(S){this._hoverTime=S}_firstWaitTime(){return this._hoverTime/2}_secondWaitTime(){return this._hoverTime/2}_loadingMessageTime(){return 3*this._hoverTime}_triggerAsyncComputation(){this._state=2,this._secondWaitScheduler.schedule(this._secondWaitTime()),this._computer.computeAsync?(this._asyncComputationPromiseDone=!1,this._asyncComputationPromise=b.createCancelablePromise(S=>this._computer.computeAsync(S)),this._asyncComputationPromise.then(S=>{this._asyncComputationPromiseDone=!0,this._withAsyncResult(S)},S=>this._onError(S))):this._asyncComputationPromiseDone=!0}_triggerSyncComputation(){this._computer.computeSync&&this._computer.onResult(this._computer.computeSync(),!0),this._asyncComputationPromiseDone?(this._state=0,this._onComplete(this._computer.getResult())):(this._state=3,this._onProgress(this._computer.getResult()))}_showLoadingMessage(){this._state===3&&this._onProgress(this._computer.getResultWithLoadingMessage())}_withAsyncResult(S){S&&this._computer.onResult(S,!1),this._state===3&&(this._state=0,this._onComplete(this._computer.getResult()))}_onComplete(S){this._completeCallback(S)}_onError(S){this._errorCallback?this._errorCallback(S):N.onUnexpectedError(S)}_onProgress(S){this._progressCallback(S)}start(S){if(S===0)this._state===0&&(this._state=1,this._firstWaitScheduler.schedule(this._firstWaitTime()),this._loadingMessageScheduler.schedule(this._loadingMessageTime()));else switch(this._state){case 0:this._triggerAsyncComputation(),this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break;case 2:this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break}}cancel(){this._loadingMessageScheduler.cancel(),this._state===1&&this._firstWaitScheduler.cancel(),this._state===2&&(this._secondWaitScheduler.cancel(),this._asyncComputationPromise&&(this._asyncComputationPromise.cancel(),this._asyncComputationPromise=null)),this._state===3&&this._asyncComputationPromise&&(this._asyncComputationPromise.cancel(),this._asyncComputationPromise=null),this._state=0}}e.HoverOperation=M}),define(Q[408],J([0,1,52]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphHoverWidget=void 0;class N extends b.Widget{constructor(w,S){super();this._id=w,this._editor=S,this._isVisible=!1,this._domNode=document.createElement("div"),this._domNode.className="monaco-hover hidden",this._domNode.setAttribute("aria-hidden","true"),this._domNode.setAttribute("role","tooltip"),this._showAtLineNumber=-1,this._register(this._editor.onDidChangeConfiguration(C=>{C.hasChanged(38)&&this.updateFont()})),this._editor.addOverlayWidget(this)}get isVisible(){return this._isVisible}set isVisible(w){this._isVisible=w,this._domNode.classList.toggle("hidden",!this._isVisible)}getId(){return this._id}getDomNode(){return this._domNode}showAt(w){this._showAtLineNumber=w,this.isVisible||(this.isVisible=!0);const S=this._editor.getLayoutInfo(),C=this._editor.getTopForLineNumber(this._showAtLineNumber),d=this._editor.getScrollTop(),g=this._editor.getOption(53),p=this._domNode.clientHeight,c=C-d-(p-g)/2;this._domNode.style.left=`${S.glyphMarginLeft+S.glyphMarginWidth}px`,this._domNode.style.top=`${Math.max(Math.round(c),0)}px`}hide(){!this.isVisible||(this.isVisible=!1)}getPosition(){return null}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}updateFont(){const w=Array.prototype.slice.call(this._domNode.getElementsByTagName("code")),S=Array.prototype.slice.call(this._domNode.getElementsByClassName("code"));[...w,...S].forEach(C=>this._editor.applyFontInfo(C))}updateContents(w){this._domNode.textContent="",this._domNode.appendChild(w),this.updateFont()}}e.GlyphHoverWidget=N}),define(Q[409],J([0,1,21]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InPlaceReplaceCommand=void 0;class N{constructor(w,S,C){this._editRange=w,this._originalSelection=S,this._text=C}getEditOperations(w,S){S.addTrackedEditOperation(this._editRange,this._text)}computeCursorState(w,S){const d=S.getInverseEditOperations()[0].range;return this._originalSelection.isEmpty()?new b.Selection(d.endLineNumber,Math.min(this._originalSelection.positionColumn,d.endColumn),d.endLineNumber,Math.min(this._originalSelection.positionColumn,d.endColumn)):new b.Selection(d.endLineNumber,d.endColumn-this._text.length,d.endLineNumber,d.endColumn)}}e.InPlaceReplaceCommand=N}),define(Q[229],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateIndent=e.getSpaceCnt=void 0;function b(M,w){let S=0;for(let C=0;C=c)return null;let o=[];for(let a=p;a<=c;a++)o.push(C.getLineContent(a));let s=o.slice(0);return s.sort(M.getCollator().compare),g===!0&&(s=s.reverse()),{startLineNumber:p,endLineNumber:c,before:o,after:s}}function S(C,d,g){let p=w(C,d,g);return p?b.EditOperation.replace(new N.Range(p.startLineNumber,1,p.endLineNumber,C.getLineMaxColumn(p.endLineNumber)),p.after.join(` +`)):null}}),define(Q[230],J([0,1,14,3,71]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketSelectionRangeProvider=void 0;class w{provideSelectionRanges(C,d){return Ie(this,void 0,void 0,function*(){const g=[];for(const p of d){const c=[];g.push(c);const o=new Map;yield new Promise(s=>w._bracketsRightYield(s,0,C,p,o)),yield new Promise(s=>w._bracketsLeftYield(s,0,C,p,o,c))}return g})}static _bracketsRightYield(C,d,g,p,c){const o=new Map,s=Date.now();for(;;){if(d>=w._maxRounds){C();break}if(!p){C();break}let a=g.findNextBracket(p);if(!a){C();break}if(Date.now()-s>w._maxDuration){setTimeout(()=>w._bracketsRightYield(C,d+1,g,p,c));break}const r=a.close[0];if(a.isOpen){let i=o.has(r)?o.get(r):0;o.set(r,i+1)}else{let i=o.has(r)?o.get(r):0;if(i-=1,o.set(r,Math.max(0,i)),i<0){let n=c.get(r);n||(n=new M.LinkedList,c.set(r,n)),n.push(a.range)}}p=a.range.getEndPosition()}}static _bracketsLeftYield(C,d,g,p,c,o){const s=new Map,a=Date.now();for(;;){if(d>=w._maxRounds&&c.size===0){C();break}if(!p){C();break}let u=g.findPrevBracket(p);if(!u){C();break}if(Date.now()-a>w._maxDuration){setTimeout(()=>w._bracketsLeftYield(C,d+1,g,p,c,o));break}const i=u.close[0];if(u.isOpen){let n=s.has(i)?s.get(i):0;if(n-=1,s.set(i,Math.max(0,n)),n<0){let t=c.get(i);if(t){let l=t.shift();t.size===0&&c.delete(i);const h=N.Range.fromPositions(u.range.getEndPosition(),l.getStartPosition()),m=N.Range.fromPositions(u.range.getStartPosition(),l.getEndPosition());o.push({range:h}),o.push({range:m}),w._addBracketLeading(g,m,o)}}}else{let n=s.has(i)?s.get(i):0;s.set(i,n+1)}p=u.range.getStartPosition()}}static _addBracketLeading(C,d,g){if(d.startLineNumber!==d.endLineNumber){const p=d.startLineNumber,c=C.getLineFirstNonWhitespaceColumn(p);c!==0&&c!==d.startColumn&&(g.push({range:N.Range.fromPositions(new b.Position(p,c),d.getEndPosition())}),g.push({range:N.Range.fromPositions(new b.Position(p,1),d.getEndPosition())}));const o=p-1;if(o>0){const s=C.getLineFirstNonWhitespaceColumn(o);s===d.startColumn&&s!==C.getLineLastNonWhitespaceColumn(o)&&(g.push({range:N.Range.fromPositions(new b.Position(o,s),d.getEndPosition())}),g.push({range:N.Range.fromPositions(new b.Position(o,1),d.getEndPosition())}))}}}}e.BracketSelectionRangeProvider=w,w._maxDuration=30,w._maxRounds=2}),define(Q[412],J([0,1,3,8]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordSelectionRangeProvider=void 0;class M{provideSelectionRanges(S,C){const d=[];for(const g of C){const p=[];d.push(p),this._addInWordRanges(p,S,g),this._addWordRanges(p,S,g),this._addWhitespaceLine(p,S,g),p.push({range:S.getFullModelRange()})}return d}_addInWordRanges(S,C,d){const g=C.getWordAtPosition(d);if(!!g){let{word:p,startColumn:c}=g,o=d.column-c,s=o,a=o,u=0;for(;s>=0;s--){let r=p.charCodeAt(s);if(s!==o&&(r===95||r===45))break;if(N.isLowerAsciiLetter(r)&&N.isUpperAsciiLetter(u))break;u=r}for(s+=1;a0&&C.getLineFirstNonWhitespaceColumn(d.lineNumber)===0&&C.getLineLastNonWhitespaceColumn(d.lineNumber)===0&&S.push({range:new b.Range(d.lineNumber,1,d.lineNumber,C.getLineMaxColumn(d.lineNumber))})}}e.WordSelectionRangeProvider=M}),define(Q[131],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetParser=e.TextmateSnippet=e.Variable=e.FormatString=e.Transform=e.Choice=e.Placeholder=e.TransformableMarker=e.Text=e.Marker=e.Scanner=void 0;class b{constructor(){this.value="",this.pos=0}static isDigitCharacter(u){return u>=48&&u<=57}static isVariableCharacter(u){return u===95||u>=97&&u<=122||u>=65&&u<=90}text(u){this.value=u,this.pos=0}tokenText(u){return this.value.substr(u.pos,u.len)}next(){if(this.pos>=this.value.length)return{type:14,pos:this.pos,len:0};let u=this.pos,r=0,i=this.value.charCodeAt(u),n;if(n=b._table[i],typeof n=="number")return this.pos+=1,{type:n,pos:u,len:1};if(b.isDigitCharacter(i)){n=8;do r+=1,i=this.value.charCodeAt(u+r);while(b.isDigitCharacter(i));return this.pos+=r,{type:n,pos:u,len:r}}if(b.isVariableCharacter(i)){n=9;do i=this.value.charCodeAt(u+ ++r);while(b.isVariableCharacter(i)||b.isDigitCharacter(i));return this.pos+=r,{type:n,pos:u,len:r}}n=10;do r+=1,i=this.value.charCodeAt(u+r);while(!isNaN(i)&&typeof b._table[i]=="undefined"&&!b.isDigitCharacter(i)&&!b.isVariableCharacter(i));return this.pos+=r,{type:n,pos:u,len:r}}}e.Scanner=b,b._table={[36]:0,[58]:1,[44]:2,[123]:3,[125]:4,[92]:5,[47]:6,[124]:7,[43]:11,[45]:12,[63]:13};class N{constructor(){this._children=[]}appendChild(u){return u instanceof M&&this._children[this._children.length-1]instanceof M?this._children[this._children.length-1].value+=u.value:(u.parent=this,this._children.push(u)),this}replace(u,r){const{parent:i}=u,n=i.children.indexOf(u),t=i.children.slice(0);t.splice(n,1,...r),i._children=t,function l(h,m){for(const _ of h)_.parent=m,l(_.children,_)}(r,i)}get children(){return this._children}get snippet(){let u=this;for(;;){if(!u)return;if(u instanceof o)return u;u=u.parent}}toString(){return this.children.reduce((u,r)=>u+r.toString(),"")}len(){return 0}}e.Marker=N;class M extends N{constructor(u){super();this.value=u}toString(){return this.value}len(){return this.value.length}clone(){return new M(this.value)}}e.Text=M;class w extends N{}e.TransformableMarker=w;class S extends w{constructor(u){super();this.index=u}static compareByIndex(u,r){return u.index===r.index?0:u.isFinalTabstop?1:r.isFinalTabstop||u.indexr.index?1:0}get isFinalTabstop(){return this.index===0}get choice(){return this._children.length===1&&this._children[0]instanceof C?this._children[0]:void 0}clone(){let u=new S(this.index);return this.transform&&(u.transform=this.transform.clone()),u._children=this.children.map(r=>r.clone()),u}}e.Placeholder=S;class C extends N{constructor(){super(...arguments);this.options=[]}appendChild(u){return u instanceof M&&(u.parent=this,this.options.push(u)),this}toString(){return this.options[0].value}len(){return this.options[0].len()}clone(){let u=new C;return this.options.forEach(u.appendChild,u),u}}e.Choice=C;class d extends N{constructor(){super(...arguments);this.regexp=new RegExp("")}resolve(u){const r=this;let i=!1,n=u.replace(this.regexp,function(){return i=!0,r._replace(Array.prototype.slice.call(arguments,0,-2))});return!i&&this._children.some(t=>t instanceof g&&Boolean(t.elseValue))&&(n=this._replace([])),n}_replace(u){let r="";for(const i of this._children)if(i instanceof g){let n=u[i.index]||"";n=i.resolve(n),r+=n}else r+=i.toString();return r}toString(){return""}clone(){let u=new d;return u.regexp=new RegExp(this.regexp.source,""+(this.regexp.ignoreCase?"i":"")+(this.regexp.global?"g":"")),u._children=this.children.map(r=>r.clone()),u}}e.Transform=d;class g extends N{constructor(u,r,i,n){super();this.index=u,this.shorthandName=r,this.ifValue=i,this.elseValue=n}resolve(u){return this.shorthandName==="upcase"?u?u.toLocaleUpperCase():"":this.shorthandName==="downcase"?u?u.toLocaleLowerCase():"":this.shorthandName==="capitalize"?u?u[0].toLocaleUpperCase()+u.substr(1):"":this.shorthandName==="pascalcase"?u?this._toPascalCase(u):"":Boolean(u)&&typeof this.ifValue=="string"?this.ifValue:!Boolean(u)&&typeof this.elseValue=="string"?this.elseValue:u||""}_toPascalCase(u){const r=u.match(/[a-z]+/gi);return r?r.map(function(i){return i.charAt(0).toUpperCase()+i.substr(1).toLowerCase()}).join(""):u}clone(){return new g(this.index,this.shorthandName,this.ifValue,this.elseValue)}}e.FormatString=g;class p extends w{constructor(u){super();this.name=u}resolve(u){let r=u.resolve(this);return this.transform&&(r=this.transform.resolve(r||"")),r!==void 0?(this._children=[new M(r)],!0):!1}clone(){const u=new p(this.name);return this.transform&&(u.transform=this.transform.clone()),u._children=this.children.map(r=>r.clone()),u}}e.Variable=p;function c(a,u){const r=[...a];for(;r.length>0;){const i=r.shift();if(!u(i))break;r.unshift(...i.children)}}class o extends N{get placeholderInfo(){if(!this._placeholders){let u=[],r;this.walk(function(i){return i instanceof S&&(u.push(i),r=!r||r.indexn===u?(i=!0,!1):(r+=n.len(),!0)),i?r:-1}fullLen(u){let r=0;return c([u],i=>(r+=i.len(),!0)),r}enclosingPlaceholders(u){let r=[],{parent:i}=u;for(;i;)i instanceof S&&r.push(i),i=i.parent;return r}resolveVariables(u){return this.walk(r=>(r instanceof p&&r.resolve(u)&&(this._placeholders=void 0),!0)),this}appendChild(u){return this._placeholders=void 0,super.appendChild(u)}replace(u,r){return this._placeholders=void 0,super.replace(u,r)}clone(){let u=new o;return this._children=this.children.map(r=>r.clone()),u}walk(u){c(this.children,u)}}e.TextmateSnippet=o;class s{constructor(){this._scanner=new b,this._token={type:14,pos:0,len:0}}static escape(u){return u.replace(/\$|}|\\/g,"\\$&")}static guessNeedsClipboard(u){return/\${?CLIPBOARD/.test(u)}parse(u,r,i){this._scanner.text(u),this._token=this._scanner.next();const n=new o;for(;this._parse(n););const t=new Map,l=[];let h=0;n.walk(m=>(m instanceof S&&(h+=1,m.isFinalTabstop?t.set(0,void 0):!t.has(m.index)&&m.children.length>0?t.set(m.index,m.children):l.push(m)),!0));for(const m of l){const _=t.get(m.index);if(_){const f=new S(m.index);f.transform=m.transform;for(const v of _)f.appendChild(v.clone());n.replace(m,[f])}}return i||(i=h>0&&r),!t.has(0)&&i&&n.appendChild(new S(0)),n}_accept(u,r){if(u===void 0||this._token.type===u){let i=r?this._scanner.tokenText(this._token):!0;return this._token=this._scanner.next(),i}return!1}_backTo(u){return this._scanner.pos=u.pos+u.len,this._token=u,!1}_until(u){const r=this._token;for(;this._token.type!==u;){if(this._token.type===14)return!1;if(this._token.type===5){const n=this._scanner.next();if(n.type!==0&&n.type!==4&&n.type!==5)return!1}this._token=this._scanner.next()}const i=this._scanner.value.substring(r.pos,this._token.pos).replace(/\\(\$|}|\\)/g,"$1");return this._token=this._scanner.next(),i}_parse(u){return this._parseEscaped(u)||this._parseTabstopOrVariableName(u)||this._parseComplexPlaceholder(u)||this._parseComplexVariable(u)||this._parseAnything(u)}_parseEscaped(u){let r;return(r=this._accept(5,!0))?(r=this._accept(0,!0)||this._accept(4,!0)||this._accept(5,!0)||r,u.appendChild(new M(r)),!0):!1}_parseTabstopOrVariableName(u){let r;const i=this._token;return this._accept(0)&&(r=this._accept(9,!0)||this._accept(8,!0))?(u.appendChild(/^\d+$/.test(r)?new S(Number(r)):new p(r)),!0):this._backTo(i)}_parseComplexPlaceholder(u){let r;const i=this._token;if(!(this._accept(0)&&this._accept(3)&&(r=this._accept(8,!0))))return this._backTo(i);const t=new S(Number(r));if(this._accept(1))for(;;){if(this._accept(4))return u.appendChild(t),!0;if(!this._parse(t))return u.appendChild(new M("${"+r+":")),t.children.forEach(u.appendChild,u),!0}else if(t.index>0&&this._accept(7)){const l=new C;for(;;){if(this._parseChoiceElement(l)){if(this._accept(2))continue;if(this._accept(7)&&(t.appendChild(l),this._accept(4)))return u.appendChild(t),!0}return this._backTo(i),!1}}else return this._accept(6)?this._parseTransform(t)?(u.appendChild(t),!0):(this._backTo(i),!1):this._accept(4)?(u.appendChild(t),!0):this._backTo(i)}_parseChoiceElement(u){const r=this._token,i=[];for(;!(this._token.type===2||this._token.type===7);){let n;if((n=this._accept(5,!0))?n=this._accept(2,!0)||this._accept(7,!0)||this._accept(5,!0)||n:n=this._accept(void 0,!0),!n)return this._backTo(r),!1;i.push(n)}return i.length===0?(this._backTo(r),!1):(u.appendChild(new M(i.join(""))),!0)}_parseComplexVariable(u){let r;const i=this._token;if(!(this._accept(0)&&this._accept(3)&&(r=this._accept(9,!0))))return this._backTo(i);const t=new p(r);if(this._accept(1))for(;;){if(this._accept(4))return u.appendChild(t),!0;if(!this._parse(t))return u.appendChild(new M("${"+r+":")),t.children.forEach(u.appendChild,u),!0}else return this._accept(6)?this._parseTransform(t)?(u.appendChild(t),!0):(this._backTo(i),!1):this._accept(4)?(u.appendChild(t),!0):this._backTo(i)}_parseTransform(u){let r=new d,i="",n="";for(;!this._accept(6);){let t;if(t=this._accept(5,!0)){t=this._accept(6,!0)||t,i+=t;continue}if(this._token.type!==14){i+=this._accept(void 0,!0);continue}return!1}for(;!this._accept(6);){let t;if(t=this._accept(5,!0)){t=this._accept(5,!0)||this._accept(6,!0)||t,r.appendChild(new M(t));continue}if(!(this._parseFormatString(r)||this._parseAnything(r)))return!1}for(;!this._accept(4);){if(this._token.type!==14){n+=this._accept(void 0,!0);continue}return!1}try{r.regexp=new RegExp(i,n)}catch(t){return!1}return u.transform=r,!0}_parseFormatString(u){const r=this._token;if(!this._accept(0))return!1;let i=!1;this._accept(3)&&(i=!0);let n=this._accept(8,!0);if(n)if(i){if(this._accept(4))return u.appendChild(new g(Number(n))),!0;if(!this._accept(1))return this._backTo(r),!1}else return u.appendChild(new g(Number(n))),!0;else return this._backTo(r),!1;if(this._accept(6)){let t=this._accept(9,!0);return!t||!this._accept(4)?(this._backTo(r),!1):(u.appendChild(new g(Number(n),t)),!0)}else if(this._accept(11)){let t=this._until(4);if(t)return u.appendChild(new g(Number(n),void 0,t,void 0)),!0}else if(this._accept(12)){let t=this._until(4);if(t)return u.appendChild(new g(Number(n),void 0,void 0,t)),!0}else if(this._accept(13)){let t=this._until(1);if(t){let l=this._until(4);if(l)return u.appendChild(new g(Number(n),void 0,t,l)),!0}}else{let t=this._until(4);if(t)return u.appendChild(new g(Number(n),void 0,void 0,t)),!0}return this._backTo(r),!1}_parseAnything(u){return this._token.type!==14?(u.appendChild(new M(this._scanner.tokenText(this._token))),this._accept(void 0),!0):!1}}e.SnippetParser=s}),define(Q[413],J([0,1,66,8,19]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompletionModel=e.LineContext=void 0;class w{constructor(d,g){this.leadingLineContent=d,this.characterCountDelta=g}}e.LineContext=w;class S{constructor(d,g,p,c,o,s,a){this.clipboardText=a,this._snippetCompareFn=S._compareCompletionItems,this._items=d,this._column=g,this._wordDistance=c,this._options=o,this._refilterKind=1,this._lineContext=p,s==="top"?this._snippetCompareFn=S._compareCompletionItemsSnippetsUp:s==="bottom"&&(this._snippetCompareFn=S._compareCompletionItemsSnippetsDown)}get lineContext(){return this._lineContext}set lineContext(d){(this._lineContext.leadingLineContent!==d.leadingLineContent||this._lineContext.characterCountDelta!==d.characterCountDelta)&&(this._refilterKind=this._lineContext.characterCountDelta2e3?b.fuzzyScore:b.fuzzyScoreGracefulAggressive;for(let r=0;r=t)i.score=b.FuzzyScore.Default;else if(typeof i.completion.filterText=="string"){let m=u(c,o,h,i.completion.filterText,i.filterTextLow,0,!1);if(!m)continue;N.compareIgnoreCase(i.completion.filterText,l)===0?i.score=m:(i.score=b.anyScore(c,o,h,l,i.labelLow,0),i.score[0]=m[0])}else{let m=u(c,o,h,l,i.labelLow,0,!1);if(!m)continue;i.score=m}}i.idx=r,i.distance=this._wordDistance.distance(i.position,i.completion),a.push(i),d.push(l.length)}}this._filteredItems=a.sort(this._snippetCompareFn),this._refilterKind=0,this._stats={pLabelLen:d.length?M.quickSelect(d.length-.85,d,(r,i)=>r-i):0}}static _compareCompletionItems(d,g){return d.score[0]>g.score[0]?-1:d.score[0]g.distance?1:d.idxg.idx?1:0}static _compareCompletionItemsSnippetsDown(d,g){if(d.completion.kind!==g.completion.kind){if(d.completion.kind===27)return 1;if(g.completion.kind===27)return-1}return S._compareCompletionItems(d,g)}static _compareCompletionItemsSnippetsUp(d,g){if(d.completion.kind!==g.completion.kind){if(d.completion.kind===27)return-1;if(g.completion.kind===27)return 1}return S._compareCompletionItems(d,g)}}e.CompletionModel=S}),define(Q[231],J([0,1,6,2,7,104]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResizableHTMLElement=void 0;class S{constructor(){this._onDidWillResize=new b.Emitter,this.onDidWillResize=this._onDidWillResize.event,this._onDidResize=new b.Emitter,this.onDidResize=this._onDidResize.event,this._sashListener=new N.DisposableStore,this._size=new M.Dimension(0,0),this._minSize=new M.Dimension(0,0),this._maxSize=new M.Dimension(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER),this.domNode=document.createElement("div"),this._eastSash=new w.Sash(this.domNode,{getVerticalSashLeft:()=>this._size.width},{orientation:0}),this._westSash=new w.Sash(this.domNode,{getVerticalSashLeft:()=>0},{orientation:0}),this._northSash=new w.Sash(this.domNode,{getHorizontalSashTop:()=>0},{orientation:1,orthogonalEdge:w.OrthogonalEdge.North}),this._southSash=new w.Sash(this.domNode,{getHorizontalSashTop:()=>this._size.height},{orientation:1,orthogonalEdge:w.OrthogonalEdge.South}),this._northSash.orthogonalStartSash=this._westSash,this._northSash.orthogonalEndSash=this._eastSash,this._southSash.orthogonalStartSash=this._westSash,this._southSash.orthogonalEndSash=this._eastSash;let d,g=0,p=0;this._sashListener.add(b.Event.any(this._northSash.onDidStart,this._eastSash.onDidStart,this._southSash.onDidStart,this._westSash.onDidStart)(()=>{d===void 0&&(this._onDidWillResize.fire(),d=this._size,g=0,p=0)})),this._sashListener.add(b.Event.any(this._northSash.onDidEnd,this._eastSash.onDidEnd,this._southSash.onDidEnd,this._westSash.onDidEnd)(()=>{d!==void 0&&(d=void 0,g=0,p=0,this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(this._eastSash.onDidChange(c=>{d&&(p=c.currentX-c.startX,this.layout(d.height+g,d.width+p),this._onDidResize.fire({dimension:this._size,done:!1,east:!0}))})),this._sashListener.add(this._westSash.onDidChange(c=>{d&&(p=-(c.currentX-c.startX),this.layout(d.height+g,d.width+p),this._onDidResize.fire({dimension:this._size,done:!1,west:!0}))})),this._sashListener.add(this._northSash.onDidChange(c=>{d&&(g=-(c.currentY-c.startY),this.layout(d.height+g,d.width+p),this._onDidResize.fire({dimension:this._size,done:!1,north:!0}))})),this._sashListener.add(this._southSash.onDidChange(c=>{d&&(g=c.currentY-c.startY,this.layout(d.height+g,d.width+p),this._onDidResize.fire({dimension:this._size,done:!1,south:!0}))})),this._sashListener.add(b.Event.any(this._eastSash.onDidReset,this._westSash.onDidReset)(c=>{this._preferredSize&&(this.layout(this._size.height,this._preferredSize.width),this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(b.Event.any(this._northSash.onDidReset,this._southSash.onDidReset)(c=>{this._preferredSize&&(this.layout(this._preferredSize.height,this._size.width),this._onDidResize.fire({dimension:this._size,done:!0}))}))}dispose(){this._northSash.dispose(),this._southSash.dispose(),this._eastSash.dispose(),this._westSash.dispose(),this._sashListener.dispose(),this.domNode.remove()}enableSashes(d,g,p,c){this._northSash.state=d?3:0,this._eastSash.state=g?3:0,this._southSash.state=p?3:0,this._westSash.state=c?3:0}layout(d=this.size.height,g=this.size.width){const{height:p,width:c}=this._minSize,{height:o,width:s}=this._maxSize;d=Math.max(p,Math.min(o,d)),g=Math.max(c,Math.min(s,g));const a=new M.Dimension(g,d);M.Dimension.equals(a,this._size)||(this.domNode.style.height=d+"px",this.domNode.style.width=g+"px",this._size=a,this._northSash.layout(),this._eastSash.layout(),this._southSash.layout(),this._westSash.layout())}get size(){return this._size}set maxSize(d){this._maxSize=d}get maxSize(){return this._maxSize}set minSize(d){this._minSize=d}get minSize(){return this._minSize}set preferredSize(d){this._preferredSize=d}get preferredSize(){return this._preferredSize}}e.ResizableHTMLElement=S}),define(Q[414],J([0,1,19,2,91]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommitCharacterController=void 0;class w{constructor(C,d,g){this._disposables=new N.DisposableStore,this._disposables.add(d.onDidShow(()=>this._onItem(d.getFocusedItem()))),this._disposables.add(d.onDidFocus(this._onItem,this)),this._disposables.add(d.onDidHide(this.reset,this)),this._disposables.add(C.onWillType(p=>{if(this._active&&!d.isFrozen()){const c=p.charCodeAt(p.length-1);this._active.acceptCharacters.has(c)&&C.getOption(0)&&g(this._active.item)}}))}_onItem(C){if(!C||!b.isNonEmptyArray(C.item.completion.commitCharacters)){this.reset();return}if(!(this._active&&this._active.item.item===C.item)){const d=new M.CharacterSet;for(const g of C.item.completion.commitCharacters)g.length>0&&d.add(g.charCodeAt(0));this._active={acceptCharacters:d,item:C}}}reset(){this._active=void 0}dispose(){this._disposables.dispose()}}e.CommitCharacterController=w}),define(Q[415],J([0,1,2]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OvertypingCapturer=void 0;class N{constructor(w,S){this._disposables=new b.DisposableStore,this._lastOvertyped=[],this._empty=!0,this._disposables.add(w.onWillType(()=>{if(!!this._empty&&!!w.hasModel()){const C=w.getSelections(),d=C.length;let g=!1;for(let c=0;cN._maxSelectionLength)return;this._lastOvertyped[c]={value:p.getValueInRange(o),multiline:o.startLineNumber!==o.endLineNumber}}this._empty=!1}}})),this._disposables.add(S.onDidCancel(C=>{!this._empty&&!C.retrigger&&(this._empty=!0)}))}getLastOvertypedInfo(w){if(!this._empty&&w>=0&&w=0?i[n]:i[Math.max(0,~n-1)],l=c.length;for(const h of c){if(!N.Range.containsRange(h.range,t))break;l-=1}return l}}})}}e.WordDistance=w,w.None=new class extends w{distance(){return 0}}}),define(Q[232],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.stateExists=e.findRules=e.substituteMatches=e.createError=e.log=e.sanitize=e.fixCase=e.empty=e.isIAction=e.isString=e.isFuzzyAction=e.isFuzzyActionArr=void 0;function b(a){return Array.isArray(a)}e.isFuzzyActionArr=b;function N(a){return!b(a)}e.isFuzzyAction=N;function M(a){return typeof a=="string"}e.isString=M;function w(a){return!M(a)}e.isIAction=w;function S(a){return!a}e.empty=S;function C(a,u){return a.ignoreCase&&u?u.toLowerCase():u}e.fixCase=C;function d(a){return a.replace(/[&<>'"_]/g,"-")}e.sanitize=d;function g(a,u){console.log(`${a.languageId}: ${u}`)}e.log=g;function p(a,u){return new Error(`${a.languageId}: ${u}`)}e.createError=p;function c(a,u,r,i,n){const t=/\$((\$)|(#)|(\d\d?)|[sS](\d\d?)|@(\w+))/g;let l=null;return u.replace(t,function(h,m,_,f,v,y,L,I,k){return S(_)?S(f)?!S(v)&&v0;){const i=a.tokenizer[r];if(i)return i;const n=r.lastIndexOf(".");n<0?r=null:r=r.substr(0,n)}return null}e.findRules=o;function s(a,u){let r=u;for(;r&&r.length>0;){if(a.stateNames[r])return!0;const n=r.lastIndexOf(".");n<0?r=null:r=r.substr(0,n)}return!1}e.stateExists=s}),define(Q[417],J([0,1,232]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compile=void 0;function N(a,u){if(!u||!Array.isArray(u))return!1;for(const r of u)if(!a(r))return!1;return!0}function M(a,u){return typeof a=="boolean"?a:u}function w(a,u){return typeof a=="string"?a:u}function S(a){const u={};for(const r of a)u[r]=!0;return u}function C(a,u=!1){u&&(a=a.map(function(i){return i.toLowerCase()}));const r=S(a);return u?function(i){return r[i.toLowerCase()]!==void 0&&r.hasOwnProperty(i.toLowerCase())}:function(i){return r[i]!==void 0&&r.hasOwnProperty(i)}}function d(a,u){let r=0,i;do i=!1,u=u.replace(/(.|^)@(\w+)/g,function(t,l,h){if(l==="@")return t;i=!0;let m="";if(typeof a[h]=="string")m=a[h];else if(a[h]&&a[h]instanceof RegExp)m=a[h].source;else throw a[h]===void 0?b.createError(a,"language definition does not contain attribute '"+h+"', used at: "+u):b.createError(a,"attribute reference '"+h+"' must be a string, used at: "+u);return l+(b.empty(m)?"":"(?:"+m+")")}),r++;while(i&&r<5);u=u.replace(/@@/g,"@");let n=(a.ignoreCase?"i":"")+(a.unicode?"u":"");return new RegExp(u,n)}function g(a,u,r,i){if(i<0)return a;if(i=100){i=i-100;let n=r.split(".");if(n.unshift(r),i=0&&(i.tokenSubst=!0),typeof r.bracket=="string")if(r.bracket==="@open")i.bracket=1;else if(r.bracket==="@close")i.bracket=-1;else throw b.createError(a,"a 'bracket' attribute must be either '@open' or '@close', in rule: "+u);if(r.next){if(typeof r.next!="string")throw b.createError(a,"the next state must be a string value in rule: "+u);{let n=r.next;if(!/^(@pop|@push|@popall)$/.test(n)&&(n[0]==="@"&&(n=n.substr(1)),n.indexOf("$")<0&&!b.stateExists(a,b.substituteMatches(a,n,"",[],""))))throw b.createError(a,"the next state '"+r.next+"' is not defined in rule: "+u);i.next=n}}return typeof r.goBack=="number"&&(i.goBack=r.goBack),typeof r.switchTo=="string"&&(i.switchTo=r.switchTo),typeof r.log=="string"&&(i.log=r.log),typeof r.nextEmbedded=="string"&&(i.nextEmbedded=r.nextEmbedded,a.usesEmbedded=!0),i}}else if(Array.isArray(r)){let i=[];for(let n=0,t=r.length;n0&&i[0]==="^",this.name=this.name+": "+i,this.regex=d(u,"^(?:"+(this.matchOnlyAtLineStart?i.substr(1):i)+")")}setAction(u,r){this.action=c(u,this.name,r)}}function s(a,u){if(!u||typeof u!="object")throw new Error("Monarch: expecting a language definition object");let r={};r.languageId=a,r.includeLF=M(u.includeLF,!1),r.noThrow=!1,r.maxStack=100,r.start=typeof u.start=="string"?u.start:null,r.ignoreCase=M(u.ignoreCase,!1),r.unicode=M(u.unicode,!1),r.tokenPostfix=w(u.tokenPostfix,"."+r.languageId),r.defaultToken=w(u.defaultToken,"source"),r.usesEmbedded=!1;let i=u;i.languageId=a,i.includeLF=r.includeLF,i.ignoreCase=r.ignoreCase,i.unicode=r.unicode,i.noThrow=r.noThrow,i.usesEmbedded=r.usesEmbedded,i.stateNames=u.tokenizer,i.defaultToken=r.defaultToken;function n(l,h,m){for(const _ of m){let f=_.include;if(f){if(typeof f!="string")throw b.createError(r,"an 'include' attribute must be a string at: "+l);if(f[0]==="@"&&(f=f.substr(1)),!u.tokenizer[f])throw b.createError(r,"include target '"+f+"' is not defined at: "+l);n(l+"."+f,h,u.tokenizer[f])}else{const v=new o(l);if(Array.isArray(_)&&_.length>=1&&_.length<=3)if(v.setRegex(i,_[0]),_.length>=3)if(typeof _[1]=="string")v.setAction(i,{token:_[1],next:_[2]});else if(typeof _[1]=="object"){const y=_[1];y.next=_[2],v.setAction(i,y)}else throw b.createError(r,"a next state as the last element of a rule can only be given if the action is either an object or a string, at: "+l);else v.setAction(i,_[1]);else{if(!_.regex)throw b.createError(r,"a rule must either be an array, or an object with a 'regex' or 'include' field at: "+l);_.name&&typeof _.name=="string"&&(v.name=_.name),_.matchOnlyAtStart&&(v.matchOnlyAtLineStart=M(_.matchOnlyAtLineStart,!1)),v.setRegex(i,_.regex),v.setAction(i,_.action)}h.push(v)}}}if(!u.tokenizer||typeof u.tokenizer!="object")throw b.createError(r,"a language definition must define the 'tokenizer' attribute as an object");r.tokenizer=[];for(let l in u.tokenizer)if(u.tokenizer.hasOwnProperty(l)){r.start||(r.start=l);const h=u.tokenizer[l];r.tokenizer[l]=new Array,n("tokenizer."+l,r.tokenizer[l],h)}if(r.usesEmbedded=i.usesEmbedded,u.brackets){if(!Array.isArray(u.brackets))throw b.createError(r,"the 'brackets' attribute must be defined as an array")}else u.brackets=[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}];let t=[];for(let l of u.brackets){let h=l;if(h&&Array.isArray(h)&&h.length===3&&(h={token:h[2],open:h[0],close:h[1]}),h.open===h.close)throw b.createError(r,"open and close brackets in a 'brackets' attribute must be different: "+h.open+` + hint: use the 'bracket' attribute if matching on equal brackets is required.`);if(typeof h.open=="string"&&typeof h.token=="string"&&typeof h.close=="string")t.push({token:h.token+r.tokenPostfix,open:b.fixCase(r,h.open),close:b.fixCase(r,h.close)});else throw b.createError(r,"every element in the 'brackets' array must be a '{open,close,token}' object or array")}return r.brackets=t,r.noThrow=!0,r}e.compile=s}),define(Q[418],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/actionbar/actionViewItems",e)}),define(Q[419],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/findinput/findInput",e)}),define(Q[420],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/findinput/findInputCheckboxes",e)}),define(Q[233],J([0,1,160,420,27]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RegexCheckbox=e.WholeWordsCheckbox=e.CaseSensitiveCheckbox=void 0;const w=N.localize(0,null),S=N.localize(1,null),C=N.localize(2,null);class d extends b.Checkbox{constructor(o){super({icon:M.Codicon.caseSensitive,title:w+o.appendTitle,isChecked:o.isChecked,inputActiveOptionBorder:o.inputActiveOptionBorder,inputActiveOptionForeground:o.inputActiveOptionForeground,inputActiveOptionBackground:o.inputActiveOptionBackground})}}e.CaseSensitiveCheckbox=d;class g extends b.Checkbox{constructor(o){super({icon:M.Codicon.wholeWord,title:S+o.appendTitle,isChecked:o.isChecked,inputActiveOptionBorder:o.inputActiveOptionBorder,inputActiveOptionForeground:o.inputActiveOptionForeground,inputActiveOptionBackground:o.inputActiveOptionBackground})}}e.WholeWordsCheckbox=g;class p extends b.Checkbox{constructor(o){super({icon:M.Codicon.regex,title:C+o.appendTitle,isChecked:o.isChecked,inputActiveOptionBorder:o.inputActiveOptionBorder,inputActiveOptionForeground:o.inputActiveOptionForeground,inputActiveOptionBackground:o.inputActiveOptionBackground})}}e.RegexCheckbox=p}),define(Q[421],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/findinput/replaceInput",e)}),define(Q[422],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/iconLabel/iconLabel",e)}),define(Q[175],J([0,1,7,157,2,120,40,17,20,55,422,23,304]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IconLabel=void 0;class o{constructor(n){this._element=n}get element(){return this._element}set textContent(n){this.disposed||n===this._textContent||(this._textContent=n,this._element.textContent=n)}set className(n){this.disposed||n===this._className||(this._className=n,this._element.className=n)}set empty(n){this.disposed||n===this._empty||(this._empty=n,this._element.style.marginLeft=n?"0":"")}dispose(){this.disposed=!0}}class s extends M.Disposable{constructor(n,t){super();this.hoverDelegate=void 0,this.customHovers=new Map,this.domNode=this._register(new o(b.append(n,b.$(".monaco-icon-label")))),this.labelContainer=b.append(this.domNode.element,b.$(".monaco-icon-label-container"));const l=b.append(this.labelContainer,b.$("span.monaco-icon-name-container"));this.descriptionContainer=this._register(new o(b.append(this.labelContainer,b.$("span.monaco-icon-description-container")))),(t==null?void 0:t.supportHighlights)?this.nameNode=new r(l,!!t.supportIcons):this.nameNode=new a(l),(t==null?void 0:t.supportDescriptionHighlights)?this.descriptionNodeFactory=()=>new N.HighlightedLabel(b.append(this.descriptionContainer.element,b.$("span.label-description")),!!t.supportIcons):this.descriptionNodeFactory=()=>this._register(new o(b.append(this.descriptionContainer.element,b.$("span.label-description")))),(t==null?void 0:t.hoverDelegate)&&(this.hoverDelegate=t.hoverDelegate)}setLabel(n,t,l){const h=["monaco-icon-label"];l&&(l.extraClasses&&h.push(...l.extraClasses),l.italic&&h.push("italic"),l.strikethrough&&h.push("strikethrough")),this.domNode.className=h.join(" "),this.setupHover(this.labelContainer,l==null?void 0:l.title),this.nameNode.setLabel(n,l),(t||this.descriptionNode)&&(this.descriptionNode||(this.descriptionNode=this.descriptionNodeFactory()),this.descriptionNode instanceof N.HighlightedLabel?(this.descriptionNode.set(t||"",l?l.descriptionMatches:void 0),this.setupHover(this.descriptionNode.element,l==null?void 0:l.descriptionTitle)):(this.descriptionNode.textContent=t||"",this.setupHover(this.descriptionNode.element,(l==null?void 0:l.descriptionTitle)||""),this.descriptionNode.empty=!t))}setupHover(n,t){const l=this.customHovers.get(n);if(l&&(l.dispose(),this.customHovers.delete(n)),!t){n.removeAttribute("title");return}return this.hoverDelegate?this.setupCustomHover(this.hoverDelegate,n,t):this.setupNativeHover(n,t)}static adjustXAndShowCustomHover(n,t,l,h){if(n&&h)return t!==void 0&&(n.target.x=t+10),l.showHover(n)}getTooltipForCustom(n){if(d.isString(n))return()=>Ie(this,void 0,void 0,function*(){return n});if(d.isFunction(n.markdown))return n.markdown;{const t=n.markdown;return()=>Ie(this,void 0,void 0,function*(){return t})}}setupCustomHover(n,t,l){t.setAttribute("title",""),t.removeAttribute("title");let h=this.getTooltipForCustom(l);const m=C.isMacintosh?1500:500;let _,f,v=!1,y,L;function I(E){if(!v){y=new c.CancellationTokenSource;function T(D){(D.type===b.EventType.MOUSE_DOWN||D.fromElement===t)&&(L==null||L.dispose(),L=void 0,v=!1,_=void 0,y.dispose(!0),O.dispose(),A.dispose())}const O=g.domEvent(t,b.EventType.MOUSE_LEAVE,!0)(T.bind(t)),A=g.domEvent(t,b.EventType.MOUSE_DOWN,!0)(T.bind(t));v=!0;function B(D){f=D.x}const F=g.domEvent(t,b.EventType.MOUSE_MOVE,!0)(B.bind(t));setTimeout(()=>Ie(this,void 0,void 0,function*(){var D;if(v&&h&&!_){const R={targetElements:[this],dispose:()=>{}};_={text:p.localize(0,null),target:R,anchorPosition:0},L=s.adjustXAndShowCustomHover(_,f,n,v);const W=(D=yield h(y.token))!==null&&D!==void 0?D:d.isString(l)?void 0:l.markdownNotSupportedFallback;W?(_={text:W,target:R,anchorPosition:0},L=s.adjustXAndShowCustomHover(_,f,n,v)):L&&(L.dispose(),L=void 0)}F.dispose()}),m)}}const k=this._register(g.domEvent(t,b.EventType.MOUSE_OVER,!0)(I.bind(t)));this.customHovers.set(t,k)}setupNativeHover(n,t){let l="";d.isString(t)?l=t:(t==null?void 0:t.markdownNotSupportedFallback)&&(l=t.markdownNotSupportedFallback),n.title=l}}e.IconLabel=s;class a{constructor(n){this.container=n,this.label=void 0,this.singleLabel=void 0}setLabel(n,t){if(!(this.label===n&&S.equals(this.options,t)))if(this.label=n,this.options=t,typeof n=="string")this.singleLabel||(this.container.innerText="",this.container.classList.remove("multiple"),this.singleLabel=b.append(this.container,b.$("a.label-name",{id:t==null?void 0:t.domId}))),this.singleLabel.textContent=n;else{this.container.innerText="",this.container.classList.add("multiple"),this.singleLabel=void 0;for(let l=0;l{const m={start:l,end:l+h.length},_=t.map(f=>w.Range.intersect(m,f)).filter(f=>!w.Range.isEmpty(f)).map(({start:f,end:v})=>({start:f-l,end:v-l}));return l=m.end+n.length,_})}}class r{constructor(n,t){this.container=n,this.supportIcons=t,this.label=void 0,this.singleLabel=void 0}setLabel(n,t){if(!(this.label===n&&S.equals(this.options,t)))if(this.label=n,this.options=t,typeof n=="string")this.singleLabel||(this.container.innerText="",this.container.classList.remove("multiple"),this.singleLabel=new N.HighlightedLabel(b.append(this.container,b.$("a.label-name",{id:t==null?void 0:t.domId})),this.supportIcons)),this.singleLabel.set(n,t==null?void 0:t.matches,void 0,t==null?void 0:t.labelEscapeNewLines);else{this.container.innerText="",this.container.classList.add("multiple"),this.singleLabel=void 0;const l=(t==null?void 0:t.separator)||"/",h=u(n,l,t==null?void 0:t.matches);for(let m=0;mW.element));this.data=R}}function h(D){return D instanceof p.ElementsDragAndDropData?new l(D):D}class m{constructor(R,W){this.modelProvider=R,this.dnd=W,this.autoExpandDisposable=b.Disposable.None}getDragURI(R){return this.dnd.getDragURI(R.element)}getDragLabel(R,W){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(R.map(x=>x.element),W)}onDragStart(R,W){this.dnd.onDragStart&&this.dnd.onDragStart(h(R),W)}onDragOver(R,W,x,K,Y=!0){const ee=this.dnd.onDragOver(h(R),W&&W.element,x,K),se=this.autoExpandNode!==W;if(se&&(this.autoExpandDisposable.dispose(),this.autoExpandNode=W),typeof W=="undefined")return ee;if(se&&typeof ee!="boolean"&&ee.autoExpand&&(this.autoExpandDisposable=u.disposableTimeout(()=>{const P=this.modelProvider(),V=P.getNodeLocation(W);P.isCollapsed(V)&&P.setCollapsed(V,!1),this.autoExpandNode=void 0},500)),typeof ee=="boolean"||!ee.accept||typeof ee.bubble=="undefined"||ee.feedback){if(!Y){const P=typeof ee=="boolean"?ee:ee.accept,V=typeof ee=="boolean"?void 0:ee.effect;return{accept:P,effect:V,feedback:[x]}}return ee}if(ee.bubble===1){const P=this.modelProvider(),V=P.getNodeLocation(W),U=P.getParentNodeLocation(V),H=P.getNode(U),$=U&&P.getListIndex(U);return this.onDragOver(R,H,$,K,!1)}const ne=this.modelProvider(),le=ne.getNodeLocation(W),X=ne.getListIndex(le),z=ne.getListRenderCount(le);return Object.assign(Object.assign({},ee),{feedback:g.range(X,X+z)})}drop(R,W,x,K){this.autoExpandDisposable.dispose(),this.autoExpandNode=void 0,this.dnd.drop(h(R),W&&W.element,x,K)}onDragEnd(R){this.dnd.onDragEnd&&this.dnd.onDragEnd(R)}}function _(D,R){return R&&Object.assign(Object.assign({},R),{identityProvider:R.identityProvider&&{getId(W){return R.identityProvider.getId(W.element)}},dnd:R.dnd&&new m(D,R.dnd),multipleSelectionController:R.multipleSelectionController&&{isSelectionSingleChangeEvent(W){return R.multipleSelectionController.isSelectionSingleChangeEvent(Object.assign(Object.assign({},W),{element:W.element}))},isSelectionRangeChangeEvent(W){return R.multipleSelectionController.isSelectionRangeChangeEvent(Object.assign(Object.assign({},W),{element:W.element}))}},accessibilityProvider:R.accessibilityProvider&&Object.assign(Object.assign({},R.accessibilityProvider),{getSetSize(W){const x=D(),K=x.getNodeLocation(W),Y=x.getParentNodeLocation(K);return x.getNode(Y).visibleChildrenCount},getPosInSet(W){return W.visibleChildIndex+1},isChecked:R.accessibilityProvider&&R.accessibilityProvider.isChecked?W=>R.accessibilityProvider.isChecked(W.element):void 0,getRole:R.accessibilityProvider&&R.accessibilityProvider.getRole?W=>R.accessibilityProvider.getRole(W.element):()=>"treeitem",getAriaLabel(W){return R.accessibilityProvider.getAriaLabel(W.element)},getWidgetAriaLabel(){return R.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:R.accessibilityProvider&&R.accessibilityProvider.getWidgetRole?()=>R.accessibilityProvider.getWidgetRole():()=>"tree",getAriaLevel:R.accessibilityProvider&&R.accessibilityProvider.getAriaLevel?W=>R.accessibilityProvider.getAriaLevel(W.element):W=>W.depth,getActiveDescendantId:R.accessibilityProvider.getActiveDescendantId&&(W=>R.accessibilityProvider.getActiveDescendantId(W.element))}),keyboardNavigationLabelProvider:R.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},R.keyboardNavigationLabelProvider),{getKeyboardNavigationLabel(W){return R.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(W.element)}}),enableKeyboardNavigation:R.simpleKeyboardNavigation})}class f{constructor(R){this.delegate=R}getHeight(R){return this.delegate.getHeight(R.element)}getTemplateId(R){return this.delegate.getTemplateId(R.element)}hasDynamicHeight(R){return!!this.delegate.hasDynamicHeight&&this.delegate.hasDynamicHeight(R.element)}setDynamicHeight(R,W){this.delegate.setDynamicHeight&&this.delegate.setDynamicHeight(R.element,W)}}e.ComposedTreeDelegate=f;var v;(function(D){D.None="none",D.OnHover="onHover",D.Always="always"})(v=e.RenderIndentGuides||(e.RenderIndentGuides={}));class y{constructor(R,W=[]){this._elements=W,this.onDidChange=w.Event.forEach(R,x=>this._elements=x)}get elements(){return this._elements}}class L{constructor(R,W,x,K,Y={}){this.renderer=R,this.modelProvider=W,this.activeNodes=K,this.renderedElements=new Map,this.renderedNodes=new Map,this.indent=L.DefaultIndent,this.hideTwistiesOfChildlessElements=!1,this.shouldRenderIndentGuides=!1,this.renderedIndentGuides=new n.SetMap,this.activeIndentNodes=new Set,this.indentGuidesDisposable=b.Disposable.None,this.disposables=new b.DisposableStore,this.templateId=R.templateId,this.updateOptions(Y),w.Event.map(x,ee=>ee.node)(this.onDidChangeNodeTwistieState,this,this.disposables),R.onDidChangeTwistieState&&R.onDidChangeTwistieState(this.onDidChangeTwistieState,this,this.disposables)}updateOptions(R={}){if(typeof R.indent!="undefined"&&(this.indent=i.clamp(R.indent,0,40)),typeof R.renderIndentGuides!="undefined"){const W=R.renderIndentGuides!==v.None;if(W!==this.shouldRenderIndentGuides&&(this.shouldRenderIndentGuides=W,this.indentGuidesDisposable.dispose(),W)){const x=new b.DisposableStore;this.activeNodes.onDidChange(this._onDidChangeActiveNodes,this,x),this.indentGuidesDisposable=x,this._onDidChangeActiveNodes(this.activeNodes.elements)}}typeof R.hideTwistiesOfChildlessElements!="undefined"&&(this.hideTwistiesOfChildlessElements=R.hideTwistiesOfChildlessElements)}renderTemplate(R){const W=M.append(R,M.$(".monaco-tl-row")),x=M.append(W,M.$(".monaco-tl-indent")),K=M.append(W,M.$(".monaco-tl-twistie")),Y=M.append(W,M.$(".monaco-tl-contents")),ee=this.renderer.renderTemplate(Y);return{container:R,indent:x,twistie:K,indentGuidesDisposable:b.Disposable.None,templateData:ee}}renderElement(R,W,x,K){typeof K=="number"&&(this.renderedNodes.set(R,{templateData:x,height:K}),this.renderedElements.set(R.element,R));const Y=L.DefaultIndent+(R.depth-1)*this.indent;x.twistie.style.paddingLeft=`${Y}px`,x.indent.style.width=`${Y+this.indent-16}px`,this.renderTwistie(R,x),typeof K=="number"&&this.renderIndentGuides(R,x),this.renderer.renderElement(R,W,x.templateData,K)}disposeElement(R,W,x,K){x.indentGuidesDisposable.dispose(),this.renderer.disposeElement&&this.renderer.disposeElement(R,W,x.templateData,K),typeof K=="number"&&(this.renderedNodes.delete(R),this.renderedElements.delete(R.element))}disposeTemplate(R){this.renderer.disposeTemplate(R.templateData)}onDidChangeTwistieState(R){const W=this.renderedElements.get(R);!W||this.onDidChangeNodeTwistieState(W)}onDidChangeNodeTwistieState(R){const W=this.renderedNodes.get(R);!W||(this.renderTwistie(R,W.templateData),this._onDidChangeActiveNodes(this.activeNodes.elements),this.renderIndentGuides(R,W.templateData))}renderTwistie(R,W){W.twistie.classList.remove(...t.treeItemExpandedIcon.classNamesArray);let x=!1;this.renderer.renderTwistie&&(x=this.renderer.renderTwistie(R.element,W.twistie)),R.collapsible&&(!this.hideTwistiesOfChildlessElements||R.visibleChildrenCount>0)?(x||W.twistie.classList.add(...t.treeItemExpandedIcon.classNamesArray),W.twistie.classList.add("collapsible"),W.twistie.classList.toggle("collapsed",R.collapsed)):W.twistie.classList.remove("collapsible","collapsed"),R.collapsible?W.container.setAttribute("aria-expanded",String(!R.collapsed)):W.container.removeAttribute("aria-expanded")}renderIndentGuides(R,W){if(M.clearNode(W.indent),W.indentGuidesDisposable.dispose(),!!this.shouldRenderIndentGuides){const x=new b.DisposableStore,K=this.modelProvider();let Y=R;for(;;){const ee=K.getNodeLocation(Y),se=K.getParentNodeLocation(ee);if(!se)break;const ne=K.getNode(se),le=M.$(".indent-guide",{style:`width: ${this.indent}px`});this.activeIndentNodes.has(ne)&&le.classList.add("active"),W.indent.childElementCount===0?W.indent.appendChild(le):W.indent.insertBefore(le,W.indent.firstElementChild),this.renderedIndentGuides.add(ne,le),x.add(b.toDisposable(()=>this.renderedIndentGuides.delete(ne,le))),Y=ne}W.indentGuidesDisposable=x}}_onDidChangeActiveNodes(R){if(!!this.shouldRenderIndentGuides){const W=new Set,x=this.modelProvider();R.forEach(K=>{const Y=x.getNodeLocation(K);try{const ee=x.getParentNodeLocation(Y);K.collapsible&&K.children.length>0&&!K.collapsed?W.add(K):ee&&W.add(x.getNode(ee))}catch(ee){}}),this.activeIndentNodes.forEach(K=>{W.has(K)||this.renderedIndentGuides.forEach(K,Y=>Y.classList.remove("active"))}),W.forEach(K=>{this.activeIndentNodes.has(K)||this.renderedIndentGuides.forEach(K,Y=>Y.classList.add("active"))}),this.activeIndentNodes=W}}dispose(){this.renderedNodes.clear(),this.renderedElements.clear(),this.indentGuidesDisposable.dispose(),b.dispose(this.disposables)}}L.DefaultIndent=8;class I{constructor(R,W,x){this.tree=R,this.keyboardNavigationLabelProvider=W,this._filter=x,this._totalCount=0,this._matchCount=0,this._pattern="",this._lowercasePattern="",this.disposables=new b.DisposableStore,R.onWillRefilter(this.reset,this,this.disposables)}get totalCount(){return this._totalCount}get matchCount(){return this._matchCount}set pattern(R){this._pattern=R,this._lowercasePattern=R.toLowerCase()}filter(R,W){if(this._filter){const Y=this._filter.filter(R,W);if(this.tree.options.simpleKeyboardNavigation)return Y;let ee;if(typeof Y=="boolean"?ee=Y?1:0:s.isFilterResult(Y)?ee=s.getVisibleState(Y.visibility):ee=Y,ee===0)return!1}if(this._totalCount++,this.tree.options.simpleKeyboardNavigation||!this._pattern)return this._matchCount++,{data:o.FuzzyScore.Default,visibility:!0};const x=this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(R),K=Array.isArray(x)?x:[x];for(const Y of K){const ee=Y&&Y.toString();if(typeof ee=="undefined")return{data:o.FuzzyScore.Default,visibility:!0};const se=o.fuzzyScore(this._pattern,this._lowercasePattern,0,ee,ee.toLowerCase(),0,!0);if(se)return this._matchCount++,K.length===1?{data:se,visibility:!0}:{data:{label:ee,score:se},visibility:!0}}return this.tree.options.filterOnType?2:{data:o.FuzzyScore.Default,visibility:!0}}reset(){this._totalCount=0,this._matchCount=0}dispose(){b.dispose(this.disposables)}}class k{constructor(R,W,x,K,Y){this.tree=R,this.view=x,this.filter=K,this.keyboardNavigationDelegate=Y,this._enabled=!1,this._pattern="",this._empty=!1,this._onDidChangeEmptyState=new w.Emitter,this.positionClassName="ne",this.automaticKeyboardNavigation=!0,this.triggered=!1,this._onDidChangePattern=new w.Emitter,this.enabledDisposables=new b.DisposableStore,this.disposables=new b.DisposableStore,this.domNode=M.$(`.monaco-list-type-filter.${this.positionClassName}`),this.domNode.draggable=!0,c.domEvent(this.domNode,"dragstart")(this.onDragStart,this,this.disposables),this.messageDomNode=M.append(x.getHTMLElement(),M.$(".monaco-list-type-filter-message")),this.labelDomNode=M.append(this.domNode,M.$("span.label"));const ee=M.append(this.domNode,M.$(".controls"));this._filterOnType=!!R.options.filterOnType,this.filterOnTypeDomNode=M.append(ee,M.$("input.filter")),this.filterOnTypeDomNode.type="checkbox",this.filterOnTypeDomNode.checked=this._filterOnType,this.filterOnTypeDomNode.tabIndex=-1,this.updateFilterOnTypeTitleAndIcon(),c.domEvent(this.filterOnTypeDomNode,"input")(this.onDidChangeFilterOnType,this,this.disposables),this.clearDomNode=M.append(ee,M.$("button.clear"+t.treeFilterClearIcon.cssSelector)),this.clearDomNode.tabIndex=-1,this.clearDomNode.title=a.localize(0,null),this.keyboardNavigationEventFilter=R.options.keyboardNavigationEventFilter,W.onDidSplice(this.onDidSpliceModel,this,this.disposables),this.updateOptions(R.options)}get enabled(){return this._enabled}get pattern(){return this._pattern}get filterOnType(){return this._filterOnType}updateOptions(R){R.simpleKeyboardNavigation?this.disable():this.enable(),typeof R.filterOnType!="undefined"&&(this._filterOnType=!!R.filterOnType,this.filterOnTypeDomNode.checked=this._filterOnType),typeof R.automaticKeyboardNavigation!="undefined"&&(this.automaticKeyboardNavigation=R.automaticKeyboardNavigation),this.tree.refilter(),this.render(),this.automaticKeyboardNavigation||this.onEventOrInput("")}enable(){if(!this._enabled){const R=w.Event.chain(c.domEvent(this.view.getHTMLElement(),"keydown")).filter(x=>!N.isInputElement(x.target)||x.target===this.filterOnTypeDomNode).filter(x=>x.key!=="Dead"&&!/^Media/.test(x.key)).map(x=>new S.StandardKeyboardEvent(x)).filter(this.keyboardNavigationEventFilter||(()=>!0)).filter(()=>this.automaticKeyboardNavigation||this.triggered).filter(x=>this.keyboardNavigationDelegate.mightProducePrintableCharacter(x)&&!(x.keyCode===18||x.keyCode===16||x.keyCode===15||x.keyCode===17)||(this.pattern.length>0||this.triggered)&&(x.keyCode===9||x.keyCode===1)&&!x.altKey&&!x.ctrlKey&&!x.metaKey||x.keyCode===1&&(r.isMacintosh?x.altKey&&!x.metaKey:x.ctrlKey)&&!x.shiftKey).forEach(x=>{x.stopPropagation(),x.preventDefault()}).event,W=c.domEvent(this.clearDomNode,"click");w.Event.chain(w.Event.any(R,W)).event(this.onEventOrInput,this,this.enabledDisposables),this.filter.pattern="",this.tree.refilter(),this.render(),this._enabled=!0,this.triggered=!1}}disable(){!this._enabled||(this.domNode.remove(),this.enabledDisposables.clear(),this.tree.refilter(),this.render(),this._enabled=!1,this.triggered=!1)}onEventOrInput(R){typeof R=="string"?this.onInput(R):R instanceof MouseEvent||R.keyCode===9||R.keyCode===1&&(r.isMacintosh?R.altKey:R.ctrlKey)?this.onInput(""):R.keyCode===1?this.onInput(this.pattern.length===0?"":this.pattern.substr(0,this.pattern.length-1)):this.onInput(this.pattern+R.browserEvent.key)}onInput(R){const W=this.view.getHTMLElement();R&&!this.domNode.parentElement?W.append(this.domNode):!R&&this.domNode.parentElement&&(this.domNode.remove(),this.tree.domFocus()),this._pattern=R,this._onDidChangePattern.fire(R),this.filter.pattern=R,this.tree.refilter(),R&&this.tree.focusNext(0,!0,void 0,K=>!o.FuzzyScore.isDefault(K.filterData));const x=this.tree.getFocus();if(x.length>0){const K=x[0];this.tree.getRelativeTop(K)===null&&this.tree.reveal(K,.5)}this.render(),R||(this.triggered=!1)}onDragStart(){const R=this.view.getHTMLElement(),{left:W}=M.getDomNodePagePosition(R),x=R.clientWidth,K=x/2,Y=this.domNode.clientWidth,ee=new b.DisposableStore;let se=this.positionClassName;const ne=()=>{switch(se){case"nw":this.domNode.style.top="4px",this.domNode.style.left="4px";break;case"ne":this.domNode.style.top="4px",this.domNode.style.left=`${x-Y-6}px`;break}},le=z=>{z.preventDefault();const P=z.clientX-W;z.dataTransfer&&(z.dataTransfer.dropEffect="none"),P{this.positionClassName=se,this.domNode.className=`monaco-list-type-filter ${this.positionClassName}`,this.domNode.style.top="",this.domNode.style.left="",b.dispose(ee)};ne(),this.domNode.classList.remove(se),this.domNode.classList.add("dragging"),ee.add(b.toDisposable(()=>this.domNode.classList.remove("dragging"))),c.domEvent(document,"dragover")(le,null,ee),c.domEvent(this.domNode,"dragend")(X,null,ee),d.StaticDND.CurrentDragAndDropData=new d.DragAndDropData("vscode-ui"),ee.add(b.toDisposable(()=>d.StaticDND.CurrentDragAndDropData=void 0))}onDidSpliceModel(){!this._enabled||this.pattern.length===0||(this.tree.refilter(),this.render())}onDidChangeFilterOnType(){this.tree.updateOptions({filterOnType:this.filterOnTypeDomNode.checked}),this.tree.refilter(),this.tree.domFocus(),this.render(),this.updateFilterOnTypeTitleAndIcon()}updateFilterOnTypeTitleAndIcon(){this.filterOnType?(this.filterOnTypeDomNode.classList.remove(...t.treeFilterOnTypeOffIcon.classNamesArray),this.filterOnTypeDomNode.classList.add(...t.treeFilterOnTypeOnIcon.classNamesArray),this.filterOnTypeDomNode.title=a.localize(1,null)):(this.filterOnTypeDomNode.classList.remove(...t.treeFilterOnTypeOnIcon.classNamesArray),this.filterOnTypeDomNode.classList.add(...t.treeFilterOnTypeOffIcon.classNamesArray),this.filterOnTypeDomNode.title=a.localize(2,null))}render(){const R=this.filter.totalCount>0&&this.filter.matchCount===0;this.pattern&&this.tree.options.filterOnType&&R?(this.messageDomNode.textContent=a.localize(3,null),this._empty=!0):(this.messageDomNode.innerText="",this._empty=!1),this.domNode.classList.toggle("no-matches",R),this.domNode.title=a.localize(4,null,this.filter.matchCount,this.filter.totalCount),this.labelDomNode.textContent=this.pattern.length>16?"\u2026"+this.pattern.substr(this.pattern.length-16):this.pattern,this._onDidChangeEmptyState.fire(this._empty)}shouldAllowFocus(R){return!this.enabled||!this.pattern||this.filterOnType||this.filter.totalCount>0&&this.filter.matchCount<=1?!0:!o.FuzzyScore.isDefault(R.filterData)}dispose(){this._enabled&&(this.domNode.remove(),this.enabledDisposables.dispose(),this._enabled=!1,this.triggered=!1),this._onDidChangePattern.dispose(),b.dispose(this.disposables)}}function E(D){let R=C.TreeMouseEventTarget.Unknown;return M.hasParentWithClass(D.browserEvent.target,"monaco-tl-twistie","monaco-tl-row")?R=C.TreeMouseEventTarget.Twistie:M.hasParentWithClass(D.browserEvent.target,"monaco-tl-contents","monaco-tl-row")&&(R=C.TreeMouseEventTarget.Element),{browserEvent:D.browserEvent,element:D.element?D.element.element:null,target:R}}function T(D,R){R(D),D.children.forEach(W=>T(W,R))}class O{constructor(R){this.identityProvider=R,this.nodes=[],this._onDidChange=new w.Emitter,this.onDidChange=this._onDidChange.event}get nodeSet(){return this._nodeSet||(this._nodeSet=this.createNodeSet()),this._nodeSet}set(R,W){var x;!((x=W)===null||x===void 0?void 0:x.__forceEvent)&&g.equals(this.nodes,R)||this._set(R,!1,W)}_set(R,W,x){if(this.nodes=[...R],this.elements=void 0,this._nodeSet=void 0,!W){const K=this;this._onDidChange.fire({get elements(){return K.get()},browserEvent:x})}}get(){return this.elements||(this.elements=this.nodes.map(R=>R.element)),[...this.elements]}getNodes(){return this.nodes}has(R){return this.nodeSet.has(R)}onDidModelSplice({insertedNodes:R,deletedNodes:W}){if(!this.identityProvider){const ne=this.createNodeSet(),le=X=>ne.delete(X);W.forEach(X=>T(X,le)),this.set([...ne.values()]);return}const x=new Set,K=ne=>x.add(this.identityProvider.getId(ne.element).toString());W.forEach(ne=>T(ne,K));const Y=new Map,ee=ne=>Y.set(this.identityProvider.getId(ne.element).toString(),ne);R.forEach(ne=>T(ne,ee));const se=[];for(const ne of this.nodes){const le=this.identityProvider.getId(ne.element).toString();if(!x.has(le))se.push(ne);else{const z=Y.get(le);z&&se.push(z)}}this._set(se,!0)}createNodeSet(){const R=new Set;for(const W of this.nodes)R.add(W);return R}}class A extends N.MouseController{constructor(R,W){super(R);this.tree=W}onViewPointer(R){if(!(N.isInputElement(R.browserEvent.target)||N.isMonacoEditor(R.browserEvent.target))){const W=R.element;if(!W)return super.onViewPointer(R);if(this.isSelectionRangeChangeEvent(R)||this.isSelectionSingleChangeEvent(R))return super.onViewPointer(R);const x=R.browserEvent.target,K=x.classList.contains("monaco-tl-twistie")||x.classList.contains("monaco-icon-label")&&x.classList.contains("folder-icon")&&R.browserEvent.offsetX<16;let Y=!1;if(typeof this.tree.expandOnlyOnTwistieClick=="function"?Y=this.tree.expandOnlyOnTwistieClick(W.element):Y=!!this.tree.expandOnlyOnTwistieClick,Y&&!K&&R.browserEvent.detail!==2)return super.onViewPointer(R);if(!this.tree.expandOnDoubleClick&&R.browserEvent.detail===2)return super.onViewPointer(R);if(W.collapsible){const ee=this.tree.model,se=ee.getNodeLocation(W),ne=R.browserEvent.altKey;if(this.tree.setFocus([se]),ee.setCollapsed(se,void 0,ne),Y&&K)return}super.onViewPointer(R)}}onDoubleClick(R){R.browserEvent.target.classList.contains("monaco-tl-twistie")||!this.tree.expandOnDoubleClick||super.onDoubleClick(R)}}class B extends N.List{constructor(R,W,x,K,Y,ee,se){super(R,W,x,K,se);this.focusTrait=Y,this.selectionTrait=ee}createMouseController(R){return new A(this,R.tree)}splice(R,W,x=[]){if(super.splice(R,W,x),x.length!==0){const K=[],Y=[];x.forEach((ee,se)=>{this.focusTrait.has(ee)&&K.push(R+se),this.selectionTrait.has(ee)&&Y.push(R+se)}),K.length>0&&super.setFocus(g.distinctES6([...super.getFocus(),...K])),Y.length>0&&super.setSelection(g.distinctES6([...super.getSelection(),...Y]))}}setFocus(R,W,x=!1){super.setFocus(R,W),x||this.focusTrait.set(R.map(K=>this.element(K)),W)}setSelection(R,W,x=!1){super.setSelection(R,W),x||this.selectionTrait.set(R.map(K=>this.element(K)),W)}}class F{constructor(R,W,x,K,Y={}){this._options=Y,this.eventBufferer=new w.EventBufferer,this.disposables=new b.DisposableStore,this._onWillRefilter=new w.Emitter,this.onWillRefilter=this._onWillRefilter.event,this._onDidUpdateOptions=new w.Emitter;const ee=new f(x),se=new w.Relay,ne=new w.Relay,le=new y(ne.event);this.renderers=K.map(P=>new L(P,()=>this.model,se.event,le,Y));for(let P of this.renderers)this.disposables.add(P);let X;Y.keyboardNavigationLabelProvider&&(X=new I(this,Y.keyboardNavigationLabelProvider,Y.filter),Y=Object.assign(Object.assign({},Y),{filter:X}),this.disposables.add(X)),this.focus=new O(Y.identityProvider),this.selection=new O(Y.identityProvider),this.view=new B(R,W,ee,this.renderers,this.focus,this.selection,Object.assign(Object.assign({},_(()=>this.model,Y)),{tree:this})),this.model=this.createModel(R,this.view,Y),se.input=this.model.onDidChangeCollapseState;const z=w.Event.forEach(this.model.onDidSplice,P=>{this.eventBufferer.bufferEvents(()=>{this.focus.onDidModelSplice(P),this.selection.onDidModelSplice(P)})});if(z(()=>null,null,this.disposables),ne.input=w.Event.chain(w.Event.any(z,this.focus.onDidChange,this.selection.onDidChange)).debounce(()=>null,0).map(()=>{const P=new Set;for(const V of this.focus.getNodes())P.add(V);for(const V of this.selection.getNodes())P.add(V);return[...P.values()]}).event,Y.keyboardSupport!==!1){const P=w.Event.chain(this.view.onKeyDown).filter(V=>!N.isInputElement(V.target)).map(V=>new S.StandardKeyboardEvent(V));P.filter(V=>V.keyCode===15).on(this.onLeftArrow,this,this.disposables),P.filter(V=>V.keyCode===17).on(this.onRightArrow,this,this.disposables),P.filter(V=>V.keyCode===10).on(this.onSpace,this,this.disposables)}if(Y.keyboardNavigationLabelProvider){const P=Y.keyboardNavigationDelegate||N.DefaultKeyboardNavigationDelegate;this.typeFilterController=new k(this,this.model,this.view,X,P),this.focusNavigationFilter=V=>this.typeFilterController.shouldAllowFocus(V),this.disposables.add(this.typeFilterController)}this.styleElement=M.createStyleSheet(this.view.getHTMLElement()),this.getHTMLElement().classList.toggle("always",this._options.renderIndentGuides===v.Always)}get onDidChangeFocus(){return this.eventBufferer.wrapEvent(this.focus.onDidChange)}get onDidChangeSelection(){return this.eventBufferer.wrapEvent(this.selection.onDidChange)}get onMouseDblClick(){return w.Event.map(this.view.onMouseDblClick,E)}get onPointer(){return w.Event.map(this.view.onPointer,E)}get onDidFocus(){return this.view.onDidFocus}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get expandOnDoubleClick(){return typeof this._options.expandOnDoubleClick=="undefined"?!0:this._options.expandOnDoubleClick}get expandOnlyOnTwistieClick(){return typeof this._options.expandOnlyOnTwistieClick=="undefined"?!0:this._options.expandOnlyOnTwistieClick}get onDidDispose(){return this.view.onDidDispose}updateOptions(R={}){this._options=Object.assign(Object.assign({},this._options),R);for(const W of this.renderers)W.updateOptions(R);this.view.updateOptions({enableKeyboardNavigation:this._options.simpleKeyboardNavigation,automaticKeyboardNavigation:this._options.automaticKeyboardNavigation,smoothScrolling:this._options.smoothScrolling,horizontalScrolling:this._options.horizontalScrolling}),this.typeFilterController&&this.typeFilterController.updateOptions(this._options),this._onDidUpdateOptions.fire(this._options),this.getHTMLElement().classList.toggle("always",this._options.renderIndentGuides===v.Always)}get options(){return this._options}getHTMLElement(){return this.view.getHTMLElement()}get scrollTop(){return this.view.scrollTop}set scrollTop(R){this.view.scrollTop=R}domFocus(){this.view.domFocus()}layout(R,W){this.view.layout(R,W)}style(R){const W=`.${this.view.domId}`,x=[];R.treeIndentGuidesStroke&&(x.push(`.monaco-list${W}:hover .monaco-tl-indent > .indent-guide, .monaco-list${W}.always .monaco-tl-indent > .indent-guide { border-color: ${R.treeIndentGuidesStroke.transparent(.4)}; }`),x.push(`.monaco-list${W} .monaco-tl-indent > .indent-guide.active { border-color: ${R.treeIndentGuidesStroke}; }`)),this.styleElement.textContent=x.join(` +`),this.view.style(R)}collapse(R,W=!1){return this.model.setCollapsed(R,!0,W)}expand(R,W=!1){return this.model.setCollapsed(R,!1,W)}isCollapsible(R){return this.model.isCollapsible(R)}setCollapsible(R,W){return this.model.setCollapsible(R,W)}isCollapsed(R){return this.model.isCollapsed(R)}refilter(){this._onWillRefilter.fire(void 0),this.model.refilter()}setSelection(R,W){const x=R.map(Y=>this.model.getNode(Y));this.selection.set(x,W);const K=R.map(Y=>this.model.getListIndex(Y)).filter(Y=>Y>-1);this.view.setSelection(K,W,!0)}getSelection(){return this.selection.get()}setFocus(R,W){const x=R.map(Y=>this.model.getNode(Y));this.focus.set(x,W);const K=R.map(Y=>this.model.getListIndex(Y)).filter(Y=>Y>-1);this.view.setFocus(K,W,!0)}focusNext(R=1,W=!1,x,K=this.focusNavigationFilter){this.view.focusNext(R,W,x,K)}getFocus(){return this.focus.get()}reveal(R,W){this.model.expandTo(R);const x=this.model.getListIndex(R);x!==-1&&this.view.reveal(x,W)}getRelativeTop(R){const W=this.model.getListIndex(R);return W===-1?null:this.view.getRelativeTop(W)}onLeftArrow(R){R.preventDefault(),R.stopPropagation();const W=this.view.getFocusedElements();if(W.length!==0){const x=W[0],K=this.model.getNodeLocation(x);if(!this.model.setCollapsed(K,!0)){const ee=this.model.getParentNodeLocation(K);if(!ee)return;const se=this.model.getListIndex(ee);this.view.reveal(se),this.view.setFocus([se])}}}onRightArrow(R){R.preventDefault(),R.stopPropagation();const W=this.view.getFocusedElements();if(W.length!==0){const x=W[0],K=this.model.getNodeLocation(x);if(!this.model.setCollapsed(K,!1)){if(!x.children.some(ne=>ne.visible))return;const[ee]=this.view.getFocus(),se=ee+1;this.view.reveal(se),this.view.setFocus([se])}}}onSpace(R){R.preventDefault(),R.stopPropagation();const W=this.view.getFocusedElements();if(W.length!==0){const x=W[0],K=this.model.getNodeLocation(x),Y=R.browserEvent.altKey;this.model.setCollapsed(K,void 0,Y)}}dispose(){b.dispose(this.disposables),this.view.dispose()}}e.AbstractTree=F}),define(Q[427],J([0,1,176,155]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataTree=void 0;class M extends b.AbstractTree{constructor(S,C,d,g,p,c={}){super(S,C,d,g,c);this.user=S,this.dataSource=p,this.identityProvider=c.identityProvider}createModel(S,C,d){return new N.ObjectTreeModel(S,C,d)}}e.DataTree=M}),define(Q[234],J([0,1,54,176,155,284,99]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleObjectTree=e.ObjectTree=void 0;class C extends N.AbstractTree{constructor(o,s,a,u,r={}){super(o,s,a,u,r)}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}setChildren(o,s=b.Iterable.empty(),a){this.model.setChildren(o,s,a)}rerender(o){if(o===void 0){this.view.rerender();return}this.model.rerender(o)}hasElement(o){return this.model.has(o)}createModel(o,s,a){return new M.ObjectTreeModel(o,s,a)}}e.ObjectTree=C;class d{constructor(o,s){this._compressedTreeNodeProvider=o,this.renderer=s,this.templateId=s.templateId,s.onDidChangeTwistieState&&(this.onDidChangeTwistieState=s.onDidChangeTwistieState)}get compressedTreeNodeProvider(){return this._compressedTreeNodeProvider()}renderTemplate(o){const s=this.renderer.renderTemplate(o);return{compressedTreeNode:void 0,data:s}}renderElement(o,s,a,u){const r=this.compressedTreeNodeProvider.getCompressedTreeNode(o.element);r.element.elements.length===1?(a.compressedTreeNode=void 0,this.renderer.renderElement(o,s,a.data,u)):(a.compressedTreeNode=r,this.renderer.renderCompressedElements(r,s,a.data,u))}disposeElement(o,s,a,u){a.compressedTreeNode?this.renderer.disposeCompressedElements&&this.renderer.disposeCompressedElements(a.compressedTreeNode,s,a.data,u):this.renderer.disposeElement&&this.renderer.disposeElement(o,s,a.data,u)}disposeTemplate(o){this.renderer.disposeTemplate(o.data)}renderTwistie(o,s){return this.renderer.renderTwistie?this.renderer.renderTwistie(o,s):!1}}Me([S.memoize],d.prototype,"compressedTreeNodeProvider",null);function g(c,o){return o&&Object.assign(Object.assign({},o),{keyboardNavigationLabelProvider:o.keyboardNavigationLabelProvider&&{getKeyboardNavigationLabel(s){let a;try{a=c().getCompressedTreeNode(s)}catch(u){return o.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(s)}return a.element.elements.length===1?o.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(s):o.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(a.element.elements)}}})}class p extends C{constructor(o,s,a,u,r={}){const i=()=>this,n=u.map(t=>new d(i,t));super(o,s,a,n,g(i,r))}setChildren(o,s=b.Iterable.empty(),a){this.model.setChildren(o,s,a)}createModel(o,s,a){return new w.CompressibleObjectTreeModel(o,s,a)}updateOptions(o={}){super.updateOptions(o),typeof o.compressionEnabled!="undefined"&&this.model.setCompressionEnabled(o.compressionEnabled)}getCompressedTreeNode(o=null){return this.model.getCompressedTreeNode(o)}}e.CompressibleObjectTree=p}),define(Q[428],J([0,1,176,234,98,2,6,15,54,161,12,154,197]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleAsyncDataTree=e.AsyncDataTree=void 0;function s(T){return Object.assign(Object.assign({},T),{children:[],refreshPromise:void 0,stale:!0,slow:!1,collapsedByDefault:void 0})}function a(T,O){return O.parent?O.parent===T?!0:a(T,O.parent):!1}function u(T,O){return T===O||a(T,O)||a(O,T)}class r{constructor(O){this.node=O}get element(){return this.node.element.element}get children(){return this.node.children.map(O=>new r(O))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}class i{constructor(O,A,B){this.renderer=O,this.nodeMapper=A,this.onDidChangeTwistieState=B,this.renderedNodes=new Map,this.templateId=O.templateId}renderTemplate(O){return{templateData:this.renderer.renderTemplate(O)}}renderElement(O,A,B,F){this.renderer.renderElement(this.nodeMapper.map(O),A,B.templateData,F)}renderTwistie(O,A){return O.slow?(A.classList.add(...o.treeItemLoadingIcon.classNamesArray),!0):(A.classList.remove(...o.treeItemLoadingIcon.classNamesArray),!1)}disposeElement(O,A,B,F){this.renderer.disposeElement&&this.renderer.disposeElement(this.nodeMapper.map(O),A,B.templateData,F)}disposeTemplate(O){this.renderer.disposeTemplate(O.templateData)}dispose(){this.renderedNodes.clear()}}function n(T){return{browserEvent:T.browserEvent,elements:T.elements.map(O=>O.element)}}function t(T){return{browserEvent:T.browserEvent,element:T.element&&T.element.element,target:T.target}}class l extends g.ElementsDragAndDropData{constructor(O){super(O.elements.map(A=>A.element));this.data=O}}function h(T){return T instanceof g.ElementsDragAndDropData?new l(T):T}class m{constructor(O){this.dnd=O}getDragURI(O){return this.dnd.getDragURI(O.element)}getDragLabel(O,A){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(O.map(B=>B.element),A)}onDragStart(O,A){this.dnd.onDragStart&&this.dnd.onDragStart(h(O),A)}onDragOver(O,A,B,F,D=!0){return this.dnd.onDragOver(h(O),A&&A.element,B,F)}drop(O,A,B,F){this.dnd.drop(h(O),A&&A.element,B,F)}onDragEnd(O){this.dnd.onDragEnd&&this.dnd.onDragEnd(O)}}function _(T){return T&&Object.assign(Object.assign({},T),{collapseByDefault:!0,identityProvider:T.identityProvider&&{getId(O){return T.identityProvider.getId(O.element)}},dnd:T.dnd&&new m(T.dnd),multipleSelectionController:T.multipleSelectionController&&{isSelectionSingleChangeEvent(O){return T.multipleSelectionController.isSelectionSingleChangeEvent(Object.assign(Object.assign({},O),{element:O.element}))},isSelectionRangeChangeEvent(O){return T.multipleSelectionController.isSelectionRangeChangeEvent(Object.assign(Object.assign({},O),{element:O.element}))}},accessibilityProvider:T.accessibilityProvider&&Object.assign(Object.assign({},T.accessibilityProvider),{getPosInSet:void 0,getSetSize:void 0,getRole:T.accessibilityProvider.getRole?O=>T.accessibilityProvider.getRole(O.element):()=>"treeitem",isChecked:T.accessibilityProvider.isChecked?O=>{var A;return!!((A=T.accessibilityProvider)===null||A===void 0?void 0:A.isChecked(O.element))}:void 0,getAriaLabel(O){return T.accessibilityProvider.getAriaLabel(O.element)},getWidgetAriaLabel(){return T.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:T.accessibilityProvider.getWidgetRole?()=>T.accessibilityProvider.getWidgetRole():()=>"tree",getAriaLevel:T.accessibilityProvider.getAriaLevel&&(O=>T.accessibilityProvider.getAriaLevel(O.element)),getActiveDescendantId:T.accessibilityProvider.getActiveDescendantId&&(O=>T.accessibilityProvider.getActiveDescendantId(O.element))}),filter:T.filter&&{filter(O,A){return T.filter.filter(O.element,A)}},keyboardNavigationLabelProvider:T.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},T.keyboardNavigationLabelProvider),{getKeyboardNavigationLabel(O){return T.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(O.element)}}),sorter:void 0,expandOnlyOnTwistieClick:typeof T.expandOnlyOnTwistieClick=="undefined"?void 0:typeof T.expandOnlyOnTwistieClick!="function"?T.expandOnlyOnTwistieClick:O=>T.expandOnlyOnTwistieClick(O.element),additionalScrollHeight:T.additionalScrollHeight})}function f(T,O){O(T),T.children.forEach(A=>f(A,O))}class v{constructor(O,A,B,F,D,R={}){this.user=O,this.dataSource=D,this.nodes=new Map,this.subTreeRefreshPromises=new Map,this.refreshPromises=new Map,this._onDidRender=new S.Emitter,this._onDidChangeNodeSlowState=new S.Emitter,this.nodeMapper=new M.WeakMapper(W=>new r(W)),this.disposables=new w.DisposableStore,this.identityProvider=R.identityProvider,this.autoExpandSingleChildren=typeof R.autoExpandSingleChildren=="undefined"?!1:R.autoExpandSingleChildren,this.sorter=R.sorter,this.collapseByDefault=R.collapseByDefault,this.tree=this.createTree(O,A,B,F,R),this.root=s({element:void 0,parent:null,hasChildren:!0}),this.identityProvider&&(this.root=Object.assign(Object.assign({},this.root),{id:null})),this.nodes.set(null,this.root),this.tree.onDidChangeCollapseState(this._onDidChangeCollapseState,this,this.disposables)}get onDidChangeFocus(){return S.Event.map(this.tree.onDidChangeFocus,n)}get onDidChangeSelection(){return S.Event.map(this.tree.onDidChangeSelection,n)}get onMouseDblClick(){return S.Event.map(this.tree.onMouseDblClick,t)}get onPointer(){return S.Event.map(this.tree.onPointer,t)}get onDidFocus(){return this.tree.onDidFocus}get onDidDispose(){return this.tree.onDidDispose}createTree(O,A,B,F,D){const R=new b.ComposedTreeDelegate(B),W=F.map(K=>new i(K,this.nodeMapper,this._onDidChangeNodeSlowState.event)),x=_(D)||{};return new N.ObjectTree(O,A,R,W,x)}updateOptions(O={}){this.tree.updateOptions(O)}getHTMLElement(){return this.tree.getHTMLElement()}get scrollTop(){return this.tree.scrollTop}set scrollTop(O){this.tree.scrollTop=O}domFocus(){this.tree.domFocus()}layout(O,A){this.tree.layout(O,A)}style(O){this.tree.style(O)}getInput(){return this.root.element}setInput(O,A){return Ie(this,void 0,void 0,function*(){this.refreshPromises.forEach(F=>F.cancel()),this.refreshPromises.clear(),this.root.element=O;const B=A&&{viewState:A,focus:[],selection:[]};yield this._updateChildren(O,!0,!1,B),B&&(this.tree.setFocus(B.focus),this.tree.setSelection(B.selection)),A&&typeof A.scrollTop=="number"&&(this.scrollTop=A.scrollTop)})}_updateChildren(O=this.root.element,A=!0,B=!1,F,D){return Ie(this,void 0,void 0,function*(){if(typeof this.root.element=="undefined")throw new M.TreeError(this.user,"Tree input not set");this.root.refreshPromise&&(yield this.root.refreshPromise,yield S.Event.toPromise(this._onDidRender.event));const R=this.getDataNode(O);if(yield this.refreshAndRenderNode(R,A,F,D),B)try{this.tree.rerender(R)}catch(W){}})}rerender(O){if(O===void 0||O===this.root.element){this.tree.rerender();return}const A=this.getDataNode(O);this.tree.rerender(A)}collapse(O,A=!1){const B=this.getDataNode(O);return this.tree.collapse(B===this.root?null:B,A)}expand(O,A=!1){return Ie(this,void 0,void 0,function*(){if(typeof this.root.element=="undefined")throw new M.TreeError(this.user,"Tree input not set");this.root.refreshPromise&&(yield this.root.refreshPromise,yield S.Event.toPromise(this._onDidRender.event));const B=this.getDataNode(O);if(this.tree.hasElement(B)&&!this.tree.isCollapsible(B)||(B.refreshPromise&&(yield this.root.refreshPromise,yield S.Event.toPromise(this._onDidRender.event)),B!==this.root&&!B.refreshPromise&&!this.tree.isCollapsed(B)))return!1;const F=this.tree.expand(B===this.root?null:B,A);return B.refreshPromise&&(yield this.root.refreshPromise,yield S.Event.toPromise(this._onDidRender.event)),F})}setSelection(O,A){const B=O.map(F=>this.getDataNode(F));this.tree.setSelection(B,A)}getSelection(){return this.tree.getSelection().map(A=>A.element)}setFocus(O,A){const B=O.map(F=>this.getDataNode(F));this.tree.setFocus(B,A)}getFocus(){return this.tree.getFocus().map(A=>A.element)}reveal(O,A){this.tree.reveal(this.getDataNode(O),A)}getDataNode(O){const A=this.nodes.get(O===this.root.element?null:O);if(!A)throw new M.TreeError(this.user,`Data tree node not found: ${O}`);return A}refreshAndRenderNode(O,A,B,F){return Ie(this,void 0,void 0,function*(){yield this.refreshNode(O,A,B),this.render(O,B,F)})}refreshNode(O,A,B){return Ie(this,void 0,void 0,function*(){let F;return this.subTreeRefreshPromises.forEach((D,R)=>{!F&&u(R,O)&&(F=D.then(()=>this.refreshNode(O,A,B)))}),F||this.doRefreshSubTree(O,A,B)})}doRefreshSubTree(O,A,B){return Ie(this,void 0,void 0,function*(){let F;O.refreshPromise=new Promise(D=>F=D),this.subTreeRefreshPromises.set(O,O.refreshPromise),O.refreshPromise.finally(()=>{O.refreshPromise=void 0,this.subTreeRefreshPromises.delete(O)});try{const D=yield this.doRefreshNode(O,A,B);O.stale=!1,yield C.Promises.settled(D.map(R=>this.doRefreshSubTree(R,A,B)))}finally{F()}})}doRefreshNode(O,A,B){return Ie(this,void 0,void 0,function*(){O.hasChildren=!!this.dataSource.hasChildren(O.element);let F;if(!O.hasChildren)F=Promise.resolve(d.Iterable.empty());else{const D=C.timeout(800);D.then(()=>{O.slow=!0,this._onDidChangeNodeSlowState.fire(O)},R=>null),F=this.doGetChildren(O).finally(()=>D.cancel())}try{const D=yield F;return this.setChildren(O,D,A,B)}catch(D){if(O!==this.root&&this.tree.hasElement(O)&&this.tree.collapse(O),p.isPromiseCanceledError(D))return[];throw D}finally{O.slow&&(O.slow=!1,this._onDidChangeNodeSlowState.fire(O))}})}doGetChildren(O){let A=this.refreshPromises.get(O);return A||(A=C.createCancelablePromise(()=>Ie(this,void 0,void 0,function*(){const B=yield this.dataSource.getChildren(O.element);return this.processChildren(B)})),this.refreshPromises.set(O,A),A.finally(()=>{this.refreshPromises.delete(O)}))}_onDidChangeCollapseState({node:O,deep:A}){O.element!==null&&!O.collapsed&&O.element.stale&&(A?this.collapse(O.element.element):this.refreshAndRenderNode(O.element,!1).catch(p.onUnexpectedError))}setChildren(O,A,B,F){const D=[...A];if(O.children.length===0&&D.length===0)return[];const R=new Map,W=new Map;for(const Y of O.children)if(R.set(Y.element,Y),this.identityProvider){const ee=this.tree.isCollapsed(Y);W.set(Y.id,{node:Y,collapsed:ee})}const x=[],K=D.map(Y=>{const ee=!!this.dataSource.hasChildren(Y);if(!this.identityProvider){const X=s({element:Y,parent:O,hasChildren:ee});return ee&&this.collapseByDefault&&!this.collapseByDefault(Y)&&(X.collapsedByDefault=!1,x.push(X)),X}const se=this.identityProvider.getId(Y).toString(),ne=W.get(se);if(ne){const X=ne.node;return R.delete(X.element),this.nodes.delete(X.element),this.nodes.set(Y,X),X.element=Y,X.hasChildren=ee,B?ne.collapsed?(X.children.forEach(z=>f(z,P=>this.nodes.delete(P.element))),X.children.splice(0,X.children.length),X.stale=!0):x.push(X):ee&&this.collapseByDefault&&!this.collapseByDefault(Y)&&(X.collapsedByDefault=!1,x.push(X)),X}const le=s({element:Y,parent:O,id:se,hasChildren:ee});return F&&F.viewState.focus&&F.viewState.focus.indexOf(se)>-1&&F.focus.push(le),F&&F.viewState.selection&&F.viewState.selection.indexOf(se)>-1&&F.selection.push(le),F&&F.viewState.expanded&&F.viewState.expanded.indexOf(se)>-1?x.push(le):ee&&this.collapseByDefault&&!this.collapseByDefault(Y)&&(le.collapsedByDefault=!1,x.push(le)),le});for(const Y of R.values())f(Y,ee=>this.nodes.delete(ee.element));for(const Y of K)this.nodes.set(Y.element,Y);return O.children.splice(0,O.children.length,...K),O!==this.root&&this.autoExpandSingleChildren&&K.length===1&&x.length===0&&(K[0].collapsedByDefault=!1,x.push(K[0])),x}render(O,A,B){const F=O.children.map(R=>this.asTreeElement(R,A)),D=B&&Object.assign(Object.assign({},B),{diffIdentityProvider:B.diffIdentityProvider&&{getId(R){return B.diffIdentityProvider.getId(R.element)}}});this.tree.setChildren(O===this.root?null:O,F,D),O!==this.root&&this.tree.setCollapsible(O,O.hasChildren),this._onDidRender.fire()}asTreeElement(O,A){if(O.stale)return{element:O,collapsible:O.hasChildren,collapsed:!0};let B;return A&&A.viewState.expanded&&O.id&&A.viewState.expanded.indexOf(O.id)>-1?B=!1:B=O.collapsedByDefault,O.collapsedByDefault=void 0,{element:O,children:O.hasChildren?d.Iterable.map(O.children,F=>this.asTreeElement(F,A)):[],collapsible:O.hasChildren,collapsed:B}}processChildren(O){return this.sorter&&(O=[...O].sort(this.sorter.compare.bind(this.sorter))),O}dispose(){this.disposables.dispose()}}e.AsyncDataTree=v;class y{constructor(O){this.node=O}get element(){return{elements:this.node.element.elements.map(O=>O.element),incompressible:this.node.element.incompressible}}get children(){return this.node.children.map(O=>new y(O))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}class L{constructor(O,A,B,F){this.renderer=O,this.nodeMapper=A,this.compressibleNodeMapperProvider=B,this.onDidChangeTwistieState=F,this.renderedNodes=new Map,this.disposables=[],this.templateId=O.templateId}renderTemplate(O){return{templateData:this.renderer.renderTemplate(O)}}renderElement(O,A,B,F){this.renderer.renderElement(this.nodeMapper.map(O),A,B.templateData,F)}renderCompressedElements(O,A,B,F){this.renderer.renderCompressedElements(this.compressibleNodeMapperProvider().map(O),A,B.templateData,F)}renderTwistie(O,A){return O.slow?(A.classList.add(...o.treeItemLoadingIcon.classNamesArray),!0):(A.classList.remove(...o.treeItemLoadingIcon.classNamesArray),!1)}disposeElement(O,A,B,F){this.renderer.disposeElement&&this.renderer.disposeElement(this.nodeMapper.map(O),A,B.templateData,F)}disposeCompressedElements(O,A,B,F){this.renderer.disposeCompressedElements&&this.renderer.disposeCompressedElements(this.compressibleNodeMapperProvider().map(O),A,B.templateData,F)}disposeTemplate(O){this.renderer.disposeTemplate(O.templateData)}dispose(){this.renderedNodes.clear(),this.disposables=w.dispose(this.disposables)}}function I(T){const O=T&&_(T);return O&&Object.assign(Object.assign({},O),{keyboardNavigationLabelProvider:O.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},O.keyboardNavigationLabelProvider),{getCompressedNodeKeyboardNavigationLabel(A){return T.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(A.map(B=>B.element))}})})}class k extends v{constructor(O,A,B,F,D,R,W={}){super(O,A,B,D,R,W);this.compressionDelegate=F,this.compressibleNodeMapper=new M.WeakMapper(x=>new y(x)),this.filter=W.filter}createTree(O,A,B,F,D){const R=new b.ComposedTreeDelegate(B),W=F.map(K=>new L(K,this.nodeMapper,()=>this.compressibleNodeMapper,this._onDidChangeNodeSlowState.event)),x=I(D)||{};return new N.CompressibleObjectTree(O,A,R,W,x)}asTreeElement(O,A){return Object.assign({incompressible:this.compressionDelegate.isIncompressible(O.element)},super.asTreeElement(O,A))}updateOptions(O={}){this.tree.updateOptions(O)}render(O,A){if(!this.identityProvider)return super.render(O,A);const B=se=>this.identityProvider.getId(se).toString(),F=se=>{const ne=new Set;for(const le of se){const X=this.tree.getCompressedTreeNode(le===this.root?null:le);if(!!X.element)for(const z of X.element.elements)ne.add(B(z.element))}return ne},D=F(this.tree.getSelection()),R=F(this.tree.getFocus());super.render(O,A);const W=this.getSelection();let x=!1;const K=this.getFocus();let Y=!1;const ee=se=>{const ne=se.element;if(ne)for(let le=0;le{const B=this.filter.filter(A,1),F=E(B);if(F===2)throw new Error("Recursive tree visibility not supported in async data compressed trees");return F===1})),super.processChildren(O)}}e.CompressibleAsyncDataTree=k;function E(T){return typeof T=="boolean"?T?1:0:c.isFilterResult(T)?c.getVisibleState(T.visibility):c.getVisibleState(T)}}),define(Q[429],J([4,5]),function(q,e){return q.create("vs/base/common/actions",e)}),define(Q[48],J([0,1,429,2,6]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EmptySubmenuAction=e.SubmenuAction=e.Separator=e.ActionRunner=e.Action=void 0;class w extends N.Disposable{constructor(c,o="",s="",a=!0,u){super();this._onDidChange=this._register(new M.Emitter),this.onDidChange=this._onDidChange.event,this._enabled=!0,this._checked=!1,this._id=c,this._label=o,this._cssClass=s,this._enabled=a,this._actionCallback=u}get id(){return this._id}get label(){return this._label}set label(c){this._setLabel(c)}_setLabel(c){this._label!==c&&(this._label=c,this._onDidChange.fire({label:c}))}get tooltip(){return this._tooltip||""}set tooltip(c){this._setTooltip(c)}_setTooltip(c){this._tooltip!==c&&(this._tooltip=c,this._onDidChange.fire({tooltip:c}))}get class(){return this._cssClass}set class(c){this._setClass(c)}_setClass(c){this._cssClass!==c&&(this._cssClass=c,this._onDidChange.fire({class:c}))}get enabled(){return this._enabled}set enabled(c){this._setEnabled(c)}_setEnabled(c){this._enabled!==c&&(this._enabled=c,this._onDidChange.fire({enabled:c}))}get checked(){return this._checked}set checked(c){this._setChecked(c)}_setChecked(c){this._checked!==c&&(this._checked=c,this._onDidChange.fire({checked:c}))}run(c,o){return this._actionCallback?this._actionCallback(c):Promise.resolve(!0)}}e.Action=w;class S extends N.Disposable{constructor(){super(...arguments);this._onBeforeRun=this._register(new M.Emitter),this.onBeforeRun=this._onBeforeRun.event,this._onDidRun=this._register(new M.Emitter),this.onDidRun=this._onDidRun.event}run(c,o){return Ie(this,void 0,void 0,function*(){if(!c.enabled)return Promise.resolve(null);this._onBeforeRun.fire({action:c});try{const s=yield this.runAction(c,o);this._onDidRun.fire({action:c,result:s})}catch(s){this._onDidRun.fire({action:c,error:s})}})}runAction(c,o){const s=o?c.run(o):c.run();return Promise.resolve(s)}}e.ActionRunner=S;class C extends w{constructor(c){super(C.ID,c,c?"separator text":"separator");this.checked=!1,this.enabled=!1}}e.Separator=C,C.ID="vs.actions.separator";class d{constructor(c,o,s,a){this.tooltip="",this.enabled=!0,this.checked=!1,this.id=c,this.label=o,this.class=a,this._actions=s}dispose(){}get actions(){return this._actions}run(){return Ie(this,void 0,void 0,function*(){})}}e.SubmenuAction=d;class g extends w{constructor(){super(g.ID,b.localize(0,null),void 0,!1)}}e.EmptySubmenuAction=g,g.ID="vs.actions.empty"}),define(Q[112],J([0,1,17,418,2,48,20,60,149,35,7,203]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionViewItem=e.BaseActionViewItem=void 0;class c extends M.Disposable{constructor(a,u,r={}){super();this.options=r,this._context=a||this,this._action=u,u instanceof w.Action&&this._register(u.onDidChange(i=>{!this.element||this.handleActionChangeEvent(i)}))}handleActionChangeEvent(a){a.enabled!==void 0&&this.updateEnabled(),a.checked!==void 0&&this.updateChecked(),a.class!==void 0&&this.updateClass(),a.label!==void 0&&(this.updateLabel(),this.updateTooltip()),a.tooltip!==void 0&&this.updateTooltip()}get actionRunner(){return this._actionRunner||(this._actionRunner=this._register(new w.ActionRunner)),this._actionRunner}set actionRunner(a){this._actionRunner=a}getAction(){return this._action}isEnabled(){return this._action.enabled}setActionContext(a){this._context=a}render(a){const u=this.element=a;this._register(C.Gesture.addTarget(a));const r=this.options&&this.options.draggable;r&&(a.draggable=!0,g.isFirefox&&this._register(p.addDisposableListener(a,p.EventType.DRAG_START,i=>{var n;return(n=i.dataTransfer)===null||n===void 0?void 0:n.setData(d.DataTransfers.TEXT,this._action.label)}))),this._register(p.addDisposableListener(u,C.EventType.Tap,i=>this.onClick(i))),this._register(p.addDisposableListener(u,p.EventType.MOUSE_DOWN,i=>{r||p.EventHelper.stop(i,!0),this._action.enabled&&i.button===0&&u.classList.add("active")})),b.isMacintosh&&this._register(p.addDisposableListener(u,p.EventType.CONTEXT_MENU,i=>{i.button===0&&i.ctrlKey===!0&&this.onClick(i)})),this._register(p.addDisposableListener(u,p.EventType.CLICK,i=>{p.EventHelper.stop(i,!0),this.options&&this.options.isMenu||b.setImmediate(()=>this.onClick(i))})),this._register(p.addDisposableListener(u,p.EventType.DBLCLICK,i=>{p.EventHelper.stop(i,!0)})),[p.EventType.MOUSE_UP,p.EventType.MOUSE_OUT].forEach(i=>{this._register(p.addDisposableListener(u,i,n=>{p.EventHelper.stop(n),u.classList.remove("active")}))})}onClick(a){var u;p.EventHelper.stop(a,!0);const r=S.isUndefinedOrNull(this._context)?((u=this.options)===null||u===void 0?void 0:u.useEventAsContext)?a:void 0:this._context;this.actionRunner.run(this._action,r)}focus(){this.element&&(this.element.tabIndex=0,this.element.focus(),this.element.classList.add("focused"))}blur(){this.element&&(this.element.blur(),this.element.tabIndex=-1,this.element.classList.remove("focused"))}setFocusable(a){this.element&&(this.element.tabIndex=a?0:-1)}get trapsArrowNavigation(){return!1}updateEnabled(){}updateLabel(){}updateTooltip(){}updateClass(){}updateChecked(){}dispose(){this.element&&(this.element.remove(),this.element=void 0),super.dispose()}}e.BaseActionViewItem=c;class o extends c{constructor(a,u,r={}){super(a,u,r);this.options=r,this.options.icon=r.icon!==void 0?r.icon:!1,this.options.label=r.label!==void 0?r.label:!0,this.cssClass=""}render(a){super.render(a),this.element&&(this.label=p.append(this.element,p.$("a.action-label"))),this.label&&(this._action.id===w.Separator.ID?this.label.setAttribute("role","presentation"):this.options.isMenu?this.label.setAttribute("role","menuitem"):this.label.setAttribute("role","button")),this.options.label&&this.options.keybinding&&this.element&&(p.append(this.element,p.$("span.keybinding")).textContent=this.options.keybinding),this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked()}focus(){this.label&&(this.label.tabIndex=0,this.label.focus())}blur(){this.label&&(this.label.tabIndex=-1)}setFocusable(a){this.label&&(this.label.tabIndex=a?0:-1)}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this.getAction().label)}updateTooltip(){let a=null;this.getAction().tooltip?a=this.getAction().tooltip:!this.options.label&&this.getAction().label&&this.options.icon&&(a=this.getAction().label,this.options.keybinding&&(a=N.localize(0,null,a,this.options.keybinding))),a&&this.label&&(this.label.title=a)}updateClass(){this.cssClass&&this.label&&this.label.classList.remove(...this.cssClass.split(" ")),this.options.icon?(this.cssClass=this.getAction().class,this.label&&(this.label.classList.add("codicon"),this.cssClass&&this.label.classList.add(...this.cssClass.split(" "))),this.updateEnabled()):this.label&&this.label.classList.remove("codicon")}updateEnabled(){this.getAction().enabled?(this.label&&(this.label.removeAttribute("aria-disabled"),this.label.classList.remove("disabled")),this.element&&this.element.classList.remove("disabled")):(this.label&&(this.label.setAttribute("aria-disabled","true"),this.label.classList.add("disabled")),this.element&&this.element.classList.add("disabled"))}updateChecked(){this.label&&(this.getAction().checked?this.label.classList.add("checked"):this.label.classList.remove("checked"))}}e.ActionViewItem=o}),define(Q[83],J([0,1,2,48,7,20,56,6,112,203]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionBar=void 0;class g extends b.Disposable{constructor(c,o={}){var s,a,u,r,i,n;super();this.triggerKeyDown=!1,this.focusable=!0,this._onDidBlur=this._register(new C.Emitter),this.onDidBlur=this._onDidBlur.event,this._onDidCancel=this._register(new C.Emitter({onFirstListenerAdd:()=>this.cancelHasListener=!0})),this.onDidCancel=this._onDidCancel.event,this.cancelHasListener=!1,this._onDidRun=this._register(new C.Emitter),this.onDidRun=this._onDidRun.event,this._onBeforeRun=this._register(new C.Emitter),this.onBeforeRun=this._onBeforeRun.event,this.options=o,this._context=(s=o.context)!==null&&s!==void 0?s:null,this._orientation=(a=this.options.orientation)!==null&&a!==void 0?a:0,this._triggerKeys={keyDown:(r=(u=this.options.triggerKeys)===null||u===void 0?void 0:u.keyDown)!==null&&r!==void 0?r:!1,keys:(n=(i=this.options.triggerKeys)===null||i===void 0?void 0:i.keys)!==null&&n!==void 0?n:[3,10]},this.options.actionRunner?this._actionRunner=this.options.actionRunner:(this._actionRunner=new N.ActionRunner,this._register(this._actionRunner)),this._register(this._actionRunner.onDidRun(h=>this._onDidRun.fire(h))),this._register(this._actionRunner.onBeforeRun(h=>this._onBeforeRun.fire(h))),this._actionIds=[],this.viewItems=[],this.focusedItem=void 0,this.domNode=document.createElement("div"),this.domNode.className="monaco-action-bar",o.animated!==!1&&this.domNode.classList.add("animated");let t,l;switch(this._orientation){case 0:t=[15],l=[17];break;case 1:t=[17],l=[15],this.domNode.className+=" reverse";break;case 2:t=[16],l=[18],this.domNode.className+=" vertical";break;case 3:t=[18],l=[16],this.domNode.className+=" vertical reverse";break}this._register(M.addDisposableListener(this.domNode,M.EventType.KEY_DOWN,h=>{const m=new S.StandardKeyboardEvent(h);let _=!0;const f=typeof this.focusedItem=="number"?this.viewItems[this.focusedItem]:void 0;t&&(m.equals(t[0])||m.equals(t[1]))?_=this.focusPrevious():l&&(m.equals(l[0])||m.equals(l[1]))?_=this.focusNext():m.equals(9)&&this.cancelHasListener?this._onDidCancel.fire():m.equals(2)&&f instanceof d.BaseActionViewItem&&f.trapsArrowNavigation?this.focusNext():this.isTriggerKeyEvent(m)?this._triggerKeys.keyDown?this.doTrigger(m):this.triggerKeyDown=!0:_=!1,_&&(m.preventDefault(),m.stopPropagation())})),this._register(M.addDisposableListener(this.domNode,M.EventType.KEY_UP,h=>{const m=new S.StandardKeyboardEvent(h);this.isTriggerKeyEvent(m)?(!this._triggerKeys.keyDown&&this.triggerKeyDown&&(this.triggerKeyDown=!1,this.doTrigger(m)),m.preventDefault(),m.stopPropagation()):(m.equals(2)||m.equals(1024|2))&&this.updateFocusedItem()})),this.focusTracker=this._register(M.trackFocus(this.domNode)),this._register(this.focusTracker.onDidBlur(()=>{(M.getActiveElement()===this.domNode||!M.isAncestor(M.getActiveElement(),this.domNode))&&(this._onDidBlur.fire(),this.focusedItem=void 0,this.triggerKeyDown=!1)})),this._register(this.focusTracker.onDidFocus(()=>this.updateFocusedItem())),this.actionsList=document.createElement("ul"),this.actionsList.className="actions-container",this.actionsList.setAttribute("role","toolbar"),this.options.ariaLabel&&this.actionsList.setAttribute("aria-label",this.options.ariaLabel),this.domNode.appendChild(this.actionsList),c.appendChild(this.domNode)}isTriggerKeyEvent(c){let o=!1;return this._triggerKeys.keys.forEach(s=>{o=o||c.equals(s)}),o}updateFocusedItem(){for(let c=0;co.setActionContext(c))}get actionRunner(){return this._actionRunner}set actionRunner(c){c&&(this._actionRunner=c,this.viewItems.forEach(o=>o.actionRunner=c))}getContainer(){return this.domNode}push(c,o={}){const s=Array.isArray(c)?c:[c];let a=w.isNumber(o.index)?o.index:null;s.forEach(u=>{const r=document.createElement("li");r.className="action-item",r.setAttribute("role","presentation"),this.options.allowContextMenu||this._register(M.addDisposableListener(r,M.EventType.CONTEXT_MENU,n=>{M.EventHelper.stop(n,!0)}));let i;this.options.actionViewItemProvider&&(i=this.options.actionViewItemProvider(u)),i||(i=new d.ActionViewItem(this.context,u,o)),i.actionRunner=this._actionRunner,i.setActionContext(this.context),i.render(r),this.focusable&&i instanceof d.BaseActionViewItem&&this.viewItems.length===0&&i.setFocusable(!0),a===null||a<0||a>=this.actionsList.children.length?(this.actionsList.appendChild(r),this.viewItems.push(i),this._actionIds.push(u.id)):(this.actionsList.insertBefore(r,this.actionsList.children[a]),this.viewItems.splice(a,0,i),this._actionIds.splice(a,0,u.id),a++)}),typeof this.focusedItem=="number"&&this.focus(this.focusedItem)}clear(){b.dispose(this.viewItems),this.viewItems=[],this._actionIds=[],M.clearNode(this.actionsList)}focus(c){let o=!1,s;if(c===void 0?o=!0:typeof c=="number"?s=c:typeof c=="boolean"&&(o=c),o&&typeof this.focusedItem=="undefined"){const a=this.viewItems.findIndex(u=>u.isEnabled());this.focusedItem=a===-1?void 0:a,this.updateFocus()}else s!==void 0&&(this.focusedItem=s),this.updateFocus()}focusNext(){typeof this.focusedItem=="undefined"&&(this.focusedItem=this.viewItems.length-1);const c=this.focusedItem;let o;do{if(this.options.preventLoopNavigation&&this.focusedItem+1>=this.viewItems.length)return this.focusedItem=c,!1;this.focusedItem=(this.focusedItem+1)%this.viewItems.length,o=this.viewItems[this.focusedItem]}while(this.focusedItem!==c&&this.options.focusOnlyEnabledItems&&!o.isEnabled());return this.updateFocus(),!0}focusPrevious(){typeof this.focusedItem=="undefined"&&(this.focusedItem=0);const c=this.focusedItem;let o;do{if(this.focusedItem=this.focusedItem-1,this.focusedItem<0){if(this.options.preventLoopNavigation)return this.focusedItem=c,!1;this.focusedItem=this.viewItems.length-1}o=this.viewItems[this.focusedItem]}while(this.focusedItem!==c&&this.options.focusOnlyEnabledItems&&!o.isEnabled());return this.updateFocus(!0),!0}updateFocus(c,o){typeof this.focusedItem=="undefined"&&this.actionsList.focus({preventScroll:o});for(let s=0;s(a.textContent=c.label||"",null));for(const a of[M.EventType.CLICK,M.EventType.MOUSE_DOWN,b.EventType.Tap])this._register(M.addDisposableListener(this.element,a,u=>M.EventHelper.stop(u,!0)));for(const a of[M.EventType.MOUSE_DOWN,b.EventType.Tap])this._register(M.addDisposableListener(this._label,a,u=>{u instanceof MouseEvent&&u.detail>1||(this.visible?this.hide():this.show())}));this._register(M.addDisposableListener(this._label,M.EventType.KEY_UP,a=>{const u=new w.StandardKeyboardEvent(a);(u.equals(3)||u.equals(10))&&(M.EventHelper.stop(a,!0),this.visible?this.hide():this.show())}));const s=o(this._label);s&&this._register(s),this._register(b.Gesture.addTarget(this._label))}get element(){return this._element}show(){this.visible||(this.visible=!0,this._onDidChangeVisibility.fire(!0))}hide(){this.visible&&(this.visible=!1,this._onDidChangeVisibility.fire(!1))}dispose(){super.dispose(),this.hide(),this.boxContainer&&(this.boxContainer.remove(),this.boxContainer=void 0),this.contents&&(this.contents.remove(),this.contents=void 0),this._label&&(this._label.remove(),this._label=void 0)}}e.BaseDropdown=C;class d extends C{constructor(p,c){super(p,c);this._actions=[],this._contextMenuProvider=c.contextMenuProvider,this.actions=c.actions||[],this.actionProvider=c.actionProvider,this.menuClassName=c.menuClassName||"",this.menuAsChild=!!c.menuAsChild}set menuOptions(p){this._menuOptions=p}get menuOptions(){return this._menuOptions}get actions(){return this.actionProvider?this.actionProvider.getActions():this._actions}set actions(p){this._actions=p}show(){super.show(),this.element.classList.add("active"),this._contextMenuProvider.showContextMenu({getAnchor:()=>this.element,getActions:()=>this.actions,getActionsContext:()=>this.menuOptions?this.menuOptions.context:null,getActionViewItem:p=>this.menuOptions&&this.menuOptions.actionViewItemProvider?this.menuOptions.actionViewItemProvider(p):void 0,getKeyBinding:p=>this.menuOptions&&this.menuOptions.getKeyBinding?this.menuOptions.getKeyBinding(p):void 0,getMenuClassName:()=>this.menuClassName,onHide:()=>this.onHide(),actionRunner:this.menuOptions?this.menuOptions.actionRunner:void 0,anchorAlignment:this.menuOptions?this.menuOptions.anchorAlignment:0,domForShadowRoot:this.menuAsChild?this.element:void 0})}hide(){super.hide()}onHide(){this.hide(),this.element.classList.remove("active")}}e.DropdownMenu=d}),define(Q[431],J([0,1,7,6,112,430,206]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DropdownMenuActionViewItem=void 0;class S extends M.BaseActionViewItem{constructor(d,g,p,c={}){super(null,d,c);this.options=c,this.actionItem=null,this._onDidChangeVisibility=this._register(new N.Emitter),this.menuActionsOrProvider=g,this.contextMenuProvider=p,this.options.actionRunner&&(this.actionRunner=this.options.actionRunner)}render(d){this.actionItem=d;const g=o=>{this.element=b.append(o,b.$("a.action-label"));let s=[];return typeof this.options.classNames=="string"?s=this.options.classNames.split(/\s+/g).filter(a=>!!a):this.options.classNames&&(s=this.options.classNames),s.find(a=>a==="icon")||s.push("codicon"),this.element.classList.add(...s),this.element.setAttribute("role","button"),this.element.setAttribute("aria-haspopup","true"),this.element.setAttribute("aria-expanded","false"),this.element.title=this._action.label||"",null},p=Array.isArray(this.menuActionsOrProvider),c={contextMenuProvider:this.contextMenuProvider,labelRenderer:g,menuAsChild:this.options.menuAsChild,actions:p?this.menuActionsOrProvider:void 0,actionProvider:p?void 0:this.menuActionsOrProvider};if(this.dropdownMenu=this._register(new w.DropdownMenu(d,c)),this._register(this.dropdownMenu.onDidChangeVisibility(o=>{var s;(s=this.element)===null||s===void 0||s.setAttribute("aria-expanded",`${o}`),this._onDidChangeVisibility.fire(o)})),this.dropdownMenu.menuOptions={actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,getKeyBinding:this.options.keybindingProvider,context:this._context},this.options.anchorAlignmentProvider){const o=this;this.dropdownMenu.menuOptions=Object.assign(Object.assign({},this.dropdownMenu.menuOptions),{get anchorAlignment(){return o.options.anchorAlignmentProvider()}})}this.updateEnabled()}setActionContext(d){super.setActionContext(d),this.dropdownMenu&&(this.dropdownMenu.menuOptions?this.dropdownMenu.menuOptions.context=d:this.dropdownMenu.menuOptions={context:d})}updateEnabled(){var d,g;const p=!this.getAction().enabled;(d=this.actionItem)===null||d===void 0||d.classList.toggle("disabled",p),(g=this.element)===null||g===void 0||g.classList.toggle("disabled",p)}}e.DropdownMenuActionViewItem=S}),define(Q[177],J([0,1,423,7,156,47,83,6,52,29,40,279,61,55,305]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HistoryInputBox=e.InputBox=void 0;const a=N.$,u={inputBackground:g.Color.fromHex("#3C3C3C"),inputForeground:g.Color.fromHex("#CCCCCC"),inputValidationInfoBorder:g.Color.fromHex("#55AAFF"),inputValidationInfoBackground:g.Color.fromHex("#063B49"),inputValidationWarningBorder:g.Color.fromHex("#B89500"),inputValidationWarningBackground:g.Color.fromHex("#352A05"),inputValidationErrorBorder:g.Color.fromHex("#BE1100"),inputValidationErrorBackground:g.Color.fromHex("#5A1D1D")};class r extends d.Widget{constructor(t,l,h){super();this.state="idle",this.maxHeight=Number.POSITIVE_INFINITY,this._onDidChange=this._register(new C.Emitter),this.onDidChange=this._onDidChange.event,this._onDidHeightChange=this._register(new C.Emitter),this.onDidHeightChange=this._onDidHeightChange.event,this.contextViewProvider=l,this.options=h||Object.create(null),p.mixin(this.options,u,!1),this.message=null,this.placeholder=this.options.placeholder||"",this.ariaLabel=this.options.ariaLabel||"",this.inputBackground=this.options.inputBackground,this.inputForeground=this.options.inputForeground,this.inputBorder=this.options.inputBorder,this.inputValidationInfoBorder=this.options.inputValidationInfoBorder,this.inputValidationInfoBackground=this.options.inputValidationInfoBackground,this.inputValidationInfoForeground=this.options.inputValidationInfoForeground,this.inputValidationWarningBorder=this.options.inputValidationWarningBorder,this.inputValidationWarningBackground=this.options.inputValidationWarningBackground,this.inputValidationWarningForeground=this.options.inputValidationWarningForeground,this.inputValidationErrorBorder=this.options.inputValidationErrorBorder,this.inputValidationErrorBackground=this.options.inputValidationErrorBackground,this.inputValidationErrorForeground=this.options.inputValidationErrorForeground,this.options.validationOptions&&(this.validation=this.options.validationOptions.validation),this.element=N.append(t,a(".monaco-inputbox.idle"));let m=this.options.flexibleHeight?"textarea":"input",_=N.append(this.element,a(".ibwrapper"));if(this.input=N.append(_,a(m+".input.empty")),this.input.setAttribute("autocorrect","off"),this.input.setAttribute("autocapitalize","off"),this.input.setAttribute("spellcheck","false"),this.onfocus(this.input,()=>this.element.classList.add("synthetic-focus")),this.onblur(this.input,()=>this.element.classList.remove("synthetic-focus")),this.options.flexibleHeight){this.maxHeight=typeof this.options.flexibleMaxHeight=="number"?this.options.flexibleMaxHeight:Number.POSITIVE_INFINITY,this.mirror=N.append(_,a("div.mirror")),this.mirror.innerText="\xA0",this.scrollableElement=new o.ScrollableElement(this.element,{vertical:1}),this.options.flexibleWidth&&(this.input.setAttribute("wrap","off"),this.mirror.style.whiteSpace="pre",this.mirror.style.wordWrap="initial"),N.append(t,this.scrollableElement.getDomNode()),this._register(this.scrollableElement),this._register(this.scrollableElement.onScroll(v=>this.input.scrollTop=v.scrollTop));const f=C.Event.filter(s.domEvent(document,"selectionchange"),()=>{const v=document.getSelection();return(v==null?void 0:v.anchorNode)===_});this._register(f(this.updateScrollDimensions,this)),this._register(this.onDidHeightChange(this.updateScrollDimensions,this))}else this.input.type=this.options.type||"text",this.input.setAttribute("wrap","off");this.ariaLabel&&this.input.setAttribute("aria-label",this.ariaLabel),this.placeholder&&this.setPlaceHolder(this.placeholder),this.oninput(this.input,()=>this.onValueChange()),this.onblur(this.input,()=>this.onBlur()),this.onfocus(this.input,()=>this.onFocus()),this.ignoreGesture(this.input),setTimeout(()=>this.updateMirror(),0),this.options.actions&&(this.actionbar=this._register(new S.ActionBar(this.element)),this.actionbar.push(this.options.actions,{icon:!0,label:!1})),this.applyStyles()}onBlur(){this._hideMessage()}onFocus(){this._showMessage()}setPlaceHolder(t){this.placeholder=t,this.input.setAttribute("placeholder",t),this.input.title=t}setAriaLabel(t){this.ariaLabel=t,t?this.input.setAttribute("aria-label",this.ariaLabel):this.input.removeAttribute("aria-label")}getAriaLabel(){return this.ariaLabel}get inputElement(){return this.input}get value(){return this.input.value}set value(t){this.input.value!==t&&(this.input.value=t,this.onValueChange())}get height(){return typeof this.cachedHeight=="number"?this.cachedHeight:N.getTotalHeight(this.element)}focus(){this.input.focus()}blur(){this.input.blur()}hasFocus(){return document.activeElement===this.input}select(t=null){this.input.select(),t&&(this.input.setSelectionRange(t.start,t.end),t.end===this.input.value.length&&(this.input.scrollLeft=this.input.scrollWidth))}isSelectionAtEnd(){return this.input.selectionEnd===this.input.value.length&&this.input.selectionStart===this.input.selectionEnd}enable(){this.input.removeAttribute("disabled")}disable(){this.blur(),this.input.disabled=!0,this._hideMessage()}get width(){return N.getTotalWidth(this.input)}set width(t){if(this.options.flexibleHeight&&this.options.flexibleWidth){let l=0;if(this.mirror){const h=parseFloat(this.mirror.style.paddingLeft||"")||0,m=parseFloat(this.mirror.style.paddingRight||"")||0;l=h+m}this.input.style.width=t-l+"px"}else this.input.style.width=t+"px";this.mirror&&(this.mirror.style.width=t+"px")}set paddingRight(t){this.options.flexibleHeight&&this.options.flexibleWidth?this.input.style.width=`calc(100% - ${t}px)`:this.input.style.paddingRight=t+"px",this.mirror&&(this.mirror.style.paddingRight=t+"px")}updateScrollDimensions(){if(!(typeof this.cachedContentHeight!="number"||typeof this.cachedHeight!="number"||!this.scrollableElement)){const t=this.cachedContentHeight,l=this.cachedHeight,h=this.input.scrollTop;this.scrollableElement.setScrollDimensions({scrollHeight:t,height:l}),this.scrollableElement.setScrollPosition({scrollTop:h})}}showMessage(t,l){this.message=t,this.element.classList.remove("idle"),this.element.classList.remove("info"),this.element.classList.remove("warning"),this.element.classList.remove("error"),this.element.classList.add(this.classForType(t.type));const h=this.stylesForType(this.message.type);this.element.style.border=h.border?`1px solid ${h.border}`:"",(this.hasFocus()||l)&&this._showMessage()}hideMessage(){this.message=null,this.element.classList.remove("info"),this.element.classList.remove("warning"),this.element.classList.remove("error"),this.element.classList.add("idle"),this._hideMessage(),this.applyStyles()}validate(){let t=null;return this.validation&&(t=this.validation(this.value),t?(this.inputElement.setAttribute("aria-invalid","true"),this.showMessage(t)):this.inputElement.hasAttribute("aria-invalid")&&(this.inputElement.removeAttribute("aria-invalid"),this.hideMessage())),t==null?void 0:t.type}stylesForType(t){switch(t){case 1:return{border:this.inputValidationInfoBorder,background:this.inputValidationInfoBackground,foreground:this.inputValidationInfoForeground};case 2:return{border:this.inputValidationWarningBorder,background:this.inputValidationWarningBackground,foreground:this.inputValidationWarningForeground};default:return{border:this.inputValidationErrorBorder,background:this.inputValidationErrorBackground,foreground:this.inputValidationErrorForeground}}}classForType(t){switch(t){case 1:return"info";case 2:return"warning";default:return"error"}}_showMessage(){if(!(!this.contextViewProvider||!this.message)){let t,l=()=>t.style.width=N.getTotalWidth(this.element)+"px";this.contextViewProvider.showContextView({getAnchor:()=>this.element,anchorAlignment:1,render:m=>{if(!this.message)return null;t=N.append(m,a(".monaco-inputbox-container")),l();const _={inline:!0,className:"monaco-inputbox-message"},f=this.message.formatContent?M.renderFormattedText(this.message.content,_):M.renderText(this.message.content,_);f.classList.add(this.classForType(this.message.type));const v=this.stylesForType(this.message.type);return f.style.backgroundColor=v.background?v.background.toString():"",f.style.color=v.foreground?v.foreground.toString():"",f.style.border=v.border?`1px solid ${v.border}`:"",N.append(t,f),null},onHide:()=>{this.state="closed"},layout:l});let h;this.message.type===3?h=b.localize(0,null,this.message.content):this.message.type===2?h=b.localize(1,null,this.message.content):h=b.localize(2,null,this.message.content),w.alert(h),this.state="open"}}_hideMessage(){!this.contextViewProvider||(this.state==="open"&&this.contextViewProvider.hideContextView(),this.state="idle")}onValueChange(){this._onDidChange.fire(this.value),this.validate(),this.updateMirror(),this.input.classList.toggle("empty",!this.value),this.state==="open"&&this.contextViewProvider&&this.contextViewProvider.layout()}updateMirror(){if(!!this.mirror){const t=this.value,h=t.charCodeAt(t.length-1)===10?" ":"";t+h?this.mirror.textContent=t+h:this.mirror.innerText="\xA0",this.layout()}}style(t){this.inputBackground=t.inputBackground,this.inputForeground=t.inputForeground,this.inputBorder=t.inputBorder,this.inputValidationInfoBackground=t.inputValidationInfoBackground,this.inputValidationInfoForeground=t.inputValidationInfoForeground,this.inputValidationInfoBorder=t.inputValidationInfoBorder,this.inputValidationWarningBackground=t.inputValidationWarningBackground,this.inputValidationWarningForeground=t.inputValidationWarningForeground,this.inputValidationWarningBorder=t.inputValidationWarningBorder,this.inputValidationErrorBackground=t.inputValidationErrorBackground,this.inputValidationErrorForeground=t.inputValidationErrorForeground,this.inputValidationErrorBorder=t.inputValidationErrorBorder,this.applyStyles()}applyStyles(){const t=this.inputBackground?this.inputBackground.toString():"",l=this.inputForeground?this.inputForeground.toString():"",h=this.inputBorder?this.inputBorder.toString():"";this.element.style.backgroundColor=t,this.element.style.color=l,this.input.style.backgroundColor="inherit",this.input.style.color=l,this.element.style.borderWidth=h?"1px":"",this.element.style.borderStyle=h?"solid":"",this.element.style.borderColor=h}layout(){if(!!this.mirror){const t=this.cachedContentHeight;this.cachedContentHeight=N.getTotalHeight(this.mirror),t!==this.cachedContentHeight&&(this.cachedHeight=Math.min(this.cachedContentHeight,this.maxHeight),this.input.style.height=this.cachedHeight+"px",this._onDidHeightChange.fire(this.cachedContentHeight))}}insertAtCursor(t){const l=this.inputElement,h=l.selectionStart,m=l.selectionEnd,_=l.value;h!==null&&m!==null&&(this.value=_.substr(0,h)+t+_.substr(m),l.setSelectionRange(h+1,h+1),this.layout())}dispose(){this._hideMessage(),this.message=null,this.actionbar&&this.actionbar.dispose(),super.dispose()}}e.InputBox=r;class i extends r{constructor(t,l,h){super(t,l,h);this.history=new c.HistoryNavigator(h.history,100)}addToHistory(){this.value&&this.value!==this.getCurrentValue()&&this.history.add(this.value)}showNextValue(){this.history.has(this.value)||this.addToHistory();let t=this.getNextValue();t&&(t=t===this.value?this.getNextValue():t),t&&(this.value=t,w.status(this.value))}showPreviousValue(){this.history.has(this.value)||this.addToHistory();let t=this.getPreviousValue();t&&(t=t===this.value?this.getPreviousValue():t),t&&(this.value=t,w.status(this.value))}getCurrentValue(){let t=this.history.current();return t||(t=this.history.last(),this.history.next()),t}getPreviousValue(){return this.history.previous()||this.history.first()}getNextValue(){return this.history.next()||this.history.last()}}e.HistoryInputBox=i}),define(Q[432],J([0,1,419,7,177,52,6,233,207]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindInput=void 0;const d=b.localize(0,null);class g extends w.Widget{constructor(c,o,s,a){super();this._showOptionButtons=s,this.fixFocusOnOptionClickEnabled=!0,this._onDidOptionChange=this._register(new S.Emitter),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new S.Emitter),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new S.Emitter),this.onMouseDown=this._onMouseDown.event,this._onInput=this._register(new S.Emitter),this._onKeyUp=this._register(new S.Emitter),this._onCaseSensitiveKeyDown=this._register(new S.Emitter),this.onCaseSensitiveKeyDown=this._onCaseSensitiveKeyDown.event,this._onRegexKeyDown=this._register(new S.Emitter),this.onRegexKeyDown=this._onRegexKeyDown.event,this._lastHighlightFindOptions=0,this.contextViewProvider=o,this.placeholder=a.placeholder||"",this.validation=a.validation,this.label=a.label||d,this.inputActiveOptionBorder=a.inputActiveOptionBorder,this.inputActiveOptionForeground=a.inputActiveOptionForeground,this.inputActiveOptionBackground=a.inputActiveOptionBackground,this.inputBackground=a.inputBackground,this.inputForeground=a.inputForeground,this.inputBorder=a.inputBorder,this.inputValidationInfoBorder=a.inputValidationInfoBorder,this.inputValidationInfoBackground=a.inputValidationInfoBackground,this.inputValidationInfoForeground=a.inputValidationInfoForeground,this.inputValidationWarningBorder=a.inputValidationWarningBorder,this.inputValidationWarningBackground=a.inputValidationWarningBackground,this.inputValidationWarningForeground=a.inputValidationWarningForeground,this.inputValidationErrorBorder=a.inputValidationErrorBorder,this.inputValidationErrorBackground=a.inputValidationErrorBackground,this.inputValidationErrorForeground=a.inputValidationErrorForeground;const u=a.appendCaseSensitiveLabel||"",r=a.appendWholeWordsLabel||"",i=a.appendRegexLabel||"",n=a.history||[],t=!!a.flexibleHeight,l=!!a.flexibleWidth,h=a.flexibleMaxHeight;this.domNode=document.createElement("div"),this.domNode.classList.add("monaco-findInput"),this.inputBox=this._register(new M.HistoryInputBox(this.domNode,this.contextViewProvider,{placeholder:this.placeholder||"",ariaLabel:this.label||"",validationOptions:{validation:this.validation},inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder,history:n,flexibleHeight:t,flexibleWidth:l,flexibleMaxHeight:h})),this.regex=this._register(new C.RegexCheckbox({appendTitle:i,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.regex.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.regex.onKeyDown(f=>{this._onRegexKeyDown.fire(f)})),this.wholeWords=this._register(new C.WholeWordsCheckbox({appendTitle:r,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.wholeWords.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this.caseSensitive=this._register(new C.CaseSensitiveCheckbox({appendTitle:u,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.caseSensitive.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.caseSensitive.onKeyDown(f=>{this._onCaseSensitiveKeyDown.fire(f)})),this._showOptionButtons&&(this.inputBox.paddingRight=this.caseSensitive.width()+this.wholeWords.width()+this.regex.width());let m=[this.caseSensitive.domNode,this.wholeWords.domNode,this.regex.domNode];this.onkeydown(this.domNode,f=>{if(f.equals(15)||f.equals(17)||f.equals(9)){let v=m.indexOf(document.activeElement);if(v>=0){let y=-1;f.equals(17)?y=(v+1)%m.length:f.equals(15)&&(v===0?y=m.length-1:y=v-1),f.equals(9)?(m[v].blur(),this.inputBox.focus()):y>=0&&m[y].focus(),N.EventHelper.stop(f,!0)}}});let _=document.createElement("div");_.className="controls",_.style.display=this._showOptionButtons?"block":"none",_.appendChild(this.caseSensitive.domNode),_.appendChild(this.wholeWords.domNode),_.appendChild(this.regex.domNode),this.domNode.appendChild(_),c&&c.appendChild(this.domNode),this.onkeydown(this.inputBox.inputElement,f=>this._onKeyDown.fire(f)),this.onkeyup(this.inputBox.inputElement,f=>this._onKeyUp.fire(f)),this.oninput(this.inputBox.inputElement,f=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,f=>this._onMouseDown.fire(f))}enable(){this.domNode.classList.remove("disabled"),this.inputBox.enable(),this.regex.enable(),this.wholeWords.enable(),this.caseSensitive.enable()}disable(){this.domNode.classList.add("disabled"),this.inputBox.disable(),this.regex.disable(),this.wholeWords.disable(),this.caseSensitive.disable()}setFocusInputOnOptionClick(c){this.fixFocusOnOptionClickEnabled=c}setEnabled(c){c?this.enable():this.disable()}getValue(){return this.inputBox.value}setValue(c){this.inputBox.value!==c&&(this.inputBox.value=c)}style(c){this.inputActiveOptionBorder=c.inputActiveOptionBorder,this.inputActiveOptionForeground=c.inputActiveOptionForeground,this.inputActiveOptionBackground=c.inputActiveOptionBackground,this.inputBackground=c.inputBackground,this.inputForeground=c.inputForeground,this.inputBorder=c.inputBorder,this.inputValidationInfoBackground=c.inputValidationInfoBackground,this.inputValidationInfoForeground=c.inputValidationInfoForeground,this.inputValidationInfoBorder=c.inputValidationInfoBorder,this.inputValidationWarningBackground=c.inputValidationWarningBackground,this.inputValidationWarningForeground=c.inputValidationWarningForeground,this.inputValidationWarningBorder=c.inputValidationWarningBorder,this.inputValidationErrorBackground=c.inputValidationErrorBackground,this.inputValidationErrorForeground=c.inputValidationErrorForeground,this.inputValidationErrorBorder=c.inputValidationErrorBorder,this.applyStyles()}applyStyles(){if(this.domNode){const c={inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground};this.regex.style(c),this.wholeWords.style(c),this.caseSensitive.style(c);const o={inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder};this.inputBox.style(o)}}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getCaseSensitive(){return this.caseSensitive.checked}setCaseSensitive(c){this.caseSensitive.checked=c}getWholeWords(){return this.wholeWords.checked}setWholeWords(c){this.wholeWords.checked=c}getRegex(){return this.regex.checked}setRegex(c){this.regex.checked=c,this.validate()}focusOnCaseSensitive(){this.caseSensitive.focus()}highlightFindOptions(){this.domNode.classList.remove("highlight-"+this._lastHighlightFindOptions),this._lastHighlightFindOptions=1-this._lastHighlightFindOptions,this.domNode.classList.add("highlight-"+this._lastHighlightFindOptions)}validate(){this.inputBox.validate()}clearMessage(){this.inputBox.hideMessage()}}e.FindInput=g}),define(Q[433],J([0,1,421,7,177,52,6,160,27,207]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceInput=e.PreserveCaseCheckbox=void 0;const g=b.localize(0,null),p=b.localize(1,null);class c extends C.Checkbox{constructor(a){super({icon:d.Codicon.preserveCase,title:p+a.appendTitle,isChecked:a.isChecked,inputActiveOptionBorder:a.inputActiveOptionBorder,inputActiveOptionForeground:a.inputActiveOptionForeground,inputActiveOptionBackground:a.inputActiveOptionBackground})}}e.PreserveCaseCheckbox=c;class o extends w.Widget{constructor(a,u,r,i){super();this._showOptionButtons=r,this.fixFocusOnOptionClickEnabled=!0,this.cachedOptionsWidth=0,this._onDidOptionChange=this._register(new S.Emitter),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new S.Emitter),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new S.Emitter),this._onInput=this._register(new S.Emitter),this._onKeyUp=this._register(new S.Emitter),this._onPreserveCaseKeyDown=this._register(new S.Emitter),this.onPreserveCaseKeyDown=this._onPreserveCaseKeyDown.event,this.contextViewProvider=u,this.placeholder=i.placeholder||"",this.validation=i.validation,this.label=i.label||g,this.inputActiveOptionBorder=i.inputActiveOptionBorder,this.inputActiveOptionForeground=i.inputActiveOptionForeground,this.inputActiveOptionBackground=i.inputActiveOptionBackground,this.inputBackground=i.inputBackground,this.inputForeground=i.inputForeground,this.inputBorder=i.inputBorder,this.inputValidationInfoBorder=i.inputValidationInfoBorder,this.inputValidationInfoBackground=i.inputValidationInfoBackground,this.inputValidationInfoForeground=i.inputValidationInfoForeground,this.inputValidationWarningBorder=i.inputValidationWarningBorder,this.inputValidationWarningBackground=i.inputValidationWarningBackground,this.inputValidationWarningForeground=i.inputValidationWarningForeground,this.inputValidationErrorBorder=i.inputValidationErrorBorder,this.inputValidationErrorBackground=i.inputValidationErrorBackground,this.inputValidationErrorForeground=i.inputValidationErrorForeground;const n=i.appendPreserveCaseLabel||"",t=i.history||[],l=!!i.flexibleHeight,h=!!i.flexibleWidth,m=i.flexibleMaxHeight;this.domNode=document.createElement("div"),this.domNode.classList.add("monaco-findInput"),this.inputBox=this._register(new M.HistoryInputBox(this.domNode,this.contextViewProvider,{ariaLabel:this.label||"",placeholder:this.placeholder||"",validationOptions:{validation:this.validation},inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder,history:t,flexibleHeight:l,flexibleWidth:h,flexibleMaxHeight:m})),this.preserveCase=this._register(new c({appendTitle:n,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.preserveCase.onChange(v=>{this._onDidOptionChange.fire(v),!v&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.preserveCase.onKeyDown(v=>{this._onPreserveCaseKeyDown.fire(v)})),this._showOptionButtons?this.cachedOptionsWidth=this.preserveCase.width():this.cachedOptionsWidth=0;let _=[this.preserveCase.domNode];this.onkeydown(this.domNode,v=>{if(v.equals(15)||v.equals(17)||v.equals(9)){let y=_.indexOf(document.activeElement);if(y>=0){let L=-1;v.equals(17)?L=(y+1)%_.length:v.equals(15)&&(y===0?L=_.length-1:L=y-1),v.equals(9)?(_[y].blur(),this.inputBox.focus()):L>=0&&_[L].focus(),N.EventHelper.stop(v,!0)}}});let f=document.createElement("div");f.className="controls",f.style.display=this._showOptionButtons?"block":"none",f.appendChild(this.preserveCase.domNode),this.domNode.appendChild(f),a&&a.appendChild(this.domNode),this.onkeydown(this.inputBox.inputElement,v=>this._onKeyDown.fire(v)),this.onkeyup(this.inputBox.inputElement,v=>this._onKeyUp.fire(v)),this.oninput(this.inputBox.inputElement,v=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,v=>this._onMouseDown.fire(v))}enable(){this.domNode.classList.remove("disabled"),this.inputBox.enable(),this.preserveCase.enable()}disable(){this.domNode.classList.add("disabled"),this.inputBox.disable(),this.preserveCase.disable()}setEnabled(a){a?this.enable():this.disable()}style(a){this.inputActiveOptionBorder=a.inputActiveOptionBorder,this.inputActiveOptionForeground=a.inputActiveOptionForeground,this.inputActiveOptionBackground=a.inputActiveOptionBackground,this.inputBackground=a.inputBackground,this.inputForeground=a.inputForeground,this.inputBorder=a.inputBorder,this.inputValidationInfoBackground=a.inputValidationInfoBackground,this.inputValidationInfoForeground=a.inputValidationInfoForeground,this.inputValidationInfoBorder=a.inputValidationInfoBorder,this.inputValidationWarningBackground=a.inputValidationWarningBackground,this.inputValidationWarningForeground=a.inputValidationWarningForeground,this.inputValidationWarningBorder=a.inputValidationWarningBorder,this.inputValidationErrorBackground=a.inputValidationErrorBackground,this.inputValidationErrorForeground=a.inputValidationErrorForeground,this.inputValidationErrorBorder=a.inputValidationErrorBorder,this.applyStyles()}applyStyles(){if(this.domNode){const a={inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground};this.preserveCase.style(a);const u={inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder};this.inputBox.style(u)}}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getPreserveCase(){return this.preserveCase.checked}setPreserveCase(a){this.preserveCase.checked=a}focusOnPreserve(){this.preserveCase.focus()}validate(){this.inputBox&&this.inputBox.validate()}set width(a){this.inputBox.paddingRight=this.cachedOptionsWidth,this.inputBox.width=a,this.domNode.style.width=a+"px"}dispose(){super.dispose()}}e.ReplaceInput=o}),define(Q[434],J([0,1,425,8,48,83,7,56,15,2,61,204,17,27,112,123,35,50,102]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.cleanMnemonic=e.Menu=e.Direction=e.MENU_ESCAPED_MNEMONIC_REGEX=e.MENU_MNEMONIC_REGEX=void 0,e.MENU_MNEMONIC_REGEX=/\(&([^\s&])\)|(^|[^&])&([^\s&])/,e.MENU_ESCAPED_MNEMONIC_REGEX=/(&)?(&)([^\s&])/g;const t=s.registerCodicon("menu-selection",s.Codicon.check),l=s.registerCodicon("menu-submenu",s.Codicon.chevronRight);var h;(function(I){I[I.Right=0]="Right",I[I.Left=1]="Left"})(h=e.Direction||(e.Direction={}));class m extends w.ActionBar{constructor(k,E,T={}){k.classList.add("monaco-menu-container"),k.setAttribute("role","presentation");const O=document.createElement("div");O.classList.add("monaco-menu"),O.setAttribute("role","presentation"),super(O,{orientation:2,actionViewItemProvider:F=>this.doGetActionViewItem(F,T,A),context:T.context,actionRunner:T.actionRunner,ariaLabel:T.ariaLabel,focusOnlyEnabledItems:!0,triggerKeys:{keys:[3,...o.isMacintosh||o.isLinux?[10]:[]],keyDown:!0}}),this.menuElement=O,this.actionsList.setAttribute("role","menu"),this.actionsList.tabIndex=0,this.menuDisposables=this._register(new g.DisposableStore),this.initializeStyleSheet(k),S.addDisposableListener(O,S.EventType.KEY_DOWN,F=>{new C.StandardKeyboardEvent(F).equals(2)&&F.preventDefault()}),T.enableMnemonics&&this.menuDisposables.add(S.addDisposableListener(O,S.EventType.KEY_DOWN,F=>{const D=F.key.toLocaleLowerCase();if(this.mnemonics.has(D)){S.EventHelper.stop(F,!0);const R=this.mnemonics.get(D);if(R.length===1&&(R[0]instanceof f&&R[0].container&&this.focusItemByElement(R[0].container),R[0].onClick(F)),R.length>1){const W=R.shift();W&&W.container&&(this.focusItemByElement(W.container),R.push(W)),this.mnemonics.set(D,R)}}})),o.isLinux&&this._register(S.addDisposableListener(O,S.EventType.KEY_DOWN,F=>{const D=new C.StandardKeyboardEvent(F);D.equals(14)||D.equals(11)?(this.focusedItem=this.viewItems.length-1,this.focusNext(),S.EventHelper.stop(F,!0)):(D.equals(13)||D.equals(12))&&(this.focusedItem=0,this.focusPrevious(),S.EventHelper.stop(F,!0))})),this._register(S.addDisposableListener(this.domNode,S.EventType.MOUSE_OUT,F=>{let D=F.relatedTarget;S.isAncestor(D,this.domNode)||(this.focusedItem=void 0,this.updateFocus(),F.stopPropagation())})),this._register(S.addDisposableListener(this.actionsList,S.EventType.MOUSE_OVER,F=>{let D=F.target;if(!(!D||!S.isAncestor(D,this.actionsList)||D===this.actionsList)){for(;D.parentElement!==this.actionsList&&D.parentElement!==null;)D=D.parentElement;if(D.classList.contains("action-item")){const R=this.focusedItem;this.setFocusedItem(D),R!==this.focusedItem&&this.updateFocus()}}}));let A={parent:this};this.mnemonics=new Map,this.scrollableElement=this._register(new p.DomScrollableElement(O,{alwaysConsumeMouseWheel:!0,horizontal:2,vertical:3,verticalScrollbarSize:7,handleMouseWheel:!0,useShadows:!0}));const B=this.scrollableElement.getDomNode();B.style.position="",this._register(S.addDisposableListener(B,S.EventType.MOUSE_UP,F=>{F.preventDefault()})),O.style.maxHeight=`${Math.max(10,window.innerHeight-k.getBoundingClientRect().top-35)}px`,E=E.filter(F=>{var D;return((D=T.submenuIds)===null||D===void 0?void 0:D.has(F.id))?(console.warn(`Found submenu cycle: ${F.id}`),!1):!0}),this.push(E,{icon:!0,label:!0,isMenu:!0}),k.appendChild(this.scrollableElement.getDomNode()),this.scrollableElement.scanDomNode(),this.viewItems.filter(F=>!(F instanceof v)).forEach((F,D,R)=>{F.updatePositionInSet(D+1,R.length)})}initializeStyleSheet(k){S.isInShadowDOM(k)?(this.styleSheet=S.createStyleSheet(k),this.styleSheet.textContent=L):(m.globalStyleSheet||(m.globalStyleSheet=S.createStyleSheet(),m.globalStyleSheet.textContent=L),this.styleSheet=m.globalStyleSheet)}style(k){const E=this.getContainer(),T=k.foregroundColor?`${k.foregroundColor}`:"",O=k.backgroundColor?`${k.backgroundColor}`:"",A=k.borderColor?`1px solid ${k.borderColor}`:"",B=k.shadowColor?`0 2px 4px ${k.shadowColor}`:"";E.style.border=A,this.domNode.style.color=T,this.domNode.style.backgroundColor=O,E.style.boxShadow=B,this.viewItems&&this.viewItems.forEach(F=>{(F instanceof _||F instanceof v)&&F.style(k)})}getContainer(){return this.scrollableElement.getDomNode()}get onScroll(){return this.scrollableElement.onScroll}focusItemByElement(k){const E=this.focusedItem;this.setFocusedItem(k),E!==this.focusedItem&&this.updateFocus()}setFocusedItem(k){for(let E=0;E{!this.element||(this._register(S.addDisposableListener(this.element,S.EventType.MOUSE_UP,O=>{if(S.EventHelper.stop(O,!0),r.isFirefox){if(new i.StandardMouseEvent(O).rightButton)return;this.onClick(O)}else setTimeout(()=>{this.onClick(O)},0)})),this._register(S.addDisposableListener(this.element,S.EventType.CONTEXT_MENU,O=>{S.EventHelper.stop(O,!0)})))},100),this._register(this.runOnceToEnableMouseUp)}render(k){super.render(k),!!this.element&&(this.container=k,this.item=S.append(this.element,S.$("a.action-menu-item")),this._action.id===M.Separator.ID?this.item.setAttribute("role","presentation"):(this.item.setAttribute("role","menuitem"),this.mnemonic&&this.item.setAttribute("aria-keyshortcuts",`${this.mnemonic}`)),this.check=S.append(this.item,S.$("span.menu-item-check"+t.cssSelector)),this.check.setAttribute("role","none"),this.label=S.append(this.item,S.$("span.action-label")),this.options.label&&this.options.keybinding&&(S.append(this.item,S.$("span.keybinding")).textContent=this.options.keybinding),this.runOnceToEnableMouseUp.schedule(),this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked())}blur(){super.blur(),this.applyStyle()}focus(){super.focus(),this.item&&this.item.focus(),this.applyStyle()}updatePositionInSet(k,E){this.item&&(this.item.setAttribute("aria-posinset",`${k}`),this.item.setAttribute("aria-setsize",`${E}`))}updateLabel(){if(!!this.label&&this.options.label){S.clearNode(this.label);let k=n.stripIcons(this.getAction().label);if(k){const E=y(k);this.options.enableMnemonics||(k=E),this.label.setAttribute("aria-label",E.replace(/&&/g,"&"));const T=e.MENU_MNEMONIC_REGEX.exec(k);if(T){k=N.escape(k),e.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let O=e.MENU_ESCAPED_MNEMONIC_REGEX.exec(k);for(;O&&O[1];)O=e.MENU_ESCAPED_MNEMONIC_REGEX.exec(k);const A=B=>B.replace(/&&/g,"&");O?this.label.append(N.ltrim(A(k.substr(0,O.index))," "),S.$("u",{"aria-hidden":"true"},O[3]),N.rtrim(A(k.substr(O.index+O[0].length))," ")):this.label.innerText=A(k).trim(),this.item&&this.item.setAttribute("aria-keyshortcuts",(T[1]?T[1]:T[3]).toLocaleLowerCase())}else this.label.innerText=k.replace(/&&/g,"&").trim()}}}updateTooltip(){let k=null;this.getAction().tooltip?k=this.getAction().tooltip:!this.options.label&&this.getAction().label&&this.options.icon&&(k=this.getAction().label,this.options.keybinding&&(k=b.localize(0,null,k,this.options.keybinding))),k&&this.item&&(this.item.title=k)}updateClass(){this.cssClass&&this.item&&this.item.classList.remove(...this.cssClass.split(" ")),this.options.icon&&this.label?(this.cssClass=this.getAction().class||"",this.label.classList.add("icon"),this.cssClass&&this.label.classList.add(...this.cssClass.split(" ")),this.updateEnabled()):this.label&&this.label.classList.remove("icon")}updateEnabled(){this.getAction().enabled?(this.element&&(this.element.classList.remove("disabled"),this.element.removeAttribute("aria-disabled")),this.item&&(this.item.classList.remove("disabled"),this.item.removeAttribute("aria-disabled"),this.item.tabIndex=0)):(this.element&&(this.element.classList.add("disabled"),this.element.setAttribute("aria-disabled","true")),this.item&&(this.item.classList.add("disabled"),this.item.setAttribute("aria-disabled","true")))}updateChecked(){!this.item||(this.getAction().checked?(this.item.classList.add("checked"),this.item.setAttribute("role","menuitemcheckbox"),this.item.setAttribute("aria-checked","true")):(this.item.classList.remove("checked"),this.item.setAttribute("role","menuitem"),this.item.setAttribute("aria-checked","false")))}getMnemonic(){return this.mnemonic}applyStyle(){if(!!this.menuStyle){const k=this.element&&this.element.classList.contains("focused"),E=k&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor,T=k&&this.menuStyle.selectionBackgroundColor?this.menuStyle.selectionBackgroundColor:void 0,O=k&&this.menuStyle.selectionBorderColor?`thin solid ${this.menuStyle.selectionBorderColor}`:"";this.item&&(this.item.style.color=E?E.toString():"",this.item.style.backgroundColor=T?T.toString():""),this.check&&(this.check.style.color=E?E.toString():""),this.container&&(this.container.style.border=O)}}style(k){this.menuStyle=k,this.applyStyle()}}class f extends _{constructor(k,E,T,O){super(k,k,O);this.submenuActions=E,this.parentData=T,this.submenuOptions=O,this.mysubmenu=null,this.submenuDisposables=this._register(new g.DisposableStore),this.mouseOver=!1,this.expandDirection=O&&O.expandDirection!==void 0?O.expandDirection:h.Right,this.showScheduler=new d.RunOnceScheduler(()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))},250),this.hideScheduler=new d.RunOnceScheduler(()=>{this.element&&!S.isAncestor(S.getActiveElement(),this.element)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))},750)}render(k){super.render(k),!!this.element&&(this.item&&(this.item.classList.add("monaco-submenu-item"),this.item.tabIndex=0,this.item.setAttribute("aria-haspopup","true"),this.updateAriaExpanded("false"),this.submenuIndicator=S.append(this.item,S.$("span.submenu-indicator"+l.cssSelector)),this.submenuIndicator.setAttribute("aria-hidden","true")),this._register(S.addDisposableListener(this.element,S.EventType.KEY_UP,E=>{let T=new C.StandardKeyboardEvent(E);(T.equals(17)||T.equals(3))&&(S.EventHelper.stop(E,!0),this.createSubmenu(!0))})),this._register(S.addDisposableListener(this.element,S.EventType.KEY_DOWN,E=>{let T=new C.StandardKeyboardEvent(E);S.getActiveElement()===this.item&&(T.equals(17)||T.equals(3))&&S.EventHelper.stop(E,!0)})),this._register(S.addDisposableListener(this.element,S.EventType.MOUSE_OVER,E=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),this._register(S.addDisposableListener(this.element,S.EventType.MOUSE_LEAVE,E=>{this.mouseOver=!1})),this._register(S.addDisposableListener(this.element,S.EventType.FOCUS_OUT,E=>{this.element&&!S.isAncestor(S.getActiveElement(),this.element)&&this.hideScheduler.schedule()})),this._register(this.parentData.parent.onScroll(()=>{this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!1)})))}updateEnabled(){}onClick(k){S.EventHelper.stop(k,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!0)}cleanupExistingSubmenu(k){if(this.parentData.submenu&&(k||this.parentData.submenu!==this.mysubmenu)){try{this.parentData.submenu.dispose()}catch(E){}this.parentData.submenu=void 0,this.updateAriaExpanded("false"),this.submenuContainer&&(this.submenuDisposables.clear(),this.submenuContainer=void 0)}}calculateSubmenuMenuLayout(k,E,T,O){const A={top:0,left:0};return A.left=c.layout(k.width,E.width,{position:O===h.Right?0:1,offset:T.left,size:T.width}),A.left>=T.left&&A.left{new C.StandardKeyboardEvent(R).equals(15)&&(S.EventHelper.stop(R,!0),this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0))})),this.submenuDisposables.add(S.addDisposableListener(this.submenuContainer,S.EventType.KEY_DOWN,R=>{new C.StandardKeyboardEvent(R).equals(15)&&S.EventHelper.stop(R,!0)})),this.submenuDisposables.add(this.parentData.submenu.onDidCancel(()=>{this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0)})),this.parentData.submenu.focus(k),this.mysubmenu=this.parentData.submenu}}updateAriaExpanded(k){var E;this.item&&((E=this.item)===null||E===void 0||E.setAttribute("aria-expanded",k))}applyStyle(){if(super.applyStyle(),!!this.menuStyle){const E=this.element&&this.element.classList.contains("focused")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;this.submenuIndicator&&(this.submenuIndicator.style.color=E?`${E}`:""),this.parentData.submenu&&this.parentData.submenu.style(this.menuStyle)}}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuContainer=void 0)}}class v extends a.ActionViewItem{style(k){this.label&&(this.label.style.borderBottomColor=k.separatorColor?`${k.separatorColor}`:"")}}function y(I){const k=e.MENU_MNEMONIC_REGEX,E=k.exec(I);if(!E)return I;const T=!E[1];return I.replace(k,T?"$2$3":"").trim()}e.cleanMnemonic=y;let L=` +.monaco-menu { + font-size: 13px; + +} + +${u.formatRule(t)} +${u.formatRule(l)} + +.monaco-menu .monaco-action-bar { + text-align: right; + overflow: hidden; + white-space: nowrap; +} + +.monaco-menu .monaco-action-bar .actions-container { + display: flex; + margin: 0 auto; + padding: 0; + width: 100%; + justify-content: flex-end; +} + +.monaco-menu .monaco-action-bar.vertical .actions-container { + display: inline-block; +} + +.monaco-menu .monaco-action-bar.reverse .actions-container { + flex-direction: row-reverse; +} + +.monaco-menu .monaco-action-bar .action-item { + cursor: pointer; + display: inline-block; + transition: transform 50ms ease; + position: relative; /* DO NOT REMOVE - this is the key to preventing the ghosting icon bug in Chrome 42 */ +} + +.monaco-menu .monaco-action-bar .action-item.disabled { + cursor: default; +} + +.monaco-menu .monaco-action-bar.animated .action-item.active { + transform: scale(1.272019649, 1.272019649); /* 1.272019649 = \u221A\u03C6 */ +} + +.monaco-menu .monaco-action-bar .action-item .icon, +.monaco-menu .monaco-action-bar .action-item .codicon { + display: inline-block; +} + +.monaco-menu .monaco-action-bar .action-item .codicon { + display: flex; + align-items: center; +} + +.monaco-menu .monaco-action-bar .action-label { + font-size: 11px; + margin-right: 4px; +} + +.monaco-menu .monaco-action-bar .action-item.disabled .action-label, +.monaco-menu .monaco-action-bar .action-item.disabled .action-label:hover { + opacity: 0.4; +} + +/* Vertical actions */ + +.monaco-menu .monaco-action-bar.vertical { + text-align: left; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + display: block; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + display: block; + border-bottom: 1px solid #bbb; + padding-top: 1px; + margin-left: .8em; + margin-right: .8em; +} + +.monaco-menu .secondary-actions .monaco-action-bar .action-label { + margin-left: 6px; +} + +/* Action Items */ +.monaco-menu .monaco-action-bar .action-item.select-container { + overflow: hidden; /* somehow the dropdown overflows its container, we prevent it here to not push */ + flex: 1; + max-width: 170px; + min-width: 60px; + display: flex; + align-items: center; + justify-content: center; + margin-right: 10px; +} + +.monaco-menu .monaco-action-bar.vertical { + margin-left: 0; + overflow: visible; +} + +.monaco-menu .monaco-action-bar.vertical .actions-container { + display: block; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + padding: 0; + transform: none; + display: flex; +} + +.monaco-menu .monaco-action-bar.vertical .action-item.active { + transform: none; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item { + flex: 1 1 auto; + display: flex; + height: 2em; + align-items: center; + position: relative; +} + +.monaco-menu .monaco-action-bar.vertical .action-label { + flex: 1 1 auto; + text-decoration: none; + padding: 0 1em; + background: none; + font-size: 12px; + line-height: 1; +} + +.monaco-menu .monaco-action-bar.vertical .keybinding, +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + display: inline-block; + flex: 2 1 auto; + padding: 0 1em; + text-align: right; + font-size: 12px; + line-height: 1; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + height: 100%; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon { + font-size: 16px !important; + display: flex; + align-items: center; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon::before { + margin-left: auto; + margin-right: -20px; +} + +.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding, +.monaco-menu .monaco-action-bar.vertical .action-item.disabled .submenu-indicator { + opacity: 0.4; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator) { + display: inline-block; + box-sizing: border-box; + margin: 0; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + position: static; + overflow: visible; +} + +.monaco-menu .monaco-action-bar.vertical .action-item .monaco-submenu { + position: absolute; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + padding: 0.5em 0 0 0; + margin-bottom: 0.5em; + width: 100%; + height: 0px !important; + margin-left: .8em !important; + margin-right: .8em !important; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator.text { + padding: 0.7em 1em 0.1em 1em; + font-weight: bold; + opacity: 1; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:hover { + color: inherit; +} + +.monaco-menu .monaco-action-bar.vertical .menu-item-check { + position: absolute; + visibility: hidden; + width: 1em; + height: 100%; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item.checked .menu-item-check { + visibility: visible; + display: flex; + align-items: center; + justify-content: center; +} + +/* Context Menu */ + +.context-view.monaco-menu-container { + outline: 0; + border: none; + animation: fadeIn 0.083s linear; + -webkit-app-region: no-drag; +} + +.context-view.monaco-menu-container :focus, +.context-view.monaco-menu-container .monaco-action-bar.vertical:focus, +.context-view.monaco-menu-container .monaco-action-bar.vertical :focus { + outline: 0; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + border: thin solid transparent; /* prevents jumping behaviour on hover or focus */ +} + + +/* High Contrast Theming */ +:host-context(.hc-black) .context-view.monaco-menu-container { + box-shadow: none; +} + +:host-context(.hc-black) .monaco-menu .monaco-action-bar.vertical .action-item.focused { + background: none; +} + +/* Vertical Action Bar Styles */ + +.monaco-menu .monaco-action-bar.vertical { + padding: .5em 0; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item { + height: 1.8em; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator), +.monaco-menu .monaco-action-bar.vertical .keybinding { + font-size: inherit; + padding: 0 2em; +} + +.monaco-menu .monaco-action-bar.vertical .menu-item-check { + font-size: inherit; + width: 2em; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + font-size: inherit; + padding: 0.2em 0 0 0; + margin-bottom: 0.2em; +} + +:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .action-label.separator { + margin-left: 0; + margin-right: 0; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + font-size: 60%; + padding: 0 1.8em; +} + +:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .submenu-indicator { + height: 100%; + mask-size: 10px 10px; + -webkit-mask-size: 10px 10px; +} + +.monaco-menu .action-item { + cursor: default; +} + +/* Arrows */ +.monaco-scrollable-element > .scrollbar > .scra { + cursor: pointer; + font-size: 11px !important; +} + +.monaco-scrollable-element > .visible { + opacity: 1; + + /* Background rule added for IE9 - to allow clicks on dom node */ + background:rgba(0,0,0,0); + + transition: opacity 100ms linear; +} +.monaco-scrollable-element > .invisible { + opacity: 0; + pointer-events: none; +} +.monaco-scrollable-element > .invisible.fade { + transition: opacity 800ms linear; +} + +/* Scrollable Content Inset Shadow */ +.monaco-scrollable-element > .shadow { + position: absolute; + display: none; +} +.monaco-scrollable-element > .shadow.top { + display: block; + top: 0; + left: 3px; + height: 3px; + width: 100%; + box-shadow: #DDD 0 6px 6px -6px inset; +} +.monaco-scrollable-element > .shadow.left { + display: block; + top: 3px; + left: 0; + height: 100%; + width: 3px; + box-shadow: #DDD 6px 0 6px -6px inset; +} +.monaco-scrollable-element > .shadow.top-left-corner { + display: block; + top: 0; + left: 0; + height: 3px; + width: 3px; +} +.monaco-scrollable-element > .shadow.top.left { + box-shadow: #DDD 6px 6px 6px -6px inset; +} + +/* ---------- Default Style ---------- */ + +:host-context(.vs) .monaco-scrollable-element > .scrollbar > .slider { + background: rgba(100, 100, 100, .4); +} +:host-context(.vs-dark) .monaco-scrollable-element > .scrollbar > .slider { + background: rgba(121, 121, 121, .4); +} +:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider { + background: rgba(111, 195, 223, .6); +} + +.monaco-scrollable-element > .scrollbar > .slider:hover { + background: rgba(100, 100, 100, .7); +} +:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider:hover { + background: rgba(111, 195, 223, .8); +} + +.monaco-scrollable-element > .scrollbar > .slider.active { + background: rgba(0, 0, 0, .6); +} +:host-context(.vs-dark) .monaco-scrollable-element > .scrollbar > .slider.active { + background: rgba(191, 191, 191, .4); +} +:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider.active { + background: rgba(111, 195, 223, 1); +} + +:host-context(.vs-dark) .monaco-scrollable-element .shadow.top { + box-shadow: none; +} + +:host-context(.vs-dark) .monaco-scrollable-element .shadow.left { + box-shadow: #000 6px 0 6px -6px inset; +} + +:host-context(.vs-dark) .monaco-scrollable-element .shadow.top.left { + box-shadow: #000 6px 6px 6px -6px inset; +} + +:host-context(.hc-black) .monaco-scrollable-element .shadow.top { + box-shadow: none; +} + +:host-context(.hc-black) .monaco-scrollable-element .shadow.left { + box-shadow: none; +} + +:host-context(.hc-black) .monaco-scrollable-element .shadow.top.left { + box-shadow: none; +} +`}),define(Q[435],J([0,1,7,177,2,56,82,50,125]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputBox=void 0;const d=b.$;class g extends M.Disposable{constructor(c){super();this.parent=c,this.onKeyDown=o=>b.addDisposableListener(this.inputBox.inputElement,b.EventType.KEY_DOWN,s=>{o(new w.StandardKeyboardEvent(s))}),this.onMouseDown=o=>b.addDisposableListener(this.inputBox.inputElement,b.EventType.MOUSE_DOWN,s=>{o(new C.StandardMouseEvent(s))}),this.onDidChange=o=>this.inputBox.onDidChange(o),this.container=b.append(this.parent,d(".quick-input-box")),this.inputBox=this._register(new N.InputBox(this.container,void 0))}get value(){return this.inputBox.value}set value(c){this.inputBox.value=c}select(c=null){this.inputBox.select(c)}isSelectionAtEnd(){return this.inputBox.isSelectionAtEnd()}get placeholder(){return this.inputBox.inputElement.getAttribute("placeholder")||""}set placeholder(c){this.inputBox.setPlaceHolder(c)}get ariaLabel(){return this.inputBox.getAriaLabel()}set ariaLabel(c){this.inputBox.setAriaLabel(c)}get password(){return this.inputBox.inputElement.type==="password"}set password(c){this.inputBox.inputElement.type=c?"password":"text"}setAttribute(c,o){this.inputBox.inputElement.setAttribute(c,o)}removeAttribute(c){this.inputBox.inputElement.removeAttribute(c)}showDecoration(c){c===S.default.Ignore?this.inputBox.hideMessage():this.inputBox.showMessage({type:c===S.default.Info?1:c===S.default.Warning?2:3,content:""})}stylesForType(c){return this.inputBox.stylesForType(c===S.default.Info?1:c===S.default.Warning?2:3)}setFocus(){this.inputBox.focus()}layout(){this.inputBox.layout()}style(c){this.inputBox.style(c)}}e.QuickInputBox=g}),define(Q[436],J([4,5]),function(q,e){return q.create("vs/base/common/errorMessage",e)}),define(Q[437],J([0,1,436,20,19]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toErrorMessage=void 0;function w(g,p){return p&&(g.stack||g.stacktrace)?b.localize(0,null,C(g),S(g.stack)||S(g.stacktrace)):C(g)}function S(g){return Array.isArray(g)?g.join(` +`):g}function C(g){return typeof g.code=="string"&&typeof g.errno=="number"&&typeof g.syscall=="string"?b.localize(1,null,g.message):g.message||b.localize(2,null)}function d(g=null,p=!1){if(!g)return b.localize(3,null);if(Array.isArray(g)){const c=M.coalesce(g),o=d(c[0],p);return c.length>1?b.localize(4,null,o,c.length):o}if(N.isString(g))return g;if(g.detail){const c=g.detail;if(c.error)return w(c.error,p);if(c.exception)return w(c.exception,p)}return g.stack?w(g,p):g.message?g.message:b.localize(5,null)}e.toErrorMessage=d}),define(Q[438],J([4,5]),function(q,e){return q.create("vs/base/common/keybindingLabels",e)}),define(Q[235],J([0,1,438]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AriaLabelProvider=e.UILabelProvider=e.ModifierLabelProvider=void 0;class N{constructor(S,C,d=C){this.modifierLabels=[null],this.modifierLabels[2]=S,this.modifierLabels[1]=C,this.modifierLabels[3]=d}toLabel(S,C,d){if(C.length===0)return null;const g=[];for(let p=0,c=C.length;p{k.checkbox.offsetParent||D.preventDefault()})),k.checkbox=b.append(E,t("input.quick-input-list-checkbox")),k.checkbox.type="checkbox",k.toDisposeTemplate.push(b.addStandardDisposableListener(k.checkbox,b.EventType.CHANGE,D=>{k.element.checked=k.checkbox.checked}));const T=b.append(E,t(".quick-input-list-rows")),O=b.append(T,t(".quick-input-list-row")),A=b.append(T,t(".quick-input-list-row"));k.label=new d.IconLabel(O,{supportHighlights:!0,supportDescriptionHighlights:!0,supportIcons:!0});const B=b.append(O,t(".quick-input-list-entry-keybinding"));k.keybinding=new i.KeybindingLabel(B,o.OS);const F=b.append(A,t(".quick-input-list-label-meta"));return k.detail=new g.HighlightedLabel(F,!0),k.separator=b.append(k.entry,t(".quick-input-list-separator")),k.actionBar=new s.ActionBar(k.entry),k.actionBar.domNode.classList.add("quick-input-list-entry-action-bar"),k.toDisposeTemplate.push(k.actionBar),k}renderElement(I,k,E){E.toDisposeElement=N.dispose(E.toDisposeElement),E.element=I,E.checkbox.checked=I.checked,E.toDisposeElement.push(I.onChecked(D=>E.checkbox.checked=D));const{labelHighlights:T,descriptionHighlights:O,detailHighlights:A}=I,B=Object.create(null);B.matches=T||[],B.descriptionTitle=I.saneDescription,B.descriptionMatches=O||[],B.extraClasses=I.item.iconClasses,B.italic=I.item.italic,B.strikethrough=I.item.strikethrough,E.label.setLabel(I.saneLabel,I.saneDescription,B),E.keybinding.set(I.item.keybinding),E.detail.set(I.saneDetail,A),I.separator&&I.separator.label?(E.separator.textContent=I.separator.label,E.separator.style.display=""):E.separator.style.display="none",E.entry.classList.toggle("quick-input-list-separator-border",!!I.separator),E.actionBar.clear();const F=I.item.buttons;F&&F.length?(E.actionBar.push(F.map((D,R)=>{let W=D.iconClass||(D.iconPath?u.getIconClass(D.iconPath):void 0);D.alwaysVisible&&(W=W?`${W} always-visible`:"always-visible");const x=new a.Action(`id-${R}`,"",W,!0,()=>Ie(this,void 0,void 0,function*(){I.fireButtonTriggered({button:D,item:I.item})}));return x.tooltip=D.tooltip||"",x}),{icon:!0,label:!1}),E.entry.classList.add("has-actions")):E.entry.classList.remove("has-actions")}disposeElement(I,k,E){E.toDisposeElement=N.dispose(E.toDisposeElement)}disposeTemplate(I){I.toDisposeElement=N.dispose(I.toDisposeElement),I.toDisposeTemplate=N.dispose(I.toDisposeTemplate)}}h.ID="listelement";class m{getHeight(I){return I.saneDetail?44:22}getTemplateId(I){return h.ID}}var _;(function(L){L[L.First=1]="First",L[L.Second=2]="Second",L[L.Last=3]="Last",L[L.Next=4]="Next",L[L.Previous=5]="Previous",L[L.NextPage=6]="NextPage",L[L.PreviousPage=7]="PreviousPage"})(_=e.QuickInputListFocus||(e.QuickInputListFocus={}));class f{constructor(I,k,E){this.parent=I,this.inputElements=[],this.elements=[],this.elementsToIndexes=new Map,this.matchOnDescription=!1,this.matchOnDetail=!1,this.matchOnLabel=!0,this.matchOnMeta=!0,this.sortByLabel=!0,this._onChangedAllVisibleChecked=new S.Emitter,this.onChangedAllVisibleChecked=this._onChangedAllVisibleChecked.event,this._onChangedCheckedCount=new S.Emitter,this.onChangedCheckedCount=this._onChangedCheckedCount.event,this._onChangedVisibleCount=new S.Emitter,this.onChangedVisibleCount=this._onChangedVisibleCount.event,this._onChangedCheckedElements=new S.Emitter,this.onChangedCheckedElements=this._onChangedCheckedElements.event,this._onButtonTriggered=new S.Emitter,this.onButtonTriggered=this._onButtonTriggered.event,this._onKeyDown=new S.Emitter,this.onKeyDown=this._onKeyDown.event,this._onLeave=new S.Emitter,this.onLeave=this._onLeave.event,this._fireCheckedEvents=!0,this.elementDisposables=[],this.disposables=[],this.id=k,this.container=b.append(this.parent,t(".quick-input-list"));const T=new m,O=new y;this.list=E.createList("QuickInput",this.container,T,[new h],{identityProvider:{getId:A=>A.saneLabel},setRowLineHeight:!1,multipleSelectionSupport:!1,horizontalScrolling:!1,accessibilityProvider:O}),this.list.getHTMLElement().id=k,this.disposables.push(this.list),this.disposables.push(this.list.onKeyDown(A=>{const B=new C.StandardKeyboardEvent(A);switch(B.keyCode){case 10:this.toggleCheckbox();break;case 31:(o.isMacintosh?A.metaKey:A.ctrlKey)&&this.list.setFocus(c.range(this.list.length));break;case 16:const F=this.list.getFocus();F.length===1&&F[0]===0&&this._onLeave.fire();break;case 18:const D=this.list.getFocus();D.length===1&&D[0]===this.list.length-1&&this._onLeave.fire();break}this._onKeyDown.fire(B)})),this.disposables.push(this.list.onMouseDown(A=>{A.browserEvent.button!==2&&A.browserEvent.preventDefault()})),this.disposables.push(b.addDisposableListener(this.container,b.EventType.CLICK,A=>{(A.x||A.y)&&this._onLeave.fire()})),this.disposables.push(this.list.onMouseMiddleClick(A=>{this._onLeave.fire()})),this.disposables.push(this.list.onContextMenu(A=>{typeof A.index=="number"&&(A.browserEvent.preventDefault(),this.list.setSelection([A.index]))})),this.disposables.push(this._onChangedAllVisibleChecked,this._onChangedCheckedCount,this._onChangedVisibleCount,this._onChangedCheckedElements,this._onButtonTriggered,this._onLeave,this._onKeyDown)}get onDidChangeFocus(){return S.Event.map(this.list.onDidChangeFocus,I=>I.elements.map(k=>k.item))}get onDidChangeSelection(){return S.Event.map(this.list.onDidChangeSelection,I=>({items:I.elements.map(k=>k.item),event:I.browserEvent}))}getAllVisibleChecked(){return this.allVisibleChecked(this.elements,!1)}allVisibleChecked(I,k=!0){for(let E=0,T=I.length;E{k.hidden||(k.checked=I)})}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}setElements(I){this.elementDisposables=N.dispose(this.elementDisposables);const k=E=>this.fireButtonTriggered(E);this.inputElements=I,this.elements=I.reduce((E,T,O)=>{var A,B,F;if(T.type!=="separator"){const D=O&&I[O-1],R=T.label&&T.label.replace(/\r?\n/g," "),W=T.meta&&T.meta.replace(/\r?\n/g," "),x=T.description&&T.description.replace(/\r?\n/g," "),K=T.detail&&T.detail.replace(/\r?\n/g," "),Y=T.ariaLabel||[R,x,K].map(ee=>ee&&M.parseLabelWithIcons(ee).text).filter(ee=>!!ee).join(", ");E.push(new l({index:O,item:T,saneLabel:R,saneMeta:W,saneAriaLabel:Y,saneDescription:x,saneDetail:K,labelHighlights:(A=T.highlights)===null||A===void 0?void 0:A.label,descriptionHighlights:(B=T.highlights)===null||B===void 0?void 0:B.description,detailHighlights:(F=T.highlights)===null||F===void 0?void 0:F.detail,checked:!1,separator:D&&D.type==="separator"?D:void 0,fireButtonTriggered:k}))}return E},[]),this.elementDisposables.push(...this.elements),this.elementDisposables.push(...this.elements.map(E=>E.onChecked(()=>this.fireCheckedEvents()))),this.elementsToIndexes=this.elements.reduce((E,T,O)=>(E.set(T.item,O),E),new Map),this.list.splice(0,this.list.length),this.list.splice(0,this.list.length,this.elements),this._onChangedVisibleCount.fire(this.elements.length)}getFocusedElements(){return this.list.getFocusedElements().map(I=>I.item)}setFocusedElements(I){if(this.list.setFocus(I.filter(k=>this.elementsToIndexes.has(k)).map(k=>this.elementsToIndexes.get(k))),I.length>0){const k=this.list.getFocus()[0];typeof k=="number"&&this.list.reveal(k)}}getActiveDescendant(){return this.list.getHTMLElement().getAttribute("aria-activedescendant")}setSelectedElements(I){this.list.setSelection(I.filter(k=>this.elementsToIndexes.has(k)).map(k=>this.elementsToIndexes.get(k)))}getCheckedElements(){return this.elements.filter(I=>I.checked).map(I=>I.item)}setCheckedElements(I){try{this._fireCheckedEvents=!1;const k=new Set;for(const E of I)k.add(E);for(const E of this.elements)E.checked=k.has(E.item)}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}set enabled(I){this.list.getHTMLElement().style.pointerEvents=I?"":"none"}focus(I){if(!!this.list.length){switch(I===_.Next&&this.list.getFocus()[0]===this.list.length-1&&(I=_.First),I===_.Previous&&this.list.getFocus()[0]===0&&(I=_.Last),I===_.Second&&this.list.length<2&&(I=_.First),I){case _.First:this.list.focusFirst();break;case _.Second:this.list.focusNth(1);break;case _.Last:this.list.focusLast();break;case _.Next:this.list.focusNext();break;case _.Previous:this.list.focusPrevious();break;case _.NextPage:this.list.focusNextPage();break;case _.PreviousPage:this.list.focusPreviousPage();break}const k=this.list.getFocus()[0];typeof k=="number"&&this.list.reveal(k)}}clearFocus(){this.list.setFocus([])}domFocus(){this.list.domFocus()}layout(I){this.list.getHTMLElement().style.maxHeight=I?`calc(${Math.floor(I/44)*44}px)`:"",this.list.layout()}filter(I){if(!(this.sortByLabel||this.matchOnLabel||this.matchOnDescription||this.matchOnDetail))return this.list.layout(),!1;I=I.trim(),!I||!(this.matchOnLabel||this.matchOnDescription||this.matchOnDetail)?this.elements.forEach(E=>{E.labelHighlights=void 0,E.descriptionHighlights=void 0,E.detailHighlights=void 0,E.hidden=!1;const T=E.index&&this.inputElements[E.index-1];E.separator=T&&T.type==="separator"?T:void 0}):this.elements.forEach(E=>{const T=this.matchOnLabel?r.withNullAsUndefined(M.matchesFuzzyIconAware(I,M.parseLabelWithIcons(E.saneLabel))):void 0,O=this.matchOnDescription?r.withNullAsUndefined(M.matchesFuzzyIconAware(I,M.parseLabelWithIcons(E.saneDescription||""))):void 0,A=this.matchOnDetail?r.withNullAsUndefined(M.matchesFuzzyIconAware(I,M.parseLabelWithIcons(E.saneDetail||""))):void 0,B=this.matchOnMeta?r.withNullAsUndefined(M.matchesFuzzyIconAware(I,M.parseLabelWithIcons(E.saneMeta||""))):void 0;T||O||A||B?(E.labelHighlights=T,E.descriptionHighlights=O,E.detailHighlights=A,E.hidden=!1):(E.labelHighlights=void 0,E.descriptionHighlights=void 0,E.detailHighlights=void 0,E.hidden=!E.item.alwaysShow),E.separator=void 0});const k=this.elements.filter(E=>!E.hidden);if(this.sortByLabel&&I){const E=I.toLowerCase();k.sort((T,O)=>v(T,O,E))}return this.elementsToIndexes=k.reduce((E,T,O)=>(E.set(T.item,O),E),new Map),this.list.splice(0,this.list.length,k),this.list.setFocus([]),this.list.layout(),this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()),this._onChangedVisibleCount.fire(k.length),!0}toggleCheckbox(){try{this._fireCheckedEvents=!1;const I=this.list.getFocusedElements(),k=this.allVisibleChecked(I);for(const E of I)E.checked=!k}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}display(I){this.container.style.display=I?"":"none"}isDisplayed(){return this.container.style.display!=="none"}dispose(){this.elementDisposables=N.dispose(this.elementDisposables),this.disposables=N.dispose(this.disposables)}fireCheckedEvents(){this._fireCheckedEvents&&(this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()),this._onChangedCheckedCount.fire(this.getCheckedCount()),this._onChangedCheckedElements.fire(this.getCheckedElements()))}fireButtonTriggered(I){this._onButtonTriggered.fire(I)}style(I){this.list.style(I)}}Me([p.memoize],f.prototype,"onDidChangeFocus",null),Me([p.memoize],f.prototype,"onDidChangeSelection",null),e.QuickInputList=f;function v(L,I,k){const E=L.labelHighlights||[],T=I.labelHighlights||[];return E.length&&!T.length?-1:!E.length&&T.length?1:E.length===0&&T.length===0?0:w.compareAnything(L.saneLabel,I.saneLabel,k)}class y{getWidgetAriaLabel(){return n.localize(0,null)}getAriaLabel(I){return I.saneAriaLabel}getWidgetRole(){return"listbox"}getRole(){return"option"}}}),define(Q[443],J([0,1,202,7,23,442,435,56,440,205,309,6,297,2,82,83,48,19,15,211,27,8,103,125]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputController=void 0;const _=N.$,v={iconClass:l.registerCodicon("quick-input-back",l.Codicon.arrowLeft).classNames,tooltip:d.localize(0,null),handle:-1};class y extends s.Disposable{constructor(E){super();this.ui=E,this.visible=!1,this._enabled=!0,this._busy=!1,this._ignoreFocusOut=!1,this._buttons=[],this.buttonsUpdated=!1,this.onDidTriggerButtonEmitter=this._register(new c.Emitter),this.onDidHideEmitter=this._register(new c.Emitter),this.onDisposeEmitter=this._register(new c.Emitter),this.visibleDisposables=this._register(new s.DisposableStore),this.onDidHide=this.onDidHideEmitter.event}get title(){return this._title}set title(E){this._title=E,this.update()}get description(){return this._description}set description(E){this._description=E,this.update()}get step(){return this._steps}set step(E){this._steps=E,this.update()}get totalSteps(){return this._totalSteps}set totalSteps(E){this._totalSteps=E,this.update()}get enabled(){return this._enabled}set enabled(E){this._enabled=E,this.update()}get contextKey(){return this._contextKey}set contextKey(E){this._contextKey=E,this.update()}get busy(){return this._busy}set busy(E){this._busy=E,this.update()}get ignoreFocusOut(){return this._ignoreFocusOut}set ignoreFocusOut(E){this._ignoreFocusOut=E,this.update()}get buttons(){return this._buttons}set buttons(E){this._buttons=E,this.buttonsUpdated=!0,this.update()}show(){this.visible||(this.visibleDisposables.add(this.ui.onDidTriggerButton(E=>{this.buttons.indexOf(E)!==-1&&this.onDidTriggerButtonEmitter.fire(E)})),this.ui.show(this),this.visible=!0,this.update())}hide(){!this.visible||this.ui.hide()}didHide(){this.visible=!1,this.visibleDisposables.clear(),this.onDidHideEmitter.fire()}update(){if(!!this.visible){const E=this.getTitle();E&&this.ui.title.textContent!==E?this.ui.title.textContent=E:!E&&this.ui.title.innerHTML!==" "&&(this.ui.title.innerText="\xA0;");const T=this.getDescription();if(this.ui.description1.textContent!==T&&(this.ui.description1.textContent=T),this.ui.description2.textContent!==T&&(this.ui.description2.textContent=T),this.busy&&!this.busyDelay&&(this.busyDelay=new n.TimeoutTimer,this.busyDelay.setIfNotSet(()=>{this.visible&&this.ui.progressBar.infinite()},800)),!this.busy&&this.busyDelay&&(this.ui.progressBar.stop(),this.busyDelay.cancel(),this.busyDelay=void 0),this.buttonsUpdated){this.buttonsUpdated=!1,this.ui.leftActionBar.clear();const O=this.buttons.filter(B=>B===v);this.ui.leftActionBar.push(O.map((B,F)=>{const D=new r.Action(`id-${F}`,"",B.iconClass||t.getIconClass(B.iconPath),!0,()=>Ie(this,void 0,void 0,function*(){this.onDidTriggerButtonEmitter.fire(B)}));return D.tooltip=B.tooltip||"",D}),{icon:!0,label:!1}),this.ui.rightActionBar.clear();const A=this.buttons.filter(B=>B!==v);this.ui.rightActionBar.push(A.map((B,F)=>{const D=new r.Action(`id-${F}`,"",B.iconClass||t.getIconClass(B.iconPath),!0,()=>Ie(this,void 0,void 0,function*(){this.onDidTriggerButtonEmitter.fire(B)}));return D.tooltip=B.tooltip||"",D}),{icon:!0,label:!1})}this.ui.ignoreFocusOut=this.ignoreFocusOut,this.ui.setEnabled(this.enabled),this.ui.setContextKey(this.contextKey)}}getTitle(){return this.title&&this.step?`${this.title} (${this.getSteps()})`:this.title?this.title:this.step?this.getSteps():""}getDescription(){return this.description||""}getSteps(){return this.step&&this.totalSteps?d.localize(1,null,this.step,this.totalSteps):this.step?String(this.step):""}showMessageDecoration(E){if(this.ui.inputBox.showDecoration(E),E===a.default.Error){const T=this.ui.inputBox.stylesForType(E);this.ui.message.style.color=T.foreground?`${T.foreground}`:"",this.ui.message.style.backgroundColor=T.background?`${T.background}`:"",this.ui.message.style.border=T.border?`1px solid ${T.border}`:"",this.ui.message.style.paddingBottom="4px"}else this.ui.message.style.color="",this.ui.message.style.backgroundColor="",this.ui.message.style.border="",this.ui.message.style.paddingBottom=""}dispose(){this.hide(),this.onDisposeEmitter.fire(),super.dispose()}}class L extends y{constructor(){super(...arguments);this._value="",this.onDidChangeValueEmitter=this._register(new c.Emitter),this.onDidAcceptEmitter=this._register(new c.Emitter),this.onDidCustomEmitter=this._register(new c.Emitter),this._items=[],this.itemsUpdated=!1,this._canSelectMany=!1,this._canAcceptInBackground=!1,this._matchOnDescription=!1,this._matchOnDetail=!1,this._matchOnLabel=!0,this._sortByLabel=!0,this._autoFocusOnList=!0,this._itemActivation=this.ui.isScreenReaderOptimized()?b.ItemActivation.NONE:b.ItemActivation.FIRST,this._activeItems=[],this.activeItemsUpdated=!1,this.activeItemsToConfirm=[],this.onDidChangeActiveEmitter=this._register(new c.Emitter),this._selectedItems=[],this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=[],this.onDidChangeSelectionEmitter=this._register(new c.Emitter),this.onDidTriggerItemButtonEmitter=this._register(new c.Emitter),this.valueSelectionUpdated=!0,this._ok="default",this._customButton=!1,this.filterValue=E=>E,this.onDidChangeValue=this.onDidChangeValueEmitter.event,this.onDidAccept=this.onDidAcceptEmitter.event,this.onDidChangeActive=this.onDidChangeActiveEmitter.event,this.onDidChangeSelection=this.onDidChangeSelectionEmitter.event,this.onDidTriggerItemButton=this.onDidTriggerItemButtonEmitter.event}get quickNavigate(){return this._quickNavigate}set quickNavigate(E){this._quickNavigate=E,this.update()}get value(){return this._value}set value(E){this._value=E||"",this.update()}set ariaLabel(E){this._ariaLabel=E,this.update()}get ariaLabel(){return this._ariaLabel}get placeholder(){return this._placeholder}set placeholder(E){this._placeholder=E,this.update()}get items(){return this._items}set items(E){this._items=E,this.itemsUpdated=!0,this.update()}get canSelectMany(){return this._canSelectMany}set canSelectMany(E){this._canSelectMany=E,this.update()}get canAcceptInBackground(){return this._canAcceptInBackground}set canAcceptInBackground(E){this._canAcceptInBackground=E}get matchOnDescription(){return this._matchOnDescription}set matchOnDescription(E){this._matchOnDescription=E,this.update()}get matchOnDetail(){return this._matchOnDetail}set matchOnDetail(E){this._matchOnDetail=E,this.update()}get matchOnLabel(){return this._matchOnLabel}set matchOnLabel(E){this._matchOnLabel=E,this.update()}get sortByLabel(){return this._sortByLabel}set sortByLabel(E){this._sortByLabel=E,this.update()}get autoFocusOnList(){return this._autoFocusOnList}set autoFocusOnList(E){this._autoFocusOnList=E,this.update()}get itemActivation(){return this._itemActivation}set itemActivation(E){this._itemActivation=E}get activeItems(){return this._activeItems}set activeItems(E){this._activeItems=E,this.activeItemsUpdated=!0,this.update()}get selectedItems(){return this._selectedItems}set selectedItems(E){this._selectedItems=E,this.selectedItemsUpdated=!0,this.update()}get keyMods(){return this._quickNavigate?b.NO_KEY_MODS:this.ui.keyMods}set valueSelection(E){this._valueSelection=E,this.valueSelectionUpdated=!0,this.update()}get validationMessage(){return this._validationMessage}set validationMessage(E){this._validationMessage=E,this.update()}get customButton(){return this._customButton}set customButton(E){this._customButton=E,this.update()}get customLabel(){return this._customButtonLabel}set customLabel(E){this._customButtonLabel=E,this.update()}get customHover(){return this._customButtonHover}set customHover(E){this._customButtonHover=E,this.update()}get ok(){return this._ok}set ok(E){this._ok=E,this.update()}get hideInput(){return!!this._hideInput}set hideInput(E){this._hideInput=E,this.update()}trySelectFirst(){this.autoFocusOnList&&(this.canSelectMany||this.ui.list.focus(w.QuickInputListFocus.First))}show(){this.visible||(this.visibleDisposables.add(this.ui.inputBox.onDidChange(E=>{E!==this.value&&(this._value=E,this.ui.list.filter(this.filterValue(this.ui.inputBox.value))&&this.trySelectFirst(),this.onDidChangeValueEmitter.fire(E))})),this.visibleDisposables.add(this.ui.inputBox.onMouseDown(E=>{this.autoFocusOnList||this.ui.list.clearFocus()})),this.visibleDisposables.add((this._hideInput?this.ui.list:this.ui.inputBox).onKeyDown(E=>{switch(E.keyCode){case 18:this.ui.list.focus(w.QuickInputListFocus.Next),this.canSelectMany&&this.ui.list.domFocus(),N.EventHelper.stop(E,!0);break;case 16:this.ui.list.getFocusedElements().length?this.ui.list.focus(w.QuickInputListFocus.Previous):this.ui.list.focus(w.QuickInputListFocus.Last),this.canSelectMany&&this.ui.list.domFocus(),N.EventHelper.stop(E,!0);break;case 12:this.ui.list.focus(w.QuickInputListFocus.NextPage),this.canSelectMany&&this.ui.list.domFocus(),N.EventHelper.stop(E,!0);break;case 11:this.ui.list.focus(w.QuickInputListFocus.PreviousPage),this.canSelectMany&&this.ui.list.domFocus(),N.EventHelper.stop(E,!0);break;case 17:if(!this._canAcceptInBackground||!this.ui.inputBox.isSelectionAtEnd())return;this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.onDidAcceptEmitter.fire({inBackground:!0}));break;case 14:(E.ctrlKey||E.metaKey)&&!E.shiftKey&&!E.altKey&&(this.ui.list.focus(w.QuickInputListFocus.First),N.EventHelper.stop(E,!0));break;case 13:(E.ctrlKey||E.metaKey)&&!E.shiftKey&&!E.altKey&&(this.ui.list.focus(w.QuickInputListFocus.Last),N.EventHelper.stop(E,!0));break}})),this.visibleDisposables.add(this.ui.onDidAccept(()=>{!this.canSelectMany&&this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems)),this.onDidAcceptEmitter.fire({inBackground:!1})})),this.visibleDisposables.add(this.ui.onDidCustom(()=>{this.onDidCustomEmitter.fire()})),this.visibleDisposables.add(this.ui.list.onDidChangeFocus(E=>{this.activeItemsUpdated||this.activeItemsToConfirm!==this._activeItems&&i.equals(E,this._activeItems,(T,O)=>T===O)||(this._activeItems=E,this.onDidChangeActiveEmitter.fire(E))})),this.visibleDisposables.add(this.ui.list.onDidChangeSelection(({items:E,event:T})=>{if(this.canSelectMany){E.length&&this.ui.list.setSelectedElements([]);return}this.selectedItemsToConfirm!==this._selectedItems&&i.equals(E,this._selectedItems,(O,A)=>O===A)||(this._selectedItems=E,this.onDidChangeSelectionEmitter.fire(E),E.length&&this.onDidAcceptEmitter.fire({inBackground:T instanceof MouseEvent&&T.button===1}))})),this.visibleDisposables.add(this.ui.list.onChangedCheckedElements(E=>{!this.canSelectMany||this.selectedItemsToConfirm!==this._selectedItems&&i.equals(E,this._selectedItems,(T,O)=>T===O)||(this._selectedItems=E,this.onDidChangeSelectionEmitter.fire(E))})),this.visibleDisposables.add(this.ui.list.onButtonTriggered(E=>this.onDidTriggerItemButtonEmitter.fire(E))),this.visibleDisposables.add(this.registerQuickNavigation()),this.valueSelectionUpdated=!0),super.show()}registerQuickNavigation(){return N.addDisposableListener(this.ui.container,N.EventType.KEY_UP,E=>{if(!(this.canSelectMany||!this._quickNavigate)){const T=new C.StandardKeyboardEvent(E),O=T.keyCode;this._quickNavigate.keybindings.some(F=>{const[D,R]=F.getParts();return R?!1:D.shiftKey&&O===4?!(T.ctrlKey||T.altKey||T.metaKey):!!(D.altKey&&O===6||D.ctrlKey&&O===5||D.metaKey&&O===57)})&&(this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.onDidAcceptEmitter.fire({inBackground:!1})),this._quickNavigate=void 0)}})}update(){if(!!this.visible){let E=!1,T=!1;!!this._hideInput&&this._items.length>0&&(this.ui.isScreenReaderOptimized()?T=!0:E=!0),this.ui.container.classList.toggle("hidden-input",E&&!this.description);const O={title:!!this.title||!!this.step||!!this.buttons.length,description:!!this.description,checkAll:this.canSelectMany&&!this._hideCheckAll,checkBox:this.canSelectMany,inputBox:!E,progressBar:!E,visibleCount:!0,count:this.canSelectMany,ok:this.ok==="default"?this.canSelectMany:this.ok,list:!0,message:!!this.validationMessage,customButton:this.customButton};if(this.ui.setVisibilities(O),super.update(),this.ui.inputBox.value!==this.value&&(this.ui.inputBox.value=this.value),this.valueSelectionUpdated&&(this.valueSelectionUpdated=!1,this.ui.inputBox.select(this._valueSelection&&{start:this._valueSelection[0],end:this._valueSelection[1]})),this.ui.inputBox.placeholder!==(this.placeholder||"")&&(this.ui.inputBox.placeholder=this.placeholder||""),T)this.ui.inputBox.ariaLabel="";else{const B=this.ariaLabel||this.placeholder||L.DEFAULT_ARIA_LABEL;this.ui.inputBox.ariaLabel!==B&&(this.ui.inputBox.ariaLabel=B)}if(this.ui.list.matchOnDescription=this.matchOnDescription,this.ui.list.matchOnDetail=this.matchOnDetail,this.ui.list.matchOnLabel=this.matchOnLabel,this.ui.list.sortByLabel=this.sortByLabel,this.itemsUpdated)switch(this.itemsUpdated=!1,this.ui.list.setElements(this.items),this.ui.list.filter(this.filterValue(this.ui.inputBox.value)),this.ui.checkAll.checked=this.ui.list.getAllVisibleChecked(),this.ui.visibleCount.setCount(this.ui.list.getVisibleCount()),this.ui.count.setCount(this.ui.list.getCheckedCount()),this._itemActivation){case b.ItemActivation.NONE:this._itemActivation=b.ItemActivation.FIRST;break;case b.ItemActivation.SECOND:this.ui.list.focus(w.QuickInputListFocus.Second),this._itemActivation=b.ItemActivation.FIRST;break;case b.ItemActivation.LAST:this.ui.list.focus(w.QuickInputListFocus.Last),this._itemActivation=b.ItemActivation.FIRST;break;default:this.trySelectFirst();break}this.ui.container.classList.contains("show-checkboxes")!==!!this.canSelectMany&&(this.canSelectMany?this.ui.list.clearFocus():this.trySelectFirst()),this.activeItemsUpdated&&(this.activeItemsUpdated=!1,this.activeItemsToConfirm=this._activeItems,this.ui.list.setFocusedElements(this.activeItems),this.activeItemsToConfirm===this._activeItems&&(this.activeItemsToConfirm=null)),this.selectedItemsUpdated&&(this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=this._selectedItems,this.canSelectMany?this.ui.list.setCheckedElements(this.selectedItems):this.ui.list.setSelectedElements(this.selectedItems),this.selectedItemsToConfirm===this._selectedItems&&(this.selectedItemsToConfirm=null));const A=this.validationMessage||"";this._lastValidationMessage!==A&&(this._lastValidationMessage=A,N.reset(this.ui.message,...m.renderLabelWithIcons(h.escape(A))),this.showMessageDecoration(this.validationMessage?a.default.Error:a.default.Ignore)),this.ui.customButton.label=this.customLabel||"",this.ui.customButton.element.title=this.customHover||"",this.ui.setComboboxAccessibility(!0),O.inputBox||(this.ui.list.domFocus(),this.canSelectMany&&this.ui.list.focus(w.QuickInputListFocus.First))}}}L.DEFAULT_ARIA_LABEL=d.localize(2,null);class I extends s.Disposable{constructor(E){super();this.options=E,this.comboboxAccessibility=!1,this.enabled=!0,this.onDidAcceptEmitter=this._register(new c.Emitter),this.onDidCustomEmitter=this._register(new c.Emitter),this.onDidTriggerButtonEmitter=this._register(new c.Emitter),this.keyMods={ctrlCmd:!1,alt:!1},this.controller=null,this.onShowEmitter=this._register(new c.Emitter),this.onShow=this.onShowEmitter.event,this.onHideEmitter=this._register(new c.Emitter),this.onHide=this.onHideEmitter.event,this.idPrefix=E.idPrefix,this.parentElement=E.container,this.styles=E.styles,this.registerKeyModsListeners()}registerKeyModsListeners(){const E=T=>{this.keyMods.ctrlCmd=T.ctrlKey||T.metaKey,this.keyMods.alt=T.altKey};this._register(N.addDisposableListener(window,N.EventType.KEY_DOWN,E,!0)),this._register(N.addDisposableListener(window,N.EventType.KEY_UP,E,!0)),this._register(N.addDisposableListener(window,N.EventType.MOUSE_DOWN,E,!0))}getUI(){if(this.ui)return this.ui;const E=N.append(this.parentElement,_(".quick-input-widget.show-file-icons"));E.tabIndex=-1,E.style.display="none";const T=N.createStyleSheet(E),O=N.append(E,_(".quick-input-titlebar")),A=this._register(new u.ActionBar(O));A.domNode.classList.add("quick-input-left-action-bar");const B=N.append(O,_(".quick-input-title")),F=this._register(new u.ActionBar(O));F.domNode.classList.add("quick-input-right-action-bar");const D=N.append(E,_(".quick-input-description")),R=N.append(E,_(".quick-input-header")),W=N.append(R,_("input.quick-input-check-all"));W.type="checkbox",this._register(N.addStandardDisposableListener(W,N.EventType.CHANGE,ae=>{const G=W.checked;ie.setAllVisibleChecked(G)})),this._register(N.addDisposableListener(W,N.EventType.CLICK,ae=>{(ae.x||ae.y)&&ee.setFocus()}));const x=N.append(R,_(".quick-input-description")),K=N.append(R,_(".quick-input-and-message")),Y=N.append(K,_(".quick-input-filter")),ee=this._register(new S.QuickInputBox(Y));ee.setAttribute("aria-describedby",`${this.idPrefix}message`);const se=N.append(Y,_(".quick-input-visible-count"));se.setAttribute("aria-live","polite"),se.setAttribute("aria-atomic","true");const ne=new g.CountBadge(se,{countFormat:d.localize(3,null)}),le=N.append(Y,_(".quick-input-count"));le.setAttribute("aria-live","polite");const X=new g.CountBadge(le,{countFormat:d.localize(4,null)}),z=N.append(R,_(".quick-input-action")),P=new o.Button(z);P.label=d.localize(5,null),this._register(P.onDidClick(ae=>{this.onDidAcceptEmitter.fire()}));const V=N.append(R,_(".quick-input-action")),U=new o.Button(V);U.label=d.localize(6,null),this._register(U.onDidClick(ae=>{this.onDidCustomEmitter.fire()}));const H=N.append(K,_(`#${this.idPrefix}message.quick-input-message`)),$=new p.ProgressBar(E);$.getContainer().classList.add("quick-input-progress");const ie=this._register(new w.QuickInputList(E,this.idPrefix+"list",this.options));this._register(ie.onChangedAllVisibleChecked(ae=>{W.checked=ae})),this._register(ie.onChangedVisibleCount(ae=>{ne.setCount(ae)})),this._register(ie.onChangedCheckedCount(ae=>{X.setCount(ae)})),this._register(ie.onLeave(()=>{setTimeout(()=>{ee.setFocus(),this.controller instanceof L&&this.controller.canSelectMany&&ie.clearFocus()},0)})),this._register(ie.onDidChangeFocus(()=>{this.comboboxAccessibility&&this.getUI().inputBox.setAttribute("aria-activedescendant",this.getUI().list.getActiveDescendant()||"")}));const oe=N.trackFocus(E);return this._register(oe),this._register(N.addDisposableListener(E,N.EventType.FOCUS,ae=>{this.previousFocusElement=ae.relatedTarget instanceof HTMLElement?ae.relatedTarget:void 0},!0)),this._register(oe.onDidBlur(()=>{!this.getUI().ignoreFocusOut&&!this.options.ignoreFocusOut()&&this.hide(),this.previousFocusElement=void 0})),this._register(N.addDisposableListener(E,N.EventType.FOCUS,ae=>{ee.setFocus()})),this._register(N.addDisposableListener(E,N.EventType.KEY_DOWN,ae=>{const G=new C.StandardKeyboardEvent(ae);switch(G.keyCode){case 3:N.EventHelper.stop(ae,!0),this.onDidAcceptEmitter.fire();break;case 9:N.EventHelper.stop(ae,!0),this.hide();break;case 2:if(!G.altKey&&!G.ctrlKey&&!G.metaKey){const j=[".action-label.codicon"];E.classList.contains("show-checkboxes")?j.push("input"):j.push("input[type=text]"),this.getUI().list.isDisplayed()&&j.push(".monaco-list");const te=E.querySelectorAll(j.join(", "));G.shiftKey&&G.target===te[0]?(N.EventHelper.stop(ae,!0),te[te.length-1].focus()):!G.shiftKey&&G.target===te[te.length-1]&&(N.EventHelper.stop(ae,!0),te[0].focus())}break}})),this.ui={container:E,styleSheet:T,leftActionBar:A,titleBar:O,title:B,description1:D,description2:x,rightActionBar:F,checkAll:W,filterContainer:Y,inputBox:ee,visibleCountContainer:se,visibleCount:ne,countContainer:le,count:X,okContainer:z,ok:P,message:H,customButtonContainer:V,customButton:U,progressBar:$,list:ie,onDidAccept:this.onDidAcceptEmitter.event,onDidCustom:this.onDidCustomEmitter.event,onDidTriggerButton:this.onDidTriggerButtonEmitter.event,ignoreFocusOut:!1,keyMods:this.keyMods,isScreenReaderOptimized:()=>this.options.isScreenReaderOptimized(),show:ae=>this.show(ae),hide:()=>this.hide(),setVisibilities:ae=>this.setVisibilities(ae),setComboboxAccessibility:ae=>this.setComboboxAccessibility(ae),setEnabled:ae=>this.setEnabled(ae),setContextKey:ae=>this.options.setContextKey(ae)},this.updateStyles(),this.ui}pick(E,T={},O=M.CancellationToken.None){return new Promise((A,B)=>{let F=x=>{F=A,T.onKeyMods&&T.onKeyMods(D.keyMods),A(x)};if(O.isCancellationRequested){F(void 0);return}const D=this.createQuickPick();let R;const W=[D,D.onDidAccept(()=>{if(D.canSelectMany)F(D.selectedItems.slice()),D.hide();else{const x=D.activeItems[0];x&&(F(x),D.hide())}}),D.onDidChangeActive(x=>{const K=x[0];K&&T.onDidFocus&&T.onDidFocus(K)}),D.onDidChangeSelection(x=>{if(!D.canSelectMany){const K=x[0];K&&(F(K),D.hide())}}),D.onDidTriggerItemButton(x=>T.onDidTriggerItemButton&&T.onDidTriggerItemButton(Object.assign(Object.assign({},x),{removeItem:()=>{const K=D.items.indexOf(x.item);if(K!==-1){const Y=D.items.slice();Y.splice(K,1),D.items=Y}}}))),D.onDidChangeValue(x=>{R&&!x&&(D.activeItems.length!==1||D.activeItems[0]!==R)&&(D.activeItems=[R])}),O.onCancellationRequested(()=>{D.hide()}),D.onDidHide(()=>{s.dispose(W),F(void 0)})];D.canSelectMany=!!T.canPickMany,D.placeholder=T.placeHolder,D.ignoreFocusOut=!!T.ignoreFocusLost,D.matchOnDescription=!!T.matchOnDescription,D.matchOnDetail=!!T.matchOnDetail,D.matchOnLabel=T.matchOnLabel===void 0||T.matchOnLabel,D.autoFocusOnList=T.autoFocusOnList===void 0||T.autoFocusOnList,D.quickNavigate=T.quickNavigate,D.contextKey=T.contextKey,D.busy=!0,Promise.all([E,T.activeItem]).then(([x,K])=>{R=K,D.busy=!1,D.items=x,D.canSelectMany&&(D.selectedItems=x.filter(Y=>Y.type!=="separator"&&Y.picked)),R&&(D.activeItems=[R])}),D.show(),Promise.resolve(E).then(void 0,x=>{B(x),D.hide()})})}createQuickPick(){const E=this.getUI();return new L(E)}show(E){const T=this.getUI();this.onShowEmitter.fire();const O=this.controller;this.controller=E,O&&O.didHide(),this.setEnabled(!0),T.leftActionBar.clear(),T.title.textContent="",T.description1.textContent="",T.description2.textContent="",T.rightActionBar.clear(),T.checkAll.checked=!1,T.inputBox.placeholder="",T.inputBox.password=!1,T.inputBox.showDecoration(a.default.Ignore),T.visibleCount.setCount(0),T.count.setCount(0),N.reset(T.message),T.progressBar.stop(),T.list.setElements([]),T.list.matchOnDescription=!1,T.list.matchOnDetail=!1,T.list.matchOnLabel=!0,T.list.sortByLabel=!0,T.ignoreFocusOut=!1,this.setComboboxAccessibility(!1),T.inputBox.ariaLabel="";const A=this.options.backKeybindingLabel();v.tooltip=A?d.localize(7,null,A):d.localize(8,null),T.container.style.display="",this.updateLayout(),T.inputBox.setFocus()}setVisibilities(E){const T=this.getUI();T.title.style.display=E.title?"":"none",T.description1.style.display=E.description&&(E.inputBox||E.checkAll)?"":"none",T.description2.style.display=E.description&&!(E.inputBox||E.checkAll)?"":"none",T.checkAll.style.display=E.checkAll?"":"none",T.filterContainer.style.display=E.inputBox?"":"none",T.visibleCountContainer.style.display=E.visibleCount?"":"none",T.countContainer.style.display=E.count?"":"none",T.okContainer.style.display=E.ok?"":"none",T.customButtonContainer.style.display=E.customButton?"":"none",T.message.style.display=E.message?"":"none",T.progressBar.getContainer().style.display=E.progressBar?"":"none",T.list.display(!!E.list),T.container.classList[E.checkBox?"add":"remove"]("show-checkboxes"),this.updateLayout()}setComboboxAccessibility(E){if(E!==this.comboboxAccessibility){const T=this.getUI();this.comboboxAccessibility=E,this.comboboxAccessibility?(T.inputBox.setAttribute("role","combobox"),T.inputBox.setAttribute("aria-haspopup","true"),T.inputBox.setAttribute("aria-autocomplete","list"),T.inputBox.setAttribute("aria-activedescendant",T.list.getActiveDescendant()||"")):(T.inputBox.removeAttribute("role"),T.inputBox.removeAttribute("aria-haspopup"),T.inputBox.removeAttribute("aria-autocomplete"),T.inputBox.removeAttribute("aria-activedescendant"))}}setEnabled(E){if(E!==this.enabled){this.enabled=E;for(const T of this.getUI().leftActionBar.viewItems)T.getAction().enabled=E;for(const T of this.getUI().rightActionBar.viewItems)T.getAction().enabled=E;this.getUI().checkAll.disabled=!E,this.getUI().ok.enabled=E,this.getUI().list.enabled=E}}hide(){var E;const T=this.controller;if(T){const O=!((E=this.ui)===null||E===void 0?void 0:E.container.contains(document.activeElement));this.controller=null,this.onHideEmitter.fire(),this.getUI().container.style.display="none",O||(this.previousFocusElement&&this.previousFocusElement.offsetParent?(this.previousFocusElement.focus(),this.previousFocusElement=void 0):this.options.returnFocus()),T.didHide()}}layout(E,T){this.dimension=E,this.titleBarOffset=T,this.updateLayout()}updateLayout(){if(this.ui){this.ui.container.style.top=`${this.titleBarOffset}px`;const E=this.ui.container.style,T=Math.min(this.dimension.width*.62,I.MAX_WIDTH);E.width=T+"px",E.marginLeft="-"+T/2+"px",this.ui.inputBox.layout(),this.ui.list.layout(this.dimension&&this.dimension.height*.4)}}applyStyles(E){this.styles=E,this.updateStyles()}updateStyles(){if(this.ui){const{quickInputTitleBackground:E,quickInputBackground:T,quickInputForeground:O,contrastBorder:A,widgetShadow:B}=this.styles.widget;this.ui.titleBar.style.backgroundColor=E?E.toString():"",this.ui.container.style.backgroundColor=T?T.toString():"",this.ui.container.style.color=O?O.toString():"",this.ui.container.style.border=A?`1px solid ${A}`:"",this.ui.container.style.boxShadow=B?`0 0 8px 2px ${B}`:"",this.ui.inputBox.style(this.styles.inputBox),this.ui.count.style(this.styles.countBadge),this.ui.ok.style(this.styles.button),this.ui.customButton.style(this.styles.button),this.ui.progressBar.style(this.styles.progressBar),this.ui.list.style(this.styles.list);const F=[];this.styles.list.pickerGroupBorder&&F.push(`.quick-input-list .quick-input-list-entry { border-top-color: ${this.styles.list.pickerGroupBorder}; }`),this.styles.list.pickerGroupForeground&&F.push(`.quick-input-list .quick-input-list-separator { color: ${this.styles.list.pickerGroupForeground}; }`);const D=F.join(` +`);D!==this.ui.styleSheet.textContent&&(this.ui.styleSheet.textContent=D)}}}e.QuickInputController=I,I.MAX_WIDTH=600}),define(Q[444],J([4,5]),function(q,e){return q.create("vs/editor/browser/controller/coreCommands",e)}),define(Q[445],J([4,5]),function(q,e){return q.create("vs/editor/browser/controller/textAreaHandler",e)}),define(Q[446],J([4,5]),function(q,e){return q.create("vs/editor/browser/core/keybindingCancellation",e)}),define(Q[447],J([4,5]),function(q,e){return q.create("vs/editor/browser/editorExtensions",e)}),define(Q[448],J([4,5]),function(q,e){return q.create("vs/editor/browser/widget/codeEditorWidget",e)}),define(Q[449],J([4,5]),function(q,e){return q.create("vs/editor/browser/widget/diffEditorWidget",e)}),define(Q[450],J([4,5]),function(q,e){return q.create("vs/editor/browser/widget/diffReview",e)}),define(Q[451],J([4,5]),function(q,e){return q.create("vs/editor/browser/widget/inlineDiffMargin",e)}),define(Q[452],J([0,1,451,7,48,2,3,27]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineDiffMargin=void 0;class d extends w.Disposable{constructor(p,c,o,s,a,u){super();this._viewZoneId=p,this._marginDomNode=c,this.editor=o,this.diff=s,this._contextMenuService=a,this._clipboardService=u,this._visibility=!1,this._marginDomNode.style.zIndex="10",this._diffActions=document.createElement("div"),this._diffActions.className=C.Codicon.lightBulb.classNames+" lightbulb-glyph",this._diffActions.style.position="absolute";const r=o.getOption(53),i=o.getModel().getEOL();this._diffActions.style.right="0px",this._diffActions.style.visibility="hidden",this._diffActions.style.height=`${r}px`,this._diffActions.style.lineHeight=`${r}px`,this._marginDomNode.appendChild(this._diffActions);const n=[];n.push(new M.Action("diff.clipboard.copyDeletedContent",s.originalEndLineNumber>s.modifiedStartLineNumber?b.localize(0,null):b.localize(1,null),void 0,!0,()=>Ie(this,void 0,void 0,function*(){const _=new S.Range(s.originalStartLineNumber,1,s.originalEndLineNumber+1,1),f=s.originalModel.getValueInRange(_);yield this._clipboardService.writeText(f)})));let t=0,l;s.originalEndLineNumber>s.modifiedStartLineNumber&&(l=new M.Action("diff.clipboard.copyDeletedLineContent",b.localize(2,null,s.originalStartLineNumber),void 0,!0,()=>Ie(this,void 0,void 0,function*(){const _=s.originalModel.getLineContent(s.originalStartLineNumber+t);yield this._clipboardService.writeText(_)})),n.push(l)),o.getOption(75)||n.push(new M.Action("diff.inline.revertChange",b.localize(3,null),void 0,!0,()=>Ie(this,void 0,void 0,function*(){const _=new S.Range(s.originalStartLineNumber,1,s.originalEndLineNumber,s.originalModel.getLineMaxColumn(s.originalEndLineNumber)),f=s.originalModel.getValueInRange(_);if(s.modifiedEndLineNumber===0){const v=o.getModel().getLineMaxColumn(s.modifiedStartLineNumber);o.executeEdits("diffEditor",[{range:new S.Range(s.modifiedStartLineNumber,v,s.modifiedStartLineNumber,v),text:i+f}])}else{const v=o.getModel().getLineMaxColumn(s.modifiedEndLineNumber);o.executeEdits("diffEditor",[{range:new S.Range(s.modifiedStartLineNumber,1,s.modifiedEndLineNumber,v),text:f}])}})));const m=(_,f)=>{this._contextMenuService.showContextMenu({getAnchor:()=>({x:_,y:f}),getActions:()=>(l&&(l.label=b.localize(4,null,s.originalStartLineNumber+t)),n),autoSelectFirstItem:!0})};this._register(N.addStandardDisposableListener(this._diffActions,"mousedown",_=>{const{top:f,height:v}=N.getDomNodePagePosition(this._diffActions);let y=Math.floor(r/3);_.preventDefault(),m(_.posx,f+v+y)})),this._register(o.onMouseMove(_=>{_.target.type===8||_.target.type===5?_.target.detail.viewZoneId===this._viewZoneId?(this.visibility=!0,t=this._updateLightBulbPosition(this._marginDomNode,_.event.browserEvent.y,r)):this.visibility=!1:this.visibility=!1})),this._register(o.onMouseDown(_=>{!_.event.rightButton||(_.target.type===8||_.target.type===5)&&_.target.detail.viewZoneId===this._viewZoneId&&(_.event.preventDefault(),t=this._updateLightBulbPosition(this._marginDomNode,_.event.browserEvent.y,r),m(_.event.posx,_.event.posy+r))}))}get visibility(){return this._visibility}set visibility(p){this._visibility!==p&&(this._visibility=p,p?this._diffActions.style.visibility="visible":this._diffActions.style.visibility="hidden")}_updateLightBulbPosition(p,c,o){const{top:s}=N.getDomNodePagePosition(p),a=c-s,u=Math.floor(a/o),r=u*o;if(this._diffActions.style.top=`${r}px`,this.diff.viewLineCounts){let i=0;for(let n=0;nhe?he:Z}static float(Z,ue){if(typeof Z=="number")return Z;if(typeof Z=="undefined")return ue;const he=parseFloat(Z);return isNaN(he)?ue:he}validate(Z){return this.validationFn(a.float(Z,this.defaultValue))}}class u extends p{static string(Z,ue){return typeof Z!="string"?ue:Z}constructor(Z,ue,he,re=void 0){typeof re!="undefined"&&(re.type="string",re.default=he),super(Z,ue,he,re)}validate(Z){return u.string(Z,this.defaultValue)}}function r(te,Z,ue){return typeof te!="string"||ue.indexOf(te)===-1?Z:te}e.stringSet=r;class i extends p{constructor(Z,ue,he,re,ce=void 0){typeof ce!="undefined"&&(ce.type="string",ce.enum=re,ce.default=he),super(Z,ue,he,ce),this._allowedValues=re}validate(Z){return r(Z,this.defaultValue,this._allowedValues)}}class n extends d{constructor(Z,ue,he,re,ce,me,Ce=void 0){typeof Ce!="undefined"&&(Ce.type="string",Ce.enum=ce,Ce.default=re),super(Z,ue,he,Ce),this._allowedValues=ce,this._convert=me}validate(Z){return typeof Z!="string"?this.defaultValue:this._allowedValues.indexOf(Z)===-1?this.defaultValue:this._convert(Z)}}function t(te){switch(te){case"none":return 0;case"keep":return 1;case"brackets":return 2;case"advanced":return 3;case"full":return 4}}class l extends d{constructor(){super(2,"accessibilitySupport",0,{type:"string",enum:["auto","on","off"],enumDescriptions:[b.localize(0,null),b.localize(1,null),b.localize(2,null)],default:"auto",description:b.localize(3,null)})}validate(Z){switch(Z){case"auto":return 0;case"off":return 1;case"on":return 2}return this.defaultValue}compute(Z,ue,he){return he===0?Z.accessibilitySupport:he}}class h extends d{constructor(){const Z={insertSpace:!0,ignoreEmptyLines:!0};super(16,"comments",Z,{"editor.comments.insertSpace":{type:"boolean",default:Z.insertSpace,description:b.localize(4,null)},"editor.comments.ignoreEmptyLines":{type:"boolean",default:Z.ignoreEmptyLines,description:b.localize(5,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{insertSpace:c(ue.insertSpace,this.defaultValue.insertSpace),ignoreEmptyLines:c(ue.ignoreEmptyLines,this.defaultValue.ignoreEmptyLines)}}}function m(te){switch(te){case"blink":return 1;case"smooth":return 2;case"phase":return 3;case"expand":return 4;case"solid":return 5}}var _;(function(te){te[te.Line=1]="Line",te[te.Block=2]="Block",te[te.Underline=3]="Underline",te[te.LineThin=4]="LineThin",te[te.BlockOutline=5]="BlockOutline",te[te.UnderlineThin=6]="UnderlineThin"})(_=e.TextEditorCursorStyle||(e.TextEditorCursorStyle={}));function f(te){switch(te){case"line":return _.Line;case"block":return _.Block;case"underline":return _.Underline;case"line-thin":return _.LineThin;case"block-outline":return _.BlockOutline;case"underline-thin":return _.UnderlineThin}}class v extends g{constructor(){super(121,[60,29])}compute(Z,ue,he){const re=["monaco-editor"];return ue.get(29)&&re.push(ue.get(29)),Z.extraEditorClassName&&re.push(Z.extraEditorClassName),ue.get(60)==="default"?re.push("mouse-default"):ue.get(60)==="copy"&&re.push("mouse-copy"),ue.get(95)&&re.push("showUnused"),ue.get(119)&&re.push("showDeprecated"),re.join(" ")}}class y extends o{constructor(){super(28,"emptySelectionClipboard",!0,{description:b.localize(6,null)})}compute(Z,ue,he){return he&&Z.emptySelectionClipboard}}class L extends d{constructor(){const Z={cursorMoveOnType:!0,seedSearchStringFromSelection:!0,autoFindInSelection:"never",globalFindClipboard:!1,addExtraSpaceOnTop:!0,loop:!0};super(31,"find",Z,{"editor.find.cursorMoveOnType":{type:"boolean",default:Z.cursorMoveOnType,description:b.localize(7,null)},"editor.find.seedSearchStringFromSelection":{type:"boolean",default:Z.seedSearchStringFromSelection,description:b.localize(8,null)},"editor.find.autoFindInSelection":{type:"string",enum:["never","always","multiline"],default:Z.autoFindInSelection,enumDescriptions:[b.localize(9,null),b.localize(10,null),b.localize(11,null)],description:b.localize(12,null)},"editor.find.globalFindClipboard":{type:"boolean",default:Z.globalFindClipboard,description:b.localize(13,null),included:N.isMacintosh},"editor.find.addExtraSpaceOnTop":{type:"boolean",default:Z.addExtraSpaceOnTop,description:b.localize(14,null)},"editor.find.loop":{type:"boolean",default:Z.loop,description:b.localize(15,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{cursorMoveOnType:c(ue.cursorMoveOnType,this.defaultValue.cursorMoveOnType),seedSearchStringFromSelection:c(ue.seedSearchStringFromSelection,this.defaultValue.seedSearchStringFromSelection),autoFindInSelection:typeof Z.autoFindInSelection=="boolean"?Z.autoFindInSelection?"always":"never":r(ue.autoFindInSelection,this.defaultValue.autoFindInSelection,["never","always","multiline"]),globalFindClipboard:c(ue.globalFindClipboard,this.defaultValue.globalFindClipboard),addExtraSpaceOnTop:c(ue.addExtraSpaceOnTop,this.defaultValue.addExtraSpaceOnTop),loop:c(ue.loop,this.defaultValue.loop)}}}class I extends d{constructor(){super(39,"fontLigatures",I.OFF,{anyOf:[{type:"boolean",description:b.localize(16,null)},{type:"string",description:b.localize(17,null)}],description:b.localize(18,null),default:!1})}validate(Z){return typeof Z=="undefined"?this.defaultValue:typeof Z=="string"?Z==="false"?I.OFF:Z==="true"?I.ON:Z:Boolean(Z)?I.ON:I.OFF}}e.EditorFontLigatures=I,I.OFF='"liga" off, "calt" off',I.ON='"liga" on, "calt" on';class k extends g{constructor(){super(38)}compute(Z,ue,he){return Z.fontInfo}}class E extends p{constructor(){super(40,"fontSize",e.EDITOR_FONT_DEFAULTS.fontSize,{type:"number",minimum:6,maximum:100,default:e.EDITOR_FONT_DEFAULTS.fontSize,description:b.localize(19,null)})}validate(Z){let ue=a.float(Z,this.defaultValue);return ue===0?e.EDITOR_FONT_DEFAULTS.fontSize:a.clamp(ue,6,100)}compute(Z,ue,he){return Z.fontInfo.fontSize}}class T extends d{constructor(){super(41,"fontWeight",e.EDITOR_FONT_DEFAULTS.fontWeight,{anyOf:[{type:"number",minimum:T.MINIMUM_VALUE,maximum:T.MAXIMUM_VALUE,errorMessage:b.localize(20,null)},{type:"string",pattern:"^(normal|bold|1000|[1-9][0-9]{0,2})$"},{enum:T.SUGGESTION_VALUES}],default:e.EDITOR_FONT_DEFAULTS.fontWeight,description:b.localize(21,null)})}validate(Z){return Z==="normal"||Z==="bold"?Z:String(s.clampedInt(Z,e.EDITOR_FONT_DEFAULTS.fontWeight,T.MINIMUM_VALUE,T.MAXIMUM_VALUE))}}T.SUGGESTION_VALUES=["normal","bold","100","200","300","400","500","600","700","800","900"],T.MINIMUM_VALUE=1,T.MAXIMUM_VALUE=1e3;class O extends d{constructor(){const Z={multiple:"peek",multipleDefinitions:"peek",multipleTypeDefinitions:"peek",multipleDeclarations:"peek",multipleImplementations:"peek",multipleReferences:"peek",alternativeDefinitionCommand:"editor.action.goToReferences",alternativeTypeDefinitionCommand:"editor.action.goToReferences",alternativeDeclarationCommand:"editor.action.goToReferences",alternativeImplementationCommand:"",alternativeReferenceCommand:""},ue={type:"string",enum:["peek","gotoAndPeek","goto"],default:Z.multiple,enumDescriptions:[b.localize(22,null),b.localize(23,null),b.localize(24,null)]};super(45,"gotoLocation",Z,{"editor.gotoLocation.multiple":{deprecationMessage:b.localize(25,null)},"editor.gotoLocation.multipleDefinitions":Object.assign({description:b.localize(26,null)},ue),"editor.gotoLocation.multipleTypeDefinitions":Object.assign({description:b.localize(27,null)},ue),"editor.gotoLocation.multipleDeclarations":Object.assign({description:b.localize(28,null)},ue),"editor.gotoLocation.multipleImplementations":Object.assign({description:b.localize(29,null)},ue),"editor.gotoLocation.multipleReferences":Object.assign({description:b.localize(30,null)},ue),"editor.gotoLocation.alternativeDefinitionCommand":{type:"string",default:Z.alternativeDefinitionCommand,description:b.localize(31,null)},"editor.gotoLocation.alternativeTypeDefinitionCommand":{type:"string",default:Z.alternativeTypeDefinitionCommand,description:b.localize(32,null)},"editor.gotoLocation.alternativeDeclarationCommand":{type:"string",default:Z.alternativeDeclarationCommand,description:b.localize(33,null)},"editor.gotoLocation.alternativeImplementationCommand":{type:"string",default:Z.alternativeImplementationCommand,description:b.localize(34,null)},"editor.gotoLocation.alternativeReferenceCommand":{type:"string",default:Z.alternativeReferenceCommand,description:b.localize(35,null)}})}validate(Z){var ue,he,re,ce,me;if(!Z||typeof Z!="object")return this.defaultValue;const Ce=Z;return{multiple:r(Ce.multiple,this.defaultValue.multiple,["peek","gotoAndPeek","goto"]),multipleDefinitions:(ue=Ce.multipleDefinitions)!==null&&ue!==void 0?ue:r(Ce.multipleDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleTypeDefinitions:(he=Ce.multipleTypeDefinitions)!==null&&he!==void 0?he:r(Ce.multipleTypeDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleDeclarations:(re=Ce.multipleDeclarations)!==null&&re!==void 0?re:r(Ce.multipleDeclarations,"peek",["peek","gotoAndPeek","goto"]),multipleImplementations:(ce=Ce.multipleImplementations)!==null&&ce!==void 0?ce:r(Ce.multipleImplementations,"peek",["peek","gotoAndPeek","goto"]),multipleReferences:(me=Ce.multipleReferences)!==null&&me!==void 0?me:r(Ce.multipleReferences,"peek",["peek","gotoAndPeek","goto"]),alternativeDefinitionCommand:u.string(Ce.alternativeDefinitionCommand,this.defaultValue.alternativeDefinitionCommand),alternativeTypeDefinitionCommand:u.string(Ce.alternativeTypeDefinitionCommand,this.defaultValue.alternativeTypeDefinitionCommand),alternativeDeclarationCommand:u.string(Ce.alternativeDeclarationCommand,this.defaultValue.alternativeDeclarationCommand),alternativeImplementationCommand:u.string(Ce.alternativeImplementationCommand,this.defaultValue.alternativeImplementationCommand),alternativeReferenceCommand:u.string(Ce.alternativeReferenceCommand,this.defaultValue.alternativeReferenceCommand)}}}class A extends d{constructor(){const Z={enabled:!0,delay:300,sticky:!0};super(48,"hover",Z,{"editor.hover.enabled":{type:"boolean",default:Z.enabled,description:b.localize(36,null)},"editor.hover.delay":{type:"number",default:Z.delay,description:b.localize(37,null)},"editor.hover.sticky":{type:"boolean",default:Z.sticky,description:b.localize(38,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{enabled:c(ue.enabled,this.defaultValue.enabled),delay:s.clampedInt(ue.delay,this.defaultValue.delay,0,1e4),sticky:c(ue.sticky,this.defaultValue.sticky)}}}class B extends g{constructor(){super(124,[44,52,33,59,87,54,55,89,111,114,115,116,2])}compute(Z,ue,he){return B.computeLayout(ue,{memory:Z.memory,outerWidth:Z.outerWidth,outerHeight:Z.outerHeight,isDominatedByLongLines:Z.isDominatedByLongLines,lineHeight:Z.fontInfo.lineHeight,viewLineCount:Z.viewLineCount,lineNumbersDigitCount:Z.lineNumbersDigitCount,typicalHalfwidthCharacterWidth:Z.fontInfo.typicalHalfwidthCharacterWidth,maxDigitWidth:Z.fontInfo.maxDigitWidth,pixelRatio:Z.pixelRatio})}static computeContainedMinimapLineCount(Z){const ue=Z.height/Z.lineHeight,he=Z.scrollBeyondLastLine?ue-1:0,re=(Z.viewLineCount+he)/(Z.pixelRatio*Z.height),ce=Math.floor(Z.viewLineCount/re);return{typicalViewportLineCount:ue,extraLinesBeyondLastLine:he,desiredRatio:re,minimapLineCount:ce}}static _computeMinimapLayout(Z,ue){const he=Z.outerWidth,re=Z.outerHeight,ce=Z.pixelRatio;if(!Z.minimap.enabled)return{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:Math.floor(ce*re),minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:re};const me=ue.stableMinimapLayoutInput,Ce=me&&Z.outerHeight===me.outerHeight&&Z.lineHeight===me.lineHeight&&Z.typicalHalfwidthCharacterWidth===me.typicalHalfwidthCharacterWidth&&Z.pixelRatio===me.pixelRatio&&Z.scrollBeyondLastLine===me.scrollBeyondLastLine&&Z.minimap.enabled===me.minimap.enabled&&Z.minimap.side===me.minimap.side&&Z.minimap.size===me.minimap.size&&Z.minimap.showSlider===me.minimap.showSlider&&Z.minimap.renderCharacters===me.minimap.renderCharacters&&Z.minimap.maxColumn===me.minimap.maxColumn&&Z.minimap.scale===me.minimap.scale&&Z.verticalScrollbarWidth===me.verticalScrollbarWidth&&Z.isViewportWrapping===me.isViewportWrapping,be=Z.lineHeight,Le=Z.typicalHalfwidthCharacterWidth,De=Z.scrollBeyondLastLine,Re=Z.minimap.renderCharacters;let Ee=ce>=2?Math.round(Z.minimap.scale*2):Z.minimap.scale;const Ae=Z.minimap.maxColumn,Se=Z.minimap.size,we=Z.minimap.side,ye=Z.verticalScrollbarWidth,fe=Z.viewLineCount,de=Z.remainingWidth,ge=Z.isViewportWrapping,pe=Re?2:3;let ve=Math.floor(ce*re);const ke=ve/ce;let Ne=!1,Te=!1,Oe=pe*Ee,Fe=Ee/ce,Pe=1;if(Se==="fill"||Se==="fit"){const{typicalViewportLineCount:Ve,extraLinesBeyondLastLine:Ue,desiredRatio:Ye,minimapLineCount:je}=B.computeContainedMinimapLineCount({viewLineCount:fe,scrollBeyondLastLine:De,height:re,lineHeight:be,pixelRatio:ce});if(fe/je>1)Ne=!0,Te=!0,Ee=1,Oe=1,Fe=Ee/ce;else{let $e=!1,Ze=Ee+1;if(Se==="fit"){const Qe=Math.ceil((fe+Ue)*Oe);ge&&Ce&&de<=ue.stableFitRemainingWidth?($e=!0,Ze=ue.stableFitMaxMinimapScale):($e=Qe>ve,ge&&$e?(ue.stableMinimapLayoutInput=Z,ue.stableFitRemainingWidth=de):(ue.stableMinimapLayoutInput=null,ue.stableFitRemainingWidth=0))}if(Se==="fill"||$e){Ne=!0;const Qe=Ee;Oe=Math.min(be*ce,Math.max(1,Math.floor(1/Ye))),Ee=Math.min(Ze,Math.max(1,Math.floor(Oe/pe))),Ee>Qe&&(Pe=Math.min(2,Ee/Qe)),Fe=Ee/ce/Pe,ve=Math.ceil(Math.max(Ve,fe+Ue)*Oe),ge&&$e&&(ue.stableFitMaxMinimapScale=Ee)}}}const xe=Math.floor(Ae*Fe),We=Math.min(xe,Math.max(0,Math.floor((de-ye-2)*Fe/(Le+Fe)))+e.MINIMAP_GUTTER_WIDTH);let ze=Math.floor(ce*We);const Ke=ze/ce;ze=Math.floor(ze*Pe);const Be=Re?1:2,He=we==="left"?0:he-We-ye;return{renderMinimap:Be,minimapLeft:He,minimapWidth:We,minimapHeightIsEditorHeight:Ne,minimapIsSampling:Te,minimapScale:Ee,minimapLineHeight:Oe,minimapCanvasInnerWidth:ze,minimapCanvasInnerHeight:ve,minimapCanvasOuterWidth:Ke,minimapCanvasOuterHeight:ke}}static computeLayout(Z,ue){const he=ue.outerWidth|0,re=ue.outerHeight|0,ce=ue.lineHeight|0,me=ue.lineNumbersDigitCount|0,Ce=ue.typicalHalfwidthCharacterWidth,be=ue.maxDigitWidth,Le=ue.pixelRatio,De=ue.viewLineCount,Re=Z.get(116),Ee=Re==="inherit"?Z.get(115):Re,Ae=Ee==="inherit"?Z.get(111):Ee,Se=Z.get(114),we=Z.get(2),ye=ue.isDominatedByLongLines,fe=Z.get(44),de=Z.get(54).renderType!==0,ge=Z.get(55),pe=Z.get(89),ve=Z.get(59),ke=Z.get(87),Ne=ke.verticalScrollbarSize,Te=ke.verticalHasArrows,Oe=ke.arrowSize,Fe=ke.horizontalScrollbarSize,Pe=Z.get(52),xe=Z.get(33);let We;if(typeof Pe=="string"&&/^\d+(\.\d+)?ch$/.test(Pe)){const nt=parseFloat(Pe.substr(0,Pe.length-2));We=s.clampedInt(nt*Ce,0,0,1e3)}else We=s.clampedInt(Pe,0,0,1e3);xe&&(We+=16);let ze=0;if(de){const nt=Math.max(me,ge);ze=Math.round(nt*be)}let Ke=0;fe&&(Ke=ce);let Be=0,He=Be+Ke,Ve=He+ze,Ue=Ve+We;const Ye=he-Ke-ze-We;let je=!1,Xe=!1,$e=-1;we!==2&&(Ee==="inherit"&&ye?(je=!0,Xe=!0):Ae==="on"||Ae==="bounded"?Xe=!0:Ae==="wordWrapColumn"&&($e=Se));const Ze=B._computeMinimapLayout({outerWidth:he,outerHeight:re,lineHeight:ce,typicalHalfwidthCharacterWidth:Ce,pixelRatio:Le,scrollBeyondLastLine:pe,minimap:ve,verticalScrollbarWidth:Ne,viewLineCount:De,remainingWidth:Ye,isViewportWrapping:Xe},ue.memory||new C);Ze.renderMinimap!==0&&Ze.minimapLeft===0&&(Be+=Ze.minimapWidth,He+=Ze.minimapWidth,Ve+=Ze.minimapWidth,Ue+=Ze.minimapWidth);const Qe=Ye-Ze.minimapWidth,it=Math.max(1,Math.floor((Qe-Ne-2)/Ce)),Je=Te?Oe:0;return Xe&&($e=Math.max(1,it),Ae==="bounded"&&($e=Math.min($e,Se))),{width:he,height:re,glyphMarginLeft:Be,glyphMarginWidth:Ke,lineNumbersLeft:He,lineNumbersWidth:ze,decorationsLeft:Ve,decorationsWidth:We,contentLeft:Ue,contentWidth:Qe,minimap:Ze,viewportColumn:it,isWordWrapMinified:je,isViewportWrapping:Xe,wrappingColumn:$e,verticalScrollbarWidth:Ne,horizontalScrollbarHeight:Fe,overviewRuler:{top:Je,width:Ne,height:re-2*Je,right:0}}}}e.EditorLayoutInfoComputer=B;class F extends d{constructor(){const Z={enabled:!0};super(51,"lightbulb",Z,{"editor.lightbulb.enabled":{type:"boolean",default:Z.enabled,description:b.localize(39,null)}})}validate(Z){return!Z||typeof Z!="object"?this.defaultValue:{enabled:c(Z.enabled,this.defaultValue.enabled)}}}class D extends d{constructor(){const Z={enabled:!0,fontSize:0,fontFamily:e.EDITOR_FONT_DEFAULTS.fontFamily};super(120,"inlineHints",Z,{"editor.inlineHints.enabled":{type:"boolean",default:Z.enabled,description:b.localize(40,null)},"editor.inlineHints.fontSize":{type:"number",default:Z.fontSize,description:b.localize(41,null)},"editor.inlineHints.fontFamily":{type:"string",default:Z.fontFamily,description:b.localize(42,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{enabled:c(ue.enabled,this.defaultValue.enabled),fontSize:s.clampedInt(ue.fontSize,this.defaultValue.fontSize,0,100),fontFamily:u.string(ue.fontFamily,this.defaultValue.fontFamily)}}}class R extends s{constructor(){super(53,"lineHeight",e.EDITOR_FONT_DEFAULTS.lineHeight,0,150,{description:b.localize(43,null)})}compute(Z,ue,he){return Z.fontInfo.lineHeight}}class W extends d{constructor(){const Z={enabled:!0,size:"proportional",side:"right",showSlider:"mouseover",renderCharacters:!0,maxColumn:120,scale:1};super(59,"minimap",Z,{"editor.minimap.enabled":{type:"boolean",default:Z.enabled,description:b.localize(44,null)},"editor.minimap.size":{type:"string",enum:["proportional","fill","fit"],enumDescriptions:[b.localize(45,null),b.localize(46,null),b.localize(47,null)],default:Z.size,description:b.localize(48,null)},"editor.minimap.side":{type:"string",enum:["left","right"],default:Z.side,description:b.localize(49,null)},"editor.minimap.showSlider":{type:"string",enum:["always","mouseover"],default:Z.showSlider,description:b.localize(50,null)},"editor.minimap.scale":{type:"number",default:Z.scale,minimum:1,maximum:3,enum:[1,2,3],description:b.localize(51,null)},"editor.minimap.renderCharacters":{type:"boolean",default:Z.renderCharacters,description:b.localize(52,null)},"editor.minimap.maxColumn":{type:"number",default:Z.maxColumn,description:b.localize(53,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{enabled:c(ue.enabled,this.defaultValue.enabled),size:r(ue.size,this.defaultValue.size,["proportional","fill","fit"]),side:r(ue.side,this.defaultValue.side,["right","left"]),showSlider:r(ue.showSlider,this.defaultValue.showSlider,["always","mouseover"]),renderCharacters:c(ue.renderCharacters,this.defaultValue.renderCharacters),scale:s.clampedInt(ue.scale,1,1,3),maxColumn:s.clampedInt(ue.maxColumn,this.defaultValue.maxColumn,1,1e4)}}}function x(te){return te==="ctrlCmd"?N.isMacintosh?"metaKey":"ctrlKey":"altKey"}class K extends d{constructor(){super(69,"padding",{top:0,bottom:0},{"editor.padding.top":{type:"number",default:0,minimum:0,maximum:1e3,description:b.localize(54,null)},"editor.padding.bottom":{type:"number",default:0,minimum:0,maximum:1e3,description:b.localize(55,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{top:s.clampedInt(ue.top,0,0,1e3),bottom:s.clampedInt(ue.bottom,0,0,1e3)}}}class Y extends d{constructor(){const Z={enabled:!0,cycle:!1};super(70,"parameterHints",Z,{"editor.parameterHints.enabled":{type:"boolean",default:Z.enabled,description:b.localize(56,null)},"editor.parameterHints.cycle":{type:"boolean",default:Z.cycle,description:b.localize(57,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{enabled:c(ue.enabled,this.defaultValue.enabled),cycle:c(ue.cycle,this.defaultValue.cycle)}}}class ee extends g{constructor(){super(122)}compute(Z,ue,he){return Z.pixelRatio}}class se extends d{constructor(){const Z={other:!0,comments:!1,strings:!1};super(73,"quickSuggestions",Z,{anyOf:[{type:"boolean"},{type:"object",properties:{strings:{type:"boolean",default:Z.strings,description:b.localize(58,null)},comments:{type:"boolean",default:Z.comments,description:b.localize(59,null)},other:{type:"boolean",default:Z.other,description:b.localize(60,null)}}}],default:Z,description:b.localize(61,null)});this.defaultValue=Z}validate(Z){if(typeof Z=="boolean")return Z;if(Z&&typeof Z=="object"){const ue=Z,he={other:c(ue.other,this.defaultValue.other),comments:c(ue.comments,this.defaultValue.comments),strings:c(ue.strings,this.defaultValue.strings)};return he.other&&he.comments&&he.strings?!0:!he.other&&!he.comments&&!he.strings?!1:he}return this.defaultValue}}class ne extends d{constructor(){super(54,"lineNumbers",{renderType:1,renderFn:null},{type:"string",enum:["off","on","relative","interval"],enumDescriptions:[b.localize(62,null),b.localize(63,null),b.localize(64,null),b.localize(65,null)],default:"on",description:b.localize(66,null)})}validate(Z){let ue=this.defaultValue.renderType,he=this.defaultValue.renderFn;return typeof Z!="undefined"&&(typeof Z=="function"?(ue=4,he=Z):Z==="interval"?ue=3:Z==="relative"?ue=2:Z==="on"?ue=1:ue=0),{renderType:ue,renderFn:he}}}function le(te){const Z=te.get(82);return Z==="editable"?te.get(75):Z!=="on"}e.filterValidationDecorations=le;class X extends d{constructor(){const Z=[],ue={type:"number",description:b.localize(67,null)};super(86,"rulers",Z,{type:"array",items:{anyOf:[ue,{type:["object"],properties:{column:ue,color:{type:"string",description:b.localize(68,null),format:"color-hex"}}}]},default:Z,description:b.localize(69,null)})}validate(Z){if(Array.isArray(Z)){let ue=[];for(let he of Z)if(typeof he=="number")ue.push({column:s.clampedInt(he,0,0,1e4),color:null});else if(he&&typeof he=="object"){const re=he;ue.push({column:s.clampedInt(re.column,0,0,1e4),color:re.color})}return ue.sort((he,re)=>he.column-re.column),ue}return this.defaultValue}}function z(te,Z){if(typeof te!="string")return Z;switch(te){case"hidden":return 2;case"visible":return 3;default:return 1}}class P extends d{constructor(){super(87,"scrollbar",{vertical:1,horizontal:1,arrowSize:11,useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,horizontalScrollbarSize:12,horizontalSliderSize:12,verticalScrollbarSize:14,verticalSliderSize:14,handleMouseWheel:!0,alwaysConsumeMouseWheel:!0,scrollByPage:!1})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z,he=s.clampedInt(ue.horizontalScrollbarSize,this.defaultValue.horizontalScrollbarSize,0,1e3),re=s.clampedInt(ue.verticalScrollbarSize,this.defaultValue.verticalScrollbarSize,0,1e3);return{arrowSize:s.clampedInt(ue.arrowSize,this.defaultValue.arrowSize,0,1e3),vertical:z(ue.vertical,this.defaultValue.vertical),horizontal:z(ue.horizontal,this.defaultValue.horizontal),useShadows:c(ue.useShadows,this.defaultValue.useShadows),verticalHasArrows:c(ue.verticalHasArrows,this.defaultValue.verticalHasArrows),horizontalHasArrows:c(ue.horizontalHasArrows,this.defaultValue.horizontalHasArrows),handleMouseWheel:c(ue.handleMouseWheel,this.defaultValue.handleMouseWheel),alwaysConsumeMouseWheel:c(ue.alwaysConsumeMouseWheel,this.defaultValue.alwaysConsumeMouseWheel),horizontalScrollbarSize:he,horizontalSliderSize:s.clampedInt(ue.horizontalSliderSize,he,0,1e3),verticalScrollbarSize:re,verticalSliderSize:s.clampedInt(ue.verticalSliderSize,re,0,1e3),scrollByPage:c(ue.scrollByPage,this.defaultValue.scrollByPage)}}}class V extends d{constructor(){const Z={insertMode:"insert",filterGraceful:!0,snippetsPreventQuickSuggestions:!0,localityBonus:!1,shareSuggestSelections:!1,showIcons:!0,showStatusBar:!1,showInlineDetails:!0,showMethods:!0,showFunctions:!0,showConstructors:!0,showFields:!0,showVariables:!0,showClasses:!0,showStructs:!0,showInterfaces:!0,showModules:!0,showProperties:!0,showEvents:!0,showOperators:!0,showUnits:!0,showValues:!0,showConstants:!0,showEnums:!0,showEnumMembers:!0,showKeywords:!0,showWords:!0,showColors:!0,showFiles:!0,showReferences:!0,showFolders:!0,showTypeParameters:!0,showSnippets:!0,showUsers:!0,showIssues:!0};super(101,"suggest",Z,{"editor.suggest.insertMode":{type:"string",enum:["insert","replace"],enumDescriptions:[b.localize(70,null),b.localize(71,null)],default:Z.insertMode,description:b.localize(72,null)},"editor.suggest.filterGraceful":{type:"boolean",default:Z.filterGraceful,description:b.localize(73,null)},"editor.suggest.localityBonus":{type:"boolean",default:Z.localityBonus,description:b.localize(74,null)},"editor.suggest.shareSuggestSelections":{type:"boolean",default:Z.shareSuggestSelections,markdownDescription:b.localize(75,null)},"editor.suggest.snippetsPreventQuickSuggestions":{type:"boolean",default:Z.snippetsPreventQuickSuggestions,description:b.localize(76,null)},"editor.suggest.showIcons":{type:"boolean",default:Z.showIcons,description:b.localize(77,null)},"editor.suggest.showStatusBar":{type:"boolean",default:Z.showStatusBar,description:b.localize(78,null)},"editor.suggest.showInlineDetails":{type:"boolean",default:Z.showInlineDetails,description:b.localize(79,null)},"editor.suggest.maxVisibleSuggestions":{type:"number",deprecationMessage:b.localize(80,null)},"editor.suggest.filteredTypes":{type:"object",deprecationMessage:b.localize(81,null)},"editor.suggest.showMethods":{type:"boolean",default:!0,markdownDescription:b.localize(82,null)},"editor.suggest.showFunctions":{type:"boolean",default:!0,markdownDescription:b.localize(83,null)},"editor.suggest.showConstructors":{type:"boolean",default:!0,markdownDescription:b.localize(84,null)},"editor.suggest.showFields":{type:"boolean",default:!0,markdownDescription:b.localize(85,null)},"editor.suggest.showVariables":{type:"boolean",default:!0,markdownDescription:b.localize(86,null)},"editor.suggest.showClasses":{type:"boolean",default:!0,markdownDescription:b.localize(87,null)},"editor.suggest.showStructs":{type:"boolean",default:!0,markdownDescription:b.localize(88,null)},"editor.suggest.showInterfaces":{type:"boolean",default:!0,markdownDescription:b.localize(89,null)},"editor.suggest.showModules":{type:"boolean",default:!0,markdownDescription:b.localize(90,null)},"editor.suggest.showProperties":{type:"boolean",default:!0,markdownDescription:b.localize(91,null)},"editor.suggest.showEvents":{type:"boolean",default:!0,markdownDescription:b.localize(92,null)},"editor.suggest.showOperators":{type:"boolean",default:!0,markdownDescription:b.localize(93,null)},"editor.suggest.showUnits":{type:"boolean",default:!0,markdownDescription:b.localize(94,null)},"editor.suggest.showValues":{type:"boolean",default:!0,markdownDescription:b.localize(95,null)},"editor.suggest.showConstants":{type:"boolean",default:!0,markdownDescription:b.localize(96,null)},"editor.suggest.showEnums":{type:"boolean",default:!0,markdownDescription:b.localize(97,null)},"editor.suggest.showEnumMembers":{type:"boolean",default:!0,markdownDescription:b.localize(98,null)},"editor.suggest.showKeywords":{type:"boolean",default:!0,markdownDescription:b.localize(99,null)},"editor.suggest.showWords":{type:"boolean",default:!0,markdownDescription:b.localize(100,null)},"editor.suggest.showColors":{type:"boolean",default:!0,markdownDescription:b.localize(101,null)},"editor.suggest.showFiles":{type:"boolean",default:!0,markdownDescription:b.localize(102,null)},"editor.suggest.showReferences":{type:"boolean",default:!0,markdownDescription:b.localize(103,null)},"editor.suggest.showCustomcolors":{type:"boolean",default:!0,markdownDescription:b.localize(104,null)},"editor.suggest.showFolders":{type:"boolean",default:!0,markdownDescription:b.localize(105,null)},"editor.suggest.showTypeParameters":{type:"boolean",default:!0,markdownDescription:b.localize(106,null)},"editor.suggest.showSnippets":{type:"boolean",default:!0,markdownDescription:b.localize(107,null)},"editor.suggest.showUsers":{type:"boolean",default:!0,markdownDescription:b.localize(108,null)},"editor.suggest.showIssues":{type:"boolean",default:!0,markdownDescription:b.localize(109,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{insertMode:r(ue.insertMode,this.defaultValue.insertMode,["insert","replace"]),filterGraceful:c(ue.filterGraceful,this.defaultValue.filterGraceful),snippetsPreventQuickSuggestions:c(ue.snippetsPreventQuickSuggestions,this.defaultValue.filterGraceful),localityBonus:c(ue.localityBonus,this.defaultValue.localityBonus),shareSuggestSelections:c(ue.shareSuggestSelections,this.defaultValue.shareSuggestSelections),showIcons:c(ue.showIcons,this.defaultValue.showIcons),showStatusBar:c(ue.showStatusBar,this.defaultValue.showStatusBar),showInlineDetails:c(ue.showInlineDetails,this.defaultValue.showInlineDetails),showMethods:c(ue.showMethods,this.defaultValue.showMethods),showFunctions:c(ue.showFunctions,this.defaultValue.showFunctions),showConstructors:c(ue.showConstructors,this.defaultValue.showConstructors),showFields:c(ue.showFields,this.defaultValue.showFields),showVariables:c(ue.showVariables,this.defaultValue.showVariables),showClasses:c(ue.showClasses,this.defaultValue.showClasses),showStructs:c(ue.showStructs,this.defaultValue.showStructs),showInterfaces:c(ue.showInterfaces,this.defaultValue.showInterfaces),showModules:c(ue.showModules,this.defaultValue.showModules),showProperties:c(ue.showProperties,this.defaultValue.showProperties),showEvents:c(ue.showEvents,this.defaultValue.showEvents),showOperators:c(ue.showOperators,this.defaultValue.showOperators),showUnits:c(ue.showUnits,this.defaultValue.showUnits),showValues:c(ue.showValues,this.defaultValue.showValues),showConstants:c(ue.showConstants,this.defaultValue.showConstants),showEnums:c(ue.showEnums,this.defaultValue.showEnums),showEnumMembers:c(ue.showEnumMembers,this.defaultValue.showEnumMembers),showKeywords:c(ue.showKeywords,this.defaultValue.showKeywords),showWords:c(ue.showWords,this.defaultValue.showWords),showColors:c(ue.showColors,this.defaultValue.showColors),showFiles:c(ue.showFiles,this.defaultValue.showFiles),showReferences:c(ue.showReferences,this.defaultValue.showReferences),showFolders:c(ue.showFolders,this.defaultValue.showFolders),showTypeParameters:c(ue.showTypeParameters,this.defaultValue.showTypeParameters),showSnippets:c(ue.showSnippets,this.defaultValue.showSnippets),showUsers:c(ue.showUsers,this.defaultValue.showUsers),showIssues:c(ue.showIssues,this.defaultValue.showIssues)}}}class U extends d{constructor(){super(97,"smartSelect",{selectLeadingAndTrailingWhitespace:!0},{"editor.smartSelect.selectLeadingAndTrailingWhitespace":{description:b.localize(110,null),default:!0,type:"boolean"}})}validate(Z){return!Z||typeof Z!="object"?this.defaultValue:{selectLeadingAndTrailingWhitespace:c(Z.selectLeadingAndTrailingWhitespace,this.defaultValue.selectLeadingAndTrailingWhitespace)}}}class H extends g{constructor(){super(123,[75])}compute(Z,ue,he){return ue.get(75)?!0:Z.tabFocusMode}}function $(te){switch(te){case"none":return 0;case"same":return 1;case"indent":return 2;case"deepIndent":return 3}}class ie extends g{constructor(){super(125,[124])}compute(Z,ue,he){const re=ue.get(124);return{isDominatedByLongLines:Z.isDominatedByLongLines,isWordWrapMinified:re.isWordWrapMinified,isViewportWrapping:re.isViewportWrapping,wrappingColumn:re.wrappingColumn}}}const oe="Consolas, 'Courier New', monospace",ae="Menlo, Monaco, 'Courier New', monospace",G="'Droid Sans Mono', 'monospace', monospace, 'Droid Sans Fallback'";e.EDITOR_FONT_DEFAULTS={fontFamily:N.isMacintosh?ae:N.isLinux?G:oe,fontWeight:"normal",fontSize:N.isMacintosh?12:14,lineHeight:0,letterSpacing:0},e.EDITOR_MODEL_DEFAULTS={tabSize:4,indentSize:4,insertSpaces:!0,detectIndentation:!0,trimAutoWhitespace:!0,largeFileOptimizations:!0},e.editorOptionsRegistry=[];function j(te){return e.editorOptionsRegistry[te.id]=te,te}e.EditorOptions={acceptSuggestionOnCommitCharacter:j(new o(0,"acceptSuggestionOnCommitCharacter",!0,{markdownDescription:b.localize(111,null)})),acceptSuggestionOnEnter:j(new i(1,"acceptSuggestionOnEnter","on",["on","smart","off"],{markdownEnumDescriptions:["",b.localize(112,null),""],markdownDescription:b.localize(113,null)})),accessibilitySupport:j(new l),accessibilityPageSize:j(new s(3,"accessibilityPageSize",10,1,1073741824,{description:b.localize(114,null)})),ariaLabel:j(new u(4,"ariaLabel",b.localize(115,null))),autoClosingBrackets:j(new i(5,"autoClosingBrackets","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",b.localize(116,null),b.localize(117,null),""],description:b.localize(118,null)})),autoClosingOvertype:j(new i(6,"autoClosingOvertype","auto",["always","auto","never"],{enumDescriptions:["",b.localize(119,null),""],description:b.localize(120,null)})),autoClosingQuotes:j(new i(7,"autoClosingQuotes","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",b.localize(121,null),b.localize(122,null),""],description:b.localize(123,null)})),autoIndent:j(new n(8,"autoIndent",4,"full",["none","keep","brackets","advanced","full"],t,{enumDescriptions:[b.localize(124,null),b.localize(125,null),b.localize(126,null),b.localize(127,null),b.localize(128,null)],description:b.localize(129,null)})),automaticLayout:j(new o(9,"automaticLayout",!1)),autoSurround:j(new i(10,"autoSurround","languageDefined",["languageDefined","quotes","brackets","never"],{enumDescriptions:[b.localize(130,null),b.localize(131,null),b.localize(132,null),""],description:b.localize(133,null)})),stickyTabStops:j(new o(99,"stickyTabStops",!1,{description:b.localize(134,null)})),codeLens:j(new o(11,"codeLens",!0,{description:b.localize(135,null)})),codeLensFontFamily:j(new u(12,"codeLensFontFamily","",{description:b.localize(136,null)})),codeLensFontSize:j(new s(13,"codeLensFontSize",0,0,100,{type:"number",default:0,minimum:0,maximum:100,description:b.localize(137,null)})),colorDecorators:j(new o(14,"colorDecorators",!0,{description:b.localize(138,null)})),columnSelection:j(new o(15,"columnSelection",!1,{description:b.localize(139,null)})),comments:j(new h),contextmenu:j(new o(17,"contextmenu",!0)),copyWithSyntaxHighlighting:j(new o(18,"copyWithSyntaxHighlighting",!0,{description:b.localize(140,null)})),cursorBlinking:j(new n(19,"cursorBlinking",1,"blink",["blink","smooth","phase","expand","solid"],m,{description:b.localize(141,null)})),cursorSmoothCaretAnimation:j(new o(20,"cursorSmoothCaretAnimation",!1,{description:b.localize(142,null)})),cursorStyle:j(new n(21,"cursorStyle",_.Line,"line",["line","block","underline","line-thin","block-outline","underline-thin"],f,{description:b.localize(143,null)})),cursorSurroundingLines:j(new s(22,"cursorSurroundingLines",0,0,1073741824,{description:b.localize(144,null)})),cursorSurroundingLinesStyle:j(new i(23,"cursorSurroundingLinesStyle","default",["default","all"],{enumDescriptions:[b.localize(145,null),b.localize(146,null)],description:b.localize(147,null)})),cursorWidth:j(new s(24,"cursorWidth",0,0,1073741824,{markdownDescription:b.localize(148,null)})),disableLayerHinting:j(new o(25,"disableLayerHinting",!1)),disableMonospaceOptimizations:j(new o(26,"disableMonospaceOptimizations",!1)),dragAndDrop:j(new o(27,"dragAndDrop",!0,{description:b.localize(149,null)})),emptySelectionClipboard:j(new y),extraEditorClassName:j(new u(29,"extraEditorClassName","")),fastScrollSensitivity:j(new a(30,"fastScrollSensitivity",5,te=>te<=0?5:te,{markdownDescription:b.localize(150,null)})),find:j(new L),fixedOverflowWidgets:j(new o(32,"fixedOverflowWidgets",!1)),folding:j(new o(33,"folding",!0,{description:b.localize(151,null)})),foldingStrategy:j(new i(34,"foldingStrategy","auto",["auto","indentation"],{enumDescriptions:[b.localize(152,null),b.localize(153,null)],description:b.localize(154,null)})),foldingHighlight:j(new o(35,"foldingHighlight",!0,{description:b.localize(155,null)})),unfoldOnClickAfterEndOfLine:j(new o(36,"unfoldOnClickAfterEndOfLine",!1,{description:b.localize(156,null)})),fontFamily:j(new u(37,"fontFamily",e.EDITOR_FONT_DEFAULTS.fontFamily,{description:b.localize(157,null)})),fontInfo:j(new k),fontLigatures2:j(new I),fontSize:j(new E),fontWeight:j(new T),formatOnPaste:j(new o(42,"formatOnPaste",!1,{description:b.localize(158,null)})),formatOnType:j(new o(43,"formatOnType",!1,{description:b.localize(159,null)})),glyphMargin:j(new o(44,"glyphMargin",!0,{description:b.localize(160,null)})),gotoLocation:j(new O),hideCursorInOverviewRuler:j(new o(46,"hideCursorInOverviewRuler",!1,{description:b.localize(161,null)})),highlightActiveIndentGuide:j(new o(47,"highlightActiveIndentGuide",!0,{description:b.localize(162,null)})),hover:j(new A),inDiffEditor:j(new o(49,"inDiffEditor",!1)),letterSpacing:j(new a(50,"letterSpacing",e.EDITOR_FONT_DEFAULTS.letterSpacing,te=>a.clamp(te,-5,20),{description:b.localize(163,null)})),lightbulb:j(new F),lineDecorationsWidth:j(new p(52,"lineDecorationsWidth",10)),lineHeight:j(new R),lineNumbers:j(new ne),lineNumbersMinChars:j(new s(55,"lineNumbersMinChars",5,1,300)),linkedEditing:j(new o(56,"linkedEditing",!1,{description:b.localize(164,null)})),links:j(new o(57,"links",!0,{description:b.localize(165,null)})),matchBrackets:j(new i(58,"matchBrackets","always",["always","near","never"],{description:b.localize(166,null)})),minimap:j(new W),mouseStyle:j(new i(60,"mouseStyle","text",["text","default","copy"])),mouseWheelScrollSensitivity:j(new a(61,"mouseWheelScrollSensitivity",1,te=>te===0?1:te,{markdownDescription:b.localize(167,null)})),mouseWheelZoom:j(new o(62,"mouseWheelZoom",!1,{markdownDescription:b.localize(168,null)})),multiCursorMergeOverlapping:j(new o(63,"multiCursorMergeOverlapping",!0,{description:b.localize(169,null)})),multiCursorModifier:j(new n(64,"multiCursorModifier","altKey","alt",["ctrlCmd","alt"],x,{markdownEnumDescriptions:[b.localize(170,null),b.localize(171,null)],markdownDescription:b.localize(172,null)})),multiCursorPaste:j(new i(65,"multiCursorPaste","spread",["spread","full"],{markdownEnumDescriptions:[b.localize(173,null),b.localize(174,null)],markdownDescription:b.localize(175,null)})),occurrencesHighlight:j(new o(66,"occurrencesHighlight",!0,{description:b.localize(176,null)})),overviewRulerBorder:j(new o(67,"overviewRulerBorder",!0,{description:b.localize(177,null)})),overviewRulerLanes:j(new s(68,"overviewRulerLanes",3,0,3)),padding:j(new K),parameterHints:j(new Y),peekWidgetDefaultFocus:j(new i(71,"peekWidgetDefaultFocus","tree",["tree","editor"],{enumDescriptions:[b.localize(178,null),b.localize(179,null)],description:b.localize(180,null)})),definitionLinkOpensInPeek:j(new o(72,"definitionLinkOpensInPeek",!1,{description:b.localize(181,null)})),quickSuggestions:j(new se),quickSuggestionsDelay:j(new s(74,"quickSuggestionsDelay",10,0,1073741824,{description:b.localize(182,null)})),readOnly:j(new o(75,"readOnly",!1)),renameOnType:j(new o(76,"renameOnType",!1,{description:b.localize(183,null),markdownDeprecationMessage:b.localize(184,null)})),renderControlCharacters:j(new o(77,"renderControlCharacters",!1,{description:b.localize(185,null)})),renderIndentGuides:j(new o(78,"renderIndentGuides",!0,{description:b.localize(186,null)})),renderFinalNewline:j(new o(79,"renderFinalNewline",!0,{description:b.localize(187,null)})),renderLineHighlight:j(new i(80,"renderLineHighlight","line",["none","gutter","line","all"],{enumDescriptions:["","","",b.localize(188,null)],description:b.localize(189,null)})),renderLineHighlightOnlyWhenFocus:j(new o(81,"renderLineHighlightOnlyWhenFocus",!1,{description:b.localize(190,null)})),renderValidationDecorations:j(new i(82,"renderValidationDecorations","editable",["editable","on","off"])),renderWhitespace:j(new i(83,"renderWhitespace","selection",["none","boundary","selection","trailing","all"],{enumDescriptions:["",b.localize(191,null),b.localize(192,null),b.localize(193,null),""],description:b.localize(194,null)})),revealHorizontalRightPadding:j(new s(84,"revealHorizontalRightPadding",30,0,1e3)),roundedSelection:j(new o(85,"roundedSelection",!0,{description:b.localize(195,null)})),rulers:j(new X),scrollbar:j(new P),scrollBeyondLastColumn:j(new s(88,"scrollBeyondLastColumn",5,0,1073741824,{description:b.localize(196,null)})),scrollBeyondLastLine:j(new o(89,"scrollBeyondLastLine",!0,{description:b.localize(197,null)})),scrollPredominantAxis:j(new o(90,"scrollPredominantAxis",!0,{description:b.localize(198,null)})),selectionClipboard:j(new o(91,"selectionClipboard",!0,{description:b.localize(199,null),included:N.isLinux})),selectionHighlight:j(new o(92,"selectionHighlight",!0,{description:b.localize(200,null)})),selectOnLineNumbers:j(new o(93,"selectOnLineNumbers",!0)),showFoldingControls:j(new i(94,"showFoldingControls","mouseover",["always","mouseover"],{enumDescriptions:[b.localize(201,null),b.localize(202,null)],description:b.localize(203,null)})),showUnused:j(new o(95,"showUnused",!0,{description:b.localize(204,null)})),showDeprecated:j(new o(119,"showDeprecated",!0,{description:b.localize(205,null)})),inlineHints:j(new D),snippetSuggestions:j(new i(96,"snippetSuggestions","inline",["top","bottom","inline","none"],{enumDescriptions:[b.localize(206,null),b.localize(207,null),b.localize(208,null),b.localize(209,null)],description:b.localize(210,null)})),smartSelect:j(new U),smoothScrolling:j(new o(98,"smoothScrolling",!1,{description:b.localize(211,null)})),stopRenderingLineAfter:j(new s(100,"stopRenderingLineAfter",1e4,-1,1073741824)),suggest:j(new V),suggestFontSize:j(new s(102,"suggestFontSize",0,0,1e3,{markdownDescription:b.localize(212,null)})),suggestLineHeight:j(new s(103,"suggestLineHeight",0,0,1e3,{markdownDescription:b.localize(213,null)})),suggestOnTriggerCharacters:j(new o(104,"suggestOnTriggerCharacters",!0,{description:b.localize(214,null)})),suggestSelection:j(new i(105,"suggestSelection","recentlyUsed",["first","recentlyUsed","recentlyUsedByPrefix"],{markdownEnumDescriptions:[b.localize(215,null),b.localize(216,null),b.localize(217,null)],description:b.localize(218,null)})),tabCompletion:j(new i(106,"tabCompletion","off",["on","off","onlySnippets"],{enumDescriptions:[b.localize(219,null),b.localize(220,null),b.localize(221,null)],description:b.localize(222,null)})),tabIndex:j(new s(107,"tabIndex",0,-1,1073741824)),unusualLineTerminators:j(new i(108,"unusualLineTerminators","prompt",["auto","off","prompt"],{enumDescriptions:[b.localize(223,null),b.localize(224,null),b.localize(225,null)],description:b.localize(226,null)})),useTabStops:j(new o(109,"useTabStops",!0,{description:b.localize(227,null)})),wordSeparators:j(new u(110,"wordSeparators",M.USUAL_WORD_SEPARATORS,{description:b.localize(228,null)})),wordWrap:j(new i(111,"wordWrap","off",["off","on","wordWrapColumn","bounded"],{markdownEnumDescriptions:[b.localize(229,null),b.localize(230,null),b.localize(231,null),b.localize(232,null)],description:b.localize(233,null)})),wordWrapBreakAfterCharacters:j(new u(112,"wordWrapBreakAfterCharacters"," })]?|/&.,;\xA2\xB0\u2032\u2033\u2030\u2103\u3001\u3002\uFF61\uFF64\uFFE0\uFF0C\uFF0E\uFF1A\uFF1B\uFF1F\uFF01\uFF05\u30FB\uFF65\u309D\u309E\u30FD\u30FE\u30FC\u30A1\u30A3\u30A5\u30A7\u30A9\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u3041\u3043\u3045\u3047\u3049\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u31F0\u31F1\u31F2\u31F3\u31F4\u31F5\u31F6\u31F7\u31F8\u31F9\u31FA\u31FB\u31FC\u31FD\u31FE\u31FF\u3005\u303B\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF70\u201D\u3009\u300B\u300D\u300F\u3011\u3015\uFF09\uFF3D\uFF5D\uFF63")),wordWrapBreakBeforeCharacters:j(new u(113,"wordWrapBreakBeforeCharacters","([{\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\xA3\xA5\uFF04\uFFE1\uFFE5+\uFF0B")),wordWrapColumn:j(new s(114,"wordWrapColumn",80,1,1073741824,{markdownDescription:b.localize(234,null)})),wordWrapOverride1:j(new i(115,"wordWrapOverride1","inherit",["off","on","inherit"])),wordWrapOverride2:j(new i(116,"wordWrapOverride2","inherit",["off","on","inherit"])),wrappingIndent:j(new n(117,"wrappingIndent",1,"same",["none","same","indent","deepIndent"],$,{enumDescriptions:[b.localize(235,null),b.localize(236,null),b.localize(237,null),b.localize(238,null)],description:b.localize(239,null)})),wrappingStrategy:j(new i(118,"wrappingStrategy","simple",["simple","advanced"],{enumDescriptions:[b.localize(240,null),b.localize(241,null)],description:b.localize(242,null)})),editorClassName:j(new v),pixelRatio:j(new ee),tabFocusMode:j(new H),layoutInfo:j(new B),wrappingInfo:j(new ie)}}),define(Q[455],J([0,1,14,3,63,38]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModelDecorations=void 0;class S{constructor(d,g,p,c,o){this.editorId=d,this.model=g,this.configuration=p,this._linesCollection=c,this._coordinatesConverter=o,this._decorationsCache=Object.create(null),this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}_clearCachedModelDecorationsResolver(){this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}dispose(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}reset(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onModelDecorationsChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onLineMappingChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}_getOrCreateViewModelDecoration(d){const g=d.id;let p=this._decorationsCache[g];if(!p){const c=d.range,o=d.options;let s;if(o.isWholeLine){const a=this._coordinatesConverter.convertModelPositionToViewPosition(new b.Position(c.startLineNumber,1)),u=this._coordinatesConverter.convertModelPositionToViewPosition(new b.Position(c.endLineNumber,this.model.getLineMaxColumn(c.endLineNumber)));s=new N.Range(a.lineNumber,a.column,u.lineNumber,u.column)}else s=this._coordinatesConverter.convertModelRangeToViewRange(c);p=new M.ViewModelDecoration(s,o),this._decorationsCache[g]=p}return p}getDecorationsViewportData(d){let g=this._cachedModelDecorationsResolver!==null;return g=g&&d.equalsRange(this._cachedModelDecorationsResolverViewRange),g||(this._cachedModelDecorationsResolver=this._getDecorationsViewportData(d),this._cachedModelDecorationsResolverViewRange=d),this._cachedModelDecorationsResolver}_getDecorationsViewportData(d){const g=this._linesCollection.getDecorationsInRange(d,this.editorId,w.filterValidationDecorations(this.configuration.options)),p=d.startLineNumber,c=d.endLineNumber;let o=[],s=0,a=[];for(let u=p;u<=c;u++)a[u-p]=[];for(let u=0,r=g.length;u0&&(this.changes=S.compressConsecutiveTextChanges(this.changes,n)),this.afterEOL=t,this.afterVersionId=l,this.afterCursorState=h}static _writeSelectionsSize(i){return 4+4*4*(i?i.length:0)}static _writeSelections(i,n,t){if(C.writeUInt32BE(i,n?n.length:0,t),t+=4,n)for(const l of n)C.writeUInt32BE(i,l.selectionStartLineNumber,t),t+=4,C.writeUInt32BE(i,l.selectionStartColumn,t),t+=4,C.writeUInt32BE(i,l.positionLineNumber,t),t+=4,C.writeUInt32BE(i,l.positionColumn,t),t+=4;return t}static _readSelections(i,n,t){const l=C.readUInt32BE(i,n);n+=4;for(let h=0;hn.toString()).join(", ")}matchesResource(i){return(w.URI.isUri(this.model)?this.model:this.model.uri).toString()===i.toString()}setModel(i){this.model=i}canAppend(i){return this.model===i&&this._data instanceof p}append(i,n,t,l,h){this._data instanceof p&&this._data.append(i,n,t,l,h)}close(){this._data instanceof p&&(this._data=this._data.serialize())}open(){this._data instanceof p||(this._data=p.deserialize(this._data))}undo(){if(w.URI.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof p&&(this._data=this._data.serialize());const i=p.deserialize(this._data);this.model._applyUndo(i.changes,i.beforeEOL,i.beforeVersionId,i.beforeCursorState)}redo(){if(w.URI.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof p&&(this._data=this._data.serialize());const i=p.deserialize(this._data);this.model._applyRedo(i.changes,i.afterEOL,i.afterVersionId,i.afterCursorState)}heapSize(){return this._data instanceof p&&(this._data=this._data.serialize()),this._data.byteLength+168}}e.SingleModelEditStackElement=c;class o{constructor(i,n){this.type=1,this.label=i,this._isOpen=!0,this._editStackElementsArr=n.slice(0),this._editStackElementsMap=new Map;for(const t of this._editStackElementsArr){const l=g(t.resource);this._editStackElementsMap.set(l,t)}this._delegate=null}get resources(){return this._editStackElementsArr.map(i=>i.resource)}prepareUndoRedo(){if(this._delegate)return this._delegate.prepareUndoRedo(this)}matchesResource(i){const n=g(i);return this._editStackElementsMap.has(n)}setModel(i){const n=g(w.URI.isUri(i)?i:i.uri);this._editStackElementsMap.has(n)&&this._editStackElementsMap.get(n).setModel(i)}canAppend(i){if(!this._isOpen)return!1;const n=g(i.uri);return this._editStackElementsMap.has(n)?this._editStackElementsMap.get(n).canAppend(i):!1}append(i,n,t,l,h){const m=g(i.uri);this._editStackElementsMap.get(m).append(i,n,t,l,h)}close(){this._isOpen=!1}open(){}undo(){this._isOpen=!1;for(const i of this._editStackElementsArr)i.undo()}redo(){for(const i of this._editStackElementsArr)i.redo()}heapSize(i){const n=g(i);return this._editStackElementsMap.has(n)?this._editStackElementsMap.get(n).heapSize():0}split(){return this._editStackElementsArr}toString(){let i=[];for(const n of this._editStackElementsArr)i.push(`${d.basename(n.resource)}: ${n}`);return`{${i.join(", ")}}`}}e.MultiModelEditStackElement=o;function s(r){return r.getEOL()===` +`?0:1}function a(r){return r?r instanceof c||r instanceof o:!1}e.isEditStackElement=a;class u{constructor(i,n){this._model=i,this._undoRedoService=n}pushStackElement(){const i=this._undoRedoService.getLastElement(this._model.uri);a(i)&&i.close()}popStackElement(){const i=this._undoRedoService.getLastElement(this._model.uri);a(i)&&i.open()}clear(){this._undoRedoService.removeElements(this._model.uri)}_getOrCreateEditStackElement(i){const n=this._undoRedoService.getLastElement(this._model.uri);if(a(n)&&n.canAppend(this._model))return n;const t=new c(this._model,i);return this._undoRedoService.pushElement(t),t}pushEOL(i){const n=this._getOrCreateEditStackElement(null);this._model.setEOL(i),n.append(this._model,[],s(this._model),this._model.getAlternativeVersionId(),null)}pushEditOperation(i,n,t){const l=this._getOrCreateEditStackElement(i),h=this._model.applyEdits(n,!0),m=u._computeCursorState(t,h),_=h.map((f,v)=>({index:v,textChange:f.textChange}));return _.sort((f,v)=>f.textChange.oldPosition===v.textChange.oldPosition?f.index-v.index:f.textChange.oldPosition-v.textChange.oldPosition),l.append(this._model,_.map(f=>f.textChange),s(this._model),this._model.getAlternativeVersionId(),m),m}static _computeCursorState(i,n){try{return i?i(n):null}catch(t){return N.onUnexpectedError(t),null}}}e.EditStack=u}),define(Q[458],J([4,5]),function(q,e){return q.create("vs/editor/common/modes/modesRegistry",e)}),define(Q[459],J([4,5]),function(q,e){return q.create("vs/editor/common/standaloneStrings",e)}),define(Q[64],J([0,1,459]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SimpleServicesNLS=e.ToggleHighContrastNLS=e.StandaloneCodeEditorNLS=e.QuickOutlineNLS=e.QuickCommandNLS=e.QuickHelpNLS=e.GoToLineNLS=e.InspectTokensNLS=e.AccessibilityHelpNLS=void 0;var N;(function(o){o.noSelection=b.localize(0,null),o.singleSelectionRange=b.localize(1,null),o.singleSelection=b.localize(2,null),o.multiSelectionRange=b.localize(3,null),o.multiSelection=b.localize(4,null),o.emergencyConfOn=b.localize(5,null),o.openingDocs=b.localize(6,null),o.readonlyDiffEditor=b.localize(7,null),o.editableDiffEditor=b.localize(8,null),o.readonlyEditor=b.localize(9,null),o.editableEditor=b.localize(10,null),o.changeConfigToOnMac=b.localize(11,null),o.changeConfigToOnWinLinux=b.localize(12,null),o.auto_on=b.localize(13,null),o.auto_off=b.localize(14,null),o.tabFocusModeOnMsg=b.localize(15,null),o.tabFocusModeOnMsgNoKb=b.localize(16,null),o.tabFocusModeOffMsg=b.localize(17,null),o.tabFocusModeOffMsgNoKb=b.localize(18,null),o.openDocMac=b.localize(19,null),o.openDocWinLinux=b.localize(20,null),o.outroMsg=b.localize(21,null),o.showAccessibilityHelpAction=b.localize(22,null)})(N=e.AccessibilityHelpNLS||(e.AccessibilityHelpNLS={}));var M;(function(o){o.inspectTokensAction=b.localize(23,null)})(M=e.InspectTokensNLS||(e.InspectTokensNLS={}));var w;(function(o){o.gotoLineActionLabel=b.localize(24,null)})(w=e.GoToLineNLS||(e.GoToLineNLS={}));var S;(function(o){o.helpQuickAccessActionLabel=b.localize(25,null)})(S=e.QuickHelpNLS||(e.QuickHelpNLS={}));var C;(function(o){o.quickCommandActionLabel=b.localize(26,null),o.quickCommandHelp=b.localize(27,null)})(C=e.QuickCommandNLS||(e.QuickCommandNLS={}));var d;(function(o){o.quickOutlineActionLabel=b.localize(28,null),o.quickOutlineByCategoryActionLabel=b.localize(29,null)})(d=e.QuickOutlineNLS||(e.QuickOutlineNLS={}));var g;(function(o){o.editorViewAccessibleLabel=b.localize(30,null),o.accessibilityHelpMessage=b.localize(31,null)})(g=e.StandaloneCodeEditorNLS||(e.StandaloneCodeEditorNLS={}));var p;(function(o){o.toggleHighContrast=b.localize(32,null)})(p=e.ToggleHighContrastNLS||(e.ToggleHighContrastNLS={}));var c;(function(o){o.bulkEditServiceSummary=b.localize(33,null)})(c=e.SimpleServicesNLS||(e.SimpleServicesNLS={}))}),define(Q[460],J([4,5]),function(q,e){return q.create("vs/editor/common/view/editorColorRegistry",e)}),define(Q[461],J([4,5]),function(q,e){return q.create("vs/editor/contrib/anchorSelect/anchorSelect",e)}),define(Q[462],J([4,5]),function(q,e){return q.create("vs/editor/contrib/bracketMatching/bracketMatching",e)}),define(Q[463],J([4,5]),function(q,e){return q.create("vs/editor/contrib/caretOperations/caretOperations",e)}),define(Q[464],J([4,5]),function(q,e){return q.create("vs/editor/contrib/caretOperations/transpose",e)}),define(Q[465],J([4,5]),function(q,e){return q.create("vs/editor/contrib/clipboard/clipboard",e)}),define(Q[466],J([4,5]),function(q,e){return q.create("vs/editor/contrib/codeAction/codeActionCommands",e)}),define(Q[467],J([4,5]),function(q,e){return q.create("vs/editor/contrib/codeAction/lightBulbWidget",e)}),define(Q[468],J([4,5]),function(q,e){return q.create("vs/editor/contrib/codelens/codelensController",e)}),define(Q[469],J([4,5]),function(q,e){return q.create("vs/editor/contrib/comment/comment",e)}),define(Q[470],J([4,5]),function(q,e){return q.create("vs/editor/contrib/contextmenu/contextmenu",e)}),define(Q[471],J([4,5]),function(q,e){return q.create("vs/editor/contrib/cursorUndo/cursorUndo",e)}),define(Q[472],J([4,5]),function(q,e){return q.create("vs/editor/contrib/find/findController",e)}),define(Q[473],J([4,5]),function(q,e){return q.create("vs/editor/contrib/find/findWidget",e)}),define(Q[474],J([4,5]),function(q,e){return q.create("vs/editor/contrib/folding/folding",e)}),define(Q[475],J([4,5]),function(q,e){return q.create("vs/editor/contrib/folding/foldingDecorations",e)}),define(Q[476],J([4,5]),function(q,e){return q.create("vs/editor/contrib/fontZoom/fontZoom",e)}),define(Q[477],J([4,5]),function(q,e){return q.create("vs/editor/contrib/format/format",e)}),define(Q[478],J([4,5]),function(q,e){return q.create("vs/editor/contrib/format/formatActions",e)}),define(Q[479],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoError/gotoError",e)}),define(Q[480],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoError/gotoErrorWidget",e)}),define(Q[481],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/goToCommands",e)}),define(Q[482],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition",e)}),define(Q[483],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/peek/referencesController",e)}),define(Q[484],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/peek/referencesTree",e)}),define(Q[485],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/peek/referencesWidget",e)}),define(Q[486],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/referencesModel",e)}),define(Q[132],J([0,1,486,6,44,2,8,119,3,51,12]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferencesModel=e.FileReferences=e.FilePreview=e.OneReference=void 0;class c{constructor(r,i,n,t,l){this.isProviderFirst=r,this.parent=i,this.uri=n,this._range=t,this._rangeCallback=l,this.id=C.defaultGenerator.nextId()}get range(){return this._range}set range(r){this._range=r,this._rangeCallback(this)}get ariaMessage(){var r;const i=(r=this.parent.getPreview(this))===null||r===void 0?void 0:r.preview(this.range);return i?b.localize(1,null,M.basename(this.uri),this.range.startLineNumber,this.range.startColumn,i.value):b.localize(0,null,M.basename(this.uri),this.range.startLineNumber,this.range.startColumn)}}e.OneReference=c;class o{constructor(r){this._modelReference=r}dispose(){this._modelReference.dispose()}preview(r,i=8){const n=this._modelReference.object.textEditorModel;if(!!n){const{startLineNumber:t,startColumn:l,endLineNumber:h,endColumn:m}=r,_=n.getWordUntilPosition({lineNumber:t,column:l-i}),f=new d.Range(t,_.startColumn,t,l),v=new d.Range(h,m,h,1073741824),y=n.getValueInRange(f).replace(/^\s+/,""),L=n.getValueInRange(r),I=n.getValueInRange(v).replace(/\s+$/,"");return{value:y+L+I,highlight:{start:y.length,end:y.length+L.length}}}}}e.FilePreview=o;class s{constructor(r,i){this.parent=r,this.uri=i,this.children=[],this._previews=new g.ResourceMap}dispose(){w.dispose(this._previews.values()),this._previews.clear()}getPreview(r){return this._previews.get(r.uri)}get ariaMessage(){const r=this.children.length;return r===1?b.localize(2,null,M.basename(this.uri),this.uri.fsPath):b.localize(3,null,r,M.basename(this.uri),this.uri.fsPath)}resolve(r){return Ie(this,void 0,void 0,function*(){if(this._previews.size!==0)return this;for(let i of this.children)if(!this._previews.has(i.uri))try{const n=yield r.createModelReference(i.uri);this._previews.set(i.uri,new o(n))}catch(n){p.onUnexpectedError(n)}return this})}}e.FileReferences=s;class a{constructor(r,i){this.groups=[],this.references=[],this._onDidChangeReferenceRange=new N.Emitter,this.onDidChangeReferenceRange=this._onDidChangeReferenceRange.event,this._links=r,this._title=i;const[n]=r;r.sort(a._compareReferences);let t;for(let l of r)if((!t||!M.extUri.isEqual(t.uri,l.uri,!0))&&(t=new s(this,l.uri),this.groups.push(t)),t.children.length===0||a._compareReferences(l,t.children[t.children.length-1])!==0){const h=new c(n===l,t,l.uri,l.targetSelectionRange||l.range,m=>this._onDidChangeReferenceRange.fire(m));this.references.push(h),t.children.push(h)}}dispose(){w.dispose(this.groups),this._onDidChangeReferenceRange.dispose(),this.groups.length=0}clone(){return new a(this._links,this._title)}get title(){return this._title}get isEmpty(){return this.groups.length===0}get ariaMessage(){return this.isEmpty?b.localize(4,null):this.references.length===1?b.localize(5,null,this.references[0].uri.fsPath):this.groups.length===1?b.localize(6,null,this.references.length,this.groups[0].uri.fsPath):b.localize(7,null,this.references.length,this.groups.length)}nextOrPreviousReference(r,i){let{parent:n}=r,t=n.children.indexOf(r),l=n.children.length,h=n.parent.groups.length;return h===1||i&&t+10?(i?t=(t+1)%l:t=(t+l-1)%l,n.children[t]):(t=n.parent.groups.indexOf(n),i?(t=(t+1)%h,n.parent.groups[t].children[0]):(t=(t+h-1)%h,n.parent.groups[t].children[n.parent.groups[t].children.length-1]))}nearestReference(r,i){const n=this.references.map((t,l)=>({idx:l,prefixLen:S.commonPrefixLength(t.uri.toString(),r.toString()),offsetDist:Math.abs(t.range.startLineNumber-i.lineNumber)*100+Math.abs(t.range.startColumn-i.column)})).sort((t,l)=>t.prefixLen>l.prefixLen?-1:t.prefixLenl.offsetDist?1:0)[0];if(n)return this.references[n.idx]}referenceAt(r,i){for(const n of this.references)if(n.uri.toString()===r.toString()&&d.Range.containsPosition(n.range,i))return n}firstReference(){for(const r of this.references)if(r.isProviderFirst)return r;return this.references[0]}static _compareReferences(r,i){return M.extUri.compare(r.uri,i.uri)||d.Range.compareRangesUsingStarts(r.range,i.range)}}e.ReferencesModel=a}),define(Q[487],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/symbolNavigation",e)}),define(Q[488],J([4,5]),function(q,e){return q.create("vs/editor/contrib/hover/hover",e)}),define(Q[489],J([4,5]),function(q,e){return q.create("vs/editor/contrib/hover/markdownHoverParticipant",e)}),define(Q[490],J([4,5]),function(q,e){return q.create("vs/editor/contrib/hover/markerHoverParticipant",e)}),define(Q[491],J([4,5]),function(q,e){return q.create("vs/editor/contrib/inPlaceReplace/inPlaceReplace",e)}),define(Q[492],J([4,5]),function(q,e){return q.create("vs/editor/contrib/indentation/indentation",e)}),define(Q[493],J([4,5]),function(q,e){return q.create("vs/editor/contrib/linesOperations/linesOperations",e)}),define(Q[494],J([4,5]),function(q,e){return q.create("vs/editor/contrib/linkedEditing/linkedEditing",e)}),define(Q[495],J([4,5]),function(q,e){return q.create("vs/editor/contrib/links/links",e)}),define(Q[496],J([4,5]),function(q,e){return q.create("vs/editor/contrib/message/messageController",e)}),define(Q[497],J([4,5]),function(q,e){return q.create("vs/editor/contrib/multicursor/multicursor",e)}),define(Q[498],J([4,5]),function(q,e){return q.create("vs/editor/contrib/parameterHints/parameterHints",e)}),define(Q[499],J([4,5]),function(q,e){return q.create("vs/editor/contrib/parameterHints/parameterHintsWidget",e)}),define(Q[500],J([4,5]),function(q,e){return q.create("vs/editor/contrib/peekView/peekView",e)}),define(Q[501],J([4,5]),function(q,e){return q.create("vs/editor/contrib/quickAccess/gotoLineQuickAccess",e)}),define(Q[502],J([4,5]),function(q,e){return q.create("vs/editor/contrib/quickAccess/gotoSymbolQuickAccess",e)}),define(Q[503],J([4,5]),function(q,e){return q.create("vs/editor/contrib/rename/rename",e)}),define(Q[504],J([4,5]),function(q,e){return q.create("vs/editor/contrib/rename/renameInputField",e)}),define(Q[505],J([4,5]),function(q,e){return q.create("vs/editor/contrib/smartSelect/smartSelect",e)}),define(Q[506],J([4,5]),function(q,e){return q.create("vs/editor/contrib/snippet/snippetVariables",e)}),define(Q[507],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestController",e)}),define(Q[508],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestWidget",e)}),define(Q[509],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestWidgetDetails",e)}),define(Q[510],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestWidgetRenderer",e)}),define(Q[511],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestWidgetStatus",e)}),define(Q[512],J([4,5]),function(q,e){return q.create("vs/editor/contrib/symbolIcons/symbolIcons",e)}),define(Q[513],J([4,5]),function(q,e){return q.create("vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode",e)}),define(Q[514],J([4,5]),function(q,e){return q.create("vs/editor/contrib/tokenization/tokenization",e)}),define(Q[515],J([4,5]),function(q,e){return q.create("vs/editor/contrib/unusualLineTerminators/unusualLineTerminators",e)}),define(Q[516],J([4,5]),function(q,e){return q.create("vs/editor/contrib/wordHighlighter/wordHighlighter",e)}),define(Q[517],J([4,5]),function(q,e){return q.create("vs/editor/contrib/wordOperations/wordOperations",e)}),define(Q[518],J([4,5]),function(q,e){return q.create("vs/platform/actions/browser/menuEntryActionViewItem",e)}),define(Q[519],J([4,5]),function(q,e){return q.create("vs/platform/configuration/common/configurationRegistry",e)}),define(Q[520],J([4,5]),function(q,e){return q.create("vs/platform/contextkey/browser/contextKeyService",e)}),define(Q[521],J([4,5]),function(q,e){return q.create("vs/platform/contextkey/common/contextkeys",e)}),define(Q[522],J([4,5]),function(q,e){return q.create("vs/platform/keybinding/common/abstractKeybindingService",e)}),define(Q[523],J([4,5]),function(q,e){return q.create("vs/platform/list/browser/listService",e)}),define(Q[524],J([4,5]),function(q,e){return q.create("vs/platform/markers/common/markers",e)}),define(Q[525],J([4,5]),function(q,e){return q.create("vs/platform/quickinput/browser/commandsQuickAccess",e)}),define(Q[526],J([4,5]),function(q,e){return q.create("vs/platform/quickinput/browser/helpQuickAccess",e)}),define(Q[527],J([4,5]),function(q,e){return q.create("vs/platform/theme/common/colorRegistry",e)}),define(Q[528],J([4,5]),function(q,e){return q.create("vs/platform/theme/common/iconRegistry",e)}),define(Q[529],J([4,5]),function(q,e){return q.create("vs/platform/undoRedo/common/undoRedoService",e)}),define(Q[530],J([0,1,7]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BrowserClipboardService=void 0;class N{constructor(){this.mapTextToType=new Map,this.findText=""}writeText(w,S){return Ie(this,void 0,void 0,function*(){if(S){this.mapTextToType.set(S,w);return}try{return yield navigator.clipboard.writeText(w)}catch(g){console.error(g)}const C=document.activeElement,d=document.body.appendChild(b.$("textarea",{"aria-hidden":!0}));d.style.height="1px",d.style.width="1px",d.style.position="absolute",d.value=w,d.focus(),d.select(),document.execCommand("copy"),C instanceof HTMLElement&&C.focus(),document.body.removeChild(d)})}readText(w){return Ie(this,void 0,void 0,function*(){if(w)return this.mapTextToType.get(w)||"";try{return yield navigator.clipboard.readText()}catch(S){return console.error(S),""}})}readFindText(){return Ie(this,void 0,void 0,function*(){return this.findText})}writeFindText(w){return Ie(this,void 0,void 0,function*(){this.findText=w})}}e.BrowserClipboardService=N}),define(Q[531],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorOpenContext=void 0;var b;(function(N){N[N.API=0]="API",N[N.USER=1]="USER"})(b=e.EditorOpenContext||(e.EditorOpenContext={}))}),define(Q[532],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ExtensionIdentifier=void 0;class b{constructor(M){this.value=M,this._lower=M.toLowerCase()}static toKey(M){return typeof M=="string"?M.toLowerCase():M._lower}}e.ExtensionIdentifier=b}),define(Q[237],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FileKind=void 0;var b;(function(N){N[N.FILE=0]="FILE",N[N.FOLDER=1]="FOLDER",N[N.ROOT_FOLDER=2]="ROOT_FOLDER"})(b=e.FileKind||(e.FileKind={}))}),define(Q[238],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SyncDescriptor=void 0;class b{constructor(M,w=[],S=!1){this.ctor=M,this.staticArguments=w,this.supportsDelayedInstantiation=S}}e.SyncDescriptor=b}),define(Q[74],J([0,1,238]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getSingletonServiceDescriptors=e.registerSingleton=void 0;const N=[];function M(S,C,d){C instanceof b.SyncDescriptor||(C=new b.SyncDescriptor(C,[],d)),N.push([S,C])}e.registerSingleton=M;function w(){return N}e.getSingletonServiceDescriptors=w}),define(Q[533],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Graph=e.Node=void 0;class b{constructor(w){this.incoming=new Map,this.outgoing=new Map,this.data=w}}e.Node=b;class N{constructor(w){this._hashFn=w,this._nodes=new Map}roots(){const w=[];for(let S of this._nodes.values())S.outgoing.size===0&&w.push(S);return w}insertEdge(w,S){const C=this.lookupOrInsertNode(w),d=this.lookupOrInsertNode(S);C.outgoing.set(this._hashFn(S),d),d.incoming.set(this._hashFn(w),C)}removeNode(w){const S=this._hashFn(w);this._nodes.delete(S);for(let C of this._nodes.values())C.outgoing.delete(S),C.incoming.delete(S)}lookupOrInsertNode(w){const S=this._hashFn(w);let C=this._nodes.get(S);return C||(C=new b(w),this._nodes.set(S,C)),C}isEmpty(){return this._nodes.size===0}toString(){let w=[];for(let[S,C]of this._nodes)w.push(`${S}, (incoming)[${[...C.incoming.keys()].join(", ")}], (outgoing)[${[...C.outgoing.keys()].join(",")}]`);return w.join(` +`)}}e.Graph=N}),define(Q[9],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.optional=e.createDecorator=e.IInstantiationService=e._util=void 0;var b;(function(S){S.serviceIds=new Map,S.DI_TARGET="$di$target",S.DI_DEPENDENCIES="$di$dependencies";function C(d){return d[S.DI_DEPENDENCIES]||[]}S.getServiceDependencies=C})(b=e._util||(e._util={})),e.IInstantiationService=M("instantiationService");function N(S,C,d,g){C[b.DI_TARGET]===C?C[b.DI_DEPENDENCIES].push({id:S,index:d,optional:g}):(C[b.DI_DEPENDENCIES]=[{id:S,index:d,optional:g}],C[b.DI_TARGET]=C)}function M(S){if(b.serviceIds.has(S))return b.serviceIds.get(S);const C=function(d,g,p){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");N(C,d,p,!1)};return C.toString=()=>S,b.serviceIds.set(S,C),C}e.createDecorator=M;function w(S){return function(C,d,g){if(arguments.length!==3)throw new Error("@optional-decorator can only be used to decorate a parameter");N(S,C,g,!0)}}e.optional=w}),define(Q[133],J([0,1,9,24,20]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResourceFileEdit=e.ResourceTextEdit=e.ResourceEdit=e.IBulkEditService=void 0,e.IBulkEditService=b.createDecorator("IWorkspaceEditService");function w(p){return M.isObject(p)&&(Boolean(p.newUri)||Boolean(p.oldUri))}function S(p){return M.isObject(p)&&N.URI.isUri(p.resource)&&M.isObject(p.edit)}class C{constructor(c){this.metadata=c}static convert(c){return c.edits.map(o=>{if(S(o))return new d(o.resource,o.edit,o.modelVersionId,o.metadata);if(w(o))return new g(o.oldUri,o.newUri,o.options,o.metadata);throw new Error("Unsupported edit")})}}e.ResourceEdit=C;class d extends C{constructor(c,o,s,a){super(a);this.resource=c,this.textEdit=o,this.versionId=s,this.metadata=a}}e.ResourceTextEdit=d;class g extends C{constructor(c,o,s,a){super(a);this.oldResource=c,this.newResource=o,this.options=s,this.metadata=a}}e.ResourceFileEdit=g}),define(Q[28],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ICodeEditorService=void 0,e.ICodeEditorService=b.createDecorator("codeEditorService")}),define(Q[75],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEditorWorkerService=e.ID_EDITOR_WORKER_SERVICE=void 0,e.ID_EDITOR_WORKER_SERVICE="editorWorkerService",e.IEditorWorkerService=b.createDecorator(e.ID_EDITOR_WORKER_SERVICE)}),define(Q[178],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerDecorationsService=void 0,e.IMarkerDecorationsService=b.createDecorator("markerDecorationsService")}),define(Q[57],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IModeService=void 0,e.IModeService=b.createDecorator("modeService")}),define(Q[36],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.shouldSynchronizeModel=e.IModelService=void 0,e.IModelService=b.createDecorator("modelService");function N(M){return!M.isTooLargeForSyncing()&&!M.isForSimpleWidget}e.shouldSynchronizeModel=N}),define(Q[134],J([0,1,6,89,2,51,100,374,36]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageFeatureRequestDelays=e.LanguageFeatureRegistry=void 0;function g(o){return typeof o=="string"?!1:Array.isArray(o)?o.every(g):!!o.exclusive}class p{constructor(){this._clock=0,this._entries=[],this._onDidChange=new b.Emitter}get onDidChange(){return this._onDidChange.event}register(s,a){let u={selector:s,provider:a,_score:-1,_time:this._clock++};return this._entries.push(u),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),M.toDisposable(()=>{if(u){let r=this._entries.indexOf(u);r>=0&&(this._entries.splice(r,1),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),u=void 0)}})}has(s){return this.all(s).length>0}all(s){if(!s)return[];this._updateScores(s);const a=[];for(let u of this._entries)u._score>0&&a.push(u.provider);return a}ordered(s){const a=[];return this._orderedForEach(s,u=>a.push(u.provider)),a}orderedGroups(s){const a=[];let u,r;return this._orderedForEach(s,i=>{u&&r===i._score?u.push(i.provider):(r=i._score,u=[i.provider],a.push(u))}),a}_orderedForEach(s,a){if(!!s){this._updateScores(s);for(const u of this._entries)u._score>0&&a(u)}}_updateScores(s){let a={uri:s.uri.toString(),language:s.getLanguageIdentifier().language};if(!(this._lastCandidate&&this._lastCandidate.language===a.language&&this._lastCandidate.uri===a.uri)){this._lastCandidate=a;for(let u of this._entries)if(u._score=C.score(u.selector,s.uri,s.getLanguageIdentifier().language,d.shouldSynchronizeModel(s)),g(u.selector)&&u._score>0){for(let r of this._entries)r._score=0;u._score=1e3;break}this._entries.sort(p._compareByScoreAndTime)}}static _compareByScoreAndTime(s,a){return s._scorea._score?-1:s._timea._time?-1:0}}e.LanguageFeatureRegistry=p;class c{constructor(s,a,u=Number.MAX_SAFE_INTEGER){this._registry=s,this.min=a,this.max=u,this._cache=new w.LRUCache(50,.7)}_key(s){return s.id+N.hash(this._registry.all(s))}_clamp(s){return s===void 0?this.min:Math.min(this.max,Math.max(this.min,Math.floor(s*1.3)))}get(s){const a=this._key(s),u=this._cache.get(a);return this._clamp(u==null?void 0:u.value)}update(s,a){const u=this._key(s);let r=this._cache.get(u);return r||(r=new S.MovingAverage,this._cache.set(u,r)),r.update(a),this.get(s)}}e.LanguageFeatureRequestDelays=c}),define(Q[18],J([0,1,24,3,134,382,27]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenizationRegistry=e.DocumentRangeSemanticTokensProviderRegistry=e.DocumentSemanticTokensProviderRegistry=e.FoldingRangeProviderRegistry=e.SelectionRangeRegistry=e.ColorProviderRegistry=e.LinkProviderRegistry=e.OnTypeFormattingEditProviderRegistry=e.DocumentRangeFormattingEditProviderRegistry=e.DocumentFormattingEditProviderRegistry=e.CodeActionProviderRegistry=e.InlineHintsProviderRegistry=e.CodeLensProviderRegistry=e.TypeDefinitionProviderRegistry=e.ImplementationProviderRegistry=e.DeclarationProviderRegistry=e.DefinitionProviderRegistry=e.LinkedEditingRangeProviderRegistry=e.DocumentHighlightProviderRegistry=e.DocumentSymbolProviderRegistry=e.HoverProviderRegistry=e.SignatureHelpProviderRegistry=e.CompletionProviderRegistry=e.RenameProviderRegistry=e.ReferenceProviderRegistry=e.InlineHintKind=e.FoldingRangeKind=e.SymbolKinds=e.isLocationLink=e.DocumentHighlightKind=e.SignatureHelpTriggerKind=e.completionKindFromString=e.completionKindToCssClass=e.TokenMetadata=e.LanguageIdentifier=void 0;class C{constructor(r,i){this.language=r,this.id=i}}e.LanguageIdentifier=C;class d{static getLanguageId(r){return(r&255)>>>0}static getTokenType(r){return(r&1792)>>>8}static getFontStyle(r){return(r&14336)>>>11}static getForeground(r){return(r&8372224)>>>14}static getBackground(r){return(r&4286578688)>>>23}static getClassNameFromMetadata(r){let i=this.getForeground(r),n="mtk"+i,t=this.getFontStyle(r);return t&1&&(n+=" mtki"),t&2&&(n+=" mtkb"),t&4&&(n+=" mtku"),n}static getInlineStyleFromMetadata(r,i){const n=this.getForeground(r),t=this.getFontStyle(r);let l=`color: ${i[n]};`;return t&1&&(l+="font-style: italic;"),t&2&&(l+="font-weight: bold;"),t&4&&(l+="text-decoration: underline;"),l}}e.TokenMetadata=d,e.completionKindToCssClass=function(){let u=Object.create(null);return u[0]="symbol-method",u[1]="symbol-function",u[2]="symbol-constructor",u[3]="symbol-field",u[4]="symbol-variable",u[5]="symbol-class",u[6]="symbol-struct",u[7]="symbol-interface",u[8]="symbol-module",u[9]="symbol-property",u[10]="symbol-event",u[11]="symbol-operator",u[12]="symbol-unit",u[13]="symbol-value",u[14]="symbol-constant",u[15]="symbol-enum",u[16]="symbol-enum-member",u[17]="symbol-keyword",u[27]="symbol-snippet",u[18]="symbol-text",u[19]="symbol-color",u[20]="symbol-file",u[21]="symbol-reference",u[22]="symbol-customcolor",u[23]="symbol-folder",u[24]="symbol-type-parameter",u[25]="account",u[26]="issues",function(r){const i=u[r];let n=i&&S.iconRegistry.get(i);return n||(console.info("No codicon found for CompletionItemKind "+r),n=S.Codicon.symbolProperty),n.classNames}}(),e.completionKindFromString=function(){let u=Object.create(null);return u.method=0,u.function=1,u.constructor=2,u.field=3,u.variable=4,u.class=5,u.struct=6,u.interface=7,u.module=8,u.property=9,u.event=10,u.operator=11,u.unit=12,u.value=13,u.constant=14,u.enum=15,u["enum-member"]=16,u.enumMember=16,u.keyword=17,u.snippet=27,u.text=18,u.color=19,u.file=20,u.reference=21,u.customcolor=22,u.folder=23,u["type-parameter"]=24,u.typeParameter=24,u.account=25,u.issue=26,function(r,i){let n=u[r];return typeof n=="undefined"&&!i&&(n=9),n}}();var g;(function(u){u[u.Invoke=1]="Invoke",u[u.TriggerCharacter=2]="TriggerCharacter",u[u.ContentChange=3]="ContentChange"})(g=e.SignatureHelpTriggerKind||(e.SignatureHelpTriggerKind={}));var p;(function(u){u[u.Text=0]="Text",u[u.Read=1]="Read",u[u.Write=2]="Write"})(p=e.DocumentHighlightKind||(e.DocumentHighlightKind={}));function c(u){return u&&b.URI.isUri(u.uri)&&N.Range.isIRange(u.range)&&(N.Range.isIRange(u.originSelectionRange)||N.Range.isIRange(u.targetSelectionRange))}e.isLocationLink=c;var o;(function(u){const r=new Map;r.set("file",0),r.set("module",1),r.set("namespace",2),r.set("package",3),r.set("class",4),r.set("method",5),r.set("property",6),r.set("field",7),r.set("constructor",8),r.set("enum",9),r.set("interface",10),r.set("function",11),r.set("variable",12),r.set("constant",13),r.set("string",14),r.set("number",15),r.set("boolean",16),r.set("array",17),r.set("object",18),r.set("key",19),r.set("null",20),r.set("enum-member",21),r.set("struct",22),r.set("event",23),r.set("operator",24),r.set("type-parameter",25);const i=new Map;i.set(0,"file"),i.set(1,"module"),i.set(2,"namespace"),i.set(3,"package"),i.set(4,"class"),i.set(5,"method"),i.set(6,"property"),i.set(7,"field"),i.set(8,"constructor"),i.set(9,"enum"),i.set(10,"interface"),i.set(11,"function"),i.set(12,"variable"),i.set(13,"constant"),i.set(14,"string"),i.set(15,"number"),i.set(16,"boolean"),i.set(17,"array"),i.set(18,"object"),i.set(19,"key"),i.set(20,"null"),i.set(21,"enum-member"),i.set(22,"struct"),i.set(23,"event"),i.set(24,"operator"),i.set(25,"type-parameter");function n(h){return r.get(h)}u.fromString=n;function t(h){return i.get(h)}u.toString=t;function l(h,m){const _=i.get(h);let f=_&&S.iconRegistry.get("symbol-"+_);return f||(console.info("No codicon found for SymbolKind "+h),f=S.Codicon.symbolProperty),`${m?"inline":"block"} ${f.classNames}`}u.toCssClassName=l})(o=e.SymbolKinds||(e.SymbolKinds={}));class s{constructor(r){this.value=r}}e.FoldingRangeKind=s,s.Comment=new s("comment"),s.Imports=new s("imports"),s.Region=new s("region");var a;(function(u){u[u.Other=0]="Other",u[u.Type=1]="Type",u[u.Parameter=2]="Parameter"})(a=e.InlineHintKind||(e.InlineHintKind={})),e.ReferenceProviderRegistry=new M.LanguageFeatureRegistry,e.RenameProviderRegistry=new M.LanguageFeatureRegistry,e.CompletionProviderRegistry=new M.LanguageFeatureRegistry,e.SignatureHelpProviderRegistry=new M.LanguageFeatureRegistry,e.HoverProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentSymbolProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentHighlightProviderRegistry=new M.LanguageFeatureRegistry,e.LinkedEditingRangeProviderRegistry=new M.LanguageFeatureRegistry,e.DefinitionProviderRegistry=new M.LanguageFeatureRegistry,e.DeclarationProviderRegistry=new M.LanguageFeatureRegistry,e.ImplementationProviderRegistry=new M.LanguageFeatureRegistry,e.TypeDefinitionProviderRegistry=new M.LanguageFeatureRegistry,e.CodeLensProviderRegistry=new M.LanguageFeatureRegistry,e.InlineHintsProviderRegistry=new M.LanguageFeatureRegistry,e.CodeActionProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentFormattingEditProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentRangeFormattingEditProviderRegistry=new M.LanguageFeatureRegistry,e.OnTypeFormattingEditProviderRegistry=new M.LanguageFeatureRegistry,e.LinkProviderRegistry=new M.LanguageFeatureRegistry,e.ColorProviderRegistry=new M.LanguageFeatureRegistry,e.SelectionRangeRegistry=new M.LanguageFeatureRegistry,e.FoldingRangeProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentSemanticTokensProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentRangeSemanticTokensProviderRegistry=new M.LanguageFeatureRegistry,e.TokenizationRegistry=new w.TokenizationRegistryImpl}),define(Q[113],J([0,1,18]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SlicedLineTokens=e.LineTokens=void 0;class N{constructor(S,C){this._tokens=S,this._tokensCount=this._tokens.length>>>1,this._text=C}equals(S){return S instanceof N?this.slicedEquals(S,0,this._tokensCount):!1}slicedEquals(S,C,d){if(this._text!==S._text||this._tokensCount!==S._tokensCount)return!1;const g=C<<1,p=g+(d<<1);for(let c=g;c0?this._tokens[S-1<<1]:0}getMetadata(S){return this._tokens[(S<<1)+1]}getLanguageId(S){const C=this._tokens[(S<<1)+1];return b.TokenMetadata.getLanguageId(C)}getStandardTokenType(S){const C=this._tokens[(S<<1)+1];return b.TokenMetadata.getTokenType(C)}getForeground(S){const C=this._tokens[(S<<1)+1];return b.TokenMetadata.getForeground(C)}getClassName(S){const C=this._tokens[(S<<1)+1];return b.TokenMetadata.getClassNameFromMetadata(C)}getInlineStyle(S,C){const d=this._tokens[(S<<1)+1];return b.TokenMetadata.getInlineStyleFromMetadata(d,C)}getEndOffset(S){return this._tokens[S<<1]}findTokenIndexAtOffset(S){return N.findIndexInTokensArray(this._tokens,S)}inflate(){return this}sliceAndInflate(S,C,d){return new M(this,S,C,d)}static convertToEndOffset(S,C){const g=(S.length>>>1)-1;for(let p=0;p>>1)-1;for(;dC&&(g=p)}return d}}e.LineTokens=N;class M{constructor(S,C,d,g){this._source=S,this._startOffset=C,this._endOffset=d,this._deltaOffset=g,this._firstTokenIndex=S.findTokenIndexAtOffset(C),this._tokensCount=0;for(let p=this._firstTokenIndex,c=S.getCount();p=d);p++)this._tokensCount++}equals(S){return S instanceof M?this._startOffset===S._startOffset&&this._endOffset===S._endOffset&&this._deltaOffset===S._deltaOffset&&this._source.slicedEquals(S._source,this._firstTokenIndex,this._tokensCount):!1}getCount(){return this._tokensCount}getForeground(S){return this._source.getForeground(this._firstTokenIndex+S)}getEndOffset(S){const C=this._source.getEndOffset(this._firstTokenIndex+S);return Math.min(this._endOffset,C)-this._startOffset+this._deltaOffset}getClassName(S){return this._source.getClassName(this._firstTokenIndex+S)}getInlineStyle(S,C){return this._source.getInlineStyle(this._firstTokenIndex+S,C)}findTokenIndexAtOffset(S){return this._source.findTokenIndexAtOffset(S+this._startOffset-this._deltaOffset)-this._firstTokenIndex}}e.SlicedLineTokens=M}),define(Q[135],J([0,1,19,113,14,3,18]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokensStore=e.TokensStore2=e.MultilineTokens=e.MultilineTokens2=e.LineTokens2=e.SparseEncodedTokens=e.MultilineTokensBuilder=e.countEOL=void 0;function C(n){let t=0,l=0,h=0,m=0;for(let _=0,f=n.length;_>>0}const g=new Uint32Array(0).buffer;class p{constructor(){this.tokens=[]}add(t,l){if(this.tokens.length>0){const h=this.tokens[this.tokens.length-1];if(h.startLineNumber+h.tokens.length-1+1===t){h.tokens.push(l);return}}this.tokens.push(new a(t,[l]))}}e.MultilineTokensBuilder=p;class c{constructor(t){this._tokens=t,this._tokenCount=t.length/4}toString(t){let l=[];for(let h=0;ht)h=m-1;else{let f=m;for(;f>l&&this._getDeltaLine(f-1)===t;)f--;let v=m;for(;vt||E===t&&O>=l)&&(Et||O===t&&B>=l){if(O_?A-=_-h:A=h;else if(T===l&&O===h)if(T===m&&A>_)A-=_-h;else{I=!0;continue}else if(T_)T===l?(O=h,A=O+(A-_)):(O=0,A=O+(A-_));else{I=!0;continue}else if(T>m){if(y===0&&!I){L=v;break}T-=y}else if(T===m&&O>=_)t&&T===0&&(O+=t,A+=t),T-=y,O-=_-h,A-=_-h;else throw new Error("Not possible!");const F=4*L;f[F]=T,f[F+1]=O,f[F+2]=A,f[F+3]=B,L++}this._tokenCount=L}acceptInsertText(t,l,h,m,_,f){const v=h===0&&m===1&&(f>=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122),y=this._tokens,L=this._tokenCount;for(let I=0;I0?l.charCodeAt(0):0)}acceptEdit(t,l,h,m,_){this._acceptDeleteRange(t),this._acceptInsertText(new M.Position(t.startLineNumber,t.startColumn),l,h,m,_),this._updateEndLineNumber()}_acceptDeleteRange(t){if(!(t.startLineNumber===t.endLineNumber&&t.startColumn===t.endColumn)){const l=t.startLineNumber-this.startLineNumber,h=t.endLineNumber-this.startLineNumber;if(h<0){const _=h-l;this.startLineNumber-=_;return}const m=this.tokens.getMaxDeltaLine();if(!(l>=m+1)){if(l<0&&h>=m+1){this.startLineNumber=0,this.tokens.clear();return}if(l<0){const _=-l;this.startLineNumber-=_,this.tokens.acceptDeleteRange(t.startColumn-1,0,0,h,t.endColumn-1)}else this.tokens.acceptDeleteRange(0,l,t.startColumn-1,h,t.endColumn-1)}}}_acceptInsertText(t,l,h,m,_){if(!(l===0&&h===0)){const f=t.lineNumber-this.startLineNumber;if(f<0){this.startLineNumber+=l;return}const v=this.tokens.getMaxDeltaLine();f>=v+1||this.tokens.acceptInsertText(f,t.column-1,l,h,m,_)}}}e.MultilineTokens2=s;class a{constructor(t,l){this.startLineNumber=t,this.tokens=l}}e.MultilineTokens=a;function u(n){return n instanceof Uint32Array?n:new Uint32Array(n)}class r{constructor(){this._pieces=[],this._isComplete=!1}flush(){this._pieces=[],this._isComplete=!1}isEmpty(){return this._pieces.length===0}set(t,l){this._pieces=t||[],this._isComplete=l}setPartial(t,l){let h=t;if(l.length>0){const _=l[0].getRange(),f=l[l.length-1].getRange();if(!_||!f)return t;h=t.plusRange(_).plusRange(f)}let m=null;for(let _=0,f=this._pieces.length;_h.endLineNumber){m=m||{index:_};break}if(v.removeTokens(h),v.isEmpty()){this._pieces.splice(_,1),_--,f--;continue}if(!(v.endLineNumberh.endLineNumber){m=m||{index:_};continue}const[y,L]=v.split(h);if(y.isEmpty()){m=m||{index:_};continue}L.isEmpty()||(this._pieces.splice(_,1,y,L),_++,f++,m=m||{index:_})}}}return m=m||{index:this._pieces.length},l.length>0&&(this._pieces=b.arrayInsert(this._pieces,m.index,l)),h}isComplete(){return this._isComplete}addSemanticTokens(t,l){const h=this._pieces;if(h.length===0)return l;const m=r._findFirstPieceWithLine(h,t),_=h[m].getLineTokens(t);if(!_)return l;const f=l.getCount(),v=_.getCount();let y=0,L=[],I=0,k=0;const E=(T,O)=>{T!==k&&(k=T,L[I++]=T,L[I++]=O)};for(let T=0;T>>0,D=~F>>>0;for(;yl)m=_-1;else{for(;_>h&&t[_-1].startLineNumber<=l&&l<=t[_-1].endLineNumber;)_--;return _}}return h}acceptEdit(t,l,h,m,_){for(const f of this._pieces)f.acceptEdit(t,l,h,m,_)}}e.TokensStore2=r;class i{constructor(){this._lineTokens=[],this._len=0}flush(){this._lineTokens=[],this._len=0}getTokens(t,l,h){let m=null;if(l1&&(_=S.TokenMetadata.getLanguageId(m[1])!==t),!_)return g}if(!m||m.length===0){const _=new Uint32Array(2);return _[0]=l,_[1]=d(t),_.buffer}return m[m.length-2]=l,m.byteOffset===0&&m.byteLength===m.buffer.byteLength?m.buffer:m}_ensureLine(t){for(;t>=this._len;)this._lineTokens[this._len]=null,this._len++}_deleteLines(t,l){l!==0&&(t+l>this._len&&(l=this._len-t),this._lineTokens.splice(t,l),this._len-=l)}_insertLines(t,l){if(l!==0){let h=[];for(let m=0;m=this._len)){if(t.startLineNumber===t.endLineNumber){if(t.startColumn===t.endColumn)return;this._lineTokens[l]=i._delete(this._lineTokens[l],t.startColumn-1,t.endColumn-1);return}this._lineTokens[l]=i._deleteEnding(this._lineTokens[l],t.startColumn-1);const h=t.endLineNumber-1;let m=null;h=this._len)){if(l===0){this._lineTokens[m]=i._insert(this._lineTokens[m],t.column-1,h);return}this._lineTokens[m]=i._deleteEnding(this._lineTokens[m],t.column-1),this._lineTokens[m]=i._insert(this._lineTokens[m],t.column-1,h),this._insertLines(t.lineNumber,l)}}}static _deleteBeginning(t,l){return t===null||t===g?t:i._delete(t,0,l)}static _deleteEnding(t,l){if(t===null||t===g)return t;const h=u(t),m=h[h.length-2];return i._delete(t,l,m)}static _delete(t,l,h){if(t===null||t===g||l===h)return t;const m=u(t),_=m.length>>>1;if(l===0&&m[m.length-2]===h)return g;const f=N.LineTokens.findIndexInTokensArray(m,l),v=f>0?m[f-1<<1]:0,y=m[f<<1];if(hI&&(m[L++]=O,m[L++]=m[(T<<1)+1],I=O)}if(L===m.length)return t;let E=new Uint32Array(L);return E.set(m.subarray(0,L),0),E.buffer}static _append(t,l){if(l===g)return t;if(t===g)return l;if(t===null)return t;if(l===null)return null;const h=u(t),m=u(l),_=m.length>>>1;let f=new Uint32Array(h.length+m.length);f.set(h,0);let v=h.length;const y=h[h.length-2];for(let L=0;L<_;L++)f[v++]=m[L<<1]+y,f[v++]=m[(L<<1)+1];return f.buffer}static _insert(t,l,h){if(t===null||t===g)return t;const m=u(t),_=m.length>>>1;let f=N.LineTokens.findIndexInTokensArray(m,l);f>0&&m[f-1<<1]===l&&f--;for(let v=f;v<_;v++)m[v<<1]+=h;return t}}e.TokensStore=i}),define(Q[239],J([0,1,6,8,3,53,219,135,218,2]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeTextBuffer=void 0;class p extends g.Disposable{constructor(o,s,a,u,r,i,n){super();this._onDidChangeContent=this._register(new b.Emitter),this._BOM=s,this._mightContainNonBasicASCII=!i,this._mightContainRTL=u,this._mightContainUnusualLineTerminators=r,this._pieceTree=new S.PieceTreeBase(o,a,n)}mightContainRTL(){return this._mightContainRTL}mightContainUnusualLineTerminators(){return this._mightContainUnusualLineTerminators}resetMightContainUnusualLineTerminators(){this._mightContainUnusualLineTerminators=!1}mightContainNonBasicASCII(){return this._mightContainNonBasicASCII}getBOM(){return this._BOM}getEOL(){return this._pieceTree.getEOL()}createSnapshot(o){return this._pieceTree.createSnapshot(o?this._BOM:"")}getOffsetAt(o,s){return this._pieceTree.getOffsetAt(o,s)}getPositionAt(o){return this._pieceTree.getPositionAt(o)}getRangeAt(o,s){let a=o+s;const u=this.getPositionAt(o),r=this.getPositionAt(a);return new M.Range(u.lineNumber,u.column,r.lineNumber,r.column)}getValueInRange(o,s=0){if(o.isEmpty())return"";const a=this._getEndOfLine(s);return this._pieceTree.getValueInRange(o,a)}getValueLengthInRange(o,s=0){if(o.isEmpty())return 0;if(o.startLineNumber===o.endLineNumber)return o.endColumn-o.startColumn;let a=this.getOffsetAt(o.startLineNumber,o.startColumn);return this.getOffsetAt(o.endLineNumber,o.endColumn)-a}getCharacterCountInRange(o,s=0){if(this._mightContainNonBasicASCII){let a=0;const u=o.startLineNumber,r=o.endLineNumber;for(let i=u;i<=r;i++){const n=this.getLineContent(i),t=i===u?o.startColumn-1:0,l=i===r?o.endColumn-1:n.length;for(let h=t;hL.sortIndex-I.sortIndex)}this._mightContainRTL=u,this._mightContainUnusualLineTerminators=r,this._mightContainNonBasicASCII=i;const f=this._doApplyEdits(t);let v=null;if(s&&m.length>0){m.sort((y,L)=>L.lineNumber-y.lineNumber),v=[];for(let y=0,L=m.length;y0&&m[y-1].lineNumber===I)){let k=m[y].oldContent,E=this.getLineContent(I);E.length===0||E===k||N.firstNonWhitespaceIndex(E)!==-1||v.push(I)}}}return this._onDidChangeContent.fire(),new w.ApplyEditsResult(_,f,v)}_reduceOperations(o){return o.length<1e3?o:[this._toSingleEditOperation(o)]}_toSingleEditOperation(o){let s=!1;const a=o[0].range,u=o[o.length-1].range,r=new M.Range(a.startLineNumber,a.startColumn,u.endLineNumber,u.endColumn);let i=a.startLineNumber,n=a.startColumn;const t=[];for(let f=0,v=o.length;f0&&t.push(y.text),i=L.endLineNumber,n=L.endColumn}const l=t.join(""),[h,m,_]=C.countEOL(l);return{sortIndex:0,identifier:o[0].identifier,range:r,rangeOffset:this.getOffsetAt(r.startLineNumber,r.startColumn),rangeLength:this.getValueLengthInRange(r,0),text:l,eolCount:h,firstLineLength:m,lastLineLength:_,forceMoveMarkers:s,isAutoWhitespaceEdit:!1}}_doApplyEdits(o){o.sort(p._sortOpsDescending);let s=[];for(let a=0;a0){const _=t.eolCount+1;_===1?m=new M.Range(l,h,l,h+t.firstLineLength):m=new M.Range(l,h,l+_-1,t.lastLineLength+1)}else m=new M.Range(l,h,l,h);a=m.endLineNumber,u=m.endColumn,s.push(m),r=t}return s}static _sortOpsAscending(o,s){let a=M.Range.compareRangesUsingEnds(o.range,s.range);return a===0?o.sortIndex-s.sortIndex:a}static _sortOpsDescending(o,s){let a=M.Range.compareRangesUsingEnds(o.range,s.range);return a===0?s.sortIndex-o.sortIndex:-a}}e.PieceTreeTextBuffer=p}),define(Q[534],J([0,1,8,219,239]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeTextBufferBuilder=e.PieceTreeTextBufferFactory=void 0;class w{constructor(d,g,p,c,o,s,a,u,r){this._chunks=d,this._bom=g,this._cr=p,this._lf=c,this._crlf=o,this._containsRTL=s,this._containsUnusualLineTerminators=a,this._isBasicASCII=u,this._normalizeEOL=r}_getEOL(d){const g=this._cr+this._lf+this._crlf,p=this._cr+this._crlf;return g===0?d===1?` +`:`\r +`:p>g/2?`\r +`:` +`}create(d){const g=this._getEOL(d);let p=this._chunks;if(this._normalizeEOL&&(g===`\r +`&&(this._cr>0||this._lf>0)||g===` +`&&(this._cr>0||this._crlf>0)))for(let o=0,s=p.length;o=55296&&g<=56319?(this._acceptChunk1(d.substr(0,d.length-1),!1),this._hasPreviousChar=!0,this._previousChar=g):(this._acceptChunk1(d,!1),this._hasPreviousChar=!1,this._previousChar=g)}}_acceptChunk1(d,g){!g&&d.length===0||(this._hasPreviousChar?this._acceptChunk2(String.fromCharCode(this._previousChar)+d):this._acceptChunk2(d))}_acceptChunk2(d){const g=N.createLineStarts(this._tmpLineStarts,d);this.chunks.push(new N.StringBuffer(d,g.lineStarts)),this.cr+=g.cr,this.lf+=g.lf,this.crlf+=g.crlf,this.isBasicASCII&&(this.isBasicASCII=g.isBasicASCII),!this.isBasicASCII&&!this.containsRTL&&(this.containsRTL=b.containsRTL(d)),!this.isBasicASCII&&!this.containsUnusualLineTerminators&&(this.containsUnusualLineTerminators=b.containsUnusualLineTerminators(d))}finish(d=!0){return this._finish(),new w(this.chunks,this.BOM,this.cr,this.lf,this.crlf,this.containsRTL,this.containsUnusualLineTerminators,this.isBasicASCII,d)}_finish(){if(this.chunks.length===0&&this._acceptChunk1("",!0),this._hasPreviousChar){this._hasPreviousChar=!1;let d=this.chunks[this.chunks.length-1];d.buffer+=String.fromCharCode(this._previousChar);let g=N.createLineStartsFast(d.buffer);d.lineStarts=g,this._previousChar===13&&this.cr++}}}e.PieceTreeTextBufferBuilder=S}),define(Q[76],J([0,1,127,18]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.nullTokenize2=e.nullTokenize=e.NULL_LANGUAGE_IDENTIFIER=e.NULL_MODE_ID=e.NULL_STATE=void 0;class M{clone(){return this}equals(d){return this===d}}e.NULL_STATE=new M,e.NULL_MODE_ID="vs.editor.nullMode",e.NULL_LANGUAGE_IDENTIFIER=new N.LanguageIdentifier(e.NULL_MODE_ID,0);function w(C,d,g,p){return new b.TokenizationResult([new b.Token(p,"",C)],g)}e.nullTokenize=w;function S(C,d,g,p){let c=new Uint32Array(2);return c[0]=p,c[1]=(C<<0|0<<8|0<<11|1<<14|2<<23)>>>0,new b.TokenizationResult2(c,g===null?e.NULL_STATE:g)}e.nullTokenize2=S}),define(Q[535],J([0,1,19,12,113,14,18,76,2,81,135,17]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextModelTokenization=e.TokenizationStateStore=void 0;class o{constructor(){this._beginState=[],this._valid=[],this._len=0,this._invalidLineStartIndex=0}_reset(i){this._beginState=[],this._valid=[],this._len=0,this._invalidLineStartIndex=0,i&&this._setBeginState(0,i)}flush(i){this._reset(i)}get invalidLineStartIndex(){return this._invalidLineStartIndex}_invalidateLine(i){i=this._len;)this._beginState[this._len]=null,this._valid[this._len]=!1,this._len++}_deleteLines(i,n){n!==0&&(i+n>this._len&&(n=this._len-i),this._beginState.splice(i,n),this._valid.splice(i,n),this._len-=n)}_insertLines(i,n){if(n!==0){let t=[],l=[];for(let h=0;h=0;m--)this._invalidateLine(i.startLineNumber+m-1);this._acceptDeleteRange(i),this._acceptInsertText(new w.Position(i.startLineNumber,i.startColumn),n)}_acceptDeleteRange(i){i.startLineNumber-1>=this._len||this._deleteLines(i.startLineNumber,i.endLineNumber-i.startLineNumber)}_acceptInsertText(i,n){i.lineNumber-1>=this._len||this._insertLines(i.lineNumber,n)}}e.TokenizationStateStore=o;class s extends d.Disposable{constructor(i){super();this._isDisposed=!1,this._textModel=i,this._tokenizationStateStore=new o,this._tokenizationSupport=null,this._register(S.TokenizationRegistry.onDidChange(n=>{const t=this._textModel.getLanguageIdentifier();n.changedLanguages.indexOf(t.language)!==-1&&(this._resetTokenizationState(),this._textModel.clearTokens())})),this._register(this._textModel.onDidChangeRawContentFast(n=>{if(n.containsEvent(1)){this._resetTokenizationState();return}})),this._register(this._textModel.onDidChangeContentFast(n=>{for(let t=0,l=n.changes.length;t{this._beginBackgroundTokenization()})),this._register(this._textModel.onDidChangeLanguage(()=>{this._resetTokenizationState(),this._textModel.clearTokens()})),this._resetTokenizationState()}dispose(){this._isDisposed=!0,super.dispose()}_resetTokenizationState(){const[i,n]=a(this._textModel);this._tokenizationSupport=i,this._tokenizationStateStore.flush(n),this._beginBackgroundTokenization()}_beginBackgroundTokenization(){this._textModel.isAttachedToEditor()&&this._hasLinesToTokenize()&&c.setImmediate(()=>{this._isDisposed||this._revalidateTokensNow()})}_revalidateTokensNow(i=this._textModel.getLineCount()){const n=1,t=new p.MultilineTokensBuilder,l=g.StopWatch.create(!1);for(;this._hasLinesToTokenize()&&!(l.elapsed()>n||this._tokenizeOneInvalidLine(t)>=i););this._beginBackgroundTokenization(),this._textModel.setTokens(t.tokens)}tokenizeViewport(i,n){const t=new p.MultilineTokensBuilder;this._tokenizeViewport(t,i,n),this._textModel.setTokens(t.tokens)}reset(){this._resetTokenizationState(),this._textModel.clearTokens()}forceTokenization(i){const n=new p.MultilineTokensBuilder;this._updateTokensUntilLine(n,i),this._textModel.setTokens(n.tokens)}isCheapToTokenize(i){if(!this._tokenizationSupport)return!0;const n=this._tokenizationStateStore.invalidLineStartIndex+1;return i>n?!1:i0&&v>=1;v--){let y=this._textModel.getLineFirstNonWhitespaceColumn(v);if(y!==0&&y=0;v--)f=u(_,this._tokenizationSupport,h[v],!1,f).endState;for(let v=n;v<=t;v++){let y=this._textModel.getLineContent(v),L=u(_,this._tokenizationSupport,y,!0,f);i.add(v,L.tokens),this._tokenizationStateStore.setFakeTokens(v-1),f=L.endState}}}}e.TextModelTokenization=s;function a(r){const i=r.getLanguageIdentifier();let n=r.isTooLargeForTokenization()?null:S.TokenizationRegistry.get(i.language),t=null;if(n)try{t=n.getInitialState()}catch(l){N.onUnexpectedError(l),n=null}return[n,t]}function u(r,i,n,t,l){let h=null;if(i)try{h=i.tokenize2(n,t,l.clone(),0)}catch(m){N.onUnexpectedError(m)}return h||(h=C.nullTokenize2(r.id,n,l,0)),M.LineTokens.convertToEndOffset(h.tokens,n.length),h}}),define(Q[31],J([0,1,12,6,2,8,24,38,14,3,21,53,236,369,370,534,372,166,535,128,41,76,167,168,135,29,239]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DidChangeContentEmitter=e.DidChangeDecorationsEmitter=e.ModelDecorationOptions=e.ModelDecorationMinimapOptions=e.ModelDecorationOverviewRulerOptions=e.TextModel=e.LONG_LINE_BOUNDARY=e.createTextBuffer=e.createTextBufferFactory=void 0;function L(){return new u.PieceTreeTextBufferBuilder}function I(z){const P=L();return P.acceptChunk(z),P.finish()}e.createTextBufferFactory=I;function k(z,P){return(typeof z=="string"?I(z):z).create(P)}e.createTextBuffer=k;let E=0;const T=999;e.LONG_LINE_BOUNDARY=1e4;class O{constructor(P){this._source=P,this._eos=!1}read(){if(this._eos)return null;let P=[],V=0,U=0;do{let H=this._source.read();if(H===null)return this._eos=!0,V===0?null:P.join("");if(H.length>0&&(P[V++]=H,U+=H.length),U>=64*1024)return P.join("")}while(!0)}}const A=()=>{throw new Error("Invalid change accessor")};class B{constructor(){this._searchCanceledBrand=void 0}}B.INSTANCE=new B;function F(z){return z instanceof B?null:z}class D extends M.Disposable{constructor(P,V,U,H=null,$){super();this._onWillDispose=this._register(new N.Emitter),this.onWillDispose=this._onWillDispose.event,this._onDidChangeDecorations=this._register(new le),this.onDidChangeDecorations=this._onDidChangeDecorations.event,this._onDidChangeLanguage=this._register(new N.Emitter),this.onDidChangeLanguage=this._onDidChangeLanguage.event,this._onDidChangeLanguageConfiguration=this._register(new N.Emitter),this.onDidChangeLanguageConfiguration=this._onDidChangeLanguageConfiguration.event,this._onDidChangeTokens=this._register(new N.Emitter),this.onDidChangeTokens=this._onDidChangeTokens.event,this._onDidChangeOptions=this._register(new N.Emitter),this.onDidChangeOptions=this._onDidChangeOptions.event,this._onDidChangeAttached=this._register(new N.Emitter),this.onDidChangeAttached=this._onDidChangeAttached.event,this._eventEmitter=this._register(new X),E++,this.id="$model"+E,this.isForSimpleWidget=V.isForSimpleWidget,typeof H=="undefined"||H===null?this._associatedResource=S.URI.parse("inmemory://model/"+E):this._associatedResource=H,this._undoRedoService=$,this._attachedEditorCount=0;const{textBuffer:ie,disposable:oe}=k(P,V.defaultEOL);this._buffer=ie,this._bufferDisposable=oe,this._options=D.resolveOptions(this._buffer,V);const ae=this._buffer.getLineCount(),G=this._buffer.getValueLengthInRange(new g.Range(1,1,ae,this._buffer.getLineLength(ae)+1),0);V.largeFileOptimizations?this._isTooLargeForTokenization=G>D.LARGE_FILE_SIZE_THRESHOLD||ae>D.LARGE_FILE_LINE_COUNT_THRESHOLD:this._isTooLargeForTokenization=!1,this._isTooLargeForSyncing=G>D.MODEL_SYNC_LIMIT,this._versionId=1,this._alternativeVersionId=1,this._initialUndoRedoSnapshot=null,this._isDisposed=!1,this._isDisposing=!1,this._languageIdentifier=U||h.NULL_LANGUAGE_IDENTIFIER,this._languageRegistryListener=l.LanguageConfigurationRegistry.onDidChange(j=>{j.languageIdentifier.id===this._languageIdentifier.id&&this._onDidChangeLanguageConfiguration.fire({})}),this._instanceId=w.singleLetterHash(E),this._lastDecorationId=0,this._decorations=Object.create(null),this._decorationsTree=new R,this._commandManager=new o.EditStack(this,$),this._isUndoing=!1,this._isRedoing=!1,this._trimAutoWhitespaceLines=null,this._tokens=new f.TokensStore,this._tokens2=new f.TokensStore2,this._tokenization=new n.TextModelTokenization(this)}static resolveOptions(P,V){if(V.detectIndentation){const U=s.guessIndentation(P,V.tabSize,V.insertSpaces);return new c.TextModelResolvedOptions({tabSize:U.tabSize,indentSize:U.tabSize,insertSpaces:U.insertSpaces,trimAutoWhitespace:V.trimAutoWhitespace,defaultEOL:V.defaultEOL})}return new c.TextModelResolvedOptions({tabSize:V.tabSize,indentSize:V.indentSize,insertSpaces:V.insertSpaces,trimAutoWhitespace:V.trimAutoWhitespace,defaultEOL:V.defaultEOL})}onDidChangeRawContentFast(P){return this._eventEmitter.fastEvent(V=>P(V.rawContentChangedEvent))}onDidChangeContentFast(P){return this._eventEmitter.fastEvent(V=>P(V.contentChangedEvent))}onDidChangeContent(P){return this._eventEmitter.slowEvent(V=>P(V.contentChangedEvent))}dispose(){this._isDisposing=!0,this._onWillDispose.fire(),this._languageRegistryListener.dispose(),this._tokenization.dispose(),this._isDisposed=!0,super.dispose(),this._bufferDisposable.dispose(),this._isDisposing=!1;const P=new y.PieceTreeTextBuffer([],"",` +`,!1,!1,!0,!0);P.dispose(),this._buffer=P}_assertNotDisposed(){if(this._isDisposed)throw new Error("Model is disposed!")}_emitContentChangedEvent(P,V){this._isDisposing||this._eventEmitter.fire(new r.InternalModelContentChangeEvent(P,V))}setValue(P){if(this._assertNotDisposed(),P!==null){const{textBuffer:V,disposable:U}=k(P,this._options.defaultEOL);this._setValueFromTextBuffer(V,U)}}_createContentChanged2(P,V,U,H,$,ie,oe){return{changes:[{range:P,rangeOffset:V,rangeLength:U,text:H}],eol:this._buffer.getEOL(),versionId:this.getVersionId(),isUndoing:$,isRedoing:ie,isFlush:oe}}_setValueFromTextBuffer(P,V){this._assertNotDisposed();const U=this.getFullModelRange(),H=this.getValueLengthInRange(U),$=this.getLineCount(),ie=this.getLineMaxColumn($);this._buffer=P,this._bufferDisposable.dispose(),this._bufferDisposable=V,this._increaseVersionId(),this._tokens.flush(),this._tokens2.flush(),this._decorations=Object.create(null),this._decorationsTree=new R,this._commandManager.clear(),this._trimAutoWhitespaceLines=null,this._emitContentChangedEvent(new r.ModelRawContentChangedEvent([new r.ModelRawFlush],this._versionId,!1,!1),this._createContentChanged2(new g.Range(1,1,$,ie),0,H,this.getValue(),!1,!1,!0))}setEOL(P){this._assertNotDisposed();const V=P===1?`\r +`:` +`;if(this._buffer.getEOL()!==V){const U=this.getFullModelRange(),H=this.getValueLengthInRange(U),$=this.getLineCount(),ie=this.getLineMaxColumn($);this._onBeforeEOLChange(),this._buffer.setEOL(V),this._increaseVersionId(),this._onAfterEOLChange(),this._emitContentChangedEvent(new r.ModelRawContentChangedEvent([new r.ModelRawEOLChanged],this._versionId,!1,!1),this._createContentChanged2(new g.Range(1,1,$,ie),0,H,this.getValue(),!1,!1,!1))}}_onBeforeEOLChange(){const P=this.getVersionId(),V=this._decorationsTree.search(0,!1,!1,P);this._ensureNodesHaveRanges(V)}_onAfterEOLChange(){const P=this.getVersionId(),V=this._decorationsTree.collectNodesPostOrder();for(let U=0,H=V.length;U0}getAttachedEditorCount(){return this._attachedEditorCount}isTooLargeForSyncing(){return this._isTooLargeForSyncing}isTooLargeForTokenization(){return this._isTooLargeForTokenization}isDisposed(){return this._isDisposed}isDominatedByLongLines(){if(this._assertNotDisposed(),this.isTooLargeForTokenization())return!1;let P=0,V=0;const U=this._buffer.getLineCount();for(let H=1;H<=U;H++){const $=this._buffer.getLineLength(H);$>=e.LONG_LINE_BOUNDARY?V+=$:P+=$}return V>P}get uri(){return this._associatedResource}getOptions(){return this._assertNotDisposed(),this._options}getFormattingOptions(){return{tabSize:this._options.indentSize,insertSpaces:this._options.insertSpaces}}updateOptions(P){this._assertNotDisposed();let V=typeof P.tabSize!="undefined"?P.tabSize:this._options.tabSize,U=typeof P.indentSize!="undefined"?P.indentSize:this._options.indentSize,H=typeof P.insertSpaces!="undefined"?P.insertSpaces:this._options.insertSpaces,$=typeof P.trimAutoWhitespace!="undefined"?P.trimAutoWhitespace:this._options.trimAutoWhitespace,ie=new c.TextModelResolvedOptions({tabSize:V,indentSize:U,insertSpaces:H,defaultEOL:this._options.defaultEOL,trimAutoWhitespace:$});if(!this._options.equals(ie)){let oe=this._options.createChangeEvent(ie);this._options=ie,this._onDidChangeOptions.fire(oe)}}detectIndentation(P,V){this._assertNotDisposed();let U=s.guessIndentation(this._buffer,V,P);this.updateOptions({insertSpaces:U.insertSpaces,tabSize:U.tabSize,indentSize:U.tabSize})}static _normalizeIndentationFromWhitespace(P,V,U){let H=0;for(let ie=0;ie({range:U.range,text:null})),()=>null)}mightContainNonBasicASCII(){return this._buffer.mightContainNonBasicASCII()}getAlternativeVersionId(){return this._assertNotDisposed(),this._alternativeVersionId}getInitialUndoRedoSnapshot(){return this._assertNotDisposed(),this._initialUndoRedoSnapshot}getOffsetAt(P){this._assertNotDisposed();let V=this._validatePosition(P.lineNumber,P.column,0);return this._buffer.getOffsetAt(V.lineNumber,V.column)}getPositionAt(P){this._assertNotDisposed();let V=Math.min(this._buffer.getLength(),Math.max(0,P));return this._buffer.getPositionAt(V)}_increaseVersionId(){this._versionId=this._versionId+1,this._alternativeVersionId=this._versionId}_overwriteVersionId(P){this._versionId=P}_overwriteAlternativeVersionId(P){this._alternativeVersionId=P}_overwriteInitialUndoRedoSnapshot(P){this._initialUndoRedoSnapshot=P}getValue(P,V=!1){this._assertNotDisposed();const U=this.getFullModelRange(),H=this.getValueInRange(U,P);return V?this._buffer.getBOM()+H:H}createSnapshot(P=!1){return new O(this._buffer.createSnapshot(P))}getValueLength(P,V=!1){this._assertNotDisposed();const U=this.getFullModelRange(),H=this.getValueLengthInRange(U,P);return V?this._buffer.getBOM().length+H:H}getValueInRange(P,V=0){return this._assertNotDisposed(),this._buffer.getValueInRange(this.validateRange(P),V)}getValueLengthInRange(P,V=0){return this._assertNotDisposed(),this._buffer.getValueLengthInRange(this.validateRange(P),V)}getCharacterCountInRange(P,V=0){return this._assertNotDisposed(),this._buffer.getCharacterCountInRange(this.validateRange(P),V)}getLineCount(){return this._assertNotDisposed(),this._buffer.getLineCount()}getLineContent(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineContent(P)}getLineLength(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineLength(P)}getLinesContent(){return this._assertNotDisposed(),this._buffer.getLinesContent()}getEOL(){return this._assertNotDisposed(),this._buffer.getEOL()}getEndOfLineSequence(){return this._assertNotDisposed(),this._buffer.getEOL()===` +`?0:1}getLineMinColumn(P){return this._assertNotDisposed(),1}getLineMaxColumn(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineLength(P)+1}getLineFirstNonWhitespaceColumn(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineFirstNonWhitespaceColumn(P)}getLineLastNonWhitespaceColumn(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineLastNonWhitespaceColumn(P)}_validateRangeRelaxedNoAllocations(P){const V=this._buffer.getLineCount(),U=P.startLineNumber,H=P.startColumn;let $,ie;if(U<1)$=1,ie=1;else if(U>V)$=V,ie=this.getLineMaxColumn($);else if($=U|0,H<=1)ie=1;else{const te=this.getLineMaxColumn($);H>=te?ie=te:ie=H|0}const oe=P.endLineNumber,ae=P.endColumn;let G,j;if(oe<1)G=1,j=1;else if(oe>V)G=V,j=this.getLineMaxColumn(G);else if(G=oe|0,ae<=1)j=1;else{const te=this.getLineMaxColumn(G);ae>=te?j=te:j=ae|0}return U===$&&H===ie&&oe===G&&ae===j&&P instanceof g.Range&&!(P instanceof p.Selection)?P:new g.Range($,ie,G,j)}_isValidPosition(P,V,U){if(typeof P!="number"||typeof V!="number"||isNaN(P)||isNaN(V)||P<1||V<1||(P|0)!==P||(V|0)!==V)return!1;const H=this._buffer.getLineCount();if(P>H)return!1;if(V===1)return!0;const $=this.getLineMaxColumn(P);if(V>$)return!1;if(U===1){const ie=this._buffer.getLineCharCode(P,V-2);if(w.isHighSurrogate(ie))return!1}return!0}_validatePosition(P,V,U){const H=Math.floor(typeof P=="number"&&!isNaN(P)?P:1),$=Math.floor(typeof V=="number"&&!isNaN(V)?V:1),ie=this._buffer.getLineCount();if(H<1)return new d.Position(1,1);if(H>ie)return new d.Position(ie,this.getLineMaxColumn(ie));if($<=1)return new d.Position(H,1);const oe=this.getLineMaxColumn(H);if($>=oe)return new d.Position(H,oe);if(U===1){const ae=this._buffer.getLineCharCode(H,$-2);if(w.isHighSurrogate(ae))return new d.Position(H,$-1)}return new d.Position(H,$)}validatePosition(P){const V=1;return this._assertNotDisposed(),P instanceof d.Position&&this._isValidPosition(P.lineNumber,P.column,V)?P:this._validatePosition(P.lineNumber,P.column,V)}_isValidRange(P,V){const U=P.startLineNumber,H=P.startColumn,$=P.endLineNumber,ie=P.endColumn;if(!this._isValidPosition(U,H,0)||!this._isValidPosition($,ie,0))return!1;if(V===1){const oe=H>1?this._buffer.getLineCharCode(U,H-2):0,ae=ie>1&&ie<=this._buffer.getLineLength($)?this._buffer.getLineCharCode($,ie-2):0,G=w.isHighSurrogate(oe),j=w.isHighSurrogate(ae);return!G&&!j}return!0}validateRange(P){const V=1;if(this._assertNotDisposed(),P instanceof g.Range&&!(P instanceof p.Selection)&&this._isValidRange(P,V))return P;const U=this._validatePosition(P.startLineNumber,P.startColumn,0),H=this._validatePosition(P.endLineNumber,P.endColumn,0),$=U.lineNumber,ie=U.column,oe=H.lineNumber,ae=H.column;if(V===1){const G=ie>1?this._buffer.getLineCharCode($,ie-2):0,j=ae>1&&ae<=this._buffer.getLineLength(oe)?this._buffer.getLineCharCode(oe,ae-2):0,te=w.isHighSurrogate(G),Z=w.isHighSurrogate(j);return!te&&!Z?new g.Range($,ie,oe,ae):$===oe&&ie===ae?new g.Range($,ie-1,oe,ae-1):te&&Z?new g.Range($,ie-1,oe,ae+1):te?new g.Range($,ie-1,oe,ae):new g.Range($,ie,oe,ae+1)}return new g.Range($,ie,oe,ae)}modifyPosition(P,V){this._assertNotDisposed();let U=this.getOffsetAt(P)+V;return this.getPositionAt(Math.min(this._buffer.getLength(),Math.max(0,U)))}getFullModelRange(){this._assertNotDisposed();const P=this.getLineCount();return new g.Range(1,1,P,this.getLineMaxColumn(P))}findMatchesLineByLine(P,V,U,H){return this._buffer.findMatchesLineByLine(P,V,U,H)}findMatches(P,V,U,H,$,ie,oe=T){this._assertNotDisposed();let ae=null;V!==null&&(Array.isArray(V)||(V=[V]),V.every(te=>g.Range.isIRange(te))&&(ae=V.map(te=>this.validateRange(te)))),ae===null&&(ae=[this.getFullModelRange()]),ae=ae.sort((te,Z)=>te.startLineNumber-Z.startLineNumber||te.startColumn-Z.startColumn);const G=[];G.push(ae.reduce((te,Z)=>g.Range.areIntersecting(te,Z)?te.plusRange(Z):(G.push(te),Z)));let j;if(!U&&P.indexOf(` +`)<0){const Z=new i.SearchParams(P,U,H,$).parseSearchRequest();if(!Z)return[];j=ue=>this.findMatchesLineByLine(ue,Z,ie,oe)}else j=te=>i.TextModelSearch.findMatches(this,new i.SearchParams(P,U,H,$),te,ie,oe);return G.map(j).reduce((te,Z)=>te.concat(Z),[])}findNextMatch(P,V,U,H,$,ie){this._assertNotDisposed();const oe=this.validatePosition(V);if(!U&&P.indexOf(` +`)<0){const G=new i.SearchParams(P,U,H,$).parseSearchRequest();if(!G)return null;const j=this.getLineCount();let te=new g.Range(oe.lineNumber,oe.column,j,this.getLineMaxColumn(j)),Z=this.findMatchesLineByLine(te,G,ie,1);return i.TextModelSearch.findNextMatch(this,new i.SearchParams(P,U,H,$),oe,ie),Z.length>0||(te=new g.Range(1,1,oe.lineNumber,this.getLineMaxColumn(oe.lineNumber)),Z=this.findMatchesLineByLine(te,G,ie,1),Z.length>0)?Z[0]:null}return i.TextModelSearch.findNextMatch(this,new i.SearchParams(P,U,H,$),oe,ie)}findPreviousMatch(P,V,U,H,$,ie){this._assertNotDisposed();const oe=this.validatePosition(V);return i.TextModelSearch.findPreviousMatch(this,new i.SearchParams(P,U,H,$),oe,ie)}pushStackElement(){this._commandManager.pushStackElement()}popStackElement(){this._commandManager.popStackElement()}pushEOL(P){if((this.getEOL()===` +`?0:1)!==P)try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEOL(P)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_validateEditOperation(P){return P instanceof c.ValidAnnotatedEditOperation?P:new c.ValidAnnotatedEditOperation(P.identifier||null,this.validateRange(P.range),P.text,P.forceMoveMarkers||!1,P.isAutoWhitespaceEdit||!1,P._isTracked||!1)}_validateEditOperations(P){const V=[];for(let U=0,H=P.length;U({range:this.validateRange(ie.range),text:ie.text})),$=!0;if(P)for(let ie=0,oe=P.length;ieae.endLineNumber,he=ae.startLineNumber>Z.endLineNumber;if(!ue&&!he){G=!0;break}}if(!G){$=!1;break}}if($)for(let ie=0,oe=this._trimAutoWhitespaceLines.length;ieue.endLineNumber)&&!(ae===ue.startLineNumber&&ue.startColumn===G&&ue.isEmpty()&&he&&he.length>0&&he.charAt(0)===` +`)&&!(ae===ue.startLineNumber&&ue.startColumn===1&&ue.isEmpty()&&he&&he.length>0&&he.charAt(he.length-1)===` +`)){j=!1;break}}if(j){const te=new g.Range(ae,1,ae,G);V.push(new c.ValidAnnotatedEditOperation(null,te,null,!1,!1,!1))}}this._trimAutoWhitespaceLines=null}return this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEditOperation(P,V,U)}_applyUndo(P,V,U,H){const $=P.map(ie=>{const oe=this.getPositionAt(ie.newPosition),ae=this.getPositionAt(ie.newEnd);return{range:new g.Range(oe.lineNumber,oe.column,ae.lineNumber,ae.column),text:ie.oldText}});this._applyUndoRedoEdits($,V,!0,!1,U,H)}_applyRedo(P,V,U,H){const $=P.map(ie=>{const oe=this.getPositionAt(ie.oldPosition),ae=this.getPositionAt(ie.oldEnd);return{range:new g.Range(oe.lineNumber,oe.column,ae.lineNumber,ae.column),text:ie.newText}});this._applyUndoRedoEdits($,V,!1,!0,U,H)}_applyUndoRedoEdits(P,V,U,H,$,ie){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._isUndoing=U,this._isRedoing=H,this.applyEdits(P,!1),this.setEOL(V),this._overwriteAlternativeVersionId($)}finally{this._isUndoing=!1,this._isRedoing=!1,this._eventEmitter.endDeferredEmit(ie),this._onDidChangeDecorations.endDeferredEmit()}}applyEdits(P,V=!1){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit();const U=this._validateEditOperations(P);return this._doApplyEdits(U,V)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_doApplyEdits(P,V){const U=this._buffer.getLineCount(),H=this._buffer.applyEdits(P,this._options.trimAutoWhitespace,V),$=this._buffer.getLineCount(),ie=H.changes;if(this._trimAutoWhitespaceLines=H.trimAutoWhitespaceLineNumbers,ie.length!==0){let oe=[],ae=U;for(let G=0,j=ie.length;G0?te.text.charCodeAt(0):0),this._onDidChangeDecorations.fire(),this._decorationsTree.acceptReplace(te.rangeOffset,te.rangeLength,te.text.length,te.forceMoveMarkers);const re=te.range.startLineNumber,ce=te.range.endLineNumber,me=ce-re,Ce=Z,be=Math.min(me,Ce),Le=Ce-me;for(let De=be;De>=0;De--){const Re=re+De,Ee=$-ae-Le+Re;oe.push(new r.ModelRawLineChanged(Re,this.getLineContent(Ee)))}if(bethis._deltaDecorationsImpl(P,[],[{range:$,options:ie}])[0],changeDecoration:($,ie)=>{this._changeDecorationImpl($,ie)},changeDecorationOptions:($,ie)=>{this._changeDecorationOptionsImpl($,ne(ie))},removeDecoration:$=>{this._deltaDecorationsImpl(P,[$],[])},deltaDecorations:($,ie)=>$.length===0&&ie.length===0?[]:this._deltaDecorationsImpl(P,$,ie)},H=null;try{H=V(U)}catch($){b.onUnexpectedError($)}return U.addDecoration=A,U.changeDecoration=A,U.changeDecorationOptions=A,U.removeDecoration=A,U.deltaDecorations=A,H}deltaDecorations(P,V,U=0){if(this._assertNotDisposed(),P||(P=[]),P.length===0&&V.length===0)return[];try{return this._onDidChangeDecorations.beginDeferredEmit(),this._deltaDecorationsImpl(U,P,V)}finally{this._onDidChangeDecorations.endDeferredEmit()}}_getTrackedRange(P){return this.getDecorationRange(P)}_setTrackedRange(P,V,U){const H=P?this._decorations[P]:null;if(!H)return V?this._deltaDecorationsImpl(0,[],[{range:V,options:se[U]}])[0]:null;if(!V)return this._decorationsTree.delete(H),delete this._decorations[H.id],null;const $=this._validateRangeRelaxedNoAllocations(V),ie=this._buffer.getOffsetAt($.startLineNumber,$.startColumn),oe=this._buffer.getOffsetAt($.endLineNumber,$.endColumn);return this._decorationsTree.delete(H),H.reset(this.getVersionId(),ie,oe,$),H.setOptions(se[U]),this._decorationsTree.insert(H),H.id}removeAllDecorationsWithOwnerId(P){if(!this._isDisposed){const V=this._decorationsTree.collectNodesFromOwner(P);for(let U=0,H=V.length;Uthis.getLineCount()?[]:this.getLinesDecorations(P,P,V,U)}getLinesDecorations(P,V,U=0,H=!1){let $=this.getLineCount(),ie=Math.min($,Math.max(1,P)),oe=Math.min($,Math.max(1,V)),ae=this.getLineMaxColumn(oe);return this._getDecorationsInRange(new g.Range(ie,1,oe,ae),U,H)}getDecorationsInRange(P,V=0,U=!1){let H=this.validateRange(P);return this._getDecorationsInRange(H,V,U)}getOverviewRulerDecorations(P=0,V=!1){const U=this.getVersionId(),H=this._decorationsTree.search(P,V,!0,U);return this._ensureNodesHaveRanges(H)}getAllDecorations(P=0,V=!1){const U=this.getVersionId(),H=this._decorationsTree.search(P,V,!1,U);return this._ensureNodesHaveRanges(H)}_getDecorationsInRange(P,V,U){const H=this._buffer.getOffsetAt(P.startLineNumber,P.startColumn),$=this._buffer.getOffsetAt(P.endLineNumber,P.endColumn),ie=this.getVersionId(),oe=this._decorationsTree.intervalSearch(H,$,V,U,ie);return this._ensureNodesHaveRanges(oe)}_ensureNodesHaveRanges(P){for(let V=0,U=P.length;V0&&this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:!1,ranges:V})}}setSemanticTokens(P,V){this._tokens2.set(P,V),this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:P!==null,ranges:[{fromLineNumber:1,toLineNumber:this.getLineCount()}]})}hasCompleteSemanticTokens(){return this._tokens2.isComplete()}hasSomeSemanticTokens(){return!this._tokens2.isEmpty()}setPartialSemanticTokens(P,V){if(!this.hasCompleteSemanticTokens()){const U=this._tokens2.setPartial(P,V);this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:!0,ranges:[{fromLineNumber:U.startLineNumber,toLineNumber:U.endLineNumber}]})}}tokenizeViewport(P,V){P=Math.max(1,P),V=Math.min(this._buffer.getLineCount(),V),this._tokenization.tokenizeViewport(P,V)}clearTokens(){this._tokens.flush(),this._emitModelTokensChangedEvent({tokenizationSupportChanged:!0,semanticTokensApplied:!1,ranges:[{fromLineNumber:1,toLineNumber:this._buffer.getLineCount()}]})}_emitModelTokensChangedEvent(P){this._isDisposing||this._onDidChangeTokens.fire(P)}resetTokenization(){this._tokenization.reset()}forceTokenization(P){if(P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");this._tokenization.forceTokenization(P)}isCheapToTokenize(P){return this._tokenization.isCheapToTokenize(P)}tokenizeIfCheap(P){this.isCheapToTokenize(P)&&this.forceTokenization(P)}getLineTokens(P){if(P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._getLineTokens(P)}_getLineTokens(P){const V=this.getLineContent(P),U=this._tokens.getTokens(this._languageIdentifier.id,P-1,V);return this._tokens2.addSemanticTokens(P,U)}getLanguageIdentifier(){return this._languageIdentifier}getModeId(){return this._languageIdentifier.language}setMode(P){if(this._languageIdentifier.id!==P.id){let V={oldLanguage:this._languageIdentifier.language,newLanguage:P.language};this._languageIdentifier=P,this._onDidChangeLanguage.fire(V),this._onDidChangeLanguageConfiguration.fire({})}}getLanguageIdAtPosition(P,V){const U=this.validatePosition(new d.Position(P,V)),H=this.getLineTokens(U.lineNumber);return H.getLanguageId(H.findTokenIndexAtOffset(U.column-1))}getWordAtPosition(P){this._assertNotDisposed();const V=this.validatePosition(P),U=this.getLineContent(V.lineNumber),H=this._getLineTokens(V.lineNumber),$=H.findTokenIndexAtOffset(V.column-1),[ie,oe]=D._findLanguageBoundaries(H,$),ae=t.getWordAtText(V.column,l.LanguageConfigurationRegistry.getWordDefinition(H.getLanguageId($)),U.substring(ie,oe),ie);if(ae&&ae.startColumn<=P.column&&P.column<=ae.endColumn)return ae;if($>0&&ie===V.column-1){const[G,j]=D._findLanguageBoundaries(H,$-1),te=t.getWordAtText(V.column,l.LanguageConfigurationRegistry.getWordDefinition(H.getLanguageId($-1)),U.substring(G,j),G);if(te&&te.startColumn<=P.column&&P.column<=te.endColumn)return te}return null}static _findLanguageBoundaries(P,V){const U=P.getLanguageId(V);let H=0;for(let ie=V;ie>=0&&P.getLanguageId(ie)===U;ie--)H=P.getStartOffset(ie);let $=P.getLineContent().length;for(let ie=V,oe=P.getCount();ie=0;te--){const Z=U.getEndOffset(te);if(Z<=ae)break;m.ignoreBracketsInToken(U.getStandardTokenType(te))&&(ae=Z)}const G=Math.min($.length,P.column-1+oe.maxBracketLength);let j=null;for(;;){const te=_.BracketsUtils.findNextBracketInRange(oe.forwardRegex,V,$,ae,G);if(!te)break;if(te.startColumn<=P.column&&P.column<=te.endColumn){const Z=$.substring(te.startColumn-1,te.endColumn-1).toLowerCase(),ue=this._matchFoundBracket(te,oe.textIsBracket[Z],oe.textIsOpenBracket[Z],null);if(ue){if(ue instanceof B)return null;j=ue}}ae=te.endColumn-1}if(j)return j}if(ie>0&&U.getStartOffset(ie)===P.column-1){const ae=ie-1,G=l.LanguageConfigurationRegistry.getBracketsSupport(U.getLanguageId(ae));if(G&&!m.ignoreBracketsInToken(U.getStandardTokenType(ae))){const j=Math.max(0,P.column-1-G.maxBracketLength);let te=Math.min($.length,P.column-1+G.maxBracketLength);for(let ue=ae+1;ue=te)break;m.ignoreBracketsInToken(U.getStandardTokenType(ue))&&(te=he)}const Z=_.BracketsUtils.findPrevBracketInRange(G.reversedRegex,V,$,j,te);if(Z&&Z.startColumn<=P.column&&P.column<=Z.endColumn){const ue=$.substring(Z.startColumn-1,Z.endColumn-1).toLowerCase(),he=this._matchFoundBracket(Z,G.textIsBracket[ue],G.textIsOpenBracket[ue],null);if(he)return he instanceof B?null:he}}}return null}_matchFoundBracket(P,V,U,H){if(!V)return null;const $=U?this._findMatchingBracketDown(V,P.getEndPosition(),H):this._findMatchingBracketUp(V,P.getStartPosition(),H);return $?$ instanceof B?$:[P,$]:null}_findMatchingBracketUp(P,V,U){const H=P.languageIdentifier.id,$=P.reversedRegex;let ie=-1,oe=0;const ae=(G,j,te,Z)=>{for(;;){if(U&&++oe%100==0&&!U())return B.INSTANCE;const ue=_.BracketsUtils.findPrevBracketInRange($,G,j,te,Z);if(!ue)break;const he=j.substring(ue.startColumn-1,ue.endColumn-1).toLowerCase();if(P.isOpen(he)?ie++:P.isClose(he)&&ie--,ie===0)return ue;Z=ue.startColumn-1}return null};for(let G=V.lineNumber;G>=1;G--){const j=this._getLineTokens(G),te=j.getCount(),Z=this._buffer.getLineContent(G);let ue=te-1,he=Z.length,re=Z.length;G===V.lineNumber&&(ue=j.findTokenIndexAtOffset(V.column-1),he=V.column-1,re=V.column-1);let ce=!0;for(;ue>=0;ue--){const me=j.getLanguageId(ue)===H&&!m.ignoreBracketsInToken(j.getStandardTokenType(ue));if(me)ce?he=j.getStartOffset(ue):(he=j.getStartOffset(ue),re=j.getEndOffset(ue));else if(ce&&he!==re){const Ce=ae(G,Z,he,re);if(Ce)return Ce}ce=me}if(ce&&he!==re){const me=ae(G,Z,he,re);if(me)return me}}return null}_findMatchingBracketDown(P,V,U){const H=P.languageIdentifier.id,$=P.forwardRegex;let ie=1,oe=0;const ae=(j,te,Z,ue)=>{for(;;){if(U&&++oe%100==0&&!U())return B.INSTANCE;const he=_.BracketsUtils.findNextBracketInRange($,j,te,Z,ue);if(!he)break;const re=te.substring(he.startColumn-1,he.endColumn-1).toLowerCase();if(P.isOpen(re)?ie++:P.isClose(re)&&ie--,ie===0)return he;Z=he.endColumn-1}return null},G=this.getLineCount();for(let j=V.lineNumber;j<=G;j++){const te=this._getLineTokens(j),Z=te.getCount(),ue=this._buffer.getLineContent(j);let he=0,re=0,ce=0;j===V.lineNumber&&(he=te.findTokenIndexAtOffset(V.column-1),re=V.column-1,ce=V.column-1);let me=!0;for(;he=1;$--){const ie=this._getLineTokens($),oe=ie.getCount(),ae=this._buffer.getLineContent($);let G=oe-1,j=ae.length,te=ae.length;if($===V.lineNumber){G=ie.findTokenIndexAtOffset(V.column-1),j=V.column-1,te=V.column-1;const ue=ie.getLanguageId(G);U!==ue&&(U=ue,H=l.LanguageConfigurationRegistry.getBracketsSupport(U))}let Z=!0;for(;G>=0;G--){const ue=ie.getLanguageId(G);if(U!==ue){if(H&&Z&&j!==te){const re=_.BracketsUtils.findPrevBracketInRange(H.reversedRegex,$,ae,j,te);if(re)return this._toFoundBracket(H,re);Z=!1}U=ue,H=l.LanguageConfigurationRegistry.getBracketsSupport(U)}const he=!!H&&!m.ignoreBracketsInToken(ie.getStandardTokenType(G));if(he)Z?j=ie.getStartOffset(G):(j=ie.getStartOffset(G),te=ie.getEndOffset(G));else if(H&&Z&&j!==te){const re=_.BracketsUtils.findPrevBracketInRange(H.reversedRegex,$,ae,j,te);if(re)return this._toFoundBracket(H,re)}Z=he}if(H&&Z&&j!==te){const ue=_.BracketsUtils.findPrevBracketInRange(H.reversedRegex,$,ae,j,te);if(ue)return this._toFoundBracket(H,ue)}}return null}findNextBracket(P){const V=this.validatePosition(P),U=this.getLineCount();let H=-1,$=null;for(let ie=V.lineNumber;ie<=U;ie++){const oe=this._getLineTokens(ie),ae=oe.getCount(),G=this._buffer.getLineContent(ie);let j=0,te=0,Z=0;if(ie===V.lineNumber){j=oe.findTokenIndexAtOffset(V.column-1),te=V.column-1,Z=V.column-1;const he=oe.getLanguageId(j);H!==he&&(H=he,$=l.LanguageConfigurationRegistry.getBracketsSupport(H))}let ue=!0;for(;jDate.now()-ue<=V}const H=this.validatePosition(P),$=this.getLineCount(),ie=new Map;let oe=[];const ae=(ue,he)=>{if(!ie.has(ue)){let re=[];for(let ce=0,me=he?he.brackets.length:0;ce{for(;;){if(U&&++G%100==0&&!U())return B.INSTANCE;const Ce=_.BracketsUtils.findNextBracketInRange(ue.forwardRegex,he,re,ce,me);if(!Ce)break;const be=re.substring(Ce.startColumn-1,Ce.endColumn-1).toLowerCase(),Le=ue.textIsBracket[be];if(Le&&(Le.isOpen(be)?oe[Le.index]++:Le.isClose(be)&&oe[Le.index]--,oe[Le.index]===-1))return this._matchFoundBracket(Ce,Le,!1,U);ce=Ce.endColumn-1}return null};let te=-1,Z=null;for(let ue=H.lineNumber;ue<=$;ue++){const he=this._getLineTokens(ue),re=he.getCount(),ce=this._buffer.getLineContent(ue);let me=0,Ce=0,be=0;if(ue===H.lineNumber){me=he.findTokenIndexAtOffset(H.column-1),Ce=H.column-1,be=H.column-1;const De=he.getLanguageId(me);te!==De&&(te=De,Z=l.LanguageConfigurationRegistry.getBracketsSupport(te),ae(te,Z))}let Le=!0;for(;meH)throw new Error("Illegal value for lineNumber");const $=l.LanguageConfigurationRegistry.getFoldingRules(this._languageIdentifier.id),ie=Boolean($&&$.offSide);let oe=-2,ae=-1,G=-2,j=-1;const te=Ee=>{if(oe!==-1&&(oe===-2||oe>Ee-1)){oe=-1,ae=-1;for(let Ae=Ee-2;Ae>=0;Ae--){let Se=this._computeIndentLevel(Ae);if(Se>=0){oe=Ae,ae=Se;break}}}if(G===-2){G=-1,j=-1;for(let Ae=Ee;Ae=0){G=Ae,j=Se;break}}}};let Z=-2,ue=-1,he=-2,re=-1;const ce=Ee=>{if(Z===-2){Z=-1,ue=-1;for(let Ae=Ee-2;Ae>=0;Ae--){let Se=this._computeIndentLevel(Ae);if(Se>=0){Z=Ae,ue=Se;break}}}if(he!==-1&&(he===-2||he=0){he=Ae,re=Se;break}}}};let me=0,Ce=!0,be=0,Le=!0,De=0,Re=0;for(let Ee=0;Ce||Le;Ee++){const Ae=P-Ee,Se=P+Ee;Ee>1&&(Ae<1||Ae1&&(Se>H||Se>U)&&(Le=!1),Ee>5e4&&(Ce=!1,Le=!1);let we=-1;if(Ce){const fe=this._computeIndentLevel(Ae-1);fe>=0?(G=Ae-1,j=fe,we=Math.ceil(fe/this._options.indentSize)):(te(Ae),we=this._getIndentLevelForWhitespaceLine(ie,ae,j))}let ye=-1;if(Le){const fe=this._computeIndentLevel(Se-1);fe>=0?(Z=Se-1,ue=fe,ye=Math.ceil(fe/this._options.indentSize)):(ce(Se),ye=this._getIndentLevelForWhitespaceLine(ie,ue,re))}if(Ee===0){Re=we;continue}if(Ee===1){if(Se<=H&&ye>=0&&Re+1===ye){Ce=!1,me=Se,be=Se,De=ye;continue}if(Ae>=1&&we>=0&&we-1===Re){Le=!1,me=Ae,be=Ae,De=we;continue}if(me=P,be=P,De=Re,De===0)return{startLineNumber:me,endLineNumber:be,indent:De}}Ce&&(we>=De?me=Ae:Ce=!1),Le&&(ye>=De?be=Se:Le=!1)}return{startLineNumber:me,endLineNumber:be,indent:De}}getLinesIndentGuides(P,V){this._assertNotDisposed();const U=this.getLineCount();if(P<1||P>U)throw new Error("Illegal value for startLineNumber");if(V<1||V>U)throw new Error("Illegal value for endLineNumber");const H=l.LanguageConfigurationRegistry.getFoldingRules(this._languageIdentifier.id),$=Boolean(H&&H.offSide);let ie=new Array(V-P+1),oe=-2,ae=-1,G=-2,j=-1;for(let te=P;te<=V;te++){let Z=te-P;const ue=this._computeIndentLevel(te-1);if(ue>=0){oe=te-1,ae=ue,ie[Z]=Math.ceil(ue/this._options.indentSize);continue}if(oe===-2){oe=-1,ae=-1;for(let he=te-2;he>=0;he--){let re=this._computeIndentLevel(he);if(re>=0){oe=he,ae=re;break}}}if(G!==-1&&(G===-2||G=0){G=he,j=re;break}}}ie[Z]=this._getIndentLevelForWhitespaceLine($,ae,j)}return ie}_getIndentLevelForWhitespaceLine(P,V,U){return V===-1||U===-1?0:V0){this._deferredEvent?this._deferredEvent=this._deferredEvent.merge(P):this._deferredEvent=P;return}this._fastEmitter.fire(P),this._slowEmitter.fire(P)}}e.DidChangeContentEmitter=X}),define(Q[42],J([0,1,12,8,14,3,21,31,41]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isQuote=e.CursorColumns=e.EditOperationResult=e.CursorState=e.PartialViewCursorState=e.PartialModelCursorState=e.CursorContext=e.SingleCursorState=e.CursorConfiguration=void 0;const g=()=>!0,p=()=>!1,c=h=>h===" "||h===" ";class o{constructor(m,_,f){this._languageIdentifier=m;const v=f.options,y=v.get(124);this.readOnly=v.get(75),this.tabSize=_.tabSize,this.indentSize=_.indentSize,this.insertSpaces=_.insertSpaces,this.stickyTabStops=v.get(99),this.lineHeight=v.get(53),this.pageSize=Math.max(1,Math.floor(y.height/this.lineHeight)-2),this.useTabStops=v.get(109),this.wordSeparators=v.get(110),this.emptySelectionClipboard=v.get(28),this.copyWithSyntaxHighlighting=v.get(18),this.multiCursorMergeOverlapping=v.get(63),this.multiCursorPaste=v.get(65),this.autoClosingBrackets=v.get(5),this.autoClosingQuotes=v.get(7),this.autoClosingOvertype=v.get(6),this.autoSurround=v.get(10),this.autoIndent=v.get(8),this.surroundingPairs={},this._electricChars=null,this.shouldAutoCloseBefore={quote:o._getShouldAutoClose(m,this.autoClosingQuotes),bracket:o._getShouldAutoClose(m,this.autoClosingBrackets)},this.autoClosingPairs=d.LanguageConfigurationRegistry.getAutoClosingPairs(m.id);let L=o._getSurroundingPairs(m);if(L)for(const I of L)this.surroundingPairs[I.open]=I.close}static shouldRecreate(m){return m.hasChanged(124)||m.hasChanged(110)||m.hasChanged(28)||m.hasChanged(63)||m.hasChanged(65)||m.hasChanged(5)||m.hasChanged(7)||m.hasChanged(6)||m.hasChanged(10)||m.hasChanged(109)||m.hasChanged(53)||m.hasChanged(75)}get electricChars(){if(!this._electricChars){this._electricChars={};let m=o._getElectricCharacters(this._languageIdentifier);if(m)for(const _ of m)this._electricChars[_]=!0}return this._electricChars}normalizeIndentation(m){return C.TextModel.normalizeIndentation(m,this.indentSize,this.insertSpaces)}static _getElectricCharacters(m){try{return d.LanguageConfigurationRegistry.getElectricCharacters(m.id)}catch(_){return b.onUnexpectedError(_),null}}static _getShouldAutoClose(m,_){switch(_){case"beforeWhitespace":return c;case"languageDefined":return o._getLanguageDefinedShouldAutoClose(m);case"always":return g;case"never":return p}}static _getLanguageDefinedShouldAutoClose(m){try{const _=d.LanguageConfigurationRegistry.getAutoCloseBeforeSet(m.id);return f=>_.indexOf(f)!==-1}catch(_){return b.onUnexpectedError(_),p}}static _getSurroundingPairs(m){try{return d.LanguageConfigurationRegistry.getSurroundingPairs(m.id)}catch(_){return b.onUnexpectedError(_),null}}}e.CursorConfiguration=o;class s{constructor(m,_,f,v){this.selectionStart=m,this.selectionStartLeftoverVisibleColumns=_,this.position=f,this.leftoverVisibleColumns=v,this.selection=s._computeSelection(this.selectionStart,this.position)}equals(m){return this.selectionStartLeftoverVisibleColumns===m.selectionStartLeftoverVisibleColumns&&this.leftoverVisibleColumns===m.leftoverVisibleColumns&&this.position.equals(m.position)&&this.selectionStart.equalsRange(m.selectionStart)}hasSelection(){return!this.selection.isEmpty()||!this.selectionStart.isEmpty()}move(m,_,f,v){return m?new s(this.selectionStart,this.selectionStartLeftoverVisibleColumns,new M.Position(_,f),v):new s(new w.Range(_,f,_,f),v,new M.Position(_,f),v)}static _computeSelection(m,_){let f,v,y,L;return m.isEmpty()?(f=m.startLineNumber,v=m.startColumn,y=_.lineNumber,L=_.column):_.isBeforeOrEqual(m.getStartPosition())?(f=m.endLineNumber,v=m.endColumn,y=_.lineNumber,L=_.column):(f=m.startLineNumber,v=m.startColumn,y=_.lineNumber,L=_.column),new S.Selection(f,v,y,L)}}e.SingleCursorState=s;class a{constructor(m,_,f){this.model=m,this.coordinatesConverter=_,this.cursorConfig=f}}e.CursorContext=a;class u{constructor(m){this.modelState=m,this.viewState=null}}e.PartialModelCursorState=u;class r{constructor(m){this.modelState=null,this.viewState=m}}e.PartialViewCursorState=r;class i{constructor(m,_){this.modelState=m,this.viewState=_}static fromModelState(m){return new u(m)}static fromViewState(m){return new r(m)}static fromModelSelection(m){const _=m.selectionStartLineNumber,f=m.selectionStartColumn,v=m.positionLineNumber,y=m.positionColumn,L=new s(new w.Range(_,f,_,f),0,new M.Position(v,y),0);return i.fromModelState(L)}static fromModelSelections(m){let _=[];for(let f=0,v=m.length;f=65536?2:1,k===9)L=t.nextRenderTabStop(L,f);else{let E=N.getGraphemeBreakType(k);for(;I=65536?2:1,E=O}N.isFullWidthCharacter(k)||N.isEmojiImprecise(k)?L=L+2:L=L+1}}return L}static visibleColumnFromColumn2(m,_,f){return this.visibleColumnFromColumn(_.getLineContent(f.lineNumber),f.column,m.tabSize)}static columnFromVisibleColumn(m,_,f){if(_<=0)return 1;const v=m.length;let y=0,L=1,I=0;for(;I=65536?2:1;let E;if(k===9)E=t.nextRenderTabStop(y,f);else{let O=N.getGraphemeBreakType(k);for(;I=65536?2:1,O=B}N.isFullWidthCharacter(k)||N.isEmojiImprecise(k)?E=y+2:E=y+1}const T=I+1;if(E>=_){const O=_-y;return E-_I?I:y}static nextRenderTabStop(m,_){return m+_-m%_}static nextIndentTabStop(m,_){return m+_-m%_}static prevRenderTabStop(m,_){return m-1-(m-1)%_}static prevIndentTabStop(m,_){return m-1-(m-1)%_}}e.CursorColumns=t;function l(h){return h==="'"||h==='"'||h==="`"}e.isQuote=l}),define(Q[179],J([0,1,8,42,3,21,41]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ShiftCommand=e.cachedStringRepeat=void 0;const C=Object.create(null);function d(p,c){C[p]||(C[p]=["",p]);const o=C[p];for(let s=o.length;s<=c;s++)o[s]=o[s-1]+p;return o[c]}e.cachedStringRepeat=d;class g{constructor(c,o){this._opts=o,this._selection=c,this._selectionId=null,this._useLastEditRangeForCursorEndPosition=!1,this._selectionStartColumnStaysPut=!1}static unshiftIndent(c,o,s,a,u){const r=N.CursorColumns.visibleColumnFromColumn(c,o,s);if(u){const i=d(" ",a),t=N.CursorColumns.prevIndentTabStop(r,a)/a;return d(i,t)}else{const i=" ",t=N.CursorColumns.prevRenderTabStop(r,s)/s;return d(i,t)}}static shiftIndent(c,o,s,a,u){const r=N.CursorColumns.visibleColumnFromColumn(c,o,s);if(u){const i=d(" ",a),t=N.CursorColumns.nextIndentTabStop(r,a)/a;return d(i,t)}else{const i=" ",t=N.CursorColumns.nextRenderTabStop(r,s)/s;return d(i,t)}}_addEditOperation(c,o,s){this._useLastEditRangeForCursorEndPosition?c.addTrackedEditOperation(o,s):c.addEditOperation(o,s)}getEditOperations(c,o){const s=this._selection.startLineNumber;let a=this._selection.endLineNumber;this._selection.endColumn===1&&s!==a&&(a=a-1);const{tabSize:u,indentSize:r,insertSpaces:i}=this._opts,n=s===a;if(this._opts.useTabStops){this._selection.isEmpty()&&/^\s*$/.test(c.getLineContent(s))&&(this._useLastEditRangeForCursorEndPosition=!0);let t=0,l=0;for(let h=s;h<=a;h++,t=l){l=0;let m=c.getLineContent(h),_=b.firstNonWhitespaceIndex(m);if(!(this._opts.isUnshift&&(m.length===0||_===0))&&!(!n&&!this._opts.isUnshift&&m.length===0)){if(_===-1&&(_=m.length),h>1&&N.CursorColumns.visibleColumnFromColumn(m,_+1,u)%r!=0&&c.isCheapToTokenize(h-1)){let y=S.LanguageConfigurationRegistry.getEnterAction(this._opts.autoIndent,c,new M.Range(h-1,c.getLineMaxColumn(h-1),h-1,c.getLineMaxColumn(h-1)));if(y){if(l=t,y.appendText)for(let L=0,I=y.appendText.length;Lc,u=p>o,r=po||_p||m1&&p--,w.columnSelect(C,d,g.fromViewLineNumber,g.fromViewVisualColumn,g.toViewLineNumber,p)}static columnSelectRight(C,d,g){let p=0;const c=Math.min(g.fromViewLineNumber,g.toViewLineNumber),o=Math.max(g.fromViewLineNumber,g.toViewLineNumber);for(let a=c;a<=o;a++){const u=d.getLineMaxColumn(a),r=b.CursorColumns.visibleColumnFromColumn2(C,d,new N.Position(a,u));p=Math.max(p,r)}let s=g.toViewVisualColumn;return sp.getLineMinColumn(c)?o=o-w.prevCharLength(p.getLineContent(c),o-1):c>1&&(c=c-1,o=p.getLineMaxColumn(c)),new N.Position(c,o)}static leftPositionAtomicSoftTabs(p,c,o,s){const a=p.getLineMinColumn(c),u=p.getLineContent(c),r=S.AtomicTabMoveOperations.atomicPosition(u,o-1,s,0);return r===-1||r+1n?(o=n,r?s=c.getLineMaxColumn(o):s=Math.min(c.getLineMaxColumn(o),s)):s=b.CursorColumns.columnFromVisibleColumn2(p,c,o,i),t?a=0:a=i-b.CursorColumns.visibleColumnFromColumn(c.getLineContent(o),s,p.tabSize),new C(o,s,a)}static moveDown(p,c,o,s,a){let u,r;o.hasSelection()&&!s?(u=o.selection.endLineNumber,r=o.selection.endColumn):(u=o.position.lineNumber,r=o.position.column);let i=d.down(p,c,u,r,o.leftoverVisibleColumns,a,!0);return o.move(s,i.lineNumber,i.column,i.leftoverVisibleColumns)}static translateDown(p,c,o){let s=o.selection,a=d.down(p,c,s.selectionStartLineNumber,s.selectionStartColumn,o.selectionStartLeftoverVisibleColumns,1,!1),u=d.down(p,c,s.positionLineNumber,s.positionColumn,o.leftoverVisibleColumns,1,!1);return new b.SingleCursorState(new M.Range(a.lineNumber,a.column,a.lineNumber,a.column),a.leftoverVisibleColumns,new N.Position(u.lineNumber,u.column),u.leftoverVisibleColumns)}static up(p,c,o,s,a,u,r){const i=b.CursorColumns.visibleColumnFromColumn(c.getLineContent(o),s,p.tabSize)+a,n=o===1&&s===1;return o=o-u,o<1?(o=1,r?s=c.getLineMinColumn(o):s=Math.min(c.getLineMaxColumn(o),s)):s=b.CursorColumns.columnFromVisibleColumn2(p,c,o,i),n?a=0:a=i-b.CursorColumns.visibleColumnFromColumn(c.getLineContent(o),s,p.tabSize),new C(o,s,a)}static moveUp(p,c,o,s,a){let u,r;o.hasSelection()&&!s?(u=o.selection.startLineNumber,r=o.selection.startColumn):(u=o.position.lineNumber,r=o.position.column);let i=d.up(p,c,u,r,o.leftoverVisibleColumns,a,!0);return o.move(s,i.lineNumber,i.column,i.leftoverVisibleColumns)}static translateUp(p,c,o){let s=o.selection,a=d.up(p,c,s.selectionStartLineNumber,s.selectionStartColumn,o.selectionStartLeftoverVisibleColumns,1,!1),u=d.up(p,c,s.positionLineNumber,s.positionColumn,o.leftoverVisibleColumns,1,!1);return new b.SingleCursorState(new M.Range(a.lineNumber,a.column,a.lineNumber,a.column),a.leftoverVisibleColumns,new N.Position(u.lineNumber,u.column),u.leftoverVisibleColumns)}static _isBlankLine(p,c){return p.getLineFirstNonWhitespaceColumn(c)===0}static moveToPrevBlankLine(p,c,o,s){let a=o.position.lineNumber;for(;a>1&&this._isBlankLine(c,a);)a--;for(;a>1&&!this._isBlankLine(c,a);)a--;return o.move(s,a,c.getLineMinColumn(a),0)}static moveToNextBlankLine(p,c,o,s){const a=c.getLineCount();let u=o.position.lineNumber;for(;u=n.length+1)return!1;const t=n.charAt(i.column-2),l=c.get(t);if(!l)return!1;if(M.isQuote(t)){if(p==="never")return!1}else if(g==="never")return!1;const h=n.charAt(i.column-1);let m=!1;for(const _ of l)_.open===t&&_.close===h&&(m=!0);if(!m)return!1}return!0}static _runAutoClosingPairDelete(g,p,c){let o=[];for(let s=0,a=c.length;s1){let l=c.getLineContent(t.lineNumber),h=b.firstNonWhitespaceIndex(l),m=h===-1?l.length+1:h+1;if(t.column<=m){let _=M.CursorColumns.visibleColumnFromColumn2(p,c,t),f=M.CursorColumns.prevIndentTabStop(_,p.indentSize),v=M.CursorColumns.columnFromVisibleColumn2(p,c,t.lineNumber,f);n=new S.Range(t.lineNumber,v,t.lineNumber,t.column)}else n=new S.Range(t.lineNumber,t.column-1,t.lineNumber,t.column)}else{let l=w.MoveOperations.left(p,c,t.lineNumber,t.column);n=new S.Range(l.lineNumber,l.column,t.lineNumber,t.column)}}if(n.isEmpty()){s[u]=null;continue}n.startLineNumber!==n.endLineNumber&&(a=!0),s[u]=new N.ReplaceCommand(n,"")}return[a,s]}static cut(g,p,c){let o=[];for(let s=0,a=c.length;s1?(i=r.lineNumber-1,n=p.getLineMaxColumn(r.lineNumber-1),t=r.lineNumber,l=p.getLineMaxColumn(r.lineNumber)):(i=r.lineNumber,n=1,t=r.lineNumber,l=p.getLineMaxColumn(r.lineNumber));let h=new S.Range(i,n,t,l);h.isEmpty()?o[s]=null:o[s]=new N.ReplaceCommand(h,"")}else o[s]=null;else o[s]=new N.ReplaceCommand(u,"")}return new M.EditOperationResult(0,o,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}}e.DeleteOperations=C}),define(Q[182],J([0,1,12,8,92,179,367,42,106,3,21,109,41]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TypeWithAutoClosingCommand=e.TypeOperations=void 0;class s{static indent(r,i,n){if(i===null||n===null)return[];let t=[];for(let l=0,h=n.length;l1){let m;for(m=n-1;m>=1;m--){const v=i.getLineContent(m);if(N.lastNonWhitespaceIndex(v)>=0)break}if(m<1)return null;const _=i.getLineMaxColumn(m),f=o.LanguageConfigurationRegistry.getEnterAction(r.autoIndent,i,new g.Range(m,_,m,_));f&&(l=f.indentation+f.appendText)}return t&&(t===c.IndentAction.Indent&&(l=s.shiftIndent(r,l)),t===c.IndentAction.Outdent&&(l=s.unshiftIndent(r,l)),l=r.normalizeIndentation(l)),l||null}static _replaceJumpToNextIndent(r,i,n,t){let l="",h=n.getStartPosition();if(r.insertSpaces){let m=C.CursorColumns.visibleColumnFromColumn2(r,i,h),_=r.indentSize,f=_-m%_;for(let v=0;vthis._compositionType(n,v,l,h,m,_));return new C.EditOperationResult(1,f,{shouldPushStackElementBefore:r!==1,shouldPushStackElementAfter:!1})}static _compositionType(r,i,n,t,l,h){if(!i.isEmpty())return null;const m=i.getPosition(),_=Math.max(1,m.column-t),f=Math.min(r.getLineMaxColumn(m.lineNumber),m.column+l),v=new g.Range(m.lineNumber,_,m.lineNumber,f);return r.getValueInRange(v)===n&&h===0?null:new M.ReplaceCommandWithOffsetCursorState(v,n,0,h)}static _typeCommand(r,i,n){return n?new M.ReplaceCommandWithoutChangingPosition(r,i,!0):new M.ReplaceCommand(r,i,!0)}static _enter(r,i,n,t){if(r.autoIndent===0)return s._typeCommand(t,` +`,n);if(!i.isCheapToTokenize(t.getStartPosition().lineNumber)||r.autoIndent===1){let _=i.getLineContent(t.startLineNumber),f=N.getLeadingWhitespace(_).substring(0,t.startColumn-1);return s._typeCommand(t,` +`+r.normalizeIndentation(f),n)}const l=o.LanguageConfigurationRegistry.getEnterAction(r.autoIndent,i,t);if(l){if(l.indentAction===c.IndentAction.None)return s._typeCommand(t,` +`+r.normalizeIndentation(l.indentation+l.appendText),n);if(l.indentAction===c.IndentAction.Indent)return s._typeCommand(t,` +`+r.normalizeIndentation(l.indentation+l.appendText),n);if(l.indentAction===c.IndentAction.IndentOutdent){const _=r.normalizeIndentation(l.indentation),f=r.normalizeIndentation(l.indentation+l.appendText),v=` +`+f+` +`+_;return n?new M.ReplaceCommandWithoutChangingPosition(t,v,!0):new M.ReplaceCommandWithOffsetCursorState(t,v,-1,f.length-_.length,!0)}else if(l.indentAction===c.IndentAction.Outdent){const _=s.unshiftIndent(r,l.indentation);return s._typeCommand(t,` +`+r.normalizeIndentation(_+l.appendText),n)}}const h=i.getLineContent(t.startLineNumber),m=N.getLeadingWhitespace(h).substring(0,t.startColumn-1);if(r.autoIndent>=4){const _=o.LanguageConfigurationRegistry.getIndentForEnter(r.autoIndent,i,t,{unshiftIndent:f=>s.unshiftIndent(r,f),shiftIndent:f=>s.shiftIndent(r,f),normalizeIndentation:f=>r.normalizeIndentation(f)});if(_){let f=C.CursorColumns.visibleColumnFromColumn2(r,i,t.getEndPosition());const v=t.endColumn,y=i.getLineContent(t.endLineNumber),L=N.firstNonWhitespaceIndex(y);if(L>=0?t=t.setEndPosition(t.endLineNumber,Math.max(t.endColumn,L+1)):t=t.setEndPosition(t.endLineNumber,i.getLineMaxColumn(t.endLineNumber)),n)return new M.ReplaceCommandWithoutChangingPosition(t,` +`+r.normalizeIndentation(_.afterEnter),!0);{let I=0;return v<=L+1&&(r.insertSpaces||(f=Math.ceil(f/r.indentSize)),I=Math.min(f+1-r.normalizeIndentation(_.afterEnter).length-1,0)),new M.ReplaceCommandWithOffsetCursorState(t,` +`+r.normalizeIndentation(_.afterEnter),0,I,!0)}}}return s._typeCommand(t,` +`+r.normalizeIndentation(m),n)}static _isAutoIndentType(r,i,n){if(r.autoIndent<4)return!1;for(let t=0,l=n.length;ts.shiftIndent(r,m),unshiftIndent:m=>s.unshiftIndent(r,m)});if(h===null)return null;if(h!==r.normalizeIndentation(l)){const m=i.getLineFirstNonWhitespaceColumn(n.startLineNumber);return m===0?s._typeCommand(new g.Range(n.startLineNumber,1,n.endLineNumber,n.endColumn),r.normalizeIndentation(h)+t,!1):s._typeCommand(new g.Range(n.startLineNumber,1,n.endLineNumber,n.endColumn),r.normalizeIndentation(h)+i.getLineContent(n.startLineNumber).substring(m-1,n.startColumn-1)+t,!1)}return null}static _isAutoClosingOvertype(r,i,n,t,l){if(r.autoClosingOvertype==="never"||!r.autoClosingPairs.autoClosingPairsCloseSingleChar.has(l))return!1;for(let h=0,m=n.length;h2?v.charCodeAt(f.column-2):0)===92&&L)return!1;if(r.autoClosingOvertype==="auto"){let k=!1;for(let E=0,T=t.length;Ei.startsWith(_.open)),m=l.some(_=>i.startsWith(_.close));return!h&&m}static _findAutoClosingPairOpen(r,i,n,t){const l=r.autoClosingPairs.autoClosingPairsOpenByEnd.get(t);if(!l)return null;let h=null;for(const m of l)if(h===null||m.open.length>h.open.length){let _=!0;for(const f of n)if(i.getValueInRange(new g.Range(f.lineNumber,f.column-m.open.length+1,f.lineNumber,f.column))+t!==m.open){_=!1;break}_&&(h=m)}return h}static _findSubAutoClosingPairClose(r,i){if(i.open.length<=1)return"";const n=i.close.charAt(i.close.length-1),t=r.autoClosingPairs.autoClosingPairsCloseByEnd.get(n)||[];let l=null;for(const h of t)h.open!==i.open&&i.open.includes(h.open)&&i.close.endsWith(h.close)&&(!l||h.open.length>l.open.length)&&(l=h);return l?l.close:""}static _getAutoClosingPairClose(r,i,n,t,l){const h=C.isQuote(t),m=h?r.autoClosingQuotes:r.autoClosingBrackets;if(m==="never")return null;const _=this._findAutoClosingPairOpen(r,i,n.map(L=>L.getPosition()),t);if(!_)return null;const f=this._findSubAutoClosingPairClose(r,_);let v=!0;const y=h?r.shouldAutoCloseBefore.quote:r.shouldAutoCloseBefore.bracket;for(let L=0,I=n.length;LE.column-1){const F=T.charAt(E.column-1);if(!s._isBeforeClosingBrace(r,O)&&!y(F))return null}if(!i.isCheapToTokenize(E.lineNumber))return null;if(_.open.length===1&&h&&m!=="always"){const F=d.getMapForWordSeparators(r.wordSeparators);if(l&&E.column>1&&F.get(T.charCodeAt(E.column-2))===0||!l&&E.column>2&&F.get(T.charCodeAt(E.column-3))===0)return null}i.forceTokenization(E.lineNumber);const A=i.getLineTokens(E.lineNumber);let B=!1;try{B=o.LanguageConfigurationRegistry.shouldAutoClosePair(_,A,l?E.column:E.column-1)}catch(F){b.onUnexpectedError(F)}if(!B)return null}return v?_.close.substring(0,_.close.length-f.length):_.close}static _runAutoClosingOpenCharType(r,i,n,t,l,h,m){let _=[];for(let f=0,v=t.length;fnew M.ReplaceCommand(new g.Range(v.positionLineNumber,v.positionColumn,v.positionLineNumber,v.positionColumn+1),"",!1));return new C.EditOperationResult(1,f,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}const _=this._getAutoClosingPairClose(i,n,l,m,!1);return _!==null?this._runAutoClosingOpenCharType(r,i,n,l,m,!1,_):null}static typeWithInterceptors(r,i,n,t,l,h,m){if(!r&&m===` +`){let v=[];for(let y=0,L=l.length;y=0;r--){let i=o.charCodeAt(r),n=s.get(i);if(n===0){if(u===2)return this._createWord(o,u,n,r+1,this._findEndOfWord(o,s,u,r+1));u=1}else if(n===2){if(u===1)return this._createWord(o,u,n,r+1,this._findEndOfWord(o,s,u,r+1));u=2}else if(n===1&&u!==0)return this._createWord(o,u,n,r+1,this._findEndOfWord(o,s,u,r+1))}return u!==0?this._createWord(o,u,1,0,this._findEndOfWord(o,s,u,0)):null}static _findEndOfWord(o,s,a,u){let r=o.length;for(let i=u;i=0;r--){let i=o.charCodeAt(r),n=s.get(i);if(n===1||a===1&&n===2||a===2&&n===0)return r+1}return 0}static moveWordLeft(o,s,a,u){let r=a.lineNumber,i=a.column;i===1&&r>1&&(r=r-1,i=s.getLineMaxColumn(r));let n=d._findPreviousWordOnLine(o,s,new S.Position(r,i));if(u===0)return new S.Position(r,n?n.start+1:1);if(u===1)return n&&n.wordType===2&&n.end-n.start==1&&n.nextCharClass===0&&(n=d._findPreviousWordOnLine(o,s,new S.Position(r,n.start+1))),new S.Position(r,n?n.start+1:1);if(u===3){for(;n&&n.wordType===2;)n=d._findPreviousWordOnLine(o,s,new S.Position(r,n.start+1));return new S.Position(r,n?n.start+1:1)}return n&&i<=n.end+1&&(n=d._findPreviousWordOnLine(o,s,new S.Position(r,n.start+1))),new S.Position(r,n?n.end+1:1)}static _moveWordPartLeft(o,s){const a=s.lineNumber,u=o.getLineMaxColumn(a);if(s.column===1)return a>1?new S.Position(a-1,o.getLineMaxColumn(a-1)):s;const r=o.getLineContent(a);for(let i=s.column-1;i>1;i--){const n=r.charCodeAt(i-2),t=r.charCodeAt(i-1);if(n===95&&t!==95)return new S.Position(a,i);if(b.isLowerAsciiLetter(n)&&b.isUpperAsciiLetter(t))return new S.Position(a,i);if(b.isUpperAsciiLetter(n)&&b.isUpperAsciiLetter(t)&&i+1=t.start+1&&(t=d._findNextWordOnLine(o,s,new S.Position(r,t.end+1))),t?i=t.start+1:i=s.getLineMaxColumn(r);return new S.Position(r,i)}static _moveWordPartRight(o,s){const a=s.lineNumber,u=o.getLineMaxColumn(a);if(s.column===u)return a1?l=1:(t--,l=u.getLineMaxColumn(t)):(h&&l<=h.end+1&&(h=d._findPreviousWordOnLine(a,u,new S.Position(t,h.start+1))),h?l=h.end+1:l>1?l=1:(t--,l=u.getLineMaxColumn(t))),new C.Range(t,l,n.lineNumber,n.column)}static deleteInsideWord(o,s,a){if(!a.isEmpty())return a;const u=new S.Position(a.positionLineNumber,a.positionColumn);let r=this._deleteInsideWordWhitespace(s,u);return r||this._deleteInsideWordDetermineDeleteRange(o,s,u)}static _charAtIsWhitespace(o,s){const a=o.charCodeAt(s);return a===32||a===9}static _deleteInsideWordWhitespace(o,s){const a=o.getLineContent(s.lineNumber),u=a.length;if(u===0)return null;let r=Math.max(s.column-2,0);if(!this._charAtIsWhitespace(a,r))return null;let i=Math.min(s.column-1,u-1);if(!this._charAtIsWhitespace(a,i))return null;for(;r>0&&this._charAtIsWhitespace(a,r-1);)r--;for(;i+11?new C.Range(a.lineNumber-1,s.getLineMaxColumn(a.lineNumber-1),a.lineNumber,1):a.lineNumberm.start+1<=a.column&&a.column<=m.end+1,n=(m,_)=>(m=Math.min(m,a.column),_=Math.max(_,a.column),new C.Range(a.lineNumber,m,a.lineNumber,_)),t=m=>{let _=m.start+1,f=m.end+1,v=!1;for(;f-11&&this._charAtIsWhitespace(u,_-2);)_--;return n(_,f)},l=d._findPreviousWordOnLine(o,s,a);if(l&&i(l))return t(l);const h=d._findNextWordOnLine(o,s,a);return h&&i(h)?t(h):l&&h?n(l.end+1,h.start+1):l?n(l.start+1,l.end+1):h?n(h.start+1,h.end+1):n(1,r+1)}static _deleteWordPartLeft(o,s){if(!s.isEmpty())return s;const a=s.getPosition(),u=d._moveWordPartLeft(o,a);return new C.Range(a.lineNumber,a.column,u.lineNumber,u.column)}static _findFirstNonWhitespaceChar(o,s){let a=o.length;for(let u=s;u=_.start+1&&(_=d._findNextWordOnLine(a,u,new S.Position(t,_.end+1))),_?l=_.start+1:lBoolean(o))}}),define(Q[241],J([0,1,20,42,180,136,14,3]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorMove=e.CursorMoveCommands=void 0;class d{static addCursorDown(c,o,s){let a=[],u=0;for(let r=0,i=o.length;rt&&(l=t,h=c.model.getLineMaxColumn(l)),N.CursorState.fromModelState(new N.SingleCursorState(new C.Range(r.lineNumber,1,l,h),0,new S.Position(l,h),0))}const n=o.modelState.selectionStart.getStartPosition().lineNumber;if(r.lineNumbern){const t=c.getLineCount();let l=i.lineNumber+1,h=1;return l>t&&(l=t,h=c.getLineMaxColumn(l)),N.CursorState.fromViewState(o.viewState.move(o.modelState.hasSelection(),l,h,0))}else{const t=o.modelState.selectionStart.getEndPosition();return N.CursorState.fromModelState(o.modelState.move(o.modelState.hasSelection(),t.lineNumber,t.column,0))}}static word(c,o,s,a){const u=c.model.validatePosition(a);return N.CursorState.fromModelState(w.WordOperations.word(c.cursorConfig,c.model,o.modelState,s,u))}static cancelSelection(c,o){if(!o.modelState.hasSelection())return new N.CursorState(o.modelState,o.viewState);const s=o.viewState.position.lineNumber,a=o.viewState.position.column;return N.CursorState.fromViewState(new N.SingleCursorState(new C.Range(s,a,s,a),0,new S.Position(s,a),0))}static moveTo(c,o,s,a,u){const r=c.model.validatePosition(a),i=u?c.coordinatesConverter.validateViewPosition(new S.Position(u.lineNumber,u.column),r):c.coordinatesConverter.convertModelPositionToViewPosition(r);return N.CursorState.fromViewState(o.viewState.move(s,i.lineNumber,i.column,0))}static simpleMove(c,o,s,a,u,r){switch(s){case 0:return r===4?this._moveHalfLineLeft(c,o,a):this._moveLeft(c,o,a,u);case 1:return r===4?this._moveHalfLineRight(c,o,a):this._moveRight(c,o,a,u);case 2:return r===2?this._moveUpByViewLines(c,o,a,u):this._moveUpByModelLines(c,o,a,u);case 3:return r===2?this._moveDownByViewLines(c,o,a,u):this._moveDownByModelLines(c,o,a,u);case 4:return r===2?o.map(i=>N.CursorState.fromViewState(M.MoveOperations.moveToPrevBlankLine(c.cursorConfig,c,i.viewState,a))):o.map(i=>N.CursorState.fromModelState(M.MoveOperations.moveToPrevBlankLine(c.cursorConfig,c.model,i.modelState,a)));case 5:return r===2?o.map(i=>N.CursorState.fromViewState(M.MoveOperations.moveToNextBlankLine(c.cursorConfig,c,i.viewState,a))):o.map(i=>N.CursorState.fromModelState(M.MoveOperations.moveToNextBlankLine(c.cursorConfig,c.model,i.modelState,a)));case 6:return this._moveToViewMinColumn(c,o,a);case 7:return this._moveToViewFirstNonWhitespaceColumn(c,o,a);case 8:return this._moveToViewCenterColumn(c,o,a);case 9:return this._moveToViewMaxColumn(c,o,a);case 10:return this._moveToViewLastNonWhitespaceColumn(c,o,a);default:return null}}static viewportMove(c,o,s,a,u){const r=c.getCompletelyVisibleViewRange(),i=c.coordinatesConverter.convertViewRangeToModelRange(r);switch(s){case 11:{const n=this._firstLineNumberInRange(c.model,i,u),t=c.model.getLineFirstNonWhitespaceColumn(n);return[this._moveToModelPosition(c,o[0],a,n,t)]}case 13:{const n=this._lastLineNumberInRange(c.model,i,u),t=c.model.getLineFirstNonWhitespaceColumn(n);return[this._moveToModelPosition(c,o[0],a,n,t)]}case 12:{const n=Math.round((i.startLineNumber+i.endLineNumber)/2),t=c.model.getLineFirstNonWhitespaceColumn(n);return[this._moveToModelPosition(c,o[0],a,n,t)]}case 14:{let n=[];for(let t=0,l=o.length;ts.endLineNumber-1&&(u=s.endLineNumber-1),u1;let r=[];for(let i=0,n=o.length;i1;let r=[];for(let i=0,n=o.length;ig){let p=d-g;for(let c=0;c=C+1&&this.lastAddedCursorIndex--,this.secondaryCursors[C].dispose(this.context),this.secondaryCursors.splice(C,1)}_getAll(){let C=[];C[0]=this.primaryCursor;for(let d=0,g=this.secondaryCursors.length;dg.selection.startLineNumber===p.selection.startLineNumber?g.selection.startColumn-p.selection.startColumn:g.selection.startLineNumber-p.selection.startLineNumber);for(let g=0;gi&&h.index--;C.splice(i,1),d.splice(r,1),this._removeSecondaryCursor(i-1),g--}}}}}}e.CursorCollection=w}),define(Q[242],J([0,1,12,8,538,42,181,182,3,21,170,2,173]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Cursor=e.CursorModelState=void 0;class s{constructor(n,t){this.modelVersionId=n.getVersionId(),this.cursorState=t.getCursorStates()}equals(n){if(!n||this.modelVersionId!==n.modelVersionId||this.cursorState.length!==n.cursorState.length)return!1;for(let t=0,l=this.cursorState.length;t=t.length||!t[l].strictContainsRange(n[l]))return!1;return!0}}class u extends c.Disposable{constructor(n,t,l,h){super();this._model=n,this._knownModelVersionId=this._model.getVersionId(),this._viewModel=t,this._coordinatesConverter=l,this.context=new w.CursorContext(this._model,this._coordinatesConverter,h),this._cursors=new M.CursorCollection(this.context),this._hasFocus=!1,this._isHandling=!1,this._isDoingComposition=!1,this._selectionsWhenCompositionStarted=null,this._columnSelectData=null,this._autoClosedActions=[],this._prevEditOperationType=0}dispose(){this._cursors.dispose(),this._autoClosedActions=c.dispose(this._autoClosedActions),super.dispose()}updateConfiguration(n){this.context=new w.CursorContext(this._model,this._coordinatesConverter,n),this._cursors.updateContext(this.context)}onLineMappingChanged(n){this._knownModelVersionId===this._model.getVersionId()&&this.setStates(n,"viewModel",0,this.getCursorStates())}setHasFocus(n){this._hasFocus=n}_validateAutoClosedActions(){if(this._autoClosedActions.length>0){let n=this._cursors.getSelections();for(let t=0;tu.MAX_CURSOR_COUNT&&(h=h.slice(0,u.MAX_CURSOR_COUNT),m=!0);const _=new s(this._model,this);return this._cursors.setStates(h),this._cursors.normalize(),this._columnSelectData=null,this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(n,t,l,_,m)}setCursorColumnSelectData(n){this._columnSelectData=n}revealPrimary(n,t,l,h){const m=this._cursors.getViewPositions();if(m.length>1){this._emitCursorRevealRange(n,t,null,this._cursors.getViewSelections(),0,l,h);return}else{const _=m[0],f=new d.Range(_.lineNumber,_.column,_.lineNumber,_.column);this._emitCursorRevealRange(n,t,f,null,0,l,h)}}_revealPrimaryCursor(n,t,l,h,m){const _=this._cursors.getViewPositions();if(_.length>1)this._emitCursorRevealRange(n,t,null,this._cursors.getViewSelections(),l,h,m);else{const f=_[0],v=new d.Range(f.lineNumber,f.column,f.lineNumber,f.column);this._emitCursorRevealRange(n,t,v,null,l,h,m)}}_emitCursorRevealRange(n,t,l,h,m,_,f){n.emitViewEvent(new p.ViewRevealRangeRequestEvent(t,l,h,m,_,f))}saveState(){let n=[];const t=this._cursors.getSelections();for(let l=0,h=t.length;l0){const h=w.CursorState.fromModelSelections(t.resultingSelection);this.setStates(n,"modelChange",t.isUndoing?5:t.isRedoing?6:2,h)&&this._revealPrimaryCursor(n,"modelChange",0,!0,0)}else{const h=this._cursors.readSelectionFromMarkers();this.setStates(n,"modelChange",2,w.CursorState.fromModelSelections(h))}}}getSelection(){return this._cursors.getPrimaryCursor().modelState.selection}getTopMostViewPosition(){return this._cursors.getTopMostViewPosition()}getBottomMostViewPosition(){return this._cursors.getBottomMostViewPosition()}getCursorColumnSelectData(){if(this._columnSelectData)return this._columnSelectData;const n=this._cursors.getPrimaryCursor(),t=n.viewState.selectionStart.getStartPosition(),l=n.viewState.position;return{isReal:!1,fromViewLineNumber:t.lineNumber,fromViewVisualColumn:w.CursorColumns.visibleColumnFromColumn2(this.context.cursorConfig,this._viewModel,t),toViewLineNumber:l.lineNumber,toViewVisualColumn:w.CursorColumns.visibleColumnFromColumn2(this.context.cursorConfig,this._viewModel,l)}}getSelections(){return this._cursors.getSelections()}setSelections(n,t,l,h){this.setStates(n,t,h,w.CursorState.fromModelSelections(l))}getPrevEditOperationType(){return this._prevEditOperationType}setPrevEditOperationType(n){this._prevEditOperationType=n}_pushAutoClosedAction(n,t){let l=[],h=[];for(let f=0,v=n.length;f0&&this._pushAutoClosedAction(l,h),this._prevEditOperationType=n.type}n.shouldPushStackElementAfter&&this._model.pushStackElement()}}_interpretCommandResult(n){(!n||n.length===0)&&(n=this._cursors.readSelectionFromMarkers()),this._columnSelectData=null,this._cursors.setSelections(n),this._cursors.normalize()}_emitStateChangedIfNecessary(n,t,l,h,m){const _=new s(this._model,this);if(_.equals(h))return!1;const f=this._cursors.getSelections(),v=this._cursors.getViewSelections();if(n.emitViewEvent(new p.ViewCursorStateChangedEvent(v,f)),!h||h.cursorState.length!==_.cursorState.length||_.cursorState.some((y,L)=>!y.modelState.equals(h.cursorState[L].modelState))){const y=h?h.cursorState.map(I=>I.modelState.selection):null,L=h?h.modelVersionId:0;n.emitOutgoingEvent(new o.CursorStateChangedEvent(y,f,L,_.modelVersionId,t||"keyboard",l,m))}return!0}_findAutoClosingPairs(n){if(!n.length)return null;let t=[];for(let l=0,h=n.length;l=0)return null;const _=m.text.match(/([)\]}>'"`])([^)\]}>'"`]*)$/);if(!_)return null;const f=_[1],v=this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(f);if(!v||v.length!==1)return null;const y=v[0].open,L=m.text.length-_[2].length-1,I=m.text.lastIndexOf(y,L-1);if(I===-1)return null;t.push([I,L])}return t}executeEdits(n,t,l,h){let m=null;t==="snippet"&&(m=this._findAutoClosingPairs(l)),m&&(l[0]._isTracked=!0);let _=[],f=[];const v=this._model.pushEditOperations(this.getSelections(),l,y=>{if(m)for(let I=0,k=m.length;I0&&this._pushAutoClosedAction(_,f)}_executeEdit(n,t,l,h=0){if(!this.context.cursorConfig.readOnly){const m=new s(this._model,this);this._cursors.stopTrackingSelections(),this._isHandling=!0;try{this._cursors.ensureValidState(),n()}catch(_){b.onUnexpectedError(_)}this._isHandling=!1,this._cursors.startTrackingSelections(),this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(t,l,h,m,!1)&&this._revealPrimaryCursor(t,l,0,!0,0)}}setIsDoingComposition(n){this._isDoingComposition=n}startComposition(n){this._selectionsWhenCompositionStarted=this.getSelections().slice(0)}endComposition(n,t){this._executeEdit(()=>{if(t==="keyboard"){const l=a.getAllAutoClosedCharacters(this._autoClosedActions);this._executeEditOperation(C.TypeOperations.compositionEndWithInterceptors(this._prevEditOperationType,this.context.cursorConfig,this._model,this._selectionsWhenCompositionStarted,this.getSelections(),l)),this._selectionsWhenCompositionStarted=null}},n,t)}type(n,t,l){this._executeEdit(()=>{if(l==="keyboard"){const h=t.length;let m=0;for(;m{const y=v.getPosition();return new g.Selection(y.lineNumber,y.column+m,y.lineNumber,y.column+m)});this.setSelections(n,_,f,0)}return}this._executeEdit(()=>{this._executeEditOperation(C.TypeOperations.compositionType(this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),t,l,h,m))},n,_)}paste(n,t,l,h,m){this._executeEdit(()=>{this._executeEditOperation(C.TypeOperations.paste(this.context.cursorConfig,this._model,this.getSelections(),t,l,h||[]))},n,m,4)}cut(n,t){this._executeEdit(()=>{this._executeEditOperation(S.DeleteOperations.cut(this.context.cursorConfig,this._model,this.getSelections()))},n,t)}executeCommand(n,t,l){this._executeEdit(()=>{this._cursors.killSecondaryCursors(),this._executeEditOperation(new w.EditOperationResult(0,[t],{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},n,l)}executeCommands(n,t,l){this._executeEdit(()=>{this._executeEditOperation(new w.EditOperationResult(0,t,{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},n,l)}}e.Cursor=u,u.MAX_CURSOR_COUNT=1e4;class r{static executeCommands(n,t,l){const h={model:n,selectionsBefore:t,trackedRanges:[],trackedRangesDirection:[]},m=this._innerExecuteCommands(h,l);for(let _=0,f=h.trackedRanges.length;_0&&(_[0]._isTracked=!0);let f=n.model.pushEditOperations(n.selectionsBefore,_,y=>{let L=[];for(let E=0;EE.identifier.minor-T.identifier.minor;let k=[];for(let E=0;E0?(L[E].sort(I),k[E]=t[E].computeCursorState(n.model,{getInverseEditOperations:()=>L[E],getTrackedSelection:T=>{const O=parseInt(T,10),A=n.model._getTrackedRange(n.trackedRanges[O]);return n.trackedRangesDirection[O]===0?new g.Selection(A.startLineNumber,A.startColumn,A.endLineNumber,A.endColumn):new g.Selection(A.endLineNumber,A.endColumn,A.startLineNumber,A.startColumn)}})):k[E]=n.selectionsBefore[E];return k});f||(f=n.selectionsBefore);let v=[];for(let y in m)m.hasOwnProperty(y)&&v.push(parseInt(y,10));v.sort((y,L)=>L-y);for(const y of v)f.splice(y,1);return f}static _arrayIsEmpty(n){for(let t=0,l=n.length;t{d.Range.isEmpty(I)&&k===""||h.push({identifier:{major:t,minor:m++},range:I,text:k,forceMoveMarkers:E,isAutoWhitespaceEdit:l.insertsAutoWhitespace})};let f=!1;const L={addEditOperation:_,addTrackedEditOperation:(I,k,E)=>{f=!0,_(I,k,E)},trackSelection:(I,k)=>{const E=g.Selection.liftSelection(I);let T;if(E.isEmpty())if(typeof k=="boolean")k?T=2:T=3;else{const B=n.model.getLineMaxColumn(E.startLineNumber);E.startColumn===B?T=2:T=3}else T=1;const O=n.trackedRanges.length,A=n.model._setTrackedRange(null,E,T);return n.trackedRanges[O]=A,n.trackedRangesDirection[O]=E.getDirection(),O.toString()}};try{l.getEditOperations(n.model,L)}catch(I){return b.onUnexpectedError(I),{operations:[],hadTrackedEditOperation:!1}}return{operations:h,hadTrackedEditOperation:f}}static _getLoserCursorMap(n){n=n.slice(0),n.sort((l,h)=>-d.Range.compareRangesUsingEnds(l.range,h.range));let t={};for(let l=1;lm.identifier.major?_=h.identifier.major:_=m.identifier.major,t[_.toString()]=!0;for(let f=0;f0&&l--}}return t}}}),define(Q[243],J([0,1,8,113,76]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.tokenizeLineToHTML=e.tokenizeToString=void 0;const w={getInitialState:()=>M.NULL_STATE,tokenize2:(g,p,c,o)=>M.nullTokenize2(0,g,c,o)};function S(g,p=w){return d(g,p||w)}e.tokenizeToString=S;function C(g,p,c,o,s,a,u){let r="
    ",i=o,n=0;for(let t=0,l=p.getCount();t0;)m+=u?" ":" ",f--;break;case 60:m+="<";break;case 62:m+=">";break;case 38:m+="&";break;case 0:m+="�";break;case 65279:case 8232:case 8233:case 133:m+="\uFFFD";break;case 13:m+="​";break;case 32:m+=u?" ":" ";break;default:m+=String.fromCharCode(_)}}if(r+=`${m}`,h>s||i>=s)break}}return r+="
    ",r}e.tokenizeLineToHTML=C;function d(g,p){let c='
    ',o=b.splitLines(g),s=p.getInitialState();for(let a=0,u=o.length;a0&&(c+="
    ");let i=p.tokenize2(r,!0,s,0);N.LineTokens.convertToEndOffset(i.tokens,r.length);let t=new N.LineTokens(i.tokens,r).inflate(),l=0;for(let h=0,m=t.getCount();h${b.escape(r.substring(l,f))}`,l=f}s=i.endState}return c+="
    ",c}}),define(Q[67],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITextModelService=void 0,e.ITextModelService=b.createDecorator("textModelService")}),define(Q[137],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITextResourcePropertiesService=e.ITextResourceConfigurationService=void 0,e.ITextResourceConfigurationService=b.createDecorator("textResourceConfigurationService"),e.ITextResourcePropertiesService=b.createDecorator("textResourcePropertiesService")}),define(Q[244],J([0,1,6,216,18]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapTokensColorTracker=void 0;class w{constructor(){this._onDidChange=new b.Emitter,this.onDidChange=this._onDidChange.event,this._updateColorMap(),M.TokenizationRegistry.onDidChange(C=>{C.changedColorMap&&this._updateColorMap()})}static getInstance(){return this._INSTANCE||(this._INSTANCE=new w),this._INSTANCE}_updateColorMap(){const C=M.TokenizationRegistry.getColorMap();if(!C){this._colors=[N.RGBA8.Empty],this._backgroundIsLight=!0;return}this._colors=[N.RGBA8.Empty];for(let g=1;g=.5,this._onDidChange.fire(void 0)}getColor(C){return(C<1||C>=this._colors.length)&&(C=2),this._colors[C]}backgroundIsLight(){return this._backgroundIsLight}}e.MinimapTokensColorTracker=w,w._INSTANCE=null}),define(Q[539],J([0,1,19,14,3,31,170,222,63]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IdentityLinesCollection=e.IdentityCoordinatesConverter=e.SplitLine=e.SplitLinesCollection=e.CoordinatesConverter=void 0;class g{constructor(_){this._lines=_}convertViewPositionToModelPosition(_){return this._lines.convertViewPositionToModelPosition(_.lineNumber,_.column)}convertViewRangeToModelRange(_){return this._lines.convertViewRangeToModelRange(_)}validateViewPosition(_,f){return this._lines.validateViewPosition(_.lineNumber,_.column,f)}validateViewRange(_,f){return this._lines.validateViewRange(_,f)}convertModelPositionToViewPosition(_){return this._lines.convertModelPositionToViewPosition(_.lineNumber,_.column)}convertModelRangeToViewRange(_){return this._lines.convertModelRangeToViewRange(_)}modelPositionIsVisible(_){return this._lines.modelPositionIsVisible(_.lineNumber,_.column)}getModelLineViewLineCount(_){return this._lines.getModelLineViewLineCount(_)}}e.CoordinatesConverter=g;class p{constructor(_){this._counts=_,this._isValid=!1,this._validEndIndex=-1,this._modelToView=[],this._viewToModel=[]}_invalidate(_){this._isValid=!1,this._validEndIndex=Math.min(this._validEndIndex,_-1)}_ensureValid(){if(!this._isValid){for(let _=this._validEndIndex+1,f=this._counts.length;_0?this._modelToView[_-1]:0;this._modelToView[_]=y+v;for(let L=0;L0?this._modelToView[f-1]:0;return new C.PrefixSumIndexOfResult(f,_-v)}}class c{constructor(_,f,v,y,L,I,k,E){this.model=_,this._validModelVersionId=-1,this._domLineBreaksComputerFactory=f,this._monospaceLineBreaksComputerFactory=v,this.fontInfo=y,this.tabSize=L,this.wrappingStrategy=I,this.wrappingColumn=k,this.wrappingIndent=E,this._constructLines(!0,null)}dispose(){this.hiddenAreasIds=this.model.deltaDecorations(this.hiddenAreasIds,[])}createCoordinatesConverter(){return new g(this)}_constructLines(_,f){this.lines=[],_&&(this.hiddenAreasIds=[]);let v=this.model.getLinesContent();const y=v.length,L=this.createLineBreaksComputer();for(let F=0;Fthis.model.getDecorationRange(F)).sort(M.Range.compareRangesUsingStarts),T=1,O=0,A=-1,B=A+1=T&&D<=O,W=n(I[F],!R);k[F]=W.getViewLineCount(),this.lines[F]=W}this._validModelVersionId=this.model.getVersionId(),this.prefixSumComputer=new p(k)}getHiddenAreas(){return this.hiddenAreasIds.map(_=>this.model.getDecorationRange(_))}_reduceRanges(_){if(_.length===0)return[];let f=_.map(I=>this.model.validateRange(I)).sort(M.Range.compareRangesUsingStarts),v=[],y=f[0].startLineNumber,L=f[0].endLineNumber;for(let I=1,k=f.length;IL+1?(v.push(new M.Range(y,1,L,1)),y=E.startLineNumber,L=E.endLineNumber):E.endLineNumber>L&&(L=E.endLineNumber)}return v.push(new M.Range(y,1,L,1)),v}setHiddenAreas(_){let f=this._reduceRanges(_),v=this.hiddenAreasIds.map(A=>this.model.getDecorationRange(A)).sort(M.Range.compareRangesUsingStarts);if(f.length===v.length){let A=!1;for(let B=0;B=I&&B<=k?this.lines[A].isVisible()&&(this.lines[A]=this.lines[A].setVisible(!1),F=!0):(O=!0,this.lines[A].isVisible()||(this.lines[A]=this.lines[A].setVisible(!0),F=!0)),F){let D=this.lines[A].getViewLineCount();this.prefixSumComputer.changeValue(A,D)}}return O||this.setHiddenAreas([]),!0}modelPositionIsVisible(_,f){return _<1||_>this.lines.length?!1:this.lines[_-1].isVisible()}getModelLineViewLineCount(_){return _<1||_>this.lines.length?1:this.lines[_-1].getViewLineCount()}setTabSize(_){return this.tabSize===_?!1:(this.tabSize=_,this._constructLines(!1,null),!0)}setWrappingSettings(_,f,v,y){const L=this.fontInfo.equals(_),I=this.wrappingStrategy===f,k=this.wrappingColumn===v,E=this.wrappingIndent===y;if(L&&I&&k&&E)return!1;const T=L&&I&&!k&&E;this.fontInfo=_,this.wrappingStrategy=f,this.wrappingColumn=v,this.wrappingIndent=y;let O=null;if(T){O=[];for(let A=0,B=this.lines.length;A2&&!this.lines[f-2].isVisible();let I=f===1?1:this.prefixSumComputer.getAccumulatedValue(f-2)+1,k=0,E=[],T=[];for(let O=0,A=y.length;OE?(O=f===1?1:this.prefixSumComputer.getAccumulatedValue(f-2)+1,A=O+E-1,D=A+1,R=D+(L-E)-1,T=!0):Lf?f:_|0}getActiveIndentGuide(_,f,v){_=this._toValidViewLineNumber(_),f=this._toValidViewLineNumber(f),v=this._toValidViewLineNumber(v);const y=this.convertViewPositionToModelPosition(_,this.getViewLineMinColumn(_)),L=this.convertViewPositionToModelPosition(f,this.getViewLineMinColumn(f)),I=this.convertViewPositionToModelPosition(v,this.getViewLineMinColumn(v)),k=this.model.getActiveIndentGuide(y.lineNumber,L.lineNumber,I.lineNumber),E=this.convertModelPositionToViewPosition(k.startLineNumber,1),T=this.convertModelPositionToViewPosition(k.endLineNumber,this.model.getLineMaxColumn(k.endLineNumber));return{startLineNumber:E.lineNumber,endLineNumber:T.lineNumber,indent:k.indent}}getViewLinesIndentGuides(_,f){_=this._toValidViewLineNumber(_),f=this._toValidViewLineNumber(f);const v=this.convertViewPositionToModelPosition(_,this.getViewLineMinColumn(_)),y=this.convertViewPositionToModelPosition(f,this.getViewLineMaxColumn(f));let L=[],I=[],k=[];const E=v.lineNumber-1,T=y.lineNumber-1;let O=null;for(let D=E;D<=T;D++){const R=this.lines[D];if(R.isVisible()){let W=R.getViewLineNumberOfModelPosition(0,D===E?v.column:1),x=R.getViewLineNumberOfModelPosition(0,this.model.getLineMaxColumn(D+1)),K=x-W+1,Y=0;K>1&&R.getViewLineMinColumn(this.model,D+1,x)===1&&(Y=W===0?1:2),I.push(K),k.push(Y),O===null&&(O=new N.Position(D+1,0))}else O!==null&&(L=L.concat(this.model.getLinesIndentGuides(O.lineNumber,D)),O=null)}O!==null&&(L=L.concat(this.model.getLinesIndentGuides(O.lineNumber,y.lineNumber)),O=null);const A=f-_+1;let B=new Array(A),F=0;for(let D=0,R=L.length;Df&&(D=!0,F=f-L+1);let R=B+F;if(A.getViewLinesData(this.model,T+1,B,R,L-_,v,E),L+=F,D)break}}return E}validateViewPosition(_,f,v){_=this._toValidViewLineNumber(_);let y=this.prefixSumComputer.getIndexOf(_-1),L=y.index,I=y.remainder,k=this.lines[L],E=k.getViewLineMinColumn(this.model,L+1,I),T=k.getViewLineMaxColumn(this.model,L+1,I);fT&&(f=T);let O=k.getModelColumnOfViewPosition(I,f);return this.model.validatePosition(new N.Position(L+1,O)).equals(v)?new N.Position(_,f):this.convertModelPositionToViewPosition(v.lineNumber,v.column)}validateViewRange(_,f){const v=this.validateViewPosition(_.startLineNumber,_.startColumn,f.getStartPosition()),y=this.validateViewPosition(_.endLineNumber,_.endColumn,f.getEndPosition());return new M.Range(v.lineNumber,v.column,y.lineNumber,y.column)}convertViewPositionToModelPosition(_,f){_=this._toValidViewLineNumber(_);let v=this.prefixSumComputer.getIndexOf(_-1),y=v.index,L=v.remainder,I=this.lines[y].getModelColumnOfViewPosition(L,f);return this.model.validatePosition(new N.Position(y+1,I))}convertViewRangeToModelRange(_){const f=this.convertViewPositionToModelPosition(_.startLineNumber,_.startColumn),v=this.convertViewPositionToModelPosition(_.endLineNumber,_.endColumn);return new M.Range(f.lineNumber,f.column,v.lineNumber,v.column)}convertModelPositionToViewPosition(_,f){const v=this.model.validatePosition(new N.Position(_,f)),y=v.lineNumber,L=v.column;let I=y-1,k=!1;for(;I>0&&!this.lines[I].isVisible();)I--,k=!0;if(I===0&&!this.lines[I].isVisible())return new N.Position(1,1);const E=1+(I===0?0:this.prefixSumComputer.getAccumulatedValue(I-1));let T;return k?T=this.lines[I].getViewPositionOfModelPosition(E,this.model.getLineMaxColumn(I+1)):T=this.lines[y-1].getViewPositionOfModelPosition(E,L),T}convertModelRangeToViewRange(_){let f=this.convertModelPositionToViewPosition(_.startLineNumber,_.startColumn),v=this.convertModelPositionToViewPosition(_.endLineNumber,_.endColumn);return _.startLineNumber===_.endLineNumber&&f.lineNumber!==v.lineNumber&&v.column===this.getViewLineMinColumn(v.lineNumber)?new M.Range(f.lineNumber,f.column,v.lineNumber-1,this.getViewLineMaxColumn(v.lineNumber-1)):new M.Range(f.lineNumber,f.column,v.lineNumber,v.column)}_getViewLineNumberForModelPosition(_,f){let v=_-1;if(this.lines[v].isVisible()){const L=1+(v===0?0:this.prefixSumComputer.getAccumulatedValue(v-1));return this.lines[v].getViewLineNumberOfModelPosition(L,f)}for(;v>0&&!this.lines[v].isVisible();)v--;if(v===0&&!this.lines[v].isVisible())return 1;const y=1+(v===0?0:this.prefixSumComputer.getAccumulatedValue(v-1));return this.lines[v].getViewLineNumberOfModelPosition(y,this.model.getLineMaxColumn(v+1))}getAllOverviewRulerDecorations(_,f,v){const y=this.model.getOverviewRulerDecorations(_,f),L=new h;for(const I of y){const k=I.options.overviewRuler,E=k?k.position:0;if(E!==0){const T=k.getColor(v),O=this._getViewLineNumberForModelPosition(I.range.startLineNumber,I.range.startColumn),A=this._getViewLineNumberForModelPosition(I.range.endLineNumber,I.range.endColumn);L.accept(T,O,A,E)}}return L.result}getDecorationsInRange(_,f,v){const y=this.convertViewPositionToModelPosition(_.startLineNumber,_.startColumn),L=this.convertViewPositionToModelPosition(_.endLineNumber,_.endColumn);if(L.lineNumber-y.lineNumber<=_.endLineNumber-_.startLineNumber)return this.model.getDecorationsInRange(new M.Range(y.lineNumber,1,L.lineNumber,L.column),f,v);let I=[];const k=y.lineNumber-1,E=L.lineNumber-1;let T=null;for(let F=k;F<=E;F++)if(this.lines[F].isVisible())T===null&&(T=new N.Position(F+1,F===k?y.column:1));else if(T!==null){const R=this.model.getLineMaxColumn(F);I=I.concat(this.model.getDecorationsInRange(new M.Range(T.lineNumber,T.column,F,R),f,v)),T=null}T!==null&&(I=I.concat(this.model.getDecorationsInRange(new M.Range(T.lineNumber,T.column,L.lineNumber,L.column),f,v)),T=null),I.sort((F,D)=>{const R=M.Range.compareRangesUsingStarts(F.range,D.range);return R===0?F.idD.id?1:0:R});let O=[],A=0,B=null;for(const F of I){const D=F.id;B!==D&&(B=D,O[A++]=F)}return O}}e.SplitLinesCollection=c;class o{constructor(){}isVisible(){return!0}setVisible(_){return _?this:s.INSTANCE}getLineBreakData(){return null}getViewLineCount(){return 1}getViewLineContent(_,f,v){return _.getLineContent(f)}getViewLineLength(_,f,v){return _.getLineLength(f)}getViewLineMinColumn(_,f,v){return _.getLineMinColumn(f)}getViewLineMaxColumn(_,f,v){return _.getLineMaxColumn(f)}getViewLineData(_,f,v){let y=_.getLineTokens(f),L=y.getLineContent();return new d.ViewLineData(L,!1,1,L.length+1,0,y.inflate())}getViewLinesData(_,f,v,y,L,I,k){if(!I[L]){k[L]=null;return}k[L]=this.getViewLineData(_,f,0)}getModelColumnOfViewPosition(_,f){return f}getViewPositionOfModelPosition(_,f){return new N.Position(_,f)}getViewLineNumberOfModelPosition(_,f){return _}}o.INSTANCE=new o;class s{constructor(){}isVisible(){return!1}setVisible(_){return _?o.INSTANCE:this}getLineBreakData(){return null}getViewLineCount(){return 0}getViewLineContent(_,f,v){throw new Error("Not supported")}getViewLineLength(_,f,v){throw new Error("Not supported")}getViewLineMinColumn(_,f,v){throw new Error("Not supported")}getViewLineMaxColumn(_,f,v){throw new Error("Not supported")}getViewLineData(_,f,v){throw new Error("Not supported")}getViewLinesData(_,f,v,y,L,I,k){throw new Error("Not supported")}getModelColumnOfViewPosition(_,f){throw new Error("Not supported")}getViewPositionOfModelPosition(_,f){throw new Error("Not supported")}getViewLineNumberOfModelPosition(_,f){throw new Error("Not supported")}}s.INSTANCE=new s;class a{constructor(_,f){this._lineBreakData=_,this._isVisible=f}isVisible(){return this._isVisible}setVisible(_){return this._isVisible=_,this}getLineBreakData(){return this._lineBreakData}getViewLineCount(){return this._isVisible?this._lineBreakData.breakOffsets.length:0}getInputStartOffsetOfOutputLineIndex(_){return d.LineBreakData.getInputOffsetOfOutputPosition(this._lineBreakData.breakOffsets,_,0)}getInputEndOffsetOfOutputLineIndex(_,f,v){return v+1===this._lineBreakData.breakOffsets.length?_.getLineMaxColumn(f)-1:d.LineBreakData.getInputOffsetOfOutputPosition(this._lineBreakData.breakOffsets,v+1,0)}getViewLineContent(_,f,v){if(!this._isVisible)throw new Error("Not supported");let y=this.getInputStartOffsetOfOutputLineIndex(v),L=this.getInputEndOffsetOfOutputLineIndex(_,f,v),I=_.getValueInRange({startLineNumber:f,startColumn:y+1,endLineNumber:f,endColumn:L+1});return v>0&&(I=r(this._lineBreakData.wrappedTextIndentLength)+I),I}getViewLineLength(_,f,v){if(!this._isVisible)throw new Error("Not supported");let y=this.getInputStartOffsetOfOutputLineIndex(v),I=this.getInputEndOffsetOfOutputLineIndex(_,f,v)-y;return v>0&&(I=this._lineBreakData.wrappedTextIndentLength+I),I}getViewLineMinColumn(_,f,v){if(!this._isVisible)throw new Error("Not supported");return v>0?this._lineBreakData.wrappedTextIndentLength+1:1}getViewLineMaxColumn(_,f,v){if(!this._isVisible)throw new Error("Not supported");return this.getViewLineContent(_,f,v).length+1}getViewLineData(_,f,v){if(!this._isVisible)throw new Error("Not supported");let y=this.getInputStartOffsetOfOutputLineIndex(v),L=this.getInputEndOffsetOfOutputLineIndex(_,f,v),I=_.getValueInRange({startLineNumber:f,startColumn:y+1,endLineNumber:f,endColumn:L+1});v>0&&(I=r(this._lineBreakData.wrappedTextIndentLength)+I);let k=v>0?this._lineBreakData.wrappedTextIndentLength+1:1,E=I.length+1,T=v+10&&(O=this._lineBreakData.wrappedTextIndentLength);let A=_.getLineTokens(f);const B=v===0?0:this._lineBreakData.breakOffsetsVisibleColumn[v-1];return new d.ViewLineData(I,T,k,E,B,A.sliceAndInflate(y,L,O))}getViewLinesData(_,f,v,y,L,I,k){if(!this._isVisible)throw new Error("Not supported");for(let E=v;E0&&(v0&&(L+=this._lineBreakData.wrappedTextIndentLength),new N.Position(_+y,L)}getViewLineNumberOfModelPosition(_,f){if(!this._isVisible)throw new Error("Not supported");const v=d.LineBreakData.getOutputPositionOfInputOffset(this._lineBreakData.breakOffsets,f-1);return _+v.outputLineIndex}}e.SplitLine=a;let u=[""];function r(m){if(m>=u.length)for(let _=1;_<=m;_++)u[_]=i(_);return u[m]}function i(m){return new Array(m+1).join(" ")}function n(m,_){return m===null?_?o.INSTANCE:s.INSTANCE:new a(m,_)}class t{constructor(_){this._lines=_}_validPosition(_){return this._lines.model.validatePosition(_)}_validRange(_){return this._lines.model.validateRange(_)}convertViewPositionToModelPosition(_){return this._validPosition(_)}convertViewRangeToModelRange(_){return this._validRange(_)}validateViewPosition(_,f){return this._validPosition(f)}validateViewRange(_,f){return this._validRange(f)}convertModelPositionToViewPosition(_){return this._validPosition(_)}convertModelRangeToViewRange(_){return this._validRange(_)}modelPositionIsVisible(_){const f=this._lines.model.getLineCount();return!(_.lineNumber<1||_.lineNumber>f)}getModelLineViewLineCount(_){return 1}}e.IdentityCoordinatesConverter=t;class l{constructor(_){this.model=_}dispose(){}createCoordinatesConverter(){return new t(this)}getHiddenAreas(){return[]}setHiddenAreas(_){return!1}setTabSize(_){return!1}setWrappingSettings(_,f,v,y){return!1}createLineBreaksComputer(){let _=[];return{addRequest:(f,v)=>{_.push(null)},finalize:()=>_}}onModelFlushed(){}onModelLinesDeleted(_,f,v){return new S.ViewLinesDeletedEvent(f,v)}onModelLinesInserted(_,f,v,y){return new S.ViewLinesInsertedEvent(f,v)}onModelLineChanged(_,f,v){return[!1,new S.ViewLinesChangedEvent(f,f),null,null]}acceptVersionId(_){}getViewLineCount(){return this.model.getLineCount()}getActiveIndentGuide(_,f,v){return{startLineNumber:_,endLineNumber:_,indent:0}}getViewLinesIndentGuides(_,f){const v=f-_+1;let y=new Array(v);for(let L=0;L=f){v>k&&(L[L.length-1]=v);return}L.push(y,f,v)}else this.result[_]=[y,f,v]}}}),define(Q[540],J([0,1,29,2,8,38,14,3,18,243,244,170,398,539,63,455,15,17,242,42,173]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModel=void 0;const h=!0;class m extends N.Disposable{constructor(f,v,y,L,I,k){super();if(this._editorId=f,this._configuration=v,this.model=y,this._eventDispatcher=new l.ViewModelEventDispatcher,this.onEvent=this._eventDispatcher.onEvent,this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._tokenizeViewportSoon=this._register(new r.RunOnceScheduler(()=>this.tokenizeViewport(),50)),this._updateConfigurationViewLineCount=this._register(new r.RunOnceScheduler(()=>this._updateConfigurationViewLineCountNow(),0)),this._hasFocus=!1,this._viewportStartLine=-1,this._viewportStartLineTrackedRange=null,this._viewportStartLineDelta=0,h&&this.model.isTooLargeForTokenization())this._lines=new s.IdentityLinesCollection(this.model);else{const E=this._configuration.options,T=E.get(38),O=E.get(118),A=E.get(125),B=E.get(117);this._lines=new s.SplitLinesCollection(this.model,L,I,T,this.model.getOptions().tabSize,O,A.wrappingColumn,B)}this.coordinatesConverter=this._lines.createCoordinatesConverter(),this._cursor=this._register(new n.Cursor(y,this,this.coordinatesConverter,this.cursorConfig)),this.viewLayout=this._register(new o.ViewLayout(this._configuration,this.getLineCount(),k)),this._register(this.viewLayout.onDidScroll(E=>{E.scrollTopChanged&&this._tokenizeViewportSoon.schedule(),this._eventDispatcher.emitSingleViewEvent(new c.ViewScrollChangedEvent(E)),this._eventDispatcher.emitOutgoingEvent(new l.ScrollChangedEvent(E.oldScrollWidth,E.oldScrollLeft,E.oldScrollHeight,E.oldScrollTop,E.scrollWidth,E.scrollLeft,E.scrollHeight,E.scrollTop))})),this._register(this.viewLayout.onDidContentSizeChange(E=>{this._eventDispatcher.emitOutgoingEvent(E)})),this._decorations=new u.ViewModelDecorations(this._editorId,this.model,this._configuration,this._lines,this.coordinatesConverter),this._registerModelEvents(),this._register(this._configuration.onDidChangeFast(E=>{try{const T=this._eventDispatcher.beginEmitViewEvents();this._onConfigurationChanged(T,E)}finally{this._eventDispatcher.endEmitViewEvents()}})),this._register(p.MinimapTokensColorTracker.getInstance().onDidChange(()=>{this._eventDispatcher.emitSingleViewEvent(new c.ViewTokensColorsChangedEvent)})),this._updateConfigurationViewLineCountNow()}dispose(){super.dispose(),this._decorations.dispose(),this._lines.dispose(),this.invalidateMinimapColorCache(),this._viewportStartLineTrackedRange=this.model._setTrackedRange(this._viewportStartLineTrackedRange,null,1),this._eventDispatcher.dispose()}createLineBreaksComputer(){return this._lines.createLineBreaksComputer()}addViewEventHandler(f){this._eventDispatcher.addViewEventHandler(f)}removeViewEventHandler(f){this._eventDispatcher.removeViewEventHandler(f)}_updateConfigurationViewLineCountNow(){this._configuration.setViewLineCount(this._lines.getViewLineCount())}tokenizeViewport(){const f=this.viewLayout.getLinesViewportData(),v=this.coordinatesConverter.convertViewPositionToModelPosition(new S.Position(f.startLineNumber,1)),y=this.coordinatesConverter.convertViewPositionToModelPosition(new S.Position(f.endLineNumber,1));this.model.tokenizeViewport(v.lineNumber,y.lineNumber)}setHasFocus(f){this._hasFocus=f,this._cursor.setHasFocus(f),this._eventDispatcher.emitSingleViewEvent(new c.ViewFocusChangedEvent(f)),this._eventDispatcher.emitOutgoingEvent(new l.FocusChangedEvent(!f,f))}onCompositionStart(){this._eventDispatcher.emitSingleViewEvent(new c.ViewCompositionStartEvent)}onCompositionEnd(){this._eventDispatcher.emitSingleViewEvent(new c.ViewCompositionEndEvent)}onDidColorThemeChange(){this._eventDispatcher.emitSingleViewEvent(new c.ViewThemeChangedEvent)}_onConfigurationChanged(f,v){let y=null;if(this._viewportStartLine!==-1){let A=new S.Position(this._viewportStartLine,this.getLineMinColumn(this._viewportStartLine));y=this.coordinatesConverter.convertViewPositionToModelPosition(A)}let L=!1;const I=this._configuration.options,k=I.get(38),E=I.get(118),T=I.get(125),O=I.get(117);if(this._lines.setWrappingSettings(k,E,T.wrappingColumn,O)&&(f.emitViewEvent(new c.ViewFlushedEvent),f.emitViewEvent(new c.ViewLineMappingChangedEvent),f.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(f),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this.viewLayout.getCurrentScrollTop()!==0&&(L=!0),this._updateConfigurationViewLineCount.schedule()),v.hasChanged(75)&&(this._decorations.reset(),f.emitViewEvent(new c.ViewDecorationsChangedEvent(null))),f.emitViewEvent(new c.ViewConfigurationChangedEvent(v)),this.viewLayout.onConfigurationChanged(v),L&&y){const A=this.coordinatesConverter.convertModelPositionToViewPosition(y),B=this.viewLayout.getVerticalOffsetForLineNumber(A.lineNumber);this.viewLayout.setScrollPosition({scrollTop:B+this._viewportStartLineDelta},1)}t.CursorConfiguration.shouldRecreate(v)&&(this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._cursor.updateConfiguration(this.cursorConfig))}_registerModelEvents(){this._register(this.model.onDidChangeRawContentFast(f=>{try{const v=this._eventDispatcher.beginEmitViewEvents();let y=!1,L=!1;const I=f.changes,k=f.versionId,E=this._lines.createLineBreaksComputer();for(const A of I)switch(A.changeType){case 4:{for(const B of A.detail)E.addRequest(B,null);break}case 2:{E.addRequest(A.detail,null);break}}const T=E.finalize();let O=0;for(const A of I)switch(A.changeType){case 1:{this._lines.onModelFlushed(),v.emitViewEvent(new c.ViewFlushedEvent),this._decorations.reset(),this.viewLayout.onFlushed(this.getLineCount()),y=!0;break}case 3:{const B=this._lines.onModelLinesDeleted(k,A.fromLineNumber,A.toLineNumber);B!==null&&(v.emitViewEvent(B),this.viewLayout.onLinesDeleted(B.fromLineNumber,B.toLineNumber)),y=!0;break}case 4:{const B=T.slice(O,O+A.detail.length);O+=A.detail.length;const F=this._lines.onModelLinesInserted(k,A.fromLineNumber,A.toLineNumber,B);F!==null&&(v.emitViewEvent(F),this.viewLayout.onLinesInserted(F.fromLineNumber,F.toLineNumber)),y=!0;break}case 2:{const B=T[O];O++;const[F,D,R,W]=this._lines.onModelLineChanged(k,A.lineNumber,B);L=F,D&&v.emitViewEvent(D),R&&(v.emitViewEvent(R),this.viewLayout.onLinesInserted(R.fromLineNumber,R.toLineNumber)),W&&(v.emitViewEvent(W),this.viewLayout.onLinesDeleted(W.fromLineNumber,W.toLineNumber));break}case 5:break}this._lines.acceptVersionId(k),this.viewLayout.onHeightMaybeChanged(),!y&&L&&(v.emitViewEvent(new c.ViewLineMappingChangedEvent),v.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(v),this._decorations.onLineMappingChanged())}finally{this._eventDispatcher.endEmitViewEvents()}if(this._viewportStartLine=-1,this._configuration.setMaxLineNumber(this.model.getLineCount()),this._updateConfigurationViewLineCountNow(),!this._hasFocus&&this.model.getAttachedEditorCount()>=2&&this._viewportStartLineTrackedRange){const v=this.model._getTrackedRange(this._viewportStartLineTrackedRange);if(v){const y=this.coordinatesConverter.convertModelPositionToViewPosition(v.getStartPosition()),L=this.viewLayout.getVerticalOffsetForLineNumber(y.lineNumber);this.viewLayout.setScrollPosition({scrollTop:L+this._viewportStartLineDelta},1)}}try{const v=this._eventDispatcher.beginEmitViewEvents();this._cursor.onModelContentChanged(v,f)}finally{this._eventDispatcher.endEmitViewEvents()}})),this._register(this.model.onDidChangeTokens(f=>{let v=[];for(let y=0,L=f.ranges.length;y{this._eventDispatcher.emitSingleViewEvent(new c.ViewLanguageConfigurationEvent),this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._cursor.updateConfiguration(this.cursorConfig)})),this._register(this.model.onDidChangeLanguage(f=>{this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._cursor.updateConfiguration(this.cursorConfig)})),this._register(this.model.onDidChangeOptions(f=>{if(this._lines.setTabSize(this.model.getOptions().tabSize)){try{const v=this._eventDispatcher.beginEmitViewEvents();v.emitViewEvent(new c.ViewFlushedEvent),v.emitViewEvent(new c.ViewLineMappingChangedEvent),v.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(v),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount())}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule()}this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._cursor.updateConfiguration(this.cursorConfig)})),this._register(this.model.onDidChangeDecorations(f=>{this._decorations.onModelDecorationsChanged(),this._eventDispatcher.emitSingleViewEvent(new c.ViewDecorationsChangedEvent(f))}))}setHiddenAreas(f){try{const v=this._eventDispatcher.beginEmitViewEvents();this._lines.setHiddenAreas(f)&&(v.emitViewEvent(new c.ViewFlushedEvent),v.emitViewEvent(new c.ViewLineMappingChangedEvent),v.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(v),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this.viewLayout.onHeightMaybeChanged())}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule()}getVisibleRangesPlusViewportAboveBelow(){const f=this._configuration.options.get(124),v=this._configuration.options.get(53),y=Math.max(20,Math.round(f.height/v)),L=this.viewLayout.getLinesViewportData(),I=Math.max(1,L.completelyVisibleStartLineNumber-y),k=Math.min(this.getLineCount(),L.completelyVisibleEndLineNumber+y);return this._toModelVisibleRanges(new C.Range(I,this.getLineMinColumn(I),k,this.getLineMaxColumn(k)))}getVisibleRanges(){const f=this.getCompletelyVisibleViewRange();return this._toModelVisibleRanges(f)}_toModelVisibleRanges(f){const v=this.coordinatesConverter.convertViewRangeToModelRange(f),y=this._lines.getHiddenAreas();if(y.length===0)return[v];let L=[],I=0,k=v.startLineNumber,E=v.startColumn,T=v.endLineNumber,O=v.endColumn;for(let A=0,B=y.length;AT||(kA.startLineNumber);let O="";for(let A=0;A0&&T[A-1]===T[A]||(O+=this.model.getLineContent(T[A])+L);return O}if(I&&v){let T=[],O=0;for(const A of f){const B=A.startLineNumber;A.isEmpty()?B!==O&&T.push(this.model.getLineContent(B)):T.push(this.model.getValueInRange(A,y?2:0)),O=B}return T.length===1?T[0]:T}let E=[];for(const T of f)T.isEmpty()||E.push(this.model.getValueInRange(T,y?2:0));return E.length===1?E[0]:E}getRichTextToCopy(f,v){const y=this.model.getLanguageIdentifier();if(y.id===1||f.length!==1)return null;let L=f[0];if(L.isEmpty()){if(!v)return null;const T=L.startLineNumber;L=new C.Range(T,this.model.getLineMinColumn(T),T,this.model.getLineMaxColumn(T))}const I=this._configuration.options.get(38),k=this._getColorMap(),E=I.fontFamily===w.EDITOR_FONT_DEFAULTS.fontFamily?I.fontFamily:`'${I.fontFamily}', ${w.EDITOR_FONT_DEFAULTS.fontFamily}`;return{mode:y.language,html:`
    `+this._getHTMLToCopy(L,k)+"
    "}}_getHTMLToCopy(f,v){const y=f.startLineNumber,L=f.startColumn,I=f.endLineNumber,k=f.endColumn,E=this.getTabSize();let T="";for(let O=y;O<=I;O++){const A=this.model.getLineTokens(O),B=A.getLineContent(),F=O===y?L-1:0,D=O===I?k-1:B.length;B===""?T+="
    ":T+=g.tokenizeLineToHTML(B,A.inflate(),v,F,D,E,i.isWindows)}return T}_getColorMap(){let f=d.TokenizationRegistry.getColorMap(),v=["#000000"];if(f)for(let y=1,L=f.length;ythis._cursor.setStates(L,f,v,y))}getCursorColumnSelectData(){return this._cursor.getCursorColumnSelectData()}setCursorColumnSelectData(f){this._cursor.setCursorColumnSelectData(f)}getPrevEditOperationType(){return this._cursor.getPrevEditOperationType()}setPrevEditOperationType(f){this._cursor.setPrevEditOperationType(f)}getSelection(){return this._cursor.getSelection()}getSelections(){return this._cursor.getSelections()}getPosition(){return this._cursor.getPrimaryCursorState().modelState.position}setSelections(f,v,y=0){this._withViewEventsCollector(L=>this._cursor.setSelections(L,f,v,y))}saveCursorState(){return this._cursor.saveState()}restoreCursorState(f){this._withViewEventsCollector(v=>this._cursor.restoreState(v,f))}_executeCursorEdit(f){if(this._cursor.context.cursorConfig.readOnly){this._eventDispatcher.emitOutgoingEvent(new l.ReadOnlyEditAttemptEvent);return}this._withViewEventsCollector(f)}executeEdits(f,v,y){this._executeCursorEdit(L=>this._cursor.executeEdits(L,f,v,y))}startComposition(){this._cursor.setIsDoingComposition(!0),this._executeCursorEdit(f=>this._cursor.startComposition(f))}endComposition(f){this._cursor.setIsDoingComposition(!1),this._executeCursorEdit(v=>this._cursor.endComposition(v,f))}type(f,v){this._executeCursorEdit(y=>this._cursor.type(y,f,v))}compositionType(f,v,y,L,I){this._executeCursorEdit(k=>this._cursor.compositionType(k,f,v,y,L,I))}paste(f,v,y,L){this._executeCursorEdit(I=>this._cursor.paste(I,f,v,y,L))}cut(f){this._executeCursorEdit(v=>this._cursor.cut(v,f))}executeCommand(f,v){this._executeCursorEdit(y=>this._cursor.executeCommand(y,f,v))}executeCommands(f,v){this._executeCursorEdit(y=>this._cursor.executeCommands(y,f,v))}revealPrimaryCursor(f,v){this._withViewEventsCollector(y=>this._cursor.revealPrimary(y,f,v,0))}revealTopMostCursor(f){const v=this._cursor.getTopMostViewPosition(),y=new C.Range(v.lineNumber,v.column,v.lineNumber,v.column);this._withViewEventsCollector(L=>L.emitViewEvent(new c.ViewRevealRangeRequestEvent(f,y,null,0,!0,0)))}revealBottomMostCursor(f){const v=this._cursor.getBottomMostViewPosition(),y=new C.Range(v.lineNumber,v.column,v.lineNumber,v.column);this._withViewEventsCollector(L=>L.emitViewEvent(new c.ViewRevealRangeRequestEvent(f,y,null,0,!0,0)))}revealRange(f,v,y,L,I){this._withViewEventsCollector(k=>k.emitViewEvent(new c.ViewRevealRangeRequestEvent(f,y,null,L,v,I)))}getVerticalOffsetForLineNumber(f){return this.viewLayout.getVerticalOffsetForLineNumber(f)}getScrollTop(){return this.viewLayout.getCurrentScrollTop()}setScrollTop(f,v){this.viewLayout.setScrollPosition({scrollTop:f},v)}setScrollPosition(f,v){this.viewLayout.setScrollPosition(f,v)}deltaScrollNow(f,v){this.viewLayout.deltaScrollNow(f,v)}changeWhitespace(f){this.viewLayout.changeWhitespace(f)&&(this._eventDispatcher.emitSingleViewEvent(new c.ViewZonesChangedEvent),this._eventDispatcher.emitOutgoingEvent(new l.ViewZonesChangedEvent))}setMaxLineWidth(f){this.viewLayout.setMaxLineWidth(f)}_withViewEventsCollector(f){try{const v=this._eventDispatcher.beginEmitViewEvents();f(v)}finally{this._eventDispatcher.endEmitViewEvents()}}}e.ViewModel=m}),define(Q[245],J([0,1,19,23,12,51,3,18,54,134]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OutlineModel=e.OutlineGroup=e.OutlineElement=e.TreeElement=void 0;class p{remove(){this.parent&&this.parent.children.delete(this.id)}static findId(u,r){let i;typeof u=="string"?i=`${r.id}/${u}`:(i=`${r.id}/${u.name}`,r.children.get(i)!==void 0&&(i=`${r.id}/${u.name}_${u.range.startLineNumber}_${u.range.startColumn}`));let n=i;for(let t=0;r.children.get(n)!==void 0;t++)n=`${i}_${t}`;return n}static empty(u){return u.children.size===0}}e.TreeElement=p;class c extends p{constructor(u,r,i){super();this.id=u,this.parent=r,this.symbol=i,this.children=new Map}}e.OutlineElement=c;class o extends p{constructor(u,r,i,n){super();this.id=u,this.parent=r,this.label=i,this.order=n,this.children=new Map}}e.OutlineGroup=o;class s extends p{constructor(u){super();this.uri=u,this.id="root",this.parent=void 0,this._groups=new Map,this.children=new Map,this.id="root",this.parent=void 0}static create(u,r){let i=this._keys.for(u,!0),n=s._requests.get(i);if(!n){let t=new N.CancellationTokenSource;n={promiseCnt:0,source:t,promise:s._create(u,t.token),model:void 0},s._requests.set(i,n);const l=Date.now();n.promise.then(()=>{this._requestDurations.update(u,Date.now()-l)})}return n.model?Promise.resolve(n.model):(n.promiseCnt+=1,r.onCancellationRequested(()=>{--n.promiseCnt==0&&(n.source.cancel(),s._requests.delete(i))}),new Promise((t,l)=>{n.promise.then(h=>{n.model=h,t(h)},h=>{s._requests.delete(i),l(h)})}))}static _create(u,r){const i=new N.CancellationTokenSource(r),n=new s(u.uri),t=C.DocumentSymbolProviderRegistry.ordered(u),l=t.map((m,_)=>{var f;let v=p.findId(`provider_${_}`,n),y=new o(v,n,(f=m.displayName)!==null&&f!==void 0?f:"Unknown Outline Provider",_);return Promise.resolve(m.provideDocumentSymbols(u,i.token)).then(L=>{for(const I of L||[])s._makeOutlineElement(I,y);return y},L=>(M.onUnexpectedExternalError(L),y)).then(L=>{p.empty(L)?L.remove():n._groups.set(v,L)})}),h=C.DocumentSymbolProviderRegistry.onDidChange(()=>{const m=C.DocumentSymbolProviderRegistry.ordered(u);b.equals(m,t)||i.cancel()});return Promise.all(l).then(()=>i.token.isCancellationRequested&&!r.isCancellationRequested?s._create(u,r):n._compact()).finally(()=>{h.dispose()})}static _makeOutlineElement(u,r){let i=p.findId(u,r),n=new c(i,r,u);if(u.children)for(const t of u.children)s._makeOutlineElement(t,n);r.children.set(n.id,n)}_compact(){let u=0;for(const[r,i]of this._groups)i.children.size===0?this._groups.delete(r):u+=1;if(u!==1)this.children=this._groups;else{let r=d.Iterable.first(this._groups.values());for(let[,i]of r.children)i.parent=this,this.children.set(i.id,i)}return this}getTopLevelSymbols(){const u=[];for(const r of this.children.values())r instanceof c?u.push(r.symbol):u.push(...d.Iterable.map(r.children.values(),i=>i.symbol));return u.sort((r,i)=>S.Range.compareRangesUsingStarts(r.range,i.range))}asListOfDocumentSymbols(){const u=this.getTopLevelSymbols(),r=[];return s._flattenDocumentSymbols(r,u,""),r.sort((i,n)=>S.Range.compareRangesUsingStarts(i.range,n.range))}static _flattenDocumentSymbols(u,r,i){for(const n of r)u.push({kind:n.kind,tags:n.tags,name:n.name,detail:n.detail,containerName:n.containerName||i,range:n.range,selectionRange:n.selectionRange,children:void 0}),n.children&&s._flattenDocumentSymbols(u,n.children,n.name)}}e.OutlineModel=s,s._requestDurations=new g.LanguageFeatureRequestDelays(C.DocumentSymbolProviderRegistry,350),s._requests=new w.LRUCache(9,.75),s._keys=new class{constructor(){this._counter=1,this._data=new WeakMap}for(a,u){return`${a.id}/${u?a.getVersionId():""}/${this._hash(C.DocumentSymbolProviderRegistry.all(a))}`}_hash(a){let u="";for(const r of a){let i=this._data.get(r);typeof i=="undefined"&&(i=this._counter++,this._data.set(r,i)),u+=i}return u}}}),define(Q[541],J([0,1,174,31,41]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeRanges=e.RangesCollector=e.IndentRangeProvider=e.ID_INDENT_PROVIDER=void 0;const w=5e3;e.ID_INDENT_PROVIDER="indent";class S{constructor(p){this.editorModel=p,this.id=e.ID_INDENT_PROVIDER}dispose(){}compute(p){let c=M.LanguageConfigurationRegistry.getFoldingRules(this.editorModel.getLanguageIdentifier().id),o=c&&!!c.offSide,s=c&&c.markers;return Promise.resolve(d(this.editorModel,o,s))}}e.IndentRangeProvider=S;class C{constructor(p){this._startIndexes=[],this._endIndexes=[],this._indentOccurrences=[],this._length=0,this._foldingRangesLimit=p}insertFirst(p,c,o){if(!(p>b.MAX_LINE_NUMBER||c>b.MAX_LINE_NUMBER)){let s=this._length;this._startIndexes[s]=p,this._endIndexes[s]=c,this._length++,o<1e3&&(this._indentOccurrences[o]=(this._indentOccurrences[o]||0)+1)}}toIndentRanges(p){if(this._length<=this._foldingRangesLimit){let c=new Uint32Array(this._length),o=new Uint32Array(this._length);for(let s=this._length-1,a=0;s>=0;s--,a++)c[a]=this._startIndexes[s],o[a]=this._endIndexes[s];return new b.FoldingRegions(c,o)}else{let c=0,o=this._indentOccurrences.length;for(let r=0;rthis._foldingRangesLimit){o=r;break}c+=i}}const s=p.getOptions().tabSize;let a=new Uint32Array(this._foldingRangesLimit),u=new Uint32Array(this._foldingRangesLimit);for(let r=this._length-1,i=0;r>=0;r--){let n=this._startIndexes[r],t=p.getLineContent(n),l=N.TextModel.computeIndentLevel(t,s);(l0;n--){let t=g.getLineContent(n),l=N.TextModel.computeIndentLevel(t,s),h=r[r.length-1];if(l===-1){p&&(h.endAbove=n);continue}let m;if(u&&(m=t.match(u)))if(m[1]){let _=r.length-1;for(;_>0&&r[_].indent!==-2;)_--;if(_>0){r.length=_+1,h=r[_],a.insertFirst(n,h.line,l),h.line=n,h.indent=l,h.endAbove=n;continue}}else{r.push({indent:-2,endAbove:n,line:n});continue}if(h.indent>l){do r.pop(),h=r[r.length-1];while(h.indent>l);let _=h.endAbove-1;_-n>=1&&a.insertFirst(n,_,l)}h.indent===l?h.endAbove=n:r.push({indent:l,endAbove:n,line:n})}return a.toIndentRanges(g)}e.computeRanges=d}),define(Q[542],J([0,1,8,179,3,21,109,41,229]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveLinesCommand=void 0;class g{constructor(c,o,s){this._selection=c,this._isMovingDown=o,this._autoIndent=s,this._selectionId=null,this._moveEndLineSelectionShrink=!1}getEditOperations(c,o){let s=c.getLineCount();if(this._isMovingDown&&this._selection.endLineNumber===s){this._selectionId=o.trackSelection(this._selection);return}if(!this._isMovingDown&&this._selection.startLineNumber===1){this._selectionId=o.trackSelection(this._selection);return}this._moveEndPositionDown=!1;let a=this._selection;a.startLineNumberc.getLineTokens(l),getLanguageIdentifier:()=>c.getLanguageIdentifier(),getLanguageIdAtPosition:(l,h)=>c.getLanguageIdAtPosition(l,h),getLineContent:null};if(a.startLineNumber===a.endLineNumber&&c.getLineMaxColumn(a.startLineNumber)===1){let l=a.startLineNumber,h=this._isMovingDown?l+1:l-1;c.getLineMaxColumn(h)===1?o.addEditOperation(new M.Range(1,1,1,1),null):(o.addEditOperation(new M.Range(l,1,l,1),c.getLineContent(h)),o.addEditOperation(new M.Range(h,1,h,c.getLineMaxColumn(h)),null)),a=new w.Selection(h,1,h,1)}else{let l,h;if(this._isMovingDown){l=a.endLineNumber+1,h=c.getLineContent(l),o.addEditOperation(new M.Range(l-1,c.getLineMaxColumn(l-1),l,c.getLineMaxColumn(l)),null);let m=h;if(this.shouldAutoIndent(c,a)){let _=this.matchEnterRule(c,n,u,l,a.startLineNumber-1);if(_!==null){let v=b.getLeadingWhitespace(c.getLineContent(l)),y=_+d.getSpaceCnt(v,u);m=d.generateIndent(y,u,i)+this.trimLeft(h)}else{t.getLineContent=y=>y===a.startLineNumber?c.getLineContent(l):c.getLineContent(y);let v=C.LanguageConfigurationRegistry.getGoodIndentForLine(this._autoIndent,t,c.getLanguageIdAtPosition(l,1),a.startLineNumber,n);if(v!==null){let y=b.getLeadingWhitespace(c.getLineContent(l)),L=d.getSpaceCnt(v,u),I=d.getSpaceCnt(y,u);L!==I&&(m=d.generateIndent(L,u,i)+this.trimLeft(h))}}o.addEditOperation(new M.Range(a.startLineNumber,1,a.startLineNumber,1),m+` +`);let f=this.matchEnterRuleMovingDown(c,n,u,a.startLineNumber,l,m);if(f!==null)f!==0&&this.getIndentEditsOfMovingBlock(c,o,a,u,i,f);else{t.getLineContent=y=>y===a.startLineNumber?m:y>=a.startLineNumber+1&&y<=a.endLineNumber+1?c.getLineContent(y-1):c.getLineContent(y);let v=C.LanguageConfigurationRegistry.getGoodIndentForLine(this._autoIndent,t,c.getLanguageIdAtPosition(l,1),a.startLineNumber+1,n);if(v!==null){const y=b.getLeadingWhitespace(c.getLineContent(a.startLineNumber)),L=d.getSpaceCnt(v,u),I=d.getSpaceCnt(y,u);if(L!==I){const k=L-I;this.getIndentEditsOfMovingBlock(c,o,a,u,i,k)}}}}else o.addEditOperation(new M.Range(a.startLineNumber,1,a.startLineNumber,1),m+` +`)}else if(l=a.startLineNumber-1,h=c.getLineContent(l),o.addEditOperation(new M.Range(l,1,l+1,1),null),o.addEditOperation(new M.Range(a.endLineNumber,c.getLineMaxColumn(a.endLineNumber),a.endLineNumber,c.getLineMaxColumn(a.endLineNumber)),` +`+h),this.shouldAutoIndent(c,a)){t.getLineContent=_=>_===l?c.getLineContent(a.startLineNumber):c.getLineContent(_);let m=this.matchEnterRule(c,n,u,a.startLineNumber,a.startLineNumber-2);if(m!==null)m!==0&&this.getIndentEditsOfMovingBlock(c,o,a,u,i,m);else{let _=C.LanguageConfigurationRegistry.getGoodIndentForLine(this._autoIndent,t,c.getLanguageIdAtPosition(a.startLineNumber,1),l,n);if(_!==null){let f=b.getLeadingWhitespace(c.getLineContent(a.startLineNumber)),v=d.getSpaceCnt(_,u),y=d.getSpaceCnt(f,u);if(v!==y){let L=v-y;this.getIndentEditsOfMovingBlock(c,o,a,u,i,L)}}}}}this._selectionId=o.trackSelection(a)}buildIndentConverter(c,o,s){return{shiftIndent:a=>N.ShiftCommand.shiftIndent(a,a.length+1,c,o,s),unshiftIndent:a=>N.ShiftCommand.unshiftIndent(a,a.length+1,c,o,s)}}parseEnterResult(c,o,s,a,u){if(u){let r=u.indentation;u.indentAction===S.IndentAction.None||u.indentAction===S.IndentAction.Indent?r=u.indentation+u.appendText:u.indentAction===S.IndentAction.IndentOutdent?r=u.indentation:u.indentAction===S.IndentAction.Outdent&&(r=o.unshiftIndent(u.indentation)+u.appendText);let i=c.getLineContent(a);if(this.trimLeft(i).indexOf(this.trimLeft(r))>=0){let n=b.getLeadingWhitespace(c.getLineContent(a)),t=b.getLeadingWhitespace(r),l=C.LanguageConfigurationRegistry.getIndentMetadata(c,a);l!==null&&l&2&&(t=o.unshiftIndent(t));let h=d.getSpaceCnt(t,s),m=d.getSpaceCnt(n,s);return h-m}}return null}matchEnterRuleMovingDown(c,o,s,a,u,r){if(b.lastNonWhitespaceIndex(r)>=0){let i=c.getLineMaxColumn(u),n=C.LanguageConfigurationRegistry.getEnterAction(this._autoIndent,c,new M.Range(u,i,u,i));return this.parseEnterResult(c,o,s,a,n)}else{let i=a-1;for(;i>=1;){let l=c.getLineContent(i);if(b.lastNonWhitespaceIndex(l)>=0)break;i--}if(i<1||a>c.getLineCount())return null;let n=c.getLineMaxColumn(i),t=C.LanguageConfigurationRegistry.getEnterAction(this._autoIndent,c,new M.Range(i,n,i,n));return this.parseEnterResult(c,o,s,a,t)}}matchEnterRule(c,o,s,a,u,r){let i=u;for(;i>=1;){let l;if(i===u&&r!==void 0?l=r:l=c.getLineContent(i),b.lastNonWhitespaceIndex(l)>=0)break;i--}if(i<1||a>c.getLineCount())return null;let n=c.getLineMaxColumn(i),t=C.LanguageConfigurationRegistry.getEnterAction(this._autoIndent,c,new M.Range(i,n,i,n));return this.parseEnterResult(c,o,s,a,t)}trimLeft(c){return c.replace(/^\s+/,"")}shouldAutoIndent(c,o){if(this._autoIndent<4||!c.isCheapToTokenize(o.startLineNumber))return!1;let s=c.getLanguageIdAtPosition(o.startLineNumber,1),a=c.getLanguageIdAtPosition(o.endLineNumber,1);return!(s!==a||C.LanguageConfigurationRegistry.getIndentRulesSupport(s)===null)}getIndentEditsOfMovingBlock(c,o,s,a,u,r){for(let i=s.startLineNumber;i<=s.endLineNumber;i++){let n=c.getLineContent(i),t=b.getLeadingWhitespace(n),h=d.getSpaceCnt(t,a)+r,m=d.generateIndent(h,a,u);m!==t&&(o.addEditOperation(new M.Range(i,1,i,t.length+1),m),i===s.endLineNumber&&s.endColumn<=t.length+1&&m===""&&(this._moveEndLineSelectionShrink=!0))}}computeCursorState(c,o){let s=o.getTrackedSelection(this._selectionId);return this._moveEndPositionDown&&(s=s.setEndPosition(s.endLineNumber+1,1)),this._moveEndLineSelectionShrink&&s.startLineNumber{const h=this._getWidth(l);this.domNode.style.width=h+"px",this.domNode.style.left=this._getLeft(l)+"px",this._onWidth(h)}))}dispose(){this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._viewZone&&this.editor.changeViewZones(n=>{this._viewZone&&n.removeZone(this._viewZone.id),this._viewZone=null}),this.editor.deltaDecorations(this._positionMarkerId,[]),this._positionMarkerId=[],this._disposables.dispose()}create(){this.domNode.classList.add("zone-widget"),this.options.className&&this.domNode.classList.add(this.options.className),this.container=document.createElement("div"),this.container.classList.add("zone-widget-container"),this.domNode.appendChild(this.container),this.options.showArrow&&(this._arrow=new u(this.editor),this._disposables.add(this._arrow)),this._fillContainer(this.container),this._initSash(),this._applyStyles()}style(n){n.frameColor&&(this.options.frameColor=n.frameColor),n.arrowColor&&(this.options.arrowColor=n.arrowColor),this._applyStyles()}_applyStyles(){if(this.container&&this.options.frameColor){let n=this.options.frameColor.toString();this.container.style.borderTopColor=n,this.container.style.borderBottomColor=n}if(this._arrow&&this.options.arrowColor){let n=this.options.arrowColor.toString();this._arrow.color=n}}_getWidth(n){return n.width-n.minimap.minimapWidth-n.verticalScrollbarWidth}_getLeft(n){return n.minimap.minimapWidth>0&&n.minimap.minimapLeft===0?n.minimap.minimapWidth:0}_onViewZoneTop(n){this.domNode.style.top=n+"px"}_onViewZoneHeight(n){if(this.domNode.style.height=`${n}px`,this.container){let t=n-this._decoratingElementsHeight();this.container.style.height=`${t}px`;const l=this.editor.getLayoutInfo();this._doLayout(t,this._getWidth(l))}this._resizeSash&&this._resizeSash.layout()}get position(){const[n]=this._positionMarkerId;if(!!n){const t=this.editor.getModel();if(!!t){const l=t.getDecorationRange(n);if(!!l)return l.getStartPosition()}}}show(n,t){const l=d.Range.isIRange(n)?d.Range.lift(n):d.Range.fromPositions(n);this._isShowing=!0,this._showImpl(l,t),this._isShowing=!1,this._positionMarkerId=this.editor.deltaDecorations(this._positionMarkerId,[{range:l,options:g.ModelDecorationOptions.EMPTY}])}hide(){this._viewZone&&(this.editor.changeViewZones(n=>{this._viewZone&&n.removeZone(this._viewZone.id)}),this._viewZone=null),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._arrow&&this._arrow.hide()}_decoratingElementsHeight(){let n=this.editor.getOption(53),t=0;if(this.options.showArrow){let l=Math.round(n/3);t+=2*l}if(this.options.showFrame){let l=Math.round(n/9);t+=2*l}return t}_showImpl(n,t){const l=n.getStartPosition(),h=this.editor.getLayoutInfo(),m=this._getWidth(h);this.domNode.style.width=`${m}px`,this.domNode.style.left=this._getLeft(h)+"px";const _=document.createElement("div");_.style.overflow="hidden";const f=this.editor.getOption(53),v=Math.max(12,this.editor.getLayoutInfo().height/f*.8);t=Math.min(t,v);let y=0,L=0;if(this._arrow&&this.options.showArrow&&(y=Math.round(f/3),this._arrow.height=y,this._arrow.show(l)),this.options.showFrame&&(L=Math.round(f/9)),this.editor.changeViewZones(E=>{this._viewZone&&E.removeZone(this._viewZone.id),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this.domNode.style.top="-1000px",this._viewZone=new s(_,l.lineNumber,l.column,t,T=>this._onViewZoneTop(T),T=>this._onViewZoneHeight(T)),this._viewZone.id=E.addZone(this._viewZone),this._overlayWidget=new a(o+this._viewZone.id,this.domNode),this.editor.addOverlayWidget(this._overlayWidget)}),this.container&&this.options.showFrame){const E=this.options.frameWidth?this.options.frameWidth:L;this.container.style.borderTopWidth=E+"px",this.container.style.borderBottomWidth=E+"px"}let I=t*f-this._decoratingElementsHeight();this.container&&(this.container.style.top=y+"px",this.container.style.height=I+"px",this.container.style.overflow="hidden"),this._doLayout(I,m),this.options.keepEditorSelection||this.editor.setSelection(n);const k=this.editor.getModel();if(k){const E=n.endLineNumber+1;E<=k.getLineCount()?this.revealLine(E,!1):this.revealLine(k.getLineCount(),!0)}}revealLine(n,t){t?this.editor.revealLineInCenter(n,0):this.editor.revealLine(n,0)}setCssClass(n,t){!this.container||(t&&this.container.classList.remove(t),this.container.classList.add(n))}_onWidth(n){}_doLayout(n,t){}_relayout(n){this._viewZone&&this._viewZone.heightInLines!==n&&this.editor.changeViewZones(t=>{this._viewZone&&(this._viewZone.heightInLines=n,t.layoutZone(this._viewZone.id))})}_initSash(){if(!this._resizeSash){this._resizeSash=this._disposables.add(new N.Sash(this.domNode,this,{orientation:1})),this.options.isResizeable||(this._resizeSash.hide(),this._resizeSash.state=0);let n;this._disposables.add(this._resizeSash.onDidStart(t=>{this._viewZone&&(n={startY:t.startY,heightInLines:this._viewZone.heightInLines})})),this._disposables.add(this._resizeSash.onDidEnd(()=>{n=void 0})),this._disposables.add(this._resizeSash.onDidChange(t=>{if(n){let l=(t.currentY-n.startY)/this.editor.getOption(53),h=l<0?Math.ceil(l):Math.floor(l),m=n.heightInLines+h;m>5&&m<35&&this._relayout(m)}}))}}getHorizontalSashLeft(){return 0}getHorizontalSashTop(){return(this.domNode.style.height===null?0:parseInt(this.domNode.style.height))-this._decoratingElementsHeight()/2}getHorizontalSashWidth(){const n=this.editor.getLayoutInfo();return n.width-n.minimap.minimapWidth}}e.ZoneWidget=r}),define(Q[246],J([0,1,127,18,76,232]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createTokenizationSupport=e.MonarchTokenizer=void 0;const S=5;class C{constructor(n){this._maxCacheDepth=n,this._entries=Object.create(null)}static create(n,t){return this._INSTANCE.create(n,t)}create(n,t){if(n!==null&&n.depth>=this._maxCacheDepth)return new d(n,t);let l=d.getStackElementId(n);l.length>0&&(l+="|"),l+=t;let h=this._entries[l];return h||(h=new d(n,t),this._entries[l]=h,h)}}C._INSTANCE=new C(S);class d{constructor(n,t){this.parent=n,this.state=t,this.depth=(this.parent?this.parent.depth:0)+1}static getStackElementId(n){let t="";for(;n!==null;)t.length>0&&(t+="|"),t+=n.state,n=n.parent;return t}static _equals(n,t){for(;n!==null&&t!==null;){if(n===t)return!0;if(n.state!==t.state)return!1;n=n.parent,t=t.parent}return n===null&&t===null}equals(n){return d._equals(this,n)}push(n){return C.create(this,n)}pop(){return this.parent}popall(){let n=this;for(;n.parent;)n=n.parent;return n}switchTo(n){return C.create(this.parent,n)}}class g{constructor(n,t){this.modeId=n,this.state=t}equals(n){return this.modeId===n.modeId&&this.state.equals(n.state)}clone(){return this.state.clone()===this.state?this:new g(this.modeId,this.state)}}class p{constructor(n){this._maxCacheDepth=n,this._entries=Object.create(null)}static create(n,t){return this._INSTANCE.create(n,t)}create(n,t){if(t!==null)return new c(n,t);if(n!==null&&n.depth>=this._maxCacheDepth)return new c(n,t);let l=d.getStackElementId(n),h=this._entries[l];return h||(h=new c(n,null),this._entries[l]=h,h)}}p._INSTANCE=new p(S);class c{constructor(n,t){this.stack=n,this.embeddedModeData=t}clone(){return(this.embeddedModeData?this.embeddedModeData.clone():null)===this.embeddedModeData?this:p.create(this.stack,this.embeddedModeData)}equals(n){return!(n instanceof c)||!this.stack.equals(n.stack)?!1:this.embeddedModeData===null&&n.embeddedModeData===null?!0:this.embeddedModeData===null||n.embeddedModeData===null?!1:this.embeddedModeData.equals(n.embeddedModeData)}}class o{constructor(){this._tokens=[],this._language=null,this._lastTokenType=null,this._lastTokenLanguage=null}enterMode(n,t){this._language=t}emit(n,t){this._lastTokenType===t&&this._lastTokenLanguage===this._language||(this._lastTokenType=t,this._lastTokenLanguage=this._language,this._tokens.push(new b.Token(n,t,this._language)))}nestedModeTokenize(n,t,l,h){const m=l.modeId,_=l.state,f=N.TokenizationRegistry.get(m);if(!f)return this.enterMode(h,m),this.emit(h,""),_;let v=f.tokenize(n,t,_,h);return this._tokens=this._tokens.concat(v.tokens),this._lastTokenType=null,this._lastTokenLanguage=null,this._language=null,v.endState}finalize(n){return new b.TokenizationResult(this._tokens,n)}}class s{constructor(n,t){this._modeService=n,this._theme=t,this._prependTokens=null,this._tokens=[],this._currentLanguageId=0,this._lastTokenMetadata=0}enterMode(n,t){this._currentLanguageId=this._modeService.getLanguageIdentifier(t).id}emit(n,t){let l=this._theme.match(this._currentLanguageId,t);this._lastTokenMetadata!==l&&(this._lastTokenMetadata=l,this._tokens.push(n),this._tokens.push(l))}static _merge(n,t,l){let h=n!==null?n.length:0,m=t.length,_=l!==null?l.length:0;if(h===0&&m===0&&_===0)return new Uint32Array(0);if(h===0&&m===0)return l;if(m===0&&_===0)return n;let f=new Uint32Array(h+m+_);n!==null&&f.set(n);for(let v=0;v{if(!m){let f=!1;for(let v=0,y=_.changedLanguages.length;v{})}}getInitialState(){let n=C.create(null,this._lexer.start);return p.create(n,null)}tokenize(n,t,l,h){let m=new o,_=this._tokenize(n,t,l,h,m);return m.finalize(_)}tokenize2(n,t,l,h){let m=new s(this._modeService,this._standaloneThemeService.getColorTheme().tokenTheme),_=this._tokenize(n,t,l,h,m);return m.finalize(_)}_tokenize(n,t,l,h,m){return l.embeddedModeData?this._nestedTokenize(n,t,l,h,m):this._myTokenize(n,t,l,h,m)}_findLeavingNestedModeOffset(n,t){let l=this._lexer.tokenizer[t.stack.state];if(!l&&(l=w.findRules(this._lexer,t.stack.state),!l))throw w.createError(this._lexer,"tokenizer state is not defined: "+t.stack.state);let h=-1,m=!1;for(const _ of l)if(!(!w.isIAction(_.action)||_.action.nextEmbedded!=="@pop")){m=!0;let f=_.regex,v=_.regex.source;if(v.substr(0,4)==="^(?:"&&v.substr(v.length-1,1)===")"){let L=(f.ignoreCase?"i":"")+(f.unicode?"u":"");f=new RegExp(v.substr(4,v.length-5),L)}let y=n.search(f);y===-1||y!==0&&_.matchOnlyAtLineStart||(h===-1||y0&&m.nestedModeTokenize(f,!1,l.embeddedModeData,h);let v=n.substring(_);return this._myTokenize(v,t,l,h+_,m)}_safeRuleName(n){return n?n.name:"(unknown)"}_myTokenize(n,t,l,h,m){m.enterMode(h,this._modeId);const _=n.length,f=t&&this._lexer.includeLF?n+` +`:n,v=f.length;let y=l.embeddedModeData,L=l.stack,I=0,k=null,E=!0;for(;E||I=v)break;E=!1;let ee=this._lexer.tokenizer[B];if(!ee&&(ee=w.findRules(this._lexer,B),!ee))throw w.createError(this._lexer,"tokenizer state is not defined: "+B);let se=f.substr(I);for(const ne of ee)if((I===0||!ne.matchOnlyAtLineStart)&&(F=se.match(ne.regex),F)){D=F[0],R=ne.action;break}}if(F||(F=[""],D=""),R||(I=this._lexer.maxStack)throw w.createError(this._lexer,"maximum tokenizer stack size reached: ["+L.state+","+L.parent.state+",...]");L=L.push(B)}else if(R.next==="@pop"){if(L.depth<=1)throw w.createError(this._lexer,"trying to pop an empty stack in rule: "+this._safeRuleName(W));L=L.pop()}else if(R.next==="@popall")L=L.popall();else{let ee=w.substituteMatches(this._lexer,R.next,D,F,B);if(ee[0]==="@"&&(ee=ee.substr(1)),w.findRules(this._lexer,ee))L=L.push(ee);else throw w.createError(this._lexer,"trying to set a next state '"+ee+"' that is undefined in rule: "+this._safeRuleName(W))}}R.log&&typeof R.log=="string"&&w.log(this._lexer,this._lexer.languageId+": "+w.substituteMatches(this._lexer,R.log,D,F,B))}if(K===null)throw w.createError(this._lexer,"lexer rule has no well-defined action in rule: "+this._safeRuleName(W));const Y=ee=>{let se=this._modeService.getModeIdForLanguageName(ee);se&&(ee=se);const ne=this._getNestedEmbeddedModeData(ee);if(I0)throw w.createError(this._lexer,"groups cannot be nested: "+this._safeRuleName(W));if(F.length!==K.length+1)throw w.createError(this._lexer,"matched number of groups does not match the number of actions in rule: "+this._safeRuleName(W));let ee=0;for(let se=1;seu});class c{static colorizeElement(r,i,n,t){t=t||{};let l=t.theme||"vs",h=t.mimeType||n.getAttribute("lang")||n.getAttribute("data-lang");if(!h)return console.error("Mode not detected"),Promise.resolve();r.setTheme(l);let m=n.firstChild?n.firstChild.nodeValue:"";n.className+=" "+l;let _=f=>{var v;const y=(v=p==null?void 0:p.createHTML(f))!==null&&v!==void 0?v:f;n.innerHTML=y};return this.colorize(i,m||"",h,t).then(_,f=>console.error(f))}static colorize(r,i,n,t){let l=4;t&&typeof t.tabSize=="number"&&(l=t.tabSize),N.startsWithUTF8BOM(i)&&(i=i.substr(1));let h=N.splitLines(i),m=r.getModeId(n);if(!m)return Promise.resolve(s(h,l));r.triggerMode(m);const _=w.TokenizationRegistry.get(m);if(_)return o(h,l,_);const f=w.TokenizationRegistry.getPromise(m);return f?new Promise((v,y)=>{f.then(L=>{o(h,l,L).then(v,y)},y)}):new Promise((v,y)=>{let L=null,I=null;const k=()=>{L&&(L.dispose(),L=null),I&&(I.dispose(),I=null);const E=w.TokenizationRegistry.get(m);if(E){o(h,l,E).then(v,y);return}v(s(h,l))};I=new b.TimeoutTimer,I.cancelAndSet(k,500),L=w.TokenizationRegistry.onDidChange(E=>{E.changedLanguages.indexOf(m)>=0&&k()})})}static colorizeLine(r,i,n,t,l=4){const h=C.ViewLineRenderingData.isBasicASCII(r,i),m=C.ViewLineRenderingData.containsRTL(r,h,n);return S.renderViewLine2(new S.RenderLineInput(!1,!0,r,!1,h,m,0,t,[],l,0,0,0,0,-1,"none",!1,!1,null)).html}static colorizeModelLine(r,i,n=4){let t=r.getLineContent(i);r.forceTokenization(i);let h=r.getLineTokens(i).inflate();return this.colorizeLine(t,r.mightContainNonBasicASCII(),r.mightContainRTL(),h,n)}}e.Colorizer=c;function o(u,r,i){return new Promise((n,t)=>{const l=()=>{const h=a(u,r,i);if(i instanceof d.MonarchTokenizer){const m=i.getLoadStatus();if(m.loaded===!1){m.promise.then(l,t);return}}n(h)};l()})}function s(u,r){let i=[];const n=(0<<11|1<<14|2<<23)>>>0,t=new Uint32Array(2);t[0]=0,t[1]=n;for(let l=0,h=u.length;l")}return i.join("")}function a(u,r,i){let n=[],t=i.getInitialState();for(let l=0,h=u.length;l"),t=_.endState}return n.join("")}}),define(Q[114],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IStandaloneThemeService=void 0,e.IStandaloneThemeService=b.createDecorator("themeService")}),define(Q[84],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IClipboardService=void 0,e.IClipboardService=b.createDecorator("clipboardService")}),define(Q[26],J([0,1,2,20,9,6,71,54]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommandsRegistry=e.ICommandService=void 0,e.ICommandService=M.createDecorator("commandService"),e.CommandsRegistry=new class{constructor(){this._commands=new Map,this._onDidRegisterCommand=new w.Emitter,this.onDidRegisterCommand=this._onDidRegisterCommand.event}registerCommand(d,g){if(!d)throw new Error("invalid command");if(typeof d=="string"){if(!g)throw new Error("invalid command");return this.registerCommand({id:d,handler:g})}if(d.description){const a=[];for(let r of d.description.args)a.push(r.constraint);const u=d.handler;d.handler=function(r,...i){return N.validateConstraints(i,a),u(r,...i)}}const{id:p}=d;let c=this._commands.get(p);c||(c=new S.LinkedList,this._commands.set(p,c));let o=c.unshift(d),s=b.toDisposable(()=>{o();const a=this._commands.get(p);(a==null?void 0:a.isEmpty())&&this._commands.delete(p)});return this._onDidRegisterCommand.fire(p),s}registerCommandAlias(d,g){return e.CommandsRegistry.registerCommand(d,(p,...c)=>p.get(e.ICommandService).executeCommand(g,...c))}getCommand(d){const g=this._commands.get(d);if(!(!g||g.isEmpty()))return C.Iterable.first(g)}getCommands(){const d=new Map;for(const g of this._commands.keys()){const p=this.getCommand(g);p&&d.set(g,p)}return d}}}),define(Q[247],J([0,1,23,12,24,18,36,26,20,383,3]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getDocumentRangeSemanticTokensProvider=e.getDocumentSemanticTokens=e.isSemanticTokensEdits=e.isSemanticTokens=void 0;function c(r){return r&&!!r.data}e.isSemanticTokens=c;function o(r){return r&&Array.isArray(r.edits)}e.isSemanticTokensEdits=o;function s(r,i,n){const t=a(r);return t?{provider:t,request:Promise.resolve(t.provideDocumentSemanticTokens(r,i,n))}:null}e.getDocumentSemanticTokens=s;function a(r){const i=w.DocumentSemanticTokensProviderRegistry.ordered(r);return i.length>0?i[0]:null}function u(r){const i=w.DocumentRangeSemanticTokensProviderRegistry.ordered(r);return i.length>0?i[0]:null}e.getDocumentRangeSemanticTokensProvider=u,C.CommandsRegistry.registerCommand("_provideDocumentSemanticTokensLegend",(r,...i)=>Ie(void 0,void 0,void 0,function*(){const[n]=i;d.assertType(n instanceof M.URI);const t=r.get(S.IModelService).getModel(n);if(!!t){const l=a(t);return l?l.getLegend():r.get(C.ICommandService).executeCommand("_provideDocumentRangeSemanticTokensLegend",n)}})),C.CommandsRegistry.registerCommand("_provideDocumentSemanticTokens",(r,...i)=>Ie(void 0,void 0,void 0,function*(){const[n]=i;d.assertType(n instanceof M.URI);const t=r.get(S.IModelService).getModel(n);if(!!t){const l=s(t,null,b.CancellationToken.None);if(!l)return r.get(C.ICommandService).executeCommand("_provideDocumentRangeSemanticTokens",n,t.getFullModelRange());const{provider:h,request:m}=l;let _;try{_=yield m}catch(v){N.onUnexpectedExternalError(v);return}if(!(!_||!c(_))){const f=g.encodeSemanticTokensDto({id:0,type:"full",data:_.data});return _.resultId&&h.releaseDocumentSemanticTokens(_.resultId),f}}})),C.CommandsRegistry.registerCommand("_provideDocumentRangeSemanticTokensLegend",(r,...i)=>Ie(void 0,void 0,void 0,function*(){const[n]=i;d.assertType(n instanceof M.URI);const t=r.get(S.IModelService).getModel(n);if(!!t){const l=u(t);if(!!l)return l.getLegend()}})),C.CommandsRegistry.registerCommand("_provideDocumentRangeSemanticTokens",(r,...i)=>Ie(void 0,void 0,void 0,function*(){const[n,t]=i;d.assertType(n instanceof M.URI),d.assertType(p.Range.isIRange(t));const l=r.get(S.IModelService).getModel(n);if(!!l){const h=u(l);if(!!h){let m;try{m=yield h.provideDocumentRangeSemanticTokens(l,p.Range.lift(t),b.CancellationToken.None)}catch(_){N.onUnexpectedExternalError(_);return}if(!(!m||!c(m)))return g.encodeSemanticTokensDto({id:0,type:"full",data:m.data})}}}))}),define(Q[248],J([0,1,19,23,12,24,18,36,2,26,20]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCodeLensModel=e.CodeLensModel=void 0;class c{constructor(){this.lenses=[],this._disposables=new d.DisposableStore}dispose(){this._disposables.dispose()}add(a,u){this._disposables.add(a);for(const r of a.lenses)this.lenses.push({symbol:r,provider:u})}}e.CodeLensModel=c;function o(s,a){return Ie(this,void 0,void 0,function*(){const u=S.CodeLensProviderRegistry.ordered(s),r=new Map,i=new c,n=u.map((t,l)=>Ie(this,void 0,void 0,function*(){r.set(t,l);try{const h=yield Promise.resolve(t.provideCodeLenses(s,a));h&&i.add(h,t)}catch(h){M.onUnexpectedExternalError(h)}}));return yield Promise.all(n),i.lenses=b.mergeSort(i.lenses,(t,l)=>t.symbol.range.startLineNumberl.symbol.range.startLineNumber?1:r.get(t.provider)r.get(l.provider)?1:t.symbol.range.startColumnl.symbol.range.startColumn?1:0),i})}e.getCodeLensModel=o,g.CommandsRegistry.registerCommand("_executeCodeLensProvider",function(s,...a){let[u,r]=a;p.assertType(w.URI.isUri(u)),p.assertType(typeof r=="number"||!r);const i=s.get(C.IModelService).getModel(u);if(!i)throw M.illegalArgument();const n=[],t=new d.DisposableStore;return o(i,N.CancellationToken.None).then(l=>{t.add(l);let h=[];for(const m of l.lenses)r==null||Boolean(m.symbol.command)?n.push(m.symbol):r-- >0&&m.provider.resolveCodeLens&&h.push(Promise.resolve(m.provider.resolveCodeLens(i,m.symbol,N.CancellationToken.None)).then(_=>n.push(_||m.symbol)));return Promise.all(h)}).then(()=>n).finally(()=>{setTimeout(()=>t.dispose(),100)})})}),define(Q[249],J([0,1,23,12,24,3,18,36,26]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getColorPresentations=e.getColors=void 0;function g(c,o){const s=[],u=S.ColorProviderRegistry.ordered(c).reverse().map(r=>Promise.resolve(r.provideDocumentColors(c,o)).then(i=>{if(Array.isArray(i))for(let n of i)s.push({colorInfo:n,provider:r})}));return Promise.all(u).then(()=>s)}e.getColors=g;function p(c,o,s,a){return Promise.resolve(s.provideColorPresentations(c,o,a))}e.getColorPresentations=p,d.CommandsRegistry.registerCommand("_executeDocumentColorProvider",function(c,...o){const[s]=o;if(!(s instanceof M.URI))throw N.illegalArgument();const a=c.get(C.IModelService).getModel(s);if(!a)throw N.illegalArgument();const u=[],i=S.ColorProviderRegistry.ordered(a).reverse().map(n=>Promise.resolve(n.provideDocumentColors(a,b.CancellationToken.None)).then(t=>{if(Array.isArray(t))for(let l of t)u.push({range:l.range,color:[l.color.red,l.color.green,l.color.blue,l.color.alpha]})}));return Promise.all(i).then(()=>u)}),d.CommandsRegistry.registerCommand("_executeColorPresentationProvider",function(c,...o){const[s,a]=o,{uri:u,range:r}=a;if(!(u instanceof M.URI)||!Array.isArray(s)||s.length!==4||!w.Range.isIRange(r))throw N.illegalArgument();const[i,n,t,l]=s,h=c.get(C.IModelService).getModel(u);if(!h)throw N.illegalArgument();const m={range:r,color:{red:i,green:n,blue:t,alpha:l}},_=[],v=S.ColorProviderRegistry.ordered(h).reverse().map(y=>Promise.resolve(y.provideColorPresentations(h,m,b.CancellationToken.None)).then(L=>{Array.isArray(L)&&_.push(...L)}));return Promise.all(v).then(()=>_)})}),define(Q[545],J([0,1,24,36,23,67,245,26,20]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getDocumentSymbols=void 0;function g(p,c,o){return Ie(this,void 0,void 0,function*(){const s=yield S.OutlineModel.create(p,o);return c?s.asListOfDocumentSymbols():s.getTopLevelSymbols()})}e.getDocumentSymbols=g,C.CommandsRegistry.registerCommand("_executeDocumentSymbolProvider",function(p,...c){return Ie(this,void 0,void 0,function*(){const[o]=c;d.assertType(b.URI.isUri(o));const s=p.get(N.IModelService).getModel(o);if(s)return g(s,!1,M.CancellationToken.None);const a=yield p.get(w.ITextModelService).createModelReference(o);try{return yield g(a.object.textEditorModel,!1,M.CancellationToken.None)}finally{a.dispose()}})})}),define(Q[546],J([0,1,23,12,24,3,18,36,26,2,19,20]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getLinks=e.LinksList=e.Link=void 0;class o{constructor(r,i){this._link=r,this._provider=i}toJSON(){return{range:this.range,url:this.url,tooltip:this.tooltip}}get range(){return this._link.range}get url(){return this._link.url}get tooltip(){return this._link.tooltip}resolve(r){return Ie(this,void 0,void 0,function*(){return this._link.url?this._link.url:typeof this._provider.resolveLink=="function"?Promise.resolve(this._provider.resolveLink(this._link,r)).then(i=>(this._link=i||this._link,this._link.url?this.resolve(r):Promise.reject(new Error("missing")))):Promise.reject(new Error("missing"))})}}e.Link=o;class s{constructor(r){this._disposables=new g.DisposableStore;let i=[];for(const[n,t]of r){const l=n.links.map(h=>new o(h,t));i=s._union(i,l),g.isDisposable(n)&&this._disposables.add(n)}this.links=i}dispose(){this._disposables.dispose(),this.links.length=0}static _union(r,i){let n=[],t,l,h,m;for(t=0,h=0,l=r.length,m=i.length;tPromise.resolve(t.provideLinks(u,r)).then(h=>{h&&(i[l]=[h,t])},N.onUnexpectedExternalError));return Promise.all(n).then(()=>{const t=new s(p.coalesce(i));return r.isCancellationRequested?(t.dispose(),new s([])):t})}e.getLinks=a,d.CommandsRegistry.registerCommand("_executeLinkProvider",(u,...r)=>Ie(void 0,void 0,void 0,function*(){let[i,n]=r;c.assertType(i instanceof M.URI),typeof n!="number"&&(n=0);const t=u.get(C.IModelService).getModel(i);if(!t)return[];const l=yield a(t,b.CancellationToken.None);if(!l)return[];for(let m=0;m=0),S.set("isFirefox",w.indexOf("Firefox")>=0),S.set("isChrome",w.indexOf("Chrome")>=0),S.set("isSafari",w.indexOf("Safari")>=0),S.set("isIPad",w.indexOf("iPad")>=0);const C=Object.prototype.hasOwnProperty;class d{static has(E){return o.create(E)}static equals(E,T){return s.create(E,T)}static regex(E,T){return m.create(E,T)}static not(E){return i.create(E)}static and(...E){return f.create(E)}static or(...E){return v.create(E)}static deserialize(E,T=!1){if(!!E)return this._deserializeOrExpression(E,T)}static _deserializeOrExpression(E,T){let O=E.split("||");return v.create(O.map(A=>this._deserializeAndExpression(A,T)))}static _deserializeAndExpression(E,T){let O=E.split("&&");return f.create(O.map(A=>this._deserializeOne(A,T)))}static _deserializeOne(E,T){if(E=E.trim(),E.indexOf("!=")>=0){let O=E.split("!=");return r.create(O[0].trim(),this._deserializeValue(O[1],T))}if(E.indexOf("==")>=0){let O=E.split("==");return s.create(O[0].trim(),this._deserializeValue(O[1],T))}if(E.indexOf("=~")>=0){let O=E.split("=~");return m.create(O[0].trim(),this._deserializeRegexValue(O[1],T))}if(E.indexOf(" in ")>=0){let O=E.split(" in ");return a.create(O[0].trim(),O[1].trim())}if(/^[^<=>]+>=[^<=>]+$/.test(E)){const O=E.split(">=");return t.create(O[0].trim(),O[1].trim())}if(/^[^<=>]+>[^<=>]+$/.test(E)){const O=E.split(">");return n.create(O[0].trim(),O[1].trim())}if(/^[^<=>]+<=[^<=>]+$/.test(E)){const O=E.split("<=");return h.create(O[0].trim(),O[1].trim())}if(/^[^<=>]+<[^<=>]+$/.test(E)){const O=E.split("<");return l.create(O[0].trim(),O[1].trim())}return/^\!\s*/.test(E)?i.create(E.substr(1).trim()):o.create(E)}static _deserializeValue(E,T){if(E=E.trim(),E==="true")return!0;if(E==="false")return!1;let O=/^'([^']*)'$/.exec(E);return O?O[1].trim():E}static _deserializeRegexValue(E,T){if(b.isFalsyOrWhitespace(E)){if(T)throw new Error("missing regexp-value for =~-expression");return console.warn("missing regexp-value for =~-expression"),null}let O=E.indexOf("/"),A=E.lastIndexOf("/");if(O===A||O<0){if(T)throw new Error(`bad regexp-value '${E}', missing /-enclosure`);return console.warn(`bad regexp-value '${E}', missing /-enclosure`),null}let B=E.slice(O+1,A),F=E[A+1]==="i"?"i":"";try{return new RegExp(B,F)}catch(D){if(T)throw new Error(`bad regexp-value '${E}', parse error: ${D}`);return console.warn(`bad regexp-value '${E}', parse error: ${D}`),null}}}e.ContextKeyExpr=d;function g(k,E){return k.cmp(E)}class p{constructor(){this.type=0}cmp(E){return this.type-E.type}equals(E){return E.type===this.type}evaluate(E){return!1}serialize(){return"false"}keys(){return[]}negate(){return c.INSTANCE}}e.ContextKeyFalseExpr=p,p.INSTANCE=new p;class c{constructor(){this.type=1}cmp(E){return this.type-E.type}equals(E){return E.type===this.type}evaluate(E){return!0}serialize(){return"true"}keys(){return[]}negate(){return p.INSTANCE}}e.ContextKeyTrueExpr=c,c.INSTANCE=new c;class o{constructor(E){this.key=E,this.type=2}static create(E){const T=S.get(E);return typeof T=="boolean"?T?c.INSTANCE:p.INSTANCE:new o(E)}cmp(E){return E.type!==this.type?this.type-E.type:L(this.key,E.key)}equals(E){return E.type===this.type?this.key===E.key:!1}evaluate(E){return!!E.getValue(this.key)}serialize(){return this.key}keys(){return[this.key]}negate(){return i.create(this.key)}}e.ContextKeyDefinedExpr=o;class s{constructor(E,T){this.key=E,this.value=T,this.type=4}static create(E,T){if(typeof T=="boolean")return T?o.create(E):i.create(E);const O=S.get(E);return typeof O=="boolean"?T===(O?"true":"false")?c.INSTANCE:p.INSTANCE:new s(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return E.getValue(this.key)==this.value}serialize(){return`${this.key} == '${this.value}'`}keys(){return[this.key]}negate(){return r.create(this.key,this.value)}}e.ContextKeyEqualsExpr=s;class a{constructor(E,T){this.key=E,this.valueKey=T,this.type=10}static create(E,T){return new a(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.valueKey,E.key,E.valueKey)}equals(E){return E.type===this.type?this.key===E.key&&this.valueKey===E.valueKey:!1}evaluate(E){const T=E.getValue(this.valueKey),O=E.getValue(this.key);return Array.isArray(T)?T.indexOf(O)>=0:typeof O=="string"&&typeof T=="object"&&T!==null?C.call(T,O):!1}serialize(){return`${this.key} in '${this.valueKey}'`}keys(){return[this.key,this.valueKey]}negate(){return u.create(this)}}e.ContextKeyInExpr=a;class u{constructor(E){this._actual=E,this.type=11}static create(E){return new u(E)}cmp(E){return E.type!==this.type?this.type-E.type:this._actual.cmp(E._actual)}equals(E){return E.type===this.type?this._actual.equals(E._actual):!1}evaluate(E){return!this._actual.evaluate(E)}serialize(){throw new Error("Method not implemented.")}keys(){return this._actual.keys()}negate(){return this._actual}}e.ContextKeyNotInExpr=u;class r{constructor(E,T){this.key=E,this.value=T,this.type=5}static create(E,T){if(typeof T=="boolean")return T?i.create(E):o.create(E);const O=S.get(E);return typeof O=="boolean"?T===(O?"true":"false")?p.INSTANCE:c.INSTANCE:new r(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return E.getValue(this.key)!=this.value}serialize(){return`${this.key} != '${this.value}'`}keys(){return[this.key]}negate(){return s.create(this.key,this.value)}}e.ContextKeyNotEqualsExpr=r;class i{constructor(E){this.key=E,this.type=3}static create(E){const T=S.get(E);return typeof T=="boolean"?T?p.INSTANCE:c.INSTANCE:new i(E)}cmp(E){return E.type!==this.type?this.type-E.type:L(this.key,E.key)}equals(E){return E.type===this.type?this.key===E.key:!1}evaluate(E){return!E.getValue(this.key)}serialize(){return`!${this.key}`}keys(){return[this.key]}negate(){return o.create(this.key)}}e.ContextKeyNotExpr=i;class n{constructor(E,T){this.key=E,this.value=T,this.type=12}static create(E,T){return new n(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return parseFloat(E.getValue(this.key))>parseFloat(this.value)}serialize(){return`${this.key} > ${this.value}`}keys(){return[this.key]}negate(){return h.create(this.key,this.value)}}e.ContextKeyGreaterExpr=n;class t{constructor(E,T){this.key=E,this.value=T,this.type=13}static create(E,T){return new t(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return parseFloat(E.getValue(this.key))>=parseFloat(this.value)}serialize(){return`${this.key} >= ${this.value}`}keys(){return[this.key]}negate(){return l.create(this.key,this.value)}}e.ContextKeyGreaterEqualsExpr=t;class l{constructor(E,T){this.key=E,this.value=T,this.type=14}static create(E,T){return new l(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return parseFloat(E.getValue(this.key))E.key)return 1;const T=this.regexp?this.regexp.source:"",O=E.regexp?E.regexp.source:"";return TO?1:0}equals(E){if(E.type===this.type){const T=this.regexp?this.regexp.source:"",O=E.regexp?E.regexp.source:"";return this.key===E.key&&T===O}return!1}evaluate(E){let T=E.getValue(this.key);return this.regexp?this.regexp.test(T):!1}serialize(){const E=this.regexp?`/${this.regexp.source}/${this.regexp.ignoreCase?"i":""}`:"/invalid/";return`${this.key} =~ ${E}`}keys(){return[this.key]}negate(){return _.create(this)}}e.ContextKeyRegexExpr=m;class _{constructor(E){this._actual=E,this.type=8}static create(E){return new _(E)}cmp(E){return E.type!==this.type?this.type-E.type:this._actual.cmp(E._actual)}equals(E){return E.type===this.type?this._actual.equals(E._actual):!1}evaluate(E){return!this._actual.evaluate(E)}serialize(){throw new Error("Method not implemented.")}keys(){return this._actual.keys()}negate(){return this._actual}}e.ContextKeyNotRegexExpr=_;class f{constructor(E){this.expr=E,this.type=6}static create(E){return f._normalizeArr(E)}cmp(E){if(E.type!==this.type)return this.type-E.type;if(this.expr.lengthE.expr.length)return 1;for(let T=0,O=this.expr.length;T1;){const A=T[T.length-1];if(A.type!==9)break;T.pop();const B=T.pop(),F=v.create(A.expr.map(D=>f.create([D,B])));F&&(T.push(F),T.sort(g))}return T.length===1?T[0]:new f(T)}}serialize(){return this.expr.map(E=>E.serialize()).join(" && ")}keys(){const E=[];for(let T of this.expr)E.push(...T.keys());return E}negate(){let E=[];for(let T of this.expr)E.push(T.negate());return v.create(E)}}e.ContextKeyAndExpr=f;class v{constructor(E){this.expr=E,this.type=9}static create(E){const T=v._normalizeArr(E);if(T.length!==0)return T.length===1?T[0]:new v(T)}cmp(E){if(E.type!==this.type)return this.type-E.type;if(this.expr.lengthE.expr.length)return 1;for(let T=0,O=this.expr.length;TE.serialize()).join(" || ")}keys(){const E=[];for(let T of this.expr)E.push(...T.keys());return E}negate(){let E=[];for(let O of this.expr)E.push(O.negate());const T=O=>O.type===9?O.expr:[O];for(;E.length>1;){const O=E.shift(),A=E.shift(),B=[];for(const F of T(O))for(const D of T(A))B.push(d.and(F,D));E.unshift(d.or(...B))}return E[0]}}e.ContextKeyOrExpr=v;class y extends o{constructor(E,T,O){super(E);this.key=E,this._defaultValue=T,typeof O=="object"?y._info.push(Object.assign(Object.assign({},O),{key:E})):O!==!0&&y._info.push({key:E,description:O,type:T!=null?typeof T:void 0})}static all(){return y._info.values()}bindTo(E){return E.createKey(this.key,this._defaultValue)}getValue(E){return E.getContextKeyValue(this.key)}toNegated(){return d.not(this.key)}isEqualTo(E){return d.equals(this.key,E)}}e.RawContextKey=y,y._info=[],e.IContextKeyService=N.createDecorator("contextKeyService"),e.SET_CONTEXT_COMMAND_ID="setContext";function L(k,E){return kE?1:0}function I(k,E,T,O){return kT?1:EO?1:0}}),define(Q[25],J([0,1,456,16]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorContextKeys=void 0;var M;(function(w){w.editorSimpleInput=new N.RawContextKey("editorSimpleInput",!1,!0),w.editorTextFocus=new N.RawContextKey("editorTextFocus",!1,b.localize(0,null)),w.focus=new N.RawContextKey("editorFocus",!1,b.localize(1,null)),w.textInputFocus=new N.RawContextKey("textInputFocus",!1,b.localize(2,null)),w.readOnly=new N.RawContextKey("editorReadonly",!1,b.localize(3,null)),w.inDiffEditor=new N.RawContextKey("inDiffEditor",!1,b.localize(4,null)),w.columnSelection=new N.RawContextKey("editorColumnSelection",!1,b.localize(5,null)),w.writable=w.readOnly.toNegated(),w.hasNonEmptySelection=new N.RawContextKey("editorHasSelection",!1,b.localize(6,null)),w.hasOnlyEmptySelection=w.hasNonEmptySelection.toNegated(),w.hasMultipleSelections=new N.RawContextKey("editorHasMultipleSelections",!1,b.localize(7,null)),w.hasSingleSelection=w.hasMultipleSelections.toNegated(),w.tabMovesFocus=new N.RawContextKey("editorTabMovesFocus",!1,b.localize(8,null)),w.tabDoesNotMoveFocus=w.tabMovesFocus.toNegated(),w.isInWalkThroughSnippet=new N.RawContextKey("isInEmbeddedEditor",!1,!0),w.canUndo=new N.RawContextKey("canUndo",!1,!0),w.canRedo=new N.RawContextKey("canRedo",!1,!0),w.hoverVisible=new N.RawContextKey("editorHoverVisible",!1,b.localize(9,null)),w.inCompositeEditor=new N.RawContextKey("inCompositeEditor",void 0,b.localize(10,null)),w.notInCompositeEditor=w.inCompositeEditor.toNegated(),w.languageId=new N.RawContextKey("editorLangId","",b.localize(11,null)),w.hasCompletionItemProvider=new N.RawContextKey("editorHasCompletionItemProvider",!1,b.localize(12,null)),w.hasCodeActionsProvider=new N.RawContextKey("editorHasCodeActionsProvider",!1,b.localize(13,null)),w.hasCodeLensProvider=new N.RawContextKey("editorHasCodeLensProvider",!1,b.localize(14,null)),w.hasDefinitionProvider=new N.RawContextKey("editorHasDefinitionProvider",!1,b.localize(15,null)),w.hasDeclarationProvider=new N.RawContextKey("editorHasDeclarationProvider",!1,b.localize(16,null)),w.hasImplementationProvider=new N.RawContextKey("editorHasImplementationProvider",!1,b.localize(17,null)),w.hasTypeDefinitionProvider=new N.RawContextKey("editorHasTypeDefinitionProvider",!1,b.localize(18,null)),w.hasHoverProvider=new N.RawContextKey("editorHasHoverProvider",!1,b.localize(19,null)),w.hasDocumentHighlightProvider=new N.RawContextKey("editorHasDocumentHighlightProvider",!1,b.localize(20,null)),w.hasDocumentSymbolProvider=new N.RawContextKey("editorHasDocumentSymbolProvider",!1,b.localize(21,null)),w.hasReferenceProvider=new N.RawContextKey("editorHasReferenceProvider",!1,b.localize(22,null)),w.hasRenameProvider=new N.RawContextKey("editorHasRenameProvider",!1,b.localize(23,null)),w.hasSignatureHelpProvider=new N.RawContextKey("editorHasSignatureHelpProvider",!1,b.localize(24,null)),w.hasInlineHintsProvider=new N.RawContextKey("editorHasInlineHintsProvider",!1,b.localize(25,null)),w.hasDocumentFormattingProvider=new N.RawContextKey("editorHasDocumentFormattingProvider",!1,b.localize(26,null)),w.hasDocumentSelectionFormattingProvider=new N.RawContextKey("editorHasDocumentSelectionFormattingProvider",!1,b.localize(27,null)),w.hasMultipleDocumentFormattingProvider=new N.RawContextKey("editorHasMultipleDocumentFormattingProvider",!1,b.localize(28,null)),w.hasMultipleDocumentSelectionFormattingProvider=new N.RawContextKey("editorHasMultipleDocumentSelectionFormattingProvider",!1,b.localize(29,null))})(M=e.EditorContextKeys||(e.EditorContextKeys={}))}),define(Q[183],J([0,1,12,14,18,16,23,26,24,20,67]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.provideSignatureHelp=e.Context=void 0,e.Context={Visible:new w.RawContextKey("parameterHintsVisible",!1),MultipleSignatures:new w.RawContextKey("parameterHintsMultipleSignatures",!1)};function c(o,s,a,u){return Ie(this,void 0,void 0,function*(){const r=M.SignatureHelpProviderRegistry.ordered(o);for(const i of r)try{const n=yield i.provideSignatureHelp(o,s,u,a);if(n)return n}catch(n){b.onUnexpectedExternalError(n)}})}e.provideSignatureHelp=c,C.CommandsRegistry.registerCommand("_executeSignatureHelpProvider",(o,...s)=>Ie(void 0,void 0,void 0,function*(){const[a,u,r]=s;g.assertType(d.URI.isUri(a)),g.assertType(N.Position.isIPosition(u)),g.assertType(typeof r=="string"||!r);const i=yield o.get(p.ITextModelService).createModelReference(a);try{const n=yield c(i.object.textEditorModel,N.Position.lift(u),{triggerKind:M.SignatureHelpTriggerKind.Invoke,isRetrigger:!1,triggerCharacter:r},S.CancellationToken.None);return n?(setTimeout(()=>n.dispose(),0),n.value):void 0}finally{i.dispose()}}))}),define(Q[547],J([0,1,15,12,6,2,91,18,183]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ParameterHintsModel=void 0;var g;(function(o){o.Default={type:0};class s{constructor(r,i){this.request=r,this.previouslyActiveHints=i,this.type=2}}o.Pending=s;class a{constructor(r){this.hints=r,this.type=1}}o.Active=a})(g||(g={}));class p extends w.Disposable{constructor(s,a=p.DEFAULT_DELAY){super();this._onChangedHints=this._register(new M.Emitter),this.onChangedHints=this._onChangedHints.event,this.triggerOnType=!1,this._state=g.Default,this._pendingTriggers=[],this._lastSignatureHelpResult=this._register(new w.MutableDisposable),this.triggerChars=new S.CharacterSet,this.retriggerChars=new S.CharacterSet,this.triggerId=0,this.editor=s,this.throttledDelayer=new b.Delayer(a),this._register(this.editor.onDidChangeConfiguration(()=>this.onEditorConfigurationChange())),this._register(this.editor.onDidChangeModel(u=>this.onModelChanged())),this._register(this.editor.onDidChangeModelLanguage(u=>this.onModelChanged())),this._register(this.editor.onDidChangeCursorSelection(u=>this.onCursorChange(u))),this._register(this.editor.onDidChangeModelContent(u=>this.onModelContentChange())),this._register(C.SignatureHelpProviderRegistry.onDidChange(this.onModelChanged,this)),this._register(this.editor.onDidType(u=>this.onDidType(u))),this.onEditorConfigurationChange(),this.onModelChanged()}get state(){return this._state}set state(s){this._state.type===2&&this._state.request.cancel(),this._state=s}cancel(s=!1){this.state=g.Default,this.throttledDelayer.cancel(),s||this._onChangedHints.fire(void 0)}trigger(s,a){const u=this.editor.getModel();if(!(!u||!C.SignatureHelpProviderRegistry.has(u))){const r=++this.triggerId;this._pendingTriggers.push(s),this.throttledDelayer.trigger(()=>this.doTrigger(r),a).catch(N.onUnexpectedError)}}next(){if(this.state.type===1){const s=this.state.hints.signatures.length,a=this.state.hints.activeSignature,u=a%s==s-1,r=this.editor.getOption(70).cycle;if((s<2||u)&&!r){this.cancel();return}this.updateActiveSignature(u&&r?0:a+1)}}previous(){if(this.state.type===1){const s=this.state.hints.signatures.length,a=this.state.hints.activeSignature,u=a===0,r=this.editor.getOption(70).cycle;if((s<2||u)&&!r){this.cancel();return}this.updateActiveSignature(u&&r?s-1:a-1)}}updateActiveSignature(s){this.state.type===1&&(this.state=new g.Active(Object.assign(Object.assign({},this.state.hints),{activeSignature:s})),this._onChangedHints.fire(this.state.hints))}doTrigger(s){return Ie(this,void 0,void 0,function*(){const a=this.state.type===1||this.state.type===2,u=this.getLastActiveHints();if(this.cancel(!0),this._pendingTriggers.length===0)return!1;const r=this._pendingTriggers.reduce(c);this._pendingTriggers=[];const i={triggerKind:r.triggerKind,triggerCharacter:r.triggerCharacter,isRetrigger:a,activeSignatureHelp:u};if(!this.editor.hasModel())return!1;const n=this.editor.getModel(),t=this.editor.getPosition();this.state=new g.Pending(b.createCancelablePromise(l=>d.provideSignatureHelp(n,t,i,l)),u);try{const l=yield this.state.request;return s!==this.triggerId?(l==null||l.dispose(),!1):!l||!l.value.signatures||l.value.signatures.length===0?(l==null||l.dispose(),this._lastSignatureHelpResult.clear(),this.cancel(),!1):(this.state=new g.Active(l.value),this._lastSignatureHelpResult.value=l,this._onChangedHints.fire(this.state.hints),!0)}catch(l){return s===this.triggerId&&(this.state=g.Default),N.onUnexpectedError(l),!1}})}getLastActiveHints(){switch(this.state.type){case 1:return this.state.hints;case 2:return this.state.previouslyActiveHints;default:return}}get isTriggered(){return this.state.type===1||this.state.type===2||this.throttledDelayer.isTriggered()}onModelChanged(){this.cancel(),this.triggerChars=new S.CharacterSet,this.retriggerChars=new S.CharacterSet;const s=this.editor.getModel();if(!!s)for(const a of C.SignatureHelpProviderRegistry.ordered(s)){for(const u of a.signatureHelpTriggerCharacters||[])this.triggerChars.add(u.charCodeAt(0)),this.retriggerChars.add(u.charCodeAt(0));for(const u of a.signatureHelpRetriggerCharacters||[])this.retriggerChars.add(u.charCodeAt(0))}}onDidType(s){if(!!this.triggerOnType){const a=s.length-1,u=s.charCodeAt(a);(this.triggerChars.has(u)||this.isTriggered&&this.retriggerChars.has(u))&&this.trigger({triggerKind:C.SignatureHelpTriggerKind.TriggerCharacter,triggerCharacter:s.charAt(a)})}}onCursorChange(s){s.source==="mouse"?this.cancel():this.isTriggered&&this.trigger({triggerKind:C.SignatureHelpTriggerKind.ContentChange})}onModelContentChange(){this.isTriggered&&this.trigger({triggerKind:C.SignatureHelpTriggerKind.ContentChange})}onEditorConfigurationChange(){this.triggerOnType=this.editor.getOption(70).enabled,this.triggerOnType||this.cancel()}dispose(){this.cancel(!0),super.dispose()}}e.ParameterHintsModel=p,p.DEFAULT_DELAY=120;function c(o,s){switch(s.triggerKind){case C.SignatureHelpTriggerKind.Invoke:return s;case C.SignatureHelpTriggerKind.ContentChange:return o;case C.SignatureHelpTriggerKind.TriggerCharacter:default:return s}}});var _e=this&&this.__param||function(q,e){return function(b,N){e(b,N,q)}};define(Q[548],J([0,1,16]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestAlternatives=void 0;let N=class at{constructor(w,S){this._editor=w,this._index=0,this._ckOtherSuggestions=at.OtherSuggestions.bindTo(S)}dispose(){this.reset()}reset(){var w;this._ckOtherSuggestions.reset(),(w=this._listener)===null||w===void 0||w.dispose(),this._model=void 0,this._acceptNext=void 0,this._ignore=!1}set({model:w,index:S},C){if(w.items.length===0){this.reset();return}if(at._moveIndex(!0,w,S)===S){this.reset();return}this._acceptNext=C,this._model=w,this._index=S,this._listener=this._editor.onDidChangeCursorPosition(()=>{this._ignore||this.reset()}),this._ckOtherSuggestions.set(!0)}static _moveIndex(w,S,C){let d=C;for(;d=(d+S.items.length+(w?1:-1))%S.items.length,!(d===C||!S.items[d].completion.additionalTextEdits););return d}next(){this._move(!0)}prev(){this._move(!1)}_move(w){if(!!this._model)try{this._ignore=!0,this._index=at._moveIndex(w,this._model,this._index),this._acceptNext({index:this._index,item:this._model.items[this._index],model:this._model})}finally{this._ignore=!1}}};N.OtherSuggestions=new b.RawContextKey("hasOtherSuggestions",!1),N=Me([_e(1,b.IContextKeyService)],N),e.SuggestAlternatives=N}),define(Q[549],J([0,1,16]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordContextKey=void 0;let N=class Mt{constructor(w,S){this._editor=w,this._enabled=!1,this._ckAtEnd=Mt.AtEnd.bindTo(S),this._configListener=this._editor.onDidChangeConfiguration(C=>C.hasChanged(106)&&this._update()),this._update()}dispose(){var w;this._configListener.dispose(),(w=this._selectionListener)===null||w===void 0||w.dispose(),this._ckAtEnd.reset()}_update(){const w=this._editor.getOption(106)==="on";if(this._enabled!==w)if(this._enabled=w,this._enabled){const S=()=>{if(!this._editor.hasModel()){this._ckAtEnd.set(!1);return}const C=this._editor.getModel(),d=this._editor.getSelection(),g=C.getWordAtPosition(d.getStartPosition());if(!g){this._ckAtEnd.set(!1);return}this._ckAtEnd.set(g.endColumn===d.getStartPosition().column)};this._selectionListener=this._editor.onDidChangeCursorSelection(S),S()}else this._selectionListener&&(this._ckAtEnd.reset(),this._selectionListener.dispose(),this._selectionListener=void 0)}};N.AtEnd=new b.RawContextKey("atEndOfWord",!1),N=Me([_e(1,b.IContextKeyService)],N),e.WordContextKey=N}),define(Q[65],J([0,1,9,16]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CONTEXT_ACCESSIBILITY_MODE_ENABLED=e.IAccessibilityService=void 0,e.IAccessibilityService=b.createDecorator("accessibilityService"),e.CONTEXT_ACCESSIBILITY_MODE_ENABLED=new N.RawContextKey("accessibilityModeEnabled",!1)}),define(Q[250],J([0,1,521,16,17]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InputFocusedContextKey=e.IsWindowsContext=void 0,e.IsWindowsContext=new N.RawContextKey("isWindows",M.isWindows,b.localize(0,null)),e.InputFocusedContextKey="inputFocus"}),define(Q[68],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IContextMenuService=e.IContextViewService=void 0,e.IContextViewService=b.createDecorator("contextViewService"),e.IContextMenuService=b.createDecorator("contextMenuService")}),define(Q[184],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IDialogService=void 0,e.IDialogService=b.createDecorator("dialogService")}),define(Q[138],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ServiceCollection=void 0;class b{constructor(...M){this._entries=new Map;for(let[w,S]of M)this.set(w,S)}set(M,w){const S=this._entries.get(M);return this._entries.set(M,w),S}has(M){return this._entries.has(M)}get(M){return this._entries.get(M)}}e.ServiceCollection=b}),define(Q[550],J([0,1,12,533,238,9,138,15]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InstantiationService=void 0;const d=!1;class g extends Error{constructor(s){super("cyclic dependency between services");this.message=s.toString()}}class p{constructor(s=new S.ServiceCollection,a=!1,u){this._activeInstantiations=new Set,this._services=s,this._strict=a,this._parent=u,this._services.set(w.IInstantiationService,this)}createChild(s){return new p(s,this._strict,this)}invokeFunction(s,...a){let u=c.traceInvocation(s),r=!1;try{return s({get:(n,t)=>{if(r)throw b.illegalState("service accessor is only valid during the invocation of its target method");const l=this._getOrCreateServiceInstance(n,u);if(!l&&t!==w.optional)throw new Error(`[invokeFunction] unknown service '${n}'`);return l}},...a)}finally{r=!0,u.stop()}}createInstance(s,...a){let u,r;return s instanceof M.SyncDescriptor?(u=c.traceCreation(s.ctor),r=this._createInstance(s.ctor,s.staticArguments.concat(a),u)):(u=c.traceCreation(s),r=this._createInstance(s,a,u)),u.stop(),r}_createInstance(s,a=[],u){let r=w._util.getServiceDependencies(s).sort((t,l)=>t.index-l.index),i=[];for(const t of r){let l=this._getOrCreateServiceInstance(t.id,u);if(!l&&this._strict&&!t.optional)throw new Error(`[createInstance] ${s.name} depends on UNKNOWN service ${t.id}.`);i.push(l)}let n=r.length>0?r[0].index:a.length;if(a.length!==n){console.warn(`[createInstance] First service dependency of ${s.name} at position ${n+1} conflicts with ${a.length} static arguments`);let t=n-a.length;t>0?a=a.concat(new Array(t)):a=a.slice(0,n)}return new s(...[...a,...i])}_setServiceInstance(s,a){if(this._services.get(s)instanceof M.SyncDescriptor)this._services.set(s,a);else if(this._parent)this._parent._setServiceInstance(s,a);else throw new Error("illegalState - setting UNKNOWN service instance")}_getServiceInstanceOrDescriptor(s){let a=this._services.get(s);return!a&&this._parent?this._parent._getServiceInstanceOrDescriptor(s):a}_getOrCreateServiceInstance(s,a){let u=this._getServiceInstanceOrDescriptor(s);return u instanceof M.SyncDescriptor?this._safeCreateAndCacheServiceInstance(s,u,a.branch(s,!0)):(a.branch(s,!1),u)}_safeCreateAndCacheServiceInstance(s,a,u){if(this._activeInstantiations.has(s))throw new Error(`illegal state - RECURSIVELY instantiating service '${s}'`);this._activeInstantiations.add(s);try{return this._createAndCacheServiceInstance(s,a,u)}finally{this._activeInstantiations.delete(s)}}_createAndCacheServiceInstance(s,a,u){const r=new N.Graph(t=>t.id.toString());let i=0;const n=[{id:s,desc:a,_trace:u}];for(;n.length;){const t=n.pop();if(r.lookupOrInsertNode(t),i++>1e3)throw new g(r);for(let l of w._util.getServiceDependencies(t.desc.ctor)){let h=this._getServiceInstanceOrDescriptor(l.id);if(!h&&!l.optional&&console.warn(`[createInstance] ${s} depends on ${l.id} which is NOT registered.`),h instanceof M.SyncDescriptor){const m={id:l.id,desc:h,_trace:t._trace.branch(l.id,!0)};r.insertEdge(t,m),n.push(m)}}}for(;;){const t=r.roots();if(t.length===0){if(!r.isEmpty())throw new g(r);break}for(const{data:l}of t){if(this._getServiceInstanceOrDescriptor(l.id)instanceof M.SyncDescriptor){const m=this._createServiceInstanceWithOwner(l.id,l.desc.ctor,l.desc.staticArguments,l.desc.supportsDelayedInstantiation,l._trace);this._setServiceInstance(l.id,m)}r.removeNode(l)}}return this._getServiceInstanceOrDescriptor(s)}_createServiceInstanceWithOwner(s,a,u=[],r,i){if(this._services.get(s)instanceof M.SyncDescriptor)return this._createServiceInstance(a,u,r,i);if(this._parent)return this._parent._createServiceInstanceWithOwner(s,a,u,r,i);throw new Error(`illegalState - creating UNKNOWN service instance ${a.name}`)}_createServiceInstance(s,a=[],u,r){if(u){const i=new C.IdleValue(()=>this._createInstance(s,a,r));return new Proxy(Object.create(null),{get(n,t){if(t in n)return n[t];let l=i.value,h=l[t];return typeof h!="function"||(h=h.bind(l),n[t]=h),h},set(n,t,l){return i.value[t]=l,!0}})}else return this._createInstance(s,a,r)}}e.InstantiationService=p;class c{constructor(s,a){this.type=s,this.name=a,this._start=Date.now(),this._dep=[]}static traceInvocation(s){return d?new c(1,s.name||s.toString().substring(0,42).replace(/\n/g,"")):c._None}static traceCreation(s){return d?new c(0,s.name):c._None}branch(s,a){let u=new c(2,s.toString());return this._dep.push([s,a,u]),u}stop(){let s=Date.now()-this._start;c._totals+=s;let a=!1;function u(i,n){let t=[],l=new Array(i+1).join(" ");for(const[h,m,_]of n._dep)if(m&&_){a=!0,t.push(`${l}CREATES -> ${h}`);let f=u(i+1,_);f&&t.push(f)}else t.push(`${l}uses -> ${h}`);return t.join(` +`)}let r=[`${this.type===0?"CREATE":"CALL"} ${this.name}`,`${u(1,this)}`,`DONE, took ${s.toFixed(2)}ms (grand total ${c._totals.toFixed(2)}ms)`];(s>2||a)&&console.log(r.join(` +`))}}c._None=new class extends c{constructor(){super(-1,null)}stop(){}branch(){return this}},c._totals=0}),define(Q[551],J([0,1,522,15,6,2]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractKeybindingService=void 0;class S extends w.Disposable{constructor(d,g,p,c,o){super();this._contextKeyService=d,this._commandService=g,this._telemetryService=p,this._notificationService=c,this._logService=o,this._onDidUpdateKeybindings=this._register(new M.Emitter),this._currentChord=null,this._currentChordChecker=new N.IntervalTimer,this._currentChordStatusMessage=null,this._currentSingleModifier=null,this._currentSingleModifierClearTimeout=new N.TimeoutTimer,this._logging=!1}get onDidUpdateKeybindings(){return this._onDidUpdateKeybindings?this._onDidUpdateKeybindings.event:M.Event.None}dispose(){super.dispose()}_log(d){this._logging&&this._logService.info(`[KeybindingService]: ${d}`)}getKeybindings(){return this._getResolver().getKeybindings()}lookupKeybinding(d){const g=this._getResolver().lookupPrimaryKeybinding(d);if(!!g)return g.resolvedKeybinding}dispatchEvent(d,g){return this._dispatch(d,g)}softDispatch(d,g){const p=this.resolveKeyboardEvent(d);if(p.isChord())return console.warn("Unexpected keyboard event mapped to a chord"),null;const[c]=p.getDispatchParts();if(c===null)return null;const o=this._contextKeyService.getContext(g),s=this._currentChord?this._currentChord.keypress:null;return this._getResolver().resolve(o,s,c)}_enterChordMode(d,g){this._currentChord={keypress:d,label:g},this._currentChordStatusMessage=this._notificationService.status(b.localize(0,null,g));const p=Date.now();this._currentChordChecker.cancelAndSet(()=>{if(!this._documentHasFocus()){this._leaveChordMode();return}Date.now()-p>5e3&&this._leaveChordMode()},500)}_leaveChordMode(){this._currentChordStatusMessage&&(this._currentChordStatusMessage.dispose(),this._currentChordStatusMessage=null),this._currentChordChecker.cancel(),this._currentChord=null}_dispatch(d,g){return this._doDispatch(this.resolveKeyboardEvent(d),g,!1)}_singleModifierDispatch(d,g){const p=this.resolveKeyboardEvent(d),[c]=p.getSingleModifierDispatchParts();return c!==null&&this._currentSingleModifier===null?(this._log(`+ Storing single modifier for possible chord ${c}.`),this._currentSingleModifier=c,this._currentSingleModifierClearTimeout.cancelAndSet(()=>{this._log("+ Clearing single modifier due to 300ms elapsed."),this._currentSingleModifier=null},300),!1):c!==null&&c===this._currentSingleModifier?(this._log(`/ Dispatching single modifier chord ${c} ${c}`),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,this._doDispatch(p,g,!0)):(this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1)}_doDispatch(d,g,p=!1){let c=!1;if(d.isChord())return console.warn("Unexpected keyboard event mapped to a chord"),!1;let o=null,s=null;if(p){const[i]=d.getSingleModifierDispatchParts();o=i,s=i}else[o]=d.getDispatchParts(),s=this._currentChord?this._currentChord.keypress:null;if(o===null)return this._log("\\ Keyboard event cannot be dispatched in keydown phase."),c;const a=this._contextKeyService.getContext(g),u=d.getLabel(),r=this._getResolver().resolve(a,s,o);return this._logService.trace("KeybindingService#dispatch",u,r==null?void 0:r.commandId),r&&r.enterChord?(c=!0,this._enterChordMode(o,u),c):(this._currentChord&&(!r||!r.commandId)&&(this._notificationService.status(b.localize(1,null,this._currentChord.label,u),{hideAfter:10*1e3}),c=!0),this._leaveChordMode(),r&&r.commandId&&(r.bubble||(c=!0),typeof r.commandArgs=="undefined"?this._commandService.executeCommand(r.commandId).then(void 0,i=>this._notificationService.warn(i)):this._commandService.executeCommand(r.commandId,r.commandArgs).then(void 0,i=>this._notificationService.warn(i)),this._telemetryService.publicLog2("workbenchActionExecuted",{id:r.commandId,from:"keybinding"})),c)}mightProducePrintableCharacter(d){return d.ctrlKey||d.metaKey?!1:d.keyCode>=31&&d.keyCode<=56||d.keyCode>=21&&d.keyCode<=30}}e.AbstractKeybindingService=S}),define(Q[552],J([0,1,12,235,39]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BaseResolvedKeybinding=void 0;class w extends M.ResolvedKeybinding{constructor(C,d){super();if(d.length===0)throw b.illegalArgument("parts");this._os=C,this._parts=d}getLabel(){return N.UILabelProvider.toLabel(this._os,this._parts,C=>this._getLabel(C))}getAriaLabel(){return N.AriaLabelProvider.toLabel(this._os,this._parts,C=>this._getAriaLabel(C))}isChord(){return this._parts.length>1}getParts(){return this._parts.map(C=>this._getPart(C))}_getPart(C){return new M.ResolvedKeybindingPart(C.ctrlKey,C.shiftKey,C.altKey,C.metaKey,this._getLabel(C),this._getAriaLabel(C))}getDispatchParts(){return this._parts.map(C=>this._getDispatchPart(C))}getSingleModifierDispatchParts(){return this._parts.map(C=>this._getSingleModifierDispatchPart(C))}}e.BaseResolvedKeybinding=w}),define(Q[37],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IKeybindingService=void 0,e.IKeybindingService=b.createDecorator("keybindingService")}),define(Q[251],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KeybindingResolver=void 0;class b{constructor(S,C,d){this._log=d,this._defaultKeybindings=S,this._defaultBoundCommands=new Map;for(let g=0,p=S.length;g=0;a--)this._isTargetedForRemoval(S[a],c,o,p,s)&&S.splice(a,1)}return S.concat(d)}_addKeyPress(S,C){const d=this._map.get(S);if(typeof d=="undefined"){this._map.set(S,[C]),this._addToLookupMap(C);return}for(let g=d.length-1;g>=0;g--){let p=d[g];if(p.command!==C.command){const c=p.keypressParts.length>1,o=C.keypressParts.length>1;c&&o&&p.keypressParts[1]!==C.keypressParts[1]||b.whenIsEntirelyIncluded(p.when,C.when)&&this._removeFromLookupMap(p)}}d.push(C),this._addToLookupMap(C)}_addToLookupMap(S){if(!!S.command){let C=this._lookupMap.get(S.command);typeof C=="undefined"?(C=[S],this._lookupMap.set(S.command,C)):C.push(S)}}_removeFromLookupMap(S){if(!!S.command){let C=this._lookupMap.get(S.command);if(typeof C!="undefined"){for(let d=0,g=C.length;dc.type===9?c.expr:[c];let p=g(d).concat(g(C));for(let c=0;c1&&p.keypressParts[1]!==null?(this._log(`\\ From ${g.length} keybinding entries, matched chord, when: ${N(p.when)}, source: ${M(p)}.`),{enterChord:!0,leaveChord:!1,commandId:null,commandArgs:null,bubble:!1}):(this._log(`\\ From ${g.length} keybinding entries, matched ${p.command}, when: ${N(p.when)}, source: ${M(p)}.`),{enterChord:!1,leaveChord:p.keypressParts.length>1,commandId:p.command,commandArgs:p.commandArgs,bubble:p.bubble}):(this._log(`\\ From ${g.length} keybinding entries, no when clauses matched the context.`),null)}_findCommand(S,C){for(let d=C.length-1;d>=0;d--){let g=C[d];if(!!b.contextMatchesRules(S,g.when))return g}return null}static contextMatchesRules(S,C){return C?C.evaluate(S):!0}}e.KeybindingResolver=b;function N(w){return w?`${w.serialize()}`:"no when condition"}function M(w){return w.extensionId?w.isBuiltinExtension?`built-in extension ${w.extensionId}`:`user extension ${w.extensionId}`:w.isDefault?"built-in":"user"}}),define(Q[553],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.removeElementsAfterNulls=e.ResolvedKeybindingItem=void 0;class b{constructor(w,S,C,d,g,p,c){this.resolvedKeybinding=w,this.keypressParts=w?N(w.getDispatchParts()):[],w&&this.keypressParts.length===0&&(this.keypressParts=N(w.getSingleModifierDispatchParts())),this.bubble=S?S.charCodeAt(0)===94:!1,this.command=this.bubble?S.substr(1):S,this.commandArgs=C,this.when=d,this.isDefault=g,this.extensionId=p,this.isBuiltinExtension=c}}e.ResolvedKeybindingItem=b;function N(M){let w=[];for(let S=0,C=M.length;Sthis.layout()))}setContainer(C,d){this.contextView.setContainer(C,d||1)}showContextView(C,d,g){d?d!==this.container&&(this.container=d,this.setContainer(d,g?3:2)):this.container!==this.layoutService.container&&(this.container=this.layoutService.container,this.setContainer(this.container,1)),this.contextView.show(C);const p=N.toDisposable(()=>{this.currentViewDisposable===p&&this.hideContextView()});return this.currentViewDisposable=p,p}getContextViewElement(){return this.contextView.getViewElement()}layout(){this.contextView.layout()}hideContextView(C){this.contextView.hide(C)}};w=Me([_e(0,M.ILayoutService)],w),e.ContextViewService=w}),define(Q[77],J([0,1,9,2,6]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LogService=e.ConsoleLogger=e.AbstractLogger=e.DEFAULT_LOG_LEVEL=e.LogLevel=e.ILogService=void 0,e.ILogService=b.createDecorator("logService");var w;(function(g){g[g.Trace=0]="Trace",g[g.Debug=1]="Debug",g[g.Info=2]="Info",g[g.Warning=3]="Warning",g[g.Error=4]="Error",g[g.Critical=5]="Critical",g[g.Off=6]="Off"})(w=e.LogLevel||(e.LogLevel={})),e.DEFAULT_LOG_LEVEL=w.Info;class S extends N.Disposable{constructor(){super(...arguments);this.level=e.DEFAULT_LOG_LEVEL,this._onDidChangeLogLevel=this._register(new M.Emitter)}setLevel(p){this.level!==p&&(this.level=p,this._onDidChangeLogLevel.fire(this.level))}getLevel(){return this.level}}e.AbstractLogger=S;class C extends S{constructor(p=e.DEFAULT_LOG_LEVEL){super();this.setLevel(p)}trace(p,...c){this.getLevel()<=w.Trace&&console.log("%cTRACE","color: #888",p,...c)}debug(p,...c){this.getLevel()<=w.Debug&&console.log("%cDEBUG","background: #eee; color: #888",p,...c)}info(p,...c){this.getLevel()<=w.Info&&console.log("%c INFO","color: #33f",p,...c)}error(p,...c){this.getLevel()<=w.Error&&console.log("%c ERR","color: #f33",p,...c)}dispose(){}}e.ConsoleLogger=C;class d extends N.Disposable{constructor(p){super();this.logger=p,this._register(p)}getLevel(){return this.logger.getLevel()}trace(p,...c){this.logger.trace(p,...c)}debug(p,...c){this.logger.debug(p,...c)}info(p,...c){this.logger.info(p,...c)}error(p,...c){this.logger.error(p,...c)}}e.LogService=d}),define(Q[252],J([0,1,15,2,201,294,3,18,41,389,36,137,8,19,77,81,12]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorWorkerClient=e.EditorWorkerHost=e.EditorWorkerServiceImpl=void 0;const i=60*1e3,n=5*60*1e3;function t(L,I){let k=L.getModel(I);return!(!k||k.isTooLargeForSyncing())}let l=class extends N.Disposable{constructor(I,k,E){super();this._modelService=I,this._workerManager=this._register(new m(this._modelService)),this._logService=E,this._register(C.LinkProviderRegistry.register("*",{provideLinks:(T,O)=>t(this._modelService,T.uri)?this._workerManager.withWorker().then(A=>A.computeLinks(T.uri)).then(A=>A&&{links:A}):Promise.resolve({links:[]})})),this._register(C.CompletionProviderRegistry.register("*",new h(this._workerManager,k,this._modelService)))}dispose(){super.dispose()}canComputeDiff(I,k){return t(this._modelService,I)&&t(this._modelService,k)}computeDiff(I,k,E,T){return this._workerManager.withWorker().then(O=>O.computeDiff(I,k,E,T))}computeMoreMinimalEdits(I,k){if(s.isNonEmptyArray(k)){if(!t(this._modelService,I))return Promise.resolve(k);const E=u.StopWatch.create(!0),T=this._workerManager.withWorker().then(O=>O.computeMoreMinimalEdits(I,k));return T.finally(()=>this._logService.trace("FORMAT#computeMoreMinimalEdits",I.toString(!0),E.elapsed())),Promise.race([T,b.timeout(1e3).then(()=>k)])}else return Promise.resolve(void 0)}canNavigateValueSet(I){return t(this._modelService,I)}navigateValueSet(I,k,E){return this._workerManager.withWorker().then(T=>T.navigateValueSet(I,k,E))}canComputeWordRanges(I){return t(this._modelService,I)}computeWordRanges(I,k){return this._workerManager.withWorker().then(E=>E.computeWordRanges(I,k))}};l=Me([_e(0,p.IModelService),_e(1,c.ITextResourceConfigurationService),_e(2,a.ILogService)],l),e.EditorWorkerServiceImpl=l;class h{constructor(I,k,E){this._debugDisplayName="wordbasedCompletions",this._workerManager=I,this._configurationService=k,this._modelService=E}provideCompletionItems(I,k){return Ie(this,void 0,void 0,function*(){const E=this._configurationService.getValue(I.uri,k,"editor");if(!!E.wordBasedSuggestions){const T=[];if(E.wordBasedSuggestionsMode==="currentDocument")t(this._modelService,I.uri)&&T.push(I.uri);else for(const W of this._modelService.getModels())!t(this._modelService,W.uri)||(W===I?T.unshift(W.uri):(E.wordBasedSuggestionsMode==="allDocuments"||W.getLanguageIdentifier().id===I.getLanguageIdentifier().id)&&T.push(W.uri));if(T.length!==0){const O=d.LanguageConfigurationRegistry.getWordDefinition(I.getLanguageIdentifier().id),A=I.getWordAtPosition(k),B=A?new S.Range(k.lineNumber,A.startColumn,k.lineNumber,A.endColumn):S.Range.fromPositions(k),F=B.setEndPosition(k.lineNumber,k.column),R=yield(yield this._workerManager.withWorker()).textualSuggest(T,A==null?void 0:A.word,O);if(!!R)return{duration:R.duration,suggestions:R.words.map(W=>({kind:18,label:W,insertText:W,range:{insert:F,replace:B}}))}}}})}}class m extends N.Disposable{constructor(I){super();this._modelService=I,this._editorWorkerClient=null,this._lastWorkerUsedTime=new Date().getTime(),this._register(new b.IntervalTimer).cancelAndSet(()=>this._checkStopIdleWorker(),Math.round(n/2)),this._register(this._modelService.onModelRemoved(E=>this._checkStopEmptyWorker()))}dispose(){this._editorWorkerClient&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null),super.dispose()}_checkStopEmptyWorker(){!this._editorWorkerClient||this._modelService.getModels().length===0&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}_checkStopIdleWorker(){!this._editorWorkerClient||new Date().getTime()-this._lastWorkerUsedTime>n&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}withWorker(){return this._lastWorkerUsedTime=new Date().getTime(),this._editorWorkerClient||(this._editorWorkerClient=new y(this._modelService,!1,"editorWorkerService")),Promise.resolve(this._editorWorkerClient)}}class _ extends N.Disposable{constructor(I,k,E){super();if(this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),this._proxy=I,this._modelService=k,!E){let T=new b.IntervalTimer;T.cancelAndSet(()=>this._checkStopModelSync(),Math.round(i/2)),this._register(T)}}dispose(){for(let I in this._syncedModels)N.dispose(this._syncedModels[I]);this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),super.dispose()}ensureSyncedResources(I){for(const k of I){let E=k.toString();this._syncedModels[E]||this._beginModelSync(k),this._syncedModels[E]&&(this._syncedModelsLastUsedTime[E]=new Date().getTime())}}_checkStopModelSync(){let I=new Date().getTime(),k=[];for(let E in this._syncedModelsLastUsedTime)I-this._syncedModelsLastUsedTime[E]>i&&k.push(E);for(const E of k)this._stopModelSync(E)}_beginModelSync(I){let k=this._modelService.getModel(I);if(!!k&&!k.isTooLargeForSyncing()){let E=I.toString();this._proxy.acceptNewModel({url:k.uri.toString(),lines:k.getLinesContent(),EOL:k.getEOL(),versionId:k.getVersionId()});const T=new N.DisposableStore;T.add(k.onDidChangeContent(O=>{this._proxy.acceptModelChanged(E.toString(),O)})),T.add(k.onWillDispose(()=>{this._stopModelSync(E)})),T.add(N.toDisposable(()=>{this._proxy.acceptRemovedModel(E)})),this._syncedModels[E]=T}}_stopModelSync(I){let k=this._syncedModels[I];delete this._syncedModels[I],delete this._syncedModelsLastUsedTime[I],N.dispose(k)}}class f{constructor(I){this._instance=I,this._proxyObj=Promise.resolve(this._instance)}dispose(){this._instance.dispose()}getProxyObject(){return this._proxyObj}}class v{constructor(I){this._workerClient=I}fhr(I,k){return this._workerClient.fhr(I,k)}}e.EditorWorkerHost=v;class y extends N.Disposable{constructor(I,k,E){super();this._disposed=!1,this._modelService=I,this._keepIdleModels=k,this._workerFactory=new w.DefaultWorkerFactory(E),this._worker=null,this._modelManager=null}fhr(I,k){throw new Error("Not implemented!")}_getOrCreateWorker(){if(!this._worker)try{this._worker=this._register(new M.SimpleWorkerClient(this._workerFactory,"vs/editor/common/services/editorSimpleWorker",new v(this)))}catch(I){M.logOnceWebWorkerWarning(I),this._worker=new f(new g.EditorSimpleWorker(new v(this),null))}return this._worker}_getProxy(){return this._getOrCreateWorker().getProxyObject().then(void 0,I=>(M.logOnceWebWorkerWarning(I),this._worker=new f(new g.EditorSimpleWorker(new v(this),null)),this._getOrCreateWorker().getProxyObject()))}_getOrCreateModelManager(I){return this._modelManager||(this._modelManager=this._register(new _(I,this._modelService,this._keepIdleModels))),this._modelManager}_withSyncedResources(I){return this._disposed?Promise.reject(r.canceled()):this._getProxy().then(k=>(this._getOrCreateModelManager(k).ensureSyncedResources(I),k))}computeDiff(I,k,E,T){return this._withSyncedResources([I,k]).then(O=>O.computeDiff(I.toString(),k.toString(),E,T))}computeMoreMinimalEdits(I,k){return this._withSyncedResources([I]).then(E=>E.computeMoreMinimalEdits(I.toString(),k))}computeLinks(I){return this._withSyncedResources([I]).then(k=>k.computeLinks(I.toString()))}textualSuggest(I,k,E){return Ie(this,void 0,void 0,function*(){const T=yield this._withSyncedResources(I),O=E.source,A=o.regExpFlags(E);return T.textualSuggest(I.map(B=>B.toString()),k,O,A)})}computeWordRanges(I,k){return this._withSyncedResources([I]).then(E=>{let T=this._modelService.getModel(I);if(!T)return Promise.resolve(null);let O=d.LanguageConfigurationRegistry.getWordDefinition(T.getLanguageIdentifier().id),A=O.source,B=o.regExpFlags(O);return E.computeWordRanges(I.toString(),k,A,B)})}navigateValueSet(I,k,E){return this._withSyncedResources([I]).then(T=>{let O=this._modelService.getModel(I);if(!O)return null;let A=d.LanguageConfigurationRegistry.getWordDefinition(O.getLanguageIdentifier().id),B=A.source,F=o.regExpFlags(A);return T.navigateValueSet(I.toString(),k,E,B,F)})}dispose(){super.dispose(),this._disposed=!0}}e.EditorWorkerClient=y}),define(Q[253],J([0,1,18,77,135]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toMultilineTokens2=e.SemanticTokensProviderStyling=void 0;class w{constructor(p,c,o){this._legend=p,this._themeService=c,this._logService=o,this._hashTable=new d,this._hasWarnedOverlappingTokens=!1}getMetadata(p,c,o){const s=this._hashTable.get(p,c,o.id);let a;if(s)a=s.metadata,this._logService.getLevel()===N.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling [CACHED] ${p} / ${c}: foreground ${b.TokenMetadata.getForeground(a)}, fontStyle ${b.TokenMetadata.getFontStyle(a).toString(2)}`);else{let u=this._legend.tokenTypes[p];const r=[];if(u){let i=c;for(let t=0;i>0&&t>1;i>0&&this._logService.getLevel()===N.LogLevel.Trace&&(this._logService.trace(`SemanticTokensProviderStyling: unknown token modifier index: ${c.toString(2)} for legend: ${JSON.stringify(this._legend.tokenModifiers)}`),r.push("not-in-legend"));const n=this._themeService.getColorTheme().getTokenStyleMetadata(u,r,o.language);typeof n=="undefined"?a=2147483647:(a=0,typeof n.italic!="undefined"&&(a|=(n.italic?1:0)<<11|1),typeof n.bold!="undefined"&&(a|=(n.bold?2:0)<<11|2),typeof n.underline!="undefined"&&(a|=(n.underline?4:0)<<11|4),n.foreground&&(a|=n.foreground<<14|8),a===0&&(a=2147483647))}else this._logService.getLevel()===N.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling: unknown token type index: ${p} for legend: ${JSON.stringify(this._legend.tokenTypes)}`),a=2147483647,u="not-in-legend";this._hashTable.add(p,c,o.id,a),this._logService.getLevel()===N.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling ${p} (${u}) / ${c} (${r.join(" ")}): foreground ${b.TokenMetadata.getForeground(a)}, fontStyle ${b.TokenMetadata.getFontStyle(a).toString(2)}`)}return a}warnOverlappingSemanticTokens(p,c){this._hasWarnedOverlappingTokens||(this._hasWarnedOverlappingTokens=!0,console.warn(`Overlapping semantic tokens detected at lineNumber ${p}, column ${c}`))}}e.SemanticTokensProviderStyling=w;function S(g,p,c){const o=g.data,s=g.data.length/5|0,a=Math.max(Math.ceil(s/1024),400),u=[];let r=0,i=1,n=0;for(;rt&&o[5*I]===0;)I--;if(I-1===t){let k=l;for(;k+1O&&(p.warnOverlappingSemanticTokens(T,O+1),v=this._growCount){const a=this._elements;this._currentLengthIndex++,this._currentLength=d._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1{const d=this._foreignModuleHost?N.getAllMethodNames(this._foreignModuleHost):[];return C.loadForeignModule(this._foreignModuleId,this._foreignModuleCreateData,d).then(g=>{this._foreignModuleCreateData=null;const p=(s,a)=>C.fmr(s,a),c=(s,a)=>function(){const u=Array.prototype.slice.call(arguments,0);return a(s,u)};let o={};for(const s of g)o[s]=c(s,p);return o})})),this._foreignProxy}getProxy(){return this._getForeignProxy()}withSyncedResources(C){return this._withSyncedResources(C).then(d=>this.getProxy())}}}),define(Q[85],J([0,1,9,524,82]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerService=e.IMarkerData=e.MarkerSeverity=void 0;var w;(function(C){C[C.Hint=1]="Hint",C[C.Info=2]="Info",C[C.Warning=4]="Warning",C[C.Error=8]="Error"})(w=e.MarkerSeverity||(e.MarkerSeverity={})),function(C){function d(s,a){return a-s}C.compare=d;const g=Object.create(null);g[C.Error]=N.localize(0,null),g[C.Warning]=N.localize(1,null),g[C.Info]=N.localize(2,null);function p(s){return g[s]||""}C.toString=p;function c(s){switch(s){case M.default.Error:return C.Error;case M.default.Warning:return C.Warning;case M.default.Info:return C.Info;case M.default.Ignore:return C.Hint}}C.fromSeverity=c;function o(s){switch(s){case C.Error:return M.default.Error;case C.Warning:return M.default.Warning;case C.Info:return M.default.Info;case C.Hint:return M.default.Ignore}}C.toSeverity=o}(w=e.MarkerSeverity||(e.MarkerSeverity={}));var S;(function(C){const d="";function g(c){return p(c,!0)}C.makeKey=g;function p(c,o){let s=[d];return c.source?s.push(c.source.replace("\xA6","\\\xA6")):s.push(d),c.code?typeof c.code=="string"?s.push(c.code.replace("\xA6","\\\xA6")):s.push(c.code.value.replace("\xA6","\\\xA6")):s.push(d),c.severity!==void 0&&c.severity!==null?s.push(w.toString(c.severity)):s.push(d),c.message&&o?s.push(c.message.replace("\xA6","\\\xA6")):s.push(d),c.startLineNumber!==void 0&&c.startLineNumber!==null?s.push(c.startLineNumber.toString()):s.push(d),c.startColumn!==void 0&&c.startColumn!==null?s.push(c.startColumn.toString()):s.push(d),c.endLineNumber!==void 0&&c.endLineNumber!==null?s.push(c.endLineNumber.toString()):s.push(d),c.endColumn!==void 0&&c.endColumn!==null?s.push(c.endColumn.toString()):s.push(d),s.push(d),s.join("\xA6")}C.makeKeyOptionalMessage=p})(S=e.IMarkerData||(e.IMarkerData={})),e.IMarkerService=b.createDecorator("markerService")}),define(Q[557],J([0,1,85,24,6,2,3,8,19,9,74,71]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerNavigationService=e.MarkerList=e.MarkerCoordinate=void 0;class o{constructor(r,i,n){this.marker=r,this.index=i,this.total=n}}e.MarkerCoordinate=o;let s=class Tt{constructor(r,i){this._markerService=i,this._onDidChange=new M.Emitter,this.onDidChange=this._onDidChange.event,this._dispoables=new w.DisposableStore,this._markers=[],this._nextIdx=-1,N.URI.isUri(r)?this._resourceFilter=t=>t.toString()===r.toString():r&&(this._resourceFilter=r);const n=()=>{this._markers=this._markerService.read({resource:N.URI.isUri(r)?r:void 0,severities:b.MarkerSeverity.Error|b.MarkerSeverity.Warning|b.MarkerSeverity.Info}),typeof r=="function"&&(this._markers=this._markers.filter(t=>this._resourceFilter(t.resource))),this._markers.sort(Tt._compareMarker)};n(),this._dispoables.add(i.onMarkerChanged(t=>{(!this._resourceFilter||t.some(l=>this._resourceFilter(l)))&&(n(),this._nextIdx=-1,this._onDidChange.fire())}))}dispose(){this._dispoables.dispose(),this._onDidChange.dispose()}matches(r){return!this._resourceFilter&&!r?!0:!this._resourceFilter||!r?!1:this._resourceFilter(r)}get selected(){const r=this._markers[this._nextIdx];return r&&new o(r,this._nextIdx+1,this._markers.length)}_initIdx(r,i,n){let t=!1,l=this._markers.findIndex(h=>h.resource.toString()===r.uri.toString());l<0&&(l=d.binarySearch(this._markers,{resource:r.uri},(h,m)=>C.compare(h.resource.toString(),m.resource.toString())),l<0&&(l=~l));for(let h=l;ht.resource.toString()===r.toString());if(!(n<0)){for(;nn[1])}}class p{constructor(s){this.errors=0,this.infos=0,this.warnings=0,this.unknowns=0,this._data=new C.ResourceMap,this._service=s,this._subscription=s.onMarkerChanged(this._update,this)}dispose(){this._subscription.dispose()}_update(s){for(const a of s){const u=this._data.get(a);u&&this._substract(u);const r=this._resourceStats(a);this._add(r),this._data.set(a,r)}}_resourceStats(s){const a={errors:0,warnings:0,infos:0,unknowns:0};if(s.scheme===N.Schemas.inMemory||s.scheme===N.Schemas.walkThrough||s.scheme===N.Schemas.walkThroughSnippet)return a;for(const{severity:u}of this._service.read({resource:s}))u===S.MarkerSeverity.Error?a.errors+=1:u===S.MarkerSeverity.Warning?a.warnings+=1:u===S.MarkerSeverity.Info?a.infos+=1:a.unknowns+=1;return a}_substract(s){this.errors-=s.errors,this.warnings-=s.warnings,this.infos-=s.infos,this.unknowns-=s.unknowns}_add(s){this.errors+=s.errors,this.warnings+=s.warnings,this.infos+=s.infos,this.unknowns+=s.unknowns}}class c{constructor(){this._onMarkerChanged=new w.Emitter,this.onMarkerChanged=w.Event.debounce(this._onMarkerChanged.event,c._debouncer,0),this._data=new g,this._stats=new p(this)}dispose(){this._stats.dispose(),this._onMarkerChanged.dispose()}remove(s,a){for(const u of a||[])this.changeOne(s,u,[])}changeOne(s,a,u){if(b.isFalsyOrEmpty(u))this._data.delete(a,s)&&this._onMarkerChanged.fire([a]);else{const r=[];for(const i of u){const n=c._toMarker(s,a,i);n&&r.push(n)}this._data.set(a,s,r),this._onMarkerChanged.fire([a])}}static _toMarker(s,a,u){let{code:r,severity:i,message:n,source:t,startLineNumber:l,startColumn:h,endLineNumber:m,endColumn:_,relatedInformation:f,tags:v}=u;if(!!n)return l=l>0?l:1,h=h>0?h:1,m=m>=l?m:l,_=_>0?_:h,{resource:a,owner:s,code:r,severity:i,message:n,source:t,startLineNumber:l,startColumn:h,endLineNumber:m,endColumn:_,relatedInformation:f,tags:v}}read(s=Object.create(null)){let{owner:a,resource:u,severities:r,take:i}=s;if((!i||i<0)&&(i=-1),a&&u){const n=this._data.get(u,a);if(n){const t=[];for(const l of n)if(c._accept(l,r)){const h=t.push(l);if(i>0&&h===i)break}return t}else return[]}else if(!a&&!u){const n=[];for(let t of this._data.values())for(let l of t)if(c._accept(l,r)){const h=n.push(l);if(i>0&&h===i)return n}return n}else{const n=this._data.values(u!=null?u:a),t=[];for(const l of n)for(const h of l)if(c._accept(h,r)){const m=t.push(h);if(i>0&&m===i)return t}return t}}static _accept(s,a){return a===void 0||(a&s.severity)===s.severity}static _debouncer(s,a){s||(c._dedupeMap=new C.ResourceMap,s=[]);for(const u of a)c._dedupeMap.has(u)||(c._dedupeMap.set(u,!0),s.push(u));return s}}e.MarkerService=c}),define(Q[32],J([0,1,82,9]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NoOpNotification=e.INotificationService=e.Severity=void 0,e.Severity=b.default,e.INotificationService=N.createDecorator("notificationService");class M{}e.NoOpNotification=M}),define(Q[58],J([0,1,2,8,24,9]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.matchesScheme=e.NullOpenerService=e.IOpenerService=void 0,e.IOpenerService=w.createDecorator("openerService"),e.NullOpenerService=Object.freeze({_serviceBrand:void 0,registerOpener(){return b.Disposable.None},registerValidator(){return b.Disposable.None},registerExternalUriResolver(){return b.Disposable.None},setDefaultExternalOpener(){},registerExternalOpener(){return b.Disposable.None},open(){return Ie(this,void 0,void 0,function*(){return!1})},resolveExternalUri(C){return Ie(this,void 0,void 0,function*(){return{resolved:C,dispose(){}}})}});function S(C,d){return M.URI.isUri(C)?N.equalsIgnoreCase(C.scheme,d):N.startsWithIgnoreCase(C,d+":")}e.matchesScheme=S}),define(Q[140],J([0,1,290,58,57,12,243,6,2,18]),function(q,e,b,N,M,w,S,C,d,g){"use strict";var p;Object.defineProperty(e,"__esModule",{value:!0}),e.MarkdownRenderer=void 0;let c=class Rt{constructor(s,a,u){this._options=s,this._modeService=a,this._openerService=u,this._onDidRenderAsync=new C.Emitter,this.onDidRenderAsync=this._onDidRenderAsync.event}dispose(){this._onDidRenderAsync.dispose()}render(s,a,u){const r=new d.DisposableStore;let i;return s?i=b.renderMarkdown(s,Object.assign(Object.assign({},this._getRenderOptions(r)),a),u):i=document.createElement("span"),{element:i,dispose:()=>r.dispose()}}_getRenderOptions(s){return{baseUrl:this._options.baseUrl,codeBlockRenderer:(a,u)=>Ie(this,void 0,void 0,function*(){var r,i,n,t;let l;a?l=this._modeService.getModeIdForLanguageName(a):this._options.editor&&(l=(r=this._options.editor.getModel())===null||r===void 0?void 0:r.getLanguageIdentifier().language),l||(l="plaintext"),this._modeService.triggerMode(l);const h=(i=yield g.TokenizationRegistry.getPromise(l))!==null&&i!==void 0?i:void 0,m=document.createElement("span");m.innerHTML=(t=(n=Rt._ttpTokenizer)===null||n===void 0?void 0:n.createHTML(u,h))!==null&&t!==void 0?t:S.tokenizeToString(u,h);let _=this._options.codeBlockFontFamily;return this._options.editor&&(_=this._options.editor.getOption(38).fontFamily),_&&(m.style.fontFamily=_),m}),asyncRenderCallback:()=>this._onDidRenderAsync.fire(),actionHandler:{callback:a=>this._openerService.open(a,{fromUserGesture:!0,allowContributedOpeners:!0}).catch(w.onUnexpectedError),disposeables:s}}}};c._ttpTokenizer=(p=window.trustedTypes)===null||p===void 0?void 0:p.createPolicy("tokenizeToString",{createHTML(o,s){return S.tokenizeToString(o,s)}}),c=Me([_e(1,M.IModeService),_e(2,N.IOpenerService)],c),e.MarkdownRenderer=c}),define(Q[559],J([0,1,7,23,71,51,199,43,44,24,28,26,531,58]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OpenerService=void 0;let a=class{constructor(n){this._commandService=n}open(n){return Ie(this,void 0,void 0,function*(){if(!s.matchesScheme(n,C.Schemas.command))return!1;typeof n=="string"&&(n=g.URI.parse(n));let t=[];try{t=S.parse(decodeURIComponent(n.query))}catch(l){try{t=S.parse(n.query)}catch(h){}}return Array.isArray(t)||(t=[t]),yield this._commandService.executeCommand(n.path,...t),!0})}};a=Me([_e(0,c.ICommandService)],a);let u=class{constructor(n){this._editorService=n}open(n,t){return Ie(this,void 0,void 0,function*(){typeof n=="string"&&(n=g.URI.parse(n));let l;const h=/^L?(\d+)(?:,(\d+))?/.exec(n.fragment);return h&&(l={startLineNumber:parseInt(h[1]),startColumn:h[2]?parseInt(h[2]):1},n=n.with({fragment:""})),n.scheme===C.Schemas.file&&(n=d.normalizePath(n)),yield this._editorService.openCodeEditor({resource:n,options:Object.assign({selection:l,context:(t==null?void 0:t.fromUserGesture)?o.EditorOpenContext.USER:o.EditorOpenContext.API},t==null?void 0:t.editorOptions)},this._editorService.getFocusedCodeEditor(),t==null?void 0:t.openToSide),!0})}};u=Me([_e(0,p.ICodeEditorService)],u);let r=class{constructor(n,t){this._openers=new M.LinkedList,this._validators=new M.LinkedList,this._resolvers=new M.LinkedList,this._resolvedUriTargets=new w.ResourceMap(l=>l.with({path:null,fragment:null,query:null}).toString()),this._externalOpeners=new M.LinkedList,this._defaultExternalOpener={openExternal:l=>Ie(this,void 0,void 0,function*(){return s.matchesScheme(l,C.Schemas.http)||s.matchesScheme(l,C.Schemas.https)?b.windowOpenNoOpener(l):window.location.href=l,!0})},this._openers.push({open:(l,h)=>Ie(this,void 0,void 0,function*(){return(h==null?void 0:h.openExternal)||s.matchesScheme(l,C.Schemas.mailto)||s.matchesScheme(l,C.Schemas.http)||s.matchesScheme(l,C.Schemas.https)?(yield this._doOpenExternal(l,h),!0):!1})}),this._openers.push(new a(t)),this._openers.push(new u(n))}registerOpener(n){return{dispose:this._openers.unshift(n)}}registerValidator(n){return{dispose:this._validators.push(n)}}registerExternalUriResolver(n){return{dispose:this._resolvers.push(n)}}setDefaultExternalOpener(n){this._defaultExternalOpener=n}registerExternalOpener(n){return{dispose:this._externalOpeners.push(n)}}open(n,t){var l;return Ie(this,void 0,void 0,function*(){const h=typeof n=="string"?g.URI.parse(n):n,m=(l=this._resolvedUriTargets.get(h))!==null&&l!==void 0?l:h;for(const _ of this._validators)if(!(yield _.shouldOpen(m)))return!1;for(const _ of this._openers)if(yield _.open(n,t))return!0;return!1})}resolveExternalUri(n,t){return Ie(this,void 0,void 0,function*(){for(const l of this._resolvers){const h=yield l.resolveExternalUri(n,t);if(h)return this._resolvedUriTargets.has(h.resolved)||this._resolvedUriTargets.set(h.resolved,n),h}return{resolved:n,dispose:()=>{}}})}_doOpenExternal(n,t){return Ie(this,void 0,void 0,function*(){const l=typeof n=="string"?g.URI.parse(n):n,{resolved:h}=yield this.resolveExternalUri(l,t);let m;if(typeof n=="string"&&l.toString()===h.toString()?m=n:m=encodeURI(h.toString(!0)),t==null?void 0:t.allowContributedOpeners){const _=typeof(t==null?void 0:t.allowContributedOpeners)=="string"?t==null?void 0:t.allowContributedOpeners:void 0;for(const f of this._externalOpeners)if(yield f.openExternal(m,{sourceUri:l,preferredOpenerId:_},N.CancellationToken.None))return!0}return this._defaultExternalOpener.openExternal(m,{sourceUri:l},N.CancellationToken.None)})}dispose(){this._validators.clear()}};r=Me([_e(0,p.ICodeEditorService),_e(1,c.ICommandService)],r),e.OpenerService=r}),define(Q[560],J([0,1,7,73,2,228,408,140,58,19]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModesGlyphHoverWidget=void 0;class p{constructor(s){this._editor=s,this._lineNumber=-1,this._result=[]}setLineNumber(s){this._lineNumber=s,this._result=[]}clearResult(){this._result=[]}computeSync(){const s=r=>({value:r}),a=this._editor.getLineDecorations(this._lineNumber),u=[];if(!a)return u;for(const r of a)if(!!r.options.glyphMarginClassName){const i=r.options.glyphMarginHoverMessage;!i||N.isEmptyMarkdownString(i)||u.push(...g.asArray(i).map(s))}return u}onResult(s,a){this._result=this._result.concat(s)}getResult(){return this._result}getResultWithLoadingMessage(){return this.getResult()}}class c extends S.GlyphHoverWidget{constructor(s,a,u=d.NullOpenerService){super(c.ID,s);this._renderDisposeables=this._register(new M.DisposableStore),this._messages=[],this._lastLineNumber=-1,this._markdownRenderer=this._register(new C.MarkdownRenderer({editor:this._editor},a,u)),this._computer=new p(this._editor),this._hoverOperation=new w.HoverOperation(this._computer,r=>this._withResult(r),void 0,r=>this._withResult(r),300)}dispose(){this._hoverOperation.cancel(),super.dispose()}onModelDecorationsChanged(){this.isVisible&&(this._hoverOperation.cancel(),this._computer.clearResult(),this._hoverOperation.start(0))}startShowingAt(s){this._lastLineNumber!==s&&(this._hoverOperation.cancel(),this.hide(),this._lastLineNumber=s,this._computer.setLineNumber(s),this._hoverOperation.start(0))}hide(){this._lastLineNumber=-1,this._hoverOperation.cancel(),super.hide()}_withResult(s){this._messages=s,this._messages.length>0?this._renderMessages(this._lastLineNumber,this._messages):this.hide()}_renderMessages(s,a){this._renderDisposeables.clear();const u=document.createDocumentFragment();for(const r of a){const i=this._markdownRenderer.render(r.value);this._renderDisposeables.add(i),u.appendChild(b.$("div.hover-row",void 0,i.element))}this.updateContents(u),this.showAt(s)}}e.ModesGlyphHoverWidget=c,c.ID="editor.contrib.modesGlyphHoverWidget"}),define(Q[254],J([0,1,509,2,7,61,140,73,27,6,231,9]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestDetailsOverlay=e.SuggestDetailsWidget=e.canExpandCompletionItem=void 0;function o(u){return!!u&&Boolean(u.completion.documentation||u.completion.detail&&u.completion.detail!==u.completion.label)}e.canExpandCompletionItem=o;let s=class{constructor(r,i){this._editor=r,this._onDidClose=new g.Emitter,this.onDidClose=this._onDidClose.event,this._onDidChangeContents=new g.Emitter,this.onDidChangeContents=this._onDidChangeContents.event,this._disposables=new N.DisposableStore,this._renderDisposeable=new N.DisposableStore,this._borderWidth=1,this._size=new M.Dimension(330,0),this.domNode=M.$(".suggest-details"),this.domNode.classList.add("no-docs"),this._markdownRenderer=i.createInstance(S.MarkdownRenderer,{editor:r}),this._body=M.$(".body"),this._scrollbar=new w.DomScrollableElement(this._body,{}),M.append(this.domNode,this._scrollbar.getDomNode()),this._disposables.add(this._scrollbar),this._header=M.append(this._body,M.$(".header")),this._close=M.append(this._header,M.$("span"+d.Codicon.close.cssSelector)),this._close.title=b.localize(0,null),this._type=M.append(this._header,M.$("p.type")),this._docs=M.append(this._body,M.$("p.docs")),this._configureFont(),this._disposables.add(this._editor.onDidChangeConfiguration(n=>{n.hasChanged(38)&&this._configureFont()}))}dispose(){this._disposables.dispose(),this._renderDisposeable.dispose()}_configureFont(){const r=this._editor.getOptions(),i=r.get(38),n=i.fontFamily,t=r.get(102)||i.fontSize,l=r.get(103)||i.lineHeight,h=i.fontWeight,m=`${t}px`,_=`${l}px`;this.domNode.style.fontSize=m,this.domNode.style.lineHeight=_,this.domNode.style.fontWeight=h,this.domNode.style.fontFeatureSettings=i.fontFeatureSettings,this._type.style.fontFamily=n,this._close.style.height=_,this._close.style.width=_}getLayoutInfo(){const r=this._editor.getOption(103)||this._editor.getOption(38).lineHeight,i=this._borderWidth,n=i*2;return{lineHeight:r,borderWidth:i,borderHeight:n,verticalPadding:22,horizontalPadding:14}}renderLoading(){this._type.textContent=b.localize(1,null),this._docs.textContent="",this.domNode.classList.remove("no-docs","no-type"),this.layout(this.size.width,this.getLayoutInfo().lineHeight*2),this._onDidChangeContents.fire(this)}renderItem(r,i){var n;this._renderDisposeable.clear();let{detail:t,documentation:l}=r.completion;if(i){let h="";h+=`score: ${r.score[0]}${r.word?`, compared '${r.completion.filterText&&r.completion.filterText+" (filterText)"||typeof r.completion.label=="string"?r.completion.label:r.completion.label.name}' with '${r.word}'`:" (no prefix)"} +`,h+=`distance: ${r.distance}, see localityBonus-setting +`,h+=`index: ${r.idx}, based on ${r.completion.sortText&&`sortText: "${r.completion.sortText}"`||"label"} +`,h+=`commit characters: ${(n=r.completion.commitCharacters)===null||n===void 0?void 0:n.join("")} +`,l=new C.MarkdownString().appendCodeblock("empty",h),t=`Provider: ${r.provider._debugDisplayName}`}if(!i&&!o(r)){this.clearContents();return}if(this.domNode.classList.remove("no-docs","no-type"),t){const h=t.length>1e5?`${t.substr(0,1e5)}\u2026`:t;this._type.textContent=h,this._type.title=h,M.show(this._type),this._type.classList.toggle("auto-wrap",!/\r?\n^\s+/gmi.test(h))}else M.clearNode(this._type),this._type.title="",M.hide(this._type),this.domNode.classList.add("no-type");if(M.clearNode(this._docs),typeof l=="string")this._docs.classList.remove("markdown-docs"),this._docs.textContent=l;else if(l){this._docs.classList.add("markdown-docs"),M.clearNode(this._docs);const h=this._markdownRenderer.render(l);this._docs.appendChild(h.element),this._renderDisposeable.add(h),this._renderDisposeable.add(this._markdownRenderer.onDidRenderAsync(()=>{this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}))}this.domNode.style.userSelect="text",this.domNode.tabIndex=-1,this._close.onmousedown=h=>{h.preventDefault(),h.stopPropagation()},this._close.onclick=h=>{h.preventDefault(),h.stopPropagation(),this._onDidClose.fire()},this._body.scrollTop=0,this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}clearContents(){this.domNode.classList.add("no-docs"),this._type.textContent="",this._docs.textContent=""}get size(){return this._size}layout(r,i){const n=new M.Dimension(r,i);M.Dimension.equals(n,this._size)||(this._size=n,M.size(this.domNode,r,i)),this._scrollbar.scanDomNode()}scrollDown(r=8){this._body.scrollTop+=r}scrollUp(r=8){this._body.scrollTop-=r}scrollTop(){this._body.scrollTop=0}scrollBottom(){this._body.scrollTop=this._body.scrollHeight}pageDown(){this.scrollDown(80)}pageUp(){this.scrollUp(80)}set borderWidth(r){this._borderWidth=r}get borderWidth(){return this._borderWidth}};s=Me([_e(1,c.IInstantiationService)],s),e.SuggestDetailsWidget=s;class a{constructor(r,i){this.widget=r,this._editor=i,this._disposables=new N.DisposableStore,this._added=!1,this._resizable=new p.ResizableHTMLElement,this._resizable.domNode.classList.add("suggest-details-container"),this._resizable.domNode.appendChild(r.domNode),this._resizable.enableSashes(!1,!0,!0,!1);let n,t,l=0,h=0;this._disposables.add(this._resizable.onDidWillResize(()=>{n=this._topLeft,t=this._resizable.size})),this._disposables.add(this._resizable.onDidResize(m=>{if(n&&t){this.widget.layout(m.dimension.width,m.dimension.height);let _=!1;m.west&&(h=t.width-m.dimension.width,_=!0),m.north&&(l=t.height-m.dimension.height,_=!0),_&&this._applyTopLeft({top:n.top+l,left:n.left+h})}m.done&&(n=void 0,t=void 0,l=0,h=0,this._userSize=m.dimension)})),this._disposables.add(this.widget.onDidChangeContents(()=>{var m;this._anchorBox&&this._placeAtAnchor(this._anchorBox,(m=this._userSize)!==null&&m!==void 0?m:this.widget.size)}))}dispose(){this._disposables.dispose(),this.hide()}getId(){return"suggest.details"}getDomNode(){return this._resizable.domNode}getPosition(){return null}show(){this._added||(this._editor.addOverlayWidget(this),this.getDomNode().style.position="fixed",this._added=!0)}hide(r=!1){this._added&&(this._editor.removeOverlayWidget(this),this._added=!1,this._anchorBox=void 0,this._topLeft=void 0),r&&(this._userSize=void 0,this.widget.clearContents())}placeAtAnchor(r){var i;const n=M.getDomNodePagePosition(r);this._anchorBox=n,this._placeAtAnchor(this._anchorBox,(i=this._userSize)!==null&&i!==void 0?i:this.widget.size)}_placeAtAnchor(r,i){const n=M.getClientArea(document.body),t=this.widget.getLayoutInfo();let l,h,m=new M.Dimension(220,2*t.lineHeight),_=0,f=r.top,v=r.top+r.height-t.borderHeight,y,L,I=n.width-(r.left+r.width+t.borderWidth+t.horizontalPadding);_=-t.borderWidth+r.left+r.width,L=!0,l=new M.Dimension(I,n.height-r.top-t.borderHeight-t.verticalPadding),h=l.with(void 0,r.top+r.height-t.borderHeight-t.verticalPadding),i.width>I&&(r.left>I&&(I=r.left-t.borderWidth-t.horizontalPadding,L=!1,_=Math.max(t.horizontalPadding,r.left-i.width-t.borderWidth),l=l.with(I),h=l.with(void 0,h.height)),r.width>I*1.3&&n.height-(r.top+r.height)>r.height&&(I=r.width,_=r.left,f=-t.borderWidth+r.top+r.height,l=new M.Dimension(r.width-t.borderHeight,n.height-r.top-r.height-t.verticalPadding),h=l.with(void 0,r.top-t.verticalPadding),m=m.with(l.width)));let k=i.height,E=Math.max(l.height,h.height);k>E&&(k=E);let T;k<=l.height?(y=!0,T=l):(y=!1,T=h),this._applyTopLeft({left:_,top:y?f:v-k}),this.getDomNode().style.position="fixed",this._resizable.enableSashes(!y,L,y,!L),this._resizable.minSize=m,this._resizable.maxSize=T,this._resizable.layout(k,Math.min(T.width,i.width)),this.widget.layout(this._resizable.size.width,this._resizable.size.height)}_applyTopLeft(r){this._topLeft=r,this.getDomNode().style.left=`${this._topLeft.left}px`,this.getDomNode().style.top=`${this._topLeft.top}px`}}e.SuggestDetailsOverlay=a}),define(Q[59],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEditorProgressService=e.Progress=void 0;class N{constructor(w){this.callback=w}report(w){this._value=w,this.callback(this._value)}}e.Progress=N,N.None=Object.freeze({report(){}}),e.IEditorProgressService=b.createDecorator("editorProgressService")}),define(Q[561],J([0,1,23,2,15]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PickerQuickAccessProvider=e.TriggerAction=void 0;var w;(function(g){g[g.NO_ACTION=0]="NO_ACTION",g[g.CLOSE_PICKER=1]="CLOSE_PICKER",g[g.REFRESH_PICKER=2]="REFRESH_PICKER",g[g.REMOVE_ITEM=3]="REMOVE_ITEM"})(w=e.TriggerAction||(e.TriggerAction={}));function S(g){const p=g;return Array.isArray(p.items)}function C(g){const p=g;return!!p.picks&&p.additionalPicks instanceof Promise}class d extends N.Disposable{constructor(p,c){super();this.prefix=p,this.options=c}provide(p,c){var o;const s=new N.DisposableStore;p.canAcceptInBackground=!!((o=this.options)===null||o===void 0?void 0:o.canAcceptInBackground),p.matchOnLabel=p.matchOnDescription=p.matchOnDetail=p.sortByLabel=!1;let a;const u=s.add(new N.MutableDisposable),r=()=>Ie(this,void 0,void 0,function*(){const i=u.value=new N.DisposableStore;a==null||a.dispose(!0),p.busy=!1,a=new b.CancellationTokenSource(c);const n=a.token,t=p.value.substr(this.prefix.length).trim(),l=this.getPicks(t,i,n),h=(m,_)=>{var f;let v,y;if(S(m)?(v=m.items,y=m.active):v=m,v.length===0){if(_)return!1;t.length>0&&((f=this.options)===null||f===void 0?void 0:f.noResultsPick)&&(v=[this.options.noResultsPick])}return p.items=v,y&&(p.activeItems=[y]),!0};if(l!==null)if(C(l)){let m=!1,_=!1;yield Promise.all([(()=>Ie(this,void 0,void 0,function*(){yield M.timeout(d.FAST_PICKS_RACE_DELAY),!n.isCancellationRequested&&(_||(m=h(l.picks,!0)))}))(),(()=>Ie(this,void 0,void 0,function*(){p.busy=!0;try{const f=yield l.additionalPicks;if(n.isCancellationRequested)return;let v,y;S(l.picks)?(v=l.picks.items,y=l.picks.active):v=l.picks;let L,I;if(S(f)?(L=f.items,I=f.active):L=f,L.length>0||!m){let k;if(!y&&!I){const E=p.activeItems[0];E&&v.indexOf(E)!==-1&&(k=E)}h({items:[...v,...L],active:y||I||k})}}finally{n.isCancellationRequested||(p.busy=!1),_=!0}}))()])}else if(!(l instanceof Promise))h(l);else{p.busy=!0;try{const m=yield l;if(n.isCancellationRequested)return;h(m)}finally{n.isCancellationRequested||(p.busy=!1)}}});return s.add(p.onDidChangeValue(()=>r())),r(),s.add(p.onDidAccept(i=>{const[n]=p.selectedItems;typeof(n==null?void 0:n.accept)=="function"&&(i.inBackground||p.hide(),n.accept(p.keyMods,i))})),s.add(p.onDidTriggerItemButton(({button:i,item:n})=>Ie(this,void 0,void 0,function*(){var t,l;if(typeof n.trigger=="function"){const h=(l=(t=n.buttons)===null||t===void 0?void 0:t.indexOf(i))!==null&&l!==void 0?l:-1;if(h>=0){const m=n.trigger(h,p.keyMods),_=typeof m=="number"?m:yield m;if(c.isCancellationRequested)return;switch(_){case w.NO_ACTION:break;case w.CLOSE_PICKER:p.hide();break;case w.REFRESH_PICKER:r();break;case w.REMOVE_ITEM:const f=p.items.indexOf(n);if(f!==-1){const v=p.items.slice();v.splice(f,1),p.items=v}break}}}}))),s}}e.PickerQuickAccessProvider=d,d.FAST_PICKS_RACE_DELAY=200});var mt=this&&this.__createBinding||(Object.create?function(q,e,b,N){N===void 0&&(N=b),Object.defineProperty(q,N,{enumerable:!0,get:function(){return e[b]}})}:function(q,e,b,N){N===void 0&&(N=b),q[N]=e[b]}),pt=this&&this.__exportStar||function(q,e){for(var b in q)b!=="default"&&!Object.prototype.hasOwnProperty.call(e,b)&&mt(e,q,b)};define(Q[78],J([0,1,9,202]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IQuickInputService=void 0,pt(N,e),e.IQuickInputService=b.createDecorator("quickInputService")}),define(Q[33],J([0,1,20,195]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Registry=void 0;class M{constructor(){this.data=new Map}add(S,C){N.ok(b.isString(S)),N.ok(b.isObject(C)),N.ok(!this.data.has(S),"There is already an extension with this id"),this.data.set(S,C)}as(S){return this.data.get(S)||null}}e.Registry=new M}),define(Q[141],J([0,1,458,6,18,41,33]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PLAINTEXT_LANGUAGE_IDENTIFIER=e.PLAINTEXT_EXTENSION=e.PLAINTEXT_MODE_ID=e.ModesRegistry=e.EditorModesRegistry=e.Extensions=void 0,e.Extensions={ModesRegistry:"editor.modesRegistry"};class C{constructor(){this._onDidChangeLanguages=new N.Emitter,this.onDidChangeLanguages=this._onDidChangeLanguages.event,this._languages=[],this._dynamicLanguages=[]}registerLanguage(g){return this._languages.push(g),this._onDidChangeLanguages.fire(void 0),{dispose:()=>{for(let p=0,c=this._languages.length;p"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],folding:{offSide:!0}},0)}),define(Q[562],J([0,1,43,44,141,237]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.cssEscape=e.detectModeId=e.getIconClasses=void 0;function S(g,p,c,o){const s=o===w.FileKind.ROOT_FOLDER?["rootfolder-icon"]:o===w.FileKind.FOLDER?["folder-icon"]:["file-icon"];if(c){let a;if(c.scheme===b.Schemas.data?a=N.DataUri.parseMetaData(c).get(N.DataUri.META_DATA_LABEL):a=d(N.basenameOrAuthority(c).toLowerCase()),o===w.FileKind.FOLDER)s.push(`${a}-name-folder-icon`);else{if(a){if(s.push(`${a}-name-file-icon`),a.length<=255){const r=a.split(".");for(let i=1;i0&&C.charAt(C.length-1)==="#"?C.substring(0,C.length-1):C}class w{constructor(){this._onDidChangeSchema=new N.Emitter,this.schemasById={}}registerSchema(d,g){this.schemasById[M(d)]=g,this._onDidChangeSchema.fire(d)}notifySchemaChanged(d){this._onDidChangeSchema.fire(d)}}const S=new w;b.Registry.add(e.Extensions.JSONContribution,S)}),define(Q[95],J([0,1,519,6,33,20,185]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.validateProperty=e.getDefaultValue=e.overrideIdentifierFromKey=e.OVERRIDE_PROPERTY_PATTERN=e.resourceLanguageSettingsSchemaId=e.resourceSettings=e.windowSettings=e.machineOverridableSettings=e.machineSettings=e.applicationSettings=e.allSettings=e.Extensions=void 0,e.Extensions={Configuration:"base.contributions.configuration"},e.allSettings={properties:{},patternProperties:{}},e.applicationSettings={properties:{},patternProperties:{}},e.machineSettings={properties:{},patternProperties:{}},e.machineOverridableSettings={properties:{},patternProperties:{}},e.windowSettings={properties:{},patternProperties:{}},e.resourceSettings={properties:{},patternProperties:{}},e.resourceLanguageSettingsSchemaId="vscode://schemas/settings/resourceLanguage";const C=M.Registry.as(S.Extensions.JSONContribution);class d{constructor(){this.overrideIdentifiers=new Set,this._onDidSchemaChange=new N.Emitter,this._onDidUpdateConfiguration=new N.Emitter,this.defaultValues={},this.defaultLanguageConfigurationOverridesNode={id:"defaultOverrides",title:b.localize(0,null),properties:{}},this.configurationContributors=[this.defaultLanguageConfigurationOverridesNode],this.resourceLanguageSettingsSchema={properties:{},patternProperties:{},additionalProperties:!1,errorMessage:"Unknown editor configuration setting",allowTrailingCommas:!0,allowComments:!0},this.configurationProperties={},this.excludedConfigurationProperties={},C.registerSchema(e.resourceLanguageSettingsSchemaId,this.resourceLanguageSettingsSchema)}registerConfiguration(u,r=!0){this.registerConfigurations([u],r)}registerConfigurations(u,r=!0){const i=[];u.forEach(n=>{i.push(...this.validateAndRegisterProperties(n,r)),this.configurationContributors.push(n),this.registerJSONConfiguration(n)}),C.registerSchema(e.resourceLanguageSettingsSchemaId,this.resourceLanguageSettingsSchema),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire(i)}registerOverrideIdentifiers(u){for(const r of u)this.overrideIdentifiers.add(r);this.updateOverridePropertyPatternKey()}validateAndRegisterProperties(u,r=!0,i=3){i=w.isUndefinedOrNull(u.scope)?i:u.scope;let n=[],t=u.properties;if(t)for(let h in t){if(r&&s(h)){delete t[h];continue}const m=t[h];if(this.updatePropertyDefaultValue(h,m),e.OVERRIDE_PROPERTY_PATTERN.test(h)?m.scope=void 0:m.scope=w.isUndefinedOrNull(m.scope)?i:m.scope,t[h].hasOwnProperty("included")&&!t[h].included){this.excludedConfigurationProperties[h]=t[h],delete t[h];continue}else this.configurationProperties[h]=t[h];!t[h].deprecationMessage&&t[h].markdownDeprecationMessage&&(t[h].deprecationMessage=t[h].markdownDeprecationMessage),n.push(h)}let l=u.allOf;if(l)for(let h of l)n.push(...this.validateAndRegisterProperties(h,r,i));return n}getConfigurationProperties(){return this.configurationProperties}registerJSONConfiguration(u){const r=i=>{let n=i.properties;if(n)for(const l in n)this.updateSchema(l,n[l]);let t=i.allOf;t&&t.forEach(r)};r(u)}updateSchema(u,r){switch(e.allSettings.properties[u]=r,r.scope){case 1:e.applicationSettings.properties[u]=r;break;case 2:e.machineSettings.properties[u]=r;break;case 6:e.machineOverridableSettings.properties[u]=r;break;case 3:e.windowSettings.properties[u]=r;break;case 4:e.resourceSettings.properties[u]=r;break;case 5:e.resourceSettings.properties[u]=r,this.resourceLanguageSettingsSchema.properties[u]=r;break}}updateOverridePropertyPatternKey(){for(const u of this.overrideIdentifiers.values()){const r=`[${u}]`,i={type:"object",description:b.localize(1,null),errorMessage:b.localize(2,null),$ref:e.resourceLanguageSettingsSchemaId};this.updatePropertyDefaultValue(r,i),e.allSettings.properties[r]=i,e.applicationSettings.properties[r]=i,e.machineSettings.properties[r]=i,e.machineOverridableSettings.properties[r]=i,e.windowSettings.properties[r]=i,e.resourceSettings.properties[r]=i}this._onDidSchemaChange.fire()}updatePropertyDefaultValue(u,r){let i=this.defaultValues[u];w.isUndefined(i)&&(i=r.default),w.isUndefined(i)&&(i=c(r.type)),r.default=i}}const g="\\[.*\\]$";e.OVERRIDE_PROPERTY_PATTERN=new RegExp(g);function p(a){return a.substring(1,a.length-1)}e.overrideIdentifierFromKey=p;function c(a){switch(Array.isArray(a)?a[0]:a){case"boolean":return!1;case"integer":case"number":return 0;case"string":return"";case"array":return[];case"object":return{};default:return null}}e.getDefaultValue=c;const o=new d;M.Registry.add(e.Extensions.Configuration,o);function s(a){return a.trim()?e.OVERRIDE_PROPERTY_PATTERN.test(a)?b.localize(4,null,a):o.getConfigurationProperties()[a]!==void 0?b.localize(5,null,a):null:b.localize(3,null)}e.validateProperty=s}),define(Q[186],J([0,1,453,6,2,40,19,38,126,163,95,33,196]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isDiffEditorConfigurationKey=e.isEditorConfigurationKey=e.editorConfigurationBaseNode=e.CommonEditorConfiguration=e.ComputedEditorOptions=e.TabFocus=void 0,e.TabFocus=new class{constructor(){this._tabFocus=!1,this._onDidChangeTabFocus=new N.Emitter,this.onDidChangeTabFocus=this._onDidChangeTabFocus.event}getTabFocusMode(){return this._tabFocus}setTabFocusMode(L){this._tabFocus!==L&&(this._tabFocus=L,this._onDidChangeTabFocus.fire(this._tabFocus))}};const s=Object.hasOwnProperty;class a{constructor(){this._values=[]}_read(I){return this._values[I]}get(I){return this._values[I]}_write(I,k){this._values[I]=k}}e.ComputedEditorOptions=a;class u{constructor(){this._values=[]}_read(I){return this._values[I]}_write(I,k){this._values[I]=k}}class r{static readOptions(I){const k=I,E=new u;for(const T of C.editorOptionsRegistry){const O=T.name==="_never_"?void 0:k[T.name];E._write(T.id,O)}return E}static validateOptions(I){const k=new C.ValidatedEditorOptions;for(const E of C.editorOptionsRegistry)k._write(E.id,E.validate(I._read(E.id)));return k}static computeOptions(I,k){const E=new a;for(const T of C.editorOptionsRegistry)E._write(T.id,T.compute(k,E,I._read(T.id)));return E}static _deepEquals(I,k){if(typeof I!="object"||typeof k!="object")return I===k;if(Array.isArray(I)||Array.isArray(k))return Array.isArray(I)&&Array.isArray(k)?S.equals(I,k):!1;for(let E in I)if(!r._deepEquals(I[E],k[E]))return!1;return!0}static checkEquals(I,k){const E=[];let T=!1;for(const O of C.editorOptionsRegistry){const A=!r._deepEquals(I._read(O.id),k._read(O.id));E[O.id]=A,A&&(T=!0)}return T?new C.ConfigurationChangedEvent(E):null}}function i(L){const I=L.wordWrap;I===!0?L.wordWrap="on":I===!1&&(L.wordWrap="off");const k=L.lineNumbers;k===!0?L.lineNumbers="on":k===!1&&(L.lineNumbers="off"),L.autoClosingBrackets===!1&&(L.autoClosingBrackets="never",L.autoClosingQuotes="never",L.autoSurround="never"),L.cursorBlinking==="visible"&&(L.cursorBlinking="solid");const O=L.renderWhitespace;O===!0?L.renderWhitespace="boundary":O===!1&&(L.renderWhitespace="none");const A=L.renderLineHighlight;A===!0?L.renderLineHighlight="line":A===!1&&(L.renderLineHighlight="none");const B=L.acceptSuggestionOnEnter;B===!0?L.acceptSuggestionOnEnter="on":B===!1&&(L.acceptSuggestionOnEnter="off");const F=L.tabCompletion;F===!1?L.tabCompletion="off":F===!0&&(L.tabCompletion="onlySnippets");const D=L.suggest;if(D&&typeof D.filteredTypes=="object"&&D.filteredTypes){const Y={};Y.method="showMethods",Y.function="showFunctions",Y.constructor="showConstructors",Y.field="showFields",Y.variable="showVariables",Y.class="showClasses",Y.struct="showStructs",Y.interface="showInterfaces",Y.module="showModules",Y.property="showProperties",Y.event="showEvents",Y.operator="showOperators",Y.unit="showUnits",Y.value="showValues",Y.constant="showConstants",Y.enum="showEnums",Y.enumMember="showEnumMembers",Y.keyword="showKeywords",Y.text="showWords",Y.color="showColors",Y.file="showFiles",Y.reference="showReferences",Y.folder="showFolders",Y.typeParameter="showTypeParameters",Y.snippet="showSnippets",o.forEach(Y,ee=>{const se=D.filteredTypes[ee.key];se===!1&&(D[ee.value]=se)})}const R=L.hover;R===!0?L.hover={enabled:!0}:R===!1&&(L.hover={enabled:!1});const W=L.parameterHints;W===!0?L.parameterHints={enabled:!0}:W===!1&&(L.parameterHints={enabled:!1});const x=L.autoIndent;x===!0?L.autoIndent="full":x===!1&&(L.autoIndent="advanced");const K=L.matchBrackets;K===!0?L.matchBrackets="always":K===!1&&(L.matchBrackets="never")}function n(L){const I=w.deepClone(L);return i(I),I}class t extends M.Disposable{constructor(I,k){super();this._onDidChange=this._register(new N.Emitter),this.onDidChange=this._onDidChange.event,this._onDidChangeFast=this._register(new N.Emitter),this.onDidChangeFast=this._onDidChangeFast.event,this.isSimpleWidget=I,this._isDominatedByLongLines=!1,this._computeOptionsMemory=new C.ComputeOptionsMemory,this._viewLineCount=1,this._lineNumbersDigitCount=1,this._rawOptions=n(k),this._readOptions=r.readOptions(this._rawOptions),this._validatedOptions=r.validateOptions(this._readOptions),this._register(d.EditorZoom.onDidChangeZoomLevel(E=>this._recomputeOptions())),this._register(e.TabFocus.onDidChangeTabFocus(E=>this._recomputeOptions()))}observeReferenceElement(I){}updatePixelRatio(){}_recomputeOptions(){const I=this.options,k=this._computeInternalOptions();if(!I)this.options=k;else{const E=r.checkEquals(I,k);if(E===null)return;this.options=k,this._onDidChangeFast.fire(E),this._onDidChange.fire(E)}}getRawOptions(){return this._rawOptions}_computeInternalOptions(){const I=this._getEnvConfiguration(),k=g.BareFontInfo.createFromValidatedSettings(this._validatedOptions,I.zoomLevel,I.pixelRatio,this.isSimpleWidget),E={memory:this._computeOptionsMemory,outerWidth:I.outerWidth,outerHeight:I.outerHeight,fontInfo:this.readConfiguration(k),extraEditorClassName:I.extraEditorClassName,isDominatedByLongLines:this._isDominatedByLongLines,viewLineCount:this._viewLineCount,lineNumbersDigitCount:this._lineNumbersDigitCount,emptySelectionClipboard:I.emptySelectionClipboard,pixelRatio:I.pixelRatio,tabFocusMode:e.TabFocus.getTabFocusMode(),accessibilitySupport:I.accessibilitySupport};return r.computeOptions(this._validatedOptions,E)}static _subsetEquals(I,k){for(const E in k)if(s.call(k,E)){const T=k[E],O=I[E];if(O===T)continue;if(Array.isArray(O)&&Array.isArray(T)){if(!S.equals(O,T))return!1;continue}if(O&&typeof O=="object"&&T&&typeof T=="object"){if(!this._subsetEquals(O,T))return!1;continue}return!1}return!0}updateOptions(I){if(typeof I!="undefined"){const k=n(I);t._subsetEquals(this._rawOptions,k)||(this._rawOptions=w.mixin(this._rawOptions,k||{}),this._readOptions=r.readOptions(this._rawOptions),this._validatedOptions=r.validateOptions(this._readOptions),this._recomputeOptions())}}setIsDominatedByLongLines(I){this._isDominatedByLongLines=I,this._recomputeOptions()}setMaxLineNumber(I){const k=t._digitCount(I);this._lineNumbersDigitCount!==k&&(this._lineNumbersDigitCount=k,this._recomputeOptions())}setViewLineCount(I){this._viewLineCount!==I&&(this._viewLineCount=I,this._recomputeOptions())}static _digitCount(I){let k=0;for(;I;)I=Math.floor(I/10),k++;return k||1}}e.CommonEditorConfiguration=t,e.editorConfigurationBaseNode=Object.freeze({id:"editor",order:5,type:"object",title:b.localize(0,null),scope:5});const l=c.Registry.as(p.Extensions.Configuration),h=Object.assign(Object.assign({},e.editorConfigurationBaseNode),{properties:{"editor.tabSize":{type:"number",default:C.EDITOR_MODEL_DEFAULTS.tabSize,minimum:1,markdownDescription:b.localize(1,null)},"editor.insertSpaces":{type:"boolean",default:C.EDITOR_MODEL_DEFAULTS.insertSpaces,markdownDescription:b.localize(2,null)},"editor.detectIndentation":{type:"boolean",default:C.EDITOR_MODEL_DEFAULTS.detectIndentation,markdownDescription:b.localize(3,null)},"editor.trimAutoWhitespace":{type:"boolean",default:C.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,description:b.localize(4,null)},"editor.largeFileOptimizations":{type:"boolean",default:C.EDITOR_MODEL_DEFAULTS.largeFileOptimizations,description:b.localize(5,null)},"editor.wordBasedSuggestions":{type:"boolean",default:!0,description:b.localize(6,null)},"editor.wordBasedSuggestionsMode":{enum:["currentDocument","matchingDocuments","allDocuments"],default:"matchingDocuments",enumDescriptions:[b.localize(7,null),b.localize(8,null),b.localize(9,null)],description:b.localize(10,null)},"editor.semanticHighlighting.enabled":{enum:[!0,!1,"configuredByTheme"],enumDescriptions:[b.localize(11,null),b.localize(12,null),b.localize(13,null)],default:"configuredByTheme",description:b.localize(14,null)},"editor.stablePeek":{type:"boolean",default:!1,markdownDescription:b.localize(15,null)},"editor.maxTokenizationLineLength":{type:"integer",default:2e4,description:b.localize(16,null)},"diffEditor.maxComputationTime":{type:"number",default:5e3,description:b.localize(17,null)},"diffEditor.renderSideBySide":{type:"boolean",default:!0,description:b.localize(18,null)},"diffEditor.ignoreTrimWhitespace":{type:"boolean",default:!0,description:b.localize(19,null)},"diffEditor.renderIndicators":{type:"boolean",default:!0,description:b.localize(20,null)},"diffEditor.codeLens":{type:"boolean",default:!1,description:b.localize(21,null)},"diffEditor.wordWrap":{type:"string",enum:["off","on","inherit"],default:"inherit",markdownEnumDescriptions:[b.localize(22,null),b.localize(23,null),b.localize(24,null)]}}});function m(L){return typeof L.type!="undefined"||typeof L.anyOf!="undefined"}for(const L of C.editorOptionsRegistry){const I=L.schema;if(typeof I!="undefined")if(m(I))h.properties[`editor.${L.name}`]=I;else for(let k in I)s.call(I,k)&&(h.properties[k]=I[k])}let _=null;function f(){return _===null&&(_=Object.create(null),Object.keys(h.properties).forEach(L=>{_[L]=!0})),_}function v(L){return f()[`editor.${L}`]||!1}e.isEditorConfigurationKey=v;function y(L){return f()[`diffEditor.${L}`]||!1}e.isDiffEditorConfigurationKey=y,l.registerConfiguration(h)}),define(Q[69],J([0,1,35,6,2,17,361,212,186,38,163]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Configuration=e.clearAllFontInfos=void 0;class c{constructor(){this._keys=Object.create(null),this._values=Object.create(null)}has(r){const i=r.getId();return!!this._values[i]}get(r){const i=r.getId();return this._values[i]}put(r,i){const n=r.getId();this._keys[n]=r,this._values[n]=i}remove(r){const i=r.getId();delete this._keys[i],delete this._values[i]}getValues(){return Object.keys(this._keys).map(r=>this._values[r])}}function o(){s.INSTANCE.clearCache()}e.clearAllFontInfos=o;class s extends M.Disposable{constructor(){super();this._onDidChange=this._register(new N.Emitter),this.onDidChange=this._onDidChange.event,this._cache=new c,this._evictUntrustedReadingsTimeout=-1}dispose(){this._evictUntrustedReadingsTimeout!==-1&&(clearTimeout(this._evictUntrustedReadingsTimeout),this._evictUntrustedReadingsTimeout=-1),super.dispose()}clearCache(){this._cache=new c,this._onDidChange.fire()}_writeToCache(r,i){this._cache.put(r,i),!i.isTrusted&&this._evictUntrustedReadingsTimeout===-1&&(this._evictUntrustedReadingsTimeout=setTimeout(()=>{this._evictUntrustedReadingsTimeout=-1,this._evictUntrustedReadings()},5e3))}_evictUntrustedReadings(){const r=this._cache.getValues();let i=!1;for(const n of r)n.isTrusted||(i=!0,this._cache.remove(n));i&&this._onDidChange.fire()}readConfiguration(r){if(!this._cache.has(r)){let i=s._actualReadConfiguration(r);(i.typicalHalfwidthCharacterWidth<=2||i.typicalFullwidthCharacterWidth<=2||i.spaceWidth<=2||i.maxDigitWidth<=2)&&(i=new p.FontInfo({zoomLevel:b.getZoomLevel(),pixelRatio:b.getPixelRatio(),fontFamily:i.fontFamily,fontWeight:i.fontWeight,fontSize:i.fontSize,fontFeatureSettings:i.fontFeatureSettings,lineHeight:i.lineHeight,letterSpacing:i.letterSpacing,isMonospace:i.isMonospace,typicalHalfwidthCharacterWidth:Math.max(i.typicalHalfwidthCharacterWidth,5),typicalFullwidthCharacterWidth:Math.max(i.typicalFullwidthCharacterWidth,5),canUseHalfwidthRightwardsArrow:i.canUseHalfwidthRightwardsArrow,spaceWidth:Math.max(i.spaceWidth,5),middotWidth:Math.max(i.middotWidth,5),wsmiddotWidth:Math.max(i.wsmiddotWidth,5),maxDigitWidth:Math.max(i.maxDigitWidth,5)},!1)),this._writeToCache(r,i)}return this._cache.get(r)}static createRequest(r,i,n,t){const l=new S.CharWidthRequest(r,i);return n.push(l),t&&t.push(l),l}static _actualReadConfiguration(r){const i=[],n=[],t=this.createRequest("n",0,i,n),l=this.createRequest("\uFF4D",0,i,null),h=this.createRequest(" ",0,i,n),m=this.createRequest("0",0,i,n),_=this.createRequest("1",0,i,n),f=this.createRequest("2",0,i,n),v=this.createRequest("3",0,i,n),y=this.createRequest("4",0,i,n),L=this.createRequest("5",0,i,n),I=this.createRequest("6",0,i,n),k=this.createRequest("7",0,i,n),E=this.createRequest("8",0,i,n),T=this.createRequest("9",0,i,n),O=this.createRequest("\u2192",0,i,n),A=this.createRequest("\uFFEB",0,i,null),B=this.createRequest("\xB7",0,i,n),F=this.createRequest(String.fromCharCode(11825),0,i,null);this.createRequest("|",0,i,n),this.createRequest("/",0,i,n),this.createRequest("-",0,i,n),this.createRequest("_",0,i,n),this.createRequest("i",0,i,n),this.createRequest("l",0,i,n),this.createRequest("m",0,i,n),this.createRequest("|",1,i,n),this.createRequest("_",1,i,n),this.createRequest("i",1,i,n),this.createRequest("l",1,i,n),this.createRequest("m",1,i,n),this.createRequest("n",1,i,n),this.createRequest("|",2,i,n),this.createRequest("_",2,i,n),this.createRequest("i",2,i,n),this.createRequest("l",2,i,n),this.createRequest("m",2,i,n),this.createRequest("n",2,i,n),S.readCharWidths(r,i);const D=Math.max(m.width,_.width,f.width,v.width,y.width,L.width,I.width,k.width,E.width,T.width);let R=r.fontFeatureSettings===g.EditorFontLigatures.OFF;const W=n[0].width;for(let Y=1,ee=n.length;R&&Y.001){R=!1;break}}let x=!0;R&&A.width!==W&&(x=!1),A.width>O.width&&(x=!1);const K=b.getTimeSinceLastZoomLevelChanged()>2e3;return new p.FontInfo({zoomLevel:b.getZoomLevel(),pixelRatio:b.getPixelRatio(),fontFamily:r.fontFamily,fontWeight:r.fontWeight,fontSize:r.fontSize,fontFeatureSettings:r.fontFeatureSettings,lineHeight:r.lineHeight,letterSpacing:r.letterSpacing,isMonospace:R,typicalHalfwidthCharacterWidth:t.width,typicalFullwidthCharacterWidth:l.width,canUseHalfwidthRightwardsArrow:x,spaceWidth:h.width,middotWidth:B.width,wsmiddotWidth:F.width,maxDigitWidth:D},K)}}s.INSTANCE=new s;class a extends d.CommonEditorConfiguration{constructor(r,i,n=null,t){super(r,i);this.accessibilityService=t,this._elementSizeObserver=this._register(new C.ElementSizeObserver(n,i.dimension,()=>this._recomputeOptions())),this._register(s.INSTANCE.onDidChange(()=>this._recomputeOptions())),this._validatedOptions.get(9)&&this._elementSizeObserver.startObserving(),this._register(b.onDidChangeZoomLevel(l=>this._recomputeOptions())),this._register(this.accessibilityService.onDidChangeScreenReaderOptimized(()=>this._recomputeOptions())),this._recomputeOptions()}static applyFontInfoSlow(r,i){r.style.fontFamily=i.getMassagedFontFamily(),r.style.fontWeight=i.fontWeight,r.style.fontSize=i.fontSize+"px",r.style.fontFeatureSettings=i.fontFeatureSettings,r.style.lineHeight=i.lineHeight+"px",r.style.letterSpacing=i.letterSpacing+"px"}static applyFontInfo(r,i){r.setFontFamily(i.getMassagedFontFamily()),r.setFontWeight(i.fontWeight),r.setFontSize(i.fontSize),r.setFontFeatureSettings(i.fontFeatureSettings),r.setLineHeight(i.lineHeight),r.setLetterSpacing(i.letterSpacing)}observeReferenceElement(r){this._elementSizeObserver.observe(r)}updatePixelRatio(){this._recomputeOptions()}static _getExtraEditorClassName(){let r="";return!b.isSafari&&!b.isWebkitWebView&&(r+="no-user-select "),b.isSafari&&(r+="no-minimap-shadow "),w.isMacintosh&&(r+="mac "),r}_getEnvConfiguration(){return{extraEditorClassName:a._getExtraEditorClassName(),outerWidth:this._elementSizeObserver.getWidth(),outerHeight:this._elementSizeObserver.getHeight(),emptySelectionClipboard:b.isWebKit||b.isFirefox,pixelRatio:b.getPixelRatio(),zoomLevel:b.getZoomLevel(),accessibilitySupport:this.accessibilityService.isScreenReaderOptimized()?2:this.accessibilityService.getAccessibilitySupport()}}readConfiguration(r){return s.INSTANCE.readConfiguration(r)}}e.Configuration=a}),define(Q[563],J([0,1,93,8,69,63]),function(q,e,b,N,M,w){"use strict";var S;Object.defineProperty(e,"__esModule",{value:!0}),e.DOMLineBreaksComputerFactory=void 0;const C=(S=window.trustedTypes)===null||S===void 0?void 0:S.createPolicy("domLineBreaksComputer",{createHTML:a=>a});class d{static create(){return new d}constructor(){}createLineBreaksComputer(u,r,i,n){r=r|0,i=+i;let t=[];return{addRequest:(l,h)=>{t.push(l)},finalize:()=>g(t,u,r,i,n)}}}e.DOMLineBreaksComputerFactory=d;function g(a,u,r,i,n){var t;if(i===-1){const A=[];for(let B=0,F=a.length;Bl?(F=0,D=0):R=l-K}const W=B.substr(F),x=p(W,D,r,R,m);_[A]=F,f[A]=D,v[A]=W,y[A]=x[0],L[A]=x[1]}const I=m.build(),k=(t=C==null?void 0:C.createHTML(I))!==null&&t!==void 0?t:I;h.innerHTML=k,h.style.position="absolute",h.style.top="10000",h.style.wordWrap="break-word",document.body.appendChild(h);let E=document.createRange();const T=Array.prototype.slice.call(h.children,0);let O=[];for(let A=0;A');const t=a.length;let l=u,h=0,m=[],_=[],f=0");for(let v=0;v"),m[v]=h,_[v]=l;const y=f;f=v+1"),m[a.length]=h,_[a.length]=l,n.appendASCIIString(""),[m,_]}function c(a,u,r,i){if(r.length<=1)return null;const n=Array.prototype.slice.call(u.children,0),t=[];try{o(a,n,i,0,null,r.length-1,null,t)}catch(l){return console.log(l),null}return t.length===0?null:(t.push(r.length),t)}function o(a,u,r,i,n,t,l,h){if(i!==t&&(n=n||s(a,u,r[i],r[i+1]),l=l||s(a,u,r[t],r[t+1]),!(Math.abs(n[0].top-l[0].top)<=.1))){if(i+1===t){h.push(t);return}const m=i+(t-i)/2|0,_=s(a,u,r[m],r[m+1]);o(a,u,r,i,n,m,_,h),o(a,u,r,m,_,t,l,h)}}function s(a,u,r,i){return a.setStart(u[r/16384|0].firstChild,r%16384),a.setEnd(u[i/16384|0].firstChild,i%16384),a.getClientRects()}}),define(Q[564],J([0,1,30,69,165,45]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarginViewOverlays=e.ContentViewOverlays=e.ViewOverlayLine=e.ViewOverlays=void 0;class S extends w.ViewPart{constructor(c){super(c);this._visibleLines=new M.VisibleLinesCollection(this),this.domNode=this._visibleLines.domNode,this._dynamicOverlays=[],this._isFocused=!1,this.domNode.setClassName("view-overlays")}shouldRender(){if(super.shouldRender())return!0;for(let c=0,o=this._dynamicOverlays.length;cs.shouldRender());for(let s=0,a=o.length;s'),a.appendASCIIString(u),a.appendASCIIString(""),!0)}layoutLine(c,o){this._domNode&&(this._domNode.setTop(o),this._domNode.setHeight(this._lineHeight))}}e.ViewOverlayLine=C;class d extends S{constructor(c){super(c);const s=this._context.configuration.options.get(124);this._contentWidth=s.contentWidth,this.domNode.setHeight(0)}onConfigurationChanged(c){const s=this._context.configuration.options.get(124);return this._contentWidth=s.contentWidth,super.onConfigurationChanged(c)||!0}onScrollChanged(c){return super.onScrollChanged(c)||c.scrollWidthChanged}_viewOverlaysRender(c){super._viewOverlaysRender(c),this.domNode.setWidth(Math.max(c.scrollWidth,this._contentWidth))}}e.ContentViewOverlays=d;class g extends S{constructor(c){super(c);const o=this._context.configuration.options,s=o.get(124);this._contentLeft=s.contentLeft,this.domNode.setClassName("margin-view-overlays"),this.domNode.setWidth(1),N.Configuration.applyFontInfo(this.domNode,o.get(38))}onConfigurationChanged(c){const o=this._context.configuration.options;N.Configuration.applyFontInfo(this.domNode,o.get(38));const s=o.get(124);return this._contentLeft=s.contentLeft,super.onConfigurationChanged(c)||!0}onScrollChanged(c){return super.onScrollChanged(c)||c.scrollHeightChanged}_viewOverlaysRender(c){super._viewOverlaysRender(c);const o=Math.min(c.scrollHeight,1e6);this.domNode.setHeight(o),this.domNode.setWidth(this._contentLeft)}}e.MarginViewOverlays=g}),define(Q[565],J([0,1,7,30,8,69,38,14,3,124]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewCursor=void 0;class p{constructor(s,a,u,r,i,n){this.top=s,this.left=a,this.width=u,this.height=r,this.textContent=i,this.textContentClassName=n}}class c{constructor(s){this._context=s;const a=this._context.configuration.options,u=a.get(38);this._cursorStyle=a.get(21),this._lineHeight=a.get(53),this._typicalHalfwidthCharacterWidth=u.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(a.get(24),this._typicalHalfwidthCharacterWidth),this._isVisible=!0,this._domNode=N.createFastDomNode(document.createElement("div")),this._domNode.setClassName(`cursor ${g.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this._domNode.setHeight(this._lineHeight),this._domNode.setTop(0),this._domNode.setLeft(0),w.Configuration.applyFontInfo(this._domNode,u),this._domNode.setDisplay("none"),this._position=new C.Position(1,1),this._lastRenderedContent="",this._renderData=null}getDomNode(){return this._domNode}getPosition(){return this._position}show(){this._isVisible||(this._domNode.setVisibility("inherit"),this._isVisible=!0)}hide(){this._isVisible&&(this._domNode.setVisibility("hidden"),this._isVisible=!1)}onConfigurationChanged(s){const a=this._context.configuration.options,u=a.get(38);return this._cursorStyle=a.get(21),this._lineHeight=a.get(53),this._typicalHalfwidthCharacterWidth=u.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(a.get(24),this._typicalHalfwidthCharacterWidth),w.Configuration.applyFontInfo(this._domNode,u),!0}onCursorPositionChanged(s){return this._position=s,!0}_prepareRender(s){let a="";if(this._cursorStyle===S.TextEditorCursorStyle.Line||this._cursorStyle===S.TextEditorCursorStyle.LineThin){const f=s.visibleRangeForPosition(this._position);if(!f||f.outsideRenderedLine)return null;let v;if(this._cursorStyle===S.TextEditorCursorStyle.Line){if(v=b.computeScreenAwareSize(this._lineCursorWidth>0?this._lineCursorWidth:2),v>2){const I=this._context.model.getLineContent(this._position.lineNumber),k=M.nextCharLength(I,this._position.column-1);a=I.substr(this._position.column-1,k)}}else v=b.computeScreenAwareSize(1);let y=f.left;v>=2&&y>=1&&(y-=1);const L=s.getVerticalOffsetForLineNumber(this._position.lineNumber)-s.bigNumbersDelta;return new p(L,y,v,this._lineHeight,a,"")}const u=this._context.model.getLineContent(this._position.lineNumber),r=M.nextCharLength(u,this._position.column-1),i=s.linesVisibleRangesForRange(new d.Range(this._position.lineNumber,this._position.column,this._position.lineNumber,this._position.column+r),!1);if(!i||i.length===0)return null;const n=i[0];if(n.outsideRenderedLine||n.ranges.length===0)return null;const t=n.ranges[0],l=t.width<1?this._typicalHalfwidthCharacterWidth:t.width;let h="";if(this._cursorStyle===S.TextEditorCursorStyle.Block){const f=this._context.model.getViewLineData(this._position.lineNumber);a=u.substr(this._position.column-1,r);const v=f.tokens.findTokenIndexAtOffset(this._position.column-1);h=f.tokens.getClassName(v)}let m=s.getVerticalOffsetForLineNumber(this._position.lineNumber)-s.bigNumbersDelta,_=this._lineHeight;return(this._cursorStyle===S.TextEditorCursorStyle.Underline||this._cursorStyle===S.TextEditorCursorStyle.UnderlineThin)&&(m+=this._lineHeight-2,_=2),new p(m,t.left,l,_,a,h)}prepareRender(s){this._renderData=this._prepareRender(s)}render(s){return this._renderData?(this._lastRenderedContent!==this._renderData.textContent&&(this._lastRenderedContent=this._renderData.textContent,this._domNode.domNode.textContent=this._lastRenderedContent),this._domNode.setClassName(`cursor ${g.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ${this._renderData.textContentClassName}`),this._domNode.setDisplay("block"),this._domNode.setTop(this._renderData.top),this._domNode.setLeft(this._renderData.left),this._domNode.setWidth(this._renderData.width),this._domNode.setLineHeight(this._renderData.height),this._domNode.setHeight(this._renderData.height),{domNode:this._domNode.domNode,position:this._position,contentLeft:this._renderData.left,height:this._renderData.height,width:2}):(this._domNode.setDisplay("none"),null)}}e.ViewCursor=c}),define(Q[566],J([0,1,12,6,2,291,8,18,141,76,95,33]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguagesRegistry=void 0;const o=Object.prototype.hasOwnProperty;class s extends M.Disposable{constructor(u=!0,r=!1){super();this._onDidChange=this._register(new N.Emitter),this.onDidChange=this._onDidChange.event,this._warnOnOverwrite=r,this._nextLanguageId2=1,this._languageIdToLanguage=[],this._languageToLanguageId=Object.create(null),this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},u&&(this._initializeFromRegistry(),this._register(d.ModesRegistry.onDidChangeLanguages(i=>this._initializeFromRegistry())))}_initializeFromRegistry(){this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={};const u=d.ModesRegistry.getLanguages();this._registerLanguages(u)}_registerLanguages(u){for(const r of u)this._registerLanguage(r);this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},Object.keys(this._languages).forEach(r=>{let i=this._languages[r];i.name&&(this._nameMap[i.name]=i.identifier),i.aliases.forEach(n=>{this._lowercaseNameMap[n.toLowerCase()]=i.identifier}),i.mimetypes.forEach(n=>{this._mimeTypesMap[n]=i.identifier})}),c.Registry.as(p.Extensions.Configuration).registerOverrideIdentifiers(d.ModesRegistry.getLanguages().map(r=>r.id)),this._onDidChange.fire()}_getLanguageId(u){if(this._languageToLanguageId[u])return this._languageToLanguageId[u];const r=this._nextLanguageId2++;return this._languageIdToLanguage[r]=u,this._languageToLanguageId[u]=r,r}_registerLanguage(u){const r=u.id;let i;if(o.call(this._languages,r))i=this._languages[r];else{const n=this._getLanguageId(r);i={identifier:new C.LanguageIdentifier(r,n),name:null,mimetypes:[],aliases:[],extensions:[],filenames:[],configurationFiles:[]},this._languages[r]=i}this._mergeLanguage(i,u)}_mergeLanguage(u,r){const i=r.id;let n=null;if(Array.isArray(r.mimetypes)&&r.mimetypes.length>0&&(u.mimetypes.push(...r.mimetypes),n=r.mimetypes[0]),n||(n=`text/x-${i}`,u.mimetypes.push(n)),Array.isArray(r.extensions)){r.configuration?u.extensions=r.extensions.concat(u.extensions):u.extensions=u.extensions.concat(r.extensions);for(let h of r.extensions)w.registerTextMime({id:i,mime:n,extension:h},this._warnOnOverwrite)}if(Array.isArray(r.filenames))for(let h of r.filenames)w.registerTextMime({id:i,mime:n,filename:h},this._warnOnOverwrite),u.filenames.push(h);if(Array.isArray(r.filenamePatterns))for(let h of r.filenamePatterns)w.registerTextMime({id:i,mime:n,filepattern:h},this._warnOnOverwrite);if(typeof r.firstLine=="string"&&r.firstLine.length>0){let h=r.firstLine;h.charAt(0)!=="^"&&(h="^"+h);try{let m=new RegExp(h);S.regExpLeadsToEndlessLoop(m)||w.registerTextMime({id:i,mime:n,firstline:m},this._warnOnOverwrite)}catch(m){b.onUnexpectedError(m)}}u.aliases.push(i);let t=null;if(typeof r.aliases!="undefined"&&Array.isArray(r.aliases)&&(r.aliases.length===0?t=[null]:t=r.aliases),t!==null)for(const h of t)!h||h.length===0||u.aliases.push(h);let l=t!==null&&t.length>0;if(!(l&&t[0]===null)){let h=(l?t[0]:null)||i;(l||!u.name)&&(u.name=h)}r.configuration&&u.configurationFiles.push(r.configuration)}isRegisteredMode(u){return o.call(this._mimeTypesMap,u)?!0:o.call(this._languages,u)}getModeIdForLanguageNameLowercase(u){return o.call(this._lowercaseNameMap,u)?this._lowercaseNameMap[u].language:null}extractModeIds(u){return u?u.split(",").map(r=>r.trim()).map(r=>o.call(this._mimeTypesMap,r)?this._mimeTypesMap[r].language:r).filter(r=>o.call(this._languages,r)):[]}getLanguageIdentifier(u){if(u===g.NULL_MODE_ID||u===0)return g.NULL_LANGUAGE_IDENTIFIER;let r;if(typeof u=="string")r=u;else if(r=this._languageIdToLanguage[u],!r)return null;return o.call(this._languages,r)?this._languages[r].identifier:null}getModeIdsFromFilepathOrFirstLine(u,r){if(!u&&!r)return[];let i=w.guessMimeTypes(u,r);return this.extractModeIds(i.join(","))}}e.LanguagesRegistry=s}),define(Q[567],J([0,1,6,2,373,76,566,19]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModeServiceImpl=void 0;class d extends N.Disposable{constructor(c,o){super();this._onDidChange=this._register(new b.Emitter),this.onDidChange=this._onDidChange.event,this._selector=o,this.languageIdentifier=this._selector(),this._register(c(()=>this._evaluate()))}_evaluate(){let c=this._selector();c.id!==this.languageIdentifier.id&&(this.languageIdentifier=c,this._onDidChange.fire(this.languageIdentifier))}}class g extends N.Disposable{constructor(c=!1){super();this._onDidCreateMode=this._register(new b.Emitter),this.onDidCreateMode=this._onDidCreateMode.event,this._onLanguagesMaybeChanged=this._register(new b.Emitter),this.onLanguagesMaybeChanged=this._onLanguagesMaybeChanged.event,this._instantiatedModes={},this._registry=this._register(new S.LanguagesRegistry(!0,c)),this._register(this._registry.onDidChange(()=>this._onLanguagesMaybeChanged.fire()))}isRegisteredMode(c){return this._registry.isRegisteredMode(c)}getModeIdForLanguageName(c){return this._registry.getModeIdForLanguageNameLowercase(c)}getModeIdByFilepathOrFirstLine(c,o){const s=this._registry.getModeIdsFromFilepathOrFirstLine(c,o);return C.firstOrDefault(s,null)}getModeId(c){const o=this._registry.extractModeIds(c);return C.firstOrDefault(o,null)}getLanguageIdentifier(c){return this._registry.getLanguageIdentifier(c)}create(c){return new d(this.onLanguagesMaybeChanged,()=>{const o=this.getModeId(c);return this._createModeAndGetLanguageIdentifier(o)})}createByFilepathOrFirstLine(c,o){return new d(this.onLanguagesMaybeChanged,()=>{const s=this.getModeIdByFilepathOrFirstLine(c,o);return this._createModeAndGetLanguageIdentifier(s)})}_createModeAndGetLanguageIdentifier(c){const o=this.getLanguageIdentifier(c||"plaintext")||w.NULL_LANGUAGE_IDENTIFIER;return this._getOrCreateMode(o.language),o}triggerMode(c){const o=this.getModeId(c);this._getOrCreateMode(o||"plaintext")}_getOrCreateMode(c){if(!this._instantiatedModes.hasOwnProperty(c)){let o=this.getLanguageIdentifier(c)||w.NULL_LANGUAGE_IDENTIFIER;this._instantiatedModes[c]=new M.FrankensteinMode(o),this._onDidCreateMode.fire(this._instantiatedModes[c])}return this._instantiatedModes[c]}}e.ModeServiceImpl=g}),define(Q[46],J([0,1,33,9,95]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getDefaultValues=e.getConfigurationKeys=e.getConfigurationValue=e.removeFromValueTree=e.addToValueTree=e.toValuesTree=e.IConfigurationService=void 0,e.IConfigurationService=N.createDecorator("configurationService");function w(o,s){const a=Object.create(null);for(let u in o)S(a,u,o[u],s);return a}e.toValuesTree=w;function S(o,s,a,u){const r=s.split("."),i=r.pop();let n=o;for(let t=0;tconsole.error(`Conflict in default settings: ${r}`))}return o}e.getDefaultValues=c}),define(Q[568],J([0,1,2,65,6,16,46]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilityService=void 0;let C=class extends b.Disposable{constructor(g,p){super();this._contextKeyService=g,this._configurationService=p,this._accessibilitySupport=0,this._onDidChangeScreenReaderOptimized=new M.Emitter,this._accessibilityModeEnabledContext=N.CONTEXT_ACCESSIBILITY_MODE_ENABLED.bindTo(this._contextKeyService);const c=()=>this._accessibilityModeEnabledContext.set(this.isScreenReaderOptimized());this._register(this._configurationService.onDidChangeConfiguration(o=>{o.affectsConfiguration("editor.accessibilitySupport")&&(c(),this._onDidChangeScreenReaderOptimized.fire())})),c(),this.onDidChangeScreenReaderOptimized(()=>c())}get onDidChangeScreenReaderOptimized(){return this._onDidChangeScreenReaderOptimized.event}isScreenReaderOptimized(){const g=this._configurationService.getValue("editor.accessibilitySupport");return g==="on"||g==="auto"&&this._accessibilitySupport===2}getAccessibilitySupport(){return this._accessibilitySupport}};C=Me([_e(0,w.IContextKeyService),_e(1,S.IConfigurationService)],C),e.AccessibilityService=C}),define(Q[569],J([0,1,51,19,20,40,24,95,46]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ConfigurationChangeEvent=e.Configuration=e.DefaultConfigurationModel=e.ConfigurationModel=void 0;class g{constructor(a={},u=[],r=[]){this._contents=a,this._keys=u,this._overrides=r,this.isFrozen=!1}get contents(){return this.checkAndFreeze(this._contents)}get overrides(){return this.checkAndFreeze(this._overrides)}get keys(){return this.checkAndFreeze(this._keys)}isEmpty(){return this._keys.length===0&&Object.keys(this._contents).length===0&&this._overrides.length===0}getValue(a){return a?d.getConfigurationValue(this.contents,a):this.contents}override(a){const u=this.getContentsForOverrideIdentifer(a);if(!u||typeof u!="object"||!Object.keys(u).length)return this;let r={};for(const i of N.distinct([...Object.keys(this.contents),...Object.keys(u)])){let n=this.contents[i],t=u[i];t&&(typeof n=="object"&&typeof t=="object"?(n=w.deepClone(n),this.mergeContents(n,t)):n=t),r[i]=n}return new g(r,this.keys,this.overrides)}merge(...a){const u=w.deepClone(this.contents),r=w.deepClone(this.overrides),i=[...this.keys];for(const n of a){this.mergeContents(u,n.contents);for(const t of n.overrides){const[l]=r.filter(h=>N.equals(h.identifiers,t.identifiers));l?this.mergeContents(l.contents,t.contents):r.push(w.deepClone(t))}for(const t of n.keys)i.indexOf(t)===-1&&i.push(t)}return new g(u,i,r)}freeze(){return this.isFrozen=!0,this}mergeContents(a,u){for(const r of Object.keys(u)){if(r in a&&M.isObject(a[r])&&M.isObject(u[r])){this.mergeContents(a[r],u[r]);continue}a[r]=w.deepClone(u[r])}}checkAndFreeze(a){return this.isFrozen&&!Object.isFrozen(a)?w.deepFreeze(a):a}getContentsForOverrideIdentifer(a){for(const u of this.overrides)if(u.identifiers.indexOf(a)!==-1)return u.contents;return null}toJSON(){return{contents:this.contents,overrides:this.overrides,keys:this.keys}}setValue(a,u){this.addKey(a),d.addToValueTree(this.contents,a,u,r=>{throw new Error(r)})}removeValue(a){this.removeKey(a)&&d.removeFromValueTree(this.contents,a)}addKey(a){let u=this.keys.length;for(let r=0;rconsole.error(`Conflict in default settings file: ${n}`))});super(a,u,r)}}e.DefaultConfigurationModel=p;class c{constructor(a,u,r=new g,i=new g,n=new b.ResourceMap,t=new g,l=new b.ResourceMap,h=!0){this._defaultConfiguration=a,this._localUserConfiguration=u,this._remoteUserConfiguration=r,this._workspaceConfiguration=i,this._folderConfigurations=n,this._memoryConfiguration=t,this._memoryConfigurationByResource=l,this._freeze=h,this._workspaceConsolidatedConfiguration=null,this._foldersConsolidatedConfigurations=new b.ResourceMap,this._userConfiguration=null}getValue(a,u,r){return this.getConsolidateConfigurationModel(u,r).getValue(a)}updateValue(a,u,r={}){let i;r.resource?(i=this._memoryConfigurationByResource.get(r.resource),i||(i=new g,this._memoryConfigurationByResource.set(r.resource,i))):i=this._memoryConfiguration,u===void 0?i.removeValue(a):i.setValue(a,u),r.resource||(this._workspaceConsolidatedConfiguration=null)}get userConfiguration(){return this._userConfiguration||(this._userConfiguration=this._remoteUserConfiguration.isEmpty()?this._localUserConfiguration:this._localUserConfiguration.merge(this._remoteUserConfiguration),this._freeze&&this._userConfiguration.freeze()),this._userConfiguration}getConsolidateConfigurationModel(a,u){let r=this.getConsolidatedConfigurationModelForResource(a,u);return a.overrideIdentifier?r.override(a.overrideIdentifier):r}getConsolidatedConfigurationModelForResource({resource:a},u){let r=this.getWorkspaceConsolidatedConfiguration();if(u&&a){const i=u.getFolder(a);i&&(r=this.getFolderConsolidatedConfiguration(i.uri)||r);const n=this._memoryConfigurationByResource.get(a);n&&(r=r.merge(n))}return r}getWorkspaceConsolidatedConfiguration(){return this._workspaceConsolidatedConfiguration||(this._workspaceConsolidatedConfiguration=this._defaultConfiguration.merge(this.userConfiguration,this._workspaceConfiguration,this._memoryConfiguration),this._freeze&&(this._workspaceConfiguration=this._workspaceConfiguration.freeze())),this._workspaceConsolidatedConfiguration}getFolderConsolidatedConfiguration(a){let u=this._foldersConsolidatedConfigurations.get(a);if(!u){const r=this.getWorkspaceConsolidatedConfiguration(),i=this._folderConfigurations.get(a);i?(u=r.merge(i),this._freeze&&(u=u.freeze()),this._foldersConsolidatedConfigurations.set(a,u)):u=r}return u}toData(){return{defaults:{contents:this._defaultConfiguration.contents,overrides:this._defaultConfiguration.overrides,keys:this._defaultConfiguration.keys},user:{contents:this.userConfiguration.contents,overrides:this.userConfiguration.overrides,keys:this.userConfiguration.keys},workspace:{contents:this._workspaceConfiguration.contents,overrides:this._workspaceConfiguration.overrides,keys:this._workspaceConfiguration.keys},folders:[...this._folderConfigurations.keys()].reduce((a,u)=>{const{contents:r,overrides:i,keys:n}=this._folderConfigurations.get(u);return a.push([u,{contents:r,overrides:i,keys:n}]),a},[])}}static parse(a){const u=this.parseConfigurationModel(a.defaults),r=this.parseConfigurationModel(a.user),i=this.parseConfigurationModel(a.workspace),n=a.folders.reduce((t,l)=>(t.set(S.URI.revive(l[0]),this.parseConfigurationModel(l[1])),t),new b.ResourceMap);return new c(u,r,new g,i,n,new g,new b.ResourceMap,!1)}static parseConfigurationModel(a){return new g(a.contents,a.keys,a.overrides).freeze()}}e.Configuration=c;class o{constructor(a,u,r,i){this.change=a,this.previous=u,this.currentConfiguraiton=r,this.currentWorkspace=i,this._previousConfiguration=void 0;const n=new Set;a.keys.forEach(l=>n.add(l)),a.overrides.forEach(([,l])=>l.forEach(h=>n.add(h))),this.affectedKeys=[...n.values()];const t=new g;this.affectedKeys.forEach(l=>t.setValue(l,{})),this.affectedKeysTree=t.contents}get previousConfiguration(){return!this._previousConfiguration&&this.previous&&(this._previousConfiguration=c.parse(this.previous.data)),this._previousConfiguration}affectsConfiguration(a,u){var r;if(this.doesAffectedKeysTreeContains(this.affectedKeysTree,a)){if(u){const i=this.previousConfiguration?this.previousConfiguration.getValue(a,u,(r=this.previous)===null||r===void 0?void 0:r.workspace):void 0,n=this.currentConfiguraiton.getValue(a,u,this.currentWorkspace);return!w.equals(i,n)}return!0}return!1}doesAffectedKeysTreeContains(a,u){let r=d.toValuesTree({[u]:!0},()=>{}),i;for(;typeof r=="object"&&(i=Object.keys(r)[0]);){if(a=a[i],!a)return!1;r=r[i]}return!0}}e.ConfigurationChangeEvent=o}),define(Q[570],J([0,1,6,54,2,51,520,26,46,16,251]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextKeyService=e.AbstractContextKeyService=e.Context=void 0;const c="data-keybinding-context";class o{constructor(f,v){this._id=f,this._parent=v,this._value=Object.create(null),this._value._contextId=f}setValue(f,v){return this._value[f]!==v?(this._value[f]=v,!0):!1}removeValue(f){return f in this._value?(delete this._value[f],!0):!1}getValue(f){const v=this._value[f];return typeof v=="undefined"&&this._parent?this._parent.getValue(f):v}}e.Context=o;class s extends o{constructor(){super(-1,null)}setValue(f,v){return!1}removeValue(f){return!1}getValue(f){}}s.INSTANCE=new s;class a extends o{constructor(f,v,y){super(f,null);this._configurationService=v,this._values=w.TernarySearchTree.forConfigKeys(),this._listener=this._configurationService.onDidChangeConfiguration(L=>{if(L.source===6){const I=Array.from(N.Iterable.map(this._values,([k])=>k));this._values.clear(),y.fire(new i(I))}else{const I=[];for(const k of L.affectedKeys){const E=`config.${k}`,T=this._values.findSuperstr(E);T!==void 0&&(I.push(...N.Iterable.map(T,([O])=>O)),this._values.deleteSuperstr(E)),this._values.has(E)&&(I.push(E),this._values.delete(E))}y.fire(new i(I))}})}dispose(){this._listener.dispose()}getValue(f){if(f.indexOf(a._keyPrefix)!==0)return super.getValue(f);if(this._values.has(f))return this._values.get(f);const v=f.substr(a._keyPrefix.length),y=this._configurationService.getValue(v);let L;switch(typeof y){case"number":case"boolean":case"string":L=y;break;default:Array.isArray(y)?L=JSON.stringify(y):L=y}return this._values.set(f,L),L}setValue(f,v){return super.setValue(f,v)}removeValue(f){return super.removeValue(f)}}a._keyPrefix="config.";class u{constructor(f,v,y){this._service=f,this._key=v,this._defaultValue=y,this.reset()}set(f){this._service.setContext(this._key,f)}reset(){typeof this._defaultValue=="undefined"?this._service.removeContext(this._key):this._service.setContext(this._key,this._defaultValue)}get(){return this._service.getContextKeyValue(this._key)}}class r{constructor(f){this.key=f}affectsSome(f){return f.has(this.key)}}class i{constructor(f){this.keys=f}affectsSome(f){for(const v of this.keys)if(f.has(v))return!0;return!1}}class n{constructor(f){this.events=f}affectsSome(f){for(const v of this.events)if(v.affectsSome(f))return!0;return!1}}class t{constructor(f){this._onDidChangeContext=new b.PauseableEmitter({merge:v=>new n(v)}),this.onDidChangeContext=this._onDidChangeContext.event,this._isDisposed=!1,this._myContextId=f}createKey(f,v){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");return new u(this,f,v)}bufferChangeEvents(f){this._onDidChangeContext.pause();try{f()}finally{this._onDidChangeContext.resume()}}createScoped(f){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");return new h(this,f)}contextMatchesRules(f){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");const v=this.getContextValuesContainer(this._myContextId);return p.KeybindingResolver.contextMatchesRules(v,f)}getContextKeyValue(f){if(!this._isDisposed)return this.getContextValuesContainer(this._myContextId).getValue(f)}setContext(f,v){if(!this._isDisposed){const y=this.getContextValuesContainer(this._myContextId);!y||y.setValue(f,v)&&this._onDidChangeContext.fire(new r(f))}}removeContext(f){this._isDisposed||this.getContextValuesContainer(this._myContextId).removeValue(f)&&this._onDidChangeContext.fire(new r(f))}getContext(f){return this._isDisposed?s.INSTANCE:this.getContextValuesContainer(m(f))}}e.AbstractContextKeyService=t;let l=class extends t{constructor(f){super(0);this._contexts=new Map,this._toDispose=new M.DisposableStore,this._lastContextId=0;const v=new a(this._myContextId,f,this._onDidChangeContext);this._contexts.set(this._myContextId,v),this._toDispose.add(v)}dispose(){this._onDidChangeContext.dispose(),this._isDisposed=!0,this._toDispose.dispose()}getContextValuesContainer(f){return this._isDisposed?s.INSTANCE:this._contexts.get(f)||s.INSTANCE}createChildContext(f=this._myContextId){if(this._isDisposed)throw new Error("ContextKeyService has been disposed");let v=++this._lastContextId;return this._contexts.set(v,new o(v,this.getContextValuesContainer(f))),v}disposeContext(f){this._isDisposed||this._contexts.delete(f)}};l=Me([_e(0,d.IConfigurationService)],l),e.ContextKeyService=l;class h extends t{constructor(f,v){super(f.createChildContext());if(this._parentChangeListener=new M.MutableDisposable,this._parent=f,this._updateParentChangeListener(),this._domNode=v,this._domNode.hasAttribute(c)){let y="";this._domNode.classList&&(y=Array.from(this._domNode.classList.values()).join(", ")),console.error(`Element already has context attribute${y?": "+y:""}`)}this._domNode.setAttribute(c,String(this._myContextId))}_updateParentChangeListener(){this._parentChangeListener.value=this._parent.onDidChangeContext(this._onDidChangeContext.fire,this._onDidChangeContext)}dispose(){this._isDisposed||(this._onDidChangeContext.dispose(),this._parent.disposeContext(this._myContextId),this._parentChangeListener.dispose(),this._domNode.removeAttribute(c),this._isDisposed=!0)}getContextValuesContainer(f){return this._isDisposed?s.INSTANCE:this._parent.getContextValuesContainer(f)}createChildContext(f=this._myContextId){if(this._isDisposed)throw new Error("ScopedContextKeyService has been disposed");return this._parent.createChildContext(f)}disposeContext(f){this._isDisposed||this._parent.disposeContext(f)}}function m(_){for(;_;){if(_.hasAttribute(c)){const f=_.getAttribute(c);return f?parseInt(f,10):NaN}_=_.parentElement}return 0}C.CommandsRegistry.registerCommand(g.SET_CONTEXT_COMMAND_ID,function(_,f,v){_.get(g.IContextKeyService).createKey(String(f),v)}),C.CommandsRegistry.registerCommand({id:"getContextKeyInfo",handler(){return[...g.RawContextKey.all()].sort((_,f)=>_.key.localeCompare(f.key))},description:{description:S.localize(0,null),args:[]}}),C.CommandsRegistry.registerCommand("_generateContextKeyInfo",function(){const _=[],f=new Set;for(let v of g.RawContextKey.all())f.has(v.key)||(f.add(v.key),_.push(v));_.sort((v,y)=>v.key.localeCompare(y.key)),console.log(JSON.stringify(_,void 0,2))})}),define(Q[86],J([0,1,39,17,26,33]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Extensions=e.KeybindingsRegistry=void 0;class S{constructor(){this._coreKeybindings=[],this._extensionKeybindings=[],this._cachedMergedKeybindings=null}static bindToCurrentPlatform(g){if(N.OS===1){if(g&&g.win)return g.win}else if(N.OS===2){if(g&&g.mac)return g.mac}else if(g&&g.linux)return g.linux;return g}registerKeybindingRule(g){const p=S.bindToCurrentPlatform(g);if(p&&p.primary){const c=b.createKeybinding(p.primary,N.OS);c&&this._registerDefaultKeybinding(c,g.id,g.args,g.weight,0,g.when)}if(p&&Array.isArray(p.secondary))for(let c=0,o=p.secondary.length;c=21&&g<=30||g>=31&&g<=56?!0:g===80||g===81||g===82||g===83||g===84||g===85||g===86||g===110||g===111||g===87||g===88||g===89||g===90||g===91||g===92}_assertNoCtrlAlt(g,p){g.ctrlKey&&g.altKey&&!g.metaKey&&S._mightProduceChar(g.keyCode)&&console.warn("Ctrl+Alt+ keybindings should not be used by default under Windows. Offender: ",g," for ",p)}_registerDefaultKeybinding(g,p,c,o,s,a){N.OS===1&&this._assertNoCtrlAlt(g.parts[0],p),this._coreKeybindings.push({keybinding:g,command:p,commandArgs:c,when:a,weight1:o,weight2:s,extensionId:null,isBuiltinExtension:!1}),this._cachedMergedKeybindings=null}getDefaultKeybindings(){return this._cachedMergedKeybindings||(this._cachedMergedKeybindings=[].concat(this._coreKeybindings).concat(this._extensionKeybindings),this._cachedMergedKeybindings.sort(C)),this._cachedMergedKeybindings.slice(0)}}e.KeybindingsRegistry=new S,e.Extensions={EditorModes:"platform.keybindingsRegistry"},w.Registry.add(e.Extensions.EditorModes,e.KeybindingsRegistry);function C(d,g){return d.weight1!==g.weight1?d.weight1-g.weight1:d.commandg.command?1:d.weight2-g.weight2}}),define(Q[571],J([0,1,16,432,86,433]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextScopedReplaceInput=e.ContextScopedFindInput=e.createAndBindHistoryNavigationWidgetScopedContextKeyService=e.HistoryNavigationEnablementContext=e.HistoryNavigationWidgetContext=void 0,e.HistoryNavigationWidgetContext="historyNavigationWidget",e.HistoryNavigationEnablementContext="historyNavigationEnabled";function S(o,s,a){new b.RawContextKey(a,s).bindTo(o)}function C(o,s){return o.createScoped(s.target)}function d(o,s){return o.getContext(document.activeElement).getValue(s)}function g(o,s){const a=C(o,s);S(a,s,e.HistoryNavigationWidgetContext);const u=new b.RawContextKey(e.HistoryNavigationEnablementContext,!0).bindTo(a);return{scopedContextKeyService:a,historyNavigationEnablement:u}}e.createAndBindHistoryNavigationWidgetScopedContextKeyService=g;let p=class extends N.FindInput{constructor(s,a,u,r,i=!1){super(s,a,i,u);this._register(g(r,{target:this.inputBox.element,historyNavigator:this.inputBox}).scopedContextKeyService)}};p=Me([_e(3,b.IContextKeyService)],p),e.ContextScopedFindInput=p;let c=class extends w.ReplaceInput{constructor(s,a,u,r,i=!1){super(s,a,i,u);this._register(g(r,{target:this.inputBox.element,historyNavigator:this.inputBox}).scopedContextKeyService)}};c=Me([_e(3,b.IContextKeyService)],c),e.ContextScopedReplaceInput=c,M.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"history.showPrevious",weight:200,when:b.ContextKeyExpr.and(b.ContextKeyExpr.has(e.HistoryNavigationWidgetContext),b.ContextKeyExpr.equals(e.HistoryNavigationEnablementContext,!0)),primary:16,secondary:[512|16],handler:(o,s)=>{const a=d(o.get(b.IContextKeyService),e.HistoryNavigationWidgetContext);a&&a.historyNavigator.showPreviousValue()}}),M.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"history.showNext",weight:200,when:b.ContextKeyExpr.and(b.ContextKeyExpr.has(e.HistoryNavigationWidgetContext),b.ContextKeyExpr.equals(e.HistoryNavigationEnablementContext,!0)),primary:18,secondary:[512|18],handler:(o,s)=>{const a=d(o.get(b.IContextKeyService),e.HistoryNavigationWidgetContext);a&&a.historyNavigator.showNextValue()}})}),define(Q[96],J([0,1,33,19,2]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickAccessRegistry=e.Extensions=e.DefaultQuickAccessFilterValue=void 0;var w;(function(C){C[C.PRESERVE=0]="PRESERVE",C[C.LAST=1]="LAST"})(w=e.DefaultQuickAccessFilterValue||(e.DefaultQuickAccessFilterValue={})),e.Extensions={Quickaccess:"workbench.contributions.quickaccess"};class S{constructor(){this.providers=[],this.defaultProvider=void 0}registerQuickAccessProvider(d){return d.prefix.length===0?this.defaultProvider=d:this.providers.push(d),this.providers.sort((g,p)=>p.prefix.length-g.prefix.length),M.toDisposable(()=>{this.providers.splice(this.providers.indexOf(d),1),this.defaultProvider===d&&(this.defaultProvider=void 0)})}getQuickAccessProviders(){return N.coalesce([this.defaultProvider,...this.providers])}getQuickAccessProvider(d){return d&&this.providers.find(p=>d.startsWith(p.prefix))||void 0||this.defaultProvider}}e.QuickAccessRegistry=S,b.Registry.add(e.Extensions.Quickaccess,new S)}),define(Q[572],J([0,1,78,96,33,526,2]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HelpQuickAccessProvider=void 0;let C=class lt{constructor(g){this.quickInputService=g,this.registry=M.Registry.as(N.Extensions.Quickaccess)}provide(g){const p=new S.DisposableStore;p.add(g.onDidAccept(()=>{const[s]=g.selectedItems;s&&this.quickInputService.quickAccess.show(s.prefix,{preserveValue:!0})})),p.add(g.onDidChangeValue(s=>{const a=this.registry.getQuickAccessProvider(s.substr(lt.PREFIX.length));a&&a.prefix&&a.prefix!==lt.PREFIX&&this.quickInputService.quickAccess.show(a.prefix,{preserveValue:!0})}));const{editorProviders:c,globalProviders:o}=this.getQuickAccessProviders();return g.items=c.length===0||o.length===0?[...c.length===0?o:c]:[{label:w.localize(0,null),type:"separator"},...o,{label:w.localize(1,null),type:"separator"},...c],p}getQuickAccessProviders(){const g=[],p=[];for(const c of this.registry.getQuickAccessProviders().sort((o,s)=>o.prefix.localeCompare(s.prefix)))if(c.prefix!==lt.PREFIX)for(const o of c.helpEntries){const s=o.prefix||c.prefix,a=s||"\u2026";(o.needsEditor?p:g).push({prefix:s,label:a,ariaLabel:w.localize(2,null,a,o.description),description:o.description})}return{editorProviders:p,globalProviders:g}}};C.PREFIX="?",C=Me([_e(0,b.IQuickInputService)],C),e.HelpQuickAccessProvider=C}),define(Q[573],J([0,1,33,96,64,572]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),b.Registry.as(N.Extensions.Quickaccess).registerQuickAccessProvider({ctor:w.HelpQuickAccessProvider,prefix:"",helpEntries:[{description:M.QuickHelpNLS.helpQuickAccessActionLabel,needsEditor:!0}]})}),define(Q[574],J([0,1,78,2,96,33,23,9,88]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickAccessController=void 0;let g=class extends N.Disposable{constructor(c,o){super();this.quickInputService=c,this.instantiationService=o,this.registry=w.Registry.as(M.Extensions.Quickaccess),this.mapProviderToDescriptor=new Map,this.lastAcceptedPickerValues=new Map,this.visibleQuickAccess=void 0}show(c="",o){var s;const[a,u]=this.getOrInstantiateProvider(c),r=this.visibleQuickAccess,i=r==null?void 0:r.descriptor;if(r&&u&&i===u){c!==u.prefix&&!(o==null?void 0:o.preserveValue)&&(r.picker.value=c),this.adjustValueSelection(r.picker,u,o);return}if(u&&!(o==null?void 0:o.preserveValue)){let h;if(r&&i&&i!==u){const m=r.value.substr(i.prefix.length);m&&(h=`${u.prefix}${m}`)}if(!h){const m=a==null?void 0:a.defaultFilterValue;m===M.DefaultQuickAccessFilterValue.LAST?h=this.lastAcceptedPickerValues.get(u):typeof m=="string"&&(h=`${u.prefix}${m}`)}typeof h=="string"&&(c=h)}const n=new N.DisposableStore,t=n.add(this.quickInputService.createQuickPick());t.value=c,this.adjustValueSelection(t,u,o),t.placeholder=u==null?void 0:u.placeholder,t.quickNavigate=o==null?void 0:o.quickNavigateConfiguration,t.hideInput=!!t.quickNavigate&&!r,(typeof(o==null?void 0:o.itemActivation)=="number"||(o==null?void 0:o.quickNavigateConfiguration))&&(t.itemActivation=(s=o==null?void 0:o.itemActivation)!==null&&s!==void 0?s:b.ItemActivation.SECOND),t.contextKey=u==null?void 0:u.contextKey,t.filterValue=h=>h.substring(u?u.prefix.length:0),(u==null?void 0:u.placeholder)&&(t.ariaLabel=u==null?void 0:u.placeholder);const l=this.registerPickerListeners(t,a,u,c,n);a&&n.add(a.provide(t,l)),t.show()}adjustValueSelection(c,o,s){var a;let u;(s==null?void 0:s.preserveValue)?u=[c.value.length,c.value.length]:u=[(a=o==null?void 0:o.prefix.length)!==null&&a!==void 0?a:0,c.value.length],c.valueSelection=u}registerPickerListeners(c,o,s,a,u){const r=this.visibleQuickAccess={picker:c,descriptor:s,value:a};u.add(N.toDisposable(()=>{r===this.visibleQuickAccess&&(this.visibleQuickAccess=void 0)})),u.add(c.onDidChangeValue(n=>{const[t]=this.getOrInstantiateProvider(n);t!==o?this.show(n,{preserveValue:!0}):r.value=n})),s&&u.add(c.onDidAccept(()=>{this.lastAcceptedPickerValues.set(s,c.value)}));const i=u.add(new S.CancellationTokenSource);return d.once(c.onDidHide)(()=>{c.selectedItems.length===0&&i.cancel(),u.dispose()}),i.token}getOrInstantiateProvider(c){const o=this.registry.getQuickAccessProvider(c);if(!o)return[void 0,void 0];let s=this.mapProviderToDescriptor.get(o);return s||(s=this.instantiationService.createInstance(o.ctor),this.mapProviderToDescriptor.set(o,s)),[s,o]}};g=Me([_e(0,b.IQuickInputService),_e(1,C.IInstantiationService)],g),e.QuickAccessController=g}),define(Q[79],J([0,1,9,6,2,20,293]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryStorageService=e.AbstractStorageService=e.WillSaveStateReason=e.IStorageService=void 0;const C="__$__targetStorageMarker";e.IStorageService=b.createDecorator("storageService");var d;(function(c){c[c.NONE=0]="NONE",c[c.SHUTDOWN=1]="SHUTDOWN"})(d=e.WillSaveStateReason||(e.WillSaveStateReason={}));class g extends M.Disposable{constructor(o={flushInterval:g.DEFAULT_FLUSH_INTERVAL}){super();this.options=o,this._onDidChangeValue=this._register(new N.PauseableEmitter),this._onDidChangeTarget=this._register(new N.PauseableEmitter),this._onWillSaveState=this._register(new N.Emitter),this.onWillSaveState=this._onWillSaveState.event,this._workspaceKeyTargets=void 0,this._globalKeyTargets=void 0}emitDidChangeValue(o,s){s===C?(o===0?this._globalKeyTargets=void 0:o===1&&(this._workspaceKeyTargets=void 0),this._onDidChangeTarget.fire({scope:o})):this._onDidChangeValue.fire({scope:o,key:s,target:this.getKeyTargets(o)[s]})}get(o,s,a){var u;return(u=this.getStorage(s))===null||u===void 0?void 0:u.get(o,a)}getBoolean(o,s,a){var u;return(u=this.getStorage(s))===null||u===void 0?void 0:u.getBoolean(o,a)}getNumber(o,s,a){var u;return(u=this.getStorage(s))===null||u===void 0?void 0:u.getNumber(o,a)}store(o,s,a,u){if(w.isUndefinedOrNull(s)){this.remove(o,a);return}this.withPausedEmitters(()=>{var r;this.updateKeyTarget(o,a,u),(r=this.getStorage(a))===null||r===void 0||r.set(o,s)})}remove(o,s){this.withPausedEmitters(()=>{var a;this.updateKeyTarget(o,s,void 0),(a=this.getStorage(s))===null||a===void 0||a.delete(o)})}withPausedEmitters(o){this._onDidChangeValue.pause(),this._onDidChangeTarget.pause();try{o()}finally{this._onDidChangeValue.resume(),this._onDidChangeTarget.resume()}}updateKeyTarget(o,s,a){var u,r;const i=this.getKeyTargets(s);typeof a=="number"?i[o]!==a&&(i[o]=a,(u=this.getStorage(s))===null||u===void 0||u.set(C,JSON.stringify(i))):typeof i[o]=="number"&&(delete i[o],(r=this.getStorage(s))===null||r===void 0||r.set(C,JSON.stringify(i)))}get workspaceKeyTargets(){return this._workspaceKeyTargets||(this._workspaceKeyTargets=this.loadKeyTargets(1)),this._workspaceKeyTargets}get globalKeyTargets(){return this._globalKeyTargets||(this._globalKeyTargets=this.loadKeyTargets(0)),this._globalKeyTargets}getKeyTargets(o){return o===0?this.globalKeyTargets:this.workspaceKeyTargets}loadKeyTargets(o){const s=this.get(C,o);if(s)try{return JSON.parse(s)}catch(a){}return Object.create(null)}}e.AbstractStorageService=g,g.DEFAULT_FLUSH_INTERVAL=60*1e3;class p extends g{constructor(){super();this.globalStorage=new S.Storage(new S.InMemoryStorageDatabase),this.workspaceStorage=new S.Storage(new S.InMemoryStorageDatabase),this._register(this.workspaceStorage.onDidChangeStorage(o=>this.emitDidChangeValue(1,o))),this._register(this.globalStorage.onDidChangeStorage(o=>this.emitDidChangeValue(0,o)))}getStorage(o){return o===0?this.globalStorage:this.workspaceStorage}}e.InMemoryStorageService=p}),define(Q[575],J([0,1,9,74,248,51,79,3,15,88]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensCache=e.ICodeLensCache=void 0,e.ICodeLensCache=b.createDecorator("ICodeLensCache");class p{constructor(s,a){this.lineCount=s,this.data=a}}let c=class{constructor(s){this._fakeProvider=new class{provideCodeLenses(){throw new Error("not supported")}},this._cache=new w.LRUCache(20,.75);const a="codelens/cache";d.runWhenIdle(()=>s.remove(a,1));const u="codelens/cache2",r=s.get(u,1,"{}");this._deserialize(r),g.once(s.onWillSaveState)(i=>{i.reason===S.WillSaveStateReason.SHUTDOWN&&s.store(u,this._serialize(),1,1)})}put(s,a){const u=a.lenses.map(n=>{var t;return{range:n.symbol.range,command:n.symbol.command&&{id:"",title:(t=n.symbol.command)===null||t===void 0?void 0:t.title}}}),r=new M.CodeLensModel;r.add({lenses:u,dispose:()=>{}},this._fakeProvider);const i=new p(s.getLineCount(),r);this._cache.set(s.uri.toString(),i)}get(s){const a=this._cache.get(s.uri.toString());return a&&a.lineCount===s.getLineCount()?a.data:void 0}delete(s){this._cache.delete(s.uri.toString())}_serialize(){const s=Object.create(null);for(const[a,u]of this._cache){const r=new Set;for(const i of u.data.lenses)r.add(i.symbol.range.startLineNumber);s[a]={lineCount:u.lineCount,lines:[...r.values()]}}return JSON.stringify(s)}_deserialize(s){try{const a=JSON.parse(s);for(const u in a){const r=a[u],i=[];for(const t of r.lines)i.push({range:new C.Range(t,1,t,11)});const n=new M.CodeLensModel;n.add({lenses:i,dispose(){}},this._fakeProvider),this._cache.set(u,new p(r.lineCount,n))}}catch(a){}}};c=Me([_e(0,S.IStorageService)],c),e.CodeLensCache=c,N.registerSingleton(e.ICodeLensCache,c)}),define(Q[576],J([0,1,51,79,18,2,15,9,46,74,57]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ISuggestMemoryService=e.SuggestMemoryService=e.PrefixMemory=e.LRUMemory=e.NoMemory=e.Memory=void 0;class c{constructor(i){this.name=i}select(i,n,t){if(t.length===0)return 0;let l=t[0].score[0];for(let h=0;hf&&L.type===t[v].completion.kind&&L.insertText===t[v].completion.insertText&&(f=L.touch,_=v),t[v].completion.preselect&&m===-1)return m=v}return _!==-1?_:m!==-1?m:0}toJSON(){return this._cache.toJSON()}fromJSON(i){this._cache.clear();let n=0;for(const[t,l]of i)l.touch=n,l.type=typeof l.type=="number"?l.type:M.completionKindFromString(l.type),this._cache.set(t,l);this._seq=this._cache.size}}e.LRUMemory=s;class a extends c{constructor(){super("recentlyUsedByPrefix");this._trie=b.TernarySearchTree.forStrings(),this._seq=0}memorize(i,n,t){const{word:l}=i.getWordUntilPosition(n),h=`${i.getLanguageIdentifier().language}/${l}`;this._trie.set(h,{type:t.completion.kind,insertText:t.completion.insertText,touch:this._seq++})}select(i,n,t){let{word:l}=i.getWordUntilPosition(n);if(!l)return super.select(i,n,t);let h=`${i.getLanguageIdentifier().language}/${l}`,m=this._trie.get(h);if(m||(m=this._trie.findSubstr(h)),m)for(let _=0;_i.push([t,n])),i.sort((n,t)=>-(n[1].touch-t[1].touch)).forEach((n,t)=>n[1].touch=t),i.slice(0,200)}fromJSON(i){if(this._trie.clear(),i.length>0){this._seq=i[0][1].touch+1;for(const[n,t]of i)t.type=typeof t.type=="number"?t.type:M.completionKindFromString(t.type),this._trie.set(n,t)}}}e.PrefixMemory=a;let u=class dt{constructor(i,n,t){this._storageService=i,this._modeService=n,this._configService=t,this._disposables=new w.DisposableStore,this._persistSoon=new S.RunOnceScheduler(()=>this._saveState(),500),this._disposables.add(i.onWillSaveState(l=>{l.reason===N.WillSaveStateReason.SHUTDOWN&&this._saveState()}))}dispose(){this._disposables.dispose(),this._persistSoon.dispose()}memorize(i,n,t){this._withStrategy(i,n).memorize(i,n,t),this._persistSoon.schedule()}select(i,n,t){return this._withStrategy(i,n).select(i,n,t)}_withStrategy(i,n){var t,l;const h=this._configService.getValue("editor.suggestSelection",{overrideIdentifier:(t=this._modeService.getLanguageIdentifier(i.getLanguageIdAtPosition(n.lineNumber,n.column)))===null||t===void 0?void 0:t.language,resource:i.uri});if(((l=this._strategy)===null||l===void 0?void 0:l.name)!==h){this._saveState();const m=dt._strategyCtors.get(h)||o;this._strategy=new m;try{const f=this._configService.getValue("editor.suggest.shareSuggestSelections")?0:1,v=this._storageService.get(`${dt._storagePrefix}/${h}`,f);v&&this._strategy.fromJSON(JSON.parse(v))}catch(_){}}return this._strategy}_saveState(){if(this._strategy){const n=this._configService.getValue("editor.suggest.shareSuggestSelections")?0:1,t=JSON.stringify(this._strategy);this._storageService.store(`${dt._storagePrefix}/${this._strategy.name}`,t,n,1)}}};u._strategyCtors=new Map([["recentlyUsedByPrefix",a],["recentlyUsed",s],["first",o]]),u._storagePrefix="suggest/memories",u=Me([_e(0,N.IStorageService),_e(1,p.IModeService),_e(2,d.IConfigurationService)],u),e.SuggestMemoryService=u,e.ISuggestMemoryService=C.createDecorator("ISuggestMemories"),g.registerSingleton(e.ISuggestMemoryService,u,!0)}),define(Q[87],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITelemetryService=void 0,e.ITelemetryService=b.createDecorator("telemetryService")}),define(Q[577],J([0,1,525,561,2,66,20,51,79,46,9,37,26,87,12,32,437]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommandsHistory=e.AbstractCommandsQuickAccessProvider=void 0;let i=class ut extends N.PickerQuickAccessProvider{constructor(l,h,m,_,f,v){super(ut.PREFIX,l);this.options=l,this.instantiationService=h,this.keybindingService=m,this.commandService=_,this.telemetryService=f,this.notificationService=v,this.commandsHistory=this._register(this.instantiationService.createInstance(n))}getPicks(l,h,m){return Ie(this,void 0,void 0,function*(){const _=yield this.getCommandPicks(h,m);if(m.isCancellationRequested)return[];const f=[];for(const I of _){const k=S.withNullAsUndefined(ut.WORD_FILTER(l,I.label)),E=I.commandAlias?S.withNullAsUndefined(ut.WORD_FILTER(l,I.commandAlias)):void 0;k||E?(I.highlights={label:k,detail:this.options.showAlias?E:void 0},f.push(I)):l===I.commandId&&f.push(I)}const v=new Map;for(const I of f){const k=v.get(I.label);k?(I.description=I.commandId,k.description=k.commandId):v.set(I.label,I)}f.sort((I,k)=>{const E=this.commandsHistory.peek(I.commandId),T=this.commandsHistory.peek(k.commandId);return E&&T?E>T?-1:1:E?-1:T?1:I.label.localeCompare(k.label)});const y=[];let L=!1;for(let I=0;IIe(this,void 0,void 0,function*(){this.commandsHistory.push(k.commandId),this.telemetryService.publicLog2("workbenchActionExecuted",{id:k.commandId,from:"quick open"});try{yield this.commandService.executeCommand(k.commandId)}catch(O){a.isPromiseCanceledError(O)||this.notificationService.error(b.localize(3,null,k.label,r.toErrorMessage(O)))}})}))}return y})}};i.PREFIX=">",i.WORD_FILTER=w.or(w.matchesPrefix,w.matchesWords,w.matchesContiguousSubString),i=Me([_e(1,p.IInstantiationService),_e(2,c.IKeybindingService),_e(3,o.ICommandService),_e(4,s.ITelemetryService),_e(5,u.INotificationService)],i),e.AbstractCommandsQuickAccessProvider=i;let n=class qe extends M.Disposable{constructor(l,h){super();this.storageService=l,this.configurationService=h,this.configuredCommandsHistoryLength=0,this.updateConfiguration(),this.load(),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(()=>this.updateConfiguration()))}updateConfiguration(){this.configuredCommandsHistoryLength=qe.getConfiguredCommandHistoryLength(this.configurationService),qe.cache&&qe.cache.limit!==this.configuredCommandsHistoryLength&&(qe.cache.limit=this.configuredCommandsHistoryLength,qe.saveState(this.storageService))}load(){const l=this.storageService.get(qe.PREF_KEY_CACHE,0);let h;if(l)try{h=JSON.parse(l)}catch(_){}const m=qe.cache=new C.LRUCache(this.configuredCommandsHistoryLength,1);if(h){let _;h.usesLRU?_=h.entries:_=h.entries.sort((f,v)=>f.value-v.value),_.forEach(f=>m.set(f.key,f.value))}qe.counter=this.storageService.getNumber(qe.PREF_KEY_COUNTER,0,qe.counter)}push(l){!qe.cache||(qe.cache.set(l,qe.counter++),qe.saveState(this.storageService))}peek(l){var h;return(h=qe.cache)===null||h===void 0?void 0:h.peek(l)}static saveState(l){if(!!qe.cache){const h={usesLRU:!0,entries:[]};qe.cache.forEach((m,_)=>h.entries.push({key:_,value:m})),l.store(qe.PREF_KEY_CACHE,JSON.stringify(h),0,0),l.store(qe.PREF_KEY_COUNTER,qe.counter,0,0)}}static getConfiguredCommandHistoryLength(l){var h,m;const f=(m=(h=l.getValue().workbench)===null||h===void 0?void 0:h.commandPalette)===null||m===void 0?void 0:m.history;return typeof f=="number"?f:qe.DEFAULT_COMMANDS_HISTORY_LENGTH}};n.DEFAULT_COMMANDS_HISTORY_LENGTH=50,n.PREF_KEY_CACHE="commandPalette.mru.cache",n.PREF_KEY_COUNTER="commandPalette.mru.counter",n.counter=1,n=Me([_e(0,d.IStorageService),_e(1,g.IConfigurationService)],n),e.CommandsHistory=n}),define(Q[578],J([0,1,577,102]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEditorCommandsQuickAccessProvider=void 0;class M extends b.AbstractCommandsQuickAccessProvider{constructor(S,C,d,g,p,c){super(S,C,d,g,p,c)}getCodeEditorCommandPicks(){const S=this.activeTextEditorControl;if(!S)return[];const C=[];for(const d of S.getSupportedActions())C.push({commandId:d.id,commandAlias:d.alias,label:N.stripIcons(d.label)||d.id});return C}}e.AbstractEditorCommandsQuickAccessProvider=M}),define(Q[22],J([0,1,33,29,6,527,185,15]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.workbenchColorsSchemaId=e.resolveColorValue=e.oneOf=e.transparent=e.lighten=e.darken=e.problemsInfoIconForeground=e.problemsWarningIconForeground=e.problemsErrorIconForeground=e.minimapSliderActiveBackground=e.minimapSliderHoverBackground=e.minimapSliderBackground=e.minimapBackground=e.minimapWarning=e.minimapError=e.minimapSelection=e.minimapFindMatch=e.overviewRulerSelectionHighlightForeground=e.overviewRulerFindMatchForeground=e.snippetFinalTabstopHighlightBorder=e.snippetFinalTabstopHighlightBackground=e.snippetTabstopHighlightBorder=e.snippetTabstopHighlightBackground=e.menuSeparatorBackground=e.menuSelectionBorder=e.menuSelectionBackground=e.menuSelectionForeground=e.menuBackground=e.menuForeground=e.menuBorder=e.tableColumnsBorder=e.treeIndentGuidesStroke=e.listFilterWidgetNoMatchesOutline=e.listFilterWidgetOutline=e.listFilterWidgetBackground=e.listHighlightForeground=e.listDropBackground=e.listHoverForeground=e.listHoverBackground=e.listInactiveFocusOutline=e.listInactiveFocusBackground=e.listInactiveSelectionForeground=e.listInactiveSelectionBackground=e.listActiveSelectionForeground=e.listActiveSelectionBackground=e.listFocusOutline=e.listFocusForeground=e.listFocusBackground=e.diffDiagonalFill=e.diffBorder=e.diffRemovedOutline=e.diffInsertedOutline=e.diffRemoved=e.diffInserted=e.defaultRemoveColor=e.defaultInsertColor=e.editorLightBulbAutoFixForeground=e.editorLightBulbForeground=e.editorInlineHintBackground=e.editorInlineHintForeground=e.editorActiveLinkForeground=e.editorHoverStatusBarBackground=e.editorHoverBorder=e.editorHoverForeground=e.editorHoverBackground=e.editorHoverHighlight=e.editorFindRangeHighlightBorder=e.editorFindMatchHighlightBorder=e.editorFindMatchBorder=e.editorFindRangeHighlight=e.editorFindMatchHighlight=e.editorFindMatch=e.editorSelectionHighlightBorder=e.editorSelectionHighlight=e.editorInactiveSelection=e.editorSelectionForeground=e.editorSelectionBackground=e.pickerGroupBorder=e.pickerGroupForeground=e.quickInputListFocusBackground=e.quickInputTitleBackground=e.quickInputForeground=e.quickInputBackground=e.editorWidgetResizeBorder=e.editorWidgetBorder=e.editorWidgetForeground=e.editorWidgetBackground=e.editorForeground=e.editorBackground=e.editorHintBorder=e.editorHintForeground=e.editorInfoBorder=e.editorInfoForeground=e.editorInfoBackground=e.editorWarningBorder=e.editorWarningForeground=e.editorWarningBackground=e.editorErrorBorder=e.editorErrorForeground=e.editorErrorBackground=e.progressBarBackground=e.scrollbarSliderActiveBackground=e.scrollbarSliderHoverBackground=e.scrollbarSliderBackground=e.scrollbarShadow=e.badgeForeground=e.badgeBackground=e.buttonHoverBackground=e.buttonBackground=e.buttonForeground=e.selectForeground=e.selectBackground=e.inputValidationErrorBorder=e.inputValidationErrorForeground=e.inputValidationErrorBackground=e.inputValidationWarningBorder=e.inputValidationWarningForeground=e.inputValidationWarningBackground=e.inputValidationInfoBorder=e.inputValidationInfoForeground=e.inputValidationInfoBackground=e.inputActiveOptionForeground=e.inputActiveOptionBackground=e.inputActiveOptionBorder=e.inputBorder=e.inputForeground=e.inputBackground=e.widgetShadow=e.textCodeBlockBackground=e.textLinkForeground=e.activeContrastBorder=e.contrastBorder=e.focusBorder=e.iconForeground=e.errorForeground=e.foreground=e.registerColor=e.Extensions=void 0,e.Extensions={ColorContribution:"base.contributions.colors"};class d{constructor(){this._onDidChangeSchema=new M.Emitter,this.onDidChangeSchema=this._onDidChangeSchema.event,this.colorSchema={type:"object",properties:{}},this.colorReferenceSchema={type:"string",enum:[],enumDescriptions:[]},this.colorsById={}}registerColor(l,h,m,_=!1,f){let v={id:l,description:m,defaults:h,needsTransparency:_,deprecationMessage:f};this.colorsById[l]=v;let y={type:"string",description:m,format:"color-hex",defaultSnippets:[{body:"${1:#ff0000}"}]};return f&&(y.deprecationMessage=f),this.colorSchema.properties[l]=y,this.colorReferenceSchema.enum.push(l),this.colorReferenceSchema.enumDescriptions.push(m),this._onDidChangeSchema.fire(),l}resolveDefaultColor(l,h){const m=this.colorsById[l];if(m&&m.defaults){const _=m.defaults[h.type];return r(_,h)}}getColorSchema(){return this.colorSchema}toString(){let l=(h,m)=>{let _=h.indexOf(".")===-1?0:1,f=m.indexOf(".")===-1?0:1;return _!==f?_-f:h.localeCompare(m)};return Object.keys(this.colorsById).sort(l).map(h=>`- \`${h}\`: ${this.colorsById[h].description}`).join(` +`)}}const g=new d;b.Registry.add(e.Extensions.ColorContribution,g);function p(t,l,h,m,_){return g.registerColor(t,l,h,m,_)}e.registerColor=p,e.foreground=p("foreground",{dark:"#CCCCCC",light:"#616161",hc:"#FFFFFF"},w.localize(0,null)),e.errorForeground=p("errorForeground",{dark:"#F48771",light:"#A1260D",hc:"#F48771"},w.localize(1,null)),e.iconForeground=p("icon.foreground",{dark:"#C5C5C5",light:"#424242",hc:"#FFFFFF"},w.localize(2,null)),e.focusBorder=p("focusBorder",{dark:"#007FD4",light:"#0090F1",hc:"#F38518"},w.localize(3,null)),e.contrastBorder=p("contrastBorder",{light:null,dark:null,hc:"#6FC3DF"},w.localize(4,null)),e.activeContrastBorder=p("contrastActiveBorder",{light:null,dark:null,hc:e.focusBorder},w.localize(5,null)),e.textLinkForeground=p("textLink.foreground",{light:"#006AB1",dark:"#3794FF",hc:"#3794FF"},w.localize(6,null)),e.textCodeBlockBackground=p("textCodeBlock.background",{light:"#dcdcdc66",dark:"#0a0a0a66",hc:N.Color.black},w.localize(7,null)),e.widgetShadow=p("widget.shadow",{dark:s(N.Color.black,.36),light:s(N.Color.black,.16),hc:null},w.localize(8,null)),e.inputBackground=p("input.background",{dark:"#3C3C3C",light:N.Color.white,hc:N.Color.black},w.localize(9,null)),e.inputForeground=p("input.foreground",{dark:e.foreground,light:e.foreground,hc:e.foreground},w.localize(10,null)),e.inputBorder=p("input.border",{dark:null,light:null,hc:e.contrastBorder},w.localize(11,null)),e.inputActiveOptionBorder=p("inputOption.activeBorder",{dark:"#007ACC00",light:"#007ACC00",hc:e.contrastBorder},w.localize(12,null)),e.inputActiveOptionBackground=p("inputOption.activeBackground",{dark:s(e.focusBorder,.4),light:s(e.focusBorder,.2),hc:N.Color.transparent},w.localize(13,null)),e.inputActiveOptionForeground=p("inputOption.activeForeground",{dark:N.Color.white,light:N.Color.black,hc:null},w.localize(14,null)),e.inputValidationInfoBackground=p("inputValidation.infoBackground",{dark:"#063B49",light:"#D6ECF2",hc:N.Color.black},w.localize(15,null)),e.inputValidationInfoForeground=p("inputValidation.infoForeground",{dark:null,light:null,hc:null},w.localize(16,null)),e.inputValidationInfoBorder=p("inputValidation.infoBorder",{dark:"#007acc",light:"#007acc",hc:e.contrastBorder},w.localize(17,null)),e.inputValidationWarningBackground=p("inputValidation.warningBackground",{dark:"#352A05",light:"#F6F5D2",hc:N.Color.black},w.localize(18,null)),e.inputValidationWarningForeground=p("inputValidation.warningForeground",{dark:null,light:null,hc:null},w.localize(19,null)),e.inputValidationWarningBorder=p("inputValidation.warningBorder",{dark:"#B89500",light:"#B89500",hc:e.contrastBorder},w.localize(20,null)),e.inputValidationErrorBackground=p("inputValidation.errorBackground",{dark:"#5A1D1D",light:"#F2DEDE",hc:N.Color.black},w.localize(21,null)),e.inputValidationErrorForeground=p("inputValidation.errorForeground",{dark:null,light:null,hc:null},w.localize(22,null)),e.inputValidationErrorBorder=p("inputValidation.errorBorder",{dark:"#BE1100",light:"#BE1100",hc:e.contrastBorder},w.localize(23,null)),e.selectBackground=p("dropdown.background",{dark:"#3C3C3C",light:N.Color.white,hc:N.Color.black},w.localize(24,null)),e.selectForeground=p("dropdown.foreground",{dark:"#F0F0F0",light:null,hc:N.Color.white},w.localize(25,null)),e.buttonForeground=p("button.foreground",{dark:N.Color.white,light:N.Color.white,hc:N.Color.white},w.localize(26,null)),e.buttonBackground=p("button.background",{dark:"#0E639C",light:"#007ACC",hc:null},w.localize(27,null)),e.buttonHoverBackground=p("button.hoverBackground",{dark:o(e.buttonBackground,.2),light:c(e.buttonBackground,.2),hc:null},w.localize(28,null)),e.badgeBackground=p("badge.background",{dark:"#4D4D4D",light:"#C4C4C4",hc:N.Color.black},w.localize(29,null)),e.badgeForeground=p("badge.foreground",{dark:N.Color.white,light:"#333",hc:N.Color.white},w.localize(30,null)),e.scrollbarShadow=p("scrollbar.shadow",{dark:"#000000",light:"#DDDDDD",hc:null},w.localize(31,null)),e.scrollbarSliderBackground=p("scrollbarSlider.background",{dark:N.Color.fromHex("#797979").transparent(.4),light:N.Color.fromHex("#646464").transparent(.4),hc:s(e.contrastBorder,.6)},w.localize(32,null)),e.scrollbarSliderHoverBackground=p("scrollbarSlider.hoverBackground",{dark:N.Color.fromHex("#646464").transparent(.7),light:N.Color.fromHex("#646464").transparent(.7),hc:s(e.contrastBorder,.8)},w.localize(33,null)),e.scrollbarSliderActiveBackground=p("scrollbarSlider.activeBackground",{dark:N.Color.fromHex("#BFBFBF").transparent(.4),light:N.Color.fromHex("#000000").transparent(.6),hc:e.contrastBorder},w.localize(34,null)),e.progressBarBackground=p("progressBar.background",{dark:N.Color.fromHex("#0E70C0"),light:N.Color.fromHex("#0E70C0"),hc:e.contrastBorder},w.localize(35,null)),e.editorErrorBackground=p("editorError.background",{dark:null,light:null,hc:null},w.localize(36,null),!0),e.editorErrorForeground=p("editorError.foreground",{dark:"#F48771",light:"#E51400",hc:null},w.localize(37,null)),e.editorErrorBorder=p("editorError.border",{dark:null,light:null,hc:N.Color.fromHex("#E47777").transparent(.8)},w.localize(38,null)),e.editorWarningBackground=p("editorWarning.background",{dark:null,light:null,hc:null},w.localize(39,null),!0),e.editorWarningForeground=p("editorWarning.foreground",{dark:"#CCA700",light:"#BF8803",hc:null},w.localize(40,null)),e.editorWarningBorder=p("editorWarning.border",{dark:null,light:null,hc:N.Color.fromHex("#FFCC00").transparent(.8)},w.localize(41,null)),e.editorInfoBackground=p("editorInfo.background",{dark:null,light:null,hc:null},w.localize(42,null),!0),e.editorInfoForeground=p("editorInfo.foreground",{dark:"#75BEFF",light:"#75BEFF",hc:null},w.localize(43,null)),e.editorInfoBorder=p("editorInfo.border",{dark:null,light:null,hc:N.Color.fromHex("#75BEFF").transparent(.8)},w.localize(44,null)),e.editorHintForeground=p("editorHint.foreground",{dark:N.Color.fromHex("#eeeeee").transparent(.7),light:"#6c6c6c",hc:null},w.localize(45,null)),e.editorHintBorder=p("editorHint.border",{dark:null,light:null,hc:N.Color.fromHex("#eeeeee").transparent(.8)},w.localize(46,null)),e.editorBackground=p("editor.background",{light:"#fffffe",dark:"#1E1E1E",hc:N.Color.black},w.localize(47,null)),e.editorForeground=p("editor.foreground",{light:"#333333",dark:"#BBBBBB",hc:N.Color.white},w.localize(48,null)),e.editorWidgetBackground=p("editorWidget.background",{dark:"#252526",light:"#F3F3F3",hc:"#0C141F"},w.localize(49,null)),e.editorWidgetForeground=p("editorWidget.foreground",{dark:e.foreground,light:e.foreground,hc:e.foreground},w.localize(50,null)),e.editorWidgetBorder=p("editorWidget.border",{dark:"#454545",light:"#C8C8C8",hc:e.contrastBorder},w.localize(51,null)),e.editorWidgetResizeBorder=p("editorWidget.resizeBorder",{light:null,dark:null,hc:null},w.localize(52,null)),e.quickInputBackground=p("quickInput.background",{dark:e.editorWidgetBackground,light:e.editorWidgetBackground,hc:e.editorWidgetBackground},w.localize(53,null)),e.quickInputForeground=p("quickInput.foreground",{dark:e.editorWidgetForeground,light:e.editorWidgetForeground,hc:e.editorWidgetForeground},w.localize(54,null)),e.quickInputTitleBackground=p("quickInputTitle.background",{dark:new N.Color(new N.RGBA(255,255,255,.105)),light:new N.Color(new N.RGBA(0,0,0,.06)),hc:"#000000"},w.localize(55,null)),e.quickInputListFocusBackground=p("quickInput.list.focusBackground",{dark:"#062F4A",light:"#D6EBFF",hc:null},w.localize(56,null)),e.pickerGroupForeground=p("pickerGroup.foreground",{dark:"#3794FF",light:"#0066BF",hc:N.Color.white},w.localize(57,null)),e.pickerGroupBorder=p("pickerGroup.border",{dark:"#3F3F46",light:"#CCCEDB",hc:N.Color.white},w.localize(58,null)),e.editorSelectionBackground=p("editor.selectionBackground",{light:"#ADD6FF",dark:"#264F78",hc:"#f3f518"},w.localize(59,null)),e.editorSelectionForeground=p("editor.selectionForeground",{light:null,dark:null,hc:"#000000"},w.localize(60,null)),e.editorInactiveSelection=p("editor.inactiveSelectionBackground",{light:s(e.editorSelectionBackground,.5),dark:s(e.editorSelectionBackground,.5),hc:s(e.editorSelectionBackground,.5)},w.localize(61,null),!0),e.editorSelectionHighlight=p("editor.selectionHighlightBackground",{light:u(e.editorSelectionBackground,e.editorBackground,.3,.6),dark:u(e.editorSelectionBackground,e.editorBackground,.3,.6),hc:null},w.localize(62,null),!0),e.editorSelectionHighlightBorder=p("editor.selectionHighlightBorder",{light:null,dark:null,hc:e.activeContrastBorder},w.localize(63,null)),e.editorFindMatch=p("editor.findMatchBackground",{light:"#A8AC94",dark:"#515C6A",hc:null},w.localize(64,null)),e.editorFindMatchHighlight=p("editor.findMatchHighlightBackground",{light:"#EA5C0055",dark:"#EA5C0055",hc:null},w.localize(65,null),!0),e.editorFindRangeHighlight=p("editor.findRangeHighlightBackground",{dark:"#3a3d4166",light:"#b4b4b44d",hc:null},w.localize(66,null),!0),e.editorFindMatchBorder=p("editor.findMatchBorder",{light:null,dark:null,hc:e.activeContrastBorder},w.localize(67,null)),e.editorFindMatchHighlightBorder=p("editor.findMatchHighlightBorder",{light:null,dark:null,hc:e.activeContrastBorder},w.localize(68,null)),e.editorFindRangeHighlightBorder=p("editor.findRangeHighlightBorder",{dark:null,light:null,hc:s(e.activeContrastBorder,.4)},w.localize(69,null),!0),e.editorHoverHighlight=p("editor.hoverHighlightBackground",{light:"#ADD6FF26",dark:"#264f7840",hc:"#ADD6FF26"},w.localize(70,null),!0),e.editorHoverBackground=p("editorHoverWidget.background",{light:e.editorWidgetBackground,dark:e.editorWidgetBackground,hc:e.editorWidgetBackground},w.localize(71,null)),e.editorHoverForeground=p("editorHoverWidget.foreground",{light:e.editorWidgetForeground,dark:e.editorWidgetForeground,hc:e.editorWidgetForeground},w.localize(72,null)),e.editorHoverBorder=p("editorHoverWidget.border",{light:e.editorWidgetBorder,dark:e.editorWidgetBorder,hc:e.editorWidgetBorder},w.localize(73,null)),e.editorHoverStatusBarBackground=p("editorHoverWidget.statusBarBackground",{dark:o(e.editorHoverBackground,.2),light:c(e.editorHoverBackground,.05),hc:e.editorWidgetBackground},w.localize(74,null)),e.editorActiveLinkForeground=p("editorLink.activeForeground",{dark:"#4E94CE",light:N.Color.blue,hc:N.Color.cyan},w.localize(75,null)),e.editorInlineHintForeground=p("editorInlineHint.foreground",{dark:e.editorWidgetBackground,light:e.editorWidgetForeground,hc:e.editorWidgetBackground},w.localize(76,null)),e.editorInlineHintBackground=p("editorInlineHint.background",{dark:e.editorWidgetForeground,light:e.editorWidgetBackground,hc:e.editorWidgetForeground},w.localize(77,null)),e.editorLightBulbForeground=p("editorLightBulb.foreground",{dark:"#FFCC00",light:"#DDB100",hc:"#FFCC00"},w.localize(78,null)),e.editorLightBulbAutoFixForeground=p("editorLightBulbAutoFix.foreground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},w.localize(79,null)),e.defaultInsertColor=new N.Color(new N.RGBA(155,185,85,.2)),e.defaultRemoveColor=new N.Color(new N.RGBA(255,0,0,.2)),e.diffInserted=p("diffEditor.insertedTextBackground",{dark:e.defaultInsertColor,light:e.defaultInsertColor,hc:null},w.localize(80,null),!0),e.diffRemoved=p("diffEditor.removedTextBackground",{dark:e.defaultRemoveColor,light:e.defaultRemoveColor,hc:null},w.localize(81,null),!0),e.diffInsertedOutline=p("diffEditor.insertedTextBorder",{dark:null,light:null,hc:"#33ff2eff"},w.localize(82,null)),e.diffRemovedOutline=p("diffEditor.removedTextBorder",{dark:null,light:null,hc:"#FF008F"},w.localize(83,null)),e.diffBorder=p("diffEditor.border",{dark:null,light:null,hc:e.contrastBorder},w.localize(84,null)),e.diffDiagonalFill=p("diffEditor.diagonalFill",{dark:"#cccccc33",light:"#22222233",hc:null},w.localize(85,null)),e.listFocusBackground=p("list.focusBackground",{dark:null,light:null,hc:null},w.localize(86,null)),e.listFocusForeground=p("list.focusForeground",{dark:null,light:null,hc:null},w.localize(87,null)),e.listFocusOutline=p("list.focusOutline",{dark:e.focusBorder,light:e.focusBorder,hc:e.activeContrastBorder},w.localize(88,null)),e.listActiveSelectionBackground=p("list.activeSelectionBackground",{dark:"#094771",light:"#0060C0",hc:null},w.localize(89,null)),e.listActiveSelectionForeground=p("list.activeSelectionForeground",{dark:N.Color.white,light:N.Color.white,hc:null},w.localize(90,null)),e.listInactiveSelectionBackground=p("list.inactiveSelectionBackground",{dark:"#37373D",light:"#E4E6F1",hc:null},w.localize(91,null)),e.listInactiveSelectionForeground=p("list.inactiveSelectionForeground",{dark:null,light:null,hc:null},w.localize(92,null)),e.listInactiveFocusBackground=p("list.inactiveFocusBackground",{dark:null,light:null,hc:null},w.localize(93,null)),e.listInactiveFocusOutline=p("list.inactiveFocusOutline",{dark:null,light:null,hc:null},w.localize(94,null)),e.listHoverBackground=p("list.hoverBackground",{dark:"#2A2D2E",light:"#F0F0F0",hc:null},w.localize(95,null)),e.listHoverForeground=p("list.hoverForeground",{dark:null,light:null,hc:null},w.localize(96,null)),e.listDropBackground=p("list.dropBackground",{dark:e.listFocusBackground,light:e.listFocusBackground,hc:null},w.localize(97,null)),e.listHighlightForeground=p("list.highlightForeground",{dark:"#0097fb",light:"#0066BF",hc:e.focusBorder},w.localize(98,null)),e.listFilterWidgetBackground=p("listFilterWidget.background",{light:"#efc1ad",dark:"#653723",hc:N.Color.black},w.localize(99,null)),e.listFilterWidgetOutline=p("listFilterWidget.outline",{dark:N.Color.transparent,light:N.Color.transparent,hc:"#f38518"},w.localize(100,null)),e.listFilterWidgetNoMatchesOutline=p("listFilterWidget.noMatchesOutline",{dark:"#BE1100",light:"#BE1100",hc:e.contrastBorder},w.localize(101,null)),e.treeIndentGuidesStroke=p("tree.indentGuidesStroke",{dark:"#585858",light:"#a9a9a9",hc:"#a9a9a9"},w.localize(102,null)),e.tableColumnsBorder=p("tree.tableColumnsBorder",{dark:"#CCCCCC20",light:"#61616120",hc:null},w.localize(103,null)),e.menuBorder=p("menu.border",{dark:null,light:null,hc:e.contrastBorder},w.localize(104,null)),e.menuForeground=p("menu.foreground",{dark:e.selectForeground,light:e.foreground,hc:e.selectForeground},w.localize(105,null)),e.menuBackground=p("menu.background",{dark:e.selectBackground,light:e.selectBackground,hc:e.selectBackground},w.localize(106,null)),e.menuSelectionForeground=p("menu.selectionForeground",{dark:e.listActiveSelectionForeground,light:e.listActiveSelectionForeground,hc:e.listActiveSelectionForeground},w.localize(107,null)),e.menuSelectionBackground=p("menu.selectionBackground",{dark:e.listActiveSelectionBackground,light:e.listActiveSelectionBackground,hc:e.listActiveSelectionBackground},w.localize(108,null)),e.menuSelectionBorder=p("menu.selectionBorder",{dark:null,light:null,hc:e.activeContrastBorder},w.localize(109,null)),e.menuSeparatorBackground=p("menu.separatorBackground",{dark:"#BBBBBB",light:"#888888",hc:e.contrastBorder},w.localize(110,null)),e.snippetTabstopHighlightBackground=p("editor.snippetTabstopHighlightBackground",{dark:new N.Color(new N.RGBA(124,124,124,.3)),light:new N.Color(new N.RGBA(10,50,100,.2)),hc:new N.Color(new N.RGBA(124,124,124,.3))},w.localize(111,null)),e.snippetTabstopHighlightBorder=p("editor.snippetTabstopHighlightBorder",{dark:null,light:null,hc:null},w.localize(112,null)),e.snippetFinalTabstopHighlightBackground=p("editor.snippetFinalTabstopHighlightBackground",{dark:null,light:null,hc:null},w.localize(113,null)),e.snippetFinalTabstopHighlightBorder=p("editor.snippetFinalTabstopHighlightBorder",{dark:"#525252",light:new N.Color(new N.RGBA(10,50,100,.5)),hc:"#525252"},w.localize(114,null)),e.overviewRulerFindMatchForeground=p("editorOverviewRuler.findMatchForeground",{dark:"#d186167e",light:"#d186167e",hc:"#AB5A00"},w.localize(115,null),!0),e.overviewRulerSelectionHighlightForeground=p("editorOverviewRuler.selectionHighlightForeground",{dark:"#A0A0A0CC",light:"#A0A0A0CC",hc:"#A0A0A0CC"},w.localize(116,null),!0),e.minimapFindMatch=p("minimap.findMatchHighlight",{light:"#d18616",dark:"#d18616",hc:"#AB5A00"},w.localize(117,null),!0),e.minimapSelection=p("minimap.selectionHighlight",{light:"#ADD6FF",dark:"#264F78",hc:"#ffffff"},w.localize(118,null),!0),e.minimapError=p("minimap.errorHighlight",{dark:new N.Color(new N.RGBA(255,18,18,.7)),light:new N.Color(new N.RGBA(255,18,18,.7)),hc:new N.Color(new N.RGBA(255,50,50,1))},w.localize(119,null)),e.minimapWarning=p("minimap.warningHighlight",{dark:e.editorWarningForeground,light:e.editorWarningForeground,hc:e.editorWarningBorder},w.localize(120,null)),e.minimapBackground=p("minimap.background",{dark:null,light:null,hc:null},w.localize(121,null)),e.minimapSliderBackground=p("minimapSlider.background",{light:s(e.scrollbarSliderBackground,.5),dark:s(e.scrollbarSliderBackground,.5),hc:s(e.scrollbarSliderBackground,.5)},w.localize(122,null)),e.minimapSliderHoverBackground=p("minimapSlider.hoverBackground",{light:s(e.scrollbarSliderHoverBackground,.5),dark:s(e.scrollbarSliderHoverBackground,.5),hc:s(e.scrollbarSliderHoverBackground,.5)},w.localize(123,null)),e.minimapSliderActiveBackground=p("minimapSlider.activeBackground",{light:s(e.scrollbarSliderActiveBackground,.5),dark:s(e.scrollbarSliderActiveBackground,.5),hc:s(e.scrollbarSliderActiveBackground,.5)},w.localize(124,null)),e.problemsErrorIconForeground=p("problemsErrorIcon.foreground",{dark:e.editorErrorForeground,light:e.editorErrorForeground,hc:e.editorErrorForeground},w.localize(125,null)),e.problemsWarningIconForeground=p("problemsWarningIcon.foreground",{dark:e.editorWarningForeground,light:e.editorWarningForeground,hc:e.editorWarningForeground},w.localize(126,null)),e.problemsInfoIconForeground=p("problemsInfoIcon.foreground",{dark:e.editorInfoForeground,light:e.editorInfoForeground,hc:e.editorInfoForeground},w.localize(127,null));function c(t,l){return h=>{let m=r(t,h);if(m)return m.darken(l)}}e.darken=c;function o(t,l){return h=>{let m=r(t,h);if(m)return m.lighten(l)}}e.lighten=o;function s(t,l){return h=>{let m=r(t,h);if(m)return m.transparent(l)}}e.transparent=s;function a(...t){return l=>{for(let h of t){let m=r(h,l);if(m)return m}}}e.oneOf=a;function u(t,l,h,m){return _=>{let f=r(t,_);if(f){let v=r(l,_);return v?f.isDarkerThan(v)?N.Color.getLighterColor(f,v,h).transparent(m):N.Color.getDarkerColor(f,v,h).transparent(m):f.transparent(h*m)}}}function r(t,l){if(t!==null){if(typeof t=="string")return t[0]==="#"?N.Color.fromHex(t):l.getColor(t);if(t instanceof N.Color)return t;if(typeof t=="function")return t(l)}}e.resolveColorValue=r,e.workbenchColorsSchemaId="vscode://schemas/workbench-colors";let i=b.Registry.as(S.Extensions.JSONContribution);i.registerSchema(e.workbenchColorsSchemaId,g.getColorSchema());const n=new C.RunOnceScheduler(()=>i.notifySchemaChanged(e.workbenchColorsSchemaId),200);g.onDidChangeSchema(()=>{n.isScheduled()||n.schedule()})}),define(Q[116],J([0,1,22]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.attachMenuStyler=e.defaultMenuStyles=e.defaultListStyles=e.attachListStyler=e.attachBadgeStyler=e.attachStyler=e.computeStyles=void 0;function N(d,g){const p=Object.create(null);for(let c in g){const o=g[c];o&&(p[c]=b.resolveColorValue(o,d))}return p}e.computeStyles=N;function M(d,g,p){function c(o){const s=N(d.getColorTheme(),g);typeof p=="function"?p(s):p.style(s)}return c(d.getColorTheme()),d.onDidColorThemeChange(c)}e.attachStyler=M;function w(d,g,p){return M(g,{badgeBackground:p&&p.badgeBackground||b.badgeBackground,badgeForeground:p&&p.badgeForeground||b.badgeForeground,badgeBorder:b.contrastBorder},d)}e.attachBadgeStyler=w;function S(d,g,p){return M(g,Object.assign(Object.assign({},e.defaultListStyles),p||{}),d)}e.attachListStyler=S,e.defaultListStyles={listFocusBackground:b.listFocusBackground,listFocusForeground:b.listFocusForeground,listFocusOutline:b.listFocusOutline,listActiveSelectionBackground:b.listActiveSelectionBackground,listActiveSelectionForeground:b.listActiveSelectionForeground,listFocusAndSelectionBackground:b.listActiveSelectionBackground,listFocusAndSelectionForeground:b.listActiveSelectionForeground,listInactiveSelectionBackground:b.listInactiveSelectionBackground,listInactiveSelectionForeground:b.listInactiveSelectionForeground,listInactiveFocusBackground:b.listInactiveFocusBackground,listInactiveFocusOutline:b.listInactiveFocusOutline,listHoverBackground:b.listHoverBackground,listHoverForeground:b.listHoverForeground,listDropBackground:b.listDropBackground,listSelectionOutline:b.activeContrastBorder,listHoverOutline:b.activeContrastBorder,listFilterWidgetBackground:b.listFilterWidgetBackground,listFilterWidgetOutline:b.listFilterWidgetOutline,listFilterWidgetNoMatchesOutline:b.listFilterWidgetNoMatchesOutline,listMatchesShadow:b.widgetShadow,treeIndentGuidesStroke:b.treeIndentGuidesStroke,tableColumnsBorder:b.tableColumnsBorder},e.defaultMenuStyles={shadowColor:b.widgetShadow,borderColor:b.menuBorder,foregroundColor:b.menuForeground,backgroundColor:b.menuBackground,selectionForegroundColor:b.menuSelectionForeground,selectionBackgroundColor:b.menuSelectionBackground,selectionBorderColor:b.menuSelectionBorder,separatorColor:b.menuSeparatorBackground};function C(d,g,p){return M(g,Object.assign(Object.assign({},e.defaultMenuStyles),p),d)}e.attachMenuStyler=C}),define(Q[579],J([0,1,48,2,434,7,116,55,50,360]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuHandler=void 0;class g{constructor(c,o,s,a,u){this.contextViewService=c,this.telemetryService=o,this.notificationService=s,this.keybindingService=a,this.themeService=u,this.focusToReturn=null,this.block=null,this.options={blockMouse:!0}}configure(c){this.options=c}showContextMenu(c){const o=c.getActions();if(!!o.length){this.focusToReturn=document.activeElement;let s,a=w.isHTMLElement(c.domForShadowRoot)?c.domForShadowRoot:void 0;this.contextViewService.showContextView({getAnchor:()=>c.getAnchor(),canRelayout:!1,anchorAlignment:c.anchorAlignment,anchorAxisAlignment:c.anchorAxisAlignment,render:u=>{let r=c.getMenuClassName?c.getMenuClassName():"";r&&(u.className+=" "+r),this.options.blockMouse&&(this.block=u.appendChild(w.$(".context-view-block")),this.block.style.position="fixed",this.block.style.cursor="initial",this.block.style.left="0",this.block.style.top="0",this.block.style.width="100%",this.block.style.height="100%",this.block.style.zIndex="-1",C.domEvent(this.block,w.EventType.MOUSE_DOWN)(t=>t.stopPropagation()));const i=new N.DisposableStore,n=c.actionRunner||new b.ActionRunner;return n.onBeforeRun(this.onActionRun,this,i),n.onDidRun(this.onDidActionRun,this,i),s=new M.Menu(u,o,{actionViewItemProvider:c.getActionViewItem,context:c.getActionsContext?c.getActionsContext():null,actionRunner:n,getKeyBinding:c.getKeyBinding?c.getKeyBinding:t=>this.keybindingService.lookupKeybinding(t.id)}),i.add(S.attachMenuStyler(s,this.themeService)),s.onDidCancel(()=>this.contextViewService.hideContextView(!0),null,i),s.onDidBlur(()=>this.contextViewService.hideContextView(!0),null,i),C.domEvent(window,w.EventType.BLUR)(()=>{this.contextViewService.hideContextView(!0)},null,i),C.domEvent(window,w.EventType.MOUSE_DOWN)(t=>{if(!t.defaultPrevented){let l=new d.StandardMouseEvent(t),h=l.target;if(!l.rightButton){for(;h;){if(h===u)return;h=h.parentElement}this.contextViewService.hideContextView(!0)}}},null,i),N.combinedDisposable(i,s)},focus:()=>{s&&s.focus(!!c.autoSelectFirstItem)},onHide:u=>{c.onHide&&c.onHide(!!u),this.block&&(this.block.remove(),this.block=null),this.focusToReturn&&this.focusToReturn.focus()}},a,!!a)}}onActionRun(c){this.telemetryService&&this.telemetryService.publicLog2("workbenchActionExecuted",{id:c.action.id,from:"contextMenu"}),this.contextViewService.hideContextView(!1),this.focusToReturn&&this.focusToReturn.focus()}onDidActionRun(c){c.error&&this.notificationService.error(c.error)}}e.ContextMenuHandler=g}),define(Q[97],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorScheme=void 0;var b;(function(N){N.DARK="dark",N.LIGHT="light",N.HIGH_CONTRAST="hc"})(b=e.ColorScheme||(e.ColorScheme={}))}),define(Q[255],J([0,1,35,30,17,384,110,171,129,97,38]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewLine=e.ViewLineOptions=e.DomReadingContext=void 0;const c=function(){return M.isNative?!0:!(M.isLinux||b.isFirefox||b.isSafari)}();let o=!0;class s{constructor(_,f){this._domNode=_,this._clientRectDeltaLeft=0,this._clientRectDeltaLeftRead=!1,this.endNode=f}get clientRectDeltaLeft(){return this._clientRectDeltaLeftRead||(this._clientRectDeltaLeftRead=!0,this._clientRectDeltaLeft=this._domNode.getBoundingClientRect().left),this._clientRectDeltaLeft}}e.DomReadingContext=s;class a{constructor(_,f){this.themeType=f;const v=_.options,y=v.get(38);this.renderWhitespace=v.get(83),this.renderControlCharacters=v.get(77),this.spaceWidth=y.spaceWidth,this.middotWidth=y.middotWidth,this.wsmiddotWidth=y.wsmiddotWidth,this.useMonospaceOptimizations=y.isMonospace&&!v.get(26),this.canUseHalfwidthRightwardsArrow=y.canUseHalfwidthRightwardsArrow,this.lineHeight=v.get(53),this.stopRenderingLineAfter=v.get(100),this.fontLigatures=v.get(39)}equals(_){return this.themeType===_.themeType&&this.renderWhitespace===_.renderWhitespace&&this.renderControlCharacters===_.renderControlCharacters&&this.spaceWidth===_.spaceWidth&&this.middotWidth===_.middotWidth&&this.wsmiddotWidth===_.wsmiddotWidth&&this.useMonospaceOptimizations===_.useMonospaceOptimizations&&this.canUseHalfwidthRightwardsArrow===_.canUseHalfwidthRightwardsArrow&&this.lineHeight===_.lineHeight&&this.stopRenderingLineAfter===_.stopRenderingLineAfter&&this.fontLigatures===_.fontLigatures}}e.ViewLineOptions=a;class u{constructor(_){this._options=_,this._isMaybeInvalid=!0,this._renderedViewLine=null}getDomNode(){return this._renderedViewLine&&this._renderedViewLine.domNode?this._renderedViewLine.domNode.domNode:null}setDomNode(_){if(this._renderedViewLine)this._renderedViewLine.domNode=N.createFastDomNode(_);else throw new Error("I have no rendered view line to set the dom node to...")}onContentChanged(){this._isMaybeInvalid=!0}onTokensChanged(){this._isMaybeInvalid=!0}onDecorationsChanged(){this._isMaybeInvalid=!0}onOptionsChanged(_){this._isMaybeInvalid=!0,this._options=_}onSelectionChanged(){return this._options.themeType===g.ColorScheme.HIGH_CONTRAST||this._options.renderWhitespace==="selection"?(this._isMaybeInvalid=!0,!0):!1}renderLine(_,f,v,y){if(this._isMaybeInvalid===!1)return!1;this._isMaybeInvalid=!1;const L=v.getViewLineRenderingData(_),I=this._options,k=C.LineDecoration.filter(L.inlineDecorations,_,L.minColumn,L.maxColumn);let E=null;if(I.themeType===g.ColorScheme.HIGH_CONTRAST||this._options.renderWhitespace==="selection"){const B=v.selections;for(const F of B)if(!(F.endLineNumber<_||F.startLineNumber>_)){const D=F.startLineNumber===_?F.startColumn:L.minColumn,R=F.endLineNumber===_?F.endColumn:L.maxColumn;D');const O=d.renderViewLine(T,y);y.appendASCIIString("");let A=null;return o&&c&&L.isBasicASCII&&I.useMonospaceOptimizations&&O.containsForeignElements===0&&L.content.length<300&&T.lineTokens.getCount()<100&&(A=new r(this._renderedViewLine?this._renderedViewLine.domNode:null,T,O.characterMapping)),A||(A=t(this._renderedViewLine?this._renderedViewLine.domNode:null,T,O.characterMapping,O.containsRTL,O.containsForeignElements)),this._renderedViewLine=A,!0}layoutLine(_,f){this._renderedViewLine&&this._renderedViewLine.domNode&&(this._renderedViewLine.domNode.setTop(f),this._renderedViewLine.domNode.setHeight(this._options.lineHeight))}getWidth(){return this._renderedViewLine?this._renderedViewLine.getWidth():0}getWidthIsFast(){return this._renderedViewLine?this._renderedViewLine.getWidthIsFast():!0}needsMonospaceFontCheck(){return this._renderedViewLine?this._renderedViewLine instanceof r:!1}monospaceAssumptionsAreValid(){return this._renderedViewLine&&this._renderedViewLine instanceof r?this._renderedViewLine.monospaceAssumptionsAreValid():o}onMonospaceAssumptionsInvalidated(){this._renderedViewLine&&this._renderedViewLine instanceof r&&(this._renderedViewLine=this._renderedViewLine.toSlowRenderedLine())}getVisibleRangesForRange(_,f,v){if(!this._renderedViewLine)return null;_=_|0,f=f|0,_=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,_)),f=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,f));const y=this._renderedViewLine.input.stopRenderingLineAfter|0;let L=!1;y!==-1&&_>y+1&&f>y+1&&(L=!0),y!==-1&&_>y+1&&(_=y+1),y!==-1&&f>y+1&&(f=y+1);const I=this._renderedViewLine.getVisibleRangesForRange(_,f,v);return I&&I.length>0?new S.VisibleRanges(L,I):null}getColumnOfNodeOffset(_,f,v){return this._renderedViewLine?this._renderedViewLine.getColumnOfNodeOffset(_,f,v):1}}e.ViewLine=u,u.CLASS_NAME="view-line";class r{constructor(_,f,v){this.domNode=_,this.input=f,this._characterMapping=v,this._charWidth=f.spaceWidth}getWidth(){return this._getCharPosition(this._characterMapping.length)}getWidthIsFast(){return!0}monospaceAssumptionsAreValid(){if(!this.domNode)return o;const _=this.getWidth(),f=this.domNode.domNode.firstChild.offsetWidth;return Math.abs(_-f)>=2&&(console.warn("monospace assumptions have been violated, therefore disabling monospace optimizations!"),o=!1),o}toSlowRenderedLine(){return t(this.domNode,this.input,this._characterMapping,!1,0)}getVisibleRangesForRange(_,f,v){const y=this._getCharPosition(_),L=this._getCharPosition(f);return[new S.HorizontalRange(y,L-y)]}_getCharPosition(_){const f=this._characterMapping.getAbsoluteOffsets();return f.length===0?0:Math.round(this._charWidth*f[_-1])}getColumnOfNodeOffset(_,f,v){const y=f.textContent.length;let L=-1;for(;f;)f=f.previousSibling,L++;return this._characterMapping.partDataToCharOffset(L,y,v)+1}}class i{constructor(_,f,v,y,L){if(this.domNode=_,this.input=f,this._characterMapping=v,this._isWhitespaceOnly=/^\s*$/.test(f.lineContent),this._containsForeignElements=L,this._cachedWidth=-1,this._pixelOffsetCache=null,!y||this._characterMapping.length===0){this._pixelOffsetCache=new Int32Array(Math.max(2,this._characterMapping.length+1));for(let I=0,k=this._characterMapping.length;I<=k;I++)this._pixelOffsetCache[I]=-1}}_getReadingTarget(_){return _.domNode.firstChild}getWidth(){return this.domNode?(this._cachedWidth===-1&&(this._cachedWidth=this._getReadingTarget(this.domNode).offsetWidth),this._cachedWidth):0}getWidthIsFast(){return this._cachedWidth!==-1}getVisibleRangesForRange(_,f,v){if(!this.domNode)return null;if(this._pixelOffsetCache!==null){const y=this._readPixelOffset(this.domNode,_,v);if(y===-1)return null;const L=this._readPixelOffset(this.domNode,f,v);return L===-1?null:[new S.HorizontalRange(y,L-y)]}return this._readVisibleRangesForRange(this.domNode,_,f,v)}_readVisibleRangesForRange(_,f,v,y){if(f===v){const L=this._readPixelOffset(_,f,y);return L===-1?null:[new S.HorizontalRange(L,0)]}else return this._readRawVisibleRangesForRange(_,f,v,y)}_readPixelOffset(_,f,v){if(this._characterMapping.length===0){if(this._containsForeignElements===0||this._containsForeignElements===2)return 0;if(this._containsForeignElements===1)return this.getWidth();const y=this._getReadingTarget(_);return y.firstChild?y.firstChild.offsetWidth:0}if(this._pixelOffsetCache!==null){const y=this._pixelOffsetCache[f];if(y!==-1)return y;const L=this._actualReadPixelOffset(_,f,v);return this._pixelOffsetCache[f]=L,L}return this._actualReadPixelOffset(_,f,v)}_actualReadPixelOffset(_,f,v){if(this._characterMapping.length===0){const T=w.RangeUtil.readHorizontalRanges(this._getReadingTarget(_),0,0,0,0,v.clientRectDeltaLeft,v.endNode);return!T||T.length===0?-1:T[0].left}if(f===this._characterMapping.length&&this._isWhitespaceOnly&&this._containsForeignElements===0)return this.getWidth();const y=this._characterMapping.charOffsetToPartData(f-1),L=d.CharacterMapping.getPartIndex(y),I=d.CharacterMapping.getCharIndex(y),k=w.RangeUtil.readHorizontalRanges(this._getReadingTarget(_),L,I,L,I,v.clientRectDeltaLeft,v.endNode);if(!k||k.length===0)return-1;const E=k[0].left;if(this.input.isBasicASCII){const T=this._characterMapping.getAbsoluteOffsets(),O=Math.round(this.input.spaceWidth*T[f-1]);if(Math.abs(O-E)<=1)return O}return E}_readRawVisibleRangesForRange(_,f,v,y){if(f===1&&v===this._characterMapping.length)return[new S.HorizontalRange(0,this.getWidth())];const L=this._characterMapping.charOffsetToPartData(f-1),I=d.CharacterMapping.getPartIndex(L),k=d.CharacterMapping.getCharIndex(L),E=this._characterMapping.charOffsetToPartData(v-1),T=d.CharacterMapping.getPartIndex(E),O=d.CharacterMapping.getCharIndex(E);return w.RangeUtil.readHorizontalRanges(this._getReadingTarget(_),I,k,T,O,y.clientRectDeltaLeft,y.endNode)}getColumnOfNodeOffset(_,f,v){const y=f.textContent.length;let L=-1;for(;f;)f=f.previousSibling,L++;return this._characterMapping.partDataToCharOffset(L,y,v)+1}}class n extends i{_readVisibleRangesForRange(_,f,v,y){const L=super._readVisibleRangesForRange(_,f,v,y);if(!L||L.length===0||f===v||f===1&&v===this._characterMapping.length)return L;if(!this.input.containsRTL){const I=this._readPixelOffset(_,v,y);if(I!==-1){const k=L[L.length-1];k.left=4&&m[0]===3&&m[3]===7}static isStrictChildOfViewLines(m){return m.length>4&&m[0]===3&&m[3]===7}static isChildOfScrollableElement(m){return m.length>=2&&m[0]===3&&m[1]===5}static isChildOfMinimap(m){return m.length>=2&&m[0]===3&&m[1]===8}static isChildOfContentWidgets(m){return m.length>=4&&m[0]===3&&m[3]===1}static isChildOfOverflowingContentWidgets(m){return m.length>=1&&m[0]===2}static isChildOfOverlayWidgets(m){return m.length>=2&&m[0]===3&&m[1]===4}}class s{constructor(m,_,f){this.model=m.model;const v=m.configuration.options;this.layoutInfo=v.get(124),this.viewDomNode=_.viewDomNode,this.lineHeight=v.get(53),this.stickyTabStops=v.get(99),this.typicalHalfwidthCharacterWidth=v.get(38).typicalHalfwidthCharacterWidth,this.lastRenderData=f,this._context=m,this._viewHelper=_}getZoneAtCoord(m){return s.getZoneAtCoord(this._context,m)}static getZoneAtCoord(m,_){const f=m.viewLayout.getWhitespaceAtVerticalOffset(_);if(f){const v=f.verticalOffset+f.height/2,y=m.model.getLineCount();let L=null,I,k=null;return f.afterLineNumber!==y&&(k=new w.Position(f.afterLineNumber+1,1)),f.afterLineNumber>0&&(L=new w.Position(f.afterLineNumber,m.model.getLineMaxColumn(f.afterLineNumber))),k===null?I=L:L===null?I=k:_=m.layoutInfo.glyphMarginLeft,this.isInContentArea=!this.isInMarginArea,this.mouseColumn=Math.max(0,n._getMouseColumn(this.mouseContentHorizontalOffset,m.typicalHalfwidthCharacterWidth))}}class u extends a{constructor(m,_,f,v){super(m,_,f);this._ctx=m,v?(this.target=v,this.targetPath=N.PartFingerprints.collect(v,m.viewDomNode)):(this.target=null,this.targetPath=new Uint8Array(0))}toString(){return`pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset} + target: ${this.target?this.target.outerHTML:null}`}fulfill(m,_=null,f=null,v=null){let y=this.mouseColumn;return _&&_.columnL.contentLeft+L.width)){const I=m.getVerticalOffsetForLineNumber(L.position.lineNumber);if(I<=y&&y<=I+L.height)return _.fulfill(6,L.position)}}return null}static _hitTestViewZone(m,_){const f=m.getZoneAtCoord(_.mouseVerticalOffset);if(f){const v=_.isInContentArea?8:5;return _.fulfill(v,f.position,null,f)}return null}static _hitTestTextArea(m,_){return o.isTextArea(_.targetPath)?m.lastRenderData.lastTextareaPosition?_.fulfill(6,m.lastRenderData.lastTextareaPosition):_.fulfill(1,m.lastRenderData.lastTextareaPosition):null}static _hitTestMargin(m,_){if(_.isInMarginArea){const f=m.getFullLineRangeAtCoord(_.mouseVerticalOffset),v=f.range.getStartPosition();let y=Math.abs(_.pos.x-_.editorPos.x);const L={isAfterLines:f.isAfterLines,glyphMarginLeft:m.layoutInfo.glyphMarginLeft,glyphMarginWidth:m.layoutInfo.glyphMarginWidth,lineNumbersWidth:m.layoutInfo.lineNumbersWidth,offsetX:y};return y-=m.layoutInfo.glyphMarginLeft,y<=m.layoutInfo.glyphMarginWidth?_.fulfill(2,v,f.range,L):(y-=m.layoutInfo.glyphMarginWidth,y<=m.layoutInfo.lineNumbersWidth?_.fulfill(3,v,f.range,L):(y-=m.layoutInfo.lineNumbersWidth,_.fulfill(4,v,f.range,L)))}return null}static _hitTestViewLines(m,_,f){if(!o.isChildOfViewLines(_.targetPath))return null;if(m.isInTopPadding(_.mouseVerticalOffset))return _.fulfill(7,new w.Position(1,1),void 0,r);if(m.isAfterLines(_.mouseVerticalOffset)||m.isInBottomPadding(_.mouseVerticalOffset)){const y=m.model.getLineCount(),L=m.model.getLineMaxColumn(y);return _.fulfill(7,new w.Position(y,L),void 0,r)}if(f){if(o.isStrictChildOfViewLines(_.targetPath)){const y=m.getLineNumberAtVerticalOffset(_.mouseVerticalOffset);if(m.model.getLineLength(y)===0){const I=m.getLineWidth(y),k=i(_.mouseContentHorizontalOffset-I);return _.fulfill(7,new w.Position(y,1),void 0,k)}const L=m.getLineWidth(y);if(_.mouseContentHorizontalOffset>=L){const I=i(_.mouseContentHorizontalOffset-L),k=new w.Position(y,m.model.getLineMaxColumn(y));return _.fulfill(7,k,void 0,I)}}return _.fulfill(0)}const v=n._doHitTest(m,_);return v.position?n.createMouseTargetFromHitTestPosition(m,_,v.position.lineNumber,v.position.column):this._createMouseTarget(m,_.withTarget(v.hitTarget),!0)}static _hitTestMinimap(m,_){if(o.isChildOfMinimap(_.targetPath)){const f=m.getLineNumberAtVerticalOffset(_.mouseVerticalOffset),v=m.model.getLineMaxColumn(f);return _.fulfill(11,new w.Position(f,v))}return null}static _hitTestScrollbarSlider(m,_){if(o.isChildOfScrollableElement(_.targetPath)&&_.target&&_.target.nodeType===1){const f=_.target.className;if(f&&/\b(slider|scrollbar)\b/.test(f)){const v=m.getLineNumberAtVerticalOffset(_.mouseVerticalOffset),y=m.model.getLineMaxColumn(v);return _.fulfill(11,new w.Position(v,y))}}return null}static _hitTestScrollbar(m,_){if(o.isChildOfScrollableElement(_.targetPath)){const f=m.getLineNumberAtVerticalOffset(_.mouseVerticalOffset),v=m.model.getLineMaxColumn(f);return _.fulfill(11,new w.Position(f,v))}return null}getMouseColumn(m,_){const f=this._context.configuration.options,v=f.get(124),y=this._context.viewLayout.getCurrentScrollLeft()+_.x-m.x-v.contentLeft;return n._getMouseColumn(y,f.get(38).typicalHalfwidthCharacterWidth)}static _getMouseColumn(m,_){return m<0?1:Math.round(m/_)+1}static createMouseTargetFromHitTestPosition(m,_,f,v){const y=new w.Position(f,v),L=m.getLineWidth(f);if(_.mouseContentHorizontalOffset>L){const O=i(_.mouseContentHorizontalOffset-L);return _.fulfill(7,y,void 0,O)}const I=m.visibleRangeForPosition(f,v);if(!I)return _.fulfill(0,y);const k=I.left;if(_.mouseContentHorizontalOffset===k)return _.fulfill(6,y);const E=[];if(E.push({offset:I.left,column:v}),v>1){const O=m.visibleRangeForPosition(f,v-1);O&&E.push({offset:O.left,column:v-1})}const T=m.model.getLineMaxColumn(f);if(vO.offset-A.offset);for(let O=1;O=_.editorPos.y+m.layoutInfo.height&&(L=_.editorPos.y+m.layoutInfo.height-1);const I=new b.PageCoordinates(_.pos.x,L),k=this._actualDoHitTestWithCaretRangeFromPoint(m,I.toClientCoordinates());return k.position?k:this._actualDoHitTestWithCaretRangeFromPoint(m,_.pos.toClientCoordinates())}static _actualDoHitTestWithCaretRangeFromPoint(m,_){const f=d.getShadowRoot(m.viewDomNode);let v;if(f?typeof f.caretRangeFromPoint=="undefined"?v=t(f,_.clientX,_.clientY):v=f.caretRangeFromPoint(_.clientX,_.clientY):v=document.caretRangeFromPoint(_.clientX,_.clientY),!v||!v.startContainer)return{position:null,hitTarget:null};const y=v.startContainer;let L=null;if(y.nodeType===y.TEXT_NODE){const I=y.parentNode,k=I?I.parentNode:null,E=k?k.parentNode:null;if((E&&E.nodeType===E.ELEMENT_NODE?E.className:null)===M.ViewLine.CLASS_NAME)return{position:m.getPositionFromDOMInfo(I,v.startOffset),hitTarget:null};L=y.parentNode}else if(y.nodeType===y.ELEMENT_NODE){const I=y.parentNode,k=I?I.parentNode:null;if((k&&k.nodeType===k.ELEMENT_NODE?k.className:null)===M.ViewLine.CLASS_NAME)return{position:m.getPositionFromDOMInfo(y,y.textContent.length),hitTarget:null};L=y}return{position:null,hitTarget:L}}static _doHitTestWithCaretPositionFromPoint(m,_){const f=document.caretPositionFromPoint(_.clientX,_.clientY);if(f.offsetNode.nodeType===f.offsetNode.TEXT_NODE){const v=f.offsetNode.parentNode,y=v?v.parentNode:null,L=y?y.parentNode:null;return(L&&L.nodeType===L.ELEMENT_NODE?L.className:null)===M.ViewLine.CLASS_NAME?{position:m.getPositionFromDOMInfo(f.offsetNode.parentNode,f.offset),hitTarget:null}:{position:null,hitTarget:f.offsetNode.parentNode}}if(f.offsetNode.nodeType===f.offsetNode.ELEMENT_NODE){const v=f.offsetNode.parentNode,y=v&&v.nodeType===v.ELEMENT_NODE?v.className:null,L=v?v.parentNode:null,I=L&&L.nodeType===L.ELEMENT_NODE?L.className:null;if(y===M.ViewLine.CLASS_NAME){const k=f.offsetNode.childNodes[Math.min(f.offset,f.offsetNode.childNodes.length-1)];if(k)return{position:m.getPositionFromDOMInfo(k,0),hitTarget:null}}else if(I===M.ViewLine.CLASS_NAME)return{position:m.getPositionFromDOMInfo(f.offsetNode,0),hitTarget:null}}return{position:null,hitTarget:f.offsetNode}}static _snapToSoftTabBoundary(m,_){const f=_.getLineContent(m.lineNumber),{tabSize:v}=_.getTextModelOptions(),y=g.AtomicTabMoveOperations.atomicPosition(f,m.column-1,v,2);return y!==-1?new w.Position(m.lineNumber,y+1):m}static _doHitTest(m,_){let f;return typeof document.caretRangeFromPoint=="function"?f=this._doHitTestWithCaretRangeFromPoint(m,_):document.caretPositionFromPoint?f=this._doHitTestWithCaretPositionFromPoint(m,_.pos.toClientCoordinates()):f={position:null,hitTarget:null},f.position&&m.stickyTabStops&&(f.position=this._snapToSoftTabBoundary(f.position,m.model)),f}}e.MouseTargetFactory=n;function t(h,m,_){const f=document.createRange();let v=h.elementFromPoint(m,_);if(v!==null){for(;v&&v.firstChild&&v.firstChild.nodeType!==v.firstChild.TEXT_NODE&&v.lastChild&&v.lastChild.firstChild;)v=v.lastChild;const y=v.getBoundingClientRect(),L=window.getComputedStyle(v,null).getPropertyValue("font"),I=v.innerText;let k=y.left,E=0,T;if(m>y.left+y.width)E=I.length;else{const O=l.getInstance();for(let A=0;Athis._createMouseTarget(_,f),_=>this._getMouseColumn(_))),this.lastMouseLeaveTime=-1,this._height=this._context.configuration.options.get(124).height;const h=new d.EditorMouseEventFactory(this.viewHelper.viewDomNode);this._register(h.onContextMenu(this.viewHelper.viewDomNode,_=>this._onContextMenu(_,!0))),this._register(h.onMouseMoveThrottled(this.viewHelper.viewDomNode,_=>this._onMouseMove(_),s(this.mouseTargetFactory),a.MOUSE_MOVE_MINIMUM_TIME)),this._register(h.onMouseUp(this.viewHelper.viewDomNode,_=>this._onMouseUp(_))),this._register(h.onMouseLeave(this.viewHelper.viewDomNode,_=>this._onMouseLeave(_))),this._register(h.onMouseDown(this.viewHelper.viewDomNode,_=>this._onMouseDown(_)));const m=_=>{if(this.viewController.emitMouseWheel(_),!!this._context.configuration.options.get(62)){const f=new N.StandardWheelEvent(_);if(S.isMacintosh?(_.metaKey||_.ctrlKey)&&!_.shiftKey&&!_.altKey:_.ctrlKey&&!_.metaKey&&!_.shiftKey&&!_.altKey){const y=g.EditorZoom.getZoomLevel(),L=f.deltaY>0?1:-1;g.EditorZoom.setZoomLevel(y+L),f.preventDefault(),f.stopPropagation()}}};this._register(b.addDisposableListener(this.viewHelper.viewDomNode,b.EventType.MOUSE_WHEEL,m,{capture:!0,passive:!1})),this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}onConfigurationChanged(n){if(n.hasChanged(124)){const t=this._context.configuration.options.get(124).height;this._height!==t&&(this._height=t,this._mouseDownOperation.onHeightChanged())}return!1}onCursorStateChanged(n){return this._mouseDownOperation.onCursorStateChanged(n),!1}onFocusChanged(n){return!1}onScrollChanged(n){return this._mouseDownOperation.onScrollChanged(),!1}getTargetAtClientPoint(n,t){const h=new d.ClientCoordinates(n,t).toPageCoordinates(),m=d.createEditorPagePosition(this.viewHelper.viewDomNode);return h.ym.y+m.height||h.xm.x+m.width?null:this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),m,h,null)}_createMouseTarget(n,t){return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),n.editorPos,n.pos,t?n.target:null)}_getMouseColumn(n){return this.mouseTargetFactory.getMouseColumn(n.editorPos,n.pos)}_onContextMenu(n,t){this.viewController.emitContextMenu({event:n,target:this._createMouseTarget(n,t)})}_onMouseMove(n){this._mouseDownOperation.isActive()||n.timestamp{n.preventDefault(),this.viewHelper.focusTextArea()};if(y&&(l||m&&_))L(),this._mouseDownOperation.start(t.type,n);else if(h)n.preventDefault();else if(f){const I=t.detail;this.viewHelper.shouldSuppressMouseDownOnViewZone(I.viewZoneId)&&(L(),this._mouseDownOperation.start(t.type,n),n.preventDefault())}else v&&this.viewHelper.shouldSuppressMouseDownOnWidget(t.detail)&&(L(),n.preventDefault());this.viewController.emitMouseDown({event:n,target:t})}}e.MouseHandler=a,a.MOUSE_MOVE_MINIMUM_TIME=100;class u extends w.Disposable{constructor(n,t,l,h,m){super();this._context=n,this._viewController=t,this._viewHelper=l,this._createMouseTarget=h,this._getMouseColumn=m,this._mouseMoveMonitor=this._register(new d.GlobalEditorMouseMoveMonitor(this._viewHelper.viewDomNode)),this._onScrollTimeout=this._register(new M.TimeoutTimer),this._mouseState=new r,this._currentSelection=new c.Selection(1,1,1,1),this._isActive=!1,this._lastMouseEvent=null}dispose(){super.dispose()}isActive(){return this._isActive}_onMouseDownThenMove(n){this._lastMouseEvent=n,this._mouseState.setModifiers(n);const t=this._findMousePosition(n,!0);!t||(this._mouseState.isDragAndDrop?this._viewController.emitMouseDrag({event:n,target:t}):this._dispatchMouse(t,!0))}start(n,t){this._lastMouseEvent=t,this._mouseState.setStartedOnLineNumbers(n===3),this._mouseState.setStartButtons(t),this._mouseState.setModifiers(t);const l=this._findMousePosition(t,!0);if(!(!l||!l.position)){this._mouseState.trySetCount(t.detail,l.position),t.detail=this._mouseState.count;const h=this._context.configuration.options;if(!h.get(75)&&h.get(27)&&!h.get(15)&&!this._mouseState.altKey&&t.detail<2&&!this._isActive&&!this._currentSelection.isEmpty()&&l.type===6&&l.position&&this._currentSelection.containsPosition(l.position)){this._mouseState.isDragAndDrop=!0,this._isActive=!0,this._mouseMoveMonitor.startMonitoring(t.target,t.buttons,s(null),m=>this._onMouseDownThenMove(m),m=>{const _=this._findMousePosition(this._lastMouseEvent,!0);m&&m instanceof KeyboardEvent?this._viewController.emitMouseDropCanceled():this._viewController.emitMouseDrop({event:this._lastMouseEvent,target:_?this._createMouseTarget(this._lastMouseEvent,!0):null}),this._stop()});return}this._mouseState.isDragAndDrop=!1,this._dispatchMouse(l,t.shiftKey),this._isActive||(this._isActive=!0,this._mouseMoveMonitor.startMonitoring(t.target,t.buttons,s(null),m=>this._onMouseDownThenMove(m),()=>this._stop()))}}_stop(){this._isActive=!1,this._onScrollTimeout.cancel()}onHeightChanged(){this._mouseMoveMonitor.stopMonitoring()}onScrollChanged(){!this._isActive||this._onScrollTimeout.setIfNotSet(()=>{if(!!this._lastMouseEvent){const n=this._findMousePosition(this._lastMouseEvent,!1);!n||this._mouseState.isDragAndDrop||this._dispatchMouse(n,!0)}},10)}onCursorStateChanged(n){this._currentSelection=n.selections[0]}_getPositionOutsideEditor(n){const t=n.editorPos,l=this._context.model,h=this._context.viewLayout,m=this._getMouseColumn(n);if(n.posyt.y+t.height){const f=h.getCurrentScrollTop()+(n.posy-t.y),v=C.HitTestContext.getZoneAtCoord(this._context,f);if(v){const L=this._helpPositionJumpOverViewZone(v);if(L)return new C.MouseTarget(null,13,m,L)}const y=h.getLineNumberAtVerticalOffset(f);return new C.MouseTarget(null,13,m,new p.Position(y,l.getLineMaxColumn(y)))}const _=h.getLineNumberAtVerticalOffset(h.getCurrentScrollTop()+(n.posy-t.y));return n.posxt.x+t.width?new C.MouseTarget(null,13,m,new p.Position(_,l.getLineMaxColumn(_))):null}_findMousePosition(n,t){const l=this._getPositionOutsideEditor(n);if(l)return l;const h=this._createMouseTarget(n,t);if(!h.position)return null;if(h.type===8||h.type===5){const _=this._helpPositionJumpOverViewZone(h.detail);if(_)return new C.MouseTarget(h.element,h.type,h.mouseColumn,_,null,h.detail)}return h}_helpPositionJumpOverViewZone(n){const t=new p.Position(this._currentSelection.selectionStartLineNumber,this._currentSelection.selectionStartColumn),l=n.positionBefore,h=n.positionAfter;return l&&h?l.isBefore(t)?l:h:null}_dispatchMouse(n,t){!n.position||this._viewController.dispatchMouse({position:n.position,mouseColumn:n.mouseColumn,startedOnLineNumbers:this._mouseState.startedOnLineNumbers,inSelectionMode:t,mouseDownCount:this._mouseState.count,altKey:this._mouseState.altKey,ctrlKey:this._mouseState.ctrlKey,metaKey:this._mouseState.metaKey,shiftKey:this._mouseState.shiftKey,leftButton:this._mouseState.leftButton,middleButton:this._mouseState.middleButton})}}class r{constructor(){this._altKey=!1,this._ctrlKey=!1,this._metaKey=!1,this._shiftKey=!1,this._leftButton=!1,this._middleButton=!1,this._startedOnLineNumbers=!1,this._lastMouseDownPosition=null,this._lastMouseDownPositionEqualCount=0,this._lastMouseDownCount=0,this._lastSetMouseDownCountTime=0,this.isDragAndDrop=!1}get altKey(){return this._altKey}get ctrlKey(){return this._ctrlKey}get metaKey(){return this._metaKey}get shiftKey(){return this._shiftKey}get leftButton(){return this._leftButton}get middleButton(){return this._middleButton}get startedOnLineNumbers(){return this._startedOnLineNumbers}get count(){return this._lastMouseDownCount}setModifiers(n){this._altKey=n.altKey,this._ctrlKey=n.ctrlKey,this._metaKey=n.metaKey,this._shiftKey=n.shiftKey}setStartButtons(n){this._leftButton=n.leftButton,this._middleButton=n.middleButton}setStartedOnLineNumbers(n){this._startedOnLineNumbers=n}trySetCount(n,t){const l=new Date().getTime();l-this._lastSetMouseDownCountTime>r.CLEAR_MOUSE_DOWN_COUNT_TIME&&(n=1),this._lastSetMouseDownCountTime=l,n>this._lastMouseDownCount+1&&(n=this._lastMouseDownCount+1),this._lastMouseDownPosition&&this._lastMouseDownPosition.equals(t)?this._lastMouseDownPositionEqualCount++:this._lastMouseDownPositionEqualCount=1,this._lastMouseDownPosition=t,this._lastMouseDownCount=Math.min(n,this._lastMouseDownPositionEqualCount)}}r.CLEAR_MOUSE_DOWN_COUNT_TIME=400}),define(Q[581],J([0,1,7,17,60,2,580,162,151,164]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PointerHandler=e.PointerEventHandler=void 0;class p extends S.MouseHandler{constructor(a,u,r){super(a,u,r);this._register(M.Gesture.addTarget(this.viewHelper.linesContentDomNode)),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Tap,n=>this.onTap(n))),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Change,n=>this.onChange(n))),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Contextmenu,n=>this._onContextMenu(new C.EditorMouseEvent(n,this.viewHelper.viewDomNode),!1))),this._lastPointerType="mouse",this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,"pointerdown",n=>{const t=n.pointerType;if(t==="mouse"){this._lastPointerType="mouse";return}else t==="touch"?this._lastPointerType="touch":this._lastPointerType="pen"}));const i=new C.EditorPointerEventFactory(this.viewHelper.viewDomNode);this._register(i.onPointerMoveThrottled(this.viewHelper.viewDomNode,n=>this._onMouseMove(n),S.createMouseMoveEventMerger(this.mouseTargetFactory),S.MouseHandler.MOUSE_MOVE_MINIMUM_TIME)),this._register(i.onPointerUp(this.viewHelper.viewDomNode,n=>this._onMouseUp(n))),this._register(i.onPointerLeave(this.viewHelper.viewDomNode,n=>this._onMouseLeave(n))),this._register(i.onPointerDown(this.viewHelper.viewDomNode,n=>this._onMouseDown(n)))}onTap(a){if(!(!a.initialTarget||!this.viewHelper.linesContentDomNode.contains(a.initialTarget))){a.preventDefault(),this.viewHelper.focusTextArea();const u=this._createMouseTarget(new C.EditorMouseEvent(a,this.viewHelper.viewDomNode),!1);u.position&&this.viewController.dispatchMouse({position:u.position,mouseColumn:u.position.column,startedOnLineNumbers:!1,mouseDownCount:a.tapCount,inSelectionMode:!1,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1,leftButton:!1,middleButton:!1})}}onChange(a){this._lastPointerType==="touch"&&this._context.model.deltaScrollNow(-a.translationX,-a.translationY)}_onMouseDown(a){a.browserEvent.pointerType!=="touch"&&super._onMouseDown(a)}}e.PointerEventHandler=p;class c extends S.MouseHandler{constructor(a,u,r){super(a,u,r);this._register(M.Gesture.addTarget(this.viewHelper.linesContentDomNode)),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Tap,i=>this.onTap(i))),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Change,i=>this.onChange(i))),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Contextmenu,i=>this._onContextMenu(new C.EditorMouseEvent(i,this.viewHelper.viewDomNode),!1)))}onTap(a){a.preventDefault(),this.viewHelper.focusTextArea();const u=this._createMouseTarget(new C.EditorMouseEvent(a,this.viewHelper.viewDomNode),!1);if(u.position){const r=document.createEvent("CustomEvent");r.initEvent(g.TextAreaSyntethicEvents.Tap,!1,!0),this.viewHelper.dispatchTextAreaEvent(r),this.viewController.moveTo(u.position)}}onChange(a){this._context.model.deltaScrollNow(-a.translationX,-a.translationY)}}class o extends w.Disposable{constructor(a,u,r){super();N.isIOS&&d.BrowserFeatures.pointerEvents?this.handler=this._register(new p(a,u,r)):window.TouchEvent?this.handler=this._register(new c(a,u,r)):this.handler=this._register(new S.MouseHandler(a,u,r))}getTargetAtClientPoint(a,u){return this.handler.getTargetAtClientPoint(a,u)}}e.PointerHandler=o}),define(Q[256],J([0,1,187]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewUserInputEvents=void 0;class N{constructor(S){this.onKeyDown=null,this.onKeyUp=null,this.onContextMenu=null,this.onMouseMove=null,this.onMouseLeave=null,this.onMouseDown=null,this.onMouseUp=null,this.onMouseDrag=null,this.onMouseDrop=null,this.onMouseDropCanceled=null,this.onMouseWheel=null,this._coordinatesConverter=S}emitKeyDown(S){this.onKeyDown&&this.onKeyDown(S)}emitKeyUp(S){this.onKeyUp&&this.onKeyUp(S)}emitContextMenu(S){this.onContextMenu&&this.onContextMenu(this._convertViewToModelMouseEvent(S))}emitMouseMove(S){this.onMouseMove&&this.onMouseMove(this._convertViewToModelMouseEvent(S))}emitMouseLeave(S){this.onMouseLeave&&this.onMouseLeave(this._convertViewToModelMouseEvent(S))}emitMouseDown(S){this.onMouseDown&&this.onMouseDown(this._convertViewToModelMouseEvent(S))}emitMouseUp(S){this.onMouseUp&&this.onMouseUp(this._convertViewToModelMouseEvent(S))}emitMouseDrag(S){this.onMouseDrag&&this.onMouseDrag(this._convertViewToModelMouseEvent(S))}emitMouseDrop(S){this.onMouseDrop&&this.onMouseDrop(this._convertViewToModelMouseEvent(S))}emitMouseDropCanceled(){this.onMouseDropCanceled&&this.onMouseDropCanceled()}emitMouseWheel(S){this.onMouseWheel&&this.onMouseWheel(S)}_convertViewToModelMouseEvent(S){return S.target?{event:S.event,target:this._convertViewToModelMouseTarget(S.target)}:S}_convertViewToModelMouseTarget(S){return N.convertViewToModelMouseTarget(S,this._coordinatesConverter)}static convertViewToModelMouseTarget(S,C){return new M(S.element,S.type,S.mouseColumn,S.position?C.convertViewPositionToModelPosition(S.position):null,S.range?C.convertViewRangeToModelRange(S.range):null,S.detail)}}e.ViewUserInputEvents=N;class M{constructor(S,C,d,g,p,c){this.element=S,this.type=C,this.mouseColumn=d,this.position=g,this.range=p,this.detail=c}toString(){return b.MouseTarget.toString(this)}}}),define(Q[582],J([0,1,17,15,69,165,45,255,14,3,110,124,323]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewLines=void 0;class o{constructor(){this._currentVisibleRange=new g.Range(1,1,1,1)}getCurrentVisibleRange(){return this._currentVisibleRange}setCurrentVisibleRange(i){this._currentVisibleRange=i}}class s{constructor(i,n,t,l,h,m){this.lineNumber=i,this.startColumn=n,this.endColumn=t,this.startScrollTop=l,this.stopScrollTop=h,this.scrollType=m,this.type="range",this.minLineNumber=i,this.maxLineNumber=i}}class a{constructor(i,n,t,l){this.selections=i,this.startScrollTop=n,this.stopScrollTop=t,this.scrollType=l,this.type="selections";let h=i[0].startLineNumber,m=i[0].endLineNumber;for(let _=1,f=i.length;_{this._updateLineWidthsSlow()},200),this._asyncCheckMonospaceFontAssumptions=new N.RunOnceScheduler(()=>{this._checkMonospaceFontAssumptions()},2e3),this._lastRenderedData=new o,this._horizontalRevealRequest=null}dispose(){this._asyncUpdateLineWidths.dispose(),this._asyncCheckMonospaceFontAssumptions.dispose(),super.dispose()}getDomNode(){return this.domNode}createVisibleLine(){return new C.ViewLine(this._viewLineOptions)}onConfigurationChanged(i){this._visibleLines.onConfigurationChanged(i),i.hasChanged(125)&&(this._maxLineWidth=0);const n=this._context.configuration.options,t=n.get(38),l=n.get(125);return this._lineHeight=n.get(53),this._typicalHalfwidthCharacterWidth=t.typicalHalfwidthCharacterWidth,this._isViewportWrapping=l.isViewportWrapping,this._revealHorizontalRightPadding=n.get(84),this._cursorSurroundingLines=n.get(22),this._cursorSurroundingLinesStyle=n.get(23),this._canUseLayerHinting=!n.get(25),M.Configuration.applyFontInfo(this.domNode,t),this._onOptionsMaybeChanged(),i.hasChanged(124)&&(this._maxLineWidth=0),!0}_onOptionsMaybeChanged(){const i=this._context.configuration,n=new C.ViewLineOptions(i,this._context.theme.type);if(!this._viewLineOptions.equals(n)){this._viewLineOptions=n;const t=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let h=t;h<=l;h++)this._visibleLines.getVisibleLine(h).onOptionsChanged(this._viewLineOptions);return!0}return!1}onCursorStateChanged(i){const n=this._visibleLines.getStartLineNumber(),t=this._visibleLines.getEndLineNumber();let l=!1;for(let h=n;h<=t;h++)l=this._visibleLines.getVisibleLine(h).onSelectionChanged()||l;return l}onDecorationsChanged(i){{const n=this._visibleLines.getStartLineNumber(),t=this._visibleLines.getEndLineNumber();for(let l=n;l<=t;l++)this._visibleLines.getVisibleLine(l).onDecorationsChanged()}return!0}onFlushed(i){const n=this._visibleLines.onFlushed(i);return this._maxLineWidth=0,n}onLinesChanged(i){return this._visibleLines.onLinesChanged(i)}onLinesDeleted(i){return this._visibleLines.onLinesDeleted(i)}onLinesInserted(i){return this._visibleLines.onLinesInserted(i)}onRevealRangeRequest(i){const n=this._computeScrollTopToRevealRange(this._context.viewLayout.getFutureViewport(),i.source,i.range,i.selections,i.verticalType);if(n===-1)return!1;let t=this._context.viewLayout.validateScrollPosition({scrollTop:n});i.revealHorizontal?i.range&&i.range.startLineNumber!==i.range.endLineNumber?t={scrollTop:t.scrollTop,scrollLeft:0}:i.range?this._horizontalRevealRequest=new s(i.range.startLineNumber,i.range.startColumn,i.range.endColumn,this._context.viewLayout.getCurrentScrollTop(),t.scrollTop,i.scrollType):i.selections&&i.selections.length>0&&(this._horizontalRevealRequest=new a(i.selections,this._context.viewLayout.getCurrentScrollTop(),t.scrollTop,i.scrollType)):this._horizontalRevealRequest=null;const h=Math.abs(this._context.viewLayout.getCurrentScrollTop()-t.scrollTop)<=this._lineHeight?1:i.scrollType;return this._context.model.setScrollPosition(t,h),!0}onScrollChanged(i){if(this._horizontalRevealRequest&&i.scrollLeftChanged&&(this._horizontalRevealRequest=null),this._horizontalRevealRequest&&i.scrollTopChanged){const n=Math.min(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop),t=Math.max(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop);(i.scrollTopt)&&(this._horizontalRevealRequest=null)}return this.domNode.setWidth(i.scrollWidth),this._visibleLines.onScrollChanged(i)||!0}onTokensChanged(i){return this._visibleLines.onTokensChanged(i)}onZonesChanged(i){return this._context.model.setMaxLineWidth(this._maxLineWidth),this._visibleLines.onZonesChanged(i)}onThemeChanged(i){return this._onOptionsMaybeChanged()}getPositionFromDOMInfo(i,n){const t=this._getViewLineDomNode(i);if(t===null)return null;const l=this._getLineNumberFor(t);if(l===-1||l<1||l>this._context.model.getLineCount())return null;if(this._context.model.getLineMaxColumn(l)===1)return new d.Position(l,1);const h=this._visibleLines.getStartLineNumber(),m=this._visibleLines.getEndLineNumber();if(lm)return null;let _=this._visibleLines.getVisibleLine(l).getColumnOfNodeOffset(l,i,n);const f=this._context.model.getLineMinColumn(l);return _t?-1:this._visibleLines.getVisibleLine(i).getWidth()}linesVisibleRangesForRange(i,n){if(this.shouldRender())return null;const t=i.endLineNumber,l=g.Range.intersectRanges(i,this._lastRenderedData.getCurrentVisibleRange());if(!l)return null;let h=[],m=0;const _=new C.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot);let f=0;n&&(f=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new d.Position(l.startLineNumber,1)).lineNumber);const v=this._visibleLines.getStartLineNumber(),y=this._visibleLines.getEndLineNumber();for(let L=l.startLineNumber;L<=l.endLineNumber;L++)if(!(Ly)){const I=L===l.startLineNumber?l.startColumn:1,k=L===l.endLineNumber?l.endColumn:this._context.model.getLineMaxColumn(L),E=this._visibleLines.getVisibleLine(L).getVisibleRangesForRange(I,k,_);if(!!E){if(n&&Lthis._visibleLines.getEndLineNumber()?null:this._visibleLines.getVisibleLine(i).getVisibleRangesForRange(n,t,new C.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot))}visibleRangeForPosition(i){const n=this._visibleRangesForLineRange(i.lineNumber,i.column,i.column);return n?new p.HorizontalPosition(n.outsideRenderedLine,n.ranges[0].left):null}updateLineWidths(){this._updateLineWidths(!1)}_updateLineWidthsFast(){return this._updateLineWidths(!0)}_updateLineWidthsSlow(){this._updateLineWidths(!1)}_updateLineWidths(i){const n=this._visibleLines.getStartLineNumber(),t=this._visibleLines.getEndLineNumber();let l=1,h=!0;for(let m=n;m<=t;m++){const _=this._visibleLines.getVisibleLine(m);if(i&&!_.getWidthIsFast()){h=!1;continue}l=Math.max(l,_.getWidth())}return h&&n===1&&t===this._context.model.getLineCount()&&(this._maxLineWidth=0),this._ensureMaxLineWidth(l),h}_checkMonospaceFontAssumptions(){let i=-1,n=-1;const t=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let h=t;h<=l;h++){const m=this._visibleLines.getVisibleLine(h);if(m.needsMonospaceFontCheck()){const _=m.getWidth();_>n&&(n=_,i=h)}}if(i!==-1&&!this._visibleLines.getVisibleLine(i).monospaceAssumptionsAreValid())for(let h=t;h<=l;h++)this._visibleLines.getVisibleLine(h).onMonospaceAssumptionsInvalidated()}prepareRender(){throw new Error("Not supported")}render(){throw new Error("Not supported")}renderText(i){if(this._visibleLines.renderLines(i),this._lastRenderedData.setCurrentVisibleRange(i.visibleRange),this.domNode.setWidth(this._context.viewLayout.getScrollWidth()),this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(),1e6)),this._horizontalRevealRequest){const t=this._horizontalRevealRequest;if(i.startLineNumber<=t.minLineNumber&&t.maxLineNumber<=i.endLineNumber){this._horizontalRevealRequest=null,this.onDidRender();const l=this._computeScrollLeftToReveal(t);l&&(this._isViewportWrapping||this._ensureMaxLineWidth(l.maxHorizontalOffset),this._context.model.setScrollPosition({scrollLeft:l.scrollLeft},t.scrollType))}}if(this._updateLineWidthsFast()||this._asyncUpdateLineWidths.schedule(),b.isLinux&&!this._asyncCheckMonospaceFontAssumptions.isScheduled()){const t=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let h=t;h<=l;h++)if(this._visibleLines.getVisibleLine(h).needsMonospaceFontCheck()){this._asyncCheckMonospaceFontAssumptions.schedule();break}}this._linesContent.setLayerHinting(this._canUseLayerHinting),this._linesContent.setContain("strict");const n=this._context.viewLayout.getCurrentScrollTop()-i.bigNumbersDelta;this._linesContent.setTop(-n),this._linesContent.setLeft(-this._context.viewLayout.getCurrentScrollLeft())}_ensureMaxLineWidth(i){const n=Math.ceil(i);this._maxLineWidth0){let E=l[0].startLineNumber,T=l[0].endLineNumber;for(let O=1,A=l.length;O_){if(!v)return-1;k=y}else if(h===5||h===6)if(h===6&&m<=y&&L<=f)k=m;else{const E=Math.max(5*this._lineHeight,_*.2),T=y-E,O=L-_;k=Math.max(O,T)}else if(h===1||h===2)if(h===2&&m<=y&&L<=f)k=m;else{const E=(y+L)/2;k=Math.max(0,E-_/2)}else k=this._computeMinimumScrolling(m,f,y,L,h===3,h===4);return k}_computeScrollLeftToReveal(i){const n=this._context.viewLayout.getCurrentViewport(),t=n.left,l=t+n.width;let h=1073741824,m=0;if(i.type==="range"){const f=this._visibleRangesForLineRange(i.lineNumber,i.startColumn,i.endColumn);if(!f)return null;for(const v of f.ranges)h=Math.min(h,v.left),m=Math.max(m,v.left+v.width)}else for(const f of i.selections){if(f.startLineNumber!==f.endLineNumber)return null;const v=this._visibleRangesForLineRange(f.startLineNumber,f.startColumn,f.endColumn);if(!v)return null;for(const y of v.ranges)h=Math.min(h,y.left),m=Math.max(m,y.left+y.width)}return h=Math.max(0,h-u.HORIZONTAL_EXTRA_PX),m+=this._revealHorizontalRightPadding,i.type==="selections"&&m-h>n.width?null:{scrollLeft:this._computeMinimumScrolling(t,l,h,m),maxHorizontalOffset:m}}_computeMinimumScrolling(i,n,t,l,h,m){i=i|0,n=n|0,t=t|0,l=l|0,h=!!h,m=!!m;const _=n-i;if(l-t<_){if(h)return t;if(m)return Math.max(0,l-_);if(tn)return Math.max(0,l-_)}else return t;return i}}e.ViewLines=u,u.HORIZONTAL_EXTRA_PX=30}),define(Q[11],J([0,1,9,2,33,6,97,27]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Themable=e.registerThemingParticipant=e.Extensions=e.getThemeTypeSelector=e.ThemeIcon=e.themeColorFromId=e.ThemeColor=e.IThemeService=void 0,e.IThemeService=b.createDecorator("themeService");var d;(function(r){function i(n){return n&&typeof n=="object"&&typeof n.id=="string"}r.isThemeColor=i})(d=e.ThemeColor||(e.ThemeColor={}));function g(r){return{id:r}}e.themeColorFromId=g;var p;(function(r){function i(m){return m&&typeof m=="object"&&typeof m.id=="string"&&(typeof m.color=="undefined"||d.isThemeColor(m.color))}r.isThemeIcon=i;const n=new RegExp(`^\\$\\((${C.CSSIcon.iconNameExpression}(?:${C.CSSIcon.iconModifierExpression})?)\\)$`);function t(m){const _=n.exec(m);if(!!_){let[,f]=_;return{id:f}}}r.fromString=t;function l(m,_){let f=m.id;const v=f.lastIndexOf("~");return v!==-1&&(f=f.substring(0,v)),_&&(f=`${f}~${_}`),{id:f}}r.modify=l;function h(m,_){var f,v;return m.id===_.id&&((f=m.color)===null||f===void 0?void 0:f.id)===((v=_.color)===null||v===void 0?void 0:v.id)}r.isEqual=h,r.asClassNameArray=C.CSSIcon.asClassNameArray,r.asClassName=C.CSSIcon.asClassName,r.asCSSSelector=C.CSSIcon.asCSSSelector})(p=e.ThemeIcon||(e.ThemeIcon={}));function c(r){switch(r){case S.ColorScheme.DARK:return"vs-dark";case S.ColorScheme.HIGH_CONTRAST:return"hc-black";default:return"vs"}}e.getThemeTypeSelector=c,e.Extensions={ThemingContribution:"base.contributions.theming"};class o{constructor(){this.themingParticipants=[],this.themingParticipants=[],this.onThemingParticipantAddedEmitter=new w.Emitter}onColorThemeChange(i){return this.themingParticipants.push(i),this.onThemingParticipantAddedEmitter.fire(i),N.toDisposable(()=>{const n=this.themingParticipants.indexOf(i);this.themingParticipants.splice(n,1)})}getThemingParticipants(){return this.themingParticipants}}let s=new o;M.Registry.add(e.Extensions.ThemingContribution,s);function a(r){return s.onColorThemeChange(r)}e.registerThemingParticipant=a;class u extends N.Disposable{constructor(i){super();this.themeService=i,this.theme=i.getColorTheme(),this._register(this.themeService.onDidColorThemeChange(n=>this.onThemeChange(n)))}onThemeChange(i){this.theme=i,this.updateStyles()}updateStyles(){}}e.Themable=u}),define(Q[583],J([0,1,7,2,8,24,362,107,53,11]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationTypeOptionsProvider=e.DecorationSubTypeOptionsProvider=e.CodeEditorServiceImpl=e.GlobalStyleSheet=e.RefCountedStyleSheet=void 0;class p{constructor(t,l,h){this._parent=t,this._editorId=l,this._styleSheet=h,this._refCount=0}ref(){this._refCount++}unref(){var t;this._refCount--,this._refCount===0&&((t=this._styleSheet.parentNode)===null||t===void 0||t.removeChild(this._styleSheet),this._parent._removeEditorStyleSheets(this._editorId))}insertRule(t,l){this._styleSheet.sheet.insertRule(t,l)}removeRulesContainingSelector(t){b.removeCSSRulesContainingSelector(t,this._styleSheet)}}e.RefCountedStyleSheet=p;class c{constructor(t){this._styleSheet=t}ref(){}unref(){}insertRule(t,l){this._styleSheet.sheet.insertRule(t,l)}removeRulesContainingSelector(t){b.removeCSSRulesContainingSelector(t,this._styleSheet)}}e.GlobalStyleSheet=c;let o=class extends S.AbstractCodeEditorService{constructor(t,l){super();this._decorationOptionProviders=new Map,this._editorStyleSheets=new Map,this._globalStyleSheet=t||null,this._themeService=l}_getOrCreateGlobalStyleSheet(){return this._globalStyleSheet||(this._globalStyleSheet=new c(b.createStyleSheet())),this._globalStyleSheet}_getOrCreateStyleSheet(t){if(!t)return this._getOrCreateGlobalStyleSheet();const l=t.getContainerDomNode();if(!b.isInShadowDOM(l))return this._getOrCreateGlobalStyleSheet();const h=t.getId();if(!this._editorStyleSheets.has(h)){const m=new p(this,h,b.createStyleSheet(l));this._editorStyleSheets.set(h,m)}return this._editorStyleSheets.get(h)}_removeEditorStyleSheets(t){this._editorStyleSheets.delete(t)}registerDecorationType(t,l,h,m){let _=this._decorationOptionProviders.get(t);if(!_){const f=this._getOrCreateStyleSheet(m),v={styleSheet:f,key:t,parentTypeKey:h,options:l||Object.create(null)};h?_=new s(this._themeService,f,v):_=new a(this._themeService,f,v),this._decorationOptionProviders.set(t,_),this._onDecorationTypeRegistered.fire(t)}_.refCount++}removeDecorationType(t){const l=this._decorationOptionProviders.get(t);l&&(l.refCount--,l.refCount<=0&&(this._decorationOptionProviders.delete(t),l.dispose(),this.listCodeEditors().forEach(h=>h.removeDecorations(t))))}resolveDecorationOptions(t,l){const h=this._decorationOptionProviders.get(t);if(!h)throw new Error("Unknown decoration type key: "+t);return h.getOptions(this,l)}};o=Me([_e(1,g.IThemeService)],o),e.CodeEditorServiceImpl=o;class s{constructor(t,l,h){this._styleSheet=l,this._styleSheet.ref(),this._parentTypeKey=h.parentTypeKey,this.refCount=0,this._beforeContentRules=new r(3,h,t),this._afterContentRules=new r(4,h,t)}getOptions(t,l){const h=t.resolveDecorationOptions(this._parentTypeKey,!0);return this._beforeContentRules&&(h.beforeContentClassName=this._beforeContentRules.className),this._afterContentRules&&(h.afterContentClassName=this._afterContentRules.className),h}dispose(){this._beforeContentRules&&(this._beforeContentRules.dispose(),this._beforeContentRules=null),this._afterContentRules&&(this._afterContentRules.dispose(),this._afterContentRules=null),this._styleSheet.unref()}}e.DecorationSubTypeOptionsProvider=s;class a{constructor(t,l,h){this._disposables=new N.DisposableStore,this._styleSheet=l,this._styleSheet.ref(),this.refCount=0;const m=I=>{const k=new r(I,h,t);if(this._disposables.add(k),k.hasContent)return k.className},_=I=>{const k=new r(I,h,t);return this._disposables.add(k),k.hasContent?{className:k.className,hasLetterSpacing:k.hasLetterSpacing}:null};this.className=m(0);const f=_(1);f&&(this.inlineClassName=f.className,this.inlineClassNameAffectsLetterSpacing=f.hasLetterSpacing),this.beforeContentClassName=m(3),this.afterContentClassName=m(4),this.glyphMarginClassName=m(2);const v=h.options;this.isWholeLine=Boolean(v.isWholeLine),this.stickiness=v.rangeBehavior;const y=v.light&&v.light.overviewRulerColor||v.overviewRulerColor,L=v.dark&&v.dark.overviewRulerColor||v.overviewRulerColor;(typeof y!="undefined"||typeof L!="undefined")&&(this.overviewRuler={color:y||L,darkColor:L||y,position:v.overviewRulerLane||d.OverviewRulerLane.Center})}getOptions(t,l){return l?{inlineClassName:this.inlineClassName,beforeContentClassName:this.beforeContentClassName,afterContentClassName:this.afterContentClassName,className:this.className,glyphMarginClassName:this.glyphMarginClassName,isWholeLine:this.isWholeLine,overviewRuler:this.overviewRuler,stickiness:this.stickiness}:this}dispose(){this._disposables.dispose(),this._styleSheet.unref()}}e.DecorationTypeOptionsProvider=a;const u={color:"color:{0} !important;",opacity:"opacity:{0};",backgroundColor:"background-color:{0};",outline:"outline:{0};",outlineColor:"outline-color:{0};",outlineStyle:"outline-style:{0};",outlineWidth:"outline-width:{0};",border:"border:{0};",borderColor:"border-color:{0};",borderRadius:"border-radius:{0};",borderSpacing:"border-spacing:{0};",borderStyle:"border-style:{0};",borderWidth:"border-width:{0};",fontStyle:"font-style:{0};",fontWeight:"font-weight:{0};",fontSize:"font-size:{0};",fontFamily:"font-family:{0};",textDecoration:"text-decoration:{0};",cursor:"cursor:{0};",letterSpacing:"letter-spacing:{0};",gutterIconPath:"background:{0} center center no-repeat;",gutterIconSize:"background-size:{0};",contentText:"content:'{0}';",contentIconPath:"content:{0};",margin:"margin:{0};",padding:"padding:{0};",width:"width:{0};",height:"height:{0};"};class r{constructor(t,l,h){this._theme=h.getColorTheme(),this._ruleType=t,this._providerArgs=l,this._usesThemeColors=!1,this._hasContent=!1,this._hasLetterSpacing=!1;let m=i.getClassName(this._providerArgs.key,t);this._providerArgs.parentTypeKey&&(m=m+" "+i.getClassName(this._providerArgs.parentTypeKey,t)),this._className=m,this._unThemedSelector=i.getSelector(this._providerArgs.key,this._providerArgs.parentTypeKey,t),this._buildCSS(),this._usesThemeColors?this._themeListener=h.onDidColorThemeChange(_=>{this._theme=h.getColorTheme(),this._removeCSS(),this._buildCSS()}):this._themeListener=null}dispose(){this._hasContent&&(this._removeCSS(),this._hasContent=!1),this._themeListener&&(this._themeListener.dispose(),this._themeListener=null)}get hasContent(){return this._hasContent}get hasLetterSpacing(){return this._hasLetterSpacing}get className(){return this._className}_buildCSS(){const t=this._providerArgs.options;let l,h,m;switch(this._ruleType){case 0:l=this.getCSSTextForModelDecorationClassName(t),h=this.getCSSTextForModelDecorationClassName(t.light),m=this.getCSSTextForModelDecorationClassName(t.dark);break;case 1:l=this.getCSSTextForModelDecorationInlineClassName(t),h=this.getCSSTextForModelDecorationInlineClassName(t.light),m=this.getCSSTextForModelDecorationInlineClassName(t.dark);break;case 2:l=this.getCSSTextForModelDecorationGlyphMarginClassName(t),h=this.getCSSTextForModelDecorationGlyphMarginClassName(t.light),m=this.getCSSTextForModelDecorationGlyphMarginClassName(t.dark);break;case 3:l=this.getCSSTextForModelDecorationContentClassName(t.before),h=this.getCSSTextForModelDecorationContentClassName(t.light&&t.light.before),m=this.getCSSTextForModelDecorationContentClassName(t.dark&&t.dark.before);break;case 4:l=this.getCSSTextForModelDecorationContentClassName(t.after),h=this.getCSSTextForModelDecorationContentClassName(t.light&&t.light.after),m=this.getCSSTextForModelDecorationContentClassName(t.dark&&t.dark.after);break;default:throw new Error("Unknown rule type: "+this._ruleType)}const _=this._providerArgs.styleSheet;let f=!1;l.length>0&&(_.insertRule(`${this._unThemedSelector} {${l}}`,0),f=!0),h.length>0&&(_.insertRule(`.vs${this._unThemedSelector} {${h}}`,0),f=!0),m.length>0&&(_.insertRule(`.vs-dark${this._unThemedSelector}, .hc-black${this._unThemedSelector} {${m}}`,0),f=!0),this._hasContent=f}_removeCSS(){this._providerArgs.styleSheet.removeRulesContainingSelector(this._unThemedSelector)}getCSSTextForModelDecorationClassName(t){if(!t)return"";const l=[];return this.collectCSSText(t,["backgroundColor"],l),this.collectCSSText(t,["outline","outlineColor","outlineStyle","outlineWidth"],l),this.collectBorderSettingsCSSText(t,l),l.join("")}getCSSTextForModelDecorationInlineClassName(t){if(!t)return"";const l=[];return this.collectCSSText(t,["fontStyle","fontWeight","textDecoration","cursor","color","opacity","letterSpacing"],l),t.letterSpacing&&(this._hasLetterSpacing=!0),l.join("")}getCSSTextForModelDecorationContentClassName(t){if(!t)return"";const l=[];if(typeof t!="undefined"){if(this.collectBorderSettingsCSSText(t,l),typeof t.contentIconPath!="undefined"&&l.push(M.format(u.contentIconPath,b.asCSSUrl(w.URI.revive(t.contentIconPath)))),typeof t.contentText=="string"){const m=t.contentText.match(/^.*$/m)[0].replace(/['\\]/g,"\\$&");l.push(M.format(u.contentText,m))}this.collectCSSText(t,["fontStyle","fontWeight","fontSize","fontFamily","textDecoration","color","opacity","backgroundColor","margin","padding"],l),this.collectCSSText(t,["width","height"],l)&&l.push("display:inline-block;")}return l.join("")}getCSSTextForModelDecorationGlyphMarginClassName(t){if(!t)return"";const l=[];return typeof t.gutterIconPath!="undefined"&&(l.push(M.format(u.gutterIconPath,b.asCSSUrl(w.URI.revive(t.gutterIconPath)))),typeof t.gutterIconSize!="undefined"&&l.push(M.format(u.gutterIconSize,t.gutterIconSize))),l.join("")}collectBorderSettingsCSSText(t,l){return this.collectCSSText(t,["border","borderColor","borderRadius","borderSpacing","borderStyle","borderWidth"],l)?(l.push(M.format("box-sizing: border-box;")),!0):!1}collectCSSText(t,l,h){const m=h.length;for(let _ of l){const f=this.resolveValue(t[_]);typeof f=="string"&&h.push(M.format(u[_],f))}return h.length!==m}resolveValue(t){if(C.isThemeColor(t)){this._usesThemeColors=!0;const l=this._theme.getColor(t.id);return l?l.toString():"transparent"}return t}}class i{static getClassName(t,l){return"ced-"+t+"-"+l}static getSelector(t,l,h){let m=".monaco-editor ."+this.getClassName(t,h);return l&&(m=m+"."+this.getClassName(l,h)),h===3?m+="::before":h===4&&(m+="::after"),m}}}),define(Q[584],J([0,1,7,30,61,45,11]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorScrollbar=void 0;class C extends w.ViewPart{constructor(g,p,c,o){super(g);const s=this._context.configuration.options,a=s.get(87),u=s.get(61),r=s.get(30),i=s.get(90),n={listenOnDomNode:c.domNode,className:"editor-scrollable "+S.getThemeTypeSelector(g.theme.type),useShadows:!1,lazyRender:!0,vertical:a.vertical,horizontal:a.horizontal,verticalHasArrows:a.verticalHasArrows,horizontalHasArrows:a.horizontalHasArrows,verticalScrollbarSize:a.verticalScrollbarSize,verticalSliderSize:a.verticalSliderSize,horizontalScrollbarSize:a.horizontalScrollbarSize,horizontalSliderSize:a.horizontalSliderSize,handleMouseWheel:a.handleMouseWheel,alwaysConsumeMouseWheel:a.alwaysConsumeMouseWheel,arrowSize:a.arrowSize,mouseWheelScrollSensitivity:u,fastScrollSensitivity:r,scrollPredominantAxis:i,scrollByPage:a.scrollByPage};this.scrollbar=this._register(new M.SmoothScrollableElement(p.domNode,n,this._context.viewLayout.getScrollable())),w.PartFingerprints.write(this.scrollbar.getDomNode(),5),this.scrollbarDomNode=N.createFastDomNode(this.scrollbar.getDomNode()),this.scrollbarDomNode.setPosition("absolute"),this._setLayout();const t=(l,h,m)=>{const _={};if(h){const f=l.scrollTop;f&&(_.scrollTop=this._context.viewLayout.getCurrentScrollTop()+f,l.scrollTop=0)}if(m){const f=l.scrollLeft;f&&(_.scrollLeft=this._context.viewLayout.getCurrentScrollLeft()+f,l.scrollLeft=0)}this._context.model.setScrollPosition(_,1)};this._register(b.addDisposableListener(c.domNode,"scroll",l=>t(c.domNode,!0,!0))),this._register(b.addDisposableListener(p.domNode,"scroll",l=>t(p.domNode,!0,!1))),this._register(b.addDisposableListener(o.domNode,"scroll",l=>t(o.domNode,!0,!1))),this._register(b.addDisposableListener(this.scrollbarDomNode.domNode,"scroll",l=>t(this.scrollbarDomNode.domNode,!0,!1)))}dispose(){super.dispose()}_setLayout(){const g=this._context.configuration.options,p=g.get(124);this.scrollbarDomNode.setLeft(p.contentLeft),g.get(59).side==="right"?this.scrollbarDomNode.setWidth(p.contentWidth+p.minimap.minimapWidth):this.scrollbarDomNode.setWidth(p.contentWidth),this.scrollbarDomNode.setHeight(p.height)}getOverviewRulerLayoutInfo(){return this.scrollbar.getOverviewRulerLayoutInfo()}getDomNode(){return this.scrollbarDomNode}delegateVerticalScrollbarMouseDown(g){this.scrollbar.delegateVerticalScrollbarMouseDown(g)}onConfigurationChanged(g){if(g.hasChanged(87)||g.hasChanged(61)||g.hasChanged(30)){const p=this._context.configuration.options,c=p.get(87),o=p.get(61),s=p.get(30),a=p.get(90),u={handleMouseWheel:c.handleMouseWheel,mouseWheelScrollSensitivity:o,fastScrollSensitivity:s,scrollPredominantAxis:a};this.scrollbar.updateOptions(u)}return g.hasChanged(124)&&this._setLayout(),!0}onScrollChanged(g){return!0}onThemeChanged(g){return this.scrollbar.updateClassName("editor-scrollable "+S.getThemeTypeSelector(this._context.theme.type)),!0}prepareRender(g){}render(g){this.scrollbar.renderNow()}}e.EditorScrollbar=C}),define(Q[585],J([0,1,7,30,90,2,17,8,165,45,38,3,216,244,63,22,11,21,60,365,53,88,326]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Minimap=void 0;const m=140,_=2;class f{constructor(A,B,F){const D=A.options,R=D.get(122),W=D.get(124),x=W.minimap,K=D.get(38),Y=D.get(59);this.renderMinimap=x.renderMinimap,this.size=Y.size,this.minimapHeightIsEditorHeight=x.minimapHeightIsEditorHeight,this.scrollBeyondLastLine=D.get(89),this.showSlider=Y.showSlider,this.pixelRatio=R,this.typicalHalfwidthCharacterWidth=K.typicalHalfwidthCharacterWidth,this.lineHeight=D.get(53),this.minimapLeft=x.minimapLeft,this.minimapWidth=x.minimapWidth,this.minimapHeight=W.height,this.canvasInnerWidth=x.minimapCanvasInnerWidth,this.canvasInnerHeight=x.minimapCanvasInnerHeight,this.canvasOuterWidth=x.minimapCanvasOuterWidth,this.canvasOuterHeight=x.minimapCanvasOuterHeight,this.isSampling=x.minimapIsSampling,this.editorHeight=W.height,this.fontScale=x.minimapScale,this.minimapLineHeight=x.minimapLineHeight,this.minimapCharWidth=1*this.fontScale,this.charRenderer=h.once(()=>t.MinimapCharRendererFactory.create(this.fontScale,K.fontFamily)),this.backgroundColor=f._getMinimapBackground(B,F)}static _getMinimapBackground(A,B){const F=A.getColor(u.minimapBackground);return F?new o.RGBA8(F.rgba.r,F.rgba.g,F.rgba.b,F.rgba.a):B.getColor(2)}equals(A){return this.renderMinimap===A.renderMinimap&&this.size===A.size&&this.minimapHeightIsEditorHeight===A.minimapHeightIsEditorHeight&&this.scrollBeyondLastLine===A.scrollBeyondLastLine&&this.showSlider===A.showSlider&&this.pixelRatio===A.pixelRatio&&this.typicalHalfwidthCharacterWidth===A.typicalHalfwidthCharacterWidth&&this.lineHeight===A.lineHeight&&this.minimapLeft===A.minimapLeft&&this.minimapWidth===A.minimapWidth&&this.minimapHeight===A.minimapHeight&&this.canvasInnerWidth===A.canvasInnerWidth&&this.canvasInnerHeight===A.canvasInnerHeight&&this.canvasOuterWidth===A.canvasOuterWidth&&this.canvasOuterHeight===A.canvasOuterHeight&&this.isSampling===A.isSampling&&this.editorHeight===A.editorHeight&&this.fontScale===A.fontScale&&this.minimapLineHeight===A.minimapLineHeight&&this.minimapCharWidth===A.minimapCharWidth&&this.backgroundColor&&this.backgroundColor.equals(A.backgroundColor)}}class v{constructor(A,B,F,D,R,W,x,K){this.scrollTop=A,this.scrollHeight=B,this.sliderNeeded=F,this._computedSliderRatio=D,this.sliderTop=R,this.sliderHeight=W,this.startLineNumber=x,this.endLineNumber=K}getDesiredScrollTopFromDelta(A){return Math.round(this.scrollTop+A/this._computedSliderRatio)}getDesiredScrollTopFromTouchLocation(A){return Math.round((A-this.sliderHeight/2)/this._computedSliderRatio)}static create(A,B,F,D,R,W,x,K,Y,ee,se){const ne=A.pixelRatio,le=A.minimapLineHeight,X=Math.floor(A.canvasInnerHeight/le),z=A.lineHeight;if(A.minimapHeightIsEditorHeight){const ie=K*A.lineHeight+(A.scrollBeyondLastLine?R-A.lineHeight:0),oe=Math.max(1,Math.floor(R*R/ie)),ae=Math.max(0,A.minimapHeight-oe),G=ae/(ee-R),j=Y*G,te=ae>0,Z=Math.floor(A.canvasInnerHeight/A.minimapLineHeight);return new v(Y,ee,te,G,j,oe,1,Math.min(x,Z))}let P;if(W&&F!==x){const ie=F-B+1;P=Math.floor(ie*le/ne)}else{const ie=R/z;P=Math.floor(ie*le/ne)}let V;A.scrollBeyondLastLine?V=(x-1)*le/ne:V=Math.max(0,x*le/ne-P),V=Math.min(A.minimapHeight-P,V);const U=V/(ee-R),H=Y*U;let $=0;if(A.scrollBeyondLastLine&&($=R/z-1),X>=x+$){const ie=1,oe=x,ae=V>0;return new v(Y,ee,ae,U,H,P,ie,oe)}else{let ie=Math.max(1,Math.floor(B-H*ne/le));se&&se.scrollHeight===ee&&(se.scrollTop>Y&&(ie=Math.min(ie,se.startLineNumber)),se.scrollTopy.INVALID),this._renderedLines._set(A.startLineNumber,F)}linesEquals(A){if(!this.scrollEquals(A))return!1;const F=this._renderedLines._get().lines;for(let D=0,R=F.length;D1){for(let $=0,ie=x-1;$0&&this.minimapLines[F-1]>=A;)F--;let D=this.modelLineToMinimapLine(B)-1;for(;D+1B)return null}return[F+1,D+1]}decorationLineRangeToMinimapLineRange(A,B){let F=this.modelLineToMinimapLine(A),D=this.modelLineToMinimapLine(B);return A!==B&&D===F&&(D===this.minimapLines.length?F>1&&F--:D++),[F,D]}onLinesDeleted(A){const B=A.toLineNumber-A.fromLineNumber+1;let F=this.minimapLines.length,D=0;for(let R=this.minimapLines.length-1;R>=0&&!(this.minimapLines[R]=0&&!(this.minimapLines[F]0,scrollWidth:A.scrollWidth,scrollHeight:A.scrollHeight,viewportStartLineNumber:B,viewportEndLineNumber:F,viewportStartLineNumberVerticalOffset:A.getVerticalOffsetForLineNumber(B),scrollTop:A.scrollTop,scrollLeft:A.scrollLeft,viewportWidth:A.viewportWidth,viewportHeight:A.viewportHeight};this._actual.render(D)}_recreateLineSampling(){this._minimapSelections=null;const A=Boolean(this._samplingState),[B,F]=k.compute(this.options,this._context.model.getLineCount(),this._samplingState);if(this._samplingState=B,A&&this._samplingState)for(const D of F)switch(D.type){case"deleted":this._actual.onLinesDeleted(D.deleteFromLineNumber,D.deleteToLineNumber);break;case"inserted":this._actual.onLinesInserted(D.insertFromLineNumber,D.insertToLineNumber);break;case"flush":this._actual.onFlushed();break}}getLineCount(){return this._samplingState?this._samplingState.minimapLines.length:this._context.model.getLineCount()}getRealLineCount(){return this._context.model.getLineCount()}getLineContent(A){return this._samplingState?this._context.model.getLineContent(this._samplingState.minimapLines[A-1]):this._context.model.getLineContent(A)}getMinimapLinesRenderingData(A,B,F){if(this._samplingState){let D=[];for(let R=0,W=B-A+1;R{if(F.preventDefault(),this._model.options.renderMinimap!==0&&!!this._lastRenderData){if(this._model.options.size!=="proportional"){if(F.leftButton&&this._lastRenderData){const Y=b.getDomNodePagePosition(this._slider.domNode),ee=Y.top+Y.height/2;this._startSliderDragging(F.buttons,F.posx,ee,F.posy,this._lastRenderData.renderedLayout)}return}const R=this._model.options.minimapLineHeight,W=this._model.options.canvasInnerHeight/this._model.options.canvasOuterHeight*F.browserEvent.offsetY;let K=Math.floor(W/R)+this._lastRenderData.renderedLayout.startLineNumber;K=Math.min(K,this._model.getLineCount()),this._model.revealLineNumber(K)}}),this._sliderMouseMoveMonitor=new M.GlobalMouseMoveMonitor,this._sliderMouseDownListener=b.addStandardDisposableListener(this._slider.domNode,"mousedown",F=>{F.preventDefault(),F.stopPropagation(),F.leftButton&&this._lastRenderData&&this._startSliderDragging(F.buttons,F.posx,F.posy,F.posy,this._lastRenderData.renderedLayout)}),this._gestureDisposable=n.Gesture.addTarget(this._domNode.domNode),this._sliderTouchStartListener=b.addDisposableListener(this._domNode.domNode,n.EventType.Start,F=>{F.preventDefault(),F.stopPropagation(),this._lastRenderData&&(this._slider.toggleClassName("active",!0),this._gestureInProgress=!0,this.scrollDueToTouchEvent(F))},{passive:!1}),this._sliderTouchMoveListener=b.addDisposableListener(this._domNode.domNode,n.EventType.Change,F=>{F.preventDefault(),F.stopPropagation(),this._lastRenderData&&this._gestureInProgress&&this.scrollDueToTouchEvent(F)},{passive:!1}),this._sliderTouchEndListener=b.addStandardDisposableListener(this._domNode.domNode,n.EventType.End,F=>{F.preventDefault(),F.stopPropagation(),this._gestureInProgress=!1,this._slider.toggleClassName("active",!1)})}_startSliderDragging(A,B,F,D,R){this._slider.toggleClassName("active",!0);const W=(x,K)=>{const Y=Math.abs(K-B);if(S.isWindows&&Y>m){this._model.setScrollTop(R.scrollTop);return}const ee=x-F;this._model.setScrollTop(R.getDesiredScrollTopFromDelta(ee))};D!==F&&W(D,B),this._sliderMouseMoveMonitor.startMonitoring(this._slider.domNode,A,M.standardMouseMoveMerger,x=>W(x.posy,x.posx),()=>{this._slider.toggleClassName("active",!1)})}scrollDueToTouchEvent(A){const B=this._domNode.domNode.getBoundingClientRect().top,F=this._lastRenderData.renderedLayout.getDesiredScrollTopFromTouchLocation(A.pageY-B);this._model.setScrollTop(F)}dispose(){this._mouseDownListener.dispose(),this._sliderMouseMoveMonitor.dispose(),this._sliderMouseDownListener.dispose(),this._gestureDisposable.dispose(),this._sliderTouchStartListener.dispose(),this._sliderTouchMoveListener.dispose(),this._sliderTouchEndListener.dispose(),super.dispose()}_getMinimapDomNodeClassName(){return this._model.options.showSlider==="always"?"minimap slider-always":"minimap slider-mouseover"}getDomNode(){return this._domNode}_applyLayout(){this._domNode.setLeft(this._model.options.minimapLeft),this._domNode.setWidth(this._model.options.minimapWidth),this._domNode.setHeight(this._model.options.minimapHeight),this._shadow.setHeight(this._model.options.minimapHeight),this._canvas.setWidth(this._model.options.canvasOuterWidth),this._canvas.setHeight(this._model.options.canvasOuterHeight),this._canvas.domNode.width=this._model.options.canvasInnerWidth,this._canvas.domNode.height=this._model.options.canvasInnerHeight,this._decorationsCanvas.setWidth(this._model.options.canvasOuterWidth),this._decorationsCanvas.setHeight(this._model.options.canvasOuterHeight),this._decorationsCanvas.domNode.width=this._model.options.canvasInnerWidth,this._decorationsCanvas.domNode.height=this._model.options.canvasInnerHeight,this._slider.setWidth(this._model.options.minimapWidth)}_getBuffer(){return this._buffers||this._model.options.canvasInnerWidth>0&&this._model.options.canvasInnerHeight>0&&(this._buffers=new I(this._canvas.domNode.getContext("2d"),this._model.options.canvasInnerWidth,this._model.options.canvasInnerHeight,this._model.options.backgroundColor)),this._buffers?this._buffers.getBuffer():null}onDidChangeOptions(){this._lastRenderData=null,this._buffers=null,this._applyLayout(),this._domNode.setClassName(this._getMinimapDomNodeClassName())}onSelectionChanged(){return this._renderDecorations=!0,!0}onDecorationsChanged(){return this._renderDecorations=!0,!0}onFlushed(){return this._lastRenderData=null,!0}onLinesChanged(A,B){return this._lastRenderData?this._lastRenderData.onLinesChanged(A,B):!1}onLinesDeleted(A,B){return this._lastRenderData&&this._lastRenderData.onLinesDeleted(A,B),!0}onLinesInserted(A,B){return this._lastRenderData&&this._lastRenderData.onLinesInserted(A,B),!0}onScrollChanged(){return this._renderDecorations=!0,!0}onThemeChanged(){return this._selectionColor=this._theme.getColor(u.minimapSelection),this._renderDecorations=!0,!0}onTokensChanged(A){return this._lastRenderData?this._lastRenderData.onTokensChanged(A):!1}onTokensColorsChanged(){return this._lastRenderData=null,this._buffers=null,!0}onZonesChanged(){return this._lastRenderData=null,!0}render(A){if(this._model.options.renderMinimap===0){this._shadow.setClassName("minimap-shadow-hidden"),this._sliderHorizontal.setWidth(0),this._sliderHorizontal.setHeight(0);return}A.scrollLeft+A.viewportWidth>=A.scrollWidth?this._shadow.setClassName("minimap-shadow-hidden"):this._shadow.setClassName("minimap-shadow-visible");const F=v.create(this._model.options,A.viewportStartLineNumber,A.viewportEndLineNumber,A.viewportStartLineNumberVerticalOffset,A.viewportHeight,A.viewportContainsWhitespaceGaps,this._model.getLineCount(),this._model.getRealLineCount(),A.scrollTop,A.scrollHeight,this._lastRenderData?this._lastRenderData.renderedLayout:null);this._slider.setDisplay(F.sliderNeeded?"block":"none"),this._slider.setTop(F.sliderTop),this._slider.setHeight(F.sliderHeight);const D=A.scrollLeft/this._model.options.typicalHalfwidthCharacterWidth,R=Math.min(this._model.options.minimapWidth,Math.round(D*this._model.options.minimapCharWidth/this._model.options.pixelRatio));this._sliderHorizontal.setLeft(R),this._sliderHorizontal.setWidth(this._model.options.minimapWidth-R),this._sliderHorizontal.setTop(0),this._sliderHorizontal.setHeight(F.sliderHeight),this.renderDecorations(F),this._lastRenderData=this.renderLines(F)}renderDecorations(A){if(this._renderDecorations){this._renderDecorations=!1;const B=this._model.getSelections(),F=this._model.getMinimapDecorationsInViewport(A.startLineNumber,A.endLineNumber),{canvasInnerWidth:D,canvasInnerHeight:R}=this._model.options,W=this._model.options.minimapLineHeight,x=this._model.options.minimapCharWidth,K=this._model.getOptions().tabSize,Y=this._decorationsCanvas.domNode.getContext("2d");Y.clearRect(0,0,D,R);const ee=new Map;for(let se=0;sethis._model.options.canvasInnerHeight)){let ne=B.get(W);const le=!ne;if(!ne){const $=this._model.getLineContent(W);ne=[p.MINIMAP_GUTTER_WIDTH];for(let ie=1;ie<$.length+1;ie++){const oe=$.charCodeAt(ie-1),ae=oe===9?Y*ee:C.isFullWidthCharacter(oe)?2*ee:ee;ne[ie]=ne[ie-1]+ae}B.set(W,ne)}const{startColumn:X,endColumn:z,startLineNumber:P,endLineNumber:V}=F,U=P===W?ne[X-1]:p.MINIMAP_GUTTER_WIDTH,H=V>W?ne.length-1:z-1;if(H>0){const $=ne[H]-U||2;this.renderDecoration(A,D,U,se,$,x)}le&&this.renderLineHighlight(A,D,se,x)}}renderLineHighlight(A,B,F,D){A.fillStyle=B&&B.transparent(.5).toString()||"",A.fillRect(p.MINIMAP_GUTTER_WIDTH,F,A.canvas.width,D)}renderDecoration(A,B,F,D,R,W){A.fillStyle=B&&B.toString()||"",A.fillRect(F,D,R,W)}renderLines(A){const B=A.startLineNumber,F=A.endLineNumber,D=this._model.options.minimapLineHeight;if(this._lastRenderData&&this._lastRenderData.linesEquals(A)){const Z=this._lastRenderData._get();return new L(A,Z.imageData,Z.lines)}const R=this._getBuffer();if(!R)return null;let[W,x,K]=T._renderUntouchedLines(R,B,F,D,this._lastRenderData);const Y=this._model.getMinimapLinesRenderingData(B,F,K),ee=this._model.getOptions().tabSize,se=this._model.options.backgroundColor,ne=this._model.tokensColorTracker,le=ne.backgroundIsLight(),X=this._model.options.renderMinimap,z=this._model.options.charRenderer(),P=this._model.options.fontScale,V=this._model.options.minimapCharWidth,H=(X===1?2:2+1)*P,$=D>H?Math.floor((D-H)/2):0;let ie=0;const oe=[];for(let Z=0,ue=F-B+1;Z=0&&teP)return;const te=X.charCodeAt(H);if(te===9){const Z=ee-(H+$)%ee;$+=Z-1,U+=Z*R}else if(te===32)U+=R;else{const Z=C.isFullWidthCharacter(te)?2:1;for(let ue=0;ueP)return}}}}}r.registerThemingParticipant((O,A)=>{const B=O.getColor(u.minimapBackground);B&&A.addRule(`.monaco-editor .minimap > canvas { opacity: ${B.rgba.a}; will-change: opacity; }`);const F=O.getColor(u.minimapSliderBackground);F&&A.addRule(`.monaco-editor .minimap-slider .minimap-slider-horizontal { background: ${F}; }`);const D=O.getColor(u.minimapSliderHoverBackground);D&&A.addRule(`.monaco-editor .minimap-slider:hover .minimap-slider-horizontal { background: ${D}; }`);const R=O.getColor(u.minimapSliderActiveBackground);R&&A.addRule(`.monaco-editor .minimap-slider.active .minimap-slider-horizontal { background: ${R}; }`);const W=O.getColor(u.scrollbarShadow);W&&A.addRule(`.monaco-editor .minimap-shadow-visible { box-shadow: ${W} -6px 0 6px -6px inset; }`)})}),define(Q[586],J([0,1,30,45,22,11,329]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollDecorationViewPart=void 0;class S extends N.ViewPart{constructor(d){super(d);this._scrollTop=0,this._width=0,this._updateWidth(),this._shouldShow=!1;const p=this._context.configuration.options.get(87);this._useShadows=p.useShadows,this._domNode=b.createFastDomNode(document.createElement("div")),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true")}dispose(){super.dispose()}_updateShouldShow(){const d=this._useShadows&&this._scrollTop>0;return this._shouldShow!==d?(this._shouldShow=d,!0):!1}getDomNode(){return this._domNode}_updateWidth(){const g=this._context.configuration.options.get(124);g.minimap.renderMinimap===0||g.minimap.minimapWidth>0&&g.minimap.minimapLeft===0?this._width=g.width:this._width=g.width-g.minimap.minimapWidth-g.verticalScrollbarWidth}onConfigurationChanged(d){const p=this._context.configuration.options.get(87);return this._useShadows=p.useShadows,this._updateWidth(),this._updateShouldShow(),!0}onScrollChanged(d){return this._scrollTop=d.scrollTop,this._updateShouldShow()}prepareRender(d){}render(d){this._domNode.setWidth(this._width),this._domNode.setClassName(this._shouldShow?"scroll-decoration":"")}}e.ScrollDecorationViewPart=S,w.registerThemingParticipant((C,d)=>{const g=C.getColor(M.scrollbarShadow);g&&d.addRule(`.monaco-editor .scroll-decoration { box-shadow: ${g} 0 6px 6px -6px inset; }`)})}),define(Q[587],J([0,1,94,22,11,330]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionsOverlay=void 0;class w{constructor(o){this.left=o.left,this.width=o.width,this.startStyle=null,this.endStyle=null}}class S{constructor(o,s){this.lineNumber=o,this.ranges=s}}function C(c){return new w(c)}function d(c){return new S(c.lineNumber,c.ranges.map(C))}class g extends b.DynamicViewOverlay{constructor(o){super();this._previousFrameVisibleRangesWithStyle=[],this._context=o;const s=this._context.configuration.options;this._lineHeight=s.get(53),this._roundedSelection=s.get(85),this._typicalHalfwidthCharacterWidth=s.get(38).typicalHalfwidthCharacterWidth,this._selections=[],this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(o){const s=this._context.configuration.options;return this._lineHeight=s.get(53),this._roundedSelection=s.get(85),this._typicalHalfwidthCharacterWidth=s.get(38).typicalHalfwidthCharacterWidth,!0}onCursorStateChanged(o){return this._selections=o.selections.slice(0),!0}onDecorationsChanged(o){return!0}onFlushed(o){return!0}onLinesChanged(o){return!0}onLinesDeleted(o){return!0}onLinesInserted(o){return!0}onScrollChanged(o){return o.scrollTopChanged}onZonesChanged(o){return!0}_visibleRangesHaveGaps(o){for(let s=0,a=o.length;s1)return!0;return!1}_enrichVisibleRangesWithStyle(o,s,a){const u=this._typicalHalfwidthCharacterWidth/4;let r=null,i=null;if(a&&a.length>0&&s.length>0){const n=s[0].lineNumber;if(n===o.startLineNumber)for(let l=0;!r&&l=0;l--)a[l].lineNumber===t&&(i=a[l].ranges[0]);r&&!r.startStyle&&(r=null),i&&!i.startStyle&&(i=null)}for(let n=0,t=s.length;n0){const v=s[n-1].ranges[0].left,y=s[n-1].ranges[0].left+s[n-1].ranges[0].width;p(h-v)v&&(_.top=1),p(m-y)'}_actualRenderOneSelection(o,s,a,u){if(u.length!==0){const r=!!u[0].ranges[0].startStyle,i=this._lineHeight.toString(),n=(this._lineHeight-1).toString(),t=u[0].lineNumber,l=u[u.length-1].lineNumber;for(let h=0,m=u.length;h1,l)}this._previousFrameVisibleRangesWithStyle=r,this._renderResult=s.map(([i,n])=>i+n)}render(o,s){if(!this._renderResult)return"";const a=s-o;return a<0||a>=this._renderResult.length?"":this._renderResult[a]}}e.SelectionsOverlay=g,g.SELECTION_CLASS_NAME="selected-text",g.SELECTION_TOP_LEFT="top-left-radius",g.SELECTION_BOTTOM_LEFT="bottom-left-radius",g.SELECTION_TOP_RIGHT="top-right-radius",g.SELECTION_BOTTOM_RIGHT="bottom-right-radius",g.EDITOR_BACKGROUND_CLASS_NAME="monaco-editor-background",g.ROUNDED_PIECE_WIDTH=10,M.registerThemingParticipant((c,o)=>{const s=c.getColor(N.editorSelectionBackground);s&&o.addRule(`.monaco-editor .focused .selected-text { background-color: ${s}; }`);const a=c.getColor(N.editorInactiveSelection);a&&o.addRule(`.monaco-editor .selected-text { background-color: ${a}; }`);const u=c.getColor(N.editorSelectionForeground);u&&!u.isTransparent()&&o.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${u}; }`)});function p(c){return c<0?-c:c}}),define(Q[49],J([0,1,460,29,22,11]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.overviewRulerInfo=e.overviewRulerWarning=e.overviewRulerError=e.overviewRulerRangeHighlight=e.editorUnnecessaryCodeOpacity=e.editorUnnecessaryCodeBorder=e.editorGutter=e.editorOverviewRulerBackground=e.editorOverviewRulerBorder=e.editorBracketMatchBorder=e.editorBracketMatchBackground=e.editorCodeLensForeground=e.editorRuler=e.editorActiveLineNumber=e.editorLineNumbers=e.editorActiveIndentGuides=e.editorIndentGuides=e.editorWhitespaces=e.editorCursorBackground=e.editorCursorForeground=e.editorSymbolHighlightBorder=e.editorSymbolHighlight=e.editorRangeHighlightBorder=e.editorRangeHighlight=e.editorLineHighlightBorder=e.editorLineHighlight=void 0,e.editorLineHighlight=M.registerColor("editor.lineHighlightBackground",{dark:null,light:null,hc:null},b.localize(0,null)),e.editorLineHighlightBorder=M.registerColor("editor.lineHighlightBorder",{dark:"#282828",light:"#eeeeee",hc:"#f38518"},b.localize(1,null)),e.editorRangeHighlight=M.registerColor("editor.rangeHighlightBackground",{dark:"#ffffff0b",light:"#fdff0033",hc:null},b.localize(2,null),!0),e.editorRangeHighlightBorder=M.registerColor("editor.rangeHighlightBorder",{dark:null,light:null,hc:M.activeContrastBorder},b.localize(3,null),!0),e.editorSymbolHighlight=M.registerColor("editor.symbolHighlightBackground",{dark:M.editorFindMatchHighlight,light:M.editorFindMatchHighlight,hc:null},b.localize(4,null),!0),e.editorSymbolHighlightBorder=M.registerColor("editor.symbolHighlightBorder",{dark:null,light:null,hc:M.activeContrastBorder},b.localize(5,null),!0),e.editorCursorForeground=M.registerColor("editorCursor.foreground",{dark:"#AEAFAD",light:N.Color.black,hc:N.Color.white},b.localize(6,null)),e.editorCursorBackground=M.registerColor("editorCursor.background",null,b.localize(7,null)),e.editorWhitespaces=M.registerColor("editorWhitespace.foreground",{dark:"#e3e4e229",light:"#33333333",hc:"#e3e4e229"},b.localize(8,null)),e.editorIndentGuides=M.registerColor("editorIndentGuide.background",{dark:e.editorWhitespaces,light:e.editorWhitespaces,hc:e.editorWhitespaces},b.localize(9,null)),e.editorActiveIndentGuides=M.registerColor("editorIndentGuide.activeBackground",{dark:e.editorWhitespaces,light:e.editorWhitespaces,hc:e.editorWhitespaces},b.localize(10,null)),e.editorLineNumbers=M.registerColor("editorLineNumber.foreground",{dark:"#858585",light:"#237893",hc:N.Color.white},b.localize(11,null));const S=M.registerColor("editorActiveLineNumber.foreground",{dark:"#c6c6c6",light:"#0B216F",hc:M.activeContrastBorder},b.localize(12,null),!1,b.localize(13,null));e.editorActiveLineNumber=M.registerColor("editorLineNumber.activeForeground",{dark:S,light:S,hc:S},b.localize(14,null)),e.editorRuler=M.registerColor("editorRuler.foreground",{dark:"#5A5A5A",light:N.Color.lightgrey,hc:N.Color.white},b.localize(15,null)),e.editorCodeLensForeground=M.registerColor("editorCodeLens.foreground",{dark:"#999999",light:"#999999",hc:"#999999"},b.localize(16,null)),e.editorBracketMatchBackground=M.registerColor("editorBracketMatch.background",{dark:"#0064001a",light:"#0064001a",hc:"#0064001a"},b.localize(17,null)),e.editorBracketMatchBorder=M.registerColor("editorBracketMatch.border",{dark:"#888",light:"#B9B9B9",hc:M.contrastBorder},b.localize(18,null)),e.editorOverviewRulerBorder=M.registerColor("editorOverviewRuler.border",{dark:"#7f7f7f4d",light:"#7f7f7f4d",hc:"#7f7f7f4d"},b.localize(19,null)),e.editorOverviewRulerBackground=M.registerColor("editorOverviewRuler.background",null,b.localize(20,null)),e.editorGutter=M.registerColor("editorGutter.background",{dark:M.editorBackground,light:M.editorBackground,hc:M.editorBackground},b.localize(21,null)),e.editorUnnecessaryCodeBorder=M.registerColor("editorUnnecessaryCode.border",{dark:null,light:null,hc:N.Color.fromHex("#fff").transparent(.8)},b.localize(22,null)),e.editorUnnecessaryCodeOpacity=M.registerColor("editorUnnecessaryCode.opacity",{dark:N.Color.fromHex("#000a"),light:N.Color.fromHex("#0007"),hc:null},b.localize(23,null));const C=new N.Color(new N.RGBA(0,122,204,.6));e.overviewRulerRangeHighlight=M.registerColor("editorOverviewRuler.rangeHighlightForeground",{dark:C,light:C,hc:C},b.localize(24,null),!0),e.overviewRulerError=M.registerColor("editorOverviewRuler.errorForeground",{dark:new N.Color(new N.RGBA(255,18,18,.7)),light:new N.Color(new N.RGBA(255,18,18,.7)),hc:new N.Color(new N.RGBA(255,50,50,1))},b.localize(25,null)),e.overviewRulerWarning=M.registerColor("editorOverviewRuler.warningForeground",{dark:M.editorWarningForeground,light:M.editorWarningForeground,hc:M.editorWarningBorder},b.localize(26,null)),e.overviewRulerInfo=M.registerColor("editorOverviewRuler.infoForeground",{dark:M.editorInfoForeground,light:M.editorInfoForeground,hc:M.editorInfoBorder},b.localize(27,null)),w.registerThemingParticipant((d,g)=>{const p=d.getColor(M.editorBackground);p&&g.addRule(`.monaco-editor, .monaco-editor-background, .monaco-editor .inputarea.ime-input { background-color: ${p}; }`);const c=d.getColor(M.editorForeground);c&&g.addRule(`.monaco-editor, .monaco-editor .inputarea.ime-input { color: ${c}; }`);const o=d.getColor(e.editorGutter);o&&g.addRule(`.monaco-editor .margin { background-color: ${o}; }`);const s=d.getColor(e.editorRangeHighlight);s&&g.addRule(`.monaco-editor .rangeHighlight { background-color: ${s}; }`);const a=d.getColor(e.editorRangeHighlightBorder);a&&g.addRule(`.monaco-editor .rangeHighlight { border: 1px ${d.type==="hc"?"dotted":"solid"} ${a}; }`);const u=d.getColor(e.editorSymbolHighlight);u&&g.addRule(`.monaco-editor .symbolHighlight { background-color: ${u}; }`);const r=d.getColor(e.editorSymbolHighlightBorder);r&&g.addRule(`.monaco-editor .symbolHighlight { border: 1px ${d.type==="hc"?"dotted":"solid"} ${r}; }`);const i=d.getColor(e.editorWhitespaces);i&&(g.addRule(`.monaco-editor .mtkw { color: ${i} !important; }`),g.addRule(`.monaco-editor .mtkz { color: ${i} !important; }`))})}),define(Q[588],J([0,1,94,49,19,11,21,318]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CurrentLineMarginHighlightOverlay=e.CurrentLineHighlightOverlay=e.AbstractLineHighlightOverlay=void 0;let C=!0;class d extends b.DynamicViewOverlay{constructor(o){super();this._context=o;const s=this._context.configuration.options,a=s.get(124);this._lineHeight=s.get(53),this._renderLineHighlight=s.get(80),this._renderLineHighlightOnlyWhenFocus=s.get(81),this._contentLeft=a.contentLeft,this._contentWidth=a.contentWidth,this._selectionIsEmpty=!0,this._focused=!1,this._cursorLineNumbers=[1],this._selections=[new S.Selection(1,1,1,1)],this._renderData=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}_readFromSelections(){let o=!1;const s=C?this._selections.slice(0,1):this._selections,a=s.map(r=>r.positionLineNumber);a.sort((r,i)=>r-i),M.equals(this._cursorLineNumbers,a)||(this._cursorLineNumbers=a,o=!0);const u=s.every(r=>r.isEmpty());return this._selectionIsEmpty!==u&&(this._selectionIsEmpty=u,o=!0),o}onThemeChanged(o){return this._readFromSelections()}onConfigurationChanged(o){const s=this._context.configuration.options,a=s.get(124);return this._lineHeight=s.get(53),this._renderLineHighlight=s.get(80),this._renderLineHighlightOnlyWhenFocus=s.get(81),this._contentLeft=a.contentLeft,this._contentWidth=a.contentWidth,!0}onCursorStateChanged(o){return this._selections=o.selections,this._readFromSelections()}onFlushed(o){return!0}onLinesDeleted(o){return!0}onLinesInserted(o){return!0}onScrollChanged(o){return o.scrollWidthChanged||o.scrollTopChanged}onZonesChanged(o){return!0}onFocusChanged(o){return this._renderLineHighlightOnlyWhenFocus?(this._focused=o.isFocused,!0):!1}prepareRender(o){if(!this._shouldRenderThis()){this._renderData=null;return}const s=this._renderOne(o),a=o.visibleRange.startLineNumber,u=o.visibleRange.endLineNumber,r=this._cursorLineNumbers.length;let i=0;const n=[];for(let t=a;t<=u;t++){const l=t-a;for(;i=this._renderData.length?"":this._renderData[a]}}e.AbstractLineHighlightOverlay=d;class g extends d{_renderOne(o){return`
    `}_shouldRenderThis(){return(this._renderLineHighlight==="line"||this._renderLineHighlight==="all")&&this._selectionIsEmpty&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}_shouldRenderOther(){return(this._renderLineHighlight==="gutter"||this._renderLineHighlight==="all")&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}}e.CurrentLineHighlightOverlay=g;class p extends d{_renderOne(o){return`
    `}_shouldRenderMargin(){return(this._renderLineHighlight==="gutter"||this._renderLineHighlight==="all")&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}_shouldRenderThis(){return!0}_shouldRenderOther(){return(this._renderLineHighlight==="line"||this._renderLineHighlight==="all")&&this._selectionIsEmpty&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}}e.CurrentLineMarginHighlightOverlay=p,w.registerThemingParticipant((c,o)=>{C=!1;const s=c.getColor(N.editorLineHighlight);if(s&&(o.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${s}; }`),o.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${s}; border: none; }`)),!s||s.isTransparent()||c.defines(N.editorLineHighlightBorder)){const a=c.getColor(N.editorLineHighlightBorder);a&&(C=!0,o.addRule(`.monaco-editor .view-overlays .current-line { border: 2px solid ${a}; }`),o.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { border: 2px solid ${a}; }`),c.type==="hc"&&(o.addRule(".monaco-editor .view-overlays .current-line { border-width: 1px; }"),o.addRule(".monaco-editor .margin-view-overlays .current-line-margin { border-width: 1px; }")))}})}),define(Q[589],J([0,1,94,14,49,11,321]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentGuidesOverlay=void 0;class S extends b.DynamicViewOverlay{constructor(d){super();this._context=d,this._primaryLineNumber=0;const g=this._context.configuration.options,p=g.get(125),c=g.get(38);this._lineHeight=g.get(53),this._spaceWidth=c.spaceWidth,this._enabled=g.get(78),this._activeIndentEnabled=g.get(47),this._maxIndentLeft=p.wrappingColumn===-1?-1:p.wrappingColumn*c.typicalHalfwidthCharacterWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(d){const g=this._context.configuration.options,p=g.get(125),c=g.get(38);return this._lineHeight=g.get(53),this._spaceWidth=c.spaceWidth,this._enabled=g.get(78),this._activeIndentEnabled=g.get(47),this._maxIndentLeft=p.wrappingColumn===-1?-1:p.wrappingColumn*c.typicalHalfwidthCharacterWidth,!0}onCursorStateChanged(d){const g=d.selections[0],p=g.isEmpty()?g.positionLineNumber:0;return this._primaryLineNumber!==p?(this._primaryLineNumber=p,!0):!1}onDecorationsChanged(d){return!0}onFlushed(d){return!0}onLinesChanged(d){return!0}onLinesDeleted(d){return!0}onLinesInserted(d){return!0}onScrollChanged(d){return d.scrollTopChanged}onZonesChanged(d){return!0}onLanguageConfigurationChanged(d){return!0}prepareRender(d){if(!this._enabled){this._renderResult=null;return}const g=d.visibleRange.startLineNumber,p=d.visibleRange.endLineNumber,{indentSize:c}=this._context.model.getTextModelOptions(),o=c*this._spaceWidth,s=d.scrollWidth,a=this._lineHeight,u=this._context.model.getLinesIndentGuides(g,p);let r=0,i=0,n=0;if(this._activeIndentEnabled&&this._primaryLineNumber){const l=this._context.model.getActiveIndentGuide(this._primaryLineNumber,g,p);r=l.startLineNumber,i=l.endLineNumber,n=l.indent}const t=[];for(let l=g;l<=p;l++){const h=r<=l&&l<=i,m=l-g,_=u[m];let f="";if(_>=1){const v=d.visibleRangeForPosition(new N.Position(l,1));let y=v?v.left:0;for(let L=1;L<=_&&(f+=`
    `,y+=o,!(y>s||this._maxIndentLeft>0&&y>this._maxIndentLeft));L++);}t[m]=f}this._renderResult=t}render(d,g){if(!this._renderResult)return"";const p=g-d;return p<0||p>=this._renderResult.length?"":this._renderResult[p]}}e.IndentGuidesOverlay=S,w.registerThemingParticipant((C,d)=>{const g=C.getColor(M.editorIndentGuides);g&&d.addRule(`.monaco-editor .lines-content .cigr { box-shadow: 1px 0 0 0 ${g} inset; }`);const p=C.getColor(M.editorActiveIndentGuides)||g;p&&d.addRule(`.monaco-editor .lines-content .cigra { box-shadow: 1px 0 0 0 ${p} inset; }`)})}),define(Q[257],J([0,1,17,94,14,49,11,322]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineNumbersOverlay=void 0;class C extends N.DynamicViewOverlay{constructor(g){super();this._context=g,this._readConfig(),this._lastCursorModelPosition=new M.Position(1,1),this._renderResult=null,this._activeLineNumber=1,this._context.addEventHandler(this)}_readConfig(){const g=this._context.configuration.options;this._lineHeight=g.get(53);const p=g.get(54);this._renderLineNumbers=p.renderType,this._renderCustomLineNumbers=p.renderFn,this._renderFinalNewline=g.get(79);const c=g.get(124);this._lineNumbersLeft=c.lineNumbersLeft,this._lineNumbersWidth=c.lineNumbersWidth}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(g){return this._readConfig(),!0}onCursorStateChanged(g){const p=g.selections[0].getPosition();this._lastCursorModelPosition=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(p);let c=!1;return this._activeLineNumber!==p.lineNumber&&(this._activeLineNumber=p.lineNumber,c=!0),(this._renderLineNumbers===2||this._renderLineNumbers===3)&&(c=!0),c}onFlushed(g){return!0}onLinesChanged(g){return!0}onLinesDeleted(g){return!0}onLinesInserted(g){return!0}onScrollChanged(g){return g.scrollTopChanged}onZonesChanged(g){return!0}_getLineRenderLineNumber(g){const p=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new M.Position(g,1));if(p.column!==1)return"";const c=p.lineNumber;if(this._renderCustomLineNumbers)return this._renderCustomLineNumbers(c);if(this._renderLineNumbers===2){const o=Math.abs(this._lastCursorModelPosition.lineNumber-c);return o===0?''+c+"":String(o)}return this._renderLineNumbers===3?this._lastCursorModelPosition.lineNumber===c||c%10==0?String(c):"":String(c)}prepareRender(g){if(this._renderLineNumbers===0){this._renderResult=null;return}const p=b.isLinux?this._lineHeight%2==0?" lh-even":" lh-odd":"",c=g.visibleRange.startLineNumber,o=g.visibleRange.endLineNumber,s='
    ',a=this._context.model.getLineCount(),u=[];for(let r=c;r<=o;r++){const i=r-c;if(!this._renderFinalNewline&&r===a&&this._context.model.getLineLength(r)===0){u[i]="";continue}const n=this._getLineRenderLineNumber(r);n?r===this._activeLineNumber?u[i]='
    '+n+"
    ":u[i]=s+n+"
    ":u[i]=""}this._renderResult=u}render(g,p){if(!this._renderResult)return"";const c=p-g;return c<0||c>=this._renderResult.length?"":this._renderResult[c]}}e.LineNumbersOverlay=C,C.CLASS_NAME="line-numbers",S.registerThemingParticipant((d,g)=>{const p=d.getColor(w.editorLineNumbers);p&&g.addRule(`.monaco-editor .line-numbers { color: ${p}; }`);const c=d.getColor(w.editorActiveLineNumber);c&&g.addRule(`.monaco-editor .line-numbers.active-line-number { color: ${c}; }`)})}),define(Q[590],J([0,1,445,35,30,17,8,69,164,214,45,257,223,38,106,14,3,21,124,317]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextAreaHandler=void 0;class t{constructor(y,L,I){this.top=y,this.left=L,this.width=I}setWidth(y){return new t(this.top,this.left,y)}}const l=N.isFirefox;class h extends p.ViewPart{constructor(y,L,I){super(y);this._primaryCursorPosition=new u.Position(1,1),this._primaryCursorVisibleRange=null,this._viewController=L,this._viewHelper=I,this._scrollLeft=0,this._scrollTop=0;const k=this._context.configuration.options,E=k.get(124);this._setAccessibilityOptions(k),this._contentLeft=E.contentLeft,this._contentWidth=E.contentWidth,this._contentHeight=E.height,this._fontInfo=k.get(38),this._lineHeight=k.get(53),this._emptySelectionClipboard=k.get(28),this._copyWithSyntaxHighlighting=k.get(18),this._visibleTextArea=null,this._selections=[new i.Selection(1,1,1,1)],this._modelSelections=[new i.Selection(1,1,1,1)],this._lastRenderPosition=null,this.textArea=M.createFastDomNode(document.createElement("textarea")),p.PartFingerprints.write(this.textArea,6),this.textArea.setClassName(`inputarea ${n.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this.textArea.setAttribute("wrap","off"),this.textArea.setAttribute("autocorrect","off"),this.textArea.setAttribute("autocapitalize","off"),this.textArea.setAttribute("autocomplete","off"),this.textArea.setAttribute("spellcheck","false"),this.textArea.setAttribute("aria-label",this._getAriaLabel(k)),this.textArea.setAttribute("tabindex",String(k.get(107))),this.textArea.setAttribute("role","textbox"),this.textArea.setAttribute("aria-roledescription",b.localize(0,null)),this.textArea.setAttribute("aria-multiline","true"),this.textArea.setAttribute("aria-haspopup","false"),this.textArea.setAttribute("aria-autocomplete","both"),w.isWeb&&k.get(75)&&this.textArea.setAttribute("readonly","true"),this.textAreaCover=M.createFastDomNode(document.createElement("div")),this.textAreaCover.setPosition("absolute");const T={getLineCount:()=>this._context.model.getLineCount(),getLineMaxColumn:A=>this._context.model.getLineMaxColumn(A),getValueInRange:(A,B)=>this._context.model.getValueInRange(A,B)},O={getDataToCopy:A=>{const B=this._context.model.getPlainTextToCopy(this._modelSelections,this._emptySelectionClipboard,w.isWindows),F=this._context.model.getEOL(),D=this._emptySelectionClipboard&&this._modelSelections.length===1&&this._modelSelections[0].isEmpty(),R=Array.isArray(B)?B:null,W=Array.isArray(B)?B.join(F):B;let x,K=null;if(A&&(d.CopyOptions.forceCopyWithSyntaxHighlighting||this._copyWithSyntaxHighlighting&&W.length<65536)){const Y=this._context.model.getRichTextToCopy(this._modelSelections,this._emptySelectionClipboard);Y&&(x=Y.html,K=Y.mode)}return{isFromEmptySelection:D,multicursorText:R,text:W,html:x,mode:K}},getScreenReaderContent:A=>{if(this._accessibilitySupport===1){if(w.isMacintosh){const B=this._selections[0];if(B.isEmpty()){const F=B.getStartPosition();let D=this._getWordBeforePosition(F);if(D.length===0&&(D=this._getCharacterBeforePosition(F)),D.length>0)return new g.TextAreaState(D,D.length,D.length,F,F)}}return g.TextAreaState.EMPTY}if(N.isAndroid){const B=this._selections[0];if(B.isEmpty()){const F=B.getStartPosition(),[D,R]=this._getAndroidWordAtPosition(F);if(D.length>0)return new g.TextAreaState(D,R,R,F,F)}return g.TextAreaState.EMPTY}return g.PagedScreenReaderStrategy.fromEditorSelection(A,T,this._selections[0],this._accessibilityPageSize,this._accessibilitySupport===0)},deduceModelPosition:(A,B,F)=>this._context.model.deduceModelPositionRelativeToViewPosition(A,B,F)};this._textAreaInput=this._register(new d.TextAreaInput(O,this.textArea)),this._register(this._textAreaInput.onKeyDown(A=>{this._viewController.emitKeyDown(A)})),this._register(this._textAreaInput.onKeyUp(A=>{this._viewController.emitKeyUp(A)})),this._register(this._textAreaInput.onPaste(A=>{let B=!1,F=null,D=null;A.metadata&&(B=this._emptySelectionClipboard&&!!A.metadata.isFromEmptySelection,F=typeof A.metadata.multicursorText!="undefined"?A.metadata.multicursorText:null,D=A.metadata.mode),this._viewController.paste(A.text,B,F,D)})),this._register(this._textAreaInput.onCut(()=>{this._viewController.cut()})),this._register(this._textAreaInput.onType(A=>{A.replacePrevCharCnt||A.replaceNextCharCnt||A.positionDelta?(g._debugComposition&&console.log(` => compositionType: <<${A.text}>>, ${A.replacePrevCharCnt}, ${A.replaceNextCharCnt}, ${A.positionDelta}`),this._viewController.compositionType(A.text,A.replacePrevCharCnt,A.replaceNextCharCnt,A.positionDelta)):(g._debugComposition&&console.log(` => type: <<${A.text}>>`),this._viewController.type(A.text))})),this._register(this._textAreaInput.onSelectionChangeRequest(A=>{this._viewController.setSelection(A)})),this._register(this._textAreaInput.onCompositionStart(A=>{const B=this._selections[0].startLineNumber,F=this._selections[0].startColumn+A.revealDeltaColumns;this._context.model.revealRange("keyboard",!0,new r.Range(B,F,B,F),0,1);const D=this._viewHelper.visibleRangeForPositionRelativeToEditor(B,F);D&&(this._visibleTextArea=new t(this._context.viewLayout.getVerticalOffsetForLineNumber(B),D.left,l?0:1),this._render()),this.textArea.setClassName(`inputarea ${n.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ime-input`),this._viewController.compositionStart(),this._context.model.onCompositionStart()})),this._register(this._textAreaInput.onCompositionUpdate(A=>{!this._visibleTextArea||(this._visibleTextArea=this._visibleTextArea.setWidth(m(A.data,this._fontInfo)),this._render())})),this._register(this._textAreaInput.onCompositionEnd(()=>{this._visibleTextArea=null,this._render(),this.textArea.setClassName(`inputarea ${n.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this._viewController.compositionEnd(),this._context.model.onCompositionEnd()})),this._register(this._textAreaInput.onFocus(()=>{this._context.model.setHasFocus(!0)})),this._register(this._textAreaInput.onBlur(()=>{this._context.model.setHasFocus(!1)}))}dispose(){super.dispose()}_getAndroidWordAtPosition(y){const L='`~!@#$%^&*()-=+[{]}\\|;:",.<>/?',I=this._context.model.getLineContent(y.lineNumber),k=a.getMapForWordSeparators(L);let E=!0,T=y.column,O=!0,A=y.column,B=0;for(;B<50&&(E||O);){if(E&&T<=1&&(E=!1),E){const F=I.charCodeAt(T-2);k.get(F)!==0?E=!1:T--}if(O&&A>I.length&&(O=!1),O){const F=I.charCodeAt(A-1);k.get(F)!==0?O=!1:A++}B++}return[I.substring(T-1,A-1),y.column-T]}_getWordBeforePosition(y){const L=this._context.model.getLineContent(y.lineNumber),I=a.getMapForWordSeparators(this._context.configuration.options.get(110));let k=y.column,E=0;for(;k>1;){const T=L.charCodeAt(k-2);if(I.get(T)!==0||E>50)return L.substring(k-1,y.column-1);E++,k--}return L.substring(0,y.column-1)}_getCharacterBeforePosition(y){if(y.column>1){const I=this._context.model.getLineContent(y.lineNumber).charAt(y.column-2);if(!S.isHighSurrogate(I.charCodeAt(0)))return I}return""}_getAriaLabel(y){return y.get(2)===1?b.localize(1,null,w.isLinux?"Shift+Alt+F1":"Alt+F1"):y.get(4)}_setAccessibilityOptions(y){this._accessibilitySupport=y.get(2);const L=y.get(3);this._accessibilitySupport===2&&L===s.EditorOptions.accessibilityPageSize.defaultValue?this._accessibilityPageSize=100:this._accessibilityPageSize=L}onConfigurationChanged(y){const L=this._context.configuration.options,I=L.get(124);return this._setAccessibilityOptions(L),this._contentLeft=I.contentLeft,this._contentWidth=I.contentWidth,this._contentHeight=I.height,this._fontInfo=L.get(38),this._lineHeight=L.get(53),this._emptySelectionClipboard=L.get(28),this._copyWithSyntaxHighlighting=L.get(18),this.textArea.setAttribute("aria-label",this._getAriaLabel(L)),this.textArea.setAttribute("tabindex",String(L.get(107))),w.isWeb&&y.hasChanged(75)&&(L.get(75)?this.textArea.setAttribute("readonly","true"):this.textArea.removeAttribute("readonly")),y.hasChanged(2)&&this._textAreaInput.writeScreenReaderContent("strategy changed"),!0}onCursorStateChanged(y){return this._selections=y.selections.slice(0),this._modelSelections=y.modelSelections.slice(0),this._textAreaInput.writeScreenReaderContent("selection changed"),!0}onDecorationsChanged(y){return!0}onFlushed(y){return!0}onLinesChanged(y){return!0}onLinesDeleted(y){return!0}onLinesInserted(y){return!0}onScrollChanged(y){return this._scrollLeft=y.scrollLeft,this._scrollTop=y.scrollTop,!0}onZonesChanged(y){return!0}isFocused(){return this._textAreaInput.isFocused()}focusTextArea(){this._textAreaInput.focusTextArea()}getLastRenderData(){return this._lastRenderPosition}setAriaOptions(y){y.activeDescendant?(this.textArea.setAttribute("aria-haspopup","true"),this.textArea.setAttribute("aria-autocomplete","list"),this.textArea.setAttribute("aria-activedescendant",y.activeDescendant)):(this.textArea.setAttribute("aria-haspopup","false"),this.textArea.setAttribute("aria-autocomplete","both"),this.textArea.removeAttribute("aria-activedescendant")),y.role&&this.textArea.setAttribute("role",y.role)}prepareRender(y){this._primaryCursorPosition=new u.Position(this._selections[0].positionLineNumber,this._selections[0].positionColumn),this._primaryCursorVisibleRange=y.visibleRangeForPosition(this._primaryCursorPosition)}render(y){this._textAreaInput.writeScreenReaderContent("render"),this._render()}_render(){if(this._visibleTextArea){this._renderInsideEditor(null,this._visibleTextArea.top-this._scrollTop,this._contentLeft+this._visibleTextArea.left-this._scrollLeft,this._visibleTextArea.width,this._lineHeight);return}if(!this._primaryCursorVisibleRange){this._renderAtTopLeft();return}const y=this._contentLeft+this._primaryCursorVisibleRange.left-this._scrollLeft;if(ythis._contentLeft+this._contentWidth){this._renderAtTopLeft();return}const L=this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber)-this._scrollTop;if(L<0||L>this._contentHeight){this._renderAtTopLeft();return}if(w.isMacintosh){this._renderInsideEditor(this._primaryCursorPosition,L,y,l?0:1,this._lineHeight);return}this._renderInsideEditor(this._primaryCursorPosition,L,y,l?0:1,l?0:1)}_renderInsideEditor(y,L,I,k,E){this._lastRenderPosition=y;const T=this.textArea,O=this.textAreaCover;C.Configuration.applyFontInfo(T,this._fontInfo),T.setTop(L),T.setLeft(I),T.setWidth(k),T.setHeight(E),O.setTop(0),O.setLeft(0),O.setWidth(0),O.setHeight(0)}_renderAtTopLeft(){this._lastRenderPosition=null;const y=this.textArea,L=this.textAreaCover;if(C.Configuration.applyFontInfo(y,this._fontInfo),y.setTop(0),y.setLeft(0),L.setTop(0),L.setLeft(0),l){y.setWidth(0),y.setHeight(0),L.setWidth(0),L.setHeight(0);return}y.setWidth(1),y.setHeight(1),L.setWidth(1),L.setHeight(1);const I=this._context.configuration.options;I.get(44)?L.setClassName("monaco-editor-background textAreaCover "+o.Margin.OUTER_CLASS_NAME):I.get(54).renderType!==0?L.setClassName("monaco-editor-background textAreaCover "+c.LineNumbersOverlay.CLASS_NAME):L.setClassName("monaco-editor-background textAreaCover")}}e.TextAreaHandler=h;function m(v,y){const I=document.createElement("canvas").getContext("2d");I.font=_(y);const k=I.measureText(v);return N.isFirefox?k.width+2:k.width}function _(v){return f("normal",v.fontWeight,v.fontSize,v.lineHeight,v.fontFamily)}function f(v,y,L,I,k){return`${v} normal ${y} ${L}px / ${I}px ${k}`}}),define(Q[591],J([0,1,30,29,45,14,18,49]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationsOverviewRuler=void 0;class d{constructor(c,o){const s=c.options;this.lineHeight=s.get(53),this.pixelRatio=s.get(122),this.overviewRulerLanes=s.get(68),this.renderBorder=s.get(67);const a=o.getColor(C.editorOverviewRulerBorder);this.borderColor=a?a.toString():null,this.hideCursor=s.get(46);const u=o.getColor(C.editorCursorForeground);this.cursorColor=u?u.transparent(.7).toString():null,this.themeType=o.type;const r=s.get(59),i=r.enabled,n=r.side,t=i?o.getColor(C.editorOverviewRulerBackground)||S.TokenizationRegistry.getDefaultBackground():null;t===null||n==="left"?this.backgroundColor=null:this.backgroundColor=N.Color.Format.CSS.formatHex(t);const h=s.get(124).overviewRuler;this.top=h.top,this.right=h.right,this.domWidth=h.width,this.domHeight=h.height,this.overviewRulerLanes===0?(this.canvasWidth=0,this.canvasHeight=0):(this.canvasWidth=this.domWidth*this.pixelRatio|0,this.canvasHeight=this.domHeight*this.pixelRatio|0);const[m,_]=this._initLanes(1,this.canvasWidth,this.overviewRulerLanes);this.x=m,this.w=_}_initLanes(c,o,s){const a=o-c;if(s>=3){const u=Math.floor(a/3),r=Math.floor(a/3),i=a-u-r,n=c,t=n+u,l=n+u+i;return[[0,n,t,n,l,n,t,n],[0,u,i,u+i,r,u+i+r,i+r,u+i+r]]}else if(s===2){const u=Math.floor(a/2),r=a-u,i=c,n=i+u;return[[0,i,i,i,n,i,i,i],[0,u,u,u,r,u+r,u+r,u+r]]}else{const u=c,r=a;return[[0,u,u,u,u,u,u,u],[0,r,r,r,r,r,r,r]]}}equals(c){return this.lineHeight===c.lineHeight&&this.pixelRatio===c.pixelRatio&&this.overviewRulerLanes===c.overviewRulerLanes&&this.renderBorder===c.renderBorder&&this.borderColor===c.borderColor&&this.hideCursor===c.hideCursor&&this.cursorColor===c.cursorColor&&this.themeType===c.themeType&&this.backgroundColor===c.backgroundColor&&this.top===c.top&&this.right===c.right&&this.domWidth===c.domWidth&&this.domHeight===c.domHeight&&this.canvasWidth===c.canvasWidth&&this.canvasHeight===c.canvasHeight}}class g extends M.ViewPart{constructor(c){super(c);this._domNode=b.createFastDomNode(document.createElement("canvas")),this._domNode.setClassName("decorationsOverviewRuler"),this._domNode.setPosition("absolute"),this._domNode.setLayerHinting(!0),this._domNode.setContain("strict"),this._domNode.setAttribute("aria-hidden","true"),this._updateSettings(!1),this._tokensColorTrackerListener=S.TokenizationRegistry.onDidChange(o=>{o.changedColorMap&&this._updateSettings(!0)}),this._cursorPositions=[]}dispose(){super.dispose(),this._tokensColorTrackerListener.dispose()}_updateSettings(c){const o=new d(this._context.configuration,this._context.theme);return this._settings&&this._settings.equals(o)?!1:(this._settings=o,this._domNode.setTop(this._settings.top),this._domNode.setRight(this._settings.right),this._domNode.setWidth(this._settings.domWidth),this._domNode.setHeight(this._settings.domHeight),this._domNode.domNode.width=this._settings.canvasWidth,this._domNode.domNode.height=this._settings.canvasHeight,c&&this._render(),!0)}onConfigurationChanged(c){return this._updateSettings(!1)}onCursorStateChanged(c){this._cursorPositions=[];for(let o=0,s=c.selections.length;oo&&(x=o-t),D=x-t,R=x+t}D>E+1||A!==I?(T!==0&&l.fillRect(h[I],k,m[I],E-k),I=A,k=D,E=R):R>E&&(E=R)}l.fillRect(h[I],k,m[I],E-k)}if(!this._settings.hideCursor&&this._settings.cursorColor){const f=2*this._settings.pixelRatio|0,v=f/2|0,y=this._settings.x[7],L=this._settings.w[7];l.fillStyle=this._settings.cursorColor;let I=-100,k=-100;for(let E=0,T=this._cursorPositions.length;Eo&&(A=o-v);const B=A-v,F=B+f;B>k+1?(E!==0&&l.fillRect(y,I,L,k-I),I=B,k=F):F>k&&(k=F)}l.fillRect(y,I,L,k-I)}this._settings.renderBorder&&this._settings.borderColor&&this._settings.overviewRulerLanes>0&&(l.beginPath(),l.lineWidth=1,l.strokeStyle=this._settings.borderColor,l.moveTo(0,0),l.lineTo(0,o),l.stroke(),l.moveTo(0,0),l.lineTo(c,0),l.stroke())}}e.DecorationsOverviewRuler=g}),define(Q[592],J([0,1,30,45,49,11,328]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Rulers=void 0;class S extends N.ViewPart{constructor(d){super(d);this.domNode=b.createFastDomNode(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.domNode.setClassName("view-rulers"),this._renderedRulers=[];const g=this._context.configuration.options;this._rulers=g.get(86),this._typicalHalfwidthCharacterWidth=g.get(38).typicalHalfwidthCharacterWidth}dispose(){super.dispose()}onConfigurationChanged(d){const g=this._context.configuration.options;return this._rulers=g.get(86),this._typicalHalfwidthCharacterWidth=g.get(38).typicalHalfwidthCharacterWidth,!0}onScrollChanged(d){return d.scrollHeightChanged}prepareRender(d){}_ensureRulersCount(){const d=this._renderedRulers.length,g=this._rulers.length;if(d!==g){if(d0;){const a=b.createFastDomNode(document.createElement("div"));a.setClassName("view-ruler"),a.setWidth(o),this.domNode.appendChild(a),this._renderedRulers.push(a),s--}return}let p=d-g;for(;p>0;){const c=this._renderedRulers.pop();this.domNode.removeChild(c),p--}}}render(d){this._ensureRulersCount();for(let g=0,p=this._rulers.length;g{const g=C.getColor(M.editorRuler);g&&d.addRule(`.monaco-editor .view-ruler { box-shadow: 1px 0 0 0 ${g} inset; }`)})}),define(Q[593],J([0,1,30,15,45,565,38,49,11,331]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewCursors=void 0;class g extends M.ViewPart{constructor(c){super(c);const o=this._context.configuration.options;this._readOnly=o.get(75),this._cursorBlinking=o.get(19),this._cursorStyle=o.get(21),this._cursorSmoothCaretAnimation=o.get(20),this._selectionIsEmpty=!0,this._isComposingInput=!1,this._isVisible=!1,this._primaryCursor=new w.ViewCursor(this._context),this._secondaryCursors=[],this._renderData=[],this._domNode=b.createFastDomNode(document.createElement("div")),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true"),this._updateDomClassName(),this._domNode.appendChild(this._primaryCursor.getDomNode()),this._startCursorBlinkAnimation=new N.TimeoutTimer,this._cursorFlatBlinkInterval=new N.IntervalTimer,this._blinkingEnabled=!1,this._editorHasFocus=!1,this._updateBlinking()}dispose(){super.dispose(),this._startCursorBlinkAnimation.dispose(),this._cursorFlatBlinkInterval.dispose()}getDomNode(){return this._domNode}onCompositionStart(c){return this._isComposingInput=!0,this._updateBlinking(),!0}onCompositionEnd(c){return this._isComposingInput=!1,this._updateBlinking(),!0}onConfigurationChanged(c){const o=this._context.configuration.options;this._readOnly=o.get(75),this._cursorBlinking=o.get(19),this._cursorStyle=o.get(21),this._cursorSmoothCaretAnimation=o.get(20),this._updateBlinking(),this._updateDomClassName(),this._primaryCursor.onConfigurationChanged(c);for(let s=0,a=this._secondaryCursors.length;so.length){const s=this._secondaryCursors.length-o.length;for(let a=0;a{for(let a=0,u=c.ranges.length;a{this._isVisible?this._hide():this._show()},g.BLINK_INTERVAL):this._startCursorBlinkAnimation.setIfNotSet(()=>{this._blinkingEnabled=!0,this._updateDomClassName()},g.BLINK_INTERVAL))}_updateDomClassName(){this._domNode.setClassName(this._getClassName())}_getClassName(){let c="cursors-layer";switch(this._selectionIsEmpty||(c+=" has-selection"),this._cursorStyle){case S.TextEditorCursorStyle.Line:c+=" cursor-line-style";break;case S.TextEditorCursorStyle.Block:c+=" cursor-block-style";break;case S.TextEditorCursorStyle.Underline:c+=" cursor-underline-style";break;case S.TextEditorCursorStyle.LineThin:c+=" cursor-line-thin-style";break;case S.TextEditorCursorStyle.BlockOutline:c+=" cursor-block-outline-style";break;case S.TextEditorCursorStyle.UnderlineThin:c+=" cursor-underline-thin-style";break;default:c+=" cursor-line-style"}if(this._blinkingEnabled)switch(this._getCursorBlinking()){case 1:c+=" cursor-blink";break;case 2:c+=" cursor-smooth";break;case 3:c+=" cursor-phase";break;case 4:c+=" cursor-expand";break;case 5:c+=" cursor-solid";break;default:c+=" cursor-solid"}else c+=" cursor-solid";return this._cursorSmoothCaretAnimation&&(c+=" cursor-smooth-caret-animation"),c}_show(){this._primaryCursor.show();for(let c=0,o=this._secondaryCursors.length;c{const o=p.getColor(C.editorCursorForeground);if(o){let s=p.getColor(C.editorCursorBackground);s||(s=o.opposite()),c.addRule(`.monaco-editor .cursors-layer .cursor { background-color: ${o}; border-color: ${o}; color: ${s}; }`),p.type==="hc"&&c.addRule(`.monaco-editor .cursors-layer.has-selection .cursor { border-left: 1px solid ${s}; border-right: 1px solid ${s}; }`)}})}),define(Q[594],J([0,1,85,2,53,11,49,36,3,43,6,22]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerDecorationsService=void 0;function o(u){return u.toString()}class s extends N.Disposable{constructor(r){super();this.model=r,this._markersData=new Map,this._register(N.toDisposable(()=>{this.model.deltaDecorations([...this._markersData.keys()],[]),this._markersData.clear()}))}update(r,i){const n=[...this._markersData.keys()];this._markersData.clear();const t=this.model.deltaDecorations(n,i);for(let l=0;lthis._onModelAdded(n)),this._register(r.onModelAdded(this._onModelAdded,this)),this._register(r.onModelRemoved(this._onModelRemoved,this)),this._register(this._markerService.onMarkerChanged(this._handleMarkerChange,this))}dispose(){super.dispose(),this._markerDecorations.forEach(r=>r.dispose()),this._markerDecorations.clear()}getMarker(r,i){const n=this._markerDecorations.get(o(r));return n&&n.getMarker(i)||null}_handleMarkerChange(r){r.forEach(i=>{const n=this._markerDecorations.get(o(i));n&&this._updateDecorations(n)})}_onModelAdded(r){const i=new s(r);this._markerDecorations.set(o(r.uri),i),this._updateDecorations(i)}_onModelRemoved(r){const i=this._markerDecorations.get(o(r.uri));i&&(i.dispose(),this._markerDecorations.delete(o(r.uri))),(r.uri.scheme===g.Schemas.inMemory||r.uri.scheme===g.Schemas.internal||r.uri.scheme===g.Schemas.vscode)&&this._markerService&&this._markerService.read({resource:r.uri}).map(n=>n.owner).forEach(n=>this._markerService.remove(n,[r.uri]))}_updateDecorations(r){const i=this._markerService.read({resource:r.model.uri,take:500});let n=i.map(t=>({range:this._createDecorationRange(r.model,t),options:this._createDecorationOption(t)}));r.update(i,n)&&this._onDidChangeMarker.fire(r.model)}_createDecorationRange(r,i){let n=d.Range.lift(i);if(i.severity===b.MarkerSeverity.Hint&&!this._hasMarkerTag(i,1)&&!this._hasMarkerTag(i,2)&&(n=n.setEndPosition(n.startLineNumber,n.startColumn+2)),n=r.validateRange(n),n.isEmpty()){let t=r.getWordAtPosition(n.getStartPosition());if(t)n=new d.Range(n.startLineNumber,t.startColumn,n.endLineNumber,t.endColumn);else{let l=r.getLineLastNonWhitespaceColumn(n.startLineNumber)||r.getLineMaxColumn(n.startLineNumber);l===1||(n.endColumn>=l?n=new d.Range(n.startLineNumber,l-1,n.endLineNumber,l):n=new d.Range(n.startLineNumber,n.startColumn,n.endLineNumber,n.endColumn+1))}}else if(i.endColumn===Number.MAX_VALUE&&i.startColumn===1&&n.startLineNumber===n.endLineNumber){let t=r.getLineFirstNonWhitespaceColumn(i.startLineNumber);t=0:!1}};a=Me([_e(0,C.IModelService),_e(1,b.IMarkerService)],a),e.MarkerDecorationsService=a}),define(Q[595],J([0,1,7,90,6,2,31,467,37,11,22,60,27,337]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LightBulbWidget=void 0;var s;(function(u){u.Hidden={type:0};class r{constructor(n,t,l,h){this.actions=n,this.trigger=t,this.editorPosition=l,this.widgetPosition=h,this.type=1}}u.Showing=r})(s||(s={}));let a=class At extends w.Disposable{constructor(r,i,n,t){super();this._editor=r,this._quickFixActionId=i,this._preferredFixActionId=n,this._keybindingService=t,this._onClick=this._register(new M.Emitter),this.onClick=this._onClick.event,this._state=s.Hidden,this._domNode=document.createElement("div"),this._domNode.className=o.Codicon.lightBulb.classNames,this._editor.addContentWidget(this),this._register(this._editor.onDidChangeModelContent(l=>{const h=this._editor.getModel();(this.state.type!==1||!h||this.state.editorPosition.lineNumber>=h.getLineCount())&&this.hide()})),c.Gesture.ignoreTarget(this._domNode),this._register(b.addStandardDisposableGenericMouseDownListner(this._domNode,l=>{if(this.state.type===1){this._editor.focus(),l.preventDefault();const{top:h,height:m}=b.getDomNodePagePosition(this._domNode),_=this._editor.getOption(53);let f=Math.floor(_/3);this.state.widgetPosition.position!==null&&this.state.widgetPosition.position.lineNumber{if((l.buttons&1)==1){this.hide();const h=new N.GlobalMouseMoveMonitor;h.startMonitoring(l.target,l.buttons,N.standardMouseMoveMerger,()=>{},()=>{h.dispose()})}})),this._register(this._editor.onDidChangeConfiguration(l=>{l.hasChanged(51)&&!this._editor.getOption(51).enabled&&this.hide()})),this._updateLightBulbTitleAndIcon(),this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitleAndIcon,this))}dispose(){super.dispose(),this._editor.removeContentWidget(this)}getId(){return"LightBulbWidget"}getDomNode(){return this._domNode}getPosition(){return this._state.type===1?this._state.widgetPosition:null}update(r,i,n){if(r.validActions.length<=0)return this.hide();const t=this._editor.getOptions();if(!t.get(51).enabled)return this.hide();const l=this._editor.getModel();if(!l)return this.hide();const{lineNumber:h,column:m}=l.validatePosition(n),_=l.getOptions().tabSize,f=t.get(38),v=l.getLineContent(h),y=S.TextModel.computeIndentLevel(v,_),L=f.spaceWidth*y>22,I=E=>E>2&&this._editor.getTopForLineNumber(E)===this._editor.getTopForLineNumber(E-1);let k=h;if(!L){if(h>1&&!I(h-1))k-=1;else if(!I(h+1))k+=1;else if(m*f.spaceWidth<22)return this.hide()}this.state=new s.Showing(r,i,n,{position:{lineNumber:k,column:1},preference:At._posPref}),this._editor.layoutContentWidget(this)}hide(){this.state=s.Hidden,this._editor.layoutContentWidget(this)}get state(){return this._state}set state(r){this._state=r,this._updateLightBulbTitleAndIcon()}_updateLightBulbTitleAndIcon(){if(this.state.type===1&&this.state.actions.hasAutoFix){this._domNode.classList.remove(...o.Codicon.lightBulb.classNamesArray),this._domNode.classList.add(...o.Codicon.lightbulbAutofix.classNamesArray);const i=this._keybindingService.lookupKeybinding(this._preferredFixActionId);if(i){this.title=C.localize(0,null,i.getLabel());return}}this._domNode.classList.remove(...o.Codicon.lightbulbAutofix.classNamesArray),this._domNode.classList.add(...o.Codicon.lightBulb.classNamesArray);const r=this._keybindingService.lookupKeybinding(this._quickFixActionId);r?this.title=C.localize(1,null,r.getLabel()):this.title=C.localize(2,null)}set title(r){this._domNode.title=r}};a._posPref=[0],a=Me([_e(3,d.IKeybindingService)],a),e.LightBulbWidget=a,g.registerThemingParticipant((u,r)=>{var i;const n=(i=u.getColor(p.editorBackground))===null||i===void 0?void 0:i.transparent(.7),t=u.getColor(p.editorLightBulbForeground);t&&r.addRule(` + .monaco-editor .contentWidgets ${o.Codicon.lightBulb.cssSelector} { + color: ${t}; + background-color: ${n}; + }`);const l=u.getColor(p.editorLightBulbAutoFixForeground);l&&r.addRule(` + .monaco-editor .contentWidgets ${o.Codicon.lightbulbAutofix.cssSelector} { + color: ${l}; + background-color: ${n}; + }`)})}),define(Q[596],J([0,1,7,3,31,49,22,11,103,338]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensWidget=e.CodeLensHelper=void 0;class g{constructor(a,u,r){this.afterLineNumber=a,this.heightInPx=u,this._onHeight=r,this.suppressMouseDown=!0,this.domNode=document.createElement("div")}onComputedHeight(a){this._lastHeight===void 0?this._lastHeight=a:this._lastHeight!==a&&(this._lastHeight=a,this._onHeight())}}class p{constructor(a,u,r){this.allowEditorOverflow=!1,this.suppressMouseDown=!0,this._commands=new Map,this._isEmpty=!0,this._editor=a,this._id=`codelens.widget-${p._idPool++}`,this.updatePosition(r),this._domNode=document.createElement("span"),this._domNode.className=`codelens-decoration ${u}`}withCommands(a,u){this._commands.clear();let r=[],i=!1;for(let n=0;n{_.symbol.command&&m.push(_.symbol),i.addDecoration({range:_.symbol.range,options:M.ModelDecorationOptions.EMPTY},v=>this._decorationIds[f]=v),h?h=N.Range.plusRange(h,_.symbol.range):h=N.Range.lift(_.symbol.range)}),this._viewZone=new g(h.startLineNumber-1,t,l),this._viewZoneId=n.addZone(this._viewZone),m.length>0&&(this._createContentWidgetIfNecessary(),this._contentWidget.withCommands(m,!1))}_createContentWidgetIfNecessary(){this._contentWidget?this._editor.layoutContentWidget(this._contentWidget):(this._contentWidget=new p(this._editor,this._className,this._viewZone.afterLineNumber+1),this._editor.addContentWidget(this._contentWidget))}dispose(a,u){this._decorationIds.forEach(a.removeDecoration,a),this._decorationIds=[],u&&u.removeZone(this._viewZoneId),this._contentWidget&&(this._editor.removeContentWidget(this._contentWidget),this._contentWidget=void 0),this._isDisposed=!0}isDisposed(){return this._isDisposed}isValid(){return this._decorationIds.some((a,u)=>{const r=this._editor.getModel().getDecorationRange(a),i=this._data[u].symbol;return!!(r&&N.Range.isEmpty(i.range)===r.isEmpty())})}updateCodeLensSymbols(a,u){this._decorationIds.forEach(u.removeDecoration,u),this._decorationIds=[],this._data=a,this._data.forEach((r,i)=>{u.addDecoration({range:r.symbol.range,options:M.ModelDecorationOptions.EMPTY},n=>this._decorationIds[i]=n)})}updateHeight(a,u){this._viewZone.heightInPx=a,u.layoutZone(this._viewZoneId),this._contentWidget&&this._editor.layoutContentWidget(this._contentWidget)}computeIfNecessary(a){if(!this._viewZone.domNode.hasAttribute("monaco-visible-view-zone"))return null;for(let u=0;u{const u=s.getColor(w.editorCodeLensForeground);u&&(a.addRule(`.monaco-editor .codelens-decoration { color: ${u}; }`),a.addRule(`.monaco-editor .codelens-decoration .codicon { color: ${u}; }`));const r=s.getColor(S.editorActiveLinkForeground);r&&(a.addRule(`.monaco-editor .codelens-decoration > a:hover { color: ${r} !important; }`),a.addRule(`.monaco-editor .codelens-decoration > a:hover .codicon { color: ${r} !important; }`))})}),define(Q[597],J([0,1,35,7,90,52,29,6,2,22,11,339]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorPickerWidget=e.ColorPickerBody=e.ColorPickerHeader=void 0;const c=N.$;class o extends d.Disposable{constructor(l,h,m){super();this.model=h,this.domNode=c(".colorpicker-header"),N.append(l,this.domNode),this.pickedColorNode=N.append(this.domNode,c(".picked-color"));const _=N.append(this.domNode,c(".original-color"));_.style.backgroundColor=S.Color.Format.CSS.format(this.model.originalColor)||"",this.backgroundColor=m.getColorTheme().getColor(g.editorHoverBackground)||S.Color.white,this._register(p.registerThemingParticipant((f,v)=>{this.backgroundColor=f.getColor(g.editorHoverBackground)||S.Color.white})),this._register(N.addDisposableListener(this.pickedColorNode,N.EventType.CLICK,()=>this.model.selectNextColorPresentation())),this._register(N.addDisposableListener(_,N.EventType.CLICK,()=>{this.model.color=this.model.originalColor,this.model.flushColor()})),this._register(h.onDidChangeColor(this.onDidChangeColor,this)),this._register(h.onDidChangePresentation(this.onDidChangePresentation,this)),this.pickedColorNode.style.backgroundColor=S.Color.Format.CSS.format(h.color)||"",this.pickedColorNode.classList.toggle("light",h.color.rgba.a<.5?this.backgroundColor.isLighter():h.color.isLighter())}onDidChangeColor(l){this.pickedColorNode.style.backgroundColor=S.Color.Format.CSS.format(l)||"",this.pickedColorNode.classList.toggle("light",l.rgba.a<.5?this.backgroundColor.isLighter():l.isLighter()),this.onDidChangePresentation()}onDidChangePresentation(){this.pickedColorNode.textContent=this.model.presentation?this.model.presentation.label:""}}e.ColorPickerHeader=o;class s extends d.Disposable{constructor(l,h,m){super();this.model=h,this.pixelRatio=m,this.domNode=c(".colorpicker-body"),N.append(l,this.domNode),this.saturationBox=new a(this.domNode,this.model,this.pixelRatio),this._register(this.saturationBox),this._register(this.saturationBox.onDidChange(this.onDidSaturationValueChange,this)),this._register(this.saturationBox.onColorFlushed(this.flushColor,this)),this.opacityStrip=new r(this.domNode,this.model),this._register(this.opacityStrip),this._register(this.opacityStrip.onDidChange(this.onDidOpacityChange,this)),this._register(this.opacityStrip.onColorFlushed(this.flushColor,this)),this.hueStrip=new i(this.domNode,this.model),this._register(this.hueStrip),this._register(this.hueStrip.onDidChange(this.onDidHueChange,this)),this._register(this.hueStrip.onColorFlushed(this.flushColor,this))}flushColor(){this.model.flushColor()}onDidSaturationValueChange({s:l,v:h}){const m=this.model.color.hsva;this.model.color=new S.Color(new S.HSVA(m.h,l,h,m.a))}onDidOpacityChange(l){const h=this.model.color.hsva;this.model.color=new S.Color(new S.HSVA(h.h,h.s,h.v,l))}onDidHueChange(l){const h=this.model.color.hsva,m=(1-l)*360;this.model.color=new S.Color(new S.HSVA(m===360?0:m,h.s,h.v,h.a))}layout(){this.saturationBox.layout(),this.opacityStrip.layout(),this.hueStrip.layout()}}e.ColorPickerBody=s;class a extends d.Disposable{constructor(l,h,m){super();this.model=h,this.pixelRatio=m,this._onDidChange=new C.Emitter,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new C.Emitter,this.onColorFlushed=this._onColorFlushed.event,this.domNode=c(".saturation-wrap"),N.append(l,this.domNode),this.canvas=document.createElement("canvas"),this.canvas.className="saturation-box",N.append(this.domNode,this.canvas),this.selection=c(".saturation-selection"),N.append(this.domNode,this.selection),this.layout(),this._register(N.addDisposableGenericMouseDownListner(this.domNode,_=>this.onMouseDown(_))),this._register(this.model.onDidChangeColor(this.onDidChangeColor,this)),this.monitor=null}onMouseDown(l){this.monitor=this._register(new M.GlobalMouseMoveMonitor);const h=N.getDomNodePagePosition(this.domNode);l.target!==this.selection&&this.onDidChangePosition(l.offsetX,l.offsetY),this.monitor.startMonitoring(l.target,l.buttons,M.standardMouseMoveMerger,_=>this.onDidChangePosition(_.posx-h.left,_.posy-h.top),()=>null);const m=N.addDisposableGenericMouseUpListner(document,()=>{this._onColorFlushed.fire(),m.dispose(),this.monitor&&(this.monitor.stopMonitoring(!0),this.monitor=null)},!0)}onDidChangePosition(l,h){const m=Math.max(0,Math.min(1,l/this.width)),_=Math.max(0,Math.min(1,1-h/this.height));this.paintSelection(m,_),this._onDidChange.fire({s:m,v:_})}layout(){this.width=this.domNode.offsetWidth,this.height=this.domNode.offsetHeight,this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio,this.paint();const l=this.model.color.hsva;this.paintSelection(l.s,l.v)}paint(){const l=this.model.color.hsva,h=new S.Color(new S.HSVA(l.h,1,1,1)),m=this.canvas.getContext("2d"),_=m.createLinearGradient(0,0,this.canvas.width,0);_.addColorStop(0,"rgba(255, 255, 255, 1)"),_.addColorStop(.5,"rgba(255, 255, 255, 0.5)"),_.addColorStop(1,"rgba(255, 255, 255, 0)");const f=m.createLinearGradient(0,0,0,this.canvas.height);f.addColorStop(0,"rgba(0, 0, 0, 0)"),f.addColorStop(1,"rgba(0, 0, 0, 1)"),m.rect(0,0,this.canvas.width,this.canvas.height),m.fillStyle=S.Color.Format.CSS.format(h),m.fill(),m.fillStyle=_,m.fill(),m.fillStyle=f,m.fill()}paintSelection(l,h){this.selection.style.left=`${l*this.width}px`,this.selection.style.top=`${this.height-h*this.height}px`}onDidChangeColor(){this.monitor&&this.monitor.isMonitoring()||this.paint()}}class u extends d.Disposable{constructor(l,h){super();this.model=h,this._onDidChange=new C.Emitter,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new C.Emitter,this.onColorFlushed=this._onColorFlushed.event,this.domNode=N.append(l,c(".strip")),this.overlay=N.append(this.domNode,c(".overlay")),this.slider=N.append(this.domNode,c(".slider")),this.slider.style.top="0px",this._register(N.addDisposableGenericMouseDownListner(this.domNode,m=>this.onMouseDown(m))),this.layout()}layout(){this.height=this.domNode.offsetHeight-this.slider.offsetHeight;const l=this.getValue(this.model.color);this.updateSliderPosition(l)}onMouseDown(l){const h=this._register(new M.GlobalMouseMoveMonitor),m=N.getDomNodePagePosition(this.domNode);this.domNode.classList.add("grabbing"),l.target!==this.slider&&this.onDidChangeTop(l.offsetY),h.startMonitoring(l.target,l.buttons,M.standardMouseMoveMerger,f=>this.onDidChangeTop(f.posy-m.top),()=>null);const _=N.addDisposableGenericMouseUpListner(document,()=>{this._onColorFlushed.fire(),_.dispose(),h.stopMonitoring(!0),this.domNode.classList.remove("grabbing")},!0)}onDidChangeTop(l){const h=Math.max(0,Math.min(1,1-l/this.height));this.updateSliderPosition(h),this._onDidChange.fire(h)}updateSliderPosition(l){this.slider.style.top=`${(1-l)*this.height}px`}}class r extends u{constructor(l,h){super(l,h);this.domNode.classList.add("opacity-strip"),this._register(h.onDidChangeColor(this.onDidChangeColor,this)),this.onDidChangeColor(this.model.color)}onDidChangeColor(l){const{r:h,g:m,b:_}=l.rgba,f=new S.Color(new S.RGBA(h,m,_,1)),v=new S.Color(new S.RGBA(h,m,_,0));this.overlay.style.background=`linear-gradient(to bottom, ${f} 0%, ${v} 100%)`}getValue(l){return l.hsva.a}}class i extends u{constructor(l,h){super(l,h);this.domNode.classList.add("hue-strip")}getValue(l){return 1-l.hsva.h/360}}class n extends w.Widget{constructor(l,h,m,_){super();this.model=h,this.pixelRatio=m,this._register(b.onDidChangeZoomLevel(()=>this.layout()));const f=c(".colorpicker-widget");l.appendChild(f);const v=new o(f,this.model,_);this.body=new s(f,this.model,this.pixelRatio),this._register(v),this._register(this.body)}layout(){this.body.layout()}}e.ColorPickerWidget=n}),define(Q[598],J([0,1,3,53,31,22,11]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindDecorations=void 0;class C{constructor(g){this._editor=g,this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null,this._startPosition=this._editor.getPosition()}dispose(){this._editor.deltaDecorations(this._allDecorations(),[]),this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}reset(){this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}getCount(){return this._decorations.length}getFindScope(){return this._findScopeDecorationIds[0]?this._editor.getModel().getDecorationRange(this._findScopeDecorationIds[0]):null}getFindScopes(){if(this._findScopeDecorationIds.length){const g=this._findScopeDecorationIds.map(p=>this._editor.getModel().getDecorationRange(p)).filter(p=>!!p);if(g.length)return g}return null}getStartPosition(){return this._startPosition}setStartPosition(g){this._startPosition=g,this.setCurrentFindMatch(null)}_getDecorationIndex(g){const p=this._decorations.indexOf(g);return p>=0?p+1:1}getCurrentMatchesPosition(g){let p=this._editor.getModel().getDecorationsInRange(g);for(const c of p){const o=c.options;if(o===C._FIND_MATCH_DECORATION||o===C._CURRENT_FIND_MATCH_DECORATION)return this._getDecorationIndex(c.id)}return 0}setCurrentFindMatch(g){let p=null,c=0;if(g)for(let o=0,s=this._decorations.length;o{if(this._highlightedDecorationId!==null&&(o.changeDecorationOptions(this._highlightedDecorationId,C._FIND_MATCH_DECORATION),this._highlightedDecorationId=null),p!==null&&(this._highlightedDecorationId=p,o.changeDecorationOptions(this._highlightedDecorationId,C._CURRENT_FIND_MATCH_DECORATION)),this._rangeHighlightDecorationId!==null&&(o.removeDecoration(this._rangeHighlightDecorationId),this._rangeHighlightDecorationId=null),p!==null){let s=this._editor.getModel().getDecorationRange(p);if(s.startLineNumber!==s.endLineNumber&&s.endColumn===1){let a=s.endLineNumber-1,u=this._editor.getModel().getLineMaxColumn(a);s=new b.Range(s.startLineNumber,s.startColumn,a,u)}this._rangeHighlightDecorationId=o.addDecoration(s,C._RANGE_HIGHLIGHT_DECORATION)}}),c}set(g,p){this._editor.changeDecorations(c=>{let o=C._FIND_MATCH_DECORATION,s=[];if(g.length>1e3){o=C._FIND_MATCH_NO_OVERVIEW_DECORATION;const u=this._editor.getModel().getLineCount(),i=this._editor.getLayoutInfo().height/u,n=Math.max(2,Math.ceil(3/i));let t=g[0].range.startLineNumber,l=g[0].range.endLineNumber;for(let h=1,m=g.length;h=_.startLineNumber?_.endLineNumber>l&&(l=_.endLineNumber):(s.push({range:new b.Range(t,1,l,1),options:C._FIND_MATCH_ONLY_OVERVIEW_DECORATION}),t=_.startLineNumber,l=_.endLineNumber)}s.push({range:new b.Range(t,1,l,1),options:C._FIND_MATCH_ONLY_OVERVIEW_DECORATION})}let a=new Array(g.length);for(let u=0,r=g.length;uc.removeDecoration(u)),this._findScopeDecorationIds=[]),(p==null?void 0:p.length)&&(this._findScopeDecorationIds=p.map(u=>c.addDecoration(u,C._FIND_SCOPE_DECORATION)))})}matchBeforePosition(g){if(this._decorations.length===0)return null;for(let p=this._decorations.length-1;p>=0;p--){let c=this._decorations[p],o=this._editor.getModel().getDecorationRange(c);if(!(!o||o.endLineNumber>g.lineNumber)){if(o.endLineNumberg.column))return o}}return this._editor.getModel().getDecorationRange(this._decorations[this._decorations.length-1])}matchAfterPosition(g){if(this._decorations.length===0)return null;for(let p=0,c=this._decorations.length;pg.lineNumber)return s;if(!(s.startColumnthis.research(!1),100),this._toDispose.add(this._updateDecorationsScheduler),this._toDispose.add(this._editor.onDidChangeCursorPosition(t=>{(t.reason===3||t.reason===5||t.reason===6)&&this._decorations.setStartPosition(this._editor.getPosition())})),this._ignoreModelContentChanged=!1,this._toDispose.add(this._editor.onDidChangeModelContent(t=>{this._ignoreModelContentChanged||(t.isFlush&&this._decorations.reset(),this._decorations.setStartPosition(this._editor.getPosition()),this._updateDecorationsScheduler.schedule())})),this._toDispose.add(this._state.onFindReplaceStateChange(t=>this._onStateChanged(t))),this.research(!1,this._state.searchScope)}dispose(){this._isDisposed=!0,N.dispose(this._startSearchingTimer),this._toDispose.dispose()}_onStateChanged(i){this._isDisposed||!this._editor.hasModel()||(i.searchString||i.isReplaceRevealed||i.isRegex||i.wholeWord||i.matchCase||i.searchScope)&&(this._editor.getModel().isTooLargeForSyncing()?(this._startSearchingTimer.cancel(),this._startSearchingTimer.setIfNotSet(()=>{i.searchScope?this.research(i.moveCursor,this._state.searchScope):this.research(i.moveCursor)},a)):i.searchScope?this.research(i.moveCursor,this._state.searchScope):this.research(i.moveCursor))}static _getSearchRange(i,n){return n||i.getFullModelRange()}research(i,n){let t=null;typeof n!="undefined"?n!==null&&(Array.isArray(n)?t=n:t=[n]):t=this._decorations.getFindScopes(),t!==null&&(t=t.map(_=>{if(_.startLineNumber!==_.endLineNumber){let f=_.endLineNumber;return _.endColumn===1&&(f=f-1),new S.Range(_.startLineNumber,1,f,this._editor.getModel().getLineMaxColumn(f))}return _}));let l=this._findMatches(t,!1,e.MATCHES_LIMIT);this._decorations.set(l,t);const h=this._editor.getSelection();let m=this._decorations.getCurrentMatchesPosition(h);if(m===0&&l.length>0){const _=s.findFirstInSorted(l.map(f=>f.range),f=>S.Range.compareRangesUsingStarts(f,h)>=0);m=_>0?_-1+1:m}this._state.changeMatchInfo(m,this._decorations.getCount(),void 0),i&&this._editor.getOption(31).cursorMoveOnType&&this._moveToNextMatch(this._decorations.getStartPosition())}_hasMatches(){return this._state.matchesCount>0}_cannotFind(){if(!this._hasMatches()){let i=this._decorations.getFindScope();return i&&this._editor.revealRangeInCenterIfOutsideViewport(i,0),!0}return!1}_setCurrentFindMatch(i){let n=this._decorations.setCurrentFindMatch(i);this._state.changeMatchInfo(n,this._decorations.getCount(),i),this._editor.setSelection(i),this._editor.revealRangeInCenterIfOutsideViewport(i,0)}_prevSearchPosition(i){let n=this._state.isRegex&&(this._state.searchString.indexOf("^")>=0||this._state.searchString.indexOf("$")>=0),{lineNumber:t,column:l}=i,h=this._editor.getModel();return n||l===1?(t===1?t=h.getLineCount():t--,l=h.getLineMaxColumn(t)):l--,new w.Position(t,l)}_moveToPrevMatch(i,n=!1){if(!this._state.canNavigateBack()){const y=this._decorations.matchAfterPosition(i);y&&this._setCurrentFindMatch(y);return}if(this._decorations.getCount()=0||this._state.searchString.indexOf("$")>=0),{lineNumber:t,column:l}=i,h=this._editor.getModel();return n||l===h.getLineMaxColumn(t)?(t===h.getLineCount()?t=1:t++,l=1):l++,new w.Position(t,l)}_moveToNextMatch(i){if(!this._state.canNavigateForward()){const t=this._decorations.matchBeforePosition(i);t&&this._setCurrentFindMatch(t);return}if(this._decorations.getCount()u._getSearchRange(this._editor.getModel(),h));return this._editor.getModel().findMatches(this._state.searchString,l,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(110):null,n,t)}replaceAll(){if(!!this._hasMatches()){const i=this._decorations.getFindScopes();i===null&&this._state.matchesCount>=e.MATCHES_LIMIT?this._largeReplaceAll():this._regularReplaceAll(i),this.research(!1)}}_largeReplaceAll(){const n=new d.SearchParams(this._state.searchString,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(110):null).parseSearchRequest();if(!!n){let t=n.regex;if(!t.multiline){let L="mu";t.ignoreCase&&(L+="i"),t.global&&(L+="g"),t=new RegExp(t.source,L)}const l=this._editor.getModel(),h=l.getValue(1),m=l.getFullModelRange(),_=this._getReplacePattern();let f;const v=this._state.preserveCase;_.hasReplacementPatterns||v?f=h.replace(t,function(){return _.buildReplaceString(arguments,v)}):f=h.replace(t,_.buildReplaceString(null,v));let y=new M.ReplaceCommandThatPreservesSelection(m,f,this._editor.getSelection());this._executeEditorCommand("replaceAll",y)}}_regularReplaceAll(i){const n=this._getReplacePattern();let t=this._findMatches(i,n.hasReplacementPatterns||this._state.preserveCase,1073741824),l=[];for(let m=0,_=t.length;m<_;m++)l[m]=n.buildReplaceString(t[m].matches,this._state.preserveCase);let h=new p.ReplaceAllCommand(this._editor.getSelection(),t.map(m=>m.range),l);this._executeEditorCommand("replaceAll",h)}selectAllMatches(){if(!!this._hasMatches()){let i=this._decorations.getFindScopes(),t=this._findMatches(i,!1,1073741824).map(h=>new C.Selection(h.range.startLineNumber,h.range.startColumn,h.range.endLineNumber,h.range.endColumn)),l=this._editor.getSelection();for(let h=0,m=t.length;hthis._hide(),2e3)),this._isVisible=!1,this._editor=c,this._state=o,this._keybindingService=s,this._domNode=document.createElement("div"),this._domNode.className="findOptionsWidget",this._domNode.style.display="none",this._domNode.style.top="10px",this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true");const u=a.getColorTheme().getColor(C.inputActiveOptionBorder),r=a.getColorTheme().getColor(C.inputActiveOptionForeground),i=a.getColorTheme().getColor(C.inputActiveOptionBackground);this.caseSensitive=this._register(new N.CaseSensitiveCheckbox({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleCaseSensitiveCommand),isChecked:this._state.matchCase,inputActiveOptionBorder:u,inputActiveOptionForeground:r,inputActiveOptionBackground:i})),this._domNode.appendChild(this.caseSensitive.domNode),this._register(this.caseSensitive.onChange(()=>{this._state.change({matchCase:this.caseSensitive.checked},!1)})),this.wholeWords=this._register(new N.WholeWordsCheckbox({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleWholeWordCommand),isChecked:this._state.wholeWord,inputActiveOptionBorder:u,inputActiveOptionForeground:r,inputActiveOptionBackground:i})),this._domNode.appendChild(this.wholeWords.domNode),this._register(this.wholeWords.onChange(()=>{this._state.change({wholeWord:this.wholeWords.checked},!1)})),this.regex=this._register(new N.RegexCheckbox({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleRegexCommand),isChecked:this._state.isRegex,inputActiveOptionBorder:u,inputActiveOptionForeground:r,inputActiveOptionBackground:i})),this._domNode.appendChild(this.regex.domNode),this._register(this.regex.onChange(()=>{this._state.change({isRegex:this.regex.checked},!1)})),this._editor.addOverlayWidget(this),this._register(this._state.onFindReplaceStateChange(n=>{let t=!1;n.isRegex&&(this.regex.checked=this._state.isRegex,t=!0),n.wholeWord&&(this.wholeWords.checked=this._state.wholeWord,t=!0),n.matchCase&&(this.caseSensitive.checked=this._state.matchCase,t=!0),!this._state.isRevealed&&t&&this._revealTemporarily()})),this._register(b.addDisposableNonBubblingMouseOutListener(this._domNode,n=>this._onMouseOut())),this._register(b.addDisposableListener(this._domNode,"mouseover",n=>this._onMouseOver())),this._applyTheme(a.getColorTheme()),this._register(a.onDidColorThemeChange(this._applyTheme.bind(this)))}_keybindingLabelFor(c){let o=this._keybindingService.lookupKeybinding(c);return o?` (${o.getLabel()})`:""}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return g.ID}getDomNode(){return this._domNode}getPosition(){return{preference:0}}highlightFindOptions(){this._revealTemporarily()}_revealTemporarily(){this._show(),this._hideSoon.schedule()}_onMouseOut(){this._hideSoon.schedule()}_onMouseOver(){this._hideSoon.cancel()}_show(){this._isVisible||(this._isVisible=!0,this._domNode.style.display="block")}_hide(){!this._isVisible||(this._isVisible=!1,this._domNode.style.display="none")}_applyTheme(c){let o={inputActiveOptionBorder:c.getColor(C.inputActiveOptionBorder),inputActiveOptionForeground:c.getColor(C.inputActiveOptionForeground),inputActiveOptionBackground:c.getColor(C.inputActiveOptionBackground)};this.caseSensitive.style(o),this.wholeWords.style(o),this.regex.style(o)}}e.FindOptionsWidget=g,g.ID="editor.contrib.findOptionsWidget",d.registerThemingParticipant((p,c)=>{const o=p.getColor(C.editorWidgetBackground);o&&c.addRule(`.monaco-editor .findOptionsWidget { background-color: ${o}; }`);const s=p.getColor(C.editorWidgetForeground);s&&c.addRule(`.monaco-editor .findOptionsWidget { color: ${s}; }`);const a=p.getColor(C.widgetShadow);a&&c.addRule(`.monaco-editor .findOptionsWidget { box-shadow: 0 0 8px 2px ${a}; }`);const u=p.getColor(C.contrastBorder);u&&c.addRule(`.monaco-editor .findOptionsWidget { border: 2px solid ${u}; }`)})}),define(Q[600],J([0,1,6,2,3,142]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindReplaceState=void 0;function S(d,g){return d===1?!0:d===2?!1:g}class C extends N.Disposable{constructor(){super();this._onFindReplaceStateChange=this._register(new b.Emitter),this.onFindReplaceStateChange=this._onFindReplaceStateChange.event,this._searchString="",this._replaceString="",this._isRevealed=!1,this._isReplaceRevealed=!1,this._isRegex=!1,this._isRegexOverride=0,this._wholeWord=!1,this._wholeWordOverride=0,this._matchCase=!1,this._matchCaseOverride=0,this._preserveCase=!1,this._preserveCaseOverride=0,this._searchScope=null,this._matchesPosition=0,this._matchesCount=0,this._currentMatch=null,this._loop=!0}get searchString(){return this._searchString}get replaceString(){return this._replaceString}get isRevealed(){return this._isRevealed}get isReplaceRevealed(){return this._isReplaceRevealed}get isRegex(){return S(this._isRegexOverride,this._isRegex)}get wholeWord(){return S(this._wholeWordOverride,this._wholeWord)}get matchCase(){return S(this._matchCaseOverride,this._matchCase)}get preserveCase(){return S(this._preserveCaseOverride,this._preserveCase)}get actualIsRegex(){return this._isRegex}get actualWholeWord(){return this._wholeWord}get actualMatchCase(){return this._matchCase}get actualPreserveCase(){return this._preserveCase}get searchScope(){return this._searchScope}get matchesPosition(){return this._matchesPosition}get matchesCount(){return this._matchesCount}get currentMatch(){return this._currentMatch}changeMatchInfo(g,p,c){let o={moveCursor:!1,updateHistory:!1,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1},s=!1;p===0&&(g=0),g>p&&(g=p),this._matchesPosition!==g&&(this._matchesPosition=g,o.matchesPosition=!0,s=!0),this._matchesCount!==p&&(this._matchesCount=p,o.matchesCount=!0,s=!0),typeof c!="undefined"&&(M.Range.equalsRange(this._currentMatch,c)||(this._currentMatch=c,o.currentMatch=!0,s=!0)),s&&this._onFindReplaceStateChange.fire(o)}change(g,p,c=!0){var o;let s={moveCursor:p,updateHistory:c,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1},a=!1;const u=this.isRegex,r=this.wholeWord,i=this.matchCase,n=this.preserveCase;typeof g.searchString!="undefined"&&this._searchString!==g.searchString&&(this._searchString=g.searchString,s.searchString=!0,a=!0),typeof g.replaceString!="undefined"&&this._replaceString!==g.replaceString&&(this._replaceString=g.replaceString,s.replaceString=!0,a=!0),typeof g.isRevealed!="undefined"&&this._isRevealed!==g.isRevealed&&(this._isRevealed=g.isRevealed,s.isRevealed=!0,a=!0),typeof g.isReplaceRevealed!="undefined"&&this._isReplaceRevealed!==g.isReplaceRevealed&&(this._isReplaceRevealed=g.isReplaceRevealed,s.isReplaceRevealed=!0,a=!0),typeof g.isRegex!="undefined"&&(this._isRegex=g.isRegex),typeof g.wholeWord!="undefined"&&(this._wholeWord=g.wholeWord),typeof g.matchCase!="undefined"&&(this._matchCase=g.matchCase),typeof g.preserveCase!="undefined"&&(this._preserveCase=g.preserveCase),typeof g.searchScope!="undefined"&&(((o=g.searchScope)===null||o===void 0?void 0:o.every(t=>{var l;return(l=this._searchScope)===null||l===void 0?void 0:l.some(h=>!M.Range.equalsRange(h,t))}))||(this._searchScope=g.searchScope,s.searchScope=!0,a=!0)),typeof g.loop!="undefined"&&this._loop!==g.loop&&(this._loop=g.loop,s.loop=!0,a=!0),this._isRegexOverride=typeof g.isRegexOverride!="undefined"?g.isRegexOverride:0,this._wholeWordOverride=typeof g.wholeWordOverride!="undefined"?g.wholeWordOverride:0,this._matchCaseOverride=typeof g.matchCaseOverride!="undefined"?g.matchCaseOverride:0,this._preserveCaseOverride=typeof g.preserveCaseOverride!="undefined"?g.preserveCaseOverride:0,u!==this.isRegex&&(a=!0,s.isRegex=!0),r!==this.wholeWord&&(a=!0,s.wholeWord=!0),i!==this.matchCase&&(a=!0,s.matchCase=!0),n!==this.preserveCase&&(a=!0,s.preserveCase=!0),a&&this._onFindReplaceStateChange.fire(s)}canNavigateBack(){return this.canNavigateInLoop()||this.matchesPosition!==1}canNavigateForward(){return this.canNavigateInLoop()||this.matchesPosition=w.MATCHES_LIMIT}}e.FindReplaceState=C}),define(Q[601],J([0,1,132,67,175,205,115,11,116,7,484,159,44,2,9,37,66,157]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilityProvider=e.OneReferenceRenderer=e.FileReferencesRenderer=e.IdentityProvider=e.StringRepresentationProvider=e.Delegate=e.DataSource=void 0;let n=class{constructor(I){this._resolverService=I}hasChildren(I){return I instanceof b.ReferencesModel||I instanceof b.FileReferences}getChildren(I){if(I instanceof b.ReferencesModel)return I.groups;if(I instanceof b.FileReferences)return I.resolve(this._resolverService).then(k=>k.children);throw new Error("bad tree")}};n=Me([_e(0,N.ITextModelService)],n),e.DataSource=n;class t{getHeight(){return 23}getTemplateId(I){return I instanceof b.FileReferences?_.id:v.id}}e.Delegate=t;let l=class{constructor(I){this._keybindingService=I}getKeyboardNavigationLabel(I){var k;if(I instanceof b.OneReference){const E=(k=I.parent.getPreview(I))===null||k===void 0?void 0:k.preview(I.range);if(E)return E.value}return o.basename(I.uri)}};l=Me([_e(0,u.IKeybindingService)],l),e.StringRepresentationProvider=l;class h{getId(I){return I instanceof b.OneReference?I.id:I.uri}}e.IdentityProvider=h;let m=class extends s.Disposable{constructor(I,k,E){super();this._uriLabel=k;const T=document.createElement("div");T.classList.add("reference-file"),this.file=this._register(new M.IconLabel(T,{supportHighlights:!0})),this.badge=new w.CountBadge(g.append(T,g.$(".count"))),this._register(d.attachBadgeStyler(this.badge,E)),I.appendChild(T)}set(I,k){let E=o.dirname(I.uri);this.file.setLabel(c.getBaseLabel(I.uri),this._uriLabel.getUriLabel(E,{relative:!0}),{title:this._uriLabel.getUriLabel(I.uri),matches:k});const T=I.children.length;this.badge.setCount(T),T>1?this.badge.setTitleFormat(p.localize(0,null,T)):this.badge.setTitleFormat(p.localize(1,null,T))}};m=Me([_e(1,S.ILabelService),_e(2,C.IThemeService)],m);let _=class Ot{constructor(I){this._instantiationService=I,this.templateId=Ot.id}renderTemplate(I){return this._instantiationService.createInstance(m,I)}renderElement(I,k,E){E.set(I.element,r.createMatches(I.filterData))}disposeTemplate(I){I.dispose()}};_.id="FileReferencesRenderer",_=Me([_e(0,a.IInstantiationService)],_),e.FileReferencesRenderer=_;class f{constructor(I){this.label=new i.HighlightedLabel(I,!1)}set(I,k){var E;const T=(E=I.parent.getPreview(I))===null||E===void 0?void 0:E.preview(I.range);if(!T||!T.value)this.label.set(`${o.basename(I.uri)}:${I.range.startLineNumber+1}:${I.range.startColumn+1}`);else{const{value:O,highlight:A}=T;k&&!r.FuzzyScore.isDefault(k)?(this.label.element.classList.toggle("referenceMatch",!1),this.label.set(O,r.createMatches(k))):(this.label.element.classList.toggle("referenceMatch",!0),this.label.set(O,[A]))}}}class v{constructor(){this.templateId=v.id}renderTemplate(I){return new f(I)}renderElement(I,k,E){E.set(I.element,I.filterData)}disposeTemplate(){}}e.OneReferenceRenderer=v,v.id="OneReferenceRenderer";class y{getWidgetAriaLabel(){return p.localize(2,null)}getAriaLabel(I){return I.ariaMessage}}e.AccessibilityProvider=y}),define(Q[258],J([0,1,53,11,49,2,108,20,88]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEditorNavigationQuickAccessProvider=void 0;class g{constructor(c){this.options=c,this.rangeHighlightDecorationId=void 0}provide(c,o){var s;const a=new w.DisposableStore;c.canAcceptInBackground=!!((s=this.options)===null||s===void 0?void 0:s.canAcceptInBackground),c.matchOnLabel=c.matchOnDescription=c.matchOnDetail=c.sortByLabel=!1;const u=a.add(new w.MutableDisposable);return u.value=this.doProvide(c,o),a.add(this.onDidActiveTextEditorControlChange(()=>{u.value=void 0,u.value=this.doProvide(c,o)})),a}doProvide(c,o){const s=new w.DisposableStore,a=this.activeTextEditorControl;if(a&&this.canProvideWithTextEditor(a)){const u={editor:a},r=S.getCodeEditor(a);if(r){let i=C.withNullAsUndefined(a.saveViewState());s.add(r.onDidChangeCursorPosition(()=>{i=C.withNullAsUndefined(a.saveViewState())})),u.restoreViewState=()=>{i&&a===this.activeTextEditorControl&&a.restoreViewState(i)},s.add(d.once(o.onCancellationRequested)(()=>{var n;return(n=u.restoreViewState)===null||n===void 0?void 0:n.call(u)}))}s.add(w.toDisposable(()=>this.clearDecorations(a))),s.add(this.provideWithTextEditor(u,c,o))}else s.add(this.provideWithoutTextEditor(c,o));return s}canProvideWithTextEditor(c){return!0}gotoLocation({editor:c},o){c.setSelection(o.range),c.revealRangeInCenter(o.range,0),o.preserveFocus||c.focus()}getModel(c){var o;return S.isDiffEditor(c)?(o=c.getModel())===null||o===void 0?void 0:o.modified:c.getModel()}addDecorations(c,o){c.changeDecorations(s=>{const a=[];this.rangeHighlightDecorationId&&(a.push(this.rangeHighlightDecorationId.overviewRulerDecorationId),a.push(this.rangeHighlightDecorationId.rangeHighlightId),this.rangeHighlightDecorationId=void 0);const u=[{range:o,options:{className:"rangeHighlight",isWholeLine:!0}},{range:o,options:{overviewRuler:{color:N.themeColorFromId(M.overviewRulerRangeHighlight),position:b.OverviewRulerLane.Full}}}],[r,i]=s.deltaDecorations(a,u);this.rangeHighlightDecorationId={rangeHighlightId:r,overviewRulerDecorationId:i}})}clearDecorations(c){const o=this.rangeHighlightDecorationId;o&&(c.changeDecorations(s=>{s.deltaDecorations([o.overviewRulerDecorationId,o.rangeHighlightId],[])}),this.rangeHighlightDecorationId=void 0)}}e.AbstractEditorNavigationQuickAccessProvider=g}),define(Q[602],J([0,1,501,2,258,108]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractGotoLineQuickAccessProvider=void 0;class S extends M.AbstractEditorNavigationQuickAccessProvider{constructor(){super({canAcceptInBackground:!0})}provideWithoutTextEditor(d){const g=b.localize(0,null);return d.items=[{label:g}],d.ariaLabel=g,N.Disposable.None}provideWithTextEditor(d,g,p){const c=d.editor,o=new N.DisposableStore;o.add(g.onDidAccept(u=>{const[r]=g.selectedItems;if(r){if(!this.isValidLineNumber(c,r.lineNumber))return;this.gotoLocation(d,{range:this.toRange(r.lineNumber,r.column),keyMods:g.keyMods,preserveFocus:u.inBackground}),u.inBackground||g.hide()}}));const s=()=>{const u=this.parsePosition(c,g.value.trim().substr(S.PREFIX.length)),r=this.getPickLabel(c,u.lineNumber,u.column);if(g.items=[{lineNumber:u.lineNumber,column:u.column,label:r}],g.ariaLabel=r,!this.isValidLineNumber(c,u.lineNumber)){this.clearDecorations(c);return}const i=this.toRange(u.lineNumber,u.column);c.revealRangeInCenter(i,0),this.addDecorations(c,i)};s(),o.add(g.onDidChangeValue(()=>s()));const a=w.getCodeEditor(c);return a&&a.getOptions().get(54).renderType===2&&(a.updateOptions({lineNumbers:"on"}),o.add(N.toDisposable(()=>a.updateOptions({lineNumbers:"relative"})))),o}toRange(d=1,g=1){return{startLineNumber:d,startColumn:g,endLineNumber:d,endColumn:g}}parsePosition(d,g){const p=g.split(/,|:|#/).map(o=>parseInt(o,10)).filter(o=>!isNaN(o)),c=this.lineCount(d)+1;return{lineNumber:p[0]>0?p[0]:c+p[0],column:p[1]}}getPickLabel(d,g,p){if(this.isValidLineNumber(d,g))return this.isValidColumn(d,g,p)?b.localize(1,null,g,p):b.localize(2,null,g);const c=d.getPosition()||{lineNumber:1,column:1},o=this.lineCount(d);return o>1?b.localize(3,null,c.lineNumber,c.column,o):b.localize(4,null,c.lineNumber,c.column)}isValidLineNumber(d,g){return!g||typeof g!="number"?!1:g>0&&g<=this.lineCount(d)}isValidColumn(d,g,p){if(!p||typeof p!="number")return!1;const c=this.getModel(d);if(!c)return!1;const o={lineNumber:g,column:p};return c.validatePosition(o).equals(o)}lineCount(d){var g,p;return(p=(g=this.getModel(d))===null||g===void 0?void 0:g.getLineCount())!==null&&p!==void 0?p:0}}e.AbstractGotoLineQuickAccessProvider=S,S.PREFIX=":"}),define(Q[603],J([0,1,502,23,2,3,258,18,245,8,286,27]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractGotoSymbolQuickAccessProvider=void 0;class o extends S.AbstractEditorNavigationQuickAccessProvider{constructor(r=Object.create(null)){super(r);this.options=r,r.canAcceptInBackground=!0}provideWithoutTextEditor(r){return this.provideLabelPick(r,b.localize(0,null)),M.Disposable.None}provideWithTextEditor(r,i,n){const t=r.editor,l=this.getModel(t);return l?C.DocumentSymbolProviderRegistry.has(l)?this.doProvideWithEditorSymbols(r,l,i,n):this.doProvideWithoutEditorSymbols(r,l,i,n):M.Disposable.None}doProvideWithoutEditorSymbols(r,i,n,t){const l=new M.DisposableStore;return this.provideLabelPick(n,b.localize(1,null)),(()=>Ie(this,void 0,void 0,function*(){!(yield this.waitForLanguageSymbolRegistry(i,l))||t.isCancellationRequested||l.add(this.doProvideWithEditorSymbols(r,i,n,t))}))(),l}provideLabelPick(r,i){r.items=[{label:i,index:0,kind:14}],r.ariaLabel=i}waitForLanguageSymbolRegistry(r,i){return Ie(this,void 0,void 0,function*(){if(C.DocumentSymbolProviderRegistry.has(r))return!0;let n;const t=new Promise(h=>n=h),l=i.add(C.DocumentSymbolProviderRegistry.onDidChange(()=>{C.DocumentSymbolProviderRegistry.has(r)&&(l.dispose(),n(!0))}));return i.add(M.toDisposable(()=>n(!1))),t})}doProvideWithEditorSymbols(r,i,n,t){const l=r.editor,h=new M.DisposableStore;h.add(n.onDidAccept(y=>{const[L]=n.selectedItems;L&&L.range&&(this.gotoLocation(r,{range:L.range.selection,keyMods:n.keyMods,preserveFocus:y.inBackground}),y.inBackground||n.hide())})),h.add(n.onDidTriggerItemButton(({item:y})=>{y&&y.range&&(this.gotoLocation(r,{range:y.range.selection,keyMods:n.keyMods,forceSideBySide:!0}),n.hide())}));const m=this.getDocumentSymbols(i,t);let _;const f=()=>Ie(this,void 0,void 0,function*(){_==null||_.dispose(!0),n.busy=!1,_=new N.CancellationTokenSource(t),n.busy=!0;try{const y=p.prepareQuery(n.value.substr(o.PREFIX.length).trim()),L=yield this.doGetSymbolPicks(m,y,void 0,_.token);if(t.isCancellationRequested)return;L.length>0?n.items=L:y.original.length>0?this.provideLabelPick(n,b.localize(2,null)):this.provideLabelPick(n,b.localize(3,null))}finally{t.isCancellationRequested||(n.busy=!1)}});h.add(n.onDidChangeValue(()=>f())),f();let v=!0;return h.add(n.onDidChangeActive(()=>{const[y]=n.activeItems;if(y&&y.range){if(v){v=!1;return}l.revealRangeInCenter(y.range.selection,0),this.addDecorations(l,y.range.decoration)}})),h}doGetSymbolPicks(r,i,n,t){return Ie(this,void 0,void 0,function*(){const l=yield r;if(t.isCancellationRequested)return[];const h=i.original.indexOf(o.SCOPE_PREFIX)===0,m=h?1:0;let _,f;i.values&&i.values.length>1?(_=p.pieceToQuery(i.values[0]),f=p.pieceToQuery(i.values.slice(1))):_=i;const v=[];for(let k=0;km){let K=!1;if(_!==i&&([F,D]=p.scoreFuzzy2(O,Object.assign(Object.assign({},i),{values:void 0}),m,A),typeof F=="number"&&(K=!0)),typeof F!="number"&&([F,D]=p.scoreFuzzy2(O,_,m,A),typeof F!="number"))continue;if(!K&&f){if(B&&f.original.length>0&&([R,W]=p.scoreFuzzy2(B,f)),typeof R!="number")continue;typeof F=="number"&&(F+=R)}}const x=E.tags&&E.tags.indexOf(1)>=0;v.push({index:k,kind:E.kind,score:F,label:O,ariaLabel:T,description:B,highlights:x?void 0:{label:D,description:W},range:{selection:w.Range.collapseToStart(E.selectionRange),decoration:E.range},strikethrough:x,buttons:(()=>{var K,Y;const ee=((K=this.options)===null||K===void 0?void 0:K.openSideBySideDirection)?(Y=this.options)===null||Y===void 0?void 0:Y.openSideBySideDirection():void 0;if(!!ee)return[{iconClass:ee==="right"?c.Codicon.splitHorizontal.classNames:c.Codicon.splitVertical.classNames,tooltip:ee==="right"?b.localize(4,null):b.localize(5,null)}]})()})}const y=v.sort((k,E)=>h?this.compareByKindAndScore(k,E):this.compareByScore(k,E));let L=[];if(h){let k,E,T=0;function I(){E&&typeof k=="number"&&T>0&&(E.label=g.format(a[k]||s,T))}for(const O of y)k!==O.kind?(I(),k=O.kind,T=1,E={type:"separator"},L.push(E)):T++,L.push(O);I()}else y.length>0&&(L=[{label:b.localize(6,null,v.length),type:"separator"},...y]);return L})}compareByScore(r,i){if(typeof r.score!="number"&&typeof i.score=="number")return 1;if(typeof r.score=="number"&&typeof i.score!="number")return-1;if(typeof r.score=="number"&&typeof i.score=="number"){if(r.score>i.score)return-1;if(r.scorei.index?1:0}compareByKindAndScore(r,i){const n=a[r.kind]||s,t=a[i.kind]||s,l=n.localeCompare(t);return l===0?this.compareByScore(r,i):l}getDocumentSymbols(r,i){return Ie(this,void 0,void 0,function*(){const n=yield d.OutlineModel.create(r,i);return i.isCancellationRequested?[]:n.asListOfDocumentSymbols()})}}e.AbstractGotoSymbolQuickAccessProvider=o,o.PREFIX="@",o.SCOPE_PREFIX=":",o.PREFIX_BY_CATEGORY=`${o.PREFIX}${o.SCOPE_PREFIX}`;const s=b.localize(7,null),a={[5]:b.localize(8,null),[11]:b.localize(9,null),[8]:b.localize(10,null),[12]:b.localize(11,null),[4]:b.localize(12,null),[22]:b.localize(13,null),[23]:b.localize(14,null),[24]:b.localize(15,null),[10]:b.localize(16,null),[2]:b.localize(17,null),[3]:b.localize(18,null),[25]:b.localize(19,null),[1]:b.localize(20,null),[6]:b.localize(21,null),[9]:b.localize(22,null),[21]:b.localize(23,null),[14]:b.localize(24,null),[0]:b.localize(25,null),[17]:b.localize(26,null),[15]:b.localize(27,null),[16]:b.localize(28,null),[18]:b.localize(29,null),[19]:b.localize(30,null),[7]:b.localize(31,null),[13]:b.localize(32,null)}}),define(Q[604],J([0,1,2,14,504,16,22,11,37,350]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenameInputField=e.CONTEXT_RENAME_INPUT_VISIBLE=void 0,e.CONTEXT_RENAME_INPUT_VISIBLE=new w.RawContextKey("renameInputVisible",!1);let g=class{constructor(c,o,s,a,u){this._editor=c,this._acceptKeybindings=o,this._themeService=s,this._keybindingService=a,this._disposables=new b.DisposableStore,this.allowEditorOverflow=!0,this._visibleContextKey=e.CONTEXT_RENAME_INPUT_VISIBLE.bindTo(u),this._editor.addContentWidget(this),this._disposables.add(this._editor.onDidChangeConfiguration(r=>{r.hasChanged(38)&&this._updateFont()})),this._disposables.add(s.onDidColorThemeChange(this._updateStyles,this))}dispose(){this._disposables.dispose(),this._editor.removeContentWidget(this)}getId(){return"__renameInputWidget"}getDomNode(){if(!this._domNode){this._domNode=document.createElement("div"),this._domNode.className="monaco-editor rename-box",this._input=document.createElement("input"),this._input.className="rename-input",this._input.type="text",this._input.setAttribute("aria-label",M.localize(0,null)),this._domNode.appendChild(this._input),this._label=document.createElement("div"),this._label.className="rename-label",this._domNode.appendChild(this._label);const c=()=>{var o,s;const[a,u]=this._acceptKeybindings;this._keybindingService.lookupKeybinding(a),this._label.innerText=M.localize(1,null,(o=this._keybindingService.lookupKeybinding(a))===null||o===void 0?void 0:o.getLabel(),(s=this._keybindingService.lookupKeybinding(u))===null||s===void 0?void 0:s.getLabel())};c(),this._disposables.add(this._keybindingService.onDidUpdateKeybindings(c)),this._updateFont(),this._updateStyles(this._themeService.getColorTheme())}return this._domNode}_updateStyles(c){var o,s,a,u;if(!(!this._input||!this._domNode)){const r=c.getColor(S.widgetShadow);this._domNode.style.backgroundColor=String((o=c.getColor(S.editorWidgetBackground))!==null&&o!==void 0?o:""),this._domNode.style.boxShadow=r?` 0 0 8px 2px ${r}`:"",this._domNode.style.color=String((s=c.getColor(S.inputForeground))!==null&&s!==void 0?s:""),this._input.style.backgroundColor=String((a=c.getColor(S.inputBackground))!==null&&a!==void 0?a:"");const i=c.getColor(S.inputBorder);this._input.style.borderWidth=i?"1px":"0px",this._input.style.borderStyle=i?"solid":"none",this._input.style.borderColor=(u=i==null?void 0:i.toString())!==null&&u!==void 0?u:"none"}}_updateFont(){if(!(!this._input||!this._label)){const c=this._editor.getOption(38);this._input.style.fontFamily=c.fontFamily,this._input.style.fontWeight=c.fontWeight,this._input.style.fontSize=`${c.fontSize}px`,this._label.style.fontSize=`${c.fontSize*.8}px`}}getPosition(){return this._visible?{position:this._position,preference:[2,1]}:null}afterRender(c){c||this.cancelInput(!0)}acceptInput(c){this._currentAcceptInput&&this._currentAcceptInput(c)}cancelInput(c){this._currentCancelInput&&this._currentCancelInput(c)}getInput(c,o,s,a,u,r){this._domNode.classList.toggle("preview",u),this._position=new N.Position(c.startLineNumber,c.startColumn),this._input.value=o,this._input.setAttribute("selectionStart",s.toString()),this._input.setAttribute("selectionEnd",a.toString()),this._input.size=Math.max((c.endColumn-c.startColumn)*1.1,20);const i=new b.DisposableStore;return new Promise(n=>{this._currentCancelInput=t=>(this._currentAcceptInput=void 0,this._currentCancelInput=void 0,n(t),!0),this._currentAcceptInput=t=>{if(this._input.value.trim().length===0||this._input.value===o){this.cancelInput(!0);return}this._currentAcceptInput=void 0,this._currentCancelInput=void 0,n({newName:this._input.value,wantsPreview:u&&t})},r.onCancellationRequested(()=>this.cancelInput(!0)),i.add(this._editor.onDidBlurEditorWidget(()=>this.cancelInput(!1))),this._show()}).finally(()=>{i.dispose(),this._hide()})}_show(){this._editor.revealLineInCenterIfOutsideViewport(this._position.lineNumber,0),this._visible=!0,this._visibleContextKey.set(!0),this._editor.layoutContentWidget(this),setTimeout(()=>{this._input.focus(),this._input.setSelectionRange(parseInt(this._input.getAttribute("selectionStart")),parseInt(this._input.getAttribute("selectionEnd")))},100)}_hide(){this._visible=!1,this._visibleContextKey.reset(),this._editor.layoutContentWidget(this)}};g=Me([_e(2,C.IThemeService),_e(3,d.IKeybindingService),_e(4,w.IContextKeyService)],g),e.RenameInputField=g}),define(Q[259],J([0,1,512,11,22,27]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SYMBOL_ICON_VARIABLE_FOREGROUND=e.SYMBOL_ICON_UNIT_FOREGROUND=e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND=e.SYMBOL_ICON_TEXT_FOREGROUND=e.SYMBOL_ICON_STRUCT_FOREGROUND=e.SYMBOL_ICON_STRING_FOREGROUND=e.SYMBOL_ICON_SNIPPET_FOREGROUND=e.SYMBOL_ICON_REFERENCE_FOREGROUND=e.SYMBOL_ICON_PROPERTY_FOREGROUND=e.SYMBOL_ICON_PACKAGE_FOREGROUND=e.SYMBOL_ICON_OPERATOR_FOREGROUND=e.SYMBOL_ICON_OBJECT_FOREGROUND=e.SYMBOL_ICON_NUMBER_FOREGROUND=e.SYMBOL_ICON_NULL_FOREGROUND=e.SYMBOL_ICON_NAMESPACE_FOREGROUND=e.SYMBOL_ICON_MODULE_FOREGROUND=e.SYMBOL_ICON_METHOD_FOREGROUND=e.SYMBOL_ICON_KEYWORD_FOREGROUND=e.SYMBOL_ICON_KEY_FOREGROUND=e.SYMBOL_ICON_INTERFACE_FOREGROUND=e.SYMBOL_ICON_FUNCTION_FOREGROUND=e.SYMBOL_ICON_FOLDER_FOREGROUND=e.SYMBOL_ICON_FILE_FOREGROUND=e.SYMBOL_ICON_FIELD_FOREGROUND=e.SYMBOL_ICON_EVENT_FOREGROUND=e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND=e.SYMBOL_ICON_ENUMERATOR_FOREGROUND=e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND=e.SYMBOL_ICON_CONSTANT_FOREGROUND=e.SYMBOL_ICON_COLOR_FOREGROUND=e.SYMBOL_ICON_CLASS_FOREGROUND=e.SYMBOL_ICON_BOOLEAN_FOREGROUND=e.SYMBOL_ICON_ARRAY_FOREGROUND=void 0,e.SYMBOL_ICON_ARRAY_FOREGROUND=M.registerColor("symbolIcon.arrayForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(0,null)),e.SYMBOL_ICON_BOOLEAN_FOREGROUND=M.registerColor("symbolIcon.booleanForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(1,null)),e.SYMBOL_ICON_CLASS_FOREGROUND=M.registerColor("symbolIcon.classForeground",{dark:"#EE9D28",light:"#D67E00",hc:"#EE9D28"},b.localize(2,null)),e.SYMBOL_ICON_COLOR_FOREGROUND=M.registerColor("symbolIcon.colorForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(3,null)),e.SYMBOL_ICON_CONSTANT_FOREGROUND=M.registerColor("symbolIcon.constantForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(4,null)),e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND=M.registerColor("symbolIcon.constructorForeground",{dark:"#B180D7",light:"#652D90",hc:"#B180D7"},b.localize(5,null)),e.SYMBOL_ICON_ENUMERATOR_FOREGROUND=M.registerColor("symbolIcon.enumeratorForeground",{dark:"#EE9D28",light:"#D67E00",hc:"#EE9D28"},b.localize(6,null)),e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND=M.registerColor("symbolIcon.enumeratorMemberForeground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},b.localize(7,null)),e.SYMBOL_ICON_EVENT_FOREGROUND=M.registerColor("symbolIcon.eventForeground",{dark:"#EE9D28",light:"#D67E00",hc:"#EE9D28"},b.localize(8,null)),e.SYMBOL_ICON_FIELD_FOREGROUND=M.registerColor("symbolIcon.fieldForeground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},b.localize(9,null)),e.SYMBOL_ICON_FILE_FOREGROUND=M.registerColor("symbolIcon.fileForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(10,null)),e.SYMBOL_ICON_FOLDER_FOREGROUND=M.registerColor("symbolIcon.folderForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(11,null)),e.SYMBOL_ICON_FUNCTION_FOREGROUND=M.registerColor("symbolIcon.functionForeground",{dark:"#B180D7",light:"#652D90",hc:"#B180D7"},b.localize(12,null)),e.SYMBOL_ICON_INTERFACE_FOREGROUND=M.registerColor("symbolIcon.interfaceForeground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},b.localize(13,null)),e.SYMBOL_ICON_KEY_FOREGROUND=M.registerColor("symbolIcon.keyForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(14,null)),e.SYMBOL_ICON_KEYWORD_FOREGROUND=M.registerColor("symbolIcon.keywordForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(15,null)),e.SYMBOL_ICON_METHOD_FOREGROUND=M.registerColor("symbolIcon.methodForeground",{dark:"#B180D7",light:"#652D90",hc:"#B180D7"},b.localize(16,null)),e.SYMBOL_ICON_MODULE_FOREGROUND=M.registerColor("symbolIcon.moduleForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(17,null)),e.SYMBOL_ICON_NAMESPACE_FOREGROUND=M.registerColor("symbolIcon.namespaceForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(18,null)),e.SYMBOL_ICON_NULL_FOREGROUND=M.registerColor("symbolIcon.nullForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(19,null)),e.SYMBOL_ICON_NUMBER_FOREGROUND=M.registerColor("symbolIcon.numberForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(20,null)),e.SYMBOL_ICON_OBJECT_FOREGROUND=M.registerColor("symbolIcon.objectForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(21,null)),e.SYMBOL_ICON_OPERATOR_FOREGROUND=M.registerColor("symbolIcon.operatorForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(22,null)),e.SYMBOL_ICON_PACKAGE_FOREGROUND=M.registerColor("symbolIcon.packageForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(23,null)),e.SYMBOL_ICON_PROPERTY_FOREGROUND=M.registerColor("symbolIcon.propertyForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(24,null)),e.SYMBOL_ICON_REFERENCE_FOREGROUND=M.registerColor("symbolIcon.referenceForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(25,null)),e.SYMBOL_ICON_SNIPPET_FOREGROUND=M.registerColor("symbolIcon.snippetForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(26,null)),e.SYMBOL_ICON_STRING_FOREGROUND=M.registerColor("symbolIcon.stringForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(27,null)),e.SYMBOL_ICON_STRUCT_FOREGROUND=M.registerColor("symbolIcon.structForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(28,null)),e.SYMBOL_ICON_TEXT_FOREGROUND=M.registerColor("symbolIcon.textForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(29,null)),e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND=M.registerColor("symbolIcon.typeParameterForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(30,null)),e.SYMBOL_ICON_UNIT_FOREGROUND=M.registerColor("symbolIcon.unitForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(31,null)),e.SYMBOL_ICON_VARIABLE_FOREGROUND=M.registerColor("symbolIcon.variableForeground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},b.localize(32,null)),N.registerThemingParticipant((S,C)=>{const d=S.getColor(e.SYMBOL_ICON_ARRAY_FOREGROUND);d&&C.addRule(`${w.Codicon.symbolArray.cssSelector} { color: ${d}; }`);const g=S.getColor(e.SYMBOL_ICON_BOOLEAN_FOREGROUND);g&&C.addRule(`${w.Codicon.symbolBoolean.cssSelector} { color: ${g}; }`);const p=S.getColor(e.SYMBOL_ICON_CLASS_FOREGROUND);p&&C.addRule(`${w.Codicon.symbolClass.cssSelector} { color: ${p}; }`);const c=S.getColor(e.SYMBOL_ICON_METHOD_FOREGROUND);c&&C.addRule(`${w.Codicon.symbolMethod.cssSelector} { color: ${c}; }`);const o=S.getColor(e.SYMBOL_ICON_COLOR_FOREGROUND);o&&C.addRule(`${w.Codicon.symbolColor.cssSelector} { color: ${o}; }`);const s=S.getColor(e.SYMBOL_ICON_CONSTANT_FOREGROUND);s&&C.addRule(`${w.Codicon.symbolConstant.cssSelector} { color: ${s}; }`);const a=S.getColor(e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND);a&&C.addRule(`${w.Codicon.symbolConstructor.cssSelector} { color: ${a}; }`);const u=S.getColor(e.SYMBOL_ICON_ENUMERATOR_FOREGROUND);u&&C.addRule(` + ${w.Codicon.symbolValue.cssSelector},${w.Codicon.symbolEnum.cssSelector} { color: ${u}; }`);const r=S.getColor(e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND);r&&C.addRule(`${w.Codicon.symbolEnumMember.cssSelector} { color: ${r}; }`);const i=S.getColor(e.SYMBOL_ICON_EVENT_FOREGROUND);i&&C.addRule(`${w.Codicon.symbolEvent.cssSelector} { color: ${i}; }`);const n=S.getColor(e.SYMBOL_ICON_FIELD_FOREGROUND);n&&C.addRule(`${w.Codicon.symbolField.cssSelector} { color: ${n}; }`);const t=S.getColor(e.SYMBOL_ICON_FILE_FOREGROUND);t&&C.addRule(`${w.Codicon.symbolFile.cssSelector} { color: ${t}; }`);const l=S.getColor(e.SYMBOL_ICON_FOLDER_FOREGROUND);l&&C.addRule(`${w.Codicon.symbolFolder.cssSelector} { color: ${l}; }`);const h=S.getColor(e.SYMBOL_ICON_FUNCTION_FOREGROUND);h&&C.addRule(`${w.Codicon.symbolFunction.cssSelector} { color: ${h}; }`);const m=S.getColor(e.SYMBOL_ICON_INTERFACE_FOREGROUND);m&&C.addRule(`${w.Codicon.symbolInterface.cssSelector} { color: ${m}; }`);const _=S.getColor(e.SYMBOL_ICON_KEY_FOREGROUND);_&&C.addRule(`${w.Codicon.symbolKey.cssSelector} { color: ${_}; }`);const f=S.getColor(e.SYMBOL_ICON_KEYWORD_FOREGROUND);f&&C.addRule(`${w.Codicon.symbolKeyword.cssSelector} { color: ${f}; }`);const v=S.getColor(e.SYMBOL_ICON_MODULE_FOREGROUND);v&&C.addRule(`${w.Codicon.symbolModule.cssSelector} { color: ${v}; }`);const y=S.getColor(e.SYMBOL_ICON_NAMESPACE_FOREGROUND);y&&C.addRule(`${w.Codicon.symbolNamespace.cssSelector} { color: ${y}; }`);const L=S.getColor(e.SYMBOL_ICON_NULL_FOREGROUND);L&&C.addRule(`${w.Codicon.symbolNull.cssSelector} { color: ${L}; }`);const I=S.getColor(e.SYMBOL_ICON_NUMBER_FOREGROUND);I&&C.addRule(`${w.Codicon.symbolNumber.cssSelector} { color: ${I}; }`);const k=S.getColor(e.SYMBOL_ICON_OBJECT_FOREGROUND);k&&C.addRule(`${w.Codicon.symbolObject.cssSelector} { color: ${k}; }`);const E=S.getColor(e.SYMBOL_ICON_OPERATOR_FOREGROUND);E&&C.addRule(`${w.Codicon.symbolOperator.cssSelector} { color: ${E}; }`);const T=S.getColor(e.SYMBOL_ICON_PACKAGE_FOREGROUND);T&&C.addRule(`${w.Codicon.symbolPackage.cssSelector} { color: ${T}; }`);const O=S.getColor(e.SYMBOL_ICON_PROPERTY_FOREGROUND);O&&C.addRule(`${w.Codicon.symbolProperty.cssSelector} { color: ${O}; }`);const A=S.getColor(e.SYMBOL_ICON_REFERENCE_FOREGROUND);A&&C.addRule(`${w.Codicon.symbolReference.cssSelector} { color: ${A}; }`);const B=S.getColor(e.SYMBOL_ICON_SNIPPET_FOREGROUND);B&&C.addRule(`${w.Codicon.symbolSnippet.cssSelector} { color: ${B}; }`);const F=S.getColor(e.SYMBOL_ICON_STRING_FOREGROUND);F&&C.addRule(`${w.Codicon.symbolString.cssSelector} { color: ${F}; }`);const D=S.getColor(e.SYMBOL_ICON_STRUCT_FOREGROUND);D&&C.addRule(`${w.Codicon.symbolStruct.cssSelector} { color: ${D}; }`);const R=S.getColor(e.SYMBOL_ICON_TEXT_FOREGROUND);R&&C.addRule(`${w.Codicon.symbolText.cssSelector} { color: ${R}; }`);const W=S.getColor(e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND);W&&C.addRule(`${w.Codicon.symbolTypeParameter.cssSelector} { color: ${W}; }`);const x=S.getColor(e.SYMBOL_ICON_UNIT_FOREGROUND);x&&C.addRule(`${w.Codicon.symbolUnit.cssSelector} { color: ${x}; }`);const K=S.getColor(e.SYMBOL_ICON_VARIABLE_FOREGROUND);K&&C.addRule(`${w.Codicon.symbolVariable.cssSelector} { color: ${K}; }`)})}),define(Q[605],J([0,1,7,43,583,16,11]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneCodeEditorServiceImpl=void 0;let C=class extends M.CodeEditorServiceImpl{constructor(g,p,c){super(g,c);this.onCodeEditorAdd(()=>this._checkContextKey()),this.onCodeEditorRemove(()=>this._checkContextKey()),this._editorIsOpen=p.createKey("editorIsOpen",!1)}_checkContextKey(){let g=!1;for(const p of this.listCodeEditors())if(!p.isSimpleWidget){g=!0;break}this._editorIsOpen.set(g)}getActiveCodeEditor(){return null}openCodeEditor(g,p,c){return p?Promise.resolve(this.doOpenEditor(p,g)):Promise.resolve(null)}doOpenEditor(g,p){if(!this.findModel(g,p.resource)){if(p.resource){const s=p.resource.scheme;if(s===N.Schemas.http||s===N.Schemas.https)return b.windowOpenNoOpener(p.resource.toString()),g}return null}const o=p.options?p.options.selection:null;if(o)if(typeof o.endLineNumber=="number"&&typeof o.endColumn=="number")g.setSelection(o),g.revealRangeInCenter(o,1);else{const s={lineNumber:o.startLineNumber,column:o.startColumn};g.setPosition(s),g.revealPositionInCenter(s,1)}return g}findModel(g,p){const c=g.getModel();return c&&c.uri.toString()!==p.toString()?null:c}};C=Me([_e(1,w.IContextKeyService),_e(2,S.IThemeService)],C),e.StandaloneCodeEditorServiceImpl=C}),define(Q[606],J([0,1,49,22]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hc_black=e.vs_dark=e.vs=void 0,e.vs={base:"vs",inherit:!1,rules:[{token:"",foreground:"000000",background:"fffffe"},{token:"invalid",foreground:"cd3131"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"001188"},{token:"variable.predefined",foreground:"4864AA"},{token:"constant",foreground:"dd0000"},{token:"comment",foreground:"008000"},{token:"number",foreground:"098658"},{token:"number.hex",foreground:"3030c0"},{token:"regexp",foreground:"800000"},{token:"annotation",foreground:"808080"},{token:"type",foreground:"008080"},{token:"delimiter",foreground:"000000"},{token:"delimiter.html",foreground:"383838"},{token:"delimiter.xml",foreground:"0000FF"},{token:"tag",foreground:"800000"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"800000"},{token:"metatag",foreground:"e00000"},{token:"metatag.content.html",foreground:"FF0000"},{token:"metatag.html",foreground:"808080"},{token:"metatag.xml",foreground:"808080"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"863B00"},{token:"string.key.json",foreground:"A31515"},{token:"string.value.json",foreground:"0451A5"},{token:"attribute.name",foreground:"FF0000"},{token:"attribute.value",foreground:"0451A5"},{token:"attribute.value.number",foreground:"098658"},{token:"attribute.value.unit",foreground:"098658"},{token:"attribute.value.html",foreground:"0000FF"},{token:"attribute.value.xml",foreground:"0000FF"},{token:"string",foreground:"A31515"},{token:"string.html",foreground:"0000FF"},{token:"string.sql",foreground:"FF0000"},{token:"string.yaml",foreground:"0451A5"},{token:"keyword",foreground:"0000FF"},{token:"keyword.json",foreground:"0451A5"},{token:"keyword.flow",foreground:"AF00DB"},{token:"keyword.flow.scss",foreground:"0000FF"},{token:"operator.scss",foreground:"666666"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"666666"},{token:"predefined.sql",foreground:"C700C7"}],colors:{[N.editorBackground]:"#FFFFFE",[N.editorForeground]:"#000000",[N.editorInactiveSelection]:"#E5EBF1",[b.editorIndentGuides]:"#D3D3D3",[b.editorActiveIndentGuides]:"#939393",[N.editorSelectionHighlight]:"#ADD6FF4D"}},e.vs_dark={base:"vs-dark",inherit:!1,rules:[{token:"",foreground:"D4D4D4",background:"1E1E1E"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"74B0DF"},{token:"variable.predefined",foreground:"4864AA"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"B5CEA8"},{token:"number.hex",foreground:"5BB498"},{token:"regexp",foreground:"B46695"},{token:"annotation",foreground:"cc6666"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"DCDCDC"},{token:"delimiter.html",foreground:"808080"},{token:"delimiter.xml",foreground:"808080"},{token:"tag",foreground:"569CD6"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"A79873"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"DD6A6F"},{token:"metatag.content.html",foreground:"9CDCFE"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key.json",foreground:"9CDCFE"},{token:"string.value.json",foreground:"CE9178"},{token:"attribute.name",foreground:"9CDCFE"},{token:"attribute.value",foreground:"CE9178"},{token:"attribute.value.number.css",foreground:"B5CEA8"},{token:"attribute.value.unit.css",foreground:"B5CEA8"},{token:"attribute.value.hex.css",foreground:"D4D4D4"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"keyword.json",foreground:"CE9178"},{token:"keyword.flow.scss",foreground:"569CD6"},{token:"operator.scss",foreground:"909090"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:{[N.editorBackground]:"#1E1E1E",[N.editorForeground]:"#D4D4D4",[N.editorInactiveSelection]:"#3A3D41",[b.editorIndentGuides]:"#404040",[b.editorActiveIndentGuides]:"#707070",[N.editorSelectionHighlight]:"#ADD6FF26"}},e.hc_black={base:"hc-black",inherit:!1,rules:[{token:"",foreground:"FFFFFF",background:"000000"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"1AEBFF"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"FFFFFF"},{token:"regexp",foreground:"C0C0C0"},{token:"annotation",foreground:"569CD6"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"FFFF00"},{token:"delimiter.html",foreground:"FFFF00"},{token:"tag",foreground:"569CD6"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta",foreground:"D4D4D4"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"569CD6"},{token:"metatag.content.html",foreground:"1AEBFF"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key",foreground:"9CDCFE"},{token:"string.value",foreground:"CE9178"},{token:"attribute.name",foreground:"569CD6"},{token:"attribute.value",foreground:"3FF23F"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:{[N.editorBackground]:"#000000",[N.editorForeground]:"#FFFFFF",[b.editorIndentGuides]:"#FFFFFF",[b.editorActiveIndentGuides]:"#FFFFFF"}}}),define(Q[34],J([0,1,48,9,16,26,2,6,11,54,71,27]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MenuItemAction=e.SubmenuItemAction=e.MenuRegistry=e.IMenuService=e.MenuId=e.isIMenuItem=void 0;function o(r){return r.command!==void 0}e.isIMenuItem=o;class s{constructor(i){this.id=s._idPool++,this._debugName=i}}e.MenuId=s,s._idPool=0,s.CommandPalette=new s("CommandPalette"),s.EditorContext=new s("EditorContext"),s.EditorContextPeek=new s("EditorContextPeek"),s.MenubarEditMenu=new s("MenubarEditMenu"),s.MenubarGoMenu=new s("MenubarGoMenu"),s.MenubarSelectionMenu=new s("MenubarSelectionMenu"),e.IMenuService=N.createDecorator("menuService"),e.MenuRegistry=new class{constructor(){this._commands=new Map,this._menuItems=new Map,this._onDidChangeMenu=new C.Emitter,this.onDidChangeMenu=this._onDidChangeMenu.event,this._commandPaletteChangeEvent={has:r=>r===s.CommandPalette}}addCommand(r){return this.addCommands(g.Iterable.single(r))}addCommands(r){for(const i of r)this._commands.set(i.id,i);return this._onDidChangeMenu.fire(this._commandPaletteChangeEvent),S.toDisposable(()=>{let i=!1;for(const n of r)i=this._commands.delete(n.id)||i;i&&this._onDidChangeMenu.fire(this._commandPaletteChangeEvent)})}getCommand(r){return this._commands.get(r)}getCommands(){const r=new Map;return this._commands.forEach((i,n)=>r.set(n,i)),r}appendMenuItem(r,i){return this.appendMenuItems(g.Iterable.single({id:r,item:i}))}appendMenuItems(r){const i=new Set,n=new p.LinkedList;for(const{id:t,item:l}of r){let h=this._menuItems.get(t);h||(h=new p.LinkedList,this._menuItems.set(t,h)),n.push(h.push(l)),i.add(t)}return this._onDidChangeMenu.fire(i),S.toDisposable(()=>{if(n.size>0){for(let t of n)t();this._onDidChangeMenu.fire(i),n.clear()}})}getMenuItems(r){let i;return this._menuItems.has(r)?i=[...this._menuItems.get(r)]:i=[],r===s.CommandPalette&&this._appendImplicitItems(i),i}_appendImplicitItems(r){const i=new Set;for(const n of r)o(n)&&(i.add(n.command.id),n.alt&&i.add(n.alt.id));this._commands.forEach((n,t)=>{i.has(t)||r.push({command:n})})}};class a extends b.SubmenuAction{constructor(i,n,t,l){super(`submenuitem.${i.submenu.id}`,typeof i.title=="string"?i.title:i.title.value,[],"submenu");this.item=i,this._menuService=n,this._contextKeyService=t,this._options=l}get actions(){const i=[],n=this._menuService.createMenu(this.item.submenu,this._contextKeyService),t=n.getActions(this._options);n.dispose();for(const[,l]of t)l.length>0&&(i.push(...l),i.push(new b.Separator));return i.length&&i.pop(),i}}e.SubmenuItemAction=a;let u=class Pt{constructor(i,n,t,l,h){var m;if(this._commandService=h,this.id=i.id,this.label=typeof i.title=="string"?i.title:i.title.value,this.tooltip=(m=i.tooltip)!==null&&m!==void 0?m:"",this.enabled=!i.precondition||l.contextMatchesRules(i.precondition),this.checked=!1,i.toggled){const _=i.toggled.condition?i.toggled:{condition:i.toggled};this.checked=l.contextMatchesRules(_.condition),this.checked&&_.tooltip&&(this.tooltip=typeof _.tooltip=="string"?_.tooltip:_.tooltip.value)}this.item=i,this.alt=n?new Pt(n,void 0,t,l,h):void 0,this._options=t,d.ThemeIcon.isThemeIcon(i.icon)&&(this.class=c.CSSIcon.asClassName(i.icon))}dispose(){}run(...i){var n,t;let l=[];return((n=this._options)===null||n===void 0?void 0:n.arg)&&(l=[...l,this._options.arg]),((t=this._options)===null||t===void 0?void 0:t.shouldForwardArgs)&&(l=[...l,...i]),this._commandService.executeCommand(this.id,...l)}};u=Me([_e(3,M.IContextKeyService),_e(4,w.ICommandService)],u),e.MenuItemAction=u}),define(Q[13],J([0,1,447,24,28,14,36,67,34,26,16,86,33,87,20]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectAllCommand=e.RedoCommand=e.UndoCommand=e.EditorExtensionsRegistry=e.registerEditorContribution=e.registerInstantiatedEditorAction=e.registerMultiEditorAction=e.registerEditorAction=e.registerEditorCommand=e.registerModelCommand=e.registerModelAndPositionCommand=e.MultiEditorAction=e.EditorAction=e.EditorCommand=e.ProxyCommand=e.MultiCommand=e.Command=void 0;class u{constructor(A){this.id=A.id,this.precondition=A.precondition,this._kbOpts=A.kbOpts,this._menuOpts=A.menuOpts,this._description=A.description}register(){if(Array.isArray(this._menuOpts)?this._menuOpts.forEach(this._registerMenuItem,this):this._menuOpts&&this._registerMenuItem(this._menuOpts),this._kbOpts){let A=this._kbOpts.kbExpr;this.precondition&&(A?A=p.ContextKeyExpr.and(A,this.precondition):A=this.precondition),c.KeybindingsRegistry.registerCommandAndKeybindingRule({id:this.id,handler:(B,F)=>this.runCommand(B,F),weight:this._kbOpts.weight,args:this._kbOpts.args,when:A,primary:this._kbOpts.primary,secondary:this._kbOpts.secondary,win:this._kbOpts.win,linux:this._kbOpts.linux,mac:this._kbOpts.mac,description:this._description})}else g.CommandsRegistry.registerCommand({id:this.id,handler:(A,B)=>this.runCommand(A,B),description:this._description})}_registerMenuItem(A){d.MenuRegistry.appendMenuItem(A.menuId,{group:A.group,command:{id:this.id,title:A.title,icon:A.icon,precondition:this.precondition},when:A.when,order:A.order})}}e.Command=u;class r extends u{constructor(){super(...arguments);this._implementations=[]}addImplementation(A,B){return this._implementations.push([A,B]),this._implementations.sort((F,D)=>D[0]-F[0]),{dispose:()=>{for(let F=0;F{if(!!R.get(p.IContextKeyService).contextMatchesRules(a.withNullAsUndefined(this.precondition)))return this.runEditorCommand(R,D,B)})}}e.EditorCommand=n;class t extends n{constructor(A){super(t.convertOptions(A));this.label=A.label,this.alias=A.alias}static convertOptions(A){let B;Array.isArray(A.menuOpts)?B=A.menuOpts:A.menuOpts?B=[A.menuOpts]:B=[];function F(D){return D.menuId||(D.menuId=d.MenuId.EditorContext),D.title||(D.title=A.label),D.when=p.ContextKeyExpr.and(A.precondition,D.when),D}return Array.isArray(A.contextMenuOpts)?B.push(...A.contextMenuOpts.map(F)):A.contextMenuOpts&&B.push(F(A.contextMenuOpts)),A.menuOpts=B,A}runEditorCommand(A,B,F){return this.reportTelemetry(A,B),this.run(A,B,F||{})}reportTelemetry(A,B){A.get(s.ITelemetryService).publicLog2("editorActionInvoked",{name:this.label,id:this.id})}}e.EditorAction=t;class l extends t{constructor(){super(...arguments);this._implementations=[]}addImplementation(A,B){return this._implementations.push([A,B]),this._implementations.sort((F,D)=>D[0]-F[0]),{dispose:()=>{for(let F=0;Fnew Promise((K,Y)=>{try{const ee=A(x.object.textEditorModel,w.Position.lift(R),F.slice(2));K(ee)}catch(ee){Y(ee)}}).finally(()=>{x.dispose()}))})}e.registerModelAndPositionCommand=h;function m(O,A){g.CommandsRegistry.registerCommand(O,function(B,...F){const[D]=F;a.assertType(N.URI.isUri(D));const R=B.get(S.IModelService).getModel(D);return R?A(R,...F.slice(1)):B.get(C.ITextModelService).createModelReference(D).then(W=>new Promise((x,K)=>{try{const Y=A(W.object.textEditorModel,F.slice(1));x(Y)}catch(Y){K(Y)}}).finally(()=>{W.dispose()}))})}e.registerModelCommand=m;function _(O){return E.INSTANCE.registerEditorCommand(O),O}e.registerEditorCommand=_;function f(O){const A=new O;return E.INSTANCE.registerEditorAction(A),A}e.registerEditorAction=f;function v(O){return E.INSTANCE.registerEditorAction(O),O}e.registerMultiEditorAction=v;function y(O){E.INSTANCE.registerEditorAction(O)}e.registerInstantiatedEditorAction=y;function L(O,A){E.INSTANCE.registerEditorContribution(O,A)}e.registerEditorContribution=L;var I;(function(O){function A(W){return E.INSTANCE.getEditorCommand(W)}O.getEditorCommand=A;function B(){return E.INSTANCE.getEditorActions()}O.getEditorActions=B;function F(){return E.INSTANCE.getEditorContributions()}O.getEditorContributions=F;function D(W){return E.INSTANCE.getEditorContributions().filter(x=>W.indexOf(x.id)>=0)}O.getSomeEditorContributions=D;function R(){return E.INSTANCE.getDiffEditorContributions()}O.getDiffEditorContributions=R})(I=e.EditorExtensionsRegistry||(e.EditorExtensionsRegistry={}));const k={EditorCommonContributions:"editor.contributions"};class E{constructor(){this.editorContributions=[],this.diffEditorContributions=[],this.editorActions=[],this.editorCommands=Object.create(null)}registerEditorContribution(A,B){this.editorContributions.push({id:A,ctor:B})}getEditorContributions(){return this.editorContributions.slice(0)}getDiffEditorContributions(){return this.diffEditorContributions.slice(0)}registerEditorAction(A){A.register(),this.editorActions.push(A)}getEditorActions(){return this.editorActions.slice(0)}registerEditorCommand(A){A.register(),this.editorCommands[A.id]=A}getEditorCommand(A){return this.editorCommands[A]||null}}E.INSTANCE=new E,o.Registry.add(k.EditorCommonContributions,E.INSTANCE);function T(O){return O.register(),O}e.UndoCommand=T(new r({id:"undo",precondition:void 0,kbOpts:{weight:0,primary:2048|56},menuOpts:[{menuId:d.MenuId.MenubarEditMenu,group:"1_do",title:b.localize(0,null),order:1},{menuId:d.MenuId.CommandPalette,group:"",title:b.localize(1,null),order:1}]})),T(new i(e.UndoCommand,{id:"default:undo",precondition:void 0})),e.RedoCommand=T(new r({id:"redo",precondition:void 0,kbOpts:{weight:0,primary:2048|55,secondary:[2048|1024|56],mac:{primary:2048|1024|56}},menuOpts:[{menuId:d.MenuId.MenubarEditMenu,group:"1_do",title:b.localize(2,null),order:2},{menuId:d.MenuId.CommandPalette,group:"",title:b.localize(3,null),order:1}]})),T(new i(e.RedoCommand,{id:"default:redo",precondition:void 0})),e.SelectAllCommand=T(new r({id:"editor.action.selectAll",precondition:void 0,kbOpts:{weight:0,kbExpr:null,primary:2048|31},menuOpts:[{menuId:d.MenuId.MenubarSelectionMenu,group:"1_basic",title:b.localize(4,null),order:1},{menuId:d.MenuId.CommandPalette,group:"",title:b.localize(5,null),order:1}]}))}),define(Q[188],J([0,1,444,35,20,13,28,536,42,181,241,182,14,3,25,16,86]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CoreEditingCommands=e.CoreNavigationCommands=e.RevealLine_=e.EditorScroll_=e.CoreEditorCommand=void 0;const i=0;class n extends w.EditorCommand{runEditorCommand(E,T,O){const A=T._getViewModel();!A||this.runCoreEditorCommand(A,O||{})}}e.CoreEditorCommand=n;var t;(function(k){const E=function(O){if(!M.isObject(O))return!1;const A=O;return!(!M.isString(A.to)||!M.isUndefined(A.by)&&!M.isString(A.by)||!M.isUndefined(A.value)&&!M.isNumber(A.value)||!M.isUndefined(A.revealCursor)&&!M.isBoolean(A.revealCursor))};k.description={description:"Scroll editor in the given direction",args:[{name:"Editor scroll argument object",description:"Property-value pairs that can be passed through this argument:\n * 'to': A mandatory direction value.\n ```\n 'up', 'down'\n ```\n * 'by': Unit to move. Default is computed based on 'to' value.\n ```\n 'line', 'wrappedLine', 'page', 'halfPage'\n ```\n * 'value': Number of units to move. Default is '1'.\n * 'revealCursor': If 'true' reveals the cursor if it is outside view port.\n ",constraint:E,schema:{type:"object",required:["to"],properties:{to:{type:"string",enum:["up","down"]},by:{type:"string",enum:["line","wrappedLine","page","halfPage"]},value:{type:"number",default:1},revealCursor:{type:"boolean"}}}}]},k.RawDirection={Up:"up",Down:"down"},k.RawUnit={Line:"line",WrappedLine:"wrappedLine",Page:"page",HalfPage:"halfPage"};function T(O){let A;switch(O.to){case k.RawDirection.Up:A=1;break;case k.RawDirection.Down:A=2;break;default:return null}let B;switch(O.by){case k.RawUnit.Line:B=1;break;case k.RawUnit.WrappedLine:B=2;break;case k.RawUnit.Page:B=3;break;case k.RawUnit.HalfPage:B=4;break;default:B=2}const F=Math.floor(O.value||1),D=!!O.revealCursor;return{direction:A,unit:B,value:F,revealCursor:D,select:!!O.select}}k.parse=T})(t=e.EditorScroll_||(e.EditorScroll_={}));var l;(function(k){const E=function(T){if(!M.isObject(T))return!1;const O=T;return!(!M.isNumber(O.lineNumber)&&!M.isString(O.lineNumber)||!M.isUndefined(O.at)&&!M.isString(O.at))};k.description={description:"Reveal the given line at the given logical position",args:[{name:"Reveal line argument object",description:"Property-value pairs that can be passed through this argument:\n * 'lineNumber': A mandatory line number value.\n * 'at': Logical position at which line has to be revealed.\n ```\n 'top', 'center', 'bottom'\n ```\n ",constraint:E,schema:{type:"object",required:["lineNumber"],properties:{lineNumber:{type:["number","string"]},at:{type:"string",enum:["top","center","bottom"]}}}}]},k.RawAtArgument={Top:"top",Center:"center",Bottom:"bottom"}})(l=e.RevealLine_||(e.RevealLine_={}));class h{constructor(E){E.addImplementation(1e4,(T,O)=>{const A=T.get(S.ICodeEditorService).getFocusedCodeEditor();return A&&A.hasTextFocus()?this._runEditorCommand(T,A,O):!1}),E.addImplementation(1e3,(T,O)=>{const A=document.activeElement;return A&&["input","textarea"].indexOf(A.tagName.toLowerCase())>=0?(this.runDOMCommand(),!0):!1}),E.addImplementation(0,(T,O)=>{const A=T.get(S.ICodeEditorService).getActiveCodeEditor();return A?(A.focus(),this._runEditorCommand(T,A,O)):!1})}_runEditorCommand(E,T,O){const A=this.runEditorCommand(E,T,O);return A||!0}}var m;(function(k){class E extends n{constructor(z){super(z);this._inSelectionMode=z.inSelectionMode}runCoreEditorCommand(z,P){z.model.pushStackElement(),z.setCursorStates(P.source,3,[p.CursorMoveCommands.moveTo(z,z.getPrimaryCursorState(),this._inSelectionMode,P.position,P.viewPosition)]),z.revealPrimaryCursor(P.source,!0)}}k.MoveTo=w.registerEditorCommand(new E({id:"_moveTo",inSelectionMode:!1,precondition:void 0})),k.MoveToSelect=w.registerEditorCommand(new E({id:"_moveToSelect",inSelectionMode:!0,precondition:void 0}));class T extends n{runCoreEditorCommand(z,P){z.model.pushStackElement();const V=this._getColumnSelectResult(z,z.getPrimaryCursorState(),z.getCursorColumnSelectData(),P);z.setCursorStates(P.source,3,V.viewStates.map(U=>d.CursorState.fromViewState(U))),z.setCursorColumnSelectData({isReal:!0,fromViewLineNumber:V.fromLineNumber,fromViewVisualColumn:V.fromVisualColumn,toViewLineNumber:V.toLineNumber,toViewVisualColumn:V.toVisualColumn}),V.reversed?z.revealTopMostCursor(P.source):z.revealBottomMostCursor(P.source)}}k.ColumnSelect=w.registerEditorCommand(new class extends T{constructor(){super({id:"columnSelect",precondition:void 0})}_getColumnSelectResult(X,z,P,V){const U=X.model.validatePosition(V.position),H=X.coordinatesConverter.validateViewPosition(new o.Position(V.viewPosition.lineNumber,V.viewPosition.column),U);let $=V.doColumnSelect?P.fromViewLineNumber:H.lineNumber,ie=V.doColumnSelect?P.fromViewVisualColumn:V.mouseColumn-1;return C.ColumnSelection.columnSelect(X.cursorConfig,X,$,ie,H.lineNumber,V.mouseColumn-1)}}),k.CursorColumnSelectLeft=w.registerEditorCommand(new class extends T{constructor(){super({id:"cursorColumnSelectLeft",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|15,linux:{primary:0}}})}_getColumnSelectResult(X,z,P,V){return C.ColumnSelection.columnSelectLeft(X.cursorConfig,X,P)}}),k.CursorColumnSelectRight=w.registerEditorCommand(new class extends T{constructor(){super({id:"cursorColumnSelectRight",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|17,linux:{primary:0}}})}_getColumnSelectResult(X,z,P,V){return C.ColumnSelection.columnSelectRight(X.cursorConfig,X,P)}});class O extends T{constructor(z){super(z);this._isPaged=z.isPaged}_getColumnSelectResult(z,P,V,U){return C.ColumnSelection.columnSelectUp(z.cursorConfig,z,V,this._isPaged)}}k.CursorColumnSelectUp=w.registerEditorCommand(new O({isPaged:!1,id:"cursorColumnSelectUp",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|16,linux:{primary:0}}})),k.CursorColumnSelectPageUp=w.registerEditorCommand(new O({isPaged:!0,id:"cursorColumnSelectPageUp",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|11,linux:{primary:0}}}));class A extends T{constructor(z){super(z);this._isPaged=z.isPaged}_getColumnSelectResult(z,P,V,U){return C.ColumnSelection.columnSelectDown(z.cursorConfig,z,V,this._isPaged)}}k.CursorColumnSelectDown=w.registerEditorCommand(new A({isPaged:!1,id:"cursorColumnSelectDown",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|18,linux:{primary:0}}})),k.CursorColumnSelectPageDown=w.registerEditorCommand(new A({isPaged:!0,id:"cursorColumnSelectPageDown",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|12,linux:{primary:0}}}));class B extends n{constructor(){super({id:"cursorMove",precondition:void 0,description:p.CursorMove.description})}runCoreEditorCommand(z,P){const V=p.CursorMove.parse(P);!V||this._runCursorMove(z,P.source,V)}_runCursorMove(z,P,V){z.model.pushStackElement(),z.setCursorStates(P,3,B._move(z,z.getCursorStates(),V)),z.revealPrimaryCursor(P,!0)}static _move(z,P,V){const U=V.select,H=V.value;switch(V.direction){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:return p.CursorMoveCommands.simpleMove(z,P,V.direction,U,H,V.unit);case 11:case 13:case 12:case 14:return p.CursorMoveCommands.viewportMove(z,P,V.direction,U,H);default:return null}}}k.CursorMoveImpl=B,k.CursorMove=w.registerEditorCommand(new B);class F extends n{constructor(z){super(z);this._staticArgs=z.args}runCoreEditorCommand(z,P){let V=this._staticArgs;this._staticArgs.value===-1&&(V={direction:this._staticArgs.direction,unit:this._staticArgs.unit,select:this._staticArgs.select,value:z.cursorConfig.pageSize}),z.model.pushStackElement(),z.setCursorStates(P.source,3,p.CursorMoveCommands.simpleMove(z,z.getCursorStates(),V.direction,V.select,V.value,V.unit)),z.revealPrimaryCursor(P.source,!0)}}k.CursorLeft=w.registerEditorCommand(new F({args:{direction:0,unit:0,select:!1,value:1},id:"cursorLeft",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:15,mac:{primary:15,secondary:[256|32]}}})),k.CursorLeftSelect=w.registerEditorCommand(new F({args:{direction:0,unit:0,select:!0,value:1},id:"cursorLeftSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|15}})),k.CursorRight=w.registerEditorCommand(new F({args:{direction:1,unit:0,select:!1,value:1},id:"cursorRight",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:17,mac:{primary:17,secondary:[256|36]}}})),k.CursorRightSelect=w.registerEditorCommand(new F({args:{direction:1,unit:0,select:!0,value:1},id:"cursorRightSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|17}})),k.CursorUp=w.registerEditorCommand(new F({args:{direction:2,unit:2,select:!1,value:1},id:"cursorUp",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:16,mac:{primary:16,secondary:[256|46]}}})),k.CursorUpSelect=w.registerEditorCommand(new F({args:{direction:2,unit:2,select:!0,value:1},id:"cursorUpSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|16,secondary:[2048|1024|16],mac:{primary:1024|16},linux:{primary:1024|16}}})),k.CursorPageUp=w.registerEditorCommand(new F({args:{direction:2,unit:2,select:!1,value:-1},id:"cursorPageUp",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:11}})),k.CursorPageUpSelect=w.registerEditorCommand(new F({args:{direction:2,unit:2,select:!0,value:-1},id:"cursorPageUpSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|11}})),k.CursorDown=w.registerEditorCommand(new F({args:{direction:3,unit:2,select:!1,value:1},id:"cursorDown",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:18,mac:{primary:18,secondary:[256|44]}}})),k.CursorDownSelect=w.registerEditorCommand(new F({args:{direction:3,unit:2,select:!0,value:1},id:"cursorDownSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|18,secondary:[2048|1024|18],mac:{primary:1024|18},linux:{primary:1024|18}}})),k.CursorPageDown=w.registerEditorCommand(new F({args:{direction:3,unit:2,select:!1,value:-1},id:"cursorPageDown",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:12}})),k.CursorPageDownSelect=w.registerEditorCommand(new F({args:{direction:3,unit:2,select:!0,value:-1},id:"cursorPageDownSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|12}})),k.CreateCursor=w.registerEditorCommand(new class extends n{constructor(){super({id:"createCursor",precondition:void 0})}runCoreEditorCommand(X,z){let P;z.wholeLine?P=p.CursorMoveCommands.line(X,X.getPrimaryCursorState(),!1,z.position,z.viewPosition):P=p.CursorMoveCommands.moveTo(X,X.getPrimaryCursorState(),!1,z.position,z.viewPosition);const V=X.getCursorStates();if(V.length>1){const U=P.modelState?P.modelState.position:null,H=P.viewState?P.viewState.position:null;for(let $=0,ie=V.length;$H&&(U=H);const $=new s.Range(U,1,U,X.model.getLineMaxColumn(U));let ie=0;if(P.at)switch(P.at){case l.RawAtArgument.Top:ie=3;break;case l.RawAtArgument.Center:ie=1;break;case l.RawAtArgument.Bottom:ie=4;break;default:break}const oe=X.coordinatesConverter.convertModelRangeToViewRange($);X.revealRange(z.source,!1,oe,ie,0)}}),k.SelectAll=new class extends h{constructor(){super(w.SelectAllCommand)}runDOMCommand(){N.isFirefox&&(document.activeElement.focus(),document.activeElement.select()),document.execCommand("selectAll")}runEditorCommand(X,z,P){const V=z._getViewModel();!V||this.runCoreEditorCommand(V,P)}runCoreEditorCommand(X,z){X.model.pushStackElement(),X.setCursorStates("keyboard",3,[p.CursorMoveCommands.selectAll(X,X.getPrimaryCursorState())])}},k.SetSelection=w.registerEditorCommand(new class extends n{constructor(){super({id:"setSelection",precondition:void 0})}runCoreEditorCommand(X,z){X.model.pushStackElement(),X.setCursorStates(z.source,3,[d.CursorState.fromModelSelection(z.selection)])}})})(m=e.CoreNavigationCommands||(e.CoreNavigationCommands={}));const _=u.ContextKeyExpr.and(a.EditorContextKeys.textInputFocus,a.EditorContextKeys.columnSelection);function f(k,E){r.KeybindingsRegistry.registerKeybindingRule({id:k,primary:E,when:_,weight:i+1})}f(m.CursorColumnSelectLeft.id,1024|15),f(m.CursorColumnSelectRight.id,1024|17),f(m.CursorColumnSelectUp.id,1024|16),f(m.CursorColumnSelectPageUp.id,1024|11),f(m.CursorColumnSelectDown.id,1024|18),f(m.CursorColumnSelectPageDown.id,1024|12);function v(k){return k.register(),k}var y;(function(k){class E extends w.EditorCommand{runEditorCommand(O,A,B){const F=A._getViewModel();!F||this.runCoreEditingCommand(A,F,B||{})}}k.CoreEditingCommand=E,k.LineBreakInsert=w.registerEditorCommand(new class extends E{constructor(){super({id:"lineBreakInsert",precondition:a.EditorContextKeys.writable,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|45}}})}runCoreEditingCommand(T,O,A){T.pushUndoStop(),T.executeCommands(this.id,c.TypeOperations.lineBreakInsert(O.cursorConfig,O.model,O.getCursorStates().map(B=>B.modelState.selection)))}}),k.Outdent=w.registerEditorCommand(new class extends E{constructor(){super({id:"outdent",precondition:a.EditorContextKeys.writable,kbOpts:{weight:i,kbExpr:u.ContextKeyExpr.and(a.EditorContextKeys.editorTextFocus,a.EditorContextKeys.tabDoesNotMoveFocus),primary:1024|2}})}runCoreEditingCommand(T,O,A){T.pushUndoStop(),T.executeCommands(this.id,c.TypeOperations.outdent(O.cursorConfig,O.model,O.getCursorStates().map(B=>B.modelState.selection))),T.pushUndoStop()}}),k.Tab=w.registerEditorCommand(new class extends E{constructor(){super({id:"tab",precondition:a.EditorContextKeys.writable,kbOpts:{weight:i,kbExpr:u.ContextKeyExpr.and(a.EditorContextKeys.editorTextFocus,a.EditorContextKeys.tabDoesNotMoveFocus),primary:2}})}runCoreEditingCommand(T,O,A){T.pushUndoStop(),T.executeCommands(this.id,c.TypeOperations.tab(O.cursorConfig,O.model,O.getCursorStates().map(B=>B.modelState.selection))),T.pushUndoStop()}}),k.DeleteLeft=w.registerEditorCommand(new class extends E{constructor(){super({id:"deleteLeft",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1,secondary:[1024|1],mac:{primary:1,secondary:[1024|1,256|38,256|1]}}})}runCoreEditingCommand(T,O,A){const[B,F]=g.DeleteOperations.deleteLeft(O.getPrevEditOperationType(),O.cursorConfig,O.model,O.getCursorStates().map(D=>D.modelState.selection));B&&T.pushUndoStop(),T.executeCommands(this.id,F),O.setPrevEditOperationType(2)}}),k.DeleteRight=w.registerEditorCommand(new class extends E{constructor(){super({id:"deleteRight",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:20,mac:{primary:20,secondary:[256|34,256|20]}}})}runCoreEditingCommand(T,O,A){const[B,F]=g.DeleteOperations.deleteRight(O.getPrevEditOperationType(),O.cursorConfig,O.model,O.getCursorStates().map(D=>D.modelState.selection));B&&T.pushUndoStop(),T.executeCommands(this.id,F),O.setPrevEditOperationType(3)}}),k.Undo=new class extends h{constructor(){super(w.UndoCommand)}runDOMCommand(){document.execCommand("undo")}runEditorCommand(T,O,A){if(!(!O.hasModel()||O.getOption(75)===!0))return O.getModel().undo()}},k.Redo=new class extends h{constructor(){super(w.RedoCommand)}runDOMCommand(){document.execCommand("redo")}runEditorCommand(T,O,A){if(!(!O.hasModel()||O.getOption(75)===!0))return O.getModel().redo()}}})(y=e.CoreEditingCommands||(e.CoreEditingCommands={}));class L extends w.Command{constructor(E,T,O){super({id:E,precondition:void 0,description:O});this._handlerId=T}runCommand(E,T){const O=E.get(S.ICodeEditorService).getFocusedCodeEditor();!O||O.trigger("keyboard",this._handlerId,T)}}function I(k,E){v(new L("default:"+k,k)),v(new L(k,k,E))}I("type",{description:"Type",args:[{name:"args",schema:{type:"object",required:["text"],properties:{text:{type:"string"}}}}]}),I("replacePreviousChar"),I("compositionType"),I("compositionStart"),I("compositionEnd"),I("paste"),I("cut")}),define(Q[607],J([0,1,13,16,23,71,9,74,446]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorKeybindingCancellationTokenSource=void 0;const g=S.createDecorator("IEditorCancelService"),p=new N.RawContextKey("cancellableOperation",!1,d.localize(0,null));C.registerSingleton(g,class{constructor(){this._tokens=new WeakMap}add(o,s){let a=this._tokens.get(o);a||(a=o.invokeWithinContext(r=>{const i=p.bindTo(r.get(N.IContextKeyService)),n=new w.LinkedList;return{key:i,tokens:n}}),this._tokens.set(o,a));let u;return a.key.set(!0),u=a.tokens.push(s),()=>{u&&(u(),a.key.set(!a.tokens.isEmpty()),u=void 0)}}cancel(o){const s=this._tokens.get(o);if(!!s){const a=s.tokens.pop();a&&(a.cancel(),s.key.set(!s.tokens.isEmpty()))}}},!0);class c extends M.CancellationTokenSource{constructor(s,a){super(a);this.editor=s,this._unregister=s.invokeWithinContext(u=>u.get(g).add(s,this))}dispose(){this._unregister(),super.dispose()}}e.EditorKeybindingCancellationTokenSource=c,b.registerEditorCommand(new class extends b.EditorCommand{constructor(){super({id:"editor.cancelOperation",kbOpts:{weight:100,primary:9},precondition:p})}runEditorCommand(o,s){o.get(g).cancel(s)}})}),define(Q[70],J([0,1,8,3,23,2,607]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StableEditorScrollState=e.TextModelCancellationTokenSource=e.EditorStateCancellationTokenSource=e.EditorState=void 0;class C{constructor(o,s){if(this.flags=s,(this.flags&1)!=0){const a=o.getModel();this.modelVersionId=a?b.format("{0}#{1}",a.uri.toString(),a.getVersionId()):null}else this.modelVersionId=null;(this.flags&4)!=0?this.position=o.getPosition():this.position=null,(this.flags&2)!=0?this.selection=o.getSelection():this.selection=null,(this.flags&8)!=0?(this.scrollLeft=o.getScrollLeft(),this.scrollTop=o.getScrollTop()):(this.scrollLeft=-1,this.scrollTop=-1)}_equals(o){if(!(o instanceof C))return!1;const s=o;return!(this.modelVersionId!==s.modelVersionId||this.scrollLeft!==s.scrollLeft||this.scrollTop!==s.scrollTop||!this.position&&s.position||this.position&&!s.position||this.position&&s.position&&!this.position.equals(s.position)||!this.selection&&s.selection||this.selection&&!s.selection||this.selection&&s.selection&&!this.selection.equalsRange(s.selection))}validate(o){return this._equals(new C(o,this.flags))}}e.EditorState=C;class d extends S.EditorKeybindingCancellationTokenSource{constructor(o,s,a,u){super(o,u);this.editor=o,this._listener=new w.DisposableStore,s&4&&this._listener.add(o.onDidChangeCursorPosition(r=>{(!a||!N.Range.containsPosition(a,r.position))&&this.cancel()})),s&2&&this._listener.add(o.onDidChangeCursorSelection(r=>{(!a||!N.Range.containsRange(a,r.selection))&&this.cancel()})),s&8&&this._listener.add(o.onDidScrollChange(r=>this.cancel())),s&1&&(this._listener.add(o.onDidChangeModel(r=>this.cancel())),this._listener.add(o.onDidChangeModelContent(r=>this.cancel())))}dispose(){this._listener.dispose(),super.dispose()}}e.EditorStateCancellationTokenSource=d;class g extends M.CancellationTokenSource{constructor(o,s){super(s);this._listener=o.onDidChangeContent(()=>this.cancel())}dispose(){this._listener.dispose(),super.dispose()}}e.TextModelCancellationTokenSource=g;class p{constructor(o,s,a){this._visiblePosition=o,this._visiblePositionScrollDelta=s,this._cursorPosition=a}static capture(o){let s=null,a=0;if(o.getScrollTop()!==0){const u=o.getVisibleRanges();if(u.length>0){s=u[0].getStartPosition();const r=o.getTopForPosition(s.lineNumber,s.column);a=o.getScrollTop()-r}}return new p(s,a,o.getPosition())}restore(o){if(this._visiblePosition){const s=o.getTopForPosition(this._visiblePosition.lineNumber,this._visiblePosition.column);o.setScrollTop(s+this._visiblePositionScrollDelta)}}restoreRelativeVerticalPositionOfCursor(o){const s=o.getPosition();if(!(!this._cursorPosition||!s)){const a=o.getTopForLineNumber(s.lineNumber)-o.getTopForLineNumber(this._cursorPosition.lineNumber);o.setScrollTop(o.getScrollTop()+a)}}}e.StableEditorScrollState=p}),define(Q[608],J([0,1,178,13]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerDecorationsContribution=void 0;let M=class{constructor(S,C){}dispose(){}};M.ID="editor.contrib.markerDecorations",M=Me([_e(1,b.IMarkerDecorationsService)],M),e.MarkerDecorationsContribution=M,N.registerEditorContribution(M.ID,M)}),define(Q[609],J([0,1,188,14,17]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewController=void 0;class w{constructor(C,d,g,p){this.configuration=C,this.viewModel=d,this.userInputEvents=g,this.commandDelegate=p}paste(C,d,g,p){this.commandDelegate.paste(C,d,g,p)}type(C){this.commandDelegate.type(C)}compositionType(C,d,g,p){this.commandDelegate.compositionType(C,d,g,p)}compositionStart(){this.commandDelegate.startComposition()}compositionEnd(){this.commandDelegate.endComposition()}cut(){this.commandDelegate.cut()}setSelection(C){b.CoreNavigationCommands.SetSelection.runCoreEditorCommand(this.viewModel,{source:"keyboard",selection:C})}_validateViewColumn(C){const d=this.viewModel.getLineMinColumn(C.lineNumber);return C.column=4?this._selectAll():C.mouseDownCount===3?this._hasMulticursorModifier(C)?C.inSelectionMode?this._lastCursorLineSelectDrag(C.position):this._lastCursorLineSelect(C.position):C.inSelectionMode?this._lineSelectDrag(C.position):this._lineSelect(C.position):C.mouseDownCount===2?this._hasMulticursorModifier(C)?this._lastCursorWordSelect(C.position):C.inSelectionMode?this._wordSelectDrag(C.position):this._wordSelect(C.position):this._hasMulticursorModifier(C)?this._hasNonMulticursorModifier(C)||(C.shiftKey?this._columnSelect(C.position,C.mouseColumn,!0):C.inSelectionMode?this._lastCursorMoveToSelect(C.position):this._createCursor(C.position,!1)):C.inSelectionMode?C.altKey?this._columnSelect(C.position,C.mouseColumn,!0):p?this._columnSelect(C.position,C.mouseColumn,!0):this._moveToSelect(C.position):this.moveTo(C.position)}_usualArgs(C){return C=this._validateViewColumn(C),{source:"mouse",position:this._convertViewToModelPosition(C),viewPosition:C}}moveTo(C){b.CoreNavigationCommands.MoveTo.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_moveToSelect(C){b.CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_columnSelect(C,d,g){C=this._validateViewColumn(C),b.CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(this.viewModel,{source:"mouse",position:this._convertViewToModelPosition(C),viewPosition:C,mouseColumn:d,doColumnSelect:g})}_createCursor(C,d){C=this._validateViewColumn(C),b.CoreNavigationCommands.CreateCursor.runCoreEditorCommand(this.viewModel,{source:"mouse",position:this._convertViewToModelPosition(C),viewPosition:C,wholeLine:d})}_lastCursorMoveToSelect(C){b.CoreNavigationCommands.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_wordSelect(C){b.CoreNavigationCommands.WordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_wordSelectDrag(C){b.CoreNavigationCommands.WordSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lastCursorWordSelect(C){b.CoreNavigationCommands.LastCursorWordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lineSelect(C){b.CoreNavigationCommands.LineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lineSelectDrag(C){b.CoreNavigationCommands.LineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lastCursorLineSelect(C){b.CoreNavigationCommands.LastCursorLineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lastCursorLineSelectDrag(C){b.CoreNavigationCommands.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_selectAll(){b.CoreNavigationCommands.SelectAll.runCoreEditorCommand(this.viewModel,{source:"mouse"})}_convertViewToModelPosition(C){return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(C)}emitKeyDown(C){this.userInputEvents.emitKeyDown(C)}emitKeyUp(C){this.userInputEvents.emitKeyUp(C)}emitContextMenu(C){this.userInputEvents.emitContextMenu(C)}emitMouseMove(C){this.userInputEvents.emitMouseMove(C)}emitMouseLeave(C){this.userInputEvents.emitMouseLeave(C)}emitMouseUp(C){this.userInputEvents.emitMouseUp(C)}emitMouseDown(C){this.userInputEvents.emitMouseDown(C)}emitMouseDrag(C){this.userInputEvents.emitMouseDrag(C)}emitMouseDrop(C){this.userInputEvents.emitMouseDrop(C)}emitMouseDropCanceled(){this.userInputEvents.emitMouseDropCanceled()}emitMouseWheel(C){this.userInputEvents.emitMouseWheel(C)}}e.ViewController=w}),define(Q[610],J([0,1,7,35,21,30,12,581,590,609,256,564,45,390,588,391,584,172,589,257,582,392,223,393,585,394,591,395,592,586,587,593,396,14,3,110,385,387,111,11,187]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B,F,D,R,W,x,K){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.View=void 0;class Y extends W.ViewEventHandler{constructor(ne,le,X,z,P,V){super();this._selections=[new M.Selection(1,1,1,1)],this._renderAnimationFrame=null;const U=new g.ViewController(le,z,P,ne);this._context=new D.ViewContext(le,X.getColorTheme(),z),this._configPixelRatio=this._configPixelRatio=this._context.configuration.options.get(122),this._context.addEventHandler(this),this._register(X.onDidColorThemeChange(te=>{this._context.theme.update(te),this._context.model.onDidColorThemeChange(),this.render(!0,!1)})),this._viewParts=[],this._textAreaHandler=new d.TextAreaHandler(this._context,U,this._createTextAreaHandlerHelper()),this._viewParts.push(this._textAreaHandler),this._linesContent=w.createFastDomNode(document.createElement("div")),this._linesContent.setClassName("lines-content monaco-editor-background"),this._linesContent.setPosition("absolute"),this.domNode=w.createFastDomNode(document.createElement("div")),this.domNode.setClassName(this._getEditorClassName()),this.domNode.setAttribute("role","code"),this._overflowGuardContainer=w.createFastDomNode(document.createElement("div")),o.PartFingerprints.write(this._overflowGuardContainer,3),this._overflowGuardContainer.setClassName("overflow-guard"),this._scrollbar=new r.EditorScrollbar(this._context,this._linesContent,this.domNode,this._overflowGuardContainer),this._viewParts.push(this._scrollbar),this._viewLines=new l.ViewLines(this._context,this._linesContent),this._viewZones=new O.ViewZones(this._context),this._viewParts.push(this._viewZones);const H=new y.DecorationsOverviewRuler(this._context);this._viewParts.push(H);const $=new k.ScrollDecorationViewPart(this._context);this._viewParts.push($);const ie=new c.ContentViewOverlays(this._context);this._viewParts.push(ie),ie.addDynamicOverlay(new a.CurrentLineHighlightOverlay(this._context)),ie.addDynamicOverlay(new E.SelectionsOverlay(this._context)),ie.addDynamicOverlay(new n.IndentGuidesOverlay(this._context)),ie.addDynamicOverlay(new u.DecorationsOverlay(this._context));const oe=new c.MarginViewOverlays(this._context);this._viewParts.push(oe),oe.addDynamicOverlay(new a.CurrentLineMarginHighlightOverlay(this._context)),oe.addDynamicOverlay(new i.GlyphMarginOverlay(this._context)),oe.addDynamicOverlay(new _.MarginViewLineDecorationsOverlay(this._context)),oe.addDynamicOverlay(new h.LinesDecorationsOverlay(this._context)),oe.addDynamicOverlay(new t.LineNumbersOverlay(this._context));const ae=new m.Margin(this._context);ae.getDomNode().appendChild(this._viewZones.marginDomNode),ae.getDomNode().appendChild(oe.getDomNode()),this._viewParts.push(ae),this._contentWidgets=new s.ViewContentWidgets(this._context,this.domNode),this._viewParts.push(this._contentWidgets),this._viewCursors=new T.ViewCursors(this._context),this._viewParts.push(this._viewCursors),this._overlayWidgets=new v.ViewOverlayWidgets(this._context),this._viewParts.push(this._overlayWidgets);const G=new I.Rulers(this._context);this._viewParts.push(G);const j=new f.Minimap(this._context);if(this._viewParts.push(j),H){const te=this._scrollbar.getOverviewRulerLayoutInfo();te.parent.insertBefore(H.getDomNode(),te.insertBefore)}this._linesContent.appendChild(ie.getDomNode()),this._linesContent.appendChild(G.domNode),this._linesContent.appendChild(this._viewZones.domNode),this._linesContent.appendChild(this._viewLines.getDomNode()),this._linesContent.appendChild(this._contentWidgets.domNode),this._linesContent.appendChild(this._viewCursors.getDomNode()),this._overflowGuardContainer.appendChild(ae.getDomNode()),this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode()),this._overflowGuardContainer.appendChild($.getDomNode()),this._overflowGuardContainer.appendChild(this._textAreaHandler.textArea),this._overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover),this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode()),this._overflowGuardContainer.appendChild(j.getDomNode()),this.domNode.appendChild(this._overflowGuardContainer),V?V.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode):this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode),this._applyLayout(),this._pointerHandler=this._register(new C.PointerHandler(this._context,U,this._createPointerHandlerHelper()))}_flushAccumulatedAndRenderNow(){this._renderNow()}_createPointerHandlerHelper(){return{viewDomNode:this.domNode.domNode,linesContentDomNode:this._linesContent.domNode,focusTextArea:()=>{this.focus()},dispatchTextAreaEvent:ne=>{this._textAreaHandler.textArea.domNode.dispatchEvent(ne)},getLastRenderData:()=>{const ne=this._viewCursors.getLastRenderData()||[],le=this._textAreaHandler.getLastRenderData();return new K.PointerHandlerLastRenderData(ne,le)},shouldSuppressMouseDownOnViewZone:ne=>this._viewZones.shouldSuppressMouseDownOnViewZone(ne),shouldSuppressMouseDownOnWidget:ne=>this._contentWidgets.shouldSuppressMouseDownOnWidget(ne),getPositionFromDOMInfo:(ne,le)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getPositionFromDOMInfo(ne,le)),visibleRangeForPosition:(ne,le)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(new A.Position(ne,le))),getLineWidth:ne=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getLineWidth(ne))}}_createTextAreaHandlerHelper(){return{visibleRangeForPositionRelativeToEditor:(ne,le)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(new A.Position(ne,le)))}}_applyLayout(){const le=this._context.configuration.options.get(124);this.domNode.setWidth(le.width),this.domNode.setHeight(le.height),this._overflowGuardContainer.setWidth(le.width),this._overflowGuardContainer.setHeight(le.height),this._linesContent.setWidth(1e6),this._linesContent.setHeight(1e6)}_getEditorClassName(){const ne=this._textAreaHandler.isFocused()?" focused":"";return this._context.configuration.options.get(121)+" "+x.getThemeTypeSelector(this._context.theme.type)+ne}handleEvents(ne){super.handleEvents(ne),this._scheduleRender()}onConfigurationChanged(ne){return this._configPixelRatio=this._context.configuration.options.get(122),this.domNode.setClassName(this._getEditorClassName()),this._applyLayout(),!1}onCursorStateChanged(ne){return this._selections=ne.selections,!1}onFocusChanged(ne){return this.domNode.setClassName(this._getEditorClassName()),!1}onThemeChanged(ne){return this.domNode.setClassName(this._getEditorClassName()),!1}dispose(){this._renderAnimationFrame!==null&&(this._renderAnimationFrame.dispose(),this._renderAnimationFrame=null),this._contentWidgets.overflowingContentWidgetsDomNode.domNode.remove(),this._context.removeEventHandler(this),this._viewLines.dispose();for(const ne of this._viewParts)ne.dispose();super.dispose()}_scheduleRender(){this._renderAnimationFrame===null&&(this._renderAnimationFrame=b.runAtThisOrScheduleAtNextAnimationFrame(this._onRenderScheduled.bind(this),100))}_onRenderScheduled(){this._renderAnimationFrame=null,this._flushAccumulatedAndRenderNow()}_renderNow(){ee(()=>this._actualRender())}_getViewPartsToRender(){let ne=[],le=0;for(const X of this._viewParts)X.shouldRender()&&(ne[le++]=X);return ne}_actualRender(){if(!!b.isInDOM(this.domNode.domNode)){let ne=this._getViewPartsToRender();if(!(!this._viewLines.shouldRender()&&ne.length===0)){const le=this._context.viewLayout.getLinesViewportData();this._context.model.setViewport(le.startLineNumber,le.endLineNumber,le.centeredLineNumber);const X=new R.ViewportData(this._selections,le,this._context.viewLayout.getWhitespaceViewportData(),this._context.model);this._contentWidgets.shouldRender()&&this._contentWidgets.onBeforeRender(X),this._viewLines.shouldRender()&&(this._viewLines.renderText(X),this._viewLines.onDidRender(),ne=this._getViewPartsToRender());const z=new F.RenderingContext(this._context.viewLayout,X,this._viewLines);for(const P of ne)P.prepareRender(z);for(const P of ne)P.render(z),P.onDidRender();Math.abs(N.getPixelRatio()-this._configPixelRatio)>.001&&this._context.configuration.updatePixelRatio()}}}delegateVerticalScrollbarMouseDown(ne){this._scrollbar.delegateVerticalScrollbarMouseDown(ne)}restoreState(ne){this._context.model.setScrollPosition({scrollTop:ne.scrollTop},1),this._context.model.tokenizeViewport(),this._renderNow(),this._viewLines.updateLineWidths(),this._context.model.setScrollPosition({scrollLeft:ne.scrollLeft},1)}getOffsetForColumn(ne,le){const X=this._context.model.validateModelPosition({lineNumber:ne,column:le}),z=this._context.model.coordinatesConverter.convertModelPositionToViewPosition(X);this._flushAccumulatedAndRenderNow();const P=this._viewLines.visibleRangeForPosition(new A.Position(z.lineNumber,z.column));return P?P.left:-1}getTargetAtClientPoint(ne,le){const X=this._pointerHandler.getTargetAtClientPoint(ne,le);return X?p.ViewUserInputEvents.convertViewToModelMouseTarget(X,this._context.model.coordinatesConverter):null}createOverviewRuler(ne){return new L.OverviewRuler(this._context,ne)}change(ne){this._viewZones.changeViewZones(ne),this._scheduleRender()}render(ne,le){if(le){this._viewLines.forceShouldRender();for(const X of this._viewParts)X.forceShouldRender()}ne?this._flushAccumulatedAndRenderNow():this._scheduleRender()}focus(){this._textAreaHandler.focusTextArea()}isFocused(){return this._textAreaHandler.isFocused()}setAriaOptions(ne){this._textAreaHandler.setAriaOptions(ne)}addContentWidget(ne){this._contentWidgets.addWidget(ne.widget),this.layoutContentWidget(ne),this._scheduleRender()}layoutContentWidget(ne){let le=ne.position&&ne.position.range||null;if(le===null){const z=ne.position?ne.position.position:null;z!==null&&(le=new B.Range(z.lineNumber,z.column,z.lineNumber,z.column))}const X=ne.position?ne.position.preference:null;this._contentWidgets.setWidgetPosition(ne.widget,le,X),this._scheduleRender()}removeContentWidget(ne){this._contentWidgets.removeWidget(ne.widget),this._scheduleRender()}addOverlayWidget(ne){this._overlayWidgets.addWidget(ne.widget),this.layoutOverlayWidget(ne),this._scheduleRender()}layoutOverlayWidget(ne){const le=ne.position?ne.position.preference:null;this._overlayWidgets.setWidgetPosition(ne.widget,le)&&this._scheduleRender()}removeOverlayWidget(ne){this._overlayWidgets.removeWidget(ne.widget),this._scheduleRender()}}e.View=Y;function ee(se){try{return se()}catch(ne){S.onUnexpectedError(ne)}}}),define(Q[143],J([0,1,448,7,12,6,2,43,69,13,28,610,256,38,242,42,14,3,21,217,107,25,18,49,22,540,26,16,9,138,32,11,65,20,397,563,136,608,334]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B,F,D){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorModeContext=e.BooleanEventEmitter=e.CodeEditorWidget=void 0;let R=0;class W{constructor(H,$,ie,oe,ae){this.model=H,this.viewModel=$,this.view=ie,this.hasRealView=oe,this.listenersToRemove=ae}dispose(){S.dispose(this.listenersToRemove),this.model.onBeforeDetached(),this.hasRealView&&this.view.dispose(),this.viewModel.dispose()}}let x=class ct extends S.Disposable{constructor(H,$,ie,oe,ae,G,j,te,Z,ue){super();this._onDidDispose=this._register(new w.Emitter),this.onDidDispose=this._onDidDispose.event,this._onDidChangeModelContent=this._register(new w.Emitter),this.onDidChangeModelContent=this._onDidChangeModelContent.event,this._onDidChangeModelLanguage=this._register(new w.Emitter),this.onDidChangeModelLanguage=this._onDidChangeModelLanguage.event,this._onDidChangeModelLanguageConfiguration=this._register(new w.Emitter),this.onDidChangeModelLanguageConfiguration=this._onDidChangeModelLanguageConfiguration.event,this._onDidChangeModelOptions=this._register(new w.Emitter),this.onDidChangeModelOptions=this._onDidChangeModelOptions.event,this._onDidChangeModelDecorations=this._register(new w.Emitter),this.onDidChangeModelDecorations=this._onDidChangeModelDecorations.event,this._onDidChangeConfiguration=this._register(new w.Emitter),this.onDidChangeConfiguration=this._onDidChangeConfiguration.event,this._onDidChangeModel=this._register(new w.Emitter),this.onDidChangeModel=this._onDidChangeModel.event,this._onDidChangeCursorPosition=this._register(new w.Emitter),this.onDidChangeCursorPosition=this._onDidChangeCursorPosition.event,this._onDidChangeCursorSelection=this._register(new w.Emitter),this.onDidChangeCursorSelection=this._onDidChangeCursorSelection.event,this._onDidAttemptReadOnlyEdit=this._register(new w.Emitter),this.onDidAttemptReadOnlyEdit=this._onDidAttemptReadOnlyEdit.event,this._onDidLayoutChange=this._register(new w.Emitter),this.onDidLayoutChange=this._onDidLayoutChange.event,this._editorTextFocus=this._register(new K),this.onDidFocusEditorText=this._editorTextFocus.onDidChangeToTrue,this.onDidBlurEditorText=this._editorTextFocus.onDidChangeToFalse,this._editorWidgetFocus=this._register(new K),this.onDidFocusEditorWidget=this._editorWidgetFocus.onDidChangeToTrue,this.onDidBlurEditorWidget=this._editorWidgetFocus.onDidChangeToFalse,this._onWillType=this._register(new w.Emitter),this.onWillType=this._onWillType.event,this._onDidType=this._register(new w.Emitter),this.onDidType=this._onDidType.event,this._onDidCompositionStart=this._register(new w.Emitter),this.onDidCompositionStart=this._onDidCompositionStart.event,this._onDidCompositionEnd=this._register(new w.Emitter),this.onDidCompositionEnd=this._onDidCompositionEnd.event,this._onDidPaste=this._register(new w.Emitter),this.onDidPaste=this._onDidPaste.event,this._onMouseUp=this._register(new w.Emitter),this.onMouseUp=this._onMouseUp.event,this._onMouseDown=this._register(new w.Emitter),this.onMouseDown=this._onMouseDown.event,this._onMouseDrag=this._register(new w.Emitter),this.onMouseDrag=this._onMouseDrag.event,this._onMouseDrop=this._register(new w.Emitter),this.onMouseDrop=this._onMouseDrop.event,this._onMouseDropCanceled=this._register(new w.Emitter),this.onMouseDropCanceled=this._onMouseDropCanceled.event,this._onContextMenu=this._register(new w.Emitter),this.onContextMenu=this._onContextMenu.event,this._onMouseMove=this._register(new w.Emitter),this.onMouseMove=this._onMouseMove.event,this._onMouseLeave=this._register(new w.Emitter),this.onMouseLeave=this._onMouseLeave.event,this._onMouseWheel=this._register(new w.Emitter),this.onMouseWheel=this._onMouseWheel.event,this._onKeyUp=this._register(new w.Emitter),this.onKeyUp=this._onKeyUp.event,this._onKeyDown=this._register(new w.Emitter),this.onKeyDown=this._onKeyDown.event,this._onDidContentSizeChange=this._register(new w.Emitter),this.onDidContentSizeChange=this._onDidContentSizeChange.event,this._onDidScrollChange=this._register(new w.Emitter),this.onDidScrollChange=this._onDidScrollChange.event,this._onDidChangeViewZones=this._register(new w.Emitter),this.onDidChangeViewZones=this._onDidChangeViewZones.event;const he=Object.assign({},$);this._domElement=H,this._overflowWidgetsDomNode=he.overflowWidgetsDomNode,delete he.overflowWidgetsDomNode,this._id=++R,this._decorationTypeKeysToIds={},this._decorationTypeSubtypes={},this.isSimpleWidget=ie.isSimpleWidget||!1,this._telemetryData=ie.telemetryData,this._configuration=this._register(this._createConfiguration(he,ue)),this._register(this._configuration.onDidChange(ce=>{this._onDidChangeConfiguration.fire(ce);const me=this._configuration.options;if(ce.hasChanged(124)){const Ce=me.get(124);this._onDidLayoutChange.fire(Ce)}})),this._contextKeyService=this._register(j.createScoped(this._domElement)),this._notificationService=Z,this._codeEditorService=ae,this._commandService=G,this._themeService=te,this._register(new Y(this,this._contextKeyService)),this._register(new ee(this,this._contextKeyService)),this._instantiationService=oe.createChild(new k.ServiceCollection([L.IContextKeyService,this._contextKeyService])),this._modelData=null,this._contributions={},this._actions={},this._focusTracker=new se(H),this._focusTracker.onChange(()=>{this._editorWidgetFocus.setValue(this._focusTracker.hasFocus())}),this._contentWidgets={},this._overlayWidgets={};let re;Array.isArray(ie.contributions)?re=ie.contributions:re=g.EditorExtensionsRegistry.getEditorContributions();for(const ce of re)try{const me=this._instantiationService.createInstance(ce.ctor,this);this._contributions[ce.id]=me}catch(me){M.onUnexpectedError(me)}g.EditorExtensionsRegistry.getEditorActions().forEach(ce=>{const me=new t.InternalEditorAction(ce.id,ce.label,ce.alias,A.withNullAsUndefined(ce.precondition),()=>this._instantiationService.invokeFunction(Ce=>Promise.resolve(ce.runEditorCommand(Ce,this,null))),this._contextKeyService);this._actions[me.id]=me}),this._codeEditorService.addCodeEditor(this)}_createConfiguration(H,$){return new d.Configuration(this.isSimpleWidget,H,this._domElement,$)}getId(){return this.getEditorType()+":"+this._id}getEditorType(){return l.EditorType.ICodeEditor}dispose(){this._codeEditorService.removeCodeEditor(this),this._focusTracker.dispose();const H=Object.keys(this._contributions);for(let $=0,ie=H.length;$i.Range.lift($)))}getVisibleColumnFromPosition(H){if(!this._modelData)return H.column;const $=this._modelData.model.validatePosition(H),ie=this._modelData.model.getOptions().tabSize;return u.CursorColumns.visibleColumnFromColumn(this._modelData.model.getLineContent($.lineNumber),$.column,ie)+1}getPosition(){return this._modelData?this._modelData.viewModel.getPosition():null}setPosition(H){if(!!this._modelData){if(!r.Position.isIPosition(H))throw new Error("Invalid arguments");this._modelData.viewModel.setSelections("api",[{selectionStartLineNumber:H.lineNumber,selectionStartColumn:H.column,positionLineNumber:H.lineNumber,positionColumn:H.column}])}}_sendRevealRange(H,$,ie,oe){if(!!this._modelData){if(!i.Range.isIRange(H))throw new Error("Invalid arguments");const ae=this._modelData.model.validateRange(H),G=this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(ae);this._modelData.viewModel.revealRange("api",ie,G,$,oe)}}revealLine(H,$=0){this._revealLine(H,0,$)}revealLineInCenter(H,$=0){this._revealLine(H,1,$)}revealLineInCenterIfOutsideViewport(H,$=0){this._revealLine(H,2,$)}revealLineNearTop(H,$=0){this._revealLine(H,5,$)}_revealLine(H,$,ie){if(typeof H!="number")throw new Error("Invalid arguments");this._sendRevealRange(new i.Range(H,1,H,1),$,!1,ie)}revealPosition(H,$=0){this._revealPosition(H,0,!0,$)}revealPositionInCenter(H,$=0){this._revealPosition(H,1,!0,$)}revealPositionInCenterIfOutsideViewport(H,$=0){this._revealPosition(H,2,!0,$)}revealPositionNearTop(H,$=0){this._revealPosition(H,5,!0,$)}_revealPosition(H,$,ie,oe){if(!r.Position.isIPosition(H))throw new Error("Invalid arguments");this._sendRevealRange(new i.Range(H.lineNumber,H.column,H.lineNumber,H.column),$,ie,oe)}getSelection(){return this._modelData?this._modelData.viewModel.getSelection():null}getSelections(){return this._modelData?this._modelData.viewModel.getSelections():null}setSelection(H){const $=n.Selection.isISelection(H),ie=i.Range.isIRange(H);if(!$&&!ie)throw new Error("Invalid arguments");if($)this._setSelectionImpl(H);else if(ie){const oe={selectionStartLineNumber:H.startLineNumber,selectionStartColumn:H.startColumn,positionLineNumber:H.endLineNumber,positionColumn:H.endColumn};this._setSelectionImpl(oe)}}_setSelectionImpl(H){if(!!this._modelData){const $=new n.Selection(H.selectionStartLineNumber,H.selectionStartColumn,H.positionLineNumber,H.positionColumn);this._modelData.viewModel.setSelections("api",[$])}}revealLines(H,$,ie=0){this._revealLines(H,$,0,ie)}revealLinesInCenter(H,$,ie=0){this._revealLines(H,$,1,ie)}revealLinesInCenterIfOutsideViewport(H,$,ie=0){this._revealLines(H,$,2,ie)}revealLinesNearTop(H,$,ie=0){this._revealLines(H,$,5,ie)}_revealLines(H,$,ie,oe){if(typeof H!="number"||typeof $!="number")throw new Error("Invalid arguments");this._sendRevealRange(new i.Range(H,1,$,1),ie,!1,oe)}revealRange(H,$=0,ie=!1,oe=!0){this._revealRange(H,ie?1:0,oe,$)}revealRangeInCenter(H,$=0){this._revealRange(H,1,!0,$)}revealRangeInCenterIfOutsideViewport(H,$=0){this._revealRange(H,2,!0,$)}revealRangeNearTop(H,$=0){this._revealRange(H,5,!0,$)}revealRangeNearTopIfOutsideViewport(H,$=0){this._revealRange(H,6,!0,$)}revealRangeAtTop(H,$=0){this._revealRange(H,3,!0,$)}_revealRange(H,$,ie,oe){if(!i.Range.isIRange(H))throw new Error("Invalid arguments");this._sendRevealRange(i.Range.lift(H),$,ie,oe)}setSelections(H,$="api",ie=0){if(!!this._modelData){if(!H||H.length===0)throw new Error("Invalid arguments");for(let oe=0,ae=H.length;oe$.isSupported()),H}getAction(H){return this._actions[H]||null}trigger(H,$,ie){switch(ie=ie||{},$){case"compositionStart":this._startComposition();return;case"compositionEnd":this._endComposition(H);return;case"type":{const ae=ie;this._type(H,ae.text||"");return}case"replacePreviousChar":{const ae=ie;this._compositionType(H,ae.text||"",ae.replaceCharCnt||0,0,0);return}case"compositionType":{const ae=ie;this._compositionType(H,ae.text||"",ae.replacePrevCharCnt||0,ae.replaceNextCharCnt||0,ae.positionDelta||0);return}case"paste":{const ae=ie;this._paste(H,ae.text||"",ae.pasteOnNewLine||!1,ae.multicursorText||null,ae.mode||null);return}case"cut":this._cut(H);return}const oe=this.getAction($);if(oe){Promise.resolve(oe.run()).then(void 0,M.onUnexpectedError);return}!this._modelData||this._triggerEditorCommand(H,$,ie)||this._commandService.executeCommand($,ie)}_startComposition(){!this._modelData||(this._modelData.viewModel.startComposition(),this._onDidCompositionStart.fire())}_endComposition(H){!this._modelData||(this._modelData.viewModel.endComposition(H),this._onDidCompositionEnd.fire())}_type(H,$){!this._modelData||$.length===0||(H==="keyboard"&&this._onWillType.fire($),this._modelData.viewModel.type($,H),H==="keyboard"&&this._onDidType.fire($))}_compositionType(H,$,ie,oe,ae){!this._modelData||this._modelData.viewModel.compositionType($,ie,oe,ae,H)}_paste(H,$,ie,oe,ae){if(!(!this._modelData||$.length===0)){const G=this._modelData.viewModel.getSelection().getStartPosition();this._modelData.viewModel.paste($,ie,oe,H);const j=this._modelData.viewModel.getSelection().getStartPosition();H==="keyboard"&&this._onDidPaste.fire({range:new i.Range(G.lineNumber,G.column,j.lineNumber,j.column),mode:ae})}}_cut(H){!this._modelData||this._modelData.viewModel.cut(H)}_triggerEditorCommand(H,$,ie){const oe=g.EditorExtensionsRegistry.getEditorCommand($);return oe?(ie=ie||{},ie.source=H,this._instantiationService.invokeFunction(ae=>{Promise.resolve(oe.runEditorCommand(ae,this,ie)).then(void 0,M.onUnexpectedError)}),!0):!1}_getViewModel(){return this._modelData?this._modelData.viewModel:null}pushUndoStop(){return!this._modelData||this._configuration.options.get(75)?!1:(this._modelData.model.pushStackElement(),!0)}popUndoStop(){return!this._modelData||this._configuration.options.get(75)?!1:(this._modelData.model.popStackElement(),!0)}executeEdits(H,$,ie){if(!this._modelData||this._configuration.options.get(75))return!1;let oe;return ie?Array.isArray(ie)?oe=()=>ie:oe=ie:oe=()=>null,this._modelData.viewModel.executeEdits(H,$,oe),!0}executeCommand(H,$){!this._modelData||this._modelData.viewModel.executeCommand($,H)}executeCommands(H,$){!this._modelData||this._modelData.viewModel.executeCommands($,H)}changeDecorations(H){return this._modelData?this._modelData.model.changeDecorations(H,this._id):null}getLineDecorations(H){return this._modelData?this._modelData.model.getLineDecorations(H,this._id,s.filterValidationDecorations(this._configuration.options)):null}deltaDecorations(H,$){return this._modelData?H.length===0&&$.length===0?H:this._modelData.model.deltaDecorations(H,$,this._id):[]}removeDecorations(H){const $=this._decorationTypeKeysToIds[H];$&&this.deltaDecorations($,[]),this._decorationTypeKeysToIds.hasOwnProperty(H)&&delete this._decorationTypeKeysToIds[H],this._decorationTypeSubtypes.hasOwnProperty(H)&&delete this._decorationTypeSubtypes[H]}getLayoutInfo(){return this._configuration.options.get(124)}createOverviewRuler(H){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.createOverviewRuler(H)}getContainerDomNode(){return this._domElement}getDomNode(){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.domNode.domNode}delegateVerticalScrollbarMouseDown(H){!this._modelData||!this._modelData.hasRealView||this._modelData.view.delegateVerticalScrollbarMouseDown(H)}layout(H){this._configuration.observeReferenceElement(H),this.render()}focus(){!this._modelData||!this._modelData.hasRealView||this._modelData.view.focus()}hasTextFocus(){return!this._modelData||!this._modelData.hasRealView?!1:this._modelData.view.isFocused()}hasWidgetFocus(){return this._focusTracker&&this._focusTracker.hasFocus()}addContentWidget(H){const $={widget:H,position:H.getPosition()};this._contentWidgets.hasOwnProperty(H.getId())&&console.warn("Overwriting a content widget with the same id."),this._contentWidgets[H.getId()]=$,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addContentWidget($)}layoutContentWidget(H){const $=H.getId();if(this._contentWidgets.hasOwnProperty($)){const ie=this._contentWidgets[$];ie.position=H.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutContentWidget(ie)}}removeContentWidget(H){const $=H.getId();if(this._contentWidgets.hasOwnProperty($)){const ie=this._contentWidgets[$];delete this._contentWidgets[$],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeContentWidget(ie)}}addOverlayWidget(H){const $={widget:H,position:H.getPosition()};this._overlayWidgets.hasOwnProperty(H.getId())&&console.warn("Overwriting an overlay widget with the same id."),this._overlayWidgets[H.getId()]=$,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addOverlayWidget($)}layoutOverlayWidget(H){const $=H.getId();if(this._overlayWidgets.hasOwnProperty($)){const ie=this._overlayWidgets[$];ie.position=H.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutOverlayWidget(ie)}}removeOverlayWidget(H){const $=H.getId();if(this._overlayWidgets.hasOwnProperty($)){const ie=this._overlayWidgets[$];delete this._overlayWidgets[$],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeOverlayWidget(ie)}}changeViewZones(H){!this._modelData||!this._modelData.hasRealView||this._modelData.view.change(H)}getTargetAtClientPoint(H,$){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.getTargetAtClientPoint(H,$)}getScrolledVisiblePosition(H){if(!this._modelData||!this._modelData.hasRealView)return null;const $=this._modelData.model.validatePosition(H),ie=this._configuration.options,oe=ie.get(124),ae=ct._getVerticalOffsetForPosition(this._modelData,$.lineNumber,$.column)-this.getScrollTop(),G=this._modelData.view.getOffsetForColumn($.lineNumber,$.column)+oe.glyphMarginWidth+oe.lineNumbersWidth+oe.decorationsWidth-this.getScrollLeft();return{top:ae,left:G,height:ie.get(53)}}getOffsetForColumn(H,$){return!this._modelData||!this._modelData.hasRealView?-1:this._modelData.view.getOffsetForColumn(H,$)}render(H=!1){!this._modelData||!this._modelData.hasRealView||this._modelData.view.render(!0,H)}setAriaOptions(H){!this._modelData||!this._modelData.hasRealView||this._modelData.view.setAriaOptions(H)}applyFontInfo(H){d.Configuration.applyFontInfoSlow(H,this._configuration.options.get(38))}_attachModel(H){if(!H){this._modelData=null;return}const $=[];this._domElement.setAttribute("data-mode-id",H.getLanguageIdentifier().language),this._configuration.setIsDominatedByLongLines(H.isDominatedByLongLines()),this._configuration.setMaxLineNumber(H.getLineCount()),H.onBeforeAttached();const ie=new v.ViewModel(this._id,this._configuration,H,F.DOMLineBreaksComputerFactory.create(),B.MonospaceLineBreaksComputerFactory.create(this._configuration.options),G=>N.scheduleAtNextAnimationFrame(G));$.push(H.onDidChangeDecorations(G=>this._onDidChangeModelDecorations.fire(G))),$.push(H.onDidChangeLanguage(G=>{this._domElement.setAttribute("data-mode-id",H.getLanguageIdentifier().language),this._onDidChangeModelLanguage.fire(G)})),$.push(H.onDidChangeLanguageConfiguration(G=>this._onDidChangeModelLanguageConfiguration.fire(G))),$.push(H.onDidChangeContent(G=>this._onDidChangeModelContent.fire(G))),$.push(H.onDidChangeOptions(G=>this._onDidChangeModelOptions.fire(G))),$.push(H.onWillDispose(()=>this.setModel(null))),$.push(ie.onEvent(G=>{switch(G.kind){case 0:this._onDidContentSizeChange.fire(G);break;case 1:this._editorTextFocus.setValue(G.hasFocus);break;case 2:this._onDidScrollChange.fire(G);break;case 3:this._onDidChangeViewZones.fire();break;case 4:this._onDidAttemptReadOnlyEdit.fire();break;case 5:{G.reachedMaxCursorCount&&this._notificationService.warn(b.localize(0,null,a.Cursor.MAX_CURSOR_COUNT));const j=[];for(let ue=0,he=G.selections.length;ue{this._paste("keyboard",ae,G,j,te)},type:ae=>{this._type("keyboard",ae)},compositionType:(ae,G,j,te)=>{this._compositionType("keyboard",ae,G,j,te)},startComposition:()=>{this._startComposition()},endComposition:()=>{this._endComposition("keyboard")},cut:()=>{this._cut("keyboard")}}:$={paste:(ae,G,j,te)=>{const Z={text:ae,pasteOnNewLine:G,multicursorText:j,mode:te};this._commandService.executeCommand("paste",Z)},type:ae=>{const G={text:ae};this._commandService.executeCommand("type",G)},compositionType:(ae,G,j,te)=>{if(j||te){const Z={text:ae,replacePrevCharCnt:G,replaceNextCharCnt:j,positionDelta:te};this._commandService.executeCommand("compositionType",Z)}else{const Z={text:ae,replaceCharCnt:G};this._commandService.executeCommand("replacePreviousChar",Z)}},startComposition:()=>{this._commandService.executeCommand("compositionStart",{})},endComposition:()=>{this._commandService.executeCommand("compositionEnd",{})},cut:()=>{this._commandService.executeCommand("cut",{})}};const ie=new o.ViewUserInputEvents(H.coordinatesConverter);return ie.onKeyDown=ae=>this._onKeyDown.fire(ae),ie.onKeyUp=ae=>this._onKeyUp.fire(ae),ie.onContextMenu=ae=>this._onContextMenu.fire(ae),ie.onMouseMove=ae=>this._onMouseMove.fire(ae),ie.onMouseLeave=ae=>this._onMouseLeave.fire(ae),ie.onMouseDown=ae=>this._onMouseDown.fire(ae),ie.onMouseUp=ae=>this._onMouseUp.fire(ae),ie.onMouseDrag=ae=>this._onMouseDrag.fire(ae),ie.onMouseDrop=ae=>this._onMouseDrop.fire(ae),ie.onMouseDropCanceled=ae=>this._onMouseDropCanceled.fire(ae),ie.onMouseWheel=ae=>this._onMouseWheel.fire(ae),[new c.View($,this._configuration,this._themeService,H,ie,this._overflowWidgetsDomNode),!0]}_postDetachModelCleanup(H){H&&H.removeAllDecorationsWithOwnerId(this._id)}_detachModel(){if(!this._modelData)return null;const H=this._modelData.model,$=this._modelData.hasRealView?this._modelData.view.domNode.domNode:null;return this._modelData.dispose(),this._modelData=null,this._domElement.removeAttribute("data-mode-id"),$&&this._domElement.contains($)&&this._domElement.removeChild($),H}_removeDecorationType(H){this._codeEditorService.removeDecorationType(H)}hasModel(){return this._modelData!==null}};x=Me([_e(3,I.IInstantiationService),_e(4,p.ICodeEditorService),_e(5,y.ICommandService),_e(6,L.IContextKeyService),_e(7,T.IThemeService),_e(8,E.INotificationService),_e(9,O.IAccessibilityService)],x),e.CodeEditorWidget=x;class K extends S.Disposable{constructor(){super();this._onDidChangeToTrue=this._register(new w.Emitter),this.onDidChangeToTrue=this._onDidChangeToTrue.event,this._onDidChangeToFalse=this._register(new w.Emitter),this.onDidChangeToFalse=this._onDidChangeToFalse.event,this._value=0}setValue(H){const $=H?2:1;this._value!==$&&(this._value=$,this._value===2?this._onDidChangeToTrue.fire():this._value===1&&this._onDidChangeToFalse.fire())}}e.BooleanEventEmitter=K;class Y extends S.Disposable{constructor(H,$){super();this._editor=H,$.createKey("editorId",H.getId()),this._editorSimpleInput=h.EditorContextKeys.editorSimpleInput.bindTo($),this._editorFocus=h.EditorContextKeys.focus.bindTo($),this._textInputFocus=h.EditorContextKeys.textInputFocus.bindTo($),this._editorTextFocus=h.EditorContextKeys.editorTextFocus.bindTo($),this._editorTabMovesFocus=h.EditorContextKeys.tabMovesFocus.bindTo($),this._editorReadonly=h.EditorContextKeys.readOnly.bindTo($),this._inDiffEditor=h.EditorContextKeys.inDiffEditor.bindTo($),this._editorColumnSelection=h.EditorContextKeys.columnSelection.bindTo($),this._hasMultipleSelections=h.EditorContextKeys.hasMultipleSelections.bindTo($),this._hasNonEmptySelection=h.EditorContextKeys.hasNonEmptySelection.bindTo($),this._canUndo=h.EditorContextKeys.canUndo.bindTo($),this._canRedo=h.EditorContextKeys.canRedo.bindTo($),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromConfig())),this._register(this._editor.onDidChangeCursorSelection(()=>this._updateFromSelection())),this._register(this._editor.onDidFocusEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidFocusEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidChangeModel(()=>this._updateFromModel())),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromModel())),this._updateFromConfig(),this._updateFromSelection(),this._updateFromFocus(),this._updateFromModel(),this._editorSimpleInput.set(this._editor.isSimpleWidget)}_updateFromConfig(){const H=this._editor.getOptions();this._editorTabMovesFocus.set(H.get(123)),this._editorReadonly.set(H.get(75)),this._inDiffEditor.set(H.get(49)),this._editorColumnSelection.set(H.get(15))}_updateFromSelection(){const H=this._editor.getSelections();H?(this._hasMultipleSelections.set(H.length>1),this._hasNonEmptySelection.set(H.some($=>!$.isEmpty()))):(this._hasMultipleSelections.reset(),this._hasNonEmptySelection.reset())}_updateFromFocus(){this._editorFocus.set(this._editor.hasWidgetFocus()&&!this._editor.isSimpleWidget),this._editorTextFocus.set(this._editor.hasTextFocus()&&!this._editor.isSimpleWidget),this._textInputFocus.set(this._editor.hasTextFocus())}_updateFromModel(){const H=this._editor.getModel();this._canUndo.set(Boolean(H&&H.canUndo())),this._canRedo.set(Boolean(H&&H.canRedo()))}}class ee extends S.Disposable{constructor(H,$){super();this._editor=H,this._contextKeyService=$,this._langId=h.EditorContextKeys.languageId.bindTo($),this._hasCompletionItemProvider=h.EditorContextKeys.hasCompletionItemProvider.bindTo($),this._hasCodeActionsProvider=h.EditorContextKeys.hasCodeActionsProvider.bindTo($),this._hasCodeLensProvider=h.EditorContextKeys.hasCodeLensProvider.bindTo($),this._hasDefinitionProvider=h.EditorContextKeys.hasDefinitionProvider.bindTo($),this._hasDeclarationProvider=h.EditorContextKeys.hasDeclarationProvider.bindTo($),this._hasImplementationProvider=h.EditorContextKeys.hasImplementationProvider.bindTo($),this._hasTypeDefinitionProvider=h.EditorContextKeys.hasTypeDefinitionProvider.bindTo($),this._hasHoverProvider=h.EditorContextKeys.hasHoverProvider.bindTo($),this._hasDocumentHighlightProvider=h.EditorContextKeys.hasDocumentHighlightProvider.bindTo($),this._hasDocumentSymbolProvider=h.EditorContextKeys.hasDocumentSymbolProvider.bindTo($),this._hasReferenceProvider=h.EditorContextKeys.hasReferenceProvider.bindTo($),this._hasRenameProvider=h.EditorContextKeys.hasRenameProvider.bindTo($),this._hasSignatureHelpProvider=h.EditorContextKeys.hasSignatureHelpProvider.bindTo($),this._hasInlineHintsProvider=h.EditorContextKeys.hasInlineHintsProvider.bindTo($),this._hasDocumentFormattingProvider=h.EditorContextKeys.hasDocumentFormattingProvider.bindTo($),this._hasDocumentSelectionFormattingProvider=h.EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo($),this._hasMultipleDocumentFormattingProvider=h.EditorContextKeys.hasMultipleDocumentFormattingProvider.bindTo($),this._hasMultipleDocumentSelectionFormattingProvider=h.EditorContextKeys.hasMultipleDocumentSelectionFormattingProvider.bindTo($),this._isInWalkThrough=h.EditorContextKeys.isInWalkThroughSnippet.bindTo($);const ie=()=>this._update();this._register(H.onDidChangeModel(ie)),this._register(H.onDidChangeModelLanguage(ie)),this._register(m.CompletionProviderRegistry.onDidChange(ie)),this._register(m.CodeActionProviderRegistry.onDidChange(ie)),this._register(m.CodeLensProviderRegistry.onDidChange(ie)),this._register(m.DefinitionProviderRegistry.onDidChange(ie)),this._register(m.DeclarationProviderRegistry.onDidChange(ie)),this._register(m.ImplementationProviderRegistry.onDidChange(ie)),this._register(m.TypeDefinitionProviderRegistry.onDidChange(ie)),this._register(m.HoverProviderRegistry.onDidChange(ie)),this._register(m.DocumentHighlightProviderRegistry.onDidChange(ie)),this._register(m.DocumentSymbolProviderRegistry.onDidChange(ie)),this._register(m.ReferenceProviderRegistry.onDidChange(ie)),this._register(m.RenameProviderRegistry.onDidChange(ie)),this._register(m.DocumentFormattingEditProviderRegistry.onDidChange(ie)),this._register(m.DocumentRangeFormattingEditProviderRegistry.onDidChange(ie)),this._register(m.SignatureHelpProviderRegistry.onDidChange(ie)),this._register(m.InlineHintsProviderRegistry.onDidChange(ie)),ie()}dispose(){super.dispose()}reset(){this._contextKeyService.bufferChangeEvents(()=>{this._langId.reset(),this._hasCompletionItemProvider.reset(),this._hasCodeActionsProvider.reset(),this._hasCodeLensProvider.reset(),this._hasDefinitionProvider.reset(),this._hasDeclarationProvider.reset(),this._hasImplementationProvider.reset(),this._hasTypeDefinitionProvider.reset(),this._hasHoverProvider.reset(),this._hasDocumentHighlightProvider.reset(),this._hasDocumentSymbolProvider.reset(),this._hasReferenceProvider.reset(),this._hasRenameProvider.reset(),this._hasDocumentFormattingProvider.reset(),this._hasDocumentSelectionFormattingProvider.reset(),this._hasSignatureHelpProvider.reset(),this._isInWalkThrough.reset()})}_update(){const H=this._editor.getModel();if(!H){this.reset();return}this._contextKeyService.bufferChangeEvents(()=>{this._langId.set(H.getLanguageIdentifier().language),this._hasCompletionItemProvider.set(m.CompletionProviderRegistry.has(H)),this._hasCodeActionsProvider.set(m.CodeActionProviderRegistry.has(H)),this._hasCodeLensProvider.set(m.CodeLensProviderRegistry.has(H)),this._hasDefinitionProvider.set(m.DefinitionProviderRegistry.has(H)),this._hasDeclarationProvider.set(m.DeclarationProviderRegistry.has(H)),this._hasImplementationProvider.set(m.ImplementationProviderRegistry.has(H)),this._hasTypeDefinitionProvider.set(m.TypeDefinitionProviderRegistry.has(H)),this._hasHoverProvider.set(m.HoverProviderRegistry.has(H)),this._hasDocumentHighlightProvider.set(m.DocumentHighlightProviderRegistry.has(H)),this._hasDocumentSymbolProvider.set(m.DocumentSymbolProviderRegistry.has(H)),this._hasReferenceProvider.set(m.ReferenceProviderRegistry.has(H)),this._hasRenameProvider.set(m.RenameProviderRegistry.has(H)),this._hasSignatureHelpProvider.set(m.SignatureHelpProviderRegistry.has(H)),this._hasInlineHintsProvider.set(m.InlineHintsProviderRegistry.has(H)),this._hasDocumentFormattingProvider.set(m.DocumentFormattingEditProviderRegistry.has(H)||m.DocumentRangeFormattingEditProviderRegistry.has(H)),this._hasDocumentSelectionFormattingProvider.set(m.DocumentRangeFormattingEditProviderRegistry.has(H)),this._hasMultipleDocumentFormattingProvider.set(m.DocumentFormattingEditProviderRegistry.all(H).length+m.DocumentRangeFormattingEditProviderRegistry.all(H).length>1),this._hasMultipleDocumentSelectionFormattingProvider.set(m.DocumentRangeFormattingEditProviderRegistry.all(H).length>1),this._isInWalkThrough.set(H.uri.scheme===C.Schemas.walkThroughSnippet)})}}e.EditorModeContext=ee;class se extends S.Disposable{constructor(H){super();this._onChange=this._register(new w.Emitter),this.onChange=this._onChange.event,this._hasFocus=!1,this._domFocusTracker=this._register(N.trackFocus(H)),this._register(this._domFocusTracker.onDidFocus(()=>{this._hasFocus=!0,this._onChange.fire(void 0)})),this._register(this._domFocusTracker.onDidBlur(()=>{this._hasFocus=!1,this._onChange.fire(void 0)}))}hasFocus(){return this._hasFocus}}const ne=encodeURIComponent("");function X(U){return ne+encodeURIComponent(U.toString())+le}const z=encodeURIComponent('');function V(U){return z+encodeURIComponent(U.toString())+P}T.registerThemingParticipant((U,H)=>{const $=U.getColor(f.editorErrorBorder);$&&H.addRule(`.monaco-editor .squiggly-error { border-bottom: 4px double ${$}; }`);const ie=U.getColor(f.editorErrorForeground);ie&&H.addRule(`.monaco-editor .squiggly-error { background: url("data:image/svg+xml,${X(ie)}") repeat-x bottom left; }`);const oe=U.getColor(f.editorErrorBackground);oe&&H.addRule(`.monaco-editor .squiggly-error::before { display: block; content: ''; width: 100%; height: 100%; background: ${oe}; }`);const ae=U.getColor(f.editorWarningBorder);ae&&H.addRule(`.monaco-editor .squiggly-warning { border-bottom: 4px double ${ae}; }`);const G=U.getColor(f.editorWarningForeground);G&&H.addRule(`.monaco-editor .squiggly-warning { background: url("data:image/svg+xml,${X(G)}") repeat-x bottom left; }`);const j=U.getColor(f.editorWarningBackground);j&&H.addRule(`.monaco-editor .squiggly-warning::before { display: block; content: ''; width: 100%; height: 100%; background: ${j}; }`);const te=U.getColor(f.editorInfoBorder);te&&H.addRule(`.monaco-editor .squiggly-info { border-bottom: 4px double ${te}; }`);const Z=U.getColor(f.editorInfoForeground);Z&&H.addRule(`.monaco-editor .squiggly-info { background: url("data:image/svg+xml,${X(Z)}") repeat-x bottom left; }`);const ue=U.getColor(f.editorInfoBackground);ue&&H.addRule(`.monaco-editor .squiggly-info::before { display: block; content: ''; width: 100%; height: 100%; background: ${ue}; }`);const he=U.getColor(f.editorHintBorder);he&&H.addRule(`.monaco-editor .squiggly-hint { border-bottom: 2px dotted ${he}; }`);const re=U.getColor(f.editorHintForeground);re&&H.addRule(`.monaco-editor .squiggly-hint { background: url("data:image/svg+xml,${V(re)}") no-repeat bottom left; }`);const ce=U.getColor(_.editorUnnecessaryCodeOpacity);ce&&H.addRule(`.monaco-editor.showUnused .squiggly-inline-unnecessary { opacity: ${ce.rgba.a}; }`);const me=U.getColor(_.editorUnnecessaryCodeBorder);me&&H.addRule(`.monaco-editor.showUnused .squiggly-unnecessary { border-bottom: 2px dashed ${me}; }`);const Ce=U.getColor(f.editorForeground)||"inherit";H.addRule(`.monaco-editor.showDeprecated .squiggly-inline-deprecated { text-decoration: line-through; text-decoration-color: ${Ce}}`)})}),define(Q[144],J([0,1,40,28,143,26,16,9,32,11,65]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EmbeddedCodeEditorWidget=void 0;let c=class extends M.CodeEditorWidget{constructor(s,a,u,r,i,n,t,l,h,m){super(s,Object.assign(Object.assign({},u.getRawOptions()),{overflowWidgetsDomNode:u.getOverflowWidgetsDomNode()}),{},r,i,n,t,l,h,m);this._parentEditor=u,this._overwriteOptions=a,super.updateOptions(this._overwriteOptions),this._register(u.onDidChangeConfiguration(_=>this._onParentConfigurationChanged(_)))}getParentEditor(){return this._parentEditor}_onParentConfigurationChanged(s){super.updateOptions(this._parentEditor.getRawOptions()),super.updateOptions(this._overwriteOptions)}updateOptions(s){b.mixin(this._overwriteOptions,s,!0),super.updateOptions(this._overwriteOptions)}};c=Me([_e(3,C.IInstantiationService),_e(4,N.ICodeEditorService),_e(5,w.ICommandService),_e(6,S.IContextKeyService),_e(7,g.IThemeService),_e(8,d.INotificationService),_e(9,p.IAccessibilityService)],c),e.EmbeddedCodeEditorWidget=c}),define(Q[611],J([0,1,13,461,25,21,39,16,73,47,335]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionAnchorSet=void 0,e.SelectionAnchorSet=new C.RawContextKey("selectionAnchorSet",!1);let p=class Ft{constructor(r,i){this.editor=r,this.selectionAnchorSetContextKey=e.SelectionAnchorSet.bindTo(i),this.modelChangeListener=r.onDidChangeModel(()=>this.selectionAnchorSetContextKey.reset())}static get(r){return r.getContribution(Ft.ID)}setSelectionAnchor(){if(this.editor.hasModel()){const r=this.editor.getPosition(),i=this.decorationId?[this.decorationId]:[],n=this.editor.deltaDecorations(i,[{range:w.Selection.fromPositions(r,r),options:{stickiness:1,hoverMessage:new d.MarkdownString().appendText(N.localize(0,null)),className:"selection-anchor"}}]);this.decorationId=n[0],this.selectionAnchorSetContextKey.set(!!this.decorationId),g.alert(N.localize(1,null,r.lineNumber,r.column))}}goToSelectionAnchor(){if(this.editor.hasModel()&&this.decorationId){const r=this.editor.getModel().getDecorationRange(this.decorationId);r&&this.editor.setPosition(r.getStartPosition())}}selectFromAnchorToCursor(){if(this.editor.hasModel()&&this.decorationId){const r=this.editor.getModel().getDecorationRange(this.decorationId);if(r){const i=this.editor.getPosition();this.editor.setSelection(w.Selection.fromPositions(r.getStartPosition(),i)),this.cancelSelectionAnchor()}}}cancelSelectionAnchor(){this.decorationId&&(this.editor.deltaDecorations([this.decorationId],[]),this.decorationId=void 0,this.selectionAnchorSetContextKey.set(!1))}dispose(){this.cancelSelectionAnchor(),this.modelChangeListener.dispose()}};p.ID="editor.contrib.selectionAnchorController",p=Me([_e(1,C.IContextKeyService)],p);class c extends b.EditorAction{constructor(){super({id:"editor.action.setSelectionAnchor",label:N.localize(2,null),alias:"Set Selection Anchor",precondition:void 0,kbOpts:{kbExpr:M.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|32),weight:100}})}run(r,i){return Ie(this,void 0,void 0,function*(){p.get(i).setSelectionAnchor()})}}class o extends b.EditorAction{constructor(){super({id:"editor.action.goToSelectionAnchor",label:N.localize(3,null),alias:"Go to Selection Anchor",precondition:e.SelectionAnchorSet})}run(r,i){return Ie(this,void 0,void 0,function*(){p.get(i).goToSelectionAnchor()})}}class s extends b.EditorAction{constructor(){super({id:"editor.action.selectFromAnchorToCursor",label:N.localize(4,null),alias:"Select from Anchor to Cursor",precondition:e.SelectionAnchorSet,kbOpts:{kbExpr:M.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|41),weight:100}})}run(r,i){return Ie(this,void 0,void 0,function*(){p.get(i).selectFromAnchorToCursor()})}}class a extends b.EditorAction{constructor(){super({id:"editor.action.cancelSelectionAnchor",label:N.localize(5,null),alias:"Cancel Selection Anchor",precondition:e.SelectionAnchorSet,kbOpts:{kbExpr:M.EditorContextKeys.editorTextFocus,primary:9,weight:100}})}run(r,i){return Ie(this,void 0,void 0,function*(){p.get(i).cancelSelectionAnchor()})}}b.registerEditorContribution(p.ID,p),b.registerEditorAction(c),b.registerEditorAction(o),b.registerEditorAction(s),b.registerEditorAction(a)}),define(Q[612],J([0,1,462,15,2,13,14,3,21,25,53,31,49,22,11,34,336]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketMatchingController=void 0;const r=s.registerColor("editorOverviewRuler.bracketMatchForeground",{dark:"#A0A0A0",light:"#A0A0A0",hc:"#A0A0A0"},b.localize(0,null));class i extends w.EditorAction{constructor(){super({id:"editor.action.jumpToBracket",label:b.localize(1,null),alias:"Go to Bracket",precondition:void 0,kbOpts:{kbExpr:g.EditorContextKeys.editorTextFocus,primary:2048|1024|88,weight:100}})}run(m,_){let f=l.get(_);!f||f.jumpToBracket()}}class n extends w.EditorAction{constructor(){super({id:"editor.action.selectToBracket",label:b.localize(2,null),alias:"Select to Bracket",precondition:void 0,description:{description:"Select to Bracket",args:[{name:"args",schema:{type:"object",properties:{selectBrackets:{type:"boolean",default:!0}}}}]}})}run(m,_,f){const v=l.get(_);if(!!v){let y=!0;f&&f.selectBrackets===!1&&(y=!1),v.selectToBracket(y)}}}class t{constructor(m,_,f){this.position=m,this.brackets=_,this.options=f}}class l extends M.Disposable{constructor(m){super();this._editor=m,this._lastBracketsData=[],this._lastVersionId=0,this._decorations=[],this._updateBracketsSoon=this._register(new N.RunOnceScheduler(()=>this._updateBrackets(),50)),this._matchBrackets=this._editor.getOption(58),this._updateBracketsSoon.schedule(),this._register(m.onDidChangeCursorPosition(_=>{this._matchBrackets!=="never"&&this._updateBracketsSoon.schedule()})),this._register(m.onDidChangeModelContent(_=>{this._updateBracketsSoon.schedule()})),this._register(m.onDidChangeModel(_=>{this._lastBracketsData=[],this._decorations=[],this._updateBracketsSoon.schedule()})),this._register(m.onDidChangeModelLanguageConfiguration(_=>{this._lastBracketsData=[],this._updateBracketsSoon.schedule()})),this._register(m.onDidChangeConfiguration(_=>{_.hasChanged(58)&&(this._matchBrackets=this._editor.getOption(58),this._decorations=this._editor.deltaDecorations(this._decorations,[]),this._lastBracketsData=[],this._lastVersionId=0,this._updateBracketsSoon.schedule())}))}static get(m){return m.getContribution(l.ID)}jumpToBracket(){if(!!this._editor.hasModel()){const m=this._editor.getModel(),_=this._editor.getSelections().map(f=>{const v=f.getStartPosition(),y=m.matchBracket(v);let L=null;if(y)y[0].containsPosition(v)?L=y[1].getStartPosition():y[1].containsPosition(v)&&(L=y[0].getStartPosition());else{const I=m.findEnclosingBrackets(v);if(I)L=I[0].getStartPosition();else{const k=m.findNextBracket(v);k&&k.range&&(L=k.range.getStartPosition())}}return L?new d.Selection(L.lineNumber,L.column,L.lineNumber,L.column):new d.Selection(v.lineNumber,v.column,v.lineNumber,v.column)});this._editor.setSelections(_),this._editor.revealRange(_[0])}}selectToBracket(m){if(!!this._editor.hasModel()){const _=this._editor.getModel(),f=[];this._editor.getSelections().forEach(v=>{const y=v.getStartPosition();let L=_.matchBracket(y);if(!L&&(L=_.findEnclosingBrackets(y),!L)){const E=_.findNextBracket(y);E&&E.range&&(L=_.matchBracket(E.range.getStartPosition()))}let I=null,k=null;if(L){L.sort(C.Range.compareRangesUsingStarts);const[E,T]=L;I=m?E.getStartPosition():E.getEndPosition(),k=m?T.getEndPosition():T.getStartPosition()}I&&k&&f.push(new d.Selection(I.lineNumber,I.column,k.lineNumber,k.column))}),f.length>0&&(this._editor.setSelections(f),this._editor.revealRange(f[0]))}}_updateBrackets(){if(this._matchBrackets!=="never"){this._recomputeBrackets();let m=[],_=0;for(const f of this._lastBracketsData){let v=f.brackets;v&&(m[_++]={range:v[0],options:f.options},m[_++]={range:v[1],options:f.options})}this._decorations=this._editor.deltaDecorations(this._decorations,m)}}_recomputeBrackets(){if(!this._editor.hasModel()){this._lastBracketsData=[],this._lastVersionId=0;return}const m=this._editor.getSelections();if(m.length>100){this._lastBracketsData=[],this._lastVersionId=0;return}const _=this._editor.getModel(),f=_.getVersionId();let v=[];this._lastVersionId===f&&(v=this._lastBracketsData);let y=[],L=0;for(let O=0,A=m.length;O1&&y.sort(S.Position.compare);let I=[],k=0,E=0,T=v.length;for(let O=0,A=y.length;O{const _=h.getColor(o.editorBracketMatchBackground);_&&m.addRule(`.monaco-editor .bracket-match { background-color: ${_}; }`);const f=h.getColor(o.editorBracketMatchBorder);f&&m.addRule(`.monaco-editor .bracket-match { border: 1px solid ${f}; }`)}),u.MenuRegistry.appendMenuItem(u.MenuId.MenubarGoMenu,{group:"5_infile_nav",command:{id:"editor.action.jumpToBracket",title:b.localize(3,null)},order:2})}),define(Q[613],J([0,1,463,13,25,399]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class S extends N.EditorAction{constructor(p,c){super(c);this.left=p}run(p,c){if(!!c.hasModel()){let o=[],s=c.getSelections();for(const a of s)o.push(new w.MoveCaretCommand(a,this.left));c.pushUndoStop(),c.executeCommands(this.id,o),c.pushUndoStop()}}}class C extends S{constructor(){super(!0,{id:"editor.action.moveCarretLeftAction",label:b.localize(0,null),alias:"Move Selected Text Left",precondition:M.EditorContextKeys.writable})}}class d extends S{constructor(){super(!1,{id:"editor.action.moveCarretRightAction",label:b.localize(1,null),alias:"Move Selected Text Right",precondition:M.EditorContextKeys.writable})}}N.registerEditorAction(C),N.registerEditorAction(d)}),define(Q[614],J([0,1,464,13,92,3,25,180]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class d extends N.EditorAction{constructor(){super({id:"editor.action.transposeLetters",label:b.localize(0,null),alias:"Transpose Letters",precondition:S.EditorContextKeys.writable,kbOpts:{kbExpr:S.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|50},weight:100}})}run(p,c){if(!!c.hasModel()){let o=c.getModel(),s=[],a=c.getSelections();for(let u of a)if(!!u.isEmpty()){let r=u.startLineNumber,i=u.startColumn,n=o.getLineMaxColumn(r);if(!(r===1&&(i===1||i===2&&n===2))){let t=i===n?u.getPosition():C.MoveOperations.rightPosition(o,u.getPosition().lineNumber,u.getPosition().column),l=C.MoveOperations.leftPosition(o,t.lineNumber,t.column),h=C.MoveOperations.leftPosition(o,l.lineNumber,l.column),m=o.getValueInRange(w.Range.fromPositions(h,l)),_=o.getValueInRange(w.Range.fromPositions(l,t)),f=w.Range.fromPositions(h,t);s.push(new M.ReplaceCommand(f,_+m))}}s.length>0&&(c.pushUndoStop(),c.executeCommands(this.id,s),c.pushUndoStop())}}}N.registerEditorAction(d)}),define(Q[615],J([0,1,465,35,17,164,13,28,25,34,84]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PasteAction=e.CopyAction=e.CutAction=void 0;const c="9_cutcopypaste",o=M.isNative||document.queryCommandSupported("cut"),s=M.isNative||document.queryCommandSupported("copy"),a=typeof navigator.clipboard=="undefined"||N.isFirefox?document.queryCommandSupported("paste"):!0;function u(n){return n.register(),n}e.CutAction=o?u(new S.MultiCommand({id:"editor.action.clipboardCutAction",precondition:void 0,kbOpts:M.isNative?{primary:2048|54,win:{primary:2048|54,secondary:[1024|20]},weight:100}:void 0,menuOpts:[{menuId:g.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(0,null),order:1},{menuId:g.MenuId.EditorContext,group:c,title:b.localize(1,null),when:d.EditorContextKeys.writable,order:1},{menuId:g.MenuId.CommandPalette,group:"",title:b.localize(2,null),order:1}]})):void 0,e.CopyAction=s?u(new S.MultiCommand({id:"editor.action.clipboardCopyAction",precondition:void 0,kbOpts:M.isNative?{primary:2048|33,win:{primary:2048|33,secondary:[2048|19]},weight:100}:void 0,menuOpts:[{menuId:g.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(3,null),order:2},{menuId:g.MenuId.EditorContext,group:c,title:b.localize(4,null),order:2},{menuId:g.MenuId.CommandPalette,group:"",title:b.localize(5,null),order:1}]})):void 0,e.PasteAction=a?u(new S.MultiCommand({id:"editor.action.clipboardPasteAction",precondition:void 0,kbOpts:M.isNative?{primary:2048|52,win:{primary:2048|52,secondary:[1024|19]},linux:{primary:2048|52,secondary:[1024|19]},weight:100}:void 0,menuOpts:[{menuId:g.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(6,null),order:3},{menuId:g.MenuId.EditorContext,group:c,title:b.localize(7,null),when:d.EditorContextKeys.writable,order:3},{menuId:g.MenuId.CommandPalette,group:"",title:b.localize(8,null),order:1}]})):void 0;class r extends S.EditorAction{constructor(){super({id:"editor.action.clipboardCopyWithSyntaxHighlightingAction",label:b.localize(9,null),alias:"Copy With Syntax Highlighting",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.textInputFocus,primary:0,weight:100}})}run(t,l){!l.hasModel()||!l.getOption(28)&&l.getSelection().isEmpty()||(w.CopyOptions.forceCopyWithSyntaxHighlighting=!0,l.focus(),document.execCommand("copy"),w.CopyOptions.forceCopyWithSyntaxHighlighting=!1)}}function i(n,t){!n||(n.addImplementation(1e4,(l,h)=>{const m=l.get(C.ICodeEditorService).getFocusedCodeEditor();if(m&&m.hasTextFocus()){const _=m.getOption(28),f=m.getSelection();return f&&f.isEmpty()&&!_||document.execCommand(t),!0}return!1}),n.addImplementation(0,(l,h)=>(document.execCommand(t),!0)))}i(e.CutAction,"cut"),i(e.CopyAction,"copy"),e.PasteAction&&(e.PasteAction.addImplementation(1e4,(n,t)=>{const l=n.get(C.ICodeEditorService),h=n.get(p.IClipboardService),m=l.getFocusedCodeEditor();return m&&m.hasTextFocus()?(!document.execCommand("paste")&&M.isWeb&&(()=>Ie(void 0,void 0,void 0,function*(){const f=yield h.readText();if(f!==""){const v=w.InMemoryClipboardMetadataManager.INSTANCE.get(f);let y=!1,L=null,I=null;v&&(y=m.getOption(28)&&!!v.isFromEmptySelection,L=typeof v.multicursorText!="undefined"?v.multicursorText:null,I=v.mode),m.trigger("keyboard","paste",{text:f,pasteOnNewLine:y,multicursorText:L,mode:I})}}))(),!0):!1}),e.PasteAction.addImplementation(0,(n,t)=>(document.execCommand("paste"),!0))),s&&S.registerEditorAction(r)}),define(Q[145],J([0,1,19,23,12,2,24,70,3,21,18,36,130,59,26]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCodeActions=e.CodeActionItem=e.fixAllCommandId=e.organizeImportsCommandId=e.sourceActionCommandId=e.refactorCommandId=e.codeActionCommandId=void 0,e.codeActionCommandId="editor.action.codeAction",e.refactorCommandId="editor.action.refactor",e.sourceActionCommandId="editor.action.sourceAction",e.organizeImportsCommandId="editor.action.organizeImports",e.fixAllCommandId="editor.action.fixAll";class u{constructor(m,_){this.action=m,this.provider=_}resolve(m){var _;return Ie(this,void 0,void 0,function*(){if(((_=this.provider)===null||_===void 0?void 0:_.resolveCodeAction)&&!this.action.edit){let f;try{f=yield this.provider.resolveCodeAction(this.action,m)}catch(v){M.onUnexpectedExternalError(v)}f&&(this.action.edit=f.edit)}return this})}}e.CodeActionItem=u;class r extends w.Disposable{constructor(m,_,f){super();this.documentation=_,this._register(f),this.allActions=b.mergeSort([...m],r.codeActionsComparator),this.validActions=this.allActions.filter(({action:v})=>!v.disabled)}static codeActionsComparator({action:m},{action:_}){return m.isPreferred&&!_.isPreferred?-1:!m.isPreferred&&_.isPreferred?1:b.isNonEmptyArray(m.diagnostics)?b.isNonEmptyArray(_.diagnostics)?m.diagnostics[0].message.localeCompare(_.diagnostics[0].message):-1:b.isNonEmptyArray(_.diagnostics)?1:0}get hasAutoFix(){return this.validActions.some(({action:m})=>!!m.kind&&o.CodeActionKind.QuickFix.contains(new o.CodeActionKind(m.kind))&&!!m.isPreferred)}}const i={actions:[],documentation:void 0};function n(h,m,_,f,v){var y;const L=_.filter||{},I={only:(y=L.include)===null||y===void 0?void 0:y.value,trigger:_.type},k=new C.TextModelCancellationTokenSource(h,v),E=t(h,L),T=new w.DisposableStore,O=E.map(B=>Ie(this,void 0,void 0,function*(){try{f.report(B);const F=yield B.provideCodeActions(h,m,I,k.token);if(F&&T.add(F),k.token.isCancellationRequested)return i;const D=((F==null?void 0:F.actions)||[]).filter(W=>W&&o.filtersAction(L,W)),R=l(B,D,L.include);return{actions:D.map(W=>new u(W,B)),documentation:R}}catch(F){if(M.isPromiseCanceledError(F))throw F;return M.onUnexpectedExternalError(F),i}})),A=p.CodeActionProviderRegistry.onDidChange(()=>{const B=p.CodeActionProviderRegistry.all(h);b.equals(B,E)||k.cancel()});return Promise.all(O).then(B=>{const F=b.flatten(B.map(R=>R.actions)),D=b.coalesce(B.map(R=>R.documentation));return new r(F,D,T)}).finally(()=>{A.dispose(),k.dispose()})}e.getCodeActions=n;function t(h,m){return p.CodeActionProviderRegistry.all(h).filter(_=>_.providedCodeActionKinds?_.providedCodeActionKinds.some(f=>o.mayIncludeActionsOfKind(m,new o.CodeActionKind(f))):!0)}function l(h,m,_){if(!!h.documentation){const f=h.documentation.map(v=>({kind:new o.CodeActionKind(v.kind),command:v.command}));if(_){let v;for(const y of f)y.kind.contains(_)&&(v?v.kind.contains(y.kind)&&(v=y):v=y);if(v)return v==null?void 0:v.command}for(const v of m)if(!!v.kind){for(const y of f)if(y.kind.contains(new o.CodeActionKind(v.kind)))return y.command}}}a.CommandsRegistry.registerCommand("_executeCodeActionProvider",function(h,m,_,f,v){return Ie(this,void 0,void 0,function*(){if(!(m instanceof S.URI))throw M.illegalArgument();const y=h.get(c.IModelService).getModel(m);if(!y)throw M.illegalArgument();const L=g.Selection.isISelection(_)?g.Selection.liftSelection(_):d.Range.isIRange(_)?y.validateRange(_):void 0;if(!L)throw M.illegalArgument();const I=typeof f=="string"?new o.CodeActionKind(f):void 0,k=yield n(y,L,{type:2,filter:{includeSourceActions:!0,include:I}},s.Progress.None,N.CancellationToken.None),E=[],T=Math.min(k.validActions.length,typeof v=="number"?v:0);for(let O=0;OO.action)}finally{setTimeout(()=>k.dispose(),100)}})})}),define(Q[616],J([0,1,7,48,12,150,2,14,18,145,130,68,37]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionKeybindingResolver=e.CodeActionMenu=void 0;class s extends N.Action{constructor(n,t){super(n.command?n.command.id:n.title,a(n.title),void 0,!n.disabled,t);this.action=n}}function a(i){return i.replace(/\r\n|\r|\n/g," ")}let u=class extends S.Disposable{constructor(n,t,l,h){super();this._editor=n,this._delegate=t,this._contextMenuService=l,this._visible=!1,this._showingActions=this._register(new S.MutableDisposable),this._keybindingResolver=new r({getKeybindings:()=>h.getKeybindings()})}get isVisible(){return this._visible}show(n,t,l,h){return Ie(this,void 0,void 0,function*(){const m=h.includeDisabledActions?t.allActions:t.validActions;if(!m.length){this._visible=!1;return}if(!this._editor.getDomNode())throw this._visible=!1,M.canceled();this._visible=!0,this._showingActions.value=t;const _=this.getMenuActions(n,m,t.documentation),f=C.Position.isIPosition(l)?this._toCoords(l):l||{x:0,y:0},v=this._keybindingResolver.getResolver();this._contextMenuService.showContextMenu({domForShadowRoot:this._editor.getDomNode(),getAnchor:()=>f,getActions:()=>_,onHide:()=>{this._visible=!1,this._editor.focus()},autoSelectFirstItem:!0,getKeyBinding:y=>y instanceof s?v(y.action):void 0})})}getMenuActions(n,t,l){var h,m;const _=L=>new s(L.action,()=>this._delegate.onSelectCodeAction(L)),f=t.map(_),v=[...l],y=this._editor.getModel();if(y&&f.length)for(const L of d.CodeActionProviderRegistry.all(y))L._getAdditionalMenuItems&&v.push(...L._getAdditionalMenuItems({trigger:n.type,only:(m=(h=n.filter)===null||h===void 0?void 0:h.include)===null||m===void 0?void 0:m.value},t.map(I=>I.action)));return v.length&&f.push(new N.Separator,...v.map(L=>_(new g.CodeActionItem({title:L.title,command:L},void 0)))),f}_toCoords(n){if(!this._editor.hasModel())return{x:0,y:0};this._editor.revealPosition(n,1),this._editor.render();const t=this._editor.getScrolledVisiblePosition(n),l=b.getDomNodePagePosition(this._editor.getDomNode()),h=l.left+t.left,m=l.top+t.top+t.height;return{x:h,y:m}}};u=Me([_e(2,c.IContextMenuService),_e(3,o.IKeybindingService)],u),e.CodeActionMenu=u;class r{constructor(n){this._keybindingProvider=n}getResolver(){const n=new w.Lazy(()=>this._keybindingProvider.getKeybindings().filter(t=>r.codeActionCommands.indexOf(t.command)>=0).filter(t=>t.resolvedKeybinding).map(t=>{let l=t.commandArgs;return t.command===g.organizeImportsCommandId?l={kind:p.CodeActionKind.SourceOrganizeImports.value}:t.command===g.fixAllCommandId&&(l={kind:p.CodeActionKind.SourceFixAll.value}),Object.assign({resolvedKeybinding:t.resolvedKeybinding},p.CodeActionCommandArgs.fromUser(l,{kind:p.CodeActionKind.None,apply:"never"}))}));return t=>{if(t.kind){const l=this.bestKeybindingForCodeAction(t,n.getValue());return l==null?void 0:l.resolvedKeybinding}}}bestKeybindingForCodeAction(n,t){if(!!n.kind){const l=new p.CodeActionKind(n.kind);return t.filter(h=>h.kind.contains(l)).filter(h=>h.preferred?n.isPreferred:!0).reduceRight((h,m)=>h?h.kind.contains(m.kind)?m:h:m,void 0)}}}e.CodeActionKeybindingResolver=r,r.codeActionCommands=[g.refactorCommandId,g.codeActionCommandId,g.sourceActionCommandId,g.organizeImportsCommandId,g.fixAllCommandId]});var tt=this&&this.__classPrivateFieldGet||function(q,e){if(!e.has(q))throw new TypeError("attempted to get private field on non-instance");return e.get(q)},_t=this&&this.__classPrivateFieldSet||function(q,e,b){if(!e.has(q))throw new TypeError("attempted to set private field on non-instance");return e.set(q,b),b};define(Q[617],J([0,1,15,12,6,2,44,3,18,16,59,145]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";var o;Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionModel=e.CodeActionsState=e.SUPPORTED_CODE_ACTIONS=void 0,e.SUPPORTED_CODE_ACTIONS=new g.RawContextKey("supportedCodeAction","");class s extends w.Disposable{constructor(n,t,l,h=250){super();this._editor=n,this._markerService=t,this._signalChange=l,this._delay=h,this._autoTriggerTimer=this._register(new b.TimeoutTimer),this._register(this._markerService.onMarkerChanged(m=>this._onMarkerChanges(m))),this._register(this._editor.onDidChangeCursorPosition(()=>this._onCursorChange()))}trigger(n){const t=this._getRangeOfSelectionUnlessWhitespaceEnclosed(n);return this._createEventAndSignalChange(n,t)}_onMarkerChanges(n){const t=this._editor.getModel();!t||n.some(l=>S.isEqual(l,t.uri))&&this._autoTriggerTimer.cancelAndSet(()=>{this.trigger({type:1})},this._delay)}_onCursorChange(){this._autoTriggerTimer.cancelAndSet(()=>{this.trigger({type:1})},this._delay)}_getRangeOfMarker(n){const t=this._editor.getModel();if(!!t)for(const l of this._markerService.read({resource:t.uri})){const h=t.validateRange(l);if(C.Range.intersectRanges(h,n))return C.Range.lift(h)}}_getRangeOfSelectionUnlessWhitespaceEnclosed(n){if(!!this._editor.hasModel()){const t=this._editor.getModel(),l=this._editor.getSelection();if(l.isEmpty()&&n.type===1){const{lineNumber:h,column:m}=l.getPosition(),_=t.getLineContent(h);if(_.length===0)return;if(m===1){if(/\s/.test(_[0]))return}else if(m===t.getLineMaxColumn(h)){if(/\s/.test(_[_.length-1]))return}else if(/\s/.test(_[m-2])&&/\s/.test(_[m-1]))return}return l}}_createEventAndSignalChange(n,t){const l=this._editor.getModel();if(!t||!l){this._signalChange(void 0);return}const h=this._getRangeOfMarker(t),m=h?h.getStartPosition():t.getStartPosition(),_={trigger:n,selection:t,position:m};return this._signalChange(_),_}}var a;(function(i){i.Empty={type:0};class n{constructor(l,h,m,_){this.trigger=l,this.rangeOrSelection=h,this.position=m,this._cancellablePromise=_,this.type=1,this.actions=_.catch(f=>{if(N.isPromiseCanceledError(f))return u;throw f})}cancel(){this._cancellablePromise.cancel()}}i.Triggered=n})(a=e.CodeActionsState||(e.CodeActionsState={}));const u={allActions:[],validActions:[],dispose:()=>{},documentation:[],hasAutoFix:!1};class r extends w.Disposable{constructor(n,t,l,h){super();this._editor=n,this._markerService=t,this._progressService=h,this._codeActionOracle=this._register(new w.MutableDisposable),this._state=a.Empty,this._onDidChangeState=this._register(new M.Emitter),this.onDidChangeState=this._onDidChangeState.event,o.set(this,!1),this._supportedCodeActions=e.SUPPORTED_CODE_ACTIONS.bindTo(l),this._register(this._editor.onDidChangeModel(()=>this._update())),this._register(this._editor.onDidChangeModelLanguage(()=>this._update())),this._register(d.CodeActionProviderRegistry.onDidChange(()=>this._update())),this._update()}dispose(){tt(this,o)||(_t(this,o,!0),super.dispose(),this.setState(a.Empty,!0))}_update(){if(!tt(this,o)){this._codeActionOracle.value=void 0,this.setState(a.Empty);const n=this._editor.getModel();if(n&&d.CodeActionProviderRegistry.has(n)&&!this._editor.getOption(75)){const t=[];for(const l of d.CodeActionProviderRegistry.all(n))Array.isArray(l.providedCodeActionKinds)&&t.push(...l.providedCodeActionKinds);this._supportedCodeActions.set(t.join(" ")),this._codeActionOracle.value=new s(this._editor,this._markerService,l=>{var h;if(!l){this.setState(a.Empty);return}const m=b.createCancelablePromise(_=>c.getCodeActions(n,l.selection,l.trigger,p.Progress.None,_));l.trigger.type===2&&((h=this._progressService)===null||h===void 0||h.showWhile(m,250)),this.setState(new a.Triggered(l.trigger,l.selection,l.position,m))},void 0),this._codeActionOracle.value.trigger({type:1})}else this._supportedCodeActions.reset()}}trigger(n){this._codeActionOracle.value&&this._codeActionOracle.value.trigger(n)}setState(n,t){n!==this._state&&(this._state.type===1&&this._state.cancel(),this._state=n,!t&&!tt(this,o)&&this._onDidChangeState.fire(n))}}e.CodeActionModel=r,o=new WeakMap}),define(Q[618],J([0,1,15,12,2,70,13,18,248,596,26,32,575,7,89,78,468,25,134]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensContribution=void 0;let t=class{constructor(h,m,_,f){this._editor=h,this._commandService=m,this._notificationService=_,this._codeLensCache=f,this._disposables=new M.DisposableStore,this._localToDispose=new M.DisposableStore,this._lenses=[],this._getCodeLensModelDelays=new n.LanguageFeatureRequestDelays(C.CodeLensProviderRegistry,250,2500),this._oldCodeLensModels=new M.DisposableStore,this._resolveCodeLensesDelays=new n.LanguageFeatureRequestDelays(C.CodeLensProviderRegistry,250,2500),this._resolveCodeLensesScheduler=new b.RunOnceScheduler(()=>this._resolveCodeLensesInViewport(),this._resolveCodeLensesDelays.min),this._disposables.add(this._editor.onDidChangeModel(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeConfiguration(v=>{(v.hasChanged(38)||v.hasChanged(13)||v.hasChanged(12))&&this._updateLensStyle(),v.hasChanged(11)&&this._onModelChange()})),this._disposables.add(C.CodeLensProviderRegistry.onDidChange(this._onModelChange,this)),this._onModelChange(),this._styleClassName="_"+a.hash(this._editor.getId()).toString(16),this._styleElement=s.createStyleSheet(s.isInShadowDOM(this._editor.getContainerDomNode())?this._editor.getContainerDomNode():void 0),this._updateLensStyle()}dispose(){var h;this._localDispose(),this._disposables.dispose(),this._oldCodeLensModels.dispose(),(h=this._currentCodeLensModel)===null||h===void 0||h.dispose(),this._styleElement.remove()}_getLayoutInfo(){let h=this._editor.getOption(13),m;return!h||h<5?(h=this._editor.getOption(40)*.9|0,m=this._editor.getOption(53)):m=h*Math.max(1.3,this._editor.getOption(53)/this._editor.getOption(40))|0,{codeLensHeight:m,fontSize:h}}_updateLensStyle(){const{codeLensHeight:h,fontSize:m}=this._getLayoutInfo(),_=this._editor.getOption(12),f=this._editor.getOption(38),v=`--codelens-font-family${this._styleClassName}`;let y=` + .monaco-editor .codelens-decoration.${this._styleClassName} { line-height: ${h}px; font-size: ${m}px; padding-right: ${Math.round(m*.5)}px; font-feature-settings: ${f.fontFeatureSettings} } + .monaco-editor .codelens-decoration.${this._styleClassName} span.codicon { line-height: ${h}px; font-size: ${m}px; } + `;_&&(y+=`.monaco-editor .codelens-decoration.${this._styleClassName} { font-family: var(${v})}`),this._styleElement.textContent=y,this._editor.getContainerDomNode().style.setProperty(v,_!=null?_:"inherit"),this._editor.changeViewZones(L=>{for(let I of this._lenses)I.updateHeight(h,L)})}_localDispose(){var h,m,_;(h=this._getCodeLensModelPromise)===null||h===void 0||h.cancel(),this._getCodeLensModelPromise=void 0,(m=this._resolveCodeLensesPromise)===null||m===void 0||m.cancel(),this._resolveCodeLensesPromise=void 0,this._localToDispose.clear(),this._oldCodeLensModels.clear(),(_=this._currentCodeLensModel)===null||_===void 0||_.dispose()}_onModelChange(){this._localDispose();const h=this._editor.getModel();if(!!h&&!!this._editor.getOption(11)){const m=this._codeLensCache.get(h);if(m&&this._renderCodeLensSymbols(m),!C.CodeLensProviderRegistry.has(h)){m&&this._localToDispose.add(b.disposableTimeout(()=>{const f=this._codeLensCache.get(h);m===f&&(this._codeLensCache.delete(h),this._onModelChange())},30*1e3));return}for(const f of C.CodeLensProviderRegistry.all(h))if(typeof f.onDidChange=="function"){let v=f.onDidChange(()=>_.schedule());this._localToDispose.add(v)}const _=new b.RunOnceScheduler(()=>{var f;const v=Date.now();(f=this._getCodeLensModelPromise)===null||f===void 0||f.cancel(),this._getCodeLensModelPromise=b.createCancelablePromise(y=>d.getCodeLensModel(h,y)),this._getCodeLensModelPromise.then(y=>{this._currentCodeLensModel&&this._oldCodeLensModels.add(this._currentCodeLensModel),this._currentCodeLensModel=y,this._codeLensCache.put(h,y);const L=this._getCodeLensModelDelays.update(h,Date.now()-v);_.delay=L,this._renderCodeLensSymbols(y),this._resolveCodeLensesInViewport()},N.onUnexpectedError)},this._getCodeLensModelDelays.get(h));this._localToDispose.add(_),this._localToDispose.add(M.toDisposable(()=>this._resolveCodeLensesScheduler.cancel())),this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._editor.changeDecorations(f=>{this._editor.changeViewZones(v=>{let y=[],L=-1;this._lenses.forEach(k=>{!k.isValid()||L===k.getLineNumber()?y.push(k):(k.update(v),L=k.getLineNumber())});let I=new g.CodeLensHelper;y.forEach(k=>{k.dispose(I,v),this._lenses.splice(this._lenses.indexOf(k),1)}),I.commit(f)})}),_.schedule()})),this._localToDispose.add(this._editor.onDidFocusEditorWidget(()=>{_.schedule()})),this._localToDispose.add(this._editor.onDidScrollChange(f=>{f.scrollTopChanged&&this._lenses.length>0&&this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add(this._editor.onDidLayoutChange(()=>{this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add(M.toDisposable(()=>{if(this._editor.getModel()){const f=w.StableEditorScrollState.capture(this._editor);this._editor.changeDecorations(v=>{this._editor.changeViewZones(y=>{this._disposeAllLenses(v,y)})}),f.restore(this._editor)}else this._disposeAllLenses(void 0,void 0)})),this._localToDispose.add(this._editor.onMouseDown(f=>{if(f.target.type===9){let v=f.target.element;if((v==null?void 0:v.tagName)==="SPAN"&&(v=v.parentElement),(v==null?void 0:v.tagName)==="A")for(const y of this._lenses){let L=y.getCommand(v);if(L){this._commandService.executeCommand(L.id,...L.arguments||[]).catch(I=>this._notificationService.error(I));break}}}})),_.schedule()}}_disposeAllLenses(h,m){const _=new g.CodeLensHelper;for(const f of this._lenses)f.dispose(_,m);h&&_.commit(h),this._lenses.length=0}_renderCodeLensSymbols(h){if(!!this._editor.hasModel()){let m=this._editor.getModel().getLineCount(),_=[],f;for(let L of h.lenses){let I=L.symbol.range.startLineNumber;I<1||I>m||(f&&f[f.length-1].symbol.range.startLineNumber===I?f.push(L):(f=[L],_.push(f)))}const v=w.StableEditorScrollState.capture(this._editor),y=this._getLayoutInfo();this._editor.changeDecorations(L=>{this._editor.changeViewZones(I=>{const k=new g.CodeLensHelper;let E=0,T=0;for(;T<_.length&&Ethis._resolveCodeLensesInViewportSoon())),E++,T++)}for(;Ethis._resolveCodeLensesInViewportSoon())),T++;k.commit(L)})}),v.restore(this._editor)}}_resolveCodeLensesInViewportSoon(){this._editor.getModel()&&this._resolveCodeLensesScheduler.schedule()}_resolveCodeLensesInViewport(){var h;(h=this._resolveCodeLensesPromise)===null||h===void 0||h.cancel(),this._resolveCodeLensesPromise=void 0;const m=this._editor.getModel();if(!!m){const _=[],f=[];if(this._lenses.forEach(L=>{const I=L.computeIfNecessary(m);I&&(_.push(I),f.push(L))}),_.length!==0){const v=Date.now(),y=b.createCancelablePromise(L=>{const I=_.map((k,E)=>{const T=new Array(k.length),O=k.map((A,B)=>!A.symbol.command&&typeof A.provider.resolveCodeLens=="function"?Promise.resolve(A.provider.resolveCodeLens(m,A.symbol,L)).then(F=>{T[B]=F},N.onUnexpectedExternalError):(T[B]=A.symbol,Promise.resolve(void 0)));return Promise.all(O).then(()=>{!L.isCancellationRequested&&!f[E].isDisposed()&&f[E].updateCommands(T)})});return Promise.all(I)});this._resolveCodeLensesPromise=y,this._resolveCodeLensesPromise.then(()=>{const L=this._resolveCodeLensesDelays.update(m,Date.now()-v);this._resolveCodeLensesScheduler.delay=L,this._currentCodeLensModel&&this._codeLensCache.put(m,this._currentCodeLensModel),this._oldCodeLensModels.clear(),y===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)},L=>{N.onUnexpectedError(L),y===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)})}}}getLenses(){return this._lenses}};t.ID="css.editor.codeLens",t=Me([_e(1,p.ICommandService),_e(2,c.INotificationService),_e(3,o.ICodeLensCache)],t),e.CodeLensContribution=t,S.registerEditorContribution(t.ID,t),S.registerEditorAction(class extends S.EditorAction{constructor(){super({id:"codelens.showLensesInCurrentLine",precondition:i.EditorContextKeys.hasCodeLensProvider,label:r.localize(0,null),alias:"Show CodeLens Commands For Current Line"})}run(h,m){return Ie(this,void 0,void 0,function*(){if(!!m.hasModel()){const _=h.get(u.IQuickInputService),f=h.get(p.ICommandService),v=h.get(c.INotificationService),y=m.getSelection().positionLineNumber,L=m.getContribution(t.ID),I=[];for(let E of L.getLenses())if(E.getLineNumber()===y)for(let T of E.getItems()){const{command:O}=T.symbol;O&&I.push({label:O.title,command:O})}if(I.length!==0){const k=yield _.pick(I,{canPickMany:!1});if(!!k)try{yield f.executeCommand(k.command.id,...k.command.arguments||[])}catch(E){v.error(E)}}}})}})}),define(Q[260],J([0,1,15,29,12,89,2,13,28,3,31,18,249,46]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorDetector=void 0;const a=500;let u=class Wt extends S.Disposable{constructor(i,n,t){super();this._editor=i,this._codeEditorService=n,this._configurationService=t,this._localToDispose=this._register(new S.DisposableStore),this._decorationsIds=[],this._colorDatas=new Map,this._colorDecoratorIds=[],this._decorationsTypes=new Set,this._register(i.onDidChangeModel(()=>{this._isEnabled=this.isEnabled(),this.onModelChanged()})),this._register(i.onDidChangeModelLanguage(()=>this.onModelChanged())),this._register(c.ColorProviderRegistry.onDidChange(()=>this.onModelChanged())),this._register(i.onDidChangeConfiguration(()=>{let l=this._isEnabled;this._isEnabled=this.isEnabled(),l!==this._isEnabled&&(this._isEnabled?this.onModelChanged():this.removeAllDecorations())})),this._timeoutTimer=null,this._computePromise=null,this._isEnabled=this.isEnabled(),this.onModelChanged()}isEnabled(){const i=this._editor.getModel();if(!i)return!1;const n=i.getLanguageIdentifier(),t=this._configurationService.getValue(n.language);if(t){const l=t.colorDecorators;if(l&&l.enable!==void 0&&!l.enable)return l.enable}return this._editor.getOption(14)}static get(i){return i.getContribution(this.ID)}dispose(){this.stop(),this.removeAllDecorations(),super.dispose()}onModelChanged(){if(this.stop(),!!this._isEnabled){const i=this._editor.getModel();!i||!c.ColorProviderRegistry.has(i)||(this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._timeoutTimer||(this._timeoutTimer=new b.TimeoutTimer,this._timeoutTimer.cancelAndSet(()=>{this._timeoutTimer=null,this.beginCompute()},Wt.RECOMPUTE_TIME))})),this.beginCompute())}}beginCompute(){this._computePromise=b.createCancelablePromise(i=>{const n=this._editor.getModel();return n?o.getColors(n,i):Promise.resolve([])}),this._computePromise.then(i=>{this.updateDecorations(i),this.updateColorDecorators(i),this._computePromise=null},M.onUnexpectedError)}stop(){this._timeoutTimer&&(this._timeoutTimer.cancel(),this._timeoutTimer=null),this._computePromise&&(this._computePromise.cancel(),this._computePromise=null),this._localToDispose.clear()}updateDecorations(i){const n=i.map(t=>({range:{startLineNumber:t.colorInfo.range.startLineNumber,startColumn:t.colorInfo.range.startColumn,endLineNumber:t.colorInfo.range.endLineNumber,endColumn:t.colorInfo.range.endColumn},options:p.ModelDecorationOptions.EMPTY}));this._decorationsIds=this._editor.deltaDecorations(this._decorationsIds,n),this._colorDatas=new Map,this._decorationsIds.forEach((t,l)=>this._colorDatas.set(t,i[l]))}updateColorDecorators(i){let n=[],t={};for(let l=0;l{t[l]||this._codeEditorService.removeDecorationType(l)}),this._colorDecoratorIds=this._editor.deltaDecorations(this._colorDecoratorIds,n)}removeAllDecorations(){this._decorationsIds=this._editor.deltaDecorations(this._decorationsIds,[]),this._colorDecoratorIds=this._editor.deltaDecorations(this._colorDecoratorIds,[]),this._decorationsTypes.forEach(i=>{this._codeEditorService.removeDecorationType(i)})}getColorData(i){const n=this._editor.getModel();if(!n)return null;const t=n.getDecorationsInRange(g.Range.fromPositions(i,i)).filter(l=>this._colorDatas.has(l.id));return t.length===0?null:this._colorDatas.get(t[0].id)}};u.ID="editor.contrib.colorDetector",u.RECOMPUTE_TIME=1e3,u=Me([_e(1,d.ICodeEditorService),_e(2,s.IConfigurationService)],u),e.ColorDetector=u,C.registerEditorContribution(u.ID,u)}),define(Q[619],J([0,1,469,39,13,3,25,224,401,34]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class p extends M.EditorAction{constructor(r,i){super(i);this._type=r}run(r,i){if(!!i.hasModel()){const n=i.getModel(),t=[],l=n.getOptions(),h=i.getOption(16),m=i.getSelections().map((f,v)=>({selection:f,index:v,ignoreFirstLine:!1}));m.sort((f,v)=>w.Range.compareRangesUsingStarts(f.selection,v.selection));let _=m[0];for(let f=1;fthis._onContextMenu(m))),this._toDispose.add(this._editor.onMouseWheel(m=>{if(this._contextMenuIsBeingShownCount>0){const _=this._contextViewService.getContextViewElement(),f=m.srcElement;f.shadowRoot&&N.getShadowRoot(_)===f.shadowRoot||this._contextViewService.hideContextView()}})),this._toDispose.add(this._editor.onKeyDown(m=>{m.keyCode===58&&(m.preventDefault(),m.stopPropagation(),this.showContextMenu())}))}static get(r){return r.getContribution(Bt.ID)}_onContextMenu(r){if(!!this._editor.hasModel()){if(!this._editor.getOption(17)){this._editor.focus(),r.target.position&&!this._editor.getSelection().containsPosition(r.target.position)&&this._editor.setPosition(r.target.position);return}if(r.target.type!==12&&(r.event.preventDefault(),!(r.target.type!==6&&r.target.type!==7&&r.target.type!==1))){if(this._editor.focus(),r.target.position){let n=!1;for(const t of this._editor.getSelections())if(t.containsPosition(r.target.position)){n=!0;break}n||this._editor.setPosition(r.target.position)}let i=null;r.target.type!==1&&(i={x:r.event.posx-1,width:2,y:r.event.posy-1,height:2}),this.showContextMenu(i)}}}showContextMenu(r){if(!!this._editor.getOption(17)&&!!this._editor.hasModel()){if(!this._contextMenuService){this._editor.focus();return}const i=this._getMenuActions(this._editor.getModel(),d.MenuId.EditorContext);i.length>0&&this._doShowContextMenu(i,r)}}_getMenuActions(r,i){const n=[],t=this._menuService.createMenu(i,this._contextKeyService),l=t.getActions({arg:r.uri});t.dispose();for(let h of l){const[,m]=h;let _=0;for(const f of m)if(f instanceof d.SubmenuItemAction){const v=this._getMenuActions(r,f.item.submenu);v.length>0&&(n.push(new M.SubmenuAction(f.id,f.label,v)),_++)}else n.push(f),_++;_&&n.push(new M.Separator)}return n.length&&n.pop(),n}_doShowContextMenu(r,i=null){if(!!this._editor.hasModel()){const n=this._editor.getOption(48);if(this._editor.updateOptions({hover:{enabled:!1}}),!i){this._editor.revealPosition(this._editor.getPosition(),1),this._editor.render();const t=this._editor.getScrolledVisiblePosition(this._editor.getPosition()),l=N.getDomNodePagePosition(this._editor.getDomNode()),h=l.left+t.left,m=l.top+t.top+t.height;i={x:h,y:m}}this._contextMenuIsBeingShownCount++,this._contextMenuService.showContextMenu({domForShadowRoot:this._editor.getDomNode(),getAnchor:()=>i,getActions:()=>r,getActionViewItem:t=>{const l=this._keybindingFor(t);if(l)return new o.ActionViewItem(t,t,{label:!0,keybinding:l.getLabel(),isMenu:!0});const h=t;return typeof h.getActionViewItem=="function"?h.getActionViewItem():new o.ActionViewItem(t,t,{icon:!0,label:!0,isMenu:!0})},getKeyBinding:t=>this._keybindingFor(t),onHide:t=>{this._contextMenuIsBeingShownCount--,this._editor.focus(),this._editor.updateOptions({hover:n})}})}}_keybindingFor(r){return this._keybindingService.lookupKeybinding(r.id)}dispose(){this._contextMenuIsBeingShownCount>0&&this._contextViewService.hideContextView(),this._toDispose.dispose()}};s.ID="editor.contrib.contextmenu",s=Me([_e(1,p.IContextMenuService),_e(2,p.IContextViewService),_e(3,g.IContextKeyService),_e(4,c.IKeybindingService),_e(5,d.IMenuService)],s),e.ContextMenuController=s;class a extends S.EditorAction{constructor(){super({id:"editor.action.showContextMenu",label:b.localize(0,null),alias:"Show Editor Context Menu",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.textInputFocus,primary:1024|68,weight:100}})}run(r,i){s.get(i).showContextMenu()}}S.registerEditorContribution(s.ID,s),S.registerEditorAction(a)}),define(Q[621],J([0,1,471,2,13,25]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorRedo=e.CursorUndo=e.CursorUndoRedoController=void 0;class S{constructor(o){this.selections=o}equals(o){const s=this.selections.length,a=o.selections.length;if(s!==a)return!1;for(let u=0;u{this._undoStack=[],this._redoStack=[]})),this._register(o.onDidChangeModelContent(s=>{this._undoStack=[],this._redoStack=[]})),this._register(o.onDidChangeCursorSelection(s=>{if(!this._isCursorUndoRedo&&!!s.oldSelections&&s.oldModelVersionId===s.modelVersionId){const a=new S(s.oldSelections);this._undoStack.length>0&&this._undoStack[this._undoStack.length-1].cursorState.equals(a)||(this._undoStack.push(new C(a,o.getScrollTop(),o.getScrollLeft())),this._redoStack=[],this._undoStack.length>50&&this._undoStack.shift())}}))}static get(o){return o.getContribution(d.ID)}cursorUndo(){!this._editor.hasModel()||this._undoStack.length===0||(this._redoStack.push(new C(new S(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._undoStack.pop()))}cursorRedo(){!this._editor.hasModel()||this._redoStack.length===0||(this._undoStack.push(new C(new S(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._redoStack.pop()))}_applyState(o){this._isCursorUndoRedo=!0,this._editor.setSelections(o.cursorState.selections),this._editor.setScrollPosition({scrollTop:o.scrollTop,scrollLeft:o.scrollLeft}),this._isCursorUndoRedo=!1}}e.CursorUndoRedoController=d,d.ID="editor.contrib.cursorUndoRedoController";class g extends M.EditorAction{constructor(){super({id:"cursorUndo",label:b.localize(0,null),alias:"Cursor Undo",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:2048|51,weight:100}})}run(o,s,a){d.get(s).cursorUndo()}}e.CursorUndo=g;class p extends M.EditorAction{constructor(){super({id:"cursorRedo",label:b.localize(1,null),alias:"Cursor Redo",precondition:void 0})}run(o,s,a){d.get(s).cursorRedo()}}e.CursorRedo=p,M.registerEditorContribution(d.ID,d),M.registerEditorAction(g),M.registerEditorAction(p)}),define(Q[622],J([0,1,2,17,13,14,3,21,402,31,340]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropController=void 0;function p(o){return N.isMacintosh?o.altKey:o.ctrlKey}class c extends b.Disposable{constructor(s){super();this._editor=s,this._register(this._editor.onMouseDown(a=>this._onEditorMouseDown(a))),this._register(this._editor.onMouseUp(a=>this._onEditorMouseUp(a))),this._register(this._editor.onMouseDrag(a=>this._onEditorMouseDrag(a))),this._register(this._editor.onMouseDrop(a=>this._onEditorMouseDrop(a))),this._register(this._editor.onMouseDropCanceled(()=>this._onEditorMouseDropCanceled())),this._register(this._editor.onKeyDown(a=>this.onEditorKeyDown(a))),this._register(this._editor.onKeyUp(a=>this.onEditorKeyUp(a))),this._register(this._editor.onDidBlurEditorWidget(()=>this.onEditorBlur())),this._register(this._editor.onDidBlurEditorText(()=>this.onEditorBlur())),this._dndDecorationIds=[],this._mouseDown=!1,this._modifierPressed=!1,this._dragSelection=null}onEditorBlur(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1}onEditorKeyDown(s){!this._editor.getOption(27)||this._editor.getOption(15)||(p(s)&&(this._modifierPressed=!0),this._mouseDown&&p(s)&&this._editor.updateOptions({mouseStyle:"copy"}))}onEditorKeyUp(s){!this._editor.getOption(27)||this._editor.getOption(15)||(p(s)&&(this._modifierPressed=!1),this._mouseDown&&s.keyCode===c.TRIGGER_KEY_VALUE&&this._editor.updateOptions({mouseStyle:"default"}))}_onEditorMouseDown(s){this._mouseDown=!0}_onEditorMouseUp(s){this._mouseDown=!1,this._editor.updateOptions({mouseStyle:"text"})}_onEditorMouseDrag(s){let a=s.target;if(this._dragSelection===null){let r=(this._editor.getSelections()||[]).filter(i=>a.position&&i.containsPosition(a.position));if(r.length===1)this._dragSelection=r[0];else return}p(s.event)?this._editor.updateOptions({mouseStyle:"copy"}):this._editor.updateOptions({mouseStyle:"default"}),a.position&&(this._dragSelection.containsPosition(a.position)?this._removeDecoration():this.showAt(a.position))}_onEditorMouseDropCanceled(){this._editor.updateOptions({mouseStyle:"text"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}_onEditorMouseDrop(s){if(s.target&&(this._hitContent(s.target)||this._hitMargin(s.target))&&s.target.position){let a=new w.Position(s.target.position.lineNumber,s.target.position.column);if(this._dragSelection===null){let u=null;if(s.event.shiftKey){let r=this._editor.getSelection();if(r){const{selectionStartLineNumber:i,selectionStartColumn:n}=r;u=[new C.Selection(i,n,a.lineNumber,a.column)]}}else u=(this._editor.getSelections()||[]).map(r=>r.containsPosition(a)?new C.Selection(a.lineNumber,a.column,a.lineNumber,a.column):r);this._editor.setSelections(u||[],"mouse",3)}else(!this._dragSelection.containsPosition(a)||(p(s.event)||this._modifierPressed)&&(this._dragSelection.getEndPosition().equals(a)||this._dragSelection.getStartPosition().equals(a)))&&(this._editor.pushUndoStop(),this._editor.executeCommand(c.ID,new d.DragAndDropCommand(this._dragSelection,a,p(s.event)||this._modifierPressed)),this._editor.pushUndoStop())}this._editor.updateOptions({mouseStyle:"text"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}showAt(s){let a=[{range:new S.Range(s.lineNumber,s.column,s.lineNumber,s.column),options:c._DECORATION_OPTIONS}];this._dndDecorationIds=this._editor.deltaDecorations(this._dndDecorationIds,a),this._editor.revealPosition(s,1)}_removeDecoration(){this._dndDecorationIds=this._editor.deltaDecorations(this._dndDecorationIds,[])}_hitContent(s){return s.type===6||s.type===7}_hitMargin(s){return s.type===2||s.type===3||s.type===4}dispose(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1,super.dispose()}}e.DragAndDropController=c,c.ID="editor.contrib.dragAndDrop",c.TRIGGER_KEY_VALUE=N.isMacintosh?6:5,c._DECORATION_OPTIONS=g.ModelDecorationOptions.register({className:"dnd-target"}),M.registerEditorContribution(c.ID,c)}),define(Q[623],J([0,1,476,13,126]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class w extends N.EditorAction{constructor(){super({id:"editor.action.fontZoomIn",label:b.localize(0,null),alias:"Editor Font Zoom In",precondition:void 0})}run(g,p){M.EditorZoom.setZoomLevel(M.EditorZoom.getZoomLevel()+1)}}class S extends N.EditorAction{constructor(){super({id:"editor.action.fontZoomOut",label:b.localize(1,null),alias:"Editor Font Zoom Out",precondition:void 0})}run(g,p){M.EditorZoom.setZoomLevel(M.EditorZoom.getZoomLevel()-1)}}class C extends N.EditorAction{constructor(){super({id:"editor.action.fontZoomReset",label:b.localize(2,null),alias:"Editor Font Zoom Reset",precondition:void 0})}run(g,p){M.EditorZoom.setZoomLevel(0)}}N.registerEditorAction(w),N.registerEditorAction(S),N.registerEditorAction(C)}),define(Q[261],J([0,1,47,19,23,12,24,70,108,14,3,21,18,75,36,226,477,532,9,71,26,20,54]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getOnTypeFormattingEdits=e.getDocumentFormattingEditsUntilResult=e.getDocumentRangeFormattingEditsUntilResult=e.formatDocumentWithProvider=e.formatDocumentWithSelectedProvider=e.formatDocumentRangesWithProvider=e.formatDocumentRangesWithSelectedProvider=e.FormattingConflicts=e.getRealAndSyntheticDocumentFormattersOrdered=e.alertFormattingEdits=void 0;function _(A){if(A=A.filter(R=>R.range),!!A.length){let{range:B}=A[0];for(let R=1;R0&&p.Range.areIntersectingOrTouching(Y[ee-1],ne)?Y[ee-1]=p.Range.fromPositions(Y[ee-1].getStartPosition(),ne.getEndPosition()):ee=Y.push(ne);const se=[];for(let ne of Y)try{const le=yield B.provideDocumentRangeFormattingEdits(x,ne,x.getFormattingOptions(),K.token),X=yield W.computeMoreMinimalEdits(x.uri,le);if(X&&se.push(...X),K.token.isCancellationRequested)return!0}finally{K.dispose()}if(se.length===0)return!1;if(d.isCodeEditor(F))u.FormattingEdit.execute(F,se,!0),_(se),F.revealPositionInCenterIfOutsideViewport(F.getPosition(),1);else{const[{range:ne}]=se,le=new c.Selection(ne.startLineNumber,ne.startColumn,ne.endLineNumber,ne.endColumn);x.pushEditOperations([le],se.map(X=>({text:X.text,range:p.Range.lift(X.range),forceMoveMarkers:!0})),X=>{for(const{range:z}of X)if(p.Range.areIntersectingOrTouching(z,le))return[new c.Selection(z.startLineNumber,z.startColumn,z.endLineNumber,z.endColumn)];return null})}return!0})}e.formatDocumentRangesWithProvider=L;function I(A,B,F,D,R){return Ie(this,void 0,void 0,function*(){const W=A.get(n.IInstantiationService),x=d.isCodeEditor(B)?B.getModel():B,K=f(x),Y=yield v.select(K,x,F);Y&&(D.report(Y),yield W.invokeFunction(k,Y,B,F,R))})}e.formatDocumentWithSelectedProvider=I;function k(A,B,F,D,R){return Ie(this,void 0,void 0,function*(){const W=A.get(s.IEditorWorkerService);let x,K;d.isCodeEditor(F)?(x=F.getModel(),K=new C.EditorStateCancellationTokenSource(F,1|4,void 0,R)):(x=F,K=new C.TextModelCancellationTokenSource(F,R));let Y;try{const ee=yield B.provideDocumentFormattingEdits(x,x.getFormattingOptions(),K.token);if(Y=yield W.computeMoreMinimalEdits(x.uri,ee),K.token.isCancellationRequested)return!0}finally{K.dispose()}if(!Y||Y.length===0)return!1;if(d.isCodeEditor(F))u.FormattingEdit.execute(F,Y,D!==2),D!==2&&(_(Y),F.revealPositionInCenterIfOutsideViewport(F.getPosition(),1));else{const[{range:ee}]=Y,se=new c.Selection(ee.startLineNumber,ee.startColumn,ee.endLineNumber,ee.endColumn);x.pushEditOperations([se],Y.map(ne=>({text:ne.text,range:p.Range.lift(ne.range),forceMoveMarkers:!0})),ne=>{for(const{range:le}of ne)if(p.Range.areIntersectingOrTouching(le,se))return[new c.Selection(le.startLineNumber,le.startColumn,le.endLineNumber,le.endColumn)];return null})}return!0})}e.formatDocumentWithProvider=k;function E(A,B,F,D,R){return Ie(this,void 0,void 0,function*(){const W=o.DocumentRangeFormattingEditProviderRegistry.ordered(B);for(const x of W){let K=yield Promise.resolve(x.provideDocumentRangeFormattingEdits(B,F,D,R)).catch(w.onUnexpectedExternalError);if(N.isNonEmptyArray(K))return yield A.computeMoreMinimalEdits(B.uri,K)}})}e.getDocumentRangeFormattingEditsUntilResult=E;function T(A,B,F,D){return Ie(this,void 0,void 0,function*(){const R=f(B);for(const W of R){let x=yield Promise.resolve(W.provideDocumentFormattingEdits(B,F,D)).catch(w.onUnexpectedExternalError);if(N.isNonEmptyArray(x))return yield A.computeMoreMinimalEdits(B.uri,x)}})}e.getDocumentFormattingEditsUntilResult=T;function O(A,B,F,D,R){const W=o.OnTypeFormattingEditProviderRegistry.ordered(B);return W.length===0||W[0].autoFormatTriggerCharacters.indexOf(D)<0?Promise.resolve(void 0):Promise.resolve(W[0].provideOnTypeFormattingEdits(B,F,D,R,M.CancellationToken.None)).catch(w.onUnexpectedExternalError).then(x=>A.computeMoreMinimalEdits(B.uri,x))}e.getOnTypeFormattingEdits=O,l.CommandsRegistry.registerCommand("_executeFormatRangeProvider",function(A,...B){const[F,D,R]=B;h.assertType(S.URI.isUri(F)),h.assertType(p.Range.isIRange(D));const W=A.get(a.IModelService).getModel(F);if(!W)throw w.illegalArgument("resource");return E(A.get(s.IEditorWorkerService),W,p.Range.lift(D),R,M.CancellationToken.None)}),l.CommandsRegistry.registerCommand("_executeFormatDocumentProvider",function(A,...B){const[F,D]=B;h.assertType(S.URI.isUri(F));const R=A.get(a.IModelService).getModel(F);if(!R)throw w.illegalArgument("resource");return T(A.get(s.IEditorWorkerService),R,D,M.CancellationToken.None)}),l.CommandsRegistry.registerCommand("_executeFormatOnTypeProvider",function(A,...B){const[F,D,R,W]=B;h.assertType(S.URI.isUri(F)),h.assertType(g.Position.isIPosition(D)),h.assertType(typeof R=="string");const x=A.get(a.IModelService).getModel(F);if(!x)throw w.illegalArgument("resource");return O(A.get(s.IEditorWorkerService),x,g.Position.lift(D),R,W)})}),define(Q[624],J([0,1,19,23,39,2,13,28,91,3,25,18,75,261,226,478,26,16,9,12,59]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let h=class{constructor(y,L){this._workerService=L,this._callOnDispose=new w.DisposableStore,this._callOnModel=new w.DisposableStore,this._editor=y,this._callOnDispose.add(y.onDidChangeConfiguration(()=>this._update())),this._callOnDispose.add(y.onDidChangeModel(()=>this._update())),this._callOnDispose.add(y.onDidChangeModelLanguage(()=>this._update())),this._callOnDispose.add(c.OnTypeFormattingEditProviderRegistry.onDidChange(this._update,this))}dispose(){this._callOnDispose.dispose(),this._callOnModel.dispose()}_update(){if(this._callOnModel.clear(),!!this._editor.getOption(43)&&!!this._editor.hasModel()){const y=this._editor.getModel(),[L]=c.OnTypeFormattingEditProviderRegistry.ordered(y);if(!(!L||!L.autoFormatTriggerCharacters)){let I=new d.CharacterSet;for(let k of L.autoFormatTriggerCharacters)I.add(k.charCodeAt(0));this._callOnModel.add(this._editor.onDidType(k=>{let E=k.charCodeAt(k.length-1);I.has(E)&&this._trigger(String.fromCharCode(E))}))}}}_trigger(y){if(!!this._editor.hasModel()&&!(this._editor.getSelections().length>1)){const L=this._editor.getModel(),I=this._editor.getPosition();let k=!1;const E=this._editor.onDidChangeModelContent(T=>{if(T.isFlush){k=!0,E.dispose();return}for(let O=0,A=T.changes.length;O{E.dispose(),!k&&b.isNonEmptyArray(T)&&(a.FormattingEdit.execute(this._editor,T,!0),s.alertFormattingEdits(T))},T=>{throw E.dispose(),T})}}};h.ID="editor.contrib.autoFormat",h=Me([_e(1,o.IEditorWorkerService)],h);let m=class{constructor(y,L){this.editor=y,this._instantiationService=L,this._callOnDispose=new w.DisposableStore,this._callOnModel=new w.DisposableStore,this._callOnDispose.add(y.onDidChangeConfiguration(()=>this._update())),this._callOnDispose.add(y.onDidChangeModel(()=>this._update())),this._callOnDispose.add(y.onDidChangeModelLanguage(()=>this._update())),this._callOnDispose.add(c.DocumentRangeFormattingEditProviderRegistry.onDidChange(this._update,this))}dispose(){this._callOnDispose.dispose(),this._callOnModel.dispose()}_update(){this._callOnModel.clear(),!!this.editor.getOption(42)&&(!this.editor.hasModel()||!c.DocumentRangeFormattingEditProviderRegistry.has(this.editor.getModel())||this._callOnModel.add(this.editor.onDidPaste(({range:y})=>this._trigger(y))))}_trigger(y){!this.editor.hasModel()||this.editor.getSelections().length>1||this._instantiationService.invokeFunction(s.formatDocumentRangesWithSelectedProvider,this.editor,y,2,l.Progress.None,N.CancellationToken.None).catch(t.onUnexpectedError)}};m.ID="editor.contrib.formatOnPaste",m=Me([_e(1,n.IInstantiationService)],m);class _ extends S.EditorAction{constructor(){super({id:"editor.action.formatDocument",label:u.localize(0,null),alias:"Format Document",precondition:i.ContextKeyExpr.and(p.EditorContextKeys.notInCompositeEditor,p.EditorContextKeys.writable,p.EditorContextKeys.hasDocumentFormattingProvider),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:1024|512|36,linux:{primary:2048|1024|39},weight:100},contextMenuOpts:{group:"1_modification",order:1.3}})}run(y,L){return Ie(this,void 0,void 0,function*(){if(L.hasModel()){const I=y.get(n.IInstantiationService);yield y.get(l.IEditorProgressService).showWhile(I.invokeFunction(s.formatDocumentWithSelectedProvider,L,1,l.Progress.None,N.CancellationToken.None),250)}})}}class f extends S.EditorAction{constructor(){super({id:"editor.action.formatSelection",label:u.localize(1,null),alias:"Format Selection",precondition:i.ContextKeyExpr.and(p.EditorContextKeys.writable,p.EditorContextKeys.hasDocumentSelectionFormattingProvider),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:M.KeyChord(2048|41,2048|36),weight:100},contextMenuOpts:{when:p.EditorContextKeys.hasNonEmptySelection,group:"1_modification",order:1.31}})}run(y,L){return Ie(this,void 0,void 0,function*(){if(!!L.hasModel()){const I=y.get(n.IInstantiationService),k=L.getModel(),E=L.getSelections().map(O=>O.isEmpty()?new g.Range(O.startLineNumber,1,O.startLineNumber,k.getLineMaxColumn(O.startLineNumber)):O);yield y.get(l.IEditorProgressService).showWhile(I.invokeFunction(s.formatDocumentRangesWithSelectedProvider,L,E,1,l.Progress.None,N.CancellationToken.None),250)}})}}S.registerEditorContribution(h.ID,h),S.registerEditorContribution(m.ID,m),S.registerEditorAction(_),S.registerEditorAction(f),r.CommandsRegistry.registerCommand("editor.action.format",v=>Ie(void 0,void 0,void 0,function*(){const y=v.get(C.ICodeEditorService).getFocusedCodeEditor();if(!(!y||!y.hasModel())){const L=v.get(r.ICommandService);y.getSelection().isEmpty()?yield L.executeCommand("editor.action.formatDocument"):yield L.executeCommand("editor.action.formatSelection")}}))}),define(Q[262],J([0,1,23,12,13,18]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getReferencesAtPosition=e.getTypeDefinitionsAtPosition=e.getImplementationsAtPosition=e.getDeclarationsAtPosition=e.getDefinitionsAtPosition=void 0;function S(o,s,a,u){const i=a.ordered(o).map(n=>Promise.resolve(u(n,o,s)).then(void 0,t=>{N.onUnexpectedExternalError(t)}));return Promise.all(i).then(n=>{const t=[];for(let l of n)Array.isArray(l)?t.push(...l):l&&t.push(l);return t})}function C(o,s,a){return S(o,s,w.DefinitionProviderRegistry,(u,r,i)=>u.provideDefinition(r,i,a))}e.getDefinitionsAtPosition=C;function d(o,s,a){return S(o,s,w.DeclarationProviderRegistry,(u,r,i)=>u.provideDeclaration(r,i,a))}e.getDeclarationsAtPosition=d;function g(o,s,a){return S(o,s,w.ImplementationProviderRegistry,(u,r,i)=>u.provideImplementation(r,i,a))}e.getImplementationsAtPosition=g;function p(o,s,a){return S(o,s,w.TypeDefinitionProviderRegistry,(u,r,i)=>u.provideTypeDefinition(r,i,a))}e.getTypeDefinitionsAtPosition=p;function c(o,s,a,u){return S(o,s,w.ReferenceProviderRegistry,(r,i,n)=>Ie(this,void 0,void 0,function*(){const t=yield r.provideReferences(i,n,{includeDeclaration:!0},u);if(!a||!t||t.length!==2)return t;const l=yield r.provideReferences(i,n,{includeDeclaration:!1},u);return l&&l.length===1?l:t}))}e.getReferencesAtPosition=c,M.registerModelAndPositionCommand("_executeDefinitionProvider",(o,s)=>C(o,s,b.CancellationToken.None)),M.registerModelAndPositionCommand("_executeDeclarationProvider",(o,s)=>d(o,s,b.CancellationToken.None)),M.registerModelAndPositionCommand("_executeImplementationProvider",(o,s)=>g(o,s,b.CancellationToken.None)),M.registerModelAndPositionCommand("_executeTypeDefinitionProvider",(o,s)=>p(o,s,b.CancellationToken.None)),M.registerModelAndPositionCommand("_executeReferenceProvider",(o,s)=>c(o,s,!1,b.CancellationToken.None))}),define(Q[625],J([0,1,16,9,74,86,13,28,3,2,6,487,37,32,44]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ISymbolNavigationService=e.ctxHasSymbols=void 0,e.ctxHasSymbols=new b.RawContextKey("hasSymbols",!1),e.ISymbolNavigationService=N.createDecorator("ISymbolNavigationService");let u=class{constructor(n,t,l,h){this._editorService=t,this._notificationService=l,this._keybindingService=h,this._currentModel=void 0,this._currentIdx=-1,this._ignoreEditorChange=!1,this._ctxHasSymbols=e.ctxHasSymbols.bindTo(n)}reset(){var n,t;this._ctxHasSymbols.reset(),(n=this._currentState)===null||n===void 0||n.dispose(),(t=this._currentMessage)===null||t===void 0||t.dispose(),this._currentModel=void 0,this._currentIdx=-1}put(n){const t=n.parent.parent;if(t.references.length<=1){this.reset();return}this._currentModel=t,this._currentIdx=t.references.indexOf(n),this._ctxHasSymbols.set(!0),this._showMessage();const l=new r(this._editorService),h=l.onDidChange(m=>{if(!this._ignoreEditorChange){const _=this._editorService.getActiveCodeEditor();if(!!_){const f=_.getModel(),v=_.getPosition();if(!(!f||!v)){let y=!1,L=!1;for(const I of t.references)if(a.isEqual(I.uri,f.uri))y=!0,L=L||d.Range.containsPosition(I.range,v);else if(y)break;(!y||!L)&&this.reset()}}}});this._currentState=g.combinedDisposable(l,h)}revealNext(n){if(!this._currentModel)return Promise.resolve();this._currentIdx+=1,this._currentIdx%=this._currentModel.references.length;const t=this._currentModel.references[this._currentIdx];return this._showMessage(),this._ignoreEditorChange=!0,this._editorService.openCodeEditor({resource:t.uri,options:{selection:d.Range.collapseToStart(t.range),selectionRevealType:3}},n).finally(()=>{this._ignoreEditorChange=!1})}_showMessage(){var n;(n=this._currentMessage)===null||n===void 0||n.dispose();const t=this._keybindingService.lookupKeybinding("editor.gotoNextSymbolFromResult"),l=t?c.localize(0,null,this._currentIdx+1,this._currentModel.references.length,t.getLabel()):c.localize(1,null,this._currentIdx+1,this._currentModel.references.length);this._currentMessage=this._notificationService.status(l)}};u=Me([_e(0,b.IContextKeyService),_e(1,C.ICodeEditorService),_e(2,s.INotificationService),_e(3,o.IKeybindingService)],u),M.registerSingleton(e.ISymbolNavigationService,u,!0),S.registerEditorCommand(new class extends S.EditorCommand{constructor(){super({id:"editor.gotoNextSymbolFromResult",precondition:e.ctxHasSymbols,kbOpts:{weight:100,primary:70}})}runEditorCommand(i,n){return i.get(e.ISymbolNavigationService).revealNext(n)}}),w.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"editor.gotoNextSymbolFromResult.cancel",weight:100,when:e.ctxHasSymbols,primary:9,handler(i){i.get(e.ISymbolNavigationService).reset()}});let r=class{constructor(n){this._listener=new Map,this._disposables=new g.DisposableStore,this._onDidChange=new p.Emitter,this.onDidChange=this._onDidChange.event,this._disposables.add(n.onCodeEditorRemove(this._onDidRemoveEditor,this)),this._disposables.add(n.onCodeEditorAdd(this._onDidAddEditor,this)),n.listCodeEditors().forEach(this._onDidAddEditor,this)}dispose(){this._disposables.dispose(),this._onDidChange.dispose(),g.dispose(this._listener.values())}_onDidAddEditor(n){this._listener.set(n,g.combinedDisposable(n.onDidChangeCursorPosition(t=>this._onDidChange.fire({editor:n})),n.onDidChangeModelContent(t=>this._onDidChange.fire({editor:n}))))}_onDidRemoveEditor(n){var t;(t=this._listener.get(n))===null||t===void 0||t.dispose(),this._listener.delete(n)}};r=Me([_e(0,C.ICodeEditorService)],r)}),define(Q[626],J([0,1,19,23,12,13,18]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getHover=void 0;function C(g,p,c){const s=S.HoverProviderRegistry.ordered(g).map(a=>Promise.resolve(a.provideHover(g,p,c)).then(u=>u&&d(u)?u:void 0,u=>{M.onUnexpectedExternalError(u)}));return Promise.all(s).then(b.coalesce)}e.getHover=C,w.registerModelAndPositionCommand("_executeHoverProvider",(g,p)=>C(g,p,N.CancellationToken.None));function d(g){const p=typeof g.range!="undefined",c=typeof g.contents!="undefined"&&g.contents&&g.contents.length>0;return p&&c}}),define(Q[627],J([0,1,489,7,73,2,3,140,19,58,57,18,626,14]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkdownHoverParticipant=e.MarkdownHover=void 0;const a=N.$;class u{constructor(n,t){this.range=n,this.contents=t}equals(n){return n instanceof u?M.markedStringsEquals(this.contents,n.contents):!1}}e.MarkdownHover=u;let r=class{constructor(n,t,l,h){this._editor=n,this._hover=t,this._modeService=l,this._openerService=h}createLoadingMessage(n){return new u(n,[new M.MarkdownString().appendText(b.localize(0,null))])}computeSync(n,t){if(!this._editor.hasModel())return[];const l=this._editor.getModel(),h=n.startLineNumber,m=l.getLineMaxColumn(h),_=[];for(const f of t){const v=f.range.startLineNumber===h?f.range.startColumn:1,y=f.range.endLineNumber===h?f.range.endColumn:m,L=f.options.hoverMessage;if(!(!L||M.isEmptyMarkdownString(L))){const I=new S.Range(n.startLineNumber,v,n.startLineNumber,y);_.push(new u(I,d.asArray(L)))}}return _}computeAsync(n,t){return Ie(this,void 0,void 0,function*(){if(!this._editor.hasModel()||!n)return Promise.resolve([]);const l=this._editor.getModel();if(!c.HoverProviderRegistry.has(l))return Promise.resolve([]);const h=yield o.getHover(l,new s.Position(n.startLineNumber,n.startColumn),t),m=[];for(const _ of h)if(!M.isEmptyMarkdownString(_.contents)){const f=_.range?S.Range.lift(_.range):n;m.push(new u(f,_.contents))}return m})}renderHoverParts(n,t){const l=new w.DisposableStore;for(const h of n)for(const m of h.contents)if(!M.isEmptyMarkdownString(m)){const _=a("div.hover-row.markdown-hover"),f=N.append(_,a("div.hover-contents")),v=l.add(new C.MarkdownRenderer({editor:this._editor},this._modeService,this._openerService));l.add(v.onDidRenderAsync(()=>{f.className="hover-contents code-hover-contents",this._hover.onContentsChanged()}));const y=l.add(v.render(m));f.appendChild(y.element),t.appendChild(_)}return l}};r=Me([_e(2,p.IModeService),_e(3,g.IOpenerService)],r),e.MarkdownHoverParticipant=r}),define(Q[628],J([0,1,491,3,21,25,13,75,409,70,11,49,31,15,12]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let u=class Ct{constructor(t,l){this.decorationIds=[],this.editor=t,this.editorWorkerService=l}static get(t){return t.getContribution(Ct.ID)}dispose(){}run(t,l){this.currentRequest&&this.currentRequest.cancel();const h=this.editor.getSelection(),m=this.editor.getModel();if(!(!m||!h)){let _=h;if(_.startLineNumber===_.endLineNumber){const f=new g.EditorState(this.editor,1|4),v=m.uri;return this.editorWorkerService.canNavigateValueSet(v)?(this.currentRequest=s.createCancelablePromise(y=>this.editorWorkerService.navigateValueSet(v,_,l)),this.currentRequest.then(y=>{if(!(!y||!y.range||!y.value)&&!!f.validate(this.editor)){let L=N.Range.lift(y.range),I=y.range,k=y.value.length-(_.endColumn-_.startColumn);I={startLineNumber:I.startLineNumber,startColumn:I.startColumn,endLineNumber:I.endLineNumber,endColumn:I.startColumn+y.value.length},k>1&&(_=new M.Selection(_.startLineNumber,_.startColumn,_.endLineNumber,_.endColumn+k-1));const E=new d.InPlaceReplaceCommand(L,_,y.value);this.editor.pushUndoStop(),this.editor.executeCommand(t,E),this.editor.pushUndoStop(),this.decorationIds=this.editor.deltaDecorations(this.decorationIds,[{range:I,options:Ct.DECORATION}]),this.decorationRemover&&this.decorationRemover.cancel(),this.decorationRemover=s.timeout(350),this.decorationRemover.then(()=>this.decorationIds=this.editor.deltaDecorations(this.decorationIds,[])).catch(a.onUnexpectedError)}}).catch(a.onUnexpectedError)):Promise.resolve(void 0)}}}};u.ID="editor.contrib.inPlaceReplaceController",u.DECORATION=o.ModelDecorationOptions.register({className:"valueSetReplacement"}),u=Me([_e(1,C.IEditorWorkerService)],u);class r extends S.EditorAction{constructor(){super({id:"editor.action.inPlaceReplace.up",label:b.localize(0,null),alias:"Replace with Previous Value",precondition:w.EditorContextKeys.writable,kbOpts:{kbExpr:w.EditorContextKeys.editorTextFocus,primary:2048|1024|82,weight:100}})}run(t,l){const h=u.get(l);return h?h.run(this.id,!0):Promise.resolve(void 0)}}class i extends S.EditorAction{constructor(){super({id:"editor.action.inPlaceReplace.down",label:b.localize(1,null),alias:"Replace with Next Value",precondition:w.EditorContextKeys.writable,kbOpts:{kbExpr:w.EditorContextKeys.editorTextFocus,primary:2048|1024|84,weight:100}})}run(t,l){const h=u.get(l);return h?h.run(this.id,!1):Promise.resolve(void 0)}}S.registerEditorContribution(u.ID,u),S.registerEditorAction(r),S.registerEditorAction(i),p.registerThemingParticipant((n,t)=>{const l=n.getColor(c.editorBracketMatchBorder);l&&t.addRule(`.monaco-editor.vs .valueSetReplacement { outline: solid 2px ${l}; }`)})}),define(Q[629],J([0,1,492,2,8,13,179,62,3,21,25,31,41,36,229,78]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentationToTabsCommand=e.IndentationToSpacesCommand=e.AutoIndentOnPaste=e.AutoIndentOnPasteCommand=e.ReindentSelectedLinesAction=e.ReindentLinesAction=e.DetectIndentation=e.IndentUsingSpaces=e.IndentUsingTabs=e.ChangeIndentationSizeAction=e.IndentationToTabsAction=e.IndentationToSpacesAction=e.getReindentEditOperations=void 0;function r(E,T,O,A){if(E.getLineCount()===1&&E.getLineMaxColumn(1)===1)return[];let B=o.LanguageConfigurationRegistry.getIndentationRules(E.getLanguageIdentifier().id);if(!B)return[];for(O=Math.min(O,E.getLineCount());T<=O&&B.unIndentedLinePattern;){let le=E.getLineContent(T);if(!B.unIndentedLinePattern.test(le))break;T++}if(T>O-1)return[];const{tabSize:F,indentSize:D,insertSpaces:R}=E.getOptions(),W=(le,X)=>(X=X||1,S.ShiftCommand.shiftIndent(le,le.length+X,F,D,R)),x=(le,X)=>(X=X||1,S.ShiftCommand.unshiftIndent(le,le.length+X,F,D,R));let K=[],Y,ee=E.getLineContent(T),se=ee;if(A!=null){Y=A;let le=M.getLeadingWhitespace(ee);se=Y+ee.substring(le.length),B.decreaseIndentPattern&&B.decreaseIndentPattern.test(se)&&(Y=x(Y),se=Y+ee.substring(le.length)),ee!==se&&K.push(C.EditOperation.replaceMove(new g.Selection(T,1,T,le.length+1),c.TextModel.normalizeIndentation(Y,D,R)))}else Y=M.getLeadingWhitespace(ee);let ne=Y;B.increaseIndentPattern&&B.increaseIndentPattern.test(se)?(ne=W(ne),Y=W(Y)):B.indentNextLinePattern&&B.indentNextLinePattern.test(se)&&(ne=W(ne)),T++;for(let le=T;le<=O;le++){let X=E.getLineContent(le),z=M.getLeadingWhitespace(X),P=ne+X.substring(z.length);B.decreaseIndentPattern&&B.decreaseIndentPattern.test(P)&&(ne=x(ne),Y=x(Y)),z!==ne&&K.push(C.EditOperation.replaceMove(new g.Selection(le,1,le,z.length+1),c.TextModel.normalizeIndentation(ne,D,R))),!(B.unIndentedLinePattern&&B.unIndentedLinePattern.test(X))&&(B.increaseIndentPattern&&B.increaseIndentPattern.test(P)?(Y=W(Y),ne=Y):B.indentNextLinePattern&&B.indentNextLinePattern.test(P)?ne=W(ne):ne=Y)}return K}e.getReindentEditOperations=r;class i extends w.EditorAction{constructor(){super({id:i.ID,label:b.localize(0,null),alias:"Convert Indentation to Spaces",precondition:p.EditorContextKeys.writable})}run(T,O){let A=O.getModel();if(!!A){let B=A.getOptions(),F=O.getSelection();if(!!F){const D=new I(F,B.tabSize);O.pushUndoStop(),O.executeCommands(this.id,[D]),O.pushUndoStop(),A.updateOptions({insertSpaces:!0})}}}}e.IndentationToSpacesAction=i,i.ID="editor.action.indentationToSpaces";class n extends w.EditorAction{constructor(){super({id:n.ID,label:b.localize(1,null),alias:"Convert Indentation to Tabs",precondition:p.EditorContextKeys.writable})}run(T,O){let A=O.getModel();if(!!A){let B=A.getOptions(),F=O.getSelection();if(!!F){const D=new k(F,B.tabSize);O.pushUndoStop(),O.executeCommands(this.id,[D]),O.pushUndoStop(),A.updateOptions({insertSpaces:!1})}}}}e.IndentationToTabsAction=n,n.ID="editor.action.indentationToTabs";class t extends w.EditorAction{constructor(T,O){super(O);this.insertSpaces=T}run(T,O){const A=T.get(u.IQuickInputService),B=T.get(s.IModelService);let F=O.getModel();if(!!F){let D=B.getCreationOptions(F.getLanguageIdentifier().language,F.uri,F.isForSimpleWidget);const R=[1,2,3,4,5,6,7,8].map(x=>({id:x.toString(),label:x.toString(),description:x===D.tabSize?b.localize(2,null):void 0})),W=Math.min(F.getOptions().tabSize-1,7);setTimeout(()=>{A.pick(R,{placeHolder:b.localize(3,null),activeItem:R[W]}).then(x=>{x&&F&&!F.isDisposed()&&F.updateOptions({tabSize:parseInt(x.label,10),insertSpaces:this.insertSpaces})})},50)}}}e.ChangeIndentationSizeAction=t;class l extends t{constructor(){super(!1,{id:l.ID,label:b.localize(4,null),alias:"Indent Using Tabs",precondition:void 0})}}e.IndentUsingTabs=l,l.ID="editor.action.indentUsingTabs";class h extends t{constructor(){super(!0,{id:h.ID,label:b.localize(5,null),alias:"Indent Using Spaces",precondition:void 0})}}e.IndentUsingSpaces=h,h.ID="editor.action.indentUsingSpaces";class m extends w.EditorAction{constructor(){super({id:m.ID,label:b.localize(6,null),alias:"Detect Indentation from Content",precondition:void 0})}run(T,O){const A=T.get(s.IModelService);let B=O.getModel();if(!!B){let F=A.getCreationOptions(B.getLanguageIdentifier().language,B.uri,B.isForSimpleWidget);B.detectIndentation(F.insertSpaces,F.tabSize)}}}e.DetectIndentation=m,m.ID="editor.action.detectIndentation";class _ extends w.EditorAction{constructor(){super({id:"editor.action.reindentlines",label:b.localize(7,null),alias:"Reindent Lines",precondition:p.EditorContextKeys.writable})}run(T,O){let A=O.getModel();if(!!A){let B=r(A,1,A.getLineCount());B.length>0&&(O.pushUndoStop(),O.executeEdits(this.id,B),O.pushUndoStop())}}}e.ReindentLinesAction=_;class f extends w.EditorAction{constructor(){super({id:"editor.action.reindentselectedlines",label:b.localize(8,null),alias:"Reindent Selected Lines",precondition:p.EditorContextKeys.writable})}run(T,O){let A=O.getModel();if(!!A){let B=O.getSelections();if(B!==null){let F=[];for(let D of B){let R=D.startLineNumber,W=D.endLineNumber;if(R!==W&&D.endColumn===1&&W--,R===1){if(R===W)continue}else R--;let x=r(A,R,W);F.push(...x)}F.length>0&&(O.pushUndoStop(),O.executeEdits(this.id,F),O.pushUndoStop())}}}}e.ReindentSelectedLinesAction=f;class v{constructor(T,O){this._initialSelection=O,this._edits=[],this._selectionId=null;for(let A of T)A.range&&typeof A.text=="string"&&this._edits.push(A)}getEditOperations(T,O){for(let B of this._edits)O.addEditOperation(d.Range.lift(B.range),B.text);let A=!1;Array.isArray(this._edits)&&this._edits.length===1&&this._initialSelection.isEmpty()&&(this._edits[0].range.startColumn===this._initialSelection.endColumn&&this._edits[0].range.startLineNumber===this._initialSelection.endLineNumber?(A=!0,this._selectionId=O.trackSelection(this._initialSelection,!0)):this._edits[0].range.endColumn===this._initialSelection.startColumn&&this._edits[0].range.endLineNumber===this._initialSelection.startLineNumber&&(A=!0,this._selectionId=O.trackSelection(this._initialSelection,!1))),A||(this._selectionId=O.trackSelection(this._initialSelection))}computeCursorState(T,O){return O.getTrackedSelection(this._selectionId)}}e.AutoIndentOnPasteCommand=v;class y{constructor(T){this.callOnDispose=new N.DisposableStore,this.callOnModel=new N.DisposableStore,this.editor=T,this.callOnDispose.add(T.onDidChangeConfiguration(()=>this.update())),this.callOnDispose.add(T.onDidChangeModel(()=>this.update())),this.callOnDispose.add(T.onDidChangeModelLanguage(()=>this.update()))}update(){this.callOnModel.clear(),!(this.editor.getOption(8)<4||this.editor.getOption(42))&&(!this.editor.hasModel()||this.callOnModel.add(this.editor.onDidPaste(({range:T})=>{this.trigger(T)})))}trigger(T){let O=this.editor.getSelections();if(!(O===null||O.length>1)){const A=this.editor.getModel();if(!!A&&!!A.isCheapToTokenize(T.getStartPosition().lineNumber)){const B=this.editor.getOption(8),{tabSize:F,indentSize:D,insertSpaces:R}=A.getOptions();let W=[],x={shiftIndent:se=>S.ShiftCommand.shiftIndent(se,se.length+1,F,D,R),unshiftIndent:se=>S.ShiftCommand.unshiftIndent(se,se.length+1,F,D,R)},K=T.startLineNumber;for(;K<=T.endLineNumber;){if(this.shouldIgnoreLine(A,K)){K++;continue}break}if(!(K>T.endLineNumber)){let Y=A.getLineContent(K);if(!/\S/.test(Y.substring(0,T.startColumn-1))){let se=o.LanguageConfigurationRegistry.getGoodIndentForLine(B,A,A.getLanguageIdentifier().id,K,x);if(se!==null){let ne=M.getLeadingWhitespace(Y),le=a.getSpaceCnt(se,F),X=a.getSpaceCnt(ne,F);if(le!==X){let z=a.generateIndent(le,F,R);W.push({range:new d.Range(K,1,K,ne.length+1),text:z}),Y=z+Y.substr(ne.length)}else{let z=o.LanguageConfigurationRegistry.getIndentMetadata(A,K);if(z===0||z===8)return}}}const ee=K;for(;KA.getLineTokens(le),getLanguageIdentifier:()=>A.getLanguageIdentifier(),getLanguageIdAtPosition:(le,X)=>A.getLanguageIdAtPosition(le,X),getLineContent:le=>le===ee?Y:A.getLineContent(le)},ne=o.LanguageConfigurationRegistry.getGoodIndentForLine(B,se,A.getLanguageIdentifier().id,K+1,x);if(ne!==null){let le=a.getSpaceCnt(ne,F),X=a.getSpaceCnt(M.getLeadingWhitespace(A.getLineContent(K+1)),F);if(le!==X){let z=le-X;for(let P=K+1;P<=T.endLineNumber;P++){let V=A.getLineContent(P),U=M.getLeadingWhitespace(V),$=a.getSpaceCnt(U,F)+z,ie=a.generateIndent($,F,R);ie!==U&&W.push({range:new d.Range(P,1,P,U.length+1),text:ie})}}}}if(W.length>0){this.editor.pushUndoStop();let se=new v(W,this.editor.getSelection());this.editor.executeCommand("autoIndentOnPaste",se),this.editor.pushUndoStop()}}}}}shouldIgnoreLine(T,O){T.forceTokenization(O);let A=T.getLineFirstNonWhitespaceColumn(O);if(A===0)return!0;let B=T.getLineTokens(O);if(B.getCount()>0){let F=B.findTokenIndexAtOffset(A);if(F>=0&&B.getStandardTokenType(F)===1)return!0}return!1}dispose(){this.callOnDispose.dispose(),this.callOnModel.dispose()}}e.AutoIndentOnPaste=y,y.ID="editor.contrib.autoIndentOnPaste";function L(E,T,O,A){if(!(E.getLineCount()===1&&E.getLineMaxColumn(1)===1)){let B="";for(let D=0;Df.map(E=>Promise.resolve(k.provideInlineHints(_,E,v)).then(T=>{T&&y.push({list:T,provider:k})},T=>{N.onUnexpectedExternalError(T)}))));return yield Promise.all(I),y})}e.getInlineHints=h;let m=class{constructor(f,v,y){this._editor=f,this._codeEditorService=v,this._themeService=y,this._disposables=new w.DisposableStore,this._sessionDisposables=new w.DisposableStore,this._getInlineHintsDelays=new a.LanguageFeatureRequestDelays(d.InlineHintsProviderRegistry,250,2500),this._decorationsTypeIds=[],this._decorationIds=[],this._disposables.add(d.InlineHintsProviderRegistry.onDidChange(()=>this._update())),this._disposables.add(y.onDidColorThemeChange(()=>this._update())),this._disposables.add(f.onDidChangeModel(()=>this._update())),this._disposables.add(f.onDidChangeModelLanguage(()=>this._update())),this._disposables.add(f.onDidChangeConfiguration(L=>{L.hasChanged(120)&&this._update()})),this._update()}dispose(){this._sessionDisposables.dispose(),this._removeAllDecorations(),this._disposables.dispose()}_update(){if(this._sessionDisposables.clear(),!this._editor.getOption(120).enabled){this._removeAllDecorations();return}const f=this._editor.getModel();if(!f||!d.InlineHintsProviderRegistry.has(f)){this._removeAllDecorations();return}const v=new b.RunOnceScheduler(()=>Ie(this,void 0,void 0,function*(){const L=Date.now(),I=new c.CancellationTokenSource;this._sessionDisposables.add(w.toDisposable(()=>I.dispose(!0)));const k=this._editor.getVisibleRangesPlusViewportAboveBelow(),E=yield h(f,k,I.token),T=this._getInlineHintsDelays.update(f,Date.now()-L);v.delay=T,this._updateHintsDecorators(E)}),this._getInlineHintsDelays.get(f));this._sessionDisposables.add(v),this._sessionDisposables.add(this._editor.onDidChangeModelContent(()=>v.schedule())),this._disposables.add(this._editor.onDidScrollChange(()=>v.schedule())),v.schedule();const y=new w.DisposableStore;this._sessionDisposables.add(y);for(const L of d.InlineHintsProviderRegistry.all(f))typeof L.onDidChangeInlineHints=="function"&&y.add(L.onDidChangeInlineHints(()=>v.schedule()))}_updateHintsDecorators(f){const{fontSize:v,fontFamily:y}=this._getLayoutInfo(),L=this._themeService.getColorTheme().getColor(p.editorInlineHintBackground),I=this._themeService.getColorTheme().getColor(p.editorInlineHintForeground),k=[],E=[];for(const{list:T}of f)for(let O=0;Ov)&&(y=v*.9|0);const L=f.fontFamily;return{fontSize:y,fontFamily:L}}_removeAllDecorations(){this._decorationIds=this._editor.deltaDecorations(this._decorationIds,[]),this._decorationsTypeIds.forEach(this._codeEditorService.removeDecorationType,this._codeEditorService),this._decorationsTypeIds=[]}};m.ID="editor.contrib.InlineHints",m=Me([_e(1,C.ICodeEditorService),_e(2,o.IThemeService)],m),e.InlineHintsController=m,S.registerEditorContribution(m.ID,m),r.CommandsRegistry.registerCommand("_executeInlineHintProvider",(_,...f)=>Ie(void 0,void 0,void 0,function*(){const[v,y]=f;n.assertType(i.URI.isUri(v)),n.assertType(s.Range.isIRange(y));const L=yield _.get(t.ITextModelService).createModelReference(v);try{const I=yield h(L.object.textEditorModel,[s.Range.lift(y)],c.CancellationToken.None);return g.flatten(I.map(k=>k.list)).sort((k,E)=>s.Range.compareRangesUsingStarts(k.range,E.range))}finally{L.dispose()}}))}),define(Q[631],J([0,1,493,39,188,13,92,366,182,62,14,3,21,25,410,542,411,34]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnakeCaseAction=e.TitleCaseAction=e.LowerCaseAction=e.UpperCaseAction=e.AbstractCaseAction=e.TransposeAction=e.JoinLinesAction=e.DeleteAllRightAction=e.DeleteAllLeftAction=e.AbstractDeleteAllToBoundaryAction=e.InsertLineAfterAction=e.InsertLineBeforeAction=e.IndentLinesAction=e.DeleteLinesAction=e.TrimTrailingWhitespaceAction=e.SortLinesDescendingAction=e.SortLinesAscendingAction=e.AbstractSortLinesAction=e.DuplicateSelectionAction=void 0;class n extends w.EditorAction{constructor(le,X){super(X);this.down=le}run(le,X){if(!!X.hasModel()){const z=X.getSelections().map((U,H)=>({selection:U,index:H,ignore:!1}));z.sort((U,H)=>c.Range.compareRangesUsingStarts(U.selection,H.selection));let P=z[0];for(let U=1;Unew p.Position(H.positionLineNumber,H.positionColumn)));let V=X.getSelection();if(V!==null){let U=new C.TrimTrailingWhitespaceCommand(V,P);X.pushUndoStop(),X.executeCommands(this.id,[U]),X.pushUndoStop()}}}e.TrimTrailingWhitespaceAction=I,I.ID="editor.action.trimTrailingWhitespace";class k extends w.EditorAction{constructor(){super({id:"editor.action.deleteLines",label:b.localize(13,null),alias:"Delete Line",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.textInputFocus,primary:2048|1024|41,weight:100}})}run(le,X){if(!!X.hasModel()){let z=this._getLinesToRemove(X),P=X.getModel();if(!(P.getLineCount()===1&&P.getLineMaxColumn(1)===1)){let V=0,U=[],H=[];for(let $=0,ie=z.length;$1&&(ae-=1,j=P.getLineMaxColumn(ae)),U.push(g.EditOperation.replace(new o.Selection(ae,j,G,te),"")),H.push(new o.Selection(ae-V,oe.positionColumn,ae-V,oe.positionColumn)),V+=oe.endLineNumber-oe.startLineNumber+1}X.pushUndoStop(),X.executeEdits(this.id,U,H),X.pushUndoStop()}}}_getLinesToRemove(le){let X=le.getSelections().map(V=>{let U=V.endLineNumber;return V.startLineNumberV.startLineNumber===U.startLineNumber?V.endLineNumber-U.endLineNumber:V.startLineNumber-U.startLineNumber);let z=[],P=X[0];for(let V=1;V=X[V].startLineNumber?P.endLineNumber=X[V].endLineNumber:(z.push(P),P=X[V]);return z.push(P),z}}e.DeleteLinesAction=k;class E extends w.EditorAction{constructor(){super({id:"editor.action.indentLines",label:b.localize(14,null),alias:"Indent Line",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|89,weight:100}})}run(le,X){const z=X._getViewModel();!z||(X.pushUndoStop(),X.executeCommands(this.id,d.TypeOperations.indent(z.cursorConfig,X.getModel(),X.getSelections())),X.pushUndoStop())}}e.IndentLinesAction=E;class T extends w.EditorAction{constructor(){super({id:"editor.action.outdentLines",label:b.localize(15,null),alias:"Outdent Line",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|87,weight:100}})}run(le,X){M.CoreEditingCommands.Outdent.runEditorCommand(le,X,null)}}class O extends w.EditorAction{constructor(){super({id:"editor.action.insertLineBefore",label:b.localize(16,null),alias:"Insert Line Above",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|1024|3,weight:100}})}run(le,X){const z=X._getViewModel();!z||(X.pushUndoStop(),X.executeCommands(this.id,d.TypeOperations.lineInsertBefore(z.cursorConfig,X.getModel(),X.getSelections())))}}e.InsertLineBeforeAction=O;class A extends w.EditorAction{constructor(){super({id:"editor.action.insertLineAfter",label:b.localize(17,null),alias:"Insert Line Below",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|3,weight:100}})}run(le,X){const z=X._getViewModel();!z||(X.pushUndoStop(),X.executeCommands(this.id,d.TypeOperations.lineInsertAfter(z.cursorConfig,X.getModel(),X.getSelections())))}}e.InsertLineAfterAction=A;class B extends w.EditorAction{run(le,X){if(!!X.hasModel()){const z=X.getSelection();let P=this._getRangesToDelete(X),V=[];for(let $=0,ie=P.length-1;$g.EditOperation.replace($,""));X.pushUndoStop(),X.executeEdits(this.id,H,U),X.pushUndoStop()}}}e.AbstractDeleteAllToBoundaryAction=B;class F extends B{constructor(){super({id:"deleteAllLeft",label:b.localize(18,null),alias:"Delete All Left",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.textInputFocus,primary:0,mac:{primary:2048|1},weight:100}})}_getEndCursorState(le,X){let z=null,P=[],V=0;return X.forEach(U=>{let H;if(U.endColumn===1&&V>0){let $=U.startLineNumber-V;H=new o.Selection($,U.startColumn,$,U.startColumn)}else H=new o.Selection(U.startLineNumber,U.startColumn,U.startLineNumber,U.startColumn);V+=U.endLineNumber-U.startLineNumber,U.intersectRanges(le)?z=H:P.push(H)}),z&&P.unshift(z),P}_getRangesToDelete(le){let X=le.getSelections();if(X===null)return[];let z=X,P=le.getModel();return P===null?[]:(z.sort(c.Range.compareRangesUsingStarts),z=z.map(V=>{if(V.isEmpty())if(V.startColumn===1){let U=Math.max(1,V.startLineNumber-1),H=V.startLineNumber===1?1:P.getLineContent(U).length+1;return new c.Range(U,H,V.startLineNumber,1)}else return new c.Range(V.startLineNumber,1,V.startLineNumber,V.startColumn);else return new c.Range(V.startLineNumber,1,V.endLineNumber,V.endColumn)}),z)}}e.DeleteAllLeftAction=F;class D extends B{constructor(){super({id:"deleteAllRight",label:b.localize(19,null),alias:"Delete All Right",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|41,secondary:[2048|20]},weight:100}})}_getEndCursorState(le,X){let z=null,P=[];for(let V=0,U=X.length,H=0;V{if(V.isEmpty()){const U=X.getLineMaxColumn(V.startLineNumber);return V.startColumn===U?new c.Range(V.startLineNumber,V.startColumn,V.startLineNumber+1,1):new c.Range(V.startLineNumber,V.startColumn,V.startLineNumber,U)}return V});return P.sort(c.Range.compareRangesUsingStarts),P}}e.DeleteAllRightAction=D;class R extends w.EditorAction{constructor(){super({id:"editor.action.joinLines",label:b.localize(20,null),alias:"Join Lines",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:0,mac:{primary:256|40},weight:100}})}run(le,X){let z=X.getSelections();if(z!==null){let P=X.getSelection();if(P!==null){z.sort(c.Range.compareRangesUsingStarts);let V=[],U=z.reduce((G,j)=>G.isEmpty()?G.endLineNumber===j.startLineNumber?(P.equalsSelection(G)&&(P=j),j):j.startLineNumber>G.endLineNumber+1?(V.push(G),j):new o.Selection(G.startLineNumber,G.startColumn,j.endLineNumber,j.endColumn):j.startLineNumber>G.endLineNumber?(V.push(G),j):new o.Selection(G.startLineNumber,G.startColumn,j.endLineNumber,j.endColumn));V.push(U);let H=X.getModel();if(H!==null){let $=[],ie=[],oe=P,ae=0;for(let G=0,j=V.length;G=1){let Ee=!0;Ce===""&&(Ee=!1),Ee&&(Ce.charAt(Ce.length-1)===" "||Ce.charAt(Ce.length-1)===" ")&&(Ee=!1,Ce=Ce.replace(/[\s\uFEFF\xA0]+$/g," "));let Ae=De.substr(Re-1);Ce+=(Ee?" ":"")+Ae,Ee?he=Ae.length+1:he=Ae.length}else he=0}let be=new c.Range(Z,ue,re,ce);if(!be.isEmpty()){let Le;te.isEmpty()?($.push(g.EditOperation.replace(be,Ce)),Le=new o.Selection(be.startLineNumber-ae,Ce.length-he+1,Z-ae,Ce.length-he+1)):te.startLineNumber===te.endLineNumber?($.push(g.EditOperation.replace(be,Ce)),Le=new o.Selection(te.startLineNumber-ae,te.startColumn,te.endLineNumber-ae,te.endColumn)):($.push(g.EditOperation.replace(be,Ce)),Le=new o.Selection(te.startLineNumber-ae,te.startColumn,te.startLineNumber-ae,Ce.length-me)),c.Range.intersectRanges(be,P)!==null?oe=Le:ie.push(Le)}ae+=be.endLineNumber-be.startLineNumber}ie.unshift(oe),X.pushUndoStop(),X.executeEdits(this.id,$,ie),X.pushUndoStop()}}}}}e.JoinLinesAction=R;class W extends w.EditorAction{constructor(){super({id:"editor.action.transpose",label:b.localize(21,null),alias:"Transpose characters around the cursor",precondition:s.EditorContextKeys.writable})}run(le,X){let z=X.getSelections();if(z!==null){let P=X.getModel();if(P!==null){let V=[];for(let U=0,H=z.length;U=oe){if(ie.lineNumber===P.getLineCount())continue;let ae=new c.Range(ie.lineNumber,Math.max(1,ie.column-1),ie.lineNumber+1,1),G=P.getValueInRange(ae).split("").reverse().join("");V.push(new S.ReplaceCommand(new o.Selection(ie.lineNumber,Math.max(1,ie.column-1),ie.lineNumber+1,1),G))}else{let ae=new c.Range(ie.lineNumber,Math.max(1,ie.column-1),ie.lineNumber,ie.column+1),G=P.getValueInRange(ae).split("").reverse().join("");V.push(new S.ReplaceCommandThatPreservesSelection(ae,G,new o.Selection(ie.lineNumber,ie.column+1,ie.lineNumber,ie.column+1)))}}}X.pushUndoStop(),X.executeCommands(this.id,V),X.pushUndoStop()}}}}e.TransposeAction=W;class x extends w.EditorAction{run(le,X){const z=X.getSelections();if(z!==null){const P=X.getModel();if(P!==null){const V=X.getOption(110),U=[];for(const H of z)if(H.isEmpty()){const $=H.getStartPosition(),ie=X.getConfiguredWordAtPosition($);if(!ie)continue;const oe=new c.Range($.lineNumber,ie.startColumn,$.lineNumber,ie.endColumn),ae=P.getValueInRange(oe);U.push(g.EditOperation.replace(oe,this._modifyText(ae,V)))}else{const $=P.getValueInRange(H);U.push(g.EditOperation.replace(H,this._modifyText($,V)))}X.pushUndoStop(),X.executeEdits(this.id,U),X.pushUndoStop()}}}}e.AbstractCaseAction=x;class K extends x{constructor(){super({id:"editor.action.transformToUppercase",label:b.localize(22,null),alias:"Transform to Uppercase",precondition:s.EditorContextKeys.writable})}_modifyText(le,X){return le.toLocaleUpperCase()}}e.UpperCaseAction=K;class Y extends x{constructor(){super({id:"editor.action.transformToLowercase",label:b.localize(23,null),alias:"Transform to Lowercase",precondition:s.EditorContextKeys.writable})}_modifyText(le,X){return le.toLocaleLowerCase()}}e.LowerCaseAction=Y;class ee extends x{constructor(){super({id:"editor.action.transformToTitlecase",label:b.localize(24,null),alias:"Transform to Title Case",precondition:s.EditorContextKeys.writable})}_modifyText(le,X){const P=(`\r + `+X).split("");let V="",U=!0;for(let H=0;H=0?(U=!0,V+=$):U?(U=!1,V+=$.toLocaleUpperCase()):V+=$.toLocaleLowerCase()}return V}}e.TitleCaseAction=ee;class se extends x{constructor(){super({id:"editor.action.transformToSnakecase",label:b.localize(25,null),alias:"Transform to Snake Case",precondition:s.EditorContextKeys.writable})}_modifyText(le,X){return le.replace(/(\p{Ll})(\p{Lu})/gmu,"$1_$2").replace(/([^\b_])(\p{Lu})(\p{Ll})/gmu,"$1_$2$3").toLocaleLowerCase()}}e.SnakeCaseAction=se,w.registerEditorAction(t),w.registerEditorAction(l),w.registerEditorAction(h),w.registerEditorAction(_),w.registerEditorAction(f),w.registerEditorAction(y),w.registerEditorAction(L),w.registerEditorAction(I),w.registerEditorAction(k),w.registerEditorAction(E),w.registerEditorAction(T),w.registerEditorAction(O),w.registerEditorAction(A),w.registerEditorAction(F),w.registerEditorAction(D),w.registerEditorAction(R),w.registerEditorAction(W),w.registerEditorAction(K),w.registerEditorAction(Y),w.registerEditorAction(ee),w.registerEditorAction(se)}),define(Q[632],J([0,1,494,13,19,2,14,23,3,18,15,31,16,25,24,28,12,8,22,11,29,41]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorLinkedEditingBackground=e.LinkedEditingAction=e.LinkedEditingContribution=e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE=void 0,e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE=new o.RawContextKey("LinkedEditingInputVisible",!1);const m="linked-editing-decoration";let _=class vt extends w.Disposable{constructor(I,k){super();this._debounceDuration=200,this._localToDispose=this._register(new w.DisposableStore),this._editor=I,this._enabled=!1,this._visibleContextKey=e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE.bindTo(k),this._currentDecorations=[],this._languageWordPattern=null,this._currentWordPattern=null,this._ignoreChangeEvent=!1,this._localToDispose=this._register(new w.DisposableStore),this._rangeUpdateTriggerPromise=null,this._rangeSyncTriggerPromise=null,this._currentRequest=null,this._currentRequestPosition=null,this._currentRequestModelVersion=null,this._register(this._editor.onDidChangeModel(()=>this.reinitialize())),this._register(this._editor.onDidChangeConfiguration(E=>{(E.hasChanged(56)||E.hasChanged(76))&&this.reinitialize()})),this._register(g.LinkedEditingRangeProviderRegistry.onDidChange(()=>this.reinitialize())),this._register(this._editor.onDidChangeModelLanguage(()=>this.reinitialize())),this.reinitialize()}static get(I){return I.getContribution(vt.ID)}reinitialize(){const I=this._editor.getModel(),k=I!==null&&(this._editor.getOption(56)||this._editor.getOption(76))&&g.LinkedEditingRangeProviderRegistry.has(I);if(k!==this._enabled&&(this._enabled=k,this.clearRanges(),this._localToDispose.clear(),!(!k||I===null))){this._languageWordPattern=h.LanguageConfigurationRegistry.getWordDefinition(I.getLanguageIdentifier().id),this._localToDispose.add(I.onDidChangeLanguageConfiguration(()=>{this._languageWordPattern=h.LanguageConfigurationRegistry.getWordDefinition(I.getLanguageIdentifier().id)}));const E=new p.Delayer(this._debounceDuration),T=()=>{this._rangeUpdateTriggerPromise=E.trigger(()=>this.updateRanges(),this._debounceDuration)},O=new p.Delayer(0),A=B=>{this._rangeSyncTriggerPromise=O.trigger(()=>this._syncRanges(B))};this._localToDispose.add(this._editor.onDidChangeCursorPosition(()=>{T()})),this._localToDispose.add(this._editor.onDidChangeModelContent(B=>{if(!this._ignoreChangeEvent&&this._currentDecorations.length>0){const F=I.getDecorationRange(this._currentDecorations[0]);if(F&&B.changes.every(D=>F.intersectRanges(D.range))){A(this._currentDecorations);return}}T()})),this._localToDispose.add({dispose:()=>{E.cancel(),O.cancel()}}),this.updateRanges()}}_syncRanges(I){if(!(!this._editor.hasModel()||I!==this._currentDecorations||I.length===0)){const k=this._editor.getModel(),E=k.getDecorationRange(I[0]);if(!E||E.startLineNumber!==E.endLineNumber)return this.clearRanges();const T=k.getValueInRange(E);if(this._currentWordPattern){const A=T.match(this._currentWordPattern);if((A?A[0].length:0)!==T.length)return this.clearRanges()}let O=[];for(let A=1,B=I.length;A1){this.clearRanges();return}const E=this._editor.getModel(),T=E.getVersionId();if(this._currentRequestPosition&&this._currentRequestModelVersion===T){if(k.equals(this._currentRequestPosition))return;if(this._currentDecorations&&this._currentDecorations.length>0){const A=E.getDecorationRange(this._currentDecorations[0]);if(A&&A.containsPosition(k))return}}this._currentRequestPosition=k,this._currentRequestModelVersion=T;const O=p.createCancelablePromise(A=>Ie(this,void 0,void 0,function*(){try{const B=yield y(E,k,A);if(O!==this._currentRequest||(this._currentRequest=null,T!==E.getVersionId()))return;let F=[];(B==null?void 0:B.ranges)&&(F=B.ranges),this._currentWordPattern=(B==null?void 0:B.wordPattern)||this._languageWordPattern;let D=!1;for(let W=0,x=F.length;W({range:W,options:vt.DECORATION}));this._visibleContextKey.set(!0),this._currentDecorations=this._editor.deltaDecorations(this._currentDecorations,R)}catch(B){r.isPromiseCanceledError(B)||r.onUnexpectedError(B),(this._currentRequest===O||!this._currentRequest)&&this.clearRanges()}}));return this._currentRequest=O,O})}};_.ID="editor.contrib.linkedEditing",_.DECORATION=c.ModelDecorationOptions.register({stickiness:0,className:m}),_=Me([_e(1,o.IContextKeyService)],_),e.LinkedEditingContribution=_;class f extends N.EditorAction{constructor(){super({id:"editor.action.linkedEditing",label:b.localize(0,null),alias:"Start Linked Editing",precondition:o.ContextKeyExpr.and(s.EditorContextKeys.writable,s.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|1024|60,weight:100}})}runCommand(I,k){const E=I.get(u.ICodeEditorService),[T,O]=Array.isArray(k)&&k||[void 0,void 0];return a.URI.isUri(T)&&S.Position.isIPosition(O)?E.openCodeEditor({resource:T},E.getActiveCodeEditor()).then(A=>{!A||(A.setPosition(O),A.invokeWithinContext(B=>(this.reportTelemetry(B,A),this.run(B,A))))},r.onUnexpectedError):super.runCommand(I,k)}run(I,k){const E=_.get(k);return E?Promise.resolve(E.updateRanges(!0)):Promise.resolve()}}e.LinkedEditingAction=f;const v=N.EditorCommand.bindToContribution(_.get);N.registerEditorCommand(new v({id:"cancelLinkedEditingInput",precondition:e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE,handler:L=>L.clearRanges(),kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,weight:100+99,primary:9,secondary:[1024|9]}}));function y(L,I,k){const E=g.LinkedEditingRangeProviderRegistry.ordered(L);return p.first(E.map(T=>()=>Ie(this,void 0,void 0,function*(){try{return yield T.provideLinkedEditingRanges(L,I,k)}catch(O){r.onUnexpectedExternalError(O);return}})),T=>!!T&&M.isNonEmptyArray(T==null?void 0:T.ranges))}e.editorLinkedEditingBackground=n.registerColor("editor.linkedEditingBackground",{dark:l.Color.fromHex("#f00").transparent(.3),light:l.Color.fromHex("#f00").transparent(.3),hc:l.Color.fromHex("#f00").transparent(.3)},b.localize(1,null)),t.registerThemingParticipant((L,I)=>{const k=L.getColor(e.editorLinkedEditingBackground);k&&I.addRule(`.monaco-editor .${m} { background: ${k}; border-left-color: ${k}; }`)}),N.registerModelAndPositionCommand("_executeLinkedEditingProvider",(L,I)=>y(L,I,C.CancellationToken.None)),N.registerEditorContribution(_.ID,_),N.registerEditorAction(f)}),define(Q[633],J([0,1,495,15,23,12,73,2,17,13,31,18,227,546,32,58,22,11,24,43,44,346]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinkDetector=void 0;function h(y,L){const I=y.url&&/^command:/i.test(y.url.toString()),k=y.tooltip?y.tooltip:I?b.localize(0,null):b.localize(1,null),E=L?d.isMacintosh?b.localize(2,null):b.localize(3,null):d.isMacintosh?b.localize(4,null):b.localize(5,null);if(y.url){let T="";if(/^command:/i.test(y.url.toString())){const A=y.url.toString().match(/^command:([^?#]+)/);if(A){const B=A[1];T=` "${b.localize(6,null,B)}"`}}return new S.MarkdownString("",!0).appendMarkdown(`[${k}](${y.url.toString(!0)}${T}) (${E})`)}else return new S.MarkdownString().appendText(`${k} (${E})`)}const m={general:p.ModelDecorationOptions.register({stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:"detected-link"}),active:p.ModelDecorationOptions.register({stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:"detected-link-active"})};class _{constructor(L,I){this.link=L,this.decorationId=I}static decoration(L,I){return{range:L.range,options:_._getOptions(L,I,!1)}}static _getOptions(L,I,k){const E=Object.assign({},k?m.active:m.general);return E.hoverMessage=h(L,I),E}activate(L,I){L.changeDecorationOptions(this.decorationId,_._getOptions(this.link,I,!0))}deactivate(L,I){L.changeDecorationOptions(this.decorationId,_._getOptions(this.link,I,!1))}}let f=class bt{constructor(L,I,k){this.listenersToRemove=new C.DisposableStore,this.editor=L,this.openerService=I,this.notificationService=k;let E=new o.ClickLinkGesture(L);this.listenersToRemove.add(E),this.listenersToRemove.add(E.onMouseMoveOrRelevantKeyDown(([T,O])=>{this._onEditorMouseMove(T,O)})),this.listenersToRemove.add(E.onExecute(T=>{this.onEditorMouseUp(T)})),this.listenersToRemove.add(E.onCancel(T=>{this.cleanUpActiveLinkDecoration()})),this.enabled=L.getOption(57),this.listenersToRemove.add(L.onDidChangeConfiguration(T=>{const O=L.getOption(57);this.enabled!==O&&(this.enabled=O,this.updateDecorations([]),this.stop(),this.beginCompute())})),this.listenersToRemove.add(L.onDidChangeModelContent(T=>this.onChange())),this.listenersToRemove.add(L.onDidChangeModel(T=>this.onModelChanged())),this.listenersToRemove.add(L.onDidChangeModelLanguage(T=>this.onModelModeChanged())),this.listenersToRemove.add(c.LinkProviderRegistry.onDidChange(T=>this.onModelModeChanged())),this.timeout=new N.TimeoutTimer,this.computePromise=null,this.activeLinksList=null,this.currentOccurrences={},this.activeLinkDecorationId=null,this.beginCompute()}static get(L){return L.getContribution(bt.ID)}onModelChanged(){this.currentOccurrences={},this.activeLinkDecorationId=null,this.stop(),this.beginCompute()}onModelModeChanged(){this.stop(),this.beginCompute()}onChange(){this.timeout.setIfNotSet(()=>this.beginCompute(),bt.RECOMPUTE_TIME)}beginCompute(){return Ie(this,void 0,void 0,function*(){if(!(!this.editor.hasModel()||!this.enabled)){const L=this.editor.getModel();if(!!c.LinkProviderRegistry.has(L)){this.activeLinksList&&(this.activeLinksList.dispose(),this.activeLinksList=null),this.computePromise=N.createCancelablePromise(I=>s.getLinks(L,I));try{this.activeLinksList=yield this.computePromise,this.updateDecorations(this.activeLinksList.links)}catch(I){w.onUnexpectedError(I)}finally{this.computePromise=null}}}})}updateDecorations(L){const I=this.editor.getOption(64)==="altKey";let k=[],E=Object.keys(this.currentOccurrences);for(let A=0,B=E.length;A{E.activate(T,k),this.activeLinkDecorationId=E.decorationId})}else this.cleanUpActiveLinkDecoration()}cleanUpActiveLinkDecoration(){const L=this.editor.getOption(64)==="altKey";if(this.activeLinkDecorationId){const I=this.currentOccurrences[this.activeLinkDecorationId];I&&this.editor.changeDecorations(k=>{I.deactivate(k,L)}),this.activeLinkDecorationId=null}}onEditorMouseUp(L){if(!!this.isEnabled(L)){const I=this.getLinkOccurrence(L.target.position);!I||this.openLinkOccurrence(I,L.hasSideBySideModifier,!0)}}openLinkOccurrence(L,I,k=!1){if(!!this.openerService){const{link:E}=L;E.resolve(M.CancellationToken.None).then(T=>{if(typeof T=="string"&&this.editor.hasModel()){const O=this.editor.getModel().uri;if(O.scheme===t.Schemas.file&&T.startsWith(`${t.Schemas.file}:`)){const A=n.URI.parse(T);if(A.scheme===t.Schemas.file){const B=l.originalFSPath(A);let F=null;B.startsWith("/./")?F=`.${B.substr(1)}`:B.startsWith("//./")&&(F=`.${B.substr(2)}`),F&&(T=l.joinPath(O,F))}}}return this.openerService.open(T,{openToSide:I,fromUserGesture:k,allowContributedOpeners:!0})},T=>{const O=T instanceof Error?T.message:T;O==="invalid"?this.notificationService.warn(b.localize(7,null,E.url.toString())):O==="missing"?this.notificationService.warn(b.localize(8,null)):w.onUnexpectedError(T)})}}getLinkOccurrence(L){if(!this.editor.hasModel()||!L)return null;const I=this.editor.getModel().getDecorationsInRange({startLineNumber:L.lineNumber,startColumn:L.column,endLineNumber:L.lineNumber,endColumn:L.column},0,!0);for(const k of I){const E=this.currentOccurrences[k.id];if(E)return E}return null}isEnabled(L,I){return Boolean(L.target.type===6&&(L.hasTriggerModifier||I&&I.keyCodeIsTriggerKey))}stop(){var L;this.timeout.cancel(),this.activeLinksList&&((L=this.activeLinksList)===null||L===void 0||L.dispose(),this.activeLinksList=null),this.computePromise&&(this.computePromise.cancel(),this.computePromise=null)}dispose(){this.listenersToRemove.dispose(),this.stop(),this.timeout.dispose()}};f.ID="editor.linkDetector",f.RECOMPUTE_TIME=1e3,f=Me([_e(1,u.IOpenerService),_e(2,a.INotificationService)],f),e.LinkDetector=f;class v extends g.EditorAction{constructor(){super({id:"editor.action.openLink",label:b.localize(9,null),alias:"Open Link",precondition:void 0})}run(L,I){let k=f.get(I);if(!!k&&!!I.hasModel()){let E=I.getSelections();for(let T of E){let O=k.getLinkOccurrence(T.getEndPosition());O&&k.openLinkOccurrence(O,!1)}}}}g.registerEditorContribution(f.ID,f),g.registerEditorAction(v),i.registerThemingParticipant((y,L)=>{const I=y.getColor(r.editorActiveLinkForeground);I&&L.addRule(`.monaco-editor .detected-link-active { color: ${I} !important; }`)})}),define(Q[146],J([0,1,496,15,2,47,3,13,16,11,22,97,347]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MessageController=void 0;let o=class St{constructor(r,i){this._messageWidget=new M.MutableDisposable,this._messageListeners=new M.DisposableStore,this._editor=r,this._visible=St.MESSAGE_VISIBLE.bindTo(i),this._editorListener=this._editor.onDidAttemptReadOnlyEdit(()=>this._onDidAttemptReadOnlyEdit())}static get(r){return r.getContribution(St.ID)}dispose(){this._editorListener.dispose(),this._messageListeners.dispose(),this._messageWidget.dispose(),this._visible.reset()}showMessage(r,i){w.alert(r),this._visible.set(!0),this._messageWidget.clear(),this._messageListeners.clear(),this._messageWidget.value=new a(this._editor,i,r),this._messageListeners.add(this._editor.onDidBlurEditorText(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidChangeCursorPosition(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidDispose(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidChangeModel(()=>this.closeMessage())),this._messageListeners.add(new N.TimeoutTimer(()=>this.closeMessage(),3e3));let n;this._messageListeners.add(this._editor.onMouseMove(t=>{!t.target.position||(n?n.containsPosition(t.target.position)||this.closeMessage():n=new S.Range(i.lineNumber-3,1,t.target.position.lineNumber+3,1))}))}closeMessage(){this._visible.reset(),this._messageListeners.clear(),this._messageWidget.value&&this._messageListeners.add(a.fadeOut(this._messageWidget.value))}_onDidAttemptReadOnlyEdit(){this._editor.hasModel()&&this.showMessage(b.localize(1,null),this._editor.getPosition())}};o.ID="editor.contrib.messageController",o.MESSAGE_VISIBLE=new d.RawContextKey("messageVisible",!1,b.localize(0,null)),o=Me([_e(1,d.IContextKeyService)],o),e.MessageController=o;const s=C.EditorCommand.bindToContribution(o.get);C.registerEditorCommand(new s({id:"leaveEditorMessage",precondition:o.MESSAGE_VISIBLE,handler:u=>u.closeMessage(),kbOpts:{weight:100+30,primary:9}}));class a{constructor(r,{lineNumber:i,column:n},t){this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._editor=r,this._editor.revealLinesInCenterIfOutsideViewport(i,i,0),this._position={lineNumber:i,column:n-1},this._domNode=document.createElement("div"),this._domNode.classList.add("monaco-editor-overlaymessage");const l=document.createElement("div");l.classList.add("anchor","top"),this._domNode.appendChild(l);const h=document.createElement("div");h.classList.add("message"),h.textContent=t,this._domNode.appendChild(h);const m=document.createElement("div");m.classList.add("anchor","below"),this._domNode.appendChild(m),this._editor.addContentWidget(this),this._domNode.classList.add("fadeIn")}static fadeOut(r){let i;const n=()=>{r.dispose(),clearTimeout(i),r.getDomNode().removeEventListener("animationend",n)};return i=setTimeout(n,110),r.getDomNode().addEventListener("animationend",n),r.getDomNode().classList.add("fadeOut"),{dispose:n}}dispose(){this._editor.removeContentWidget(this)}getId(){return"messageoverlay"}getDomNode(){return this._domNode}getPosition(){return{position:this._position,preference:[1,2]}}afterRender(r){this._domNode.classList.toggle("below",r===2)}}C.registerEditorContribution(o.ID,o),g.registerThemingParticipant((u,r)=>{const i=u.getColor(p.inputValidationInfoBorder);if(i){let l=u.type===c.ColorScheme.HIGH_CONTRAST?2:1;r.addRule(`.monaco-editor .monaco-editor-overlaymessage .anchor.below { border-top-color: ${i}; }`),r.addRule(`.monaco-editor .monaco-editor-overlaymessage .anchor.top { border-bottom-color: ${i}; }`),r.addRule(`.monaco-editor .monaco-editor-overlaymessage .message { border: ${l}px solid ${i}; }`)}const n=u.getColor(p.inputValidationInfoBackground);n&&r.addRule(`.monaco-editor .monaco-editor-overlaymessage .message { background-color: ${n}; }`);const t=u.getColor(p.inputValidationInfoForeground);t&&r.addRule(`.monaco-editor .monaco-editor-overlaymessage .message { color: ${t}; }`)})});var _t=this&&this.__classPrivateFieldSet||function(q,e,b){if(!e.has(q))throw new TypeError("attempted to set private field on non-instance");return e.set(q,b),b},tt=this&&this.__classPrivateFieldGet||function(q,e){if(!e.has(q))throw new TypeError("attempted to get private field on non-instance");return e.get(q)};define(Q[634],J([0,1,12,150,2,146,9,616,595]),function(q,e,b,N,M,w,S,C,d){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionUi=void 0;let p=class extends M.Disposable{constructor(o,s,a,u,r){super();this._editor=o,this.delegate=u,this._activeCodeActions=this._register(new M.MutableDisposable),g.set(this,!1),this._codeActionWidget=new N.Lazy(()=>this._register(r.createInstance(C.CodeActionMenu,this._editor,{onSelectCodeAction:i=>Ie(this,void 0,void 0,function*(){this.delegate.applyCodeAction(i,!0)})}))),this._lightBulbWidget=new N.Lazy(()=>{const i=this._register(r.createInstance(d.LightBulbWidget,this._editor,s,a));return this._register(i.onClick(n=>this.showCodeActionList(n.trigger,n.actions,n,{includeDisabledActions:!1}))),i})}dispose(){_t(this,g,!0),super.dispose()}update(o){var s,a,u;return Ie(this,void 0,void 0,function*(){if(o.type!==1){(s=this._lightBulbWidget.rawValue)===null||s===void 0||s.hide();return}let r;try{r=yield o.actions}catch(i){b.onUnexpectedError(i);return}if(!tt(this,g))if(this._lightBulbWidget.getValue().update(r,o.trigger,o.position),o.trigger.type===2){if((a=o.trigger.filter)===null||a===void 0?void 0:a.include){const n=this.tryGetValidActionToApply(o.trigger,r);if(n){try{yield this.delegate.applyCodeAction(n,!1)}finally{r.dispose()}return}if(o.trigger.context){const t=this.getInvalidActionThatWouldHaveBeenApplied(o.trigger,r);if(t&&t.action.disabled){w.MessageController.get(this._editor).showMessage(t.action.disabled,o.trigger.context.position),r.dispose();return}}}const i=!!((u=o.trigger.filter)===null||u===void 0?void 0:u.include);if(o.trigger.context&&(!r.allActions.length||!i&&!r.validActions.length)){w.MessageController.get(this._editor).showMessage(o.trigger.context.notAvailableMessage,o.trigger.context.position),this._activeCodeActions.value=r,r.dispose();return}this._activeCodeActions.value=r,this._codeActionWidget.getValue().show(o.trigger,r,o.position,{includeDisabledActions:i})}else this._codeActionWidget.getValue().isVisible?r.dispose():this._activeCodeActions.value=r})}getInvalidActionThatWouldHaveBeenApplied(o,s){if(!!s.allActions.length&&(o.autoApply==="first"&&s.validActions.length===0||o.autoApply==="ifSingle"&&s.allActions.length===1))return s.allActions.find(({action:a})=>a.disabled)}tryGetValidActionToApply(o,s){if(!!s.validActions.length&&(o.autoApply==="first"&&s.validActions.length>0||o.autoApply==="ifSingle"&&s.validActions.length===1))return s.validActions[0]}showCodeActionList(o,s,a,u){return Ie(this,void 0,void 0,function*(){this._codeActionWidget.getValue().show(o,s,a,u)})}};g=new WeakMap,p=Me([_e(4,S.IInstantiationService)],p),e.CodeActionUi=p}),define(Q[263],J([0,1,23,150,2,8,13,133,25,145,634,146,466,26,16,9,85,32,59,87,617,130]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutoFixAction=e.FixAllAction=e.OrganizeImportsAction=e.SourceAction=e.RefactorAction=e.CodeActionCommand=e.QuickFixAction=e.applyCodeAction=e.QuickFixController=void 0;function m(F){return a.ContextKeyExpr.regex(l.SUPPORTED_CODE_ACTIONS.keys()[0],new RegExp("(\\s|^)"+w.escapeRegExpCharacters(F.value)+"\\b"))}const _={type:"object",defaultSnippets:[{body:{kind:""}}],properties:{kind:{type:"string",description:o.localize(0,null)},apply:{type:"string",description:o.localize(1,null),default:"ifSingle",enum:["first","ifSingle","never"],enumDescriptions:[o.localize(2,null),o.localize(3,null),o.localize(4,null)]},preferred:{type:"boolean",default:!1,description:o.localize(5,null)}}};let f=class xt extends M.Disposable{constructor(D,R,W,x,K){super();this._instantiationService=K,this._editor=D,this._model=this._register(new l.CodeActionModel(this._editor,R,W,x)),this._register(this._model.onDidChangeState(Y=>this.update(Y))),this._ui=new N.Lazy(()=>this._register(new p.CodeActionUi(D,I.Id,B.Id,{applyCodeAction:(Y,ee)=>Ie(this,void 0,void 0,function*(){try{yield this._applyCodeAction(Y)}finally{ee&&this._trigger({type:1,filter:{}})}})},this._instantiationService)))}static get(D){return D.getContribution(xt.ID)}update(D){this._ui.getValue().update(D)}showCodeActions(D,R,W){return this._ui.getValue().showCodeActionList(D,R,W,{includeDisabledActions:!1})}manualTriggerAtCurrentPosition(D,R,W){if(!!this._editor.hasModel()){c.MessageController.get(this._editor).closeMessage();const x=this._editor.getPosition();this._trigger({type:2,filter:R,autoApply:W,context:{notAvailableMessage:D,position:x}})}}_trigger(D){return this._model.trigger(D)}_applyCodeAction(D){return this._instantiationService.invokeFunction(v,D,this._editor)}};f.ID="editor.contrib.quickFixController",f=Me([_e(1,r.IMarkerService),_e(2,a.IContextKeyService),_e(3,n.IEditorProgressService),_e(4,u.IInstantiationService)],f),e.QuickFixController=f;function v(F,D,R){return Ie(this,void 0,void 0,function*(){const W=F.get(C.IBulkEditService),x=F.get(s.ICommandService),K=F.get(t.ITelemetryService),Y=F.get(i.INotificationService);if(K.publicLog2("codeAction.applyCodeAction",{codeActionTitle:D.action.title,codeActionKind:D.action.kind,codeActionIsPreferred:!!D.action.isPreferred}),yield D.resolve(b.CancellationToken.None),D.action.edit&&(yield W.apply(C.ResourceEdit.convert(D.action.edit),{editor:R,label:D.action.title})),D.action.command)try{yield x.executeCommand(D.action.command.id,...D.action.command.arguments||[])}catch(ee){const se=y(ee);Y.error(typeof se=="string"?se:o.localize(6,null))}})}e.applyCodeAction=v;function y(F){return typeof F=="string"?F:F instanceof Error&&typeof F.message=="string"?F.message:void 0}function L(F,D,R,W){if(F.hasModel()){const x=f.get(F);x&&x.manualTriggerAtCurrentPosition(D,R,W)}}class I extends S.EditorAction{constructor(){super({id:I.Id,label:o.localize(7,null),alias:"Quick Fix...",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,d.EditorContextKeys.hasCodeActionsProvider),kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:2048|84,weight:100}})}run(D,R){return L(R,o.localize(8,null),void 0,void 0)}}e.QuickFixAction=I,I.Id="editor.action.quickFix";class k extends S.EditorCommand{constructor(){super({id:g.codeActionCommandId,precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,d.EditorContextKeys.hasCodeActionsProvider),description:{description:"Trigger a code action",args:[{name:"args",schema:_}]}})}runEditorCommand(D,R,W){const x=h.CodeActionCommandArgs.fromUser(W,{kind:h.CodeActionKind.Empty,apply:"ifSingle"});return L(R,typeof(W==null?void 0:W.kind)=="string"?x.preferred?o.localize(9,null,W.kind):o.localize(10,null,W.kind):x.preferred?o.localize(11,null):o.localize(12,null),{include:x.kind,includeSourceActions:!0,onlyIncludePreferredActions:x.preferred},x.apply)}}e.CodeActionCommand=k;class E extends S.EditorAction{constructor(){super({id:g.refactorCommandId,label:o.localize(13,null),alias:"Refactor...",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,d.EditorContextKeys.hasCodeActionsProvider),kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:2048|1024|48,mac:{primary:256|1024|48},weight:100},contextMenuOpts:{group:"1_modification",order:2,when:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.Refactor))},description:{description:"Refactor...",args:[{name:"args",schema:_}]}})}run(D,R,W){const x=h.CodeActionCommandArgs.fromUser(W,{kind:h.CodeActionKind.Refactor,apply:"never"});return L(R,typeof(W==null?void 0:W.kind)=="string"?x.preferred?o.localize(14,null,W.kind):o.localize(15,null,W.kind):x.preferred?o.localize(16,null):o.localize(17,null),{include:h.CodeActionKind.Refactor.contains(x.kind)?x.kind:h.CodeActionKind.None,onlyIncludePreferredActions:x.preferred},x.apply)}}e.RefactorAction=E;class T extends S.EditorAction{constructor(){super({id:g.sourceActionCommandId,label:o.localize(18,null),alias:"Source Action...",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,d.EditorContextKeys.hasCodeActionsProvider),contextMenuOpts:{group:"1_modification",order:2.1,when:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.Source))},description:{description:"Source Action...",args:[{name:"args",schema:_}]}})}run(D,R,W){const x=h.CodeActionCommandArgs.fromUser(W,{kind:h.CodeActionKind.Source,apply:"never"});return L(R,typeof(W==null?void 0:W.kind)=="string"?x.preferred?o.localize(19,null,W.kind):o.localize(20,null,W.kind):x.preferred?o.localize(21,null):o.localize(22,null),{include:h.CodeActionKind.Source.contains(x.kind)?x.kind:h.CodeActionKind.None,includeSourceActions:!0,onlyIncludePreferredActions:x.preferred},x.apply)}}e.SourceAction=T;class O extends S.EditorAction{constructor(){super({id:g.organizeImportsCommandId,label:o.localize(23,null),alias:"Organize Imports",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.SourceOrganizeImports)),kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:1024|512|45,weight:100}})}run(D,R){return L(R,o.localize(24,null),{include:h.CodeActionKind.SourceOrganizeImports,includeSourceActions:!0},"ifSingle")}}e.OrganizeImportsAction=O;class A extends S.EditorAction{constructor(){super({id:g.fixAllCommandId,label:o.localize(25,null),alias:"Fix All",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.SourceFixAll))})}run(D,R){return L(R,o.localize(26,null),{include:h.CodeActionKind.SourceFixAll,includeSourceActions:!0},"ifSingle")}}e.FixAllAction=A;class B extends S.EditorAction{constructor(){super({id:B.Id,label:o.localize(27,null),alias:"Auto Fix...",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.QuickFix)),kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:512|1024|84,mac:{primary:2048|512|84},weight:100}})}run(D,R){return L(R,o.localize(28,null),{include:h.CodeActionKind.QuickFix,onlyIncludePreferredActions:!0},"ifSingle")}}e.AutoFixAction=B,B.Id="editor.action.autoFix"}),define(Q[635],J([0,1,13,263]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),b.registerEditorContribution(N.QuickFixController.ID,N.QuickFixController),b.registerEditorAction(N.QuickFixAction),b.registerEditorAction(N.RefactorAction),b.registerEditorAction(N.SourceAction),b.registerEditorAction(N.OrganizeImportsAction),b.registerEditorAction(N.AutoFixAction),b.registerEditorAction(N.FixAllAction),b.registerEditorCommand(new N.CodeActionCommand)}),define(Q[636],J([0,1,503,12,16,59,13,25,604,18,14,47,3,146,70,32,133,24,28,23,2,15,77,9,33,95,137,20]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenameAction=e.rename=void 0;class I{constructor(B,F){this.model=B,this.position=F,this._providerRenameIdx=0,this._providers=g.RenameProviderRegistry.ordered(B)}hasProvider(){return this._providers.length>0}resolveRenameLocation(B){return Ie(this,void 0,void 0,function*(){const F=[];for(this._providerRenameIdx=0;this._providerRenameIdx0?F.join(` +`):void 0}:{range:o.Range.fromPositions(this.position),text:"",rejectReason:F.length>0?F.join(` +`):void 0}})}provideRenameEdits(B,F){return Ie(this,void 0,void 0,function*(){return this._provideRenameEdits(B,this._providerRenameIdx,[],F)})}_provideRenameEdits(B,F,D,R){return Ie(this,void 0,void 0,function*(){const W=this._providers[F];if(!W)return{edits:[],rejectReason:D.join(` +`)};const x=yield W.provideRenameEdits(this.model,this.position,B,R);if(x){if(x.rejectReason)return this._provideRenameEdits(B,F+1,D.concat(x.rejectReason),R)}else return this._provideRenameEdits(B,F+1,D.concat(b.localize(0,null)),R);return x})}}function k(A,B,F){return Ie(this,void 0,void 0,function*(){const D=new I(A,B),R=yield D.resolveRenameLocation(t.CancellationToken.None);return(R==null?void 0:R.rejectReason)?{edits:[],rejectReason:R.rejectReason}:D.provideRenameEdits(F,t.CancellationToken.None)})}e.rename=k;let E=class Vt{constructor(B,F,D,R,W,x,K){this.editor=B,this._instaService=F,this._notificationService=D,this._bulkEditService=R,this._progressService=W,this._logService=x,this._configService=K,this._dispoableStore=new l.DisposableStore,this._cts=new t.CancellationTokenSource,this._renameInputField=this._dispoableStore.add(new h.IdleValue(()=>this._dispoableStore.add(this._instaService.createInstance(d.RenameInputField,this.editor,["acceptRenameInput","acceptRenameInputWithPreview"]))))}static get(B){return B.getContribution(Vt.ID)}dispose(){this._dispoableStore.dispose(),this._cts.dispose(!0)}run(){return Ie(this,void 0,void 0,function*(){if(this._cts.dispose(!0),!!this.editor.hasModel()){const B=this.editor.getPosition(),F=new I(this.editor.getModel(),B);if(!!F.hasProvider()){this._cts=new a.EditorStateCancellationTokenSource(this.editor,4|1);let D;try{const se=F.resolveRenameLocation(this._cts.token);this._progressService.showWhile(se,250),D=yield se}catch(se){s.MessageController.get(this.editor).showMessage(se||b.localize(1,null),B);return}if(!!D){if(D.rejectReason){s.MessageController.get(this.editor).showMessage(D.rejectReason,B);return}if(!this._cts.token.isCancellationRequested){this._cts.dispose(),this._cts=new a.EditorStateCancellationTokenSource(this.editor,4|1,D.range);let R=this.editor.getSelection(),W=0,x=D.text.length;!o.Range.isEmpty(R)&&!o.Range.spansMultipleLines(R)&&o.Range.containsRange(D.range,R)&&(W=Math.max(0,R.startColumn-D.range.startColumn),x=Math.min(D.range.endColumn,R.endColumn)-D.range.startColumn);const K=this._bulkEditService.hasPreviewHandler()&&this._configService.getValue(this.editor.getModel().uri,"editor.rename.enablePreview"),Y=yield this._renameInputField.value.getInput(D.range,D.text,W,x,K,this._cts.token);if(typeof Y=="boolean"){Y&&this.editor.focus();return}this.editor.focus();const ee=h.raceCancellation(F.provideRenameEdits(Y.newName,this._cts.token),this._cts.token).then(se=>Ie(this,void 0,void 0,function*(){if(!(!se||!this.editor.hasModel())){if(se.rejectReason){this._notificationService.info(se.rejectReason);return}this._bulkEditService.apply(r.ResourceEdit.convert(se),{editor:this.editor,showPreview:Y.wantsPreview,label:b.localize(2,null,D==null?void 0:D.text),quotableLabel:b.localize(3,null,D==null?void 0:D.text)}).then(ne=>{ne.ariaSummary&&c.alert(b.localize(4,null,D.text,Y.newName,ne.ariaSummary))}).catch(ne=>{this._notificationService.error(b.localize(5,null)),this._logService.error(ne)})}}),se=>{this._notificationService.error(b.localize(6,null)),this._logService.error(se)});return this._progressService.showWhile(ee,250),ee}}}}})}acceptRenameInput(B){this._renameInputField.value.acceptInput(B)}cancelRenameInput(){this._renameInputField.value.cancelInput(!0)}};E.ID="editor.contrib.renameController",E=Me([_e(1,_.IInstantiationService),_e(2,u.INotificationService),_e(3,r.IBulkEditService),_e(4,w.IEditorProgressService),_e(5,m.ILogService),_e(6,y.ITextResourceConfigurationService)],E);class T extends S.EditorAction{constructor(){super({id:"editor.action.rename",label:b.localize(7,null),alias:"Rename Symbol",precondition:M.ContextKeyExpr.and(C.EditorContextKeys.writable,C.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:C.EditorContextKeys.editorTextFocus,primary:60,weight:100},contextMenuOpts:{group:"1_modification",order:1.1}})}runCommand(B,F){const D=B.get(n.ICodeEditorService),[R,W]=Array.isArray(F)&&F||[void 0,void 0];return i.URI.isUri(R)&&p.Position.isIPosition(W)?D.openCodeEditor({resource:R},D.getActiveCodeEditor()).then(x=>{!x||(x.setPosition(W),x.invokeWithinContext(K=>(this.reportTelemetry(K,x),this.run(K,x))))},N.onUnexpectedError):super.runCommand(B,F)}run(B,F){const D=E.get(F);return D?D.run():Promise.resolve()}}e.RenameAction=T,S.registerEditorContribution(E.ID,E),S.registerEditorAction(T);const O=S.EditorCommand.bindToContribution(E.get);S.registerEditorCommand(new O({id:"acceptRenameInput",precondition:d.CONTEXT_RENAME_INPUT_VISIBLE,handler:A=>A.acceptRenameInput(!1),kbOpts:{weight:100+99,kbExpr:C.EditorContextKeys.focus,primary:3}})),S.registerEditorCommand(new O({id:"acceptRenameInputWithPreview",precondition:M.ContextKeyExpr.and(d.CONTEXT_RENAME_INPUT_VISIBLE,M.ContextKeyExpr.has("config.editor.rename.enablePreview")),handler:A=>A.acceptRenameInput(!0),kbOpts:{weight:100+99,kbExpr:C.EditorContextKeys.focus,primary:1024+3}})),S.registerEditorCommand(new O({id:"cancelRenameInput",precondition:d.CONTEXT_RENAME_INPUT_VISIBLE,handler:A=>A.cancelRenameInput(),kbOpts:{weight:100+99,kbExpr:C.EditorContextKeys.focus,primary:9,secondary:[1024|9]}})),S.registerModelAndPositionCommand("_executeDocumentRenameProvider",function(A,B,...F){const[D]=F;return L.assertType(typeof D=="string"),k(A,B,D)}),f.Registry.as(v.Extensions.Configuration).registerConfiguration({id:"editor",properties:{"editor.rename.enablePreview":{scope:5,description:b.localize(8,null),default:!0,type:"boolean"}}})}),define(Q[637],J([0,1,19,23,13,14,3,21,25,18,505,34,412,230,26,12]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.provideSelectionRanges=void 0;class r{constructor(_,f){this.index=_,this.ranges=f}mov(_){let f=this.index+(_?1:-1);if(f<0||f>=this.ranges.length)return this;const v=new r(f,this.ranges);return v.ranges[f].equalsRange(this.ranges[this.index])?v.mov(_):v}}class i{constructor(_){this._editor=_,this._ignoreSelection=!1}static get(_){return _.getContribution(i.ID)}dispose(){var _;(_=this._selectionListener)===null||_===void 0||_.dispose()}run(_){return Ie(this,void 0,void 0,function*(){if(!!this._editor.hasModel()){const f=this._editor.getSelections(),v=this._editor.getModel();if(!!g.SelectionRangeRegistry.has(v)&&(this._state||(yield h(v,f.map(L=>L.getPosition()),this._editor.getOption(97),N.CancellationToken.None).then(L=>{var I;if(!(!b.isNonEmptyArray(L)||L.length!==f.length)&&!(!this._editor.hasModel()||!b.equals(this._editor.getSelections(),f,(k,E)=>k.equalsSelection(E)))){for(let k=0;kE.containsPosition(f[k].getStartPosition())&&E.containsPosition(f[k].getEndPosition())),L[k].unshift(f[k]);this._state=L.map(k=>new r(0,k)),(I=this._selectionListener)===null||I===void 0||I.dispose(),this._selectionListener=this._editor.onDidChangeCursorPosition(()=>{var k;this._ignoreSelection||((k=this._selectionListener)===null||k===void 0||k.dispose(),this._state=void 0)})}})),!!this._state)){this._state=this._state.map(L=>L.mov(_));const y=this._state.map(L=>C.Selection.fromPositions(L.ranges[L.index].getStartPosition(),L.ranges[L.index].getEndPosition()));this._ignoreSelection=!0;try{this._editor.setSelections(y)}finally{this._ignoreSelection=!1}}}})}}i.ID="editor.contrib.smartSelectController";class n extends M.EditorAction{constructor(_,f){super(f);this._forward=_}run(_,f){return Ie(this,void 0,void 0,function*(){let v=i.get(f);v&&(yield v.run(this._forward))})}}class t extends n{constructor(){super(!0,{id:"editor.action.smartSelect.expand",label:p.localize(0,null),alias:"Expand Selection",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:1024|512|17,mac:{primary:2048|256|1024|17,secondary:[256|1024|17]},weight:100},menuOpts:{menuId:c.MenuId.MenubarSelectionMenu,group:"1_basic",title:p.localize(1,null),order:2}})}}a.CommandsRegistry.registerCommandAlias("editor.action.smartSelect.grow","editor.action.smartSelect.expand");class l extends n{constructor(){super(!1,{id:"editor.action.smartSelect.shrink",label:p.localize(2,null),alias:"Shrink Selection",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:1024|512|15,mac:{primary:2048|256|1024|15,secondary:[256|1024|15]},weight:100},menuOpts:{menuId:c.MenuId.MenubarSelectionMenu,group:"1_basic",title:p.localize(3,null),order:3}})}}M.registerEditorContribution(i.ID,i),M.registerEditorAction(t),M.registerEditorAction(l),g.SelectionRangeRegistry.register("*",new o.WordSelectionRangeProvider);function h(m,_,f,v){return Ie(this,void 0,void 0,function*(){const y=g.SelectionRangeRegistry.all(m);y.length===1&&y.unshift(new s.BracketSelectionRangeProvider);let L=[],I=[];for(const k of y)L.push(Promise.resolve(k.provideSelectionRanges(m,_,v)).then(E=>{if(b.isNonEmptyArray(E)&&E.length===_.length)for(let T=0;T<_.length;T++){I[T]||(I[T]=[]);for(const O of E[T])S.Range.isIRange(O.range)&&S.Range.containsPosition(O.range,_[T])&&I[T].push(S.Range.lift(O.range))}},u.onUnexpectedExternalError));return yield Promise.all(L),I.map(k=>{if(k.length===0)return[];k.sort((A,B)=>w.Position.isBefore(A.getStartPosition(),B.getStartPosition())?1:w.Position.isBefore(B.getStartPosition(),A.getStartPosition())||w.Position.isBefore(A.getEndPosition(),B.getEndPosition())?-1:w.Position.isBefore(B.getEndPosition(),A.getEndPosition())?1:0);let E=[],T;for(const A of k)(!T||S.Range.containsRange(A,T)&&!S.Range.equalsRange(A,T))&&(E.push(A),T=A);if(!f.selectLeadingAndTrailingWhitespace)return E;let O=[E[0]];for(let A=1;A{this._resolveCache=void 0,this._isResolved=!1});this._resolveCache=Promise.resolve(this.provider.resolveCompletionItem(this.completion,T)).then(A=>{Object.assign(this.completion,A),this._isResolved=!0,O.dispose()},A=>{b.isPromiseCanceledError(A)&&(this._resolveCache=void 0,this._isResolved=!1)})}return this._resolveCache})}}e.CompletionItem=i;class n{constructor(T=2,O=new Set,A=new Set){this.snippetSortOrder=T,this.kindFilter=O,this.providerFilter=A}}e.CompletionOptions=n,n.default=new n;let t;function l(){return t}e.getSnippetSuggestSupport=l;class h{constructor(T,O,A,B){this.items=T,this.needsClipboard=O,this.durations=A,this.disposable=B}}e.CompletionItemModel=h;function m(E,T,O=n.default,A={triggerKind:0},B=S.CancellationToken.None){return Ie(this,void 0,void 0,function*(){const F=new o.StopWatch(!0);T=T.clone();const D=E.getWordAtPosition(T),R=D?new C.Range(T.lineNumber,D.startColumn,T.lineNumber,D.endColumn):C.Range.fromPositions(T),W={replace:R,insert:R.setEndPosition(T.lineNumber,T.column)},x=[],K=new g.DisposableStore,Y=[];let ee=!1;const se=(le,X,z)=>{var P,V;if(!!X){for(let U of X.suggestions)O.kindFilter.has(U.kind)||(U.range||(U.range=W),U.sortText||(U.sortText=typeof U.label=="string"?U.label:U.label.name),!ee&&U.insertTextRules&&U.insertTextRules&4&&(ee=c.SnippetParser.guessNeedsClipboard(U.insertText)),x.push(new i(T,U,X,le)));g.isDisposable(X)&&K.add(X),Y.push({providerName:(P=le._debugDisplayName)!==null&&P!==void 0?P:"unkown_provider",elapsedProvider:(V=X.duration)!==null&&V!==void 0?V:-1,elapsedOverall:z.elapsed()})}},ne=(()=>Ie(this,void 0,void 0,function*(){if(!(!t||O.kindFilter.has(27))&&!(O.providerFilter.size>0&&!O.providerFilter.has(t))){const le=new o.StopWatch(!0),X=yield t.provideCompletionItems(E,T,A,B);se(t,X,le)}}))();for(let le of N.CompletionProviderRegistry.orderedGroups(E)){let X=x.length;if(yield Promise.all(le.map(z=>Ie(this,void 0,void 0,function*(){if(!(O.providerFilter.size>0&&!O.providerFilter.has(z)))try{const P=new o.StopWatch(!0),V=yield z.provideCompletionItems(E,T,A,B);se(z,V,P)}catch(P){b.onUnexpectedExternalError(P)}}))),X!==x.length||B.isCancellationRequested)break}return yield ne,B.isCancellationRequested?(K.dispose(),Promise.reject(b.canceled())):new h(x.sort(L(O.snippetSortOrder)),ee,{entries:Y,elapsed:F.elapsed()},K)})}e.provideSuggestionItems=m;function _(E,T){if(E.sortTextLow&&T.sortTextLow){if(E.sortTextLowT.sortTextLow)return 1}return E.completion.labelT.completion.label?1:E.completion.kind-T.completion.kind}function f(E,T){if(E.completion.kind!==T.completion.kind){if(E.completion.kind===27)return-1;if(T.completion.kind===27)return 1}return _(E,T)}function v(E,T){if(E.completion.kind!==T.completion.kind){if(E.completion.kind===27)return 1;if(T.completion.kind===27)return-1}return _(E,T)}const y=new Map;y.set(0,f),y.set(2,v),y.set(1,_);function L(E){return y.get(E)}e.getSuggestionComparator=L,s.CommandsRegistry.registerCommand("_executeCompletionItemProvider",(E,...T)=>Ie(void 0,void 0,void 0,function*(){const[O,A,B,F]=T;a.assertType(u.URI.isUri(O)),a.assertType(M.Position.isIPosition(A)),a.assertType(typeof B=="string"||!B),a.assertType(typeof F=="number"||!F);const D=yield E.get(r.ITextModelService).createModelReference(O);try{const R={incomplete:!1,suggestions:[]},W=[],x=yield m(D.object.textEditorModel,M.Position.lift(A),void 0,{triggerCharacter:B,triggerKind:B?1:0});for(const K of x.items)W.length<(F!=null?F:0)&&W.push(K.resolve(S.CancellationToken.None)),R.incomplete=R.incomplete||K.container.incomplete,R.suggestions.push(K.completion);try{return yield Promise.all(W),R}finally{setTimeout(()=>x.disposable.dispose(),100)}}finally{D.dispose()}}));const I=new class{constructor(){this.onlyOnceSuggestions=[]}provideCompletionItems(){let T={suggestions:this.onlyOnceSuggestions.slice(0)};return this.onlyOnceSuggestions.length=0,T}};N.CompletionProviderRegistry.register("*",I);function k(E,T){setTimeout(()=>{I.onlyOnceSuggestions.push(...T),E.getContribution("editor.contrib.suggestController").triggerSuggest(new Set().add(I))},0)}e.showSimpleSuggestions=k}),define(Q[264],J([0,1,513,47,13,186]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ToggleTabFocusModeAction=void 0;class S extends M.EditorAction{constructor(){super({id:S.ID,label:b.localize(0,null),alias:"Toggle Tab Key Moves Focus",precondition:void 0,kbOpts:{kbExpr:null,primary:2048|43,mac:{primary:256|1024|43},weight:100}})}run(d,g){const c=!w.TabFocus.getTabFocusMode();w.TabFocus.setTabFocusMode(c),c?N.alert(b.localize(1,null)):N.alert(b.localize(2,null))}}e.ToggleTabFocusModeAction=S,S.ID="editor.action.toggleTabFocusMode",M.registerEditorAction(S)}),define(Q[638],J([0,1,514,13,81]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class w extends N.EditorAction{constructor(){super({id:"editor.action.forceRetokenize",label:b.localize(0,null),alias:"Developer: Force Retokenize",precondition:void 0})}run(C,d){if(!!d.hasModel()){const g=d.getModel();g.resetTokenization();const p=new M.StopWatch(!0);g.forceTokenization(g.getLineCount()),p.stop(),console.log(`tokenization took ${p.elapsed()}`)}}}N.registerEditorAction(w)}),define(Q[639],J([0,1,515,2,13,28,184]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const C="ignoreUnusualLineTerminators";function d(c,o,s){c.setModelProperty(o.uri,C,s)}function g(c,o){return c.getModelProperty(o.uri,C)}let p=class extends N.Disposable{constructor(o,s,a){super();this._editor=o,this._dialogService=s,this._codeEditorService=a,this._config=this._editor.getOption(108),this._register(this._editor.onDidChangeConfiguration(u=>{u.hasChanged(108)&&(this._config=this._editor.getOption(108),this._checkForUnusualLineTerminators())})),this._register(this._editor.onDidChangeModel(()=>{this._checkForUnusualLineTerminators()})),this._register(this._editor.onDidChangeModelContent(u=>{u.isUndoing||this._checkForUnusualLineTerminators()}))}_checkForUnusualLineTerminators(){return Ie(this,void 0,void 0,function*(){if(this._config!=="off"&&!!this._editor.hasModel()){const o=this._editor.getModel();if(!!o.mightContainUnusualLineTerminators()&&g(this._codeEditorService,o)!==!0&&!this._editor.getOption(75)){if(this._config==="auto"){o.removeUnusualLineTerminators(this._editor.getSelections());return}if(!(yield this._dialogService.confirm({title:b.localize(0,null),message:b.localize(1,null),detail:b.localize(2,null),primaryButton:b.localize(3,null),secondaryButton:b.localize(4,null)})).confirmed){d(this._codeEditorService,o,!0);return}o.removeUnusualLineTerminators(this._editor.getSelections())}}})}};p.ID="editor.contrib.unusualLineTerminatorsDetector",p=Me([_e(1,S.IDialogService),_e(2,w.ICodeEditorService)],p),M.registerEditorContribution(p.ID,p)}),define(Q[640],J([0,1,516,19,15,23,12,2,13,3,25,53,31,18,16,22,11,47]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getOccurrencesAtPosition=void 0;const n=u.registerColor("editor.wordHighlightBackground",{dark:"#575757B8",light:"#57575740",hc:null},b.localize(0,null),!0),t=u.registerColor("editor.wordHighlightStrongBackground",{dark:"#004972B8",light:"#0e639c40",hc:null},b.localize(1,null),!0),l=u.registerColor("editor.wordHighlightBorder",{light:null,dark:null,hc:u.activeContrastBorder},b.localize(2,null)),h=u.registerColor("editor.wordHighlightStrongBorder",{light:null,dark:null,hc:u.activeContrastBorder},b.localize(3,null)),m=u.registerColor("editorOverviewRuler.wordHighlightForeground",{dark:"#A0A0A0CC",light:"#A0A0A0CC",hc:"#A0A0A0CC"},b.localize(4,null),!0),_=u.registerColor("editorOverviewRuler.wordHighlightStrongForeground",{dark:"#C0A0C0CC",light:"#C0A0C0CC",hc:"#C0A0C0CC"},b.localize(5,null),!0),f=new a.RawContextKey("hasWordHighlights",!1);function v(D,R,W){const x=s.DocumentHighlightProviderRegistry.ordered(D);return M.first(x.map(K=>()=>Promise.resolve(K.provideDocumentHighlights(D,R,W)).then(void 0,S.onUnexpectedExternalError)),N.isNonEmptyArray)}e.getOccurrencesAtPosition=v;class y{constructor(R,W,x){this._wordRange=this._getCurrentWordRange(R,W),this.result=M.createCancelablePromise(K=>this._compute(R,W,x,K))}_getCurrentWordRange(R,W){const x=R.getWordAtPosition(W.getPosition());return x?new g.Range(W.startLineNumber,x.startColumn,W.startLineNumber,x.endColumn):null}isValid(R,W,x){const K=W.startLineNumber,Y=W.startColumn,ee=W.endColumn,se=this._getCurrentWordRange(R,W);let ne=Boolean(this._wordRange&&this._wordRange.equalsRange(se));for(let le=0,X=x.length;!ne&&le=ee&&(ne=!0)}return ne}cancel(){this.result.cancel()}}class L extends y{_compute(R,W,x,K){return v(R,W.getPosition(),K).then(Y=>Y||[])}}class I extends y{constructor(R,W,x){super(R,W,x);this._selectionIsEmpty=W.isEmpty()}_compute(R,W,x,K){return M.timeout(250,K).then(()=>{if(!W.isEmpty())return[];const Y=R.getWordAtPosition(W.getPosition());return!Y||Y.word.length>1e3?[]:R.findMatches(Y.word,!0,!1,!0,x,!1).map(se=>({range:se.range,kind:s.DocumentHighlightKind.Text}))})}isValid(R,W,x){const K=W.isEmpty();return this._selectionIsEmpty!==K?!1:super.isValid(R,W,x)}}function k(D,R,W){return s.DocumentHighlightProviderRegistry.has(D)?new L(D,R,W):new I(D,R,W)}d.registerModelAndPositionCommand("_executeDocumentHighlights",(D,R)=>v(D,R,w.CancellationToken.None));class E{constructor(R,W){this.toUnhook=new C.DisposableStore,this.workerRequestTokenId=0,this.workerRequestCompleted=!1,this.workerRequestValue=[],this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1,this.editor=R,this._hasWordHighlights=f.bindTo(W),this._ignorePositionChangeEvent=!1,this.occurrencesHighlight=this.editor.getOption(66),this.model=this.editor.getModel(),this.toUnhook.add(R.onDidChangeCursorPosition(x=>{this._ignorePositionChangeEvent||!this.occurrencesHighlight||this._onPositionChanged(x)})),this.toUnhook.add(R.onDidChangeModelContent(x=>{this._stopAll()})),this.toUnhook.add(R.onDidChangeConfiguration(x=>{let K=this.editor.getOption(66);this.occurrencesHighlight!==K&&(this.occurrencesHighlight=K,this._stopAll())})),this._decorationIds=[],this.workerRequestTokenId=0,this.workerRequest=null,this.workerRequestCompleted=!1,this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1}hasDecorations(){return this._decorationIds.length>0}restore(){!this.occurrencesHighlight||this._run()}_getSortedHighlights(){return N.coalesce(this._decorationIds.map(R=>this.model.getDecorationRange(R)).sort(g.Range.compareRangesUsingStarts))}moveNext(){let R=this._getSortedHighlights(),x=(R.findIndex(Y=>Y.containsPosition(this.editor.getPosition()))+1)%R.length,K=R[x];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(K.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(K);const Y=this._getWord();if(Y){const ee=this.editor.getModel().getLineContent(K.startLineNumber);i.alert(`${ee}, ${x+1} of ${R.length} for '${Y.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}moveBack(){let R=this._getSortedHighlights(),x=(R.findIndex(Y=>Y.containsPosition(this.editor.getPosition()))-1+R.length)%R.length,K=R[x];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(K.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(K);const Y=this._getWord();if(Y){const ee=this.editor.getModel().getLineContent(K.startLineNumber);i.alert(`${ee}, ${x+1} of ${R.length} for '${Y.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}_removeDecorations(){this._decorationIds.length>0&&(this._decorationIds=this.editor.deltaDecorations(this._decorationIds,[]),this._hasWordHighlights.set(!1))}_stopAll(){this._removeDecorations(),this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1),this.workerRequest!==null&&(this.workerRequest.cancel(),this.workerRequest=null),this.workerRequestCompleted||(this.workerRequestTokenId++,this.workerRequestCompleted=!0)}_onPositionChanged(R){if(!this.occurrencesHighlight){this._stopAll();return}if(R.reason!==3){this._stopAll();return}this._run()}_getWord(){let R=this.editor.getSelection(),W=R.startLineNumber,x=R.startColumn;return this.model.getWordAtPosition({lineNumber:W,column:x})}_run(){let R=this.editor.getSelection();if(R.startLineNumber!==R.endLineNumber){this._stopAll();return}let W=R.startColumn,x=R.endColumn;const K=this._getWord();if(!K||K.startColumn>W||K.endColumn{ee===this.workerRequestTokenId&&(this.workerRequestCompleted=!0,this.workerRequestValue=se||[],this._beginRenderDecorations())},S.onUnexpectedError)}}_beginRenderDecorations(){let R=new Date().getTime(),W=this.lastCursorPositionChangeTime+250;R>=W?(this.renderDecorationsTimer=-1,this.renderDecorations()):this.renderDecorationsTimer=setTimeout(()=>{this.renderDecorations()},W-R)}renderDecorations(){this.renderDecorationsTimer=-1;let R=[];for(const W of this.workerRequestValue)W.range&&R.push({range:W.range,options:E._getDecorationOptions(W.kind)});this._decorationIds=this.editor.deltaDecorations(this._decorationIds,R),this._hasWordHighlights.set(this.hasDecorations())}static _getDecorationOptions(R){return R===s.DocumentHighlightKind.Write?this._WRITE_OPTIONS:R===s.DocumentHighlightKind.Text?this._TEXT_OPTIONS:this._REGULAR_OPTIONS}dispose(){this._stopAll(),this.toUnhook.dispose()}}E._WRITE_OPTIONS=o.ModelDecorationOptions.register({stickiness:1,className:"wordHighlightStrong",overviewRuler:{color:r.themeColorFromId(_),position:c.OverviewRulerLane.Center}}),E._TEXT_OPTIONS=o.ModelDecorationOptions.register({stickiness:1,className:"selectionHighlight",overviewRuler:{color:r.themeColorFromId(u.overviewRulerSelectionHighlightForeground),position:c.OverviewRulerLane.Center}}),E._REGULAR_OPTIONS=o.ModelDecorationOptions.register({stickiness:1,className:"wordHighlight",overviewRuler:{color:r.themeColorFromId(m),position:c.OverviewRulerLane.Center}});let T=class zt extends C.Disposable{constructor(R,W){super();this.wordHighlighter=null;const x=()=>{R.hasModel()&&(this.wordHighlighter=new E(R,W))};this._register(R.onDidChangeModel(K=>{this.wordHighlighter&&(this.wordHighlighter.dispose(),this.wordHighlighter=null),x()})),x()}static get(R){return R.getContribution(zt.ID)}saveViewState(){return!!(this.wordHighlighter&&this.wordHighlighter.hasDecorations())}moveNext(){this.wordHighlighter&&this.wordHighlighter.moveNext()}moveBack(){this.wordHighlighter&&this.wordHighlighter.moveBack()}restoreViewState(R){this.wordHighlighter&&R&&this.wordHighlighter.restore()}dispose(){this.wordHighlighter&&(this.wordHighlighter.dispose(),this.wordHighlighter=null),super.dispose()}};T.ID="editor.contrib.wordHighlighter",T=Me([_e(1,a.IContextKeyService)],T);class O extends d.EditorAction{constructor(R,W){super(W);this._isNext=R}run(R,W){const x=T.get(W);!x||(this._isNext?x.moveNext():x.moveBack())}}class A extends O{constructor(){super(!0,{id:"editor.action.wordHighlight.next",label:b.localize(6,null),alias:"Go to Next Symbol Highlight",precondition:f,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:65,weight:100}})}}class B extends O{constructor(){super(!1,{id:"editor.action.wordHighlight.prev",label:b.localize(7,null),alias:"Go to Previous Symbol Highlight",precondition:f,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:1024|65,weight:100}})}}class F extends d.EditorAction{constructor(){super({id:"editor.action.wordHighlight.trigger",label:b.localize(8,null),alias:"Trigger Symbol Highlight",precondition:f.toNegated(),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:0,weight:100}})}run(R,W,x){const K=T.get(W);!K||K.restoreViewState(!0)}}d.registerEditorContribution(T.ID,T),d.registerEditorAction(A),d.registerEditorAction(B),d.registerEditorAction(F),r.registerThemingParticipant((D,R)=>{const W=D.getColor(u.editorSelectionHighlight);W&&(R.addRule(`.monaco-editor .focused .selectionHighlight { background-color: ${W}; }`),R.addRule(`.monaco-editor .selectionHighlight { background-color: ${W.transparent(.5)}; }`));const x=D.getColor(n);x&&R.addRule(`.monaco-editor .wordHighlight { background-color: ${x}; }`);const K=D.getColor(t);K&&R.addRule(`.monaco-editor .wordHighlightStrong { background-color: ${K}; }`);const Y=D.getColor(u.editorSelectionHighlightBorder);Y&&R.addRule(`.monaco-editor .selectionHighlight { border: 1px ${D.type==="hc"?"dotted":"solid"} ${Y}; box-sizing: border-box; }`);const ee=D.getColor(l);ee&&R.addRule(`.monaco-editor .wordHighlight { border: 1px ${D.type==="hc"?"dashed":"solid"} ${ee}; box-sizing: border-box; }`);const se=D.getColor(h);se&&R.addRule(`.monaco-editor .wordHighlightStrong { border: 1px ${D.type==="hc"?"dashed":"solid"} ${se}; box-sizing: border-box; }`)})}),define(Q[265],J([0,1,517,13,92,42,136,106,14,3,21,25,65,16,38,41,250]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DeleteInsideWord=e.DeleteWordRight=e.DeleteWordEndRight=e.DeleteWordStartRight=e.DeleteWordLeft=e.DeleteWordEndLeft=e.DeleteWordStartLeft=e.DeleteWordRightCommand=e.DeleteWordLeftCommand=e.DeleteWordCommand=e.CursorWordAccessibilityRightSelect=e.CursorWordAccessibilityRight=e.CursorWordRightSelect=e.CursorWordEndRightSelect=e.CursorWordStartRightSelect=e.CursorWordRight=e.CursorWordEndRight=e.CursorWordStartRight=e.CursorWordAccessibilityLeftSelect=e.CursorWordAccessibilityLeft=e.CursorWordLeftSelect=e.CursorWordEndLeftSelect=e.CursorWordStartLeftSelect=e.CursorWordLeft=e.CursorWordEndLeft=e.CursorWordStartLeft=e.WordRightCommand=e.WordLeftCommand=e.MoveWordCommand=void 0;class i extends N.EditorCommand{constructor(z){super(z);this._inSelectionMode=z.inSelectionMode,this._wordNavigationType=z.wordNavigationType}runEditorCommand(z,P,V){if(!!P.hasModel()){const U=C.getMapForWordSeparators(P.getOption(110)),H=P.getModel(),ie=P.getSelections().map(oe=>{const ae=new d.Position(oe.positionLineNumber,oe.positionColumn),G=this._move(U,H,ae,this._wordNavigationType);return this._moveTo(oe,G,this._inSelectionMode)});if(H.pushStackElement(),P._getViewModel().setCursorStates("moveWordCommand",3,ie.map(oe=>w.CursorState.fromModelSelection(oe))),ie.length===1){const oe=new d.Position(ie[0].positionLineNumber,ie[0].positionColumn);P.revealPosition(oe,0)}}}_moveTo(z,P,V){return V?new p.Selection(z.selectionStartLineNumber,z.selectionStartColumn,P.lineNumber,P.column):new p.Selection(P.lineNumber,P.column,P.lineNumber,P.column)}}e.MoveWordCommand=i;class n extends i{_move(z,P,V,U){return S.WordOperations.moveWordLeft(z,P,V,U)}}e.WordLeftCommand=n;class t extends i{_move(z,P,V,U){return S.WordOperations.moveWordRight(z,P,V,U)}}e.WordRightCommand=t;class l extends n{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartLeft",precondition:void 0})}}e.CursorWordStartLeft=l;class h extends n{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordEndLeft",precondition:void 0})}}e.CursorWordEndLeft=h;class m extends n{constructor(){var z;super({inSelectionMode:!1,wordNavigationType:1,id:"cursorWordLeft",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,(z=s.ContextKeyExpr.and(o.CONTEXT_ACCESSIBILITY_MODE_ENABLED,r.IsWindowsContext))===null||z===void 0?void 0:z.negate()),primary:2048|15,mac:{primary:512|15},weight:100}})}}e.CursorWordLeft=m;class _ extends n{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartLeftSelect",precondition:void 0})}}e.CursorWordStartLeftSelect=_;class f extends n{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordEndLeftSelect",precondition:void 0})}}e.CursorWordEndLeftSelect=f;class v extends n{constructor(){var z;super({inSelectionMode:!0,wordNavigationType:1,id:"cursorWordLeftSelect",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,(z=s.ContextKeyExpr.and(o.CONTEXT_ACCESSIBILITY_MODE_ENABLED,r.IsWindowsContext))===null||z===void 0?void 0:z.negate()),primary:2048|1024|15,mac:{primary:512|1024|15},weight:100}})}}e.CursorWordLeftSelect=v;class y extends n{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:"cursorWordAccessibilityLeft",precondition:void 0})}_move(z,P,V,U){return super._move(C.getMapForWordSeparators(a.EditorOptions.wordSeparators.defaultValue),P,V,U)}}e.CursorWordAccessibilityLeft=y;class L extends n{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:"cursorWordAccessibilityLeftSelect",precondition:void 0})}_move(z,P,V,U){return super._move(C.getMapForWordSeparators(a.EditorOptions.wordSeparators.defaultValue),P,V,U)}}e.CursorWordAccessibilityLeftSelect=L;class I extends t{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartRight",precondition:void 0})}}e.CursorWordStartRight=I;class k extends t{constructor(){var z;super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordEndRight",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,(z=s.ContextKeyExpr.and(o.CONTEXT_ACCESSIBILITY_MODE_ENABLED,r.IsWindowsContext))===null||z===void 0?void 0:z.negate()),primary:2048|17,mac:{primary:512|17},weight:100}})}}e.CursorWordEndRight=k;class E extends t{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordRight",precondition:void 0})}}e.CursorWordRight=E;class T extends t{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartRightSelect",precondition:void 0})}}e.CursorWordStartRightSelect=T;class O extends t{constructor(){var z;super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordEndRightSelect",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,(z=s.ContextKeyExpr.and(o.CONTEXT_ACCESSIBILITY_MODE_ENABLED,r.IsWindowsContext))===null||z===void 0?void 0:z.negate()),primary:2048|1024|17,mac:{primary:512|1024|17},weight:100}})}}e.CursorWordEndRightSelect=O;class A extends t{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordRightSelect",precondition:void 0})}}e.CursorWordRightSelect=A;class B extends t{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:"cursorWordAccessibilityRight",precondition:void 0})}_move(z,P,V,U){return super._move(C.getMapForWordSeparators(a.EditorOptions.wordSeparators.defaultValue),P,V,U)}}e.CursorWordAccessibilityRight=B;class F extends t{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:"cursorWordAccessibilityRightSelect",precondition:void 0})}_move(z,P,V,U){return super._move(C.getMapForWordSeparators(a.EditorOptions.wordSeparators.defaultValue),P,V,U)}}e.CursorWordAccessibilityRightSelect=F;class D extends N.EditorCommand{constructor(z){super(z);this._whitespaceHeuristics=z.whitespaceHeuristics,this._wordNavigationType=z.wordNavigationType}runEditorCommand(z,P,V){if(!!P.hasModel()){const U=C.getMapForWordSeparators(P.getOption(110)),H=P.getModel(),$=P.getSelections(),ie=P.getOption(5),oe=P.getOption(7),ae=u.LanguageConfigurationRegistry.getAutoClosingPairs(H.getLanguageIdentifier().id),G=$.map(j=>{const te=this._delete({wordSeparators:U,model:H,selection:j,whitespaceHeuristics:this._whitespaceHeuristics,autoClosingBrackets:ie,autoClosingQuotes:oe,autoClosingPairs:ae},this._wordNavigationType);return new M.ReplaceCommand(te,"")});P.pushUndoStop(),P.executeCommands(this.id,G),P.pushUndoStop()}}}e.DeleteWordCommand=D;class R extends D{_delete(z,P){let V=S.WordOperations.deleteWordLeft(z,P);return V||new g.Range(1,1,1,1)}}e.DeleteWordLeftCommand=R;class W extends D{_delete(z,P){let V=S.WordOperations.deleteWordRight(z,P);if(V)return V;const U=z.model.getLineCount(),H=z.model.getLineMaxColumn(U);return new g.Range(U,H,U,H)}}e.DeleteWordRightCommand=W;class x extends R{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartLeft",precondition:c.EditorContextKeys.writable})}}e.DeleteWordStartLeft=x;class K extends R{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:"deleteWordEndLeft",precondition:c.EditorContextKeys.writable})}}e.DeleteWordEndLeft=K;class Y extends R{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordLeft",precondition:c.EditorContextKeys.writable,kbOpts:{kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|1,mac:{primary:512|1},weight:100}})}}e.DeleteWordLeft=Y;class ee extends W{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartRight",precondition:c.EditorContextKeys.writable})}}e.DeleteWordStartRight=ee;class se extends W{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:"deleteWordEndRight",precondition:c.EditorContextKeys.writable})}}e.DeleteWordEndRight=se;class ne extends W{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:"deleteWordRight",precondition:c.EditorContextKeys.writable,kbOpts:{kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|20,mac:{primary:512|20},weight:100}})}}e.DeleteWordRight=ne;class le extends N.EditorAction{constructor(){super({id:"deleteInsideWord",precondition:c.EditorContextKeys.writable,label:b.localize(0,null),alias:"Delete Word"})}run(z,P,V){if(!!P.hasModel()){const U=C.getMapForWordSeparators(P.getOption(110)),H=P.getModel(),ie=P.getSelections().map(oe=>{const ae=S.WordOperations.deleteInsideWord(U,H,oe);return new M.ReplaceCommand(ae,"")});P.pushUndoStop(),P.executeCommands(this.id,ie),P.pushUndoStop()}}}e.DeleteInsideWord=le,N.registerEditorCommand(new l),N.registerEditorCommand(new h),N.registerEditorCommand(new m),N.registerEditorCommand(new _),N.registerEditorCommand(new f),N.registerEditorCommand(new v),N.registerEditorCommand(new I),N.registerEditorCommand(new k),N.registerEditorCommand(new E),N.registerEditorCommand(new T),N.registerEditorCommand(new O),N.registerEditorCommand(new A),N.registerEditorCommand(new y),N.registerEditorCommand(new L),N.registerEditorCommand(new B),N.registerEditorCommand(new F),N.registerEditorCommand(new x),N.registerEditorCommand(new K),N.registerEditorCommand(new Y),N.registerEditorCommand(new ee),N.registerEditorCommand(new se),N.registerEditorCommand(new ne),N.registerEditorAction(le)}),define(Q[641],J([0,1,13,136,3,25,265,26]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorWordPartRightSelect=e.CursorWordPartRight=e.WordPartRightCommand=e.CursorWordPartLeftSelect=e.CursorWordPartLeft=e.WordPartLeftCommand=e.DeleteWordPartRight=e.DeleteWordPartLeft=void 0;class d extends S.DeleteWordCommand{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordPartLeft",precondition:w.EditorContextKeys.writable,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|1},weight:100}})}_delete(i,n){let t=N.WordPartOperations.deleteWordPartLeft(i);return t||new M.Range(1,1,1,1)}}e.DeleteWordPartLeft=d;class g extends S.DeleteWordCommand{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:"deleteWordPartRight",precondition:w.EditorContextKeys.writable,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|20},weight:100}})}_delete(i,n){let t=N.WordPartOperations.deleteWordPartRight(i);if(t)return t;const l=i.model.getLineCount(),h=i.model.getLineMaxColumn(l);return new M.Range(l,h,l,h)}}e.DeleteWordPartRight=g;class p extends S.MoveWordCommand{_move(i,n,t,l){return N.WordPartOperations.moveWordPartLeft(i,n,t)}}e.WordPartLeftCommand=p;class c extends p{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordPartLeft",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|15},weight:100}})}}e.CursorWordPartLeft=c,C.CommandsRegistry.registerCommandAlias("cursorWordPartStartLeft","cursorWordPartLeft");class o extends p{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordPartLeftSelect",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|1024|15},weight:100}})}}e.CursorWordPartLeftSelect=o,C.CommandsRegistry.registerCommandAlias("cursorWordPartStartLeftSelect","cursorWordPartLeftSelect");class s extends S.MoveWordCommand{_move(i,n,t,l){return N.WordPartOperations.moveWordPartRight(i,n,t)}}e.WordPartRightCommand=s;class a extends s{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordPartRight",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|17},weight:100}})}}e.CursorWordPartRight=a;class u extends s{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordPartRightSelect",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|1024|17},weight:100}})}}e.CursorWordPartRightSelect=u,b.registerEditorCommand(new d),b.registerEditorCommand(new g),b.registerEditorCommand(new c),b.registerEditorCommand(new o),b.registerEditorCommand(new a),b.registerEditorCommand(new u)}),define(Q[642],J([0,1,7,30,156,47,52,2,17,8,24,13,25,264,16,9,37,58,22,11,64,354]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const h=new a.RawContextKey("accessibilityHelpWidgetVisible",!1);let m=class Ht extends C.Disposable{constructor(I,k){super();this._editor=I,this._widget=this._register(k.createInstance(f,this._editor))}static get(I){return I.getContribution(Ht.ID)}show(){this._widget.show()}hide(){this._widget.hide()}};m.ID="editor.contrib.accessibilityHelpController",m=Me([_e(1,u.IInstantiationService)],m);function _(L,I){return!L||L.length===0?l.AccessibilityHelpNLS.noSelection:L.length===1?I?g.format(l.AccessibilityHelpNLS.singleSelectionRange,L[0].positionLineNumber,L[0].positionColumn,I):g.format(l.AccessibilityHelpNLS.singleSelection,L[0].positionLineNumber,L[0].positionColumn):I?g.format(l.AccessibilityHelpNLS.multiSelectionRange,L.length,I):L.length>0?g.format(l.AccessibilityHelpNLS.multiSelection,L.length):""}let f=class ht extends S.Widget{constructor(I,k,E,T){super();this._contextKeyService=k,this._keybindingService=E,this._openerService=T,this._editor=I,this._isVisibleKey=h.bindTo(this._contextKeyService),this._domNode=N.createFastDomNode(document.createElement("div")),this._domNode.setClassName("accessibilityHelpWidget"),this._domNode.setDisplay("none"),this._domNode.setAttribute("role","dialog"),this._domNode.setAttribute("aria-hidden","true"),this._contentDomNode=N.createFastDomNode(document.createElement("div")),this._contentDomNode.setAttribute("role","document"),this._domNode.appendChild(this._contentDomNode),this._isVisible=!1,this._register(this._editor.onDidLayoutChange(()=>{this._isVisible&&this._layout()})),this._register(b.addStandardDisposableListener(this._contentDomNode.domNode,"keydown",O=>{if(!!this._isVisible&&(O.equals(2048|35)&&(w.alert(l.AccessibilityHelpNLS.emergencyConfOn),this._editor.updateOptions({accessibilitySupport:"on"}),b.clearNode(this._contentDomNode.domNode),this._buildContent(),this._contentDomNode.domNode.focus(),O.preventDefault(),O.stopPropagation()),O.equals(2048|38))){w.alert(l.AccessibilityHelpNLS.openingDocs);let A=this._editor.getRawOptions().accessibilityHelpUrl;typeof A=="undefined"&&(A="https://go.microsoft.com/fwlink/?linkid=852450"),this._openerService.open(p.URI.parse(A)),O.preventDefault(),O.stopPropagation()}})),this.onblur(this._contentDomNode.domNode,()=>{this.hide()}),this._editor.addOverlayWidget(this)}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return ht.ID}getDomNode(){return this._domNode.domNode}getPosition(){return{preference:null}}show(){this._isVisible||(this._isVisible=!0,this._isVisibleKey.set(!0),this._layout(),this._domNode.setDisplay("block"),this._domNode.setAttribute("aria-hidden","false"),this._contentDomNode.domNode.tabIndex=0,this._buildContent(),this._contentDomNode.domNode.focus())}_descriptionForCommand(I,k,E){let T=this._keybindingService.lookupKeybinding(I);return T?g.format(k,T.getAriaLabel()):g.format(E,I)}_buildContent(){const I=this._editor.getOptions(),k=this._editor.getSelections();let E=0;if(k){const B=this._editor.getModel();B&&k.forEach(F=>{E+=B.getValueLengthInRange(F)})}let T=_(k,E);I.get(49)?I.get(75)?T+=l.AccessibilityHelpNLS.readonlyDiffEditor:T+=l.AccessibilityHelpNLS.editableDiffEditor:I.get(75)?T+=l.AccessibilityHelpNLS.readonlyEditor:T+=l.AccessibilityHelpNLS.editableEditor;const O=d.isMacintosh?l.AccessibilityHelpNLS.changeConfigToOnMac:l.AccessibilityHelpNLS.changeConfigToOnWinLinux;switch(I.get(2)){case 0:T+=` + + - `+O;break;case 2:T+=` + + - `+l.AccessibilityHelpNLS.auto_on;break;case 1:T+=` + + - `+l.AccessibilityHelpNLS.auto_off,T+=" "+O;break}I.get(123)?T+=` + + - `+this._descriptionForCommand(s.ToggleTabFocusModeAction.ID,l.AccessibilityHelpNLS.tabFocusModeOnMsg,l.AccessibilityHelpNLS.tabFocusModeOnMsgNoKb):T+=` + + - `+this._descriptionForCommand(s.ToggleTabFocusModeAction.ID,l.AccessibilityHelpNLS.tabFocusModeOffMsg,l.AccessibilityHelpNLS.tabFocusModeOffMsgNoKb);const A=d.isMacintosh?l.AccessibilityHelpNLS.openDocMac:l.AccessibilityHelpNLS.openDocWinLinux;T+=` + + - `+A,T+=` + +`+l.AccessibilityHelpNLS.outroMsg,this._contentDomNode.domNode.appendChild(M.renderFormattedText(T)),this._contentDomNode.domNode.setAttribute("aria-label",T)}hide(){!this._isVisible||(this._isVisible=!1,this._isVisibleKey.reset(),this._domNode.setDisplay("none"),this._domNode.setAttribute("aria-hidden","true"),this._contentDomNode.domNode.tabIndex=-1,b.clearNode(this._contentDomNode.domNode),this._editor.focus())}_layout(){let I=this._editor.getLayoutInfo(),k=Math.max(5,Math.min(ht.WIDTH,I.width-40)),E=Math.max(5,Math.min(ht.HEIGHT,I.height-40));this._domNode.setWidth(k),this._domNode.setHeight(E);let T=Math.round((I.height-E)/2);this._domNode.setTop(T);let O=Math.round((I.width-k)/2);this._domNode.setLeft(O)}};f.ID="editor.contrib.accessibilityHelpWidget",f.WIDTH=500,f.HEIGHT=300,f=Me([_e(1,a.IContextKeyService),_e(2,r.IKeybindingService),_e(3,i.IOpenerService)],f);class v extends c.EditorAction{constructor(){super({id:"editor.action.showAccessibilityHelp",label:l.AccessibilityHelpNLS.showAccessibilityHelpAction,alias:"Show Accessibility Help",precondition:void 0,kbOpts:{primary:512|59,weight:100,linux:{primary:512|1024|59,secondary:[512|59]}}})}run(I,k){let E=m.get(k);E&&E.show()}}c.registerEditorContribution(m.ID,m),c.registerEditorAction(v);const y=c.EditorCommand.bindToContribution(m.get);c.registerEditorCommand(new y({id:"closeAccessibilityHelp",precondition:h,handler:L=>L.hide(),kbOpts:{weight:100+100,kbExpr:o.EditorContextKeys.focus,primary:9,secondary:[1024|9]}})),t.registerThemingParticipant((L,I)=>{const k=L.getColor(n.editorWidgetBackground);k&&I.addRule(`.monaco-editor .accessibilityHelpWidget { background-color: ${k}; }`);const E=L.getColor(n.editorWidgetForeground);E&&I.addRule(`.monaco-editor .accessibilityHelpWidget { color: ${E}; }`);const T=L.getColor(n.widgetShadow);T&&I.addRule(`.monaco-editor .accessibilityHelpWidget { box-shadow: 0 2px 8px ${T}; }`);const O=L.getColor(n.contrastBorder);O&&I.addRule(`.monaco-editor .accessibilityHelpWidget { border: 2px solid ${O}; }`)})}),define(Q[643],J([0,1,35,7,2,13,355]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IPadShowKeyboard=void 0;class S extends M.Disposable{constructor(g){super();this.editor=g,this.widget=null,b.isIPad&&(this._register(g.onDidChangeConfiguration(()=>this.update())),this.update())}update(){const g=!this.editor.getOption(75);!this.widget&&g?this.widget=new C(this.editor):this.widget&&!g&&(this.widget.dispose(),this.widget=null)}dispose(){super.dispose(),this.widget&&(this.widget.dispose(),this.widget=null)}}e.IPadShowKeyboard=S,S.ID="editor.contrib.iPadShowKeyboard";class C extends M.Disposable{constructor(g){super();this.editor=g,this._domNode=document.createElement("textarea"),this._domNode.className="iPadShowKeyboard",this._register(N.addDisposableListener(this._domNode,"touchstart",p=>{this.editor.focus()})),this._register(N.addDisposableListener(this._domNode,"focus",p=>{this.editor.focus()})),this.editor.addOverlayWidget(this)}dispose(){this.editor.removeOverlayWidget(this),super.dispose()}getId(){return C.ID}getDomNode(){return this._domNode}getPosition(){return{preference:1}}}C.ID="editor.contrib.ShowKeyboardWidget",w.registerEditorContribution(S.ID,S)}),define(Q[644],J([0,1,7,29,2,13,18,76,57,114,22,11,64,97,356]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let a=class Ut extends M.Disposable{constructor(l,h,m){super();this._editor=l,this._modeService=m,this._widget=null,this._register(this._editor.onDidChangeModel(_=>this.stop())),this._register(this._editor.onDidChangeModelLanguage(_=>this.stop())),this._register(S.TokenizationRegistry.onDidChange(_=>this.stop())),this._register(this._editor.onKeyUp(_=>_.keyCode===9&&this.stop()))}static get(l){return l.getContribution(Ut.ID)}dispose(){this.stop(),super.dispose()}launch(){this._widget||!this._editor.hasModel()||(this._widget=new n(this._editor,this._modeService))}stop(){this._widget&&(this._widget.dispose(),this._widget=null)}};a.ID="editor.contrib.inspectTokens",a=Me([_e(1,g.IStandaloneThemeService),_e(2,d.IModeService)],a);class u extends w.EditorAction{constructor(){super({id:"editor.action.inspectTokens",label:o.InspectTokensNLS.inspectTokensAction,alias:"Developer: Inspect Tokens",precondition:void 0})}run(l,h){let m=a.get(h);m&&m.launch()}}function r(t){let l="";for(let h=0,m=t.length;hC.NULL_STATE,tokenize:(h,m,_,f)=>C.nullTokenize(t.language,h,_,f),tokenize2:(h,m,_,f)=>C.nullTokenize2(t.id,h,_,f)}}class n extends M.Disposable{constructor(l,h){super();this.allowEditorOverflow=!0,this._editor=l,this._modeService=h,this._model=this._editor.getModel(),this._domNode=document.createElement("div"),this._domNode.className="tokens-inspect-widget",this._tokenizationSupport=i(this._model.getLanguageIdentifier()),this._compute(this._editor.getPosition()),this._register(this._editor.onDidChangeCursorPosition(m=>this._compute(this._editor.getPosition()))),this._editor.addContentWidget(this)}dispose(){this._editor.removeContentWidget(this),super.dispose()}getId(){return n._ID}_compute(l){let h=this._getTokensAtLine(l.lineNumber),m=0;for(let L=h.tokens1.length-1;L>=0;L--){let I=h.tokens1[L];if(l.column-1>=I.offset){m=L;break}}let _=0;for(let L=h.tokens2.length>>>1;L>=0;L--)if(l.column-1>=h.tokens2[L<<1]){_=L;break}let f=this._model.getLineContent(l.lineNumber),v="";if(m{const h=t.getColor(p.editorHoverBorder);if(h){let f=t.type===s.ColorScheme.HIGH_CONTRAST?2:1;l.addRule(`.monaco-editor .tokens-inspect-widget { border: ${f}px solid ${h}; }`),l.addRule(`.monaco-editor .tokens-inspect-widget .tokens-inspect-separator { background-color: ${h}; }`)}const m=t.getColor(p.editorHoverBackground);m&&l.addRule(`.monaco-editor .tokens-inspect-widget { background-color: ${m}; }`);const _=t.getColor(p.editorHoverForeground);_&&l.addRule(`.monaco-editor .tokens-inspect-widget { color: ${_}; }`)})}),define(Q[645],J([0,1,33,96,64,28,578,20,9,37,26,87,32,13,25,78]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneCommandsQuickAccessProvider=void 0;let r=class extends S.AbstractEditorCommandsQuickAccessProvider{constructor(t,l,h,m,_,f){super({showAlias:!1},t,h,m,_,f);this.codeEditorService=l}get activeTextEditorControl(){return C.withNullAsUndefined(this.codeEditorService.getFocusedCodeEditor())}getCommandPicks(){return Ie(this,void 0,void 0,function*(){return this.getCodeEditorCommandPicks()})}};r=Me([_e(0,d.IInstantiationService),_e(1,w.ICodeEditorService),_e(2,g.IKeybindingService),_e(3,p.ICommandService),_e(4,c.ITelemetryService),_e(5,o.INotificationService)],r),e.StandaloneCommandsQuickAccessProvider=r,b.Registry.as(N.Extensions.Quickaccess).registerQuickAccessProvider({ctor:r,prefix:r.PREFIX,helpEntries:[{description:M.QuickCommandNLS.quickCommandHelp,needsEditor:!0}]});class i extends s.EditorAction{constructor(){super({id:"editor.action.quickCommand",label:M.QuickCommandNLS.quickCommandActionLabel,alias:"Command Palette",precondition:void 0,kbOpts:{kbExpr:a.EditorContextKeys.focus,primary:59,weight:100},contextMenuOpts:{group:"z_commands",order:1}})}run(t){t.get(u.IQuickInputService).quickAccess.show(r.PREFIX)}}e.GotoLineAction=i,s.registerEditorAction(i)}),define(Q[646],J([0,1,602,33,96,28,20,64,6,13,25,78]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneGotoLineQuickAccessProvider=void 0;let o=class extends b.AbstractGotoLineQuickAccessProvider{constructor(u){super();this.editorService=u,this.onDidActiveTextEditorControlChange=d.Event.None}get activeTextEditorControl(){return S.withNullAsUndefined(this.editorService.getFocusedCodeEditor())}};o=Me([_e(0,w.ICodeEditorService)],o),e.StandaloneGotoLineQuickAccessProvider=o,N.Registry.as(M.Extensions.Quickaccess).registerQuickAccessProvider({ctor:o,prefix:o.PREFIX,helpEntries:[{description:C.GoToLineNLS.gotoLineActionLabel,needsEditor:!0}]});class s extends g.EditorAction{constructor(){super({id:"editor.action.gotoLine",label:C.GoToLineNLS.gotoLineActionLabel,alias:"Go to Line/Column...",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2048|37,mac:{primary:256|37},weight:100}})}run(u){u.get(c.IQuickInputService).quickAccess.show(o.PREFIX)}}e.GotoLineAction=s,g.registerEditorAction(s)}),define(Q[647],J([0,1,603,33,96,28,20,64,6,13,25,78,123,259]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneGotoSymbolQuickAccessProvider=void 0;let o=class extends b.AbstractGotoSymbolQuickAccessProvider{constructor(u){super();this.editorService=u,this.onDidActiveTextEditorControlChange=d.Event.None}get activeTextEditorControl(){return S.withNullAsUndefined(this.editorService.getFocusedCodeEditor())}};o=Me([_e(0,w.ICodeEditorService)],o),e.StandaloneGotoSymbolQuickAccessProvider=o,N.Registry.as(M.Extensions.Quickaccess).registerQuickAccessProvider({ctor:o,prefix:b.AbstractGotoSymbolQuickAccessProvider.PREFIX,helpEntries:[{description:C.QuickOutlineNLS.quickOutlineActionLabel,prefix:b.AbstractGotoSymbolQuickAccessProvider.PREFIX,needsEditor:!0},{description:C.QuickOutlineNLS.quickOutlineByCategoryActionLabel,prefix:b.AbstractGotoSymbolQuickAccessProvider.PREFIX_BY_CATEGORY,needsEditor:!0}]});class s extends g.EditorAction{constructor(){super({id:"editor.action.quickOutline",label:C.QuickOutlineNLS.quickOutlineActionLabel,alias:"Go to Symbol...",precondition:p.EditorContextKeys.hasDocumentSymbolProvider,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2048|1024|45,weight:100},contextMenuOpts:{group:"navigation",order:3}})}run(u){u.get(c.IQuickInputService).quickAccess.show(b.AbstractGotoSymbolQuickAccessProvider.PREFIX)}}e.GotoLineAction=s,g.registerEditorAction(s)}),define(Q[648],J([0,1,13,114,64]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class w extends b.EditorAction{constructor(){super({id:"editor.action.toggleHighContrast",label:M.ToggleHighContrastNLS.toggleHighContrast,alias:"Toggle High Contrast Theme",precondition:void 0});this._originalThemeName=null}run(C,d){const g=C.get(N.IStandaloneThemeService);this._originalThemeName?(g.setTheme(this._originalThemeName),this._originalThemeName=null):(this._originalThemeName=g.getColorTheme().themeName,g.setTheme("hc-black"))}}b.registerEditorAction(w)}),define(Q[189],J([0,1,7,55,48,2,518,34,68,37,32,11,112,431,17,359]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createActionViewItem=e.SubmenuEntryActionViewItem=e.MenuEntryActionViewItem=e.createAndFillInActionBarActions=void 0;function u(h,m,_,f,v,y){const L=h.getActions(m);return i(L,_,!1,f,v,y),r(L)}e.createAndFillInActionBarActions=u;function r(h){const m=new w.DisposableStore;for(const[,_]of h)for(const f of _)m.add(f);return m}function i(h,m,_,f=L=>L==="navigation",v=Number.MAX_SAFE_INTEGER,y=()=>!1){let L,I;Array.isArray(m)?(L=m,I=m):(L=m.primary,I=m.secondary);const k=new Set;for(const[E,T]of h){let O;f(E)?O=L:(O=I,O.length>0&&O.push(new M.Separator));for(let A of T){_&&(A=A instanceof C.MenuItemAction&&A.alt?A.alt:A);const B=O.push(A);A instanceof M.SubmenuAction&&k.add({group:E,action:A,index:B-1})}}for(const{group:E,action:T,index:O}of k){const A=f(E)?L:I,B=T.actions;(B.length<=1||A.length+B.length-2<=v)&&y(T,E,A.length)&&A.splice(O,1,...B)}if(L!==I&&L.length>v){const E=L.splice(v,L.length-v);I.unshift(...E,new M.Separator)}}let n=class extends o.ActionViewItem{constructor(m,_,f){super(void 0,m,{icon:!!(m.class||m.item.icon),label:!m.class&&!m.item.icon});this._action=m,this._keybindingService=_,this._notificationService=f,this._wantsAltCommand=!1,this._itemClassDispose=this._register(new w.MutableDisposable),this._altKey=b.ModifierKeyEmitter.getInstance()}get _commandAction(){return this._wantsAltCommand&&this._action.alt||this._action}onClick(m){m.preventDefault(),m.stopPropagation(),this.actionRunner.run(this._commandAction,this._context).catch(_=>this._notificationService.error(_))}render(m){super.render(m),m.classList.add("menu-entry"),this._updateItemClass(this._action.item);let _=!1,f=this._altKey.keyStatus.altKey||(a.isWindows||a.isLinux)&&this._altKey.keyStatus.shiftKey;const v=()=>{const y=_&&f;y!==this._wantsAltCommand&&(this._wantsAltCommand=y,this.updateLabel(),this.updateTooltip(),this.updateClass())};this._action.alt&&this._register(this._altKey.event(y=>{f=y.altKey||(a.isWindows||a.isLinux)&&y.shiftKey,v()})),this._register(N.domEvent(m,"mouseleave")(y=>{_=!1,v()})),this._register(N.domEvent(m,"mouseenter")(y=>{_=!0,v()}))}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this._commandAction.label)}updateTooltip(){if(this.label){const m=this._keybindingService.lookupKeybinding(this._commandAction.id),_=m&&m.getLabel(),f=this._commandAction.tooltip||this._commandAction.label;this.label.title=_?S.localize(0,null,f,_):f}}updateClass(){this.options.icon&&(this._commandAction!==this._action?this._action.alt&&this._updateItemClass(this._action.alt.item):this._action.alt&&this._updateItemClass(this._action.item))}_updateItemClass(m){var _;this._itemClassDispose.value=void 0;const{element:f,label:v}=this;if(!(!f||!v)){const y=this._commandAction.checked&&((_=m.toggled)===null||_===void 0?void 0:_.icon)?m.toggled.icon:m.icon;if(!!y)if(c.ThemeIcon.isThemeIcon(y)){const L=c.ThemeIcon.asClassName(y);v.classList.add(...L.split(" ")),this._itemClassDispose.value=w.toDisposable(()=>{v.classList.remove(...L.split(" "))})}else y.light&&v.style.setProperty("--menu-entry-icon-light",b.asCSSUrl(y.light)),y.dark&&v.style.setProperty("--menu-entry-icon-dark",b.asCSSUrl(y.dark)),v.classList.add("icon"),this._itemClassDispose.value=w.toDisposable(()=>{v.classList.remove("icon"),v.style.removeProperty("--menu-entry-icon-light"),v.style.removeProperty("--menu-entry-icon-dark")})}}};n=Me([_e(1,g.IKeybindingService),_e(2,p.INotificationService)],n),e.MenuEntryActionViewItem=n;let t=class extends s.DropdownMenuActionViewItem{constructor(m,_){super(m,{getActions:()=>m.actions},_,{menuAsChild:!0,classNames:c.ThemeIcon.isThemeIcon(m.item.icon)?c.ThemeIcon.asClassName(m.item.icon):void 0})}render(m){if(super.render(m),this.element){m.classList.add("menu-entry");const{icon:_}=this._action.item;_&&!c.ThemeIcon.isThemeIcon(_)&&(this.element.classList.add("icon"),_.light&&this.element.style.setProperty("--menu-entry-icon-light",b.asCSSUrl(_.light)),_.dark&&this.element.style.setProperty("--menu-entry-icon-dark",b.asCSSUrl(_.dark)))}}};t=Me([_e(1,d.IContextMenuService)],t),e.SubmenuEntryActionViewItem=t;function l(h,m){return m instanceof C.MenuItemAction?h.createInstance(n,m):m instanceof C.SubmenuItemAction?h.createInstance(t,m):void 0}e.createActionViewItem=l}),define(Q[118],J([0,1,7,83,48,29,6,40,28,144,543,500,16,9,74,13,22,27,189,349]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.peekViewEditorMatchHighlightBorder=e.peekViewEditorMatchHighlight=e.peekViewResultsMatchHighlight=e.peekViewEditorGutterBackground=e.peekViewEditorBackground=e.peekViewResultsSelectionForeground=e.peekViewResultsSelectionBackground=e.peekViewResultsFileForeground=e.peekViewResultsMatchForeground=e.peekViewResultsBackground=e.peekViewBorder=e.peekViewTitleInfoForeground=e.peekViewTitleForeground=e.peekViewTitleBackground=e.PeekViewWidget=e.getOuterEditor=e.PeekContext=e.IPeekViewService=void 0,e.IPeekViewService=s.createDecorator("IPeekViewService"),a.registerSingleton(e.IPeekViewService,class{constructor(){this._widgets=new Map}addExclusiveWidget(f,v){const y=this._widgets.get(f);y&&(y.listener.dispose(),y.widget.dispose());const L=()=>{const I=this._widgets.get(f);I&&I.widget===v&&(I.listener.dispose(),this._widgets.delete(f))};this._widgets.set(f,{widget:v,listener:v.onDidClose(L)})}});var t;(function(f){f.inPeekEditor=new o.RawContextKey("inReferenceSearchEditor",!0),f.notInPeekEditor=f.inPeekEditor.toNegated()})(t=e.PeekContext||(e.PeekContext={}));let l=class{constructor(v,y){v instanceof g.EmbeddedCodeEditorWidget&&t.inPeekEditor.bindTo(y)}dispose(){}};l.ID="editor.contrib.referenceController",l=Me([_e(1,o.IContextKeyService)],l),u.registerEditorContribution(l.ID,l);function h(f){let v=f.get(d.ICodeEditorService).getFocusedCodeEditor();return v instanceof g.EmbeddedCodeEditorWidget?v.getParentEditor():v}e.getOuterEditor=h;const m={headerBackgroundColor:w.Color.white,primaryHeadingColor:w.Color.fromHex("#333333"),secondaryHeadingColor:w.Color.fromHex("#6c6c6cb3")};let _=class extends p.ZoneWidget{constructor(v,y,L){super(v,y);this.instantiationService=L,this._onDidClose=new S.Emitter,this.onDidClose=this._onDidClose.event,C.mixin(this.options,m,!1)}dispose(){this.disposed||(this.disposed=!0,super.dispose(),this._onDidClose.fire(this))}style(v){let y=this.options;v.headerBackgroundColor&&(y.headerBackgroundColor=v.headerBackgroundColor),v.primaryHeadingColor&&(y.primaryHeadingColor=v.primaryHeadingColor),v.secondaryHeadingColor&&(y.secondaryHeadingColor=v.secondaryHeadingColor),super.style(v)}_applyStyles(){super._applyStyles();let v=this.options;this._headElement&&v.headerBackgroundColor&&(this._headElement.style.backgroundColor=v.headerBackgroundColor.toString()),this._primaryHeading&&v.primaryHeadingColor&&(this._primaryHeading.style.color=v.primaryHeadingColor.toString()),this._secondaryHeading&&v.secondaryHeadingColor&&(this._secondaryHeading.style.color=v.secondaryHeadingColor.toString()),this._bodyElement&&v.frameColor&&(this._bodyElement.style.borderColor=v.frameColor.toString())}_fillContainer(v){this.setCssClass("peekview-widget"),this._headElement=b.$(".head"),this._bodyElement=b.$(".body"),this._fillHead(this._headElement),this._fillBody(this._bodyElement),v.appendChild(this._headElement),v.appendChild(this._bodyElement)}_fillHead(v,y){const L=b.$(".peekview-title");b.append(this._headElement,L),b.addStandardDisposableListener(L,"click",E=>this._onTitleClick(E)),this._fillTitleIcon(L),this._primaryHeading=b.$("span.filename"),this._secondaryHeading=b.$("span.dirname"),this._metaHeading=b.$("span.meta"),b.append(L,this._primaryHeading,this._secondaryHeading,this._metaHeading);const I=b.$(".peekview-actions");b.append(this._headElement,I);const k=this._getActionBarOptions();this._actionbarWidget=new N.ActionBar(I,k),this._disposables.add(this._actionbarWidget),y||this._actionbarWidget.push(new M.Action("peekview.close",c.localize(0,null),i.Codicon.close.classNames,!0,()=>(this.dispose(),Promise.resolve())),{label:!1,icon:!0})}_fillTitleIcon(v){}_getActionBarOptions(){return{actionViewItemProvider:n.createActionViewItem.bind(void 0,this.instantiationService),orientation:0}}_onTitleClick(v){}setTitle(v,y){this._primaryHeading&&this._secondaryHeading&&(this._primaryHeading.innerText=v,this._primaryHeading.setAttribute("aria-label",v),y?this._secondaryHeading.innerText=y:b.clearNode(this._secondaryHeading))}setMetaTitle(v){this._metaHeading&&(v?(this._metaHeading.innerText=v,b.show(this._metaHeading)):b.hide(this._metaHeading))}_doLayout(v,y){if(!this._isShowing&&v<0){this.dispose();return}const L=Math.ceil(this.editor.getOption(53)*1.2),I=Math.round(v-(L+2));this._doLayoutHead(L,y),this._doLayoutBody(I,y)}_doLayoutHead(v,y){this._headElement&&(this._headElement.style.height=`${v}px`,this._headElement.style.lineHeight=this._headElement.style.height)}_doLayoutBody(v,y){this._bodyElement&&(this._bodyElement.style.height=`${v}px`)}};_=Me([_e(2,s.IInstantiationService)],_),e.PeekViewWidget=_,e.peekViewTitleBackground=r.registerColor("peekViewTitle.background",{dark:"#1E1E1E",light:"#FFFFFF",hc:"#0C141F"},c.localize(1,null)),e.peekViewTitleForeground=r.registerColor("peekViewTitleLabel.foreground",{dark:"#FFFFFF",light:"#333333",hc:"#FFFFFF"},c.localize(2,null)),e.peekViewTitleInfoForeground=r.registerColor("peekViewTitleDescription.foreground",{dark:"#ccccccb3",light:"#616161e6",hc:"#FFFFFF99"},c.localize(3,null)),e.peekViewBorder=r.registerColor("peekView.border",{dark:"#007acc",light:"#007acc",hc:r.contrastBorder},c.localize(4,null)),e.peekViewResultsBackground=r.registerColor("peekViewResult.background",{dark:"#252526",light:"#F3F3F3",hc:w.Color.black},c.localize(5,null)),e.peekViewResultsMatchForeground=r.registerColor("peekViewResult.lineForeground",{dark:"#bbbbbb",light:"#646465",hc:w.Color.white},c.localize(6,null)),e.peekViewResultsFileForeground=r.registerColor("peekViewResult.fileForeground",{dark:w.Color.white,light:"#1E1E1E",hc:w.Color.white},c.localize(7,null)),e.peekViewResultsSelectionBackground=r.registerColor("peekViewResult.selectionBackground",{dark:"#3399ff33",light:"#3399ff33",hc:null},c.localize(8,null)),e.peekViewResultsSelectionForeground=r.registerColor("peekViewResult.selectionForeground",{dark:w.Color.white,light:"#6C6C6C",hc:w.Color.white},c.localize(9,null)),e.peekViewEditorBackground=r.registerColor("peekViewEditor.background",{dark:"#001F33",light:"#F2F8FC",hc:w.Color.black},c.localize(10,null)),e.peekViewEditorGutterBackground=r.registerColor("peekViewEditorGutter.background",{dark:e.peekViewEditorBackground,light:e.peekViewEditorBackground,hc:e.peekViewEditorBackground},c.localize(11,null)),e.peekViewResultsMatchHighlight=r.registerColor("peekViewResult.matchHighlightBackground",{dark:"#ea5c004d",light:"#ea5c004d",hc:null},c.localize(12,null)),e.peekViewEditorMatchHighlight=r.registerColor("peekViewEditor.matchHighlightBackground",{dark:"#ff8f0099",light:"#f5d802de",hc:null},c.localize(13,null)),e.peekViewEditorMatchHighlightBorder=r.registerColor("peekViewEditor.matchHighlightBorder",{dark:null,light:null,hc:r.activeContrastBorder},c.localize(14,null))}),define(Q[649],J([0,1,7,83,2,117,511,189,34,16,9]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestWidgetStatus=void 0;class c extends C.MenuEntryActionViewItem{updateLabel(){const a=this._keybindingService.lookupKeybinding(this._action.id);if(!a)return super.updateLabel();this.label&&(this.label.textContent=S.localize(0,null,this._action.label,c.symbolPrintEnter(a)))}static symbolPrintEnter(a){var u;return(u=a.getLabel())===null||u===void 0?void 0:u.replace(/\benter\b/gi,"\u23CE")}}let o=class{constructor(a,u,r,i){this._menuService=r,this._contextKeyService=i,this._menuDisposables=new M.DisposableStore,this.element=b.append(a,b.$(".suggest-status-bar"));const n=t=>t instanceof d.MenuItemAction?u.createInstance(c,t):void 0;this._leftActions=new N.ActionBar(this.element,{actionViewItemProvider:n}),this._rightActions=new N.ActionBar(this.element,{actionViewItemProvider:n}),this._leftActions.domNode.classList.add("left"),this._rightActions.domNode.classList.add("right")}dispose(){this._menuDisposables.dispose(),this.element.remove()}show(){const a=this._menuService.createMenu(w.suggestWidgetStatusbarMenu,this._contextKeyService),u=()=>{const r=[],i=[];for(let[n,t]of a.getActions())n==="left"?r.push(...t):i.push(...t);this._leftActions.clear(),this._leftActions.push(r),this._rightActions.clear(),this._rightActions.push(i)};this._menuDisposables.add(a.onDidChange(()=>u())),this._menuDisposables.add(a)}hide(){this._menuDisposables.clear()}};o=Me([_e(1,p.IInstantiationService),_e(2,d.IMenuService),_e(3,g.IContextKeyService)],o),e.SuggestWidgetStatus=o}),define(Q[650],J([0,1,15,6,2,34,26,16]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MenuService=void 0;let d=class{constructor(c){this._commandService=c}createMenu(c,o,s=!1){return new g(c,s,this._commandService,o,this)}};d=Me([_e(0,S.ICommandService)],d),e.MenuService=d;let g=class et{constructor(c,o,s,a,u){this._id=c,this._fireEventsForSubmenuChanges=o,this._commandService=s,this._contextKeyService=a,this._menuService=u,this._dispoables=new M.DisposableStore,this._onDidChange=new N.Emitter,this.onDidChange=this._onDidChange.event,this._menuGroups=[],this._contextKeys=new Set,this._build();const r=new b.RunOnceScheduler(()=>this._build(),50);this._dispoables.add(r),this._dispoables.add(w.MenuRegistry.onDidChangeMenu(n=>{n.has(c)&&r.schedule()}));const i=new b.RunOnceScheduler(()=>this._onDidChange.fire(this),50);this._dispoables.add(i),this._dispoables.add(a.onDidChangeContext(n=>{n.affectsSome(this._contextKeys)&&i.schedule()}))}dispose(){this._dispoables.dispose(),this._onDidChange.dispose()}_build(){this._menuGroups.length=0,this._contextKeys.clear();const c=w.MenuRegistry.getMenuItems(this._id);let o;c.sort(et._compareMenuItems);for(let s of c){const a=s.group||"";(!o||o[0]!==a)&&(o=[a,[]],this._menuGroups.push(o)),o[1].push(s),this._collectContextKeys(s)}this._onDidChange.fire(this)}_collectContextKeys(c){if(et._fillInKbExprKeys(c.when,this._contextKeys),w.isIMenuItem(c)){if(c.command.precondition&&et._fillInKbExprKeys(c.command.precondition,this._contextKeys),c.command.toggled){const o=c.command.toggled.condition||c.command.toggled;et._fillInKbExprKeys(o,this._contextKeys)}}else this._fireEventsForSubmenuChanges&&w.MenuRegistry.getMenuItems(c.submenu).forEach(this._collectContextKeys,this)}getActions(c){const o=[];for(let s of this._menuGroups){const[a,u]=s,r=[];for(const i of u)if(this._contextKeyService.contextMatchesRules(i.when)){const n=w.isIMenuItem(i)?new w.MenuItemAction(i.command,i.alt,c,this._contextKeyService,this._commandService):new w.SubmenuItemAction(i,this._menuService,this._contextKeyService,c);r.push(n)}r.length>0&&o.push([a,r])}return o}static _fillInKbExprKeys(c,o){if(c)for(let s of c.keys())o.add(s)}static _compareMenuItems(c,o){let s=c.group,a=o.group;if(s!==a){if(s){if(!a)return-1}else return 1;if(s==="navigation")return-1;if(a==="navigation")return 1;let i=s.localeCompare(a);if(i!==0)return i}let u=c.order||0,r=o.order||0;return ur?1:et._compareTitles(w.isIMenuItem(c)?c.command.title:c.title,w.isIMenuItem(o)?o.command.title:o.title)}static _compareTitles(c,o){const s=typeof c=="string"?c:c.original,a=typeof o=="string"?o:o.original;return s.localeCompare(a)}};g=Me([_e(2,S.ICommandService),_e(3,C.IContextKeyService),_e(4,w.IMenuService)],g)}),define(Q[651],J([0,1,579,68,87,32,11,37,2,7]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuService=void 0;let p=class extends d.Disposable{constructor(o,s,a,u,r){super();this.contextMenuHandler=new b.ContextMenuHandler(a,o,s,u,r)}configure(o){this.contextMenuHandler.configure(o)}showContextMenu(o){this.contextMenuHandler.showContextMenu(o),g.ModifierKeyEmitter.getInstance().resetKeyStatus()}};p=Me([_e(0,M.ITelemetryService),_e(1,w.INotificationService),_e(2,N.IContextViewService),_e(3,C.IKeybindingService),_e(4,S.IThemeService)],p),e.ContextMenuService=p}),define(Q[147],J([0,1,7,312,105,6,2,523,46,95,16,9,37,33,116,11,250,234,428,427,65,315]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WorkbenchCompressibleAsyncDataTree=e.WorkbenchAsyncDataTree=e.WorkbenchDataTree=e.WorkbenchCompressibleObjectTree=e.WorkbenchObjectTree=e.WorkbenchTable=e.WorkbenchPagedList=e.WorkbenchList=e.didBindWorkbenchListAutomaticKeyboardNavigation=e.WorkbenchListAutomaticKeyboardNavigation=e.WorkbenchListAutomaticKeyboardNavigationKey=e.WorkbenchListSupportsKeyboardNavigation=e.WorkbenchListMultiSelection=e.WorkbenchListDoubleSelection=e.WorkbenchListHasSelectionOrFocus=e.WorkbenchListFocusContextKey=e.WorkbenchListSupportsMultiSelectContextKey=e.ListService=e.IListService=void 0,e.IListService=c.createDecorator("listService");let m=class{constructor(oe){this._themeService=oe,this.disposables=new S.DisposableStore,this.lists=[],this._lastFocusedWidget=void 0,this._hasCreatedStyleController=!1}get lastFocusedList(){return this._lastFocusedWidget}register(oe,ae){if(!this._hasCreatedStyleController){this._hasCreatedStyleController=!0;const j=new M.DefaultStyleController(b.createStyleSheet(),"");this.disposables.add(a.attachListStyler(j,this._themeService))}if(this.lists.some(j=>j.widget===oe))throw new Error("Cannot register the same widget multiple times");const G={widget:oe,extraContextKeys:ae};return this.lists.push(G),oe.getHTMLElement()===document.activeElement&&(this._lastFocusedWidget=oe),S.combinedDisposable(oe.onDidFocus(()=>this._lastFocusedWidget=oe),S.toDisposable(()=>this.lists.splice(this.lists.indexOf(G),1)),oe.onDidDispose(()=>{this.lists=this.lists.filter(j=>j!==G),this._lastFocusedWidget===oe&&(this._lastFocusedWidget=void 0)}))}dispose(){this.disposables.dispose()}};m=Me([_e(0,u.IThemeService)],m),e.ListService=m;const _=new p.RawContextKey("listFocus",!0);e.WorkbenchListSupportsMultiSelectContextKey=new p.RawContextKey("listSupportsMultiselect",!0),e.WorkbenchListFocusContextKey=p.ContextKeyExpr.and(_,p.ContextKeyExpr.not(r.InputFocusedContextKey)),e.WorkbenchListHasSelectionOrFocus=new p.RawContextKey("listHasSelectionOrFocus",!1),e.WorkbenchListDoubleSelection=new p.RawContextKey("listDoubleSelection",!1),e.WorkbenchListMultiSelection=new p.RawContextKey("listMultiSelection",!1),e.WorkbenchListSupportsKeyboardNavigation=new p.RawContextKey("listSupportsKeyboardNavigation",!0),e.WorkbenchListAutomaticKeyboardNavigationKey="listAutomaticKeyboardNavigation",e.WorkbenchListAutomaticKeyboardNavigation=new p.RawContextKey(e.WorkbenchListAutomaticKeyboardNavigationKey,!0),e.didBindWorkbenchListAutomaticKeyboardNavigation=!1;function f(ie,oe){const ae=ie.createScoped(oe.getHTMLElement());return _.bindTo(ae),ae}const v="workbench.list.multiSelectModifier",y="workbench.list.openMode",L="workbench.list.horizontalScrolling",I="workbench.list.keyboardNavigation",k="workbench.list.automaticKeyboardNavigation",E="workbench.tree.indent",T="workbench.tree.renderIndentGuides",O="workbench.list.smoothScrolling",A="workbench.tree.expandMode";function B(ie){return ie.getValue(v)==="alt"}class F extends S.Disposable{constructor(oe){super();this.configurationService=oe,this.useAltAsMultipleSelectionModifier=B(oe),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(oe=>{oe.affectsConfiguration(v)&&(this.useAltAsMultipleSelectionModifier=B(this.configurationService))}))}isSelectionSingleChangeEvent(oe){return this.useAltAsMultipleSelectionModifier?oe.browserEvent.altKey:M.isSelectionSingleChangeEvent(oe)}isSelectionRangeChangeEvent(oe){return M.isSelectionRangeChangeEvent(oe)}}function D(ie,oe,ae){const G=new S.DisposableStore,j=Object.assign({},ie);if(ie.multipleSelectionSupport!==!1&&!ie.multipleSelectionController){const te=new F(oe);j.multipleSelectionController=te,G.add(te)}return j.keyboardNavigationDelegate={mightProducePrintableCharacter(te){return ae.mightProducePrintableCharacter(te)}},j.smoothScrolling=oe.getValue(O),[j,G]}let R=class extends M.List{constructor(oe,ae,G,j,te,Z,ue,he,re,ce){const me=typeof te.horizontalScrolling!="undefined"?te.horizontalScrolling:re.getValue(L),[Ce,be]=D(te,re,ce);super(oe,ae,G,j,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},a.computeStyles(he.getColorTheme(),a.defaultListStyles)),Ce),{horizontalScrolling:me}));this.disposables.add(be),this.contextKeyService=f(Z,this),this.themeService=he,e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService).set(te.multipleSelectionSupport!==!1),this.listHasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.listDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.listMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.horizontalScrolling=te.horizontalScrolling,this._useAltAsMultipleSelectionModifier=B(re),this.disposables.add(this.contextKeyService),this.disposables.add(ue.register(this)),te.overrideStyles&&this.updateStyles(te.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const De=this.getSelection(),Re=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(De.length>0||Re.length>0),this.listMultiSelection.set(De.length>1),this.listDoubleSelection.set(De.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const De=this.getSelection(),Re=this.getFocus();this.listHasSelectionOrFocus.set(De.length>0||Re.length>0)})),this.disposables.add(re.onDidChangeConfiguration(De=>{De.affectsConfiguration(v)&&(this._useAltAsMultipleSelectionModifier=B(re));let Re={};if(De.affectsConfiguration(L)&&this.horizontalScrolling===void 0){const Ee=re.getValue(L);Re=Object.assign(Object.assign({},Re),{horizontalScrolling:Ee})}if(De.affectsConfiguration(O)){const Ee=re.getValue(O);Re=Object.assign(Object.assign({},Re),{smoothScrolling:Ee})}Object.keys(Re).length>0&&this.updateOptions(Re)})),this.navigator=new Y(this,Object.assign({configurationService:re},te)),this.disposables.add(this.navigator)}updateOptions(oe){super.updateOptions(oe),oe.overrideStyles&&this.updateStyles(oe.overrideStyles)}updateStyles(oe){var ae;(ae=this._styler)===null||ae===void 0||ae.dispose(),this._styler=a.attachListStyler(this,this.themeService,oe)}dispose(){var oe;(oe=this._styler)===null||oe===void 0||oe.dispose(),super.dispose()}};R=Me([_e(5,p.IContextKeyService),_e(6,e.IListService),_e(7,u.IThemeService),_e(8,d.IConfigurationService),_e(9,o.IKeybindingService)],R),e.WorkbenchList=R;let W=class extends N.PagedList{constructor(oe,ae,G,j,te,Z,ue,he,re,ce){const me=typeof te.horizontalScrolling!="undefined"?te.horizontalScrolling:re.getValue(L),[Ce,be]=D(te,re,ce);super(oe,ae,G,j,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},a.computeStyles(he.getColorTheme(),a.defaultListStyles)),Ce),{horizontalScrolling:me}));this.disposables=new S.DisposableStore,this.disposables.add(be),this.contextKeyService=f(Z,this),this.themeService=he,this.horizontalScrolling=te.horizontalScrolling,e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService).set(te.multipleSelectionSupport!==!1),this._useAltAsMultipleSelectionModifier=B(re),this.disposables.add(this.contextKeyService),this.disposables.add(ue.register(this)),te.overrideStyles&&this.updateStyles(te.overrideStyles),te.overrideStyles&&this.disposables.add(a.attachListStyler(this,he,te.overrideStyles)),this.disposables.add(re.onDidChangeConfiguration(De=>{De.affectsConfiguration(v)&&(this._useAltAsMultipleSelectionModifier=B(re));let Re={};if(De.affectsConfiguration(L)&&this.horizontalScrolling===void 0){const Ee=re.getValue(L);Re=Object.assign(Object.assign({},Re),{horizontalScrolling:Ee})}if(De.affectsConfiguration(O)){const Ee=re.getValue(O);Re=Object.assign(Object.assign({},Re),{smoothScrolling:Ee})}Object.keys(Re).length>0&&this.updateOptions(Re)})),this.navigator=new Y(this,Object.assign({configurationService:re},te)),this.disposables.add(this.navigator)}updateOptions(oe){super.updateOptions(oe),oe.overrideStyles&&this.updateStyles(oe.overrideStyles)}updateStyles(oe){var ae;(ae=this._styler)===null||ae===void 0||ae.dispose(),this._styler=a.attachListStyler(this,this.themeService,oe)}dispose(){var oe;(oe=this._styler)===null||oe===void 0||oe.dispose(),this.disposables.dispose(),super.dispose()}};W=Me([_e(5,p.IContextKeyService),_e(6,e.IListService),_e(7,u.IThemeService),_e(8,d.IConfigurationService),_e(9,o.IKeybindingService)],W),e.WorkbenchPagedList=W;let x=class extends h.Table{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me){const Ce=typeof Z.horizontalScrolling!="undefined"?Z.horizontalScrolling:ce.getValue(L),[be,Le]=D(Z,ce,me);super(oe,ae,G,j,te,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},a.computeStyles(re.getColorTheme(),a.defaultListStyles)),be),{horizontalScrolling:Ce}));this.disposables=new S.DisposableStore,this.disposables.add(Le),this.contextKeyService=f(ue,this),this.themeService=re,e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService).set(Z.multipleSelectionSupport!==!1),this.listHasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.listDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.listMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.horizontalScrolling=Z.horizontalScrolling,this._useAltAsMultipleSelectionModifier=B(ce),this.disposables.add(this.contextKeyService),this.disposables.add(he.register(this)),Z.overrideStyles&&this.updateStyles(Z.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const Re=this.getSelection(),Ee=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(Re.length>0||Ee.length>0),this.listMultiSelection.set(Re.length>1),this.listDoubleSelection.set(Re.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const Re=this.getSelection(),Ee=this.getFocus();this.listHasSelectionOrFocus.set(Re.length>0||Ee.length>0)})),this.disposables.add(ce.onDidChangeConfiguration(Re=>{Re.affectsConfiguration(v)&&(this._useAltAsMultipleSelectionModifier=B(ce));let Ee={};if(Re.affectsConfiguration(L)&&this.horizontalScrolling===void 0){const Ae=ce.getValue(L);Ee=Object.assign(Object.assign({},Ee),{horizontalScrolling:Ae})}if(Re.affectsConfiguration(O)){const Ae=ce.getValue(O);Ee=Object.assign(Object.assign({},Ee),{smoothScrolling:Ae})}Object.keys(Ee).length>0&&this.updateOptions(Ee)})),this.navigator=new ee(this,Object.assign({configurationService:ce},Z)),this.disposables.add(this.navigator)}updateOptions(oe){super.updateOptions(oe),oe.overrideStyles&&this.updateStyles(oe.overrideStyles)}updateStyles(oe){var ae;(ae=this._styler)===null||ae===void 0||ae.dispose(),this._styler=a.attachListStyler(this,this.themeService,oe)}dispose(){var oe;(oe=this._styler)===null||oe===void 0||oe.dispose(),this.disposables.dispose(),super.dispose()}};x=Me([_e(6,p.IContextKeyService),_e(7,e.IListService),_e(8,u.IThemeService),_e(9,d.IConfigurationService),_e(10,o.IKeybindingService)],x),e.WorkbenchTable=x;class K extends S.Disposable{constructor(oe,ae){var G,j;super();this.widget=oe,this._onDidOpen=this._register(new w.Emitter),this.onDidOpen=this._onDidOpen.event,this.openOnFocus=(G=ae==null?void 0:ae.openOnFocus)!==null&&G!==void 0?G:!1,this._register(w.Event.filter(this.widget.onDidChangeSelection,te=>te.browserEvent instanceof KeyboardEvent)(te=>this.onSelectionFromKeyboard(te))),this._register(this.widget.onPointer(te=>this.onPointer(te.element,te.browserEvent))),this._register(this.widget.onMouseDblClick(te=>this.onMouseDblClick(te.element,te.browserEvent))),this.openOnFocus&&this._register(w.Event.filter(this.widget.onDidChangeFocus,te=>te.browserEvent instanceof KeyboardEvent)(te=>this.onFocusFromKeyboard(te))),typeof(ae==null?void 0:ae.openOnSingleClick)!="boolean"&&(ae==null?void 0:ae.configurationService)?(this.openOnSingleClick=(ae==null?void 0:ae.configurationService.getValue(y))!=="doubleClick",this._register(ae==null?void 0:ae.configurationService.onDidChangeConfiguration(()=>{this.openOnSingleClick=(ae==null?void 0:ae.configurationService.getValue(y))!=="doubleClick"}))):this.openOnSingleClick=(j=ae==null?void 0:ae.openOnSingleClick)!==null&&j!==void 0?j:!0}onFocusFromKeyboard(oe){const ae=this.widget.getFocus();this.widget.setSelection(ae,oe.browserEvent);const G=oe.browserEvent,j=typeof G.preserveFocus=="boolean"?G.preserveFocus:!0,te=typeof G.pinned=="boolean"?G.pinned:!j,Z=!1;this._open(this.getSelectedElement(),j,te,Z,oe.browserEvent)}onSelectionFromKeyboard(oe){if(oe.elements.length===1){const ae=oe.browserEvent,G=typeof ae.preserveFocus=="boolean"?ae.preserveFocus:!0,j=typeof ae.pinned=="boolean"?ae.pinned:!G,te=!1;this._open(this.getSelectedElement(),G,j,te,oe.browserEvent)}}onPointer(oe,ae){if(!!this.openOnSingleClick&&ae.detail!==2){const j=ae.button===1,te=!0,Z=j,ue=ae.ctrlKey||ae.metaKey||ae.altKey;this._open(oe,te,Z,ue,ae)}}onMouseDblClick(oe,ae){if(!!ae){const G=!1,j=!0,te=ae.ctrlKey||ae.metaKey||ae.altKey;this._open(oe,G,j,te,ae)}}_open(oe,ae,G,j,te){!oe||this._onDidOpen.fire({editorOptions:{preserveFocus:ae,pinned:G,revealIfVisible:!0},sideBySide:j,element:oe,browserEvent:te})}}class Y extends K{constructor(oe,ae){super(oe,ae);this.widget=oe}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class ee extends K{constructor(oe,ae){super(oe,ae);this.widget=oe}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class se extends K{constructor(oe,ae){super(oe,ae);this.widget=oe}getSelectedElement(){var oe;return(oe=this.widget.getSelection()[0])!==null&&oe!==void 0?oe:void 0}}function ne(ie,oe){let ae=!1;return G=>{if(ae)return ae=!1,!1;const j=oe.softDispatch(G,ie);return j&&j.enterChord?(ae=!0,!1):(ae=!1,!0)}}let le=class extends i.ObjectTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me){const{options:Ce,getAutomaticKeyboardNavigation:be,disposable:Le}=U(ae,te,Z,re,ce,me);super(oe,ae,G,j,Ce);this.disposables.add(Le),this.internals=new H(this,te,be,te.overrideStyles,Z,ue,he,re,me),this.disposables.add(this.internals)}};le=Me([_e(5,p.IContextKeyService),_e(6,e.IListService),_e(7,u.IThemeService),_e(8,d.IConfigurationService),_e(9,o.IKeybindingService),_e(10,l.IAccessibilityService)],le),e.WorkbenchObjectTree=le;let X=class extends i.CompressibleObjectTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me){const{options:Ce,getAutomaticKeyboardNavigation:be,disposable:Le}=U(ae,te,Z,re,ce,me);super(oe,ae,G,j,Ce);this.disposables.add(Le),this.internals=new H(this,te,be,te.overrideStyles,Z,ue,he,re,me),this.disposables.add(this.internals)}updateOptions(oe={}){super.updateOptions(oe),oe.overrideStyles&&this.internals.updateStyleOverrides(oe.overrideStyles)}};X=Me([_e(5,p.IContextKeyService),_e(6,e.IListService),_e(7,u.IThemeService),_e(8,d.IConfigurationService),_e(9,o.IKeybindingService),_e(10,l.IAccessibilityService)],X),e.WorkbenchCompressibleObjectTree=X;let z=class extends t.DataTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me,Ce){const{options:be,getAutomaticKeyboardNavigation:Le,disposable:De}=U(ae,Z,ue,ce,me,Ce);super(oe,ae,G,j,te,be);this.disposables.add(De),this.internals=new H(this,Z,Le,Z.overrideStyles,ue,he,re,ce,Ce),this.disposables.add(this.internals)}updateOptions(oe={}){super.updateOptions(oe),oe.overrideStyles&&this.internals.updateStyleOverrides(oe.overrideStyles)}};z=Me([_e(6,p.IContextKeyService),_e(7,e.IListService),_e(8,u.IThemeService),_e(9,d.IConfigurationService),_e(10,o.IKeybindingService),_e(11,l.IAccessibilityService)],z),e.WorkbenchDataTree=z;let P=class extends n.AsyncDataTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me,Ce){const{options:be,getAutomaticKeyboardNavigation:Le,disposable:De}=U(ae,Z,ue,ce,me,Ce);super(oe,ae,G,j,te,be);this.disposables.add(De),this.internals=new H(this,Z,Le,Z.overrideStyles,ue,he,re,ce,Ce),this.disposables.add(this.internals)}get onDidOpen(){return this.internals.onDidOpen}updateOptions(oe={}){super.updateOptions(oe),oe.overrideStyles&&this.internals.updateStyleOverrides(oe.overrideStyles)}};P=Me([_e(6,p.IContextKeyService),_e(7,e.IListService),_e(8,u.IThemeService),_e(9,d.IConfigurationService),_e(10,o.IKeybindingService),_e(11,l.IAccessibilityService)],P),e.WorkbenchAsyncDataTree=P;let V=class extends n.CompressibleAsyncDataTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me,Ce,be){const{options:Le,getAutomaticKeyboardNavigation:De,disposable:Re}=U(ae,ue,he,me,Ce,be);super(oe,ae,G,j,te,Z,Le);this.disposables.add(Re),this.internals=new H(this,ue,De,ue.overrideStyles,he,re,ce,me,be),this.disposables.add(this.internals)}};V=Me([_e(7,p.IContextKeyService),_e(8,e.IListService),_e(9,u.IThemeService),_e(10,d.IConfigurationService),_e(11,o.IKeybindingService),_e(12,l.IAccessibilityService)],V),e.WorkbenchCompressibleAsyncDataTree=V;function U(ie,oe,ae,G,j,te){var Z;e.WorkbenchListSupportsKeyboardNavigation.bindTo(ae),e.didBindWorkbenchListAutomaticKeyboardNavigation||(e.WorkbenchListAutomaticKeyboardNavigation.bindTo(ae),e.didBindWorkbenchListAutomaticKeyboardNavigation=!0);const ue=()=>{let Le=ae.getContextKeyValue(e.WorkbenchListAutomaticKeyboardNavigationKey);return Le&&(Le=G.getValue(k)),Le},he=te.isScreenReaderOptimized(),re=oe.simpleKeyboardNavigation||he?"simple":G.getValue(I),ce=oe.horizontalScrolling!==void 0?oe.horizontalScrolling:G.getValue(L),[me,Ce]=D(oe,G,j),be=oe.additionalScrollHeight;return{getAutomaticKeyboardNavigation:ue,disposable:Ce,options:Object.assign(Object.assign({keyboardSupport:!1},me),{indent:G.getValue(E),renderIndentGuides:G.getValue(T),smoothScrolling:G.getValue(O),automaticKeyboardNavigation:ue(),simpleKeyboardNavigation:re==="simple",filterOnType:re==="filter",horizontalScrolling:ce,keyboardNavigationEventFilter:ne(ie,j),additionalScrollHeight:be,hideTwistiesOfChildlessElements:oe.hideTwistiesOfChildlessElements,expandOnlyOnTwistieClick:(Z=oe.expandOnlyOnTwistieClick)!==null&&Z!==void 0?Z:G.getValue(A)==="doubleClick"})}}let H=class{constructor(oe,ae,G,j,te,Z,ue,he,re){this.tree=oe,this.themeService=ue,this.disposables=[],this.contextKeyService=f(te,oe),e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService).set(ae.multipleSelectionSupport!==!1),this.hasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.hasDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.hasMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this._useAltAsMultipleSelectionModifier=B(he);const me=new Set;me.add(e.WorkbenchListAutomaticKeyboardNavigationKey);const Ce=()=>{const Le=re.isScreenReaderOptimized()?"simple":he.getValue(I);oe.updateOptions({simpleKeyboardNavigation:Le==="simple",filterOnType:Le==="filter"})};this.updateStyleOverrides(j),this.disposables.push(this.contextKeyService,Z.register(oe),oe.onDidChangeSelection(()=>{const be=oe.getSelection(),Le=oe.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.hasSelectionOrFocus.set(be.length>0||Le.length>0),this.hasMultiSelection.set(be.length>1),this.hasDoubleSelection.set(be.length===2)})}),oe.onDidChangeFocus(()=>{const be=oe.getSelection(),Le=oe.getFocus();this.hasSelectionOrFocus.set(be.length>0||Le.length>0)}),he.onDidChangeConfiguration(be=>{let Le={};if(be.affectsConfiguration(v)&&(this._useAltAsMultipleSelectionModifier=B(he)),be.affectsConfiguration(E)){const De=he.getValue(E);Le=Object.assign(Object.assign({},Le),{indent:De})}if(be.affectsConfiguration(T)){const De=he.getValue(T);Le=Object.assign(Object.assign({},Le),{renderIndentGuides:De})}if(be.affectsConfiguration(O)){const De=he.getValue(O);Le=Object.assign(Object.assign({},Le),{smoothScrolling:De})}if(be.affectsConfiguration(I)&&Ce(),be.affectsConfiguration(k)&&(Le=Object.assign(Object.assign({},Le),{automaticKeyboardNavigation:G()})),be.affectsConfiguration(L)&&ae.horizontalScrolling===void 0){const De=he.getValue(L);Le=Object.assign(Object.assign({},Le),{horizontalScrolling:De})}be.affectsConfiguration(A)&&ae.expandOnlyOnTwistieClick===void 0&&(Le=Object.assign(Object.assign({},Le),{expandOnlyOnTwistieClick:he.getValue(A)==="doubleClick"})),Object.keys(Le).length>0&&oe.updateOptions(Le)}),this.contextKeyService.onDidChangeContext(be=>{be.affectsSome(me)&&oe.updateOptions({automaticKeyboardNavigation:G()})}),re.onDidChangeScreenReaderOptimized(()=>Ce())),this.navigator=new se(oe,Object.assign({configurationService:he},ae)),this.disposables.push(this.navigator)}get onDidOpen(){return this.navigator.onDidOpen}updateStyleOverrides(oe){S.dispose(this.styler),this.styler=oe?a.attachListStyler(this.tree,this.themeService,oe):S.Disposable.None}dispose(){this.disposables=S.dispose(this.disposables),S.dispose(this.styler),this.styler=void 0}};H=Me([_e(4,p.IContextKeyService),_e(5,e.IListService),_e(6,u.IThemeService),_e(7,d.IConfigurationService),_e(8,l.IAccessibilityService)],H),s.Registry.as(g.Extensions.Configuration).registerConfiguration({id:"workbench",order:7,title:C.localize(0,null),type:"object",properties:{[v]:{type:"string",enum:["ctrlCmd","alt"],enumDescriptions:[C.localize(1,null),C.localize(2,null)],default:"ctrlCmd",description:C.localize(3,null)},[y]:{type:"string",enum:["singleClick","doubleClick"],default:"singleClick",description:C.localize(4,null)},[L]:{type:"boolean",default:!1,description:C.localize(5,null)},[E]:{type:"number",default:8,minimum:0,maximum:40,description:C.localize(6,null)},[T]:{type:"string",enum:["none","onHover","always"],default:"onHover",description:C.localize(7,null)},[O]:{type:"boolean",default:!1,description:C.localize(8,null)},[I]:{type:"string",enum:["simple","highlight","filter"],enumDescriptions:[C.localize(9,null),C.localize(10,null),C.localize(11,null)],default:"highlight",description:C.localize(12,null)},[k]:{type:"boolean",default:!0,markdownDescription:C.localize(13,null)},[A]:{type:"string",enum:["singleClick","doubleClick"],default:"singleClick",description:C.localize(14,null)}}})}),define(Q[652],J([0,1,139,9,11,22,23,116,16,65,443,147,574]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputService=void 0;let s=class extends M.Themable{constructor(u,r,i,n,t){super(i);this.instantiationService=u,this.contextKeyService=r,this.accessibilityService=n,this.layoutService=t,this.contexts=new Map}get controller(){return this._controller||(this._controller=this._register(this.createController())),this._controller}get quickAccess(){return this._quickAccess||(this._quickAccess=this._register(this.instantiationService.createInstance(o.QuickAccessController))),this._quickAccess}createController(u=this.layoutService,r){var i,n;const t={idPrefix:"quickInput_",container:u.container,ignoreFocusOut:()=>!1,isScreenReaderOptimized:()=>this.accessibilityService.isScreenReaderOptimized(),backKeybindingLabel:()=>{},setContextKey:h=>this.setContextKey(h),returnFocus:()=>u.focus(),createList:(h,m,_,f,v)=>this.instantiationService.createInstance(c.WorkbenchList,h,m,_,f,v),styles:this.computeStyles()},l=this._register(new p.QuickInputController(Object.assign(Object.assign({},t),r)));return l.layout(u.dimension,(n=(i=u.offset)===null||i===void 0?void 0:i.top)!==null&&n!==void 0?n:0),this._register(u.onDidLayout(h=>{var m,_;return l.layout(h,(_=(m=u.offset)===null||m===void 0?void 0:m.top)!==null&&_!==void 0?_:0)})),this._register(l.onShow(()=>this.resetContextKeys())),this._register(l.onHide(()=>this.resetContextKeys())),l}setContextKey(u){let r;u&&(r=this.contexts.get(u),r||(r=new d.RawContextKey(u,!1).bindTo(this.contextKeyService),this.contexts.set(u,r))),!(r&&r.get())&&(this.resetContextKeys(),r&&r.set(!0))}resetContextKeys(){this.contexts.forEach(u=>{u.get()&&u.reset()})}pick(u,r={},i=S.CancellationToken.None){return this.controller.pick(u,r,i)}createQuickPick(){return this.controller.createQuickPick()}updateStyles(){this.controller.applyStyles(this.computeStyles())}computeStyles(){return{widget:Object.assign({},C.computeStyles(this.theme,{quickInputBackground:w.quickInputBackground,quickInputForeground:w.quickInputForeground,quickInputTitleBackground:w.quickInputTitleBackground,contrastBorder:w.contrastBorder,widgetShadow:w.widgetShadow})),inputBox:C.computeStyles(this.theme,{inputForeground:w.inputForeground,inputBackground:w.inputBackground,inputBorder:w.inputBorder,inputValidationInfoBackground:w.inputValidationInfoBackground,inputValidationInfoForeground:w.inputValidationInfoForeground,inputValidationInfoBorder:w.inputValidationInfoBorder,inputValidationWarningBackground:w.inputValidationWarningBackground,inputValidationWarningForeground:w.inputValidationWarningForeground,inputValidationWarningBorder:w.inputValidationWarningBorder,inputValidationErrorBackground:w.inputValidationErrorBackground,inputValidationErrorForeground:w.inputValidationErrorForeground,inputValidationErrorBorder:w.inputValidationErrorBorder}),countBadge:C.computeStyles(this.theme,{badgeBackground:w.badgeBackground,badgeForeground:w.badgeForeground,badgeBorder:w.contrastBorder}),button:C.computeStyles(this.theme,{buttonForeground:w.buttonForeground,buttonBackground:w.buttonBackground,buttonHoverBackground:w.buttonHoverBackground,buttonBorder:w.contrastBorder}),progressBar:C.computeStyles(this.theme,{progressBarBackground:w.progressBarBackground}),list:C.computeStyles(this.theme,{listBackground:w.quickInputBackground,listInactiveFocusForeground:w.listFocusForeground,listInactiveFocusBackground:w.quickInputListFocusBackground,listFocusOutline:w.activeContrastBorder,listInactiveFocusOutline:w.activeContrastBorder,pickerGroupBorder:w.pickerGroupBorder,pickerGroupForeground:w.pickerGroupForeground})}}};s=Me([_e(0,N.IInstantiationService),_e(1,d.IContextKeyService),_e(2,M.IThemeService),_e(3,g.IAccessibilityService),_e(4,b.ILayoutService)],s),e.QuickInputService=s}),define(Q[653],J([0,1,13,11,23,9,16,65,139,28,652,88,357]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputEditorWidget=e.QuickInputEditorContribution=e.StandaloneQuickInputServiceImpl=e.EditorScopedQuickInputServiceImpl=void 0;let o=class extends p.QuickInputService{constructor(i,n,t,l,h,m){super(n,t,l,h,m);this.host=void 0;const _=a.get(i);this.host={_serviceBrand:void 0,get container(){return _.widget.getDomNode()},get dimension(){return i.getLayoutInfo()},get onDidLayout(){return i.onDidLayoutChange},focus:()=>i.focus()}}createController(){return super.createController(this.host)}};o=Me([_e(1,w.IInstantiationService),_e(2,S.IContextKeyService),_e(3,N.IThemeService),_e(4,C.IAccessibilityService),_e(5,d.ILayoutService)],o),e.EditorScopedQuickInputServiceImpl=o;let s=class{constructor(i,n){this.instantiationService=i,this.codeEditorService=n,this.mapEditorToService=new Map}get activeService(){const i=this.codeEditorService.getFocusedCodeEditor();if(!i)throw new Error("Quick input service needs a focused editor to work.");let n=this.mapEditorToService.get(i);if(!n){const t=n=this.instantiationService.createInstance(o,i);this.mapEditorToService.set(i,n),c.once(i.onDidDispose)(()=>{t.dispose(),this.mapEditorToService.delete(i)})}return n}get quickAccess(){return this.activeService.quickAccess}pick(i,n={},t=M.CancellationToken.None){return this.activeService.pick(i,n,t)}createQuickPick(){return this.activeService.createQuickPick()}};s=Me([_e(0,w.IInstantiationService),_e(1,g.ICodeEditorService)],s),e.StandaloneQuickInputServiceImpl=s;class a{constructor(i){this.editor=i,this.widget=new u(this.editor)}static get(i){return i.getContribution(a.ID)}dispose(){this.widget.dispose()}}e.QuickInputEditorContribution=a,a.ID="editor.controller.quickInput";class u{constructor(i){this.codeEditor=i,this.domNode=document.createElement("div"),this.codeEditor.addOverlayWidget(this)}getId(){return u.ID}getDomNode(){return this.domNode}getPosition(){return{preference:2}}dispose(){this.codeEditor.removeOverlayWidget(this)}}e.QuickInputEditorWidget=u,u.ID="editor.contrib.quickInputWidget",b.registerEditorContribution(a.ID,a)}),define(Q[654],J([0,1,82,11,22,27]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SeverityIcon=void 0;var S;(function(C){function d(g){switch(g){case b.default.Ignore:return"severity-ignore "+w.Codicon.info.classNames;case b.default.Info:return w.Codicon.info.classNames;case b.default.Warning:return w.Codicon.warning.classNames;case b.default.Error:return w.Codicon.error.classNames;default:return""}}C.className=d})(S=e.SeverityIcon||(e.SeverityIcon={})),N.registerThemingParticipant((C,d)=>{const g=C.getColor(M.problemsErrorIconForeground);if(g){const o=w.Codicon.error.cssSelector;d.addRule(` + .monaco-editor .zone-widget ${o}, + .markers-panel .marker-icon${o}, + .extensions-viewlet > .extensions ${o} { + color: ${g}; + } + `)}const p=C.getColor(M.problemsWarningIconForeground);if(p){const o=w.Codicon.warning.cssSelector;d.addRule(` + .monaco-editor .zone-widget ${o}, + .markers-panel .marker-icon${o}, + .extensions-viewlet > .extensions ${o}, + .extension-editor ${o} { + color: ${p}; + } + `)}const c=C.getColor(M.problemsInfoIconForeground);if(c){const o=w.Codicon.info.cssSelector;d.addRule(` + .monaco-editor .zone-widget ${o}, + .markers-panel .marker-icon${o}, + .extensions-viewlet > .extensions ${o}, + .extension-editor ${o} { + color: ${c}; + } + `)}})}),define(Q[655],J([0,1,480,7,2,85,3,22,11,29,61,159,19,6,118,44,654,58,34,16,189,9,8,115,343]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorMarkerNavigationBackground=e.editorMarkerNavigationInfo=e.editorMarkerNavigationWarning=e.editorMarkerNavigationError=e.MarkerNavigationWidget=void 0;class f{constructor(E,T,O,A,B){this._openerService=A,this._labelService=B,this._lines=0,this._longestLineLength=0,this._relatedDiagnostics=new WeakMap,this._disposables=new M.DisposableStore,this._editor=T;const F=document.createElement("div");F.className="descriptioncontainer",this._messageBlock=document.createElement("div"),this._messageBlock.classList.add("message"),this._messageBlock.setAttribute("aria-live","assertive"),this._messageBlock.setAttribute("role","alert"),F.appendChild(this._messageBlock),this._relatedBlock=document.createElement("div"),F.appendChild(this._relatedBlock),this._disposables.add(N.addStandardDisposableListener(this._relatedBlock,"click",D=>{D.preventDefault();const R=this._relatedDiagnostics.get(D.target);R&&O(R)})),this._scrollable=new p.ScrollableElement(F,{horizontal:1,vertical:1,useShadows:!1,horizontalScrollbarSize:3,verticalScrollbarSize:3}),E.appendChild(this._scrollable.getDomNode()),this._disposables.add(this._scrollable.onScroll(D=>{F.style.left=`-${D.scrollLeft}px`,F.style.top=`-${D.scrollTop}px`})),this._disposables.add(this._scrollable)}dispose(){M.dispose(this._disposables)}update(E){const{source:T,message:O,relatedInformation:A,code:B}=E;let F=((T==null?void 0:T.length)||0)+"()".length;B&&(typeof B=="string"?F+=B.length:F+=B.value.length);const D=m.splitLines(O);this._lines=D.length,this._longestLineLength=0;for(const Y of D)this._longestLineLength=Math.max(Y.length+F,this._longestLineLength);N.clearNode(this._messageBlock),this._messageBlock.setAttribute("aria-label",this.getAriaLabel(E)),this._editor.applyFontInfo(this._messageBlock);let R=this._messageBlock;for(const Y of D)R=document.createElement("div"),R.innerText=Y,Y===""&&(R.style.height=this._messageBlock.style.lineHeight),this._messageBlock.appendChild(R);if(T||B){const Y=document.createElement("span");if(Y.classList.add("details"),R.appendChild(Y),T){const ee=document.createElement("span");ee.innerText=T,ee.classList.add("source"),Y.appendChild(ee)}if(B)if(typeof B=="string"){const ee=document.createElement("span");ee.innerText=`(${B})`,ee.classList.add("code"),Y.appendChild(ee)}else{this._codeLink=N.$("a.code-link"),this._codeLink.setAttribute("href",`${B.target.toString()}`),this._codeLink.onclick=se=>{this._openerService.open(B.target),se.preventDefault(),se.stopPropagation()};const ee=N.append(this._codeLink,N.$("span"));ee.innerText=B.value,Y.appendChild(this._codeLink)}}if(N.clearNode(this._relatedBlock),this._editor.applyFontInfo(this._relatedBlock),o.isNonEmptyArray(A)){const Y=this._relatedBlock.appendChild(document.createElement("div"));Y.style.paddingTop=`${Math.floor(this._editor.getOption(53)*.66)}px`,this._lines+=1;for(const ee of A){let se=document.createElement("div"),ne=document.createElement("a");ne.classList.add("filename"),ne.innerText=`${c.getBaseLabel(ee.resource)}(${ee.startLineNumber}, ${ee.startColumn}): `,ne.title=this._labelService.getUriLabel(ee.resource),this._relatedDiagnostics.set(ne,ee);let le=document.createElement("span");le.innerText=ee.message,se.appendChild(ne),se.appendChild(le),this._lines+=1,Y.appendChild(se)}}const W=this._editor.getOption(38),x=Math.ceil(W.typicalFullwidthCharacterWidth*this._longestLineLength*.75),K=W.lineHeight*this._lines;this._scrollable.setScrollDimensions({scrollWidth:x,scrollHeight:K})}layout(E,T){this._scrollable.getDomNode().style.height=`${E}px`,this._scrollable.getDomNode().style.width=`${T}px`,this._scrollable.setScrollDimensions({width:T,height:E})}getHeightInLines(){return Math.min(17,this._lines)}getAriaLabel(E){let T="";switch(E.severity){case w.MarkerSeverity.Error:T=b.localize(0,null);break;case w.MarkerSeverity.Warning:T=b.localize(1,null);break;case w.MarkerSeverity.Info:T=b.localize(2,null);break;case w.MarkerSeverity.Hint:T=b.localize(3,null);break}let O=b.localize(4,null,T,E.startLineNumber+":"+E.startColumn);const A=this._editor.getModel();return A&&E.startLineNumber<=A.getLineCount()&&E.startLineNumber>=1&&(O=`${A.getLineContent(E.startLineNumber)}, ${O}`),O}}let v=class Kt extends a.PeekViewWidget{constructor(E,T,O,A,B,F,D){super(E,{showArrow:!0,showFrame:!0,isAccessible:!0},B);this._themeService=T,this._openerService=O,this._menuService=A,this._contextKeyService=F,this._labelService=D,this._callOnDispose=new M.DisposableStore,this._onDidSelectRelatedInformation=new s.Emitter,this.onDidSelectRelatedInformation=this._onDidSelectRelatedInformation.event,this._severity=w.MarkerSeverity.Warning,this._backgroundColor=g.Color.white,this._applyTheme(T.getColorTheme()),this._callOnDispose.add(T.onDidColorThemeChange(this._applyTheme.bind(this))),this.create()}_applyTheme(E){this._backgroundColor=E.getColor(e.editorMarkerNavigationBackground);let T=e.editorMarkerNavigationError;this._severity===w.MarkerSeverity.Warning?T=e.editorMarkerNavigationWarning:this._severity===w.MarkerSeverity.Info&&(T=e.editorMarkerNavigationInfo);const O=E.getColor(T);this.style({arrowColor:O,frameColor:O,headerBackgroundColor:this._backgroundColor,primaryHeadingColor:E.getColor(a.peekViewTitleForeground),secondaryHeadingColor:E.getColor(a.peekViewTitleInfoForeground)})}_applyStyles(){this._parentContainer&&(this._parentContainer.style.backgroundColor=this._backgroundColor?this._backgroundColor.toString():""),super._applyStyles()}dispose(){this._callOnDispose.dispose(),super.dispose()}_fillHead(E){super._fillHead(E),this._disposables.add(this._actionbarWidget.actionRunner.onBeforeRun(A=>this.editor.focus()));const T=[],O=this._menuService.createMenu(Kt.TitleMenu,this._contextKeyService);l.createAndFillInActionBarActions(O,void 0,T),this._actionbarWidget.push(T,{label:!1,icon:!0,index:0}),O.dispose()}_fillTitleIcon(E){this._icon=N.append(E,N.$(""))}_fillBody(E){this._parentContainer=E,E.classList.add("marker-widget"),this._parentContainer.tabIndex=0,this._parentContainer.setAttribute("role","tooltip"),this._container=document.createElement("div"),E.appendChild(this._container),this._message=new f(this._container,this.editor,T=>this._onDidSelectRelatedInformation.fire(T),this._openerService,this._labelService),this._disposables.add(this._message)}show(){throw new Error("call showAtMarker")}showAtMarker(E,T,O){this._container.classList.remove("stale"),this._message.update(E),this._severity=E.severity,this._applyTheme(this._themeService.getColorTheme());let A=S.Range.lift(E);const B=this.editor.getPosition();let F=B&&A.containsPosition(B)?B:A.getStartPosition();super.show(F,this.computeRequiredHeight());const D=this.editor.getModel();if(D){const R=O>1?b.localize(5,null,T,O):b.localize(6,null,T,O);this.setTitle(u.basename(D.uri),R)}this._icon.className=`codicon ${r.SeverityIcon.className(w.MarkerSeverity.toSeverity(this._severity))}`,this.editor.revealPositionNearTop(F,0),this.editor.focus()}updateMarker(E){this._container.classList.remove("stale"),this._message.update(E)}showStale(){this._container.classList.add("stale"),this._relayout()}_doLayoutBody(E,T){super._doLayoutBody(E,T),this._heightInPixel=E,this._message.layout(E,T),this._container.style.height=`${E}px`}_onWidth(E){this._message.layout(this._heightInPixel,E)}_relayout(){super._relayout(this.computeRequiredHeight())}computeRequiredHeight(){return 3+this._message.getHeightInLines()}};v.TitleMenu=new n.MenuId("gotoErrorTitleMenu"),v=Me([_e(1,d.IThemeService),_e(2,i.IOpenerService),_e(3,n.IMenuService),_e(4,h.IInstantiationService),_e(5,t.IContextKeyService),_e(6,_.ILabelService)],v),e.MarkerNavigationWidget=v;let y=C.oneOf(C.editorErrorForeground,C.editorErrorBorder),L=C.oneOf(C.editorWarningForeground,C.editorWarningBorder),I=C.oneOf(C.editorInfoForeground,C.editorInfoBorder);e.editorMarkerNavigationError=C.registerColor("editorMarkerNavigationError.background",{dark:y,light:y,hc:y},b.localize(7,null)),e.editorMarkerNavigationWarning=C.registerColor("editorMarkerNavigationWarning.background",{dark:L,light:L,hc:L},b.localize(8,null)),e.editorMarkerNavigationInfo=C.registerColor("editorMarkerNavigationInfo.background",{dark:I,light:I,hc:I},b.localize(9,null)),e.editorMarkerNavigationBackground=C.registerColor("editorMarkerNavigation.background",{dark:"#2D2D30",light:g.Color.white,hc:"#0C141F"},b.localize(10,null)),d.registerThemingParticipant((k,E)=>{const T=k.getColor(C.textLinkForeground);T&&(E.addRule(`.monaco-editor .marker-widget a { color: ${T}; }`),E.addRule(`.monaco-editor .marker-widget a.code-link span:hover { color: ${T}; }`))})}),define(Q[80],J([0,1,33,11,6,528,185,15,27]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.widgetClose=e.iconsSchemaId=e.getIconRegistry=e.registerIcon=e.Extensions=void 0,e.Extensions={IconContribution:"base.contributions.icons"};class g{constructor(){this._onDidChange=new M.Emitter,this.onDidChange=this._onDidChange.event,this.iconSchema={definitions:{icons:{type:"object",properties:{fontId:{type:"string",description:w.localize(0,null)},fontCharacter:{type:"string",description:w.localize(1,null)}},additionalProperties:!1,defaultSnippets:[{body:{fontCharacter:"\\\\e030"}}]}},type:"object",properties:{}},this.iconReferenceSchema={type:"string",pattern:`^${d.CSSIcon.iconNameExpression}$`,enum:[],enumDescriptions:[]},this.iconsById={},this.iconFontsById={}}registerIcon(i,n,t,l){const h=this.iconsById[i];if(h){if(t&&!h.description){h.description=t,this.iconSchema.properties[i].markdownDescription=`${t} $(${i})`;const f=this.iconReferenceSchema.enum.indexOf(i);f!==-1&&(this.iconReferenceSchema.enumDescriptions[f]=t),this._onDidChange.fire()}return h}let m={id:i,description:t,defaults:n,deprecationMessage:l};this.iconsById[i]=m;let _={$ref:"#/definitions/icons"};return l&&(_.deprecationMessage=l),t&&(_.markdownDescription=`${t}: $(${i})`),this.iconSchema.properties[i]=_,this.iconReferenceSchema.enum.push(i),this.iconReferenceSchema.enumDescriptions.push(t||""),this._onDidChange.fire(),{id:i}}getIcons(){return Object.keys(this.iconsById).map(i=>this.iconsById[i])}getIcon(i){return this.iconsById[i]}getIconSchema(){return this.iconSchema}getIconFont(i){return this.iconFontsById[i]}toString(){const i=(h,m)=>h.id.localeCompare(m.id),n=h=>{for(;N.ThemeIcon.isThemeIcon(h.defaults);)h=this.iconsById[h.defaults.id];return`codicon codicon-${h?h.id:""}`};let t=[];t.push("| preview | identifier | default codicon ID | description"),t.push("| ----------- | --------------------------------- | --------------------------------- | --------------------------------- |");const l=Object.keys(this.iconsById).map(h=>this.iconsById[h]);for(const h of l.filter(m=>!!m.description).sort(i))t.push(`||${h.id}|${N.ThemeIcon.isThemeIcon(h.defaults)?h.defaults.id:h.id}|${h.description||""}|`);t.push("| preview | identifier "),t.push("| ----------- | --------------------------------- |");for(const h of l.filter(m=>!N.ThemeIcon.isThemeIcon(m.defaults)).sort(i))t.push(`||${h.id}|`);return t.join(` +`)}}const p=new g;b.Registry.add(e.Extensions.IconContribution,p);function c(r,i,n,t){return p.registerIcon(r,i,n,t)}e.registerIcon=c;function o(){return p}e.getIconRegistry=o;function s(){for(const r of d.iconRegistry.all)p.registerIcon(r.id,r.definition,r.description);d.iconRegistry.onDidRegister(r=>p.registerIcon(r.id,r.definition,r.description))}s(),e.iconsSchemaId="vscode://schemas/icons";let a=b.Registry.as(S.Extensions.JSONContribution);a.registerSchema(e.iconsSchemaId,p.getIconSchema());const u=new C.RunOnceScheduler(()=>a.notifySchemaChanged(e.iconsSchemaId),200);p.onDidChange(()=>{u.isScheduled()||u.schedule()}),e.widgetClose=c("widget-close",d.Codicon.close,w.localize(2,null))}),define(Q[656],J([0,1,450,7,30,83,61,48,2,69,13,28,38,113,14,49,129,63,16,22,11,27,80,333]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m){"use strict";var _;Object.defineProperty(e,"__esModule",{value:!0}),e.DiffReview=void 0;const f=3;class v{constructor(F,D,R,W){this.originalLineStart=F,this.originalLineEnd=D,this.modifiedLineStart=R,this.modifiedLineEnd=W}getType(){return this.originalLineStart===0?1:this.modifiedLineStart===0?2:0}}class y{constructor(F){this.entries=F}}const L=m.registerIcon("diff-review-insert",h.Codicon.add,b.localize(0,null)),I=m.registerIcon("diff-review-remove",h.Codicon.remove,b.localize(1,null)),k=m.registerIcon("diff-review-close",h.Codicon.close,b.localize(2,null));class E extends d.Disposable{constructor(F){super();this._width=0,this._diffEditor=F,this._isVisible=!1,this.shadow=M.createFastDomNode(document.createElement("div")),this.shadow.setClassName("diff-review-shadow"),this.actionBarContainer=M.createFastDomNode(document.createElement("div")),this.actionBarContainer.setClassName("diff-review-actions"),this._actionBar=this._register(new w.ActionBar(this.actionBarContainer.domNode)),this._actionBar.push(new C.Action("diffreview.close",b.localize(3,null),"close-diff-review "+l.ThemeIcon.asClassName(k),!0,()=>(this.hide(),Promise.resolve(null))),{label:!1,icon:!0}),this.domNode=M.createFastDomNode(document.createElement("div")),this.domNode.setClassName("diff-review monaco-editor-background"),this._content=M.createFastDomNode(document.createElement("div")),this._content.setClassName("diff-review-content"),this._content.setAttribute("role","code"),this.scrollbar=this._register(new S.DomScrollableElement(this._content.domNode,{})),this.domNode.domNode.appendChild(this.scrollbar.getDomNode()),this._register(F.onDidUpdateDiff(()=>{!this._isVisible||(this._diffs=this._compute(),this._render())})),this._register(F.getModifiedEditor().onDidChangeCursorPosition(()=>{!this._isVisible||this._render()})),this._register(N.addStandardDisposableListener(this.domNode.domNode,"click",D=>{D.preventDefault();let R=N.findParentWithClass(D.target,"diff-review-row");R&&this._goToRow(R)})),this._register(N.addStandardDisposableListener(this.domNode.domNode,"keydown",D=>{(D.equals(18)||D.equals(2048|18)||D.equals(512|18))&&(D.preventDefault(),this._goToRow(this._getNextRow())),(D.equals(16)||D.equals(2048|16)||D.equals(512|16))&&(D.preventDefault(),this._goToRow(this._getPrevRow())),(D.equals(9)||D.equals(2048|9)||D.equals(512|9)||D.equals(1024|9))&&(D.preventDefault(),this.hide()),(D.equals(10)||D.equals(3))&&(D.preventDefault(),this.accept())})),this._diffs=[],this._currentDiff=null}prev(){let F=0;if(this._isVisible||(this._diffs=this._compute()),this._isVisible){let R=-1;for(let W=0,x=this._diffs.length;W0){const te=F[se-1];te.originalEndLineNumber===0?oe=te.originalStartLineNumber+1:oe=te.originalEndLineNumber+1,te.modifiedEndLineNumber===0?ae=te.modifiedStartLineNumber+1:ae=te.modifiedEndLineNumber+1}let G=$-f+1,j=ie-f+1;if(Goe){const te=oe-G;G=G+te,j=j+te}if(j>ae){const te=ae-j;G=G+te,j=j+te}U[H++]=new v($,G,ie,j)}W[x++]=new y(U)}let K=W[0].entries,Y=[],ee=0;for(let se=1,ne=W.length;sele)&&(le=he),re!==0&&(X===0||rez)&&(z=ce)}let P=document.createElement("div");P.className="diff-review-row";let V=document.createElement("div");V.className="diff-review-cell diff-review-summary";const U=le-ne+1,H=z-X+1;V.appendChild(document.createTextNode(`${Y+1}/${this._diffs.length}: @@ -${ne},${U} +${X},${H} @@`)),P.setAttribute("data-line",String(X));const $=j=>j===0?b.localize(4,null):j===1?b.localize(5,null):b.localize(6,null,j),ie=$(U),oe=$(H);P.setAttribute("aria-label",b.localize(7,null,Y+1,this._diffs.length,ne,ie,X,oe)),P.appendChild(V),P.setAttribute("role","listitem"),se.appendChild(P);const ae=D.get(53);let G=X;for(let j=0,te=ee.length;j>>0,ee=new Uint32Array(2);ee[0]=x.length,ee[1]=Y;const se=new s.LineTokens(ee,x),ne=i.ViewLineRenderingData.isBasicASCII(x,F.mightContainNonBasicASCII()),le=i.ViewLineRenderingData.containsRTL(x,ne,F.mightContainRTL());return r.renderViewLine2(new r.RenderLineInput(K.isMonospace&&!D.get(26),K.canUseHalfwidthRightwardsArrow,x,!1,ne,le,0,se,[],R,0,K.spaceWidth,K.middotWidth,K.wsmiddotWidth,D.get(100),D.get(83),D.get(77),D.get(39)!==o.EditorFontLigatures.OFF,null)).html}}e.DiffReview=E,E._ttPolicy=(_=window.trustedTypes)===null||_===void 0?void 0:_.createPolicy("diffReview",{createHTML:B=>B}),l.registerThemingParticipant((B,F)=>{const D=B.getColor(u.editorLineNumbers);D&&F.addRule(`.monaco-diff-editor .diff-review-line-number { color: ${D}; }`);const R=B.getColor(t.scrollbarShadow);R&&F.addRule(`.monaco-diff-editor .diff-review-shadow { box-shadow: ${R} 0 -6px 6px -6px inset; }`)});class T extends p.EditorAction{constructor(){super({id:"editor.action.diffReview.next",label:b.localize(13,null),alias:"Go to Next Difference",precondition:n.ContextKeyExpr.has("isInDiffEditor"),kbOpts:{kbExpr:null,primary:65,weight:100}})}run(F,D){const R=A(F);R&&R.diffReviewNext()}}class O extends p.EditorAction{constructor(){super({id:"editor.action.diffReview.prev",label:b.localize(14,null),alias:"Go to Previous Difference",precondition:n.ContextKeyExpr.has("isInDiffEditor"),kbOpts:{kbExpr:null,primary:1024|65,weight:100}})}run(F,D){const R=A(F);R&&R.diffReviewPrev()}}function A(B){const F=B.get(c.ICodeEditorService),D=F.listDiffEditors(),R=F.getActiveCodeEditor();if(!R)return null;for(let W=0,x=D.length;W!this._zonesMap[String(ce.id)])}clean(re){this._zones.length>0&&re.changeViewZones(ce=>{for(const me of this._zones)ce.removeZone(me)}),this._zones=[],this._zonesMap={},this._decorations=re.deltaDecorations(this._decorations,[])}apply(re,ce,me,Ce){const be=Ce?p.StableEditorScrollState.capture(re):null;re.changeViewZones(Le=>{for(const De of this._zones)Le.removeZone(De);for(const De of this._inlineDiffMargins)De.dispose();this._zones=[],this._zonesMap={},this._inlineDiffMargins=[];for(let De=0,Re=me.zones.length;Dehe});let X=class Ge extends d.Disposable{constructor(re,ce,me,Ce,be,Le,De,Re,Ee,Ae,Se,we){super();this._editorProgressService=we,this._onDidDispose=this._register(new C.Emitter),this.onDidDispose=this._onDidDispose.event,this._onDidUpdateDiff=this._register(new C.Emitter),this.onDidUpdateDiff=this._onDidUpdateDiff.event,this._onDidContentSizeChange=this._register(new C.Emitter),this._lastOriginalWarning=null,this._lastModifiedWarning=null,this._editorWorkerService=be,this._codeEditorService=Re,this._contextKeyService=this._register(Le.createScoped(re)),this._instantiationService=De.createChild(new y.ServiceCollection([f.IContextKeyService,this._contextKeyService])),this._contextKeyService.createKey("isInDiffEditor",!0),this._themeService=Ee,this._notificationService=Ae,this._id=++ee,this._state=0,this._updatingDiffProgress=null,this._domElement=re,ce=ce||{},this._renderSideBySide=!0,typeof ce.renderSideBySide!="undefined"&&(this._renderSideBySide=ce.renderSideBySide),this._maxComputationTime=5e3,typeof ce.maxComputationTime!="undefined"&&(this._maxComputationTime=ce.maxComputationTime),this._ignoreTrimWhitespace=!0,typeof ce.ignoreTrimWhitespace!="undefined"&&(this._ignoreTrimWhitespace=ce.ignoreTrimWhitespace),this._renderIndicators=!0,typeof ce.renderIndicators!="undefined"&&(this._renderIndicators=ce.renderIndicators),this._originalIsEditable=a.boolean(ce.originalEditable,!1),this._diffCodeLens=a.boolean(ce.diffCodeLens,!1),this._diffWordWrap=G(ce.diffWordWrap,"inherit"),typeof ce.isInEmbeddedEditor!="undefined"?this._contextKeyService.createKey("isInEmbeddedDiffEditor",ce.isInEmbeddedEditor):this._contextKeyService.createKey("isInEmbeddedDiffEditor",!1),this._renderOverviewRuler=!0,typeof ce.renderOverviewRuler!="undefined"&&(this._renderOverviewRuler=Boolean(ce.renderOverviewRuler)),this._updateDecorationsRunner=this._register(new S.RunOnceScheduler(()=>this._updateDecorations(),0)),this._containerDomElement=document.createElement("div"),this._containerDomElement.className=Ge._getClassName(this._themeService.getColorTheme(),this._renderSideBySide),this._containerDomElement.style.position="relative",this._containerDomElement.style.height="100%",this._domElement.appendChild(this._containerDomElement),this._overviewViewportDomElement=M.createFastDomNode(document.createElement("div")),this._overviewViewportDomElement.setClassName("diffViewport"),this._overviewViewportDomElement.setPosition("absolute"),this._overviewDomElement=document.createElement("div"),this._overviewDomElement.className="diffOverview",this._overviewDomElement.style.position="absolute",this._overviewDomElement.appendChild(this._overviewViewportDomElement.domNode),this._register(N.addStandardDisposableListener(this._overviewDomElement,"mousedown",fe=>{this._modifiedEditor.delegateVerticalScrollbarMouseDown(fe)})),this._renderOverviewRuler&&this._containerDomElement.appendChild(this._overviewDomElement),this._originalDomNode=document.createElement("div"),this._originalDomNode.className="editor original",this._originalDomNode.style.position="absolute",this._originalDomNode.style.height="100%",this._containerDomElement.appendChild(this._originalDomNode),this._modifiedDomNode=document.createElement("div"),this._modifiedDomNode.className="editor modified",this._modifiedDomNode.style.position="absolute",this._modifiedDomNode.style.height="100%",this._containerDomElement.appendChild(this._modifiedDomNode),this._beginUpdateDecorationsTimeout=-1,this._currentlyChangingViewZones=!1,this._diffComputationToken=0,this._originalEditorState=new Y(Se,Ce),this._modifiedEditorState=new Y(Se,Ce),this._isVisible=!0,this._isHandlingScrollEvent=!1,this._elementSizeObserver=this._register(new D.ElementSizeObserver(this._containerDomElement,ce.dimension,()=>this._onDidContainerSizeChanged())),ce.automaticLayout&&this._elementSizeObserver.startObserving(),this._diffComputationResult=null,this._originalEditor=this._createLeftHandSideEditor(ce,me.originalEditor||{}),this._modifiedEditor=this._createRightHandSideEditor(ce,me.modifiedEditor||{}),this._originalOverviewRuler=null,this._modifiedOverviewRuler=null,this._reviewPane=new s.DiffReview(this),this._containerDomElement.appendChild(this._reviewPane.domNode.domNode),this._containerDomElement.appendChild(this._reviewPane.shadow.domNode),this._containerDomElement.appendChild(this._reviewPane.actionBarContainer.domNode),this._enableSplitViewResizing=!0,typeof ce.enableSplitViewResizing!="undefined"&&(this._enableSplitViewResizing=ce.enableSplitViewResizing),this._renderSideBySide?this._setStrategy(new $(this._createDataSource(),this._enableSplitViewResizing)):this._setStrategy(new oe(this._createDataSource(),this._enableSplitViewResizing)),this._register(Ee.onDidColorThemeChange(fe=>{this._strategy&&this._strategy.applyColors(fe)&&this._updateDecorationsRunner.schedule(),this._containerDomElement.className=Ge._getClassName(this._themeService.getColorTheme(),this._renderSideBySide)}));const ye=A.EditorExtensionsRegistry.getDiffEditorContributions();for(const fe of ye)try{this._register(De.createInstance(fe.ctor,this))}catch(de){B.onUnexpectedError(de)}this._codeEditorService.addDiffEditor(this)}_setState(re){this._state!==re&&(this._state=re,this._updatingDiffProgress&&(this._updatingDiffProgress.done(),this._updatingDiffProgress=null),this._state===1&&(this._updatingDiffProgress=this._editorProgressService.show(!0,1e3)))}diffReviewNext(){this._reviewPane.next()}diffReviewPrev(){this._reviewPane.prev()}static _getClassName(re,ce){let me="monaco-diff-editor monaco-editor-background ";return ce&&(me+="side-by-side "),me+=k.getThemeTypeSelector(re.type),me}_recreateOverviewRulers(){!this._renderOverviewRuler||(this._originalOverviewRuler&&(this._overviewDomElement.removeChild(this._originalOverviewRuler.getDomNode()),this._originalOverviewRuler.dispose()),this._originalEditor.hasModel()&&(this._originalOverviewRuler=this._originalEditor.createOverviewRuler("original diffOverviewRuler"),this._overviewDomElement.appendChild(this._originalOverviewRuler.getDomNode())),this._modifiedOverviewRuler&&(this._overviewDomElement.removeChild(this._modifiedOverviewRuler.getDomNode()),this._modifiedOverviewRuler.dispose()),this._modifiedEditor.hasModel()&&(this._modifiedOverviewRuler=this._modifiedEditor.createOverviewRuler("modified diffOverviewRuler"),this._overviewDomElement.appendChild(this._modifiedOverviewRuler.getDomNode())),this._layoutOverviewRulers())}_createLeftHandSideEditor(re,ce){const me=this._createInnerEditor(this._instantiationService,this._originalDomNode,this._adjustOptionsForLeftHandSide(re),ce);this._register(me.onDidScrollChange(be=>{this._isHandlingScrollEvent||!be.scrollTopChanged&&!be.scrollLeftChanged&&!be.scrollHeightChanged||(this._isHandlingScrollEvent=!0,this._modifiedEditor.setScrollPosition({scrollLeft:be.scrollLeft,scrollTop:be.scrollTop}),this._isHandlingScrollEvent=!1,this._layoutOverviewViewport())})),this._register(me.onDidChangeViewZones(()=>{this._onViewZonesChanged()})),this._register(me.onDidChangeConfiguration(be=>{!me.getModel()||(be.hasChanged(38)&&this._updateDecorationsRunner.schedule(),be.hasChanged(125)&&(this._updateDecorationsRunner.cancel(),this._updateDecorations()))})),this._register(me.onDidChangeModelContent(()=>{this._isVisible&&this._beginUpdateDecorationsSoon()}));const Ce=this._contextKeyService.createKey("isInDiffLeftEditor",me.hasWidgetFocus());return this._register(me.onDidFocusEditorWidget(()=>Ce.set(!0))),this._register(me.onDidBlurEditorWidget(()=>Ce.set(!1))),this._register(me.onDidContentSizeChange(be=>{const Le=this._originalEditor.getContentWidth()+this._modifiedEditor.getContentWidth()+Ge.ONE_OVERVIEW_WIDTH,De=Math.max(this._modifiedEditor.getContentHeight(),this._originalEditor.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:De,contentWidth:Le,contentHeightChanged:be.contentHeightChanged,contentWidthChanged:be.contentWidthChanged})})),me}_createRightHandSideEditor(re,ce){const me=this._createInnerEditor(this._instantiationService,this._modifiedDomNode,this._adjustOptionsForRightHandSide(re),ce);this._register(me.onDidScrollChange(be=>{this._isHandlingScrollEvent||!be.scrollTopChanged&&!be.scrollLeftChanged&&!be.scrollHeightChanged||(this._isHandlingScrollEvent=!0,this._originalEditor.setScrollPosition({scrollLeft:be.scrollLeft,scrollTop:be.scrollTop}),this._isHandlingScrollEvent=!1,this._layoutOverviewViewport())})),this._register(me.onDidChangeViewZones(()=>{this._onViewZonesChanged()})),this._register(me.onDidChangeConfiguration(be=>{!me.getModel()||(be.hasChanged(38)&&this._updateDecorationsRunner.schedule(),be.hasChanged(125)&&(this._updateDecorationsRunner.cancel(),this._updateDecorations()))})),this._register(me.onDidChangeModelContent(()=>{this._isVisible&&this._beginUpdateDecorationsSoon()})),this._register(me.onDidChangeModelOptions(be=>{be.tabSize&&this._updateDecorationsRunner.schedule()}));const Ce=this._contextKeyService.createKey("isInDiffRightEditor",me.hasWidgetFocus());return this._register(me.onDidFocusEditorWidget(()=>Ce.set(!0))),this._register(me.onDidBlurEditorWidget(()=>Ce.set(!1))),this._register(me.onDidContentSizeChange(be=>{const Le=this._originalEditor.getContentWidth()+this._modifiedEditor.getContentWidth()+Ge.ONE_OVERVIEW_WIDTH,De=Math.max(this._modifiedEditor.getContentHeight(),this._originalEditor.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:De,contentWidth:Le,contentHeightChanged:be.contentHeightChanged,contentWidthChanged:be.contentWidthChanged})})),me}_createInnerEditor(re,ce,me,Ce){return re.createInstance(o.CodeEditorWidget,ce,me,Ce)}dispose(){this._codeEditorService.removeDiffEditor(this),this._beginUpdateDecorationsTimeout!==-1&&(window.clearTimeout(this._beginUpdateDecorationsTimeout),this._beginUpdateDecorationsTimeout=-1),this._cleanViewZonesAndDecorations(),this._originalOverviewRuler&&(this._overviewDomElement.removeChild(this._originalOverviewRuler.getDomNode()),this._originalOverviewRuler.dispose()),this._modifiedOverviewRuler&&(this._overviewDomElement.removeChild(this._modifiedOverviewRuler.getDomNode()),this._modifiedOverviewRuler.dispose()),this._overviewDomElement.removeChild(this._overviewViewportDomElement.domNode),this._renderOverviewRuler&&this._containerDomElement.removeChild(this._overviewDomElement),this._containerDomElement.removeChild(this._originalDomNode),this._originalEditor.dispose(),this._containerDomElement.removeChild(this._modifiedDomNode),this._modifiedEditor.dispose(),this._strategy.dispose(),this._containerDomElement.removeChild(this._reviewPane.domNode.domNode),this._containerDomElement.removeChild(this._reviewPane.shadow.domNode),this._containerDomElement.removeChild(this._reviewPane.actionBarContainer.domNode),this._reviewPane.dispose(),this._domElement.removeChild(this._containerDomElement),this._onDidDispose.fire(),super.dispose()}getId(){return this.getEditorType()+":"+this._id}getEditorType(){return i.EditorType.IDiffEditor}getLineChanges(){return this._diffComputationResult?this._diffComputationResult.changes:null}getOriginalEditor(){return this._originalEditor}getModifiedEditor(){return this._modifiedEditor}updateOptions(re){let ce=!1;typeof re.renderSideBySide!="undefined"&&this._renderSideBySide!==re.renderSideBySide&&(this._renderSideBySide=re.renderSideBySide,ce=!0),typeof re.maxComputationTime!="undefined"&&(this._maxComputationTime=re.maxComputationTime,this._isVisible&&this._beginUpdateDecorationsSoon());let me=!1;typeof re.ignoreTrimWhitespace!="undefined"&&this._ignoreTrimWhitespace!==re.ignoreTrimWhitespace&&(this._ignoreTrimWhitespace=re.ignoreTrimWhitespace,me=!0),typeof re.renderIndicators!="undefined"&&this._renderIndicators!==re.renderIndicators&&(this._renderIndicators=re.renderIndicators,me=!0),me&&this._beginUpdateDecorations(),this._originalIsEditable=a.boolean(re.originalEditable,this._originalIsEditable),this._diffCodeLens=a.boolean(re.diffCodeLens,this._diffCodeLens),this._diffWordWrap=G(re.diffWordWrap,this._diffWordWrap),this._modifiedEditor.updateOptions(this._adjustOptionsForRightHandSide(re)),this._originalEditor.updateOptions(this._adjustOptionsForLeftHandSide(re)),typeof re.enableSplitViewResizing!="undefined"&&(this._enableSplitViewResizing=re.enableSplitViewResizing),this._strategy.setEnableSplitViewResizing(this._enableSplitViewResizing),ce&&(this._renderSideBySide?this._setStrategy(new $(this._createDataSource(),this._enableSplitViewResizing)):this._setStrategy(new oe(this._createDataSource(),this._enableSplitViewResizing)),this._containerDomElement.className=Ge._getClassName(this._themeService.getColorTheme(),this._renderSideBySide)),typeof re.renderOverviewRuler!="undefined"&&this._renderOverviewRuler!==re.renderOverviewRuler&&(this._renderOverviewRuler=re.renderOverviewRuler,this._renderOverviewRuler?this._containerDomElement.appendChild(this._overviewDomElement):this._containerDomElement.removeChild(this._overviewDomElement))}getModel(){return{original:this._originalEditor.getModel(),modified:this._modifiedEditor.getModel()}}setModel(re){if(re&&(!re.original||!re.modified))throw new Error(re.original?"DiffEditorWidget.setModel: Modified model is null":"DiffEditorWidget.setModel: Original model is null");this._cleanViewZonesAndDecorations(),this._originalEditor.setModel(re?re.original:null),this._modifiedEditor.setModel(re?re.modified:null),this._updateDecorationsRunner.cancel(),re&&(this._originalEditor.setScrollTop(0),this._modifiedEditor.setScrollTop(0)),this._diffComputationResult=null,this._diffComputationToken++,this._setState(0),re&&(this._recreateOverviewRulers(),this._beginUpdateDecorations()),this._layoutOverviewViewport()}getDomNode(){return this._domElement}getVisibleColumnFromPosition(re){return this._modifiedEditor.getVisibleColumnFromPosition(re)}getPosition(){return this._modifiedEditor.getPosition()}setPosition(re){this._modifiedEditor.setPosition(re)}revealLine(re,ce=0){this._modifiedEditor.revealLine(re,ce)}revealLineInCenter(re,ce=0){this._modifiedEditor.revealLineInCenter(re,ce)}revealLineInCenterIfOutsideViewport(re,ce=0){this._modifiedEditor.revealLineInCenterIfOutsideViewport(re,ce)}revealLineNearTop(re,ce=0){this._modifiedEditor.revealLineNearTop(re,ce)}revealPosition(re,ce=0){this._modifiedEditor.revealPosition(re,ce)}revealPositionInCenter(re,ce=0){this._modifiedEditor.revealPositionInCenter(re,ce)}revealPositionInCenterIfOutsideViewport(re,ce=0){this._modifiedEditor.revealPositionInCenterIfOutsideViewport(re,ce)}revealPositionNearTop(re,ce=0){this._modifiedEditor.revealPositionNearTop(re,ce)}getSelection(){return this._modifiedEditor.getSelection()}getSelections(){return this._modifiedEditor.getSelections()}setSelection(re){this._modifiedEditor.setSelection(re)}setSelections(re){this._modifiedEditor.setSelections(re)}revealLines(re,ce,me=0){this._modifiedEditor.revealLines(re,ce,me)}revealLinesInCenter(re,ce,me=0){this._modifiedEditor.revealLinesInCenter(re,ce,me)}revealLinesInCenterIfOutsideViewport(re,ce,me=0){this._modifiedEditor.revealLinesInCenterIfOutsideViewport(re,ce,me)}revealLinesNearTop(re,ce,me=0){this._modifiedEditor.revealLinesNearTop(re,ce,me)}revealRange(re,ce=0,me=!1,Ce=!0){this._modifiedEditor.revealRange(re,ce,me,Ce)}revealRangeInCenter(re,ce=0){this._modifiedEditor.revealRangeInCenter(re,ce)}revealRangeInCenterIfOutsideViewport(re,ce=0){this._modifiedEditor.revealRangeInCenterIfOutsideViewport(re,ce)}revealRangeNearTop(re,ce=0){this._modifiedEditor.revealRangeNearTop(re,ce)}revealRangeNearTopIfOutsideViewport(re,ce=0){this._modifiedEditor.revealRangeNearTopIfOutsideViewport(re,ce)}revealRangeAtTop(re,ce=0){this._modifiedEditor.revealRangeAtTop(re,ce)}getSupportedActions(){return this._modifiedEditor.getSupportedActions()}saveViewState(){const re=this._originalEditor.saveViewState(),ce=this._modifiedEditor.saveViewState();return{original:re,modified:ce}}restoreViewState(re){if(re&&re.original&&re.modified){const ce=re;this._originalEditor.restoreViewState(ce.original),this._modifiedEditor.restoreViewState(ce.modified)}}layout(re){this._elementSizeObserver.observe(re)}focus(){this._modifiedEditor.focus()}hasTextFocus(){return this._originalEditor.hasTextFocus()||this._modifiedEditor.hasTextFocus()}trigger(re,ce,me){this._modifiedEditor.trigger(re,ce,me)}changeDecorations(re){return this._modifiedEditor.changeDecorations(re)}_onDidContainerSizeChanged(){this._doLayout()}_getReviewHeight(){return this._reviewPane.isVisible()?this._elementSizeObserver.getHeight():0}_layoutOverviewRulers(){if(!!this._renderOverviewRuler&&!(!this._originalOverviewRuler||!this._modifiedOverviewRuler)){const re=this._elementSizeObserver.getHeight(),ce=this._getReviewHeight(),me=Ge.ENTIRE_DIFF_OVERVIEW_WIDTH-2*Ge.ONE_OVERVIEW_WIDTH;this._modifiedEditor.getLayoutInfo()&&(this._originalOverviewRuler.setLayout({top:0,width:Ge.ONE_OVERVIEW_WIDTH,right:me+Ge.ONE_OVERVIEW_WIDTH,height:re-ce}),this._modifiedOverviewRuler.setLayout({top:0,right:0,width:Ge.ONE_OVERVIEW_WIDTH,height:re-ce}))}}_onViewZonesChanged(){this._currentlyChangingViewZones||this._updateDecorationsRunner.schedule()}_beginUpdateDecorationsSoon(){this._beginUpdateDecorationsTimeout!==-1&&(window.clearTimeout(this._beginUpdateDecorationsTimeout),this._beginUpdateDecorationsTimeout=-1),this._beginUpdateDecorationsTimeout=window.setTimeout(()=>this._beginUpdateDecorations(),Ge.UPDATE_DIFF_DECORATIONS_DELAY)}static _equals(re,ce){return!re&&!ce?!0:!re||!ce?!1:re.toString()===ce.toString()}_beginUpdateDecorations(){this._beginUpdateDecorationsTimeout=-1;const re=this._originalEditor.getModel(),ce=this._modifiedEditor.getModel();if(!(!re||!ce)){this._diffComputationToken++;const me=this._diffComputationToken;if(this._setState(1),!this._editorWorkerService.canComputeDiff(re.uri,ce.uri)){(!Ge._equals(re.uri,this._lastOriginalWarning)||!Ge._equals(ce.uri,this._lastModifiedWarning))&&(this._lastOriginalWarning=re.uri,this._lastModifiedWarning=ce.uri,this._notificationService.warn(b.localize(2,null)));return}this._editorWorkerService.computeDiff(re.uri,ce.uri,this._ignoreTrimWhitespace,this._maxComputationTime).then(Ce=>{me===this._diffComputationToken&&re===this._originalEditor.getModel()&&ce===this._modifiedEditor.getModel()&&(this._setState(2),this._diffComputationResult=Ce,this._updateDecorationsRunner.schedule(),this._onDidUpdateDiff.fire())},Ce=>{me===this._diffComputationToken&&re===this._originalEditor.getModel()&&ce===this._modifiedEditor.getModel()&&(this._setState(2),this._diffComputationResult=null,this._updateDecorationsRunner.schedule())})}}_cleanViewZonesAndDecorations(){this._originalEditorState.clean(this._originalEditor),this._modifiedEditorState.clean(this._modifiedEditor)}_updateDecorations(){if(!(!this._originalEditor.getModel()||!this._modifiedEditor.getModel())){const re=this._diffComputationResult?this._diffComputationResult.changes:[],ce=this._originalEditorState.getForeignViewZones(this._originalEditor.getWhitespaces()),me=this._modifiedEditorState.getForeignViewZones(this._modifiedEditor.getWhitespaces()),Ce=this._strategy.getEditorsDiffDecorations(re,this._ignoreTrimWhitespace,this._renderIndicators,ce,me);try{this._currentlyChangingViewZones=!0,this._originalEditorState.apply(this._originalEditor,this._originalOverviewRuler,Ce.original,!1),this._modifiedEditorState.apply(this._modifiedEditor,this._modifiedOverviewRuler,Ce.modified,!0)}finally{this._currentlyChangingViewZones=!1}}}_adjustOptionsForSubEditor(re){const ce=Object.assign({},re);return ce.inDiffEditor=!0,ce.automaticLayout=!1,ce.scrollbar=Object.assign({},ce.scrollbar||{}),ce.scrollbar.vertical="visible",ce.folding=!1,ce.codeLens=this._diffCodeLens,ce.fixedOverflowWidgets=!0,ce.minimap=Object.assign({},ce.minimap||{}),ce.minimap.enabled=!1,ce}_adjustOptionsForLeftHandSide(re){const ce=this._adjustOptionsForSubEditor(re);return this._renderSideBySide?ce.wordWrapOverride1=this._diffWordWrap:ce.wordWrapOverride1="off",re.originalAriaLabel&&(ce.ariaLabel=re.originalAriaLabel),ce.readOnly=!this._originalIsEditable,ce.extraEditorClassName="original-in-monaco-diff-editor",Object.assign(Object.assign({},ce),{dimension:{height:0,width:0}})}_adjustOptionsForRightHandSide(re){const ce=this._adjustOptionsForSubEditor(re);return re.modifiedAriaLabel&&(ce.ariaLabel=re.modifiedAriaLabel),ce.wordWrapOverride1=this._diffWordWrap,ce.revealHorizontalRightPadding=a.EditorOptions.revealHorizontalRightPadding.defaultValue+Ge.ENTIRE_DIFF_OVERVIEW_WIDTH,ce.scrollbar.verticalHasArrows=!1,ce.extraEditorClassName="modified-in-monaco-diff-editor",Object.assign(Object.assign({},ce),{dimension:{height:0,width:0}})}doLayout(){this._elementSizeObserver.observe(),this._doLayout()}_doLayout(){const re=this._elementSizeObserver.getWidth(),ce=this._elementSizeObserver.getHeight(),me=this._getReviewHeight(),Ce=this._strategy.layout();this._originalDomNode.style.width=Ce+"px",this._originalDomNode.style.left="0px",this._modifiedDomNode.style.width=re-Ce+"px",this._modifiedDomNode.style.left=Ce+"px",this._overviewDomElement.style.top="0px",this._overviewDomElement.style.height=ce-me+"px",this._overviewDomElement.style.width=Ge.ENTIRE_DIFF_OVERVIEW_WIDTH+"px",this._overviewDomElement.style.left=re-Ge.ENTIRE_DIFF_OVERVIEW_WIDTH+"px",this._overviewViewportDomElement.setWidth(Ge.ENTIRE_DIFF_OVERVIEW_WIDTH),this._overviewViewportDomElement.setHeight(30),this._originalEditor.layout({width:Ce,height:ce-me}),this._modifiedEditor.layout({width:re-Ce-(this._renderOverviewRuler?Ge.ENTIRE_DIFF_OVERVIEW_WIDTH:0),height:ce-me}),(this._originalOverviewRuler||this._modifiedOverviewRuler)&&this._layoutOverviewRulers(),this._reviewPane.layout(ce-me,re,me),this._layoutOverviewViewport()}_layoutOverviewViewport(){const re=this._computeOverviewViewport();re?(this._overviewViewportDomElement.setTop(re.top),this._overviewViewportDomElement.setHeight(re.height)):(this._overviewViewportDomElement.setTop(0),this._overviewViewportDomElement.setHeight(0))}_computeOverviewViewport(){const re=this._modifiedEditor.getLayoutInfo();if(!re)return null;const ce=this._modifiedEditor.getScrollTop(),me=this._modifiedEditor.getScrollHeight(),Ce=Math.max(0,re.height),be=Math.max(0,Ce-2*0),Le=me>0?be/me:0,De=Math.max(0,Math.floor(re.height*Le)),Re=Math.floor(ce*Le);return{height:De,top:Re}}_createDataSource(){return{getWidth:()=>this._elementSizeObserver.getWidth(),getHeight:()=>this._elementSizeObserver.getHeight()-this._getReviewHeight(),getOptions:()=>({renderOverviewRuler:this._renderOverviewRuler}),getContainerDomNode:()=>this._containerDomElement,relayoutEditors:()=>{this._doLayout()},getOriginalEditor:()=>this._originalEditor,getModifiedEditor:()=>this._modifiedEditor}}_setStrategy(re){this._strategy&&this._strategy.dispose(),this._strategy=re,re.applyColors(this._themeService.getColorTheme()),this._diffComputationResult&&this._updateDecorations(),this._doLayout()}_getLineChangeAtOrBeforeLineNumber(re,ce){const me=this._diffComputationResult?this._diffComputationResult.changes:[];if(me.length===0||re=Re?Ce=Le+1:(Ce=Le,be=Le)}return me[Ce]}_getEquivalentLineForOriginalLineNumber(re){const ce=this._getLineChangeAtOrBeforeLineNumber(re,Re=>Re.originalStartLineNumber);if(!ce)return re;const me=ce.originalStartLineNumber+(ce.originalEndLineNumber>0?-1:0),Ce=ce.modifiedStartLineNumber+(ce.modifiedEndLineNumber>0?-1:0),be=ce.originalEndLineNumber>0?ce.originalEndLineNumber-ce.originalStartLineNumber+1:0,Le=ce.modifiedEndLineNumber>0?ce.modifiedEndLineNumber-ce.modifiedStartLineNumber+1:0,De=re-me;return De<=be?Ce+Math.min(De,Le):Ce+Le-be+De}_getEquivalentLineForModifiedLineNumber(re){const ce=this._getLineChangeAtOrBeforeLineNumber(re,Re=>Re.modifiedStartLineNumber);if(!ce)return re;const me=ce.originalStartLineNumber+(ce.originalEndLineNumber>0?-1:0),Ce=ce.modifiedStartLineNumber+(ce.modifiedEndLineNumber>0?-1:0),be=ce.originalEndLineNumber>0?ce.originalEndLineNumber-ce.originalStartLineNumber+1:0,Le=ce.modifiedEndLineNumber>0?ce.modifiedEndLineNumber-ce.modifiedStartLineNumber+1:0,De=re-Ce;return De<=Le?me+Math.min(De,be):me+be-Le+De}getDiffLineInformationForOriginal(re){return this._diffComputationResult?{equivalentLineNumber:this._getEquivalentLineForOriginalLineNumber(re)}:null}getDiffLineInformationForModified(re){return this._diffComputationResult?{equivalentLineNumber:this._getEquivalentLineForModifiedLineNumber(re)}:null}};X.ONE_OVERVIEW_WIDTH=15,X.ENTIRE_DIFF_OVERVIEW_WIDTH=30,X.UPDATE_DIFF_DECORATIONS_DELAY=200,X=Me([_e(3,O.IClipboardService),_e(4,t.IEditorWorkerService),_e(5,f.IContextKeyService),_e(6,v.IInstantiationService),_e(7,c.ICodeEditorService),_e(8,k.IThemeService),_e(9,L.INotificationService),_e(10,E.IContextMenuService),_e(11,F.IEditorProgressService)],X),e.DiffEditorWidget=X;class z extends d.Disposable{constructor(re){super();this._dataSource=re,this._insertColor=null,this._removeColor=null}applyColors(re){const ce=(re.getColor(I.diffInserted)||I.defaultInsertColor).transparent(2),me=(re.getColor(I.diffRemoved)||I.defaultRemoveColor).transparent(2),Ce=!ce.equals(this._insertColor)||!me.equals(this._removeColor);return this._insertColor=ce,this._removeColor=me,Ce}getEditorsDiffDecorations(re,ce,me,Ce,be){be=be.sort((Ee,Ae)=>Ee.afterLineNumber-Ae.afterLineNumber),Ce=Ce.sort((Ee,Ae)=>Ee.afterLineNumber-Ae.afterLineNumber);const Le=this._getViewZones(re,Ce,be,me),De=this._getOriginalEditorDecorations(re,ce,me),Re=this._getModifiedEditorDecorations(re,ce,me);return{original:{decorations:De.decorations,overviewZones:De.overviewZones,zones:Le.original},modified:{decorations:Re.decorations,overviewZones:Re.overviewZones,zones:Le.modified}}}}class P{constructor(re){this._source=re,this._index=-1,this.current=null,this.advance()}advance(){this._index++,this._indexOe.afterLineNumber-Fe.afterLineNumber,pe=(Oe,Fe)=>{if(Fe.domNode===null&&Oe.length>0){const Pe=Oe[Oe.length-1];if(Pe.afterLineNumber===Fe.afterLineNumber&&Pe.domNode===null){Pe.heightInLines+=Fe.heightInLines;return}}Oe.push(Fe)},ve=new P(this._modifiedForeignVZ),ke=new P(this._originalForeignVZ);let Ne=1,Te=1;for(let Oe=0,Fe=this._lineChanges.length;Oe<=Fe;Oe++){const Pe=Oe0?-1:0),ye=Pe.modifiedStartLineNumber+(Pe.modifiedEndLineNumber>0?-1:0),Se=Pe.originalEndLineNumber>0?V._getViewLineCount(this._originalEditor,Pe.originalStartLineNumber,Pe.originalEndLineNumber):0,Ae=Pe.modifiedEndLineNumber>0?V._getViewLineCount(this._modifiedEditor,Pe.modifiedStartLineNumber,Pe.modifiedEndLineNumber):0,fe=Math.max(Pe.originalStartLineNumber,Pe.originalEndLineNumber),de=Math.max(Pe.modifiedStartLineNumber,Pe.modifiedEndLineNumber)):(we+=1e7+Se,ye+=1e7+Ae,fe=we,de=ye);let xe=[],We=[];if(be){let Be;Pe?Pe.originalEndLineNumber>0?Be=Pe.originalStartLineNumber-Ne:Be=Pe.modifiedStartLineNumber-Te:Be=Le.getLineCount()-Ne;for(let He=0;Heje&&We.push({afterLineNumber:Ue,heightInLines:Ye-je,domNode:null,marginDomNode:null})}Pe&&(Ne=(Pe.originalEndLineNumber>0?Pe.originalEndLineNumber:Pe.originalStartLineNumber)+1,Te=(Pe.modifiedEndLineNumber>0?Pe.modifiedEndLineNumber:Pe.modifiedStartLineNumber)+1)}for(;ve.current&&ve.current.afterLineNumber<=de;){let Be;ve.current.afterLineNumber<=ye?Be=we-ye+ve.current.afterLineNumber:Be=fe;let He=null;Pe&&Pe.modifiedStartLineNumber<=ve.current.afterLineNumber&&ve.current.afterLineNumber<=Pe.modifiedEndLineNumber&&(He=this._createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion()),xe.push({afterLineNumber:Be,heightInLines:ve.current.height/ce,domNode:null,marginDomNode:He}),ve.advance()}for(;ke.current&&ke.current.afterLineNumber<=fe;){let Be;ke.current.afterLineNumber<=we?Be=ye-we+ke.current.afterLineNumber:Be=de,We.push({afterLineNumber:Be,heightInLines:ke.current.height/re,domNode:null}),ke.advance()}if(Pe!==null&&j(Pe)){const Be=this._produceOriginalFromDiff(Pe,Se,Ae);Be&&xe.push(Be)}if(Pe!==null&&te(Pe)){const Be=this._produceModifiedFromDiff(Pe,Se,Ae);Be&&We.push(Be)}let ze=0,Ke=0;for(xe=xe.sort(ge),We=We.sort(ge);ze=He.heightInLines?(Be.heightInLines-=He.heightInLines,Ke++):(He.heightInLines-=Be.heightInLines,ze++)}for(;ze(ce.domNode||(ce.domNode=Z()),ce))}}function U(he,re,ce,me,Ce){return{range:new u.Range(he,re,ce,me),options:Ce}}const H={charDelete:n.ModelDecorationOptions.register({className:"char-delete"}),charDeleteWholeLine:n.ModelDecorationOptions.register({className:"char-delete",isWholeLine:!0}),charInsert:n.ModelDecorationOptions.register({className:"char-insert"}),charInsertWholeLine:n.ModelDecorationOptions.register({className:"char-insert",isWholeLine:!0}),lineInsert:n.ModelDecorationOptions.register({className:"line-insert",marginClassName:"line-insert",isWholeLine:!0}),lineInsertWithSign:n.ModelDecorationOptions.register({className:"line-insert",linesDecorationsClassName:"insert-sign "+k.ThemeIcon.asClassName(se),marginClassName:"line-insert",isWholeLine:!0}),lineDelete:n.ModelDecorationOptions.register({className:"line-delete",marginClassName:"line-delete",isWholeLine:!0}),lineDeleteWithSign:n.ModelDecorationOptions.register({className:"line-delete",linesDecorationsClassName:"delete-sign "+k.ThemeIcon.asClassName(ne),marginClassName:"line-delete",isWholeLine:!0}),lineDeleteMargin:n.ModelDecorationOptions.register({marginClassName:"line-delete"})};class $ extends z{constructor(re,ce){super(re);this._disableSash=ce===!1,this._sashRatio=null,this._sashPosition=null,this._startSashPosition=null,this._sash=this._register(new w.Sash(this._dataSource.getContainerDomNode(),this,{orientation:0})),this._disableSash&&(this._sash.state=0),this._sash.onDidStart(()=>this._onSashDragStart()),this._sash.onDidChange(me=>this._onSashDrag(me)),this._sash.onDidEnd(()=>this._onSashDragEnd()),this._sash.onDidReset(()=>this._onSashReset())}setEnableSplitViewResizing(re){const ce=re===!1;this._disableSash!==ce&&(this._disableSash=ce,this._sash.state=this._disableSash?0:3)}layout(re=this._sashRatio){const me=this._dataSource.getWidth()-(this._dataSource.getOptions().renderOverviewRuler?X.ENTIRE_DIFF_OVERVIEW_WIDTH:0);let Ce=Math.floor((re||.5)*me);const be=Math.floor(.5*me);return Ce=this._disableSash?be:Ce||be,me>$.MINIMUM_EDITOR_WIDTH*2?(Ce<$.MINIMUM_EDITOR_WIDTH&&(Ce=$.MINIMUM_EDITOR_WIDTH),Ce>me-$.MINIMUM_EDITOR_WIDTH&&(Ce=me-$.MINIMUM_EDITOR_WIDTH)):Ce=be,this._sashPosition!==Ce&&(this._sashPosition=Ce,this._sash.layout()),this._sashPosition}_onSashDragStart(){this._startSashPosition=this._sashPosition}_onSashDrag(re){const me=this._dataSource.getWidth()-(this._dataSource.getOptions().renderOverviewRuler?X.ENTIRE_DIFF_OVERVIEW_WIDTH:0),Ce=this.layout((this._startSashPosition+(re.currentX-re.startX))/me);this._sashRatio=Ce/me,this._dataSource.relayoutEditors()}_onSashDragEnd(){this._sash.layout()}_onSashReset(){this._sashRatio=.5,this._dataSource.relayoutEditors(),this._sash.layout()}getVerticalSashTop(re){return 0}getVerticalSashLeft(re){return this._sashPosition}getVerticalSashHeight(re){return this._dataSource.getHeight()}_getViewZones(re,ce,me){const Ce=this._dataSource.getOriginalEditor(),be=this._dataSource.getModifiedEditor();return new ie(re,ce,me,Ce,be).getViewZones()}_getOriginalEditorDecorations(re,ce,me){const Ce=this._dataSource.getOriginalEditor(),be=String(this._removeColor),Le={decorations:[],overviewZones:[]},De=Ce.getModel(),Re=Ce._getViewModel();for(const Ee of re)if(te(Ee)){Le.decorations.push({range:new u.Range(Ee.originalStartLineNumber,1,Ee.originalEndLineNumber,1073741824),options:me?H.lineDeleteWithSign:H.lineDelete}),(!j(Ee)||!Ee.charChanges)&&Le.decorations.push(U(Ee.originalStartLineNumber,1,Ee.originalEndLineNumber,1073741824,H.charDeleteWholeLine));const Ae=ue(De,Re,Ee.originalStartLineNumber,Ee.originalEndLineNumber);if(Le.overviewZones.push(new l.OverviewRulerZone(Ae.startLineNumber,Ae.endLineNumber,be)),Ee.charChanges){for(const Se of Ee.charChanges)if(te(Se))if(ce)for(let we=Se.originalStartLineNumber;we<=Se.originalEndLineNumber;we++){let ye,fe;we===Se.originalStartLineNumber?ye=Se.originalStartColumn:ye=De.getLineFirstNonWhitespaceColumn(we),we===Se.originalEndLineNumber?fe=Se.originalEndColumn:fe=De.getLineLastNonWhitespaceColumn(we),Le.decorations.push(U(we,ye,we,fe,H.charDelete))}else Le.decorations.push(U(Se.originalStartLineNumber,Se.originalStartColumn,Se.originalEndLineNumber,Se.originalEndColumn,H.charDelete))}}return Le}_getModifiedEditorDecorations(re,ce,me){const Ce=this._dataSource.getModifiedEditor(),be=String(this._insertColor),Le={decorations:[],overviewZones:[]},De=Ce.getModel(),Re=Ce._getViewModel();for(const Ee of re)if(j(Ee)){Le.decorations.push({range:new u.Range(Ee.modifiedStartLineNumber,1,Ee.modifiedEndLineNumber,1073741824),options:me?H.lineInsertWithSign:H.lineInsert}),(!te(Ee)||!Ee.charChanges)&&Le.decorations.push(U(Ee.modifiedStartLineNumber,1,Ee.modifiedEndLineNumber,1073741824,H.charInsertWholeLine));const Ae=ue(De,Re,Ee.modifiedStartLineNumber,Ee.modifiedEndLineNumber);if(Le.overviewZones.push(new l.OverviewRulerZone(Ae.startLineNumber,Ae.endLineNumber,be)),Ee.charChanges){for(const Se of Ee.charChanges)if(j(Se))if(ce)for(let we=Se.modifiedStartLineNumber;we<=Se.modifiedEndLineNumber;we++){let ye,fe;we===Se.modifiedStartLineNumber?ye=Se.modifiedStartColumn:ye=De.getLineFirstNonWhitespaceColumn(we),we===Se.modifiedEndLineNumber?fe=Se.modifiedEndColumn:fe=De.getLineLastNonWhitespaceColumn(we),Le.decorations.push(U(we,ye,we,fe,H.charInsert))}else Le.decorations.push(U(Se.modifiedStartLineNumber,Se.modifiedStartColumn,Se.modifiedEndLineNumber,Se.modifiedEndColumn,H.charInsert))}}return Le}}$.MINIMUM_EDITOR_WIDTH=100;class ie extends V{constructor(re,ce,me,Ce,be){super(re,ce,me,Ce,be)}_createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion(){return null}_produceOriginalFromDiff(re,ce,me){return me>ce?{afterLineNumber:Math.max(re.originalStartLineNumber,re.originalEndLineNumber),heightInLines:me-ce,domNode:null}:null}_produceModifiedFromDiff(re,ce,me){return ce>me?{afterLineNumber:Math.max(re.modifiedStartLineNumber,re.modifiedEndLineNumber),heightInLines:ce-me,domNode:null}:null}}class oe extends z{constructor(re,ce){super(re);this._decorationsLeft=re.getOriginalEditor().getLayoutInfo().decorationsLeft,this._register(re.getOriginalEditor().onDidLayoutChange(me=>{this._decorationsLeft!==me.decorationsLeft&&(this._decorationsLeft=me.decorationsLeft,re.relayoutEditors())}))}setEnableSplitViewResizing(re){}_getViewZones(re,ce,me,Ce){const be=this._dataSource.getOriginalEditor(),Le=this._dataSource.getModifiedEditor();return new ae(re,ce,me,be,Le,Ce).getViewZones()}_getOriginalEditorDecorations(re,ce,me){const Ce=String(this._removeColor),be={decorations:[],overviewZones:[]},Le=this._dataSource.getOriginalEditor(),De=Le.getModel(),Re=Le._getViewModel();for(const Ee of re)if(te(Ee)){be.decorations.push({range:new u.Range(Ee.originalStartLineNumber,1,Ee.originalEndLineNumber,1073741824),options:H.lineDeleteMargin});const Ae=ue(De,Re,Ee.originalStartLineNumber,Ee.originalEndLineNumber);be.overviewZones.push(new l.OverviewRulerZone(Ae.startLineNumber,Ae.endLineNumber,Ce))}return be}_getModifiedEditorDecorations(re,ce,me){const Ce=this._dataSource.getModifiedEditor(),be=String(this._insertColor),Le={decorations:[],overviewZones:[]},De=Ce.getModel(),Re=Ce._getViewModel();for(const Ee of re)if(j(Ee)){Le.decorations.push({range:new u.Range(Ee.modifiedStartLineNumber,1,Ee.modifiedEndLineNumber,1073741824),options:me?H.lineInsertWithSign:H.lineInsert});const Ae=ue(De,Re,Ee.modifiedStartLineNumber,Ee.modifiedEndLineNumber);if(Le.overviewZones.push(new l.OverviewRulerZone(Ae.startLineNumber,Ae.endLineNumber,be)),Ee.charChanges){for(const Se of Ee.charChanges)if(j(Se))if(ce)for(let we=Se.modifiedStartLineNumber;we<=Se.modifiedEndLineNumber;we++){let ye,fe;we===Se.modifiedStartLineNumber?ye=Se.modifiedStartColumn:ye=De.getLineFirstNonWhitespaceColumn(we),we===Se.modifiedEndLineNumber?fe=Se.modifiedEndColumn:fe=De.getLineLastNonWhitespaceColumn(we),Le.decorations.push(U(we,ye,we,fe,H.charInsert))}else Le.decorations.push(U(Se.modifiedStartLineNumber,Se.modifiedStartColumn,Se.modifiedEndLineNumber,Se.modifiedEndColumn,H.charInsert))}else Le.decorations.push(U(Ee.modifiedStartLineNumber,1,Ee.modifiedEndLineNumber,1073741824,H.charInsertWholeLine))}return Le}layout(){return Math.max(5,this._decorationsLeft)}}class ae extends V{constructor(re,ce,me,Ce,be,Le){super(re,ce,me,Ce,be);this._originalModel=Ce.getModel(),this._renderIndicators=Le,this._pendingLineChange=[],this._pendingViewZones=[],this._lineBreaksComputer=this._modifiedEditor._getViewModel().createLineBreaksComputer()}getViewZones(){const re=super.getViewZones();return this._finalize(re),re}_createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion(){const re=document.createElement("div");return re.className="inline-added-margin-view-zone",re}_produceOriginalFromDiff(re,ce,me){const Ce=document.createElement("div");return Ce.className="inline-added-margin-view-zone",{afterLineNumber:Math.max(re.originalStartLineNumber,re.originalEndLineNumber),heightInLines:me,domNode:document.createElement("div"),marginDomNode:Ce}}_produceModifiedFromDiff(re,ce,me){const Ce=document.createElement("div");Ce.className=`view-lines line-delete ${W.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`;const be=document.createElement("div");be.className="inline-deleted-margin-view-zone";const Le={shouldNotShrink:!0,afterLineNumber:re.modifiedEndLineNumber===0?re.modifiedStartLineNumber:re.modifiedStartLineNumber-1,heightInLines:ce,minWidthInPx:0,domNode:Ce,marginDomNode:be,diff:{originalStartLineNumber:re.originalStartLineNumber,originalEndLineNumber:re.originalEndLineNumber,modifiedStartLineNumber:re.modifiedStartLineNumber,modifiedEndLineNumber:re.modifiedEndLineNumber,originalModel:this._originalModel,viewLineCounts:null}};for(let De=re.originalStartLineNumber;De<=re.originalEndLineNumber;De++)this._lineBreaksComputer.addRequest(this._originalModel.getLineContent(De),null);return this._pendingLineChange.push(re),this._pendingViewZones.push(Le),Le}_finalize(re){const ce=this._modifiedEditor.getOptions(),me=this._modifiedEditor.getModel().getOptions().tabSize,Ce=ce.get(38),be=ce.get(26),Le=Ce.typicalHalfwidthCharacterWidth,De=ce.get(88),Re=this._originalModel.mightContainNonBasicASCII(),Ee=this._originalModel.mightContainRTL(),Ae=ce.get(53),we=ce.get(124).decorationsWidth,ye=ce.get(100),fe=ce.get(83),de=ce.get(77),ge=ce.get(39),pe=this._lineBreaksComputer.finalize();let ve=0;for(let ke=0;ke0,We=r.createStringBuilder(1e4);let ze=0,Ke=0,Be=null;for(let Ue=Ne.originalStartLineNumber;Ue<=Ne.originalEndLineNumber;Ue++){const Ye=Ue-Ne.originalStartLineNumber,je=this._originalModel.getLineTokens(Ue),Xe=je.getLineContent(),$e=pe[ve++],Ze=h.LineDecoration.filter(Pe,Ue,1,Xe.length+1);if($e){let Qe=0;for(const Je of $e.breakOffsets){const nt=je.sliceAndInflate(Qe,Je,0),si=Xe.substring(Qe,Je);ze=Math.max(ze,this._renderOriginalLine(Ke++,si,nt,h.LineDecoration.extractWrapped(Ze,Qe,Je),xe,Re,Ee,Ce,be,Ae,we,ye,fe,de,ge,me,We,Fe)),Qe=Je}for(Be||(Be=[]);Be.lengthke.afterLineNumber-Ne.afterLineNumber)}_renderOriginalLine(re,ce,me,Ce,be,Le,De,Re,Ee,Ae,Se,we,ye,fe,de,ge,pe,ve){pe.appendASCIIString('
    ');const ke=_.ViewLineRenderingData.isBasicASCII(ce,Le),Ne=_.ViewLineRenderingData.containsRTL(ce,ke,De),Te=m.renderViewLine(new m.RenderLineInput(Re.isMonospace&&!Ee,Re.canUseHalfwidthRightwardsArrow,ce,!1,ke,Ne,0,me,Ce,ge,0,Re.spaceWidth,Re.middotWidth,Re.wsmiddotWidth,we,ye,fe,de!==a.EditorFontLigatures.OFF,null),pe);if(pe.appendASCIIString("
    "),this._renderIndicators){const Fe=document.createElement("div");Fe.className=`delete-sign ${k.ThemeIcon.asClassName(ne)}`,Fe.setAttribute("style",`position:absolute;top:${re*Ae}px;width:${Se}px;height:${Ae}px;right:0;`),ve.appendChild(Fe)}const Oe=Te.characterMapping.getAbsoluteOffsets();return Oe.length>0?Oe[Oe.length-1]:0}}function G(he,re){return a.stringSet(he,re,["off","on","inherit"])}function j(he){return he.modifiedEndLineNumber>0}function te(he){return he.originalEndLineNumber>0}function Z(){const he=document.createElement("div");return he.className="diagonal-fill",he}function ue(he,re,ce,me){const Ce=he.getLineCount();return ce=Math.min(Ce,Math.max(1,ce)),me=Math.min(Ce,Math.max(1,me)),re.coordinatesConverter.convertModelRangeToViewRange(new u.Range(ce,he.getLineMinColumn(ce),me,he.getLineMaxColumn(me)))}k.registerThemingParticipant((he,re)=>{const ce=he.getColor(I.diffInserted);ce&&(re.addRule(`.monaco-editor .line-insert, .monaco-editor .char-insert { background-color: ${ce}; }`),re.addRule(`.monaco-diff-editor .line-insert, .monaco-diff-editor .char-insert { background-color: ${ce}; }`),re.addRule(`.monaco-editor .inline-added-margin-view-zone { background-color: ${ce}; }`));const me=he.getColor(I.diffRemoved);me&&(re.addRule(`.monaco-editor .line-delete, .monaco-editor .char-delete { background-color: ${me}; }`),re.addRule(`.monaco-diff-editor .line-delete, .monaco-diff-editor .char-delete { background-color: ${me}; }`),re.addRule(`.monaco-editor .inline-deleted-margin-view-zone { background-color: ${me}; }`));const Ce=he.getColor(I.diffInsertedOutline);Ce&&re.addRule(`.monaco-editor .line-insert, .monaco-editor .char-insert { border: 1px ${he.type==="hc"?"dashed":"solid"} ${Ce}; }`);const be=he.getColor(I.diffRemovedOutline);be&&re.addRule(`.monaco-editor .line-delete, .monaco-editor .char-delete { border: 1px ${he.type==="hc"?"dashed":"solid"} ${be}; }`);const Le=he.getColor(I.scrollbarShadow);Le&&re.addRule(`.monaco-diff-editor.side-by-side .editor.modified { box-shadow: -6px 0 5px -5px ${Le}; }`);const De=he.getColor(I.diffBorder);De&&re.addRule(`.monaco-diff-editor.side-by-side .editor.modified { border-left: 1px solid ${De}; }`);const Re=he.getColor(I.scrollbarSliderBackground);Re&&re.addRule(` + .monaco-diff-editor .diffViewport { + background: ${Re}; + } + `);const Ee=he.getColor(I.scrollbarSliderHoverBackground);Ee&&re.addRule(` + .monaco-diff-editor .diffViewport:hover { + background: ${Ee}; + } + `);const Ae=he.getColor(I.scrollbarSliderActiveBackground);Ae&&re.addRule(` + .monaco-diff-editor .diffViewport:active { + background: ${Ae}; + } + `);const Se=he.getColor(I.diffDiagonalFill);re.addRule(` + .monaco-editor .diagonal-fill { + background-image: linear-gradient( + -45deg, + ${Se} 12.5%, + #0000 12.5%, #0000 50%, + ${Se} 50%, ${Se} 62.5%, + #0000 62.5%, #0000 100% + ); + background-size: 8px 8px; + } + `)})}),define(Q[657],J([0,1,473,7,47,160,104,52,15,12,2,17,8,3,142,22,11,571,27,80,341]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SimpleButton=e.FindWidget=e.FindWidgetViewZone=e.findNextMatchIcon=e.findPreviousMatchIcon=e.findReplaceAllIcon=e.findReplaceIcon=void 0;const l=t.registerIcon("find-selection",n.Codicon.selection,b.localize(0,null)),h=t.registerIcon("find-collapsed",n.Codicon.chevronRight,b.localize(1,null)),m=t.registerIcon("find-expanded",n.Codicon.chevronDown,b.localize(2,null));e.findReplaceIcon=t.registerIcon("find-replace",n.Codicon.replace,b.localize(3,null)),e.findReplaceAllIcon=t.registerIcon("find-replace-all",n.Codicon.replaceAll,b.localize(4,null)),e.findPreviousMatchIcon=t.registerIcon("find-previous-match",n.Codicon.arrowUp,b.localize(5,null)),e.findNextMatchIcon=t.registerIcon("find-next-match",n.Codicon.arrowDown,b.localize(6,null));const _=b.localize(7,null),f=b.localize(8,null),v=b.localize(9,null),y=b.localize(10,null),L=b.localize(11,null),I=b.localize(12,null),k=b.localize(13,null),E=b.localize(14,null),T=b.localize(15,null),O=b.localize(16,null),A=b.localize(17,null),B=b.localize(18,null,a.MATCHES_LIMIT),F=b.localize(19,null),D=b.localize(20,null),R=419,x=275-54;let K=69;const Y=33,ee="ctrlEnterReplaceAll.windows.donotask",se=c.isMacintosh?256:2048;class ne{constructor(U){this.afterLineNumber=U,this.heightInPx=Y,this.suppressMouseDown=!1,this.domNode=document.createElement("div"),this.domNode.className="dock-find-viewzone"}}e.FindWidgetViewZone=ne;function le(V,U,H){const $=!!U.match(/\n/);if(H&&$&&H.selectionStart>0){V.stopPropagation();return}}function X(V,U,H){const $=!!U.match(/\n/);if(H&&$&&H.selectionEndthis._updateHistoryDelayer.cancel())),this._register(this._state.onFindReplaceStateChange(Z=>this._onStateChanged(Z))),this._buildDomNode(),this._updateButtons(),this._tryUpdateWidgetWidth(),this._findInput.inputBox.layout(),this._register(this._codeEditor.onDidChangeConfiguration(Z=>{if(Z.hasChanged(75)&&(this._codeEditor.getOption(75)&&this._state.change({isReplaceRevealed:!1},!1),this._updateButtons()),Z.hasChanged(124)&&this._tryUpdateWidgetWidth(),Z.hasChanged(2)&&this.updateAccessibilitySupport(),Z.hasChanged(31)){const ue=this._codeEditor.getOption(31).addExtraSpaceOnTop;ue&&!this._viewZone&&(this._viewZone=new ne(0),this._showViewZone()),!ue&&this._viewZone&&this._removeViewZone()}})),this.updateAccessibilitySupport(),this._register(this._codeEditor.onDidChangeCursorSelection(()=>{this._isVisible&&this._updateToggleSelectionFindButton()})),this._register(this._codeEditor.onDidFocusEditorWidget(()=>Ie(this,void 0,void 0,function*(){if(this._isVisible){let Z=yield this._controller.getGlobalBufferTerm();Z&&Z!==this._state.searchString&&(this._state.change({searchString:Z},!1),this._findInput.select())}}))),this._findInputFocused=a.CONTEXT_FIND_INPUT_FOCUSED.bindTo(ae),this._findFocusTracker=this._register(N.trackFocus(this._findInput.inputBox.inputElement)),this._register(this._findFocusTracker.onDidFocus(()=>{this._findInputFocused.set(!0),this._updateSearchScope()})),this._register(this._findFocusTracker.onDidBlur(()=>{this._findInputFocused.set(!1)})),this._replaceInputFocused=a.CONTEXT_REPLACE_INPUT_FOCUSED.bindTo(ae),this._replaceFocusTracker=this._register(N.trackFocus(this._replaceInput.inputBox.inputElement)),this._register(this._replaceFocusTracker.onDidFocus(()=>{this._replaceInputFocused.set(!0),this._updateSearchScope()})),this._register(this._replaceFocusTracker.onDidBlur(()=>{this._replaceInputFocused.set(!1)})),this._codeEditor.addOverlayWidget(this),this._codeEditor.getOption(31).addExtraSpaceOnTop&&(this._viewZone=new ne(0)),this._applyTheme(G.getColorTheme()),this._register(G.onDidColorThemeChange(this._applyTheme.bind(this))),this._register(this._codeEditor.onDidChangeModel(()=>{!this._isVisible||(this._viewZoneId=void 0)})),this._register(this._codeEditor.onDidScrollChange(Z=>{if(Z.scrollTopChanged){this._layoutViewZone();return}setTimeout(()=>{this._layoutViewZone()},0)}))}getId(){return z.ID}getDomNode(){return this._domNode}getPosition(){return this._isVisible?{preference:0}:null}_onStateChanged(U){if(U.searchString){try{this._ignoreChangeEvent=!0,this._findInput.setValue(this._state.searchString)}finally{this._ignoreChangeEvent=!1}this._updateButtons()}if(U.replaceString&&(this._replaceInput.inputBox.value=this._state.replaceString),U.isRevealed&&(this._state.isRevealed?this._reveal():this._hide(!0)),U.isReplaceRevealed&&(this._state.isReplaceRevealed?!this._codeEditor.getOption(75)&&!this._isReplaceVisible&&(this._isReplaceVisible=!0,this._replaceInput.width=N.getTotalWidth(this._findInput.domNode),this._updateButtons(),this._replaceInput.inputBox.layout()):this._isReplaceVisible&&(this._isReplaceVisible=!1,this._updateButtons())),(U.isRevealed||U.isReplaceRevealed)&&(this._state.isRevealed||this._state.isReplaceRevealed)&&this._tryUpdateHeight()&&this._showViewZone(),U.isRegex&&this._findInput.setRegex(this._state.isRegex),U.wholeWord&&this._findInput.setWholeWords(this._state.wholeWord),U.matchCase&&this._findInput.setCaseSensitive(this._state.matchCase),U.preserveCase&&this._replaceInput.setPreserveCase(this._state.preserveCase),U.searchScope&&(this._state.searchScope?this._toggleSelectionFind.checked=!0:this._toggleSelectionFind.checked=!1,this._updateToggleSelectionFindButton()),U.searchString||U.matchesCount||U.matchesPosition){let H=this._state.searchString.length>0&&this._state.matchesCount===0;this._domNode.classList.toggle("no-results",H),this._updateMatchesCount(),this._updateButtons()}(U.searchString||U.currentMatch)&&this._layoutViewZone(),U.updateHistory&&this._delayedUpdateHistory(),U.loop&&this._updateButtons()}_delayedUpdateHistory(){this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)).then(void 0,g.onUnexpectedError)}_updateHistory(){this._state.searchString&&this._findInput.inputBox.addToHistory(),this._state.replaceString&&this._replaceInput.inputBox.addToHistory()}_updateMatchesCount(){this._matchesCount.style.minWidth=K+"px",this._state.matchesCount>=a.MATCHES_LIMIT?this._matchesCount.title=B:this._matchesCount.title="",this._matchesCount.firstChild&&this._matchesCount.removeChild(this._matchesCount.firstChild);let U;if(this._state.matchesCount>0){let H=String(this._state.matchesCount);this._state.matchesCount>=a.MATCHES_LIMIT&&(H+="+");let $=String(this._state.matchesPosition);$==="0"&&($="?"),U=o.format(F,$,H)}else U=D;this._matchesCount.appendChild(document.createTextNode(U)),M.alert(this._getAriaLabel(U,this._state.currentMatch,this._state.searchString)),K=Math.max(K,this._matchesCount.clientWidth)}_getAriaLabel(U,H,$){if(U===D)return $===""?b.localize(21,null,U):b.localize(22,null,U,$);if(H){const ie=b.localize(23,null,U,$,H.startLineNumber+":"+H.startColumn),oe=this._codeEditor.getModel();return oe&&H.startLineNumber<=oe.getLineCount()&&H.startLineNumber>=1?`${oe.getLineContent(H.startLineNumber)}, ${ie}`:ie}return b.localize(24,null,U,$)}_updateToggleSelectionFindButton(){let U=this._codeEditor.getSelection(),H=U?U.startLineNumber!==U.endLineNumber||U.startColumn!==U.endColumn:!1,$=this._toggleSelectionFind.checked;this._isVisible&&($||H)?this._toggleSelectionFind.enable():this._toggleSelectionFind.disable()}_updateButtons(){this._findInput.setEnabled(this._isVisible),this._replaceInput.setEnabled(this._isVisible&&this._isReplaceVisible),this._updateToggleSelectionFindButton(),this._closeBtn.setEnabled(this._isVisible);let U=this._state.searchString.length>0,H=!!this._state.matchesCount;this._prevBtn.setEnabled(this._isVisible&&U&&H&&this._state.canNavigateBack()),this._nextBtn.setEnabled(this._isVisible&&U&&H&&this._state.canNavigateForward()),this._replaceBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&U),this._replaceAllBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&U),this._domNode.classList.toggle("replaceToggled",this._isReplaceVisible),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible);let $=!this._codeEditor.getOption(75);this._toggleReplaceBtn.setEnabled(this._isVisible&&$)}_reveal(){if(this._revealTimeouts.forEach(U=>{clearTimeout(U)}),this._revealTimeouts=[],!this._isVisible){this._isVisible=!0;const U=this._codeEditor.getSelection();switch(this._codeEditor.getOption(31).autoFindInSelection){case"always":this._toggleSelectionFind.checked=!0;break;case"never":this._toggleSelectionFind.checked=!1;break;case"multiline":const $=!!U&&U.startLineNumber!==U.endLineNumber;this._toggleSelectionFind.checked=$;break;default:break}this._tryUpdateWidgetWidth(),this._updateButtons(),this._revealTimeouts.push(setTimeout(()=>{this._domNode.classList.add("visible"),this._domNode.setAttribute("aria-hidden","false")},0)),this._revealTimeouts.push(setTimeout(()=>{this._findInput.validate()},200)),this._codeEditor.layoutOverlayWidget(this);let H=!0;if(this._codeEditor.getOption(31).seedSearchStringFromSelection&&U){const $=this._codeEditor.getDomNode();if($){const ie=N.getDomNodePagePosition($),oe=this._codeEditor.getScrolledVisiblePosition(U.getStartPosition()),ae=ie.left+(oe?oe.left:0),G=oe?oe.top:0;if(this._viewZone&&GU.startLineNumber&&(H=!1);const j=N.getTopLeftOffset(this._domNode).left;ae>j&&(H=!1);const te=this._codeEditor.getScrolledVisiblePosition(U.getEndPosition());ie.left+(te?te.left:0)>j&&(H=!1)}}}this._showViewZone(H)}}_hide(U){this._revealTimeouts.forEach(H=>{clearTimeout(H)}),this._revealTimeouts=[],this._isVisible&&(this._isVisible=!1,this._updateButtons(),this._domNode.classList.remove("visible"),this._domNode.setAttribute("aria-hidden","true"),this._findInput.clearMessage(),U&&this._codeEditor.focus(),this._codeEditor.layoutOverlayWidget(this),this._removeViewZone())}_layoutViewZone(U){if(!this._codeEditor.getOption(31).addExtraSpaceOnTop){this._removeViewZone();return}if(!!this._isVisible){const $=this._viewZone;this._viewZoneId!==void 0||!$||this._codeEditor.changeViewZones(ie=>{$.heightInPx=this._getHeight(),this._viewZoneId=ie.addZone($),this._codeEditor.setScrollTop(U||this._codeEditor.getScrollTop()+$.heightInPx)})}}_showViewZone(U=!0){if(!!this._isVisible&&!!this._codeEditor.getOption(31).addExtraSpaceOnTop){this._viewZone===void 0&&(this._viewZone=new ne(0));const $=this._viewZone;this._codeEditor.changeViewZones(ie=>{if(this._viewZoneId!==void 0){const oe=this._getHeight();if(oe===$.heightInPx)return;let ae=oe-$.heightInPx;$.heightInPx=oe,ie.layoutZone(this._viewZoneId),U&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+ae);return}else{let oe=this._getHeight();if(oe-=this._codeEditor.getOption(69).top,oe<=0)return;$.heightInPx=oe,this._viewZoneId=ie.addZone($),U&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+oe)}})}}_removeViewZone(){this._codeEditor.changeViewZones(U=>{this._viewZoneId!==void 0&&(U.removeZone(this._viewZoneId),this._viewZoneId=void 0,this._viewZone&&(this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()-this._viewZone.heightInPx),this._viewZone=void 0))})}_applyTheme(U){let H={inputActiveOptionBorder:U.getColor(u.inputActiveOptionBorder),inputActiveOptionBackground:U.getColor(u.inputActiveOptionBackground),inputActiveOptionForeground:U.getColor(u.inputActiveOptionForeground),inputBackground:U.getColor(u.inputBackground),inputForeground:U.getColor(u.inputForeground),inputBorder:U.getColor(u.inputBorder),inputValidationInfoBackground:U.getColor(u.inputValidationInfoBackground),inputValidationInfoForeground:U.getColor(u.inputValidationInfoForeground),inputValidationInfoBorder:U.getColor(u.inputValidationInfoBorder),inputValidationWarningBackground:U.getColor(u.inputValidationWarningBackground),inputValidationWarningForeground:U.getColor(u.inputValidationWarningForeground),inputValidationWarningBorder:U.getColor(u.inputValidationWarningBorder),inputValidationErrorBackground:U.getColor(u.inputValidationErrorBackground),inputValidationErrorForeground:U.getColor(u.inputValidationErrorForeground),inputValidationErrorBorder:U.getColor(u.inputValidationErrorBorder)};this._findInput.style(H),this._replaceInput.style(H),this._toggleSelectionFind.style(H)}_tryUpdateWidgetWidth(){if(!!this._isVisible&&!!N.isInDOM(this._domNode)){const U=this._codeEditor.getLayoutInfo();if(U.contentWidth<=0){this._domNode.classList.add("hiddenEditor");return}else this._domNode.classList.contains("hiddenEditor")&&this._domNode.classList.remove("hiddenEditor");const $=U.width,ie=U.minimap.minimapWidth;let oe=!1,ae=!1,G=!1;if(this._resized&&N.getTotalWidth(this._domNode)>R){this._domNode.style.maxWidth=`${$-28-ie-15}px`,this._replaceInput.width=N.getTotalWidth(this._findInput.domNode);return}if(R+28+ie>=$&&(ae=!0),R+28+ie-K>=$&&(G=!0),R+28+ie-K>=$+50&&(oe=!0),this._domNode.classList.toggle("collapsed-find-widget",oe),this._domNode.classList.toggle("narrow-find-widget",G),this._domNode.classList.toggle("reduced-find-widget",ae),!G&&!oe&&(this._domNode.style.maxWidth=`${$-28-ie-15}px`),this._resized){this._findInput.inputBox.layout();let j=this._findInput.inputBox.element.clientWidth;j>0&&(this._replaceInput.width=j)}else this._isReplaceVisible&&(this._replaceInput.width=N.getTotalWidth(this._findInput.domNode))}}_getHeight(){let U=0;return U+=4,U+=this._findInput.inputBox.height+2,this._isReplaceVisible&&(U+=4,U+=this._replaceInput.inputBox.height+2),U+=4,U}_tryUpdateHeight(){const U=this._getHeight();return this._cachedHeight!==null&&this._cachedHeight===U?!1:(this._cachedHeight=U,this._domNode.style.height=`${U}px`,!0)}focusFindInput(){this._findInput.select(),this._findInput.focus()}focusReplaceInput(){this._replaceInput.select(),this._replaceInput.focus()}highlightFindOptions(){this._findInput.highlightFindOptions()}_updateSearchScope(){if(!!this._codeEditor.hasModel()&&this._toggleSelectionFind.checked){let U=this._codeEditor.getSelections();U.map(H=>{H.endColumn===1&&H.endLineNumber>H.startLineNumber&&(H=H.setEndPosition(H.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(H.endLineNumber-1)));const $=this._state.currentMatch;return H.startLineNumber!==H.endLineNumber&&!s.Range.equalsRange(H,$)?H:null}).filter(H=>!!H),U.length&&this._state.change({searchScope:U},!0)}}_onFindInputMouseDown(U){U.middleButton&&U.stopPropagation()}_onFindInputKeyDown(U){if(U.equals(se|3)){this._findInput.inputBox.insertAtCursor(` +`),U.preventDefault();return}if(U.equals(2)){this._isReplaceVisible?this._replaceInput.focus():this._findInput.focusOnCaseSensitive(),U.preventDefault();return}if(U.equals(2048|18)){this._codeEditor.focus(),U.preventDefault();return}if(U.equals(16))return le(U,this._findInput.getValue(),this._findInput.domNode.querySelector("textarea"));if(U.equals(18))return X(U,this._findInput.getValue(),this._findInput.domNode.querySelector("textarea"))}_onReplaceInputKeyDown(U){if(U.equals(se|3)){c.isWindows&&c.isNative&&!this._ctrlEnterReplaceAllWarningPrompted&&(this._notificationService.info(b.localize(25,null)),this._ctrlEnterReplaceAllWarningPrompted=!0,this._storageService.store(ee,!0,0,0)),this._replaceInput.inputBox.insertAtCursor(` +`),U.preventDefault();return}if(U.equals(2)){this._findInput.focusOnCaseSensitive(),U.preventDefault();return}if(U.equals(1024|2)){this._findInput.focus(),U.preventDefault();return}if(U.equals(2048|18)){this._codeEditor.focus(),U.preventDefault();return}if(U.equals(16))return le(U,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector("textarea"));if(U.equals(18))return X(U,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector("textarea"))}getVerticalSashLeft(U){return 0}_keybindingLabelFor(U){let H=this._keybindingService.lookupKeybinding(U);return H?` (${H.getLabel()})`:""}_buildDomNode(){const U=!0,H=!0;this._findInput=this._register(new i.ContextScopedFindInput(null,this._contextViewProvider,{width:x,label:_,placeholder:f,appendCaseSensitiveLabel:this._keybindingLabelFor(a.FIND_IDS.ToggleCaseSensitiveCommand),appendWholeWordsLabel:this._keybindingLabelFor(a.FIND_IDS.ToggleWholeWordCommand),appendRegexLabel:this._keybindingLabelFor(a.FIND_IDS.ToggleRegexCommand),validation:j=>{if(j.length===0||!this._findInput.getRegex())return null;try{return new RegExp(j,"gu"),null}catch(te){return{content:te.message}}},flexibleHeight:U,flexibleWidth:H,flexibleMaxHeight:118},this._contextKeyService,!0)),this._findInput.setRegex(!!this._state.isRegex),this._findInput.setCaseSensitive(!!this._state.matchCase),this._findInput.setWholeWords(!!this._state.wholeWord),this._register(this._findInput.onKeyDown(j=>this._onFindInputKeyDown(j))),this._register(this._findInput.inputBox.onDidChange(()=>{this._ignoreChangeEvent||this._state.change({searchString:this._findInput.getValue()},!0)})),this._register(this._findInput.onDidOptionChange(()=>{this._state.change({isRegex:this._findInput.getRegex(),wholeWord:this._findInput.getWholeWords(),matchCase:this._findInput.getCaseSensitive()},!0)})),this._register(this._findInput.onCaseSensitiveKeyDown(j=>{j.equals(1024|2)&&this._isReplaceVisible&&(this._replaceInput.focus(),j.preventDefault())})),this._register(this._findInput.onRegexKeyDown(j=>{j.equals(2)&&this._isReplaceVisible&&(this._replaceInput.focusOnPreserve(),j.preventDefault())})),this._register(this._findInput.inputBox.onDidHeightChange(j=>{this._tryUpdateHeight()&&this._showViewZone()})),c.isLinux&&this._register(this._findInput.onMouseDown(j=>this._onFindInputMouseDown(j))),this._matchesCount=document.createElement("div"),this._matchesCount.className="matchesCount",this._updateMatchesCount(),this._prevBtn=this._register(new P({label:v+this._keybindingLabelFor(a.FIND_IDS.PreviousMatchFindAction),icon:e.findPreviousMatchIcon,onTrigger:()=>{this._codeEditor.getAction(a.FIND_IDS.PreviousMatchFindAction).run().then(void 0,g.onUnexpectedError)}})),this._nextBtn=this._register(new P({label:y+this._keybindingLabelFor(a.FIND_IDS.NextMatchFindAction),icon:e.findNextMatchIcon,onTrigger:()=>{this._codeEditor.getAction(a.FIND_IDS.NextMatchFindAction).run().then(void 0,g.onUnexpectedError)}}));let $=document.createElement("div");$.className="find-part",$.appendChild(this._findInput.domNode);const ie=document.createElement("div");ie.className="find-actions",$.appendChild(ie),ie.appendChild(this._matchesCount),ie.appendChild(this._prevBtn.domNode),ie.appendChild(this._nextBtn.domNode),this._toggleSelectionFind=this._register(new w.Checkbox({icon:l,title:L+this._keybindingLabelFor(a.FIND_IDS.ToggleSearchScopeCommand),isChecked:!1})),this._register(this._toggleSelectionFind.onChange(()=>{if(this._toggleSelectionFind.checked){if(this._codeEditor.hasModel()){let j=this._codeEditor.getSelections();j.map(te=>(te.endColumn===1&&te.endLineNumber>te.startLineNumber&&(te=te.setEndPosition(te.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(te.endLineNumber-1))),te.isEmpty()?null:te)).filter(te=>!!te),j.length&&this._state.change({searchScope:j},!0)}}else this._state.change({searchScope:null},!0)})),ie.appendChild(this._toggleSelectionFind.domNode),this._closeBtn=this._register(new P({label:I+this._keybindingLabelFor(a.FIND_IDS.CloseFindWidgetCommand),icon:t.widgetClose,onTrigger:()=>{this._state.change({isRevealed:!1,searchScope:null},!1)},onKeyDown:j=>{j.equals(2)&&this._isReplaceVisible&&(this._replaceBtn.isEnabled()?this._replaceBtn.focus():this._codeEditor.focus(),j.preventDefault())}})),ie.appendChild(this._closeBtn.domNode),this._replaceInput=this._register(new i.ContextScopedReplaceInput(null,void 0,{label:k,placeholder:E,appendPreserveCaseLabel:this._keybindingLabelFor(a.FIND_IDS.TogglePreserveCaseCommand),history:[],flexibleHeight:U,flexibleWidth:H,flexibleMaxHeight:118},this._contextKeyService,!0)),this._replaceInput.setPreserveCase(!!this._state.preserveCase),this._register(this._replaceInput.onKeyDown(j=>this._onReplaceInputKeyDown(j))),this._register(this._replaceInput.inputBox.onDidChange(()=>{this._state.change({replaceString:this._replaceInput.inputBox.value},!1)})),this._register(this._replaceInput.inputBox.onDidHeightChange(j=>{this._isReplaceVisible&&this._tryUpdateHeight()&&this._showViewZone()})),this._register(this._replaceInput.onDidOptionChange(()=>{this._state.change({preserveCase:this._replaceInput.getPreserveCase()},!0)})),this._register(this._replaceInput.onPreserveCaseKeyDown(j=>{j.equals(2)&&(this._prevBtn.isEnabled()?this._prevBtn.focus():this._nextBtn.isEnabled()?this._nextBtn.focus():this._toggleSelectionFind.enabled?this._toggleSelectionFind.focus():this._closeBtn.isEnabled()&&this._closeBtn.focus(),j.preventDefault())})),this._replaceBtn=this._register(new P({label:T+this._keybindingLabelFor(a.FIND_IDS.ReplaceOneAction),icon:e.findReplaceIcon,onTrigger:()=>{this._controller.replace()},onKeyDown:j=>{j.equals(1024|2)&&(this._closeBtn.focus(),j.preventDefault())}})),this._replaceAllBtn=this._register(new P({label:O+this._keybindingLabelFor(a.FIND_IDS.ReplaceAllAction),icon:e.findReplaceAllIcon,onTrigger:()=>{this._controller.replaceAll()}}));let oe=document.createElement("div");oe.className="replace-part",oe.appendChild(this._replaceInput.domNode);const ae=document.createElement("div");ae.className="replace-actions",oe.appendChild(ae),ae.appendChild(this._replaceBtn.domNode),ae.appendChild(this._replaceAllBtn.domNode),this._toggleReplaceBtn=this._register(new P({label:A,className:"codicon toggle left",onTrigger:()=>{this._state.change({isReplaceRevealed:!this._isReplaceVisible},!1),this._isReplaceVisible&&(this._replaceInput.width=N.getTotalWidth(this._findInput.domNode),this._replaceInput.inputBox.layout()),this._showViewZone()}})),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible),this._domNode=document.createElement("div"),this._domNode.className="editor-widget find-widget",this._domNode.setAttribute("aria-hidden","true"),this._domNode.style.width=`${R}px`,this._domNode.appendChild(this._toggleReplaceBtn.domNode),this._domNode.appendChild($),this._domNode.appendChild(oe),this._resizeSash=new S.Sash(this._domNode,this,{orientation:0,size:2}),this._resized=!1;let G=R;this._register(this._resizeSash.onDidStart(()=>{G=N.getTotalWidth(this._domNode)})),this._register(this._resizeSash.onDidChange(j=>{this._resized=!0;let te=G+j.startX-j.currentX;if(!(teZ||(this._domNode.style.width=`${te}px`,this._isReplaceVisible&&(this._replaceInput.width=N.getTotalWidth(this._findInput.domNode)),this._findInput.inputBox.layout(),this._tryUpdateHeight())}})),this._register(this._resizeSash.onDidReset(()=>{const j=N.getTotalWidth(this._domNode);if(!(j{this._opts.onTrigger(),$.preventDefault()}),this.onkeydown(this._domNode,$=>{if($.equals(10)||$.equals(3)){this._opts.onTrigger(),$.preventDefault();return}this._opts.onKeyDown&&this._opts.onKeyDown($)})}get domNode(){return this._domNode}isEnabled(){return this._domNode.tabIndex>=0}focus(){this._domNode.focus()}setEnabled(U){this._domNode.classList.toggle("disabled",!U),this._domNode.setAttribute("aria-disabled",String(!U)),this._domNode.tabIndex=U?0:-1}setExpanded(U){this._domNode.setAttribute("aria-expanded",String(!!U)),U?(this._domNode.classList.remove(...r.ThemeIcon.asClassNameArray(h)),this._domNode.classList.add(...r.ThemeIcon.asClassNameArray(m))):(this._domNode.classList.remove(...r.ThemeIcon.asClassNameArray(m)),this._domNode.classList.add(...r.ThemeIcon.asClassNameArray(h)))}}e.SimpleButton=P,r.registerThemingParticipant((V,U)=>{const H=(re,ce)=>{ce&&U.addRule(`.monaco-editor ${re} { background-color: ${ce}; }`)};H(".findMatch",V.getColor(u.editorFindMatchHighlight)),H(".currentFindMatch",V.getColor(u.editorFindMatch)),H(".findScope",V.getColor(u.editorFindRangeHighlight));const $=V.getColor(u.editorWidgetBackground);H(".find-widget",$);const ie=V.getColor(u.widgetShadow);ie&&U.addRule(`.monaco-editor .find-widget { box-shadow: 0 0 8px 2px ${ie}; }`);const oe=V.getColor(u.editorFindMatchHighlightBorder);oe&&U.addRule(`.monaco-editor .findMatch { border: 1px ${V.type==="hc"?"dotted":"solid"} ${oe}; box-sizing: border-box; }`);const ae=V.getColor(u.editorFindMatchBorder);ae&&U.addRule(`.monaco-editor .currentFindMatch { border: 2px solid ${ae}; padding: 1px; box-sizing: border-box; }`);const G=V.getColor(u.editorFindRangeHighlightBorder);G&&U.addRule(`.monaco-editor .findScope { border: 1px ${V.type==="hc"?"dashed":"solid"} ${G}; }`);const j=V.getColor(u.contrastBorder);j&&U.addRule(`.monaco-editor .find-widget { border: 1px solid ${j}; }`);const te=V.getColor(u.editorWidgetForeground);te&&U.addRule(`.monaco-editor .find-widget { color: ${te}; }`);const Z=V.getColor(u.errorForeground);Z&&U.addRule(`.monaco-editor .find-widget.no-results .matchesCount { color: ${Z}; }`);const ue=V.getColor(u.editorWidgetResizeBorder);if(ue)U.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${ue}; }`);else{const re=V.getColor(u.editorWidgetBorder);re&&U.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${re}; }`)}const he=V.getColor(u.focusBorder);he&&U.addRule(`.monaco-editor .find-widget .monaco-inputbox.synthetic-focus { outline-color: ${he}; }`)})}),define(Q[267],J([0,1,472,15,2,8,13,25,142,599,600,657,34,84,16,68,37,79,11,32,28]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StartFindReplaceAction=e.PreviousSelectionMatchFindAction=e.NextSelectionMatchFindAction=e.SelectionMatchFindAction=e.PreviousMatchFindAction2=e.PreviousMatchFindAction=e.NextMatchFindAction2=e.NextMatchFindAction=e.MatchFindAction=e.StartFindWithSelectionAction=e.StartFindAction=e.FindController=e.CommonFindController=e.getSelectionSearchString=void 0;const h=524288;function m(F,D="single"){if(!F.hasModel())return null;const R=F.getSelection();if(D==="single"&&R.startLineNumber===R.endLineNumber||D==="multiple"){if(R.isEmpty()){const W=F.getConfiguredWordAtPosition(R.getStartPosition());if(W)return W.word}else if(F.getModel().getValueLengthInRange(R)this._onStateChanged(K))),this._model=null,this._register(this._editor.onDidChangeModel(()=>{let K=this._editor.getModel()&&this._state.isRevealed;this.disposeModel(),this._state.change({searchScope:null,matchCase:this._storageService.getBoolean("editor.matchCase",1,!1),wholeWord:this._storageService.getBoolean("editor.wholeWord",1,!1),isRegex:this._storageService.getBoolean("editor.isRegex",1,!1),preserveCase:this._storageService.getBoolean("editor.preserveCase",1,!1)},!1),K&&this._start({forceRevealReplace:!1,seedSearchStringFromSelection:"none",seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!1,updateSearchScope:!1,loop:this._editor.getOption(31).loop})}))}get editor(){return this._editor}static get(D){return D.getContribution(qt.ID)}dispose(){this.disposeModel(),super.dispose()}disposeModel(){this._model&&(this._model.dispose(),this._model=null)}_onStateChanged(D){this.saveQueryState(D),D.isRevealed&&(this._state.isRevealed?this._findWidgetVisible.set(!0):(this._findWidgetVisible.reset(),this.disposeModel())),D.searchString&&this.setGlobalBufferTerm(this._state.searchString)}saveQueryState(D){D.isRegex&&this._storageService.store("editor.isRegex",this._state.actualIsRegex,1,0),D.wholeWord&&this._storageService.store("editor.wholeWord",this._state.actualWholeWord,1,0),D.matchCase&&this._storageService.store("editor.matchCase",this._state.actualMatchCase,1,0),D.preserveCase&&this._storageService.store("editor.preserveCase",this._state.actualPreserveCase,1,0)}loadQueryState(){this._state.change({matchCase:this._storageService.getBoolean("editor.matchCase",1,this._state.matchCase),wholeWord:this._storageService.getBoolean("editor.wholeWord",1,this._state.wholeWord),isRegex:this._storageService.getBoolean("editor.isRegex",1,this._state.isRegex),preserveCase:this._storageService.getBoolean("editor.preserveCase",1,this._state.preserveCase)},!1)}isFindInputFocused(){return!!d.CONTEXT_FIND_INPUT_FOCUSED.getValue(this._contextKeyService)}getState(){return this._state}closeFindWidget(){this._state.change({isRevealed:!1,searchScope:null},!1),this._editor.focus()}toggleCaseSensitive(){this._state.change({matchCase:!this._state.matchCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleWholeWords(){this._state.change({wholeWord:!this._state.wholeWord},!1),this._state.isRevealed||this.highlightFindOptions()}toggleRegex(){this._state.change({isRegex:!this._state.isRegex},!1),this._state.isRevealed||this.highlightFindOptions()}togglePreserveCase(){this._state.change({preserveCase:!this._state.preserveCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleSearchScope(){if(this._state.searchScope)this._state.change({searchScope:null},!0);else if(this._editor.hasModel()){let D=this._editor.getSelections();D.map(R=>(R.endColumn===1&&R.endLineNumber>R.startLineNumber&&(R=R.setEndPosition(R.endLineNumber-1,this._editor.getModel().getLineMaxColumn(R.endLineNumber-1))),R.isEmpty()?null:R)).filter(R=>!!R),D.length&&this._state.change({searchScope:D},!0)}}setSearchString(D){this._state.isRegex&&(D=w.escapeRegExpCharacters(D)),this._state.change({searchString:D},!1)}highlightFindOptions(D=!1){}_start(D){return Ie(this,void 0,void 0,function*(){if(this.disposeModel(),!!this._editor.hasModel()){let R={isRevealed:!0};if(D.seedSearchStringFromSelection==="single"){let W=m(this._editor,D.seedSearchStringFromSelection);W&&(this._state.isRegex?R.searchString=w.escapeRegExpCharacters(W):R.searchString=W)}else if(D.seedSearchStringFromSelection==="multiple"&&!D.updateSearchScope){let W=m(this._editor,D.seedSearchStringFromSelection);W&&(R.searchString=W)}if(!R.searchString&&D.seedSearchStringFromGlobalClipboard){let W=yield this.getGlobalBufferTerm();if(!this._editor.hasModel())return;W&&(R.searchString=W)}if(D.forceRevealReplace?R.isReplaceRevealed=!0:this._findWidgetVisible.get()||(R.isReplaceRevealed=!1),D.updateSearchScope){let W=this._editor.getSelections();W.some(x=>!x.isEmpty())&&(R.searchScope=W)}R.loop=D.loop,this._state.change(R,!1),this._model||(this._model=new d.FindModelBoundToEditorModel(this._editor,this._state))}})}start(D){return this._start(D)}moveToNextMatch(){return this._model?(this._model.moveToNextMatch(),!0):!1}moveToPrevMatch(){return this._model?(this._model.moveToPrevMatch(),!0):!1}replace(){return this._model?(this._model.replace(),!0):!1}replaceAll(){return this._model?(this._model.replaceAll(),!0):!1}selectAllMatches(){return this._model?(this._model.selectAllMatches(),this._editor.focus(),!0):!1}getGlobalBufferTerm(){return Ie(this,void 0,void 0,function*(){return this._editor.getOption(31).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()?this._clipboardService.readFindText():""})}setGlobalBufferTerm(D){this._editor.getOption(31).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()&&this._clipboardService.writeFindText(D)}};_.ID="editor.contrib.findController",_=Me([_e(1,a.IContextKeyService),_e(2,i.IStorageService),_e(3,s.IClipboardService)],_),e.CommonFindController=_;let f=class extends _{constructor(D,R,W,x,K,Y,ee,se){super(D,W,ee,se);this._contextViewService=R,this._keybindingService=x,this._themeService=K,this._notificationService=Y,this._widget=null,this._findOptionsWidget=null}_start(D){const R=Object.create(null,{_start:{get:()=>super._start}});return Ie(this,void 0,void 0,function*(){this._widget||this._createFindWidget();const W=this._editor.getSelection();let x=!1;switch(this._editor.getOption(31).autoFindInSelection){case"always":x=!0;break;case"never":x=!1;break;case"multiline":x=!!W&&W.startLineNumber!==W.endLineNumber;break;default:break}D.updateSearchScope=x,yield R._start.call(this,D),this._widget&&(D.shouldFocus===2?this._widget.focusReplaceInput():D.shouldFocus===1&&this._widget.focusFindInput())})}highlightFindOptions(D=!1){this._widget||this._createFindWidget(),this._state.isRevealed&&!D?this._widget.highlightFindOptions():this._findOptionsWidget.highlightFindOptions()}_createFindWidget(){this._widget=this._register(new c.FindWidget(this._editor,this,this._state,this._contextViewService,this._keybindingService,this._contextKeyService,this._themeService,this._storageService,this._notificationService)),this._findOptionsWidget=this._register(new g.FindOptionsWidget(this._editor,this._state,this._keybindingService,this._themeService))}};f=Me([_e(1,u.IContextViewService),_e(2,a.IContextKeyService),_e(3,r.IKeybindingService),_e(4,n.IThemeService),_e(5,t.INotificationService),_e(6,i.IStorageService),_e(7,s.IClipboardService)],f),e.FindController=f,e.StartFindAction=S.registerMultiEditorAction(new S.MultiEditorAction({id:d.FIND_IDS.StartFindAction,label:b.localize(0,null),alias:"Find",precondition:a.ContextKeyExpr.or(C.EditorContextKeys.focus,a.ContextKeyExpr.has("editorIsOpen")),kbOpts:{kbExpr:null,primary:2048|36,weight:100},menuOpts:{menuId:o.MenuId.MenubarEditMenu,group:"3_find",title:b.localize(1,null),order:1}})),e.StartFindAction.addImplementation(0,(F,D)=>{const R=F.get(l.ICodeEditorService),W=R.getFocusedCodeEditor()||R.getActiveCodeEditor();if(!W)return!1;const x=_.get(W);return x?x.start({forceRevealReplace:!1,seedSearchStringFromSelection:W.getOption(31).seedSearchStringFromSelection?"single":"none",seedSearchStringFromGlobalClipboard:W.getOption(31).globalFindClipboard,shouldFocus:1,shouldAnimate:!0,updateSearchScope:!1,loop:W.getOption(31).loop}):!1});class v extends S.EditorAction{constructor(){super({id:d.FIND_IDS.StartFindWithSelection,label:b.localize(2,null),alias:"Find With Selection",precondition:void 0,kbOpts:{kbExpr:null,primary:0,mac:{primary:2048|35},weight:100}})}run(D,R){return Ie(this,void 0,void 0,function*(){let W=_.get(R);W&&(yield W.start({forceRevealReplace:!1,seedSearchStringFromSelection:"multiple",seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:R.getOption(31).loop}),W.setGlobalBufferTerm(W.getState().searchString))})}}e.StartFindWithSelectionAction=v;class y extends S.EditorAction{run(D,R){return Ie(this,void 0,void 0,function*(){let W=_.get(R);W&&!this._run(W)&&(yield W.start({forceRevealReplace:!1,seedSearchStringFromSelection:W.getState().searchString.length===0&&R.getOption(31).seedSearchStringFromSelection?"single":"none",seedSearchStringFromGlobalClipboard:!0,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:R.getOption(31).loop}),this._run(W))})}}e.MatchFindAction=y;class L extends y{constructor(){super({id:d.FIND_IDS.NextMatchFindAction,label:b.localize(3,null),alias:"Find Next",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.focus,primary:61,mac:{primary:2048|37,secondary:[61]},weight:100}})}_run(D){return D.moveToNextMatch()?(D.editor.pushUndoStop(),!0):!1}}e.NextMatchFindAction=L;class I extends y{constructor(){super({id:d.FIND_IDS.NextMatchFindAction,label:b.localize(4,null),alias:"Find Next",precondition:void 0,kbOpts:{kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,d.CONTEXT_FIND_INPUT_FOCUSED),primary:3,weight:100}})}_run(D){return D.moveToNextMatch()?(D.editor.pushUndoStop(),!0):!1}}e.NextMatchFindAction2=I;class k extends y{constructor(){super({id:d.FIND_IDS.PreviousMatchFindAction,label:b.localize(5,null),alias:"Find Previous",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.focus,primary:1024|61,mac:{primary:2048|1024|37,secondary:[1024|61]},weight:100}})}_run(D){return D.moveToPrevMatch()}}e.PreviousMatchFindAction=k;class E extends y{constructor(){super({id:d.FIND_IDS.PreviousMatchFindAction,label:b.localize(6,null),alias:"Find Previous",precondition:void 0,kbOpts:{kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,d.CONTEXT_FIND_INPUT_FOCUSED),primary:1024|3,weight:100}})}_run(D){return D.moveToPrevMatch()}}e.PreviousMatchFindAction2=E;class T extends S.EditorAction{run(D,R){return Ie(this,void 0,void 0,function*(){let W=_.get(R);if(!!W){let x=m(R);x&&W.setSearchString(x),this._run(W)||(yield W.start({forceRevealReplace:!1,seedSearchStringFromSelection:R.getOption(31).seedSearchStringFromSelection?"single":"none",seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:R.getOption(31).loop}),this._run(W))}})}}e.SelectionMatchFindAction=T;class O extends T{constructor(){super({id:d.FIND_IDS.NextSelectionMatchFindAction,label:b.localize(7,null),alias:"Find Next Selection",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.focus,primary:2048|61,weight:100}})}_run(D){return D.moveToNextMatch()}}e.NextSelectionMatchFindAction=O;class A extends T{constructor(){super({id:d.FIND_IDS.PreviousSelectionMatchFindAction,label:b.localize(8,null),alias:"Find Previous Selection",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.focus,primary:2048|1024|61,weight:100}})}_run(D){return D.moveToPrevMatch()}}e.PreviousSelectionMatchFindAction=A,e.StartFindReplaceAction=S.registerMultiEditorAction(new S.MultiEditorAction({id:d.FIND_IDS.StartFindReplaceAction,label:b.localize(9,null),alias:"Replace",precondition:a.ContextKeyExpr.or(C.EditorContextKeys.focus,a.ContextKeyExpr.has("editorIsOpen")),kbOpts:{kbExpr:null,primary:2048|38,mac:{primary:2048|512|36},weight:100},menuOpts:{menuId:o.MenuId.MenubarEditMenu,group:"3_find",title:b.localize(10,null),order:2}})),e.StartFindReplaceAction.addImplementation(0,(F,D)=>{const R=F.get(l.ICodeEditorService),W=R.getFocusedCodeEditor()||R.getActiveCodeEditor();if(!W||!W.hasModel()||W.getOption(75))return!1;const x=_.get(W);if(!x)return!1;const K=W.getSelection(),Y=x.isFindInputFocused(),ee=!K.isEmpty()&&K.startLineNumber===K.endLineNumber&&W.getOption(31).seedSearchStringFromSelection&&!Y,se=Y||ee?2:1;return x.start({forceRevealReplace:!0,seedSearchStringFromSelection:ee?"single":"none",seedSearchStringFromGlobalClipboard:W.getOption(31).seedSearchStringFromSelection,shouldFocus:se,shouldAnimate:!0,updateSearchScope:!1,loop:W.getOption(31).loop})}),S.registerEditorContribution(_.ID,f),S.registerEditorAction(v),S.registerEditorAction(L),S.registerEditorAction(I),S.registerEditorAction(k),S.registerEditorAction(E),S.registerEditorAction(O),S.registerEditorAction(A);const B=S.EditorCommand.bindToContribution(_.get);S.registerEditorCommand(new B({id:d.FIND_IDS.CloseFindWidgetCommand,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.closeFindWidget(),kbOpts:{weight:100+5,kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,a.ContextKeyExpr.not("isComposing")),primary:9,secondary:[1024|9]}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ToggleCaseSensitiveCommand,precondition:void 0,handler:F=>F.toggleCaseSensitive(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.ToggleCaseSensitiveKeybinding.primary,mac:d.ToggleCaseSensitiveKeybinding.mac,win:d.ToggleCaseSensitiveKeybinding.win,linux:d.ToggleCaseSensitiveKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ToggleWholeWordCommand,precondition:void 0,handler:F=>F.toggleWholeWords(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.ToggleWholeWordKeybinding.primary,mac:d.ToggleWholeWordKeybinding.mac,win:d.ToggleWholeWordKeybinding.win,linux:d.ToggleWholeWordKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ToggleRegexCommand,precondition:void 0,handler:F=>F.toggleRegex(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.ToggleRegexKeybinding.primary,mac:d.ToggleRegexKeybinding.mac,win:d.ToggleRegexKeybinding.win,linux:d.ToggleRegexKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ToggleSearchScopeCommand,precondition:void 0,handler:F=>F.toggleSearchScope(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.ToggleSearchScopeKeybinding.primary,mac:d.ToggleSearchScopeKeybinding.mac,win:d.ToggleSearchScopeKeybinding.win,linux:d.ToggleSearchScopeKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.TogglePreserveCaseCommand,precondition:void 0,handler:F=>F.togglePreserveCase(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.TogglePreserveCaseKeybinding.primary,mac:d.TogglePreserveCaseKeybinding.mac,win:d.TogglePreserveCaseKeybinding.win,linux:d.TogglePreserveCaseKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ReplaceOneAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.replace(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:2048|1024|22}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ReplaceOneAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.replace(),kbOpts:{weight:100+5,kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,d.CONTEXT_REPLACE_INPUT_FOCUSED),primary:3}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ReplaceAllAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.replaceAll(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:2048|512|3}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ReplaceAllAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.replaceAll(),kbOpts:{weight:100+5,kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,d.CONTEXT_REPLACE_INPUT_FOCUSED),primary:void 0,mac:{primary:2048|3}}})),S.registerEditorCommand(new B({id:d.FIND_IDS.SelectAllMatchesAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.selectAllMatches(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:512|3}}))}),define(Q[658],J([0,1,31,27,475,80,11]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FoldingDecorationProvider=e.foldingCollapsedIcon=e.foldingExpandedIcon=void 0,e.foldingExpandedIcon=w.registerIcon("folding-expanded",N.Codicon.chevronDown,M.localize(0,null)),e.foldingCollapsedIcon=w.registerIcon("folding-collapsed",N.Codicon.chevronRight,M.localize(1,null));class C{constructor(g){this.editor=g,this.autoHideFoldingControls=!0,this.showFoldingHighlights=!0}getDecorationOption(g,p){return p?C.HIDDEN_RANGE_DECORATION:g?this.showFoldingHighlights?C.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:C.COLLAPSED_VISUAL_DECORATION:this.autoHideFoldingControls?C.EXPANDED_AUTO_HIDE_VISUAL_DECORATION:C.EXPANDED_VISUAL_DECORATION}deltaDecorations(g,p){return this.editor.deltaDecorations(g,p)}changeDecorations(g){return this.editor.changeDecorations(g)}}e.FoldingDecorationProvider=C,C.COLLAPSED_VISUAL_DECORATION=b.ModelDecorationOptions.register({stickiness:1,afterContentClassName:"inline-folded",isWholeLine:!0,firstLineDecorationClassName:S.ThemeIcon.asClassName(e.foldingCollapsedIcon)}),C.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=b.ModelDecorationOptions.register({stickiness:1,afterContentClassName:"inline-folded",className:"folded-background",isWholeLine:!0,firstLineDecorationClassName:S.ThemeIcon.asClassName(e.foldingCollapsedIcon)}),C.EXPANDED_AUTO_HIDE_VISUAL_DECORATION=b.ModelDecorationOptions.register({stickiness:1,isWholeLine:!0,firstLineDecorationClassName:S.ThemeIcon.asClassName(e.foldingExpandedIcon)}),C.EXPANDED_VISUAL_DECORATION=b.ModelDecorationOptions.register({stickiness:1,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+S.ThemeIcon.asClassName(e.foldingExpandedIcon)}),C.HIDDEN_RANGE_DECORATION=b.ModelDecorationOptions.register({stickiness:1})}),define(Q[659],J([0,1,474,20,8,15,39,2,13,405,658,25,406,41,541,18,225,407,12,16,11,22,342]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorFoldForeground=e.foldBackgroundBackground=e.FoldingController=void 0;const m=new t.RawContextKey("foldingEnabled",!1);let _=class $t extends C.Disposable{constructor(W,x){super();this.contextKeyService=x,this.localToDispose=this._register(new C.DisposableStore),this.editor=W;const K=this.editor.getOptions();this._isEnabled=K.get(33),this._useFoldingProviders=K.get(34)!=="indentation",this._unfoldOnClickAfterEndOfLine=K.get(36),this._restoringViewState=!1,this.foldingModel=null,this.hiddenRangeModel=null,this.rangeProvider=null,this.foldingRegionPromise=null,this.foldingStateMemento=null,this.foldingModelPromise=null,this.updateScheduler=null,this.cursorChangedScheduler=null,this.mouseDownInfo=null,this.foldingDecorationProvider=new p.FoldingDecorationProvider(W),this.foldingDecorationProvider.autoHideFoldingControls=K.get(94)==="mouseover",this.foldingDecorationProvider.showFoldingHighlights=K.get(35),this.foldingEnabled=m.bindTo(this.contextKeyService),this.foldingEnabled.set(this._isEnabled),this._register(this.editor.onDidChangeModel(()=>this.onModelChanged())),this._register(this.editor.onDidChangeConfiguration(Y=>{if(Y.hasChanged(33)&&(this._isEnabled=this.editor.getOptions().get(33),this.foldingEnabled.set(this._isEnabled),this.onModelChanged()),Y.hasChanged(94)||Y.hasChanged(35)){const ee=this.editor.getOptions();this.foldingDecorationProvider.autoHideFoldingControls=ee.get(94)==="mouseover",this.foldingDecorationProvider.showFoldingHighlights=ee.get(35),this.onModelContentChanged()}Y.hasChanged(34)&&(this._useFoldingProviders=this.editor.getOptions().get(34)!=="indentation",this.onFoldingStrategyChanged()),Y.hasChanged(36)&&(this._unfoldOnClickAfterEndOfLine=this.editor.getOptions().get(36))})),this.onModelChanged()}static get(W){return W.getContribution($t.ID)}saveViewState(){let W=this.editor.getModel();if(!W||!this._isEnabled||W.isTooLargeForTokenization())return{};if(this.foldingModel){let x=this.foldingModel.isInitialized?this.foldingModel.getMemento():this.hiddenRangeModel.getMemento(),K=this.rangeProvider?this.rangeProvider.id:void 0;return{collapsedRegions:x,lineCount:W.getLineCount(),provider:K}}}restoreViewState(W){let x=this.editor.getModel();if(!(!x||!this._isEnabled||x.isTooLargeForTokenization()||!this.hiddenRangeModel)&&!(!W||!W.collapsedRegions||W.lineCount!==x.getLineCount())){(W.provider===r.ID_SYNTAX_PROVIDER||W.provider===i.ID_INIT_PROVIDER)&&(this.foldingStateMemento=W);const K=W.collapsedRegions;if(this.hiddenRangeModel.applyMemento(K)){const Y=this.getFoldingModel();Y&&Y.then(ee=>{if(ee){this._restoringViewState=!0;try{ee.applyMemento(K)}finally{this._restoringViewState=!1}}}).then(void 0,n.onUnexpectedError)}}}onModelChanged(){this.localToDispose.clear();let W=this.editor.getModel();!this._isEnabled||!W||W.isTooLargeForTokenization()||(this.foldingModel=new g.FoldingModel(W,this.foldingDecorationProvider),this.localToDispose.add(this.foldingModel),this.hiddenRangeModel=new o.HiddenRangeModel(this.foldingModel),this.localToDispose.add(this.hiddenRangeModel),this.localToDispose.add(this.hiddenRangeModel.onDidChange(x=>this.onHiddenRangesChanges(x))),this.updateScheduler=new w.Delayer(200),this.cursorChangedScheduler=new w.RunOnceScheduler(()=>this.revealCursor(),200),this.localToDispose.add(this.cursorChangedScheduler),this.localToDispose.add(u.FoldingRangeProviderRegistry.onDidChange(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelContent(()=>this.onModelContentChanged())),this.localToDispose.add(this.editor.onDidChangeCursorPosition(()=>this.onCursorPositionChanged())),this.localToDispose.add(this.editor.onMouseDown(x=>this.onEditorMouseDown(x))),this.localToDispose.add(this.editor.onMouseUp(x=>this.onEditorMouseUp(x))),this.localToDispose.add({dispose:()=>{this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.updateScheduler&&this.updateScheduler.cancel(),this.updateScheduler=null,this.foldingModel=null,this.foldingModelPromise=null,this.hiddenRangeModel=null,this.cursorChangedScheduler=null,this.foldingStateMemento=null,this.rangeProvider&&this.rangeProvider.dispose(),this.rangeProvider=null}}),this.onModelContentChanged())}onFoldingStrategyChanged(){this.rangeProvider&&this.rangeProvider.dispose(),this.rangeProvider=null,this.onModelContentChanged()}getRangeProvider(W){if(this.rangeProvider)return this.rangeProvider;if(this.rangeProvider=new a.IndentRangeProvider(W),this._useFoldingProviders&&this.foldingModel){let x=u.FoldingRangeProviderRegistry.ordered(this.foldingModel.textModel);if(x.length===0&&this.foldingStateMemento&&this.foldingStateMemento.collapsedRegions)return this.rangeProvider=new i.InitializingRangeProvider(W,this.foldingStateMemento.collapsedRegions,()=>{this.foldingStateMemento=null,this.onFoldingStrategyChanged()},3e4);x.length>0&&(this.rangeProvider=new r.SyntaxRangeProvider(W,x,()=>this.onModelContentChanged()))}return this.foldingStateMemento=null,this.rangeProvider}getFoldingModel(){return this.foldingModelPromise}onModelContentChanged(){this.updateScheduler&&(this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.foldingModelPromise=this.updateScheduler.trigger(()=>{const W=this.foldingModel;if(!W)return null;let x=this.foldingRegionPromise=w.createCancelablePromise(K=>this.getRangeProvider(W.textModel).compute(K));return x.then(K=>{if(K&&x===this.foldingRegionPromise){let Y=this.editor.getSelections(),ee=Y?Y.map(se=>se.startLineNumber):[];W.update(K,ee)}return W})}).then(void 0,W=>(n.onUnexpectedError(W),null)))}onHiddenRangesChanges(W){if(this.hiddenRangeModel&&W.length&&!this._restoringViewState){let x=this.editor.getSelections();x&&this.hiddenRangeModel.adjustSelections(x)&&this.editor.setSelections(x)}this.editor.setHiddenAreas(W)}onCursorPositionChanged(){this.hiddenRangeModel&&this.hiddenRangeModel.hasRanges()&&this.cursorChangedScheduler.schedule()}revealCursor(){const W=this.getFoldingModel();!W||W.then(x=>{if(x){let K=this.editor.getSelections();if(K&&K.length>0){let Y=[];for(let ee of K){let se=ee.selectionStartLineNumber;this.hiddenRangeModel&&this.hiddenRangeModel.isHidden(se)&&Y.push(...x.getAllRegionsAtLine(se,ne=>ne.isCollapsed&&se>ne.startLineNumber))}Y.length&&(x.toggleCollapseState(Y),this.reveal(K[0].getPosition()))}}}).then(void 0,n.onUnexpectedError)}onEditorMouseDown(W){if(this.mouseDownInfo=null,!(!this.hiddenRangeModel||!W.target||!W.target.range)&&!(!W.event.leftButton&&!W.event.middleButton)){const x=W.target.range;let K=!1;switch(W.target.type){case 4:const Y=W.target.detail,ee=W.target.element.offsetLeft;if(Y.offsetX-ee<5)return;K=!0;break;case 7:{if(this._unfoldOnClickAfterEndOfLine&&this.hiddenRangeModel.hasRanges()&&!W.target.detail.isAfterLines)break;return}case 6:{if(this.hiddenRangeModel.hasRanges()){let ne=this.editor.getModel();if(ne&&x.startColumn===ne.getLineMaxColumn(x.startLineNumber))break}return}default:return}this.mouseDownInfo={lineNumber:x.startLineNumber,iconClicked:K}}}onEditorMouseUp(W){const x=this.getFoldingModel();if(!(!x||!this.mouseDownInfo||!W.target)){let K=this.mouseDownInfo.lineNumber,Y=this.mouseDownInfo.iconClicked,ee=W.target.range;if(!(!ee||ee.startLineNumber!==K)){if(Y){if(W.target.type!==4)return}else{let se=this.editor.getModel();if(!se||ee.startColumn!==se.getLineMaxColumn(K))return}x.then(se=>{if(se){let ne=se.getRegionAtLine(K);if(ne&&ne.startLineNumber===K){let le=ne.isCollapsed;if(Y||le){let X=[],z=W.event.middleButton||W.event.shiftKey;if(z)for(const P of se.getRegionsInside(ne))P.isCollapsed===le&&X.push(P);(le||!z||X.length===0)&&X.push(ne),se.toggleCollapseState(X),this.reveal({lineNumber:K,column:1})}}}}).then(void 0,n.onUnexpectedError)}}}reveal(W){this.editor.revealPositionInCenterIfOutsideViewport(W,0)}};_.ID="editor.contrib.folding",_=Me([_e(1,t.IContextKeyService)],_),e.FoldingController=_;class f extends d.EditorAction{runEditorCommand(W,x,K){let Y=_.get(x);if(!!Y){let ee=Y.getFoldingModel();if(ee)return this.reportTelemetry(W,x),ee.then(se=>{if(se){this.invoke(Y,se,x,K);const ne=x.getSelection();ne&&Y.reveal(ne.getStartPosition())}})}}getSelectedLines(W){let x=W.getSelections();return x?x.map(K=>K.startLineNumber):[]}getLineNumbers(W,x){return W&&W.selectionLines?W.selectionLines.map(K=>K+1):this.getSelectedLines(x)}run(W,x){}}function v(R){if(!N.isUndefined(R)){if(!N.isObject(R))return!1;const W=R;if(!N.isUndefined(W.levels)&&!N.isNumber(W.levels)||!N.isUndefined(W.direction)&&!N.isString(W.direction)||!N.isUndefined(W.selectionLines)&&(!N.isArray(W.selectionLines)||!W.selectionLines.every(N.isNumber)))return!1}return!0}class y extends f{constructor(){super({id:"editor.unfold",label:b.localize(0,null),alias:"Unfold",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:2048|1024|89,mac:{primary:2048|512|89},weight:100},description:{description:"Unfold the content in the editor",args:[{name:"Unfold editor argument",description:`Property-value pairs that can be passed through this argument: + * 'levels': Number of levels to unfold. If not set, defaults to 1. + * 'direction': If 'up', unfold given number of levels up otherwise unfolds down. + * 'selectionLines': The start lines (0-based) of the editor selections to apply the unfold action to. If not set, the active selection(s) will be used. + `,constraint:v,schema:{type:"object",properties:{levels:{type:"number",default:1},direction:{type:"string",enum:["up","down"],default:"down"},selectionLines:{type:"array",items:{type:"number"}}}}}]}})}invoke(W,x,K,Y){let ee=Y&&Y.levels||1,se=this.getLineNumbers(Y,K);Y&&Y.direction==="up"?g.setCollapseStateLevelsUp(x,!1,ee,se):g.setCollapseStateLevelsDown(x,!1,ee,se)}}class L extends f{constructor(){super({id:"editor.unfoldRecursively",label:b.localize(1,null),alias:"Unfold Recursively",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|89),weight:100}})}invoke(W,x,K,Y){g.setCollapseStateLevelsDown(x,!1,Number.MAX_VALUE,this.getSelectedLines(K))}}class I extends f{constructor(){super({id:"editor.fold",label:b.localize(2,null),alias:"Fold",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:2048|1024|87,mac:{primary:2048|512|87},weight:100},description:{description:"Fold the content in the editor",args:[{name:"Fold editor argument",description:`Property-value pairs that can be passed through this argument: + * 'levels': Number of levels to fold. + * 'direction': If 'up', folds given number of levels up otherwise folds down. + * 'selectionLines': The start lines (0-based) of the editor selections to apply the fold action to. If not set, the active selection(s) will be used. + If no levels or direction is set, folds the region at the locations or if already collapsed, the first uncollapsed parent instead. + `,constraint:v,schema:{type:"object",properties:{levels:{type:"number"},direction:{type:"string",enum:["up","down"]},selectionLines:{type:"array",items:{type:"number"}}}}}]}})}invoke(W,x,K,Y){let ee=this.getLineNumbers(Y,K);const se=Y&&Y.levels,ne=Y&&Y.direction;typeof se!="number"&&typeof ne!="string"?g.setCollapseStateUp(x,!0,ee):ne==="up"?g.setCollapseStateLevelsUp(x,!0,se||1,ee):g.setCollapseStateLevelsDown(x,!0,se||1,ee)}}class k extends f{constructor(){super({id:"editor.toggleFold",label:b.localize(3,null),alias:"Toggle Fold",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|42),weight:100}})}invoke(W,x,K){let Y=this.getSelectedLines(K);g.toggleCollapseState(x,1,Y)}}class E extends f{constructor(){super({id:"editor.foldRecursively",label:b.localize(4,null),alias:"Fold Recursively",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|87),weight:100}})}invoke(W,x,K){let Y=this.getSelectedLines(K);g.setCollapseStateLevelsDown(x,!0,Number.MAX_VALUE,Y)}}class T extends f{constructor(){super({id:"editor.foldAllBlockComments",label:b.localize(5,null),alias:"Fold All Block Comments",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|85),weight:100}})}invoke(W,x,K){if(x.regions.hasTypes())g.setCollapseStateForType(x,u.FoldingRangeKind.Comment.value,!0);else{const Y=K.getModel();if(!Y)return;let ee=s.LanguageConfigurationRegistry.getComments(Y.getLanguageIdentifier().id);if(ee&&ee.blockCommentStartToken){let se=new RegExp("^\\s*"+M.escapeRegExpCharacters(ee.blockCommentStartToken));g.setCollapseStateForMatchingLines(x,se,!0)}}}}class O extends f{constructor(){super({id:"editor.foldAllMarkerRegions",label:b.localize(6,null),alias:"Fold All Regions",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|29),weight:100}})}invoke(W,x,K){if(x.regions.hasTypes())g.setCollapseStateForType(x,u.FoldingRangeKind.Region.value,!0);else{const Y=K.getModel();if(!Y)return;let ee=s.LanguageConfigurationRegistry.getFoldingRules(Y.getLanguageIdentifier().id);if(ee&&ee.markers&&ee.markers.start){let se=new RegExp(ee.markers.start);g.setCollapseStateForMatchingLines(x,se,!0)}}}}class A extends f{constructor(){super({id:"editor.unfoldAllMarkerRegions",label:b.localize(7,null),alias:"Unfold All Regions",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|30),weight:100}})}invoke(W,x,K){if(x.regions.hasTypes())g.setCollapseStateForType(x,u.FoldingRangeKind.Region.value,!1);else{const Y=K.getModel();if(!Y)return;let ee=s.LanguageConfigurationRegistry.getFoldingRules(Y.getLanguageIdentifier().id);if(ee&&ee.markers&&ee.markers.start){let se=new RegExp(ee.markers.start);g.setCollapseStateForMatchingLines(x,se,!1)}}}}class B extends f{constructor(){super({id:"editor.foldAll",label:b.localize(8,null),alias:"Fold All",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|21),weight:100}})}invoke(W,x,K){g.setCollapseStateLevelsDown(x,!0)}}class F extends f{constructor(){super({id:"editor.unfoldAll",label:b.localize(9,null),alias:"Unfold All",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|40),weight:100}})}invoke(W,x,K){g.setCollapseStateLevelsDown(x,!1)}}class D extends f{getFoldingLevel(){return parseInt(this.id.substr(D.ID_PREFIX.length))}invoke(W,x,K){g.setCollapseStateAtLevel(x,this.getFoldingLevel(),!0,this.getSelectedLines(K))}}D.ID_PREFIX="editor.foldLevel",D.ID=R=>D.ID_PREFIX+R,d.registerEditorContribution(_.ID,_),d.registerEditorAction(y),d.registerEditorAction(L),d.registerEditorAction(I),d.registerEditorAction(E),d.registerEditorAction(B),d.registerEditorAction(F),d.registerEditorAction(T),d.registerEditorAction(O),d.registerEditorAction(A),d.registerEditorAction(k);for(let R=1;R<=7;R++)d.registerInstantiatedEditorAction(new D({id:D.ID(R),label:b.localize(10,null,R),alias:`Fold Level ${R}`,precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|21+R),weight:100}}));e.foldBackgroundBackground=h.registerColor("editor.foldBackground",{light:h.transparent(h.editorSelectionBackground,.3),dark:h.transparent(h.editorSelectionBackground,.3),hc:null},b.localize(11,null),!0),e.editorFoldForeground=h.registerColor("editorGutter.foldingControlForeground",{dark:h.iconForeground,light:h.iconForeground,hc:h.iconForeground},b.localize(12,null)),l.registerThemingParticipant((R,W)=>{const x=R.getColor(e.foldBackgroundBackground);x&&W.addRule(`.monaco-editor .folded-background { background-color: ${x}; }`);const K=R.getColor(e.editorFoldForeground);K&&W.addRule(` + .monaco-editor .cldr${l.ThemeIcon.asCSSSelector(p.foldingExpandedIcon)}, + .monaco-editor .cldr${l.ThemeIcon.asCSSSelector(p.foldingCollapsedIcon)} { + color: ${K} !important; + } + `)})}),define(Q[268],J([0,1,479,2,16,14,3,13,25,655,28,34,27,9,557,80]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NextMarkerAction=e.MarkerController=void 0;let r=class gt{constructor(v,y,L,I,k){this._markerNavigationService=y,this._contextKeyService=L,this._editorService=I,this._instantiationService=k,this._sessionDispoables=new N.DisposableStore,this._editor=v,this._widgetVisible=m.bindTo(this._contextKeyService)}static get(v){return v.getContribution(gt.ID)}dispose(){this._cleanUp(),this._sessionDispoables.dispose()}_cleanUp(){this._widgetVisible.reset(),this._sessionDispoables.clear(),this._widget=void 0,this._model=void 0}_getOrCreateModel(v){if(this._model&&this._model.matches(v))return this._model;let y=!1;return this._model&&(y=!0,this._cleanUp()),this._model=this._markerNavigationService.getMarkerList(v),y&&this._model.move(!0,this._editor.getModel(),this._editor.getPosition()),this._widget=this._instantiationService.createInstance(g.MarkerNavigationWidget,this._editor),this._widget.onDidClose(()=>this.close(),this,this._sessionDispoables),this._widgetVisible.set(!0),this._sessionDispoables.add(this._model),this._sessionDispoables.add(this._widget),this._sessionDispoables.add(this._editor.onDidChangeCursorPosition(L=>{var I,k,E;(!((I=this._model)===null||I===void 0?void 0:I.selected)||!S.Range.containsPosition((k=this._model)===null||k===void 0?void 0:k.selected.marker,L.position))&&((E=this._model)===null||E===void 0||E.resetIndex())})),this._sessionDispoables.add(this._model.onDidChange(()=>{if(!(!this._widget||!this._widget.position||!this._model)){const L=this._model.find(this._editor.getModel().uri,this._widget.position);L?this._widget.updateMarker(L.marker):this._widget.showStale()}})),this._sessionDispoables.add(this._widget.onDidSelectRelatedInformation(L=>{this._editorService.openCodeEditor({resource:L.resource,options:{pinned:!0,revealIfOpened:!0,selection:S.Range.lift(L).collapseToStart()}},this._editor),this.close(!1)})),this._sessionDispoables.add(this._editor.onDidChangeModel(()=>this._cleanUp())),this._model}close(v=!0){this._cleanUp(),v&&this._editor.focus()}showAtMarker(v){if(this._editor.hasModel()){const y=this._getOrCreateModel(this._editor.getModel().uri);y.resetIndex(),y.move(!0,this._editor.getModel(),new w.Position(v.startLineNumber,v.startColumn)),y.selected&&this._widget.showAtMarker(y.selected.marker,y.selected.index,y.selected.total)}}nagivate(v,y){return Ie(this,void 0,void 0,function*(){if(this._editor.hasModel()){const L=this._getOrCreateModel(y?void 0:this._editor.getModel().uri);if(L.move(v,this._editor.getModel(),this._editor.getPosition()),!L.selected)return;if(L.selected.marker.resource.toString()!==this._editor.getModel().uri.toString()){this._cleanUp();const I=yield this._editorService.openCodeEditor({resource:L.selected.marker.resource,options:{pinned:!1,revealIfOpened:!0,selectionRevealType:2,selection:L.selected.marker}},this._editor);I&&(gt.get(I).close(),gt.get(I).nagivate(v,y))}else this._widget.showAtMarker(L.selected.marker,L.selected.index,L.selected.total)}})}};r.ID="editor.contrib.markerController",r=Me([_e(1,a.IMarkerNavigationService),_e(2,M.IContextKeyService),_e(3,p.ICodeEditorService),_e(4,s.IInstantiationService)],r),e.MarkerController=r;class i extends C.EditorAction{constructor(v,y,L){super(L);this._next=v,this._multiFile=y}run(v,y){return Ie(this,void 0,void 0,function*(){y.hasModel()&&r.get(y).nagivate(this._next,this._multiFile)})}}class n extends i{constructor(){super(!0,!1,{id:n.ID,label:n.LABEL,alias:"Go to Next Problem (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.focus,primary:512|66,weight:100},menuOpts:{menuId:g.MarkerNavigationWidget.TitleMenu,title:n.LABEL,icon:u.registerIcon("marker-navigation-next",o.Codicon.chevronDown,b.localize(1,null)),group:"navigation",order:1}})}}e.NextMarkerAction=n,n.ID="editor.action.marker.next",n.LABEL=b.localize(0,null);class t extends i{constructor(){super(!1,!1,{id:t.ID,label:t.LABEL,alias:"Go to Previous Problem (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.focus,primary:1024|512|66,weight:100},menuOpts:{menuId:g.MarkerNavigationWidget.TitleMenu,title:n.LABEL,icon:u.registerIcon("marker-navigation-previous",o.Codicon.chevronUp,b.localize(3,null)),group:"navigation",order:2}})}}t.ID="editor.action.marker.prev",t.LABEL=b.localize(2,null);class l extends i{constructor(){super(!0,!0,{id:"editor.action.marker.nextInFiles",label:b.localize(4,null),alias:"Go to Next Problem in Files (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.focus,primary:66,weight:100},menuOpts:{menuId:c.MenuId.MenubarGoMenu,title:b.localize(5,null),group:"6_problem_nav",order:1}})}}class h extends i{constructor(){super(!1,!0,{id:"editor.action.marker.prevInFiles",label:b.localize(6,null),alias:"Go to Previous Problem in Files (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.focus,primary:1024|66,weight:100},menuOpts:{menuId:c.MenuId.MenubarGoMenu,title:b.localize(7,null),group:"6_problem_nav",order:2}})}}C.registerEditorContribution(r.ID,r),C.registerEditorAction(n),C.registerEditorAction(t),C.registerEditorAction(l),C.registerEditorAction(h);const m=new M.RawContextKey("markersNavigationVisible",!1),_=C.EditorCommand.bindToContribution(r.get);C.registerEditorCommand(new _({id:"closeMarkersNavigation",precondition:m,handler:f=>f.close(),kbOpts:{weight:100+50,kbExpr:d.EditorContextKeys.focus,primary:9,secondary:[1024|9]}}))}),define(Q[660],J([0,1,490,7,2,3,19,85,44,178,12,58,268,37,15,145,263,130,59,209]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerHoverParticipant=e.MarkerHover=void 0;const l=N.$;class h{constructor(v,y){this.range=v,this.marker=y}equals(v){return v instanceof h?C.IMarkerData.makeKey(this.marker)===C.IMarkerData.makeKey(v.marker):!1}}e.MarkerHover=h;const m={type:2,filter:{include:i.CodeActionKind.QuickFix}};let _=class{constructor(v,y,L,I,k){this._editor=v,this._hover=y,this._markerDecorationsService=L,this._keybindingService=I,this._openerService=k,this.recentMarkerCodeActionsInfo=void 0}computeSync(v,y){if(!this._editor.hasModel())return[];const L=this._editor.getModel(),I=v.startLineNumber,k=L.getLineMaxColumn(I),E=[];for(const T of y){const O=T.range.startLineNumber===I?T.range.startColumn:1,A=T.range.endLineNumber===I?T.range.endColumn:k,B=this._markerDecorationsService.getMarker(L.uri,T);if(!!B){const F=new w.Range(v.startLineNumber,O,v.startLineNumber,A);E.push(new h(F,B))}}return E}renderHoverParts(v,y){if(!v.length)return M.Disposable.None;const L=new M.DisposableStore;v.forEach(k=>y.appendChild(this.renderMarkerHover(k,L)));const I=v.length===1?v[0]:v.sort((k,E)=>C.MarkerSeverity.compare(k.marker.severity,E.marker.severity))[0];return y.appendChild(this.renderMarkerStatusbar(I,L)),L}renderMarkerHover(v,y){const L=l("div.hover-row"),I=N.append(L,l("div.marker.hover-contents")),{source:k,message:E,code:T,relatedInformation:O}=v.marker;this._editor.applyFontInfo(I);const A=N.append(I,l("span"));if(A.style.whiteSpace="pre-wrap",A.innerText=E,k||T)if(T&&typeof T!="string"){const B=l("span");if(k){const W=N.append(B,l("span"));W.innerText=k}const F=N.append(B,l("a.code-link"));F.setAttribute("href",T.target.toString()),y.add(N.addDisposableListener(F,"click",W=>{this._openerService.open(T.target),W.preventDefault(),W.stopPropagation()}));const D=N.append(F,l("span"));D.innerText=T.value;const R=N.append(I,B);R.style.opacity="0.6",R.style.paddingLeft="6px"}else{const B=N.append(I,l("span"));B.style.opacity="0.6",B.style.paddingLeft="6px",B.innerText=k&&T?`${k}(${T})`:k||`(${T})`}if(S.isNonEmptyArray(O))for(const{message:B,resource:F,startLineNumber:D,startColumn:R}of O){const W=N.append(I,l("div"));W.style.marginTop="8px";const x=N.append(W,l("a"));x.innerText=`${d.basename(F)}(${D}, ${R}): `,x.style.cursor="pointer",y.add(N.addDisposableListener(x,"click",Y=>{Y.stopPropagation(),Y.preventDefault(),this._openerService&&this._openerService.open(F,{fromUserGesture:!0,editorOptions:{selection:{startLineNumber:D,startColumn:R}}}).catch(p.onUnexpectedError)}));const K=N.append(W,l("span"));K.innerText=B,this._editor.applyFontInfo(K)}return L}renderMarkerStatusbar(v,y){const L=l("div.hover-row.status-bar"),I=N.append(L,l("div.actions"));if((v.marker.severity===C.MarkerSeverity.Error||v.marker.severity===C.MarkerSeverity.Warning||v.marker.severity===C.MarkerSeverity.Info)&&y.add(this.renderAction(I,{label:b.localize(0,null),commandId:o.NextMarkerAction.ID,run:()=>{this._hover.hide(),o.MarkerController.get(this._editor).showAtMarker(v.marker),this._editor.focus()}})),!this._editor.getOption(75)){const k=N.append(I,l("div"));this.recentMarkerCodeActionsInfo&&(C.IMarkerData.makeKey(this.recentMarkerCodeActionsInfo.marker)===C.IMarkerData.makeKey(v.marker)?this.recentMarkerCodeActionsInfo.hasCodeActions||(k.textContent=b.localize(1,null)):this.recentMarkerCodeActionsInfo=void 0);const E=this.recentMarkerCodeActionsInfo&&!this.recentMarkerCodeActionsInfo.hasCodeActions?M.Disposable.None:y.add(a.disposableTimeout(()=>k.textContent=b.localize(2,null),200));k.textContent||(k.textContent=String.fromCharCode(160));const T=this.getCodeActions(v.marker);y.add(M.toDisposable(()=>T.cancel())),T.then(O=>{if(E.dispose(),this.recentMarkerCodeActionsInfo={marker:v.marker,hasCodeActions:O.validActions.length>0},!this.recentMarkerCodeActionsInfo.hasCodeActions){O.dispose(),k.textContent=b.localize(3,null);return}k.style.display="none";let A=!1;y.add(M.toDisposable(()=>{A||O.dispose()})),y.add(this.renderAction(I,{label:b.localize(4,null),commandId:r.QuickFixAction.Id,run:B=>{A=!0;const F=r.QuickFixController.get(this._editor),D=N.getDomNodePagePosition(B);this._hover.hide(),F.showCodeActions(m,O,{x:D.left+6,y:D.top+D.height+6})}}))})}return L}renderAction(v,y){const L=this._keybindingService.lookupKeybinding(y.commandId),I=L?L.getLabel():null;return t.renderHoverAction(v,y,I)}getCodeActions(v){return a.createCancelablePromise(y=>u.getCodeActions(this._editor.getModel(),new w.Range(v.startLineNumber,v.startColumn,v.endLineNumber,v.endColumn),m,n.Progress.None,y))}};_=Me([_e(2,g.IMarkerDecorationsService),_e(3,s.IKeybindingService),_e(4,c.IOpenerService)],_),e.MarkerHoverParticipant=_}),define(Q[661],J([0,1,7,23,29,2,14,3,31,18,249,260,400,597,228,11,19,22,52,209,660,627]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModesContentHoverWidget=void 0;class m{constructor(I,k,E){this.range=I,this.color=k,this.provider=E}equals(I){return!1}}class _{constructor(I,k){this.owner=I,this.data=k}}class f{constructor(I,k,E){this._markerHoverParticipant=k,this._markdownHoverParticipant=E,this._editor=I,this._result=[],this._range=null}setRange(I){this._range=I,this._result=[]}clearResult(){this._result=[]}computeAsync(I){return Ie(this,void 0,void 0,function*(){return!this._editor.hasModel()||!this._range?Promise.resolve([]):(yield this._markdownHoverParticipant.computeAsync(this._range,I)).map(E=>new _(this._markdownHoverParticipant,E))})}computeSync(){if(!this._editor.hasModel()||!this._range)return[];const I=this._editor.getModel(),k=this._range,E=k.startLineNumber;if(E>this._editor.getModel().getLineCount())return[];const T=I.getLineMaxColumn(E),O=this._editor.getLineDecorations(E).filter(R=>{if(R.options.isWholeLine)return!0;const W=R.range.startLineNumber===E?R.range.startColumn:1,x=R.range.endLineNumber===E?R.range.endColumn:T;return!(W>k.startColumn||k.endColumn>x)});let A=[];const B=c.ColorDetector.get(this._editor);for(const R of O){const W=B.getColorData(R.range.getStartPosition());if(W){const{color:x,range:K}=W.colorInfo;A.push(new _(null,new m(C.Range.lift(K),x,W.provider)));break}}const F=this._markdownHoverParticipant.computeSync(this._range,O);A=A.concat(F.map(R=>new _(this._markdownHoverParticipant,R)));const D=this._markerHoverParticipant.computeSync(this._range,O);return A=A.concat(D.map(R=>new _(this._markerHoverParticipant,R))),r.coalesce(A)}onResult(I,k){k?this._result=I.concat(this._result):this._result=this._result.concat(I)}getResult(){return this._result.slice(0)}getResultWithLoadingMessage(){if(this._range){const I=new _(this._markdownHoverParticipant,this._markdownHoverParticipant.createLoadingMessage(this._range));return this._result.slice(0).concat([I])}return this._result.slice(0)}}class v extends n.Widget{constructor(I,k,E,T){super();this._hoverVisibleKey=k,this._themeService=T,this.allowEditorOverflow=!0,this._markerHoverParticipant=E.createInstance(l.MarkerHoverParticipant,I,this),this._markdownHoverParticipant=E.createInstance(h.MarkdownHoverParticipant,I,this),this._hover=this._register(new t.HoverWidget),this._id=v.ID,this._editor=I,this._isVisible=!1,this._stoleFocus=!1,this._renderDisposable=null,this.onkeydown(this._hover.containerDomNode,O=>{O.equals(9)&&this.hide()}),this._register(this._editor.onDidChangeConfiguration(O=>{O.hasChanged(38)&&this._updateFont()})),this._editor.onDidLayoutChange(()=>this.layout()),this.layout(),this._editor.addContentWidget(this),this._showAtPosition=null,this._showAtRange=null,this._stoleFocus=!1,this._messages=[],this._lastRange=null,this._computer=new f(this._editor,this._markerHoverParticipant,this._markdownHoverParticipant),this._highlightDecorations=[],this._isChangingDecorations=!1,this._shouldFocus=!1,this._colorPicker=null,this._hoverOperation=new a.HoverOperation(this._computer,O=>this._withResult(O,!0),null,O=>this._withResult(O,!1),this._editor.getOption(48).delay),this._register(b.addStandardDisposableListener(this.getDomNode(),b.EventType.FOCUS,()=>{this._colorPicker&&this.getDomNode().classList.add("colorpicker-hover")})),this._register(b.addStandardDisposableListener(this.getDomNode(),b.EventType.BLUR,()=>{this.getDomNode().classList.remove("colorpicker-hover")})),this._register(I.onDidChangeConfiguration(()=>{this._hoverOperation.setHoverTime(this._editor.getOption(48).delay)})),this._register(g.TokenizationRegistry.onDidChange(()=>{this._isVisible&&this._lastRange&&this._messages.length>0&&(this._messages=this._messages.map(O=>{var A,B;if(O.data instanceof m&&!!((A=this._lastRange)===null||A===void 0?void 0:A.intersectRanges(O.data.range))&&((B=this._colorPicker)===null||B===void 0?void 0:B.model.color)){const F=this._colorPicker.model.color,D={red:F.rgba.r/255,green:F.rgba.g/255,blue:F.rgba.b/255,alpha:F.rgba.a};return new _(O.owner,new m(O.data.range,D,O.data.provider))}else return O}),this._hover.contentsDomNode.textContent="",this._renderMessages(this._lastRange,this._messages))}))}dispose(){this._hoverOperation.cancel(),this._editor.removeContentWidget(this),super.dispose()}getId(){return this._id}getDomNode(){return this._hover.containerDomNode}showAt(I,k,E){this._showAtPosition=I,this._showAtRange=k,this._hoverVisibleKey.set(!0),this._isVisible=!0,this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible),this._editor.layoutContentWidget(this),this._editor.render(),this._stoleFocus=E,E&&this._hover.containerDomNode.focus()}getPosition(){return this._isVisible?{position:this._showAtPosition,range:this._showAtRange,preference:[1,2]}:null}_updateFont(){Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName("code")).forEach(k=>this._editor.applyFontInfo(k))}_updateContents(I){this._hover.contentsDomNode.textContent="",this._hover.contentsDomNode.appendChild(I),this._updateFont(),this._editor.layoutContentWidget(this),this._hover.onContentsChanged()}layout(){const I=Math.max(this._editor.getLayoutInfo().height/4,250),{fontSize:k,lineHeight:E}=this._editor.getOption(38);this._hover.contentsDomNode.style.fontSize=`${k}px`,this._hover.contentsDomNode.style.lineHeight=`${E}px`,this._hover.contentsDomNode.style.maxHeight=`${I}px`,this._hover.contentsDomNode.style.maxWidth=`${Math.max(this._editor.getLayoutInfo().width*.66,500)}px`}onModelDecorationsChanged(){this._isChangingDecorations||this._isVisible&&(this._hoverOperation.cancel(),this._computer.clearResult(),this._colorPicker||this._hoverOperation.start(0))}startShowingAt(I,k,E){if(!(this._lastRange&&this._lastRange.equalsRange(I))){if(this._hoverOperation.cancel(),this._isVisible)if(!this._showAtPosition||this._showAtPosition.lineNumber!==I.startLineNumber)this.hide();else{let T=[];for(let O=0,A=this._messages.length;O=I.endColumn&&T.push(B)}if(T.length>0){if(y(T,this._messages))return;this._renderMessages(I,T)}else this.hide()}this._lastRange=I,this._computer.setRange(I),this._shouldFocus=E,this._hoverOperation.start(k)}}hide(){this._lastRange=null,this._hoverOperation.cancel(),this._isVisible&&(setTimeout(()=>{this._isVisible||this._hoverVisibleKey.set(!1)},0),this._isVisible=!1,this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible),this._editor.layoutContentWidget(this),this._stoleFocus&&this._editor.focus()),this._isChangingDecorations=!0,this._highlightDecorations=this._editor.deltaDecorations(this._highlightDecorations,[]),this._isChangingDecorations=!1,this._renderDisposable&&(this._renderDisposable.dispose(),this._renderDisposable=null),this._colorPicker=null}isColorPickerVisible(){return!!this._colorPicker}onContentsChanged(){this._hover.onContentsChanged()}_withResult(I,k){this._messages=I,this._lastRange&&this._messages.length>0?this._renderMessages(this._lastRange,this._messages):k&&this.hide()}_renderMessages(I,k){this._renderDisposable&&(this._renderDisposable.dispose(),this._renderDisposable=null),this._colorPicker=null;let E=1073741824,T=k[0].data.range?C.Range.lift(k[0].data.range):null,O=document.createDocumentFragment(),A=!1;const B=new w.DisposableStore,F=[],D=[];k.forEach(R=>{const W=R.data;if(!!W.range)if(E=Math.min(E,W.range.startColumn),T=T?C.Range.plusRange(T,W.range):C.Range.lift(W.range),W instanceof m){A=!0;const{red:x,green:K,blue:Y,alpha:ee}=W.color,se=new M.RGBA(Math.round(x*255),Math.round(K*255),Math.round(Y*255),ee),ne=new M.Color(se);if(!this._editor.hasModel())return;const le=this._editor.getModel();let X=new C.Range(W.range.startLineNumber,W.range.startColumn,W.range.endLineNumber,W.range.endColumn),z={range:W.range,color:W.color};const P=new o.ColorPickerModel(ne,[],0),V=new s.ColorPickerWidget(O,P,this._editor.getOption(122),this._themeService);p.getColorPresentations(le,z,W.provider,N.CancellationToken.None).then(U=>{if(P.colorPresentations=U||[],!!this._editor.hasModel()){const H=this._editor.getModel().getValueInRange(W.range);P.guessColorPresentation(ne,H);const $=()=>{let G,j;if(P.presentation.textEdit){G=[P.presentation.textEdit],j=new C.Range(P.presentation.textEdit.range.startLineNumber,P.presentation.textEdit.range.startColumn,P.presentation.textEdit.range.endLineNumber,P.presentation.textEdit.range.endColumn);const te=this._editor.getModel()._setTrackedRange(null,j,3);this._editor.pushUndoStop(),this._editor.executeEdits("colorpicker",G),j=this._editor.getModel()._getTrackedRange(te)||j}else G=[{identifier:null,range:X,text:P.presentation.label,forceMoveMarkers:!1}],j=X.setEndPosition(X.endLineNumber,X.startColumn+P.presentation.label.length),this._editor.pushUndoStop(),this._editor.executeEdits("colorpicker",G);P.presentation.additionalTextEdits&&(G=[...P.presentation.additionalTextEdits],this._editor.executeEdits("colorpicker",G),this.hide()),this._editor.pushUndoStop(),X=j},ie=G=>p.getColorPresentations(le,{range:X,color:{red:G.rgba.r/255,green:G.rgba.g/255,blue:G.rgba.b/255,alpha:G.rgba.a}},W.provider,N.CancellationToken.None).then(j=>{P.colorPresentations=j||[]}),oe=P.onColorFlushed(G=>{ie(G).then($)}),ae=P.onDidChangeColor(ie);this._colorPicker=V,this.showAt(X.getStartPosition(),X,this._shouldFocus),this._updateContents(O),this._colorPicker.layout(),this._renderDisposable=w.combinedDisposable(oe,ae,V,B)}})}else W instanceof l.MarkerHover?F.push(W):W instanceof h.MarkdownHover&&D.push(W)}),D.length>0&&B.add(this._markdownHoverParticipant.renderHoverParts(D,O)),F.length&&B.add(this._markerHoverParticipant.renderHoverParts(F,O)),this._renderDisposable=B,!A&&O.hasChildNodes()&&(this.showAt(new S.Position(I.startLineNumber,E),T,this._shouldFocus),this._updateContents(O)),this._isChangingDecorations=!0,this._highlightDecorations=this._editor.deltaDecorations(this._highlightDecorations,T?[{range:T,options:v._DECORATION_OPTIONS}]:[]),this._isChangingDecorations=!1}}e.ModesContentHoverWidget=v,v.ID="editor.contrib.modesContentHoverWidget",v._DECORATION_OPTIONS=d.ModelDecorationOptions.register({className:"hoverHighlight"});function y(L,I){if(L.length!==I.length)return!1;for(let k=0;k{const k=L.getColor(i.textLinkForeground);k&&I.addRule(`.monaco-hover .hover-contents a.code-link span:hover { color: ${k}; }`)})}),define(Q[662],J([0,1,497,15,39,2,13,241,3,21,25,53,31,18,267,34,22,11,16]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionHighlighter=e.CompatChangeAll=e.SelectHighlightsAction=e.MoveSelectionToPreviousFindMatchAction=e.MoveSelectionToNextFindMatchAction=e.AddSelectionToPreviousFindMatchAction=e.AddSelectionToNextFindMatchAction=e.MultiCursorSelectionControllerAction=e.MultiCursorSelectionController=e.MultiCursorSession=e.MultiCursorSessionResult=e.InsertCursorBelow=e.InsertCursorAbove=void 0;class t extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorAbove",label:b.localize(0,null),alias:"Add Cursor Above",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2048|512|16,linux:{primary:1024|512|16,secondary:[2048|1024|16]},weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(1,null),order:2}})}run(x,K,Y){if(!!K.hasModel()){const ee=Y&&Y.logicalLine===!0,se=K._getViewModel();se.cursorConfig.readOnly||(se.pushStackElement(),se.setCursorStates(Y.source,3,C.CursorMoveCommands.addCursorUp(se,se.getCursorStates(),ee)),se.revealTopMostCursor(Y.source))}}}e.InsertCursorAbove=t;class l extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorBelow",label:b.localize(2,null),alias:"Add Cursor Below",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2048|512|18,linux:{primary:1024|512|18,secondary:[2048|1024|18]},weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(3,null),order:3}})}run(x,K,Y){if(!!K.hasModel()){const ee=Y&&Y.logicalLine===!0,se=K._getViewModel();se.cursorConfig.readOnly||(se.pushStackElement(),se.setCursorStates(Y.source,3,C.CursorMoveCommands.addCursorDown(se,se.getCursorStates(),ee)),se.revealBottomMostCursor(Y.source))}}}e.InsertCursorBelow=l;class h extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorAtEndOfEachLineSelected",label:b.localize(4,null),alias:"Add Cursors to Line Ends",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:1024|512|39,weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(5,null),order:4}})}getCursorsForSelection(x,K,Y){if(!x.isEmpty()){for(let ee=x.startLineNumber;ee1&&Y.push(new g.Selection(x.endLineNumber,x.endColumn,x.endLineNumber,x.endColumn))}}run(x,K){if(!!K.hasModel()){const Y=K.getModel(),ee=K.getSelections();let se=[];ee.forEach(ne=>this.getCursorsForSelection(ne,Y,se)),se.length>0&&K.setSelections(se)}}}class m extends S.EditorAction{constructor(){super({id:"editor.action.addCursorsToBottom",label:b.localize(6,null),alias:"Add Cursors To Bottom",precondition:void 0})}run(x,K){if(!!K.hasModel()){const Y=K.getSelections(),ee=K.getModel().getLineCount();let se=[];for(let ne=Y[0].startLineNumber;ne<=ee;ne++)se.push(new g.Selection(ne,Y[0].startColumn,ne,Y[0].endColumn));se.length>0&&K.setSelections(se)}}}class _ extends S.EditorAction{constructor(){super({id:"editor.action.addCursorsToTop",label:b.localize(7,null),alias:"Add Cursors To Top",precondition:void 0})}run(x,K){if(!!K.hasModel()){const Y=K.getSelections();let ee=[];for(let se=Y[0].startLineNumber;se>=1;se--)ee.push(new g.Selection(se,Y[0].startColumn,se,Y[0].endColumn));ee.length>0&&K.setSelections(ee)}}}class f{constructor(x,K,Y){this.selections=x,this.revealRange=K,this.revealScrollType=Y}}e.MultiCursorSessionResult=f;class v{constructor(x,K,Y,ee,se,ne,le){this._editor=x,this.findController=K,this.isDisconnectedFromFindController=Y,this.searchText=ee,this.wholeWord=se,this.matchCase=ne,this.currentMatch=le}static create(x,K){if(!x.hasModel())return null;const Y=K.getState();if(!x.hasTextFocus()&&Y.isRevealed&&Y.searchString.length>0)return new v(x,K,!1,Y.searchString,Y.wholeWord,Y.matchCase,null);let ee=!1,se,ne;const le=x.getSelections();le.length===1&&le[0].isEmpty()?(ee=!0,se=!0,ne=!0):(se=Y.wholeWord,ne=Y.matchCase);const X=x.getSelection();let z,P=null;if(X.isEmpty()){const V=x.getConfiguredWordAtPosition(X.getStartPosition());if(!V)return null;z=V.word,P=new g.Selection(X.startLineNumber,V.startColumn,X.startLineNumber,V.endColumn)}else z=x.getModel().getValueInRange(X).replace(/\r\n/g,` +`);return new v(x,K,ee,z,se,ne,P)}addSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const x=this._getNextMatch();if(!x)return null;const K=this._editor.getSelections();return new f(K.concat(x),x,0)}moveSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const x=this._getNextMatch();if(!x)return null;const K=this._editor.getSelections();return new f(K.slice(0,K.length-1).concat(x),x,0)}_getNextMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const ee=this.currentMatch;return this.currentMatch=null,ee}this.findController.highlightFindOptions();const x=this._editor.getSelections(),K=x[x.length-1],Y=this._editor.getModel().findNextMatch(this.searchText,K.getEndPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(110):null,!1);return Y?new g.Selection(Y.range.startLineNumber,Y.range.startColumn,Y.range.endLineNumber,Y.range.endColumn):null}addSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const x=this._getPreviousMatch();if(!x)return null;const K=this._editor.getSelections();return new f(K.concat(x),x,0)}moveSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const x=this._getPreviousMatch();if(!x)return null;const K=this._editor.getSelections();return new f(K.slice(0,K.length-1).concat(x),x,0)}_getPreviousMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const ee=this.currentMatch;return this.currentMatch=null,ee}this.findController.highlightFindOptions();const x=this._editor.getSelections(),K=x[x.length-1],Y=this._editor.getModel().findPreviousMatch(this.searchText,K.getStartPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(110):null,!1);return Y?new g.Selection(Y.range.startLineNumber,Y.range.startColumn,Y.range.endLineNumber,Y.range.endColumn):null}selectAll(){return this._editor.hasModel()?(this.findController.highlightFindOptions(),this._editor.getModel().findMatches(this.searchText,!0,!1,this.matchCase,this.wholeWord?this._editor.getOption(110):null,!1,1073741824)):[]}}e.MultiCursorSession=v;class y extends w.Disposable{constructor(x){super();this._sessionDispose=this._register(new w.DisposableStore),this._editor=x,this._ignoreSelectionChange=!1,this._session=null}static get(x){return x.getContribution(y.ID)}dispose(){this._endSession(),super.dispose()}_beginSessionIfNeeded(x){if(!this._session){const K=v.create(this._editor,x);if(!K)return;this._session=K;const Y={searchString:this._session.searchText};this._session.isDisconnectedFromFindController&&(Y.wholeWordOverride=1,Y.matchCaseOverride=1,Y.isRegexOverride=2),x.getState().change(Y,!1),this._sessionDispose.add(this._editor.onDidChangeCursorSelection(ee=>{this._ignoreSelectionChange||this._endSession()})),this._sessionDispose.add(this._editor.onDidBlurEditorText(()=>{this._endSession()})),this._sessionDispose.add(x.getState().onFindReplaceStateChange(ee=>{(ee.matchCase||ee.wholeWord)&&this._endSession()}))}}_endSession(){if(this._sessionDispose.clear(),this._session&&this._session.isDisconnectedFromFindController){const x={wholeWordOverride:0,matchCaseOverride:0,isRegexOverride:0};this._session.findController.getState().change(x,!1)}this._session=null}_setSelections(x){this._ignoreSelectionChange=!0,this._editor.setSelections(x),this._ignoreSelectionChange=!1}_expandEmptyToWord(x,K){if(!K.isEmpty())return K;const Y=this._editor.getConfiguredWordAtPosition(K.getStartPosition());return Y?new g.Selection(K.startLineNumber,Y.startColumn,K.startLineNumber,Y.endColumn):K}_applySessionResult(x){!x||(this._setSelections(x.selections),x.revealRange&&this._editor.revealRangeInCenterIfOutsideViewport(x.revealRange,x.revealScrollType))}getSession(x){return this._session}addSelectionToNextFindMatch(x){if(!!this._editor.hasModel()){if(!this._session){const K=this._editor.getSelections();if(K.length>1){const ee=x.getState().matchCase;if(!D(this._editor.getModel(),K,ee)){const ne=this._editor.getModel();let le=[];for(let X=0,z=K.length;X0&&Y.isRegex)K=this._editor.getModel().findMatches(Y.searchString,!0,Y.isRegex,Y.matchCase,Y.wholeWord?this._editor.getOption(110):null,!1,1073741824);else{if(this._beginSessionIfNeeded(x),!this._session)return;K=this._session.selectAll()}if(Y.searchScope){const ee=Y.searchScope;let se=[];K.forEach(ne=>{ee.forEach(le=>{ne.range.endLineNumber<=le.endLineNumber&&ne.range.startLineNumber>=le.startLineNumber&&se.push(ne)})}),K=se}if(K.length>0){const ee=this._editor.getSelection();for(let se=0,ne=K.length;senew g.Selection(se.range.startLineNumber,se.range.startColumn,se.range.endLineNumber,se.range.endColumn)))}}}}e.MultiCursorSelectionController=y,y.ID="editor.contrib.multiCursorController";class L extends S.EditorAction{run(x,K){const Y=y.get(K);if(!!Y){const ee=a.CommonFindController.get(K);!ee||this._run(Y,ee)}}}e.MultiCursorSelectionControllerAction=L;class I extends L{constructor(){super({id:"editor.action.addSelectionToNextFindMatch",label:b.localize(8,null),alias:"Add Selection To Next Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2048|34,weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(9,null),order:5}})}_run(x,K){x.addSelectionToNextFindMatch(K)}}e.AddSelectionToNextFindMatchAction=I;class k extends L{constructor(){super({id:"editor.action.addSelectionToPreviousFindMatch",label:b.localize(10,null),alias:"Add Selection To Previous Find Match",precondition:void 0,menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(11,null),order:6}})}_run(x,K){x.addSelectionToPreviousFindMatch(K)}}e.AddSelectionToPreviousFindMatchAction=k;class E extends L{constructor(){super({id:"editor.action.moveSelectionToNextFindMatch",label:b.localize(12,null),alias:"Move Last Selection To Next Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:M.KeyChord(2048|41,2048|34),weight:100}})}_run(x,K){x.moveSelectionToNextFindMatch(K)}}e.MoveSelectionToNextFindMatchAction=E;class T extends L{constructor(){super({id:"editor.action.moveSelectionToPreviousFindMatch",label:b.localize(13,null),alias:"Move Last Selection To Previous Find Match",precondition:void 0})}_run(x,K){x.moveSelectionToPreviousFindMatch(K)}}e.MoveSelectionToPreviousFindMatchAction=T;class O extends L{constructor(){super({id:"editor.action.selectHighlights",label:b.localize(14,null),alias:"Select All Occurrences of Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2048|1024|42,weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(15,null),order:7}})}_run(x,K){x.selectAll(K)}}e.SelectHighlightsAction=O;class A extends L{constructor(){super({id:"editor.action.changeAll",label:b.localize(16,null),alias:"Change All Occurrences",precondition:n.ContextKeyExpr.and(p.EditorContextKeys.writable,p.EditorContextKeys.editorTextFocus),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2048|60,weight:100},contextMenuOpts:{group:"1_modification",order:1.2}})}_run(x,K){x.selectAll(K)}}e.CompatChangeAll=A;class B{constructor(x,K,Y,ee){this.searchText=x,this.matchCase=K,this.wordSeparators=Y,this.modelVersionId=ee}static softEquals(x,K){return!x&&!K?!0:!x||!K?!1:x.searchText===K.searchText&&x.matchCase===K.matchCase&&x.wordSeparators===K.wordSeparators&&x.modelVersionId===K.modelVersionId}}class F extends w.Disposable{constructor(x){super();this.editor=x,this._isEnabled=x.getOption(92),this.decorations=[],this.updateSoon=this._register(new N.RunOnceScheduler(()=>this._update(),300)),this.state=null,this._register(x.onDidChangeConfiguration(K=>{this._isEnabled=x.getOption(92)})),this._register(x.onDidChangeCursorSelection(K=>{!this._isEnabled||(K.selection.isEmpty()?K.reason===3?(this.state&&this._setState(null),this.updateSoon.schedule()):this._setState(null):this._update())})),this._register(x.onDidChangeModel(K=>{this._setState(null)})),this._register(x.onDidChangeModelContent(K=>{this._isEnabled&&this.updateSoon.schedule()})),this._register(a.CommonFindController.get(x).getState().onFindReplaceStateChange(K=>{this._update()}))}_update(){this._setState(F._createState(this._isEnabled,this.editor))}static _createState(x,K){if(!x||!K.hasModel())return null;const Y=K.getSelection();if(Y.startLineNumber!==Y.endLineNumber)return null;const ee=y.get(K);if(!ee)return null;const se=a.CommonFindController.get(K);if(!se)return null;let ne=ee.getSession(se);if(!ne){const z=K.getSelections();if(z.length>1){const V=se.getState().matchCase;if(!D(K.getModel(),z,V))return null}ne=v.create(K,se)}if(!ne||ne.currentMatch||/^[ \t]+$/.test(ne.searchText)||ne.searchText.length>200)return null;const le=se.getState(),X=le.matchCase;if(le.isRevealed){let z=le.searchString;X||(z=z.toLowerCase());let P=ne.searchText;if(X||(P=P.toLowerCase()),z===P&&ne.matchCase===le.matchCase&&ne.wholeWord===le.wholeWord&&!le.isRegex)return null}return new B(ne.searchText,ne.matchCase,ne.wholeWord?K.getOption(110):null,K.getModel().getVersionId())}_setState(x){if(B.softEquals(this.state,x)){this.state=x;return}if(this.state=x,!this.state){this.decorations=this.editor.deltaDecorations(this.decorations,[]);return}if(!!this.editor.hasModel()){const K=this.editor.getModel();if(!K.isTooLargeForTokenization()){const Y=s.DocumentHighlightProviderRegistry.has(K)&&this.editor.getOption(66);let ee=K.findMatches(this.state.searchText,!0,!1,this.state.matchCase,this.state.wordSeparators,!1).map(X=>X.range);ee.sort(d.Range.compareRangesUsingStarts);let se=this.editor.getSelections();se.sort(d.Range.compareRangesUsingStarts);let ne=[];for(let X=0,z=0,P=ee.length,V=se.length;X=V)ne.push(U),X++;else{const H=d.Range.compareRangesUsingStarts(U,se[z]);H<0?((se[z].isEmpty()||!d.Range.areIntersecting(U,se[z]))&&ne.push(U),X++):(H>0||X++,z++)}}const le=ne.map(X=>({range:X,options:Y?F._SELECTION_HIGHLIGHT:F._SELECTION_HIGHLIGHT_OVERVIEW}));this.decorations=this.editor.deltaDecorations(this.decorations,le)}}}dispose(){this._setState(null),super.dispose()}}e.SelectionHighlighter=F,F.ID="editor.contrib.selectionHighlighter",F._SELECTION_HIGHLIGHT_OVERVIEW=o.ModelDecorationOptions.register({stickiness:1,className:"selectionHighlight",overviewRuler:{color:i.themeColorFromId(r.overviewRulerSelectionHighlightForeground),position:c.OverviewRulerLane.Center}}),F._SELECTION_HIGHLIGHT=o.ModelDecorationOptions.register({stickiness:1,className:"selectionHighlight"});function D(W,x,K){const Y=R(W,x[0],!K);for(let ee=1,se=x.length;ee{T?(this.show(),this.render(T)):this.hide()}))}createParamaterHintDOMNodes(){const L=m(".editor-widget.parameter-hints-widget"),I=b.append(L,m(".phwrapper"));I.tabIndex=-1;const k=b.append(I,m(".controls")),E=b.append(k,m(".button"+u.ThemeIcon.asCSSSelector(f))),T=b.append(k,m(".overloads")),O=b.append(k,m(".button"+u.ThemeIcon.asCSSSelector(_))),A=N.stop(N.domEvent(E,"click"));this._register(A(this.previous,this));const B=N.stop(N.domEvent(O,"click"));this._register(B(this.next,this));const F=m(".body"),D=new w.DomScrollableElement(F,{});this._register(D),I.appendChild(D.getDomNode());const R=b.append(F,m(".signature")),W=b.append(F,m(".docs"));L.style.userSelect="text",this.domNodes={element:L,signature:R,overloads:T,docs:W,scrollbar:D},this.editor.addContentWidget(this),this.hide(),this._register(this.editor.onDidChangeCursorSelection(K=>{this.visible&&this.editor.layoutContentWidget(this)}));const x=()=>{if(!!this.domNodes){const K=this.editor.getOption(38);this.domNodes.element.style.fontSize=`${K.fontSize}px`}};x(),this._register(S.Event.chain(this.editor.onDidChangeConfiguration.bind(this.editor)).filter(K=>K.hasChanged(38)).on(x,null)),this._register(this.editor.onDidLayoutChange(K=>this.updateMaxHeight())),this.updateMaxHeight()}show(){this.visible||(this.domNodes||this.createParamaterHintDOMNodes(),this.keyVisible.set(!0),this.visible=!0,setTimeout(()=>{this.domNodes&&this.domNodes.element.classList.add("visible")},100),this.editor.layoutContentWidget(this))}hide(){this.renderDisposeables.clear(),!!this.visible&&(this.keyVisible.reset(),this.visible=!1,this.announcedLabel=null,this.domNodes&&this.domNodes.element.classList.remove("visible"),this.editor.layoutContentWidget(this))}getPosition(){return this.visible?{position:this.editor.getPosition(),preference:[1,2]}:null}render(L){var I;if(this.renderDisposeables.clear(),!!this.domNodes){const k=L.signatures.length>1;this.domNodes.element.classList.toggle("multiple",k),this.keyMultipleSignatures.set(k),this.domNodes.signature.innerText="",this.domNodes.docs.innerText="";const E=L.signatures[L.activeSignature];if(!!E){const T=b.append(this.domNodes.signature,m(".code")),O=this.editor.getOption(38);T.style.fontSize=`${O.fontSize}px`,T.style.fontFamily=O.fontFamily;const A=E.parameters.length>0,B=(I=E.activeParameter)!==null&&I!==void 0?I:L.activeParameter;if(A)this.renderParameters(T,E,B);else{const R=b.append(T,m("span"));R.textContent=E.label}const F=E.parameters[B];if(F==null?void 0:F.documentation){const R=m("span.documentation");if(typeof F.documentation=="string")R.textContent=F.documentation;else{const W=this.renderMarkdownDocs(F.documentation);R.appendChild(W.element)}b.append(this.domNodes.docs,m("p",{},R))}if(E.documentation!==void 0)if(typeof E.documentation=="string")b.append(this.domNodes.docs,m("p",{},E.documentation));else{const R=this.renderMarkdownDocs(E.documentation);b.append(this.domNodes.docs,R.element)}const D=this.hasDocs(E,F);if(this.domNodes.signature.classList.toggle("has-docs",D),this.domNodes.docs.classList.toggle("empty",!D),this.domNodes.overloads.textContent=String(L.activeSignature+1).padStart(L.signatures.length.toString().length,"0")+"/"+L.signatures.length,F){const R=this.getParameterLabel(E,B);this.announcedLabel!==R&&(M.alert(c.localize(2,null,R)),this.announcedLabel=R)}this.editor.layoutContentWidget(this),this.domNodes.scrollbar.scanDomNode()}}}renderMarkdownDocs(L){const I=this.renderDisposeables.add(this.markdownRenderer.render(L,{asyncRenderCallback:()=>{var k;(k=this.domNodes)===null||k===void 0||k.scrollbar.scanDomNode()}}));return I.element.classList.add("markdown-docs"),I}hasDocs(L,I){return!!(I&&typeof I.documentation=="string"&&t.assertIsDefined(I.documentation).length>0||I&&typeof I.documentation=="object"&&t.assertIsDefined(I.documentation).value.length>0||L.documentation&&typeof L.documentation=="string"&&t.assertIsDefined(L.documentation).length>0||L.documentation&&typeof L.documentation=="object"&&t.assertIsDefined(L.documentation.value).length>0)}renderParameters(L,I,k){const[E,T]=this.getParameterLabelOffsets(I,k),O=document.createElement("span");O.textContent=I.label.substring(0,E);const A=document.createElement("span");A.textContent=I.label.substring(E,T),A.className="parameter active";const B=document.createElement("span");B.textContent=I.label.substring(T),b.append(L,O,A,B)}getParameterLabel(L,I){const k=L.parameters[I];return Array.isArray(k.label)?L.label.substring(k.label[0],k.label[1]):k.label}getParameterLabelOffsets(L,I){const k=L.parameters[I];if(k){if(Array.isArray(k.label))return k.label;if(k.label.length){const E=new RegExp(`(\\W|^)${i.escapeRegExpCharacters(k.label)}(?=\\W|$)`,"g");E.test(L.label);const T=E.lastIndex-k.label.length;return T>=0?[T,E.lastIndex]:[0,0]}else return[0,0]}else return[0,0]}next(){this.editor.focus(),this.model.next()}previous(){this.editor.focus(),this.model.previous()}cancel(){this.model.cancel()}getDomNode(){return this.domNodes||this.createParamaterHintDOMNodes(),this.domNodes.element}getId(){return jt.ID}trigger(L){this.model.trigger(L,0)}updateMaxHeight(){if(!!this.domNodes){const I=`${Math.max(this.editor.getLayoutInfo().height/4,250)}px`;this.domNodes.element.style.maxHeight=I;const k=this.domNodes.element.getElementsByClassName("phwrapper");k.length&&(k[0].style.maxHeight=I)}}};v.ID="editor.widget.parameterHintsWidget",v=Me([_e(1,o.IContextKeyService),_e(2,s.IOpenerService),_e(3,d.IModeService)],v),e.ParameterHintsWidget=v,u.registerThemingParticipant((y,L)=>{const I=y.getColor(a.editorHoverBorder);if(I){const A=y.type===l.ColorScheme.HIGH_CONTRAST?2:1;L.addRule(`.monaco-editor .parameter-hints-widget { border: ${A}px solid ${I}; }`),L.addRule(`.monaco-editor .parameter-hints-widget.multiple .body { border-left: 1px solid ${I.transparent(.5)}; }`),L.addRule(`.monaco-editor .parameter-hints-widget .signature.has-docs { border-bottom: 1px solid ${I.transparent(.5)}; }`)}const k=y.getColor(a.editorHoverBackground);k&&L.addRule(`.monaco-editor .parameter-hints-widget { background-color: ${k}; }`);const E=y.getColor(a.textLinkForeground);E&&L.addRule(`.monaco-editor .parameter-hints-widget a { color: ${E}; }`);const T=y.getColor(a.editorHoverForeground);T&&L.addRule(`.monaco-editor .parameter-hints-widget { color: ${T}; }`);const O=y.getColor(a.textCodeBlockBackground);O&&L.addRule(`.monaco-editor .parameter-hints-widget code { background-color: ${O}; }`)})}),define(Q[664],J([0,1,498,2,9,25,16,13,663,183,18]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerParameterHintsAction=void 0;let c=class Gt extends N.Disposable{constructor(r,i){super();this.editor=r,this.widget=this._register(i.createInstance(d.ParameterHintsWidget,this.editor))}static get(r){return r.getContribution(Gt.ID)}cancel(){this.widget.cancel()}previous(){this.widget.previous()}next(){this.widget.next()}trigger(r){this.widget.trigger(r)}};c.ID="editor.controller.parameterHints",c=Me([_e(1,M.IInstantiationService)],c);class o extends C.EditorAction{constructor(){super({id:"editor.action.triggerParameterHints",label:b.localize(0,null),alias:"Trigger Parameter Hints",precondition:w.EditorContextKeys.hasSignatureHelpProvider,kbOpts:{kbExpr:w.EditorContextKeys.editorTextFocus,primary:2048|1024|10,weight:100}})}run(r,i){const n=c.get(i);n&&n.trigger({triggerKind:p.SignatureHelpTriggerKind.Invoke})}}e.TriggerParameterHintsAction=o,C.registerEditorContribution(c.ID,c),C.registerEditorAction(o);const s=100+75,a=C.EditorCommand.bindToContribution(c.get);C.registerEditorCommand(new a({id:"closeParameterHints",precondition:g.Context.Visible,handler:u=>u.cancel(),kbOpts:{weight:s,kbExpr:w.EditorContextKeys.focus,primary:9,secondary:[1024|9]}})),C.registerEditorCommand(new a({id:"showPrevParameterHint",precondition:S.ContextKeyExpr.and(g.Context.Visible,g.Context.MultipleSignatures),handler:u=>u.previous(),kbOpts:{weight:s,kbExpr:w.EditorContextKeys.focus,primary:16,secondary:[512|16],mac:{primary:16,secondary:[512|16,256|46]}}})),C.registerEditorCommand(new a({id:"showNextParameterHint",precondition:S.ContextKeyExpr.and(g.Context.Visible,g.Context.MultipleSignatures),handler:u=>u.next(),kbOpts:{weight:s,kbExpr:w.EditorContextKeys.focus,primary:18,secondary:[512|18],mac:{primary:18,secondary:[512|18,256|44]}}}))}),define(Q[665],J([0,1,510,66,2,7,11,57,18,175,562,36,24,237,19,254,27,6,80]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";var t;Object.defineProperty(e,"__esModule",{value:!0}),e.ItemRenderer=e.suggestMoreInfoIcon=e.getAriaId=void 0;function l(_){return`suggest-aria-id:${_}`}e.getAriaId=l,e.suggestMoreInfoIcon=n.registerIcon("suggest-more-info",r.Codicon.chevronRight,b.localize(0,null));const h=new(t=class ft{extract(f,v){if(f.textLabel.match(ft._regexStrict))return v[0]=f.textLabel,!0;if(f.completion.detail&&f.completion.detail.match(ft._regexStrict))return v[0]=f.completion.detail,!0;if(typeof f.completion.documentation=="string"){const y=ft._regexRelaxed.exec(f.completion.documentation);if(y&&(y.index===0||y.index+y[0].length===f.completion.documentation.length))return v[0]=y[0],!0}return!1}},t._regexRelaxed=/(#([\da-fA-F]{3}){1,2}|(rgb|hsl)a\(\s*(\d{1,3}%?\s*,\s*){3}(1|0?\.\d+)\)|(rgb|hsl)\(\s*\d{1,3}%?(\s*,\s*\d{1,3}%?){2}\s*\))/,t._regexStrict=new RegExp(`^${t._regexRelaxed.source}$`,"i"),t);let m=class{constructor(f,v,y,L){this._editor=f,this._modelService=v,this._modeService=y,this._themeService=L,this._onDidToggleDetails=new i.Emitter,this.onDidToggleDetails=this._onDidToggleDetails.event,this.templateId="suggestion"}dispose(){this._onDidToggleDetails.dispose()}renderTemplate(f){const v=Object.create(null);v.disposables=new M.DisposableStore,v.root=f,v.root.classList.add("show-file-icons"),v.icon=w.append(f,w.$(".icon")),v.colorspan=w.append(v.icon,w.$("span.colorspan"));const y=w.append(f,w.$(".contents")),L=w.append(y,w.$(".main"));v.iconContainer=w.append(L,w.$(".icon-label.codicon")),v.left=w.append(L,w.$("span.left")),v.right=w.append(L,w.$("span.right")),v.iconLabel=new g.IconLabel(v.left,{supportHighlights:!0,supportIcons:!0}),v.disposables.add(v.iconLabel),v.parametersLabel=w.append(v.left,w.$("span.signature-label")),v.qualifierLabel=w.append(v.left,w.$("span.qualifier-label")),v.detailsLabel=w.append(v.right,w.$("span.details-label")),v.readMore=w.append(v.right,w.$("span.readMore"+S.ThemeIcon.asCSSSelector(e.suggestMoreInfoIcon))),v.readMore.title=b.localize(1,null);const I=()=>{const k=this._editor.getOptions(),E=k.get(38),T=E.fontFamily,O=E.fontFeatureSettings,A=k.get(102)||E.fontSize,B=k.get(103)||E.lineHeight,F=E.fontWeight,D=`${A}px`,R=`${B}px`;v.root.style.fontSize=D,v.root.style.fontWeight=F,L.style.fontFamily=T,L.style.fontFeatureSettings=O,L.style.lineHeight=R,v.icon.style.height=R,v.icon.style.width=R,v.readMore.style.height=R,v.readMore.style.width=R};return I(),v.disposables.add(this._editor.onDidChangeConfiguration(k=>{(k.hasChanged(38)||k.hasChanged(102)||k.hasChanged(103))&&I()})),v}renderElement(f,v,y){var L,I,k;const{completion:E}=f,T=typeof E.label=="string"?E.label:E.label.name;y.root.id=l(v),y.colorspan.style.backgroundColor="";const O={labelEscapeNewLines:!0,matches:N.createMatches(f.score)};let A=[];if(E.kind===19&&h.extract(f,A))y.icon.className="icon customcolor",y.iconContainer.className="icon hide",y.colorspan.style.backgroundColor=A[0];else if(E.kind===20&&this._themeService.getFileIconTheme().hasFileIcons){y.icon.className="icon hide",y.iconContainer.className="icon hide";const B=p.getIconClasses(this._modelService,this._modeService,o.URI.from({scheme:"fake",path:T}),s.FileKind.FILE),F=p.getIconClasses(this._modelService,this._modeService,o.URI.from({scheme:"fake",path:E.detail}),s.FileKind.FILE);O.extraClasses=B.length>F.length?B:F}else E.kind===23&&this._themeService.getFileIconTheme().hasFolderIcons?(y.icon.className="icon hide",y.iconContainer.className="icon hide",O.extraClasses=a.flatten([p.getIconClasses(this._modelService,this._modeService,o.URI.from({scheme:"fake",path:T}),s.FileKind.FOLDER),p.getIconClasses(this._modelService,this._modeService,o.URI.from({scheme:"fake",path:E.detail}),s.FileKind.FOLDER)])):(y.icon.className="icon hide",y.iconContainer.className="",y.iconContainer.classList.add("suggest-icon",...d.completionKindToCssClass(E.kind).split(" ")));E.tags&&E.tags.indexOf(1)>=0&&(O.extraClasses=(O.extraClasses||[]).concat(["deprecated"]),O.matches=[]),y.iconLabel.setLabel(T,void 0,O),typeof E.label=="string"?(y.parametersLabel.textContent="",y.qualifierLabel.textContent="",y.detailsLabel.textContent=(E.detail||"").replace(/\n.*$/m,""),y.root.classList.add("string-label"),y.root.title=""):(y.parametersLabel.textContent=(E.label.parameters||"").replace(/\n.*$/m,""),y.qualifierLabel.textContent=(E.label.qualifier||"").replace(/\n.*$/m,""),y.detailsLabel.textContent=(E.label.type||"").replace(/\n.*$/m,""),y.root.classList.remove("string-label"),y.root.title=`${T}${(L=E.label.parameters)!==null&&L!==void 0?L:""} ${(I=E.label.qualifier)!==null&&I!==void 0?I:""} ${(k=E.label.type)!==null&&k!==void 0?k:""}`),this._editor.getOption(101).showInlineDetails?w.show(y.detailsLabel):w.hide(y.detailsLabel),u.canExpandCompletionItem(f)?(y.right.classList.add("can-expand-details"),w.show(y.readMore),y.readMore.onmousedown=B=>{B.stopPropagation(),B.preventDefault()},y.readMore.onclick=B=>{B.stopPropagation(),B.preventDefault(),this._onDidToggleDetails.fire()}):(y.right.classList.remove("can-expand-details"),w.hide(y.readMore),y.readMore.onmousedown=null,y.readMore.onclick=null)}disposeTemplate(f){f.disposables.dispose()}};m=Me([_e(1,c.IModelService),_e(2,C.IModeService),_e(3,S.IThemeService)],m),e.ItemRenderer=m}),define(Q[666],J([0,1,508,8,7,6,12,2,105,16,117,116,11,22,79,15,9,254,649,665,231,144,100,352,123,259]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestContentWidget=e.SuggestWidget=e.editorSuggestWidgetHighlightForeground=e.editorSuggestWidgetSelectedBackground=e.editorSuggestWidgetForeground=e.editorSuggestWidgetBorder=e.editorSuggestWidgetBackground=void 0,e.editorSuggestWidgetBackground=s.registerColor("editorSuggestWidget.background",{dark:s.editorWidgetBackground,light:s.editorWidgetBackground,hc:s.editorWidgetBackground},b.localize(0,null)),e.editorSuggestWidgetBorder=s.registerColor("editorSuggestWidget.border",{dark:s.editorWidgetBorder,light:s.editorWidgetBorder,hc:s.editorWidgetBorder},b.localize(1,null)),e.editorSuggestWidgetForeground=s.registerColor("editorSuggestWidget.foreground",{dark:s.editorForeground,light:s.editorForeground,hc:s.editorForeground},b.localize(2,null)),e.editorSuggestWidgetSelectedBackground=s.registerColor("editorSuggestWidget.selectedBackground",{dark:s.quickInputListFocusBackground,light:s.quickInputListFocusBackground,hc:s.quickInputListFocusBackground},b.localize(3,null)),e.editorSuggestWidgetHighlightForeground=s.registerColor("editorSuggestWidget.highlightForeground",{dark:s.listHighlightForeground,light:s.listHighlightForeground,hc:s.listHighlightForeground},b.localize(4,null));class _{constructor(L,I){this._service=L,this._key=`suggestWidget.size/${I.getEditorType()}/${I instanceof h.EmbeddedCodeEditorWidget}`}restore(){var L;const I=(L=this._service.get(this._key,0))!==null&&L!==void 0?L:"";try{const k=JSON.parse(I);if(M.Dimension.is(k))return M.Dimension.lift(k)}catch(k){}}store(L){this._service.store(this._key,JSON.stringify(L),0,1)}reset(){this._service.remove(this._key,0)}}let f=class wt{constructor(L,I,k,E,T){this.editor=L,this._storageService=I,this._state=0,this._isAuto=!1,this._ignoreFocusEvents=!1,this._explainMode=!1,this._showTimeout=new u.TimeoutTimer,this._disposables=new C.DisposableStore,this._onDidSelect=new w.Emitter,this._onDidFocus=new w.Emitter,this._onDidHide=new w.Emitter,this._onDidShow=new w.Emitter,this.onDidSelect=this._onDidSelect.event,this.onDidFocus=this._onDidFocus.event,this.onDidHide=this._onDidHide.event,this.onDidShow=this._onDidShow.event,this._onDetailsKeydown=new w.Emitter,this.onDetailsKeyDown=this._onDetailsKeydown.event,this.element=new l.ResizableHTMLElement,this.element.domNode.classList.add("editor-widget","suggest-widget"),this._contentWidget=new v(this,L),this._persistedSize=new _(I,L);class O{constructor(x,K,Y=!1,ee=!1){this.persistedSize=x,this.currentSize=K,this.persistHeight=Y,this.persistWidth=ee}}let A;this._disposables.add(this.element.onDidWillResize(()=>{this._contentWidget.lockPreference(),A=new O(this._persistedSize.restore(),this.element.size)})),this._disposables.add(this.element.onDidResize(W=>{var x,K,Y,ee;if(this._resize(W.dimension.width,W.dimension.height),A&&(A.persistHeight=A.persistHeight||!!W.north||!!W.south,A.persistWidth=A.persistWidth||!!W.east||!!W.west),!!W.done){if(A){const{itemHeight:se,defaultSize:ne}=this.getLayoutInfo(),le=Math.round(se/2);let{width:X,height:z}=this.element.size;(!A.persistHeight||Math.abs(A.currentSize.height-z)<=le)&&(z=(K=(x=A.persistedSize)===null||x===void 0?void 0:x.height)!==null&&K!==void 0?K:ne.height),(!A.persistWidth||Math.abs(A.currentSize.width-X)<=le)&&(X=(ee=(Y=A.persistedSize)===null||Y===void 0?void 0:Y.width)!==null&&ee!==void 0?ee:ne.width),this._persistedSize.store(new M.Dimension(X,z))}this._contentWidget.unlockPreference(),A=void 0}})),this._messageElement=M.append(this.element.domNode,M.$(".message")),this._listElement=M.append(this.element.domNode,M.$(".tree"));const B=T.createInstance(i.SuggestDetailsWidget,this.editor);B.onDidClose(this.toggleDetails,this,this._disposables),this._details=new i.SuggestDetailsOverlay(B,this.editor);const F=()=>this.element.domNode.classList.toggle("no-icons",!this.editor.getOption(101).showIcons);F();const D=T.createInstance(t.ItemRenderer,this.editor);this._disposables.add(D),this._disposables.add(D.onDidToggleDetails(()=>this.toggleDetails())),this._list=new d.List("SuggestWidget",this._listElement,{getHeight:W=>this.getLayoutInfo().itemHeight,getTemplateId:W=>"suggestion"},[D],{alwaysConsumeMouseWheel:!0,useShadows:!1,mouseSupport:!1,accessibilityProvider:{getRole:()=>"option",getAriaLabel:W=>{const x=typeof W.completion.label=="string"?W.completion.label:W.completion.label.name;if(W.isResolved&&this._isDetailsVisible()){const{documentation:K,detail:Y}=W.completion,ee=N.format("{0}{1}",Y||"",K?typeof K=="string"?K:K.value:"");return b.localize(7,null,x,ee)}else return x},getWidgetAriaLabel:()=>b.localize(8,null),getWidgetRole:()=>"listbox"}}),this._status=T.createInstance(n.SuggestWidgetStatus,this.element.domNode);const R=()=>this.element.domNode.classList.toggle("with-status-bar",this.editor.getOption(101).showStatusBar);R(),this._disposables.add(c.attachListStyler(this._list,E,{listInactiveFocusBackground:e.editorSuggestWidgetSelectedBackground,listInactiveFocusOutline:s.activeContrastBorder})),this._disposables.add(E.onDidColorThemeChange(W=>this._onThemeChange(W))),this._onThemeChange(E.getColorTheme()),this._disposables.add(this._list.onMouseDown(W=>this._onListMouseDownOrTap(W))),this._disposables.add(this._list.onTap(W=>this._onListMouseDownOrTap(W))),this._disposables.add(this._list.onDidChangeSelection(W=>this._onListSelection(W))),this._disposables.add(this._list.onDidChangeFocus(W=>this._onListFocus(W))),this._disposables.add(this.editor.onDidChangeCursorSelection(()=>this._onCursorSelectionChanged())),this._disposables.add(this.editor.onDidChangeConfiguration(W=>{W.hasChanged(101)&&(R(),F())})),this._ctxSuggestWidgetVisible=p.Context.Visible.bindTo(k),this._ctxSuggestWidgetDetailsVisible=p.Context.DetailsVisible.bindTo(k),this._ctxSuggestWidgetMultipleSuggestions=p.Context.MultipleSuggestions.bindTo(k),this._disposables.add(M.addStandardDisposableListener(this._details.widget.domNode,"keydown",W=>{this._onDetailsKeydown.fire(W)})),this._disposables.add(this.editor.onMouseDown(W=>this._onEditorMouseDown(W)))}dispose(){var L;this._details.widget.dispose(),this._details.dispose(),this._list.dispose(),this._status.dispose(),this._disposables.dispose(),(L=this._loadingTimeout)===null||L===void 0||L.dispose(),this._showTimeout.dispose(),this._contentWidget.dispose(),this.element.dispose()}_onEditorMouseDown(L){this._details.widget.domNode.contains(L.target.element)?this._details.widget.domNode.focus():this.element.domNode.contains(L.target.element)&&this.editor.focus()}_onCursorSelectionChanged(){this._state!==0&&this._contentWidget.layout()}_onListMouseDownOrTap(L){typeof L.element=="undefined"||typeof L.index=="undefined"||(L.browserEvent.preventDefault(),L.browserEvent.stopPropagation(),this._select(L.element,L.index))}_onListSelection(L){L.elements.length&&this._select(L.elements[0],L.indexes[0])}_select(L,I){const k=this._completionModel;k&&(this._onDidSelect.fire({item:L,index:I,model:k}),this.editor.focus())}_onThemeChange(L){const I=L.getColor(e.editorSuggestWidgetBackground);I&&(this.element.domNode.style.backgroundColor=I.toString(),this._messageElement.style.backgroundColor=I.toString(),this._details.widget.domNode.style.backgroundColor=I.toString());const k=L.getColor(e.editorSuggestWidgetBorder);k&&(this.element.domNode.style.borderColor=k.toString(),this._messageElement.style.borderColor=k.toString(),this._status.element.style.borderTopColor=k.toString(),this._details.widget.domNode.style.borderColor=k.toString(),this._detailsBorderColor=k.toString());const E=L.getColor(s.focusBorder);E&&(this._detailsFocusBorderColor=E.toString()),this._details.widget.borderWidth=L.type==="hc"?2:1}_onListFocus(L){var I;if(!this._ignoreFocusEvents){if(!L.elements.length){this._currentSuggestionDetails&&(this._currentSuggestionDetails.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=void 0),this.editor.setAriaOptions({activeDescendant:void 0});return}if(!!this._completionModel){const k=L.elements[0],E=L.indexes[0];k!==this._focusedItem&&((I=this._currentSuggestionDetails)===null||I===void 0||I.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=k,this._list.reveal(E),this._currentSuggestionDetails=u.createCancelablePromise(T=>Ie(this,void 0,void 0,function*(){const O=u.disposableTimeout(()=>{this._isDetailsVisible()&&this.showDetails(!0)},250);T.onCancellationRequested(()=>O.dispose());const A=yield k.resolve(T);return O.dispose(),A})),this._currentSuggestionDetails.then(()=>{E>=this._list.length||k!==this._list.element(E)||(this._ignoreFocusEvents=!0,this._list.splice(E,1,[k]),this._list.setFocus([E]),this._ignoreFocusEvents=!1,this._isDetailsVisible()?this.showDetails(!1):this.element.domNode.classList.remove("docs-side"),this.editor.setAriaOptions({activeDescendant:t.getAriaId(E)}))}).catch(S.onUnexpectedError)),this._onDidFocus.fire({item:k,index:E,model:this._completionModel})}}}_setState(L){if(this._state!==L)switch(this._state=L,this.element.domNode.classList.toggle("frozen",L===4),this.element.domNode.classList.remove("message"),L){case 0:M.hide(this._messageElement,this._listElement,this._status.element),this._details.hide(!0),this._status.hide(),this._contentWidget.hide(),this._ctxSuggestWidgetVisible.reset(),this._ctxSuggestWidgetMultipleSuggestions.reset(),this.element.domNode.classList.remove("visible"),this._list.splice(0,this._list.length),this._focusedItem=void 0,this._cappedHeight=void 0,this._explainMode=!1;break;case 1:this.element.domNode.classList.add("message"),this._messageElement.textContent=wt.LOADING_MESSAGE,M.hide(this._listElement,this._status.element),M.show(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0;break;case 2:this.element.domNode.classList.add("message"),this._messageElement.textContent=wt.NO_SUGGESTIONS_MESSAGE,M.hide(this._listElement,this._status.element),M.show(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0;break;case 3:M.hide(this._messageElement),M.show(this._listElement,this._status.element),this._show();break;case 4:M.hide(this._messageElement),M.show(this._listElement,this._status.element),this._show();break;case 5:M.hide(this._messageElement),M.show(this._listElement,this._status.element),this._details.show(),this._show();break}}_show(){this._status.show(),this._contentWidget.show(),this._layout(this._persistedSize.restore()),this._ctxSuggestWidgetVisible.set(!0),this._showTimeout.cancelAndSet(()=>{this.element.domNode.classList.add("visible"),this._onDidShow.fire(this)},100)}showTriggered(L,I){this._state===0&&(this._contentWidget.setPosition(this.editor.getPosition()),this._isAuto=!!L,this._isAuto||(this._loadingTimeout=u.disposableTimeout(()=>this._setState(1),I)))}showSuggestions(L,I,k,E){var T,O;if(this._contentWidget.setPosition(this.editor.getPosition()),(T=this._loadingTimeout)===null||T===void 0||T.dispose(),(O=this._currentSuggestionDetails)===null||O===void 0||O.cancel(),this._currentSuggestionDetails=void 0,this._completionModel!==L&&(this._completionModel=L),k&&this._state!==2&&this._state!==0){this._setState(4);return}const A=this._completionModel.items.length,B=A===0;if(this._ctxSuggestWidgetMultipleSuggestions.set(A>1),B){this._setState(E?0:2),this._completionModel=void 0;return}this._focusedItem=void 0,this._list.splice(0,this._list.length,this._completionModel.items),this._setState(k?4:3),this._list.reveal(I,0),this._list.setFocus([I]),this._layout(this.element.size),this._detailsBorderColor&&(this._details.widget.domNode.style.borderColor=this._detailsBorderColor)}selectNextPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageDown(),!0;case 1:return!this._isAuto;default:return this._list.focusNextPage(),!0}}selectNext(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusNext(1,!0),!0}}selectLast(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollBottom(),!0;case 1:return!this._isAuto;default:return this._list.focusLast(),!0}}selectPreviousPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageUp(),!0;case 1:return!this._isAuto;default:return this._list.focusPreviousPage(),!0}}selectPrevious(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusPrevious(1,!0),!1}}selectFirst(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollTop(),!0;case 1:return!this._isAuto;default:return this._list.focusFirst(),!0}}getFocusedItem(){if(this._state!==0&&this._state!==2&&this._state!==1&&this._completionModel)return{item:this._list.getFocusedElements()[0],index:this._list.getFocus()[0],model:this._completionModel}}toggleDetailsFocus(){this._state===5?(this._setState(3),this._detailsBorderColor&&(this._details.widget.domNode.style.borderColor=this._detailsBorderColor)):this._state===3&&this._isDetailsVisible()&&(this._setState(5),this._detailsFocusBorderColor&&(this._details.widget.domNode.style.borderColor=this._detailsFocusBorderColor))}toggleDetails(){this._isDetailsVisible()?(this._ctxSuggestWidgetDetailsVisible.set(!1),this._setDetailsVisible(!1),this._details.hide(),this.element.domNode.classList.remove("shows-details")):i.canExpandCompletionItem(this._list.getFocusedElements()[0])&&(this._state===3||this._state===5||this._state===4)&&(this._ctxSuggestWidgetDetailsVisible.set(!0),this._setDetailsVisible(!0),this.showDetails(!1))}showDetails(L){this._details.show(),L?this._details.widget.renderLoading():this._details.widget.renderItem(this._list.getFocusedElements()[0],this._explainMode),this._positionDetails(),this.editor.focus(),this.element.domNode.classList.add("shows-details")}toggleExplainMode(){this._list.getFocusedElements()[0]&&this._isDetailsVisible()&&(this._explainMode=!this._explainMode,this.showDetails(!1))}resetPersistedSize(){this._persistedSize.reset()}hideWidget(){var L;(L=this._loadingTimeout)===null||L===void 0||L.dispose(),this._setState(0),this._onDidHide.fire(this);const I=this._persistedSize.restore(),k=Math.ceil(this.getLayoutInfo().itemHeight*4.3);I&&I.heightF&&(B=F);const D=this._completionModel?this._completionModel.stats.pLabelLen*O.typicalHalfwidthCharacterWidth:B,R=O.statusBarHeight+this._list.contentHeight+O.borderHeight,W=O.itemHeight+O.statusBarHeight,x=M.getDomNodePagePosition(this.editor.getDomNode()),K=this.editor.getScrolledVisiblePosition(this.editor.getPosition()),Y=x.top+K.top+K.height,ee=Math.min(T.height-Y-O.verticalPadding,R),se=Math.min(x.top+K.top-O.verticalPadding,R);let ne=Math.min(Math.max(se,ee)+O.borderHeight,R);A===((I=this._cappedHeight)===null||I===void 0?void 0:I.capped)&&(A=this._cappedHeight.wanted),Ane&&(A=ne),A>ee?(this._contentWidget.setPreference(1),this.element.enableSashes(!0,!0,!1,!1),ne=se):(this._contentWidget.setPreference(2),this.element.enableSashes(!1,!0,!0,!1),ne=ee),this.element.preferredSize=new M.Dimension(D,O.defaultSize.height),this.element.maxSize=new M.Dimension(F,ne),this.element.minSize=new M.Dimension(220,W),this._cappedHeight=A===R?{wanted:(E=(k=this._cappedHeight)===null||k===void 0?void 0:k.wanted)!==null&&E!==void 0?E:L.height,capped:A}:void 0}this._resize(B,A)}}_resize(L,I){const{width:k,height:E}=this.element.maxSize;L=Math.min(k,L),I=Math.min(E,I);const{statusBarHeight:T}=this.getLayoutInfo();this._list.layout(I-T,L),this._listElement.style.height=`${I-T}px`,this.element.layout(I,L),this._contentWidget.layout(),this._positionDetails()}_positionDetails(){this._isDetailsVisible()&&this._details.placeAtAnchor(this.element.domNode)}getLayoutInfo(){const L=this.editor.getOption(38),I=m.clamp(this.editor.getOption(103)||L.lineHeight,8,1e3),k=!this.editor.getOption(101).showStatusBar||this._state===2||this._state===1?0:I,E=this._details.widget.borderWidth,T=2*E;return{itemHeight:I,statusBarHeight:k,borderWidth:E,borderHeight:T,typicalHalfwidthCharacterWidth:L.typicalHalfwidthCharacterWidth,verticalPadding:22,horizontalPadding:14,defaultSize:new M.Dimension(430,k+12*I+T)}}_isDetailsVisible(){return this._storageService.getBoolean("expandSuggestionDocs",0,!1)}_setDetailsVisible(L){this._storageService.store("expandSuggestionDocs",L,0,0)}};f.LOADING_MESSAGE=b.localize(5,null),f.NO_SUGGESTIONS_MESSAGE=b.localize(6,null),f=Me([_e(1,a.IStorageService),_e(2,g.IContextKeyService),_e(3,o.IThemeService),_e(4,r.IInstantiationService)],f),e.SuggestWidget=f;class v{constructor(L,I){this._widget=L,this._editor=I,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._preferenceLocked=!1,this._added=!1,this._hidden=!1}dispose(){this._added&&(this._added=!1,this._editor.removeContentWidget(this))}getId(){return"editor.widget.suggestWidget"}getDomNode(){return this._widget.element.domNode}show(){this._hidden=!1,this._added||(this._added=!0,this._editor.addContentWidget(this))}hide(){this._hidden||(this._hidden=!0,this.layout())}layout(){this._editor.layoutContentWidget(this)}getPosition(){return this._hidden||!this._position||!this._preference?null:{position:this._position,preference:[this._preference]}}beforeRender(){const{height:L,width:I}=this._widget.element.size,{borderWidth:k,horizontalPadding:E}=this._widget.getLayoutInfo();return new M.Dimension(I+2*k+E,L+2*k)}afterRender(L){this._widget._afterRender(L)}setPreference(L){this._preferenceLocked||(this._preference=L)}lockPreference(){this._preferenceLocked=!0}unlockPreference(){this._preferenceLocked=!1}setPosition(L){this._position=L}}e.SuggestContentWidget=v,o.registerThemingParticipant((y,L)=>{const I=y.getColor(e.editorSuggestWidgetHighlightForeground);I&&L.addRule(`.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-highlighted-label .highlight { color: ${I}; }`);const k=y.getColor(e.editorSuggestWidgetForeground);k&&L.addRule(`.monaco-editor .suggest-widget, .monaco-editor .suggest-details { color: ${k}; }`);const E=y.getColor(s.textLinkForeground);E&&L.addRule(`.monaco-editor .suggest-details a { color: ${E}; }`);const T=y.getColor(s.textCodeBlockBackground);T&&L.addRule(`.monaco-editor .suggest-details code { background-color: ${T}; }`)})}),define(Q[667],J([0,1,11,80,7,6]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getIconsStyleSheet=void 0;function S(){const C=new w.Emitter,d=N.getIconRegistry();return d.onDidChange(()=>C.fire()),{onDidChange:C.event,getCSS(){const g={},p=o=>{let s=o.defaults;for(;b.ThemeIcon.isThemeIcon(s);){const u=d.getIcon(s.id);if(!u)return;s=u.defaults}const a=s.fontId;if(a){const u=d.getIconFont(a);if(u)return g[a]=u,`.codicon-${o.id}:before { content: '${s.fontCharacter}'; font-family: ${M.asCSSPropertyValue(a)}; }`}return`.codicon-${o.id}:before { content: '${s.fontCharacter}'; }`},c=[];for(let o of d.getIcons()){const s=p(o);s&&c.push(s)}for(let o in g){const a=g[o].definition.src.map(u=>`${M.asCSSUrl(u.location)} format('${u.format}')`).join(", ");c.push(`@font-face { src: ${a}; font-family: ${M.asCSSPropertyValue(o)}; }`)}return c.join(` +`)}}}e.getIconsStyleSheet=S}),define(Q[668],J([0,1,7,29,6,18,381,606,33,22,11,2,97,667]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneThemeServiceImpl=void 0;const a="vs",u="vs-dark",r="hc-black",i=d.Registry.as(g.Extensions.ColorContribution),n=d.Registry.as(p.Extensions.ThemingContribution);class t{constructor(v,y){this.semanticHighlighting=!1,this.themeData=y;let L=y.base;v.length>0?(l(v)?this.id=v:this.id=L+" "+v,this.themeName=v):(this.id=L,this.themeName=L),this.colors=null,this.defaultColors=Object.create(null),this._tokenTheme=null}get base(){return this.themeData.base}notifyBaseUpdated(){this.themeData.inherit&&(this.colors=null,this._tokenTheme=null)}getColors(){if(!this.colors){const v=new Map;for(let y in this.themeData.colors)v.set(y,N.Color.fromHex(this.themeData.colors[y]));if(this.themeData.inherit){let y=h(this.themeData.base);for(let L in y.colors)v.has(L)||v.set(L,N.Color.fromHex(y.colors[L]))}this.colors=v}return this.colors}getColor(v,y){const L=this.getColors().get(v);if(L)return L;if(y!==!1)return this.getDefault(v)}getDefault(v){let y=this.defaultColors[v];return y||(y=i.resolveDefaultColor(v,this),this.defaultColors[v]=y,y)}defines(v){return Object.prototype.hasOwnProperty.call(this.getColors(),v)}get type(){switch(this.base){case a:return o.ColorScheme.LIGHT;case r:return o.ColorScheme.HIGH_CONTRAST;default:return o.ColorScheme.DARK}}get tokenTheme(){if(!this._tokenTheme){let v=[],y=[];if(this.themeData.inherit){let L=h(this.themeData.base);v=L.rules,L.encodedTokensColors&&(y=L.encodedTokensColors)}v=v.concat(this.themeData.rules),this.themeData.encodedTokensColors&&(y=this.themeData.encodedTokensColors),this._tokenTheme=S.TokenTheme.createFromRawTokenTheme(v,y)}return this._tokenTheme}getTokenStyleMetadata(v,y,L){const k=this.tokenTheme._match([v].concat(y).join(".")).metadata,E=w.TokenMetadata.getForeground(k),T=w.TokenMetadata.getFontStyle(k);return{foreground:E,italic:Boolean(T&1),bold:Boolean(T&2),underline:Boolean(T&4)}}}function l(f){return f===a||f===u||f===r}function h(f){switch(f){case a:return C.vs;case u:return C.vs_dark;case r:return C.hc_black}}function m(f){let v=h(f);return new t(f,v)}class _ extends c.Disposable{constructor(){super();this._onColorThemeChange=this._register(new M.Emitter),this.onDidColorThemeChange=this._onColorThemeChange.event,this._environment=Object.create(null),this._autoDetectHighContrast=!0,this._knownThemes=new Map,this._knownThemes.set(a,m(a)),this._knownThemes.set(u,m(u)),this._knownThemes.set(r,m(r));const v=s.getIconsStyleSheet();this._codiconCSS=v.getCSS(),this._themeCSS="",this._allCSS=`${this._codiconCSS} +${this._themeCSS}`,this._globalStyleElement=null,this._styleElements=[],this._colorMapOverride=null,this.setTheme(a),v.onDidChange(()=>{this._codiconCSS=v.getCSS(),this._updateCSS()}),window.matchMedia("(forced-colors: active)").addEventListener("change",()=>{this._updateActualTheme()})}registerEditorContainer(v){return b.isInShadowDOM(v)?this._registerShadowDomContainer(v):this._registerRegularEditorContainer()}_registerRegularEditorContainer(){return this._globalStyleElement||(this._globalStyleElement=b.createStyleSheet(),this._globalStyleElement.className="monaco-colors",this._globalStyleElement.textContent=this._allCSS,this._styleElements.push(this._globalStyleElement)),c.Disposable.None}_registerShadowDomContainer(v){const y=b.createStyleSheet(v);return y.className="monaco-colors",y.textContent=this._allCSS,this._styleElements.push(y),{dispose:()=>{for(let L=0;L{L.base===v&&L.notifyBaseUpdated()}),this._theme.themeName===v&&this.setTheme(v)}getColorTheme(){return this._theme}setColorMapOverride(v){this._colorMapOverride=v,this._updateThemeOrColorMap()}setTheme(v){let y;this._knownThemes.has(v)?y=this._knownThemes.get(v):y=this._knownThemes.get(a),this._desiredTheme=y,this._updateActualTheme()}_updateActualTheme(){const v=this._autoDetectHighContrast&&window.matchMedia("(forced-colors: active)").matches?this._knownThemes.get(r):this._desiredTheme;this._theme!==v&&(this._theme=v,this._updateThemeOrColorMap())}setAutoDetectHighContrast(v){this._autoDetectHighContrast=v,this._updateActualTheme()}_updateThemeOrColorMap(){let v=[],y={},L={addRule:k=>{y[k]||(v.push(k),y[k]=!0)}};n.getThemingParticipants().forEach(k=>k(this._theme,L,this._environment));const I=this._colorMapOverride||this._theme.tokenTheme.getColorMap();L.addRule(S.generateTokensCSSForColorMap(I)),this._themeCSS=v.join(` +`),this._updateCSS(),w.TokenizationRegistry.setColorMap(I),this._onColorThemeChange.fire(this._theme)}_updateCSS(){this._allCSS=`${this._codiconCSS} +${this._themeCSS}`,this._styleElements.forEach(v=>v.textContent=this._allCSS)}getFileIconTheme(){return{hasFileIcons:!1,hasFolderIcons:!1,hidesExplorerArrows:!1}}}e.StandaloneThemeServiceImpl=_}),define(Q[148],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UndoRedoSource=e.UndoRedoGroup=e.ResourceEditStackSnapshot=e.IUndoRedoService=void 0,e.IUndoRedoService=b.createDecorator("undoRedoService");class N{constructor(C,d){this.resource=C,this.elements=d}}e.ResourceEditStackSnapshot=N;class M{constructor(){this.id=M._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}}e.UndoRedoGroup=M,M._ID=0,M.None=new M;class w{constructor(){this.id=w._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}}e.UndoRedoSource=w,w._ID=0,w.None=new w}),define(Q[269],J([0,1,6,2,17,12,38,31,18,141,137,46,15,23,11,77,148,89,236,43,253,247]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModelSemanticColoring=e.isSemanticColoringEnabled=e.SEMANTIC_HIGHLIGHTING_SETTING_ID=e.ModelServiceImpl=void 0;function m(B){return B.toString()}function _(B){const F=new i.StringSHA1,D=B.createSnapshot();let R;for(;R=D.read();)F.update(R);return F.digest()}class f{constructor(F,D,R){this._modelEventListeners=new N.DisposableStore,this.model=F,this._languageSelection=null,this._languageSelectionListener=null,this._modelEventListeners.add(F.onWillDispose(()=>D(F))),this._modelEventListeners.add(F.onDidChangeLanguage(W=>R(F,W)))}_disposeLanguageSelection(){this._languageSelectionListener&&(this._languageSelectionListener.dispose(),this._languageSelectionListener=null),this._languageSelection&&(this._languageSelection.dispose(),this._languageSelection=null)}dispose(){this._modelEventListeners.dispose(),this._disposeLanguageSelection()}setLanguage(F){this._disposeLanguageSelection(),this._languageSelection=F,this._languageSelectionListener=this._languageSelection.onDidChange(()=>this.model.setMode(F.languageIdentifier)),this.model.setMode(F.languageIdentifier)}}const v=M.isLinux||M.isMacintosh?1:2;class y{constructor(F,D,R,W,x,K,Y,ee){this.uri=F,this.initialUndoRedoSnapshot=D,this.time=R,this.sharesUndoRedoStack=W,this.heapSize=x,this.sha1=K,this.versionId=Y,this.alternativeVersionId=ee}}function L(B){return B.scheme===t.Schemas.file||B.scheme===t.Schemas.vscodeRemote||B.scheme===t.Schemas.userData||B.scheme==="fake-fs"}let I=class st extends N.Disposable{constructor(F,D,R,W,x){super();this._configurationService=F,this._resourcePropertiesService=D,this._themeService=R,this._logService=W,this._undoRedoService=x,this._onModelAdded=this._register(new b.Emitter),this.onModelAdded=this._onModelAdded.event,this._onModelRemoved=this._register(new b.Emitter),this.onModelRemoved=this._onModelRemoved.event,this._onModelModeChanged=this._register(new b.Emitter),this.onModelModeChanged=this._onModelModeChanged.event,this._modelCreationOptionsByLanguageAndResource=Object.create(null),this._models={},this._disposedModels=new Map,this._disposedModelsHeapSize=0,this._semanticStyling=this._register(new T(this._themeService,this._logService)),this._register(this._configurationService.onDidChangeConfiguration(()=>this._updateModelOptions())),this._updateModelOptions(),this._register(new E(this,this._themeService,this._configurationService,this._semanticStyling))}static _readModelOptions(F,D){let R=S.EDITOR_MODEL_DEFAULTS.tabSize;if(F.editor&&typeof F.editor.tabSize!="undefined"){const le=parseInt(F.editor.tabSize,10);isNaN(le)||(R=le),R<1&&(R=1)}let W=R;if(F.editor&&typeof F.editor.indentSize!="undefined"&&F.editor.indentSize!=="tabSize"){const le=parseInt(F.editor.indentSize,10);isNaN(le)||(W=le),W<1&&(W=1)}let x=S.EDITOR_MODEL_DEFAULTS.insertSpaces;F.editor&&typeof F.editor.insertSpaces!="undefined"&&(x=F.editor.insertSpaces==="false"?!1:Boolean(F.editor.insertSpaces));let K=v;const Y=F.eol;Y===`\r +`?K=2:Y===` +`&&(K=1);let ee=S.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace;F.editor&&typeof F.editor.trimAutoWhitespace!="undefined"&&(ee=F.editor.trimAutoWhitespace==="false"?!1:Boolean(F.editor.trimAutoWhitespace));let se=S.EDITOR_MODEL_DEFAULTS.detectIndentation;F.editor&&typeof F.editor.detectIndentation!="undefined"&&(se=F.editor.detectIndentation==="false"?!1:Boolean(F.editor.detectIndentation));let ne=S.EDITOR_MODEL_DEFAULTS.largeFileOptimizations;return F.editor&&typeof F.editor.largeFileOptimizations!="undefined"&&(ne=F.editor.largeFileOptimizations==="false"?!1:Boolean(F.editor.largeFileOptimizations)),{isForSimpleWidget:D,tabSize:R,indentSize:W,insertSpaces:x,detectIndentation:se,defaultEOL:K,trimAutoWhitespace:ee,largeFileOptimizations:ne}}_getEOL(F,D){if(F)return this._resourcePropertiesService.getEOL(F,D);const R=this._configurationService.getValue("files.eol",{overrideIdentifier:D});return R&&R!=="auto"?R:M.OS===3||M.OS===2?` +`:`\r +`}_shouldRestoreUndoStack(){const F=this._configurationService.getValue("files.restoreUndoStack");return typeof F=="boolean"?F:!0}getCreationOptions(F,D,R){let W=this._modelCreationOptionsByLanguageAndResource[F+D];if(!W){const x=this._configurationService.getValue("editor",{overrideIdentifier:F,resource:D}),K=this._getEOL(D,F);W=st._readModelOptions({editor:x,eol:K},R),this._modelCreationOptionsByLanguageAndResource[F+D]=W}return W}_updateModelOptions(){const F=this._modelCreationOptionsByLanguageAndResource;this._modelCreationOptionsByLanguageAndResource=Object.create(null);const D=Object.keys(this._models);for(let R=0,W=D.length;RF){const D=[];for(this._disposedModels.forEach(R=>{R.sharesUndoRedoStack||D.push(R)}),D.sort((R,W)=>R.time-W.time);D.length>0&&this._disposedModelsHeapSize>F;){const R=D.shift();this._removeDisposedModel(R.uri),R.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(R.initialUndoRedoSnapshot)}}}_createModelData(F,D,R,W){const x=this.getCreationOptions(D.language,R,W),K=new C.TextModel(F,x,D,R,this._undoRedoService);if(R&&this._disposedModels.has(m(R))){const se=this._removeDisposedModel(R),ne=this._undoRedoService.getElements(R),le=_(K)===se.sha1;if(le||se.sharesUndoRedoStack){for(const X of ne.past)n.isEditStackElement(X)&&X.matchesResource(R)&&X.setModel(K);for(const X of ne.future)n.isEditStackElement(X)&&X.matchesResource(R)&&X.setModel(K);this._undoRedoService.setElementsValidFlag(R,!0,X=>n.isEditStackElement(X)&&X.matchesResource(R)),le&&(K._overwriteVersionId(se.versionId),K._overwriteAlternativeVersionId(se.alternativeVersionId),K._overwriteInitialUndoRedoSnapshot(se.initialUndoRedoSnapshot))}else se.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(se.initialUndoRedoSnapshot)}const Y=m(K.uri);if(this._models[Y])throw new Error("ModelService: Cannot add model because it already exists!");const ee=new f(K,se=>this._onWillDispose(se),(se,ne)=>this._onDidChangeLanguage(se,ne));return this._models[Y]=ee,ee}createModel(F,D,R,W=!1){let x;return D?(x=this._createModelData(F,D.languageIdentifier,R,W),this.setMode(x.model,D)):x=this._createModelData(F,g.PLAINTEXT_LANGUAGE_IDENTIFIER,R,W),this._onModelAdded.fire(x.model),x.model}setMode(F,D){if(!!D){const R=this._models[m(F.uri)];!R||R.setLanguage(D)}}getModels(){const F=[],D=Object.keys(this._models);for(let R=0,W=D.length;R0||ee.future.length>0){for(const se of ee.past)n.isEditStackElement(se)&&se.matchesResource(F.uri)&&(x=!0,K+=se.heapSize(F.uri),se.setModel(F.uri));for(const se of ee.future)n.isEditStackElement(se)&&se.matchesResource(F.uri)&&(x=!0,K+=se.heapSize(F.uri),se.setModel(F.uri))}}const Y=st.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK;if(x)if(!W&&K>Y){const ee=R.model.getInitialUndoRedoSnapshot();ee!==null&&this._undoRedoService.restoreSnapshot(ee)}else this._ensureDisposedModelsHeapSize(Y-K),this._undoRedoService.setElementsValidFlag(F.uri,!1,ee=>n.isEditStackElement(ee)&&ee.matchesResource(F.uri)),this._insertDisposedModel(new y(F.uri,R.model.getInitialUndoRedoSnapshot(),Date.now(),W,K,_(F),F.getVersionId(),F.getAlternativeVersionId()));else if(!W){const ee=R.model.getInitialUndoRedoSnapshot();ee!==null&&this._undoRedoService.restoreSnapshot(ee)}delete this._models[D],R.dispose(),delete this._modelCreationOptionsByLanguageAndResource[F.getLanguageIdentifier().language+F.uri],this._onModelRemoved.fire(F)}_onDidChangeLanguage(F,D){const R=D.oldLanguage,W=F.getLanguageIdentifier().language,x=this.getCreationOptions(R,F.uri,F.isForSimpleWidget),K=this.getCreationOptions(W,F.uri,F.isForSimpleWidget);st._setModelOptionsForModel(F,K,x),this._onModelModeChanged.fire({model:F,oldModeId:R})}};I.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK=20*1024*1024,I=Me([_e(0,c.IConfigurationService),_e(1,p.ITextResourcePropertiesService),_e(2,a.IThemeService),_e(3,u.ILogService),_e(4,r.IUndoRedoService)],I),e.ModelServiceImpl=I,e.SEMANTIC_HIGHLIGHTING_SETTING_ID="editor.semanticHighlighting";function k(B,F,D){var R;const W=(R=D.getValue(e.SEMANTIC_HIGHLIGHTING_SETTING_ID,{overrideIdentifier:B.getLanguageIdentifier().language,resource:B.uri}))===null||R===void 0?void 0:R.enabled;return typeof W=="boolean"?W:F.getColorTheme().semanticHighlighting}e.isSemanticColoringEnabled=k;class E extends N.Disposable{constructor(F,D,R,W){super();this._watchers=Object.create(null),this._semanticStyling=W;const x=ee=>{this._watchers[ee.uri.toString()]=new A(ee,D,this._semanticStyling)},K=(ee,se)=>{se.dispose(),delete this._watchers[ee.uri.toString()]},Y=()=>{for(let ee of F.getModels()){const se=this._watchers[ee.uri.toString()];k(ee,D,R)?se||x(ee):se&&K(ee,se)}};this._register(F.onModelAdded(ee=>{k(ee,D,R)&&x(ee)})),this._register(F.onModelRemoved(ee=>{const se=this._watchers[ee.uri.toString()];se&&K(ee,se)})),this._register(R.onDidChangeConfiguration(ee=>{ee.affectsConfiguration(e.SEMANTIC_HIGHLIGHTING_SETTING_ID)&&Y()})),this._register(D.onDidColorThemeChange(Y))}}class T extends N.Disposable{constructor(F,D){super();this._themeService=F,this._logService=D,this._caches=new WeakMap,this._register(this._themeService.onDidColorThemeChange(()=>{this._caches=new WeakMap}))}get(F){return this._caches.has(F)||this._caches.set(F,new l.SemanticTokensProviderStyling(F.getLegend(),this._themeService,this._logService)),this._caches.get(F)}}class O{constructor(F,D,R){this._provider=F,this.resultId=D,this.data=R}dispose(){this._provider.releaseDocumentSemanticTokens(this.resultId)}}class A extends N.Disposable{constructor(F,D,R){super();this._isDisposed=!1,this._model=F,this._semanticStyling=R,this._fetchDocumentSemanticTokens=this._register(new o.RunOnceScheduler(()=>this._fetchDocumentSemanticTokensNow(),A.FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY)),this._currentDocumentResponse=null,this._currentDocumentRequestCancellationTokenSource=null,this._documentProvidersChangeListeners=[],this._register(this._model.onDidChangeContent(()=>{this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule()}));const W=()=>{N.dispose(this._documentProvidersChangeListeners),this._documentProvidersChangeListeners=[];for(const x of d.DocumentSemanticTokensProviderRegistry.all(F))typeof x.onDidChange=="function"&&this._documentProvidersChangeListeners.push(x.onDidChange(()=>this._fetchDocumentSemanticTokens.schedule(0)))};W(),this._register(d.DocumentSemanticTokensProviderRegistry.onDidChange(()=>{W(),this._fetchDocumentSemanticTokens.schedule()})),this._register(D.onDidColorThemeChange(x=>{this._setDocumentSemanticTokens(null,null,null,[]),this._fetchDocumentSemanticTokens.schedule()})),this._fetchDocumentSemanticTokens.schedule(0)}dispose(){this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._currentDocumentRequestCancellationTokenSource&&(this._currentDocumentRequestCancellationTokenSource.cancel(),this._currentDocumentRequestCancellationTokenSource=null),this._setDocumentSemanticTokens(null,null,null,[]),this._isDisposed=!0,super.dispose()}_fetchDocumentSemanticTokensNow(){if(!this._currentDocumentRequestCancellationTokenSource){const F=new s.CancellationTokenSource,D=this._currentDocumentResponse&&this._currentDocumentResponse.resultId||null,R=h.getDocumentSemanticTokens(this._model,D,F.token);if(!R){this._currentDocumentResponse&&this._model.setSemanticTokens(null,!1);return}const{provider:W,request:x}=R;this._currentDocumentRequestCancellationTokenSource=F;const K=[],Y=this._model.onDidChangeContent(se=>{K.push(se)}),ee=this._semanticStyling.get(W);x.then(se=>{this._currentDocumentRequestCancellationTokenSource=null,Y.dispose(),this._setDocumentSemanticTokens(W,se||null,ee,K)},se=>{se&&(w.isPromiseCanceledError(se)||typeof se.message=="string"&&se.message.indexOf("busy")!==-1)||w.onUnexpectedError(se),this._currentDocumentRequestCancellationTokenSource=null,Y.dispose(),K.length>0&&(this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule())})}}static _copy(F,D,R,W,x){for(let K=0;K{W.length>0&&!this._fetchDocumentSemanticTokens.isScheduled()&&this._fetchDocumentSemanticTokens.schedule()};if(this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._isDisposed){F&&D&&F.releaseDocumentSemanticTokens(D.resultId);return}if(!F||!R){this._model.setSemanticTokens(null,!1);return}if(!D){this._model.setSemanticTokens(null,!0),K();return}if(h.isSemanticTokensEdits(D)){if(!x){this._model.setSemanticTokens(null,!0);return}if(D.edits.length===0)D={resultId:D.resultId,data:x.data};else{let Y=0;for(const X of D.edits)Y+=(X.data?X.data.length:0)-X.deleteCount;const ee=x.data,se=new Uint32Array(ee.length+Y);let ne=ee.length,le=se.length;for(let X=D.edits.length-1;X>=0;X--){const z=D.edits[X],P=ne-(z.start+z.deleteCount);P>0&&(A._copy(ee,ne-P,se,le-P,P),le-=P),z.data&&(A._copy(z.data,0,se,le-z.data.length,z.data.length),le-=z.data.length),ne=z.start}ne>0&&A._copy(ee,0,se,0,ne),D={resultId:D.resultId,data:se}}}if(h.isSemanticTokens(D)){this._currentDocumentResponse=new O(F,D.resultId,D.data);const Y=l.toMultilineTokens2(D,R,this._model.getLanguageIdentifier());if(W.length>0)for(const ee of W)for(const se of Y)for(const ne of ee.changes)se.applyEdit(ne.range,ne.text);this._model.setSemanticTokens(Y,!0)}else this._model.setSemanticTokens(null,!0);K()}}e.ModelSemanticColoring=A,A.FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY=300}),define(Q[669],J([0,1,7,29,6,2,43,44,144,3,31,67,601,485,9,115,147,22,11,118,132,210,148,37,345]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferenceWidget=e.LayoutData=void 0;class f{constructor(k,E){this._editor=k,this._model=E,this._decorations=new Map,this._decorationIgnoreSet=new Set,this._callOnDispose=new w.DisposableStore,this._callOnModelChange=new w.DisposableStore,this._callOnDispose.add(this._editor.onDidChangeModel(()=>this._onModelChanged())),this._onModelChanged()}dispose(){this._callOnModelChange.dispose(),this._callOnDispose.dispose(),this.removeDecorations()}_onModelChanged(){this._callOnModelChange.clear();const k=this._editor.getModel();if(!!k){for(let E of this._model.references)if(E.uri.toString()===k.uri.toString()){this._addDecorations(E.parent);return}}}_addDecorations(k){if(!!this._editor.hasModel()){this._callOnModelChange.add(this._editor.getModel().onDidChangeDecorations(()=>this._onDecorationChanged()));const E=[],T=[];for(let A=0,B=k.children.length;A{A.equals(9)&&(this._keybindingService.dispatchEvent(A,A.target),A.stopPropagation())},!0)),this._tree=this._instantiationService.createInstance(y,"ReferencesWidget",this._treeContainer,new o.Delegate,[this._instantiationService.createInstance(o.FileReferencesRenderer),this._instantiationService.createInstance(o.OneReferenceRenderer)],this._instantiationService.createInstance(o.DataSource),T),this._splitView.addView({onDidChange:M.Event.None,element:this._previewContainer,minimumSize:200,maximumSize:Number.MAX_VALUE,layout:A=>{this._preview.layout({height:this._dim.height,width:A})}},h.Sizing.Distribute),this._splitView.addView({onDidChange:M.Event.None,element:this._treeContainer,minimumSize:100,maximumSize:Number.MAX_VALUE,layout:A=>{this._treeContainer.style.height=`${this._dim.height}px`,this._treeContainer.style.width=`${A}px`,this._tree.layout(this._dim.height,A)}},h.Sizing.Distribute),this._disposables.add(this._splitView.onDidSashChange(()=>{this._dim.width&&(this.layoutData.ratio=this._splitView.getViewSize(0)/this._dim.width)},void 0));let O=(A,B)=>{A instanceof l.OneReference&&(B==="show"&&this._revealReference(A,!1),this._onDidSelectReference.fire({element:A,kind:B,source:"tree"}))};this._tree.onDidOpen(A=>{A.sideBySide?O(A.element,"side"):A.editorOptions.pinned?O(A.element,"goto"):O(A.element,"show")}),b.hide(this._treeContainer)}_onWidth(k){this._dim&&this._doLayoutBody(this._dim.height,k)}_doLayoutBody(k,E){super._doLayoutBody(k,E),this._dim=new b.Dimension(E,k),this.layoutData.heightInLines=this._viewZone?this._viewZone.heightInLines:this.layoutData.heightInLines,this._splitView.layout(E),this._splitView.resizeView(0,E*this.layoutData.ratio)}setSelection(k){return this._revealReference(k,!0).then(()=>{!this._model||(this._tree.setSelection([k]),this._tree.setFocus([k]))})}setModel(k){return this._disposeOnNewModel.clear(),this._model=k,this._model?this._onNewModel():Promise.resolve()}_onNewModel(){return this._model?this._model.isEmpty?(this.setTitle(""),this._messageContainer.innerText=s.localize(1,null),b.show(this._messageContainer),Promise.resolve(void 0)):(b.hide(this._messageContainer),this._decorationsManager=new f(this._preview,this._model),this._disposeOnNewModel.add(this._decorationsManager),this._disposeOnNewModel.add(this._model.onDidChangeReferenceRange(k=>this._tree.rerender(k))),this._disposeOnNewModel.add(this._preview.onMouseDown(k=>{const{event:E,target:T}=k;if(E.detail===2){const O=this._getFocusedReference();!O||this._onDidSelectReference.fire({element:{uri:O.uri,range:T.range},kind:E.ctrlKey||E.metaKey||E.altKey?"side":"open",source:"editor"})}})),this.container.classList.add("results-loaded"),b.show(this._treeContainer),b.show(this._previewContainer),this._splitView.layout(this._dim.width),this.focusOnReferenceTree(),this._tree.setInput(this._model.groups.length===1?this._model.groups[0]:this._model)):Promise.resolve(void 0)}_getFocusedReference(){const[k]=this._tree.getFocus();if(k instanceof l.OneReference)return k;if(k instanceof l.FileReferences&&k.children.length>0)return k.children[0]}revealReference(k){return Ie(this,void 0,void 0,function*(){yield this._revealReference(k,!1),this._onDidSelectReference.fire({element:k,kind:"goto",source:"tree"})})}_revealReference(k,E){return Ie(this,void 0,void 0,function*(){if(this._revealedReference!==k){this._revealedReference=k,k.uri.scheme!==S.Schemas.inMemory?this.setTitle(C.basenameOrAuthority(k.uri),this._uriLabel.getUriLabel(C.dirname(k.uri))):this.setTitle(s.localize(2,null));const T=this._textModelResolverService.createModelReference(k.uri);this._tree.getInput()===k.parent?this._tree.reveal(k):(E&&this._tree.reveal(k.parent),yield this._tree.expand(k.parent),this._tree.reveal(k));const O=yield T;if(!this._model){O.dispose();return}w.dispose(this._previewModelReference);const A=O.object;if(A){const B=this._preview.getModel()===A.textEditorModel?0:1,F=g.Range.lift(k.range).collapseToStart();this._previewModelReference=O,this._preview.setModel(A.textEditorModel),this._preview.setSelection(F),this._preview.revealRangeInCenter(F,B)}else this._preview.setModel(this._previewNotAvailableMessage),O.dispose()}})}};L=Me([_e(3,n.IThemeService),_e(4,c.ITextModelService),_e(5,a.IInstantiationService),_e(6,t.IPeekViewService),_e(7,u.ILabelService),_e(8,m.IUndoRedoService),_e(9,_.IKeybindingService)],L),e.ReferenceWidget=L,n.registerThemingParticipant((I,k)=>{const E=I.getColor(t.peekViewResultsMatchHighlight);E&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight { background-color: ${E}; }`);const T=I.getColor(t.peekViewEditorMatchHighlight);T&&k.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { background-color: ${T}; }`);const O=I.getColor(t.peekViewEditorMatchHighlightBorder);O&&k.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { border: 2px solid ${O}; box-sizing: border-box; }`);const A=I.getColor(i.activeContrastBorder);A&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight { border: 1px dotted ${A}; box-sizing: border-box; }`);const B=I.getColor(t.peekViewResultsBackground);B&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree { background-color: ${B}; }`);const F=I.getColor(t.peekViewResultsMatchForeground);F&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree { color: ${F}; }`);const D=I.getColor(t.peekViewResultsFileForeground);D&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .reference-file { color: ${D}; }`);const R=I.getColor(t.peekViewResultsSelectionBackground);R&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { background-color: ${R}; }`);const W=I.getColor(t.peekViewResultsSelectionForeground);W&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { color: ${W} !important; }`);const x=I.getColor(t.peekViewEditorBackground);x&&k.addRule(`.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background,.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input { background-color: ${x};}`);const K=I.getColor(t.peekViewEditorGutterBackground);K&&k.addRule(`.monaco-editor .reference-zone-widget .preview .monaco-editor .margin { background-color: ${K};}`)})}),define(Q[270],J([0,1,483,12,2,28,9,16,46,79,132,669,3,14,32,15,118,147,86,39,26]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferencesController=e.ctxReferenceSearchVisible=void 0,e.ctxReferenceSearchVisible=new C.RawContextKey("referenceSearchVisible",!1);let h=class yt{constructor(f,v,y,L,I,k,E,T){this._defaultTreeKeyboardSupport=f,this._editor=v,this._editorService=L,this._notificationService=I,this._instantiationService=k,this._storageService=E,this._configurationService=T,this._disposables=new M.DisposableStore,this._requestIdPool=0,this._ignoreModelChangeEvent=!1,this._referenceSearchVisible=e.ctxReferenceSearchVisible.bindTo(y)}static get(f){return f.getContribution(yt.ID)}dispose(){var f,v;this._referenceSearchVisible.reset(),this._disposables.dispose(),(f=this._widget)===null||f===void 0||f.dispose(),(v=this._model)===null||v===void 0||v.dispose(),this._widget=void 0,this._model=void 0}toggleWidget(f,v,y){let L;if(this._widget&&(L=this._widget.position),this.closeWidget(),!(!!L&&f.containsPosition(L))){this._peekMode=y,this._referenceSearchVisible.set(!0),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>{this.closeWidget()})),this._disposables.add(this._editor.onDidChangeModel(()=>{this._ignoreModelChangeEvent||this.closeWidget()}));const I="peekViewLayout",k=c.LayoutData.fromJSON(this._storageService.get(I,0,"{}"));this._widget=this._instantiationService.createInstance(c.ReferenceWidget,this._editor,this._defaultTreeKeyboardSupport,k),this._widget.setTitle(b.localize(0,null)),this._widget.show(f),this._disposables.add(this._widget.onDidClose(()=>{v.cancel(),this._widget&&(this._storageService.store(I,JSON.stringify(this._widget.layoutData),0,1),this._widget=void 0),this.closeWidget()})),this._disposables.add(this._widget.onDidSelectReference(T=>{let{element:O,kind:A}=T;if(!!O)switch(A){case"open":(T.source!=="editor"||!this._configurationService.getValue("editor.stablePeek"))&&this.openReference(O,!1,!1);break;case"side":this.openReference(O,!0,!1);break;case"goto":y?this._gotoReference(O):this.openReference(O,!1,!0);break}}));const E=++this._requestIdPool;v.then(T=>{var O;if(E!==this._requestIdPool||!this._widget){T.dispose();return}return(O=this._model)===null||O===void 0||O.dispose(),this._model=T,this._widget.setModel(this._model).then(()=>{if(this._widget&&this._model&&this._editor.hasModel()){this._model.isEmpty?this._widget.setMetaTitle(""):this._widget.setMetaTitle(b.localize(1,null,this._model.title,this._model.references.length));let A=this._editor.getModel().uri,B=new s.Position(f.startLineNumber,f.startColumn),F=this._model.nearestReference(A,B);if(F)return this._widget.setSelection(F).then(()=>{this._widget&&this._editor.getOption(71)==="editor"&&this._widget.focusOnPreviewEditor()})}})},T=>{this._notificationService.error(T)})}}changeFocusBetweenPreviewAndReferences(){!this._widget||(this._widget.isPreviewEditorFocused()?this._widget.focusOnReferenceTree():this._widget.focusOnPreviewEditor())}goToNextOrPreviousReference(f){return Ie(this,void 0,void 0,function*(){if(!(!this._editor.hasModel()||!this._model||!this._widget)){const v=this._widget.position;if(!!v){const y=this._model.nearestReference(this._editor.getModel().uri,v);if(!!y){const L=this._model.nextOrPreviousReference(y,f),I=this._editor.hasTextFocus(),k=this._widget.isPreviewEditorFocused();yield this._widget.setSelection(L),yield this._gotoReference(L),I?this._editor.focus():this._widget&&k&&this._widget.focusOnPreviewEditor()}}}})}revealReference(f){return Ie(this,void 0,void 0,function*(){!this._editor.hasModel()||!this._model||!this._widget||(yield this._widget.revealReference(f))})}closeWidget(f=!0){var v,y;(v=this._widget)===null||v===void 0||v.dispose(),(y=this._model)===null||y===void 0||y.dispose(),this._referenceSearchVisible.reset(),this._disposables.clear(),this._widget=void 0,this._model=void 0,f&&this._editor.focus(),this._requestIdPool+=1}_gotoReference(f){this._widget&&this._widget.hide(),this._ignoreModelChangeEvent=!0;const v=o.Range.lift(f.range).collapseToStart();return this._editorService.openCodeEditor({resource:f.uri,options:{selection:v}},this._editor).then(y=>{var L;if(this._ignoreModelChangeEvent=!1,!y||!this._widget){this.closeWidget();return}if(this._editor===y)this._widget.show(v),this._widget.focusOnReferenceTree();else{const I=yt.get(y),k=this._model.clone();this.closeWidget(),y.focus(),I.toggleWidget(v,u.createCancelablePromise(E=>Promise.resolve(k)),(L=this._peekMode)!==null&&L!==void 0?L:!1)}},y=>{this._ignoreModelChangeEvent=!1,N.onUnexpectedError(y)})}openReference(f,v,y){v||this.closeWidget();const{uri:L,range:I}=f;this._editorService.openCodeEditor({resource:L,options:{selection:I,pinned:y}},this._editor,v)}};h.ID="editor.contrib.referencesController",h=Me([_e(2,C.IContextKeyService),_e(3,w.ICodeEditorService),_e(4,a.INotificationService),_e(5,S.IInstantiationService),_e(6,g.IStorageService),_e(7,d.IConfigurationService)],h),e.ReferencesController=h;function m(_,f){const v=r.getOuterEditor(_);if(!!v){let y=h.get(v);y&&f(y)}}n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"togglePeekWidgetFocus",weight:100,primary:t.KeyChord(2048|41,60),when:C.ContextKeyExpr.or(e.ctxReferenceSearchVisible,r.PeekContext.inPeekEditor),handler(_){m(_,f=>{f.changeFocusBetweenPreviewAndReferences()})}}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"goToNextReference",weight:100-10,primary:62,secondary:[70],when:C.ContextKeyExpr.or(e.ctxReferenceSearchVisible,r.PeekContext.inPeekEditor),handler(_){m(_,f=>{f.goToNextOrPreviousReference(!0)})}}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"goToPreviousReference",weight:100-10,primary:1024|62,secondary:[1024|70],when:C.ContextKeyExpr.or(e.ctxReferenceSearchVisible,r.PeekContext.inPeekEditor),handler(_){m(_,f=>{f.goToNextOrPreviousReference(!1)})}}),l.CommandsRegistry.registerCommandAlias("goToNextReferenceFromEmbeddedEditor","goToNextReference"),l.CommandsRegistry.registerCommandAlias("goToPreviousReferenceFromEmbeddedEditor","goToPreviousReference"),l.CommandsRegistry.registerCommandAlias("closeReferenceSearchEditor","closeReferenceSearch"),l.CommandsRegistry.registerCommand("closeReferenceSearch",_=>m(_,f=>f.closeWidget())),n.KeybindingsRegistry.registerKeybindingRule({id:"closeReferenceSearch",weight:100-101,primary:9,secondary:[1024|9],when:C.ContextKeyExpr.and(r.PeekContext.inPeekEditor,C.ContextKeyExpr.not("config.editor.stablePeek"))}),n.KeybindingsRegistry.registerKeybindingRule({id:"closeReferenceSearch",weight:200+50,primary:9,secondary:[1024|9],when:C.ContextKeyExpr.and(e.ctxReferenceSearchVisible,C.ContextKeyExpr.not("config.editor.stablePeek"))}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"revealReference",weight:200,primary:3,mac:{primary:3,secondary:[2048|18]},when:C.ContextKeyExpr.and(e.ctxReferenceSearchVisible,i.WorkbenchListFocusContextKey),handler(_){var f;const y=(f=_.get(i.IListService).lastFocusedList)===null||f===void 0?void 0:f.getFocus();Array.isArray(y)&&y[0]instanceof p.OneReference&&m(_,L=>L.revealReference(y[0]))}}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"openReferenceToSide",weight:100,primary:2048|3,mac:{primary:256|3},when:C.ContextKeyExpr.and(e.ctxReferenceSearchVisible,i.WorkbenchListFocusContextKey),handler(_){var f;const y=(f=_.get(i.IListService).lastFocusedList)===null||f===void 0?void 0:f.getFocus();Array.isArray(y)&&y[0]instanceof p.OneReference&&m(_,L=>L.openReference(y[0],!0,!0))}}),l.CommandsRegistry.registerCommand("openReference",_=>{var f;const y=(f=_.get(i.IListService).lastFocusedList)===null||f===void 0?void 0:f.getFocus();Array.isArray(y)&&y[0]instanceof p.OneReference&&m(_,L=>L.openReference(y[0],!1,!0))})}),define(Q[271],J([0,1,47,15,39,17,108,13,28,14,3,25,18,146,118,270,132,481,34,16,32,59,262,26,70,625,35,24,9,20,144]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E){"use strict";var T,O,A,B,F,D,R,W;Object.defineProperty(e,"__esModule",{value:!0}),e.DefinitionAction=void 0,n.MenuRegistry.appendMenuItem(n.MenuId.EditorContext,{submenu:n.MenuId.EditorContextPeek,title:i.localize(0,null),group:"navigation",order:100});class x extends C.EditorAction{constructor(P,V){super(V);this._configuration=P}run(P,V){if(!V.hasModel())return Promise.resolve(void 0);const U=P.get(l.INotificationService),H=P.get(d.ICodeEditorService),$=P.get(h.IEditorProgressService),ie=P.get(v.ISymbolNavigationService),oe=V.getModel(),ae=V.getPosition(),G=new f.EditorStateCancellationTokenSource(V,1|4),j=N.raceCancellation(this._getLocationModel(oe,ae,G.token),G.token).then(te=>Ie(this,void 0,void 0,function*(){if(!(!te||G.token.isCancellationRequested)){b.alert(te.ariaMessage);let Z;if(te.referenceAt(oe.uri,ae)){const he=this._getAlternativeCommand(V);he!==this.id&&(Z=V.getAction(he))}const ue=te.references.length;if(ue===0){if(!this._configuration.muteMessage){const he=oe.getWordAtPosition(ae);s.MessageController.get(V).showMessage(this._getNoResultFoundMessage(he),ae)}}else if(ue===1&&Z)Z.run();else return this._onResult(H,ie,V,te)}}),te=>{U.error(te)}).finally(()=>{G.dispose()});return $.showWhile(j,250),j}_onResult(P,V,U,H){return Ie(this,void 0,void 0,function*(){const $=this._getGoToPreference(U);if(!(U instanceof E.EmbeddedCodeEditorWidget)&&(this._configuration.openInPeek||$==="peek"&&H.references.length>1))this._openInPeek(U,H);else{const ie=H.firstReference(),oe=H.references.length>1&&$==="gotoAndPeek",ae=yield this._openReference(U,P,ie,this._configuration.openToSide,!oe);oe&&ae?this._openInPeek(ae,H):H.dispose(),$==="goto"&&V.put(ie)}})}_openReference(P,V,U,H,$){return Ie(this,void 0,void 0,function*(){let ie;if(o.isLocationLink(U)&&(ie=U.targetSelectionRange),ie||(ie=U.range),!!ie){const oe=yield V.openCodeEditor({resource:U.uri,options:{selection:p.Range.collapseToStart(ie),selectionRevealType:3}},P,H);if(!!oe){if($){const ae=oe.getModel(),G=oe.deltaDecorations([],[{range:ie,options:{className:"symbolHighlight"}}]);setTimeout(()=>{oe.getModel()===ae&&oe.deltaDecorations(G,[])},350)}return oe}}})}_openInPeek(P,V){let U=u.ReferencesController.get(P);U&&P.hasModel()?U.toggleWidget(P.getSelection(),N.createCancelablePromise(H=>Promise.resolve(V)),this._configuration.openInPeek):V.dispose()}}class K extends x{_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getDefinitionsAtPosition(P,V,U),i.localize(1,null))})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(2,null,P.word):i.localize(3,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeDefinitionCommand}_getGoToPreference(P){return P.getOption(45).multipleDefinitions}}e.DefinitionAction=K;const Y=w.isWeb&&!y.isStandalone?2048|70:70;C.registerEditorAction((T=class Lt extends K{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Lt.id,label:i.localize(4,null),alias:"Go to Definition",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDefinitionProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:Y,weight:100},contextMenuOpts:{group:"navigation",order:1.1},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:2,title:i.localize(5,null)}});_.CommandsRegistry.registerCommandAlias("editor.action.goToDeclaration",Lt.id)}},T.id="editor.action.revealDefinition",T)),C.registerEditorAction((O=class Et extends K{constructor(){super({openToSide:!0,openInPeek:!1,muteMessage:!1},{id:Et.id,label:i.localize(6,null),alias:"Open Definition to the Side",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDefinitionProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:M.KeyChord(2048|41,Y),weight:100}});_.CommandsRegistry.registerCommandAlias("editor.action.openDeclarationToTheSide",Et.id)}},O.id="editor.action.revealDefinitionAside",O)),C.registerEditorAction((A=class Dt extends K{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:Dt.id,label:i.localize(7,null),alias:"Peek Definition",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDefinitionProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:512|70,linux:{primary:2048|1024|68},weight:100},contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:2}});_.CommandsRegistry.registerCommandAlias("editor.action.previewDeclaration",Dt.id)}},A.id="editor.action.peekDefinition",A));class ee extends x{_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getDeclarationsAtPosition(P,V,U),i.localize(8,null))})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(9,null,P.word):i.localize(10,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeDeclarationCommand}_getGoToPreference(P){return P.getOption(45).multipleDeclarations}}C.registerEditorAction((B=class Yt extends ee{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Yt.id,label:i.localize(11,null),alias:"Go to Declaration",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDeclarationProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{group:"navigation",order:1.3},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:3,title:i.localize(12,null)}})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(13,null,P.word):i.localize(14,null)}},B.id="editor.action.revealDeclaration",B)),C.registerEditorAction(class extends ee{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:"editor.action.peekDeclaration",label:i.localize(15,null),alias:"Peek Declaration",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDeclarationProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:3}})}});class se extends x{_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getTypeDefinitionsAtPosition(P,V,U),i.localize(16,null))})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(17,null,P.word):i.localize(18,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeTypeDefinitionCommand}_getGoToPreference(P){return P.getOption(45).multipleTypeDefinitions}}C.registerEditorAction((F=class Zt extends se{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Zt.ID,label:i.localize(19,null),alias:"Go to Type Definition",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasTypeDefinitionProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:0,weight:100},contextMenuOpts:{group:"navigation",order:1.4},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:3,title:i.localize(20,null)}})}},F.ID="editor.action.goToTypeDefinition",F)),C.registerEditorAction((D=class Xt extends se{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:Xt.ID,label:i.localize(21,null),alias:"Peek Type Definition",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasTypeDefinitionProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:4}})}},D.ID="editor.action.peekTypeDefinition",D));class ne extends x{_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getImplementationsAtPosition(P,V,U),i.localize(22,null))})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(23,null,P.word):i.localize(24,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeImplementationCommand}_getGoToPreference(P){return P.getOption(45).multipleImplementations}}C.registerEditorAction((R=class Qt extends ne{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Qt.ID,label:i.localize(25,null),alias:"Go to Implementations",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasImplementationProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:2048|70,weight:100},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:4,title:i.localize(26,null)},contextMenuOpts:{group:"navigation",order:1.45}})}},R.ID="editor.action.goToImplementation",R)),C.registerEditorAction((W=class Jt extends ne{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:Jt.ID,label:i.localize(27,null),alias:"Peek Implementations",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasImplementationProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:2048|1024|70,weight:100},contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:5}})}},W.ID="editor.action.peekImplementation",W));class le extends x{_getNoResultFoundMessage(P){return P?i.localize(28,null,P.word):i.localize(29,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeReferenceCommand}_getGoToPreference(P){return P.getOption(45).multipleReferences}}C.registerEditorAction(class extends le{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:"editor.action.goToReferences",label:i.localize(30,null),alias:"Go to References",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasReferenceProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:1024|70,weight:100},contextMenuOpts:{group:"navigation",order:1.45},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:5,title:i.localize(31,null)}})}_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getReferencesAtPosition(P,V,!0,U),i.localize(32,null))})}}),C.registerEditorAction(class extends le{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:"editor.action.referenceSearch.trigger",label:i.localize(33,null),alias:"Peek References",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasReferenceProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:6}})}_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getReferencesAtPosition(P,V,!1,U),i.localize(34,null))})}});class X extends x{constructor(P,V,U){super(P,{id:"editor.action.goToLocation",label:i.localize(35,null),alias:"Go To Any Symbol",precondition:t.ContextKeyExpr.and(a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated())});this._references=V,this._gotoMultipleBehaviour=U}_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(this._references,i.localize(36,null))})}_getNoResultFoundMessage(P){return P&&i.localize(37,null,P.word)||""}_getGoToPreference(P){var V;return(V=this._gotoMultipleBehaviour)!==null&&V!==void 0?V:P.getOption(45).multipleReferences}_getAlternativeCommand(){return""}}_.CommandsRegistry.registerCommand({id:"editor.action.goToLocations",description:{description:"Go to locations from a position in a file",args:[{name:"uri",description:"The text document in which to start",constraint:L.URI},{name:"position",description:"The position at which to start",constraint:g.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array},{name:"multiple",description:"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto"},{name:"noResultsMessage",description:"Human readable message that shows when locations is empty."}]},handler:(z,P,V,U,H,$,ie)=>Ie(void 0,void 0,void 0,function*(){k.assertType(L.URI.isUri(P)),k.assertType(g.Position.isIPosition(V)),k.assertType(Array.isArray(U)),k.assertType(typeof H=="undefined"||typeof H=="string"),k.assertType(typeof ie=="undefined"||typeof ie=="boolean");const oe=z.get(d.ICodeEditorService),ae=yield oe.openCodeEditor({resource:P},oe.getFocusedCodeEditor());if(S.isCodeEditor(ae))return ae.setPosition(V),ae.revealPositionInCenterIfOutsideViewport(V,0),ae.invokeWithinContext(G=>{const j=new class extends X{_getNoResultFoundMessage(te){return $||super._getNoResultFoundMessage(te)}}({muteMessage:!Boolean($),openInPeek:Boolean(ie),openToSide:!1},U,H);G.get(I.IInstantiationService).invokeFunction(j.run.bind(j),ae)})})}),_.CommandsRegistry.registerCommand({id:"editor.action.peekLocations",description:{description:"Peek locations from a position in a file",args:[{name:"uri",description:"The text document in which to start",constraint:L.URI},{name:"position",description:"The position at which to start",constraint:g.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array},{name:"multiple",description:"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto"}]},handler:(z,P,V,U,H)=>Ie(void 0,void 0,void 0,function*(){z.get(_.ICommandService).executeCommand("editor.action.goToLocations",P,V,U,H,void 0,!0)})}),_.CommandsRegistry.registerCommand({id:"editor.action.findReferences",handler:(z,P,V)=>{k.assertType(L.URI.isUri(P)),k.assertType(g.Position.isIPosition(V));const U=z.get(d.ICodeEditorService);return U.openCodeEditor({resource:P},U.getFocusedCodeEditor()).then(H=>{if(!(!S.isCodeEditor(H)||!H.hasModel())){const $=u.ReferencesController.get(H);if(!!$){const ie=N.createCancelablePromise(ae=>m.getReferencesAtPosition(H.getModel(),g.Position.lift(V),!1,ae).then(G=>new r.ReferencesModel(G,i.localize(38,null)))),oe=new p.Range(V.lineNumber,V.column,V.lineNumber,V.column);return Promise.resolve($.toggleWidget(oe,ie,!1))}}})}}),_.CommandsRegistry.registerCommandAlias("editor.action.showReferences","editor.action.peekLocations")}),define(Q[272],J([0,1,482,15,12,73,57,3,18,13,262,2,67,11,22,70,271,227,14,20,118,16,344]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoDefinitionAtPositionEditorContribution=void 0;let m=class rt{constructor(f,v,y){this.textModelResolverService=v,this.modeService=y,this.toUnhook=new c.DisposableStore,this.toUnhookForKeyboard=new c.DisposableStore,this.linkDecorations=[],this.currentWordAtPosition=null,this.previousPromise=null,this.editor=f;let L=new i.ClickLinkGesture(f);this.toUnhook.add(L),this.toUnhook.add(L.onMouseMoveOrRelevantKeyDown(([I,k])=>{this.startFindDefinitionFromMouse(I,t.withNullAsUndefined(k))})),this.toUnhook.add(L.onExecute(I=>{this.isEnabled(I)&&this.gotoDefinition(I.target.position,I.hasSideBySideModifier).then(()=>{this.removeLinkDecorations()},k=>{this.removeLinkDecorations(),M.onUnexpectedError(k)})})),this.toUnhook.add(L.onCancel(()=>{this.removeLinkDecorations(),this.currentWordAtPosition=null}))}static get(f){return f.getContribution(rt.ID)}startFindDefinitionFromCursor(f){return this.startFindDefinition(f).then(()=>{this.toUnhookForKeyboard.add(this.editor.onDidChangeCursorPosition(()=>{this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear()})),this.toUnhookForKeyboard.add(this.editor.onKeyDown(v=>{v&&(this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear())}))})}startFindDefinitionFromMouse(f,v){if(!(f.target.type===9&&this.linkDecorations.length>0)){if(!this.editor.hasModel()||!this.isEnabled(f,v)){this.currentWordAtPosition=null,this.removeLinkDecorations();return}const y=f.target.position;this.startFindDefinition(y)}}startFindDefinition(f){var v;this.toUnhookForKeyboard.clear();const y=f?(v=this.editor.getModel())===null||v===void 0?void 0:v.getWordAtPosition(f):null;if(!y)return this.currentWordAtPosition=null,this.removeLinkDecorations(),Promise.resolve(0);if(this.currentWordAtPosition&&this.currentWordAtPosition.startColumn===y.startColumn&&this.currentWordAtPosition.endColumn===y.endColumn&&this.currentWordAtPosition.word===y.word)return Promise.resolve(0);this.currentWordAtPosition=y;let L=new u.EditorState(this.editor,4|1|2|8);return this.previousPromise&&(this.previousPromise.cancel(),this.previousPromise=null),this.previousPromise=N.createCancelablePromise(I=>this.findDefinition(f,I)),this.previousPromise.then(I=>{if(!I||!I.length||!L.validate(this.editor)){this.removeLinkDecorations();return}if(I.length>1)this.addDecoration(new C.Range(f.lineNumber,y.startColumn,f.lineNumber,y.endColumn),new w.MarkdownString().appendText(b.localize(0,null,I.length)));else{let k=I[0];if(!k.uri)return;this.textModelResolverService.createModelReference(k.uri).then(E=>{if(!E.object||!E.object.textEditorModel){E.dispose();return}const{object:{textEditorModel:T}}=E,{startLineNumber:O}=k.range;if(O<1||O>T.getLineCount()){E.dispose();return}const A=this.getPreviewValue(T,O,k);let B;k.originSelectionRange?B=C.Range.lift(k.originSelectionRange):B=new C.Range(f.lineNumber,y.startColumn,f.lineNumber,y.endColumn);const F=this.modeService.getModeIdByFilepathOrFirstLine(T.uri);this.addDecoration(B,new w.MarkdownString().appendCodeblock(F||"",A)),E.dispose()})}}).then(void 0,M.onUnexpectedError)}getPreviewValue(f,v,y){let L=y.targetSelectionRange?y.range:this.getPreviewRangeBasedOnBrackets(f,v);return L.endLineNumber-L.startLineNumber>=rt.MAX_SOURCE_PREVIEW_LINES&&(L=this.getPreviewRangeBasedOnIndentation(f,v)),this.stripIndentationFromPreviewRange(f,v,L)}stripIndentationFromPreviewRange(f,v,y){let I=f.getLineFirstNonWhitespaceColumn(v);for(let E=v+1;Ey)return new C.Range(v,1,y+1,1);k=f.findNextBracket(new n.Position(T,O))}return new C.Range(v,1,y+1,1)}addDecoration(f,v){const y={range:f,options:{inlineClassName:"goto-definition-link",hoverMessage:v}};this.linkDecorations=this.editor.deltaDecorations(this.linkDecorations,[y])}removeLinkDecorations(){this.linkDecorations.length>0&&(this.linkDecorations=this.editor.deltaDecorations(this.linkDecorations,[]))}isEnabled(f,v){return this.editor.hasModel()&&f.isNoneOrSingleMouseDown&&f.target.type===6&&(f.hasTriggerModifier||(v?v.keyCodeIsTriggerKey:!1))&&d.DefinitionProviderRegistry.has(this.editor.getModel())}findDefinition(f,v){const y=this.editor.getModel();return y?p.getDefinitionsAtPosition(y,f,v):Promise.resolve(null)}gotoDefinition(f,v){return this.editor.setPosition(f),this.editor.invokeWithinContext(y=>{const L=!v&&this.editor.getOption(72)&&!this.isInPeekEditor(y);return new r.DefinitionAction({openToSide:v,openInPeek:L,muteMessage:!0},{alias:"",label:"",id:"",precondition:void 0}).run(y,this.editor)})}isInPeekEditor(f){const v=f.get(h.IContextKeyService);return l.PeekContext.inPeekEditor.getValue(v)}dispose(){this.toUnhook.dispose()}};m.ID="editor.contrib.gotodefinitionatposition",m.MAX_SOURCE_PREVIEW_LINES=8,m=Me([_e(1,o.ITextModelService),_e(2,S.IModeService)],m),e.GotoDefinitionAtPositionEditorContribution=m,g.registerEditorContribution(m.ID,m),s.registerThemingParticipant((_,f)=>{const v=_.getColor(a.editorActiveLinkForeground);v&&f.addRule(`.monaco-editor .goto-definition-link { color: ${v} !important; }`)})}),define(Q[273],J([0,1,488,39,2,13,3,25,57,661,560,58,22,11,272,16,9]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModesHoverController=void 0;let i=class ei{constructor(h,m,_,f,v,y){this._editor=h,this._instantiationService=m,this._openerService=_,this._modeService=f,this._themeService=v,this._toUnhook=new M.DisposableStore,this._isMouseDown=!1,this._hoverClicked=!1,this._contentWidget=null,this._glyphWidget=null,this._hookEvents(),this._didChangeConfigurationHandler=this._editor.onDidChangeConfiguration(L=>{L.hasChanged(48)&&(this._unhookEvents(),this._hookEvents())}),this._hoverVisibleKey=C.EditorContextKeys.hoverVisible.bindTo(y)}static get(h){return h.getContribution(ei.ID)}_hookEvents(){const h=()=>this._hideWidgets(),m=this._editor.getOption(48);this._isHoverEnabled=m.enabled,this._isHoverSticky=m.sticky,this._isHoverEnabled?(this._toUnhook.add(this._editor.onMouseDown(_=>this._onEditorMouseDown(_))),this._toUnhook.add(this._editor.onMouseUp(_=>this._onEditorMouseUp(_))),this._toUnhook.add(this._editor.onMouseMove(_=>this._onEditorMouseMove(_))),this._toUnhook.add(this._editor.onKeyDown(_=>this._onKeyDown(_))),this._toUnhook.add(this._editor.onDidChangeModelDecorations(()=>this._onModelDecorationsChanged()))):(this._toUnhook.add(this._editor.onMouseMove(_=>this._onEditorMouseMove(_))),this._toUnhook.add(this._editor.onKeyDown(_=>this._onKeyDown(_)))),this._toUnhook.add(this._editor.onMouseLeave(h)),this._toUnhook.add(this._editor.onDidChangeModel(h)),this._toUnhook.add(this._editor.onDidScrollChange(_=>this._onEditorScrollChanged(_)))}_unhookEvents(){this._toUnhook.clear()}_onModelDecorationsChanged(){var h,m;(h=this._contentWidget)===null||h===void 0||h.onModelDecorationsChanged(),(m=this._glyphWidget)===null||m===void 0||m.onModelDecorationsChanged()}_onEditorScrollChanged(h){(h.scrollTopChanged||h.scrollLeftChanged)&&this._hideWidgets()}_onEditorMouseDown(h){this._isMouseDown=!0;const m=h.target.type;if(m===9&&h.target.detail===g.ModesContentHoverWidget.ID){this._hoverClicked=!0;return}m===12&&h.target.detail===p.ModesGlyphHoverWidget.ID||(m!==12&&h.target.detail!==p.ModesGlyphHoverWidget.ID&&(this._hoverClicked=!1),this._hideWidgets())}_onEditorMouseUp(h){this._isMouseDown=!1}_onEditorMouseMove(h){var m,_,f,v,y,L;let I=h.target.type;if(!(this._isMouseDown&&this._hoverClicked)&&!(this._isHoverSticky&&I===9&&h.target.detail===g.ModesContentHoverWidget.ID)&&!(this._isHoverSticky&&!((_=(m=h.event.browserEvent.view)===null||m===void 0?void 0:m.getSelection())===null||_===void 0?void 0:_.isCollapsed))&&!(!this._isHoverSticky&&I===9&&h.target.detail===g.ModesContentHoverWidget.ID&&((f=this._contentWidget)===null||f===void 0?void 0:f.isColorPickerVisible()))&&!(this._isHoverSticky&&I===12&&h.target.detail===p.ModesGlyphHoverWidget.ID)){if(I===7){const k=this._editor.getOption(38).typicalHalfwidthCharacterWidth/2,E=h.target.detail;E&&!E.isAfterLines&&typeof E.horizontalDistanceToText=="number"&&E.horizontalDistanceToTextT.startsWith("ced-colorBox"))&&h.target.range.endColumn-h.target.range.startColumn==1?new S.Range(h.target.range.startLineNumber,h.target.range.startColumn+1,h.target.range.endLineNumber,h.target.range.endColumn+1):h.target.range;this._contentWidget||(this._contentWidget=new g.ModesContentHoverWidget(this._editor,this._hoverVisibleKey,this._instantiationService,this._themeService)),this._contentWidget.startShowingAt(E,0,!1)}}else I===2?((L=this._contentWidget)===null||L===void 0||L.hide(),this._isHoverEnabled&&h.target.position&&(this._glyphWidget||(this._glyphWidget=new p.ModesGlyphHoverWidget(this._editor,this._modeService,this._openerService)),this._glyphWidget.startShowingAt(h.target.position.lineNumber))):this._hideWidgets()}}_onKeyDown(h){h.keyCode!==5&&h.keyCode!==6&&h.keyCode!==57&&h.keyCode!==4&&this._hideWidgets()}_hideWidgets(){var h,m,_;this._isMouseDown&&this._hoverClicked&&((h=this._contentWidget)===null||h===void 0?void 0:h.isColorPickerVisible())||(this._hoverClicked=!1,(m=this._glyphWidget)===null||m===void 0||m.hide(),(_=this._contentWidget)===null||_===void 0||_.hide())}isColorPickerVisible(){var h;return((h=this._contentWidget)===null||h===void 0?void 0:h.isColorPickerVisible())||!1}showContentHover(h,m,_){this._contentWidget||(this._contentWidget=new g.ModesContentHoverWidget(this._editor,this._hoverVisibleKey,this._instantiationService,this._themeService)),this._contentWidget.startShowingAt(h,m,_)}dispose(){var h,m;this._unhookEvents(),this._toUnhook.dispose(),this._didChangeConfigurationHandler.dispose(),(h=this._glyphWidget)===null||h===void 0||h.dispose(),(m=this._contentWidget)===null||m===void 0||m.dispose()}};i.ID="editor.contrib.hover",i=Me([_e(1,r.IInstantiationService),_e(2,c.IOpenerService),_e(3,d.IModeService),_e(4,s.IThemeService),_e(5,u.IContextKeyService)],i),e.ModesHoverController=i;class n extends w.EditorAction{constructor(){super({id:"editor.action.showHover",label:b.localize(0,null),alias:"Show Hover",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.editorTextFocus,primary:N.KeyChord(2048|41,2048|39),weight:100}})}run(h,m){if(!!m.hasModel()){let _=i.get(m);if(!!_){const f=m.getPosition(),v=new S.Range(f.lineNumber,f.column,f.lineNumber,f.column),y=m.getOption(2)===2;_.showContentHover(v,1,y)}}}}class t extends w.EditorAction{constructor(){super({id:"editor.action.showDefinitionPreviewHover",label:b.localize(1,null),alias:"Show Definition Preview Hover",precondition:void 0})}run(h,m){let _=i.get(m);if(!!_){const f=m.getPosition();if(!!f){const v=new S.Range(f.lineNumber,f.column,f.lineNumber,f.column),L=a.GotoDefinitionAtPositionEditorContribution.get(m).startFindDefinitionFromCursor(f);L?L.then(()=>{_.showContentHover(v,1,!0)}):_.showContentHover(v,1,!0)}}}}w.registerEditorContribution(i.ID,i),w.registerEditorAction(n),w.registerEditorAction(t),s.registerThemingParticipant((l,h)=>{const m=l.getColor(o.editorHoverHighlight);m&&h.addRule(`.monaco-editor .hoverHighlight { background-color: ${m}; }`);const _=l.getColor(o.editorHoverBackground);_&&h.addRule(`.monaco-editor .monaco-hover { background-color: ${_}; }`);const f=l.getColor(o.editorHoverBorder);f&&(h.addRule(`.monaco-editor .monaco-hover { border: 1px solid ${f}; }`),h.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${f.transparent(.5)}; }`),h.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${f.transparent(.5)}; }`),h.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${f.transparent(.5)}; }`));const v=l.getColor(o.textLinkForeground);v&&h.addRule(`.monaco-editor .monaco-hover a { color: ${v}; }`);const y=l.getColor(o.editorHoverForeground);y&&h.addRule(`.monaco-editor .monaco-hover { color: ${y}; }`);const L=l.getColor(o.editorHoverStatusBarBackground);L&&h.addRule(`.monaco-editor .monaco-hover .hover-row .actions { background-color: ${L}; }`);const I=l.getColor(o.textCodeBlockBackground);I&&h.addRule(`.monaco-editor .monaco-hover code { background-color: ${I}; }`)})}),define(Q[670],J([0,1,2,13,273,3,260]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorContribution=void 0;class S extends b.Disposable{constructor(d){super();this._editor=d,this._register(d.onMouseDown(g=>this.onMouseDown(g)))}dispose(){super.dispose()}onMouseDown(d){var g;if(d.target.type===6&&!![...((g=d.target.element)===null||g===void 0?void 0:g.classList.values())||[]].find(s=>s.startsWith("ced-colorBox"))&&!!d.target.range){const o=this._editor.getContribution(M.ModesHoverController.ID);if(!o.isColorPickerVisible()){const s=new w.Range(d.target.range.startLineNumber,d.target.range.startColumn+1,d.target.range.endLineNumber,d.target.range.endColumn+1);o.showContentHover(s,0,!1)}}}}e.ColorContribution=S,S.ID="editor.contrib.colorContribution",N.registerEditorContribution(S.ID,S)}),define(Q[671],J([0,1,15,2,13,18,36,253,11,46,269,247]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let o=class extends N.Disposable{constructor(a,u,r,i){super();this._modelService=u,this._themeService=r,this._configurationService=i,this._editor=a,this._tokenizeViewport=new b.RunOnceScheduler(()=>this._tokenizeViewportNow(),100),this._outstandingRequests=[],this._register(this._editor.onDidScrollChange(()=>{this._tokenizeViewport.schedule()})),this._register(this._editor.onDidChangeModel(()=>{this._cancelAll(),this._tokenizeViewport.schedule()})),this._register(this._editor.onDidChangeModelContent(n=>{this._cancelAll(),this._tokenizeViewport.schedule()})),this._register(w.DocumentRangeSemanticTokensProviderRegistry.onDidChange(()=>{this._cancelAll(),this._tokenizeViewport.schedule()})),this._register(this._configurationService.onDidChangeConfiguration(n=>{n.affectsConfiguration(p.SEMANTIC_HIGHLIGHTING_SETTING_ID)&&(this._cancelAll(),this._tokenizeViewport.schedule())})),this._register(this._themeService.onDidColorThemeChange(()=>{this._cancelAll(),this._tokenizeViewport.schedule()}))}_cancelAll(){for(const a of this._outstandingRequests)a.cancel();this._outstandingRequests=[]}_removeOutstandingRequest(a){for(let u=0,r=this._outstandingRequests.length;uthis._requestRange(a,n,u,r)))}}}_requestRange(a,u,r,i){const n=a.getVersionId(),t=b.createCancelablePromise(l=>Promise.resolve(r.provideDocumentRangeSemanticTokens(a,u,l)));return t.then(l=>{!l||a.isDisposed()||a.getVersionId()!==n||a.setPartialSemanticTokens(u,C.toMultilineTokens2(l,i,a.getLanguageIdentifier()))}).then(()=>this._removeOutstandingRequest(t),()=>this._removeOutstandingRequest(t)),t}};o.ID="editor.contrib.viewportSemanticTokens",o=Me([_e(1,S.IModelService),_e(2,d.IThemeService),_e(3,g.IConfigurationService)],o),M.registerEditorContribution(o.ID,o)}),define(Q[672],J([0,1,13,28,270,46,16,9,32,79]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneReferencesController=void 0;let p=class extends M.ReferencesController{constructor(o,s,a,u,r,i,n){super(!0,o,s,a,u,r,i,n)}};p=Me([_e(1,S.IContextKeyService),_e(2,N.ICodeEditorService),_e(3,d.INotificationService),_e(4,C.IInstantiationService),_e(5,g.IStorageService),_e(6,w.IConfigurationService)],p),e.StandaloneReferencesController=p,b.registerEditorContribution(M.ReferencesController.ID,p)}),define(Q[673],J([0,1,529,148,12,74,184,82,43,32,2]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UndoRedoService=void 0;const c=!1;function o(_){return _.scheme===d.Schemas.file?_.fsPath:_.path}let s=0;class a{constructor(f,v,y,L,I,k,E){this.id=++s,this.type=0,this.actual=f,this.label=f.label,this.confirmBeforeUndo=f.confirmBeforeUndo||!1,this.resourceLabel=v,this.strResource=y,this.resourceLabels=[this.resourceLabel],this.strResources=[this.strResource],this.groupId=L,this.groupOrder=I,this.sourceId=k,this.sourceOrder=E,this.isValid=!0}setValid(f){this.isValid=f}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.isValid?" VALID":"INVALID"}] ${this.actual.constructor.name} - ${this.actual}`}}class u{constructor(f,v){this.resourceLabel=f,this.reason=v}}class r{constructor(){this.elements=new Map}createMessage(){const f=[],v=[];for(const[,L]of this.elements)(L.reason===0?f:v).push(L.resourceLabel);let y=[];return f.length>0&&y.push(b.localize(0,null,f.join(", "))),v.length>0&&y.push(b.localize(1,null,v.join(", "))),y.join(` +`)}get size(){return this.elements.size}has(f){return this.elements.has(f)}set(f,v){this.elements.set(f,v)}delete(f){return this.elements.delete(f)}}class i{constructor(f,v,y,L,I,k,E){this.id=++s,this.type=1,this.actual=f,this.label=f.label,this.confirmBeforeUndo=f.confirmBeforeUndo||!1,this.resourceLabels=v,this.strResources=y,this.groupId=L,this.groupOrder=I,this.sourceId=k,this.sourceOrder=E,this.removedResources=null,this.invalidatedResources=null}canSplit(){return typeof this.actual.split=="function"}removeResource(f,v,y){this.removedResources||(this.removedResources=new r),this.removedResources.has(v)||this.removedResources.set(v,new u(f,y))}setValid(f,v,y){y?this.invalidatedResources&&(this.invalidatedResources.delete(v),this.invalidatedResources.size===0&&(this.invalidatedResources=null)):(this.invalidatedResources||(this.invalidatedResources=new r),this.invalidatedResources.has(v)||this.invalidatedResources.set(v,new u(f,0)))}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.invalidatedResources?"INVALID":" VALID"}] ${this.actual.constructor.name} - ${this.actual}`}}class n{constructor(f,v){this.resourceLabel=f,this.strResource=v,this._past=[],this._future=[],this.locked=!1,this.versionId=1}dispose(){for(const f of this._past)f.type===1&&f.removeResource(this.resourceLabel,this.strResource,0);for(const f of this._future)f.type===1&&f.removeResource(this.resourceLabel,this.strResource,0);this.versionId++}toString(){let f=[];f.push(`* ${this.strResource}:`);for(let v=0;v=0;v--)f.push(` * [REDO] ${this._future[v]}`);return f.join(` +`)}flushAllElements(){this._past=[],this._future=[],this.versionId++}_setElementValidFlag(f,v){f.type===1?f.setValid(this.resourceLabel,this.strResource,v):f.setValid(v)}setElementsValidFlag(f,v){for(const y of this._past)v(y.actual)&&this._setElementValidFlag(y,f);for(const y of this._future)v(y.actual)&&this._setElementValidFlag(y,f)}pushElement(f){for(const v of this._future)v.type===1&&v.removeResource(this.resourceLabel,this.strResource,1);this._future=[],this._past.push(f),this.versionId++}createSnapshot(f){const v=[];for(let y=0,L=this._past.length;y=0;y--)v.push(this._future[y].id);return new N.ResourceEditStackSnapshot(f,v)}restoreSnapshot(f){const v=f.elements.length;let y=!0,L=0,I=-1;for(let E=0,T=this._past.length;E=v||O.id!==f.elements[L])&&(y=!1,I=0),!y&&O.type===1&&O.removeResource(this.resourceLabel,this.strResource,0)}let k=-1;for(let E=this._future.length-1;E>=0;E--,L++){const T=this._future[E];y&&(L>=v||T.id!==f.elements[L])&&(y=!1,k=E),!y&&T.type===1&&T.removeResource(this.resourceLabel,this.strResource,0)}I!==-1&&(this._past=this._past.slice(0,I)),k!==-1&&(this._future=this._future.slice(k+1)),this.versionId++}getElements(){const f=[],v=[];for(const y of this._past)f.push(y.actual);for(const y of this._future)v.push(y.actual);return{past:f,future:v}}getClosestPastElement(){return this._past.length===0?null:this._past[this._past.length-1]}getSecondClosestPastElement(){return this._past.length<2?null:this._past[this._past.length-2]}getClosestFutureElement(){return this._future.length===0?null:this._future[this._future.length-1]}hasPastElements(){return this._past.length>0}hasFutureElements(){return this._future.length>0}splitPastWorkspaceElement(f,v){for(let y=this._past.length-1;y>=0;y--)if(this._past[y]===f){v.has(this.strResource)?this._past[y]=v.get(this.strResource):this._past.splice(y,1);break}this.versionId++}splitFutureWorkspaceElement(f,v){for(let y=this._future.length-1;y>=0;y--)if(this._future[y]===f){v.has(this.strResource)?this._future[y]=v.get(this.strResource):this._future.splice(y,1);break}this.versionId++}moveBackward(f){this._past.pop(),this._future.push(f),this.versionId++}moveForward(f){this._future.pop(),this._past.push(f),this.versionId++}}class t{constructor(f){this.editStacks=f,this._versionIds=[];for(let v=0,y=this.editStacks.length;vv.sourceOrder)&&(v=k,y=L)}return[v,y]}canUndo(f){if(f instanceof N.UndoRedoSource){const[,y]=this._findClosestUndoElementWithSource(f.id);return!!y}const v=this.getUriComparisonKey(f);return this._editStacks.has(v)?this._editStacks.get(v).hasPastElements():!1}_onError(f,v){M.onUnexpectedError(f);for(const y of v.strResources)this.removeElements(y);this._notificationService.error(f)}_acquireLocks(f){for(const v of f.editStacks)if(v.locked)throw new Error("Cannot acquire edit stack lock");for(const v of f.editStacks)v.locked=!0;return()=>{for(const v of f.editStacks)v.locked=!1}}_safeInvokeWithLocks(f,v,y,L,I){const k=this._acquireLocks(y);let E;try{E=v()}catch(T){return k(),L.dispose(),this._onError(T,f)}return E?E.then(()=>(k(),L.dispose(),I()),T=>(k(),L.dispose(),this._onError(T,f))):(k(),L.dispose(),I())}_invokeWorkspacePrepare(f){return Ie(this,void 0,void 0,function*(){if(typeof f.actual.prepareUndoRedo=="undefined")return p.Disposable.None;const v=f.actual.prepareUndoRedo();return typeof v=="undefined"?p.Disposable.None:v})}_invokeResourcePrepare(f,v){if(f.actual.type!==1||typeof f.actual.prepareUndoRedo=="undefined")return v(p.Disposable.None);const y=f.actual.prepareUndoRedo();return y?p.isDisposable(y)?v(y):y.then(L=>v(L)):v(p.Disposable.None)}_getAffectedEditStacks(f){const v=[];for(const y of f.strResources)v.push(this._editStacks.get(y)||l);return new t(v)}_tryToSplitAndUndo(f,v,y,L){if(v.canSplit())return this._splitPastWorkspaceElement(v,y),this._notificationService.info(L),new m(this._undo(f,0,!0));for(const I of v.strResources)this.removeElements(I);return this._notificationService.info(L),new m}_checkWorkspaceUndo(f,v,y,L){if(v.removedResources)return this._tryToSplitAndUndo(f,v,v.removedResources,b.localize(2,null,v.label,v.removedResources.createMessage()));if(L&&v.invalidatedResources)return this._tryToSplitAndUndo(f,v,v.invalidatedResources,b.localize(3,null,v.label,v.invalidatedResources.createMessage()));const I=[];for(const E of y.editStacks)E.getClosestPastElement()!==v&&I.push(E.resourceLabel);if(I.length>0)return this._tryToSplitAndUndo(f,v,null,b.localize(4,null,v.label,I.join(", ")));const k=[];for(const E of y.editStacks)E.locked&&k.push(E.resourceLabel);return k.length>0?this._tryToSplitAndUndo(f,v,null,b.localize(5,null,v.label,k.join(", "))):y.isValid()?null:this._tryToSplitAndUndo(f,v,null,b.localize(6,null,v.label))}_workspaceUndo(f,v,y){const L=this._getAffectedEditStacks(v),I=this._checkWorkspaceUndo(f,v,L,!1);return I?I.returnValue:this._confirmAndExecuteWorkspaceUndo(f,v,L,y)}_isPartOfUndoGroup(f){if(!f.groupId)return!1;for(const[,v]of this._editStacks){const y=v.getClosestPastElement();if(!!y){if(y===f){const L=v.getSecondClosestPastElement();if(L&&L.groupId===f.groupId)return!0}if(y.groupId===f.groupId)return!0}}return!1}_confirmAndExecuteWorkspaceUndo(f,v,y,L){return Ie(this,void 0,void 0,function*(){if(v.canSplit()&&!this._isPartOfUndoGroup(v)){const E=yield this._dialogService.show(C.default.Info,b.localize(7,null,v.label),[b.localize(8,null,y.editStacks.length),b.localize(9,null),b.localize(10,null)],{cancelId:2});if(E.choice===2)return;if(E.choice===1)return this._splitPastWorkspaceElement(v,null),this._undo(f,0,!0);const T=this._checkWorkspaceUndo(f,v,y,!1);if(T)return T.returnValue;L=!0}let I;try{I=yield this._invokeWorkspacePrepare(v)}catch(E){return this._onError(E,v)}const k=this._checkWorkspaceUndo(f,v,y,!0);if(k)return I.dispose(),k.returnValue;for(const E of y.editStacks)E.moveBackward(v);return this._safeInvokeWithLocks(v,()=>v.actual.undo(),y,I,()=>this._continueUndoInGroup(v.groupId,L))})}_resourceUndo(f,v,y){if(!v.isValid){f.flushAllElements();return}if(f.locked){const L=b.localize(11,null,v.label);this._notificationService.info(L);return}return this._invokeResourcePrepare(v,L=>(f.moveBackward(v),this._safeInvokeWithLocks(v,()=>v.actual.undo(),new t([f]),L,()=>this._continueUndoInGroup(v.groupId,y))))}_findClosestUndoElementInGroup(f){if(!f)return[null,null];let v=null,y=null;for(const[L,I]of this._editStacks){const k=I.getClosestPastElement();!k||k.groupId===f&&(!v||k.groupOrder>v.groupOrder)&&(v=k,y=L)}return[v,y]}_continueUndoInGroup(f,v){if(!!f){const[,y]=this._findClosestUndoElementInGroup(f);if(y)return this._undo(y,0,v)}}undo(f){if(f instanceof N.UndoRedoSource){const[,v]=this._findClosestUndoElementWithSource(f.id);return v?this._undo(v,f.id,!1):void 0}return typeof f=="string"?this._undo(f,0,!1):this._undo(this.getUriComparisonKey(f),0,!1)}_undo(f,v=0,y){if(!!this._editStacks.has(f)){const L=this._editStacks.get(f),I=L.getClosestPastElement();if(!!I){if(I.groupId){const[E,T]=this._findClosestUndoElementInGroup(I.groupId);if(I!==E&&T)return this._undo(T,v,y)}if((I.sourceId!==v||I.confirmBeforeUndo)&&!y)return this._confirmAndContinueUndo(f,v,I);try{return I.type===1?this._workspaceUndo(f,I,y):this._resourceUndo(L,I,y)}finally{c&&this._print("undo")}}}}_confirmAndContinueUndo(f,v,y){return Ie(this,void 0,void 0,function*(){if((yield this._dialogService.show(C.default.Info,b.localize(12,null,y.label),[b.localize(13,null),b.localize(14,null)],{cancelId:1})).choice!==1)return this._undo(f,v,!0)})}_findClosestRedoElementWithSource(f){if(!f)return[null,null];let v=null,y=null;for(const[L,I]of this._editStacks){const k=I.getClosestFutureElement();!k||k.sourceId===f&&(!v||k.sourceOrder0)return this._tryToSplitAndRedo(f,v,null,b.localize(17,null,v.label,I.join(", ")));const k=[];for(const E of y.editStacks)E.locked&&k.push(E.resourceLabel);return k.length>0?this._tryToSplitAndRedo(f,v,null,b.localize(18,null,v.label,k.join(", "))):y.isValid()?null:this._tryToSplitAndRedo(f,v,null,b.localize(19,null,v.label))}_workspaceRedo(f,v){const y=this._getAffectedEditStacks(v),L=this._checkWorkspaceRedo(f,v,y,!1);return L?L.returnValue:this._executeWorkspaceRedo(f,v,y)}_executeWorkspaceRedo(f,v,y){return Ie(this,void 0,void 0,function*(){let L;try{L=yield this._invokeWorkspacePrepare(v)}catch(k){return this._onError(k,v)}const I=this._checkWorkspaceRedo(f,v,y,!0);if(I)return L.dispose(),I.returnValue;for(const k of y.editStacks)k.moveForward(v);return this._safeInvokeWithLocks(v,()=>v.actual.redo(),y,L,()=>this._continueRedoInGroup(v.groupId))})}_resourceRedo(f,v){if(!v.isValid){f.flushAllElements();return}if(f.locked){const y=b.localize(20,null,v.label);this._notificationService.info(y);return}return this._invokeResourcePrepare(v,y=>(f.moveForward(v),this._safeInvokeWithLocks(v,()=>v.actual.redo(),new t([f]),y,()=>this._continueRedoInGroup(v.groupId))))}_findClosestRedoElementInGroup(f){if(!f)return[null,null];let v=null,y=null;for(const[L,I]of this._editStacks){const k=I.getClosestFutureElement();!k||k.groupId===f&&(!v||k.groupOrderthis.findModel(U,P),U=>this.findModel(U.getOriginalEditor(),P)||this.findModel(U.getModifiedEditor(),P))),V?Promise.resolve(new C.ImmortalReference(new k(V))):Promise.reject(new Error("Model not found"))}findModel(P,V){let U=this.modelService.getModel(V);return U&&U.uri.toString()!==V.toString()?null:U}};T=Me([_e(0,i.IModelService)],T),e.SimpleEditorModelResolverService=T;class O{show(){return O.NULL_PROGRESS_RUNNER}showWhile(P,V){return Ie(this,void 0,void 0,function*(){yield P})}}e.SimpleEditorProgressService=O,O.NULL_PROGRESS_RUNNER={done:()=>{},total:()=>{},worked:()=>{}};class A{confirm(P){return this.doConfirm(P).then(V=>({confirmed:V,checkboxChecked:!1}))}doConfirm(P){let V=P.message;return P.detail&&(V=V+` + +`+P.detail),Promise.resolve(window.confirm(V))}show(P,V,U,H){return Promise.resolve({choice:0})}}e.SimpleDialogService=A;class B{info(P){return this.notify({severity:g.default.Info,message:P})}warn(P){return this.notify({severity:g.default.Warning,message:P})}error(P){return this.notify({severity:g.default.Error,message:P})}notify(P){switch(P.severity){case g.default.Error:console.error(P.message);break;case g.default.Warning:console.warn(P.message);break;default:console.log(P.message);break}return B.NO_OP}status(P,V){return C.Disposable.None}}e.SimpleNotificationService=B,B.NO_OP=new y.NoOpNotification;class F{constructor(P){this._onWillExecuteCommand=new w.Emitter,this._onDidExecuteCommand=new w.Emitter,this._instantiationService=P}executeCommand(P,...V){const U=n.CommandsRegistry.getCommand(P);if(!U)return Promise.reject(new Error(`command '${P}' not found`));try{this._onWillExecuteCommand.fire({commandId:P,args:V});const H=this._instantiationService.invokeFunction.apply(this._instantiationService,[U.handler,...V]);return this._onDidExecuteCommand.fire({commandId:P,args:V}),Promise.resolve(H)}catch(H){return Promise.reject(H)}}}e.StandaloneCommandService=F;class D extends h.AbstractKeybindingService{constructor(P,V,U,H,$,ie){super(P,V,U,H,$);this._cachedResolver=null,this._dynamicKeybindings=[],this._register(N.addDisposableListener(ie,N.EventType.KEY_DOWN,oe=>{const ae=new M.StandardKeyboardEvent(oe);this._dispatch(ae,ae.target)&&(ae.preventDefault(),ae.stopPropagation())})),this._register(N.addDisposableListener(window,N.EventType.KEY_UP,oe=>{const ae=new M.StandardKeyboardEvent(oe);this._singleModifierDispatch(ae,ae.target)&&ae.preventDefault()}))}addDynamicKeybinding(P,V,U,H){const $=S.createKeybinding(V,d.OS),ie=new C.DisposableStore;return $&&(this._dynamicKeybindings.push({keybinding:$,command:P,when:H,weight1:1e3,weight2:0,extensionId:null,isBuiltinExtension:!1}),ie.add(C.toDisposable(()=>{for(let oe=0;oethis._log(U))}return this._cachedResolver}_documentHasFocus(){return document.hasFocus()}_toNormalizedKeybindingItems(P,V){let U=[],H=0;for(const $ of P){const ie=$.when||void 0,oe=$.keybinding;if(!oe)U[H++]=new f.ResolvedKeybindingItem(void 0,$.command,$.commandArgs,ie,V,null,!1);else{const ae=this.resolveKeybinding(oe);for(const G of ae)U[H++]=new f.ResolvedKeybindingItem(G,$.command,$.commandArgs,ie,V,null,!1)}}return U}resolveKeybinding(P){return[new v.USLayoutResolvedKeybinding(P,d.OS)]}resolveKeyboardEvent(P){let V=new S.SimpleKeybinding(P.ctrlKey,P.shiftKey,P.altKey,P.metaKey,P.keyCode).toChord();return new v.USLayoutResolvedKeybinding(V,d.OS)}}e.StandaloneKeybindingService=D;function R(z){return z&&typeof z=="object"&&(!z.overrideIdentifier||typeof z.overrideIdentifier=="string")&&(!z.resource||z.resource instanceof p.URI)}class W{constructor(){this._onDidChangeConfiguration=new w.Emitter,this.onDidChangeConfiguration=this._onDidChangeConfiguration.event,this._configuration=new l.Configuration(new l.DefaultConfigurationModel,new l.ConfigurationModel)}getValue(P,V){const U=typeof P=="string"?P:void 0,H=R(P)?P:R(V)?V:{};return this._configuration.getValue(U,H,void 0)}updateValues(P){const V={data:this._configuration.toData()};let U=[];for(const H of P){const[$,ie]=H;this.getValue($)!==ie&&(this._configuration.updateValue($,ie),U.push($))}if(U.length>0){const H=new l.ConfigurationChangeEvent({keys:U,overrides:[]},V,this._configuration);H.source=7,H.sourceConfig=null,this._onDidChangeConfiguration.fire(H)}return Promise.resolve()}}e.SimpleConfigurationService=W;class x{constructor(P){this.configurationService=P,this._onDidChangeConfiguration=new w.Emitter,this.configurationService.onDidChangeConfiguration(V=>{this._onDidChangeConfiguration.fire({affectedKeys:V.affectedKeys,affectsConfiguration:(U,H)=>V.affectsConfiguration(H)})})}getValue(P,V,U){const $=(u.Position.isIPosition(V)?V:null)?typeof U=="string"?U:void 0:typeof V=="string"?V:void 0;return typeof $=="undefined"?this.configurationService.getValue():this.configurationService.getValue($)}}e.SimpleResourceConfigurationService=x;let K=class{constructor(P){this.configurationService=P}getEOL(P,V){const U=this.configurationService.getValue("files.eol",{overrideIdentifier:V,resource:P});return U&&U!=="auto"?U:d.isLinux||d.isMacintosh?` +`:`\r +`}};K=Me([_e(0,t.IConfigurationService)],K),e.SimpleResourcePropertiesService=K;class Y{publicLog(P,V){return Promise.resolve(void 0)}publicLog2(P,V){return this.publicLog(P,V)}}e.StandaloneTelemetryService=Y;class ee{constructor(){const P=p.URI.from({scheme:ee.SCHEME,authority:"model",path:"/"});this.workspace={id:"4064f6ec-cb38-4ad0-af64-ee6467e63c82",folders:[new L.WorkspaceFolder({uri:P,name:"",index:0})]}}getWorkspace(){return this.workspace}}e.SimpleWorkspaceContextService=ee,ee.SCHEME="inmemory";function se(z,P,V){if(!!P&&z instanceof W){let U=[];Object.keys(P).forEach(H=>{s.isEditorConfigurationKey(H)&&U.push([`editor.${H}`,P[H]]),V&&s.isDiffEditorConfigurationKey(H)&&U.push([`diffEditor.${H}`,P[H]])}),U.length>0&&z.updateValues(U)}}e.updateConfigurationService=se;class ne{constructor(P){this._modelService=P}hasPreviewHandler(){return!1}apply(P,V){return Ie(this,void 0,void 0,function*(){const U=new Map;for(let ie of P){if(!(ie instanceof o.ResourceTextEdit))throw new Error("bad edit - only text edits are supported");const oe=this._modelService.getModel(ie.resource);if(!oe)throw new Error("bad edit - model not found");if(typeof ie.versionId=="number"&&oe.getVersionId()!==ie.versionId)throw new Error("bad state - model changed in the meantime");let ae=U.get(oe);ae||(ae=[],U.set(oe,ae)),ae.push(a.EditOperation.replaceMove(r.Range.lift(ie.textEdit.range),ie.textEdit.text))}let H=0,$=0;for(const[ie,oe]of U)ie.pushStackElement(),ie.pushEditOperations([],oe,()=>[]),ie.pushStackElement(),$+=1,H+=oe.length;return{ariaSummary:b.format(I.SimpleServicesNLS.bulkEditServiceSummary,H,$)}})}}e.SimpleBulkEditService=ne;class le{getUriLabel(P,V){return P.scheme==="file"?P.fsPath:P.path}}e.SimpleUriLabelService=le;class X{constructor(P,V){this._codeEditorService=P,this._container=V,this.onDidLayout=w.Event.None}get dimension(){return this._dimension||(this._dimension=N.getClientArea(window.document.body)),this._dimension}get container(){return this._container}focus(){var P;(P=this._codeEditorService.getFocusedCodeEditor())===null||P===void 0||P.focus()}}e.SimpleLayoutService=X}),define(Q[674],J([0,1,47,2,28,143,266,217,75,191,114,34,26,46,16,68,9,37,32,11,65,64,84,59,36,57]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createTextModel=e.StandaloneDiffEditor=e.StandaloneEditor=e.StandaloneCodeEditor=void 0;let y=0,L=!1;function I(){L||(L=!0,b.setARIAContainer(document.body))}let k=class extends w.CodeEditorWidget{constructor(F,D,R,W,x,K,Y,ee,se,ne){const le=Object.assign({},D);le.ariaLabel=le.ariaLabel||h.StandaloneCodeEditorNLS.editorViewAccessibleLabel,le.ariaLabel=le.ariaLabel+";"+h.StandaloneCodeEditorNLS.accessibilityHelpMessage,super(F,le,{},R,W,x,K,ee,se,ne),Y instanceof g.StandaloneKeybindingService?this._standaloneKeybindingService=Y:this._standaloneKeybindingService=null,I()}addCommand(F,D,R){if(!this._standaloneKeybindingService)return console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"),null;let W="DYNAMIC_"+ ++y,x=a.ContextKeyExpr.deserialize(R);return this._standaloneKeybindingService.addDynamicKeybinding(W,F,D,x),W}createContextKey(F,D){return this._contextKeyService.createKey(F,D)}addAction(F){if(typeof F.id!="string"||typeof F.label!="string"||typeof F.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");if(!this._standaloneKeybindingService)return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),N.Disposable.None;const D=F.id,R=F.label,W=a.ContextKeyExpr.and(a.ContextKeyExpr.equals("editorId",this.getId()),a.ContextKeyExpr.deserialize(F.precondition)),x=F.keybindings,K=a.ContextKeyExpr.and(W,a.ContextKeyExpr.deserialize(F.keybindingContext)),Y=F.contextMenuGroupId||null,ee=F.contextMenuOrder||0,se=(z,...P)=>Promise.resolve(F.run(this,...P)),ne=new N.DisposableStore,le=this.getId()+":"+D;if(ne.add(o.CommandsRegistry.registerCommand(le,se)),Y){let z={command:{id:le,title:R},when:W,group:Y,order:ee};ne.add(c.MenuRegistry.appendMenuItem(c.MenuId.EditorContext,z))}if(Array.isArray(x))for(const z of x)ne.add(this._standaloneKeybindingService.addDynamicKeybinding(le,z,se,K));let X=new C.InternalEditorAction(le,R,R,W,se,this._contextKeyService);return this._actions[D]=X,ne.add(N.toDisposable(()=>{delete this._actions[D]})),ne}};k=Me([_e(2,r.IInstantiationService),_e(3,M.ICodeEditorService),_e(4,o.ICommandService),_e(5,a.IContextKeyService),_e(6,i.IKeybindingService),_e(7,t.IThemeService),_e(8,n.INotificationService),_e(9,l.IAccessibilityService)],k),e.StandaloneCodeEditor=k;let E=class extends k{constructor(F,D,R,W,x,K,Y,ee,se,ne,le,X,z,P,V){const U=Object.assign({},D);g.updateConfigurationService(X,U,!1);const H=ne.registerEditorContainer(F);typeof U.theme=="string"&&ne.setTheme(U.theme),typeof U.autoDetectHighContrast!="undefined"&&ne.setAutoDetectHighContrast(Boolean(U.autoDetectHighContrast));let $=U.model;delete U.model,super(F,U,W,x,K,Y,ee,ne,le,z),this._contextViewService=se,this._configurationService=X,this._standaloneThemeService=ne,this._register(R),this._register(H);let ie;if(typeof $=="undefined"?(ie=O(P,V,U.value||"",U.language||"text/plain",void 0),this._ownsModel=!0):(ie=$,this._ownsModel=!1),this._attachModel(ie),ie){let oe={oldModelUrl:null,newModelUrl:ie.uri};this._onDidChangeModel.fire(oe)}}dispose(){super.dispose()}updateOptions(F){g.updateConfigurationService(this._configurationService,F,!1),typeof F.theme=="string"&&this._standaloneThemeService.setTheme(F.theme),typeof F.autoDetectHighContrast!="undefined"&&this._standaloneThemeService.setAutoDetectHighContrast(Boolean(F.autoDetectHighContrast)),super.updateOptions(F)}_attachModel(F){super._attachModel(F),this._modelData&&this._contextViewService.setContainer(this._modelData.view.domNode.domNode)}_postDetachModelCleanup(F){super._postDetachModelCleanup(F),F&&this._ownsModel&&(F.dispose(),this._ownsModel=!1)}};E=Me([_e(3,r.IInstantiationService),_e(4,M.ICodeEditorService),_e(5,o.ICommandService),_e(6,a.IContextKeyService),_e(7,i.IKeybindingService),_e(8,u.IContextViewService),_e(9,p.IStandaloneThemeService),_e(10,n.INotificationService),_e(11,s.IConfigurationService),_e(12,l.IAccessibilityService),_e(13,f.IModelService),_e(14,v.IModeService)],E),e.StandaloneEditor=E;let T=class extends S.DiffEditorWidget{constructor(F,D,R,W,x,K,Y,ee,se,ne,le,X,z,P,V){const U=Object.assign({},D);g.updateConfigurationService(X,U,!0);const H=ne.registerEditorContainer(F);typeof U.theme=="string"&&ne.setTheme(U.theme),typeof U.autoDetectHighContrast!="undefined"&&ne.setAutoDetectHighContrast(Boolean(U.autoDetectHighContrast)),super(F,U,{},V,ee,x,W,se,ne,le,z,P),this._contextViewService=Y,this._configurationService=X,this._standaloneThemeService=ne,this._register(R),this._register(H),this._contextViewService.setContainer(this._containerDomElement)}dispose(){super.dispose()}updateOptions(F){g.updateConfigurationService(this._configurationService,F,!0),typeof F.theme=="string"&&this._standaloneThemeService.setTheme(F.theme),typeof F.autoDetectHighContrast!="undefined"&&this._standaloneThemeService.setAutoDetectHighContrast(Boolean(F.autoDetectHighContrast)),super.updateOptions(F)}_createInnerEditor(F,D,R){return F.createInstance(k,D,R)}getOriginalEditor(){return super.getOriginalEditor()}getModifiedEditor(){return super.getModifiedEditor()}addCommand(F,D,R){return this.getModifiedEditor().addCommand(F,D,R)}createContextKey(F,D){return this.getModifiedEditor().createContextKey(F,D)}addAction(F){return this.getModifiedEditor().addAction(F)}};T=Me([_e(3,r.IInstantiationService),_e(4,a.IContextKeyService),_e(5,i.IKeybindingService),_e(6,u.IContextViewService),_e(7,d.IEditorWorkerService),_e(8,M.ICodeEditorService),_e(9,p.IStandaloneThemeService),_e(10,n.INotificationService),_e(11,s.IConfigurationService),_e(12,u.IContextMenuService),_e(13,_.IEditorProgressService),_e(14,m.IClipboardService)],T),e.StandaloneDiffEditor=T;function O(B,F,D,R,W){if(D=D||"",!R){const x=D.indexOf(` +`);let K=D;return x!==-1&&(K=D.substring(0,x)),A(B,D,F.createByFilepathOrFirstLine(W||null,K),W)}return A(B,D,F.create(R),W)}e.createTextModel=O;function A(B,F,D,R){return B.createModel(F,D,R)}}),define(Q[274],J([0,1,2,133,28,75,252,57,567,36,269,137,191,605,668,114,34,26,46,570,16,651,68,555,184,9,550,138,37,115,147,77,558,85,32,59,79,87,11,190,650,178,594,65,139,74,568,84,530,148,673,653,78]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B,F,D,R,W,x,K,Y,ee,se,ne,le,X,z,P,V,U,H,$){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DynamicStandaloneServices=e.StaticServices=void 0;var ie;(function(ae){const G=new L.ServiceCollection;class j{constructor(ce,me){this._serviceId=ce,this._factory=me,this._value=null}get id(){return this._serviceId}get(ce){if(!this._value){if(ce&&(this._value=ce[this._serviceId.toString()]),this._value||(this._value=this._factory(ce)),!this._value)throw new Error("Service "+this._serviceId+" is missing!");G.set(this._serviceId,this._value)}return this._value}}ae.LazyStaticService=j;let te=[];function Z(re,ce){let me=new j(re,ce);return te.push(me),me}function ue(re){let ce=new L.ServiceCollection;for(const[Ce,be]of le.getSingletonServiceDescriptors())ce.set(Ce,be);for(let Ce in re)re.hasOwnProperty(Ce)&&ce.set(v.createDecorator(Ce),re[Ce]);te.forEach(Ce=>ce.set(Ce.id,Ce.get(re)));let me=new y.InstantiationService(ce,!0);return ce.set(v.IInstantiationService,me),[ce,me]}ae.init=ue,ae.instantiationService=Z(v.IInstantiationService,()=>new y.InstantiationService(G,!0));const he=new o.SimpleConfigurationService;ae.configurationService=Z(n.IConfigurationService,()=>he),ae.resourceConfigurationService=Z(c.ITextResourceConfigurationService,()=>new o.SimpleResourceConfigurationService(he)),ae.resourcePropertiesService=Z(c.ITextResourcePropertiesService,()=>new o.SimpleResourcePropertiesService(he)),ae.contextService=Z(x.IWorkspaceContextService,()=>new o.SimpleWorkspaceContextService),ae.labelService=Z(k.ILabelService,()=>new o.SimpleUriLabelService),ae.telemetryService=Z(R.ITelemetryService,()=>new o.StandaloneTelemetryService),ae.dialogService=Z(f.IDialogService,()=>new o.SimpleDialogService),ae.notificationService=Z(B.INotificationService,()=>new o.SimpleNotificationService),ae.markerService=Z(A.IMarkerService,()=>new O.MarkerService),ae.modeService=Z(C.IModeService,re=>new d.ModeServiceImpl),ae.standaloneThemeService=Z(u.IStandaloneThemeService,()=>new a.StandaloneThemeServiceImpl),ae.logService=Z(T.ILogService,()=>new T.LogService(new T.ConsoleLogger)),ae.undoRedoService=Z(V.IUndoRedoService,re=>new U.UndoRedoService(ae.dialogService.get(re),ae.notificationService.get(re))),ae.modelService=Z(g.IModelService,re=>new p.ModelServiceImpl(ae.configurationService.get(re),ae.resourcePropertiesService.get(re),ae.standaloneThemeService.get(re),ae.logService.get(re),ae.undoRedoService.get(re))),ae.markerDecorationsService=Z(Y.IMarkerDecorationsService,re=>new ee.MarkerDecorationsService(ae.modelService.get(re),ae.markerService.get(re))),ae.contextKeyService=Z(l.IContextKeyService,re=>new t.ContextKeyService(ae.configurationService.get(re))),ae.codeEditorService=Z(M.ICodeEditorService,re=>new s.StandaloneCodeEditorServiceImpl(null,ae.contextKeyService.get(re),ae.standaloneThemeService.get(re))),ae.editorProgressService=Z(F.IEditorProgressService,()=>new o.SimpleEditorProgressService),ae.storageService=Z(D.IStorageService,()=>new D.InMemoryStorageService),ae.editorWorkerService=Z(w.IEditorWorkerService,re=>new S.EditorWorkerServiceImpl(ae.modelService.get(re),ae.resourceConfigurationService.get(re),ae.logService.get(re)))})(ie=e.StaticServices||(e.StaticServices={}));class oe extends b.Disposable{constructor(G,j){super();const[te,Z]=ie.init(j);this._serviceCollection=te,this._instantiationService=Z;const ue=this.get(n.IConfigurationService),he=this.get(B.INotificationService),re=this.get(R.ITelemetryService),ce=this.get(W.IThemeService),me=this.get(T.ILogService),Ce=this.get(l.IContextKeyService);let be=(Ae,Se)=>{let we=null;return j&&(we=j[Ae.toString()]),we||(we=Se()),this._serviceCollection.set(Ae,we),we};be(se.IAccessibilityService,()=>new X.AccessibilityService(Ce,ue)),be(E.IListService,()=>new E.ListService(ce));let Le=be(i.ICommandService,()=>new o.StandaloneCommandService(this._instantiationService)),De=be(I.IKeybindingService,()=>this._register(new o.StandaloneKeybindingService(Ce,Le,re,he,me,G))),Re=be(ne.ILayoutService,()=>new o.SimpleLayoutService(ie.codeEditorService.get(M.ICodeEditorService),G));be($.IQuickInputService,()=>new H.StandaloneQuickInputServiceImpl(Z,ie.codeEditorService.get(M.ICodeEditorService)));let Ee=be(m.IContextViewService,()=>this._register(new _.ContextViewService(Re)));be(z.IClipboardService,()=>new P.BrowserClipboardService),be(m.IContextMenuService,()=>{const Ae=new h.ContextMenuService(re,he,Ee,De,ce);return Ae.configure({blockMouse:!1}),this._register(Ae)}),be(r.IMenuService,()=>new K.MenuService(Le)),be(N.IBulkEditService,()=>new o.SimpleBulkEditService(ie.modelService.get(g.IModelService)))}get(G){let j=this._serviceCollection.get(G);if(!j)throw new Error("Missing service "+G);return j}set(G,j){this._serviceCollection.set(G,j)}has(G){return this._serviceCollection.has(G)}}e.DynamicStandaloneServices=oe}),define(Q[675],J([0,1,28,559,215,38,163,107,53,18,76,75,57,67,556,169,544,191,674,274,114,26,46,16,68,9,37,32,58,65,69,59,84,8,36,358]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createMonacoEditorAPI=e.registerCommand=e.remeasureFonts=e.setTheme=e.defineTheme=e.tokenize=e.colorizeModelLine=e.colorize=e.colorizeElement=e.createWebWorker=e.onDidChangeModelLanguage=e.onWillDisposeModel=e.onDidCreateModel=e.getModels=e.getModel=e.onDidChangeMarkers=e.getModelMarkers=e.setModelMarkers=e.setModelLanguage=e.createModel=e.createDiffNavigator=e.createDiffEditor=e.onDidCreateEditor=e.create=void 0;function F(he,re,ce){let me=new t.DynamicStandaloneServices(he,re),Ce=null;me.has(s.ITextModelService)||(Ce=new i.SimpleEditorModelResolverService(t.StaticServices.modelService.get()),me.set(s.ITextModelService,Ce)),me.has(I.IOpenerService)||me.set(I.IOpenerService,new N.OpenerService(me.get(b.ICodeEditorService),me.get(h.ICommandService)));let be=ce(me);return Ce&&Ce.setEditor(be),be}function D(he,re,ce){return F(he,ce||{},me=>new n.StandaloneEditor(he,re,me,me.get(v.IInstantiationService),me.get(b.ICodeEditorService),me.get(h.ICommandService),me.get(_.IContextKeyService),me.get(y.IKeybindingService),me.get(f.IContextViewService),me.get(l.IStandaloneThemeService),me.get(L.INotificationService),me.get(m.IConfigurationService),me.get(k.IAccessibilityService),me.get(B.IModelService),me.get(o.IModeService)))}e.create=D;function R(he){return t.StaticServices.codeEditorService.get().onCodeEditorAdd(re=>{he(re)})}e.onDidCreateEditor=R;function W(he,re,ce){return F(he,ce||{},me=>new n.StandaloneDiffEditor(he,re,me,me.get(v.IInstantiationService),me.get(_.IContextKeyService),me.get(y.IKeybindingService),me.get(f.IContextViewService),me.get(c.IEditorWorkerService),me.get(b.ICodeEditorService),me.get(l.IStandaloneThemeService),me.get(L.INotificationService),me.get(m.IConfigurationService),me.get(f.IContextMenuService),me.get(T.IEditorProgressService),me.get(O.IClipboardService)))}e.createDiffEditor=W;function x(he,re){return new M.DiffNavigator(he,re)}e.createDiffNavigator=x;function K(he,re,ce){return n.createTextModel(t.StaticServices.modelService.get(),t.StaticServices.modeService.get(),he,re,ce)}e.createModel=K;function Y(he,re){t.StaticServices.modelService.get().setMode(he,t.StaticServices.modeService.get().create(re))}e.setModelLanguage=Y;function ee(he,re,ce){he&&t.StaticServices.markerService.get().changeOne(re,he.uri,ce)}e.setModelMarkers=ee;function se(he){return t.StaticServices.markerService.get().read(he)}e.getModelMarkers=se;function ne(he){return t.StaticServices.markerService.get().onMarkerChanged(he)}e.onDidChangeMarkers=ne;function le(he){return t.StaticServices.modelService.get().getModel(he)}e.getModel=le;function X(){return t.StaticServices.modelService.get().getModels()}e.getModels=X;function z(he){return t.StaticServices.modelService.get().onModelAdded(he)}e.onDidCreateModel=z;function P(he){return t.StaticServices.modelService.get().onModelRemoved(he)}e.onWillDisposeModel=P;function V(he){return t.StaticServices.modelService.get().onModelModeChanged(re=>{he({model:re.model,oldLanguage:re.oldModeId})})}e.onDidChangeModelLanguage=V;function U(he){return a.createWebWorker(t.StaticServices.modelService.get(),he)}e.createWebWorker=U;function H(he,re){const ce=t.StaticServices.standaloneThemeService.get();return ce.registerEditorContainer(he),r.Colorizer.colorizeElement(ce,t.StaticServices.modeService.get(),he,re)}e.colorizeElement=H;function $(he,re,ce){return t.StaticServices.standaloneThemeService.get().registerEditorContainer(document.body),r.Colorizer.colorize(t.StaticServices.modeService.get(),he,re,ce)}e.colorize=$;function ie(he,re,ce=4){return t.StaticServices.standaloneThemeService.get().registerEditorContainer(document.body),r.Colorizer.colorizeModelLine(he,re,ce)}e.colorizeModelLine=ie;function oe(he){let re=g.TokenizationRegistry.get(he);return re||{getInitialState:()=>p.NULL_STATE,tokenize:(ce,me,Ce,be)=>p.nullTokenize(he,ce,Ce,be)}}function ae(he,re){t.StaticServices.modeService.get().triggerMode(re);let me=oe(re),Ce=A.splitLines(he),be=[],Le=me.getInitialState();for(let De=0,Re=Ce.length;De{H.getId()===P&&(U.dispose(),V())});return U}e.onLanguage=u;function r(P,V){let U=g.StaticServices.modeService.get().getLanguageIdentifier(P);if(!U)throw new Error(`Cannot set configuration for unknown language ${P}`);return S.LanguageConfigurationRegistry.register(U,V,100)}e.setLanguageConfiguration=r;class i{constructor(V,U){this._languageIdentifier=V,this._actual=U}getInitialState(){return this._actual.getInitialState()}tokenize(V,U,H,$){if(typeof this._actual.tokenize=="function")return n.adaptTokenize(this._languageIdentifier.language,this._actual,V,H,$);throw new Error("Not supported!")}tokenize2(V,U,H){let $=this._actual.tokenizeEncoded(V,H);return new M.TokenizationResult2($.tokens,$.endState)}}e.EncodedTokenizationSupport2Adapter=i;class n{constructor(V,U,H){this._standaloneThemeService=V,this._languageIdentifier=U,this._actual=H}getInitialState(){return this._actual.getInitialState()}static _toClassicTokens(V,U,H){let $=[],ie=0;for(let oe=0,ae=V.length;oe0&&ie[oe-1]===ue)){let he=Z.startIndex;j===0?he=0:het($)?new i(U,$):new n(g.StaticServices.standaloneThemeService.get(),U,$);return l(V)?w.TokenizationRegistry.registerPromise(P,V.then($=>H($))):w.TokenizationRegistry.register(P,H(V))}e.setTokensProvider=m;function _(P,V){const U=H=>c.createTokenizationSupport(g.StaticServices.modeService.get(),g.StaticServices.standaloneThemeService.get(),P,p.compile(P,H));return l(V)?w.TokenizationRegistry.registerPromise(P,V.then(H=>U(H))):w.TokenizationRegistry.register(P,U(V))}e.setMonarchTokensProvider=_;function f(P,V){return w.ReferenceProviderRegistry.register(P,V)}e.registerReferenceProvider=f;function v(P,V){return w.RenameProviderRegistry.register(P,V)}e.registerRenameProvider=v;function y(P,V){return w.SignatureHelpProviderRegistry.register(P,V)}e.registerSignatureHelpProvider=y;function L(P,V){return w.HoverProviderRegistry.register(P,{provideHover:(U,H,$)=>{let ie=U.getWordAtPosition(H);return Promise.resolve(V.provideHover(U,H,$)).then(oe=>{if(!!oe)return!oe.range&&ie&&(oe.range=new N.Range(H.lineNumber,ie.startColumn,H.lineNumber,ie.endColumn)),oe.range||(oe.range=new N.Range(H.lineNumber,H.column,H.lineNumber,H.column)),oe})}})}e.registerHoverProvider=L;function I(P,V){return w.DocumentSymbolProviderRegistry.register(P,V)}e.registerDocumentSymbolProvider=I;function k(P,V){return w.DocumentHighlightProviderRegistry.register(P,V)}e.registerDocumentHighlightProvider=k;function E(P,V){return w.LinkedEditingRangeProviderRegistry.register(P,V)}e.registerLinkedEditingRangeProvider=E;function T(P,V){return w.DefinitionProviderRegistry.register(P,V)}e.registerDefinitionProvider=T;function O(P,V){return w.ImplementationProviderRegistry.register(P,V)}e.registerImplementationProvider=O;function A(P,V){return w.TypeDefinitionProviderRegistry.register(P,V)}e.registerTypeDefinitionProvider=A;function B(P,V){return w.CodeLensProviderRegistry.register(P,V)}e.registerCodeLensProvider=B;function F(P,V){return w.CodeActionProviderRegistry.register(P,{provideCodeActions:(U,H,$,ie)=>{let oe=g.StaticServices.markerService.get().read({resource:U.uri}).filter(ae=>N.Range.areIntersectingOrTouching(ae,H));return V.provideCodeActions(U,H,{markers:oe,only:$.only},ie)}})}e.registerCodeActionProvider=F;function D(P,V){return w.DocumentFormattingEditProviderRegistry.register(P,V)}e.registerDocumentFormattingEditProvider=D;function R(P,V){return w.DocumentRangeFormattingEditProviderRegistry.register(P,V)}e.registerDocumentRangeFormattingEditProvider=R;function W(P,V){return w.OnTypeFormattingEditProviderRegistry.register(P,V)}e.registerOnTypeFormattingEditProvider=W;function x(P,V){return w.LinkProviderRegistry.register(P,V)}e.registerLinkProvider=x;function K(P,V){return w.CompletionProviderRegistry.register(P,V)}e.registerCompletionItemProvider=K;function Y(P,V){return w.ColorProviderRegistry.register(P,V)}e.registerColorProvider=Y;function ee(P,V){return w.FoldingRangeProviderRegistry.register(P,V)}e.registerFoldingRangeProvider=ee;function se(P,V){return w.DeclarationProviderRegistry.register(P,V)}e.registerDeclarationProvider=se;function ne(P,V){return w.SelectionRangeRegistry.register(P,V)}e.registerSelectionRangeProvider=ne;function le(P,V){return w.DocumentSemanticTokensProviderRegistry.register(P,V)}e.registerDocumentSemanticTokensProvider=le;function X(P,V){return w.DocumentRangeSemanticTokensProviderRegistry.register(P,V)}e.registerDocumentRangeSemanticTokensProvider=X;function z(){return{register:o,getLanguages:s,onLanguage:u,getEncodedLanguageId:a,setLanguageConfiguration:r,setColorMap:h,setTokensProvider:m,setMonarchTokensProvider:_,registerReferenceProvider:f,registerRenameProvider:v,registerCompletionItemProvider:K,registerSignatureHelpProvider:y,registerHoverProvider:L,registerDocumentSymbolProvider:I,registerDocumentHighlightProvider:k,registerLinkedEditingRangeProvider:E,registerDefinitionProvider:T,registerImplementationProvider:O,registerTypeDefinitionProvider:A,registerCodeLensProvider:B,registerCodeActionProvider:F,registerDocumentFormattingEditProvider:D,registerDocumentRangeFormattingEditProvider:R,registerOnTypeFormattingEditProvider:W,registerLinkProvider:x,registerColorProvider:Y,registerFoldingRangeProvider:ee,registerDeclarationProvider:se,registerSelectionRangeProvider:ne,registerDocumentSemanticTokensProvider:le,registerDocumentRangeSemanticTokensProvider:X,DocumentHighlightKind:d.DocumentHighlightKind,CompletionItemKind:d.CompletionItemKind,CompletionItemTag:d.CompletionItemTag,CompletionItemInsertTextRule:d.CompletionItemInsertTextRule,SymbolKind:d.SymbolKind,SymbolTag:d.SymbolTag,IndentAction:d.IndentAction,CompletionTriggerKind:d.CompletionTriggerKind,SignatureHelpTriggerKind:d.SignatureHelpTriggerKind,InlineHintKind:d.InlineHintKind,FoldingRangeKind:w.FoldingRangeKind}}e.createMonacoLanguagesAPI=z}),define(Q[677],J([0,1,38,220,675,676,17,261]),function(q,e,b,N,M,w,S,C){"use strict";var d;Object.defineProperty(e,"__esModule",{value:!0}),e.languages=e.editor=e.Token=e.Uri=e.MarkerTag=e.MarkerSeverity=e.SelectionDirection=e.Selection=e.Range=e.Position=e.KeyMod=e.KeyCode=e.Emitter=e.CancellationTokenSource=void 0,b.EditorOptions.wrappingIndent.defaultValue=0,b.EditorOptions.glyphMargin.defaultValue=!1,b.EditorOptions.autoIndent.defaultValue=3,b.EditorOptions.overviewRulerLanes.defaultValue=2,C.FormattingConflicts.setFormatterSelector((p,c,o)=>Promise.resolve(p[0]));const g=N.createMonacoBaseAPI();g.editor=M.createMonacoEditorAPI(),g.languages=w.createMonacoLanguagesAPI(),e.CancellationTokenSource=g.CancellationTokenSource,e.Emitter=g.Emitter,e.KeyCode=g.KeyCode,e.KeyMod=g.KeyMod,e.Position=g.Position,e.Range=g.Range,e.Selection=g.Selection,e.SelectionDirection=g.SelectionDirection,e.MarkerSeverity=g.MarkerSeverity,e.MarkerTag=g.MarkerTag,e.Uri=g.Uri,e.Token=g.Token,e.editor=g.editor,e.languages=g.languages,(((d=S.globals.MonacoEnvironment)===null||d===void 0?void 0:d.globalAPI)||typeof define=="function"&&define.amd)&&(self.monaco=g),typeof self.require!="undefined"&&typeof self.require.config=="function"&&self.require.config({ignoreDuplicateModules:["vscode-languageserver-types","vscode-languageserver-types/main","vscode-languageserver-textdocument","vscode-languageserver-textdocument/main","vscode-nls","vscode-nls/vscode-nls","jsonc-parser","jsonc-parser/main","vscode-uri","vscode-uri/index","vs/basic-languages/typescript/typescript"]})}),define(Q[678],J([0,1,24]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toWorkspaceIdentifier=e.isSingleFolderWorkspaceIdentifier=e.WORKSPACE_EXTENSION=void 0,e.WORKSPACE_EXTENSION="code-workspace";function N(w){const S=w;return typeof(S==null?void 0:S.id)=="string"&&b.URI.isUri(S.uri)}e.isSingleFolderWorkspaceIdentifier=N;function M(w){if(w.configuration)return{id:w.id,configPath:w.configuration};if(w.folders.length===1)return{id:w.id,uri:w.folders[0].uri}}e.toWorkspaceIdentifier=M}),define(Q[679],J([0,1,506,72,44,131,41,8,678,159,292]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RandomBasedVariableResolver=e.WorkspaceBasedVariableResolver=e.TimeBasedVariableResolver=e.CommentBasedVariableResolver=e.ClipboardBasedVariableResolver=e.ModelBasedVariableResolver=e.SelectionBasedVariableResolver=e.CompositeSnippetVariableResolver=void 0;class c{constructor(l){this._delegates=l}resolve(l){for(const h of this._delegates){let m=h.resolve(l);if(m!==void 0)return m}}}e.CompositeSnippetVariableResolver=c;class o{constructor(l,h,m,_){this._model=l,this._selection=h,this._selectionIdx=m,this._overtypingCapturer=_}resolve(l){const{name:h}=l;if(h==="SELECTION"||h==="TM_SELECTED_TEXT"){let m=this._model.getValueInRange(this._selection)||void 0,_=this._selection.startLineNumber!==this._selection.endLineNumber;if(!m&&this._overtypingCapturer){const f=this._overtypingCapturer.getLastOvertypedInfo(this._selectionIdx);f&&(m=f.value,_=f.multiline)}if(m&&_&&l.snippet){const f=this._model.getLineContent(this._selection.startLineNumber),v=C.getLeadingWhitespace(f,0,this._selection.startColumn-1);let y=v;l.snippet.walk(I=>I===l?!1:(I instanceof w.Text&&(y=C.getLeadingWhitespace(C.splitLines(I.value).pop())),!0));const L=C.commonPrefixLength(y,v);m=m.replace(/(\r\n|\r|\n)(.*)/g,(I,k,E)=>`${k}${y.substr(L)}${E}`)}return m}else{if(h==="TM_CURRENT_LINE")return this._model.getLineContent(this._selection.positionLineNumber);if(h==="TM_CURRENT_WORD"){const m=this._model.getWordAtPosition({lineNumber:this._selection.positionLineNumber,column:this._selection.positionColumn});return m&&m.word||void 0}else{if(h==="TM_LINE_INDEX")return String(this._selection.positionLineNumber-1);if(h==="TM_LINE_NUMBER")return String(this._selection.positionLineNumber)}}}}e.SelectionBasedVariableResolver=o;class s{constructor(l,h){this._labelService=l,this._model=h}resolve(l){const{name:h}=l;if(h==="TM_FILENAME")return N.basename(this._model.uri.fsPath);if(h==="TM_FILENAME_BASE"){const m=N.basename(this._model.uri.fsPath),_=m.lastIndexOf(".");return _<=0?m:m.slice(0,_)}else{if(h==="TM_DIRECTORY"&&this._labelService)return N.dirname(this._model.uri.fsPath)==="."?"":this._labelService.getUriLabel(M.dirname(this._model.uri));if(h==="TM_FILEPATH"&&this._labelService)return this._labelService.getUriLabel(this._model.uri);if(h==="RELATIVE_FILEPATH"&&this._labelService)return this._labelService.getUriLabel(this._model.uri,{relative:!0,noPrefix:!0})}}}e.ModelBasedVariableResolver=s;class a{constructor(l,h,m,_){this._readClipboardText=l,this._selectionIdx=h,this._selectionCount=m,this._spread=_}resolve(l){if(l.name==="CLIPBOARD"){const h=this._readClipboardText();if(!!h){if(this._spread){const m=h.split(/\r\n|\n|\r/).filter(_=>!C.isFalsyOrWhitespace(_));if(m.length===this._selectionCount)return m[this._selectionIdx]}return h}}}}e.ClipboardBasedVariableResolver=a;class u{constructor(l,h){this._model=l,this._selection=h}resolve(l){const{name:h}=l,m=this._model.getLanguageIdAtPosition(this._selection.selectionStartLineNumber,this._selection.selectionStartColumn),_=S.LanguageConfigurationRegistry.getComments(m);if(!!_){if(h==="LINE_COMMENT")return _.lineCommentToken||void 0;if(h==="BLOCK_COMMENT_START")return _.blockCommentStartToken||void 0;if(h==="BLOCK_COMMENT_END")return _.blockCommentEndToken||void 0}}}e.CommentBasedVariableResolver=u;class r{resolve(l){const{name:h}=l;if(h==="CURRENT_YEAR")return String(new Date().getFullYear());if(h==="CURRENT_YEAR_SHORT")return String(new Date().getFullYear()).slice(-2);if(h==="CURRENT_MONTH")return String(new Date().getMonth().valueOf()+1).padStart(2,"0");if(h==="CURRENT_DATE")return String(new Date().getDate().valueOf()).padStart(2,"0");if(h==="CURRENT_HOUR")return String(new Date().getHours().valueOf()).padStart(2,"0");if(h==="CURRENT_MINUTE")return String(new Date().getMinutes().valueOf()).padStart(2,"0");if(h==="CURRENT_SECOND")return String(new Date().getSeconds().valueOf()).padStart(2,"0");if(h==="CURRENT_DAY_NAME")return r.dayNames[new Date().getDay()];if(h==="CURRENT_DAY_NAME_SHORT")return r.dayNamesShort[new Date().getDay()];if(h==="CURRENT_MONTH_NAME")return r.monthNames[new Date().getMonth()];if(h==="CURRENT_MONTH_NAME_SHORT")return r.monthNamesShort[new Date().getMonth()];if(h==="CURRENT_SECONDS_UNIX")return String(Math.floor(Date.now()/1e3))}}e.TimeBasedVariableResolver=r,r.dayNames=[b.localize(0,null),b.localize(1,null),b.localize(2,null),b.localize(3,null),b.localize(4,null),b.localize(5,null),b.localize(6,null)],r.dayNamesShort=[b.localize(7,null),b.localize(8,null),b.localize(9,null),b.localize(10,null),b.localize(11,null),b.localize(12,null),b.localize(13,null)],r.monthNames=[b.localize(14,null),b.localize(15,null),b.localize(16,null),b.localize(17,null),b.localize(18,null),b.localize(19,null),b.localize(20,null),b.localize(21,null),b.localize(22,null),b.localize(23,null),b.localize(24,null),b.localize(25,null)],r.monthNamesShort=[b.localize(26,null),b.localize(27,null),b.localize(28,null),b.localize(29,null),b.localize(30,null),b.localize(31,null),b.localize(32,null),b.localize(33,null),b.localize(34,null),b.localize(35,null),b.localize(36,null),b.localize(37,null)];class i{constructor(l){this._workspaceService=l}resolve(l){if(!!this._workspaceService){const h=d.toWorkspaceIdentifier(this._workspaceService.getWorkspace());if(!!h){if(l.name==="WORKSPACE_NAME")return this._resolveWorkspaceName(h);if(l.name==="WORKSPACE_FOLDER")return this._resoveWorkspacePath(h)}}}_resolveWorkspaceName(l){if(d.isSingleFolderWorkspaceIdentifier(l))return N.basename(l.uri.path);let h=N.basename(l.configPath.path);return h.endsWith(d.WORKSPACE_EXTENSION)&&(h=h.substr(0,h.length-d.WORKSPACE_EXTENSION.length-1)),h}_resoveWorkspacePath(l){if(d.isSingleFolderWorkspaceIdentifier(l))return g.normalizeDriveLetter(l.uri.fsPath);let h=N.basename(l.configPath.path),m=l.configPath.fsPath;return m.endsWith(h)&&(m=m.substr(0,m.length-h.length-1)),m?g.normalizeDriveLetter(m):"/"}}e.WorkspaceBasedVariableResolver=i;class n{resolve(l){const{name:h}=l;if(h==="RANDOM")return Math.random().toString().slice(-6);if(h==="RANDOM_HEX")return Math.random().toString(16).slice(-6);if(h==="UUID")return p.generateUuid()}}e.RandomBasedVariableResolver=n}),define(Q[680],J([0,1,19,2,8,62,3,21,31,190,9,131,679,11,22,115,351]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetSession=e.OneSnippet=void 0,s.registerThemingParticipant((t,l)=>{function h(m){const _=t.getColor(m);return _?_.toString():"transparent"}l.addRule(`.monaco-editor .snippet-placeholder { background-color: ${h(a.snippetTabstopHighlightBackground)}; outline-color: ${h(a.snippetTabstopHighlightBorder)}; }`),l.addRule(`.monaco-editor .finish-snippet-placeholder { background-color: ${h(a.snippetFinalTabstopHighlightBackground)}; outline-color: ${h(a.snippetFinalTabstopHighlightBorder)}; }`)});class r{constructor(l,h,m,_){this._editor=l,this._snippet=h,this._offset=m,this._snippetLineLeadingWhitespace=_,this._nestingLevel=1,this._placeholderGroups=b.groupBy(h.placeholders,c.Placeholder.compareByIndex),this._placeholderGroupsIdx=-1}dispose(){this._placeholderDecorations&&this._editor.deltaDecorations([...this._placeholderDecorations.values()],[]),this._placeholderGroups.length=0}_initDecorations(){if(!this._placeholderDecorations){this._placeholderDecorations=new Map;const l=this._editor.getModel();this._editor.changeDecorations(h=>{for(const m of this._snippet.placeholders){const _=this._snippet.offset(m),f=this._snippet.fullLen(m),v=S.Range.fromPositions(l.getPositionAt(this._offset+_),l.getPositionAt(this._offset+_+f)),y=m.isFinalTabstop?r._decor.inactiveFinal:r._decor.inactive,L=h.addDecoration(v,y);this._placeholderDecorations.set(m,L)}})}}move(l){if(!this._editor.hasModel())return[];if(this._initDecorations(),this._placeholderGroupsIdx>=0){let _=[];for(const f of this._placeholderGroups[this._placeholderGroupsIdx])if(f.transform){const v=this._placeholderDecorations.get(f),y=this._editor.getModel().getDecorationRange(v),L=this._editor.getModel().getValueInRange(y),I=f.transform.resolve(L).split(/\r\n|\r|\n/);for(let k=1;k0&&this._editor.executeEdits("snippet.placeholderTransform",_)}let h=!1;l===!0&&this._placeholderGroupsIdx0&&(this._placeholderGroupsIdx-=1,h=!0);const m=this._editor.getModel().changeDecorations(_=>{const f=new Set,v=[];for(const y of this._placeholderGroups[this._placeholderGroupsIdx]){const L=this._placeholderDecorations.get(y),I=this._editor.getModel().getDecorationRange(L);v.push(new C.Selection(I.startLineNumber,I.startColumn,I.endLineNumber,I.endColumn)),h=h&&this._hasPlaceholderBeenCollapsed(y),_.changeDecorationOptions(L,y.isFinalTabstop?r._decor.activeFinal:r._decor.active),f.add(y);for(const k of this._snippet.enclosingPlaceholders(y)){const E=this._placeholderDecorations.get(k);_.changeDecorationOptions(E,k.isFinalTabstop?r._decor.activeFinal:r._decor.active),f.add(k)}}for(const[y,L]of this._placeholderDecorations)f.has(y)||_.changeDecorationOptions(L,y.isFinalTabstop?r._decor.inactiveFinal:r._decor.inactive);return v});return h?this.move(l):m!=null?m:[]}_hasPlaceholderBeenCollapsed(l){let h=l;for(;h;){if(h instanceof c.Placeholder){const m=this._placeholderDecorations.get(h);if(this._editor.getModel().getDecorationRange(m).isEmpty()&&h.toString().length>0)return!0}h=h.parent}return!1}get isAtFirstPlaceholder(){return this._placeholderGroupsIdx<=0||this._placeholderGroups.length===0}get isAtLastPlaceholder(){return this._placeholderGroupsIdx===this._placeholderGroups.length-1}get hasPlaceholder(){return this._snippet.placeholders.length>0}computePossibleSelections(){const l=new Map;for(const h of this._placeholderGroups){let m;for(const _ of h){if(_.isFinalTabstop)break;m||(m=[],l.set(_.index,m));const f=this._placeholderDecorations.get(_),v=this._editor.getModel().getDecorationRange(f);if(!v){l.delete(_.index);break}m.push(v)}}return l}get choice(){return this._placeholderGroups[this._placeholderGroupsIdx][0].choice}merge(l){const h=this._editor.getModel();this._nestingLevel*=10,this._editor.changeDecorations(m=>{for(const _ of this._placeholderGroups[this._placeholderGroupsIdx]){const f=l.shift();console.assert(!f._placeholderDecorations);const v=f._snippet.placeholderInfo.last.index;for(const L of f._snippet.placeholderInfo.all)L.isFinalTabstop?L.index=_.index+(v+1)/this._nestingLevel:L.index=_.index+L.index/this._nestingLevel;this._snippet.replace(_,f._snippet.children);const y=this._placeholderDecorations.get(_);m.removeDecoration(y),this._placeholderDecorations.delete(_);for(const L of f._snippet.placeholders){const I=f._snippet.offset(L),k=f._snippet.fullLen(L),E=S.Range.fromPositions(h.getPositionAt(f._offset+I),h.getPositionAt(f._offset+I+k)),T=m.addDecoration(E,r._decor.inactive);this._placeholderDecorations.set(L,T)}}this._placeholderGroups=b.groupBy(this._snippet.placeholders,c.Placeholder.compareByIndex)})}}e.OneSnippet=r,r._decor={active:d.ModelDecorationOptions.register({stickiness:0,className:"snippet-placeholder"}),inactive:d.ModelDecorationOptions.register({stickiness:1,className:"snippet-placeholder"}),activeFinal:d.ModelDecorationOptions.register({stickiness:1,className:"finish-snippet-placeholder"}),inactiveFinal:d.ModelDecorationOptions.register({stickiness:1,className:"finish-snippet-placeholder"})};const i={overwriteBefore:0,overwriteAfter:0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};class n{constructor(l,h,m=i){this._templateMerges=[],this._snippets=[],this._editor=l,this._template=h,this._options=m}static adjustWhitespace(l,h,m,_,f){const v=l.getLineContent(h.lineNumber),y=M.getLeadingWhitespace(v,0,h.column-1);let L;return m.walk(I=>{if(!(I instanceof c.Text)||I.parent instanceof c.Choice)return!0;const k=I.value.split(/\r\n|\r|\n/);if(_){const T=m.offset(I);if(T===0)k[0]=l.normalizeIndentation(k[0]);else{L=L!=null?L:m.toString();let O=L.charCodeAt(T-1);(O===10||O===13)&&(k[0]=l.normalizeIndentation(y+k[0]))}for(let O=1;Ox.get(g.IWorkspaceContextService,p.optional)),O=l.invokeWithinContext(x=>new o.ModelBasedVariableResolver(x.get(u.ILabelService,p.optional),E)),A=()=>y;let B=0,F=E.getValueInRange(n.adjustSelection(E,l.getSelection(),m,0)),D=E.getValueInRange(n.adjustSelection(E,l.getSelection(),0,_)),R=E.getLineFirstNonWhitespaceColumn(l.getSelection().positionLineNumber);const W=l.getSelections().map((x,K)=>({selection:x,idx:K})).sort((x,K)=>S.Range.compareRangesUsingStarts(x.selection,K.selection));for(const{selection:x,idx:K}of W){let Y=n.adjustSelection(E,x,m,0),ee=n.adjustSelection(E,x,0,_);F!==E.getValueInRange(Y)&&(Y=x),D!==E.getValueInRange(ee)&&(ee=x);const se=x.setStartPosition(Y.startLineNumber,Y.startColumn).setEndPosition(ee.endLineNumber,ee.endColumn),ne=new c.SnippetParser().parse(h,!0,f),le=se.getStartPosition(),X=n.adjustWhitespace(E,le,ne,v||K>0&&R!==E.getLineFirstNonWhitespaceColumn(x.positionLineNumber),!0);ne.resolveVariables(new o.CompositeSnippetVariableResolver([O,new o.ClipboardBasedVariableResolver(A,K,W.length,l.getOption(65)==="spread"),new o.SelectionBasedVariableResolver(E,x,K,L),new o.CommentBasedVariableResolver(E,x),new o.TimeBasedVariableResolver,new o.WorkspaceBasedVariableResolver(T),new o.RandomBasedVariableResolver]));const z=E.getOffsetAt(le)+B;B+=ne.toString().length-E.getValueLengthInRange(se),I[K]=w.EditOperation.replace(se,ne.toString()),I[K].identifier={major:K,minor:0},k[K]=new r(l,ne,z,X)}return{edits:I,snippets:k}}dispose(){N.dispose(this._snippets)}_logInfo(){return`template="${this._template}", merged_templates="${this._templateMerges.join(" -> ")}"`}insert(){if(!!this._editor.hasModel()){const{edits:l,snippets:h}=n.createEditsAndSnippets(this._editor,this._template,this._options.overwriteBefore,this._options.overwriteAfter,!1,this._options.adjustWhitespace,this._options.clipboardText,this._options.overtypingCapturer);this._snippets=h,this._editor.executeEdits("snippet",l,m=>this._snippets[0].hasPlaceholder?this._move(!0):m.filter(_=>!!_.identifier).map(_=>C.Selection.fromPositions(_.range.getEndPosition()))),this._editor.revealRange(this._editor.getSelections()[0])}}merge(l,h=i){if(!!this._editor.hasModel()){this._templateMerges.push([this._snippets[0]._nestingLevel,this._snippets[0]._placeholderGroupsIdx,l]);const{edits:m,snippets:_}=n.createEditsAndSnippets(this._editor,l,h.overwriteBefore,h.overwriteAfter,!0,h.adjustWhitespace,h.clipboardText,h.overtypingCapturer);this._editor.executeEdits("snippet",m,f=>{for(const v of this._snippets)v.merge(_);return console.assert(_.length===0),this._snippets[0].hasPlaceholder?this._move(void 0):f.filter(v=>!!v.identifier).map(v=>C.Selection.fromPositions(v.range.getEndPosition()))})}}next(){const l=this._move(!0);this._editor.setSelections(l),this._editor.revealPositionInCenterIfOutsideViewport(l[0].getPosition())}prev(){const l=this._move(!1);this._editor.setSelections(l),this._editor.revealPositionInCenterIfOutsideViewport(l[0].getPosition())}_move(l){const h=[];for(const m of this._snippets){const _=m.move(l);h.push(..._)}return h}get isAtFirstPlaceholder(){return this._snippets[0].isAtFirstPlaceholder}get isAtLastPlaceholder(){return this._snippets[0].isAtLastPlaceholder}get hasPlaceholder(){return this._snippets[0].hasPlaceholder}get choice(){return this._snippets[0].choice}isSelectionWithinPlaceholders(){if(!this.hasPlaceholder)return!1;const l=this._editor.getSelections();if(l.length{f.push(..._.get(v))})}l.sort(S.Range.compareRangesUsingStarts);for(let[m,_]of h){if(_.length!==l.length){h.delete(m);continue}_.sort(S.Range.compareRangesUsingStarts);for(let f=0;f<_.length;f++)if(!_[f].containsRange(l[f])){h.delete(m);continue}}return h.size>0}}e.SnippetSession=n}),define(Q[192],J([0,1,2,13,3,21,25,117,16,77,680]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetController2=void 0;const c={overwriteBefore:0,overwriteAfter:0,undoStopBefore:!0,undoStopAfter:!0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};let o=class ot{constructor(u,r,i){this._editor=u,this._logService=r,this._snippetListener=new b.DisposableStore,this._modelVersionId=-1,this._inSnippet=ot.InSnippetMode.bindTo(i),this._hasNextTabstop=ot.HasNextTabstop.bindTo(i),this._hasPrevTabstop=ot.HasPrevTabstop.bindTo(i)}static get(u){return u.getContribution(ot.ID)}dispose(){var u;this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),(u=this._session)===null||u===void 0||u.dispose(),this._snippetListener.dispose()}insert(u,r){try{this._doInsert(u,typeof r=="undefined"?c:Object.assign(Object.assign({},c),r))}catch(i){this.cancel(),this._logService.error(i),this._logService.error("snippet_error"),this._logService.error("insert_template=",u),this._logService.error("existing_template=",this._session?this._session._logInfo():"")}}_doInsert(u,r){!this._editor.hasModel()||(this._snippetListener.clear(),r.undoStopBefore&&this._editor.getModel().pushStackElement(),this._session?this._session.merge(u,r):(this._modelVersionId=this._editor.getModel().getAlternativeVersionId(),this._session=new p.SnippetSession(this._editor,u,r),this._session.insert()),r.undoStopAfter&&this._editor.getModel().pushStackElement(),this._updateState(),this._snippetListener.add(this._editor.onDidChangeModelContent(i=>i.isFlush&&this.cancel())),this._snippetListener.add(this._editor.onDidChangeModel(()=>this.cancel())),this._snippetListener.add(this._editor.onDidChangeCursorSelection(()=>this._updateState())))}_updateState(){if(!(!this._session||!this._editor.hasModel())){if(this._modelVersionId===this._editor.getModel().getAlternativeVersionId())return this.cancel();if(!this._session.hasPlaceholder)return this.cancel();if(this._session.isAtLastPlaceholder||!this._session.isSelectionWithinPlaceholders())return this.cancel();this._inSnippet.set(!0),this._hasPrevTabstop.set(!this._session.isAtFirstPlaceholder),this._hasNextTabstop.set(!this._session.isAtLastPlaceholder),this._handleChoice()}}_handleChoice(){if(!this._session||!this._editor.hasModel()){this._currentChoice=void 0;return}const{choice:u}=this._session;if(!u){this._currentChoice=void 0;return}if(this._currentChoice!==u){this._currentChoice=u,this._editor.setSelections(this._editor.getSelections().map(i=>w.Selection.fromPositions(i.getStartPosition())));const[r]=u.options;C.showSimpleSuggestions(this._editor,u.options.map((i,n)=>({kind:13,label:i.value,insertText:i.value,sortText:"a".repeat(n+1),range:M.Range.fromPositions(this._editor.getPosition(),this._editor.getPosition().delta(0,r.value.length))})))}}finish(){for(;this._inSnippet.get();)this.next()}cancel(u=!1){var r;this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),this._snippetListener.clear(),(r=this._session)===null||r===void 0||r.dispose(),this._session=void 0,this._modelVersionId=-1,u&&this._editor.setSelections([this._editor.getSelection()])}prev(){this._session&&this._session.prev(),this._updateState()}next(){this._session&&this._session.next(),this._updateState()}isInSnippet(){return Boolean(this._inSnippet.get())}};o.ID="snippetController2",o.InSnippetMode=new d.RawContextKey("inSnippetMode",!1),o.HasNextTabstop=new d.RawContextKey("hasNextTabstop",!1),o.HasPrevTabstop=new d.RawContextKey("hasPrevTabstop",!1),o=Me([_e(1,g.ILogService),_e(2,d.IContextKeyService)],o),e.SnippetController2=o,N.registerEditorContribution(o.ID,o);const s=N.EditorCommand.bindToContribution(o.get);N.registerEditorCommand(new s({id:"jumpToNextSnippetPlaceholder",precondition:d.ContextKeyExpr.and(o.InSnippetMode,o.HasNextTabstop),handler:a=>a.next(),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:2}})),N.registerEditorCommand(new s({id:"jumpToPrevSnippetPlaceholder",precondition:d.ContextKeyExpr.and(o.InSnippetMode,o.HasPrevTabstop),handler:a=>a.prev(),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:1024|2}})),N.registerEditorCommand(new s({id:"leaveSnippet",precondition:o.InSnippetMode,handler:a=>a.cancel(!0),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:9,secondary:[1024|9]}})),N.registerEditorCommand(new s({id:"acceptSnippet",precondition:o.InSnippetMode,handler:a=>a.finish()}))}),define(Q[681],J([0,1,15,12,6,2,21,18,413,117,192,23,75,416,8,84,87,77]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestModel=e.LineContext=void 0;class n{constructor(h,m,_,f){this.leadingLineContent=h.getLineContent(m.lineNumber).substr(0,m.column-1),this.leadingWord=h.getWordUntilPosition(m),this.lineNumber=m.lineNumber,this.column=m.column,this.auto=_,this.shy=f}static shouldAutoTrigger(h){if(!h.hasModel())return!1;const m=h.getModel(),_=h.getPosition();m.tokenizeIfCheap(_.lineNumber);const f=m.getWordAtPosition(_);return!(!f||f.endColumn!==_.column||!isNaN(Number(f.word)))}}e.LineContext=n;let t=class ti{constructor(h,m,_,f,v){this._editor=h,this._editorWorkerService=m,this._clipboardService=_,this._telemetryService=f,this._logService=v,this._toDispose=new w.DisposableStore,this._quickSuggestDelay=10,this._triggerCharacterListener=new w.DisposableStore,this._triggerQuickSuggest=new b.TimeoutTimer,this._state=0,this._completionDisposables=new w.DisposableStore,this._onDidCancel=new M.Emitter,this._onDidTrigger=new M.Emitter,this._onDidSuggest=new M.Emitter,this.onDidCancel=this._onDidCancel.event,this.onDidTrigger=this._onDidTrigger.event,this.onDidSuggest=this._onDidSuggest.event,this._telemetryGate=0,this._currentSelection=this._editor.getSelection()||new S.Selection(1,1,1,1),this._toDispose.add(this._editor.onDidChangeModel(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeModelLanguage(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeConfiguration(()=>{this._updateTriggerCharacters(),this._updateQuickSuggest()})),this._toDispose.add(C.CompletionProviderRegistry.onDidChange(()=>{this._updateTriggerCharacters(),this._updateActiveSuggestSession()})),this._toDispose.add(this._editor.onDidChangeCursorSelection(L=>{this._onCursorChange(L)}));let y=!1;this._toDispose.add(this._editor.onDidCompositionStart(()=>{y=!0})),this._toDispose.add(this._editor.onDidCompositionEnd(()=>{y=!1,this._refilterCompletionItems()})),this._toDispose.add(this._editor.onDidChangeModelContent(()=>{y||this._refilterCompletionItems()})),this._updateTriggerCharacters(),this._updateQuickSuggest()}dispose(){w.dispose(this._triggerCharacterListener),w.dispose([this._onDidCancel,this._onDidSuggest,this._onDidTrigger,this._triggerQuickSuggest]),this._toDispose.dispose(),this._completionDisposables.dispose(),this.cancel()}_updateQuickSuggest(){this._quickSuggestDelay=this._editor.getOption(74),(isNaN(this._quickSuggestDelay)||!this._quickSuggestDelay&&this._quickSuggestDelay!==0||this._quickSuggestDelay<0)&&(this._quickSuggestDelay=10)}_updateTriggerCharacters(){if(this._triggerCharacterListener.clear(),!(this._editor.getOption(75)||!this._editor.hasModel()||!this._editor.getOption(104))){const h=new Map;for(const _ of C.CompletionProviderRegistry.all(this._editor.getModel()))for(const f of _.triggerCharacters||[]){let v=h.get(f);v||(v=new Set,v.add(g.getSnippetSuggestSupport()),h.set(f,v)),v.add(_)}const m=_=>{if(!_){const y=this._editor.getPosition();_=this._editor.getModel().getLineContent(y.lineNumber).substr(0,y.column-1)}let f="";a.isLowSurrogate(_.charCodeAt(_.length-1))?a.isHighSurrogate(_.charCodeAt(_.length-2))&&(f=_.substr(_.length-2)):f=_.charAt(_.length-1);const v=h.get(f);if(v){const y=this._completionModel?{items:this._completionModel.adopt(v),clipboardText:this._completionModel.clipboardText}:void 0;this.trigger({auto:!0,shy:!1,triggerCharacter:f},Boolean(this._completionModel),v,y)}};this._triggerCharacterListener.add(this._editor.onDidType(m)),this._triggerCharacterListener.add(this._editor.onDidCompositionEnd(m))}}get state(){return this._state}cancel(h=!1){var m;this._state!==0&&(this._triggerQuickSuggest.cancel(),(m=this._requestToken)===null||m===void 0||m.cancel(),this._requestToken=void 0,this._state=0,this._completionModel=void 0,this._context=void 0,this._onDidCancel.fire({retrigger:h}))}clear(){this._completionDisposables.clear()}_updateActiveSuggestSession(){this._state!==0&&(!this._editor.hasModel()||!C.CompletionProviderRegistry.has(this._editor.getModel())?this.cancel():this.trigger({auto:this._state===2,shy:!1},!0))}_onCursorChange(h){if(!!this._editor.hasModel()){const m=this._editor.getModel(),_=this._currentSelection;if(this._currentSelection=this._editor.getSelection(),!h.selection.isEmpty()||h.reason!==0&&h.reason!==3||h.source!=="keyboard"&&h.source!=="deleteLeft"){this.cancel();return}if(!!C.CompletionProviderRegistry.has(m))if(this._state===0&&h.reason===0){if(this._editor.getOption(73)===!1||!_.containsRange(this._currentSelection)&&!_.getEndPosition().isBeforeOrEqual(this._currentSelection.getPosition())||this._editor.getOption(101).snippetsPreventQuickSuggestions&&p.SnippetController2.get(this._editor).isInSnippet())return;this.cancel(),this._triggerQuickSuggest.cancelAndSet(()=>{if(this._state===0&&!!n.shouldAutoTrigger(this._editor)&&!!this._editor.hasModel()){const f=this._editor.getModel(),v=this._editor.getPosition(),y=this._editor.getOption(73);if(y!==!1){if(y!==!0){f.tokenizeIfCheap(v.lineNumber);const L=f.getLineTokens(v.lineNumber),I=L.getStandardTokenType(L.findTokenIndexAtOffset(Math.max(v.column-1-1,0)));if(!(y.other&&I===0||y.comments&&I===1||y.strings&&I===2))return}this.trigger({auto:!0,shy:!1})}}},this._quickSuggestDelay)}else this._state!==0&&h.reason===3&&this._refilterCompletionItems()}}_refilterCompletionItems(){Promise.resolve().then(()=>{if(this._state!==0&&!!this._editor.hasModel()){const h=this._editor.getModel(),m=this._editor.getPosition(),_=new n(h,m,this._state===2,!1);this._onNewContext(_)}})}trigger(h,m=!1,_,f){var v;if(!!this._editor.hasModel()){const y=this._editor.getModel(),L=h.auto,I=new n(y,this._editor.getPosition(),L,h.shy);this.cancel(m),this._state=L?2:1,this._onDidTrigger.fire({auto:L,shy:h.shy,position:this._editor.getPosition()}),this._context=I;let k={triggerKind:(v=h.triggerKind)!==null&&v!==void 0?v:0};h.triggerCharacter&&(k={triggerKind:1,triggerCharacter:h.triggerCharacter}),this._requestToken=new c.CancellationTokenSource;const E=this._editor.getOption(96);let T=1;switch(E){case"top":T=0;break;case"bottom":T=2;break}const O=ti._createItemKindFilter(this._editor),A=s.WordDistance.create(this._editorWorkerService,this._editor),B=g.provideSuggestionItems(y,this._editor.getPosition(),new g.CompletionOptions(T,O,_),k,this._requestToken.token);Promise.all([B,A]).then(([F,D])=>Ie(this,void 0,void 0,function*(){var R;if((R=this._requestToken)===null||R===void 0||R.dispose(),!!this._editor.hasModel()){let W=f==null?void 0:f.clipboardText;if(!W&&F.needsClipboard&&(W=yield this._clipboardService.readText()),this._state!==0){const x=this._editor.getModel();let K=F.items;if(f){const ee=g.getSuggestionComparator(T);K=K.concat(f.items).sort(ee)}const Y=new n(x,this._editor.getPosition(),L,h.shy);this._completionModel=new d.CompletionModel(K,this._context.column,{leadingLineContent:Y.leadingLineContent,characterCountDelta:Y.column-this._context.column},D,this._editor.getOption(101),this._editor.getOption(96),W),this._completionDisposables.add(F.disposable),this._onNewContext(Y),this._reportDurationsTelemetry(F.durations)}}})).catch(N.onUnexpectedError)}}_reportDurationsTelemetry(h){this._telemetryGate++%230==0&&setTimeout(()=>{this._telemetryService.publicLog2("suggest.durations.json",{data:JSON.stringify(h)}),this._logService.debug("suggest.durations.json",h)})}static _createItemKindFilter(h){const m=new Set;h.getOption(96)==="none"&&m.add(27);const f=h.getOption(101);return f.showMethods||m.add(0),f.showFunctions||m.add(1),f.showConstructors||m.add(2),f.showFields||m.add(3),f.showVariables||m.add(4),f.showClasses||m.add(5),f.showStructs||m.add(6),f.showInterfaces||m.add(7),f.showModules||m.add(8),f.showProperties||m.add(9),f.showEvents||m.add(10),f.showOperators||m.add(11),f.showUnits||m.add(12),f.showValues||m.add(13),f.showConstants||m.add(14),f.showEnums||m.add(15),f.showEnumMembers||m.add(16),f.showKeywords||m.add(17),f.showWords||m.add(18),f.showColors||m.add(19),f.showFiles||m.add(20),f.showReferences||m.add(21),f.showColors||m.add(22),f.showFolders||m.add(23),f.showTypeParameters||m.add(24),f.showSnippets||m.add(27),f.showUsers||m.add(25),f.showIssues||m.add(26),m}_onNewContext(h){if(!!this._context){if(h.lineNumber!==this._context.lineNumber){this.cancel();return}if(a.getLeadingWhitespace(h.leadingLineContent)!==a.getLeadingWhitespace(this._context.leadingLineContent)){this.cancel();return}if(h.columnthis._context.leadingWord.startColumn){const m=new Set(C.CompletionProviderRegistry.all(this._editor.getModel()));for(let f of this._completionModel.allProvider)m.delete(f);const _=this._completionModel.adopt(new Set);this.trigger({auto:this._context.auto,shy:!1},!0,m,{items:_,clipboardText:this._completionModel.clipboardText});return}if(h.column>this._context.column&&this._completionModel.incomplete.size>0&&h.leadingWord.word.length!==0){const{incomplete:m}=this._completionModel,_=this._completionModel.adopt(m);this.trigger({auto:this._state===2,shy:!1,triggerKind:2},!0,m,{items:_,clipboardText:this._completionModel.clipboardText})}else{let m=this._completionModel.lineContext,_=!1;if(this._completionModel.lineContext={leadingLineContent:h.leadingLineContent,characterCountDelta:h.column-this._context.column},this._completionModel.items.length===0){if(n.shouldAutoTrigger(this._editor)&&this._context.leadingWord.endColumn0,_&&h.leadingWord.word.length===0){this.cancel();return}}this._onDidSuggest.fire({completionModel:this._completionModel,auto:this._context.auto,shy:this._context.shy,isFrozen:_})}}}}};t=Me([_e(1,o.IEditorWorkerService),_e(2,u.IClipboardService),_e(3,r.ITelemetryService),_e(4,i.ILogService)],t),e.SuggestModel=t}),define(Q[682],J([0,1,47,19,12,39,2,70,13,62,3,25,192,131,576,507,26,16,9,86,117,548,681,666,549,6,15,20,414,415,14,17,34,23,77,81]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B,F){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerSuggestAction=e.SuggestController=void 0;let D=!1;class R{constructor(se,ne){if(this._model=se,this._position=ne,se.getLineMaxColumn(ne.lineNumber)!==ne.column){const X=se.getOffsetAt(ne),z=se.getPositionAt(X+1);this._marker=se.deltaDecorations([],[{range:p.Range.fromPositions(ne,z),options:{stickiness:1}}])}}dispose(){this._marker&&!this._model.isDisposed()&&this._model.deltaDecorations(this._marker,[])}delta(se){if(this._model.isDisposed()||this._position.lineNumber!==se.lineNumber)return 0;if(this._marker){const ne=this._model.getDecorationRange(this._marker[0]);return this._model.getOffsetAt(ne.getStartPosition())-this._model.getOffsetAt(se)}else return this._model.getLineMaxColumn(se.lineNumber)-se.column}}let W=class ii{constructor(se,ne,le,X,z,P){this._memoryService=ne,this._commandService=le,this._contextKeyService=X,this._instantiationService=z,this._logService=P,this._lineSuffix=new S.MutableDisposable,this._toDispose=new S.DisposableStore,this.editor=se,this.model=z.createInstance(m.SuggestModel,this.editor);const V=l.Context.InsertMode.bindTo(X);V.set(se.getOption(101).insertMode),this.model.onDidTrigger(()=>V.set(se.getOption(101).insertMode)),this.widget=this._toDispose.add(new y.IdleValue(()=>{const $=this._instantiationService.createInstance(_.SuggestWidget,this.editor);this._toDispose.add($),this._toDispose.add($.onDidSelect(j=>this._insertSuggestion(j,0),this));const ie=new I.CommitCharacterController(this.editor,$,j=>this._insertSuggestion(j,2));this._toDispose.add(ie),this._toDispose.add(this.model.onDidSuggest(j=>{j.completionModel.items.length===0&&ie.reset()}));const oe=l.Context.MakesTextEdit.bindTo(this._contextKeyService),ae=l.Context.HasInsertAndReplaceRange.bindTo(this._contextKeyService),G=l.Context.CanResolve.bindTo(this._contextKeyService);return this._toDispose.add(S.toDisposable(()=>{oe.reset(),ae.reset(),G.reset()})),this._toDispose.add($.onDidFocus(({item:j})=>{const te=this.editor.getPosition(),Z=j.editStart.column,ue=te.column;let he=!0;this.editor.getOption(1)==="smart"&&this.model.state===2&&!j.completion.command&&!j.completion.additionalTextEdits&&!(j.completion.insertTextRules&4)&&ue-Z===j.completion.insertText.length&&(he=this.editor.getModel().getValueInRange({startLineNumber:te.lineNumber,startColumn:Z,endLineNumber:te.lineNumber,endColumn:ue})!==j.completion.insertText),oe.set(he),ae.set(!E.Position.equals(j.editInsertEnd,j.editReplaceEnd)),G.set(Boolean(j.provider.resolveCompletionItem)||Boolean(j.completion.documentation)||j.completion.detail!==j.completion.label)})),this._toDispose.add($.onDetailsKeyDown(j=>{if(j.toKeybinding().equals(new w.SimpleKeybinding(!0,!1,!1,!1,33))||T.isMacintosh&&j.toKeybinding().equals(new w.SimpleKeybinding(!1,!1,!1,!0,33))){j.stopPropagation();return}j.toKeybinding().isModifierKey()||this.editor.focus()})),$})),this._overtypingCapturer=this._toDispose.add(new y.IdleValue(()=>this._toDispose.add(new k.OvertypingCapturer(this.editor,this.model)))),this._alternatives=this._toDispose.add(new y.IdleValue(()=>this._toDispose.add(new h.SuggestAlternatives(this.editor,this._contextKeyService)))),this._toDispose.add(z.createInstance(f.WordContextKey,se)),this._toDispose.add(this.model.onDidTrigger($=>{this.widget.value.showTriggered($.auto,$.shy?250:50),this._lineSuffix.value=new R(this.editor.getModel(),$.position)})),this._toDispose.add(this.model.onDidSuggest($=>{if(!$.shy){let ie=this._memoryService.select(this.editor.getModel(),this.editor.getPosition(),$.completionModel.items);this.widget.value.showSuggestions($.completionModel,ie,$.isFrozen,$.auto)}})),this._toDispose.add(this.model.onDidCancel($=>{$.retrigger||this.widget.value.hideWidget()})),this._toDispose.add(this.editor.onDidBlurEditorWidget(()=>{D||(this.model.cancel(),this.model.clear())}));let U=l.Context.AcceptSuggestionsOnEnter.bindTo(X),H=()=>{const $=this.editor.getOption(1);U.set($==="on"||$==="smart")};this._toDispose.add(this.editor.onDidChangeConfiguration(()=>H())),H()}static get(se){return se.getContribution(ii.ID)}dispose(){this._alternatives.dispose(),this._toDispose.dispose(),this.widget.dispose(),this.model.dispose(),this._lineSuffix.dispose()}_insertSuggestion(se,ne){if(!se||!se.item){this._alternatives.value.reset(),this.model.cancel(),this.model.clear();return}if(!!this.editor.hasModel()){const le=this.editor.getModel(),X=le.getAlternativeVersionId(),{item:z}=se,P=[],V=new A.CancellationTokenSource;ne&1||this.editor.pushUndoStop();const U=this.getOverwriteInfo(z,Boolean(ne&8));if(this._memoryService.memorize(le,this.editor.getPosition(),z),Array.isArray(z.completion.additionalTextEdits)){const $=C.StableEditorScrollState.capture(this.editor);this.editor.executeEdits("suggestController.additionalTextEdits.sync",z.completion.additionalTextEdits.map(ie=>g.EditOperation.replace(p.Range.lift(ie.range),ie.text))),$.restoreRelativeVerticalPositionOfCursor(this.editor)}else if(!z.isResolved){const $=new F.StopWatch(!0);let ie;const oe=le.onDidChangeContent(te=>{if(te.isFlush){V.cancel(),oe.dispose();return}for(let Z of te.changes){const ue=p.Range.getEndPosition(Z.range);(!ie||E.Position.isBefore(ue,ie))&&(ie=ue)}});let ae=ne;ne|=2;let G=!1,j=this.editor.onWillType(()=>{j.dispose(),G=!0,ae&2||this.editor.pushUndoStop()});P.push(z.resolve(V.token).then(()=>{if(!z.completion.additionalTextEdits||V.token.isCancellationRequested||ie&&z.completion.additionalTextEdits.some(Z=>E.Position.isBefore(ie,p.Range.getStartPosition(Z.range))))return!1;G&&this.editor.pushUndoStop();const te=C.StableEditorScrollState.capture(this.editor);return this.editor.executeEdits("suggestController.additionalTextEdits.async",z.completion.additionalTextEdits.map(Z=>g.EditOperation.replace(p.Range.lift(Z.range),Z.text))),te.restoreRelativeVerticalPositionOfCursor(this.editor),(G||!(ae&2))&&this.editor.pushUndoStop(),!0}).then(te=>{this._logService.trace("[suggest] async resolving of edits DONE (ms, applied?)",$.elapsed(),te),oe.dispose(),j.dispose()}))}let{insertText:H}=z.completion;z.completion.insertTextRules&4||(H=s.SnippetParser.escape(H)),o.SnippetController2.get(this.editor).insert(H,{overwriteBefore:U.overwriteBefore,overwriteAfter:U.overwriteAfter,undoStopBefore:!1,undoStopAfter:!1,adjustWhitespace:!(z.completion.insertTextRules&1),clipboardText:se.model.clipboardText,overtypingCapturer:this._overtypingCapturer.value}),ne&2||this.editor.pushUndoStop(),z.completion.command?z.completion.command.id===x.id?this.model.trigger({auto:!0,shy:!1},!0):(P.push(this._commandService.executeCommand(z.completion.command.id,...z.completion.command.arguments?[...z.completion.command.arguments]:[]).catch(M.onUnexpectedError)),this.model.cancel()):this.model.cancel(),ne&4&&this._alternatives.value.set(se,$=>{for(V.cancel();le.canUndo();){X!==le.getAlternativeVersionId()&&le.undo(),this._insertSuggestion($,1|2|(ne&8?8:0));break}}),this._alertCompletionItem(z),Promise.all(P).finally(()=>{this.model.clear(),V.dispose()})}}getOverwriteInfo(se,ne){L.assertType(this.editor.hasModel());let le=this.editor.getOption(101).insertMode==="replace";ne&&(le=!le);const X=se.position.column-se.editStart.column,z=(le?se.editReplaceEnd.column:se.editInsertEnd.column)-se.position.column,P=this.editor.getPosition().column-se.position.column,V=this._lineSuffix.value?this._lineSuffix.value.delta(this.editor.getPosition()):0;return{overwriteBefore:X+P,overwriteAfter:z+V}}_alertCompletionItem({completion:se}){const ne=typeof se.label=="string"?se.label:se.label.name;if(N.isNonEmptyArray(se.additionalTextEdits)){let le=u.localize(0,null,ne,se.additionalTextEdits.length);b.alert(le)}}triggerSuggest(se){this.editor.hasModel()&&(this.model.trigger({auto:!1,shy:!1},!1,se),this.editor.revealLine(this.editor.getPosition().lineNumber,0),this.editor.focus())}triggerSuggestAndAcceptBest(se){if(!!this.editor.hasModel()){const ne=this.editor.getPosition(),le=()=>{ne.equals(this.editor.getPosition())&&this._commandService.executeCommand(se.fallback)},X=z=>{if(z.completion.insertTextRules&4||z.completion.additionalTextEdits)return!0;const P=this.editor.getPosition(),V=z.editStart.column,U=P.column;return U-V!==z.completion.insertText.length?!0:this.editor.getModel().getValueInRange({startLineNumber:P.lineNumber,startColumn:V,endLineNumber:P.lineNumber,endColumn:U})!==z.completion.insertText};v.Event.once(this.model.onDidTrigger)(z=>{let P=[];v.Event.any(this.model.onDidTrigger,this.model.onDidCancel)(()=>{S.dispose(P),le()},void 0,P),this.model.onDidSuggest(({completionModel:V})=>{if(S.dispose(P),V.items.length===0){le();return}const U=this._memoryService.select(this.editor.getModel(),this.editor.getPosition(),V.items),H=V.items[U];if(!X(H)){le();return}this.editor.pushUndoStop(),this._insertSuggestion({index:U,item:H,model:V},4|1|2)},void 0,P)}),this.model.trigger({auto:!1,shy:!0}),this.editor.revealLine(ne.lineNumber,0),this.editor.focus()}}acceptSelectedSuggestion(se,ne){const le=this.widget.value.getFocusedItem();let X=0;se&&(X|=4),ne&&(X|=8),this._insertSuggestion(le,X)}acceptNextSuggestion(){this._alternatives.value.next()}acceptPrevSuggestion(){this._alternatives.value.prev()}cancelSuggestWidget(){this.model.cancel(),this.model.clear(),this.widget.value.hideWidget()}selectNextSuggestion(){this.widget.value.selectNext()}selectNextPageSuggestion(){this.widget.value.selectNextPage()}selectLastSuggestion(){this.widget.value.selectLast()}selectPrevSuggestion(){this.widget.value.selectPrevious()}selectPrevPageSuggestion(){this.widget.value.selectPreviousPage()}selectFirstSuggestion(){this.widget.value.selectFirst()}toggleSuggestionDetails(){this.widget.value.toggleDetails()}toggleExplainMode(){this.widget.value.toggleExplainMode()}toggleSuggestionFocus(){this.widget.value.toggleDetailsFocus()}resetWidgetSize(){this.widget.value.resetPersistedSize()}};W.ID="editor.contrib.suggestController",W=Me([_e(1,a.ISuggestMemoryService),_e(2,r.ICommandService),_e(3,i.IContextKeyService),_e(4,n.IInstantiationService),_e(5,B.ILogService)],W),e.SuggestController=W;class x extends d.EditorAction{constructor(){super({id:x.id,label:u.localize(1,null),alias:"Trigger Suggest",precondition:i.ContextKeyExpr.and(c.EditorContextKeys.writable,c.EditorContextKeys.hasCompletionItemProvider),kbOpts:{kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|10,secondary:[2048|39],mac:{primary:256|10,secondary:[512|9,2048|39]},weight:100}})}run(se,ne){const le=W.get(ne);!le||le.triggerSuggest()}}e.TriggerSuggestAction=x,x.id="editor.action.triggerSuggest",d.registerEditorContribution(W.ID,W),d.registerEditorAction(x);const K=100+90,Y=d.EditorCommand.bindToContribution(W.get);d.registerEditorCommand(new Y({id:"acceptSelectedSuggestion",precondition:l.Context.Visible,handler(ee){ee.acceptSelectedSuggestion(!0,!1)}})),t.KeybindingsRegistry.registerKeybindingRule({id:"acceptSelectedSuggestion",when:i.ContextKeyExpr.and(l.Context.Visible,c.EditorContextKeys.textInputFocus),primary:2,weight:K}),t.KeybindingsRegistry.registerKeybindingRule({id:"acceptSelectedSuggestion",when:i.ContextKeyExpr.and(l.Context.Visible,c.EditorContextKeys.textInputFocus,l.Context.AcceptSuggestionsOnEnter,l.Context.MakesTextEdit),primary:3,weight:K}),O.MenuRegistry.appendMenuItem(l.suggestWidgetStatusbarMenu,{command:{id:"acceptSelectedSuggestion",title:u.localize(2,null)},group:"left",order:1,when:l.Context.HasInsertAndReplaceRange.toNegated()}),O.MenuRegistry.appendMenuItem(l.suggestWidgetStatusbarMenu,{command:{id:"acceptSelectedSuggestion",title:u.localize(3,null)},group:"left",order:1,when:i.ContextKeyExpr.and(l.Context.HasInsertAndReplaceRange,l.Context.InsertMode.isEqualTo("insert"))}),O.MenuRegistry.appendMenuItem(l.suggestWidgetStatusbarMenu,{command:{id:"acceptSelectedSuggestion",title:u.localize(4,null)},group:"left",order:1,when:i.ContextKeyExpr.and(l.Context.HasInsertAndReplaceRange,l.Context.InsertMode.isEqualTo("replace"))}),d.registerEditorCommand(new Y({id:"acceptAlternativeSelectedSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,c.EditorContextKeys.textInputFocus),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:1024|3,secondary:[1024|2]},handler(ee){ee.acceptSelectedSuggestion(!1,!0)},menuOpts:[{menuId:l.suggestWidgetStatusbarMenu,group:"left",order:2,when:i.ContextKeyExpr.and(l.Context.HasInsertAndReplaceRange,l.Context.InsertMode.isEqualTo("insert")),title:u.localize(5,null)},{menuId:l.suggestWidgetStatusbarMenu,group:"left",order:2,when:i.ContextKeyExpr.and(l.Context.HasInsertAndReplaceRange,l.Context.InsertMode.isEqualTo("replace")),title:u.localize(6,null)}]})),r.CommandsRegistry.registerCommandAlias("acceptSelectedSuggestionOnEnter","acceptSelectedSuggestion"),d.registerEditorCommand(new Y({id:"hideSuggestWidget",precondition:l.Context.Visible,handler:ee=>ee.cancelSuggestWidget(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:9,secondary:[1024|9]}})),d.registerEditorCommand(new Y({id:"selectNextSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectNextSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:18,secondary:[2048|18],mac:{primary:18,secondary:[2048|18,256|44]}}})),d.registerEditorCommand(new Y({id:"selectNextPageSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectNextPageSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:12,secondary:[2048|12]}})),d.registerEditorCommand(new Y({id:"selectLastSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectLastSuggestion()})),d.registerEditorCommand(new Y({id:"selectPrevSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectPrevSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:16,secondary:[2048|16],mac:{primary:16,secondary:[2048|16,256|46]}}})),d.registerEditorCommand(new Y({id:"selectPrevPageSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectPrevPageSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:11,secondary:[2048|11]}})),d.registerEditorCommand(new Y({id:"selectFirstSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectFirstSuggestion()})),d.registerEditorCommand(new Y({id:"toggleSuggestionDetails",precondition:l.Context.Visible,handler:ee=>ee.toggleSuggestionDetails(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|10,mac:{primary:256|10}},menuOpts:[{menuId:l.suggestWidgetStatusbarMenu,group:"right",order:1,when:i.ContextKeyExpr.and(l.Context.DetailsVisible,l.Context.CanResolve),title:u.localize(7,null)},{menuId:l.suggestWidgetStatusbarMenu,group:"right",order:1,when:i.ContextKeyExpr.and(l.Context.DetailsVisible.toNegated(),l.Context.CanResolve),title:u.localize(8,null)}]})),d.registerEditorCommand(new Y({id:"toggleExplainMode",precondition:l.Context.Visible,handler:ee=>ee.toggleExplainMode(),kbOpts:{weight:100,primary:2048|85}})),d.registerEditorCommand(new Y({id:"toggleSuggestionFocus",precondition:l.Context.Visible,handler:ee=>ee.toggleSuggestionFocus(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|512|10,mac:{primary:256|512|10}}})),d.registerEditorCommand(new Y({id:"insertBestCompletion",precondition:i.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,i.ContextKeyExpr.equals("config.editor.tabCompletion","on"),f.WordContextKey.AtEnd,l.Context.Visible.toNegated(),h.SuggestAlternatives.OtherSuggestions.toNegated(),o.SnippetController2.InSnippetMode.toNegated()),handler:(ee,se)=>{ee.triggerSuggestAndAcceptBest(L.isObject(se)?Object.assign({fallback:"tab"},se):{fallback:"tab"})},kbOpts:{weight:K,primary:2}})),d.registerEditorCommand(new Y({id:"insertNextSuggestion",precondition:i.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,i.ContextKeyExpr.equals("config.editor.tabCompletion","on"),h.SuggestAlternatives.OtherSuggestions,l.Context.Visible.toNegated(),o.SnippetController2.InSnippetMode.toNegated()),handler:ee=>ee.acceptNextSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:2}})),d.registerEditorCommand(new Y({id:"insertPrevSuggestion",precondition:i.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,i.ContextKeyExpr.equals("config.editor.tabCompletion","on"),h.SuggestAlternatives.OtherSuggestions,l.Context.Visible.toNegated(),o.SnippetController2.InSnippetMode.toNegated()),handler:ee=>ee.acceptPrevSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:1024|2}})),d.registerEditorAction(class extends d.EditorAction{constructor(){super({id:"editor.action.resetSuggestSize",label:u.localize(9,null),alias:"Reset Suggest Widget Size",precondition:void 0})}run(ee,se){W.get(se).resetWidgetSize()}})}),define(Q[683],J([0,1,188,143,266,215,611,612,613,614,615,635,618,670,619,620,621,622,267,659,623,624,545,271,272,268,273,629,630,628,631,632,633,662,664,636,637,192,682,638,264,639,671,640,265,641,64,123]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0})});var mt=this&&this.__createBinding||(Object.create?function(q,e,b,N){N===void 0&&(N=b),Object.defineProperty(q,N,{enumerable:!0,get:function(){return e[b]}})}:function(q,e,b,N){N===void 0&&(N=b),q[N]=e[b]}),pt=this&&this.__exportStar||function(q,e){for(var b in q)b!=="default"&&!Object.prototype.hasOwnProperty.call(e,b)&&mt(e,q,b)};define(Q[686],J([0,1,677,683,642,643,644,573,646,647,645,672,648]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),pt(b,e)})}).call(this); + + +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-typescript version: 4.3.1(d4e91e07d8144e428885c93029b3d3cbf1994c33) + * Released under the MIT license + * https://github.com/Microsoft/monaco-typescript/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/language/typescript/lib/typescriptServicesMetadata",["require","exports"],(function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.typescriptVersion=void 0,e.typescriptVersion="4.2.3"})),define("vs/language/typescript/fillers/monaco-editor-core",['vs/editor/editor.api'],(function(){return self.monaco})),define("vs/language/typescript/monaco.contribution",["require","exports","./lib/typescriptServicesMetadata","./fillers/monaco-editor-core"],(function(t,e,i,n){"use strict";var r,o,s,a,c;Object.defineProperty(e,"__esModule",{value:!0}),e.getJavaScriptWorker=e.getTypeScriptWorker=e.javascriptDefaults=e.typescriptDefaults=e.typescriptVersion=e.ModuleResolutionKind=e.ScriptTarget=e.NewLineKind=e.JsxEmit=e.ModuleKind=void 0,function(t){t[t.None=0]="None",t[t.CommonJS=1]="CommonJS",t[t.AMD=2]="AMD",t[t.UMD=3]="UMD",t[t.System=4]="System",t[t.ES2015=5]="ES2015",t[t.ESNext=99]="ESNext"}(r=e.ModuleKind||(e.ModuleKind={})),function(t){t[t.None=0]="None",t[t.Preserve=1]="Preserve",t[t.React=2]="React",t[t.ReactNative=3]="ReactNative",t[t.ReactJSX=4]="ReactJSX",t[t.ReactJSXDev=5]="ReactJSXDev"}(o=e.JsxEmit||(e.JsxEmit={})),function(t){t[t.CarriageReturnLineFeed=0]="CarriageReturnLineFeed",t[t.LineFeed=1]="LineFeed"}(s=e.NewLineKind||(e.NewLineKind={})),function(t){t[t.ES3=0]="ES3",t[t.ES5=1]="ES5",t[t.ES2015=2]="ES2015",t[t.ES2016=3]="ES2016",t[t.ES2017=4]="ES2017",t[t.ES2018=5]="ES2018",t[t.ES2019=6]="ES2019",t[t.ES2020=7]="ES2020",t[t.ESNext=99]="ESNext",t[t.JSON=100]="JSON",t[t.Latest=99]="Latest"}(a=e.ScriptTarget||(e.ScriptTarget={})),function(t){t[t.Classic=1]="Classic",t[t.NodeJs=2]="NodeJs"}(c=e.ModuleResolutionKind||(e.ModuleResolutionKind={}));var p=function(){function t(t,e,i){this._onDidChange=new n.Emitter,this._onDidExtraLibsChange=new n.Emitter,this._extraLibs=Object.create(null),this._removedExtraLibs=Object.create(null),this._eagerModelSync=!1,this.setCompilerOptions(t),this.setDiagnosticsOptions(e),this.setWorkerOptions(i),this._onDidExtraLibsChangeTimeout=-1}return Object.defineProperty(t.prototype,"onDidChange",{get:function(){return this._onDidChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"onDidExtraLibsChange",{get:function(){return this._onDidExtraLibsChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"workerOptions",{get:function(){return this._workerOptions},enumerable:!1,configurable:!0}),t.prototype.getExtraLibs=function(){return this._extraLibs},t.prototype.addExtraLib=function(t,e){var i,n=this;if(i=void 0===e?"ts:extralib-"+Math.random().toString(36).substring(2,15):e,this._extraLibs[i]&&this._extraLibs[i].content===t)return{dispose:function(){}};var r=1;return this._removedExtraLibs[i]&&(r=this._removedExtraLibs[i]+1),this._extraLibs[i]&&(r=this._extraLibs[i].version+1),this._extraLibs[i]={content:t,version:r},this._fireOnDidExtraLibsChangeSoon(),{dispose:function(){var t=n._extraLibs[i];t&&t.version===r&&(delete n._extraLibs[i],n._removedExtraLibs[i]=r,n._fireOnDidExtraLibsChangeSoon())}}},t.prototype.setExtraLibs=function(t){for(var e in this._extraLibs)this._removedExtraLibs[e]=this._extraLibs[e].version;if(this._extraLibs=Object.create(null),t&&t.length>0)for(var i=0,n=t;i console.log", weil "log" vor Kurzem abgeschlossen wurde.','W\xE4hlen Sie Vorschl\xE4ge basierend auf fr\xFCheren Pr\xE4fixen aus, die diese Vorschl\xE4ge abgeschlossen haben, z.B. "co -> console" und "con ->" const".',"Steuert, wie Vorschl\xE4ge bei Anzeige der Vorschlagsliste vorab ausgew\xE4hlt werden.","Die Tab-Vervollst\xE4ndigung f\xFCgt den passendsten Vorschlag ein, wenn auf Tab gedr\xFCckt wird.","Tab-Vervollst\xE4ndigungen deaktivieren.",'Codeausschnitte per Tab vervollst\xE4ndigen, wenn die Pr\xE4fixe \xFCbereinstimmen. Funktioniert am besten, wenn "quickSuggestions" deaktiviert sind.',"Tab-Vervollst\xE4ndigungen aktivieren.","Ungew\xF6hnliche Zeilenabschlusszeichen werden automatisch entfernt.","Ungew\xF6hnliche Zeilenabschlusszeichen werden ignoriert.","Zum Entfernen ungew\xF6hnlicher Zeilenabschlusszeichen wird eine Eingabeaufforderung angezeigt.","Entfernen Sie un\xFCbliche Zeilenabschlusszeichen, die Probleme verursachen k\xF6nnen.","Das Einf\xFCgen und L\xF6schen von Leerzeichen erfolgt nach Tabstopps.","Zeichen, die als Worttrennzeichen verwendet werden, wenn wortbezogene Navigationen oder Vorg\xE4nge ausgef\xFChrt werden.","Zeilenumbr\xFCche erfolgen nie.","Der Zeilenumbruch erfolgt an der Breite des Anzeigebereichs.",'Der Zeilenumbruch erfolgt bei "#editor.wordWrapColumn#".','Der Zeilenumbruch erfolgt beim Mindestanzeigebereich und "#editor.wordWrapColumn".',"Steuert, wie der Zeilenumbruch durchgef\xFChrt werden soll.",'Steuert die umschlie\xDFende Spalte des Editors, wenn "#editor.wordWrap#" den Wert "wordWrapColumn" oder "bounded" aufweist.',"Kein Einzug. Umbrochene Zeilen beginnen bei Spalte 1.","Umbrochene Zeilen erhalten den gleichen Einzug wie das \xFCbergeordnete Element.","Umbrochene Zeilen erhalten + 1 Einzug auf das \xFCbergeordnete Element.","Umgebrochene Zeilen werden im Vergleich zum \xFCbergeordneten Element +2 einger\xFCckt.","Steuert die Einr\xFCckung der umbrochenen Zeilen.","Es wird angenommen, dass alle Zeichen gleich breit sind. Dies ist ein schneller Algorithmus, der f\xFCr Festbreitenschriftarten und bestimmte Alphabete (wie dem lateinischen), bei denen die Glyphen gleich breit sind, korrekt funktioniert.","Delegiert die Berechnung von Umbruchpunkten an den Browser. Dies ist ein langsamer Algorithmus, der bei gro\xDFen Dateien Code Freezes verursachen kann, aber in allen F\xE4llen korrekt funktioniert.","Steuert den Algorithmus, der Umbruchpunkte berechnet."],"vs/editor/common/editorContextKeys":["Gibt an, ob der Editor-Text den Fokus besitzt (Cursor blinkt).","Gibt an, ob der Editor oder ein Editor-Widget den Fokus besitzt (z.\xA0B. ob der Fokus sich im Suchwidget befindet).","Gibt an, ob ein Editor oder eine Rich-Text-Eingabe den Fokus besitzt (Cursor blinkt).","Gibt an, ob der Editor schreibgesch\xFCtzt ist.","Gibt an, ob der Kontext ein Diff-Editor ist.",'Gibt an, ob "editor.columnSelection" aktiviert ist.',"Gibt an, ob im Editor Text ausgew\xE4hlt ist.","Gibt an, ob der Editor \xFCber Mehrfachauswahl verf\xFCgt.","Gibt an, ob die TAB-TASTE den Fokus aus dem Editor verschiebt.","Gibt an, ob Hover im Editor sichtbar ist.","Gibt an, ob der Editor Bestandteil eines gr\xF6\xDFeren Editors ist (z.\xA0B. Notebooks).","Der Sprachbezeichner des Editors.","Gibt an, ob der Editor \xFCber einen Vervollst\xE4ndigungselementanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Codeaktionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen CodeLens-Anbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Definitionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Deklarationsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Implementierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Typdefinitionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Hoveranbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumenthervorhebungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumentsymbolanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Verweisanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Umbenennungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Signaturhilfeanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Inlinehinweisanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumentformatierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Anbieter f\xFCr Dokumentauswahlformatierung verf\xFCgt.","Gibt an, ob der Editor \xFCber mehrere Dokumentformatierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber mehrere Anbieter f\xFCr Dokumentauswahlformatierung verf\xFCgt."],"vs/editor/common/model/editStack":["Eingabe"],"vs/editor/common/modes/modesRegistry":["Nur-Text"],"vs/editor/common/standaloneStrings":["Keine Auswahl","Zeile {0}, Spalte {1} ({2} ausgew\xE4hlt)","Zeile {0}, Spalte {1}","{0} Auswahlen ({1} Zeichen ausgew\xE4hlt)","{0} Auswahlen",'Die Einstellung "accessibilitySupport" wird jetzt in "on" ge\xE4ndert.',"Die Dokumentationsseite zur Barrierefreiheit des Editors wird ge\xF6ffnet."," in einem schreibgesch\xFCtzten Bereich eines Diff-Editors."," in einem Bereich eines Diff-Editors."," in einem schreibgesch\xFCtzten Code-Editor"," in einem Code-Editor","Dr\xFCcken Sie BEFEHLSTASTE + E, um den Editor f\xFCr eine optimierte Verwendung mit Sprachausgabe zu konfigurieren.","Dr\xFCcken Sie STRG + E, um den Editor f\xFCr eine optimierte Verwendung mit Sprachausgabe zu konfigurieren.","Der Editor ist auf eine optimale Verwendung mit Sprachausgabe konfiguriert.","Der Editor ist so konfiguriert, dass er nie auf die Verwendung mit Sprachausgabe hin optimiert wird. Dies ist zu diesem Zeitpunkt nicht der Fall.","Durch Dr\xFCcken der TAB-TASTE im aktuellen Editor wird der Fokus in das n\xE4chste Element verschoben, das den Fokus erhalten kann. Schalten Sie dieses Verhalten um, indem Sie {0} dr\xFCcken.","Durch Dr\xFCcken der TAB-TASTE im aktuellen Editor wird der Fokus in das n\xE4chste Element verschoben, das den Fokus erhalten kann. Der {0}-Befehl kann zurzeit nicht durch eine Tastenzuordnung ausgel\xF6st werden.","Durch Dr\xFCcken der TAB-TASTE im aktuellen Editor wird das Tabstoppzeichen eingef\xFCgt. Schalten Sie dieses Verhalten um, indem Sie {0} dr\xFCcken.","Durch Dr\xFCcken der TAB-TASTE im aktuellen Editor wird das Tabstoppzeichen eingef\xFCgt. Der {0}-Befehl kann zurzeit nicht durch eine Tastenzuordnung ausgel\xF6st werden.","Dr\xFCcken Sie BEFEHLSTASTE + H, um ein Browserfenster mit weiteren Informationen zur Barrierefreiheit des Editors zu \xF6ffnen.","Dr\xFCcken Sie STRG + H, um ein Browserfenster mit weiteren Informationen zur Barrierefreiheit des Editors zu \xF6ffnen.","Sie k\xF6nnen diese QuickInfo schlie\xDFen und durch Dr\xFCcken von ESC oder UMSCHALT+ESC zum Editor zur\xFCckkehren.","Hilfe zur Barrierefreiheit anzeigen","Entwickler: Token \xFCberpr\xFCfen","Gehe zu Zeile/Spalte...","Alle Anbieter f\xFCr den Schnellzugriff anzeigen","Befehlspalette","Befehle anzeigen und ausf\xFChren","Gehe zu Symbol...","Gehe zu Symbol nach Kategorie...","Editor-Inhalt","Dr\xFCcken Sie ALT + F1, um die Barrierefreiheitsoptionen aufzurufen.","Zu Design mit hohem Kontrast umschalten","{0} Bearbeitungen in {1} Dateien durchgef\xFChrt"],"vs/editor/common/view/editorColorRegistry":["Hintergrundfarbe zur Hervorhebung der Zeile an der Cursorposition.","Hintergrundfarbe f\xFCr den Rahmen um die Zeile an der Cursorposition.","Hintergrundfarbe der markierten Bereiche, wie z.B. Quick Open oder die Suche. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe f\xFCr den Rahmen um hervorgehobene Bereiche.",'Hintergrundfarbe des hervorgehobenen Symbols, z. B. "Gehe zu Definition" oder "Gehe zu n\xE4chster/vorheriger". Die Farbe darf nicht undurchsichtig sein, um zugrunde liegende Dekorationen nicht zu verbergen.',"Hintergrundfarbe des Rahmens um hervorgehobene Symbole","Farbe des Cursors im Editor.","Hintergrundfarbe vom Editor-Cursor. Erlaubt die Anpassung der Farbe von einem Zeichen, welches von einem Block-Cursor \xFCberdeckt wird.","Farbe der Leerzeichen im Editor.","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor.","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor.","Zeilennummernfarbe im Editor.","Zeilennummernfarbe der aktiven Editorzeile.",'Die ID ist veraltet. Verwenden Sie stattdessen "editorLineNumber.activeForeground".',"Zeilennummernfarbe der aktiven Editorzeile.","Farbe des Editor-Lineals.","Vordergrundfarbe der CodeLens-Links im Editor","Hintergrundfarbe f\xFCr zusammengeh\xF6rige Klammern","Farbe f\xFCr zusammengeh\xF6rige Klammern","Farbe des Rahmens f\xFCr das \xDCbersicht-Lineal.","Hintergrundfarbe des \xDCbersichtslineals im Editor. Wird nur verwendet, wenn die Minimap aktiviert ist und auf der rechten Seite des Editors platziert wird.","Hintergrundfarbe der Editorleiste. Die Leiste enth\xE4lt die Glyphenr\xE4nder und die Zeilennummern.","Rahmenfarbe unn\xF6tigen (nicht genutzten) Quellcodes im Editor.",'Deckkraft des unn\xF6tigen (nicht genutzten) Quellcodes im Editor. "#000000c0" rendert z.B. den Code mit einer Deckkraft von 75%. Verwenden Sie f\xFCr Designs mit hohem Kontrast das Farbdesign "editorUnnecessaryCode.border", um unn\xF6tigen Code zu unterstreichen statt ihn abzublenden.',"\xDCbersichtslinealmarkerfarbe f\xFCr das Hervorheben von Bereichen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Fehler.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Warnungen.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Informationen."],"vs/editor/contrib/anchorSelect/anchorSelect":["Auswahlanker",'Anker festgelegt bei "{0}:{1}"',"Auswahlanker festlegen","Zu Auswahlanker wechseln","Auswahl von Anker zu Cursor","Auswahlanker abbrechen"],"vs/editor/contrib/bracketMatching/bracketMatching":["\xDCbersichtslineal-Markierungsfarbe f\xFCr zusammengeh\xF6rige Klammern.","Gehe zu Klammer","Ausw\xE4hlen bis Klammer","Gehe zu &&Klammer"],"vs/editor/contrib/caretOperations/caretOperations":["Ausgew\xE4hlten Text nach links verschieben","Ausgew\xE4hlten Text nach rechts verschieben"],"vs/editor/contrib/caretOperations/transpose":["Buchstaben austauschen"],"vs/editor/contrib/clipboard/clipboard":["&&Ausschneiden","Ausschneiden","Ausschneiden","&&Kopieren","Kopieren","Kopieren","&&Einf\xFCgen","Einf\xFCgen","Einf\xFCgen","Mit Syntaxhervorhebung kopieren"],"vs/editor/contrib/codeAction/codeActionCommands":["Art der auszuf\xFChrenden Codeaktion","Legt fest, wann die zur\xFCckgegebenen Aktionen angewendet werden","Die erste zur\xFCckgegebene Codeaktion immer anwenden","Die erste zur\xFCckgegebene Codeaktion anwenden, wenn nur eine vorhanden ist","Zur\xFCckgegebene Codeaktionen nicht anwenden","Legt fest, ob nur bevorzugte Codeaktionen zur\xFCckgegeben werden sollen","Beim Anwenden der Code-Aktion ist ein unbekannter Fehler aufgetreten","Schnelle Problembehebung ...","Keine Codeaktionen verf\xFCgbar",'Keine bevorzugten Codeaktionen f\xFCr "{0}" verf\xFCgbar','Keine Codeaktionen f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Codeaktionen verf\xFCgbar","Keine Codeaktionen verf\xFCgbar","Refactoring durchf\xFChren...",'Keine bevorzugten Refactorings f\xFCr "{0}" verf\xFCgbar','Keine Refactorings f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Refactorings verf\xFCgbar","Keine Refactorings verf\xFCgbar","Quellaktion...",'Keine bevorzugten Quellaktionen f\xFCr "{0}" verf\xFCgbar','Keine Quellaktionen f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Quellaktionen verf\xFCgbar","Keine Quellaktionen verf\xFCgbar","Importe organisieren","Keine Aktion zum Organisieren von Importen verf\xFCgbar","Alle korrigieren",'Aktion "Alle korrigieren" nicht verf\xFCgbar',"Automatisch korrigieren...","Keine automatischen Korrekturen verf\xFCgbar"],"vs/editor/contrib/codeAction/lightBulbWidget":["Fixes anzeigen. Bevorzugter Fix verf\xFCgbar ({0})","Korrekturen anzeigen ({0})","Korrekturen anzeigen"],"vs/editor/contrib/codelens/codelensController":["CodeLens-Befehle f\xFCr aktuelle Zeile anzeigen"],"vs/editor/contrib/comment/comment":["Zeilenkommentar umschalten","Zeilenkommen&&tar umschalten","Zeilenkommentar hinzuf\xFCgen","Zeilenkommentar entfernen","Blockkommentar umschalten","&&Blockkommentar umschalten"],"vs/editor/contrib/contextmenu/contextmenu":["Editor-Kontextmen\xFC anzeigen"],"vs/editor/contrib/cursorUndo/cursorUndo":["Mit Cursor r\xFCckg\xE4ngig machen","Wiederholen mit Cursor"],"vs/editor/contrib/find/findController":["Suchen","&&Suchen","Mit Auswahl suchen","Weitersuchen","Weitersuchen","Vorheriges Element suchen","Vorheriges Element suchen","N\xE4chste Auswahl suchen","Vorherige Auswahl suchen","Ersetzen","&&Ersetzen"],"vs/editor/contrib/find/findWidget":['Symbol f\xFCr "In Auswahl suchen" im Editor-Such-Widget.',"Symbol f\xFCr die Anzeige, dass das Editor-Such-Widget zugeklappt wurde.","Symbol f\xFCr die Anzeige, dass das Editor-Such-Widget aufgeklappt wurde.",'Symbol f\xFCr "Ersetzen" im Editor-Such-Widget.','Symbol f\xFCr "Alle ersetzen" im Editor-Such-Widget.','Symbol f\xFCr "Vorheriges Element suchen" im Editor-Such-Widget.','Symbol f\xFCr "N\xE4chstes Element suchen" im Editor-Such-Widget.',"Suchen","Suchen","Vorheriger Treffer","N\xE4chste \xDCbereinstimmung","In Auswahl suchen","Schlie\xDFen","Ersetzen","Ersetzen","Ersetzen","Alle ersetzen","Ersetzen-Modus wechseln","Nur die ersten {0} Ergebnisse wurden hervorgehoben, aber alle Suchoperationen werden auf dem gesamten Text durchgef\xFChrt.","{0} von {1}","Keine Ergebnisse","{0} gefunden",'{0} f\xFCr "{1}" gefunden','{0} f\xFCr "{1}" gefunden, bei {2}','{0} f\xFCr "{1}" gefunden','STRG+EINGABE f\xFCgt jetzt einen Zeilenumbruch ein, statt alles zu ersetzen. Sie k\xF6nnen die Tastenzuordnung f\xFCr "editor.action.replaceAll" \xE4ndern, um dieses Verhalten au\xDFer Kraft zu setzen.'],"vs/editor/contrib/folding/folding":["Auffalten","Faltung rekursiv aufheben","Falten","Einklappung umschalten","Rekursiv falten","Alle Blockkommentare falten","Alle Regionen falten","Alle Regionen auffalten","Alle falten","Alle auffalten","Faltebene {0}","Hintergrundfarbe hinter gefalteten Bereichen. Die Farbe darf nicht deckend sein, sodass zugrunde liegende Dekorationen nicht ausgeblendet werden.","Farbe des Faltsteuerelements im Editor-Bundsteg."],"vs/editor/contrib/folding/foldingDecorations":["Symbol f\xFCr aufgeklappte Bereiche im Editor-Glyphenrand.","Symbol f\xFCr zugeklappte Bereiche im Editor-Glyphenrand."],"vs/editor/contrib/fontZoom/fontZoom":["Editorschriftart vergr\xF6\xDFern","Editorschriftart verkleinern","Editor Schriftart Vergr\xF6\xDFerung zur\xFCcksetzen"],"vs/editor/contrib/format/format":["1 Formatierung in Zeile {0} vorgenommen","{0} Formatierungen in Zeile {1} vorgenommen","1 Formatierung zwischen Zeilen {0} und {1} vorgenommen","{0} Formatierungen zwischen Zeilen {1} und {2} vorgenommen"],"vs/editor/contrib/format/formatActions":["Dokument formatieren","Auswahl formatieren"],"vs/editor/contrib/gotoError/gotoError":["Gehe zu n\xE4chstem Problem (Fehler, Warnung, Information)","Symbol f\xFCr den Marker zum Wechseln zum n\xE4chsten Element.","Gehe zu vorigem Problem (Fehler, Warnung, Information)","Symbol f\xFCr den Marker zum Wechseln zum vorherigen Element.","Gehe zu dem n\xE4chsten Problem in den Dateien (Fehler, Warnung, Info)","N\xE4chstes &&Problem","Gehe zu dem vorherigen Problem in den Dateien (Fehler, Warnung, Info)","Vorheriges &&Problem"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Fehler","Warnung","Info","Hinweis","{0} bei {1}. ","{0} von {1} Problemen","{0} von {1} Problemen","Editormarkierung: Farbe bei Fehler des Navigationswidgets.","Editormarkierung: Farbe bei Warnung des Navigationswidgets.","Editormarkierung: Farbe bei Information des Navigationswidgets.","Editormarkierung: Hintergrund des Navigationswidgets."],"vs/editor/contrib/gotoSymbol/goToCommands":["Vorschau","Definitionen",'Keine Definition gefunden f\xFCr "{0}".',"Keine Definition gefunden","Gehe zu Definition","Gehe &&zu Definition","Definition an der Seite \xF6ffnen","Definition einsehen","Deklarationen",'Keine Deklaration f\xFCr "{0}" gefunden.',"Keine Deklaration gefunden.","Zur Deklaration wechseln","Gehe zu &&Deklaration",'Keine Deklaration f\xFCr "{0}" gefunden.',"Keine Deklaration gefunden.","Vorschau f\xFCr Deklaration anzeigen","Typdefinitionen",'Keine Typendefinition gefunden f\xFCr "{0}"',"Keine Typendefinition gefunden","Zur Typdefinition wechseln","Zur &&Typdefinition wechseln","Vorschau der Typdefinition anzeigen","Implementierungen",'Keine Implementierung gefunden f\xFCr "{0}"',"Keine Implementierung gefunden","Gehe zu Implementierungen","Gehe zu &&Implementierungen","Vorschau f\xFCr Implementierungen anzeigen",'F\xFCr "{0}" wurden keine Verweise gefunden.',"Keine Referenzen gefunden","Gehe zu Verweisen","Gehe zu &&Verweisen","Verweise","Vorschau f\xFCr Verweise anzeigen","Verweise","Gehe zu beliebigem Symbol","Speicherorte",'Keine Ergebnisse f\xFCr "{0}"',"Verweise"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Klicken Sie, um {0} Definitionen anzuzeigen."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Wird geladen...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} Verweise","{0} Verweis","Verweise"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["Keine Vorschau verf\xFCgbar.","Keine Ergebnisse","Verweise"],"vs/editor/contrib/gotoSymbol/referencesModel":["Symbol in {0} in Zeile {1}, Spalte {2}",'Symbol in "{0}" in Zeile {1}, Spalte {2}, {3}',"1 Symbol in {0}, vollst\xE4ndiger Pfad {1}","{0} Symbole in {1}, vollst\xE4ndiger Pfad {2}","Es wurden keine Ergebnisse gefunden.","1 Symbol in {0} gefunden","{0} Symbole in {1} gefunden","{0} Symbole in {1} Dateien gefunden"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["Symbol {0} von {1}, {2} f\xFCr n\xE4chstes","Symbol {0} von {1}"],"vs/editor/contrib/hover/hover":["Hovern anzeigen","Definitionsvorschauhover anzeigen"],"vs/editor/contrib/hover/markdownHoverParticipant":["Wird geladen..."],"vs/editor/contrib/hover/markerHoverParticipant":["Problem anzeigen","Keine Schnellkorrekturen verf\xFCgbar","Es wird nach Schnellkorrekturen gesucht...","Keine Schnellkorrekturen verf\xFCgbar","Schnelle Problembehebung ..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Durch vorherigen Wert ersetzen","Durch n\xE4chsten Wert ersetzen"],"vs/editor/contrib/indentation/indentation":["Einzug in Leerzeichen konvertieren","Einzug in Tabstopps konvertieren","Konfigurierte Tabulatorgr\xF6\xDFe","Tabulatorgr\xF6\xDFe f\xFCr aktuelle Datei ausw\xE4hlen","Einzug mithilfe von Tabstopps","Einzug mithilfe von Leerzeichen","Einzug aus Inhalt erkennen","Neuen Einzug f\xFCr Zeilen festlegen","Gew\xE4hlte Zeilen zur\xFCckziehen"],"vs/editor/contrib/linesOperations/linesOperations":["Zeile nach oben kopieren","Zeile nach oben &&kopieren","Zeile nach unten kopieren","Zeile nach unten ko&&pieren","Auswahl duplizieren","&&Auswahl duplizieren","Zeile nach oben verschieben","Zeile nach oben &&verschieben","Zeile nach unten verschieben","Zeile nach &&unten verschieben","Zeilen aufsteigend sortieren","Zeilen absteigend sortieren","Nachgestelltes Leerzeichen k\xFCrzen","Zeile l\xF6schen","Zeileneinzug","Zeile ausr\xFCcken","Zeile oben einf\xFCgen","Zeile unten einf\xFCgen","Alle \xFCbrigen l\xF6schen","Alle rechts l\xF6schen","Zeilen verkn\xFCpfen","Zeichen um den Cursor herum transponieren","In Gro\xDFbuchstaben umwandeln","In Kleinbuchstaben umwandeln","In gro\xDFe Anfangsbuchstaben umwandeln","In Snake Case umwandeln"],"vs/editor/contrib/linkedEditing/linkedEditing":["Verkn\xFCpfte Bearbeitung starten","Hintergrundfarbe, wenn der Editor automatisch nach Typ umbenennt."],"vs/editor/contrib/links/links":["Befehl ausf\xFChren","Link folgen","BEFEHL + Klicken","STRG + Klicken","OPTION + Klicken","alt + klicken",'F\xFChren Sie den Befehl "{0}" aus.',"Fehler beim \xD6ffnen dieses Links, weil er nicht wohlgeformt ist: {0}","Fehler beim \xD6ffnen dieses Links, weil das Ziel fehlt.","Link \xF6ffnen"],"vs/editor/contrib/message/messageController":["Gibt an, ob der Editor zurzeit eine Inlinenachricht anzeigt.","Ein Bearbeiten ist im schreibgesch\xFCtzten Editor nicht m\xF6glich"],"vs/editor/contrib/multicursor/multicursor":["Cursor oberhalb hinzuf\xFCgen","Cursor oberh&&alb hinzuf\xFCgen","Cursor unterhalb hinzuf\xFCgen","Cursor unterhal&&b hinzuf\xFCgen","Cursor an Zeilenenden hinzuf\xFCgen","C&&ursor an Zeilenenden hinzuf\xFCgen","Cursor am Ende hinzuf\xFCgen","Cursor am Anfang hinzuf\xFCgen","Auswahl zur n\xE4chsten \xDCbereinstimmungssuche hinzuf\xFCgen","&&N\xE4chstes Vorkommen hinzuf\xFCgen","Letzte Auswahl zu vorheriger \xDCbereinstimmungssuche hinzuf\xFCgen","Vo&&rheriges Vorkommen hinzuf\xFCgen","Letzte Auswahl in n\xE4chste \xDCbereinstimmungssuche verschieben","Letzte Auswahl in vorherige \xDCbereinstimmungssuche verschieben","Alle Vorkommen ausw\xE4hlen und \xDCbereinstimmung suchen","Alle V&&orkommen ausw\xE4hlen","Alle Vorkommen \xE4ndern"],"vs/editor/contrib/parameterHints/parameterHints":["Parameterhinweise ausl\xF6sen"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Symbol f\xFCr die Anzeige des n\xE4chsten Parameterhinweises.","Symbol f\xFCr die Anzeige des vorherigen Parameterhinweises.","{0}, Hinweis"],"vs/editor/contrib/peekView/peekView":["Schlie\xDFen","Hintergrundfarbe des Titelbereichs der Peek-Ansicht.","Farbe des Titels in der Peek-Ansicht.","Farbe der Titelinformationen in der Peek-Ansicht.","Farbe der Peek-Ansichtsr\xE4nder und des Pfeils.","Hintergrundfarbe der Ergebnisliste in der Peek-Ansicht.","Vordergrundfarbe f\xFCr Zeilenknoten in der Ergebnisliste der Peek-Ansicht.","Vordergrundfarbe f\xFCr Dateiknoten in der Ergebnisliste der Peek-Ansicht.","Hintergrundfarbe des ausgew\xE4hlten Eintrags in der Ergebnisliste der Peek-Ansicht.","Vordergrundfarbe des ausgew\xE4hlten Eintrags in der Ergebnisliste der Peek-Ansicht.","Hintergrundfarbe des Peek-Editors.","Hintergrundfarbe der Leiste im Peek-Editor.","Farbe f\xFCr \xDCbereinstimmungsmarkierungen in der Ergebnisliste der Peek-Ansicht.","Farbe f\xFCr \xDCbereinstimmungsmarkierungen im Peek-Editor.","Rahmen f\xFCr \xDCbereinstimmungsmarkierungen im Peek-Editor."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\xD6ffnen Sie zuerst einen Text-Editor, um zu einer Zeile zu wechseln.","Wechseln Sie zu Zeile {0} und Spalte {1}.","Zu Zeile {0} wechseln.","Aktuelle Zeile: {0}, Zeichen: {1}. Geben Sie eine Zeilennummer zwischen 1 und {2} ein, zu der Sie navigieren m\xF6chten.","Aktuelle Zeile: {0}, Zeichen: {1}. Geben Sie eine Zeilennummer ein, zu der Sie navigieren m\xF6chten."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\xD6ffnen Sie zun\xE4chst einen Text-Editor mit Symbolinformationen, um zu einem Symbol zu navigieren.","Der aktive Text-Editor stellt keine Symbolinformationen bereit.","Keine \xFCbereinstimmenden Editorsymbole.","Keine Editorsymbole.","An der Seite \xF6ffnen","Unten \xF6ffnen","Symbole ({0})","Eigenschaften ({0})","Methoden ({0})","Funktionen ({0})","Konstruktoren ({0})","Variablen ({0})","Klassen ({0})","Strukturen ({0})","Ereignisse ({0})","Operatoren ({0})","Schnittstellen ({0})","Namespaces ({0})","Pakete ({0})","Typparameter ({0})","Module ({0})","Eigenschaften ({0})","Enumerationen ({0})","Enumerationsmember ({0})","Zeichenfolgen ({0})","Dateien ({0})","Arrays ({0})","Zahlen ({0})","Boolesche Werte ({0})","Objekte ({0})","Schl\xFCssel ({0})","Felder ({0})","Konstanten ({0})"],"vs/editor/contrib/rename/rename":["Kein Ergebnis.","Ein unbekannter Fehler ist beim Aufl\xF6sen der Umbenennung eines Ortes aufgetreten.",'"{0}" wird umbenannt.',"{0} wird umbenannt.",'"{0}" erfolgreich in "{1}" umbenannt. Zusammenfassung: {2}',"Die rename-Funktion konnte die \xC4nderungen nicht anwenden.","Die rename-Funktion konnte die \xC4nderungen nicht berechnen.","Symbol umbenennen","M\xF6glichkeit aktivieren/deaktivieren, \xC4nderungen vor dem Umbenennen als Vorschau anzeigen zu lassen"],"vs/editor/contrib/rename/renameInputField":["Benennen Sie die Eingabe um. Geben Sie einen neuen Namen ein, und dr\xFCcken Sie die EINGABETASTE, um den Commit auszuf\xFChren.","{0} zur Umbenennung, {1} zur Vorschau"],"vs/editor/contrib/smartSelect/smartSelect":["Auswahl aufklappen","Auswahl &&erweitern","Markierung verkleinern","Au&&swahl verkleinern"],"vs/editor/contrib/snippet/snippetVariables":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","So","Mo","Di","Mi","Do","Fr","Sa","Januar","Februar","M\xE4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember","Jan","Feb","M\xE4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"vs/editor/contrib/suggest/suggestController":['Das Akzeptieren von "{0}" ergab {1} zus\xE4tzliche Bearbeitungen.',"Vorschlag ausl\xF6sen","Einf\xFCgen","Einf\xFCgen","Ersetzen","Ersetzen","Einf\xFCgen","weniger anzeigen","mehr anzeigen","Gr\xF6\xDFe des Vorschlagswidgets zur\xFCcksetzen"],"vs/editor/contrib/suggest/suggestWidget":["Hintergrundfarbe des Vorschlagswidgets.","Rahmenfarbe des Vorschlagswidgets.","Vordergrundfarbe des Vorschlagswidgets.","Hintergrundfarbe des ausgew\xE4hlten Eintrags im Vorschlagswidget.","Farbe der Trefferhervorhebung im Vorschlagswidget.","Wird geladen...","Keine Vorschl\xE4ge.","{0}, Dokumente: {1}","Vorschlagen"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Schlie\xDFen","Wird geladen..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Symbol f\xFCr weitere Informationen im Vorschlags-Widget.","Weitere Informationen"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["Die Vordergrundfarbe f\xFCr Arraysymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr boolesche Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Klassensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Farbsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr konstante Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Konstruktorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Enumeratorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Enumeratormembersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Ereignissymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Feldsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Dateisymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Ordnersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Funktionssymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schnittstellensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schl\xFCsselsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schl\xFCsselwortsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Methodensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Modulsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Namespacesymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr NULL-Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Zahlensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Objektsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Operatorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Paketsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Eigenschaftensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Referenzsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Codeausschnittsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Zeichenfolgensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Struktursymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Textsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Typparametersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Einheitensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr variable Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["TAB-Umschalttaste verschiebt Fokus","Beim Dr\xFCcken auf Tab wird der Fokus jetzt auf das n\xE4chste fokussierbare Element verschoben","Beim Dr\xFCcken von Tab wird jetzt das Tabulator-Zeichen eingef\xFCgt"],"vs/editor/contrib/tokenization/tokenization":["Entwickler: Force Retokenize"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Ungew\xF6hnliche Zeilentrennzeichen","Ungew\xF6hnliche Zeilentrennzeichen erkannt",`Diese Datei enth\xE4lt mindestens ein ung\xFCltiges Zeilenabschlusszeichen, z.\xA0B. Zeilentrennzeichen (LS) oder Absatztrennzeichen (PS).\r +\r +Es wird empfohlen, diese Zeichen aus der Datei zu entfernen. Die betreffende Einstellung kann \xFCber "editor.unusualLineTerminators" konfiguriert werden.`,"Diese Datei korrigieren","Problem f\xFCr diese Datei ignorieren"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Hintergrundfarbe eines Symbols beim Lesezugriff, z.B. beim Lesen einer Variablen. Die Farbe darf nicht deckend sein, damit sie nicht die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe eines Symbols bei Schreibzugriff, z.B. beim Schreiben in eine Variable. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Randfarbe eines Symbols beim Lesezugriff, wie etwa beim Lesen einer Variablen.","Randfarbe eines Symbols beim Schreibzugriff, wie etwa beim Schreiben einer Variablen.","\xDCbersichtslinealmarkerfarbd f\xFCr das Hervorheben von Symbolen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslinealmarkerfarbe f\xFCr Symbolhervorhebungen bei Schreibzugriff. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Gehe zur n\xE4chsten Symbolhervorhebungen","Gehe zur vorherigen Symbolhervorhebungen","Symbol-Hervorhebung ein-/ausschalten"],"vs/editor/contrib/wordOperations/wordOperations":["Wort l\xF6schen"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Au\xDFerkraftsetzungen f\xFCr die Standardsprachkonfiguration","Zu \xFCberschreibende Editor-Einstellungen f\xFCr eine Sprache konfigurieren.","Diese Einstellung unterst\xFCtzt keine sprachspezifische Konfiguration.","Eine leere Eigenschaft kann nicht registriert werden.",'"{0}" kann nicht registriert werden. Stimmt mit dem Eigenschaftsmuster "\\\\[.*\\\\]$" zum Beschreiben sprachspezifischer Editor-Einstellungen \xFCberein. Verwenden Sie den Beitrag "configurationDefaults".','{0}" kann nicht registriert werden. Diese Eigenschaft ist bereits registriert.'],"vs/platform/contextkey/browser/contextKeyService":["Ein Befehl, der Informationen zu Kontextschl\xFCsseln zur\xFCckgibt"],"vs/platform/contextkey/common/contextkeys":["Gibt an, ob Windows als Betriebssystem verwendet wird."],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) wurde gedr\xFCckt. Es wird auf die zweite Taste in der Kombination gewartet...","Die Tastenkombination ({0}, {1}) ist kein Befehl."],"vs/platform/list/browser/listService":["Workbench","Ist unter Windows und Linux der STRG-Taste und unter macOS der Befehlstaste zugeordnet.","Ist unter Windows und Linux der ALT-Taste und unter macOS der Wahltaste zugeordnet.",'Der Modifizierer zum Hinzuf\xFCgen eines Elements in B\xE4umen und Listen zu einer Mehrfachauswahl mit der Maus (zum Beispiel im Explorer, in ge\xF6ffneten Editoren und in der SCM-Ansicht). Die Mausbewegung "Seitlich \xF6ffnen" wird \u2013 sofern unterst\xFCtzt \u2013 so angepasst, dass kein Konflikt mit dem Modifizierer f\xFCr Mehrfachauswahl entsteht.',"Steuert, wie Elemente in Strukturen und Listen mithilfe der Maus ge\xF6ffnet werden (sofern unterst\xFCtzt). Bei \xFCbergeordneten Elementen, deren untergeordnete Elemente sich in Strukturen befinden, steuert diese Einstellung, ob ein Einfachklick oder ein Doppelklick das \xFCbergeordnete Elemente erweitert. Beachten Sie, dass einige Strukturen und Listen diese Einstellung ggf. ignorieren, wenn sie nicht zutrifft.","Steuert, ob Listen und Strukturen ein horizontales Scrollen in der Workbench unterst\xFCtzen. Warnung: Das Aktivieren dieser Einstellung kann sich auf die Leistung auswirken.","Steuert den Struktureinzug in Pixeln.","Steuert, ob die Struktur Einzugsf\xFChrungslinien rendern soll.","Steuert, ob Listen und Strukturen einen optimierten Bildlauf verwenden.","Bei der einfachen Tastaturnavigation werden Elemente in den Fokus genommen, die mit der Tastatureingabe \xFCbereinstimmen. Die \xDCbereinstimmungen gelten nur f\xFCr Pr\xE4fixe.","Hervorheben von Tastaturnavigationshervorgebungselemente, die mit der Tastatureingabe \xFCbereinstimmen. Beim nach oben und nach unten Navigieren werden nur die hervorgehobenen Elemente durchlaufen.","Durch das Filtern der Tastaturnavigation werden alle Elemente herausgefiltert und ausgeblendet, die nicht mit der Tastatureingabe \xFCbereinstimmen.",'Steuert die Tastaturnavigation in Listen und Strukturen in der Workbench. Kann "simple" (einfach), "highlight" (hervorheben) und "filter" (filtern) sein.','Legt fest, ob die Tastaturnavigation in Listen und Strukturen automatisch durch Eingaben ausgel\xF6st wird. Wenn der Wert auf "false" festgelegt ist, wird die Tastaturnavigation nur ausgel\xF6st, wenn der Befehl "list.toggleKeyboardNavigation" ausgef\xFChrt wird. Diesem Befehl k\xF6nnen Sie eine Tastenkombination zuweisen.',"Steuert, wie Strukturordner beim Klicken auf die Ordnernamen erweitert werden. Beachten Sie, dass einige Strukturen und Listen diese Einstellung ggf. ignorieren, wenn sie nicht zutrifft."],"vs/platform/markers/common/markers":["Fehler","Warnung","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","zuletzt verwendet","andere Befehle","Der Befehl {0} hat einen Fehler ausgel\xF6st ({1})."],"vs/platform/quickinput/browser/helpQuickAccess":["Globale Befehle","Editor-Befehle","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Allgemeine Vordergrundfarbe. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Allgemeine Vordergrundfarbe f\xFCr Fehlermeldungen. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Die f\xFCr Symbole in der Workbench verwendete Standardfarbe.","Allgemeine Rahmenfarbe f\xFCr fokussierte Elemente. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Ein zus\xE4tzlicher Rahmen um Elemente, mit dem diese von anderen getrennt werden, um einen gr\xF6\xDFeren Kontrast zu erreichen.","Ein zus\xE4tzlicher Rahmen um aktive Elemente, mit dem diese von anderen getrennt werden, um einen gr\xF6\xDFeren Kontrast zu erreichen.","Vordergrundfarbe f\xFCr Links im Text.","Hintergrundfarbe f\xFCr Codebl\xF6cke im Text.","Schattenfarbe von Widgets wie zum Beispiel Suchen/Ersetzen innerhalb des Editors.","Hintergrund f\xFCr Eingabefeld.","Vordergrund f\xFCr Eingabefeld.","Rahmen f\xFCr Eingabefeld.","Rahmenfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Hintergrundfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Vordergrundfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Hintergrund f\xFCr Dropdown.","Vordergrund f\xFCr Dropdown.","Vordergrundfarbe der Schaltfl\xE4che.","Hintergrundfarbe der Schaltfl\xE4che.","Hintergrundfarbe der Schaltfl\xE4che, wenn darauf gezeigt wird.","Hintergrundfarbe f\xFCr Badge. Badges sind kurze Info-Texte, z.B. f\xFCr Anzahl Suchergebnisse.","Vordergrundfarbe f\xFCr Badge. Badges sind kurze Info-Texte, z.B. f\xFCr Anzahl Suchergebnisse.","Schatten der Scrollleiste, um anzuzeigen, dass die Ansicht gescrollt wird.","Hintergrundfarbe vom Scrollbar-Schieber","Hintergrundfarbe des Schiebereglers, wenn darauf gezeigt wird.","Hintergrundfarbe des Schiebereglers, wenn darauf geklickt wird.","Hintergrundfarbe des Fortschrittbalkens, der f\xFCr zeitintensive Vorg\xE4nge angezeigt werden kann.","Hintergrundfarbe f\xFCr Fehlertext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Fehlerunterstreichungen im Editor.","Randfarbe von Fehlerfeldern im Editor.","Hintergrundfarbe f\xFCr Warnungstext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Warnungsunterstreichungen im Editor.","Randfarbe der Warnfelder im Editor.","Hintergrundfarbe f\xFCr Infotext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Informationsunterstreichungen im Editor.","Randfarbe der Infofelder im Editor.","Vordergrundfarbe der Hinweisunterstreichungen im Editor.","Randfarbe der Hinweisfelder im Editor.","Hintergrundfarbe des Editors.","Standardvordergrundfarbe des Editors.","Hintergrundfarbe von Editor-Widgets wie zum Beispiel Suchen/Ersetzen.","Vordergrundfarbe f\xFCr Editorwidgets wie Suchen/Ersetzen.","Rahmenfarbe von Editorwigdets. Die Farbe wird nur verwendet, wenn f\xFCr das Widget ein Rahmen verwendet wird und die Farbe nicht von einem Widget \xFCberschrieben wird.","Rahmenfarbe der Gr\xF6\xDFenanpassungsleiste von Editorwigdets. Die Farbe wird nur verwendet, wenn f\xFCr das Widget ein Gr\xF6\xDFenanpassungsrahmen verwendet wird und die Farbe nicht von einem Widget au\xDFer Kraft gesetzt wird.","Schnellauswahl der Hintergrundfarbe. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Vordergrundfarbe der Schnellauswahl. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Hintergrundfarbe f\xFCr den Titel der Schnellauswahl. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Die Hintergrundfarbe der Schnellauswahl f\xFCr das fokussierte Element.","Schnellauswahlfarbe f\xFCr das Gruppieren von Bezeichnungen.","Schnellauswahlfarbe f\xFCr das Gruppieren von Rahmen.","Farbe der Editor-Auswahl.","Farbe des gew\xE4hlten Text f\xFCr einen hohen Kontrast","Die Farbe der Auswahl befindet sich in einem inaktiven Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegende Dekorationen verdeckt.","Farbe f\xFCr Bereiche mit dem gleichen Inhalt wie die Auswahl. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Randfarbe f\xFCr Bereiche, deren Inhalt der Auswahl entspricht.","Farbe des aktuellen Suchergebnisses.","Farbe der anderen Suchergebnisse. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Farbe des Bereichs, der die Suche eingrenzt. Die Farbe darf nicht deckend sein, damit sie nicht die zugrunde liegenden Dekorationen verdeckt.","Randfarbe des aktuellen Suchergebnisses.","Randfarbe der anderen Suchtreffer.","Rahmenfarbe des Bereichs, der die Suche eingrenzt. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hervorhebung unterhalb des Worts, f\xFCr das ein Hoverelement angezeigt wird. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe des Editor-Mauszeigers.","Vordergrundfarbe des Editor-Mauszeigers","Rahmenfarbe des Editor-Mauszeigers.","Hintergrundfarbe der Hoverstatusleiste des Editors.","Farbe der aktiven Links.","Vordergrundfarbe f\xFCr Inlinehinweise","Hintergrundfarbe f\xFCr Inlinehinweise",'Die f\xFCr das Aktionssymbol "Gl\xFChbirne" verwendete Farbe.','Die f\xFCr das Aktionssymbol "Automatische Gl\xFChbirnenkorrektur" verwendete Farbe.',"Hintergrundfarbe f\xFCr eingef\xFCgten Text. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe f\xFCr Text, der entfernt wurde. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Konturfarbe f\xFCr eingef\xFCgten Text.","Konturfarbe f\xFCr entfernten Text.","Die Rahmenfarbe zwischen zwei Text-Editoren.","Farbe der diagonalen F\xFCllung des Vergleichs-Editors. Die diagonale F\xFCllung wird in Ansichten mit parallelem Vergleich verwendet.","Hintergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Konturfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Baumstruktur inaktiv ist. Eine aktive Liste/Baumstruktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Konturfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.","Vordergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.","Drag & Drop-Hintergrund der Liste/Struktur, wenn Elemente mithilfe der Maus verschoben werden.","Vordergrundfarbe der Liste/Struktur zur Trefferhervorhebung beim Suchen innerhalb der Liste/Struktur.","Hintergrundfarbe des Typfilterwidgets in Listen und Strukturen.","Konturfarbe des Typfilterwidgets in Listen und Strukturen.","Konturfarbe des Typfilterwidgets in Listen und Strukturen, wenn es keine \xDCbereinstimmungen gibt.","Strukturstrichfarbe f\xFCr die Einzugsf\xFChrungslinien.","Strukturstrichfarbe f\xFCr die Einzugsf\xFChrungslinien.","Rahmenfarbe von Men\xFCs.","Vordergrundfarbe von Men\xFCelementen.","Hintergrundfarbe von Men\xFCelementen.","Vordergrundfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Hintergrundfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Rahmenfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Farbe eines Trenner-Men\xFCelements in Men\xFCs.","Hervorhebungs-Hintergrundfarbe eines Codeausschnitt-Tabstopps.","Hervorhebungs-Rahmenfarbe eines Codeausschnitt-Tabstopps.","Hervorhebungs-Hintergrundfarbe des letzten Tabstopps eines Codeausschnitts.","Rahmenfarbe zur Hervorhebung des letzten Tabstopps eines Codeausschnitts.","\xDCbersichtslinealmarkerfarbe f\xFCr das Suchen von \xDCbereinstimmungen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslinealmarkerfarbe f\xFCr das Hervorheben der Auswahl. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Minimap-Markerfarbe f\xFCr gefundene \xDCbereinstimmungen.","Minimap-Markerfarbe f\xFCr die Editorauswahl.","Minimapmarkerfarbe f\xFCr Fehler","Minimapmarkerfarbe f\xFCr Warnungen","Hintergrundfarbe der Minimap.","Hintergrundfarbe des Minimap-Schiebereglers.","Hintergrundfarbe des Minimap-Schiebereglers beim Daraufzeigen.","Hintergrundfarbe des Minimap-Schiebereglers, wenn darauf geklickt wird.","Die Farbe, die f\xFCr das Problemfehlersymbol verwendet wird.","Die Farbe, die f\xFCr das Problemwarnsymbol verwendet wird.","Die Farbe, die f\xFCr das Probleminfosymbol verwendet wird."],"vs/platform/theme/common/iconRegistry":["Die ID der zu verwendenden Schriftart. Sofern nicht festgelegt, wird die zuerst definierte Schriftart verwendet.","Das der Symboldefinition zugeordnete Schriftzeichen.","Symbol f\xFCr Aktion zum Schlie\xDFen in Widgets"],"vs/platform/undoRedo/common/undoRedoService":["Die folgenden Dateien wurden geschlossen und auf dem Datentr\xE4ger ge\xE4ndert: {0}.","Die folgenden Dateien wurden auf inkompatible Weise ge\xE4ndert: {0}.",'"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden. {1}','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden. {1}','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, da \xC4nderungen an {1} vorgenommen wurden.','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen f\xFCr "{1}" durchgef\xFChrt wird.','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, weil in der Zwischenzeit bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wurde.','M\xF6chten Sie "{0}" f\xFCr alle Dateien r\xFCckg\xE4ngig machen?',"In {0} Dateien r\xFCckg\xE4ngig machen","Datei r\xFCckg\xE4ngig machen","Abbrechen",'"{0}" konnte nicht r\xFCckg\xE4ngig gemacht werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wird.','M\xF6chten Sie "{0}" r\xFCckg\xE4ngig machen?',"R\xFCckg\xE4ngig machen","Abbrechen",'"{0}" konnte nicht in allen Dateien wiederholt werden. {1}','"{0}" konnte nicht in allen Dateien wiederholt werden. {1}','"{0}" konnte nicht in allen Dateien wiederholt werden, da \xC4nderungen an {1} vorgenommen wurden.','"{0}" konnte nicht f\xFCr alle Dateien wiederholt werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen f\xFCr "{1}" durchgef\xFChrt wird.','"{0}" konnte nicht f\xFCr alle Dateien wiederholt werden, weil in der Zwischenzeit bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wurde.','"{0}" konnte nicht wiederholt werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wird.']}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js new file mode 100644 index 0000000000..d71fd7d7da --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.es",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["entrada"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Coincidir may\xFAsculas y min\xFAsculas","Solo palabras completas","Usar expresi\xF3n regular"],"vs/base/browser/ui/findinput/replaceInput":["entrada","Conservar may/min"],"vs/base/browser/ui/iconLabel/iconLabel":["Cargando..."],"vs/base/browser/ui/inputbox/inputBox":["Error: {0}","Advertencia: {0}","Informaci\xF3n: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Sin enlazar"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["Borrar","Desactivar filtro en tipo","Activar filtro en el tipo","No se encontraron elementos","{0} de {1} elementos coincidentes"],"vs/base/common/actions":["(vac\xEDo)"],"vs/base/common/errorMessage":["{0}: {1}","Error del sistema ({0})","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles.","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles.","{0} ({1} errores en total)","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles."],"vs/base/common/keybindingLabels":["Ctrl","May\xFAs","Alt","Windows","Ctrl","May\xFAs","Alt","Super","Control","May\xFAs","Alt","Comando","Control","May\xFAs","Alt","Windows","Control","May\xFAs","Alt","Super"],"vs/base/parts/quickinput/browser/quickInput":["Atr\xE1s","{0}/{1}","Escriba para restringir los resultados.","{0} resultados","{0} seleccionados","Aceptar","Personalizado","Atr\xE1s ({0})","Atr\xE1s"],"vs/base/parts/quickinput/browser/quickInputList":["Entrada r\xE1pida"],"vs/editor/browser/controller/coreCommands":["Anclar al final incluso cuando se vayan a l\xEDneas m\xE1s largas","Anclar al final incluso cuando se vayan a l\xEDneas m\xE1s largas"],"vs/editor/browser/controller/textAreaHandler":["editor","El editor no es accesible en este momento. Pulse {0} para ver las opciones."],"vs/editor/browser/core/keybindingCancellation":['Indica si el editor ejecuta una operaci\xF3n que se puede cancelar como, por ejemplo, "Inspeccionar referencias"'],"vs/editor/browser/editorExtensions":["&&Deshacer","Deshacer","&&Rehacer","Rehacer","&&Seleccionar todo","Seleccionar todo"],"vs/editor/browser/widget/codeEditorWidget":["El n\xFAmero de cursores se ha limitado a {0}."],"vs/editor/browser/widget/diffEditorWidget":["Decoraci\xF3n de l\xEDnea para las inserciones en el editor de diferencias.","Decoraci\xF3n de l\xEDnea para las eliminaciones en el editor de diferencias.","Los archivos no se pueden comparar porque uno de ellos es demasiado grande."],"vs/editor/browser/widget/diffReview":['Icono para "Insertar" en la revisi\xF3n de diferencias.','Icono para "Quitar" en la revisi\xF3n de diferencias.','Icono para "Cerrar" en la revisi\xF3n de diferencias.',"Cerrar","no se han cambiado l\xEDneas","1 l\xEDnea cambiada","{0} l\xEDneas cambiadas","Diferencia {0} de {1}: l\xEDnea original {2}, {3}, l\xEDnea modificada {4}, {5}","vac\xEDo","{0} l\xEDnea sin cambios {1}","{0} l\xEDnea original {1} l\xEDnea modificada {2}","+ {0} l\xEDnea modificada {1}","- {0} l\xEDnea original {1}","Ir a la siguiente diferencia","Ir a la diferencia anterior"],"vs/editor/browser/widget/inlineDiffMargin":["Copiar l\xEDneas eliminadas","Copiar l\xEDnea eliminada","Copiar la l\xEDnea eliminada ({0})","Revertir este cambio","Copiar la l\xEDnea eliminada ({0})"],"vs/editor/common/config/commonEditorConfig":["Editor",'El n\xFAmero de espacios a los que equivale una tabulaci\xF3n. Este valor se invalida en funci\xF3n del contenido del archivo cuando "#editor.detectIndentation#" est\xE1 activado.','Insertar espacios al presionar "TAB". Este valor se invalida en funci\xF3n del contenido del archivo cuando "#editor.detectIndentation#" est\xE1 activado. ','Controla si "#editor.tabSize#" y "#editor.insertSpaces#" se detectar\xE1n autom\xE1ticamente al abrir un archivo en funci\xF3n del contenido de este.',"Quitar el espacio en blanco final autoinsertado.","Manejo especial para archivos grandes para desactivar ciertas funciones de memoria intensiva.","Habilita sugerencias basadas en palabras.","Sugerir palabras solo del documento activo.","Sugerir palabras de todos los documentos abiertos del mismo idioma.","Sugerir palabras de todos los documentos abiertos.","Controla de qu\xE9 documentos se calculan las finalizaciones basadas en palabras.","El resaltado sem\xE1ntico est\xE1 habilitado para todos los temas de color.","El resaltado sem\xE1ntico est\xE1 deshabilitado para todos los temas de color.",'El resaltado sem\xE1ntico est\xE1 configurado con el valor "semanticHighlighting" del tema de color actual.',"Controla si se muestra semanticHighlighting para los idiomas que lo admiten.",'Mantiene abiertos los editores interactivos, incluso al hacer doble clic en su contenido o presionar "Escape".',"Las lineas por encima de esta longitud no se tokenizar\xE1n por razones de rendimiento.","Tiempo de espera en milisegundos despu\xE9s del cual se cancela el c\xE1lculo de diferencias. Utilice 0 para no usar tiempo de espera.","Controla si el editor de diferencias muestra las diferencias en paralelo o alineadas.","Cuando est\xE1 habilitado, el editor de diferencias omite los cambios en los espacios en blanco iniciales o finales.","Controla si el editor de diferencias muestra los indicadores +/- para los cambios agregados o quitados.","Controla si el editor muestra CodeLens.","Las l\xEDneas no se ajustar\xE1n nunca.","Las l\xEDneas se ajustar\xE1n en el ancho de la ventanilla.",'Las l\xEDneas se ajustar\xE1n en funci\xF3n de la configuraci\xF3n de "#editor.wordWrap#".'],"vs/editor/common/config/editorOptions":["El editor usar\xE1 API de plataforma para detectar cu\xE1ndo est\xE1 conectado un lector de pantalla.","El editor se optimizar\xE1 de forma permanente para su uso con un lector de pantalla. El ajuste de l\xEDneas se deshabilitar\xE1.","El editor nunca se optimizar\xE1 para su uso con un lector de pantalla.","Controla si el editor se debe ejecutar en un modo optimizado para lectores de pantalla. Si se activa, se deshabilitar\xE1 el ajuste de l\xEDneas.","Controla si se inserta un car\xE1cter de espacio al comentar.","Controla si las l\xEDneas vac\xEDas deben ignorarse con la opci\xF3n de alternar, agregar o quitar acciones para los comentarios de l\xEDnea.","Controla si al copiar sin selecci\xF3n se copia la l\xEDnea actual.","Controla si el cursor debe saltar para buscar coincidencias mientras se escribe.","Controla si la cadena de b\xFAsqueda del widget de b\xFAsqueda se inicializa desde la selecci\xF3n del editor.","No activar nunca Buscar en la selecci\xF3n autom\xE1ticamente (predeterminado)","Activar siempre autom\xE1ticamente Buscar en la selecci\xF3n","Active Buscar en la selecci\xF3n autom\xE1ticamente cuando se seleccionen varias l\xEDneas de contenido.","Controla la condici\xF3n para activar la b\xFAsqueda en la selecci\xF3n de forma autom\xE1tica.","Controla si el widget de b\xFAsqueda debe leer o modificar el Portapapeles de b\xFAsqueda compartido en macOS.","Controla si Encontrar widget debe agregar m\xE1s l\xEDneas en la parte superior del editor. Si es true, puede desplazarse m\xE1s all\xE1 de la primera l\xEDnea cuando Encontrar widget est\xE1 visible.","Controla si la b\xFAsqueda se reinicia autom\xE1ticamente desde el principio (o el final) cuando no se encuentran m\xE1s coincidencias.",'Habilita o deshabilita las ligaduras tipogr\xE1ficas (caracter\xEDsticas de fuente "calt" y "liga"). C\xE1mbielo a una cadena para el control espec\xEDfico de la propiedad de CSS "font-feature-settings".','Propiedad de CSS "font-feature-settings" expl\xEDcita. En su lugar, puede pasarse un valor booleano si solo es necesario activar o desactivar las ligaduras.','Configura las ligaduras tipogr\xE1ficas o las caracter\xEDsticas de fuente. Puede ser un valor booleano para habilitar o deshabilitar las ligaduras o bien una cadena para el valor de la propiedad "font-feature-settings" de CSS.',"Controla el tama\xF1o de fuente en p\xEDxeles.",'Solo se permiten las palabras clave "normal" y "negrita" o los n\xFAmeros entre 1 y 1000.','Controla el grosor de la fuente. Acepta las palabras clave "normal" y "negrita" o los n\xFAmeros entre 1 y 1000.',"Mostrar vista de inspecci\xF3n de los resultados (predeterminado)","Ir al resultado principal y mostrar una vista de inspecci\xF3n","Vaya al resultado principal y habilite la navegaci\xF3n sin peek para otros",'Esta configuraci\xF3n est\xE1 en desuso. Use configuraciones separadas como "editor.editor.gotoLocation.multipleDefinitions" o "editor.editor.gotoLocation.multipleImplementations" en su lugar.','Controla el comportamiento del comando "Ir a definici\xF3n" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a definici\xF3n de tipo" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a declaraci\xF3n" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a implementaciones" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a referencias" cuando existen varias ubicaciones de destino.','Identificador de comando alternativo que se ejecuta cuando el resultado de "Ir a definici\xF3n" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a definici\xF3n de tipo" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a declaraci\xF3n" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a implementaci\xF3n" es la ubicaci\xF3n actual.','Identificador de comando alternativo que se ejecuta cuando el resultado de "Ir a referencia" es la ubicaci\xF3n actual.',"Controla si se muestra la informaci\xF3n al mantener el puntero sobre un elemento.","Controla el retardo en milisegundos despu\xE9s del cual se muestra la informaci\xF3n al mantener el puntero sobre un elemento.","Controla si la informaci\xF3n que aparece al mantener el puntero sobre un elemento permanece visible al mover el mouse sobre este.","Habilita la bombilla de acci\xF3n de c\xF3digo en el editor.","Habilita las sugerencias insertadas en el editor.",'Controla el tama\xF1o de fuente de las sugerencias insertadas en el editor. Cuando se establece en "0", se usa el 90\xA0% de "#editor.fontSize#".',"Controla la familia de fuentes de las sugerencias insertadas en el editor.","Controla la altura de l\xEDnea. Usa 0 para utilizar la altura del tama\xF1o de fuente.","Controla si se muestra el minimapa.","El minimapa tiene el mismo tama\xF1o que el contenido del editor (y podr\xEDa desplazarse).","El minimapa se estirar\xE1 o reducir\xE1 seg\xFAn sea necesario para ocupar la altura del editor (sin desplazamiento).","El minimapa se reducir\xE1 seg\xFAn sea necesario para no ser nunca m\xE1s grande que el editor (sin desplazamiento).","Controla el tama\xF1o del minimapa.","Controla en qu\xE9 lado se muestra el minimapa.","Controla cu\xE1ndo se muestra el control deslizante del minimapa.","Escala del contenido dibujado en el minimapa: 1, 2 o 3.","Represente los caracteres reales en una l\xEDnea, por oposici\xF3n a los bloques de color.","Limite el ancho del minimapa para representar como mucho un n\xFAmero de columnas determinado.","Controla la cantidad de espacio entre el borde superior del editor y la primera l\xEDnea.","Controla el espacio entre el borde inferior del editor y la \xFAltima l\xEDnea.","Habilita un elemento emergente que muestra documentaci\xF3n de los par\xE1metros e informaci\xF3n de los tipos mientras escribe.","Controla si el men\xFA de sugerencias de par\xE1metros se cicla o se cierra al llegar al final de la lista.","Habilita sugerencias r\xE1pidas en las cadenas.","Habilita sugerencias r\xE1pidas en los comentarios.","Habilita sugerencias r\xE1pidas fuera de las cadenas y los comentarios.","Controla si deben mostrarse sugerencias autom\xE1ticamente mientras se escribe.","Los n\xFAmeros de l\xEDnea no se muestran.","Los n\xFAmeros de l\xEDnea se muestran como un n\xFAmero absoluto.","Los n\xFAmeros de l\xEDnea se muestran como distancia en l\xEDneas a la posici\xF3n del cursor.","Los n\xFAmeros de l\xEDnea se muestran cada 10 l\xEDneas.","Controla la visualizaci\xF3n de los n\xFAmeros de l\xEDnea.","N\xFAmero de caracteres monoespaciales en los que se representar\xE1 esta regla del editor.","Color de esta regla del editor.","Muestra reglas verticales despu\xE9s de un cierto n\xFAmero de caracteres monoespaciados. Usa m\xFAltiples valores para mostrar m\xFAltiples reglas. Si la matriz est\xE1 vac\xEDa, no se muestran reglas.","Inserte la sugerencia sin sobrescribir el texto a la derecha del cursor.","Inserte la sugerencia y sobrescriba el texto a la derecha del cursor.","Controla si las palabras se sobrescriben al aceptar la finalizaci\xF3n. Tenga en cuenta que esto depende de las extensiones que participan en esta caracter\xEDstica.","Controla si el filtrado y la ordenaci\xF3n de sugerencias se tienen en cuenta para los errores ortogr\xE1ficos peque\xF1os.","Controla si la ordenaci\xF3n de palabras mejora lo que aparece cerca del cursor.",'Controla si las selecciones de sugerencias recordadas se comparten entre m\xFAltiples \xE1reas de trabajo y ventanas (necesita "#editor.suggestSelection#").',"Controla si un fragmento de c\xF3digo activo impide sugerencias r\xE1pidas.","Controla si mostrar u ocultar iconos en sugerencias.","Controla la visibilidad de la barra de estado en la parte inferior del widget de sugerencias.","Controla si los detalles de sugerencia se muestran incorporados con la etiqueta o solo en el widget de detalles.","La configuraci\xF3n est\xE1 en desuso. Ahora puede cambiarse el tama\xF1o del widget de sugerencias.",'Esta configuraci\xF3n est\xE1 en desuso. Use configuraciones separadas como "editor.suggest.showKeyword" o "editor.suggest.showSnippets" en su lugar.','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "method".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "funci\xF3n".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "constructor".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "field".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "variable".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "class".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "struct".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "interface".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "module".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "property".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "event".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "operator".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "unit".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "value".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "constant".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "enum".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "enumMember".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "keyword".','Si est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "text".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "color".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "file".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "reference".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "customcolor".','Si est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "folder".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "typeParameter".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "snippet".',"Cuando est\xE1 habilitado, IntelliSense muestra sugerencias del usuario.","Cuando est\xE1 habilitado IntelliSense muestra sugerencias para problemas.","Indica si los espacios en blanco iniciales y finales deben seleccionarse siempre.",'Controla si se deben aceptar sugerencias en los caracteres de confirmaci\xF3n. Por ejemplo, en Javascript, el punto y coma (";") puede ser un car\xE1cter de confirmaci\xF3n que acepta una sugerencia y escribe ese car\xE1cter.','Aceptar solo una sugerencia con "Entrar" cuando realiza un cambio textual.','Controla si las sugerencias deben aceptarse con "Entrar", adem\xE1s de "TAB". Ayuda a evitar la ambig\xFCedad entre insertar nuevas l\xEDneas o aceptar sugerencias.',"Controla el n\xFAmero de l\xEDneas en el editor que puede leer un lector de pantalla. Advertencia: Esto puede afectar al rendimiento de n\xFAmeros superiores al predeterminado.","Contenido del editor","Utilizar las configuraciones del lenguaje para determinar cu\xE1ndo cerrar los corchetes autom\xE1ticamente.","Cerrar autom\xE1ticamente los corchetes cuando el cursor est\xE9 a la izquierda de un espacio en blanco.","Controla si el editor debe cerrar autom\xE1ticamente los corchetes despu\xE9s de que el usuario agregue un corchete de apertura.","Escriba en las comillas o los corchetes solo si se insertaron autom\xE1ticamente.","Controla si el editor debe escribir entre comillas o corchetes.","Utilizar las configuraciones del lenguaje para determinar cu\xE1ndo cerrar las comillas autom\xE1ticamente. ","Cerrar autom\xE1ticamente las comillas cuando el cursor est\xE9 a la izquierda de un espacio en blanco. ","Controla si el editor debe cerrar autom\xE1ticamente las comillas despu\xE9s de que el usuario agrega uma comilla de apertura.","El editor no insertar\xE1 la sangr\xEDa autom\xE1ticamente.","El editor mantendr\xE1 la sangr\xEDa de la l\xEDnea actual.","El editor respetar\xE1 la sangr\xEDa de la l\xEDnea actual y los corchetes definidos por el idioma.","El editor mantendr\xE1 la sangr\xEDa de la l\xEDnea actual, respetar\xE1 los corchetes definidos por el idioma e invocar\xE1 onEnterRules especiales definidos por idiomas.","El editor respetar\xE1 la sangr\xEDa de la l\xEDnea actual, los corchetes definidos por idiomas y las reglas indentationRules definidas por idiomas, adem\xE1s de invocar reglas onEnterRules especiales.","Controla si el editor debe ajustar autom\xE1ticamente la sangr\xEDa mientras los usuarios escriben, pegan, mueven o sangran l\xEDneas.","Use las configuraciones de idioma para determinar cu\xE1ndo delimitar las selecciones autom\xE1ticamente.","Envolver con comillas, pero no con corchetes.","Envolver con corchetes, pero no con comillas.","Controla si el editor debe rodear autom\xE1ticamente las selecciones al escribir comillas o corchetes.","Emule el comportamiento de selecci\xF3n de los caracteres de tabulaci\xF3n al usar espacios para la sangr\xEDa. La selecci\xF3n se aplicar\xE1 a las tabulaciones.","Controla si el editor muestra CodeLens.","Controla la familia de fuentes para CodeLens.",'Controla el tama\xF1o de fuente de CodeLens en p\xEDxeles. Cuando se establece en "0", se usa el 90\xA0% de "#editor.fontSize#".',"Controla si el editor debe representar el Selector de colores y los elementos Decorator de color en l\xEDnea.","Habilite que la selecci\xF3n con el mouse y las teclas est\xE9 realizando la selecci\xF3n de columnas.","Controla si el resaltado de sintaxis debe ser copiado al portapapeles.","Controla el estilo de animaci\xF3n del cursor.","Controla si la animaci\xF3n suave del cursor debe estar habilitada.","Controla el estilo del cursor.",'Controla el n\xFAmero m\xEDnimo de l\xEDneas iniciales y finales visibles que rodean al cursor. En algunos otros editores, se conoce como "scrollOff" o "scrollOffset".','Solo se aplica "cursorSurroundingLines" cuando se desencadena mediante el teclado o la API.','"cursorSurroundingLines" se aplica siempre.','Controla cuando se debe aplicar "cursorSurroundingLines".','Controla el ancho del cursor cuando "#editor.cursorStyle#" se establece en "line".',"Controla si el editor debe permitir mover las selecciones mediante arrastrar y colocar.",'Multiplicador de la velocidad de desplazamiento al presionar "Alt".',"Controla si el editor tiene el plegado de c\xF3digo habilitado.","Utilice una estrategia de plegado espec\xEDfica del idioma, si est\xE1 disponible, de lo contrario la basada en sangr\xEDa.","Utilice la estrategia de plegado basada en sangr\xEDa.","Controla la estrategia para calcular rangos de plegado.","Controla si el editor debe destacar los rangos plegados.","Controla si al hacer clic en el contenido vac\xEDo despu\xE9s de una l\xEDnea plegada se desplegar\xE1 la l\xEDnea.","Controla la familia de fuentes.","Controla si el editor debe dar formato autom\xE1ticamente al contenido pegado. Debe haber disponible un formateador capaz de aplicar formato a un rango dentro de un documento. ","Controla si el editor debe dar formato a la l\xEDnea autom\xE1ticamente despu\xE9s de escribirla.","Controla si el editor debe representar el margen de glifo vertical. El margen de glifo se usa, principalmente, para depuraci\xF3n.","Controla si el cursor debe ocultarse en la regla de informaci\xF3n general.","Controla si el editor debe resaltar la gu\xEDa de sangr\xEDa activa.","Controla el espacio entre letras en p\xEDxeles.","Controla si el editor tiene habilitada la edici\xF3n vinculada. Dependiendo del lenguaje, los s\xEDmbolos relacionados (por ejemplo, las etiquetas HTML) se actualizan durante la edici\xF3n.","Controla si el editor debe detectar v\xEDnculos y hacerlos interactivos.","Resaltar par\xE9ntesis coincidentes.",'Se usar\xE1 un multiplicador en los eventos de desplazamiento de la rueda del mouse "deltaX" y "deltaY". ','Ampliar la fuente del editor cuando se use la rueda del mouse mientras se presiona "Ctrl".',"Combinar varios cursores cuando se solapan.",'Se asigna a "Control" en Windows y Linux y a "Comando" en macOS.','Se asigna a "Alt" en Windows y Linux y a "Opci\xF3n" en macOS.',"El modificador que se usar\xE1 para agregar varios cursores con el mouse. Los gestos del mouse Ir a definici\xF3n y Abrir v\xEDnculo se adaptar\xE1n de modo que no entren en conflicto con el modificador multicursor. [M\xE1s informaci\xF3n](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Cada cursor pega una \xFAnica l\xEDnea del texto.","Cada cursor pega el texto completo.","Controla el pegado cuando el recuento de l\xEDneas del texto pegado coincide con el recuento de cursores.","Controla si el editor debe resaltar las apariciones de s\xEDmbolos sem\xE1nticos.","Controla si debe dibujarse un borde alrededor de la regla de informaci\xF3n general.","Enfocar el \xE1rbol al abrir la inspecci\xF3n","Enfocar el editor al abrir la inspecci\xF3n","Controla si se debe enfocar el editor en l\xEDnea o el \xE1rbol en el widget de vista.","Controla si el gesto del mouse Ir a definici\xF3n siempre abre el widget interactivo.","Controla el retraso, en milisegundos, tras el cual aparecer\xE1n sugerencias r\xE1pidas.","Controla si el editor cambia el nombre autom\xE1ticamente en el tipo.",'En desuso. Utilice "editor.linkedEditing" en su lugar.',"Controla si el editor debe representar caracteres de control.","Controla si el editor debe representar gu\xEDas de sangr\xEDa.","Representar el n\xFAmero de la \xFAltima l\xEDnea cuando el archivo termina con un salto de l\xEDnea.","Resalta el medianil y la l\xEDnea actual.","Controla c\xF3mo debe representar el editor el resaltado de l\xEDnea actual.","Controla si el editor debe representar el resaltado de la l\xEDnea actual solo cuando el editor est\xE1 enfocado","Representa caracteres de espacio en blanco, excepto los espacios individuales entre palabras.","Represente los caracteres de espacio en blanco solo en el texto seleccionado.","Representar solo los caracteres de espacio en blanco al final","Controla la forma en que el editor debe representar los caracteres de espacio en blanco.","Controla si las selecciones deber\xEDan tener las esquinas redondeadas.","Controla el n\xFAmero de caracteres adicionales a partir del cual el editor se desplazar\xE1 horizontalmente.","Controla si el editor seguir\xE1 haciendo scroll despu\xE9s de la \xFAltima l\xEDnea.","Despl\xE1cese solo a lo largo del eje predominante cuando se desplace vertical y horizontalmente al mismo tiempo. Evita la deriva horizontal cuando se desplaza verticalmente en un trackpad.","Controla si el portapapeles principal de Linux debe admitirse.","Controla si el editor debe destacar las coincidencias similares a la selecci\xF3n.","Mostrar siempre los controles de plegado.","Mostrar solo los controles de plegado cuando el mouse est\xE1 sobre el medianil.","Controla cu\xE1ndo se muestran los controles de plegado en el medianil.","Controla el fundido de salida del c\xF3digo no usado.","Controla las variables en desuso tachadas.","Mostrar sugerencias de fragmentos de c\xF3digo por encima de otras sugerencias.","Mostrar sugerencias de fragmentos de c\xF3digo por debajo de otras sugerencias.","Mostrar sugerencias de fragmentos de c\xF3digo con otras sugerencias.","No mostrar sugerencias de fragmentos de c\xF3digo.","Controla si se muestran los fragmentos de c\xF3digo con otras sugerencias y c\xF3mo se ordenan.","Controla si el editor se desplazar\xE1 con una animaci\xF3n.","Tama\xF1o de la fuente para el widget de sugerencias. Cuando se establece a `0`, se utilizar\xE1 el valor `#editor.fontSize#`.",'Altura de la l\xEDnea del widget de sugerencias. Cuando se establece en "0", se usa el valor "#editor.lineHeight#". El valor m\xEDnimo es 8.',"Controla si deben aparecer sugerencias de forma autom\xE1tica al escribir caracteres desencadenadores.","Seleccionar siempre la primera sugerencia.",'Seleccione sugerencias recientes a menos que al escribir m\xE1s se seleccione una, por ejemplo, "console.| -> console.log" porque "log" se ha completado recientemente.','Seleccione sugerencias basadas en prefijos anteriores que han completado esas sugerencias, por ejemplo, "co -> console" y "con -> const".',"Controla c\xF3mo se preseleccionan las sugerencias cuando se muestra la lista,","La pesta\xF1a se completar\xE1 insertando la mejor sugerencia de coincidencia encontrada al presionar la pesta\xF1a","Deshabilitar los complementos para pesta\xF1as.","La pesta\xF1a se completa con fragmentos de c\xF3digo cuando su prefijo coincide. Funciona mejor cuando las 'quickSuggestions' no est\xE1n habilitadas.","Habilita completar pesta\xF1as.","Los terminadores de l\xEDnea no habituales se quitan autom\xE1ticamente.","Los terminadores de l\xEDnea no habituales se omiten.","Advertencia de terminadores de l\xEDnea inusuales que se quitar\xE1n.","Quite los terminadores de l\xEDnea inusuales que podr\xEDan provocar problemas.","La inserci\xF3n y eliminaci\xF3n del espacio en blanco sigue a las tabulaciones.","Caracteres que se usar\xE1n como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.","Las l\xEDneas no se ajustar\xE1n nunca.","Las l\xEDneas se ajustar\xE1n en el ancho de la ventanilla.",'Las l\xEDneas se ajustar\xE1n al valor de "#editor.wordWrapColumn#". ','Las l\xEDneas se ajustar\xE1n al valor que sea inferior: el tama\xF1o de la ventanilla o el valor de "#editor.wordWrapColumn#".',"Controla c\xF3mo deben ajustarse las l\xEDneas.",'Controla la columna de ajuste del editor cuando "#editor.wordWrap#" es "wordWrapColumn" o "bounded".',"No hay sangr\xEDa. Las l\xEDneas ajustadas comienzan en la columna 1.","A las l\xEDneas ajustadas se les aplica la misma sangr\xEDa que al elemento primario.","A las l\xEDneas ajustadas se les aplica una sangr\xEDa de +1 respecto al elemento primario.","A las l\xEDneas ajustadas se les aplica una sangr\xEDa de +2 respecto al elemento primario.","Controla la sangr\xEDa de las l\xEDneas ajustadas.","Se supone que todos los caracteres son del mismo ancho. Este es un algoritmo r\xE1pido que funciona correctamente para fuentes monoespaciales y ciertos scripts (como caracteres latinos) donde los glifos tienen el mismo ancho.","Delega el c\xE1lculo de puntos de ajuste en el explorador. Es un algoritmo lento, que podr\xEDa causar bloqueos para archivos grandes, pero funciona correctamente en todos los casos.","Controla el algoritmo que calcula los puntos de ajuste."],"vs/editor/common/editorContextKeys":["Si el texto del editor tiene el foco (el cursor parpadea)","Si el editor o un widget del editor tiene el foco (por ejemplo, el foco est\xE1 en el widget de b\xFAsqueda)","Si un editor o una entrada de texto enriquecido tienen el foco (el cursor parpadea)","Si el editor es de solo lectura","Si el contexto es un editor de diferencias",'Si "editor.columnSelection" se ha habilitado',"Si el editor tiene texto seleccionado","Si el editor tiene varias selecciones",'Si "Tabulaci\xF3n" mover\xE1 el foco fuera del editor',"Si el mantenimiento del puntero del editor es visible","Si el editor forma parte de otro m\xE1s grande (por ejemplo, blocs de notas)","Identificador de idioma del editor","Si el editor tiene un proveedor de elementos de finalizaci\xF3n","Si el editor tiene un proveedor de acciones de c\xF3digo","Si el editor tiene un proveedor de CodeLens","Si el editor tiene un proveedor de definiciones","Si el editor tiene un proveedor de declaraciones","Si el editor tiene un proveedor de implementaci\xF3n","Si el editor tiene un proveedor de definiciones de tipo","Si el editor tiene un proveedor de contenido con mantenimiento del puntero","Si el editor tiene un proveedor de resaltado de documentos","Si el editor tiene un proveedor de s\xEDmbolos de documentos","Si el editor tiene un proveedor de referencia","Si el editor tiene un proveedor de cambio de nombre","Si el editor tiene un proveedor de ayuda de signatura","Si el editor tiene un proveedor de sugerencias insertadas","Si el editor tiene un proveedor de formatos de documento","Si el editor tiene un proveedor de formatos de selecci\xF3n de documentos","Si el editor tiene varios proveedores de formatos del documento","Si el editor tiene varios proveedores de formato de la selecci\xF3n de documentos"],"vs/editor/common/model/editStack":["Escribiendo"],"vs/editor/common/modes/modesRegistry":["Texto sin formato"],"vs/editor/common/standaloneStrings":["Sin selecci\xF3n","L\xEDnea {0}, columna {1} ({2} seleccionadas)","L\xEDnea {0}, columna {1}","{0} selecciones ({1} caracteres seleccionados)","{0} selecciones",'Se cambiar\xE1 ahora el valor "accessibilitySupport" a "activado".',"Se abrir\xE1 ahora la p\xE1gina de documentaci\xF3n de accesibilidad del editor.","en un panel de solo lectura de un editor de diferencias.","en un panel de un editor de diferencias.","en un editor de c\xF3digo de solo lectura"," en un editor de c\xF3digo","Para configurar el editor de forma que se optimice su uso con un lector de pantalla, presione ahora Comando+E.","Para configurar el editor de forma que se optimice su uso con un lector de pantalla, presione ahora Control+E.","El editor est\xE1 configurado para optimizarse para su uso con un lector de pantalla.","El editor est\xE1 configurado para que no se optimice nunca su uso con un lector de pantalla, que en este momento no es el caso.","Al presionar TAB en el editor actual, el foco se mueve al siguiente elemento activable. Presione {0} para activar o desactivar este comportamiento.","Al presionar TAB en el editor actual, el foco se mueve al siguiente elemento activable. El comando {0} no se puede desencadenar actualmente mediante un enlace de teclado.","Al presionar TAB en el editor actual, se insertar\xE1 el car\xE1cter de tabulaci\xF3n. Presione {0} para activar o desactivar este comportamiento.","Al presionar TAB en el editor actual, se insertar\xE1 el car\xE1cter de tabulaci\xF3n. El comando {0} no se puede desencadenar actualmente mediante un enlace de teclado.","Presione ahora Comando+H para abrir una ventana del explorador con m\xE1s informaci\xF3n relacionada con la accesibilidad del editor.","Presione ahora Control+H para abrir una ventana del explorador con m\xE1s informaci\xF3n relacionada con la accesibilidad del editor.","Para descartar esta informaci\xF3n sobre herramientas y volver al editor, presione Esc o May\xFAs+Escape.","Mostrar ayuda de accesibilidad","Desarrollador: inspeccionar tokens","Vaya a L\xEDnea/Columna...","Mostrar todos los proveedores de acceso r\xE1pido","Paleta de comandos","Mostrar y ejecutar comandos","Ir a s\xEDmbolo...","Ir a s\xEDmbolo por categor\xEDa...","Contenido del editor","Presione Alt+F1 para ver las opciones de accesibilidad.","Alternar tema de contraste alto","{0} ediciones realizadas en {1} archivos"],"vs/editor/common/view/editorColorRegistry":["Color de fondo para la l\xEDnea resaltada en la posici\xF3n del cursor.","Color de fondo del borde alrededor de la l\xEDnea en la posici\xF3n del cursor.","Color de fondo de rangos resaltados, como en abrir r\xE1pido y encontrar caracter\xEDsticas. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo del borde alrededor de los intervalos resaltados.","Color de fondo del s\xEDmbolo destacado, como Ir a definici\xF3n o Ir al siguiente/anterior s\xEDmbolo. El color no debe ser opaco para no ocultar la decoraci\xF3n subyacente.","Color de fondo del borde alrededor de los s\xEDmbolos resaltados.","Color del cursor del editor.","Color de fondo del cursor de edici\xF3n. Permite personalizar el color del caracter solapado por el bloque del cursor.","Color de los caracteres de espacio en blanco del editor.","Color de las gu\xEDas de sangr\xEDa del editor.","Color de las gu\xEDas de sangr\xEDa activas del editor.","Color de n\xFAmeros de l\xEDnea del editor.","Color del n\xFAmero de l\xEDnea activa en el editor","ID es obsoleto. Usar en lugar 'editorLineNumber.activeForeground'. ","Color del n\xFAmero de l\xEDnea activa en el editor","Color de las reglas del editor","Color principal de lentes de c\xF3digo en el editor","Color de fondo tras corchetes coincidentes","Color de bloques con corchetes coincidentes","Color del borde de la regla de visi\xF3n general.","Color de fondo de la regla de informaci\xF3n general del editor. Solo se usa cuando el minimapa est\xE1 habilitado y est\xE1 ubicado en el lado derecho del editor.","Color de fondo del margen del editor. Este espacio contiene los m\xE1rgenes de glifos y los n\xFAmeros de l\xEDnea.","Color del borde de c\xF3digo fuente innecesario (sin usar) en el editor.",`Opacidad de c\xF3digo fuente innecesario (sin usar) en el editor. Por ejemplo, "#000000c0" representar\xE1 el c\xF3digo con un 75 % de opacidad. Para temas de alto contraste, utilice el color del tema 'editorUnnecessaryCode.border' para resaltar el c\xF3digo innecesario en vez de atenuarlo.`,"Color de marcador de regla general para los destacados de rango. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de marcador de regla de informaci\xF3n general para errores. ","Color de marcador de regla de informaci\xF3n general para advertencias.","Color de marcador de regla de informaci\xF3n general para mensajes informativos. "],"vs/editor/contrib/anchorSelect/anchorSelect":["Delimitador de la selecci\xF3n","Delimitador establecido en {0}:{1}","Establecer el delimitador de la selecci\xF3n","Ir al delimitador de la selecci\xF3n","Seleccionar desde el delimitador hasta el cursor","Cancelar el delimitador de la selecci\xF3n"],"vs/editor/contrib/bracketMatching/bracketMatching":["Resumen color de marcador de regla para corchetes.","Ir al corchete","Seleccionar para corchete","Ir al &&corchete"],"vs/editor/contrib/caretOperations/caretOperations":["Mover el texto seleccionado a la izquierda","Mover el texto seleccionado a la derecha"],"vs/editor/contrib/caretOperations/transpose":["Transponer letras"],"vs/editor/contrib/clipboard/clipboard":["Cor&&tar","Cortar","Cortar","&&Copiar","Copiar","Copiar","&&Pegar","Pegar","Pegar","Copiar con resaltado de sintaxis"],"vs/editor/contrib/codeAction/codeActionCommands":["Tipo de la acci\xF3n de c\xF3digo que se va a ejecutar.","Controla cu\xE1ndo se aplican las acciones devueltas.","Aplicar siempre la primera acci\xF3n de c\xF3digo devuelto.","Aplicar la primera acci\xF3n de c\xF3digo devuelta si solo hay una.","No aplique las acciones de c\xF3digo devuelto.","Controla si solo se deben devolver las acciones de c\xF3digo preferidas.","Se ha producido un error desconocido al aplicar la acci\xF3n de c\xF3digo","Correcci\xF3n R\xE1pida","No hay acciones de c\xF3digo disponibles",'No hay acciones de c\xF3digo preferidas para "{0}" disponibles','No hay ninguna acci\xF3n de c\xF3digo para "{0}" disponible.',"No hay acciones de c\xF3digo preferidas disponibles","No hay acciones de c\xF3digo disponibles","Refactorizar...",'No hay refactorizaciones preferidas de "{0}" disponibles','No hay refactorizaciones de "{0}" disponibles',"No hay ninguna refactorizaci\xF3n favorita disponible.","No hay refactorizaciones disponibles","Acci\xF3n de Origen...",'No hay acciones de origen preferidas para "{0}" disponibles','No hay ninguna acci\xF3n de origen para "{0}" disponible.',"No hay ninguna acci\xF3n de origen favorita disponible.","No hay acciones de origen disponibles","Organizar Importaciones","No hay acciones de importaci\xF3n disponibles","Corregir todo","No est\xE1 disponible la acci\xF3n de corregir todo","Corregir autom\xE1ticamente...","No hay autocorrecciones disponibles"],"vs/editor/contrib/codeAction/lightBulbWidget":["Mostrar correcciones. Soluci\xF3n preferida disponible ({0})","Mostrar correcciones ({0})","Mostrar correcciones"],"vs/editor/contrib/codelens/codelensController":["Mostrar comandos de lente de c\xF3digo para la l\xEDnea actual"],"vs/editor/contrib/comment/comment":["Alternar comentario de l\xEDnea","&&Alternar comentario de l\xEDnea","Agregar comentario de l\xEDnea","Quitar comentario de l\xEDnea","Alternar comentario de bloque","Alternar &&bloque de comentario"],"vs/editor/contrib/contextmenu/contextmenu":["Mostrar men\xFA contextual del editor"],"vs/editor/contrib/cursorUndo/cursorUndo":["Cursor Deshacer","Cursor Rehacer"],"vs/editor/contrib/find/findController":["Buscar","&&Buscar","Buscar con selecci\xF3n","Buscar siguiente","Buscar siguiente","Buscar anterior","Buscar anterior","Buscar selecci\xF3n siguiente","Buscar selecci\xF3n anterior","Reemplazar","&&Reemplazar"],"vs/editor/contrib/find/findWidget":['Icono para "Buscar en selecci\xF3n" en el widget de b\xFAsqueda del editor.',"Icono para indicar que el widget de b\xFAsqueda del editor est\xE1 contra\xEDdo.","Icono para indicar que el widget de b\xFAsqueda del editor est\xE1 expandido.",'Icono para "Reemplazar" en el widget de b\xFAsqueda del editor.','Icono para "Reemplazar todo" en el widget de b\xFAsqueda del editor.','Icono para "Buscar anterior" en el widget de b\xFAsqueda del editor.','Icono para "Buscar siguiente" en el widget de b\xFAsqueda del editor.',"Buscar","Buscar","Coincidencia anterior","Pr\xF3xima coincidencia","Buscar en selecci\xF3n","Cerrar","Reemplazar","Reemplazar","Reemplazar","Reemplazar todo","Alternar modo de reemplazar","S\xF3lo los primeros {0} resultados son resaltados, pero todas las operaciones de b\xFAsqueda trabajan en todo el texto.","{0} de {1}","No hay resultados","Encontrados: {0}",'{0} encontrado para "{1}"','{0} encontrado para "{1}", en {2}','{0} encontrado para "{1}"',"Ctrl+Entrar ahora inserta un salto de l\xEDnea en lugar de reemplazar todo. Puede modificar el enlace de claves para editor.action.replaceAll para invalidar este comportamiento."],"vs/editor/contrib/folding/folding":["Desplegar","Desplegar de forma recursiva","Plegar","Alternar plegado","Plegar de forma recursiva","Cerrar todos los comentarios de bloque","Plegar todas las regiones","Desplegar Todas las Regiones","Plegar todo","Desplegar todo","Nivel de plegamiento {0}","Color de fondo detr\xE1s de los rangos plegados. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color del control plegable en el medianil del editor."],"vs/editor/contrib/folding/foldingDecorations":["Icono de rangos expandidos en el margen de glifo del editor.","Icono de rangos contra\xEDdos en el margen de glifo del editor."],"vs/editor/contrib/fontZoom/fontZoom":["Acercarse a la tipograf\xEDa del editor","Alejarse de la tipograf\xEDa del editor","Restablecer alejamiento de la tipograf\xEDa del editor"],"vs/editor/contrib/format/format":["1 edici\xF3n de formato en la l\xEDnea {0}","{0} ediciones de formato en la l\xEDnea {1}","1 edici\xF3n de formato entre las l\xEDneas {0} y {1}","{0} ediciones de formato entre las l\xEDneas {1} y {2}"],"vs/editor/contrib/format/formatActions":["Dar formato al documento","Dar formato a la selecci\xF3n"],"vs/editor/contrib/gotoError/gotoError":["Ir al siguiente problema (Error, Advertencia, Informaci\xF3n)","Icono para ir al marcador siguiente.","Ir al problema anterior (Error, Advertencia, Informaci\xF3n)","Icono para ir al marcador anterior.","Ir al siguiente problema en Archivos (Error, Advertencia, Informaci\xF3n)","Siguiente &&problema","Ir al problema anterior en Archivos (Error, Advertencia, Informaci\xF3n)","Anterior &&problema"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Error","Advertencia","Informaci\xF3n","Sugerencia","{0} en {1}. ","{0} de {1} problemas","{0} de {1} problema","Color de los errores del widget de navegaci\xF3n de marcadores del editor.","Color de las advertencias del widget de navegaci\xF3n de marcadores del editor.","Color del widget informativo marcador de navegaci\xF3n en el editor.","Fondo del widget de navegaci\xF3n de marcadores del editor."],"vs/editor/contrib/gotoSymbol/goToCommands":["Ver","Definiciones",'No se encontr\xF3 ninguna definici\xF3n para "{0}"',"No se encontr\xF3 ninguna definici\xF3n","Ir a definici\xF3n","Ir a &&definici\xF3n","Abrir definici\xF3n en el lateral","Ver la definici\xF3n sin salir","Declaraciones","No se encontr\xF3 ninguna definici\xF3n para '{0}'","No se encontr\xF3 ninguna declaraci\xF3n","Ir a Definici\xF3n","Ir a &&Declaraci\xF3n","No se encontr\xF3 ninguna definici\xF3n para '{0}'","No se encontr\xF3 ninguna declaraci\xF3n","Inspeccionar Definici\xF3n","Definiciones de tipo",'No se encontr\xF3 ninguna definici\xF3n de tipo para "{0}"',"No se encontr\xF3 ninguna definici\xF3n de tipo","Ir a la definici\xF3n de tipo","Ir a la definici\xF3n de &&tipo","Inspeccionar definici\xF3n de tipo","Implementaciones",'No se encontr\xF3 ninguna implementaci\xF3n para "{0}"',"No se encontr\xF3 ninguna implementaci\xF3n","Ir a Implementaciones","Ir a &&Implementaciones","Inspeccionar implementaciones",'No se ha encontrado ninguna referencia para "{0}".',"No se encontraron referencias","Ir a Referencias","Ir a &&Referencias","Referencias","Inspeccionar Referencias","Referencias","Ir a cualquier s\xEDmbolo","Ubicaciones",'No hay resultados para "{0}"',"Referencias"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Haga clic para mostrar {0} definiciones."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Cargando...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} referencias","{0} referencia","Referencias"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["vista previa no disponible","No hay resultados","Referencias"],"vs/editor/contrib/gotoSymbol/referencesModel":["s\xEDmbolo en {0} linea {1} en la columna {2}","s\xEDmbolo en {0} l\xEDnea {1} en la columna {2}, {3}","1 s\xEDmbolo en {0}, ruta de acceso completa {1}","{0} s\xEDmbolos en {1}, ruta de acceso completa {2}","No se encontraron resultados","Encontr\xF3 1 s\xEDmbolo en {0}","Encontr\xF3 {0} s\xEDmbolos en {1}","Encontr\xF3 {0} s\xEDmbolos en {1} archivos"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["S\xEDmbolo {0} de {1}, {2} para el siguiente","S\xEDmbolo {0} de {1}"],"vs/editor/contrib/hover/hover":["Mostrar al mantener el puntero","Mostrar vista previa de la definici\xF3n que aparece al mover el puntero"],"vs/editor/contrib/hover/markdownHoverParticipant":["Cargando..."],"vs/editor/contrib/hover/markerHoverParticipant":["Ver el problema","No hay correcciones r\xE1pidas disponibles","Buscando correcciones r\xE1pidas...","No hay correcciones r\xE1pidas disponibles","Correcci\xF3n R\xE1pida"],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Reemplazar con el valor anterior","Reemplazar con el valor siguiente"],"vs/editor/contrib/indentation/indentation":["Convertir sangr\xEDa en espacios","Convertir sangr\xEDa en tabulaciones","Tama\xF1o de tabulaci\xF3n configurado","Seleccionar tama\xF1o de tabulaci\xF3n para el archivo actual","Aplicar sangr\xEDa con tabulaciones","Aplicar sangr\xEDa con espacios","Detectar sangr\xEDa del contenido","Volver a aplicar sangr\xEDa a l\xEDneas","Volver a aplicar sangr\xEDa a l\xEDneas seleccionadas"],"vs/editor/contrib/linesOperations/linesOperations":["Copiar l\xEDnea arriba","&&Copiar l\xEDnea arriba","Copiar l\xEDnea abajo","Co&&piar l\xEDnea abajo","Selecci\xF3n duplicada","&&Duplicar selecci\xF3n","Mover l\xEDnea hacia arriba","Mo&&ver l\xEDnea arriba","Mover l\xEDnea hacia abajo","Mover &&l\xEDnea abajo","Ordenar l\xEDneas en orden ascendente","Ordenar l\xEDneas en orden descendente","Recortar espacio final","Eliminar l\xEDnea","Sangr\xEDa de l\xEDnea","Anular sangr\xEDa de l\xEDnea","Insertar l\xEDnea arriba","Insertar l\xEDnea debajo","Eliminar todo a la izquierda","Eliminar todo lo que est\xE1 a la derecha","Unir l\xEDneas","Transponer caracteres alrededor del cursor","Transformar a may\xFAsculas","Transformar a min\xFAsculas","Transformar en Title Case","Transformar en Snake Case"],"vs/editor/contrib/linkedEditing/linkedEditing":["Iniciar edici\xF3n vinculada","Color de fondo cuando el editor cambia el nombre autom\xE1ticamente al escribir."],"vs/editor/contrib/links/links":["Ejecutar comando","Seguir v\xEDnculo","cmd + clic","ctrl + clic","opci\xF3n + clic","alt + clic","Ejecutar el comando {0}","No se pudo abrir este v\xEDnculo porque no tiene un formato correcto: {0}","No se pudo abrir este v\xEDnculo porque falta el destino.","Abrir v\xEDnculo"],"vs/editor/contrib/message/messageController":["Indica si el editor muestra actualmente un mensaje insertado","No se puede editar en un editor de s\xF3lo lectura"],"vs/editor/contrib/multicursor/multicursor":["Agregar cursor arriba","&&Agregar cursor arriba","Agregar cursor debajo","A&&gregar cursor abajo","A\xF1adir cursores a finales de l\xEDnea","Agregar c&&ursores a extremos de l\xEDnea","A\xF1adir cursores a la parte inferior","A\xF1adir cursores a la parte superior","Agregar selecci\xF3n hasta la siguiente coincidencia de b\xFAsqueda","Agregar &&siguiente repetici\xF3n","Agregar selecci\xF3n hasta la anterior coincidencia de b\xFAsqueda","Agregar r&&epetici\xF3n anterior","Mover \xFAltima selecci\xF3n hasta la siguiente coincidencia de b\xFAsqueda","Mover \xFAltima selecci\xF3n hasta la anterior coincidencia de b\xFAsqueda","Seleccionar todas las repeticiones de coincidencia de b\xFAsqueda","Seleccionar todas las &&repeticiones","Cambiar todas las ocurrencias"],"vs/editor/contrib/parameterHints/parameterHints":["Sugerencias para par\xE1metros Trigger"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Icono para mostrar la sugerencia de par\xE1metro siguiente.","Icono para mostrar la sugerencia de par\xE1metro anterior.","{0}, sugerencia"],"vs/editor/contrib/peekView/peekView":["Cerrar","Color de fondo del \xE1rea de t\xEDtulo de la vista de inspecci\xF3n.","Color del t\xEDtulo de la vista de inpecci\xF3n.","Color de la informaci\xF3n del t\xEDtulo de la vista de inspecci\xF3n.","Color de los bordes y la flecha de la vista de inspecci\xF3n.","Color de fondo de la lista de resultados de vista de inspecci\xF3n.","Color de primer plano de los nodos de inspecci\xF3n en la lista de resultados.","Color de primer plano de los archivos de inspecci\xF3n en la lista de resultados.","Color de fondo de la entrada seleccionada en la lista de resultados de vista de inspecci\xF3n.","Color de primer plano de la entrada seleccionada en la lista de resultados de vista de inspecci\xF3n.","Color de fondo del editor de vista de inspecci\xF3n.","Color de fondo del margen en el editor de vista de inspecci\xF3n.","Buscar coincidencia con el color de resaltado de la lista de resultados de vista de inspecci\xF3n.","Buscar coincidencia del color de resultado del editor de vista de inspecci\xF3n.","Hacer coincidir el borde resaltado en el editor de vista previa."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["Abra primero un editor de texto para ir a una l\xEDnea.","Vaya a la l\xEDnea {0} y a la columna {1}.","Ir a la l\xEDnea {0}.","L\xEDnea actual: {0}, Car\xE1cter: {1}. Escriba un n\xFAmero de l\xEDnea entre 1 y {2} a los que navegar.","L\xEDnea actual: {0}, Car\xE1cter: {1}. Escriba un n\xFAmero de l\xEDnea al que navegar."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["Para ir a un s\xEDmbolo, primero abra un editor de texto con informaci\xF3n de s\xEDmbolo.","El editor de texto activo no proporciona informaci\xF3n de s\xEDmbolos.","No hay ning\xFAn s\xEDmbolo del editor coincidente.","No hay s\xEDmbolos del editor.","Abrir en el lateral","Abrir en la parte inferior","s\xEDmbolos ({0})","propiedades ({0})","m\xE9todos ({0})","funciones ({0})","constructores ({0})","variables ({0})","clases ({0})","estructuras ({0})","eventos ({0})","operadores ({0})","interfaces ({0})","espacios de nombres ({0})","paquetes ({0})","par\xE1metros de tipo ({0})","m\xF3dulos ({0})","propiedades ({0})","enumeraciones ({0})","miembros de enumeraci\xF3n ({0})","cadenas ({0})","archivos ({0})","matrices ({0})","n\xFAmeros ({0})","booleanos ({0})","objetos ({0})","claves ({0})","campos ({0})","constantes ({0})"],"vs/editor/contrib/rename/rename":["No hay ning\xFAn resultado.","Error desconocido al resolver el cambio de nombre de la ubicaci\xF3n",'Cambiando el nombre de "{0}"',"Cambiar el nombre de {0}","Nombre cambiado correctamente de '{0}' a '{1}'. Resumen: {2}","No se pudo cambiar el nombre a las ediciones de aplicaci\xF3n","No se pudo cambiar el nombre de las ediciones de c\xE1lculo","Cambiar el nombre del s\xEDmbolo","Activar/desactivar la capacidad de previsualizar los cambios antes de cambiar el nombre"],"vs/editor/contrib/rename/renameInputField":["Cambie el nombre de la entrada. Escriba el nuevo nombre y presione Entrar para confirmar.","{0} para cambiar de nombre, {1} para obtener una vista previa"],"vs/editor/contrib/smartSelect/smartSelect":["Expandir selecci\xF3n","&&Expandir selecci\xF3n","Reducir la selecci\xF3n","&&Reducir selecci\xF3n"],"vs/editor/contrib/snippet/snippetVariables":["Domingo","Lunes","Martes","Mi\xE9rcoles","Jueves","Viernes","S\xE1bado","Dom","Lun","Mar","Mi\xE9","Jue","Vie","S\xE1b","Enero","Febrero","Marzo","Abril","May","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre","Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],"vs/editor/contrib/suggest/suggestController":['Aceptando "{0}" ediciones adicionales de {1} realizadas',"Sugerencias para Trigger","Insertar","Insertar","Reemplazar","Reemplazar","Insertar","mostrar menos","mostrar m\xE1s","Restablecer tama\xF1o del widget de sugerencias"],"vs/editor/contrib/suggest/suggestWidget":["Color de fondo del widget sugerido.","Color de borde del widget sugerido.","Color de primer plano del widget sugerido.","Color de fondo de la entrada seleccionada del widget sugerido.","Color del resaltado coincidido en el widget sugerido.","Cargando...","No hay sugerencias.","{0}, documentos: {1}","Sugerir"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Cerrar","Cargando..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Icono para obtener m\xE1s informaci\xF3n en el widget de sugerencias.","Leer m\xE1s"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["Color de primer plano de los s\xEDmbolos de matriz. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos booleanos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de clase. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de color. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos constantes. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de constructor. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de enumerador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de miembro del enumerador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de evento. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de campo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de archivo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de carpeta. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de funci\xF3n. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de interfaz. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de claves. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de palabra clave. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de m\xE9todo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de m\xF3dulo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de espacio de nombres. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos nulos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos num\xE9ricos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de objeto. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos del operador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de paquete. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de propiedad. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de referencia. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de fragmento de c\xF3digo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de cadena. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de estructura. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de texto. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos de par\xE1metro de tipo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de unidad. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos variables. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Alternar tecla de tabulaci\xF3n para mover el punto de atenci\xF3n","Presionando la pesta\xF1a ahora mover\xE1 el foco al siguiente elemento enfocable.","Presionando la pesta\xF1a ahora insertar\xE1 el car\xE1cter de tabulaci\xF3n"],"vs/editor/contrib/tokenization/tokenization":["Desarrollador: forzar nueva aplicaci\xF3n de token"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Terminadores de l\xEDnea inusuales","Se han detectado terminadores de l\xEDnea inusuales",`Este archivo contiene uno o varios caracteres de terminador de l\xEDnea inusuales, como Separador de l\xEDneas (LS) o Separador de p\xE1rrafos (PS).\r +\r +Se recomienda quitarlos del archivo. Se puede configurar a trav\xE9s de "editor.unusualLineTerminators".`,"Corregir este archivo","Ignorar problema para este archivo"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Color de fondo de un s\xEDmbolo durante el acceso de lectura, como la lectura de una variable. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo de un s\xEDmbolo durante el acceso de escritura, como escribir en una variable. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de fondo de un s\xEDmbolo durante el acceso de lectura; por ejemplo, cuando se lee una variable.","Color de fondo de un s\xEDmbolo durante el acceso de escritura; por ejemplo, cuando se escribe una variable.","Color del marcador de regla general para destacados de s\xEDmbolos. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de marcador de regla general para destacados de s\xEDmbolos de acceso de escritura. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Ir al siguiente s\xEDmbolo destacado","Ir al s\xEDmbolo destacado anterior","Desencadenar los s\xEDmbolos destacados"],"vs/editor/contrib/wordOperations/wordOperations":["Eliminar palabra"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["La configuraci\xF3n del lenguaje predeterminada se reemplaza","Establecer los valores de configuraci\xF3n que se reemplazar\xE1n para un lenguaje.","Esta configuraci\xF3n no admite la configuraci\xF3n por idioma.","No se puede registrar una propiedad vac\xEDa.",`No se puede registrar "{0}". Coincide con el patr\xF3n de propiedad '\\\\[.*\\\\]$' para describir la configuraci\xF3n del editor espec\xEDfica del lenguaje. Utilice la contribuci\xF3n "configurationDefaults".`,'No se puede registrar "{0}". Esta propiedad ya est\xE1 registrada.'],"vs/platform/contextkey/browser/contextKeyService":["Comando que devuelve informaci\xF3n sobre las claves de contexto"],"vs/platform/contextkey/common/contextkeys":["Si el sistema operativo es Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["Se presion\xF3 ({0}). Esperando la siguiente tecla...","La combinaci\xF3n de claves ({0}, {1}) no es un comando."],"vs/platform/list/browser/listService":["\xC1rea de trabajo",'Se asigna a "Control" en Windows y Linux y a "Comando" en macOS.','Se asigna a "Alt" en Windows y Linux y a "Opci\xF3n" en macOS.',"El modificador que se utilizar\xE1 para agregar un elemento en los \xE1rboles y listas para una selecci\xF3n m\xFAltiple con el rat\xF3n (por ejemplo en el explorador, abiertos editores y vista de scm). Los gestos de rat\xF3n 'Abrir hacia' - si est\xE1n soportados - se adaptar\xE1n de forma tal que no tenga conflicto con el modificador m\xFAltiple.","Controla c\xF3mo abrir elementos en los \xE1rboles y las listas mediante el mouse (si se admite). Tenga en cuenta que algunos \xE1rboles y listas pueden optar por ignorar esta configuraci\xF3n si no es aplicable.","Controla si las listas y los \xE1rboles admiten el desplazamiento horizontal en el \xE1rea de trabajo. Advertencia: La activaci\xF3n de esta configuraci\xF3n repercute en el rendimiento.","Controla la sangr\xEDa de \xE1rbol en p\xEDxeles.","Controla si el \xE1rbol debe representar gu\xEDas de sangr\xEDa.","Controla si las listas y los \xE1rboles tienen un desplazamiento suave.","La navegaci\xF3n simple del teclado se centra en elementos que coinciden con la entrada del teclado. El emparejamiento se hace solo en prefijos.","Destacar la navegaci\xF3n del teclado resalta los elementos que coinciden con la entrada del teclado. M\xE1s arriba y abajo la navegaci\xF3n atravesar\xE1 solo los elementos destacados.","La navegaci\xF3n mediante el teclado de filtro filtrar\xE1 y ocultar\xE1 todos los elementos que no coincidan con la entrada del teclado.","Controla el estilo de navegaci\xF3n del teclado para listas y \xE1rboles en el \xE1rea de trabajo. Puede ser simple, resaltar y filtrar.",'Controla si la navegaci\xF3n del teclado en listas y \xE1rboles se activa autom\xE1ticamente simplemente escribiendo. Si se establece en "false", la navegaci\xF3n con el teclado solo se activa al ejecutar el comando "list.toggleKeyboardNavigation", para el cual puede asignar un m\xE9todo abreviado de teclado.',"Controla c\xF3mo se expanden las carpetas de \xE1rbol al hacer clic en sus nombres. Tenga en cuenta que algunos \xE1rboles y listas pueden optar por omitir esta configuraci\xF3n si no es aplicable."],"vs/platform/markers/common/markers":["Error","Advertencia","Informaci\xF3n"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","usado recientemente","otros comandos",'El comando "{0}" dio lugar a un error ({1})'],"vs/platform/quickinput/browser/helpQuickAccess":["comandos globales","comandos del editor","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Color de primer plano general. Este color solo se usa si un componente no lo invalida.","Color de primer plano general para los mensajes de erroe. Este color solo se usa si un componente no lo invalida.","El color predeterminado para los iconos en el \xE1rea de trabajo.","Color de borde de los elementos con foco. Este color solo se usa si un componente no lo invalida.","Un borde adicional alrededor de los elementos para separarlos unos de otros y as\xED mejorar el contraste.","Un borde adicional alrededor de los elementos activos para separarlos unos de otros y as\xED mejorar el contraste.","Color de primer plano para los v\xEDnculos en el texto.","Color de fondo para los bloques de c\xF3digo en el texto.","Color de sombra de los widgets dentro del editor, como buscar/reemplazar","Fondo de cuadro de entrada.","Primer plano de cuadro de entrada.","Borde de cuadro de entrada.","Color de borde de opciones activadas en campos de entrada.","Color de fondo de las opciones activadas en los campos de entrada.","Color de primer plano de las opciones activadas en los campos de entrada.","Color de fondo de validaci\xF3n de entrada para gravedad de informaci\xF3n.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de gravedad.","Color de borde de validaci\xF3n de entrada para gravedad de informaci\xF3n.","Color de fondo de validaci\xF3n de entrada para gravedad de advertencia.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de advertencia.","Color de borde de validaci\xF3n de entrada para gravedad de advertencia.","Color de fondo de validaci\xF3n de entrada para gravedad de error.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de error.","Color de borde de valdaci\xF3n de entrada para gravedad de error.","Fondo de lista desplegable.","Primer plano de lista desplegable.","Color de primer plano del bot\xF3n.","Color de fondo del bot\xF3n.","Color de fondo del bot\xF3n al mantener el puntero.","Color de fondo de la insignia. Las insignias son peque\xF1as etiquetas de informaci\xF3n, por ejemplo los resultados de un n\xFAmero de resultados.","Color de primer plano de la insignia. Las insignias son peque\xF1as etiquetas de informaci\xF3n, por ejemplo los resultados de un n\xFAmero de resultados.","Sombra de la barra de desplazamiento indica que la vista se ha despazado.","Color de fondo de control deslizante de barra de desplazamiento.","Color de fondo de barra de desplazamiento cursor cuando se pasar sobre el control.","Color de fondo de la barra de desplazamiento al hacer clic.","Color de fondo para la barra de progreso que se puede mostrar para las operaciones de larga duraci\xF3n.","Color de fondo del texto de error del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de squigglies de error en el editor.","Color del borde de los cuadros de error en el editor.","Color de fondo del texto de advertencia del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de squigglies de advertencia en el editor.","Color del borde de los cuadros de advertencia en el editor.","Color de fondo del texto de informaci\xF3n del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de los subrayados ondulados informativos en el editor.","Color del borde de los cuadros de informaci\xF3n en el editor.","Color de primer plano de pista squigglies en el editor.","Color del borde de los cuadros de sugerencia en el editor.","Color de fondo del editor.","Color de primer plano predeterminado del editor.","Color de fondo del editor de widgets como buscar/reemplazar","Color de primer plano de los widgets del editor, como buscar y reemplazar.","Color de borde de los widgets del editor. El color solo se usa si el widget elige tener un borde y no invalida el color.","Color del borde de la barra de cambio de tama\xF1o de los widgets del editor. El color se utiliza solo si el widget elige tener un borde de cambio de tama\xF1o y si un widget no invalida el color.","Color de fondo del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Color de primer plano del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Color de fondo del t\xEDtulo del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Color de fondo del selector r\xE1pido para el elemento con el foco.","Selector de color r\xE1pido para la agrupaci\xF3n de etiquetas.","Selector de color r\xE1pido para la agrupaci\xF3n de bordes.","Color de la selecci\xF3n del editor.","Color del texto seleccionado para alto contraste.","Color de la selecci\xF3n en un editor inactivo. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color en las regiones con el mismo contenido que la selecci\xF3n. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de borde de las regiones con el mismo contenido que la selecci\xF3n.","Color de la coincidencia de b\xFAsqueda actual.","Color de los otros resultados de la b\xFAsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de la gama que limita la b\xFAsqueda. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de borde de la coincidencia de b\xFAsqueda actual.","Color de borde de otra b\xFAsqueda que coincide.","Color del borde de la gama que limita la b\xFAsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Destacar debajo de la palabra para la que se muestra un mensaje al mantener el mouse. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo al mantener el puntero en el editor.","Color de primer plano al mantener el puntero en el editor.","Color del borde al mantener el puntero en el editor.","Color de fondo de la barra de estado al mantener el puntero en el editor.","Color de los v\xEDnculos activos.","Color de primer plano de las sugerencias insertadas","Color de fondo de las sugerencias insertadas","El color utilizado para el icono de bombilla de acciones.","El color utilizado para el icono de la bombilla de acciones de correcci\xF3n autom\xE1tica.","Color de fondo para el texto que se insert\xF3. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de fondo para el texto que se elimin\xF3. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de contorno para el texto insertado.","Color de contorno para el texto quitado.","Color del borde entre ambos editores de texto.","Color de relleno diagonal del editor de diferencias. El relleno diagonal se usa en las vistas de diferencias en paralelo.","Color de fondo de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de contorno de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Color de fondo de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de fondo de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol esta inactiva. Una lista o un \xE1rbol tiene el foco del teclado cuando est\xE1 activo, cuando esta inactiva no.","Color de fondo de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Color de contorno de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Fondo de la lista o el \xE1rbol al mantener el mouse sobre los elementos.","Color de primer plano de la lista o el \xE1rbol al pasar por encima de los elementos con el rat\xF3n.","Fondo de arrastrar y colocar la lista o el \xE1rbol al mover los elementos con el mouse.","Color de primer plano de la lista o el \xE1rbol de las coincidencias resaltadas al buscar dentro de la lista o el \xE1bol.","Color de fondo del widget de filtro de tipo en listas y \xE1rboles.","Color de contorno del widget de filtro de tipo en listas y \xE1rboles.","Color de contorno del widget de filtro de tipo en listas y \xE1rboles, cuando no hay coincidencias.","Color de trazo de \xE1rbol para las gu\xEDas de sangr\xEDa.","Color de trazo de \xE1rbol para las gu\xEDas de sangr\xEDa.","Color del borde de los men\xFAs.","Color de primer plano de los elementos de men\xFA.","Color de fondo de los elementos de men\xFA.","Color de primer plano del menu para el elemento del men\xFA seleccionado.","Color de fondo del menu para el elemento del men\xFA seleccionado.","Color del borde del elemento seleccionado en los men\xFAs.","Color del separador del menu para un elemento del men\xFA.","Resaltado del color de fondo para una ficha de un fragmento de c\xF3digo.","Resaltado del color del borde para una ficha de un fragmento de c\xF3digo.","Resaltado del color de fondo para la \xFAltima ficha de un fragmento de c\xF3digo.","Resaltado del color del borde para la \xFAltima tabulaci\xF3n de un fragmento de c\xF3digo.","Color del marcador de regla general para buscar actualizaciones. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color del marcador de la regla general para los destacados de la selecci\xF3n. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de marcador de minimapa para coincidencias de b\xFAsqueda.","Color del marcador de minimapa para la selecci\xF3n del editor.","Color del marcador de minimapa para errores.","Color del marcador de minimapa para advertencias.","Color de fondo del minimapa.","Color de fondo del deslizador del minimapa.","Color de fondo del deslizador del minimapa al pasar el puntero.","Color de fondo del deslizador de minimapa al hacer clic en \xE9l.","Color utilizado para el icono de error de problemas.","Color utilizado para el icono de advertencia de problemas.","Color utilizado para el icono de informaci\xF3n de problemas."],"vs/platform/theme/common/iconRegistry":["Identificador de la fuente que se va a usar. Si no se establece, se usa la fuente definida en primer lugar.","Car\xE1cter de fuente asociado a la definici\xF3n del icono.","Icono de la acci\xF3n de cierre en los widgets."],"vs/platform/undoRedo/common/undoRedoService":["Se han cerrado los siguientes archivos y se han modificado en el disco: {0}.","Los siguientes archivos se han modificado de forma incompatible: {0}.",'No se pudo deshacer "{0}" en todos los archivos. {1}','No se pudo deshacer "{0}" en todos los archivos. {1}','No se pudo deshacer "{0}" en todos los archivos porque se realizaron cambios en {1}','No se pudo deshacer "{0}" en todos los archivos porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n en {1}','No se pudo deshacer "{0}" en todos los archivos porque se produjo una operaci\xF3n de deshacer o rehacer mientras tanto','\xBFDesea deshacer "{0}" en todos los archivos?',"Deshacer en {0} archivos","Deshacer este archivo","Cancelar",'No se pudo deshacer "{0}" porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n.','\xBFQuiere deshacer "{0}"?',"Deshacer","Cancelar",'No se pudo rehacer "{0}" en todos los archivos. {1}','No se pudo rehacer "{0}" en todos los archivos. {1}','No se pudo volver a hacer "{0}" en todos los archivos porque se realizaron cambios en {1}','No se pudo rehacer "{0}" en todos los archivos porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n en {1}','No se pudo rehacer "{0}" en todos los archivos porque se produjo una operaci\xF3n de deshacer o rehacer mientras tanto','No se pudo rehacer "{0}" porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n.']}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js new file mode 100644 index 0000000000..d16d576406 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.fr",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["entr\xE9e"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Respecter la casse","Mot entier","Utiliser une expression r\xE9guli\xE8re"],"vs/base/browser/ui/findinput/replaceInput":["entr\xE9e","Pr\xE9server la casse"],"vs/base/browser/ui/iconLabel/iconLabel":["Chargement..."],"vs/base/browser/ui/inputbox/inputBox":["Erreur\xA0: {0}","Avertissement\xA0: {0}","Info\xA0: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Ind\xE9pendant"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["Effacer","D\xE9sactiver le filtre sur le type","Activer le filtre sur le type","Aucun \xE9l\xE9ment","{0}\xA0\xE9l\xE9ments sur {1} correspondants"],"vs/base/common/actions":["(vide)"],"vs/base/common/errorMessage":["{0}: {1}","Une erreur syst\xE8me s'est produite ({0})","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails.","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails.","{0} ({1}\xA0erreurs au total)","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails."],"vs/base/common/keybindingLabels":["Ctrl","Maj","Alt","Windows","Ctrl","Maj","Alt","Super","Contr\xF4le","Maj","Alt","Commande","Contr\xF4le","Maj","Alt","Windows","Contr\xF4le","Maj","Alt","Super"],"vs/base/parts/quickinput/browser/quickInput":["Pr\xE9c\xE9dent","{0}/{1}","Taper pour affiner les r\xE9sultats.","{0}\xA0r\xE9sultats","{0} S\xE9lectionn\xE9s","OK","Personnalis\xE9","Pr\xE9c\xE9dent ({0})","Pr\xE9c\xE9dent"],"vs/base/parts/quickinput/browser/quickInputList":["Entr\xE9e rapide"],"vs/editor/browser/controller/coreCommands":["Aligner par rapport \xE0 la fin m\xEAme en cas de passage \xE0 des lignes plus longues","Aligner par rapport \xE0 la fin m\xEAme en cas de passage \xE0 des lignes plus longues"],"vs/editor/browser/controller/textAreaHandler":["\xE9diteur","L'\xE9diteur n'est pas accessible pour le moment. Appuyez sur {0} pour voir les options."],"vs/editor/browser/core/keybindingCancellation":["Indique si l'\xE9diteur ex\xE9cute une op\xE9ration annulable, par exemple 'Avoir un aper\xE7u des r\xE9f\xE9rences'"],"vs/editor/browser/editorExtensions":["Ann&&uler","Annuler","&&R\xE9tablir","R\xE9tablir","&&S\xE9lectionner tout","Tout s\xE9lectionner"],"vs/editor/browser/widget/codeEditorWidget":["Le nombre de curseurs a \xE9t\xE9 limit\xE9 \xE0\xA0{0}."],"vs/editor/browser/widget/diffEditorWidget":["\xC9l\xE9ment d\xE9coratif de ligne pour les insertions dans l'\xE9diteur de diff\xE9rences.","\xC9l\xE9ment d\xE9coratif de ligne pour les suppressions dans l'\xE9diteur de diff\xE9rences.","Impossible de comparer les fichiers car l'un d'eux est trop volumineux."],"vs/editor/browser/widget/diffReview":["Ic\xF4ne de l'option Ins\xE9rer dans la revue des diff\xE9rences.","Ic\xF4ne de l'option Supprimer dans la revue des diff\xE9rences.","Ic\xF4ne de l'option Fermer dans la revue des diff\xE9rences.","Fermer","aucune ligne chang\xE9e","1\xA0ligne chang\xE9e","{0}\xA0lignes chang\xE9es","Diff\xE9rence\xA0{0} sur\xA0{1}\xA0: ligne d'origine {2}, {3}, ligne modifi\xE9e {4}, {5}","vide","{0} ligne inchang\xE9e {1}","{0}\xA0ligne d'origine {1}\xA0ligne modifi\xE9e {2}","+ {0}\xA0ligne modifi\xE9e {1}","- {0} ligne d'origine {1}","Acc\xE9der \xE0 la diff\xE9rence suivante","Acc\xE9der la diff\xE9rence pr\xE9c\xE9dente"],"vs/editor/browser/widget/inlineDiffMargin":["Copier les lignes supprim\xE9es","Copier la ligne supprim\xE9e","Copier la ligne supprim\xE9e ({0})","Annuler la modification","Copier la ligne supprim\xE9e ({0})"],"vs/editor/common/config/commonEditorConfig":["\xC9diteur","Le nombre d'espaces auxquels une tabulation est \xE9gale. Ce param\xE8tre est substitu\xE9 bas\xE9 sur le contenu du fichier lorsque `#editor.detectIndentation#` est \xE0 'on'.","Espaces ins\xE9r\xE9s quand vous appuyez sur la touche Tab. Ce param\xE8tre est remplac\xE9 en fonction du contenu du fichier quand '#editor.detectIndentation#' est activ\xE9.","Contr\xF4le si '#editor.tabSize#' et '#editor.insertSpaces#' sont automatiquement d\xE9tect\xE9s lors de l\u2019ouverture d\u2019un fichier en fonction de son contenu.","Supprimer l'espace blanc de fin ins\xE9r\xE9 automatiquement.","Traitement sp\xE9cial des fichiers volumineux pour d\xE9sactiver certaines fonctionnalit\xE9s utilisant beaucoup de m\xE9moire.","Contr\xF4le si la saisie semi-automatique doit \xEAtre calcul\xE9e en fonction des mots pr\xE9sents dans le document.","Sugg\xE8re uniquement des mots dans le document actif.","Sugg\xE8re des mots dans tous les documents ouverts du m\xEAme langage.","Sugg\xE8re des mots dans tous les documents ouverts.","Contr\xF4le la fa\xE7on dont sont calcul\xE9es les compl\xE9tions bas\xE9es sur des mots dans les documents.","Coloration s\xE9mantique activ\xE9e pour tous les th\xE8mes de couleur.","Coloration s\xE9mantique d\xE9sactiv\xE9e pour tous les th\xE8mes de couleur.","La coloration s\xE9mantique est configur\xE9e par le param\xE8tre 'semanticHighlighting' du th\xE8me de couleur actuel.","Contr\xF4le si semanticHighlighting est affich\xE9 pour les langages qui le prennent en charge.","Garder les \xE9diteurs d'aper\xE7u ouverts m\xEAme si l'utilisateur double-clique sur son contenu ou appuie sur la touche \xC9chap. ","Les lignes plus longues que cette valeur ne sont pas tokenis\xE9es pour des raisons de performances","D\xE9lai d'expiration en millisecondes avant annulation du calcul de diff. Utilisez\xA00 pour supprimer le d\xE9lai d'expiration.","Contr\xF4le si l'\xE9diteur de diff\xE9rences affiche les diff\xE9rences en mode c\xF4te \xE0 c\xF4te ou inline.","Quand il est activ\xE9, l'\xE9diteur de diff\xE9rences ignore les changements d'espace blanc de d\xE9but ou de fin.","Contr\xF4le si l'\xE9diteur de diff\xE9rences affiche les indicateurs +/- pour les changements ajout\xE9s/supprim\xE9s .","Contr\xF4le si l'\xE9diteur affiche CodeLens.","Le retour automatique \xE0 la ligne n'est jamais effectu\xE9.","Le retour automatique \xE0 la ligne s'effectue en fonction de la largeur de la fen\xEAtre d'affichage.","Le retour automatique \xE0 la ligne d\xE9pend du param\xE8tre '#editor.wordWrap#'."],"vs/editor/common/config/editorOptions":["L'\xE9diteur utilise les API de la plateforme pour d\xE9tecter si un lecteur d'\xE9cran est attach\xE9.","L'\xE9diteur est optimis\xE9 en permanence pour les lecteurs d'\xE9cran. Le retour automatique \xE0 la ligne est d\xE9sactiv\xE9.","L'\xE9diteur n'est jamais optimis\xE9 pour une utilisation avec un lecteur d'\xE9cran.","Contr\xF4le si l'\xE9diteur doit s'ex\xE9cuter dans un mode optimis\xE9 pour les lecteurs d'\xE9cran. Si la valeur est on, le retour automatique \xE0 la ligne est d\xE9sactiv\xE9.","Contr\xF4le si un espace est ins\xE9r\xE9 pour les commentaires.","Contr\xF4le si les lignes vides doivent \xEAtre ignor\xE9es avec des actions d'activation/de d\xE9sactivation, d'ajout ou de suppression des commentaires de ligne.","Contr\xF4le si la copie sans s\xE9lection permet de copier la ligne actuelle.","Contr\xF4le si le curseur doit sauter pour rechercher les correspondances lors de la saisie.","D\xE9termine si la cha\xEEne de recherche dans le Widget Recherche est initialis\xE9e avec la s\xE9lection de l\u2019\xE9diteur.","Ne jamais activer Rechercher automatiquement dans la s\xE9lection (par d\xE9faut)","Toujours activer Rechercher automatiquement dans la s\xE9lection","Activez Rechercher automatiquement dans la s\xE9lection quand plusieurs lignes de contenu sont s\xE9lectionn\xE9es.","Contr\xF4le la condition d'activation automatique de la recherche dans la s\xE9lection.","D\xE9termine si le Widget Recherche devrait lire ou modifier le presse-papiers de recherche partag\xE9 sur macOS.","Contr\xF4le si le widget Recherche doit ajouter des lignes suppl\xE9mentaires en haut de l'\xE9diteur. Quand la valeur est true, vous pouvez faire d\xE9filer au-del\xE0 de la premi\xE8re ligne si le widget Recherche est visible.","Contr\xF4le si la recherche red\xE9marre automatiquement depuis le d\xE9but (ou la fin) quand il n'existe aucune autre correspondance.","Active/d\xE9sactive les ligatures de police (fonctionnalit\xE9s de police 'calt' et 'liga'). Remplacez ceci par une cha\xEEne pour contr\xF4ler de mani\xE8re pr\xE9cise la propri\xE9t\xE9 CSS 'font-feature-settings'.","Propri\xE9t\xE9 CSS 'font-feature-settings' explicite. Vous pouvez passer une valeur bool\xE9enne \xE0 la place si vous devez uniquement activer/d\xE9sactiver les ligatures.","Configure les ligatures de police ou les fonctionnalit\xE9s de police. Il peut s'agir d'une valeur bool\xE9enne permettant d'activer/de d\xE9sactiver les ligatures, ou d'une cha\xEEne correspondant \xE0 la valeur de la propri\xE9t\xE9 CSS 'font-feature-settings'.","Contr\xF4le la taille de police en pixels.",'Seuls les mots cl\xE9s "normal" et "bold", ou les nombres compris entre\xA01 et\xA01\xA0000 sont autoris\xE9s.',`Contr\xF4le l'\xE9paisseur de police. Accepte les mots cl\xE9s "normal" et "bold", ou les nombres compris entre\xA01 et\xA01\xA0000.`,"Montrer l'aper\xE7u des r\xE9sultats (par d\xE9faut)","Acc\xE9der au r\xE9sultat principal et montrer un aper\xE7u","Acc\xE9der au r\xE9sultat principal et activer l'acc\xE8s sans aper\xE7u pour les autres","Ce param\xE8tre est d\xE9pr\xE9ci\xE9, utilisez des param\xE8tres distincts comme 'editor.editor.gotoLocation.multipleDefinitions' ou 'editor.editor.gotoLocation.multipleImplementations' \xE0 la place.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9finition' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9finition de type' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9claration' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre les impl\xE9mentations' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre les r\xE9f\xE9rences' quand plusieurs emplacements cibles existent.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9finition' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9finition de type' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9claration' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre l'impl\xE9mentation' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la r\xE9f\xE9rence' est l'emplacement actuel.","Contr\xF4le si le pointage est affich\xE9.","Contr\xF4le le d\xE9lai en millisecondes, apr\xE8s lequel le survol est affich\xE9.","Contr\xF4le si le pointage doit rester visible quand la souris est d\xE9plac\xE9e au-dessus.","Active l\u2019ampoule d\u2019action de code dans l\u2019\xE9diteur.","Active les indicateurs inline dans l'\xE9diteur.","Contr\xF4le la taille de police des indicateurs inline dans l'\xE9diteur. Quand la valeur est '0', 90\xA0% de '#editor.fontSize#' est utilis\xE9.","Contr\xF4le la famille de polices des indicateurs inline dans l'\xE9diteur.","Contr\xF4le la hauteur de ligne. Utilisez 0 pour calculer la hauteur de ligne de la taille de la police.","Contr\xF4le si la minimap est affich\xE9e.","Le minimap a la m\xEAme taille que le contenu de l'\xE9diteur (d\xE9filement possible).","Le minimap s'agrandit ou se r\xE9duit selon les besoins pour remplir la hauteur de l'\xE9diteur (pas de d\xE9filement).","Le minimap est r\xE9duit si n\xE9cessaire pour ne jamais d\xE9passer la taille de l'\xE9diteur (pas de d\xE9filement).","Contr\xF4le la taille du minimap.","Contr\xF4le le c\xF4t\xE9 o\xF9 afficher la minimap.","Contr\xF4le quand afficher le curseur du minimap.","\xC9chelle du contenu dessin\xE9 dans le minimap\xA0: 1, 2\xA0ou\xA03.","Afficher les caract\xE8res r\xE9els sur une ligne par opposition aux blocs de couleur.","Limiter la largeur de la minimap pour afficher au plus un certain nombre de colonnes.","Contr\xF4le la quantit\xE9 d\u2019espace entre le bord sup\xE9rieur de l\u2019\xE9diteur et la premi\xE8re ligne.","Contr\xF4le la quantit\xE9 d'espace entre le bord inf\xE9rieur de l'\xE9diteur et la derni\xE8re ligne.","Active une fen\xEAtre contextuelle qui affiche de la documentation sur les param\xE8tres et des informations sur les types \xE0 mesure que vous tapez.","D\xE9termine si le menu de suggestions de param\xE8tres se ferme ou reviens au d\xE9but lorsque la fin de la liste est atteinte.","Activez les suggestions rapides dans les cha\xEEnes.","Activez les suggestions rapides dans les commentaires.","Activez les suggestions rapides en dehors des cha\xEEnes et des commentaires.","Contr\xF4le si les suggestions doivent appara\xEEtre automatiquement pendant la saisie.","Les num\xE9ros de ligne ne sont pas affich\xE9s.","Les num\xE9ros de ligne sont affich\xE9s en nombre absolu.","Les num\xE9ros de ligne sont affich\xE9s sous la forme de distance en lignes \xE0 la position du curseur.","Les num\xE9ros de ligne sont affich\xE9s toutes les 10 lignes.","Contr\xF4le l'affichage des num\xE9ros de ligne.","Nombre de caract\xE8res monospace auxquels cette r\xE8gle d'\xE9diteur effectue le rendu.","Couleur de cette r\xE8gle d'\xE9diteur.","Rendre les r\xE8gles verticales apr\xE8s un certain nombre de caract\xE8res \xE0 espacement fixe. Utiliser plusieurs valeurs pour plusieurs r\xE8gles. Aucune r\xE8gle n'est dessin\xE9e si le tableau est vide.","Ins\xE9rez une suggestion sans remplacer le texte \xE0 droite du curseur.","Ins\xE9rez une suggestion et remplacez le texte \xE0 droite du curseur.","Contr\xF4le si les mots sont remplac\xE9s en cas d'acceptation de la saisie semi-automatique. Notez que cela d\xE9pend des extensions adh\xE9rant \xE0 cette fonctionnalit\xE9.","D\xE9termine si le filtre et le tri des suggestions doivent prendre en compte les fautes de frappes mineures.","Contr\xF4le si le tri favorise trier les mots qui apparaissent pr\xE8s du curseur.","Contr\xF4le si les s\xE9lections de suggestion m\xE9moris\xE9es sont partag\xE9es entre plusieurs espaces de travail et fen\xEAtres (n\xE9cessite '#editor.suggestSelection#').","Contr\xF4le si un extrait de code actif emp\xEAche les suggestions rapides.","Contr\xF4le s'il faut montrer ou masquer les ic\xF4nes dans les suggestions.","Contr\xF4le la visibilit\xE9 de la barre d'\xE9tat en bas du widget de suggestion.","D\xE9termine si les d\xE9tails du widget de suggestion sont inclus dans l'\xE9tiquette ou uniquement dans le widget de d\xE9tails","Ce param\xE8tre est d\xE9pr\xE9ci\xE9. Le widget de suggestion peut d\xE9sormais \xEAtre redimensionn\xE9.","Ce param\xE8tre est d\xE9pr\xE9ci\xE9, veuillez utiliser des param\xE8tres distincts comme 'editor.suggest.showKeywords' ou 'editor.suggest.showSnippets' \xE0 la place.","Si activ\xE9, IntelliSense montre des suggestions de type 'method'.","Si activ\xE9, IntelliSense montre des suggestions de type 'function'.","Si activ\xE9, IntelliSense montre des suggestions de type 'constructor'.","Si activ\xE9, IntelliSense montre des suggestions de type 'field'.","Si activ\xE9, IntelliSense montre des suggestions de type 'variable'.","Si activ\xE9, IntelliSense montre des suggestions de type 'class'.","Si activ\xE9, IntelliSense montre des suggestions de type 'struct'.","Si activ\xE9, IntelliSense montre des suggestions de type 'interface'.","Si activ\xE9, IntelliSense montre des suggestions de type 'module'.","Si activ\xE9, IntelliSense montre des suggestions de type 'property'.","Si activ\xE9, IntelliSense montre des suggestions de type 'event'.","Si activ\xE9, IntelliSense montre des suggestions de type 'operator'.","Si activ\xE9, IntelliSense montre des suggestions de type 'unit'.","Si activ\xE9, IntelliSense montre des suggestions de type 'value'.","Si activ\xE9, IntelliSense montre des suggestions de type 'constant'.","Si activ\xE9, IntelliSense montre des suggestions de type 'enum'.","Si activ\xE9, IntelliSense montre des suggestions de type 'enumMember'.","Si activ\xE9, IntelliSense montre des suggestions de type 'keyword'.","Si activ\xE9, IntelliSense montre des suggestions de type 'text'.","Si activ\xE9, IntelliSense montre des suggestions de type 'color'.","Si activ\xE9, IntelliSense montre des suggestions de type 'file'.","Si activ\xE9, IntelliSense montre des suggestions de type 'reference'.","Si activ\xE9, IntelliSense montre des suggestions de type 'customcolor'.","Si activ\xE9, IntelliSense montre des suggestions de type 'folder'.","Si activ\xE9, IntelliSense montre des suggestions de type 'typeParameter'.","Si activ\xE9, IntelliSense montre des suggestions de type 'snippet'.","Si activ\xE9, IntelliSense montre des suggestions de type 'utilisateur'.","Si activ\xE9, IntelliSense montre des suggestions de type 'probl\xE8mes'.","Indique si les espaces blancs de d\xE9but et de fin doivent toujours \xEAtre s\xE9lectionn\xE9s.","Contr\xF4le si les suggestions doivent \xEAtre accept\xE9es sur les caract\xE8res de validation. Par exemple, en JavaScript, le point-virgule (`;`) peut \xEAtre un caract\xE8re de validation qui accepte une suggestion et tape ce caract\xE8re.","Accepter uniquement une suggestion avec 'Entr\xE9e' quand elle effectue une modification textuelle.","Contr\xF4le si les suggestions sont accept\xE9es apr\xE8s appui sur 'Entr\xE9e', en plus de 'Tab'. Permet d\u2019\xE9viter toute ambigu\xEFt\xE9 entre l\u2019insertion de nouvelles lignes et l'acceptation de suggestions.","Contr\xF4le le nombre de lignes dans l'\xE9diteur qui peuvent \xEAtre lues par un lecteur d'\xE9cran. Avertissement : Ce param\xE8tre a une incidence sur les performances quand le nombre est sup\xE9rieur \xE0 la valeur par d\xE9faut.","Contenu de l'\xE9diteur","Utilisez les configurations de langage pour d\xE9terminer quand fermer automatiquement les parenth\xE8ses.","Fermer automatiquement les parenth\xE8ses uniquement lorsque le curseur est \xE0 gauche de l\u2019espace.","Contr\xF4le si l\u2019\xE9diteur doit fermer automatiquement les parenth\xE8ses quand l\u2019utilisateur ajoute une parenth\xE8se ouvrante.","Tapez avant les guillemets ou les crochets fermants uniquement s'ils sont automatiquement ins\xE9r\xE9s.","Contr\xF4le si l'\xE9diteur doit taper avant les guillemets ou crochets fermants.","Utilisez les configurations de langage pour d\xE9terminer quand fermer automatiquement les guillemets.","Fermer automatiquement les guillemets uniquement lorsque le curseur est \xE0 gauche de l\u2019espace.","Contr\xF4le si l\u2019\xE9diteur doit fermer automatiquement les guillemets apr\xE8s que l\u2019utilisateur ajoute un guillemet ouvrant.","L'\xE9diteur n'ins\xE8re pas de retrait automatiquement.","L'\xE9diteur conserve le retrait de la ligne actuelle.","L'\xE9diteur conserve le retrait de la ligne actuelle et honore les crochets d\xE9finis par le langage.","L'\xE9diteur conserve le retrait de la ligne actuelle, honore les crochets d\xE9finis par le langage et appelle des objets onEnterRules sp\xE9ciaux d\xE9finis par les langages.","L'\xE9diteur conserve le retrait de la ligne actuelle, honore les crochets d\xE9finis par le langage, appelle des objets onEnterRules sp\xE9ciaux d\xE9finis par les langages et honore les objets indentationRules d\xE9finis par les langages.","Contr\xF4le si l'\xE9diteur doit ajuster automatiquement le retrait quand les utilisateurs tapent, collent, d\xE9placent ou mettent en retrait des lignes.","Utilisez les configurations de langue pour d\xE9terminer quand entourer automatiquement les s\xE9lections.","Entourez avec des guillemets et non des crochets.","Entourez avec des crochets et non des guillemets.","Contr\xF4le si l'\xE9diteur doit automatiquement entourer les s\xE9lections quand l'utilisateur tape des guillemets ou des crochets.","\xC9mule le comportement des tabulations pour la s\xE9lection quand des espaces sont utilis\xE9s \xE0 des fins de mise en retrait. La s\xE9lection respecte les taquets de tabulation.","Contr\xF4le si l'\xE9diteur affiche CodeLens.","Contr\xF4le la famille de polices pour CodeLens.","Contr\xF4le la taille de police en pixels pour CodeLens. Quand la valeur est '0', 90\xA0% de '#editor.fontSize#' est utilis\xE9.","Contr\xF4le si l'\xE9diteur doit afficher les \xE9l\xE9ments d\xE9coratifs de couleurs inline et le s\xE9lecteur de couleurs.","Autoriser l'utilisation de la souris et des touches pour s\xE9lectionner des colonnes.","Contr\xF4le si la coloration syntaxique doit \xEAtre copi\xE9e dans le presse-papiers.","Contr\xF4ler le style d\u2019animation du curseur.","Contr\xF4le si l'animation du point d'insertion doit \xEAtre activ\xE9e.","Contr\xF4le le style du curseur.","Contr\xF4le le nombre minimal de lignes de d\xE9but et de fin visibles autour du curseur. \xC9galement appel\xE9 'scrollOff' ou 'scrollOffset' dans d'autres \xE9diteurs.","'cursorSurroundingLines' est appliqu\xE9 seulement s'il est d\xE9clench\xE9 via le clavier ou une API.","'cursorSurroundingLines' est toujours appliqu\xE9.","Contr\xF4le quand 'cursorSurroundingLines' doit \xEAtre appliqu\xE9.","D\xE9termine la largeur du curseur lorsque `#editor.cursorStyle#` est \xE0 `line`.","Contr\xF4le si l\u2019\xE9diteur autorise le d\xE9placement de s\xE9lections par glisser-d\xE9placer.","Multiplicateur de vitesse de d\xE9filement quand vous appuyez sur 'Alt'.","Contr\xF4le si l'\xE9diteur a le pliage de code activ\xE9.","Utilisez une strat\xE9gie de pliage propre \xE0 la langue, si disponible, sinon utilisez la strat\xE9gie bas\xE9e sur le retrait.","Utilisez la strat\xE9gie de pliage bas\xE9e sur le retrait.","Contr\xF4le la strat\xE9gie de calcul des plages de pliage.","Contr\xF4le si l'\xE9diteur doit mettre en \xE9vidence les plages pli\xE9es.","Contr\xF4le si le fait de cliquer sur le contenu vide apr\xE8s une ligne pli\xE9e d\xE9plie la ligne.","Contr\xF4le la famille de polices.","D\xE9termine si l\u2019\xE9diteur doit automatiquement mettre en forme le contenu coll\xE9. Un formateur doit \xEAtre disponible et \xEAtre capable de mettre en forme une plage dans un document.","Contr\xF4le si l\u2019\xE9diteur doit mettre automatiquement en forme la ligne apr\xE8s la saisie.","Contr\xF4le si l'\xE9diteur doit afficher la marge de glyphes verticale. La marge de glyphes sert principalement au d\xE9bogage.","Contr\xF4le si le curseur doit \xEAtre masqu\xE9 dans la r\xE8gle de la vue d\u2019ensemble.","Contr\xF4le si l\u2019\xE9diteur doit mettre en surbrillance le guide de mise en retrait actif.","Contr\xF4le l'espacement des lettres en pixels.","Contr\xF4le si la modification li\xE9e est activ\xE9e dans l'\xE9diteur. En fonction du langage, les symboles associ\xE9s, par exemple les balises HTML, sont mis \xE0 jour durant le processus de modification.","Contr\xF4le si l\u2019\xE9diteur doit d\xE9tecter les liens et les rendre cliquables.","Mettez en surbrillance les crochets correspondants.","Un multiplicateur \xE0 utiliser sur les `deltaX` et `deltaY` des \xE9v\xE9nements de d\xE9filement de roulette de souris.","Faire un zoom sur la police de l'\xE9diteur quand l'utilisateur fait tourner la roulette de la souris tout en maintenant la touche 'Ctrl' enfonc\xE9e.","Fusionnez plusieurs curseurs quand ils se chevauchent.","Mappe vers 'Contr\xF4le' dans Windows et Linux, et vers 'Commande' dans macOS.","Mappe vers 'Alt' dans Windows et Linux, et vers 'Option' dans macOS.","Le modificateur \xE0 utiliser pour ajouter plusieurs curseurs avec la souris. Les gestes de souris Atteindre la d\xE9finition et Ouvrir le lien s'adapteront tels qu\u2019ils n\u2019entrent pas en conflit avec le modificateur multicursor. [Lire la suite] (https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Chaque curseur colle une seule ligne de texte.","Chaque curseur colle le texte en entier.","Contr\xF4le le collage quand le nombre de lignes du texte coll\xE9 correspond au nombre de curseurs.","Contr\xF4le si l'\xE9diteur doit mettre en surbrillance les occurrences de symboles s\xE9mantiques.","Contr\xF4le si une bordure doit \xEAtre dessin\xE9e autour de la r\xE8gle de la vue d'ensemble.","Focus sur l'arborescence \xE0 l'ouverture de l'aper\xE7u","Placer le focus sur l'\xE9diteur \xE0 l'ouverture de l'aper\xE7u","Contr\xF4le s'il faut mettre le focus sur l'\xE9diteur inline ou sur l'arborescence dans le widget d'aper\xE7u.","Contr\xF4le si le geste de souris Acc\xE9der \xE0 la d\xE9finition ouvre toujours le widget d'aper\xE7u.","Contr\xF4le le d\xE9lai en millisecondes apr\xE8s lequel des suggestions rapides sont affich\xE9es.","Contr\xF4le si l'\xE9diteur renomme automatiquement selon le type.","D\xE9pr\xE9ci\xE9. Utilisez 'editor.linkedEditing' \xE0 la place.","Contr\xF4le si l\u2019\xE9diteur doit afficher les caract\xE8res de contr\xF4le.","Contr\xF4le si l\u2019\xE9diteur doit afficher les guides de mise en retrait.","Affichez le dernier num\xE9ro de ligne quand le fichier se termine par un saut de ligne.","Met en surbrillance la goutti\xE8re et la ligne actuelle.","Contr\xF4le la fa\xE7on dont l\u2019\xE9diteur doit afficher la mise en surbrillance de la ligne actuelle.","Contr\xF4le si l'\xE9diteur doit afficher la mise en surbrillance de la ligne actuelle seulement quand l'\xE9diteur a le focus","Affiche les espaces blancs \xE0 l'exception des espaces uniques entre les mots.","Afficher les espaces blancs uniquement sur le texte s\xE9lectionn\xE9.","Afficher uniquement les caract\xE8res correspondant aux espaces blancs de fin","Contr\xF4le la fa\xE7on dont l\u2019\xE9diteur doit restituer les caract\xE8res espaces.","Contr\xF4le si les s\xE9lections doivent avoir des angles arrondis.","Contr\xF4le le nombre de caract\xE8res suppl\xE9mentaires, au-del\xE0 duquel l\u2019\xE9diteur d\xE9file horizontalement.","Contr\xF4le si l\u2019\xE9diteur d\xE9file au-del\xE0 de la derni\xE8re ligne.","Faites d\xE9filer uniquement le long de l'axe pr\xE9dominant quand le d\xE9filement est \xE0 la fois vertical et horizontal. Emp\xEAche la d\xE9rive horizontale en cas de d\xE9filement vertical sur un pav\xE9 tactile.","Contr\xF4le si le presse-papiers principal Linux doit \xEAtre pris en charge.","Contr\xF4le si l'\xE9diteur doit mettre en surbrillance les correspondances similaires \xE0 la s\xE9lection.","Affichez toujours les contr\xF4les de pliage.","Affichez uniquement les contr\xF4les de pliage quand la souris est au-dessus de la reliure.","Contr\xF4le quand afficher les contr\xF4les de pliage sur la reliure.","Contr\xF4le la disparition du code inutile.","Contr\xF4le les variables d\xE9pr\xE9ci\xE9es barr\xE9es.","Afficher des suggestions d\u2019extraits au-dessus d\u2019autres suggestions.","Afficher des suggestions d\u2019extraits en-dessous d\u2019autres suggestions.","Afficher des suggestions d\u2019extraits avec d\u2019autres suggestions.","Ne pas afficher de suggestions d\u2019extrait de code.","Contr\xF4le si les extraits de code s'affichent en m\xEAme temps que d'autres suggestions, ainsi que leur mode de tri.","Contr\xF4le si l'\xE9diteur d\xE9file en utilisant une animation.","Taille de la police pour le widget de suggestion. Lorsque la valeur est \xE0 `0`, la valeur de `#editor.fontSize` est utilis\xE9e.","Hauteur de ligne du widget de suggestion. Quand la valeur est '0', la valeur de '#editor.lineHeight#' est utilis\xE9e. La valeur minimale est\xA08.","Contr\xF4le si les suggestions devraient automatiquement s\u2019afficher lorsque vous tapez les caract\xE8res de d\xE9clencheur.","S\xE9lectionnez toujours la premi\xE8re suggestion.","S\xE9lectionnez les suggestions r\xE9centes sauf si une entr\xE9e ult\xE9rieure en a s\xE9lectionn\xE9 une, par ex., 'console.| -> console.log', car 'log' a \xE9t\xE9 effectu\xE9 r\xE9cemment.","S\xE9lectionnez des suggestions en fonction des pr\xE9fixes pr\xE9c\xE9dents qui ont compl\xE9t\xE9 ces suggestions, par ex., 'co -> console' et 'con -> const'.","Contr\xF4le comment les suggestions sont pr\xE9-s\xE9lectionn\xE9s lors de l\u2019affichage de la liste de suggestion.","La compl\xE9tion par tabulation ins\xE9rera la meilleure suggestion lorsque vous appuyez sur tab.","D\xE9sactiver les compl\xE9tions par tabulation.","Compl\xE9ter les extraits de code par tabulation lorsque leur pr\xE9fixe correspond. Fonctionne mieux quand les 'quickSuggestions' ne sont pas activ\xE9es.","Active les compl\xE9tions par tabulation","Les marques de fin de ligne inhabituelles sont automatiquement supprim\xE9es.","Les marques de fin de ligne inhabituelles sont ignor\xE9es.","Les marques de fin de ligne inhabituelles demandent \xE0 \xEAtre supprim\xE9es.","Supprimez les marques de fin de ligne inhabituelles susceptibles de causer des probl\xE8mes.","L'insertion et la suppression des espaces blancs suit les taquets de tabulation.","Caract\xE8res utilis\xE9s comme s\xE9parateurs de mots durant la navigation ou les op\xE9rations bas\xE9es sur les mots","Le retour automatique \xE0 la ligne n'est jamais effectu\xE9.","Le retour automatique \xE0 la ligne s'effectue en fonction de la largeur de la fen\xEAtre d'affichage.","Les lignes seront termin\xE9es \xE0 `#editor.wordWrapColumn#`.","Les lignes seront termin\xE9es au minimum du viewport et `#editor.wordWrapColumn#`.","Contr\xF4le comment les lignes doivent \xEAtre limit\xE9es.","Contr\xF4le la colonne de terminaison de l\u2019\xE9diteur lorsque `#editor.wordWrap#` est \xE0 `wordWrapColumn` ou `bounded`.","Aucune mise en retrait. Les lignes envelopp\xE9es commencent \xE0 la colonne 1.","Les lignes envelopp\xE9es obtiennent la m\xEAme mise en retrait que le parent.","Les lignes justifi\xE9es obtiennent une mise en retrait +1 vers le parent.","Les lignes justifi\xE9es obtiennent une mise en retrait +2 vers le parent. ","Contr\xF4le la mise en retrait des lignes justifi\xE9es.","Suppose que tous les caract\xE8res ont la m\xEAme largeur. Il s'agit d'un algorithme rapide qui fonctionne correctement pour les polices \xE0 espacement fixe et certains scripts (comme les caract\xE8res latins) o\xF9 les glyphes ont la m\xEAme largeur.","D\xE9l\xE8gue le calcul des points de wrapping au navigateur. Il s'agit d'un algorithme lent qui peut provoquer le gel des grands fichiers, mais qui fonctionne correctement dans tous les cas.","Contr\xF4le l'algorithme qui calcule les points de wrapping."],"vs/editor/common/editorContextKeys":["Indique si le texte de l'\xE9diteur a le focus (le curseur clignote)","Indique si l'\xE9diteur ou un widget de l'\xE9diteur a le focus (par exemple, le focus se trouve sur le widget de recherche)","Indique si un \xE9diteur ou une entr\xE9e de texte mis en forme a le focus (le curseur clignote)","Indique si l'\xE9diteur est en lecture seule","Indique si le contexte est celui d'un \xE9diteur de diff\xE9rences","Indique si 'editor.columnSelection' est activ\xE9","Indique si du texte est s\xE9lectionn\xE9 dans l'\xE9diteur","Indique si l'\xE9diteur a plusieurs s\xE9lections","Indique si la touche Tab permet de d\xE9placer le focus hors de l'\xE9diteur","Indique si le pointage de l'\xE9diteur est visible","Indique si l'\xE9diteur fait partie d'un \xE9diteur plus important (par exemple Notebooks)","Identificateur de langage de l'\xE9diteur","Indique si l'\xE9diteur a un fournisseur d'\xE9l\xE9ments de compl\xE9tion","Indique si l'\xE9diteur a un fournisseur d'actions de code","Indique si l'\xE9diteur a un fournisseur d'informations CodeLens","Indique si l'\xE9diteur a un fournisseur de d\xE9finitions","Indique si l'\xE9diteur a un fournisseur de d\xE9clarations","Indique si l'\xE9diteur a un fournisseur d'impl\xE9mentation","Indique si l'\xE9diteur a un fournisseur de d\xE9finitions de type","Indique si l'\xE9diteur a un fournisseur de pointage","Indique si l'\xE9diteur a un fournisseur de mise en surbrillance pour les documents","Indique si l'\xE9diteur a un fournisseur de symboles pour les documents","Indique si l'\xE9diteur a un fournisseur de r\xE9f\xE9rence","Indique si l'\xE9diteur a un fournisseur de renommage","Indique si l'\xE9diteur a un fournisseur d'aide sur les signatures","Indique si l'\xE9diteur a un fournisseur d'indicateurs inline","Indique si l'\xE9diteur a un fournisseur de mise en forme pour les documents","Indique si l'\xE9diteur a un fournisseur de mise en forme de s\xE9lection pour les documents","Indique si l'\xE9diteur a plusieurs fournisseurs de mise en forme pour les documents","Indique si l'\xE9diteur a plusieurs fournisseurs de mise en forme de s\xE9lection pour les documents"],"vs/editor/common/model/editStack":["Frappe en cours"],"vs/editor/common/modes/modesRegistry":["Texte brut"],"vs/editor/common/standaloneStrings":["Aucune s\xE9lection","Ligne {0}, colonne {1} ({2} s\xE9lectionn\xE9)","Ligne {0}, colonne {1}","{0} s\xE9lections ({1} caract\xE8res s\xE9lectionn\xE9s)","{0} s\xE9lections","Remplacement du param\xE8tre 'accessibilitySupport' par 'on'.","Ouverture de la page de documentation sur l'accessibilit\xE9 de l'\xE9diteur.","dans un volet en lecture seule d'un \xE9diteur de diff\xE9rences.","dans un volet d'un \xE9diteur de diff\xE9rences."," dans un \xE9diteur de code en lecture seule"," dans un \xE9diteur de code","Pour configurer l'\xE9diteur de mani\xE8re \xE0 \xEAtre optimis\xE9 en cas d'utilisation d'un lecteur d'\xE9cran, appuyez sur Commande+E maintenant.","Pour configurer l'\xE9diteur de mani\xE8re \xE0 \xEAtre optimis\xE9 en cas d'utilisation d'un lecteur d'\xE9cran, appuyez sur Contr\xF4le+E maintenant.","L'\xE9diteur est configur\xE9 pour \xEAtre optimis\xE9 en cas d'utilisation avec un lecteur d'\xE9cran.","L'\xE9diteur est configur\xE9 pour ne jamais \xEAtre optimis\xE9 en cas d'utilisation avec un lecteur d'\xE9cran, ce qui n'est pas le cas pour le moment.","Appuyez sur Tab dans l'\xE9diteur pour d\xE9placer le focus vers le prochain \xE9l\xE9ment pouvant \xEAtre d\xE9sign\xE9 comme \xE9l\xE9ment actif. Activez ou d\xE9sactivez ce comportement en appuyant sur {0}.","Appuyez sur Tab dans l'\xE9diteur pour d\xE9placer le focus vers le prochain \xE9l\xE9ment pouvant \xEAtre d\xE9sign\xE9 comme \xE9l\xE9ment actif. La commande {0} ne peut pas \xEAtre d\xE9clench\xE9e par une combinaison de touches.","Appuyez sur Tab dans l'\xE9diteur pour ins\xE9rer le caract\xE8re de tabulation. Activez ou d\xE9sactivez ce comportement en appuyant sur {0}.","Appuyez sur Tab dans l'\xE9diteur pour ins\xE9rer le caract\xE8re de tabulation. La commande {0} ne peut pas \xEAtre d\xE9clench\xE9e par une combinaison de touches.","Appuyez sur Commande+H maintenant pour ouvrir une fen\xEAtre de navigateur avec plus d'informations sur l'accessibilit\xE9 de l'\xE9diteur.","Appuyez sur Contr\xF4le+H maintenant pour ouvrir une fen\xEAtre de navigateur avec plus d'informations sur l'accessibilit\xE9 de l'\xE9diteur.","Vous pouvez masquer cette info-bulle et revenir \xE0 l'\xE9diteur en appuyant sur \xC9chap ou Maj+\xC9chap.","Afficher l'aide sur l'accessibilit\xE9","D\xE9veloppeur\xA0: Inspecter les jetons","Acc\xE9der \xE0 la ligne/colonne...","Afficher tous les fournisseurs d'acc\xE8s rapide","Palette de commandes","Commandes d'affichage et d'ex\xE9cution","Acc\xE9der au symbole...","Acc\xE9der au symbole par cat\xE9gorie...","Contenu de l'\xE9diteur","Appuyez sur Alt+F1 pour voir les options d'accessibilit\xE9.","Activer/d\xE9sactiver le th\xE8me \xE0 contraste \xE9lev\xE9","{0} modifications dans {1} fichiers"],"vs/editor/common/view/editorColorRegistry":["Couleur d'arri\xE8re-plan de la mise en surbrillance de la ligne \xE0 la position du curseur.","Couleur d'arri\xE8re-plan de la bordure autour de la ligne \xE0 la position du curseur.","Couleur d'arri\xE8re-plan des plages mises en surbrillance, comme par les fonctionnalit\xE9s de recherche et Quick Open. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan de la bordure autour des plages mises en surbrillance.","Couleur d'arri\xE8re-plan du symbole mis en surbrillance, comme le symbole Atteindre la d\xE9finition ou Suivant/Pr\xE9c\xE9dent. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur d'arri\xE8re-plan de la bordure autour des symboles mis en surbrillance.","Couleur du curseur de l'\xE9diteur.","La couleur de fond du curseur de l'\xE9diteur. Permet de personnaliser la couleur d'un caract\xE8re survol\xE9 par un curseur de bloc.","Couleur des espaces blancs dans l'\xE9diteur.","Couleur des rep\xE8res de retrait de l'\xE9diteur.","Couleur des guides d'indentation de l'\xE9diteur actif","Couleur des num\xE9ros de ligne de l'\xE9diteur.","Couleur des num\xE9ros de lignes actives de l'\xE9diteur","L\u2019ID est d\xE9pr\xE9ci\xE9. Utilisez \xE0 la place 'editorLineNumber.activeForeground'.","Couleur des num\xE9ros de lignes actives de l'\xE9diteur","Couleur des r\xE8gles de l'\xE9diteur","Couleur pour les indicateurs CodeLens","Couleur d'arri\xE8re-plan pour les accolades associ\xE9es","Couleur pour le contour des accolades associ\xE9es","Couleur de la bordure de la r\xE8gle d'aper\xE7u.","Couleur d'arri\xE8re-plan de la r\xE8gle d'aper\xE7u de l'\xE9diteur. Utilis\xE9e uniquement quand la minimap est activ\xE9e et plac\xE9e sur le c\xF4t\xE9 droit de l'\xE9diteur.","Couleur de fond pour la bordure de l'\xE9diteur. La bordure contient les marges pour les symboles et les num\xE9ros de ligne.","Couleur de bordure du code source inutile (non utilis\xE9) dans l'\xE9diteur.","Opacit\xE9 du code source inutile (non utilis\xE9) dans l'\xE9diteur. Par exemple, '#000000c0' affiche le code avec une opacit\xE9 de 75\xA0%. Pour les th\xE8mes \xE0 fort contraste, utilisez la couleur de th\xE8me 'editorUnnecessaryCode.border' pour souligner le code inutile au lieu d'utiliser la transparence.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des plages. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les erreurs.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les avertissements.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les informations."],"vs/editor/contrib/anchorSelect/anchorSelect":["Ancre de s\xE9lection","Ancre d\xE9finie sur {0}:{1}","D\xE9finir l'ancre de s\xE9lection","Atteindre l'ancre de s\xE9lection","S\xE9lectionner de l'ancre au curseur","Annuler l'ancre de s\xE9lection"],"vs/editor/contrib/bracketMatching/bracketMatching":["Couleur du marqueur de la r\xE8gle d'aper\xE7u pour rechercher des parenth\xE8ses.","Atteindre le crochet","S\xE9lectionner jusqu'au crochet","Acc\xE9der au &&crochet"],"vs/editor/contrib/caretOperations/caretOperations":["D\xE9placer le texte s\xE9lectionn\xE9 \xE0 gauche","D\xE9placer le texte s\xE9lectionn\xE9 \xE0 droite"],"vs/editor/contrib/caretOperations/transpose":["Transposer les lettres"],"vs/editor/contrib/clipboard/clipboard":["Co&&uper","Couper","Couper","&&Copier","Copier","Copier","Co&&ller","Coller","Coller","Copier avec la coloration syntaxique"],"vs/editor/contrib/codeAction/codeActionCommands":["Type d'action de code \xE0 ex\xE9cuter.","Contr\xF4le quand les actions retourn\xE9es sont appliqu\xE9es.","Appliquez toujours la premi\xE8re action de code retourn\xE9e.","Appliquez la premi\xE8re action de code retourn\xE9e si elle est la seule.","N'appliquez pas les actions de code retourn\xE9es.","Contr\xF4le si seules les actions de code par d\xE9faut doivent \xEAtre retourn\xE9es.","Une erreur inconnue s'est produite \xE0 l'application de l'action du code","Correction rapide...","Aucune action de code disponible","Aucune action de code pr\xE9f\xE9r\xE9e n'est disponible pour '{0}'","Aucune action de code disponible pour '{0}'","Aucune action de code par d\xE9faut disponible","Aucune action de code disponible","Remanier...","Aucune refactorisation par d\xE9faut disponible pour '{0}'","Aucune refactorisation disponible pour '{0}'","Aucune refactorisation par d\xE9faut disponible","Aucune refactorisation disponible","Action de la source","Aucune action source par d\xE9faut disponible pour '{0}'","Aucune action source disponible pour '{0}'","Aucune action source par d\xE9faut disponible","Aucune action n'est disponible","Organiser les importations","Aucune action organiser les imports disponible","Tout corriger","Aucune action Tout corriger disponible","Corriger automatiquement...","Aucun correctif automatique disponible"],"vs/editor/contrib/codeAction/lightBulbWidget":["Affichez les corrections. Correction pr\xE9f\xE9r\xE9e disponible ({0})","Afficher les correctifs ({0})","Afficher les correctifs"],"vs/editor/contrib/codelens/codelensController":["Afficher les commandes Code Lens de la ligne actuelle"],"vs/editor/contrib/comment/comment":["Activer/d\xE9sactiver le commentaire de ligne","Afficher/masquer le commen&&taire de ligne","Ajouter le commentaire de ligne","Supprimer le commentaire de ligne","Activer/d\xE9sactiver le commentaire de bloc","Afficher/masquer le commentaire de &&bloc"],"vs/editor/contrib/contextmenu/contextmenu":["Afficher le menu contextuel de l'\xE9diteur"],"vs/editor/contrib/cursorUndo/cursorUndo":["Annulation du curseur","Restauration du curseur"],"vs/editor/contrib/find/findController":["Rechercher","&&Rechercher","Rechercher dans la s\xE9lection","Rechercher suivant","Rechercher suivant","Rechercher pr\xE9c\xE9dent","Rechercher pr\xE9c\xE9dent","S\xE9lection suivante","S\xE9lection pr\xE9c\xE9dente","Remplacer","&&Remplacer"],"vs/editor/contrib/find/findWidget":["Ic\xF4ne de l'option Rechercher dans la s\xE9lection dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne permettant d'indiquer que le widget de recherche de l'\xE9diteur est r\xE9duit.","Ic\xF4ne permettant d'indiquer que le widget de recherche de l'\xE9diteur est d\xE9velopp\xE9.","Ic\xF4ne de l'option Remplacer dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Tout remplacer dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Rechercher pr\xE9c\xE9dent dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Rechercher suivant dans le widget de recherche de l'\xE9diteur.","Rechercher","Rechercher","Correspondance pr\xE9c\xE9dente","Prochaine correspondance","Rechercher dans la s\xE9lection","Fermer","Remplacer","Remplacer","Remplacer","Tout remplacer","Changer le mode de remplacement","Seuls les {0} premiers r\xE9sultats sont mis en \xE9vidence, mais toutes les op\xE9rations de recherche fonctionnent sur l\u2019ensemble du texte.","{0} sur {1}","Aucun r\xE9sultat","{0} trouv\xE9(s)","{0} trouv\xE9 pour '{1}'","{0} trouv\xE9 pour '{1}', sur {2}","{0} trouv\xE9 pour '{1}'","La combinaison Ctrl+Entr\xE9e permet d\xE9sormais d'ajouter un saut de ligne au lieu de tout remplacer. Vous pouvez modifier le raccourci clavier de editor.action.replaceAll pour red\xE9finir le comportement."],"vs/editor/contrib/folding/folding":["D\xE9plier","D\xE9plier de mani\xE8re r\xE9cursive","Plier","Activer/d\xE9sactiver le pliage","Plier de mani\xE8re r\xE9cursive","Replier tous les commentaires de bloc","Replier toutes les r\xE9gions","D\xE9plier toutes les r\xE9gions","Plier tout","D\xE9plier tout","Niveau de pliage {0}","Couleur d'arri\xE8re-plan des gammes pli\xE9es. La couleur ne doit pas \xEAtre opaque pour ne pas cacher les d\xE9corations sous-jacentes.","Couleur du contr\xF4le de pliage dans la marge de l'\xE9diteur."],"vs/editor/contrib/folding/foldingDecorations":["Ic\xF4ne des plages d\xE9velopp\xE9es dans la marge de glyphes de l'\xE9diteur.","Ic\xF4ne des plages r\xE9duites dans la marge de glyphes de l'\xE9diteur."],"vs/editor/contrib/fontZoom/fontZoom":["Agrandissement de l'\xE9diteur de polices de caract\xE8res","R\xE9tr\xE9cissement de l'\xE9diteur de polices de caract\xE8res","Remise \xE0 niveau du zoom de l'\xE9diteur de polices de caract\xE8res"],"vs/editor/contrib/format/format":["1\xA0modification de format effectu\xE9e \xE0 la ligne {0}","{0} modifications de format effectu\xE9es \xE0 la ligne {1}","1\xA0modification de format effectu\xE9e entre les lignes {0} et {1}","{0} modifications de format effectu\xE9es entre les lignes {1} et {2}"],"vs/editor/contrib/format/formatActions":["Mettre le document en forme","Mettre la s\xE9lection en forme"],"vs/editor/contrib/gotoError/gotoError":["Aller au probl\xE8me suivant (Erreur, Avertissement, Info)","Ic\xF4ne du prochain marqueur goto.","Aller au probl\xE8me pr\xE9c\xE9dent (Erreur, Avertissement, Info)","Ic\xF4ne du pr\xE9c\xE9dent marqueur goto.","Aller au probl\xE8me suivant dans Fichiers (Erreur, Avertissement, Info)","&&Probl\xE8me suivant","Aller au probl\xE8me pr\xE9c\xE9dent dans Fichiers (Erreur, Avertissement, Info)","&&Probl\xE8me pr\xE9c\xE9dent"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Erreur","Avertissement","Info","Conseil","{0} \xE0 {1}. ","{0}\xA0probl\xE8mes sur\xA0{1}","{0}\xA0probl\xE8me(s) sur {1}","Couleur d'erreur du widget de navigation dans les marqueurs de l'\xE9diteur.","Couleur d'avertissement du widget de navigation dans les marqueurs de l'\xE9diteur.","Couleur d\u2019information du widget de navigation du marqueur de l'\xE9diteur.","Arri\xE8re-plan du widget de navigation dans les marqueurs de l'\xE9diteur."],"vs/editor/contrib/gotoSymbol/goToCommands":["Aper\xE7u","D\xE9finitions","D\xE9finition introuvable pour '{0}'","D\xE9finition introuvable","Atteindre la d\xE9finition","Atteindre la &&d\xE9finition","Ouvrir la d\xE9finition sur le c\xF4t\xE9","Faire un Peek de la D\xE9finition","D\xE9clarations","Aucune d\xE9claration pour '{0}'","Aucune d\xE9claration","Acc\xE9der \xE0 la d\xE9claration","Atteindre la &&d\xE9claration","Aucune d\xE9claration pour '{0}'","Aucune d\xE9claration","Aper\xE7u de la d\xE9claration","D\xE9finitions de type","D\xE9finition de type introuvable pour '{0}'","D\xE9finition de type introuvable","Atteindre la d\xE9finition de type","Acc\xE9der \xE0 la d\xE9finition de &&type","Aper\xE7u de la d\xE9finition du type","Impl\xE9mentations","Impl\xE9mentation introuvable pour '{0}'","Impl\xE9mentation introuvable","Atteindre les impl\xE9mentations","Atteindre les &&impl\xE9mentations","Impl\xE9mentations d'aper\xE7u","Aucune r\xE9f\xE9rence pour '{0}'","Aucune r\xE9f\xE9rence","Atteindre les r\xE9f\xE9rences","Atteindre les &&r\xE9f\xE9rences","R\xE9f\xE9rences","Aper\xE7u des r\xE9f\xE9rences","R\xE9f\xE9rences","Atteindre un symbole","Emplacements","Aucun r\xE9sultat pour \xAB\xA0{0}\xA0\xBB","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Cliquez pour afficher {0}\xA0d\xE9finitions."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Chargement en cours...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} r\xE9f\xE9rences","{0} r\xE9f\xE9rence","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["aper\xE7u non disponible","Aucun r\xE9sultat","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/referencesModel":["symbole dans {0} sur la ligne {1}, colonne {2}","symbole dans {0} \xE0 la ligne {1}, colonne {2}, {3}","1 symbole dans {0}, chemin complet {1}","{0} symboles dans {1}, chemin complet {2}","R\xE9sultats introuvables","1\xA0symbole dans {0}","{0}\xA0symboles dans {1}","{0}\xA0symboles dans {1} fichiers"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["Symbole {0} sur {1}, {2} pour le suivant","Symbole {0} sur {1}"],"vs/editor/contrib/hover/hover":["Afficher par pointage","Afficher le pointeur de l'aper\xE7u de d\xE9finition"],"vs/editor/contrib/hover/markdownHoverParticipant":["Chargement en cours..."],"vs/editor/contrib/hover/markerHoverParticipant":["Voir le probl\xE8me","Aucune solution disponible dans l'imm\xE9diat","Recherche de correctifs rapides...","Aucune solution disponible dans l'imm\xE9diat","Correction rapide..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Remplacer par la valeur pr\xE9c\xE9dente","Remplacer par la valeur suivante"],"vs/editor/contrib/indentation/indentation":["Convertir les retraits en espaces","Convertir les retraits en tabulations","Taille des tabulations configur\xE9e","S\xE9lectionner la taille des tabulations pour le fichier actuel","Mettre en retrait avec des tabulations","Mettre en retrait avec des espaces","D\xE9tecter la mise en retrait \xE0 partir du contenu","Remettre en retrait les lignes","R\xE9indenter les lignes s\xE9lectionn\xE9es"],"vs/editor/contrib/linesOperations/linesOperations":["Copier la ligne en haut","&&Copier la ligne en haut","Copier la ligne en bas","Co&&pier la ligne en bas","Dupliquer la s\xE9lection","&&Dupliquer la s\xE9lection","D\xE9placer la ligne vers le haut","D\xE9placer la ligne &&vers le haut","D\xE9placer la ligne vers le bas","D\xE9placer la &&ligne vers le bas","Trier les lignes dans l'ordre croissant","Trier les lignes dans l'ordre d\xE9croissant","D\xE9couper l'espace blanc de fin","Supprimer la ligne","Mettre en retrait la ligne","Ajouter un retrait n\xE9gatif \xE0 la ligne","Ins\xE9rer une ligne au-dessus","Ins\xE9rer une ligne sous","Supprimer tout ce qui est \xE0 gauche","Supprimer tout ce qui est \xE0 droite","Joindre les lignes","Transposer les caract\xE8res autour du curseur","Transformer en majuscule","Transformer en minuscule",'Appliquer la casse "1re lettre des mots en majuscule"',"Transformer en snake case"],"vs/editor/contrib/linkedEditing/linkedEditing":["D\xE9marrer la modification li\xE9e","Couleur d'arri\xE8re-plan quand l'\xE9diteur renomme automatiquement le type."],"vs/editor/contrib/links/links":["Ex\xE9cuter la commande","suivre le lien","cmd + clic","ctrl + clic","option + clic","alt + clic","Ex\xE9cuter la commande {0}","\xC9chec de l'ouverture de ce lien, car il n'est pas bien form\xE9\xA0: {0}","\xC9chec de l'ouverture de ce lien, car sa cible est manquante.","Ouvrir le lien"],"vs/editor/contrib/message/messageController":["Indique si l'\xE9diteur affiche un message inline","Impossible de modifier dans l\u2019\xE9diteur en lecture seule"],"vs/editor/contrib/multicursor/multicursor":["Ajouter un curseur au-dessus","&&Ajouter un curseur au-dessus","Ajouter un curseur en dessous","Aj&&outer un curseur en dessous","Ajouter des curseurs \xE0 la fin des lignes","Ajouter des c&&urseurs \xE0 la fin des lignes","Ajouter des curseurs en bas","Ajouter des curseurs en haut","Ajouter la s\xE9lection \xE0 la correspondance de recherche suivante","Ajouter l'occurrence suiva&&nte","Ajouter la s\xE9lection \xE0 la correspondance de recherche pr\xE9c\xE9dente","Ajouter l'occurrence p&&r\xE9c\xE9dente","D\xE9placer la derni\xE8re s\xE9lection vers la correspondance de recherche suivante","D\xE9placer la derni\xE8re s\xE9lection \xE0 la correspondance de recherche pr\xE9c\xE9dente","S\xE9lectionner toutes les occurrences des correspondances de la recherche","S\xE9lectionner toutes les &&occurrences","Modifier toutes les occurrences"],"vs/editor/contrib/parameterHints/parameterHints":["Indicateurs des param\xE8tres Trigger"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Ic\xF4ne d'affichage du prochain conseil de param\xE8tre.","Ic\xF4ne d'affichage du pr\xE9c\xE9dent conseil de param\xE8tre.","{0}, conseil"],"vs/editor/contrib/peekView/peekView":["Fermer","Couleur d'arri\xE8re-plan de la zone de titre de l'affichage d'aper\xE7u.","Couleur du titre de l'affichage d'aper\xE7u.","Couleur des informations sur le titre de l'affichage d'aper\xE7u.","Couleur des bordures et de la fl\xE8che de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan des noeuds de lignes dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan des noeuds de fichiers dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de l'entr\xE9e s\xE9lectionn\xE9e dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan de l'entr\xE9e s\xE9lectionn\xE9e dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de l'\xE9diteur d'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de la bordure de l'\xE9diteur d'affichage d'aper\xE7u.","Couleur de mise en surbrillance d'une correspondance dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de mise en surbrillance d'une correspondance dans l'\xE9diteur de l'affichage d'aper\xE7u.","Bordure de mise en surbrillance d'une correspondance dans l'\xE9diteur de l'affichage d'aper\xE7u."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["Ouvrez d'abord un \xE9diteur de texte pour acc\xE9der \xE0 une ligne.","Allez \xE0 la ligne {0}, colonne {1}.","Acc\xE9dez \xE0 la ligne {0}.","Ligne actuelle\xA0: {0}, caract\xE8re\xA0: {1}. Tapez un num\xE9ro de ligne entre\xA01 et\xA0{2} auquel acc\xE9der.","Ligne actuelle\xA0: {0}, caract\xE8re\xA0: {1}. Tapez un num\xE9ro de ligne auquel acc\xE9der."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["Pour acc\xE9der \xE0 un symbole, ouvrez d'abord un \xE9diteur de texte avec des informations de symbole.","L'\xE9diteur de texte actif ne fournit pas les informations de symbole.","Aucun symbole d'\xE9diteur correspondant","Aucun symbole d'\xE9diteur","Ouvrir sur le c\xF4t\xE9","Ouvrir en bas","symboles ({0})","propri\xE9t\xE9s ({0})","m\xE9thodes ({0})","fonctions ({0})","constructeurs ({0})","variables ({0})","classes ({0})","structs ({0})","\xE9v\xE9nements ({0})","op\xE9rateurs ({0})","interfaces ({0})","espaces de noms ({0})","packages ({0})","param\xE8tres de type ({0})","modules ({0})","propri\xE9t\xE9s ({0})","\xE9num\xE9rations ({0})","membres d'\xE9num\xE9ration ({0})","cha\xEEnes ({0})","fichiers ({0})","tableaux ({0})","nombres ({0})","bool\xE9ens ({0})","objets ({0})","cl\xE9s ({0})","champs ({0})","constantes ({0})"],"vs/editor/contrib/rename/rename":["Aucun r\xE9sultat.","Une erreur inconnue s'est produite lors de la r\xE9solution de l'emplacement de renommage","Renommage de '{0}'","Changement du nom de {0}","'{0}' renomm\xE9 en '{1}'. R\xE9capitulatif : {2}","Le renommage n'a pas pu appliquer les modifications","Le renommage n'a pas pu calculer les modifications","Renommer le symbole","Activer/d\xE9sactiver la possibilit\xE9 d'afficher un aper\xE7u des changements avant le renommage"],"vs/editor/contrib/rename/renameInputField":["Renommez l'entr\xE9e. Tapez le nouveau nom et appuyez sur Entr\xE9e pour valider.","{0} pour renommer, {1} pour afficher un aper\xE7u"],"vs/editor/contrib/smartSelect/smartSelect":["\xC9tendre la s\xE9lection","D\xE9v&&elopper la s\xE9lection","R\xE9duire la s\xE9lection","&&R\xE9duire la s\xE9lection"],"vs/editor/contrib/snippet/snippetVariables":["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dim","Lun","Mar","Mer","Jeu","Ven","Sam","Janvier","F\xE9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xFBt","Septembre","Octobre","Novembre","D\xE9cembre","Jan","F\xE9v","Mar","Avr","Mai","Juin","Jul","Ao\xFB","Sept","Oct","Nov","D\xE9c"],"vs/editor/contrib/suggest/suggestController":["L'acceptation de '{0}' a entra\xEEn\xE9 {1}\xA0modifications suppl\xE9mentaires","Suggestions pour Trigger","Ins\xE9rer","Ins\xE9rer","Remplacer","Remplacer","Ins\xE9rer","afficher moins","afficher plus","R\xE9initialiser la taille du widget de suggestion"],"vs/editor/contrib/suggest/suggestWidget":["Couleur d'arri\xE8re-plan du widget de suggestion.","Couleur de bordure du widget de suggestion.","Couleur de premier plan du widget de suggestion.","Couleur d'arri\xE8re-plan de l'entr\xE9e s\xE9lectionn\xE9e dans le widget de suggestion.","Couleur de la surbrillance des correspondances dans le widget de suggestion.","Chargement en cours...","Pas de suggestions.","{0}, documents\xA0: {1}","Sugg\xE9rer"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Fermer","Chargement en cours..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Ic\xF4ne d'affichage d'informations suppl\xE9mentaires dans le widget de suggestion.","Lire la suite"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["Couleur de premier plan des symboles de tableau. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles bool\xE9ens. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de classe. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de couleur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan pour les symboles de constante. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de constructeur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'\xE9num\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de membre d'\xE9num\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'\xE9v\xE9nement. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de champ. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de fichier. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de dossier. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de fonction. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'interface. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de cl\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de mot cl\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de m\xE9thode. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de module. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'espace de noms. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles null. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de nombre. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'objet. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'op\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de package. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de propri\xE9t\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de r\xE9f\xE9rence. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'extrait de code. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de cha\xEEne. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de struct. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de texte. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de param\xE8tre de type. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'unit\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de variable. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Activer/d\xE9sactiver l'utilisation de la touche Tab pour d\xE9placer le focus","Appuyer sur Tab d\xE9placera le focus vers le prochain \xE9l\xE9ment pouvant \xEAtre d\xE9sign\xE9 comme \xE9l\xE9ment actif","Appuyer sur Tab ins\xE9rera le caract\xE8re de tabulation"],"vs/editor/contrib/tokenization/tokenization":["D\xE9veloppeur\xA0: forcer la retokenisation"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Marques de fin de ligne inhabituelles","Marques de fin de ligne inhabituelles d\xE9tect\xE9es",`Ce fichier contient un ou plusieurs caract\xE8res de fin de ligne inhabituels, par exemple le s\xE9parateur de ligne (LS) ou le s\xE9parateur de paragraphe (PS).\r +\r +Il est recommand\xE9 de les supprimer du fichier. Vous pouvez le configurer via 'editor.unusualLineTerminators'.`,"Corriger ce fichier","Ignorer le probl\xE8me pour ce fichier"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Couleur d'arri\xE8re-plan d'un symbole pendant l'acc\xE8s en lecture, comme la lecture d'une variable. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan d'un symbole pendant l'acc\xE8s en \xE9criture, comme l'\xE9criture d'une variable. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure d'un symbole durant l'acc\xE8s en lecture, par exemple la lecture d'une variable.","Couleur de bordure d'un symbole durant l'acc\xE8s en \xE9criture, par exemple l'\xE9criture dans une variable.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des symboles. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des symboles d'acc\xE8s en \xE9criture. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Aller \xE0 la prochaine mise en \xE9vidence de symbole","Aller \xE0 la mise en \xE9vidence de symbole pr\xE9c\xE9dente","D\xE9clencher la mise en \xE9vidence de symbole"],"vs/editor/contrib/wordOperations/wordOperations":["Supprimer le mot"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Substitutions de configuration du langage par d\xE9faut","Configurez les param\xE8tres d'\xE9diteur \xE0 remplacer pour un langage.","Ce param\xE8tre ne prend pas en charge la configuration par langage.","Impossible d'inscrire une propri\xE9t\xE9 vide","Impossible d'inscrire '{0}'. Ceci correspond au mod\xE8le de propri\xE9t\xE9 '\\\\[.*\\\\]$' permettant de d\xE9crire les param\xE8tres d'\xE9diteur sp\xE9cifiques \xE0 un langage. Utilisez la contribution 'configurationDefaults'.","Impossible d'inscrire '{0}'. Cette propri\xE9t\xE9 est d\xE9j\xE0 inscrite."],"vs/platform/contextkey/browser/contextKeyService":["Commande qui retourne des informations sur les cl\xE9s de contexte"],"vs/platform/contextkey/common/contextkeys":["Indique si le syst\xE8me d'exploitation est Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["Touche ({0}) utilis\xE9e. En attente d'une seconde touche...","La combinaison de touches ({0}, {1}) n\u2019est pas une commande."],"vs/platform/list/browser/listService":["Banc d'essai","Mappe vers 'Contr\xF4le' dans Windows et Linux, et vers 'Commande' dans macOS.","Mappe vers 'Alt' dans Windows et Linux, et vers 'Option' dans macOS.","Le modificateur \xE0 utiliser pour ajouter un \xE9l\xE9ment dans les arbres et listes pour une s\xE9lection multiple avec la souris (par exemple dans l\u2019Explorateur, les \xE9diteurs ouverts et la vue scm). Les mouvements de la souris 'Ouvrir \xE0 c\xF4t\xE9' (si pris en charge) s'adapteront tels qu\u2019ils n'entrent pas en conflit avec le modificateur multiselect.","Contr\xF4le l'ouverture des \xE9l\xE9ments dans les arborescences et les listes \xE0 l'aide de la souris (si cela est pris en charge). Notez que certaines arborescences et listes peuvent choisir d'ignorer ce param\xE8tre, s'il est non applicable.","Contr\xF4le si les listes et les arborescences prennent en charge le d\xE9filement horizontal dans le banc d'essai. Avertissement : L'activation de ce param\xE8tre a un impact sur les performances.","Contr\xF4le la mise en retrait de l'arborescence, en pixels.","Contr\xF4le si l'arborescence doit afficher les rep\xE8res de mise en retrait.","D\xE9termine si les listes et les arborescences ont un d\xE9filement fluide.","La navigation au clavier Simple place le focus sur les \xE9l\xE9ments qui correspondent \xE0 l'entr\xE9e de clavier. La mise en correspondance est effectu\xE9e sur les pr\xE9fixes uniquement.","La navigation de mise en surbrillance au clavier met en surbrillance les \xE9l\xE9ments qui correspondent \xE0 l'entr\xE9e de clavier. La navigation ult\xE9rieure vers le haut ou vers le bas parcourt uniquement les \xE9l\xE9ments mis en surbrillance.","La navigation au clavier Filtrer filtre et masque tous les \xE9l\xE9ments qui ne correspondent pas \xE0 l'entr\xE9e de clavier.","Contr\xF4le le style de navigation au clavier pour les listes et les arborescences dans le banc d'essai. Les options sont Simple, Mise en surbrillance et Filtrer.","Contr\xF4le si la navigation au clavier dans les listes et les arborescences est automatiquement d\xE9clench\xE9e simplement par la frappe. Si d\xE9fini sur 'false', la navigation au clavier est seulement d\xE9clench\xE9e avec l'ex\xE9cution de la commande 'list.toggleKeyboardNavigation', \xE0 laquelle vous pouvez attribuer un raccourci clavier.","Contr\xF4le la fa\xE7on dont les dossiers de l'arborescence sont d\xE9velopp\xE9s quand vous cliquez sur les noms de dossiers. Notez que certaines arborescences et listes peuvent choisir d'ignorer ce param\xE8tre, s'il est non applicable."],"vs/platform/markers/common/markers":["Erreur","Avertissement","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","r\xE9cemment utilis\xE9es","autres commandes","La commande '{0}' a entra\xEEn\xE9 une erreur ({1})"],"vs/platform/quickinput/browser/helpQuickAccess":["commandes globales","commandes de l'\xE9diteur","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Couleur de premier plan globale. Cette couleur est utilis\xE9e si elle n'est pas remplac\xE9e par un composant.","Couleur principale de premier plan pour les messages d'erreur. Cette couleur est utilis\xE9e uniquement si elle n'est pas red\xE9finie par un composant.","Couleur par d\xE9faut des ic\xF4nes du banc d'essai.","Couleur de bordure globale des \xE9l\xE9ments ayant le focus. Cette couleur est utilis\xE9e si elle n'est pas remplac\xE9e par un composant.","Bordure suppl\xE9mentaire autour des \xE9l\xE9ments pour les s\xE9parer des autres et obtenir un meilleur contraste.","Bordure suppl\xE9mentaire autour des \xE9l\xE9ments actifs pour les s\xE9parer des autres et obtenir un meilleur contraste.","Couleur des liens dans le texte.","Couleur d'arri\xE8re-plan des blocs de code dans le texte.","Couleur de l'ombre des widgets, comme rechercher/remplacer, au sein de l'\xE9diteur.","Arri\xE8re-plan de la zone d'entr\xE9e.","Premier plan de la zone d'entr\xE9e.","Bordure de la zone d'entr\xE9e.","Couleur de la bordure des options activ\xE9es dans les champs d'entr\xE9e.","Couleur d'arri\xE8re-plan des options activ\xE9es dans les champs d'entr\xE9e.","Couleur de premier plan des options activ\xE9es dans les champs d'entr\xE9e.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 des informations.","Couleur de premier plan de validation de saisie pour la s\xE9v\xE9rit\xE9 Information.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 des informations.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 de l'avertissement.","Couleur de premier plan de la validation de la saisie pour la s\xE9v\xE9rit\xE9 Avertissement.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 de l'avertissement.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 de l'erreur.","Couleur de premier plan de la validation de saisie pour la s\xE9v\xE9rit\xE9 Erreur.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 de l'erreur. ","Arri\xE8re-plan de la liste d\xE9roulante.","Premier plan de la liste d\xE9roulante.","Couleur de premier plan du bouton.","Couleur d'arri\xE8re-plan du bouton.","Couleur d'arri\xE8re-plan du bouton pendant le pointage.","Couleur de fond des badges. Les badges sont de courts libell\xE9s d'information, ex. le nombre de r\xE9sultats de recherche.","Couleur des badges. Les badges sont de courts libell\xE9s d'information, ex. le nombre de r\xE9sultats de recherche.","Ombre de la barre de d\xE9filement pour indiquer que la vue d\xE9file.","Couleur de fond du curseur de la barre de d\xE9filement.","Couleur de fond du curseur de la barre de d\xE9filement lors du survol.","Couleur d\u2019arri\xE8re-plan de la barre de d\xE9filement lorsqu'on clique dessus.","Couleur de fond pour la barre de progression qui peut s'afficher lors d'op\xE9rations longues.","Couleur d'arri\xE8re-plan du texte d'erreur dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les erreurs dans l'\xE9diteur.","Couleur de bordure des zones d'erreur dans l'\xE9diteur.","Couleur d'arri\xE8re-plan du texte d'avertissement dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les avertissements dans l'\xE9diteur.","Couleur de bordure des zones d'avertissement dans l'\xE9diteur.","Couleur d'arri\xE8re-plan du texte d'information dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les informations dans l'\xE9diteur.","Couleur de bordure des zones d'informations dans l'\xE9diteur.","Couleur de premier plan de la ligne ondul\xE9e d'indication dans l'\xE9diteur.","Couleur de bordure des zones d'indication dans l'\xE9diteur.","Couleur d'arri\xE8re-plan de l'\xE9diteur.","Couleur de premier plan par d\xE9faut de l'\xE9diteur.","Couleur d'arri\xE8re-plan des gadgets de l'\xE9diteur tels que rechercher/remplacer.","Couleur de premier plan des widgets de l'\xE9diteur, notamment Rechercher/remplacer.","Couleur de bordure des widgets de l'\xE9diteur. La couleur est utilis\xE9e uniquement si le widget choisit d'avoir une bordure et si la couleur n'est pas remplac\xE9e par un widget.","Couleur de bordure de la barre de redimensionnement des widgets de l'\xE9diteur. La couleur est utilis\xE9e uniquement si le widget choisit une bordure de redimensionnement et si la couleur n'est pas remplac\xE9e par un widget.","Couleur d'arri\xE8re-plan du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur de premier plan du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur d'arri\xE8re-plan du titre du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur d'arri\xE8re-plan du s\xE9lecteur rapide pour l'\xE9l\xE9ment ayant le focus.","Couleur du s\xE9lecteur rapide pour les \xE9tiquettes de regroupement.","Couleur du s\xE9lecteur rapide pour les bordures de regroupement.","Couleur de la s\xE9lection de l'\xE9diteur.","Couleur du texte s\xE9lectionn\xE9 pour le contraste \xE9lev\xE9.","Couleur de la s\xE9lection dans un \xE9diteur inactif. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur des r\xE9gions dont le contenu est le m\xEAme que celui de la s\xE9lection. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure des r\xE9gions dont le contenu est identique \xE0 la s\xE9lection.","Couleur du r\xE9sultat de recherche actif.","Couleur des autres correspondances de recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de la plage limitant la recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure du r\xE9sultat de recherche actif.","Couleur de bordure des autres r\xE9sultats de recherche.","Couleur de bordure de la plage limitant la recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Surlignage sous le mot s\xE9lectionn\xE9 par pointage. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan du pointage de l'\xE9diteur.","Couleur de premier plan du pointage de l'\xE9diteur.","Couleur de bordure du pointage de l'\xE9diteur.","Couleur d'arri\xE8re-plan de la barre d'\xE9tat du pointage de l'\xE9diteur.","Couleur des liens actifs.","Couleur de premier plan des indicateurs inline","Couleur d'arri\xE8re-plan des indicateurs inline","Couleur utilis\xE9e pour l'ic\xF4ne d'ampoule sugg\xE9rant des actions.","Couleur utilis\xE9e pour l'ic\xF4ne d'ampoule sugg\xE9rant des actions de correction automatique.","Couleur d'arri\xE8re-plan du texte ins\xE9r\xE9. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan du texte supprim\xE9. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de contour du texte ins\xE9r\xE9.","Couleur de contour du texte supprim\xE9.","Couleur de bordure entre les deux \xE9diteurs de texte.","Couleur du remplissage diagonal de l'\xE9diteur de diff\xE9rences. Le remplissage diagonal est utilis\xE9 dans les vues de diff\xE9rences c\xF4te \xE0 c\xF4te.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de contour de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active a le focus clavier, contrairement \xE0 une liste/arborescence inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence de l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est inactive. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est inactive. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier (elle ne l'est pas quand elle est inactive).","Couleur de contour de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est inactive. Une liste/arborescence active a le focus clavier, contrairement \xE0 une liste/arborescence inactive.","Arri\xE8re-plan de la liste/l'arborescence pendant le pointage sur des \xE9l\xE9ments avec la souris.","Premier plan de la liste/l'arborescence pendant le pointage sur des \xE9l\xE9ments avec la souris.","Arri\xE8re-plan de l'op\xE9ration de glisser-d\xE9placer dans une liste/arborescence pendant le d\xE9placement d'\xE9l\xE9ments avec la souris.","Couleur de premier plan dans la liste/l'arborescence pour la surbrillance des correspondances pendant la recherche dans une liste/arborescence.","Couleur d'arri\xE8re-plan du widget de filtre de type dans les listes et les arborescences.","Couleur de contour du widget de filtre de type dans les listes et les arborescences.","Couleur de contour du widget de filtre de type dans les listes et les arborescences, en l'absence de correspondance.","Couleur de trait de l'arborescence pour les rep\xE8res de mise en retrait.","Couleur de trait de l'arborescence pour les rep\xE8res de mise en retrait.","Couleur de bordure des menus.","Couleur de premier plan des \xE9l\xE9ments de menu.","Couleur d'arri\xE8re-plan des \xE9l\xE9ments de menu.","Couleur de premier plan de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur d'arri\xE8re-plan de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur de bordure de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur d'un \xE9l\xE9ment de menu s\xE9parateur dans les menus.","Couleur d\u2019arri\xE8re-plan de mise en surbrillance d\u2019un extrait tabstop.","Couleur de bordure de mise en surbrillance d\u2019un extrait tabstop.","Couleur d\u2019arri\xE8re-plan de mise en surbrillance du tabstop final d\u2019un extrait.","Mettez en surbrillance la couleur de bordure du dernier taquet de tabulation d'un extrait de code.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour rechercher les correspondances. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des s\xE9lections. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la minimap pour les correspondances.","Couleur de marqueur du minimap pour la s\xE9lection de l'\xE9diteur.","Couleur de marqueur de minimap pour les erreurs.","Couleur de marqueur de minimap pour les avertissements.","Couleur d'arri\xE8re-plan du minimap.","Couleur d'arri\xE8re-plan du curseur de minimap.","Couleur d'arri\xE8re-plan du curseur de minimap pendant le survol.","Couleur d'arri\xE8re-plan du curseur de minimap pendant un clic.","Couleur utilis\xE9e pour l'ic\xF4ne d'erreur des probl\xE8mes.","Couleur utilis\xE9e pour l'ic\xF4ne d'avertissement des probl\xE8mes.","Couleur utilis\xE9e pour l'ic\xF4ne d'informations des probl\xE8mes."],"vs/platform/theme/common/iconRegistry":["ID de la police \xE0 utiliser. Si aucune valeur n'est d\xE9finie, la police d\xE9finie en premier est utilis\xE9e.","Caract\xE8re de police associ\xE9 \xE0 la d\xE9finition d'ic\xF4ne.","Ic\xF4ne de l'action de fermeture dans les widgets."],"vs/platform/undoRedo/common/undoRedoService":["Les fichiers suivants ont \xE9t\xE9 ferm\xE9s et modifi\xE9s sur le disque\xA0: {0}.","Les fichiers suivants ont \xE9t\xE9 modifi\xE9s de mani\xE8re incompatible : {0}.","Impossible d'annuler '{0}' dans tous les fichiers. {1}","Impossible d'annuler '{0}' dans tous les fichiers. {1}","Impossible d'annuler '{0}' dans tous les fichiers, car des modifications ont \xE9t\xE9 apport\xE9es \xE0 {1}","Impossible d'annuler '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution sur {1}","Impossible d'annuler '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement s'est produite dans l'intervalle","Souhaitez-vous annuler '{0}' dans tous les fichiers\xA0?","Annuler dans {0} fichiers","Annuler ce fichier","Annuler","Impossible d'annuler '{0}', car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution.","Voulez-vous annuler '{0}'\xA0?","Annuler","Annuler","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers. {1}","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers. {1}","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers, car des modifications ont \xE9t\xE9 apport\xE9es \xE0 {1}","Impossible de r\xE9tablir '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution pour {1}","Impossible de r\xE9tablir '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement s'est produite dans l'intervalle","Impossible de r\xE9tablir '{0}', car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution."]}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js new file mode 100644 index 0000000000..13c210fd3e --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.it",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["input"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Maiuscole/minuscole","Parola intera","Usa espressione regolare"],"vs/base/browser/ui/findinput/replaceInput":["input","Mantieni maiuscole/minuscole"],"vs/base/browser/ui/iconLabel/iconLabel":["Caricamento..."],"vs/base/browser/ui/inputbox/inputBox":["Errore: {0}","Avviso: {0}","Info: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Non associato"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["Cancella","Disabilita filtro sul tipo","Abilita filtro sul tipo","Non sono stati trovati elementi","Abbinamento di {0} su {1} elementi"],"vs/base/common/actions":["(vuoto)"],"vs/base/common/errorMessage":["{0}: {1}","Si \xE8 verificato un errore di sistema ({0})","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log.","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log.","{0} ({1} errori in totale)","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log."],"vs/base/common/keybindingLabels":["CTRL","MAIUSC","ALT","Windows","CTRL","MAIUSC","ALT","Super","CTRL","MAIUSC","ALT","Comando","CTRL","MAIUSC","ALT","Windows","CTRL","MAIUSC","ALT","Super"],"vs/base/parts/quickinput/browser/quickInput":["Indietro","{0}/{1}","Digitare per ridurre il numero di risultati.","{0} risultati","{0} selezionati","OK","Personalizzato","Indietro ({0})","Indietro"],"vs/base/parts/quickinput/browser/quickInputList":["Input rapido"],"vs/editor/browser/controller/coreCommands":["Si attiene alla fine anche quando si passa a righe pi\xF9 lunghe","Si attiene alla fine anche quando si passa a righe pi\xF9 lunghe"],"vs/editor/browser/controller/textAreaHandler":["editor","L'editor non \xE8 accessibile in questo momento. Premere {0} per le opzioni."],"vs/editor/browser/core/keybindingCancellation":["Indica se l'editor esegue un'operazione annullabile, ad esempio 'Anteprima riferimenti'"],"vs/editor/browser/editorExtensions":["&&Annulla","Annulla","&&Ripeti","Ripeti","&&Seleziona tutto","Seleziona tutto"],"vs/editor/browser/widget/codeEditorWidget":["Il numero di cursori \xE8 stato limitato a {0}."],"vs/editor/browser/widget/diffEditorWidget":["Effetto di riga per gli inserimenti nell'editor diff.","Effetto di riga per le rimozioni nell'editor diff.","Non \xE8 possibile confrontare i file perch\xE9 uno \xE8 troppo grande."],"vs/editor/browser/widget/diffReview":["Icona per 'Inserisci' nella revisione diff.","Icona per 'Rimuovi' nella revisione diff.","Icona per 'Chiudi' nella revisione diff.","Chiudi","nessuna riga modificata","1 riga modificata","{0} righe modificate","Differenza {0} di {1}: riga originale {2}, {3}, riga modificata {4}, {5}","vuota","{0} riga non modificata {1}","{0} riga originale {1} riga modificata {2}","+ {0} riga modificata {1}","- {0} riga originale {1}","Vai alla differenza successiva","Vai alla differenza precedente"],"vs/editor/browser/widget/inlineDiffMargin":["Copia le righe eliminate","Copia la riga eliminata","Copia la riga eliminata ({0})","Ripristina questa modifica","Copia la riga eliminata ({0})"],"vs/editor/common/config/commonEditorConfig":["Editor","Numero di spazi a cui equivale una tabulazione. Quando `#editor.detectIndentation#` \xE8 attivo, questa impostazione viene sostituita in base al contenuto del file.","Inserisce spazi quando viene premuto TAB. Quando `#editor.detectIndentation#` \xE8 attivo, questa impostazione viene sostituita in base al contenuto del file.","Controlla se `#editor.tabSize#` e `#editor.insertSpaces#` verranno rilevati automaticamente quando un file viene aperto in base al contenuto del file.","Rimuovi gli spazi finali inseriti automaticamente.","Gestione speciale dei file di grandi dimensioni per disabilitare alcune funzionalit\xE0 che fanno un uso intensivo della memoria.","Controlla se calcolare i completamenti in base alle parole presenti nel documento.","Suggerisci parole solo dal documento attivo.","Suggerisci parole da tutti i documenti aperti della stessa lingua.","Suggerisci parole da tutti i documenti aperti.","Controlla i documenti da cui vengono calcolati i completamenti basati su parole.","L'evidenziazione semantica \xE8 abilitata per tutti i temi colore.","L'evidenziazione semantica \xE8 disabilitata per tutti i temi colore.","La configurazione dell'evidenziazione semantica \xE8 gestita tramite l'impostazione `semanticHighlighting` del tema colori corrente.","Controlla se l'evidenziazione semanticHighlighting \xE8 visualizzata per i linguaggi che la supportano.","Mantiene aperti gli editor rapidi anche quando si fa doppio clic sul contenuto o si preme 'ESC'.","Per motivi di prestazioni le righe di lunghezza superiore non verranno tokenizzate","Timeout in millisecondi dopo il quale il calcolo delle differenze viene annullato. Usare 0 per indicare nessun timeout.","Controlla se l'editor diff mostra le differenze affiancate o incorporate.","Se abilitato, l'editor differenze ignora le modifiche relative a spazi vuoti iniziali e finali.","Controlla se l'editor diff mostra gli indicatori +/- per le modifiche aggiunte/rimosse.","Controlla se l'editor visualizza CodeLens.","Il ritorno a capo automatico delle righe non viene mai applicato.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza del viewport.","Il ritorno a capo automatico delle righe viene applicato in base all'impostazione `#editor.wordWrap#`."],"vs/editor/common/config/editorOptions":["L'editor user\xE0 le API della piattaforma per rilevare quando viene collegata un'utilit\xE0 per la lettura dello schermo.","L'editor verr\xE0 definitivamente ottimizzato per l'utilizzo con un'utilit\xE0 per la lettura dello schermo. Il ritorno a capo automatico verr\xE0 disabilitato.","L'editor non verr\xE0 mai ottimizzato per l'utilizzo con un'utilit\xE0 per la lettura dello schermo.","Controlla se l'editor deve essere eseguito in una modalit\xE0 ottimizzata per le utilit\xE0 per la lettura dello schermo. Se viene attivata, il ritorno a capo automatico verr\xE0 disabilitato.","Consente di controllare se viene inserito uno spazio quando si aggiungono commenti.","Controlla se ignorare le righe vuote con le opzioni per attivare/disattivare, aggiungere o rimuovere relative ai commenti di riga.","Controlla se, quando si copia senza aver effettuato una selezione, viene copiata la riga corrente.","Controlla se il cursore deve passare direttamente alla ricerca delle corrispondenze durante la digitazione.","Controlla se inizializzare la stringa di ricerca nel Widget Trova con il testo selezionato nell'editor.","Non attivare mai automaticamente la funzione Trova nella selezione (impostazione predefinita)","Attiva sempre automaticamente la funzione Trova nella selezione","Attiva automaticamente la funzione Trova nella selezione quando sono selezionate pi\xF9 righe di contenuto.","Controlla la condizione per attivare automaticamente la funzione Trova nella selezione.","Controlla se il widget Trova deve leggere o modificare gli appunti di ricerca condivisi in macOS.","Controlla se il widget Trova deve aggiungere altre righe nella parte superiore dell'editor. Quando \xE8 true, \xE8 possibile scorrere oltre la prima riga quando il widget Trova \xE8 visibile.","Controlla se la ricerca viene riavviata automaticamente dall'inizio o dalla fine quando non \xE8 possibile trovare ulteriori corrispondenze.","Abilita/Disabilita i caratteri legatura (funzionalit\xE0 dei tipi di carattere 'calt' e 'liga'). Impostare su una stringa per un controllo pi\xF9 specifico sulla propriet\xE0 CSS 'font-feature-settings'.","Propriet\xE0 CSS 'font-feature-settings' esplicita. Se \xE8 necessario solo attivare/disattivare le legature, \xE8 possibile passare un valore booleano.","Consente di configurare i caratteri legatura o le funzionalit\xE0 dei tipi di carattere. Pu\xF2 essere un valore booleano per abilitare/disabilitare le legature o una stringa per il valore della propriet\xE0 CSS 'font-feature-settings'.","Controlla le dimensioni del carattere in pixel.",'Sono consentiti solo le parole chiave "normal" e "bold" o i numeri compresi tra 1 e 1000.','Controlla lo spessore del carattere. Accetta le parole chiave "normal" e "bold" o i numeri compresi tra 1 e 1000.',"Mostra la visualizzazione rapida dei risultati (impostazione predefinita)","Passa al risultato principale e mostra una visualizzazione rapida","Passa al risultato principale e abilita l'esplorazione senza anteprima per gli altri","Questa impostazione \xE8 deprecata. In alternativa, usare impostazioni diverse, come 'editor.editor.gotoLocation.multipleDefinitions' o 'editor.editor.gotoLocation.multipleImplementations'.","Controlla il comportamento del comando 'Vai alla definizione' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai alla definizione di tipo' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a dichiarazione' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a implementazioni' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a riferimenti' quando esistono pi\xF9 posizioni di destinazione.","ID comando alternativo eseguito quando il risultato di 'Vai alla definizione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai alla definizione di tipo' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a dichiarazione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a implementazione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a riferimento' \xE8 la posizione corrente.","Controlla se mostrare l'area sensibile al passaggio del mouse.","Controlla il ritardo in millisecondi dopo il quale viene mostrato il passaggio del mouse.","Controlla se l'area sensibile al passaggio del mouse deve rimanere visibile quando vi si passa sopra con il puntatore del mouse.","Abilita la lampadina delle azioni codice nell'editor.","Abilita i suggerimenti inline nell'editor.","Controlla le dimensioni del carattere dei suggerimenti inline nell'editor. Quando \xE8 impostata su `0`, viene usato il 90% del valore di `#editor.fontSize#`.","Controlla la famiglia di caratteri dei suggerimenti inline nell'editor.","Controlla l'altezza della riga. Usare 0 per calcolare l'altezza della riga dalle dimensioni del carattere.","Controlla se la minimappa \xE8 visualizzata.","La minimappa ha le stesse dimensioni del contenuto dell'editor (e potrebbe supportare lo scorrimento).","Se necessario, la minimappa si ridurr\xE0 o si ingrandir\xE0 in modo da adattarsi all'altezza dell'editor (nessuno scorrimento).","Se necessario, la minimappa si ridurr\xE0 in modo che la larghezza non superi mai quella dell'editor (nessuno scorrimento).","Controlla le dimensioni della minimappa.","Definisce il lato in cui eseguire il rendering della minimappa.","Controlla se il dispositivo di scorrimento della minimappa \xE8 visualizzato.","Scala del contenuto disegnato nella minimappa: 1, 2 o 3.","Esegue il rendering dei caratteri effettivi di una riga in contrapposizione ai blocchi colore.","Limita la larghezza della minimappa in modo da eseguire il rendering al massimo di un certo numero di colonne.","Controlla la quantit\xE0 di spazio tra il bordo superiore dell'editor e la prima riga.","Controlla la quantit\xE0 di spazio tra il bordo inferiore dell'editor e l'ultima riga.","Abilita un popup che mostra documentazione sui parametri e informazioni sui tipi mentre si digita.","Controlla se il menu dei suggerimenti per i parametri esegue un ciclo o si chiude quando viene raggiunta la fine dell'elenco.","Abilita i suggerimenti rapidi all'interno di stringhe.","Abilita i suggerimenti rapidi all'interno di commenti.","Abilita i suggerimenti rapidi all'esterno di stringhe e commenti.","Controlla se visualizzare automaticamente i suggerimenti durante la digitazione.","I numeri di riga non vengono visualizzati.","I numeri di riga vengono visualizzati come numeri assoluti.","I numeri di riga vengono visualizzati come distanza in linee alla posizione del cursore.","I numeri di riga vengono visualizzati ogni 10 righe.","Controlla la visualizzazione dei numeri di riga.","Numero di caratteri a spaziatura fissa in corrispondenza del quale verr\xE0 eseguito il rendering di questo righello dell'editor.","Colore di questo righello dell'editor.","Esegue il rendering dei righelli verticali dopo un certo numero di caratteri a spaziatura fissa. Usare pi\xF9 valori per pi\xF9 righelli. Se la matrice \xE8 vuota, non viene disegnato alcun righello.","Inserisce il suggerimento senza sovrascrivere il testo a destra del cursore.","Inserisce il suggerimento e sovrascrive il testo a destra del cursore.","Controlla se le parole vengono sovrascritte quando si accettano i completamenti. Tenere presente che questa opzione dipende dalle estensioni che accettano esplicitamente questa funzionalit\xE0.","Controlla se i suggerimenti di filtro e ordinamento valgono per piccoli errori di battitura.","Controlla se l'ordinamento privilegia le parole che appaiono pi\xF9 vicine al cursore.","Controlla se condividere le selezioni dei suggerimenti memorizzati tra aree di lavoro e finestre (richiede `#editor.suggestSelection#`).","Controlla se un frammento attivo impedisce i suggerimenti rapidi.","Controlla se mostrare o nascondere le icone nei suggerimenti.","Controlla la visibilit\xE0 della barra di stato nella parte inferiore del widget dei suggerimenti.","Controlla se i dettagli del suggerimento vengono visualizzati inline con l'etichetta o solo nel widget dei dettagli","Questa impostazione \xE8 deprecata. Il widget dei suggerimenti pu\xF2 ora essere ridimensionato.","Questa impostazione \xE8 deprecata. In alternativa, usare impostazioni diverse, come 'editor.suggest.showKeywords' o 'editor.suggest.showSnippets'.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `method`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `function`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `constructor`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `field`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `variable`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `class`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `struct`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `interface`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `module`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `property`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `event`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `operator`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `unit`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `value`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `constant`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `enum`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `enumMember`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `keyword`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `text`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `color`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `file`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `reference`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `customcolor`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `folder`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `typeParameter`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `snippet`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `user`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `issues`.","Indica se gli spazi vuoti iniziali e finali devono essere sempre selezionati.","Controlla se accettare i suggerimenti con i caratteri di commit. Ad esempio, in JavaScript il punto e virgola (';') pu\xF2 essere un carattere di commit che accetta un suggerimento e digita tale carattere.","Accetta un suggerimento con 'Invio' solo quando si apporta una modifica al testo.","Controlla se i suggerimenti devono essere accettati con 'INVIO' in aggiunta a 'TAB'. In questo modo \xE8 possibile evitare ambiguit\xE0 tra l'inserimento di nuove righe e l'accettazione di suggerimenti.","Controlla il numero di righe nell'editor che possono essere lette da un utilit\xE0 per la lettura dello schermo. Avviso: questa opzione pu\xF2 influire sulle prestazioni se il numero di righe \xE8 superiore a quello predefinito.","Contenuto editor","Usa le configurazioni del linguaggio per determinare la chiusura automatica delle parentesi.","Chiudi automaticamente le parentesi solo quando il cursore si trova alla sinistra di uno spazio vuoto.","Controlla se l'editor deve chiudere automaticamente le parentesi quadre dopo che sono state aperte.","Digita sopra le virgolette o le parentesi quadre di chiusura solo se sono state inserite automaticamente.","Controlla se l'editor deve digitare su virgolette o parentesi quadre.","Usa le configurazioni del linguaggio per determinare la chiusura automatica delle virgolette.","Chiudi automaticamente le virgolette solo quando il cursore si trova alla sinistra di uno spazio vuoto.","Controlla se l'editor deve chiudere automaticamente le citazioni dopo che sono state aperte.","L'editor non inserir\xE0 automaticamente il rientro.","L'editor manterr\xE0 il rientro della riga corrente.","L'editor manterr\xE0 il rientro della riga corrente e rispetter\xE0 le parentesi definite dalla lingua.","L'editor manterr\xE0 il rientro della riga corrente, rispetter\xE0 le parentesi definite dalla lingua e richiamer\xE0 le regole onEnterRules speciali definite dalle lingue.","L'editor manterr\xE0 il rientro della riga corrente, rispetter\xE0 le parentesi definite dalla lingua, richiamer\xE0 le regole onEnterRules speciali definite dalle lingue e rispetter\xE0 le regole indentationRules definite dalle lingue.","Controlla se l'editor deve regolare automaticamente il rientro quando gli utenti digitano, incollano, spostano le righe o applicano il rientro.","Usa le configurazioni del linguaggio per determinare quando racchiudere automaticamente le selezioni tra parentesi quadre o virgolette.","Racchiude la selezione tra virgolette ma non tra parentesi quadre.","Racchiude la selezione tra parentesi quadre ma non tra virgolette.","Controlla se l'editor deve racchiudere automaticamente le selezioni quando si digitano virgolette o parentesi quadre.","Emula il comportamento di selezione dei caratteri di tabulazione quando si usano gli spazi per il rientro. La selezione verr\xE0 applicata alle tabulazioni.","Controlla se l'editor visualizza CodeLens.","Controlla la famiglia di caratteri per CodeLens.","Controlla le dimensioni del carattere in pixel per CodeLens. Quando \xE8 impostata su `0`, viene usato il 90% del valore di `#editor.fontSize#`.","Controlla se l'editor deve eseguire il rendering della selezione colori e degli elementi Decorator di tipo colore inline.","Abilita l'uso di mouse e tasti per la selezione delle colonne.","Controlla se l'evidenziazione della sintassi deve essere copiata negli Appunti.","Controllo dello stile di animazione del cursore.","Controlla se l'animazione del cursore con anti-aliasing deve essere abilitata.","Controlla lo stile del cursore.","Controlla il numero minimo di righe iniziali e finali visibili che circondano il cursore. Noto come 'scrollOff' o 'scrollOffset' in altri editor.","`cursorSurroundingLines` viene applicato solo quando \xE8 attivato tramite la tastiera o l'API.","`cursorSurroundingLines` viene sempre applicato.","Controlla quando deve essere applicato `cursorSurroundingLines`.","Controlla la larghezza del cursore quando `#editor.cursorStyle#` \xE8 impostato su `line`.","Controlla se l'editor deve consentire lo spostamento di selezioni tramite trascinamento della selezione.","Moltiplicatore della velocit\xE0 di scorrimento quando si preme `Alt`.","Controlla se per l'editor \xE8 abilitata la riduzione del codice.","Usa una strategia di riduzione specifica della lingua, se disponibile; altrimenti ne usa una basata sui rientri.","Usa la strategia di riduzione basata sui rientri.","Controlla la strategia per il calcolo degli intervalli di riduzione.","Controlla se l'editor deve evidenziare gli intervalli con riduzione del codice.","Controlla se, facendo clic sul contenuto vuoto dopo una riga ridotta, la riga viene espansa.","Controlla la famiglia di caratteri.","Controlla se l'editor deve formattare automaticamente il contenuto incollato. Deve essere disponibile un formattatore che deve essere in grado di formattare un intervallo in un documento.","Controlla se l'editor deve formattare automaticamente la riga dopo la digitazione.","Controlla se l'editor deve eseguire il rendering del margine verticale del glifo. Il margine del glifo viene usato principalmente per il debug.","Controlla se il cursore deve essere nascosto nel righello delle annotazioni.","Controlla se l'editor deve evidenziare la guida con rientro attiva.","Controlla la spaziatura tra le lettere in pixel.","Controlla se la modifica collegata \xE8 abilitata per l'editor. A seconda del linguaggio, i simboli correlati, ad esempio i tag HTML, vengono aggiornati durante la modifica.","Controlla se l'editor deve individuare i collegamenti e renderli selezionabili.","Evidenzia le parentesi graffe corrispondenti.","Moltiplicatore da usare sui valori `deltaX` e `deltaY` degli eventi di scorrimento della rotellina del mouse.","Ingrandisce il carattere dell'editor quando si usa la rotellina del mouse e si tiene premuto 'CTRL'.","Unire i cursori multipli se sovrapposti.","Rappresenta il tasto 'Control' in Windows e Linux e il tasto 'Comando' in macOS.","Rappresenta il tasto 'Alt' in Windows e Linux e il tasto 'Opzione' in macOS.","Modificatore da usare per aggiungere pi\xF9 cursori con il mouse. I gesti del mouse Vai alla definizione e Apri il collegamento si adatteranno in modo da non entrare in conflitto con il modificatore di selezione multipla. [Altre informazioni](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Ogni cursore incolla una singola riga del testo.","Ogni cursore incolla il testo completo.","Controlla l'operazione Incolla quando il conteggio delle righe del testo incollato corrisponde al conteggio dei cursori.","Controlla se l'editor deve evidenziare le occorrenze di simboli semantici.","Controlla se deve essere disegnato un bordo intorno al righello delle annotazioni.","Sposta lo stato attivo sull'albero quando si apre l'anteprima","Sposta lo stato attivo sull'editor quando si apre l'anteprima","Controlla se spostare lo stato attivo sull'editor inline o sull'albero nel widget di anteprima.","Controlla se il movimento del mouse Vai alla definizione consente sempre di aprire il widget di anteprima.","Controlla il ritardo in millisecondi dopo il quale verranno visualizzati i suggerimenti rapidi.","Controlla se l'editor viene rinominato automaticamente in base al tipo.","Deprecata. In alternativa, usare `editor.linkedEditing`.","Controlla se l'editor deve eseguire il rendering dei caratteri di controllo.","Controlla se l'editor deve eseguire il rendering delle guide con rientro.","Esegue il rendering dell'ultimo numero di riga quando il file termina con un carattere di nuova riga.","Mette in evidenza sia la barra di navigazione sia la riga corrente.","Controlla in che modo l'editor deve eseguire il rendering dell'evidenziazione di riga corrente.","Controlla se l'editor deve eseguire il rendering dell'evidenziazione della riga corrente solo quando l'editor ha lo stato attivo","Esegue il rendering dei caratteri di spazio vuoto ad eccezione dei singoli spazi tra le parole.","Esegui il rendering dei caratteri di spazio vuoto solo nel testo selezionato.","Esegui il rendering solo dei caratteri di spazio vuoto finali","Controlla in che modo l'editor deve eseguire il rendering dei caratteri di spazio vuoto.","Controlla se le selezioni devono avere gli angoli arrotondati.","Controlla il numero di caratteri aggiuntivi oltre i quali l'editor scorrer\xE0 orizzontalmente.","Controlla se l'editor scorrer\xE0 oltre l'ultima riga.","Scorre solo lungo l'asse predominante durante lo scorrimento verticale e orizzontale simultaneo. Impedisce la deviazione orizzontale quando si scorre in verticale su un trackpad.","Controlla se gli appunti primari di Linux devono essere supportati.","Controlla se l'editor deve evidenziare gli elementi corrispondenti simili alla selezione.","Mostra sempre i comandi di riduzione.","Mostra i comandi di riduzione solo quando il mouse \xE8 posizionato sul margine della barra di scorrimento.","Controlla se i controlli di riduzione sul margine della barra di scorrimento vengono visualizzati.","Controllo dissolvenza del codice inutilizzato.","Controlla le variabili deprecate barrate.","Visualizza i suggerimenti del frammento prima degli altri suggerimenti.","Visualizza i suggerimenti del frammento dopo gli altri suggerimenti.","Visualizza i suggerimenti del frammento insieme agli altri suggerimenti.","Non mostrare i suggerimenti del frammento.","Controlla se i frammenti di codice sono visualizzati con altri suggerimenti e il modo in cui sono ordinati.","Controlla se per lo scorrimento dell'editor verr\xE0 usata un'animazione.","Dimensioni del carattere per il widget dei suggerimenti. Se impostato su `0`, viene usato il valore di `#editor.fontSize#`.","Altezza della riga per il widget dei suggerimenti. Se impostato su `0`, viene usato il valore `editor.lineHeight#`. Il valore minimo \xE8 8.","Controlla se i suggerimenti devono essere visualizzati automaticamente durante la digitazione dei caratteri trigger.","Consente di selezionare sempre il primo suggerimento.","Consente di selezionare suggerimenti recenti a meno che continuando a digitare non ne venga selezionato uno, ad esempio `console.| ->; console.log` perch\xE9 `log` \xE8 stato completato di recente.","Consente di selezionare i suggerimenti in base a prefissi precedenti che hanno completato tali suggerimenti, ad esempio `co ->; console` e `con -> const`.","Controlla la modalit\xE0 di preselezione dei suggerimenti durante la visualizzazione dell'elenco dei suggerimenti.","La funzionalit\xE0 di completamento con tasto TAB inserir\xE0 il migliore suggerimento alla pressione del tasto TAB.","Disabilita le funzionalit\xE0 di completamento con tasto TAB.","Completa i frammenti con il tasto TAB quando i rispettivi prefissi corrispondono. Funziona in modo ottimale quando 'quickSuggestions' non \xE8 abilitato.","Abilit\xE0 la funzionalit\xE0 di completamento con tasto TAB.","I caratteri di terminazione di riga insoliti vengono rimossi automaticamente.","I caratteri di terminazione di riga insoliti vengono ignorati.","Prompt per i caratteri di terminazione di riga insoliti da rimuovere.","Rimuovi caratteri di terminazione di riga insoliti che potrebbero causare problemi.","Inserimento ed eliminazione dello spazio vuoto dopo le tabulazioni.","Caratteri che verranno usati come separatori di parola quando si eseguono operazioni o spostamenti correlati a parole.","Il ritorno a capo automatico delle righe non viene mai applicato.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza del viewport.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza di `#editor.wordWrapColumn#`.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza minima del viewport e di `#editor.wordWrapColumn#`.","Controlla il ritorno a capo automatico delle righe.","Controlla la colonna per il ritorno a capo automatico dell'editor quando il valore di `#editor.wordWrap#` \xE8 `wordWrapColumn` o `bounded`.","Nessun rientro. Le righe con ritorno a capo iniziano dalla colonna 1. ","Le righe con ritorno a capo hanno lo stesso rientro della riga padre.","Le righe con ritorno a capo hanno un rientro di +1 rispetto alla riga padre.","Le righe con ritorno a capo hanno un rientro di +2 rispetto alla riga padre.","Controlla il rientro delle righe con ritorno a capo.","Presuppone che la larghezza sia identica per tutti caratteri. Si tratta di un algoritmo veloce che funziona correttamente per i tipi di carattere a spaziatura fissa e determinati script (come i caratteri latini) in cui i glifi hanno larghezza identica.","Delega il calcolo dei punti di ritorno a capo al browser. Si tratta di un algoritmo lento che potrebbe causare blocchi con file di grandi dimensioni, ma funziona correttamente in tutti gli altri casi.","Controlla l'algoritmo che calcola i punti di ritorno a capo."],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["Digitazione"],"vs/editor/common/modes/modesRegistry":["Testo normale"],"vs/editor/common/standaloneStrings":["Nessuna selezione","Riga {0}, colonna {1} ({2} selezionate)","Riga {0}, colonna {1}","{0} selezioni ({1} caratteri selezionati)","{0} selezioni","Modifica dell'impostazione `accessibilitySupport` in `on`.","Apertura della pagina di documentazione sull'accessibilit\xE0 dell'editor.","in un riquadro di sola lettura di un editor diff.","in un riquadro di un editor diff."," in un editor di codice di sola lettura"," in un editor di codice","Per configurare l'editor da ottimizzare per l'utilizzo con un'utilit\xE0 per la lettura dello schermo, premere Comando+E.","Per configurare l'editor da ottimizzare per l'utilizzo con un'utilit\xE0 per la lettura dello schermo, premere CTRL+E.","L'editor \xE8 configurato per essere ottimizzato per l'utilizzo con un'utilit\xE0 per la lettura dello schermo.","L'editor \xE8 configurato per non essere ottimizzato per l'utilizzo con un'utilit\xE0 per la lettura dello schermo, che non viene usata in questo momento.","Premere TAB nell'editor corrente per spostare lo stato attivo sull'elemento con stato attivabile successivo. Per attivare/disattivare questo comportamento, premere {0}.","Premere TAB nell'editor corrente per spostare lo stato attivo sull'elemento con stato attivabile successivo. Il comando {0} non pu\xF2 essere attualmente attivato con un tasto di scelta rapida.","Premere TAB nell'editor corrente per inserire il carattere di tabulazione. Per attivare/disattivare questo comportamento, premere {0}.","Premere TAB nell'editor corrente per inserire il carattere di tabulazione. Il comando {0} non pu\xF2 essere attualmente attivato con un tasto di scelta rapida.","Premere Comando+H per aprire una finestra del browser contenente maggiori informazioni correlate all'accessibilit\xE0 dell'editor.","Premere CTRL+H per aprire una finestra del browser contenente maggiori informazioni correlate all'accessibilit\xE0 dell'editor.","Per chiudere questa descrizione comando e tornare all'editor, premere ESC o MAIUSC+ESC.","Visualizza la Guida sull'accessibilit\xE0","Sviluppatore: Controlla token","Vai a Riga/Colonna...","Mostra tutti i provider di accesso rapido","Riquadro comandi","Mostra ed esegui comandi","Vai al simbolo...","Vai al simbolo per categoria...","Contenuto editor","Premere ALT+F1 per le opzioni di accessibilit\xE0.","Attiva/disattiva tema a contrasto elevato","Effettuate {0} modifiche in {1} file"],"vs/editor/common/view/editorColorRegistry":["Colore di sfondo per l'evidenziazione della riga alla posizione del cursore.","Colore di sfondo per il bordo intorno alla riga alla posizione del cursore.","Colore di sfondo degli intervalli evidenziati, ad esempio dalle funzionalit\xE0 Quick Open e Trova. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo del bordo intorno agli intervalli selezionati.","Colore di sfondo del simbolo evidenziato, ad esempio per passare alla definizione o al simbolo successivo/precedente. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo del bordo intorno ai simboli selezionati.","Colore del cursore dell'editor.","Colore di sfondo del cursore editor. Permette di personalizzare il colore di un carattere quando sovrapposto da un blocco cursore.","Colore dei caratteri di spazio vuoto nell'editor.","Colore delle guide per i rientri dell'editor.","Colore delle guide di indentazione dell'editor attivo","Colore dei numeri di riga dell'editor.","Colore del numero di riga attivo dell'editor","Id \xE8 deprecato. In alternativa usare 'editorLineNumber.activeForeground'.","Colore del numero di riga attivo dell'editor","Colore dei righelli dell'editor.","Colore primo piano delle finestre di CodeLens dell'editor","Colore di sfondo delle parentesi corrispondenti","Colore delle caselle di parentesi corrispondenti","Colore del bordo del righello delle annotazioni.","Colore di sfondo del righello delle annotazioni dell'editor. Viene usato solo quando la minimappa \xE8 abilitata e posizionata sul lato destro dell'editor.","Colore di sfondo della barra di navigazione dell'editor. La barra contiene i margini di glifo e i numeri di riga.","Colore del bordo del codice sorgente non necessario (non usato) nell'editor.",`Opacit\xE0 del codice sorgente non necessario (non usato) nell'editor. Ad esempio, con "#000000c0" il rendering del codice verr\xE0 eseguito con il 75% di opacit\xE0. Per i temi a contrasto elevato, usare il colore del tema 'editorUnnecessaryCode.border' per sottolineare il codice non necessario invece di opacizzarlo.`,"Colore del marcatore del righello delle annotazioni per le evidenziazioni degli intervalli. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per gli errori.","Colore del marcatore del righello delle annotazioni per gli avvisi.","Colore del marcatore del righello delle annotazioni per i messaggi di tipo informativo."],"vs/editor/contrib/anchorSelect/anchorSelect":["Ancoraggio della selezione","Ancoraggio impostato alla posizione {0}:{1}","Imposta ancoraggio della selezione","Vai ad ancoraggio della selezione","Seleziona da ancoraggio a cursore","Annulla ancoraggio della selezione"],"vs/editor/contrib/bracketMatching/bracketMatching":["Colore del marcatore del righello delle annotazioni per la corrispondenza delle parentesi.","Vai alla parentesi quadra","Seleziona fino alla parentesi","Vai alla parentesi &&quadra"],"vs/editor/contrib/caretOperations/caretOperations":["Sposta testo selezionato a sinistra","Sposta testo selezionato a destra"],"vs/editor/contrib/caretOperations/transpose":["Trasponi lettere"],"vs/editor/contrib/clipboard/clipboard":["&&Taglia","Taglia","Taglia","&&Copia","Copia","Copia","&&Incolla","Incolla","Incolla","Copia con evidenziazione sintassi"],"vs/editor/contrib/codeAction/codeActionCommands":["Tipo dell'azione codice da eseguire.","Controlla quando vengono applicate le azioni restituite.","Applica sempre la prima azione codice restituita.","Applica la prima azione codice restituita se \xE8 l'unica.","Non applicare le azioni codice restituite.","Controlla se devono essere restituite solo le azioni codice preferite.","Si \xE8 verificato un errore sconosciuto durante l'applicazione dell'azione del codice","Correzione rapida...","Azioni codice non disponibili","Non sono disponibili azioni codice preferite per '{0}'","Non sono disponibili azioni codice per '{0}'","Non sono disponibili azioni codice preferite","Azioni codice non disponibili","Effettua refactoring...","Non sono disponibili refactoring preferiti per '{0}'","Non sono disponibili refactoring per '{0}'","Non sono disponibili refactoring preferiti","Refactoring non disponibili","Azione origine...","Non sono disponibili azioni origine preferite per '{0}'","Non sono disponibili azioni origine per '{0}'","Non sono disponibili azioni origine preferite","Azioni origine non disponibili","Organizza import","Azioni di organizzazione Imports non disponibili","Correggi tutto","Non \xE8 disponibile alcuna azione Correggi tutto","Correzione automatica...","Non sono disponibili correzioni automatiche"],"vs/editor/contrib/codeAction/lightBulbWidget":["Mostra correzioni. Correzione preferita disponibile ({0})","Mostra correzioni ({0})","Mostra correzioni"],"vs/editor/contrib/codelens/codelensController":["Mostra comandi di CodeLens per la riga corrente"],"vs/editor/contrib/comment/comment":["Attiva/disattiva commento per la riga","Attiva/Disattiva commento per la &&riga","Aggiungi commento per la riga","Rimuovi commento per la riga","Attiva/Disattiva commento per il blocco","Attiva/Disattiva commento per il &&blocco"],"vs/editor/contrib/contextmenu/contextmenu":["Mostra il menu di scelta rapida editor"],"vs/editor/contrib/cursorUndo/cursorUndo":["Cursore - Annulla","Cursore - Ripeti"],"vs/editor/contrib/find/findController":["Trova","&&Trova","Trova con selezione","Trova successivo","Trova successivo","Trova precedente","Trova precedente","Trova selezione successiva","Trova selezione precedente","Sostituisci","&&Sostituisci"],"vs/editor/contrib/find/findWidget":["Icona per 'Trova nella selezione' nel widget di ricerca dell'editor.","Icona per indicare che il widget di ricerca dell'editor \xE8 compresso.","Icona per indicare che il widget di ricerca dell'editor \xE8 espanso.","Icona per 'Sostituisci' nel widget di ricerca dell'editor.","Icona per 'Sostituisci tutto' nel widget di ricerca dell'editor.","Icona per 'Trova precedente' nel widget di ricerca dell'editor.","Icona per 'Trova successivo' nel widget di ricerca dell'editor.","Trova","Trova","Corrispondenza precedente","Corrispondenza successiva","Trova nella selezione","Chiudi","Sostituisci","Sostituisci","Sostituisci","Sostituisci tutto","Attiva/Disattiva modalit\xE0 sostituzione","Solo i primi {0} risultati vengono evidenziati, ma tutte le operazioni di ricerca funzionano su tutto il testo.","{0} di {1}","Nessun risultato","{0} trovato","{0} trovati per '{1}'","{0} trovati per '{1}' alla posizione {2}","{0} trovati per '{1}'","Il tasto di scelta rapida CTRL+INVIO ora consente di inserire l'interruzione di linea invece di sostituire tutto. Per eseguire l'override di questo comportamento, \xE8 possibile modificare il tasto di scelta rapida per editor.action.replaceAll."],"vs/editor/contrib/folding/folding":["Espandi","Espandi in modo ricorsivo","Riduci","Attiva/Disattiva riduzione","Riduci in modo ricorsivo","Riduci tutti i blocchi commento","Riduci tutte le regioni","Espandi tutte le regioni","Riduci tutto","Espandi tutto","Livello riduzione {0}","Colore di sfondo degli intervalli con riduzione. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del controllo di riduzione nella barra di navigazione dell'editor."],"vs/editor/contrib/folding/foldingDecorations":["Icona per gli intervalli espansi nel margine del glifo dell'editor.","Icona per gli intervalli compressi nel margine del glifo dell'editor."],"vs/editor/contrib/fontZoom/fontZoom":["Zoom avanti tipo di carattere editor","Zoom indietro tipo di carattere editor","Reimpostazione zoom tipo di carattere editor"],"vs/editor/contrib/format/format":["\xC8 stata apportata 1 modifica di formattazione a riga {0}","Sono state apportate {0} modifiche di formattazione a riga {1}","\xC8 stata apportata 1 modifica di formattazione tra le righe {0} e {1}","Sono state apportate {0} modifiche di formattazione tra le righe {1} e {2}"],"vs/editor/contrib/format/formatActions":["Formatta documento","Formatta selezione"],"vs/editor/contrib/gotoError/gotoError":["Vai al problema successivo (Errore, Avviso, Informazioni)","Icona per il marcatore Vai a successivo.","Vai al problema precedente (Errore, Avviso, Informazioni)","Icona per il marcatore Vai a precedente.","Vai al problema successivo nei file (Errore, Avviso, Informazioni)","&&Problema successivo","Vai al problema precedente nei file (Errore, Avviso, Informazioni)","&&Problema precedente"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Errore","Avviso","Info","Suggerimento","{0} a {1}. ","{0} di {1} problemi","{0} di {1} problema","Colore per gli errori del widget di spostamento tra marcatori dell'editor.","Colore per gli avvisi del widget di spostamento tra marcatori dell'editor.","Colore delle informazioni del widget di navigazione marcatori dell'editor.","Sfondo del widget di spostamento tra marcatori dell'editor."],"vs/editor/contrib/gotoSymbol/goToCommands":["Anteprima","Definizioni","Non \xE8 stata trovata alcuna definizione per '{0}'","Non \xE8 stata trovata alcuna definizione","Vai alla definizione","Vai alla &&definizione","Apri definizione lateralmente","Visualizza in anteprima la definizione","Dichiarazioni","Non \xE8 stata trovata alcuna dichiarazione per '{0}'","Dichiarazione non trovata","Vai a dichiarazione","Vai a &&dichiarazione","Non \xE8 stata trovata alcuna dichiarazione per '{0}'","Dichiarazione non trovata","Anteprima dichiarazione","Definizioni di tipo","Non sono state trovate definizioni di tipi per '{0}'","Non sono state trovate definizioni di tipi","Vai alla definizione di tipo","Vai alla &&definizione di tipo","Anteprima definizione di tipo","Implementazioni","Non sono state trovate implementazioni per '{0}'","Non sono state trovate implementazioni","Vai a implementazioni","Vai a &&Implementazioni","Visualizza implementazioni","Non sono stati trovati riferimenti per '{0}'","Non sono stati trovati riferimenti","Vai a Riferimenti","Vai a &&riferimenti","Riferimenti","Anteprima riferimenti","Riferimenti","Vai a qualsiasi simbolo","Posizioni","Nessun risultato per '{0}'","Riferimenti"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Fare clic per visualizzare {0} definizioni."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Caricamento...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} riferimenti","{0} riferimento","Riferimenti"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["anteprima non disponibile","Nessun risultato","Riferimenti"],"vs/editor/contrib/gotoSymbol/referencesModel":["simbolo in {0} alla riga {1} colonna {2}","simbolo in {0} alla riga {1} colonna {2}, {3}","1 simbolo in {0}, percorso completo {1}","{0} simboli in {1}, percorso completo {2}","Non sono stati trovati risultati","Trovato 1 simbolo in {0}","Trovati {0} simboli in {1}","Trovati {0} simboli in {1} file"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["Simbolo {0} di {1}, {2} per il successivo","Simbolo {0} di {1}"],"vs/editor/contrib/hover/hover":["Visualizza passaggio del mouse","Mostra anteprima definizione al passaggio del mouse"],"vs/editor/contrib/hover/markdownHoverParticipant":["Caricamento..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","Non sono disponibili correzioni rapide","Verifica disponibilit\xE0 correzioni rapide...","Non sono disponibili correzioni rapide","Correzione rapida..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Sostituisci con il valore precedente","Sostituisci con il valore successivo"],"vs/editor/contrib/indentation/indentation":["Converti rientro in spazi","Converti rientro in tabulazioni","Dimensione tabulazione configurata","Seleziona dimensione tabulazione per il file corrente","Imposta rientro con tabulazioni","Imposta rientro con spazi","Rileva rientro dal contenuto","Imposta nuovo rientro per righe","Re-Indenta le Linee Selezionate"],"vs/editor/contrib/linesOperations/linesOperations":["Copia la riga in alto","&&Copia la riga in alto","Copia la riga in basso","Co&&pia la riga in basso","Duplica selezione","&&Duplica selezione","Sposta la riga in alto","Sposta la riga in &&alto","Sposta la riga in basso","Sposta la riga in &&basso","Ordinamento righe crescente","Ordinamento righe decrescente","Taglia spazio vuoto finale","Elimina riga","Imposta un rientro per la riga","Riduci il rientro per la riga","Inserisci la riga sopra","Inserisci la riga sotto","Elimina tutto a sinistra","Elimina tutto a destra","Unisci righe","Trasponi caratteri intorno al cursore","Converti in maiuscolo","Converti in minuscolo","Trasforma in Tutte Iniziali Maiuscole","Trasforma in snake case"],"vs/editor/contrib/linkedEditing/linkedEditing":["Avvia modifica collegata","Colore di sfondo quando l'editor viene rinominato automaticamente in base al tipo."],"vs/editor/contrib/links/links":["Esegui il comando","Visita il collegamento","CMD+clic","CTRL+clic","Opzione+clic","ALT+clic","Esegue il comando {0}","Non \xE8 stato possibile aprire questo collegamento perch\xE9 il formato non \xE8 valido: {0}","Non \xE8 stato possibile aprire questo collegamento perch\xE9 manca la destinazione.","Apri collegamento"],"vs/editor/contrib/message/messageController":["Indica se l'editor visualizza attualmente un messaggio inline","Non \xE8 possibile modificare nell'editor di sola lettura"],"vs/editor/contrib/multicursor/multicursor":["Aggiungi cursore sopra","&&Aggiungi cursore sopra","Aggiungi cursore sotto","A&&ggiungi cursore sotto","Aggiungi cursori a fine riga","Aggiungi c&&ursori a fine riga","Aggiungi cursori alla fine","Aggiungi cursori all'inizio","Aggiungi selezione a risultato ricerca successivo","Aggiungi &&occorrenza successiva","Aggiungi selezione a risultato ricerca precedente","Aggiungi occorrenza &&precedente","Sposta ultima selezione a risultato ricerca successivo","Sposta ultima selezione a risultato ricerca precedente","Seleziona tutte le occorrenze del risultato ricerca","Seleziona &&tutte le occorrenze","Cambia tutte le occorrenze"],"vs/editor/contrib/parameterHints/parameterHints":["Attiva i suggerimenti per i parametri"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Icona per visualizzare il suggerimento del parametro successivo.","Icona per visualizzare il suggerimento del parametro precedente.","{0}, suggerimento"],"vs/editor/contrib/peekView/peekView":["Chiudi","Colore di sfondo dell'area del titolo della visualizzazione rapida.","Colore del titolo della visualizzazione rapida.","Colore delle informazioni del titolo della visualizzazione rapida.","Colore dei bordi e della freccia della visualizzazione rapida.","Colore di sfondo dell'elenco risultati della visualizzazione rapida.","Colore primo piano dei nodi riga nell'elenco risultati della visualizzazione rapida.","Colore primo piano dei nodi file nell'elenco risultati della visualizzazione rapida.","Colore di sfondo della voce selezionata nell'elenco risultati della visualizzazione rapida.","Colore primo piano della voce selezionata nell'elenco risultati della visualizzazione rapida.","Colore di sfondo dell'editor di visualizzazioni rapide.","Colore di sfondo della barra di navigazione nell'editor visualizzazione rapida.","Colore dell'evidenziazione delle corrispondenze nell'elenco risultati della visualizzazione rapida.","Colore dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide.","Bordo dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["Aprire prima un editor di testo per passare a una riga.","Passa a riga {0} e colonna {1}.","Vai alla riga {0}.","Riga corrente: {0}, carattere: {1}. Digitare un numero di riga a cui passare compreso tra 1 e {2}.","Riga corrente: {0}, Carattere: {1}. Digitare un numero di riga a cui passare."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["Per passare a un simbolo, aprire prima un editor di testo con informazioni sui simboli.","L'editor di testo attivo non fornisce informazioni sui simboli.","Non ci sono simboli dell'editor corrispondenti","Non ci sono simboli dell'editor","Apri lateralmente","Apri in basso","simboli ({0})","propriet\xE0 ({0})","metodi ({0})","funzioni ({0})","costruttori ({0})","variabili ({0})","classi ({0})","struct ({0})","eventi ({0})","operatori ({0})","interfacce ({0})","spazi dei nomi ({0})","pacchetti ({0})","parametri di tipo ({0})","moduli ({0})","propriet\xE0 ({0})","enumerazioni ({0})","membri di enumerazione ({0})","stringhe ({0})","file ({0})","matrici ({0})","numeri ({0})","valori booleani ({0})","oggetti ({0})","chiavi ({0})","campi ({0})","costanti ({0})"],"vs/editor/contrib/rename/rename":["Nessun risultato.","Si \xE8 verificato un errore sconosciuto durante la risoluzione del percorso di ridenominazione","Ridenominazione di '{0}'","Ridenominazione di {0}","Correttamente rinominato '{0}' in '{1}'. Sommario: {2}","La ridenominazione non \xE8 riuscita ad applicare le modifiche","La ridenominazione non \xE8 riuscita a calcolare le modifiche","Rinomina simbolo","Abilita/Disabilita l'opzione per visualizzare le modifiche in anteprima prima della ridenominazione"],"vs/editor/contrib/rename/renameInputField":["Consente di rinominare l'input. Digitare il nuovo nome e premere INVIO per eseguire il commit.","{0} per rinominare, {1} per visualizzare in anteprima"],"vs/editor/contrib/smartSelect/smartSelect":["Espandi selezione","Espan&&di selezione","Riduci selezione","&&Riduci selezione"],"vs/editor/contrib/snippet/snippetVariables":["Domenica","Luned\xEC","Marted\xEC","Mercoled\xEC","Gioved\xEC","Venerd\xEC","Sabato","Dom","Lun","Mar","Mer","Gio","Ven","Sab","Gennaio","Febbraio","Marzo","Aprile","Mag","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre","Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],"vs/editor/contrib/suggest/suggestController":["In seguito all'accettazione di '{0}' sono state apportate altre {1} modifiche","Attiva suggerimento","Inserisci","Inserisci","Sostituisci","Sostituisci","Inserisci","nascondi dettagli","mostra dettagli","Reimposta le dimensioni del widget dei suggerimenti"],"vs/editor/contrib/suggest/suggestWidget":["Colore di sfondo del widget dei suggerimenti.","Colore del bordo del widget dei suggerimenti.","Colore primo piano del widget dei suggerimenti.","Colore di sfondo della voce selezionata del widget dei suggerimenti.","Colore delle evidenziazioni corrispondenze nel widget dei suggerimenti.","Caricamento...","Non ci sono suggerimenti.","{0}, documenti: {1}","Suggerisci"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Chiudi","Caricamento..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Icona per visualizzare altre informazioni nel widget dei suggerimenti.","Altre informazioni"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["Colore primo piano per i simboli di matrice. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli booleani. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di classe. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di colore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di costante. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di costruttore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di enumeratore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di membro di enumeratore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di evento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di campo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di file. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di cartella. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di funzione. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di interfaccia. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di chiave. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di parola chiave. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di metodo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di modulo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di spazio dei nomi. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli Null. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli numerici. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di oggetto. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di operatore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di pacchetto. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di propriet\xE0. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di riferimento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di frammento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di stringa. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di struct. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di testo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di parametro di tipo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di unit\xE0. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di variabile. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Attiva/Disattiva l'uso di TAB per spostare lo stato attivo","Se si preme TAB, lo stato attivo verr\xE0 spostato sull'elemento con stato attivabile successivo.","Se si preme TAB, verr\xE0 inserito il carattere di tabulazione"],"vs/editor/contrib/tokenization/tokenization":["Sviluppatore: Forza retokenizzazione"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Caratteri di terminazione di riga insoliti","Sono stati rilevati caratteri di terminazione di riga insoliti","Questo file contiene uno o pi\xF9 caratteri di terminazione di riga insoliti, come separatore di riga (LS) o separatore di paragrafo (PS).\r\n\r\n\xC8 consigliabile rimuoverli dal file. \xC8 possibile configurare questa opzione tramite `editor.unusualLineTerminators`.","Correggi questo file","Ignora il problema per questo file"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Colore di sfondo di un simbolo durante l'accesso in lettura, ad esempio durante la lettura di una variabile. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo di un simbolo durante l'accesso in scrittura, ad esempio durante la scrittura in una variabile. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo di un simbolo durante l'accesso in lettura, ad esempio durante la lettura di una variabile.","Colore del bordo di un simbolo durante l'accesso in scrittura, ad esempio durante la scrittura in una variabile.","Colore del marcatore del righello delle annotazioni per le evidenziazioni dei simboli. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per le evidenziazioni dei simboli di accesso in scrittura. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Vai al prossimo simbolo evidenziato","Vai al precedente simbolo evidenziato","Attiva/disattiva evidenziazione simbolo"],"vs/editor/contrib/wordOperations/wordOperations":["Elimina parola"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Override configurazione predefinita del linguaggio","Consente di configurare le impostazioni dell'editor di cui eseguire l'override per un linguaggio.","Questa impostazione non supporta la configurazione per lingua.","Non \xE8 possibile registrare una propriet\xE0 vuota","Non \xE8 possibile registrare '{0}'. Corrisponde al criterio di propriet\xE0 '\\\\[.*\\\\]$' per la descrizione delle impostazioni dell'editor specifiche del linguaggio. Usare il contributo 'configurationDefaults'.","Non \xE8 possibile registrare '{0}'. Questa propriet\xE0 \xE8 gi\xE0 registrata."],"vs/platform/contextkey/browser/contextKeyService":["Comando che restituisce informazioni sulle chiavi di contesto"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["\xC8 stato premuto ({0}). In attesa del secondo tasto...","La combinazione di tasti ({0}, {1}) non \xE8 un comando."],"vs/platform/list/browser/listService":["Workbench","Rappresenta il tasto 'Control' in Windows e Linux e il tasto 'Comando' in macOS.","Rappresenta il tasto 'Alt' in Windows e Linux e il tasto 'Opzione' in macOS.","Il modificatore da utilizzare per aggiungere un elemento di alberi e liste ad una selezione multipla con il mouse (ad esempio in Esplora Risorse, apre gli editor e le viste scm). Le gesture del mouse 'Apri a lato' - se supportate - si adatteranno in modo da non creare conflitti con il modificatore di selezione multipla.","Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.","Controlla se elenchi e alberi supportano lo scorrimento orizzontale nell'area di lavoro. Avviso: l'attivazione di questa impostazione pu\xF2 influire sulle prestazioni.","Controlla il rientro dell'albero in pixel.","Controlla se l'albero deve eseguire il rendering delle guide per i rientri.","Controlla se elenchi e alberi prevedono lo scorrimento uniforme.","Con lo stile di spostamento da tastiera simple lo stato attivo si trova sugli elementi che corrispondono all'input da tastiera. L'abbinamento viene effettuato solo in base ai prefissi.","Con lo stile di spostamento da tastiera highlight vengono evidenziati gli elementi corrispondenti all'input da tastiera. Spostandosi ulteriormente verso l'alto o verso il basso ci si sposter\xE0 solo negli elementi evidenziati.","Con lo stile di spostamento da tastiera filter verranno filtrati e nascosti tutti gli elementi che non corrispondono all'input da tastiera.","Controlla lo stile di spostamento da tastiera per elenchi e alberi nel workbench. Le opzioni sono: simple, highlight e filter.","Controlla se gli spostamenti da tastiera per elenchi e alberi vengono attivati semplicemente premendo un tasto. Se \xE8 impostato su `false`, gli spostamenti da tastiera vengono attivati solo durante l'esecuzione del comando `list.toggleKeyboardNavigation`, al quale \xE8 possibile assegnare un tasto di scelta rapida.","Controlla l'espansione delle cartelle di alberi quando si fa clic sui nomi delle cartelle. Tenere presente che alcuni alberi ed elenchi potrebbero scegliere di ignorare questa impostazione se non \xE8 applicabile."],"vs/platform/markers/common/markers":["Errore","Avviso","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","usate di recente","altri comandi","Il comando '{0}' ha restituito un errore ({1})"],"vs/platform/quickinput/browser/helpQuickAccess":["comandi globali","comandi dell'editor","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Colore primo piano generale. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Colore primo piano globale per i messaggi di errore. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Colore predefinito per le icone nel workbench.","Colore del bordo globale per gli elementi evidenziati. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Un bordo supplementare attorno agli elementi per contrastarli maggiormente rispetto agli altri.","Un bordo supplementare intorno agli elementi attivi per contrastarli maggiormente rispetto agli altri.","Colore primo piano dei link nel testo.","Colore di sfondo per i blocchi di codice nel testo.","Colore ombreggiatura dei widget, ad es. Trova/Sostituisci all'interno dell'editor.","Sfondo della casella di input.","Primo piano della casella di input.","Bordo della casella di input.","Colore del bordo di opzioni attivate nei campi di input.","Colore di sfondo di opzioni attivate nei campi di input.","Colore primo piano di opzioni attivate nei campi di input.","Colore di sfondo di convalida dell'input di tipo Informazione.","Colore primo piano di convalida dell'input di tipo Informazione.","Colore del bordo della convalida dell'input di tipo Informazione.","Colore di sfondo di convalida dell'input di tipo Avviso.","Colore primo piano di convalida dell'input di tipo Avviso.","Colore del bordo della convalida dell'input di tipo Avviso.","Colore di sfondo di convalida dell'input di tipo Errore.","Colore primo piano di convalida dell'input di tipo Errore.","Colore del bordo della convalida dell'input di tipo Errore.","Sfondo dell'elenco a discesa.","Primo piano dell'elenco a discesa.","Colore primo piano del pulsante.","Colore di sfondo del pulsante.","Colore di sfondo del pulsante al passaggio del mouse.","Colore di sfondo del badge. I badge sono piccole etichette informative, ad esempio per mostrare il conteggio dei risultati della ricerca.","Colore primo piano del badge. I badge sono piccole etichette informative, ad esempio per mostrare il conteggio dei risultati di una ricerca.","Ombra della barra di scorrimento per indicare lo scorrimento della visualizzazione.","Colore di sfondo del cursore della barra di scorrimento.","Colore di sfondo del cursore della barra di scorrimento al passaggio del mouse.","Colore di sfondo del cursore della barra di scorrimento quando si fa clic con il mouse.","Colore di sfondo dell'indicatore di stato che pu\xF2 essere mostrato per operazioni a esecuzione prolungata.","Colore di sfondo del testo dell'errore nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di errore nell'editor.","Colore del bordo delle caselle di errore nell'editor.","Colore di sfondo del testo dell'avviso nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di avviso nell'editor.","Colore del bordo delle caselle di avviso nell'editor.","Colore di sfondo del testo delle informazioni nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di informazioni nell'editor.","Colore del bordo delle caselle informative nell'editor.","Colore primo piano degli indicatori di suggerimento nell'editor.","Colore del bordo delle caselle dei suggerimenti nell'editor.","Colore di sfondo dell'editor.","Colore primo piano predefinito dell'editor.","Colore di sfondo dei widget dell'editor, ad esempio Trova/Sostituisci.","Colore primo piano dei widget dell'editor, ad esempio Trova/Sostituisci.","Colore del bordo dei widget dell'editor. Il colore viene usato solo se il widget sceglie di avere un bordo e se il colore non \xE8 sottoposto a override da un widget.","Colore del bordo della barra di ridimensionamento dei widget dell'editor. Il colore viene usato solo se il widget sceglie di avere un bordo di ridimensionamento e se il colore non \xE8 sostituito da quello di un widget.","Colore di sfondo di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore primo piano di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore di sfondo del titolo di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore di sfondo di Selezione rapida per l'elemento con lo stato attivo.","Colore di selezione rapida per il raggruppamento delle etichette.","Colore di selezione rapida per il raggruppamento dei bordi.","Colore della selezione dell'editor.","Colore del testo selezionato per il contrasto elevato.","Colore della selezione in un editor inattivo. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore delle aree con lo stesso contenuto della selezione. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo delle regioni con lo stesso contenuto della selezione.","Colore della corrispondenza di ricerca corrente.","Colore degli altri risultati della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore dell'intervallo di limite della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo della corrispondenza della ricerca corrente.","Colore del bordo delle altre corrispondenze della ricerca.","Colore del bordo dell'intervallo che limita la ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Evidenziazione sotto la parola per cui \xE8 visualizzata un'area sensibile al passaggio del mouse. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.","Colore primo piano dell'area sensibile al passaggio del mouse dell'editor.","Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.","Colore di sfondo della barra di stato sensibile al passaggio del mouse dell'editor.","Colore dei collegamenti attivi.","Colore primo piano dei suggerimenti inline","Colore di sfondo dei suggerimenti inline","Colore usato per l'icona delle azioni con lampadina.","Colore usato per l'icona delle azioni di correzione automatica con lampadina.","Colore di sfondo per il testo che \xE8 stato inserito. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo per il testo che \xE8 stato rimosso. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del contorno del testo che \xE8 stato inserito.","Colore del contorno del testo che \xE8 stato rimosso.","Colore del bordo tra due editor di testo.","Colore del riempimento diagonale dell'editor diff. Il riempimento diagonale viene usato nelle visualizzazioni diff affiancate.","Colore di sfondo dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore del contorno dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, uno inattivo no.","Colore del contorno dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Sfondo dell'elenco/albero al passaggio del mouse sugli elementi.","Primo piano dell'elenco/albero al passaggio del mouse sugli elementi.","Sfondo dell'elenco/albero durante il trascinamento degli elementi selezionati.","Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.","Colore di sfondo del widget del filtro per tipo in elenchi e alberi.","Colore del contorno del widget del filtro per tipo in elenchi e alberi.","Colore del contorno del widget del filtro per tipo in elenchi e alberi quando non sono presenti corrispondenze.","Colore del tratto dell'albero per le guide per i rientri.","Colore del tratto dell'albero per le guide per i rientri.","Colore del bordo del menu.","Colore primo piano delle voci di menu.","Colore di sfondo delle voci di menu.","Colore primo piano della voce di menu selezionata nei menu.","Colore di sfondo della voce di menu selezionata nei menu.","Colore del bordo della voce di menu selezionata nei menu.","Colore di un elemento separatore delle voci di menu.","Colore di sfondo dell'evidenziazione della tabulazione di un frammento.","Colore del bordo dell'evidenziazione della tabulazione di un frammento.","Colore di sfondo dell'evidenziazione della tabulazione finale di un frammento.","Colore del bordo dell'evidenziazione della tabulazione finale di un frammento.","Colore del marcatore del righello delle annotazioni per la ricerca di corrispondenze. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per le evidenziazioni delle selezioni. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore della minimappa per la ricerca delle corrispondenze.","Colore del marcatore della minimappa per la selezione dell'editor.","Colore del marcatore della minimappa per gli errori.","Colore del marcatore della minimappa per gli avvisi.","Colore di sfondo della minimappa.","Colore di sfondo del dispositivo di scorrimento della minimappa.","Colore di sfondo del dispositivo di scorrimento della minimappa al passaggio del mouse.","Colore di sfondo del dispositivo di scorrimento della minimappa quando si fa clic con il mouse.","Colore usato per l'icona di errore dei problemi.","Colore usato per l'icona di avviso dei problemi.","Colore usato per l'icona informazioni dei problemi."],"vs/platform/theme/common/iconRegistry":["ID del tipo di carattere da usare. Se non \xE8 impostato, viene usato il tipo di carattere definito per primo.","Tipo di carattere associato alla definizione di icona.","Icona dell'azione di chiusura nei widget."],"vs/platform/undoRedo/common/undoRedoService":["I file seguenti sono stati chiusi e modificati nel disco: {0}.","I file seguenti sono stati modificati in modo incompatibile: {0}.","Non \xE8 stato possibile annullare '{0}' in tutti i file. {1}","Non \xE8 stato possibile annullare '{0}' in tutti i file. {1}","Non \xE8 stato possibile annullare '{0}' in tutti i file perch\xE9 sono state apportate modifiche a {1}","Non \xE8 stato possibile annullare '{0}' su tutti i file perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione su {1}","Non \xE8 stato possibile annullare '{0}' su tutti i file perch\xE9 nel frattempo \xE8 stata eseguita un'operazione di annullamento o ripetizione","Annullare '{0}' in tutti i file?","Annulla in {0} file","Annulla questo file","Annulla","Non \xE8 stato possibile annullare '{0}' perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione.","Annullare '{0}'?","Annulla","Annulla","Non \xE8 stato possibile ripetere '{0}' in tutti i file. {1}","Non \xE8 stato possibile ripetere '{0}' in tutti i file. {1}","Non \xE8 stato possibile ripetere '{0}' in tutti i file perch\xE9 sono state apportate modifiche a {1}","Non \xE8 stato possibile ripetere l'operazione '{0}' su tutti i file perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione sull'elenco di file {1}","Non \xE8 stato possibile ripetere '{0}' su tutti i file perch\xE9 nel frattempo \xE8 stata eseguita un'operazione di annullamento o ripetizione","Non \xE8 stato possibile ripetere '{0}' perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione."]}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js new file mode 100644 index 0000000000..009489ce5f --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ja",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u5165\u529B"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\u5927\u6587\u5B57\u3068\u5C0F\u6587\u5B57\u3092\u533A\u5225\u3059\u308B","\u5358\u8A9E\u5358\u4F4D\u3067\u691C\u7D22\u3059\u308B","\u6B63\u898F\u8868\u73FE\u3092\u4F7F\u7528\u3059\u308B"],"vs/base/browser/ui/findinput/replaceInput":["\u5165\u529B","\u4FDD\u6301\u3059\u308B"],"vs/base/browser/ui/iconLabel/iconLabel":["\u8AAD\u307F\u8FBC\u307F\u4E2D..."],"vs/base/browser/ui/inputbox/inputBox":["\u30A8\u30E9\u30FC: {0}","\u8B66\u544A: {0}","\u60C5\u5831: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u30D0\u30A4\u30F3\u30C9\u306A\u3057"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["\u30AF\u30EA\u30A2","\u578B\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u7121\u52B9\u306B\u3059\u308B","\u578B\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u6709\u52B9\u306B\u3059\u308B","\u8981\u7D20\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","{1} \u500B\u306E\u8981\u7D20\u306E\u3046\u3061 {0} \u500B\u306E\u8981\u7D20\u304C\u4E00\u81F4\u3057\u307E\u3057\u305F"],"vs/base/common/actions":["(\u7A7A)"],"vs/base/common/errorMessage":["{0}: {1}","\u30B7\u30B9\u30C6\u30E0 \u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F ({0})","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","{0} (\u5408\u8A08 {1} \u30A8\u30E9\u30FC)","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","Super","Control","Shift","Alt","\u30B3\u30DE\u30F3\u30C9","Control","Shift","Alt","Windows","Control","Shift","Alt","Super"],"vs/base/parts/quickinput/browser/quickInput":["\u623B\u308B","{0}/{1}","\u5165\u529B\u3059\u308B\u3068\u7D50\u679C\u304C\u7D5E\u308A\u8FBC\u307E\u308C\u307E\u3059\u3002","{0} \u4EF6\u306E\u7D50\u679C","{0} \u500B\u9078\u629E\u6E08\u307F","OK","\u30AB\u30B9\u30BF\u30E0","\u623B\u308B ({0})","\u623B\u308B"],"vs/base/parts/quickinput/browser/quickInputList":["\u30AF\u30A4\u30C3\u30AF\u5165\u529B"],"vs/editor/browser/controller/coreCommands":["\u9577\u3044\u884C\u306B\u79FB\u52D5\u3057\u3066\u3082\u884C\u672B\u306B\u4F4D\u7F6E\u3057\u307E\u3059","\u9577\u3044\u884C\u306B\u79FB\u52D5\u3057\u3066\u3082\u884C\u672B\u306B\u4F4D\u7F6E\u3057\u307E\u3059"],"vs/editor/browser/controller/textAreaHandler":["\u30A8\u30C7\u30A3\u30BF\u30FC","\u3053\u306E\u6642\u70B9\u3067\u306F\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u307E\u305B\u3093\u3002\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3059\u308B\u306B\u306F\u3001{0} \u3092\u62BC\u3057\u307E\u3059\u3002"],"vs/editor/browser/core/keybindingCancellation":["\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u53D6\u308A\u6D88\u3057\u53EF\u80FD\u306A\u64CD\u4F5C ('\u53C2\u7167\u3092\u3053\u3053\u306B\u8868\u793A' \u306A\u3069) \u3092\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B"],"vs/editor/browser/editorExtensions":["\u5143\u306B\u623B\u3059(&&U)","\u5143\u306B\u623B\u3059","\u3084\u308A\u76F4\u3057(&&R)","\u3084\u308A\u76F4\u3057","\u3059\u3079\u3066\u9078\u629E(&&S)","\u3059\u3079\u3066\u3092\u9078\u629E"],"vs/editor/browser/widget/codeEditorWidget":["\u30AB\u30FC\u30BD\u30EB\u306E\u6570\u306F {0} \u500B\u306B\u5236\u9650\u3055\u308C\u3066\u3044\u307E\u3059\u3002"],"vs/editor/browser/widget/diffEditorWidget":["\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u633F\u5165\u3092\u793A\u3059\u7DDA\u306E\u88C5\u98FE\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u524A\u9664\u3092\u793A\u3059\u7DDA\u306E\u88C5\u98FE\u3002","\u4E00\u65B9\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u308B\u305F\u3081\u3001\u30D5\u30A1\u30A4\u30EB\u3092\u6BD4\u8F03\u3067\u304D\u307E\u305B\u3093\u3002"],"vs/editor/browser/widget/diffReview":["\u5DEE\u5206\u30EC\u30D3\u30E5\u30FC\u3067\u306E '\u633F\u5165' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u5DEE\u5206\u30EC\u30D3\u30E5\u30FC\u3067\u306E '\u524A\u9664' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u5DEE\u5206\u30EC\u30D3\u30E5\u30FC\u3067\u306E '\u9589\u3058\u308B' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u9589\u3058\u308B","\u5909\u66F4\u3055\u308C\u305F\u884C\u306F\u3042\u308A\u307E\u305B\u3093","1 \u884C\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F","{0} \u884C\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F","\u76F8\u9055 {0}/{1}: \u5143\u306E\u884C {2}\u3001{3}\u3002\u5909\u66F4\u3055\u308C\u305F\u884C {4}\u3001{5}","\u7A7A\u767D","{0} \u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u884C {1}","{0} \u5143\u306E\u884C {1} \u5909\u66F4\u3055\u308C\u305F\u884C {2}","+ {0} \u5909\u66F4\u3055\u308C\u305F\u884C {1}","- {0} \u5143\u306E\u884C {1}","\u6B21\u306E\u5DEE\u5206\u306B\u79FB\u52D5","\u524D\u306E\u5DEE\u5206\u306B\u79FB\u52D5"],"vs/editor/browser/widget/inlineDiffMargin":["\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC ({0})","\u3053\u306E\u5909\u66F4\u3092\u5143\u306B\u623B\u3059","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC ({0})"],"vs/editor/common/config/commonEditorConfig":["\u30A8\u30C7\u30A3\u30BF\u30FC","1 \u3064\u306E\u30BF\u30D6\u306B\u76F8\u5F53\u3059\u308B\u30B9\u30DA\u30FC\u30B9\u306E\u6570\u3002`#editor.detectIndentation#` \u304C\u30AA\u30F3\u306E\u5834\u5408\u3001\u3053\u306E\u8A2D\u5B9A\u306F\u30D5\u30A1\u30A4\u30EB \u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u57FA\u3065\u3044\u3066\u4E0A\u66F8\u304D\u3055\u308C\u307E\u3059\u3002","`Tab` \u30AD\u30FC\u3092\u62BC\u3059\u3068\u30B9\u30DA\u30FC\u30B9\u304C\u633F\u5165\u3055\u308C\u307E\u3059\u3002`#editor.detectIndentation#` \u304C\u30AA\u30F3\u306E\u5834\u5408\u3001\u3053\u306E\u8A2D\u5B9A\u306F\u30D5\u30A1\u30A4\u30EB \u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u57FA\u3065\u3044\u3066\u4E0A\u66F8\u304D\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u304C\u30D5\u30A1\u30A4\u30EB\u306E\u5185\u5BB9\u306B\u57FA\u3065\u3044\u3066\u958B\u304B\u308C\u308B\u5834\u5408\u3001`#editor.tabSize#` \u3068 `#editor.insertSpaces#` \u3092\u81EA\u52D5\u7684\u306B\u691C\u51FA\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u81EA\u52D5\u633F\u5165\u3055\u308C\u305F\u672B\u5C3E\u306E\u7A7A\u767D\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u5927\u304D\u306A\u30D5\u30A1\u30A4\u30EB\u3067\u30E1\u30E2\u30EA\u304C\u96C6\u4E2D\u3059\u308B\u7279\u5B9A\u306E\u6A5F\u80FD\u3092\u7121\u52B9\u306B\u3059\u308B\u305F\u3081\u306E\u7279\u5225\u306A\u51E6\u7406\u3002","\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5185\u306E\u5358\u8A9E\u306B\u57FA\u3065\u3044\u3066\u5165\u529B\u5019\u88DC\u3092\u8A08\u7B97\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u306E\u307F\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u540C\u3058\u8A00\u8A9E\u306E\u958B\u3044\u3066\u3044\u308B\u3059\u3079\u3066\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u958B\u3044\u3066\u3044\u308B\u3059\u3079\u3066\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u5358\u8A9E\u30D9\u30FC\u30B9\u306E\u88DC\u5B8C\u304C\u8A08\u7B97\u3055\u308C\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u304C\u3059\u3079\u3066\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306B\u3064\u3044\u3066\u6709\u52B9\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u304C\u3059\u3079\u3066\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306B\u3064\u3044\u3066\u7121\u52B9\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u306F\u3001\u73FE\u5728\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306E 'semanticHighlighting' \u8A2D\u5B9A\u306B\u3088\u3063\u3066\u69CB\u6210\u3055\u308C\u3066\u3044\u307E\u3059\u3002","semanticHighlighting \u3092\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u308B\u8A00\u8A9E\u3067\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u304B\u3001`Escape` \u30AD\u30FC\u3092\u62BC\u3057\u3066\u3082\u3001\u30D4\u30FC\u30AF \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u3044\u305F\u307E\u307E\u306B\u3057\u307E\u3059\u3002","\u3053\u306E\u9577\u3055\u3092\u8D8A\u3048\u308B\u884C\u306F\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u4E0A\u306E\u7406\u7531\u306B\u3088\u308A\u30C8\u30FC\u30AF\u30F3\u5316\u3055\u308C\u307E\u305B\u3093\u3002","\u5DEE\u5206\u8A08\u7B97\u304C\u53D6\u308A\u6D88\u3055\u308C\u305F\u5F8C\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 (\u30DF\u30EA\u79D2\u5358\u4F4D)\u3002\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u306A\u3057\u306B\u306F 0 \u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u5DEE\u5206\u3092\u6A2A\u306B\u4E26\u3079\u3066\u8868\u793A\u3059\u308B\u304B\u3001\u884C\u5185\u306B\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u5148\u982D\u307E\u305F\u306F\u672B\u5C3E\u306E\u7A7A\u767D\u6587\u5B57\u306E\u5909\u66F4\u3092\u7121\u8996\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u8FFD\u52A0/\u524A\u9664\u3055\u308C\u305F\u5909\u66F4\u306B +/- \u30A4\u30F3\u30B8\u30B1\u30FC\u30BF\u30FC\u3092\u793A\u3059\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 CodeLens \u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u305B\u3093\u3002","\u884C\u3092\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u306E\u5E45\u3067\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u884C\u306F\u3001`#editor.wordWrap#` \u8A2D\u5B9A\u306B\u5F93\u3063\u3066\u6298\u308A\u8FD4\u3055\u308C\u307E\u3059\u3002"],"vs/editor/common/config/editorOptions":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u304C\u3044\u3064\u63A5\u7D9A\u3055\u308C\u305F\u304B\u3092\u691C\u51FA\u3059\u308B\u305F\u3081\u306B\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0 API \u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u6C38\u7D9A\u7684\u306B\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u306E\u4F7F\u7528\u5411\u3051\u306B\u6700\u9069\u5316\u3055\u308C\u307E\u3059\u3002\u5358\u8A9E\u306E\u6298\u308A\u8FD4\u3057\u306F\u7121\u52B9\u306B\u306A\u308A\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u5411\u3051\u306B\u6700\u9069\u5316\u3055\u308C\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u306B\u6700\u9069\u5316\u3055\u308C\u305F\u30E2\u30FC\u30C9\u3067\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30AA\u30F3\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u5358\u8A9E\u306E\u6298\u308A\u8FD4\u3057\u304C\u7121\u52B9\u306B\u306A\u308A\u307E\u3059\u3002","\u30B3\u30E1\u30F3\u30C8\u6642\u306B\u7A7A\u767D\u6587\u5B57\u3092\u633F\u5165\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u8FFD\u52A0\u307E\u305F\u306F\u524A\u9664\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u5207\u308A\u66FF\u3048\u3067\u3001\u7A7A\u306E\u884C\u3092\u7121\u8996\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u9078\u629E\u7BC4\u56F2\u3092\u6307\u5B9A\u3057\u306A\u3044\u3067\u30B3\u30D4\u30FC\u3059\u308B\u5834\u5408\u306B\u73FE\u5728\u306E\u884C\u3092\u30B3\u30D4\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5165\u529B\u4E2D\u306B\u4E00\u81F4\u3092\u691C\u7D22\u3059\u308B\u305F\u3081\u306B\u30AB\u30FC\u30BD\u30EB\u3092\u30B8\u30E3\u30F3\u30D7\u3055\u305B\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u304B\u3089\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E\u691C\u7D22\u6587\u5B57\u5217\u3092\u4E0E\u3048\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3057\u306A\u3044 (\u65E2\u5B9A)","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u5E38\u306B\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3059\u308B","\u8907\u6570\u884C\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u3001\u81EA\u52D5\u7684\u306B [\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u30AA\u30F3\u306B\u3057\u307E\u3059\u3002","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3059\u308B\u6761\u4EF6\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","macOS \u3067\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u5171\u6709\u306E\u691C\u7D22\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3092\u8AAD\u307F\u53D6\u308A\u307E\u305F\u306F\u5909\u66F4\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0A\u306B\u884C\u3092\u3055\u3089\u306B\u8FFD\u52A0\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002true \u306E\u5834\u5408\u3001\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u3068\u304D\u306B\u6700\u521D\u306E\u884C\u3092\u8D85\u3048\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3067\u304D\u307E\u3059\u3002","\u4EE5\u964D\u3067\u4E00\u81F4\u304C\u898B\u3064\u304B\u3089\u306A\u3044\u5834\u5408\u306B\u3001\u691C\u7D22\u3092\u5148\u982D\u304B\u3089 (\u307E\u305F\u306F\u672B\u5C3E\u304B\u3089) \u81EA\u52D5\u7684\u306B\u518D\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8\u306E\u5408\u5B57 ('calt' \u304A\u3088\u3073 'liga' \u30D5\u30A9\u30F3\u30C8\u306E\u6A5F\u80FD) \u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002'font-feature-settings' CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u8A73\u7D30\u306B\u5236\u5FA1\u3059\u308B\u306B\u306F\u3001\u3053\u308C\u3092\u6587\u5B57\u5217\u306B\u5909\u66F4\u3057\u307E\u3059\u3002","\u660E\u793A\u7684\u306A 'font-feature-settings' CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u3002\u5408\u5B57\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u306E\u304C 1 \u3064\u3060\u3051\u3067\u3042\u308B\u5834\u5408\u306F\u3001\u4EE3\u308F\u308A\u306B\u30D6\u30FC\u30EB\u5024\u3092\u6E21\u3059\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8\u306E\u5408\u5B57\u3084\u30D5\u30A9\u30F3\u30C8\u306E\u6A5F\u80FD\u3092\u69CB\u6210\u3057\u307E\u3059\u3002\u5408\u5B57\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B\u30D6\u30FC\u30EB\u5024\u307E\u305F\u306F CSS 'font-feature-settings' \u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u5024\u306E\u6587\u5B57\u5217\u3092\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA (\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002",'\u4F7F\u7528\u3067\u304D\u308B\u306E\u306F "\u6A19\u6E96" \u304A\u3088\u3073 "\u592A\u5B57" \u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u307E\u305F\u306F 1 \uFF5E 1000 \u306E\u6570\u5B57\u306E\u307F\u3067\u3059\u3002','\u30D5\u30A9\u30F3\u30C8\u306E\u592A\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002"\u6A19\u6E96" \u304A\u3088\u3073 "\u592A\u5B57" \u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u307E\u305F\u306F 1 \uFF5E 1000 \u306E\u6570\u5B57\u3092\u53D7\u3051\u5165\u308C\u307E\u3059\u3002',"\u7D50\u679C\u306E\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u3092\u8868\u793A (\u65E2\u5B9A)","\u4E3B\u306A\u7D50\u679C\u306B\u79FB\u52D5\u3057\u3001\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059","\u30D7\u30E9\u30A4\u30DE\u30EA\u7D50\u679C\u306B\u79FB\u52D5\u3057\u3001\u4ED6\u306E\u30E6\u30FC\u30B6\u30FC\u3078\u306E\u30D4\u30FC\u30AF\u30EC\u30B9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3057\u307E\u3059","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001'editor.editor.gotoLocation.multipleDefinitions' \u3084 'editor.editor.gotoLocation.multipleImplementations' \u306A\u3069\u306E\u500B\u5225\u306E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5B9A\u7FA9\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5BA3\u8A00\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5B9F\u88C5\u306B\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u8907\u6570\u5B58\u5728\u3059\u308B\u5834\u5408\u306E '\u53C2\u7167\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","'\u5B9A\u7FA9\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u5BA3\u8A00\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u5B9F\u88C5\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u53C2\u7167\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DB\u30D0\u30FC\u3092\u8868\u793A\u5F8C\u306E\u5F85\u3061\u6642\u9593 (\u30DF\u30EA\u79D2) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DB\u30D0\u30FC\u306B\u30DE\u30A6\u30B9\u3092\u79FB\u52D5\u3057\u305F\u3068\u304D\u306B\u3001\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3057\u7D9A\u3051\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u96FB\u7403\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002'0' \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001`#editor.fontSize#` \u306E 90% \u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u306E\u9AD8\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u306B\u57FA\u3065\u3044\u3066\u884C\u306E\u9AD8\u3055\u3092\u8A08\u7B97\u3059\u308B\u5834\u5408\u306B\u306F\u30010 \u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u30B5\u30A4\u30BA\u306F\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3068\u540C\u3058\u3067\u3059 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306F\u3001\u5FC5\u8981\u306B\u5FDC\u3058\u3066\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9AD8\u3055\u3092\u57CB\u3081\u308B\u305F\u3081\u3001\u62E1\u5927\u307E\u305F\u306F\u7E2E\u5C0F\u3057\u307E\u3059 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u305B\u3093)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306F\u5FC5\u8981\u306B\u5FDC\u3058\u3066\u7E2E\u5C0F\u3057\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u3088\u308A\u5927\u304D\u304F\u306A\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u305B\u3093)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u30B5\u30A4\u30BA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u3092\u8868\u793A\u3059\u308B\u5834\u6240\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u3092\u8868\u793A\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306B\u63CF\u753B\u3055\u308C\u308B\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u30B9\u30B1\u30FC\u30EB: 1\u30012\u3001\u307E\u305F\u306F 3\u3002","\u884C\u306B\u30AB\u30E9\u30FC \u30D6\u30ED\u30C3\u30AF\u3067\u306F\u306A\u304F\u5B9F\u969B\u306E\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u8868\u793A\u3059\u308B\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u6700\u5927\u5E45\u3092\u7279\u5B9A\u306E\u5217\u6570\u306B\u5236\u9650\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0A\u7AEF\u3068\u6700\u521D\u306E\u884C\u306E\u9593\u306E\u4F59\u767D\u306E\u5927\u304D\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0B\u7AEF\u3068\u6700\u5F8C\u306E\u884C\u306E\u9593\u306E\u4F59\u767D\u306E\u5927\u304D\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5165\u529B\u6642\u306B\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3068\u578B\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8 \u30E1\u30CB\u30E5\u30FC\u3092\u5468\u56DE\u3059\u308B\u304B\u3001\u30EA\u30B9\u30C8\u306E\u6700\u5F8C\u3067\u9589\u3058\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6587\u5B57\u5217\u5185\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30B3\u30E1\u30F3\u30C8\u5185\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u6587\u5B57\u5217\u304A\u3088\u3073\u30B3\u30E1\u30F3\u30C8\u5916\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u5165\u529B\u4E2D\u306B\u5019\u88DC\u3092\u81EA\u52D5\u7684\u306B\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u756A\u53F7\u306F\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u884C\u756A\u53F7\u306F\u3001\u7D76\u5BFE\u5024\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306F\u3001\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u307E\u3067\u306E\u884C\u6570\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306F 10 \u884C\u3054\u3068\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306E\u8868\u793A\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u3053\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30EB\u30FC\u30E9\u30FC\u304C\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3059\u308B\u5358\u4E00\u9818\u57DF\u306E\u6587\u5B57\u6570\u3002","\u3053\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30EB\u30FC\u30E9\u30FC\u306E\u8272\u3067\u3059\u3002","\u7279\u5B9A\u306E\u7B49\u5E45\u6587\u5B57\u6570\u306E\u5F8C\u306B\u5782\u76F4\u30EB\u30FC\u30E9\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u8907\u6570\u306E\u30EB\u30FC\u30E9\u30FC\u306B\u306F\u8907\u6570\u306E\u5024\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u914D\u5217\u304C\u7A7A\u306E\u5834\u5408\u306F\u30EB\u30FC\u30E9\u30FC\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u53F3\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u4E0A\u66F8\u304D\u305B\u305A\u306B\u5019\u88DC\u3092\u633F\u5165\u3057\u307E\u3059\u3002","\u5019\u88DC\u3092\u633F\u5165\u3057\u3001\u30AB\u30FC\u30BD\u30EB\u306E\u53F3\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002","\u5165\u529B\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u3068\u304D\u306B\u5358\u8A9E\u3092\u4E0A\u66F8\u304D\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u3053\u306E\u6A5F\u80FD\u306E\u5229\u7528\u3092\u9078\u629E\u3059\u308B\u62E1\u5F35\u6A5F\u80FD\u306B\u4F9D\u5B58\u3059\u308B\u3053\u3068\u306B\u3054\u6CE8\u610F\u304F\u3060\u3055\u3044\u3002","\u5019\u88DC\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u51E6\u7406\u3068\u4E26\u3073\u66FF\u3048\u3067\u3055\u3055\u3044\u306A\u5165\u529B\u30DF\u30B9\u3092\u8003\u616E\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4E26\u3079\u66FF\u3048\u304C\u30AB\u30FC\u30BD\u30EB\u4ED8\u8FD1\u306B\u8868\u793A\u3055\u308C\u308B\u5358\u8A9E\u3092\u512A\u5148\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4FDD\u5B58\u3055\u308C\u305F\u5019\u88DC\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u8907\u6570\u306E\u30EF\u30FC\u30AF\u30D7\u30EC\u30FC\u30B9\u3068\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u5171\u6709\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059 (`#editor.suggestSelection#` \u304C\u5FC5\u8981)\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6 \u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u9632\u6B62\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u63D0\u6848\u306E\u30A2\u30A4\u30B3\u30F3\u3092\u8868\u793A\u3059\u308B\u304B\u3001\u975E\u8868\u793A\u306B\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u4E0B\u90E8\u306B\u3042\u308B\u30B9\u30C6\u30FC\u30BF\u30B9 \u30D0\u30FC\u306E\u8868\u793A\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u306E\u8A73\u7D30\u3092\u30E9\u30D9\u30EB\u4ED8\u304D\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u3067\u8868\u793A\u3059\u308B\u304B\u3001\u8A73\u7D30\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u306E\u307F\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u5909\u66F4\u304C\u3067\u304D\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001'editor.suggest.showKeywords' \u3084 'editor.suggest.showSnippets' \u306A\u3069\u306E\u500B\u5225\u306E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E1\u30BD\u30C3\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u95A2\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D5\u30A3\u30FC\u30EB\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5909\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30AF\u30E9\u30B9' \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u69CB\u9020\u4F53` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E2\u30B8\u30E5\u30FC\u30EB` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D7\u30ED\u30D1\u30C6\u30A3` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30A4\u30D9\u30F3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u6F14\u7B97\u5B50` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E6\u30CB\u30C3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5024` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5B9A\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5217\u6319\u578B` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `enumMember` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30AD\u30FC\u30EF\u30FC\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30C6\u30AD\u30B9\u30C8' -\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u8272` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30D5\u30A1\u30A4\u30EB' \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u53C2\u7167` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `customcolor` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D5\u30A9\u30EB\u30C0\u30FC` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `typeParameter` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30B9\u30CB\u30DA\u30C3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306A\u5834\u5408\u3001IntelliSense \u306B\u3088\u3063\u3066 '\u30E6\u30FC\u30B6\u30FC' \u5019\u88DC\u304C\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B\u3088\u3063\u3066 '\u554F\u984C' \u5019\u88DC\u304C\u793A\u3055\u308C\u307E\u3059\u3002","\u5148\u982D\u3068\u672B\u5C3E\u306E\u7A7A\u767D\u3092\u5E38\u306B\u9078\u629E\u3059\u308B\u304B\u3069\u3046\u304B\u3002","\u30B3\u30DF\u30C3\u30C8\u6587\u5B57\u3067\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u305F\u3068\u3048\u3070\u3001JavaScript \u3067\u306F\u30BB\u30DF\u30B3\u30ED\u30F3 (`;`) \u3092\u30B3\u30DF\u30C3\u30C8\u6587\u5B57\u306B\u3057\u3066\u3001\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u3066\u305D\u306E\u6587\u5B57\u3092\u5165\u529B\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30C6\u30AD\u30B9\u30C8\u306E\u5909\u66F4\u3092\u884C\u3046\u3068\u304D\u3001`Enter` \u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u306B\u306E\u307F\u5019\u88DC\u3092\u53D7\u3051\u4ED8\u3051\u307E\u3059\u3002","`Tab` \u30AD\u30FC\u306B\u52A0\u3048\u3066 `Enter` \u30AD\u30FC\u3067\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u6539\u884C\u306E\u633F\u5165\u3084\u5019\u88DC\u306E\u53CD\u6620\u306E\u9593\u3067\u3042\u3044\u307E\u3044\u3055\u3092\u89E3\u6D88\u3059\u308B\u306E\u306B\u5F79\u7ACB\u3061\u307E\u3059\u3002","\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u8AAD\u307F\u4E0A\u3052\u308B\u3053\u3068\u304C\u3067\u304D\u308B\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u884C\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u8B66\u544A: \u65E2\u5B9A\u5024\u3092\u4E0A\u56DE\u308B\u6570\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u306B\u5F71\u97FF\u3092\u4E0E\u3048\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4","\u8A00\u8A9E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u3044\u3064\u304B\u3063\u3053\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u304B\u6C7A\u5B9A\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u7A7A\u767D\u6587\u5B57\u306E\u5DE6\u306B\u3042\u308B\u3068\u304D\u3060\u3051\u3001\u304B\u3063\u3053\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5DE6\u89D2\u304B\u3063\u3053\u3092\u8FFD\u52A0\u3057\u305F\u5F8C\u306B\u81EA\u52D5\u7684\u306B\u53F3\u89D2\u304B\u3063\u3053\u3092\u633F\u5165\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u7D42\u308F\u308A\u5F15\u7528\u7B26\u307E\u305F\u306F\u62EC\u5F27\u304C\u81EA\u52D5\u7684\u306B\u633F\u5165\u3055\u308C\u305F\u5834\u5408\u306B\u306E\u307F\u3001\u305D\u308C\u3089\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7D42\u308F\u308A\u5F15\u7528\u7B26\u307E\u305F\u306F\u62EC\u5F27\u3092\u4E0A\u66F8\u304D\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u3044\u3064\u5F15\u7528\u7B26\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u304B\u6C7A\u5B9A\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u7A7A\u767D\u6587\u5B57\u306E\u5DE6\u306B\u3042\u308B\u3068\u304D\u3060\u3051\u3001\u5F15\u7528\u7B26\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3059\u3002","\u30E6\u30FC\u30B6\u30FC\u304C\u958B\u59CB\u5F15\u7528\u7B26\u3092\u8FFD\u52A0\u3057\u305F\u5F8C\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u81EA\u52D5\u7684\u306B\u5F15\u7528\u7B26\u3092\u9589\u3058\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u81EA\u52D5\u7684\u306B\u633F\u5165\u3057\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u7279\u5225\u306A onEnterRules \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u7279\u5225\u306A onEnterRules \u3092\u547C\u3073\u51FA\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F indentationRules \u3092\u512A\u5148\u3057\u307E\u3059\u3002","\u30E6\u30FC\u30B6\u30FC\u304C\u884C\u3092\u5165\u529B\u3001\u8CBC\u308A\u4ED8\u3051\u3001\u79FB\u52D5\u3001\u307E\u305F\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u3059\u308B\u3068\u304D\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u81EA\u52D5\u7684\u306B\u8ABF\u6574\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u69CB\u6210\u3092\u4F7F\u7528\u3057\u3066\u3001\u9078\u629E\u7BC4\u56F2\u3092\u3044\u3064\u81EA\u52D5\u7684\u306B\u56F2\u3080\u304B\u3092\u5224\u65AD\u3057\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053\u3067\u306F\u306A\u304F\u3001\u5F15\u7528\u7B26\u3067\u56F2\u307F\u307E\u3059\u3002","\u5F15\u7528\u7B26\u3067\u306F\u306A\u304F\u3001\u89D2\u304B\u3063\u3053\u3067\u56F2\u307F\u307E\u3059\u3002","\u5F15\u7528\u7B26\u307E\u305F\u306F\u89D2\u304B\u3063\u3053\u3092\u5165\u529B\u3059\u308B\u3068\u304D\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u9078\u629E\u7BC4\u56F2\u3092\u81EA\u52D5\u7684\u306B\u56F2\u3080\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u30B9\u30DA\u30FC\u30B9\u3092\u4F7F\u7528\u3059\u308B\u3068\u304D\u306F\u3001\u30BF\u30D6\u6587\u5B57\u306E\u9078\u629E\u52D5\u4F5C\u3092\u30A8\u30DF\u30E5\u30EC\u30FC\u30C8\u3057\u307E\u3059\u3002\u9078\u629E\u7BC4\u56F2\u306F\u30BF\u30D6\u4F4D\u7F6E\u306B\u7559\u307E\u308A\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 CodeLens \u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","CodeLens \u306E\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","CodeLens \u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D\u3067\u5236\u5FA1\u3057\u307E\u3059\u3002'0' \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001'#editor.fontSize#' \u306E 90% \u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30AB\u30E9\u30FC \u30C7\u30B3\u30EC\u30FC\u30BF\u30FC\u3068\u8272\u306E\u9078\u629E\u3092\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3068\u30AD\u30FC\u3067\u306E\u9078\u629E\u306B\u3088\u308A\u5217\u306E\u9078\u629E\u3092\u5B9F\u884C\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002","\u69CB\u6587\u30CF\u30A4\u30E9\u30A4\u30C8\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u65B9\u5F0F\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6ED1\u3089\u304B\u306A\u30AD\u30E3\u30EC\u30C3\u30C8\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u524D\u5F8C\u306E\u8868\u793A\u53EF\u80FD\u306A\u5148\u982D\u3068\u672B\u5C3E\u306E\u884C\u306E\u6700\u5C0F\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u4ED6\u306E\u4E00\u90E8\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306F 'scrollOff' \u307E\u305F\u306F `scrollOffset` \u3068\u547C\u3070\u308C\u307E\u3059\u3002","`cursorSurroundingLines` \u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u307E\u305F\u306F API \u3067\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u305F\u5834\u5408\u306B\u306E\u307F\u5F37\u5236\u3055\u308C\u307E\u3059\u3002","`cursorSurroundingLines` \u306F\u5E38\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002","'\u30AB\u30FC\u30BD\u30EB\u306E\u5468\u56F2\u306E\u884C' \u3092\u9069\u7528\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`#editor.cursorStyle#` \u304C `line` \u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001\u30AB\u30FC\u30BD\u30EB\u306E\u5E45\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30C9\u30E9\u30C3\u30B0 \u30A2\u30F3\u30C9 \u30C9\u30ED\u30C3\u30D7\u306B\u3088\u308B\u9078\u629E\u7BC4\u56F2\u306E\u79FB\u52D5\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u8A31\u53EF\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`Alt` \u3092\u62BC\u3059\u3068\u3001\u30B9\u30AF\u30ED\u30FC\u30EB\u901F\u5EA6\u304C\u500D\u5897\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30B3\u30FC\u30C9\u306E\u6298\u308A\u305F\u305F\u307F\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5229\u7528\u53EF\u80FD\u306A\u5834\u5408\u306F\u8A00\u8A9E\u56FA\u6709\u306E\u6298\u308A\u305F\u305F\u307F\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u3001\u5229\u7528\u53EF\u80FD\u3067\u306F\u306A\u3044\u5834\u5408\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u30D9\u30FC\u30B9\u306E\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u30D9\u30FC\u30B9\u306E\u6298\u308A\u305F\u305F\u307F\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u6298\u308A\u305F\u305F\u307F\u7BC4\u56F2\u306E\u8A08\u7B97\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7BC4\u56F2\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002","\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7DDA\u306E\u5F8C\u306E\u7A7A\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u7DDA\u304C\u5C55\u958B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8CBC\u308A\u4ED8\u3051\u305F\u5185\u5BB9\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u3088\u308A\u81EA\u52D5\u7684\u306B\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30D5\u30A9\u30FC\u30DE\u30C3\u30BF\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u307E\u305F\u3001\u30D5\u30A9\u30FC\u30DE\u30C3\u30BF\u304C\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5185\u306E\u7BC4\u56F2\u3092\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3067\u304D\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5165\u529B\u5F8C\u306B\u81EA\u52D5\u7684\u306B\u884C\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7E26\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u304C\u8868\u793A\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u307B\u3068\u3093\u3069\u306E\u5834\u5408\u3001\u30B0\u30EA\u30D5\u4F59\u767D\u306F\u30C7\u30D0\u30C3\u30B0\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u3067\u30AB\u30FC\u30BD\u30EB\u3092\u975E\u8868\u793A\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A4\u30F3\u30C7\u30F3\u30C8\u306E\u30AC\u30A4\u30C9\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6587\u5B57\u9593\u9694 (\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30EA\u30F3\u30AF\u3055\u308C\u305F\u7DE8\u96C6\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u6709\u52B9\u306B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u8A00\u8A9E\u306B\u3088\u3063\u3066\u306F\u3001\u7DE8\u96C6\u4E2D\u306B HTML \u30BF\u30B0\u306A\u3069\u306E\u95A2\u9023\u3059\u308B\u8A18\u53F7\u304C\u66F4\u65B0\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u30EA\u30F3\u30AF\u3092\u691C\u51FA\u3057\u3066\u30AF\u30EA\u30C3\u30AF\u53EF\u80FD\u306A\u72B6\u614B\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5BFE\u5FDC\u3059\u308B\u304B\u3063\u3053\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9 \u30DB\u30A4\u30FC\u30EB \u30B9\u30AF\u30ED\u30FC\u30EB \u30A4\u30D9\u30F3\u30C8\u306E `deltaX` \u3068 `deltaY` \u3067\u4F7F\u7528\u3055\u308C\u308B\u4E57\u6570\u3002","`Ctrl` \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30DE\u30A6\u30B9 \u30DB\u30A4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u3092\u30BA\u30FC\u30E0\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30AB\u30FC\u30BD\u30EB\u304C\u91CD\u306A\u3063\u3066\u3044\u308B\u3068\u304D\u306F\u3001\u30DE\u30FC\u30B8\u3057\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Control` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Command` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Alt` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Option` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u8907\u6570\u306E\u30AB\u30FC\u30BD\u30EB\u3092\u8FFD\u52A0\u3059\u308B\u3068\u304D\u306B\u4F7F\u7528\u3059\u308B\u4FEE\u98FE\u30AD\u30FC\u3067\u3059\u3002\u300C\u5B9A\u7FA9\u306B\u79FB\u52D5\u300D\u3084\u300C\u30EA\u30F3\u30AF\u3092\u958B\u304F\u300D\u306E\u30DE\u30A6\u30B9\u64CD\u4F5C\u306F\u3001\u30DE\u30EB\u30C1\u30AB\u30FC\u30BD\u30EB\u306E\u4FEE\u98FE\u30AD\u30FC\u3068\u7AF6\u5408\u3057\u306A\u3044\u3088\u3046\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002[\u8A73\u7D30](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier)","\u30AB\u30FC\u30BD\u30EB\u3054\u3068\u306B\u30C6\u30AD\u30B9\u30C8\u3092 1 \u884C\u305A\u3064\u8CBC\u308A\u4ED8\u3051\u307E\u3059\u3002","\u5404\u30AB\u30FC\u30BD\u30EB\u306F\u5168\u6587\u3092\u8CBC\u308A\u4ED8\u3051\u307E\u3059\u3002","\u8CBC\u308A\u4ED8\u3051\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u884C\u6570\u304C\u30AB\u30FC\u30BD\u30EB\u6570\u3068\u4E00\u81F4\u3059\u308B\u5834\u5408\u306E\u8CBC\u308A\u4ED8\u3051\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF \u30B7\u30F3\u30DC\u30EB\u306E\u51FA\u73FE\u7B87\u6240\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u5468\u56F2\u306B\u5883\u754C\u7DDA\u304C\u63CF\u753B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D4\u30FC\u30AF\u3092\u958B\u304F\u3068\u304D\u306B\u30C4\u30EA\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B","\u30D4\u30FC\u30AF\u3092\u958B\u304F\u3068\u304D\u306B\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B","\u30D4\u30FC\u30AF \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A4\u30F3\u30E9\u30A4\u30F3 \u30A8\u30C7\u30A3\u30BF\u30FC\u307E\u305F\u306F\u30C4\u30EA\u30FC\u3092\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","[\u5B9A\u7FA9\u3078\u79FB\u52D5] \u30DE\u30A6\u30B9 \u30B8\u30A7\u30B9\u30C1\u30E3\u30FC\u3067\u3001\u5E38\u306B\u30D4\u30FC\u30AF \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u958B\u304F\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u308B\u307E\u3067\u306E\u30DF\u30EA\u79D2\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u578B\u306E\u81EA\u52D5\u540D\u524D\u5909\u66F4\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001`editor.linkedEditing` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5236\u5FA1\u6587\u5B57\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u306E\u672B\u5C3E\u304C\u6539\u884C\u306E\u5834\u5408\u306F\u3001\u6700\u5F8C\u306E\u884C\u756A\u53F7\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4F59\u767D\u3068\u73FE\u5728\u306E\u884C\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u73FE\u5728\u306E\u884C\u3092\u3069\u306E\u3088\u3046\u306B\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308B\u5834\u5408\u306B\u306E\u307F\u73FE\u5728\u306E\u884C\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5F37\u8ABF\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059","\u5358\u8A9E\u9593\u306E\u5358\u4E00\u30B9\u30DA\u30FC\u30B9\u4EE5\u5916\u306E\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u306B\u306E\u307F\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u672B\u5C3E\u306E\u7A7A\u767D\u6587\u5B57\u306E\u307F\u3092\u8868\u793A\u3059\u308B","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u9078\u629E\u7BC4\u56F2\u306E\u89D2\u3092\u4E38\u304F\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u6C34\u5E73\u65B9\u5411\u306B\u4F59\u5206\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u6587\u5B57\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u6700\u5F8C\u306E\u884C\u3092\u8D8A\u3048\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5782\u76F4\u304A\u3088\u3073\u6C34\u5E73\u65B9\u5411\u306E\u4E21\u65B9\u306B\u540C\u6642\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u306F\u3001\u4E3B\u8981\u306A\u8EF8\u306B\u6CBF\u3063\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002\u30C8\u30E9\u30C3\u30AF\u30D1\u30C3\u30C9\u4E0A\u3067\u5782\u76F4\u65B9\u5411\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u306F\u3001\u6C34\u5E73\u30C9\u30EA\u30D5\u30C8\u3092\u9632\u6B62\u3057\u307E\u3059\u3002","Linux \u306E PRIMARY \u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u9078\u629E\u9805\u76EE\u3068\u985E\u4F3C\u306E\u4E00\u81F4\u9805\u76EE\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5E38\u306B\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u304C\u3068\u3058\u3057\u308D\u306E\u4E0A\u306B\u3042\u308B\u3068\u304D\u306B\u306E\u307F\u3001\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u3068\u3058\u3057\u308D\u306E\u306E\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4F7F\u7528\u3055\u308C\u3066\u3044\u306A\u3044\u30B3\u30FC\u30C9\u306E\u30D5\u30A7\u30FC\u30C9\u30A2\u30A6\u30C8\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u975E\u63A8\u5968\u306E\u5909\u6570\u306E\u53D6\u308A\u6D88\u3057\u7DDA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u306E\u4E0A\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u306E\u4E0B\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u3068\u4E00\u7DD2\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002","\u4ED6\u306E\u4FEE\u6B63\u5019\u88DC\u3068\u4E00\u7DD2\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3001\u304A\u3088\u3073\u305D\u306E\u4E26\u3073\u66FF\u3048\u306E\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u3067\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3002`0` \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001`#editor.fontSize#` \u306E\u5024\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u884C\u306E\u9AD8\u3055\u3002`0` \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001`#editor.lineHeight#` \u306E\u5024\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002\u6700\u5C0F\u5024\u306F 8 \u3067\u3059\u3002","\u30C8\u30EA\u30AC\u30FC\u6587\u5B57\u306E\u5165\u529B\u6642\u306B\u5019\u88DC\u304C\u81EA\u52D5\u7684\u306B\u8868\u793A\u3055\u308C\u308B\u3088\u3046\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5E38\u306B\u6700\u521D\u306E\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002","`console.| -> console.log` \u306A\u3069\u3068\u9078\u629E\u5BFE\u8C61\u306B\u95A2\u3057\u3066\u5165\u529B\u3057\u306A\u3044\u9650\u308A\u306F\u3001\u6700\u8FD1\u306E\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002`log` \u306F\u6700\u8FD1\u5B8C\u4E86\u3057\u305F\u305F\u3081\u3067\u3059\u3002","\u3053\u308C\u3089\u306E\u5019\u88DC\u3092\u5B8C\u4E86\u3057\u305F\u4EE5\u524D\u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u57FA\u3065\u3044\u3066\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002\u4F8B: `co -> console` \u304A\u3088\u3073 `con -> const`\u3002","\u5019\u88DC\u30EA\u30B9\u30C8\u3092\u8868\u793A\u3059\u308B\u3068\u304D\u306B\u5019\u88DC\u3092\u4E8B\u524D\u306B\u9078\u629E\u3059\u308B\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u306F\u3001tab \u30AD\u30FC\u3092\u62BC\u3057\u305F\u3068\u304D\u306B\u6700\u9069\u306A\u5019\u88DC\u3092\u633F\u5165\u3057\u307E\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\u3002","\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u304C\u4E00\u81F4\u3059\u308B\u5834\u5408\u306B\u3001\u30BF\u30D6\u3067\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u88DC\u5B8C\u3057\u307E\u3059\u3002'quickSuggestions' \u304C\u7121\u52B9\u306A\u5834\u5408\u306B\u6700\u9069\u3067\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306F\u81EA\u52D5\u7684\u306B\u524A\u9664\u3055\u308C\u308B\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306F\u7121\u8996\u3055\u308C\u308B\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306E\u524A\u9664\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u8868\u793A\u3055\u308C\u308B\u3002","\u554F\u984C\u3092\u8D77\u3053\u3059\u53EF\u80FD\u6027\u304C\u3042\u308B\u3001\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7\u306F\u524A\u9664\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u7A7A\u767D\u306E\u633F\u5165\u3084\u524A\u9664\u306F\u30BF\u30D6\u4F4D\u7F6E\u306B\u5F93\u3063\u3066\u884C\u308F\u308C\u307E\u3059\u3002","\u5358\u8A9E\u306B\u95A2\u9023\u3057\u305F\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u307E\u305F\u306F\u64CD\u4F5C\u3092\u5B9F\u884C\u3059\u308B\u3068\u304D\u306B\u3001\u5358\u8A9E\u306E\u533A\u5207\u308A\u6587\u5B57\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57\u3002","\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u305B\u3093\u3002","\u884C\u3092\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u306E\u5E45\u3067\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","`#editor.wordWrapColumn#` \u3067\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u3068 `#editor.wordWrapColumn#` \u306E\u6700\u5C0F\u5024\u3067\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u884C\u306E\u6298\u308A\u8FD4\u3057\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`#editor.wordWrap#` \u304C `wordWrapColumn` \u307E\u305F\u306F `bounded` \u306E\u5834\u5408\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u6298\u308A\u8FD4\u3057\u6841\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u3057\u307E\u305B\u3093\u3002 \u6298\u308A\u8FD4\u3057\u884C\u306F\u5217 1 \u304B\u3089\u59CB\u307E\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA\u3068\u540C\u3058\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA +1 \u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA +2 \u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u3059\u3079\u3066\u306E\u6587\u5B57\u306E\u5E45\u304C\u540C\u3058\u3067\u3042\u308B\u3068\u4EEE\u5B9A\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u30E2\u30CE\u30B9\u30DA\u30FC\u30B9 \u30D5\u30A9\u30F3\u30C8\u3084\u3001\u30B0\u30EA\u30D5\u306E\u5E45\u304C\u7B49\u3057\u3044\u7279\u5B9A\u306E\u30B9\u30AF\u30EA\u30D7\u30C8 (\u30E9\u30C6\u30F3\u6587\u5B57\u306A\u3069) \u3067\u6B63\u3057\u304F\u52D5\u4F5C\u3059\u308B\u9AD8\u901F\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3067\u3059\u3002","\u6298\u308A\u8FD4\u3057\u30DD\u30A4\u30F3\u30C8\u306E\u8A08\u7B97\u3092\u30D6\u30E9\u30A6\u30B6\u30FC\u306B\u30C7\u30EA\u30B2\u30FC\u30C8\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u5927\u304D\u306A\u30D5\u30A1\u30A4\u30EB\u306E\u30D5\u30EA\u30FC\u30BA\u3092\u5F15\u304D\u8D77\u3053\u3059\u53EF\u80FD\u6027\u304C\u3042\u308B\u3082\u306E\u306E\u3001\u3059\u3079\u3066\u306E\u30B1\u30FC\u30B9\u3067\u6B63\u3057\u304F\u52D5\u4F5C\u3059\u308B\u4F4E\u901F\u306A\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3067\u3059\u3002","\u6298\u308A\u8FD4\u3057\u30DD\u30A4\u30F3\u30C8\u3092\u8A08\u7B97\u3059\u308B\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002"],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["\u5165\u529B\u3057\u3066\u3044\u307E\u3059"],"vs/editor/common/modes/modesRegistry":["\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8"],"vs/editor/common/standaloneStrings":["\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093","\u884C {0}\u3001\u5217 {1} ({2} \u500B\u9078\u629E\u6E08\u307F)","\u884C {0}\u3001\u5217 {1}","{0} \u500B\u306E\u9078\u629E\u9805\u76EE ({1} \u6587\u5B57\u3092\u9078\u629E)","{0} \u500B\u306E\u9078\u629E\u9805\u76EE","`accessibilitySupport` \u8A2D\u5B9A\u3092 'on' \u306B\u5909\u66F4\u3057\u3066\u3044\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306B\u95A2\u9023\u3059\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 \u30DA\u30FC\u30B8\u3092\u958B\u3044\u3066\u3044\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30A6\u30A3\u30F3\u30C9\u30A6\u5185\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u5185\u3002","\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30B3\u30FC\u30C9 \u30A8\u30C7\u30A3\u30BF\u30FC\u5185","\u30B3\u30FC\u30C9 \u30A8\u30C7\u30A3\u30BF\u30FC\u5185","\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u69CB\u6210\u3057\u3066\u30B9\u30AF\u30EA\u30FC\u30F3 \u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u4F7F\u7528\u3059\u308B\u3088\u3046\u306B\u6700\u9069\u5316\u3059\u308B\u306B\u306F\u3001Command+E \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u69CB\u6210\u3057\u3066\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u4F7F\u7528\u3059\u308B\u3088\u3046\u306B\u6700\u9069\u5316\u3059\u308B\u306B\u306F\u3001Control+E \u3092\u62BC\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u4F7F\u7528\u3059\u308B\u3088\u3046\u6700\u9069\u5316\u3055\u308C\u308B\u3088\u3046\u306B\u69CB\u6210\u3055\u308C\u3066\u3044\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u4F7F\u7528\u3059\u308B\u3088\u3046\u6700\u9069\u5316\u3055\u308C\u306A\u3044\u3088\u3046\u306B\u69CB\u6210\u3055\u308C\u3066\u3044\u307E\u3059\u304C\u3001\u73FE\u6642\u70B9\u3067\u3053\u306E\u8A2D\u5B9A\u306F\u5F53\u3066\u306F\u307E\u308A\u307E\u305B\u3093\u3002","\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u6B21\u306E\u30D5\u30A9\u30FC\u30AB\u30B9\u53EF\u80FD\u306A\u8981\u7D20\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002{0} \u3092\u62BC\u3059\u3068\u3001\u3053\u306E\u52D5\u4F5C\u304C\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\u3002","\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u6B21\u306E\u30D5\u30A9\u30FC\u30AB\u30B9\u53EF\u80FD\u306A\u8981\u7D20\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002\u30B3\u30DE\u30F3\u30C9 {0} \u306F\u3001\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9\u3067\u306F\u73FE\u5728\u30C8\u30EA\u30AC\u30FC\u3067\u304D\u307E\u305B\u3093\u3002","\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u30BF\u30D6\u6587\u5B57\u304C\u633F\u5165\u3055\u308C\u307E\u3059\u3002{0} \u3092\u62BC\u3059\u3068\u3001\u3053\u306E\u52D5\u4F5C\u304C\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\u3002","\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u30BF\u30D6\u6587\u5B57\u304C\u633F\u5165\u3055\u308C\u307E\u3059\u3002\u30B3\u30DE\u30F3\u30C9 {0} \u306F\u3001\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9\u3067\u306F\u73FE\u5728\u30C8\u30EA\u30AC\u30FC\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306B\u95A2\u3059\u308B\u8A73\u7D30\u60C5\u5831\u304C\u8A18\u3055\u308C\u305F\u30D6\u30E9\u30A6\u30B6\u30FC \u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u958B\u304F\u306B\u306F\u3001Command+H \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306B\u95A2\u3059\u308B\u8A73\u7D30\u60C5\u5831\u304C\u8A18\u3055\u308C\u305F\u30D6\u30E9\u30A6\u30B6\u30FC \u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u958B\u304F\u306B\u306F\u3001Control+H \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002","Esc \u30AD\u30FC \u304B Shift+Esc \u3092\u62BC\u3059\u3068\u3001\u30D2\u30F3\u30C8\u3092\u6D88\u3057\u3066\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u623B\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u30D8\u30EB\u30D7\u3092\u8868\u793A\u3057\u307E\u3059","\u958B\u767A\u8005: \u30C8\u30FC\u30AF\u30F3\u306E\u691C\u67FB","\u884C/\u5217\u306B\u79FB\u52D5\u3059\u308B...","\u3059\u3079\u3066\u306E\u30AF\u30A4\u30C3\u30AF \u30A2\u30AF\u30BB\u30B9 \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u8868\u793A","\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8","\u30B3\u30DE\u30F3\u30C9\u306E\u8868\u793A\u3068\u5B9F\u884C","\u30B7\u30F3\u30DC\u30EB\u306B\u79FB\u52D5...","\u30AB\u30C6\u30B4\u30EA\u5225\u306E\u30B7\u30F3\u30DC\u30EB\u3078\u79FB\u52D5...","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4","\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3 \u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3059\u308B\u306B\u306F\u3001Alt+F1 \u30AD\u30FC\u3092\u62BC\u3057\u307E\u3059\u3002","\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8 \u30C6\u30FC\u30DE\u306E\u5207\u308A\u66FF\u3048","{1} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u306B {0} \u500B\u306E\u7DE8\u96C6\u304C\u884C\u308F\u308C\u307E\u3057\u305F"],"vs/editor/common/view/editorColorRegistry":["\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u306E\u884C\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u80CC\u666F\u8272\u3002","\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u306E\u884C\u306E\u5883\u754C\u7DDA\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u80CC\u666F\u8272\u3002","(Quick Open \u3084\u691C\u51FA\u6A5F\u80FD\u306A\u3069\u306B\u3088\u308A) \u5F37\u8ABF\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u7BC4\u56F2\u306E\u5883\u754C\u7DDA\u306E\u80CC\u666F\u8272\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u8A18\u53F7\u306E\u80CC\u666F\u8272 (\u5B9A\u7FA9\u3078\u79FB\u52D5\u3001\u6B21\u307E\u305F\u306F\u524D\u306E\u8A18\u53F7\u3078\u79FB\u52D5\u306A\u3069)\u3002\u57FA\u306B\u306A\u308B\u88C5\u98FE\u304C\u8986\u308F\u308C\u306A\u3044\u3088\u3046\u306B\u3059\u308B\u305F\u3081\u3001\u8272\u3092\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u8A18\u53F7\u306E\u5468\u308A\u306E\u5883\u754C\u7DDA\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30AB\u30FC\u30BD\u30EB\u306E\u8272\u3002","\u9078\u629E\u3055\u308C\u305F\u6587\u5B57\u5217\u306E\u80CC\u666F\u8272\u3067\u3059\u3002\u9078\u629E\u3055\u308C\u305F\u6587\u5B57\u5217\u306E\u80CC\u666F\u8272\u3092\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\u51FA\u6765\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B9\u30DA\u30FC\u30B9\u6587\u5B57\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u884C\u756A\u53F7\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u884C\u756A\u53F7\u306E\u8272","id \u306F\u4F7F\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002\u4EE3\u308F\u308A\u306B 'EditorLineNumber.activeForeground' \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u884C\u756A\u53F7\u306E\u8272","\u30A8\u30C7\u30A3\u30BF\u30FC \u30EB\u30FC\u30E9\u30FC\u306E\u8272\u3002","CodeLens \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u524D\u666F\u8272\u3002","\u4E00\u81F4\u3059\u308B\u304B\u3063\u3053\u306E\u80CC\u666F\u8272","\u4E00\u81F4\u3059\u308B\u304B\u3063\u3053\u5185\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u8272","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u5883\u754C\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u80CC\u666F\u8272\u3067\u3059\u3002\u30DF\u30CB\u30DE\u30C3\u30D7\u304C\u6709\u52B9\u3067\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u53F3\u5074\u306B\u914D\u7F6E\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306E\u80CC\u666F\u8272\u3002\u4F59\u767D\u306B\u306F\u30B0\u30EA\u30D5 \u30DE\u30FC\u30B8\u30F3\u3068\u884C\u756A\u53F7\u304C\u542B\u307E\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u4E0D\u8981\u306A (\u672A\u4F7F\u7528\u306E) \u30BD\u30FC\u30B9 \u30B3\u30FC\u30C9\u306E\u7F6B\u7DDA\u306E\u8272\u3002",`\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u4E0D\u8981\u306A (\u672A\u4F7F\u7528\u306E) \u30BD\u30FC\u30B9 \u30B3\u30FC\u30C9\u306E\u4E0D\u900F\u660E\u5EA6\u3002\u305F\u3068\u3048\u3070\u3001"#000000c0" \u306F\u4E0D\u900F\u660E\u5EA6 75% \u3067\u30B3\u30FC\u30C9\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u306E\u30C6\u30FC\u30DE\u306E\u5834\u5408\u3001'editorUnnecessaryCode.border' \u30C6\u30FC\u30DE\u8272\u3092\u4F7F\u7528\u3057\u3066\u3001\u4E0D\u8981\u306A\u30B3\u30FC\u30C9\u3092\u30D5\u30A7\u30FC\u30C9\u30A2\u30A6\u30C8\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u4E0B\u7DDA\u3092\u4ED8\u3051\u307E\u3059\u3002`,"\u7BC4\u56F2\u5F37\u8ABF\u8868\u793A\u306E\u305F\u3081\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30E9\u30FC\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u8B66\u544A\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u60C5\u5831\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002"],"vs/editor/contrib/anchorSelect/anchorSelect":["\u9078\u629E\u30A2\u30F3\u30AB\u30FC","\u30A2\u30F3\u30AB\u30FC\u304C {0}:{1} \u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3057\u305F","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u306E\u8A2D\u5B9A","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u3078\u79FB\u52D5","\u30A2\u30F3\u30AB\u30FC\u304B\u3089\u30AB\u30FC\u30BD\u30EB\u3078\u9078\u629E","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u306E\u53D6\u308A\u6D88\u3057"],"vs/editor/contrib/bracketMatching/bracketMatching":["\u4E00\u81F4\u3059\u308B\u30D6\u30E9\u30B1\u30C3\u30C8\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u30D6\u30E9\u30B1\u30C3\u30C8\u3078\u79FB\u52D5","\u30D6\u30E9\u30B1\u30C3\u30C8\u306B\u9078\u629E","\u30D6\u30E9\u30B1\u30C3\u30C8\u306B\u79FB\u52D5(&&B)"],"vs/editor/contrib/caretOperations/caretOperations":["\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u5DE6\u306B\u79FB\u52D5","\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u53F3\u306B\u79FB\u52D5"],"vs/editor/contrib/caretOperations/transpose":["\u6587\u5B57\u306E\u5165\u308C\u66FF\u3048"],"vs/editor/contrib/clipboard/clipboard":["\u5207\u308A\u53D6\u308A(&&T)","\u5207\u308A\u53D6\u308A","\u5207\u308A\u53D6\u308A","\u30B3\u30D4\u30FC(&&C)","\u30B3\u30D4\u30FC","\u30B3\u30D4\u30FC","\u8CBC\u308A\u4ED8\u3051(&&P)","\u8CBC\u308A\u4ED8\u3051","\u8CBC\u308A\u4ED8\u3051","\u69CB\u6587\u3092\u5F37\u8ABF\u8868\u793A\u3057\u3066\u30B3\u30D4\u30FC"],"vs/editor/contrib/codeAction/codeActionCommands":["\u5B9F\u884C\u3059\u308B\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u7A2E\u985E\u3002","\u8FD4\u3055\u308C\u305F\u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u9069\u7528\u3055\u308C\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6700\u521D\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u5E38\u306B\u9069\u7528\u3057\u307E\u3059\u3002","\u6700\u521D\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u4EE5\u5916\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u306A\u3044\u5834\u5408\u306F\u3001\u305D\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u9069\u7528\u3057\u307E\u3059\u3002","\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u9069\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002","\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u307F\u3092\u8FD4\u3059\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u9069\u7528\u4E2D\u306B\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F","\u30AF\u30A4\u30C3\u30AF \u30D5\u30A3\u30C3\u30AF\u30B9...","\u5229\u7528\u53EF\u80FD\u306A\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u30EA\u30D5\u30A1\u30AF\u30BF\u30FC...","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u306F\u3042\u308A\u307E\u305B\u3093","\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3...","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u6574\u7406","\u5229\u7528\u53EF\u80FD\u306A\u30A4\u30F3\u30DD\u30FC\u30C8\u306E\u6574\u7406\u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u3059\u3079\u3066\u4FEE\u6B63","\u3059\u3079\u3066\u3092\u4FEE\u6B63\u3059\u308B\u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093","\u81EA\u52D5\u4FEE\u6B63...","\u5229\u7528\u53EF\u80FD\u306A\u81EA\u52D5\u4FEE\u6B63\u306F\u3042\u308A\u307E\u305B\u3093"],"vs/editor/contrib/codeAction/lightBulbWidget":["\u4FEE\u6B63\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u63A8\u5968\u3055\u308C\u308B\u5229\u7528\u53EF\u80FD\u306A\u4FEE\u6B63\u30D7\u30ED\u30B0\u30E9\u30E0 ({0})","\u4FEE\u6B63\u30D7\u30ED\u30B0\u30E9\u30E0 ({0}) \u3092\u8868\u793A\u3059\u308B","\u4FEE\u6B63\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u8868\u793A\u3059\u308B"],"vs/editor/contrib/codelens/codelensController":["\u73FE\u5728\u306E\u884C\u306E\u30B3\u30FC\u30C9 \u30EC\u30F3\u30BA \u30B3\u30DE\u30F3\u30C9\u3092\u8868\u793A"],"vs/editor/contrib/comment/comment":["\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048(&&T)","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u8FFD\u52A0","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u524A\u9664","\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048","\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048(&&B)"],"vs/editor/contrib/contextmenu/contextmenu":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \u30E1\u30CB\u30E5\u30FC\u306E\u8868\u793A"],"vs/editor/contrib/cursorUndo/cursorUndo":["\u30AB\u30FC\u30BD\u30EB\u3092\u5143\u306B\u623B\u3059","\u30AB\u30FC\u30BD\u30EB\u306E\u3084\u308A\u76F4\u3057"],"vs/editor/contrib/find/findController":["\u691C\u7D22","\u691C\u7D22(&&F)","\u9078\u629E\u7BC4\u56F2\u3067\u691C\u7D22","\u6B21\u3092\u691C\u7D22","\u6B21\u3092\u691C\u7D22","\u524D\u3092\u691C\u7D22","\u524D\u3092\u691C\u7D22","\u6B21\u306E\u9078\u629E\u9805\u76EE\u3092\u691C\u7D22","\u524D\u306E\u9078\u629E\u9805\u76EE\u3092\u691C\u7D22","\u7F6E\u63DB","\u7F6E\u63DB(&&R)"],"vs/editor/contrib/find/findWidget":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u6298\u308A\u305F\u305F\u307E\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u793A\u3059\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u5C55\u958B\u3055\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u793A\u3059\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u7F6E\u63DB' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u3059\u3079\u3066\u7F6E\u63DB' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u524D\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u6B21\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u691C\u7D22","\u691C\u7D22","\u524D\u306E\u691C\u7D22\u7D50\u679C","\u6B21\u306E\u4E00\u81F4\u9805\u76EE","\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22","\u9589\u3058\u308B","\u7F6E\u63DB","\u7F6E\u63DB","\u7F6E\u63DB","\u3059\u3079\u3066\u7F6E\u63DB","\u7F6E\u63DB\u30E2\u30FC\u30C9\u306E\u5207\u308A\u66FF\u3048","\u6700\u521D\u306E {0} \u4EF6\u306E\u7D50\u679C\u3060\u3051\u304C\u5F37\u8ABF\u8868\u793A\u3055\u308C\u307E\u3059\u304C\u3001\u3059\u3079\u3066\u306E\u691C\u7D22\u64CD\u4F5C\u306F\u30C6\u30AD\u30B9\u30C8\u5168\u4F53\u3067\u6A5F\u80FD\u3057\u307E\u3059\u3002","{0} / {1} \u4EF6","\u7D50\u679C\u306F\u3042\u308A\u307E\u305B\u3093\u3002","{0} \u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u304C '{1}' \u3067\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u306F '{1}' \u3067 {2} \u306B\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u304C '{1}' \u3067\u898B\u3064\u304B\u308A\u307E\u3057\u305F","Ctrl + Enter \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u3059\u3079\u3066\u7F6E\u63DB\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u3001\u6539\u884C\u304C\u633F\u5165\u3055\u308C\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3057\u305F\u3002editor.action.replaceAll \u306E\u30AD\u30FC\u30D0\u30A4\u30F3\u30C9\u3092\u5909\u66F4\u3057\u3066\u3001\u3053\u306E\u52D5\u4F5C\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3067\u304D\u307E\u3059\u3002"],"vs/editor/contrib/folding/folding":["\u5C55\u958B","\u518D\u5E30\u7684\u306B\u5C55\u958B\u3059\u308B","\u6298\u308A\u305F\u305F\u307F","\u6298\u308A\u305F\u305F\u307F\u306E\u5207\u308A\u66FF\u3048","\u518D\u5E30\u7684\u306B\u6298\u308A\u305F\u305F\u3080","\u3059\u3079\u3066\u306E\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u6298\u308A\u305F\u305F\u307F","\u3059\u3079\u3066\u306E\u9818\u57DF\u3092\u6298\u308A\u305F\u305F\u3080","\u3059\u3079\u3066\u306E\u9818\u57DF\u3092\u5C55\u958B","\u3059\u3079\u3066\u6298\u308A\u305F\u305F\u307F","\u3059\u3079\u3066\u5C55\u958B","\u30EC\u30D9\u30EB {0} \u3067\u6298\u308A\u305F\u305F\u3080","\u6298\u308A\u66F2\u3052\u308B\u7BC4\u56F2\u306E\u80CC\u666F\u8272\u3002\u57FA\u306E\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u3088\u3046\u306B\u3001\u8272\u306F\u4E0D\u900F\u660E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306B\u3042\u308B\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u306E\u8272\u3002"],"vs/editor/contrib/folding/foldingDecorations":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u5185\u306E\u5C55\u958B\u3055\u308C\u305F\u7BC4\u56F2\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u5185\u306E\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7BC4\u56F2\u306E\u30A2\u30A4\u30B3\u30F3\u3002"],"vs/editor/contrib/fontZoom/fontZoom":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u3092\u62E1\u5927","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u3092\u7E2E\u5C0F","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u306E\u30BA\u30FC\u30E0\u3092\u30EA\u30BB\u30C3\u30C8"],"vs/editor/contrib/format/format":["\u884C {0} \u3067 1 \u3064\u306E\u66F8\u5F0F\u8A2D\u5B9A\u3092\u7DE8\u96C6","\u884C {1} \u3067 {0} \u500B\u306E\u66F8\u5F0F\u8A2D\u5B9A\u3092\u7DE8\u96C6","\u884C {0} \u3068 {1} \u306E\u9593\u3067 1 \u3064\u306E\u66F8\u5F0F\u8A2D\u5B9A\u3092\u7DE8\u96C6","\u884C {1} \u3068 {2} \u306E\u9593\u3067 {0} \u500B\u306E\u66F8\u5F0F\u8A2D\u5B9A\u3092\u7DE8\u96C6"],"vs/editor/contrib/format/formatActions":["\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","\u9078\u629E\u7BC4\u56F2\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8"],"vs/editor/contrib/gotoError/gotoError":["\u6B21\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u6B21\u306E\u30DE\u30FC\u30AB\u30FC\u3078\u79FB\u52D5\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u524D\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u524D\u306E\u30DE\u30FC\u30AB\u30FC\u3078\u79FB\u52D5\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30D5\u30A1\u30A4\u30EB\u5185\u306E\u6B21\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u6B21\u306E\u554F\u984C\u7B87\u6240(&&P)","\u30D5\u30A1\u30A4\u30EB\u5185\u306E\u524D\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u524D\u306E\u554F\u984C\u7B87\u6240(&&P)"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\u30A8\u30E9\u30FC","\u8B66\u544A","\u60C5\u5831","\u30D2\u30F3\u30C8","{0} ({1})\u3002","{1} \u4EF6\u4E2D {0} \u4EF6\u306E\u554F\u984C","\u554F\u984C {0} / {1}","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A8\u30E9\u30FC\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u8B66\u544A\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u60C5\u5831\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u3002"],"vs/editor/contrib/gotoSymbol/goToCommands":["\u30D4\u30FC\u30AF","\u5B9A\u7FA9","'{0}' \u306E\u5B9A\u7FA9\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9A\u7FA9\u3078\u79FB\u52D5","\u5B9A\u7FA9\u306B\u79FB\u52D5(&&D)","\u5B9A\u7FA9\u3092\u6A2A\u306B\u958B\u304F","\u5B9A\u7FA9\u3092\u3053\u3053\u306B\u8868\u793A","\u5BA3\u8A00","'{0}' \u306E\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u3078\u79FB\u52D5","\u5BA3\u8A00\u3078\u79FB\u52D5(&&D)","'{0}' \u306E\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u3092\u3053\u3053\u306B\u8868\u793A","\u578B\u5B9A\u7FA9","'{0}' \u306E\u578B\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u578B\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5","\u578B\u5B9A\u7FA9\u306B\u79FB\u52D5(&&T)","\u578B\u5B9A\u7FA9\u3092\u8868\u793A","\u5B9F\u88C5","'{0}' \u306E\u5B9F\u88C5\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9F\u88C5\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9F\u88C5\u3078\u79FB\u52D5","\u5B9F\u88C5\u7B87\u6240\u306B\u79FB\u52D5(&&I)","\u5B9F\u88C5\u306E\u30D4\u30FC\u30AF","'{0}' \u306E\u53C2\u7167\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u53C2\u7167\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u53C2\u7167\u3078\u79FB\u52D5","\u53C2\u7167\u3078\u79FB\u52D5(&&R)","\u53C2\u7167\u8A2D\u5B9A","\u53C2\u7167\u3092\u3053\u3053\u306B\u8868\u793A","\u53C2\u7167\u8A2D\u5B9A","\u4EFB\u610F\u306E\u8A18\u53F7\u3078\u79FB\u52D5","\u5834\u6240","'{0}' \u306B\u4E00\u81F4\u3059\u308B\u7D50\u679C\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F","\u53C2\u7167\u8A2D\u5B9A"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3001{0} \u306E\u5B9A\u7FA9\u3092\u8868\u793A\u3057\u307E\u3059\u3002"],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} \u500B\u306E\u53C2\u7167","{0} \u500B\u306E\u53C2\u7167","\u53C2\u7167"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u8868\u793A\u3067\u304D\u307E\u305B\u3093","\u7D50\u679C\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u53C2\u7167\u8A2D\u5B9A"],"vs/editor/contrib/gotoSymbol/referencesModel":["\u5217 {2} \u306E {1} \u884C\u76EE\u306B {0} \u3064\u306E\u30B7\u30F3\u30DC\u30EB","\u5217 {2}\u3001{3} \u306E {1} \u884C\u76EE\u306E {0} \u306B\u3042\u308B\u8A18\u53F7","{0} \u306B 1 \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u3001\u5B8C\u5168\u306A\u30D1\u30B9 {1}","{1} \u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u3001\u5B8C\u5168\u306A\u30D1\u30B9 {2}","\u4E00\u81F4\u3059\u308B\u9805\u76EE\u306F\u3042\u308A\u307E\u305B\u3093","{0} \u306B 1 \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{1} \u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{1} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["{1} \u306E\u30B7\u30F3\u30DC\u30EB {0}\u3001\u6B21\u306B {2}","\u30B7\u30F3\u30DC\u30EB {0}/{1}"],"vs/editor/contrib/hover/hover":["\u30DB\u30D0\u30FC\u306E\u8868\u793A","\u5B9A\u7FA9\u30D7\u30EC\u30D3\u30E5\u30FC\u306E\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3059\u308B"],"vs/editor/contrib/hover/markdownHoverParticipant":["\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","\u5229\u7528\u3067\u304D\u308B\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u3042\u308A\u307E\u305B\u3093","\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u3092\u78BA\u8A8D\u3057\u3066\u3044\u307E\u3059...","\u5229\u7528\u3067\u304D\u308B\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u3042\u308A\u307E\u305B\u3093","\u30AF\u30A4\u30C3\u30AF \u30D5\u30A3\u30C3\u30AF\u30B9..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\u524D\u306E\u5024\u306B\u7F6E\u63DB","\u6B21\u306E\u5024\u306B\u7F6E\u63DB"],"vs/editor/contrib/indentation/indentation":["\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30B9\u30DA\u30FC\u30B9\u306B\u5909\u63DB","\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30BF\u30D6\u306B\u5909\u63DB","\u69CB\u6210\u3055\u308C\u305F\u30BF\u30D6\u306E\u30B5\u30A4\u30BA","\u73FE\u5728\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u30BF\u30D6\u306E\u30B5\u30A4\u30BA\u3092\u9078\u629E","\u30BF\u30D6\u306B\u3088\u308B\u30A4\u30F3\u30C7\u30F3\u30C8","\u30B9\u30DA\u30FC\u30B9\u306B\u3088\u308B\u30A4\u30F3\u30C7\u30F3\u30C8","\u5185\u5BB9\u304B\u3089\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u691C\u51FA","\u884C\u306E\u518D\u30A4\u30F3\u30C7\u30F3\u30C8","\u9078\u629E\u884C\u3092\u518D\u30A4\u30F3\u30C7\u30F3\u30C8"],"vs/editor/contrib/linesOperations/linesOperations":["\u884C\u3092\u4E0A\u3078\u30B3\u30D4\u30FC","\u884C\u3092\u4E0A\u3078\u30B3\u30D4\u30FC(&&C)","\u884C\u3092\u4E0B\u3078\u30B3\u30D4\u30FC","\u884C\u3092\u4E0B\u3078\u30B3\u30D4\u30FC(&&P)","\u9078\u629E\u7BC4\u56F2\u306E\u8907\u88FD","\u9078\u629E\u7BC4\u56F2\u306E\u8907\u88FD(&&D)","\u884C\u3092\u4E0A\u3078\u79FB\u52D5","\u884C\u3092\u4E0A\u3078\u79FB\u52D5(&&V)","\u884C\u3092\u4E0B\u3078\u79FB\u52D5","\u884C\u3092\u4E0B\u3078\u79FB\u52D5(&&L)","\u884C\u3092\u6607\u9806\u306B\u4E26\u3079\u66FF\u3048","\u884C\u3092\u964D\u9806\u306B\u4E26\u3079\u66FF\u3048","\u672B\u5C3E\u306E\u7A7A\u767D\u306E\u30C8\u30EA\u30DF\u30F3\u30B0","\u884C\u306E\u524A\u9664","\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8","\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u89E3\u9664","\u884C\u3092\u4E0A\u306B\u633F\u5165","\u884C\u3092\u4E0B\u306B\u633F\u5165","\u5DE6\u5074\u3092\u3059\u3079\u3066\u524A\u9664","\u53F3\u5074\u3092\u3059\u3079\u3066\u524A\u9664","\u884C\u3092\u3064\u306A\u3052\u308B","\u30AB\u30FC\u30BD\u30EB\u306E\u5468\u56F2\u306E\u6587\u5B57\u3092\u5165\u308C\u66FF\u3048\u308B","\u5927\u6587\u5B57\u306B\u5909\u63DB","\u5C0F\u6587\u5B57\u306B\u5909\u63DB","\u5148\u982D\u6587\u5B57\u3092\u5927\u6587\u5B57\u306B\u5909\u63DB\u3059\u308B","\u30B9\u30CD\u30FC\u30AF \u30B1\u30FC\u30B9\u306B\u5909\u63DB\u3059\u308B"],"vs/editor/contrib/linkedEditing/linkedEditing":["\u30EA\u30F3\u30AF\u3055\u308C\u305F\u7DE8\u96C6\u306E\u958B\u59CB","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u578B\u306E\u540D\u524D\u306E\u81EA\u52D5\u5909\u66F4\u3092\u884C\u3046\u3068\u304D\u306E\u80CC\u666F\u8272\u3067\u3059\u3002"],"vs/editor/contrib/links/links":["\u30B3\u30DE\u30F3\u30C9\u306E\u5B9F\u884C","\u30EA\u30F3\u30AF\u5148\u3092\u8868\u793A","cmd + \u30AF\u30EA\u30C3\u30AF","ctrl + \u30AF\u30EA\u30C3\u30AF","option + \u30AF\u30EA\u30C3\u30AF","alt + \u30AF\u30EA\u30C3\u30AF","\u30B3\u30DE\u30F3\u30C9 {0} \u306E\u5B9F\u884C","\u3053\u306E\u30EA\u30F3\u30AF\u306F\u5F62\u5F0F\u304C\u6B63\u3057\u304F\u306A\u3044\u305F\u3081\u958B\u304F\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: {0}","\u3053\u306E\u30EA\u30F3\u30AF\u306F\u30BF\u30FC\u30B2\u30C3\u30C8\u304C\u5B58\u5728\u3057\u306A\u3044\u305F\u3081\u958B\u304F\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30EA\u30F3\u30AF\u3092\u958B\u304F"],"vs/editor/contrib/message/messageController":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u73FE\u5728\u30A4\u30F3\u30E9\u30A4\u30F3 \u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u7DE8\u96C6\u3067\u304D\u307E\u305B\u3093"],"vs/editor/contrib/multicursor/multicursor":["\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165(&&A)","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165(&&D)","\u30AB\u30FC\u30BD\u30EB\u3092\u884C\u672B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u884C\u672B\u306B\u633F\u5165(&&U)","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165","\u9078\u629E\u3057\u305F\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u8FFD\u52A0","\u6B21\u306E\u51FA\u73FE\u500B\u6240\u3092\u8FFD\u52A0(&&N)","\u9078\u629E\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u8FFD\u52A0","\u524D\u306E\u51FA\u73FE\u7B87\u6240\u3092\u8FFD\u52A0(&&R)","\u6700\u5F8C\u306B\u9078\u629E\u3057\u305F\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u79FB\u52D5","\u6700\u5F8C\u306B\u9078\u3093\u3060\u9805\u76EE\u3092\u524D\u306E\u4E00\u81F4\u9805\u76EE\u306B\u79FB\u52D5\u3059\u308B","\u4E00\u81F4\u3059\u308B\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u9078\u629E\u3057\u307E\u3059","\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u9078\u629E(&&O)","\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u5909\u66F4"],"vs/editor/contrib/parameterHints/parameterHints":["\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u30C8\u30EA\u30AC\u30FC"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["\u6B21\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u524D\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","{0}\u3001\u30D2\u30F3\u30C8"],"vs/editor/contrib/peekView/peekView":["\u9589\u3058\u308B","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u30BF\u30A4\u30C8\u30EB\u9818\u57DF\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30BF\u30A4\u30C8\u30EB\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u30BF\u30A4\u30C8\u30EB\u60C5\u5831\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u5883\u754C\u3068\u77E2\u5370\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u30E9\u30A4\u30F3 \u30CE\u30FC\u30C9\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u30D5\u30A1\u30A4\u30EB \u30CE\u30FC\u30C9\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u8868\u793A\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u8868\u793A\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u5883\u754C\u8272\u3002"],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\u6700\u521D\u306B\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u3044\u3066\u3001\u884C\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","\u884C {0}\u3001\u5217 {1} \u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","{0} \u884C\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","\u73FE\u5728\u306E\u884C: {0}\u3001\u6587\u5B57: {1}\u3002\u79FB\u52D5\u5148\u3068\u306A\u308B\u30011 \u304B\u3089 {2} \u307E\u3067\u306E\u884C\u756A\u53F7\u3092\u5165\u529B\u3057\u307E\u3059\u3002","\u73FE\u5728\u306E\u884C: {0}\u3001\u6587\u5B57: {1}\u3002\u79FB\u52D5\u5148\u306E\u884C\u756A\u53F7\u3092\u5165\u529B\u3057\u307E\u3059\u3002"],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\u30B7\u30F3\u30DC\u30EB\u306B\u79FB\u52D5\u3059\u308B\u306B\u306F\u3001\u307E\u305A\u30B7\u30F3\u30DC\u30EB\u60C5\u5831\u3092\u542B\u3080\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u304D\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306F\u3001\u30B7\u30F3\u30DC\u30EB\u60C5\u5831\u306F\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u4E00\u81F4\u3059\u308B\u30A8\u30C7\u30A3\u30BF\u30FC \u30B7\u30F3\u30DC\u30EB\u304C\u3042\u308A\u307E\u305B\u3093","\u30A8\u30C7\u30A3\u30BF\u30FC \u30B7\u30F3\u30DC\u30EB\u304C\u3042\u308A\u307E\u305B\u3093","\u6A2A\u306B\u4E26\u3079\u3066\u958B\u304F","\u4E00\u756A\u4E0B\u3067\u958B\u304F","\u30B7\u30F3\u30DC\u30EB ({0})","\u30D7\u30ED\u30D1\u30C6\u30A3 ({0})","\u30E1\u30BD\u30C3\u30C9 ({0})","\u95A2\u6570 ({0})","\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC ({0})","\u5909\u6570 ({0})","\u30AF\u30E9\u30B9 ({0})","\u69CB\u9020\u4F53 ({0})","\u30A4\u30D9\u30F3\u30C8 ({0})","\u6F14\u7B97\u5B50 ({0})","\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9 ({0})","\u540D\u524D\u7A7A\u9593 ({0})","\u30D1\u30C3\u30B1\u30FC\u30B8 ({0})","\u578B\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC ({0})","\u30E2\u30B8\u30E5\u30FC\u30EB ({0})","\u30D7\u30ED\u30D1\u30C6\u30A3 ({0})","\u5217\u6319\u578B ({0})","\u5217\u6319\u578B\u30E1\u30F3\u30D0\u30FC ({0})","\u6587\u5B57\u5217 ({0})","\u30D5\u30A1\u30A4\u30EB ({0})","\u914D\u5217 ({0})","\u6570\u5024 ({0})","\u30D6\u30FC\u30EB\u5024 ({0})","\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 ({0})","\u30AD\u30FC ({0})","\u30D5\u30A3\u30FC\u30EB\u30C9 ({0})","\u5B9A\u6570 ({0})"],"vs/editor/contrib/rename/rename":["\u7D50\u679C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u540D\u524D\u5909\u66F4\u306E\u5834\u6240\u3092\u89E3\u6C7A\u3057\u3088\u3046\u3068\u3057\u3066\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F","'{0}' \u306E\u540D\u524D\u306E\u5909\u66F4\u4E2D","{0} \u306E\u540D\u524D\u3092\u5909\u66F4\u3057\u3066\u3044\u307E\u3059","'{0}' \u304B\u3089 '{1}' \u3078\u306E\u540D\u524D\u5909\u66F4\u304C\u6B63\u5E38\u306B\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u6982\u8981: {2}","\u540D\u524D\u306E\u5909\u66F4\u3067\u7DE8\u96C6\u3092\u9069\u7528\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u540D\u524D\u306E\u5909\u66F4\u306B\u3088\u3063\u3066\u7DE8\u96C6\u306E\u8A08\u7B97\u306B\u5931\u6557\u3057\u307E\u3057\u305F","\u30B7\u30F3\u30DC\u30EB\u306E\u540D\u524D\u5909\u66F4","\u540D\u524D\u3092\u5909\u66F4\u3059\u308B\u524D\u306B\u5909\u66F4\u3092\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u6A5F\u80FD\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B"],"vs/editor/contrib/rename/renameInputField":["\u540D\u524D\u5909\u66F4\u5165\u529B\u3002\u65B0\u3057\u3044\u540D\u524D\u3092\u5165\u529B\u3057\u3001Enter \u30AD\u30FC\u3092\u62BC\u3057\u3066\u30B3\u30DF\u30C3\u30C8\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u540D\u524D\u3092\u5909\u66F4\u3059\u308B\u306B\u306F {0}\u3001\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u306B\u306F {1}"],"vs/editor/contrib/smartSelect/smartSelect":["\u9078\u629E\u7BC4\u56F2\u3092\u62E1\u5F35","\u9078\u629E\u7BC4\u56F2\u306E\u5C55\u958B(&&E)","\u9078\u629E\u7BC4\u56F2\u3092\u7E2E\u5C0F","\u9078\u629E\u7BC4\u56F2\u306E\u7E2E\u5C0F(&&S)"],"vs/editor/contrib/snippet/snippetVariables":["\u65E5\u66DC\u65E5","\u6708\u66DC\u65E5","\u706B\u66DC\u65E5","\u6C34\u66DC\u65E5","\u6728\u66DC\u65E5","\u91D1\u66DC\u65E5","\u571F\u66DC\u65E5","\u65E5","\u6708","\u706B","\u6C34","\u6728","\u91D1","\u571F","1 \u6708","2 \u6708","3 \u6708","4 \u6708","5 \u6708","6 \u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708","1 \u6708","2 \u6708","3 \u6708","4 \u6708","5 \u6708","6 \u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708"],"vs/editor/contrib/suggest/suggestController":["{1} \u304C\u8FFD\u52A0\u7DE8\u96C6\u3057\u305F '{0}' \u3092\u53D7\u3051\u5165\u308C\u308B","\u5019\u88DC\u3092\u30C8\u30EA\u30AC\u30FC","\u633F\u5165","\u633F\u5165","\u7F6E\u63DB","\u7F6E\u63DB","\u633F\u5165","\u8868\u793A\u3092\u6E1B\u3089\u3059","\u3055\u3089\u306B\u8868\u793A","\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u3092\u30EA\u30BB\u30C3\u30C8"],"vs/editor/contrib/suggest/suggestWidget":["\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u524D\u666F\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u3067\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u80CC\u666F\u8272\u3002","\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u3067\u4E00\u81F4\u3057\u305F\u30CF\u30A4\u30E9\u30A4\u30C8\u306E\u8272\u3002","\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059...","\u5019\u88DC\u306F\u3042\u308A\u307E\u305B\u3093\u3002","{0}\u3001\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8: {1}","\u63D0\u6848"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\u9589\u3058\u308B","\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\u63D0\u6848\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u8A73\u7D30\u60C5\u5831\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u8A73\u7D30\u3092\u53C2\u7167"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\u914D\u5217\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D6\u30FC\u30EB\u5024\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AF\u30E9\u30B9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u8272\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5B9A\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5217\u6319\u5B50\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5217\u6319\u5B50\u30E1\u30F3\u30D0\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30A4\u30D9\u30F3\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A3\u30FC\u30EB\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A9\u30EB\u30C0\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u95A2\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u30EF\u30FC\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30E1\u30BD\u30C3\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30E2\u30B8\u30E5\u30FC\u30EB\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u540D\u524D\u7A7A\u9593\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","Null \u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6570\u5024\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6F14\u7B97\u5B50\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D1\u30C3\u30B1\u30FC\u30B8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D7\u30ED\u30D1\u30C6\u30A3\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u53C2\u7167\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6587\u5B57\u5217\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u69CB\u9020\u4F53\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30C6\u30AD\u30B9\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5358\u4F4D\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5909\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002"],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Tab \u30AD\u30FC\u3092\u5207\u308A\u66FF\u3048\u308B\u3068\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u79FB\u52D5\u3057\u307E\u3059","Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u6B21\u306E\u30D5\u30A9\u30FC\u30AB\u30B9\u53EF\u80FD\u306A\u8981\u7D20\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u79FB\u52D5\u3057\u307E\u3059","Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u30BF\u30D6\u6587\u5B57\u304C\u633F\u5165\u3055\u308C\u307E\u3059"],"vs/editor/contrib/tokenization/tokenization":["\u958B\u767A\u8005: \u30C8\u30FC\u30AF\u30F3\u518D\u4F5C\u6210\u306E\u5F37\u5236"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7","\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F",`\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u306F\u3001\u884C\u533A\u5207\u308A\u6587\u5B57 (LS) \u3084\u6BB5\u843D\u533A\u5207\u308A\u8A18\u53F7 (PS) \u306A\u3069\u306E\u7279\u6B8A\u306A\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u304C 1 \u3064\u4EE5\u4E0A\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\r +\r +\u305D\u308C\u3089\u306E\u7D42\u7AEF\u6587\u5B57\u306F\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u524A\u9664\u3059\u308B\u3053\u3068\u3092\u304A\u52E7\u3081\u3057\u307E\u3059\u3002\u3053\u308C\u306F 'editor.unusualLineTerminators' \u3092\u4F7F\u7528\u3057\u3066\u69CB\u6210\u3067\u304D\u307E\u3059\u3002`,"\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u4FEE\u6B63","\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u554F\u984C\u3092\u7121\u8996\u3059\u308B"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\u5909\u6570\u306E\u8AAD\u307F\u53D6\u308A\u306A\u3069\u3001\u8AAD\u307F\u53D6\u308A\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u80CC\u666F\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u5909\u6570\u3078\u306E\u66F8\u304D\u8FBC\u307F\u306A\u3069\u3001\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u80CC\u666F\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u5909\u6570\u306E\u8AAD\u307F\u53D6\u308A\u306A\u3069\u8AAD\u307F\u53D6\u308A\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5909\u6570\u3078\u306E\u66F8\u304D\u8FBC\u307F\u306A\u3069\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30B7\u30F3\u30DC\u30EB\u306B\u3088\u3063\u3066\u5F37\u8ABF\u8868\u793A\u3055\u308C\u308B\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u30DE\u30FC\u30AB\u30FC\u306E\u8272\u306F\u3001\u57FA\u306B\u306A\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u3088\u3046\u306B\u4E0D\u900F\u660E\u4EE5\u5916\u306B\u3057\u307E\u3059\u3002","\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9 \u30B7\u30F3\u30DC\u30EB\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u6B21\u306E\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u306B\u79FB\u52D5","\u524D\u306E\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u306B\u79FB\u52D5","\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u3092\u30C8\u30EA\u30AC\u30FC"],"vs/editor/contrib/wordOperations/wordOperations":["\u5358\u8A9E\u306E\u524A\u9664"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["\u65E2\u5B9A\u306E\u8A00\u8A9E\u69CB\u6210\u306E\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9","\u8A00\u8A9E\u306B\u5BFE\u3057\u3066\u4E0A\u66F8\u304D\u3055\u308C\u308B\u30A8\u30C7\u30A3\u30BF\u30FC\u8A2D\u5B9A\u3092\u69CB\u6210\u3057\u307E\u3059\u3002","\u3053\u306E\u8A2D\u5B9A\u3067\u306F\u3001\u8A00\u8A9E\u3054\u3068\u306E\u69CB\u6210\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","\u7A7A\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u767B\u9332\u3067\u304D\u307E\u305B\u3093","'{0}' \u3092\u767B\u9332\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u308C\u306F\u3001\u8A00\u8A9E\u56FA\u6709\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u8A2D\u5B9A\u3092\u8A18\u8FF0\u3059\u308B\u30D7\u30ED\u30D1\u30C6\u30A3 \u30D1\u30BF\u30FC\u30F3 '\\\\[.*\\\\]$' \u306B\u4E00\u81F4\u3057\u3066\u3044\u307E\u3059\u3002'configurationDefaults' \u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","'{0}' \u3092\u767B\u9332\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u65E2\u306B\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059\u3002"],"vs/platform/contextkey/browser/contextKeyService":["\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \u30AD\u30FC\u306B\u95A2\u3059\u308B\u60C5\u5831\u3092\u8FD4\u3059\u30B3\u30DE\u30F3\u30C9"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) \u304C\u6E21\u3055\u308C\u307E\u3057\u305F\u30022 \u756A\u76EE\u306E\u30AD\u30FC\u3092\u5F85\u3063\u3066\u3044\u307E\u3059...","\u30AD\u30FC\u306E\u7D44\u307F\u5408\u308F\u305B ({0}\u3001{1}) \u306F\u30B3\u30DE\u30F3\u30C9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002"],"vs/platform/list/browser/listService":["\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Control` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Command` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Alt` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Option` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u9805\u76EE\u3092\u8907\u6570\u9078\u629E\u3059\u308B\u3068\u304D\u306B\u4F7F\u7528\u3059\u308B\u4FEE\u98FE\u30AD\u30FC\u3067\u3059 (\u305F\u3068\u3048\u3070\u3001\u30A8\u30AF\u30B9\u30D7\u30ED\u30FC\u30E9\u30FC\u3067\u30A8\u30C7\u30A3\u30BF\u30FC\u3068 scm \u30D3\u30E5\u30FC\u3092\u958B\u304F\u306A\u3069)\u3002'\u6A2A\u306B\u4E26\u3079\u3066\u958B\u304F' \u30DE\u30A6\u30B9 \u30B8\u30A7\u30B9\u30C1\u30E3\u30FC (\u304C\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u5834\u5408) \u306F\u3001\u8907\u6570\u9078\u629E\u306E\u4FEE\u98FE\u30AD\u30FC\u3068\u7AF6\u5408\u3057\u306A\u3044\u3088\u3046\u306B\u8ABF\u6574\u3055\u308C\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u3001\u30C4\u30EA\u30FC\u3068\u30EA\u30B9\u30C8\u5185\u306E\u9805\u76EE\u3092\u958B\u304F\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059 (\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u5834\u5408)\u3002\u9069\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u3001\u4E00\u90E8\u306E\u30C4\u30EA\u30FC\u3084\u30EA\u30B9\u30C8\u3067\u306F\u3053\u306E\u8A2D\u5B9A\u304C\u7121\u8996\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u304C\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u3067\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u8B66\u544A: \u3053\u306E\u8A2D\u5B9A\u3092\u30AA\u30F3\u306B\u3059\u308B\u3068\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u306B\u5F71\u97FF\u304C\u3042\u308A\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D\u3067\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u3067\u30A4\u30F3\u30B7\u30C7\u30F3\u30C8\u306E\u30AC\u30A4\u30C9\u3092\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u3067\u30B9\u30E0\u30FC\u30BA \u30B9\u30AF\u30ED\u30FC\u30EB\u3092\u4F7F\u7528\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u7C21\u5358\u306A\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3059\u308B\u8981\u7D20\u306B\u7126\u70B9\u3092\u5F53\u3066\u307E\u3059\u3002\u4E00\u81F4\u51E6\u7406\u306F\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u3067\u306E\u307F\u5B9F\u884C\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306E\u5F37\u8ABF\u8868\u793A\u3092\u4F7F\u7528\u3059\u308B\u3068\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3059\u308B\u8981\u7D20\u304C\u5F37\u8ABF\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u4E0A\u304A\u3088\u3073\u4E0B\u3078\u306E\u79FB\u52D5\u306F\u3001\u5F37\u8ABF\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u8981\u7D20\u306E\u307F\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002","\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3067\u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3057\u306A\u3044\u3059\u3079\u3066\u306E\u8981\u7D20\u304C\u30D5\u30A3\u30EB\u30BF\u30FC\u51E6\u7406\u3055\u308C\u3001\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306E\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30B9\u30BF\u30A4\u30EB\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u5358\u7D14\u3001\u5F37\u8ABF\u8868\u793A\u3001\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u3067\u306E\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u3092\u3001\u5358\u306B\u5165\u529B\u3059\u308B\u3060\u3051\u3067\u81EA\u52D5\u7684\u306B\u30C8\u30EA\u30AC\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002`false` \u306B\u8A2D\u5B9A\u3057\u305F\u5834\u5408\u3001\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306F `list.toggleKeyboardNavigation` \u30B3\u30DE\u30F3\u30C9\u3092\u5B9F\u884C\u3057\u305F\u3068\u304D\u306B\u306E\u307F\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u307E\u3059\u3002\u3053\u308C\u306B\u5BFE\u3057\u3066\u30AD\u30FC\u30DC\u30FC\u30C9 \u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u3092\u5272\u308A\u5F53\u3066\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A9\u30EB\u30C0\u30FC\u540D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u3068\u304D\u306B\u30C4\u30EA\u30FC \u30D5\u30A9\u30EB\u30C0\u30FC\u304C\u5C55\u958B\u3055\u308C\u308B\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u9069\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u3001\u4E00\u90E8\u306E\u30C4\u30EA\u30FC\u3084\u30EA\u30B9\u30C8\u3067\u306F\u3053\u306E\u8A2D\u5B9A\u304C\u7121\u8996\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002"],"vs/platform/markers/common/markers":["\u30A8\u30E9\u30FC","\u8B66\u544A","\u60C5\u5831"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\u6700\u8FD1\u4F7F\u7528\u3057\u305F\u3082\u306E","\u305D\u306E\u4ED6\u306E\u30B3\u30DE\u30F3\u30C9","\u30B3\u30DE\u30F3\u30C9 '{0}' \u3067\u30A8\u30E9\u30FC ({1}) \u304C\u767A\u751F\u3057\u307E\u3057\u305F"],"vs/platform/quickinput/browser/helpQuickAccess":["\u30B0\u30ED\u30FC\u30D0\u30EB \u30B3\u30DE\u30F3\u30C9","\u30A8\u30C7\u30A3\u30BF\u30FC \u30B3\u30DE\u30F3\u30C9","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\u5168\u4F53\u306E\u524D\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30E9\u30FC \u30E1\u30C3\u30BB\u30FC\u30B8\u5168\u4F53\u306E\u524D\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306E\u30A2\u30A4\u30B3\u30F3\u306E\u65E2\u5B9A\u306E\u8272\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u8981\u7D20\u306E\u5883\u754C\u7DDA\u5168\u4F53\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u3092\u5F37\u3081\u308B\u305F\u3081\u306B\u3001\u4ED6\u306E\u8981\u7D20\u3068\u9694\u3066\u308B\u8FFD\u52A0\u306E\u5883\u754C\u7DDA\u3002","\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u3092\u5F37\u3081\u308B\u305F\u3081\u306B\u3001\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u4ED6\u8981\u7D20\u3068\u9694\u3066\u308B\u8FFD\u52A0\u306E\u5883\u754C\u7DDA\u3002","\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30EA\u30F3\u30AF\u306E\u524D\u666F\u8272\u3002","\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30B3\u30FC\u30C9 \u30D6\u30ED\u30C3\u30AF\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u691C\u7D22/\u7F6E\u63DB\u7A93\u306A\u3069\u3001\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5F71\u306E\u8272\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u80CC\u666F\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u524D\u666F\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u30A2\u30AF\u30C6\u30A3\u30D6 \u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u5316\u3055\u308C\u305F\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u80CC\u666F\u8272\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u5316\u3055\u308C\u305F\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u524D\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u306E\u80CC\u666F\u3002","\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u306E\u524D\u666F\u3002","\u30DC\u30BF\u30F3\u306E\u524D\u666F\u8272\u3002","\u30DC\u30BF\u30F3\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u6642\u306E\u30DC\u30BF\u30F3\u80CC\u666F\u8272\u3002","\u30D0\u30C3\u30B8\u306E\u80CC\u666F\u8272\u3002\u30D0\u30C3\u30B8\u3068\u306F\u5C0F\u3055\u306A\u60C5\u5831\u30E9\u30D9\u30EB\u306E\u3053\u3068\u3067\u3059\u3002\u4F8B:\u691C\u7D22\u7D50\u679C\u306E\u6570","\u30D0\u30C3\u30B8\u306E\u524D\u666F\u8272\u3002\u30D0\u30C3\u30B8\u3068\u306F\u5C0F\u3055\u306A\u60C5\u5831\u30E9\u30D9\u30EB\u306E\u3053\u3068\u3067\u3059\u3002\u4F8B:\u691C\u7D22\u7D50\u679C\u306E\u6570","\u30D3\u30E5\u30FC\u304C\u30B9\u30AF\u30ED\u30FC\u30EB\u3055\u308C\u305F\u3053\u3068\u3092\u793A\u3059\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC\u306E\u5F71\u3002","\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC\u306E\u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u6642\u306E\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC \u30B9\u30E9\u30A4\u30C0\u30FC\u80CC\u666F\u8272\u3002","\u30AF\u30EA\u30C3\u30AF\u6642\u306E\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC \u30B9\u30E9\u30A4\u30C0\u30FC\u80CC\u666F\u8272\u3002","\u6642\u9593\u306E\u304B\u304B\u308B\u64CD\u4F5C\u3067\u8868\u793A\u3059\u308B\u30D7\u30ED\u30B0\u30EC\u30B9 \u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30A8\u30E9\u30FC \u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A8\u30E9\u30FC\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30A8\u30E9\u30FC \u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u8B66\u544A\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u8B66\u544A\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u8B66\u544A\u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u60C5\u5831\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u60C5\u5831\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u60C5\u5831\u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30D2\u30F3\u30C8\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30D2\u30F3\u30C8 \u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u65E2\u5B9A\u306E\u524D\u666F\u8272\u3002","\u691C\u7D22/\u7F6E\u63DB\u7A93\u306A\u3069\u3001\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u691C\u7D22/\u7F6E\u63DB\u306A\u3069\u3092\u884C\u3046\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u8272\u3002\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u5883\u754C\u7DDA\u304C\u3042\u308A\u3001\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3088\u3063\u3066\u914D\u8272\u3092\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3067\u306E\u307F\u3053\u306E\u914D\u8272\u306F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u5909\u66F4\u30D0\u30FC\u306E\u5883\u754C\u7DDA\u8272\u3002\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u30B5\u30A4\u30BA\u5909\u66F4\u306E\u5883\u754C\u7DDA\u304C\u3042\u308A\u3001\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3088\u3063\u3066\u914D\u8272\u3092\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3067\u306E\u307F\u3053\u306E\u914D\u8272\u306F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC\u306E\u80CC\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC\u306E\u524D\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u306E\u30BF\u30A4\u30C8\u30EB\u306E\u80CC\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30AF\u30A4\u30C3\u30AF\u9078\u629E\u306E\u80CC\u666F\u8272\u3002","\u30E9\u30D9\u30EB\u3092\u30B0\u30EB\u30FC\u30D7\u5316\u3059\u308B\u305F\u3081\u306E\u30AF\u30EA\u30C3\u30AF\u9078\u629E\u306E\u8272\u3002","\u5883\u754C\u7DDA\u3092\u30B0\u30EB\u30FC\u30D7\u5316\u3059\u308B\u305F\u3081\u306E\u30AF\u30A4\u30C3\u30AF\u9078\u629E\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u8272\u3002","\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30C6\u30AD\u30B9\u30C8\u306E\u8272\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u306E\u540C\u3058\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u9818\u57DF\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u3068\u540C\u3058\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u73FE\u5728\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u8272\u3002","\u305D\u306E\u4ED6\u306E\u691C\u7D22\u6761\u4EF6\u306B\u4E00\u81F4\u3059\u308B\u9805\u76EE\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u691C\u7D22\u3092\u5236\u9650\u3059\u308B\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u73FE\u5728\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u4ED6\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u691C\u7D22\u3092\u5236\u9650\u3059\u308B\u7BC4\u56F2\u306E\u5883\u754C\u7DDA\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30DB\u30D0\u30FC\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u8A9E\u306E\u4E0B\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DB\u30D0\u30FC\u306E\u30B9\u30C6\u30FC\u30BF\u30B9 \u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30F3\u30AF\u306E\u8272\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u524D\u666F\u8272","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u80CC\u666F\u8272","\u96FB\u7403\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3059\u308B\u8272\u3002","\u81EA\u52D5\u4FEE\u6B63\u306E\u96FB\u7403\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A2\u30A4\u30B3\u30F3\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u633F\u5165\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u524A\u9664\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u633F\u5165\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u8F2A\u90ED\u306E\u8272\u3002","\u524A\u9664\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u8F2A\u90ED\u306E\u8272\u3002","2 \u3064\u306E\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9593\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5BFE\u89D2\u7DDA\u306E\u5857\u308A\u3064\u3076\u3057\u8272\u3002\u5BFE\u89D2\u7DDA\u306E\u5857\u308A\u3064\u3076\u3057\u306F\u3001\u6A2A\u306B\u4E26\u3079\u3066\u6BD4\u8F03\u3059\u308B\u30D3\u30E5\u30FC\u3067\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u5834\u5408\u306E\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306B\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306B\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u5834\u5408\u306E\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306B\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306B\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u30DB\u30D0\u30FC\u3059\u308B\u3068\u304D\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u30DB\u30D0\u30FC\u3059\u308B\u3068\u304D\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u79FB\u52D5\u3059\u308B\u3068\u304D\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8 \u30C9\u30E9\u30C3\u30B0 \u30A2\u30F3\u30C9 \u30C9\u30ED\u30C3\u30D7\u306E\u80CC\u666F\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u5185\u3092\u691C\u7D22\u3057\u3066\u3044\u308B\u3068\u304D\u3001\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002","\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A7\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002","\u4E00\u81F4\u9805\u76EE\u304C\u306A\u3044\u5834\u5408\u306E\u3001\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u30C4\u30EA\u30FC \u30B9\u30C8\u30ED\u30FC\u30AF\u306E\u8272\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u30C4\u30EA\u30FC \u30B9\u30C8\u30ED\u30FC\u30AF\u306E\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u524D\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u80CC\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u524D\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u80CC\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u5185\u306E\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8 tabstop \u306E\u80CC\u666F\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8 tabstop \u306E\u5883\u754C\u7DDA\u306E\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u6700\u5F8C\u306E tabstop \u306E\u80CC\u666F\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u6700\u5F8C\u306E\u30BF\u30D6\u30B9\u30C8\u30C3\u30D7\u3067\u5883\u754C\u7DDA\u306E\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u691C\u51FA\u3055\u308C\u305F\u4E00\u81F4\u9805\u76EE\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u4E00\u81F4\u3092\u691C\u7D22\u3059\u308B\u305F\u3081\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u8B66\u544A\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u80CC\u666F\u8272\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u30EA\u30F3\u30B0\u6642\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u3068\u304D\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u554F\u984C\u306E\u30A8\u30E9\u30FC \u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u554F\u984C\u306E\u8B66\u544A\u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u554F\u984C\u60C5\u5831\u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002"],"vs/platform/theme/common/iconRegistry":["\u4F7F\u7528\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u306E ID\u3002\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306F\u3001\u6700\u521D\u306B\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u308B\u30D5\u30A9\u30F3\u30C8\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A2\u30A4\u30B3\u30F3\u5B9A\u7FA9\u306B\u95A2\u9023\u4ED8\u3051\u3089\u308C\u305F\u30D5\u30A9\u30F3\u30C8\u6587\u5B57\u3002","\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3042\u308B\u9589\u3058\u308B\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u30A2\u30A4\u30B3\u30F3\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u6B21\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u9589\u3058\u3089\u308C\u3001\u30C7\u30A3\u30B9\u30AF\u4E0A\u3067\u5909\u66F4\u3055\u308C\u307E\u3057\u305F: {0}\u3002","\u4EE5\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u4E92\u63DB\u6027\u306E\u306A\u3044\u65B9\u6CD5\u3067\u5909\u66F4\u3055\u308C\u307E\u3057\u305F: {0}\u3002","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","{1} \u306B\u5909\u66F4\u304C\u52A0\u3048\u3089\u308C\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F","{1} \u3067\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u305D\u306E\u671F\u9593\u306B\u5B9F\u884C\u4E2D\u3067\u3042\u3063\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u3057\u307E\u3059\u304B?","{0} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u3067\u5143\u306B\u623B\u3059","\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u5143\u306B\u623B\u3059","\u30AD\u30E3\u30F3\u30BB\u30EB","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001'{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","'{0}' \u3092\u5143\u306B\u623B\u3057\u307E\u3059\u304B?","\u5143\u306B\u623B\u3059","\u30AD\u30E3\u30F3\u30BB\u30EB","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u3084\u308A\u76F4\u3057\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u3084\u308A\u76F4\u3057\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","{1} \u306B\u5909\u66F4\u304C\u52A0\u3048\u3089\u308C\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u518D\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","{1} \u3067\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u305D\u306E\u671F\u9593\u306B\u5B9F\u884C\u4E2D\u3067\u3042\u3063\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001'{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"]}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js new file mode 100644 index 0000000000..2286f815ae --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js @@ -0,0 +1 @@ +define("vs/editor/editor.main.nls",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["input"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Match Case","Match Whole Word","Use Regular Expression"],"vs/base/browser/ui/findinput/replaceInput":["input","Preserve Case"],"vs/base/browser/ui/iconLabel/iconLabel":["Loading..."],"vs/base/browser/ui/inputbox/inputBox":["Error: {0}","Warning: {0}","Info: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Unbound"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["Clear","Disable Filter on Type","Enable Filter on Type","No elements found","Matched {0} out of {1} elements"],"vs/base/common/actions":["(empty)"],"vs/base/common/errorMessage":["{0}: {1}","A system error occurred ({0})","An unknown error occurred. Please consult the log for more details.","An unknown error occurred. Please consult the log for more details.","{0} ({1} errors in total)","An unknown error occurred. Please consult the log for more details."],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","Super","Control","Shift","Alt","Command","Control","Shift","Alt","Windows","Control","Shift","Alt","Super"],"vs/base/parts/quickinput/browser/quickInput":["Back","{0}/{1}","Type to narrow down results.","{0} Results","{0} Selected","OK","Custom","Back ({0})","Back"],"vs/base/parts/quickinput/browser/quickInputList":["Quick Input"],"vs/editor/browser/controller/coreCommands":["Stick to the end even when going to longer lines","Stick to the end even when going to longer lines"],"vs/editor/browser/controller/textAreaHandler":["editor","The editor is not accessible at this time. Press {0} for options."],"vs/editor/browser/core/keybindingCancellation":["Whether the editor runs a cancellable operation, e.g. like 'Peek References'"],"vs/editor/browser/editorExtensions":["&&Undo","Undo","&&Redo","Redo","&&Select All","Select All"],"vs/editor/browser/widget/codeEditorWidget":["The number of cursors has been limited to {0}."],"vs/editor/browser/widget/diffEditorWidget":["Line decoration for inserts in the diff editor.","Line decoration for removals in the diff editor.","Cannot compare files because one file is too large."],"vs/editor/browser/widget/diffReview":["Icon for 'Insert' in diff review.","Icon for 'Remove' in diff review.","Icon for 'Close' in diff review.","Close","no lines changed","1 line changed","{0} lines changed","Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}","blank","{0} unchanged line {1}","{0} original line {1} modified line {2}","+ {0} modified line {1}","- {0} original line {1}","Go to Next Difference","Go to Previous Difference"],"vs/editor/browser/widget/inlineDiffMargin":["Copy deleted lines","Copy deleted line","Copy deleted line ({0})","Revert this change","Copy deleted line ({0})"],"vs/editor/common/config/commonEditorConfig":["Editor","The number of spaces a tab is equal to. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.","Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.","Controls whether `#editor.tabSize#` and `#editor.insertSpaces#` will be automatically detected when a file is opened based on the file contents.","Remove trailing auto inserted whitespace.","Special handling for large files to disable certain memory intensive features.","Controls whether completions should be computed based on words in the document.","Only suggest words from the active document.","Suggest words from all open documents of the same language.","Suggest words from all open documents.","Controls from what documents word based completions are computed.","Semantic highlighting enabled for all color themes.","Semantic highlighting disabled for all color themes.","Semantic highlighting is configured by the current color theme's `semanticHighlighting` setting.","Controls whether the semanticHighlighting is shown for the languages that support it.","Keep peek editors open even when double clicking their content or when hitting `Escape`.","Lines above this length will not be tokenized for performance reasons","Timeout in milliseconds after which diff computation is cancelled. Use 0 for no timeout.","Controls whether the diff editor shows the diff side by side or inline.","When enabled, the diff editor ignores changes in leading or trailing whitespace.","Controls whether the diff editor shows +/- indicators for added/removed changes.","Controls whether the editor shows CodeLens.","Lines will never wrap.","Lines will wrap at the viewport width.","Lines will wrap according to the `#editor.wordWrap#` setting."],"vs/editor/common/config/editorOptions":["The editor will use platform APIs to detect when a Screen Reader is attached.","The editor will be permanently optimized for usage with a Screen Reader. Word wrapping will be disabled.","The editor will never be optimized for usage with a Screen Reader.","Controls whether the editor should run in a mode where it is optimized for screen readers. Setting to on will disable word wrapping.","Controls whether a space character is inserted when commenting.","Controls if empty lines should be ignored with toggle, add or remove actions for line comments.","Controls whether copying without a selection copies the current line.","Controls whether the cursor should jump to find matches while typing.","Controls whether the search string in the Find Widget is seeded from the editor selection.","Never turn on Find in selection automatically (default)","Always turn on Find in selection automatically","Turn on Find in selection automatically when multiple lines of content are selected.","Controls the condition for turning on find in selection automatically.","Controls whether the Find Widget should read or modify the shared find clipboard on macOS.","Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.","Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.","Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.","Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.","Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property.","Controls the font size in pixels.",'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.','Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.',"Show peek view of the results (default)","Go to the primary result and show a peek view","Go to the primary result and enable peek-less navigation to others","This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.","Controls the behavior the 'Go to Definition'-command when multiple target locations exist.","Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist.","Controls the behavior the 'Go to Declaration'-command when multiple target locations exist.","Controls the behavior the 'Go to Implementations'-command when multiple target locations exist.","Controls the behavior the 'Go to References'-command when multiple target locations exist.","Alternative command id that is being executed when the result of 'Go to Definition' is the current location.","Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.","Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.","Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.","Alternative command id that is being executed when the result of 'Go to Reference' is the current location.","Controls whether the hover is shown.","Controls the delay in milliseconds after which the hover is shown.","Controls whether the hover should remain visible when mouse is moved over it.","Enables the code action lightbulb in the editor.","Enables the inline hints in the editor.","Controls font size of inline hints in the editor. When set to `0`, the 90% of `#editor.fontSize#` is used.","Controls font family of inline hints in the editor.","Controls the line height. Use 0 to compute the line height from the font size.","Controls whether the minimap is shown.","The minimap has the same size as the editor contents (and might scroll).","The minimap will stretch or shrink as necessary to fill the height of the editor (no scrolling).","The minimap will shrink as necessary to never be larger than the editor (no scrolling).","Controls the size of the minimap.","Controls the side where to render the minimap.","Controls when the minimap slider is shown.","Scale of content drawn in the minimap: 1, 2 or 3.","Render the actual characters on a line as opposed to color blocks.","Limit the width of the minimap to render at most a certain number of columns.","Controls the amount of space between the top edge of the editor and the first line.","Controls the amount of space between the bottom edge of the editor and the last line.","Enables a pop-up that shows parameter documentation and type information as you type.","Controls whether the parameter hints menu cycles or closes when reaching the end of the list.","Enable quick suggestions inside strings.","Enable quick suggestions inside comments.","Enable quick suggestions outside of strings and comments.","Controls whether suggestions should automatically show up while typing.","Line numbers are not rendered.","Line numbers are rendered as absolute number.","Line numbers are rendered as distance in lines to cursor position.","Line numbers are rendered every 10 lines.","Controls the display of line numbers.","Number of monospace characters at which this editor ruler will render.","Color of this editor ruler.","Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.","Insert suggestion without overwriting text right of the cursor.","Insert suggestion and overwrite text right of the cursor.","Controls whether words are overwritten when accepting completions. Note that this depends on extensions opting into this feature.","Controls whether filtering and sorting suggestions accounts for small typos.","Controls whether sorting favours words that appear close to the cursor.","Controls whether remembered suggestion selections are shared between multiple workspaces and windows (needs `#editor.suggestSelection#`).","Controls whether an active snippet prevents quick suggestions.","Controls whether to show or hide icons in suggestions.","Controls the visibility of the status bar at the bottom of the suggest widget.","Controls whether suggest details show inline with the label or only in the details widget","This setting is deprecated. The suggest widget can now be resized.","This setting is deprecated, please use separate settings like 'editor.suggest.showKeywords' or 'editor.suggest.showSnippets' instead.","When enabled IntelliSense shows `method`-suggestions.","When enabled IntelliSense shows `function`-suggestions.","When enabled IntelliSense shows `constructor`-suggestions.","When enabled IntelliSense shows `field`-suggestions.","When enabled IntelliSense shows `variable`-suggestions.","When enabled IntelliSense shows `class`-suggestions.","When enabled IntelliSense shows `struct`-suggestions.","When enabled IntelliSense shows `interface`-suggestions.","When enabled IntelliSense shows `module`-suggestions.","When enabled IntelliSense shows `property`-suggestions.","When enabled IntelliSense shows `event`-suggestions.","When enabled IntelliSense shows `operator`-suggestions.","When enabled IntelliSense shows `unit`-suggestions.","When enabled IntelliSense shows `value`-suggestions.","When enabled IntelliSense shows `constant`-suggestions.","When enabled IntelliSense shows `enum`-suggestions.","When enabled IntelliSense shows `enumMember`-suggestions.","When enabled IntelliSense shows `keyword`-suggestions.","When enabled IntelliSense shows `text`-suggestions.","When enabled IntelliSense shows `color`-suggestions.","When enabled IntelliSense shows `file`-suggestions.","When enabled IntelliSense shows `reference`-suggestions.","When enabled IntelliSense shows `customcolor`-suggestions.","When enabled IntelliSense shows `folder`-suggestions.","When enabled IntelliSense shows `typeParameter`-suggestions.","When enabled IntelliSense shows `snippet`-suggestions.","When enabled IntelliSense shows `user`-suggestions.","When enabled IntelliSense shows `issues`-suggestions.","Whether leading and trailing whitespace should always be selected.","Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.","Only accept a suggestion with `Enter` when it makes a textual change.","Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.","Controls the number of lines in the editor that can be read out by a screen reader. Warning: this has a performance implication for numbers larger than the default.","Editor content","Use language configurations to determine when to autoclose brackets.","Autoclose brackets only when the cursor is to the left of whitespace.","Controls whether the editor should automatically close brackets after the user adds an opening bracket.","Type over closing quotes or brackets only if they were automatically inserted.","Controls whether the editor should type over closing quotes or brackets.","Use language configurations to determine when to autoclose quotes.","Autoclose quotes only when the cursor is to the left of whitespace.","Controls whether the editor should automatically close quotes after the user adds an opening quote.","The editor will not insert indentation automatically.","The editor will keep the current line's indentation.","The editor will keep the current line's indentation and honor language defined brackets.","The editor will keep the current line's indentation, honor language defined brackets and invoke special onEnterRules defined by languages.","The editor will keep the current line's indentation, honor language defined brackets, invoke special onEnterRules defined by languages, and honor indentationRules defined by languages.","Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.","Use language configurations to determine when to automatically surround selections.","Surround with quotes but not brackets.","Surround with brackets but not quotes.","Controls whether the editor should automatically surround selections when typing quotes or brackets.","Emulate selection behaviour of tab characters when using spaces for indentation. Selection will stick to tab stops.","Controls whether the editor shows CodeLens.","Controls the font family for CodeLens.","Controls the font size in pixels for CodeLens. When set to `0`, the 90% of `#editor.fontSize#` is used.","Controls whether the editor should render the inline color decorators and color picker.","Enable that the selection with the mouse and keys is doing column selection.","Controls whether syntax highlighting should be copied into the clipboard.","Control the cursor animation style.","Controls whether the smooth caret animation should be enabled.","Controls the cursor style.","Controls the minimal number of visible leading and trailing lines surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.","`cursorSurroundingLines` is enforced only when triggered via the keyboard or API.","`cursorSurroundingLines` is enforced always.","Controls when `cursorSurroundingLines` should be enforced.","Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.","Controls whether the editor should allow moving selections via drag and drop.","Scrolling speed multiplier when pressing `Alt`.","Controls whether the editor has code folding enabled.","Use a language-specific folding strategy if available, else the indentation-based one.","Use the indentation-based folding strategy.","Controls the strategy for computing folding ranges.","Controls whether the editor should highlight folded ranges.","Controls whether clicking on the empty content after a folded line will unfold the line.","Controls the font family.","Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.","Controls whether the editor should automatically format the line after typing.","Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.","Controls whether the cursor should be hidden in the overview ruler.","Controls whether the editor should highlight the active indent guide.","Controls the letter spacing in pixels.","Controls whether the editor has linked editing enabled. Depending on the language, related symbols, e.g. HTML tags, are updated while editing.","Controls whether the editor should detect links and make them clickable.","Highlight matching brackets.","A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.","Zoom the font of the editor when using mouse wheel and holding `Ctrl`.","Merge multiple cursors when they are overlapping.","Maps to `Control` on Windows and Linux and to `Command` on macOS.","Maps to `Alt` on Windows and Linux and to `Option` on macOS.","The modifier to be used to add multiple cursors with the mouse. The Go To Definition and Open Link mouse gestures will adapt such that they do not conflict with the multicursor modifier. [Read more](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Each cursor pastes a single line of the text.","Each cursor pastes the full text.","Controls pasting when the line count of the pasted text matches the cursor count.","Controls whether the editor should highlight semantic symbol occurrences.","Controls whether a border should be drawn around the overview ruler.","Focus the tree when opening peek","Focus the editor when opening peek","Controls whether to focus the inline editor or the tree in the peek widget.","Controls whether the Go to Definition mouse gesture always opens the peek widget.","Controls the delay in milliseconds after which quick suggestions will show up.","Controls whether the editor auto renames on type.","Deprecated, use `editor.linkedEditing` instead.","Controls whether the editor should render control characters.","Controls whether the editor should render indent guides.","Render last line number when the file ends with a newline.","Highlights both the gutter and the current line.","Controls how the editor should render the current line highlight.","Controls if the editor should render the current line highlight only when the editor is focused","Render whitespace characters except for single spaces between words.","Render whitespace characters only on selected text.","Render only trailing whitespace characters","Controls how the editor should render whitespace characters.","Controls whether selections should have rounded corners.","Controls the number of extra characters beyond which the editor will scroll horizontally.","Controls whether the editor will scroll beyond the last line.","Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.","Controls whether the Linux primary clipboard should be supported.","Controls whether the editor should highlight matches similar to the selection.","Always show the folding controls.","Only show the folding controls when the mouse is over the gutter.","Controls when the folding controls on the gutter are shown.","Controls fading out of unused code.","Controls strikethrough deprecated variables.","Show snippet suggestions on top of other suggestions.","Show snippet suggestions below other suggestions.","Show snippets suggestions with other suggestions.","Do not show snippet suggestions.","Controls whether snippets are shown with other suggestions and how they are sorted.","Controls whether the editor will scroll using an animation.","Font size for the suggest widget. When set to `0`, the value of `#editor.fontSize#` is used.","Line height for the suggest widget. When set to `0`, the value of `#editor.lineHeight#` is used. The minimum value is 8.","Controls whether suggestions should automatically show up when typing trigger characters.","Always select the first suggestion.","Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently.","Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`.","Controls how suggestions are pre-selected when showing the suggest list.","Tab complete will insert the best matching suggestion when pressing tab.","Disable tab completions.","Tab complete snippets when their prefix match. Works best when 'quickSuggestions' aren't enabled.","Enables tab completions.","Unusual line terminators are automatically removed.","Unusual line terminators are ignored.","Unusual line terminators prompt to be removed.","Remove unusual line terminators that might cause problems.","Inserting and deleting whitespace follows tab stops.","Characters that will be used as word separators when doing word related navigations or operations.","Lines will never wrap.","Lines will wrap at the viewport width.","Lines will wrap at `#editor.wordWrapColumn#`.","Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`.","Controls how lines should wrap.","Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.","No indentation. Wrapped lines begin at column 1.","Wrapped lines get the same indentation as the parent.","Wrapped lines get +1 indentation toward the parent.","Wrapped lines get +2 indentation toward the parent.","Controls the indentation of wrapped lines.","Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width.","Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.","Controls the algorithm that computes wrapping points."],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["Typing"],"vs/editor/common/modes/modesRegistry":["Plain Text"],"vs/editor/common/standaloneStrings":["No selection","Line {0}, Column {1} ({2} selected)","Line {0}, Column {1}","{0} selections ({1} characters selected)","{0} selections","Now changing the setting `accessibilitySupport` to 'on'.","Now opening the Editor Accessibility documentation page."," in a read-only pane of a diff editor."," in a pane of a diff editor."," in a read-only code editor"," in a code editor","To configure the editor to be optimized for usage with a Screen Reader press Command+E now.","To configure the editor to be optimized for usage with a Screen Reader press Control+E now.","The editor is configured to be optimized for usage with a Screen Reader.","The editor is configured to never be optimized for usage with a Screen Reader, which is not the case at this time.","Pressing Tab in the current editor will move focus to the next focusable element. Toggle this behavior by pressing {0}.","Pressing Tab in the current editor will move focus to the next focusable element. The command {0} is currently not triggerable by a keybinding.","Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}.","Pressing Tab in the current editor will insert the tab character. The command {0} is currently not triggerable by a keybinding.","Press Command+H now to open a browser window with more information related to editor accessibility.","Press Control+H now to open a browser window with more information related to editor accessibility.","You can dismiss this tooltip and return to the editor by pressing Escape or Shift+Escape.","Show Accessibility Help","Developer: Inspect Tokens","Go to Line/Column...","Show all Quick Access Providers","Command Palette","Show And Run Commands","Go to Symbol...","Go to Symbol by Category...","Editor content","Press Alt+F1 for Accessibility Options.","Toggle High Contrast Theme","Made {0} edits in {1} files"],"vs/editor/common/view/editorColorRegistry":["Background color for the highlight of line at the cursor position.","Background color for the border around the line at the cursor position.","Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations.","Background color of the border around highlighted ranges.","Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations.","Background color of the border around highlighted symbols.","Color of the editor cursor.","The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.","Color of whitespace characters in the editor.","Color of the editor indentation guides.","Color of the active editor indentation guides.","Color of editor line numbers.","Color of editor active line number","Id is deprecated. Use 'editorLineNumber.activeForeground' instead.","Color of editor active line number","Color of the editor rulers.","Foreground color of editor CodeLens","Background color behind matching brackets","Color for matching brackets boxes","Color of the overview ruler border.","Background color of the editor overview ruler. Only used when the minimap is enabled and placed on the right side of the editor.","Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.","Border color of unnecessary (unused) source code in the editor.","Opacity of unnecessary (unused) source code in the editor. For example, \"#000000c0\" will render the code with 75% opacity. For high contrast themes, use the 'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.","Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for errors.","Overview ruler marker color for warnings.","Overview ruler marker color for infos."],"vs/editor/contrib/anchorSelect/anchorSelect":["Selection Anchor","Anchor set at {0}:{1}","Set Selection Anchor","Go to Selection Anchor","Select from Anchor to Cursor","Cancel Selection Anchor"],"vs/editor/contrib/bracketMatching/bracketMatching":["Overview ruler marker color for matching brackets.","Go to Bracket","Select to Bracket","Go to &&Bracket"],"vs/editor/contrib/caretOperations/caretOperations":["Move Selected Text Left","Move Selected Text Right"],"vs/editor/contrib/caretOperations/transpose":["Transpose Letters"],"vs/editor/contrib/clipboard/clipboard":["Cu&&t","Cut","Cut","&&Copy","Copy","Copy","&&Paste","Paste","Paste","Copy With Syntax Highlighting"],"vs/editor/contrib/codeAction/codeActionCommands":["Kind of the code action to run.","Controls when the returned actions are applied.","Always apply the first returned code action.","Apply the first returned code action if it is the only one.","Do not apply the returned code actions.","Controls if only preferred code actions should be returned.","An unknown error occurred while applying the code action","Quick Fix...","No code actions available","No preferred code actions for '{0}' available","No code actions for '{0}' available","No preferred code actions available","No code actions available","Refactor...","No preferred refactorings for '{0}' available","No refactorings for '{0}' available","No preferred refactorings available","No refactorings available","Source Action...","No preferred source actions for '{0}' available","No source actions for '{0}' available","No preferred source actions available","No source actions available","Organize Imports","No organize imports action available","Fix All","No fix all action available","Auto Fix...","No auto fixes available"],"vs/editor/contrib/codeAction/lightBulbWidget":["Show Fixes. Preferred Fix Available ({0})","Show Fixes ({0})","Show Fixes"],"vs/editor/contrib/codelens/codelensController":["Show CodeLens Commands For Current Line"],"vs/editor/contrib/comment/comment":["Toggle Line Comment","&&Toggle Line Comment","Add Line Comment","Remove Line Comment","Toggle Block Comment","Toggle &&Block Comment"],"vs/editor/contrib/contextmenu/contextmenu":["Show Editor Context Menu"],"vs/editor/contrib/cursorUndo/cursorUndo":["Cursor Undo","Cursor Redo"],"vs/editor/contrib/find/findController":["Find","&&Find","Find With Selection","Find Next","Find Next","Find Previous","Find Previous","Find Next Selection","Find Previous Selection","Replace","&&Replace"],"vs/editor/contrib/find/findWidget":["Icon for 'Find in Selection' in the editor find widget.","Icon to indicate that the editor find widget is collapsed.","Icon to indicate that the editor find widget is expanded.","Icon for 'Replace' in the editor find widget.","Icon for 'Replace All' in the editor find widget.","Icon for 'Find Previous' in the editor find widget.","Icon for 'Find Next' in the editor find widget.","Find","Find","Previous match","Next match","Find in selection","Close","Replace","Replace","Replace","Replace All","Toggle Replace mode","Only the first {0} results are highlighted, but all find operations work on the entire text.","{0} of {1}","No results","{0} found","{0} found for '{1}'","{0} found for '{1}', at {2}","{0} found for '{1}'","Ctrl+Enter now inserts line break instead of replacing all. You can modify the keybinding for editor.action.replaceAll to override this behavior."],"vs/editor/contrib/folding/folding":["Unfold","Unfold Recursively","Fold","Toggle Fold","Fold Recursively","Fold All Block Comments","Fold All Regions","Unfold All Regions","Fold All","Unfold All","Fold Level {0}","Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations.","Color of the folding control in the editor gutter."],"vs/editor/contrib/folding/foldingDecorations":["Icon for expanded ranges in the editor glyph margin.","Icon for collapsed ranges in the editor glyph margin."],"vs/editor/contrib/fontZoom/fontZoom":["Editor Font Zoom In","Editor Font Zoom Out","Editor Font Zoom Reset"],"vs/editor/contrib/format/format":["Made 1 formatting edit on line {0}","Made {0} formatting edits on line {1}","Made 1 formatting edit between lines {0} and {1}","Made {0} formatting edits between lines {1} and {2}"],"vs/editor/contrib/format/formatActions":["Format Document","Format Selection"],"vs/editor/contrib/gotoError/gotoError":["Go to Next Problem (Error, Warning, Info)","Icon for goto next marker.","Go to Previous Problem (Error, Warning, Info)","Icon for goto previous marker.","Go to Next Problem in Files (Error, Warning, Info)","Next &&Problem","Go to Previous Problem in Files (Error, Warning, Info)","Previous &&Problem"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Error","Warning","Info","Hint","{0} at {1}. ","{0} of {1} problems","{0} of {1} problem","Editor marker navigation widget error color.","Editor marker navigation widget warning color.","Editor marker navigation widget info color.","Editor marker navigation widget background."],"vs/editor/contrib/gotoSymbol/goToCommands":["Peek","Definitions","No definition found for '{0}'","No definition found","Go to Definition","Go to &&Definition","Open Definition to the Side","Peek Definition","Declarations","No declaration found for '{0}'","No declaration found","Go to Declaration","Go to &&Declaration","No declaration found for '{0}'","No declaration found","Peek Declaration","Type Definitions","No type definition found for '{0}'","No type definition found","Go to Type Definition","Go to &&Type Definition","Peek Type Definition","Implementations","No implementation found for '{0}'","No implementation found","Go to Implementations","Go to &&Implementations","Peek Implementations","No references found for '{0}'","No references found","Go to References","Go to &&References","References","Peek References","References","Go To Any Symbol","Locations","No results for '{0}'","References"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Click to show {0} definitions."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Loading...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} references","{0} reference","References"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["no preview available","No results","References"],"vs/editor/contrib/gotoSymbol/referencesModel":["symbol in {0} on line {1} at column {2}","symbol in {0} on line {1} at column {2}, {3}","1 symbol in {0}, full path {1}","{0} symbols in {1}, full path {2}","No results found","Found 1 symbol in {0}","Found {0} symbols in {1}","Found {0} symbols in {1} files"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["Symbol {0} of {1}, {2} for next","Symbol {0} of {1}"],"vs/editor/contrib/hover/hover":["Show Hover","Show Definition Preview Hover"],"vs/editor/contrib/hover/markdownHoverParticipant":["Loading..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","No quick fixes available","Checking for quick fixes...","No quick fixes available","Quick Fix..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Replace with Previous Value","Replace with Next Value"],"vs/editor/contrib/indentation/indentation":["Convert Indentation to Spaces","Convert Indentation to Tabs","Configured Tab Size","Select Tab Size for Current File","Indent Using Tabs","Indent Using Spaces","Detect Indentation from Content","Reindent Lines","Reindent Selected Lines"],"vs/editor/contrib/linesOperations/linesOperations":["Copy Line Up","&&Copy Line Up","Copy Line Down","Co&&py Line Down","Duplicate Selection","&&Duplicate Selection","Move Line Up","Mo&&ve Line Up","Move Line Down","Move &&Line Down","Sort Lines Ascending","Sort Lines Descending","Trim Trailing Whitespace","Delete Line","Indent Line","Outdent Line","Insert Line Above","Insert Line Below","Delete All Left","Delete All Right","Join Lines","Transpose characters around the cursor","Transform to Uppercase","Transform to Lowercase","Transform to Title Case","Transform to Snake Case"],"vs/editor/contrib/linkedEditing/linkedEditing":["Start Linked Editing","Background color when the editor auto renames on type."],"vs/editor/contrib/links/links":["Execute command","Follow link","cmd + click","ctrl + click","option + click","alt + click","Execute command {0}","Failed to open this link because it is not well-formed: {0}","Failed to open this link because its target is missing.","Open Link"],"vs/editor/contrib/message/messageController":["Whether the editor is currently showing an inline message","Cannot edit in read-only editor"],"vs/editor/contrib/multicursor/multicursor":["Add Cursor Above","&&Add Cursor Above","Add Cursor Below","A&&dd Cursor Below","Add Cursors to Line Ends","Add C&&ursors to Line Ends","Add Cursors To Bottom","Add Cursors To Top","Add Selection To Next Find Match","Add &&Next Occurrence","Add Selection To Previous Find Match","Add P&&revious Occurrence","Move Last Selection To Next Find Match","Move Last Selection To Previous Find Match","Select All Occurrences of Find Match","Select All &&Occurrences","Change All Occurrences"],"vs/editor/contrib/parameterHints/parameterHints":["Trigger Parameter Hints"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Icon for show next parameter hint.","Icon for show previous parameter hint.","{0}, hint"],"vs/editor/contrib/peekView/peekView":["Close","Background color of the peek view title area.","Color of the peek view title.","Color of the peek view title info.","Color of the peek view borders and arrow.","Background color of the peek view result list.","Foreground color for line nodes in the peek view result list.","Foreground color for file nodes in the peek view result list.","Background color of the selected entry in the peek view result list.","Foreground color of the selected entry in the peek view result list.","Background color of the peek view editor.","Background color of the gutter in the peek view editor.","Match highlight color in the peek view result list.","Match highlight color in the peek view editor.","Match highlight border in the peek view editor."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["Open a text editor first to go to a line.","Go to line {0} and column {1}.","Go to line {0}.","Current Line: {0}, Character: {1}. Type a line number between 1 and {2} to navigate to.","Current Line: {0}, Character: {1}. Type a line number to navigate to."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["To go to a symbol, first open a text editor with symbol information.","The active text editor does not provide symbol information.","No matching editor symbols","No editor symbols","Open to the Side","Open to the Bottom","symbols ({0})","properties ({0})","methods ({0})","functions ({0})","constructors ({0})","variables ({0})","classes ({0})","structs ({0})","events ({0})","operators ({0})","interfaces ({0})","namespaces ({0})","packages ({0})","type parameters ({0})","modules ({0})","properties ({0})","enumerations ({0})","enumeration members ({0})","strings ({0})","files ({0})","arrays ({0})","numbers ({0})","booleans ({0})","objects ({0})","keys ({0})","fields ({0})","constants ({0})"],"vs/editor/contrib/rename/rename":["No result.","An unknown error occurred while resolving rename location","Renaming '{0}'","Renaming {0}","Successfully renamed '{0}' to '{1}'. Summary: {2}","Rename failed to apply edits","Rename failed to compute edits","Rename Symbol","Enable/disable the ability to preview changes before renaming"],"vs/editor/contrib/rename/renameInputField":["Rename input. Type new name and press Enter to commit.","{0} to Rename, {1} to Preview"],"vs/editor/contrib/smartSelect/smartSelect":["Expand Selection","&&Expand Selection","Shrink Selection","&&Shrink Selection"],"vs/editor/contrib/snippet/snippetVariables":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sun","Mon","Tue","Wed","Thu","Fri","Sat","January","February","March","April","May","June","July","August","September","October","November","December","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"vs/editor/contrib/suggest/suggestController":["Accepting '{0}' made {1} additional edits","Trigger Suggest","Insert","Insert","Replace","Replace","Insert","show less","show more","Reset Suggest Widget Size"],"vs/editor/contrib/suggest/suggestWidget":["Background color of the suggest widget.","Border color of the suggest widget.","Foreground color of the suggest widget.","Background color of the selected entry in the suggest widget.","Color of the match highlights in the suggest widget.","Loading...","No suggestions.","{0}, docs: {1}","Suggest"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Close","Loading..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Icon for more information in the suggest widget.","Read More"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for class symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for constructor symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for enumerator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for enumerator member symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for event symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for field symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for function symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for interface symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for method symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for variable symbols. These symbols appear in the outline, breadcrumb, and suggest widget."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Toggle Tab Key Moves Focus","Pressing Tab will now move focus to the next focusable element","Pressing Tab will now insert the tab character"],"vs/editor/contrib/tokenization/tokenization":["Developer: Force Retokenize"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Unusual Line Terminators","Detected unusual line terminators","This file contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\n\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.","Fix this file","Ignore problem for this file"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations.","Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations.","Border color of a symbol during read-access, like reading a variable.","Border color of a symbol during write-access, like writing to a variable.","Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.","Go to Next Symbol Highlight","Go to Previous Symbol Highlight","Trigger Symbol Highlight"],"vs/editor/contrib/wordOperations/wordOperations":["Delete Word"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Default Language Configuration Overrides","Configure editor settings to be overridden for a language.","This setting does not support per-language configuration.","Cannot register an empty property","Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.","Cannot register '{0}'. This property is already registered."],"vs/platform/contextkey/browser/contextKeyService":["A command that returns information about context keys"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) was pressed. Waiting for second key of chord...","The key combination ({0}, {1}) is not a command."],"vs/platform/list/browser/listService":["Workbench","Maps to `Control` on Windows and Linux and to `Command` on macOS.","Maps to `Alt` on Windows and Linux and to `Option` on macOS.","The modifier to be used to add an item in trees and lists to a multi-selection with the mouse (for example in the explorer, open editors and scm view). The 'Open to Side' mouse gestures - if supported - will adapt such that they do not conflict with the multiselect modifier.","Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.","Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.","Controls tree indentation in pixels.","Controls whether the tree should render indent guides.","Controls whether lists and trees have smooth scrolling.","Simple keyboard navigation focuses elements which match the keyboard input. Matching is done only on prefixes.","Highlight keyboard navigation highlights elements which match the keyboard input. Further up and down navigation will traverse only the highlighted elements.","Filter keyboard navigation will filter out and hide all the elements which do not match the keyboard input.","Controls the keyboard navigation style for lists and trees in the workbench. Can be simple, highlight and filter.","Controls whether keyboard navigation in lists and trees is automatically triggered simply by typing. If set to `false`, keyboard navigation is only triggered when executing the `list.toggleKeyboardNavigation` command, for which you can assign a keyboard shortcut.","Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable."],"vs/platform/markers/common/markers":["Error","Warning","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","recently used","other commands","Command '{0}' resulted in an error ({1})"],"vs/platform/quickinput/browser/helpQuickAccess":["global commands","editor commands","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Overall foreground color. This color is only used if not overridden by a component.","Overall foreground color for error messages. This color is only used if not overridden by a component.","The default color for icons in the workbench.","Overall border color for focused elements. This color is only used if not overridden by a component.","An extra border around elements to separate them from others for greater contrast.","An extra border around active elements to separate them from others for greater contrast.","Foreground color for links in text.","Background color for code blocks in text.","Shadow color of widgets such as find/replace inside the editor.","Input box background.","Input box foreground.","Input box border.","Border color of activated options in input fields.","Background color of activated options in input fields.","Foreground color of activated options in input fields.","Input validation background color for information severity.","Input validation foreground color for information severity.","Input validation border color for information severity.","Input validation background color for warning severity.","Input validation foreground color for warning severity.","Input validation border color for warning severity.","Input validation background color for error severity.","Input validation foreground color for error severity.","Input validation border color for error severity.","Dropdown background.","Dropdown foreground.","Button foreground color.","Button background color.","Button background color when hovering.","Badge background color. Badges are small information labels, e.g. for search results count.","Badge foreground color. Badges are small information labels, e.g. for search results count.","Scrollbar shadow to indicate that the view is scrolled.","Scrollbar slider background color.","Scrollbar slider background color when hovering.","Scrollbar slider background color when clicked on.","Background color of the progress bar that can show for long running operations.","Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of error squigglies in the editor.","Border color of error boxes in the editor.","Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of warning squigglies in the editor.","Border color of warning boxes in the editor.","Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of info squigglies in the editor.","Border color of info boxes in the editor.","Foreground color of hint squigglies in the editor.","Border color of hint boxes in the editor.","Editor background color.","Editor default foreground color.","Background color of editor widgets, such as find/replace.","Foreground color of editor widgets, such as find/replace.","Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.","Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.","Quick picker background color. The quick picker widget is the container for pickers like the command palette.","Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.","Quick picker title background color. The quick picker widget is the container for pickers like the command palette.","Quick picker background color for the focused item.","Quick picker color for grouping labels.","Quick picker color for grouping borders.","Color of the editor selection.","Color of the selected text for high contrast.","Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations.","Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations.","Border color for regions with the same content as the selection.","Color of the current search match.","Color of the other search matches. The color must not be opaque so as not to hide underlying decorations.","Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.","Border color of the current search match.","Border color of the other search matches.","Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.","Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations.","Background color of the editor hover.","Foreground color of the editor hover.","Border color of the editor hover.","Background color of the editor hover status bar.","Color of active links.","Foreground color of inline hints","Background color of inline hints","The color used for the lightbulb actions icon.","The color used for the lightbulb auto fix actions icon.","Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations.","Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations.","Outline color for the text that got inserted.","Outline color for text that got removed.","Border color between the two text editors.","Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.","List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree background when hovering over items using the mouse.","List/Tree foreground when hovering over items using the mouse.","List/Tree drag and drop background when moving items around using the mouse.","List/Tree foreground color of the match highlights when searching inside the list/tree.","Background color of the type filter widget in lists and trees.","Outline color of the type filter widget in lists and trees.","Outline color of the type filter widget in lists and trees, when there are no matches.","Tree stroke color for the indentation guides.","Tree stroke color for the indentation guides.","Border color of menus.","Foreground color of menu items.","Background color of menu items.","Foreground color of the selected menu item in menus.","Background color of the selected menu item in menus.","Border color of the selected menu item in menus.","Color of a separator menu item in menus.","Highlight background color of a snippet tabstop.","Highlight border color of a snippet tabstop.","Highlight background color of the final tabstop of a snippet.","Highlight border color of the final tabstop of a snippet.","Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.","Minimap marker color for find matches.","Minimap marker color for the editor selection.","Minimap marker color for errors.","Minimap marker color for warnings.","Minimap background color.","Minimap slider background color.","Minimap slider background color when hovering.","Minimap slider background color when clicked on.","The color used for the problems error icon.","The color used for the problems warning icon.","The color used for the problems info icon."],"vs/platform/theme/common/iconRegistry":["The id of the font to use. If not set, the font that is defined first is used.","The font character associated with the icon definition.","Icon for the close action in widgets."],"vs/platform/undoRedo/common/undoRedoService":["The following files have been closed and modified on disk: {0}.","The following files have been modified in an incompatible way: {0}.","Could not undo '{0}' across all files. {1}","Could not undo '{0}' across all files. {1}","Could not undo '{0}' across all files because changes were made to {1}","Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}","Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime","Would you like to undo '{0}' across all files?","Undo in {0} Files","Undo this File","Cancel","Could not undo '{0}' because there is already an undo or redo operation running.","Would you like to undo '{0}'?","Undo","Cancel","Could not redo '{0}' across all files. {1}","Could not redo '{0}' across all files. {1}","Could not redo '{0}' across all files because changes were made to {1}","Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}","Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime","Could not redo '{0}' because there is already an undo or redo operation running."]}); \ No newline at end of file diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js new file mode 100644 index 0000000000..557cb4d36a --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ko",{"vs/base/browser/ui/actionbar/actionViewItems":["{0}({1})"],"vs/base/browser/ui/findinput/findInput":["\uC785\uB825"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\uB300/\uC18C\uBB38\uC790 \uAD6C\uBD84","\uB2E8\uC5B4 \uB2E8\uC704\uB85C","\uC815\uADDC\uC2DD \uC0AC\uC6A9"],"vs/base/browser/ui/findinput/replaceInput":["\uC785\uB825","\uB300/\uC18C\uBB38\uC790 \uBCF4\uC874"],"vs/base/browser/ui/iconLabel/iconLabel":["\uB85C\uB4DC \uC911..."],"vs/base/browser/ui/inputbox/inputBox":["\uC624\uB958: {0}","\uACBD\uACE0: {0}","\uC815\uBCF4: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\uBC14\uC778\uB529 \uC548 \uB428"],"vs/base/browser/ui/menu/menu":["{0}({1})"],"vs/base/browser/ui/tree/abstractTree":["\uC9C0\uC6B0\uAE30","\uD615\uC2DD\uC744 \uAE30\uC900\uC73C\uB85C \uD544\uD130\uB9C1 \uC0AC\uC6A9 \uC548 \uD568","\uD615\uC2DD\uC744 \uAE30\uC900\uC73C\uB85C \uD544\uD130\uB9C1 \uC0AC\uC6A9","\uCC3E\uC740 \uC694\uC18C \uC5C6\uC74C","{1}\uAC1C \uC694\uC18C \uC911 {0}\uAC1C \uC77C\uCE58"],"vs/base/common/actions":["(\uBE44\uC5B4 \uC788\uC74C)"],"vs/base/common/errorMessage":["{0}: {1}","\uC2DC\uC2A4\uD15C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4({0}).","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694.","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694.","{0}(\uCD1D {1}\uAC1C\uC758 \uC624\uB958)","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694."],"vs/base/common/keybindingLabels":["Ctrl","","","Windows","Ctrl","","","\uC288\uD37C","\uC81C\uC5B4","","","\uBA85\uB839","\uC81C\uC5B4","","","Windows","\uC81C\uC5B4","","","\uC288\uD37C"],"vs/base/parts/quickinput/browser/quickInput":["\uB4A4\uB85C","{0} / {1}","\uACB0\uACFC\uC758 \uBC94\uC704\uB97C \uCD95\uC18C\uD558\uB824\uBA74 \uC785\uB825\uD558\uC138\uC694.","{0}\uAC1C \uACB0\uACFC","{0} \uC120\uD0DD\uB428","\uD655\uC778","\uC0AC\uC6A9\uC790 \uC9C0\uC815","\uB4A4\uB85C({0})","\uB4A4\uB85C"],"vs/base/parts/quickinput/browser/quickInputList":["\uBE60\uB978 \uC785\uB825"],"vs/editor/browser/controller/coreCommands":["\uB354 \uAE34 \uC904\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0\uC5D0\uB3C4 \uB05D\uC5D0 \uACE0\uC815","\uB354 \uAE34 \uC904\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0\uC5D0\uB3C4 \uB05D\uC5D0 \uACE0\uC815"],"vs/editor/browser/controller/textAreaHandler":["\uD3B8\uC9D1\uAE30","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0 \uC561\uC138\uC2A4\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC635\uC158\uC744 \uBCF4\uB824\uBA74 {0}\uC744(\uB97C) \uB204\uB985\uB2C8\uB2E4."],"vs/editor/browser/core/keybindingCancellation":["\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCDE8\uC18C \uAC00\uB2A5\uD55C \uC791\uC5C5(\uC608: '\uCC38\uC870 \uD53C\uD0B9')\uC744 \uC2E4\uD589\uD558\uB294\uC9C0 \uC5EC\uBD80"],"vs/editor/browser/editorExtensions":["\uC2E4\uD589 \uCDE8\uC18C(&&U)","\uC2E4\uD589 \uCDE8\uC18C","\uB2E4\uC2DC \uC2E4\uD589(&&R)","\uB2E4\uC2DC \uC2E4\uD589","\uBAA8\uB450 \uC120\uD0DD(&&S)","\uBAA8\uB450 \uC120\uD0DD"],"vs/editor/browser/widget/codeEditorWidget":["\uCEE4\uC11C \uC218\uB294 {0}(\uC73C)\uB85C \uC81C\uD55C\uB418\uC5C8\uC2B5\uB2C8\uB2E4."],"vs/editor/browser/widget/diffEditorWidget":["diff \uD3B8\uC9D1\uAE30\uC758 \uC0BD\uC785\uC5D0 \uB300\uD55C \uC904 \uB370\uCF54\uB808\uC774\uC158\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC758 \uC81C\uAC70\uC5D0 \uB300\uD55C \uC904 \uB370\uCF54\uB808\uC774\uC158\uC785\uB2C8\uB2E4.","\uD30C\uC77C 1\uAC1C\uAC00 \uB108\uBB34 \uCEE4\uC11C \uD30C\uC77C\uC744 \uBE44\uAD50\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."],"vs/editor/browser/widget/diffReview":["Diff \uAC80\uD1A0\uC5D0\uC11C '\uC0BD\uC785'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","Diff \uAC80\uD1A0\uC5D0\uC11C '\uC81C\uAC70'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","Diff \uAC80\uD1A0\uC5D0\uC11C '\uB2EB\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uB2EB\uAE30","\uBCC0\uACBD\uB41C \uC904 \uC5C6\uC74C","\uC120 1\uAC1C \uBCC0\uACBD\uB428","\uC904 {0}\uAC1C \uBCC0\uACBD\uB428","\uCC28\uC774 {0}/{1}: \uC6D0\uB798 \uC904 {2}, {3}, \uC218\uC815\uB41C \uC904 {4}, {5}","\uBE44\uC5B4 \uC788\uC74C","{0} \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC904 {1}","{0} \uC6D0\uB798 \uC904 {1} \uC218\uC815\uB41C \uC904 {2}","+ {0} \uC218\uC815\uB41C \uC904 {1}","- {0} \uC6D0\uB798 \uC904 {1}","\uB2E4\uC74C \uB2E4\uB978 \uD56D\uBAA9\uC73C\uB85C \uC774\uB3D9","\uB2E4\uC74C \uB2E4\uB978 \uD56D\uBAA9\uC73C\uB85C \uC774\uB3D9"],"vs/editor/browser/widget/inlineDiffMargin":["\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC","\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC","\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC({0})","\uC774 \uBCC0\uACBD \uB0B4\uC6A9 \uB418\uB3CC\uB9AC\uAE30","\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC({0})"],"vs/editor/common/config/commonEditorConfig":["\uD3B8\uC9D1\uAE30","\uD0ED \uD55C \uAC1C\uC5D0 \uD574\uB2F9\uD558\uB294 \uACF5\uBC31 \uC218\uC785\uB2C8\uB2E4. `#editor.detectIndentation#`\uC774 \uCF1C\uC838 \uC788\uB294 \uACBD\uC6B0 \uC774 \uC124\uC815\uC740 \uD30C\uC77C \uCF58\uD150\uCE20\uC5D0 \uB530\uB77C \uC7AC\uC815\uC758\uB429\uB2C8\uB2E4.","'\uD0ED' \uD0A4\uB97C \uB204\uB97C \uB54C \uACF5\uBC31\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4. `#editor.detectIndentation#`\uC774 \uCF1C\uC838 \uC788\uB294 \uACBD\uC6B0 \uC774 \uC124\uC815\uC740 \uD30C\uC77C \uCF58\uD150\uCE20\uC5D0 \uB530\uB77C \uC7AC\uC815\uC758\uB429\uB2C8\uB2E4.","\uD30C\uC77C\uC744 \uC5F4 \uB54C \uD30C\uC77C \uCF58\uD150\uCE20\uB97C \uAE30\uBC18\uC73C\uB85C `#editor.tabSize#`\uC640 `#editor.insertSpaces#`\uAC00 \uC790\uB3D9\uC73C\uB85C \uAC80\uC0C9\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB05D\uC5D0 \uC790\uB3D9 \uC0BD\uC785\uB41C \uACF5\uBC31\uC744 \uC81C\uAC70\uD569\uB2C8\uB2E4.","\uD070 \uD30C\uC77C\uC5D0 \uB300\uD55C \uD2B9\uC218 \uCC98\uB9AC\uB85C, \uBA54\uBAA8\uB9AC\uB97C \uB9CE\uC774 \uC0AC\uC6A9\uD558\uB294 \uD2B9\uC815 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uBB38\uC11C \uB0B4 \uB2E8\uC5B4\uB97C \uAE30\uBC18\uC73C\uB85C \uC644\uC131\uC744 \uACC4\uC0B0\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD65C\uC131 \uBB38\uC11C\uC5D0\uC11C\uB9CC \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uAC19\uC740 \uC5B8\uC5B4\uC758 \uBAA8\uB4E0 \uC5F4\uB9B0 \uBB38\uC11C\uC5D0\uC11C \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC5F4\uB9B0 \uBB38\uC11C\uC5D0\uC11C \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uAE30\uBC18 \uC644\uC131\uC774 \uCEF4\uD4E8\uD305\uB418\uB294 \uBB38\uC11C\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC0C9 \uD14C\uB9C8\uC5D0 \uB300\uD574 \uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC0C9 \uD14C\uB9C8\uC5D0 \uB300\uD574 \uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB294 \uD604\uC7AC \uC0C9 \uD14C\uB9C8\uC758 `semanticHighlighting` \uC124\uC815\uC5D0 \uB530\uB77C \uAD6C\uC131\uB429\uB2C8\uB2E4.","semanticHighlighting\uC774 \uC9C0\uC6D0\uD558\uB294 \uC5B8\uC5B4\uC5D0 \uB300\uD574 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD574\uB2F9 \uCF58\uD150\uCE20\uB97C \uB450 \uBC88 \uD074\uB9AD\uD558\uAC70\uB098 'Esc' \uD0A4\uB97C \uB204\uB974\uB354\uB77C\uB3C4 Peek \uD3B8\uC9D1\uAE30\uB97C \uC5F4\uB9B0 \uC0C1\uD0DC\uB85C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uC774 \uAE38\uC774\uB97C \uCD08\uACFC\uD558\uB294 \uC904\uC740 \uC131\uB2A5\uC0C1\uC758 \uC774\uC720\uB85C \uD1A0\uD070\uD654\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","diff \uACC4\uC0B0\uC774 \uCDE8\uC18C\uB41C \uD6C4 \uBC00\uB9AC\uCD08 \uB2E8\uC704\uB85C \uC2DC\uAC04\uC744 \uC81C\uD55C\uD569\uB2C8\uB2E4. \uC81C\uD55C \uC2DC\uAC04\uC774 \uC5C6\uB294 \uACBD\uC6B0 0\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C diff\uB97C \uB098\uB780\uD788 \uD45C\uC2DC\uD560\uC9C0 \uC778\uB77C\uC778\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 Diff \uD3B8\uC9D1\uAE30\uAC00 \uC120\uD589 \uB610\uB294 \uD6C4\uD589 \uACF5\uBC31\uC758 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uBB34\uC2DC\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCD94\uAC00/\uC81C\uAC70\uB41C \uBCC0\uACBD \uB0B4\uC6A9\uC5D0 \uB300\uD574 +/- \uD45C\uC2DC\uAE30\uB97C \uD45C\uC2DC\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C CodeLens\uB97C \uD45C\uC2DC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC904\uC774 \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8 \uB108\uBE44\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","`#editor.wordWrap#` \uC124\uC815\uC5D0 \uB530\uB77C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4."],"vs/editor/common/config/editorOptions":["\uD3B8\uC9D1\uAE30\uAC00 \uC2A4\uD06C\uB9B0 \uB9AC\uB354\uAC00 \uC5F0\uACB0\uB418\uBA74 \uD50C\uB7AB\uD3FC API\uB97C \uC0AC\uC6A9\uD558\uC5EC \uAC10\uC9C0\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uACFC \uD568\uAED8 \uC0AC\uC6A9\uB418\uB3C4\uB85D \uC601\uAD6C\uC801\uC73C\uB85C \uCD5C\uC801\uD654\uB418\uBA70, \uC790\uB3D9 \uC904 \uBC14\uAFC8\uC774 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uC2A4\uD06C\uB9B0 \uB9AC\uB354 \uC0AC\uC6A9\uC744 \uC704\uD574 \uCD5C\uC801\uD654\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB97C \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uC5D0 \uCD5C\uC801\uD654\uB41C \uBAA8\uB4DC\uB85C \uC2E4\uD589\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 \uC790\uB3D9 \uC904 \uBC14\uAFC8\uC774 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uB429\uB2C8\uB2E4.","\uC8FC\uC11D\uC744 \uB2EC \uB54C \uACF5\uBC31 \uBB38\uC790\uB97C \uC0BD\uC785\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBE48 \uC904\uC744 \uC904 \uC8FC\uC11D\uC5D0 \uB300\uD55C \uD1A0\uAE00, \uCD94\uAC00 \uB610\uB294 \uC81C\uAC70 \uC791\uC5C5\uC73C\uB85C \uBB34\uC2DC\uD574\uC57C \uD558\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED \uC5C6\uC774 \uD604\uC7AC \uC904 \uBCF5\uC0AC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC785\uB825\uD558\uB294 \uB3D9\uC548 \uC77C\uCE58 \uD56D\uBAA9\uC744 \uCC3E\uAE30 \uC704\uD55C \uCEE4\uC11C \uC774\uB3D9 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD\uC5D0\uC11C Find Widget\uC758 \uAC80\uC0C9 \uBB38\uC790\uC5F4\uC744 \uC2DC\uB529\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uCC3E\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uCF1C\uC9C0 \uC54A\uC74C(\uAE30\uBCF8\uAC12)","\uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uD56D\uC0C1 \uCC3E\uAE30 \uCF1C\uAE30","\uC5EC\uB7EC \uC904\uC758 \uCF58\uD150\uCE20\uB97C \uC120\uD0DD\uD558\uBA74 \uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uCC3E\uAE30\uAC00 \uC790\uB3D9\uC73C\uB85C \uCF1C\uC9D1\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC124\uC815\uD558\uB294 \uC870\uAC74\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","macOS\uC5D0\uC11C Find Widget\uC774 \uACF5\uC720 \uD074\uB9BD\uBCF4\uB4DC \uCC3E\uAE30\uB97C \uC77D\uC744\uC9C0 \uC218\uC815\uD560\uC9C0 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC704\uC82F \uCC3E\uAE30\uC5D0\uC11C \uD3B8\uC9D1\uAE30 \uB9E8 \uC704\uC5D0 \uC904\uC744 \uCD94\uAC00\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. true\uC778 \uACBD\uC6B0 \uC704\uC82F \uCC3E\uAE30\uAC00 \uD45C\uC2DC\uB418\uBA74 \uCCAB \uBC88\uC9F8 \uC904 \uC704\uB85C \uC2A4\uD06C\uB864\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uB354 \uC774\uC0C1 \uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC744 \uB54C \uAC80\uC0C9\uC744 \uCC98\uC74C\uC774\uB098 \uB05D\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uB2E4\uC2DC \uC2DC\uC791\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAE00\uAF34 \uD569\uC790('calt' \uBC0F 'liga' \uAE00\uAF34 \uAE30\uB2A5)\uB97C \uC0AC\uC6A9\uD558\uAC70\uB098 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4. 'font-feature-settings' CSS \uC18D\uC131\uC758 \uC138\uBD84\uD654\uB41C \uC81C\uC5B4\uB97C \uC704\uD574 \uBB38\uC790\uC5F4\uB85C \uBCC0\uACBD\uD569\uB2C8\uB2E4.","\uBA85\uC2DC\uC801 'font-feature-settings' CSS \uC18D\uC131\uC785\uB2C8\uB2E4. \uD569\uC790\uB97C \uCF1C\uAC70\uB098 \uAEBC\uC57C \uD558\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uBD80\uC6B8\uC744 \uB300\uC2E0 \uC804\uB2EC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uAE00\uAF34 \uD569\uC790 \uB610\uB294 \uAE00\uAF34 \uAE30\uB2A5\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4. CSS 'font-feature-settings' \uC18D\uC131\uC758 \uAC12\uC5D0 \uB300\uD574 \uD569\uC790 \uB610\uB294 \uBB38\uC790\uC5F4\uC744 \uC0AC\uC6A9\uD558\uAC70\uB098 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD558\uAE30 \uC704\uD55C \uBD80\uC6B8\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uAE00\uAF34 \uD06C\uAE30(\uD53D\uC140)\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.",'"\uD45C\uC900" \uBC0F "\uAD75\uAC8C" \uD0A4\uC6CC\uB4DC \uB610\uB294 1~1000 \uC0AC\uC774\uC758 \uC22B\uC790\uB9CC \uD5C8\uC6A9\uB429\uB2C8\uB2E4.','\uAE00\uAF34 \uB450\uAED8\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. "\uD45C\uC900" \uBC0F "\uAD75\uAC8C" \uD0A4\uC6CC\uB4DC \uB610\uB294 1~1000 \uC0AC\uC774\uC758 \uC22B\uC790\uB97C \uD5C8\uC6A9\uD569\uB2C8\uB2E4.',"\uACB0\uACFC Peek \uBDF0 \uD45C\uC2DC(\uAE30\uBCF8)","\uAE30\uBCF8 \uACB0\uACFC\uB85C \uC774\uB3D9\uD558\uC5EC Peek \uBCF4\uAE30\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uAE30\uBCF8 \uACB0\uACFC\uB85C \uC774\uB3D9\uD558\uACE0 \uB2E4\uB978 \uD56D\uBAA9\uC5D0 \uB300\uD574 peek \uC5C6\uB294 \uD0D0\uC0C9\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editor.editor.gotoLocation.multipleDefinitions' \uB610\uB294 'editor.editor.gotoLocation.multipleImplementations'\uC640 \uAC19\uC740 \uBCC4\uB3C4\uC758 \uC124\uC815\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uC815\uC758\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uC720\uD615 \uC815\uC758\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 'Go to Declaration' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uCC38\uC870\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","'\uC815\uC758\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uCC38\uC870\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","\uD638\uBC84 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD638\uBC84\uAC00 \uD45C\uC2DC\uB418\uAE30 \uC804\uAE4C\uC9C0\uC758 \uC9C0\uC5F0 \uC2DC\uAC04(\uBC00\uB9AC\uCD08)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB97C \uD574\uB2F9 \uD56D\uBAA9 \uC704\uB85C \uC774\uB3D9\uD560 \uB54C \uD638\uBC84\uB97C \uACC4\uC18D \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCF54\uB4DC \uB3D9\uC791 \uC804\uAD6C\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uD78C\uD2B8\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uAE00\uAF34 \uD06C\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. `0`\uC73C\uB85C \uC124\uC815\uD558\uBA74 `#editor.fontSize#`\uC758 90%\uAC00 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC904 \uB192\uC774\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uAE00\uAF34 \uD06C\uAE30\uC5D0\uC11C \uC904 \uB192\uC774\uB97C \uACC4\uC0B0\uD558\uB824\uBA74 0\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC758 \uD06C\uAE30\uB294 \uD3B8\uC9D1\uAE30 \uB0B4\uC6A9\uACFC \uB3D9\uC77C\uD558\uBA70 \uC2A4\uD06C\uB864\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uB192\uC774\uB97C \uB9DE\uCD94\uAE30 \uC704\uD574 \uD544\uC694\uC5D0 \uB530\uB77C \uBBF8\uB2C8\uB9F5\uC774 \uD655\uC7A5\uB418\uAC70\uB098 \uCD95\uC18C\uB429\uB2C8\uB2E4(\uC2A4\uD06C\uB864 \uC5C6\uC74C).","\uBBF8\uB2C8\uB9F5\uC744 \uD3B8\uC9D1\uAE30\uBCF4\uB2E4 \uC791\uAC8C \uC720\uC9C0\uD560 \uC218 \uC788\uB3C4\uB85D \uD544\uC694\uC5D0 \uB530\uB77C \uBBF8\uB2C8\uB9F5\uC774 \uCD95\uC18C\uB429\uB2C8\uB2E4(\uC2A4\uD06C\uB864 \uC5C6\uC74C).","\uBBF8\uB2C8\uB9F5\uC758 \uD06C\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC744 \uB80C\uB354\uB9C1\uD560 \uCE21\uBA74\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354\uAC00 \uD45C\uC2DC\uB418\uB294 \uC2DC\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC5D0 \uADF8\uB824\uC9C4 \uCF58\uD150\uCE20\uC758 \uBC30\uC728: 1, 2 \uB610\uB294 3.","\uC904\uC758 \uC2E4\uC81C \uBB38\uC790(\uC0C9 \uBE14\uB85D \uC544\uB2D8)\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uCD5C\uB300 \uD2B9\uC815 \uC218\uC758 \uC5F4\uC744 \uB80C\uB354\uB9C1\uD558\uB3C4\uB85D \uBBF8\uB2C8\uB9F5\uC758 \uB108\uBE44\uB97C \uC81C\uD55C\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uC704\uCABD \uAC00\uC7A5\uC790\uB9AC\uC640 \uCCAB \uBC88\uC9F8 \uC904 \uC0AC\uC774\uC758 \uACF5\uBC31\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uC544\uB798\uCABD \uAC00\uC7A5\uC790\uB9AC\uC640 \uB9C8\uC9C0\uB9C9 \uC904 \uC0AC\uC774\uC758 \uACF5\uBC31\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC785\uB825\uACFC \uB3D9\uC2DC\uC5D0 \uB9E4\uAC1C\uBCC0\uC218 \uBB38\uC11C\uC640 \uC720\uD615 \uC815\uBCF4\uB97C \uD45C\uC2DC\uD558\uB294 \uD31D\uC5C5\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uB9E4\uAC1C\uBCC0\uC218 \uD78C\uD2B8 \uBA54\uB274\uC758 \uC8FC\uAE30 \uD639\uC740 \uBAA9\uB85D\uC758 \uB05D\uC5D0 \uB3C4\uB2EC\uD558\uC600\uC744\uB54C \uC885\uB8CC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uB0B4\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC8FC\uC11D \uB0B4\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uBC0F \uC8FC\uC11D \uC678\uBD80\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC785\uB825\uD558\uB294 \uB3D9\uC548 \uC81C\uC548\uC744 \uC790\uB3D9\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uB80C\uB354\uB9C1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uC808\uB300\uAC12\uC73C\uB85C \uB80C\uB354\uB9C1 \uB429\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uCEE4\uC11C \uC704\uCE58\uC5D0\uC11C \uC904 \uAC04\uACA9 \uAC70\uB9AC\uB85C \uB80C\uB354\uB9C1 \uB429\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uB9E4 10 \uC904\uB9C8\uB2E4 \uB80C\uB354\uB9C1\uC774 \uC774\uB8E8\uC5B4\uC9D1\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uC758 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774 \uD3B8\uC9D1\uAE30 \uB208\uAE08\uC790\uC5D0\uC11C \uB80C\uB354\uB9C1\uD560 \uACE0\uC815 \uD3ED \uBB38\uC790 \uC218\uC785\uB2C8\uB2E4.","\uC774 \uD3B8\uC9D1\uAE30 \uB208\uAE08\uC790\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uD2B9\uC815 \uC218\uC758 \uACE0\uC815 \uD3ED \uBB38\uC790 \uB4A4\uC5D0 \uC138\uB85C \uB208\uAE08\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4. \uC5EC\uB7EC \uB208\uAE08\uC790\uC758 \uACBD\uC6B0 \uC5EC\uB7EC \uAC12\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uBC30\uC5F4\uC774 \uBE44\uC5B4 \uC788\uB294 \uACBD\uC6B0 \uB208\uAE08\uC790\uAC00 \uADF8\uB824\uC9C0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uCEE4\uC11C\uC758 \uD14D\uC2A4\uD2B8 \uC624\uB978\uCABD\uC744 \uB36E\uC5B4 \uC4F0\uC9C0\uC54A\uACE0 \uC81C\uC548\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4.","\uC81C\uC548\uC744 \uC0BD\uC785\uD558\uACE0 \uCEE4\uC11C\uC758 \uC624\uB978\uCABD \uD14D\uC2A4\uD2B8\uB97C \uB36E\uC5B4\uC501\uB2C8\uB2E4.","\uC644\uB8CC\uB97C \uC218\uB77D\uD560 \uB54C \uB2E8\uC5B4\uB97C \uB36E\uC5B4\uC4F8\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC774\uAC83\uC740 \uC774 \uAE30\uB2A5\uC744 \uC120\uD0DD\uD558\uB294 \uD655\uC7A5\uC5D0 \uB530\uB77C \uB2E4\uB985\uB2C8\uB2E4.","\uC81C\uC548 \uD544\uD130\uB9C1 \uBC0F \uC815\uB82C\uC5D0\uC11C \uC791\uC740 \uC624\uD0C0\uB97C \uC124\uBA85\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC815\uB82C\uD560 \uB54C \uCEE4\uC11C \uADFC\uCC98\uC5D0 \uD45C\uC2DC\uB418\uB294 \uB2E8\uC5B4\uB97C \uC6B0\uC120\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uC81C\uC548 \uC0AC\uD56D \uC120\uD0DD \uD56D\uBAA9\uC744 \uC5EC\uB7EC \uC791\uC5C5 \uC601\uC5ED \uBC0F \uCC3D\uC5D0\uC11C \uACF5\uC720\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4(`#editor.suggestSelection#` \uD544\uC694).","\uD65C\uC131 \uCF54\uB4DC \uC870\uAC01\uC774 \uBE60\uB978 \uC81C\uC548\uC744 \uBC29\uC9C0\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548\uC758 \uC544\uC774\uCF58\uC744 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F \uD558\uB2E8\uC758 \uC0C1\uD0DC \uD45C\uC2DC\uC904 \uAC00\uC2DC\uC131\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC138\uBD80 \uC815\uBCF4\uAC00 \uB808\uC774\uBE14\uACFC \uD568\uAED8 \uC778\uB77C\uC778\uC5D0 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC544\uB2C8\uBA74 \uC138\uBD80 \uC815\uBCF4 \uC704\uC82F\uC5D0\uB9CC \uD45C\uC2DC\uB418\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC774\uC81C \uC81C\uC548 \uC704\uC82F\uC758 \uD06C\uAE30\uB97C \uC870\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editor.suggest.showKeywords'\uB610\uB294 'editor.suggest.showSnippets'\uC640 \uAC19\uC740 \uBCC4\uB3C4\uC758 \uC124\uC815\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uBA54\uC11C\uB4DC` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD568\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0DD\uC131\uC790' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD544\uB4DC' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uBCC0\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD074\uB798\uC2A4' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uAD6C\uC870' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC778\uD130\uD398\uC774\uC2A4' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uBAA8\uB4C8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC18D\uC131' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC774\uBCA4\uD2B8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uC5F0\uC0B0\uC790` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uB2E8\uC704' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uAC12' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0C1\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC5F4\uAC70\uD615' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `enumMember` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD0A4\uC6CC\uB4DC' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD14D\uC2A4\uD2B8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0C9' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uD30C\uC77C` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uCC38\uC870' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0AC\uC6A9\uC790 \uC9C0\uC815 \uC0C9' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD3F4\uB354' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB41C \uACBD\uC6B0 IntelliSense\uC5D0 'typeParameter' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uCF54\uB4DC \uC870\uAC01' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","IntelliSense\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 `user`-\uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","IntelliSense\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD55C \uACBD\uC6B0 `issues`-\uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC120\uD589 \uBC0F \uD6C4\uD589 \uACF5\uBC31\uC744 \uD56D\uC0C1 \uC120\uD0DD\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uC785\uB2C8\uB2E4.","\uCEE4\uBC0B \uBB38\uC790\uC5D0 \uB300\uD55C \uC81C\uC548\uC744 \uD5C8\uC6A9\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC608\uB97C \uB4E4\uC5B4 JavaScript\uC5D0\uC11C\uB294 \uC138\uBBF8\uCF5C\uB860(';')\uC774 \uC81C\uC548\uC744 \uD5C8\uC6A9\uD558\uACE0 \uD574\uB2F9 \uBB38\uC790\uB97C \uC785\uB825\uD558\uB294 \uCEE4\uBC0B \uBB38\uC790\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8\uB97C \uBCC0\uACBD\uD560 \uB54C `Enter` \uD0A4\uB97C \uC0AC\uC6A9\uD55C \uC81C\uC548\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.","'Tab' \uD0A4 \uC678\uC5D0 'Enter' \uD0A4\uC5D0 \uB300\uD55C \uC81C\uC548\uB3C4 \uD5C8\uC6A9\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC0C8 \uC904\uC744 \uC0BD\uC785\uD558\uB294 \uB3D9\uC791\uACFC \uC81C\uC548\uC744 \uD5C8\uC6A9\uD558\uB294 \uB3D9\uC791 \uAC04\uC758 \uBAA8\uD638\uD568\uC744 \uC5C6\uC568 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD654\uBA74 \uD310\uB3C5\uAE30\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 \uD3B8\uC9D1\uAE30\uC758 \uC904 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uACBD\uACE0: \uAE30\uBCF8\uAC12\uBCF4\uB2E4 \uD070 \uC22B\uC790\uC778 \uACBD\uC6B0 \uC131\uB2A5\uC5D0 \uC601\uD5A5\uC744 \uBBF8\uCE69\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCF58\uD150\uCE20","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uB300\uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uACF5\uBC31\uC758 \uC67C\uCABD\uC5D0 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uB300\uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC2B5\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC5EC\uB294 \uAD04\uD638\uB97C \uCD94\uAC00\uD55C \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2EB\uAE30 \uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638\uAC00 \uC790\uB3D9\uC73C\uB85C \uC0BD\uC785\uB41C \uACBD\uC6B0\uC5D0\uB9CC \uD574\uB2F9 \uD56D\uBAA9 \uC704\uC5D0 \uC785\uB825\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uC790\uAC00 \uB2EB\uB294 \uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638 \uC704\uC5D0 \uC785\uB825\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uACF5\uBC31\uC758 \uC67C\uCABD\uC5D0 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC2B5\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC5EC\uB294 \uB530\uC634\uD45C\uB97C \uCD94\uAC00\uD55C \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC0BD\uC785\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0 \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0 \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC874\uC911\uD558\uBA70 \uC5B8\uC5B4\uBCC4\uB85C \uC815\uC758\uB41C \uD2B9\uBCC4 EnterRules\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0, \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC874\uC911\uD558\uACE0, \uC5B8\uC5B4\uC5D0 \uC758\uD574 \uC815\uC758\uB41C \uD2B9\uBCC4 EnterRules\uB97C \uD638\uCD9C\uD558\uACE0, \uC5B8\uC5B4\uC5D0 \uC758\uD574 \uC815\uC758\uB41C \uB4E4\uC5EC\uC4F0\uAE30 \uADDC\uCE59\uC744 \uC874\uC911\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC904\uC744 \uC785\uB825, \uBD99\uC5EC\uB123\uAE30, \uC774\uB3D9 \uB610\uB294 \uB4E4\uC5EC\uC4F0\uAE30 \uD560 \uB54C \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC870\uC815\uD558\uB3C4\uB85D \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC120\uD0DD \uD56D\uBAA9\uC744 \uC790\uB3D9\uC73C\uB85C \uB458\uB7EC\uC300 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uAC00 \uC544\uB2CC \uB530\uC634\uD45C\uB85C \uB458\uB7EC\uC309\uB2C8\uB2E4.","\uB530\uC634\uD45C\uAC00 \uC544\uB2CC \uB300\uAD04\uD638\uB85C \uB458\uB7EC\uC309\uB2C8\uB2E4.","\uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638 \uC785\uB825 \uC2DC \uD3B8\uC9D1\uAE30\uAC00 \uC790\uB3D9\uC73C\uB85C \uC120\uD0DD \uC601\uC5ED\uC744 \uB458\uB7EC\uC300\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30\uC5D0 \uACF5\uBC31\uC744 \uC0AC\uC6A9\uD560 \uB54C \uD0ED \uBB38\uC790\uC758 \uC120\uD0DD \uB3D9\uC791\uC744 \uC5D0\uBBAC\uB808\uC774\uD2B8\uD569\uB2C8\uB2E4. \uC120\uD0DD \uC601\uC5ED\uC774 \uD0ED \uC815\uC9C0\uC5D0 \uACE0\uC815\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C CodeLens\uB97C \uD45C\uC2DC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","CodeLens\uC758 \uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","CodeLens\uC758 \uAE00\uAF34 \uD06C\uAE30(\uD53D\uC140)\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. '0'\uC73C\uB85C \uC124\uC815\uD558\uBA74 `#editor.fontSize#`\uC758 90%\uAC00 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uC0C9 \uB370\uCF54\uB808\uC774\uD130 \uBC0F \uC0C9 \uC120\uD0DD\uC744 \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uC640 \uD0A4\uB85C \uC120\uD0DD\uD55C \uC601\uC5ED\uC5D0\uC11C \uC5F4\uC744 \uC120\uD0DD\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uAD6C\uBB38 \uAC15\uC870 \uD45C\uC2DC\uB97C \uD074\uB9BD\uBCF4\uB4DC\uB85C \uBCF5\uC0AC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC560\uB2C8\uBA54\uC774\uC158 \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9E4\uB044\uB7EC\uC6B4 \uCE90\uB7FF \uC560\uB2C8\uBA54\uC774\uC158\uC758 \uC0AC\uC6A9 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC8FC\uC704\uC5D0 \uD45C\uC2DC\uB418\uB294 \uC120\uD589 \uBC0F \uD6C4\uD589 \uC904\uC758 \uCD5C\uC18C \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC77C\uBD80 \uB2E4\uB978 \uD3B8\uC9D1\uAE30\uC5D0\uC11C\uB294 'scrollOff' \uB610\uB294 'scrollOffset'\uC774\uB77C\uACE0 \uD569\uB2C8\uB2E4.","'cursorSurroundingLines'\uB294 \uD0A4\uBCF4\uB4DC \uB098 API\uB97C \uD1B5\uD574 \uD2B8\uB9AC\uAC70\uB420 \uB54C\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.","`cursorSurroundingLines`\uB294 \uD56D\uC0C1 \uC801\uC6A9\uB429\uB2C8\uB2E4.","'cursorSurroundingLines'\uB97C \uC801\uC6A9\uD574\uC57C \uD558\uB294 \uACBD\uC6B0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","`#editor.cursorStyle#` \uC124\uC815\uC774 'line'\uC73C\uB85C \uC124\uC815\uB418\uC5B4 \uC788\uC744 \uB54C \uCEE4\uC11C\uC758 \uB113\uC774\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB04C\uC5B4\uC11C \uB193\uAE30\uB85C \uC120\uD0DD \uC601\uC5ED\uC744 \uC774\uB3D9\uD560 \uC218 \uC788\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","'Alt' \uD0A4\uB97C \uB204\uB97C \uB54C \uC2A4\uD06C\uB864 \uC18D\uB3C4 \uC2B9\uC218\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0 \uCF54\uB4DC \uC811\uAE30\uAC00 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uACBD\uC6B0 \uC5B8\uC5B4\uBCC4 \uC811\uAE30 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uADF8\uB807\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uB4E4\uC5EC\uC4F0\uAE30 \uAE30\uBC18 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30 \uAE30\uBC18 \uC811\uAE30 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC811\uAE30 \uBC94\uC704\uB97C \uACC4\uC0B0\uD558\uAE30 \uC704\uD55C \uC804\uB7B5\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC811\uD78C \uBC94\uC704\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC811\uD78C \uC904\uC774 \uC904\uC744 \uD3BC\uCE5C \uD6C4 \uBE48 \uCF58\uD150\uCE20\uB97C \uD074\uB9AD\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBD99\uC5EC\uB123\uC740 \uCF58\uD150\uCE20\uC758 \uC11C\uC2DD\uC744 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC9C0\uC815\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uD3EC\uB9F7\uD130\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC5B4\uC57C \uD558\uBA70 \uD3EC\uB9F7\uD130\uAC00 \uBB38\uC11C\uC5D0\uC11C \uBC94\uC704\uC758 \uC11C\uC2DD\uC744 \uC9C0\uC815\uD560 \uC218 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4.","\uC785\uB825 \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC904\uC758 \uC11C\uC2DD\uC744 \uC9C0\uC815\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC138\uB85C \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC744 \uB80C\uB354\uB9C1\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC740 \uC8FC\uB85C \uB514\uBC84\uAE45\uC5D0 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uAC1C\uC694 \uB208\uAE08\uC790\uC5D0\uC11C \uAC00\uB824\uC838\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD65C\uC131 \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBB38\uC790 \uAC04\uACA9(\uD53D\uC140)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC5F0\uACB0\uB41C \uD3B8\uC9D1\uC774 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uC5C8\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC5B8\uC5B4\uC5D0 \uB530\uB77C \uAD00\uB828 \uAE30\uD638(\uC608: HTML \uD0DC\uADF8)\uAC00 \uD3B8\uC9D1 \uC911\uC5D0 \uC5C5\uB370\uC774\uD2B8\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB9C1\uD06C\uB97C \uAC10\uC9C0\uD558\uACE0 \uD074\uB9AD\uD560 \uC218 \uC788\uAC8C \uB9CC\uB4E4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uB300\uAD04\uD638\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4 \uD720 \uC2A4\uD06C\uB864 \uC774\uBCA4\uD2B8\uC758 `deltaX` \uBC0F `deltaY`\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uC2B9\uC218\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4 \uD720\uC744 \uC0AC\uC6A9\uD560 \uB54C 'Ctrl' \uD0A4\uB97C \uB204\uB974\uACE0 \uC788\uC73C\uBA74 \uD3B8\uC9D1\uAE30\uC758 \uAE00\uAF34\uC744 \uD655\uB300/\uCD95\uC18C\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uCEE4\uC11C\uAC00 \uACB9\uCE58\uB294 \uACBD\uC6B0 \uCEE4\uC11C\uB97C \uBCD1\uD569\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Control'\uC744 macOS\uC758 'Command'\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Alt'\uB97C macOS\uC758 'Option'\uC73C\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uC5EC\uB7EC \uCEE4\uC11C\uB97C \uCD94\uAC00\uD560 \uB54C \uC0AC\uC6A9\uD560 \uC218\uC815\uC790\uC785\uB2C8\uB2E4. [\uC815\uC758\uB85C \uC774\uB3D9] \uBC0F [\uB9C1\uD06C \uC5F4\uAE30] \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98\uAC00 \uBA40\uD2F0\uCEE4\uC11C \uC218\uC815\uC790\uC640 \uCDA9\uB3CC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC870\uC815\uB429\uB2C8\uB2E4. [\uC790\uC138\uD55C \uC815\uBCF4](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","\uAC01 \uCEE4\uC11C\uB294 \uD14D\uC2A4\uD2B8 \uD55C \uC904\uC744 \uBD99\uC5EC\uB123\uC2B5\uB2C8\uB2E4.","\uAC01 \uCEE4\uC11C\uB294 \uC804\uCCB4 \uD14D\uC2A4\uD2B8\uB97C \uBD99\uC5EC\uB123\uC2B5\uB2C8\uB2E4.","\uBD99\uC5EC\uB123\uC740 \uD14D\uC2A4\uD2B8\uC758 \uC904 \uC218\uAC00 \uCEE4\uC11C \uC218\uC640 \uC77C\uCE58\uD558\uB294 \uACBD\uC6B0 \uBD99\uC5EC\uB123\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC758\uBBF8 \uCCB4\uACC4 \uAE30\uD638 \uD56D\uBAA9\uC744 \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAC1C\uC694 \uB208\uAE08\uC790 \uC8FC\uC704\uC5D0 \uD14C\uB450\uB9AC\uB97C \uADF8\uB9B4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","Peek\uB97C \uC5EC\uB294 \uB3D9\uC548 \uD2B8\uB9AC\uC5D0 \uD3EC\uCEE4\uC2A4","\uBBF8\uB9AC \uBCF4\uAE30\uB97C \uC5F4 \uB54C \uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4","\uBBF8\uB9AC \uBCF4\uAE30 \uC704\uC82F\uC5D0\uC11C \uC778\uB77C\uC778 \uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4\uB97C \uB458\uC9C0 \uB610\uB294 \uD2B8\uB9AC\uC5D0 \uD3EC\uCEE4\uC2A4\uB97C \uB458\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774\uB3D9 \uC815\uC758 \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98\uAC00 \uD56D\uC0C1 \uBBF8\uB9AC \uBCF4\uAE30 \uC704\uC82F\uC744 \uC5F4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBE60\uB978 \uC81C\uC548\uC744 \uD45C\uC2DC\uD558\uAE30 \uC804\uAE4C\uC9C0\uC758 \uC9C0\uC5F0 \uC2DC\uAC04(\uBC00\uB9AC\uCD08)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uC720\uD615\uC5D0 \uB530\uB77C \uC790\uB3D9\uC73C\uB85C \uC774\uB984\uC744 \uBC14\uAFC0\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 `editor.linkedEditing`\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC81C\uC5B4 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD30C\uC77C\uC774 \uC904 \uBC14\uAFC8\uC73C\uB85C \uB05D\uB098\uBA74 \uB9C8\uC9C0\uB9C9 \uC904 \uBC88\uD638\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uC81C\uBCF8\uC6A9 \uC5EC\uBC31\uACFC \uD604\uC7AC \uC904\uC744 \uBAA8\uB450 \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uD604\uC7AC \uC904 \uAC15\uC870 \uD45C\uC2DC\uB97C \uB80C\uB354\uB9C1\uD558\uB294 \uBC29\uC2DD\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD604\uC7AC \uC904 \uAC15\uC870 \uD45C\uC2DC\uB97C \uB80C\uB354\uB9C1\uD574\uC57C \uD558\uB294\uC9C0 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uC0AC\uC774\uC758 \uACF5\uBC31 \uD558\uB098\uB97C \uC81C\uC678\uD55C \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uC5D0\uC11C\uB9CC \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uD6C4\uD589 \uACF5\uBC31 \uBB38\uC790\uB9CC \uB80C\uB354\uB9C1","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD560 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9\uC758 \uBAA8\uC11C\uB9AC\uB97C \uB465\uAE00\uAC8C \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uAC00\uB85C\uB85C \uC2A4\uD06C\uB864\uB418\uB294 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uB294 \uCD94\uAC00 \uBB38\uC790\uC758 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB9C8\uC9C0\uB9C9 \uC904 \uC774\uD6C4\uB85C \uC2A4\uD06C\uB864\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC138\uB85C\uC640 \uAC00\uB85C\uB85C \uB3D9\uC2DC\uC5D0 \uC2A4\uD06C\uB864\uD560 \uB54C\uC5D0\uB9CC \uC8FC\uCD95\uC744 \uB530\uB77C\uC11C \uC2A4\uD06C\uB864\uD569\uB2C8\uB2E4. \uD2B8\uB799\uD328\uB4DC\uC5D0\uC11C \uC138\uB85C\uB85C \uC2A4\uD06C\uB864\uD560 \uB54C \uAC00\uB85C \uB4DC\uB9AC\uD504\uD2B8\uB97C \uBC29\uC9C0\uD569\uB2C8\uB2E4.","Linux \uC8FC \uD074\uB9BD\uBCF4\uB4DC\uC758 \uC9C0\uC6D0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uC120\uD0DD \uD56D\uBAA9\uACFC \uC720\uC0AC\uD55C \uC77C\uCE58 \uD56D\uBAA9\uC744 \uAC15\uC870 \uD45C\uC2DC\uD574\uC57C\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC811\uAE30 \uCEE8\uD2B8\uB864\uC744 \uD56D\uC0C1 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uAC00 \uC5EC\uBC31 \uC704\uC5D0 \uC788\uC744 \uB54C\uC5D0\uB9CC \uC811\uAE30 \uCEE8\uD2B8\uB864\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC5EC\uBC31\uC758 \uC811\uAE30 \uCEE8\uD2B8\uB864\uC774 \uD45C\uC2DC\uB418\uB294 \uC2DC\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294 \uCF54\uB4DC\uC758 \uD398\uC774\uB4DC \uC544\uC6C3\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCDE8\uC18C\uC120 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uB294 \uBCC0\uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548 \uC704\uC5D0 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548 \uC544\uB798\uC5D0 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548\uACFC \uD568\uAED8 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01\uC774 \uB2E4\uB978 \uCD94\uCC9C\uACFC \uD568\uAED8 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80 \uBC0F \uC815\uB82C \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC560\uB2C8\uBA54\uC774\uC158\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC2A4\uD06C\uB864\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uAE00\uAF34 \uD06C\uAE30\uC785\uB2C8\uB2E4. '0'\uC73C\uB85C \uC124\uC815\uD558\uBA74 '#editor.fontSize#'\uC758 \uAC12\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC904 \uB192\uC774\uC785\uB2C8\uB2E4. '0'\uC73C\uB85C \uC124\uC815\uD558\uBA74 `#editor.lineHeight#`\uC758 \uAC12\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4. \uCD5C\uC19F\uAC12\uC740 8\uC785\uB2C8\uB2E4.","\uD2B8\uB9AC\uAC70 \uBB38\uC790\uB97C \uC785\uB825\uD560 \uB54C \uC81C\uC548\uC744 \uC790\uB3D9\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD56D\uC0C1 \uCCAB \uBC88\uC9F8 \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4.","`log`\uAC00 \uCD5C\uADFC\uC5D0 \uC644\uB8CC\uB418\uC5C8\uC73C\uBBC0\uB85C \uCD94\uAC00 \uC785\uB825\uC5D0\uC11C \uC81C\uC548\uC744 \uC120\uD0DD\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uCD5C\uADFC \uC81C\uC548\uC744 \uC120\uD0DD\uD558\uC138\uC694(\uC608: `console.| -> console.log`).","\uD574\uB2F9 \uC81C\uC548\uC744 \uC644\uB8CC\uD55C \uC774\uC804 \uC811\uB450\uC0AC\uC5D0 \uB530\uB77C \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4(\uC608: `co -> console` \uBC0F `con -> const`).","\uC81C\uC548 \uBAA9\uB85D\uC744 \uD45C\uC2DC\uD560 \uB54C \uC81C\uD55C\uC774 \uBBF8\uB9AC \uC120\uD0DD\uB418\uB294 \uBC29\uC2DD\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uB8CC\uB294 \uD0ED\uC744 \uB204\uB97C \uB54C \uAC00\uC7A5 \uC77C\uCE58\uD558\uB294 \uC81C\uC548\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uC131\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uC811\uB450\uC0AC\uAC00 \uC77C\uCE58\uD558\uB294 \uACBD\uC6B0 \uCF54\uB4DC \uC870\uAC01\uC744 \uD0ED \uC644\uB8CC\uD569\uB2C8\uB2E4. 'quickSuggestions'\uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC744 \uB54C \uAC00\uC7A5 \uC798 \uC791\uB3D9\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uC131\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uC790\uB3D9\uC73C\uB85C \uC81C\uAC70\uB429\uB2C8\uB2E4.","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uBB34\uC2DC\uB429\uB2C8\uB2E4.","\uC81C\uAC70\uD560 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790 \uD504\uB86C\uD504\uD2B8\uC785\uB2C8\uB2E4.","\uBB38\uC81C\uB97C \uC77C\uC73C\uD0AC \uC218 \uC788\uB294 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uB97C \uC81C\uAC70\uD569\uB2C8\uB2E4.","\uD0ED \uC815\uC9C0 \uB4A4\uC5D0 \uACF5\uBC31\uC744 \uC0BD\uC785 \uBC0F \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uAD00\uB828 \uD0D0\uC0C9 \uB610\uB294 \uC791\uC5C5\uC744 \uC218\uD589\uD560 \uB54C \uB2E8\uC5B4 \uAD6C\uBD84 \uAE30\uD638\uB85C \uC0AC\uC6A9\uD560 \uBB38\uC790\uC785\uB2C8\uB2E4.","\uC904\uC774 \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8 \uB108\uBE44\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","`#editor.wordWrapColumn#`\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8\uC758 \uCD5C\uC18C\uAC12 \uBC0F `#editor.wordWrapColumn#`\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","`#editor.wordWrap#`\uC774 `wordWrapColumn` \uB610\uB294 'bounded'\uC778 \uACBD\uC6B0 \uD3B8\uC9D1\uAE30\uC758 \uC5F4 \uC904 \uBC14\uAFC8\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC904 \uBC14\uAFC8 \uD589\uC774 \uC5F4 1\uC5D0\uC11C \uC2DC\uC791\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uAC00 \uBD80\uBAA8\uC640 \uB3D9\uC77C\uD569\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC774 \uBD80\uBAA8 \uCABD\uC73C\uB85C +1\uB9CC\uD07C \uB4E4\uC5EC\uC4F0\uAE30\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC774 \uBD80\uBAA8 \uCABD\uC73C\uB85C +2\uB9CC\uD07C \uB4E4\uC5EC\uC4F0\uAE30\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uBB38\uC790\uAC00 \uB3D9\uC77C\uD55C \uB108\uBE44\uB77C\uACE0 \uAC00\uC815\uD569\uB2C8\uB2E4. \uC774 \uC54C\uACE0\uB9AC\uC998\uC740 \uACE0\uC815 \uD3ED \uAE00\uAF34\uACFC \uBB38\uC790 \uBAA8\uC591\uC758 \uB108\uBE44\uAC00 \uAC19\uC740 \uD2B9\uC815 \uC2A4\uD06C\uB9BD\uD2B8(\uC608: \uB77C\uD2F4 \uBB38\uC790)\uC5D0 \uC801\uC808\uD788 \uC791\uB3D9\uD558\uB294 \uBE60\uB978 \uC54C\uACE0\uB9AC\uC998\uC785\uB2C8\uB2E4.","\uB798\uD551 \uC810 \uACC4\uC0B0\uC744 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uC704\uC784\uD569\uB2C8\uB2E4. \uC774 \uC54C\uACE0\uB9AC\uC998\uC740 \uB9E4\uC6B0 \uB290\uB824\uC11C \uB300\uC6A9\uB7C9 \uD30C\uC77C\uC758 \uACBD\uC6B0 \uC911\uB2E8\uB420 \uC218 \uC788\uC9C0\uB9CC \uBAA8\uB4E0 \uACBD\uC6B0\uC5D0 \uC801\uC808\uD788 \uC791\uB3D9\uD569\uB2C8\uB2E4.","\uB798\uD551 \uC810\uC744 \uACC4\uC0B0\uD558\uB294 \uC54C\uACE0\uB9AC\uC998\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4."],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["\uC785\uB825\uD558\uB294 \uC911"],"vs/editor/common/modes/modesRegistry":["\uC77C\uBC18 \uD14D\uC2A4\uD2B8"],"vs/editor/common/standaloneStrings":["\uC5C6\uC74C \uC120\uD0DD","\uC904 {0}, \uC5F4 {1}({2} \uC120\uD0DD\uB428)\uC785\uB2C8\uB2E4.","\uD589 {0}, \uC5F4 {1}","{0} \uC120\uD0DD \uD56D\uBAA9({1}\uC790 \uC120\uD0DD\uB428)","{0} \uC120\uD0DD \uD56D\uBAA9","\uC774\uC81C 'accessibilitySupport' \uC124\uC815\uC744 'on'\uC73C\uB85C \uBCC0\uACBD\uD569\uB2C8\uB2E4.","\uC9C0\uAE08 \uD3B8\uC9D1\uAE30 \uC811\uADFC\uC131 \uBB38\uC11C \uD398\uC774\uC9C0\uB97C \uC5EC\uC138\uC694.","\uCC28\uC774 \uD3B8\uC9D1\uAE30\uC758 \uC77D\uAE30 \uC804\uC6A9 \uCC3D\uC5D0\uC11C.","diff \uD3B8\uC9D1\uAE30 \uCC3D\uC5D0\uC11C."," \uC77D\uAE30 \uC804\uC6A9 \uCF54\uB4DC \uD3B8\uC9D1\uAE30\uC5D0\uC11C"," \uCF54\uB4DC \uD3B8\uC9D1\uAE30\uC5D0\uC11C","\uD654\uBA74 \uD310\uB3C5\uAE30 \uC0AC\uC6A9\uC5D0 \uCD5C\uC801\uD654\uB418\uB3C4\uB85D \uD3B8\uC9D1\uAE30\uB97C \uAD6C\uC131\uD558\uB824\uBA74 \uC9C0\uAE08 Command+E\uB97C \uB204\uB974\uC138\uC694.","\uD654\uBA74 \uD310\uB3C5\uAE30\uC5D0 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB3C4\uB85D \uD3B8\uC9D1\uAE30\uB97C \uCD5C\uC801\uD654\uD558\uB824\uBA74 \uC9C0\uAE08 Ctrl+E\uB97C \uB204\uB974\uC138\uC694.","\uC5D0\uB514\uD130\uB97C \uD654\uBA74 \uD310\uB3C5\uAE30\uC640 \uD568\uAED8 \uC0AC\uC6A9\uD558\uAE30\uC5D0 \uC801\uD569\uD558\uB3C4\uB85D \uAD6C\uC131\uD588\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD654\uBA74 \uD310\uB3C5\uAE30 \uC0AC\uC6A9\uC744 \uC704\uD574 \uC808\uB300\uB85C \uCD5C\uC801\uD654\uB418\uC9C0 \uC54A\uB3C4\uB85D \uAD6C\uC131\uB429\uB2C8\uB2E4. \uD604\uC7AC\uB85C\uC11C\uB294 \uADF8\uB807\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0A4\uB97C \uB204\uB974\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uB2E4\uC74C \uD3EC\uCEE4\uC2A4 \uAC00\uB2A5\uD55C \uC694\uC18C\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4. {0}\uC744(\uB97C) \uB20C\uB7EC\uC11C \uC774 \uB3D9\uC791\uC744 \uC124\uC815/\uD574\uC81C\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0A4\uB97C \uB204\uB974\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uB2E4\uC74C \uD3EC\uCEE4\uC2A4 \uAC00\uB2A5\uD55C \uC694\uC18C\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4. {0} \uBA85\uB839\uC740 \uD604\uC7AC \uD0A4 \uBC14\uC778\uB529\uC73C\uB85C \uD2B8\uB9AC\uAC70\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0A4\uB97C \uB204\uB974\uBA74 \uD0ED \uBB38\uC790\uAC00 \uC0BD\uC785\uB429\uB2C8\uB2E4. {0}\uC744(\uB97C) \uB20C\uB7EC\uC11C \uC774 \uB3D9\uC791\uC744 \uC124\uC815/\uD574\uC81C\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0A4\uB97C \uB204\uB974\uBA74 \uD0ED \uBB38\uC790\uAC00 \uC0BD\uC785\uB429\uB2C8\uB2E4. {0} \uBA85\uB839\uC740 \uD604\uC7AC \uD0A4 \uBC14\uC778\uB529\uC73C\uB85C \uD2B8\uB9AC\uAC70\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","Command+H\uB97C \uB20C\uB7EC \uD3B8\uC9D1\uAE30 \uC811\uADFC\uC131\uACFC \uAD00\uB828\uB41C \uC790\uC138\uD55C \uC815\uBCF4\uAC00 \uC788\uB294 \uBE0C\uB77C\uC6B0\uC800 \uCC3D\uC744 \uC5EC\uC138\uC694.","Ctrl+H\uB97C \uB20C\uB7EC \uD3B8\uC9D1\uAE30 \uC811\uADFC\uC131\uACFC \uAD00\uB828\uB41C \uC790\uC138\uD55C \uC815\uBCF4\uAC00 \uC788\uB294 \uBE0C\uB77C\uC6B0\uC800 \uCC3D\uC744 \uC5FD\uB2C8\uB2E4.","\uC774 \uB3C4\uAD6C \uC124\uBA85\uC744 \uD574\uC81C\uD558\uACE0 Esc \uD0A4 \uB610\uB294 Shift+Esc\uB97C \uB20C\uB7EC\uC11C \uD3B8\uC9D1\uAE30\uB85C \uB3CC\uC544\uAC08 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC811\uADFC\uC131 \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC","\uAC1C\uBC1C\uC790: \uAC80\uC0AC \uD1A0\uD070","\uC904/\uC5F4\uB85C \uC774\uB3D9...","\uBE60\uB978 \uC561\uC138\uC2A4 \uACF5\uAE09\uC790 \uBAA8\uB450 \uD45C\uC2DC","\uBA85\uB839 \uD314\uB808\uD2B8","\uBA85\uB839 \uD45C\uC2DC \uBC0F \uC2E4\uD589","\uAE30\uD638\uB85C \uAC00\uC11C...","\uBC94\uC8FC\uBCC4 \uAE30\uD638\uB85C \uC774\uB3D9...","\uD3B8\uC9D1\uAE30 \uCF58\uD150\uCE20","\uC811\uADFC\uC131 \uC635\uC158\uC740 Alt+F1\uC744 \uB20C\uB7EC\uC5EC \uD569\uB2C8\uB2E4.","\uACE0\uB300\uBE44 \uD14C\uB9C8\uB85C \uC804\uD658","{1} \uD30C\uC77C\uC5D0\uC11C \uD3B8\uC9D1\uC744 {0}\uAC1C \uD588\uC2B5\uB2C8\uB2E4."],"vs/editor/common/view/editorColorRegistry":["\uCEE4\uC11C \uC704\uCE58\uC758 \uC904 \uAC15\uC870 \uD45C\uC2DC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCEE4\uC11C \uC704\uCE58\uC758 \uC904 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC5F4\uAE30 \uBC0F \uCC3E\uAE30 \uAE30\uB2A5 \uB4F1\uC744 \uD1B5\uD574 \uAC15\uC870 \uD45C\uC2DC\uB41C \uC601\uC5ED\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC15\uC870 \uC601\uC5ED \uC8FC\uBCC0\uC758 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4","\uAC15\uC870 \uD45C\uC2DC\uB41C \uAE30\uD638(\uC608: \uC815\uC758\uB85C \uC774\uB3D9 \uB610\uB294 \uB2E4\uC74C/\uC774\uC804 \uAE30\uD638\uB85C \uC774\uB3D9)\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC0C1\uC740 \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC15\uC870 \uD45C\uC2DC\uB41C \uAE30\uD638 \uC8FC\uC704\uC758 \uD14C\uB450\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCEE4\uC11C \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCEE4\uC11C\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBE14\uB85D \uCEE4\uC11C\uC640 \uACB9\uCE58\uB294 \uAE00\uC790\uC758 \uC0C9\uC0C1\uC744 \uC0AC\uC6A9\uC790 \uC815\uC758\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uACF5\uBC31 \uBB38\uC790 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC904 \uBC88\uD638 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD65C\uC131 \uC601\uC5ED \uC904\uBC88\uD638 \uC0C9\uC0C1","ID\uB294 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editorLineNumber.activeForeground'\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.","\uD3B8\uC9D1\uAE30 \uD65C\uC131 \uC601\uC5ED \uC904\uBC88\uD638 \uC0C9\uC0C1","\uD3B8\uC9D1\uAE30 \uB208\uAE08\uC758 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCF54\uB4DC \uB80C\uC988\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uAD04\uD638 \uB4A4\uC758 \uBC30\uACBD\uC0C9","\uC77C\uCE58\uD558\uB294 \uBE0C\uB798\uD0B7 \uBC15\uC2A4\uC758 \uC0C9\uC0C1","\uAC1C\uC694 \uB208\uAE08 \uACBD\uACC4\uC758 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAC1C\uC694 \uB208\uAE08\uC790\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBBF8\uB2C8\uB9F5\uC774 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uC5B4 \uD3B8\uC9D1\uAE30\uC758 \uC624\uB978\uCABD\uC5D0 \uBC30\uCE58\uB41C \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAC70\uD130\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAC70\uD130\uC5D0\uB294 \uAE00\uB9AC\uD504 \uC5EC\uBC31\uACFC \uD589 \uC218\uAC00 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uBD88\uD544\uC694\uD55C(\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294) \uC18C\uC2A4 \uCF54\uB4DC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.",`\uD3B8\uC9D1\uAE30\uC758 \uBD88\uD544\uC694\uD55C(\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294) \uC18C\uC2A4 \uCF54\uB4DC \uBD88\uD22C\uBA85\uB3C4\uC785\uB2C8\uB2E4. \uC608\uB97C \uB4E4\uC5B4 "#000000c0"\uC740 75% \uBD88\uD22C\uBA85\uB3C4\uB85C \uCF54\uB4DC\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4. \uACE0\uB300\uBE44 \uD14C\uB9C8\uC758 \uACBD\uC6B0 \uD398\uC774\uB4DC \uC544\uC6C3\uD558\uC9C0 \uC54A\uACE0 'editorUnnecessaryCode.border' \uD14C\uB9C8 \uC0C9\uC744 \uC0AC\uC6A9\uD558\uC5EC \uBD88\uD544\uC694\uD55C \uCF54\uB4DC\uC5D0 \uBC11\uC904\uC744 \uADF8\uC73C\uC138\uC694.`,"\uBC94\uC704\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC624\uB958\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/contrib/anchorSelect/anchorSelect":["\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810","{0}\uC5D0 \uC124\uC815\uB41C \uC575\uCEE4: {1}","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810 \uC124\uC815","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810\uC73C\uB85C \uC774\uB3D9","\uC575\uCEE4\uC5D0\uC11C \uCEE4\uC11C\uB85C \uC120\uD0DD","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810 \uCDE8\uC18C"],"vs/editor/contrib/bracketMatching/bracketMatching":["\uAD04\uD638\uC5D0 \uD574\uB2F9\uD558\uB294 \uC601\uC5ED\uC744 \uD45C\uC2DC\uC790\uC5D0 \uCC44\uC0C9\uD558\uC5EC \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uB85C \uC774\uB3D9","\uAD04\uD638\uAE4C\uC9C0 \uC120\uD0DD","\uB300\uAD04\uD638\uB85C \uC774\uB3D9(&&B)"],"vs/editor/contrib/caretOperations/caretOperations":["\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uB97C \uC67C\uCABD\uC73C\uB85C \uC774\uB3D9","\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uB97C \uC624\uB978\uCABD\uC73C\uB85C \uC774\uB3D9"],"vs/editor/contrib/caretOperations/transpose":["\uBB38\uC790 \uBC14\uAFB8\uAE30"],"vs/editor/contrib/clipboard/clipboard":["\uC798\uB77C\uB0B4\uAE30(&&T)","\uC798\uB77C\uB0B4\uAE30","\uC798\uB77C\uB0B4\uAE30","\uBCF5\uC0AC(&&C)","\uBCF5\uC0AC","\uBCF5\uC0AC","\uBD99\uC5EC\uB123\uAE30(&&P)","\uBD99\uC5EC\uB123\uAE30","\uBD99\uC5EC\uB123\uAE30","\uAD6C\uBB38\uC744 \uAC15\uC870 \uD45C\uC2DC\uD558\uC5EC \uBCF5\uC0AC"],"vs/editor/contrib/codeAction/codeActionCommands":["\uC2E4\uD589\uD560 \uCF54\uB4DC \uC791\uC5C5\uC758 \uC885\uB958\uC785\uB2C8\uB2E4.","\uBC18\uD658\uB41C \uC791\uC5C5\uC774 \uC801\uC6A9\uB418\uB294 \uACBD\uC6B0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD56D\uC0C1 \uBC18\uD658\uB41C \uCCAB \uBC88\uC9F8 \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4.","\uCCAB \uBC88\uC9F8 \uBC18\uD658\uB41C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4(\uC774 \uC791\uC5C5\uB9CC \uC788\uB294 \uACBD\uC6B0).","\uBC18\uD658\uB41C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.","\uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5\uB9CC \uBC18\uD658\uB418\uB3C4\uB85D \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD558\uB294 \uC911 \uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.","\uBE60\uB978 \uC218\uC815...","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCF54\uB4DC \uB3D9\uC791\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCF54\uB4DC \uB3D9\uC791\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB9AC\uD329\uD130\uB9C1...","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uB9AC\uD329\uD130\uB9C1 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uB9AC\uD329\uD130\uB9C1 \uC5C6\uC74C","\uAE30\uBCF8 \uC124\uC815 \uB9AC\uD329\uD130\uB9C1\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB9AC\uD399\uD130\uB9C1\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC18C\uC2A4 \uC791\uC5C5...","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uC18C\uC2A4 \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uC18C\uC2A4 \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uAE30\uBCF8 \uC6D0\uBCF8 \uC791\uC5C5 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uC18C\uC2A4 \uC791\uC5C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAC00\uC838\uC624\uAE30 \uAD6C\uC131","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uAC00\uC838\uC624\uAE30 \uAD6C\uC131 \uC791\uC5C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA8\uB450 \uC218\uC815","\uBAA8\uB4E0 \uC791\uC5C5 \uC218\uC815 \uC0AC\uC6A9 \uBD88\uAC00","\uC790\uB3D9 \uC218\uC815...","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uC790\uB3D9 \uC218\uC815 \uC5C6\uC74C"],"vs/editor/contrib/codeAction/lightBulbWidget":["\uC218\uC815 \uC0AC\uD56D\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uAE30\uBCF8 \uC218\uC815({0})","\uC218\uC815 \uC0AC\uD56D \uD45C\uC2DC({0})","\uC218\uC815 \uC0AC\uD56D \uD45C\uC2DC"],"vs/editor/contrib/codelens/codelensController":["\uD604\uC7AC \uC904\uC5D0 \uB300\uD55C \uCF54\uB4DC \uB80C\uC988 \uBA85\uB839 \uD45C\uC2DC"],"vs/editor/contrib/comment/comment":["\uC904 \uC8FC\uC11D \uC124\uC815/\uD574\uC81C","\uC904 \uC8FC\uC11D \uC124\uC815/\uD574\uC81C(&&T)","\uC904 \uC8FC\uC11D \uCD94\uAC00","\uC904 \uC8FC\uC11D \uC81C\uAC70","\uBE14\uB85D \uC8FC\uC11D \uC124\uC815/\uD574\uC81C","\uBE14\uB85D \uC8FC\uC11D \uC124\uC815/\uD574\uC81C(&&B)"],"vs/editor/contrib/contextmenu/contextmenu":["\uD3B8\uC9D1\uAE30 \uC0C1\uD669\uC5D0 \uB9DE\uB294 \uBA54\uB274 \uD45C\uC2DC"],"vs/editor/contrib/cursorUndo/cursorUndo":["\uCEE4\uC11C \uC2E4\uD589 \uCDE8\uC18C","\uCEE4\uC11C \uB2E4\uC2DC \uC2E4\uD589"],"vs/editor/contrib/find/findController":["\uCC3E\uAE30","\uCC3E\uAE30(&&F)","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30","\uB2E4\uC74C \uCC3E\uAE30","\uB2E4\uC74C \uCC3E\uAE30","\uC774\uC804 \uCC3E\uAE30","\uC774\uC804 \uCC3E\uAE30","\uB2E4\uC74C \uC120\uD0DD \uCC3E\uAE30","\uC774\uC804 \uC120\uD0DD \uCC3E\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30(&&R)"],"vs/editor/contrib/find/findWidget":["\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC774 \uCD95\uC18C\uB418\uC5C8\uC74C\uC744 \uB098\uD0C0\uB0B4\uB294 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC774 \uD655\uC7A5\uB418\uC5C8\uC74C\uC744 \uB098\uD0C0\uB0B4\uB294 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uBC14\uAFB8\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uBAA8\uB450 \uBC14\uAFB8\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uC774\uC804 \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uB2E4\uC74C \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uCC3E\uAE30","\uCC3E\uAE30","\uC774\uC804 \uC77C\uCE58","\uB2E4\uC74C \uC77C\uCE58 \uD56D\uBAA9","\uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uCC3E\uAE30","\uB2EB\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uBAA8\uB450 \uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30 \uBAA8\uB4DC \uC124\uC815/\uD574\uC81C","\uCC98\uC74C {0}\uAC1C\uC758 \uACB0\uACFC\uAC00 \uAC15\uC870 \uD45C\uC2DC\uB418\uC9C0\uB9CC \uBAA8\uB4E0 \uCC3E\uAE30 \uC791\uC5C5\uC740 \uC804\uCCB4 \uD14D\uC2A4\uD2B8\uC5D0 \uB300\uD574 \uC218\uD589\uB429\uB2C8\uB2E4.","{1}\uC758 {0}","\uACB0\uACFC \uC5C6\uC74C","{0}\uAC1C \uCC3E\uC74C","'{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","{2}\uC5D0\uC11C '{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","'{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","Ctrl+Enter\uB97C \uB204\uB974\uBA74 \uC774\uC81C \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uBC14\uAFB8\uC9C0 \uC54A\uACE0 \uC904 \uBC14\uAFC8\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4. editor.action.replaceAll\uC758 \uD0A4 \uBC14\uC778\uB529\uC744 \uC218\uC815\uD558\uC5EC \uC774 \uB3D9\uC791\uC744 \uC7AC\uC815\uC758\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/folding/folding":["\uD3BC\uCE58\uAE30","\uC7AC\uADC0\uC801\uC73C\uB85C \uD3BC\uCE58\uAE30","\uC811\uAE30","\uC811\uAE30 \uC804\uD658","\uC7AC\uADC0\uC801\uC73C\uB85C \uC811\uAE30","\uBAA8\uB4E0 \uBE14\uB85D \uCF54\uBA58\uD2B8\uB97C \uC811\uAE30","\uBAA8\uB4E0 \uC601\uC5ED \uC811\uAE30","\uBAA8\uB4E0 \uC601\uC5ED \uD3BC\uCE58\uAE30","\uBAA8\uB450 \uC811\uAE30","\uBAA8\uB450 \uD3BC\uCE58\uAE30","\uC218\uC900 {0} \uC811\uAE30","\uC811\uD78C \uBC94\uC704\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC0C9\uC740 \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uAE30 \uC704\uD574 \uBD88\uD22C\uBA85\uD574\uC11C\uB294 \uC548 \uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC5EC\uBC31\uC758 \uC811\uAE30 \uCEE8\uD2B8\uB864 \uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/contrib/folding/foldingDecorations":["\uD3B8\uC9D1\uAE30 \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC5D0\uC11C \uD655\uC7A5\uB41C \uBC94\uC704\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC5D0\uC11C \uCD95\uC18C\uB41C \uBC94\uC704\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4."],"vs/editor/contrib/fontZoom/fontZoom":["\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uD655\uB300","\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uCD95\uC18C","\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uD655\uB300/\uCD95\uC18C \uB2E4\uC2DC \uC124\uC815"],"vs/editor/contrib/format/format":["\uC904 {0}\uC5D0\uC11C 1\uAC1C \uC11C\uC2DD \uD3B8\uC9D1\uC744 \uC218\uD589\uD588\uC2B5\uB2C8\uB2E4.","\uC904 {1}\uC5D0\uC11C {0}\uAC1C \uC11C\uC2DD \uD3B8\uC9D1\uC744 \uC218\uD589\uD588\uC2B5\uB2C8\uB2E4.","\uC904 {0}\uACFC(\uC640) {1} \uC0AC\uC774\uC5D0\uC11C 1\uAC1C \uC11C\uC2DD \uD3B8\uC9D1\uC744 \uC218\uD589\uD588\uC2B5\uB2C8\uB2E4.","\uC904 {1}\uACFC(\uC640) {2} \uC0AC\uC774\uC5D0\uC11C {0}\uAC1C \uC11C\uC2DD \uD3B8\uC9D1\uC744 \uC218\uD589\uD588\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/format/formatActions":["\uBB38\uC11C \uC11C\uC2DD","\uC120\uD0DD \uC601\uC5ED \uC11C\uC2DD"],"vs/editor/contrib/gotoError/gotoError":["\uB2E4\uC74C \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uB2E4\uC74C \uB9C8\uCEE4\uB85C \uC774\uB3D9\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774\uC804 \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uC774\uC804 \uB9C8\uCEE4\uB85C \uC774\uB3D9\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD30C\uC77C\uC758 \uB2E4\uC74C \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uB2E4\uC74C \uBB38\uC81C(&&P)","\uD30C\uC77C\uC758 \uC774\uC804 \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uC774\uC804 \uBB38\uC81C(&&P)"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\uC624\uB958","\uACBD\uACE0","\uC815\uBCF4","\uD78C\uD2B8","{1}\uC758 {0}\uC785\uB2C8\uB2E4. ","\uBB38\uC81C {1}\uAC1C \uC911 {0}\uAC1C","\uBB38\uC81C {1}\uAC1C \uC911 {0}\uAC1C","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uC624\uB958 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uACBD\uACE0 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uC815\uBCF4 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uBC30\uACBD\uC785\uB2C8\uB2E4."],"vs/editor/contrib/gotoSymbol/goToCommands":["\uD53C\uD0B9","\uC815\uC758","'{0}'\uC5D0 \uB300\uD55C \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC815\uC758\uB85C \uC774\uB3D9","\uC815\uC758\uB85C \uC774\uB3D9(&&D)","\uCE21\uBA74\uC5D0\uC11C \uC815\uC758 \uC5F4\uAE30","\uC815\uC758 \uD53C\uD0B9","\uC120\uC5B8","'{0}'\uC5D0 \uB300\uD55C \uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9","\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9(&&D)","'{0}'\uC5D0 \uB300\uD55C \uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8 \uBBF8\uB9AC \uBCF4\uAE30","\uD615\uC2DD \uC815\uC758","'{0}'\uC5D0 \uB300\uD55C \uD615\uC2DD \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD615\uC2DD \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9","\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9(&&T)","\uD615\uC2DD \uC815\uC758 \uBBF8\uB9AC \uBCF4\uAE30","\uAD6C\uD604","'{0}'\uC5D0 \uB300\uD55C \uAD6C\uD604\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAD6C\uD604\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9","\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9(&&I)","\uD53C\uD0B9 \uAD6C\uD604","'{0}'\uC5D0 \uB300\uD55C \uCC38\uC870\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCC38\uC870\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCC38\uC870\uB85C \uC774\uB3D9","\uCC38\uC870\uB85C \uC774\uB3D9(&&R)","\uCC38\uC870","\uCC38\uC870 \uBBF8\uB9AC \uBCF4\uAE30","\uCC38\uC870","\uAE30\uD638\uB85C \uC774\uB3D9","\uC704\uCE58","'{0}'\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC74C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["{0}\uAC1C \uC815\uC758\uB97C \uD45C\uC2DC\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\uB85C\uB4DC \uC911...","{0}({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["\uCC38\uC870 {0}\uAC1C","\uCC38\uC870 {0}\uAC1C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\uBBF8\uB9AC \uBCF4\uAE30\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uACB0\uACFC \uC5C6\uC74C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/referencesModel":["{2}\uC5F4, {1}\uC904, {0}\uC758 \uAE30\uD638","\uC5F4 {2}, {3}\uC758 \uC904 {1}\uC5D0 \uC788\uB294 {0}\uC758 \uAE30\uD638","{0}\uC758 \uAE30\uD638 1\uAC1C, \uC804\uCCB4 \uACBD\uB85C {1}","{1}\uC758 \uAE30\uD638 {0}\uAC1C, \uC804\uCCB4 \uACBD\uB85C {2}","\uACB0\uACFC \uC5C6\uC74C","{0}\uC5D0\uC11C \uAE30\uD638 1\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uAE30\uD638 {0}\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4.","{1}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uAE30\uD638 {0}\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/gotoSymbol/symbolNavigation":["{1}\uC758 {0} \uAE30\uD638, \uB2E4\uC74C\uC758 \uACBD\uC6B0 {2}","{1}\uC758 \uAE30\uD638 {0}"],"vs/editor/contrib/hover/hover":["\uAC00\uB9AC\uD0A4\uAE30 \uD45C\uC2DC","\uC815\uC758 \uBBF8\uB9AC \uBCF4\uAE30 \uAC00\uB9AC\uD0A8 \uD56D\uBAA9 \uD45C\uC2DC"],"vs/editor/contrib/hover/markdownHoverParticipant":["\uB85C\uB4DC \uC911..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","\uBE60\uB978 \uC218\uC815\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uBE60\uB978 \uC218\uC815\uC744 \uD655\uC778\uD558\uB294 \uC911...","\uBE60\uB978 \uC218\uC815\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uBE60\uB978 \uC218\uC815..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\uC774\uC804 \uAC12\uC73C\uB85C \uBC14\uAFB8\uAE30","\uB2E4\uC74C \uAC12\uC73C\uB85C \uBC14\uAFB8\uAE30"],"vs/editor/contrib/indentation/indentation":["\uB4E4\uC5EC\uC4F0\uAE30\uB97C \uACF5\uBC31\uC73C\uB85C \uBCC0\uD658","\uB4E4\uC5EC\uC4F0\uAE30\uB97C \uD0ED\uC73C\uB85C \uBCC0\uD658","\uAD6C\uC131\uB41C \uD0ED \uD06C\uAE30","\uD604\uC7AC \uD30C\uC77C\uC758 \uD0ED \uD06C\uAE30 \uC120\uD0DD","\uD0ED\uC744 \uC0AC\uC6A9\uD55C \uB4E4\uC5EC\uC4F0\uAE30","\uACF5\uBC31\uC744 \uC0AC\uC6A9\uD55C \uB4E4\uC5EC\uC4F0\uAE30","\uCF58\uD150\uCE20\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC10\uC9C0","\uC904 \uB2E4\uC2DC \uB4E4\uC5EC\uC4F0\uAE30","\uC120\uD0DD\uD55C \uC904 \uB2E4\uC2DC \uB4E4\uC5EC\uC4F0\uAE30"],"vs/editor/contrib/linesOperations/linesOperations":["\uC704\uC5D0 \uC904 \uBCF5\uC0AC","\uC704\uC5D0 \uC904 \uBCF5\uC0AC(&&C)","\uC544\uB798\uC5D0 \uC904 \uBCF5\uC0AC","\uC544\uB798\uC5D0 \uC904 \uBCF5\uC0AC(&&P)","\uC911\uBCF5\uB41C \uC120\uD0DD \uC601\uC5ED","\uC911\uBCF5\uB41C \uC120\uD0DD \uC601\uC5ED(&&D)","\uC904 \uC704\uB85C \uC774\uB3D9","\uC904 \uC704\uB85C \uC774\uB3D9(&&V)","\uC904 \uC544\uB798\uB85C \uC774\uB3D9","\uC904 \uC544\uB798\uB85C \uC774\uB3D9(&&L)","\uC904\uC744 \uC624\uB984\uCC28\uC21C \uC815\uB82C","\uC904\uC744 \uB0B4\uB9BC\uCC28\uC21C\uC73C\uB85C \uC815\uB82C","\uD6C4\uD589 \uACF5\uBC31 \uC790\uB974\uAE30","\uC904 \uC0AD\uC81C","\uC904 \uB4E4\uC5EC\uC4F0\uAE30","\uC904 \uB0B4\uC5B4\uC4F0\uAE30","\uC704\uC5D0 \uC904 \uC0BD\uC785","\uC544\uB798\uC5D0 \uC904 \uC0BD\uC785","\uC67C\uCABD \uBAA8\uB450 \uC0AD\uC81C","\uC6B0\uCE21\uC5D0 \uC788\uB294 \uD56D\uBAA9 \uC0AD\uC81C","\uC904 \uC5F0\uACB0","\uCEE4\uC11C \uC8FC\uC704 \uBB38\uC790 \uBC14\uAFB8\uAE30","\uB300\uBB38\uC790\uB85C \uBCC0\uD658","\uC18C\uBB38\uC790\uB85C \uBCC0\uD658","\uB2E8\uC5B4\uC758 \uCCAB \uAE00\uC790\uB97C \uB300\uBB38\uC790\uB85C \uBCC0\uD658","\uC2A4\uB124\uC774\uD06C \uD45C\uAE30\uBC95\uC73C\uB85C \uBCC0\uD658"],"vs/editor/contrib/linkedEditing/linkedEditing":["\uC5F0\uACB0\uB41C \uD3B8\uC9D1 \uC2DC\uC791","\uD615\uC2DD\uC758 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC774\uB984\uC744 \uBC14\uAFC0 \uB54C\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/contrib/links/links":["\uBA85\uB839 \uC2E4\uD589","\uB9C1\uD06C\uB85C \uC774\uB3D9","Cmd+\uD074\uB9AD","Ctrl+\uD074\uB9AD","Option+\uD074\uB9AD","Alt+\uD074\uB9AD","\uBA85\uB839 {0} \uC2E4\uD589","{0} \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC774 \uB9C1\uD06C\uB97C \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4","\uB300\uC0C1\uC774 \uC5C6\uC73C\uBBC0\uB85C \uC774 \uB9C1\uD06C\uB97C \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uB9C1\uD06C \uC5F4\uAE30"],"vs/editor/contrib/message/messageController":["\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD604\uC7AC \uC778\uB77C\uC778 \uBA54\uC2DC\uC9C0\uB97C \uD45C\uC2DC\uD558\uB294\uC9C0 \uC5EC\uBD80","\uC77D\uAE30 \uC804\uC6A9 \uD3B8\uC9D1\uAE30\uC5D0\uC11C\uB294 \uD3B8\uC9D1\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/multicursor/multicursor":["\uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&A)","\uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&D)","\uC904 \uB05D\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC904 \uB05D\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&U)","\uB9E8 \uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uB9E8 \uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uB2E4\uC74C \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC5D0 \uC120\uD0DD \uD56D\uBAA9 \uCD94\uAC00","\uB2E4\uC74C \uD56D\uBAA9 \uCD94\uAC00(&&N)","\uC774\uC804 \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC5D0 \uC120\uD0DD \uD56D\uBAA9 \uCD94\uAC00","\uC774\uC804 \uD56D\uBAA9 \uCD94\uAC00(&&R)","\uB2E4\uC74C \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uB85C \uB9C8\uC9C0\uB9C9 \uC120\uD0DD \uD56D\uBAA9 \uC774\uB3D9","\uB9C8\uC9C0\uB9C9 \uC120\uD0DD \uD56D\uBAA9\uC744 \uC774\uC804 \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uB85C \uC774\uB3D9","\uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC758 \uBAA8\uB4E0 \uD56D\uBAA9 \uC120\uD0DD","\uBAA8\uB4E0 \uD56D\uBAA9 \uC120\uD0DD(&&O)","\uBAA8\uB4E0 \uD56D\uBAA9 \uBCC0\uACBD"],"vs/editor/contrib/parameterHints/parameterHints":["\uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD2B8\uB9AC\uAC70"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["\uB2E4\uC74C \uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD45C\uC2DC\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774\uC804 \uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD45C\uC2DC\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","{0}, \uD78C\uD2B8"],"vs/editor/contrib/peekView/peekView":["\uB2EB\uAE30","Peek \uBDF0 \uC81C\uBAA9 \uC601\uC5ED\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uC81C\uBAA9 \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uC81C\uBAA9 \uC815\uBCF4 \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD14C\uB450\uB9AC \uBC0F \uD654\uC0B4\uD45C \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uB77C\uC778 \uB178\uB4DC\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uD30C\uC77C \uB178\uB4DC\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uAC70\uD130 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\uC6B0\uC120 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB97C \uC5F4\uACE0 \uC904\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","{0} \uC904 \uBC0F {1} \uC5F4\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","{0} \uC904\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uC904: {0}, \uBB38\uC790: {1} \uC774\uB3D9\uD560 \uC904 1~{2} \uC0AC\uC774\uC758 \uBC88\uD638\uB97C \uC785\uB825\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uC904: {0}, \uBB38\uC790: {1}. \uC774\uB3D9\uD560 \uC904 \uBC88\uD638\uB97C \uC785\uB825\uD569\uB2C8\uB2E4."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\uAE30\uD638\uB85C \uC774\uB3D9\uD558\uB824\uBA74 \uBA3C\uC800 \uAE30\uD638 \uC815\uBCF4\uAC00 \uC788\uB294 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB97C \uC5FD\uB2C8\uB2E4.","\uD65C\uC131 \uC0C1\uD0DC\uC758 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB294 \uAE30\uD638 \uC815\uBCF4\uB97C \uC81C\uACF5\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD3B8\uC9D1\uAE30 \uAE30\uD638 \uC5C6\uC74C","\uD3B8\uC9D1\uAE30 \uAE30\uD638 \uC5C6\uC74C","\uCE21\uBA74\uC5D0\uC11C \uC5F4\uAE30","\uD558\uB2E8\uC5D0 \uC5F4\uAE30","\uAE30\uD638({0})","\uC18D\uC131({0})","\uBA54\uC11C\uB4DC({0})","\uD568\uC218({0})","\uC0DD\uC131\uC790({0})","\uBCC0\uC218({0})","\uD074\uB798\uC2A4({0})","\uAD6C\uC870\uCCB4({0})","\uC774\uBCA4\uD2B8({0})","\uC5F0\uC0B0\uC790({0})","\uC778\uD130\uD398\uC774\uC2A4({0})","\uB124\uC784\uC2A4\uD398\uC774\uC2A4({0})","\uD328\uD0A4\uC9C0({0})","\uD615\uC2DD \uB9E4\uAC1C \uBCC0\uC218({0})","\uBAA8\uB4C8({0})","\uC18D\uC131({0})","\uC5F4\uAC70\uD615({0})","\uC5F4\uAC70\uD615 \uBA64\uBC84({0})","\uBB38\uC790\uC5F4({0})","\uD30C\uC77C({0})","\uBC30\uC5F4({0})","\uC22B\uC790({0})","\uBD80\uC6B8({0})","\uAC1C\uCCB4({0})","\uD0A4({0})","\uD544\uB4DC({0})","\uC0C1\uC218({0})"],"vs/editor/contrib/rename/rename":["\uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC704\uCE58 \uC774\uB984\uC744 \uBC14\uAFB8\uB294 \uC911 \uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.","'{0}'\uC758 \uC774\uB984\uC744 \uBC14\uAFB8\uB294 \uC911","{0} \uC774\uB984 \uBC14\uAFB8\uAE30","'{0}'\uC744(\uB97C) '{1}'(\uC73C)\uB85C \uC774\uB984\uC744 \uBCC0\uACBD\uD588\uC2B5\uB2C8\uB2E4. \uC694\uC57D: {2}","\uC774\uB984 \uBC14\uAFB8\uAE30\uB97C \uD1B5\uD574 \uD3B8\uC9D1 \uB0B4\uC6A9\uC744 \uC801\uC6A9\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC774\uB984 \uBC14\uAFB8\uAE30\uB97C \uD1B5\uD574 \uD3B8\uC9D1 \uB0B4\uC6A9\uC744 \uACC4\uC0B0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uAE30\uD638 \uC774\uB984 \uBC14\uAFB8\uAE30","\uC774\uB984\uC744 \uBC14\uAFB8\uAE30 \uC804\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uBBF8\uB9AC \uBCFC \uC218 \uC788\uB294 \uAE30\uB2A5 \uC0AC\uC6A9/\uC0AC\uC6A9 \uC548 \uD568"],"vs/editor/contrib/rename/renameInputField":["\uC785\uB825 \uC774\uB984\uC744 \uBC14\uAFB8\uC138\uC694. \uC0C8 \uC774\uB984\uC744 \uC785\uB825\uD55C \uB2E4\uC74C [Enter] \uD0A4\uB97C \uB20C\uB7EC \uCEE4\uBC0B\uD558\uC138\uC694.","\uC774\uB984 \uBC14\uAFB8\uAE30 {0}, \uBBF8\uB9AC \uBCF4\uAE30 {1}"],"vs/editor/contrib/smartSelect/smartSelect":["\uC120\uD0DD \uC601\uC5ED \uD655\uC7A5","\uC120\uD0DD \uC601\uC5ED \uD655\uC7A5(&&E)","\uC120\uD0DD \uC601\uC5ED \uCD95\uC18C","\uC120\uD0DD \uC601\uC5ED \uCD95\uC18C(&&S)"],"vs/editor/contrib/snippet/snippetVariables":["\uC77C\uC694\uC77C","\uC6D4\uC694\uC77C","\uD654\uC694\uC77C","\uC218\uC694\uC77C","\uBAA9\uC694\uC77C","\uAE08\uC694\uC77C","\uD1A0\uC694\uC77C","\uC77C","\uC6D4","\uD654","\uC218","\uBAA9","\uAE08","\uD1A0","1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4","1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4"],"vs/editor/contrib/suggest/suggestController":["{0}\uC758 {1}\uAC1C\uC758 \uC218\uC815\uC0AC\uD56D\uC744 \uC218\uB77D\uD558\uB294 \uC911","\uC81C\uC548 \uD56D\uBAA9 \uD2B8\uB9AC\uAC70","\uC0BD\uC785","\uC0BD\uC785","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uC0BD\uC785","\uAC04\uB2E8\uD788 \uD45C\uC2DC","\uB354 \uBCF4\uAE30","\uC81C\uC548 \uC704\uC82F \uD06C\uAE30 \uB2E4\uC2DC \uC124\uC815"],"vs/editor/contrib/suggest/suggestWidget":["\uC81C\uC548 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uD55C \uC704\uC82F\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","\uB85C\uB4DC \uC911...","\uC81C\uC548 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","{0}, \uBB38\uC11C: {1}","\uC81C\uC548"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\uB2EB\uAE30","\uB85C\uB4DC \uC911..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\uC81C\uC548 \uC704\uC82F\uC5D0\uC11C \uC790\uC138\uD55C \uC815\uBCF4\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC790\uC138\uD55C \uC815\uBCF4"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\uBC30\uC5F4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uBD80\uC6B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD074\uB798\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC0C9 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0C1\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC0DD\uC131\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC5F4\uAC70\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC5F4\uAC70\uC790 \uBA64\uBC84 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC774\uBCA4\uD2B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD544\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD30C\uC77C \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD3F4\uB354 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD568\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC778\uD130\uD398\uC774\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD0A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD0A4\uC6CC\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uBA54\uC11C\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBAA8\uB4C8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uB124\uC784\uC2A4\uD398\uC774\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","null \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC22B\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uAC1C\uCCB4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC5F0\uC0B0\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD328\uD0A4\uC9C0 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC18D\uC131 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uCC38\uC870 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uAD6C\uC870 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD615\uC2DD \uB9E4\uAC1C\uBCC0\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uB2E8\uC704 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBCC0\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":[" \uD0A4\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uB3D9 \uC124\uC815/\uD574\uC81C","\uC774\uC81C \uD0A4\uB97C \uB204\uB974\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uB2E4\uC74C \uD3EC\uCEE4\uC2A4 \uAC00\uB2A5\uD55C \uC694\uC18C\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","\uC774\uC81C \uD0A4\uB97C \uB204\uB974\uBA74 \uD0ED \uBB38\uC790\uAC00 \uC0BD\uC785\uB429\uB2C8\uB2E4."],"vs/editor/contrib/tokenization/tokenization":["\uAC1C\uBC1C\uC790: \uAC15\uC81C\uB85C \uB2E4\uC2DC \uD1A0\uD070\uD654"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uAC80\uC0C9\uB428","\uC774 \uD30C\uC77C\uC5D0 LS(\uC904 \uAD6C\uBD84 \uAE30\uD638) \uB610\uB294 PS(\uB2E8\uB77D \uAD6C\uBD84 \uAE30\uD638) \uAC19\uC740 \uD558\uB098 \uC774\uC0C1\uC758 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790 \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.\r\n\r\n\uD30C\uC77C\uC5D0\uC11C \uC81C\uAC70\uD558\uB294 \uAC83\uC774 \uC88B\uC2B5\uB2C8\uB2E4. `editor.unusualLineTerminators`\uB97C \uD1B5\uD574 \uAD6C\uC131\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uD30C\uC77C \uC218\uC815","\uC774 \uD30C\uC77C\uC758 \uBB38\uC81C \uBB34\uC2DC"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\uBCC0\uC218 \uC77D\uAE30\uC640 \uAC19\uC740 \uC77D\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uBCC0\uC218\uC5D0 \uC4F0\uAE30\uC640 \uAC19\uC740 \uC4F0\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uBCC0\uC218 \uC77D\uAE30\uC640 \uAC19\uC740 \uC77D\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBCC0\uC218\uC5D0 \uC4F0\uAE30\uC640 \uAC19\uC740 \uC4F0\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uAE30\uD638 \uAC15\uC870 \uD45C\uC2DC\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC4F0\uAE30 \uC561\uC138\uC2A4 \uAE30\uD638\uC5D0 \uB300\uD55C \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uB2E4\uC74C \uAC15\uC870 \uAE30\uD638\uB85C \uC774\uB3D9","\uC774\uC804 \uAC15\uC870 \uAE30\uD638\uB85C \uC774\uB3D9","\uAE30\uD638 \uAC15\uC870 \uD45C\uC2DC \uD2B8\uB9AC\uAC70"],"vs/editor/contrib/wordOperations/wordOperations":["\uB2E8\uC5B4 \uC0AD\uC81C"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0}({1})"],"vs/platform/configuration/common/configurationRegistry":["\uAE30\uBCF8 \uC5B8\uC5B4 \uAD6C\uC131 \uC7AC\uC815\uC758","\uC5B8\uC5B4\uC5D0 \uB300\uD574 \uC7AC\uC815\uC758\uD560 \uD3B8\uC9D1\uAE30 \uC124\uC815\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uC5B8\uC5B4\uBCC4 \uAD6C\uC131\uC744 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBE48 \uC18D\uC131\uC744 \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC744(\uB97C) \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774\uB294 \uC5B8\uC5B4\uBCC4 \uD3B8\uC9D1\uAE30 \uC124\uC815\uC744 \uC124\uBA85\uD558\uB294 \uC18D\uC131 \uD328\uD134\uC778 '\\\\[.*\\\\]$'\uACFC(\uC640) \uC77C\uCE58\uD569\uB2C8\uB2E4. 'configurationDefaults' \uAE30\uC5EC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.","'{0}'\uC744(\uB97C) \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774 \uC18D\uC131\uC740 \uC774\uBBF8 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."],"vs/platform/contextkey/browser/contextKeyService":["\uCEE8\uD14D\uC2A4\uD2B8 \uD0A4\uC5D0 \uB300\uD55C \uC815\uBCF4\uB97C \uBC18\uD658\uD558\uB294 \uBA85\uB839"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["({0})\uC744(\uB97C) \uB20C\uB800\uC2B5\uB2C8\uB2E4. \uB458\uC9F8 \uD0A4\uB294 \uC7A0\uC2DC \uAE30\uB2E4\uB838\uB2E4\uAC00 \uB204\uB974\uC2ED\uC2DC\uC624...","\uD0A4 \uC870\uD569({0}, {1})\uC740 \uBA85\uB839\uC774 \uC544\uB2D9\uB2C8\uB2E4."],"vs/platform/list/browser/listService":["\uC6CC\uD06C\uBCA4\uCE58","Windows\uC640 Linux\uC758 'Control'\uC744 macOS\uC758 'Command'\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Alt'\uB97C macOS\uC758 'Option'\uC73C\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC758 \uD56D\uBAA9\uC744 \uB2E4\uC911 \uC120\uD0DD\uC5D0 \uCD94\uAC00\uD560 \uB54C \uC0AC\uC6A9\uD560 \uD55C\uC815\uC790\uC785\uB2C8\uB2E4(\uC608\uB97C \uB4E4\uC5B4 \uD0D0\uC0C9\uAE30\uC5D0\uC11C \uD3B8\uC9D1\uAE30\uC640 SCM \uBCF4\uAE30\uB97C \uC5EC\uB294 \uACBD\uC6B0). '\uC606\uC5D0\uC11C \uC5F4\uAE30' \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98(\uC9C0\uC6D0\uB418\uB294 \uACBD\uC6B0)\uB294 \uB2E4\uC911 \uC120\uD0DD \uD55C\uC815\uC790\uC640 \uCDA9\uB3CC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC870\uC815\uB429\uB2C8\uB2E4.","\uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C \uB9C8\uC6B0\uC2A4\uB97C \uC0AC\uC6A9\uD558\uC5EC \uD56D\uBAA9\uC744 \uC5EC\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4(\uC9C0\uC6D0\uB418\uB294 \uACBD\uC6B0). \uC77C\uBD80 \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C\uB294 \uC774 \uC124\uC815\uC744 \uC801\uC6A9\uD560 \uC218 \uC5C6\uB294 \uACBD\uC6B0 \uBB34\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC5D0\uC11C \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC758 \uAC00\uB85C \uC2A4\uD06C\uB864 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uACBD\uACE0: \uC774 \uC124\uC815\uC744 \uCF1C\uBA74 \uC131\uB2A5\uC5D0 \uC601\uD5A5\uC744 \uBBF8\uCE69\uB2C8\uB2E4.","\uD2B8\uB9AC \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uD53D\uC140 \uB2E8\uC704\uB85C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD2B8\uB9AC\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBAA9\uB85D\uACFC \uD2B8\uB9AC\uC5D0 \uBD80\uB4DC\uB7EC\uC6B4 \uD654\uBA74 \uC774\uB3D9 \uAE30\uB2A5\uC774 \uC788\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAC04\uB2E8\uD55C \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uB294 \uC694\uC18C\uC5D0 \uC9D1\uC911\uD569\uB2C8\uB2E4. \uC77C\uCE58\uB294 \uC811\uB450\uC0AC\uC5D0\uC11C\uB9CC \uC218\uD589\uB429\uB2C8\uB2E4.","\uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uAC15\uC870 \uD45C\uC2DC\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uB294 \uC694\uC18C\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uC774\uD6C4\uB85C \uD0D0\uC0C9\uC5D0\uC11C \uC704 \uBC0F \uC544\uB798\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0 \uAC15\uC870 \uD45C\uC2DC\uB41C \uC694\uC18C\uB9CC \uD2B8\uB798\uBC84\uC2A4\uD569\uB2C8\uB2E4.","\uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uD544\uD130\uB9C1\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uC9C0 \uC54A\uB294 \uC694\uC18C\uB97C \uBAA8\uB450 \uD544\uD130\uB9C1\uD558\uC5EC \uC228\uAE41\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC758 \uBAA9\uB85D \uBC0F \uD2B8\uB9AC \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uAC04\uC18C\uD654\uD558\uACE0, \uAC15\uC870 \uD45C\uC2DC\uD558\uACE0, \uD544\uD130\uB9C1\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9\uC774 \uC785\uB825\uB9CC\uC73C\uB85C \uC790\uB3D9 \uD2B8\uB9AC\uAC70\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. 'false'\uB85C \uC124\uC815\uD558\uBA74 'list.toggleKeyboardNavigation' \uBA85\uB839\uC744 \uC2E4\uD589\uD560 \uB54C\uB9CC \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9\uC774 \uD2B8\uB9AC\uAC70\uB418\uC5B4 \uBC14\uB85C \uAC00\uAE30 \uD0A4\uB97C \uD560\uB2F9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD3F4\uB354 \uC774\uB984\uC744 \uD074\uB9AD\uD560 \uB54C \uD2B8\uB9AC \uD3F4\uB354\uAC00 \uD655\uC7A5\uB418\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC77C\uBD80 \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C\uB294 \uC774 \uC124\uC815\uC744 \uC801\uC6A9\uD560 \uC218 \uC5C6\uB294 \uACBD\uC6B0 \uBB34\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."],"vs/platform/markers/common/markers":["\uC624\uB958","\uACBD\uACE0","\uC815\uBCF4"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\uCD5C\uADFC\uC5D0 \uC0AC\uC6A9\uD55C \uD56D\uBAA9","\uAE30\uD0C0 \uBA85\uB839","\uBA85\uB839 '{0}'\uC5D0\uC11C \uC624\uB958({1})\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4."],"vs/platform/quickinput/browser/helpQuickAccess":["\uC804\uC5ED \uBA85\uB839","\uD3B8\uC9D1\uAE30 \uBA85\uB839","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\uC804\uCCB4 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC624\uB958 \uBA54\uC2DC\uC9C0\uC5D0 \uB300\uD55C \uC804\uCCB4 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58 \uC544\uC774\uCF58\uC758 \uAE30\uBCF8 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uC694\uC18C\uC758 \uC804\uCCB4 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uB354 \uB69C\uB837\uC774 \uB300\uBE44\uB418\uB3C4\uB85D \uC694\uC18C\uB97C \uB2E4\uB978 \uC694\uC18C\uC640 \uAD6C\uBD84\uD558\uB294 \uC694\uC18C \uC8FC\uC704\uC758 \uCD94\uAC00 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uB354 \uB69C\uB837\uC774 \uB300\uBE44\uB418\uB3C4\uB85D \uC694\uC18C\uB97C \uB2E4\uB978 \uC694\uC18C\uC640 \uAD6C\uBD84\uD558\uB294 \uD65C\uC131 \uC694\uC18C \uC8FC\uC704\uC758 \uCD94\uAC00 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uB0B4 \uB9C1\uD06C\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uB0B4 \uCF54\uB4DC \uBE14\uB85D\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4\uC5D0\uC11C \uCC3E\uAE30/\uBC14\uAFB8\uAE30 \uAC19\uC740 \uC704\uC82F\uC758 \uADF8\uB9BC\uC790 \uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uC804\uACBD\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uB4DC\uB86D\uB2E4\uC6B4 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uB4DC\uB86D\uB2E4\uC6B4 \uC804\uACBD\uC785\uB2C8\uB2E4.","\uB2E8\uCD94 \uAE30\uBCF8 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB2E8\uCD94 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uB2E8\uCD94 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBC30\uC9C0 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBC30\uC9C0\uB294 \uAC80\uC0C9 \uACB0\uACFC \uC218\uC640 \uAC19\uC740 \uC18C\uB7C9\uC758 \uC815\uBCF4 \uB808\uC774\uBE14\uC785\uB2C8\uB2E4.","\uBC30\uC9C0 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBC30\uC9C0\uB294 \uAC80\uC0C9 \uACB0\uACFC \uC218\uC640 \uAC19\uC740 \uC18C\uB7C9\uC758 \uC815\uBCF4 \uB808\uC774\uBE14\uC785\uB2C8\uB2E4.","\uC2A4\uD06C\uB864\uB418\uB294 \uBCF4\uAE30\uB97C \uB098\uD0C0\uB0B4\uB294 \uC2A4\uD06C\uB864 \uB9C9\uB300 \uADF8\uB9BC\uC790\uC785\uB2C8\uB2E4.","\uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uBC84 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD074\uB9AD\uB41C \uC0C1\uD0DC\uC77C \uB54C \uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC7A5\uAE30 \uC791\uC5C5\uC744 \uB300\uC0C1\uC73C\uB85C \uD45C\uC2DC\uB420 \uC218 \uC788\uB294 \uC9C4\uD589\uB960 \uD45C\uC2DC\uC904\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC624\uB958 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uC624\uB958 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC624\uB958 \uC0C1\uC790\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACBD\uACE0 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uACBD\uACE0 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACBD\uACE0 \uC0C1\uC790\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC815\uBCF4 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uC815\uBCF4 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC815\uBCF4 \uC0C1\uC790\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD78C\uD2B8 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD78C\uD2B8 \uC0C1\uC790\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAE30\uBCF8 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCC3E\uAE30/\uBC14\uAFB8\uAE30 \uAC19\uC740 \uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCC3E\uAE30/\uBC14\uAFB8\uAE30\uC640 \uAC19\uC740 \uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC704\uC82F\uC5D0 \uD14C\uB450\uB9AC\uAC00 \uC788\uACE0 \uC704\uC82F\uC774 \uC0C9\uC0C1\uC744 \uBB34\uC2DC\uD558\uC9C0 \uC54A\uC744 \uB54C\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC704\uC82F \uD06C\uAE30 \uC870\uC815 \uB9C9\uB300\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uC704\uC82F\uC5D0\uC11C \uD06C\uAE30 \uC870\uC815 \uB9C9\uB300\uB97C \uD45C\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD558\uACE0 \uC704\uC82F\uC5D0\uC11C \uC0C9\uC744 \uC7AC\uC9C0\uC815\uD558\uC9C0 \uC54A\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uBC30\uACBD\uC0C9. \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uC804\uACBD\uC0C9. \uC774 \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uC81C\uBAA9 \uBC30\uACBD\uC0C9. \uC774 \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBE60\uB978 \uC120\uD0DD\uAE30 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uADF8\uB8F9\uD654 \uB808\uC774\uBE14\uC5D0 \uB300\uD55C \uBE60\uB978 \uC120\uD0DD\uAE30 \uC0C9\uC785\uB2C8\uB2E4.","\uADF8\uB8F9\uD654 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBE60\uB978 \uC120\uD0DD\uAE30 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC601\uC5ED\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uACE0\uB300\uBE44\uB97C \uC704\uD55C \uC120\uD0DD \uD14D\uC2A4\uD2B8\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uD3B8\uC9D1\uAE30\uC758 \uC120\uD0DD \uD56D\uBAA9 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uACFC \uB3D9\uC77C\uD55C \uCF58\uD150\uCE20\uAC00 \uC788\uB294 \uC601\uC5ED\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uACFC \uB3D9\uC77C\uD55C \uCF58\uD150\uCE20\uAC00 \uC788\uB294 \uC601\uC5ED\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD604\uC7AC \uAC80\uC0C9 \uC77C\uCE58 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uAE30\uD0C0 \uAC80\uC0C9 \uC77C\uCE58 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC80\uC0C9\uC744 \uC81C\uD55C\uD558\uB294 \uBC94\uC704\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD604\uC7AC \uAC80\uC0C9\uACFC \uC77C\uCE58\uD558\uB294 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uB2E4\uB978 \uAC80\uC0C9\uACFC \uC77C\uCE58\uD558\uB294 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uAC80\uC0C9\uC744 \uC81C\uD55C\uD558\uB294 \uBC94\uC704\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD638\uBC84\uAC00 \uD45C\uC2DC\uB41C \uB2E8\uC5B4 \uC544\uB798\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uBC30\uACBD\uC0C9.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84 \uC0C1\uD0DC \uD45C\uC2DC\uC904\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD65C\uC131 \uB9C1\uD06C\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uC804\uACBD\uC0C9","\uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uBC30\uACBD\uC0C9","\uC804\uAD6C \uC791\uC5C5 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uC804\uAD6C \uC790\uB3D9 \uC218\uC815 \uC791\uC5C5 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uC0BD\uC785\uB41C \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC81C\uAC70\uB41C \uD14D\uC2A4\uD2B8 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC0BD\uC785\uB41C \uD14D\uC2A4\uD2B8\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uAC70\uB41C \uD14D\uC2A4\uD2B8\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uB450 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30 \uC0AC\uC774\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC758 \uB300\uAC01\uC120 \uCC44\uC6B0\uAE30 \uC0C9\uC785\uB2C8\uB2E4. \uB300\uAC01\uC120 \uCC44\uC6B0\uAE30\uB294 diff \uB098\uB780\uD788 \uBCF4\uAE30\uC5D0\uC11C \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uAC00\uB9AC\uD0AC \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uAC00\uB9AC\uD0AC \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uC774\uB3D9\uD560 \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uB04C\uC5B4\uC11C \uB193\uAE30 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC \uB0B4\uC5D0\uC11C \uAC80\uC0C9\uD560 \uB54C \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC744 \uB54C \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD45C\uC2DC\uB418\uB294 \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uC758 \uD2B8\uB9AC \uC2A4\uD2B8\uB85C\uD06C \uC0C9\uC785\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uC758 \uD2B8\uB9AC \uC2A4\uD2B8\uB85C\uD06C \uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD56D\uBAA9 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD56D\uBAA9 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC5D0\uC11C \uAD6C\uBD84 \uAE30\uD638 \uBA54\uB274 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uB9C8\uC9C0\uB9C9 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uB9C8\uC9C0\uB9C9 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC744 \uCC3E\uAE30 \uC704\uD55C \uBBF8\uB2C8\uB9F5 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC791\uC5C5\uC744 \uC704\uD55C \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958\uC5D0 \uB300\uD55C \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uACBD\uACE0\uC758 \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD074\uB9AD\uD588\uC744 \uB54C \uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uC624\uB958 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uACBD\uACE0 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uC815\uBCF4 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4."],"vs/platform/theme/common/iconRegistry":["\uC0AC\uC6A9\uD560 \uAE00\uAF34\uC758 ID\uC785\uB2C8\uB2E4. \uC124\uC815\uD558\uC9C0 \uC54A\uC73C\uBA74 \uCCAB \uBC88\uC9F8\uB85C \uC815\uC758\uD55C \uAE00\uAF34\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC544\uC774\uCF58 \uC815\uC758\uC640 \uC5F0\uACB0\uB41C \uAE00\uAF34 \uBB38\uC790\uC785\uB2C8\uB2E4.","\uC704\uC82F\uC5D0\uC11C \uB2EB\uAE30 \uC791\uC5C5\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4."],"vs/platform/undoRedo/common/undoRedoService":["{0} \uD30C\uC77C\uC774 \uB2EB\uD788\uACE0 \uB514\uC2A4\uD06C\uC5D0\uC11C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","{0} \uD30C\uC77C\uC740 \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uBC29\uC2DD\uC73C\uB85C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","{1}\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC774 \uC801\uC6A9\uB418\uC5C8\uC73C\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uADF8\uB3D9\uC548 \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uBC1C\uC0DD\uD588\uAE30 \uB54C\uBB38\uC5D0 \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","{0}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C","\uC774 \uD30C\uC77C \uC2E4\uD589 \uCDE8\uC18C","\uCDE8\uC18C","\uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","'{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","\uC2E4\uD589 \uCDE8\uC18C","\uCDE8\uC18C","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","{1}\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC774 \uC801\uC6A9\uB418\uC5C8\uC73C\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uADF8\uB3D9\uC548 \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uBC1C\uC0DD\uD588\uAE30 \uB54C\uBB38\uC5D0 \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."]}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js new file mode 100644 index 0000000000..205ebca88e --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ru",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\u0421 \u0443\u0447\u0435\u0442\u043E\u043C \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430","\u0421\u043B\u043E\u0432\u043E \u0446\u0435\u043B\u0438\u043A\u043E\u043C","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435"],"vs/base/browser/ui/findinput/replaceInput":["\u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435","\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0440\u0435\u0433\u0438\u0441\u0442\u0440"],"vs/base/browser/ui/iconLabel/iconLabel":["\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430\u2026"],"vs/base/browser/ui/inputbox/inputBox":["\u041E\u0448\u0438\u0431\u043A\u0430: {0}","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: {0}","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u0441\u0432\u043E\u0431\u043E\u0434\u043D\u044B\u0439"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["\u0421\u0431\u0440\u043E\u0441","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440 \u043F\u043E \u0442\u0438\u043F\u0443","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440 \u043F\u043E \u0442\u0438\u043F\u0443","\u042D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B","\u0421\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432: {0} \u0438\u0437 {1}"],"vs/base/common/actions":["(\u043F\u0443\u0441\u0442\u043E)"],"vs/base/common/errorMessage":["{0}: {1}","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 ({0})","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435.","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435.","{0} (\u0432\u0441\u0435\u0433\u043E \u043E\u0448\u0438\u0431\u043E\u043A: {1})","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435."],"vs/base/common/keybindingLabels":["CTRL","SHIFT","ALT","Windows","CTRL","SHIFT","ALT","\u041F\u0440\u0435\u0432\u043E\u0441\u0445\u043E\u0434\u043D\u043E","CTRL","SHIFT","ALT","\u041A\u043E\u043C\u0430\u043D\u0434\u0430","CTRL","SHIFT","ALT","Windows","CTRL","SHIFT","ALT","\u041F\u0440\u0435\u0432\u043E\u0441\u0445\u043E\u0434\u043D\u043E"],"vs/base/parts/quickinput/browser/quickInput":["\u041D\u0430\u0437\u0430\u0434","{0} / {1}","\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442, \u0447\u0442\u043E\u0431\u044B \u0443\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0447\u0438\u0441\u043B\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432.","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B: {0}","{0} \u0432\u044B\u0431\u0440\u0430\u043D\u043E","OK","\u0414\u0440\u0443\u0433\u043E\u0439","\u041D\u0430\u0437\u0430\u0434 ({0})","\u041D\u0430\u0437\u0430\u0434"],"vs/base/parts/quickinput/browser/quickInputList":["\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u0432\u0432\u043E\u0434"],"vs/editor/browser/controller/coreCommands":["\u0420\u0430\u0437\u043C\u0435\u0449\u0430\u0442\u044C \u043D\u0430 \u043A\u043E\u043D\u0446\u0435 \u0434\u0430\u0436\u0435 \u0434\u043B\u044F \u0431\u043E\u043B\u0435\u0435 \u0434\u043B\u0438\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A","\u0420\u0430\u0437\u043C\u0435\u0449\u0430\u0442\u044C \u043D\u0430 \u043A\u043E\u043D\u0446\u0435 \u0434\u0430\u0436\u0435 \u0434\u043B\u044F \u0431\u043E\u043B\u0435\u0435 \u0434\u043B\u0438\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A"],"vs/editor/browser/controller/textAreaHandler":["\u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440","\u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D. \u041D\u0430\u0436\u043C\u0438\u0442\u0435 {0} \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432."],"vs/editor/browser/core/keybindingCancellation":['\u0412\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438, \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0449\u0438\u0435 \u043E\u0442\u043C\u0435\u043D\u0443, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438"'],"vs/editor/browser/editorExtensions":["&&\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C","&&\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C","\u0412\u0435\u0440\u043D\u0443\u0442\u044C","&&\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0432\u0441\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435"],"vs/editor/browser/widget/codeEditorWidget":["\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043E {0}."],"vs/editor/browser/widget/diffEditorWidget":["\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u041D\u0435\u043B\u044C\u0437\u044F \u0441\u0440\u0430\u0432\u043D\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u043E\u0434\u0438\u043D \u0438\u0437 \u0444\u0430\u0439\u043B\u043E\u0432 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0439."],"vs/editor/browser/widget/diffReview":['\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C" \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0423\u0434\u0430\u043B\u0438\u0442\u044C" \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0417\u0430\u043A\u0440\u044B\u0442\u044C" \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.',"\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u043D\u0435\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A","1 \u0441\u0442\u0440\u043E\u043A\u0430 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0430","\u0421\u0442\u0440\u043E\u043A \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E: {0}","\u0420\u0430\u0437\u043B\u0438\u0447\u0438\u0435 {0} \u0438\u0437 {1}: \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {2}, {3}, \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {4}, {5}","\u043F\u0443\u0441\u0442\u043E\u0439","{0} \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}","{0} \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1} \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {2}","+ {0} \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}","- {0} \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u044E"],"vs/editor/browser/widget/inlineDiffMargin":["\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 ({0})","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 ({0})"],"vs/editor/common/config/commonEditorConfig":["\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440",'\u0427\u0438\u0441\u043B\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0432 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430, \u0435\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "#editor.detectIndentation#".','\u0412\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u044B \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430, \u0435\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "#editor.detectIndentation#". ','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B "#editor.tabSize#" \u0438 "#editor.insertSpaces#" \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u0444\u0430\u0439\u043B\u0430 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430.',"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0439 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0439 \u043F\u0440\u043E\u0431\u0435\u043B.","\u0421\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0434\u043B\u044F \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432 \u0441 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435\u043C \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0444\u0443\u043D\u043A\u0446\u0438\u0439, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 \u043F\u0430\u043C\u044F\u0442\u044C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043E\u0446\u0435\u043D\u0438\u0432\u0430\u0442\u044C \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043B\u043E\u0432 \u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0435.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0442\u043E\u043B\u044C\u043A\u043E \u0438\u0437 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430 \u043E\u0434\u043D\u043E\u043C \u044F\u0437\u044B\u043A\u0435.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0438\u0437 \u043A\u0430\u043A\u0438\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0431\u0443\u0434\u0443\u0442 \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u0442\u044C\u0441\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043B\u043E\u0432.","\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043E\u0432\u044B\u0445 \u0442\u0435\u043C.","\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043E\u0432\u044B\u0445 \u0442\u0435\u043C.",'\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "semanticHighlighting" \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0446\u0432\u0435\u0442\u043E\u0432\u043E\u0439 \u0442\u0435\u043C\u044B.',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043F\u043E\u043A\u0430\u0437 \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438 \u0434\u043B\u044F \u044F\u0437\u044B\u043A\u043E\u0432, \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0449\u0438\u0445 \u0435\u0435.","\u041E\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0434\u0430\u0436\u0435 \u043F\u0440\u0438 \u0434\u0432\u043E\u0439\u043D\u043E\u043C \u0449\u0435\u043B\u0447\u043A\u0435 \u043F\u043E \u0435\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443 \u0438 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 ESC.","\u0421\u0442\u0440\u043E\u043A\u0438, \u0434\u043B\u0438\u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u0435\u0442 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043C\u0435\u0447\u0435\u043D\u044B \u0438\u0437 \u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438","\u0412\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u0432 \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445, \u043F\u043E \u0438\u0441\u0442\u0435\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043E\u0442\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F. \u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 0, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u0430\u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043E\u0442\u043B\u0438\u0447\u0438\u044F: \u0440\u044F\u0434\u043E\u043C \u0438\u043B\u0438 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.","\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0438\u043B\u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u044B +/- \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0445 \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0445 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0421\u0442\u0440\u043E\u043A\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043D\u0438\u043A\u043E\u0433\u0434\u0430.","\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E \u0448\u0438\u0440\u0438\u043D\u0435 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.",'\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u0432 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u043C "#editor.wordWrap#".'],"vs/editor/common/config/editorOptions":["\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C, \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043B\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430, \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E API-\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u044B.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430 \u0432 \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u043E\u043C \u0440\u0435\u0436\u0438\u043C\u0435. \u041F\u0435\u0440\u0435\u043D\u043E\u0441 \u0442\u0435\u043A\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430. \u0415\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u043F\u0435\u0440\u0435\u043D\u043E\u0441 \u0441\u0442\u0440\u043E\u043A \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B \u043F\u0440\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0443\u0441\u0442\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F, \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 \u043A \u0441\u0442\u0440\u043E\u043A\u0430\u043C.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u043E\u043F\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u043F\u0440\u0438 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438 \u0431\u0435\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043C\u043E\u0436\u043D\u043E \u043B\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0438\u0437 \u0442\u0435\u043A\u0441\u0442\u0430, \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",'\u041D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0444\u0443\u043D\u043A\u0446\u0438\u044E "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438" \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E)','\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0444\u0443\u043D\u043A\u0446\u0438\u044E "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438" \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438','\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438" \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0441\u0442\u0440\u043E\u043A \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0443\u0441\u043B\u043E\u0432\u0438\u0435\u043C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C \u043E\u0431\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 macOS.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043D\u0430\u0447\u0430\u043B\u0435 \u043E\u043A\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 true, \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u0440\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u043C \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u043F\u043E\u0438\u0441\u043A \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C\u0441\u044F \u0441 \u043D\u0430\u0447\u0430\u043B\u0430 (\u0438\u043B\u0438 \u0441 \u043A\u043E\u043D\u0446\u0430), \u0435\u0441\u043B\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043D\u0438\u043A\u0430\u043A\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.",'\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B \u0448\u0440\u0438\u0444\u0442\u043E\u0432 (\u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0438 \u0448\u0440\u0438\u0444\u0442\u0430 "calt" \u0438 "liga"). \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043B\u044F \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E\u043C CSS "font-feature-settings".','\u042F\u0432\u043D\u043E\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E CSS "font-feature-settings". \u0415\u0441\u043B\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B, \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043C\u043E\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435.','\u041D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B \u0438\u043B\u0438 \u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0438 \u0448\u0440\u0438\u0444\u0442\u0430. \u041C\u043E\u0436\u043D\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B, \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 CSS "font-feature-settings".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.",'\u0414\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 "normal" \u0438\u043B\u0438 "bold" \u0438 \u0447\u0438\u0441\u043B\u0430 \u0432 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0435 \u043E\u0442 1 \u0434\u043E 1000.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043D\u0430\u0441\u044B\u0449\u0435\u043D\u043D\u043E\u0441\u0442\u044C\u044E \u0448\u0440\u0438\u0444\u0442\u0430. \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F: \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 "normal" \u0438\u043B\u0438 "bold", \u0430 \u0442\u0430\u043A\u0436\u0435 \u0447\u0438\u0441\u043B\u0430 \u0432 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0435 \u043E\u0442 1 \u0434\u043E 1000.',"\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E)","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C\u0443 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0443 \u0438 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440","\u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043A \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C\u0443 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0443 \u0438 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0431\u044B\u0441\u0442\u0440\u0443\u044E \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044E \u0434\u043B\u044F \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0445","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0443\u0441\u0442\u0430\u0440\u0435\u043B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 'editor.editor.gotoLocation.multipleDefinitions' \u0438\u043B\u0438 'editor.editor.gotoLocation.multipleImplementations'.",'\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0430\u043C" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0435" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0440\u0435\u043C\u044F \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 \u0432 \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445 \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u043E\u0441\u0442\u0430\u0432\u0430\u0442\u044C\u0441\u044F \u0432\u0438\u0434\u0438\u043C\u044B\u043C \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043D\u0430 \u043D\u0435\u0433\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "0", \u0442\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F 90\xA0% \u043E\u0442 "#editor.fontSize#".',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E\u043C \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u044B\u0441\u043E\u0442\u043E\u0439 \u0441\u0442\u0440\u043E\u043A. \u0423\u043A\u0430\u0436\u0438\u0442\u0435 0 \u0434\u043B\u044F \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u0432\u044B\u0441\u043E\u0442\u044B \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E \u0440\u0430\u0437\u043C\u0435\u0440\u0443 \u0448\u0440\u0438\u0444\u0442\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430.","\u041C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0438\u043C\u0435\u0435\u0442 \u0442\u0430\u043A\u043E\u0439 \u0436\u0435 \u0440\u0430\u0437\u043C\u0435\u0440, \u0447\u0442\u043E \u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430).","\u041C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0442\u044F\u0433\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u0438\u043B\u0438 \u0441\u0436\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u043C\u0435\u0440\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u043E \u0432\u044B\u0441\u043E\u0442\u0435 (\u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438).","\u041C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u043C\u0435\u0440\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438, \u0447\u0442\u043E\u0431\u044B \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0431\u044B\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435, \u0447\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 (\u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438).","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440\u043E\u043C \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441 \u043A\u0430\u043A\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u043B\u0437\u0443\u043D\u043E\u043A \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.","\u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E, \u043D\u0430\u0440\u0438\u0441\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u043D\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0435: 1, 2 \u0438\u043B\u0438 3.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u0446\u0432\u0435\u0442\u043D\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432.","\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0438\u0440\u0438\u043D\u0443 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B, \u0447\u0442\u043E\u0431\u044B \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0445 \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432 \u043D\u0435 \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u043B\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E.","\u0417\u0430\u0434\u0430\u0435\u0442 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u043C\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0445\u043D\u0438\u043C \u043A\u0440\u0430\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0417\u0430\u0434\u0430\u0435\u0442 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u043C\u0435\u0436\u0434\u0443 \u043D\u0438\u0436\u043D\u0438\u043C \u043A\u0440\u0430\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0435\u0435 \u043E\u043A\u043D\u043E \u0441 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0435\u0439 \u043F\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0443 \u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F\u043C\u0438 \u043E \u0442\u0438\u043F\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043D\u0430\u0431\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043C\u0435\u043D\u044E \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u043E\u0441\u0442\u0430\u0435\u0442\u0441\u044F \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0438\u043B\u0438 \u0437\u0430\u043A\u0440\u043E\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0438\u0436\u0435\u043D\u0438\u0438 \u043A\u043E\u043D\u0446\u0430 \u0441\u043F\u0438\u0441\u043A\u0430.","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445.","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F\u0445.","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432\u043D\u0435 \u0441\u0442\u0440\u043E\u043A \u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u041D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u043D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u044B\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u044E\u0442\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445 \u0434\u043E \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u041D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043A\u0430\u0436\u0434\u044B\u0435 10 \u0441\u0442\u0440\u043E\u043A.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043D\u043E\u043C\u0435\u0440\u043E\u0432 \u0441\u0442\u0440\u043E\u043A.","\u0427\u0438\u0441\u043B\u043E \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043F\u0440\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u044B\u0432\u0430\u0442\u044C\u0441\u044F \u043B\u0438\u043D\u0435\u0439\u043A\u0430 \u044D\u0442\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u044D\u0442\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u043F\u043E\u0441\u043B\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u0414\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043B\u0438\u043D\u0435\u0435\u043A \u0443\u043A\u0430\u0436\u0438\u0442\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439. \u0415\u0441\u043B\u0438 \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u043E \u043D\u0438 \u043E\u0434\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F, \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043D\u0435 \u0431\u0443\u0434\u0443\u0442.","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u0435\u0437 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044B\u0432\u0430\u0442\u044C\u0441\u044F \u0441\u043B\u043E\u0432\u0430 \u043F\u0440\u0438 \u043F\u0440\u0438\u043D\u044F\u0442\u0438\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0439, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0449\u0438\u0445 \u044D\u0442\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u044E.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u043B\u0438 \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u043E\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u0432 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043F\u0440\u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0435 \u0441\u043B\u043E\u0432\u0430, \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0440\u044F\u0434\u043E\u043C \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B \u0432\u044B\u0431\u043E\u0440\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u043D\u043E \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u043C\u0438 \u0440\u0430\u0431\u043E\u0447\u0438\u043C\u0438 \u043E\u0431\u043B\u0430\u0441\u0442\u044F\u043C\u0438 \u0438 \u043E\u043A\u043D\u0430\u043C\u0438 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F "#editor.suggestSelection#").',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0437\u0430\u043F\u0440\u0435\u0449\u0430\u0435\u0442 \u043B\u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u043A\u043E\u0434\u0430 \u044D\u043A\u0441\u043F\u0440\u0435\u0441\u0441-\u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u0423\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u043A\u0438 \u0432 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0432 \u043D\u0438\u0436\u043D\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043B\u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u043C\u0435\u0442\u043A\u043E\u0439 \u0438\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0435\u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u043C\u044B\u043C. \u0422\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043C\u043E\u0436\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0443\u0441\u0442\u0430\u0440\u0435\u043B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 'editor.suggest.showKeywords' \u0438\u043B\u0438 'editor.suggest.showSnippets'.",'\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "method".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "function".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "constructor".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "field".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "variable".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "class".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "struct".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "interface".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "module".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "property".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "event".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "operator".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "unit".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "value".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "constant".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "enum".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "enumMember".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "keyword".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "text".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "color".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "file".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "reference".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "customcolor".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "folder".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "typeParameter".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "snippet".','\u0412\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 IntelliSense \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u0430 "\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438".','\u0412\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u0430 "\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B".',"\u0414\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044B\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u044B \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0439 \u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0439 \u043F\u0440\u043E\u0431\u0435\u043B\u044B.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0438\u043A\u0441\u0430\u0446\u0438\u0438. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 JavaScript \u0442\u043E\u0447\u043A\u0430 \u0441 \u0437\u0430\u043F\u044F\u0442\u043E\u0439 (";") \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C \u0444\u0438\u043A\u0441\u0430\u0446\u0438\u0438, \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F.',"\u041F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0412\u0412\u041E\u0414 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043E\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u044F\u0435\u0442 \u0442\u0435\u043A\u0441\u0442.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0435\u0439 \u0412\u0412\u041E\u0414 \u0432 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A \u043A\u043B\u0430\u0432\u0438\u0448\u0435 TAB. \u042D\u0442\u043E \u043F\u043E\u043C\u043E\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C \u043D\u0435\u043E\u0434\u043D\u043E\u0437\u043D\u0430\u0447\u043D\u043E\u0441\u0442\u0438 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0430\u0432\u043A\u043E\u0439 \u043D\u043E\u0432\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0438 \u043F\u0440\u0438\u043D\u044F\u0442\u0438\u0435\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0417\u0430\u0434\u0430\u0435\u0442 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u0442\u0440\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u044B \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430. \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: \u0438\u0437-\u0437\u0430 \u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0439 \u044D\u0442\u043E \u0447\u0438\u0441\u043B\u043E \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.","\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u0441\u043A\u043E\u0431\u043E\u043A.","\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0443\u044E \u0441\u043A\u043E\u0431\u043A\u0443 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0439 \u0441\u043A\u043E\u0431\u043A\u0438.","\u0417\u0430\u043C\u0435\u043D\u044F\u0442\u044C \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438\u043B\u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u0431\u044B\u043B\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0437\u0430\u043C\u0435\u043D\u044F\u0442\u044C\u0441\u044F \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438\u043B\u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u043A\u0430\u0432\u044B\u0447\u0435\u043A.","\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043A\u0430\u0432\u044B\u0447\u043A\u0438, \u0435\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0434\u043E\u0431\u0430\u0432\u0438\u043B \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0443\u044E \u043A\u0430\u0432\u044B\u0447\u043A\u0443.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0438 \u0432 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u043E\u043C \u044F\u0437\u044B\u043A\u0430.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u044F\u0437\u044B\u043A\u043E\u043C \u0441\u043A\u043E\u0431\u043A\u0438 \u0438 \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 onEnterRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u044F\u0437\u044B\u043A\u043E\u043C \u0441\u043A\u043E\u0431\u043A\u0438, \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 onEnterRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438 \u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043E\u0442\u0441\u0442\u0443\u043F\u0430 indentationRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B, \u043A\u043E\u0433\u0434\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 \u0432\u0432\u043E\u0434\u044F\u0442, \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0442 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u044E\u0442 \u0442\u0435\u043A\u0441\u0442 \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u044E\u0442 \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0441\u0442\u0440\u043E\u043A.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u043E\u0431\u0440\u0430\u043C\u043B\u0435\u043D\u0438\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0439.","\u041E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u0430\u0432\u044B\u0447\u0435\u043A, \u0430 \u043D\u0435 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0441\u043A\u043E\u0431\u043E\u043A, \u0430 \u043D\u0435 \u043A\u0430\u0432\u044B\u0447\u0435\u043A.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043A\u0430\u0432\u044B\u0447\u0435\u043A \u0438\u043B\u0438 \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u042D\u043C\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u0430. \u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u043E \u043A \u043F\u043E\u0437\u0438\u0446\u0438\u044F\u043C \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E\u043C \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0434\u043B\u044F CodeLens.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445 \u0434\u043B\u044F CodeLens. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "0", \u0442\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F 90% \u043E\u0442 "#editor.fontSize#".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u043E\u0440\u044B \u0446\u0432\u0435\u0442\u0430 \u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0446\u0432\u0435\u0442\u0430.","\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0442\u043E\u0433\u043E, \u0447\u0442\u043E \u0432\u044B\u0431\u043E\u0440 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0438 \u043C\u044B\u0448\u0438 \u043F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043A \u0432\u044B\u0431\u043E\u0440\u0443 \u0441\u0442\u043E\u043B\u0431\u0446\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0442\u0435\u043A\u0441\u0442 \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D \u0432 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u0441 \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u043E\u0439 \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043B\u0430\u0432\u043D\u0443\u044E \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044E \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0430.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E \u0432\u0438\u0434\u0438\u043C\u044B\u0445 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0445 \u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0445 \u043B\u0438\u043D\u0438\u0439, \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0438\u0445 \u043A\u0443\u0440\u0441\u043E\u0440. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0438\u043C\u0435\u0435\u0442 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 "scrollOff" \u0438\u043B\u0438 "scrollOffset" \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u0445.','"cursorSurroundingLines" \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0438\u043B\u0438 API.','"cursorSurroundingLines" \u043F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0432\u043E \u0432\u0441\u0435\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445.','\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C "cursorSurroundingLines".',`\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0448\u0438\u0440\u0438\u043D\u043E\u0439 \u043A\u0443\u0440\u0441\u043E\u0440\u0430, \u043A\u043E\u0433\u0434\u0430 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "#editor.cursorStyle#" \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 'line'`,"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u044F.","\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 ALT.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043B\u0438 \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435 \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u044F\u0437\u044B\u043A\u0430, \u0435\u0441\u043B\u0438 \u043E\u043D\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430, \u0432 \u043F\u0440\u043E\u0442\u0438\u0432\u043D\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u0434\u043B\u044F \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0435\u043C\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043F\u0443\u0441\u0442\u043E\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u043F\u043E\u0441\u043B\u0435 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0442\u044C \u0435\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E \u0448\u0440\u0438\u0444\u0442\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435. \u041C\u043E\u0434\u0443\u043B\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0438 \u0438\u043C\u0435\u0442\u044C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D \u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u043C, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u044E\u0449\u0438\u043C, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0441\u043B\u0435 \u0432\u0432\u043E\u0434\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u0435\u0439 \u0433\u043B\u0438\u0444\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u041F\u043E\u043B\u044F \u0433\u043B\u0438\u0444\u0430 \u0432 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u0434\u043B\u044F \u043E\u0442\u043B\u0430\u0434\u043A\u0438.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u043A\u0440\u044B\u0442\u0438\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0432 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C\u0441\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0430\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u043E\u043C \u043C\u0435\u0436\u0434\u0443 \u0431\u0443\u043A\u0432\u0430\u043C\u0438 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0430 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u044F\u0437\u044B\u043A\u0430, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0442\u0435\u0433\u0438 HTML, \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438 \u0438 \u0434\u0435\u043B\u0430\u0442\u044C \u0438\u0445 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u043C\u0438 \u0434\u043B\u044F \u0449\u0435\u043B\u0447\u043A\u0430.","\u0412\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0441\u043A\u043E\u0431\u043A\u0438.","\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 deltaX \u0438 deltaY \u0441\u043E\u0431\u044B\u0442\u0438\u0439 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043A\u043E\u043B\u0435\u0441\u0438\u043A\u0430 \u043C\u044B\u0448\u0438.","\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u043E\u0439 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0438 \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0435\u0441\u0438\u043A\u0430 \u043C\u044B\u0448\u0438.","\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432, \u043A\u043E\u0433\u0434\u0430 \u043E\u043D\u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u044E\u0442\u0441\u044F.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 COMMAND \u0432 macOS.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 ALT \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 OPTION \u0432 macOS.",'\u041C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438. \u0416\u0435\u0441\u0442\u044B \u043C\u044B\u0448\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u0438 "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443" \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0442\u0430\u043A, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0438 \u043D\u0435 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u0432\u0430\u043B\u0438 \u0441 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u043C\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430\u043C\u0438. [\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier). ',"\u041A\u0430\u0436\u0434\u044B\u0439 \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0434\u043D\u0443 \u0441\u0442\u0440\u043E\u043A\u0443 \u0442\u0435\u043A\u0441\u0442\u0430.","\u041A\u0430\u0436\u0434\u044B\u0439 \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u043B\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043A\u043E\u0439, \u043A\u043E\u0433\u0434\u0430 \u0447\u0438\u0441\u043B\u043E \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0447\u0438\u0441\u043B\u0443 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440\u044B \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0435.","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0430 \u0434\u0435\u0440\u0435\u0432\u0435 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u043E\u0431\u0437\u043E\u0440\u0430","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u043E\u0431\u0437\u043E\u0440\u0430","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u043E \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435 \u043E\u0431\u0437\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u0441\u0435\u0433\u0434\u0430 \u043B\u0438 \u0436\u0435\u0441\u0442 \u043C\u044B\u0448\u044C\u044E \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\u044E \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 (\u0432 \u043C\u0441) \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u0442\u0438\u043F\u0443.",'\u041D\u0435 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F; \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "editor.linkedEditing".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u043A\u043E\u0433\u0434\u0430 \u0444\u0430\u0439\u043B \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u043E\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0412\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u043F\u043E\u043B\u0435 \u0438 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u044B\u0432\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u043E\u043D \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435","\u041E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432, \u043A\u0440\u043E\u043C\u0435 \u043E\u0434\u0438\u043D\u043E\u0447\u043D\u044B\u0445 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0441\u043B\u043E\u0432\u0430\u043C\u0438.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u0442\u0435\u043A\u0441\u0442\u0435.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u044B.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0441\u043A\u0440\u0443\u0433\u043B\u0435\u043D\u043D\u044B\u0435 \u0443\u0433\u043B\u044B \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\u043C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u0437\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u0434\u043E\u043B\u044C \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043E\u0441\u0438 \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438 \u0438 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438 \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E. \u041F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438 \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438 \u043D\u0430 \u0442\u0440\u0435\u043A\u043F\u0430\u0434\u0435.","\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0438\u0440\u0443\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u0438\u0447\u043D\u044B\u0439 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 Linux.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044F, \u0430\u043D\u0430\u043B\u043E\u0433\u0438\u0447\u043D\u044B\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C\u0443 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0443.","\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0435\u043C\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F.","\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F, \u043A\u043E\u0433\u0434\u0430 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C \u043C\u044B\u0448\u0438 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043D\u0430\u0434 \u043F\u0435\u0440\u0435\u043F\u043B\u0435\u0442\u043E\u043C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043D\u0430 \u043F\u0435\u0440\u0435\u043F\u043B\u0435\u0442\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u043A\u0440\u044B\u0442\u0438\u0435\u043C \u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E \u043A\u043E\u0434\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0435\u0440\u0435\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u0435\u043C \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u043E\u0432\u0435\u0440\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u043E\u0434 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u0440\u044F\u0434\u043E\u043C \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438.","\u041D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438 \u0438 \u0438\u0445 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u043E\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430",'\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0441 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438. \u0415\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "0", \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "#editor.fontSize#".','\u0412\u044B\u0441\u043E\u0442\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0441 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438. \u0415\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "0", \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "#editor.lineHeight#". \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\xA0\u2014 8.',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435.",'\u0412\u044B\u0431\u043E\u0440 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439, \u0435\u0441\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u0430\u043B\u044C\u043D\u0435\u0439\u0448\u0438\u0439 \u0432\u0432\u043E\u0434 \u043D\u0435 \u043F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044E \u043E\u0434\u043D\u043E\u0433\u043E \u0438\u0437 \u043D\u0438\u0445, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "console.| -> console.log", \u0442\u0430\u043A \u043A\u0430\u043A "log" \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B\u0441\u044F \u0434\u043B\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F.','\u0412\u044B\u0431\u043E\u0440 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441 \u0443\u0447\u0435\u0442\u043E\u043C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0445 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u043E\u0432, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u044D\u0442\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "co -> console" \u0438 "con -> const".',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C \u0432\u044B\u0431\u043E\u0440\u043E\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0438 \u0441\u043F\u0438\u0441\u043A\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u043E TAB \u0431\u0443\u0434\u0435\u0442 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C\u0441\u044F \u043D\u0430\u0438\u043B\u0443\u0447\u0448\u0435\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB.","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043F\u043E TAB.",'\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0439 \u043F\u043E TAB \u043F\u0440\u0438 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0438 \u0438\u0445 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u043E\u0432. \u0424\u0443\u043D\u043A\u0446\u0438\u044F \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u043E, \u0435\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "quickSuggestions" \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D.',"\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u043E TAB.","\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0443\u0434\u0430\u043B\u044F\u044E\u0442\u0441\u044F.","\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F.","\u0414\u043B\u044F \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435.","\u0423\u0434\u0430\u043B\u0438\u0442\u0435 \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0433\u0443\u0442 \u0432\u044B\u0437\u0432\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B.","\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u0421\u0438\u043C\u0432\u043E\u043B\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0438 \u0441\u043B\u043E\u0432 \u043F\u0440\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438\u043B\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0445 \u0441\u043E \u0441\u043B\u043E\u0432\u0430\u043C\u0438.","\u0421\u0442\u0440\u043E\u043A\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043D\u0438\u043A\u043E\u0433\u0434\u0430.","\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E \u0448\u0438\u0440\u0438\u043D\u0435 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.",'\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E "#editor.wordWrapColumn#".','\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u044B \u043F\u043E \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044E \u0438\u0437 \u0434\u0432\u0443\u0445: \u0448\u0438\u0440\u0438\u043D\u0430 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0438 "#editor.wordWrapColumn#".',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0435\u0441\u043B\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "#editor.wordWrap#" \u2014 "wordWrapColumn" \u0438\u043B\u0438 "bounded".',"\u0411\u0435\u0437 \u043E\u0442\u0441\u0442\u0443\u043F\u0430. \u041F\u0435\u0440\u0435\u043D\u043E\u0441 \u0441\u0442\u0440\u043E\u043A \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441\u043E \u0441\u0442\u043E\u043B\u0431\u0446\u0430 1.","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u0442\u043E\u0442 \u0436\u0435 \u043E\u0442\u0441\u0442\u0443\u043F, \u0447\u0442\u043E \u0438 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430.","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u043E\u0442\u0441\u0442\u0443\u043F, \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043D\u044B\u0439 \u043D\u0430 \u0435\u0434\u0438\u043D\u0438\u0446\u0443 \u043F\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044E \u0441 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439. ","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u043E\u0442\u0441\u0442\u0443\u043F, \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043D\u044B\u0439 \u043D\u0430 \u0434\u0432\u0430 \u043F\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044E \u0441 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u043C \u0441\u0442\u0440\u043E\u043A \u0441 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u043E\u043C \u043F\u043E \u0441\u043B\u043E\u0432\u0430\u043C.","\u041F\u0440\u0435\u0434\u043F\u043E\u043B\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043E \u0432\u0441\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0438\u043C\u0435\u044E\u0442 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u0443\u044E \u0448\u0438\u0440\u0438\u043D\u0443. \u042D\u0442\u043E \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0438 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0432 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432), \u0433\u0434\u0435 \u0433\u043B\u0438\u0444\u044B \u0438\u043C\u0435\u044E\u0442 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u0443\u044E \u0448\u0438\u0440\u0438\u043D\u0443.","\u0414\u0435\u043B\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u0442\u043E\u0447\u0435\u043A \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443. \u042D\u0442\u043E \u043C\u0435\u0434\u043B\u0435\u043D\u043D\u044B\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043A \u0437\u0430\u0432\u0438\u0441\u0430\u043D\u0438\u044F\u043C \u043F\u0440\u0438 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u043D\u043E \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0432\u043E \u0432\u0441\u0435\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u043E\u043C, \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u044E\u0449\u0438\u043C \u0442\u043E\u0447\u043A\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430."],"vs/editor/common/editorContextKeys":["\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0442\u0435\u043A\u0441\u0442\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 (\u043A\u0443\u0440\u0441\u043E\u0440 \u043C\u0438\u0433\u0430\u0435\u0442)","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0438\u043B\u0438 \u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0444\u043E\u043A\u0443\u0441 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430)","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0438\u043B\u0438 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0432\u0432\u043E\u0434\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 (\u043A\u0443\u0440\u0441\u043E\u0440 \u043C\u0438\u0433\u0430\u0435\u0442)","\u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439",'\u0412\u043A\u043B\u044E\u0447\u0435\u043D \u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "editor.columnSelection"',"\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0432\u044B\u0431\u043E\u0440","\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u0441 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u0438\u0434\u0438\u043C\u044B\u043C","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0447\u0430\u0441\u0442\u044C\u044E \u0431\u043E\u043B\u044C\u0448\u0435\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0437\u0430\u043F\u0438\u0441\u043D\u044B\u0445 \u043A\u043D\u0438\u0436\u0435\u043A)","\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u044F\u0437\u044B\u043A\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u043A\u043E\u0434\u043E\u043C","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A CodeLens","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0439","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0439","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0439 \u0442\u0438\u043F\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u0441\u044B\u043B\u043E\u043A","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u043F\u0440\u0430\u0432\u043A\u0438 \u043F\u043E \u0441\u0438\u0433\u043D\u0430\u0442\u0443\u0440\u0430\u043C","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432"],"vs/editor/common/model/editStack":["\u0412\u0432\u043E\u0434"],"vs/editor/common/modes/modesRegistry":["\u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u0442\u0435\u043A\u0441\u0442"],"vs/editor/common/standaloneStrings":["\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043E","\u0421\u0442\u0440\u043E\u043A\u0430 {0}, \u0441\u0442\u043E\u043B\u0431\u0435\u0446 {1} (\u0432\u044B\u0431\u0440\u0430\u043D\u043E: {2})","\u0421\u0442\u0440\u043E\u043A\u0430 {0}, \u0441\u0442\u043E\u043B\u0431\u0435\u0446 {1}","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0439: {0} (\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432: {1})","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0439: {0}",'\u0422\u0435\u043F\u0435\u0440\u044C \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "accessibilitySupport" \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "\u0432\u043A\u043B".',"\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438 \u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0432 \u043F\u0430\u043D\u0435\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439."," \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043A\u043E\u0434\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F"," \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043A\u043E\u0434\u0430","\u0427\u0442\u043E\u0431\u044B \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 COMMAND+E.","\u0427\u0442\u043E\u0431\u044B \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 CTRL+E.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D \u0434\u043B\u044F \u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D \u0431\u0435\u0437 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430, \u0447\u0442\u043E \u043D\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0432 \u0434\u0430\u043D\u043D\u043E\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0444\u043E\u043A\u0443\u0441 \u0432\u0432\u043E\u0434\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u0441\u044F \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u044B\u0439 \u0435\u0433\u043E \u043F\u0440\u0438\u043D\u044F\u0442\u044C. \u0427\u0442\u043E\u0431\u044B \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 {0}.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0444\u043E\u043A\u0443\u0441 \u0432\u0432\u043E\u0434\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u0441\u044F \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u044B\u0439 \u0435\u0433\u043E \u043F\u0440\u0438\u043D\u044F\u0442\u044C. \u041A\u043E\u043C\u0430\u043D\u0434\u0443 {0} \u0441\u0435\u0439\u0447\u0430\u0441 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0441\u0438\u043C\u0432\u043E\u043B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438. \u0427\u0442\u043E\u0431\u044B \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 {0}.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0441\u0438\u043C\u0432\u043E\u043B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438. \u041A\u043E\u043C\u0430\u043D\u0434\u0443 {0} \u0441\u0435\u0439\u0447\u0430\u0441 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 COMMAND+H, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u043A\u043D\u043E \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0441 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 CTRL+H, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u043A\u043D\u043E \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0441 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u044C \u044D\u0442\u0443 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0443 \u0438 \u0432\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440, \u043D\u0430\u0436\u0430\u0432 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 ESCAPE \u0438\u043B\u0438 SHIFT+ESCAPE.","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u043F\u0440\u0430\u0432\u043A\u0443 \u043F\u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u043C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u043C","\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A: \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0442\u043E\u043A\u0435\u043D\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435/\u0441\u0442\u043E\u043B\u0431\u0446\u0443...","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0441\u0435\u0445 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u0430","\u041F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443...","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443 \u043F\u043E \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F\u043C...","\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 ALT+F1 \u0434\u043B\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439.","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0441\u043E\u043A\u043E\u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u043D\u0443\u044E \u0442\u0435\u043C\u0443","\u0412\u043D\u0435\u0441\u0435\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 ({1}): {0}."],"vs/editor/common/view/editorColorRegistry":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0433\u0440\u0430\u043D\u0438\u0446 \u0432\u043E\u043A\u0440\u0443\u0433 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u0439 Quick Open \u0438\u043B\u0438 \u043F\u043E\u0438\u0441\u043A\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u0432\u043E\u0434\u043A\u0438 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.",'\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u0430, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u044F\u0445 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u0438\u043B\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443/\u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u0443". \u0426\u0432\u0435\u0442 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u043E\u0434 \u043D\u0438\u043C.',"\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432\u043E\u043A\u0440\u0443\u0433 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432.","\u0426\u0432\u0435\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044C \u0446\u0432\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u0430, \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u044B\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C.","\u0426\u0432\u0435\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u043E\u0432 \u0441\u0442\u0440\u043E\u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 'Id' \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043C. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 'editorLineNumber.activeForeground'.","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0426\u0432\u0435\u0442 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A","\u0426\u0432\u0435\u0442 \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F, \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u0438 \u0440\u0430\u0437\u043C\u0435\u0449\u0435\u043D\u0430 \u0432 \u043F\u0440\u0430\u0432\u043E\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0412 \u043F\u043E\u043B\u0435 \u0440\u0430\u0437\u043C\u0435\u0449\u0430\u044E\u0442\u0441\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0433\u043B\u0438\u0444\u043E\u0432 \u0438 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E (\u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E) \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",'\u041D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E (\u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E) \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "#000000c0" \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043A\u043E\u0434 \u0441 \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C\u044E 75 %. \u0412 \u0432\u044B\u0441\u043E\u043A\u043E\u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u043D\u044B\u0445 \u0442\u0435\u043C\u0430\u0445 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432\u043C\u0435\u0441\u0442\u043E \u0437\u0430\u0442\u0435\u043D\u0435\u043D\u0438\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0446\u0432\u0435\u0442 \u0442\u0435\u043C\u044B "editorUnnecessaryCode.border".',"\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043E\u0448\u0438\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439."],"vs/editor/contrib/anchorSelect/anchorSelect":["\u041D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u0442\u043E\u0447\u043A\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u041D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u0442\u043E\u0447\u043A\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u0432 {0}:{1}","\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u0442\u043E\u0447\u043A\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u043E\u0442 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0438 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u0442\u043E\u0447\u043A\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F"],"vs/editor/contrib/bracketMatching/bracketMatching":["\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043A\u043E\u0431\u043A\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0443","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0441\u043A\u043E\u0431\u043A\u0435"],"vs/editor/contrib/caretOperations/caretOperations":["\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432\u043B\u0435\u0432\u043E","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432\u043F\u0440\u0430\u0432\u043E"],"vs/editor/contrib/caretOperations/transpose":["\u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u0443\u043A\u0432\u044B"],"vs/editor/contrib/clipboard/clipboard":["&&\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","&&\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","&&\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0430"],"vs/editor/contrib/codeAction/codeActionCommands":["\u0422\u0438\u043F \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u043C\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u044E\u0442\u0441\u044F \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F.","\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043A\u043E\u0434\u0430.","\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430, \u0435\u0441\u043B\u0438 \u043E\u043D\u043E \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u043C.","\u041D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430.","\u041F\u0440\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435...","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430 \u0434\u043B\u044F "{0}".','\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u0434\u043B\u044F "{0}" \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B',"\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0420\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433...",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u043E\u0432 \u0434\u043B\u044F "{0}"','\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u0430 \u0434\u043B\u044F "{0}"',"\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u043E\u0432","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C...","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430 \u0434\u043B\u044F '{0}'",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043B\u044F "{0}"',"\u041F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u041E\u0440\u0433\u0430\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0438\u043C\u043F\u043E\u0440\u0442\u043E\u0432","\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u043B\u044F \u0443\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u0435\u043D\u0438\u044F \u0438\u043C\u043F\u043E\u0440\u0442\u043E\u0432 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442","\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0432\u0441\u0435","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043F\u043E \u043E\u0431\u0449\u0435\u043C\u0443 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044E","\u0410\u0432\u0442\u043E\u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435...","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0430\u0432\u0442\u043E\u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439"],"vs/editor/contrib/codeAction/lightBulbWidget":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439. \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0438\u0442\u0430\u0435\u043C\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 ({0})","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F ({0})","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F"],"vs/editor/contrib/codelens/codelensController":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u044B CodeLens \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438"],"vs/editor/contrib/comment/comment":["\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 &&\u0441\u0442\u0440\u043E\u043A\u0438","\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0420\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u043B\u043E\u043A","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 &&\u0431\u043B\u043E\u043A\u0430"],"vs/editor/contrib/contextmenu/contextmenu":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u043D\u043E\u0435 \u043C\u0435\u043D\u044E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430"],"vs/editor/contrib/cursorUndo/cursorUndo":["\u041E\u0442\u043C\u0435\u043D\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041F\u043E\u0432\u0442\u043E\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430"],"vs/editor/contrib/find/findController":["\u041D\u0430\u0439\u0442\u0438","&&\u041D\u0430\u0439\u0442\u0438","\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C","\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0440\u0430\u043D\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0440\u0430\u043D\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u041D\u0430\u0439\u0442\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","&&\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C"],"vs/editor/contrib/find/findWidget":['\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.',"\u0417\u043D\u0430\u0447\u043E\u043A, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0438\u0439, \u0447\u0442\u043E \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u043E.","\u0417\u043D\u0430\u0447\u043E\u043A, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0438\u0439, \u0447\u0442\u043E \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u043E.",'\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0440\u0430\u043D\u0435\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.',"\u041D\u0430\u0439\u0442\u0438","\u041D\u0430\u0439\u0442\u0438","\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435","\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438","\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435",'\u0420\u0435\u0436\u0438\u043C "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0437\u0430\u043C\u0435\u043D\u044B"',"\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0435\u0440\u0432\u044B\u0435 {0} \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432, \u043D\u043E \u0432\u0441\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0441\u043E \u0432\u0441\u0435\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C.","{0} \u0438\u0437 {1}","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","{0} \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E",'{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}"','{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}", \u0432 {2}','{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}"',"\u0422\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448 CTRL+\u0412\u0412\u041E\u0414 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0441\u0438\u043C\u0432\u043E\u043B \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043D\u0430 \u043D\u043E\u0432\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u043C\u0435\u0441\u0442\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u0441\u0435\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 editor.action.replaceAll, \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435."],"vs/editor/contrib/folding/folding":["\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0431\u043B\u043E\u043A\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u043E\u043D\u044B","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u043E\u043D\u044B","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435","\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u043F\u0430\u043F\u043A\u0438 {0}","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0437\u0430 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u043C\u0438 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430\u043C\u0438. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B.","\u0426\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435\u043C \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C \u043F\u043E\u043B\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430."],"vs/editor/contrib/folding/foldingDecorations":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0433\u043B\u0438\u0444\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0433\u043B\u0438\u0444\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430."],"vs/editor/contrib/fontZoom/fontZoom":["\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u0448\u0440\u0438\u0444\u0442 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0448\u0440\u0438\u0444\u0442 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043C\u0430\u0441\u0448\u0442\u0430\u0431 \u0448\u0440\u0438\u0444\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430"],"vs/editor/contrib/format/format":["\u0412\u043D\u0435\u0441\u0435\u043D\u0430 \u043E\u0434\u043D\u0430 \u043F\u0440\u0430\u0432\u043A\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {0}.","\u0412\u043D\u0435\u0441\u0435\u043D\u044B \u043F\u0440\u0430\u0432\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F ({0}) \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {1}.","\u0412\u043D\u0435\u0441\u0435\u043D\u0430 \u043E\u0434\u043D\u0430 \u043F\u0440\u0430\u0432\u043A\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043C\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043E\u043A\u0430\u043C\u0438 {0} \u0438 {1}.","\u0412\u043D\u0435\u0441\u0435\u043D\u044B \u043F\u0440\u0430\u0432\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F ({0}) \u043C\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043E\u043A\u0430\u043C\u0438 {1} \u0438 {2}."],"vs/editor/contrib/format/formatActions":["\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442","\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442"],"vs/editor/contrib/gotoError/gotoError":["\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 (\u041E\u0448\u0438\u0431\u043A\u0435, \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044E, \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438)","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u043C\u0430\u0440\u043A\u0435\u0440\u0443.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 (\u041E\u0448\u0438\u0431\u043A\u0435, \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044E, \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438)","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u043C\u0430\u0440\u043A\u0435\u0440\u0443.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 (\u043E\u0448\u0438\u0431\u043A\u0438, \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F, \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0430\u044F &&\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 (\u043E\u0448\u0438\u0431\u043A\u0438, \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F, \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)","\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0430\u044F &&\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\u041E\u0448\u0438\u0431\u043A\u0430","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F","\u0423\u043A\u0430\u0437\u0430\u043D\u0438\u0435","{0} \u0432 {1}. ","\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u044B: {0} \u0438\u0437 {1}","\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u044B: {0} \u0438\u0437 {1}","\u0426\u0432\u0435\u0442 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0424\u043E\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430."],"vs/editor/contrib/gotoSymbol/goToCommands":["\u041E\u0431\u0437\u043E\u0440","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0431\u043E\u043A\u0443","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044F",'\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E",'\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E","\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u043E\u0432",'\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430 \u0434\u043B\u044F "{0}".',"\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430","\u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438",'\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0434\u043B\u044F "{0}".',"\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C","\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438",'\u0421\u0441\u044B\u043B\u043A\u0438 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B',"\u0421\u0441\u044B\u043B\u043A\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0430\u043C","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0441\u0441\u044B\u043B\u043A\u0430\u043C","\u0421\u0441\u044B\u043B\u043A\u0438","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438","\u0421\u0441\u044B\u043B\u043A\u0438","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043B\u044E\u0431\u043E\u043C\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u0443","\u0420\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F",'\u041D\u0435\u0442 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0434\u043B\u044F "{0}"',"\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0437\u0438\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F ({0})."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["\u0421\u0441\u044B\u043B\u043E\u043A: {0}","{0} \u0441\u0441\u044B\u043B\u043A\u0430","\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/referencesModel":["\u0441\u0441\u044B\u043B\u043A\u0430 \u0432 {0} \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {1} \u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0435 {2}","\u0441\u0438\u043C\u0432\u043E\u043B \u0432 {0} \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {1} \u0438 \u0441\u0442\u043E\u043B\u0431\u0446\u0435 {2}, {3}","1 \u0441\u0438\u043C\u0432\u043E\u043B \u0432 {0}, \u043F\u043E\u043B\u043D\u044B\u0439 \u043F\u0443\u0442\u044C: {1}","{0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1}, \u043F\u043E\u043B\u043D\u044B\u0439 \u043F\u0443\u0442\u044C: {2} ","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D 1 \u0441\u0438\u043C\u0432\u043E\u043B \u0432 {0}","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E {0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1}","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E {0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1} \u0444\u0430\u0439\u043B\u0430\u0445"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["\u0421\u0438\u043C\u0432\u043E\u043B {0} \u0438\u0437 {1}, {2} \u0434\u043B\u044F \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E","\u0421\u0438\u043C\u0432\u043E\u043B {0} \u0438\u0437 {1}"],"vs/editor/contrib/hover/hover":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438"],"vs/editor/contrib/hover/markdownHoverParticipant":["\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430..."],"vs/editor/contrib/hover/markerHoverParticipant":["\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443","\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u044F \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439...","\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u043C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u043C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C"],"vs/editor/contrib/indentation/indentation":["\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0432 \u043F\u0440\u043E\u0431\u0435\u043B\u044B","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0432 \u0448\u0430\u0433\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u041D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0430\u0433\u0430 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0430\u0433\u0430 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0444\u0430\u0439\u043B\u0430","\u041E\u0442\u0441\u0442\u0443\u043F \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u041E\u0442\u0441\u0442\u0443\u043F \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430 \u043E\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E","\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0441\u0442\u0440\u043E\u043A","\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A"],"vs/editor/contrib/linesOperations/linesOperations":["\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u0432\u0435\u0440\u0445\u0443","&&\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u043D\u0438\u0437\u0443","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 &&\u043D\u0438\u0436\u0435","\u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435","&&\u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u0432\u0435\u0440\u0445","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043D\u0430 \u0441&&\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u043D\u0438\u0437","&&\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u043D\u0438\u0436\u0435","\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0441\u0442\u0440\u043E\u043A \u043F\u043E \u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u043D\u0438\u044E","\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0441\u0442\u0440\u043E\u043A \u043F\u043E \u0443\u0431\u044B\u0432\u0430\u043D\u0438\u044E","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B-\u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0438","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043D\u0438\u0436\u0435","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u043B\u0435\u0432\u0430","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u043F\u0440\u0430\u0432\u0430","_\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438","\u0422\u0440\u0430\u043D\u0441\u043F\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0432\u043E\u043A\u0440\u0443\u0433 \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u043D\u0438\u0436\u043D\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0437\u0430\u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u0431\u0443\u043A\u0432\u044B","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0441 \u043F\u043E\u0434\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F\u043C\u0438"],"vs/editor/contrib/linkedEditing/linkedEditing":["\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0440\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u043C \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0438 \u0442\u0438\u043F\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C."],"vs/editor/contrib/links/links":["\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443","\u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435","\u041A\u043D\u043E\u043F\u043A\u0430 OPTION \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 CTRL \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 OPTION \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 ALT \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B {0}","\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443, \u0442\u0430\u043A \u043A\u0430\u043A \u043E\u043D\u0430 \u0438\u043C\u0435\u0435\u0442 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442: {0}","\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443, \u0443 \u043D\u0435\u0435 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0446\u0435\u043B\u0435\u0432\u043E\u0439 \u043E\u0431\u044A\u0435\u043A\u0442.","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443"],"vs/editor/contrib/message/messageController":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435","\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F"],"vs/editor/contrib/multicursor/multicursor":["\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 &&\u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 &&\u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u043A \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F\u043C \u0441\u0442\u0440\u043E\u043A","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u0432 &&\u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C &&\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u0432 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C &&\u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0439 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u0432 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 &&\u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F","\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F"],"vs/editor/contrib/parameterHints/parameterHints":["\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043A \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430.","{0}, \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0435"],"vs/editor/contrib/peekView/peekView":["\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439 \u043E \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043C\u0430\u0441\u0441\u0438\u0432\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0443\u0437\u043B\u043E\u0432 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0443\u0437\u043B\u043E\u0432 \u0444\u0430\u0439\u043B\u0430 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u044F \u0432 \u043E\u043A\u043D\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\u0427\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043A \u0441\u0442\u0440\u043E\u043A\u0435 {0} \u0438 \u0441\u0442\u043E\u043B\u0431\u0446\u0443 {1}.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435 {0}.","\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: {0}, \u0441\u0438\u043C\u0432\u043E\u043B: {1}. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 \u043C\u0435\u0436\u0434\u0443 1 \u0438 {2} \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430.","\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: {0}, \u0441\u0438\u043C\u0432\u043E\u043B: {1}. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\u0427\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0441 \u0441\u0438\u043C\u0432\u043E\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439.","\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u044C\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E.","\u041D\u0435\u0442 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041D\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0431\u043E\u043A\u0443","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u043D\u0438\u0437\u0443","\u0441\u0438\u043C\u0432\u043E\u043B\u044B ({0})","\u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 ({0})","\u043C\u0435\u0442\u043E\u0434\u044B ({0})","\u0444\u0443\u043D\u043A\u0446\u0438\u0438 ({0})","\u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440\u044B ({0})","\u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 ({0})","\u043A\u043B\u0430\u0441\u0441\u044B ({0})","\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B ({0})","\u0441\u043E\u0431\u044B\u0442\u0438\u044F ({0})","\u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B ({0})","\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044B ({0})","\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u043D ({0})","\u043F\u0430\u043A\u0435\u0442\u044B ({0})","\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0442\u0438\u043F\u0430 ({0})","\u043C\u043E\u0434\u0443\u043B\u0438 ({0})","\u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 ({0})","\u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F ({0})","\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F ({0})","\u0441\u0442\u0440\u043E\u043A\u0438 ({0})","\u0444\u0430\u0439\u043B\u044B ({0})","\u043C\u0430\u0441\u0441\u0438\u0432\u044B ({0})","\u0447\u0438\u0441\u043B\u0430 ({0})","\u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F ({0})","\u043E\u0431\u044A\u0435\u043A\u0442\u044B ({0})","\u043A\u043B\u044E\u0447\u0438 ({0})","\u043F\u043E\u043B\u044F ({0})","\u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B ({0})"],"vs/editor/contrib/rename/rename":["\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442.","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0438 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F",'\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 "{0}"',"\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 {0}","\xAB{0}\xBB \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D \u0432 \xAB{1}\xBB. \u0421\u0432\u043E\u0434\u043A\u0430: {2}","\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u043A\u0438","\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u044B\u0447\u0438\u0441\u043B\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u043A\u0438","\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C/\u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u043F\u0435\u0440\u0435\u0434 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435\u043C"],"vs/editor/contrib/rename/renameInputField":["\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u0432\u043E\u0435 \u0438\u043C\u044F \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 \u0412\u0412\u041E\u0414 \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F.","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 {0} \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F, {1} \u0434\u043B\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430."],"vs/editor/contrib/smartSelect/smartSelect":["\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442","&&\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442","&&\u0421\u0436\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435"],"vs/editor/contrib/snippet/snippetVariables":["\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435","\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A","\u0432\u0442\u043E\u0440\u043D\u0438\u043A","\u0441\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440\u0433","\u043F\u044F\u0442\u043D\u0438\u0446\u0430","\u0441\u0443\u0431\u0431\u043E\u0442\u0430","\u0412\u0441","\u041F\u043D","\u0412\u0442","\u0421\u0440","\u0427\u0442","\u041F\u0442","\u0421\u0431","\u042F\u043D\u0432\u0430\u0440\u044C","\u0424\u0435\u0432\u0440\u0430\u043B\u044C","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B\u044C","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u041E\u043A\u0442\u044F\u0431\u0440\u044C","\u041D\u043E\u044F\u0431\u0440\u044C","\u0414\u0435\u043A\u0430\u0431\u0440\u044C","\u042F\u043D\u0432","\u0424\u0435\u0432","\u041C\u0430\u0440","\u0410\u043F\u0440","\u041C\u0430\u0439","\u0418\u044E\u043D","\u0418\u044E\u043B","\u0410\u0432\u0433","\u0421\u0435\u043D","\u041E\u043A\u0442","\u041D\u043E\u044F","\u0414\u0435\u043A"],"vs/editor/contrib/suggest/suggestController":['\u041F\u0440\u0438\u043D\u044F\u0442\u0438\u0435 "{0}" \u043F\u0440\u0438\u0432\u0435\u043B\u043E \u043A \u0432\u043D\u0435\u0441\u0435\u043D\u0438\u044E \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0440\u0430\u0432\u043E\u043A ({1})',"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043C\u0435\u043D\u044C\u0448\u0435","\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435","\u0421\u0431\u0440\u043E\u0441 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F"],"vs/editor/contrib/suggest/suggestWidget":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442.","{0}, \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B: {1}","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0438\u0442\u044C"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u0430\u0441\u0441\u0438\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u0430\u0441\u0441\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0446\u0432\u0435\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0438\u0442\u0435\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0447\u043B\u0435\u043D\u0430 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0438\u0442\u0435\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u043E\u0431\u044B\u0442\u0438\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u043E\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0430\u0439\u043B\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0430\u043F\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u044E\u0447\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0433\u043E \u0441\u043B\u043E\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u0435\u0442\u043E\u0434\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u043E\u0434\u0443\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u043D. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 NULL. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0447\u0438\u0441\u043B\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043E\u0431\u044A\u0435\u043A\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0430\u043A\u0435\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0441\u044B\u043B\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430 \u043A\u043E\u0434\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0442\u0440\u043E\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0435\u043A\u0441\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0438\u043F\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0435\u0434\u0438\u043D\u0438\u0446. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u0442 \u0444\u043E\u043A\u0443\u0441.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0444\u043E\u043A\u0443\u0441 \u043F\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0444\u043E\u043A\u0443\u0441","\u0422\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0441\u0438\u043C\u0432\u043E\u043B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438"],"vs/editor/contrib/tokenization/tokenization":["\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A: \u043F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0430\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0442\u043E\u043A\u0435\u043D\u043E\u0432"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u044B \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438",`\u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043E\u0434\u0438\u043D \u0438\u043B\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0441\u0442\u0440\u043E\u043A (LS) \u0438\u043B\u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0430\u0431\u0437\u0430\u0446\u0435\u0432 (PS).\r +\r +\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0438\u0445 \u0438\u0437 \u0444\u0430\u0439\u043B\u0430. \u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u044D\u0442\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "editor.unusualLineTerminators".`,"\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B","\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0447\u0442\u0435\u043D\u0438\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0447\u0442\u0435\u043D\u0438\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0438 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u0443\u044E. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0447\u0442\u0435\u043D\u0438\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0441\u0447\u0438\u0442\u044B\u0432\u0430\u043D\u0438\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0437\u0430\u043F\u0438\u0441\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. ","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432"],"vs/editor/contrib/wordOperations/wordOperations":["\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u043B\u043E\u0432\u043E"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["\u041F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E","\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0445 \u0434\u043B\u044F \u044F\u0437\u044B\u043A\u0430.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0434\u043B\u044F \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u044F\u0437\u044B\u043A\u043E\u0432.","\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0443\u0441\u0442\u043E\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E",`\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C "{0}". \u041E\u043D\u043E \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 '\\\\[.*\\\\]$' \u0434\u043B\u044F \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0445 \u044F\u0437\u044B\u043A\u043E\u043C. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 configurationDefaults.`,'\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C "{0}". \u042D\u0442\u043E \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043E.'],"vs/platform/contextkey/browser/contextKeyService":["\u041A\u043E\u043C\u0430\u043D\u0434\u0430, \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u044E\u0449\u0430\u044F \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043E \u043A\u043B\u044E\u0447\u0430\u0445 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430"],"vs/platform/contextkey/common/contextkeys":["\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["\u0411\u044B\u043B\u0430 \u043D\u0430\u0436\u0430\u0442\u0430 \u043A\u043B\u0430\u0432\u0438\u0448\u0430 {0}. \u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043D\u0430\u0436\u0430\u0442\u0438\u044F \u0432\u0442\u043E\u0440\u043E\u0439 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F...","\u0421\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 ({0} \u0438 {1}) \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0439."],"vs/platform/list/browser/listService":["\u0420\u0430\u0431\u043E\u0447\u0435\u0435 \u043C\u0435\u0441\u0442\u043E","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 COMMAND \u0432 macOS.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 ALT \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 OPTION \u0432 macOS.",'\u041C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0432 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0432 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u043F\u0440\u043E\u0432\u043E\u0434\u043D\u0438\u043A\u0435, \u0432 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u0445 \u0438 \u0432 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0438 scm). \u0416\u0435\u0441\u0442\u044B \u043C\u044B\u0448\u0438 "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0431\u043E\u043A\u0443" (\u0435\u0441\u043B\u0438 \u043E\u043D\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442\u0441\u044F) \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0442\u0430\u043A\u0438\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0438 \u043D\u0435 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u0432\u0430\u043B\u0438 \u0441 \u043C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0432 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438 (\u0435\u0441\u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F). \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043C\u043E\u0436\u0435\u0442 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043A \u043D\u0438\u043C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442 \u043B\u0438 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0443\u044E \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0443 \u0441\u043F\u0438\u0441\u043A\u0438 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F \u043D\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u043C \u043C\u0435\u0441\u0442\u0435. \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435! \u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0432\u043B\u0438\u044F\u0442\u044C \u043D\u0430 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043E\u0442\u0441\u0442\u0443\u043F \u0434\u043B\u044F \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u043B\u0430\u0432\u043D\u0430\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0434\u043B\u044F \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432.","\u041F\u0440\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432\u044B\u0431\u0438\u0440\u0430\u044E\u0442\u0441\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C. \u0421\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043E\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430\u043C.","\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C. \u041F\u0440\u0438 \u0434\u0430\u043B\u044C\u043D\u0435\u0439\u0448\u0435\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445 \u0438 \u0432\u043D\u0438\u0437 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u0431\u0445\u043E\u0434 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432.","\u0424\u0438\u043B\u044C\u0442\u0440 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u0442\u044C \u0438 \u0441\u043A\u0440\u044B\u0442\u044C \u0432\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u043B\u044F \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 \u0432 Workbench. \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u0440\u043E\u0441\u0442\u043E\u0439 \u0440\u0435\u0436\u0438\u043C, \u0440\u0435\u0436\u0438\u043C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0438 \u0440\u0435\u0436\u0438\u043C \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u0438.",'\u0423\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0440\u043E\u0441\u0442\u044B\u043C \u0432\u0432\u043E\u0434\u043E\u043C. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "false", \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u044B "list.toggleKeyboardNavigation", \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u043F\u0430\u043F\u043A\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043D\u0430 \u0438\u043C\u0435\u043D\u0430 \u043F\u0430\u043F\u043E\u043A. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043C\u043E\u0436\u0435\u0442 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043A \u043D\u0438\u043C."],"vs/platform/markers/common/markers":["\u041E\u0448\u0438\u0431\u043A\u0430","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0435","\u0434\u0440\u0443\u0433\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B",'\u041A\u043E\u043C\u0430\u043D\u0434\u0430 "{0}" \u043F\u0440\u0438\u0432\u0435\u043B\u0430 \u043A \u043E\u0448\u0438\u0431\u043A\u0435 ({1})'],"vs/platform/quickinput/browser/helpQuickAccess":["\u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B","\u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F, \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0433\u043E \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442.","\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0433\u043E \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442.","\u0426\u0432\u0435\u0442 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u043E\u0432 \u043D\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u043C \u043C\u0435\u0441\u0442\u0435.","\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441 \u0444\u043E\u043A\u0443\u0441\u043E\u043C. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u0432 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0435.","\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u043E\u043A\u0440\u0443\u0433 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043E\u0442\u0434\u0435\u043B\u044F\u0435\u0442 \u0438\u0445 \u043E\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0434\u043B\u044F \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u043E\u043A\u0440\u0443\u0433 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043E\u0442\u0434\u0435\u043B\u044F\u0435\u0442 \u0438\u0445 \u043E\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0434\u043B\u044F \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0441\u044B\u043B\u043E\u043A \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.",'\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A "\u041D\u0430\u0439\u0442\u0438/\u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C".',"\u0424\u043E\u043D \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u041F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.",'\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".',"\u0424\u043E\u043D \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F \u0441\u043F\u0438\u0441\u043A\u0430.","\u041F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F \u0441\u043F\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0431\u044D\u0434\u0436\u0430. \u0411\u044D\u0434\u0436\u0438 - \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0449\u0438\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0431\u044D\u0434\u0436\u0430. \u0411\u044D\u0434\u0436\u0438 - \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0449\u0438\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0443\u0435\u0442 \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u0449\u0435\u043B\u0447\u043A\u0435 \u043F\u043E \u043D\u0435\u043C\u0443.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043E\u0448\u0438\u0431\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u043A\u043E\u043D \u043E\u0448\u0438\u0431\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u043A\u043E\u043D \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u043A\u043E\u043D \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u043A\u043E\u043D \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u043D\u0430\u0439\u0442\u0438/\u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C.",'\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A "\u041F\u043E\u0438\u0441\u043A/\u0437\u0430\u043C\u0435\u043D\u0430".',"\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0443 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0435\u0441\u0442\u044C \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0438 \u0435\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0430\u043D\u0435\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0443 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0435\u0441\u0442\u044C \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0434\u043B\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0438 \u0435\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0444\u043E\u043A\u0443\u0441.","\u0426\u0432\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u0433\u0440\u0443\u043F\u043F\u0438\u0440\u043E\u0432\u043A\u0438 \u043C\u0435\u0442\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u0433\u0440\u0443\u043F\u043F\u0438\u0440\u043E\u0432\u043A\u0438 \u0433\u0440\u0430\u043D\u0438\u0446.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0432\u044B\u0441\u043E\u043A\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439, \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442 \u0441 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u043C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u043C. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0440\u0435\u0433\u0438\u043E\u043D\u043E\u0432 \u0441 \u0442\u0435\u043C \u0436\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u044B\u043C, \u0447\u0442\u043E \u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430, \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430, \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u0434 \u0441\u043B\u043E\u0432\u043E\u043C, \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043C\u0435\u043D\u044E \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0441\u0441\u044B\u043B\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043C\u0435\u043D\u044E \u043B\u0430\u043C\u043F\u043E\u0447\u043A\u0438.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0432 \u043C\u0435\u043D\u044E \u043B\u0430\u043C\u043F\u043E\u0447\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043C\u044F \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u043C\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u043C\u0438.","\u0426\u0432\u0435\u0442 \u0434\u0438\u0430\u0433\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0439 \u0437\u0430\u043B\u0438\u0432\u043A\u0438 \u0434\u043B\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439. \u0414\u0438\u0430\u0433\u043E\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0437\u0430\u043B\u0438\u0432\u043A\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u0440\u0430\u0437\u043C\u0435\u0449\u0430\u0435\u043C\u044B\u0445 \u0440\u044F\u0434\u043E\u043C \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F\u0445 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C\xA0\u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C\xA0\u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 List/Tree \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 List/Tree \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 List/Tree \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0438 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435 \u043F\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0443 List/Tree.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u043F\u0440\u0438 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0448\u0442\u0440\u0438\u0445\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0426\u0432\u0435\u0442 \u0448\u0442\u0440\u0438\u0445\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043F\u0443\u043D\u043A\u0442\u043E\u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0443\u043D\u043A\u0442\u043E\u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u043C\u0435\u043D\u044E \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044F \u043C\u0435\u043D\u044E \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0446\u0432\u0435\u0442\u043E\u043C \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u041C\u0430\u0440\u043A\u0435\u0440 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043E\u0448\u0438\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043D\u0430 \u043D\u0435\u0433\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u043F\u0440\u0438 \u0435\u0433\u043E \u0449\u0435\u043B\u0447\u043A\u0435.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u043E\u0448\u0438\u0431\u043A\u0438, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0430\u044E\u0449\u0435\u0433\u043E \u0437\u043D\u0430\u0447\u043A\u0430, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u043A\u0430, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C."],"vs/platform/theme/common/iconRegistry":["\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E \u0448\u0440\u0438\u0444\u0442\u0430. \u0415\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0435 \u0437\u0430\u0434\u0430\u043D, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0448\u0440\u0438\u0444\u0442, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u043F\u0435\u0440\u0432\u044B\u043C.","\u0421\u0438\u043C\u0432\u043E\u043B \u0448\u0440\u0438\u0444\u0442\u0430, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 \u0441 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0437\u043D\u0430\u0447\u043A\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445."],"vs/platform/undoRedo/common/undoRedoService":["\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B \u0431\u044B\u043B\u0438 \u0437\u0430\u043A\u0440\u044B\u0442\u044B \u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u043D\u0430 \u0434\u0438\u0441\u043A\u0435: {0}.","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B \u0431\u044B\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u043D\u0435\u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C: {0}.",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0431\u044B\u043B\u0438 \u0432\u043D\u0435\u0441\u0435\u043D\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432 {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0432 {1} \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u043B\u0430\u0441\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432?',"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0444\u0430\u0439\u043B\u0430\u0445 ({0})","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B","\u041E\u0442\u043C\u0435\u043D\u0430",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}", \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}"?',"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C","\u041E\u0442\u043C\u0435\u043D\u0430",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0431\u044B\u043B\u0438 \u0432\u043D\u0435\u0441\u0435\u043D\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432 {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0434\u043B\u044F {1} \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F.','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u043B\u0430\u0441\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}", \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F']}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js new file mode 100644 index 0000000000..036ba6b315 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.zh-cn",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u8F93\u5165"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\u533A\u5206\u5927\u5C0F\u5199","\u5168\u5B57\u5339\u914D","\u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F"],"vs/base/browser/ui/findinput/replaceInput":["\u8F93\u5165","\u4FDD\u7559\u5927\u5C0F\u5199"],"vs/base/browser/ui/iconLabel/iconLabel":["\u6B63\u5728\u52A0\u8F7D\u2026"],"vs/base/browser/ui/inputbox/inputBox":["\u9519\u8BEF: {0}","\u8B66\u544A: {0}","\u4FE1\u606F: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u672A\u7ED1\u5B9A"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["\u6E05\u9664","\u7981\u7528\u8F93\u5165\u65F6\u7B5B\u9009","\u542F\u7528\u8F93\u5165\u65F6\u7B5B\u9009","\u672A\u627E\u5230\u5143\u7D20","\u5DF2\u5339\u914D {0} \u4E2A\u5143\u7D20(\u5171 {1} \u4E2A)"],"vs/base/common/actions":["(\u7A7A)"],"vs/base/common/errorMessage":["{0}: {1}","\u53D1\u751F\u4E86\u7CFB\u7EDF\u9519\u8BEF ({0})","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002","{0} \u4E2A(\u5171 {1} \u4E2A\u9519\u8BEF)","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","\u8D85\u952E","Control","Shift","Alt","Command","Control","Shift","Alt","Windows","Control","Shift","Alt","\u8D85\u952E"],"vs/base/parts/quickinput/browser/quickInput":["\u4E0A\u4E00\u6B65","{0}/{1}","\u5728\u6B64\u8F93\u5165\u53EF\u7F29\u5C0F\u7ED3\u679C\u8303\u56F4\u3002","{0} \u4E2A\u7ED3\u679C","\u5DF2\u9009 {0} \u9879","\u786E\u5B9A","\u81EA\u5B9A\u4E49","\u540E\u9000 ({0})","\u4E0A\u4E00\u6B65"],"vs/base/parts/quickinput/browser/quickInputList":["\u5FEB\u901F\u8F93\u5165"],"vs/editor/browser/controller/coreCommands":["\u5373\u4F7F\u8F6C\u5230\u8F83\u957F\u7684\u884C\uFF0C\u4E5F\u4E00\u76F4\u5230\u672B\u5C3E","\u5373\u4F7F\u8F6C\u5230\u8F83\u957F\u7684\u884C\uFF0C\u4E5F\u4E00\u76F4\u5230\u672B\u5C3E"],"vs/editor/browser/controller/textAreaHandler":["\u7F16\u8F91\u5668","\u73B0\u5728\u65E0\u6CD5\u8BBF\u95EE\u7F16\u8F91\u5668\u3002\u6309 {0} \u83B7\u53D6\u9009\u9879\u3002"],"vs/editor/browser/core/keybindingCancellation":["Whether the editor runs a cancellable operation, e.g. like 'Peek References'"],"vs/editor/browser/editorExtensions":["\u64A4\u6D88(&&U)","\u64A4\u6D88","\u6062\u590D(&&R)","\u6062\u590D","\u5168\u9009(&&S)","\u9009\u62E9\u5168\u90E8"],"vs/editor/browser/widget/codeEditorWidget":["\u5149\u6807\u6570\u91CF\u88AB\u9650\u5236\u4E3A {0}\u3002"],"vs/editor/browser/widget/diffEditorWidget":["\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u63D2\u5165\u9879\u7684\u7EBF\u6761\u4FEE\u9970\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u5220\u9664\u9879\u7684\u7EBF\u6761\u4FEE\u9970\u3002","\u6587\u4EF6\u8FC7\u5927\uFF0C\u65E0\u6CD5\u6BD4\u8F83\u3002"],"vs/editor/browser/widget/diffReview":["\u5DEE\u5F02\u8BC4\u5BA1\u4E2D\u7684\u201C\u63D2\u5165\u201D\u56FE\u6807\u3002","\u5DEE\u5F02\u8BC4\u5BA1\u4E2D\u7684\u201C\u5220\u9664\u201D\u56FE\u6807\u3002","\u5DEE\u5F02\u8BC4\u5BA1\u4E2D\u7684\u201C\u5173\u95ED\u201D\u56FE\u6807\u3002","\u5173\u95ED","\u672A\u66F4\u6539\u884C","\u66F4\u6539\u4E86 1 \u884C","\u66F4\u6539\u4E86 {0} \u884C","\u5DEE\u5F02 {0}/ {1}: \u539F\u59CB\u884C {2}\uFF0C{3}\uFF0C\u4FEE\u6539\u540E\u7684\u884C {4}\uFF0C{5}","\u7A7A\u767D","{0} \u672A\u66F4\u6539\u7684\u884C {1}","{0}\u539F\u59CB\u884C{1}\u4FEE\u6539\u7684\u884C{2}","+ {0}\u4FEE\u6539\u7684\u884C{1}","- {0}\u539F\u59CB\u884C{1}","\u8F6C\u81F3\u4E0B\u4E00\u4E2A\u5DEE\u5F02","\u8F6C\u81F3\u4E0A\u4E00\u4E2A\u5DEE\u5F02"],"vs/editor/browser/widget/inlineDiffMargin":["\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C","\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C","\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C({0})","\u8FD8\u539F\u6B64\u66F4\u6539","\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C({0})"],"vs/editor/common/config/commonEditorConfig":["\u7F16\u8F91\u5668","\u4E00\u4E2A\u5236\u8868\u7B26\u7B49\u4E8E\u7684\u7A7A\u683C\u6570\u3002\u5728 `#editor.detectIndentation#` \u542F\u7528\u65F6\uFF0C\u6839\u636E\u6587\u4EF6\u5185\u5BB9\uFF0C\u8BE5\u8BBE\u7F6E\u53EF\u80FD\u4F1A\u88AB\u8986\u76D6\u3002","\u6309 `Tab` \u952E\u65F6\u63D2\u5165\u7A7A\u683C\u3002\u8BE5\u8BBE\u7F6E\u5728 `#editor.detectIndentation#` \u542F\u7528\u65F6\u6839\u636E\u6587\u4EF6\u5185\u5BB9\u53EF\u80FD\u4F1A\u88AB\u8986\u76D6\u3002","\u63A7\u5236\u662F\u5426\u5728\u6253\u5F00\u6587\u4EF6\u65F6\uFF0C\u57FA\u4E8E\u6587\u4EF6\u5185\u5BB9\u81EA\u52A8\u68C0\u6D4B `#editor.tabSize#` \u548C `#editor.insertSpaces#`\u3002","\u5220\u9664\u81EA\u52A8\u63D2\u5165\u7684\u5C3E\u968F\u7A7A\u767D\u7B26\u53F7\u3002","\u5BF9\u5927\u578B\u6587\u4EF6\u8FDB\u884C\u7279\u6B8A\u5904\u7406\uFF0C\u7981\u7528\u67D0\u4E9B\u5185\u5B58\u5BC6\u96C6\u578B\u529F\u80FD\u3002","\u63A7\u5236\u662F\u5426\u6839\u636E\u6587\u6863\u4E2D\u7684\u6587\u5B57\u8BA1\u7B97\u81EA\u52A8\u5B8C\u6210\u5217\u8868\u3002","\u4EC5\u5EFA\u8BAE\u6D3B\u52A8\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u5EFA\u8BAE\u4F7F\u7528\u540C\u4E00\u8BED\u8A00\u7684\u6240\u6709\u6253\u5F00\u7684\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u5EFA\u8BAE\u6240\u6709\u6253\u5F00\u7684\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u63A7\u5236\u901A\u8FC7\u4EC0\u4E48\u6587\u6863\u8BA1\u7B97\u57FA\u4E8E\u5B57\u8BCD\u7684\u5B8C\u6210\u6570\u3002","\u5BF9\u6240\u6709\u989C\u8272\u4E3B\u9898\u542F\u7528\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002","\u5BF9\u6240\u6709\u989C\u8272\u4E3B\u9898\u7981\u7528\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002",'\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u662F\u7531\u5F53\u524D\u989C\u8272\u4E3B\u9898\u7684 "semanticHighlighting" \u8BBE\u7F6E\u914D\u7F6E\u7684\u3002',"\u63A7\u5236\u662F\u5426\u4E3A\u652F\u6301\u5B83\u7684\u8BED\u8A00\u663E\u793A\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002","\u5728\u901F\u89C8\u7F16\u8F91\u5668\u4E2D\uFF0C\u5373\u4F7F\u53CC\u51FB\u5176\u4E2D\u7684\u5185\u5BB9\u6216\u8005\u6309 `Esc` \u952E\uFF0C\u4E5F\u4FDD\u6301\u5176\u6253\u5F00\u72B6\u6001\u3002","\u7531\u4E8E\u6027\u80FD\u539F\u56E0\uFF0C\u8D85\u8FC7\u8FD9\u4E2A\u957F\u5EA6\u7684\u884C\u5C06\u4E0D\u4F1A\u88AB\u6807\u8BB0","\u8D85\u65F6(\u4EE5\u6BEB\u79D2\u4E3A\u5355\u4F4D)\uFF0C\u4E4B\u540E\u5C06\u53D6\u6D88\u5DEE\u5F02\u8BA1\u7B97\u3002\u4F7F\u75280\u8868\u793A\u6CA1\u6709\u8D85\u65F6\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u663E\u793A\u65B9\u5F0F\u662F\u5E76\u6392\u8FD8\u662F\u5185\u8054\u3002","\u542F\u7528\u540E\uFF0C\u5DEE\u5F02\u7F16\u8F91\u5668\u5C06\u5FFD\u7565\u524D\u5BFC\u7A7A\u683C\u6216\u5C3E\u968F\u7A7A\u683C\u4E2D\u7684\u66F4\u6539\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u662F\u5426\u4E3A\u6DFB\u52A0/\u5220\u9664\u7684\u66F4\u6539\u663E\u793A +/- \u6307\u793A\u7B26\u53F7\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A CodeLens\u3002","\u6C38\u4E0D\u6362\u884C\u3002","\u5C06\u5728\u89C6\u533A\u5BBD\u5EA6\u5904\u6362\u884C\u3002","\u5C06\u6839\u636E `#editor.wordWrap#` \u8BBE\u7F6E\u6362\u884C\u3002"],"vs/editor/common/config/editorOptions":["\u7F16\u8F91\u5668\u5C06\u4F7F\u7528\u5E73\u53F0 API \u4EE5\u68C0\u6D4B\u662F\u5426\u9644\u52A0\u4E86\u5C4F\u5E55\u9605\u8BFB\u5668\u3002","\u7F16\u8F91\u5668\u5C06\u9488\u5BF9\u4E0E\u5C4F\u5E55\u9605\u8BFB\u5668\u642D\u914D\u4F7F\u7528\u8FDB\u884C\u6C38\u4E45\u4F18\u5316\u3002\u5C06\u7981\u7528\u81EA\u52A8\u6362\u884C\u3002","\u7F16\u8F91\u5668\u5C06\u4E0D\u518D\u5BF9\u5C4F\u5E55\u9605\u8BFB\u5668\u7684\u4F7F\u7528\u8FDB\u884C\u4F18\u5316\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5728\u5BF9\u5C4F\u5E55\u9605\u8BFB\u5668\u8FDB\u884C\u4E86\u4F18\u5316\u7684\u6A21\u5F0F\u4E0B\u8FD0\u884C\u3002\u8BBE\u7F6E\u4E3A\u201C\u5F00\u201D\u5C06\u7981\u7528\u81EA\u52A8\u6362\u884C\u3002","\u63A7\u5236\u5728\u6CE8\u91CA\u65F6\u662F\u5426\u63D2\u5165\u7A7A\u683C\u5B57\u7B26\u3002","\u63A7\u5236\u5728\u5BF9\u884C\u6CE8\u91CA\u6267\u884C\u5207\u6362\u3001\u6DFB\u52A0\u6216\u5220\u9664\u64CD\u4F5C\u65F6\uFF0C\u662F\u5426\u5E94\u5FFD\u7565\u7A7A\u884C\u3002","\u63A7\u5236\u5728\u6CA1\u6709\u9009\u62E9\u5185\u5BB9\u65F6\u8FDB\u884C\u590D\u5236\u662F\u5426\u590D\u5236\u5F53\u524D\u884C\u3002","\u63A7\u5236\u5728\u952E\u5165\u65F6\u5149\u6807\u662F\u5426\u5E94\u8DF3\u8F6C\u4EE5\u67E5\u627E\u5339\u914D\u9879\u3002","\u63A7\u5236\u662F\u5426\u5C06\u7F16\u8F91\u5668\u9009\u4E2D\u5185\u5BB9\u4F5C\u4E3A\u641C\u7D22\u8BCD\u586B\u5165\u5230\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u5207\u52FF\u81EA\u52A8\u6253\u5F00\u201C\u9009\u62E9\u4E2D\u67E5\u627E\u201D(\u9ED8\u8BA4)","\u59CB\u7EC8\u81EA\u52A8\u6253\u5F00\u201C\u5728\u9009\u62E9\u4E2D\u67E5\u627E\u201D","\u9009\u62E9\u591A\u884C\u5185\u5BB9\u65F6\uFF0C\u81EA\u52A8\u6253\u5F00\u201C\u5728\u9009\u62E9\u4E2D\u67E5\u627E\u201D\u3002","\u63A7\u5236\u5728\u6240\u9009\u5185\u5BB9\u4E2D\u81EA\u52A8\u5F00\u542F\u67E5\u627E\u7684\u6761\u4EF6\u3002","\u63A7\u5236\u201C\u67E5\u627E\u201D\u5C0F\u7EC4\u4EF6\u662F\u5426\u8BFB\u53D6\u6216\u4FEE\u6539 macOS \u7684\u5171\u4EAB\u67E5\u627E\u526A\u8D34\u677F\u3002",'\u63A7\u5236 "\u67E5\u627E\u5C0F\u90E8\u4EF6" \u662F\u5426\u5E94\u5728\u7F16\u8F91\u5668\u9876\u90E8\u6DFB\u52A0\u989D\u5916\u7684\u884C\u3002\u5982\u679C\u4E3A true, \u5219\u53EF\u4EE5\u5728 "\u67E5\u627E\u5C0F\u5DE5\u5177" \u53EF\u89C1\u65F6\u6EDA\u52A8\u5230\u7B2C\u4E00\u884C\u4E4B\u5916\u3002',"\u63A7\u5236\u5728\u627E\u4E0D\u5230\u5176\u4ED6\u5339\u914D\u9879\u65F6\uFF0C\u662F\u5426\u81EA\u52A8\u4ECE\u5F00\u5934(\u6216\u7ED3\u5C3E)\u91CD\u65B0\u5F00\u59CB\u641C\u7D22\u3002",'\u542F\u7528/\u7981\u7528\u5B57\u4F53\u8FDE\u5B57("calt" \u548C "liga" \u5B57\u4F53\u7279\u6027)\u3002\u5C06\u6B64\u66F4\u6539\u4E3A\u5B57\u7B26\u4E32\uFF0C\u53EF\u5BF9 "font-feature-settings" CSS \u5C5E\u6027\u8FDB\u884C\u7CBE\u7EC6\u63A7\u5236\u3002','\u663E\u5F0F "font-feature-settings" CSS \u5C5E\u6027\u3002\u5982\u679C\u53EA\u9700\u6253\u5F00/\u5173\u95ED\u8FDE\u5B57\uFF0C\u53EF\u4EE5\u6539\u4E3A\u4F20\u9012\u5E03\u5C14\u503C\u3002','\u914D\u7F6E\u5B57\u4F53\u8FDE\u5B57\u6216\u5B57\u4F53\u7279\u6027\u3002\u53EF\u4EE5\u662F\u7528\u4E8E\u542F\u7528/\u7981\u7528\u8FDE\u5B57\u7684\u5E03\u5C14\u503C\uFF0C\u6216\u7528\u4E8E\u8BBE\u7F6E CSS "font-feature-settings" \u5C5E\u6027\u503C\u7684\u5B57\u7B26\u4E32\u3002',"\u63A7\u5236\u5B57\u4F53\u5927\u5C0F(\u50CF\u7D20)\u3002","\u4EC5\u5141\u8BB8\u4F7F\u7528\u5173\u952E\u5B57\u201C\u6B63\u5E38\u201D\u548C\u201C\u52A0\u7C97\u201D\uFF0C\u6216\u4F7F\u7528\u4ECB\u4E8E 1 \u81F3 1000 \u4E4B\u95F4\u7684\u6570\u5B57\u3002","\u63A7\u5236\u5B57\u4F53\u7C97\u7EC6\u3002\u63A5\u53D7\u5173\u952E\u5B57\u201C\u6B63\u5E38\u201D\u548C\u201C\u52A0\u7C97\u201D\uFF0C\u6216\u8005\u63A5\u53D7\u4ECB\u4E8E 1 \u81F3 1000 \u4E4B\u95F4\u7684\u6570\u5B57\u3002","\u663E\u793A\u7ED3\u679C\u7684\u9884\u89C8\u89C6\u56FE (\u9ED8\u8BA4\u503C)","\u8F6C\u5230\u4E3B\u7ED3\u679C\u5E76\u663E\u793A\u9884\u89C8\u89C6\u56FE","\u8F6C\u5230\u4E3B\u7ED3\u679C\uFF0C\u5E76\u5BF9\u5176\u4ED6\u4EBA\u542F\u7528\u9632\u5077\u7AA5\u5BFC\u822A",'\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528\u5355\u72EC\u7684\u8BBE\u7F6E\uFF0C\u5982"editor.editor.gotoLocation.multipleDefinitions"\u6216"editor.editor.gotoLocation.multipleImplementations"\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5B9A\u4E49"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u58F0\u660E"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5B9E\u73B0"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5F15\u7528"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u5F53"\u8F6C\u5230\u5B9A\u4E49"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49"\u7684\u7ED3\u679C\u662F\u5F53\u524D\u4F4D\u7F6E\u65F6\u6B63\u5728\u6267\u884C\u7684\u5907\u7528\u547D\u4EE4 ID\u3002','\u5F53"\u8F6C\u5230\u58F0\u660E"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u5B9E\u73B0"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u5F15\u7528"\u7684\u7ED3\u679C\u662F\u5F53\u524D\u4F4D\u7F6E\u65F6\u6B63\u5728\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4 ID\u3002',"\u63A7\u5236\u662F\u5426\u663E\u793A\u60AC\u505C\u63D0\u793A\u3002","\u63A7\u5236\u663E\u793A\u60AC\u505C\u63D0\u793A\u524D\u7684\u7B49\u5F85\u65F6\u95F4 (\u6BEB\u79D2)\u3002","\u63A7\u5236\u5F53\u9F20\u6807\u79FB\u52A8\u5230\u60AC\u505C\u63D0\u793A\u4E0A\u65F6\uFF0C\u5176\u662F\u5426\u4FDD\u6301\u53EF\u89C1\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u542F\u7528\u4EE3\u7801\u64CD\u4F5C\u5C0F\u706F\u6CE1\u63D0\u793A\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u542F\u7528\u5185\u8054\u63D0\u793A\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u63A7\u5236\u5185\u8054\u63D0\u793A\u7684\u5B57\u53F7\u3002\u8BBE\u7F6E\u4E3A `0` \u65F6\uFF0C\u5C06\u4F7F\u7528 `#editor.fontSize#` \u7684 90%\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u63A7\u5236\u5185\u8054\u63D0\u793A\u7684\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236\u884C\u9AD8\u3002\u4E3A 0 \u65F6\u5219\u901A\u8FC7\u5B57\u4F53\u5927\u5C0F\u81EA\u52A8\u8BA1\u7B97\u3002","\u63A7\u5236\u662F\u5426\u663E\u793A\u7F29\u7565\u56FE\u3002","\u8FF7\u4F60\u5730\u56FE\u7684\u5927\u5C0F\u4E0E\u7F16\u8F91\u5668\u5185\u5BB9\u76F8\u540C(\u5E76\u4E14\u53EF\u80FD\u6EDA\u52A8)\u3002","\u8FF7\u4F60\u5730\u56FE\u5C06\u6839\u636E\u9700\u8981\u62C9\u4F38\u6216\u7F29\u5C0F\u4EE5\u586B\u5145\u7F16\u8F91\u5668\u7684\u9AD8\u5EA6(\u4E0D\u6EDA\u52A8)\u3002","\u8FF7\u4F60\u5730\u56FE\u5C06\u6839\u636E\u9700\u8981\u7F29\u5C0F\uFF0C\u6C38\u8FDC\u4E0D\u4F1A\u5927\u4E8E\u7F16\u8F91\u5668(\u4E0D\u6EDA\u52A8)\u3002","\u63A7\u5236\u8FF7\u4F60\u5730\u56FE\u7684\u5927\u5C0F\u3002","\u63A7\u5236\u5728\u54EA\u4E00\u4FA7\u663E\u793A\u7F29\u7565\u56FE\u3002","\u63A7\u5236\u4F55\u65F6\u663E\u793A\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u3002","\u5728\u8FF7\u4F60\u5730\u56FE\u4E2D\u7ED8\u5236\u7684\u5185\u5BB9\u6BD4\u4F8B: 1\u30012 \u6216 3\u3002","\u6E32\u67D3\u6BCF\u884C\u7684\u5B9E\u9645\u5B57\u7B26\uFF0C\u800C\u4E0D\u662F\u8272\u5757\u3002","\u9650\u5236\u7F29\u7565\u56FE\u7684\u5BBD\u5EA6\uFF0C\u63A7\u5236\u5176\u6700\u591A\u663E\u793A\u7684\u5217\u6570\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u9876\u8FB9\u548C\u7B2C\u4E00\u884C\u4E4B\u95F4\u7684\u95F4\u8DDD\u91CF\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u5E95\u8FB9\u548C\u6700\u540E\u4E00\u884C\u4E4B\u95F4\u7684\u95F4\u8DDD\u91CF\u3002","\u5728\u8F93\u5165\u65F6\u663E\u793A\u542B\u6709\u53C2\u6570\u6587\u6863\u548C\u7C7B\u578B\u4FE1\u606F\u7684\u5C0F\u9762\u677F\u3002","\u63A7\u5236\u53C2\u6570\u63D0\u793A\u83DC\u5355\u5728\u5230\u8FBE\u5217\u8868\u672B\u5C3E\u65F6\u8FDB\u884C\u5FAA\u73AF\u8FD8\u662F\u5173\u95ED\u3002","\u5728\u5B57\u7B26\u4E32\u5185\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u5728\u6CE8\u91CA\u5185\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u5728\u5B57\u7B26\u4E32\u548C\u6CE8\u91CA\u5916\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u63A7\u5236\u662F\u5426\u5728\u952E\u5165\u65F6\u81EA\u52A8\u663E\u793A\u5EFA\u8BAE\u3002","\u4E0D\u663E\u793A\u884C\u53F7\u3002","\u5C06\u884C\u53F7\u663E\u793A\u4E3A\u7EDD\u5BF9\u884C\u6570\u3002","\u5C06\u884C\u53F7\u663E\u793A\u4E3A\u4E0E\u5149\u6807\u76F8\u9694\u7684\u884C\u6570\u3002","\u6BCF 10 \u884C\u663E\u793A\u4E00\u6B21\u884C\u53F7\u3002","\u63A7\u5236\u884C\u53F7\u7684\u663E\u793A\u3002","\u6B64\u7F16\u8F91\u5668\u6807\u5C3A\u5C06\u6E32\u67D3\u7684\u7B49\u5BBD\u5B57\u7B26\u6570\u3002","\u6B64\u7F16\u8F91\u5668\u6807\u5C3A\u7684\u989C\u8272\u3002","\u5728\u4E00\u5B9A\u6570\u91CF\u7684\u7B49\u5BBD\u5B57\u7B26\u540E\u663E\u793A\u5782\u76F4\u6807\u5C3A\u3002\u8F93\u5165\u591A\u4E2A\u503C\uFF0C\u663E\u793A\u591A\u4E2A\u6807\u5C3A\u3002\u82E5\u6570\u7EC4\u4E3A\u7A7A\uFF0C\u5219\u4E0D\u7ED8\u5236\u6807\u5C3A\u3002","\u63D2\u5165\u5EFA\u8BAE\u800C\u4E0D\u8986\u76D6\u5149\u6807\u53F3\u4FA7\u7684\u6587\u672C\u3002","\u63D2\u5165\u5EFA\u8BAE\u5E76\u8986\u76D6\u5149\u6807\u53F3\u4FA7\u7684\u6587\u672C\u3002","\u63A7\u5236\u63A5\u53D7\u8865\u5168\u65F6\u662F\u5426\u8986\u76D6\u5355\u8BCD\u3002\u8BF7\u6CE8\u610F\uFF0C\u8FD9\u53D6\u51B3\u4E8E\u6269\u5C55\u9009\u62E9\u4F7F\u7528\u6B64\u529F\u80FD\u3002","\u63A7\u5236\u5BF9\u5EFA\u8BAE\u7684\u7B5B\u9009\u548C\u6392\u5E8F\u662F\u5426\u8003\u8651\u5C0F\u7684\u62FC\u5199\u9519\u8BEF\u3002","\u63A7\u5236\u6392\u5E8F\u65F6\u662F\u5426\u63D0\u9AD8\u9760\u8FD1\u5149\u6807\u7684\u8BCD\u8BED\u7684\u4F18\u5148\u7EA7\u3002","\u63A7\u5236\u662F\u5426\u5728\u591A\u4E2A\u5DE5\u4F5C\u533A\u548C\u7A97\u53E3\u95F4\u5171\u4EAB\u8BB0\u5FC6\u7684\u5EFA\u8BAE\u9009\u9879(\u9700\u8981 `#editor.suggestSelection#`)\u3002","\u63A7\u5236\u6D3B\u52A8\u4EE3\u7801\u6BB5\u662F\u5426\u963B\u6B62\u5FEB\u901F\u5EFA\u8BAE\u3002","\u63A7\u5236\u662F\u5426\u5728\u5EFA\u8BAE\u4E2D\u663E\u793A\u6216\u9690\u85CF\u56FE\u6807\u3002","\u63A7\u5236\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u5E95\u90E8\u7684\u72B6\u6001\u680F\u7684\u53EF\u89C1\u6027\u3002","\u63A7\u5236\u5EFA\u8BAE\u8BE6\u7EC6\u4FE1\u606F\u662F\u968F\u6807\u7B7E\u4E00\u8D77\u663E\u793A\u8FD8\u662F\u4EC5\u663E\u793A\u5728\u8BE6\u7EC6\u4FE1\u606F\u5C0F\u7EC4\u4EF6\u4E2D","\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\u3002\u73B0\u5728\u53EF\u4EE5\u8C03\u6574\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u5927\u5C0F\u3002",'\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528\u5355\u72EC\u7684\u8BBE\u7F6E\uFF0C\u5982"editor.suggest.showKeywords"\u6216"editor.suggest.showSnippets"\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u65B9\u6CD5\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u51FD\u6570\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6784\u9020\u51FD\u6570\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5B57\u6BB5\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u53D8\u91CF\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7C7B\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7ED3\u6784\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u63A5\u53E3\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6A21\u5757\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5C5E\u6027\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u4E8B\u4EF6\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u64CD\u4F5C\u7B26\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5355\u4F4D\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u503C\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5E38\u91CF\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u679A\u4E3E\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A "enumMember" \u5EFA\u8BAE\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5173\u952E\u5B57\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u672C\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u989C\u8272\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u4EF6\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u53C2\u8003\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u81EA\u5B9A\u4E49\u989C\u8272\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u4EF6\u5939\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A "typeParameter" \u5EFA\u8BAE\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7247\u6BB5\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A"\u7528\u6237"\u5EFA\u8BAE\u3002','\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A"\u95EE\u9898"\u5EFA\u8BAE\u3002',"\u662F\u5426\u5E94\u59CB\u7EC8\u9009\u62E9\u524D\u5BFC\u548C\u5C3E\u968F\u7A7A\u683C\u3002","\u63A7\u5236\u662F\u5426\u5E94\u5728\u9047\u5230\u63D0\u4EA4\u5B57\u7B26\u65F6\u63A5\u53D7\u5EFA\u8BAE\u3002\u4F8B\u5982\uFF0C\u5728 JavaScript \u4E2D\uFF0C\u534A\u89D2\u5206\u53F7 (`;`) \u53EF\u4EE5\u4E3A\u63D0\u4EA4\u5B57\u7B26\uFF0C\u80FD\u591F\u5728\u63A5\u53D7\u5EFA\u8BAE\u7684\u540C\u65F6\u952E\u5165\u8BE5\u5B57\u7B26\u3002","\u4EC5\u5F53\u5EFA\u8BAE\u5305\u542B\u6587\u672C\u6539\u52A8\u65F6\u624D\u53EF\u4F7F\u7528 `Enter` \u952E\u8FDB\u884C\u63A5\u53D7\u3002","\u63A7\u5236\u9664\u4E86 `Tab` \u952E\u4EE5\u5916\uFF0C `Enter` \u952E\u662F\u5426\u540C\u6837\u53EF\u4EE5\u63A5\u53D7\u5EFA\u8BAE\u3002\u8FD9\u80FD\u51CF\u5C11\u201C\u63D2\u5165\u65B0\u884C\u201D\u548C\u201C\u63A5\u53D7\u5EFA\u8BAE\u201D\u547D\u4EE4\u4E4B\u95F4\u7684\u6B67\u4E49\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u4E2D\u53EF\u7531\u5C4F\u5E55\u9605\u8BFB\u5668\u8BFB\u53D6\u7684\u884C\u6570\u3002\u8B66\u544A: \u5BF9\u4E8E\u5927\u4E8E\u9ED8\u8BA4\u503C\u7684\u6570\u5B57\uFF0C\u8FD9\u4F1A\u5F71\u54CD\u6027\u80FD\u3002","\u7F16\u8F91\u5668\u5185\u5BB9","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u95ED\u5408\u62EC\u53F7\u3002","\u4EC5\u5F53\u5149\u6807\u4F4D\u4E8E\u7A7A\u767D\u5B57\u7B26\u5DE6\u4FA7\u65F6\uFF0C\u624D\u81EA\u52A8\u95ED\u5408\u62EC\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5728\u5DE6\u62EC\u53F7\u540E\u81EA\u52A8\u63D2\u5165\u53F3\u62EC\u53F7\u3002","\u4EC5\u5728\u81EA\u52A8\u63D2\u5165\u65F6\u624D\u6539\u5199\u53F3\u5F15\u53F7\u6216\u53F3\u62EC\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u6539\u5199\u53F3\u5F15\u53F7\u6216\u53F3\u62EC\u53F7\u3002","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u95ED\u5408\u5F15\u53F7\u3002","\u4EC5\u5F53\u5149\u6807\u4F4D\u4E8E\u7A7A\u767D\u5B57\u7B26\u5DE6\u4FA7\u65F6\uFF0C\u624D\u81EA\u52A8\u95ED\u5408\u5F15\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5728\u5DE6\u5F15\u53F7\u540E\u81EA\u52A8\u63D2\u5165\u53F3\u5F15\u53F7\u3002","\u7F16\u8F91\u5668\u4E0D\u4F1A\u81EA\u52A8\u63D2\u5165\u7F29\u8FDB\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u5E76\u9075\u5FAA\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u3001\u4F7F\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\u5E76\u8C03\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u7279\u5B9A onEnterRules\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\uFF0C\u4F7F\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\uFF0C\u8C03\u7528\u7531\u8BED\u8A00\u5B9A\u4E49\u7684\u7279\u6B8A\u8F93\u5165\u89C4\u5219\uFF0C\u5E76\u9075\u5FAA\u7531\u8BED\u8A00\u5B9A\u4E49\u7684\u7F29\u8FDB\u89C4\u5219\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5728\u7528\u6237\u952E\u5165\u3001\u7C98\u8D34\u3001\u79FB\u52A8\u6216\u7F29\u8FDB\u884C\u65F6\u81EA\u52A8\u8C03\u6574\u7F29\u8FDB\u3002","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u4F7F\u7528\u5F15\u53F7\u800C\u975E\u62EC\u53F7\u6765\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u4F7F\u7528\u62EC\u53F7\u800C\u975E\u5F15\u53F7\u6765\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u63A7\u5236\u5728\u952E\u5165\u5F15\u53F7\u6216\u65B9\u62EC\u53F7\u65F6\uFF0C\u7F16\u8F91\u5668\u662F\u5426\u5E94\u81EA\u52A8\u5C06\u6240\u9009\u5185\u5BB9\u62EC\u8D77\u6765\u3002","\u5728\u4F7F\u7528\u7A7A\u683C\u8FDB\u884C\u7F29\u8FDB\u65F6\u6A21\u62DF\u5236\u8868\u7B26\u7684\u9009\u62E9\u884C\u4E3A\u3002\u6240\u9009\u5185\u5BB9\u5C06\u59CB\u7EC8\u4F7F\u7528\u5236\u8868\u7B26\u505C\u6B62\u4F4D\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A CodeLens\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u4F53\u5927\u5C0F(\u50CF\u7D20)\u3002\u8BBE\u7F6E\u4E3A `0` \u65F6\uFF0C\u5C06\u4F7F\u7528 `#editor.fontSize#` \u7684 90%\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u5185\u8054\u989C\u8272\u4FEE\u9970\u5668\u548C\u989C\u8272\u9009\u53D6\u5668\u3002","\u542F\u7528\u4F7F\u7528\u9F20\u6807\u548C\u952E\u8FDB\u884C\u5217\u9009\u62E9\u3002","\u63A7\u5236\u5728\u590D\u5236\u65F6\u662F\u5426\u540C\u65F6\u590D\u5236\u8BED\u6CD5\u9AD8\u4EAE\u3002","\u63A7\u5236\u5149\u6807\u7684\u52A8\u753B\u6837\u5F0F\u3002","\u63A7\u5236\u662F\u5426\u542F\u7528\u5E73\u6ED1\u63D2\u5165\u52A8\u753B\u3002","\u63A7\u5236\u5149\u6807\u6837\u5F0F\u3002",'\u63A7\u5236\u5149\u6807\u5468\u56F4\u53EF\u89C1\u7684\u524D\u7F6E\u884C\u548C\u5C3E\u968F\u884C\u7684\u6700\u5C0F\u6570\u76EE\u3002\u5728\u5176\u4ED6\u4E00\u4E9B\u7F16\u8F91\u5668\u4E2D\u79F0\u4E3A "scrollOff" \u6216 "scrollOffset"\u3002','\u4EC5\u5F53\u901A\u8FC7\u952E\u76D8\u6216 API \u89E6\u53D1\u65F6\uFF0C\u624D\u4F1A\u5F3A\u5236\u6267\u884C"\u5149\u6807\u73AF\u7ED5\u884C"\u3002','\u59CB\u7EC8\u5F3A\u5236\u6267\u884C "cursorSurroundingLines"','\u63A7\u5236\u4F55\u65F6\u5E94\u5F3A\u5236\u6267\u884C"\u5149\u6807\u73AF\u7ED5\u884C"\u3002',"\u5F53 `#editor.cursorStyle#` \u8BBE\u7F6E\u4E3A `line` \u65F6\uFF0C\u63A7\u5236\u5149\u6807\u7684\u5BBD\u5EA6\u3002","\u63A7\u5236\u5728\u7F16\u8F91\u5668\u4E2D\u662F\u5426\u5141\u8BB8\u901A\u8FC7\u62D6\u653E\u6765\u79FB\u52A8\u9009\u4E2D\u5185\u5BB9\u3002",'\u6309\u4E0B"Alt"\u65F6\u6EDA\u52A8\u901F\u5EA6\u500D\u589E\u3002',"\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u542F\u7528\u4E86\u4EE3\u7801\u6298\u53E0\u3002","\u4F7F\u7528\u7279\u5B9A\u4E8E\u8BED\u8A00\u7684\u6298\u53E0\u7B56\u7565(\u5982\u679C\u53EF\u7528)\uFF0C\u5426\u5219\u4F7F\u7528\u57FA\u4E8E\u7F29\u8FDB\u7684\u7B56\u7565\u3002","\u4F7F\u7528\u57FA\u4E8E\u7F29\u8FDB\u7684\u6298\u53E0\u7B56\u7565\u3002","\u63A7\u5236\u8BA1\u7B97\u6298\u53E0\u8303\u56F4\u7684\u7B56\u7565\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u7A81\u51FA\u663E\u793A\u6298\u53E0\u8303\u56F4\u3002","\u63A7\u5236\u5355\u51FB\u5DF2\u6298\u53E0\u7684\u884C\u540E\u9762\u7684\u7A7A\u5185\u5BB9\u662F\u5426\u4F1A\u5C55\u5F00\u8BE5\u884C\u3002","\u63A7\u5236\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u81EA\u52A8\u683C\u5F0F\u5316\u7C98\u8D34\u7684\u5185\u5BB9\u3002\u683C\u5F0F\u5316\u7A0B\u5E8F\u5FC5\u987B\u53EF\u7528\uFF0C\u5E76\u4E14\u80FD\u9488\u5BF9\u6587\u6863\u4E2D\u7684\u67D0\u4E00\u8303\u56F4\u8FDB\u884C\u683C\u5F0F\u5316\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u5728\u952E\u5165\u4E00\u884C\u540E\u662F\u5426\u81EA\u52A8\u683C\u5F0F\u5316\u8BE5\u884C\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5448\u73B0\u5782\u76F4\u5B57\u5F62\u8FB9\u8DDD\u3002\u5B57\u5F62\u8FB9\u8DDD\u6700\u5E38\u7528\u4E8E\u8C03\u8BD5\u3002","\u63A7\u5236\u662F\u5426\u5728\u6982\u89C8\u6807\u5C3A\u4E2D\u9690\u85CF\u5149\u6807\u3002","\u63A7\u5236\u662F\u5426\u7A81\u51FA\u663E\u793A\u7F16\u8F91\u5668\u4E2D\u6D3B\u52A8\u7684\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u63A7\u5236\u5B57\u6BCD\u95F4\u8DDD(\u50CF\u7D20)\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5DF2\u542F\u7528\u94FE\u63A5\u7F16\u8F91\u3002\u76F8\u5173\u7B26\u53F7(\u5982 HTML \u6807\u8BB0)\u5728\u7F16\u8F91\u65F6\u8FDB\u884C\u66F4\u65B0\uFF0C\u5177\u4F53\u7531\u8BED\u8A00\u800C\u5B9A\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u68C0\u6D4B\u94FE\u63A5\u5E76\u4F7F\u5176\u53EF\u88AB\u70B9\u51FB\u3002","\u7A81\u51FA\u663E\u793A\u5339\u914D\u7684\u62EC\u53F7\u3002","\u5BF9\u9F20\u6807\u6EDA\u8F6E\u6EDA\u52A8\u4E8B\u4EF6\u7684 `deltaX` \u548C `deltaY` \u4E58\u4E0A\u7684\u7CFB\u6570\u3002","\u6309\u4F4F `Ctrl` \u952E\u5E76\u6EDA\u52A8\u9F20\u6807\u6EDA\u8F6E\u65F6\u5BF9\u7F16\u8F91\u5668\u5B57\u4F53\u5927\u5C0F\u8FDB\u884C\u7F29\u653E\u3002","\u5F53\u591A\u4E2A\u5149\u6807\u91CD\u53E0\u65F6\u8FDB\u884C\u5408\u5E76\u3002","\u6620\u5C04\u4E3A `Ctrl` (Windows \u548C Linux) \u6216 `Command` (macOS)\u3002","\u6620\u5C04\u4E3A `Alt` (Windows \u548C Linux) \u6216 `Option` (macOS)\u3002","\u5728\u901A\u8FC7\u9F20\u6807\u6DFB\u52A0\u591A\u4E2A\u5149\u6807\u65F6\u4F7F\u7528\u7684\u4FEE\u6539\u952E\u3002\u201C\u8F6C\u5230\u5B9A\u4E49\u201D\u548C\u201C\u6253\u5F00\u94FE\u63A5\u201D\u529F\u80FD\u6240\u9700\u7684\u9F20\u6807\u52A8\u4F5C\u5C06\u4F1A\u76F8\u5E94\u8C03\u6574\uFF0C\u4E0D\u4E0E\u591A\u5149\u6807\u4FEE\u6539\u952E\u51B2\u7A81\u3002[\u9605\u8BFB\u8BE6\u7EC6\u4FE1\u606F](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier)\u3002","\u6BCF\u4E2A\u5149\u6807\u7C98\u8D34\u4E00\u884C\u6587\u672C\u3002","\u6BCF\u4E2A\u5149\u6807\u7C98\u8D34\u5168\u6587\u3002","\u63A7\u5236\u7C98\u8D34\u65F6\u7C98\u8D34\u6587\u672C\u7684\u884C\u8BA1\u6570\u4E0E\u5149\u6807\u8BA1\u6570\u76F8\u5339\u914D\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u7A81\u51FA\u663E\u793A\u8BED\u4E49\u7B26\u53F7\u7684\u5339\u914D\u9879\u3002","\u63A7\u5236\u662F\u5426\u5728\u6982\u89C8\u6807\u5C3A\u5468\u56F4\u7ED8\u5236\u8FB9\u6846\u3002","\u6253\u5F00\u901F\u89C8\u65F6\u805A\u7126\u6811","\u6253\u5F00\u9884\u89C8\u65F6\u5C06\u7126\u70B9\u653E\u5728\u7F16\u8F91\u5668\u4E0A","\u63A7\u5236\u662F\u5C06\u7126\u70B9\u653E\u5728\u5185\u8054\u7F16\u8F91\u5668\u4E0A\u8FD8\u662F\u653E\u5728\u9884\u89C8\u5C0F\u90E8\u4EF6\u4E2D\u7684\u6811\u4E0A\u3002",'\u63A7\u5236"\u8F6C\u5230\u5B9A\u4E49"\u9F20\u6807\u624B\u52BF\u662F\u5426\u59CB\u7EC8\u6253\u5F00\u9884\u89C8\u5C0F\u90E8\u4EF6\u3002',"\u63A7\u5236\u663E\u793A\u5FEB\u901F\u5EFA\u8BAE\u524D\u7684\u7B49\u5F85\u65F6\u95F4 (\u6BEB\u79D2)\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u8F93\u5165\u65F6\u81EA\u52A8\u91CD\u547D\u540D\u3002",'\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528 "editor.linkedEditing"\u3002',"\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u63A7\u5236\u5B57\u7B26\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u5F53\u6587\u4EF6\u4EE5\u6362\u884C\u7B26\u7ED3\u675F\u65F6, \u5448\u73B0\u6700\u540E\u4E00\u884C\u7684\u884C\u53F7\u3002","\u540C\u65F6\u7A81\u51FA\u663E\u793A\u5BFC\u822A\u7EBF\u548C\u5F53\u524D\u884C\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u5F53\u524D\u884C\u8FDB\u884C\u9AD8\u4EAE\u663E\u793A\u7684\u65B9\u5F0F\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u4EC5\u5728\u7126\u70B9\u5728\u7F16\u8F91\u5668\u65F6\u7A81\u51FA\u663E\u793A\u5F53\u524D\u884C","\u5448\u73B0\u7A7A\u683C\u5B57\u7B26(\u5B57\u8BCD\u4E4B\u95F4\u7684\u5355\u4E2A\u7A7A\u683C\u9664\u5916)\u3002","\u4EC5\u5728\u9009\u5B9A\u6587\u672C\u4E0A\u5448\u73B0\u7A7A\u767D\u5B57\u7B26\u3002","\u4EC5\u5448\u73B0\u5C3E\u968F\u7A7A\u683C\u5B57\u7B26","\u63A7\u5236\u7F16\u8F91\u5668\u5728\u7A7A\u767D\u5B57\u7B26\u4E0A\u663E\u793A\u7B26\u53F7\u7684\u65B9\u5F0F\u3002","\u63A7\u5236\u9009\u533A\u662F\u5426\u6709\u5706\u89D2\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u6C34\u5E73\u6EDA\u52A8\u65F6\u53EF\u4EE5\u8D85\u8FC7\u8303\u56F4\u7684\u5B57\u7B26\u6570\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u53EF\u4EE5\u6EDA\u52A8\u5230\u6700\u540E\u4E00\u884C\u4E4B\u540E\u3002","\u540C\u65F6\u5782\u76F4\u548C\u6C34\u5E73\u6EDA\u52A8\u65F6\uFF0C\u4EC5\u6CBF\u4E3B\u8F74\u6EDA\u52A8\u3002\u5728\u89E6\u63A7\u677F\u4E0A\u5782\u76F4\u6EDA\u52A8\u65F6\uFF0C\u53EF\u9632\u6B62\u6C34\u5E73\u6F02\u79FB\u3002","\u63A7\u5236\u662F\u5426\u652F\u6301 Linux \u4E3B\u526A\u8D34\u677F\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u7A81\u51FA\u663E\u793A\u4E0E\u6240\u9009\u5185\u5BB9\u7C7B\u4F3C\u7684\u5339\u914D\u9879\u3002","\u59CB\u7EC8\u663E\u793A\u6298\u53E0\u63A7\u4EF6\u3002","\u4EC5\u5728\u9F20\u6807\u4F4D\u4E8E\u88C5\u8BA2\u7EBF\u4E0A\u65B9\u65F6\u663E\u793A\u6298\u53E0\u63A7\u4EF6\u3002","\u63A7\u5236\u4F55\u65F6\u663E\u793A\u884C\u53F7\u69FD\u4E0A\u7684\u6298\u53E0\u63A7\u4EF6\u3002","\u63A7\u5236\u662F\u5426\u6DE1\u5316\u672A\u4F7F\u7528\u7684\u4EE3\u7801\u3002","\u63A7\u5236\u52A0\u5220\u9664\u7EBF\u88AB\u5F03\u7528\u7684\u53D8\u91CF\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E0A\u65B9\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E0B\u65B9\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E2D\u7A7F\u63D2\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u4E0D\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u63A7\u5236\u4EE3\u7801\u7247\u6BB5\u662F\u5426\u4E0E\u5176\u4ED6\u5EFA\u8BAE\u4E00\u8D77\u663E\u793A\u53CA\u5176\u6392\u5217\u7684\u4F4D\u7F6E\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5728\u6EDA\u52A8\u65F6\u4F7F\u7528\u52A8\u753B\u3002","\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u7684\u5B57\u53F7\u3002\u5982\u679C\u8BBE\u7F6E\u4E3A `0`\uFF0C\u5219\u4F7F\u7528 `#editor.fontSize#` \u7684\u503C\u3002","\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u7684\u884C\u9AD8\u3002\u5982\u679C\u8BBE\u7F6E\u4E3A `0`\uFF0C\u5219\u4F7F\u7528 `#editor.lineHeight#` \u7684\u503C\u3002\u6700\u5C0F\u503C\u4E3A 8\u3002","\u63A7\u5236\u5728\u952E\u5165\u89E6\u53D1\u5B57\u7B26\u540E\u662F\u5426\u81EA\u52A8\u663E\u793A\u5EFA\u8BAE\u3002","\u59CB\u7EC8\u9009\u62E9\u7B2C\u4E00\u4E2A\u5EFA\u8BAE\u3002","\u9009\u62E9\u6700\u8FD1\u7684\u5EFA\u8BAE\uFF0C\u9664\u975E\u8FDB\u4E00\u6B65\u952E\u5165\u9009\u62E9\u5176\u4ED6\u9879\u3002\u4F8B\u5982 `console. -> console.log`\uFF0C\u56E0\u4E3A\u6700\u8FD1\u8865\u5168\u8FC7 `log`\u3002","\u6839\u636E\u4E4B\u524D\u8865\u5168\u8FC7\u7684\u5EFA\u8BAE\u7684\u524D\u7F00\u6765\u8FDB\u884C\u9009\u62E9\u3002\u4F8B\u5982\uFF0C`co -> console`\u3001`con -> const`\u3002","\u63A7\u5236\u5728\u5EFA\u8BAE\u5217\u8868\u4E2D\u5982\u4F55\u9884\u5148\u9009\u62E9\u5EFA\u8BAE\u3002","\u5728\u6309\u4E0B Tab \u952E\u65F6\u8FDB\u884C Tab \u8865\u5168\uFF0C\u5C06\u63D2\u5165\u6700\u4F73\u5339\u914D\u5EFA\u8BAE\u3002","\u7981\u7528 Tab \u8865\u5168\u3002",'\u5728\u524D\u7F00\u5339\u914D\u65F6\u8FDB\u884C Tab \u8865\u5168\u3002\u5728 "quickSuggestions" \u672A\u542F\u7528\u65F6\u4F53\u9A8C\u6700\u597D\u3002',"\u542F\u7528 Tab \u8865\u5168\u3002","\u81EA\u52A8\u5220\u9664\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u5FFD\u7565\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u63D0\u793A\u5220\u9664\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u5220\u9664\u53EF\u80FD\u5BFC\u81F4\u95EE\u9898\u7684\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26\u3002","\u6839\u636E\u5236\u8868\u4F4D\u63D2\u5165\u548C\u5220\u9664\u7A7A\u683C\u3002","\u6267\u884C\u5355\u8BCD\u76F8\u5173\u7684\u5BFC\u822A\u6216\u64CD\u4F5C\u65F6\u4F5C\u4E3A\u5355\u8BCD\u5206\u9694\u7B26\u7684\u5B57\u7B26\u3002","\u6C38\u4E0D\u6362\u884C\u3002","\u5C06\u5728\u89C6\u533A\u5BBD\u5EA6\u5904\u6362\u884C\u3002","\u5728 `#editor.wordWrapColumn#` \u5904\u6298\u884C\u3002","\u5728\u89C6\u533A\u5BBD\u5EA6\u548C `#editor.wordWrapColumn#` \u4E2D\u7684\u8F83\u5C0F\u503C\u5904\u6298\u884C\u3002","\u63A7\u5236\u6298\u884C\u7684\u65B9\u5F0F\u3002","\u5728 `#editor.wordWrap#` \u4E3A `wordWrapColumn` \u6216 `bounded` \u65F6\uFF0C\u63A7\u5236\u7F16\u8F91\u5668\u7684\u6298\u884C\u5217\u3002","\u6CA1\u6709\u7F29\u8FDB\u3002\u6298\u884C\u4ECE\u7B2C 1 \u5217\u5F00\u59CB\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u4E0E\u5176\u7236\u7EA7\u76F8\u540C\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u6BD4\u5176\u7236\u7EA7\u591A 1\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u6BD4\u5176\u7236\u7EA7\u591A 2\u3002","\u63A7\u5236\u6298\u884C\u7684\u7F29\u8FDB\u3002","\u5047\u5B9A\u6240\u6709\u5B57\u7B26\u7684\u5BBD\u5EA6\u76F8\u540C\u3002\u8FD9\u662F\u4E00\u79CD\u5FEB\u901F\u7B97\u6CD5\uFF0C\u9002\u7528\u4E8E\u7B49\u5BBD\u5B57\u4F53\u548C\u67D0\u4E9B\u5B57\u5F62\u5BBD\u5EA6\u76F8\u7B49\u7684\u6587\u5B57(\u5982\u62C9\u4E01\u5B57\u7B26)\u3002","\u5C06\u5305\u88C5\u70B9\u8BA1\u7B97\u59D4\u6258\u7ED9\u6D4F\u89C8\u5668\u3002\u8FD9\u662F\u4E00\u4E2A\u7F13\u6162\u7B97\u6CD5\uFF0C\u53EF\u80FD\u4F1A\u5BFC\u81F4\u5927\u578B\u6587\u4EF6\u88AB\u51BB\u7ED3\uFF0C\u4F46\u5B83\u5728\u6240\u6709\u60C5\u51B5\u4E0B\u90FD\u6B63\u5E38\u5DE5\u4F5C\u3002","\u63A7\u5236\u8BA1\u7B97\u5305\u88F9\u70B9\u7684\u7B97\u6CD5\u3002"],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["\u8F93\u5165"],"vs/editor/common/modes/modesRegistry":["\u7EAF\u6587\u672C"],"vs/editor/common/standaloneStrings":["\u65E0\u9009\u62E9","\u884C {0}, \u5217 {1} (\u9009\u4E2D {2})","\u884C {0}, \u5217 {1}","{0} \u9009\u62E9(\u5DF2\u9009\u62E9 {1} \u4E2A\u5B57\u7B26)","{0} \u9009\u62E9",'\u73B0\u5728\u5C06 "\u8F85\u52A9\u529F\u80FD\u652F\u6301" \u8BBE\u7F6E\u66F4\u6539\u4E3A "\u6253\u5F00"\u3002',"\u73B0\u5728\u6B63\u5728\u6253\u5F00\u201C\u7F16\u8F91\u5668\u8F85\u52A9\u529F\u80FD\u201D\u6587\u6863\u9875\u3002","\u5728\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u53EA\u8BFB\u7A97\u683C\u4E2D\u3002","\u5728\u4E00\u4E2A\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u7A97\u683C\u4E2D\u3002","\u5728\u53EA\u8BFB\u4EE3\u7801\u7F16\u8F91\u5668\u4E2D","\u5728\u4EE3\u7801\u7F16\u8F91\u5668\u4E2D","\u82E5\u8981\u914D\u7F6E\u7F16\u8F91\u5668\uFF0C\u5C06\u5176\u8FDB\u884C\u4F18\u5316\u4EE5\u6700\u597D\u5730\u914D\u5408\u5C4F\u5E55\u9605\u8BFB\u5668\u7684\u4F7F\u7528\uFF0C\u8BF7\u7ACB\u5373\u6309 Command+E\u3002","\u82E5\u8981\u914D\u7F6E\u7F16\u8F91\u5668\uFF0C\u5C06\u5176\u8FDB\u884C\u4F18\u5316\u4EE5\u6700\u9AD8\u6548\u5730\u914D\u5408\u5C4F\u5E55\u9605\u8BFB\u5668\u7684\u4F7F\u7528\uFF0C\u6309\u4E0B Ctrl+E\u3002","\u914D\u7F6E\u7F16\u8F91\u5668\uFF0C\u5C06\u5176\u8FDB\u884C\u4F18\u5316\u4EE5\u6700\u597D\u5730\u914D\u5408\u5C4F\u5E55\u8BFB\u53D6\u5668\u7684\u4F7F\u7528\u3002","\u7F16\u8F91\u5668\u88AB\u914D\u7F6E\u4E3A\u6C38\u8FDC\u4E0D\u8FDB\u884C\u4F18\u5316\u4EE5\u914D\u5408\u5C4F\u5E55\u8BFB\u53D6\u5668\u7684\u4F7F\u7528, \u800C\u5F53\u524D\u4E0D\u662F\u8FD9\u79CD\u60C5\u51B5\u3002","\u5728\u5F53\u524D\u7F16\u8F91\u5668\u4E2D\u6309 Tab \u4F1A\u5C06\u7126\u70B9\u79FB\u52A8\u5230\u4E0B\u4E00\u4E2A\u53EF\u805A\u7126\u7684\u5143\u7D20\u3002\u901A\u8FC7\u6309 {0} \u5207\u6362\u6B64\u884C\u4E3A\u3002","\u5728\u5F53\u524D\u7F16\u8F91\u5668\u4E2D\u6309 Tab \u4F1A\u5C06\u7126\u70B9\u79FB\u52A8\u5230\u4E0B\u4E00\u4E2A\u53EF\u805A\u7126\u7684\u5143\u7D20\u3002\u5F53\u524D\u65E0\u6CD5\u901A\u8FC7\u6309\u952E\u7ED1\u5B9A\u89E6\u53D1\u547D\u4EE4 {0}\u3002","\u5728\u5F53\u524D\u7F16\u8F91\u5668\u4E2D\u6309 Tab \u5C06\u63D2\u5165\u5236\u8868\u7B26\u3002\u901A\u8FC7\u6309 {0} \u5207\u6362\u6B64\u884C\u4E3A\u3002","\u5728\u5F53\u524D\u7F16\u8F91\u5668\u4E2D\u6309 Tab \u4F1A\u63D2\u5165\u5236\u8868\u7B26\u3002\u5F53\u524D\u65E0\u6CD5\u901A\u8FC7\u952E\u7ED1\u5B9A\u89E6\u53D1\u547D\u4EE4 {0}\u3002","\u73B0\u5728\u6309 Command+H \u6253\u5F00\u4E00\u4E2A\u6D4F\u89C8\u5668\u7A97\u53E3, \u5176\u4E2D\u5305\u542B\u6709\u5173\u7F16\u8F91\u5668\u8F85\u52A9\u529F\u80FD\u7684\u8BE6\u7EC6\u4FE1\u606F\u3002","\u73B0\u5728\u6309 Ctrl+H \u6253\u5F00\u4E00\u4E2A\u6D4F\u89C8\u5668\u7A97\u53E3, \u5176\u4E2D\u5305\u542B\u6709\u5173\u7F16\u8F91\u5668\u8F85\u52A9\u529F\u80FD\u7684\u66F4\u591A\u4FE1\u606F\u3002","\u4F60\u53EF\u4EE5\u6309 Esc \u6216 Shift+Esc \u6D88\u9664\u6B64\u5DE5\u5177\u63D0\u793A\u5E76\u8FD4\u56DE\u5230\u7F16\u8F91\u5668\u3002","\u663E\u793A\u8F85\u52A9\u529F\u80FD\u5E2E\u52A9","\u5F00\u53D1\u4EBA\u5458: \u68C0\u67E5\u4EE4\u724C","\u8F6C\u5230\u884C/\u5217...","\u663E\u793A\u6240\u6709\u5FEB\u901F\u8BBF\u95EE\u63D0\u4F9B\u7A0B\u5E8F","\u547D\u4EE4\u9762\u677F","\u663E\u793A\u5E76\u8FD0\u884C\u547D\u4EE4","\u8F6C\u5230\u7B26\u53F7...","\u6309\u7C7B\u522B\u8F6C\u5230\u7B26\u53F7...","\u7F16\u8F91\u5668\u5185\u5BB9","\u6309 Alt+F1 \u53EF\u6253\u5F00\u8F85\u52A9\u529F\u80FD\u9009\u9879\u3002","\u5207\u6362\u9AD8\u5BF9\u6BD4\u5EA6\u4E3B\u9898","\u5728 {1} \u4E2A\u6587\u4EF6\u4E2D\u8FDB\u884C\u4E86 {0} \u6B21\u7F16\u8F91"],"vs/editor/common/view/editorColorRegistry":["\u5149\u6807\u6240\u5728\u884C\u9AD8\u4EAE\u5185\u5BB9\u7684\u80CC\u666F\u989C\u8272\u3002","\u5149\u6807\u6240\u5728\u884C\u56DB\u5468\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u80CC\u666F\u989C\u8272\u7684\u9AD8\u4EAE\u8303\u56F4\uFF0C\u559C\u6B22\u901A\u8FC7\u5FEB\u901F\u6253\u5F00\u548C\u67E5\u627E\u529F\u80FD\u3002\u989C\u8272\u4E0D\u80FD\u4E0D\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u9AD8\u4EAE\u533A\u57DF\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u9AD8\u4EAE\u663E\u793A\u7B26\u53F7\u7684\u80CC\u666F\u989C\u8272\uFF0C\u4F8B\u5982\u8F6C\u5230\u5B9A\u4E49\u6216\u8F6C\u5230\u4E0B\u4E00\u4E2A/\u4E0A\u4E00\u4E2A\u7B26\u53F7\u3002\u989C\u8272\u4E0D\u80FD\u662F\u4E0D\u900F\u660E\u7684\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u9AD8\u4EAE\u663E\u793A\u7B26\u53F7\u5468\u56F4\u7684\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5149\u6807\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5149\u6807\u7684\u80CC\u666F\u8272\u3002\u53EF\u4EE5\u81EA\u5B9A\u4E49\u5757\u578B\u5149\u6807\u8986\u76D6\u5B57\u7B26\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u7A7A\u767D\u5B57\u7B26\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u884C\u53F7\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u884C\u53F7\u7684\u989C\u8272",'"Id" \u5DF2\u88AB\u5F03\u7528\uFF0C\u8BF7\u6539\u7528 "editorLineNumber.activeForeground"\u3002',"\u7F16\u8F91\u5668\u6D3B\u52A8\u884C\u53F7\u7684\u989C\u8272","\u7F16\u8F91\u5668\u6807\u5C3A\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668 CodeLens \u7684\u524D\u666F\u8272","\u5339\u914D\u62EC\u53F7\u7684\u80CC\u666F\u8272","\u5339\u914D\u62EC\u53F7\u5916\u6846\u7684\u989C\u8272","\u6982\u89C8\u6807\u5C3A\u8FB9\u6846\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6982\u8FF0\u6807\u5C3A\u7684\u80CC\u666F\u8272\u3002\u4EC5\u5F53\u7F29\u7565\u56FE\u5DF2\u542F\u7528\u4E14\u7F6E\u4E8E\u7F16\u8F91\u5668\u53F3\u4FA7\u65F6\u624D\u4F7F\u7528\u3002","\u7F16\u8F91\u5668\u5BFC\u822A\u7EBF\u7684\u80CC\u666F\u8272\u3002\u5BFC\u822A\u7EBF\u5305\u62EC\u8FB9\u7F18\u7B26\u53F7\u548C\u884C\u53F7\u3002","\u7F16\u8F91\u5668\u4E2D\u4E0D\u5FC5\u8981(\u672A\u4F7F\u7528)\u7684\u6E90\u4EE3\u7801\u7684\u8FB9\u6846\u989C\u8272\u3002",'\u975E\u5FC5\u987B(\u672A\u4F7F\u7528)\u4EE3\u7801\u7684\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A\u7684\u4E0D\u900F\u660E\u5EA6\u3002\u4F8B\u5982\uFF0C"#000000c0" \u5C06\u4EE5 75% \u7684\u4E0D\u900F\u660E\u5EA6\u663E\u793A\u4EE3\u7801\u3002\u5BF9\u4E8E\u9AD8\u5BF9\u6BD4\u5EA6\u4E3B\u9898\uFF0C\u8BF7\u4F7F\u7528 \u201DeditorUnnecessaryCode.border\u201C \u4E3B\u9898\u6765\u4E3A\u975E\u5FC5\u987B\u4EE3\u7801\u6DFB\u52A0\u4E0B\u5212\u7EBF\uFF0C\u4EE5\u907F\u514D\u989C\u8272\u6DE1\u5316\u3002',"\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u8303\u56F4\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u9519\u8BEF\u6807\u8BB0\u7684\u989C\u8272\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u8B66\u544A\u6807\u8BB0\u7684\u989C\u8272\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u4FE1\u606F\u6807\u8BB0\u7684\u989C\u8272\u3002"],"vs/editor/contrib/anchorSelect/anchorSelect":["\u9009\u62E9\u5B9A\u4F4D\u70B9","\u5B9A\u4F4D\u70B9\u8BBE\u7F6E\u4E3A {0}:{1}","\u8BBE\u7F6E\u9009\u62E9\u5B9A\u4F4D\u70B9","\u8F6C\u5230\u9009\u62E9\u5B9A\u4F4D\u70B9","\u9009\u62E9\u4ECE\u5B9A\u4F4D\u70B9\u5230\u5149\u6807","\u53D6\u6D88\u9009\u62E9\u5B9A\u4F4D\u70B9"],"vs/editor/contrib/bracketMatching/bracketMatching":["\u6982\u89C8\u6807\u5C3A\u4E0A\u8868\u793A\u5339\u914D\u62EC\u53F7\u7684\u6807\u8BB0\u989C\u8272\u3002","\u8F6C\u5230\u62EC\u53F7","\u9009\u62E9\u62EC\u53F7\u6240\u6709\u5185\u5BB9","\u8F6C\u5230\u62EC\u53F7(&&B)"],"vs/editor/contrib/caretOperations/caretOperations":["\u5411\u5DE6\u79FB\u52A8\u6240\u9009\u6587\u672C","\u5411\u53F3\u79FB\u52A8\u6240\u9009\u6587\u672C"],"vs/editor/contrib/caretOperations/transpose":["\u8F6C\u7F6E\u5B57\u6BCD"],"vs/editor/contrib/clipboard/clipboard":["\u526A\u5207(&&T)","\u526A\u5207","\u526A\u5207","\u590D\u5236(&&C)","\u590D\u5236","\u590D\u5236","\u7C98\u8D34(&&P)","\u7C98\u8D34","\u7C98\u8D34","\u590D\u5236\u5E76\u7A81\u51FA\u663E\u793A\u8BED\u6CD5"],"vs/editor/contrib/codeAction/codeActionCommands":["\u8981\u8FD0\u884C\u7684\u4EE3\u7801\u64CD\u4F5C\u7684\u79CD\u7C7B\u3002","\u63A7\u5236\u4F55\u65F6\u5E94\u7528\u8FD4\u56DE\u7684\u64CD\u4F5C\u3002","\u59CB\u7EC8\u5E94\u7528\u7B2C\u4E00\u4E2A\u8FD4\u56DE\u7684\u4EE3\u7801\u64CD\u4F5C\u3002","\u5982\u679C\u4EC5\u8FD4\u56DE\u7684\u7B2C\u4E00\u4E2A\u4EE3\u7801\u64CD\u4F5C\uFF0C\u5219\u5E94\u7528\u8BE5\u64CD\u4F5C\u3002","\u4E0D\u8981\u5E94\u7528\u8FD4\u56DE\u7684\u4EE3\u7801\u64CD\u4F5C\u3002","\u5982\u679C\u53EA\u5E94\u8FD4\u56DE\u9996\u9009\u4EE3\u7801\u64CD\u4F5C\uFF0C\u5219\u5E94\u8FD4\u56DE\u63A7\u4EF6\u3002","\u5E94\u7528\u4EE3\u7801\u64CD\u4F5C\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF","\u5FEB\u901F\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u4EE3\u7801\u64CD\u4F5C",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u4EE3\u7801\u64CD\u4F5C','\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u4EE3\u7801\u64CD\u4F5C',"\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u4EE3\u7801\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u4EE3\u7801\u64CD\u4F5C","\u91CD\u6784...",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u91CD\u6784','\u6CA1\u6709\u53EF\u7528\u7684"{0}"\u91CD\u6784',"\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u91CD\u6784","\u6CA1\u6709\u53EF\u7528\u7684\u91CD\u6784\u64CD\u4F5C","\u6E90\u4EE3\u7801\u64CD\u4F5C...",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u6E90\u64CD\u4F5C',"\u6CA1\u6709\u9002\u7528\u4E8E\u201C {0}\u201D\u7684\u6E90\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u6E90\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u6E90\u4EE3\u7801\u64CD\u4F5C","\u6574\u7406 import \u8BED\u53E5","\u6CA1\u6709\u53EF\u7528\u7684\u6574\u7406 import \u8BED\u53E5\u64CD\u4F5C","\u5168\u90E8\u4FEE\u590D","\u6CA1\u6709\u53EF\u7528\u7684\u201C\u5168\u90E8\u4FEE\u590D\u201D\u64CD\u4F5C","\u81EA\u52A8\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u81EA\u52A8\u4FEE\u590D\u7A0B\u5E8F"],"vs/editor/contrib/codeAction/lightBulbWidget":["\u663E\u793A\u4FEE\u590D\u7A0B\u5E8F\u3002\u9996\u9009\u53EF\u7528\u4FEE\u590D\u7A0B\u5E8F ({0})","\u663E\u793A\u4FEE\u8865\u7A0B\u5E8F({0})","\u663E\u793A\u4FEE\u8865\u7A0B\u5E8F"],"vs/editor/contrib/codelens/codelensController":["\u663E\u793A\u5F53\u524D\u884C\u7684 Code Lens \u547D\u4EE4"],"vs/editor/contrib/comment/comment":["\u5207\u6362\u884C\u6CE8\u91CA","\u5207\u6362\u884C\u6CE8\u91CA(&&T)","\u6DFB\u52A0\u884C\u6CE8\u91CA","\u5220\u9664\u884C\u6CE8\u91CA","\u5207\u6362\u5757\u6CE8\u91CA","\u5207\u6362\u5757\u6CE8\u91CA(&&B)"],"vs/editor/contrib/contextmenu/contextmenu":["\u663E\u793A\u7F16\u8F91\u5668\u4E0A\u4E0B\u6587\u83DC\u5355"],"vs/editor/contrib/cursorUndo/cursorUndo":["\u5149\u6807\u64A4\u6D88","\u5149\u6807\u91CD\u505A"],"vs/editor/contrib/find/findController":["\u67E5\u627E","\u67E5\u627E(&&F)","\u67E5\u627E\u9009\u5B9A\u5185\u5BB9","\u67E5\u627E\u4E0B\u4E00\u4E2A","\u67E5\u627E\u4E0B\u4E00\u4E2A","\u67E5\u627E\u4E0A\u4E00\u4E2A","\u67E5\u627E\u4E0A\u4E00\u4E2A","\u67E5\u627E\u4E0B\u4E00\u4E2A\u9009\u62E9","\u67E5\u627E\u4E0A\u4E00\u4E2A\u9009\u62E9","\u66FF\u6362","\u66FF\u6362(&&R)"],"vs/editor/contrib/find/findWidget":["\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E\u201D\u56FE\u6807\u3002","\u7528\u4E8E\u6307\u793A\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u5DF2\u6298\u53E0\u7684\u56FE\u6807\u3002","\u7528\u4E8E\u6307\u793A\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u5DF2\u5C55\u5F00\u7684\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u66FF\u6362\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u5168\u90E8\u66FF\u6362\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u67E5\u627E\u4E0A\u4E00\u4E2A\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u67E5\u627E\u4E0B\u4E00\u4E2A\u201D\u56FE\u6807\u3002","\u67E5\u627E","\u67E5\u627E","\u4E0A\u4E00\u4E2A\u5339\u914D\u9879","\u4E0B\u4E00\u4E2A\u5339\u914D\u9879","\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E","\u5173\u95ED","\u66FF\u6362","\u66FF\u6362","\u66FF\u6362","\u5168\u90E8\u66FF\u6362","\u5207\u6362\u66FF\u6362\u6A21\u5F0F","\u4EC5\u9AD8\u4EAE\u4E86\u524D {0} \u4E2A\u7ED3\u679C\uFF0C\u4F46\u6240\u6709\u67E5\u627E\u64CD\u4F5C\u5747\u9488\u5BF9\u5168\u6587\u3002","{1} \u4E2D\u7684 {0}","\u65E0\u7ED3\u679C","\u627E\u5230 {0}","\u4E3A\u201C{1}\u201D\u627E\u5230 {0}","\u5728 {2} \u5904\u627E\u5230\u201C{1}\u201D\u7684 {0}","\u4E3A\u201C{1}\u201D\u627E\u5230 {0}","Ctrl+Enter \u73B0\u5728\u7531\u5168\u90E8\u66FF\u6362\u6539\u4E3A\u63D2\u5165\u6362\u884C\u3002\u4F60\u53EF\u4EE5\u4FEE\u6539editor.action.replaceAll \u7684\u6309\u952E\u7ED1\u5B9A\u4EE5\u8986\u76D6\u6B64\u884C\u4E3A\u3002"],"vs/editor/contrib/folding/folding":["\u5C55\u5F00","\u4EE5\u9012\u5F52\u65B9\u5F0F\u5C55\u5F00","\u6298\u53E0","\u5207\u6362\u6298\u53E0","\u4EE5\u9012\u5F52\u65B9\u5F0F\u6298\u53E0","\u6298\u53E0\u6240\u6709\u5757\u6CE8\u91CA","\u6298\u53E0\u6240\u6709\u533A\u57DF","\u5C55\u5F00\u6240\u6709\u533A\u57DF","\u5168\u90E8\u6298\u53E0","\u5168\u90E8\u5C55\u5F00","\u6298\u53E0\u7EA7\u522B {0}","\u6298\u53E0\u8303\u56F4\u540E\u9762\u7684\u80CC\u666F\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u8BBE\u4E3A\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u7F16\u8F91\u5668\u88C5\u8BA2\u7EBF\u4E2D\u6298\u53E0\u63A7\u4EF6\u7684\u989C\u8272\u3002"],"vs/editor/contrib/folding/foldingDecorations":["\u7F16\u8F91\u5668\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u5DF2\u5C55\u5F00\u7684\u8303\u56F4\u7684\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u5DF2\u6298\u53E0\u7684\u8303\u56F4\u7684\u56FE\u6807\u3002"],"vs/editor/contrib/fontZoom/fontZoom":["\u653E\u5927\u7F16\u8F91\u5668\u5B57\u4F53","\u7F29\u5C0F\u7F16\u8F91\u5668\u5B57\u4F53","\u91CD\u7F6E\u7F16\u8F91\u5668\u5B57\u4F53\u5927\u5C0F"],"vs/editor/contrib/format/format":["\u5728\u7B2C {0} \u884C\u8FDB\u884C\u4E86 1 \u6B21\u683C\u5F0F\u7F16\u8F91","\u5728\u7B2C {1} \u884C\u8FDB\u884C\u4E86 {0} \u6B21\u683C\u5F0F\u7F16\u8F91","\u7B2C {0} \u884C\u5230\u7B2C {1} \u884C\u95F4\u8FDB\u884C\u4E86 1 \u6B21\u683C\u5F0F\u7F16\u8F91","\u7B2C {1} \u884C\u5230\u7B2C {2} \u884C\u95F4\u8FDB\u884C\u4E86 {0} \u6B21\u683C\u5F0F\u7F16\u8F91"],"vs/editor/contrib/format/formatActions":["\u683C\u5F0F\u5316\u6587\u6863","\u683C\u5F0F\u5316\u9009\u5B9A\u5185\u5BB9"],"vs/editor/contrib/gotoError/gotoError":["\u8F6C\u5230\u4E0B\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u201C\u8F6C\u5230\u4E0B\u4E00\u4E2A\u201D\u6807\u8BB0\u7684\u56FE\u6807\u3002","\u8F6C\u5230\u4E0A\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u201C\u8F6C\u5230\u4E0A\u4E00\u4E2A\u201D\u6807\u8BB0\u7684\u56FE\u6807\u3002","\u8F6C\u5230\u6587\u4EF6\u4E2D\u7684\u4E0B\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u4E0B\u4E00\u4E2A\u95EE\u9898(&&P)","\u8F6C\u5230\u6587\u4EF6\u4E2D\u7684\u4E0A\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u4E0A\u4E00\u4E2A\u95EE\u9898(&&P)"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\u9519\u8BEF","\u8B66\u544A","\u4FE1\u606F","\u63D0\u793A","{1} \u4E2D\u7684 {0}","{0} \u4E2A\u95EE\u9898(\u5171 {1} \u4E2A)","{0} \u4E2A\u95EE\u9898(\u5171 {1} \u4E2A)","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u9519\u8BEF\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u8B66\u544A\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u4FE1\u606F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u80CC\u666F\u8272\u3002"],"vs/editor/contrib/gotoSymbol/goToCommands":["\u5FEB\u901F\u67E5\u770B","\u5B9A\u4E49","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u4EFB\u4F55\u5B9A\u4E49","\u627E\u4E0D\u5230\u5B9A\u4E49","\u8F6C\u5230\u5B9A\u4E49","\u8F6C\u5230\u5B9A\u4E49(&&D)","\u6253\u5F00\u4FA7\u8FB9\u7684\u5B9A\u4E49","\u901F\u89C8\u5B9A\u4E49","\u58F0\u660E","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u58F0\u660E","\u672A\u627E\u5230\u58F0\u660E","\u8F6C\u5230\u58F0\u660E",'\u8F6C\u5230"\u58F0\u660E"(&&D)',"\u672A\u627E\u5230\u201C{0}\u201D\u7684\u58F0\u660E","\u672A\u627E\u5230\u58F0\u660E","\u67E5\u770B\u58F0\u660E","\u7C7B\u578B\u5B9A\u4E49","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u7C7B\u578B\u5B9A\u4E49","\u672A\u627E\u5230\u7C7B\u578B\u5B9A\u4E49","\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49","\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49(&&T)","\u5FEB\u901F\u67E5\u770B\u7C7B\u578B\u5B9A\u4E49","\u5B9E\u73B0","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u5B9E\u73B0","\u672A\u627E\u5230\u5B9E\u73B0","\u8F6C\u5230\u5B9E\u73B0","\u8DF3\u8F6C\u5230\u5B9E\u73B0(&&I)","\u67E5\u770B\u5B9E\u73B0",'\u672A\u627E\u5230"{0}"\u7684\u5F15\u7528',"\u672A\u627E\u5230\u5F15\u7528","\u8F6C\u5230\u5F15\u7528","\u8F6C\u5230\u5F15\u7528(&&R)","\u5F15\u7528","\u67E5\u770B\u5F15\u7528","\u5F15\u7528","\u8F6C\u5230\u4EFB\u4F55\u7B26\u53F7","\u4F4D\u7F6E","\u65E0\u201C{0}\u201D\u7684\u7ED3\u679C","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["\u5355\u51FB\u663E\u793A {0} \u4E2A\u5B9A\u4E49\u3002"],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\u6B63\u5728\u52A0\u8F7D...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} \u4E2A\u5F15\u7528","{0} \u4E2A\u5F15\u7528","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\u65E0\u53EF\u7528\u9884\u89C8","\u65E0\u7ED3\u679C","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/referencesModel":["\u5728\u6587\u4EF6 {0} \u7684 {1} \u884C {2} \u5217\u7684\u7B26\u53F7","{0} \u4E2D {1} \u884C {2} \u5217\u7684\u7B26\u53F7\uFF0C{3}","{0} \u4E2D\u6709 1 \u4E2A\u7B26\u53F7\uFF0C\u5B8C\u6574\u8DEF\u5F84: {1}","{1} \u4E2D\u6709 {0} \u4E2A\u7B26\u53F7\uFF0C\u5B8C\u6574\u8DEF\u5F84: {2}","\u672A\u627E\u5230\u7ED3\u679C","\u5728 {0} \u4E2D\u627E\u5230 1 \u4E2A\u7B26\u53F7","\u5728 {1} \u4E2D\u627E\u5230 {0} \u4E2A\u7B26\u53F7","\u5728 {1} \u4E2A\u6587\u4EF6\u4E2D\u627E\u5230 {0} \u4E2A\u7B26\u53F7"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["{1} \u7684\u7B26\u53F7 {0}\uFF0C\u4E0B\u4E00\u4E2A\u4F7F\u7528 {2}","{1} \u7684\u7B26\u53F7 {0}"],"vs/editor/contrib/hover/hover":["\u663E\u793A\u60AC\u505C","\u663E\u793A\u5B9A\u4E49\u9884\u89C8\u60AC\u505C"],"vs/editor/contrib/hover/markdownHoverParticipant":["\u6B63\u5728\u52A0\u8F7D..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","\u6CA1\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u590D","\u6B63\u5728\u68C0\u67E5\u5FEB\u901F\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u590D","\u5FEB\u901F\u4FEE\u590D..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\u66FF\u6362\u4E3A\u4E0A\u4E00\u4E2A\u503C","\u66FF\u6362\u4E3A\u4E0B\u4E00\u4E2A\u503C"],"vs/editor/contrib/indentation/indentation":["\u5C06\u7F29\u8FDB\u8F6C\u6362\u4E3A\u7A7A\u683C","\u5C06\u7F29\u8FDB\u8F6C\u6362\u4E3A\u5236\u8868\u7B26","\u5DF2\u914D\u7F6E\u5236\u8868\u7B26\u5927\u5C0F","\u9009\u62E9\u5F53\u524D\u6587\u4EF6\u7684\u5236\u8868\u7B26\u5927\u5C0F",'\u4F7F\u7528 "Tab" \u7F29\u8FDB',"\u4F7F\u7528\u7A7A\u683C\u7F29\u8FDB","\u4ECE\u5185\u5BB9\u4E2D\u68C0\u6D4B\u7F29\u8FDB\u65B9\u5F0F","\u91CD\u65B0\u7F29\u8FDB\u884C","\u91CD\u65B0\u7F29\u8FDB\u6240\u9009\u884C"],"vs/editor/contrib/linesOperations/linesOperations":["\u5411\u4E0A\u590D\u5236\u884C","\u5411\u4E0A\u590D\u5236\u884C(&&C)","\u5411\u4E0B\u590D\u5236\u884C","\u5411\u4E0B\u590D\u5236\u4E00\u884C(&&P)","\u91CD\u590D\u9009\u62E9","\u91CD\u590D\u9009\u62E9(&&D)","\u5411\u4E0A\u79FB\u52A8\u884C","\u5411\u4E0A\u79FB\u52A8\u4E00\u884C(&&V)","\u5411\u4E0B\u79FB\u52A8\u884C","\u5411\u4E0B\u79FB\u52A8\u4E00\u884C(&&L)","\u6309\u5347\u5E8F\u6392\u5217\u884C","\u6309\u964D\u5E8F\u6392\u5217\u884C","\u88C1\u526A\u5C3E\u968F\u7A7A\u683C","\u5220\u9664\u884C","\u884C\u7F29\u8FDB","\u884C\u51CF\u5C11\u7F29\u8FDB","\u5728\u4E0A\u9762\u63D2\u5165\u884C","\u5728\u4E0B\u9762\u63D2\u5165\u884C","\u5220\u9664\u5DE6\u4FA7\u6240\u6709\u5185\u5BB9","\u5220\u9664\u53F3\u4FA7\u6240\u6709\u5185\u5BB9","\u5408\u5E76\u884C","\u8F6C\u7F6E\u5149\u6807\u5904\u7684\u5B57\u7B26","\u8F6C\u6362\u4E3A\u5927\u5199","\u8F6C\u6362\u4E3A\u5C0F\u5199","\u8F6C\u6362\u4E3A\u8BCD\u9996\u5B57\u6BCD\u5927\u5199","\u8F6C\u6362\u4E3A\u86C7\u5F62\u547D\u540D\u6CD5"],"vs/editor/contrib/linkedEditing/linkedEditing":["\u542F\u52A8\u94FE\u63A5\u7F16\u8F91","\u7F16\u8F91\u5668\u6839\u636E\u7C7B\u578B\u81EA\u52A8\u91CD\u547D\u540D\u65F6\u7684\u80CC\u666F\u8272\u3002"],"vs/editor/contrib/links/links":["\u6267\u884C\u547D\u4EE4","\u5173\u6CE8\u94FE\u63A5","cmd + \u5355\u51FB","ctrl + \u5355\u51FB","option + \u5355\u51FB","alt + \u5355\u51FB","\u6267\u884C\u547D\u4EE4 {0}","\u6B64\u94FE\u63A5\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u65E0\u6CD5\u6253\u5F00: {0}","\u6B64\u94FE\u63A5\u76EE\u6807\u5DF2\u4E22\u5931\uFF0C\u65E0\u6CD5\u6253\u5F00\u3002","\u6253\u5F00\u94FE\u63A5"],"vs/editor/contrib/message/messageController":["Whether the editor is currently showing an inline message","\u65E0\u6CD5\u5728\u53EA\u8BFB\u7F16\u8F91\u5668\u4E2D\u7F16\u8F91"],"vs/editor/contrib/multicursor/multicursor":["\u5728\u4E0A\u9762\u6DFB\u52A0\u5149\u6807","\u5728\u4E0A\u9762\u6DFB\u52A0\u5149\u6807(&&A)","\u5728\u4E0B\u9762\u6DFB\u52A0\u5149\u6807","\u5728\u4E0B\u9762\u6DFB\u52A0\u5149\u6807(&&D)","\u5728\u884C\u5C3E\u6DFB\u52A0\u5149\u6807","\u5728\u884C\u5C3E\u6DFB\u52A0\u5149\u6807(&&U)","\u5728\u5E95\u90E8\u6DFB\u52A0\u5149\u6807","\u5728\u9876\u90E8\u6DFB\u52A0\u5149\u6807","\u5C06\u4E0B\u4E00\u4E2A\u67E5\u627E\u5339\u914D\u9879\u6DFB\u52A0\u5230\u9009\u62E9","\u6DFB\u52A0\u4E0B\u4E00\u4E2A\u5339\u914D\u9879(&&N)","\u5C06\u9009\u62E9\u5185\u5BB9\u6DFB\u52A0\u5230\u4E0A\u4E00\u67E5\u627E\u5339\u914D\u9879","\u6DFB\u52A0\u4E0A\u4E00\u4E2A\u5339\u914D\u9879(&&R)","\u5C06\u4E0A\u6B21\u9009\u62E9\u79FB\u52A8\u5230\u4E0B\u4E00\u4E2A\u67E5\u627E\u5339\u914D\u9879","\u5C06\u4E0A\u4E2A\u9009\u62E9\u5185\u5BB9\u79FB\u52A8\u5230\u4E0A\u4E00\u67E5\u627E\u5339\u914D\u9879","\u9009\u62E9\u6240\u6709\u627E\u5230\u7684\u67E5\u627E\u5339\u914D\u9879","\u9009\u62E9\u6240\u6709\u5339\u914D\u9879(&&O)","\u66F4\u6539\u6240\u6709\u5339\u914D\u9879"],"vs/editor/contrib/parameterHints/parameterHints":["\u89E6\u53D1\u53C2\u6570\u63D0\u793A"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["\u201C\u663E\u793A\u4E0B\u4E00\u4E2A\u53C2\u6570\u201D\u63D0\u793A\u7684\u56FE\u6807\u3002","\u201C\u663E\u793A\u4E0A\u4E00\u4E2A\u53C2\u6570\u201D\u63D0\u793A\u7684\u56FE\u6807\u3002","{0}\uFF0C\u63D0\u793A"],"vs/editor/contrib/peekView/peekView":["\u5173\u95ED","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u533A\u57DF\u80CC\u666F\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u4FE1\u606F\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u8FB9\u6846\u548C\u7BAD\u5934\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u884C\u8282\u70B9\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6587\u4EF6\u8282\u70B9\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6240\u9009\u6761\u76EE\u7684\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6240\u9009\u6761\u76EE\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u88C5\u8BA2\u7EBF\u7684\u80CC\u666F\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u5339\u914D\u7A81\u51FA\u663E\u793A\u989C\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u5339\u914D\u7A81\u51FA\u663E\u793A\u989C\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u5339\u914D\u9879\u7684\u7A81\u51FA\u663E\u793A\u8FB9\u6846\u3002"],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\u5148\u6253\u5F00\u6587\u672C\u7F16\u8F91\u5668\u7136\u540E\u8DF3\u8F6C\u5230\u884C\u3002","\u8F6C\u5230\u7B2C {0} \u884C\u3001\u7B2C {1} \u5217\u3002","\u8F6C\u5230\u884C {0}\u3002","\u5F53\u524D\u884C: {0}\uFF0C\u5B57\u7B26: {1}\u3002\u952E\u5165\u8981\u5BFC\u822A\u5230\u7684\u884C\u53F7(\u4ECB\u4E8E 1 \u81F3 {2} \u4E4B\u95F4)\u3002","\u5F53\u524D\u884C: {0}\uFF0C\u5B57\u7B26: {1}\u3002 \u952E\u5165\u8981\u5BFC\u822A\u5230\u7684\u884C\u53F7\u3002"],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\u8981\u8F6C\u5230\u7B26\u53F7\uFF0C\u9996\u5148\u6253\u5F00\u5177\u6709\u7B26\u53F7\u4FE1\u606F\u7684\u6587\u672C\u7F16\u8F91\u5668\u3002","\u6D3B\u52A8\u6587\u672C\u7F16\u8F91\u5668\u4E0D\u63D0\u4F9B\u7B26\u53F7\u4FE1\u606F\u3002","\u6CA1\u6709\u5339\u914D\u7684\u7F16\u8F91\u5668\u7B26\u53F7","\u6CA1\u6709\u7F16\u8F91\u5668\u7B26\u53F7","\u5728\u4FA7\u8FB9\u6253\u5F00","\u5728\u5E95\u90E8\u6253\u5F00","\u7B26\u53F7({0})","\u5C5E\u6027({0})","\u65B9\u6CD5({0})","\u51FD\u6570({0})","\u6784\u9020\u51FD\u6570 ({0})","\u53D8\u91CF({0})","\u7C7B({0})","\u7ED3\u6784({0})","\u4E8B\u4EF6({0})","\u8FD0\u7B97\u7B26({0})","\u63A5\u53E3({0})","\u547D\u540D\u7A7A\u95F4({0})","\u5305({0})","\u7C7B\u578B\u53C2\u6570({0})","\u6A21\u5757({0})","\u5C5E\u6027({0})","\u679A\u4E3E({0})","\u679A\u4E3E\u6210\u5458({0})","\u5B57\u7B26\u4E32({0})","\u6587\u4EF6({0})","\u6570\u7EC4({0})","\u6570\u5B57({0})","\u5E03\u5C14\u503C({0})","\u5BF9\u8C61({0})","\u952E({0})","\u5B57\u6BB5({0})","\u5E38\u91CF({0})"],"vs/editor/contrib/rename/rename":["\u65E0\u7ED3\u679C\u3002","\u89E3\u6790\u91CD\u547D\u540D\u4F4D\u7F6E\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF","\u6B63\u5728\u91CD\u547D\u540D\u201C{0}\u201D","\u91CD\u547D\u540D {0}","\u6210\u529F\u5C06\u201C{0}\u201D\u91CD\u547D\u540D\u4E3A\u201C{1}\u201D\u3002\u6458\u8981: {2}","\u91CD\u547D\u540D\u65E0\u6CD5\u5E94\u7528\u4FEE\u6539","\u91CD\u547D\u540D\u65E0\u6CD5\u8BA1\u7B97\u4FEE\u6539","\u91CD\u547D\u540D\u7B26\u53F7","\u542F\u7528/\u7981\u7528\u91CD\u547D\u540D\u4E4B\u524D\u9884\u89C8\u66F4\u6539\u7684\u529F\u80FD"],"vs/editor/contrib/rename/renameInputField":['\u91CD\u547D\u540D\u8F93\u5165\u3002\u952E\u5165\u65B0\u540D\u79F0\u5E76\u6309 "Enter" \u63D0\u4EA4\u3002',"\u6309 {0} \u8FDB\u884C\u91CD\u547D\u540D\uFF0C\u6309 {1} \u8FDB\u884C\u9884\u89C8"],"vs/editor/contrib/smartSelect/smartSelect":["\u5C55\u5F00\u9009\u62E9","\u5C55\u5F00\u9009\u5B9A\u5185\u5BB9(&&E)","\u6536\u8D77\u9009\u62E9","\u7F29\u5C0F\u9009\u5B9A\u8303\u56F4(&&S)"],"vs/editor/contrib/snippet/snippetVariables":["\u661F\u671F\u5929","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D","\u5468\u65E5","\u5468\u4E00","\u5468\u4E8C","\u5468\u4E09","\u5468\u56DB","\u5468\u4E94","\u5468\u516D","\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","5\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708","1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11 \u6708","12\u6708"],"vs/editor/contrib/suggest/suggestController":["\u9009\u62E9\u201C{0}\u201D\u540E\u8FDB\u884C\u4E86\u5176\u4ED6 {1} \u6B21\u7F16\u8F91","\u89E6\u53D1\u5EFA\u8BAE","\u63D2\u5165","\u63D2\u5165","\u66FF\u6362","\u66FF\u6362","\u63D2\u5165","\u663E\u793A\u66F4\u5C11","\u663E\u793A\u66F4\u591A","\u91CD\u7F6E\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u5927\u5C0F"],"vs/editor/contrib/suggest/suggestWidget":["\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u80CC\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u524D\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u6240\u9009\u6761\u76EE\u7684\u80CC\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u5339\u914D\u5185\u5BB9\u7684\u9AD8\u4EAE\u989C\u8272\u3002","\u6B63\u5728\u52A0\u8F7D...","\u65E0\u5EFA\u8BAE\u3002","{0}\uFF0C\u6587\u6863: {1}","\u5EFA\u8BAE"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\u5173\u95ED","\u6B63\u5728\u52A0\u8F7D\u2026"],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u8BE6\u7EC6\u4FE1\u606F\u7684\u56FE\u6807\u3002","\u4E86\u89E3\u8BE6\u7EC6\u4FE1\u606F"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\u6570\u7EC4\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u5C06\u663E\u793A\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u5E03\u5C14\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7C7B\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u989C\u8272\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5E38\u91CF\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6784\u9020\u51FD\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u679A\u4E3E\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u679A\u4E3E\u5668\u6210\u5458\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u4E8B\u4EF6\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5B57\u6BB5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u4EF6\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u4EF6\u5939\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u51FD\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u63A5\u53E3\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u5C06\u663E\u793A\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u952E\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5173\u952E\u5B57\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u65B9\u6CD5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6A21\u5757\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u547D\u540D\u7A7A\u95F4\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u8F6E\u5ED3\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7A7A\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6570\u5B57\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5BF9\u8C61\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u8FD0\u7B97\u7B26\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5305\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5C5E\u6027\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u53C2\u8003\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7247\u6BB5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5B57\u7B26\u4E32\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u8F6E\u5ED3\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7ED3\u6784\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u672C\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7C7B\u578B\u53C2\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5355\u4F4D\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u53D8\u91CF\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002"],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["\u5207\u6362 Tab \u952E\u79FB\u52A8\u7126\u70B9","Tab \u952E\u5C06\u79FB\u52A8\u5230\u4E0B\u4E00\u53EF\u805A\u7126\u7684\u5143\u7D20","Tab \u952E\u5C06\u63D2\u5165\u5236\u8868\u7B26"],"vs/editor/contrib/tokenization/tokenization":["\u5F00\u53D1\u4EBA\u5458: \u5F3A\u5236\u91CD\u65B0\u8FDB\u884C\u6807\u8BB0"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26","\u68C0\u6D4B\u5230\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26",`\u6B64\u6587\u4EF6\u5305\u542B\u4E00\u4E2A\u6216\u591A\u4E2A\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\uFF0C\u4F8B\u5982\u884C\u5206\u9694\u7B26(LS)\u6216\u6BB5\u843D\u5206\u9694\u7B26(PS)\u3002\r +\r +\u5EFA\u8BAE\u4ECE\u6587\u4EF6\u4E2D\u5220\u9664\u5B83\u4EEC\u3002\u53EF\u901A\u8FC7 "editor.unusualLineTerminators" \u8FDB\u884C\u914D\u7F6E\u3002`,"\u4FEE\u590D\u6B64\u6587\u4EF6","\u5FFD\u7565\u6B64\u6587\u4EF6\u7684\u95EE\u9898"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\u8BFB\u53D6\u8BBF\u95EE\u671F\u95F4\u7B26\u53F7\u7684\u80CC\u666F\u8272\uFF0C\u4F8B\u5982\u8BFB\u53D6\u53D8\u91CF\u65F6\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5199\u5165\u8BBF\u95EE\u8FC7\u7A0B\u4E2D\u7B26\u53F7\u7684\u80CC\u666F\u8272\uFF0C\u4F8B\u5982\u5199\u5165\u53D8\u91CF\u65F6\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7B26\u53F7\u5728\u8FDB\u884C\u8BFB\u53D6\u8BBF\u95EE\u64CD\u4F5C\u65F6\u7684\u8FB9\u6846\u989C\u8272\uFF0C\u4F8B\u5982\u8BFB\u53D6\u53D8\u91CF\u3002","\u7B26\u53F7\u5728\u8FDB\u884C\u5199\u5165\u8BBF\u95EE\u64CD\u4F5C\u65F6\u7684\u8FB9\u6846\u989C\u8272\uFF0C\u4F8B\u5982\u5199\u5165\u53D8\u91CF\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u7B26\u53F7\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u5199\u6743\u9650\u7B26\u53F7\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u8F6C\u5230\u4E0B\u4E00\u4E2A\u7A81\u51FA\u663E\u793A\u7684\u7B26\u53F7","\u8F6C\u5230\u4E0A\u4E00\u4E2A\u7A81\u51FA\u663E\u793A\u7684\u7B26\u53F7","\u89E6\u53D1\u7B26\u53F7\u9AD8\u4EAE"],"vs/editor/contrib/wordOperations/wordOperations":["\u5220\u9664 Word"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["\u9ED8\u8BA4\u8BED\u8A00\u914D\u7F6E\u66FF\u4EE3","\u9488\u5BF9\u67D0\u79CD\u8BED\u8A00\uFF0C\u914D\u7F6E\u66FF\u4EE3\u7F16\u8F91\u5668\u8BBE\u7F6E\u3002","\u6B64\u8BBE\u7F6E\u4E0D\u652F\u6301\u6309\u8BED\u8A00\u914D\u7F6E\u3002","\u65E0\u6CD5\u6CE8\u518C\u7A7A\u5C5E\u6027",'\u65E0\u6CD5\u6CE8\u518C\u201C{0}\u201D\u3002\u5176\u7B26\u5408\u63CF\u8FF0\u7279\u5B9A\u8BED\u8A00\u7F16\u8F91\u5668\u8BBE\u7F6E\u7684\u8868\u8FBE\u5F0F "\\\\[.*\\\\]$"\u3002\u8BF7\u4F7F\u7528 "configurationDefaults"\u3002',"\u65E0\u6CD5\u6CE8\u518C\u201C{0}\u201D\u3002\u6B64\u5C5E\u6027\u5DF2\u6CE8\u518C\u3002"],"vs/platform/contextkey/browser/contextKeyService":["A command that returns information about context keys"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["({0})\u5DF2\u6309\u4E0B\u3002\u6B63\u5728\u7B49\u5F85\u6309\u4E0B\u7B2C\u4E8C\u4E2A\u952E...","\u7EC4\u5408\u952E({0}\uFF0C{1})\u4E0D\u662F\u547D\u4EE4\u3002"],"vs/platform/list/browser/listService":["\u5DE5\u4F5C\u53F0","\u6620\u5C04\u4E3A `Ctrl` (Windows \u548C Linux) \u6216 `Command` (macOS)\u3002","\u6620\u5C04\u4E3A `Alt` (Windows \u548C Linux) \u6216 `Option` (macOS)\u3002","\u5728\u901A\u8FC7\u9F20\u6807\u591A\u9009\u6811\u548C\u5217\u8868\u6761\u76EE\u65F6\u4F7F\u7528\u7684\u4FEE\u6539\u952E (\u4F8B\u5982\u201C\u8D44\u6E90\u7BA1\u7406\u5668\u201D\u3001\u201C\u6253\u5F00\u7684\u7F16\u8F91\u5668\u201D\u548C\u201C\u6E90\u4EE3\u7801\u7BA1\u7406\u201D\u89C6\u56FE)\u3002\u201C\u5728\u4FA7\u8FB9\u6253\u5F00\u201D\u529F\u80FD\u6240\u9700\u7684\u9F20\u6807\u52A8\u4F5C (\u82E5\u53EF\u7528) \u5C06\u4F1A\u76F8\u5E94\u8C03\u6574\uFF0C\u4E0D\u4E0E\u591A\u9009\u4FEE\u6539\u952E\u51B2\u7A81\u3002","\u63A7\u5236\u5728\u6811\u548C\u5217\u8868\u4E2D\u600E\u6837\u4F7F\u7528\u9F20\u6807\u6765\u5C55\u5F00\u5B50\u9879(\u82E5\u652F\u6301)\u3002\u5BF9\u4E8E\u6811\u4E2D\u7684\u7236\u8282\u70B9\uFF0C\u6B64\u8BBE\u7F6E\u5C06\u63A7\u5236\u662F\u4F7F\u7528\u5355\u51FB\u8FD8\u662F\u53CC\u51FB\u6765\u5C55\u5F00\u3002\u6CE8\u610F\uFF0C\u67D0\u4E9B\u4E0D\u9002\u7528\u4E8E\u6B64\u8BBE\u7F6E\u7684\u6811\u6216\u5217\u8868\u53EF\u80FD\u4F1A\u5FFD\u7565\u6B64\u9879\u3002 ","\u63A7\u5236\u5217\u8868\u548C\u6811\u662F\u5426\u652F\u6301\u5DE5\u4F5C\u53F0\u4E2D\u7684\u6C34\u5E73\u6EDA\u52A8\u3002\u8B66\u544A: \u6253\u5F00\u6B64\u8BBE\u7F6E\u5F71\u54CD\u4F1A\u5F71\u54CD\u6027\u80FD\u3002","\u63A7\u5236\u6811\u7F29\u8FDB(\u4EE5\u50CF\u7D20\u4E3A\u5355\u4F4D)\u3002","\u63A7\u5236\u6811\u662F\u5426\u5E94\u5448\u73B0\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u63A7\u5236\u5217\u8868\u548C\u6811\u662F\u5426\u5177\u6709\u5E73\u6ED1\u6EDA\u52A8\u3002","\u7B80\u5355\u952E\u76D8\u5BFC\u822A\u805A\u7126\u4E0E\u952E\u76D8\u8F93\u5165\u76F8\u5339\u914D\u7684\u5143\u7D20\u3002\u4EC5\u5BF9\u524D\u7F00\u8FDB\u884C\u5339\u914D\u3002","\u9AD8\u4EAE\u952E\u76D8\u5BFC\u822A\u4F1A\u7A81\u51FA\u663E\u793A\u4E0E\u952E\u76D8\u8F93\u5165\u76F8\u5339\u914D\u7684\u5143\u7D20\u3002\u8FDB\u4E00\u6B65\u5411\u4E0A\u548C\u5411\u4E0B\u5BFC\u822A\u5C06\u4EC5\u904D\u5386\u7A81\u51FA\u663E\u793A\u7684\u5143\u7D20\u3002","\u7B5B\u9009\u5668\u952E\u76D8\u5BFC\u822A\u5C06\u7B5B\u9009\u51FA\u5E76\u9690\u85CF\u4E0E\u952E\u76D8\u8F93\u5165\u4E0D\u5339\u914D\u7684\u6240\u6709\u5143\u7D20\u3002","\u63A7\u5236\u5DE5\u4F5C\u53F0\u4E2D\u7684\u5217\u8868\u548C\u6811\u7684\u952E\u76D8\u5BFC\u822A\u6837\u5F0F\u3002\u5B83\u53EF\u4E3A\u201C\u7B80\u5355\u201D\u3001\u201C\u7A81\u51FA\u663E\u793A\u201D\u6216\u201C\u7B5B\u9009\u201D\u3002","\u63A7\u5236\u5217\u8868\u548C\u6811\u4E2D\u7684\u952E\u76D8\u5BFC\u822A\u662F\u5426\u4EC5\u901A\u8FC7\u952E\u5165\u81EA\u52A8\u89E6\u53D1\u3002\u5982\u679C\u8BBE\u7F6E\u4E3A `false` \uFF0C\u952E\u76D8\u5BFC\u822A\u53EA\u5728\u6267\u884C `list.toggleKeyboardNavigation` \u547D\u4EE4\u65F6\u89E6\u53D1\uFF0C\u60A8\u53EF\u4EE5\u4E3A\u8BE5\u547D\u4EE4\u6307\u5B9A\u952E\u76D8\u5FEB\u6377\u65B9\u5F0F\u3002","\u63A7\u5236\u5355\u51FB\u6587\u4EF6\u5939\u540D\u79F0\u65F6\u5982\u4F55\u5C55\u5F00\u6811\u6587\u4EF6\u5939\u3002"],"vs/platform/markers/common/markers":["\u9519\u8BEF","\u8B66\u544A","\u4FE1\u606F"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\u6700\u8FD1\u4F7F\u7528","\u5176\u4ED6\u547D\u4EE4",'\u547D\u4EE4"{0}"\u5BFC\u81F4\u9519\u8BEF ({1})'],"vs/platform/quickinput/browser/helpQuickAccess":["\u5168\u5C40\u547D\u4EE4","\u7F16\u8F91\u5668\u547D\u4EE4","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\u6574\u4F53\u524D\u666F\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u9519\u8BEF\u4FE1\u606F\u7684\u6574\u4F53\u524D\u666F\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u5DE5\u4F5C\u53F0\u4E2D\u56FE\u6807\u7684\u9ED8\u8BA4\u989C\u8272\u3002","\u7126\u70B9\u5143\u7D20\u7684\u6574\u4F53\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u5176\u4ED6\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u5728\u5143\u7D20\u5468\u56F4\u989D\u5916\u7684\u4E00\u5C42\u8FB9\u6846\uFF0C\u7528\u6765\u63D0\u9AD8\u5BF9\u6BD4\u5EA6\u4ECE\u800C\u533A\u522B\u5176\u4ED6\u5143\u7D20\u3002","\u5728\u6D3B\u52A8\u5143\u7D20\u5468\u56F4\u989D\u5916\u7684\u4E00\u5C42\u8FB9\u6846\uFF0C\u7528\u6765\u63D0\u9AD8\u5BF9\u6BD4\u5EA6\u4ECE\u800C\u533A\u522B\u5176\u4ED6\u5143\u7D20\u3002","\u6587\u672C\u4E2D\u94FE\u63A5\u7684\u524D\u666F\u8272\u3002","\u6587\u672C\u4E2D\u4EE3\u7801\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5185\u5C0F\u7EC4\u4EF6(\u5982\u67E5\u627E/\u66FF\u6362)\u7684\u9634\u5F71\u989C\u8272\u3002","\u8F93\u5165\u6846\u80CC\u666F\u8272\u3002","\u8F93\u5165\u6846\u524D\u666F\u8272\u3002","\u8F93\u5165\u6846\u8FB9\u6846\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u5DF2\u6FC0\u6D3B\u9009\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u6FC0\u6D3B\u9009\u9879\u7684\u80CC\u666F\u989C\u8272\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u5DF2\u6FC0\u6D3B\u7684\u9009\u9879\u7684\u524D\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u4FE1\u606F\u7EA7\u522B\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u4FE1\u606F\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u4FE1\u606F\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u8B66\u544A\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u8B66\u544A\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u8B66\u544A\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u9519\u8BEF\u7EA7\u522B\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u9519\u8BEF\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u9519\u8BEF\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u4E0B\u62C9\u5217\u8868\u80CC\u666F\u8272\u3002","\u4E0B\u62C9\u5217\u8868\u524D\u666F\u8272\u3002","\u6309\u94AE\u524D\u666F\u8272\u3002","\u6309\u94AE\u80CC\u666F\u8272\u3002","\u6309\u94AE\u5728\u60AC\u505C\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002","Badge \u80CC\u666F\u8272\u3002Badge \u662F\u5C0F\u578B\u7684\u4FE1\u606F\u6807\u7B7E\uFF0C\u5982\u8868\u793A\u641C\u7D22\u7ED3\u679C\u6570\u91CF\u7684\u6807\u7B7E\u3002","Badge \u524D\u666F\u8272\u3002Badge \u662F\u5C0F\u578B\u7684\u4FE1\u606F\u6807\u7B7E\uFF0C\u5982\u8868\u793A\u641C\u7D22\u7ED3\u679C\u6570\u91CF\u7684\u6807\u7B7E\u3002","\u8868\u793A\u89C6\u56FE\u88AB\u6EDA\u52A8\u7684\u6EDA\u52A8\u6761\u9634\u5F71\u3002","\u6EDA\u52A8\u6761\u6ED1\u5757\u80CC\u666F\u8272","\u6EDA\u52A8\u6761\u6ED1\u5757\u5728\u60AC\u505C\u65F6\u7684\u80CC\u666F\u8272","\u6EDA\u52A8\u6761\u6ED1\u5757\u5728\u88AB\u70B9\u51FB\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8868\u793A\u957F\u65F6\u95F4\u64CD\u4F5C\u7684\u8FDB\u5EA6\u6761\u7684\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u6846\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u6846\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u6846\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u63D0\u793A\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u63D0\u793A\u6846\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u9ED8\u8BA4\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u7EC4\u4EF6(\u5982\u67E5\u627E/\u66FF\u6362)\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u7684\u524D\u666F\u8272\uFF0C\u5982\u67E5\u627E/\u66FF\u6362\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u7684\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u5C0F\u90E8\u4EF6\u6709\u8FB9\u6846\u4E14\u4E0D\u88AB\u5C0F\u90E8\u4EF6\u91CD\u5199\u65F6\u9002\u7528\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u5927\u5C0F\u8C03\u6574\u6761\u7684\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u5C0F\u90E8\u4EF6\u6709\u8C03\u6574\u8FB9\u6846\u4E14\u4E0D\u88AB\u5C0F\u90E8\u4EF6\u989C\u8272\u8986\u76D6\u65F6\u4F7F\u7528\u3002","\u80CC\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u9009\u53D6\u5668(\u5982\u547D\u4EE4\u8C03\u8272\u677F)\u7684\u5BB9\u5668\u3002","\u524D\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u547D\u4EE4\u8C03\u8272\u677F\u7B49\u9009\u53D6\u5668\u7684\u5BB9\u5668\u3002","\u6807\u9898\u80CC\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u547D\u4EE4\u8C03\u8272\u677F\u7B49\u9009\u53D6\u5668\u7684\u5BB9\u5668\u3002","Quick picker background color for the focused item.","\u5FEB\u901F\u9009\u53D6\u5668\u5206\u7EC4\u6807\u7B7E\u7684\u989C\u8272\u3002","\u5FEB\u901F\u9009\u53D6\u5668\u5206\u7EC4\u8FB9\u6846\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6240\u9009\u5185\u5BB9\u7684\u989C\u8272\u3002","\u7528\u4EE5\u5F70\u663E\u9AD8\u5BF9\u6BD4\u5EA6\u7684\u6240\u9009\u6587\u672C\u7684\u989C\u8272\u3002","\u975E\u6D3B\u52A8\u7F16\u8F91\u5668\u4E2D\u6240\u9009\u5185\u5BB9\u7684\u989C\u8272\uFF0C\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u88C5\u9970\u6548\u679C\u3002","\u5177\u6709\u4E0E\u6240\u9009\u9879\u76F8\u5173\u5185\u5BB9\u7684\u533A\u57DF\u7684\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u4E0E\u6240\u9009\u9879\u5185\u5BB9\u76F8\u540C\u7684\u533A\u57DF\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5F53\u524D\u641C\u7D22\u5339\u914D\u9879\u7684\u989C\u8272\u3002","\u5176\u4ED6\u641C\u7D22\u5339\u914D\u9879\u7684\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u9650\u5236\u641C\u7D22\u8303\u56F4\u7684\u989C\u8272\u3002\u989C\u8272\u4E0D\u80FD\u4E0D\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u5F53\u524D\u641C\u7D22\u5339\u914D\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5176\u4ED6\u641C\u7D22\u5339\u914D\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u9650\u5236\u641C\u7D22\u7684\u8303\u56F4\u7684\u8FB9\u6846\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5728\u4E0B\u9762\u7A81\u51FA\u663E\u793A\u60AC\u505C\u7684\u5B57\u8BCD\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u63D0\u793A\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u7684\u524D\u666F\u989C\u8272\u3002","\u5149\u6807\u60AC\u505C\u65F6\u7F16\u8F91\u5668\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u72B6\u6001\u680F\u7684\u80CC\u666F\u8272\u3002","\u6D3B\u52A8\u94FE\u63A5\u989C\u8272\u3002","\u5185\u8054\u63D0\u793A\u7684\u524D\u666F\u8272","\u5185\u8054\u63D0\u793A\u7684\u80CC\u666F\u8272","\u7528\u4E8E\u706F\u6CE1\u64CD\u4F5C\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u706F\u6CE1\u81EA\u52A8\u4FEE\u590D\u64CD\u4F5C\u56FE\u6807\u7684\u989C\u8272\u3002","\u5DF2\u63D2\u5165\u7684\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5DF2\u5220\u9664\u7684\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u63D2\u5165\u7684\u6587\u672C\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u88AB\u5220\u9664\u6587\u672C\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u4E24\u4E2A\u6587\u672C\u7F16\u8F91\u5668\u4E4B\u95F4\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u5BF9\u89D2\u7EBF\u586B\u5145\u989C\u8272\u3002\u5BF9\u89D2\u7EBF\u586B\u5145\u7528\u4E8E\u5E76\u6392\u5DEE\u5F02\u89C6\u56FE\u3002","\u7126\u70B9\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u7126\u70B9\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u975E\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u975E\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u975E\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u63A7\u4EF6\u4E2D\u7126\u70B9\u9879\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","\u4F7F\u7528\u9F20\u6807\u79FB\u52A8\u9879\u76EE\u65F6\uFF0C\u5217\u8868\u6216\u6811\u7684\u80CC\u666F\u989C\u8272\u3002","\u9F20\u6807\u5728\u9879\u76EE\u4E0A\u60AC\u505C\u65F6\uFF0C\u5217\u8868\u6216\u6811\u7684\u524D\u666F\u989C\u8272\u3002","\u4F7F\u7528\u9F20\u6807\u79FB\u52A8\u9879\u76EE\u65F6\uFF0C\u5217\u8868\u6216\u6811\u8FDB\u884C\u62D6\u653E\u7684\u80CC\u666F\u989C\u8272\u3002","\u5728\u5217\u8868\u6216\u6811\u4E2D\u641C\u7D22\u65F6\uFF0C\u5176\u4E2D\u5339\u914D\u5185\u5BB9\u7684\u9AD8\u4EAE\u989C\u8272\u3002","\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u80CC\u666F\u8272\u3002","\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u5F53\u6CA1\u6709\u5339\u914D\u9879\u65F6\uFF0C\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u6811\u63CF\u8FB9\u989C\u8272\u3002","\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u6811\u63CF\u8FB9\u989C\u8272\u3002","\u83DC\u5355\u7684\u8FB9\u6846\u989C\u8272\u3002","\u83DC\u5355\u9879\u7684\u524D\u666F\u989C\u8272\u3002","\u83DC\u5355\u9879\u7684\u80CC\u666F\u989C\u8272\u3002","\u83DC\u5355\u4E2D\u9009\u5B9A\u83DC\u5355\u9879\u7684\u524D\u666F\u8272\u3002","\u83DC\u5355\u4E2D\u6240\u9009\u83DC\u5355\u9879\u7684\u80CC\u666F\u8272\u3002","\u83DC\u5355\u4E2D\u6240\u9009\u83DC\u5355\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u83DC\u5355\u4E2D\u5206\u9694\u7EBF\u7684\u989C\u8272\u3002","\u4EE3\u7801\u7247\u6BB5 Tab \u4F4D\u7684\u9AD8\u4EAE\u80CC\u666F\u8272\u3002","\u4EE3\u7801\u7247\u6BB5 Tab \u4F4D\u7684\u9AD8\u4EAE\u8FB9\u6846\u989C\u8272\u3002","\u4EE3\u7801\u7247\u6BB5\u4E2D\u6700\u540E\u7684 Tab \u4F4D\u7684\u9AD8\u4EAE\u80CC\u666F\u8272\u3002","\u4EE3\u7801\u7247\u6BB5\u4E2D\u6700\u540E\u7684\u5236\u8868\u4F4D\u7684\u9AD8\u4EAE\u8FB9\u6846\u989C\u8272\u3002","\u7528\u4E8E\u67E5\u627E\u5339\u914D\u9879\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u6240\u9009\u5185\u5BB9\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u67E5\u627E\u5339\u914D\u9879\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u7F16\u8F91\u5668\u9009\u533A\u5728\u8FF7\u4F60\u5730\u56FE\u4E2D\u5BF9\u5E94\u7684\u6807\u8BB0\u989C\u8272\u3002","\u7528\u4E8E\u9519\u8BEF\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u7528\u4E8E\u8B66\u544A\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u8FF7\u4F60\u5730\u56FE\u80CC\u666F\u989C\u8272\u3002","\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u80CC\u666F\u989C\u8272\u3002","\u60AC\u505C\u65F6\uFF0C\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u5355\u51FB\u65F6\uFF0C\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u9519\u8BEF\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u8B66\u544A\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u4FE1\u606F\u56FE\u6807\u7684\u989C\u8272\u3002"],"vs/platform/theme/common/iconRegistry":["\u8981\u4F7F\u7528\u7684\u5B57\u4F53\u7684 ID\u3002\u5982\u679C\u672A\u8BBE\u7F6E\uFF0C\u5219\u4F7F\u7528\u6700\u5148\u5B9A\u4E49\u7684\u5B57\u4F53\u3002","\u4E0E\u56FE\u6807\u5B9A\u4E49\u5173\u8054\u7684\u5B57\u4F53\u5B57\u7B26\u3002","\u5C0F\u7EC4\u4EF6\u4E2D\u201C\u5173\u95ED\u201D\u64CD\u4F5C\u7684\u56FE\u6807\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u4EE5\u4E0B\u6587\u4EF6\u5DF2\u5173\u95ED\u5E76\u4E14\u5DF2\u5728\u78C1\u76D8\u4E0A\u4FEE\u6539: {0}\u3002","\u4EE5\u4E0B\u6587\u4EF6\u5DF2\u4EE5\u4E0D\u517C\u5BB9\u7684\u65B9\u5F0F\u4FEE\u6539: {0}\u3002","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u64A4\u6D88\u6240\u6709\u6587\u4EF6\u7684\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u66F4\u6539 {1}","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A {1} \u4E0A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u540C\u65F6\u53D1\u751F\u4E86\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C","\u662F\u5426\u8981\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D?","\u5728 {0} \u4E2A\u6587\u4EF6\u4E2D\u64A4\u6D88","\u64A4\u6D88\u6B64\u6587\u4EF6","\u53D6\u6D88","\u65E0\u6CD5\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C\u3002","\u662F\u5426\u8981\u64A4\u6D88\u201C{0}\u201D?","\u64A4\u6D88","\u53D6\u6D88","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u91CD\u505A\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u91CD\u505A\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5BF9\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u66F4\u6539 {1}","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A {1} \u4E0A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u540C\u65F6\u53D1\u751F\u4E86\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C","\u65E0\u6CD5\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C\u3002"]}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js new file mode 100644 index 0000000000..e3349d63c1 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.zh-tw",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u8F38\u5165"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\u5927\u5C0F\u5BEB\u9808\u76F8\u7B26","\u5168\u5B57\u62FC\u5BEB\u9808\u76F8\u7B26","\u4F7F\u7528\u898F\u5247\u904B\u7B97\u5F0F"],"vs/base/browser/ui/findinput/replaceInput":["\u8F38\u5165","\u4FDD\u7559\u6848\u4F8B"],"vs/base/browser/ui/iconLabel/iconLabel":["\u6B63\u5728\u8F09\u5165..."],"vs/base/browser/ui/inputbox/inputBox":["\u932F\u8AA4: {0}","\u8B66\u544A: {0}","\u8CC7\u8A0A: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u672A\u7E6B\u7D50"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["\u6E05\u9664","\u5728\u985E\u578B\u4E0A\u505C\u7528\u7BE9\u9078","\u5728\u985E\u578B\u4E0A\u555F\u7528\u7BE9\u9078","\u627E\u4E0D\u5230\u4EFB\u4F55\u5143\u7D20","{1} \u9805\u5143\u7D20\u4E2D\u6709 {0} \u9805\u76F8\u7B26"],"vs/base/common/actions":["(\u7A7A\u7684)"],"vs/base/common/errorMessage":["{0}: {1}","\u767C\u751F\u7CFB\u7D71\u932F\u8AA4 ({0})","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002","{0} (\u7E3D\u8A08 {1} \u500B\u932F\u8AA4)","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","\u8D85\u7D1A\u9375","Control","Shift","Alt","\u547D\u4EE4","Control","Shift","Alt","Windows","Control","Shift","Alt","\u8D85\u7D1A\u9375"],"vs/base/parts/quickinput/browser/quickInput":["\u4E0A\u4E00\u9801","{0}/{1}","\u8F38\u5165\u4EE5\u7E2E\u5C0F\u7D50\u679C\u7BC4\u570D\u3002","{0} \u500B\u7D50\u679C","\u5DF2\u9078\u64C7 {0}","\u78BA\u5B9A","\u81EA\u8A02","\u80CC\u9762 ({0})","\u4E0A\u4E00\u9801"],"vs/base/parts/quickinput/browser/quickInputList":["\u5FEB\u901F\u8F38\u5165"],"vs/editor/browser/controller/coreCommands":["\u5373\u4F7F\u884C\u7684\u9577\u5EA6\u904E\u9577\uFF0C\u4ECD\u8981\u5805\u6301\u81F3\u7D50\u5C3E","\u5373\u4F7F\u884C\u7684\u9577\u5EA6\u904E\u9577\uFF0C\u4ECD\u8981\u5805\u6301\u81F3\u7D50\u5C3E"],"vs/editor/browser/controller/textAreaHandler":["\u7DE8\u8F2F\u5668","\u76EE\u524D\u7121\u6CD5\u5B58\u53D6\u6B64\u7DE8\u8F2F\u5668\u3002\u8ACB\u6309 {0} \u53D6\u5F97\u9078\u9805\u3002"],"vs/editor/browser/core/keybindingCancellation":["\u7DE8\u8F2F\u5668\u662F\u5426\u57F7\u884C\u53EF\u53D6\u6D88\u7684\u4F5C\u696D\uFF0C\u4F8B\u5982\u300C\u9810\u89BD\u53C3\u8003\u300D"],"vs/editor/browser/editorExtensions":["\u5FA9\u539F(&&U)","\u5FA9\u539F","\u53D6\u6D88\u5FA9\u539F(&&R)","\u91CD\u505A","\u5168\u9078(&&S)","\u5168\u9078"],"vs/editor/browser/widget/codeEditorWidget":["\u6E38\u6A19\u6578\u5DF2\u9650\u5236\u70BA {0} \u500B\u3002"],"vs/editor/browser/widget/diffEditorWidget":["Diff \u7DE8\u8F2F\u5668\u4E2D\u7528\u65BC\u63D2\u5165\u7684\u7DDA\u689D\u88DD\u98FE\u3002","Diff \u7DE8\u8F2F\u5668\u4E2D\u7528\u65BC\u79FB\u9664\u7684\u7DDA\u689D\u88DD\u98FE\u3002","\u56E0\u5176\u4E2D\u4E00\u500B\u6A94\u6848\u904E\u5927\u800C\u7121\u6CD5\u6BD4\u8F03\u3002"],"vs/editor/browser/widget/diffReview":["Diff \u6AA2\u95B1\u4E2D [\u63D2\u5165] \u7684\u5716\u793A\u3002","Diff \u6AA2\u95B1\u4E2D [\u79FB\u9664] \u7684\u5716\u793A\u3002","Diff \u6AA2\u95B1\u4E2D [\u95DC\u9589] \u7684\u5716\u793A\u3002","\u95DC\u9589","\u672A\u8B8A\u66F4\u4EFB\u4E00\u884C","\u5DF2\u8B8A\u66F4 1 \u884C","\u5DF2\u8B8A\u66F4 {0} \u884C","{1} \u9805\u5DEE\u7570\u4E2D\u7684\u7B2C {0} \u9805: \u539F\u59CB\u884C {2}\u3001{3}\uFF0C\u4FEE\u6539\u884C {4}\u3001{5}","\u7A7A\u767D","{0} \u672A\u8B8A\u66F4\u884C {1}","{0} \u539F\u59CB\u884C {1} \u4FEE\u6539\u7684\u884C {2}","+ {0} \u4FEE\u6539\u884C {1}","- {0} \u539F\u59CB\u884C {1}","\u79FB\u81F3\u4E0B\u4E00\u500B\u5DEE\u7570","\u79FB\u81F3\u4E0A\u4E00\u500B\u5DEE\u7570"],"vs/editor/browser/widget/inlineDiffMargin":["\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C","\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C","\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C \uFF08{0}\uFF09","\u9084\u539F\u6B64\u8B8A\u66F4","\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C \uFF08{0}\uFF09"],"vs/editor/common/config/commonEditorConfig":["\u7DE8\u8F2F\u5668","\u8207 Tab \u76F8\u7B49\u7684\u7A7A\u683C\u6578\u91CF\u3002\u7576 `#editor.detectIndentation#` \u5DF2\u958B\u555F\u6642\uFF0C\u6703\u6839\u64DA\u6A94\u6848\u5167\u5BB9\u8986\u5BEB\u6B64\u8A2D\u5B9A\u3002","\u5728\u6309 `Tab` \u6642\u63D2\u5165\u7A7A\u683C\u3002\u7576 `#editor.detectIndentation#` \u958B\u555F\u6642\uFF0C\u6703\u6839\u64DA\u6A94\u6848\u5167\u5BB9\u8986\u5BEB\u6B64\u8A2D\u5B9A\u3002","\u6839\u64DA\u6A94\u6848\u5167\u5BB9\uFF0C\u63A7\u5236\u7576\u6A94\u6848\u958B\u555F\u6642\uFF0C\u662F\u5426\u81EA\u52D5\u5075\u6E2C `#editor.tabSize#` \u548C `#editor.insertSpaces#`\u3002","\u79FB\u9664\u5C3E\u7AEF\u81EA\u52D5\u63D2\u5165\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u91DD\u5C0D\u5927\u578B\u6A94\u6848\u505C\u7528\u90E8\u5206\u9AD8\u8A18\u61B6\u9AD4\u9700\u6C42\u529F\u80FD\u7684\u7279\u6B8A\u8655\u7406\u65B9\u5F0F\u3002","\u63A7\u5236\u662F\u5426\u61C9\u6839\u64DA\u6587\u4EF6\u4E2D\u7684\u55AE\u5B57\u8A08\u7B97\u81EA\u52D5\u5B8C\u6210\u3002","\u50C5\u5EFA\u8B70\u4F86\u81EA\u4F7F\u7528\u4E2D\u6587\u4EF6\u4E2D\u7684\u5B57\u7D44\u3002","\u5EFA\u8B70\u4F86\u81EA\u6240\u6709\u5DF2\u958B\u555F\u6587\u4EF6\u4E2D\uFF0C\u8A9E\u8A00\u76F8\u540C\u7684\u5B57\u7D44\u3002","\u5EFA\u8B70\u4F86\u81EA\u6240\u6709\u5DF2\u958B\u555F\u6587\u4EF6\u4E2D\u7684\u5B57\u7D44\u3002","\u63A7\u5236\u8981\u5F9E\u54EA\u4E9B\u6587\u4EF6\u8A08\u7B97\u4EE5\u5B57\u7D44\u70BA\u57FA\u790E\u7684\u5B8C\u6210\u4F5C\u696D\u3002","\u6240\u6709\u5F69\u8272\u4E3B\u984C\u7686\u5DF2\u555F\u7528\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u3002","\u6240\u6709\u5F69\u8272\u4E3B\u984C\u7686\u5DF2\u505C\u7528\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u3002","\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u7531\u76EE\u524D\u4E4B\u5F69\u8272\u4F48\u666F\u4E3B\u984C\u7684 'semanticHighlighting' \u8A2D\u5B9A\u6240\u8A2D\u5B9A\u3002","\u63A7\u5236 semanticHighlighting \u662F\u5426\u6703\u70BA\u652F\u63F4\u7684\u8A9E\u8A00\u986F\u793A\u3002","\u5373\u4F7F\u6309\u5169\u4E0B\u5167\u5BB9\u6216\u6309 `Escape`\uFF0C\u4ECD\u4FDD\u6301\u7784\u5B54\u7DE8\u8F2F\u5668\u958B\u555F\u3002","\u56E0\u6548\u80FD\u7684\u7DE3\u6545\uFF0C\u4E0D\u6703\u5C07\u8D85\u904E\u6B64\u9AD8\u5EA6\u7684\u884C Token \u5316","\u53D6\u6D88 Diff \u8A08\u7B97\u524D\u7684\u903E\u6642\u9650\u5236 (\u6BEB\u79D2)\u3002\u82E5\u7121\u903E\u6642\uFF0C\u8ACB\u4F7F\u7528 0\u3002","\u63A7\u5236 Diff \u7DE8\u8F2F\u5668\u8981\u4E26\u6392\u6216\u5167\u5D4C\u986F\u793A Diff\u3002","\u555F\u7528\u6642\uFF0CDiff \u7DE8\u8F2F\u5668\u6703\u5FFD\u7565\u524D\u7F6E\u6216\u5F8C\u7F6E\u7A7A\u683C\u7684\u8B8A\u66F4\u3002","\u63A7\u5236 Diff \u7DE8\u8F2F\u5668\u662F\u5426\u8981\u70BA\u65B0\u589E/\u79FB\u9664\u7684\u8B8A\u66F4\u986F\u793A +/- \u6A19\u8A18\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u986F\u793A codelens\u3002","\u4E00\u5F8B\u4E0D\u63DB\u884C\u3002","\u4F9D\u6AA2\u8996\u5340\u5BEC\u5EA6\u63DB\u884C\u3002","\u5C07\u4F9D\u64DA `#editor.wordWrap#` \u8A2D\u5B9A\u81EA\u52D5\u63DB\u884C\u3002"],"vs/editor/common/config/editorOptions":["\u7DE8\u8F2F\u5668\u5C07\u4F7F\u7528\u5E73\u53F0 API \u4EE5\u5075\u6E2C\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u9644\u52A0\u3002","\u7DE8\u8F2F\u5668\u5C07\u4E00\u5F8B\u6700\u4F73\u5316\u4EE5\u7528\u65BC\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u3002\u81EA\u52D5\u63DB\u884C\u5C07\u6703\u505C\u7528\u3002","\u7DE8\u8F2F\u5668\u4E0D\u6703\u70BA\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u7684\u4F7F\u7528\u65B9\u5F0F\u9032\u884C\u6700\u4F73\u5316\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u65BC\u5DF2\u70BA\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u6700\u4F73\u5316\u7684\u6A21\u5F0F\u4E2D\u57F7\u884C\u3002\u8A2D\u5B9A\u70BA\u958B\u555F\u6703\u505C\u7528\u81EA\u52D5\u63DB\u884C\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u8A3B\u89E3\u6642\u63D2\u5165\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u662F\u5426\u61C9\u4EE5\u884C\u8A3B\u89E3\u7684\u5207\u63DB\u3001\u65B0\u589E\u6216\u79FB\u9664\u52D5\u4F5C\uFF0C\u5FFD\u7565\u7A7A\u767D\u7684\u884C\u3002","\u63A7\u5236\u8907\u88FD\u6642\u4E0D\u9078\u53D6\u4EFB\u4F55\u9805\u76EE\u662F\u5426\u6703\u8907\u88FD\u76EE\u524D\u7A0B\u5F0F\u884C\u3002","\u63A7\u5236\u5728\u8F38\u5165\u671F\u9593\u662F\u5426\u8981\u8DF3\u904E\u6E38\u6A19\u4F86\u5C0B\u627E\u76F8\u7B26\u7684\u9805\u76EE\u3002","\u63A7\u5236 [\u5C0B\u627E\u5C0F\u5DE5\u5177] \u4E2D\u7684\u641C\u5C0B\u5B57\u4E32\u662F\u5426\u4F86\u81EA\u7DE8\u8F2F\u5668\u9078\u53D6\u9805\u76EE\u3002","\u6C38\u4E0D\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E] (\u9810\u8A2D)","\u4E00\u5F8B\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E]","\u9078\u53D6\u591A\u884C\u5167\u5BB9\u6642\uFF0C\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E]\u3002","\u63A7\u5236\u81EA\u52D5\u958B\u555F\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E\u7684\u689D\u4EF6\u3002","\u63A7\u5236\u5C0B\u627E\u5C0F\u5DE5\u5177\u662F\u5426\u5728 macOS \u4E0A\u8B80\u53D6\u6216\u4FEE\u6539\u5171\u7528\u5C0B\u627E\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u5C0B\u627E\u5C0F\u5DE5\u5177\u662F\u5426\u61C9\u5728\u7DE8\u8F2F\u5668\u9802\u7AEF\u984D\u5916\u65B0\u589E\u884C\u3002\u82E5\u70BA true\uFF0C\u7576\u60A8\u53EF\u770B\u5230\u5C0B\u627E\u5C0F\u5DE5\u5177\u6642\uFF0C\u60A8\u7684\u6372\u52D5\u7BC4\u570D\u6703\u8D85\u904E\u7B2C\u4E00\u884C\u3002","\u7576\u518D\u4E5F\u627E\u4E0D\u5230\u5176\u4ED6\u76F8\u7B26\u9805\u76EE\u6642\uFF0C\u63A7\u5236\u662F\u5426\u81EA\u52D5\u5F9E\u958B\u982D (\u6216\u7D50\u5C3E) \u91CD\u65B0\u958B\u59CB\u641C\u5C0B\u3002","\u555F\u7528/\u505C\u7528\u9023\u5B57\u5B57\u578B ('calt' \u548C 'liga' \u5B57\u578B\u529F\u80FD)\u3002\u5C07\u6B64\u9805\u8B8A\u66F4\u70BA\u5B57\u4E32\uFF0C\u4EE5\u7CBE\u78BA\u63A7\u5236 'font-feature-settings' CSS \u5C6C\u6027\u3002","\u660E\u78BA\u7684 'font-feature-settings' CSS \u5C6C\u6027\u3002\u5982\u679C\u53EA\u9700\u8981\u958B\u555F/\u95DC\u9589\u9023\u5B57\uFF0C\u53EF\u4EE5\u6539\u70BA\u50B3\u905E\u5E03\u6797\u503C\u3002","\u8A2D\u5B9A\u9023\u5B57\u5B57\u578B\u6216\u5B57\u578B\u529F\u80FD\u3002\u53EF\u4EE5\u662F\u5E03\u6797\u503C\u4EE5\u555F\u7528/\u505C\u7528\u9023\u5B57\uFF0C\u6216\u4EE3\u8868 CSS 'font-feature-settings' \u5C6C\u6027\u7684\u5B57\u4E32\u3002","\u63A7\u5236\u5B57\u578B\u5927\u5C0F (\u50CF\u7D20)\u3002","\u53EA\u5141\u8A31\u300C\u4E00\u822C\u300D\u53CA\u300C\u7C97\u9AD4\u300D\u95DC\u9375\u5B57\uFF0C\u6216\u4ECB\u65BC 1 \u5230 1000 \u4E4B\u9593\u7684\u6578\u503C\u3002","\u63A7\u5236\u5B57\u578B\u7C97\u7D30\u3002\u63A5\u53D7\u300C\u4E00\u822C\u300D\u53CA\u300C\u7C97\u9AD4\u300D\u95DC\u9375\u5B57\uFF0C\u6216\u4ECB\u65BC 1 \u5230 1000 \u4E4B\u9593\u7684\u6578\u503C\u3002","\u986F\u793A\u7D50\u679C\u7684\u9810\u89BD\u6AA2\u8996 (\u9810\u8A2D)","\u79FB\u81F3\u4E3B\u8981\u7D50\u679C\u4E26\u986F\u793A\u9810\u89BD\u6AA2\u8996","\u524D\u5F80\u4E3B\u8981\u7D50\u679C\uFF0C\u4E26\u5C0D\u5176\u4ED6\u4EBA\u555F\u7528\u7121\u9810\u89BD\u700F\u89BD","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 'editor.editor.gotoLocation.multipleDefinitions' \u6216 'editor.editor.gotoLocation.multipleImplementations' \u7B49\u55AE\u7368\u8A2D\u5B9A\u3002","\u63A7\u5236 'Go to Definition' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Type Definition' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Declaration' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Implementations' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to References' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u7576 'Go to Definition' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Type Definition' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Declaration' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Implementation' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Reference' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u63A7\u5236\u662F\u5426\u986F\u793A\u66AB\u7559\u3002","\u63A7\u5236\u66AB\u7559\u986F\u793A\u7684\u5EF6\u9072\u6642\u9593 (\u4EE5\u6BEB\u79D2\u70BA\u55AE\u4F4D)\u3002","\u63A7\u5236\u7576\u6ED1\u9F20\u79FB\u904E\u6642\uFF0C\u662F\u5426\u61C9\u4FDD\u6301\u986F\u793A\u66AB\u7559\u3002","\u5728\u7DE8\u8F2F\u5668\u4E2D\u555F\u7528\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u71C8\u6CE1\u3002","\u555F\u7528\u7DE8\u8F2F\u5668\u4E2D\u7684\u5167\u5D4C\u63D0\u793A\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u7684\u5167\u5D4C\u63D0\u793A\u5B57\u578B\u5927\u5C0F\u3002\u8A2D\u5B9A\u70BA `0` \u6642\uFF0C\u6703\u4F7F\u7528 90% \u7684 `#editor.fontSize#`\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u7684\u5167\u5D4C\u63D0\u793A\u5B57\u578B\u5BB6\u65CF\u3002","\u63A7\u5236\u884C\u9AD8\u3002\u4F7F\u7528 0 \u6703\u5F9E\u5B57\u578B\u5927\u5C0F\u8A08\u7B97\u884C\u9AD8\u3002","\u63A7\u5236\u662F\u5426\u6703\u986F\u793A\u7E2E\u5716","\u7E2E\u5716\u5927\u5C0F\u8207\u7DE8\u8F2F\u5668\u5167\u5BB9\u76F8\u540C (\u4E14\u53EF\u80FD\u6703\u6372\u52D5)\u3002","\u7E2E\u5716\u6703\u8996\u9700\u8981\u4F38\u7E2E\uFF0C\u4EE5\u586B\u6EFF\u8A72\u7DE8\u8F2F\u5668\u7684\u9AD8\u5EA6 (\u7121\u6372\u52D5)\u3002","\u7E2E\u5716\u5C07\u8996\u9700\u8981\u7E2E\u5C0F\uFF0C\u4E00\u5F8B\u4E0D\u6703\u5927\u65BC\u8A72\u7DE8\u8F2F\u5668 (\u7121\u6372\u52D5)\u3002","\u63A7\u5236\u7E2E\u5716\u7684\u5927\u5C0F\u3002","\u63A7\u5236\u8981\u5728\u54EA\u7AEF\u5448\u73FE\u7E2E\u5716\u3002","\u63A7\u5236\u4F55\u6642\u986F\u793A\u8FF7\u4F60\u5730\u5716\u6ED1\u687F\u3002","\u7E2E\u5716\u5167\u6240\u7E6A\u88FD\u7684\u5167\u5BB9\u5927\u5C0F: 1\u30012 \u6216 3\u3002","\u986F\u793A\u884C\u4E2D\u7684\u5BE6\u969B\u5B57\u5143\uFF0C\u800C\u4E0D\u662F\u8272\u5F69\u5340\u584A\u3002","\u9650\u5236\u7E2E\u5716\u7684\u5BEC\u5EA6\uFF0C\u6700\u591A\u986F\u793A\u67D0\u500B\u6578\u76EE\u7684\u5217\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E0A\u908A\u7DE3\u8207\u7B2C\u4E00\u884C\u4E4B\u9593\u7684\u7A7A\u683C\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E0B\u908A\u7DE3\u8207\u6700\u5F8C\u4E00\u884C\u4E4B\u9593\u7684\u7A7A\u683C\u6578\u3002","\u555F\u7528\u5FEB\u986F\uFF0C\u5728\u60A8\u9375\u5165\u7684\u540C\u6642\u986F\u793A\u53C3\u6578\u6587\u4EF6\u548C\u985E\u578B\u8CC7\u8A0A\u3002","\u63A7\u5236\u63D0\u793A\u529F\u80FD\u8868\u662F\u5426\u5728\u6E05\u55AE\u7D50\u5C3E\u6642\u5FAA\u74B0\u6216\u95DC\u9589\u3002","\u5141\u8A31\u5728\u5B57\u4E32\u5167\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u5141\u8A31\u5728\u8A3B\u89E3\u4E2D\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u5141\u8A31\u5728\u5B57\u4E32\u8207\u8A3B\u89E3\u4EE5\u5916\u4E4B\u8655\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u63A7\u5236\u662F\u5426\u61C9\u5728\u9375\u5165\u6642\u81EA\u52D5\u986F\u793A\u5EFA\u8B70\u3002","\u4E0D\u986F\u793A\u884C\u865F\u3002","\u884C\u865F\u4EE5\u7D55\u5C0D\u503C\u986F\u793A\u3002","\u884C\u865F\u4EE5\u76EE\u524D\u6E38\u6A19\u7684\u76F8\u5C0D\u503C\u986F\u793A\u3002","\u6BCF 10 \u884C\u986F\u793A\u884C\u865F\u3002","\u63A7\u5236\u884C\u865F\u7684\u986F\u793A\u3002","\u9019\u500B\u7DE8\u8F2F\u5668\u5C3A\u898F\u6703\u8F49\u8B6F\u7684\u7B49\u5BEC\u5B57\u5143\u6578\u3002","\u6B64\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u8272\u5F69\u3002","\u5728\u67D0\u500B\u6578\u76EE\u7684\u7B49\u5BEC\u5B57\u5143\u4E4B\u5F8C\u986F\u793A\u5782\u76F4\u5C3A\u898F\u3002\u5982\u6709\u591A\u500B\u5C3A\u898F\uFF0C\u5C31\u6703\u4F7F\u7528\u591A\u500B\u503C\u3002\u82E5\u9663\u5217\u7A7A\u767D\uFF0C\u5C31\u4E0D\u6703\u7E6A\u88FD\u4EFB\u4F55\u5C3A\u898F\u3002","\u63D2\u5165\u5EFA\u8B70\u800C\u4E0D\u8986\u5BEB\u6E38\u6A19\u65C1\u7684\u6587\u5B57\u3002","\u63D2\u5165\u5EFA\u8B70\u4E26\u8986\u5BEB\u6E38\u6A19\u65C1\u7684\u6587\u5B57\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u63A5\u53D7\u5B8C\u6210\u6642\u8986\u5BEB\u5B57\u7D44\u3002\u8ACB\u6CE8\u610F\uFF0C\u9019\u53D6\u6C7A\u65BC\u52A0\u5165\u6B64\u529F\u80FD\u7684\u5EF6\u4F38\u6A21\u7D44\u3002","\u63A7\u5236\u5C0D\u65BC\u62DA\u932F\u5B57\u662F\u5426\u9032\u884C\u7BE9\u9078\u548C\u6392\u5E8F\u5176\u5EFA\u8B70","\u63A7\u5236\u6392\u5E8F\u662F\u5426\u6703\u504F\u597D\u6E38\u6A19\u9644\u8FD1\u51FA\u73FE\u7684\u5B57\u7D44\u3002","\u63A7\u5236\u8A18\u9304\u7684\u5EFA\u8B70\u9078\u53D6\u9805\u76EE\u662F\u5426\u5728\u591A\u500B\u5DE5\u4F5C\u5340\u548C\u8996\u7A97\u9593\u5171\u7528 (\u9700\u8981 `#editor.suggestSelection#`)\u3002","\u63A7\u5236\u6B63\u5728\u4F7F\u7528\u7684\u7A0B\u5F0F\u78BC\u7247\u6BB5\u662F\u5426\u6703\u907F\u514D\u5FEB\u901F\u5EFA\u8B70\u3002","\u63A7\u5236\u8981\u5728\u5EFA\u8B70\u4E2D\u986F\u793A\u6216\u96B1\u85CF\u5716\u793A\u3002","\u63A7\u5236\u5EFA\u8B70\u5C0F\u5DE5\u5177\u5E95\u4E0B\u7684\u72C0\u614B\u5217\u53EF\u898B\u5EA6\u3002","\u63A7\u5236\u5EFA\u8B70\u8A73\u7D30\u8CC7\u6599\u662F\u4EE5\u5167\u5D4C\u65BC\u6A19\u7C64\u7684\u65B9\u5F0F\u986F\u793A\uFF0C\u9084\u662F\u53EA\u5728\u8A73\u7D30\u8CC7\u6599\u5C0F\u5DE5\u5177\u4E2D\u986F\u793A","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\u3002\u5EFA\u8B70\u5C0F\u5DE5\u5177\u73FE\u53EF\u8ABF\u6574\u5927\u5C0F\u3002","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 'editor.suggest.showKeywords' \u6216 'editor.suggest.showSnippets' \u7B49\u55AE\u7368\u8A2D\u5B9A\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u65B9\u6CD5\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u51FD\u5F0F\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5EFA\u69CB\u51FD\u5F0F\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6B04\u4F4D\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8B8A\u6578\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u985E\u5225\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u7D50\u69CB\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u4ECB\u9762\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6A21\u7D44\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5C6C\u6027\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u4E8B\u4EF6\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u904B\u7B97\u5B50\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u55AE\u4F4D\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u503C\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5E38\u6578\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5217\u8209\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300CenumMember\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u95DC\u9375\u5B57\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6587\u5B57\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8272\u5F69\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6A94\u6848\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u53C3\u8003\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300Ccustomcolor\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8CC7\u6599\u593E\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300CtypeParameter\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u7A0B\u5F0F\u78BC\u7247\u6BB5\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u4E4B\u5F8C\uFF0CIntelliSense \u6703\u986F\u793A `user`-suggestions\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u6703\u986F\u793A `issues`-suggestions\u3002","\u662F\u5426\u61C9\u4E00\u5F8B\u9078\u53D6\u524D\u7F6E\u548C\u5F8C\u7F6E\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u662F\u5426\u900F\u904E\u8A8D\u53EF\u5B57\u5143\u63A5\u53D7\u5EFA\u8B70\u3002\u4F8B\u5982\u5728 JavaScript \u4E2D\uFF0C\u5206\u865F (';') \u53EF\u4EE5\u662F\u63A5\u53D7\u5EFA\u8B70\u4E26\u9375\u5165\u8A72\u5B57\u5143\u7684\u8A8D\u53EF\u5B57\u5143\u3002","\u5728\u5EFA\u8B70\u9032\u884C\u6587\u5B57\u8B8A\u66F4\u6642\uFF0C\u50C5\u900F\u904E `Enter` \u63A5\u53D7\u5EFA\u8B70\u3002","\u63A7\u5236\u9664\u4E86 'Tab' \u5916\uFF0C\u662F\u5426\u4E5F\u900F\u904E 'Enter' \u63A5\u53D7\u5EFA\u8B70\u3002\u9019\u6709\u52A9\u65BC\u907F\u514D\u6DF7\u6DC6\u8981\u63D2\u5165\u65B0\u884C\u6216\u63A5\u53D7\u5EFA\u8B70\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u53EF\u8B80\u51FA\u7684\u884C\u6578\u3002\u8B66\u544A: \u5927\u65BC\u9810\u8A2D\u7684\u6578\u76EE\u6703\u5C0D\u6548\u80FD\u7522\u751F\u5F71\u97FF\u3002","\u7DE8\u8F2F\u5668\u5167\u5BB9","\u4F7F\u7528\u8A9E\u8A00\u914D\u7F6E\u78BA\u5B9A\u4F55\u6642\u81EA\u52D5\u95DC\u9589\u62EC\u865F\u3002","\u50C5\u7576\u6E38\u6A19\u4F4D\u65BC\u7A7A\u767D\u7684\u5DE6\u5074\u6642\u81EA\u52D5\u95DC\u9589\u62EC\u865F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u65B0\u589E\u5DE6\u62EC\u5F27\u5F8C\uFF0C\u81EA\u52D5\u52A0\u4E0A\u53F3\u62EC\u5F27\u3002","\u50C5\u5728\u81EA\u52D5\u63D2\u5165\u53F3\u5F15\u865F\u6216\u62EC\u865F\u6642\uFF0C\u624D\u5728\u5176\u4E0A\u65B9\u9375\u5165\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u53F3\u5F15\u865F\u6216\u62EC\u865F\u4E0A\u9375\u5165\u3002","\u4F7F\u7528\u8A9E\u8A00\u914D\u7F6E\u78BA\u5B9A\u4F55\u6642\u81EA\u52D5\u95DC\u9589\u5F15\u865F\u3002","\u50C5\u7576\u6E38\u6A19\u4F4D\u65BC\u7A7A\u767D\u7684\u5DE6\u5074\u6642\u81EA\u52D5\u95DC\u9589\u5F15\u865F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u65B0\u589E\u958B\u59CB\u5F15\u865F\u5F8C\uFF0C\u81EA\u52D5\u52A0\u4E0A\u95DC\u9589\u5F15\u865F\u3002","\u7DE8\u8F2F\u5668\u4E0D\u6703\u81EA\u52D5\u63D2\u5165\u7E2E\u6392\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u4E26\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u3002","\u7DE8\u8F2F\u5668\u6703\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3001\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u4E26\u53EB\u7528\u8A9E\u8A00\u5B9A\u7FA9\u7684\u7279\u6B8A onEnterRules\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3001\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u4E26\u53EB\u7528\u8A9E\u8A00\u5B9A\u7FA9\u7684\u7279\u6B8A onEnterRules \u4E26\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684 indentationRules\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u9375\u5165\u3001\u8CBC\u4E0A\u3001\u79FB\u52D5\u6216\u7E2E\u6392\u884C\u6642\u81EA\u52D5\u8ABF\u6574\u7E2E\u6392\u3002","\u4F7F\u7528\u8A9E\u8A00\u7D44\u614B\u4F86\u6C7A\u5B9A\u4F55\u6642\u81EA\u52D5\u74B0\u7E5E\u9078\u53D6\u9805\u76EE\u3002","\u7528\u5F15\u865F\u62EC\u4F4F\uFF0C\u800C\u975E\u4F7F\u7528\u62EC\u5F27\u3002","\u7528\u62EC\u5F27\u62EC\u4F4F\uFF0C\u800C\u975E\u4F7F\u7528\u5F15\u865F\u3002 ","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u9375\u5165\u5F15\u865F\u6216\u62EC\u5F27\u6642\u81EA\u52D5\u5305\u570D\u9078\u53D6\u7BC4\u570D\u3002","\u7576\u4F7F\u7528\u7A7A\u683C\u9032\u884C\u7E2E\u6392\u6642\uFF0C\u6703\u6A21\u64EC\u5B9A\u4F4D\u5B57\u5143\u7684\u9078\u53D6\u884C\u70BA\u3002\u9078\u53D6\u7BC4\u570D\u6703\u4F9D\u5FAA\u5B9A\u4F4D\u505C\u99D0\u9EDE\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u986F\u793A codelens\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u578B\u5BB6\u65CF\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u578B\u5927\u5C0F (\u50CF\u7D20)\u3002\u8A2D\u5B9A\u70BA `0` \u6642\uFF0C\u6703\u4F7F\u7528 90% \u7684 `#editor.fontSize#`\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u8F49\u8B6F\u5167\u5D4C\u8272\u5F69\u88DD\u98FE\u9805\u76EE\u8207\u8272\u5F69\u9078\u64C7\u5668\u3002","\u555F\u7528\u5373\u53EF\u4EE5\u6ED1\u9F20\u8207\u6309\u9375\u9078\u53D6\u9032\u884C\u8CC7\u6599\u884C\u9078\u53D6\u3002","\u63A7\u5236\u8A9E\u6CD5\u9192\u76EE\u63D0\u793A\u662F\u5426\u61C9\u8907\u88FD\u5230\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u8CC7\u6599\u6307\u6A19\u52D5\u756B\u6A23\u5F0F\u3002","\u63A7\u5236\u662F\u5426\u61C9\u555F\u7528\u5E73\u6ED1\u63D2\u5165\u9EDE\u52D5\u756B\u3002 ","\u63A7\u5236\u8CC7\u6599\u6307\u6A19\u6A23\u5F0F\u3002","\u63A7\u5236\u6E38\u6A19\u4E0A\u4E0B\u5468\u570D\u53EF\u986F\u793A\u7684\u6700\u5C11\u884C\u6578\u3002\u5728\u67D0\u4E9B\u7DE8\u8F2F\u5668\u4E2D\u7A31\u70BA 'scrollOff' \u6216 'scrollOffset'\u3002","\u53EA\u6709\u901A\u904E\u9375\u76E4\u6216 API \u89F8\u767C\u6642\uFF0C\u624D\u6703\u65BD\u884C `cursorSurroundingLines`\u3002","\u4E00\u5F8B\u5F37\u5236\u57F7\u884C `cursorSurroundingLines`","\u63A7\u5236\u61C9\u65BD\u884C `cursorSurroundingLines` \u7684\u6642\u6A5F\u3002","\u63A7\u5236\u6E38\u6A19\u5BEC\u5EA6\uFF0C\u7576 `#editor.cursorStyle#` \u8A2D\u5B9A\u70BA `line` \u6642\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u5141\u8A31\u900F\u904E\u62D6\u653E\u4F86\u79FB\u52D5\u9078\u53D6\u9805\u76EE\u3002","\u6309\u4E0B `Alt` \u6642\u7684\u6372\u52D5\u901F\u5EA6\u4E58\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u555F\u7528\u7A0B\u5F0F\u78BC\u647A\u758A\u529F\u80FD\u3002","\u4F7F\u7528\u8A9E\u8A00\u7279\u5B9A\u647A\u758A\u7B56\u7565 (\u5982\u679C\u53EF\u7528)\uFF0C\u5426\u5247\u4F7F\u7528\u7E2E\u6392\u5F0F\u7B56\u7565\u3002","\u4F7F\u7528\u7E2E\u6392\u5F0F\u647A\u758A\u7B56\u7565\u3002","\u63A7\u5236\u8A08\u7B97\u8CC7\u6599\u593E\u7BC4\u570D\u7684\u7B56\u7565\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5C07\u6298\u758A\u7684\u7BC4\u570D\u9192\u76EE\u63D0\u793A\u3002","\u63A7\u5236\u6309\u4E00\u4E0B\u5DF2\u6298\u758A\u884C\u5F8C\u65B9\u7684\u7A7A\u767D\u5167\u5BB9\u662F\u5426\u6703\u5C55\u958B\u884C\u3002","\u63A7\u5236\u5B57\u578B\u5BB6\u65CF\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u81EA\u52D5\u70BA\u8CBC\u4E0A\u7684\u5167\u5BB9\u8A2D\u5B9A\u683C\u5F0F\u3002\u5FC5\u9808\u6709\u53EF\u7528\u7684\u683C\u5F0F\u5668\uFF0C\u800C\u4E14\u683C\u5F0F\u5668\u61C9\u80FD\u5920\u70BA\u6587\u4EF6\u4E2D\u7684\u4E00\u500B\u7BC4\u570D\u8A2D\u5B9A\u683C\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u81EA\u52D5\u5728\u9375\u5165\u5F8C\u8A2D\u5B9A\u884C\u7684\u683C\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u8F49\u8B6F\u5782\u76F4\u5B57\u7B26\u908A\u754C\u3002\u5B57\u7B26\u908A\u754C\u6700\u5E38\u7528\u4F86\u9032\u884C\u5075\u932F\u3002","\u63A7\u5236\u6E38\u6A19\u662F\u5426\u61C9\u96B1\u85CF\u5728\u6982\u89C0\u5C3A\u898F\u4E2D\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u63D0\u793A\u4F7F\u7528\u4E2D\u7684\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u5B57\u6BCD\u9593\u8DDD (\u50CF\u7D20)\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u5DF2\u555F\u7528\u9023\u7D50\u7DE8\u8F2F\u3002\u76F8\u95DC\u7B26\u865F (\u4F8B\u5982 HTML \u6A19\u7C64) \u6703\u6839\u64DA\u8A9E\u8A00\u5728\u7DE8\u8F2F\u6642\u66F4\u65B0\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5075\u6E2C\u9023\u7D50\u4E26\u4F7F\u5176\u53EF\u4F9B\u9EDE\u9078\u3002","\u5C07\u7B26\u5408\u7684\u62EC\u865F\u9192\u76EE\u63D0\u793A\u3002","\u8981\u7528\u65BC\u6ED1\u9F20\u6EFE\u8F2A\u6372\u52D5\u4E8B\u4EF6 `deltaX` \u548C `deltaY` \u7684\u4E58\u6578\u3002","\u4F7F\u7528\u6ED1\u9F20\u6EFE\u8F2A\u4E26\u6309\u4F4F `Ctrl` \u6642\uFF0C\u7E2E\u653E\u7DE8\u8F2F\u5668\u7684\u5B57\u578B","\u5728\u591A\u500B\u6E38\u6A19\u91CD\u758A\u6642\u5C07\u5176\u5408\u4F75\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Control'\u8207\u5C0D\u61C9 macOS \u7684'Command'\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Alt'\u8207\u5C0D\u61C9macOS\u7684'Option'\u3002","\u7528\u65BC\u5728\u6ED1\u9F20\u65B0\u589E\u591A\u500B\u6E38\u6A19\u7684\u4E58\u6578\u3002\u300C\u79FB\u81F3\u5B9A\u7FA9\u300D\u548C\u300C\u958B\u555F\u9023\u7D50\u300D\u6ED1\u9F20\u624B\u52E2\u6703\u52A0\u4EE5\u9069\u61C9\uFF0C\u4EE5\u907F\u514D\u8207\u591A\u500B\u6E38\u6A19\u7684\u4E58\u6578\u76F8\u885D\u7A81\u3002[\u6DF1\u5165\u4E86\u89E3](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier)\u3002","\u6BCF\u500B\u6E38\u6A19\u90FD\u6703\u8CBC\u4E0A\u4E00\u884C\u6587\u5B57\u3002","\u6BCF\u500B\u6E38\u6A19\u90FD\u6703\u8CBC\u4E0A\u5168\u6587\u3002","\u7576\u5DF2\u8CBC\u4E0A\u6587\u5B57\u7684\u884C\u6578\u8207\u6E38\u6A19\u6578\u76F8\u7B26\u6642\u63A7\u5236\u8CBC\u4E0A\u529F\u80FD\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u986F\u793A\u51FA\u73FE\u7684\u8A9E\u610F\u7B26\u865F\u3002","\u63A7\u5236\u662F\u5426\u61C9\u5728\u6982\u89C0\u5C3A\u898F\u5468\u570D\u7E6A\u88FD\u6846\u7DDA\u3002","\u958B\u555F\u9810\u89BD\u6642\u7126\u9EDE\u6A39\u72C0","\u958B\u555F\u6642\u805A\u7126\u7DE8\u8F2F\u5668","\u63A7\u5236\u8981\u805A\u7126\u5167\u5D4C\u7DE8\u8F2F\u5668\u6216\u9810\u89BD\u5C0F\u5DE5\u5177\u4E2D\u7684\u6A39\u7CFB\u3002","\u63A7\u5236\u300C\u524D\u5F80\u5B9A\u7FA9\u300D\u6ED1\u9F20\u624B\u52E2\uFF0C\u662F\u5426\u4E00\u5F8B\u958B\u555F\u7784\u6838\u5C0F\u5DE5\u5177\u3002","\u63A7\u5236\u5728\u5FEB\u901F\u5EFA\u8B70\u986F\u793A\u5F8C\u7684\u5EF6\u9072 (\u4EE5\u6BEB\u79D2\u70BA\u55AE\u4F4D)\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6703\u81EA\u52D5\u4F9D\u985E\u578B\u91CD\u65B0\u547D\u540D\u3002","\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 `editor.linkedEditing`\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u986F\u793A\u63A7\u5236\u5B57\u5143\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u986F\u793A\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u5728\u6A94\u6848\u7D50\u5C3E\u70BA\u65B0\u884C\u6642\uFF0C\u5448\u73FE\u6700\u5F8C\u4E00\u884C\u7684\u865F\u78BC\u3002","\u9192\u76EE\u63D0\u793A\u88DD\u8A02\u908A\u548C\u76EE\u524D\u7684\u884C\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u5982\u4F55\u986F\u793A\u76EE\u524D\u884C\u7684\u9192\u76EE\u63D0\u793A\u3002","\u7576\u7126\u9EDE\u70BA\u8A72\u7DE8\u8F2F\u5668\u6642\uFF0C\u63A7\u5236\u8A72\u7DE8\u8F2F\u5668\u662F\u5426\u50C5\u61C9\u8F49\u8B6F\u76EE\u524D\u884C\u7684\u9192\u76EE\u63D0\u793A","\u8F49\u8B6F\u7A7A\u767D\u5B57\u5143\uFF0C\u4F46\u6587\u5B57\u4E4B\u9593\u7684\u55AE\u4E00\u7A7A\u683C\u9664\u5916\u3002","\u53EA\u8F49\u8B6F\u6240\u9078\u6587\u5B57\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u53EA\u8F49\u8B6F\u7D50\u5C3E\u7A7A\u767D\u5B57\u5143","\u63A7\u5236\u7DE8\u8F2F\u5668\u61C9\u5982\u4F55\u8F49\u8B6F\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u9078\u53D6\u7BC4\u570D\u662F\u5426\u6709\u5713\u89D2","\u63A7\u5236\u7DE8\u8F2F\u5668\u6C34\u5E73\u6372\u52D5\u7684\u984D\u5916\u5B57\u5143\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6372\u52D5\u5230\u6700\u5F8C\u4E00\u884C\u4E4B\u5916\u3002","\u540C\u6642\u9032\u884C\u5782\u76F4\u8207\u6C34\u5E73\u6372\u52D5\u6642\uFF0C\u50C5\u6CBF\u4E3B\u8EF8\u6372\u52D5\u3002\u907F\u514D\u5728\u8ECC\u8DE1\u677F\u4E0A\u9032\u884C\u5782\u76F4\u6372\u52D5\u6642\u767C\u751F\u6C34\u5E73\u6F02\u79FB\u3002","\u63A7\u5236\u662F\u5426\u652F\u63F4 Linux \u4E3B\u8981\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u63D0\u793A\u8207\u9078\u53D6\u9805\u76EE\u985E\u4F3C\u7684\u76F8\u7B26\u9805\u76EE\u3002","\u4E00\u5F8B\u986F\u793A\u647A\u758A\u63A7\u5236\u9805\u3002","\u50C5\u7576\u6ED1\u9F20\u61F8\u505C\u5728\u6D3B\u52D5\u5217\u4E0A\u6642\uFF0C\u624D\u986F\u793A\u6298\u758A\u529F\u80FD\u3002","\u63A7\u5236\u647A\u758A\u63A7\u5236\u9805\u5728\u88DD\u8A02\u908A\u4E0A\u7684\u986F\u793A\u6642\u6A5F\u3002","\u63A7\u5236\u672A\u4F7F\u7528\u7A0B\u5F0F\u78BC\u7684\u6DE1\u51FA\u3002","\u63A7\u5236\u5DF2\u522A\u9664\u7684\u6DD8\u6C70\u8B8A\u6578\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u986F\u793A\u65BC\u5176\u4ED6\u5EFA\u8B70\u7684\u9802\u7AEF\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u986F\u793A\u65BC\u5176\u4ED6\u5EFA\u8B70\u7684\u4E0B\u65B9\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u8207\u5176\u4ED6\u5EFA\u8B70\u4E00\u540C\u986F\u793A\u3002","\u4E0D\u986F\u793A\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u3002","\u63A7\u5236\u7A0B\u5F0F\u78BC\u7247\u6BB5\u662F\u5426\u96A8\u5176\u4ED6\u5EFA\u8B70\u986F\u793A\uFF0C\u4EE5\u53CA\u5176\u6392\u5E8F\u65B9\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6703\u4F7F\u7528\u52D5\u756B\u6372\u52D5","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u5B57\u578B\u5927\u5C0F\u3002\u7576\u8A2D\u5B9A\u70BA `0` \u6642\uFF0C\u5247\u4F7F\u7528 `#editor.fontSize#` \u503C.","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u884C\u9AD8\u3002\u7576\u8A2D\u5B9A\u70BA `0` \u6642\uFF0C\u5247\u4F7F\u7528 `#editor.lineHeight#` \u7684\u503C\u3002\u6700\u5C0F\u503C\u70BA 8\u3002","\u63A7\u5236\u5EFA\u8B70\u662F\u5426\u61C9\u5728\u9375\u5165\u89F8\u767C\u5B57\u5143\u6642\u81EA\u52D5\u986F\u793A\u3002","\u4E00\u5F8B\u9078\u53D6\u7B2C\u4E00\u500B\u5EFA\u8B70\u3002","\u9664\u975E\u9032\u4E00\u6B65\u9375\u5165\u9078\u53D6\u4E86\u5EFA\u8B70\uFF0C\u5426\u5247\u9078\u53D6\u6700\u8FD1\u7684\u5EFA\u8B70\uFF0C\u4F8B\u5982 `console.| -> console.log`\uFF0C\u539F\u56E0\u662F\u6700\u8FD1\u5B8C\u6210\u4E86 `log`\u3002","\u6839\u64DA\u5148\u524D\u5DF2\u5B8C\u6210\u8A72\u5EFA\u8B70\u7684\u524D\u7F6E\u8A5E\u9078\u53D6\u5EFA\u8B70\uFF0C\u4F8B\u5982 `co -> console` \u548C `con -> const`\u3002","\u63A7\u5236\u5728\u986F\u793A\u5EFA\u8B70\u6E05\u55AE\u6642\u5982\u4F55\u9810\u5148\u9078\u53D6\u5EFA\u8B70\u3002","\u6309 Tab \u6642\uFF0CTab \u5B8C\u6210\u6703\u63D2\u5165\u6700\u7B26\u5408\u7684\u5EFA\u8B70\u3002","\u505C\u7528 tab \u9375\u81EA\u52D5\u5B8C\u6210\u3002","\u5728\u7A0B\u5F0F\u78BC\u7247\u6BB5\u7684\u9996\u78BC\u76F8\u7B26\u6642\u4F7F\u7528 Tab \u5B8C\u6210\u3002\u672A\u555F\u7528 'quickSuggestions' \u6642\u6548\u679C\u6700\u4F73\u3002","\u555F\u7528 tab \u9375\u81EA\u52D5\u5B8C\u6210\u3002","\u81EA\u52D5\u79FB\u9664\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u3002","\u5FFD\u7565\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u3002","\u8981\u79FB\u9664\u4E4B\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u63D0\u793A\u3002","\u79FB\u9664\u53EF\u80FD\u5C0E\u81F4\u554F\u984C\u7684\u7570\u5E38\u884C\u7D50\u675F\u5B57\u5143\u3002","\u63D2\u5165\u548C\u522A\u9664\u63A5\u5728\u5B9A\u4F4D\u505C\u99D0\u9EDE\u5F8C\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u5728\u57F7\u884C\u6587\u5B57\u76F8\u95DC\u5C0E\u89BD\u6216\u4F5C\u696D\u6642\u8981\u7528\u4F5C\u6587\u5B57\u5206\u9694\u7B26\u865F\u7684\u5B57\u5143","\u4E00\u5F8B\u4E0D\u63DB\u884C\u3002","\u4F9D\u6AA2\u8996\u5340\u5BEC\u5EA6\u63DB\u884C\u3002","\u65BC '#editor.wordWrapColumn#' \u63DB\u884C\u3002","\u7576\u6AA2\u8996\u5340\u7E2E\u81F3\u6700\u5C0F\u4E26\u8A2D\u5B9A '#editor.wordWrapColumn#' \u6642\u63DB\u884C\u3002","\u63A7\u5236\u5982\u4F55\u63DB\u884C\u3002","\u7576 `#editor.wordWrap#` \u70BA `wordWrapColumn` \u6216 `bounded` \u6642\uFF0C\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u7684\u8CC7\u6599\u884C\u63DB\u884C\u3002","\u7121\u7E2E\u6392\u3002\u63DB\u884C\u5F9E\u7B2C 1 \u5217\u958B\u59CB\u3002","\u63DB\u884C\u7684\u7E2E\u6392\u6703\u8207\u7236\u884C\u76F8\u540C\u3002","\u63DB\u884C\u7684\u7E2E\u6392\u70BA\u7236\u884C +1\u3002","\u63DB\u884C\u7E2E\u6392\u70BA\u7236\u884C +2\u3002","\u63A7\u5236\u63DB\u884C\u7684\u7E2E\u6392\u3002","\u5047\u8A2D\u6240\u6709\u5B57\u5143\u7684\u5BEC\u5EA6\u5747\u76F8\u540C\u3002\u9019\u662F\u4E00\u7A2E\u5FEB\u901F\u7684\u6F14\u7B97\u6CD5\uFF0C\u9069\u7528\u65BC\u7B49\u5BEC\u5B57\u578B\uFF0C\u4EE5\u53CA\u5B57\u7B26\u5BEC\u5EA6\u76F8\u540C\u7684\u90E8\u5206\u6307\u4EE4\u78BC (\u4F8B\u5982\u62C9\u4E01\u6587\u5B57\u5143)\u3002","\u5C07\u5916\u570D\u9EDE\u8A08\u7B97\u59D4\u6D3E\u7D66\u700F\u89BD\u5668\u3002\u9019\u662F\u7DE9\u6162\u7684\u6F14\u7B97\u6CD5\uFF0C\u5982\u679C\u6A94\u6848\u8F03\u5927\u53EF\u80FD\u6703\u5C0E\u81F4\u51CD\u7D50\uFF0C\u4F46\u5728\u6240\u6709\u60C5\u6CC1\u4E0B\u90FD\u6B63\u5E38\u904B\u4F5C\u3002","\u63A7\u5236\u8A08\u7B97\u5916\u570D\u9EDE\u7684\u6F14\u7B97\u6CD5\u3002"],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["\u6B63\u5728\u9375\u5165"],"vs/editor/common/modes/modesRegistry":["\u7D14\u6587\u5B57"],"vs/editor/common/standaloneStrings":["\u7121\u9078\u53D6\u9805\u76EE","\u7B2C {0} \u884C\uFF0C\u7B2C {1} \u6B04 (\u5DF2\u9078\u53D6 {2})","\u7B2C {0} \u884C\uFF0C\u7B2C {1} \u6B04","{0} \u500B\u9078\u53D6\u9805\u76EE (\u5DF2\u9078\u53D6 {1} \u500B\u5B57\u5143)","{0} \u500B\u9078\u53D6\u9805\u76EE","\u7ACB\u5373\u5C07\u8A2D\u5B9A `accessibilitySupport` \u8B8A\u66F4\u70BA 'on\u2019\u3002","\u7ACB\u5373\u958B\u555F\u7DE8\u8F2F\u5668\u5354\u52A9\u5DE5\u5177\u6587\u4EF6\u9801\u9762\u3002","\u5728 Diff \u7DE8\u8F2F\u5668\u7684\u552F\u8B80\u7A97\u683C\u4E2D\u3002","\u5728 Diff \u7DE8\u8F2F\u5668\u7684\u7A97\u683C\u4E2D\u3002","\u5728\u552F\u8B80\u7A0B\u5F0F\u78BC\u7DE8\u8F2F\u5668\u4E2D","\u5728\u7A0B\u5F0F\u78BC\u7DE8\u8F2F\u5668\u4E2D","\u82E5\u8981\u70BA\u7DE8\u8F2F\u5668\u9032\u884C\u6700\u80FD\u642D\u914D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u7684\u8A2D\u5B9A\uFF0C\u8ACB\u7ACB\u5373\u6309 Command+E\u3002","\u82E5\u8981\u5C07\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u70BA\u91DD\u5C0D\u642D\u914D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u6700\u4F73\u5316\uFF0C\u8ACB\u7ACB\u5373\u6309 Control+E\u3002","\u7DE8\u8F2F\u5668\u5DF2\u8A2D\u5B9A\u70BA\u91DD\u5C0D\u642D\u914D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u6700\u4F73\u5316\u3002","\u5DF2\u5C07\u6B64\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u70BA\u6C38\u9060\u4E0D\u91DD\u5C0D\u642D\u914D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u6700\u4F73\u5316\uFF0C\u4F46\u76EE\u524D\u4E0D\u662F\u6B64\u60C5\u6CC1\u3002","\u5728\u76EE\u524D\u7684\u7DE8\u8F2F\u5668\u4E2D\u6309 Tab \u9375\u6703\u5C07\u7126\u9EDE\u79FB\u81F3\u4E0B\u4E00\u500B\u53EF\u8A2D\u5B9A\u7126\u9EDE\u7684\u5143\u7D20\u3002\u6309 {0} \u53EF\u5207\u63DB\u6B64\u884C\u70BA\u3002","\u5728\u76EE\u524D\u7684\u7DE8\u8F2F\u5668\u4E2D\u6309 Tab \u9375\u6703\u5C07\u7126\u9EDE\u79FB\u81F3\u4E0B\u4E00\u500B\u53EF\u8A2D\u5B9A\u7126\u9EDE\u7684\u5143\u7D20\u3002\u547D\u4EE4 {0} \u76EE\u524D\u7121\u6CD5\u7531\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\u89F8\u767C\u3002","\u5728\u76EE\u524D\u7684\u7DE8\u8F2F\u5668\u4E2D\u6309 Tab \u9375\u6703\u63D2\u5165\u5B9A\u4F4D\u5B57\u5143\u3002\u6309 {0} \u53EF\u5207\u63DB\u6B64\u884C\u70BA\u3002","\u5728\u76EE\u524D\u7684\u7DE8\u8F2F\u5668\u4E2D\u6309 Tab \u9375\u6703\u63D2\u5165\u5B9A\u4F4D\u5B57\u5143\u3002\u547D\u4EE4 {0} \u76EE\u524D\u7121\u6CD5\u7531\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\u89F8\u767C\u3002","\u7ACB\u5373\u6309 Command+H\uFF0C\u4EE5\u958B\u555F\u63D0\u4F9B\u7DE8\u8F2F\u5668\u5354\u52A9\u5DE5\u5177\u76F8\u95DC\u8A73\u7D30\u8CC7\u8A0A\u7684\u700F\u89BD\u5668\u8996\u7A97\u3002","\u7ACB\u5373\u6309 Control+H\uFF0C\u4EE5\u958B\u555F\u63D0\u4F9B\u7DE8\u8F2F\u5668\u5354\u52A9\u5DE5\u5177\u76F8\u95DC\u8A73\u7D30\u8CC7\u8A0A\u7684\u700F\u89BD\u5668\u8996\u7A97\u3002","\u60A8\u53EF\u4EE5\u6309 Esc \u9375\u6216 Shift+Esc \u9375\u4F86\u89E3\u9664\u6B64\u5DE5\u5177\u63D0\u793A\u4E26\u8FD4\u56DE\u7DE8\u8F2F\u5668\u3002","\u986F\u793A\u5354\u52A9\u5DE5\u5177\u8AAA\u660E","\u958B\u767C\u4EBA\u54E1: \u6AA2\u67E5\u6B0A\u6756","\u524D\u5F80\u884C/\u6B04...","\u986F\u793A\u6240\u6709\u5FEB\u901F\u5B58\u53D6\u63D0\u4F9B\u8005","\u547D\u4EE4\u9078\u64C7\u5340","\u986F\u793A\u4E26\u57F7\u884C\u547D\u4EE4","\u79FB\u81F3\u7B26\u865F...","\u524D\u5F80\u7B26\u865F (\u4F9D\u985E\u5225)...","\u7DE8\u8F2F\u5668\u5167\u5BB9","\u6309 Alt+F1 \u53EF\u53D6\u5F97\u5354\u52A9\u5DE5\u5177\u9078\u9805\u3002","\u5207\u63DB\u9AD8\u5C0D\u6BD4\u4F48\u666F\u4E3B\u984C","\u5DF2\u5728 {1} \u6A94\u6848\u4E2D\u9032\u884C {0} \u9805\u7DE8\u8F2F"],"vs/editor/common/view/editorColorRegistry":["\u76EE\u524D\u6E38\u6A19\u4F4D\u7F6E\u884C\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u76EE\u524D\u6E38\u6A19\u4F4D\u7F6E\u884C\u4E4B\u5468\u570D\u6846\u7DDA\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9192\u76EE\u63D0\u793A\u7BC4\u570D\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u4F8B\u5982\u5FEB\u901F\u958B\u555F\u4E26\u5C0B\u627E\u529F\u80FD\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u53CD\u767D\u986F\u793A\u7BC4\u570D\u5468\u570D\u908A\u6846\u7684\u80CC\u666F\u984F\u8272\u3002","\u9192\u76EE\u63D0\u793A\u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u76F8\u4F3C\u65BC\u524D\u5F80\u4E0B\u4E00\u500B\u5B9A\u7FA9\u6216\u524D\u5F80\u4E0B\u4E00\u500B/\u4E0A\u4E00\u500B\u7B26\u865F\u3002\u8272\u5F69\u5FC5\u9808\u900F\u660E\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9192\u76EE\u63D0\u793A\u5468\u570D\u7684\u908A\u754C\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6E38\u6A19\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6E38\u6A19\u7684\u80CC\u666F\u8272\u5F69\u3002\u5141\u8A31\u81EA\u8A02\u5340\u584A\u6E38\u6A19\u91CD\u758A\u7684\u5B57\u5143\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u7A7A\u767D\u5B57\u5143\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u884C\u865F\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4F7F\u7528\u4E2D\u884C\u865F\u7684\u8272\u5F69","Id \u5DF2\u53D6\u4EE3\u3002\u8ACB\u6539\u7528 'editorLineNumber.activeForeground' \u3002","\u7DE8\u8F2F\u5668\u4F7F\u7528\u4E2D\u884C\u865F\u7684\u8272\u5F69","\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u8272\u5F69","\u7DE8\u8F2F\u5668\u7A0B\u5F0F\u78BC\u6FFE\u93E1\u7684\u524D\u666F\u8272\u5F69","\u6210\u5C0D\u62EC\u865F\u80CC\u666F\u8272\u5F69","\u6210\u5C0D\u62EC\u865F\u908A\u6846\u8272\u5F69","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u908A\u6846\u8272\u5F69.","\u7DE8\u8F2F\u5668\u6982\u89C0\u5C3A\u898F\u7684\u80CC\u666F\u8272\u5F69\u3002\u50C5\u5728\u555F\u7528\u7E2E\u5716\u4E26\u5C07\u5176\u7F6E\u65BC\u7DE8\u8F2F\u5668\u53F3\u5074\u6642\u4F7F\u7528\u3002","\u7DE8\u8F2F\u5668\u908A\u6846\u7684\u80CC\u666F\u984F\u8272,\u5305\u542B\u884C\u865F\u8207\u5B57\u5F62\u5716\u793A\u7684\u908A\u6846.","\u7DE8\u8F2F\u5668\u4E2D\u4E0D\u5FC5\u8981 (\u672A\u4F7F\u7528) \u539F\u59CB\u7A0B\u5F0F\u78BC\u7684\u6846\u7DDA\u8272\u5F69\u3002",`\u7DE8\u8F2F\u5668\u4E2D\u4E0D\u5FC5\u8981 (\u672A\u4F7F\u7528) \u539F\u59CB\u7A0B\u5F0F\u78BC\u7684\u4E0D\u900F\u660E\u5EA6\u3002\u4F8B\u5982 "#000000c0\u201D \u6703\u4EE5 75% \u7684\u4E0D\u900F\u660E\u5EA6\u8F49\u8B6F\u7A0B\u5F0F\u78BC\u3002\u91DD\u5C0D\u9AD8\u5C0D\u6BD4\u4E3B\u984C\uFF0C\u4F7F\u7528 'editorUnnecessaryCode.border' \u4E3B\u984C\u8272\u5F69\u53EF\u70BA\u4E0D\u5FC5\u8981\u7684\u7A0B\u5F0F\u78BC\u52A0\u4E0A\u5E95\u7DDA\uFF0C\u800C\u4E0D\u662F\u5C07\u5176\u8B8A\u6DE1\u3002`,"\u7BC4\u570D\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u932F\u8AA4\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u8B66\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u8CC7\u8A0A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002"],"vs/editor/contrib/anchorSelect/anchorSelect":["\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u8A2D\u5B9A\u9328\u9EDE\u70BA {0}:{1}","\u8A2D\u5B9A\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u524D\u5F80\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u9078\u53D6\u5F9E\u9328\u9EDE\u5230\u6E38\u6A19\u4E4B\u9593\u7684\u7BC4\u570D","\u53D6\u6D88\u9078\u53D6\u7BC4\u570D\u9328\u9EDE"],"vs/editor/contrib/bracketMatching/bracketMatching":["\u6210\u5C0D\u62EC\u5F27\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u79FB\u81F3\u65B9\u62EC\u5F27","\u9078\u53D6\u81F3\u62EC\u5F27","\u524D\u5F80\u62EC\u5F27(&&B)"],"vs/editor/contrib/caretOperations/caretOperations":["\u5C07\u6240\u9078\u6587\u5B57\u5411\u5DE6\u79FB\u52D5","\u5C07\u6240\u9078\u6587\u5B57\u5411\u53F3\u79FB\u52D5"],"vs/editor/contrib/caretOperations/transpose":["\u8ABF\u63DB\u5B57\u6BCD"],"vs/editor/contrib/clipboard/clipboard":["\u526A\u4E0B(&&T)","\u526A\u4E0B","\u526A\u4E0B","\u8907\u88FD(&&C)","\u8907\u88FD","\u8907\u88FD","\u8CBC\u4E0A(&&P)","\u8CBC\u4E0A","\u8CBC\u4E0A","\u96A8\u8A9E\u6CD5\u9192\u76EE\u63D0\u793A\u8907\u88FD"],"vs/editor/contrib/codeAction/codeActionCommands":["\u8981\u57F7\u884C\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u7684\u7A2E\u985E\u3002","\u63A7\u5236\u8981\u5957\u7528\u50B3\u56DE\u52D5\u4F5C\u7684\u6642\u6A5F\u3002","\u4E00\u5F8B\u5957\u7528\u7B2C\u4E00\u500B\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u5982\u679C\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u662F\u552F\u4E00\u52D5\u4F5C\uFF0C\u5247\u52A0\u4EE5\u5957\u7528\u3002","\u4E0D\u8981\u5957\u7528\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u63A7\u5236\u662F\u5426\u50C5\u61C9\u50B3\u56DE\u504F\u597D\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u5957\u7528\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u6642\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4","\u5FEB\u901F\u4FEE\u5FA9...","\u6C92\u6709\u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u64CD\u4F5C",'\u6C92\u6709 "{0}" \u7684\u504F\u597D\u7A0B\u5F0F\u78BC\u52D5\u4F5C','\u6C92\u6709 "{0}" \u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u7A0B\u5F0F\u78BC\u52D5\u4F5C","\u6C92\u6709\u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u64CD\u4F5C","\u91CD\u69CB...","\u6C92\u6709\u9069\u7528\u65BC '{0}' \u7684\u504F\u597D\u91CD\u69CB\u3002",'\u6C92\u6709\u53EF\u7528\u7684 "{0}" \u91CD\u69CB',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u91CD\u69CB","\u6C92\u6709\u53EF\u7528\u7684\u91CD\u69CB","\u4F86\u6E90\u52D5\u4F5C...","\u6C92\u6709\u9069\u7528\u65BC '{0}' \u7684\u504F\u597D\u4F86\u6E90\u52D5\u4F5C",'\u6C92\u6709 "{0}" \u53EF\u7528\u7684\u4F86\u6E90\u52D5\u4F5C',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u4F86\u6E90\u52D5\u4F5C","\u6C92\u6709\u53EF\u7528\u7684\u4F86\u6E90\u52D5\u4F5C","\u7D44\u7E54\u532F\u5165","\u6C92\u6709\u4EFB\u4F55\u53EF\u7528\u7684\u7D44\u7E54\u532F\u5165\u52D5\u4F5C","\u5168\u90E8\u4FEE\u6B63","\u6C92\u6709\u5168\u90E8\u4FEE\u6B63\u52D5\u4F5C\u53EF\u7528","\u81EA\u52D5\u4FEE\u6B63...","\u6C92\u6709\u53EF\u7528\u7684\u81EA\u52D5\u4FEE\u6B63"],"vs/editor/contrib/codeAction/lightBulbWidget":["\u986F\u793A\u4FEE\u6B63\u7A0B\u5F0F\u3002\u504F\u597D\u7684\u4FEE\u6B63\u7A0B\u5F0F\u53EF\u7528 ({0})","\u986F\u793A\u4FEE\u6B63 ({0})","\u986F\u793A\u4FEE\u6B63"],"vs/editor/contrib/codelens/codelensController":["\u986F\u793A\u76EE\u524D\u884C\u7684 Code Lens \u547D\u4EE4"],"vs/editor/contrib/comment/comment":["\u5207\u63DB\u884C\u8A3B\u89E3","\u5207\u63DB\u884C\u8A3B\u89E3(&&T)","\u52A0\u5165\u884C\u8A3B\u89E3","\u79FB\u9664\u884C\u8A3B\u89E3","\u5207\u63DB\u5340\u584A\u8A3B\u89E3","\u5207\u63DB\u5340\u584A\u8A3B\u89E3(&&B)"],"vs/editor/contrib/contextmenu/contextmenu":["\u986F\u793A\u7DE8\u8F2F\u5668\u5167\u5BB9\u529F\u80FD\u8868"],"vs/editor/contrib/cursorUndo/cursorUndo":["\u6E38\u6A19\u5FA9\u539F","\u6E38\u6A19\u91CD\u505A"],"vs/editor/contrib/find/findController":["\u5C0B\u627E","\u5C0B\u627E(&&F)","\u5C0B\u627E\u9078\u53D6\u9805\u76EE","\u5C0B\u627E\u4E0B\u4E00\u500B","\u5C0B\u627E\u4E0B\u4E00\u500B","\u5C0B\u627E\u4E0A\u4E00\u500B","\u5C0B\u627E\u4E0A\u4E00\u500B","\u5C0B\u627E\u4E0B\u4E00\u500B\u9078\u53D6\u9805\u76EE","\u5C0B\u627E\u4E0A\u4E00\u500B\u9078\u53D6\u9805\u76EE","\u53D6\u4EE3","\u53D6\u4EE3(&&R)"],"vs/editor/contrib/find/findWidget":["\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E] \u7684\u5716\u793A\u3002","\u8868\u793A\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u5DF2\u647A\u758A\u7684\u5716\u793A\u3002","\u8868\u793A\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u5DF2\u5C55\u958B\u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u53D6\u4EE3] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5168\u90E8\u53D6\u4EE3] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5C0B\u627E\u4E0A\u4E00\u500B] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5C0B\u627E\u4E0B\u4E00\u500B] \u7684\u5716\u793A\u3002","\u5C0B\u627E","\u5C0B\u627E","\u4E0A\u4E00\u500B\u7B26\u5408\u9805\u76EE","\u4E0B\u4E00\u500B\u7B26\u5408\u9805\u76EE","\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E","\u95DC\u9589","\u53D6\u4EE3","\u53D6\u4EE3","\u53D6\u4EE3","\u5168\u90E8\u53D6\u4EE3","\u5207\u63DB\u53D6\u4EE3\u6A21\u5F0F","\u50C5\u53CD\u767D\u986F\u793A\u524D {0} \u7B46\u7D50\u679C\uFF0C\u4F46\u6240\u6709\u5C0B\u627E\u4F5C\u696D\u6703\u5728\u5B8C\u6574\u6587\u5B57\u4E0A\u57F7\u884C\u3002","{1} \u7684 {0}","\u67E5\u7121\u7D50\u679C","\u627E\u5230 {0}","\u4EE5 '{1}' \u627E\u5230 {0}","\u4EE5 '{1}' \u627E\u5230 {0}\uFF0C\u4F4D\u65BC {2}","\u5DF2\u4EE5 '{1}' \u627E\u5230 {0}","Ctrl+Enter \u73FE\u5728\u6703\u63D2\u5165\u5206\u884C\u7B26\u865F\uFF0C\u800C\u4E0D\u6703\u5168\u90E8\u53D6\u4EE3\u3002\u60A8\u53EF\u4EE5\u4FEE\u6539 editor.action.replaceAll \u7684\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\uFF0C\u4EE5\u8986\u5BEB\u6B64\u884C\u70BA\u3002"],"vs/editor/contrib/folding/folding":["\u5C55\u958B","\u4EE5\u905E\u8FF4\u65B9\u5F0F\u5C55\u958B","\u647A\u758A","\u5207\u63DB\u647A\u758A","\u4EE5\u905E\u8FF4\u65B9\u5F0F\u647A\u758A","\u647A\u758A\u5168\u90E8\u5340\u584A\u8A3B\u89E3","\u647A\u758A\u6240\u6709\u5340\u57DF","\u5C55\u958B\u6240\u6709\u5340\u57DF","\u5168\u90E8\u647A\u758A","\u5168\u90E8\u5C55\u958B","\u647A\u758A\u5C64\u7D1A {0}","\u5DF2\u647A\u758A\u7BC4\u570D\u5F8C\u7684\u80CC\u666F\u8272\u5F69\u3002\u8272\u5F69\u4E0D\u5F97\u8655\u65BC\u4E0D\u900F\u660E\u72C0\u614B\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u88DD\u8A02\u908A\u7684\u647A\u758A\u63A7\u5236\u9805\u8272\u5F69\u3002"],"vs/editor/contrib/folding/foldingDecorations":["\u7DE8\u8F2F\u5668\u5B57\u7B26\u908A\u754C\u4E2D [\u5C55\u958B\u7684\u7BC4\u570D] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5B57\u7B26\u908A\u754C\u4E2D [\u647A\u758A\u7684\u7BC4\u570D] \u7684\u5716\u793A\u3002"],"vs/editor/contrib/fontZoom/fontZoom":["\u7DE8\u8F2F\u5668\u5B57\u9AD4\u653E\u5927","\u7DE8\u8F2F\u5668\u5B57\u578B\u7E2E\u5C0F","\u7DE8\u8F2F\u5668\u5B57\u9AD4\u91CD\u8A2D\u7E2E\u653E"],"vs/editor/contrib/format/format":["\u5728\u884C {0} \u7DE8\u8F2F\u4E86 1 \u9805\u683C\u5F0F","\u5728\u884C {1} \u7DE8\u8F2F\u4E86 {0} \u9805\u683C\u5F0F","\u5728\u884C {0} \u8207\u884C {1} \u4E4B\u9593\u7DE8\u8F2F\u4E86 1 \u9805\u683C\u5F0F","\u5728\u884C {1} \u8207\u884C {2} \u4E4B\u9593\u7DE8\u8F2F\u4E86 {0} \u9805\u683C\u5F0F"],"vs/editor/contrib/format/formatActions":["\u683C\u5F0F\u5316\u6587\u4EF6","\u683C\u5F0F\u5316\u9078\u53D6\u7BC4\u570D"],"vs/editor/contrib/gotoError/gotoError":["\u79FB\u81F3\u4E0B\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","[\u524D\u5F80\u4E0B\u4E00\u500B\u6A19\u8A18] \u7684\u5716\u793A\u3002","\u79FB\u81F3\u4E0A\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","[\u524D\u5F80\u4E0A\u4E00\u500B\u6A19\u8A18] \u7684\u5716\u793A\u3002","\u79FB\u81F3\u6A94\u6848\u88E1\u9762\u7684\u4E0B\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","\u4E0B\u4E00\u500B\u554F\u984C(&&P)","\u79FB\u81F3\u6A94\u6848\u88E1\u9762\u7684\u4E0A\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","\u524D\u4E00\u500B\u554F\u984C(&&P)"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\u932F\u8AA4","\u8B66\u544A","\u8CC7\u8A0A","\u63D0\u793A","{0} \u65BC {1}\u3002","{0} \u500B\u554F\u984C (\u5171 {1} \u500B)","{0} \u500B\u554F\u984C (\u5171 {1} \u500B)","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u932F\u8AA4\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u8B66\u544A\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u8CC7\u8A0A\u7684\u8272\u5F69","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u3002"],"vs/editor/contrib/gotoSymbol/goToCommands":["\u67E5\u770B","\u5B9A\u7FA9","\u627E\u4E0D\u5230 '{0}' \u7684\u5B9A\u7FA9","\u627E\u4E0D\u5230\u4EFB\u4F55\u5B9A\u7FA9","\u79FB\u81F3\u5B9A\u7FA9","\u79FB\u81F3\u5B9A\u7FA9(&&D)","\u5728\u4E00\u5074\u958B\u555F\u5B9A\u7FA9","\u7784\u6838\u5B9A\u7FA9","\u5BA3\u544A","\u627E\u4E0D\u5230 '{0}' \u7684\u5BA3\u544A ","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BA3\u544A","\u79FB\u81F3\u5BA3\u544A","\u524D\u5F80\u5BA3\u544A(&&D)","\u627E\u4E0D\u5230 '{0}' \u7684\u5BA3\u544A ","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BA3\u544A","\u9810\u89BD\u5BA3\u544A","\u985E\u578B\u5B9A\u7FA9","\u627E\u4E0D\u5230 '{0}' \u7684\u4EFB\u4F55\u985E\u578B\u5B9A\u7FA9","\u627E\u4E0D\u5230\u4EFB\u4F55\u985E\u578B\u5B9A\u7FA9","\u79FB\u81F3\u985E\u578B\u5B9A\u7FA9","\u524D\u5F80\u985E\u578B\u5B9A\u7FA9(&&T)","\u9810\u89BD\u985E\u578B\u5B9A\u7FA9","\u5BE6\u4F5C","\u627E\u4E0D\u5230 '{0}' \u7684\u4EFB\u4F55\u5BE6\u4F5C","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BE6\u4F5C","\u524D\u5F80\u5BE6\u4F5C","\u524D\u5F80\u5BE6\u4F5C(&&I)","\u67E5\u770B\u5BE6\u4F5C",'\u672A\u627E\u5230 "{0}" \u7684\u53C3\u8003',"\u672A\u627E\u5230\u53C3\u8003","\u524D\u5F80\u53C3\u8003","\u524D\u5F80\u53C3\u8003(&&R)","\u53C3\u8003","\u9810\u89BD\u53C3\u8003","\u53C3\u8003","\u79FB\u81F3\u4EFB\u4F55\u7B26\u865F","\u4F4D\u7F6E","'{0}' \u6C92\u6709\u7D50\u679C","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["\u6309\u4E00\u4E0B\u4EE5\u986F\u793A {0} \u9805\u5B9A\u7FA9\u3002"],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\u6B63\u5728\u8F09\u5165...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} \u500B\u53C3\u8003","{0} \u500B\u53C3\u8003","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\u7121\u6CD5\u9810\u89BD","\u67E5\u7121\u7D50\u679C","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/referencesModel":["\u500B\u7B26\u865F\u4F4D\u65BC {0} \u4E2D\u7684\u7B2C {1} \u884C\u7B2C {2} \u6B04","\u7B26\u865F\u4F4D\u65BC {0} \u4E2D\u7684\u7B2C {1} \u884C\u7B2C {2}\u3001{3} \u6B04","1 \u500B\u7B26\u865F\u4F4D\u65BC {0}, \u5B8C\u6574\u8DEF\u5F91 {1}","{0} \u500B\u7B26\u865F\u4F4D\u65BC {1}, \u5B8C\u6574\u8DEF\u5F91 {2}","\u627E\u4E0D\u5230\u7D50\u679C","\u5728 {0} \u4E2D\u627E\u5230 1 \u500B\u7B26\u865F","\u5728 {1} \u4E2D\u627E\u5230 {0} \u500B\u7B26\u865F","\u5728 {1} \u500B\u6A94\u6848\u4E2D\u627E\u5230 {0} \u500B\u7B26\u865F"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["{1} \u7684\u7B26\u865F {0}\uFF0C{2} \u70BA\u4E0B\u4E00\u500B","{1} \u7684\u7B26\u865F {0}"],"vs/editor/contrib/hover/hover":["\u52D5\u614B\u986F\u793A","\u986F\u793A\u5B9A\u7FA9\u9810\u89BD\u61F8\u505C"],"vs/editor/contrib/hover/markdownHoverParticipant":["\u6B63\u5728\u8F09\u5165..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","\u6C92\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u6B63","\u6B63\u5728\u6AA2\u67E5\u5FEB\u901F\u4FEE\u6B63...","\u6C92\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u6B63","\u5FEB\u901F\u4FEE\u5FA9..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\u4EE5\u4E0A\u4E00\u500B\u503C\u53D6\u4EE3","\u4EE5\u4E0B\u4E00\u500B\u503C\u53D6\u4EE3"],"vs/editor/contrib/indentation/indentation":["\u5C07\u7E2E\u6392\u8F49\u63DB\u6210\u7A7A\u683C","\u5C07\u7E2E\u6392\u8F49\u63DB\u6210\u5B9A\u4F4D\u9EDE","\u5DF2\u8A2D\u5B9A\u7684\u5B9A\u4F4D\u9EDE\u5927\u5C0F","\u9078\u53D6\u76EE\u524D\u6A94\u6848\u7684\u5B9A\u4F4D\u9EDE\u5927\u5C0F","\u4F7F\u7528 Tab \u9032\u884C\u7E2E\u6392","\u4F7F\u7528\u7A7A\u683C\u9375\u9032\u884C\u7E2E\u6392","\u5075\u6E2C\u5167\u5BB9\u4E2D\u7684\u7E2E\u6392","\u91CD\u65B0\u5C07\u884C\u7E2E\u6392","\u91CD\u65B0\u5C07\u9078\u53D6\u7684\u884C\u7E2E\u6392"],"vs/editor/contrib/linesOperations/linesOperations":["\u5C07\u884C\u5411\u4E0A\u8907\u88FD","\u5C07\u884C\u5411\u4E0A\u8907\u88FD(&&C)","\u5C07\u884C\u5411\u4E0B\u8907\u88FD","\u5C07\u884C\u5411\u4E0B\u8907\u88FD(&&P)","\u91CD\u8907\u9078\u53D6\u9805\u76EE","\u91CD\u8907\u9078\u53D6\u9805\u76EE(&&D)","\u4E0A\u79FB\u4E00\u884C","\u4E0A\u79FB\u4E00\u884C(&&V)","\u4E0B\u79FB\u4E00\u884C","\u4E0B\u79FB\u4E00\u884C(&&L)","\u905E\u589E\u6392\u5E8F\u884C","\u905E\u6E1B\u6392\u5E8F\u884C","\u4FEE\u526A\u5C3E\u7AEF\u7A7A\u767D","\u522A\u9664\u884C","\u7E2E\u6392\u884C","\u51F8\u6392\u884C","\u5728\u4E0A\u65B9\u63D2\u5165\u884C","\u5728\u4E0B\u65B9\u63D2\u5165\u884C","\u5DE6\u908A\u5168\u90E8\u522A\u9664","\u522A\u9664\u6240\u6709\u53F3\u65B9\u9805\u76EE","\u9023\u63A5\u7DDA","\u8F49\u7F6E\u6E38\u6A19\u5468\u570D\u7684\u5B57\u5143\u6578","\u8F49\u63DB\u5230\u5927\u5BEB","\u8F49\u63DB\u5230\u5C0F\u5BEB","\u8F49\u63DB\u70BA\u5B57\u9996\u5927\u5BEB","\u8F49\u63DB\u70BA\u5E95\u7DDA\u9023\u63A5\u5B57"],"vs/editor/contrib/linkedEditing/linkedEditing":["\u958B\u59CB\u9023\u7D50\u7684\u7DE8\u8F2F","\u7576\u7DE8\u8F2F\u5668\u81EA\u52D5\u91CD\u65B0\u547D\u540D\u985E\u578B\u6642\u7684\u80CC\u666F\u8272\u5F69\u3002"],"vs/editor/contrib/links/links":["\u57F7\u884C\u547D\u4EE4","\u8FFD\u8E64\u9023\u7D50","cmd + \u6309\u4E00\u4E0B","ctrl + \u6309\u4E00\u4E0B","\u9078\u9805 + \u6309\u4E00\u4E0B","alt + \u6309\u4E00\u4E0B","\u57F7\u884C\u547D\u4EE4 {0}","\u56E0\u70BA\u6B64\u9023\u7D50\u7684\u683C\u5F0F\u4E0D\u6B63\u78BA\uFF0C\u6240\u4EE5\u7121\u6CD5\u958B\u555F: {0}","\u56E0\u70BA\u6B64\u9023\u7D50\u76EE\u6A19\u907A\u5931\uFF0C\u6240\u4EE5\u7121\u6CD5\u958B\u555F\u3002","\u958B\u555F\u9023\u7D50"],"vs/editor/contrib/message/messageController":["\u7DE8\u8F2F\u5668\u76EE\u524D\u662F\u5426\u6B63\u5728\u986F\u793A\u5167\u5D4C\u8A0A\u606F","\u7121\u6CD5\u5728\u552F\u8B80\u7DE8\u8F2F\u5668\u4E2D\u7DE8\u8F2F"],"vs/editor/contrib/multicursor/multicursor":["\u5728\u4E0A\u65B9\u52A0\u5165\u6E38\u6A19","\u5728\u4E0A\u65B9\u65B0\u589E\u6E38\u6A19(&&A)","\u5728\u4E0B\u65B9\u52A0\u5165\u6E38\u6A19","\u5728\u4E0B\u65B9\u65B0\u589E\u6E38\u6A19(&&D)","\u5728\u884C\u5C3E\u65B0\u589E\u6E38\u6A19","\u5728\u884C\u5C3E\u65B0\u589E\u6E38\u6A19(&&U)","\u5C07\u6E38\u6A19\u65B0\u589E\u5230\u5E95\u90E8 ","\u5C07\u6E38\u6A19\u65B0\u589E\u5230\u9802\u90E8","\u5C07\u9078\u53D6\u9805\u76EE\u52A0\u5165\u4E0B\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u65B0\u589E\u4E0B\u4E00\u500B\u9805\u76EE(&&N)","\u5C07\u9078\u53D6\u9805\u76EE\u52A0\u5165\u524D\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805\u4E2D","\u65B0\u589E\u4E0A\u4E00\u500B\u9805\u76EE(&&R)","\u5C07\u6700\u5F8C\u4E00\u500B\u9078\u64C7\u9805\u76EE\u79FB\u81F3\u4E0B\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u5C07\u6700\u5F8C\u4E00\u500B\u9078\u64C7\u9805\u76EE\u79FB\u81F3\u524D\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u9078\u53D6\u6240\u6709\u627E\u5230\u7684\u76F8\u7B26\u9805\u76EE","\u9078\u53D6\u6240\u6709\u9805\u76EE(&&O)","\u8B8A\u66F4\u6240\u6709\u767C\u751F\u6B21\u6578"],"vs/editor/contrib/parameterHints/parameterHints":["\u89F8\u767C\u53C3\u6578\u63D0\u793A"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["[\u986F\u793A\u4E0B\u4E00\u500B\u53C3\u6578\u63D0\u793A] \u7684\u5716\u793A\u3002","[\u986F\u793A\u4E0A\u4E00\u500B\u53C3\u6578\u63D0\u793A] \u7684\u5716\u793A\u3002","{0}\uFF0C\u63D0\u793A"],"vs/editor/contrib/peekView/peekView":["\u95DC\u9589","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u5340\u57DF\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u8CC7\u8A0A\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u4E4B\u6846\u7DDA\u8207\u7BAD\u982D\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u4E2D\u7D50\u679C\u6E05\u55AE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7D50\u679C\u5217\u8868\u4E2D\u884C\u7BC0\u9EDE\u7684\u524D\u666F\u8272\u5F69","\u9810\u89BD\u6AA2\u8996\u7D50\u679C\u5217\u8868\u4E2D\u6A94\u6848\u7BC0\u9EDE\u7684\u524D\u666F\u8272\u5F69","\u5728\u9810\u89BD\u6AA2\u8996\u4E4B\u7D50\u679C\u6E05\u55AE\u4E2D\u9078\u53D6\u9805\u76EE\u6642\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u4E4B\u7D50\u679C\u6E05\u55AE\u4E2D\u9078\u53D6\u9805\u76EE\u6642\u7684\u524D\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u908A\u6846(\u542B\u884C\u865F\u6216\u5B57\u5F62\u5716\u793A)\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u908A\u754C\u3002"],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\u5148\u958B\u555F\u6587\u5B57\u7DE8\u8F2F\u5668\uFF0C\u524D\u5F80\u67D0\u4E00\u884C\u3002","\u524D\u5F80\u7B2C {0} \u884C\u548C\u7B2C {1} \u6B04\u3002","\u524D\u5F80\u7B2C {0} \u884C\u3002","\u76EE\u524D\u884C: {0}\uFF0C\u5B57\u5143: {1}\u3002\u8ACB\u9375\u5165\u4ECB\u65BC 1 \u5230 {2} \u4E4B\u9593\u884C\u865F\uFF0C\u5C0E\u89BD\u81F3\u8A72\u884C\u3002","\u76EE\u524D\u884C: {0}\uFF0C\u5B57\u5143: {1}\u3002\u8ACB\u9375\u5165\u8981\u5C0E\u89BD\u81F3\u7684\u884C\u865F\u3002"],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\u82E5\u8981\u524D\u5F80\u7B26\u865F\uFF0C\u8ACB\u5148\u958B\u555F\u5305\u542B\u7B26\u865F\u8CC7\u8A0A\u7684\u6587\u5B57\u7DE8\u8F2F\u5668\u3002","\u4F7F\u7528\u4E2D\u7684\u6587\u5B57\u7DE8\u8F2F\u5668\u4E0D\u63D0\u4F9B\u7B26\u865F\u8CC7\u8A0A\u3002","\u6C92\u6709\u76F8\u7B26\u7684\u7DE8\u8F2F\u5668\u7B26\u865F","\u6C92\u6709\u7DE8\u8F2F\u5668\u7B26\u865F","\u958B\u81F3\u5074\u908A","\u958B\u555F\u5230\u5E95\u90E8","\u7B26\u865F ({0})","\u5C6C\u6027 ({0})","\u65B9\u6CD5 ({0})","\u51FD\u5F0F ({0})","\u5EFA\u69CB\u51FD\u5F0F ({0})","\u8B8A\u6578 ({0})","\u985E\u5225 ({0})","\u7D50\u69CB ({0})","\u4E8B\u4EF6 ({0})","\u904B\u7B97\u5B50 ({0})","\u4ECB\u9762 ({0})","\u547D\u540D\u7A7A\u9593 ({0})","\u5957\u4EF6 ({0})","\u578B\u5225\u53C3\u6578 ({0})","\u6A21\u7D44 ({0})","\u5C6C\u6027 ({0})","\u5217\u8209 ({0})","\u5217\u8209\u6210\u54E1 ({0})","\u5B57\u4E32 ({0})","\u6A94\u6848 ({0})","\u9663\u5217 ({0})","\u6578\u5B57 ({0})","\u5E03\u6797\u503C ({0})","\u7269\u4EF6 ({0})","\u7D22\u5F15\u9375 ({0})","\u6B04\u4F4D ({0})","\u5E38\u6578 ({0})"],"vs/editor/contrib/rename/rename":["\u6C92\u6709\u7D50\u679C\u3002","\u89E3\u6790\u91CD\u65B0\u547D\u540D\u4F4D\u7F6E\u6642\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4","\u6B63\u5728\u70BA '{0}' \u91CD\u65B0\u547D\u540D","\u6B63\u5728\u91CD\u65B0\u547D\u540D {0}","\u5DF2\u6210\u529F\u5C07 '{0}' \u91CD\u65B0\u547D\u540D\u70BA '{1}'\u3002\u6458\u8981: {2}","\u91CD\u547D\u540D\u7121\u6CD5\u5957\u7528\u7DE8\u8F2F","\u91CD\u65B0\u547D\u540D\u7121\u6CD5\u8A08\u7B97\u7DE8\u8F2F","\u91CD\u65B0\u547D\u540D\u7B26\u865F","\u555F\u7528/\u505C\u7528\u91CD\u65B0\u547D\u540D\u524D\u5148\u9810\u89BD\u8B8A\u66F4\u7684\u529F\u80FD"],"vs/editor/contrib/rename/renameInputField":["\u70BA\u8F38\u5165\u91CD\u65B0\u547D\u540D\u3002\u8ACB\u9375\u5165\u65B0\u540D\u7A31\uFF0C\u7136\u5F8C\u6309 Enter \u4EE5\u8A8D\u53EF\u3002","\u6309 {0} \u9032\u884C\u91CD\u65B0\u547D\u540D\uFF0C\u6309 {1} \u9032\u884C\u9810\u89BD"],"vs/editor/contrib/smartSelect/smartSelect":["\u5C55\u958B\u9078\u53D6\u9805\u76EE","\u5C55\u958B\u9078\u53D6\u7BC4\u570D(&&E)","\u7E2E\u5C0F\u9078\u53D6\u9805\u76EE","\u58D3\u7E2E\u9078\u53D6\u7BC4\u570D(&&S)"],"vs/editor/contrib/snippet/snippetVariables":["\u661F\u671F\u5929","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D","\u9031\u65E5","\u9031\u4E00","\u9031\u4E8C","\u9031\u4E09","\u9031\u56DB","\u9031\u4E94","\u9031\u516D","\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708","1\u6708","2\u6708","3 \u6708","4\u6708","\u4E94\u6708","6\u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708"],"vs/editor/contrib/suggest/suggestController":["\u63A5\u53D7 \u2018{0}\u2019 \u9032\u884C\u4E86\u5176\u4ED6 {1} \u9805\u7DE8\u8F2F","\u89F8\u767C\u5EFA\u8B70","\u63D2\u5165","\u63D2\u5165","\u53D6\u4EE3","\u53D6\u4EE3","\u63D2\u5165","\u986F\u793A\u66F4\u5C11","\u986F\u793A\u66F4\u591A","\u91CD\u8A2D\u5EFA\u8B70\u5C0F\u5DE5\u5177\u5927\u5C0F"],"vs/editor/contrib/suggest/suggestWidget":["\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u908A\u754C\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u524D\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u6240\u9078\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u76F8\u7B26\u9192\u76EE\u63D0\u793A\u7684\u8272\u5F69\u3002","\u6B63\u5728\u8F09\u5165...","\u7121\u5EFA\u8B70\u3002","{0}\uFF0C\u6587\u4EF6: {1}","\u5EFA\u8B70"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\u95DC\u9589","\u6B63\u5728\u8F09\u5165..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D [\u66F4\u591A\u8A73\u7D30\u8CC7\u8A0A] \u7684\u5716\u793A\u3002","\u95B1\u8B80\u66F4\u591A"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\u9663\u5217\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5E03\u6797\u503C\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u985E\u5225\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8272\u5F69\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5E38\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5EFA\u69CB\u51FD\u5F0F\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5217\u8209\u503C\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5217\u8209\u503C\u6210\u54E1\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u4E8B\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6B04\u4F4D\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6A94\u6848\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8CC7\u6599\u593E\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u51FD\u5F0F\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u4ECB\u9762\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7D22\u5F15\u9375\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u95DC\u9375\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u65B9\u6CD5\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6A21\u7D44\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u547D\u540D\u7A7A\u9593\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","Null \u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6578\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7269\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u904B\u7B97\u5B50\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5957\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5C6C\u6027\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u53C3\u8003\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5B57\u4E32\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7D50\u69CB\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6587\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u578B\u5225\u53C3\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u55AE\u4F4D\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8B8A\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002"],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["\u5207\u63DB TAB \u9375\u79FB\u52D5\u7126\u9EDE","\u6309 Tab \u73FE\u5728\u6703\u5C07\u7126\u9EDE\u79FB\u81F3\u4E0B\u4E00\u500B\u53EF\u8A2D\u5B9A\u7126\u9EDE\u7684\u5143\u7D20\u3002","\u6309 Tab \u73FE\u5728\u6703\u63D2\u5165\u5B9A\u4F4D\u5B57\u5143\u3002"],"vs/editor/contrib/tokenization/tokenization":["\u958B\u767C\u4EBA\u54E1: \u5F37\u5236\u91CD\u65B0\u7F6E\u653E"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143","\u5075\u6E2C\u5230\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143","\u6B64\u6A94\u6848\u5305\u542B\u4E00\u6216\u591A\u500B\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\uFF0C\u4F8B\u5982\u884C\u5206\u9694\u7B26\u865F (LS) \u6216\u6BB5\u843D\u5206\u9694\u7B26\u865F (PS)\u3002\r\n\r\n\u5EFA\u8B70\u60A8\u5C07\u5176\u5F9E\u6A94\u6848\u4E2D\u79FB\u9664\u3002\u9019\u53EF\u4EE5\u900F\u904E `editor.unusualLineTerminators` \u9032\u884C\u8A2D\u5B9A\u3002","\u4FEE\u6B63\u6B64\u6A94\u6848","\u5FFD\u7565\u6B64\u6A94\u6848\u7684\u554F\u984C"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\u8B80\u53D6\u6B0A\u9650\u671F\u9593 (\u5982\u8B80\u53D6\u8B8A\u6578) \u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5BEB\u5165\u6B0A\u9650\u671F\u9593 (\u5982\u5BEB\u5165\u8B8A\u6578) \u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u8B80\u53D6\u5B58\u53D6\u671F\u9593 (\u4F8B\u5982\u8B80\u53D6\u8B8A\u6578\u6642) \u7B26\u865F\u7684\u908A\u6846\u984F\u8272\u3002","\u5BEB\u5165\u5B58\u53D6\u671F\u9593 (\u4F8B\u5982\u5BEB\u5165\u8B8A\u6578\u6642) \u7B26\u865F\u7684\u908A\u6846\u984F\u8272\u3002 ","\u7B26\u865F\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5BEB\u5165\u6B0A\u9650\u7B26\u865F\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u79FB\u81F3\u4E0B\u4E00\u500B\u53CD\u767D\u7B26\u865F","\u79FB\u81F3\u4E0A\u4E00\u500B\u53CD\u767D\u7B26\u865F","\u89F8\u767C\u7B26\u865F\u53CD\u767D\u986F\u793A"],"vs/editor/contrib/wordOperations/wordOperations":["\u522A\u9664\u5B57\u7D44"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["\u9810\u8A2D\u8A9E\u8A00\u7D44\u614B\u8986\u5BEB","\u8A2D\u5B9A\u8981\u91DD\u5C0D\u8A9E\u8A00\u8986\u5BEB\u7684\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u3002","\u9019\u500B\u8A2D\u5B9A\u4E0D\u652F\u63F4\u4EE5\u8A9E\u8A00\u70BA\u6839\u64DA\u7684\u7D44\u614B\u3002","\u7121\u6CD5\u8A3B\u518A\u7A7A\u767D\u5C6C\u6027","\u7121\u6CD5\u8A3B\u518A '{0}'\u3002\u9019\u7B26\u5408\u7528\u65BC\u63CF\u8FF0\u8A9E\u8A00\u5C08\u7528\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u7684\u5C6C\u6027\u6A21\u5F0F '\\\\[.*\\\\]$'\u3002\u8ACB\u4F7F\u7528 'configurationDefaults' \u8CA2\u737B\u3002","\u7121\u6CD5\u8A3B\u518A '{0}'\u3002\u6B64\u5C6C\u6027\u5DF2\u7D93\u8A3B\u518A\u3002"],"vs/platform/contextkey/browser/contextKeyService":["\u50B3\u56DE\u6709\u95DC\u5167\u5BB9\u7D22\u5F15\u9375\u8CC7\u8A0A\u7684\u547D\u4EE4"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["\u5DF2\u6309\u4E0B ({0})\u3002\u7B49\u5F85\u7B2C\u4E8C\u500B\u5957\u7D22\u9375...","\u6309\u9375\u7D44\u5408 ({0}, {1}) \u4E0D\u662F\u547D\u4EE4\u3002"],"vs/platform/list/browser/listService":["\u5DE5\u4F5C\u53F0","\u5C0D\u61C9Windows\u548CLinux\u7684'Control'\u8207\u5C0D\u61C9 macOS \u7684'Command'\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Alt'\u8207\u5C0D\u61C9macOS\u7684'Option'\u3002","\u900F\u904E\u6ED1\u9F20\u591A\u9078\uFF0C\u7528\u65BC\u5728\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u4E2D\u65B0\u589E\u9805\u76EE\u7684\u8F14\u52A9\u6309\u9375 (\u4F8B\u5982\u5728\u7E3D\u7BA1\u4E2D\u958B\u555F\u7DE8\u8F2F\u5668 \u53CA SCM \u6AA2\u8996)\u3002'\u5728\u5074\u908A\u958B\u555F' \u6ED1\u9F20\u624B\u52E2 (\u82E5\u652F\u63F4) \u5C07\u6703\u9069\u61C9\u4EE5\u907F\u514D\u548C\u591A\u9078\u8F14\u52A9\u6309\u9375\u885D\u7A81\u3002","\u63A7\u5236\u5982\u4F55\u4F7F\u7528\u6ED1\u9F20 (\u5982\u652F\u63F4\u6B64\u7528\u6CD5) \u958B\u555F\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u4E2D\u7684\u9805\u76EE\u3002\u82E5\u4E0D\u9069\u7528\uFF0C\u67D0\u4E9B\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u53EF\u80FD\u6703\u9078\u64C7\u5FFD\u7565\u6B64\u8A2D\u5B9A\u3002","\u63A7\u5236\u5728\u5DE5\u4F5C\u53F0\u4E2D\uFF0C\u6E05\u55AE\u8207\u6A39\u72C0\u7D50\u69CB\u662F\u5426\u652F\u63F4\u6C34\u5E73\u6372\u52D5\u3002\u8B66\u544A: \u958B\u555F\u6B64\u8A2D\u5B9A\u5C07\u6703\u5F71\u97FF\u6548\u80FD\u3002","\u63A7\u5236\u6A39\u72C0\u7D50\u69CB\u7E2E\u6392 (\u50CF\u7D20)\u3002","\u63A7\u5236\u6A39\u7CFB\u662F\u5426\u61C9\u8F49\u8B6F\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u662F\u5426\u5177\u6709\u5E73\u6ED1\u6372\u52D5\u3002","\u6BD4\u5C0D\u6309\u9375\u8F38\u5165\u7684\u7C21\u6613\u6309\u9375\u700F\u89BD\u7126\u9EDE\u5143\u7D20\u3002\u50C5\u6BD4\u5C0D\u524D\u7F6E\u8A5E\u3002","\u9192\u76EE\u63D0\u793A\u9375\u76E4\u700F\u89BD\u6703\u9192\u76EE\u63D0\u793A\u7B26\u5408\u9375\u76E4\u8F38\u5165\u7684\u5143\u7D20\u3002\u9032\u4E00\u6B65\u5411\u4E0A\u6216\u5411\u4E0B\u700F\u89BD\u53EA\u6703\u5468\u904A\u9192\u76EE\u63D0\u793A\u7684\u5143\u7D20\u3002","\u7BE9\u9078\u9375\u76E4\u700F\u89BD\u6703\u7BE9\u6389\u4E26\u96B1\u85CF\u4E0D\u7B26\u5408\u9375\u76E4\u8F38\u5165\u7684\u6240\u6709\u5143\u7D20\u3002","\u63A7\u5236 Workbench \u4E2D\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u7684\u9375\u76E4\u700F\u89BD\u6A23\u5F0F\u3002\u53EF\u4EE5\u662F\u7C21\u6613\u7684\u3001\u9192\u76EE\u63D0\u793A\u548C\u7BE9\u9078\u3002","\u63A7\u5236\u662F\u5426\u53EA\u8981\u9375\u5165\u5373\u53EF\u81EA\u52D5\u89F8\u767C\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u7684\u9375\u76E4\u700F\u89BD\u3002\u82E5\u8A2D\u70BA `false`\uFF0C\u53EA\u6709\u5728\u57F7\u884C `list.toggleKeyboardNavigation` \u547D\u4EE4\u6642\uFF0C\u624D\u6703\u89F8\u767C\u9375\u76E4\u700F\u89BD\uFF0C\u60A8\u53EF\u70BA\u5176\u6307\u5B9A\u9375\u76E4\u5FEB\u901F\u9375\u3002","\u63A7\u5236\u7576\u6309\u4E0B\u8CC7\u6599\u593E\u540D\u7A31\u6642\uFF0C\u6A39\u72C0\u76EE\u9304\u8CC7\u6599\u593E\u7684\u5C55\u958B\u65B9\u5F0F\u3002\u8ACB\u6CE8\u610F\uFF0C\u82E5\u4E0D\u9069\u7528\uFF0C\u67D0\u4E9B\u6A39\u72C0\u76EE\u9304\u548C\u6E05\u55AE\u53EF\u80FD\u6703\u9078\u64C7\u5FFD\u7565\u6B64\u8A2D\u5B9A\u3002"],"vs/platform/markers/common/markers":["\u932F\u8AA4","\u8B66\u544A","\u8CC7\u8A0A"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\u6700\u8FD1\u4F7F\u7528\u7684","\u5176\u4ED6\u547D\u4EE4","\u547D\u4EE4 '{0}' \u9020\u6210\u932F\u8AA4 ({1})"],"vs/platform/quickinput/browser/helpQuickAccess":["\u5168\u57DF\u547D\u4EE4","\u7DE8\u8F2F\u5668\u547D\u4EE4","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\u6574\u9AD4\u7684\u524D\u666F\u8272\u5F69\u3002\u50C5\u7576\u672A\u88AB\u4EFB\u4F55\u5143\u4EF6\u8986\u758A\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u6B64\u8272\u5F69\u3002","\u6574\u9AD4\u932F\u8AA4\u8A0A\u606F\u7684\u524D\u666F\u8272\u5F69\u3002\u50C5\u7576\u672A\u88AB\u4EFB\u4F55\u5143\u4EF6\u8986\u84CB\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u6B64\u8272\u5F69\u3002","\u5DE5\u4F5C\u53F0\u4E2D\u5716\u793A\u7684\u9810\u8A2D\u8272\u5F69\u3002","\u7126\u9EDE\u9805\u76EE\u7684\u6574\u9AD4\u6846\u7DDA\u8272\u5F69\u3002\u53EA\u5728\u6C92\u6709\u4EFB\u4F55\u5143\u4EF6\u8986\u5BEB\u6B64\u8272\u5F69\u6642\uFF0C\u624D\u6703\u52A0\u4EE5\u4F7F\u7528\u3002","\u9805\u76EE\u5468\u570D\u7684\u984D\u5916\u6846\u7DDA\uFF0C\u53EF\u5C07\u9805\u76EE\u5F9E\u5176\u4ED6\u9805\u76EE\u4E2D\u5340\u9694\u51FA\u4F86\u4EE5\u63D0\u9AD8\u5C0D\u6BD4\u3002","\u4F7F\u7528\u4E2D\u9805\u76EE\u5468\u570D\u7684\u984D\u5916\u908A\u754C\uFF0C\u53EF\u5C07\u9805\u76EE\u5F9E\u5176\u4ED6\u9805\u76EE\u4E2D\u5340\u9694\u51FA\u4F86\u4EE5\u63D0\u9AD8\u5C0D\u6BD4\u3002","\u5167\u6587\u9023\u7D50\u7684\u524D\u666F\u8272\u5F69","\u6587\u5B57\u5340\u584A\u7684\u80CC\u666F\u984F\u8272\u3002","\u5C0F\u5DE5\u5177\u7684\u9670\u5F71\u8272\u5F69\uFF0C\u4F8B\u5982\u7DE8\u8F2F\u5668\u4E2D\u7684\u5C0B\u627E/\u53D6\u4EE3\u3002","\u8F38\u5165\u65B9\u584A\u7684\u80CC\u666F\u3002","\u8F38\u5165\u65B9\u584A\u7684\u524D\u666F\u3002","\u8F38\u5165\u65B9\u584A\u7684\u6846\u7DDA\u3002","\u8F38\u5165\u6B04\u4F4D\u4E2D\u53EF\u4F7F\u7528\u4E4B\u9805\u76EE\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u5728\u8F38\u5165\u6B04\u4F4D\u4E2D\u6240\u555F\u52D5\u9078\u9805\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u8F38\u5165\u6B04\u4F4D\u4E2D\u6240\u555F\u52D5\u9078\u9805\u7684\u524D\u666F\u8272\u5F69\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u4E0B\u62C9\u5F0F\u6E05\u55AE\u7684\u80CC\u666F\u3002","\u4E0B\u62C9\u5F0F\u6E05\u55AE\u7684\u524D\u666F\u3002","\u6309\u9215\u524D\u666F\u8272\u5F69\u3002","\u6309\u9215\u80CC\u666F\u8272\u5F69\u3002","\u66AB\u7559\u6642\u7684\u6309\u9215\u80CC\u666F\u8272\u5F69\u3002","\u6A19\u8A18\u7684\u80CC\u666F\u984F\u8272\u3002\u6A19\u8A18\u70BA\u5C0F\u578B\u7684\u8A0A\u606F\u6A19\u7C64,\u4F8B\u5982\u641C\u5C0B\u7D50\u679C\u7684\u6578\u91CF\u3002","\u6A19\u8A18\u7684\u524D\u666F\u984F\u8272\u3002\u6A19\u8A18\u70BA\u5C0F\u578B\u7684\u8A0A\u606F\u6A19\u7C64,\u4F8B\u5982\u641C\u5C0B\u7D50\u679C\u7684\u6578\u91CF\u3002","\u6307\u51FA\u5728\u6372\u52D5\u8A72\u6AA2\u8996\u7684\u6372\u8EF8\u9670\u5F71\u3002","\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u52D5\u614B\u986F\u793A\u6642\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u7576\u9EDE\u64CA\u6642\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u9577\u6642\u9593\u904B\u884C\u9032\u5EA6\u689D\u7684\u80CC\u666F\u8272\u5F69.","\u7DE8\u8F2F\u5668\u4E2D\u932F\u8AA4\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u932F\u8AA4\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69.","\u7DE8\u8F2F\u5668\u4E2D\u932F\u8AA4\u65B9\u584A\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u8B66\u544A\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u8B66\u544A\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69.","\u7DE8\u8F2F\u5668\u4E2D\u7684\u8B66\u544A\u65B9\u584A\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u8CC7\u8A0A\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u8CC7\u8A0A\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69","\u7DE8\u8F2F\u5668\u4E2D\u7684\u8CC7\u8A0A\u65B9\u584A\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5167\u63D0\u793A\u8A0A\u606F\u7684\u63D0\u793A\u7DDA\u524D\u666F\u8272\u5F69","\u7DE8\u8F2F\u5668\u4E2D\u7684\u63D0\u793A\u65B9\u584A\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7684\u9810\u8A2D\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u4F8B\u5982\u5C0B\u627E/\u53D6\u4EE3\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177 (\u4F8B\u5982\u5C0B\u627E/\u53D6\u4EE3) \u7684\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u7684\u908A\u754C\u8272\u5F69\u3002\u5C0F\u5DE5\u5177\u9078\u64C7\u64C1\u6709\u908A\u754C\u6216\u8272\u5F69\u672A\u88AB\u5C0F\u5DE5\u5177\u8986\u5BEB\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u4E4B\u8ABF\u6574\u5927\u5C0F\u5217\u7684\u908A\u754C\u8272\u5F69\u3002\u53EA\u5728\u5C0F\u5DE5\u5177\u9078\u64C7\u5177\u6709\u8ABF\u6574\u5927\u5C0F\u908A\u754C\u4E14\u672A\u8986\u5BEB\u8A72\u8272\u5F69\u6642\uFF0C\u624D\u4F7F\u7528\u8A72\u8272\u5F69\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u80CC\u666F\u8272\u5F69\u3002\u8A72\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7684\u9078\u64C7\u5668\u5BB9\u5668\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u524D\u666F\u8272\u5F69\u3002\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7B49\u9078\u64C7\u5668\u7684\u5BB9\u5668\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u6A19\u984C\u80CC\u666F\u8272\u5F69\u3002\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7684\u9078\u64C7\u5668\u5BB9\u5668\u3002","\u7126\u9EDE\u9805\u76EE\u7684\u5FEB\u901F\u9078\u64C7\u5668\u80CC\u666F\u8272\u5F69\u3002","\u5206\u7D44\u6A19\u7C64\u7684\u5FEB\u901F\u9078\u64C7\u5668\u8272\u5F69\u3002","\u5206\u7D44\u908A\u754C\u7684\u5FEB\u901F\u9078\u64C7\u5668\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u7684\u8272\u5F69\u3002","\u70BA\u9078\u53D6\u7684\u6587\u5B57\u984F\u8272\u9AD8\u5C0D\u6BD4\u5316","\u975E\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u5167\u7684\u9078\u53D6\u9805\u76EE\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u8207\u9078\u53D6\u9805\u76EE\u5167\u5BB9\u76F8\u540C\u4E4B\u5340\u57DF\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9078\u53D6\u6642\uFF0C\u5167\u5BB9\u76F8\u540C\u4E4B\u5340\u57DF\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7B26\u5408\u76EE\u524D\u641C\u5C0B\u7684\u8272\u5F69\u3002","\u5176\u4ED6\u641C\u5C0B\u76F8\u7B26\u9805\u76EE\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9650\u5236\u641C\u5C0B\u4E4B\u7BC4\u570D\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7B26\u5408\u76EE\u524D\u641C\u5C0B\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7B26\u5408\u5176\u4ED6\u641C\u5C0B\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u9650\u5236\u641C\u5C0B\u4E4B\u7BC4\u570D\u7684\u6846\u7DDA\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5728\u986F\u793A\u52D5\u614B\u986F\u793A\u7684\u6587\u5B57\u4E0B\u9192\u76EE\u63D0\u793A\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u66AB\u7559\u72C0\u614B\u5217\u7684\u80CC\u666F\u8272\u5F69\u3002","\u4F7F\u7528\u4E2D\u4E4B\u9023\u7D50\u7684\u8272\u5F69\u3002","\u5167\u5D4C\u63D0\u793A\u7684\u524D\u666F\u8272\u5F69","\u5167\u5D4C\u63D0\u793A\u7684\u80CC\u666F\u8272\u5F69","\u7528\u65BC\u71C8\u6CE1\u52D5\u4F5C\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u71C8\u6CE1\u81EA\u52D5\u4FEE\u6B63\u52D5\u4F5C\u5716\u793A\u7684\u8272\u5F69\u3002","\u5DF2\u63D2\u5165\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5DF2\u79FB\u9664\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u63D2\u5165\u7684\u6587\u5B57\u5916\u6846\u8272\u5F69\u3002","\u79FB\u9664\u7684\u6587\u5B57\u5916\u6846\u8272\u5F69\u3002","\u5169\u500B\u6587\u5B57\u7DE8\u8F2F\u5668\u4E4B\u9593\u7684\u6846\u7DDA\u8272\u5F69\u3002","Diff \u7DE8\u8F2F\u5668\u7684\u659C\u7D0B\u586B\u6EFF\u8272\u5F69\u3002\u659C\u7D0B\u586B\u6EFF\u7528\u65BC\u4E26\u6392 Diff \u6AA2\u8996\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u5916\u6846\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u5916\u6846\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u4F7F\u7528\u6ED1\u9F20\u66AB\u7559\u5728\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u3002","\u6ED1\u9F20\u66AB\u7559\u5728\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u3002","\u4F7F\u7528\u6ED1\u9F20\u56DB\u8655\u79FB\u52D5\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u62D6\u653E\u80CC\u666F\u3002","\u5728\u6E05\u55AE/\u6A39\u72C0\u5167\u641C\u5C0B\u6642\uFF0C\u76F8\u7B26\u9192\u76EE\u63D0\u793A\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002","\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\u3002","\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u5927\u7DB1\u8272\u5F69\u3002","\u5728\u6C92\u6709\u76F8\u7B26\u9805\u76EE\u6642\uFF0C\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u5927\u7DB1\u8272\u5F69\u3002","\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u6A39\u72C0\u7B46\u89F8\u8272\u5F69\u3002","\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u6A39\u72C0\u7B46\u89F8\u8272\u5F69\u3002","\u529F\u80FD\u8868\u7684\u908A\u6846\u8272\u5F69\u3002","\u529F\u80FD\u8868\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u5206\u9694\u7DDA\u529F\u80FD\u8868\u9805\u76EE\u7684\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u908A\u754C\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6700\u7D42\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6700\u7D42\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u9192\u76EE\u63D0\u793A\u6846\u7DDA\u8272\u5F69\u3002","\u5C0B\u627E\u76F8\u7B26\u9805\u76EE\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9078\u53D6\u9805\u76EE\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7528\u65BC\u5C0B\u627E\u76F8\u7B26\u9805\u76EE\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u7684\u8FF7\u4F60\u5730\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u932F\u8AA4\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u8B66\u544A\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u7E2E\u5716\u80CC\u666F\u8272\u5F69\u3002","\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u66AB\u7559\u6642\u7684\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u6309\u4E00\u4E0B\u6642\u7684\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u932F\u8AA4\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u8B66\u544A\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u8CC7\u8A0A\u5716\u793A\u7684\u8272\u5F69\u3002"],"vs/platform/theme/common/iconRegistry":["\u8981\u4F7F\u7528\u7684\u5B57\u578B\u8B58\u5225\u78BC\u3002\u5982\u672A\u8A2D\u5B9A\uFF0C\u5C31\u6703\u4F7F\u7528\u6700\u5148\u5B9A\u7FA9\u7684\u5B57\u578B\u3002","\u8207\u5716\u793A\u5B9A\u7FA9\u5EFA\u7ACB\u95DC\u806F\u7684\u5B57\u578B\u5B57\u5143\u3002","\u5C0F\u5DE5\u5177\u4E2D\u95DC\u9589\u52D5\u4F5C\u7684\u5716\u793A\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u5DF2\u5728\u78C1\u789F\u4E0A\u95DC\u9589\u4E26\u4FEE\u6539\u4EE5\u4E0B\u6A94\u6848: {0}\u3002","\u4E0B\u5217\u6A94\u6848\u5DF2\u4F7F\u7528\u4E0D\u76F8\u5BB9\u7684\u65B9\u5F0F\u4FEE\u6539: {0}\u3002","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u56E0\u70BA\u5DF2\u5C0D {1} \u9032\u884C\u8B8A\u66F4\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'","\u56E0\u70BA {1} \u4E2D\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u5FA9\u539F '{0}'","\u56E0\u70BA\u540C\u6642\u767C\u751F\u5176\u4ED6\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u5FA9\u539F '{0}'","\u8981\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}' \u55CE?","\u5728 {0} \u500B\u6A94\u6848\u4E2D\u5FA9\u539F","\u5FA9\u539F\u6B64\u6A94\u6848","\u53D6\u6D88","\u56E0\u70BA\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F '{0}'\u3002","\u8981\u5FA9\u539F '{0}' \u55CE?","\u5FA9\u539F","\u53D6\u6D88","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u56E0\u70BA\u5DF2\u5C0D {1} \u9032\u884C\u8B8A\u66F4\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'","\u56E0\u70BA {1} \u4E2D\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u91CD\u505A '{0}'","\u56E0\u70BA\u540C\u6642\u767C\u751F\u5176\u4ED6\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u91CD\u505A '{0}'","\u56E0\u70BA\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u91CD\u505A '{0}'\u3002"]}); diff --git a/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/language/css/cssMode.js b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/language/css/cssMode.js new file mode 100644 index 0000000000..c4b71c0cd5 --- /dev/null +++ b/yudao-server/src/main/resources/admin-ui/libs/monaco-editor/vs/language/css/cssMode.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-css version: 3.3.0(ed57760e69ec24098de2b4e49fa5be7f48be019a) + * Released under the MIT license + * https://github.com/Microsoft/monaco-css/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/language/css/workerManager",["require","exports","./fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkerManager=void 0;var r=function(){function e(e){var t=this;this._defaults=e,this._worker=null,this._idleCheckInterval=window.setInterval((function(){return t._checkIfIdle()}),3e4),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange((function(){return t._stopWorker()}))}return e.prototype._stopWorker=function(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null},e.prototype.dispose=function(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()},e.prototype._checkIfIdle=function(){this._worker&&(Date.now()-this._lastUsedTime>12e4&&this._stopWorker())},e.prototype._getClient=function(){return this._lastUsedTime=Date.now(),this._client||(this._worker=n.editor.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{languageSettings:this._defaults.diagnosticsOptions,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client},e.prototype.getLanguageServiceWorker=function(){for(var e,t=this,n=[],r=0;rthis.source.length)return!1;for(var t=0;t=d&&e<=p&&(this.stream.advance(t+1),this.stream.advanceWhileChar((function(e){return e>=d&&e<=p||0===t&&e===V})),!0)},e.prototype._newline=function(e){var t=this.stream.peekChar();switch(t){case _:case P:case R:return this.stream.advance(1),e.push(String.fromCharCode(t)),t===_&&this.stream.advanceIfChar(R)&&e.push("\n"),!0}return!1},e.prototype._escape=function(e,t){var n=this.stream.peekChar();if(n===F){this.stream.advance(1),n=this.stream.peekChar();for(var r=0;r<6&&(n>=d&&n<=p||n>=i&&n<=o||n>=a&&n<=l);)this.stream.advance(1),n=this.stream.peekChar(),r++;if(r>0){try{var s=parseInt(this.stream.substring(this.stream.pos()-r),16);s&&e.push(String.fromCharCode(s))}catch(e){}return n===N||n===M?this.stream.advance(1):this._newline([]),!0}if(n!==_&&n!==P&&n!==R)return this.stream.advance(1),e.push(String.fromCharCode(n)),!0;if(t)return this._newline(e)}return!1},e.prototype._stringChar=function(e,t){var n=this.stream.peekChar();return 0!==n&&n!==e&&n!==F&&n!==_&&n!==P&&n!==R&&(this.stream.advance(1),t.push(String.fromCharCode(n)),!0)},e.prototype._string=function(e){if(this.stream.peekChar()===I||this.stream.peekChar()===z){var t=this.stream.nextChar();for(e.push(String.fromCharCode(t));this._stringChar(t,e)||this._escape(e,!0););return this.stream.peekChar()===t?(this.stream.nextChar(),e.push(String.fromCharCode(t)),n.String):n.BadString}return null},e.prototype._unquotedChar=function(e){var t=this.stream.peekChar();return 0!==t&&t!==F&&t!==I&&t!==z&&t!==w&&t!==x&&t!==N&&t!==M&&t!==R&&t!==P&&t!==_&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._unquotedString=function(e){for(var t=!1;this._unquotedChar(e)||this._escape(e);)t=!0;return t},e.prototype._whitespace=function(){return this.stream.advanceWhileChar((function(e){return e===N||e===M||e===R||e===P||e===_}))>0},e.prototype._name=function(e){for(var t=!1;this._identChar(e)||this._escape(e);)t=!0;return t},e.prototype.ident=function(e){var t=this.stream.pos();if(this._minus(e)&&this._minus(e)){if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}}else if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}return this.stream.goBackTo(t),!1},e.prototype._identFirstChar=function(e){var t=this.stream.peekChar();return(t===b||t>=i&&t<=s||t>=a&&t<=c||t>=128&&t<=65535)&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._minus=function(e){var t=this.stream.peekChar();return t===g&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._identChar=function(e){var t=this.stream.peekChar();return(t===b||t===g||t>=i&&t<=s||t>=a&&t<=c||t>=d&&t<=p||t>=128&&t<=65535)&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e}();t.Scanner=G})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/utils/strings",["require","exports"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.trim=t.getLimitedString=t.difference=t.endsWith=t.startsWith=void 0,t.startsWith=function(e,t){if(e.length0?e.lastIndexOf(t)===n:0===n&&e===t},t.difference=function(e,t,n){void 0===n&&(n=4);var r=Math.abs(e.length-t.length);if(r>n)return 0;var i,o,s=[],a=[];for(i=0;ie.end?null:(e.accept((function(e){return-1===e.offset&&-1===e.length||e.offset<=t&&e.end>=t&&(n?e.length<=n.length&&(n=e):n=e,!0)})),n)}!function(e){e[e.Undefined=0]="Undefined",e[e.Identifier=1]="Identifier",e[e.Stylesheet=2]="Stylesheet",e[e.Ruleset=3]="Ruleset",e[e.Selector=4]="Selector",e[e.SimpleSelector=5]="SimpleSelector",e[e.SelectorInterpolation=6]="SelectorInterpolation",e[e.SelectorCombinator=7]="SelectorCombinator",e[e.SelectorCombinatorParent=8]="SelectorCombinatorParent",e[e.SelectorCombinatorSibling=9]="SelectorCombinatorSibling",e[e.SelectorCombinatorAllSiblings=10]="SelectorCombinatorAllSiblings",e[e.SelectorCombinatorShadowPiercingDescendant=11]="SelectorCombinatorShadowPiercingDescendant",e[e.Page=12]="Page",e[e.PageBoxMarginBox=13]="PageBoxMarginBox",e[e.ClassSelector=14]="ClassSelector",e[e.IdentifierSelector=15]="IdentifierSelector",e[e.ElementNameSelector=16]="ElementNameSelector",e[e.PseudoSelector=17]="PseudoSelector",e[e.AttributeSelector=18]="AttributeSelector",e[e.Declaration=19]="Declaration",e[e.Declarations=20]="Declarations",e[e.Property=21]="Property",e[e.Expression=22]="Expression",e[e.BinaryExpression=23]="BinaryExpression",e[e.Term=24]="Term",e[e.Operator=25]="Operator",e[e.Value=26]="Value",e[e.StringLiteral=27]="StringLiteral",e[e.URILiteral=28]="URILiteral",e[e.EscapedValue=29]="EscapedValue",e[e.Function=30]="Function",e[e.NumericValue=31]="NumericValue",e[e.HexColorValue=32]="HexColorValue",e[e.MixinDeclaration=33]="MixinDeclaration",e[e.MixinReference=34]="MixinReference",e[e.VariableName=35]="VariableName",e[e.VariableDeclaration=36]="VariableDeclaration",e[e.Prio=37]="Prio",e[e.Interpolation=38]="Interpolation",e[e.NestedProperties=39]="NestedProperties",e[e.ExtendsReference=40]="ExtendsReference",e[e.SelectorPlaceholder=41]="SelectorPlaceholder",e[e.Debug=42]="Debug",e[e.If=43]="If",e[e.Else=44]="Else",e[e.For=45]="For",e[e.Each=46]="Each",e[e.While=47]="While",e[e.MixinContentReference=48]="MixinContentReference",e[e.MixinContentDeclaration=49]="MixinContentDeclaration",e[e.Media=50]="Media",e[e.Keyframe=51]="Keyframe",e[e.FontFace=52]="FontFace",e[e.Import=53]="Import",e[e.Namespace=54]="Namespace",e[e.Invocation=55]="Invocation",e[e.FunctionDeclaration=56]="FunctionDeclaration",e[e.ReturnStatement=57]="ReturnStatement",e[e.MediaQuery=58]="MediaQuery",e[e.FunctionParameter=59]="FunctionParameter",e[e.FunctionArgument=60]="FunctionArgument",e[e.KeyframeSelector=61]="KeyframeSelector",e[e.ViewPort=62]="ViewPort",e[e.Document=63]="Document",e[e.AtApplyRule=64]="AtApplyRule",e[e.CustomPropertyDeclaration=65]="CustomPropertyDeclaration",e[e.CustomPropertySet=66]="CustomPropertySet",e[e.ListEntry=67]="ListEntry",e[e.Supports=68]="Supports",e[e.SupportsCondition=69]="SupportsCondition",e[e.NamespacePrefix=70]="NamespacePrefix",e[e.GridLine=71]="GridLine",e[e.Plugin=72]="Plugin",e[e.UnknownAtRule=73]="UnknownAtRule",e[e.Use=74]="Use",e[e.ModuleConfiguration=75]="ModuleConfiguration",e[e.Forward=76]="Forward",e[e.ForwardVisibility=77]="ForwardVisibility",e[e.Module=78]="Module"}(n=t.NodeType||(t.NodeType={})),function(e){e[e.Mixin=0]="Mixin",e[e.Rule=1]="Rule",e[e.Variable=2]="Variable",e[e.Function=3]="Function",e[e.Keyframe=4]="Keyframe",e[e.Unknown=5]="Unknown",e[e.Module=6]="Module",e[e.Forward=7]="Forward",e[e.ForwardVisibility=8]="ForwardVisibility"}(t.ReferenceType||(t.ReferenceType={})),t.getNodeAtOffset=i,t.getNodePath=function(e,t){for(var n=i(e,t),r=[];n;)r.unshift(n),n=n.parent;return r},t.getParentDeclaration=function(e){var t=e.findParent(n.Declaration),r=t&&t.getValue();return r&&r.encloses(e)?t:null};var o=function(){function e(e,t,n){void 0===e&&(e=-1),void 0===t&&(t=-1),this.parent=null,this.offset=e,this.length=t,n&&(this.nodeType=n)}return Object.defineProperty(e.prototype,"end",{get:function(){return this.offset+this.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this.nodeType||n.Undefined},set:function(e){this.nodeType=e},enumerable:!1,configurable:!0}),e.prototype.getTextProvider=function(){for(var e=this;e&&!e.textProvider;)e=e.parent;return e?e.textProvider:function(){return"unknown"}},e.prototype.getText=function(){return this.getTextProvider()(this.offset,this.length)},e.prototype.matches=function(e){return this.length===e.length&&this.getTextProvider()(this.offset,this.length)===e},e.prototype.startsWith=function(e){return this.length>=e.length&&this.getTextProvider()(this.offset,e.length)===e},e.prototype.endsWith=function(e){return this.length>=e.length&&this.getTextProvider()(this.end-e.length,e.length)===e},e.prototype.accept=function(e){if(e(this)&&this.children)for(var t=0,n=this.children;t=0&&e.parent.children.splice(n,1)}e.parent=this;var r=this.children;return r||(r=this.children=[]),-1!==t?r.splice(t,0,e):r.push(e),e},e.prototype.attachTo=function(e,t){return void 0===t&&(t=-1),e&&e.adoptChild(this,t),this},e.prototype.collectIssues=function(e){this.issues&&e.push.apply(e,this.issues)},e.prototype.addIssue=function(e){this.issues||(this.issues=[]),this.issues.push(e)},e.prototype.hasIssue=function(e){return Array.isArray(this.issues)&&this.issues.some((function(t){return t.getRule()===e}))},e.prototype.isErroneous=function(e){return void 0===e&&(e=!1),!!(this.issues&&this.issues.length>0)||e&&Array.isArray(this.children)&&this.children.some((function(e){return e.isErroneous(!0)}))},e.prototype.setNode=function(e,t,n){return void 0===n&&(n=-1),!!t&&(t.attachTo(this,n),this[e]=t,!0)},e.prototype.addChild=function(e){return!!e&&(this.children||(this.children=[]),e.attachTo(this),this.updateOffsetAndLength(e),!0)},e.prototype.updateOffsetAndLength=function(e){(e.offsetthis.end||-1===this.length)&&(this.length=t-this.offset)},e.prototype.hasChildren=function(){return!!this.children&&this.children.length>0},e.prototype.getChildren=function(){return this.children?this.children.slice(0):[]},e.prototype.getChild=function(e){return this.children&&e=0;n--)if((t=this.children[n]).offset<=e)return t;return null},e.prototype.findChildAtOffset=function(e,t){var n=this.findFirstChildBeforeOffset(e);return n&&n.end>=e?t&&n.findChildAtOffset(e,!0)||n:null},e.prototype.encloses=function(e){return this.offset<=e.offset&&this.offset+this.length>=e.offset+e.length},e.prototype.getParent=function(){for(var e=this.parent;e instanceof s;)e=e.parent;return e},e.prototype.findParent=function(e){for(var t=this;t&&t.type!==e;)t=t.parent;return t},e.prototype.findAParent=function(){for(var e=[],t=0;t/g,">")}function i(e,t){if(!e.description||""===e.description)return"";if("string"!=typeof e.description)return e.description.value;var r="";if(!1!==(null==t?void 0:t.documentation)){e.status&&(r+=n(e.status)),r+=e.description;var i=s(e.browsers);i&&(r+="\n("+i+")"),"syntax"in e&&(r+="\n\nSyntax: "+e.syntax)}return e.references&&e.references.length>0&&!1!==(null==t?void 0:t.references)&&(r.length>0&&(r+="\n\n"),r+=e.references.map((function(e){return e.name+": "+e.url})).join(" | ")),r}function o(e,t){if(!e.description||""===e.description)return"";var i="";if(!1!==(null==t?void 0:t.documentation)){e.status&&(i+=n(e.status)),i+=r("string"==typeof e.description?e.description:e.description.value);var o=s(e.browsers);o&&(i+="\n\n("+r(o)+")"),"syntax"in e&&e.syntax&&(i+="\n\nSyntax: "+r(e.syntax))}return e.references&&e.references.length>0&&!1!==(null==t?void 0:t.references)&&(i.length>0&&(i+="\n\n"),i+=e.references.map((function(e){return"["+e.name+"]("+e.url+")"})).join(" | ")),i}function s(e){return void 0===e&&(e=[]),0===e.length?null:e.map((function(e){var n="",r=e.match(/([A-Z]+)(\d+)?/),i=r[1],o=r[2];return i in t.browserNames&&(n+=t.browserNames[i]),o&&(n+=" "+o),n})).join(", ")}Object.defineProperty(t,"__esModule",{value:!0}),t.getBrowserLabel=t.textToMarkedString=t.getEntryDescription=t.browserNames=void 0,t.browserNames={E:"Edge",FF:"Firefox",S:"Safari",C:"Chrome",IE:"IE",O:"Opera"},t.getEntryDescription=function(e,t,n){var r;if(""!==(r=t?{kind:"markdown",value:o(e,n)}:{kind:"plaintext",value:i(e,n)}).value)return r},t.textToMarkedString=r,t.getBrowserLabel=s})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/languageFacts/colors",["require","exports","../parser/cssNodes","vscode-nls"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getColorValue=t.hslFromColor=t.colorFromHSL=t.colorFrom256RGB=t.colorFromHex=t.hexDigit=t.isColorValue=t.isColorConstructor=t.colorKeywords=t.colors=t.colorFunctions=void 0;var n=e("../parser/cssNodes"),r=e("vscode-nls").loadMessageBundle();function i(e,t){var n=e.getText().match(/^([-+]?[0-9]*\.?[0-9]+)(%?)$/);if(n){n[2]&&(t=100);var r=parseFloat(n[1])/t;if(r>=0&&r<=1)return r}throw new Error}function o(e){var t=e.getName();return!!t&&/^(rgb|rgba|hsl|hsla)$/gi.test(t)}t.colorFunctions=[{func:"rgb($red, $green, $blue)",desc:r("css.builtin.rgb","Creates a Color from red, green, and blue values.")},{func:"rgba($red, $green, $blue, $alpha)",desc:r("css.builtin.rgba","Creates a Color from red, green, blue, and alpha values.")},{func:"hsl($hue, $saturation, $lightness)",desc:r("css.builtin.hsl","Creates a Color from hue, saturation, and lightness values.")},{func:"hsla($hue, $saturation, $lightness, $alpha)",desc:r("css.builtin.hsla","Creates a Color from hue, saturation, lightness, and alpha values.")}],t.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},t.colorKeywords={currentColor:"The value of the 'color' property. The computed value of the 'currentColor' keyword is the computed value of the 'color' property. If the 'currentColor' keyword is set on the 'color' property itself, it is treated as 'color:inherit' at parse time.",transparent:"Fully transparent. This keyword can be considered a shorthand for rgba(0,0,0,0) which is its computed value."},t.isColorConstructor=o,t.isColorValue=function(e){if(e.type===n.NodeType.HexColorValue)return!0;if(e.type===n.NodeType.Function)return o(e);if(e.type===n.NodeType.Identifier){if(e.parent&&e.parent.type!==n.NodeType.Term)return!1;var r=e.getText().toLowerCase();if("none"===r)return!1;if(t.colors[r])return!0}return!1};function s(e){return e<48?0:e<=57?e-48:(e<97&&(e+=32),e>=97&&e<=102?e-97+10:0)}function a(e){if("#"!==e[0])return null;switch(e.length){case 4:return{red:17*s(e.charCodeAt(1))/255,green:17*s(e.charCodeAt(2))/255,blue:17*s(e.charCodeAt(3))/255,alpha:1};case 5:return{red:17*s(e.charCodeAt(1))/255,green:17*s(e.charCodeAt(2))/255,blue:17*s(e.charCodeAt(3))/255,alpha:17*s(e.charCodeAt(4))/255};case 7:return{red:(16*s(e.charCodeAt(1))+s(e.charCodeAt(2)))/255,green:(16*s(e.charCodeAt(3))+s(e.charCodeAt(4)))/255,blue:(16*s(e.charCodeAt(5))+s(e.charCodeAt(6)))/255,alpha:1};case 9:return{red:(16*s(e.charCodeAt(1))+s(e.charCodeAt(2)))/255,green:(16*s(e.charCodeAt(3))+s(e.charCodeAt(4)))/255,blue:(16*s(e.charCodeAt(5))+s(e.charCodeAt(6)))/255,alpha:(16*s(e.charCodeAt(7))+s(e.charCodeAt(8)))/255}}return null}function l(e,t,n,r){if(void 0===r&&(r=1),0===t)return{red:n,green:n,blue:n,alpha:r};var i=function(e,t,n){for(;n<0;)n+=6;for(;n>=6;)n-=6;return n<1?(t-e)*n+e:n<3?t:n<4?(t-e)*(4-n)+e:e},o=n<=.5?n*(t+1):n+t-n*t,s=2*n-o;return{red:i(s,o,(e/=60)+2),green:i(s,o,e),blue:i(s,o,e-2),alpha:r}}t.hexDigit=s,t.colorFromHex=a,t.colorFrom256RGB=function(e,t,n,r){return void 0===r&&(r=1),{red:e/255,green:t/255,blue:n/255,alpha:r}},t.colorFromHSL=l,t.hslFromColor=function(e){var t=e.red,n=e.green,r=e.blue,i=e.alpha,o=Math.max(t,n,r),s=Math.min(t,n,r),a=0,l=0,c=(s+o)/2,d=o-s;if(d>0){switch(l=Math.min(c<=.5?d/(2*c):d/(2-2*c),1),o){case t:a=(n-r)/d+(n4)return null;try{var c=4===s.length?i(s[3],1):1;if("rgb"===o||"rgba"===o)return{red:i(s[0],255),green:i(s[1],255),blue:i(s[2],255),alpha:c};if("hsl"===o||"hsla"===o)return l(function(e){var t=e.getText();if(t.match(/^([-+]?[0-9]*\.?[0-9]+)(deg)?$/))return parseFloat(t)%360;throw new Error}(s[0]),i(s[1],100),i(s[2],100),c)}catch(e){return null}}else if(e.type===n.NodeType.Identifier){if(e.parent&&e.parent.type!==n.NodeType.Term)return null;var d=e.parent;if(d&&d.parent&&d.parent.type===n.NodeType.BinaryExpression){var p=d.parent;if(p.parent&&p.parent.type===n.NodeType.ListEntry&&p.parent.key===p)return null}var h=e.getText().toLowerCase();if("none"===h)return null;var u=t.colors[h];if(u)return a(u)}return null}})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/languageFacts/builtinData",["require","exports"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.pageBoxDirectives=t.svgElements=t.html5Tags=t.units=t.basicShapeFunctions=t.transitionTimingFunctions=t.imageFunctions=t.cssWideKeywords=t.geometryBoxKeywords=t.boxKeywords=t.lineWidthKeywords=t.lineStyleKeywords=t.repeatStyleKeywords=t.positionKeywords=void 0,t.positionKeywords={bottom:"Computes to ‘100%’ for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.",center:"Computes to ‘50%’ (‘left 50%’) for the horizontal position if the horizontal position is not otherwise specified, or ‘50%’ (‘top 50%’) for the vertical position if it is.",left:"Computes to ‘0%’ for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.",right:"Computes to ‘100%’ for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.",top:"Computes to ‘0%’ for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset."},t.repeatStyleKeywords={"no-repeat":"Placed once and not repeated in this direction.",repeat:"Repeated in this direction as often as needed to cover the background painting area.","repeat-x":"Computes to ‘repeat no-repeat’.","repeat-y":"Computes to ‘no-repeat repeat’.",round:"Repeated as often as will fit within the background positioning area. If it doesn’t fit a whole number of times, it is rescaled so that it does.",space:"Repeated as often as will fit within the background positioning area without being clipped and then the images are spaced out to fill the area."},t.lineStyleKeywords={dashed:"A series of square-ended dashes.",dotted:"A series of round dots.",double:"Two parallel solid lines with some space between them.",groove:"Looks as if it were carved in the canvas.",hidden:"Same as ‘none’, but has different behavior in the border conflict resolution rules for border-collapsed tables.",inset:"Looks as if the content on the inside of the border is sunken into the canvas.",none:"No border. Color and width are ignored.",outset:"Looks as if the content on the inside of the border is coming out of the canvas.",ridge:"Looks as if it were coming out of the canvas.",solid:"A single line segment."},t.lineWidthKeywords=["medium","thick","thin"],t.boxKeywords={"border-box":"The background is painted within (clipped to) the border box.","content-box":"The background is painted within (clipped to) the content box.","padding-box":"The background is painted within (clipped to) the padding box."},t.geometryBoxKeywords={"margin-box":"Uses the margin box as reference box.","fill-box":"Uses the object bounding box as reference box.","stroke-box":"Uses the stroke bounding box as reference box.","view-box":"Uses the nearest SVG viewport as reference box."},t.cssWideKeywords={initial:"Represents the value specified as the property’s initial value.",inherit:"Represents the computed value of the property on the element’s parent.",unset:"Acts as either `inherit` or `initial`, depending on whether the property is inherited or not."},t.imageFunctions={"url()":"Reference an image file by URL","image()":"Provide image fallbacks and annotations.","-webkit-image-set()":"Provide multiple resolutions. Remember to use unprefixed image-set() in addition.","image-set()":"Provide multiple resolutions of an image and const the UA decide which is most appropriate in a given situation.","-moz-element()":"Use an element in the document as an image. Remember to use unprefixed element() in addition.","element()":"Use an element in the document as an image.","cross-fade()":"Indicates the two images to be combined and how far along in the transition the combination is.","-webkit-gradient()":"Deprecated. Use modern linear-gradient() or radial-gradient() instead.","-webkit-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-moz-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-o-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","linear-gradient()":"A linear gradient is created by specifying a straight gradient line, and then several colors placed along that line.","-webkit-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-moz-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-o-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","repeating-linear-gradient()":"Same as linear-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop’s position and the first specified color-stop’s position.","-webkit-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","-moz-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","radial-gradient()":"Colors emerge from a single point and smoothly spread outward in a circular or elliptical shape.","-webkit-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","-moz-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","repeating-radial-gradient()":"Same as radial-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop’s position and the first specified color-stop’s position."},t.transitionTimingFunctions={ease:"Equivalent to cubic-bezier(0.25, 0.1, 0.25, 1.0).","ease-in":"Equivalent to cubic-bezier(0.42, 0, 1.0, 1.0).","ease-in-out":"Equivalent to cubic-bezier(0.42, 0, 0.58, 1.0).","ease-out":"Equivalent to cubic-bezier(0, 0, 0.58, 1.0).",linear:"Equivalent to cubic-bezier(0.0, 0.0, 1.0, 1.0).","step-end":"Equivalent to steps(1, end).","step-start":"Equivalent to steps(1, start).","steps()":"The first parameter specifies the number of intervals in the function. The second parameter, which is optional, is either the value “start” or “end”.","cubic-bezier()":"Specifies a cubic-bezier curve. The four values specify points P1 and P2 of the curve as (x1, y1, x2, y2).","cubic-bezier(0.6, -0.28, 0.735, 0.045)":"Ease-in Back. Overshoots.","cubic-bezier(0.68, -0.55, 0.265, 1.55)":"Ease-in-out Back. Overshoots.","cubic-bezier(0.175, 0.885, 0.32, 1.275)":"Ease-out Back. Overshoots.","cubic-bezier(0.6, 0.04, 0.98, 0.335)":"Ease-in Circular. Based on half circle.","cubic-bezier(0.785, 0.135, 0.15, 0.86)":"Ease-in-out Circular. Based on half circle.","cubic-bezier(0.075, 0.82, 0.165, 1)":"Ease-out Circular. Based on half circle.","cubic-bezier(0.55, 0.055, 0.675, 0.19)":"Ease-in Cubic. Based on power of three.","cubic-bezier(0.645, 0.045, 0.355, 1)":"Ease-in-out Cubic. Based on power of three.","cubic-bezier(0.215, 0.610, 0.355, 1)":"Ease-out Cubic. Based on power of three.","cubic-bezier(0.95, 0.05, 0.795, 0.035)":"Ease-in Exponential. Based on two to the power ten.","cubic-bezier(1, 0, 0, 1)":"Ease-in-out Exponential. Based on two to the power ten.","cubic-bezier(0.19, 1, 0.22, 1)":"Ease-out Exponential. Based on two to the power ten.","cubic-bezier(0.47, 0, 0.745, 0.715)":"Ease-in Sine.","cubic-bezier(0.445, 0.05, 0.55, 0.95)":"Ease-in-out Sine.","cubic-bezier(0.39, 0.575, 0.565, 1)":"Ease-out Sine.","cubic-bezier(0.55, 0.085, 0.68, 0.53)":"Ease-in Quadratic. Based on power of two.","cubic-bezier(0.455, 0.03, 0.515, 0.955)":"Ease-in-out Quadratic. Based on power of two.","cubic-bezier(0.25, 0.46, 0.45, 0.94)":"Ease-out Quadratic. Based on power of two.","cubic-bezier(0.895, 0.03, 0.685, 0.22)":"Ease-in Quartic. Based on power of four.","cubic-bezier(0.77, 0, 0.175, 1)":"Ease-in-out Quartic. Based on power of four.","cubic-bezier(0.165, 0.84, 0.44, 1)":"Ease-out Quartic. Based on power of four.","cubic-bezier(0.755, 0.05, 0.855, 0.06)":"Ease-in Quintic. Based on power of five.","cubic-bezier(0.86, 0, 0.07, 1)":"Ease-in-out Quintic. Based on power of five.","cubic-bezier(0.23, 1, 0.320, 1)":"Ease-out Quintic. Based on power of five."},t.basicShapeFunctions={"circle()":"Defines a circle.","ellipse()":"Defines an ellipse.","inset()":"Defines an inset rectangle.","polygon()":"Defines a polygon."},t.units={length:["em","rem","ex","px","cm","mm","in","pt","pc","ch","vw","vh","vmin","vmax"],angle:["deg","rad","grad","turn"],time:["ms","s"],frequency:["Hz","kHz"],resolution:["dpi","dpcm","dppx"],percentage:["%","fr"]},t.html5Tags=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","const","video","wbr"],t.svgElements=["circle","clipPath","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","hatch","hatchpath","image","line","linearGradient","marker","mask","mesh","meshpatch","meshrow","metadata","mpath","path","pattern","polygon","polyline","radialGradient","rect","set","solidcolor","stop","svg","switch","symbol","text","textPath","tspan","use","view"],t.pageBoxDirectives=["@bottom-center","@bottom-left","@bottom-left-corner","@bottom-right","@bottom-right-corner","@left-bottom","@left-middle","@left-top","@right-bottom","@right-middle","@right-top","@top-center","@top-left","@top-left-corner","@top-right","@top-right-corner"]}));var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),__exportStar=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||__createBinding(t,e,n)};!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/languageFacts/facts",["require","exports","./entry","./colors","./builtinData"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),__exportStar(e("./entry"),t),__exportStar(e("./colors"),t),__exportStar(e("./builtinData"),t)})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/utils/objects",["require","exports"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isDefined=t.values=void 0,t.values=function(e){return Object.keys(e).map((function(t){return e[t]}))},t.isDefined=function(e){return void 0!==e}})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/cssParser",["require","exports","./cssScanner","./cssNodes","./cssErrors","../languageFacts/facts","../utils/objects"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Parser=void 0;var n=e("./cssScanner"),r=e("./cssNodes"),i=e("./cssErrors"),o=e("../languageFacts/facts"),s=e("../utils/objects"),a=function(){function e(e){void 0===e&&(e=new n.Scanner),this.keyframeRegex=/^@(\-(webkit|ms|moz|o)\-)?keyframes$/i,this.scanner=e,this.token={type:n.TokenType.EOF,offset:-1,len:0,text:""},this.prevToken=void 0}return e.prototype.peekIdent=function(e){return n.TokenType.Ident===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()},e.prototype.peekKeyword=function(e){return n.TokenType.AtKeyword===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()},e.prototype.peekDelim=function(e){return n.TokenType.Delim===this.token.type&&e===this.token.text},e.prototype.peek=function(e){return e===this.token.type},e.prototype.peekOne=function(e){return-1!==e.indexOf(this.token.type)},e.prototype.peekRegExp=function(e,t){return e===this.token.type&&t.test(this.token.text)},e.prototype.hasWhitespace=function(){return!!this.prevToken&&this.prevToken.offset+this.prevToken.len!==this.token.offset},e.prototype.consumeToken=function(){this.prevToken=this.token,this.token=this.scanner.scan()},e.prototype.mark=function(){return{prev:this.prevToken,curr:this.token,pos:this.scanner.pos()}},e.prototype.restoreAtMark=function(e){this.prevToken=e.prev,this.token=e.curr,this.scanner.goBackTo(e.pos)},e.prototype.try=function(e){var t=this.mark(),n=e();return n||(this.restoreAtMark(t),null)},e.prototype.acceptOneKeyword=function(e){if(n.TokenType.AtKeyword===this.token.type)for(var t=0,r=e;te.offset?o-e.offset:0}return e},e.prototype.markError=function(e,t,n,i){this.token!==this.lastErrorToken&&(e.addIssue(new r.Marker(e,t,r.Level.Error,void 0,this.token.offset,this.token.len)),this.lastErrorToken=this.token),(n||i)&&this.resync(n,i)},e.prototype.parseStylesheet=function(e){var t=e.version,n=e.getText();return this.internalParse(n,this._parseStylesheet,(function(r,i){if(e.version!==t)throw new Error("Underlying model has changed, AST is no longer valid");return n.substr(r,i)}))},e.prototype.internalParse=function(e,t,n){this.scanner.setSource(e),this.token=this.scanner.scan();var r=t.bind(this)();return r&&(r.textProvider=n||function(t,n){return e.substr(t,n)}),r},e.prototype._parseStylesheet=function(){for(var e=this.create(r.Stylesheet);e.addChild(this._parseStylesheetStart()););var t=!1;do{var o=!1;do{o=!1;var s=this._parseStylesheetStatement();for(s&&(e.addChild(s),o=!0,t=!1,this.peek(n.TokenType.EOF)||!this._needsSemicolonAfter(s)||this.accept(n.TokenType.SemiColon)||this.markError(e,i.ParseError.SemiColonExpected));this.accept(n.TokenType.SemiColon)||this.accept(n.TokenType.CDO)||this.accept(n.TokenType.CDC);)o=!0,t=!1}while(o);if(this.peek(n.TokenType.EOF))break;t||(this.peek(n.TokenType.AtKeyword)?this.markError(e,i.ParseError.UnknownAtRule):this.markError(e,i.ParseError.RuleOrSelectorExpected),t=!0),this.consumeToken()}while(!this.peek(n.TokenType.EOF));return this.finish(e)},e.prototype._parseStylesheetStart=function(){return this._parseCharset()},e.prototype._parseStylesheetStatement=function(e){return void 0===e&&(e=!1),this.peek(n.TokenType.AtKeyword)?this._parseStylesheetAtStatement(e):this._parseRuleset(e)},e.prototype._parseStylesheetAtStatement=function(e){return void 0===e&&(e=!1),this._parseImport()||this._parseMedia(e)||this._parsePage()||this._parseFontFace()||this._parseKeyframe()||this._parseSupports(e)||this._parseViewPort()||this._parseNamespace()||this._parseDocument()||this._parseUnknownAtRule()},e.prototype._tryParseRuleset=function(e){var t=this.mark();if(this._parseSelector(e)){for(;this.accept(n.TokenType.Comma)&&this._parseSelector(e););if(this.accept(n.TokenType.CurlyL))return this.restoreAtMark(t),this._parseRuleset(e)}return this.restoreAtMark(t),null},e.prototype._parseRuleset=function(e){void 0===e&&(e=!1);var t=this.create(r.RuleSet),o=t.getSelectors();if(!o.addChild(this._parseSelector(e)))return null;for(;this.accept(n.TokenType.Comma);)if(!o.addChild(this._parseSelector(e)))return this.finish(t,i.ParseError.SelectorExpected);return this._parseBody(t,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseRuleSetDeclarationAtStatement=function(){return this._parseAtApply()||this._parseUnknownAtRule()},e.prototype._parseRuleSetDeclaration=function(){return this.peek(n.TokenType.AtKeyword)?this._parseRuleSetDeclarationAtStatement():this._parseDeclaration()},e.prototype._parseAtApply=function(){if(!this.peekKeyword("@apply"))return null;var e=this.create(r.AtApplyRule);return this.consumeToken(),e.setIdentifier(this._parseIdent([r.ReferenceType.Variable]))?this.finish(e):this.finish(e,i.ParseError.IdentifierExpected)},e.prototype._needsSemicolonAfter=function(e){switch(e.type){case r.NodeType.Keyframe:case r.NodeType.ViewPort:case r.NodeType.Media:case r.NodeType.Ruleset:case r.NodeType.Namespace:case r.NodeType.If:case r.NodeType.For:case r.NodeType.Each:case r.NodeType.While:case r.NodeType.MixinDeclaration:case r.NodeType.FunctionDeclaration:case r.NodeType.MixinContentDeclaration:return!1;case r.NodeType.ExtendsReference:case r.NodeType.MixinContentReference:case r.NodeType.ReturnStatement:case r.NodeType.MediaQuery:case r.NodeType.Debug:case r.NodeType.Import:case r.NodeType.AtApplyRule:case r.NodeType.CustomPropertyDeclaration:return!0;case r.NodeType.VariableDeclaration:return e.needsSemicolon;case r.NodeType.MixinReference:return!e.getContent();case r.NodeType.Declaration:return!e.getNestedProperties()}return!1},e.prototype._parseDeclarations=function(e){var t=this.create(r.Declarations);if(!this.accept(n.TokenType.CurlyL))return null;for(var o=e();t.addChild(o)&&!this.peek(n.TokenType.CurlyR);){if(this._needsSemicolonAfter(o)&&!this.accept(n.TokenType.SemiColon))return this.finish(t,i.ParseError.SemiColonExpected,[n.TokenType.SemiColon,n.TokenType.CurlyR]);for(o&&this.prevToken&&this.prevToken.type===n.TokenType.SemiColon&&(o.semicolonPosition=this.prevToken.offset);this.accept(n.TokenType.SemiColon););o=e()}return this.accept(n.TokenType.CurlyR)?this.finish(t):this.finish(t,i.ParseError.RightCurlyExpected,[n.TokenType.CurlyR,n.TokenType.SemiColon])},e.prototype._parseBody=function(e,t){return e.setDeclarations(this._parseDeclarations(t))?this.finish(e):this.finish(e,i.ParseError.LeftCurlyExpected,[n.TokenType.CurlyR,n.TokenType.SemiColon])},e.prototype._parseSelector=function(e){var t=this.create(r.Selector),n=!1;for(e&&(n=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());)n=!0,t.addChild(this._parseCombinator());return n?this.finish(t):null},e.prototype._parseDeclaration=function(e){var t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;var o=this.create(r.Declaration);return o.setProperty(this._parseProperty())?this.accept(n.TokenType.Colon)?(this.prevToken&&(o.colonPosition=this.prevToken.offset),o.setValue(this._parseExpr())?(o.addChild(this._parsePrio()),this.peek(n.TokenType.SemiColon)&&(o.semicolonPosition=this.token.offset),this.finish(o)):this.finish(o,i.ParseError.PropertyValueExpected)):this.finish(o,i.ParseError.ColonExpected,[n.TokenType.Colon],e||[n.TokenType.SemiColon]):null},e.prototype._tryParseCustomPropertyDeclaration=function(e){if(!this.peekRegExp(n.TokenType.Ident,/^--/))return null;var t=this.create(r.CustomPropertyDeclaration);if(!t.setProperty(this._parseProperty()))return null;if(!this.accept(n.TokenType.Colon))return this.finish(t,i.ParseError.ColonExpected,[n.TokenType.Colon]);this.prevToken&&(t.colonPosition=this.prevToken.offset);var o=this.mark();if(this.peek(n.TokenType.CurlyL)){var a=this.create(r.CustomPropertySet),l=this._parseDeclarations(this._parseRuleSetDeclaration.bind(this));if(a.setDeclarations(l)&&!l.isErroneous(!0)&&(a.addChild(this._parsePrio()),this.peek(n.TokenType.SemiColon)))return this.finish(a),t.setPropertySet(a),t.semicolonPosition=this.token.offset,this.finish(t);this.restoreAtMark(o)}var c=this._parseExpr();return c&&!c.isErroneous(!0)&&(this._parsePrio(),this.peekOne(e||[n.TokenType.SemiColon]))?(t.setValue(c),t.semicolonPosition=this.token.offset,this.finish(t)):(this.restoreAtMark(o),t.addChild(this._parseCustomPropertyValue(e)),t.addChild(this._parsePrio()),s.isDefined(t.colonPosition)&&this.token.offset===t.colonPosition+1?this.finish(t,i.ParseError.PropertyValueExpected):this.finish(t))},e.prototype._parseCustomPropertyValue=function(e){var t=this;void 0===e&&(e=[n.TokenType.CurlyR]);var o=this.create(r.Node),s=function(){return 0===l&&0===c&&0===d},a=function(){return-1!==e.indexOf(t.token.type)},l=0,c=0,d=0;e:for(;;){switch(this.token.type){case n.TokenType.SemiColon:case n.TokenType.Exclamation:if(s())break e;break;case n.TokenType.CurlyL:l++;break;case n.TokenType.CurlyR:if(--l<0){if(a()&&0===c&&0===d)break e;return this.finish(o,i.ParseError.LeftCurlyExpected)}break;case n.TokenType.ParenthesisL:c++;break;case n.TokenType.ParenthesisR:if(--c<0){if(a()&&0===d&&0===l)break e;return this.finish(o,i.ParseError.LeftParenthesisExpected)}break;case n.TokenType.BracketL:d++;break;case n.TokenType.BracketR:if(--d<0)return this.finish(o,i.ParseError.LeftSquareBracketExpected);break;case n.TokenType.BadString:break e;case n.TokenType.EOF:var p=i.ParseError.RightCurlyExpected;return d>0?p=i.ParseError.RightSquareBracketExpected:c>0&&(p=i.ParseError.RightParenthesisExpected),this.finish(o,p)}this.consumeToken()}return this.finish(o)},e.prototype._tryToParseDeclaration=function(e){var t=this.mark();return this._parseProperty()&&this.accept(n.TokenType.Colon)?(this.restoreAtMark(t),this._parseDeclaration(e)):(this.restoreAtMark(t),null)},e.prototype._parseProperty=function(){var e=this.create(r.Property),t=this.mark();return(this.acceptDelim("*")||this.acceptDelim("_"))&&this.hasWhitespace()?(this.restoreAtMark(t),null):e.setIdentifier(this._parsePropertyIdentifier())?this.finish(e):null},e.prototype._parsePropertyIdentifier=function(){return this._parseIdent()},e.prototype._parseCharset=function(){if(!this.peek(n.TokenType.Charset))return null;var e=this.create(r.Node);return this.consumeToken(),this.accept(n.TokenType.String)?this.accept(n.TokenType.SemiColon)?this.finish(e):this.finish(e,i.ParseError.SemiColonExpected):this.finish(e,i.ParseError.IdentifierExpected)},e.prototype._parseImport=function(){if(!this.peekKeyword("@import"))return null;var e=this.create(r.Import);return this.consumeToken(),e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral())?(this.peek(n.TokenType.SemiColon)||this.peek(n.TokenType.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e)):this.finish(e,i.ParseError.URIOrStringExpected)},e.prototype._parseNamespace=function(){if(!this.peekKeyword("@namespace"))return null;var e=this.create(r.Namespace);return this.consumeToken(),e.addChild(this._parseURILiteral())||(e.addChild(this._parseIdent()),e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral()))?this.accept(n.TokenType.SemiColon)?this.finish(e):this.finish(e,i.ParseError.SemiColonExpected):this.finish(e,i.ParseError.URIExpected,[n.TokenType.SemiColon])},e.prototype._parseFontFace=function(){if(!this.peekKeyword("@font-face"))return null;var e=this.create(r.FontFace);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseViewPort=function(){if(!this.peekKeyword("@-ms-viewport")&&!this.peekKeyword("@-o-viewport")&&!this.peekKeyword("@viewport"))return null;var e=this.create(r.ViewPort);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseKeyframe=function(){if(!this.peekRegExp(n.TokenType.AtKeyword,this.keyframeRegex))return null;var e=this.create(r.Keyframe),t=this.create(r.Node);return this.consumeToken(),e.setKeyword(this.finish(t)),t.matches("@-ms-keyframes")&&this.markError(t,i.ParseError.UnknownKeyword),e.setIdentifier(this._parseKeyframeIdent())?this._parseBody(e,this._parseKeyframeSelector.bind(this)):this.finish(e,i.ParseError.IdentifierExpected,[n.TokenType.CurlyR])},e.prototype._parseKeyframeIdent=function(){return this._parseIdent([r.ReferenceType.Keyframe])},e.prototype._parseKeyframeSelector=function(){var e=this.create(r.KeyframeSelector);if(!e.addChild(this._parseIdent())&&!this.accept(n.TokenType.Percentage))return null;for(;this.accept(n.TokenType.Comma);)if(!e.addChild(this._parseIdent())&&!this.accept(n.TokenType.Percentage))return this.finish(e,i.ParseError.PercentageExpected);return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._tryParseKeyframeSelector=function(){var e=this.create(r.KeyframeSelector),t=this.mark();if(!e.addChild(this._parseIdent())&&!this.accept(n.TokenType.Percentage))return null;for(;this.accept(n.TokenType.Comma);)if(!e.addChild(this._parseIdent())&&!this.accept(n.TokenType.Percentage))return this.restoreAtMark(t),null;return this.peek(n.TokenType.CurlyL)?this._parseBody(e,this._parseRuleSetDeclaration.bind(this)):(this.restoreAtMark(t),null)},e.prototype._parseSupports=function(e){if(void 0===e&&(e=!1),!this.peekKeyword("@supports"))return null;var t=this.create(r.Supports);return this.consumeToken(),t.addChild(this._parseSupportsCondition()),this._parseBody(t,this._parseSupportsDeclaration.bind(this,e))},e.prototype._parseSupportsDeclaration=function(e){return void 0===e&&(e=!1),e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)},e.prototype._parseSupportsCondition=function(){var e=this.create(r.SupportsCondition);if(this.acceptIdent("not"))e.addChild(this._parseSupportsConditionInParens());else if(e.addChild(this._parseSupportsConditionInParens()),this.peekRegExp(n.TokenType.Ident,/^(and|or)$/i))for(var t=this.token.text.toLowerCase();this.acceptIdent(t);)e.addChild(this._parseSupportsConditionInParens());return this.finish(e)},e.prototype._parseSupportsConditionInParens=function(){var e=this.create(r.SupportsCondition);if(this.accept(n.TokenType.ParenthesisL))return this.prevToken&&(e.lParent=this.prevToken.offset),e.addChild(this._tryToParseDeclaration([n.TokenType.ParenthesisR]))||this._parseSupportsCondition()?this.accept(n.TokenType.ParenthesisR)?(this.prevToken&&(e.rParent=this.prevToken.offset),this.finish(e)):this.finish(e,i.ParseError.RightParenthesisExpected,[n.TokenType.ParenthesisR],[]):this.finish(e,i.ParseError.ConditionExpected);if(this.peek(n.TokenType.Ident)){var t=this.mark();if(this.consumeToken(),!this.hasWhitespace()&&this.accept(n.TokenType.ParenthesisL)){for(var o=1;this.token.type!==n.TokenType.EOF&&0!==o;)this.token.type===n.TokenType.ParenthesisL?o++:this.token.type===n.TokenType.ParenthesisR&&o--,this.consumeToken();return this.finish(e)}this.restoreAtMark(t)}return this.finish(e,i.ParseError.LeftParenthesisExpected,[],[n.TokenType.ParenthesisL])},e.prototype._parseMediaDeclaration=function(e){return void 0===e&&(e=!1),e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)},e.prototype._parseMedia=function(e){if(void 0===e&&(e=!1),!this.peekKeyword("@media"))return null;var t=this.create(r.Media);return this.consumeToken(),t.addChild(this._parseMediaQueryList())?this._parseBody(t,this._parseMediaDeclaration.bind(this,e)):this.finish(t,i.ParseError.MediaQueryExpected)},e.prototype._parseMediaQueryList=function(){var e=this.create(r.Medialist);if(!e.addChild(this._parseMediaQuery([n.TokenType.CurlyL])))return this.finish(e,i.ParseError.MediaQueryExpected);for(;this.accept(n.TokenType.Comma);)if(!e.addChild(this._parseMediaQuery([n.TokenType.CurlyL])))return this.finish(e,i.ParseError.MediaQueryExpected);return this.finish(e)},e.prototype._parseMediaQuery=function(e){var t=this.create(r.MediaQuery),o=!0,s=!1;if(!this.peek(n.TokenType.ParenthesisL)){if(this.acceptIdent("only")||this.acceptIdent("not"),!t.addChild(this._parseIdent()))return null;s=!0,o=this.acceptIdent("and")}for(;o;)if(t.addChild(this._parseMediaContentStart()))o=this.acceptIdent("and");else{if(!this.accept(n.TokenType.ParenthesisL))return s?this.finish(t,i.ParseError.LeftParenthesisExpected,[],e):null;if(!t.addChild(this._parseMediaFeatureName()))return this.finish(t,i.ParseError.IdentifierExpected,[],e);if(this.accept(n.TokenType.Colon)&&!t.addChild(this._parseExpr()))return this.finish(t,i.ParseError.TermExpected,[],e);if(!this.accept(n.TokenType.ParenthesisR))return this.finish(t,i.ParseError.RightParenthesisExpected,[],e);o=this.acceptIdent("and")}return this.finish(t)},e.prototype._parseMediaContentStart=function(){return null},e.prototype._parseMediaFeatureName=function(){return this._parseIdent()},e.prototype._parseMedium=function(){var e=this.create(r.Node);return e.addChild(this._parseIdent())?this.finish(e):null},e.prototype._parsePageDeclaration=function(){return this._parsePageMarginBox()||this._parseRuleSetDeclaration()},e.prototype._parsePage=function(){if(!this.peekKeyword("@page"))return null;var e=this.create(r.Page);if(this.consumeToken(),e.addChild(this._parsePageSelector()))for(;this.accept(n.TokenType.Comma);)if(!e.addChild(this._parsePageSelector()))return this.finish(e,i.ParseError.IdentifierExpected);return this._parseBody(e,this._parsePageDeclaration.bind(this))},e.prototype._parsePageMarginBox=function(){if(!this.peek(n.TokenType.AtKeyword))return null;var e=this.create(r.PageBoxMarginBox);return this.acceptOneKeyword(o.pageBoxDirectives)||this.markError(e,i.ParseError.UnknownAtRule,[],[n.TokenType.CurlyL]),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parsePageSelector=function(){if(!this.peek(n.TokenType.Ident)&&!this.peek(n.TokenType.Colon))return null;var e=this.create(r.Node);return e.addChild(this._parseIdent()),this.accept(n.TokenType.Colon)&&!e.addChild(this._parseIdent())?this.finish(e,i.ParseError.IdentifierExpected):this.finish(e)},e.prototype._parseDocument=function(){if(!this.peekKeyword("@-moz-document"))return null;var e=this.create(r.Document);return this.consumeToken(),this.resync([],[n.TokenType.CurlyL]),this._parseBody(e,this._parseStylesheetStatement.bind(this))},e.prototype._parseUnknownAtRule=function(){if(!this.peek(n.TokenType.AtKeyword))return null;var e=this.create(r.UnknownAtRule);e.addChild(this._parseUnknownAtRuleName());var t=0,o=0,s=0,a=0;e:for(;;){switch(this.token.type){case n.TokenType.SemiColon:if(0===o&&0===s&&0===a)break e;break;case n.TokenType.EOF:return o>0?this.finish(e,i.ParseError.RightCurlyExpected):a>0?this.finish(e,i.ParseError.RightSquareBracketExpected):s>0?this.finish(e,i.ParseError.RightParenthesisExpected):this.finish(e);case n.TokenType.CurlyL:t++,o++;break;case n.TokenType.CurlyR:if(o--,t>0&&0===o){if(this.consumeToken(),a>0)return this.finish(e,i.ParseError.RightSquareBracketExpected);if(s>0)return this.finish(e,i.ParseError.RightParenthesisExpected);break e}if(o<0){if(0===s&&0===a)break e;return this.finish(e,i.ParseError.LeftCurlyExpected)}break;case n.TokenType.ParenthesisL:s++;break;case n.TokenType.ParenthesisR:if(--s<0)return this.finish(e,i.ParseError.LeftParenthesisExpected);break;case n.TokenType.BracketL:a++;break;case n.TokenType.BracketR:if(--a<0)return this.finish(e,i.ParseError.LeftSquareBracketExpected)}this.consumeToken()}return e},e.prototype._parseUnknownAtRuleName=function(){var e=this.create(r.Node);return this.accept(n.TokenType.AtKeyword)?this.finish(e):e},e.prototype._parseOperator=function(){if(this.peekDelim("/")||this.peekDelim("*")||this.peekDelim("+")||this.peekDelim("-")||this.peek(n.TokenType.Dashmatch)||this.peek(n.TokenType.Includes)||this.peek(n.TokenType.SubstringOperator)||this.peek(n.TokenType.PrefixOperator)||this.peek(n.TokenType.SuffixOperator)||this.peekDelim("=")){var e=this.createNode(r.NodeType.Operator);return this.consumeToken(),this.finish(e)}return null},e.prototype._parseUnaryOperator=function(){if(!this.peekDelim("+")&&!this.peekDelim("-"))return null;var e=this.create(r.Node);return this.consumeToken(),this.finish(e)},e.prototype._parseCombinator=function(){if(this.peekDelim(">")){var e=this.create(r.Node);this.consumeToken();var t=this.mark();if(!this.hasWhitespace()&&this.acceptDelim(">")){if(!this.hasWhitespace()&&this.acceptDelim(">"))return e.type=r.NodeType.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return e.type=r.NodeType.SelectorCombinatorParent,this.finish(e)}if(this.peekDelim("+")){e=this.create(r.Node);return this.consumeToken(),e.type=r.NodeType.SelectorCombinatorSibling,this.finish(e)}if(this.peekDelim("~")){e=this.create(r.Node);return this.consumeToken(),e.type=r.NodeType.SelectorCombinatorAllSiblings,this.finish(e)}if(this.peekDelim("/")){e=this.create(r.Node);this.consumeToken();t=this.mark();if(!this.hasWhitespace()&&this.acceptIdent("deep")&&!this.hasWhitespace()&&this.acceptDelim("/"))return e.type=r.NodeType.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return null},e.prototype._parseSimpleSelector=function(){var e=this.create(r.SimpleSelector),t=0;for(e.addChild(this._parseElementName())&&t++;(0===t||!this.hasWhitespace())&&e.addChild(this._parseSimpleSelectorBody());)t++;return t>0?this.finish(e):null},e.prototype._parseSimpleSelectorBody=function(){return this._parsePseudo()||this._parseHash()||this._parseClass()||this._parseAttrib()},e.prototype._parseSelectorIdent=function(){return this._parseIdent()},e.prototype._parseHash=function(){if(!this.peek(n.TokenType.Hash)&&!this.peekDelim("#"))return null;var e=this.createNode(r.NodeType.IdentifierSelector);if(this.acceptDelim("#")){if(this.hasWhitespace()||!e.addChild(this._parseSelectorIdent()))return this.finish(e,i.ParseError.IdentifierExpected)}else this.consumeToken();return this.finish(e)},e.prototype._parseClass=function(){if(!this.peekDelim("."))return null;var e=this.createNode(r.NodeType.ClassSelector);return this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseSelectorIdent())?this.finish(e,i.ParseError.IdentifierExpected):this.finish(e)},e.prototype._parseElementName=function(){var e=this.mark(),t=this.createNode(r.NodeType.ElementNameSelector);return t.addChild(this._parseNamespacePrefix()),t.addChild(this._parseSelectorIdent())||this.acceptDelim("*")?this.finish(t):(this.restoreAtMark(e),null)},e.prototype._parseNamespacePrefix=function(){var e=this.mark(),t=this.createNode(r.NodeType.NamespacePrefix);return!t.addChild(this._parseIdent())&&this.acceptDelim("*"),this.acceptDelim("|")?this.finish(t):(this.restoreAtMark(e),null)},e.prototype._parseAttrib=function(){if(!this.peek(n.TokenType.BracketL))return null;var e=this.create(r.AttributeSelector);return this.consumeToken(),e.setNamespacePrefix(this._parseNamespacePrefix()),e.setIdentifier(this._parseIdent())?(e.setOperator(this._parseOperator())&&(e.setValue(this._parseBinaryExpr()),this.acceptIdent("i")),this.accept(n.TokenType.BracketR)?this.finish(e):this.finish(e,i.ParseError.RightSquareBracketExpected)):this.finish(e,i.ParseError.IdentifierExpected)},e.prototype._parsePseudo=function(){var e=this,t=this._tryParsePseudoIdentifier();if(t){if(!this.hasWhitespace()&&this.accept(n.TokenType.ParenthesisL)){if(t.addChild(this.try((function(){var t=e.create(r.Node);if(!t.addChild(e._parseSelector(!1)))return null;for(;e.accept(n.TokenType.Comma)&&t.addChild(e._parseSelector(!1)););return e.peek(n.TokenType.ParenthesisR)?e.finish(t):null}))||this._parseBinaryExpr()),!this.accept(n.TokenType.ParenthesisR))return this.finish(t,i.ParseError.RightParenthesisExpected)}return this.finish(t)}return null},e.prototype._tryParsePseudoIdentifier=function(){if(!this.peek(n.TokenType.Colon))return null;var e=this.mark(),t=this.createNode(r.NodeType.PseudoSelector);return this.consumeToken(),this.hasWhitespace()?(this.restoreAtMark(e),null):(this.accept(n.TokenType.Colon),this.hasWhitespace()||!t.addChild(this._parseIdent())?this.finish(t,i.ParseError.IdentifierExpected):this.finish(t))},e.prototype._tryParsePrio=function(){var e=this.mark(),t=this._parsePrio();return t||(this.restoreAtMark(e),null)},e.prototype._parsePrio=function(){if(!this.peek(n.TokenType.Exclamation))return null;var e=this.createNode(r.NodeType.Prio);return this.accept(n.TokenType.Exclamation)&&this.acceptIdent("important")?this.finish(e):null},e.prototype._parseExpr=function(e){void 0===e&&(e=!1);var t=this.create(r.Expression);if(!t.addChild(this._parseBinaryExpr()))return null;for(;;){if(this.peek(n.TokenType.Comma)){if(e)return this.finish(t);this.consumeToken()}if(!t.addChild(this._parseBinaryExpr()))break}return this.finish(t)},e.prototype._parseNamedLine=function(){if(!this.peek(n.TokenType.BracketL))return null;var e=this.createNode(r.NodeType.GridLine);for(this.consumeToken();e.addChild(this._parseIdent()););return this.accept(n.TokenType.BracketR)?this.finish(e):this.finish(e,i.ParseError.RightSquareBracketExpected)},e.prototype._parseBinaryExpr=function(e,t){var n=this.create(r.BinaryExpression);if(!n.setLeft(e||this._parseTerm()))return null;if(!n.setOperator(t||this._parseOperator()))return this.finish(n);if(!n.setRight(this._parseTerm()))return this.finish(n,i.ParseError.TermExpected);n=this.finish(n);var o=this._parseOperator();return o&&(n=this._parseBinaryExpr(n,o)),this.finish(n)},e.prototype._parseTerm=function(){var e=this.create(r.Term);return e.setOperator(this._parseUnaryOperator()),e.setExpression(this._parseTermExpression())?this.finish(e):null},e.prototype._parseTermExpression=function(){return this._parseURILiteral()||this._parseFunction()||this._parseIdent()||this._parseStringLiteral()||this._parseNumeric()||this._parseHexColor()||this._parseOperation()||this._parseNamedLine()},e.prototype._parseOperation=function(){if(!this.peek(n.TokenType.ParenthesisL))return null;var e=this.create(r.Node);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(n.TokenType.ParenthesisR)?this.finish(e):this.finish(e,i.ParseError.RightParenthesisExpected)},e.prototype._parseNumeric=function(){if(this.peek(n.TokenType.Num)||this.peek(n.TokenType.Percentage)||this.peek(n.TokenType.Resolution)||this.peek(n.TokenType.Length)||this.peek(n.TokenType.EMS)||this.peek(n.TokenType.EXS)||this.peek(n.TokenType.Angle)||this.peek(n.TokenType.Time)||this.peek(n.TokenType.Dimension)||this.peek(n.TokenType.Freq)){var e=this.create(r.NumericValue);return this.consumeToken(),this.finish(e)}return null},e.prototype._parseStringLiteral=function(){if(!this.peek(n.TokenType.String)&&!this.peek(n.TokenType.BadString))return null;var e=this.createNode(r.NodeType.StringLiteral);return this.consumeToken(),this.finish(e)},e.prototype._parseURILiteral=function(){if(!this.peekRegExp(n.TokenType.Ident,/^url(-prefix)?$/i))return null;var e=this.mark(),t=this.createNode(r.NodeType.URILiteral);return this.accept(n.TokenType.Ident),this.hasWhitespace()||!this.peek(n.TokenType.ParenthesisL)?(this.restoreAtMark(e),null):(this.scanner.inURL=!0,this.consumeToken(),t.addChild(this._parseURLArgument()),this.scanner.inURL=!1,this.accept(n.TokenType.ParenthesisR)?this.finish(t):this.finish(t,i.ParseError.RightParenthesisExpected))},e.prototype._parseURLArgument=function(){var e=this.create(r.Node);return this.accept(n.TokenType.String)||this.accept(n.TokenType.BadString)||this.acceptUnquotedString()?this.finish(e):null},e.prototype._parseIdent=function(e){if(!this.peek(n.TokenType.Ident))return null;var t=this.create(r.Identifier);return e&&(t.referenceTypes=e),t.isCustomProperty=this.peekRegExp(n.TokenType.Ident,/^--/),this.consumeToken(),this.finish(t)},e.prototype._parseFunction=function(){var e=this.mark(),t=this.create(r.Function);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(n.TokenType.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(n.TokenType.Comma)&&!this.peek(n.TokenType.ParenthesisR);)t.getArguments().addChild(this._parseFunctionArgument())||this.markError(t,i.ParseError.ExpressionExpected);return this.accept(n.TokenType.ParenthesisR)?this.finish(t):this.finish(t,i.ParseError.RightParenthesisExpected)},e.prototype._parseFunctionIdentifier=function(){if(!this.peek(n.TokenType.Ident))return null;var e=this.create(r.Identifier);if(e.referenceTypes=[r.ReferenceType.Function],this.acceptIdent("progid")){if(this.accept(n.TokenType.Colon))for(;this.accept(n.TokenType.Ident)&&this.acceptDelim("."););return this.finish(e)}return this.consumeToken(),this.finish(e)},e.prototype._parseFunctionArgument=function(){var e=this.create(r.FunctionArgument);return e.setValue(this._parseExpr(!0))?this.finish(e):null},e.prototype._parseHexColor=function(){if(this.peekRegExp(n.TokenType.Hash,/^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/g)){var e=this.create(r.HexColorValue);return this.consumeToken(),this.finish(e)}return null},e}();t.Parser=a})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/utils/arrays",["require","exports"],e)}((function(e,t){"use strict";function n(e,t){return-1!==e.indexOf(t)}Object.defineProperty(t,"__esModule",{value:!0}),t.union=t.includes=t.findFirst=void 0,t.findFirst=function(e,t){var n=0,r=e.length;if(0===r)return 0;for(;ne+t||this.offset===e&&this.length===t?this.findInScope(e,t):null},e.prototype.findInScope=function(e,t){void 0===t&&(t=0);var n=e+t,i=r.findFirst(this.children,(function(e){return e.offset>n}));if(0===i)return this;var o=this.children[i-1];return o.offset<=e&&o.offset+o.length>=e+t?o.findInScope(e,t):this},e.prototype.addSymbol=function(e){this.symbols.push(e)},e.prototype.getSymbol=function(e,t){for(var n=0;n0&&(i.arguments=n),i},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.title)&&E.string(t.command)}}(c=t.Command||(t.Command={})),function(e){e.replace=function(e,t){return{range:e,newText:t}},e.insert=function(e,t){return{range:{start:e,end:e},newText:t}},e.del=function(e){return{range:e,newText:""}},e.is=function(e){var t=e;return E.objectLiteral(t)&&E.string(t.newText)&&i.is(t.range)}}(d=t.TextEdit||(t.TextEdit={})),function(e){e.create=function(e,t,n){var r={label:e};return void 0!==t&&(r.needsConfirmation=t),void 0!==n&&(r.description=n),r},e.is=function(e){var t=e;return void 0!==t&&E.objectLiteral(t)&&E.string(t.label)&&(E.boolean(t.needsConfirmation)||void 0===t.needsConfirmation)&&(E.string(t.description)||void 0===t.description)}}(p=t.ChangeAnnotation||(t.ChangeAnnotation={})),function(e){e.is=function(e){return"string"==typeof e}}(h=t.ChangeAnnotationIdentifier||(t.ChangeAnnotationIdentifier={})),function(e){e.replace=function(e,t,n){return{range:e,newText:t,annotationId:n}},e.insert=function(e,t,n){return{range:{start:e,end:e},newText:t,annotationId:n}},e.del=function(e,t){return{range:e,newText:"",annotationId:t}},e.is=function(e){var t=e;return d.is(t)&&(p.is(t.annotationId)||h.is(t.annotationId))}}(u=t.AnnotatedTextEdit||(t.AnnotatedTextEdit={})),function(e){e.create=function(e,t){return{textDocument:e,edits:t}},e.is=function(e){var t=e;return E.defined(t)&&v.is(t.textDocument)&&Array.isArray(t.edits)}}(m=t.TextDocumentEdit||(t.TextDocumentEdit={})),function(e){e.create=function(e,t,n){var r={kind:"create",uri:e};return void 0===t||void 0===t.overwrite&&void 0===t.ignoreIfExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){var t=e;return t&&"create"===t.kind&&E.string(t.uri)&&(void 0===t.options||(void 0===t.options.overwrite||E.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||E.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||h.is(t.annotationId))}}(f=t.CreateFile||(t.CreateFile={})),function(e){e.create=function(e,t,n,r){var i={kind:"rename",oldUri:e,newUri:t};return void 0===n||void 0===n.overwrite&&void 0===n.ignoreIfExists||(i.options=n),void 0!==r&&(i.annotationId=r),i},e.is=function(e){var t=e;return t&&"rename"===t.kind&&E.string(t.oldUri)&&E.string(t.newUri)&&(void 0===t.options||(void 0===t.options.overwrite||E.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||E.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||h.is(t.annotationId))}}(g=t.RenameFile||(t.RenameFile={})),function(e){e.create=function(e,t,n){var r={kind:"delete",uri:e};return void 0===t||void 0===t.recursive&&void 0===t.ignoreIfNotExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){var t=e;return t&&"delete"===t.kind&&E.string(t.uri)&&(void 0===t.options||(void 0===t.options.recursive||E.boolean(t.options.recursive))&&(void 0===t.options.ignoreIfNotExists||E.boolean(t.options.ignoreIfNotExists)))&&(void 0===t.annotationId||h.is(t.annotationId))}}(b=t.DeleteFile||(t.DeleteFile={})),function(e){e.is=function(e){var t=e;return t&&(void 0!==t.changes||void 0!==t.documentChanges)&&(void 0===t.documentChanges||t.documentChanges.every((function(e){return E.string(e.kind)?f.is(e)||g.is(e)||b.is(e):m.is(e)})))}}(y=t.WorkspaceEdit||(t.WorkspaceEdit={}));var v,w,x,S,k=function(){function e(e,t){this.edits=e,this.changeAnnotations=t}return e.prototype.insert=function(e,t,n){var r,i;if(void 0===n?r=d.insert(e,t):h.is(n)?(i=n,r=u.insert(e,t,n)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(n),r=u.insert(e,t,i)),this.edits.push(r),void 0!==i)return i},e.prototype.replace=function(e,t,n){var r,i;if(void 0===n?r=d.replace(e,t):h.is(n)?(i=n,r=u.replace(e,t,n)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(n),r=u.replace(e,t,i)),this.edits.push(r),void 0!==i)return i},e.prototype.delete=function(e,t){var n,r;if(void 0===t?n=d.del(e):h.is(t)?(r=t,n=u.del(e,t)):(this.assertChangeAnnotations(this.changeAnnotations),r=this.changeAnnotations.manage(t),n=u.del(e,r)),this.edits.push(n),void 0!==r)return r},e.prototype.add=function(e){this.edits.push(e)},e.prototype.all=function(){return this.edits},e.prototype.clear=function(){this.edits.splice(0,this.edits.length)},e.prototype.assertChangeAnnotations=function(e){if(void 0===e)throw new Error("Text edit change is not configured to manage change annotations.")},e}(),C=function(){function e(e){this._annotations=void 0===e?Object.create(null):e,this._counter=0,this._size=0}return e.prototype.all=function(){return this._annotations},Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),e.prototype.manage=function(e,t){var n;if(h.is(e)?n=e:(n=this.nextId(),t=e),void 0!==this._annotations[n])throw new Error("Id "+n+" is already in use.");if(void 0===t)throw new Error("No annotation provided for id "+n);return this._annotations[n]=t,this._size++,n},e.prototype.nextId=function(){return this._counter++,this._counter.toString()},e}(),T=function(){function e(e){var t=this;this._textEditChanges=Object.create(null),void 0!==e?(this._workspaceEdit=e,e.documentChanges?(this._changeAnnotations=new C(e.changeAnnotations),e.changeAnnotations=this._changeAnnotations.all(),e.documentChanges.forEach((function(e){if(m.is(e)){var n=new k(e.edits,t._changeAnnotations);t._textEditChanges[e.textDocument.uri]=n}}))):e.changes&&Object.keys(e.changes).forEach((function(n){var r=new k(e.changes[n]);t._textEditChanges[n]=r}))):this._workspaceEdit={}}return Object.defineProperty(e.prototype,"edit",{get:function(){return this.initDocumentChanges(),void 0!==this._changeAnnotations&&(0===this._changeAnnotations.size?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),e.prototype.getTextEditChange=function(e){if(v.is(e)){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var t={uri:e.uri,version:e.version};if(!(r=this._textEditChanges[t.uri])){var n={textDocument:t,edits:i=[]};this._workspaceEdit.documentChanges.push(n),r=new k(i,this._changeAnnotations),this._textEditChanges[t.uri]=r}return r}if(this.initChanges(),void 0===this._workspaceEdit.changes)throw new Error("Workspace edit is not configured for normal text edit changes.");var r;if(!(r=this._textEditChanges[e])){var i=[];this._workspaceEdit.changes[e]=i,r=new k(i),this._textEditChanges[e]=r}return r},e.prototype.initDocumentChanges=function(){void 0===this._workspaceEdit.documentChanges&&void 0===this._workspaceEdit.changes&&(this._changeAnnotations=new C,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},e.prototype.initChanges=function(){void 0===this._workspaceEdit.documentChanges&&void 0===this._workspaceEdit.changes&&(this._workspaceEdit.changes=Object.create(null))},e.prototype.createFile=function(e,t,n){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var r,i,o;if(p.is(t)||h.is(t)?r=t:n=t,void 0===r?i=f.create(e,n):(o=h.is(r)?r:this._changeAnnotations.manage(r),i=f.create(e,n,o)),this._workspaceEdit.documentChanges.push(i),void 0!==o)return o},e.prototype.renameFile=function(e,t,n,r){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var i,o,s;if(p.is(n)||h.is(n)?i=n:r=n,void 0===i?o=g.create(e,t,r):(s=h.is(i)?i:this._changeAnnotations.manage(i),o=g.create(e,t,r,s)),this._workspaceEdit.documentChanges.push(o),void 0!==s)return s},e.prototype.deleteFile=function(e,t,n){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var r,i,o;if(p.is(t)||h.is(t)?r=t:n=t,void 0===r?i=b.create(e,n):(o=h.is(r)?r:this._changeAnnotations.manage(r),i=b.create(e,n,o)),this._workspaceEdit.documentChanges.push(i),void 0!==o)return o},e}();t.WorkspaceChange=T,function(e){e.create=function(e){return{uri:e}},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.uri)}}(t.TextDocumentIdentifier||(t.TextDocumentIdentifier={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.uri)&&E.integer(t.version)}}(t.VersionedTextDocumentIdentifier||(t.VersionedTextDocumentIdentifier={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.uri)&&(null===t.version||E.integer(t.version))}}(v=t.OptionalVersionedTextDocumentIdentifier||(t.OptionalVersionedTextDocumentIdentifier={})),function(e){e.create=function(e,t,n,r){return{uri:e,languageId:t,version:n,text:r}},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.uri)&&E.string(t.languageId)&&E.integer(t.version)&&E.string(t.text)}}(t.TextDocumentItem||(t.TextDocumentItem={})),function(e){e.PlainText="plaintext",e.Markdown="markdown"}(w=t.MarkupKind||(t.MarkupKind={})),function(e){e.is=function(t){var n=t;return n===e.PlainText||n===e.Markdown}}(w=t.MarkupKind||(t.MarkupKind={})),function(e){e.is=function(e){var t=e;return E.objectLiteral(e)&&w.is(t.kind)&&E.string(t.value)}}(x=t.MarkupContent||(t.MarkupContent={})),function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25}(t.CompletionItemKind||(t.CompletionItemKind={})),function(e){e.PlainText=1,e.Snippet=2}(t.InsertTextFormat||(t.InsertTextFormat={})),function(e){e.Deprecated=1}(t.CompletionItemTag||(t.CompletionItemTag={})),function(e){e.create=function(e,t,n){return{newText:e,insert:t,replace:n}},e.is=function(e){var t=e;return t&&E.string(t.newText)&&i.is(t.insert)&&i.is(t.replace)}}(t.InsertReplaceEdit||(t.InsertReplaceEdit={})),function(e){e.asIs=1,e.adjustIndentation=2}(t.InsertTextMode||(t.InsertTextMode={})),function(e){e.create=function(e){return{label:e}}}(t.CompletionItem||(t.CompletionItem={})),function(e){e.create=function(e,t){return{items:e||[],isIncomplete:!!t}}}(t.CompletionList||(t.CompletionList={})),function(e){e.fromPlainText=function(e){return e.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")},e.is=function(e){var t=e;return E.string(t)||E.objectLiteral(t)&&E.string(t.language)&&E.string(t.value)}}(S=t.MarkedString||(t.MarkedString={})),function(e){e.is=function(e){var t=e;return!!t&&E.objectLiteral(t)&&(x.is(t.contents)||S.is(t.contents)||E.typedArray(t.contents,S.is))&&(void 0===e.range||i.is(e.range))}}(t.Hover||(t.Hover={})),function(e){e.create=function(e,t){return t?{label:e,documentation:t}:{label:e}}}(t.ParameterInformation||(t.ParameterInformation={})),function(e){e.create=function(e,t){for(var n=[],r=2;r=0;s--){var a=i[s],l=e.offsetAt(a.range.start),c=e.offsetAt(a.range.end);if(!(c<=o))throw new Error("Overlapping edit");r=r.substring(0,l)+a.newText+r.substring(c,r.length),o=l}return r}}(t.TextDocument||(t.TextDocument={}));var E,F=function(){function e(e,t,n,r){this._uri=e,this._languageId=t,this._version=n,this._content=r,this._lineOffsets=void 0}return Object.defineProperty(e.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),e.prototype.getText=function(e){if(e){var t=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(t,n)}return this._content},e.prototype.update=function(e,t){this._content=e.text,this._version=t,this._lineOffsets=void 0},e.prototype.getLineOffsets=function(){if(void 0===this._lineOffsets){for(var e=[],t=this._content,n=!0,r=0;r0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets},e.prototype.positionAt=function(e){e=Math.max(Math.min(e,this._content.length),0);var t=this.getLineOffsets(),n=0,i=t.length;if(0===i)return r.create(0,e);for(;ne?i=o:n=o+1}var s=n-1;return r.create(s,e-t[s])},e.prototype.offsetAt=function(e){var t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;var n=t[e.line],r=e.line+1e?r=i:n=i+1}var o=n-1;return{line:o,character:e-t[o]}},e.prototype.offsetAt=function(e){var t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;var n=t[e.line],r=e.line+1n.line||t.line===n.line&&t.character>n.character?{start:n,end:t}:e}function s(e){var t=o(e.range);return t!==e.range?{newText:e.newText,range:t}:e}!function(e){e.create=function(e,t,r,i){return new n(e,t,r,i)},e.update=function(e,t,r){if(e instanceof n)return e.update(t,r),e;throw new Error("TextDocument.update: document must be created by TextDocument.create")},e.applyEdits=function(e,t){for(var n=e.getText(),i=0,o=[],a=0,l=r(t.map(s),(function(e,t){var n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n}));ai&&o.push(n.substring(i,d)),c.newText.length&&o.push(c.newText),i=e.offsetAt(c.range.end)}return o.push(n.substr(i)),o.join("")}}(t.TextDocument||(t.TextDocument={}))})),define("vscode-languageserver-textdocument",["vscode-languageserver-textdocument/main"],(function(e){return e})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/cssLanguageTypes",["require","exports","vscode-languageserver-types","vscode-languageserver-textdocument"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileType=t.ClientCapabilities=t.DocumentHighlightKind=t.VersionedTextDocumentIdentifier=t.TextDocumentEdit=t.CodeActionKind=t.TextEdit=t.WorkspaceEdit=t.DocumentLink=t.DocumentHighlight=t.CodeAction=t.Command=t.CodeActionContext=t.MarkedString=t.Hover=t.Location=t.DocumentSymbol=t.SymbolKind=t.SymbolInformation=t.InsertTextFormat=t.CompletionItemTag=t.CompletionList=t.CompletionItemKind=t.CompletionItem=t.DiagnosticSeverity=t.Diagnostic=t.SelectionRange=t.FoldingRangeKind=t.FoldingRange=t.ColorPresentation=t.ColorInformation=t.Color=t.MarkupKind=t.MarkupContent=t.Position=t.Range=t.TextDocument=void 0;var n=e("vscode-languageserver-types");Object.defineProperty(t,"Range",{enumerable:!0,get:function(){return n.Range}}),Object.defineProperty(t,"Position",{enumerable:!0,get:function(){return n.Position}}),Object.defineProperty(t,"MarkupContent",{enumerable:!0,get:function(){return n.MarkupContent}}),Object.defineProperty(t,"MarkupKind",{enumerable:!0,get:function(){return n.MarkupKind}}),Object.defineProperty(t,"Color",{enumerable:!0,get:function(){return n.Color}}),Object.defineProperty(t,"ColorInformation",{enumerable:!0,get:function(){return n.ColorInformation}}),Object.defineProperty(t,"ColorPresentation",{enumerable:!0,get:function(){return n.ColorPresentation}}),Object.defineProperty(t,"FoldingRange",{enumerable:!0,get:function(){return n.FoldingRange}}),Object.defineProperty(t,"FoldingRangeKind",{enumerable:!0,get:function(){return n.FoldingRangeKind}}),Object.defineProperty(t,"SelectionRange",{enumerable:!0,get:function(){return n.SelectionRange}}),Object.defineProperty(t,"Diagnostic",{enumerable:!0,get:function(){return n.Diagnostic}}),Object.defineProperty(t,"DiagnosticSeverity",{enumerable:!0,get:function(){return n.DiagnosticSeverity}}),Object.defineProperty(t,"CompletionItem",{enumerable:!0,get:function(){return n.CompletionItem}}),Object.defineProperty(t,"CompletionItemKind",{enumerable:!0,get:function(){return n.CompletionItemKind}}),Object.defineProperty(t,"CompletionList",{enumerable:!0,get:function(){return n.CompletionList}}),Object.defineProperty(t,"CompletionItemTag",{enumerable:!0,get:function(){return n.CompletionItemTag}}),Object.defineProperty(t,"InsertTextFormat",{enumerable:!0,get:function(){return n.InsertTextFormat}}),Object.defineProperty(t,"SymbolInformation",{enumerable:!0,get:function(){return n.SymbolInformation}}),Object.defineProperty(t,"SymbolKind",{enumerable:!0,get:function(){return n.SymbolKind}}),Object.defineProperty(t,"DocumentSymbol",{enumerable:!0,get:function(){return n.DocumentSymbol}}),Object.defineProperty(t,"Location",{enumerable:!0,get:function(){return n.Location}}),Object.defineProperty(t,"Hover",{enumerable:!0,get:function(){return n.Hover}}),Object.defineProperty(t,"MarkedString",{enumerable:!0,get:function(){return n.MarkedString}}),Object.defineProperty(t,"CodeActionContext",{enumerable:!0,get:function(){return n.CodeActionContext}}),Object.defineProperty(t,"Command",{enumerable:!0,get:function(){return n.Command}}),Object.defineProperty(t,"CodeAction",{enumerable:!0,get:function(){return n.CodeAction}}),Object.defineProperty(t,"DocumentHighlight",{enumerable:!0,get:function(){return n.DocumentHighlight}}),Object.defineProperty(t,"DocumentLink",{enumerable:!0,get:function(){return n.DocumentLink}}),Object.defineProperty(t,"WorkspaceEdit",{enumerable:!0,get:function(){return n.WorkspaceEdit}}),Object.defineProperty(t,"TextEdit",{enumerable:!0,get:function(){return n.TextEdit}}),Object.defineProperty(t,"CodeActionKind",{enumerable:!0,get:function(){return n.CodeActionKind}}),Object.defineProperty(t,"TextDocumentEdit",{enumerable:!0,get:function(){return n.TextDocumentEdit}}),Object.defineProperty(t,"VersionedTextDocumentIdentifier",{enumerable:!0,get:function(){return n.VersionedTextDocumentIdentifier}}),Object.defineProperty(t,"DocumentHighlightKind",{enumerable:!0,get:function(){return n.DocumentHighlightKind}});var r=e("vscode-languageserver-textdocument");Object.defineProperty(t,"TextDocument",{enumerable:!0,get:function(){return r.TextDocument}}),function(e){e.LATEST={textDocument:{completion:{completionItem:{documentationFormat:[n.MarkupKind.Markdown,n.MarkupKind.PlainText]}},hover:{contentFormat:[n.MarkupKind.Markdown,n.MarkupKind.PlainText]}}}}(t.ClientCapabilities||(t.ClientCapabilities={})),function(e){e[e.Unknown=0]="Unknown",e[e.File=1]="File",e[e.Directory=2]="Directory",e[e.SymbolicLink=64]="SymbolicLink"}(t.FileType||(t.FileType={}))})),function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define("vscode-uri/index",[],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(this,(function(){return(()=>{"use strict";var e={470:e=>{function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function n(e,t){for(var n,r="",i=0,o=-1,s=0,a=0;a<=e.length;++a){if(a2){var l=r.lastIndexOf("/");if(l!==r.length-1){-1===l?(r="",i=0):i=(r=r.slice(0,l)).length-1-r.lastIndexOf("/"),o=a,s=0;continue}}else if(2===r.length||1===r.length){r="",i=0,o=a,s=0;continue}t&&(r.length>0?r+="/..":r="..",i=2)}else r.length>0?r+="/"+e.slice(o+1,a):r=e.slice(o+1,a),i=a-o-1;o=a,s=0}else 46===n&&-1!==s?++s:s=-1}return r}var r={resolve:function(){for(var e,r="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var s;o>=0?s=arguments[o]:(void 0===e&&(e=process.cwd()),s=e),t(s),0!==s.length&&(r=s+"/"+r,i=47===s.charCodeAt(0))}return r=n(r,!i),i?r.length>0?"/"+r:"/":r.length>0?r:"."},normalize:function(e){if(t(e),0===e.length)return".";var r=47===e.charCodeAt(0),i=47===e.charCodeAt(e.length-1);return 0!==(e=n(e,!r)).length||r||(e="."),e.length>0&&i&&(e+="/"),r?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,n=0;n0&&(void 0===e?e=i:e+="/"+i)}return void 0===e?".":r.normalize(e)},relative:function(e,n){if(t(e),t(n),e===n)return"";if((e=r.resolve(e))===(n=r.resolve(n)))return"";for(var i=1;ic){if(47===n.charCodeAt(a+p))return n.slice(a+p+1);if(0===p)return n.slice(a+p)}else s>c&&(47===e.charCodeAt(i+p)?d=p:0===p&&(d=0));break}var h=e.charCodeAt(i+p);if(h!==n.charCodeAt(a+p))break;47===h&&(d=p)}var u="";for(p=i+d+1;p<=o;++p)p!==o&&47!==e.charCodeAt(p)||(0===u.length?u+="..":u+="/..");return u.length>0?u+n.slice(a+d):(a+=d,47===n.charCodeAt(a)&&++a,n.slice(a))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var n=e.charCodeAt(0),r=47===n,i=-1,o=!0,s=e.length-1;s>=1;--s)if(47===(n=e.charCodeAt(s))){if(!o){i=s;break}}else o=!1;return-1===i?r?"/":".":r&&1===i?"//":e.slice(0,i)},basename:function(e,n){if(void 0!==n&&"string"!=typeof n)throw new TypeError('"ext" argument must be a string');t(e);var r,i=0,o=-1,s=!0;if(void 0!==n&&n.length>0&&n.length<=e.length){if(n.length===e.length&&n===e)return"";var a=n.length-1,l=-1;for(r=e.length-1;r>=0;--r){var c=e.charCodeAt(r);if(47===c){if(!s){i=r+1;break}}else-1===l&&(s=!1,l=r+1),a>=0&&(c===n.charCodeAt(a)?-1==--a&&(o=r):(a=-1,o=l))}return i===o?o=l:-1===o&&(o=e.length),e.slice(i,o)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!s){i=r+1;break}}else-1===o&&(s=!1,o=r+1);return-1===o?"":e.slice(i,o)},extname:function(e){t(e);for(var n=-1,r=0,i=-1,o=!0,s=0,a=e.length-1;a>=0;--a){var l=e.charCodeAt(a);if(47!==l)-1===i&&(o=!1,i=a+1),46===l?-1===n?n=a:1!==s&&(s=1):-1!==n&&(s=-1);else if(!o){r=a+1;break}}return-1===n||-1===i||0===s||1===s&&n===i-1&&n===r+1?"":e.slice(n,i)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var n=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+r:n+"/"+r:r}(0,e)},parse:function(e){t(e);var n={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return n;var r,i=e.charCodeAt(0),o=47===i;o?(n.root="/",r=1):r=0;for(var s=-1,a=0,l=-1,c=!0,d=e.length-1,p=0;d>=r;--d)if(47!==(i=e.charCodeAt(d)))-1===l&&(c=!1,l=d+1),46===i?-1===s?s=d:1!==p&&(p=1):-1!==s&&(p=-1);else if(!c){a=d+1;break}return-1===s||-1===l||0===p||1===p&&s===l-1&&s===a+1?-1!==l&&(n.base=n.name=0===a&&o?e.slice(1,l):e.slice(a,l)):(0===a&&o?(n.name=e.slice(1,s),n.base=e.slice(1,l)):(n.name=e.slice(a,s),n.base=e.slice(a,l)),n.ext=e.slice(s,l)),a>0?n.dir=e.slice(0,a-1):o&&(n.dir="/"),n},sep:"/",delimiter:":",win32:null,posix:null};r.posix=r,e.exports=r},465:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utils=t.URI=void 0;var r=n(796);Object.defineProperty(t,"URI",{enumerable:!0,get:function(){return r.URI}});var i=n(679);Object.defineProperty(t,"Utils",{enumerable:!0,get:function(){return i.Utils}})},674:(e,t)=>{if(Object.defineProperty(t,"__esModule",{value:!0}),t.isWindows=void 0,"object"==typeof process)t.isWindows="win32"===process.platform;else if("object"==typeof navigator){var n=navigator.userAgent;t.isWindows=n.indexOf("Windows")>=0}},796:function(e,t,n){var r,i,o=this&&this.__extends||(r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0}),t.uriToFsPath=t.URI=void 0;var s=n(674),a=/^\w[\w\d+.-]*$/,l=/^\//,c=/^\/\//,d="",p="/",h=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,u=function(){function e(e,t,n,r,i,o){void 0===o&&(o=!1),"object"==typeof e?(this.scheme=e.scheme||d,this.authority=e.authority||d,this.path=e.path||d,this.query=e.query||d,this.fragment=e.fragment||d):(this.scheme=function(e,t){return e||t?e:"file"}(e,o),this.authority=t||d,this.path=function(e,t){switch(e){case"https":case"http":case"file":t?t[0]!==p&&(t=p+t):t=p}return t}(this.scheme,n||d),this.query=r||d,this.fragment=i||d,function(e,t){if(!e.scheme&&t)throw new Error('[UriError]: Scheme is missing: {scheme: "", authority: "'+e.authority+'", path: "'+e.path+'", query: "'+e.query+'", fragment: "'+e.fragment+'"}');if(e.scheme&&!a.test(e.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(e.path)if(e.authority){if(!l.test(e.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(c.test(e.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}(this,o))}return e.isUri=function(t){return t instanceof e||!!t&&"string"==typeof t.authority&&"string"==typeof t.fragment&&"string"==typeof t.path&&"string"==typeof t.query&&"string"==typeof t.scheme&&"function"==typeof t.fsPath&&"function"==typeof t.with&&"function"==typeof t.toString},Object.defineProperty(e.prototype,"fsPath",{get:function(){return v(this,!1)},enumerable:!1,configurable:!0}),e.prototype.with=function(e){if(!e)return this;var t=e.scheme,n=e.authority,r=e.path,i=e.query,o=e.fragment;return void 0===t?t=this.scheme:null===t&&(t=d),void 0===n?n=this.authority:null===n&&(n=d),void 0===r?r=this.path:null===r&&(r=d),void 0===i?i=this.query:null===i&&(i=d),void 0===o?o=this.fragment:null===o&&(o=d),t===this.scheme&&n===this.authority&&r===this.path&&i===this.query&&o===this.fragment?this:new f(t,n,r,i,o)},e.parse=function(e,t){void 0===t&&(t=!1);var n=h.exec(e);return n?new f(n[2]||d,k(n[4]||d),k(n[5]||d),k(n[7]||d),k(n[9]||d),t):new f(d,d,d,d,d)},e.file=function(e){var t=d;if(s.isWindows&&(e=e.replace(/\\/g,p)),e[0]===p&&e[1]===p){var n=e.indexOf(p,2);-1===n?(t=e.substring(2),e=p):(t=e.substring(2,n),e=e.substring(n)||p)}return new f("file",t,e,d,d)},e.from=function(e){return new f(e.scheme,e.authority,e.path,e.query,e.fragment)},e.prototype.toString=function(e){return void 0===e&&(e=!1),w(this,e)},e.prototype.toJSON=function(){return this},e.revive=function(t){if(t){if(t instanceof e)return t;var n=new f(t);return n._formatted=t.external,n._fsPath=t._sep===m?t.fsPath:null,n}return t},e}();t.URI=u;var m=s.isWindows?1:void 0,f=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._formatted=null,t._fsPath=null,t}return o(t,e),Object.defineProperty(t.prototype,"fsPath",{get:function(){return this._fsPath||(this._fsPath=v(this,!1)),this._fsPath},enumerable:!1,configurable:!0}),t.prototype.toString=function(e){return void 0===e&&(e=!1),e?w(this,!0):(this._formatted||(this._formatted=w(this,!1)),this._formatted)},t.prototype.toJSON=function(){var e={$mid:1};return this._fsPath&&(e.fsPath=this._fsPath,e._sep=m),this._formatted&&(e.external=this._formatted),this.path&&(e.path=this.path),this.scheme&&(e.scheme=this.scheme),this.authority&&(e.authority=this.authority),this.query&&(e.query=this.query),this.fragment&&(e.fragment=this.fragment),e},t}(u),g=((i={})[58]="%3A",i[47]="%2F",i[63]="%3F",i[35]="%23",i[91]="%5B",i[93]="%5D",i[64]="%40",i[33]="%21",i[36]="%24",i[38]="%26",i[39]="%27",i[40]="%28",i[41]="%29",i[42]="%2A",i[43]="%2B",i[44]="%2C",i[59]="%3B",i[61]="%3D",i[32]="%20",i);function b(e,t){for(var n=void 0,r=-1,i=0;i=97&&o<=122||o>=65&&o<=90||o>=48&&o<=57||45===o||46===o||95===o||126===o||t&&47===o)-1!==r&&(n+=encodeURIComponent(e.substring(r,i)),r=-1),void 0!==n&&(n+=e.charAt(i));else{void 0===n&&(n=e.substr(0,i));var s=g[o];void 0!==s?(-1!==r&&(n+=encodeURIComponent(e.substring(r,i)),r=-1),n+=s):-1===r&&(r=i)}}return-1!==r&&(n+=encodeURIComponent(e.substring(r))),void 0!==n?n:e}function y(e){for(var t=void 0,n=0;n1&&"file"===e.scheme?"//"+e.authority+e.path:47===e.path.charCodeAt(0)&&(e.path.charCodeAt(1)>=65&&e.path.charCodeAt(1)<=90||e.path.charCodeAt(1)>=97&&e.path.charCodeAt(1)<=122)&&58===e.path.charCodeAt(2)?t?e.path.substr(1):e.path[1].toLowerCase()+e.path.substr(2):e.path,s.isWindows&&(n=n.replace(/\//g,"\\")),n}function w(e,t){var n=t?y:b,r="",i=e.scheme,o=e.authority,s=e.path,a=e.query,l=e.fragment;if(i&&(r+=i,r+=":"),(o||"file"===i)&&(r+=p,r+=p),o){var c=o.indexOf("@");if(-1!==c){var d=o.substr(0,c);o=o.substr(c+1),-1===(c=d.indexOf(":"))?r+=n(d,!1):(r+=n(d.substr(0,c),!1),r+=":",r+=n(d.substr(c+1),!1)),r+="@"}-1===(c=(o=o.toLowerCase()).indexOf(":"))?r+=n(o,!1):(r+=n(o.substr(0,c),!1),r+=o.substr(c))}if(s){if(s.length>=3&&47===s.charCodeAt(0)&&58===s.charCodeAt(2))(h=s.charCodeAt(1))>=65&&h<=90&&(s="/"+String.fromCharCode(h+32)+":"+s.substr(3));else if(s.length>=2&&58===s.charCodeAt(1)){var h;(h=s.charCodeAt(0))>=65&&h<=90&&(s=String.fromCharCode(h+32)+":"+s.substr(2))}r+=n(s,!0)}return a&&(r+="?",r+=n(a,!1)),l&&(r+="#",r+=t?l:b(l,!1)),r}function x(e){try{return decodeURIComponent(e)}catch(t){return e.length>3?e.substr(0,3)+x(e.substr(3)):e}}t.uriToFsPath=v;var S=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function k(e){return e.match(S)?e.replace(S,(function(e){return x(e)})):e}},679:function(e,t,n){var r=this&&this.__spreadArrays||function(){for(var e=0,t=0,n=arguments.length;t0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=0&&-1===' \t\n\r":{[()]},*>+'.indexOf(r.charAt(n));)n--;return r.substring(n+1,t)}(e,this.offset),this.defaultReplaceRange=a.Range.create(a.Position.create(this.position.line,this.position.character-this.currentWord.length),this.position),this.textDocument=e,this.styleSheet=n,this.documentSettings=i;try{var o={isIncomplete:!1,items:[]};this.nodePath=r.getNodePath(this.styleSheet,this.offset);for(var s=this.nodePath.length-1;s>=0;s--){var l=this.nodePath[s];if(l instanceof r.Property)this.getCompletionsForDeclarationProperty(l.getParent(),o);else if(l instanceof r.Expression)l.parent instanceof r.Interpolation?this.getVariableProposals(null,o):this.getCompletionsForExpression(l,o);else if(l instanceof r.SimpleSelector){var c=l.findAParent(r.NodeType.ExtendsReference,r.NodeType.Ruleset);if(c)if(c.type===r.NodeType.ExtendsReference)this.getCompletionsForExtendsReference(c,l,o);else{var d=c;this.getCompletionsForSelector(d,d&&d.isNested(),o)}}else if(l instanceof r.FunctionArgument)this.getCompletionsForFunctionArgument(l,l.getParent(),o);else if(l instanceof r.Declarations)this.getCompletionsForDeclarations(l,o);else if(l instanceof r.VariableDeclaration)this.getCompletionsForVariableDeclaration(l,o);else if(l instanceof r.RuleSet)this.getCompletionsForRuleSet(l,o);else if(l instanceof r.Interpolation)this.getCompletionsForInterpolation(l,o);else if(l instanceof r.FunctionDeclaration)this.getCompletionsForFunctionDeclaration(l,o);else if(l instanceof r.MixinReference)this.getCompletionsForMixinReference(l,o);else if(l instanceof r.Function)this.getCompletionsForFunctionArgument(null,l,o);else if(l instanceof r.Supports)this.getCompletionsForSupports(l,o);else if(l instanceof r.SupportsCondition)this.getCompletionsForSupportsCondition(l,o);else if(l instanceof r.ExtendsReference)this.getCompletionsForExtendsReference(l,null,o);else if(l.type===r.NodeType.URILiteral)this.getCompletionForUriLiteralValue(l,o);else if(null===l.parent)this.getCompletionForTopLevel(o);else{if(l.type!==r.NodeType.StringLiteral||!this.isImportPathParent(l.parent.type))continue;this.getCompletionForImportPath(l,o)}if(o.items.length>0||this.offset>l.offset)return this.finalize(o)}return this.getCompletionsForStylesheet(o),0===o.items.length&&this.variablePrefix&&0===this.currentWord.indexOf(this.variablePrefix)&&this.getVariableProposals(null,o),this.finalize(o)}finally{this.position=null,this.currentWord=null,this.textDocument=null,this.styleSheet=null,this.symbolContext=null,this.defaultReplaceRange=null,this.nodePath=null}},e.prototype.isImportPathParent=function(e){return e===r.NodeType.Import},e.prototype.finalize=function(e){return e},e.prototype.findInNodePath=function(){for(var e=[],t=0;t=0;n--){var r=this.nodePath[n];if(-1!==e.indexOf(r.type))return r}return null},e.prototype.getCompletionsForDeclarationProperty=function(e,t){return this.getPropertyProposals(e,t)},e.prototype.getPropertyProposals=function(e,t){var r=this,i=this.isTriggerPropertyValueCompletionEnabled,l=this.isCompletePropertyWithSemicolonEnabled;return this.cssDataManager.getProperties().forEach((function(d){var p,h,u=!1;e?(p=r.getCompletionRange(e.getProperty()),h=d.name,c.isDefined(e.colonPosition)||(h+=": ",u=!0)):(p=r.getCompletionRange(null),h=d.name+": ",u=!0),!e&&l&&(h+="$0;"),e&&!e.semicolonPosition&&l&&r.offset>=r.textDocument.offsetAt(p.end)&&(h+="$0;");var f={label:d.name,documentation:o.getEntryDescription(d,r.doesSupportMarkdown()),tags:m(d)?[a.CompletionItemTag.Deprecated]:[],textEdit:a.TextEdit.replace(p,h),insertTextFormat:a.InsertTextFormat.Snippet,kind:a.CompletionItemKind.Property};d.restrictions||(u=!1),i&&u&&(f.command={title:"Suggest",command:"editor.action.triggerSuggest"});var g=(255-("number"==typeof d.relevance?Math.min(Math.max(d.relevance,0),99):50)).toString(16),b=s.startsWith(d.name,"-")?n.VendorPrefixed:n.Normal;f.sortText=b+"_"+g,t.items.push(f)})),this.completionParticipants.forEach((function(e){e.onCssProperty&&e.onCssProperty({propertyName:r.currentWord,range:r.defaultReplaceRange})})),t},Object.defineProperty(e.prototype,"isTriggerPropertyValueCompletionEnabled",{get:function(){var e,t;return null===(t=null===(e=this.documentSettings)||void 0===e?void 0:e.triggerPropertyValueCompletion)||void 0===t||t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isCompletePropertyWithSemicolonEnabled",{get:function(){var e,t;return null===(t=null===(e=this.documentSettings)||void 0===e?void 0:e.completePropertyWithSemicolon)||void 0===t||t},enumerable:!1,configurable:!0}),e.prototype.getCompletionsForDeclarationValue=function(e,t){for(var n=this,i=e.getFullPropertyName(),o=this.cssDataManager.getProperty(i),s=e.getValue()||null;s&&s.hasChildren();)s=s.findChildAtOffset(this.offset,!1);if(this.completionParticipants.forEach((function(e){e.onCssPropertyValue&&e.onCssPropertyValue({propertyName:i,propertyValue:n.currentWord,range:n.getCompletionRange(s)})})),o){if(o.restrictions)for(var l=0,c=o.restrictions;l=e.offset+2&&this.getVariableProposals(null,t),t},e.prototype.getVariableProposals=function(e,t){for(var i=0,o=this.getSymbolContext().findSymbolsAtOffset(this.offset,r.ReferenceType.Variable);i0){var s=this.currentWord.match(/^-?\d[\.\d+]*/);s&&(i=s[0],n.isIncomplete=i.length===this.currentWord.length)}else 0===this.currentWord.length&&(n.isIncomplete=!0);if(t&&t.parent&&t.parent.type===r.NodeType.Term&&(t=t.getParent()),e.restrictions)for(var l=0,c=e.restrictions;l=n.end?this.getCompletionForTopLevel(t):!n||this.offset<=n.offset?this.getCompletionsForSelector(e,e.isNested(),t):this.getCompletionsForDeclarations(e.getDeclarations(),t)},e.prototype.getCompletionsForSelector=function(e,t,i){var l=this,c=this.findInNodePath(r.NodeType.PseudoSelector,r.NodeType.IdentifierSelector,r.NodeType.ClassSelector,r.NodeType.ElementNameSelector);if(!c&&this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord,this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord),this.defaultReplaceRange=a.Range.create(a.Position.create(this.position.line,this.position.character-this.currentWord.length),this.position)),this.cssDataManager.getPseudoClasses().forEach((function(e){var t=g(e.name),r={label:e.name,textEdit:a.TextEdit.replace(l.getCompletionRange(c),t),documentation:o.getEntryDescription(e,l.doesSupportMarkdown()),tags:m(e)?[a.CompletionItemTag.Deprecated]:[],kind:a.CompletionItemKind.Function,insertTextFormat:e.name!==t?h:void 0};s.startsWith(e.name,":-")&&(r.sortText=n.VendorPrefixed),i.items.push(r)})),this.cssDataManager.getPseudoElements().forEach((function(e){var t=g(e.name),r={label:e.name,textEdit:a.TextEdit.replace(l.getCompletionRange(c),t),documentation:o.getEntryDescription(e,l.doesSupportMarkdown()),tags:m(e)?[a.CompletionItemTag.Deprecated]:[],kind:a.CompletionItemKind.Function,insertTextFormat:e.name!==t?h:void 0};s.startsWith(e.name,"::-")&&(r.sortText=n.VendorPrefixed),i.items.push(r)})),!t){for(var d=0,p=o.html5Tags;d0){var t=v.substr(e.offset,e.length);return"."!==t.charAt(0)||y[t]||(y[t]=!0,i.items.push({label:t,textEdit:a.TextEdit.replace(l.getCompletionRange(c),t),kind:a.CompletionItemKind.Keyword})),!1}return!0})),e&&e.isNested()){var w=e.getSelectors().findFirstChildBeforeOffset(this.offset);w&&0===e.getSelectors().getChildren().indexOf(w)&&this.getPropertyProposals(null,i)}return i},e.prototype.getCompletionsForDeclarations=function(e,t){if(!e||this.offset===e.offset)return t;var n=e.findFirstChildBeforeOffset(this.offset);if(!n)return this.getCompletionsForDeclarationProperty(null,t);if(n instanceof r.AbstractDeclaration){var i=n;if(!c.isDefined(i.colonPosition)||this.offset<=i.colonPosition)return this.getCompletionsForDeclarationProperty(i,t);if(c.isDefined(i.semicolonPosition)&&i.semicolonPositione.colonPosition&&this.getVariableProposals(e.getValue(),t),t},e.prototype.getCompletionsForExpression=function(e,t){var n=e.getParent();if(n instanceof r.FunctionArgument)return this.getCompletionsForFunctionArgument(n,n.getParent(),t),t;var i=e.findParent(r.NodeType.Declaration);if(!i)return this.getTermProposals(void 0,null,t),t;var o=e.findChildAtOffset(this.offset,!0);return o?o instanceof r.NumericValue||o instanceof r.Identifier?this.getCompletionsForDeclarationValue(i,t):t:this.getCompletionsForDeclarationValue(i,t)},e.prototype.getCompletionsForFunctionArgument=function(e,t,n){var r=t.getIdentifier();return r&&r.matches("var")&&(t.getArguments().hasChildren()&&t.getArguments().getChild(0)!==e||this.getVariableProposalsForCSSVarFunction(n)),n},e.prototype.getCompletionsForFunctionDeclaration=function(e,t){var n=e.getDeclarations();return n&&this.offset>n.offset&&this.offsete.lParent&&(!c.isDefined(e.rParent)||this.offset<=e.rParent)?this.getCompletionsForDeclarationProperty(null,t):t},e.prototype.getCompletionsForSupports=function(e,t){var n=e.getDeclarations();if(!n||this.offset<=n.offset){var i=e.findFirstChildBeforeOffset(this.offset);return i instanceof r.SupportsCondition?this.getCompletionsForSupportsCondition(i,t):t}return this.getCompletionForTopLevel(t)},e.prototype.getCompletionsForExtendsReference=function(e,t,n){return n},e.prototype.getCompletionForUriLiteralValue=function(e,t){var n,r,i;if(e.hasChildren()){var o=e.getChild(0);n=o.getText(),r=this.position,i=this.getCompletionRange(o)}else{n="",r=this.position;var s=this.textDocument.positionAt(e.offset+"url(".length);i=a.Range.create(s,s)}return this.completionParticipants.forEach((function(e){e.onCssURILiteralValue&&e.onCssURILiteralValue({uriValue:n,position:r,range:i})})),t},e.prototype.getCompletionForImportPath=function(e,t){var n=this;return this.completionParticipants.forEach((function(t){t.onCssImportPath&&t.onCssImportPath({pathValue:e.getText(),position:n.position,range:n.getCompletionRange(e)})})),t},e.prototype.hasCharacterAtPosition=function(e,t){var n=this.textDocument.getText();return e>=0&&e"),this.writeLine(t,r.join(""))}},e}();!function(e){function t(e){var t=e.match(/^['"](.*)["']$/);return t?t[1]:e}e.ensure=function(e,n){return n+t(e)+n},e.remove=t}(l||(l={}));var d=function(){this.id=0,this.attr=0,this.tag=0};function p(e,t){for(var r=new o,i=0,s=e.getChildren();i1){var p=t.cloneWithParent();r.addChild(p.findRoot()),r=p}r.append(c[d])}}break;case n.NodeType.SelectorPlaceholder:if(a.matches("@at-root"))return r;case n.NodeType.ElementNameSelector:var u=a.getText();r.addAttr("name","*"===u?"element":h(u));break;case n.NodeType.ClassSelector:r.addAttr("class",h(a.getText().substring(1)));break;case n.NodeType.IdentifierSelector:r.addAttr("id",h(a.getText().substring(1)));break;case n.NodeType.MixinDeclaration:r.addAttr("class",a.getName());break;case n.NodeType.PseudoSelector:r.addAttr(h(a.getText()),"");break;case n.NodeType.AttributeSelector:var m=a,f=m.getIdentifier();if(f){var g=m.getValue(),b=m.getOperator(),y=void 0;if(g&&b)switch(h(b.getText())){case"|=":y=l.remove(h(g.getText()))+"-…";break;case"^=":y=l.remove(h(g.getText()))+"…";break;case"$=":y="…"+l.remove(h(g.getText()));break;case"~=":y=" … "+l.remove(h(g.getText()))+" … ";break;case"*=":y="…"+l.remove(h(g.getText()))+"…";break;default:y=l.remove(h(g.getText()))}r.addAttr(h(f.getText()),y)}}}return r}function h(e){var t=new r.Scanner;t.setSource(e);var n=t.scanUnquotedString();return n?n.text:e}t.toElement=p;var u=function(){function e(e){this.cssDataManager=e}return e.prototype.selectorToMarkedString=function(e){var t=g(e);if(t){var n=new c('"').print(t);return n.push(this.selectorToSpecificityMarkedString(e)),n}return[]},e.prototype.simpleSelectorToMarkedString=function(e){var t=p(e),n=new c('"').print(t);return n.push(this.selectorToSpecificityMarkedString(e)),n},e.prototype.isPseudoElementIdentifier=function(e){var t=e.match(/^::?([\w-]+)/);return!!t&&!!this.cssDataManager.getPseudoElement("::"+t[1])},e.prototype.selectorToSpecificityMarkedString=function(e){var t=this,r=function(e){for(var i=0,s=e.getChildren();i0&&r(a)}},o=new d;return r(e),i("specificity","[Selector Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity): ({0}, {1}, {2})",o.id,o.attr,o.tag)},e}();t.SelectorPrinting=u;var m=function(){function e(e){this.prev=null,this.element=e}return e.prototype.processSelector=function(e){var t=null;if(!(this.element instanceof s)&&e.getChildren().some((function(e){return e.hasChildren()&&e.getChild(0).type===n.NodeType.SelectorCombinator}))){var r=this.element.findRoot();r.parent instanceof s&&(t=this.element,this.element=r.parent,this.element.removeChild(r),this.prev=null)}for(var i=0,o=e.getChildren();i=0;l--){var c=r[l].getSelectors().getChild(0);c&&a.processSelector(c)}return a.processSelector(e),t}t.selectorToElement=g})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/cssHover",["require","exports","../parser/cssNodes","../languageFacts/facts","./selectorPrinting","../utils/strings","../cssLanguageTypes","../utils/objects"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CSSHover=void 0;var n=e("../parser/cssNodes"),r=e("../languageFacts/facts"),i=e("./selectorPrinting"),o=e("../utils/strings"),s=e("../cssLanguageTypes"),a=e("../utils/objects"),l=function(){function e(e,t){this.clientCapabilities=e,this.cssDataManager=t,this.selectorPrinting=new i.SelectorPrinting(t)}return e.prototype.configure=function(e){this.defaultSettings=e},e.prototype.doHover=function(e,t,i,a){function l(t){return s.Range.create(e.positionAt(t.offset),e.positionAt(t.end))}void 0===a&&(a=this.defaultSettings);for(var c=e.offsetAt(t),d=n.getNodePath(i,c),p=null,h=0;h0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=a.length/2&&l.push({property:e.name,score:t})})),l.sort((function(e,t){return t.score-e.score||e.property.localeCompare(t.property)}));for(var c=3,d=0,p=l;d=0;c--){var d=l[c];if(d instanceof n.Declaration){var p=d.getProperty();if(p&&p.offset===s&&p.end===a)return void this.getFixesForUnknownProperty(e,p,r,o)}}},e}();t.CSSCodeActions=a})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/lintUtil",["require","exports","../utils/arrays"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Element=void 0;var n=e("../utils/arrays"),r=function(e){this.fullPropertyName=e.getFullPropertyName().toLowerCase(),this.node=e};function i(e,t,r,i){var o=e[t];o.value=r,r&&(n.includes(o.properties,i)||o.properties.push(i))}function o(e,t,n,r){"top"===t||"right"===t||"bottom"===t||"left"===t?i(e,t,n,r):function(e,t,n){i(e,"top",t,n),i(e,"right",t,n),i(e,"bottom",t,n),i(e,"left",t,n)}(e,n,r)}function s(e,t,n){switch(t.length){case 1:o(e,void 0,t[0],n);break;case 2:o(e,"top",t[0],n),o(e,"bottom",t[0],n),o(e,"right",t[1],n),o(e,"left",t[1],n);break;case 3:o(e,"top",t[0],n),o(e,"right",t[1],n),o(e,"left",t[1],n),o(e,"bottom",t[2],n);break;case 4:o(e,"top",t[0],n),o(e,"right",t[1],n),o(e,"bottom",t[2],n),o(e,"left",t[3],n)}}function a(e,t){for(var n=0,r=t;n0)for(var w=this.fetch(r,"float"),x=0;x0)for(w=this.fetch(r,"vertical-align"),x=0;x1)for(var D=0;D".charCodeAt(0),m=".".charCodeAt(0),f=("@".charCodeAt(0),n.TokenType.CustomToken);t.VariableName=f++,t.InterpolationFunction=f++,t.Default=f++,t.EqualsOperator=f++,t.NotEqualsOperator=f++,t.GreaterEqualsOperator=f++,t.SmallerEqualsOperator=f++,t.Ellipsis=f++,t.Module=f++;var g=function(e){function f(){return null!==e&&e.apply(this,arguments)||this}return __extends(f,e),f.prototype.scanNext=function(r){if(this.stream.advanceIfChar(a)){var i=["$"];if(this.ident(i))return this.finishToken(r,t.VariableName,i.join(""));this.stream.goBackTo(r)}return this.stream.advanceIfChars([l,c])?this.finishToken(r,t.InterpolationFunction):this.stream.advanceIfChars([d,d])?this.finishToken(r,t.EqualsOperator):this.stream.advanceIfChars([p,d])?this.finishToken(r,t.NotEqualsOperator):this.stream.advanceIfChar(h)?this.stream.advanceIfChar(d)?this.finishToken(r,t.SmallerEqualsOperator):this.finishToken(r,n.TokenType.Delim):this.stream.advanceIfChar(u)?this.stream.advanceIfChar(d)?this.finishToken(r,t.GreaterEqualsOperator):this.finishToken(r,n.TokenType.Delim):this.stream.advanceIfChars([m,m,m])?this.finishToken(r,t.Ellipsis):e.prototype.scanNext.call(this,r)},f.prototype.comment=function(){return!!e.prototype.comment.call(this)||!(this.inURL||!this.stream.advanceIfChars([r,r]))&&(this.stream.advanceWhileChar((function(e){switch(e){case i:case o:case s:return!1;default:return!0}})),!0)},f}(n.Scanner);t.SCSSScanner=g})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/scssErrors",["require","exports","vscode-nls"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCSSParseError=t.SCSSIssueType=void 0;var n=e("vscode-nls").loadMessageBundle(),r=function(e,t){this.id=e,this.message=t};t.SCSSIssueType=r,t.SCSSParseError={FromExpected:new r("scss-fromexpected",n("expected.from","'from' expected")),ThroughOrToExpected:new r("scss-throughexpected",n("expected.through","'through' or 'to' expected")),InExpected:new r("scss-fromexpected",n("expected.in","'in' expected"))}}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/scssParser",["require","exports","./scssScanner","./cssScanner","./cssParser","./cssNodes","./scssErrors","./cssErrors"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCSSParser=void 0;var n=e("./scssScanner"),r=e("./cssScanner"),i=e("./cssParser"),o=e("./cssNodes"),s=e("./scssErrors"),a=e("./cssErrors"),l=function(e){function t(){return e.call(this,new n.SCSSScanner)||this}return __extends(t,e),t.prototype._parseStylesheetStatement=function(t){return void 0===t&&(t=!1),this.peek(r.TokenType.AtKeyword)?this._parseWarnAndDebug()||this._parseControlStatement()||this._parseMixinDeclaration()||this._parseMixinContent()||this._parseMixinReference()||this._parseFunctionDeclaration()||this._parseForward()||this._parseUse()||this._parseRuleset(t)||e.prototype._parseStylesheetAtStatement.call(this,t):this._parseRuleset(!0)||this._parseVariableDeclaration()},t.prototype._parseImport=function(){if(!this.peekKeyword("@import"))return null;var e=this.create(o.Import);if(this.consumeToken(),!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))return this.finish(e,a.ParseError.URIOrStringExpected);for(;this.accept(r.TokenType.Comma);)if(!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))return this.finish(e,a.ParseError.URIOrStringExpected);return this.peek(r.TokenType.SemiColon)||this.peek(r.TokenType.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e)},t.prototype._parseVariableDeclaration=function(e){if(void 0===e&&(e=[]),!this.peek(n.VariableName))return null;var t=this.create(o.VariableDeclaration);if(!t.setVariable(this._parseVariable()))return null;if(!this.accept(r.TokenType.Colon))return this.finish(t,a.ParseError.ColonExpected);if(this.prevToken&&(t.colonPosition=this.prevToken.offset),!t.setValue(this._parseExpr()))return this.finish(t,a.ParseError.VariableValueExpected,[],e);for(;this.peek(r.TokenType.Exclamation);)if(t.addChild(this._tryParsePrio()));else{if(this.consumeToken(),!this.peekRegExp(r.TokenType.Ident,/^(default|global)$/))return this.finish(t,a.ParseError.UnknownKeyword);this.consumeToken()}return this.peek(r.TokenType.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)},t.prototype._parseMediaContentStart=function(){return this._parseInterpolation()},t.prototype._parseMediaFeatureName=function(){return this._parseModuleMember()||this._parseFunction()||this._parseIdent()||this._parseVariable()},t.prototype._parseKeyframeSelector=function(){return this._tryParseKeyframeSelector()||this._parseControlStatement(this._parseKeyframeSelector.bind(this))||this._parseVariableDeclaration()||this._parseMixinContent()},t.prototype._parseVariable=function(){if(!this.peek(n.VariableName))return null;var e=this.create(o.Variable);return this.consumeToken(),e},t.prototype._parseModuleMember=function(){var e=this.mark(),t=this.create(o.Module);return t.setIdentifier(this._parseIdent([o.ReferenceType.Module]))?this.hasWhitespace()||!this.acceptDelim(".")||this.hasWhitespace()?(this.restoreAtMark(e),null):t.addChild(this._parseVariable()||this._parseFunction())?t:this.finish(t,a.ParseError.IdentifierOrVariableExpected):null},t.prototype._parseIdent=function(e){var t=this;if(!this.peek(r.TokenType.Ident)&&!this.peek(n.InterpolationFunction)&&!this.peekDelim("-"))return null;var i=this.create(o.Identifier);i.referenceTypes=e,i.isCustomProperty=this.peekRegExp(r.TokenType.Ident,/^--/);for(var s,a=!1;(this.accept(r.TokenType.Ident)||i.addChild((s=void 0,s=t.mark(),t.acceptDelim("-")&&(t.hasWhitespace()||t.acceptDelim("-"),t.hasWhitespace())?(t.restoreAtMark(s),null):t._parseInterpolation()))||a&&this.acceptRegexp(/^[\w-]/))&&(a=!0,!this.hasWhitespace()););return a?this.finish(i):null},t.prototype._parseTermExpression=function(){return this._parseModuleMember()||this._parseVariable()||this._parseSelectorCombinator()||e.prototype._parseTermExpression.call(this)},t.prototype._parseInterpolation=function(){if(this.peek(n.InterpolationFunction)){var e=this.create(o.Interpolation);return this.consumeToken(),e.addChild(this._parseExpr())||this._parseSelectorCombinator()?this.accept(r.TokenType.CurlyR)?this.finish(e):this.finish(e,a.ParseError.RightCurlyExpected):this.accept(r.TokenType.CurlyR)?this.finish(e):this.finish(e,a.ParseError.ExpressionExpected)}return null},t.prototype._parseOperator=function(){if(this.peek(n.EqualsOperator)||this.peek(n.NotEqualsOperator)||this.peek(n.GreaterEqualsOperator)||this.peek(n.SmallerEqualsOperator)||this.peekDelim(">")||this.peekDelim("<")||this.peekIdent("and")||this.peekIdent("or")||this.peekDelim("%")){var t=this.createNode(o.NodeType.Operator);return this.consumeToken(),this.finish(t)}return e.prototype._parseOperator.call(this)},t.prototype._parseUnaryOperator=function(){if(this.peekIdent("not")){var t=this.create(o.Node);return this.consumeToken(),this.finish(t)}return e.prototype._parseUnaryOperator.call(this)},t.prototype._parseRuleSetDeclaration=function(){return this.peek(r.TokenType.AtKeyword)?this._parseKeyframe()||this._parseImport()||this._parseMedia(!0)||this._parseFontFace()||this._parseWarnAndDebug()||this._parseControlStatement()||this._parseFunctionDeclaration()||this._parseExtends()||this._parseMixinReference()||this._parseMixinContent()||this._parseMixinDeclaration()||this._parseRuleset(!0)||this._parseSupports(!0)||e.prototype._parseRuleSetDeclarationAtStatement.call(this):this._parseVariableDeclaration()||this._tryParseRuleset(!0)||e.prototype._parseRuleSetDeclaration.call(this)},t.prototype._parseDeclaration=function(e){var t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;var n=this.create(o.Declaration);if(!n.setProperty(this._parseProperty()))return null;if(!this.accept(r.TokenType.Colon))return this.finish(n,a.ParseError.ColonExpected,[r.TokenType.Colon],e||[r.TokenType.SemiColon]);this.prevToken&&(n.colonPosition=this.prevToken.offset);var i=!1;if(n.setValue(this._parseExpr())&&(i=!0,n.addChild(this._parsePrio())),this.peek(r.TokenType.CurlyL))n.setNestedProperties(this._parseNestedProperties());else if(!i)return this.finish(n,a.ParseError.PropertyValueExpected);return this.peek(r.TokenType.SemiColon)&&(n.semicolonPosition=this.token.offset),this.finish(n)},t.prototype._parseNestedProperties=function(){var e=this.create(o.NestedProperties);return this._parseBody(e,this._parseDeclaration.bind(this))},t.prototype._parseExtends=function(){if(this.peekKeyword("@extend")){var e=this.create(o.ExtendsReference);if(this.consumeToken(),!e.getSelectors().addChild(this._parseSimpleSelector()))return this.finish(e,a.ParseError.SelectorExpected);for(;this.accept(r.TokenType.Comma);)e.getSelectors().addChild(this._parseSimpleSelector());return this.accept(r.TokenType.Exclamation)&&!this.acceptIdent("optional")?this.finish(e,a.ParseError.UnknownKeyword):this.finish(e)}return null},t.prototype._parseSimpleSelectorBody=function(){return this._parseSelectorCombinator()||this._parseSelectorPlaceholder()||e.prototype._parseSimpleSelectorBody.call(this)},t.prototype._parseSelectorCombinator=function(){if(this.peekDelim("&")){var e=this.createNode(o.NodeType.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(r.TokenType.Num)||this.accept(r.TokenType.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null},t.prototype._parseSelectorPlaceholder=function(){if(this.peekDelim("%")){var e=this.createNode(o.NodeType.SelectorPlaceholder);return this.consumeToken(),this._parseIdent(),this.finish(e)}if(this.peekKeyword("@at-root")){e=this.createNode(o.NodeType.SelectorPlaceholder);return this.consumeToken(),this.finish(e)}return null},t.prototype._parseElementName=function(){var t=this.mark(),n=e.prototype._parseElementName.call(this);return n&&!this.hasWhitespace()&&this.peek(r.TokenType.ParenthesisL)?(this.restoreAtMark(t),null):n},t.prototype._tryParsePseudoIdentifier=function(){return this._parseInterpolation()||e.prototype._tryParsePseudoIdentifier.call(this)},t.prototype._parseWarnAndDebug=function(){if(!this.peekKeyword("@debug")&&!this.peekKeyword("@warn")&&!this.peekKeyword("@error"))return null;var e=this.createNode(o.NodeType.Debug);return this.consumeToken(),e.addChild(this._parseExpr()),this.finish(e)},t.prototype._parseControlStatement=function(e){return void 0===e&&(e=this._parseRuleSetDeclaration.bind(this)),this.peek(r.TokenType.AtKeyword)?this._parseIfStatement(e)||this._parseForStatement(e)||this._parseEachStatement(e)||this._parseWhileStatement(e):null},t.prototype._parseIfStatement=function(e){return this.peekKeyword("@if")?this._internalParseIfStatement(e):null},t.prototype._internalParseIfStatement=function(e){var t=this.create(o.IfStatement);if(this.consumeToken(),!t.setExpression(this._parseExpr(!0)))return this.finish(t,a.ParseError.ExpressionExpected);if(this._parseBody(t,e),this.acceptKeyword("@else"))if(this.peekIdent("if"))t.setElseClause(this._internalParseIfStatement(e));else if(this.peek(r.TokenType.CurlyL)){var n=this.create(o.ElseStatement);this._parseBody(n,e),t.setElseClause(n)}return this.finish(t)},t.prototype._parseForStatement=function(e){if(!this.peekKeyword("@for"))return null;var t=this.create(o.ForStatement);return this.consumeToken(),t.setVariable(this._parseVariable())?this.acceptIdent("from")?t.addChild(this._parseBinaryExpr())?this.acceptIdent("to")||this.acceptIdent("through")?t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,a.ParseError.ExpressionExpected,[r.TokenType.CurlyR]):this.finish(t,s.SCSSParseError.ThroughOrToExpected,[r.TokenType.CurlyR]):this.finish(t,a.ParseError.ExpressionExpected,[r.TokenType.CurlyR]):this.finish(t,s.SCSSParseError.FromExpected,[r.TokenType.CurlyR]):this.finish(t,a.ParseError.VariableNameExpected,[r.TokenType.CurlyR])},t.prototype._parseEachStatement=function(e){if(!this.peekKeyword("@each"))return null;var t=this.create(o.EachStatement);this.consumeToken();var n=t.getVariables();if(!n.addChild(this._parseVariable()))return this.finish(t,a.ParseError.VariableNameExpected,[r.TokenType.CurlyR]);for(;this.accept(r.TokenType.Comma);)if(!n.addChild(this._parseVariable()))return this.finish(t,a.ParseError.VariableNameExpected,[r.TokenType.CurlyR]);return this.finish(n),this.acceptIdent("in")?t.addChild(this._parseExpr())?this._parseBody(t,e):this.finish(t,a.ParseError.ExpressionExpected,[r.TokenType.CurlyR]):this.finish(t,s.SCSSParseError.InExpected,[r.TokenType.CurlyR])},t.prototype._parseWhileStatement=function(e){if(!this.peekKeyword("@while"))return null;var t=this.create(o.WhileStatement);return this.consumeToken(),t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,a.ParseError.ExpressionExpected,[r.TokenType.CurlyR])},t.prototype._parseFunctionBodyDeclaration=function(){return this._parseVariableDeclaration()||this._parseReturnStatement()||this._parseWarnAndDebug()||this._parseControlStatement(this._parseFunctionBodyDeclaration.bind(this))},t.prototype._parseFunctionDeclaration=function(){if(!this.peekKeyword("@function"))return null;var e=this.create(o.FunctionDeclaration);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([o.ReferenceType.Function])))return this.finish(e,a.ParseError.IdentifierExpected,[r.TokenType.CurlyR]);if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,a.ParseError.LeftParenthesisExpected,[r.TokenType.CurlyR]);if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);return this.accept(r.TokenType.ParenthesisR)?this._parseBody(e,this._parseFunctionBodyDeclaration.bind(this)):this.finish(e,a.ParseError.RightParenthesisExpected,[r.TokenType.CurlyR])},t.prototype._parseReturnStatement=function(){if(!this.peekKeyword("@return"))return null;var e=this.createNode(o.NodeType.ReturnStatement);return this.consumeToken(),e.addChild(this._parseExpr())?this.finish(e):this.finish(e,a.ParseError.ExpressionExpected)},t.prototype._parseMixinDeclaration=function(){if(!this.peekKeyword("@mixin"))return null;var e=this.create(o.MixinDeclaration);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([o.ReferenceType.Mixin])))return this.finish(e,a.ParseError.IdentifierExpected,[r.TokenType.CurlyR]);if(this.accept(r.TokenType.ParenthesisL)){if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected,[r.TokenType.CurlyR])}return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},t.prototype._parseParameterDeclaration=function(){var e=this.create(o.FunctionParameter);return e.setIdentifier(this._parseVariable())?(this.accept(n.Ellipsis),this.accept(r.TokenType.Colon)&&!e.setDefaultValue(this._parseExpr(!0))?this.finish(e,a.ParseError.VariableValueExpected,[],[r.TokenType.Comma,r.TokenType.ParenthesisR]):this.finish(e)):null},t.prototype._parseMixinContent=function(){if(!this.peekKeyword("@content"))return null;var e=this.create(o.MixinContentReference);if(this.consumeToken(),this.accept(r.TokenType.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,a.ParseError.ExpressionExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected)}return this.finish(e)},t.prototype._parseMixinReference=function(){if(!this.peekKeyword("@include"))return null;var e=this.create(o.MixinReference);this.consumeToken();var t=this._parseIdent([o.ReferenceType.Mixin]);if(!e.setIdentifier(t))return this.finish(e,a.ParseError.IdentifierExpected,[r.TokenType.CurlyR]);if(!this.hasWhitespace()&&this.acceptDelim(".")&&!this.hasWhitespace()){var n=this._parseIdent([o.ReferenceType.Mixin]);if(!n)return this.finish(e,a.ParseError.IdentifierExpected,[r.TokenType.CurlyR]);var i=this.create(o.Module);t.referenceTypes=[o.ReferenceType.Module],i.setIdentifier(t),e.setIdentifier(n),e.addChild(i)}if(this.accept(r.TokenType.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,a.ParseError.ExpressionExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected)}return(this.peekIdent("using")||this.peek(r.TokenType.CurlyL))&&e.setContent(this._parseMixinContentDeclaration()),this.finish(e)},t.prototype._parseMixinContentDeclaration=function(){var e=this.create(o.MixinContentDeclaration);if(this.acceptIdent("using")){if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,a.ParseError.LeftParenthesisExpected,[r.TokenType.CurlyL]);if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected,[r.TokenType.CurlyL])}return this.peek(r.TokenType.CurlyL)&&this._parseBody(e,this._parseMixinReferenceBodyStatement.bind(this)),this.finish(e)},t.prototype._parseMixinReferenceBodyStatement=function(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()},t.prototype._parseFunctionArgument=function(){var e=this.create(o.FunctionArgument),t=this.mark(),i=this._parseVariable();if(i)if(this.accept(r.TokenType.Colon))e.setIdentifier(i);else{if(this.accept(n.Ellipsis))return e.setValue(i),this.finish(e);this.restoreAtMark(t)}return e.setValue(this._parseExpr(!0))?(this.accept(n.Ellipsis),e.addChild(this._parsePrio()),this.finish(e)):e.setValue(this._tryParsePrio())?this.finish(e):null},t.prototype._parseURLArgument=function(){var t=this.mark(),n=e.prototype._parseURLArgument.call(this);if(!n||!this.peek(r.TokenType.ParenthesisR)){this.restoreAtMark(t);var i=this.create(o.Node);return i.addChild(this._parseBinaryExpr()),this.finish(i)}return n},t.prototype._parseOperation=function(){if(!this.peek(r.TokenType.ParenthesisL))return null;var e=this.create(o.Node);for(this.consumeToken();e.addChild(this._parseListElement());)this.accept(r.TokenType.Comma);return this.accept(r.TokenType.ParenthesisR)?this.finish(e):this.finish(e,a.ParseError.RightParenthesisExpected)},t.prototype._parseListElement=function(){var e=this.create(o.ListEntry),t=this._parseBinaryExpr();if(!t)return null;if(this.accept(r.TokenType.Colon)){if(e.setKey(t),!e.setValue(this._parseBinaryExpr()))return this.finish(e,a.ParseError.ExpressionExpected)}else e.setValue(t);return this.finish(e)},t.prototype._parseUse=function(){if(!this.peekKeyword("@use"))return null;var e=this.create(o.Use);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,a.ParseError.StringLiteralExpected);if(!this.peek(r.TokenType.SemiColon)&&!this.peek(r.TokenType.EOF)){if(!this.peekRegExp(r.TokenType.Ident,/as|with/))return this.finish(e,a.ParseError.UnknownKeyword);if(this.acceptIdent("as")&&!e.setIdentifier(this._parseIdent([o.ReferenceType.Module]))&&!this.acceptDelim("*"))return this.finish(e,a.ParseError.IdentifierOrWildcardExpected);if(this.acceptIdent("with")){if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,a.ParseError.LeftParenthesisExpected,[r.TokenType.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected)}}return this.accept(r.TokenType.SemiColon)||this.accept(r.TokenType.EOF)?this.finish(e):this.finish(e,a.ParseError.SemiColonExpected)},t.prototype._parseModuleConfigDeclaration=function(){var e=this.create(o.ModuleConfiguration);return e.setIdentifier(this._parseVariable())?this.accept(r.TokenType.Colon)&&e.setValue(this._parseExpr(!0))?!this.accept(r.TokenType.Exclamation)||!this.hasWhitespace()&&this.acceptIdent("default")?this.finish(e):this.finish(e,a.ParseError.UnknownKeyword):this.finish(e,a.ParseError.VariableValueExpected,[],[r.TokenType.Comma,r.TokenType.ParenthesisR]):null},t.prototype._parseForward=function(){if(!this.peekKeyword("@forward"))return null;var e=this.create(o.Forward);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,a.ParseError.StringLiteralExpected);if(this.acceptIdent("with")){if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,a.ParseError.LeftParenthesisExpected,[r.TokenType.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected)}if(!this.peek(r.TokenType.SemiColon)&&!this.peek(r.TokenType.EOF)){if(!this.peekRegExp(r.TokenType.Ident,/as|hide|show/))return this.finish(e,a.ParseError.UnknownKeyword);if(this.acceptIdent("as")){var t=this._parseIdent([o.ReferenceType.Forward]);if(!e.setIdentifier(t))return this.finish(e,a.ParseError.IdentifierExpected);if(this.hasWhitespace()||!this.acceptDelim("*"))return this.finish(e,a.ParseError.WildcardExpected)}if((this.peekIdent("hide")||this.peekIdent("show"))&&!e.addChild(this._parseForwardVisibility()))return this.finish(e,a.ParseError.IdentifierOrVariableExpected)}return this.accept(r.TokenType.SemiColon)||this.accept(r.TokenType.EOF)?this.finish(e):this.finish(e,a.ParseError.SemiColonExpected)},t.prototype._parseForwardVisibility=function(){var e=this.create(o.ForwardVisibility);for(e.setIdentifier(this._parseIdent());e.addChild(this._parseVariable()||this._parseIdent());)this.accept(r.TokenType.Comma);return e.getChildren().length>1?e:null},t.prototype._parseSupportsCondition=function(){return this._parseInterpolation()||e.prototype._parseSupportsCondition.call(this)},t}(i.Parser);t.SCSSParser=l}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/scssCompletion",["require","exports","./cssCompletion","../parser/cssNodes","../cssLanguageTypes","vscode-nls"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCSSCompletion=void 0;var n=e("./cssCompletion"),r=e("../parser/cssNodes"),i=e("../cssLanguageTypes"),o=e("vscode-nls").loadMessageBundle(),s=function(e){function t(n,r){var i=e.call(this,"$",n,r)||this;return a(t.scssModuleLoaders),a(t.scssModuleBuiltIns),i}return __extends(t,e),t.prototype.isImportPathParent=function(t){return t===r.NodeType.Forward||t===r.NodeType.Use||e.prototype.isImportPathParent.call(this,t)},t.prototype.getCompletionForImportPath=function(n,o){var s=n.getParent().type;if(s===r.NodeType.Forward||s===r.NodeType.Use)for(var a=0,l=t.scssModuleBuiltIns;a0){var t="string"==typeof e.documentation?{kind:"markdown",value:e.documentation}:{kind:"markdown",value:e.documentation.value};t.value+="\n\n",t.value+=e.references.map((function(e){return"["+e.name+"]("+e.url+")"})).join(" | "),e.documentation=t}}))}t.SCSSCompletion=s}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/lessScanner",["require","exports","./cssScanner"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LESSScanner=t.Ellipsis=void 0;var n=e("./cssScanner"),r="/".charCodeAt(0),i="\n".charCodeAt(0),o="\r".charCodeAt(0),s="\f".charCodeAt(0),a="`".charCodeAt(0),l=".".charCodeAt(0),c=n.TokenType.CustomToken;t.Ellipsis=c++;var d=function(e){function c(){return null!==e&&e.apply(this,arguments)||this}return __extends(c,e),c.prototype.scanNext=function(n){var r=this.escapedJavaScript();return null!==r?this.finishToken(n,r):this.stream.advanceIfChars([l,l,l])?this.finishToken(n,t.Ellipsis):e.prototype.scanNext.call(this,n)},c.prototype.comment=function(){return!!e.prototype.comment.call(this)||!(this.inURL||!this.stream.advanceIfChars([r,r]))&&(this.stream.advanceWhileChar((function(e){switch(e){case i:case o:case s:return!1;default:return!0}})),!0)},c.prototype.escapedJavaScript=function(){return this.stream.peekChar()===a?(this.stream.advance(1),this.stream.advanceWhileChar((function(e){return e!==a})),this.stream.advanceIfChar(a)?n.TokenType.EscapedJavaScript:n.TokenType.BadEscapedJavaScript):null},c}(n.Scanner);t.LESSScanner=d}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/lessParser",["require","exports","./lessScanner","./cssScanner","./cssParser","./cssNodes","./cssErrors"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LESSParser=void 0;var n=e("./lessScanner"),r=e("./cssScanner"),i=e("./cssParser"),o=e("./cssNodes"),s=e("./cssErrors"),a=function(e){function t(){return e.call(this,new n.LESSScanner)||this}return __extends(t,e),t.prototype._parseStylesheetStatement=function(t){return void 0===t&&(t=!1),this.peek(r.TokenType.AtKeyword)?this._parseVariableDeclaration()||this._parsePlugin()||e.prototype._parseStylesheetAtStatement.call(this,t):this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseFunction()||this._parseRuleset(!0)},t.prototype._parseImport=function(){if(!this.peekKeyword("@import")&&!this.peekKeyword("@import-once"))return null;var e=this.create(o.Import);if(this.consumeToken(),this.accept(r.TokenType.ParenthesisL)){if(!this.accept(r.TokenType.Ident))return this.finish(e,s.ParseError.IdentifierExpected,[r.TokenType.SemiColon]);do{if(!this.accept(r.TokenType.Comma))break}while(this.accept(r.TokenType.Ident));if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,s.ParseError.RightParenthesisExpected,[r.TokenType.SemiColon])}return e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral())?(this.peek(r.TokenType.SemiColon)||this.peek(r.TokenType.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e)):this.finish(e,s.ParseError.URIOrStringExpected,[r.TokenType.SemiColon])},t.prototype._parsePlugin=function(){if(!this.peekKeyword("@plugin"))return null;var e=this.createNode(o.NodeType.Plugin);return this.consumeToken(),e.addChild(this._parseStringLiteral())?this.accept(r.TokenType.SemiColon)?this.finish(e):this.finish(e,s.ParseError.SemiColonExpected):this.finish(e,s.ParseError.StringLiteralExpected)},t.prototype._parseMediaQuery=function(t){var n=e.prototype._parseMediaQuery.call(this,t);if(!n){var r=this.create(o.MediaQuery);return r.addChild(this._parseVariable())?this.finish(r):null}return n},t.prototype._parseMediaDeclaration=function(e){return void 0===e&&(e=!1),this._tryParseRuleset(e)||this._tryToParseDeclaration()||this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseDetachedRuleSetMixin()||this._parseStylesheetStatement(e)},t.prototype._parseMediaFeatureName=function(){return this._parseIdent()||this._parseVariable()},t.prototype._parseVariableDeclaration=function(e){void 0===e&&(e=[]);var t=this.create(o.VariableDeclaration),n=this.mark();if(!t.setVariable(this._parseVariable(!0)))return null;if(!this.accept(r.TokenType.Colon))return this.restoreAtMark(n),null;if(this.prevToken&&(t.colonPosition=this.prevToken.offset),t.setValue(this._parseDetachedRuleSet()))t.needsSemicolon=!1;else if(!t.setValue(this._parseExpr()))return this.finish(t,s.ParseError.VariableValueExpected,[],e);return t.addChild(this._parsePrio()),this.peek(r.TokenType.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)},t.prototype._parseDetachedRuleSet=function(){var e=this.mark();if(this.peekDelim("#")||this.peekDelim(".")){if(this.consumeToken(),this.hasWhitespace()||!this.accept(r.TokenType.ParenthesisL))return this.restoreAtMark(e),null;var t=this.create(o.MixinDeclaration);if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(r.TokenType.Comma)||this.accept(r.TokenType.SemiColon))&&!this.peek(r.TokenType.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,s.ParseError.IdentifierExpected,[],[r.TokenType.ParenthesisR]);if(!this.accept(r.TokenType.ParenthesisR))return this.restoreAtMark(e),null}if(!this.peek(r.TokenType.CurlyL))return null;var n=this.create(o.BodyDeclaration);return this._parseBody(n,this._parseDetachedRuleSetBody.bind(this)),this.finish(n)},t.prototype._parseDetachedRuleSetBody=function(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()},t.prototype._addLookupChildren=function(e){if(!e.addChild(this._parseLookupValue()))return!1;for(var t=!1;this.peek(r.TokenType.BracketL)&&(t=!0),e.addChild(this._parseLookupValue());)t=!1;return!t},t.prototype._parseLookupValue=function(){var e=this.create(o.Node),t=this.mark();return this.accept(r.TokenType.BracketL)&&((e.addChild(this._parseVariable(!1,!0))||e.addChild(this._parsePropertyIdentifier()))&&this.accept(r.TokenType.BracketR)||this.accept(r.TokenType.BracketR))?e:(this.restoreAtMark(t),null)},t.prototype._parseVariable=function(e,t){void 0===e&&(e=!1),void 0===t&&(t=!1);var n=!e&&this.peekDelim("$");if(!this.peekDelim("@")&&!n&&!this.peek(r.TokenType.AtKeyword))return null;for(var i=this.create(o.Variable),s=this.mark();this.acceptDelim("@")||!e&&this.acceptDelim("$");)if(this.hasWhitespace())return this.restoreAtMark(s),null;return(this.accept(r.TokenType.AtKeyword)||this.accept(r.TokenType.Ident))&&(t||!this.peek(r.TokenType.BracketL)||this._addLookupChildren(i))?i:(this.restoreAtMark(s),null)},t.prototype._parseTermExpression=function(){return this._parseVariable()||this._parseEscaped()||e.prototype._parseTermExpression.call(this)||this._tryParseMixinReference(!1)},t.prototype._parseEscaped=function(){if(this.peek(r.TokenType.EscapedJavaScript)||this.peek(r.TokenType.BadEscapedJavaScript)){var e=this.createNode(o.NodeType.EscapedValue);return this.consumeToken(),this.finish(e)}if(this.peekDelim("~")){e=this.createNode(o.NodeType.EscapedValue);return this.consumeToken(),this.accept(r.TokenType.String)||this.accept(r.TokenType.EscapedJavaScript)?this.finish(e):this.finish(e,s.ParseError.TermExpected)}return null},t.prototype._parseOperator=function(){var t=this._parseGuardOperator();return t||e.prototype._parseOperator.call(this)},t.prototype._parseGuardOperator=function(){if(this.peekDelim(">")){var e=this.createNode(o.NodeType.Operator);return this.consumeToken(),this.acceptDelim("="),e}if(this.peekDelim("=")){e=this.createNode(o.NodeType.Operator);return this.consumeToken(),this.acceptDelim("<"),e}if(this.peekDelim("<")){e=this.createNode(o.NodeType.Operator);return this.consumeToken(),this.acceptDelim("="),e}return null},t.prototype._parseRuleSetDeclaration=function(){return this.peek(r.TokenType.AtKeyword)?this._parseKeyframe()||this._parseMedia(!0)||this._parseImport()||this._parseSupports(!0)||this._parseDetachedRuleSetMixin()||this._parseVariableDeclaration()||e.prototype._parseRuleSetDeclarationAtStatement.call(this):this._tryParseMixinDeclaration()||this._tryParseRuleset(!0)||this._tryParseMixinReference()||this._parseFunction()||this._parseExtend()||e.prototype._parseRuleSetDeclaration.call(this)},t.prototype._parseKeyframeIdent=function(){return this._parseIdent([o.ReferenceType.Keyframe])||this._parseVariable()},t.prototype._parseKeyframeSelector=function(){return this._parseDetachedRuleSetMixin()||e.prototype._parseKeyframeSelector.call(this)},t.prototype._parseSimpleSelectorBody=function(){return this._parseSelectorCombinator()||e.prototype._parseSimpleSelectorBody.call(this)},t.prototype._parseSelector=function(e){var t=this.create(o.Selector),n=!1;for(e&&(n=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());){n=!0;var i=this.mark();if(t.addChild(this._parseGuard())&&this.peek(r.TokenType.CurlyL))break;this.restoreAtMark(i),t.addChild(this._parseCombinator())}return n?this.finish(t):null},t.prototype._parseSelectorCombinator=function(){if(this.peekDelim("&")){var e=this.createNode(o.NodeType.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(r.TokenType.Num)||this.accept(r.TokenType.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null},t.prototype._parseSelectorIdent=function(){if(!this.peekInterpolatedIdent())return null;var e=this.createNode(o.NodeType.SelectorInterpolation);return this._acceptInterpolatedIdent(e)?this.finish(e):null},t.prototype._parsePropertyIdentifier=function(e){void 0===e&&(e=!1);var t=/^[\w-]+/;if(!this.peekInterpolatedIdent()&&!this.peekRegExp(this.token.type,t))return null;var n=this.mark(),r=this.create(o.Identifier);r.isCustomProperty=this.acceptDelim("-")&&this.acceptDelim("-");return(e?r.isCustomProperty?r.addChild(this._parseIdent()):r.addChild(this._parseRegexp(t)):r.isCustomProperty?this._acceptInterpolatedIdent(r):this._acceptInterpolatedIdent(r,t))?(e||this.hasWhitespace()||(this.acceptDelim("+"),this.hasWhitespace()||this.acceptIdent("_")),this.finish(r)):(this.restoreAtMark(n),null)},t.prototype.peekInterpolatedIdent=function(){return this.peek(r.TokenType.Ident)||this.peekDelim("@")||this.peekDelim("$")||this.peekDelim("-")},t.prototype._acceptInterpolatedIdent=function(e,t){for(var n=this,i=!1,o=function(){var e=n.mark();return n.acceptDelim("-")&&(n.hasWhitespace()||n.acceptDelim("-"),n.hasWhitespace())?(n.restoreAtMark(e),null):n._parseInterpolation()},s=t?function(){return n.acceptRegexp(t)}:function(){return n.accept(r.TokenType.Ident)};(s()||e.addChild(this._parseInterpolation()||this.try(o)))&&(i=!0,!this.hasWhitespace()););return i},t.prototype._parseInterpolation=function(){var e=this.mark();if(this.peekDelim("@")||this.peekDelim("$")){var t=this.createNode(o.NodeType.Interpolation);return this.consumeToken(),this.hasWhitespace()||!this.accept(r.TokenType.CurlyL)?(this.restoreAtMark(e),null):t.addChild(this._parseIdent())?this.accept(r.TokenType.CurlyR)?this.finish(t):this.finish(t,s.ParseError.RightCurlyExpected):this.finish(t,s.ParseError.IdentifierExpected)}return null},t.prototype._tryParseMixinDeclaration=function(){var e=this.mark(),t=this.create(o.MixinDeclaration);if(!t.setIdentifier(this._parseMixinDeclarationIdentifier())||!this.accept(r.TokenType.ParenthesisL))return this.restoreAtMark(e),null;if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(r.TokenType.Comma)||this.accept(r.TokenType.SemiColon))&&!this.peek(r.TokenType.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,s.ParseError.IdentifierExpected,[],[r.TokenType.ParenthesisR]);return this.accept(r.TokenType.ParenthesisR)?(t.setGuard(this._parseGuard()),this.peek(r.TokenType.CurlyL)?this._parseBody(t,this._parseMixInBodyDeclaration.bind(this)):(this.restoreAtMark(e),null)):(this.restoreAtMark(e),null)},t.prototype._parseMixInBodyDeclaration=function(){return this._parseFontFace()||this._parseRuleSetDeclaration()},t.prototype._parseMixinDeclarationIdentifier=function(){var e;if(this.peekDelim("#")||this.peekDelim(".")){if(e=this.create(o.Identifier),this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseIdent()))return null}else{if(!this.peek(r.TokenType.Hash))return null;e=this.create(o.Identifier),this.consumeToken()}return e.referenceTypes=[o.ReferenceType.Mixin],this.finish(e)},t.prototype._parsePseudo=function(){if(!this.peek(r.TokenType.Colon))return null;var t=this.mark(),n=this.create(o.ExtendsReference);return this.consumeToken(),this.acceptIdent("extend")?this._completeExtends(n):(this.restoreAtMark(t),e.prototype._parsePseudo.call(this))},t.prototype._parseExtend=function(){if(!this.peekDelim("&"))return null;var e=this.mark(),t=this.create(o.ExtendsReference);return this.consumeToken(),!this.hasWhitespace()&&this.accept(r.TokenType.Colon)&&this.acceptIdent("extend")?this._completeExtends(t):(this.restoreAtMark(e),null)},t.prototype._completeExtends=function(e){if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,s.ParseError.LeftParenthesisExpected);var t=e.getSelectors();if(!t.addChild(this._parseSelector(!0)))return this.finish(e,s.ParseError.SelectorExpected);for(;this.accept(r.TokenType.Comma);)if(!t.addChild(this._parseSelector(!0)))return this.finish(e,s.ParseError.SelectorExpected);return this.accept(r.TokenType.ParenthesisR)?this.finish(e):this.finish(e,s.ParseError.RightParenthesisExpected)},t.prototype._parseDetachedRuleSetMixin=function(){if(!this.peek(r.TokenType.AtKeyword))return null;var e=this.mark(),t=this.create(o.MixinReference);return!t.addChild(this._parseVariable(!0))||!this.hasWhitespace()&&this.accept(r.TokenType.ParenthesisL)?this.accept(r.TokenType.ParenthesisR)?this.finish(t):this.finish(t,s.ParseError.RightParenthesisExpected):(this.restoreAtMark(e),null)},t.prototype._tryParseMixinReference=function(e){void 0===e&&(e=!0);for(var t=this.mark(),n=this.create(o.MixinReference),i=this._parseMixinDeclarationIdentifier();i;){this.acceptDelim(">");var a=this._parseMixinDeclarationIdentifier();if(!a)break;n.getNamespaces().addChild(i),i=a}if(!n.setIdentifier(i))return this.restoreAtMark(t),null;var l=!1;if(this.accept(r.TokenType.ParenthesisL)){if(l=!0,n.getArguments().addChild(this._parseMixinArgument()))for(;(this.accept(r.TokenType.Comma)||this.accept(r.TokenType.SemiColon))&&!this.peek(r.TokenType.ParenthesisR);)if(!n.getArguments().addChild(this._parseMixinArgument()))return this.finish(n,s.ParseError.ExpressionExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(n,s.ParseError.RightParenthesisExpected);i.referenceTypes=[o.ReferenceType.Mixin]}else i.referenceTypes=[o.ReferenceType.Mixin,o.ReferenceType.Rule];return this.peek(r.TokenType.BracketL)?e||this._addLookupChildren(n):n.addChild(this._parsePrio()),l||this.peek(r.TokenType.SemiColon)||this.peek(r.TokenType.CurlyR)||this.peek(r.TokenType.EOF)?this.finish(n):(this.restoreAtMark(t),null)},t.prototype._parseMixinArgument=function(){var e=this.create(o.FunctionArgument),t=this.mark(),n=this._parseVariable();return n&&(this.accept(r.TokenType.Colon)?e.setIdentifier(n):this.restoreAtMark(t)),e.setValue(this._parseDetachedRuleSet()||this._parseExpr(!0))?this.finish(e):(this.restoreAtMark(t),null)},t.prototype._parseMixinParameter=function(){var e=this.create(o.FunctionParameter);if(this.peekKeyword("@rest")){var t=this.create(o.Node);return this.consumeToken(),this.accept(n.Ellipsis)?(e.setIdentifier(this.finish(t)),this.finish(e)):this.finish(e,s.ParseError.DotExpected,[],[r.TokenType.Comma,r.TokenType.ParenthesisR])}if(this.peek(n.Ellipsis)){var i=this.create(o.Node);return this.consumeToken(),e.setIdentifier(this.finish(i)),this.finish(e)}var a=!1;return e.setIdentifier(this._parseVariable())&&(this.accept(r.TokenType.Colon),a=!0),e.setDefaultValue(this._parseDetachedRuleSet()||this._parseExpr(!0))||a?this.finish(e):null},t.prototype._parseGuard=function(){if(!this.peekIdent("when"))return null;var e=this.create(o.LessGuard);if(this.consumeToken(),e.isNegated=this.acceptIdent("not"),!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,s.ParseError.ConditionExpected);for(;this.acceptIdent("and")||this.accept(r.TokenType.Comma);)if(!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,s.ParseError.ConditionExpected);return this.finish(e)},t.prototype._parseGuardCondition=function(){if(!this.peek(r.TokenType.ParenthesisL))return null;var e=this.create(o.GuardCondition);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(r.TokenType.ParenthesisR)?this.finish(e):this.finish(e,s.ParseError.RightParenthesisExpected)},t.prototype._parseFunction=function(){var e=this.mark(),t=this.create(o.Function);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(r.TokenType.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseMixinArgument()))for(;(this.accept(r.TokenType.Comma)||this.accept(r.TokenType.SemiColon))&&!this.peek(r.TokenType.ParenthesisR);)if(!t.getArguments().addChild(this._parseMixinArgument()))return this.finish(t,s.ParseError.ExpressionExpected);return this.accept(r.TokenType.ParenthesisR)?this.finish(t):this.finish(t,s.ParseError.RightParenthesisExpected)},t.prototype._parseFunctionIdentifier=function(){if(this.peekDelim("%")){var t=this.create(o.Identifier);return t.referenceTypes=[o.ReferenceType.Function],this.consumeToken(),this.finish(t)}return e.prototype._parseFunctionIdentifier.call(this)},t.prototype._parseURLArgument=function(){var t=this.mark(),n=e.prototype._parseURLArgument.call(this);if(!n||!this.peek(r.TokenType.ParenthesisR)){this.restoreAtMark(t);var i=this.create(o.Node);return i.addChild(this._parseBinaryExpr()),this.finish(i)}return n},t}(i.Parser);t.LESSParser=a}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/lessCompletion",["require","exports","./cssCompletion","../cssLanguageTypes","vscode-nls"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LESSCompletion=void 0;var n=e("./cssCompletion"),r=e("../cssLanguageTypes"),i=e("vscode-nls").loadMessageBundle(),o=function(e){function t(t,n){return e.call(this,"@",t,n)||this}return __extends(t,e),t.prototype.createFunctionProposals=function(e,t,n,i){for(var o=0,s=e;o 50%"),example:"percentage(@number);",type:"percentage"},{name:"round",description:i("less.builtin.round","rounds a number to a number of places"),example:"round(number, [places: 0]);"},{name:"sqrt",description:i("less.builtin.sqrt","calculates square root of a number"),example:"sqrt(number);"},{name:"sin",description:i("less.builtin.sin","sine function"),example:"sin(number);"},{name:"tan",description:i("less.builtin.tan","tangent function"),example:"tan(number);"},{name:"atan",description:i("less.builtin.atan","arctangent - inverse of tangent function"),example:"atan(number);"},{name:"pi",description:i("less.builtin.pi","returns pi"),example:"pi();"},{name:"pow",description:i("less.builtin.pow","first argument raised to the power of the second argument"),example:"pow(@base, @exponent);"},{name:"mod",description:i("less.builtin.mod","first argument modulus second argument"),example:"mod(number, number);"},{name:"min",description:i("less.builtin.min","returns the lowest of one or more values"),example:"min(@x, @y);"},{name:"max",description:i("less.builtin.max","returns the lowest of one or more values"),example:"max(@x, @y);"}],t.colorProposals=[{name:"argb",example:"argb(@color);",description:i("less.builtin.argb","creates a #AARRGGBB")},{name:"hsl",example:"hsl(@hue, @saturation, @lightness);",description:i("less.builtin.hsl","creates a color")},{name:"hsla",example:"hsla(@hue, @saturation, @lightness, @alpha);",description:i("less.builtin.hsla","creates a color")},{name:"hsv",example:"hsv(@hue, @saturation, @value);",description:i("less.builtin.hsv","creates a color")},{name:"hsva",example:"hsva(@hue, @saturation, @value, @alpha);",description:i("less.builtin.hsva","creates a color")},{name:"hue",example:"hue(@color);",description:i("less.builtin.hue","returns the `hue` channel of `@color` in the HSL space")},{name:"saturation",example:"saturation(@color);",description:i("less.builtin.saturation","returns the `saturation` channel of `@color` in the HSL space")},{name:"lightness",example:"lightness(@color);",description:i("less.builtin.lightness","returns the `lightness` channel of `@color` in the HSL space")},{name:"hsvhue",example:"hsvhue(@color);",description:i("less.builtin.hsvhue","returns the `hue` channel of `@color` in the HSV space")},{name:"hsvsaturation",example:"hsvsaturation(@color);",description:i("less.builtin.hsvsaturation","returns the `saturation` channel of `@color` in the HSV space")},{name:"hsvvalue",example:"hsvvalue(@color);",description:i("less.builtin.hsvvalue","returns the `value` channel of `@color` in the HSV space")},{name:"red",example:"red(@color);",description:i("less.builtin.red","returns the `red` channel of `@color`")},{name:"green",example:"green(@color);",description:i("less.builtin.green","returns the `green` channel of `@color`")},{name:"blue",example:"blue(@color);",description:i("less.builtin.blue","returns the `blue` channel of `@color`")},{name:"alpha",example:"alpha(@color);",description:i("less.builtin.alpha","returns the `alpha` channel of `@color`")},{name:"luma",example:"luma(@color);",description:i("less.builtin.luma","returns the `luma` value (perceptual brightness) of `@color`")},{name:"saturate",example:"saturate(@color, 10%);",description:i("less.builtin.saturate","return `@color` 10% points more saturated")},{name:"desaturate",example:"desaturate(@color, 10%);",description:i("less.builtin.desaturate","return `@color` 10% points less saturated")},{name:"lighten",example:"lighten(@color, 10%);",description:i("less.builtin.lighten","return `@color` 10% points lighter")},{name:"darken",example:"darken(@color, 10%);",description:i("less.builtin.darken","return `@color` 10% points darker")},{name:"fadein",example:"fadein(@color, 10%);",description:i("less.builtin.fadein","return `@color` 10% points less transparent")},{name:"fadeout",example:"fadeout(@color, 10%);",description:i("less.builtin.fadeout","return `@color` 10% points more transparent")},{name:"fade",example:"fade(@color, 50%);",description:i("less.builtin.fade","return `@color` with 50% transparency")},{name:"spin",example:"spin(@color, 10);",description:i("less.builtin.spin","return `@color` with a 10 degree larger in hue")},{name:"mix",example:"mix(@color1, @color2, [@weight: 50%]);",description:i("less.builtin.mix","return a mix of `@color1` and `@color2`")},{name:"greyscale",example:"greyscale(@color);",description:i("less.builtin.greyscale","returns a grey, 100% desaturated color")},{name:"contrast",example:"contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]);",description:i("less.builtin.contrast","return `@darkcolor` if `@color1 is> 43% luma` otherwise return `@lightcolor`, see notes")},{name:"multiply",example:"multiply(@color1, @color2);"},{name:"screen",example:"screen(@color1, @color2);"},{name:"overlay",example:"overlay(@color1, @color2);"},{name:"softlight",example:"softlight(@color1, @color2);"},{name:"hardlight",example:"hardlight(@color1, @color2);"},{name:"difference",example:"difference(@color1, @color2);"},{name:"exclusion",example:"exclusion(@color1, @color2);"},{name:"average",example:"average(@color1, @color2);"},{name:"negation",example:"negation(@color1, @color2);"}],t}(n.CSSCompletion);t.LESSCompletion=o})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/cssFolding",["require","exports","../parser/cssScanner","../parser/scssScanner","../parser/lessScanner"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getFoldingRanges=void 0;var n=e("../parser/cssScanner"),r=e("../parser/scssScanner"),i=e("../parser/lessScanner");function o(e,t){if(0===e.length)return null;for(var n=e.length-1;n>=0;n--)if(e[n].type===t&&e[n].isStart)return e.splice(n,1)[0];return null}t.getFoldingRanges=function(e,t){return function(e,t){var n=t&&t.rangeLimit||Number.MAX_VALUE,r=e.sort((function(e,t){var n=e.startLine-t.startLine;return 0===n&&(n=e.endLine-t.endLine),n})),i=[],o=-1;return r.forEach((function(e){e.startLine && ]#",relevance:50,description:"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.",restrictions:["integer","string","image","identifier"]},{name:"align-content",values:[{name:"center",description:"Lines are packed toward the center of the flex container."},{name:"flex-end",description:"Lines are packed toward the end of the flex container."},{name:"flex-start",description:"Lines are packed toward the start of the flex container."},{name:"space-around",description:"Lines are evenly distributed in the flex container, with half-size spaces on either end."},{name:"space-between",description:"Lines are evenly distributed in the flex container."},{name:"stretch",description:"Lines stretch to take up the remaining space."}],syntax:"normal | | | ? ",relevance:60,description:"Aligns a flex container’s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",restrictions:["enum"]},{name:"align-items",values:[{name:"baseline",description:"If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item’s margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],syntax:"normal | stretch | | [ ? ]",relevance:83,description:"Aligns flex items along the cross axis of the current line of the flex container.",restrictions:["enum"]},{name:"justify-items",values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"},{name:"legacy"}],syntax:"normal | stretch | | ? [ | left | right ] | legacy | legacy && [ left | right | center ]",relevance:51,description:"Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis",restrictions:["enum"]},{name:"justify-self",values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"}],syntax:"auto | normal | stretch | | ? [ | left | right ]",relevance:52,description:"Defines the way of justifying a box inside its container along the appropriate axis.",restrictions:["enum"]},{name:"align-self",values:[{name:"auto",description:"Computes to the value of 'align-items' on the element’s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."},{name:"baseline",description:"If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item’s margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],syntax:"auto | normal | stretch | | ? ",relevance:70,description:"Allows the default alignment along the cross axis to be overridden for individual flex items.",restrictions:["enum"]},{name:"all",browsers:["E79","FF27","S9.1","C37","O24"],values:[],syntax:"initial | inherit | unset | revert",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/all"}],description:"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.",restrictions:["enum"]},{name:"alt",browsers:["S9"],values:[],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/alt"}],description:"Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.",restrictions:["string","enum"]},{name:"animation",values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],syntax:"#",relevance:80,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation"}],description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","timing-function","enum","identifier","number"]},{name:"animation-delay",syntax:"